Commit 95a91298 authored by Ulf Hansson's avatar Ulf Hansson Committed by Chris Ball

mmc: block: Respect hw busy detection in card_busy_detect()

Currently for write request we don't trust the hw busy detection to be
fully handled by host, thus we also poll the card's status until we see
it's gets out of the busy state.

Still there are scenarios where it will a benefit to trust the hw busy
detection done by the host, since no additional polling is needed.
Let's prepare card_busy_detect() to be able to handle this.
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
Signed-off-by: default avatarChris Ball <chris@printf.net>
parent c49433fb
...@@ -750,7 +750,7 @@ static int get_card_status(struct mmc_card *card, u32 *status, int retries) ...@@ -750,7 +750,7 @@ static int get_card_status(struct mmc_card *card, u32 *status, int retries)
} }
static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms, static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms,
struct request *req, int *gen_err) bool hw_busy_detect, struct request *req, int *gen_err)
{ {
unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms); unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms);
int err = 0; int err = 0;
...@@ -770,6 +770,11 @@ static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms, ...@@ -770,6 +770,11 @@ static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms,
*gen_err = 1; *gen_err = 1;
} }
/* We may rely on the host hw to handle busy detection.*/
if ((card->host->caps & MMC_CAP_WAIT_WHILE_BUSY) &&
hw_busy_detect)
break;
/* /*
* Timeout if the device never becomes ready for data and never * Timeout if the device never becomes ready for data and never
* leaves the program state. * leaves the program state.
...@@ -1209,7 +1214,8 @@ static int mmc_blk_err_check(struct mmc_card *card, ...@@ -1209,7 +1214,8 @@ static int mmc_blk_err_check(struct mmc_card *card,
gen_err = 1; gen_err = 1;
} }
err = card_busy_detect(card, MMC_BLK_TIMEOUT_MS, req, &gen_err); err = card_busy_detect(card, MMC_BLK_TIMEOUT_MS, false, req,
&gen_err);
if (err) if (err)
return MMC_BLK_CMD_ERR; return MMC_BLK_CMD_ERR;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment