From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jaehoon Chung Date: Fri, 08 Jul 2016 20:10:29 +0900 Subject: [U-Boot] [PATCH] mmc: sdhci: clean up time out detection In-Reply-To: <1467975504-15761-1-git-send-email-yamada.masahiro@socionext.com> References: <1467975504-15761-1-git-send-email-yamada.masahiro@socionext.com> Message-ID: <577F8A25.8030508@samsung.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de 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 Best Regards, Jaehoon Chung > > Signed-off-by: Masahiro Yamada > --- > > 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); >