[PATCH] libata: reorganize ata_bus_probe()
[linux-2.6.git] / drivers / scsi / libata-core.c
index 10803f72c57da4b0f1a8dbd3713248f251024c20..b710fc48074024e31435940477795e40bfd2eb39 100644 (file)
@@ -1211,35 +1211,40 @@ err_out_nosup:
 
 static int ata_bus_probe(struct ata_port *ap)
 {
-       unsigned int i, found = 0;
+       unsigned int classes[ATA_MAX_DEVICES];
+       unsigned int i, rc, found = 0;
 
-       if (ap->ops->probe_reset) {
-               unsigned int classes[ATA_MAX_DEVICES];
-               int rc;
-
-               ata_port_probe(ap);
+       ata_port_probe(ap);
 
+       /* reset */
+       if (ap->ops->probe_reset) {
                rc = ap->ops->probe_reset(ap, classes);
-               if (rc == 0) {
-                       for (i = 0; i < ATA_MAX_DEVICES; i++) {
-                               if (classes[i] == ATA_DEV_UNKNOWN)
-                                       classes[i] = ATA_DEV_NONE;
-                               ap->device[i].class = classes[i];
-                       }
-               } else {
-                       printk(KERN_ERR "ata%u: probe reset failed, "
-                              "disabling port\n", ap->id);
-                       ata_port_disable(ap);
+               if (rc) {
+                       printk("ata%u: reset failed (errno=%d)\n", ap->id, rc);
+                       return rc;
                }
-       } else
+
+               for (i = 0; i < ATA_MAX_DEVICES; i++)
+                       if (classes[i] == ATA_DEV_UNKNOWN)
+                               classes[i] = ATA_DEV_NONE;
+       } else {
                ap->ops->phy_reset(ap);
 
-       if (ap->flags & ATA_FLAG_PORT_DISABLED)
-               goto err_out;
+               for (i = 0; i < ATA_MAX_DEVICES; i++) {
+                       if (!(ap->flags & ATA_FLAG_PORT_DISABLED))
+                               classes[i] = ap->device[i].class;
+                       else
+                               ap->device[i].class = ATA_DEV_UNKNOWN;
+               }
+               ata_port_probe(ap);
+       }
 
+       /* read IDENTIFY page and configure devices */
        for (i = 0; i < ATA_MAX_DEVICES; i++) {
                struct ata_device *dev = &ap->device[i];
 
+               dev->class = classes[i];
+
                if (!ata_dev_present(dev))
                        continue;
 
@@ -1257,7 +1262,7 @@ static int ata_bus_probe(struct ata_port *ap)
                found = 1;
        }
 
-       if ((!found) || (ap->flags & ATA_FLAG_PORT_DISABLED))
+       if (!found)
                goto err_out_disable;
 
        ata_set_mode(ap);
@@ -1268,7 +1273,6 @@ static int ata_bus_probe(struct ata_port *ap)
 
 err_out_disable:
        ap->ops->port_disable(ap);
-err_out:
        return -1;
 }