From d9dbb97be0e4a550457aec5f11afefb446169c90 Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Mon, 27 Jul 2015 22:39:37 +0200 Subject: [PATCH] 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 --- drivers/mmc/dw_mmc.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) 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); -- 2.25.1