usb_device.h revision 207079
1184610Salfred/* $FreeBSD: head/sys/dev/usb/usb_device.h 207079 2010-04-22 22:00:16Z thompsa $ */ 2184610Salfred/*- 3184610Salfred * Copyright (c) 2008 Hans Petter Selasky. All rights reserved. 4184610Salfred * 5184610Salfred * Redistribution and use in source and binary forms, with or without 6184610Salfred * modification, are permitted provided that the following conditions 7184610Salfred * are met: 8184610Salfred * 1. Redistributions of source code must retain the above copyright 9184610Salfred * notice, this list of conditions and the following disclaimer. 10184610Salfred * 2. Redistributions in binary form must reproduce the above copyright 11184610Salfred * notice, this list of conditions and the following disclaimer in the 12184610Salfred * documentation and/or other materials provided with the distribution. 13184610Salfred * 14184610Salfred * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15184610Salfred * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16184610Salfred * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17184610Salfred * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18184610Salfred * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19184610Salfred * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20184610Salfred * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21184610Salfred * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22184610Salfred * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23184610Salfred * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24184610Salfred * SUCH DAMAGE. 25184610Salfred */ 26184610Salfred 27194230Sthompsa#ifndef _USB_DEVICE_H_ 28194230Sthompsa#define _USB_DEVICE_H_ 29184610Salfred 30192984Sthompsastruct usb_symlink; /* UGEN */ 31190180Sthompsastruct usb_device; /* linux compat */ 32184610Salfred 33184610Salfred#define USB_DEFAULT_XFER_MAX 2 34184610Salfred 35194228Sthompsa/* "usb_parse_config()" commands */ 36190730Sthompsa 37190730Sthompsa#define USB_CFG_ALLOC 0 38190730Sthompsa#define USB_CFG_FREE 1 39190730Sthompsa#define USB_CFG_INIT 2 40190730Sthompsa 41194228Sthompsa/* "usb_unconfigure()" flags */ 42190730Sthompsa 43190730Sthompsa#define USB_UNCFG_FLAG_NONE 0x00 44190730Sthompsa#define USB_UNCFG_FLAG_FREE_EP0 0x02 /* endpoint zero is freed */ 45190730Sthompsa 46192984Sthompsastruct usb_clear_stall_msg { 47192984Sthompsa struct usb_proc_msg hdr; 48192984Sthompsa struct usb_device *udev; 49184610Salfred}; 50184610Salfred 51192984Sthompsa/* The following four structures makes up a tree, where we have the 52192984Sthompsa * leaf structure, "usb_host_endpoint", first, and the root structure, 53192984Sthompsa * "usb_device", last. The four structures below mirror the structure 54192984Sthompsa * of the USB descriptors belonging to an USB configuration. Please 55192984Sthompsa * refer to the USB specification for a definition of "endpoints" and 56192984Sthompsa * "interfaces". 57192984Sthompsa */ 58192984Sthompsastruct usb_host_endpoint { 59192984Sthompsa struct usb_endpoint_descriptor desc; 60192984Sthompsa TAILQ_HEAD(, urb) bsd_urb_list; 61192984Sthompsa struct usb_xfer *bsd_xfer[2]; 62192984Sthompsa uint8_t *extra; /* Extra descriptors */ 63193045Sthompsa usb_frlength_t fbsd_buf_size; 64192984Sthompsa uint16_t extralen; 65192984Sthompsa uint8_t bsd_iface_index; 66192984Sthompsa} __aligned(USB_HOST_ALIGN); 67192984Sthompsa 68192984Sthompsastruct usb_host_interface { 69192984Sthompsa struct usb_interface_descriptor desc; 70192984Sthompsa /* the following array has size "desc.bNumEndpoint" */ 71192984Sthompsa struct usb_host_endpoint *endpoint; 72192984Sthompsa const char *string; /* iInterface string, if present */ 73192984Sthompsa uint8_t *extra; /* Extra descriptors */ 74192984Sthompsa uint16_t extralen; 75192984Sthompsa uint8_t bsd_iface_index; 76192984Sthompsa} __aligned(USB_HOST_ALIGN); 77192984Sthompsa 78184610Salfred/* 79184610Salfred * The following structure defines the USB device flags. 80184610Salfred */ 81192984Sthompsastruct usb_device_flags { 82192499Sthompsa enum usb_hc_mode usb_mode; /* host or device mode */ 83184610Salfred uint8_t self_powered:1; /* set if USB device is self powered */ 84184610Salfred uint8_t no_strings:1; /* set if USB device does not support 85184610Salfred * strings */ 86184610Salfred uint8_t remote_wakeup:1; /* set if remote wakeup is enabled */ 87184610Salfred uint8_t uq_bus_powered:1; /* set if BUS powered quirk is present */ 88191824Sthompsa 89191824Sthompsa /* 90191824Sthompsa * NOTE: Although the flags below will reach the same value 91191824Sthompsa * over time, but the instant values may differ, and 92191824Sthompsa * consequently the flags cannot be merged into one! 93191824Sthompsa */ 94191824Sthompsa uint8_t peer_suspended:1; /* set if peer is suspended */ 95191824Sthompsa uint8_t self_suspended:1; /* set if self is suspended */ 96184610Salfred}; 97184610Salfred 98184610Salfred/* 99186730Salfred * The following structure is used for power-save purposes. The data 100186730Salfred * in this structure is protected by the USB BUS lock. 101186730Salfred */ 102192984Sthompsastruct usb_power_save { 103193045Sthompsa usb_ticks_t last_xfer_time; /* copy of "ticks" */ 104193074Sthompsa usb_size_t type_refs[4]; /* transfer reference count */ 105193074Sthompsa usb_size_t read_refs; /* data read references */ 106193074Sthompsa usb_size_t write_refs; /* data write references */ 107186730Salfred}; 108186730Salfred 109186730Salfred/* 110184610Salfred * The following structure defines an USB device. There exists one of 111184610Salfred * these structures for every USB device. 112184610Salfred */ 113192984Sthompsastruct usb_device { 114192984Sthompsa struct usb_clear_stall_msg cs_msg[2]; /* generic clear stall 115184610Salfred * messages */ 116207079Sthompsa struct sx ctrl_sx; 117207079Sthompsa struct sx enum_sx; 118207079Sthompsa struct mtx device_mtx; 119207079Sthompsa struct cv ctrlreq_cv; 120207079Sthompsa struct cv ref_cv; 121192984Sthompsa struct usb_interface *ifaces; 122193644Sthompsa struct usb_endpoint default_ep; /* Control Endpoint 0 */ 123193644Sthompsa struct usb_endpoint *endpoints; 124192984Sthompsa struct usb_power_save pwr_save;/* power save data */ 125192984Sthompsa struct usb_bus *bus; /* our USB BUS */ 126184610Salfred device_t parent_dev; /* parent device */ 127192984Sthompsa struct usb_device *parent_hub; 128192984Sthompsa struct usb_device *parent_hs_hub; /* high-speed parent HUB */ 129192984Sthompsa struct usb_config_descriptor *cdesc; /* full config descr */ 130192984Sthompsa struct usb_hub *hub; /* only if this is a hub */ 131192984Sthompsa struct usb_xfer *default_xfer[USB_DEFAULT_XFER_MAX]; 132194228Sthompsa struct usb_temp_data *usb_template_ptr; 133193644Sthompsa struct usb_endpoint *ep_curr; /* current clear stall endpoint */ 134190191Sthompsa#if USB_HAVE_UGEN 135192984Sthompsa struct usb_fifo *fifo[USB_FIFO_MAX]; 136192984Sthompsa struct usb_symlink *ugen_symlink; /* our generic symlink */ 137190730Sthompsa struct cdev *default_dev; /* Control Endpoint 0 device node */ 138192984Sthompsa LIST_HEAD(,usb_fs_privdata) pd_list; 139190191Sthompsa char ugen_name[20]; /* name of ugenX.X device */ 140190191Sthompsa#endif 141193045Sthompsa usb_ticks_t plugtime; /* copy of "ticks" */ 142184610Salfred 143192500Sthompsa enum usb_dev_state state; 144192500Sthompsa enum usb_dev_speed speed; 145184610Salfred uint16_t refcount; 146184610Salfred#define USB_DEV_REF_MAX 0xffff 147184610Salfred 148184610Salfred uint16_t power; /* mA the device uses */ 149184610Salfred uint16_t langid; /* language for strings */ 150184610Salfred 151184610Salfred uint8_t address; /* device addess */ 152184610Salfred uint8_t device_index; /* device index in "bus->devices" */ 153184610Salfred uint8_t curr_config_index; /* current configuration index */ 154184610Salfred uint8_t curr_config_no; /* current configuration number */ 155184610Salfred uint8_t depth; /* distance from root HUB */ 156184610Salfred uint8_t port_index; /* parent HUB port index */ 157184610Salfred uint8_t port_no; /* parent HUB port number */ 158184610Salfred uint8_t hs_hub_addr; /* high-speed HUB address */ 159184610Salfred uint8_t hs_port_no; /* high-speed HUB port number */ 160184610Salfred uint8_t driver_added_refcount; /* our driver added generation count */ 161184610Salfred uint8_t power_mode; /* see USB_POWER_XXX */ 162190730Sthompsa uint8_t ifaces_max; /* number of interfaces present */ 163193644Sthompsa uint8_t endpoints_max; /* number of endpoints present */ 164184610Salfred 165184610Salfred /* the "flags" field is write-protected by "bus->mtx" */ 166184610Salfred 167192984Sthompsa struct usb_device_flags flags; 168184610Salfred 169193644Sthompsa struct usb_endpoint_descriptor default_ep_desc; /* for endpoint 0 */ 170192984Sthompsa struct usb_device_descriptor ddesc; /* device descriptor */ 171184610Salfred 172192938Sthompsa char *serial; /* serial number */ 173192938Sthompsa char *manufacturer; /* manufacturer string */ 174192938Sthompsa char *product; /* product string */ 175192984Sthompsa 176192984Sthompsa#if USB_HAVE_COMPAT_LINUX 177192984Sthompsa /* Linux compat */ 178192984Sthompsa struct usb_device_descriptor descriptor; 179192984Sthompsa struct usb_host_endpoint ep0; 180192984Sthompsa struct usb_interface *linux_iface_start; 181192984Sthompsa struct usb_interface *linux_iface_end; 182192984Sthompsa struct usb_host_endpoint *linux_endpoint_start; 183192984Sthompsa struct usb_host_endpoint *linux_endpoint_end; 184192984Sthompsa uint16_t devnum; 185192984Sthompsa#endif 186184610Salfred}; 187184610Salfred 188188987Sthompsa/* globals */ 189188987Sthompsa 190194228Sthompsaextern int usb_template; 191188987Sthompsa 192184610Salfred/* function prototypes */ 193184610Salfred 194194677Sthompsaconst char *usb_statestr(enum usb_dev_state state); 195194228Sthompsastruct usb_device *usb_alloc_device(device_t parent_dev, struct usb_bus *bus, 196192984Sthompsa struct usb_device *parent_hub, uint8_t depth, 197192500Sthompsa uint8_t port_index, uint8_t port_no, 198192500Sthompsa enum usb_dev_speed speed, enum usb_hc_mode mode); 199194228Sthompsausb_error_t usb_probe_and_attach(struct usb_device *udev, 200185948Sthompsa uint8_t iface_index); 201205036Sthompsavoid usb_detach_device(struct usb_device *, uint8_t, uint8_t); 202194228Sthompsausb_error_t usb_reset_iface_endpoints(struct usb_device *udev, 203185948Sthompsa uint8_t iface_index); 204194228Sthompsausb_error_t usbd_set_config_index(struct usb_device *udev, uint8_t index); 205194228Sthompsausb_error_t usbd_set_endpoint_stall(struct usb_device *udev, 206193644Sthompsa struct usb_endpoint *ep, uint8_t do_stall); 207194228Sthompsausb_error_t usb_suspend_resume(struct usb_device *udev, 208185948Sthompsa uint8_t do_suspend); 209194228Sthompsavoid usb_devinfo(struct usb_device *udev, char *dst_ptr, uint16_t dst_len); 210194228Sthompsavoid usb_free_device(struct usb_device *, uint8_t); 211184610Salfredvoid usb_linux_free_device(struct usb_device *dev); 212194228Sthompsauint8_t usb_peer_can_wakeup(struct usb_device *udev); 213194228Sthompsastruct usb_endpoint *usb_endpoint_foreach(struct usb_device *udev, struct usb_endpoint *ep); 214194228Sthompsavoid usb_set_device_state(struct usb_device *udev, 215192500Sthompsa enum usb_dev_state state); 216196498Salfredvoid usbd_enum_lock(struct usb_device *); 217196498Salfredvoid usbd_enum_unlock(struct usb_device *); 218196498Salfreduint8_t usbd_enum_is_locked(struct usb_device *); 219184610Salfred 220194230Sthompsa#endif /* _USB_DEVICE_H_ */ 221