Date: Fri, 6 Mar 2015 00:23:53 +0000 (UTC) From: Warner Losh <imp@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r279680 - projects/iosched/sys/cam/ata Message-ID: <201503060023.t260NrHk077147@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201503060023.t260NrHk077147>