Hi Andrew,

> On Mar 19, 2015, at 14:44 , Andrew Gabbasov <andrew_gabba...@mentor.com> 
> wrote:
> 
> The polling loops in sd_send_op_cond and mmc_complete_op_cond functions
> check the ready flag state at the end of the loop, that is after executing
> a delay inside the loop, which, in case of exiting with no error,
> is not needed. Also, one of these loops, as well as the loop
> in mmc_send_status, have the delay just before exiting on timeout
> conditions.
> 
> Restructure all these loops to check the respective conditions before making
> a delay for the next loop pass, and to appropriately exit without the delay.
> 
> Signed-off-by: Andrew Gabbasov <andrew_gabba...@mentor.com>
> ---
> drivers/mmc/mmc.c | 27 +++++++++++++++++----------
> 1 file changed, 17 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
> index 42af47c..b81533c 100644
> --- a/drivers/mmc/mmc.c
> +++ b/drivers/mmc/mmc.c
> @@ -118,7 +118,7 @@ int mmc_send_status(struct mmc *mmc, int timeout)
>       if (!mmc_host_is_spi(mmc))
>               cmd.cmdarg = mmc->rca << 16;
> 
> -     do {
> +     while (1) {
>               err = mmc_send_cmd(mmc, &cmd, NULL);
>               if (!err) {
>                       if ((cmd.response[0] & MMC_STATUS_RDY_FOR_DATA) &&
> @@ -135,9 +135,11 @@ int mmc_send_status(struct mmc *mmc, int timeout)
>               } else if (--retries < 0)
>                       return err;
> 
> -             udelay(1000);
> +             if (timeout-- <= 0)
> +                     break;
> 
> -     } while (timeout--);
> +             udelay(1000);
> +     }
> 
> #ifdef CONFIG_MMC_TRACE
>       status = (cmd.response[0] & MMC_STATUS_CURR_STATE) >> 9;
> @@ -291,7 +293,7 @@ static int sd_send_op_cond(struct mmc *mmc)
>       int err;
>       struct mmc_cmd cmd;
> 
> -     do {
> +     while (1) {
>               cmd.cmdidx = MMC_CMD_APP_CMD;
>               cmd.resp_type = MMC_RSP_R1;
>               cmd.cmdarg = 0;
> @@ -322,11 +324,14 @@ static int sd_send_op_cond(struct mmc *mmc)
>               if (err)
>                       return err;
> 
> -             udelay(1000);
> -     } while ((!(cmd.response[0] & OCR_BUSY)) && timeout--);
> +             if (cmd.response[0] & OCR_BUSY)
> +                     break;
> 
> -     if (timeout <= 0)
> -             return UNUSABLE_ERR;
> +             if (timeout-- <= 0)
> +                     return UNUSABLE_ERR;
> +
> +             udelay(1000);
> +     }
> 
>       if (mmc->version != SD_VERSION_2)
>               mmc->version = SD_VERSION_1_0;
> @@ -405,14 +410,16 @@ static int mmc_complete_op_cond(struct mmc *mmc)
>       mmc->op_cond_pending = 0;
>       if (!(mmc->ocr & OCR_BUSY)) {
>               start = get_timer(0);
> -             do {
> +             while (1) {
>                       err = mmc_send_op_cond_iter(mmc, 1);
>                       if (err)
>                               return err;
> +                     if (mmc->ocr & OCR_BUSY)
> +                             break;
>                       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 */
> -- 
> 2.1.0

Thanks, Applied.

— Pantelis

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to