29#ifdef USB_GLOBAL_INCLUDE_FILE
30#include USB_GLOBAL_INCLUDE_FILE
32#include <sys/stdint.h>
33#include <sys/stddef.h>
35#include <sys/eventhandler.h>
38#include <sys/kernel.h>
40#include <sys/module.h>
43#include <sys/condvar.h>
44#include <sys/sysctl.h>
46#include <sys/unistd.h>
47#include <sys/callout.h>
48#include <sys/malloc.h>
64#define USB_DEBUG_VAR usb_debug
107static void usb_notify_addq(
const char *type,
struct usb_device *);
110static void usb_fifo_free_wrap(
struct usb_device *, uint8_t, uint8_t);
111static void usb_cdev_create(
struct usb_device *);
112static void usb_cdev_free(
struct usb_device *);
124 CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_MPSAFE,
126 "I",
"Selected USB device side template");
174 DPRINTF(
"usbd_req_get_port_status() "
186 DPRINTF(
"usbd_req_set_port_feature() "
193 DPRINTF(
"usbd_req_clear_port_feature() "
203 cv_broadcast(&udev->
ref_cv);
327 for (; ep != ep_end; ep++) {
328 if (ep->
edesc == NULL) {
373 DPRINTFN(10,
"udev=%p iface_index=%d address=0x%x "
374 "type=0x%x dir=0x%x index=%d\n",
437 for (; ep != ep_end; ep++) {
438 if ((ep->
edesc == NULL) ||
484 if (udev->
cdesc == NULL) {
572 while (ep != ep_end) {
573 if (ep->
edesc != NULL)
636#if USB_HAVE_COMPAT_LINUX
638 if (udev->linux_endpoint_start != NULL) {
640 udev->linux_endpoint_start = NULL;
647 if (udev->
cdesc != NULL) {
682 DPRINTFN(6,
"udev=%p index=%d\n", udev,
index);
727 DPRINTFN(0,
"could not read "
728 "device status: %s\n",
738 DPRINTF(
"udev=%p cdesc=%p (addr %d) cno=%d attr=0x%02x, "
739 "selfpowered=%d, power=%d\n",
753 if (power > max_power) {
754 DPRINTFN(0,
"power exceeded %d > %d\n", power, max_power);
785 usb_cdev_create(udev);
841 DPRINTFN(5,
"iface_index=%d cmd=%d\n",
848 sx_assert(&udev->
enum_sx, SA_LOCKED);
866 memset(ep, 0,
sizeof(*ep));
878 memset(&ips, 0,
sizeof(ips));
925 DPRINTFN(5,
"found idesc nendpt=%d\n",
id->bNumEndpoints);
935 DPRINTF(
"Endpoint limit reached\n");
946 DPRINTFN(5,
"Found endpoint companion descriptor\n");
964#if (USB_HAVE_FIXED_IFACE == 0)
968 M_USB, M_WAITOK | M_ZERO);
969 if (udev->
ifaces == NULL) {
975#if (USB_HAVE_FIXED_ENDPOINT == 0)
977 udev->
endpoints = malloc(
sizeof(*ep) * ep_max,
978 M_USB, M_WAITOK | M_ZERO);
993#if (USB_HAVE_FIXED_IFACE == 0) || (USB_HAVE_FIXED_ENDPOINT == 0)
1005#if (USB_HAVE_FIXED_IFACE == 0)
1006 free(udev->
ifaces, M_USB);
1009#if (USB_HAVE_FIXED_ENDPOINT == 0)
1035 uint8_t iface_index, uint8_t alt_index)
1044 if (iface == NULL) {
1061 usb_fifo_free_wrap(udev, iface_index, 0);
1100 uint8_t was_stalled;
1104 DPRINTF(
"Cannot find endpoint\n");
1121 DPRINTF(
"Invalid endpoint\n");
1130 if (was_stalled && do_stall) {
1139 if (do_stall || (!was_stalled)) {
1186 for (; ep != ep_end; ep++) {
1187 if ((ep->
edesc == NULL) ||
1207 char **ppnpinfo, uint8_t flag)
1223 device_printf(
dev,
"at %s, port %d, addr %d "
1229 if (device_is_attached(
dev)) {
1231 err = DEVICE_RESUME(
dev);
1233 device_printf(
dev,
"Resume failed\n");
1243 pnpinfo = *ppnpinfo;
1244 if (pnpinfo != NULL) {
1246 free(pnpinfo, M_USBDEV);
1252 panic(
"usb_detach_device_sub: A USB driver would not detach\n");
1274 DPRINTFN(4,
"udev=%p\n", udev);
1276 sx_assert(&udev->
enum_sx, SA_LOCKED);
1286 iface_index = i + 1;
1294 for (; i != iface_index; i++) {
1296 if (iface == NULL) {
1329 if (device_is_attached(
dev)) {
1343 panic(
"device_delete_child() failed\n");
1351 "Device creation failed\n");
1354 device_set_ivars(uaa->
temp_dev, uaa);
1363 if (device_probe_and_attach(iface->
subdev) == 0) {
1369 device_set_ivars(iface->
subdev, NULL);
1372 err = DEVICE_SUSPEND(iface->
subdev);
1374 device_printf(iface->
subdev,
"Suspend failed\n");
1396 uint8_t parent_index)
1400 if (udev == NULL || iface_index == parent_index) {
1413 memset(uaa, 0,
sizeof(*uaa));
1475 EVENTHANDLER_INVOKE(usb_dev_configured, udev, &uaa);
1494 for (; i != j; i++) {
1496 if (iface == NULL) {
1501 DPRINTFN(2,
"end of interfaces "
1505 if (iface->
idesc == NULL) {
1522 DPRINTFN(2,
"iclass=%u/%u/%u iindex=%u/%u\n",
1539 DPRINTFN(0,
"device delete child failed\n");
1562 if (!device_is_attached(
dev)) {
1566 err = DEVICE_SUSPEND(
dev);
1568 err = DEVICE_RESUME(
dev);
1571 device_printf(
dev,
"%s failed\n",
1572 do_suspend ?
"Suspend" :
"Resume");
1595 DPRINTFN(4,
"udev=%p do_suspend=%d\n", udev, do_suspend);
1597 sx_assert(&udev->
sr_sx, SA_LOCKED);
1613 if (iface == NULL) {
1653 uint8_t *scratch_ptr;
1686 if (err || (scratch_ptr[0] < 4)) {
1699 scratch_ptr[0] &= ~1U;
1705 for (x = 2; x < scratch_ptr[0]; x += 2) {
1707 if ((
langid & mask) == pref)
1710 if (x >= scratch_ptr[0]) {
1712 DPRINTFN(1,
"Using first language\n");
1716 DPRINTFN(1,
"Language selected: 0x%04x\n",
langid);
1747 uint8_t config_index;
1748 uint8_t config_quirk;
1749 uint8_t set_config_failed;
1751 DPRINTF(
"parent_dev=%p, bus=%p, parent_hub=%p, depth=%u, "
1752 "port_index=%u, port_no=%u, speed=%u, usb_mode=%u\n",
1770 "No free USB device index for new device\n");
1776 "Invalid device depth\n");
1779 udev = malloc(
sizeof(*udev), M_USB, M_WAITOK | M_ZERO);
1780#if (USB_HAVE_MALLOC_WAITOK == 0)
1786 sx_init_flags(&udev->
enum_sx,
"USB config SX lock", SX_DUPOK);
1787 sx_init_flags(&udev->
sr_sx,
"USB suspend and resume SX lock", SX_NOWITNESS);
1788 sx_init_flags(&udev->
ctrl_sx,
"USB control transfer SX lock", SX_DUPOK);
1791 cv_init(&udev->
ref_cv,
"UGONE");
1794 mtx_init(&udev->
device_mtx,
"USB device mutex", NULL, MTX_DEF);
1866 snprintf(udev->ugen_name,
sizeof(udev->ugen_name),
1869 LIST_INIT(&udev->pd_list);
1872 udev->ctrl_dev = usb_make_dev(udev, NULL, 0, 0,
1873 FREAD|FWRITE, UID_ROOT, GID_OPERATOR, 0600);
1876 if (udev->ctrl_dev != NULL)
1877 make_dev_alias(udev->ctrl_dev->cdev,
"%s", udev->ugen_name);
1883 DPRINTFN(0,
"device init %d failed "
1912 DPRINTFN(0,
"set address %d failed "
1913 "(%s, ignored)\n", udev->
address,
1927 DPRINTFN(0,
"setting up USB template failed - "
1928 "usb_template(4) not loaded?\n");
1998 set_config_failed = 0;
2001 DPRINTF(
"setting config %u\n", config_index);
2007 if (!set_config_failed) {
2008 set_config_failed = 1;
2012 goto repeat_set_config;
2014 DPRINTFN(0,
"Failure selecting configuration index %u:"
2015 "%s, port %u, addr %u (ignored)\n",
2029 DPRINTFN(0,
"Found no endpoints, trying next config\n");
2031 goto repeat_set_config;
2034 if (config_index == 0) {
2040 DPRINTFN(0,
"Found possible auto-install "
2041 "disk (trying next config)\n");
2043 goto repeat_set_config;
2049 if (set_config_failed == 0 && config_index == 0 &&
2062 set_config_failed = 1;
2063 goto repeat_set_config;
2069 DPRINTF(
"new dev (addr %d), udev=%p, parent_hub=%p\n",
2081 printf(
"%s: <%s %s> at %s\n", udev->ugen_name,
2083 device_get_nameunit(udev->
bus->
bdev));
2087 usb_notify_addq(
"ATTACH", udev);
2102usb_make_dev(
struct usb_device *udev,
const char *devname,
int ep,
2103 int fi,
int rwmode, uid_t uid, gid_t gid,
int mode)
2106 struct make_dev_args args;
2119 if (devname == NULL) {
2126 make_dev_args_init(&args);
2130 args.mda_mode = mode;
2131 args.mda_si_drv1 = pd;
2133 if (make_dev_s(&args, &pd->
cdev,
"%s", devname) != 0) {
2134 DPRINTFN(0,
"Failed to create device %s\n", devname);
2144 DPRINTFN(1,
"Destroying device at ugen%d.%d\n",
2151 destroy_dev(pd->
cdev);
2169 usb_destroy_dev_sync(pd);
2174 delist_dev(pd->
cdev);
2177 LIST_INSERT_HEAD(&
bus->pd_cleanup_list, pd, pd_next);
2180 &
bus->cleanup_msg[0], &
bus->cleanup_msg[1]);
2191 int inmode, outmode, inmask, outmask,
mode;
2194 KASSERT(LIST_FIRST(&udev->pd_list) == NULL, (
"stale cdev entries"));
2196 DPRINTFN(2,
"Creating device nodes\n");
2231 for (ep = 1; ep < 16; ep++) {
2232 mode = (inmask & (1 << ep)) ? inmode : 0;
2233 mode |= (outmask & (1 << ep)) ? outmode : 0;
2237 pd = usb_make_dev(udev, NULL, ep, 0,
2238 mode, UID_ROOT, GID_OPERATOR, 0600);
2241 LIST_INSERT_HEAD(&udev->pd_list, pd, pd_next);
2250 DPRINTFN(2,
"Freeing device nodes\n");
2252 while ((pd = LIST_FIRST(&udev->pd_list)) != NULL) {
2253 KASSERT(pd->
cdev->si_drv1 == pd, (
"privdata corrupt"));
2255 LIST_REMOVE(pd, pd_next);
2257 usb_destroy_dev(pd);
2278 DPRINTFN(4,
"udev=%p port=%d\n", udev, udev->
port_no);
2286 usb_notify_addq(
"DETACH", udev);
2291 printf(
"%s: <%s %s> at %s (disconnected)\n", udev->ugen_name,
2293 device_get_nameunit(
bus->bdev));
2297 if (udev->ugen_symlink) {
2299 udev->ugen_symlink = NULL;
2302 usb_destroy_dev(udev->ctrl_dev);
2337 sx_destroy(&udev->
sr_sx);
2341 cv_destroy(&udev->
ref_cv);
2345 KASSERT(LIST_FIRST(&udev->pd_list) == NULL, (
"leaked cdev entries"));
2349 if (
bus->methods->device_uninit != NULL)
2350 (
bus->methods->device_uninit) (udev);
2353 free(udev->
serial, M_USB);
2396 uint8_t type, uint8_t type_mask,
2397 uint8_t subtype, uint8_t subtype_mask)
2409 if (iface == NULL) {
2424 ((
desc->bDescriptorSubtype & subtype_mask) == subtype)) {
2450 snprintf(dst_ptr, dst_len,
"%s %s, class %d/%d, rev %x.%02x/"
2459 snprintf(dst_ptr, dst_len,
"%s %s, rev %x.%02x/"
2473struct usb_knowndev {
2477 const char *vendorname;
2478 const char *productname;
2481#define USB_KNOWNDEV_NOPROD 0x01
2484#include "usbdevs_data.h"
2492 const struct usb_knowndev *kdp;
2497 uint16_t product_id;
2510 free(udev->
serial, M_USB);
2522 udev->
serial = strdup(temp_ptr, M_USB);
2528 if (temp_ptr[0] !=
'\0')
2535 if (temp_ptr[0] !=
'\0')
2536 udev->
product = strdup(temp_ptr, M_USB);
2540 for (kdp = usb_knowndevs; kdp->vendorname != NULL; kdp++) {
2541 if (kdp->vendor == vendor_id &&
2542 (kdp->product == product_id ||
2543 (kdp->flags & USB_KNOWNDEV_NOPROD) != 0))
2546 if (kdp->vendorname != NULL) {
2553 (kdp->flags & USB_KNOWNDEV_NOPROD) == 0) {
2554 udev->
product = strdup(kdp->productname,
2562 snprintf(temp_ptr, temp_size,
"vendor 0x%04x", vendor_id);
2566 snprintf(temp_ptr, temp_size,
"product 0x%04x", product_id);
2567 udev->
product = strdup(temp_ptr, M_USB);
2591 return (udev->
speed);
2598 switch (udev->
speed) {
2612 return (&udev->
ddesc);
2620 return (udev->
cdesc);
2658 return (iface->
idesc);
2670 return ((uint8_t)device_get_unit(udev->
bus->
bdev));
2681usb_notify_addq(
const char *type,
struct usb_device *udev)
2688 sb = sbuf_new_auto();
2697 "devsubclass=0x%02x "
2721 device_get_nameunit(device_get_parent(udev->
bus->
bdev))
2725 devctl_notify(
"USB",
"DEVICE", type, sbuf_data(sb));
2733 if (iface->
idesc == NULL)
2736 sb = sbuf_new_auto();
2745 "devsubclass=0x%02x "
2752 "intsubclass=0x%02x "
2753 "intprotocol=0x%02x",
2771 devctl_notify(
"USB",
"INTERFACE", type, sbuf_data(sb));
2792 uint8_t iface_index, uint8_t flag)
2862 DPRINTF(
"udev %p state %s -> %s\n", udev,
2881 return (udev->
state);
2898 if (sx_xlocked(&udev->
enum_sx))
2902 sx_xlock(&udev->
sr_sx);
2920 if (sx_xlocked(&udev->
enum_sx))
2922 if (sx_xlock_sig(&udev->
enum_sx))
2924 if (sx_xlock_sig(&udev->
sr_sx)) {
2940 sx_xunlock(&udev->
sr_sx);
2948 sx_xlock(&udev->
sr_sx);
2963 sx_xunlock(&udev->
sr_sx);
2974 return (sx_xlocked(&udev->
enum_sx));
2985 if (sx_xlocked(&udev->
ctrl_sx))
3030 free(iface->
pnpinfo, M_USBDEV);
enum usb_hc_mode usb_mode
unsigned long driver_info
struct usbd_lookup_info info
struct usb_interface * iface
struct usb_device * device
usb_error_t(* set_endpoint_mode)(struct usb_device *, struct usb_endpoint *, uint8_t)
void(* xfer_stall)(struct usb_xfer *xfer)
void(* set_stall)(struct usb_device *udev, struct usb_endpoint *ep, uint8_t *did_stall)
void(* clear_stall)(struct usb_device *udev, struct usb_endpoint *ep)
void(* device_state_change)(struct usb_device *)
usb_error_t(* device_init)(struct usb_device *)
void(* endpoint_init)(struct usb_device *, struct usb_endpoint_descriptor *, struct usb_endpoint *)
const struct usb_bus_methods * methods
struct usb_device ** devices
uByte bConfigurationValue
enum usb_hc_mode usb_mode
enum usb_hc_mode usb_mode
struct usb_config_descriptor * cdesc
struct usb_endpoint ctrl_ep
struct usb_device * parent_hs_hub
union usb_device_scratch scratch
struct usb_xfer * ctrl_xfer[USB_CTRL_XFER_MAX]
struct usb_interface * ifaces
struct usb_power_save pwr_save
struct usb_device_descriptor ddesc
uint8_t curr_config_index
uint16_t autoQuirk[USB_MAX_AUTO_QUIRK]
struct usb_device * parent_hub
struct usb_endpoint * ep_curr
struct usb_endpoint_ss_comp_descriptor ctrl_ep_comp_desc
struct usb_endpoint * endpoints
struct usb_udev_msg cs_msg[2]
struct usb_device_flags flags
struct usb_endpoint_descriptor ctrl_ep_desc
struct usb_endpoint_ss_comp_descriptor * ecomp
struct usb_xfer_queue endpoint_q[USB_MAX_EP_STREAMS]
const struct usb_pipe_methods * methods
struct usb_endpoint_descriptor * edesc
struct usb_xfer ** fs_xfer
struct usb_fifo_methods * methods
uint8_t parent_iface_index
struct usb_interface_descriptor * idesc
usb_ticks_t last_xfer_time
usb_proc_callback_t * pm_callback
void(* command)(struct usb_xfer_queue *pq)
uint8_t bInterfaceSubClass
uint8_t bInterfaceProtocol
#define USB_LANGUAGE_TABLE
#define USB_POWER_DOWN_TIME
#define UDESC_ENDPOINT_SS_COMP
#define USB_UNCONFIG_INDEX
#define USB_ROOT_HUB_ADDR
#define UPS_PORT_MODE_DEVICE
#define UE_GET_BULK_STREAMS(x)
#define USB_IFACE_INDEX_ANY
#define USB_POWER_MODE_ON
#define USB_CONTROL_ENDPOINT
#define USB_BUS_CS_PROC(bus)
#define USB_BUS_UNLOCK(_b)
struct usb_symlink * usb_alloc_symlink(const char *target)
void usb_free_symlink(struct usb_symlink *ps)
usb_error_t usbd_set_alt_interface_index(struct usb_device *udev, uint8_t iface_index, uint8_t alt_index)
static void usb_trigger_reprobe_all(void)
usb_error_t usbd_interface_count(struct usb_device *udev, uint8_t *count)
static void usb_wait_pending_refs(struct usb_device *udev)
static void usb_init_endpoint(struct usb_device *, uint8_t, struct usb_endpoint_descriptor *, struct usb_endpoint_ss_comp_descriptor *, struct usb_endpoint *)
usb_error_t usbd_set_endpoint_stall(struct usb_device *udev, struct usb_endpoint *ep, uint8_t do_stall)
uint8_t usbd_enum_lock(struct usb_device *udev)
struct usb_interface_descriptor * usbd_get_interface_descriptor(struct usb_interface *iface)
static usb_error_t usb_config_parse(struct usb_device *, uint8_t, uint8_t)
uint8_t usbd_device_attached(struct usb_device *udev)
usb_error_t usb_probe_and_attach(struct usb_device *udev, uint8_t iface_index)
struct usb_config_descriptor * usbd_get_config_descriptor(struct usb_device *udev)
const char * usb_get_serial(struct usb_device *udev)
usb_error_t usbd_add_dynamic_quirk(struct usb_device *udev, uint16_t quirk)
void usb_devinfo(struct usb_device *udev, char *dst_ptr, uint16_t dst_len)
SYSCTL_INT(_hw_usb, OID_AUTO, usb_lang_id, CTLFLAG_RWTUN, &usb_lang_id, 0, "Preferred USB language ID")
uint8_t usbd_get_bus_index(struct usb_device *udev)
static usb_proc_callback_t usbd_clear_stall_proc
void usbd_set_parent_iface(struct usb_device *udev, uint8_t iface_index, uint8_t parent_index)
static uint8_t usb_probe_and_attach_sub(struct usb_device *, struct usb_attach_arg *)
void usbd_sr_lock(struct usb_device *udev)
void * usbd_find_descriptor(struct usb_device *udev, void *id, uint8_t iface_index, uint8_t type, uint8_t type_mask, uint8_t subtype, uint8_t subtype_mask)
uint8_t usbd_get_interface_altindex(struct usb_interface *iface)
static void usb_init_attach_arg(struct usb_device *, struct usb_attach_arg *)
SYSCTL_PROC(_hw_usb, OID_AUTO, template, CTLTYPE_INT|CTLFLAG_RWTUN|CTLFLAG_MPSAFE, NULL, 0, sysctl_hw_usb_template, "I", "Selected USB device side template")
usb_error_t usb_reset_iface_endpoints(struct usb_device *udev, uint8_t iface_index)
struct usb_endpoint * usb_endpoint_foreach(struct usb_device *udev, struct usb_endpoint *ep)
enum usb_dev_speed usbd_get_speed(struct usb_device *udev)
uint8_t usbd_get_endpoint_mode(struct usb_device *udev, struct usb_endpoint *ep)
const char * usb_get_product(struct usb_device *udev)
usb_error_t usbd_set_config_index(struct usb_device *udev, uint8_t index)
uint32_t usbd_get_isoc_fps(struct usb_device *udev)
static void usb_suspend_resume_sub(struct usb_device *, device_t, uint8_t)
void usb_free_device(struct usb_device *udev, uint8_t flag)
void usbd_sr_unlock(struct usb_device *udev)
struct usb_device_descriptor * usbd_get_device_descriptor(struct usb_device *udev)
uint8_t usb_peer_can_wakeup(struct usb_device *udev)
usb_error_t usbd_set_endpoint_mode(struct usb_device *udev, struct usb_endpoint *ep, uint8_t ep_mode)
usb_error_t usb_suspend_resume(struct usb_device *udev, uint8_t do_suspend)
void usbd_enum_unlock(struct usb_device *udev)
uint8_t usb_test_quirk(const struct usb_attach_arg *uaa, uint16_t quirk)
uint8_t usbd_ctrl_lock(struct usb_device *udev)
enum usb_hc_mode usbd_get_mode(struct usb_device *udev)
void usb_set_device_strings(struct usb_device *udev)
void usbd_ctrl_unlock(struct usb_device *udev)
const char * usb_statestr(enum usb_dev_state state)
static void usb_trigger_reprobe_on_off(int on_not_off)
void usb_set_device_state(struct usb_device *udev, enum usb_dev_state state)
struct usb_endpoint * usbd_get_ep_by_addr(struct usb_device *udev, uint8_t ea_val)
struct usb_device * usb_alloc_device(device_t parent_dev, struct usb_bus *bus, struct usb_device *parent_hub, uint8_t depth, uint8_t port_index, uint8_t port_no, enum usb_dev_speed speed, enum usb_hc_mode mode)
void usb_detach_device(struct usb_device *udev, uint8_t iface_index, uint8_t flag)
void usb_get_langid(struct usb_device *udev)
struct usb_interface * usbd_get_iface(struct usb_device *udev, uint8_t iface_index)
struct usb_endpoint * usbd_get_endpoint(struct usb_device *udev, uint8_t iface_index, const struct usb_config *setup)
static void usb_detach_device_sub(struct usb_device *, device_t *, char **, uint8_t)
usb_error_t usbd_set_pnpinfo(struct usb_device *udev, uint8_t iface_index, const char *pnpinfo)
uint8_t usbd_enum_is_locked(struct usb_device *udev)
const char * usb_get_manufacturer(struct usb_device *udev)
static void usb_unconfigure(struct usb_device *, uint8_t)
enum usb_dev_state usb_get_device_state(struct usb_device *udev)
static const char * statestr[USB_STATE_MAX]
uint8_t usbd_get_device_index(struct usb_device *udev)
static int sysctl_hw_usb_template(SYSCTL_HANDLER_ARGS)
#define USB_CTRL_XFER_MAX
struct usb_endpoint_descriptor desc
#define USB_UNCFG_FLAG_FREE_EP0
usb_temp_unsetup_t * usb_temp_unsetup_p
usb_temp_setup_by_index_t * usb_temp_setup_by_index_p
usb_test_quirk_t * usb_test_quirk_p
devclass_t usb_devclass_ptr
usb_linux_free_device_t * usb_linux_free_device_p
const char * usbd_errstr(usb_error_t err)
#define USB_MAX_AUTO_QUIRK
#define USB_MAX_EP_STREAMS
struct usb_fifo_methods usb_ugen_methods
uint8_t usbd_filter_power_mode(struct usb_device *udev, uint8_t power_mode)
void usb_bus_port_set_device(struct usb_bus *bus, struct usb_port *up, struct usb_device *udev, uint8_t device_index)
int usb_iface_is_cdrom(struct usb_device *udev, uint8_t iface_index)
usb_error_t usb_dymo_eject(struct usb_device *udev, uint8_t iface_index)
usb_error_t usb_msc_auto_quirk(struct usb_device *udev, uint8_t iface_index, const struct usb_attach_arg *uaa)
struct usb_endpoint_ss_comp_descriptor * usb_ed_comp_foreach(struct usb_config_descriptor *cd, struct usb_endpoint_ss_comp_descriptor *ped)
struct usb_endpoint_descriptor * usb_edesc_foreach(struct usb_config_descriptor *cd, struct usb_endpoint_descriptor *ped)
uint8_t usbd_get_no_descriptors(struct usb_config_descriptor *cd, uint8_t type)
struct usb_descriptor * usb_desc_foreach(struct usb_config_descriptor *cd, struct usb_descriptor *_desc)
struct usb_interface_descriptor * usb_idesc_foreach(struct usb_config_descriptor *cd, struct usb_idesc_parse_state *ps)
void usb_proc_mwait(struct usb_process *up, void *_pm0, void *_pm1)
void * usb_proc_msignal(struct usb_process *up, void *_pm0, void *_pm1)
@ UQ_MSC_NO_TEST_UNIT_READY
@ UQ_MSC_NO_PREVENT_ALLOW
void usbd_free_config_desc(struct usb_device *udev, void *ptr)
usb_error_t usbd_req_get_device_status(struct usb_device *udev, struct mtx *mtx, struct usb_status *st)
usb_error_t usbd_req_set_config(struct usb_device *udev, struct mtx *mtx, uint8_t conf)
usb_error_t usbd_setup_device_desc(struct usb_device *udev, struct mtx *mtx)
usb_error_t usbd_req_set_alt_interface_no(struct usb_device *udev, struct mtx *mtx, uint8_t iface_index, uint8_t alt_no)
usb_error_t usbd_req_get_string_desc(struct usb_device *udev, struct mtx *mtx, void *sdesc, uint16_t max_len, uint16_t lang_id, uint8_t string_index)
usb_error_t usbd_req_get_config_desc_full(struct usb_device *udev, struct mtx *mtx, struct usb_config_descriptor **ppcd, uint8_t index)
usb_error_t usbd_req_get_string_any(struct usb_device *udev, struct mtx *mtx, char *buf, uint16_t len, uint8_t string_index)
usb_error_t usbd_req_re_enumerate(struct usb_device *udev, struct mtx *mtx)
usb_error_t usbd_req_clear_port_feature(struct usb_device *udev, struct mtx *mtx, uint8_t port, uint16_t sel)
usb_error_t usbd_req_set_address(struct usb_device *udev, struct mtx *mtx, uint16_t addr)
usb_error_t usbd_req_get_descriptor_ptr(struct usb_device *udev, struct usb_config_descriptor **ppcd, uint16_t wValue)
usb_error_t usbd_req_set_port_feature(struct usb_device *udev, struct mtx *mtx, uint8_t port, uint16_t sel)
usb_error_t usbd_req_get_port_status(struct usb_device *udev, struct mtx *mtx, struct usb_port_status *ps, uint8_t port)
void usbd_transfer_unsetup(struct usb_xfer **pxfer, uint16_t n_setup)
void usbd_transfer_start(struct usb_xfer *xfer)
void usb_command_wrapper(struct usb_xfer_queue *pq, struct usb_xfer *xfer)
void usbd_pipe_start(struct usb_xfer_queue *pq)
void usb_trim_spaces(char *p)
void usb_pause_mtx(struct mtx *mtx, int timo)
#define USB_MTX_UNLOCK(_m)
void() usb_proc_callback_t(struct usb_proc_msg *)
void usb_fifo_free(struct usb_fifo *f)
@ USB_ERR_NORMAL_COMPLETION
#define USB_MS_TO_TICKS(ms)