^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * CDC Ethernet based networking peripherals
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 2003-2005 by David Brownell
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2006 by Ole Andre Vadla Ravnas (ActiveSync)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) // #define DEBUG // error path messages, extra info
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) // #define VERBOSE // more; success messages
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/netdevice.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/etherdevice.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/ethtool.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/workqueue.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/mii.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/usb.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/usb/cdc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/usb/usbnet.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #if IS_ENABLED(CONFIG_USB_NET_RNDIS_HOST)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) static int is_rndis(struct usb_interface_descriptor *desc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) return (desc->bInterfaceClass == USB_CLASS_COMM &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) desc->bInterfaceSubClass == 2 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) desc->bInterfaceProtocol == 0xff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) static int is_activesync(struct usb_interface_descriptor *desc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) return (desc->bInterfaceClass == USB_CLASS_MISC &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) desc->bInterfaceSubClass == 1 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) desc->bInterfaceProtocol == 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) static int is_wireless_rndis(struct usb_interface_descriptor *desc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) return (desc->bInterfaceClass == USB_CLASS_WIRELESS_CONTROLLER &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) desc->bInterfaceSubClass == 1 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) desc->bInterfaceProtocol == 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) static int is_novatel_rndis(struct usb_interface_descriptor *desc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) return (desc->bInterfaceClass == USB_CLASS_MISC &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) desc->bInterfaceSubClass == 4 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) desc->bInterfaceProtocol == 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define is_rndis(desc) 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define is_activesync(desc) 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define is_wireless_rndis(desc) 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define is_novatel_rndis(desc) 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) static const u8 mbm_guid[16] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) 0xa3, 0x17, 0xa8, 0x8b, 0x04, 0x5e, 0x4f, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) 0xa6, 0x07, 0xc0, 0xff, 0xcb, 0x7e, 0x39, 0x2a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) void usbnet_cdc_update_filter(struct usbnet *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) struct net_device *net = dev->net;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) u16 cdc_filter = USB_CDC_PACKET_TYPE_DIRECTED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) | USB_CDC_PACKET_TYPE_BROADCAST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) /* filtering on the device is an optional feature and not worth
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) * the hassle so we just roughly care about snooping and if any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) * multicast is requested, we take every multicast
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) if (net->flags & IFF_PROMISC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) cdc_filter |= USB_CDC_PACKET_TYPE_PROMISCUOUS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) if (!netdev_mc_empty(net) || (net->flags & IFF_ALLMULTI))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) cdc_filter |= USB_CDC_PACKET_TYPE_ALL_MULTICAST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) usb_control_msg(dev->udev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) usb_sndctrlpipe(dev->udev, 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) USB_CDC_SET_ETHERNET_PACKET_FILTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) USB_TYPE_CLASS | USB_RECIP_INTERFACE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) cdc_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) dev->intf->cur_altsetting->desc.bInterfaceNumber,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) USB_CTRL_SET_TIMEOUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) EXPORT_SYMBOL_GPL(usbnet_cdc_update_filter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) /* probes control interface, claims data interface, collects the bulk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) * endpoints, activates data interface (if needed), maybe sets MTU.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) * all pure cdc, except for certain firmware workarounds, and knowing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) * that rndis uses one different rule.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) u8 *buf = intf->cur_altsetting->extra;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) int len = intf->cur_altsetting->extralen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) struct usb_interface_descriptor *d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) struct cdc_state *info = (void *) &dev->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) int rndis;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) bool android_rndis_quirk = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) struct usb_driver *driver = driver_of(intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) struct usb_cdc_parsed_header header;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) if (sizeof(dev->data) < sizeof(*info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) return -EDOM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) /* expect strict spec conformance for the descriptors, but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) * cope with firmware which stores them in the wrong place
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) if (len == 0 && dev->udev->actconfig->extralen) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) /* Motorola SB4100 (and others: Brad Hards says it's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) * from a Broadcom design) put CDC descriptors here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) buf = dev->udev->actconfig->extra;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) len = dev->udev->actconfig->extralen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) dev_dbg(&intf->dev, "CDC descriptors on config\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) /* Maybe CDC descriptors are after the endpoint? This bug has
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) * been seen on some 2Wire Inc RNDIS-ish products.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) if (len == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) struct usb_host_endpoint *hep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) hep = intf->cur_altsetting->endpoint;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) if (hep) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) buf = hep->extra;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) len = hep->extralen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) if (len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) dev_dbg(&intf->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) "CDC descriptors on endpoint\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) /* this assumes that if there's a non-RNDIS vendor variant
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) * of cdc-acm, it'll fail RNDIS requests cleanly.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) rndis = (is_rndis(&intf->cur_altsetting->desc) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) is_activesync(&intf->cur_altsetting->desc) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) is_wireless_rndis(&intf->cur_altsetting->desc) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) is_novatel_rndis(&intf->cur_altsetting->desc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) memset(info, 0, sizeof(*info));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) info->control = intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) cdc_parse_cdc_header(&header, intf, buf, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) info->u = header.usb_cdc_union_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) info->header = header.usb_cdc_header_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) info->ether = header.usb_cdc_ether_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) if (!info->u) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) if (rndis)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) goto skip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) else /* in that case a quirk is mandatory */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) goto bad_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) /* we need a master/control interface (what we're
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) * probed with) and a slave/data interface; union
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) * descriptors sort this all out.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) info->control = usb_ifnum_to_if(dev->udev, info->u->bMasterInterface0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) info->data = usb_ifnum_to_if(dev->udev, info->u->bSlaveInterface0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) if (!info->control || !info->data) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) dev_dbg(&intf->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) "master #%u/%p slave #%u/%p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) info->u->bMasterInterface0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) info->control,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) info->u->bSlaveInterface0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) info->data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) /* fall back to hard-wiring for RNDIS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) if (rndis) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) android_rndis_quirk = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) goto skip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) goto bad_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) if (info->control != intf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) dev_dbg(&intf->dev, "bogus CDC Union\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) /* Ambit USB Cable Modem (and maybe others)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) * interchanges master and slave interface.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) if (info->data == intf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) info->data = info->control;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) info->control = intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) goto bad_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) /* some devices merge these - skip class check */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) if (info->control == info->data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) goto skip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) /* a data interface altsetting does the real i/o */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) d = &info->data->cur_altsetting->desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) if (d->bInterfaceClass != USB_CLASS_CDC_DATA) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) dev_dbg(&intf->dev, "slave class %u\n", d->bInterfaceClass);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) goto bad_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) skip:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) /* Communcation class functions with bmCapabilities are not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) * RNDIS. But some Wireless class RNDIS functions use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) * bmCapabilities for their own purpose. The failsafe is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) * therefore applied only to Communication class RNDIS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) * functions. The rndis test is redundant, but a cheap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) * optimization.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) if (rndis && is_rndis(&intf->cur_altsetting->desc) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) header.usb_cdc_acm_descriptor &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) header.usb_cdc_acm_descriptor->bmCapabilities) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) dev_dbg(&intf->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) "ACM capabilities %02x, not really RNDIS?\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) header.usb_cdc_acm_descriptor->bmCapabilities);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) goto bad_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) if (header.usb_cdc_ether_desc && info->ether->wMaxSegmentSize) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) dev->hard_mtu = le16_to_cpu(info->ether->wMaxSegmentSize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) /* because of Zaurus, we may be ignoring the host
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) * side link address we were given.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) if (header.usb_cdc_mdlm_desc &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) memcmp(header.usb_cdc_mdlm_desc->bGUID, mbm_guid, 16)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) dev_dbg(&intf->dev, "GUID doesn't match\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) goto bad_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) if (header.usb_cdc_mdlm_detail_desc &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) header.usb_cdc_mdlm_detail_desc->bLength <
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) (sizeof(struct usb_cdc_mdlm_detail_desc) + 1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) dev_dbg(&intf->dev, "Descriptor too short\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) goto bad_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) /* Microsoft ActiveSync based and some regular RNDIS devices lack the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) * CDC descriptors, so we'll hard-wire the interfaces and not check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) * for descriptors.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) * Some Android RNDIS devices have a CDC Union descriptor pointing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) * to non-existing interfaces. Ignore that and attempt the same
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) * hard-wired 0 and 1 interfaces.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) if (rndis && (!info->u || android_rndis_quirk)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) info->control = usb_ifnum_to_if(dev->udev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) info->data = usb_ifnum_to_if(dev->udev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) if (!info->control || !info->data || info->control != intf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) dev_dbg(&intf->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) "rndis: master #0/%p slave #1/%p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) info->control,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) info->data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) goto bad_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) } else if (!info->header || (!rndis && !info->ether)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) dev_dbg(&intf->dev, "missing cdc %s%s%sdescriptor\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) info->header ? "" : "header ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) info->u ? "" : "union ",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) info->ether ? "" : "ether ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) goto bad_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) /* claim data interface and set it up ... with side effects.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) * network traffic can't flow until an altsetting is enabled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) if (info->data != info->control) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) status = usb_driver_claim_interface(driver, info->data, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) if (status < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) status = usbnet_get_endpoints(dev, info->data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) /* ensure immediate exit from usbnet_disconnect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) usb_set_intfdata(info->data, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) if (info->data != info->control)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) usb_driver_release_interface(driver, info->data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) /* status endpoint: optional for CDC Ethernet, not RNDIS (or ACM) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) if (info->data != info->control)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) dev->status = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) if (info->control->cur_altsetting->desc.bNumEndpoints == 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) struct usb_endpoint_descriptor *desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) dev->status = &info->control->cur_altsetting->endpoint[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) desc = &dev->status->desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) if (!usb_endpoint_is_int_in(desc) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) (le16_to_cpu(desc->wMaxPacketSize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) < sizeof(struct usb_cdc_notification)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) !desc->bInterval) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) dev_dbg(&intf->dev, "bad notification endpoint\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) dev->status = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) if (rndis && !dev->status) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) dev_dbg(&intf->dev, "missing RNDIS status endpoint\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) usb_set_intfdata(info->data, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) usb_driver_release_interface(driver, info->data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) bad_desc:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) dev_info(&dev->udev->dev, "bad CDC descriptors\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) EXPORT_SYMBOL_GPL(usbnet_generic_cdc_bind);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) /* like usbnet_generic_cdc_bind() but handles filter initialization
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) * correctly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) int usbnet_ether_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) int rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) rv = usbnet_generic_cdc_bind(dev, intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) if (rv < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) goto bail_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) /* Some devices don't initialise properly. In particular
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) * the packet filter is not reset. There are devices that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) * don't do reset all the way. So the packet filter should
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) * be set to a sane initial value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) usbnet_cdc_update_filter(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) bail_out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) return rv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) EXPORT_SYMBOL_GPL(usbnet_ether_cdc_bind);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) void usbnet_cdc_unbind(struct usbnet *dev, struct usb_interface *intf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) struct cdc_state *info = (void *) &dev->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) struct usb_driver *driver = driver_of(intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) /* combined interface - nothing to do */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) if (info->data == info->control)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) /* disconnect master --> disconnect slave */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) if (intf == info->control && info->data) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) /* ensure immediate exit from usbnet_disconnect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) usb_set_intfdata(info->data, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) usb_driver_release_interface(driver, info->data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) info->data = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) /* and vice versa (just in case) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) else if (intf == info->data && info->control) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) /* ensure immediate exit from usbnet_disconnect */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) usb_set_intfdata(info->control, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) usb_driver_release_interface(driver, info->control);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) info->control = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) EXPORT_SYMBOL_GPL(usbnet_cdc_unbind);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) /* Communications Device Class, Ethernet Control model
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) * Takes two interfaces. The DATA interface is inactive till an altsetting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) * is selected. Configuration data includes class descriptors. There's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) * an optional status endpoint on the control interface.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) * This should interop with whatever the 2.4 "CDCEther.c" driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) * (by Brad Hards) talked with, with more functionality.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) static void dumpspeed(struct usbnet *dev, __le32 *speeds)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) netif_info(dev, timer, dev->net,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) "link speeds: %u kbps up, %u kbps down\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) __le32_to_cpu(speeds[0]) / 1000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) __le32_to_cpu(speeds[1]) / 1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) void usbnet_cdc_status(struct usbnet *dev, struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) struct usb_cdc_notification *event;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) if (urb->actual_length < sizeof(*event))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) /* SPEED_CHANGE can get split into two 8-byte packets */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) if (test_and_clear_bit(EVENT_STS_SPLIT, &dev->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) dumpspeed(dev, (__le32 *) urb->transfer_buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) event = urb->transfer_buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) switch (event->bNotificationType) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) case USB_CDC_NOTIFY_NETWORK_CONNECTION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) netif_dbg(dev, timer, dev->net, "CDC: carrier %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) event->wValue ? "on" : "off");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) usbnet_link_change(dev, !!event->wValue, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) case USB_CDC_NOTIFY_SPEED_CHANGE: /* tx/rx rates */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) netif_dbg(dev, timer, dev->net, "CDC: speed change (len %d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) urb->actual_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) if (urb->actual_length != (sizeof(*event) + 8))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) set_bit(EVENT_STS_SPLIT, &dev->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) dumpspeed(dev, (__le32 *) &event[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) /* USB_CDC_NOTIFY_RESPONSE_AVAILABLE can happen too (e.g. RNDIS),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) * but there are no standard formats for the response data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) netdev_err(dev->net, "CDC: unexpected notification %02x!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) event->bNotificationType);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) EXPORT_SYMBOL_GPL(usbnet_cdc_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) int usbnet_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) struct cdc_state *info = (void *) &dev->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) BUILD_BUG_ON((sizeof(((struct usbnet *)0)->data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) < sizeof(struct cdc_state)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) status = usbnet_ether_cdc_bind(dev, intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) if (status < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) status = usbnet_get_ethernet_addr(dev, info->ether->iMACAddress);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) if (status < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) usb_set_intfdata(info->data, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) usb_driver_release_interface(driver_of(intf), info->data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) EXPORT_SYMBOL_GPL(usbnet_cdc_bind);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) static int usbnet_cdc_zte_bind(struct usbnet *dev, struct usb_interface *intf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) int status = usbnet_cdc_bind(dev, intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) if (!status && (dev->net->dev_addr[0] & 0x02))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) eth_hw_addr_random(dev->net);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) /* Make sure packets have correct destination MAC address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) * A firmware bug observed on some devices (ZTE MF823/831/910) is that the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) * device sends packets with a static, bogus, random MAC address (event if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) * device MAC address has been updated). Always set MAC address to that of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) * device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) static int usbnet_cdc_zte_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) if (skb->len < ETH_HLEN || !(skb->data[0] & 0x02))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) skb_reset_mac_header(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) ether_addr_copy(eth_hdr(skb)->h_dest, dev->net->dev_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) /* Ensure correct link state
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) * Some devices (ZTE MF823/831/910) export two carrier on notifications when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) * connected. This causes the link state to be incorrect. Work around this by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) * always setting the state to off, then on.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) static void usbnet_cdc_zte_status(struct usbnet *dev, struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) struct usb_cdc_notification *event;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) if (urb->actual_length < sizeof(*event))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) event = urb->transfer_buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) if (event->bNotificationType != USB_CDC_NOTIFY_NETWORK_CONNECTION) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) usbnet_cdc_status(dev, urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) netif_dbg(dev, timer, dev->net, "CDC: carrier %s\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) event->wValue ? "on" : "off");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) if (event->wValue &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) netif_carrier_ok(dev->net))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) netif_carrier_off(dev->net);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) usbnet_link_change(dev, !!event->wValue, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) static const struct driver_info cdc_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) .description = "CDC Ethernet Device",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) .flags = FLAG_ETHER | FLAG_POINTTOPOINT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) .bind = usbnet_cdc_bind,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) .unbind = usbnet_cdc_unbind,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) .status = usbnet_cdc_status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) .set_rx_mode = usbnet_cdc_update_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) .manage_power = usbnet_manage_power,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) static const struct driver_info zte_cdc_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) .description = "ZTE CDC Ethernet Device",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) .flags = FLAG_ETHER | FLAG_POINTTOPOINT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) .bind = usbnet_cdc_zte_bind,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) .unbind = usbnet_cdc_unbind,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) .status = usbnet_cdc_zte_status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) .set_rx_mode = usbnet_cdc_update_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) .manage_power = usbnet_manage_power,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) .rx_fixup = usbnet_cdc_zte_rx_fixup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) static const struct driver_info wwan_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) .description = "Mobile Broadband Network Device",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) .flags = FLAG_WWAN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) .bind = usbnet_cdc_bind,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) .unbind = usbnet_cdc_unbind,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) .status = usbnet_cdc_status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) .set_rx_mode = usbnet_cdc_update_filter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) .manage_power = usbnet_manage_power,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) /*-------------------------------------------------------------------------*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) #define HUAWEI_VENDOR_ID 0x12D1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) #define NOVATEL_VENDOR_ID 0x1410
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) #define ZTE_VENDOR_ID 0x19D2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) #define DELL_VENDOR_ID 0x413C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) #define REALTEK_VENDOR_ID 0x0bda
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) #define SAMSUNG_VENDOR_ID 0x04e8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) #define LENOVO_VENDOR_ID 0x17ef
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) #define LINKSYS_VENDOR_ID 0x13b1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) #define NVIDIA_VENDOR_ID 0x0955
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) #define HP_VENDOR_ID 0x03f0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) #define MICROSOFT_VENDOR_ID 0x045e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) #define UBLOX_VENDOR_ID 0x1546
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) #define TPLINK_VENDOR_ID 0x2357
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) #define AQUANTIA_VENDOR_ID 0x2eca
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) #define ASIX_VENDOR_ID 0x0b95
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) static const struct usb_device_id products[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) /* BLACKLIST !!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) * First blacklist any products that are egregiously nonconformant
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) * with the CDC Ethernet specs. Minor braindamage we cope with; when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) * they're not even trying, needing a separate driver is only the first
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) * of the differences to show up.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) #define ZAURUS_MASTER_INTERFACE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) .bInterfaceClass = USB_CLASS_COMM, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) .bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) .bInterfaceProtocol = USB_CDC_PROTO_NONE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) #define ZAURUS_FAKE_INTERFACE \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) .bInterfaceClass = USB_CLASS_COMM, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) .bInterfaceSubClass = USB_CDC_SUBCLASS_MDLM, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) .bInterfaceProtocol = USB_CDC_PROTO_NONE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) /* SA-1100 based Sharp Zaurus ("collie"), or compatible;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) * wire-incompatible with true CDC Ethernet implementations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) * (And, it seems, needlessly so...)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) | USB_DEVICE_ID_MATCH_DEVICE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) .idVendor = 0x04DD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) .idProduct = 0x8004,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) ZAURUS_MASTER_INTERFACE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) /* PXA-25x based Sharp Zaurii. Note that it seems some of these
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) * (later models especially) may have shipped only with firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) * advertising false "CDC MDLM" compatibility ... but we're not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) * clear which models did that, so for now let's assume the worst.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) | USB_DEVICE_ID_MATCH_DEVICE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) .idVendor = 0x04DD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) .idProduct = 0x8005, /* A-300 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) ZAURUS_MASTER_INTERFACE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) | USB_DEVICE_ID_MATCH_DEVICE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) .idVendor = 0x04DD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) .idProduct = 0x8006, /* B-500/SL-5600 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) ZAURUS_MASTER_INTERFACE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) | USB_DEVICE_ID_MATCH_DEVICE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) .idVendor = 0x04DD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) .idProduct = 0x8007, /* C-700 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) ZAURUS_MASTER_INTERFACE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) | USB_DEVICE_ID_MATCH_DEVICE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) .idVendor = 0x04DD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) .idProduct = 0x9031, /* C-750 C-760 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) ZAURUS_MASTER_INTERFACE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) | USB_DEVICE_ID_MATCH_DEVICE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) .idVendor = 0x04DD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) .idProduct = 0x9032, /* SL-6000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) ZAURUS_MASTER_INTERFACE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) | USB_DEVICE_ID_MATCH_DEVICE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) .idVendor = 0x04DD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) .idProduct = 0x9032, /* SL-6000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) ZAURUS_FAKE_INTERFACE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) | USB_DEVICE_ID_MATCH_DEVICE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) .idVendor = 0x04DD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) /* reported with some C860 units */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) .idProduct = 0x9050, /* C-860 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) ZAURUS_MASTER_INTERFACE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) /* Olympus has some models with a Zaurus-compatible option.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) * R-1000 uses a FreeScale i.MXL cpu (ARMv4T)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) | USB_DEVICE_ID_MATCH_DEVICE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) .idVendor = 0x07B4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) .idProduct = 0x0F02, /* R-1000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) ZAURUS_MASTER_INTERFACE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) /* LG Electronics VL600 wants additional headers on every frame */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) USB_DEVICE_AND_INTERFACE_INFO(0x1004, 0x61aa, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) /* Logitech Harmony 900 - uses the pseudo-MDLM (BLAN) driver */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) USB_DEVICE_AND_INTERFACE_INFO(0x046d, 0xc11f, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) /* Novatel USB551L and MC551 - handled by qmi_wwan */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) USB_DEVICE_AND_INTERFACE_INFO(NOVATEL_VENDOR_ID, 0xB001, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) /* Novatel E362 - handled by qmi_wwan */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) USB_DEVICE_AND_INTERFACE_INFO(NOVATEL_VENDOR_ID, 0x9010, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) /* Dell Wireless 5800 (Novatel E362) - handled by qmi_wwan */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) USB_DEVICE_AND_INTERFACE_INFO(DELL_VENDOR_ID, 0x8195, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) /* Dell Wireless 5800 (Novatel E362) - handled by qmi_wwan */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) USB_DEVICE_AND_INTERFACE_INFO(DELL_VENDOR_ID, 0x8196, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) /* Dell Wireless 5804 (Novatel E371) - handled by qmi_wwan */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) USB_DEVICE_AND_INTERFACE_INFO(DELL_VENDOR_ID, 0x819b, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) /* Novatel Expedite E371 - handled by qmi_wwan */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) USB_DEVICE_AND_INTERFACE_INFO(NOVATEL_VENDOR_ID, 0x9011, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) /* HP lt2523 (Novatel E371) - handled by qmi_wwan */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) USB_DEVICE_AND_INTERFACE_INFO(HP_VENDOR_ID, 0x421d, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) /* AnyDATA ADU960S - handled by qmi_wwan */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) USB_DEVICE_AND_INTERFACE_INFO(0x16d5, 0x650a, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) /* Huawei E1820 - handled by qmi_wwan */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) USB_DEVICE_INTERFACE_NUMBER(HUAWEI_VENDOR_ID, 0x14ac, 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) /* Realtek RTL8152 Based USB 2.0 Ethernet Adapters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) USB_DEVICE_AND_INTERFACE_INFO(REALTEK_VENDOR_ID, 0x8152, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) /* Realtek RTL8153 Based USB 3.0 Ethernet Adapters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) USB_DEVICE_AND_INTERFACE_INFO(REALTEK_VENDOR_ID, 0x8153, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) /* Samsung USB Ethernet Adapters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, 0xa101, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) #if IS_ENABLED(CONFIG_USB_RTL8152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) /* Linksys USB3GIGV1 Ethernet Adapter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) USB_DEVICE_AND_INTERFACE_INFO(LINKSYS_VENDOR_ID, 0x0041, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) /* ThinkPad USB-C Dock (based on Realtek RTL8153) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x3062, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) /* ThinkPad Thunderbolt 3 Dock (based on Realtek RTL8153) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x3069, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) /* ThinkPad Thunderbolt 3 Dock Gen 2 (based on Realtek RTL8153) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x3082, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) /* Lenovo Thinkpad USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x7205, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) /* Lenovo USB C to Ethernet Adapter (based on Realtek RTL8153) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x720c, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) /* Lenovo USB-C Travel Hub (based on Realtek RTL8153) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x7214, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) /* Lenovo Powered USB-C Travel Hub (4X90S92381, based on Realtek RTL8153) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x721e, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) /* ThinkPad USB-C Dock Gen 2 (based on Realtek RTL8153) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0xa387, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) /* NVIDIA Tegra USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) USB_DEVICE_AND_INTERFACE_INFO(NVIDIA_VENDOR_ID, 0x09ff, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) /* Microsoft Surface 2 dock (based on Realtek RTL8152) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) USB_DEVICE_AND_INTERFACE_INFO(MICROSOFT_VENDOR_ID, 0x07ab, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) /* Microsoft Surface Ethernet Adapter (based on Realtek RTL8153) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) USB_DEVICE_AND_INTERFACE_INFO(MICROSOFT_VENDOR_ID, 0x07c6, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) /* Microsoft Surface Ethernet Adapter (based on Realtek RTL8153B) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) USB_DEVICE_AND_INTERFACE_INFO(MICROSOFT_VENDOR_ID, 0x0927, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) /* TP-LINK UE300 USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) USB_DEVICE_AND_INTERFACE_INFO(TPLINK_VENDOR_ID, 0x0601, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) /* Aquantia AQtion USB to 5GbE Controller (based on AQC111U) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) USB_DEVICE_AND_INTERFACE_INFO(AQUANTIA_VENDOR_ID, 0xc101,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) USB_CLASS_COMM, USB_CDC_SUBCLASS_ETHERNET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) /* ASIX USB 3.1 Gen1 to 5G Multi-Gigabit Ethernet Adapter(based on AQC111U) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) USB_DEVICE_AND_INTERFACE_INFO(ASIX_VENDOR_ID, 0x2790, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) USB_CDC_SUBCLASS_ETHERNET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) /* ASIX USB 3.1 Gen1 to 2.5G Multi-Gigabit Ethernet Adapter(based on AQC112U) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) USB_DEVICE_AND_INTERFACE_INFO(ASIX_VENDOR_ID, 0x2791, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) USB_CDC_SUBCLASS_ETHERNET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) /* USB-C 3.1 to 5GBASE-T Ethernet Adapter (based on AQC111U) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) USB_DEVICE_AND_INTERFACE_INFO(0x20f4, 0xe05a, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) USB_CDC_SUBCLASS_ETHERNET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) /* QNAP QNA-UC5G1T USB to 5GbE Adapter (based on AQC111U) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) USB_DEVICE_AND_INTERFACE_INFO(0x1c04, 0x0015, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) USB_CDC_SUBCLASS_ETHERNET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) .driver_info = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) /* WHITELIST!!!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) * CDC Ether uses two interfaces, not necessarily consecutive.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) * We match the main interface, ignoring the optional device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) * class so we could handle devices that aren't exclusively
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) * CDC ether.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) * NOTE: this match must come AFTER entries blacklisting devices
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) * because of bugs/quirks in a given product (like Zaurus, above).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) /* ZTE (Vodafone) K3805-Z */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1003, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) USB_CDC_SUBCLASS_ETHERNET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) .driver_info = (unsigned long)&wwan_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) /* ZTE (Vodafone) K3806-Z */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1015, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) USB_CDC_SUBCLASS_ETHERNET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) .driver_info = (unsigned long)&wwan_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) /* ZTE (Vodafone) K4510-Z */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1173, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) USB_CDC_SUBCLASS_ETHERNET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) .driver_info = (unsigned long)&wwan_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) /* ZTE (Vodafone) K3770-Z */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1177, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) USB_CDC_SUBCLASS_ETHERNET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) .driver_info = (unsigned long)&wwan_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) /* ZTE (Vodafone) K3772-Z */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1181, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) USB_CDC_SUBCLASS_ETHERNET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) .driver_info = (unsigned long)&wwan_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) /* Telit modules */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) USB_VENDOR_AND_INTERFACE_INFO(0x1bc7, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) .driver_info = (kernel_ulong_t) &wwan_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) /* Dell DW5580 modules */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) USB_DEVICE_AND_INTERFACE_INFO(DELL_VENDOR_ID, 0x81ba, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) .driver_info = (kernel_ulong_t)&wwan_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) /* Huawei ME906 and ME909 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x15c1, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) USB_CDC_SUBCLASS_ETHERNET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) .driver_info = (unsigned long)&wwan_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) /* ZTE modules */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) USB_CDC_SUBCLASS_ETHERNET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) .driver_info = (unsigned long)&zte_cdc_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) /* U-blox TOBY-L2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) USB_DEVICE_AND_INTERFACE_INFO(UBLOX_VENDOR_ID, 0x1143, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) USB_CDC_SUBCLASS_ETHERNET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) .driver_info = (unsigned long)&wwan_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) /* U-blox SARA-U2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) USB_DEVICE_AND_INTERFACE_INFO(UBLOX_VENDOR_ID, 0x1104, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) USB_CDC_SUBCLASS_ETHERNET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) .driver_info = (unsigned long)&wwan_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) /* Cinterion PLS8 modem by GEMALTO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) USB_DEVICE_AND_INTERFACE_INFO(0x1e2d, 0x0061, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) USB_CDC_SUBCLASS_ETHERNET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) .driver_info = (unsigned long)&wwan_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) /* Cinterion AHS3 modem by GEMALTO */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) USB_DEVICE_AND_INTERFACE_INFO(0x1e2d, 0x0055, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) USB_CDC_SUBCLASS_ETHERNET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) .driver_info = (unsigned long)&wwan_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ETHERNET,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) .driver_info = (unsigned long) &cdc_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MDLM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) USB_CDC_PROTO_NONE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) .driver_info = (unsigned long)&wwan_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) }, {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) /* Various Huawei modems with a network port like the UMG1831 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, USB_CLASS_COMM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) USB_CDC_SUBCLASS_ETHERNET, 255),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) .driver_info = (unsigned long)&wwan_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) { }, /* END */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) MODULE_DEVICE_TABLE(usb, products);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) static struct usb_driver cdc_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) .name = "cdc_ether",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) .id_table = products,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) .probe = usbnet_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) .disconnect = usbnet_disconnect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) .suspend = usbnet_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) .resume = usbnet_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) .reset_resume = usbnet_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) .supports_autosuspend = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) .disable_hub_initiated_lpm = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) module_usb_driver(cdc_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) MODULE_AUTHOR("David Brownell");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) MODULE_DESCRIPTION("USB CDC Ethernet devices");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) MODULE_LICENSE("GPL");