1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
75 u16 cdc_filter =
76 USB_CDC_PACKET_TYPE_ALL_MULTICAST | USB_CDC_PACKET_TYPE_DIRECTED |
77 USB_CDC_PACKET_TYPE_BROADCAST;
78
79 if (dev->net->flags & IFF_PROMISC)
80 cdc_filter |= USB_CDC_PACKET_TYPE_PROMISCUOUS;
81
82
83
84
85
86
87 usb_control_msg(dev->udev,
88 usb_sndctrlpipe(dev->udev, 0),
89 USB_CDC_SET_ETHERNET_PACKET_FILTER,
90 USB_TYPE_CLASS | USB_RECIP_INTERFACE,
91 cdc_filter,
92 intf->cur_altsetting->desc.bInterfaceNumber,
93 NULL,
94 0,
95 USB_CTRL_SET_TIMEOUT
96 );
97}
98
99
100
101
102
103
104int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
105{
106 u8 *buf = intf->cur_altsetting->extra;
107 int len = intf->cur_altsetting->extralen;
108 struct usb_interface_descriptor *d;
109 struct cdc_state *info = (void *) &dev->data;
110 int status;
111 int rndis;
112 bool android_rndis_quirk = false;
113 struct usb_driver *driver = driver_of(intf);
114 struct usb_cdc_mdlm_desc *desc = NULL;
115 struct usb_cdc_mdlm_detail_desc *detail = NULL;
116
117 if (sizeof(dev->data) < sizeof(*info))
118 return -EDOM;
119
120
121
122
123 if (len == 0 && dev->udev->actconfig->extralen) {
124
125
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
133
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
149
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 while (len > 3) {
158 if (buf[1] != USB_DT_CS_INTERFACE)
159 goto next_desc;
160
161
162
163
164
165
166
167
168 switch (buf[2]) {
169 case USB_CDC_HEADER_TYPE:
170 if (info->header) {
171 dev_dbg(&intf->dev, "extra CDC header\n");
172 goto bad_desc;
173 }
174 info->header = (void *) buf;
175 if (info->header->bLength != sizeof(*info->header)) {
176 dev_dbg(&intf->dev, "CDC header len %u\n",
177 info->header->bLength);
178 goto bad_desc;
179 }
180 break;
181 case USB_CDC_ACM_TYPE:
182
183
184
185 if (rndis) {
186 struct usb_cdc_acm_descriptor *acm;
187
188 acm = (void *) buf;
189 if (acm->bmCapabilities) {
190 dev_dbg(&intf->dev,
191 "ACM capabilities %02x, "
192 "not really RNDIS?\n",
193 acm->bmCapabilities);
194 goto bad_desc;
195 }
196 }
197 break;
198 case USB_CDC_UNION_TYPE:
199 if (info->u) {
200 dev_dbg(&intf->dev, "extra CDC union\n");
201 goto bad_desc;
202 }
203 info->u = (void *) buf;
204 if (info->u->bLength != sizeof(*info->u)) {
205 dev_dbg(&intf->dev, "CDC union len %u\n",
206 info->u->bLength);
207 goto bad_desc;
208 }
209
210
211
212
213
214 info->control = usb_ifnum_to_if(dev->udev,
215 info->u->bMasterInterface0);
216 info->data = usb_ifnum_to_if(dev->udev,
217 info->u->bSlaveInterface0);
218 if (!info->control || !info->data) {
219 dev_dbg(&intf->dev,
220 "master #%u/%p slave #%u/%p\n",
221 info->u->bMasterInterface0,
222 info->control,
223 info->u->bSlaveInterface0,
224 info->data);
225
226 if (rndis) {
227 android_rndis_quirk = true;
228 goto next_desc;
229 }
230 goto bad_desc;
231 }
232 if (info->control != intf) {
233 dev_dbg(&intf->dev, "bogus CDC Union\n");
234
235
236
237 if (info->data == intf) {
238 info->data = info->control;
239 info->control = intf;
240 } else
241 goto bad_desc;
242 }
243
244
245 if (info->control == info->data)
246 goto next_desc;
247
248
249 d = &info->data->cur_altsetting->desc;
250 if (d->bInterfaceClass != USB_CLASS_CDC_DATA) {
251 dev_dbg(&intf->dev, "slave class %u\n",
252 d->bInterfaceClass);
253 goto bad_desc;
254 }
255 break;
256 case USB_CDC_ETHERNET_TYPE:
257 if (info->ether) {
258 dev_dbg(&intf->dev, "extra CDC ether\n");
259 goto bad_desc;
260 }
261 info->ether = (void *) buf;
262 if (info->ether->bLength != sizeof(*info->ether)) {
263 dev_dbg(&intf->dev, "CDC ether len %u\n",
264 info->ether->bLength);
265 goto bad_desc;
266 }
267 dev->hard_mtu = le16_to_cpu(
268 info->ether->wMaxSegmentSize);
269
270
271
272 break;
273 case USB_CDC_MDLM_TYPE:
274 if (desc) {
275 dev_dbg(&intf->dev, "extra MDLM descriptor\n");
276 goto bad_desc;
277 }
278
279 desc = (void *)buf;
280
281 if (desc->bLength != sizeof(*desc))
282 goto bad_desc;
283
284 if (memcmp(&desc->bGUID, mbm_guid, 16))
285 goto bad_desc;
286 break;
287 case USB_CDC_MDLM_DETAIL_TYPE:
288 if (detail) {
289 dev_dbg(&intf->dev, "extra MDLM detail descriptor\n");
290 goto bad_desc;
291 }
292
293 detail = (void *)buf;
294
295 if (detail->bGuidDescriptorType == 0) {
296 if (detail->bLength < (sizeof(*detail) + 1))
297 goto bad_desc;
298 } else
299 goto bad_desc;
300 break;
301 }
302next_desc:
303 len -= buf[0];
304 buf += buf[0];
305 }
306
307
308
309
310
311
312
313
314
315 if (rndis && (!info->u || android_rndis_quirk)) {
316 info->control = usb_ifnum_to_if(dev->udev, 0);
317 info->data = usb_ifnum_to_if(dev->udev, 1);
318 if (!info->control || !info->data || info->control != intf) {
319 dev_dbg(&intf->dev,
320 "rndis: master #0/%p slave #1/%p\n",
321 info->control,
322 info->data);
323 goto bad_desc;
324 }
325
326 } else if (!info->header || !info->u || (!rndis && !info->ether)) {
327 dev_dbg(&intf->dev, "missing cdc %s%s%sdescriptor\n",
328 info->header ? "" : "header ",
329 info->u ? "" : "union ",
330 info->ether ? "" : "ether ");
331 goto bad_desc;
332 }
333
334
335
336
337 if (info->data != info->control) {
338 status = usb_driver_claim_interface(driver, info->data, dev);
339 if (status < 0)
340 return status;
341 }
342 status = usbnet_get_endpoints(dev, info->data);
343 if (status < 0) {
344
345 usb_set_intfdata(info->data, NULL);
346 if (info->data != info->control)
347 usb_driver_release_interface(driver, info->data);
348 return status;
349 }
350
351
352 if (info->data != info->control)
353 dev->status = NULL;
354 if (info->control->cur_altsetting->desc.bNumEndpoints == 1) {
355 struct usb_endpoint_descriptor *desc;
356
357 dev->status = &info->control->cur_altsetting->endpoint [0];
358 desc = &dev->status->desc;
359 if (!usb_endpoint_is_int_in(desc) ||
360 (le16_to_cpu(desc->wMaxPacketSize)
361 < sizeof(struct usb_cdc_notification)) ||
362 !desc->bInterval) {
363 dev_dbg(&intf->dev, "bad notification endpoint\n");
364 dev->status = NULL;
365 }
366 }
367 if (rndis && !dev->status) {
368 dev_dbg(&intf->dev, "missing RNDIS status endpoint\n");
369 usb_set_intfdata(info->data, NULL);
370 usb_driver_release_interface(driver, info->data);
371 return -ENODEV;
372 }
373
374
375
376
377
378
379 usbnet_cdc_update_filter(dev);
380
381 return 0;
382
383bad_desc:
384 dev_info(&dev->udev->dev, "bad CDC descriptors\n");
385 return -ENODEV;
386}
387EXPORT_SYMBOL_GPL(usbnet_generic_cdc_bind);
388
389void usbnet_cdc_unbind(struct usbnet *dev, struct usb_interface *intf)
390{
391 struct cdc_state *info = (void *) &dev->data;
392 struct usb_driver *driver = driver_of(intf);
393
394
395 if (info->data == info->control)
396 return;
397
398
399 if (intf == info->control && info->data) {
400
401 usb_set_intfdata(info->data, NULL);
402 usb_driver_release_interface(driver, info->data);
403 info->data = NULL;
404 }
405
406
407 else if (intf == info->data && info->control) {
408
409 usb_set_intfdata(info->control, NULL);
410 usb_driver_release_interface(driver, info->control);
411 info->control = NULL;
412 }
413}
414EXPORT_SYMBOL_GPL(usbnet_cdc_unbind);
415
416
417
418
419
420
421
422
423
424
425
426static void dumpspeed(struct usbnet *dev, __le32 *speeds)
427{
428 netif_info(dev, timer, dev->net,
429 "link speeds: %u kbps up, %u kbps down\n",
430 __le32_to_cpu(speeds[0]) / 1000,
431 __le32_to_cpu(speeds[1]) / 1000);
432}
433
434void usbnet_cdc_status(struct usbnet *dev, struct urb *urb)
435{
436 struct usb_cdc_notification *event;
437
438 if (urb->actual_length < sizeof(*event))
439 return;
440
441
442 if (test_and_clear_bit(EVENT_STS_SPLIT, &dev->flags)) {
443 dumpspeed(dev, (__le32 *) urb->transfer_buffer);
444 return;
445 }
446
447 event = urb->transfer_buffer;
448 switch (event->bNotificationType) {
449 case USB_CDC_NOTIFY_NETWORK_CONNECTION:
450 netif_dbg(dev, timer, dev->net, "CDC: carrier %s\n",
451 event->wValue ? "on" : "off");
452 usbnet_link_change(dev, !!event->wValue, 0);
453 break;
454 case USB_CDC_NOTIFY_SPEED_CHANGE:
455 netif_dbg(dev, timer, dev->net, "CDC: speed change (len %d)\n",
456 urb->actual_length);
457 if (urb->actual_length != (sizeof(*event) + 8))
458 set_bit(EVENT_STS_SPLIT, &dev->flags);
459 else
460 dumpspeed(dev, (__le32 *) &event[1]);
461 break;
462
463
464
465 default:
466 netdev_err(dev->net, "CDC: unexpected notification %02x!\n",
467 event->bNotificationType);
468 break;
469 }
470}
471EXPORT_SYMBOL_GPL(usbnet_cdc_status);
472
473int usbnet_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
474{
475 int status;
476 struct cdc_state *info = (void *) &dev->data;
477
478 BUILD_BUG_ON((sizeof(((struct usbnet *)0)->data)
479 < sizeof(struct cdc_state)));
480
481 status = usbnet_generic_cdc_bind(dev, intf);
482 if (status < 0)
483 return status;
484
485 status = usbnet_get_ethernet_addr(dev, info->ether->iMACAddress);
486 if (status < 0) {
487 usb_set_intfdata(info->data, NULL);
488 usb_driver_release_interface(driver_of(intf), info->data);
489 return status;
490 }
491
492 return 0;
493}
494EXPORT_SYMBOL_GPL(usbnet_cdc_bind);
495
496static const struct driver_info cdc_info = {
497 .description = "CDC Ethernet Device",
498 .flags = FLAG_ETHER | FLAG_POINTTOPOINT,
499 .bind = usbnet_cdc_bind,
500 .unbind = usbnet_cdc_unbind,
501 .status = usbnet_cdc_status,
502 .set_rx_mode = usbnet_cdc_update_filter,
503 .manage_power = usbnet_manage_power,
504};
505
506static const struct driver_info wwan_info = {
507 .description = "Mobile Broadband Network Device",
508 .flags = FLAG_WWAN,
509 .bind = usbnet_cdc_bind,
510 .unbind = usbnet_cdc_unbind,
511 .status = usbnet_cdc_status,
512 .set_rx_mode = usbnet_cdc_update_filter,
513 .manage_power = usbnet_manage_power,
514};
515
516
517
518#define HUAWEI_VENDOR_ID 0x12D1
519#define NOVATEL_VENDOR_ID 0x1410
520#define ZTE_VENDOR_ID 0x19D2
521#define DELL_VENDOR_ID 0x413C
522#define REALTEK_VENDOR_ID 0x0bda
523#define SAMSUNG_VENDOR_ID 0x04e8
524
525static const struct usb_device_id products[] = {
526
527
528
529
530
531
532
533
534#define ZAURUS_MASTER_INTERFACE \
535 .bInterfaceClass = USB_CLASS_COMM, \
536 .bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET, \
537 .bInterfaceProtocol = USB_CDC_PROTO_NONE
538
539
540
541
542
543{
544 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
545 | USB_DEVICE_ID_MATCH_DEVICE,
546 .idVendor = 0x04DD,
547 .idProduct = 0x8004,
548 ZAURUS_MASTER_INTERFACE,
549 .driver_info = 0,
550},
551
552
553
554
555
556
557{
558 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
559 | USB_DEVICE_ID_MATCH_DEVICE,
560 .idVendor = 0x04DD,
561 .idProduct = 0x8005,
562 ZAURUS_MASTER_INTERFACE,
563 .driver_info = 0,
564}, {
565 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
566 | USB_DEVICE_ID_MATCH_DEVICE,
567 .idVendor = 0x04DD,
568 .idProduct = 0x8006,
569 ZAURUS_MASTER_INTERFACE,
570 .driver_info = 0,
571}, {
572 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
573 | USB_DEVICE_ID_MATCH_DEVICE,
574 .idVendor = 0x04DD,
575 .idProduct = 0x8007,
576 ZAURUS_MASTER_INTERFACE,
577 .driver_info = 0,
578}, {
579 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
580 | USB_DEVICE_ID_MATCH_DEVICE,
581 .idVendor = 0x04DD,
582 .idProduct = 0x9031,
583 ZAURUS_MASTER_INTERFACE,
584 .driver_info = 0,
585}, {
586 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
587 | USB_DEVICE_ID_MATCH_DEVICE,
588 .idVendor = 0x04DD,
589 .idProduct = 0x9032,
590 ZAURUS_MASTER_INTERFACE,
591 .driver_info = 0,
592}, {
593 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
594 | USB_DEVICE_ID_MATCH_DEVICE,
595 .idVendor = 0x04DD,
596
597 .idProduct = 0x9050,
598 ZAURUS_MASTER_INTERFACE,
599 .driver_info = 0,
600},
601
602
603
604
605{
606 .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
607 | USB_DEVICE_ID_MATCH_DEVICE,
608 .idVendor = 0x07B4,
609 .idProduct = 0x0F02,
610 ZAURUS_MASTER_INTERFACE,
611 .driver_info = 0,
612},
613
614
615{
616 USB_DEVICE_AND_INTERFACE_INFO(0x1004, 0x61aa, USB_CLASS_COMM,
617 USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
618 .driver_info = 0,
619},
620
621
622{
623 USB_DEVICE_AND_INTERFACE_INFO(0x046d, 0xc11f, USB_CLASS_COMM,
624 USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
625 .driver_info = 0,
626},
627
628
629{
630 USB_DEVICE_AND_INTERFACE_INFO(NOVATEL_VENDOR_ID, 0xB001, USB_CLASS_COMM,
631 USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
632 .driver_info = 0,
633},
634
635
636{
637 USB_DEVICE_AND_INTERFACE_INFO(NOVATEL_VENDOR_ID, 0x9010, USB_CLASS_COMM,
638 USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
639 .driver_info = 0,
640},
641
642
643{
644 USB_DEVICE_AND_INTERFACE_INFO(DELL_VENDOR_ID, 0x8195, USB_CLASS_COMM,
645 USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
646 .driver_info = 0,
647},
648
649
650{
651 USB_DEVICE_AND_INTERFACE_INFO(DELL_VENDOR_ID, 0x8196, USB_CLASS_COMM,
652 USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
653 .driver_info = 0,
654},
655
656
657{
658 USB_DEVICE_AND_INTERFACE_INFO(DELL_VENDOR_ID, 0x819b, USB_CLASS_COMM,
659 USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
660 .driver_info = 0,
661},
662
663
664{
665 USB_DEVICE_AND_INTERFACE_INFO(NOVATEL_VENDOR_ID, 0x9011, USB_CLASS_COMM,
666 USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
667 .driver_info = 0,
668},
669
670
671{
672 USB_DEVICE_AND_INTERFACE_INFO(0x16d5, 0x650a, USB_CLASS_COMM,
673 USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
674 .driver_info = 0,
675},
676
677
678{
679 USB_DEVICE_INTERFACE_NUMBER(HUAWEI_VENDOR_ID, 0x14ac, 1),
680 .driver_info = 0,
681},
682
683
684{
685 USB_DEVICE_AND_INTERFACE_INFO(REALTEK_VENDOR_ID, 0x8152, USB_CLASS_COMM,
686 USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
687 .driver_info = 0,
688},
689
690
691{
692 USB_DEVICE_AND_INTERFACE_INFO(REALTEK_VENDOR_ID, 0x8153, USB_CLASS_COMM,
693 USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
694 .driver_info = 0,
695},
696
697
698{
699 USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, 0xa101, USB_CLASS_COMM,
700 USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
701 .driver_info = 0,
702},
703
704
705
706
707
708
709
710
711
712
713
714{
715
716 USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1003, USB_CLASS_COMM,
717 USB_CDC_SUBCLASS_ETHERNET,
718 USB_CDC_PROTO_NONE),
719 .driver_info = (unsigned long)&wwan_info,
720}, {
721
722 USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1015, USB_CLASS_COMM,
723 USB_CDC_SUBCLASS_ETHERNET,
724 USB_CDC_PROTO_NONE),
725 .driver_info = (unsigned long)&wwan_info,
726}, {
727
728 USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1173, USB_CLASS_COMM,
729 USB_CDC_SUBCLASS_ETHERNET,
730 USB_CDC_PROTO_NONE),
731 .driver_info = (unsigned long)&wwan_info,
732}, {
733
734 USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1177, USB_CLASS_COMM,
735 USB_CDC_SUBCLASS_ETHERNET,
736 USB_CDC_PROTO_NONE),
737 .driver_info = (unsigned long)&wwan_info,
738}, {
739
740 USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1181, USB_CLASS_COMM,
741 USB_CDC_SUBCLASS_ETHERNET,
742 USB_CDC_PROTO_NONE),
743 .driver_info = (unsigned long)&wwan_info,
744}, {
745
746 USB_VENDOR_AND_INTERFACE_INFO(0x1bc7, USB_CLASS_COMM,
747 USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
748 .driver_info = (kernel_ulong_t) &wwan_info,
749}, {
750 USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ETHERNET,
751 USB_CDC_PROTO_NONE),
752 .driver_info = (unsigned long) &cdc_info,
753}, {
754 USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MDLM,
755 USB_CDC_PROTO_NONE),
756 .driver_info = (unsigned long)&wwan_info,
757
758}, {
759
760 USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, USB_CLASS_COMM,
761 USB_CDC_SUBCLASS_ETHERNET, 255),
762 .driver_info = (unsigned long)&wwan_info,
763},
764 { },
765};
766MODULE_DEVICE_TABLE(usb, products);
767
768static struct usb_driver cdc_driver = {
769 .name = "cdc_ether",
770 .id_table = products,
771 .probe = usbnet_probe,
772 .disconnect = usbnet_disconnect,
773 .suspend = usbnet_suspend,
774 .resume = usbnet_resume,
775 .reset_resume = usbnet_resume,
776 .supports_autosuspend = 1,
777 .disable_hub_initiated_lpm = 1,
778};
779
780module_usb_driver(cdc_driver);
781
782MODULE_AUTHOR("David Brownell");
783MODULE_DESCRIPTION("USB CDC Ethernet devices");
784MODULE_LICENSE("GPL");
785