[PATCH] libata: Fix a drive detection problem
authorAlan Cox <alan@lxorguk.ukuu.org.uk>
Wed, 22 Mar 2006 15:52:40 +0000 (15:52 +0000)
committerJeff Garzik <jeff@garzik.org>
Thu, 23 Mar 2006 00:55:40 +0000 (19:55 -0500)
The current code follows the spec but uses an overlong delay. This would
be great if the hardware did. Several vendors however forget the D7
pulldown. Fortunately 0xFF isnt a sane reset state so we can use it to
skip detection as is done in drivers/ide. (ie this is a tested solution
over a long time)

Signed-off-by: Alan Cox <alan@redhat.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
drivers/scsi/libata-core.c

index 5d00bb721e23bb3b5d61cb5eee71a4b7a7f74346..477afb4a925566abf05ee06d1f1f968b519f0d84 100644 (file)
@@ -2001,9 +2001,19 @@ static unsigned int ata_bus_softreset(struct ata_port *ap,
         * status is checked.  Because waiting for "a while" before
         * checking status is fine, post SRST, we perform this magic
         * delay here as well.
+        *
+        * Old drivers/ide uses the 2mS rule and then waits for ready
         */
        msleep(150);
 
+       
+       /* Before we perform post reset processing we want to see if 
+          the bus shows 0xFF because the odd clown forgets the D7 pulldown
+          resistor */
+       
+       if (ata_check_status(ap) == 0xFF)
+               return 1;       /* Positive is failure for some reason */
+
        ata_bus_post_reset(ap, devmask);
 
        return 0;