|
@@ -2222,6 +2222,16 @@ int ata_dev_configure(struct ata_device *dev)
|
|
|
if (rc)
|
|
|
return rc;
|
|
|
|
|
|
+ /* some WD SATA-1 drives have issues with LPM, turn on NOLPM for them */
|
|
|
+ if ((dev->horkage & ATA_HORKAGE_WD_BROKEN_LPM) &&
|
|
|
+ (id[ATA_ID_SATA_CAPABILITY] & 0xe) == 0x2)
|
|
|
+ dev->horkage |= ATA_HORKAGE_NOLPM;
|
|
|
+
|
|
|
+ if (dev->horkage & ATA_HORKAGE_NOLPM) {
|
|
|
+ ata_dev_warn(dev, "LPM support broken, forcing max_power\n");
|
|
|
+ dev->link->ap->target_lpm_policy = ATA_LPM_MAX_POWER;
|
|
|
+ }
|
|
|
+
|
|
|
/* let ACPI work its magic */
|
|
|
rc = ata_acpi_on_devcfg(dev);
|
|
|
if (rc)
|
|
@@ -4216,6 +4226,23 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
|
|
|
{ "Micron_M500*", NULL, ATA_HORKAGE_NO_NCQ_TRIM, },
|
|
|
{ "Crucial_CT???M500SSD1", NULL, ATA_HORKAGE_NO_NCQ_TRIM, },
|
|
|
|
|
|
+ /*
|
|
|
+ * Some WD SATA-I drives spin up and down erratically when the link
|
|
|
+ * is put into the slumber mode. We don't have full list of the
|
|
|
+ * affected devices. Disable LPM if the device matches one of the
|
|
|
+ * known prefixes and is SATA-1. As a side effect LPM partial is
|
|
|
+ * lost too.
|
|
|
+ *
|
|
|
+ * https://bugzilla.kernel.org/show_bug.cgi?id=57211
|
|
|
+ */
|
|
|
+ { "WDC WD800JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM },
|
|
|
+ { "WDC WD1200JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM },
|
|
|
+ { "WDC WD1600JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM },
|
|
|
+ { "WDC WD2000JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM },
|
|
|
+ { "WDC WD2500JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM },
|
|
|
+ { "WDC WD3000JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM },
|
|
|
+ { "WDC WD3200JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM },
|
|
|
+
|
|
|
/* End Marker */
|
|
|
{ }
|
|
|
};
|