Hi Yanir,

On Sun, Jan 11, 2026 at 08:21:13AM +0000, Yanir Levin wrote:
>In sd_get_capabilities an ACMD is sent (SD_CMD_APP_SEND_SCR),
>which requires sending APP_CMD (MMC_CMD_APP_CMD) before.
>
>Currently, the ACMD is retried on error, however APP_CMD isn't.
>In this case, when the ACMD fails and it is tried again,
>the retry attempts will not be handled as ACMD, which is wrong.
>
>The fix performs the retry attempts on the sequence of
>APP_CMD and the ACMD together.

Did you meet any issues, or is this just code inspection?

Thanks,
Peng

>
>Signed-off-by: Yanir Levin <[email protected]>
>Reviewed-by: Eran Moshe <[email protected]>
>---
> drivers/mmc/mmc.c | 41 ++++++++++++++++++++++-------------------
> 1 file changed, 22 insertions(+), 19 deletions(-)
>
>diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
>index bf82c515600..c1146ab3648 100644
>--- a/drivers/mmc/mmc.c
>+++ b/drivers/mmc/mmc.c
>@@ -1389,25 +1389,28 @@ static int sd_get_capabilities(struct mmc *mmc)
>                return 0;
>
>        /* Read the SCR to find out if this card supports higher speeds */
>-       cmd.cmdidx = MMC_CMD_APP_CMD;
>-       cmd.resp_type = MMC_RSP_R1;
>-       cmd.cmdarg = mmc->rca << 16;
>-
>-       err = mmc_send_cmd(mmc, &cmd, NULL);
>-
>-       if (err)
>-               return err;
>-
>-       cmd.cmdidx = SD_CMD_APP_SEND_SCR;
>-       cmd.resp_type = MMC_RSP_R1;
>-       cmd.cmdarg = 0;
>-
>-       data.dest = (char *)scr;
>-       data.blocksize = 8;
>-       data.blocks = 1;
>-       data.flags = MMC_DATA_READ;
>-
>-       err = mmc_send_cmd_retry(mmc, &cmd, &data, 3);
>+       uint retries = 3;
>+       do {
>+               cmd.cmdidx = MMC_CMD_APP_CMD;
>+               cmd.resp_type = MMC_RSP_R1;
>+               cmd.cmdarg = mmc->rca << 16;
>+
>+               err = mmc_send_cmd(mmc, &cmd, NULL);
>+
>+               if (err)
>+                       continue;
>+
>+               cmd.cmdidx = SD_CMD_APP_SEND_SCR;
>+               cmd.resp_type = MMC_RSP_R1;
>+               cmd.cmdarg = 0;
>+
>+               data.dest = (char *)scr;
>+               data.blocksize = 8;
>+               data.blocks = 1;
>+               data.flags = MMC_DATA_READ;
>+
>+               err = mmc_send_cmd(mmc, &cmd, &data);
>+       } while (err && retries--);
>
>        if (err)
>                return err;
>--
>2.43.0
>
>

Reply via email to