Hey Shawn, You're assuming a card not signalling busy indicates TRAN state, and set the state manually, but a card might not be pulling DAT lines in PROG state. I will send a patch later that reworks card_busy_detect, as there are some issues with some command sequences in practice. I'd ask to wait with the patch until then. Regards, Christian From: Shawn Lin <shawn.lin@xxxxxxxxxxxxxx> Sent: Monday, June 7, 2021 11:18 AM To: Ulf Hansson <ulf.hansson@xxxxxxxxxx> Cc: linux-mmc@xxxxxxxxxxxxxxx <linux-mmc@xxxxxxxxxxxxxxx>; Shawn Lin <shawn.lin@xxxxxxxxxxxxxx> Subject: [PATCH] mmc: block: Use .card_busy() to detect busy state in card_busy_detect No need to send CMD13 if host driver supports .card_busy(). Signed-off-by: Shawn Lin <shawn.lin@xxxxxxxxxxxxxx> --- drivers/mmc/core/block.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c index 88f4c215..23623a9 100644 --- a/drivers/mmc/core/block.c +++ b/drivers/mmc/core/block.c @@ -417,10 +417,17 @@ static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms, unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms); int err = 0; u32 status; + bool busy; do { bool done = time_after(jiffies, timeout); + if (card->host->ops->card_busy) { + busy = card->host->ops->card_busy(card->host); + status = busy ? 0 : R1_READY_FOR_DATA | R1_STATE_TRAN << 9; + goto cb; + } + err = __mmc_send_status(card, &status, 5); if (err) { dev_err(mmc_dev(card->host), @@ -442,6 +449,7 @@ static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms, __func__, status); return -ETIMEDOUT; } +cb: } while (!mmc_ready_for_data(status)); return err; -- 2.7.4 Hyperstone GmbH | Line-Eid-Strasse 3 | 78467 Konstanz Managing Directors: Dr. Jan Peter Berns. Commercial register of local courts: Freiburg HRB381782