[PATCH V14 09/24] mmc: block: Make card_busy_detect() accumulate all response error bits
From: Adrian Hunter <adrian.hunter@intel.com>
Date: 2017-11-21 13:44:01
Also in:
linux-mmc, lkml
Subsystem:
multimedia card (mmc), secure digital (sd) and sdio subsystem, the rest · Maintainers:
Ulf Hansson, Linus Torvalds
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(-)
diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
index 130ce94fdaf2..607774fcb9f5 100644
--- a/drivers/mmc/core/block.c
+++ b/drivers/mmc/core/block.c@@ -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; }
--
1.9.1