Lines Matching refs:cdev

248 				struct usb_composite_dev *cdev;  in config_ep_by_speed_and_alt()  local
250 cdev = get_gadget_data(g); in config_ep_by_speed_and_alt()
251 ERROR(cdev, "ep0 bMaxBurst must be 0\n"); in config_ep_by_speed_and_alt()
306 DBG(config->cdev, "adding '%s'/%p to config '%s'/%p\n", in usb_add_function()
348 DBG(config->cdev, "adding '%s'/%p --> %d\n", in usb_add_function()
390 struct usb_composite_dev *cdev = function->config->cdev; in usb_function_deactivate() local
394 spin_lock_irqsave(&cdev->lock, flags); in usb_function_deactivate()
396 if (cdev->deactivations == 0) { in usb_function_deactivate()
397 spin_unlock_irqrestore(&cdev->lock, flags); in usb_function_deactivate()
398 status = usb_gadget_deactivate(cdev->gadget); in usb_function_deactivate()
399 spin_lock_irqsave(&cdev->lock, flags); in usb_function_deactivate()
402 cdev->deactivations++; in usb_function_deactivate()
404 spin_unlock_irqrestore(&cdev->lock, flags); in usb_function_deactivate()
421 struct usb_composite_dev *cdev = function->config->cdev; in usb_function_activate() local
425 spin_lock_irqsave(&cdev->lock, flags); in usb_function_activate()
427 if (WARN_ON(cdev->deactivations == 0)) in usb_function_activate()
430 cdev->deactivations--; in usb_function_activate()
431 if (cdev->deactivations == 0) { in usb_function_activate()
432 spin_unlock_irqrestore(&cdev->lock, flags); in usb_function_activate()
433 status = usb_gadget_activate(cdev->gadget); in usb_function_activate()
434 spin_lock_irqsave(&cdev->lock, flags); in usb_function_activate()
438 spin_unlock_irqrestore(&cdev->lock, flags); in usb_function_activate()
552 static int config_desc(struct usb_composite_dev *cdev, unsigned w_value) in config_desc() argument
554 struct usb_gadget *gadget = cdev->gadget; in config_desc()
576 pos = &cdev->configs; in config_desc()
577 c = cdev->os_desc_config; in config_desc()
581 while ((pos = pos->next) != &cdev->configs) { in config_desc()
585 if (c == cdev->os_desc_config) in config_desc()
609 return config_buf(c, speed, cdev->req->buf, type); in config_desc()
615 static int count_configs(struct usb_composite_dev *cdev, unsigned type) in count_configs() argument
617 struct usb_gadget *gadget = cdev->gadget; in count_configs()
634 list_for_each_entry(c, &cdev->configs, list) { in count_configs()
663 static int bos_desc(struct usb_composite_dev *cdev) in bos_desc() argument
667 struct usb_bos_descriptor *bos = cdev->req->buf; in bos_desc()
677 if (cdev->gadget->ops->get_config_params) { in bos_desc()
678 cdev->gadget->ops->get_config_params(cdev->gadget, in bos_desc()
703 usb_ext = cdev->req->buf + le16_to_cpu(bos->wTotalLength); in bos_desc()
716 if (gadget_is_superspeed(cdev->gadget)) { in bos_desc()
719 ss_cap = cdev->req->buf + le16_to_cpu(bos->wTotalLength); in bos_desc()
736 if (gadget_is_superspeed_plus(cdev->gadget)) { in bos_desc()
742 if (cdev->gadget->max_ssp_rate == USB_SSP_GEN_2x2) in bos_desc()
751 ssp_cap = cdev->req->buf + le16_to_cpu(bos->wTotalLength); in bos_desc()
789 if (cdev->gadget->max_ssp_rate == USB_SSP_GEN_2x1 || in bos_desc()
790 cdev->gadget->max_ssp_rate == USB_SSP_GEN_UNKNOWN) in bos_desc()
814 static void device_qual(struct usb_composite_dev *cdev) in device_qual() argument
816 struct usb_qualifier_descriptor *qual = cdev->req->buf; in device_qual()
821 qual->bcdUSB = cdev->desc.bcdUSB; in device_qual()
822 qual->bDeviceClass = cdev->desc.bDeviceClass; in device_qual()
823 qual->bDeviceSubClass = cdev->desc.bDeviceSubClass; in device_qual()
824 qual->bDeviceProtocol = cdev->desc.bDeviceProtocol; in device_qual()
826 qual->bMaxPacketSize0 = cdev->gadget->ep0->maxpacket; in device_qual()
827 qual->bNumConfigurations = count_configs(cdev, USB_DT_DEVICE_QUALIFIER); in device_qual()
833 static void reset_config(struct usb_composite_dev *cdev) in reset_config() argument
837 DBG(cdev, "reset config\n"); in reset_config()
839 list_for_each_entry(f, &cdev->config->functions, list) { in reset_config()
845 cdev->config = NULL; in reset_config()
846 cdev->delayed_status = 0; in reset_config()
849 static int set_config(struct usb_composite_dev *cdev, in set_config() argument
852 struct usb_gadget *gadget = cdev->gadget; in set_config()
859 list_for_each_entry(c, &cdev->configs, list) { in set_config()
866 if (cdev->config) in set_config()
867 reset_config(cdev); in set_config()
875 if (cdev->config) in set_config()
876 reset_config(cdev); in set_config()
880 DBG(cdev, "%s config #%d: %s\n", in set_config()
888 cdev->config = c; in set_config()
921 DBG(cdev, "interface %d (%s/%p) alt 0 --> %d\n", in set_config()
924 reset_config(cdev); in set_config()
929 DBG(cdev, in set_config()
932 cdev->delayed_status++; in set_config()
933 DBG(cdev, "delayed_status count %d\n", in set_config()
934 cdev->delayed_status); in set_config()
955 if (result >= 0 && cdev->delayed_status) in set_config()
960 int usb_add_config_only(struct usb_composite_dev *cdev, in usb_add_config_only() argument
969 list_for_each_entry(c, &cdev->configs, list) { in usb_add_config_only()
974 config->cdev = cdev; in usb_add_config_only()
975 list_add_tail(&config->list, &cdev->configs); in usb_add_config_only()
1000 int usb_add_config(struct usb_composite_dev *cdev, in usb_add_config() argument
1009 DBG(cdev, "adding config #%u '%s'/%p\n", in usb_add_config()
1013 status = usb_add_config_only(cdev, config); in usb_add_config()
1026 DBG(cdev, "unbind function '%s'/%p\n", in usb_add_config()
1033 config->cdev = NULL; in usb_add_config()
1037 DBG(cdev, "cfg %d/%p speeds:%s%s%s%s\n", in usb_add_config()
1043 ? (gadget_is_dualspeed(cdev->gadget) in usb_add_config()
1053 DBG(cdev, " interface %d = %s/%p\n", in usb_add_config()
1059 usb_ep_autoconfig_reset(cdev->gadget); in usb_add_config()
1063 DBG(cdev, "added config '%s'/%u --> %d\n", config->label, in usb_add_config()
1069 static void remove_config(struct usb_composite_dev *cdev, in remove_config() argument
1082 DBG(cdev, "unbind config '%s'/%p\n", config->label, config); in remove_config()
1097 void usb_remove_config(struct usb_composite_dev *cdev, in usb_remove_config() argument
1102 spin_lock_irqsave(&cdev->lock, flags); in usb_remove_config()
1104 if (cdev->config == config) in usb_remove_config()
1105 reset_config(cdev); in usb_remove_config()
1107 spin_unlock_irqrestore(&cdev->lock, flags); in usb_remove_config()
1109 remove_config(cdev, config); in usb_remove_config()
1160 static int get_string(struct usb_composite_dev *cdev, in get_string() argument
1163 struct usb_composite_driver *composite = cdev->driver; in get_string()
1186 list_for_each_entry(c, &cdev->configs, list) { in get_string()
1197 list_for_each_entry(uc, &cdev->gstrings, list) { in get_string()
1213 if (cdev->use_os_string && language == 0 && id == OS_STRING_IDX) { in get_string()
1218 sizeof(b->qwSignature) == sizeof(cdev->qw_sign), in get_string()
1220 memcpy(&b->qwSignature, cdev->qw_sign, sizeof(b->qwSignature)); in get_string()
1221 b->bMS_VendorCode = cdev->b_vendor_code; in get_string()
1226 list_for_each_entry(uc, &cdev->gstrings, list) { in get_string()
1244 list_for_each_entry(c, &cdev->configs, list) { in get_string()
1275 int usb_string_id(struct usb_composite_dev *cdev) in usb_string_id() argument
1277 if (cdev->next_string_id < 254) { in usb_string_id()
1281 cdev->next_string_id++; in usb_string_id()
1282 return cdev->next_string_id; in usb_string_id()
1304 int usb_string_ids_tab(struct usb_composite_dev *cdev, struct usb_string *str) in usb_string_ids_tab() argument
1306 int next = cdev->next_string_id; in usb_string_ids_tab()
1314 cdev->next_string_id = next; in usb_string_ids_tab()
1388 struct usb_string *usb_gstrings_attach(struct usb_composite_dev *cdev, in usb_gstrings_attach() argument
1408 ret = usb_string_ids_tab(cdev, n_gs[0]->strings); in usb_gstrings_attach()
1425 list_add_tail(&uc->list, &cdev->gstrings); in usb_gstrings_attach()
1466 struct usb_composite_dev *cdev; in composite_setup_complete() local
1483 cdev = req->context; in composite_setup_complete()
1485 if (cdev->req == req) in composite_setup_complete()
1486 cdev->setup_pending = false; in composite_setup_complete()
1487 else if (cdev->os_desc_req == req) in composite_setup_complete()
1488 cdev->os_desc_pending = false; in composite_setup_complete()
1493 static int composite_ep0_queue(struct usb_composite_dev *cdev, in composite_ep0_queue() argument
1498 ret = usb_ep_queue(cdev->gadget->ep0, req, gfp_flags); in composite_ep0_queue()
1500 if (cdev->req == req) in composite_ep0_queue()
1501 cdev->setup_pending = true; in composite_ep0_queue()
1502 else if (cdev->os_desc_req == req) in composite_ep0_queue()
1503 cdev->os_desc_pending = true; in composite_ep0_queue()
1671 struct usb_composite_dev *cdev = get_gadget_data(gadget); in composite_setup() local
1672 struct usb_request *req = cdev->req; in composite_setup()
1687 req->context = cdev; in composite_setup()
1690 gadget->ep0->driver_data = cdev; in composite_setup()
1708 cdev->desc.bNumConfigurations = in composite_setup()
1709 count_configs(cdev, USB_DT_DEVICE); in composite_setup()
1710 cdev->desc.bMaxPacketSize0 = in composite_setup()
1711 cdev->gadget->ep0->maxpacket; in composite_setup()
1714 cdev->desc.bcdUSB = cpu_to_le16(0x0320); in composite_setup()
1715 cdev->desc.bMaxPacketSize0 = 9; in composite_setup()
1717 cdev->desc.bcdUSB = cpu_to_le16(0x0210); in composite_setup()
1721 cdev->desc.bcdUSB = cpu_to_le16(0x0201); in composite_setup()
1723 cdev->desc.bcdUSB = cpu_to_le16(0x0200); in composite_setup()
1726 value = min(w_length, (u16) sizeof cdev->desc); in composite_setup()
1727 memcpy(req->buf, &cdev->desc, value); in composite_setup()
1733 device_qual(cdev); in composite_setup()
1743 value = config_desc(cdev, w_value); in composite_setup()
1748 value = get_string(cdev, req->buf, in composite_setup()
1756 value = bos_desc(cdev); in composite_setup()
1765 if (cdev->config) in composite_setup()
1766 config = cdev->config; in composite_setup()
1769 &cdev->configs, in composite_setup()
1795 DBG(cdev, "HNP available\n"); in composite_setup()
1797 DBG(cdev, "HNP on another port\n"); in composite_setup()
1799 VDBG(cdev, "HNP inactive\n"); in composite_setup()
1801 spin_lock(&cdev->lock); in composite_setup()
1802 value = set_config(cdev, ctrl, w_value); in composite_setup()
1803 spin_unlock(&cdev->lock); in composite_setup()
1808 if (cdev->config) in composite_setup()
1809 *(u8 *)req->buf = cdev->config->bConfigurationValue; in composite_setup()
1819 if (!cdev->config || intf >= MAX_CONFIG_INTERFACES) in composite_setup()
1821 f = cdev->config->interface[intf]; in composite_setup()
1833 spin_lock(&cdev->lock); in composite_setup()
1836 DBG(cdev, in composite_setup()
1839 cdev->delayed_status++; in composite_setup()
1840 DBG(cdev, "delayed_status count %d\n", in composite_setup()
1841 cdev->delayed_status); in composite_setup()
1843 spin_unlock(&cdev->lock); in composite_setup()
1848 if (!cdev->config || intf >= MAX_CONFIG_INTERFACES) in composite_setup()
1850 f = cdev->config->interface[intf]; in composite_setup()
1884 if (!cdev->config || intf >= MAX_CONFIG_INTERFACES) in composite_setup()
1886 f = cdev->config->interface[intf]; in composite_setup()
1907 if (!cdev->config || intf >= MAX_CONFIG_INTERFACES) in composite_setup()
1909 f = cdev->config->interface[intf]; in composite_setup()
1916 ERROR(cdev, in composite_setup()
1929 if (cdev->use_os_string && cdev->os_desc_config && in composite_setup()
1931 ctrl->bRequest == cdev->b_vendor_code) { in composite_setup()
1937 req = cdev->os_desc_req; in composite_setup()
1938 req->context = cdev; in composite_setup()
1941 os_desc_cfg = cdev->os_desc_config; in composite_setup()
1986 VDBG(cdev, in composite_setup()
1995 if (cdev->config) { in composite_setup()
1996 list_for_each_entry(f, &cdev->config->functions, list) in composite_setup()
2002 list_for_each_entry(c, &cdev->configs, list) in composite_setup()
2012 if (!cdev->config || intf >= MAX_CONFIG_INTERFACES) in composite_setup()
2014 f = cdev->config->interface[intf]; in composite_setup()
2018 if (!cdev->config) in composite_setup()
2021 list_for_each_entry(f, &cdev->config->functions, list) { in composite_setup()
2025 if (&f->list == &cdev->config->functions) in composite_setup()
2035 c = cdev->config; in composite_setup()
2061 req->context = cdev; in composite_setup()
2063 value = composite_ep0_queue(cdev, req, GFP_ATOMIC); in composite_setup()
2065 DBG(cdev, "ep_queue --> %d\n", value); in composite_setup()
2070 WARN(cdev, in composite_setup()
2082 struct usb_composite_dev *cdev = get_gadget_data(gadget); in __composite_disconnect() local
2088 spin_lock_irqsave(&cdev->lock, flags); in __composite_disconnect()
2089 cdev->suspended = 0; in __composite_disconnect()
2090 if (cdev->config) in __composite_disconnect()
2091 reset_config(cdev); in __composite_disconnect()
2092 if (cdev->driver->disconnect) in __composite_disconnect()
2093 cdev->driver->disconnect(cdev); in __composite_disconnect()
2094 spin_unlock_irqrestore(&cdev->lock, flags); in __composite_disconnect()
2120 struct usb_composite_dev *cdev = get_gadget_data(gadget); in suspended_show() local
2122 return sprintf(buf, "%d\n", cdev->suspended); in suspended_show()
2128 struct usb_composite_dev *cdev = get_gadget_data(gadget); in __composite_unbind() local
2129 struct usb_gadget_strings *gstr = cdev->driver->strings[0]; in __composite_unbind()
2137 WARN_ON(cdev->config); in __composite_unbind()
2139 while (!list_empty(&cdev->configs)) { in __composite_unbind()
2141 c = list_first_entry(&cdev->configs, in __composite_unbind()
2143 remove_config(cdev, c); in __composite_unbind()
2145 if (cdev->driver->unbind && unbind_driver) in __composite_unbind()
2146 cdev->driver->unbind(cdev); in __composite_unbind()
2148 composite_dev_cleanup(cdev); in __composite_unbind()
2150 if (dev_str[USB_GADGET_MANUFACTURER_IDX].s == cdev->def_manufacturer) in __composite_unbind()
2153 kfree(cdev->def_manufacturer); in __composite_unbind()
2154 kfree(cdev); in __composite_unbind()
2202 struct usb_composite_dev *cdev) in composite_dev_prepare() argument
2204 struct usb_gadget *gadget = cdev->gadget; in composite_dev_prepare()
2208 cdev->req = usb_ep_alloc_request(gadget->ep0, GFP_KERNEL); in composite_dev_prepare()
2209 if (!cdev->req) in composite_dev_prepare()
2212 cdev->req->buf = kmalloc(USB_COMP_EP0_BUFSIZ, GFP_KERNEL); in composite_dev_prepare()
2213 if (!cdev->req->buf) in composite_dev_prepare()
2220 cdev->req->complete = composite_setup_complete; in composite_dev_prepare()
2221 cdev->req->context = cdev; in composite_dev_prepare()
2222 gadget->ep0->driver_data = cdev; in composite_dev_prepare()
2224 cdev->driver = composite; in composite_dev_prepare()
2241 kfree(cdev->req->buf); in composite_dev_prepare()
2243 usb_ep_free_request(gadget->ep0, cdev->req); in composite_dev_prepare()
2244 cdev->req = NULL; in composite_dev_prepare()
2248 int composite_os_desc_req_prepare(struct usb_composite_dev *cdev, in composite_os_desc_req_prepare() argument
2253 cdev->os_desc_req = usb_ep_alloc_request(ep0, GFP_KERNEL); in composite_os_desc_req_prepare()
2254 if (!cdev->os_desc_req) { in composite_os_desc_req_prepare()
2259 cdev->os_desc_req->buf = kmalloc(USB_COMP_EP0_OS_DESC_BUFSIZ, in composite_os_desc_req_prepare()
2261 if (!cdev->os_desc_req->buf) { in composite_os_desc_req_prepare()
2263 usb_ep_free_request(ep0, cdev->os_desc_req); in composite_os_desc_req_prepare()
2266 cdev->os_desc_req->context = cdev; in composite_os_desc_req_prepare()
2267 cdev->os_desc_req->complete = composite_setup_complete; in composite_os_desc_req_prepare()
2272 void composite_dev_cleanup(struct usb_composite_dev *cdev) in composite_dev_cleanup() argument
2277 list_for_each_entry_safe(uc, tmp, &cdev->gstrings, list) { in composite_dev_cleanup()
2281 if (cdev->os_desc_req) { in composite_dev_cleanup()
2282 if (cdev->os_desc_pending) in composite_dev_cleanup()
2283 usb_ep_dequeue(cdev->gadget->ep0, cdev->os_desc_req); in composite_dev_cleanup()
2285 kfree(cdev->os_desc_req->buf); in composite_dev_cleanup()
2286 cdev->os_desc_req->buf = NULL; in composite_dev_cleanup()
2287 usb_ep_free_request(cdev->gadget->ep0, cdev->os_desc_req); in composite_dev_cleanup()
2288 cdev->os_desc_req = NULL; in composite_dev_cleanup()
2290 if (cdev->req) { in composite_dev_cleanup()
2291 if (cdev->setup_pending) in composite_dev_cleanup()
2292 usb_ep_dequeue(cdev->gadget->ep0, cdev->req); in composite_dev_cleanup()
2294 kfree(cdev->req->buf); in composite_dev_cleanup()
2295 cdev->req->buf = NULL; in composite_dev_cleanup()
2296 usb_ep_free_request(cdev->gadget->ep0, cdev->req); in composite_dev_cleanup()
2297 cdev->req = NULL; in composite_dev_cleanup()
2299 cdev->next_string_id = 0; in composite_dev_cleanup()
2300 device_remove_file(&cdev->gadget->dev, &dev_attr_suspended); in composite_dev_cleanup()
2312 &cdev->gadget->ep_list, ep_list) { in composite_dev_cleanup()
2321 struct usb_composite_dev *cdev; in composite_bind() local
2325 cdev = kzalloc(sizeof *cdev, GFP_KERNEL); in composite_bind()
2326 if (!cdev) in composite_bind()
2329 spin_lock_init(&cdev->lock); in composite_bind()
2330 cdev->gadget = gadget; in composite_bind()
2331 set_gadget_data(gadget, cdev); in composite_bind()
2332 INIT_LIST_HEAD(&cdev->configs); in composite_bind()
2333 INIT_LIST_HEAD(&cdev->gstrings); in composite_bind()
2335 status = composite_dev_prepare(composite, cdev); in composite_bind()
2343 status = composite->bind(cdev); in composite_bind()
2347 if (cdev->use_os_string) { in composite_bind()
2348 status = composite_os_desc_req_prepare(cdev, gadget->ep0); in composite_bind()
2353 update_unchanged_dev_desc(&cdev->desc, composite->dev); in composite_bind()
2356 if (composite->needs_serial && !cdev->desc.iSerialNumber) in composite_bind()
2357 WARNING(cdev, "userspace failed to provide iSerialNumber\n"); in composite_bind()
2359 INFO(cdev, "%s ready\n", composite->name); in composite_bind()
2371 struct usb_composite_dev *cdev = get_gadget_data(gadget); in composite_suspend() local
2377 DBG(cdev, "suspend\n"); in composite_suspend()
2378 if (cdev->config) { in composite_suspend()
2379 list_for_each_entry(f, &cdev->config->functions, list) { in composite_suspend()
2384 if (cdev->driver->suspend) in composite_suspend()
2385 cdev->driver->suspend(cdev); in composite_suspend()
2387 cdev->suspended = 1; in composite_suspend()
2395 struct usb_composite_dev *cdev = get_gadget_data(gadget); in composite_resume() local
2402 DBG(cdev, "resume\n"); in composite_resume()
2403 if (cdev->driver->resume) in composite_resume()
2404 cdev->driver->resume(cdev); in composite_resume()
2405 if (cdev->config) { in composite_resume()
2406 list_for_each_entry(f, &cdev->config->functions, list) { in composite_resume()
2411 maxpower = cdev->config->MaxPower ? in composite_resume()
2412 cdev->config->MaxPower : CONFIG_USB_GADGET_VBUS_DRAW; in composite_resume()
2424 cdev->suspended = 0; in composite_resume()
2505 void usb_composite_setup_continue(struct usb_composite_dev *cdev) in usb_composite_setup_continue() argument
2508 struct usb_request *req = cdev->req; in usb_composite_setup_continue()
2511 DBG(cdev, "%s\n", __func__); in usb_composite_setup_continue()
2512 spin_lock_irqsave(&cdev->lock, flags); in usb_composite_setup_continue()
2514 if (cdev->delayed_status == 0) { in usb_composite_setup_continue()
2515 WARN(cdev, "%s: Unexpected call\n", __func__); in usb_composite_setup_continue()
2517 } else if (--cdev->delayed_status == 0) { in usb_composite_setup_continue()
2518 DBG(cdev, "%s: Completing delayed status\n", __func__); in usb_composite_setup_continue()
2520 req->context = cdev; in usb_composite_setup_continue()
2521 value = composite_ep0_queue(cdev, req, GFP_ATOMIC); in usb_composite_setup_continue()
2523 DBG(cdev, "ep_queue --> %d\n", value); in usb_composite_setup_continue()
2525 composite_setup_complete(cdev->gadget->ep0, req); in usb_composite_setup_continue()
2529 spin_unlock_irqrestore(&cdev->lock, flags); in usb_composite_setup_continue()
2539 void usb_composite_overwrite_options(struct usb_composite_dev *cdev, in usb_composite_overwrite_options() argument
2542 struct usb_device_descriptor *desc = &cdev->desc; in usb_composite_overwrite_options()
2543 struct usb_gadget_strings *gstr = cdev->driver->strings[0]; in usb_composite_overwrite_options()
2565 cdev->def_manufacturer = composite_default_mfr(cdev->gadget); in usb_composite_overwrite_options()
2566 dev_str[USB_GADGET_MANUFACTURER_IDX].s = cdev->def_manufacturer; in usb_composite_overwrite_options()