summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Dorfman <kdorfman@codeaurora.org>2015-06-30 17:39:43 +0300
committerSubhash Jadavani <subhashj@codeaurora.org>2016-05-31 15:26:54 -0700
commit396e0ff6eb9c516e4d2986c4f9adae7aa3f785e5 (patch)
tree75a161df740d24ce6e546f17af7f5168d03b881a
parentea5bb4771101d383306e408ba36ce745cf091e94 (diff)
mmc: block: fix dump cmdq registers on request timeout
Timeout handler executed on softirq context. cmdq dumpstate() api resumes platform device and it can't be executed on softirq context. Request completion callback schedules error handler work in case of timeout error. This change moves CQE registers dump to the error handler callback. Change-Id: Iea26ca5240f6031218dcf374cafcf2708df1f125 Signed-off-by: Konstantin Dorfman <kdorfman@codeaurora.org>
-rw-r--r--drivers/mmc/card/block.c5
-rw-r--r--drivers/mmc/core/core.c3
2 files changed, 7 insertions, 1 deletions
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
index 1e982e0349bc..0ed7d4024fac 100644
--- a/drivers/mmc/card/block.c
+++ b/drivers/mmc/card/block.c
@@ -2972,7 +2972,6 @@ static enum blk_eh_timer_return mmc_blk_cmdq_req_timed_out(struct request *req)
struct mmc_request *mrq = &mq_rq->cmdq_req.mrq;
struct mmc_cmdq_req *cmdq_req = &mq_rq->cmdq_req;
- host->cmdq_ops->dumpstate(host);
if (cmdq_req->cmdq_req_flags & DCMD)
mrq->cmd->error = -ETIMEDOUT;
else
@@ -2997,6 +2996,10 @@ static void mmc_blk_cmdq_err(struct mmc_queue *mq)
struct mmc_cmdq_context_info *ctx_info = &host->cmdq_ctx;
pm_runtime_get_sync(&card->dev);
+ mmc_host_clk_hold(host);
+ host->cmdq_ops->dumpstate(host);
+ mmc_host_clk_release(host);
+
err = mmc_cmdq_halt(host, true);
if (err) {
pr_err("halt: failed: %d\n", err);
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index 57961a498a1d..a55facf12e1f 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -1547,6 +1547,9 @@ int mmc_cmdq_wait_for_dcmd(struct mmc_host *host,
mmc_hostname(host), cmd->opcode,
cmd->error);
err = cmd->error;
+ mmc_host_clk_hold(host);
+ host->cmdq_ops->dumpstate(host);
+ mmc_host_clk_release(host);
}
return err;
}