summaryrefslogtreecommitdiff
path: root/drivers/mmc
diff options
context:
space:
mode:
authorSahitya Tummala <stummala@codeaurora.org>2015-05-20 12:15:35 +0530
committerSubhash Jadavani <subhashj@codeaurora.org>2016-05-31 15:26:38 -0700
commitb8fc176b8136c764e5e6e7cac798cf932f25a3ce (patch)
tree198f6ed0e3d6fe217a9e244e28045131a2400211 /drivers/mmc
parent10fc703640d923a86b56b8703dbf6862b9acfd35 (diff)
mmc: block: support RPMB with CMDQ framework
CMDQ is not supported for RPMB partition. Hence, for RPMB requests the controller is kept in HALT state and then CMDQ is disabled in the card. Change-Id: I1242841d5fa063b542e35dcff95694ef5e88737a Signed-off-by: Sahitya Tummala <stummala@codeaurora.org>
Diffstat (limited to 'drivers/mmc')
-rw-r--r--drivers/mmc/card/block.c12
-rw-r--r--drivers/mmc/card/queue.c2
2 files changed, 13 insertions, 1 deletions
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
index cbf798babe5c..5e29a8df8f3a 100644
--- a/drivers/mmc/card/block.c
+++ b/drivers/mmc/card/block.c
@@ -1046,6 +1046,8 @@ static int mmc_blk_cmdq_switch(struct mmc_card *card,
{
int ret = 0;
bool cmdq_mode = !!mmc_card_cmdq(card);
+ struct mmc_host *host = card->host;
+ struct mmc_cmdq_context_info *ctx = &host->cmdq_ctx;
if (!(card->host->caps2 & MMC_CAP2_CMD_QUEUE) ||
!card->ext_csd.cmdq_support ||
@@ -1060,6 +1062,16 @@ static int mmc_blk_cmdq_switch(struct mmc_card *card,
__func__, ret, MMC_CARD_CMDQ_BLK_SIZE);
goto out;
}
+
+ } else {
+ if (!test_bit(CMDQ_STATE_HALT, &ctx->curr_state)) {
+ ret = mmc_cmdq_halt(host, true);
+ if (ret) {
+ pr_err("%s: halt: failed: %d\n",
+ mmc_hostname(host), ret);
+ goto out;
+ }
+ }
}
ret = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
diff --git a/drivers/mmc/card/queue.c b/drivers/mmc/card/queue.c
index 98afbee58302..e99b1cf16f94 100644
--- a/drivers/mmc/card/queue.c
+++ b/drivers/mmc/card/queue.c
@@ -62,7 +62,7 @@ static inline bool mmc_cmdq_should_pull_reqs(struct mmc_host *host,
{
if (((req->cmd_flags & (REQ_FLUSH | REQ_DISCARD)) &&
test_bit(CMDQ_STATE_DCMD_ACTIVE, &ctx->curr_state)) ||
- mmc_host_halt(host) ||
+ (!host->card->part_curr && mmc_host_halt(host)) ||
test_bit(CMDQ_STATE_ERR, &ctx->curr_state)) {
pr_debug("%s: %s: skip pulling reqs: state: %lu\n",
mmc_hostname(host), __func__, ctx->curr_state);