OSDN Git Service

mmc: block: send CMD13 when a response error detected in CQ mode
authorSahitya Tummala <stummala@codeaurora.org>
Tue, 26 Apr 2016 06:48:35 +0000 (12:18 +0530)
committerGerrit - the friendly Code Review server <code-review@localhost>
Thu, 10 Nov 2016 05:21:40 +0000 (21:21 -0800)
When CQE detects a RED error (response error) from the device,
it triggers a RED interrupt. The SW driver as part of the RED
IRQ handling, puts the CQ in either halt or disabled state
before scheduling the error work. Hence, send the status CMD13
in legacy mode to decode the RED error for further debugging.

Change-Id: I90d17cbc73783b88bbafbdf7048c8a26eb8434bc
Signed-off-by: Sahitya Tummala <stummala@codeaurora.org>
Signed-off-by: Sayali Lokhande <sayalil@codeaurora.org>
drivers/mmc/card/block.c

index 6eee4aa..39cb46a 100644 (file)
@@ -3456,7 +3456,8 @@ static void mmc_blk_cmdq_err(struct mmc_queue *mq)
        struct mmc_request *mrq = host->err_mrq;
        struct mmc_cmdq_context_info *ctx_info = &host->cmdq_ctx;
        struct request_queue *q;
-       int err;
+       int err, ret;
+       u32 status = 0;
 
        mmc_host_clk_hold(host);
        host->cmdq_ops->dumpstate(host);
@@ -3475,8 +3476,14 @@ static void mmc_blk_cmdq_err(struct mmc_queue *mq)
        /* RED error - Fatal: requires reset */
        if (mrq->cmdq_req->resp_err) {
                err = mrq->cmdq_req->resp_err;
-               pr_crit("%s: Response error detected: Device in bad state\n",
-                       mmc_hostname(host));
+               if (mmc_host_halt(host) || mmc_host_cq_disable(host)) {
+                       ret = get_card_status(host->card, &status, 0);
+                       if (ret)
+                               pr_err("%s: CMD13 failed with err %d\n",
+                                               mmc_hostname(host), ret);
+               }
+               pr_err("%s: Response error detected with device status 0x%08x\n",
+                       mmc_hostname(host), status);
                goto reset;
        }