diff options
author | Jiri Kosina <jkosina@suse.cz> | 2014-02-20 08:54:28 -0500 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2014-02-20 08:54:28 -0500 |
commit | d4263348f796f29546f90802177865dd4379dd0a (patch) | |
tree | adcbdaebae584eee2f32fab95e826e8e49eef385 /drivers/ata/libata-core.c | |
parent | be873ac782f5ff5ee6675f83929f4fe6737eead2 (diff) | |
parent | 6d0abeca3242a88cab8232e4acd7e2bf088f3bc2 (diff) |
Merge branch 'master' into for-next
Diffstat (limited to 'drivers/ata/libata-core.c')
-rw-r--r-- | drivers/ata/libata-core.c | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 1274720e6bb9..a440958d34e4 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -2149,9 +2149,16 @@ static int ata_dev_config_ncq(struct ata_device *dev, | |||
2149 | "failed to get NCQ Send/Recv Log Emask 0x%x\n", | 2149 | "failed to get NCQ Send/Recv Log Emask 0x%x\n", |
2150 | err_mask); | 2150 | err_mask); |
2151 | } else { | 2151 | } else { |
2152 | u8 *cmds = dev->ncq_send_recv_cmds; | ||
2153 | |||
2152 | dev->flags |= ATA_DFLAG_NCQ_SEND_RECV; | 2154 | dev->flags |= ATA_DFLAG_NCQ_SEND_RECV; |
2153 | memcpy(dev->ncq_send_recv_cmds, ap->sector_buf, | 2155 | memcpy(cmds, ap->sector_buf, ATA_LOG_NCQ_SEND_RECV_SIZE); |
2154 | ATA_LOG_NCQ_SEND_RECV_SIZE); | 2156 | |
2157 | if (dev->horkage & ATA_HORKAGE_NO_NCQ_TRIM) { | ||
2158 | ata_dev_dbg(dev, "disabling queued TRIM support\n"); | ||
2159 | cmds[ATA_LOG_NCQ_SEND_RECV_DSM_OFFSET] &= | ||
2160 | ~ATA_LOG_NCQ_SEND_RECV_DSM_TRIM; | ||
2161 | } | ||
2155 | } | 2162 | } |
2156 | } | 2163 | } |
2157 | 2164 | ||
@@ -2215,6 +2222,16 @@ int ata_dev_configure(struct ata_device *dev) | |||
2215 | if (rc) | 2222 | if (rc) |
2216 | return rc; | 2223 | return rc; |
2217 | 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 | |||
2218 | /* let ACPI work its magic */ | 2235 | /* let ACPI work its magic */ |
2219 | rc = ata_acpi_on_devcfg(dev); | 2236 | rc = ata_acpi_on_devcfg(dev); |
2220 | if (rc) | 2237 | if (rc) |
@@ -4156,6 +4173,9 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | |||
4156 | { "ST3320[68]13AS", "SD1[5-9]", ATA_HORKAGE_NONCQ | | 4173 | { "ST3320[68]13AS", "SD1[5-9]", ATA_HORKAGE_NONCQ | |
4157 | ATA_HORKAGE_FIRMWARE_WARN }, | 4174 | ATA_HORKAGE_FIRMWARE_WARN }, |
4158 | 4175 | ||
4176 | /* Seagate Momentus SpinPoint M8 seem to have FPMDA_AA issues */ | ||
4177 | { "ST1000LM024 HN-M101MBB", "2AR10001", ATA_HORKAGE_BROKEN_FPDMA_AA }, | ||
4178 | |||
4159 | /* Blacklist entries taken from Silicon Image 3124/3132 | 4179 | /* Blacklist entries taken from Silicon Image 3124/3132 |
4160 | Windows driver .inf file - also several Linux problem reports */ | 4180 | Windows driver .inf file - also several Linux problem reports */ |
4161 | { "HTS541060G9SA00", "MB3OC60D", ATA_HORKAGE_NONCQ, }, | 4181 | { "HTS541060G9SA00", "MB3OC60D", ATA_HORKAGE_NONCQ, }, |
@@ -4202,6 +4222,27 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | |||
4202 | { "PIONEER DVD-RW DVR-212D", NULL, ATA_HORKAGE_NOSETXFER }, | 4222 | { "PIONEER DVD-RW DVR-212D", NULL, ATA_HORKAGE_NOSETXFER }, |
4203 | { "PIONEER DVD-RW DVR-216D", NULL, ATA_HORKAGE_NOSETXFER }, | 4223 | { "PIONEER DVD-RW DVR-216D", NULL, ATA_HORKAGE_NOSETXFER }, |
4204 | 4224 | ||
4225 | /* devices that don't properly handle queued TRIM commands */ | ||
4226 | { "Micron_M500*", NULL, ATA_HORKAGE_NO_NCQ_TRIM, }, | ||
4227 | { "Crucial_CT???M500SSD1", NULL, ATA_HORKAGE_NO_NCQ_TRIM, }, | ||
4228 | |||
4229 | /* | ||
4230 | * Some WD SATA-I drives spin up and down erratically when the link | ||
4231 | * is put into the slumber mode. We don't have full list of the | ||
4232 | * affected devices. Disable LPM if the device matches one of the | ||
4233 | * known prefixes and is SATA-1. As a side effect LPM partial is | ||
4234 | * lost too. | ||
4235 | * | ||
4236 | * https://bugzilla.kernel.org/show_bug.cgi?id=57211 | ||
4237 | */ | ||
4238 | { "WDC WD800JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM }, | ||
4239 | { "WDC WD1200JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM }, | ||
4240 | { "WDC WD1600JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM }, | ||
4241 | { "WDC WD2000JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM }, | ||
4242 | { "WDC WD2500JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM }, | ||
4243 | { "WDC WD3000JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM }, | ||
4244 | { "WDC WD3200JD-*", NULL, ATA_HORKAGE_WD_BROKEN_LPM }, | ||
4245 | |||
4205 | /* End Marker */ | 4246 | /* End Marker */ |
4206 | { } | 4247 | { } |
4207 | }; | 4248 | }; |
@@ -6519,6 +6560,7 @@ static int __init ata_parse_force_one(char **cur, | |||
6519 | { "norst", .lflags = ATA_LFLAG_NO_HRST | ATA_LFLAG_NO_SRST }, | 6560 | { "norst", .lflags = ATA_LFLAG_NO_HRST | ATA_LFLAG_NO_SRST }, |
6520 | { "rstonce", .lflags = ATA_LFLAG_RST_ONCE }, | 6561 | { "rstonce", .lflags = ATA_LFLAG_RST_ONCE }, |
6521 | { "atapi_dmadir", .horkage_on = ATA_HORKAGE_ATAPI_DMADIR }, | 6562 | { "atapi_dmadir", .horkage_on = ATA_HORKAGE_ATAPI_DMADIR }, |
6563 | { "disable", .horkage_on = ATA_HORKAGE_DISABLE }, | ||
6522 | }; | 6564 | }; |
6523 | char *start = *cur, *p = *cur; | 6565 | char *start = *cur, *p = *cur; |
6524 | char *id, *val, *endp; | 6566 | char *id, *val, *endp; |