A Conexant USB ACM modem sold by Hummingbird under the model name "huc56s" declares some USB communications class descriptors on its "data" class interface that instead belong on the "communications" class interface, at least according to my reading of the "Universal Serial Bus Class Definitions for Communications Devices", revision 1.2, November 16, 2007 (part of the zip file at http://www.usb.org/developers/devclass_docs/CDC1.2_WMC1.1.zip ), page 15, section 5.2.3 ("Functional Descriptors"): "Although the Communications Class currently defines specific descriptor information, the Data Class does not." [Goes on to describe the descriptors in question.] I am apparently not the first person to identify this kind of descriptor bug on a communications class device, since the source code for lsusb in usbutils-0.73/lsusb.c contains the following accommodation. case USB_DT_CS_INTERFACE: /* MISPLACED DESCRIPTOR ... less indent */ switch (interface->bInterfaceClass) { case USB_CLASS_COMM: case USB_CLASS_DATA: // comm data dump_comm_descriptor(dev, buf, " "); break; So, I would like to submit the attached patch that adds a quirk entry to linux-2.6.29-rc5/drivers/usb/class/cdc-acm.c for this modem. Since the patch is tiny, I have included it both in line and as a MIME attachment. The quirk that it adds causes the driver to the communication class descriptors to be absent. With this patch, I am able to do "AT" commands on the modem using minicom. Feel free to trim down the comment in the patch if you wish. Since the huc56s is a small cheap USB dongle, I imagine it will remain popular among people who still need an analog modem, so I doubt that I am the only person effected by this. Also, the linuxant "DGC" driver already has explicit support for this device by product and vendor ID, and I would prefer not to cause people to install a duplicative driver just to accommodate this quirk. Just as a thought for the future, if this problem of misplaced communications class descriptors is a common enough already to have kludge in lsusb, then perhaps it might be worthwhile to define a new quirk to indicate that the descriptors can be found on the data interface, although I have not investigated how cdc-acm uses the information in these descriptors, so I don't know whether or not it would be worth the effort. Anyhow, please let me know what more I need to do to get this patch or one like it integrated and forwarded upstream. Thanks in advance. Adam Richter --- linux-2.6.29-rc5/drivers/usb/class/cdc-acm.c 2009-02-13 15:31:30.000000000 -0800 +++ linux-2.6.29-rc5.hummingbird-modem/drivers/usb/class/cdc-acm.c 2009-02-17 16:18:24.000000000 -0800 @@ -1376,6 +1376,13 @@ { USB_DEVICE(0x0572, 0x1324), /* Conexant USB MODEM RD02-D400 */ .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ }, + { USB_DEVICE(0x0572, 0x1329), /* Hummingbird huc56s (Conexant) */ + .driver_info = NO_UNION_NORMAL, /* union descriptor misplaced on + data interface instead of + communications interface. + Maybe we should define a new + quirk for this. */ + }, /* control interfaces with various AT-command sets */ { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
--- linux-2.6.29-rc5/drivers/usb/class/cdc-acm.c 2009-02-13 15:31:30.000000000 -0800 +++ linux-2.6.29-rc5.hummingbird-modem/drivers/usb/class/cdc-acm.c 2009-02-17 16:18:24.000000000 -0800 @@ -1376,6 +1376,13 @@ { USB_DEVICE(0x0572, 0x1324), /* Conexant USB MODEM RD02-D400 */ .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ }, + { USB_DEVICE(0x0572, 0x1329), /* Hummingbird huc56s (Conexant) */ + .driver_info = NO_UNION_NORMAL, /* union descriptor misplaced on + data interface instead of + communications interface. + Maybe we should define a new + quirk for this. */ + }, /* control interfaces with various AT-command sets */ { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,