]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/ide/ide-probe.c
ide: enhance ide_busy_sleep()
[linux-2.6-omap-h63xx.git] / drivers / ide / ide-probe.c
index e78cfde5bd6d5303a3a15ce02bed0918682b024b..ef773384aaa9d090f49385d31a03af61a97fdf3e 100644 (file)
@@ -291,17 +291,9 @@ static int actual_try_to_identify (ide_drive_t *drive, u8 cmd)
        tp_ops->exec_command(hwif, cmd);
 
        timeout = ((cmd == ATA_CMD_ID_ATA) ? WAIT_WORSTCASE : WAIT_PIDENTIFY) / 2;
-       timeout += jiffies;
-       do {
-               if (time_after(jiffies, timeout)) {
-                       /* drive timed-out */
-                       return 1;
-               }
-               /* give drive a breather */
-               msleep(50);
-               s = use_altstatus ? tp_ops->read_altstatus(hwif)
-                                 : tp_ops->read_status(hwif);
-       } while (s & ATA_BUSY);
+
+       if (ide_busy_sleep(hwif, timeout, use_altstatus))
+               return 1;
 
        /* wait for IRQ and ATA_DRQ */
        msleep(50);
@@ -383,19 +375,21 @@ static int try_to_identify (ide_drive_t *drive, u8 cmd)
        return retval;
 }
 
-static int ide_busy_sleep(ide_hwif_t *hwif)
+int ide_busy_sleep(ide_hwif_t *hwif, unsigned long timeout, int altstatus)
 {
-       unsigned long timeout = jiffies + WAIT_WORSTCASE;
        u8 stat;
 
+       timeout += jiffies;
+
        do {
-               msleep(50);
-               stat = hwif->tp_ops->read_status(hwif);
+               msleep(50);     /* give drive a breather */
+               stat = altstatus ? hwif->tp_ops->read_altstatus(hwif)
+                                : hwif->tp_ops->read_status(hwif);
                if ((stat & ATA_BUSY) == 0)
                        return 0;
        } while (time_before(jiffies, timeout));
 
-       return 1;
+       return 1;       /* drive timed-out */
 }
 
 static u8 ide_read_device(ide_drive_t *drive)
@@ -489,7 +483,7 @@ static int do_probe (ide_drive_t *drive, u8 cmd)
                        SELECT_DRIVE(drive);
                        msleep(50);
                        tp_ops->exec_command(hwif, ATA_CMD_DEV_RESET);
-                       (void)ide_busy_sleep(hwif);
+                       (void)ide_busy_sleep(hwif, WAIT_WORSTCASE, 0);
                        rc = try_to_identify(drive, cmd);
                }
 
@@ -529,7 +523,7 @@ static void enable_nest (ide_drive_t *drive)
        msleep(50);
        tp_ops->exec_command(hwif, ATA_EXABYTE_ENABLE_NEST);
 
-       if (ide_busy_sleep(hwif)) {
+       if (ide_busy_sleep(hwif, WAIT_WORSTCASE, 0)) {
                printk(KERN_CONT "failed (timeout)\n");
                return;
        }