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        /* Some devices don't initialise properly. In particular
 314         * the packet filter is not reset. There are devices that
 315         * don't do reset all the way. So the packet filter should
 316         * be set to a sane initial value.
 317         */
 318        usbnet_cdc_update_filter(dev);
 319
 320        return 0;
 321
 322bad_desc:
 323        dev_info(&dev->udev->dev, "bad CDC descriptors\n");
 324        return -ENODEV;
 325}
 326EXPORT_SYMBOL_GPL(usbnet_generic_cdc_bind);
 327
 328void usbnet_cdc_unbind(struct usbnet *dev, struct usb_interface *intf)
 329{
 330        struct cdc_state                *info = (void *) &dev->data;
 331        struct usb_driver               *driver = driver_of(intf);
 332
 333        /* combined interface - nothing  to do */
 334        if (info->data == info->control)
 335                return;
 336
 337        /* disconnect master --> disconnect slave */
 338        if (intf == info->control && info->data) {
 339                /* ensure immediate exit from usbnet_disconnect */
 340                usb_set_intfdata(info->data, NULL);
 341                usb_driver_release_interface(driver, info->data);
 342                info->data = NULL;
 343        }
 344
 345        /* and vice versa (just in case) */
 346        else if (intf == info->data && info->control) {
 347                /* ensure immediate exit from usbnet_disconnect */
 348                usb_set_intfdata(info->control, NULL);
 349                usb_driver_release_interface(driver, info->control);
 350                info->control = NULL;
 351        }
 352}
 353EXPORT_SYMBOL_GPL(usbnet_cdc_unbind);
 354
 355/* Communications Device Class, Ethernet Control model
 356 *
 357 * Takes two interfaces.  The DATA interface is inactive till an altsetting
 358 * is selected.  Configuration data includes class descriptors.  There's
 359 * an optional status endpoint on the control interface.
 360 *
 361 * This should interop with whatever the 2.4 "CDCEther.c" driver
 362 * (by Brad Hards) talked with, with more functionality.
 363 */
 364
 365static void dumpspeed(struct usbnet *dev, __le32 *speeds)
 366{
 367        netif_info(dev, timer, dev->net,
 368                   "link speeds: %u kbps up, %u kbps down\n",
 369                   __le32_to_cpu(speeds[0]) / 1000,
 370                   __le32_to_cpu(speeds[1]) / 1000);
 371}
 372
 373void usbnet_cdc_status(struct usbnet *dev, struct urb *urb)
 374{
 375        struct usb_cdc_notification     *event;
 376
 377        if (urb->actual_length < sizeof(*event))
 378                return;
 379
 380        /* SPEED_CHANGE can get split into two 8-byte packets */
 381        if (test_and_clear_bit(EVENT_STS_SPLIT, &dev->flags)) {
 382                dumpspeed(dev, (__le32 *) urb->transfer_buffer);
 383                return;
 384        }
 385
 386        event = urb->transfer_buffer;
 387        switch (event->bNotificationType) {
 388        case USB_CDC_NOTIFY_NETWORK_CONNECTION:
 389                netif_dbg(dev, timer, dev->net, "CDC: carrier %s\n",
 390                          event->wValue ? "on" : "off");
 391                usbnet_link_change(dev, !!event->wValue, 0);
 392                break;
 393        case USB_CDC_NOTIFY_SPEED_CHANGE:       /* tx/rx rates */
 394                netif_dbg(dev, timer, dev->net, "CDC: speed change (len %d)\n",
 395                          urb->actual_length);
 396                if (urb->actual_length != (sizeof(*event) + 8))
 397                        set_bit(EVENT_STS_SPLIT, &dev->flags);
 398                else
 399                        dumpspeed(dev, (__le32 *) &event[1]);
 400                break;
 401        /* USB_CDC_NOTIFY_RESPONSE_AVAILABLE can happen too (e.g. RNDIS),
 402         * but there are no standard formats for the response data.
 403         */
 404        default:
 405                netdev_err(dev->net, "CDC: unexpected notification %02x!\n",
 406                           event->bNotificationType);
 407                break;
 408        }
 409}
 410EXPORT_SYMBOL_GPL(usbnet_cdc_status);
 411
 412int usbnet_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
 413{
 414        int                             status;
 415        struct cdc_state                *info = (void *) &dev->data;
 416
 417        BUILD_BUG_ON((sizeof(((struct usbnet *)0)->data)
 418                        < sizeof(struct cdc_state)));
 419
 420        status = usbnet_generic_cdc_bind(dev, intf);
 421        if (status < 0)
 422                return status;
 423
 424        status = usbnet_get_ethernet_addr(dev, info->ether->iMACAddress);
 425        if (status < 0) {
 426                usb_set_intfdata(info->data, NULL);
 427                usb_driver_release_interface(driver_of(intf), info->data);
 428                return status;
 429        }
 430
 431        return 0;
 432}
 433EXPORT_SYMBOL_GPL(usbnet_cdc_bind);
 434
 435static const struct driver_info cdc_info = {
 436        .description =  "CDC Ethernet Device",
 437        .flags =        FLAG_ETHER | FLAG_POINTTOPOINT,
 438        .bind =         usbnet_cdc_bind,
 439        .unbind =       usbnet_cdc_unbind,
 440        .status =       usbnet_cdc_status,
 441        .set_rx_mode =  usbnet_cdc_update_filter,
 442        .manage_power = usbnet_manage_power,
 443};
 444
 445static const struct driver_info wwan_info = {
 446        .description =  "Mobile Broadband Network Device",
 447        .flags =        FLAG_WWAN,
 448        .bind =         usbnet_cdc_bind,
 449        .unbind =       usbnet_cdc_unbind,
 450        .status =       usbnet_cdc_status,
 451        .set_rx_mode =  usbnet_cdc_update_filter,
 452        .manage_power = usbnet_manage_power,
 453};
 454
 455/*-------------------------------------------------------------------------*/
 456
 457#define HUAWEI_VENDOR_ID        0x12D1
 458#define NOVATEL_VENDOR_ID       0x1410
 459#define ZTE_VENDOR_ID           0x19D2
 460#define DELL_VENDOR_ID          0x413C
 461#define REALTEK_VENDOR_ID       0x0bda
 462#define SAMSUNG_VENDOR_ID       0x04e8
 463#define LENOVO_VENDOR_ID        0x17ef
 464#define NVIDIA_VENDOR_ID        0x0955
 465
 466static const struct usb_device_id       products[] = {
 467/* BLACKLIST !!
 468 *
 469 * First blacklist any products that are egregiously nonconformant
 470 * with the CDC Ethernet specs.  Minor braindamage we cope with; when
 471 * they're not even trying, needing a separate driver is only the first
 472 * of the differences to show up.
 473 */
 474
 475#define ZAURUS_MASTER_INTERFACE \
 476        .bInterfaceClass        = USB_CLASS_COMM, \
 477        .bInterfaceSubClass     = USB_CDC_SUBCLASS_ETHERNET, \
 478        .bInterfaceProtocol     = USB_CDC_PROTO_NONE
 479
 480/* SA-1100 based Sharp Zaurus ("collie"), or compatible;
 481 * wire-incompatible with true CDC Ethernet implementations.
 482 * (And, it seems, needlessly so...)
 483 */
 484{
 485        .match_flags    =   USB_DEVICE_ID_MATCH_INT_INFO
 486                          | USB_DEVICE_ID_MATCH_DEVICE,
 487        .idVendor               = 0x04DD,
 488        .idProduct              = 0x8004,
 489        ZAURUS_MASTER_INTERFACE,
 490        .driver_info            = 0,
 491},
 492
 493/* PXA-25x based Sharp Zaurii.  Note that it seems some of these
 494 * (later models especially) may have shipped only with firmware
 495 * advertising false "CDC MDLM" compatibility ... but we're not
 496 * clear which models did that, so for now let's assume the worst.
 497 */
 498{
 499        .match_flags    =   USB_DEVICE_ID_MATCH_INT_INFO
 500                          | USB_DEVICE_ID_MATCH_DEVICE,
 501        .idVendor               = 0x04DD,
 502        .idProduct              = 0x8005,       /* A-300 */
 503        ZAURUS_MASTER_INTERFACE,
 504        .driver_info            = 0,
 505}, {
 506        .match_flags    =   USB_DEVICE_ID_MATCH_INT_INFO
 507                          | USB_DEVICE_ID_MATCH_DEVICE,
 508        .idVendor               = 0x04DD,
 509        .idProduct              = 0x8006,       /* B-500/SL-5600 */
 510        ZAURUS_MASTER_INTERFACE,
 511        .driver_info            = 0,
 512}, {
 513        .match_flags    =   USB_DEVICE_ID_MATCH_INT_INFO
 514                          | USB_DEVICE_ID_MATCH_DEVICE,
 515        .idVendor               = 0x04DD,
 516        .idProduct              = 0x8007,       /* C-700 */
 517        ZAURUS_MASTER_INTERFACE,
 518        .driver_info            = 0,
 519}, {
 520        .match_flags    =   USB_DEVICE_ID_MATCH_INT_INFO
 521                 | USB_DEVICE_ID_MATCH_DEVICE,
 522        .idVendor               = 0x04DD,
 523        .idProduct              = 0x9031,       /* C-750 C-760 */
 524        ZAURUS_MASTER_INTERFACE,
 525        .driver_info            = 0,
 526}, {
 527        .match_flags    =   USB_DEVICE_ID_MATCH_INT_INFO
 528                 | USB_DEVICE_ID_MATCH_DEVICE,
 529        .idVendor               = 0x04DD,
 530        .idProduct              = 0x9032,       /* SL-6000 */
 531        ZAURUS_MASTER_INTERFACE,
 532        .driver_info            = 0,
 533}, {
 534        .match_flags    =   USB_DEVICE_ID_MATCH_INT_INFO
 535                 | USB_DEVICE_ID_MATCH_DEVICE,
 536        .idVendor               = 0x04DD,
 537        /* reported with some C860 units */
 538        .idProduct              = 0x9050,       /* C-860 */
 539        ZAURUS_MASTER_INTERFACE,
 540        .driver_info            = 0,
 541},
 542
 543/* Olympus has some models with a Zaurus-compatible option.
 544 * R-1000 uses a FreeScale i.MXL cpu (ARMv4T)
 545 */
 546{
 547        .match_flags    =   USB_DEVICE_ID_MATCH_INT_INFO
 548                 | USB_DEVICE_ID_MATCH_DEVICE,
 549        .idVendor               = 0x07B4,
 550        .idProduct              = 0x0F02,       /* R-1000 */
 551        ZAURUS_MASTER_INTERFACE,
 552        .driver_info            = 0,
 553},
 554
 555/* LG Electronics VL600 wants additional headers on every frame */
 556{
 557        USB_DEVICE_AND_INTERFACE_INFO(0x1004, 0x61aa, USB_CLASS_COMM,
 558                        USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
 559        .driver_info = 0,
 560},
 561
 562/* Logitech Harmony 900 - uses the pseudo-MDLM (BLAN) driver */
 563{
 564        USB_DEVICE_AND_INTERFACE_INFO(0x046d, 0xc11f, USB_CLASS_COMM,
 565                        USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
 566        .driver_info            = 0,
 567},
 568
 569/* Novatel USB551L and MC551 - handled by qmi_wwan */
 570{
 571        USB_DEVICE_AND_INTERFACE_INFO(NOVATEL_VENDOR_ID, 0xB001, USB_CLASS_COMM,
 572                        USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
 573        .driver_info = 0,
 574},
 575
 576/* Novatel E362 - handled by qmi_wwan */
 577{
 578        USB_DEVICE_AND_INTERFACE_INFO(NOVATEL_VENDOR_ID, 0x9010, USB_CLASS_COMM,
 579                        USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
 580        .driver_info = 0,
 581},
 582
 583/* Dell Wireless 5800 (Novatel E362) - handled by qmi_wwan */
 584{
 585        USB_DEVICE_AND_INTERFACE_INFO(DELL_VENDOR_ID, 0x8195, USB_CLASS_COMM,
 586                        USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
 587        .driver_info = 0,
 588},
 589
 590/* Dell Wireless 5800 (Novatel E362) - handled by qmi_wwan */
 591{
 592        USB_DEVICE_AND_INTERFACE_INFO(DELL_VENDOR_ID, 0x8196, USB_CLASS_COMM,
 593                        USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
 594        .driver_info = 0,
 595},
 596
 597/* Dell Wireless 5804 (Novatel E371) - handled by qmi_wwan */
 598{
 599        USB_DEVICE_AND_INTERFACE_INFO(DELL_VENDOR_ID, 0x819b, USB_CLASS_COMM,
 600                        USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
 601        .driver_info = 0,
 602},
 603
 604/* Novatel Expedite E371 - handled by qmi_wwan */
 605{
 606        USB_DEVICE_AND_INTERFACE_INFO(NOVATEL_VENDOR_ID, 0x9011, USB_CLASS_COMM,
 607                        USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
 608        .driver_info = 0,
 609},
 610
 611/* AnyDATA ADU960S - handled by qmi_wwan */
 612{
 613        USB_DEVICE_AND_INTERFACE_INFO(0x16d5, 0x650a, USB_CLASS_COMM,
 614                        USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
 615        .driver_info = 0,
 616},
 617
 618/* Huawei E1820 - handled by qmi_wwan */
 619{
 620        USB_DEVICE_INTERFACE_NUMBER(HUAWEI_VENDOR_ID, 0x14ac, 1),
 621        .driver_info = 0,
 622},
 623
 624/* Realtek RTL8152 Based USB 2.0 Ethernet Adapters */
 625{
 626        USB_DEVICE_AND_INTERFACE_INFO(REALTEK_VENDOR_ID, 0x8152, USB_CLASS_COMM,
 627                        USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
 628        .driver_info = 0,
 629},
 630
 631/* Realtek RTL8153 Based USB 3.0 Ethernet Adapters */
 632{
 633        USB_DEVICE_AND_INTERFACE_INFO(REALTEK_VENDOR_ID, 0x8153, USB_CLASS_COMM,
 634                        USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
 635        .driver_info = 0,
 636},
 637
 638/* Samsung USB Ethernet Adapters */
 639{
 640        USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, 0xa101, USB_CLASS_COMM,
 641                        USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
 642        .driver_info = 0,
 643},
 644
 645/* Lenovo Thinkpad USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */
 646{
 647        USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x7205, USB_CLASS_COMM,
 648                        USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
 649        .driver_info = 0,
 650},
 651
 652/* NVIDIA Tegra USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */
 653{
 654        USB_DEVICE_AND_INTERFACE_INFO(NVIDIA_VENDOR_ID, 0x09ff, USB_CLASS_COMM,
 655                        USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
 656        .driver_info = 0,
 657},
 658
 659/* WHITELIST!!!
 660 *
 661 * CDC Ether uses two interfaces, not necessarily consecutive.
 662 * We match the main interface, ignoring the optional device
 663 * class so we could handle devices that aren't exclusively
 664 * CDC ether.
 665 *
 666 * NOTE:  this match must come AFTER entries blacklisting devices
 667 * because of bugs/quirks in a given product (like Zaurus, above).
 668 */
 669{
 670        /* ZTE (Vodafone) K3805-Z */
 671        USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1003, USB_CLASS_COMM,
 672                                      USB_CDC_SUBCLASS_ETHERNET,
 673                                      USB_CDC_PROTO_NONE),
 674        .driver_info = (unsigned long)&wwan_info,
 675}, {
 676        /* ZTE (Vodafone) K3806-Z */
 677        USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1015, USB_CLASS_COMM,
 678                                      USB_CDC_SUBCLASS_ETHERNET,
 679                                      USB_CDC_PROTO_NONE),
 680        .driver_info = (unsigned long)&wwan_info,
 681}, {
 682        /* ZTE (Vodafone) K4510-Z */
 683        USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1173, USB_CLASS_COMM,
 684                                      USB_CDC_SUBCLASS_ETHERNET,
 685                                      USB_CDC_PROTO_NONE),
 686        .driver_info = (unsigned long)&wwan_info,
 687}, {
 688        /* ZTE (Vodafone) K3770-Z */
 689        USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1177, USB_CLASS_COMM,
 690                                      USB_CDC_SUBCLASS_ETHERNET,
 691                                      USB_CDC_PROTO_NONE),
 692        .driver_info = (unsigned long)&wwan_info,
 693}, {
 694        /* ZTE (Vodafone) K3772-Z */
 695        USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1181, USB_CLASS_COMM,
 696                                      USB_CDC_SUBCLASS_ETHERNET,
 697                                      USB_CDC_PROTO_NONE),
 698        .driver_info = (unsigned long)&wwan_info,
 699}, {
 700        /* Telit modules */
 701        USB_VENDOR_AND_INTERFACE_INFO(0x1bc7, USB_CLASS_COMM,
 702                        USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
 703        .driver_info = (kernel_ulong_t) &wwan_info,
 704}, {
 705        /* Dell DW5580 modules */
 706        USB_DEVICE_AND_INTERFACE_INFO(DELL_VENDOR_ID, 0x81ba, USB_CLASS_COMM,
 707                        USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
 708        .driver_info = (kernel_ulong_t)&wwan_info,
 709}, {
 710        USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ETHERNET,
 711                        USB_CDC_PROTO_NONE),
 712        .driver_info = (unsigned long) &cdc_info,
 713}, {
 714        USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MDLM,
 715                        USB_CDC_PROTO_NONE),
 716        .driver_info = (unsigned long)&wwan_info,
 717
 718}, {
 719        /* Various Huawei modems with a network port like the UMG1831 */
 720        USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, USB_CLASS_COMM,
 721                                      USB_CDC_SUBCLASS_ETHERNET, 255),
 722        .driver_info = (unsigned long)&wwan_info,
 723},
 724        { },            /* END */
 725};
 726MODULE_DEVICE_TABLE(usb, products);
 727
 728static struct usb_driver cdc_driver = {
 729        .name =         "cdc_ether",
 730        .id_table =     products,
 731        .probe =        usbnet_probe,
 732        .disconnect =   usbnet_disconnect,
 733        .suspend =      usbnet_suspend,
 734        .resume =       usbnet_resume,
 735        .reset_resume = usbnet_resume,
 736        .supports_autosuspend = 1,
 737        .disable_hub_initiated_lpm = 1,
 738};
 739
 740module_usb_driver(cdc_driver);
 741
 742MODULE_AUTHOR("David Brownell");
 743MODULE_DESCRIPTION("USB CDC Ethernet devices");
 744MODULE_LICENSE("GPL");
 745