From owner-svn-src-projects@FreeBSD.ORG Fri Mar 6 00:23:53 2015 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id C98F8287; Fri, 6 Mar 2015 00:23:53 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id AA4BEF36; Fri, 6 Mar 2015 00:23:53 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id t260NrBS077148; Fri, 6 Mar 2015 00:23:53 GMT (envelope-from imp@FreeBSD.org) Received: (from imp@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id t260NrHk077147; Fri, 6 Mar 2015 00:23:53 GMT (envelope-from imp@FreeBSD.org) Message-Id: <201503060023.t260NrHk077147@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: imp set sender to imp@FreeBSD.org using -f From: Warner Losh Date: Fri, 6 Mar 2015 00:23:53 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r279680 - projects/iosched/sys/cam/ata X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 06 Mar 2015 00:23:54 -0000 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)