Module Name: src Committed By: christos Date: Sun Oct 7 18:14:32 UTC 2018
Modified Files: src/sys/dev/scsipi: scsiconf.c scsipiconf.h sd.c Log Message: Handle the SATA to USB external enclosure sold by "Sabrent" and made by JMicro (vendor=0x152d product=0x0578). This bridge does not understand FUA, so add a quirk for it. To generate a diff of this commit: cvs rdiff -u -r1.281 -r1.282 src/sys/dev/scsipi/scsiconf.c cvs rdiff -u -r1.128 -r1.129 src/sys/dev/scsipi/scsipiconf.h cvs rdiff -u -r1.325 -r1.326 src/sys/dev/scsipi/sd.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/scsipi/scsiconf.c diff -u src/sys/dev/scsipi/scsiconf.c:1.281 src/sys/dev/scsipi/scsiconf.c:1.282 --- src/sys/dev/scsipi/scsiconf.c:1.281 Sat Sep 1 03:20:29 2018 +++ src/sys/dev/scsipi/scsiconf.c Sun Oct 7 14:14:32 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: scsiconf.c,v 1.281 2018/09/01 07:20:29 mlelstv Exp $ */ +/* $NetBSD: scsiconf.c,v 1.282 2018/10/07 18:14:32 christos Exp $ */ /*- * Copyright (c) 1998, 1999, 2004 The NetBSD Foundation, Inc. @@ -48,7 +48,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: scsiconf.c,v 1.281 2018/09/01 07:20:29 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: scsiconf.c,v 1.282 2018/10/07 18:14:32 christos Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -631,6 +631,8 @@ static const struct scsi_quirk_inquiry_p "" , "DFRSS2F", ""}, PQUIRK_AUTOSAVE}, {{T_DIRECT, T_FIXED, "Initio ", "", ""}, PQUIRK_NOBIGMODESENSE}, + {{T_DIRECT, T_FIXED, + "JMicron ", "Generic ", ""}, PQUIRK_NOFUA}, {{T_DIRECT, T_REMOV, "MPL ", "MC-DISK- ", ""}, PQUIRK_NOLUNS}, {{T_DIRECT, T_FIXED, Index: src/sys/dev/scsipi/scsipiconf.h diff -u src/sys/dev/scsipi/scsipiconf.h:1.128 src/sys/dev/scsipi/scsipiconf.h:1.129 --- src/sys/dev/scsipi/scsipiconf.h:1.128 Sat Sep 1 03:20:29 2018 +++ src/sys/dev/scsipi/scsipiconf.h Sun Oct 7 14:14:32 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: scsipiconf.h,v 1.128 2018/09/01 07:20:29 mlelstv Exp $ */ +/* $NetBSD: scsipiconf.h,v 1.129 2018/10/07 18:14:32 christos Exp $ */ /*- * Copyright (c) 1998, 1999, 2000, 2004 The NetBSD Foundation, Inc. @@ -478,6 +478,7 @@ struct scsipi_periph { #define PQUIRK_CAP_WIDE16 0x00100000 /* SCSI device with ST wide op*/ #define PQUIRK_CAP_NODT 0x00200000 /* signals DT, but can't. */ #define PQUIRK_START 0x00400000 /* needs start before tur */ +#define PQUIRK_NOFUA 0x00800000 /* does not grok FUA */ /* Index: src/sys/dev/scsipi/sd.c diff -u src/sys/dev/scsipi/sd.c:1.325 src/sys/dev/scsipi/sd.c:1.326 --- src/sys/dev/scsipi/sd.c:1.325 Sat Jun 17 18:35:50 2017 +++ src/sys/dev/scsipi/sd.c Sun Oct 7 14:14:32 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: sd.c,v 1.325 2017/06/17 22:35:50 mlelstv Exp $ */ +/* $NetBSD: sd.c,v 1.326 2018/10/07 18:14:32 christos Exp $ */ /*- * Copyright (c) 1998, 2003, 2004 The NetBSD Foundation, Inc. @@ -47,7 +47,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sd.c,v 1.325 2017/06/17 22:35:50 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sd.c,v 1.326 2018/10/07 18:14:32 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_scsi.h" @@ -655,6 +655,7 @@ sd_diskstart(device_t dev, struct buf *b struct scsipi_xfer *xs; int error, flags, nblks, cmdlen; int cdb_flags; + bool havefua = !(periph->periph_quirks & PQUIRK_NOFUA); mutex_enter(chan_mtx(chan)); @@ -703,12 +704,13 @@ sd_diskstart(device_t dev, struct buf *b * selection, as 6-byte CDB doesn't support the flags. */ cdb_flags = 0; + if (havefua) { + if (bp->b_flags & B_MEDIA_FUA) + cdb_flags |= SRWB_FUA; - if (bp->b_flags & B_MEDIA_FUA) - cdb_flags |= SRWB_FUA; - - if (bp->b_flags & B_MEDIA_DPO) - cdb_flags |= SRWB_DPO; + if (bp->b_flags & B_MEDIA_DPO) + cdb_flags |= SRWB_DPO; + } /* * Fill out the scsi command. Use the smallest CDB possible @@ -1846,7 +1848,8 @@ sd_getcache(struct sd_softc *sd, int *bi * Support for FUA/DPO, defined starting with SCSI-2. Use only * if device claims to support it, according to the MODE SENSE. */ - if (ISSET(dev_spec, SMH_DSP_DPOFUA)) + if (!(periph->periph_quirks & PQUIRK_NOFUA) && + ISSET(dev_spec, SMH_DSP_DPOFUA)) bits |= DKCACHE_FUA | DKCACHE_DPO; memset(&scsipi_sense, 0, sizeof(scsipi_sense));