Commit c89b4851 authored by Adrian Hunter's avatar Adrian Hunter Committed by Ulf Hansson

mmc: block: Make card_busy_detect() accumulate all response error bits

Make card_busy_detect() accumulate all response error bits. Later patches
will make use of this.
Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Acked-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
Tested-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 88a51646
...@@ -923,7 +923,8 @@ static int mmc_sd_num_wr_blocks(struct mmc_card *card, u32 *written_blocks) ...@@ -923,7 +923,8 @@ static int mmc_sd_num_wr_blocks(struct mmc_card *card, u32 *written_blocks)
} }
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,
bool hw_busy_detect, struct request *req, bool *gen_err) bool hw_busy_detect, struct request *req,
u32 *resp_errs)
{ {
unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms); unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms);
int err = 0; int err = 0;
...@@ -937,11 +938,9 @@ static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms, ...@@ -937,11 +938,9 @@ static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms,
return err; return err;
} }
if (status & R1_ERROR) { /* Accumulate any response error bits seen */
pr_err("%s: %s: error sending status cmd, status %#x\n", if (resp_errs)
req->rq_disk->disk_name, __func__, status); *resp_errs |= status;
*gen_err = true;
}
/* We may rely on the host hw to handle busy detection.*/ /* We may rely on the host hw to handle busy detection.*/
if ((card->host->caps & MMC_CAP_WAIT_WHILE_BUSY) && if ((card->host->caps & MMC_CAP_WAIT_WHILE_BUSY) &&
...@@ -970,6 +969,24 @@ static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms, ...@@ -970,6 +969,24 @@ static int card_busy_detect(struct mmc_card *card, unsigned int timeout_ms,
return err; return err;
} }
static int card_busy_detect_err(struct mmc_card *card, unsigned int timeout_ms,
bool hw_busy_detect, struct request *req,
bool *gen_err)
{
u32 resp_errs = 0;
int err;
err = card_busy_detect(card, timeout_ms, hw_busy_detect, req,
&resp_errs);
if (resp_errs & R1_ERROR) {
pr_err("%s: %s: error sending status cmd, status %#x\n",
req->rq_disk->disk_name, __func__, resp_errs);
*gen_err = true;
}
return err;
}
static int send_stop(struct mmc_card *card, unsigned int timeout_ms, static int send_stop(struct mmc_card *card, unsigned int timeout_ms,
struct request *req, bool *gen_err, u32 *stop_status) struct request *req, bool *gen_err, u32 *stop_status)
{ {
...@@ -1012,7 +1029,8 @@ static int send_stop(struct mmc_card *card, unsigned int timeout_ms, ...@@ -1012,7 +1029,8 @@ static int send_stop(struct mmc_card *card, unsigned int timeout_ms,
*gen_err = true; *gen_err = true;
} }
return card_busy_detect(card, timeout_ms, use_r1b_resp, req, gen_err); return card_busy_detect_err(card, timeout_ms, use_r1b_resp, req,
gen_err);
} }
#define ERR_NOMEDIUM 3 #define ERR_NOMEDIUM 3
...@@ -1553,8 +1571,8 @@ static enum mmc_blk_status __mmc_blk_err_check(struct mmc_card *card, ...@@ -1553,8 +1571,8 @@ static enum mmc_blk_status __mmc_blk_err_check(struct mmc_card *card,
gen_err = true; gen_err = true;
} }
err = card_busy_detect(card, MMC_BLK_TIMEOUT_MS, false, req, err = card_busy_detect_err(card, MMC_BLK_TIMEOUT_MS, false, req,
&gen_err); &gen_err);
if (err) if (err)
return MMC_BLK_CMD_ERR; return MMC_BLK_CMD_ERR;
} }
...@@ -2148,7 +2166,8 @@ static int mmc_blk_card_busy(struct mmc_card *card, struct request *req) ...@@ -2148,7 +2166,8 @@ static int mmc_blk_card_busy(struct mmc_card *card, struct request *req)
if (mmc_host_is_spi(card->host) || rq_data_dir(req) == READ) if (mmc_host_is_spi(card->host) || rq_data_dir(req) == READ)
return 0; return 0;
err = card_busy_detect(card, MMC_BLK_TIMEOUT_MS, false, req, &gen_err); err = card_busy_detect_err(card, MMC_BLK_TIMEOUT_MS, false, req,
&gen_err);
/* Copy the general error bit so it will be seen later on */ /* Copy the general error bit so it will be seen later on */
if (gen_err) { if (gen_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