From: Tejun Heo Date: Sun, 2 Sep 2007 14:24:48 +0000 (+0900) Subject: libata: assume ATA_DEV_ATA on diagnostic failure X-Git-Tag: v2.6.24-rc1~1391^2~63 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=d7fbee050753e153622b5d41bc8bd1cb19cda9b9;p=karo-tx-linux.git libata: assume ATA_DEV_ATA on diagnostic failure Certain device which reports diagnostic failure also reports invalid device signature. Assume ATA_DEV_ATA on diagnostic failure if reset indicates device presence. This is fix for bugzilla bug 8784. http://bugzilla.kernel.org/show_bug.cgi?id=8784 Signed-off-by: Tejun Heo Acked-by: Alan Cox Cc: Edward Amsden Signed-off-by: Jeff Garzik --- diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index ea8c07b04f29..2116f2794580 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -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; }