svn commit: r343725 - stable/12/sys/cam/ata
Oleksandr Tymoshenko
gonzo at FreeBSD.org
Sun Feb 3 22:45:51 UTC 2019
Author: gonzo
Date: Sun Feb 3 22:45:50 2019
New Revision: 343725
URL: https://svnweb.freebsd.org/changeset/base/343725
Log:
MFC r343129:
[ata] Add workaround for KingDian S200 SSD crash on receiving TRIM command
- Add ADA_Q_NO_TRIM quirk to be used with the device that falsely advertise TRIM support
- Add ADA_Q_NO_TRIM entry for KingDian S200 SSD
PR: 222802
Submitted by: Bertrand Petit <bsdpr at phoe.frmug.org>
Modified:
stable/12/sys/cam/ata/ata_da.c
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/sys/cam/ata/ata_da.c
==============================================================================
--- stable/12/sys/cam/ata/ata_da.c Sun Feb 3 21:31:40 2019 (r343724)
+++ stable/12/sys/cam/ata/ata_da.c Sun Feb 3 22:45:50 2019 (r343725)
@@ -118,7 +118,8 @@ typedef enum {
ADA_Q_4K = 0x01,
ADA_Q_NCQ_TRIM_BROKEN = 0x02,
ADA_Q_LOG_BROKEN = 0x04,
- ADA_Q_SMR_DM = 0x08
+ ADA_Q_SMR_DM = 0x08,
+ ADA_Q_NO_TRIM = 0x10
} ada_quirks;
#define ADA_Q_BIT_STRING \
@@ -126,7 +127,8 @@ typedef enum {
"\0014K" \
"\002NCQ_TRIM_BROKEN" \
"\003LOG_BROKEN" \
- "\004SMR_DM"
+ "\004SMR_DM" \
+ "\005NO_TRIM"
typedef enum {
ADA_CCB_RAHEAD = 0x01,
@@ -540,6 +542,14 @@ static struct ada_quirk_entry ada_quirk_table[] =
},
{
/*
+ * KingDian S200 60GB P0921B
+ * Trimming crash the SSD
+ */
+ { T_DIRECT, SIP_MEDIA_FIXED, "*", "KingDian S200 *", "*" },
+ /*quirks*/ADA_Q_NO_TRIM
+ },
+ {
+ /*
* Kingston E100 Series SSDs
* 4k optimised & trim only works in 4k requests + 4k aligned
*/
@@ -1796,6 +1806,10 @@ adaregister(struct cam_periph *periph, void *arg)
softc->disk->d_flags = DISKFLAG_DIRECT_COMPLETION | DISKFLAG_CANZONE;
if (softc->flags & ADA_FLAG_CAN_FLUSHCACHE)
softc->disk->d_flags |= DISKFLAG_CANFLUSHCACHE;
+ /* Device lies about TRIM capability. */
+ if ((softc->quirks & ADA_Q_NO_TRIM) &&
+ (softc->flags & ADA_FLAG_CAN_TRIM))
+ softc->flags &= ~ADA_FLAG_CAN_TRIM;
if (softc->flags & ADA_FLAG_CAN_TRIM) {
softc->disk->d_flags |= DISKFLAG_CANDELETE;
softc->disk->d_delmaxsize = softc->params.secsize *
More information about the svn-src-all
mailing list