Lines Matching refs:udev

139 	struct usb_device *udev;  in usb_trigger_reprobe_on_off()  local
155 udev = bus->devices[USB_ROOT_HUB_ADDR]; in usb_trigger_reprobe_on_off()
157 if (udev->refcount == USB_DEV_REF_MAX) { in usb_trigger_reprobe_on_off()
162 udev->refcount++; in usb_trigger_reprobe_on_off()
165 do_unlock = usbd_enum_lock(udev); in usb_trigger_reprobe_on_off()
171 err = usbd_req_get_port_status(udev, NULL, &ps, 1); in usb_trigger_reprobe_on_off()
182 err = usbd_req_set_port_feature(udev, NULL, 1, in usb_trigger_reprobe_on_off()
189 err = usbd_req_clear_port_feature(udev, NULL, 1, in usb_trigger_reprobe_on_off()
200 usbd_enum_unlock(udev); in usb_trigger_reprobe_on_off()
201 if (--(udev->refcount) == 0) in usb_trigger_reprobe_on_off()
202 cv_broadcast(&udev->ref_cv); in usb_trigger_reprobe_on_off()
280 usb_get_manufacturer(struct usb_device *udev) in usb_get_manufacturer() argument
282 return (udev->manufacturer ? udev->manufacturer : "Unknown"); in usb_get_manufacturer()
286 usb_get_product(struct usb_device *udev) in usb_get_product() argument
288 return (udev->product ? udev->product : ""); in usb_get_product()
292 usb_get_serial(struct usb_device *udev) in usb_get_serial() argument
294 return (udev->serial ? udev->serial : ""); in usb_get_serial()
308 usbd_get_ep_by_addr(struct usb_device *udev, uint8_t ea_val) in usbd_get_ep_by_addr() argument
310 struct usb_endpoint *ep = udev->endpoints; in usbd_get_ep_by_addr()
311 struct usb_endpoint *ep_end = udev->endpoints + udev->endpoints_max; in usbd_get_ep_by_addr()
339 if ((udev->ctrl_ep.edesc != NULL) && in usbd_get_ep_by_addr()
340 ((udev->ctrl_ep.edesc->bEndpointAddress & EA_MASK) == ea_val)) { in usbd_get_ep_by_addr()
341 ep = &udev->ctrl_ep; in usbd_get_ep_by_addr()
361 usbd_get_endpoint(struct usb_device *udev, uint8_t iface_index, in usbd_get_endpoint() argument
364 struct usb_endpoint *ep = udev->endpoints; in usbd_get_endpoint()
365 struct usb_endpoint *ep_end = udev->endpoints + udev->endpoints_max; in usbd_get_endpoint()
374 udev, iface_index, setup->endpoint, in usbd_get_endpoint()
380 udev->flags.usb_mode != setup->usb_mode) { in usbd_get_endpoint()
389 ea_val = (udev->flags.usb_mode == USB_MODE_DEVICE) ? in usbd_get_endpoint()
393 ea_val = (udev->flags.usb_mode == USB_MODE_DEVICE) ? in usbd_get_endpoint()
456 if ((udev->ctrl_ep.edesc != NULL) && in usbd_get_endpoint()
457 ((udev->ctrl_ep.edesc->bEndpointAddress & ea_mask) == ea_val) && in usbd_get_endpoint()
458 ((udev->ctrl_ep.edesc->bmAttributes & type_mask) == type_val) && in usbd_get_endpoint()
460 ep = &udev->ctrl_ep; in usbd_get_endpoint()
481 usbd_interface_count(struct usb_device *udev, uint8_t *count) in usbd_interface_count() argument
483 if (udev->cdesc == NULL) { in usbd_interface_count()
487 *count = udev->ifaces_max; in usbd_interface_count()
499 usb_init_endpoint(struct usb_device *udev, uint8_t iface_index, in usb_init_endpoint() argument
507 methods = udev->bus->methods; in usb_init_endpoint()
509 (methods->endpoint_init) (udev, edesc, ep); in usb_init_endpoint()
527 if (udev->speed == USB_SPEED_SUPER && ecomp != NULL && in usb_init_endpoint()
530 usbd_set_endpoint_mode(udev, ep, USB_EP_MODE_STREAMS); in usb_init_endpoint()
532 usbd_set_endpoint_mode(udev, ep, USB_EP_MODE_DEFAULT); in usb_init_endpoint()
537 USB_BUS_LOCK(udev->bus); in usb_init_endpoint()
538 (methods->clear_stall) (udev, ep); in usb_init_endpoint()
539 USB_BUS_UNLOCK(udev->bus); in usb_init_endpoint()
554 usb_endpoint_foreach(struct usb_device *udev, struct usb_endpoint *ep) in usb_endpoint_foreach() argument
559 if (udev == NULL) in usb_endpoint_foreach()
562 ep_end = udev->endpoints + udev->endpoints_max; in usb_endpoint_foreach()
566 ep = udev->endpoints; in usb_endpoint_foreach()
586 usb_wait_pending_refs(struct usb_device *udev) in usb_wait_pending_refs() argument
589 DPRINTF("Refcount = %d\n", (int)udev->refcount); in usb_wait_pending_refs()
592 udev->refcount--; in usb_wait_pending_refs()
595 if (udev->refcount == 0) { in usb_wait_pending_refs()
597 udev->refcount = USB_DEV_REF_MAX; in usb_wait_pending_refs()
600 cv_wait(&udev->ref_cv, &usb_ref_lock); in usb_wait_pending_refs()
615 usb_unconfigure(struct usb_device *udev, uint8_t flag) in usb_unconfigure() argument
620 do_unlock = usbd_enum_lock(udev); in usb_unconfigure()
623 usb_detach_device(udev, USB_IFACE_INDEX_ANY, flag); in usb_unconfigure()
627 usb_fifo_free_wrap(udev, USB_IFACE_INDEX_ANY, flag); in usb_unconfigure()
632 usb_cdev_free(udev); in usb_unconfigure()
637 if (udev->linux_endpoint_start != NULL) { in usb_unconfigure()
638 usb_linux_free_device_p(udev); in usb_unconfigure()
639 udev->linux_endpoint_start = NULL; in usb_unconfigure()
643 usb_config_parse(udev, USB_IFACE_INDEX_ANY, USB_CFG_FREE); in usb_unconfigure()
646 if (udev->cdesc != NULL) { in usb_unconfigure()
647 if (udev->flags.usb_mode != USB_MODE_DEVICE) in usb_unconfigure()
648 usbd_free_config_desc(udev, udev->cdesc); in usb_unconfigure()
649 udev->cdesc = NULL; in usb_unconfigure()
652 udev->curr_config_no = USB_UNCONFIG_NO; in usb_unconfigure()
653 udev->curr_config_index = USB_UNCONFIG_INDEX; in usb_unconfigure()
656 usbd_enum_unlock(udev); in usb_unconfigure()
671 usbd_set_config_index(struct usb_device *udev, uint8_t index) in usbd_set_config_index() argument
681 DPRINTFN(6, "udev=%p index=%d\n", udev, index); in usbd_set_config_index()
684 do_unlock = usbd_enum_lock(udev); in usbd_set_config_index()
686 usb_unconfigure(udev, 0); in usbd_set_config_index()
694 err = usbd_req_set_config(udev, NULL, USB_UNCONFIG_NO); in usbd_set_config_index()
695 if (udev->state == USB_STATE_CONFIGURED) in usbd_set_config_index()
696 usb_set_device_state(udev, USB_STATE_ADDRESSED); in usbd_set_config_index()
700 if (udev->flags.usb_mode == USB_MODE_DEVICE) { in usbd_set_config_index()
702 err = usbd_req_get_descriptor_ptr(udev, &cdp, in usbd_set_config_index()
706 err = usbd_req_get_config_desc_full(udev, in usbd_set_config_index()
714 udev->cdesc = cdp; in usbd_set_config_index()
718 if ((!udev->flags.uq_bus_powered) && in usbd_set_config_index()
720 (udev->flags.usb_mode == USB_MODE_HOST)) { in usbd_set_config_index()
724 err = usbd_req_get_device_status(udev, NULL, &ds); in usbd_set_config_index()
739 udev, cdp, in usbd_set_config_index()
740 udev->address, cdp->bConfigurationValue, cdp->bmAttributes, in usbd_set_config_index()
746 if (udev->parent_hub) { in usbd_set_config_index()
747 max_power = udev->parent_hub->hub->portpower; in usbd_set_config_index()
758 if (udev->flags.usb_mode == USB_MODE_HOST) { in usbd_set_config_index()
759 udev->flags.self_powered = selfpowered; in usbd_set_config_index()
761 udev->power = power; in usbd_set_config_index()
762 udev->curr_config_no = cdp->bConfigurationValue; in usbd_set_config_index()
763 udev->curr_config_index = index; in usbd_set_config_index()
764 usb_set_device_state(udev, USB_STATE_CONFIGURED); in usbd_set_config_index()
767 err = usbd_req_set_config(udev, NULL, cdp->bConfigurationValue); in usbd_set_config_index()
772 err = usb_config_parse(udev, USB_IFACE_INDEX_ANY, USB_CFG_ALLOC); in usbd_set_config_index()
777 err = usb_config_parse(udev, USB_IFACE_INDEX_ANY, USB_CFG_INIT); in usbd_set_config_index()
784 usb_cdev_create(udev); in usbd_set_config_index()
790 usb_unconfigure(udev, 0); in usbd_set_config_index()
793 usbd_enum_unlock(udev); in usbd_set_config_index()
815 usb_config_parse(struct usb_device *udev, uint8_t iface_index, uint8_t cmd) in usb_config_parse() argument
844 sx_assert(&udev->enum_sx, SA_LOCKED); in usb_config_parse()
849 ep = udev->endpoints; in usb_config_parse()
850 ep_max = udev->endpoints_max; in usb_config_parse()
861 ep = udev->endpoints; in usb_config_parse()
862 ep_max = udev->endpoints_max; in usb_config_parse()
877 udev->bus->methods->endpoint_uninit != NULL) in usb_config_parse()
878 udev->bus->methods->endpoint_uninit(udev, ep); in usb_config_parse()
897 while ((id = usb_idesc_foreach(udev->cdesc, &ips))) { in usb_config_parse()
898 iface = udev->ifaces + ips.iface_index; in usb_config_parse()
946 while ((ed = usb_edesc_foreach(udev->cdesc, ed))) { in usb_config_parse()
953 ep = udev->endpoints + temp; in usb_config_parse()
958 ecomp = usb_ed_comp_foreach(udev->cdesc, (void *)ed); in usb_config_parse()
962 usb_init_endpoint(udev, in usb_config_parse()
977 udev->ifaces_max = ips.iface_index; in usb_config_parse()
979 udev->ifaces = NULL; in usb_config_parse()
980 if (udev->ifaces_max != 0) { in usb_config_parse()
981 udev->ifaces = malloc(sizeof(*iface) * udev->ifaces_max, in usb_config_parse()
983 if (udev->ifaces == NULL) { in usb_config_parse()
991 udev->endpoints = malloc(sizeof(*ep) * ep_max, in usb_config_parse()
993 if (udev->endpoints == NULL) { in usb_config_parse()
998 udev->endpoints = NULL; in usb_config_parse()
1001 USB_BUS_LOCK(udev->bus); in usb_config_parse()
1002 udev->endpoints_max = ep_max; in usb_config_parse()
1004 udev->ep_curr = NULL; in usb_config_parse()
1005 USB_BUS_UNLOCK(udev->bus); in usb_config_parse()
1013 USB_BUS_LOCK(udev->bus); in usb_config_parse()
1014 udev->endpoints_max = 0; in usb_config_parse()
1016 udev->ep_curr = NULL; in usb_config_parse()
1017 USB_BUS_UNLOCK(udev->bus); in usb_config_parse()
1020 free(udev->ifaces, M_USB); in usb_config_parse()
1021 udev->ifaces = NULL; in usb_config_parse()
1024 free(udev->endpoints, M_USB); in usb_config_parse()
1025 udev->endpoints = NULL; in usb_config_parse()
1027 udev->ifaces_max = 0; in usb_config_parse()
1048 usbd_set_alt_interface_index(struct usb_device *udev, in usbd_set_alt_interface_index() argument
1051 struct usb_interface *iface = usbd_get_iface(udev, iface_index); in usbd_set_alt_interface_index()
1056 do_unlock = usbd_enum_lock(udev); in usbd_set_alt_interface_index()
1075 usb_fifo_free_wrap(udev, iface_index, 0); in usbd_set_alt_interface_index()
1078 err = usb_config_parse(udev, iface_index, alt_index); in usbd_set_alt_interface_index()
1088 err = usbd_req_set_alt_interface_no(udev, NULL, iface_index, in usbd_set_alt_interface_index()
1093 usbd_enum_unlock(udev); in usbd_set_alt_interface_index()
1108 usbd_set_endpoint_stall(struct usb_device *udev, struct usb_endpoint *ep, in usbd_set_endpoint_stall() argument
1138 USB_BUS_LOCK(udev->bus); in usbd_set_endpoint_stall()
1146 USB_BUS_UNLOCK(udev->bus); in usbd_set_endpoint_stall()
1166 (udev->bus->methods->xfer_stall) (xfer); in usbd_set_endpoint_stall()
1170 (udev->bus->methods->set_stall) (udev, ep, &do_stall); in usbd_set_endpoint_stall()
1176 (udev->bus->methods->clear_stall) (udev, ep); in usbd_set_endpoint_stall()
1184 USB_BUS_UNLOCK(udev->bus); in usbd_set_endpoint_stall()
1192 usb_reset_iface_endpoints(struct usb_device *udev, uint8_t iface_index) in usb_reset_iface_endpoints() argument
1197 ep = udev->endpoints; in usb_reset_iface_endpoints()
1198 ep_end = udev->endpoints + udev->endpoints_max; in usb_reset_iface_endpoints()
1206 usbd_set_endpoint_stall(udev, ep, 0); in usb_reset_iface_endpoints()
1220 usb_detach_device_sub(struct usb_device *udev, device_t *ppdev, in usb_detach_device_sub() argument
1239 device_get_nameunit(udev->parent_dev), in usb_detach_device_sub()
1240 udev->port_no, udev->address); in usb_detach_device_sub()
1244 if (udev->flags.peer_suspended) { in usb_detach_device_sub()
1252 if (device_delete_child(udev->parent_dev, dev)) { in usb_detach_device_sub()
1278 usb_detach_device(struct usb_device *udev, uint8_t iface_index, in usb_detach_device() argument
1284 if (udev == NULL) { in usb_detach_device()
1288 DPRINTFN(4, "udev=%p\n", udev); in usb_detach_device()
1290 sx_assert(&udev->enum_sx, SA_LOCKED); in usb_detach_device()
1309 iface = usbd_get_iface(udev, i); in usb_detach_device()
1314 usb_detach_device_sub(udev, &iface->subdev, in usb_detach_device()
1327 usb_probe_and_attach_sub(struct usb_device *udev, in usb_probe_and_attach_sub() argument
1351 if (device_delete_child(udev->parent_dev, dev)) { in usb_probe_and_attach_sub()
1362 uaa->temp_dev = device_add_child(udev->parent_dev, NULL, -1); in usb_probe_and_attach_sub()
1364 device_printf(udev->parent_dev, in usb_probe_and_attach_sub()
1385 if (udev->flags.peer_suspended) { in usb_probe_and_attach_sub()
1409 usbd_set_parent_iface(struct usb_device *udev, uint8_t iface_index, in usbd_set_parent_iface() argument
1414 if (udev == NULL || iface_index == parent_index) { in usbd_set_parent_iface()
1418 iface = usbd_get_iface(udev, iface_index); in usbd_set_parent_iface()
1424 usb_init_attach_arg(struct usb_device *udev, in usb_init_attach_arg() argument
1429 uaa->device = udev; in usb_init_attach_arg()
1430 uaa->usb_mode = udev->flags.usb_mode; in usb_init_attach_arg()
1431 uaa->port = udev->port_no; in usb_init_attach_arg()
1434 uaa->info.idVendor = UGETW(udev->ddesc.idVendor); in usb_init_attach_arg()
1435 uaa->info.idProduct = UGETW(udev->ddesc.idProduct); in usb_init_attach_arg()
1436 uaa->info.bcdDevice = UGETW(udev->ddesc.bcdDevice); in usb_init_attach_arg()
1437 uaa->info.bDeviceClass = udev->ddesc.bDeviceClass; in usb_init_attach_arg()
1438 uaa->info.bDeviceSubClass = udev->ddesc.bDeviceSubClass; in usb_init_attach_arg()
1439 uaa->info.bDeviceProtocol = udev->ddesc.bDeviceProtocol; in usb_init_attach_arg()
1440 uaa->info.bConfigIndex = udev->curr_config_index; in usb_init_attach_arg()
1441 uaa->info.bConfigNum = udev->curr_config_no; in usb_init_attach_arg()
1455 usb_probe_and_attach(struct usb_device *udev, uint8_t iface_index) in usb_probe_and_attach() argument
1463 if (udev == NULL) { in usb_probe_and_attach()
1468 do_unlock = usbd_enum_lock(udev); in usb_probe_and_attach()
1470 if (udev->curr_config_index == USB_UNCONFIG_INDEX) { in usb_probe_and_attach()
1476 usb_init_attach_arg(udev, &uaa); in usb_probe_and_attach()
1484 usb_dymo_eject(udev, 0) == 0) { in usb_probe_and_attach()
1489 EVENTHANDLER_INVOKE(usb_dev_configured, udev, &uaa); in usb_probe_and_attach()
1493 usb_unconfigure(udev, 0); in usb_probe_and_attach()
1509 iface = usbd_get_iface(udev, i); in usb_probe_and_attach()
1543 usb_probe_and_attach_sub(udev, &uaa); in usb_probe_and_attach()
1552 if (device_delete_child(udev->parent_dev, uaa.temp_dev)) in usb_probe_and_attach()
1558 usbd_enum_unlock(udev); in usb_probe_and_attach()
1569 usb_suspend_resume_sub(struct usb_device *udev, device_t dev, uint8_t do_suspend) in usb_suspend_resume_sub() argument
1600 usb_suspend_resume(struct usb_device *udev, uint8_t do_suspend) in usb_suspend_resume() argument
1605 if (udev == NULL) { in usb_suspend_resume()
1609 DPRINTFN(4, "udev=%p do_suspend=%d\n", udev, do_suspend); in usb_suspend_resume()
1611 sx_assert(&udev->sr_sx, SA_LOCKED); in usb_suspend_resume()
1613 USB_BUS_LOCK(udev->bus); in usb_suspend_resume()
1615 if (udev->flags.peer_suspended == do_suspend) { in usb_suspend_resume()
1616 USB_BUS_UNLOCK(udev->bus); in usb_suspend_resume()
1620 udev->flags.peer_suspended = do_suspend; in usb_suspend_resume()
1621 USB_BUS_UNLOCK(udev->bus); in usb_suspend_resume()
1626 iface = usbd_get_iface(udev, i); in usb_suspend_resume()
1631 usb_suspend_resume_sub(udev, iface->subdev, do_suspend); in usb_suspend_resume()
1645 struct usb_device *udev = pm->udev; in usbd_clear_stall_proc() local
1648 USB_BUS_UNLOCK(udev->bus); in usbd_clear_stall_proc()
1649 USB_MTX_LOCK(&udev->device_mtx); in usbd_clear_stall_proc()
1652 usbd_transfer_start(udev->ctrl_xfer[1]); in usbd_clear_stall_proc()
1655 USB_MTX_UNLOCK(&udev->device_mtx); in usbd_clear_stall_proc()
1656 USB_BUS_LOCK(udev->bus); in usbd_clear_stall_proc()
1665 usb_get_langid(struct usb_device *udev) in usb_get_langid() argument
1684 do_unlock = usbd_ctrl_lock(udev); in usb_get_langid()
1686 scratch_ptr = udev->scratch.data; in usb_get_langid()
1688 if (udev->flags.no_strings) { in usb_get_langid()
1690 } else if (udev->ddesc.iManufacturer || in usb_get_langid()
1691 udev->ddesc.iProduct || in usb_get_langid()
1692 udev->ddesc.iSerialNumber) { in usb_get_langid()
1694 err = usbd_req_get_string_desc(udev, NULL, in usb_get_langid()
1701 udev->flags.no_strings = 1; in usb_get_langid()
1731 udev->langid = langid; in usb_get_langid()
1735 usbd_ctrl_unlock(udev); in usb_get_langid()
1756 struct usb_device *udev; in usb_alloc_device() local
1793 udev = malloc(sizeof(*udev), M_USB, M_WAITOK | M_ZERO); in usb_alloc_device()
1795 if (udev == NULL) { in usb_alloc_device()
1800 sx_init_flags(&udev->enum_sx, "USB config SX lock", SX_DUPOK); in usb_alloc_device()
1801 sx_init_flags(&udev->sr_sx, "USB suspend and resume SX lock", SX_NOWITNESS); in usb_alloc_device()
1802 sx_init_flags(&udev->ctrl_sx, "USB control transfer SX lock", SX_DUPOK); in usb_alloc_device()
1804 cv_init(&udev->ctrlreq_cv, "WCTRL"); in usb_alloc_device()
1805 cv_init(&udev->ref_cv, "UGONE"); in usb_alloc_device()
1808 mtx_init(&udev->device_mtx, "USB device mutex", NULL, MTX_DEF); in usb_alloc_device()
1811 udev->cs_msg[0].hdr.pm_callback = &usbd_clear_stall_proc; in usb_alloc_device()
1812 udev->cs_msg[0].udev = udev; in usb_alloc_device()
1813 udev->cs_msg[1].hdr.pm_callback = &usbd_clear_stall_proc; in usb_alloc_device()
1814 udev->cs_msg[1].udev = udev; in usb_alloc_device()
1817 udev->parent_hub = parent_hub; in usb_alloc_device()
1818 udev->parent_dev = parent_dev; in usb_alloc_device()
1819 udev->port_index = port_index; in usb_alloc_device()
1820 udev->port_no = port_no; in usb_alloc_device()
1821 udev->depth = depth; in usb_alloc_device()
1822 udev->bus = bus; in usb_alloc_device()
1823 udev->address = USB_START_ADDR; /* default value */ in usb_alloc_device()
1824 udev->plugtime = (usb_ticks_t)ticks; in usb_alloc_device()
1830 udev->power_mode = usbd_filter_power_mode(udev, USB_POWER_MODE_ON); in usb_alloc_device()
1831 udev->pwr_save.last_xfer_time = ticks; in usb_alloc_device()
1833 udev->refcount = 1; in usb_alloc_device()
1836 udev->ctrl_ep_desc.bLength = sizeof(udev->ctrl_ep_desc); in usb_alloc_device()
1837 udev->ctrl_ep_desc.bDescriptorType = UDESC_ENDPOINT; in usb_alloc_device()
1838 udev->ctrl_ep_desc.bEndpointAddress = USB_CONTROL_ENDPOINT; in usb_alloc_device()
1839 udev->ctrl_ep_desc.bmAttributes = UE_CONTROL; in usb_alloc_device()
1840 udev->ctrl_ep_desc.wMaxPacketSize[0] = USB_MAX_IPACKET; in usb_alloc_device()
1841 udev->ctrl_ep_desc.wMaxPacketSize[1] = 0; in usb_alloc_device()
1842 udev->ctrl_ep_desc.bInterval = 0; in usb_alloc_device()
1845 udev->ctrl_ep_comp_desc.bLength = sizeof(udev->ctrl_ep_comp_desc); in usb_alloc_device()
1846 udev->ctrl_ep_comp_desc.bDescriptorType = UDESC_ENDPOINT_SS_COMP; in usb_alloc_device()
1848 udev->ddesc.bMaxPacketSize = USB_MAX_IPACKET; in usb_alloc_device()
1850 udev->speed = speed; in usb_alloc_device()
1851 udev->flags.usb_mode = mode; in usb_alloc_device()
1855 adev = udev; in usb_alloc_device()
1856 hub = udev->parent_hub; in usb_alloc_device()
1860 udev->hs_hub_addr = hub->address; in usb_alloc_device()
1861 udev->parent_hs_hub = hub; in usb_alloc_device()
1862 udev->hs_port_no = adev->port_no; in usb_alloc_device()
1870 usb_init_endpoint(udev, 0, in usb_alloc_device()
1871 &udev->ctrl_ep_desc, in usb_alloc_device()
1872 &udev->ctrl_ep_comp_desc, in usb_alloc_device()
1873 &udev->ctrl_ep); in usb_alloc_device()
1876 udev->device_index = device_index; in usb_alloc_device()
1880 snprintf(udev->ugen_name, sizeof(udev->ugen_name), in usb_alloc_device()
1883 LIST_INIT(&udev->pd_list); in usb_alloc_device()
1886 udev->ctrl_dev = usb_make_dev(udev, NULL, 0, 0, in usb_alloc_device()
1890 if (udev->ctrl_dev != NULL) in usb_alloc_device()
1891 make_dev_alias(udev->ctrl_dev->cdev, "%s", udev->ugen_name); in usb_alloc_device()
1895 err = (bus->methods->device_init) (udev); in usb_alloc_device()
1904 usb_set_device_state(udev, USB_STATE_POWERED); in usb_alloc_device()
1906 if (udev->flags.usb_mode == USB_MODE_HOST) { in usb_alloc_device()
1907 err = usbd_req_set_address(udev, NULL, device_index); in usb_alloc_device()
1913 if (udev->address == USB_START_ADDR) in usb_alloc_device()
1914 udev->address = device_index; in usb_alloc_device()
1927 "(%s, ignored)\n", udev->address, in usb_alloc_device()
1932 udev->flags.self_powered = 0; in usb_alloc_device()
1935 udev->curr_config_no = USB_UNCONFIG_NO; in usb_alloc_device()
1936 udev->curr_config_index = USB_UNCONFIG_INDEX; in usb_alloc_device()
1939 err = (usb_temp_setup_by_index_p) (udev, usb_template); in usb_alloc_device()
1946 usb_set_device_state(udev, USB_STATE_ADDRESSED); in usb_alloc_device()
1949 err = usbd_setup_device_desc(udev, NULL); in usb_alloc_device()
1953 err = usbd_req_re_enumerate(udev, NULL); in usb_alloc_device()
1955 err = usbd_req_re_enumerate(udev, NULL); in usb_alloc_device()
1966 usb_init_attach_arg(udev, &uaa); in usb_alloc_device()
1969 udev->flags.uq_bus_powered = 1; in usb_alloc_device()
1972 udev->flags.no_strings = 1; in usb_alloc_device()
1975 usb_get_langid(udev); in usb_alloc_device()
1978 udev->power = USB_MIN_POWER; in usb_alloc_device()
1980 usb_set_device_strings(udev); in usb_alloc_device()
1982 if (udev->flags.usb_mode == USB_MODE_DEVICE) { in usb_alloc_device()
2018 err = usbd_set_config_index(udev, config_index); in usb_alloc_device()
2020 if (udev->ddesc.bNumConfigurations != 0) { in usb_alloc_device()
2024 err = usbd_req_re_enumerate(udev, NULL); in usb_alloc_device()
2030 config_index, usbd_errstr(err), udev->port_no, in usb_alloc_device()
2031 udev->address); in usb_alloc_device()
2040 if (!config_quirk && config_index + 1 < udev->ddesc.bNumConfigurations) { in usb_alloc_device()
2041 if ((udev->cdesc->bNumInterface < 2) && in usb_alloc_device()
2042 usbd_get_no_descriptors(udev->cdesc, UDESC_ENDPOINT) == 0) { in usb_alloc_device()
2054 if (usb_iface_is_cdrom(udev, 0)) { in usb_alloc_device()
2075 err = usb_msc_auto_quirk(udev, 0, &uaa); in usb_alloc_device()
2086 udev->address, udev, udev->parent_hub); in usb_alloc_device()
2090 parent_hub->hub->ports + port_index : NULL, udev, device_index); in usb_alloc_device()
2094 udev->ugen_symlink = usb_alloc_symlink(udev->ugen_name); in usb_alloc_device()
2097 printf("%s: <%s %s> at %s\n", udev->ugen_name, in usb_alloc_device()
2098 usb_get_manufacturer(udev), usb_get_product(udev), in usb_alloc_device()
2099 device_get_nameunit(udev->bus->bdev)); in usb_alloc_device()
2103 usb_notify_addq("ATTACH", udev); in usb_alloc_device()
2110 usb_free_device(udev, 0); in usb_alloc_device()
2111 udev = NULL; in usb_alloc_device()
2113 return (udev); in usb_alloc_device()
2118 usb_make_dev(struct usb_device *udev, const char *devname, int ep, in usb_make_dev() argument
2128 pd->bus_index = device_get_unit(udev->bus->bdev); in usb_make_dev()
2129 pd->dev_index = udev->device_index; in usb_make_dev()
2201 usb_cdev_create(struct usb_device *udev) in usb_cdev_create() argument
2210 KASSERT(LIST_FIRST(&udev->pd_list) == NULL, ("stale cdev entries")); in usb_cdev_create()
2214 if (usbd_get_mode(udev) == USB_MODE_DEVICE) { in usb_cdev_create()
2230 cd = usbd_get_config_descriptor(udev); in usb_cdev_create()
2253 pd = usb_make_dev(udev, NULL, ep, 0, in usb_cdev_create()
2257 LIST_INSERT_HEAD(&udev->pd_list, pd, pd_next); in usb_cdev_create()
2262 usb_cdev_free(struct usb_device *udev) in usb_cdev_free() argument
2268 while ((pd = LIST_FIRST(&udev->pd_list)) != NULL) { in usb_cdev_free()
2287 usb_free_device(struct usb_device *udev, uint8_t flag) in usb_free_device() argument
2291 if (udev == NULL) in usb_free_device()
2294 DPRINTFN(4, "udev=%p port=%d\n", udev, udev->port_no); in usb_free_device()
2296 bus = udev->bus; in usb_free_device()
2299 usb_set_device_state(udev, USB_STATE_DETACHED); in usb_free_device()
2302 usb_notify_addq("DETACH", udev); in usb_free_device()
2307 printf("%s: <%s %s> at %s (disconnected)\n", udev->ugen_name, in usb_free_device()
2308 usb_get_manufacturer(udev), usb_get_product(udev), in usb_free_device()
2313 if (udev->ugen_symlink) { in usb_free_device()
2314 usb_free_symlink(udev->ugen_symlink); in usb_free_device()
2315 udev->ugen_symlink = NULL; in usb_free_device()
2318 usb_destroy_dev(udev->ctrl_dev); in usb_free_device()
2321 if (udev->flags.usb_mode == USB_MODE_DEVICE) { in usb_free_device()
2323 usbd_transfer_unsetup(udev->ctrl_xfer, USB_CTRL_XFER_MAX); in usb_free_device()
2327 usb_unconfigure(udev, USB_UNCFG_FLAG_FREE_EP0); in usb_free_device()
2330 usb_bus_port_set_device(bus, udev->parent_hub ? in usb_free_device()
2331 udev->parent_hub->hub->ports + udev->port_index : NULL, in usb_free_device()
2335 usbd_transfer_unsetup(udev->ctrl_xfer, USB_CTRL_XFER_MAX); in usb_free_device()
2338 (usb_temp_unsetup_p) (udev); in usb_free_device()
2344 USB_BUS_LOCK(udev->bus); in usb_free_device()
2345 usb_proc_mwait(USB_BUS_CS_PROC(udev->bus), in usb_free_device()
2346 &udev->cs_msg[0], &udev->cs_msg[1]); in usb_free_device()
2347 USB_BUS_UNLOCK(udev->bus); in usb_free_device()
2350 usb_wait_pending_refs(udev); in usb_free_device()
2352 sx_destroy(&udev->enum_sx); in usb_free_device()
2353 sx_destroy(&udev->sr_sx); in usb_free_device()
2354 sx_destroy(&udev->ctrl_sx); in usb_free_device()
2356 cv_destroy(&udev->ctrlreq_cv); in usb_free_device()
2357 cv_destroy(&udev->ref_cv); in usb_free_device()
2359 mtx_destroy(&udev->device_mtx); in usb_free_device()
2361 KASSERT(LIST_FIRST(&udev->pd_list) == NULL, ("leaked cdev entries")); in usb_free_device()
2366 (bus->methods->device_uninit) (udev); in usb_free_device()
2369 free(udev->serial, M_USB); in usb_free_device()
2370 free(udev->manufacturer, M_USB); in usb_free_device()
2371 free(udev->product, M_USB); in usb_free_device()
2372 free(udev, M_USB); in usb_free_device()
2386 usbd_get_iface(struct usb_device *udev, uint8_t iface_index) in usbd_get_iface() argument
2388 struct usb_interface *iface = udev->ifaces + iface_index; in usbd_get_iface()
2390 if (iface_index >= udev->ifaces_max) in usbd_get_iface()
2411 usbd_find_descriptor(struct usb_device *udev, void *id, uint8_t iface_index, in usbd_find_descriptor() argument
2419 cd = usbd_get_config_descriptor(udev); in usbd_find_descriptor()
2424 iface = usbd_get_iface(udev, iface_index); in usbd_find_descriptor()
2456 usb_devinfo(struct usb_device *udev, char *dst_ptr, uint16_t dst_len) in usb_devinfo() argument
2458 struct usb_device_descriptor *udd = &udev->ddesc; in usb_devinfo()
2468 usb_get_manufacturer(udev), in usb_devinfo()
2469 usb_get_product(udev), in usb_devinfo()
2473 udev->address); in usb_devinfo()
2477 usb_get_manufacturer(udev), in usb_devinfo()
2478 usb_get_product(udev), in usb_devinfo()
2481 udev->address); in usb_devinfo()
2504 usb_set_device_strings(struct usb_device *udev) in usb_set_device_strings() argument
2506 struct usb_device_descriptor *udd = &udev->ddesc; in usb_set_device_strings()
2517 do_unlock = usbd_ctrl_lock(udev); in usb_set_device_strings()
2519 temp_ptr = (char *)udev->scratch.data; in usb_set_device_strings()
2520 temp_size = sizeof(udev->scratch.data); in usb_set_device_strings()
2526 free(udev->serial, M_USB); in usb_set_device_strings()
2527 free(udev->manufacturer, M_USB); in usb_set_device_strings()
2528 free(udev->product, M_USB); in usb_set_device_strings()
2531 udev->serial = NULL; in usb_set_device_strings()
2532 udev->manufacturer = NULL; in usb_set_device_strings()
2533 udev->product = NULL; in usb_set_device_strings()
2536 usbd_req_get_string_any(udev, NULL, temp_ptr, temp_size, in usb_set_device_strings()
2537 udev->ddesc.iSerialNumber); in usb_set_device_strings()
2538 udev->serial = strdup(temp_ptr, M_USB); in usb_set_device_strings()
2541 usbd_req_get_string_any(udev, NULL, temp_ptr, temp_size, in usb_set_device_strings()
2542 udev->ddesc.iManufacturer); in usb_set_device_strings()
2545 udev->manufacturer = strdup(temp_ptr, M_USB); in usb_set_device_strings()
2548 usbd_req_get_string_any(udev, NULL, temp_ptr, temp_size, in usb_set_device_strings()
2549 udev->ddesc.iProduct); in usb_set_device_strings()
2552 udev->product = strdup(temp_ptr, M_USB); in usb_set_device_strings()
2555 if (udev->manufacturer == NULL || udev->product == NULL) { in usb_set_device_strings()
2564 if (udev->manufacturer == NULL) { in usb_set_device_strings()
2565 udev->manufacturer = strdup(kdp->vendorname, in usb_set_device_strings()
2568 if (udev->product == NULL && in usb_set_device_strings()
2570 udev->product = strdup(kdp->productname, in usb_set_device_strings()
2577 if (udev->manufacturer == NULL) { in usb_set_device_strings()
2579 udev->manufacturer = strdup(temp_ptr, M_USB); in usb_set_device_strings()
2581 if (udev->product == NULL) { in usb_set_device_strings()
2583 udev->product = strdup(temp_ptr, M_USB); in usb_set_device_strings()
2587 usbd_ctrl_unlock(udev); in usb_set_device_strings()
2595 usbd_get_mode(struct usb_device *udev) in usbd_get_mode() argument
2597 return (udev->flags.usb_mode); in usbd_get_mode()
2605 usbd_get_speed(struct usb_device *udev) in usbd_get_speed() argument
2607 return (udev->speed); in usbd_get_speed()
2611 usbd_get_isoc_fps(struct usb_device *udev) in usbd_get_isoc_fps() argument
2614 switch (udev->speed) { in usbd_get_isoc_fps()
2624 usbd_get_device_descriptor(struct usb_device *udev) in usbd_get_device_descriptor() argument
2626 if (udev == NULL) in usbd_get_device_descriptor()
2628 return (&udev->ddesc); in usbd_get_device_descriptor()
2632 usbd_get_config_descriptor(struct usb_device *udev) in usbd_get_config_descriptor() argument
2634 if (udev == NULL) in usbd_get_config_descriptor()
2636 return (udev->cdesc); in usbd_get_config_descriptor()
2684 usbd_get_bus_index(struct usb_device *udev) in usbd_get_bus_index() argument
2686 return ((uint8_t)device_get_unit(udev->bus->bdev)); in usbd_get_bus_index()
2690 usbd_get_device_index(struct usb_device *udev) in usbd_get_device_index() argument
2692 return (udev->device_index); in usbd_get_device_index()
2697 usb_notify_addq(const char *type, struct usb_device *udev) in usb_notify_addq() argument
2723 udev->ugen_name, in usb_notify_addq()
2724 udev->ugen_name, in usb_notify_addq()
2726 UGETW(udev->ddesc.idVendor), in usb_notify_addq()
2727 UGETW(udev->ddesc.idProduct), in usb_notify_addq()
2728 udev->ddesc.bDeviceClass, in usb_notify_addq()
2729 udev->ddesc.bDeviceSubClass, in usb_notify_addq()
2730 usb_get_serial(udev), in usb_notify_addq()
2731 UGETW(udev->ddesc.bcdDevice), in usb_notify_addq()
2732 (udev->flags.usb_mode == USB_MODE_HOST) ? "host" : "device", in usb_notify_addq()
2733 udev->port_no in usb_notify_addq()
2735 , udev->parent_hub != NULL ? in usb_notify_addq()
2736 udev->parent_hub->ugen_name : in usb_notify_addq()
2737 device_get_nameunit(device_get_parent(udev->bus->bdev)) in usb_notify_addq()
2746 iface = usbd_get_iface(udev, i); in usb_notify_addq()
2771 udev->ugen_name, in usb_notify_addq()
2772 udev->ugen_name, in usb_notify_addq()
2774 UGETW(udev->ddesc.idVendor), in usb_notify_addq()
2775 UGETW(udev->ddesc.idProduct), in usb_notify_addq()
2776 udev->ddesc.bDeviceClass, in usb_notify_addq()
2777 udev->ddesc.bDeviceSubClass, in usb_notify_addq()
2778 usb_get_serial(udev), in usb_notify_addq()
2779 UGETW(udev->ddesc.bcdDevice), in usb_notify_addq()
2780 (udev->flags.usb_mode == USB_MODE_HOST) ? "host" : "device", in usb_notify_addq()
2807 usb_fifo_free_wrap(struct usb_device *udev, in usb_fifo_free_wrap() argument
2817 f = udev->fifo[i]; in usb_fifo_free_wrap()
2861 usb_peer_can_wakeup(struct usb_device *udev) in usb_peer_can_wakeup() argument
2865 cdp = udev->cdesc; in usb_peer_can_wakeup()
2866 if ((cdp != NULL) && (udev->flags.usb_mode == USB_MODE_HOST)) { in usb_peer_can_wakeup()
2873 usb_set_device_state(struct usb_device *udev, enum usb_dev_state state) in usb_set_device_state() argument
2878 DPRINTF("udev %p state %s -> %s\n", udev, in usb_set_device_state()
2879 usb_statestr(udev->state), usb_statestr(state)); in usb_set_device_state()
2884 udev->state = state; in usb_set_device_state()
2888 if (udev->bus->methods->device_state_change != NULL) in usb_set_device_state()
2889 (udev->bus->methods->device_state_change) (udev); in usb_set_device_state()
2893 usb_get_device_state(struct usb_device *udev) in usb_get_device_state() argument
2895 if (udev == NULL) in usb_get_device_state()
2897 return (udev->state); in usb_get_device_state()
2901 usbd_device_attached(struct usb_device *udev) in usbd_device_attached() argument
2903 return (udev->state > USB_STATE_DETACHED); in usbd_device_attached()
2912 usbd_enum_lock(struct usb_device *udev) in usbd_enum_lock() argument
2914 if (sx_xlocked(&udev->enum_sx)) in usbd_enum_lock()
2917 sx_xlock(&udev->enum_sx); in usbd_enum_lock()
2918 sx_xlock(&udev->sr_sx); in usbd_enum_lock()
2934 usbd_enum_lock_sig(struct usb_device *udev) in usbd_enum_lock_sig() argument
2936 if (sx_xlocked(&udev->enum_sx)) in usbd_enum_lock_sig()
2938 if (sx_xlock_sig(&udev->enum_sx)) in usbd_enum_lock_sig()
2940 if (sx_xlock_sig(&udev->sr_sx)) { in usbd_enum_lock_sig()
2941 sx_xunlock(&udev->enum_sx); in usbd_enum_lock_sig()
2952 usbd_enum_unlock(struct usb_device *udev) in usbd_enum_unlock() argument
2955 sx_xunlock(&udev->enum_sx); in usbd_enum_unlock()
2956 sx_xunlock(&udev->sr_sx); in usbd_enum_unlock()
2962 usbd_sr_lock(struct usb_device *udev) in usbd_sr_lock() argument
2964 sx_xlock(&udev->sr_sx); in usbd_sr_lock()
2976 usbd_sr_unlock(struct usb_device *udev) in usbd_sr_unlock() argument
2979 sx_xunlock(&udev->sr_sx); in usbd_sr_unlock()
2988 usbd_enum_is_locked(struct usb_device *udev) in usbd_enum_is_locked() argument
2990 return (sx_xlocked(&udev->enum_sx)); in usbd_enum_is_locked()
2999 usbd_ctrl_lock(struct usb_device *udev) in usbd_ctrl_lock() argument
3001 if (sx_xlocked(&udev->ctrl_sx)) in usbd_ctrl_lock()
3003 sx_xlock(&udev->ctrl_sx); in usbd_ctrl_lock()
3009 if (usbd_enum_is_locked(udev)) in usbd_ctrl_lock()
3010 usbd_sr_unlock(udev); in usbd_ctrl_lock()
3015 usbd_ctrl_unlock(struct usb_device *udev) in usbd_ctrl_unlock() argument
3017 sx_xunlock(&udev->ctrl_sx); in usbd_ctrl_unlock()
3023 if (usbd_enum_is_locked(udev)) in usbd_ctrl_unlock()
3024 usbd_sr_lock(udev); in usbd_ctrl_unlock()
3037 usbd_set_pnpinfo(struct usb_device *udev, uint8_t iface_index, const char *pnpinfo) in usbd_set_pnpinfo() argument
3041 iface = usbd_get_iface(udev, iface_index); in usbd_set_pnpinfo()
3061 usbd_add_dynamic_quirk(struct usb_device *udev, uint16_t quirk) in usbd_add_dynamic_quirk() argument
3066 if (udev->autoQuirk[x] == 0 || in usbd_add_dynamic_quirk()
3067 udev->autoQuirk[x] == quirk) { in usbd_add_dynamic_quirk()
3068 udev->autoQuirk[x] = quirk; in usbd_add_dynamic_quirk()
3081 usbd_set_endpoint_mode(struct usb_device *udev, struct usb_endpoint *ep, in usbd_set_endpoint_mode() argument
3088 do_unlock = usbd_enum_lock(udev); in usbd_set_endpoint_mode()
3090 if (udev->bus->methods->set_endpoint_mode != NULL) { in usbd_set_endpoint_mode()
3091 error = (udev->bus->methods->set_endpoint_mode) ( in usbd_set_endpoint_mode()
3092 udev, ep, ep_mode); in usbd_set_endpoint_mode()
3103 usbd_enum_unlock(udev); in usbd_set_endpoint_mode()
3108 usbd_get_endpoint_mode(struct usb_device *udev, struct usb_endpoint *ep) in usbd_get_endpoint_mode() argument