@@ -959,7 +959,7 @@ static inline bool mmc_blk_in_tran_state(u32 status)
}
static int card_busy_detect(struct mmc_card *card, bool hw_busy_detect,
- struct request *req, bool *gen_err)
+ struct request *req, u32 *resp_errs)
{
struct mmc_queue_req *mqrq = req_to_mmc_queue_req(req);
struct mmc_data *data = &mqrq->brq.data;
@@ -979,11 +979,9 @@ static int card_busy_detect(struct mmc_card *card, bool hw_busy_detect,
return err;
}
- if (status & R1_ERROR) {
- pr_err("%s: %s: error sending status cmd, status %#x\n",
- req->rq_disk->disk_name, __func__, status);
- *gen_err = true;
- }
+ /* Accumulate any response error bits seen */
+ if (resp_errs)
+ *resp_errs |= status;
/* We may rely on the host hw to handle busy detection.*/
if ((card->host->caps & MMC_CAP_WAIT_WHILE_BUSY) &&
@@ -1011,6 +1009,22 @@ static int card_busy_detect(struct mmc_card *card, bool hw_busy_detect,
return err;
}
+static int card_busy_detect_err(struct mmc_card *card, bool hw_busy_detect,
+ struct request *req, bool *gen_err)
+{
+ u32 resp_errs = 0;
+ int err;
+
+ err = card_busy_detect(card, 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,
struct request *req, bool *gen_err, u32 *stop_status)
{
@@ -1053,7 +1067,7 @@ static int send_stop(struct mmc_card *card, unsigned int timeout_ms,
*gen_err = true;
}
- return card_busy_detect(card, use_r1b_resp, req, gen_err);
+ return card_busy_detect_err(card, use_r1b_resp, req, gen_err);
}
#define ERR_NOMEDIUM 3
@@ -1588,7 +1602,7 @@ static enum mmc_blk_status mmc_blk_err_check(struct mmc_card *card,
gen_err = true;
}
- err = card_busy_detect(card, false, req, &gen_err);
+ err = card_busy_detect_err(card, false, req, &gen_err);
if (err)
return MMC_BLK_CMD_ERR;
}
Make card_busy_detect() accumulate all response error bits. Later patches will make use of this. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> --- drivers/mmc/core/block.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-)