Message ID | 20231103084720.6886-4-adrian.hunter@intel.com |
---|---|
State | New |
Headers | show |
Series | mmc: block: Fixes for CQE error recovery recovery | expand |
> 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? Thanks, Avri > > Fixes: 72a5af554df8 ("mmc: core: Add support for handling CQE requests") > Cc: stable@vger.kernel.org > Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> > --- > 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
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@vger.kernel.org >> Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> >> --- >> 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 >
> > 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(). > > Fixes: 72a5af554df8 ("mmc: core: Add support for handling CQE requests") > Cc: stable@vger.kernel.org > Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Reviewed-by: Avri Altman <avri.altman@wdc.com> > --- > 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
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 */
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(). Fixes: 72a5af554df8 ("mmc: core: Add support for handling CQE requests") Cc: stable@vger.kernel.org Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> --- drivers/mmc/core/core.c | 2 ++ 1 file changed, 2 insertions(+)