From d4a088792f76c27b7d4448afe02bf965f89a30f2 Mon Sep 17 00:00:00 2001 From: Veerabhadrarao Badiganti Date: Mon, 16 Apr 2018 20:53:33 +0530 Subject: [PATCH] mmc: card: Update multi_cmd_ioctl path to support cmdq Halt cmdq in multi_cmd_ioctl path before processing IOCTL commands and un-halt it once it has done with IOCTL processing. Without this change, the mmc driver would try to process legacy commands when host & card are in cmdq mode which may result in unexpected interrupt / illegal command errors. Change-Id: I254a1a752f770ffd03331c4856aa9f54867092dc Signed-off-by: Veerabhadrarao Badiganti --- drivers/mmc/card/block.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 35be47dafda2..13e0df67d3b7 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -1301,9 +1301,26 @@ static int mmc_blk_ioctl_multi_cmd(struct block_device *bdev, mmc_get_card(card); + if (mmc_card_cmdq(card)) { + err = mmc_cmdq_halt(card->host, true); + if (err) { + pr_err("%s: halt failed while doing %s err (%d)\n", + mmc_hostname(card->host), + __func__, err); + mmc_put_card(card); + goto cmd_done; + } + } + for (i = 0; i < num_of_cmds && !ioc_err; i++) ioc_err = __mmc_blk_ioctl_cmd(card, md, idata[i]); + if (mmc_card_cmdq(card)) { + if (mmc_cmdq_halt(card->host, false)) + pr_err("%s: %s: cmdq unhalt failed\n", + mmc_hostname(card->host), __func__); + } + mmc_put_card(card); /* copy to user if data and response */