From 15c8f04a4661655e05fbc4a37b30b4a6e2e4f4a8 Mon Sep 17 00:00:00 2001 From: Sahitya Tummala Date: Wed, 30 Nov 2016 09:00:53 +0530 Subject: [PATCH] mmc: block: Fix issue with deferred resume when CQ is enabled In CQ mode, the legacy commands will be sent after CQ is put in halt state. But when deferred resume is enabled, the resume happens in mmc_wait_for_req(), which will enable CQ again overiding the caller's state. This causes legacy commands to fail. Fix this by moving the deferred resume from all the places to mmc_get_card() which is always the first step done in both CQ/legacy commands and thus avoids the above issue scneario. Change-Id: I432e89f3221615dd644412f481d17f840c75e407 Signed-off-by: Sahitya Tummala --- drivers/mmc/card/block.c | 4 ---- drivers/mmc/core/core.c | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 39cb46a5ce11..98043df3c217 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -3849,10 +3849,6 @@ static int mmc_blk_cmdq_issue_rq(struct mmc_queue *mq, struct request *req) mmc_get_card(card); -#ifdef CONFIG_MMC_BLOCK_DEFERRED_RESUME - if (mmc_bus_needs_resume(card->host)) - mmc_resume_bus(card->host); -#endif if (!card->host->cmdq_ctx.active_reqs && mmc_card_doing_bkops(card)) { ret = mmc_cmdq_halt(card->host, true); if (ret) diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 6ad91042409e..caf76173ccf9 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -2128,6 +2128,10 @@ void mmc_get_card(struct mmc_card *card) { pm_runtime_get_sync(&card->dev); mmc_claim_host(card->host); +#ifdef CONFIG_MMC_BLOCK_DEFERRED_RESUME + if (mmc_bus_needs_resume(card->host)) + mmc_resume_bus(card->host); +#endif } EXPORT_SYMBOL(mmc_get_card);