diff options
author | Russell King - ARM Linux <linux@arm.linux.org.uk> | 2011-06-20 15:10:08 -0400 |
---|---|---|
committer | Chris Ball <cjb@laptop.org> | 2011-07-20 17:20:54 -0400 |
commit | 0a2d4048a22079d7e79d6654bbacbef57bd5728a (patch) | |
tree | 3de4e928e43786b215271d467e77cf6e20a2e724 /drivers/mmc/card | |
parent | 6e83e10d92e12fa0181766a1fbb00d857bfab779 (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/mmc/card')
-rw-r--r-- | drivers/mmc/card/block.c | 33 |
1 files changed, 9 insertions, 24 deletions
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index f85e42224559..3200e2ca6a9d 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 | ||
528 | static u32 get_card_status(struct mmc_card *card, struct request *req) | 528 | static 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 | ||
544 | static int mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req) | 543 | static 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) { |