public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/4] scsi: ufs: ufs-qcom: Debug clean ups
@ 2022-12-01 23:08 Andrew Halaney
  2022-12-01 23:08 ` [PATCH 1/4] scsi: ufs: ufs-qcom: Drop unnecessary NULL checks Andrew Halaney
                   ` (5 more replies)
  0 siblings, 6 replies; 11+ messages in thread
From: Andrew Halaney @ 2022-12-01 23:08 UTC (permalink / raw)
  To: andersson
  Cc: agross, konrad.dybcio, jejb, martin.petersen, p.zabel,
	linux-arm-msm, linux-scsi, linux-kernel, manivannan.sadhasivam,
	Andrew Halaney

This patch series attempts to clean up some debug code paths in the
ufs-qcom driver.

Andrew Halaney (4):
  scsi: ufs: ufs-qcom: Drop unnecessary NULL checks
  scsi: ufs: ufs-qcom: Clean up dbg_register_dump
  scsi: ufs: ufs-qcom: Remove usage of dbg_print_en
  scsi: ufs: ufs-qcom: Use dev_err() where possible

 drivers/ufs/host/ufs-qcom.c | 135 +++++++++++++-----------------------
 drivers/ufs/host/ufs-qcom.h |  11 ---
 2 files changed, 48 insertions(+), 98 deletions(-)

-- 
2.38.1


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/4] scsi: ufs: ufs-qcom: Drop unnecessary NULL checks
  2022-12-01 23:08 [PATCH 0/4] scsi: ufs: ufs-qcom: Debug clean ups Andrew Halaney
@ 2022-12-01 23:08 ` Andrew Halaney
  2022-12-02  7:36   ` Manivannan Sadhasivam
  2022-12-01 23:08 ` [PATCH 2/4] scsi: ufs: ufs-qcom: Clean up dbg_register_dump Andrew Halaney
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 11+ messages in thread
From: Andrew Halaney @ 2022-12-01 23:08 UTC (permalink / raw)
  To: andersson
  Cc: agross, konrad.dybcio, jejb, martin.petersen, p.zabel,
	linux-arm-msm, linux-scsi, linux-kernel, manivannan.sadhasivam,
	Andrew Halaney

This code path is only called through one function, and the hba
struct is already accessed in ufshcd_vops_dbg_register_dump() prior to
calling so there is no way for it to be NULL.

Likewise, the print_fn callback is always supplied within this driver
and is always provided.

Signed-off-by: Andrew Halaney <ahalaney@redhat.com>
---
 drivers/ufs/host/ufs-qcom.c | 9 ---------
 1 file changed, 9 deletions(-)

diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
index 8ad1415e10b6..70e25f9f8ca8 100644
--- a/drivers/ufs/host/ufs-qcom.c
+++ b/drivers/ufs/host/ufs-qcom.c
@@ -1202,15 +1202,6 @@ static void ufs_qcom_print_hw_debug_reg_all(struct ufs_hba *hba,
 	u32 reg;
 	struct ufs_qcom_host *host;
 
-	if (unlikely(!hba)) {
-		pr_err("%s: hba is NULL\n", __func__);
-		return;
-	}
-	if (unlikely(!print_fn)) {
-		dev_err(hba->dev, "%s: print_fn is NULL\n", __func__);
-		return;
-	}
-
 	host = ufshcd_get_variant(hba);
 	if (!(host->dbg_print_en & UFS_QCOM_DBG_PRINT_REGS_EN))
 		return;
-- 
2.38.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 2/4] scsi: ufs: ufs-qcom: Clean up dbg_register_dump
  2022-12-01 23:08 [PATCH 0/4] scsi: ufs: ufs-qcom: Debug clean ups Andrew Halaney
  2022-12-01 23:08 ` [PATCH 1/4] scsi: ufs: ufs-qcom: Drop unnecessary NULL checks Andrew Halaney
@ 2022-12-01 23:08 ` Andrew Halaney
  2022-12-02  7:38   ` Manivannan Sadhasivam
  2022-12-01 23:08 ` [PATCH 3/4] scsi: ufs: ufs-qcom: Remove usage of dbg_print_en Andrew Halaney
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 11+ messages in thread
From: Andrew Halaney @ 2022-12-01 23:08 UTC (permalink / raw)
  To: andersson
  Cc: agross, konrad.dybcio, jejb, martin.petersen, p.zabel,
	linux-arm-msm, linux-scsi, linux-kernel, manivannan.sadhasivam,
	Andrew Halaney

The current implementation has abstractions that don't give any
benefits.

The print_fn callback (and its only callback implementation,
ufs_qcom_dump_regs_wrapper()) was only used by
ufs_qcom_print_hw_debug_reg_all() and just multiplies len by 4
before calling ufshcd_dump_regs().

ufs_qcom_print_hw_debug_reg_all() is only called by
ufs_qcom_dump_dbg_regs().

There's no real gain in those abstractions, so let's just do the work
directly in ufs_qcom_dump_dbg_regs() (the dbg_register_dump callback).

Signed-off-by: Andrew Halaney <ahalaney@redhat.com>
---
 drivers/ufs/host/ufs-qcom.c | 106 ++++++++++++++++--------------------
 1 file changed, 47 insertions(+), 59 deletions(-)

diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
index 70e25f9f8ca8..1b0dfbbdcdf3 100644
--- a/drivers/ufs/host/ufs-qcom.c
+++ b/drivers/ufs/host/ufs-qcom.c
@@ -52,12 +52,6 @@ static struct ufs_qcom_host *rcdev_to_ufs_host(struct reset_controller_dev *rcd)
 	return container_of(rcd, struct ufs_qcom_host, rcdev);
 }
 
-static void ufs_qcom_dump_regs_wrapper(struct ufs_hba *hba, int offset, int len,
-				       const char *prefix, void *priv)
-{
-	ufshcd_dump_regs(hba, offset, len * 4, prefix);
-}
-
 static int ufs_qcom_host_clk_get(struct device *dev,
 		const char *name, struct clk **clk_out, bool optional)
 {
@@ -1195,58 +1189,6 @@ static int ufs_qcom_clk_scale_notify(struct ufs_hba *hba,
 	return err;
 }
 
-static void ufs_qcom_print_hw_debug_reg_all(struct ufs_hba *hba,
-		void *priv, void (*print_fn)(struct ufs_hba *hba,
-		int offset, int num_regs, const char *str, void *priv))
-{
-	u32 reg;
-	struct ufs_qcom_host *host;
-
-	host = ufshcd_get_variant(hba);
-	if (!(host->dbg_print_en & UFS_QCOM_DBG_PRINT_REGS_EN))
-		return;
-
-	reg = ufs_qcom_get_debug_reg_offset(host, UFS_UFS_DBG_RD_REG_OCSC);
-	print_fn(hba, reg, 44, "UFS_UFS_DBG_RD_REG_OCSC ", priv);
-
-	reg = ufshcd_readl(hba, REG_UFS_CFG1);
-	reg |= UTP_DBG_RAMS_EN;
-	ufshcd_writel(hba, reg, REG_UFS_CFG1);
-
-	reg = ufs_qcom_get_debug_reg_offset(host, UFS_UFS_DBG_RD_EDTL_RAM);
-	print_fn(hba, reg, 32, "UFS_UFS_DBG_RD_EDTL_RAM ", priv);
-
-	reg = ufs_qcom_get_debug_reg_offset(host, UFS_UFS_DBG_RD_DESC_RAM);
-	print_fn(hba, reg, 128, "UFS_UFS_DBG_RD_DESC_RAM ", priv);
-
-	reg = ufs_qcom_get_debug_reg_offset(host, UFS_UFS_DBG_RD_PRDT_RAM);
-	print_fn(hba, reg, 64, "UFS_UFS_DBG_RD_PRDT_RAM ", priv);
-
-	/* clear bit 17 - UTP_DBG_RAMS_EN */
-	ufshcd_rmwl(hba, UTP_DBG_RAMS_EN, 0, REG_UFS_CFG1);
-
-	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_UAWM);
-	print_fn(hba, reg, 4, "UFS_DBG_RD_REG_UAWM ", priv);
-
-	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_UARM);
-	print_fn(hba, reg, 4, "UFS_DBG_RD_REG_UARM ", priv);
-
-	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_TXUC);
-	print_fn(hba, reg, 48, "UFS_DBG_RD_REG_TXUC ", priv);
-
-	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_RXUC);
-	print_fn(hba, reg, 27, "UFS_DBG_RD_REG_RXUC ", priv);
-
-	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_DFC);
-	print_fn(hba, reg, 19, "UFS_DBG_RD_REG_DFC ", priv);
-
-	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_TRLUT);
-	print_fn(hba, reg, 34, "UFS_DBG_RD_REG_TRLUT ", priv);
-
-	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_TMRLUT);
-	print_fn(hba, reg, 9, "UFS_DBG_RD_REG_TMRLUT ", priv);
-}
-
 static void ufs_qcom_enable_test_bus(struct ufs_qcom_host *host)
 {
 	if (host->dbg_print_en & UFS_QCOM_DBG_PRINT_TEST_BUS_EN) {
@@ -1365,10 +1307,56 @@ int ufs_qcom_testbus_config(struct ufs_qcom_host *host)
 
 static void ufs_qcom_dump_dbg_regs(struct ufs_hba *hba)
 {
+	u32 reg;
+	struct ufs_qcom_host *host;
+
+	host = ufshcd_get_variant(hba);
+
 	ufshcd_dump_regs(hba, REG_UFS_SYS1CLK_1US, 16 * 4,
 			 "HCI Vendor Specific Registers ");
 
-	ufs_qcom_print_hw_debug_reg_all(hba, NULL, ufs_qcom_dump_regs_wrapper);
+	if (!(host->dbg_print_en & UFS_QCOM_DBG_PRINT_REGS_EN))
+		return;
+
+	reg = ufs_qcom_get_debug_reg_offset(host, UFS_UFS_DBG_RD_REG_OCSC);
+	ufshcd_dump_regs(hba, reg, 44 * 4, "UFS_UFS_DBG_RD_REG_OCSC ");
+
+	reg = ufshcd_readl(hba, REG_UFS_CFG1);
+	reg |= UTP_DBG_RAMS_EN;
+	ufshcd_writel(hba, reg, REG_UFS_CFG1);
+
+	reg = ufs_qcom_get_debug_reg_offset(host, UFS_UFS_DBG_RD_EDTL_RAM);
+	ufshcd_dump_regs(hba, reg, 32 * 4, "UFS_UFS_DBG_RD_EDTL_RAM ");
+
+	reg = ufs_qcom_get_debug_reg_offset(host, UFS_UFS_DBG_RD_DESC_RAM);
+	ufshcd_dump_regs(hba, reg, 128 * 4, "UFS_UFS_DBG_RD_DESC_RAM ");
+
+	reg = ufs_qcom_get_debug_reg_offset(host, UFS_UFS_DBG_RD_PRDT_RAM);
+	ufshcd_dump_regs(hba, reg, 64 * 4, "UFS_UFS_DBG_RD_PRDT_RAM ");
+
+	/* clear bit 17 - UTP_DBG_RAMS_EN */
+	ufshcd_rmwl(hba, UTP_DBG_RAMS_EN, 0, REG_UFS_CFG1);
+
+	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_UAWM);
+	ufshcd_dump_regs(hba, reg, 4 * 4, "UFS_DBG_RD_REG_UAWM ");
+
+	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_UARM);
+	ufshcd_dump_regs(hba, reg, 4 * 4, "UFS_DBG_RD_REG_UARM ");
+
+	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_TXUC);
+	ufshcd_dump_regs(hba, reg, 48 * 4, "UFS_DBG_RD_REG_TXUC ");
+
+	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_RXUC);
+	ufshcd_dump_regs(hba, reg, 27 * 4, "UFS_DBG_RD_REG_RXUC ");
+
+	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_DFC);
+	ufshcd_dump_regs(hba, reg, 19 * 4, "UFS_DBG_RD_REG_DFC ");
+
+	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_TRLUT);
+	ufshcd_dump_regs(hba, reg, 34 * 4, "UFS_DBG_RD_REG_TRLUT ");
+
+	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_TMRLUT);
+	ufshcd_dump_regs(hba, reg, 9 * 4, "UFS_DBG_RD_REG_TMRLUT ");
 }
 
 /**
-- 
2.38.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 3/4] scsi: ufs: ufs-qcom: Remove usage of dbg_print_en
  2022-12-01 23:08 [PATCH 0/4] scsi: ufs: ufs-qcom: Debug clean ups Andrew Halaney
  2022-12-01 23:08 ` [PATCH 1/4] scsi: ufs: ufs-qcom: Drop unnecessary NULL checks Andrew Halaney
  2022-12-01 23:08 ` [PATCH 2/4] scsi: ufs: ufs-qcom: Clean up dbg_register_dump Andrew Halaney
@ 2022-12-01 23:08 ` Andrew Halaney
  2022-12-02  7:39   ` Manivannan Sadhasivam
  2022-12-01 23:08 ` [PATCH 4/4] scsi: ufs: ufs-qcom: Use dev_err() where possible Andrew Halaney
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 11+ messages in thread
From: Andrew Halaney @ 2022-12-01 23:08 UTC (permalink / raw)
  To: andersson
  Cc: agross, konrad.dybcio, jejb, martin.petersen, p.zabel,
	linux-arm-msm, linux-scsi, linux-kernel, manivannan.sadhasivam,
	Andrew Halaney

This bitmask is unconditionally set in the current driver,
so all conditionals using it can be considered bit rot.

Let's take the current default conditional path everywhere and remove
dbg_print_en from the driver.

Signed-off-by: Andrew Halaney <ahalaney@redhat.com>
---
 drivers/ufs/host/ufs-qcom.c | 18 +++---------------
 drivers/ufs/host/ufs-qcom.h | 11 -----------
 2 files changed, 3 insertions(+), 26 deletions(-)

diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
index 1b0dfbbdcdf3..b1fcff1fad0c 100644
--- a/drivers/ufs/host/ufs-qcom.c
+++ b/drivers/ufs/host/ufs-qcom.c
@@ -22,9 +22,6 @@
 #include <ufs/ufshci.h>
 #include <ufs/ufs_quirks.h>
 
-#define UFS_QCOM_DEFAULT_DBG_PRINT_EN	\
-	(UFS_QCOM_DBG_PRINT_REGS_EN | UFS_QCOM_DBG_PRINT_TEST_BUS_EN)
-
 enum {
 	TSTBUS_UAWM,
 	TSTBUS_UARM,
@@ -1040,7 +1037,6 @@ static int ufs_qcom_init(struct ufs_hba *hba)
 	if (hba->dev->id < MAX_UFS_QCOM_HOSTS)
 		ufs_qcom_hosts[hba->dev->id] = host;
 
-	host->dbg_print_en |= UFS_QCOM_DEFAULT_DBG_PRINT_EN;
 	ufs_qcom_get_default_testbus_cfg(host);
 	err = ufs_qcom_testbus_config(host);
 	if (err) {
@@ -1191,14 +1187,9 @@ static int ufs_qcom_clk_scale_notify(struct ufs_hba *hba,
 
 static void ufs_qcom_enable_test_bus(struct ufs_qcom_host *host)
 {
-	if (host->dbg_print_en & UFS_QCOM_DBG_PRINT_TEST_BUS_EN) {
-		ufshcd_rmwl(host->hba, UFS_REG_TEST_BUS_EN,
-				UFS_REG_TEST_BUS_EN, REG_UFS_CFG1);
-		ufshcd_rmwl(host->hba, TEST_BUS_EN, TEST_BUS_EN, REG_UFS_CFG1);
-	} else {
-		ufshcd_rmwl(host->hba, UFS_REG_TEST_BUS_EN, 0, REG_UFS_CFG1);
-		ufshcd_rmwl(host->hba, TEST_BUS_EN, 0, REG_UFS_CFG1);
-	}
+	ufshcd_rmwl(host->hba, UFS_REG_TEST_BUS_EN,
+			UFS_REG_TEST_BUS_EN, REG_UFS_CFG1);
+	ufshcd_rmwl(host->hba, TEST_BUS_EN, TEST_BUS_EN, REG_UFS_CFG1);
 }
 
 static void ufs_qcom_get_default_testbus_cfg(struct ufs_qcom_host *host)
@@ -1315,9 +1306,6 @@ static void ufs_qcom_dump_dbg_regs(struct ufs_hba *hba)
 	ufshcd_dump_regs(hba, REG_UFS_SYS1CLK_1US, 16 * 4,
 			 "HCI Vendor Specific Registers ");
 
-	if (!(host->dbg_print_en & UFS_QCOM_DBG_PRINT_REGS_EN))
-		return;
-
 	reg = ufs_qcom_get_debug_reg_offset(host, UFS_UFS_DBG_RD_REG_OCSC);
 	ufshcd_dump_regs(hba, reg, 44 * 4, "UFS_UFS_DBG_RD_REG_OCSC ");
 
diff --git a/drivers/ufs/host/ufs-qcom.h b/drivers/ufs/host/ufs-qcom.h
index 44466a395bb5..e567e4636357 100644
--- a/drivers/ufs/host/ufs-qcom.h
+++ b/drivers/ufs/host/ufs-qcom.h
@@ -113,15 +113,6 @@ enum {
 	MASK_CLK_NS_REG                     = 0xFFFC00,
 };
 
-/* QCOM UFS debug print bit mask */
-#define UFS_QCOM_DBG_PRINT_REGS_EN	BIT(0)
-#define UFS_QCOM_DBG_PRINT_ICE_REGS_EN	BIT(1)
-#define UFS_QCOM_DBG_PRINT_TEST_BUS_EN	BIT(2)
-
-#define UFS_QCOM_DBG_PRINT_ALL	\
-	(UFS_QCOM_DBG_PRINT_REGS_EN | UFS_QCOM_DBG_PRINT_ICE_REGS_EN | \
-	 UFS_QCOM_DBG_PRINT_TEST_BUS_EN)
-
 /* QUniPro Vendor specific attributes */
 #define PA_VS_CONFIG_REG1	0x9000
 #define DME_VS_CORE_CLK_CTRL	0xD002
@@ -212,8 +203,6 @@ struct ufs_qcom_host {
 
 	u32 dev_ref_clk_en_mask;
 
-	/* Bitmask for enabling debug prints */
-	u32 dbg_print_en;
 	struct ufs_qcom_testbus testbus;
 
 	/* Reset control of HCI */
-- 
2.38.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 4/4] scsi: ufs: ufs-qcom: Use dev_err() where possible
  2022-12-01 23:08 [PATCH 0/4] scsi: ufs: ufs-qcom: Debug clean ups Andrew Halaney
                   ` (2 preceding siblings ...)
  2022-12-01 23:08 ` [PATCH 3/4] scsi: ufs: ufs-qcom: Remove usage of dbg_print_en Andrew Halaney
@ 2022-12-01 23:08 ` Andrew Halaney
  2022-12-02  7:40   ` Manivannan Sadhasivam
  2022-12-01 23:54 ` [PATCH 0/4] scsi: ufs: ufs-qcom: Debug clean ups Asutosh Das
  2022-12-30 21:12 ` Martin K. Petersen
  5 siblings, 1 reply; 11+ messages in thread
From: Andrew Halaney @ 2022-12-01 23:08 UTC (permalink / raw)
  To: andersson
  Cc: agross, konrad.dybcio, jejb, martin.petersen, p.zabel,
	linux-arm-msm, linux-scsi, linux-kernel, manivannan.sadhasivam,
	Andrew Halaney

dev_err() statements are better to use than pr_err(), so switch to
those.

In a similar vein, the check on the dev_req_params pointer here is
not needed, the two places this function is called never pass in a
NULL pointer, so instead of using dev_err() there just remove it.

Signed-off-by: Andrew Halaney <ahalaney@redhat.com>
---
 drivers/ufs/host/ufs-qcom.c | 8 +-------
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
index b1fcff1fad0c..4350c44a6fc7 100644
--- a/drivers/ufs/host/ufs-qcom.c
+++ b/drivers/ufs/host/ufs-qcom.c
@@ -680,12 +680,6 @@ static int ufs_qcom_pwr_change_notify(struct ufs_hba *hba,
 	struct ufs_dev_params ufs_qcom_cap;
 	int ret = 0;
 
-	if (!dev_req_params) {
-		pr_err("%s: incoming dev_req_params is NULL\n", __func__);
-		ret = -EINVAL;
-		goto out;
-	}
-
 	switch (status) {
 	case PRE_CHANGE:
 		ufshcd_init_pwr_dev_param(&ufs_qcom_cap);
@@ -709,7 +703,7 @@ static int ufs_qcom_pwr_change_notify(struct ufs_hba *hba,
 					       dev_max_params,
 					       dev_req_params);
 		if (ret) {
-			pr_err("%s: failed to determine capabilities\n",
+			dev_err(hba->dev, "%s: failed to determine capabilities\n",
 					__func__);
 			goto out;
 		}
-- 
2.38.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH 0/4] scsi: ufs: ufs-qcom: Debug clean ups
  2022-12-01 23:08 [PATCH 0/4] scsi: ufs: ufs-qcom: Debug clean ups Andrew Halaney
                   ` (3 preceding siblings ...)
  2022-12-01 23:08 ` [PATCH 4/4] scsi: ufs: ufs-qcom: Use dev_err() where possible Andrew Halaney
@ 2022-12-01 23:54 ` Asutosh Das
  2022-12-30 21:12 ` Martin K. Petersen
  5 siblings, 0 replies; 11+ messages in thread
From: Asutosh Das @ 2022-12-01 23:54 UTC (permalink / raw)
  To: Andrew Halaney
  Cc: andersson, agross, konrad.dybcio, jejb, martin.petersen, p.zabel,
	linux-arm-msm, linux-scsi, linux-kernel, manivannan.sadhasivam

On Thu, Dec 01 2022 at 15:09 -0800, Andrew Halaney wrote:
>This patch series attempts to clean up some debug code paths in the
>ufs-qcom driver.
>
>Andrew Halaney (4):
>  scsi: ufs: ufs-qcom: Drop unnecessary NULL checks
>  scsi: ufs: ufs-qcom: Clean up dbg_register_dump
>  scsi: ufs: ufs-qcom: Remove usage of dbg_print_en
>  scsi: ufs: ufs-qcom: Use dev_err() where possible
>
> drivers/ufs/host/ufs-qcom.c | 135 +++++++++++++-----------------------
> drivers/ufs/host/ufs-qcom.h |  11 ---
> 2 files changed, 48 insertions(+), 98 deletions(-)
>
>-- 
>2.38.1
>
>
This series makes sense to me. Thanks.

Reviewed-by: Asutosh Das <quic_asutoshd@quicinc.com>

-asd

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/4] scsi: ufs: ufs-qcom: Drop unnecessary NULL checks
  2022-12-01 23:08 ` [PATCH 1/4] scsi: ufs: ufs-qcom: Drop unnecessary NULL checks Andrew Halaney
@ 2022-12-02  7:36   ` Manivannan Sadhasivam
  0 siblings, 0 replies; 11+ messages in thread
From: Manivannan Sadhasivam @ 2022-12-02  7:36 UTC (permalink / raw)
  To: Andrew Halaney
  Cc: andersson, agross, konrad.dybcio, jejb, martin.petersen, p.zabel,
	linux-arm-msm, linux-scsi, linux-kernel

On Thu, Dec 01, 2022 at 05:08:07PM -0600, Andrew Halaney wrote:
> This code path is only called through one function, and the hba
> struct is already accessed in ufshcd_vops_dbg_register_dump() prior to
> calling so there is no way for it to be NULL.
> 
> Likewise, the print_fn callback is always supplied within this driver
> and is always provided.
> 
> Signed-off-by: Andrew Halaney <ahalaney@redhat.com>

Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>

Thanks,
Mani

> ---
>  drivers/ufs/host/ufs-qcom.c | 9 ---------
>  1 file changed, 9 deletions(-)
> 
> diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
> index 8ad1415e10b6..70e25f9f8ca8 100644
> --- a/drivers/ufs/host/ufs-qcom.c
> +++ b/drivers/ufs/host/ufs-qcom.c
> @@ -1202,15 +1202,6 @@ static void ufs_qcom_print_hw_debug_reg_all(struct ufs_hba *hba,
>  	u32 reg;
>  	struct ufs_qcom_host *host;
>  
> -	if (unlikely(!hba)) {
> -		pr_err("%s: hba is NULL\n", __func__);
> -		return;
> -	}
> -	if (unlikely(!print_fn)) {
> -		dev_err(hba->dev, "%s: print_fn is NULL\n", __func__);
> -		return;
> -	}
> -
>  	host = ufshcd_get_variant(hba);
>  	if (!(host->dbg_print_en & UFS_QCOM_DBG_PRINT_REGS_EN))
>  		return;
> -- 
> 2.38.1
> 

-- 
மணிவண்ணன் சதாசிவம்

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/4] scsi: ufs: ufs-qcom: Clean up dbg_register_dump
  2022-12-01 23:08 ` [PATCH 2/4] scsi: ufs: ufs-qcom: Clean up dbg_register_dump Andrew Halaney
@ 2022-12-02  7:38   ` Manivannan Sadhasivam
  0 siblings, 0 replies; 11+ messages in thread
From: Manivannan Sadhasivam @ 2022-12-02  7:38 UTC (permalink / raw)
  To: Andrew Halaney
  Cc: andersson, agross, konrad.dybcio, jejb, martin.petersen, p.zabel,
	linux-arm-msm, linux-scsi, linux-kernel

On Thu, Dec 01, 2022 at 05:08:08PM -0600, Andrew Halaney wrote:
> The current implementation has abstractions that don't give any
> benefits.
> 
> The print_fn callback (and its only callback implementation,
> ufs_qcom_dump_regs_wrapper()) was only used by
> ufs_qcom_print_hw_debug_reg_all() and just multiplies len by 4
> before calling ufshcd_dump_regs().
> 
> ufs_qcom_print_hw_debug_reg_all() is only called by
> ufs_qcom_dump_dbg_regs().
> 
> There's no real gain in those abstractions, so let's just do the work
> directly in ufs_qcom_dump_dbg_regs() (the dbg_register_dump callback).
> 
> Signed-off-by: Andrew Halaney <ahalaney@redhat.com>

Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>

Thanks,
Mani

> ---
>  drivers/ufs/host/ufs-qcom.c | 106 ++++++++++++++++--------------------
>  1 file changed, 47 insertions(+), 59 deletions(-)
> 
> diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
> index 70e25f9f8ca8..1b0dfbbdcdf3 100644
> --- a/drivers/ufs/host/ufs-qcom.c
> +++ b/drivers/ufs/host/ufs-qcom.c
> @@ -52,12 +52,6 @@ static struct ufs_qcom_host *rcdev_to_ufs_host(struct reset_controller_dev *rcd)
>  	return container_of(rcd, struct ufs_qcom_host, rcdev);
>  }
>  
> -static void ufs_qcom_dump_regs_wrapper(struct ufs_hba *hba, int offset, int len,
> -				       const char *prefix, void *priv)
> -{
> -	ufshcd_dump_regs(hba, offset, len * 4, prefix);
> -}
> -
>  static int ufs_qcom_host_clk_get(struct device *dev,
>  		const char *name, struct clk **clk_out, bool optional)
>  {
> @@ -1195,58 +1189,6 @@ static int ufs_qcom_clk_scale_notify(struct ufs_hba *hba,
>  	return err;
>  }
>  
> -static void ufs_qcom_print_hw_debug_reg_all(struct ufs_hba *hba,
> -		void *priv, void (*print_fn)(struct ufs_hba *hba,
> -		int offset, int num_regs, const char *str, void *priv))
> -{
> -	u32 reg;
> -	struct ufs_qcom_host *host;
> -
> -	host = ufshcd_get_variant(hba);
> -	if (!(host->dbg_print_en & UFS_QCOM_DBG_PRINT_REGS_EN))
> -		return;
> -
> -	reg = ufs_qcom_get_debug_reg_offset(host, UFS_UFS_DBG_RD_REG_OCSC);
> -	print_fn(hba, reg, 44, "UFS_UFS_DBG_RD_REG_OCSC ", priv);
> -
> -	reg = ufshcd_readl(hba, REG_UFS_CFG1);
> -	reg |= UTP_DBG_RAMS_EN;
> -	ufshcd_writel(hba, reg, REG_UFS_CFG1);
> -
> -	reg = ufs_qcom_get_debug_reg_offset(host, UFS_UFS_DBG_RD_EDTL_RAM);
> -	print_fn(hba, reg, 32, "UFS_UFS_DBG_RD_EDTL_RAM ", priv);
> -
> -	reg = ufs_qcom_get_debug_reg_offset(host, UFS_UFS_DBG_RD_DESC_RAM);
> -	print_fn(hba, reg, 128, "UFS_UFS_DBG_RD_DESC_RAM ", priv);
> -
> -	reg = ufs_qcom_get_debug_reg_offset(host, UFS_UFS_DBG_RD_PRDT_RAM);
> -	print_fn(hba, reg, 64, "UFS_UFS_DBG_RD_PRDT_RAM ", priv);
> -
> -	/* clear bit 17 - UTP_DBG_RAMS_EN */
> -	ufshcd_rmwl(hba, UTP_DBG_RAMS_EN, 0, REG_UFS_CFG1);
> -
> -	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_UAWM);
> -	print_fn(hba, reg, 4, "UFS_DBG_RD_REG_UAWM ", priv);
> -
> -	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_UARM);
> -	print_fn(hba, reg, 4, "UFS_DBG_RD_REG_UARM ", priv);
> -
> -	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_TXUC);
> -	print_fn(hba, reg, 48, "UFS_DBG_RD_REG_TXUC ", priv);
> -
> -	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_RXUC);
> -	print_fn(hba, reg, 27, "UFS_DBG_RD_REG_RXUC ", priv);
> -
> -	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_DFC);
> -	print_fn(hba, reg, 19, "UFS_DBG_RD_REG_DFC ", priv);
> -
> -	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_TRLUT);
> -	print_fn(hba, reg, 34, "UFS_DBG_RD_REG_TRLUT ", priv);
> -
> -	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_TMRLUT);
> -	print_fn(hba, reg, 9, "UFS_DBG_RD_REG_TMRLUT ", priv);
> -}
> -
>  static void ufs_qcom_enable_test_bus(struct ufs_qcom_host *host)
>  {
>  	if (host->dbg_print_en & UFS_QCOM_DBG_PRINT_TEST_BUS_EN) {
> @@ -1365,10 +1307,56 @@ int ufs_qcom_testbus_config(struct ufs_qcom_host *host)
>  
>  static void ufs_qcom_dump_dbg_regs(struct ufs_hba *hba)
>  {
> +	u32 reg;
> +	struct ufs_qcom_host *host;
> +
> +	host = ufshcd_get_variant(hba);
> +
>  	ufshcd_dump_regs(hba, REG_UFS_SYS1CLK_1US, 16 * 4,
>  			 "HCI Vendor Specific Registers ");
>  
> -	ufs_qcom_print_hw_debug_reg_all(hba, NULL, ufs_qcom_dump_regs_wrapper);
> +	if (!(host->dbg_print_en & UFS_QCOM_DBG_PRINT_REGS_EN))
> +		return;
> +
> +	reg = ufs_qcom_get_debug_reg_offset(host, UFS_UFS_DBG_RD_REG_OCSC);
> +	ufshcd_dump_regs(hba, reg, 44 * 4, "UFS_UFS_DBG_RD_REG_OCSC ");
> +
> +	reg = ufshcd_readl(hba, REG_UFS_CFG1);
> +	reg |= UTP_DBG_RAMS_EN;
> +	ufshcd_writel(hba, reg, REG_UFS_CFG1);
> +
> +	reg = ufs_qcom_get_debug_reg_offset(host, UFS_UFS_DBG_RD_EDTL_RAM);
> +	ufshcd_dump_regs(hba, reg, 32 * 4, "UFS_UFS_DBG_RD_EDTL_RAM ");
> +
> +	reg = ufs_qcom_get_debug_reg_offset(host, UFS_UFS_DBG_RD_DESC_RAM);
> +	ufshcd_dump_regs(hba, reg, 128 * 4, "UFS_UFS_DBG_RD_DESC_RAM ");
> +
> +	reg = ufs_qcom_get_debug_reg_offset(host, UFS_UFS_DBG_RD_PRDT_RAM);
> +	ufshcd_dump_regs(hba, reg, 64 * 4, "UFS_UFS_DBG_RD_PRDT_RAM ");
> +
> +	/* clear bit 17 - UTP_DBG_RAMS_EN */
> +	ufshcd_rmwl(hba, UTP_DBG_RAMS_EN, 0, REG_UFS_CFG1);
> +
> +	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_UAWM);
> +	ufshcd_dump_regs(hba, reg, 4 * 4, "UFS_DBG_RD_REG_UAWM ");
> +
> +	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_UARM);
> +	ufshcd_dump_regs(hba, reg, 4 * 4, "UFS_DBG_RD_REG_UARM ");
> +
> +	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_TXUC);
> +	ufshcd_dump_regs(hba, reg, 48 * 4, "UFS_DBG_RD_REG_TXUC ");
> +
> +	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_RXUC);
> +	ufshcd_dump_regs(hba, reg, 27 * 4, "UFS_DBG_RD_REG_RXUC ");
> +
> +	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_DFC);
> +	ufshcd_dump_regs(hba, reg, 19 * 4, "UFS_DBG_RD_REG_DFC ");
> +
> +	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_TRLUT);
> +	ufshcd_dump_regs(hba, reg, 34 * 4, "UFS_DBG_RD_REG_TRLUT ");
> +
> +	reg = ufs_qcom_get_debug_reg_offset(host, UFS_DBG_RD_REG_TMRLUT);
> +	ufshcd_dump_regs(hba, reg, 9 * 4, "UFS_DBG_RD_REG_TMRLUT ");
>  }
>  
>  /**
> -- 
> 2.38.1
> 

-- 
மணிவண்ணன் சதாசிவம்

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 3/4] scsi: ufs: ufs-qcom: Remove usage of dbg_print_en
  2022-12-01 23:08 ` [PATCH 3/4] scsi: ufs: ufs-qcom: Remove usage of dbg_print_en Andrew Halaney
@ 2022-12-02  7:39   ` Manivannan Sadhasivam
  0 siblings, 0 replies; 11+ messages in thread
From: Manivannan Sadhasivam @ 2022-12-02  7:39 UTC (permalink / raw)
  To: Andrew Halaney
  Cc: andersson, agross, konrad.dybcio, jejb, martin.petersen, p.zabel,
	linux-arm-msm, linux-scsi, linux-kernel

On Thu, Dec 01, 2022 at 05:08:09PM -0600, Andrew Halaney wrote:
> This bitmask is unconditionally set in the current driver,
> so all conditionals using it can be considered bit rot.
> 
> Let's take the current default conditional path everywhere and remove
> dbg_print_en from the driver.
> 
> Signed-off-by: Andrew Halaney <ahalaney@redhat.com>

Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>

Thanks,
Mani

> ---
>  drivers/ufs/host/ufs-qcom.c | 18 +++---------------
>  drivers/ufs/host/ufs-qcom.h | 11 -----------
>  2 files changed, 3 insertions(+), 26 deletions(-)
> 
> diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
> index 1b0dfbbdcdf3..b1fcff1fad0c 100644
> --- a/drivers/ufs/host/ufs-qcom.c
> +++ b/drivers/ufs/host/ufs-qcom.c
> @@ -22,9 +22,6 @@
>  #include <ufs/ufshci.h>
>  #include <ufs/ufs_quirks.h>
>  
> -#define UFS_QCOM_DEFAULT_DBG_PRINT_EN	\
> -	(UFS_QCOM_DBG_PRINT_REGS_EN | UFS_QCOM_DBG_PRINT_TEST_BUS_EN)
> -
>  enum {
>  	TSTBUS_UAWM,
>  	TSTBUS_UARM,
> @@ -1040,7 +1037,6 @@ static int ufs_qcom_init(struct ufs_hba *hba)
>  	if (hba->dev->id < MAX_UFS_QCOM_HOSTS)
>  		ufs_qcom_hosts[hba->dev->id] = host;
>  
> -	host->dbg_print_en |= UFS_QCOM_DEFAULT_DBG_PRINT_EN;
>  	ufs_qcom_get_default_testbus_cfg(host);
>  	err = ufs_qcom_testbus_config(host);
>  	if (err) {
> @@ -1191,14 +1187,9 @@ static int ufs_qcom_clk_scale_notify(struct ufs_hba *hba,
>  
>  static void ufs_qcom_enable_test_bus(struct ufs_qcom_host *host)
>  {
> -	if (host->dbg_print_en & UFS_QCOM_DBG_PRINT_TEST_BUS_EN) {
> -		ufshcd_rmwl(host->hba, UFS_REG_TEST_BUS_EN,
> -				UFS_REG_TEST_BUS_EN, REG_UFS_CFG1);
> -		ufshcd_rmwl(host->hba, TEST_BUS_EN, TEST_BUS_EN, REG_UFS_CFG1);
> -	} else {
> -		ufshcd_rmwl(host->hba, UFS_REG_TEST_BUS_EN, 0, REG_UFS_CFG1);
> -		ufshcd_rmwl(host->hba, TEST_BUS_EN, 0, REG_UFS_CFG1);
> -	}
> +	ufshcd_rmwl(host->hba, UFS_REG_TEST_BUS_EN,
> +			UFS_REG_TEST_BUS_EN, REG_UFS_CFG1);
> +	ufshcd_rmwl(host->hba, TEST_BUS_EN, TEST_BUS_EN, REG_UFS_CFG1);
>  }
>  
>  static void ufs_qcom_get_default_testbus_cfg(struct ufs_qcom_host *host)
> @@ -1315,9 +1306,6 @@ static void ufs_qcom_dump_dbg_regs(struct ufs_hba *hba)
>  	ufshcd_dump_regs(hba, REG_UFS_SYS1CLK_1US, 16 * 4,
>  			 "HCI Vendor Specific Registers ");
>  
> -	if (!(host->dbg_print_en & UFS_QCOM_DBG_PRINT_REGS_EN))
> -		return;
> -
>  	reg = ufs_qcom_get_debug_reg_offset(host, UFS_UFS_DBG_RD_REG_OCSC);
>  	ufshcd_dump_regs(hba, reg, 44 * 4, "UFS_UFS_DBG_RD_REG_OCSC ");
>  
> diff --git a/drivers/ufs/host/ufs-qcom.h b/drivers/ufs/host/ufs-qcom.h
> index 44466a395bb5..e567e4636357 100644
> --- a/drivers/ufs/host/ufs-qcom.h
> +++ b/drivers/ufs/host/ufs-qcom.h
> @@ -113,15 +113,6 @@ enum {
>  	MASK_CLK_NS_REG                     = 0xFFFC00,
>  };
>  
> -/* QCOM UFS debug print bit mask */
> -#define UFS_QCOM_DBG_PRINT_REGS_EN	BIT(0)
> -#define UFS_QCOM_DBG_PRINT_ICE_REGS_EN	BIT(1)
> -#define UFS_QCOM_DBG_PRINT_TEST_BUS_EN	BIT(2)
> -
> -#define UFS_QCOM_DBG_PRINT_ALL	\
> -	(UFS_QCOM_DBG_PRINT_REGS_EN | UFS_QCOM_DBG_PRINT_ICE_REGS_EN | \
> -	 UFS_QCOM_DBG_PRINT_TEST_BUS_EN)
> -
>  /* QUniPro Vendor specific attributes */
>  #define PA_VS_CONFIG_REG1	0x9000
>  #define DME_VS_CORE_CLK_CTRL	0xD002
> @@ -212,8 +203,6 @@ struct ufs_qcom_host {
>  
>  	u32 dev_ref_clk_en_mask;
>  
> -	/* Bitmask for enabling debug prints */
> -	u32 dbg_print_en;
>  	struct ufs_qcom_testbus testbus;
>  
>  	/* Reset control of HCI */
> -- 
> 2.38.1
> 

-- 
மணிவண்ணன் சதாசிவம்

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 4/4] scsi: ufs: ufs-qcom: Use dev_err() where possible
  2022-12-01 23:08 ` [PATCH 4/4] scsi: ufs: ufs-qcom: Use dev_err() where possible Andrew Halaney
@ 2022-12-02  7:40   ` Manivannan Sadhasivam
  0 siblings, 0 replies; 11+ messages in thread
From: Manivannan Sadhasivam @ 2022-12-02  7:40 UTC (permalink / raw)
  To: Andrew Halaney
  Cc: andersson, agross, konrad.dybcio, jejb, martin.petersen, p.zabel,
	linux-arm-msm, linux-scsi, linux-kernel

On Thu, Dec 01, 2022 at 05:08:10PM -0600, Andrew Halaney wrote:
> dev_err() statements are better to use than pr_err(), so switch to
> those.
> 
> In a similar vein, the check on the dev_req_params pointer here is
> not needed, the two places this function is called never pass in a
> NULL pointer, so instead of using dev_err() there just remove it.
> 
> Signed-off-by: Andrew Halaney <ahalaney@redhat.com>

Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>

Thanks,
Mani

> ---
>  drivers/ufs/host/ufs-qcom.c | 8 +-------
>  1 file changed, 1 insertion(+), 7 deletions(-)
> 
> diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
> index b1fcff1fad0c..4350c44a6fc7 100644
> --- a/drivers/ufs/host/ufs-qcom.c
> +++ b/drivers/ufs/host/ufs-qcom.c
> @@ -680,12 +680,6 @@ static int ufs_qcom_pwr_change_notify(struct ufs_hba *hba,
>  	struct ufs_dev_params ufs_qcom_cap;
>  	int ret = 0;
>  
> -	if (!dev_req_params) {
> -		pr_err("%s: incoming dev_req_params is NULL\n", __func__);
> -		ret = -EINVAL;
> -		goto out;
> -	}
> -
>  	switch (status) {
>  	case PRE_CHANGE:
>  		ufshcd_init_pwr_dev_param(&ufs_qcom_cap);
> @@ -709,7 +703,7 @@ static int ufs_qcom_pwr_change_notify(struct ufs_hba *hba,
>  					       dev_max_params,
>  					       dev_req_params);
>  		if (ret) {
> -			pr_err("%s: failed to determine capabilities\n",
> +			dev_err(hba->dev, "%s: failed to determine capabilities\n",
>  					__func__);
>  			goto out;
>  		}
> -- 
> 2.38.1
> 

-- 
மணிவண்ணன் சதாசிவம்

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 0/4] scsi: ufs: ufs-qcom: Debug clean ups
  2022-12-01 23:08 [PATCH 0/4] scsi: ufs: ufs-qcom: Debug clean ups Andrew Halaney
                   ` (4 preceding siblings ...)
  2022-12-01 23:54 ` [PATCH 0/4] scsi: ufs: ufs-qcom: Debug clean ups Asutosh Das
@ 2022-12-30 21:12 ` Martin K. Petersen
  5 siblings, 0 replies; 11+ messages in thread
From: Martin K. Petersen @ 2022-12-30 21:12 UTC (permalink / raw)
  To: Andrew Halaney
  Cc: andersson, agross, konrad.dybcio, jejb, martin.petersen, p.zabel,
	linux-arm-msm, linux-scsi, linux-kernel, manivannan.sadhasivam


Andrew,

> This patch series attempts to clean up some debug code paths in the
> ufs-qcom driver.

Applied to 6.3/scsi-staging, thanks!

-- 
Martin K. Petersen	Oracle Linux Engineering

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2022-12-30 21:13 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-12-01 23:08 [PATCH 0/4] scsi: ufs: ufs-qcom: Debug clean ups Andrew Halaney
2022-12-01 23:08 ` [PATCH 1/4] scsi: ufs: ufs-qcom: Drop unnecessary NULL checks Andrew Halaney
2022-12-02  7:36   ` Manivannan Sadhasivam
2022-12-01 23:08 ` [PATCH 2/4] scsi: ufs: ufs-qcom: Clean up dbg_register_dump Andrew Halaney
2022-12-02  7:38   ` Manivannan Sadhasivam
2022-12-01 23:08 ` [PATCH 3/4] scsi: ufs: ufs-qcom: Remove usage of dbg_print_en Andrew Halaney
2022-12-02  7:39   ` Manivannan Sadhasivam
2022-12-01 23:08 ` [PATCH 4/4] scsi: ufs: ufs-qcom: Use dev_err() where possible Andrew Halaney
2022-12-02  7:40   ` Manivannan Sadhasivam
2022-12-01 23:54 ` [PATCH 0/4] scsi: ufs: ufs-qcom: Debug clean ups Asutosh Das
2022-12-30 21:12 ` Martin K. Petersen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox