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
Add changes to capture eMMC and SD card errors.
This is useful for debug and testing.
Signed-off-by: Liangliang Lu <[email protected]>
Signed-off-by: Sayali Lokhande <[email protected]>
Signed-off-by: Bao D. Nguyen <[email protected]>
Signed-off-by: Shaik Sajida Bhanu <[email protected]>
Acked-by: Adrian Hunter <[email protected]>
---
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
Add changes to capture eMMC and SD card errors.
This is useful for debug and testing.
Signed-off-by: Liangliang Lu <[email protected]>
Signed-off-by: Sayali Lokhande <[email protected]>
Signed-off-by: Bao D. Nguyen <[email protected]>
Signed-off-by: Ram Prakash Gupta <[email protected]>
Signed-off-by: Shaik Sajida Bhanu <[email protected]>
Acked-by: Adrian Hunter <[email protected]>
---
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
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 <[email protected]>
Signed-off-by: Sayali Lokhande <[email protected]>
Signed-off-by: Bao D. Nguyen <[email protected]>
Signed-off-by: Shaik Sajida Bhanu <[email protected]>
Acked-by: Adrian Hunter <[email protected]>
---
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
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(-)
>
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(-)
>>