Commit 70562644 authored by Ulf Hansson's avatar Ulf Hansson

mmc: core: Don't use ->card_busy() and CMD13 in combination when polling

When polling for busy after sending a MMC_SWITCH command, both the optional
->card_busy() callback and CMD13 are being used in conjunction.

This doesn't make sense. Instead it's more reasonable to rely solely on the
->card_busy() callback when it exists. Let's change that and instead use
the CMD13 as a fall-back. In this way we avoid sending CMD13, unless it's
really needed.

Within this context, let's also take the opportunity to make some
additional clean-ups and clarifications to the related code.
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
Acked-by: default avatarJaehoon Chung <jh80.chung@samsung.com>
Tested-by: default avatarJaehoon Chung <jh80.chung@samsung.com>
parent 716bdb89
...@@ -495,34 +495,32 @@ static int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms, ...@@ -495,34 +495,32 @@ static int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms,
timeout = jiffies + msecs_to_jiffies(timeout_ms) + 1; timeout = jiffies + msecs_to_jiffies(timeout_ms) + 1;
do { do {
/* /*
* Due to the possibility of being preempted after * Due to the possibility of being preempted while polling,
* sending the status command, check the expiration * check the expiration time first.
* time first.
*/ */
expired = time_after(jiffies, timeout); expired = time_after(jiffies, timeout);
if (send_status) {
if (host->ops->card_busy) {
busy = host->ops->card_busy(host);
} else {
err = __mmc_send_status(card, &status, ignore_crc); err = __mmc_send_status(card, &status, ignore_crc);
if (err) if (err)
return err; return err;
} busy = R1_CURRENT_STATE(status) == R1_STATE_PRG;
if (host->ops->card_busy) {
if (!host->ops->card_busy(host))
break;
busy = true;
} }
/* Timeout if the device never leaves the program state. */ /* Timeout if the device still remains busy. */
if (expired && if (expired && busy) {
(R1_CURRENT_STATE(status) == R1_STATE_PRG || busy)) { pr_err("%s: Card stuck being busy! %s\n",
pr_err("%s: Card stuck in programming state! %s\n",
mmc_hostname(host), __func__); mmc_hostname(host), __func__);
return -ETIMEDOUT; return -ETIMEDOUT;
} }
} while (R1_CURRENT_STATE(status) == R1_STATE_PRG || busy); } while (busy);
err = mmc_switch_status_error(host, status); if (host->ops->card_busy && send_status)
return mmc_switch_status(card);
return err; return mmc_switch_status_error(host, status);
} }
/** /**
......
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