Author: thompsa
Date: Fri Dec 11 02:44:15 2009
New Revision: 200395
URL: http://svn.freebsd.org/changeset/base/200395

Log:
  Add a quirk for the Curitel UM175 where setting multiplexing for call
  management over the data endpoint causes communication to die.
  
  Take this one step further and model it on the existing NetBSD quirk and 
import
  other device IDs from them.
  
  Obtained from:        NetBSD

Modified:
  head/sys/dev/usb/quirk/usb_quirk.c
  head/sys/dev/usb/quirk/usb_quirk.h
  head/sys/dev/usb/serial/umodem.c
  head/sys/dev/usb/usbdevs

Modified: head/sys/dev/usb/quirk/usb_quirk.c
==============================================================================
--- head/sys/dev/usb/quirk/usb_quirk.c  Fri Dec 11 02:32:53 2009        
(r200394)
+++ head/sys/dev/usb/quirk/usb_quirk.c  Fri Dec 11 02:44:15 2009        
(r200395)
@@ -125,6 +125,24 @@ static struct usb_quirk_entry usb_quirks
        /* MS keyboards do weird things */
        {USB_QUIRK_ENTRY(USB_VENDOR_MICROSOFT, 
USB_PRODUCT_MICROSOFT_WLINTELLIMOUSE, 0x0000, 0xFFFF, UQ_MS_LEADING_BYTE, 
UQ_NONE)},
        {USB_QUIRK_ENTRY(USB_VENDOR_METAGEEK, USB_PRODUCT_METAGEEK_WISPY24X, 
0x0000, 0xFFFF, UQ_KBD_IGNORE, UQ_HID_IGNORE, UQ_NONE)},
+       /* umodem(4) device quirks */
+       {USB_QUIRK_ENTRY(USB_VENDOR_METRICOM, USB_PRODUCT_METRICOM_RICOCHET_GS,
+           0x100, 0x100, UQ_ASSUME_CM_OVER_DATA)},
+       {USB_QUIRK_ENTRY(USB_VENDOR_SANYO, USB_PRODUCT_SANYO_SCP4900,
+           0x000, 0x000, UQ_ASSUME_CM_OVER_DATA)},
+       {USB_QUIRK_ENTRY(USB_VENDOR_MOTOROLA2, USB_PRODUCT_MOTOROLA2_T720C,
+           0x001, 0x001, UQ_ASSUME_CM_OVER_DATA)},
+       {USB_QUIRK_ENTRY(USB_VENDOR_EICON, USB_PRODUCT_EICON_DIVA852,
+           0x100, 0x100, UQ_ASSUME_CM_OVER_DATA)},
+       {USB_QUIRK_ENTRY(USB_VENDOR_SIEMENS2, USB_PRODUCT_SIEMENS2_ES75,
+           0x000, 0x000, UQ_ASSUME_CM_OVER_DATA)},
+       {USB_QUIRK_ENTRY(USB_VENDOR_QUALCOMM, USB_PRODUCT_QUALCOMM_CDMA_MSM,
+           0x0000, 0xFFFF, UQ_ASSUME_CM_OVER_DATA)},
+       {USB_QUIRK_ENTRY(USB_VENDOR_QUALCOMM2, USB_PRODUCT_QUALCOMM2_CDMA_MSM,
+           0x0000, 0xFFFF, UQ_ASSUME_CM_OVER_DATA)},
+       {USB_QUIRK_ENTRY(USB_VENDOR_CURITEL, USB_PRODUCT_CURITEL_UM175,
+           0x0000, 0xFFFF, UQ_ASSUME_CM_OVER_DATA)},
+
 };
 
 static const char *usb_quirk_str[USB_QUIRK_MAX] = {
@@ -152,6 +170,7 @@ static const char *usb_quirk_str[USB_QUI
        [UQ_CFG_INDEX_3]        = "UQ_CFG_INDEX_3",
        [UQ_CFG_INDEX_4]        = "UQ_CFG_INDEX_4",
        [UQ_CFG_INDEX_0]        = "UQ_CFG_INDEX_0",
+       [UQ_ASSUME_CM_OVER_DATA]= "UQ_ASSUME_CM_OVER_DATA",
 };
 
 /*------------------------------------------------------------------------*

Modified: head/sys/dev/usb/quirk/usb_quirk.h
==============================================================================
--- head/sys/dev/usb/quirk/usb_quirk.h  Fri Dec 11 02:32:53 2009        
(r200394)
+++ head/sys/dev/usb/quirk/usb_quirk.h  Fri Dec 11 02:44:15 2009        
(r200395)
@@ -53,6 +53,7 @@ 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 */
        USB_QUIRK_MAX
 };
 

Modified: head/sys/dev/usb/serial/umodem.c
==============================================================================
--- head/sys/dev/usb/serial/umodem.c    Fri Dec 11 02:32:53 2009        
(r200394)
+++ head/sys/dev/usb/serial/umodem.c    Fri Dec 11 02:44:15 2009        
(r200395)
@@ -112,6 +112,7 @@ __FBSDID("$FreeBSD$");
 #define        USB_DEBUG_VAR umodem_debug
 #include <dev/usb/usb_debug.h>
 #include <dev/usb/usb_process.h>
+#include <dev/usb/quirk/usb_quirk.h>
 
 #include <dev/usb/serial/usb_serial.h>
 
@@ -349,16 +350,20 @@ umodem_attach(device_t dev)
                }
        }
 
-       if (sc->sc_cm_cap & USB_CDC_CM_OVER_DATA) {
-               if (sc->sc_acm_cap & USB_CDC_ACM_HAS_FEATURE) {
+       if (usb_test_quirk(uaa, UQ_ASSUME_CM_OVER_DATA)) {
+               sc->sc_cm_over_data = 1;
+       } else {
+               if (sc->sc_cm_cap & USB_CDC_CM_OVER_DATA) {
+                       if (sc->sc_acm_cap & USB_CDC_ACM_HAS_FEATURE) {
 
-                       error = umodem_set_comm_feature
-                           (uaa->device, sc->sc_ctrl_iface_no,
-                           UCDC_ABSTRACT_STATE, UCDC_DATA_MULTIPLEXED);
+                               error = umodem_set_comm_feature
+                               (uaa->device, sc->sc_ctrl_iface_no,
+                                UCDC_ABSTRACT_STATE, UCDC_DATA_MULTIPLEXED);
 
-                       /* ignore any errors */
+                               /* ignore any errors */
+                       }
+                       sc->sc_cm_over_data = 1;
                }
-               sc->sc_cm_over_data = 1;
        }
        error = usbd_transfer_setup(uaa->device,
            sc->sc_iface_index, sc->sc_xfer,

Modified: head/sys/dev/usb/usbdevs
==============================================================================
--- head/sys/dev/usb/usbdevs    Fri Dec 11 02:32:53 2009        (r200394)
+++ head/sys/dev/usb/usbdevs    Fri Dec 11 02:44:15 2009        (r200395)
@@ -1213,6 +1213,9 @@ product DRESDENELEKTRONIK WIRELESSHANDHE
 /* Dynastream Innovations */
 product DYNASTREAM ANTDEVBOARD 0x1003  ANT dev board
 
+/* Eicon Networks */
+product EICON DIVA852          0x4905  Diva 852 ISDN TA
+
 /* EIZO products */
 product EIZO HUB               0x0000  hub
 product EIZO MONITOR           0x0001  monitor
@@ -1827,6 +1830,7 @@ product MOSCHIP MCS7830           0x7830  MCS7830 
 /* Motorola products */
 product MOTOROLA MC141555      0x1555  MC141555 hub controller
 product MOTOROLA SB4100                0x4100  SB4100 USB Cable Modem
+product MOTOROLA2 T720C                0x2822  T720c
 product MOTOROLA2 A41XV32X     0x2a22  A41x/V32x Mobile Phones
 product MOTOROLA2 E398         0x4810  E398 Mobile Phone
 product MOTOROLA2 USBLAN       0x600c  USBLAN
_______________________________________________
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