Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 18 Jan 2019 04:23:52 +0000 (UTC)
From:      Oleksandr Tymoshenko <gonzo@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r343129 - head/sys/cam/ata
Message-ID:  <201901180423.x0I4NqL9098902@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 <bsdpr@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 *



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201901180423.x0I4NqL9098902>