Lines Matching refs:udev
140 struct usb_device *udev; in usb_trigger_reprobe_on_off() local
156 udev = bus->devices[USB_ROOT_HUB_ADDR]; in usb_trigger_reprobe_on_off()
158 if (udev->refcount == USB_DEV_REF_MAX) { in usb_trigger_reprobe_on_off()
163 udev->refcount++; in usb_trigger_reprobe_on_off()
166 do_unlock = usbd_enum_lock(udev); in usb_trigger_reprobe_on_off()
172 err = usbd_req_get_port_status(udev, NULL, &ps, 1); in usb_trigger_reprobe_on_off()
183 err = usbd_req_set_port_feature(udev, NULL, 1, in usb_trigger_reprobe_on_off()
190 err = usbd_req_clear_port_feature(udev, NULL, 1, in usb_trigger_reprobe_on_off()
201 usbd_enum_unlock(udev); in usb_trigger_reprobe_on_off()
202 if (--(udev->refcount) == 0) in usb_trigger_reprobe_on_off()
203 cv_broadcast(&udev->ref_cv); in usb_trigger_reprobe_on_off()
281 usb_get_manufacturer(struct usb_device *udev) in usb_get_manufacturer() argument
283 return (udev->manufacturer ? udev->manufacturer : "Unknown"); in usb_get_manufacturer()
287 usb_get_product(struct usb_device *udev) in usb_get_product() argument
289 return (udev->product ? udev->product : ""); in usb_get_product()
293 usb_get_serial(struct usb_device *udev) in usb_get_serial() argument
295 return (udev->serial ? udev->serial : ""); in usb_get_serial()
309 usbd_get_ep_by_addr(struct usb_device *udev, uint8_t ea_val) in usbd_get_ep_by_addr() argument
311 struct usb_endpoint *ep = udev->endpoints; in usbd_get_ep_by_addr()
312 struct usb_endpoint *ep_end = udev->endpoints + udev->endpoints_max; in usbd_get_ep_by_addr()
340 if ((udev->ctrl_ep.edesc != NULL) && in usbd_get_ep_by_addr()
341 ((udev->ctrl_ep.edesc->bEndpointAddress & EA_MASK) == ea_val)) { in usbd_get_ep_by_addr()
342 ep = &udev->ctrl_ep; in usbd_get_ep_by_addr()
362 usbd_get_endpoint(struct usb_device *udev, uint8_t iface_index, in usbd_get_endpoint() argument
365 struct usb_endpoint *ep = udev->endpoints; in usbd_get_endpoint()
366 struct usb_endpoint *ep_end = udev->endpoints + udev->endpoints_max; in usbd_get_endpoint()
375 udev, iface_index, setup->endpoint, in usbd_get_endpoint()
381 udev->flags.usb_mode != setup->usb_mode) { in usbd_get_endpoint()
390 ea_val = (udev->flags.usb_mode == USB_MODE_DEVICE) ? in usbd_get_endpoint()
394 ea_val = (udev->flags.usb_mode == USB_MODE_DEVICE) ? in usbd_get_endpoint()
457 if ((udev->ctrl_ep.edesc != NULL) && in usbd_get_endpoint()
458 ((udev->ctrl_ep.edesc->bEndpointAddress & ea_mask) == ea_val) && in usbd_get_endpoint()
459 ((udev->ctrl_ep.edesc->bmAttributes & type_mask) == type_val) && in usbd_get_endpoint()
461 ep = &udev->ctrl_ep; in usbd_get_endpoint()
482 usbd_interface_count(struct usb_device *udev, uint8_t *count) in usbd_interface_count() argument
484 if (udev->cdesc == NULL) { in usbd_interface_count()
488 *count = udev->ifaces_max; in usbd_interface_count()
500 usb_init_endpoint(struct usb_device *udev, uint8_t iface_index, in usb_init_endpoint() argument
508 methods = udev->bus->methods; in usb_init_endpoint()
510 (methods->endpoint_init) (udev, edesc, ep); in usb_init_endpoint()
528 if (udev->speed == USB_SPEED_SUPER && ecomp != NULL && in usb_init_endpoint()
531 usbd_set_endpoint_mode(udev, ep, USB_EP_MODE_STREAMS); in usb_init_endpoint()
533 usbd_set_endpoint_mode(udev, ep, USB_EP_MODE_DEFAULT); in usb_init_endpoint()
538 USB_BUS_LOCK(udev->bus); in usb_init_endpoint()
539 (methods->clear_stall) (udev, ep); in usb_init_endpoint()
540 USB_BUS_UNLOCK(udev->bus); in usb_init_endpoint()
555 usb_endpoint_foreach(struct usb_device *udev, struct usb_endpoint *ep) in usb_endpoint_foreach() argument
560 if (udev == NULL) in usb_endpoint_foreach()
563 ep_end = udev->endpoints + udev->endpoints_max; in usb_endpoint_foreach()
567 ep = udev->endpoints; in usb_endpoint_foreach()
587 usb_wait_pending_refs(struct usb_device *udev) in usb_wait_pending_refs() argument
590 DPRINTF("Refcount = %d\n", (int)udev->refcount); in usb_wait_pending_refs()
593 udev->refcount--; in usb_wait_pending_refs()
596 if (udev->refcount == 0) { in usb_wait_pending_refs()
598 udev->refcount = USB_DEV_REF_MAX; in usb_wait_pending_refs()
601 cv_wait(&udev->ref_cv, &usb_ref_lock); in usb_wait_pending_refs()
616 usb_unconfigure(struct usb_device *udev, uint8_t flag) in usb_unconfigure() argument
621 do_unlock = usbd_enum_lock(udev); in usb_unconfigure()
624 usb_detach_device(udev, USB_IFACE_INDEX_ANY, flag); in usb_unconfigure()
628 usb_fifo_free_wrap(udev, USB_IFACE_INDEX_ANY, flag); in usb_unconfigure()
633 usb_cdev_free(udev); in usb_unconfigure()
638 if (udev->linux_endpoint_start != NULL) { in usb_unconfigure()
639 usb_linux_free_device_p(udev); in usb_unconfigure()
640 udev->linux_endpoint_start = NULL; in usb_unconfigure()
644 usb_config_parse(udev, USB_IFACE_INDEX_ANY, USB_CFG_FREE); in usb_unconfigure()
647 if (udev->cdesc != NULL) { in usb_unconfigure()
648 if (udev->flags.usb_mode != USB_MODE_DEVICE) in usb_unconfigure()
649 usbd_free_config_desc(udev, udev->cdesc); in usb_unconfigure()
650 udev->cdesc = NULL; in usb_unconfigure()
653 udev->curr_config_no = USB_UNCONFIG_NO; in usb_unconfigure()
654 udev->curr_config_index = USB_UNCONFIG_INDEX; in usb_unconfigure()
657 usbd_enum_unlock(udev); in usb_unconfigure()
672 usbd_set_config_index(struct usb_device *udev, uint8_t index) in usbd_set_config_index() argument
682 DPRINTFN(6, "udev=%p index=%d\n", udev, index); in usbd_set_config_index()
685 do_unlock = usbd_enum_lock(udev); in usbd_set_config_index()
687 usb_unconfigure(udev, 0); in usbd_set_config_index()
695 err = usbd_req_set_config(udev, NULL, USB_UNCONFIG_NO); in usbd_set_config_index()
696 if (udev->state == USB_STATE_CONFIGURED) in usbd_set_config_index()
697 usb_set_device_state(udev, USB_STATE_ADDRESSED); in usbd_set_config_index()
701 if (udev->flags.usb_mode == USB_MODE_DEVICE) { in usbd_set_config_index()
703 err = usbd_req_get_descriptor_ptr(udev, &cdp, in usbd_set_config_index()
707 err = usbd_req_get_config_desc_full(udev, in usbd_set_config_index()
715 udev->cdesc = cdp; in usbd_set_config_index()
719 if ((!udev->flags.uq_bus_powered) && in usbd_set_config_index()
721 (udev->flags.usb_mode == USB_MODE_HOST)) { in usbd_set_config_index()
725 err = usbd_req_get_device_status(udev, NULL, &ds); in usbd_set_config_index()
740 udev, cdp, in usbd_set_config_index()
741 udev->address, cdp->bConfigurationValue, cdp->bmAttributes, in usbd_set_config_index()
747 if (udev->parent_hub) { in usbd_set_config_index()
748 max_power = udev->parent_hub->hub->portpower; in usbd_set_config_index()
759 if (udev->flags.usb_mode == USB_MODE_HOST) { in usbd_set_config_index()
760 udev->flags.self_powered = selfpowered; in usbd_set_config_index()
762 udev->power = power; in usbd_set_config_index()
763 udev->curr_config_no = cdp->bConfigurationValue; in usbd_set_config_index()
764 udev->curr_config_index = index; in usbd_set_config_index()
765 usb_set_device_state(udev, USB_STATE_CONFIGURED); in usbd_set_config_index()
768 err = usbd_req_set_config(udev, NULL, cdp->bConfigurationValue); in usbd_set_config_index()
773 err = usb_config_parse(udev, USB_IFACE_INDEX_ANY, USB_CFG_ALLOC); in usbd_set_config_index()
778 err = usb_config_parse(udev, USB_IFACE_INDEX_ANY, USB_CFG_INIT); in usbd_set_config_index()
785 usb_cdev_create(udev); in usbd_set_config_index()
791 usb_unconfigure(udev, 0); in usbd_set_config_index()
794 usbd_enum_unlock(udev); in usbd_set_config_index()
816 usb_config_parse(struct usb_device *udev, uint8_t iface_index, uint8_t cmd) in usb_config_parse() argument
848 sx_assert(&udev->enum_sx, SA_LOCKED); in usb_config_parse()
852 ep = udev->endpoints; in usb_config_parse()
853 ep_max = udev->endpoints_max; in usb_config_parse()
883 while ((id = usb_idesc_foreach(udev->cdesc, &ips))) { in usb_config_parse()
884 iface = udev->ifaces + ips.iface_index; in usb_config_parse()
932 while ((ed = usb_edesc_foreach(udev->cdesc, ed))) { in usb_config_parse()
939 ep = udev->endpoints + temp; in usb_config_parse()
944 ecomp = usb_ed_comp_foreach(udev->cdesc, (void *)ed); in usb_config_parse()
948 usb_init_endpoint(udev, in usb_config_parse()
963 udev->ifaces_max = ips.iface_index; in usb_config_parse()
965 udev->ifaces = NULL; in usb_config_parse()
966 if (udev->ifaces_max != 0) { in usb_config_parse()
967 udev->ifaces = malloc(sizeof(*iface) * udev->ifaces_max, in usb_config_parse()
969 if (udev->ifaces == NULL) { in usb_config_parse()
977 udev->endpoints = malloc(sizeof(*ep) * ep_max, in usb_config_parse()
979 if (udev->endpoints == NULL) { in usb_config_parse()
984 udev->endpoints = NULL; in usb_config_parse()
987 USB_BUS_LOCK(udev->bus); in usb_config_parse()
988 udev->endpoints_max = ep_max; in usb_config_parse()
990 udev->ep_curr = NULL; in usb_config_parse()
991 USB_BUS_UNLOCK(udev->bus); in usb_config_parse()
999 USB_BUS_LOCK(udev->bus); in usb_config_parse()
1000 udev->endpoints_max = 0; in usb_config_parse()
1002 udev->ep_curr = NULL; in usb_config_parse()
1003 USB_BUS_UNLOCK(udev->bus); in usb_config_parse()
1006 free(udev->ifaces, M_USB); in usb_config_parse()
1007 udev->ifaces = NULL; in usb_config_parse()
1010 free(udev->endpoints, M_USB); in usb_config_parse()
1011 udev->endpoints = NULL; in usb_config_parse()
1013 udev->ifaces_max = 0; in usb_config_parse()
1034 usbd_set_alt_interface_index(struct usb_device *udev, in usbd_set_alt_interface_index() argument
1037 struct usb_interface *iface = usbd_get_iface(udev, iface_index); in usbd_set_alt_interface_index()
1042 do_unlock = usbd_enum_lock(udev); in usbd_set_alt_interface_index()
1061 usb_fifo_free_wrap(udev, iface_index, 0); in usbd_set_alt_interface_index()
1064 err = usb_config_parse(udev, iface_index, alt_index); in usbd_set_alt_interface_index()
1074 err = usbd_req_set_alt_interface_no(udev, NULL, iface_index, in usbd_set_alt_interface_index()
1079 usbd_enum_unlock(udev); in usbd_set_alt_interface_index()
1094 usbd_set_endpoint_stall(struct usb_device *udev, struct usb_endpoint *ep, in usbd_set_endpoint_stall() argument
1124 USB_BUS_LOCK(udev->bus); in usbd_set_endpoint_stall()
1132 USB_BUS_UNLOCK(udev->bus); in usbd_set_endpoint_stall()
1152 (udev->bus->methods->xfer_stall) (xfer); in usbd_set_endpoint_stall()
1156 (udev->bus->methods->set_stall) (udev, ep, &do_stall); in usbd_set_endpoint_stall()
1162 (udev->bus->methods->clear_stall) (udev, ep); in usbd_set_endpoint_stall()
1170 USB_BUS_UNLOCK(udev->bus); in usbd_set_endpoint_stall()
1178 usb_reset_iface_endpoints(struct usb_device *udev, uint8_t iface_index) in usb_reset_iface_endpoints() argument
1183 ep = udev->endpoints; in usb_reset_iface_endpoints()
1184 ep_end = udev->endpoints + udev->endpoints_max; in usb_reset_iface_endpoints()
1192 usbd_set_endpoint_stall(udev, ep, 0); in usb_reset_iface_endpoints()
1206 usb_detach_device_sub(struct usb_device *udev, device_t *ppdev, in usb_detach_device_sub() argument
1225 device_get_nameunit(udev->parent_dev), in usb_detach_device_sub()
1226 udev->port_no, udev->address); in usb_detach_device_sub()
1230 if (udev->flags.peer_suspended) { in usb_detach_device_sub()
1238 if (device_delete_child(udev->parent_dev, dev)) { in usb_detach_device_sub()
1264 usb_detach_device(struct usb_device *udev, uint8_t iface_index, in usb_detach_device() argument
1270 if (udev == NULL) { in usb_detach_device()
1274 DPRINTFN(4, "udev=%p\n", udev); in usb_detach_device()
1276 sx_assert(&udev->enum_sx, SA_LOCKED); in usb_detach_device()
1295 iface = usbd_get_iface(udev, i); in usb_detach_device()
1300 usb_detach_device_sub(udev, &iface->subdev, in usb_detach_device()
1313 usb_probe_and_attach_sub(struct usb_device *udev, in usb_probe_and_attach_sub() argument
1337 if (device_delete_child(udev->parent_dev, dev)) { in usb_probe_and_attach_sub()
1348 uaa->temp_dev = device_add_child(udev->parent_dev, NULL, -1); in usb_probe_and_attach_sub()
1350 device_printf(udev->parent_dev, in usb_probe_and_attach_sub()
1371 if (udev->flags.peer_suspended) { in usb_probe_and_attach_sub()
1395 usbd_set_parent_iface(struct usb_device *udev, uint8_t iface_index, in usbd_set_parent_iface() argument
1400 if (udev == NULL || iface_index == parent_index) { in usbd_set_parent_iface()
1404 iface = usbd_get_iface(udev, iface_index); in usbd_set_parent_iface()
1410 usb_init_attach_arg(struct usb_device *udev, in usb_init_attach_arg() argument
1415 uaa->device = udev; in usb_init_attach_arg()
1416 uaa->usb_mode = udev->flags.usb_mode; in usb_init_attach_arg()
1417 uaa->port = udev->port_no; in usb_init_attach_arg()
1420 uaa->info.idVendor = UGETW(udev->ddesc.idVendor); in usb_init_attach_arg()
1421 uaa->info.idProduct = UGETW(udev->ddesc.idProduct); in usb_init_attach_arg()
1422 uaa->info.bcdDevice = UGETW(udev->ddesc.bcdDevice); in usb_init_attach_arg()
1423 uaa->info.bDeviceClass = udev->ddesc.bDeviceClass; in usb_init_attach_arg()
1424 uaa->info.bDeviceSubClass = udev->ddesc.bDeviceSubClass; in usb_init_attach_arg()
1425 uaa->info.bDeviceProtocol = udev->ddesc.bDeviceProtocol; in usb_init_attach_arg()
1426 uaa->info.bConfigIndex = udev->curr_config_index; in usb_init_attach_arg()
1427 uaa->info.bConfigNum = udev->curr_config_no; in usb_init_attach_arg()
1441 usb_probe_and_attach(struct usb_device *udev, uint8_t iface_index) in usb_probe_and_attach() argument
1449 if (udev == NULL) { in usb_probe_and_attach()
1454 do_unlock = usbd_enum_lock(udev); in usb_probe_and_attach()
1456 if (udev->curr_config_index == USB_UNCONFIG_INDEX) { in usb_probe_and_attach()
1462 usb_init_attach_arg(udev, &uaa); in usb_probe_and_attach()
1470 usb_dymo_eject(udev, 0) == 0) { in usb_probe_and_attach()
1475 EVENTHANDLER_INVOKE(usb_dev_configured, udev, &uaa); in usb_probe_and_attach()
1479 usb_unconfigure(udev, 0); in usb_probe_and_attach()
1495 iface = usbd_get_iface(udev, i); in usb_probe_and_attach()
1529 usb_probe_and_attach_sub(udev, &uaa); in usb_probe_and_attach()
1538 if (device_delete_child(udev->parent_dev, uaa.temp_dev)) in usb_probe_and_attach()
1544 usbd_enum_unlock(udev); in usb_probe_and_attach()
1555 usb_suspend_resume_sub(struct usb_device *udev, device_t dev, uint8_t do_suspend) in usb_suspend_resume_sub() argument
1586 usb_suspend_resume(struct usb_device *udev, uint8_t do_suspend) in usb_suspend_resume() argument
1591 if (udev == NULL) { in usb_suspend_resume()
1595 DPRINTFN(4, "udev=%p do_suspend=%d\n", udev, do_suspend); in usb_suspend_resume()
1597 sx_assert(&udev->sr_sx, SA_LOCKED); in usb_suspend_resume()
1599 USB_BUS_LOCK(udev->bus); in usb_suspend_resume()
1601 if (udev->flags.peer_suspended == do_suspend) { in usb_suspend_resume()
1602 USB_BUS_UNLOCK(udev->bus); in usb_suspend_resume()
1606 udev->flags.peer_suspended = do_suspend; in usb_suspend_resume()
1607 USB_BUS_UNLOCK(udev->bus); in usb_suspend_resume()
1612 iface = usbd_get_iface(udev, i); in usb_suspend_resume()
1617 usb_suspend_resume_sub(udev, iface->subdev, do_suspend); in usb_suspend_resume()
1631 struct usb_device *udev = pm->udev; in usbd_clear_stall_proc() local
1634 USB_BUS_UNLOCK(udev->bus); in usbd_clear_stall_proc()
1635 USB_MTX_LOCK(&udev->device_mtx); in usbd_clear_stall_proc()
1638 usbd_transfer_start(udev->ctrl_xfer[1]); in usbd_clear_stall_proc()
1641 USB_MTX_UNLOCK(&udev->device_mtx); in usbd_clear_stall_proc()
1642 USB_BUS_LOCK(udev->bus); in usbd_clear_stall_proc()
1651 usb_get_langid(struct usb_device *udev) in usb_get_langid() argument
1670 do_unlock = usbd_ctrl_lock(udev); in usb_get_langid()
1672 scratch_ptr = udev->scratch.data; in usb_get_langid()
1674 if (udev->flags.no_strings) { in usb_get_langid()
1676 } else if (udev->ddesc.iManufacturer || in usb_get_langid()
1677 udev->ddesc.iProduct || in usb_get_langid()
1678 udev->ddesc.iSerialNumber) { in usb_get_langid()
1680 err = usbd_req_get_string_desc(udev, NULL, in usb_get_langid()
1687 udev->flags.no_strings = 1; in usb_get_langid()
1717 udev->langid = langid; in usb_get_langid()
1721 usbd_ctrl_unlock(udev); in usb_get_langid()
1742 struct usb_device *udev; in usb_alloc_device() local
1779 udev = malloc(sizeof(*udev), M_USB, M_WAITOK | M_ZERO); in usb_alloc_device()
1781 if (udev == NULL) { in usb_alloc_device()
1786 sx_init_flags(&udev->enum_sx, "USB config SX lock", SX_DUPOK); in usb_alloc_device()
1787 sx_init_flags(&udev->sr_sx, "USB suspend and resume SX lock", SX_NOWITNESS); in usb_alloc_device()
1788 sx_init_flags(&udev->ctrl_sx, "USB control transfer SX lock", SX_DUPOK); in usb_alloc_device()
1790 cv_init(&udev->ctrlreq_cv, "WCTRL"); in usb_alloc_device()
1791 cv_init(&udev->ref_cv, "UGONE"); in usb_alloc_device()
1794 mtx_init(&udev->device_mtx, "USB device mutex", NULL, MTX_DEF); in usb_alloc_device()
1797 udev->cs_msg[0].hdr.pm_callback = &usbd_clear_stall_proc; in usb_alloc_device()
1798 udev->cs_msg[0].udev = udev; in usb_alloc_device()
1799 udev->cs_msg[1].hdr.pm_callback = &usbd_clear_stall_proc; in usb_alloc_device()
1800 udev->cs_msg[1].udev = udev; in usb_alloc_device()
1803 udev->parent_hub = parent_hub; in usb_alloc_device()
1804 udev->parent_dev = parent_dev; in usb_alloc_device()
1805 udev->port_index = port_index; in usb_alloc_device()
1806 udev->port_no = port_no; in usb_alloc_device()
1807 udev->depth = depth; in usb_alloc_device()
1808 udev->bus = bus; in usb_alloc_device()
1809 udev->address = USB_START_ADDR; /* default value */ in usb_alloc_device()
1810 udev->plugtime = (usb_ticks_t)ticks; in usb_alloc_device()
1816 udev->power_mode = usbd_filter_power_mode(udev, USB_POWER_MODE_ON); in usb_alloc_device()
1817 udev->pwr_save.last_xfer_time = ticks; in usb_alloc_device()
1819 udev->refcount = 1; in usb_alloc_device()
1822 udev->ctrl_ep_desc.bLength = sizeof(udev->ctrl_ep_desc); in usb_alloc_device()
1823 udev->ctrl_ep_desc.bDescriptorType = UDESC_ENDPOINT; in usb_alloc_device()
1824 udev->ctrl_ep_desc.bEndpointAddress = USB_CONTROL_ENDPOINT; in usb_alloc_device()
1825 udev->ctrl_ep_desc.bmAttributes = UE_CONTROL; in usb_alloc_device()
1826 udev->ctrl_ep_desc.wMaxPacketSize[0] = USB_MAX_IPACKET; in usb_alloc_device()
1827 udev->ctrl_ep_desc.wMaxPacketSize[1] = 0; in usb_alloc_device()
1828 udev->ctrl_ep_desc.bInterval = 0; in usb_alloc_device()
1831 udev->ctrl_ep_comp_desc.bLength = sizeof(udev->ctrl_ep_comp_desc); in usb_alloc_device()
1832 udev->ctrl_ep_comp_desc.bDescriptorType = UDESC_ENDPOINT_SS_COMP; in usb_alloc_device()
1834 udev->ddesc.bMaxPacketSize = USB_MAX_IPACKET; in usb_alloc_device()
1836 udev->speed = speed; in usb_alloc_device()
1837 udev->flags.usb_mode = mode; in usb_alloc_device()
1841 adev = udev; in usb_alloc_device()
1842 hub = udev->parent_hub; in usb_alloc_device()
1846 udev->hs_hub_addr = hub->address; in usb_alloc_device()
1847 udev->parent_hs_hub = hub; in usb_alloc_device()
1848 udev->hs_port_no = adev->port_no; in usb_alloc_device()
1856 usb_init_endpoint(udev, 0, in usb_alloc_device()
1857 &udev->ctrl_ep_desc, in usb_alloc_device()
1858 &udev->ctrl_ep_comp_desc, in usb_alloc_device()
1859 &udev->ctrl_ep); in usb_alloc_device()
1862 udev->device_index = device_index; in usb_alloc_device()
1866 snprintf(udev->ugen_name, sizeof(udev->ugen_name), in usb_alloc_device()
1869 LIST_INIT(&udev->pd_list); in usb_alloc_device()
1872 udev->ctrl_dev = usb_make_dev(udev, NULL, 0, 0, in usb_alloc_device()
1876 if (udev->ctrl_dev != NULL) in usb_alloc_device()
1877 make_dev_alias(udev->ctrl_dev->cdev, "%s", udev->ugen_name); in usb_alloc_device()
1881 err = (bus->methods->device_init) (udev); in usb_alloc_device()
1890 usb_set_device_state(udev, USB_STATE_POWERED); in usb_alloc_device()
1892 if (udev->flags.usb_mode == USB_MODE_HOST) { in usb_alloc_device()
1893 err = usbd_req_set_address(udev, NULL, device_index); in usb_alloc_device()
1899 if (udev->address == USB_START_ADDR) in usb_alloc_device()
1900 udev->address = device_index; in usb_alloc_device()
1913 "(%s, ignored)\n", udev->address, in usb_alloc_device()
1918 udev->flags.self_powered = 0; in usb_alloc_device()
1921 udev->curr_config_no = USB_UNCONFIG_NO; in usb_alloc_device()
1922 udev->curr_config_index = USB_UNCONFIG_INDEX; in usb_alloc_device()
1925 err = (usb_temp_setup_by_index_p) (udev, usb_template); in usb_alloc_device()
1932 usb_set_device_state(udev, USB_STATE_ADDRESSED); in usb_alloc_device()
1935 err = usbd_setup_device_desc(udev, NULL); in usb_alloc_device()
1939 err = usbd_req_re_enumerate(udev, NULL); in usb_alloc_device()
1941 err = usbd_req_re_enumerate(udev, NULL); in usb_alloc_device()
1952 usb_init_attach_arg(udev, &uaa); in usb_alloc_device()
1955 udev->flags.uq_bus_powered = 1; in usb_alloc_device()
1958 udev->flags.no_strings = 1; in usb_alloc_device()
1961 usb_get_langid(udev); in usb_alloc_device()
1964 udev->power = USB_MIN_POWER; in usb_alloc_device()
1966 usb_set_device_strings(udev); in usb_alloc_device()
1968 if (udev->flags.usb_mode == USB_MODE_DEVICE) { in usb_alloc_device()
2004 err = usbd_set_config_index(udev, config_index); in usb_alloc_device()
2006 if (udev->ddesc.bNumConfigurations != 0) { in usb_alloc_device()
2010 err = usbd_req_re_enumerate(udev, NULL); in usb_alloc_device()
2016 config_index, usbd_errstr(err), udev->port_no, in usb_alloc_device()
2017 udev->address); in usb_alloc_device()
2026 if (!config_quirk && config_index + 1 < udev->ddesc.bNumConfigurations) { in usb_alloc_device()
2027 if ((udev->cdesc->bNumInterface < 2) && in usb_alloc_device()
2028 usbd_get_no_descriptors(udev->cdesc, UDESC_ENDPOINT) == 0) { in usb_alloc_device()
2039 if (usb_iface_is_cdrom(udev, 0)) { in usb_alloc_device()
2059 err = usb_msc_auto_quirk(udev, 0, &uaa); in usb_alloc_device()
2070 udev->address, udev, udev->parent_hub); in usb_alloc_device()
2074 parent_hub->hub->ports + port_index : NULL, udev, device_index); in usb_alloc_device()
2078 udev->ugen_symlink = usb_alloc_symlink(udev->ugen_name); in usb_alloc_device()
2081 printf("%s: <%s %s> at %s\n", udev->ugen_name, in usb_alloc_device()
2082 usb_get_manufacturer(udev), usb_get_product(udev), in usb_alloc_device()
2083 device_get_nameunit(udev->bus->bdev)); in usb_alloc_device()
2087 usb_notify_addq("ATTACH", udev); in usb_alloc_device()
2094 usb_free_device(udev, 0); in usb_alloc_device()
2095 udev = NULL; in usb_alloc_device()
2097 return (udev); in usb_alloc_device()
2102 usb_make_dev(struct usb_device *udev, const char *devname, int ep, in usb_make_dev() argument
2112 pd->bus_index = device_get_unit(udev->bus->bdev); in usb_make_dev()
2113 pd->dev_index = udev->device_index; in usb_make_dev()
2185 usb_cdev_create(struct usb_device *udev) in usb_cdev_create() argument
2194 KASSERT(LIST_FIRST(&udev->pd_list) == NULL, ("stale cdev entries")); in usb_cdev_create()
2198 if (usbd_get_mode(udev) == USB_MODE_DEVICE) { in usb_cdev_create()
2214 cd = usbd_get_config_descriptor(udev); in usb_cdev_create()
2237 pd = usb_make_dev(udev, NULL, ep, 0, in usb_cdev_create()
2241 LIST_INSERT_HEAD(&udev->pd_list, pd, pd_next); in usb_cdev_create()
2246 usb_cdev_free(struct usb_device *udev) in usb_cdev_free() argument
2252 while ((pd = LIST_FIRST(&udev->pd_list)) != NULL) { in usb_cdev_free()
2271 usb_free_device(struct usb_device *udev, uint8_t flag) in usb_free_device() argument
2275 if (udev == NULL) in usb_free_device()
2278 DPRINTFN(4, "udev=%p port=%d\n", udev, udev->port_no); in usb_free_device()
2280 bus = udev->bus; in usb_free_device()
2283 usb_set_device_state(udev, USB_STATE_DETACHED); in usb_free_device()
2286 usb_notify_addq("DETACH", udev); in usb_free_device()
2291 printf("%s: <%s %s> at %s (disconnected)\n", udev->ugen_name, in usb_free_device()
2292 usb_get_manufacturer(udev), usb_get_product(udev), in usb_free_device()
2297 if (udev->ugen_symlink) { in usb_free_device()
2298 usb_free_symlink(udev->ugen_symlink); in usb_free_device()
2299 udev->ugen_symlink = NULL; in usb_free_device()
2302 usb_destroy_dev(udev->ctrl_dev); in usb_free_device()
2305 if (udev->flags.usb_mode == USB_MODE_DEVICE) { in usb_free_device()
2307 usbd_transfer_unsetup(udev->ctrl_xfer, USB_CTRL_XFER_MAX); in usb_free_device()
2311 usb_unconfigure(udev, USB_UNCFG_FLAG_FREE_EP0); in usb_free_device()
2314 usb_bus_port_set_device(bus, udev->parent_hub ? in usb_free_device()
2315 udev->parent_hub->hub->ports + udev->port_index : NULL, in usb_free_device()
2319 usbd_transfer_unsetup(udev->ctrl_xfer, USB_CTRL_XFER_MAX); in usb_free_device()
2322 (usb_temp_unsetup_p) (udev); in usb_free_device()
2328 USB_BUS_LOCK(udev->bus); in usb_free_device()
2329 usb_proc_mwait(USB_BUS_CS_PROC(udev->bus), in usb_free_device()
2330 &udev->cs_msg[0], &udev->cs_msg[1]); in usb_free_device()
2331 USB_BUS_UNLOCK(udev->bus); in usb_free_device()
2334 usb_wait_pending_refs(udev); in usb_free_device()
2336 sx_destroy(&udev->enum_sx); in usb_free_device()
2337 sx_destroy(&udev->sr_sx); in usb_free_device()
2338 sx_destroy(&udev->ctrl_sx); in usb_free_device()
2340 cv_destroy(&udev->ctrlreq_cv); in usb_free_device()
2341 cv_destroy(&udev->ref_cv); in usb_free_device()
2343 mtx_destroy(&udev->device_mtx); in usb_free_device()
2345 KASSERT(LIST_FIRST(&udev->pd_list) == NULL, ("leaked cdev entries")); in usb_free_device()
2350 (bus->methods->device_uninit) (udev); in usb_free_device()
2353 free(udev->serial, M_USB); in usb_free_device()
2354 free(udev->manufacturer, M_USB); in usb_free_device()
2355 free(udev->product, M_USB); in usb_free_device()
2356 free(udev, M_USB); in usb_free_device()
2370 usbd_get_iface(struct usb_device *udev, uint8_t iface_index) in usbd_get_iface() argument
2372 struct usb_interface *iface = udev->ifaces + iface_index; in usbd_get_iface()
2374 if (iface_index >= udev->ifaces_max) in usbd_get_iface()
2395 usbd_find_descriptor(struct usb_device *udev, void *id, uint8_t iface_index, in usbd_find_descriptor() argument
2403 cd = usbd_get_config_descriptor(udev); in usbd_find_descriptor()
2408 iface = usbd_get_iface(udev, iface_index); in usbd_find_descriptor()
2440 usb_devinfo(struct usb_device *udev, char *dst_ptr, uint16_t dst_len) in usb_devinfo() argument
2442 struct usb_device_descriptor *udd = &udev->ddesc; in usb_devinfo()
2452 usb_get_manufacturer(udev), in usb_devinfo()
2453 usb_get_product(udev), in usb_devinfo()
2457 udev->address); in usb_devinfo()
2461 usb_get_manufacturer(udev), in usb_devinfo()
2462 usb_get_product(udev), in usb_devinfo()
2465 udev->address); in usb_devinfo()
2488 usb_set_device_strings(struct usb_device *udev) in usb_set_device_strings() argument
2490 struct usb_device_descriptor *udd = &udev->ddesc; in usb_set_device_strings()
2501 do_unlock = usbd_ctrl_lock(udev); in usb_set_device_strings()
2503 temp_ptr = (char *)udev->scratch.data; in usb_set_device_strings()
2504 temp_size = sizeof(udev->scratch.data); in usb_set_device_strings()
2510 free(udev->serial, M_USB); in usb_set_device_strings()
2511 free(udev->manufacturer, M_USB); in usb_set_device_strings()
2512 free(udev->product, M_USB); in usb_set_device_strings()
2515 udev->serial = NULL; in usb_set_device_strings()
2516 udev->manufacturer = NULL; in usb_set_device_strings()
2517 udev->product = NULL; in usb_set_device_strings()
2520 usbd_req_get_string_any(udev, NULL, temp_ptr, temp_size, in usb_set_device_strings()
2521 udev->ddesc.iSerialNumber); in usb_set_device_strings()
2522 udev->serial = strdup(temp_ptr, M_USB); in usb_set_device_strings()
2525 usbd_req_get_string_any(udev, NULL, temp_ptr, temp_size, in usb_set_device_strings()
2526 udev->ddesc.iManufacturer); in usb_set_device_strings()
2529 udev->manufacturer = strdup(temp_ptr, M_USB); in usb_set_device_strings()
2532 usbd_req_get_string_any(udev, NULL, temp_ptr, temp_size, in usb_set_device_strings()
2533 udev->ddesc.iProduct); in usb_set_device_strings()
2536 udev->product = strdup(temp_ptr, M_USB); in usb_set_device_strings()
2539 if (udev->manufacturer == NULL || udev->product == NULL) { in usb_set_device_strings()
2548 if (udev->manufacturer == NULL) { in usb_set_device_strings()
2549 udev->manufacturer = strdup(kdp->vendorname, in usb_set_device_strings()
2552 if (udev->product == NULL && in usb_set_device_strings()
2554 udev->product = strdup(kdp->productname, in usb_set_device_strings()
2561 if (udev->manufacturer == NULL) { in usb_set_device_strings()
2563 udev->manufacturer = strdup(temp_ptr, M_USB); in usb_set_device_strings()
2565 if (udev->product == NULL) { in usb_set_device_strings()
2567 udev->product = strdup(temp_ptr, M_USB); in usb_set_device_strings()
2571 usbd_ctrl_unlock(udev); in usb_set_device_strings()
2579 usbd_get_mode(struct usb_device *udev) in usbd_get_mode() argument
2581 return (udev->flags.usb_mode); in usbd_get_mode()
2589 usbd_get_speed(struct usb_device *udev) in usbd_get_speed() argument
2591 return (udev->speed); in usbd_get_speed()
2595 usbd_get_isoc_fps(struct usb_device *udev) in usbd_get_isoc_fps() argument
2598 switch (udev->speed) { in usbd_get_isoc_fps()
2608 usbd_get_device_descriptor(struct usb_device *udev) in usbd_get_device_descriptor() argument
2610 if (udev == NULL) in usbd_get_device_descriptor()
2612 return (&udev->ddesc); in usbd_get_device_descriptor()
2616 usbd_get_config_descriptor(struct usb_device *udev) in usbd_get_config_descriptor() argument
2618 if (udev == NULL) in usbd_get_config_descriptor()
2620 return (udev->cdesc); in usbd_get_config_descriptor()
2668 usbd_get_bus_index(struct usb_device *udev) in usbd_get_bus_index() argument
2670 return ((uint8_t)device_get_unit(udev->bus->bdev)); in usbd_get_bus_index()
2674 usbd_get_device_index(struct usb_device *udev) in usbd_get_device_index() argument
2676 return (udev->device_index); in usbd_get_device_index()
2681 usb_notify_addq(const char *type, struct usb_device *udev) in usb_notify_addq() argument
2707 udev->ugen_name, in usb_notify_addq()
2708 udev->ugen_name, in usb_notify_addq()
2710 UGETW(udev->ddesc.idVendor), in usb_notify_addq()
2711 UGETW(udev->ddesc.idProduct), in usb_notify_addq()
2712 udev->ddesc.bDeviceClass, in usb_notify_addq()
2713 udev->ddesc.bDeviceSubClass, in usb_notify_addq()
2714 usb_get_serial(udev), in usb_notify_addq()
2715 UGETW(udev->ddesc.bcdDevice), in usb_notify_addq()
2716 (udev->flags.usb_mode == USB_MODE_HOST) ? "host" : "device", in usb_notify_addq()
2717 udev->port_no in usb_notify_addq()
2719 , udev->parent_hub != NULL ? in usb_notify_addq()
2720 udev->parent_hub->ugen_name : in usb_notify_addq()
2721 device_get_nameunit(device_get_parent(udev->bus->bdev)) in usb_notify_addq()
2730 iface = usbd_get_iface(udev, i); in usb_notify_addq()
2755 udev->ugen_name, in usb_notify_addq()
2756 udev->ugen_name, in usb_notify_addq()
2758 UGETW(udev->ddesc.idVendor), in usb_notify_addq()
2759 UGETW(udev->ddesc.idProduct), in usb_notify_addq()
2760 udev->ddesc.bDeviceClass, in usb_notify_addq()
2761 udev->ddesc.bDeviceSubClass, in usb_notify_addq()
2762 usb_get_serial(udev), in usb_notify_addq()
2763 UGETW(udev->ddesc.bcdDevice), in usb_notify_addq()
2764 (udev->flags.usb_mode == USB_MODE_HOST) ? "host" : "device", in usb_notify_addq()
2791 usb_fifo_free_wrap(struct usb_device *udev, in usb_fifo_free_wrap() argument
2801 f = udev->fifo[i]; in usb_fifo_free_wrap()
2845 usb_peer_can_wakeup(struct usb_device *udev) in usb_peer_can_wakeup() argument
2849 cdp = udev->cdesc; in usb_peer_can_wakeup()
2850 if ((cdp != NULL) && (udev->flags.usb_mode == USB_MODE_HOST)) { in usb_peer_can_wakeup()
2857 usb_set_device_state(struct usb_device *udev, enum usb_dev_state state) in usb_set_device_state() argument
2862 DPRINTF("udev %p state %s -> %s\n", udev, in usb_set_device_state()
2863 usb_statestr(udev->state), usb_statestr(state)); in usb_set_device_state()
2868 udev->state = state; in usb_set_device_state()
2872 if (udev->bus->methods->device_state_change != NULL) in usb_set_device_state()
2873 (udev->bus->methods->device_state_change) (udev); in usb_set_device_state()
2877 usb_get_device_state(struct usb_device *udev) in usb_get_device_state() argument
2879 if (udev == NULL) in usb_get_device_state()
2881 return (udev->state); in usb_get_device_state()
2885 usbd_device_attached(struct usb_device *udev) in usbd_device_attached() argument
2887 return (udev->state > USB_STATE_DETACHED); in usbd_device_attached()
2896 usbd_enum_lock(struct usb_device *udev) in usbd_enum_lock() argument
2898 if (sx_xlocked(&udev->enum_sx)) in usbd_enum_lock()
2901 sx_xlock(&udev->enum_sx); in usbd_enum_lock()
2902 sx_xlock(&udev->sr_sx); in usbd_enum_lock()
2918 usbd_enum_lock_sig(struct usb_device *udev) in usbd_enum_lock_sig() argument
2920 if (sx_xlocked(&udev->enum_sx)) in usbd_enum_lock_sig()
2922 if (sx_xlock_sig(&udev->enum_sx)) in usbd_enum_lock_sig()
2924 if (sx_xlock_sig(&udev->sr_sx)) { in usbd_enum_lock_sig()
2925 sx_xunlock(&udev->enum_sx); in usbd_enum_lock_sig()
2936 usbd_enum_unlock(struct usb_device *udev) in usbd_enum_unlock() argument
2939 sx_xunlock(&udev->enum_sx); in usbd_enum_unlock()
2940 sx_xunlock(&udev->sr_sx); in usbd_enum_unlock()
2946 usbd_sr_lock(struct usb_device *udev) in usbd_sr_lock() argument
2948 sx_xlock(&udev->sr_sx); in usbd_sr_lock()
2960 usbd_sr_unlock(struct usb_device *udev) in usbd_sr_unlock() argument
2963 sx_xunlock(&udev->sr_sx); in usbd_sr_unlock()
2972 usbd_enum_is_locked(struct usb_device *udev) in usbd_enum_is_locked() argument
2974 return (sx_xlocked(&udev->enum_sx)); in usbd_enum_is_locked()
2983 usbd_ctrl_lock(struct usb_device *udev) in usbd_ctrl_lock() argument
2985 if (sx_xlocked(&udev->ctrl_sx)) in usbd_ctrl_lock()
2987 sx_xlock(&udev->ctrl_sx); in usbd_ctrl_lock()
2993 if (usbd_enum_is_locked(udev)) in usbd_ctrl_lock()
2994 usbd_sr_unlock(udev); in usbd_ctrl_lock()
2999 usbd_ctrl_unlock(struct usb_device *udev) in usbd_ctrl_unlock() argument
3001 sx_xunlock(&udev->ctrl_sx); in usbd_ctrl_unlock()
3007 if (usbd_enum_is_locked(udev)) in usbd_ctrl_unlock()
3008 usbd_sr_lock(udev); in usbd_ctrl_unlock()
3021 usbd_set_pnpinfo(struct usb_device *udev, uint8_t iface_index, const char *pnpinfo) in usbd_set_pnpinfo() argument
3025 iface = usbd_get_iface(udev, iface_index); in usbd_set_pnpinfo()
3045 usbd_add_dynamic_quirk(struct usb_device *udev, uint16_t quirk) in usbd_add_dynamic_quirk() argument
3050 if (udev->autoQuirk[x] == 0 || in usbd_add_dynamic_quirk()
3051 udev->autoQuirk[x] == quirk) { in usbd_add_dynamic_quirk()
3052 udev->autoQuirk[x] = quirk; in usbd_add_dynamic_quirk()
3065 usbd_set_endpoint_mode(struct usb_device *udev, struct usb_endpoint *ep, in usbd_set_endpoint_mode() argument
3072 do_unlock = usbd_enum_lock(udev); in usbd_set_endpoint_mode()
3074 if (udev->bus->methods->set_endpoint_mode != NULL) { in usbd_set_endpoint_mode()
3075 error = (udev->bus->methods->set_endpoint_mode) ( in usbd_set_endpoint_mode()
3076 udev, ep, ep_mode); in usbd_set_endpoint_mode()
3087 usbd_enum_unlock(udev); in usbd_set_endpoint_mode()
3092 usbd_get_endpoint_mode(struct usb_device *udev, struct usb_endpoint *ep) in usbd_get_endpoint_mode() argument