From: Marek Vasut Date: Mon, 27 Jul 2015 20:39:37 +0000 (+0200) Subject: mmc: dw_mmc: Zap endless timeout X-Git-Tag: v2015.10-rc2~59^2~4 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=d9dbb97be0e4a550457aec5f11afefb446169c90;p=u-boot mmc: dw_mmc: Zap endless timeout Endless timeouts are bad, since if we get stuck in one, we have no way out. Zap this one by implementing proper timeout. Signed-off-by: Marek Vasut Cc: Dinh Nguyen Cc: Pantelis Antoniou Cc: Tom Rini --- diff --git a/drivers/mmc/dw_mmc.c b/drivers/mmc/dw_mmc.c index 3fffa71166..0f61f163e2 100644 --- a/drivers/mmc/dw_mmc.c +++ b/drivers/mmc/dw_mmc.c @@ -211,14 +211,29 @@ static int dwmci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, } if (data) { - do { + start = get_timer(0); + timeout = 1000; + for (;;) { mask = dwmci_readl(host, DWMCI_RINTSTS); + /* Error during data transfer. */ if (mask & (DWMCI_DATA_ERR | DWMCI_DATA_TOUT)) { printf("%s: DATA ERROR!\n", __func__); bounce_buffer_stop(&bbstate); return -1; } - } while (!(mask & DWMCI_INTMSK_DTO)); + + /* Data arrived correctly. */ + if (mask & DWMCI_INTMSK_DTO) + break; + + /* Check for timeout. */ + if (get_timer(start) > timeout) { + printf("%s: Timeout waiting for data!\n", + __func__); + bounce_buffer_stop(&bbstate); + return TIMEOUT; + } + } dwmci_writel(host, DWMCI_RINTSTS, mask);