linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH V7 0/4] mmc: add error statistics for eMMC and SD card
@ 2022-05-25 12:28 Shaik Sajida Bhanu
  2022-05-25 12:28 ` [PATCH V7 1/4] mmc: core: Capture eMMC and SD card errors Shaik Sajida Bhanu
                   ` (4 more replies)
  0 siblings, 5 replies; 7+ messages in thread
From: Shaik Sajida Bhanu @ 2022-05-25 12:28 UTC (permalink / raw)
  To: adrian.hunter, ulf.hansson, agross, bjorn.andersson, p.zabel,
	chris, venkatg, gdjakov, quic_asutoshd
  Cc: linux-arm-msm, linux-mmc, linux-kernel, quic_rampraka,
	quic_pragalla, quic_sartgarg, quic_nitirawa, quic_sayalil,
	Shaik Sajida Bhanu

Changes since V6:
	- Rebased on Ulf's(Ulf Hansson) next branch as suggested by
	  Adrain Hunter.
	- Replaced debugfs_create_file() with debugfs_create_file_unsafe()
	  as suggested by Adrain Hunter.
	- "[V6,5/5] mmc: cqhci: Capture eMMC and SD card errors" not included
	  in this Patch series as we don't have cqhci changes on Ulf's(Ulf Hansson)
	  next branch.

Changes since V5:
	- Considered all error stats enums to set error state.
	- Added missed tuning error related code changes which was
	  missed in patch set V5 as Adrain Hunter pointed.
	- Replaced DEFINE_SIMPLE_ATTRIBUTE with DEFINE_DEBUGFS_ATTRIBUTE
	  as suggested by Adrain Hunter.
	  
Changes since V4:
	- Defined new macro to increment err_stats members when error occurred
	  as suggested by Adrain Hunter.
	- Called err_stats members increment function after printing the error
	  as suggested by Adrain Hunter.
	- Considered INDEX and END_BIT errors same as CRC errors as suggested
	  by Adrain Hunter.
	- Removed Null check for host in debug fs functions and Reordered
	  err_stats declarationas suggested by Adrain Hunter.
	- Removed err_state variable stuff and updated err_state debug fs entry
	  based on the err_stats members state as suggested by Adrain Hunter.

Changes since V3:
	- Dropped error stats feature flag as suggested by Adrain Hunter.
	- Separated error state related changes in separate patches as
	  suggested by Adrain Hunter.
	  [PATCH V4 4/7] : error state debug fs
	  [PATCH V4 5/7] : error state enable function
	  [PATCH V4 6/7] : error state enable in error case
	- Note: we are enabling error state before calling sdhci_dumpregs
	  we couldn't add the err state in error stats array as err state
	  is not error type.
	- Corrected Signed-off-by order as suggested by Bjron Andersson.
	- Moved error state enable code from sdhci_dumpregs to error
	  conditions as suggested by Adrain Hunter

Changes since V2:
	- Removed userspace error stats clear debug fs entry as suggested
	  by Adrain Hunter.
	- Split patch into 4 patches
	  [PATCH V3 1/4] : sdhci driver
	  [PATCH V3 2/4] : debug fs entries
	  [PATCH V3 3/4] : core driver
	  [PATCH V3 4/4] : cqhci driver
	- Used for loop to print error messages instead of using printf
	  statements for all error messages as suggested by Adrain Hunter.
	- Introduced one flag to enable error stats feature, if any other
	  client wants to use this feature, they need to enable that flag.
	- Moved reset command timeout error statement to card init flow
	  as suggested by Adrain Hunter.

Changes since V1:
	- Removed sysfs entry for eMMC and SD card error statistics and added
	  debugfs entry as suggested by Adrian Hunter and Ulf Hansson.

Shaik Sajida Bhanu (4):
  mmc: core: Capture eMMC and SD card errors
  mmc: sdhci: Capture eMMC and SD card errors
  mmc: debugfs: Add debug fs entry for mmc driver
  mmc: debugfs: Add debug fs error state entry for mmc driver

 drivers/mmc/core/core.c    | 11 +++++--
 drivers/mmc/core/debugfs.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++
 drivers/mmc/host/sdhci.c   | 33 +++++++++++++++----
 drivers/mmc/host/sdhci.h   |  3 ++
 include/linux/mmc/host.h   | 26 +++++++++++++++
 include/linux/mmc/mmc.h    |  6 ++++
 6 files changed, 151 insertions(+), 9 deletions(-)

-- 
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member 
of Code Aurora Forum, hosted by The Linux Foundation


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

* [PATCH V7 1/4] mmc: core: Capture eMMC and SD card errors
  2022-05-25 12:28 [PATCH V7 0/4] mmc: add error statistics for eMMC and SD card Shaik Sajida Bhanu
@ 2022-05-25 12:28 ` Shaik Sajida Bhanu
  2022-05-25 12:28 ` [PATCH V7 2/4] mmc: sdhci: " Shaik Sajida Bhanu
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Shaik Sajida Bhanu @ 2022-05-25 12:28 UTC (permalink / raw)
  To: adrian.hunter, ulf.hansson, agross, bjorn.andersson, p.zabel,
	chris, venkatg, gdjakov, quic_asutoshd
  Cc: linux-arm-msm, linux-mmc, linux-kernel, quic_rampraka,
	quic_pragalla, quic_sartgarg, quic_nitirawa, quic_sayalil,
	Shaik Sajida Bhanu, Liangliang Lu, Bao D . Nguyen

Add changes to capture eMMC and SD card errors.
This is useful for debug and testing.

Signed-off-by: Liangliang Lu <quic_luliang@quicinc.com>
Signed-off-by: Sayali Lokhande <quic_sayalil@quicinc.com>
Signed-off-by: Bao D. Nguyen <quic_nguyenb@quicinc.com>
Signed-off-by: Ram Prakash Gupta <quic_rampraka@quicinc.com>
Signed-off-by: Shaik Sajida Bhanu <quic_c_sbhanu@quicinc.com>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
---
 drivers/mmc/core/core.c  | 11 +++++++++--
 include/linux/mmc/host.h | 26 ++++++++++++++++++++++++++
 2 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index 2553d90..ede7887 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -1171,10 +1171,11 @@ int mmc_execute_tuning(struct mmc_card *card)
 
 	err = host->ops->execute_tuning(host, opcode);
 
-	if (err)
+	if (err) {
 		pr_err("%s: tuning execution failed: %d\n",
 			mmc_hostname(host), err);
-	else
+		mmc_debugfs_err_stats_inc(host, MMC_ERR_TUNING);
+	} else
 		mmc_retune_enable(host);
 
 	return err;
@@ -2811,6 +2812,12 @@ void mmc_rescan(struct work_struct *work)
 		if (freqs[i] <= host->f_min)
 			break;
 	}
+
+	/*
+	 * Ignore the command timeout errors observed during
+	 * the card init as those are excepted.
+	 */
+	host->err_stats[MMC_ERR_CMD_TIMEOUT] = 0;
 	mmc_release_host(host);
 
  out:
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
index 0b24394..ceb353b 100644
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h
@@ -82,6 +82,25 @@ struct mmc_ios {
 	bool enhanced_strobe;			/* hs400es selection */
 };
 
+enum mmc_err_stat {
+	MMC_ERR_CMD_TIMEOUT,
+	MMC_ERR_CMD_CRC,
+	MMC_ERR_DAT_TIMEOUT,
+	MMC_ERR_DAT_CRC,
+	MMC_ERR_AUTO_CMD,
+	MMC_ERR_ADMA,
+	MMC_ERR_TUNING,
+	MMC_ERR_CMDQ_RED,
+	MMC_ERR_CMDQ_GCE,
+	MMC_ERR_CMDQ_ICCE,
+	MMC_ERR_REQ_TIMEOUT,
+	MMC_ERR_CMDQ_REQ_TIMEOUT,
+	MMC_ERR_ICE_CFG,
+	MMC_ERR_CTRL_TIMEOUT,
+	MMC_ERR_UNEXPECTED_IRQ,
+	MMC_ERR_MAX,
+};
+
 struct mmc_host_ops {
 	/*
 	 * It is optional for the host to implement pre_req and post_req in
@@ -397,6 +416,7 @@ struct mmc_host {
 	int			dsr_req;	/* DSR value is valid */
 	u32			dsr;	/* optional driver stage (DSR) value */
 
+	u32			err_stats[MMC_ERR_MAX];
 	unsigned long		private[0] ____cacheline_aligned;
 };
 
@@ -546,6 +566,12 @@ static inline void mmc_retune_recheck(struct mmc_host *host)
 		host->retune_now = 1;
 }
 
+static inline void mmc_debugfs_err_stats_inc(struct mmc_host *host,
+					     enum mmc_err_stat stat)
+{
+	host->err_stats[stat] += 1;
+}
+
 void mmc_retune_pause(struct mmc_host *host);
 void mmc_retune_unpause(struct mmc_host *host);
 
-- 
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member 
of Code Aurora Forum, hosted by The Linux Foundation


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

* [PATCH V7 2/4] mmc: sdhci: Capture eMMC and SD card errors
  2022-05-25 12:28 [PATCH V7 0/4] mmc: add error statistics for eMMC and SD card Shaik Sajida Bhanu
  2022-05-25 12:28 ` [PATCH V7 1/4] mmc: core: Capture eMMC and SD card errors Shaik Sajida Bhanu
@ 2022-05-25 12:28 ` Shaik Sajida Bhanu
  2022-05-25 12:28 ` [PATCH V7 3/4] mmc: debugfs: Add debug fs entry for mmc driver Shaik Sajida Bhanu
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Shaik Sajida Bhanu @ 2022-05-25 12:28 UTC (permalink / raw)
  To: adrian.hunter, ulf.hansson, agross, bjorn.andersson, p.zabel,
	chris, venkatg, gdjakov, quic_asutoshd
  Cc: linux-arm-msm, linux-mmc, linux-kernel, quic_rampraka,
	quic_pragalla, quic_sartgarg, quic_nitirawa, quic_sayalil,
	Shaik Sajida Bhanu, Liangliang Lu, Bao D . Nguyen

Add changes to capture eMMC and SD card errors.
This is useful for debug and testing.

Signed-off-by: Liangliang Lu <quic_luliang@quicinc.com>
Signed-off-by: Sayali Lokhande <quic_sayalil@quicinc.com>
Signed-off-by: Bao D. Nguyen <quic_nguyenb@quicinc.com>
Signed-off-by: Shaik Sajida Bhanu <quic_c_sbhanu@quicinc.com>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
---
 drivers/mmc/host/sdhci.c | 33 ++++++++++++++++++++++++++-------
 drivers/mmc/host/sdhci.h |  3 +++
 include/linux/mmc/mmc.h  |  6 ++++++
 3 files changed, 35 insertions(+), 7 deletions(-)

diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 4805566..95c1b39 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -183,6 +183,7 @@ void sdhci_reset(struct sdhci_host *host, u8 mask)
 		if (timeout == 0) {
 			pr_err("%s: Reset 0x%x never completed.\n",
 				mmc_hostname(host->mmc), (int)mask);
+			sdhci_err_stats_inc(host, CTRL_TIMEOUT);
 			sdhci_dumpregs(host);
 			return;
 		}
@@ -1093,6 +1094,7 @@ void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd)
 		if (timeout == 0) {
 			pr_err("%s: Controller never released inhibit bit(s).\n",
 			       mmc_hostname(host->mmc));
+			sdhci_err_stats_inc(host, CTRL_TIMEOUT);
 			sdhci_dumpregs(host);
 			cmd->error = -EIO;
 			sdhci_finish_mrq(host, cmd->mrq);
@@ -1363,6 +1365,7 @@ void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
 		if (timeout == 0) {
 			pr_err("%s: Internal clock never stabilised.\n",
 			       mmc_hostname(host->mmc));
+			sdhci_err_stats_inc(host, CTRL_TIMEOUT);
 			sdhci_dumpregs(host);
 			return;
 		}
@@ -2362,6 +2365,7 @@ static void sdhci_timeout_timer(unsigned long data)
 	if (host->cmd && !sdhci_data_line_cmd(host->cmd)) {
 		pr_err("%s: Timeout waiting for hardware cmd interrupt.\n",
 		       mmc_hostname(host->mmc));
+		sdhci_err_stats_inc(host, REQ_TIMEOUT);
 		sdhci_dumpregs(host);
 
 		host->cmd->error = -ETIMEDOUT;
@@ -2385,6 +2389,7 @@ static void sdhci_timeout_data_timer(unsigned long data)
 	    (host->cmd && sdhci_data_line_cmd(host->cmd))) {
 		pr_err("%s: Timeout waiting for hardware interrupt.\n",
 		       mmc_hostname(host->mmc));
+		sdhci_err_stats_inc(host, REQ_TIMEOUT);
 		sdhci_dumpregs(host);
 
 		if (host->data) {
@@ -2421,16 +2426,21 @@ static void sdhci_cmd_irq(struct sdhci_host *host, u32 intmask, u32 *mask)
 			return;
 		pr_err("%s: Got command interrupt 0x%08x even though no command operation was in progress.\n",
 		       mmc_hostname(host->mmc), (unsigned)intmask);
+		sdhci_err_stats_inc(host, UNEXPECTED_IRQ);
 		sdhci_dumpregs(host);
 		return;
 	}
 
 	if (intmask & (SDHCI_INT_TIMEOUT | SDHCI_INT_CRC |
 		       SDHCI_INT_END_BIT | SDHCI_INT_INDEX)) {
-		if (intmask & SDHCI_INT_TIMEOUT)
+		if (intmask & SDHCI_INT_TIMEOUT) {
 			host->cmd->error = -ETIMEDOUT;
-		else
+			sdhci_err_stats_inc(host, CMD_TIMEOUT);
+		} else {
 			host->cmd->error = -EILSEQ;
+			if (!mmc_op_tuning(host->cmd->opcode))
+				sdhci_err_stats_inc(host, CMD_CRC);
+		}
 
 		/*
 		 * If this command initiates a data phase and a response
@@ -2524,6 +2534,7 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
 		if (data_cmd && (data_cmd->flags & MMC_RSP_BUSY)) {
 			if (intmask & SDHCI_INT_DATA_TIMEOUT) {
 				data_cmd->error = -ETIMEDOUT;
+				sdhci_err_stats_inc(host, CMD_TIMEOUT);
 				sdhci_finish_mrq(host, data_cmd->mrq);
 				return;
 			}
@@ -2551,22 +2562,29 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
 
 		pr_err("%s: Got data interrupt 0x%08x even though no data operation was in progress.\n",
 		       mmc_hostname(host->mmc), (unsigned)intmask);
+		sdhci_err_stats_inc(host, UNEXPECTED_IRQ);
 		sdhci_dumpregs(host);
 
 		return;
 	}
 
-	if (intmask & SDHCI_INT_DATA_TIMEOUT)
+	if (intmask & SDHCI_INT_DATA_TIMEOUT) {
 		host->data->error = -ETIMEDOUT;
-	else if (intmask & SDHCI_INT_DATA_END_BIT)
+		sdhci_err_stats_inc(host, DAT_TIMEOUT);
+	} else if (intmask & SDHCI_INT_DATA_END_BIT) {
 		host->data->error = -EILSEQ;
-	else if ((intmask & SDHCI_INT_DATA_CRC) &&
+		if (!mmc_op_tuning(SDHCI_GET_CMD(sdhci_readw(host, SDHCI_COMMAND))))
+			sdhci_err_stats_inc(host, DAT_CRC);
+	} else if ((intmask & SDHCI_INT_DATA_CRC) &&
 		SDHCI_GET_CMD(sdhci_readw(host, SDHCI_COMMAND))
-			!= MMC_BUS_TEST_R)
+			!= MMC_BUS_TEST_R) {
 		host->data->error = -EILSEQ;
-	else if (intmask & SDHCI_INT_ADMA_ERROR) {
+		if (!mmc_op_tuning(SDHCI_GET_CMD(sdhci_readw(host, SDHCI_COMMAND))))
+			sdhci_err_stats_inc(host, DAT_CRC);
+	} else if (intmask & SDHCI_INT_ADMA_ERROR) {
 		pr_err("%s: ADMA error\n", mmc_hostname(host->mmc));
 		sdhci_adma_show_error(host);
+		sdhci_err_stats_inc(host, ADMA);
 		host->data->error = -EIO;
 		if (host->ops->adma_workaround)
 			host->ops->adma_workaround(host, intmask);
@@ -2720,6 +2738,7 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id)
 	if (unexpected) {
 		pr_err("%s: Unexpected interrupt 0x%08x.\n",
 			   mmc_hostname(host->mmc), unexpected);
+		sdhci_err_stats_inc(host, UNEXPECTED_IRQ);
 		sdhci_dumpregs(host);
 	}
 
diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
index c722cd2..492a350 100644
--- a/drivers/mmc/host/sdhci.h
+++ b/drivers/mmc/host/sdhci.h
@@ -321,6 +321,9 @@ struct sdhci_adma2_64_desc {
 /* Allow for a a command request and a data request at the same time */
 #define SDHCI_MAX_MRQS		2
 
+#define sdhci_err_stats_inc(host, err_name) \
+	mmc_debugfs_err_stats_inc((host)->mmc, MMC_ERR_##err_name)
+
 enum sdhci_cookie {
 	COOKIE_UNMAPPED,
 	COOKIE_PRE_MAPPED,	/* mapped by sdhci_pre_req() */
diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h
index c376209..2d66c89 100644
--- a/include/linux/mmc/mmc.h
+++ b/include/linux/mmc/mmc.h
@@ -90,6 +90,12 @@ static inline bool mmc_op_multi(u32 opcode)
 	       opcode == MMC_READ_MULTIPLE_BLOCK;
 }
 
+static inline bool mmc_op_tuning(u32 opcode)
+{
+	return opcode == MMC_SEND_TUNING_BLOCK ||
+			opcode == MMC_SEND_TUNING_BLOCK_HS200;
+}
+
 /*
  * MMC_SWITCH argument format:
  *
-- 
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member 
of Code Aurora Forum, hosted by The Linux Foundation


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

* [PATCH V7 3/4] mmc: debugfs: Add debug fs entry for mmc driver
  2022-05-25 12:28 [PATCH V7 0/4] mmc: add error statistics for eMMC and SD card Shaik Sajida Bhanu
  2022-05-25 12:28 ` [PATCH V7 1/4] mmc: core: Capture eMMC and SD card errors Shaik Sajida Bhanu
  2022-05-25 12:28 ` [PATCH V7 2/4] mmc: sdhci: " Shaik Sajida Bhanu
@ 2022-05-25 12:28 ` Shaik Sajida Bhanu
  2022-05-25 12:28 ` [PATCH V7 4/4] mmc: debugfs: Add debug fs error state " Shaik Sajida Bhanu
  2022-05-27  9:45 ` [PATCH V7 0/4] mmc: add error statistics for eMMC and SD card Adrian Hunter
  4 siblings, 0 replies; 7+ messages in thread
From: Shaik Sajida Bhanu @ 2022-05-25 12:28 UTC (permalink / raw)
  To: adrian.hunter, ulf.hansson, agross, bjorn.andersson, p.zabel,
	chris, venkatg, gdjakov, quic_asutoshd
  Cc: linux-arm-msm, linux-mmc, linux-kernel, quic_rampraka,
	quic_pragalla, quic_sartgarg, quic_nitirawa, quic_sayalil,
	Shaik Sajida Bhanu, Liangliang Lu, Bao D . Nguyen

Add debug fs entry to query eMMC and SD card errors statistics

Signed-off-by: Liangliang Lu <quic_luliang@quicinc.com>
Signed-off-by: Sayali Lokhande <quic_sayalil@quicinc.com>
Signed-off-by: Bao D. Nguyen <quic_nguyenb@quicinc.com>
Signed-off-by: Shaik Sajida Bhanu <quic_c_sbhanu@quicinc.com>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
---
 drivers/mmc/core/debugfs.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 56 insertions(+)

diff --git a/drivers/mmc/core/debugfs.c b/drivers/mmc/core/debugfs.c
index c8451ce..f9fb51f 100644
--- a/drivers/mmc/core/debugfs.c
+++ b/drivers/mmc/core/debugfs.c
@@ -234,6 +234,59 @@ static int mmc_clock_opt_set(void *data, u64 val)
 DEFINE_SIMPLE_ATTRIBUTE(mmc_clock_fops, mmc_clock_opt_get, mmc_clock_opt_set,
 	"%llu\n");
 
+static int mmc_err_stats_show(struct seq_file *file, void *data)
+{
+	struct mmc_host *host = (struct mmc_host *)file->private;
+	const char *desc[MMC_ERR_MAX] = {
+		[MMC_ERR_CMD_TIMEOUT] = "Command Timeout Occurred",
+		[MMC_ERR_CMD_CRC] = "Command CRC Errors Occurred",
+		[MMC_ERR_DAT_TIMEOUT] = "Data Timeout Occurred",
+		[MMC_ERR_DAT_CRC] = "Data CRC Errors Occurred",
+		[MMC_ERR_AUTO_CMD] = "Auto-Cmd Error Occurred",
+		[MMC_ERR_ADMA] = "ADMA Error Occurred",
+		[MMC_ERR_TUNING] = "Tuning Error Occurred",
+		[MMC_ERR_CMDQ_RED] = "CMDQ RED Errors",
+		[MMC_ERR_CMDQ_GCE] = "CMDQ GCE Errors",
+		[MMC_ERR_CMDQ_ICCE] = "CMDQ ICCE Errors",
+		[MMC_ERR_REQ_TIMEOUT] = "Request Timedout",
+		[MMC_ERR_CMDQ_REQ_TIMEOUT] = "CMDQ Request Timedout",
+		[MMC_ERR_ICE_CFG] = "ICE Config Errors",
+		[MMC_ERR_CTRL_TIMEOUT] = "Controller Timedout errors",
+		[MMC_ERR_UNEXPECTED_IRQ] = "Unexpected IRQ errors",
+	};
+	int i;
+
+	for (i = 0; i < MMC_ERR_MAX; i++) {
+		if (desc[i])
+			seq_printf(file, "# %s:\t %d\n",
+					desc[i], host->err_stats[i]);
+	}
+
+	return 0;
+}
+
+static int mmc_err_stats_open(struct inode *inode, struct file *file)
+{
+	return single_open(file, mmc_err_stats_show, inode->i_private);
+}
+
+static ssize_t mmc_err_stats_write(struct file *filp, const char __user *ubuf,
+				   size_t cnt, loff_t *ppos)
+{
+	struct mmc_host *host = filp->f_mapping->host->i_private;
+
+	pr_debug("%s: Resetting MMC error statistics\n", __func__);
+	memset(host->err_stats, 0, sizeof(host->err_stats));
+
+	return cnt;
+}
+
+static const struct file_operations mmc_err_stats_fops = {
+	.open	= mmc_err_stats_open,
+	.read	= seq_read,
+	.write	= mmc_err_stats_write,
+};
+
 void mmc_add_host_debugfs(struct mmc_host *host)
 {
 	struct dentry *root;
@@ -256,6 +309,9 @@ void mmc_add_host_debugfs(struct mmc_host *host)
 			&mmc_clock_fops))
 		goto err_node;
 
+	if (!debugfs_create_file("err_stats", 0600, root, host,
+			&mmc_err_stats_fops))
+		goto err_node;
 #ifdef CONFIG_FAIL_MMC_REQUEST
 	if (fail_request)
 		setup_fault_attr(&fail_default_attr, fail_request);
-- 
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member 
of Code Aurora Forum, hosted by The Linux Foundation


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

* [PATCH V7 4/4] mmc: debugfs: Add debug fs error state entry for mmc driver
  2022-05-25 12:28 [PATCH V7 0/4] mmc: add error statistics for eMMC and SD card Shaik Sajida Bhanu
                   ` (2 preceding siblings ...)
  2022-05-25 12:28 ` [PATCH V7 3/4] mmc: debugfs: Add debug fs entry for mmc driver Shaik Sajida Bhanu
@ 2022-05-25 12:28 ` Shaik Sajida Bhanu
  2022-05-27  9:45 ` [PATCH V7 0/4] mmc: add error statistics for eMMC and SD card Adrian Hunter
  4 siblings, 0 replies; 7+ messages in thread
From: Shaik Sajida Bhanu @ 2022-05-25 12:28 UTC (permalink / raw)
  To: adrian.hunter, ulf.hansson, agross, bjorn.andersson, p.zabel,
	chris, venkatg, gdjakov, quic_asutoshd
  Cc: linux-arm-msm, linux-mmc, linux-kernel, quic_rampraka,
	quic_pragalla, quic_sartgarg, quic_nitirawa, quic_sayalil,
	Shaik Sajida Bhanu, Liangliang Lu, Bao D . Nguyen

Add debug fs entry error state to query eMMC and SD card errors statistics.
If any errors occurred in eMMC and SD card driver level then
err_state value will be set to 1.

Signed-off-by: Liangliang Lu <quic_luliang@quicinc.com>
Signed-off-by: Sayali Lokhande <quic_sayalil@quicinc.com>
Signed-off-by: Bao D. Nguyen <quic_nguyenb@quicinc.com>
Signed-off-by: Shaik Sajida Bhanu <quic_c_sbhanu@quicinc.com>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
---
 drivers/mmc/core/debugfs.c | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/drivers/mmc/core/debugfs.c b/drivers/mmc/core/debugfs.c
index f9fb51f..d8ff66f 100644
--- a/drivers/mmc/core/debugfs.c
+++ b/drivers/mmc/core/debugfs.c
@@ -234,6 +234,27 @@ static int mmc_clock_opt_set(void *data, u64 val)
 DEFINE_SIMPLE_ATTRIBUTE(mmc_clock_fops, mmc_clock_opt_get, mmc_clock_opt_set,
 	"%llu\n");
 
+static int mmc_err_state_get(void *data, u64 *val)
+{
+	struct mmc_host *host = data;
+	int i;
+
+	if (!host)
+		return -EINVAL;
+
+	*val = 0;
+	for (i = 0; i < MMC_ERR_MAX; i++) {
+		if (host->err_stats[i]) {
+			*val = 1;
+			break;
+		}
+	}
+
+	return 0;
+}
+
+DEFINE_DEBUGFS_ATTRIBUTE(mmc_err_state, mmc_err_state_get, NULL, "%llu\n");
+
 static int mmc_err_stats_show(struct seq_file *file, void *data)
 {
 	struct mmc_host *host = (struct mmc_host *)file->private;
@@ -309,6 +330,10 @@ void mmc_add_host_debugfs(struct mmc_host *host)
 			&mmc_clock_fops))
 		goto err_node;
 
+	if (!debugfs_create_file_unsafe("err_state", 0600, root, host,
+			&mmc_err_state))
+		goto err_node;
+
 	if (!debugfs_create_file("err_stats", 0600, root, host,
 			&mmc_err_stats_fops))
 		goto err_node;
-- 
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member 
of Code Aurora Forum, hosted by The Linux Foundation


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

* Re: [PATCH V7 0/4] mmc: add error statistics for eMMC and SD card
  2022-05-25 12:28 [PATCH V7 0/4] mmc: add error statistics for eMMC and SD card Shaik Sajida Bhanu
                   ` (3 preceding siblings ...)
  2022-05-25 12:28 ` [PATCH V7 4/4] mmc: debugfs: Add debug fs error state " Shaik Sajida Bhanu
@ 2022-05-27  9:45 ` Adrian Hunter
  2022-05-27 13:59   ` Sajida Bhanu (Temp)
  4 siblings, 1 reply; 7+ messages in thread
From: Adrian Hunter @ 2022-05-27  9:45 UTC (permalink / raw)
  To: Shaik Sajida Bhanu, ulf.hansson, agross, bjorn.andersson,
	p.zabel, chris, venkatg, gdjakov, quic_asutoshd
  Cc: linux-arm-msm, linux-mmc, linux-kernel, quic_rampraka,
	quic_pragalla, quic_sartgarg, quic_nitirawa, quic_sayalil

On 25/05/22 15:28, Shaik Sajida Bhanu wrote:
> Changes since V6:
> 	- Rebased on Ulf's(Ulf Hansson) next branch as suggested by
> 	  Adrain Hunter.

I think maybe you re-based on the "master" branch not the "next" branch, please check

> 	- Replaced debugfs_create_file() with debugfs_create_file_unsafe()
> 	  as suggested by Adrain Hunter.
> 	- "[V6,5/5] mmc: cqhci: Capture eMMC and SD card errors" not included
> 	  in this Patch series as we don't have cqhci changes on Ulf's(Ulf Hansson)
> 	  next branch.

cqhci is in the "next" branch, please check

> 
> Changes since V5:
> 	- Considered all error stats enums to set error state.
> 	- Added missed tuning error related code changes which was
> 	  missed in patch set V5 as Adrain Hunter pointed.
> 	- Replaced DEFINE_SIMPLE_ATTRIBUTE with DEFINE_DEBUGFS_ATTRIBUTE
> 	  as suggested by Adrain Hunter.
> 	  
> Changes since V4:
> 	- Defined new macro to increment err_stats members when error occurred
> 	  as suggested by Adrain Hunter.
> 	- Called err_stats members increment function after printing the error
> 	  as suggested by Adrain Hunter.
> 	- Considered INDEX and END_BIT errors same as CRC errors as suggested
> 	  by Adrain Hunter.
> 	- Removed Null check for host in debug fs functions and Reordered
> 	  err_stats declarationas suggested by Adrain Hunter.
> 	- Removed err_state variable stuff and updated err_state debug fs entry
> 	  based on the err_stats members state as suggested by Adrain Hunter.
> 
> Changes since V3:
> 	- Dropped error stats feature flag as suggested by Adrain Hunter.
> 	- Separated error state related changes in separate patches as
> 	  suggested by Adrain Hunter.
> 	  [PATCH V4 4/7] : error state debug fs
> 	  [PATCH V4 5/7] : error state enable function
> 	  [PATCH V4 6/7] : error state enable in error case
> 	- Note: we are enabling error state before calling sdhci_dumpregs
> 	  we couldn't add the err state in error stats array as err state
> 	  is not error type.
> 	- Corrected Signed-off-by order as suggested by Bjron Andersson.
> 	- Moved error state enable code from sdhci_dumpregs to error
> 	  conditions as suggested by Adrain Hunter
> 
> Changes since V2:
> 	- Removed userspace error stats clear debug fs entry as suggested
> 	  by Adrain Hunter.
> 	- Split patch into 4 patches
> 	  [PATCH V3 1/4] : sdhci driver
> 	  [PATCH V3 2/4] : debug fs entries
> 	  [PATCH V3 3/4] : core driver
> 	  [PATCH V3 4/4] : cqhci driver
> 	- Used for loop to print error messages instead of using printf
> 	  statements for all error messages as suggested by Adrain Hunter.
> 	- Introduced one flag to enable error stats feature, if any other
> 	  client wants to use this feature, they need to enable that flag.
> 	- Moved reset command timeout error statement to card init flow
> 	  as suggested by Adrain Hunter.
> 
> Changes since V1:
> 	- Removed sysfs entry for eMMC and SD card error statistics and added
> 	  debugfs entry as suggested by Adrian Hunter and Ulf Hansson.
> 
> Shaik Sajida Bhanu (4):
>   mmc: core: Capture eMMC and SD card errors
>   mmc: sdhci: Capture eMMC and SD card errors
>   mmc: debugfs: Add debug fs entry for mmc driver
>   mmc: debugfs: Add debug fs error state entry for mmc driver
> 
>  drivers/mmc/core/core.c    | 11 +++++--
>  drivers/mmc/core/debugfs.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++
>  drivers/mmc/host/sdhci.c   | 33 +++++++++++++++----
>  drivers/mmc/host/sdhci.h   |  3 ++
>  include/linux/mmc/host.h   | 26 +++++++++++++++
>  include/linux/mmc/mmc.h    |  6 ++++
>  6 files changed, 151 insertions(+), 9 deletions(-)
> 


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

* Re: [PATCH V7 0/4] mmc: add error statistics for eMMC and SD card
  2022-05-27  9:45 ` [PATCH V7 0/4] mmc: add error statistics for eMMC and SD card Adrian Hunter
@ 2022-05-27 13:59   ` Sajida Bhanu (Temp)
  0 siblings, 0 replies; 7+ messages in thread
From: Sajida Bhanu (Temp) @ 2022-05-27 13:59 UTC (permalink / raw)
  To: Adrian Hunter, ulf.hansson, agross, bjorn.andersson, p.zabel,
	chris, venkatg, gdjakov, quic_asutoshd
  Cc: linux-arm-msm, linux-mmc, linux-kernel, quic_rampraka,
	quic_pragalla, quic_sartgarg, quic_nitirawa, quic_sayalil


On 5/27/2022 3:15 PM, Adrian Hunter wrote:
> On 25/05/22 15:28, Shaik Sajida Bhanu wrote:
>> Changes since V6:
>> 	- Rebased on Ulf's(Ulf Hansson) next branch as suggested by
>> 	  Adrain Hunter.
> I think maybe you re-based on the "master" branch not the "next" branch, please check
Sure got it Thank you.. will re-base on next branch and post
>
>> 	- Replaced debugfs_create_file() with debugfs_create_file_unsafe()
>> 	  as suggested by Adrain Hunter.
>> 	- "[V6,5/5] mmc: cqhci: Capture eMMC and SD card errors" not included
>> 	  in this Patch series as we don't have cqhci changes on Ulf's(Ulf Hansson)
>> 	  next branch.
> cqhci is in the "next" branch, please check
Sure Thank you
>
>> Changes since V5:
>> 	- Considered all error stats enums to set error state.
>> 	- Added missed tuning error related code changes which was
>> 	  missed in patch set V5 as Adrain Hunter pointed.
>> 	- Replaced DEFINE_SIMPLE_ATTRIBUTE with DEFINE_DEBUGFS_ATTRIBUTE
>> 	  as suggested by Adrain Hunter.
>> 	
>> Changes since V4:
>> 	- Defined new macro to increment err_stats members when error occurred
>> 	  as suggested by Adrain Hunter.
>> 	- Called err_stats members increment function after printing the error
>> 	  as suggested by Adrain Hunter.
>> 	- Considered INDEX and END_BIT errors same as CRC errors as suggested
>> 	  by Adrain Hunter.
>> 	- Removed Null check for host in debug fs functions and Reordered
>> 	  err_stats declarationas suggested by Adrain Hunter.
>> 	- Removed err_state variable stuff and updated err_state debug fs entry
>> 	  based on the err_stats members state as suggested by Adrain Hunter.
>>
>> Changes since V3:
>> 	- Dropped error stats feature flag as suggested by Adrain Hunter.
>> 	- Separated error state related changes in separate patches as
>> 	  suggested by Adrain Hunter.
>> 	  [PATCH V4 4/7] : error state debug fs
>> 	  [PATCH V4 5/7] : error state enable function
>> 	  [PATCH V4 6/7] : error state enable in error case
>> 	- Note: we are enabling error state before calling sdhci_dumpregs
>> 	  we couldn't add the err state in error stats array as err state
>> 	  is not error type.
>> 	- Corrected Signed-off-by order as suggested by Bjron Andersson.
>> 	- Moved error state enable code from sdhci_dumpregs to error
>> 	  conditions as suggested by Adrain Hunter
>>
>> Changes since V2:
>> 	- Removed userspace error stats clear debug fs entry as suggested
>> 	  by Adrain Hunter.
>> 	- Split patch into 4 patches
>> 	  [PATCH V3 1/4] : sdhci driver
>> 	  [PATCH V3 2/4] : debug fs entries
>> 	  [PATCH V3 3/4] : core driver
>> 	  [PATCH V3 4/4] : cqhci driver
>> 	- Used for loop to print error messages instead of using printf
>> 	  statements for all error messages as suggested by Adrain Hunter.
>> 	- Introduced one flag to enable error stats feature, if any other
>> 	  client wants to use this feature, they need to enable that flag.
>> 	- Moved reset command timeout error statement to card init flow
>> 	  as suggested by Adrain Hunter.
>>
>> Changes since V1:
>> 	- Removed sysfs entry for eMMC and SD card error statistics and added
>> 	  debugfs entry as suggested by Adrian Hunter and Ulf Hansson.
>>
>> Shaik Sajida Bhanu (4):
>>    mmc: core: Capture eMMC and SD card errors
>>    mmc: sdhci: Capture eMMC and SD card errors
>>    mmc: debugfs: Add debug fs entry for mmc driver
>>    mmc: debugfs: Add debug fs error state entry for mmc driver
>>
>>   drivers/mmc/core/core.c    | 11 +++++--
>>   drivers/mmc/core/debugfs.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++
>>   drivers/mmc/host/sdhci.c   | 33 +++++++++++++++----
>>   drivers/mmc/host/sdhci.h   |  3 ++
>>   include/linux/mmc/host.h   | 26 +++++++++++++++
>>   include/linux/mmc/mmc.h    |  6 ++++
>>   6 files changed, 151 insertions(+), 9 deletions(-)
>>

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

end of thread, other threads:[~2022-05-27 13:59 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-25 12:28 [PATCH V7 0/4] mmc: add error statistics for eMMC and SD card Shaik Sajida Bhanu
2022-05-25 12:28 ` [PATCH V7 1/4] mmc: core: Capture eMMC and SD card errors Shaik Sajida Bhanu
2022-05-25 12:28 ` [PATCH V7 2/4] mmc: sdhci: " Shaik Sajida Bhanu
2022-05-25 12:28 ` [PATCH V7 3/4] mmc: debugfs: Add debug fs entry for mmc driver Shaik Sajida Bhanu
2022-05-25 12:28 ` [PATCH V7 4/4] mmc: debugfs: Add debug fs error state " Shaik Sajida Bhanu
2022-05-27  9:45 ` [PATCH V7 0/4] mmc: add error statistics for eMMC and SD card Adrian Hunter
2022-05-27 13:59   ` Sajida Bhanu (Temp)

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).