summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaya Erez <merez@codeaurora.org>2015-09-21 14:43:38 +0300
committerSubhash Jadavani <subhashj@codeaurora.org>2016-05-31 15:27:31 -0700
commita93e005ce59486720ff0ee503fe2d93f96ddeda9 (patch)
treeb67ee383372d72df5c2626b9a5dc4c8e0c1d79e3
parent21a32a7af8ca151dff4f3710742864705a5a7e7d (diff)
mmc: card: stop BKOPS in mmc_blk_cmdq_issue_rq
In case there are no pending requests, runtime idle API can be invoked and start manual BKOPS. We need to check if manual BKOPS is enabled on the device and stop it before serving new incoming requests in CQ mode. Change-Id: I870eff40ea9fa91eedb4c0d2600c32d8534a3868 Signed-off-by: Maya Erez <merez@codeaurora.org>
-rw-r--r--drivers/mmc/card/block.c29
1 files changed, 24 insertions, 5 deletions
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
index 7224f4c57421..e15684473c45 100644
--- a/drivers/mmc/card/block.c
+++ b/drivers/mmc/card/block.c
@@ -3431,14 +3431,27 @@ static int mmc_blk_cmdq_issue_rq(struct mmc_queue *mq, struct request *req)
unsigned int cmd_flags = req ? req->cmd_flags : 0;
mmc_get_card(card);
+
+ if (!card->host->cmdq_ctx.active_reqs && mmc_card_doing_bkops(card)) {
+ ret = mmc_cmdq_halt(card->host, true);
+ if (ret)
+ goto out;
+ ret = mmc_stop_bkops(card);
+ if (ret) {
+ pr_err("%s: %s: mmc_stop_bkops failed %d\n",
+ md->disk->disk_name, __func__, ret);
+ goto out;
+ }
+ ret = mmc_cmdq_halt(card->host, false);
+ if (ret)
+ goto out;
+ }
+
ret = mmc_blk_cmdq_part_switch(card, md);
if (ret) {
pr_err("%s: %s: partition switch failed %d\n",
md->disk->disk_name, __func__, ret);
- if (req)
- blk_end_request_all(req, ret);
- mmc_put_card(card);
- goto switch_failure;
+ goto out;
}
if (req) {
@@ -3455,7 +3468,13 @@ static int mmc_blk_cmdq_issue_rq(struct mmc_queue *mq, struct request *req)
}
}
-switch_failure:
+ return ret;
+
+out:
+ if (req)
+ blk_end_request_all(req, ret);
+ mmc_put_card(card);
+
return ret;
}