11ccea77eSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
25b2fc499SJeff Garzik /*
35b2fc499SJeff Garzik * Copyright (C) 2002 Pavel Machek <pavel@ucw.cz>
45b2fc499SJeff Garzik * Copyright (C) 2002-2005 by David Brownell
55b2fc499SJeff Garzik */
65b2fc499SJeff Garzik
75b2fc499SJeff Garzik // #define DEBUG // error path messages, extra info
85b2fc499SJeff Garzik // #define VERBOSE // more; success messages
95b2fc499SJeff Garzik
105b2fc499SJeff Garzik #include <linux/module.h>
115b2fc499SJeff Garzik #include <linux/netdevice.h>
125b2fc499SJeff Garzik #include <linux/ethtool.h>
135b2fc499SJeff Garzik #include <linux/workqueue.h>
145b2fc499SJeff Garzik #include <linux/mii.h>
155b2fc499SJeff Garzik #include <linux/crc32.h>
165b2fc499SJeff Garzik #include <linux/usb.h>
175b2fc499SJeff Garzik #include <linux/usb/cdc.h>
183692e94fSJussi Kivilinna #include <linux/usb/usbnet.h>
195b2fc499SJeff Garzik
205b2fc499SJeff Garzik
215b2fc499SJeff Garzik /*
225b2fc499SJeff Garzik * All known Zaurii lie about their standards conformance. At least
235b2fc499SJeff Garzik * the earliest SA-1100 models lie by saying they support CDC Ethernet.
245b2fc499SJeff Garzik * Some later models (especially PXA-25x and PXA-27x based ones) lie
255b2fc499SJeff Garzik * and say they support CDC MDLM (for access to cell phone modems).
265b2fc499SJeff Garzik *
275b2fc499SJeff Garzik * There are non-Zaurus products that use these same protocols too.
285b2fc499SJeff Garzik *
295b2fc499SJeff Garzik * The annoying thing is that at the same time Sharp was developing
305b2fc499SJeff Garzik * that annoying standards-breaking software, the Linux community had
315b2fc499SJeff Garzik * a simple "CDC Subset" working reliably on the same SA-1100 hardware.
325b2fc499SJeff Garzik * That is, the same functionality but not violating standards.
335b2fc499SJeff Garzik *
345b2fc499SJeff Garzik * The CDC Ethernet nonconformance points are troublesome to hosts
355b2fc499SJeff Garzik * with a true CDC Ethernet implementation:
365b2fc499SJeff Garzik * - Framing appends a CRC, which the spec says drivers "must not" do;
375b2fc499SJeff Garzik * - Transfers data in altsetting zero, instead of altsetting 1;
385b2fc499SJeff Garzik * - All these peripherals use the same ethernet address.
395b2fc499SJeff Garzik *
405b2fc499SJeff Garzik * The CDC MDLM nonconformance is less immediately troublesome, since all
415b2fc499SJeff Garzik * MDLM implementations are quasi-proprietary anyway.
425b2fc499SJeff Garzik */
435b2fc499SJeff Garzik
445b2fc499SJeff Garzik static struct sk_buff *
zaurus_tx_fixup(struct usbnet * dev,struct sk_buff * skb,gfp_t flags)455b2fc499SJeff Garzik zaurus_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags)
465b2fc499SJeff Garzik {
475b2fc499SJeff Garzik int padlen;
485b2fc499SJeff Garzik struct sk_buff *skb2;
495b2fc499SJeff Garzik
505b2fc499SJeff Garzik padlen = 2;
515b2fc499SJeff Garzik if (!skb_cloned(skb)) {
525b2fc499SJeff Garzik int tailroom = skb_tailroom(skb);
535b2fc499SJeff Garzik if ((padlen + 4) <= tailroom)
545b2fc499SJeff Garzik goto done;
555b2fc499SJeff Garzik }
565b2fc499SJeff Garzik skb2 = skb_copy_expand(skb, 0, 4 + padlen, flags);
575b2fc499SJeff Garzik dev_kfree_skb_any(skb);
585b2fc499SJeff Garzik skb = skb2;
595b2fc499SJeff Garzik if (skb) {
605b2fc499SJeff Garzik u32 fcs;
615b2fc499SJeff Garzik done:
625b2fc499SJeff Garzik fcs = crc32_le(~0, skb->data, skb->len);
635b2fc499SJeff Garzik fcs = ~fcs;
645b2fc499SJeff Garzik
65634fef61SJohannes Berg skb_put_u8(skb, fcs & 0xff);
66634fef61SJohannes Berg skb_put_u8(skb, (fcs >> 8) & 0xff);
67634fef61SJohannes Berg skb_put_u8(skb, (fcs >> 16) & 0xff);
68634fef61SJohannes Berg skb_put_u8(skb, (fcs >> 24) & 0xff);
695b2fc499SJeff Garzik }
705b2fc499SJeff Garzik return skb;
715b2fc499SJeff Garzik }
725b2fc499SJeff Garzik
zaurus_bind(struct usbnet * dev,struct usb_interface * intf)735b2fc499SJeff Garzik static int zaurus_bind(struct usbnet *dev, struct usb_interface *intf)
745b2fc499SJeff Garzik {
755b2fc499SJeff Garzik /* Belcarra's funky framing has other options; mostly
765b2fc499SJeff Garzik * TRAILERS (!) with 4 bytes CRC, and maybe 2 pad bytes.
775b2fc499SJeff Garzik */
785b2fc499SJeff Garzik dev->net->hard_header_len += 6;
795b2fc499SJeff Garzik dev->rx_urb_size = dev->net->hard_header_len + dev->net->mtu;
805b2fc499SJeff Garzik return usbnet_generic_cdc_bind(dev, intf);
815b2fc499SJeff Garzik }
825b2fc499SJeff Garzik
835b2fc499SJeff Garzik /* PDA style devices are always connected if present */
always_connected(struct usbnet * dev)845b2fc499SJeff Garzik static int always_connected (struct usbnet *dev)
855b2fc499SJeff Garzik {
865b2fc499SJeff Garzik return 0;
875b2fc499SJeff Garzik }
885b2fc499SJeff Garzik
895b2fc499SJeff Garzik static const struct driver_info zaurus_sl5x00_info = {
905b2fc499SJeff Garzik .description = "Sharp Zaurus SL-5x00",
91c261344dSArnd Bergmann .flags = FLAG_POINTTOPOINT | FLAG_FRAMING_Z,
925b2fc499SJeff Garzik .check_connect = always_connected,
935b2fc499SJeff Garzik .bind = zaurus_bind,
945b2fc499SJeff Garzik .unbind = usbnet_cdc_unbind,
955b2fc499SJeff Garzik .tx_fixup = zaurus_tx_fixup,
965b2fc499SJeff Garzik };
975b2fc499SJeff Garzik #define ZAURUS_STRONGARM_INFO ((unsigned long)&zaurus_sl5x00_info)
985b2fc499SJeff Garzik
995b2fc499SJeff Garzik static const struct driver_info zaurus_pxa_info = {
1005b2fc499SJeff Garzik .description = "Sharp Zaurus, PXA-2xx based",
101c261344dSArnd Bergmann .flags = FLAG_POINTTOPOINT | FLAG_FRAMING_Z,
1025b2fc499SJeff Garzik .check_connect = always_connected,
1035b2fc499SJeff Garzik .bind = zaurus_bind,
1045b2fc499SJeff Garzik .unbind = usbnet_cdc_unbind,
1055b2fc499SJeff Garzik .tx_fixup = zaurus_tx_fixup,
1065b2fc499SJeff Garzik };
1075b2fc499SJeff Garzik #define ZAURUS_PXA_INFO ((unsigned long)&zaurus_pxa_info)
1085b2fc499SJeff Garzik
1095b2fc499SJeff Garzik static const struct driver_info olympus_mxl_info = {
1105b2fc499SJeff Garzik .description = "Olympus R1000",
111c261344dSArnd Bergmann .flags = FLAG_POINTTOPOINT | FLAG_FRAMING_Z,
1125b2fc499SJeff Garzik .check_connect = always_connected,
1135b2fc499SJeff Garzik .bind = zaurus_bind,
1145b2fc499SJeff Garzik .unbind = usbnet_cdc_unbind,
1155b2fc499SJeff Garzik .tx_fixup = zaurus_tx_fixup,
1165b2fc499SJeff Garzik };
1175b2fc499SJeff Garzik #define OLYMPUS_MXL_INFO ((unsigned long)&olympus_mxl_info)
1185b2fc499SJeff Garzik
1195b2fc499SJeff Garzik
1205b2fc499SJeff Garzik /* Some more recent products using Lineo/Belcarra code will wrongly claim
1215b2fc499SJeff Garzik * CDC MDLM conformance. They aren't conformant: data endpoints live
1225b2fc499SJeff Garzik * in the control interface, there's no data interface, and it's not used
1235b2fc499SJeff Garzik * to talk to a cell phone radio. But at least we can detect these two
1245b2fc499SJeff Garzik * pseudo-classes, rather than growing this product list with entries for
1255b2fc499SJeff Garzik * each new nonconformant product (sigh).
1265b2fc499SJeff Garzik */
1275b2fc499SJeff Garzik static const u8 safe_guid[16] = {
1285b2fc499SJeff Garzik 0x5d, 0x34, 0xcf, 0x66, 0x11, 0x18, 0x11, 0xd6,
1295b2fc499SJeff Garzik 0xa2, 0x1a, 0x00, 0x01, 0x02, 0xca, 0x9a, 0x7f,
1305b2fc499SJeff Garzik };
1315b2fc499SJeff Garzik static const u8 blan_guid[16] = {
1325b2fc499SJeff Garzik 0x74, 0xf0, 0x3d, 0xbd, 0x1e, 0xc1, 0x44, 0x70,
1335b2fc499SJeff Garzik 0xa3, 0x67, 0x71, 0x34, 0xc9, 0xf5, 0x54, 0x37,
1345b2fc499SJeff Garzik };
1355b2fc499SJeff Garzik
blan_mdlm_bind(struct usbnet * dev,struct usb_interface * intf)1365b2fc499SJeff Garzik static int blan_mdlm_bind(struct usbnet *dev, struct usb_interface *intf)
1375b2fc499SJeff Garzik {
1385b2fc499SJeff Garzik u8 *buf = intf->cur_altsetting->extra;
1395b2fc499SJeff Garzik int len = intf->cur_altsetting->extralen;
1405b2fc499SJeff Garzik struct usb_cdc_mdlm_desc *desc = NULL;
1415b2fc499SJeff Garzik struct usb_cdc_mdlm_detail_desc *detail = NULL;
1425b2fc499SJeff Garzik
1435b2fc499SJeff Garzik while (len > 3) {
1445b2fc499SJeff Garzik if (buf [1] != USB_DT_CS_INTERFACE)
1455b2fc499SJeff Garzik goto next_desc;
1465b2fc499SJeff Garzik
1475b2fc499SJeff Garzik /* use bDescriptorSubType, and just verify that we get a
1485b2fc499SJeff Garzik * "BLAN" (or "SAFE") descriptor.
1495b2fc499SJeff Garzik */
1505b2fc499SJeff Garzik switch (buf [2]) {
1515b2fc499SJeff Garzik case USB_CDC_MDLM_TYPE:
1525b2fc499SJeff Garzik if (desc) {
1535b2fc499SJeff Garzik dev_dbg(&intf->dev, "extra MDLM\n");
1545b2fc499SJeff Garzik goto bad_desc;
1555b2fc499SJeff Garzik }
1565b2fc499SJeff Garzik desc = (void *) buf;
1575b2fc499SJeff Garzik if (desc->bLength != sizeof *desc) {
1585b2fc499SJeff Garzik dev_dbg(&intf->dev, "MDLM len %u\n",
1595b2fc499SJeff Garzik desc->bLength);
1605b2fc499SJeff Garzik goto bad_desc;
1615b2fc499SJeff Garzik }
1625b2fc499SJeff Garzik /* expect bcdVersion 1.0, ignore */
1638e95a202SJoe Perches if (memcmp(&desc->bGUID, blan_guid, 16) &&
1648e95a202SJoe Perches memcmp(&desc->bGUID, safe_guid, 16)) {
1655b2fc499SJeff Garzik /* hey, this one might _really_ be MDLM! */
1665b2fc499SJeff Garzik dev_dbg(&intf->dev, "MDLM guid\n");
1675b2fc499SJeff Garzik goto bad_desc;
1685b2fc499SJeff Garzik }
1695b2fc499SJeff Garzik break;
1705b2fc499SJeff Garzik case USB_CDC_MDLM_DETAIL_TYPE:
1715b2fc499SJeff Garzik if (detail) {
1725b2fc499SJeff Garzik dev_dbg(&intf->dev, "extra MDLM detail\n");
1735b2fc499SJeff Garzik goto bad_desc;
1745b2fc499SJeff Garzik }
1755b2fc499SJeff Garzik detail = (void *) buf;
1765b2fc499SJeff Garzik switch (detail->bGuidDescriptorType) {
1775b2fc499SJeff Garzik case 0: /* "SAFE" */
1785b2fc499SJeff Garzik if (detail->bLength != (sizeof *detail + 2))
1795b2fc499SJeff Garzik goto bad_detail;
1805b2fc499SJeff Garzik break;
1815b2fc499SJeff Garzik case 1: /* "BLAN" */
1825b2fc499SJeff Garzik if (detail->bLength != (sizeof *detail + 3))
1835b2fc499SJeff Garzik goto bad_detail;
1845b2fc499SJeff Garzik break;
1855b2fc499SJeff Garzik default:
1865b2fc499SJeff Garzik goto bad_detail;
1875b2fc499SJeff Garzik }
1885b2fc499SJeff Garzik
1895b2fc499SJeff Garzik /* assuming we either noticed BLAN already, or will
1905b2fc499SJeff Garzik * find it soon, there are some data bytes here:
1915b2fc499SJeff Garzik * - bmNetworkCapabilities (unused)
1925b2fc499SJeff Garzik * - bmDataCapabilities (bits, see below)
1935b2fc499SJeff Garzik * - bPad (ignored, for PADAFTER -- BLAN-only)
1945b2fc499SJeff Garzik * bits are:
1955b2fc499SJeff Garzik * - 0x01 -- Zaurus framing (add CRC)
1965b2fc499SJeff Garzik * - 0x02 -- PADBEFORE (CRC includes some padding)
1975b2fc499SJeff Garzik * - 0x04 -- PADAFTER (some padding after CRC)
1985b2fc499SJeff Garzik * - 0x08 -- "fermat" packet mangling (for hw bugs)
1995b2fc499SJeff Garzik * the PADBEFORE appears not to matter; we interop
2005b2fc499SJeff Garzik * with devices that use it and those that don't.
2015b2fc499SJeff Garzik */
2025b2fc499SJeff Garzik if ((detail->bDetailData[1] & ~0x02) != 0x01) {
2035b2fc499SJeff Garzik /* bmDataCapabilities == 0 would be fine too,
2045b2fc499SJeff Garzik * but framing is minidriver-coupled for now.
2055b2fc499SJeff Garzik */
2065b2fc499SJeff Garzik bad_detail:
2075b2fc499SJeff Garzik dev_dbg(&intf->dev,
2085b2fc499SJeff Garzik "bad MDLM detail, %d %d %d\n",
2095b2fc499SJeff Garzik detail->bLength,
2105b2fc499SJeff Garzik detail->bDetailData[0],
2115b2fc499SJeff Garzik detail->bDetailData[2]);
2125b2fc499SJeff Garzik goto bad_desc;
2135b2fc499SJeff Garzik }
2145b2fc499SJeff Garzik
2155b2fc499SJeff Garzik /* same extra framing as for non-BLAN mode */
2165b2fc499SJeff Garzik dev->net->hard_header_len += 6;
2175b2fc499SJeff Garzik dev->rx_urb_size = dev->net->hard_header_len
2185b2fc499SJeff Garzik + dev->net->mtu;
2195b2fc499SJeff Garzik break;
2205b2fc499SJeff Garzik }
2215b2fc499SJeff Garzik next_desc:
2225b2fc499SJeff Garzik len -= buf [0]; /* bLength */
2235b2fc499SJeff Garzik buf += buf [0];
2245b2fc499SJeff Garzik }
2255b2fc499SJeff Garzik
2265b2fc499SJeff Garzik if (!desc || !detail) {
2275b2fc499SJeff Garzik dev_dbg(&intf->dev, "missing cdc mdlm %s%sdescriptor\n",
2285b2fc499SJeff Garzik desc ? "" : "func ",
2295b2fc499SJeff Garzik detail ? "" : "detail ");
2305b2fc499SJeff Garzik goto bad_desc;
2315b2fc499SJeff Garzik }
2325b2fc499SJeff Garzik
2335b2fc499SJeff Garzik /* There's probably a CDC Ethernet descriptor there, but we can't
2345b2fc499SJeff Garzik * rely on the Ethernet address it provides since not all vendors
2355b2fc499SJeff Garzik * bother to make it unique. Likewise there's no point in tracking
2365b2fc499SJeff Garzik * of the CDC event notifications.
2375b2fc499SJeff Garzik */
2385b2fc499SJeff Garzik return usbnet_get_endpoints(dev, intf);
2395b2fc499SJeff Garzik
2405b2fc499SJeff Garzik bad_desc:
2415b2fc499SJeff Garzik dev_info(&dev->udev->dev, "unsupported MDLM descriptors\n");
2425b2fc499SJeff Garzik return -ENODEV;
2435b2fc499SJeff Garzik }
2445b2fc499SJeff Garzik
2455b2fc499SJeff Garzik static const struct driver_info bogus_mdlm_info = {
2465b2fc499SJeff Garzik .description = "pseudo-MDLM (BLAN) device",
247c261344dSArnd Bergmann .flags = FLAG_POINTTOPOINT | FLAG_FRAMING_Z,
2485b2fc499SJeff Garzik .check_connect = always_connected,
2495b2fc499SJeff Garzik .tx_fixup = zaurus_tx_fixup,
2505b2fc499SJeff Garzik .bind = blan_mdlm_bind,
2515b2fc499SJeff Garzik };
2525b2fc499SJeff Garzik
2535b2fc499SJeff Garzik static const struct usb_device_id products [] = {
2545b2fc499SJeff Garzik #define ZAURUS_MASTER_INTERFACE \
2555b2fc499SJeff Garzik .bInterfaceClass = USB_CLASS_COMM, \
2565b2fc499SJeff Garzik .bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET, \
2575b2fc499SJeff Garzik .bInterfaceProtocol = USB_CDC_PROTO_NONE
2585b2fc499SJeff Garzik
2596605cc67SOliver Neukum #define ZAURUS_FAKE_INTERFACE \
2606605cc67SOliver Neukum .bInterfaceClass = USB_CLASS_COMM, \
2616605cc67SOliver Neukum .bInterfaceSubClass = USB_CDC_SUBCLASS_MDLM, \
2626605cc67SOliver Neukum .bInterfaceProtocol = USB_CDC_PROTO_NONE
2636605cc67SOliver Neukum
2645b2fc499SJeff Garzik /* SA-1100 based Sharp Zaurus ("collie"), or compatible. */
2655b2fc499SJeff Garzik {
2665b2fc499SJeff Garzik .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
2675b2fc499SJeff Garzik | USB_DEVICE_ID_MATCH_DEVICE,
2685b2fc499SJeff Garzik .idVendor = 0x04DD,
2695b2fc499SJeff Garzik .idProduct = 0x8004,
2705b2fc499SJeff Garzik ZAURUS_MASTER_INTERFACE,
2715b2fc499SJeff Garzik .driver_info = ZAURUS_STRONGARM_INFO,
2725b2fc499SJeff Garzik },
2735b2fc499SJeff Garzik
2745b2fc499SJeff Garzik /* PXA-2xx based models are also lying-about-cdc. If you add any
2755b2fc499SJeff Garzik * more devices that claim to be CDC Ethernet, make sure they get
2765b2fc499SJeff Garzik * added to the blacklist in cdc_ether too.
2775b2fc499SJeff Garzik *
2785b2fc499SJeff Garzik * NOTE: OpenZaurus versions with 2.6 kernels won't use these entries,
2795b2fc499SJeff Garzik * unlike the older ones with 2.4 "embedix" kernels.
2805b2fc499SJeff Garzik */
2815b2fc499SJeff Garzik {
2825b2fc499SJeff Garzik .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
2835b2fc499SJeff Garzik | USB_DEVICE_ID_MATCH_DEVICE,
2845b2fc499SJeff Garzik .idVendor = 0x04DD,
2855b2fc499SJeff Garzik .idProduct = 0x8005, /* A-300 */
2865b2fc499SJeff Garzik ZAURUS_MASTER_INTERFACE,
2875b2fc499SJeff Garzik .driver_info = ZAURUS_PXA_INFO,
2885b2fc499SJeff Garzik }, {
2895b2fc499SJeff Garzik .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
2905b2fc499SJeff Garzik | USB_DEVICE_ID_MATCH_DEVICE,
2915b2fc499SJeff Garzik .idVendor = 0x04DD,
292*b99225b4SRoss Maynard .idProduct = 0x8005, /* A-300 */
293*b99225b4SRoss Maynard ZAURUS_FAKE_INTERFACE,
294*b99225b4SRoss Maynard .driver_info = (unsigned long)&bogus_mdlm_info,
295*b99225b4SRoss Maynard }, {
296*b99225b4SRoss Maynard .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
297*b99225b4SRoss Maynard | USB_DEVICE_ID_MATCH_DEVICE,
298*b99225b4SRoss Maynard .idVendor = 0x04DD,
2995b2fc499SJeff Garzik .idProduct = 0x8006, /* B-500/SL-5600 */
3005b2fc499SJeff Garzik ZAURUS_MASTER_INTERFACE,
3015b2fc499SJeff Garzik .driver_info = ZAURUS_PXA_INFO,
3025b2fc499SJeff Garzik }, {
3035b2fc499SJeff Garzik .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
3045b2fc499SJeff Garzik | USB_DEVICE_ID_MATCH_DEVICE,
3055b2fc499SJeff Garzik .idVendor = 0x04DD,
306*b99225b4SRoss Maynard .idProduct = 0x8006, /* B-500/SL-5600 */
307*b99225b4SRoss Maynard ZAURUS_FAKE_INTERFACE,
308*b99225b4SRoss Maynard .driver_info = (unsigned long)&bogus_mdlm_info,
309*b99225b4SRoss Maynard }, {
310*b99225b4SRoss Maynard .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
311*b99225b4SRoss Maynard | USB_DEVICE_ID_MATCH_DEVICE,
312*b99225b4SRoss Maynard .idVendor = 0x04DD,
3135b2fc499SJeff Garzik .idProduct = 0x8007, /* C-700 */
3145b2fc499SJeff Garzik ZAURUS_MASTER_INTERFACE,
3155b2fc499SJeff Garzik .driver_info = ZAURUS_PXA_INFO,
3165b2fc499SJeff Garzik }, {
3175b2fc499SJeff Garzik .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
3185b2fc499SJeff Garzik | USB_DEVICE_ID_MATCH_DEVICE,
3195b2fc499SJeff Garzik .idVendor = 0x04DD,
320*b99225b4SRoss Maynard .idProduct = 0x8007, /* C-700 */
321*b99225b4SRoss Maynard ZAURUS_FAKE_INTERFACE,
322*b99225b4SRoss Maynard .driver_info = (unsigned long)&bogus_mdlm_info,
323*b99225b4SRoss Maynard }, {
324*b99225b4SRoss Maynard .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
325*b99225b4SRoss Maynard | USB_DEVICE_ID_MATCH_DEVICE,
326*b99225b4SRoss Maynard .idVendor = 0x04DD,
3275b2fc499SJeff Garzik .idProduct = 0x9031, /* C-750 C-760 */
3285b2fc499SJeff Garzik ZAURUS_MASTER_INTERFACE,
3295b2fc499SJeff Garzik .driver_info = ZAURUS_PXA_INFO,
3305b2fc499SJeff Garzik }, {
33115103aa7SDave Jones /* C-750/C-760/C-860/SL-C3000 PDA in MDLM mode */
33215103aa7SDave Jones USB_DEVICE_AND_INTERFACE_INFO(0x04DD, 0x9031, USB_CLASS_COMM,
33315103aa7SDave Jones USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
33415103aa7SDave Jones .driver_info = (unsigned long) &bogus_mdlm_info,
33515103aa7SDave Jones }, {
3365b2fc499SJeff Garzik .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
3375b2fc499SJeff Garzik | USB_DEVICE_ID_MATCH_DEVICE,
3385b2fc499SJeff Garzik .idVendor = 0x04DD,
3395b2fc499SJeff Garzik .idProduct = 0x9032, /* SL-6000 */
3405b2fc499SJeff Garzik ZAURUS_MASTER_INTERFACE,
3415b2fc499SJeff Garzik .driver_info = ZAURUS_PXA_INFO,
3425b2fc499SJeff Garzik }, {
3435b2fc499SJeff Garzik .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
3445b2fc499SJeff Garzik | USB_DEVICE_ID_MATCH_DEVICE,
3455b2fc499SJeff Garzik .idVendor = 0x04DD,
3466605cc67SOliver Neukum .idProduct = 0x9032, /* SL-6000 */
3476605cc67SOliver Neukum ZAURUS_FAKE_INTERFACE,
3486605cc67SOliver Neukum .driver_info = (unsigned long)&bogus_mdlm_info,
3496605cc67SOliver Neukum }, {
3506605cc67SOliver Neukum .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
3516605cc67SOliver Neukum | USB_DEVICE_ID_MATCH_DEVICE,
3526605cc67SOliver Neukum .idVendor = 0x04DD,
3535b2fc499SJeff Garzik /* reported with some C860 units */
3545b2fc499SJeff Garzik .idProduct = 0x9050, /* C-860 */
3555b2fc499SJeff Garzik ZAURUS_MASTER_INTERFACE,
3565b2fc499SJeff Garzik .driver_info = ZAURUS_PXA_INFO,
3575b2fc499SJeff Garzik },
3585b2fc499SJeff Garzik {
359a2daf263SGuan Xin /* Motorola Rokr E6 */
360a2daf263SGuan Xin USB_DEVICE_AND_INTERFACE_INFO(0x22b8, 0x6027, USB_CLASS_COMM,
361a2daf263SGuan Xin USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
362a2daf263SGuan Xin .driver_info = (unsigned long) &bogus_mdlm_info,
363a2daf263SGuan Xin }, {
36452c0326bSDmitriy Taychenachev /* Motorola MOTOMAGX phones */
36552c0326bSDmitriy Taychenachev USB_DEVICE_AND_INTERFACE_INFO(0x22b8, 0x6425, USB_CLASS_COMM,
36652c0326bSDmitriy Taychenachev USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
36752c0326bSDmitriy Taychenachev .driver_info = (unsigned long) &bogus_mdlm_info,
3685b2fc499SJeff Garzik },
3695b2fc499SJeff Garzik
3705b2fc499SJeff Garzik /* Olympus has some models with a Zaurus-compatible option.
3715b2fc499SJeff Garzik * R-1000 uses a FreeScale i.MXL cpu (ARMv4T)
3725b2fc499SJeff Garzik */
3735b2fc499SJeff Garzik {
3745b2fc499SJeff Garzik .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
3755b2fc499SJeff Garzik | USB_DEVICE_ID_MATCH_DEVICE,
3765b2fc499SJeff Garzik .idVendor = 0x07B4,
3775b2fc499SJeff Garzik .idProduct = 0x0F02, /* R-1000 */
3785b2fc499SJeff Garzik ZAURUS_MASTER_INTERFACE,
3795b2fc499SJeff Garzik .driver_info = OLYMPUS_MXL_INFO,
3805b2fc499SJeff Garzik },
381ee932bf9SScott Talbert
382ee932bf9SScott Talbert /* Logitech Harmony 900 - uses the pseudo-MDLM (BLAN) driver */
383ee932bf9SScott Talbert {
384ee932bf9SScott Talbert USB_DEVICE_AND_INTERFACE_INFO(0x046d, 0xc11f, USB_CLASS_COMM,
385ee932bf9SScott Talbert USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
386ee932bf9SScott Talbert .driver_info = (unsigned long) &bogus_mdlm_info,
387ee932bf9SScott Talbert },
3885b2fc499SJeff Garzik { }, // END
3895b2fc499SJeff Garzik };
3905b2fc499SJeff Garzik MODULE_DEVICE_TABLE(usb, products);
3915b2fc499SJeff Garzik
3925b2fc499SJeff Garzik static struct usb_driver zaurus_driver = {
3935b2fc499SJeff Garzik .name = "zaurus",
3945b2fc499SJeff Garzik .id_table = products,
3955b2fc499SJeff Garzik .probe = usbnet_probe,
3965b2fc499SJeff Garzik .disconnect = usbnet_disconnect,
3975b2fc499SJeff Garzik .suspend = usbnet_suspend,
3985b2fc499SJeff Garzik .resume = usbnet_resume,
399e1f12eb6SSarah Sharp .disable_hub_initiated_lpm = 1,
4005b2fc499SJeff Garzik };
4015b2fc499SJeff Garzik
402d632eb1bSGreg Kroah-Hartman module_usb_driver(zaurus_driver);
4035b2fc499SJeff Garzik
4045b2fc499SJeff Garzik MODULE_AUTHOR("Pavel Machek, David Brownell");
4055b2fc499SJeff Garzik MODULE_DESCRIPTION("Sharp Zaurus PDA, and compatible products");
4065b2fc499SJeff Garzik MODULE_LICENSE("GPL");
407