From mboxrd@z Thu Jan 1 00:00:00 1970 From: Troy Kisky Date: Fri, 20 Mar 2015 11:38:50 -0700 Subject: [U-Boot] [PATCH 4/6] mmc: Continue polling MMC card for OCR only if it is still not ready In-Reply-To: References: <1426769047-14688-1-git-send-email-andrew_gabbasov@mentor.com> <1426769047-14688-5-git-send-email-andrew_gabbasov@mentor.com> Message-ID: <550C693A.90501@boundarydevices.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On 3/19/2015 6:51 PM, Peng.Fan at freescale.com wrote: > Hi, Andrew > > There is already a patch to fix this issue. > Patchwork: https://patchwork.ozlabs.org/patch/451775/ > > Regards, > Peng. > > -----Original Message----- > From: U-Boot [mailto:u-boot-bounces at lists.denx.de] On Behalf Of Andrew Gabbasov > Sent: Thursday, March 19, 2015 8:44 PM > To: u-boot at lists.denx.de > Subject: [U-Boot] [PATCH 4/6] mmc: Continue polling MMC card for OCR only if it is still not ready > > 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 > --- > 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; > -- Here's another patch that solves the problem a little earlier. It has this disadvantage of being slightly bigger, though it makes the code look better. https://github.com/boundarydevices/u-boot-imx6/commit/c0260ca I'll ack any version as they all seem to solve the problem. Troy