[PATCH] libata: use SATA speed down in ata_drive_probe_reset()
authorTejun Heo <htejun@gmail.com>
Sun, 2 Apr 2006 08:54:46 +0000 (17:54 +0900)
committerJeff Garzik <jeff@garzik.org>
Sun, 2 Apr 2006 14:02:57 +0000 (10:02 -0400)
Make ata_drive_probe_reset() use SATA SPD configuration.  Hardreset
will be force if speed renegotiation is necessary.  Also, if a
hardreset fails, PHY speed is stepped down and hardreset is retried
until the lowest speed is reached.

Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
drivers/scsi/libata-core.c

index 63488673765f1c871a15d07e7e005aa618f7eeb0..4fd24075afd2519a0c9fc03e8f8b24e3d1e178fe 100644 (file)
@@ -2578,7 +2578,7 @@ int ata_drive_probe_reset(struct ata_port *ap, ata_probeinit_fn_t probeinit,
        if (probeinit)
                probeinit(ap);
 
-       if (softreset) {
+       if (softreset && !ata_set_sata_spd_needed(ap)) {
                rc = ata_do_reset(ap, softreset, postreset, 0, classes);
                if (rc == 0 && classes[0] != ATA_DEV_UNKNOWN)
                        goto done;
@@ -2587,9 +2587,17 @@ int ata_drive_probe_reset(struct ata_port *ap, ata_probeinit_fn_t probeinit,
        if (!hardreset)
                goto done;
 
-       rc = ata_do_reset(ap, hardreset, postreset, 0, classes);
-       if (rc || classes[0] != ATA_DEV_UNKNOWN)
-               goto done;
+       while (1) {
+               rc = ata_do_reset(ap, hardreset, postreset, 0, classes);
+               if (rc == 0) {
+                       if (classes[0] != ATA_DEV_UNKNOWN)
+                               goto done;
+                       break;
+               }
+
+               if (ata_down_sata_spd_limit(ap))
+                       goto done;
+       }
 
        if (softreset)
                rc = ata_do_reset(ap, softreset, postreset, 0, classes);