aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonas Stare <jonas.stare@purplescout.se>2007-11-27 15:35:53 -0500
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2007-11-27 15:35:53 -0500
commit8266105b15192177ac732ab8a27b315dc9291100 (patch)
tree01c64979841a56b0468fb2e5f454213d91f61988
parent8ac98ce17cf318f6ceb1eb88053917001f5ca60a (diff)
ide: skip ide_wait_not_busy() on noprobe-disks
There is a problem in some hardware where the kernel will stall for 35 seconds waiting for disks that don't exist. This patch will skip waiting for the BSY-bit on IDE drives to go away if you set "hdx=noprobe" as a kernel option and the disk is not marked as 'present' (like when you set the geometry by hand). If no noprobe-option is set the code will work (more or less) as the original but if set the code will skip the ide_wait_not_busy() for that drive. Even if there would be a drive there and it is still busy afterwards it should not matter since it isn't probed for later. The code also honors the MAX_DRIVES variable instead of assuming that there will be two harddrives on the bus. Bart: minor cleanups Signed-off-by: Jonas Stare <jonas.stare@purplescout.se> CC: Andrew Morton <akpm@linux-foundation.org>, Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Alan Cox <alan@lxorguk.ukuu.org.uk> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
-rw-r--r--drivers/ide/ide-probe.c32
1 files changed, 19 insertions, 13 deletions
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c
index 56fb0b843429..ee848c705995 100644
--- a/drivers/ide/ide-probe.c
+++ b/drivers/ide/ide-probe.c
@@ -644,7 +644,7 @@ static void hwif_register (ide_hwif_t *hwif)
644 644
645static int wait_hwif_ready(ide_hwif_t *hwif) 645static int wait_hwif_ready(ide_hwif_t *hwif)
646{ 646{
647 int rc; 647 int unit, rc;
648 648
649 printk(KERN_DEBUG "Probing IDE interface %s...\n", hwif->name); 649 printk(KERN_DEBUG "Probing IDE interface %s...\n", hwif->name);
650 650
@@ -661,20 +661,26 @@ static int wait_hwif_ready(ide_hwif_t *hwif)
661 return rc; 661 return rc;
662 662
663 /* Now make sure both master & slave are ready */ 663 /* Now make sure both master & slave are ready */
664 SELECT_DRIVE(&hwif->drives[0]); 664 for (unit = 0; unit < MAX_DRIVES; unit++) {
665 hwif->OUTB(8, hwif->io_ports[IDE_CONTROL_OFFSET]); 665 ide_drive_t *drive = &hwif->drives[unit];
666 mdelay(2);
667 rc = ide_wait_not_busy(hwif, 35000);
668 if (rc)
669 return rc;
670 SELECT_DRIVE(&hwif->drives[1]);
671 hwif->OUTB(8, hwif->io_ports[IDE_CONTROL_OFFSET]);
672 mdelay(2);
673 rc = ide_wait_not_busy(hwif, 35000);
674 666
667 /* Ignore disks that we will not probe for later. */
668 if (!drive->noprobe || drive->present) {
669 SELECT_DRIVE(drive);
670 hwif->OUTB(8, hwif->io_ports[IDE_CONTROL_OFFSET]);
671 mdelay(2);
672 rc = ide_wait_not_busy(hwif, 35000);
673 if (rc)
674 goto out;
675 } else
676 printk(KERN_DEBUG "%s: ide_wait_not_busy() skipped\n",
677 drive->name);
678 }
679out:
675 /* Exit function with master reselected (let's be sane) */ 680 /* Exit function with master reselected (let's be sane) */
676 SELECT_DRIVE(&hwif->drives[0]); 681 if (unit)
677 682 SELECT_DRIVE(&hwif->drives[0]);
683
678 return rc; 684 return rc;
679} 685}
680 686