Re: [PATCH] mmc: block: Use .card_busy() to detect busy state in card_busy_detect

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Christian

On 2021/6/8 14:28, Christian Löhle wrote:
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.

Refer to JESD84-B51 for emmc spec, section 6.5.13 clearly says that. And
SD spec V4 also has a similar statement in section 4.3.4.

So I guess if that was the case you point out, most of all operations in
mmc_ops.c would suffer from this.


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;






[Index of Archives]     [Linux Memonry Technology]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux