From owner-p4-projects@FreeBSD.ORG Thu Mar 5 15:46:49 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id F043E10656FC; Thu, 5 Mar 2009 15:46:46 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 4996510656E1 for ; Thu, 5 Mar 2009 15:46:46 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 320208FC9F for ; Thu, 5 Mar 2009 15:46:27 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n25FkRXC021905 for ; Thu, 5 Mar 2009 15:46:27 GMT (envelope-from hselasky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n25FkRDf021903 for perforce@freebsd.org; Thu, 5 Mar 2009 15:46:27 GMT (envelope-from hselasky@FreeBSD.org) Date: Thu, 5 Mar 2009 15:46:27 GMT Message-Id: <200903051546.n25FkRDf021903@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky To: Perforce Change Reviews Cc: Subject: PERFORCE change 158721 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 05 Mar 2009 15:46:53 -0000 http://perforce.freebsd.org/chv.cgi?CH=158721 Change 158721 by hselasky@hselasky_laptop001 on 2009/03/05 15:46:16 USB serial: Patch for Nokia phones PR: usb/117185 Affected files ... .. //depot/projects/usb/src/sys/dev/usb/serial/umodem.c#3 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb/serial/umodem.c#3 (text+ko) ==== @@ -69,6 +69,7 @@ /* * Comm Class spec: http://www.usb.org/developers/devclass_docs/usbccs10.pdf * http://www.usb.org/developers/devclass_docs/usbcdc11.pdf + * http://www.usb.org/developers/devclass_docs/cdc_wmc10.zip */ /* @@ -253,8 +254,6 @@ umodem_probe(device_t dev) { struct usb2_attach_arg *uaa = device_get_ivars(dev); - uint8_t cm; - uint8_t acm; int error; DPRINTFN(11, "\n"); @@ -263,19 +262,6 @@ return (ENXIO); } error = usb2_lookup_id_by_uaa(umodem_devs, sizeof(umodem_devs), uaa); - if (error) { - return (error); - } - if (uaa->driver_info == NULL) { - /* some modems do not have any capabilities */ - return (error); - } - umodem_get_caps(uaa, &cm, &acm); - if (!(cm & USB_CDC_CM_DOES_CM) || - !(cm & USB_CDC_CM_OVER_DATA) || - !(acm & USB_CDC_ACM_HAS_LINE)) { - error = ENXIO; - } return (error); } @@ -285,6 +271,7 @@ struct usb2_attach_arg *uaa = device_get_ivars(dev); struct umodem_softc *sc = device_get_softc(dev); struct usb2_cdc_cm_descriptor *cmd; + struct usb2_cdc_union_descriptor *cud; uint8_t i; int error; @@ -302,10 +289,20 @@ cmd = umodem_get_desc(uaa, UDESC_CS_INTERFACE, UDESCSUB_CDC_CM); if ((cmd == NULL) || (cmd->bLength < sizeof(*cmd))) { - device_printf(dev, "no CM descriptor!\n"); - goto detach; + + cud = usb2_find_descriptor(uaa->device, NULL, + uaa->info.bIfaceIndex, UDESC_CS_INTERFACE, + 0 - 1, UDESCSUB_CDC_UNION, 0 - 1); + + if ((cud == NULL) || (cud->bLength < sizeof(*cud))) { + device_printf(dev, "no CM or union descriptor!\n"); + goto detach; + } + + sc->sc_data_iface_no = cud->bSlaveInterface[0]; + } else { + sc->sc_data_iface_no = cmd->bDataInterface; } - sc->sc_data_iface_no = cmd->bDataInterface; device_printf(dev, "data interface %d, has %sCM over " "data, has %sbreak\n", @@ -419,21 +416,19 @@ struct usb2_cdc_cm_descriptor *cmd; struct usb2_cdc_acm_descriptor *cad; - *cm = *acm = 0; - cmd = umodem_get_desc(uaa, UDESC_CS_INTERFACE, UDESCSUB_CDC_CM); if ((cmd == NULL) || (cmd->bLength < sizeof(*cmd))) { - DPRINTF("no CM desc\n"); - return; - } - *cm = cmd->bmCapabilities; + DPRINTF("no CM desc (faking one)\n"); + *cm = USB_CDC_CM_DOES_CM | USB_CDC_CM_OVER_DATA; + } else + *cm = cmd->bmCapabilities; cad = umodem_get_desc(uaa, UDESC_CS_INTERFACE, UDESCSUB_CDC_ACM); if ((cad == NULL) || (cad->bLength < sizeof(*cad))) { DPRINTF("no ACM desc\n"); - return; - } - *acm = cad->bmCapabilities; + *acm = 0; + } else + *acm = cad->bmCapabilities; } static void