SD/MMC: check the card status during erase operation
authorJerry Huang <Chang-Ming.Huang@freescale.com>
Thu, 17 May 2012 23:00:51 +0000 (23:00 +0000)
committerAndy Fleming <afleming@freescale.com>
Fri, 13 Jul 2012 22:04:50 +0000 (17:04 -0500)
Use the function 'mmc_send_status' to check the card status.
only when the card is ready, driver can send the next erase command
to the card, otherwise, the erase will failed:
=> mmc erase 0 1
MMC erase: dev # 0, block # 0, count 1 ... 1 blocks erase: OK
=> mmc erase 0 2
MMC erase: dev # 0, block # 0, count 2 ... mmc erase failed
1 blocks erase: ERROR
=> mmc erase 0 4
MMC erase: dev # 0, block # 0, count 4 ... mmc erase failed
1 blocks erase: ERROR

Signed-off-by: Jerry Huang <Chang-Ming.Huang@freescale.com>
CC: Andy Fleming <afleming@gmail.com>
CC: Marek Vasut <marex@denx.de>
Signed-off-by: Andy Fleming <afleming@freescale.com>
drivers/mmc/mmc.c

index 98e5af3ec97b888ad715d23f65d69ca624ca9a23..c1c2862986432cd3a7be6d0600d6cb094ba0f004 100644 (file)
@@ -333,6 +333,7 @@ mmc_berase(int dev_num, unsigned long start, lbaint_t blkcnt)
        int err = 0;
        struct mmc *mmc = find_mmc_device(dev_num);
        lbaint_t blk = 0, blk_r = 0;
+       int timeout = 1000;
 
        if (!mmc)
                return -1;
@@ -352,6 +353,10 @@ mmc_berase(int dev_num, unsigned long start, lbaint_t blkcnt)
                        break;
 
                blk += blk_r;
+
+               /* Waiting for the ready status */
+               if (mmc_send_status(mmc, timeout))
+                       return 0;
        }
 
        return blk;