Skip to contentSkip to conversation

no DRQ after issuing WRITE

PATCH New Daniel Tram Lux 1 participant 1 message Dec 15, 2003

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 no DRQ after issuing WRITE

Hi,

I had the following problem:

hda: no DRQ after issuing WRITE
ide0: reset: success
hda: status timeout: status=0xd0 { Busy }

hda: no DRQ after issuing WRITE
ide0: reset: success

the following patch cured this problem...

Regards

Daniel Lux

drivers/ide/ide-iops.c 2003-12-15 19:36:02.000000000 +0100 renamed from drivers/ide/ide-iops.c 2003-10-08 21:24:04.000000000 +0200 +14 -4
@@ -645,12 +645,22 @@
        if ((stat = hwif->INB(IDE_STATUS_REG)) & BUSY_STAT) {
                local_irq_set(flags);
                timeout += jiffies;
-               while ((stat = hwif->INB(IDE_STATUS_REG)) & BUSY_STAT) {
+               stat = hwif->INB(IDE_STATUS_REG);
+               while (stat & BUSY_STAT) {
                        if (time_after(jiffies, timeout)) {
-                               local_irq_restore(flags);
-                               *startstop = DRIVER(drive)->error(drive, "status timeout", stat);
-                               return 1;
+                               /*
+                                * do one more status read in case we were interrupted between last
+                                * stat = hwif->INB(IDE_STATUS_REG) and time_after(jiffies, timeout)
+                                * in wich case the timeout might have been shorter than specified.
+                                */
+                               if ((stat = hwif->INB(IDE_STATUS_REG)) & BUSY_STAT) {
+                                       local_irq_restore(flags);
+                                       *startstop = DRIVER(drive)->error(drive, "status timeout", stat);
+                                       return 1;
+                               }
                        }
+                       else
+                               stat = hwif->INB(IDE_STATUS_REG);
                }
                local_irq_restore(flags);
        }