On Thu, 12 Mar 2020 at 15:25, Adrian Hunter <adrian.hunter@xxxxxxxxx> wrote: > > Add extra busy wait and retries if transfer mode switch fails. > > Signed-off-by: Adrian Hunter <adrian.hunter@xxxxxxxxx> > --- > drivers/mmc/core/mmc_ops.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/drivers/mmc/core/mmc_ops.c b/drivers/mmc/core/mmc_ops.c > index aa0cab190cd8..619088a94688 100644 > --- a/drivers/mmc/core/mmc_ops.c > +++ b/drivers/mmc/core/mmc_ops.c > @@ -599,6 +599,12 @@ int __mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value, > cmd.sanitize_busy = true; > > err = mmc_wait_for_cmd(host, &cmd, MMC_CMD_RETRIES); > + if (err && index == EXT_CSD_HS_TIMING) { > + /* Try harder for timing changes */ > + __mmc_poll_for_busy(card, timeout_ms, send_status, > + retry_crc_err, MMC_BUSY_CMD6); > + err = mmc_wait_for_cmd(host, &cmd, MMC_CMD_RETRIES); > + } Hmm, what do you think of moving this to the caller(s) of __mmc_switch() and in particular only at those places were we find it useful. Me personally, would prefer that option. To do that, we may need to have the possibility of specifying the number of retries that should be used in the mmc_wait_for_cmd() call to the caller can check the error code better. Moreover, it looks a bit risky to do the polling for all kinds of errors - shouldn't we do for CRC errors? > if (err) > goto out; > > -- > 2.17.1 > Kind regards Uffe