|
@@ -2783,6 +2783,12 @@ static int ata_eh_revalidate_and_attach(struct ata_link *link,
|
|
|
} else if (dev->class == ATA_DEV_UNKNOWN &&
|
|
|
ehc->tries[dev->devno] &&
|
|
|
ata_class_enabled(ehc->classes[dev->devno])) {
|
|
|
+ /* Temporarily set dev->class, it will be
|
|
|
+ * permanently set once all configurations are
|
|
|
+ * complete. This is necessary because new
|
|
|
+ * device configuration is done in two
|
|
|
+ * separate loops.
|
|
|
+ */
|
|
|
dev->class = ehc->classes[dev->devno];
|
|
|
|
|
|
if (dev->class == ATA_DEV_PMP)
|
|
@@ -2790,6 +2796,11 @@ static int ata_eh_revalidate_and_attach(struct ata_link *link,
|
|
|
else
|
|
|
rc = ata_dev_read_id(dev, &dev->class,
|
|
|
readid_flags, dev->id);
|
|
|
+
|
|
|
+ /* read_id might have changed class, store and reset */
|
|
|
+ ehc->classes[dev->devno] = dev->class;
|
|
|
+ dev->class = ATA_DEV_UNKNOWN;
|
|
|
+
|
|
|
switch (rc) {
|
|
|
case 0:
|
|
|
/* clear error info accumulated during probe */
|
|
@@ -2799,13 +2810,11 @@ static int ata_eh_revalidate_and_attach(struct ata_link *link,
|
|
|
case -ENOENT:
|
|
|
/* IDENTIFY was issued to non-existent
|
|
|
* device. No need to reset. Just
|
|
|
- * thaw and kill the device.
|
|
|
+ * thaw and ignore the device.
|
|
|
*/
|
|
|
ata_eh_thaw_port(ap);
|
|
|
- dev->class = ATA_DEV_UNKNOWN;
|
|
|
break;
|
|
|
default:
|
|
|
- dev->class = ATA_DEV_UNKNOWN;
|
|
|
goto err;
|
|
|
}
|
|
|
}
|
|
@@ -2826,11 +2835,15 @@ static int ata_eh_revalidate_and_attach(struct ata_link *link,
|
|
|
dev->class == ATA_DEV_PMP)
|
|
|
continue;
|
|
|
|
|
|
+ dev->class = ehc->classes[dev->devno];
|
|
|
+
|
|
|
ehc->i.flags |= ATA_EHI_PRINTINFO;
|
|
|
rc = ata_dev_configure(dev);
|
|
|
ehc->i.flags &= ~ATA_EHI_PRINTINFO;
|
|
|
- if (rc)
|
|
|
+ if (rc) {
|
|
|
+ dev->class = ATA_DEV_UNKNOWN;
|
|
|
goto err;
|
|
|
+ }
|
|
|
|
|
|
spin_lock_irqsave(ap->lock, flags);
|
|
|
ap->pflags |= ATA_PFLAG_SCSI_HOTPLUG;
|