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.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);
-- 
1.9.1

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

Reply via email to