aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorRussell King - ARM Linux <linux@arm.linux.org.uk>2011-06-20 15:10:08 -0400
committerChris Ball <cjb@laptop.org>2011-07-20 17:20:54 -0400
commit0a2d4048a22079d7e79d6654bbacbef57bd5728a (patch)
tree3de4e928e43786b215271d467e77cf6e20a2e724 /drivers
parent6e83e10d92e12fa0181766a1fbb00d857bfab779 (diff)
mmc: block: allow get_card_status() to return error status
If the MMC_SEND_STATUS command is not successful, we should not return a zero status word, but instead allow the caller to know positively that an error occurred. Convert the open-coded get_card_status() to use the helper function, and provide definitions for the card state field. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> Acked-by: Linus Walleij <linus.walleij@linaro.org> Tested-by: Pawel Moll <pawel.moll@arm.com> Signed-off-by: Chris Ball <cjb@laptop.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/mmc/card/block.c33
1 files changed, 9 insertions, 24 deletions
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
index f85e4222455..3200e2ca6a9 100644
--- a/drivers/mmc/card/block.c
+++ b/drivers/mmc/card/block.c
@@ -525,7 +525,7 @@ static u32 mmc_sd_num_wr_blocks(struct mmc_card *card)
525 return result; 525 return result;
526} 526}
527 527
528static u32 get_card_status(struct mmc_card *card, struct request *req) 528static int get_card_status(struct mmc_card *card, u32 *status, int retries)
529{ 529{
530 struct mmc_command cmd = {0}; 530 struct mmc_command cmd = {0};
531 int err; 531 int err;
@@ -534,11 +534,10 @@ static u32 get_card_status(struct mmc_card *card, struct request *req)
534 if (!mmc_host_is_spi(card->host)) 534 if (!mmc_host_is_spi(card->host))
535 cmd.arg = card->rca << 16; 535 cmd.arg = card->rca << 16;
536 cmd.flags = MMC_RSP_SPI_R2 | MMC_RSP_R1 | MMC_CMD_AC; 536 cmd.flags = MMC_RSP_SPI_R2 | MMC_RSP_R1 | MMC_CMD_AC;
537 err = mmc_wait_for_cmd(card->host, &cmd, 0); 537 err = mmc_wait_for_cmd(card->host, &cmd, retries);
538 if (err) 538 if (err == 0)
539 printk(KERN_ERR "%s: error %d sending status command", 539 *status = cmd.resp[0];
540 req->rq_disk->disk_name, err); 540 return err;
541 return cmd.resp[0];
542} 541}
543 542
544static int mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req) 543static int mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req)
@@ -686,7 +685,6 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *req)
686 (md->flags & MMC_BLK_REL_WR); 685 (md->flags & MMC_BLK_REL_WR);
687 686
688 do { 687 do {
689 struct mmc_command cmd = {0};
690 u32 readcmd, writecmd, status = 0; 688 u32 readcmd, writecmd, status = 0;
691 689
692 memset(&brq, 0, sizeof(struct mmc_blk_request)); 690 memset(&brq, 0, sizeof(struct mmc_blk_request));
@@ -817,7 +815,7 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *req)
817 disable_multi = 1; 815 disable_multi = 1;
818 continue; 816 continue;
819 } 817 }
820 status = get_card_status(card, req); 818 get_card_status(card, &status, 0);
821 } 819 }
822 820
823 if (brq.sbc.error) { 821 if (brq.sbc.error) {
@@ -854,12 +852,7 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *req)
854 852
855 if (!mmc_host_is_spi(card->host) && rq_data_dir(req) != READ) { 853 if (!mmc_host_is_spi(card->host) && rq_data_dir(req) != READ) {
856 do { 854 do {
857 int err; 855 int err = get_card_status(card, &status, 5);
858
859 cmd.opcode = MMC_SEND_STATUS;
860 cmd.arg = card->rca << 16;
861 cmd.flags = MMC_RSP_R1 | MMC_CMD_AC;
862 err = mmc_wait_for_cmd(card->host, &cmd, 5);
863 if (err) { 856 if (err) {
864 printk(KERN_ERR "%s: error %d requesting status\n", 857 printk(KERN_ERR "%s: error %d requesting status\n",
865 req->rq_disk->disk_name, err); 858 req->rq_disk->disk_name, err);
@@ -870,16 +863,8 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *req)
870 * so make sure to check both the busy 863 * so make sure to check both the busy
871 * indication and the card state. 864 * indication and the card state.
872 */ 865 */
873 } while (!(cmd.resp[0] & R1_READY_FOR_DATA) || 866 } while (!(status & R1_READY_FOR_DATA) ||
874 (R1_CURRENT_STATE(cmd.resp[0]) == 7)); 867 (R1_CURRENT_STATE(status) == R1_STATE_PRG));
875
876#if 0
877 if (cmd.resp[0] & ~0x00000900)
878 printk(KERN_ERR "%s: status = %08x\n",
879 req->rq_disk->disk_name, cmd.resp[0]);
880 if (mmc_decode_status(cmd.resp))
881 goto cmd_err;
882#endif
883 } 868 }
884 869
885 if (brq.cmd.error || brq.stop.error || brq.data.error) { 870 if (brq.cmd.error || brq.stop.error || brq.data.error) {