summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeng Fan <[email protected]>2026-07-13 21:32:52 +0800
committerPeng Fan <[email protected]>2026-07-29 11:15:55 +0800
commitf23b5e079a93245c01f618022fd76d189070d190 (patch)
treedebabc847fe8e108f40b553bbdd866457564c21c
parent616c3d79f01cf9204e38738857c4647a730dcb3b (diff)
mmc: fix mmc_poll_for_busy() false timeout when card is ready
mmc_poll_for_busy() returns a false -ETIMEDOUT if the card becomes ready on the exact iteration where timeout_ms reaches 0. The card-ready check breaks out of the loop, but then the post-loop check "if (timeout_ms <= 0)" fires and returns -ETIMEDOUT despite the card being ready. Fix by returning 0 directly when the card is ready instead of breaking out of the loop. The only exit from the loop is now the timeout path, so the post-loop code unconditionally returns -ETIMEDOUT. Reviewed-by: Tanmay Kathpalia <[email protected]> Signed-off-by: Peng Fan <[email protected]>
-rw-r--r--drivers/mmc/mmc.c10
1 files changed, 3 insertions, 7 deletions
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index 2e565560656..ef7defcde71 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -325,7 +325,7 @@ int mmc_poll_for_busy(struct mmc *mmc, int timeout_ms)
if ((status & MMC_STATUS_RDY_FOR_DATA) &&
(status & MMC_STATUS_CURR_STATE) !=
MMC_STATE_PRG)
- break;
+ return 0;
if (status & MMC_STATUS_MASK) {
#if !defined(CONFIG_XPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
@@ -340,14 +340,10 @@ int mmc_poll_for_busy(struct mmc *mmc, int timeout_ms)
udelay(1000);
}
- if (timeout_ms <= 0) {
#if !defined(CONFIG_XPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
- log_err("Timeout waiting card ready\n");
+ log_err("Timeout waiting card ready\n");
#endif
- return -ETIMEDOUT;
- }
-
- return 0;
+ return -ETIMEDOUT;
}
int mmc_set_blocklen(struct mmc *mmc, int len)