From 93ad0d18c0ff1fb0a141bdfe66c76b7d4f922619 Mon Sep 17 00:00:00 2001 From: Jan Kloetzke Date: Sun, 5 Feb 2012 22:29:11 +0000 Subject: mmc: fix card busy polling A MMC/SD card may always go into the programming state (and hence be busy) after a block write. Therefore always check the card state, even after single block writes. On the other hand there is no need to check the card status after a read. Also make sure that errors during busy polling are propagated upwards. Signed-off-by: Jan Kloetzke Cc: Andy Fleming --- drivers/mmc/mmc.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) (limited to 'drivers') diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index 6db37b1..7b09272 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -305,11 +305,12 @@ mmc_write_blocks(struct mmc *mmc, ulong start, lbaint_t blkcnt, const void*src) printf("mmc fail to send stop cmd\n"); return 0; } - - /* Waiting for the ready status */ - mmc_send_status(mmc, timeout); } + /* Waiting for the ready status */ + if (mmc_send_status(mmc, timeout)) + return 0; + return blkcnt; } @@ -341,7 +342,6 @@ int mmc_read_blocks(struct mmc *mmc, void *dst, ulong start, lbaint_t blkcnt) { struct mmc_cmd cmd; struct mmc_data data; - int timeout = 1000; if (blkcnt > 1) cmd.cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK; @@ -373,9 +373,6 @@ int mmc_read_blocks(struct mmc *mmc, void *dst, ulong start, lbaint_t blkcnt) printf("mmc fail to send stop cmd\n"); return 0; } - - /* Waiting for the ready status */ - mmc_send_status(mmc, timeout); } return blkcnt; @@ -610,7 +607,8 @@ int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value) ret = mmc_send_cmd(mmc, &cmd, NULL); /* Waiting for the ready status */ - mmc_send_status(mmc, timeout); + if (!ret) + ret = mmc_send_status(mmc, timeout); return ret; -- cgit v1.1