2 * cdc2.c -- CDC Composite driver, with ECM and ACM support
4 * Copyright (C) 2008 David Brownell
5 * Copyright (C) 2008 Nokia Corporation
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
13 #include <linux/kernel.h>
14 #include <linux/module.h>
21 #define DRIVER_DESC "CDC Composite Gadget"
22 #define DRIVER_VERSION "King Kamehameha Day 2008"
24 /*-------------------------------------------------------------------------*/
26 /* DO NOT REUSE THESE IDs with a protocol-incompatible driver!! Ever!!
27 * Instead: allocate your own, using normal USB-IF procedures.
30 /* Thanks to NetChip Technologies for donating this product ID.
31 * It's for devices with only this composite CDC configuration.
33 #define CDC_VENDOR_NUM 0x0525 /* NetChip */
34 #define CDC_PRODUCT_NUM 0xa4aa /* CDC Composite: ECM + ACM */
36 USB_GADGET_COMPOSITE_OPTIONS();
38 USB_ETHERNET_MODULE_PARAMETERS();
40 /*-------------------------------------------------------------------------*/
42 static struct usb_device_descriptor device_desc
= {
43 .bLength
= sizeof device_desc
,
44 .bDescriptorType
= USB_DT_DEVICE
,
46 /* .bcdUSB = DYNAMIC */
48 .bDeviceClass
= USB_CLASS_COMM
,
51 /* .bMaxPacketSize0 = f(hardware) */
53 /* Vendor and product id can be overridden by module parameters. */
54 .idVendor
= cpu_to_le16(CDC_VENDOR_NUM
),
55 .idProduct
= cpu_to_le16(CDC_PRODUCT_NUM
),
56 /* .bcdDevice = f(hardware) */
57 /* .iManufacturer = DYNAMIC */
58 /* .iProduct = DYNAMIC */
59 /* NO SERIAL NUMBER */
60 .bNumConfigurations
= 1,
63 static const struct usb_descriptor_header
*otg_desc
[2];
65 /* string IDs are assigned dynamically */
66 static struct usb_string strings_dev
[] = {
67 [USB_GADGET_MANUFACTURER_IDX
].s
= "",
68 [USB_GADGET_PRODUCT_IDX
].s
= DRIVER_DESC
,
69 [USB_GADGET_SERIAL_IDX
].s
= "",
73 static struct usb_gadget_strings stringtab_dev
= {
74 .language
= 0x0409, /* en-us */
75 .strings
= strings_dev
,
78 static struct usb_gadget_strings
*dev_strings
[] = {
83 /*-------------------------------------------------------------------------*/
84 static struct usb_function
*f_acm
;
85 static struct usb_function_instance
*fi_serial
;
87 static struct usb_function
*f_ecm
;
88 static struct usb_function_instance
*fi_ecm
;
91 * We _always_ have both CDC ECM and CDC ACM functions.
93 static int cdc_do_config(struct usb_configuration
*c
)
97 if (gadget_is_otg(c
->cdev
->gadget
)) {
98 c
->descriptors
= otg_desc
;
99 c
->bmAttributes
|= USB_CONFIG_ATT_WAKEUP
;
102 f_ecm
= usb_get_function(fi_ecm
);
104 status
= PTR_ERR(f_ecm
);
108 status
= usb_add_function(c
, f_ecm
);
112 f_acm
= usb_get_function(fi_serial
);
114 status
= PTR_ERR(f_acm
);
118 status
= usb_add_function(c
, f_acm
);
124 usb_put_function(f_acm
);
126 usb_remove_function(c
, f_ecm
);
128 usb_put_function(f_ecm
);
133 static struct usb_configuration cdc_config_driver
= {
134 .label
= "CDC Composite (ECM + ACM)",
135 .bConfigurationValue
= 1,
136 /* .iConfiguration = DYNAMIC */
137 .bmAttributes
= USB_CONFIG_ATT_SELFPOWER
,
140 /*-------------------------------------------------------------------------*/
142 static int cdc_bind(struct usb_composite_dev
*cdev
)
144 struct usb_gadget
*gadget
= cdev
->gadget
;
145 struct f_ecm_opts
*ecm_opts
;
148 if (!can_support_ecm(cdev
->gadget
)) {
149 dev_err(&gadget
->dev
, "controller '%s' not usable\n",
154 fi_ecm
= usb_get_function_instance("ecm");
156 return PTR_ERR(fi_ecm
);
158 ecm_opts
= container_of(fi_ecm
, struct f_ecm_opts
, func_inst
);
160 gether_set_qmult(ecm_opts
->net
, qmult
);
161 if (!gether_set_host_addr(ecm_opts
->net
, host_addr
))
162 pr_info("using host ethernet address: %s", host_addr
);
163 if (!gether_set_dev_addr(ecm_opts
->net
, dev_addr
))
164 pr_info("using self ethernet address: %s", dev_addr
);
166 fi_serial
= usb_get_function_instance("acm");
167 if (IS_ERR(fi_serial
)) {
168 status
= PTR_ERR(fi_serial
);
172 /* Allocate string descriptor numbers ... note that string
173 * contents can be overridden by the composite_dev glue.
176 status
= usb_string_ids_tab(cdev
, strings_dev
);
179 device_desc
.iManufacturer
= strings_dev
[USB_GADGET_MANUFACTURER_IDX
].id
;
180 device_desc
.iProduct
= strings_dev
[USB_GADGET_PRODUCT_IDX
].id
;
182 if (gadget_is_otg(gadget
) && !otg_desc
[0]) {
183 struct usb_descriptor_header
*usb_desc
;
185 usb_desc
= usb_otg_descriptor_alloc(gadget
);
188 usb_otg_descriptor_init(gadget
, usb_desc
);
189 otg_desc
[0] = usb_desc
;
193 /* register our configuration */
194 status
= usb_add_config(cdev
, &cdc_config_driver
, cdc_do_config
);
198 usb_composite_overwrite_options(cdev
, &coverwrite
);
199 dev_info(&gadget
->dev
, "%s, version: " DRIVER_VERSION
"\n",
208 usb_put_function_instance(fi_serial
);
210 usb_put_function_instance(fi_ecm
);
214 static int cdc_unbind(struct usb_composite_dev
*cdev
)
216 usb_put_function(f_acm
);
217 usb_put_function_instance(fi_serial
);
218 if (!IS_ERR_OR_NULL(f_ecm
))
219 usb_put_function(f_ecm
);
220 if (!IS_ERR_OR_NULL(fi_ecm
))
221 usb_put_function_instance(fi_ecm
);
228 static struct usb_composite_driver cdc_driver
= {
231 .strings
= dev_strings
,
232 .max_speed
= USB_SPEED_HIGH
,
234 .unbind
= cdc_unbind
,
237 module_usb_composite_driver(cdc_driver
);
239 MODULE_DESCRIPTION(DRIVER_DESC
);
240 MODULE_AUTHOR("David Brownell");
241 MODULE_LICENSE("GPL");