15 #include <linux/kernel.h>
16 #include <linux/slab.h>
17 #include <linux/module.h>
18 #include <linux/device.h>
19 #include <linux/utsname.h>
22 #include <asm/unaligned.h>
32 #define USB_BUFSIZ 1024
65 static char composite_manufacturer[50];
93 #define for_each_ep_desc(start, ep_desc) \
94 for (ep_desc = next_ep_desc(start); \
95 ep_desc; ep_desc = next_ep_desc(ep_desc+1))
124 int want_comp_desc = 0;
128 if (!g || !f || !_ep)
134 if (gadget_is_superspeed(g)) {
141 if (gadget_is_dualspeed(g)) {
159 _ep->
maxpacket = usb_endpoint_maxp(chosen_desc);
160 _ep->
desc = chosen_desc;
177 switch (usb_endpoint_type(_ep->
desc)) {
187 ERROR(cdev,
"ep0 bMaxBurst must be 0\n");
214 DBG(config->
cdev,
"adding '%s'/%p to config '%s'/%p\n",
216 config->
label, config);
221 function->config =
config;
226 value =
function->bind(config,
function);
229 function->config =
NULL;
248 DBG(config->
cdev,
"adding '%s'/%p --> %d\n",
281 status = usb_gadget_disconnect(cdev->
gadget);
285 spin_unlock_irqrestore(&cdev->
lock, flags);
312 status = usb_gadget_connect(cdev->
gadget);
315 spin_unlock_irqrestore(&cdev->
lock, flags);
419 u8 type = w_value >> 8;
423 speed = gadget->
speed;
424 else if (gadget_is_dualspeed(gadget)) {
454 return config_buf(c, speed, cdev->
req->buf, type);
468 if (gadget_is_dualspeed(gadget)) {
545 if (cdev->
gadget->ops->get_config_params)
546 cdev->
gadget->ops->get_config_params(&dcd_config_params);
549 dcd_config_params.bU2DevExitLat =
581 DBG(cdev,
"reset config\n");
587 bitmap_zero(f->endpoints, 32);
598 unsigned power = gadget_is_otg(gadget) ? 8 : 100;
623 INFO(cdev,
"%s config #%d: %s\n",
625 number, c ? c->
label :
"unconfigured");
646 switch (gadget->
speed) {
670 result = f->
set_alt(f, tmp, 0);
672 DBG(cdev,
"interface %d (%s/%p) alt 0 --> %d\n",
673 tmp, f->
name, f, result);
681 "%s: interface %d (%s) requested delayed status\n",
682 __func__, tmp, f->
name);
684 DBG(cdev,
"delayed_status count %d\n",
692 usb_gadget_vbus_draw(gadget, power);
720 DBG(cdev,
"adding config #%u '%s'/%p\n",
722 config->
label, config);
742 status = bind(config);
744 while (!list_empty(&config->
functions)) {
751 DBG(cdev,
"unbind function '%s'/%p\n",
762 DBG(cdev,
"cfg %d/%p speeds:%s%s%s\n",
767 ? (gadget_is_dualspeed(cdev->
gadget)
777 DBG(cdev,
" interface %d = %s/%p\n",
789 DBG(cdev,
"added config '%s'/%u --> %d\n", config->
label,
797 while (!list_empty(&config->
functions)) {
804 DBG(cdev,
"unbind function '%s'/%p\n", f->
name, f);
811 DBG(cdev,
"unbind config '%s'/%p\n", config->
label, config);
833 if (cdev->
config == config)
836 spin_unlock_irqrestore(&cdev->
lock, flags);
838 remove_config(cdev, config);
858 for (tmp = buf; *tmp && tmp < &buf[126]; tmp++) {
859 if (*tmp == language)
868 static int lookup_string(
890 void *buf,
u16 language,
int id)
912 collect_langs(sp, s->
wData);
917 collect_langs(sp, s->
wData);
922 collect_langs(sp, s->
wData);
926 for (len = 0; len <= 126 && s->
wData[len]; len++)
940 composite_manufacturer;
942 str = iProduct ?: composite->
iProduct;
960 len = lookup_string(composite->
strings, buf, language,
id);
966 len = lookup_string(c->
strings, buf, language,
id);
973 len = lookup_string(f->
strings, buf, language,
id);
1027 for (; str->
s; ++
str) {
1060 if (
unlikely(n > 254 || (
unsigned)next + n > 254))
1073 "setup complete --> %d, %d/%d\n",
1092 u8 intf = w_index & 0xFF;
1103 req->
complete = composite_setup_complete;
1105 gadget->
ep0->driver_data =
cdev;
1113 switch (w_value >> 8) {
1116 cdev->
desc.bNumConfigurations =
1118 cdev->
desc.bMaxPacketSize0 =
1119 cdev->
gadget->ep0->maxpacket;
1120 if (gadget_is_superspeed(gadget)) {
1123 cdev->
desc.bMaxPacketSize0 = 9;
1129 value =
min(w_length, (
u16)
sizeof cdev->
desc);
1133 if (!gadget_is_dualspeed(gadget) ||
1137 value =
min_t(
int, w_length,
1141 if (!gadget_is_dualspeed(gadget) ||
1146 value = config_desc(cdev, w_value);
1148 value =
min(w_length, (
u16) value);
1151 value = get_string(cdev, req->
buf,
1152 w_index, w_value & 0xff);
1154 value =
min(w_length, (
u16) value);
1157 if (gadget_is_superspeed(gadget)) {
1158 value = bos_desc(cdev);
1159 value =
min(w_length, (
u16) value);
1169 if (gadget_is_otg(gadget)) {
1171 DBG(cdev,
"HNP available\n");
1173 DBG(cdev,
"HNP on another port\n");
1175 VDBG(cdev,
"HNP inactive\n");
1177 spin_lock(&cdev->
lock);
1178 value = set_config(cdev, ctrl, w_value);
1179 spin_unlock(&cdev->
lock);
1185 *(
u8 *)req->
buf = cdev->
config->bConfigurationValue;
1187 *(
u8 *)req->
buf = 0;
1188 value =
min(w_length, (
u16) 1);
1197 if (!cdev->
config || intf >= MAX_CONFIG_INTERFACES)
1204 value = f->
set_alt(f, w_index, w_value);
1207 "%s: interface %d (%s) requested delayed status\n",
1208 __func__, intf, f->
name);
1210 DBG(cdev,
"delayed_status count %d\n",
1217 if (!cdev->
config || intf >= MAX_CONFIG_INTERFACES)
1227 value =
min(w_length, (
u16) 1);
1238 if (!gadget_is_superspeed(gadget))
1243 put_unaligned_le16(0, req->
buf);
1244 if (!cdev->
config || intf >= MAX_CONFIG_INTERFACES)
1252 put_unaligned_le16(status & 0x0000ffff, req->
buf);
1261 if (!gadget_is_superspeed(gadget))
1267 if (!cdev->
config || intf >= MAX_CONFIG_INTERFACES)
1277 "func_suspend() returned error %d\n",
1287 "non-core control req%02x.%02x v%04x i%04x l%d\n",
1289 w_value, w_index, w_length);
1301 if (!cdev->
config || intf >= MAX_CONFIG_INTERFACES)
1307 endp = ((w_index & 0x80) >> 3) | (w_index & 0x0f);
1318 value = f->
setup(f, ctrl);
1324 value = c->
setup(c, ctrl);
1336 DBG(cdev,
"ep_queue --> %d\n", value);
1338 composite_setup_complete(gadget->
ep0, req);
1342 "%s: Delayed status not supported for w_length != 0",
1351 static void composite_disconnect(
struct usb_gadget *gadget)
1354 unsigned long flags;
1364 spin_unlock_irqrestore(&cdev->
lock, flags);
1373 struct usb_gadget *gadget = dev_to_usb_gadget(dev);
1393 while (!list_empty(&cdev->
configs)) {
1397 remove_config(cdev, c);
1404 usb_ep_free_request(gadget->
ep0, cdev->
req);
1408 set_gadget_data(gadget,
NULL);
1417 WARNING(cdev,
"failed to override string ID\n");
1425 static int composite_bind(
struct usb_gadget *gadget,
1437 set_gadget_data(gadget, cdev);
1438 INIT_LIST_HEAD(&cdev->
configs);
1445 if (!cdev->
req->buf)
1447 cdev->
req->complete = composite_setup_complete;
1448 gadget->
ep0->driver_data =
cdev;
1451 cdev->
driver = composite;
1459 usb_gadget_set_selfpowered(gadget);
1471 status = composite->
bind(cdev);
1492 if (iManufacturer || !cdev->
desc.iManufacturer) {
1494 !*composite_manufacturer)
1496 sizeof composite_manufacturer,
1498 init_utsname()->sysname,
1503 override_id(cdev, &cdev->
desc.iManufacturer);
1506 if (iProduct || (!cdev->
desc.iProduct && composite->
iProduct))
1508 override_id(cdev, &cdev->
desc.iProduct);
1510 if (iSerialNumber ||
1513 override_id(cdev, &cdev->
desc.iSerialNumber);
1517 WARNING(cdev,
"userspace failed to provide iSerialNumber\n");
1524 INFO(cdev,
"%s ready\n", composite->
name);
1528 composite_unbind(gadget);
1543 DBG(cdev,
"suspend\n");
1555 usb_gadget_vbus_draw(gadget, 2);
1568 DBG(cdev,
"resume\n");
1577 maxpower = cdev->
config->bMaxPower;
1579 usb_gadget_vbus_draw(gadget, maxpower ?
1580 (2 * maxpower) : CONFIG_USB_GADGET_VBUS_DRAW);
1589 .bind = composite_bind,
1590 .unbind = composite_unbind,
1592 .setup = composite_setup,
1593 .disconnect = composite_disconnect,
1595 .suspend = composite_suspend,
1596 .resume = composite_resume,
1624 if (!driver || !driver->
dev || composite || !driver->
bind)
1628 driver->
name =
"composite";
1648 if (composite != driver)
1667 unsigned long flags;
1669 DBG(cdev,
"%s\n", __func__);
1673 WARN(cdev,
"%s: Unexpected call\n", __func__);
1676 DBG(cdev,
"%s: Completing delayed status\n", __func__);
1680 DBG(cdev,
"ep_queue --> %d\n", value);
1682 composite_setup_complete(cdev->
gadget->ep0, req);
1686 spin_unlock_irqrestore(&cdev->
lock, flags);