Lines Matching defs:cdev
164 struct usb_composite_dev *cdev;
199 cdev = get_gadget_data(g);
201 WARNING(cdev,
261 ERROR(cdev, "ep0 bMaxBurst must be 0\n");
315 DBG(config->cdev, "adding '%s'/%p to config '%s'/%p\n",
357 DBG(config->cdev, "adding '%s'/%p --> %d\n",
399 struct usb_composite_dev *cdev = function->config->cdev;
403 spin_lock_irqsave(&cdev->lock, flags);
405 if (cdev->deactivations == 0) {
406 spin_unlock_irqrestore(&cdev->lock, flags);
407 status = usb_gadget_deactivate(cdev->gadget);
408 spin_lock_irqsave(&cdev->lock, flags);
411 cdev->deactivations++;
413 spin_unlock_irqrestore(&cdev->lock, flags);
430 struct usb_composite_dev *cdev = function->config->cdev;
434 spin_lock_irqsave(&cdev->lock, flags);
436 if (WARN_ON(cdev->deactivations == 0))
439 cdev->deactivations--;
440 if (cdev->deactivations == 0) {
441 spin_unlock_irqrestore(&cdev->lock, flags);
442 status = usb_gadget_activate(cdev->gadget);
443 spin_lock_irqsave(&cdev->lock, flags);
447 spin_unlock_irqrestore(&cdev->lock, flags);
505 struct usb_gadget *gadget = func->config->cdev->gadget;
512 ERROR(func->config->cdev, "not armed for func remote wakeup\n");
521 ERROR(func->config->cdev, "Invalid function\n");
556 WARN(c->cdev, "Clearing wakeup bit for config c.%d\n",
614 static int config_desc(struct usb_composite_dev *cdev, unsigned w_value)
616 struct usb_gadget *gadget = cdev->gadget;
638 pos = &cdev->configs;
639 c = cdev->os_desc_config;
643 while ((pos = pos->next) != &cdev->configs) {
647 if (c == cdev->os_desc_config)
671 return config_buf(c, speed, cdev->req->buf, type);
677 static int count_configs(struct usb_composite_dev *cdev, unsigned type)
679 struct usb_gadget *gadget = cdev->gadget;
696 list_for_each_entry(c, &cdev->configs, list) {
718 * @cdev: pointer to usb_composite device to generate the bos
725 static int bos_desc(struct usb_composite_dev *cdev)
729 struct usb_bos_descriptor *bos = cdev->req->buf;
739 if (cdev->gadget->ops->get_config_params) {
740 cdev->gadget->ops->get_config_params(cdev->gadget,
765 if (cdev->gadget->lpm_capable) {
766 usb_ext = cdev->req->buf + le16_to_cpu(bos->wTotalLength);
780 if (gadget_is_superspeed(cdev->gadget)) {
783 ss_cap = cdev->req->buf + le16_to_cpu(bos->wTotalLength);
800 if (gadget_is_superspeed_plus(cdev->gadget)) {
806 if (cdev->gadget->max_ssp_rate == USB_SSP_GEN_2x2)
815 ssp_cap = cdev->req->buf + le16_to_cpu(bos->wTotalLength);
853 if (cdev->gadget->max_ssp_rate == USB_SSP_GEN_2x1 ||
854 cdev->gadget->max_ssp_rate == USB_SSP_GEN_UNKNOWN)
876 if (cdev->use_webusb) {
881 webusb_cap = cdev->req->buf + le16_to_cpu(bos->wTotalLength);
893 if (cdev->bcd_webusb_version != 0)
894 webusb_cap_data->bcdVersion = cpu_to_le16(cdev->bcd_webusb_version);
898 webusb_cap_data->bVendorCode = cdev->b_webusb_vendor_code;
900 if (strnlen(cdev->landing_page, sizeof(cdev->landing_page)) > 0)
909 static void device_qual(struct usb_composite_dev *cdev)
911 struct usb_qualifier_descriptor *qual = cdev->req->buf;
916 qual->bcdUSB = cdev->desc.bcdUSB;
917 qual->bDeviceClass = cdev->desc.bDeviceClass;
918 qual->bDeviceSubClass = cdev->desc.bDeviceSubClass;
919 qual->bDeviceProtocol = cdev->desc.bDeviceProtocol;
921 qual->bMaxPacketSize0 = cdev->gadget->ep0->maxpacket;
922 qual->bNumConfigurations = count_configs(cdev, USB_DT_DEVICE_QUALIFIER);
928 static void reset_config(struct usb_composite_dev *cdev)
932 DBG(cdev, "reset config\n");
934 list_for_each_entry(f, &cdev->config->functions, list) {
943 cdev->config = NULL;
944 cdev->delayed_status = 0;
947 static int set_config(struct usb_composite_dev *cdev,
950 struct usb_gadget *gadget = cdev->gadget;
957 list_for_each_entry(iter, &cdev->configs, list) {
965 if (cdev->config)
966 reset_config(cdev);
974 if (cdev->config)
975 reset_config(cdev);
979 DBG(cdev, "%s config #%d: %s\n",
987 cdev->config = c;
1020 DBG(cdev, "interface %d (%s/%p) alt 0 --> %d\n",
1023 reset_config(cdev);
1028 DBG(cdev,
1031 cdev->delayed_status++;
1032 DBG(cdev, "delayed_status count %d\n",
1033 cdev->delayed_status);
1059 if (result >= 0 && cdev->delayed_status)
1064 int usb_add_config_only(struct usb_composite_dev *cdev,
1073 list_for_each_entry(c, &cdev->configs, list) {
1078 config->cdev = cdev;
1079 list_add_tail(&config->list, &cdev->configs);
1091 * @cdev: wraps the USB gadget
1104 int usb_add_config(struct usb_composite_dev *cdev,
1113 DBG(cdev, "adding config #%u '%s'/%p\n",
1117 status = usb_add_config_only(cdev, config);
1124 status = usb_gadget_check_config(cdev->gadget);
1134 DBG(cdev, "unbind function '%s'/%p\n",
1141 config->cdev = NULL;
1145 DBG(cdev, "cfg %d/%p speeds:%s%s%s%s\n",
1151 ? (gadget_is_dualspeed(cdev->gadget)
1161 DBG(cdev, " interface %d = %s/%p\n",
1167 usb_ep_autoconfig_reset(cdev->gadget);
1171 DBG(cdev, "added config '%s'/%u --> %d\n", config->label,
1177 static void remove_config(struct usb_composite_dev *cdev,
1190 DBG(cdev, "unbind config '%s'/%p\n", config->label, config);
1198 * @cdev: wraps the USB gadget
1205 void usb_remove_config(struct usb_composite_dev *cdev,
1210 spin_lock_irqsave(&cdev->lock, flags);
1212 if (cdev->config == config)
1213 reset_config(cdev);
1215 spin_unlock_irqrestore(&cdev->lock, flags);
1217 remove_config(cdev, config);
1268 static int get_string(struct usb_composite_dev *cdev,
1271 struct usb_composite_driver *composite = cdev->driver;
1294 list_for_each_entry(c, &cdev->configs, list) {
1305 list_for_each_entry(uc, &cdev->gstrings, list) {
1321 if (cdev->use_os_string && language == 0 && id == OS_STRING_IDX) {
1326 sizeof(b->qwSignature) == sizeof(cdev->qw_sign),
1328 memcpy(&b->qwSignature, cdev->qw_sign, sizeof(b->qwSignature));
1329 b->bMS_VendorCode = cdev->b_vendor_code;
1334 list_for_each_entry(uc, &cdev->gstrings, list) {
1352 list_for_each_entry(c, &cdev->configs, list) {
1371 * @cdev: the device whose string descriptor IDs are being allocated
1383 int usb_string_id(struct usb_composite_dev *cdev)
1385 if (cdev->next_string_id < 254) {
1389 cdev->next_string_id++;
1390 return cdev->next_string_id;
1398 * @cdev: the device whose string descriptor IDs are being allocated
1412 int usb_string_ids_tab(struct usb_composite_dev *cdev, struct usb_string *str)
1414 int next = cdev->next_string_id;
1422 cdev->next_string_id = next;
1480 * usb_gstrings_attach() - attach gadget strings to a cdev and assign ids
1481 * @cdev: the device whose string descriptor IDs are being allocated
1487 * and attach it to the cdev. The actual string (usb_string.s) will not be
1496 struct usb_string *usb_gstrings_attach(struct usb_composite_dev *cdev,
1516 ret = usb_string_ids_tab(cdev, n_gs[0]->strings);
1533 list_add_tail(&uc->list, &cdev->gstrings);
1574 struct usb_composite_dev *cdev;
1591 cdev = req->context;
1593 if (cdev->req == req)
1594 cdev->setup_pending = false;
1595 else if (cdev->os_desc_req == req)
1596 cdev->os_desc_pending = false;
1601 static int composite_ep0_queue(struct usb_composite_dev *cdev,
1606 ret = usb_ep_queue(cdev->gadget->ep0, req, gfp_flags);
1608 if (cdev->req == req)
1609 cdev->setup_pending = true;
1610 else if (cdev->os_desc_req == req)
1611 cdev->os_desc_pending = true;
1779 struct usb_composite_dev *cdev = get_gadget_data(gadget);
1780 struct usb_request *req = cdev->req;
1808 req->context = cdev;
1811 gadget->ep0->driver_data = cdev;
1829 cdev->desc.bNumConfigurations =
1830 count_configs(cdev, USB_DT_DEVICE);
1831 cdev->desc.bMaxPacketSize0 =
1832 cdev->gadget->ep0->maxpacket;
1835 cdev->desc.bcdUSB = cpu_to_le16(0x0320);
1836 cdev->desc.bMaxPacketSize0 = 9;
1838 cdev->desc.bcdUSB = cpu_to_le16(0x0210);
1841 if (gadget->lpm_capable || cdev->use_webusb)
1842 cdev->desc.bcdUSB = cpu_to_le16(0x0201);
1844 cdev->desc.bcdUSB = cpu_to_le16(0x0200);
1847 value = min(w_length, (u16) sizeof cdev->desc);
1848 memcpy(req->buf, &cdev->desc, value);
1854 device_qual(cdev);
1864 value = config_desc(cdev, w_value);
1869 value = get_string(cdev, req->buf,
1876 gadget->lpm_capable || cdev->use_webusb) {
1877 value = bos_desc(cdev);
1886 if (cdev->config)
1887 config = cdev->config;
1890 &cdev->configs,
1916 DBG(cdev, "HNP available\n");
1918 DBG(cdev, "HNP on another port\n");
1920 VDBG(cdev, "HNP inactive\n");
1922 spin_lock(&cdev->lock);
1923 value = set_config(cdev, ctrl, w_value);
1924 spin_unlock(&cdev->lock);
1929 if (cdev->config)
1930 *(u8 *)req->buf = cdev->config->bConfigurationValue;
1940 if (!cdev->config || intf >= MAX_CONFIG_INTERFACES)
1942 f = cdev->config->interface[intf];
1954 spin_lock(&cdev->lock);
1957 DBG(cdev,
1960 cdev->delayed_status++;
1961 DBG(cdev, "delayed_status count %d\n",
1962 cdev->delayed_status);
1964 spin_unlock(&cdev->lock);
1969 if (!cdev->config || intf >= MAX_CONFIG_INTERFACES)
1971 f = cdev->config->interface[intf];
2005 if (!cdev->config || intf >= MAX_CONFIG_INTERFACES)
2007 f = cdev->config->interface[intf];
2039 if (!cdev->config || intf >= MAX_CONFIG_INTERFACES)
2041 f = cdev->config->interface[intf];
2084 ERROR(cdev,
2097 if (cdev->use_os_string && cdev->os_desc_config &&
2099 ctrl->bRequest == cdev->b_vendor_code) {
2105 req = cdev->os_desc_req;
2106 req->context = cdev;
2109 os_desc_cfg = cdev->os_desc_config;
2161 if (cdev->use_webusb &&
2165 ctrl->bRequest == cdev->b_webusb_vendor_code) {
2169 (struct webusb_url_descriptor *)cdev->req->buf;
2173 if (strncasecmp(cdev->landing_page, "https://", 8) == 0) {
2176 } else if (strncasecmp(cdev->landing_page, "http://", 7) == 0) {
2184 landing_page_length = strnlen(cdev->landing_page,
2193 cdev->landing_page + landing_page_offset,
2203 VDBG(cdev,
2212 if (cdev->config) {
2213 list_for_each_entry(f, &cdev->config->functions, list)
2219 list_for_each_entry(c, &cdev->configs, list)
2229 if (!cdev->config || intf >= MAX_CONFIG_INTERFACES)
2231 f = cdev->config->interface[intf];
2235 if (!cdev->config)
2238 list_for_each_entry(iter, &cdev->config->functions, list) {
2252 c = cdev->config;
2278 req->context = cdev;
2280 value = composite_ep0_queue(cdev, req, GFP_ATOMIC);
2282 DBG(cdev, "ep_queue --> %d\n", value);
2287 WARN(cdev,
2299 struct usb_composite_dev *cdev = get_gadget_data(gadget);
2305 spin_lock_irqsave(&cdev->lock, flags);
2306 cdev->suspended = 0;
2307 if (cdev->config)
2308 reset_config(cdev);
2309 if (cdev->driver->disconnect)
2310 cdev->driver->disconnect(cdev);
2311 spin_unlock_irqrestore(&cdev->lock, flags);
2337 struct usb_composite_dev *cdev = get_gadget_data(gadget);
2339 return sprintf(buf, "%d\n", cdev->suspended);
2345 struct usb_composite_dev *cdev = get_gadget_data(gadget);
2346 struct usb_gadget_strings *gstr = cdev->driver->strings[0];
2352 * state protected by cdev->lock.
2354 WARN_ON(cdev->config);
2356 while (!list_empty(&cdev->configs)) {
2358 c = list_first_entry(&cdev->configs,
2360 remove_config(cdev, c);
2362 if (cdev->driver->unbind && unbind_driver)
2363 cdev->driver->unbind(cdev);
2365 composite_dev_cleanup(cdev);
2367 if (dev_str[USB_GADGET_MANUFACTURER_IDX].s == cdev->def_manufacturer)
2370 kfree(cdev->def_manufacturer);
2371 kfree(cdev);
2419 struct usb_composite_dev *cdev)
2421 struct usb_gadget *gadget = cdev->gadget;
2425 cdev->req = usb_ep_alloc_request(gadget->ep0, GFP_KERNEL);
2426 if (!cdev->req)
2429 cdev->req->buf = kzalloc(USB_COMP_EP0_BUFSIZ, GFP_KERNEL);
2430 if (!cdev->req->buf)
2437 cdev->req->complete = composite_setup_complete;
2438 cdev->req->context = cdev;
2439 gadget->ep0->driver_data = cdev;
2441 cdev->driver = composite;
2458 kfree(cdev->req->buf);
2460 usb_ep_free_request(gadget->ep0, cdev->req);
2461 cdev->req = NULL;
2465 int composite_os_desc_req_prepare(struct usb_composite_dev *cdev,
2470 cdev->os_desc_req = usb_ep_alloc_request(ep0, GFP_KERNEL);
2471 if (!cdev->os_desc_req) {
2476 cdev->os_desc_req->buf = kmalloc(USB_COMP_EP0_OS_DESC_BUFSIZ,
2478 if (!cdev->os_desc_req->buf) {
2480 usb_ep_free_request(ep0, cdev->os_desc_req);
2483 cdev->os_desc_req->context = cdev;
2484 cdev->os_desc_req->complete = composite_setup_complete;
2489 void composite_dev_cleanup(struct usb_composite_dev *cdev)
2494 list_for_each_entry_safe(uc, tmp, &cdev->gstrings, list) {
2498 if (cdev->os_desc_req) {
2499 if (cdev->os_desc_pending)
2500 usb_ep_dequeue(cdev->gadget->ep0, cdev->os_desc_req);
2502 kfree(cdev->os_desc_req->buf);
2503 cdev->os_desc_req->buf = NULL;
2504 usb_ep_free_request(cdev->gadget->ep0, cdev->os_desc_req);
2505 cdev->os_desc_req = NULL;
2507 if (cdev->req) {
2508 if (cdev->setup_pending)
2509 usb_ep_dequeue(cdev->gadget->ep0, cdev->req);
2511 kfree(cdev->req->buf);
2512 cdev->req->buf = NULL;
2513 usb_ep_free_request(cdev->gadget->ep0, cdev->req);
2514 cdev->req = NULL;
2516 cdev->next_string_id = 0;
2517 device_remove_file(&cdev->gadget->dev, &dev_attr_suspended);
2529 &cdev->gadget->ep_list, ep_list) {
2538 struct usb_composite_dev *cdev;
2542 cdev = kzalloc(sizeof *cdev, GFP_KERNEL);
2543 if (!cdev)
2546 spin_lock_init(&cdev->lock);
2547 cdev->gadget = gadget;
2548 set_gadget_data(gadget, cdev);
2549 INIT_LIST_HEAD(&cdev->configs);
2550 INIT_LIST_HEAD(&cdev->gstrings);
2552 status = composite_dev_prepare(composite, cdev);
2560 status = composite->bind(cdev);
2564 if (cdev->use_os_string) {
2565 status = composite_os_desc_req_prepare(cdev, gadget->ep0);
2570 update_unchanged_dev_desc(&cdev->desc, composite->dev);
2573 if (composite->needs_serial && !cdev->desc.iSerialNumber)
2574 WARNING(cdev, "userspace failed to provide iSerialNumber\n");
2576 INFO(cdev, "%s ready\n", composite->name);
2588 struct usb_composite_dev *cdev = get_gadget_data(gadget);
2594 DBG(cdev, "suspend\n");
2595 if (cdev->config) {
2596 list_for_each_entry(f, &cdev->config->functions, list) {
2601 if (cdev->driver->suspend)
2602 cdev->driver->suspend(cdev);
2604 cdev->suspended = 1;
2612 struct usb_composite_dev *cdev = get_gadget_data(gadget);
2619 DBG(cdev, "resume\n");
2620 if (cdev->driver->resume)
2621 cdev->driver->resume(cdev);
2622 if (cdev->config) {
2623 list_for_each_entry(f, &cdev->config->functions, list) {
2633 maxpower = cdev->config->MaxPower ?
2634 cdev->config->MaxPower : CONFIG_USB_GADGET_VBUS_DRAW;
2650 cdev->suspended = 0;
2723 * @cdev: the composite device who's control transfer was kept waiting
2731 void usb_composite_setup_continue(struct usb_composite_dev *cdev)
2734 struct usb_request *req = cdev->req;
2737 DBG(cdev, "%s\n", __func__);
2738 spin_lock_irqsave(&cdev->lock, flags);
2740 if (cdev->delayed_status == 0) {
2741 WARN(cdev, "%s: Unexpected call\n", __func__);
2743 } else if (--cdev->delayed_status == 0) {
2744 DBG(cdev, "%s: Completing delayed status\n", __func__);
2746 req->context = cdev;
2747 value = composite_ep0_queue(cdev, req, GFP_ATOMIC);
2749 DBG(cdev, "ep_queue --> %d\n", value);
2751 composite_setup_complete(cdev->gadget->ep0, req);
2755 spin_unlock_irqrestore(&cdev->lock, flags);
2765 void usb_composite_overwrite_options(struct usb_composite_dev *cdev,
2768 struct usb_device_descriptor *desc = &cdev->desc;
2769 struct usb_gadget_strings *gstr = cdev->driver->strings[0];
2791 cdev->def_manufacturer = composite_default_mfr(cdev->gadget);
2792 dev_str[USB_GADGET_MANUFACTURER_IDX].s = cdev->def_manufacturer;