mmc: sdhci: clean up timeout detection
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>
This commit is contained in:
parent
e1efe43c71
commit
bae4a1fdf5
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue