summaryrefslogtreecommitdiff
path: root/drivers/mmc/card
diff options
context:
space:
mode:
authorPradeep P V K <ppvk@codeaurora.org>2018-04-19 14:42:44 +0530
committerGerrit - the friendly Code Review server <code-review@localhost>2018-05-02 00:04:40 -0700
commit4c4c2ded216a7d1e9280b2faa52b2027c555a311 (patch)
tree121b5e931a8e3787ae9fd0443b82a6b25cca71b2 /drivers/mmc/card
parent2223ffa69b6f32b7018a7f155e4e1bc03f7da373 (diff)
mmc: card: WARN_ON in cmdq completion context
Due to command queuing, there is a possibility of servicing completion of multiple requests from hw irq context. So in this case, hw irq will launch softirq for all requests which were completed (irrespective of whether it was success or failure). If one of the requests failed, then the softirq corresponding to error ed request will set current cmdq state to CMDQ_STATE_ERR. Because of this, subsequent completion softirqs for successful requests will BUG_ON. We should let higher layers know of completion of successful requests. Hence change the BUG_ON to WARN_ON and skip blk_end_request() only if the corresponding request has an error (instead of checking if the cmdq state is in error) Change-Id: Ieb7f9d12ba04b6ab6499bf29f3716b0ddfb880fb Signed-off-by: Pradeep P V K <ppvk@codeaurora.org>
Diffstat (limited to 'drivers/mmc/card')
-rw-r--r--drivers/mmc/card/block.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
index de7def1f4f1c..35be47dafda2 100644
--- a/drivers/mmc/card/block.c
+++ b/drivers/mmc/card/block.c
@@ -3614,7 +3614,7 @@ void mmc_blk_cmdq_complete_rq(struct request *rq)
* or disable state so cannot receive any completion of
* other requests.
*/
- BUG_ON(test_bit(CMDQ_STATE_ERR, &ctx_info->curr_state));
+ WARN_ON(test_bit(CMDQ_STATE_ERR, &ctx_info->curr_state));
/* clear pending request */
BUG_ON(!test_and_clear_bit(cmdq_req->tag,
@@ -3648,7 +3648,7 @@ void mmc_blk_cmdq_complete_rq(struct request *rq)
out:
mmc_cmdq_clk_scaling_stop_busy(host, true, is_dcmd);
- if (!test_bit(CMDQ_STATE_ERR, &ctx_info->curr_state)) {
+ if (!(err || cmdq_req->resp_err)) {
mmc_host_clk_release(host);
wake_up(&ctx_info->wait);
mmc_put_card(host->card);