mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-02 09:46:37 +03:00
mmc: stm32_sdmmc2: avoid infinite while loop
Avoid unlimited while loop by adding a timeout. The timeout is calculated based on a minimal throughput of 256 KB/s. The timeout is set at least to 2 seconds. Signed-off-by: Christophe Kerello <christophe.kerello@foss.st.com> Reviewed-by: Patrice Chotard <patrice.chotard@foss.st.com>
This commit is contained in:
committed by
Patrice Chotard
parent
4c28c4d9a3
commit
1067d2060f
@@ -385,15 +385,29 @@ static int stm32_sdmmc2_end_data(struct udevice *dev,
|
||||
u32 mask = SDMMC_STA_DCRCFAIL | SDMMC_STA_DTIMEOUT |
|
||||
SDMMC_STA_IDMATE | SDMMC_STA_DATAEND;
|
||||
u32 status;
|
||||
unsigned long timeout_msecs = ctx->data_length >> 8;
|
||||
unsigned long start_timeout;
|
||||
|
||||
/* At least, a timeout of 2 seconds is set */
|
||||
if (timeout_msecs < 2000)
|
||||
timeout_msecs = 2000;
|
||||
|
||||
if (data->flags & MMC_DATA_READ)
|
||||
mask |= SDMMC_STA_RXOVERR;
|
||||
else
|
||||
mask |= SDMMC_STA_TXUNDERR;
|
||||
|
||||
start_timeout = get_timer(0);
|
||||
status = readl(plat->base + SDMMC_STA);
|
||||
while (!(status & mask))
|
||||
while (!(status & mask)) {
|
||||
if (get_timer(start_timeout) > timeout_msecs) {
|
||||
ctx->dpsm_abort = true;
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
schedule();
|
||||
status = readl(plat->base + SDMMC_STA);
|
||||
}
|
||||
|
||||
/*
|
||||
* Need invalidate the dcache again to avoid any
|
||||
|
||||
Reference in New Issue
Block a user