mg_disk: fix reading invalid status when use polling driver
authorunsik Kim <donari75@gmail.com>
Tue, 28 Jul 2009 06:52:07 +0000 (08:52 +0200)
committerJens Axboe <jens.axboe@oracle.com>
Tue, 28 Jul 2009 06:52:07 +0000 (08:52 +0200)
When using polling driver, little delay is required to access
status register. Without this, host might read invalid status.

Signed-off-by: unsik Kim <donari75@gmail.com>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
drivers/block/mg_disk.c

index 5b120ea..6440d59 100644 (file)
@@ -219,6 +219,16 @@ static unsigned int mg_wait(struct mg_host *host, u32 expect, u32 msec)
        host->error = MG_ERR_NONE;
        expire = jiffies + msecs_to_jiffies(msec);
 
+       /* These 2 times dummy status read prevents reading invalid
+        * status. A very little time (3 times of mflash operating clk)
+        * is required for busy bit is set. Use dummy read instead of
+        * busy wait, because mflash's PLL is machine dependent.
+        */
+       if (prv_data->use_polling) {
+               status = inb((unsigned long)host->dev_base + MG_REG_STATUS);
+               status = inb((unsigned long)host->dev_base + MG_REG_STATUS);
+       }
+
        status = inb((unsigned long)host->dev_base + MG_REG_STATUS);
 
        do {