1*7010f5b9SLukasz Majewski /* 2*7010f5b9SLukasz Majewski * composite.c - infrastructure for Composite USB Gadgets 3*7010f5b9SLukasz Majewski * 4*7010f5b9SLukasz Majewski * Copyright (C) 2006-2008 David Brownell 5*7010f5b9SLukasz Majewski * U-boot porting: Lukasz Majewski <l.majewski@samsung.com> 6*7010f5b9SLukasz Majewski * 7*7010f5b9SLukasz Majewski * This program is free software; you can redistribute it and/or modify 8*7010f5b9SLukasz Majewski * it under the terms of the GNU General Public License as published by 9*7010f5b9SLukasz Majewski * the Free Software Foundation; either version 2 of the License, or 10*7010f5b9SLukasz Majewski * (at your option) any later version. 11*7010f5b9SLukasz Majewski * 12*7010f5b9SLukasz Majewski * This program is distributed in the hope that it will be useful, 13*7010f5b9SLukasz Majewski * but WITHOUT ANY WARRANTY; without even the implied warranty of 14*7010f5b9SLukasz Majewski * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*7010f5b9SLukasz Majewski * GNU General Public License for more details. 16*7010f5b9SLukasz Majewski * 17*7010f5b9SLukasz Majewski * You should have received a copy of the GNU General Public License 18*7010f5b9SLukasz Majewski * along with this program; if not, write to the Free Software 19*7010f5b9SLukasz Majewski * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20*7010f5b9SLukasz Majewski */ 21*7010f5b9SLukasz Majewski #undef DEBUG 22*7010f5b9SLukasz Majewski 23*7010f5b9SLukasz Majewski #include <linux/bitops.h> 24*7010f5b9SLukasz Majewski #include <linux/usb/composite.h> 25*7010f5b9SLukasz Majewski 26*7010f5b9SLukasz Majewski #define USB_BUFSIZ 4096 27*7010f5b9SLukasz Majewski 28*7010f5b9SLukasz Majewski static struct usb_composite_driver *composite; 29*7010f5b9SLukasz Majewski 30*7010f5b9SLukasz Majewski /** 31*7010f5b9SLukasz Majewski * usb_add_function() - add a function to a configuration 32*7010f5b9SLukasz Majewski * @config: the configuration 33*7010f5b9SLukasz Majewski * @function: the function being added 34*7010f5b9SLukasz Majewski * Context: single threaded during gadget setup 35*7010f5b9SLukasz Majewski * 36*7010f5b9SLukasz Majewski * After initialization, each configuration must have one or more 37*7010f5b9SLukasz Majewski * functions added to it. Adding a function involves calling its @bind() 38*7010f5b9SLukasz Majewski * method to allocate resources such as interface and string identifiers 39*7010f5b9SLukasz Majewski * and endpoints. 40*7010f5b9SLukasz Majewski * 41*7010f5b9SLukasz Majewski * This function returns the value of the function's bind(), which is 42*7010f5b9SLukasz Majewski * zero for success else a negative errno value. 43*7010f5b9SLukasz Majewski */ 44*7010f5b9SLukasz Majewski int usb_add_function(struct usb_configuration *config, 45*7010f5b9SLukasz Majewski struct usb_function *function) 46*7010f5b9SLukasz Majewski { 47*7010f5b9SLukasz Majewski int value = -EINVAL; 48*7010f5b9SLukasz Majewski 49*7010f5b9SLukasz Majewski debug("adding '%s'/%p to config '%s'/%p\n", 50*7010f5b9SLukasz Majewski function->name, function, 51*7010f5b9SLukasz Majewski config->label, config); 52*7010f5b9SLukasz Majewski 53*7010f5b9SLukasz Majewski if (!function->set_alt || !function->disable) 54*7010f5b9SLukasz Majewski goto done; 55*7010f5b9SLukasz Majewski 56*7010f5b9SLukasz Majewski function->config = config; 57*7010f5b9SLukasz Majewski list_add_tail(&function->list, &config->functions); 58*7010f5b9SLukasz Majewski 59*7010f5b9SLukasz Majewski if (function->bind) { 60*7010f5b9SLukasz Majewski value = function->bind(config, function); 61*7010f5b9SLukasz Majewski if (value < 0) { 62*7010f5b9SLukasz Majewski list_del(&function->list); 63*7010f5b9SLukasz Majewski function->config = NULL; 64*7010f5b9SLukasz Majewski } 65*7010f5b9SLukasz Majewski } else 66*7010f5b9SLukasz Majewski value = 0; 67*7010f5b9SLukasz Majewski 68*7010f5b9SLukasz Majewski if (!config->fullspeed && function->descriptors) 69*7010f5b9SLukasz Majewski config->fullspeed = 1; 70*7010f5b9SLukasz Majewski if (!config->highspeed && function->hs_descriptors) 71*7010f5b9SLukasz Majewski config->highspeed = 1; 72*7010f5b9SLukasz Majewski 73*7010f5b9SLukasz Majewski done: 74*7010f5b9SLukasz Majewski if (value) 75*7010f5b9SLukasz Majewski debug("adding '%s'/%p --> %d\n", 76*7010f5b9SLukasz Majewski function->name, function, value); 77*7010f5b9SLukasz Majewski return value; 78*7010f5b9SLukasz Majewski } 79*7010f5b9SLukasz Majewski 80*7010f5b9SLukasz Majewski /** 81*7010f5b9SLukasz Majewski * usb_function_deactivate - prevent function and gadget enumeration 82*7010f5b9SLukasz Majewski * @function: the function that isn't yet ready to respond 83*7010f5b9SLukasz Majewski * 84*7010f5b9SLukasz Majewski * Blocks response of the gadget driver to host enumeration by 85*7010f5b9SLukasz Majewski * preventing the data line pullup from being activated. This is 86*7010f5b9SLukasz Majewski * normally called during @bind() processing to change from the 87*7010f5b9SLukasz Majewski * initial "ready to respond" state, or when a required resource 88*7010f5b9SLukasz Majewski * becomes available. 89*7010f5b9SLukasz Majewski * 90*7010f5b9SLukasz Majewski * For example, drivers that serve as a passthrough to a userspace 91*7010f5b9SLukasz Majewski * daemon can block enumeration unless that daemon (such as an OBEX, 92*7010f5b9SLukasz Majewski * MTP, or print server) is ready to handle host requests. 93*7010f5b9SLukasz Majewski * 94*7010f5b9SLukasz Majewski * Not all systems support software control of their USB peripheral 95*7010f5b9SLukasz Majewski * data pullups. 96*7010f5b9SLukasz Majewski * 97*7010f5b9SLukasz Majewski * Returns zero on success, else negative errno. 98*7010f5b9SLukasz Majewski */ 99*7010f5b9SLukasz Majewski int usb_function_deactivate(struct usb_function *function) 100*7010f5b9SLukasz Majewski { 101*7010f5b9SLukasz Majewski struct usb_composite_dev *cdev = function->config->cdev; 102*7010f5b9SLukasz Majewski int status = 0; 103*7010f5b9SLukasz Majewski 104*7010f5b9SLukasz Majewski if (cdev->deactivations == 0) 105*7010f5b9SLukasz Majewski status = usb_gadget_disconnect(cdev->gadget); 106*7010f5b9SLukasz Majewski if (status == 0) 107*7010f5b9SLukasz Majewski cdev->deactivations++; 108*7010f5b9SLukasz Majewski 109*7010f5b9SLukasz Majewski return status; 110*7010f5b9SLukasz Majewski } 111*7010f5b9SLukasz Majewski 112*7010f5b9SLukasz Majewski /** 113*7010f5b9SLukasz Majewski * usb_function_activate - allow function and gadget enumeration 114*7010f5b9SLukasz Majewski * @function: function on which usb_function_activate() was called 115*7010f5b9SLukasz Majewski * 116*7010f5b9SLukasz Majewski * Reverses effect of usb_function_deactivate(). If no more functions 117*7010f5b9SLukasz Majewski * are delaying their activation, the gadget driver will respond to 118*7010f5b9SLukasz Majewski * host enumeration procedures. 119*7010f5b9SLukasz Majewski * 120*7010f5b9SLukasz Majewski * Returns zero on success, else negative errno. 121*7010f5b9SLukasz Majewski */ 122*7010f5b9SLukasz Majewski int usb_function_activate(struct usb_function *function) 123*7010f5b9SLukasz Majewski { 124*7010f5b9SLukasz Majewski struct usb_composite_dev *cdev = function->config->cdev; 125*7010f5b9SLukasz Majewski int status = 0; 126*7010f5b9SLukasz Majewski 127*7010f5b9SLukasz Majewski if (cdev->deactivations == 0) 128*7010f5b9SLukasz Majewski status = -EINVAL; 129*7010f5b9SLukasz Majewski else { 130*7010f5b9SLukasz Majewski cdev->deactivations--; 131*7010f5b9SLukasz Majewski if (cdev->deactivations == 0) 132*7010f5b9SLukasz Majewski status = usb_gadget_connect(cdev->gadget); 133*7010f5b9SLukasz Majewski } 134*7010f5b9SLukasz Majewski 135*7010f5b9SLukasz Majewski return status; 136*7010f5b9SLukasz Majewski } 137*7010f5b9SLukasz Majewski 138*7010f5b9SLukasz Majewski /** 139*7010f5b9SLukasz Majewski * usb_interface_id() - allocate an unused interface ID 140*7010f5b9SLukasz Majewski * @config: configuration associated with the interface 141*7010f5b9SLukasz Majewski * @function: function handling the interface 142*7010f5b9SLukasz Majewski * Context: single threaded during gadget setup 143*7010f5b9SLukasz Majewski * 144*7010f5b9SLukasz Majewski * usb_interface_id() is called from usb_function.bind() callbacks to 145*7010f5b9SLukasz Majewski * allocate new interface IDs. The function driver will then store that 146*7010f5b9SLukasz Majewski * ID in interface, association, CDC union, and other descriptors. It 147*7010f5b9SLukasz Majewski * will also handle any control requests targetted at that interface, 148*7010f5b9SLukasz Majewski * particularly changing its altsetting via set_alt(). There may 149*7010f5b9SLukasz Majewski * also be class-specific or vendor-specific requests to handle. 150*7010f5b9SLukasz Majewski * 151*7010f5b9SLukasz Majewski * All interface identifier should be allocated using this routine, to 152*7010f5b9SLukasz Majewski * ensure that for example different functions don't wrongly assign 153*7010f5b9SLukasz Majewski * different meanings to the same identifier. Note that since interface 154*7010f5b9SLukasz Majewski * identifers are configuration-specific, functions used in more than 155*7010f5b9SLukasz Majewski * one configuration (or more than once in a given configuration) need 156*7010f5b9SLukasz Majewski * multiple versions of the relevant descriptors. 157*7010f5b9SLukasz Majewski * 158*7010f5b9SLukasz Majewski * Returns the interface ID which was allocated; or -ENODEV if no 159*7010f5b9SLukasz Majewski * more interface IDs can be allocated. 160*7010f5b9SLukasz Majewski */ 161*7010f5b9SLukasz Majewski int usb_interface_id(struct usb_configuration *config, 162*7010f5b9SLukasz Majewski struct usb_function *function) 163*7010f5b9SLukasz Majewski { 164*7010f5b9SLukasz Majewski unsigned char id = config->next_interface_id; 165*7010f5b9SLukasz Majewski 166*7010f5b9SLukasz Majewski if (id < MAX_CONFIG_INTERFACES) { 167*7010f5b9SLukasz Majewski config->interface[id] = function; 168*7010f5b9SLukasz Majewski config->next_interface_id = id + 1; 169*7010f5b9SLukasz Majewski return id; 170*7010f5b9SLukasz Majewski } 171*7010f5b9SLukasz Majewski return -ENODEV; 172*7010f5b9SLukasz Majewski } 173*7010f5b9SLukasz Majewski 174*7010f5b9SLukasz Majewski static int config_buf(struct usb_configuration *config, 175*7010f5b9SLukasz Majewski enum usb_device_speed speed, void *buf, u8 type) 176*7010f5b9SLukasz Majewski { 177*7010f5b9SLukasz Majewski int len = USB_BUFSIZ - USB_DT_CONFIG_SIZE; 178*7010f5b9SLukasz Majewski void *next = buf + USB_DT_CONFIG_SIZE; 179*7010f5b9SLukasz Majewski struct usb_descriptor_header **descriptors; 180*7010f5b9SLukasz Majewski struct usb_config_descriptor *c = buf; 181*7010f5b9SLukasz Majewski int status; 182*7010f5b9SLukasz Majewski struct usb_function *f; 183*7010f5b9SLukasz Majewski 184*7010f5b9SLukasz Majewski /* write the config descriptor */ 185*7010f5b9SLukasz Majewski c = buf; 186*7010f5b9SLukasz Majewski c->bLength = USB_DT_CONFIG_SIZE; 187*7010f5b9SLukasz Majewski c->bDescriptorType = type; 188*7010f5b9SLukasz Majewski 189*7010f5b9SLukasz Majewski c->bNumInterfaces = config->next_interface_id; 190*7010f5b9SLukasz Majewski c->bConfigurationValue = config->bConfigurationValue; 191*7010f5b9SLukasz Majewski c->iConfiguration = config->iConfiguration; 192*7010f5b9SLukasz Majewski c->bmAttributes = USB_CONFIG_ATT_ONE | config->bmAttributes; 193*7010f5b9SLukasz Majewski c->bMaxPower = config->bMaxPower ? : (CONFIG_USB_GADGET_VBUS_DRAW / 2); 194*7010f5b9SLukasz Majewski 195*7010f5b9SLukasz Majewski /* There may be e.g. OTG descriptors */ 196*7010f5b9SLukasz Majewski if (config->descriptors) { 197*7010f5b9SLukasz Majewski status = usb_descriptor_fillbuf(next, len, 198*7010f5b9SLukasz Majewski config->descriptors); 199*7010f5b9SLukasz Majewski if (status < 0) 200*7010f5b9SLukasz Majewski return status; 201*7010f5b9SLukasz Majewski len -= status; 202*7010f5b9SLukasz Majewski next += status; 203*7010f5b9SLukasz Majewski } 204*7010f5b9SLukasz Majewski 205*7010f5b9SLukasz Majewski /* add each function's descriptors */ 206*7010f5b9SLukasz Majewski list_for_each_entry(f, &config->functions, list) { 207*7010f5b9SLukasz Majewski if (speed == USB_SPEED_HIGH) 208*7010f5b9SLukasz Majewski descriptors = f->hs_descriptors; 209*7010f5b9SLukasz Majewski else 210*7010f5b9SLukasz Majewski descriptors = f->descriptors; 211*7010f5b9SLukasz Majewski if (!descriptors) 212*7010f5b9SLukasz Majewski continue; 213*7010f5b9SLukasz Majewski status = usb_descriptor_fillbuf(next, len, 214*7010f5b9SLukasz Majewski (const struct usb_descriptor_header **) descriptors); 215*7010f5b9SLukasz Majewski if (status < 0) 216*7010f5b9SLukasz Majewski return status; 217*7010f5b9SLukasz Majewski len -= status; 218*7010f5b9SLukasz Majewski next += status; 219*7010f5b9SLukasz Majewski } 220*7010f5b9SLukasz Majewski 221*7010f5b9SLukasz Majewski len = next - buf; 222*7010f5b9SLukasz Majewski c->wTotalLength = cpu_to_le16(len); 223*7010f5b9SLukasz Majewski return len; 224*7010f5b9SLukasz Majewski } 225*7010f5b9SLukasz Majewski 226*7010f5b9SLukasz Majewski static int config_desc(struct usb_composite_dev *cdev, unsigned w_value) 227*7010f5b9SLukasz Majewski { 228*7010f5b9SLukasz Majewski enum usb_device_speed speed = USB_SPEED_UNKNOWN; 229*7010f5b9SLukasz Majewski struct usb_gadget *gadget = cdev->gadget; 230*7010f5b9SLukasz Majewski u8 type = w_value >> 8; 231*7010f5b9SLukasz Majewski int hs = 0; 232*7010f5b9SLukasz Majewski struct usb_configuration *c; 233*7010f5b9SLukasz Majewski 234*7010f5b9SLukasz Majewski if (gadget_is_dualspeed(gadget)) { 235*7010f5b9SLukasz Majewski if (gadget->speed == USB_SPEED_HIGH) 236*7010f5b9SLukasz Majewski hs = 1; 237*7010f5b9SLukasz Majewski if (type == USB_DT_OTHER_SPEED_CONFIG) 238*7010f5b9SLukasz Majewski hs = !hs; 239*7010f5b9SLukasz Majewski if (hs) 240*7010f5b9SLukasz Majewski speed = USB_SPEED_HIGH; 241*7010f5b9SLukasz Majewski } 242*7010f5b9SLukasz Majewski 243*7010f5b9SLukasz Majewski w_value &= 0xff; 244*7010f5b9SLukasz Majewski list_for_each_entry(c, &cdev->configs, list) { 245*7010f5b9SLukasz Majewski if (speed == USB_SPEED_HIGH) { 246*7010f5b9SLukasz Majewski if (!c->highspeed) 247*7010f5b9SLukasz Majewski continue; 248*7010f5b9SLukasz Majewski } else { 249*7010f5b9SLukasz Majewski if (!c->fullspeed) 250*7010f5b9SLukasz Majewski continue; 251*7010f5b9SLukasz Majewski } 252*7010f5b9SLukasz Majewski if (w_value == 0) 253*7010f5b9SLukasz Majewski return config_buf(c, speed, cdev->req->buf, type); 254*7010f5b9SLukasz Majewski w_value--; 255*7010f5b9SLukasz Majewski } 256*7010f5b9SLukasz Majewski return -EINVAL; 257*7010f5b9SLukasz Majewski } 258*7010f5b9SLukasz Majewski 259*7010f5b9SLukasz Majewski static int count_configs(struct usb_composite_dev *cdev, unsigned type) 260*7010f5b9SLukasz Majewski { 261*7010f5b9SLukasz Majewski struct usb_gadget *gadget = cdev->gadget; 262*7010f5b9SLukasz Majewski unsigned count = 0; 263*7010f5b9SLukasz Majewski int hs = 0; 264*7010f5b9SLukasz Majewski struct usb_configuration *c; 265*7010f5b9SLukasz Majewski 266*7010f5b9SLukasz Majewski if (gadget_is_dualspeed(gadget)) { 267*7010f5b9SLukasz Majewski if (gadget->speed == USB_SPEED_HIGH) 268*7010f5b9SLukasz Majewski hs = 1; 269*7010f5b9SLukasz Majewski if (type == USB_DT_DEVICE_QUALIFIER) 270*7010f5b9SLukasz Majewski hs = !hs; 271*7010f5b9SLukasz Majewski } 272*7010f5b9SLukasz Majewski list_for_each_entry(c, &cdev->configs, list) { 273*7010f5b9SLukasz Majewski /* ignore configs that won't work at this speed */ 274*7010f5b9SLukasz Majewski if (hs) { 275*7010f5b9SLukasz Majewski if (!c->highspeed) 276*7010f5b9SLukasz Majewski continue; 277*7010f5b9SLukasz Majewski } else { 278*7010f5b9SLukasz Majewski if (!c->fullspeed) 279*7010f5b9SLukasz Majewski continue; 280*7010f5b9SLukasz Majewski } 281*7010f5b9SLukasz Majewski count++; 282*7010f5b9SLukasz Majewski } 283*7010f5b9SLukasz Majewski return count; 284*7010f5b9SLukasz Majewski } 285*7010f5b9SLukasz Majewski 286*7010f5b9SLukasz Majewski static void device_qual(struct usb_composite_dev *cdev) 287*7010f5b9SLukasz Majewski { 288*7010f5b9SLukasz Majewski struct usb_qualifier_descriptor *qual = cdev->req->buf; 289*7010f5b9SLukasz Majewski 290*7010f5b9SLukasz Majewski qual->bLength = sizeof(*qual); 291*7010f5b9SLukasz Majewski qual->bDescriptorType = USB_DT_DEVICE_QUALIFIER; 292*7010f5b9SLukasz Majewski /* POLICY: same bcdUSB and device type info at both speeds */ 293*7010f5b9SLukasz Majewski qual->bcdUSB = cdev->desc.bcdUSB; 294*7010f5b9SLukasz Majewski qual->bDeviceClass = cdev->desc.bDeviceClass; 295*7010f5b9SLukasz Majewski qual->bDeviceSubClass = cdev->desc.bDeviceSubClass; 296*7010f5b9SLukasz Majewski qual->bDeviceProtocol = cdev->desc.bDeviceProtocol; 297*7010f5b9SLukasz Majewski /* ASSUME same EP0 fifo size at both speeds */ 298*7010f5b9SLukasz Majewski qual->bMaxPacketSize0 = cdev->desc.bMaxPacketSize0; 299*7010f5b9SLukasz Majewski qual->bNumConfigurations = count_configs(cdev, USB_DT_DEVICE_QUALIFIER); 300*7010f5b9SLukasz Majewski qual->bRESERVED = 0; 301*7010f5b9SLukasz Majewski } 302*7010f5b9SLukasz Majewski 303*7010f5b9SLukasz Majewski static void reset_config(struct usb_composite_dev *cdev) 304*7010f5b9SLukasz Majewski { 305*7010f5b9SLukasz Majewski struct usb_function *f; 306*7010f5b9SLukasz Majewski 307*7010f5b9SLukasz Majewski debug("%s:\n", __func__); 308*7010f5b9SLukasz Majewski 309*7010f5b9SLukasz Majewski list_for_each_entry(f, &cdev->config->functions, list) { 310*7010f5b9SLukasz Majewski if (f->disable) 311*7010f5b9SLukasz Majewski f->disable(f); 312*7010f5b9SLukasz Majewski 313*7010f5b9SLukasz Majewski bitmap_zero(f->endpoints, 32); 314*7010f5b9SLukasz Majewski } 315*7010f5b9SLukasz Majewski cdev->config = NULL; 316*7010f5b9SLukasz Majewski } 317*7010f5b9SLukasz Majewski 318*7010f5b9SLukasz Majewski static int set_config(struct usb_composite_dev *cdev, 319*7010f5b9SLukasz Majewski const struct usb_ctrlrequest *ctrl, unsigned number) 320*7010f5b9SLukasz Majewski { 321*7010f5b9SLukasz Majewski struct usb_gadget *gadget = cdev->gadget; 322*7010f5b9SLukasz Majewski unsigned power = gadget_is_otg(gadget) ? 8 : 100; 323*7010f5b9SLukasz Majewski struct usb_descriptor_header **descriptors; 324*7010f5b9SLukasz Majewski int result = -EINVAL; 325*7010f5b9SLukasz Majewski struct usb_endpoint_descriptor *ep; 326*7010f5b9SLukasz Majewski struct usb_configuration *c = NULL; 327*7010f5b9SLukasz Majewski int addr; 328*7010f5b9SLukasz Majewski int tmp; 329*7010f5b9SLukasz Majewski struct usb_function *f; 330*7010f5b9SLukasz Majewski 331*7010f5b9SLukasz Majewski if (cdev->config) 332*7010f5b9SLukasz Majewski reset_config(cdev); 333*7010f5b9SLukasz Majewski 334*7010f5b9SLukasz Majewski if (number) { 335*7010f5b9SLukasz Majewski list_for_each_entry(c, &cdev->configs, list) { 336*7010f5b9SLukasz Majewski if (c->bConfigurationValue == number) { 337*7010f5b9SLukasz Majewski result = 0; 338*7010f5b9SLukasz Majewski break; 339*7010f5b9SLukasz Majewski } 340*7010f5b9SLukasz Majewski } 341*7010f5b9SLukasz Majewski if (result < 0) 342*7010f5b9SLukasz Majewski goto done; 343*7010f5b9SLukasz Majewski } else 344*7010f5b9SLukasz Majewski result = 0; 345*7010f5b9SLukasz Majewski 346*7010f5b9SLukasz Majewski debug("%s: %s speed config #%d: %s\n", __func__, 347*7010f5b9SLukasz Majewski ({ char *speed; 348*7010f5b9SLukasz Majewski switch (gadget->speed) { 349*7010f5b9SLukasz Majewski case USB_SPEED_LOW: 350*7010f5b9SLukasz Majewski speed = "low"; 351*7010f5b9SLukasz Majewski break; 352*7010f5b9SLukasz Majewski case USB_SPEED_FULL: 353*7010f5b9SLukasz Majewski speed = "full"; 354*7010f5b9SLukasz Majewski break; 355*7010f5b9SLukasz Majewski case USB_SPEED_HIGH: 356*7010f5b9SLukasz Majewski speed = "high"; 357*7010f5b9SLukasz Majewski break; 358*7010f5b9SLukasz Majewski default: 359*7010f5b9SLukasz Majewski speed = "?"; 360*7010f5b9SLukasz Majewski break; 361*7010f5b9SLukasz Majewski }; 362*7010f5b9SLukasz Majewski speed; 363*7010f5b9SLukasz Majewski }), number, c ? c->label : "unconfigured"); 364*7010f5b9SLukasz Majewski 365*7010f5b9SLukasz Majewski if (!c) 366*7010f5b9SLukasz Majewski goto done; 367*7010f5b9SLukasz Majewski 368*7010f5b9SLukasz Majewski cdev->config = c; 369*7010f5b9SLukasz Majewski 370*7010f5b9SLukasz Majewski /* Initialize all interfaces by setting them to altsetting zero. */ 371*7010f5b9SLukasz Majewski for (tmp = 0; tmp < MAX_CONFIG_INTERFACES; tmp++) { 372*7010f5b9SLukasz Majewski f = c->interface[tmp]; 373*7010f5b9SLukasz Majewski if (!f) 374*7010f5b9SLukasz Majewski break; 375*7010f5b9SLukasz Majewski 376*7010f5b9SLukasz Majewski /* 377*7010f5b9SLukasz Majewski * Record which endpoints are used by the function. This is used 378*7010f5b9SLukasz Majewski * to dispatch control requests targeted at that endpoint to the 379*7010f5b9SLukasz Majewski * function's setup callback instead of the current 380*7010f5b9SLukasz Majewski * configuration's setup callback. 381*7010f5b9SLukasz Majewski */ 382*7010f5b9SLukasz Majewski if (gadget->speed == USB_SPEED_HIGH) 383*7010f5b9SLukasz Majewski descriptors = f->hs_descriptors; 384*7010f5b9SLukasz Majewski else 385*7010f5b9SLukasz Majewski descriptors = f->descriptors; 386*7010f5b9SLukasz Majewski 387*7010f5b9SLukasz Majewski for (; *descriptors; ++descriptors) { 388*7010f5b9SLukasz Majewski if ((*descriptors)->bDescriptorType != USB_DT_ENDPOINT) 389*7010f5b9SLukasz Majewski continue; 390*7010f5b9SLukasz Majewski 391*7010f5b9SLukasz Majewski ep = (struct usb_endpoint_descriptor *)*descriptors; 392*7010f5b9SLukasz Majewski addr = ((ep->bEndpointAddress & 0x80) >> 3) 393*7010f5b9SLukasz Majewski | (ep->bEndpointAddress & 0x0f); 394*7010f5b9SLukasz Majewski __set_bit(addr, f->endpoints); 395*7010f5b9SLukasz Majewski } 396*7010f5b9SLukasz Majewski 397*7010f5b9SLukasz Majewski result = f->set_alt(f, tmp, 0); 398*7010f5b9SLukasz Majewski if (result < 0) { 399*7010f5b9SLukasz Majewski debug("interface %d (%s/%p) alt 0 --> %d\n", 400*7010f5b9SLukasz Majewski tmp, f->name, f, result); 401*7010f5b9SLukasz Majewski 402*7010f5b9SLukasz Majewski reset_config(cdev); 403*7010f5b9SLukasz Majewski goto done; 404*7010f5b9SLukasz Majewski } 405*7010f5b9SLukasz Majewski } 406*7010f5b9SLukasz Majewski 407*7010f5b9SLukasz Majewski /* when we return, be sure our power usage is valid */ 408*7010f5b9SLukasz Majewski power = c->bMaxPower ? (2 * c->bMaxPower) : CONFIG_USB_GADGET_VBUS_DRAW; 409*7010f5b9SLukasz Majewski done: 410*7010f5b9SLukasz Majewski usb_gadget_vbus_draw(gadget, power); 411*7010f5b9SLukasz Majewski return result; 412*7010f5b9SLukasz Majewski } 413*7010f5b9SLukasz Majewski 414*7010f5b9SLukasz Majewski /** 415*7010f5b9SLukasz Majewski * usb_add_config() - add a configuration to a device. 416*7010f5b9SLukasz Majewski * @cdev: wraps the USB gadget 417*7010f5b9SLukasz Majewski * @config: the configuration, with bConfigurationValue assigned 418*7010f5b9SLukasz Majewski * Context: single threaded during gadget setup 419*7010f5b9SLukasz Majewski * 420*7010f5b9SLukasz Majewski * One of the main tasks of a composite driver's bind() routine is to 421*7010f5b9SLukasz Majewski * add each of the configurations it supports, using this routine. 422*7010f5b9SLukasz Majewski * 423*7010f5b9SLukasz Majewski * This function returns the value of the configuration's bind(), which 424*7010f5b9SLukasz Majewski * is zero for success else a negative errno value. Binding configurations 425*7010f5b9SLukasz Majewski * assigns global resources including string IDs, and per-configuration 426*7010f5b9SLukasz Majewski * resources such as interface IDs and endpoints. 427*7010f5b9SLukasz Majewski */ 428*7010f5b9SLukasz Majewski int usb_add_config(struct usb_composite_dev *cdev, 429*7010f5b9SLukasz Majewski struct usb_configuration *config) 430*7010f5b9SLukasz Majewski { 431*7010f5b9SLukasz Majewski int status = -EINVAL; 432*7010f5b9SLukasz Majewski struct usb_configuration *c; 433*7010f5b9SLukasz Majewski struct usb_function *f; 434*7010f5b9SLukasz Majewski unsigned int i; 435*7010f5b9SLukasz Majewski 436*7010f5b9SLukasz Majewski debug("%s: adding config #%u '%s'/%p\n", __func__, 437*7010f5b9SLukasz Majewski config->bConfigurationValue, 438*7010f5b9SLukasz Majewski config->label, config); 439*7010f5b9SLukasz Majewski 440*7010f5b9SLukasz Majewski if (!config->bConfigurationValue || !config->bind) 441*7010f5b9SLukasz Majewski goto done; 442*7010f5b9SLukasz Majewski 443*7010f5b9SLukasz Majewski /* Prevent duplicate configuration identifiers */ 444*7010f5b9SLukasz Majewski list_for_each_entry(c, &cdev->configs, list) { 445*7010f5b9SLukasz Majewski if (c->bConfigurationValue == config->bConfigurationValue) { 446*7010f5b9SLukasz Majewski status = -EBUSY; 447*7010f5b9SLukasz Majewski goto done; 448*7010f5b9SLukasz Majewski } 449*7010f5b9SLukasz Majewski } 450*7010f5b9SLukasz Majewski 451*7010f5b9SLukasz Majewski config->cdev = cdev; 452*7010f5b9SLukasz Majewski list_add_tail(&config->list, &cdev->configs); 453*7010f5b9SLukasz Majewski 454*7010f5b9SLukasz Majewski INIT_LIST_HEAD(&config->functions); 455*7010f5b9SLukasz Majewski config->next_interface_id = 0; 456*7010f5b9SLukasz Majewski 457*7010f5b9SLukasz Majewski status = config->bind(config); 458*7010f5b9SLukasz Majewski if (status < 0) { 459*7010f5b9SLukasz Majewski list_del(&config->list); 460*7010f5b9SLukasz Majewski config->cdev = NULL; 461*7010f5b9SLukasz Majewski } else { 462*7010f5b9SLukasz Majewski debug("cfg %d/%p speeds:%s%s\n", 463*7010f5b9SLukasz Majewski config->bConfigurationValue, config, 464*7010f5b9SLukasz Majewski config->highspeed ? " high" : "", 465*7010f5b9SLukasz Majewski config->fullspeed 466*7010f5b9SLukasz Majewski ? (gadget_is_dualspeed(cdev->gadget) 467*7010f5b9SLukasz Majewski ? " full" 468*7010f5b9SLukasz Majewski : " full/low") 469*7010f5b9SLukasz Majewski : ""); 470*7010f5b9SLukasz Majewski 471*7010f5b9SLukasz Majewski for (i = 0; i < MAX_CONFIG_INTERFACES; i++) { 472*7010f5b9SLukasz Majewski f = config->interface[i]; 473*7010f5b9SLukasz Majewski if (!f) 474*7010f5b9SLukasz Majewski continue; 475*7010f5b9SLukasz Majewski debug("%s: interface %d = %s/%p\n", 476*7010f5b9SLukasz Majewski __func__, i, f->name, f); 477*7010f5b9SLukasz Majewski } 478*7010f5b9SLukasz Majewski } 479*7010f5b9SLukasz Majewski 480*7010f5b9SLukasz Majewski usb_ep_autoconfig_reset(cdev->gadget); 481*7010f5b9SLukasz Majewski 482*7010f5b9SLukasz Majewski done: 483*7010f5b9SLukasz Majewski if (status) 484*7010f5b9SLukasz Majewski debug("added config '%s'/%u --> %d\n", config->label, 485*7010f5b9SLukasz Majewski config->bConfigurationValue, status); 486*7010f5b9SLukasz Majewski return status; 487*7010f5b9SLukasz Majewski } 488*7010f5b9SLukasz Majewski 489*7010f5b9SLukasz Majewski /* 490*7010f5b9SLukasz Majewski * We support strings in multiple languages ... string descriptor zero 491*7010f5b9SLukasz Majewski * says which languages are supported. The typical case will be that 492*7010f5b9SLukasz Majewski * only one language (probably English) is used, with I18N handled on 493*7010f5b9SLukasz Majewski * the host side. 494*7010f5b9SLukasz Majewski */ 495*7010f5b9SLukasz Majewski 496*7010f5b9SLukasz Majewski static void collect_langs(struct usb_gadget_strings **sp, __le16 *buf) 497*7010f5b9SLukasz Majewski { 498*7010f5b9SLukasz Majewski const struct usb_gadget_strings *s; 499*7010f5b9SLukasz Majewski u16 language; 500*7010f5b9SLukasz Majewski __le16 *tmp; 501*7010f5b9SLukasz Majewski 502*7010f5b9SLukasz Majewski while (*sp) { 503*7010f5b9SLukasz Majewski s = *sp; 504*7010f5b9SLukasz Majewski language = cpu_to_le16(s->language); 505*7010f5b9SLukasz Majewski for (tmp = buf; *tmp && tmp < &buf[126]; tmp++) { 506*7010f5b9SLukasz Majewski if (*tmp == language) 507*7010f5b9SLukasz Majewski goto repeat; 508*7010f5b9SLukasz Majewski } 509*7010f5b9SLukasz Majewski *tmp++ = language; 510*7010f5b9SLukasz Majewski repeat: 511*7010f5b9SLukasz Majewski sp++; 512*7010f5b9SLukasz Majewski } 513*7010f5b9SLukasz Majewski } 514*7010f5b9SLukasz Majewski 515*7010f5b9SLukasz Majewski static int lookup_string( 516*7010f5b9SLukasz Majewski struct usb_gadget_strings **sp, 517*7010f5b9SLukasz Majewski void *buf, 518*7010f5b9SLukasz Majewski u16 language, 519*7010f5b9SLukasz Majewski int id 520*7010f5b9SLukasz Majewski ) 521*7010f5b9SLukasz Majewski { 522*7010f5b9SLukasz Majewski int value; 523*7010f5b9SLukasz Majewski struct usb_gadget_strings *s; 524*7010f5b9SLukasz Majewski 525*7010f5b9SLukasz Majewski while (*sp) { 526*7010f5b9SLukasz Majewski s = *sp++; 527*7010f5b9SLukasz Majewski if (s->language != language) 528*7010f5b9SLukasz Majewski continue; 529*7010f5b9SLukasz Majewski value = usb_gadget_get_string(s, id, buf); 530*7010f5b9SLukasz Majewski if (value > 0) 531*7010f5b9SLukasz Majewski return value; 532*7010f5b9SLukasz Majewski } 533*7010f5b9SLukasz Majewski return -EINVAL; 534*7010f5b9SLukasz Majewski } 535*7010f5b9SLukasz Majewski 536*7010f5b9SLukasz Majewski static int get_string(struct usb_composite_dev *cdev, 537*7010f5b9SLukasz Majewski void *buf, u16 language, int id) 538*7010f5b9SLukasz Majewski { 539*7010f5b9SLukasz Majewski struct usb_string_descriptor *s = buf; 540*7010f5b9SLukasz Majewski struct usb_gadget_strings **sp; 541*7010f5b9SLukasz Majewski int len; 542*7010f5b9SLukasz Majewski struct usb_configuration *c; 543*7010f5b9SLukasz Majewski struct usb_function *f; 544*7010f5b9SLukasz Majewski 545*7010f5b9SLukasz Majewski /* 546*7010f5b9SLukasz Majewski * Yes, not only is USB's I18N support probably more than most 547*7010f5b9SLukasz Majewski * folk will ever care about ... also, it's all supported here. 548*7010f5b9SLukasz Majewski * (Except for UTF8 support for Unicode's "Astral Planes".) 549*7010f5b9SLukasz Majewski */ 550*7010f5b9SLukasz Majewski 551*7010f5b9SLukasz Majewski /* 0 == report all available language codes */ 552*7010f5b9SLukasz Majewski if (id == 0) { 553*7010f5b9SLukasz Majewski memset(s, 0, 256); 554*7010f5b9SLukasz Majewski s->bDescriptorType = USB_DT_STRING; 555*7010f5b9SLukasz Majewski 556*7010f5b9SLukasz Majewski sp = composite->strings; 557*7010f5b9SLukasz Majewski if (sp) 558*7010f5b9SLukasz Majewski collect_langs(sp, s->wData); 559*7010f5b9SLukasz Majewski 560*7010f5b9SLukasz Majewski list_for_each_entry(c, &cdev->configs, list) { 561*7010f5b9SLukasz Majewski sp = c->strings; 562*7010f5b9SLukasz Majewski if (sp) 563*7010f5b9SLukasz Majewski collect_langs(sp, s->wData); 564*7010f5b9SLukasz Majewski 565*7010f5b9SLukasz Majewski list_for_each_entry(f, &c->functions, list) { 566*7010f5b9SLukasz Majewski sp = f->strings; 567*7010f5b9SLukasz Majewski if (sp) 568*7010f5b9SLukasz Majewski collect_langs(sp, s->wData); 569*7010f5b9SLukasz Majewski } 570*7010f5b9SLukasz Majewski } 571*7010f5b9SLukasz Majewski 572*7010f5b9SLukasz Majewski for (len = 0; len <= 126 && s->wData[len]; len++) 573*7010f5b9SLukasz Majewski continue; 574*7010f5b9SLukasz Majewski if (!len) 575*7010f5b9SLukasz Majewski return -EINVAL; 576*7010f5b9SLukasz Majewski 577*7010f5b9SLukasz Majewski s->bLength = 2 * (len + 1); 578*7010f5b9SLukasz Majewski return s->bLength; 579*7010f5b9SLukasz Majewski } 580*7010f5b9SLukasz Majewski 581*7010f5b9SLukasz Majewski /* 582*7010f5b9SLukasz Majewski * Otherwise, look up and return a specified string. String IDs 583*7010f5b9SLukasz Majewski * are device-scoped, so we look up each string table we're told 584*7010f5b9SLukasz Majewski * about. These lookups are infrequent; simpler-is-better here. 585*7010f5b9SLukasz Majewski */ 586*7010f5b9SLukasz Majewski if (composite->strings) { 587*7010f5b9SLukasz Majewski len = lookup_string(composite->strings, buf, language, id); 588*7010f5b9SLukasz Majewski if (len > 0) 589*7010f5b9SLukasz Majewski return len; 590*7010f5b9SLukasz Majewski } 591*7010f5b9SLukasz Majewski list_for_each_entry(c, &cdev->configs, list) { 592*7010f5b9SLukasz Majewski if (c->strings) { 593*7010f5b9SLukasz Majewski len = lookup_string(c->strings, buf, language, id); 594*7010f5b9SLukasz Majewski if (len > 0) 595*7010f5b9SLukasz Majewski return len; 596*7010f5b9SLukasz Majewski } 597*7010f5b9SLukasz Majewski list_for_each_entry(f, &c->functions, list) { 598*7010f5b9SLukasz Majewski if (!f->strings) 599*7010f5b9SLukasz Majewski continue; 600*7010f5b9SLukasz Majewski len = lookup_string(f->strings, buf, language, id); 601*7010f5b9SLukasz Majewski if (len > 0) 602*7010f5b9SLukasz Majewski return len; 603*7010f5b9SLukasz Majewski } 604*7010f5b9SLukasz Majewski } 605*7010f5b9SLukasz Majewski return -EINVAL; 606*7010f5b9SLukasz Majewski } 607*7010f5b9SLukasz Majewski 608*7010f5b9SLukasz Majewski /** 609*7010f5b9SLukasz Majewski * usb_string_id() - allocate an unused string ID 610*7010f5b9SLukasz Majewski * @cdev: the device whose string descriptor IDs are being allocated 611*7010f5b9SLukasz Majewski * Context: single threaded during gadget setup 612*7010f5b9SLukasz Majewski * 613*7010f5b9SLukasz Majewski * @usb_string_id() is called from bind() callbacks to allocate 614*7010f5b9SLukasz Majewski * string IDs. Drivers for functions, configurations, or gadgets will 615*7010f5b9SLukasz Majewski * then store that ID in the appropriate descriptors and string table. 616*7010f5b9SLukasz Majewski * 617*7010f5b9SLukasz Majewski * All string identifier should be allocated using this, 618*7010f5b9SLukasz Majewski * @usb_string_ids_tab() or @usb_string_ids_n() routine, to ensure 619*7010f5b9SLukasz Majewski * that for example different functions don't wrongly assign different 620*7010f5b9SLukasz Majewski * meanings to the same identifier. 621*7010f5b9SLukasz Majewski */ 622*7010f5b9SLukasz Majewski int usb_string_id(struct usb_composite_dev *cdev) 623*7010f5b9SLukasz Majewski { 624*7010f5b9SLukasz Majewski if (cdev->next_string_id < 254) { 625*7010f5b9SLukasz Majewski /* 626*7010f5b9SLukasz Majewski * string id 0 is reserved by USB spec for list of 627*7010f5b9SLukasz Majewski * supported languages 628*7010f5b9SLukasz Majewski * 255 reserved as well? -- mina86 629*7010f5b9SLukasz Majewski */ 630*7010f5b9SLukasz Majewski cdev->next_string_id++; 631*7010f5b9SLukasz Majewski return cdev->next_string_id; 632*7010f5b9SLukasz Majewski } 633*7010f5b9SLukasz Majewski return -ENODEV; 634*7010f5b9SLukasz Majewski } 635*7010f5b9SLukasz Majewski 636*7010f5b9SLukasz Majewski /** 637*7010f5b9SLukasz Majewski * usb_string_ids() - allocate unused string IDs in batch 638*7010f5b9SLukasz Majewski * @cdev: the device whose string descriptor IDs are being allocated 639*7010f5b9SLukasz Majewski * @str: an array of usb_string objects to assign numbers to 640*7010f5b9SLukasz Majewski * Context: single threaded during gadget setup 641*7010f5b9SLukasz Majewski * 642*7010f5b9SLukasz Majewski * @usb_string_ids() is called from bind() callbacks to allocate 643*7010f5b9SLukasz Majewski * string IDs. Drivers for functions, configurations, or gadgets will 644*7010f5b9SLukasz Majewski * then copy IDs from the string table to the appropriate descriptors 645*7010f5b9SLukasz Majewski * and string table for other languages. 646*7010f5b9SLukasz Majewski * 647*7010f5b9SLukasz Majewski * All string identifier should be allocated using this, 648*7010f5b9SLukasz Majewski * @usb_string_id() or @usb_string_ids_n() routine, to ensure that for 649*7010f5b9SLukasz Majewski * example different functions don't wrongly assign different meanings 650*7010f5b9SLukasz Majewski * to the same identifier. 651*7010f5b9SLukasz Majewski */ 652*7010f5b9SLukasz Majewski int usb_string_ids_tab(struct usb_composite_dev *cdev, struct usb_string *str) 653*7010f5b9SLukasz Majewski { 654*7010f5b9SLukasz Majewski u8 next = cdev->next_string_id; 655*7010f5b9SLukasz Majewski 656*7010f5b9SLukasz Majewski for (; str->s; ++str) { 657*7010f5b9SLukasz Majewski if (next >= 254) 658*7010f5b9SLukasz Majewski return -ENODEV; 659*7010f5b9SLukasz Majewski str->id = ++next; 660*7010f5b9SLukasz Majewski } 661*7010f5b9SLukasz Majewski 662*7010f5b9SLukasz Majewski cdev->next_string_id = next; 663*7010f5b9SLukasz Majewski 664*7010f5b9SLukasz Majewski return 0; 665*7010f5b9SLukasz Majewski } 666*7010f5b9SLukasz Majewski 667*7010f5b9SLukasz Majewski /** 668*7010f5b9SLukasz Majewski * usb_string_ids_n() - allocate unused string IDs in batch 669*7010f5b9SLukasz Majewski * @c: the device whose string descriptor IDs are being allocated 670*7010f5b9SLukasz Majewski * @n: number of string IDs to allocate 671*7010f5b9SLukasz Majewski * Context: single threaded during gadget setup 672*7010f5b9SLukasz Majewski * 673*7010f5b9SLukasz Majewski * Returns the first requested ID. This ID and next @n-1 IDs are now 674*7010f5b9SLukasz Majewski * valid IDs. At least provided that @n is non-zero because if it 675*7010f5b9SLukasz Majewski * is, returns last requested ID which is now very useful information. 676*7010f5b9SLukasz Majewski * 677*7010f5b9SLukasz Majewski * @usb_string_ids_n() is called from bind() callbacks to allocate 678*7010f5b9SLukasz Majewski * string IDs. Drivers for functions, configurations, or gadgets will 679*7010f5b9SLukasz Majewski * then store that ID in the appropriate descriptors and string table. 680*7010f5b9SLukasz Majewski * 681*7010f5b9SLukasz Majewski * All string identifier should be allocated using this, 682*7010f5b9SLukasz Majewski * @usb_string_id() or @usb_string_ids_n() routine, to ensure that for 683*7010f5b9SLukasz Majewski * example different functions don't wrongly assign different meanings 684*7010f5b9SLukasz Majewski * to the same identifier. 685*7010f5b9SLukasz Majewski */ 686*7010f5b9SLukasz Majewski int usb_string_ids_n(struct usb_composite_dev *c, unsigned n) 687*7010f5b9SLukasz Majewski { 688*7010f5b9SLukasz Majewski u8 next = c->next_string_id; 689*7010f5b9SLukasz Majewski 690*7010f5b9SLukasz Majewski if (n > 254 || next + n > 254) 691*7010f5b9SLukasz Majewski return -ENODEV; 692*7010f5b9SLukasz Majewski 693*7010f5b9SLukasz Majewski c->next_string_id += n; 694*7010f5b9SLukasz Majewski return next + 1; 695*7010f5b9SLukasz Majewski } 696*7010f5b9SLukasz Majewski 697*7010f5b9SLukasz Majewski static void composite_setup_complete(struct usb_ep *ep, struct usb_request *req) 698*7010f5b9SLukasz Majewski { 699*7010f5b9SLukasz Majewski if (req->status || req->actual != req->length) 700*7010f5b9SLukasz Majewski debug("%s: setup complete --> %d, %d/%d\n", __func__, 701*7010f5b9SLukasz Majewski req->status, req->actual, req->length); 702*7010f5b9SLukasz Majewski } 703*7010f5b9SLukasz Majewski 704*7010f5b9SLukasz Majewski /* 705*7010f5b9SLukasz Majewski * The setup() callback implements all the ep0 functionality that's 706*7010f5b9SLukasz Majewski * not handled lower down, in hardware or the hardware driver(like 707*7010f5b9SLukasz Majewski * device and endpoint feature flags, and their status). It's all 708*7010f5b9SLukasz Majewski * housekeeping for the gadget function we're implementing. Most of 709*7010f5b9SLukasz Majewski * the work is in config and function specific setup. 710*7010f5b9SLukasz Majewski */ 711*7010f5b9SLukasz Majewski static int 712*7010f5b9SLukasz Majewski composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) 713*7010f5b9SLukasz Majewski { 714*7010f5b9SLukasz Majewski u16 w_length = le16_to_cpu(ctrl->wLength); 715*7010f5b9SLukasz Majewski u16 w_index = le16_to_cpu(ctrl->wIndex); 716*7010f5b9SLukasz Majewski u16 w_value = le16_to_cpu(ctrl->wValue); 717*7010f5b9SLukasz Majewski struct usb_composite_dev *cdev = get_gadget_data(gadget); 718*7010f5b9SLukasz Majewski u8 intf = w_index & 0xFF; 719*7010f5b9SLukasz Majewski int value = -EOPNOTSUPP; 720*7010f5b9SLukasz Majewski struct usb_request *req = cdev->req; 721*7010f5b9SLukasz Majewski struct usb_function *f = NULL; 722*7010f5b9SLukasz Majewski int standard; 723*7010f5b9SLukasz Majewski u8 endp; 724*7010f5b9SLukasz Majewski struct usb_configuration *c; 725*7010f5b9SLukasz Majewski 726*7010f5b9SLukasz Majewski /* 727*7010f5b9SLukasz Majewski * partial re-init of the response message; the function or the 728*7010f5b9SLukasz Majewski * gadget might need to intercept e.g. a control-OUT completion 729*7010f5b9SLukasz Majewski * when we delegate to it. 730*7010f5b9SLukasz Majewski */ 731*7010f5b9SLukasz Majewski req->zero = 0; 732*7010f5b9SLukasz Majewski req->complete = composite_setup_complete; 733*7010f5b9SLukasz Majewski req->length = USB_BUFSIZ; 734*7010f5b9SLukasz Majewski gadget->ep0->driver_data = cdev; 735*7010f5b9SLukasz Majewski standard = (ctrl->bRequestType & USB_TYPE_MASK) 736*7010f5b9SLukasz Majewski == USB_TYPE_STANDARD; 737*7010f5b9SLukasz Majewski if (!standard) 738*7010f5b9SLukasz Majewski goto unknown; 739*7010f5b9SLukasz Majewski 740*7010f5b9SLukasz Majewski switch (ctrl->bRequest) { 741*7010f5b9SLukasz Majewski 742*7010f5b9SLukasz Majewski /* we handle all standard USB descriptors */ 743*7010f5b9SLukasz Majewski case USB_REQ_GET_DESCRIPTOR: 744*7010f5b9SLukasz Majewski if (ctrl->bRequestType != USB_DIR_IN) 745*7010f5b9SLukasz Majewski goto unknown; 746*7010f5b9SLukasz Majewski switch (w_value >> 8) { 747*7010f5b9SLukasz Majewski 748*7010f5b9SLukasz Majewski case USB_DT_DEVICE: 749*7010f5b9SLukasz Majewski cdev->desc.bNumConfigurations = 750*7010f5b9SLukasz Majewski count_configs(cdev, USB_DT_DEVICE); 751*7010f5b9SLukasz Majewski value = min(w_length, (u16) sizeof cdev->desc); 752*7010f5b9SLukasz Majewski memcpy(req->buf, &cdev->desc, value); 753*7010f5b9SLukasz Majewski break; 754*7010f5b9SLukasz Majewski case USB_DT_DEVICE_QUALIFIER: 755*7010f5b9SLukasz Majewski if (!gadget_is_dualspeed(gadget)) 756*7010f5b9SLukasz Majewski break; 757*7010f5b9SLukasz Majewski device_qual(cdev); 758*7010f5b9SLukasz Majewski value = min(w_length, 759*7010f5b9SLukasz Majewski sizeof(struct usb_qualifier_descriptor)); 760*7010f5b9SLukasz Majewski break; 761*7010f5b9SLukasz Majewski case USB_DT_OTHER_SPEED_CONFIG: 762*7010f5b9SLukasz Majewski if (!gadget_is_dualspeed(gadget)) 763*7010f5b9SLukasz Majewski break; 764*7010f5b9SLukasz Majewski 765*7010f5b9SLukasz Majewski case USB_DT_CONFIG: 766*7010f5b9SLukasz Majewski value = config_desc(cdev, w_value); 767*7010f5b9SLukasz Majewski if (value >= 0) 768*7010f5b9SLukasz Majewski value = min(w_length, (u16) value); 769*7010f5b9SLukasz Majewski break; 770*7010f5b9SLukasz Majewski case USB_DT_STRING: 771*7010f5b9SLukasz Majewski value = get_string(cdev, req->buf, 772*7010f5b9SLukasz Majewski w_index, w_value & 0xff); 773*7010f5b9SLukasz Majewski if (value >= 0) 774*7010f5b9SLukasz Majewski value = min(w_length, (u16) value); 775*7010f5b9SLukasz Majewski break; 776*7010f5b9SLukasz Majewski default: 777*7010f5b9SLukasz Majewski goto unknown; 778*7010f5b9SLukasz Majewski } 779*7010f5b9SLukasz Majewski break; 780*7010f5b9SLukasz Majewski 781*7010f5b9SLukasz Majewski /* any number of configs can work */ 782*7010f5b9SLukasz Majewski case USB_REQ_SET_CONFIGURATION: 783*7010f5b9SLukasz Majewski if (ctrl->bRequestType != 0) 784*7010f5b9SLukasz Majewski goto unknown; 785*7010f5b9SLukasz Majewski if (gadget_is_otg(gadget)) { 786*7010f5b9SLukasz Majewski if (gadget->a_hnp_support) 787*7010f5b9SLukasz Majewski debug("HNP available\n"); 788*7010f5b9SLukasz Majewski else if (gadget->a_alt_hnp_support) 789*7010f5b9SLukasz Majewski debug("HNP on another port\n"); 790*7010f5b9SLukasz Majewski else 791*7010f5b9SLukasz Majewski debug("HNP inactive\n"); 792*7010f5b9SLukasz Majewski } 793*7010f5b9SLukasz Majewski 794*7010f5b9SLukasz Majewski value = set_config(cdev, ctrl, w_value); 795*7010f5b9SLukasz Majewski break; 796*7010f5b9SLukasz Majewski case USB_REQ_GET_CONFIGURATION: 797*7010f5b9SLukasz Majewski if (ctrl->bRequestType != USB_DIR_IN) 798*7010f5b9SLukasz Majewski goto unknown; 799*7010f5b9SLukasz Majewski if (cdev->config) 800*7010f5b9SLukasz Majewski *(u8 *)req->buf = cdev->config->bConfigurationValue; 801*7010f5b9SLukasz Majewski else 802*7010f5b9SLukasz Majewski *(u8 *)req->buf = 0; 803*7010f5b9SLukasz Majewski value = min(w_length, (u16) 1); 804*7010f5b9SLukasz Majewski break; 805*7010f5b9SLukasz Majewski 806*7010f5b9SLukasz Majewski /* 807*7010f5b9SLukasz Majewski * function drivers must handle get/set altsetting; if there's 808*7010f5b9SLukasz Majewski * no get() method, we know only altsetting zero works. 809*7010f5b9SLukasz Majewski */ 810*7010f5b9SLukasz Majewski case USB_REQ_SET_INTERFACE: 811*7010f5b9SLukasz Majewski if (ctrl->bRequestType != USB_RECIP_INTERFACE) 812*7010f5b9SLukasz Majewski goto unknown; 813*7010f5b9SLukasz Majewski if (!cdev->config || w_index >= MAX_CONFIG_INTERFACES) 814*7010f5b9SLukasz Majewski break; 815*7010f5b9SLukasz Majewski f = cdev->config->interface[intf]; 816*7010f5b9SLukasz Majewski if (!f) 817*7010f5b9SLukasz Majewski break; 818*7010f5b9SLukasz Majewski if (w_value && !f->set_alt) 819*7010f5b9SLukasz Majewski break; 820*7010f5b9SLukasz Majewski value = f->set_alt(f, w_index, w_value); 821*7010f5b9SLukasz Majewski break; 822*7010f5b9SLukasz Majewski case USB_REQ_GET_INTERFACE: 823*7010f5b9SLukasz Majewski if (ctrl->bRequestType != (USB_DIR_IN|USB_RECIP_INTERFACE)) 824*7010f5b9SLukasz Majewski goto unknown; 825*7010f5b9SLukasz Majewski if (!cdev->config || w_index >= MAX_CONFIG_INTERFACES) 826*7010f5b9SLukasz Majewski break; 827*7010f5b9SLukasz Majewski f = cdev->config->interface[intf]; 828*7010f5b9SLukasz Majewski if (!f) 829*7010f5b9SLukasz Majewski break; 830*7010f5b9SLukasz Majewski /* lots of interfaces only need altsetting zero... */ 831*7010f5b9SLukasz Majewski value = f->get_alt ? f->get_alt(f, w_index) : 0; 832*7010f5b9SLukasz Majewski if (value < 0) 833*7010f5b9SLukasz Majewski break; 834*7010f5b9SLukasz Majewski *((u8 *)req->buf) = value; 835*7010f5b9SLukasz Majewski value = min(w_length, (u16) 1); 836*7010f5b9SLukasz Majewski break; 837*7010f5b9SLukasz Majewski default: 838*7010f5b9SLukasz Majewski unknown: 839*7010f5b9SLukasz Majewski debug("non-core control req%02x.%02x v%04x i%04x l%d\n", 840*7010f5b9SLukasz Majewski ctrl->bRequestType, ctrl->bRequest, 841*7010f5b9SLukasz Majewski w_value, w_index, w_length); 842*7010f5b9SLukasz Majewski 843*7010f5b9SLukasz Majewski /* 844*7010f5b9SLukasz Majewski * functions always handle their interfaces and endpoints... 845*7010f5b9SLukasz Majewski * punt other recipients (other, WUSB, ...) to the current 846*7010f5b9SLukasz Majewski * configuration code. 847*7010f5b9SLukasz Majewski */ 848*7010f5b9SLukasz Majewski switch (ctrl->bRequestType & USB_RECIP_MASK) { 849*7010f5b9SLukasz Majewski case USB_RECIP_INTERFACE: 850*7010f5b9SLukasz Majewski f = cdev->config->interface[intf]; 851*7010f5b9SLukasz Majewski break; 852*7010f5b9SLukasz Majewski 853*7010f5b9SLukasz Majewski case USB_RECIP_ENDPOINT: 854*7010f5b9SLukasz Majewski endp = ((w_index & 0x80) >> 3) | (w_index & 0x0f); 855*7010f5b9SLukasz Majewski list_for_each_entry(f, &cdev->config->functions, list) { 856*7010f5b9SLukasz Majewski if (test_bit(endp, f->endpoints)) 857*7010f5b9SLukasz Majewski break; 858*7010f5b9SLukasz Majewski } 859*7010f5b9SLukasz Majewski if (&f->list == &cdev->config->functions) 860*7010f5b9SLukasz Majewski f = NULL; 861*7010f5b9SLukasz Majewski break; 862*7010f5b9SLukasz Majewski } 863*7010f5b9SLukasz Majewski 864*7010f5b9SLukasz Majewski if (f && f->setup) 865*7010f5b9SLukasz Majewski value = f->setup(f, ctrl); 866*7010f5b9SLukasz Majewski else { 867*7010f5b9SLukasz Majewski c = cdev->config; 868*7010f5b9SLukasz Majewski if (c && c->setup) 869*7010f5b9SLukasz Majewski value = c->setup(c, ctrl); 870*7010f5b9SLukasz Majewski } 871*7010f5b9SLukasz Majewski 872*7010f5b9SLukasz Majewski goto done; 873*7010f5b9SLukasz Majewski } 874*7010f5b9SLukasz Majewski 875*7010f5b9SLukasz Majewski /* respond with data transfer before status phase? */ 876*7010f5b9SLukasz Majewski if (value >= 0) { 877*7010f5b9SLukasz Majewski req->length = value; 878*7010f5b9SLukasz Majewski req->zero = value < w_length; 879*7010f5b9SLukasz Majewski value = usb_ep_queue(gadget->ep0, req, GFP_KERNEL); 880*7010f5b9SLukasz Majewski if (value < 0) { 881*7010f5b9SLukasz Majewski debug("ep_queue --> %d\n", value); 882*7010f5b9SLukasz Majewski req->status = 0; 883*7010f5b9SLukasz Majewski composite_setup_complete(gadget->ep0, req); 884*7010f5b9SLukasz Majewski } 885*7010f5b9SLukasz Majewski } 886*7010f5b9SLukasz Majewski 887*7010f5b9SLukasz Majewski done: 888*7010f5b9SLukasz Majewski /* device either stalls (value < 0) or reports success */ 889*7010f5b9SLukasz Majewski return value; 890*7010f5b9SLukasz Majewski } 891*7010f5b9SLukasz Majewski 892*7010f5b9SLukasz Majewski static void composite_disconnect(struct usb_gadget *gadget) 893*7010f5b9SLukasz Majewski { 894*7010f5b9SLukasz Majewski struct usb_composite_dev *cdev = get_gadget_data(gadget); 895*7010f5b9SLukasz Majewski 896*7010f5b9SLukasz Majewski if (cdev->config) 897*7010f5b9SLukasz Majewski reset_config(cdev); 898*7010f5b9SLukasz Majewski if (composite->disconnect) 899*7010f5b9SLukasz Majewski composite->disconnect(cdev); 900*7010f5b9SLukasz Majewski } 901*7010f5b9SLukasz Majewski 902*7010f5b9SLukasz Majewski static void composite_unbind(struct usb_gadget *gadget) 903*7010f5b9SLukasz Majewski { 904*7010f5b9SLukasz Majewski struct usb_composite_dev *cdev = get_gadget_data(gadget); 905*7010f5b9SLukasz Majewski struct usb_configuration *c; 906*7010f5b9SLukasz Majewski struct usb_function *f; 907*7010f5b9SLukasz Majewski 908*7010f5b9SLukasz Majewski /* 909*7010f5b9SLukasz Majewski * composite_disconnect() must already have been called 910*7010f5b9SLukasz Majewski * by the underlying peripheral controller driver! 911*7010f5b9SLukasz Majewski * so there's no i/o concurrency that could affect the 912*7010f5b9SLukasz Majewski * state protected by cdev->lock. 913*7010f5b9SLukasz Majewski */ 914*7010f5b9SLukasz Majewski BUG_ON(cdev->config); 915*7010f5b9SLukasz Majewski 916*7010f5b9SLukasz Majewski while (!list_empty(&cdev->configs)) { 917*7010f5b9SLukasz Majewski c = list_first_entry(&cdev->configs, 918*7010f5b9SLukasz Majewski struct usb_configuration, list); 919*7010f5b9SLukasz Majewski while (!list_empty(&c->functions)) { 920*7010f5b9SLukasz Majewski f = list_first_entry(&c->functions, 921*7010f5b9SLukasz Majewski struct usb_function, list); 922*7010f5b9SLukasz Majewski list_del(&f->list); 923*7010f5b9SLukasz Majewski if (f->unbind) { 924*7010f5b9SLukasz Majewski debug("unbind function '%s'/%p\n", 925*7010f5b9SLukasz Majewski f->name, f); 926*7010f5b9SLukasz Majewski f->unbind(c, f); 927*7010f5b9SLukasz Majewski } 928*7010f5b9SLukasz Majewski } 929*7010f5b9SLukasz Majewski list_del(&c->list); 930*7010f5b9SLukasz Majewski if (c->unbind) { 931*7010f5b9SLukasz Majewski debug("unbind config '%s'/%p\n", c->label, c); 932*7010f5b9SLukasz Majewski c->unbind(c); 933*7010f5b9SLukasz Majewski } 934*7010f5b9SLukasz Majewski } 935*7010f5b9SLukasz Majewski if (composite->unbind) 936*7010f5b9SLukasz Majewski composite->unbind(cdev); 937*7010f5b9SLukasz Majewski 938*7010f5b9SLukasz Majewski if (cdev->req) { 939*7010f5b9SLukasz Majewski kfree(cdev->req->buf); 940*7010f5b9SLukasz Majewski usb_ep_free_request(gadget->ep0, cdev->req); 941*7010f5b9SLukasz Majewski } 942*7010f5b9SLukasz Majewski kfree(cdev); 943*7010f5b9SLukasz Majewski set_gadget_data(gadget, NULL); 944*7010f5b9SLukasz Majewski 945*7010f5b9SLukasz Majewski composite = NULL; 946*7010f5b9SLukasz Majewski } 947*7010f5b9SLukasz Majewski 948*7010f5b9SLukasz Majewski static int composite_bind(struct usb_gadget *gadget) 949*7010f5b9SLukasz Majewski { 950*7010f5b9SLukasz Majewski int status = -ENOMEM; 951*7010f5b9SLukasz Majewski struct usb_composite_dev *cdev; 952*7010f5b9SLukasz Majewski 953*7010f5b9SLukasz Majewski cdev = calloc(sizeof *cdev, 1); 954*7010f5b9SLukasz Majewski if (!cdev) 955*7010f5b9SLukasz Majewski return status; 956*7010f5b9SLukasz Majewski 957*7010f5b9SLukasz Majewski cdev->gadget = gadget; 958*7010f5b9SLukasz Majewski set_gadget_data(gadget, cdev); 959*7010f5b9SLukasz Majewski INIT_LIST_HEAD(&cdev->configs); 960*7010f5b9SLukasz Majewski 961*7010f5b9SLukasz Majewski /* preallocate control response and buffer */ 962*7010f5b9SLukasz Majewski cdev->req = usb_ep_alloc_request(gadget->ep0, GFP_KERNEL); 963*7010f5b9SLukasz Majewski if (!cdev->req) 964*7010f5b9SLukasz Majewski goto fail; 965*7010f5b9SLukasz Majewski cdev->req->buf = memalign(CONFIG_SYS_CACHELINE_SIZE, USB_BUFSIZ); 966*7010f5b9SLukasz Majewski if (!cdev->req->buf) 967*7010f5b9SLukasz Majewski goto fail; 968*7010f5b9SLukasz Majewski cdev->req->complete = composite_setup_complete; 969*7010f5b9SLukasz Majewski gadget->ep0->driver_data = cdev; 970*7010f5b9SLukasz Majewski 971*7010f5b9SLukasz Majewski cdev->bufsiz = USB_BUFSIZ; 972*7010f5b9SLukasz Majewski cdev->driver = composite; 973*7010f5b9SLukasz Majewski 974*7010f5b9SLukasz Majewski usb_gadget_set_selfpowered(gadget); 975*7010f5b9SLukasz Majewski usb_ep_autoconfig_reset(cdev->gadget); 976*7010f5b9SLukasz Majewski 977*7010f5b9SLukasz Majewski status = composite->bind(cdev); 978*7010f5b9SLukasz Majewski if (status < 0) 979*7010f5b9SLukasz Majewski goto fail; 980*7010f5b9SLukasz Majewski 981*7010f5b9SLukasz Majewski cdev->desc = *composite->dev; 982*7010f5b9SLukasz Majewski cdev->desc.bMaxPacketSize0 = gadget->ep0->maxpacket; 983*7010f5b9SLukasz Majewski 984*7010f5b9SLukasz Majewski debug("%s: ready\n", composite->name); 985*7010f5b9SLukasz Majewski return 0; 986*7010f5b9SLukasz Majewski 987*7010f5b9SLukasz Majewski fail: 988*7010f5b9SLukasz Majewski composite_unbind(gadget); 989*7010f5b9SLukasz Majewski return status; 990*7010f5b9SLukasz Majewski } 991*7010f5b9SLukasz Majewski 992*7010f5b9SLukasz Majewski static void 993*7010f5b9SLukasz Majewski composite_suspend(struct usb_gadget *gadget) 994*7010f5b9SLukasz Majewski { 995*7010f5b9SLukasz Majewski struct usb_composite_dev *cdev = get_gadget_data(gadget); 996*7010f5b9SLukasz Majewski struct usb_function *f; 997*7010f5b9SLukasz Majewski 998*7010f5b9SLukasz Majewski debug("%s: suspend\n", __func__); 999*7010f5b9SLukasz Majewski if (cdev->config) { 1000*7010f5b9SLukasz Majewski list_for_each_entry(f, &cdev->config->functions, list) { 1001*7010f5b9SLukasz Majewski if (f->suspend) 1002*7010f5b9SLukasz Majewski f->suspend(f); 1003*7010f5b9SLukasz Majewski } 1004*7010f5b9SLukasz Majewski } 1005*7010f5b9SLukasz Majewski if (composite->suspend) 1006*7010f5b9SLukasz Majewski composite->suspend(cdev); 1007*7010f5b9SLukasz Majewski 1008*7010f5b9SLukasz Majewski cdev->suspended = 1; 1009*7010f5b9SLukasz Majewski } 1010*7010f5b9SLukasz Majewski 1011*7010f5b9SLukasz Majewski static void 1012*7010f5b9SLukasz Majewski composite_resume(struct usb_gadget *gadget) 1013*7010f5b9SLukasz Majewski { 1014*7010f5b9SLukasz Majewski struct usb_composite_dev *cdev = get_gadget_data(gadget); 1015*7010f5b9SLukasz Majewski struct usb_function *f; 1016*7010f5b9SLukasz Majewski 1017*7010f5b9SLukasz Majewski debug("%s: resume\n", __func__); 1018*7010f5b9SLukasz Majewski if (composite->resume) 1019*7010f5b9SLukasz Majewski composite->resume(cdev); 1020*7010f5b9SLukasz Majewski if (cdev->config) { 1021*7010f5b9SLukasz Majewski list_for_each_entry(f, &cdev->config->functions, list) { 1022*7010f5b9SLukasz Majewski if (f->resume) 1023*7010f5b9SLukasz Majewski f->resume(f); 1024*7010f5b9SLukasz Majewski } 1025*7010f5b9SLukasz Majewski } 1026*7010f5b9SLukasz Majewski 1027*7010f5b9SLukasz Majewski cdev->suspended = 0; 1028*7010f5b9SLukasz Majewski } 1029*7010f5b9SLukasz Majewski 1030*7010f5b9SLukasz Majewski static struct usb_gadget_driver composite_driver = { 1031*7010f5b9SLukasz Majewski .speed = USB_SPEED_HIGH, 1032*7010f5b9SLukasz Majewski 1033*7010f5b9SLukasz Majewski .bind = composite_bind, 1034*7010f5b9SLukasz Majewski .unbind = composite_unbind, 1035*7010f5b9SLukasz Majewski 1036*7010f5b9SLukasz Majewski .setup = composite_setup, 1037*7010f5b9SLukasz Majewski .disconnect = composite_disconnect, 1038*7010f5b9SLukasz Majewski 1039*7010f5b9SLukasz Majewski .suspend = composite_suspend, 1040*7010f5b9SLukasz Majewski .resume = composite_resume, 1041*7010f5b9SLukasz Majewski }; 1042*7010f5b9SLukasz Majewski 1043*7010f5b9SLukasz Majewski /** 1044*7010f5b9SLukasz Majewski * usb_composite_register() - register a composite driver 1045*7010f5b9SLukasz Majewski * @driver: the driver to register 1046*7010f5b9SLukasz Majewski * Context: single threaded during gadget setup 1047*7010f5b9SLukasz Majewski * 1048*7010f5b9SLukasz Majewski * This function is used to register drivers using the composite driver 1049*7010f5b9SLukasz Majewski * framework. The return value is zero, or a negative errno value. 1050*7010f5b9SLukasz Majewski * Those values normally come from the driver's @bind method, which does 1051*7010f5b9SLukasz Majewski * all the work of setting up the driver to match the hardware. 1052*7010f5b9SLukasz Majewski * 1053*7010f5b9SLukasz Majewski * On successful return, the gadget is ready to respond to requests from 1054*7010f5b9SLukasz Majewski * the host, unless one of its components invokes usb_gadget_disconnect() 1055*7010f5b9SLukasz Majewski * while it was binding. That would usually be done in order to wait for 1056*7010f5b9SLukasz Majewski * some userspace participation. 1057*7010f5b9SLukasz Majewski */ 1058*7010f5b9SLukasz Majewski int usb_composite_register(struct usb_composite_driver *driver) 1059*7010f5b9SLukasz Majewski { 1060*7010f5b9SLukasz Majewski if (!driver || !driver->dev || !driver->bind || composite) 1061*7010f5b9SLukasz Majewski return -EINVAL; 1062*7010f5b9SLukasz Majewski 1063*7010f5b9SLukasz Majewski if (!driver->name) 1064*7010f5b9SLukasz Majewski driver->name = "composite"; 1065*7010f5b9SLukasz Majewski composite = driver; 1066*7010f5b9SLukasz Majewski 1067*7010f5b9SLukasz Majewski return usb_gadget_register_driver(&composite_driver); 1068*7010f5b9SLukasz Majewski } 1069*7010f5b9SLukasz Majewski 1070*7010f5b9SLukasz Majewski /** 1071*7010f5b9SLukasz Majewski * usb_composite_unregister() - unregister a composite driver 1072*7010f5b9SLukasz Majewski * @driver: the driver to unregister 1073*7010f5b9SLukasz Majewski * 1074*7010f5b9SLukasz Majewski * This function is used to unregister drivers using the composite 1075*7010f5b9SLukasz Majewski * driver framework. 1076*7010f5b9SLukasz Majewski */ 1077*7010f5b9SLukasz Majewski void usb_composite_unregister(struct usb_composite_driver *driver) 1078*7010f5b9SLukasz Majewski { 1079*7010f5b9SLukasz Majewski if (composite != driver) 1080*7010f5b9SLukasz Majewski return; 1081*7010f5b9SLukasz Majewski usb_gadget_unregister_driver(&composite_driver); 1082*7010f5b9SLukasz Majewski } 1083