Commit e5249ead authored by Vignesh R's avatar Vignesh R Committed by Jason Liu

mmc: Retry some MMC cmds on failure

With certain SD cards like Kingston 8GB/16GB UHS card, it is seen that
MMC_CMD_ALL_SEND_CID cmd fails on first attempt, but succeeds
subsequently. Therefore, retry MMC_CMD_ALL_SEND_CID cmd at least thrice
as done in Linux kernel.
Similarly, it is seen that MMC_CMD_SET_BLOCKLEN may fail on first
attempt, therefore retry this cmd five times as done in kernel.
Signed-off-by: default avatarVignesh R <>
Signed-off-by: default avatarKishon Vijay Abraham I <>
Signed-off-by: default avatarJean-Jacques Hiblot <>
Reviewed-by: default avatarSimon Glass <>
parent 72be45ef
......@@ -275,6 +275,8 @@ int mmc_send_status(struct mmc *mmc, int timeout)
int mmc_set_blocklen(struct mmc *mmc, int len)
struct mmc_cmd cmd;
int retries = 5;
int err;
if (mmc->ddr_mode)
return 0;
......@@ -282,8 +284,13 @@ int mmc_set_blocklen(struct mmc *mmc, int len)
cmd.cmdidx = MMC_CMD_SET_BLOCKLEN;
cmd.resp_type = MMC_RSP_R1;
cmd.cmdarg = len;
do {
err = mmc_send_cmd(mmc, &cmd, NULL);
if (!err)
} while (retries--);
return mmc_send_cmd(mmc, &cmd, NULL);
return err;
static int mmc_read_blocks(struct mmc *mmc, void *dst, lbaint_t start,
......@@ -1867,6 +1874,7 @@ static int mmc_startup(struct mmc *mmc)
u64 cmult, csize;
struct mmc_cmd cmd;
struct blk_desc *bdesc;
int retries = 3;
if (mmc_host_is_spi(mmc)) { /* enable CRC check for spi */
......@@ -1874,7 +1882,6 @@ static int mmc_startup(struct mmc *mmc)
cmd.resp_type = MMC_RSP_R1;
cmd.cmdarg = 1;
err = mmc_send_cmd(mmc, &cmd, NULL);
if (err)
return err;
......@@ -1886,7 +1893,9 @@ static int mmc_startup(struct mmc *mmc)
cmd.resp_type = MMC_RSP_R2;
cmd.cmdarg = 0;
err = mmc_send_cmd(mmc, &cmd, NULL);
do {
err = mmc_send_cmd(mmc, &cmd, NULL);
} while (err && retries-- > 0);
if (err)
return err;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment