1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#include <linux/slab.h>
19#include <linux/kernel.h>
20#include <linux/module.h>
21#include <linux/device.h>
22#include <linux/etherdevice.h>
23
24#include <linux/atomic.h>
25
26#include "u_ether.h"
27#include "u_ether_configfs.h"
28#include "u_rndis.h"
29#include "rndis.h"
30#include "configfs.h"
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73struct f_rndis {
74 struct gether port;
75 u8 ctrl_id, data_id;
76 u8 ethaddr[ETH_ALEN];
77 u32 vendorID;
78 const char *manufacturer;
79 struct rndis_params *params;
80
81 struct usb_ep *notify;
82 struct usb_request *notify_req;
83 atomic_t notify_count;
84};
85
86static inline struct f_rndis *func_to_rndis(struct usb_function *f)
87{
88 return container_of(f, struct f_rndis, port.func);
89}
90
91
92static unsigned int bitrate(struct usb_gadget *g)
93{
94 if (gadget_is_superspeed(g) && g->speed == USB_SPEED_SUPER)
95 return 13 * 1024 * 8 * 1000 * 8;
96 else if (gadget_is_dualspeed(g) && g->speed == USB_SPEED_HIGH)
97 return 13 * 512 * 8 * 1000 * 8;
98 else
99 return 19 * 64 * 1 * 1000 * 8;
100}
101
102
103
104
105
106
107#define RNDIS_STATUS_INTERVAL_MS 32
108#define STATUS_BYTECOUNT 8
109
110
111
112
113static struct usb_interface_descriptor rndis_control_intf = {
114 .bLength = sizeof rndis_control_intf,
115 .bDescriptorType = USB_DT_INTERFACE,
116
117
118
119 .bNumEndpoints = 1,
120 .bInterfaceClass = USB_CLASS_COMM,
121 .bInterfaceSubClass = USB_CDC_SUBCLASS_ACM,
122 .bInterfaceProtocol = USB_CDC_ACM_PROTO_VENDOR,
123
124};
125
126static struct usb_cdc_header_desc header_desc = {
127 .bLength = sizeof header_desc,
128 .bDescriptorType = USB_DT_CS_INTERFACE,
129 .bDescriptorSubType = USB_CDC_HEADER_TYPE,
130
131 .bcdCDC = cpu_to_le16(0x0110),
132};
133
134static struct usb_cdc_call_mgmt_descriptor call_mgmt_descriptor = {
135 .bLength = sizeof call_mgmt_descriptor,
136 .bDescriptorType = USB_DT_CS_INTERFACE,
137 .bDescriptorSubType = USB_CDC_CALL_MANAGEMENT_TYPE,
138
139 .bmCapabilities = 0x00,
140 .bDataInterface = 0x01,
141};
142
143static struct usb_cdc_acm_descriptor rndis_acm_descriptor = {
144 .bLength = sizeof rndis_acm_descriptor,
145 .bDescriptorType = USB_DT_CS_INTERFACE,
146 .bDescriptorSubType = USB_CDC_ACM_TYPE,
147
148 .bmCapabilities = 0x00,
149};
150
151static struct usb_cdc_union_desc rndis_union_desc = {
152 .bLength = sizeof(rndis_union_desc),
153 .bDescriptorType = USB_DT_CS_INTERFACE,
154 .bDescriptorSubType = USB_CDC_UNION_TYPE,
155
156
157};
158
159
160
161static struct usb_interface_descriptor rndis_data_intf = {
162 .bLength = sizeof rndis_data_intf,
163 .bDescriptorType = USB_DT_INTERFACE,
164
165
166 .bNumEndpoints = 2,
167 .bInterfaceClass = USB_CLASS_CDC_DATA,
168 .bInterfaceSubClass = 0,
169 .bInterfaceProtocol = 0,
170
171};
172
173
174static struct usb_interface_assoc_descriptor
175rndis_iad_descriptor = {
176 .bLength = sizeof rndis_iad_descriptor,
177 .bDescriptorType = USB_DT_INTERFACE_ASSOCIATION,
178
179 .bFirstInterface = 0,
180 .bInterfaceCount = 2,
181 .bFunctionClass = USB_CLASS_COMM,
182 .bFunctionSubClass = USB_CDC_SUBCLASS_ETHERNET,
183 .bFunctionProtocol = USB_CDC_PROTO_NONE,
184
185};
186
187
188
189static struct usb_endpoint_descriptor fs_notify_desc = {
190 .bLength = USB_DT_ENDPOINT_SIZE,
191 .bDescriptorType = USB_DT_ENDPOINT,
192
193 .bEndpointAddress = USB_DIR_IN,
194 .bmAttributes = USB_ENDPOINT_XFER_INT,
195 .wMaxPacketSize = cpu_to_le16(STATUS_BYTECOUNT),
196 .bInterval = RNDIS_STATUS_INTERVAL_MS,
197};
198
199static struct usb_endpoint_descriptor fs_in_desc = {
200 .bLength = USB_DT_ENDPOINT_SIZE,
201 .bDescriptorType = USB_DT_ENDPOINT,
202
203 .bEndpointAddress = USB_DIR_IN,
204 .bmAttributes = USB_ENDPOINT_XFER_BULK,
205};
206
207static struct usb_endpoint_descriptor fs_out_desc = {
208 .bLength = USB_DT_ENDPOINT_SIZE,
209 .bDescriptorType = USB_DT_ENDPOINT,
210
211 .bEndpointAddress = USB_DIR_OUT,
212 .bmAttributes = USB_ENDPOINT_XFER_BULK,
213};
214
215static struct usb_descriptor_header *eth_fs_function[] = {
216 (struct usb_descriptor_header *) &rndis_iad_descriptor,
217
218
219 (struct usb_descriptor_header *) &rndis_control_intf,
220 (struct usb_descriptor_header *) &header_desc,
221 (struct usb_descriptor_header *) &call_mgmt_descriptor,
222 (struct usb_descriptor_header *) &rndis_acm_descriptor,
223 (struct usb_descriptor_header *) &rndis_union_desc,
224 (struct usb_descriptor_header *) &fs_notify_desc,
225
226
227 (struct usb_descriptor_header *) &rndis_data_intf,
228 (struct usb_descriptor_header *) &fs_in_desc,
229 (struct usb_descriptor_header *) &fs_out_desc,
230 NULL,
231};
232
233
234
235static struct usb_endpoint_descriptor hs_notify_desc = {
236 .bLength = USB_DT_ENDPOINT_SIZE,
237 .bDescriptorType = USB_DT_ENDPOINT,
238
239 .bEndpointAddress = USB_DIR_IN,
240 .bmAttributes = USB_ENDPOINT_XFER_INT,
241 .wMaxPacketSize = cpu_to_le16(STATUS_BYTECOUNT),
242 .bInterval = USB_MS_TO_HS_INTERVAL(RNDIS_STATUS_INTERVAL_MS)
243};
244
245static struct usb_endpoint_descriptor hs_in_desc = {
246 .bLength = USB_DT_ENDPOINT_SIZE,
247 .bDescriptorType = USB_DT_ENDPOINT,
248
249 .bEndpointAddress = USB_DIR_IN,
250 .bmAttributes = USB_ENDPOINT_XFER_BULK,
251 .wMaxPacketSize = cpu_to_le16(512),
252};
253
254static struct usb_endpoint_descriptor hs_out_desc = {
255 .bLength = USB_DT_ENDPOINT_SIZE,
256 .bDescriptorType = USB_DT_ENDPOINT,
257
258 .bEndpointAddress = USB_DIR_OUT,
259 .bmAttributes = USB_ENDPOINT_XFER_BULK,
260 .wMaxPacketSize = cpu_to_le16(512),
261};
262
263static struct usb_descriptor_header *eth_hs_function[] = {
264 (struct usb_descriptor_header *) &rndis_iad_descriptor,
265
266
267 (struct usb_descriptor_header *) &rndis_control_intf,
268 (struct usb_descriptor_header *) &header_desc,
269 (struct usb_descriptor_header *) &call_mgmt_descriptor,
270 (struct usb_descriptor_header *) &rndis_acm_descriptor,
271 (struct usb_descriptor_header *) &rndis_union_desc,
272 (struct usb_descriptor_header *) &hs_notify_desc,
273
274
275 (struct usb_descriptor_header *) &rndis_data_intf,
276 (struct usb_descriptor_header *) &hs_in_desc,
277 (struct usb_descriptor_header *) &hs_out_desc,
278 NULL,
279};
280
281
282
283static struct usb_endpoint_descriptor ss_notify_desc = {
284 .bLength = USB_DT_ENDPOINT_SIZE,
285 .bDescriptorType = USB_DT_ENDPOINT,
286
287 .bEndpointAddress = USB_DIR_IN,
288 .bmAttributes = USB_ENDPOINT_XFER_INT,
289 .wMaxPacketSize = cpu_to_le16(STATUS_BYTECOUNT),
290 .bInterval = USB_MS_TO_HS_INTERVAL(RNDIS_STATUS_INTERVAL_MS)
291};
292
293static struct usb_ss_ep_comp_descriptor ss_intr_comp_desc = {
294 .bLength = sizeof ss_intr_comp_desc,
295 .bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
296
297
298
299
300 .wBytesPerInterval = cpu_to_le16(STATUS_BYTECOUNT),
301};
302
303static struct usb_endpoint_descriptor ss_in_desc = {
304 .bLength = USB_DT_ENDPOINT_SIZE,
305 .bDescriptorType = USB_DT_ENDPOINT,
306
307 .bEndpointAddress = USB_DIR_IN,
308 .bmAttributes = USB_ENDPOINT_XFER_BULK,
309 .wMaxPacketSize = cpu_to_le16(1024),
310};
311
312static struct usb_endpoint_descriptor ss_out_desc = {
313 .bLength = USB_DT_ENDPOINT_SIZE,
314 .bDescriptorType = USB_DT_ENDPOINT,
315
316 .bEndpointAddress = USB_DIR_OUT,
317 .bmAttributes = USB_ENDPOINT_XFER_BULK,
318 .wMaxPacketSize = cpu_to_le16(1024),
319};
320
321static struct usb_ss_ep_comp_descriptor ss_bulk_comp_desc = {
322 .bLength = sizeof ss_bulk_comp_desc,
323 .bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
324
325
326
327
328};
329
330static struct usb_descriptor_header *eth_ss_function[] = {
331 (struct usb_descriptor_header *) &rndis_iad_descriptor,
332
333
334 (struct usb_descriptor_header *) &rndis_control_intf,
335 (struct usb_descriptor_header *) &header_desc,
336 (struct usb_descriptor_header *) &call_mgmt_descriptor,
337 (struct usb_descriptor_header *) &rndis_acm_descriptor,
338 (struct usb_descriptor_header *) &rndis_union_desc,
339 (struct usb_descriptor_header *) &ss_notify_desc,
340 (struct usb_descriptor_header *) &ss_intr_comp_desc,
341
342
343 (struct usb_descriptor_header *) &rndis_data_intf,
344 (struct usb_descriptor_header *) &ss_in_desc,
345 (struct usb_descriptor_header *) &ss_bulk_comp_desc,
346 (struct usb_descriptor_header *) &ss_out_desc,
347 (struct usb_descriptor_header *) &ss_bulk_comp_desc,
348 NULL,
349};
350
351
352
353static struct usb_string rndis_string_defs[] = {
354 [0].s = "RNDIS Communications Control",
355 [1].s = "RNDIS Ethernet Data",
356 [2].s = "RNDIS",
357 { }
358};
359
360static struct usb_gadget_strings rndis_string_table = {
361 .language = 0x0409,
362 .strings = rndis_string_defs,
363};
364
365static struct usb_gadget_strings *rndis_strings[] = {
366 &rndis_string_table,
367 NULL,
368};
369
370
371
372static struct sk_buff *rndis_add_header(struct gether *port,
373 struct sk_buff *skb)
374{
375 struct sk_buff *skb2;
376
377 if (!skb)
378 return NULL;
379
380 skb2 = skb_realloc_headroom(skb, sizeof(struct rndis_packet_msg_type));
381 rndis_add_hdr(skb2);
382
383 dev_kfree_skb(skb);
384 return skb2;
385}
386
387static void rndis_response_available(void *_rndis)
388{
389 struct f_rndis *rndis = _rndis;
390 struct usb_request *req = rndis->notify_req;
391 struct usb_composite_dev *cdev = rndis->port.func.config->cdev;
392 __le32 *data = req->buf;
393 int status;
394
395 if (atomic_inc_return(&rndis->notify_count) != 1)
396 return;
397
398
399
400
401
402
403 data[0] = cpu_to_le32(1);
404 data[1] = cpu_to_le32(0);
405
406 status = usb_ep_queue(rndis->notify, req, GFP_ATOMIC);
407 if (status) {
408 atomic_dec(&rndis->notify_count);
409 DBG(cdev, "notify/0 --> %d\n", status);
410 }
411}
412
413static void rndis_response_complete(struct usb_ep *ep, struct usb_request *req)
414{
415 struct f_rndis *rndis = req->context;
416 struct usb_composite_dev *cdev = rndis->port.func.config->cdev;
417 int status = req->status;
418
419
420
421
422
423 switch (status) {
424 case -ECONNRESET:
425 case -ESHUTDOWN:
426
427 atomic_set(&rndis->notify_count, 0);
428 break;
429 default:
430 DBG(cdev, "RNDIS %s response error %d, %d/%d\n",
431 ep->name, status,
432 req->actual, req->length);
433
434 case 0:
435 if (ep != rndis->notify)
436 break;
437
438
439
440
441 if (atomic_dec_and_test(&rndis->notify_count))
442 break;
443 status = usb_ep_queue(rndis->notify, req, GFP_ATOMIC);
444 if (status) {
445 atomic_dec(&rndis->notify_count);
446 DBG(cdev, "notify/1 --> %d\n", status);
447 }
448 break;
449 }
450}
451
452static void rndis_command_complete(struct usb_ep *ep, struct usb_request *req)
453{
454 struct f_rndis *rndis = req->context;
455 int status;
456
457
458
459 status = rndis_msg_parser(rndis->params, (u8 *) req->buf);
460 if (status < 0)
461 pr_err("RNDIS command error %d, %d/%d\n",
462 status, req->actual, req->length);
463
464}
465
466static int
467rndis_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
468{
469 struct f_rndis *rndis = func_to_rndis(f);
470 struct usb_composite_dev *cdev = f->config->cdev;
471 struct usb_request *req = cdev->req;
472 int value = -EOPNOTSUPP;
473 u16 w_index = le16_to_cpu(ctrl->wIndex);
474 u16 w_value = le16_to_cpu(ctrl->wValue);
475 u16 w_length = le16_to_cpu(ctrl->wLength);
476
477
478
479
480 switch ((ctrl->bRequestType << 8) | ctrl->bRequest) {
481
482
483
484
485 case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
486 | USB_CDC_SEND_ENCAPSULATED_COMMAND:
487 if (w_value || w_index != rndis->ctrl_id)
488 goto invalid;
489
490 value = w_length;
491 req->complete = rndis_command_complete;
492 req->context = rndis;
493
494 break;
495
496 case ((USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
497 | USB_CDC_GET_ENCAPSULATED_RESPONSE:
498 if (w_value || w_index != rndis->ctrl_id)
499 goto invalid;
500 else {
501 u8 *buf;
502 u32 n;
503
504
505 buf = rndis_get_next_response(rndis->params, &n);
506 if (buf) {
507 memcpy(req->buf, buf, n);
508 req->complete = rndis_response_complete;
509 req->context = rndis;
510 rndis_free_response(rndis->params, buf);
511 value = n;
512 }
513
514 }
515 break;
516
517 default:
518invalid:
519 VDBG(cdev, "invalid control req%02x.%02x v%04x i%04x l%d\n",
520 ctrl->bRequestType, ctrl->bRequest,
521 w_value, w_index, w_length);
522 }
523
524
525 if (value >= 0) {
526 DBG(cdev, "rndis req%02x.%02x v%04x i%04x l%d\n",
527 ctrl->bRequestType, ctrl->bRequest,
528 w_value, w_index, w_length);
529 req->zero = (value < w_length);
530 req->length = value;
531 value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
532 if (value < 0)
533 ERROR(cdev, "rndis response on err %d\n", value);
534 }
535
536
537 return value;
538}
539
540
541static int rndis_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
542{
543 struct f_rndis *rndis = func_to_rndis(f);
544 struct usb_composite_dev *cdev = f->config->cdev;
545
546
547
548 if (intf == rndis->ctrl_id) {
549 VDBG(cdev, "reset rndis control %d\n", intf);
550 usb_ep_disable(rndis->notify);
551
552 if (!rndis->notify->desc) {
553 VDBG(cdev, "init rndis ctrl %d\n", intf);
554 if (config_ep_by_speed(cdev->gadget, f, rndis->notify))
555 goto fail;
556 }
557 usb_ep_enable(rndis->notify);
558
559 } else if (intf == rndis->data_id) {
560 struct net_device *net;
561
562 if (rndis->port.in_ep->enabled) {
563 DBG(cdev, "reset rndis\n");
564 gether_disconnect(&rndis->port);
565 }
566
567 if (!rndis->port.in_ep->desc || !rndis->port.out_ep->desc) {
568 DBG(cdev, "init rndis\n");
569 if (config_ep_by_speed(cdev->gadget, f,
570 rndis->port.in_ep) ||
571 config_ep_by_speed(cdev->gadget, f,
572 rndis->port.out_ep)) {
573 rndis->port.in_ep->desc = NULL;
574 rndis->port.out_ep->desc = NULL;
575 goto fail;
576 }
577 }
578
579
580 rndis->port.is_zlp_ok = false;
581
582
583
584
585
586
587
588
589
590
591
592
593
594 rndis->port.cdc_filter = 0;
595
596 DBG(cdev, "RNDIS RX/TX early activation ... \n");
597 net = gether_connect(&rndis->port);
598 if (IS_ERR(net))
599 return PTR_ERR(net);
600
601 rndis_set_param_dev(rndis->params, net,
602 &rndis->port.cdc_filter);
603 } else
604 goto fail;
605
606 return 0;
607fail:
608 return -EINVAL;
609}
610
611static void rndis_disable(struct usb_function *f)
612{
613 struct f_rndis *rndis = func_to_rndis(f);
614 struct usb_composite_dev *cdev = f->config->cdev;
615
616 if (!rndis->notify->enabled)
617 return;
618
619 DBG(cdev, "rndis deactivated\n");
620
621 rndis_uninit(rndis->params);
622 gether_disconnect(&rndis->port);
623
624 usb_ep_disable(rndis->notify);
625}
626
627
628
629
630
631
632
633
634
635
636static void rndis_open(struct gether *geth)
637{
638 struct f_rndis *rndis = func_to_rndis(&geth->func);
639 struct usb_composite_dev *cdev = geth->func.config->cdev;
640
641 DBG(cdev, "%s\n", __func__);
642
643 rndis_set_param_medium(rndis->params, RNDIS_MEDIUM_802_3,
644 bitrate(cdev->gadget) / 100);
645 rndis_signal_connect(rndis->params);
646}
647
648static void rndis_close(struct gether *geth)
649{
650 struct f_rndis *rndis = func_to_rndis(&geth->func);
651
652 DBG(geth->func.config->cdev, "%s\n", __func__);
653
654 rndis_set_param_medium(rndis->params, RNDIS_MEDIUM_802_3, 0);
655 rndis_signal_disconnect(rndis->params);
656}
657
658
659
660
661static inline bool can_support_rndis(struct usb_configuration *c)
662{
663
664 return true;
665}
666
667
668
669static int
670rndis_bind(struct usb_configuration *c, struct usb_function *f)
671{
672 struct usb_composite_dev *cdev = c->cdev;
673 struct f_rndis *rndis = func_to_rndis(f);
674 struct usb_string *us;
675 int status;
676 struct usb_ep *ep;
677
678 struct f_rndis_opts *rndis_opts;
679
680 if (!can_support_rndis(c))
681 return -EINVAL;
682
683 rndis_opts = container_of(f->fi, struct f_rndis_opts, func_inst);
684
685 if (cdev->use_os_string) {
686 f->os_desc_table = kzalloc(sizeof(*f->os_desc_table),
687 GFP_KERNEL);
688 if (!f->os_desc_table)
689 return -ENOMEM;
690 f->os_desc_n = 1;
691 f->os_desc_table[0].os_desc = &rndis_opts->rndis_os_desc;
692 }
693
694
695
696
697
698
699
700
701 if (!rndis_opts->bound) {
702 gether_set_gadget(rndis_opts->net, cdev->gadget);
703 status = gether_register_netdev(rndis_opts->net);
704 if (status)
705 goto fail;
706 rndis_opts->bound = true;
707 }
708
709 us = usb_gstrings_attach(cdev, rndis_strings,
710 ARRAY_SIZE(rndis_string_defs));
711 if (IS_ERR(us)) {
712 status = PTR_ERR(us);
713 goto fail;
714 }
715 rndis_control_intf.iInterface = us[0].id;
716 rndis_data_intf.iInterface = us[1].id;
717 rndis_iad_descriptor.iFunction = us[2].id;
718
719
720 status = usb_interface_id(c, f);
721 if (status < 0)
722 goto fail;
723 rndis->ctrl_id = status;
724 rndis_iad_descriptor.bFirstInterface = status;
725
726 rndis_control_intf.bInterfaceNumber = status;
727 rndis_union_desc.bMasterInterface0 = status;
728
729 if (cdev->use_os_string)
730 f->os_desc_table[0].if_id =
731 rndis_iad_descriptor.bFirstInterface;
732
733 status = usb_interface_id(c, f);
734 if (status < 0)
735 goto fail;
736 rndis->data_id = status;
737
738 rndis_data_intf.bInterfaceNumber = status;
739 rndis_union_desc.bSlaveInterface0 = status;
740
741 status = -ENODEV;
742
743
744 ep = usb_ep_autoconfig(cdev->gadget, &fs_in_desc);
745 if (!ep)
746 goto fail;
747 rndis->port.in_ep = ep;
748
749 ep = usb_ep_autoconfig(cdev->gadget, &fs_out_desc);
750 if (!ep)
751 goto fail;
752 rndis->port.out_ep = ep;
753
754
755
756
757
758 ep = usb_ep_autoconfig(cdev->gadget, &fs_notify_desc);
759 if (!ep)
760 goto fail;
761 rndis->notify = ep;
762
763 status = -ENOMEM;
764
765
766 rndis->notify_req = usb_ep_alloc_request(ep, GFP_KERNEL);
767 if (!rndis->notify_req)
768 goto fail;
769 rndis->notify_req->buf = kmalloc(STATUS_BYTECOUNT, GFP_KERNEL);
770 if (!rndis->notify_req->buf)
771 goto fail;
772 rndis->notify_req->length = STATUS_BYTECOUNT;
773 rndis->notify_req->context = rndis;
774 rndis->notify_req->complete = rndis_response_complete;
775
776
777
778
779
780 hs_in_desc.bEndpointAddress = fs_in_desc.bEndpointAddress;
781 hs_out_desc.bEndpointAddress = fs_out_desc.bEndpointAddress;
782 hs_notify_desc.bEndpointAddress = fs_notify_desc.bEndpointAddress;
783
784 ss_in_desc.bEndpointAddress = fs_in_desc.bEndpointAddress;
785 ss_out_desc.bEndpointAddress = fs_out_desc.bEndpointAddress;
786 ss_notify_desc.bEndpointAddress = fs_notify_desc.bEndpointAddress;
787
788 status = usb_assign_descriptors(f, eth_fs_function, eth_hs_function,
789 eth_ss_function, NULL);
790 if (status)
791 goto fail;
792
793 rndis->port.open = rndis_open;
794 rndis->port.close = rndis_close;
795
796 rndis_set_param_medium(rndis->params, RNDIS_MEDIUM_802_3, 0);
797 rndis_set_host_mac(rndis->params, rndis->ethaddr);
798
799 if (rndis->manufacturer && rndis->vendorID &&
800 rndis_set_param_vendor(rndis->params, rndis->vendorID,
801 rndis->manufacturer)) {
802 status = -EINVAL;
803 goto fail_free_descs;
804 }
805
806
807
808
809
810
811 DBG(cdev, "RNDIS: %s speed IN/%s OUT/%s NOTIFY/%s\n",
812 gadget_is_superspeed(c->cdev->gadget) ? "super" :
813 gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full",
814 rndis->port.in_ep->name, rndis->port.out_ep->name,
815 rndis->notify->name);
816 return 0;
817
818fail_free_descs:
819 usb_free_all_descriptors(f);
820fail:
821 kfree(f->os_desc_table);
822 f->os_desc_n = 0;
823
824 if (rndis->notify_req) {
825 kfree(rndis->notify_req->buf);
826 usb_ep_free_request(rndis->notify, rndis->notify_req);
827 }
828
829 ERROR(cdev, "%s: can't bind, err %d\n", f->name, status);
830
831 return status;
832}
833
834void rndis_borrow_net(struct usb_function_instance *f, struct net_device *net)
835{
836 struct f_rndis_opts *opts;
837
838 opts = container_of(f, struct f_rndis_opts, func_inst);
839 if (opts->bound)
840 gether_cleanup(netdev_priv(opts->net));
841 else
842 free_netdev(opts->net);
843 opts->borrowed_net = opts->bound = true;
844 opts->net = net;
845}
846EXPORT_SYMBOL_GPL(rndis_borrow_net);
847
848static inline struct f_rndis_opts *to_f_rndis_opts(struct config_item *item)
849{
850 return container_of(to_config_group(item), struct f_rndis_opts,
851 func_inst.group);
852}
853
854
855USB_ETHERNET_CONFIGFS_ITEM(rndis);
856
857
858USB_ETHERNET_CONFIGFS_ITEM_ATTR_DEV_ADDR(rndis);
859
860
861USB_ETHERNET_CONFIGFS_ITEM_ATTR_HOST_ADDR(rndis);
862
863
864USB_ETHERNET_CONFIGFS_ITEM_ATTR_QMULT(rndis);
865
866
867USB_ETHERNET_CONFIGFS_ITEM_ATTR_IFNAME(rndis);
868
869static struct configfs_attribute *rndis_attrs[] = {
870 &rndis_opts_attr_dev_addr,
871 &rndis_opts_attr_host_addr,
872 &rndis_opts_attr_qmult,
873 &rndis_opts_attr_ifname,
874 NULL,
875};
876
877static struct config_item_type rndis_func_type = {
878 .ct_item_ops = &rndis_item_ops,
879 .ct_attrs = rndis_attrs,
880 .ct_owner = THIS_MODULE,
881};
882
883static void rndis_free_inst(struct usb_function_instance *f)
884{
885 struct f_rndis_opts *opts;
886
887 opts = container_of(f, struct f_rndis_opts, func_inst);
888 if (!opts->borrowed_net) {
889 if (opts->bound)
890 gether_cleanup(netdev_priv(opts->net));
891 else
892 free_netdev(opts->net);
893 }
894
895 kfree(opts);
896}
897
898static struct usb_function_instance *rndis_alloc_inst(void)
899{
900 struct f_rndis_opts *opts;
901 struct usb_os_desc *descs[1];
902 char *names[1];
903
904 opts = kzalloc(sizeof(*opts), GFP_KERNEL);
905 if (!opts)
906 return ERR_PTR(-ENOMEM);
907 opts->rndis_os_desc.ext_compat_id = opts->rndis_ext_compat_id;
908
909 mutex_init(&opts->lock);
910 opts->func_inst.free_func_inst = rndis_free_inst;
911 opts->net = gether_setup_default();
912 if (IS_ERR(opts->net)) {
913 struct net_device *net = opts->net;
914 kfree(opts);
915 return ERR_CAST(net);
916 }
917 INIT_LIST_HEAD(&opts->rndis_os_desc.ext_prop);
918
919 descs[0] = &opts->rndis_os_desc;
920 names[0] = "rndis";
921 config_group_init_type_name(&opts->func_inst.group, "",
922 &rndis_func_type);
923 usb_os_desc_prepare_interf_dir(&opts->func_inst.group, 1, descs,
924 names, THIS_MODULE);
925
926 return &opts->func_inst;
927}
928
929static void rndis_free(struct usb_function *f)
930{
931 struct f_rndis *rndis;
932 struct f_rndis_opts *opts;
933
934 rndis = func_to_rndis(f);
935 rndis_deregister(rndis->params);
936 opts = container_of(f->fi, struct f_rndis_opts, func_inst);
937 kfree(rndis);
938 mutex_lock(&opts->lock);
939 opts->refcnt--;
940 mutex_unlock(&opts->lock);
941}
942
943static void rndis_unbind(struct usb_configuration *c, struct usb_function *f)
944{
945 struct f_rndis *rndis = func_to_rndis(f);
946
947 kfree(f->os_desc_table);
948 f->os_desc_n = 0;
949 usb_free_all_descriptors(f);
950
951 kfree(rndis->notify_req->buf);
952 usb_ep_free_request(rndis->notify, rndis->notify_req);
953}
954
955static struct usb_function *rndis_alloc(struct usb_function_instance *fi)
956{
957 struct f_rndis *rndis;
958 struct f_rndis_opts *opts;
959 struct rndis_params *params;
960
961
962 rndis = kzalloc(sizeof(*rndis), GFP_KERNEL);
963 if (!rndis)
964 return ERR_PTR(-ENOMEM);
965
966 opts = container_of(fi, struct f_rndis_opts, func_inst);
967 mutex_lock(&opts->lock);
968 opts->refcnt++;
969
970 gether_get_host_addr_u8(opts->net, rndis->ethaddr);
971 rndis->vendorID = opts->vendor_id;
972 rndis->manufacturer = opts->manufacturer;
973
974 rndis->port.ioport = netdev_priv(opts->net);
975 mutex_unlock(&opts->lock);
976
977 rndis->port.cdc_filter = 0;
978
979
980 rndis->port.header_len = sizeof(struct rndis_packet_msg_type);
981 rndis->port.wrap = rndis_add_header;
982 rndis->port.unwrap = rndis_rm_hdr;
983
984 rndis->port.func.name = "rndis";
985
986 rndis->port.func.bind = rndis_bind;
987 rndis->port.func.unbind = rndis_unbind;
988 rndis->port.func.set_alt = rndis_set_alt;
989 rndis->port.func.setup = rndis_setup;
990 rndis->port.func.disable = rndis_disable;
991 rndis->port.func.free_func = rndis_free;
992
993 params = rndis_register(rndis_response_available, rndis);
994 if (IS_ERR(params)) {
995 kfree(rndis);
996 return ERR_CAST(params);
997 }
998 rndis->params = params;
999
1000 return &rndis->port.func;
1001}
1002
1003DECLARE_USB_FUNCTION_INIT(rndis, rndis_alloc_inst, rndis_alloc);
1004MODULE_LICENSE("GPL");
1005MODULE_AUTHOR("David Brownell");
1006