On 3/11/23 12:48, Avri Altman wrote: >> STOP command does not guarantee to wait while busy, but subsequent >> command MMC_CMDQ_TASK_MGMT to discard the queue will fail if the >> card is busy, so be sure to wait by employing mmc_poll_for_busy(). > Doesn't the Task Discard Sequence expects you to check CQDPT[i]==1 > before sending MMC_CMDQ_TASK_MGMT to discard task id i? We do not clear individual tasks. Instead the MMC_CMDQ_TASK_MGMT is sent with the op-code to "discard entire queue", which will also work even if the queue is empty. Refer JESD84-B51A, 6.6.39.6 CMDQ_TASK_MGMT and Table 43 — Task Management op-codes. > > Thanks, > Avri > >> >> Fixes: 72a5af554df8 ("mmc: core: Add support for handling CQE requests") >> Cc: stable@xxxxxxxxxxxxxxx >> Signed-off-by: Adrian Hunter <adrian.hunter@xxxxxxxxx> >> --- >> drivers/mmc/core/core.c | 2 ++ >> 1 file changed, 2 insertions(+) >> >> diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index >> 3d3e0ca52614..befde2bd26d3 100644 >> --- a/drivers/mmc/core/core.c >> +++ b/drivers/mmc/core/core.c >> @@ -553,6 +553,8 @@ int mmc_cqe_recovery(struct mmc_host *host) >> cmd.busy_timeout = MMC_CQE_RECOVERY_TIMEOUT; >> mmc_wait_for_cmd(host, &cmd, 0); >> >> + mmc_poll_for_busy(host->card, MMC_CQE_RECOVERY_TIMEOUT, >> true, >> + MMC_BUSY_IO); >> + >> memset(&cmd, 0, sizeof(cmd)); >> cmd.opcode = MMC_CMDQ_TASK_MGMT; >> cmd.arg = 1; /* Discard entire queue */ >> -- >> 2.34.1 >