]> err.no Git - linux-2.6/commitdiff
mmc_block: check card state after write
authorPierre Ossman <drzeus@drzeus.cx>
Fri, 2 Nov 2007 17:21:13 +0000 (18:21 +0100)
committerPierre Ossman <drzeus@drzeus.cx>
Wed, 21 Nov 2007 17:40:53 +0000 (18:40 +0100)
Some cards have been reported to signal that they're ready prematurely.
Checking both the busy bit and card state solves the issue.

Signed-off-by: Pierre Ossman <drzeus@drzeus.cx>
drivers/mmc/card/block.c

index e38d5a3b2a899d6f9988e12ad294bf47862959c6..acaa05200ae75e51ea3b28a373d46fa8c30daa40 100644 (file)
@@ -321,7 +321,13 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
                                               req->rq_disk->disk_name, err);
                                        goto cmd_err;
                                }
-                       } while (!(cmd.resp[0] & R1_READY_FOR_DATA));
+                               /*
+                                * Some cards mishandle the status bits,
+                                * so make sure to check both the busy
+                                * indication and the card state.
+                                */
+                       } while (!(cmd.resp[0] & R1_READY_FOR_DATA) ||
+                               (R1_CURRENT_STATE(cmd.resp[0]) == 7));
 
 #if 0
                        if (cmd.resp[0] & ~0x00000900)