Hi Masahiro, On 07/08/2016 07:58 PM, Masahiro Yamada wrote: > The current timeout detection logic is not very nice; it calls > get_timer(start) in the while() loop, and then calls it again after > the loop to check if a timeout error happened. > > Because of the time difference between the two calls of get_time(), > the reason detected after the loop may not be really true.
It makes sense. Looks good to me. Tested with Exynos boards Acked-by: Jaehoon Chung <jh80.ch...@samsung.com> Best Regards, Jaehoon Chung > > Signed-off-by: Masahiro Yamada <yamada.masah...@socionext.com> > --- > > drivers/mmc/sdhci.c | 18 +++++++++--------- > 1 file changed, 9 insertions(+), 9 deletions(-) > > diff --git a/drivers/mmc/sdhci.c b/drivers/mmc/sdhci.c > index 604f18d..0a1882d 100644 > --- a/drivers/mmc/sdhci.c > +++ b/drivers/mmc/sdhci.c > @@ -243,17 +243,17 @@ static int sdhci_send_command(struct mmc *mmc, struct > mmc_cmd *cmd, > stat = sdhci_readl(host, SDHCI_INT_STATUS); > if (stat & SDHCI_INT_ERROR) > break; > - } while (((stat & mask) != mask) && > - (get_timer(start) < SDHCI_READ_STATUS_TIMEOUT)); > > - if (get_timer(start) >= SDHCI_READ_STATUS_TIMEOUT) { > - if (host->quirks & SDHCI_QUIRK_BROKEN_R1B) > - return 0; > - else { > - printf("%s: Timeout for status update!\n", __func__); > - return TIMEOUT; > + if (get_timer(start) >= SDHCI_READ_STATUS_TIMEOUT) { > + if (host->quirks & SDHCI_QUIRK_BROKEN_R1B) { > + return 0; > + } else { > + printf("%s: Timeout for status update!\n", > + __func__); > + return TIMEOUT; > + } > } > - } > + } while ((stat & mask) != mask); > > if ((stat & (SDHCI_INT_ERROR | mask)) == mask) { > sdhci_cmd_done(host, cmd); > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot