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 <marex@denx.de>
Cc: Dinh Nguyen <dinguyen@opensource.altera.com>
Cc: Pantelis Antoniou <panto@antoniou-consulting.com>
Cc: Tom Rini <trini@konsulko.com>
This commit is contained in:
Marek Vasut 2015-07-27 22:39:37 +02:00 committed by Pantelis Antoniou
parent 603b2f3a74
commit d9dbb97be0

View file

@ -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);