Message ID | 1426769047-14688-5-git-send-email-andrew_gabbasov@mentor.com |
---|---|
State | Accepted |
Delegated to: | Pantelis Antoniou |
Headers | show |
Hi Andrew, > On Mar 19, 2015, at 14:44 , Andrew Gabbasov <andrew_gabbasov@mentor.com> wrote: > > Some MMC cards come to ready state quite quickly, so that the respective > flag appears to be set in mmc_send_op_cond already. In this case trying > to continue polling the card with CMD1 in mmc_complete_op_cond is incorrect > and may lead to unpredictable results. So check the flag before polling > and skip it appropriately. > > Signed-off-by: Andrew Gabbasov <andrew_gabbasov@mentor.com> > --- > drivers/mmc/mmc.c | 20 +++++++++++--------- > 1 file changed, 11 insertions(+), 9 deletions(-) > > diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c > index d073d79..42af47c 100644 > --- a/drivers/mmc/mmc.c > +++ b/drivers/mmc/mmc.c > @@ -403,15 +403,17 @@ static int mmc_complete_op_cond(struct mmc *mmc) > int err; > > mmc->op_cond_pending = 0; > - start = get_timer(0); > - do { > - err = mmc_send_op_cond_iter(mmc, 1); > - if (err) > - return err; > - if (get_timer(start) > timeout) > - return UNUSABLE_ERR; > - udelay(100); > - } while (!(mmc->ocr & OCR_BUSY)); > + if (!(mmc->ocr & OCR_BUSY)) { > + start = get_timer(0); > + do { > + err = mmc_send_op_cond_iter(mmc, 1); > + if (err) > + return err; > + if (get_timer(start) > timeout) > + return UNUSABLE_ERR; > + udelay(100); > + } while (!(mmc->ocr & OCR_BUSY)); > + } > > if (mmc_host_is_spi(mmc)) { /* read OCR for spi */ > cmd.cmdidx = MMC_CMD_SPI_READ_OCR; > -- > 2.1.0 > Thanks, Applied. — Pantelis PS. Peng, I’m picking up this instead of your patch.
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index d073d79..42af47c 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -403,15 +403,17 @@ static int mmc_complete_op_cond(struct mmc *mmc) int err; mmc->op_cond_pending = 0; - start = get_timer(0); - do { - err = mmc_send_op_cond_iter(mmc, 1); - if (err) - return err; - if (get_timer(start) > timeout) - return UNUSABLE_ERR; - udelay(100); - } while (!(mmc->ocr & OCR_BUSY)); + if (!(mmc->ocr & OCR_BUSY)) { + start = get_timer(0); + do { + err = mmc_send_op_cond_iter(mmc, 1); + if (err) + return err; + if (get_timer(start) > timeout) + return UNUSABLE_ERR; + udelay(100); + } while (!(mmc->ocr & OCR_BUSY)); + } if (mmc_host_is_spi(mmc)) { /* read OCR for spi */ cmd.cmdidx = MMC_CMD_SPI_READ_OCR;
Some MMC cards come to ready state quite quickly, so that the respective flag appears to be set in mmc_send_op_cond already. In this case trying to continue polling the card with CMD1 in mmc_complete_op_cond is incorrect and may lead to unpredictable results. So check the flag before polling and skip it appropriately. Signed-off-by: Andrew Gabbasov <andrew_gabbasov@mentor.com> --- drivers/mmc/mmc.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-)