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
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to