diff options
Diffstat (limited to 'drivers/ata/libata-core.c')
-rw-r--r-- | drivers/ata/libata-core.c | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 1393a5890ed5..8cb2522d592a 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -2222,6 +2222,16 @@ int ata_dev_configure(struct ata_device *dev) | |||
2222 | if (rc) | 2222 | if (rc) |
2223 | return rc; | 2223 | return rc; |
2224 | 2224 | ||
2225 | /* some WD SATA-1 drives have issues with LPM, turn on NOLPM for them */ | ||
2226 | if ((dev->horkage & ATA_HORKAGE_WD_BROKEN_LPM) && | ||
2227 | (id[ATA_ID_SATA_CAPABILITY] & 0xe) == 0x2) | ||
2228 | dev->horkage |= ATA_HORKAGE_NOLPM; | ||
2229 | |||
2230 | if (dev->horkage & ATA_HORKAGE_NOLPM) { | ||
2231 | ata_dev_warn(dev, "LPM support broken, forcing max_power\n"); | ||
2232 | dev->link->ap->target_lpm_policy = ATA_LPM_MAX_POWER; | ||
2233 | } | ||
2234 | |||
2225 | /* let ACPI work its magic */ | 2235 | /* let ACPI work its magic */ |
2226 | rc = ata_acpi_on_devcfg(dev); | 2236 | rc = ata_acpi_on_devcfg(dev); |
2227 | if (rc) | 2237 | if (rc) |
@@ -4165,6 +4175,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | |||
4165 | 4175 | ||
4166 | /* Seagate Momentus SpinPoint M8 seem to have FPMDA_AA issues */ | 4176 | /* Seagate Momentus SpinPoint M8 seem to have FPMDA_AA issues */ |
4167 | { "ST1000LM024 HN-M101MBB", "2AR10001", ATA_HORKAGE_BROKEN_FPDMA_AA }, | 4177 | { "ST1000LM024 HN-M101MBB", "2AR10001", ATA_HORKAGE_BROKEN_FPDMA_AA }, |
4178 | { "ST1000LM024 HN-M101MBB", "2BA30001", ATA_HORKAGE_BROKEN_FPDMA_AA }, | ||
4168 | 4179 | ||
4169 | /* Blacklist entries taken from Silicon Image 3124/3132 | 4180 | /* Blacklist entries taken from Silicon Image 3124/3132 |
4170 | Windows driver .inf file - also several Linux problem reports */ | 4181 | Windows driver .inf file - also several Linux problem reports */ |
@@ -4214,7 +4225,24 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | |||
4214 | 4225 | ||
4215 | /* devices that don't properly handle queued TRIM commands */ | 4226 | /* devices that don't properly handle queued TRIM commands */ |
4216 | { "Micron_M500*", NULL, ATA_HORKAGE_NO_NCQ_TRIM, }, | 4227 | { "Micron_M500*", NULL, ATA_HORKAGE_NO_NCQ_TRIM, }, |
4217 | { "Crucial_CT???M500SSD1", NULL, ATA_HORKAGE_NO_NCQ_TRIM, }, | 4228 | { "Crucial_CT???M500SSD*", NULL, ATA_HORKAGE_NO_NCQ_TRIM, }, |
4229 | |||
4230 | /* | ||
4231 | * Some WD SATA-I drives spin up and down erratically when the link | ||
4232 | * is put into the slumber mode. We don't have full list of the | ||
4233 | * affected devices. Disable LPM if the device matches one of the | ||
4234 | * known prefixes and is SATA-1. As a side effect LPM partial is | ||
4235 | * lost too. | ||
4236 | * | ||
4237 | * https://bugzilla.kernel.org/show_bug.cgi?id=57211 | ||
4238 | */ | ||
4239 | { "WDC WD800JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM }, | ||
4240 | { "WDC WD1200JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM }, | ||
4241 | { "WDC WD1600JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM }, | ||
4242 | { "WDC WD2000JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM }, | ||
4243 | { "WDC WD2500JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM }, | ||
4244 | { "WDC WD3000JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM }, | ||
4245 | { "WDC WD3200JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM }, | ||
4218 | 4246 | ||
4219 | /* End Marker */ | 4247 | /* End Marker */ |
4220 | { } | 4248 | { } |