Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8266105b authored by Jonas Stare's avatar Jonas Stare Committed by Bartlomiej Zolnierkiewicz
Browse files

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: default avatarJonas 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: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent 8ac98ce1
Loading
Loading
Loading
Loading
+19 −13
Original line number Diff line number Diff line
@@ -644,7 +644,7 @@ static void hwif_register (ide_hwif_t *hwif)

static int wait_hwif_ready(ide_hwif_t *hwif)
{
	int rc;
	int unit, rc;

	printk(KERN_DEBUG "Probing IDE interface %s...\n", hwif->name);

@@ -661,18 +661,24 @@ static int wait_hwif_ready(ide_hwif_t *hwif)
		return rc;

	/* Now make sure both master & slave are ready */
	SELECT_DRIVE(&hwif->drives[0]);
	for (unit = 0; unit < MAX_DRIVES; unit++) {
		ide_drive_t *drive = &hwif->drives[unit];

		/* Ignore disks that we will not probe for later. */
		if (!drive->noprobe || drive->present) {
			SELECT_DRIVE(drive);
			hwif->OUTB(8, hwif->io_ports[IDE_CONTROL_OFFSET]);
			mdelay(2);
			rc = ide_wait_not_busy(hwif, 35000);
			if (rc)
		return rc;
	SELECT_DRIVE(&hwif->drives[1]);
	hwif->OUTB(8, hwif->io_ports[IDE_CONTROL_OFFSET]);
	mdelay(2);
	rc = ide_wait_not_busy(hwif, 35000);

				goto out;
		} else
			printk(KERN_DEBUG "%s: ide_wait_not_busy() skipped\n",
					  drive->name);
	}
out:
	/* Exit function with master reselected (let's be sane) */
	if (unit)
		SELECT_DRIVE(&hwif->drives[0]);

	return rc;