Add delay when changing drive on ide.
authorKevin O'Connor <kevin@koconnor.net>
Sun, 24 May 2009 17:55:01 +0000 (13:55 -0400)
committerKevin O'Connor <kevin@koconnor.net>
Sun, 24 May 2009 17:55:01 +0000 (13:55 -0400)
Add ndelay(400) when changing drives.

src/ata.c

index 4b329d2bcfdae81df0502f5ff0d903bfc0e5ddb5..db0996a57358afabe07da67d7d26dc8568e4a297 100644 (file)
--- a/src/ata.c
+++ b/src/ata.c
@@ -110,7 +110,7 @@ ata_reset(int driveid)
         u64 end = calc_future_tsc(IDE_TIMEOUT);
         for (;;) {
             outb(ATA_CB_DH_DEV1, iobase1 + ATA_CB_DH);
-            status = await_not_bsy(iobase1);
+            status = ndelay_await_not_bsy(iobase1);
             if (status < 0)
                 goto done;
             if (inb(iobase1 + ATA_CB_DH) == ATA_CB_DH_DEV1)
@@ -177,7 +177,7 @@ send_cmd(int driveid, struct ata_pio_command *cmd)
     outb(newdh, iobase1 + ATA_CB_DH);
     if ((olddh ^ newdh) & (1<<4)) {
         // Was a device change - wait for device to become not busy.
-        status = await_not_bsy(iobase1);
+        status = ndelay_await_not_bsy(iobase1);
         if (status < 0)
             return status;
     }
@@ -781,6 +781,7 @@ ata_detect()
             continue;
         u8 newdh = slave ? ATA_CB_DH_DEV1 : ATA_CB_DH_DEV0;
         outb(newdh, iobase1+ATA_CB_DH);
+        ndelay(400);
         status = powerup_await_non_bsy(iobase1, end);
         if (status < 0)
             continue;