libata: unify mechanism to request follow-up SRST
authorTejun Heo <htejun@gmail.com>
Mon, 7 Apr 2008 13:47:20 +0000 (22:47 +0900)
committerJeff Garzik <jgarzik@redhat.com>
Thu, 17 Apr 2008 19:44:23 +0000 (15:44 -0400)
Previously, there were two ways to trigger follow-up SRST from
hardreset method - returning -EAGAIN and leaving all device classes
unmodified.  Drivers never used the latter mechanism and the only use
case for the former was when hardreset couldn't classify.

Drop the latter mechanism and let -EAGAIN mean "perform follow-up SRST
if classification is required".  This change removes unnecessary
follow-up SRSTs and simplifies reset implementations.

Signed-off-by: Tejun Heo <htejun@gmail.com>
drivers/ata/ahci.c
drivers/ata/libata-core.c
drivers/ata/libata-eh.c
drivers/ata/libata-sff.c

index a69bcca4eb1b32c679e80cfdc4c47512d1aaab12..3071a2341be348588fd431d7ddcd41552851352a 100644 (file)
@@ -1365,7 +1365,6 @@ static int ahci_hardreset(struct ata_link *link, unsigned int *class,
 
        ahci_start_engine(ap);
 
-       *class = ATA_DEV_NONE;
        if (online)
                *class = ahci_dev_classify(ap);
 
@@ -1394,7 +1393,6 @@ static int ahci_vt8251_hardreset(struct ata_link *link, unsigned int *class,
        /* vt8251 doesn't clear BSY on signature FIS reception,
         * request follow-up softreset.
         */
-       *class = ATA_DEV_NONE;
        return online ? -EAGAIN : rc;
 }
 
@@ -1439,7 +1437,6 @@ static int ahci_p5wdh_hardreset(struct ata_link *link, unsigned int *class,
                if (rc)
                        ahci_kick_engine(ap, 0);
        }
-       *class = ATA_DEV_NONE;
        return rc;
 }
 
index 2da579b46bdda4852dd5ab96c264f183667f8aa0..51876b93c1b73f926b51cb61a3fc6fbc478b15e8 100644 (file)
@@ -3701,7 +3701,6 @@ int sata_std_hardreset(struct ata_link *link, unsigned int *class,
 
        /* do hardreset */
        rc = sata_link_hardreset(link, timing, deadline, &online, NULL);
-       *class = ATA_DEV_NONE;
        return online ? -EAGAIN : rc;
 }
 
index d8c4a45dcf26326ab7432d84f310f98df362527d..4ec1397434c00e9e5b38ea205dd8d7a291378057 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;
 }
 
index f464ca1fa261e7bd358b420853e37ad488f2e99a..5be8a6058dacbbd58098ebb1c2f64136b223d7d8 100644 (file)
@@ -1929,7 +1929,6 @@ int sata_sff_hardreset(struct ata_link *link, unsigned int *class,
 
        rc = sata_link_hardreset(link, timing, deadline, &online,
                                 ata_sff_check_ready);
-       *class = ATA_DEV_NONE;
        if (online)
                *class = ata_sff_dev_classify(link->device, 1, NULL);