aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mmc/card/block.c
diff options
context:
space:
mode:
authorAdrian Hunter <adrian.hunter@intel.com>2011-08-29 09:42:15 -0400
committerChris Ball <cjb@laptop.org>2011-10-26 16:32:08 -0400
commit67716327eec7e9d573e7cb2d806545d6f7c1a38d (patch)
tree132888322795b8ecf2d0b3b128ca850ec1eda532 /drivers/mmc/card/block.c
parent2311344c33cb8add492881900ca427b62f5a7eae (diff)
mmc: block: add eMMC hardware reset support
For cards that support hardware reset (just eMMC), try a reset and retry before returning an I/O error. However this is not done for ECC errors and is never done twice for the same operation type (READ, WRITE, DISCARD, SECURE DISCARD) until that type of operation again succeeds. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Signed-off-by: Chris Ball <cjb@laptop.org>
Diffstat (limited to 'drivers/mmc/card/block.c')
-rw-r--r--drivers/mmc/card/block.c201
1 files changed, 142 insertions, 59 deletions
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
index 9b9072636687..66c7596c5546 100644
--- a/drivers/mmc/card/block.c
+++ b/drivers/mmc/card/block.c
@@ -94,6 +94,11 @@ struct mmc_blk_data {
94 unsigned int read_only; 94 unsigned int read_only;
95 unsigned int part_type; 95 unsigned int part_type;
96 unsigned int name_idx; 96 unsigned int name_idx;
97 unsigned int reset_done;
98#define MMC_BLK_READ BIT(0)
99#define MMC_BLK_WRITE BIT(1)
100#define MMC_BLK_DISCARD BIT(2)
101#define MMC_BLK_SECDISCARD BIT(3)
97 102
98 /* 103 /*
99 * Only set in main mmc_blk_data associated 104 * Only set in main mmc_blk_data associated
@@ -109,11 +114,11 @@ static DEFINE_MUTEX(open_lock);
109enum mmc_blk_status { 114enum mmc_blk_status {
110 MMC_BLK_SUCCESS = 0, 115 MMC_BLK_SUCCESS = 0,
111 MMC_BLK_PARTIAL, 116 MMC_BLK_PARTIAL,
112 MMC_BLK_RETRY,
113 MMC_BLK_RETRY_SINGLE,
114 MMC_BLK_DATA_ERR,
115 MMC_BLK_CMD_ERR, 117 MMC_BLK_CMD_ERR,
118 MMC_BLK_RETRY,
116 MMC_BLK_ABORT, 119 MMC_BLK_ABORT,
120 MMC_BLK_DATA_ERR,
121 MMC_BLK_ECC_ERR,
117}; 122};
118 123
119module_param(perdev_minors, int, 0444); 124module_param(perdev_minors, int, 0444);
@@ -454,7 +459,7 @@ static inline int mmc_blk_part_switch(struct mmc_card *card,
454 card->ext_csd.part_time); 459 card->ext_csd.part_time);
455 if (ret) 460 if (ret)
456 return ret; 461 return ret;
457} 462 }
458 463
459 main_md->part_curr = md->part_type; 464 main_md->part_curr = md->part_type;
460 return 0; 465 return 0;
@@ -616,7 +621,7 @@ static int mmc_blk_cmd_error(struct request *req, const char *name, int error,
616 * Otherwise we don't understand what happened, so abort. 621 * Otherwise we don't understand what happened, so abort.
617 */ 622 */
618static int mmc_blk_cmd_recovery(struct mmc_card *card, struct request *req, 623static int mmc_blk_cmd_recovery(struct mmc_card *card, struct request *req,
619 struct mmc_blk_request *brq) 624 struct mmc_blk_request *brq, int *ecc_err)
620{ 625{
621 bool prev_cmd_status_valid = true; 626 bool prev_cmd_status_valid = true;
622 u32 status, stop_status = 0; 627 u32 status, stop_status = 0;
@@ -641,6 +646,12 @@ static int mmc_blk_cmd_recovery(struct mmc_card *card, struct request *req,
641 if (err) 646 if (err)
642 return ERR_ABORT; 647 return ERR_ABORT;
643 648
649 /* Flag ECC errors */
650 if ((status & R1_CARD_ECC_FAILED) ||
651 (brq->stop.resp[0] & R1_CARD_ECC_FAILED) ||
652 (brq->cmd.resp[0] & R1_CARD_ECC_FAILED))
653 *ecc_err = 1;
654
644 /* 655 /*
645 * Check the current card state. If it is in some data transfer 656 * Check the current card state. If it is in some data transfer
646 * mode, tell it to stop (and hopefully transition back to TRAN.) 657 * mode, tell it to stop (and hopefully transition back to TRAN.)
@@ -658,6 +669,8 @@ static int mmc_blk_cmd_recovery(struct mmc_card *card, struct request *req,
658 */ 669 */
659 if (err) 670 if (err)
660 return ERR_ABORT; 671 return ERR_ABORT;
672 if (stop_status & R1_CARD_ECC_FAILED)
673 *ecc_err = 1;
661 } 674 }
662 675
663 /* Check for set block count errors */ 676 /* Check for set block count errors */
@@ -670,6 +683,10 @@ static int mmc_blk_cmd_recovery(struct mmc_card *card, struct request *req,
670 return mmc_blk_cmd_error(req, "r/w cmd", brq->cmd.error, 683 return mmc_blk_cmd_error(req, "r/w cmd", brq->cmd.error,
671 prev_cmd_status_valid, status); 684 prev_cmd_status_valid, status);
672 685
686 /* Data errors */
687 if (!brq->stop.error)
688 return ERR_CONTINUE;
689
673 /* Now for stop errors. These aren't fatal to the transfer. */ 690 /* Now for stop errors. These aren't fatal to the transfer. */
674 pr_err("%s: error %d sending stop command, original cmd response %#x, card status %#x\n", 691 pr_err("%s: error %d sending stop command, original cmd response %#x, card status %#x\n",
675 req->rq_disk->disk_name, brq->stop.error, 692 req->rq_disk->disk_name, brq->stop.error,
@@ -686,12 +703,45 @@ static int mmc_blk_cmd_recovery(struct mmc_card *card, struct request *req,
686 return ERR_CONTINUE; 703 return ERR_CONTINUE;
687} 704}
688 705
706static int mmc_blk_reset(struct mmc_blk_data *md, struct mmc_host *host,
707 int type)
708{
709 int err;
710
711 if (md->reset_done & type)
712 return -EEXIST;
713
714 md->reset_done |= type;
715 err = mmc_hw_reset(host);
716 /* Ensure we switch back to the correct partition */
717 if (err != -EOPNOTSUPP) {
718 struct mmc_blk_data *main_md = mmc_get_drvdata(host->card);
719 int part_err;
720
721 main_md->part_curr = main_md->part_type;
722 part_err = mmc_blk_part_switch(host->card, md);
723 if (part_err) {
724 /*
725 * We have failed to get back into the correct
726 * partition, so we need to abort the whole request.
727 */
728 return -ENODEV;
729 }
730 }
731 return err;
732}
733
734static inline void mmc_blk_reset_success(struct mmc_blk_data *md, int type)
735{
736 md->reset_done &= ~type;
737}
738
689static int mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req) 739static int mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req)
690{ 740{
691 struct mmc_blk_data *md = mq->data; 741 struct mmc_blk_data *md = mq->data;
692 struct mmc_card *card = md->queue.card; 742 struct mmc_card *card = md->queue.card;
693 unsigned int from, nr, arg; 743 unsigned int from, nr, arg;
694 int err = 0; 744 int err = 0, type = MMC_BLK_DISCARD;
695 745
696 if (!mmc_can_erase(card)) { 746 if (!mmc_can_erase(card)) {
697 err = -EOPNOTSUPP; 747 err = -EOPNOTSUPP;
@@ -705,7 +755,7 @@ static int mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req)
705 arg = MMC_TRIM_ARG; 755 arg = MMC_TRIM_ARG;
706 else 756 else
707 arg = MMC_ERASE_ARG; 757 arg = MMC_ERASE_ARG;
708 758retry:
709 if (card->quirks & MMC_QUIRK_INAND_CMD38) { 759 if (card->quirks & MMC_QUIRK_INAND_CMD38) {
710 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, 760 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
711 INAND_CMD38_ARG_EXT_CSD, 761 INAND_CMD38_ARG_EXT_CSD,
@@ -718,6 +768,10 @@ static int mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req)
718 } 768 }
719 err = mmc_erase(card, from, nr, arg); 769 err = mmc_erase(card, from, nr, arg);
720out: 770out:
771 if (err == -EIO && !mmc_blk_reset(md, card->host, type))
772 goto retry;
773 if (!err)
774 mmc_blk_reset_success(md, type);
721 spin_lock_irq(&md->lock); 775 spin_lock_irq(&md->lock);
722 __blk_end_request(req, err, blk_rq_bytes(req)); 776 __blk_end_request(req, err, blk_rq_bytes(req));
723 spin_unlock_irq(&md->lock); 777 spin_unlock_irq(&md->lock);
@@ -731,7 +785,7 @@ static int mmc_blk_issue_secdiscard_rq(struct mmc_queue *mq,
731 struct mmc_blk_data *md = mq->data; 785 struct mmc_blk_data *md = mq->data;
732 struct mmc_card *card = md->queue.card; 786 struct mmc_card *card = md->queue.card;
733 unsigned int from, nr, arg; 787 unsigned int from, nr, arg;
734 int err = 0; 788 int err = 0, type = MMC_BLK_SECDISCARD;
735 789
736 if (!mmc_can_secure_erase_trim(card)) { 790 if (!mmc_can_secure_erase_trim(card)) {
737 err = -EOPNOTSUPP; 791 err = -EOPNOTSUPP;
@@ -745,7 +799,7 @@ static int mmc_blk_issue_secdiscard_rq(struct mmc_queue *mq,
745 arg = MMC_SECURE_TRIM1_ARG; 799 arg = MMC_SECURE_TRIM1_ARG;
746 else 800 else
747 arg = MMC_SECURE_ERASE_ARG; 801 arg = MMC_SECURE_ERASE_ARG;
748 802retry:
749 if (card->quirks & MMC_QUIRK_INAND_CMD38) { 803 if (card->quirks & MMC_QUIRK_INAND_CMD38) {
750 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, 804 err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
751 INAND_CMD38_ARG_EXT_CSD, 805 INAND_CMD38_ARG_EXT_CSD,
@@ -769,6 +823,10 @@ static int mmc_blk_issue_secdiscard_rq(struct mmc_queue *mq,
769 err = mmc_erase(card, from, nr, MMC_SECURE_TRIM2_ARG); 823 err = mmc_erase(card, from, nr, MMC_SECURE_TRIM2_ARG);
770 } 824 }
771out: 825out:
826 if (err == -EIO && !mmc_blk_reset(md, card->host, type))
827 goto retry;
828 if (!err)
829 mmc_blk_reset_success(md, type);
772 spin_lock_irq(&md->lock); 830 spin_lock_irq(&md->lock);
773 __blk_end_request(req, err, blk_rq_bytes(req)); 831 __blk_end_request(req, err, blk_rq_bytes(req));
774 spin_unlock_irq(&md->lock); 832 spin_unlock_irq(&md->lock);
@@ -825,11 +883,11 @@ static inline void mmc_apply_rel_rw(struct mmc_blk_request *brq,
825static int mmc_blk_err_check(struct mmc_card *card, 883static int mmc_blk_err_check(struct mmc_card *card,
826 struct mmc_async_req *areq) 884 struct mmc_async_req *areq)
827{ 885{
828 enum mmc_blk_status ret = MMC_BLK_SUCCESS;
829 struct mmc_queue_req *mq_mrq = container_of(areq, struct mmc_queue_req, 886 struct mmc_queue_req *mq_mrq = container_of(areq, struct mmc_queue_req,
830 mmc_active); 887 mmc_active);
831 struct mmc_blk_request *brq = &mq_mrq->brq; 888 struct mmc_blk_request *brq = &mq_mrq->brq;
832 struct request *req = mq_mrq->req; 889 struct request *req = mq_mrq->req;
890 int ecc_err = 0;
833 891
834 /* 892 /*
835 * sbc.error indicates a problem with the set block count 893 * sbc.error indicates a problem with the set block count
@@ -841,8 +899,9 @@ static int mmc_blk_err_check(struct mmc_card *card,
841 * stop.error indicates a problem with the stop command. Data 899 * stop.error indicates a problem with the stop command. Data
842 * may have been transferred, or may still be transferring. 900 * may have been transferred, or may still be transferring.
843 */ 901 */
844 if (brq->sbc.error || brq->cmd.error || brq->stop.error) { 902 if (brq->sbc.error || brq->cmd.error || brq->stop.error ||
845 switch (mmc_blk_cmd_recovery(card, req, brq)) { 903 brq->data.error) {
904 switch (mmc_blk_cmd_recovery(card, req, brq, &ecc_err)) {
846 case ERR_RETRY: 905 case ERR_RETRY:
847 return MMC_BLK_RETRY; 906 return MMC_BLK_RETRY;
848 case ERR_ABORT: 907 case ERR_ABORT:
@@ -894,23 +953,21 @@ static int mmc_blk_err_check(struct mmc_card *card,
894 brq->cmd.resp[0], brq->stop.resp[0]); 953 brq->cmd.resp[0], brq->stop.resp[0]);
895 954
896 if (rq_data_dir(req) == READ) { 955 if (rq_data_dir(req) == READ) {
897 if (brq->data.blocks > 1) { 956 if (ecc_err)
898 /* Redo read one sector at a time */ 957 return MMC_BLK_ECC_ERR;
899 pr_warning("%s: retrying using single block read\n",
900 req->rq_disk->disk_name);
901 return MMC_BLK_RETRY_SINGLE;
902 }
903 return MMC_BLK_DATA_ERR; 958 return MMC_BLK_DATA_ERR;
904 } else { 959 } else {
905 return MMC_BLK_CMD_ERR; 960 return MMC_BLK_CMD_ERR;
906 } 961 }
907 } 962 }
908 963
909 if (ret == MMC_BLK_SUCCESS && 964 if (!brq->data.bytes_xfered)
910 blk_rq_bytes(req) != brq->data.bytes_xfered) 965 return MMC_BLK_RETRY;
911 ret = MMC_BLK_PARTIAL;
912 966
913 return ret; 967 if (blk_rq_bytes(req) != brq->data.bytes_xfered)
968 return MMC_BLK_PARTIAL;
969
970 return MMC_BLK_SUCCESS;
914} 971}
915 972
916static void mmc_blk_rw_rq_prep(struct mmc_queue_req *mqrq, 973static void mmc_blk_rw_rq_prep(struct mmc_queue_req *mqrq,
@@ -1049,12 +1106,41 @@ static void mmc_blk_rw_rq_prep(struct mmc_queue_req *mqrq,
1049 mmc_queue_bounce_pre(mqrq); 1106 mmc_queue_bounce_pre(mqrq);
1050} 1107}
1051 1108
1109static int mmc_blk_cmd_err(struct mmc_blk_data *md, struct mmc_card *card,
1110 struct mmc_blk_request *brq, struct request *req,
1111 int ret)
1112{
1113 /*
1114 * If this is an SD card and we're writing, we can first
1115 * mark the known good sectors as ok.
1116 *
1117 * If the card is not SD, we can still ok written sectors
1118 * as reported by the controller (which might be less than
1119 * the real number of written sectors, but never more).
1120 */
1121 if (mmc_card_sd(card)) {
1122 u32 blocks;
1123
1124 blocks = mmc_sd_num_wr_blocks(card);
1125 if (blocks != (u32)-1) {
1126 spin_lock_irq(&md->lock);
1127 ret = __blk_end_request(req, 0, blocks << 9);
1128 spin_unlock_irq(&md->lock);
1129 }
1130 } else {
1131 spin_lock_irq(&md->lock);
1132 ret = __blk_end_request(req, 0, brq->data.bytes_xfered);
1133 spin_unlock_irq(&md->lock);
1134 }
1135 return ret;
1136}
1137
1052static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc) 1138static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc)
1053{ 1139{
1054 struct mmc_blk_data *md = mq->data; 1140 struct mmc_blk_data *md = mq->data;
1055 struct mmc_card *card = md->queue.card; 1141 struct mmc_card *card = md->queue.card;
1056 struct mmc_blk_request *brq = &mq->mqrq_cur->brq; 1142 struct mmc_blk_request *brq = &mq->mqrq_cur->brq;
1057 int ret = 1, disable_multi = 0, retry = 0; 1143 int ret = 1, disable_multi = 0, retry = 0, type;
1058 enum mmc_blk_status status; 1144 enum mmc_blk_status status;
1059 struct mmc_queue_req *mq_rq; 1145 struct mmc_queue_req *mq_rq;
1060 struct request *req; 1146 struct request *req;
@@ -1076,6 +1162,7 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc)
1076 mq_rq = container_of(areq, struct mmc_queue_req, mmc_active); 1162 mq_rq = container_of(areq, struct mmc_queue_req, mmc_active);
1077 brq = &mq_rq->brq; 1163 brq = &mq_rq->brq;
1078 req = mq_rq->req; 1164 req = mq_rq->req;
1165 type = rq_data_dir(req) == READ ? MMC_BLK_READ : MMC_BLK_WRITE;
1079 mmc_queue_bounce_post(mq_rq); 1166 mmc_queue_bounce_post(mq_rq);
1080 1167
1081 switch (status) { 1168 switch (status) {
@@ -1084,17 +1171,17 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc)
1084 /* 1171 /*
1085 * A block was successfully transferred. 1172 * A block was successfully transferred.
1086 */ 1173 */
1174 mmc_blk_reset_success(md, type);
1087 spin_lock_irq(&md->lock); 1175 spin_lock_irq(&md->lock);
1088 ret = __blk_end_request(req, 0, 1176 ret = __blk_end_request(req, 0,
1089 brq->data.bytes_xfered); 1177 brq->data.bytes_xfered);
1090 spin_unlock_irq(&md->lock); 1178 spin_unlock_irq(&md->lock);
1179 /*
1180 * If the blk_end_request function returns non-zero even
1181 * though all data has been transferred and no errors
1182 * were returned by the host controller, it's a bug.
1183 */
1091 if (status == MMC_BLK_SUCCESS && ret) { 1184 if (status == MMC_BLK_SUCCESS && ret) {
1092 /*
1093 * The blk_end_request has returned non zero
1094 * even though all data is transfered and no
1095 * erros returned by host.
1096 * If this happen it's a bug.
1097 */
1098 printk(KERN_ERR "%s BUG rq_tot %d d_xfer %d\n", 1185 printk(KERN_ERR "%s BUG rq_tot %d d_xfer %d\n",
1099 __func__, blk_rq_bytes(req), 1186 __func__, blk_rq_bytes(req),
1100 brq->data.bytes_xfered); 1187 brq->data.bytes_xfered);
@@ -1103,16 +1190,36 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc)
1103 } 1190 }
1104 break; 1191 break;
1105 case MMC_BLK_CMD_ERR: 1192 case MMC_BLK_CMD_ERR:
1106 goto cmd_err; 1193 ret = mmc_blk_cmd_err(md, card, brq, req, ret);
1107 case MMC_BLK_RETRY_SINGLE: 1194 if (!mmc_blk_reset(md, card->host, type))
1108 disable_multi = 1; 1195 break;
1109 break; 1196 goto cmd_abort;
1110 case MMC_BLK_RETRY: 1197 case MMC_BLK_RETRY:
1111 if (retry++ < 5) 1198 if (retry++ < 5)
1112 break; 1199 break;
1200 /* Fall through */
1113 case MMC_BLK_ABORT: 1201 case MMC_BLK_ABORT:
1202 if (!mmc_blk_reset(md, card->host, type))
1203 break;
1114 goto cmd_abort; 1204 goto cmd_abort;
1115 case MMC_BLK_DATA_ERR: 1205 case MMC_BLK_DATA_ERR: {
1206 int err;
1207
1208 err = mmc_blk_reset(md, card->host, type);
1209 if (!err)
1210 break;
1211 if (err == -ENODEV)
1212 goto cmd_abort;
1213 /* Fall through */
1214 }
1215 case MMC_BLK_ECC_ERR:
1216 if (brq->data.blocks > 1) {
1217 /* Redo read one sector at a time */
1218 pr_warning("%s: retrying using single block read\n",
1219 req->rq_disk->disk_name);
1220 disable_multi = 1;
1221 break;
1222 }
1116 /* 1223 /*
1117 * After an error, we redo I/O one sector at a 1224 * After an error, we redo I/O one sector at a
1118 * time, so we only reach here after trying to 1225 * time, so we only reach here after trying to
@@ -1129,7 +1236,7 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc)
1129 1236
1130 if (ret) { 1237 if (ret) {
1131 /* 1238 /*
1132 * In case of a none complete request 1239 * In case of a incomplete request
1133 * prepare it again and resend. 1240 * prepare it again and resend.
1134 */ 1241 */
1135 mmc_blk_rw_rq_prep(mq_rq, card, disable_multi, mq); 1242 mmc_blk_rw_rq_prep(mq_rq, card, disable_multi, mq);
@@ -1139,30 +1246,6 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc)
1139 1246
1140 return 1; 1247 return 1;
1141 1248
1142 cmd_err:
1143 /*
1144 * If this is an SD card and we're writing, we can first
1145 * mark the known good sectors as ok.
1146 *
1147 * If the card is not SD, we can still ok written sectors
1148 * as reported by the controller (which might be less than
1149 * the real number of written sectors, but never more).
1150 */
1151 if (mmc_card_sd(card)) {
1152 u32 blocks;
1153
1154 blocks = mmc_sd_num_wr_blocks(card);
1155 if (blocks != (u32)-1) {
1156 spin_lock_irq(&md->lock);
1157 ret = __blk_end_request(req, 0, blocks << 9);
1158 spin_unlock_irq(&md->lock);
1159 }
1160 } else {
1161 spin_lock_irq(&md->lock);
1162 ret = __blk_end_request(req, 0, brq->data.bytes_xfered);
1163 spin_unlock_irq(&md->lock);
1164 }
1165
1166 cmd_abort: 1249 cmd_abort:
1167 spin_lock_irq(&md->lock); 1250 spin_lock_irq(&md->lock);
1168 while (ret) 1251 while (ret)