summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>2021-09-16 11:36:26 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2021-10-05 13:51:11 +0200
commitd64e4d691f19180825035e480218596427e3f9d1 (patch)
treee38400cef035c225dcd9130ac6ab9dccba87bd21 /drivers
parent4a471f0360e67e8e6696c0cd86dd1af6eb92e5be (diff)
downloadbarebox-d64e4d691f19180825035e480218596427e3f9d1.tar.gz
barebox-d64e4d691f19180825035e480218596427e3f9d1.tar.xz
mci-bcm2835: Don't block infinitely while waiting for a command completion
Instead abort with a timeout error. This prevents getting a hung barebox when a command doesn't complete. Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> Link: https://lore.barebox.org/20210916093627.173566-1-u.kleine-koenig@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mci/mci-bcm2835.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/mci/mci-bcm2835.c b/drivers/mci/mci-bcm2835.c
index 0450f899c6..12f7cb6ea3 100644
--- a/drivers/mci/mci-bcm2835.c
+++ b/drivers/mci/mci-bcm2835.c
@@ -87,13 +87,17 @@ static u32 bcm2835_sdhci_read32(struct sdhci *sdhci, int reg)
static u32 bcm2835_mci_wait_command_done(struct bcm2835_mci_host *host)
{
u32 interrupt = 0;
+ uint64_t start;
+ start = get_time_ns();
while (true) {
interrupt = sdhci_read32(&host->sdhci, SDHCI_INT_STATUS);
if (interrupt & SDHCI_INT_INDEX)
return -EPERM;
if (interrupt & SDHCI_INT_CMD_COMPLETE)
break;
+ if (is_timeout(start, SECOND))
+ return -ETIMEDOUT;
}
return 0;
}