From a1028b88ba0bbbd3d7b4cfa9989ac4de14c5b25e Mon Sep 17 00:00:00 2001 From: Andrew Thompson Date: Thu, 31 Dec 2009 00:08:17 +0000 Subject: [PATCH] MFC r200395 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 --- sys/dev/usb/quirk/usb_quirk.c | 19 +++++++++++++++++++ sys/dev/usb/quirk/usb_quirk.h | 1 + sys/dev/usb/serial/umodem.c | 23 ++++++++++++++--------- sys/dev/usb/usbdevs | 4 ++++ 4 files changed, 38 insertions(+), 9 deletions(-) diff --git a/sys/dev/usb/quirk/usb_quirk.c b/sys/dev/usb/quirk/usb_quirk.c index ea63cd64c7ac..cdfcce8ff45d 100644 --- a/sys/dev/usb/quirk/usb_quirk.c +++ b/sys/dev/usb/quirk/usb_quirk.c @@ -125,6 +125,24 @@ static struct usb_quirk_entry usb_quirks[USB_DEV_QUIRKS_MAX] = { /* 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_QUIRK_MAX] = { [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", }; /*------------------------------------------------------------------------* diff --git a/sys/dev/usb/quirk/usb_quirk.h b/sys/dev/usb/quirk/usb_quirk.h index f4fb9b9fdc95..ee40c2fb3b93 100644 --- a/sys/dev/usb/quirk/usb_quirk.h +++ b/sys/dev/usb/quirk/usb_quirk.h @@ -53,6 +53,7 @@ enum { /* keep in sync with usb_quirk_str table */ 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 }; diff --git a/sys/dev/usb/serial/umodem.c b/sys/dev/usb/serial/umodem.c index 6a6d3951a2ba..6945e79e4305 100644 --- a/sys/dev/usb/serial/umodem.c +++ b/sys/dev/usb/serial/umodem.c @@ -112,6 +112,7 @@ __FBSDID("$FreeBSD$"); #define USB_DEBUG_VAR umodem_debug #include #include +#include #include @@ -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) { - - error = umodem_set_comm_feature - (uaa->device, sc->sc_ctrl_iface_no, - UCDC_ABSTRACT_STATE, UCDC_DATA_MULTIPLEXED); - - /* ignore any errors */ - } + 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); + + /* ignore any errors */ + } + sc->sc_cm_over_data = 1; + } } error = usbd_transfer_setup(uaa->device, sc->sc_iface_index, sc->sc_xfer, diff --git a/sys/dev/usb/usbdevs b/sys/dev/usb/usbdevs index 002b9d429b8c..64009858a1b4 100644 --- a/sys/dev/usb/usbdevs +++ b/sys/dev/usb/usbdevs @@ -1212,6 +1212,9 @@ product DRESDENELEKTRONIK WIRELESSHANDHELDTERMINAL 0x0004 Wireless Handheld Ter /* 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 @@ -1826,6 +1829,7 @@ product MOSCHIP MCS7830 0x7830 MCS7830 Ethernet /* 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