|
@@ -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;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -4205,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 */
|
|
|
{ }
|
|
|
};
|
|
@@ -6522,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;
|