|
@@ -2,7 +2,7 @@
|
|
|
* Block driver for media (i.e., flash cards)
|
|
|
*
|
|
|
* Copyright 2002 Hewlett-Packard Company
|
|
|
- * Copyright 2005-2007 Pierre Ossman
|
|
|
+ * Copyright 2005-2008 Pierre Ossman
|
|
|
*
|
|
|
* Use consistent with the GNU GPL is permitted,
|
|
|
* provided that this copyright notice is
|
|
@@ -296,22 +296,24 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
|
|
|
|
|
|
mmc_queue_bounce_post(mq);
|
|
|
|
|
|
+ /*
|
|
|
+ * Check for errors here, but don't jump to cmd_err
|
|
|
+ * until later as we need to wait for the card to leave
|
|
|
+ * programming mode even when things go wrong.
|
|
|
+ */
|
|
|
if (brq.cmd.error) {
|
|
|
printk(KERN_ERR "%s: error %d sending read/write command\n",
|
|
|
req->rq_disk->disk_name, brq.cmd.error);
|
|
|
- goto cmd_err;
|
|
|
}
|
|
|
|
|
|
if (brq.data.error) {
|
|
|
printk(KERN_ERR "%s: error %d transferring data\n",
|
|
|
req->rq_disk->disk_name, brq.data.error);
|
|
|
- goto cmd_err;
|
|
|
}
|
|
|
|
|
|
if (brq.stop.error) {
|
|
|
printk(KERN_ERR "%s: error %d sending stop command\n",
|
|
|
req->rq_disk->disk_name, brq.stop.error);
|
|
|
- goto cmd_err;
|
|
|
}
|
|
|
|
|
|
if (!mmc_host_is_spi(card->host) && rq_data_dir(req) != READ) {
|
|
@@ -344,6 +346,9 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
+ if (brq.cmd.error || brq.data.error || brq.stop.error)
|
|
|
+ goto cmd_err;
|
|
|
+
|
|
|
/*
|
|
|
* A block was successfully transferred.
|
|
|
*/
|