svn commit: r242821 - in stable/9/sys/dev/usb: . quirk storage
Hans Petter Selasky
hselasky at FreeBSD.org
Fri Nov 9 07:12:32 UTC 2012
Author: hselasky
Date: Fri Nov 9 07:12:31 2012
New Revision: 242821
URL: http://svnweb.freebsd.org/changeset/base/242821
Log:
MFC r241432, r242628 and r242364:
Remove ancient mass storage gone checks.
Add some more mass storage related quirks.
Improve auto-quirk detection for mass storage devices.
Modified:
stable/9/sys/dev/usb/quirk/usb_quirk.c
stable/9/sys/dev/usb/quirk/usb_quirk.h
stable/9/sys/dev/usb/storage/umass.c
stable/9/sys/dev/usb/usb_msctest.c
stable/9/sys/dev/usb/usbdevs
Directory Properties:
stable/9/sys/ (props changed)
stable/9/sys/dev/ (props changed)
Modified: stable/9/sys/dev/usb/quirk/usb_quirk.c
==============================================================================
--- stable/9/sys/dev/usb/quirk/usb_quirk.c Fri Nov 9 07:05:28 2012 (r242820)
+++ stable/9/sys/dev/usb/quirk/usb_quirk.c Fri Nov 9 07:12:31 2012 (r242821)
@@ -390,6 +390,7 @@ static struct usb_quirk_entry usb_quirks
UQ_MSC_FORCE_PROTO_SCSI, UQ_MSC_NO_GETMAXLUN),
USB_QUIRK(SONY, PORTABLE_HDD_V2, 0x0000, 0xffff, UQ_MSC_FORCE_WIRE_BBB,
UQ_MSC_FORCE_PROTO_SCSI),
+ USB_QUIRK(STMICRO, ST72682, 0x0000, 0xffff, UQ_MSC_NO_PREVENT_ALLOW),
USB_QUIRK(SUPERTOP, IDE, 0x0000, 0xffff, UQ_MSC_IGNORE_RESIDUE,
UQ_MSC_NO_SYNC_CACHE),
USB_QUIRK(TAUGA, CAMERAMATE, 0x0000, 0xffff, UQ_MSC_FORCE_PROTO_SCSI),
@@ -517,6 +518,7 @@ static const char *usb_quirk_str[USB_QUI
[UQ_MSC_NO_GETMAXLUN] = "UQ_MSC_NO_GETMAXLUN",
[UQ_MSC_NO_INQUIRY] = "UQ_MSC_NO_INQUIRY",
[UQ_MSC_NO_INQUIRY_EVPD] = "UQ_MSC_NO_INQUIRY_EVPD",
+ [UQ_MSC_NO_PREVENT_ALLOW] = "UQ_MSC_NO_PREVENT_ALLOW",
[UQ_MSC_NO_SYNC_CACHE] = "UQ_MSC_NO_SYNC_CACHE",
[UQ_MSC_SHUTTLE_INIT] = "UQ_MSC_SHUTTLE_INIT",
[UQ_MSC_ALT_IFACE_1] = "UQ_MSC_ALT_IFACE_1",
Modified: stable/9/sys/dev/usb/quirk/usb_quirk.h
==============================================================================
--- stable/9/sys/dev/usb/quirk/usb_quirk.h Fri Nov 9 07:05:28 2012 (r242820)
+++ stable/9/sys/dev/usb/quirk/usb_quirk.h Fri Nov 9 07:12:31 2012 (r242821)
@@ -75,6 +75,7 @@ enum {
UQ_MSC_NO_GETMAXLUN, /* does not support get max LUN */
UQ_MSC_NO_INQUIRY, /* fake generic inq response */
UQ_MSC_NO_INQUIRY_EVPD, /* does not support inq EVPD */
+ UQ_MSC_NO_PREVENT_ALLOW, /* does not support medium removal */
UQ_MSC_NO_SYNC_CACHE, /* does not support sync cache */
UQ_MSC_SHUTTLE_INIT, /* requires Shuttle init sequence */
UQ_MSC_ALT_IFACE_1, /* switch to alternate interface 1 */
Modified: stable/9/sys/dev/usb/storage/umass.c
==============================================================================
--- stable/9/sys/dev/usb/storage/umass.c Fri Nov 9 07:05:28 2012 (r242820)
+++ stable/9/sys/dev/usb/storage/umass.c Fri Nov 9 07:12:31 2012 (r242821)
@@ -174,8 +174,6 @@ TUNABLE_INT("hw.usb.umass.debug", &umass
#define DPRINTF(...) do { } while (0)
#endif
-#define UMASS_GONE ((struct umass_softc *)1)
-
#define UMASS_BULK_SIZE (1 << 17)
#define UMASS_CBI_DIAGNOSTIC_CMDLEN 12 /* bytes */
#define UMASS_MAX_CMDLEN MAX(12, CAM_MAX_CDBLEN) /* bytes */
@@ -363,6 +361,8 @@ typedef uint8_t (umass_transform_t)(stru
* result.
*/
#define NO_SYNCHRONIZE_CACHE 0x4000
+ /* Device does not support 'PREVENT/ALLOW MEDIUM REMOVAL'. */
+#define NO_PREVENT_ALLOW 0x8000
struct umass_softc {
@@ -833,6 +833,8 @@ umass_probe_proto(device_t dev, struct u
quirks |= NO_INQUIRY;
if (usb_test_quirk(uaa, UQ_MSC_NO_INQUIRY_EVPD))
quirks |= NO_INQUIRY_EVPD;
+ if (usb_test_quirk(uaa, UQ_MSC_NO_PREVENT_ALLOW))
+ quirks |= NO_PREVENT_ALLOW;
if (usb_test_quirk(uaa, UQ_MSC_NO_SYNC_CACHE))
quirks |= NO_SYNCHRONIZE_CACHE;
if (usb_test_quirk(uaa, UQ_MSC_SHUTTLE_INIT))
@@ -2108,7 +2110,7 @@ umass_cam_detach_sim(struct umass_softc
if (sc->sc_sim != NULL) {
if (xpt_bus_deregister(cam_sim_path(sc->sc_sim))) {
/* accessing the softc is not possible after this */
- sc->sc_sim->softc = UMASS_GONE;
+ sc->sc_sim->softc = NULL;
cam_sim_free(sc->sc_sim, /* free_devq */ TRUE);
} else {
panic("%s: CAM layer is busy\n",
@@ -2127,63 +2129,11 @@ umass_cam_action(struct cam_sim *sim, un
{
struct umass_softc *sc = (struct umass_softc *)sim->softc;
- if (sc == UMASS_GONE ||
- (sc != NULL && !usbd_device_attached(sc->sc_udev))) {
+ if (sc == NULL) {
ccb->ccb_h.status = CAM_SEL_TIMEOUT;
xpt_done(ccb);
return;
}
- /*
- * Verify, depending on the operation to perform, that we either got
- * a valid sc, because an existing target was referenced, or
- * otherwise the SIM is addressed.
- *
- * This avoids bombing out at a printf and does give the CAM layer some
- * sensible feedback on errors.
- */
- switch (ccb->ccb_h.func_code) {
- case XPT_SCSI_IO:
- case XPT_RESET_DEV:
- case XPT_GET_TRAN_SETTINGS:
- case XPT_SET_TRAN_SETTINGS:
- case XPT_CALC_GEOMETRY:
- /* the opcodes requiring a target. These should never occur. */
- if (sc == NULL) {
- DPRINTF(sc, UDMASS_GEN, "%s:%d:%d:%d:func_code 0x%04x: "
- "Invalid target (target needed)\n",
- DEVNAME_SIM, cam_sim_path(sc->sc_sim),
- ccb->ccb_h.target_id, ccb->ccb_h.target_lun,
- ccb->ccb_h.func_code);
-
- ccb->ccb_h.status = CAM_TID_INVALID;
- xpt_done(ccb);
- goto done;
- }
- break;
- case XPT_PATH_INQ:
- case XPT_NOOP:
- /*
- * The opcodes sometimes aimed at a target (sc is valid),
- * sometimes aimed at the SIM (sc is invalid and target is
- * CAM_TARGET_WILDCARD)
- */
- if ((sc == NULL) &&
- (ccb->ccb_h.target_id != CAM_TARGET_WILDCARD)) {
- DPRINTF(sc, UDMASS_SCSI, "%s:%d:%d:%d:func_code 0x%04x: "
- "Invalid target (no wildcard)\n",
- DEVNAME_SIM, cam_sim_path(sc->sc_sim),
- ccb->ccb_h.target_id, ccb->ccb_h.target_lun,
- ccb->ccb_h.func_code);
-
- ccb->ccb_h.status = CAM_TID_INVALID;
- xpt_done(ccb);
- goto done;
- }
- break;
- default:
- /* XXX Hm, we should check the input parameters */
- break;
- }
/* Perform the requested action */
switch (ccb->ccb_h.func_code) {
@@ -2299,6 +2249,13 @@ umass_cam_action(struct cam_sim *sim, un
if (sc->sc_quirks & FORCE_SHORT_INQUIRY) {
ccb->csio.dxfer_len = SHORT_INQUIRY_LENGTH;
}
+ } else if (sc->sc_transfer.cmd_data[0] == PREVENT_ALLOW) {
+ if (sc->sc_quirks & NO_PREVENT_ALLOW) {
+ ccb->csio.scsi_status = SCSI_STATUS_OK;
+ ccb->ccb_h.status = CAM_REQ_CMP;
+ xpt_done(ccb);
+ goto done;
+ }
} else if (sc->sc_transfer.cmd_data[0] == SYNCHRONIZE_CACHE) {
if (sc->sc_quirks & NO_SYNCHRONIZE_CACHE) {
ccb->csio.scsi_status = SCSI_STATUS_OK;
@@ -2447,7 +2404,7 @@ umass_cam_poll(struct cam_sim *sim)
{
struct umass_softc *sc = (struct umass_softc *)sim->softc;
- if (sc == UMASS_GONE)
+ if (sc == NULL)
return;
DPRINTF(sc, UDMASS_SCSI, "CAM poll\n");
Modified: stable/9/sys/dev/usb/usb_msctest.c
==============================================================================
--- stable/9/sys/dev/usb/usb_msctest.c Fri Nov 9 07:05:28 2012 (r242820)
+++ stable/9/sys/dev/usb/usb_msctest.c Fri Nov 9 07:12:31 2012 (r242821)
@@ -664,8 +664,11 @@ usb_msc_auto_quirk(struct usb_device *ud
if (sid_type == 0x00)
is_no_direct = 0;
break;
- } else if (err != ERR_CSW_FAILED)
- break; /* non retryable error */
+ } else if (err != ERR_CSW_FAILED) {
+ DPRINTF("Device is not responding "
+ "properly to SCSI INQUIRY command.\n");
+ goto error; /* non retryable error */
+ }
usb_pause_mtx(NULL, hz);
}
Modified: stable/9/sys/dev/usb/usbdevs
==============================================================================
--- stable/9/sys/dev/usb/usbdevs Fri Nov 9 07:05:28 2012 (r242820)
+++ stable/9/sys/dev/usb/usbdevs Fri Nov 9 07:12:31 2012 (r242821)
@@ -3945,6 +3945,7 @@ product STELERA E1012 0x1012 3G modem
/* STMicroelectronics products */
product STMICRO BIOCPU 0x2016 Biometric Coprocessor
product STMICRO COMMUNICATOR 0x7554 USB Communicator
+product STMICRO ST72682 0xfada USB 2.0 Flash drive controller
/* STSN products */
product STSN STSN0001 0x0001 Internet Access Device
More information about the svn-src-stable-9
mailing list