@@ -1962,13 +1962,18 @@ static unsigned int mmc_erase_timeout(struct mmc_card *card,
return mmc_mmc_erase_timeout(card, arg, qty);
}
+static inline bool mmc_erase_in_busy_state(u32 status)
+{
+ return (!(status & R1_READY_FOR_DATA) ||
+ (R1_CURRENT_STATE(status) == R1_STATE_PRG));
+}
+
static int mmc_do_erase(struct mmc_card *card, unsigned int from,
unsigned int to, unsigned int arg)
{
struct mmc_command cmd = {};
unsigned int qty = 0, busy_timeout = 0;
bool use_r1b_resp = false;
- unsigned long timeout;
int err;
mmc_retune_hold(card->host);
@@ -2059,43 +2064,8 @@ static int mmc_do_erase(struct mmc_card *card, unsigned int from,
goto out;
}
- if (mmc_host_is_spi(card->host))
- goto out;
-
- /*
- * In case of when R1B + MMC_CAP_WAIT_WHILE_BUSY is used, the polling
- * shall be avoided.
- */
- if ((card->host->caps & MMC_CAP_WAIT_WHILE_BUSY) && use_r1b_resp)
- goto out;
-
- timeout = jiffies + msecs_to_jiffies(busy_timeout);
- do {
- memset(&cmd, 0, sizeof(struct mmc_command));
- cmd.opcode = MMC_SEND_STATUS;
- cmd.arg = card->rca << 16;
- cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
- /* Do not retry else we can't see errors */
- err = mmc_wait_for_cmd(card->host, &cmd, 0);
- if (err || R1_STATUS(cmd.resp[0])) {
- pr_err("error %d requesting status %#x\n",
- err, cmd.resp[0]);
- err = -EIO;
- goto out;
- }
-
- /* Timeout if the device never becomes ready for data and
- * never leaves the program state.
- */
- if (time_after(jiffies, timeout)) {
- pr_err("%s: Card stuck in programming state! %s\n",
- mmc_hostname(card->host), __func__);
- err = -EIO;
- goto out;
- }
-
- } while (!(cmd.resp[0] & R1_READY_FOR_DATA) ||
- (R1_CURRENT_STATE(cmd.resp[0]) == R1_STATE_PRG));
+ err = mmc_poll_for_busy(card, busy_timeout, true, false, use_r1b_resp,
+ NULL, &mmc_erase_in_busy_state, false);
out:
mmc_retune_release(card->host);
return err;
Now mmc_poll_for_busy() could replace the whole bunch of code in mmc_do_erase() when polling for busy. Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com> --- Changes in v2: None drivers/mmc/core/core.c | 46 ++++++++-------------------------------------- 1 file changed, 8 insertions(+), 38 deletions(-)