|
@@ -751,10 +751,20 @@ unsigned int ata_dev_try_classify(struct ata_device *dev, int present,
|
|
|
/* determine if device is ATA or ATAPI */
|
|
|
class = ata_dev_classify(&tf);
|
|
|
|
|
|
- if (class == ATA_DEV_UNKNOWN)
|
|
|
- return ATA_DEV_NONE;
|
|
|
- if ((class == ATA_DEV_ATA) && (ata_chk_status(ap) == 0))
|
|
|
- return ATA_DEV_NONE;
|
|
|
+ if (class == ATA_DEV_UNKNOWN) {
|
|
|
+ /* If the device failed diagnostic, it's likely to
|
|
|
+ * have reported incorrect device signature too.
|
|
|
+ * Assume ATA device if the device seems present but
|
|
|
+ * device signature is invalid with diagnostic
|
|
|
+ * failure.
|
|
|
+ */
|
|
|
+ if (present && (dev->horkage & ATA_HORKAGE_DIAGNOSTIC))
|
|
|
+ class = ATA_DEV_ATA;
|
|
|
+ else
|
|
|
+ class = ATA_DEV_NONE;
|
|
|
+ } else if ((class == ATA_DEV_ATA) && (ata_chk_status(ap) == 0))
|
|
|
+ class = ATA_DEV_NONE;
|
|
|
+
|
|
|
return class;
|
|
|
}
|
|
|
|