mmc: sdhci: clean up timeout detection
authorMasahiro Yamada <yamada.masahiro@socionext.com>
Sat, 9 Jul 2016 15:40:22 +0000 (00:40 +0900)
committerJaehoon Chung <jh80.chung@samsung.com>
Fri, 5 Aug 2016 02:21:24 +0000 (11:21 +0900)
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_timer(),
the timeout detected after the loop may not be true.

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Acked-by: Jaehoon Chung <jh80.chung@samsung.com>
Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com>
drivers/mmc/sdhci.c

index 9fdbed8aa9e3471656a6de743591caba0cb985f7..1de1f8ea016db05e52b1f90f2f6c2ea502965dec 100644 (file)
@@ -252,17 +252,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);