svn commit: r279680 - projects/iosched/sys/cam/ata

Warner Losh imp at FreeBSD.org
Fri Mar 6 00:23:54 UTC 2015


Author: imp
Date: Fri Mar  6 00:23:52 2015
New Revision: 279680
URL: https://svnweb.freebsd.org/changeset/base/279680

Log:
  Don't automatically set NCQ DSM TRIM as the delete method. Allow the
  user to set this via sysctl (tested) or tunable (not tested). Fix
  minor issue with knowing if the SIM supports the kludge or not while
  I'm here.

Modified:
  projects/iosched/sys/cam/ata/ata_da.c

Modified: projects/iosched/sys/cam/ata/ata_da.c
==============================================================================
--- projects/iosched/sys/cam/ata/ata_da.c	Fri Mar  6 00:23:38 2015	(r279679)
+++ projects/iosched/sys/cam/ata/ata_da.c	Fri Mar  6 00:23:52 2015	(r279680)
@@ -88,7 +88,8 @@ typedef enum {
 	ADA_FLAG_CAN_POWERMGT   = 0x0800,
 	ADA_FLAG_CAN_DMA48	= 0x1000,
 	ADA_FLAG_DIRTY		= 0x2000,
-	ADA_FLAG_CAN_NCQ_TRIM	= 0x4000	/* CAN_TRIM also set */
+	ADA_FLAG_CAN_NCQ_TRIM	= 0x4000,	/* CAN_TRIM also set */
+	ADA_FLAG_PIM_CAN_NCQ_TRIM = 0x8000
 } ada_flags;
 
 typedef enum {
@@ -977,9 +978,16 @@ static void
 adasetdeletemethod(struct ada_softc *softc)
 {
 
+#if 0
+	/*
+	 * Don't set NCQ_DSM_TRIM method by default. It is currently
+	 * a "feature of interest" implicated in some data corruption.
+	 */
 	if (softc->flags & ADA_FLAG_CAN_NCQ_TRIM)
 		softc->delete_method = ADA_DELETE_NCQ_DSM_TRIM;
-	else if (softc->flags & ADA_FLAG_CAN_TRIM)
+	else
+#endif
+	if (softc->flags & ADA_FLAG_CAN_TRIM)
 		softc->delete_method = ADA_DELETE_DSM_TRIM;
 	else if ((softc->flags & ADA_FLAG_CAN_CFA) && !(softc->flags & ADA_FLAG_CAN_48BIT))
 		softc->delete_method = ADA_DELETE_CFA_ERASE;
@@ -1052,6 +1060,7 @@ adaasync(void *callback_arg, u_int32_t c
 			softc->flags |= ADA_FLAG_CAN_NCQ;
 		else
 			softc->flags &= ~ADA_FLAG_CAN_NCQ;
+
 		if ((cgd.ident_data.support_dsm & ATA_SUPPORT_DSM_TRIM) &&
 		    (cgd.inq_flags & SID_DMA)) {
 			softc->flags |= ADA_FLAG_CAN_TRIM;
@@ -1061,7 +1070,7 @@ adaasync(void *callback_arg, u_int32_t c
 			 * the sim do do things properly. Perhaps we should look at log 13
 			 * dword 0 bit 0 and dword 1 bit 0 are set too...
 			 */
-			if (/* (cpi.hba_misc & PIM_NCQ_KLUDGE) != 0 && */ /* Don't know how to do this here */
+			if ((softc->flags & ADA_FLAG_PIM_CAN_NCQ_TRIM) != 0 &&
 			    (cgd.ident_data.satacapabilities2 & ATA_SUPPORT_RCVSND_FPDMA_QUEUED) != 0 &&
 			    (softc->flags & ADA_FLAG_CAN_TRIM) != 0)
 				softc->flags |= ADA_FLAG_CAN_NCQ_TRIM;
@@ -1069,8 +1078,8 @@ adaasync(void *callback_arg, u_int32_t c
 				softc->flags &= ~ADA_FLAG_CAN_NCQ_TRIM;
 		} else
 			softc->flags &= ~(ADA_FLAG_CAN_TRIM | ADA_FLAG_CAN_NCQ_TRIM);
-
 		adasetdeletemethod(softc);
+
 		cam_periph_async(periph, code, path, arg);
 		break;
 	}
@@ -1390,7 +1399,9 @@ adaregister(struct cam_periph *periph, v
 	 * the sim do do things properly. Perhaps we should look at log 13
 	 * dword 0 bit 0 and dword 1 bit 0 are set too...
 	 */
-	if ((cpi.hba_misc & PIM_NCQ_KLUDGE) != 0 &&
+	if (cpi.hba_misc & PIM_NCQ_KLUDGE)
+		softc->flags |= ADA_FLAG_PIM_CAN_NCQ_TRIM;
+	if ((softc->flags & ADA_FLAG_PIM_CAN_NCQ_TRIM) != 0 &&
 	    (cgd->ident_data.satacapabilities2 &
 		ATA_SUPPORT_RCVSND_FPDMA_QUEUED) != 0 &&
 	    (softc->flags & ADA_FLAG_CAN_TRIM) != 0)


More information about the svn-src-projects mailing list