ChangeSet 1.1595.7.14, 2003/07/30 13:11:32-07:00, david-b@pacbell.net [PATCH] USB: usbnet: zaurus c-750, motorola This patch: - Makes the cdc code handle a Motorola cable modem that stores CDC descriptors in the wrong place. The workaround might be helpful for other hardware too. (This was a 2.4 regression.) - Recognizes another Zaurus (PXA 255 based clamshell, not yet sold by Sharp in the US). - Cleaned the Zaurus stuff up a bit. Rather than expecting a new driver_info struct (or re-using the right one) for each new pxa based product, they all use the same one. So patches for new products only need new usb_device_id entries. (Also notes the issue that every Zaurus model will need to be blacklisted for CDC if the Z code isn't enabled.) drivers/usb/net/usbnet.c | 67 +++++++++++++++++++++++++---------------------- 1 files changed, 36 insertions(+), 31 deletions(-) diff -Nru a/drivers/usb/net/usbnet.c b/drivers/usb/net/usbnet.c --- a/drivers/usb/net/usbnet.c Fri Aug 1 10:55:11 2003 +++ b/drivers/usb/net/usbnet.c Fri Aug 1 10:55:11 2003 @@ -519,7 +519,17 @@ if (sizeof dev->data < sizeof *info) return -EDOM; - /* expect strict spec conformance for the descriptors */ + /* expect strict spec conformance for the descriptors, but + * cope with firmware which stores them in the wrong place + */ + if (len == 0 && dev->udev->config->extralen) { + /* Motorola SB4100 (and maybe others) put + * CDC descriptors here + */ + buf = dev->udev->config->extra; + len = dev->udev->config->extralen; + } + memset (info, 0, sizeof *info); info->control = intf; while (len > 3) { @@ -606,7 +616,7 @@ return 0; bad_desc: - // devdbg (dev, "bad CDC descriptors"); + dev_info (&dev->udev->dev, "bad CDC descriptors\n"); return -ENODEV; } @@ -1645,6 +1655,9 @@ * crc32, added to help detect when some sa1100 usb-to-memory DMA errata * haven't been fully worked around. * + * PXA based models use the same framing, and also can't implement + * set_interface properly. + * *-------------------------------------------------------------------------*/ static struct sk_buff * @@ -1684,34 +1697,14 @@ .unbind = cdc_unbind, .tx_fixup = zaurus_tx_fixup, }; -static const struct driver_info zaurus_sla300_info = { - .description = "Sharp Zaurus SL-A300", +static const struct driver_info zaurus_pxa_info = { + .description = "Sharp Zaurus, PXA-2xx based", .flags = FLAG_FRAMING_Z, .check_connect = always_connected, .tx_fixup = zaurus_tx_fixup, .in = 1, .out = 2, }; -static const struct driver_info zaurus_slb500_info = { - /* Japanese B500 ~= US SL-5600 */ - .description = "Sharp Zaurus SL-B500", - .flags = FLAG_FRAMING_Z, - .check_connect = always_connected, - .tx_fixup = zaurus_tx_fixup, - - .in = 1, .out = 2, -}; -static const struct driver_info zaurus_slc700_info = { - .description = "Sharp Zaurus SL-C700", - .flags = FLAG_FRAMING_Z, - .check_connect = always_connected, - .tx_fixup = zaurus_tx_fixup, - - .in = 1, .out = 2, -}; - - -// SL-5600 and C-700 are PXA based; should resemble A300 #endif @@ -2731,6 +2724,8 @@ /* * SA-1100 based Sharp Zaurus ("collie"), or compatible. * Same idea as above, but different framing. + * + * PXA-2xx based models are also lying-about-cdc. */ { .match_flags = USB_DEVICE_ID_MATCH_INT_INFO @@ -2746,29 +2741,38 @@ .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | USB_DEVICE_ID_MATCH_DEVICE, .idVendor = 0x04DD, - .idProduct = 0x8005, + .idProduct = 0x8005, /* A-300 */ .bInterfaceClass = 0x02, .bInterfaceSubClass = 0x0a, .bInterfaceProtocol = 0x00, - .driver_info = (unsigned long) &zaurus_sla300_info, + .driver_info = (unsigned long) &zaurus_pxa_info, }, { .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | USB_DEVICE_ID_MATCH_DEVICE, .idVendor = 0x04DD, - .idProduct = 0x8006, + .idProduct = 0x8006, /* B-500/SL-5600 */ .bInterfaceClass = 0x02, .bInterfaceSubClass = 0x0a, .bInterfaceProtocol = 0x00, - .driver_info = (unsigned long) &zaurus_slb500_info, + .driver_info = (unsigned long) &zaurus_pxa_info, }, { .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | USB_DEVICE_ID_MATCH_DEVICE, - .idVendor = 0x04DD, - .idProduct = 0x8007, + .idVendor = 0x04DD, + .idProduct = 0x8007, /* C-700 */ .bInterfaceClass = 0x02, .bInterfaceSubClass = 0x0a, .bInterfaceProtocol = 0x00, - .driver_info = (unsigned long) &zaurus_slc700_info, + .driver_info = (unsigned long) &zaurus_pxa_info, +}, { + .match_flags = USB_DEVICE_ID_MATCH_INT_INFO + | USB_DEVICE_ID_MATCH_DEVICE, + .idVendor = 0x04DD, + .idProduct = 0x9031, /* C-750 */ + .bInterfaceClass = 0x02, + .bInterfaceSubClass = 0x0a, + .bInterfaceProtocol = 0x00, + .driver_info = (unsigned long) &zaurus_pxa_info, }, #endif @@ -2787,6 +2791,7 @@ .bInterfaceProtocol = 0, .driver_info = 0, /* BLACKLIST */ }, + // FIXME blacklist the other Zaurus models too, sigh #endif {