* [U-Boot] [PATCH] mmc: sdhci: clean up time out detection @ 2016-07-08 10:58 ` Masahiro Yamada 2016-07-08 11:10 ` Jaehoon Chung 0 siblings, 1 reply; 2+ messages in thread From: Masahiro Yamada @ 2016-07-08 10:58 UTC (permalink / raw) To: u-boot 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. Signed-off-by: Masahiro Yamada <yamada.masahiro@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); -- 1.9.1 ^ permalink raw reply related [flat|nested] 2+ messages in thread
* [U-Boot] [PATCH] mmc: sdhci: clean up time out detection 2016-07-08 10:58 ` [U-Boot] [PATCH] mmc: sdhci: clean up time out detection Masahiro Yamada @ 2016-07-08 11:10 ` Jaehoon Chung 0 siblings, 0 replies; 2+ messages in thread From: Jaehoon Chung @ 2016-07-08 11:10 UTC (permalink / raw) To: u-boot 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.chung@samsung.com> Best Regards, Jaehoon Chung > > Signed-off-by: Masahiro Yamada <yamada.masahiro@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); > ^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2016-07-08 11:10 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <CGME20160708105736epcas1p12541f7c8db3d4804a0bd27b631ca3968@epcas1p1.samsung.com>
2016-07-08 10:58 ` [U-Boot] [PATCH] mmc: sdhci: clean up time out detection Masahiro Yamada
2016-07-08 11:10 ` Jaehoon Chung
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox