libata: don't use ap->ioaddr in non-SFF drivers
[safe/jmp/linux-2.6] / drivers / ata / libata-eh.c
index 21687bb..4ec1397 100644 (file)
@@ -2055,20 +2055,10 @@ static int ata_do_reset(struct ata_link *link, ata_reset_fn_t reset,
        if (rc)
                return rc;
 
-       /* If any class isn't ATA_DEV_UNKNOWN, consider classification
-        * is complete and convert all ATA_DEV_UNKNOWN to
-        * ATA_DEV_NONE.
-        */
+       /* convert all ATA_DEV_UNKNOWN to ATA_DEV_NONE */
        ata_link_for_each_dev(dev, link)
-               if (classes[dev->devno] != ATA_DEV_UNKNOWN)
-                       break;
-
-       if (dev) {
-               ata_link_for_each_dev(dev, link) {
-                       if (classes[dev->devno] == ATA_DEV_UNKNOWN)
-                               classes[dev->devno] = ATA_DEV_NONE;
-               }
-       }
+               if (classes[dev->devno] == ATA_DEV_UNKNOWN)
+                       classes[dev->devno] = ATA_DEV_NONE;
 
        return 0;
 }
@@ -2079,15 +2069,15 @@ static int ata_eh_followup_srst_needed(struct ata_link *link,
 {
        if (link->flags & ATA_LFLAG_NO_SRST)
                return 0;
-       if (rc == -EAGAIN)
-               return 1;
+       if (rc == -EAGAIN) {
+               if (classify)
+                       return 1;
+               rc = 0;
+       }
        if (rc != 0)
                return 0;
        if ((link->ap->flags & ATA_FLAG_PMP) && ata_is_host_link(link))
                return 1;
-       if (classify && !(link->flags & ATA_LFLAG_ASSUME_CLASS) &&
-           classes[0] == ATA_DEV_UNKNOWN)
-               return 1;
        return 0;
 }
 
@@ -2276,6 +2266,11 @@ int ata_eh_reset(struct ata_link *link, int classify,
        return rc;
 
  fail:
+       /* if SCR isn't accessible on a fan-out port, PMP needs to be reset */
+       if (!ata_is_host_link(link) &&
+           sata_scr_read(link, SCR_STATUS, &sstatus))
+               rc = -ERESTART;
+
        if (rc == -ERESTART || try >= max_tries)
                goto out;