Author: gonzo
Date: Fri Jan 18 04:23:52 2019
New Revision: 343129
URL: https://svnweb.freebsd.org/changeset/base/343129

Log:
  [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 <bs...@phoe.frmug.org>
  MFC after:    1 week

Modified:
  head/sys/cam/ata/ata_da.c

Modified: head/sys/cam/ata/ata_da.c
==============================================================================
--- head/sys/cam/ata/ata_da.c   Fri Jan 18 00:39:17 2019        (r343128)
+++ head/sys/cam/ata/ata_da.c   Fri Jan 18 04:23:52 2019        (r343129)
@@ -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,
@@ -543,6 +545,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
                 */
@@ -1810,6 +1820,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 *
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to