2 * f_eem.c -- USB CDC Ethernet (EEM) link function driver
4 * Copyright (C) 2003-2005,2008 David Brownell
5 * Copyright (C) 2008 Nokia Corporation
6 * Copyright (C) 2009 EF Johnson Technologies
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
14 #include <linux/kernel.h>
15 #include <linux/module.h>
16 #include <linux/device.h>
17 #include <linux/etherdevice.h>
18 #include <linux/crc32.h>
19 #include <linux/slab.h>
22 #include "u_ether_configfs.h"
28 * This function is a "CDC Ethernet Emulation Model" (CDC EEM)
37 static inline struct f_eem
*func_to_eem(struct usb_function
*f
)
39 return container_of(f
, struct f_eem
, port
.func
);
42 /*-------------------------------------------------------------------------*/
44 /* interface descriptor: */
46 static struct usb_interface_descriptor eem_intf
= {
47 .bLength
= sizeof eem_intf
,
48 .bDescriptorType
= USB_DT_INTERFACE
,
50 /* .bInterfaceNumber = DYNAMIC */
52 .bInterfaceClass
= USB_CLASS_COMM
,
53 .bInterfaceSubClass
= USB_CDC_SUBCLASS_EEM
,
54 .bInterfaceProtocol
= USB_CDC_PROTO_EEM
,
55 /* .iInterface = DYNAMIC */
58 /* full speed support: */
60 static struct usb_endpoint_descriptor eem_fs_in_desc
= {
61 .bLength
= USB_DT_ENDPOINT_SIZE
,
62 .bDescriptorType
= USB_DT_ENDPOINT
,
64 .bEndpointAddress
= USB_DIR_IN
,
65 .bmAttributes
= USB_ENDPOINT_XFER_BULK
,
68 static struct usb_endpoint_descriptor eem_fs_out_desc
= {
69 .bLength
= USB_DT_ENDPOINT_SIZE
,
70 .bDescriptorType
= USB_DT_ENDPOINT
,
72 .bEndpointAddress
= USB_DIR_OUT
,
73 .bmAttributes
= USB_ENDPOINT_XFER_BULK
,
76 static struct usb_descriptor_header
*eem_fs_function
[] = {
77 /* CDC EEM control descriptors */
78 (struct usb_descriptor_header
*) &eem_intf
,
79 (struct usb_descriptor_header
*) &eem_fs_in_desc
,
80 (struct usb_descriptor_header
*) &eem_fs_out_desc
,
84 /* high speed support: */
86 static struct usb_endpoint_descriptor eem_hs_in_desc
= {
87 .bLength
= USB_DT_ENDPOINT_SIZE
,
88 .bDescriptorType
= USB_DT_ENDPOINT
,
90 .bEndpointAddress
= USB_DIR_IN
,
91 .bmAttributes
= USB_ENDPOINT_XFER_BULK
,
92 .wMaxPacketSize
= cpu_to_le16(512),
95 static struct usb_endpoint_descriptor eem_hs_out_desc
= {
96 .bLength
= USB_DT_ENDPOINT_SIZE
,
97 .bDescriptorType
= USB_DT_ENDPOINT
,
99 .bEndpointAddress
= USB_DIR_OUT
,
100 .bmAttributes
= USB_ENDPOINT_XFER_BULK
,
101 .wMaxPacketSize
= cpu_to_le16(512),
104 static struct usb_descriptor_header
*eem_hs_function
[] = {
105 /* CDC EEM control descriptors */
106 (struct usb_descriptor_header
*) &eem_intf
,
107 (struct usb_descriptor_header
*) &eem_hs_in_desc
,
108 (struct usb_descriptor_header
*) &eem_hs_out_desc
,
112 /* super speed support: */
114 static struct usb_endpoint_descriptor eem_ss_in_desc
= {
115 .bLength
= USB_DT_ENDPOINT_SIZE
,
116 .bDescriptorType
= USB_DT_ENDPOINT
,
118 .bEndpointAddress
= USB_DIR_IN
,
119 .bmAttributes
= USB_ENDPOINT_XFER_BULK
,
120 .wMaxPacketSize
= cpu_to_le16(1024),
123 static struct usb_endpoint_descriptor eem_ss_out_desc
= {
124 .bLength
= USB_DT_ENDPOINT_SIZE
,
125 .bDescriptorType
= USB_DT_ENDPOINT
,
127 .bEndpointAddress
= USB_DIR_OUT
,
128 .bmAttributes
= USB_ENDPOINT_XFER_BULK
,
129 .wMaxPacketSize
= cpu_to_le16(1024),
132 static struct usb_ss_ep_comp_descriptor eem_ss_bulk_comp_desc
= {
133 .bLength
= sizeof eem_ss_bulk_comp_desc
,
134 .bDescriptorType
= USB_DT_SS_ENDPOINT_COMP
,
136 /* the following 2 values can be tweaked if necessary */
137 /* .bMaxBurst = 0, */
138 /* .bmAttributes = 0, */
141 static struct usb_descriptor_header
*eem_ss_function
[] = {
142 /* CDC EEM control descriptors */
143 (struct usb_descriptor_header
*) &eem_intf
,
144 (struct usb_descriptor_header
*) &eem_ss_in_desc
,
145 (struct usb_descriptor_header
*) &eem_ss_bulk_comp_desc
,
146 (struct usb_descriptor_header
*) &eem_ss_out_desc
,
147 (struct usb_descriptor_header
*) &eem_ss_bulk_comp_desc
,
151 /* string descriptors: */
153 static struct usb_string eem_string_defs
[] = {
154 [0].s
= "CDC Ethernet Emulation Model (EEM)",
155 { } /* end of list */
158 static struct usb_gadget_strings eem_string_table
= {
159 .language
= 0x0409, /* en-us */
160 .strings
= eem_string_defs
,
163 static struct usb_gadget_strings
*eem_strings
[] = {
168 /*-------------------------------------------------------------------------*/
170 static int eem_setup(struct usb_function
*f
, const struct usb_ctrlrequest
*ctrl
)
172 struct usb_composite_dev
*cdev
= f
->config
->cdev
;
173 int value
= -EOPNOTSUPP
;
174 u16 w_index
= le16_to_cpu(ctrl
->wIndex
);
175 u16 w_value
= le16_to_cpu(ctrl
->wValue
);
176 u16 w_length
= le16_to_cpu(ctrl
->wLength
);
178 DBG(cdev
, "invalid control req%02x.%02x v%04x i%04x l%d\n",
179 ctrl
->bRequestType
, ctrl
->bRequest
,
180 w_value
, w_index
, w_length
);
182 /* device either stalls (value < 0) or reports success */
187 static int eem_set_alt(struct usb_function
*f
, unsigned intf
, unsigned alt
)
189 struct f_eem
*eem
= func_to_eem(f
);
190 struct usb_composite_dev
*cdev
= f
->config
->cdev
;
191 struct net_device
*net
;
193 /* we know alt == 0, so this is an activation or a reset */
197 if (intf
== eem
->ctrl_id
) {
199 if (eem
->port
.in_ep
->driver_data
) {
200 DBG(cdev
, "reset eem\n");
201 gether_disconnect(&eem
->port
);
204 if (!eem
->port
.in_ep
->desc
|| !eem
->port
.out_ep
->desc
) {
205 DBG(cdev
, "init eem\n");
206 if (config_ep_by_speed(cdev
->gadget
, f
,
208 config_ep_by_speed(cdev
->gadget
, f
,
210 eem
->port
.in_ep
->desc
= NULL
;
211 eem
->port
.out_ep
->desc
= NULL
;
216 /* zlps should not occur because zero-length EEM packets
217 * will be inserted in those cases where they would occur
219 eem
->port
.is_zlp_ok
= 1;
220 eem
->port
.cdc_filter
= DEFAULT_FILTER
;
221 DBG(cdev
, "activate eem\n");
222 net
= gether_connect(&eem
->port
);
233 static void eem_disable(struct usb_function
*f
)
235 struct f_eem
*eem
= func_to_eem(f
);
236 struct usb_composite_dev
*cdev
= f
->config
->cdev
;
238 DBG(cdev
, "eem deactivated\n");
240 if (eem
->port
.in_ep
->driver_data
)
241 gether_disconnect(&eem
->port
);
244 /*-------------------------------------------------------------------------*/
246 /* EEM function driver setup/binding */
248 static int eem_bind(struct usb_configuration
*c
, struct usb_function
*f
)
250 struct usb_composite_dev
*cdev
= c
->cdev
;
251 struct f_eem
*eem
= func_to_eem(f
);
252 struct usb_string
*us
;
256 struct f_eem_opts
*eem_opts
;
258 eem_opts
= container_of(f
->fi
, struct f_eem_opts
, func_inst
);
260 * in drivers/usb/gadget/configfs.c:configfs_composite_bind()
261 * configurations are bound in sequence with list_for_each_entry,
262 * in each configuration its functions are bound in sequence
263 * with list_for_each_entry, so we assume no race condition
264 * with regard to eem_opts->bound access
266 if (!eem_opts
->bound
) {
267 mutex_lock(&eem_opts
->lock
);
268 gether_set_gadget(eem_opts
->net
, cdev
->gadget
);
269 status
= gether_register_netdev(eem_opts
->net
);
270 mutex_unlock(&eem_opts
->lock
);
273 eem_opts
->bound
= true;
276 us
= usb_gstrings_attach(cdev
, eem_strings
,
277 ARRAY_SIZE(eem_string_defs
));
280 eem_intf
.iInterface
= us
[0].id
;
282 /* allocate instance-specific interface IDs */
283 status
= usb_interface_id(c
, f
);
286 eem
->ctrl_id
= status
;
287 eem_intf
.bInterfaceNumber
= status
;
291 /* allocate instance-specific endpoints */
292 ep
= usb_ep_autoconfig(cdev
->gadget
, &eem_fs_in_desc
);
295 eem
->port
.in_ep
= ep
;
296 ep
->driver_data
= cdev
; /* claim */
298 ep
= usb_ep_autoconfig(cdev
->gadget
, &eem_fs_out_desc
);
301 eem
->port
.out_ep
= ep
;
302 ep
->driver_data
= cdev
; /* claim */
306 /* support all relevant hardware speeds... we expect that when
307 * hardware is dual speed, all bulk-capable endpoints work at
310 eem_hs_in_desc
.bEndpointAddress
= eem_fs_in_desc
.bEndpointAddress
;
311 eem_hs_out_desc
.bEndpointAddress
= eem_fs_out_desc
.bEndpointAddress
;
313 eem_ss_in_desc
.bEndpointAddress
= eem_fs_in_desc
.bEndpointAddress
;
314 eem_ss_out_desc
.bEndpointAddress
= eem_fs_out_desc
.bEndpointAddress
;
316 status
= usb_assign_descriptors(f
, eem_fs_function
, eem_hs_function
,
321 DBG(cdev
, "CDC Ethernet (EEM): %s speed IN/%s OUT/%s\n",
322 gadget_is_superspeed(c
->cdev
->gadget
) ? "super" :
323 gadget_is_dualspeed(c
->cdev
->gadget
) ? "dual" : "full",
324 eem
->port
.in_ep
->name
, eem
->port
.out_ep
->name
);
328 if (eem
->port
.out_ep
)
329 eem
->port
.out_ep
->driver_data
= NULL
;
331 eem
->port
.in_ep
->driver_data
= NULL
;
333 ERROR(cdev
, "%s: can't bind, err %d\n", f
->name
, status
);
338 static void eem_cmd_complete(struct usb_ep
*ep
, struct usb_request
*req
)
340 struct sk_buff
*skb
= (struct sk_buff
*)req
->context
;
342 dev_kfree_skb_any(skb
);
346 * Add the EEM header and ethernet checksum.
347 * We currently do not attempt to put multiple ethernet frames
348 * into a single USB transfer
350 static struct sk_buff
*eem_wrap(struct gether
*port
, struct sk_buff
*skb
)
352 struct sk_buff
*skb2
= NULL
;
353 struct usb_ep
*in
= port
->in_ep
;
357 int headroom
= skb_headroom(skb
);
358 int tailroom
= skb_tailroom(skb
);
360 /* When (len + EEM_HLEN + ETH_FCS_LEN) % in->maxpacket) is 0,
361 * stick two bytes of zero-length EEM packet on the end.
363 if (((len
+ EEM_HLEN
+ ETH_FCS_LEN
) % in
->maxpacket
) == 0)
366 if ((tailroom
>= (ETH_FCS_LEN
+ padlen
)) &&
367 (headroom
>= EEM_HLEN
) && !skb_cloned(skb
))
370 skb2
= skb_copy_expand(skb
, EEM_HLEN
, ETH_FCS_LEN
+ padlen
, GFP_ATOMIC
);
371 dev_kfree_skb_any(skb
);
377 /* use the "no CRC" option */
378 put_unaligned_be32(0xdeadbeef, skb_put(skb
, 4));
380 /* EEM packet header format:
381 * b0..13: length of ethernet frame
382 * b14: bmCRC (0 == sentinel CRC)
383 * b15: bmType (0 == data)
386 put_unaligned_le16(len
& 0x3FFF, skb_push(skb
, 2));
388 /* add a zero-length EEM packet, if needed */
390 put_unaligned_le16(0, skb_put(skb
, 2));
396 * Remove the EEM header. Note that there can be many EEM packets in a single
397 * USB transfer, so we need to break them out and handle them independently.
399 static int eem_unwrap(struct gether
*port
,
401 struct sk_buff_head
*list
)
403 struct usb_composite_dev
*cdev
= port
->func
.config
->cdev
;
407 struct sk_buff
*skb2
;
411 if (skb
->len
< EEM_HLEN
) {
413 DBG(cdev
, "invalid EEM header\n");
417 /* remove the EEM header */
418 header
= get_unaligned_le16(skb
->data
);
419 skb_pull(skb
, EEM_HLEN
);
421 /* EEM packet header format:
422 * b0..14: EEM type dependent (data or command)
423 * b15: bmType (0 == data, 1 == command)
425 if (header
& BIT(15)) {
426 struct usb_request
*req
= cdev
->req
;
429 /* EEM command packet format:
430 * b0..10: bmEEMCmdParam
432 * b14: reserved (must be zero)
433 * b15: bmType (1 == command)
435 if (header
& BIT(14))
438 bmEEMCmd
= (header
>> 11) & 0x7;
441 len
= header
& 0x7FF;
442 if (skb
->len
< len
) {
447 skb2
= skb_clone(skb
, GFP_ATOMIC
);
448 if (unlikely(!skb2
)) {
449 DBG(cdev
, "EEM echo response error\n");
453 put_unaligned_le16(BIT(15) | BIT(11) | len
,
455 skb_copy_bits(skb2
, 0, req
->buf
, skb2
->len
);
456 req
->length
= skb2
->len
;
457 req
->complete
= eem_cmd_complete
;
460 if (usb_ep_queue(port
->in_ep
, req
, GFP_ATOMIC
))
461 DBG(cdev
, "echo response queue fail\n");
464 case 1: /* echo response */
465 case 2: /* suspend hint */
466 case 3: /* response hint */
467 case 4: /* response complete hint */
469 default: /* reserved */
474 struct sk_buff
*skb3
;
476 /* check for zero-length EEM packet */
480 /* EEM data packet format:
481 * b0..13: length of ethernet frame
482 * b14: bmCRC (0 == sentinel, 1 == calculated)
483 * b15: bmType (0 == data)
485 len
= header
& 0x3FFF;
487 || (len
< (ETH_HLEN
+ ETH_FCS_LEN
))) {
493 if (header
& BIT(14)) {
494 crc
= get_unaligned_le32(skb
->data
+ len
497 skb
->data
, len
- ETH_FCS_LEN
);
499 crc
= get_unaligned_be32(skb
->data
+ len
504 DBG(cdev
, "invalid EEM CRC\n");
508 skb2
= skb_clone(skb
, GFP_ATOMIC
);
509 if (unlikely(!skb2
)) {
510 DBG(cdev
, "unable to unframe EEM packet\n");
513 skb_trim(skb2
, len
- ETH_FCS_LEN
);
515 skb3
= skb_copy_expand(skb2
,
519 if (unlikely(!skb3
)) {
520 DBG(cdev
, "unable to realign EEM packet\n");
521 dev_kfree_skb_any(skb2
);
524 dev_kfree_skb_any(skb2
);
525 skb_queue_tail(list
, skb3
);
532 dev_kfree_skb_any(skb
);
536 static inline struct f_eem_opts
*to_f_eem_opts(struct config_item
*item
)
538 return container_of(to_config_group(item
), struct f_eem_opts
,
543 USB_ETHERNET_CONFIGFS_ITEM(eem
);
545 /* f_eem_opts_dev_addr */
546 USB_ETHERNET_CONFIGFS_ITEM_ATTR_DEV_ADDR(eem
);
548 /* f_eem_opts_host_addr */
549 USB_ETHERNET_CONFIGFS_ITEM_ATTR_HOST_ADDR(eem
);
551 /* f_eem_opts_qmult */
552 USB_ETHERNET_CONFIGFS_ITEM_ATTR_QMULT(eem
);
554 /* f_eem_opts_ifname */
555 USB_ETHERNET_CONFIGFS_ITEM_ATTR_IFNAME(eem
);
557 static struct configfs_attribute
*eem_attrs
[] = {
558 &f_eem_opts_dev_addr
.attr
,
559 &f_eem_opts_host_addr
.attr
,
560 &f_eem_opts_qmult
.attr
,
561 &f_eem_opts_ifname
.attr
,
565 static struct config_item_type eem_func_type
= {
566 .ct_item_ops
= &eem_item_ops
,
567 .ct_attrs
= eem_attrs
,
568 .ct_owner
= THIS_MODULE
,
571 static void eem_free_inst(struct usb_function_instance
*f
)
573 struct f_eem_opts
*opts
;
575 opts
= container_of(f
, struct f_eem_opts
, func_inst
);
577 gether_cleanup(netdev_priv(opts
->net
));
579 free_netdev(opts
->net
);
583 static struct usb_function_instance
*eem_alloc_inst(void)
585 struct f_eem_opts
*opts
;
587 opts
= kzalloc(sizeof(*opts
), GFP_KERNEL
);
589 return ERR_PTR(-ENOMEM
);
590 mutex_init(&opts
->lock
);
591 opts
->func_inst
.free_func_inst
= eem_free_inst
;
592 opts
->net
= gether_setup_default();
593 if (IS_ERR(opts
->net
)) {
594 struct net_device
*net
= opts
->net
;
596 return ERR_CAST(net
);
599 config_group_init_type_name(&opts
->func_inst
.group
, "", &eem_func_type
);
601 return &opts
->func_inst
;
604 static void eem_free(struct usb_function
*f
)
607 struct f_eem_opts
*opts
;
609 eem
= func_to_eem(f
);
610 opts
= container_of(f
->fi
, struct f_eem_opts
, func_inst
);
612 mutex_lock(&opts
->lock
);
614 mutex_unlock(&opts
->lock
);
617 static void eem_unbind(struct usb_configuration
*c
, struct usb_function
*f
)
619 DBG(c
->cdev
, "eem unbind\n");
621 usb_free_all_descriptors(f
);
624 static struct usb_function
*eem_alloc(struct usb_function_instance
*fi
)
627 struct f_eem_opts
*opts
;
629 /* allocate and initialize one new instance */
630 eem
= kzalloc(sizeof(*eem
), GFP_KERNEL
);
632 return ERR_PTR(-ENOMEM
);
634 opts
= container_of(fi
, struct f_eem_opts
, func_inst
);
635 mutex_lock(&opts
->lock
);
638 eem
->port
.ioport
= netdev_priv(opts
->net
);
639 mutex_unlock(&opts
->lock
);
640 eem
->port
.cdc_filter
= DEFAULT_FILTER
;
642 eem
->port
.func
.name
= "cdc_eem";
643 /* descriptors are per-instance copies */
644 eem
->port
.func
.bind
= eem_bind
;
645 eem
->port
.func
.unbind
= eem_unbind
;
646 eem
->port
.func
.set_alt
= eem_set_alt
;
647 eem
->port
.func
.setup
= eem_setup
;
648 eem
->port
.func
.disable
= eem_disable
;
649 eem
->port
.func
.free_func
= eem_free
;
650 eem
->port
.wrap
= eem_wrap
;
651 eem
->port
.unwrap
= eem_unwrap
;
652 eem
->port
.header_len
= EEM_HLEN
;
654 return &eem
->port
.func
;
657 DECLARE_USB_FUNCTION_INIT(eem
, eem_alloc_inst
, eem_alloc
);
658 MODULE_LICENSE("GPL");
659 MODULE_AUTHOR("David Brownell");