summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2017-01-03 17:56:50 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2017-01-03 17:56:49 -0800
commit3150bfec5cb45bc75631dfb3c27ef90029290d58 (patch)
treec26d661de2389ebde81913acdfa34f3f5a4727ec /drivers
parentc07da5b6025d133520eb4eaadddef97b697b7605 (diff)
parent11536b8f2540991f7d580a5edb45f608c79e3e55 (diff)
Merge "mmc: block: Add check to mmc_blk_part_switch"
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mmc/card/block.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
index 9ec0928658cd..5743588aa52b 100644
--- a/drivers/mmc/card/block.c
+++ b/drivers/mmc/card/block.c
@@ -136,6 +136,7 @@ struct mmc_blk_data {
#define MMC_BLK_DISCARD BIT(2)
#define MMC_BLK_SECDISCARD BIT(3)
#define MMC_BLK_FLUSH BIT(4)
+#define MMC_BLK_PARTSWITCH BIT(5)
/*
* Only set in main mmc_blk_data associated
@@ -1416,8 +1417,13 @@ static inline int mmc_blk_part_switch(struct mmc_card *card,
ret = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
EXT_CSD_PART_CONFIG, part_config,
card->ext_csd.part_time);
- if (ret)
+
+ if (ret) {
+ pr_err("%s: mmc_blk_part_switch failure, %d -> %d\n",
+ mmc_hostname(card->host), main_md->part_curr,
+ md->part_type);
return ret;
+ }
card->ext_csd.part_config = part_config;
card->part_curr = md->part_type;
@@ -3933,6 +3939,7 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
struct mmc_host *host = card->host;
unsigned long flags;
unsigned int cmd_flags = req ? req->cmd_flags : 0;
+ int err;
if (req && !mq->mqrq_prev->req) {
/* claim host only for the first request */
@@ -3946,7 +3953,17 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
}
ret = mmc_blk_part_switch(card, md);
+
if (ret) {
+ err = mmc_blk_reset(md, card->host, MMC_BLK_PARTSWITCH);
+ if (!err) {
+ pr_err("%s: mmc_blk_reset(MMC_BLK_PARTSWITCH) succeeded.\n",
+ mmc_hostname(host));
+ mmc_blk_reset_success(md, MMC_BLK_PARTSWITCH);
+ } else
+ pr_err("%s: mmc_blk_reset(MMC_BLK_PARTSWITCH) failed.\n",
+ mmc_hostname(host));
+
if (req) {
blk_end_request_all(req, -EIO);
}