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