On 12 May 2017 at 12:16, Jean-Jacques Hiblot <[email protected]> wrote: > From: Vignesh R <[email protected]> > > 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: Vignesh R <[email protected]> > Signed-off-by: Kishon Vijay Abraham I <[email protected]> > Signed-off-by: Jean-Jacques Hiblot <[email protected]> > --- > drivers/mmc/mmc.c | 15 ++++++++++++--- > 1 file changed, 12 insertions(+), 3 deletions(-) >
So sad to see this sort of thing. Can we enable this via a quirk and a Kconfig? Could default to on, but I'm not sure we want this code in regardless. Reviewed-by: Simon Glass <[email protected]> > diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c > index c7dda64..49edf52 100644 > --- a/drivers/mmc/mmc.c > +++ b/drivers/mmc/mmc.c > @@ -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) > + break; > + } 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; > > #ifdef CONFIG_MMC_SPI_CRC_ON > 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; > -- > 1.9.1 > _______________________________________________ U-Boot mailing list [email protected] https://lists.denx.de/listinfo/u-boot

