linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v1] mmc: block: Disable CMDQ on the ioctl path
@ 2021-05-04 20:32 Bean Huo
  2021-05-05  4:41 ` Adrian Hunter
  2021-05-11 10:56 ` Ulf Hansson
  0 siblings, 2 replies; 3+ messages in thread
From: Bean Huo @ 2021-05-04 20:32 UTC (permalink / raw)
  To: ulf.hansson, adrian.hunter
  Cc: linux-mmc, linux-kernel, Bean Huo, Michael Brunner

From: Bean Huo <beanhuo@micron.com>

According to the eMMC Spec:
"When command queuing is enabled (CMDQ Mode En bit in CMDQ_MODE_EN
field is set to ‘1’) class 11 commands are the only method through
which data transfer tasks can be issued. Existing data transfer
commands, namely CMD18/CMD17 and CMD25/CMD24, are not supported when
command queuing is enabled."
which means if CMDQ is enabled, the FFU commands will not be supported.
To fix this issue, just simply disable CMDQ on the ioctl path, and
re-enable CMDQ once ioctl request is completed.

Tested-by: Michael Brunner <Michael.Brunner@kontron.com>
Signed-off-by: Bean Huo <beanhuo@micron.com>
---
 drivers/mmc/core/block.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
index 689eb9afeeed..21fb99883b1e 100644
--- a/drivers/mmc/core/block.c
+++ b/drivers/mmc/core/block.c
@@ -1004,6 +1004,11 @@ static void mmc_blk_issue_drv_op(struct mmc_queue *mq, struct request *req)
 
 	switch (mq_rq->drv_op) {
 	case MMC_DRV_OP_IOCTL:
+		if (card->ext_csd.cmdq_en) {
+			ret = mmc_cmdq_disable(card);
+			if (ret)
+				break;
+		}
 	case MMC_DRV_OP_IOCTL_RPMB:
 		idata = mq_rq->drv_op_data;
 		for (i = 0, ret = 0; i < mq_rq->ioc_count; i++) {
@@ -1014,6 +1019,8 @@ static void mmc_blk_issue_drv_op(struct mmc_queue *mq, struct request *req)
 		/* Always switch back to main area after RPMB access */
 		if (rpmb_ioctl)
 			mmc_blk_part_switch(card, 0);
+		else if (card->reenable_cmdq && !card->ext_csd.cmdq_en)
+			mmc_cmdq_enable(card);
 		break;
 	case MMC_DRV_OP_BOOT_WP:
 		ret = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BOOT_WP,
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v1] mmc: block: Disable CMDQ on the ioctl path
  2021-05-04 20:32 [PATCH v1] mmc: block: Disable CMDQ on the ioctl path Bean Huo
@ 2021-05-05  4:41 ` Adrian Hunter
  2021-05-11 10:56 ` Ulf Hansson
  1 sibling, 0 replies; 3+ messages in thread
From: Adrian Hunter @ 2021-05-05  4:41 UTC (permalink / raw)
  To: Bean Huo, ulf.hansson; +Cc: linux-mmc, linux-kernel, Bean Huo, Michael Brunner

On 4/05/21 11:32 pm, Bean Huo wrote:
> From: Bean Huo <beanhuo@micron.com>
> 
> According to the eMMC Spec:
> "When command queuing is enabled (CMDQ Mode En bit in CMDQ_MODE_EN
> field is set to ‘1’) class 11 commands are the only method through
> which data transfer tasks can be issued. Existing data transfer
> commands, namely CMD18/CMD17 and CMD25/CMD24, are not supported when
> command queuing is enabled."
> which means if CMDQ is enabled, the FFU commands will not be supported.
> To fix this issue, just simply disable CMDQ on the ioctl path, and
> re-enable CMDQ once ioctl request is completed.
> 
> Tested-by: Michael Brunner <Michael.Brunner@kontron.com>
> Signed-off-by: Bean Huo <beanhuo@micron.com>

Acked-by: Adrian Hunter <adrian.hunter@intel.com>

> ---
>  drivers/mmc/core/block.c | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
> index 689eb9afeeed..21fb99883b1e 100644
> --- a/drivers/mmc/core/block.c
> +++ b/drivers/mmc/core/block.c
> @@ -1004,6 +1004,11 @@ static void mmc_blk_issue_drv_op(struct mmc_queue *mq, struct request *req)
>  
>  	switch (mq_rq->drv_op) {
>  	case MMC_DRV_OP_IOCTL:
> +		if (card->ext_csd.cmdq_en) {
> +			ret = mmc_cmdq_disable(card);
> +			if (ret)
> +				break;
> +		}
>  	case MMC_DRV_OP_IOCTL_RPMB:
>  		idata = mq_rq->drv_op_data;
>  		for (i = 0, ret = 0; i < mq_rq->ioc_count; i++) {
> @@ -1014,6 +1019,8 @@ static void mmc_blk_issue_drv_op(struct mmc_queue *mq, struct request *req)
>  		/* Always switch back to main area after RPMB access */
>  		if (rpmb_ioctl)
>  			mmc_blk_part_switch(card, 0);
> +		else if (card->reenable_cmdq && !card->ext_csd.cmdq_en)
> +			mmc_cmdq_enable(card);
>  		break;
>  	case MMC_DRV_OP_BOOT_WP:
>  		ret = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BOOT_WP,
> 


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v1] mmc: block: Disable CMDQ on the ioctl path
  2021-05-04 20:32 [PATCH v1] mmc: block: Disable CMDQ on the ioctl path Bean Huo
  2021-05-05  4:41 ` Adrian Hunter
@ 2021-05-11 10:56 ` Ulf Hansson
  1 sibling, 0 replies; 3+ messages in thread
From: Ulf Hansson @ 2021-05-11 10:56 UTC (permalink / raw)
  To: Bean Huo
  Cc: Adrian Hunter, linux-mmc, Linux Kernel Mailing List, Bean Huo,
	Michael Brunner

On Tue, 4 May 2021 at 22:32, Bean Huo <huobean@gmail.com> wrote:
>
> From: Bean Huo <beanhuo@micron.com>
>
> According to the eMMC Spec:
> "When command queuing is enabled (CMDQ Mode En bit in CMDQ_MODE_EN
> field is set to ‘1’) class 11 commands are the only method through
> which data transfer tasks can be issued. Existing data transfer
> commands, namely CMD18/CMD17 and CMD25/CMD24, are not supported when
> command queuing is enabled."
> which means if CMDQ is enabled, the FFU commands will not be supported.
> To fix this issue, just simply disable CMDQ on the ioctl path, and
> re-enable CMDQ once ioctl request is completed.
>
> Tested-by: Michael Brunner <Michael.Brunner@kontron.com>
> Signed-off-by: Bean Huo <beanhuo@micron.com>

Applied for next and by adding a fixes/stable tag, thanks!

Kind regards
Uffe

> ---
>  drivers/mmc/core/block.c | 7 +++++++
>  1 file changed, 7 insertions(+)
>
> diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
> index 689eb9afeeed..21fb99883b1e 100644
> --- a/drivers/mmc/core/block.c
> +++ b/drivers/mmc/core/block.c
> @@ -1004,6 +1004,11 @@ static void mmc_blk_issue_drv_op(struct mmc_queue *mq, struct request *req)
>
>         switch (mq_rq->drv_op) {
>         case MMC_DRV_OP_IOCTL:
> +               if (card->ext_csd.cmdq_en) {
> +                       ret = mmc_cmdq_disable(card);
> +                       if (ret)
> +                               break;
> +               }

This should have a "fallthrough;" statement. No need for a respin, I
have amended the change this time.

>         case MMC_DRV_OP_IOCTL_RPMB:
>                 idata = mq_rq->drv_op_data;
>                 for (i = 0, ret = 0; i < mq_rq->ioc_count; i++) {
> @@ -1014,6 +1019,8 @@ static void mmc_blk_issue_drv_op(struct mmc_queue *mq, struct request *req)
>                 /* Always switch back to main area after RPMB access */
>                 if (rpmb_ioctl)
>                         mmc_blk_part_switch(card, 0);
> +               else if (card->reenable_cmdq && !card->ext_csd.cmdq_en)
> +                       mmc_cmdq_enable(card);
>                 break;
>         case MMC_DRV_OP_BOOT_WP:
>                 ret = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BOOT_WP,
> --
> 2.25.1
>

Kind regards
Uffe

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-05-11 10:57 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-04 20:32 [PATCH v1] mmc: block: Disable CMDQ on the ioctl path Bean Huo
2021-05-05  4:41 ` Adrian Hunter
2021-05-11 10:56 ` Ulf Hansson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).