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