Re: IDE DMA/irq timeouts

Alan Cox (alan@lxorguk.ukuu.org.uk)
Thu, 23 Sep 1999 17:34:39 +0100 (BST)


> To clarify: we didn't experience the ide bus resets on 2.2.9 and below,
> but we do on 2.2.10 and above.

Ok the only IDE change that should matter after 2.2.10 is the one attached
below. If so then 2.2.12 with that patch reversed should behave

> Both were built with CONFIG_IDEDMA_AUTO. Previous kernels to 2.2.10 were
> also built with this option.

Ok

Alan

diff -u --recursive --new-file v2.2.9/linux/drivers/block/ide.c linux/drivers/block/ide.c
--- v2.2.9/linux/drivers/block/ide.c Thu May 13 23:10:29 1999
+++ linux/drivers/block/ide.c Sun Jun 13 10:40:27 1999
@@ -926,6 +927,7 @@
int ide_wait_stat (ide_drive_t *drive, byte good, byte bad, unsigned long timeout)
{
byte stat;
+ int i;
unsigned long flags;

udelay(1); /* spec allows drive 400ns to assert "BUSY" */
@@ -942,9 +944,18 @@
}
__restore_flags(flags); /* local CPU only */
}
- udelay(1); /* allow status to settle, then read it again */
- if (OK_STAT((stat = GET_STAT()), good, bad))
- return 0;
+ /*
+ * Allow status to settle, then read it again.
+ * A few rare drives vastly violate the 400ns spec here,
+ * so we'll wait up to 10usec for a "good" status
+ * rather than expensively fail things immediately.
+ * This fix courtesy of Matthew Faupel & Niccolo Rigacci.
+ */
+ for (i = 0; i < 10; i++) {
+ udelay(1);
+ if (OK_STAT((stat = GET_STAT()), good, bad))
+ return 0;
+ }
ide_error(drive, "status error", stat);
return 1;
}

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/