|
|
@@ -2149,9 +2149,16 @@ static int ata_dev_config_ncq(struct ata_device *dev,
|
|
|
"failed to get NCQ Send/Recv Log Emask 0x%x\n",
|
|
|
err_mask);
|
|
|
} else {
|
|
|
+ u8 *cmds = dev->ncq_send_recv_cmds;
|
|
|
+
|
|
|
dev->flags |= ATA_DFLAG_NCQ_SEND_RECV;
|
|
|
- memcpy(dev->ncq_send_recv_cmds, ap->sector_buf,
|
|
|
- ATA_LOG_NCQ_SEND_RECV_SIZE);
|
|
|
+ memcpy(cmds, ap->sector_buf, ATA_LOG_NCQ_SEND_RECV_SIZE);
|
|
|
+
|
|
|
+ if (dev->horkage & ATA_HORKAGE_NO_NCQ_TRIM) {
|
|
|
+ ata_dev_dbg(dev, "disabling queued TRIM support\n");
|
|
|
+ cmds[ATA_LOG_NCQ_SEND_RECV_DSM_OFFSET] &=
|
|
|
+ ~ATA_LOG_NCQ_SEND_RECV_DSM_TRIM;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -4156,6 +4163,9 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
|
|
|
{ "ST3320[68]13AS", "SD1[5-9]", ATA_HORKAGE_NONCQ |
|
|
|
ATA_HORKAGE_FIRMWARE_WARN },
|
|
|
|
|
|
+ /* Seagate Momentus SpinPoint M8 seem to have FPMDA_AA issues */
|
|
|
+ { "ST1000LM024 HN-M101MBB", "2AR10001", ATA_HORKAGE_BROKEN_FPDMA_AA },
|
|
|
+
|
|
|
/* Blacklist entries taken from Silicon Image 3124/3132
|
|
|
Windows driver .inf file - also several Linux problem reports */
|
|
|
{ "HTS541060G9SA00", "MB3OC60D", ATA_HORKAGE_NONCQ, },
|
|
|
@@ -4202,6 +4212,10 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
|
|
|
{ "PIONEER DVD-RW DVR-212D", NULL, ATA_HORKAGE_NOSETXFER },
|
|
|
{ "PIONEER DVD-RW DVR-216D", NULL, ATA_HORKAGE_NOSETXFER },
|
|
|
|
|
|
+ /* devices that don't properly handle queued TRIM commands */
|
|
|
+ { "Micron_M500*", NULL, ATA_HORKAGE_NO_NCQ_TRIM, },
|
|
|
+ { "Crucial_CT???M500SSD1", NULL, ATA_HORKAGE_NO_NCQ_TRIM, },
|
|
|
+
|
|
|
/* End Marker */
|
|
|
{ }
|
|
|
};
|
|
|
@@ -6519,6 +6533,7 @@ static int __init ata_parse_force_one(char **cur,
|
|
|
{ "norst", .lflags = ATA_LFLAG_NO_HRST | ATA_LFLAG_NO_SRST },
|
|
|
{ "rstonce", .lflags = ATA_LFLAG_RST_ONCE },
|
|
|
{ "atapi_dmadir", .horkage_on = ATA_HORKAGE_ATAPI_DMADIR },
|
|
|
+ { "disable", .horkage_on = ATA_HORKAGE_DISABLE },
|
|
|
};
|
|
|
char *start = *cur, *p = *cur;
|
|
|
char *id, *val, *endp;
|