RE: [PATCH v2] mmc: retry CMD1 in mmc_send_op_cond() until the eMMC is ready

2020-06-15 Thread Peng Fan
> Subject: [PATCH v2] mmc: retry CMD1 in mmc_send_op_cond() until the
> eMMC is ready
> 
> From: Haibo Chen 
> 
> According to eMMC specification v5.1 section 6.4.3, we should issue
> CMD1 repeatedly in the idle state until the eMMC is ready even if
> mmc_send_op_cond() send CMD1 with argument = 0. Otherwise some
> eMMC devices seems to enter the inactive mode after
> mmc_complete_op_cond() issued CMD0 when the eMMC device is busy.
> 
> Signed-off-by: Haibo Chen 
> ---
>  drivers/mmc/mmc.c | 9 -
>  1 file changed, 8 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index
> 85762b82e0..475f75fc64 100644
> --- a/drivers/mmc/mmc.c
> +++ b/drivers/mmc/mmc.c
> @@ -662,12 +662,15 @@ static int mmc_send_op_cond_iter(struct mmc
> *mmc, int use_arg)  static int mmc_send_op_cond(struct mmc *mmc)  {
>   int err, i;
> + int timeout = 1000;
> + uint start;
> 
>   /* Some cards seem to need this */
>   mmc_go_idle(mmc);
> 
> + start = get_timer(0);
>   /* Asking to the card its capabilities */
> - for (i = 0; i < 2; i++) {
> + for (i = 0; ; i++) {
>   err = mmc_send_op_cond_iter(mmc, i != 0);
>   if (err)
>   return err;
> @@ -675,6 +678,10 @@ static int mmc_send_op_cond(struct mmc *mmc)
>   /* exit if not busy (flag seems to be inverted) */
>   if (mmc->ocr & OCR_BUSY)
>   break;
> +
> + if (get_timer(start) > timeout)
> + return -ETIMEDOUT;
> + udelay(100);

The Linux code use 10ms delay, but it should be fine here.

Reviewed-by: Peng Fan 

>   }
>   mmc->op_cond_pending = 1;
>   return 0;
> --
> 2.17.1



[PATCH v2] mmc: retry CMD1 in mmc_send_op_cond() until the eMMC is ready

2020-06-15 Thread haibo . chen
From: Haibo Chen 

According to eMMC specification v5.1 section 6.4.3, we should issue
CMD1 repeatedly in the idle state until the eMMC is ready even if
mmc_send_op_cond() send CMD1 with argument = 0. Otherwise some eMMC
devices seems to enter the inactive mode after mmc_complete_op_cond()
issued CMD0 when the eMMC device is busy.

Signed-off-by: Haibo Chen 
---
 drivers/mmc/mmc.c | 9 -
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index 85762b82e0..475f75fc64 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -662,12 +662,15 @@ static int mmc_send_op_cond_iter(struct mmc *mmc, int 
use_arg)
 static int mmc_send_op_cond(struct mmc *mmc)
 {
int err, i;
+   int timeout = 1000;
+   uint start;
 
/* Some cards seem to need this */
mmc_go_idle(mmc);
 
+   start = get_timer(0);
/* Asking to the card its capabilities */
-   for (i = 0; i < 2; i++) {
+   for (i = 0; ; i++) {
err = mmc_send_op_cond_iter(mmc, i != 0);
if (err)
return err;
@@ -675,6 +678,10 @@ static int mmc_send_op_cond(struct mmc *mmc)
/* exit if not busy (flag seems to be inverted) */
if (mmc->ocr & OCR_BUSY)
break;
+
+   if (get_timer(start) > timeout)
+   return -ETIMEDOUT;
+   udelay(100);
}
mmc->op_cond_pending = 1;
return 0;
-- 
2.17.1