From b311f98821cc67d0d4bb0a8d7eca01165529bd71 Mon Sep 17 00:00:00 2001 From: christos Date: Sat, 25 Oct 2008 17:35:44 +0000 Subject: [PATCH] The Sierra Wireless USBConnect 881 card presents itself as umass containing the driver to be installed for it. We don't need this crap. Tell it to become a modem. --- sys/dev/usb/u3g.c | 37 +++++++++++++++++++++++++++++++++++++ sys/dev/usb/usbdevs | 3 ++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/sys/dev/usb/u3g.c b/sys/dev/usb/u3g.c index aa161df2a53d..815c5f98f919 100644 --- a/sys/dev/usb/u3g.c +++ b/sys/dev/usb/u3g.c @@ -262,6 +262,32 @@ u3g_huawei_reinit(usbd_device_handle dev) return (UMATCH_HIGHEST); /* Match to prevent umass from attaching */ } +static int +u3g_sierra_reinit(usbd_device_handle dev) +{ + /* Some Sierra devices presents themselves as a umass device with + * Windows drivers on it. After installation of the driver, it + * reinits into a * 3G serial device. + */ + usb_device_request_t req; + usb_config_descriptor_t *cdesc; + + /* Get the config descriptor */ + cdesc = usbd_get_config_descriptor(dev); + if (cdesc == NULL) + return (UMATCH_NONE); + + req.bmRequestType = UT_VENDOR; + req.bRequest = UR_SET_INTERFACE; + USETW(req.wValue, UF_DEVICE_REMOTE_WAKEUP); + USETW(req.wIndex, UHF_PORT_CONNECTION); + USETW(req.wLength, 0); + + (void) usbd_do_request(dev, &req, 0); + + return (UMATCH_HIGHEST); /* Match to prevent umass from attaching */ +} + static int u3g_match(device_t parent, cfdata_t match, void *aux) { @@ -274,6 +300,10 @@ u3g_match(device_t parent, cfdata_t match, void *aux) uaa->product == USB_PRODUCT_NOVATEL2_MC950D_DRIVER) return u3g_novatel_reinit(uaa); + if (uaa->vendor == USB_VENDOR_SIERRA && + uaa->product == USB_PRODUCT_SIERRA_INSTALLER) + return u3g_sierra_reinit(uaa->device); + if (usb_lookup(u3g_devs, uaa->vendor, uaa->product)) return UMATCH_VENDOR_PRODUCT; @@ -330,6 +360,13 @@ u3g_attach(device_t parent, device_t self, void *aux) return; } + if (uaa->vendor == USB_VENDOR_SIERRA && + uaa->product == USB_PRODUCT_SIERRA_INSTALLER) { + /* About to disappear... */ + sc->sc_pseudodev = true; + return; + } + sc->sc_udev = dev; sc->numports = (cdesc->bNumInterface <= U3G_MAXPORTS)?cdesc->bNumInterface:U3G_MAXPORTS; for ( i = 0; i < sc->numports; i++ ) { diff --git a/sys/dev/usb/usbdevs b/sys/dev/usb/usbdevs index 679da94e29d2..0fe6e137b67c 100644 --- a/sys/dev/usb/usbdevs +++ b/sys/dev/usb/usbdevs @@ -1,4 +1,4 @@ -$NetBSD: usbdevs,v 1.518 2008/10/22 10:23:51 haad Exp $ +$NetBSD: usbdevs,v 1.519 2008/10/25 17:35:44 christos Exp $ /* * Copyright (c) 1998-2004 The NetBSD Foundation, Inc. @@ -2057,6 +2057,7 @@ product SIERRA MC8775_2 0x6815 MC8775 product SIERRA AIRCARD875 0x6820 Aircard 875 HSDPA product SIERRA MC8780 0x6832 MC8780 product SIERRA MC8781 0x6833 MC8781 +product SIERRA INSTALLER 0x0fff Aircard Driver Installer /* Sigmatel products */ product SIGMATEL SIR4116 0x4116 StIR4116 SIR