Author: n_hibma
Date: Sun Nov 28 22:07:08 2010
New Revision: 216018
URL: http://svn.freebsd.org/changeset/base/216018

Log:
  MFC r215095,215104:
  
  Add quirks for 3G MSC resets.
  Add a man page for the usb_quirks module.

Added:
  stable/8/share/man/man4/usb_quirk.4
     - copied unchanged from r215104, head/share/man/man4/usb_quirk.4
Modified:
  stable/8/share/man/man4/Makefile
  stable/8/share/man/man4/u3g.4
  stable/8/sys/dev/usb/quirk/usb_quirk.c
  stable/8/sys/dev/usb/quirk/usb_quirk.h
  stable/8/sys/dev/usb/serial/u3g.c
  stable/8/usr.sbin/usbconfig/usbconfig.8
Directory Properties:
  stable/8/share/man/man4/   (props changed)
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/usr.sbin/usbconfig/   (props changed)

Modified: stable/8/share/man/man4/Makefile
==============================================================================
--- stable/8/share/man/man4/Makefile    Sun Nov 28 20:56:51 2010        
(r216017)
+++ stable/8/share/man/man4/Makefile    Sun Nov 28 22:07:08 2010        
(r216018)
@@ -459,6 +459,7 @@ MAN=        aac.4 \
        urio.4 \
        ${_urtw.4} \
        usb.4 \
+       usb_quirk.4 \
        uslcom.4 \
        utopia.4 \
        uvisor.4 \

Modified: stable/8/share/man/man4/u3g.4
==============================================================================
--- stable/8/share/man/man4/u3g.4       Sun Nov 28 20:56:51 2010        
(r216017)
+++ stable/8/share/man/man4/u3g.4       Sun Nov 28 22:07:08 2010        
(r216018)
@@ -85,26 +85,19 @@ In some of these devices a mass storage 
 .Xr umass 4
 driver is present which contains Windows and Mac OS X drivers.
 The device starts up in disk mode (TruInstall, ZeroCD, etc.) and requires
-additional commands to switch it to modem mode.
+additional commands to switch it to modem mode. If your device is not
+switching automatically, please try to add quirks. See
+.Xr usbconfig 5
+and
+.Xr usb_quirk 4 .
 .Pp
-The
-.Xr u3gstub 4
-device will attach temporarily to a 3G device with a mass storage device and
-force it to switch to modem mode,
-The attach and detach of
-.Xr u3gstub
-and any driver disk device present on the 3G device is hidden, unless the
-machine was booted in verbose mode (see
-.Xr boot 8 ) .
-To temporarily unhide the device, set
-.Va debug.bootverbose
-to 1 using
-.Xr sysctl 8
-and replug the device.
 .Sh SEE ALSO
 .Xr tty 4 ,
 .Xr ucom 4 ,
-.Xr usb 4
+.XR u3g 4 ,
+.Xr usb 4 ,
+.Xr usb_quirk 4 ,
+.Xr usbconfig 5
 .Sh HISTORY
 The
 .Nm

Copied: stable/8/share/man/man4/usb_quirk.4 (from r215104, 
head/share/man/man4/usb_quirk.4)
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ stable/8/share/man/man4/usb_quirk.4 Sun Nov 28 22:07:08 2010        
(r216018, copy of r215104, head/share/man/man4/usb_quirk.4)
@@ -0,0 +1,196 @@
+.\"
+.\" Copyright (c) 2010 AnyWi Technologies
+.\" All rights reserved.
+.\"
+.\" Permission to use, copy, modify, and distribute this software for any
+.\" purpose with or without fee is hereby granted, provided that the above
+.\" copyright notice and this permission notice appear in all copies.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd November 9, 2010
+.Dt USB_QUIRK 4
+.Os
+.Sh NAME
+.Nm usb_quirk
+.Nd USB quirks module
+.Sh SYNOPSIS
+To compile this module into the kernel,
+place the following line in your
+kernel configuration file:
+.Bd -ragged -offset indent
+.Cd "device ucom"
+.Ed
+.Pp
+Alternatively, to load the module at boot
+time, place the following line in
+.Xr loader.conf 5 :
+.Bd -literal -offset indent
+usb_quirk_load="YES"
+.Ed
+.Sh DESCRIPTION
+The
+.Nm
+module provides support for dynamically adding and removing quirks for
+USB devices with
+.Xr usbconfig 5 .
+.Sh General quirks:
+.Bl -tag -width Ds
+.It UQ_AUDIO_SWAP_LR
+swap left and right channels
+.It UQ_AU_INP_ASYNC
+input is async despite claim of adaptive
+.It UQ_AU_NO_FRAC
+don't adjust for fractional samples
+.It UQ_AU_NO_XU
+audio device has broken extension unit
+.It UQ_BAD_ADC
+bad audio spec version number
+.It UQ_BAD_AUDIO
+device claims audio class, but isn't
+.It UQ_BROKEN_BIDIR
+printer has broken bidir mode
+.It UQ_BUS_POWERED
+device is bus powered, despite claim
+.It UQ_HID_IGNORE
+device should be ignored by hid class
+.It UQ_KBD_IGNORE
+device should be ignored by kbd class
+.It UQ_KBD_BOOTPROTO
+device should set the boot protocol
+.It UQ_MS_BAD_CLASS
+doesn't identify properly
+.It UQ_MS_LEADING_BYTE
+mouse sends an unknown leading byte
+.It UQ_MS_REVZ
+mouse has Z-axis reversed
+.It UQ_NO_STRINGS
+string descriptors are broken
+.It UQ_OPEN_CLEARSTALL
+device needs clear endpoint stall
+.It UQ_POWER_CLAIM
+hub lies about power status
+.It UQ_SPUR_BUT_UP
+spurious mouse button up events
+.It UQ_SWAP_UNICODE
+has some Unicode strings swapped
+.It UQ_CFG_INDEX_1
+select configuration index 1 by default
+.It UQ_CFG_INDEX_2
+select configuration index 2 by default
+.It UQ_CFG_INDEX_3
+select configuration index 3 by default
+.It UQ_CFG_INDEX_4
+select configuration index 4 by default
+.It UQ_CFG_INDEX_0
+select configuration index 0 by default
+.It UQ_ASSUME_CM_OVER_DATA
+assume cm over data feature
+.El
+.Sh USB Mass Storage Quirks
+.Bl -tag -width Ds
+.It UQ_MSC_NO_TEST_UNIT_READY
+send start/stop instead of TUR
+.It UQ_MSC_NO_RS_CLEAR_UA
+does not reset Unit Att.
+.It UQ_MSC_NO_START_STOP
+does not support start/stop
+.It UQ_MSC_NO_GETMAXLUN
+does not support get max LUN
+.It UQ_MSC_NO_INQUIRY
+fake generic inq response
+.It UQ_MSC_NO_INQUIRY_EVPD
+does not support inq EVPD
+.It UQ_MSC_NO_SYNC_CACHE
+does not support sync cache
+.It UQ_MSC_SHUTTLE_INIT
+requires Shuttle init sequence
+.It UQ_MSC_ALT_IFACE_1
+switch to alternate interface 1
+.It UQ_MSC_FLOPPY_SPEED
+does floppy speeds (20kb/s)
+.It UQ_MSC_IGNORE_RESIDUE
+gets residue wrong
+.It UQ_MSC_WRONG_CSWSIG
+uses wrong CSW signature
+.It UQ_MSC_RBC_PAD_TO_12
+pad RBC requests to 12 bytes
+.It UQ_MSC_READ_CAP_OFFBY1
+reports sector count, not max sec.
+.It UQ_MSC_FORCE_SHORT_INQ
+does not support full inq.
+.It UQ_MSC_FORCE_WIRE_BBB
+force BBB wire protocol
+.It UQ_MSC_FORCE_WIRE_CBI
+force CBI wire protocol
+.It UQ_MSC_FORCE_WIRE_CBI_I
+force CBI with int. wire protocol
+.It UQ_MSC_FORCE_PROTO_SCSI
+force SCSI command protocol
+.It UQ_MSC_FORCE_PROTO_ATAPI
+force ATAPI command protocol
+.It UQ_MSC_FORCE_PROTO_UFI
+force UFI command protocol
+.It UQ_MSC_FORCE_PROTO_RBC
+force RBC command protocol
+.El
+.Sh Mass Storage Change (u3g) quirks:
+.Bl -tag -width Ds
+.It UQ_MSC_EJECT_HUAWEI
+ejects after Huawei USB command
+.It UQ_MSC_EJECT_SIERRA
+ejects after Sierra USB command
+.It UQ_MSC_EJECT_SCSIEJECT
+ejects after SCSI eject command
+0x1b0000000200
+.It UQ_MSC_EJECT_REZERO
+ejects after SCSI rezero command
+0x010000000000
+.It UQ_MSC_EJECT_ZTESTOR
+ejects after ZTE SCSI command
+0x850101011801010101010000
+.It UQ_MSC_EJECT_CMOTECH
+ejects after C-motech SCSI command
+0xff52444556434847
+.It UQ_MSC_EJECT_WAIT
+wait for the device to eject
+.It UQ_MSC_EJECT_SAEL_M460
+ejects after Sael USB commands
+.It UQ_MSC_EJECT_HUAWEISCSI
+ejects after Huawei SCSI command
+0x11060000000000000000000000000000
+.It UQ_MSC_EJECT_TCT
+ejects after TCT SCSI command
+0x06f504025270
+.El
+See
+.Pa /sys/dev/usb/quirk/usb_quirk.h
+for the complete list of supported quirks.
+.Sh EXAMPLES
+After attaching a
+.Nm u3g
+device which appears as a USB device on
+.Pa ugen0.3 :
+.Bd -literal -offset indent
+usbconfig -d ugen0.3 add_quirk UQ_MSC_EJECT_WAIT
+.Ed
+.Sh SEE ALSO
+.Xr usb_quirk 4 ,
+.Xr usbconfig 5
+.Sh HISTORY
+The
+.Nm
+module appeared in
+.Fx 8.0 ,
+and was written by
+.An Hans Petter Selasky Aq hsela...@freebsd.org .
+This manual page was written by
+.An Nick Hibma Aq n_hi...@freebsd.org .

Modified: stable/8/sys/dev/usb/quirk/usb_quirk.c
==============================================================================
--- stable/8/sys/dev/usb/quirk/usb_quirk.c      Sun Nov 28 20:56:51 2010        
(r216017)
+++ stable/8/sys/dev/usb/quirk/usb_quirk.c      Sun Nov 28 22:07:08 2010        
(r216018)
@@ -512,6 +512,16 @@ static const char *usb_quirk_str[USB_QUI
        [UQ_MSC_FORCE_PROTO_ATAPI]      = "UQ_MSC_FORCE_PROTO_ATAPI",
        [UQ_MSC_FORCE_PROTO_UFI]        = "UQ_MSC_FORCE_PROTO_UFI",
        [UQ_MSC_FORCE_PROTO_RBC]        = "UQ_MSC_FORCE_PROTO_RBC",
+       [UQ_MSC_EJECT_HUAWEI]           = "UQ_MSC_EJECT_HUAWEI",
+       [UQ_MSC_EJECT_SIERRA]           = "UQ_MSC_EJECT_SIERRA",
+       [UQ_MSC_EJECT_SCSIEJECT]        = "UQ_MSC_EJECT_SCSIEJECT",
+       [UQ_MSC_EJECT_REZERO]           = "UQ_MSC_EJECT_REZERO",
+       [UQ_MSC_EJECT_ZTESTOR]          = "UQ_MSC_EJECT_ZTESTOR",
+       [UQ_MSC_EJECT_CMOTECH]          = "UQ_MSC_EJECT_CMOTECH",
+       [UQ_MSC_EJECT_WAIT]             = "UQ_MSC_EJECT_WAIT",
+       [UQ_MSC_EJECT_SAEL_M460]        = "UQ_MSC_EJECT_SAEL_M460",
+       [UQ_MSC_EJECT_HUAWEISCSI]       = "UQ_MSC_EJECT_HUAWEISCSI",
+       [UQ_MSC_EJECT_TCT]              = "UQ_MSC_EJECT_TCT",
 };
 
 /*------------------------------------------------------------------------*

Modified: stable/8/sys/dev/usb/quirk/usb_quirk.h
==============================================================================
--- stable/8/sys/dev/usb/quirk/usb_quirk.h      Sun Nov 28 20:56:51 2010        
(r216017)
+++ stable/8/sys/dev/usb/quirk/usb_quirk.h      Sun Nov 28 22:07:08 2010        
(r216018)
@@ -27,11 +27,14 @@
 #ifndef _USB_QUIRK_H_
 #define        _USB_QUIRK_H_
 
-/* NOTE: UQ_NONE is not a valid quirk */
-enum { /* keep in sync with usb_quirk_str table */
-       UQ_NONE,
+enum {
+       /*
+        * Keep in sync with theusb_quirk_str usb_quirk.c, and with the
+        * share/man/man4/usb_quirk.4
+        */
+       UQ_NONE,                /* not a valid quirk */
 
-       UQ_MATCH_VENDOR_ONLY,
+       UQ_MATCH_VENDOR_ONLY,   /* match quirk on vendor only */
 
        /* Various quirks */
 
@@ -59,31 +62,43 @@ enum {      /* keep in sync with usb_quirk_st
        UQ_CFG_INDEX_3,         /* select configuration index 3 by default */
        UQ_CFG_INDEX_4,         /* select configuration index 4 by default */
        UQ_CFG_INDEX_0,         /* select configuration index 0 by default */
-       UQ_ASSUME_CM_OVER_DATA, /* modem device breaks on cm over data */
+       UQ_ASSUME_CM_OVER_DATA, /* assume cm over data feature */
 
        /* USB Mass Storage Quirks. See "storage/umass.c" for a detailed 
description. */
-       UQ_MSC_NO_TEST_UNIT_READY,
-       UQ_MSC_NO_RS_CLEAR_UA,
-       UQ_MSC_NO_START_STOP,
-       UQ_MSC_NO_GETMAXLUN,
-       UQ_MSC_NO_INQUIRY,
-       UQ_MSC_NO_INQUIRY_EVPD,
-       UQ_MSC_NO_SYNC_CACHE,
-       UQ_MSC_SHUTTLE_INIT,
-       UQ_MSC_ALT_IFACE_1,
-       UQ_MSC_FLOPPY_SPEED,
-       UQ_MSC_IGNORE_RESIDUE,
-       UQ_MSC_WRONG_CSWSIG,
-       UQ_MSC_RBC_PAD_TO_12,
-       UQ_MSC_READ_CAP_OFFBY1,
-       UQ_MSC_FORCE_SHORT_INQ,
-       UQ_MSC_FORCE_WIRE_BBB,
-       UQ_MSC_FORCE_WIRE_CBI,
-       UQ_MSC_FORCE_WIRE_CBI_I,
-       UQ_MSC_FORCE_PROTO_SCSI,
-       UQ_MSC_FORCE_PROTO_ATAPI,
-       UQ_MSC_FORCE_PROTO_UFI,
-       UQ_MSC_FORCE_PROTO_RBC,
+       UQ_MSC_NO_TEST_UNIT_READY,      /* send start/stop instead of TUR */
+       UQ_MSC_NO_RS_CLEAR_UA,          /* does not reset Unit Att. */
+       UQ_MSC_NO_START_STOP,           /* does not support start/stop */
+       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_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 */
+       UQ_MSC_FLOPPY_SPEED,            /* does floppy speeds (20kb/s) */
+       UQ_MSC_IGNORE_RESIDUE,          /* gets residue wrong */
+       UQ_MSC_WRONG_CSWSIG,            /* uses wrong CSW signature */
+       UQ_MSC_RBC_PAD_TO_12,           /* pad RBC requests to 12 bytes */
+       UQ_MSC_READ_CAP_OFFBY1,         /* reports sector count, not max sec. */
+       UQ_MSC_FORCE_SHORT_INQ,         /* does not support full inq. */
+       UQ_MSC_FORCE_WIRE_BBB,          /* force BBB wire protocol */
+       UQ_MSC_FORCE_WIRE_CBI,          /* force CBI wire protocol */
+       UQ_MSC_FORCE_WIRE_CBI_I,        /* force CBI with int. wire protocol */
+       UQ_MSC_FORCE_PROTO_SCSI,        /* force SCSI command protocol */
+       UQ_MSC_FORCE_PROTO_ATAPI,       /* force ATAPI command protocol */
+       UQ_MSC_FORCE_PROTO_UFI,         /* force UFI command protocol */
+       UQ_MSC_FORCE_PROTO_RBC,         /* force RBC command protocol */
+
+       /* Ejection of mass storage (driver disk) */
+       UQ_MSC_EJECT_HUAWEI,            /* ejects after Huawei USB command */
+       UQ_MSC_EJECT_SIERRA,            /* ejects after Sierra USB command */
+       UQ_MSC_EJECT_SCSIEJECT,         /* ejects after SCSI eject command */
+       UQ_MSC_EJECT_REZERO,            /* ejects after SCSI rezero command */
+       UQ_MSC_EJECT_ZTESTOR,           /* ejects after ZTE SCSI command */
+       UQ_MSC_EJECT_CMOTECH,           /* ejects after C-motech SCSI cmd */
+       UQ_MSC_EJECT_WAIT,              /* wait for the device to eject */
+       UQ_MSC_EJECT_SAEL_M460,         /* ejects after Sael USB commands */ 
+       UQ_MSC_EJECT_HUAWEISCSI,        /* ejects after Huawei SCSI command */
+       UQ_MSC_EJECT_TCT,               /* ejects after TCT SCSI command */
 
        USB_QUIRK_MAX
 };

Modified: stable/8/sys/dev/usb/serial/u3g.c
==============================================================================
--- stable/8/sys/dev/usb/serial/u3g.c   Sun Nov 28 20:56:51 2010        
(r216017)
+++ stable/8/sys/dev/usb/serial/u3g.c   Sun Nov 28 22:07:08 2010        
(r216018)
@@ -62,6 +62,7 @@
 #include <dev/usb/usb_msctest.h>
 
 #include <dev/usb/serial/usb_serial.h>
+#include <dev/usb/quirk/usb_quirk.h>
 
 #ifdef USB_DEBUG
 static int u3g_debug = 0;
@@ -84,6 +85,7 @@ SYSCTL_INT(_hw_usb_u3g, OID_AUTO, debug,
 #define        U3GSP_HSPA              6
 #define        U3GSP_MAX               7
 
+/* Eject methods; See also usb_quirks.h:UQ_MSC_EJECT_* */
 #define        U3GINIT_HUAWEI          1       /* Requires Huawei init command 
*/
 #define        U3GINIT_SIERRA          2       /* Requires Sierra init command 
*/
 #define        U3GINIT_SCSIEJECT       3       /* Requires SCSI eject command 
*/
@@ -643,6 +645,7 @@ u3g_test_autoinst(void *arg, struct usb_
        struct usb_interface *iface;
        struct usb_interface_descriptor *id;
        int error;
+       unsigned long method;
 
        if (uaa->dev_state != UAA_DEV_READY)
                return;
@@ -653,10 +656,37 @@ u3g_test_autoinst(void *arg, struct usb_
        id = iface->idesc;
        if (id == NULL || id->bInterfaceClass != UICLASS_MASS)
                return;
-       if (usbd_lookup_id_by_uaa(u3g_devs, sizeof(u3g_devs), uaa))
+
+       if (usb_test_quirk(uaa, UQ_MSC_EJECT_HUAWEI))
+               method = U3GINIT_HUAWEI;
+       else if (usb_test_quirk(uaa, UQ_MSC_EJECT_SIERRA))
+               method = U3GINIT_SIERRA;
+       else if (usb_test_quirk(uaa, UQ_MSC_EJECT_SCSIEJECT))
+               method = U3GINIT_SCSIEJECT;
+       else if (usb_test_quirk(uaa, UQ_MSC_EJECT_REZERO))
+               method = U3GINIT_REZERO;
+       else if (usb_test_quirk(uaa, UQ_MSC_EJECT_ZTESTOR))
+               method = U3GINIT_ZTESTOR;
+       else if (usb_test_quirk(uaa, UQ_MSC_EJECT_CMOTECH))
+               method = U3GINIT_CMOTECH;
+       else if (usb_test_quirk(uaa, UQ_MSC_EJECT_WAIT))
+               method = U3GINIT_WAIT;
+       else if (usb_test_quirk(uaa, UQ_MSC_EJECT_HUAWEISCSI))
+               method = U3GINIT_HUAWEISCSI;
+       else if (usb_test_quirk(uaa, UQ_MSC_EJECT_TCT))
+               method = U3GINIT_TCT;
+       else if (usbd_lookup_id_by_uaa(u3g_devs, sizeof(u3g_devs), uaa) == 0)
+               method = USB_GET_DRIVER_INFO(uaa);
+       else
                return;         /* no device match */
 
-       switch (USB_GET_DRIVER_INFO(uaa)) {
+       if (bootverbose) {
+               printf("Ejecting 0x%04x:0x%04x using method %ld\n",
+                      uaa->info.idVendor, uaa->info.idProduct,
+                      USB_GET_DRIVER_INFO(uaa));
+       }
+
+       switch (method) {
                case U3GINIT_HUAWEI:
                        error = u3g_huawei_init(udev);
                        break;
@@ -747,8 +777,10 @@ u3g_attach(device_t dev)
        DPRINTF("sc=%p\n", sc);
 
        type = USB_GET_DRIVER_INFO(uaa);
-       if (type == U3GINIT_SAEL_M460)
+       if (type == U3GINIT_SAEL_M460
+           || usb_test_quirk(uaa, UQ_MSC_EJECT_SAEL_M460)) {
                u3g_sael_m460_init(uaa->device);
+       }
 
        /* copy in USB config */
        for (n = 0; n != U3G_N_TRANSFER; n++) 

Modified: stable/8/usr.sbin/usbconfig/usbconfig.8
==============================================================================
--- stable/8/usr.sbin/usbconfig/usbconfig.8     Sun Nov 28 20:56:51 2010        
(r216017)
+++ stable/8/usr.sbin/usbconfig/usbconfig.8     Sun Nov 28 22:07:08 2010        
(r216018)
@@ -92,5 +92,9 @@ Display a list of available quirk names:
 .Pp
 .Dl usbconfig dump_quirk_names
 .Pp
+See
+.Xr usb_quirk 4
+for more information on quirks.
 .Sh SEE ALSO
-.Xr usb 4
+.Xr usb 4 ,
+.Xr usb_quirk 4
_______________________________________________
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