Home | History | Annotate | Download | only in usb
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #ifndef	_SYS_USB_USBAI_H
     27 #define	_SYS_USB_USBAI_H
     28 
     29 
     30 #ifdef	__cplusplus
     31 extern "C" {
     32 #endif
     33 
     34 /* This header file is for USBA2.0 */
     35 #define	USBA_MAJOR_VER 2
     36 #define	USBA_MINOR_VER 0
     37 
     38 /*
     39  * USBAI: Interfaces Between USBA and Client Driver
     40  *
     41  *
     42  * Universal USB device state management :
     43  *
     44  *	PWRED_DWN---<3----4>--ONLINE---<2-----1>-DISCONNECTED
     45  *	    |			 ^		     |
     46  *	    |			 6		     |
     47  *	    |			 |		     |
     48  *	    |			 5		     |
     49  *	    |			 v		     |
     50  *	    +----5>----------SUSPENDED----<5----7>---+
     51  *
     52  *	1 = Device Unplug
     53  *	2 = Original Device reconnected
     54  *	3 = Device idles for time T & transitions to low power state
     55  *	4 = Remote wakeup by device OR Application kicking off IO to device
     56  *	5 = Notification to save state prior to DDI_SUSPEND
     57  *	6 = Notification to restore state after DDI_RESUME with correct device
     58  *	7 = Notification to restore state after DDI_RESUME with device
     59  *	    disconnected or a wrong device
     60  *
     61  *	NOTE: device states 0x80 to 0xff are device specific and can be
     62  *		used by client drivers
     63  */
     64 #define	USB_DEV_ONLINE		1	/* device is online */
     65 #define	USB_DEV_DISCONNECTED	2	/* indicates disconnect */
     66 #define	USB_DEV_SUSPENDED	3	/* DDI_SUSPEND operation */
     67 #define	USB_DEV_PWRED_DOWN	4	/* indicates power off state */
     68 
     69 
     70 /*
     71  * ***************************************************************************
     72  * USBA error and status definitions
     73  * ***************************************************************************
     74  */
     75 
     76 
     77 /*
     78  * USBA function return values
     79  */
     80 #define	USB_SUCCESS		0	/* call success			  */
     81 #define	USB_FAILURE		-1	/* unspecified USBA or HCD error  */
     82 #define	USB_NO_RESOURCES	-2	/* no resources available	  */
     83 #define	USB_NO_BANDWIDTH	-3	/* no bandwidth available	  */
     84 #define	USB_NOT_SUPPORTED	-4	/* function not supported by HCD  */
     85 #define	USB_PIPE_ERROR		-5	/* error occured on the pipe	  */
     86 #define	USB_INVALID_PIPE	-6	/* pipe handle passed is invalid  */
     87 #define	USB_NO_FRAME_NUMBER	-7	/* frame No or ASAP not specified */
     88 #define	USB_INVALID_START_FRAME	-8	/* starting USB frame not valid	  */
     89 #define	USB_HC_HARDWARE_ERROR	-9	/* usb host controller error	  */
     90 #define	USB_INVALID_REQUEST	-10	/* request had invalid values	  */
     91 #define	USB_INVALID_CONTEXT	-11	/* sleep flag in interrupt context */
     92 #define	USB_INVALID_VERSION	-12	/* invalid version specified	  */
     93 #define	USB_INVALID_ARGS	-13	/* invalid func args specified	  */
     94 #define	USB_INVALID_PERM	-14	/* privileged operation		  */
     95 #define	USB_BUSY		-15	/* busy condition		  */
     96 
     97 
     98 /*
     99  * USB request completion flags, more than one may be set.
    100  * The following flags are returned after a recovery action by
    101  * HCD or USBA (autoclearing) or callbacks from pipe_close,
    102  * abort, reset, or stop polling.  More than one may be set.
    103  *
    104  * For sync requests, the client should check the request structure
    105  * for this flag to determine what has happened.
    106  *
    107  * All callbacks are queued to preserve order.	Note that if a normal callback
    108  * uses a kernel thread, order is not guaranteed since each callback may use
    109  * its own thread.  The next request will be submitted to the
    110  * HCD after the threads exits.
    111  *
    112  * Exception callbacks using a kernel thread may do auto clearing and no
    113  * new request will be started until this thread has completed its work.
    114  */
    115 typedef enum {
    116 	USB_CB_NO_INFO		= 0x00, /* no exception */
    117 	USB_CB_STALL_CLEARED	= 0x01,	/* func stall cleared */
    118 	USB_CB_FUNCTIONAL_STALL	= 0x02,	/* func stall occurred */
    119 	USB_CB_PROTOCOL_STALL	= 0x04,	/* protocal stall occurred */
    120 	USB_CB_RESET_PIPE	= 0x10, /* pipe was reset */
    121 	USB_CB_ASYNC_REQ_FAILED = 0x80, /* thread couldn't be started */
    122 	USB_CB_NO_RESOURCES	= 0x100, /* no resources */
    123 	USB_CB_SUBMIT_FAILED	= 0x200, /* req was queued then submitted */
    124 					/* to HCD which rejected it */
    125 	USB_CB_INTR_CONTEXT	= 0x400 /* Callback is in interrupt context. */
    126 } usb_cb_flags_t;
    127 
    128 
    129 /*
    130  * completion reason
    131  *
    132  * Set by HCD; only one can be set.
    133  */
    134 typedef enum {
    135 	USB_CR_OK		= 0,	/* no errors detected		*/
    136 	USB_CR_CRC		= 1,	/* crc error detected		*/
    137 	USB_CR_BITSTUFFING	= 2,	/* bit stuffing violation	*/
    138 	USB_CR_DATA_TOGGLE_MM	= 3,	/* d/t PID did not match	*/
    139 	USB_CR_STALL		= 4,	/* e/p returned stall PID	*/
    140 	USB_CR_DEV_NOT_RESP	= 5,	/* device not responding	*/
    141 	USB_CR_PID_CHECKFAILURE = 6,	/* check bits on PID failed	*/
    142 	USB_CR_UNEXP_PID	= 7,	/* receive PID was not valid	*/
    143 	USB_CR_DATA_OVERRUN	= 8,	/* data size exceeded		*/
    144 	USB_CR_DATA_UNDERRUN	= 9,	/* less data received		*/
    145 	USB_CR_BUFFER_OVERRUN	= 10,	/* memory write can't keep up	*/
    146 	USB_CR_BUFFER_UNDERRUN	= 11,	/* buffer underrun		*/
    147 	USB_CR_TIMEOUT		= 12,	/* command timed out		*/
    148 	USB_CR_NOT_ACCESSED	= 13,	/* Not accessed by hardware	*/
    149 	USB_CR_NO_RESOURCES	= 14,	/* no resources			*/
    150 	USB_CR_UNSPECIFIED_ERR	= 15,	/* unspecified usba or hcd err	*/
    151 	USB_CR_STOPPED_POLLING	= 16,	/* intr/isoc IN polling stopped	*/
    152 	USB_CR_PIPE_CLOSING	= 17,	/* intr/isoc IN pipe closed	*/
    153 	USB_CR_PIPE_RESET	= 18,	/* intr/isoc IN pipe reset	*/
    154 	USB_CR_NOT_SUPPORTED	= 19,	/* command not supported	*/
    155 	USB_CR_FLUSHED		= 20,	/* this request was flushed	*/
    156 	USB_CR_HC_HARDWARE_ERR	= 21	/* usb host controller error	*/
    157 } usb_cr_t;
    158 
    159 
    160 /*
    161  * ***************************************************************************
    162  * General definitions, used all over
    163  * ***************************************************************************
    164  *
    165  *	A pipe handle is returned by usb_pipe_open() on success for
    166  *	all pipes except the default pipe which is accessed from
    167  *	the registration structure.  Placed here as forward referenced by
    168  *	usb_client_dev_data_t below.
    169  *
    170  *	The pipe_handle is opaque to the client driver.
    171  */
    172 typedef	struct usb_pipe_handle	*usb_pipe_handle_t;
    173 
    174 /*
    175  * General opaque pointer.
    176  */
    177 typedef struct usb_opaque *usb_opaque_t;
    178 
    179 
    180 /*
    181  * USB flags argument to USBA interfaces
    182  */
    183 typedef enum {
    184 	/* do not block until resources are available */
    185 	USB_FLAGS_NOSLEEP		= 0x0000,
    186 	/* block until resources are available */
    187 	USB_FLAGS_SLEEP			= 0x0100,
    188 	/* reserved */
    189 	USB_FLAGS_RESERVED		= 0xFE00
    190 } usb_flags_t;
    191 
    192 
    193 /*
    194  * ***************************************************************************
    195  * Descriptor definitions (from USB 2.0 specification, chapter 9)
    196  * ***************************************************************************
    197  */
    198 
    199 
    200 /*
    201  * USB Descriptor Management
    202  *
    203  * Standard USB descriptors:
    204  *
    205  * USB devices present their configuration information in response to
    206  * a GET_DESCRIPTOR request in a form which is little-endian and,
    207  * for multibyte integers, unaligned.  It is also position-dependent,
    208  * which makes non-sequential access to particular interface or
    209  * endpoint data inconvenient.
    210  * A GET_DESCRIPTOR request may yield a chunk of data that contains
    211  * multiple descriptor types.  For example, a GET_DESCRIPTOR request
    212  * for a CONFIGURATION descriptor could return the configuration
    213  * descriptor followed by an interface descriptor and the relevant
    214  * endpoint descriptors.
    215  *
    216  * usb_get_dev_data() interface provides an easy way to get all
    217  * the descriptors and avoids parsing standard descriptors by each
    218  * client driver
    219  *
    220  * usb_dev_descr:
    221  *	usb device descriptor, refer to	USB 2.0/9.6.1,
    222  */
    223 typedef struct usb_dev_descr {
    224 	uint8_t		bLength;	/* descriptor size		*/
    225 	uint8_t		bDescriptorType; /* set to DEVICE		*/
    226 	uint16_t	bcdUSB;		/* USB spec rel. number	in bcd	*/
    227 	uint8_t		bDeviceClass;	/* class code			*/
    228 	uint8_t		bDeviceSubClass; /* sub	class code		*/
    229 	uint8_t		bDeviceProtocol; /* protocol code		*/
    230 	uint8_t		bMaxPacketSize0; /* max	pkt size of e/p	0	*/
    231 	uint16_t	idVendor;	/* vendor ID			*/
    232 	uint16_t	idProduct;	/* product ID			*/
    233 	uint16_t	bcdDevice;	/* device release number in bcd	*/
    234 	uint8_t		iManufacturer;	/* manufacturing string		*/
    235 	uint8_t		iProduct;	/* product string		*/
    236 	uint8_t		iSerialNumber;	/* serial number string index	*/
    237 	uint8_t		bNumConfigurations; /* #configs for device	*/
    238 } usb_dev_descr_t;
    239 
    240 
    241 /*
    242  * USB Device Qualifier Descriptor
    243  *
    244  * The device_qualifier descriptor describes information about a High
    245  * speed capable device that would change if the device were operating
    246  * at other (Full) speed. Example: if the device is currently operating
    247  * at Full-speed, the device_qualifier returns information about how if
    248  * would operate at high-speed and vice-versa.
    249  *
    250  * usb_dev_qlf_descr:
    251  *
    252  *	usb device qualifier descriptor, refer to USB 2.0/9.6.2
    253  */
    254 typedef struct usb_dev_qlf_descr {
    255 	uint8_t		bLength;	/* descriptor size		*/
    256 	uint8_t		bDescriptorType; /* set to DEVICE		*/
    257 	uint16_t	bcdUSB;		/* USB spec rel. number	in bcd	*/
    258 	uint8_t		bDeviceClass;	/* class code			*/
    259 	uint8_t		bDeviceSubClass; /* sub	class code		*/
    260 	uint8_t		bDeviceProtocol; /* protocol code		*/
    261 	uint8_t		bMaxPacketSize0; /* max	pkt size of e/p	0	*/
    262 	uint8_t		bNumConfigurations; /* #configs for device	*/
    263 	uint8_t		bReserved;	/* reserved field		*/
    264 } usb_dev_qlf_descr_t;
    265 
    266 
    267 /*
    268  * usb_cfg_descr:
    269  *	usb configuration descriptor, refer to USB 2.0/9.6.3
    270  */
    271 typedef struct usb_cfg_descr {
    272 	uint8_t		bLength;	/* descriptor size		*/
    273 	uint8_t		bDescriptorType; /* set to CONFIGURATION	*/
    274 	uint16_t	wTotalLength;	/* total length of data returned */
    275 	uint8_t		bNumInterfaces;	/* # interfaces	in config	*/
    276 	uint8_t		bConfigurationValue; /* arg for SetConfiguration */
    277 	uint8_t		iConfiguration;	/* configuration string		*/
    278 	uint8_t		bmAttributes;	/* config characteristics	*/
    279 	uint8_t		bMaxPower;	/* max pwr consumption		*/
    280 } usb_cfg_descr_t;
    281 
    282 /*
    283  * Default configuration index setting for devices with multiple
    284  * configurations. Note the distinction between config index and config
    285  * number
    286  */
    287 #define	USB_DEV_DEFAULT_CONFIG_INDEX	0
    288 
    289 /*
    290  * bmAttribute values for Configuration Descriptor
    291  */
    292 #define	USB_CFG_ATTR_SELFPWR		0x40
    293 #define	USB_CFG_ATTR_REMOTE_WAKEUP	0x20
    294 #define	USB_CFG_ATTR_BAT_PWR		0x10
    295 
    296 /*
    297  * USB Other Speed Configuration Descriptor
    298  *
    299  * The other_speed_configuration descriptor describes a configuration of
    300  * a High speed capable device if it were operating at its other possible
    301  * (Full) speed and vice-versa.
    302  *
    303  * usb_other_speed_cfg_descr:
    304  *	usb other speed configuration descriptor, refer to USB 2.0/9.6.4
    305  */
    306 typedef struct usb_other_speed_cfg_descr {
    307 	uint8_t		bLength;	/* descriptor size		*/
    308 	uint8_t		bDescriptorType; /* set to CONFIGURATION	*/
    309 	uint16_t	wTotalLength;	/* total length of data returned */
    310 	uint8_t		bNumInterfaces;	/* # interfaces	in config	*/
    311 	uint8_t		bConfigurationValue; /* arg for SetConfiguration */
    312 	uint8_t		iConfiguration;	/* configuration string		*/
    313 	uint8_t		bmAttributes;	/* config characteristics	*/
    314 	uint8_t		bMaxPower;	/* max pwr consumption		*/
    315 } usb_other_speed_cfg_descr_t;
    316 
    317 
    318 /*
    319  * usb_ia_descr:
    320  *	usb interface association descriptor, refer to USB 2.0 ECN(IAD)
    321  */
    322 typedef  struct usb_ia_descr {
    323 	uint8_t		bLength;		/* descriptor size	*/
    324 	uint8_t		bDescriptorType;	/* INTERFACE_ASSOCIATION */
    325 	uint8_t		bFirstInterface;	/* 1st interface number */
    326 	uint8_t		bInterfaceCount;	/* number of interfaces */
    327 	uint8_t		bFunctionClass;		/* class code		*/
    328 	uint8_t		bFunctionSubClass;	/* sub class code	*/
    329 	uint8_t		bFunctionProtocol;	/* protocol code	*/
    330 	uint8_t		iFunction;		/* description string	*/
    331 } usb_ia_descr_t;
    332 
    333 
    334 /*
    335  * usb_if_descr:
    336  *	usb interface descriptor, refer	to USB 2.0/9.6.5
    337  */
    338 typedef  struct usb_if_descr {
    339 	uint8_t		bLength;		/* descriptor size	*/
    340 	uint8_t		bDescriptorType;	/* set to INTERFACE	*/
    341 	uint8_t		bInterfaceNumber;	/* interface number	*/
    342 	uint8_t		bAlternateSetting;	/* alt. interface number */
    343 	uint8_t		bNumEndpoints;		/* # of endpoints	*/
    344 	uint8_t		bInterfaceClass;	/* class code		*/
    345 	uint8_t		bInterfaceSubClass;	/* sub class code	*/
    346 	uint8_t		bInterfaceProtocol;	/* protocol code	*/
    347 	uint8_t		iInterface;		/* description string	*/
    348 } usb_if_descr_t;
    349 
    350 
    351 /*
    352  * usb_ep_descr:
    353  *	usb endpoint descriptor, refer to USB 2.0/9.6.6
    354  */
    355 typedef struct usb_ep_descr {
    356 	uint8_t		bLength;		/* descriptor size	*/
    357 	uint8_t		bDescriptorType;	/* set to ENDPOINT	*/
    358 	uint8_t		bEndpointAddress;	/* address of this e/p */
    359 	uint8_t		bmAttributes;		/* transfer type	*/
    360 	uint16_t	wMaxPacketSize;		/* maximum packet size	*/
    361 	uint8_t		bInterval;		/* e/p polling interval */
    362 } usb_ep_descr_t;
    363 
    364 /*
    365  * bEndpointAddress masks
    366  */
    367 #define	USB_EP_NUM_MASK		0x0F		/* endpoint number mask */
    368 #define	USB_EP_DIR_MASK		0x80		/* direction mask */
    369 #define	USB_EP_DIR_OUT		0x00		/* OUT endpoint */
    370 #define	USB_EP_DIR_IN		0x80		/* IN endpoint */
    371 
    372 /*
    373  * bmAttribute transfer types for endpoints
    374  */
    375 #define	USB_EP_ATTR_MASK	0x03		/* transfer type mask */
    376 #define	USB_EP_ATTR_CONTROL	0x00		/* control transfer */
    377 #define	USB_EP_ATTR_ISOCH	0x01		/* isochronous transfer */
    378 #define	USB_EP_ATTR_BULK	0x02		/* bulk transfer */
    379 #define	USB_EP_ATTR_INTR	0x03		/* interrupt transfer */
    380 
    381 /*
    382  * bmAttribute synchronization types for endpoints (isochronous only)
    383  */
    384 #define	USB_EP_SYNC_MASK	0x0C		/* synchronization mask */
    385 #define	USB_EP_SYNC_NONE	0x00		/* no synchronization */
    386 #define	USB_EP_SYNC_ASYNC	0x04		/* asynchronous */
    387 #define	USB_EP_SYNC_ADPT	0x08		/* adaptive */
    388 #define	USB_EP_SYNC_SYNC	0x0C		/* synchronous */
    389 
    390 /*
    391  * bmAttribute synchronization feedback types for endpoints (isochronous only)
    392  */
    393 #define	USB_EP_USAGE_MASK	0x30		/* sync feedback mask */
    394 #define	USB_EP_USAGE_DATA	0x00		/* data endpoint */
    395 #define	USB_EP_USAGE_FEED	0x10		/* feedback endpoint */
    396 #define	USB_EP_USAGE_IMPL	0x20		/* implicit feedback endpoint */
    397 
    398 /*
    399  * wMaxPacketSize values for endpoints (isoch and interrupt, high speed only)
    400  */
    401 #define	USB_EP_MAX_PKTSZ_MASK	0x03FF		/* Mask for packetsize bits */
    402 #define	USB_EP_MAX_XACTS_MASK	0x0C00		/* Max Transactns/microframe */
    403 #define	USB_EP_MAX_XACTS_SHIFT	10		/* Above is 10 bits from end */
    404 
    405 /*
    406  * Ranges for endpoint parameter values.
    407  */
    408 
    409 /* Min and Max NAK rates for high sped control endpoints. */
    410 #define	USB_EP_MIN_HIGH_CONTROL_INTRVL	0
    411 #define	USB_EP_MAX_HIGH_CONTROL_INTRVL	255
    412 
    413 /* Min and Max NAK rates for high speed bulk endpoints. */
    414 #define	USB_EP_MIN_HIGH_BULK_INTRVL	0
    415 #define	USB_EP_MAX_HIGH_BULK_INTRVL	255
    416 
    417 /* Min and Max polling intervals for low, full speed interrupt endpoints. */
    418 #define	USB_EP_MIN_LOW_INTR_INTRVL	1
    419 #define	USB_EP_MAX_LOW_INTR_INTRVL	255
    420 #define	USB_EP_MIN_FULL_INTR_INTRVL	1
    421 #define	USB_EP_MAX_FULL_INTR_INTRVL	255
    422 
    423 /*
    424  * Min and Max polling intervals for high speed interrupt endpoints, and for
    425  * isochronous endpoints.
    426  * Note that the interval is 2**(value-1).  See Section 9.6.6 of USB 2.0 spec.
    427  */
    428 #define	USB_EP_MIN_HIGH_INTR_INTRVL	1
    429 #define	USB_EP_MAX_HIGH_INTR_INTRVL	16
    430 #define	USB_EP_MIN_FULL_ISOCH_INTRVL	1
    431 #define	USB_EP_MAX_FULL_ISOCH_INTRVL	16
    432 #define	USB_EP_MIN_HIGH_ISOCH_INTRVL	1
    433 #define	USB_EP_MAX_HIGH_ISOCH_INTRVL	16
    434 
    435 /*
    436  * usb_string_descr:
    437  *	usb string descriptor, refer to	 USB 2.0/9.6.7
    438  */
    439 typedef struct usb_string_descr {
    440 	uint8_t		bLength;		/* descr size */
    441 	uint8_t		bDescriptorType;	/* set to STRING */
    442 	uint8_t		bString[1];		/* variable length unicode */
    443 						/* encoded string	*/
    444 } usb_string_descr_t;
    445 
    446 #define	USB_MAXSTRINGLEN	255		/* max string descr length */
    447 
    448 
    449 /*
    450  * usb_bos_descr:
    451  *	usb BOS descriptor, refer to WUSB 1.0/7.4.1
    452  */
    453 typedef struct usb_bos_descr {
    454 	uint8_t		bLength;
    455 	uint8_t		bDescriptorType;
    456 	uint16_t	wTotalLength;
    457 	uint8_t		bNumDeviceCaps;
    458 } usb_bos_descr_t;
    459 
    460 /*
    461  * usb_dev_cap_header:
    462  *	usb device capability descriptor header, refer to WUSB 1.0/7.4.1
    463  */
    464 typedef struct usb_cap_descr_header {
    465 	uint8_t		bLength;
    466 	uint8_t		bDescriptorType;
    467 	uint8_t		bDevCapabilityType;
    468 } usb_cap_descr_header_t;
    469 
    470 typedef struct usb_cap_descr {
    471 	uint8_t		bLength;
    472 	uint8_t		bDescriptorType;	/* set to DEVICE CAPABILITY */
    473 	uint8_t		bDevCapabilityType;
    474 	uint8_t		bCapValue[1];		/* variable length data */
    475 } usb_cap_descr_t;
    476 
    477 #define	USB_CAP_TYPE_WUSB	1
    478 
    479 /* Wireless USB device capability descriptor - UWB descriptor */
    480 typedef struct usb_uwb_cap_descr {
    481 	uint8_t		bLength;
    482 	uint8_t		bDescriptorType;
    483 	uint8_t		bDevCapabilityType;
    484 	uint8_t		bmAttributes;
    485 	uint16_t	wPHYRates;
    486 	uint8_t		bmTFITXPowerInfo;
    487 	uint8_t		bmFFITXPowerInfo;
    488 	uint16_t	bmBandGroup;
    489 	uint8_t		bReserved;
    490 } usb_uwb_cap_descr_t;
    491 
    492 /*
    493  * usb_ep_comp_descr:
    494  *	usb endpoint companion descriptor, refer to WUSB 1.0/7.4.4
    495  */
    496 typedef struct usb_ep_comp_descr {
    497 	uint8_t		bLength;
    498 	uint8_t		bDescriptorType;
    499 	uint8_t		bMaxBurst;
    500 	uint8_t		bMaxSequence;
    501 	uint16_t	wMaxStreamDelay;
    502 	uint16_t	wOverTheAirPacketSize;
    503 	uint8_t		bOverTheAirInterval;
    504 	uint8_t		bmCompAttributes;
    505 } usb_ep_comp_descr_t;
    506 
    507 /*
    508  * usb_security_descr:
    509  *	usb security descriptor, refer to WUSB 1.0/7.4.5
    510  */
    511 typedef struct usb_security_descr {
    512 	uint8_t		bLength;
    513 	uint8_t		bDescriptorType;
    514 	uint16_t	wTotalLength;
    515 	uint8_t		bNumEncryptionTypes;
    516 } usb_security_descr_t;
    517 
    518 /*
    519  * usb_encryption_descr:
    520  *	usb encryption descriptor, refer to WUSB 1.0/7.4.5
    521  */
    522 typedef struct usb_encryption_descr {
    523 	uint8_t		bLength;
    524 	uint8_t		bDescriptorType;
    525 	uint8_t		bEncryptionType;
    526 	uint8_t		bEncryptionValue;
    527 	uint8_t		bAuthKeyIndex;
    528 } usb_encryption_descr_t;
    529 
    530 #define	USB_ENC_TYPE_UNSECURE		0x00
    531 #define	USB_ENC_TYPE_WIRED		0x01
    532 #define	USB_ENC_TYPE_CCM_1		0x02
    533 #define	USB_ENC_TYPE_RSA_1		0x03
    534 
    535 /*
    536  * usb_key_descr:
    537  *	usb key descriptor, refer to WUSB 1.0/7.4.5
    538  */
    539 typedef struct usb_key_descr {
    540 	uint8_t		bLength;
    541 	uint8_t		bDescriptorType;
    542 	uint8_t		tTKID[3];
    543 	uint8_t		bReserved;
    544 	uint8_t		KeyData[1];	/* variable length */
    545 } usb_key_descr_t;
    546 
    547 #define	USB_EP_COMP_DESCR_SIZE		10
    548 #define	USB_BOS_DESCR_SIZE		5
    549 #define	USB_CAP_DESCR_HEADER_SIZE	3
    550 #define	USB_UWB_CAP_DESCR_SIZE		11
    551 #define	USB_SECURITY_DESCR_SIZE		5
    552 #define	USB_ENCRYPTION_DESCR_SIZE	5
    553 
    554 
    555 /*
    556  * ***************************************************************************
    557  * Client driver registration with USBA
    558  * ***************************************************************************
    559  *
    560  *	The client registers with USBA during attach in two steps
    561  *	using usb_client_attach() and usb_get_dev_data(). On completion, the
    562  *	registration data has been initialized.  Most data items are
    563  *	straightforward.  Among the items returned in the data is the tree of
    564  *	parsed descriptors, in dev_cfg;	 the number of configurations parsed,
    565  *	in dev_n_cfg; a pointer to the current configuration in the tree,
    566  *	in dev_curr_cfg; the index of the first valid interface in the
    567  *	tree, in dev_curr_if, and a parse level that accurately reflects what
    568  *	is in the tree, in dev_parse_level.
    569  */
    570 
    571 
    572 /*
    573  * ***************************************************************************
    574  * Data structures used in the configuration tree
    575  * ***************************************************************************
    576  */
    577 
    578 /*
    579  * Tree data structure for each configuration in the tree
    580  */
    581 typedef struct usb_cfg_data {
    582 	struct usb_cfg_descr	cfg_descr;	/* parsed config descr */
    583 	struct usb_if_data	*cfg_if;	/* interfaces for this cfg */
    584 						/* indexed by interface num */
    585 	struct usb_cvs_data	*cfg_cvs;	/* class/vendor specific */
    586 						/* descrs mod/extend cfg */
    587 	char			*cfg_str;	/* string descriptor */
    588 	uint_t			cfg_n_if;	/* #elements in cfg_if[] */
    589 	uint_t			cfg_n_cvs;	/* #elements in cfg_cvs[] */
    590 	uint_t			cfg_strsize;	/* size of string descr */
    591 } usb_cfg_data_t;
    592 
    593 
    594 /*
    595  * Tree data structure for each alternate interface set
    596  * in each represented configuration
    597  */
    598 typedef struct usb_if_data {
    599 	struct usb_alt_if_data	*if_alt;	/* sparse array of alts */
    600 						/* indexed by alt setting */
    601 	uint_t			if_n_alt;	/* #elements in if_alt[] */
    602 } usb_if_data_t;
    603 
    604 
    605 /*
    606  * Tree data structure for each alternate of each alternate interface set
    607  */
    608 typedef struct usb_alt_if_data {
    609 	usb_if_descr_t		altif_descr;	/* parsed alternate if descr */
    610 	struct usb_ep_data	*altif_ep;	/* endpts for alt if */
    611 						/* (not a sparse array */
    612 	struct usb_cvs_data	*altif_cvs;	/* cvs for this alt if */
    613 	char			*altif_str;	/* string descriptor */
    614 	uint_t			altif_n_ep;	/* #elements in altif_ep[] */
    615 	uint_t			altif_n_cvs;	/* #elements in  altif_cvs[] */
    616 	uint_t			altif_strsize;	/* size of string descr */
    617 } usb_alt_if_data_t;
    618 
    619 
    620 /*
    621  * Tree data structure for each endpoint of each alternate
    622  */
    623 typedef struct usb_ep_data {
    624 	usb_ep_descr_t		ep_descr;	/* endpoint descriptor */
    625 	usb_ep_comp_descr_t	ep_comp_descr;	/* endpoint companion descr */
    626 	struct usb_cvs_data	*ep_cvs;	/* cv mod/extending this ep */
    627 	uint_t			ep_n_cvs;	/* #elements in ep_cvs[] */
    628 } usb_ep_data_t;
    629 
    630 
    631 /*
    632  * Tree data structure for each class/vendor specific descriptor
    633  */
    634 typedef struct usb_cvs_data {
    635 	uchar_t			*cvs_buf;	/* raw data of cvs descr */
    636 	uint_t			cvs_buf_len;	/* cvs_buf size */
    637 } usb_cvs_data_t;
    638 
    639 
    640 /*
    641  * Data structure for wireless USB specific descriptor
    642  */
    643 typedef struct usb_bos_data {
    644 	usb_bos_descr_t		bos_descr;	/* parsed bos descr */
    645 	usb_uwb_cap_descr_t	bos_uwb_cap;	/* uwb cap descr */
    646 } usb_bos_data_t;
    647 
    648 
    649 /*
    650  *	Parse_level determines the extent to which the tree is built, the amount
    651  *	of parsing usb_client_attach() is to do.  It has the following values:
    652  *
    653  *	USB_PARSE_LVL_NONE - Build no tree.  dev_n_cfg will return 0, dev_cfg
    654  *			     will return NULL, the dev_curr_xxx fields will be
    655  *			     invalid.
    656  *	USB_PARSE_LVL_IF   - Parse configured interface only, if configuration#
    657  *			     and interface properties are set (as when different
    658  *			     interfaces are viewed by the OS as different device
    659  *			     instances). If an OS device instance is set up to
    660  *			     represent an entire physical device, this works
    661  *			     like USB_PARSE_LVL_ALL.
    662  *	USB_PARSE_LVL_CFG  - Parse entire configuration of configured interface
    663  *			     only.  This is like USB_PARSE_LVL_IF except entire
    664  *			     configuration is returned.
    665  *	USB_PARSE_LVL_ALL  - Parse entire device (all configurations), even
    666  *			     when driver is bound to a single interface of a
    667  *			     single configuration.
    668  */
    669 typedef enum {
    670 	USB_PARSE_LVL_NONE		= 0,
    671 	USB_PARSE_LVL_IF		= 1,
    672 	USB_PARSE_LVL_CFG		= 2,
    673 	USB_PARSE_LVL_ALL		= 3
    674 } usb_reg_parse_lvl_t;
    675 
    676 
    677 /*
    678  * Registration data returned by usb_get_dev_data().  Configuration tree roots
    679  * are returned in dev_cfg array.
    680  */
    681 typedef struct usb_client_dev_data {
    682 	usb_pipe_handle_t	dev_default_ph;	/* default pipe handle */
    683 	ddi_iblock_cookie_t	dev_iblock_cookie; /* for mutex_init's */
    684 	struct usb_dev_descr	*dev_descr;	/* cooked device descriptor */
    685 	char			*dev_mfg;	/* manufacturing ID */
    686 	char			*dev_product;	/* product ID */
    687 	char			*dev_serial;	/* serial number */
    688 	usb_reg_parse_lvl_t	dev_parse_level; /* USB_PARSE_LVL_* flag */
    689 	struct usb_cfg_data	*dev_cfg;	/* configs for this device */
    690 						/* indexed by config index */
    691 	uint_t			dev_n_cfg;	/* #elements in dev_cfg[] */
    692 	struct usb_cfg_data	*dev_curr_cfg;	/* current cfg */
    693 	int			dev_curr_if;	/* current interface number */
    694 	struct usb_bos_data	*dev_bos;	/* bos for this device */
    695 } usb_client_dev_data_t;
    696 
    697 
    698 /*
    699  * ***************************************************************************
    700  * Device configuration descriptor tree functions
    701  * ***************************************************************************
    702  */
    703 
    704 /*
    705  * usb_get_dev_data:
    706  *	returns initialized registration data. 	Most data items are clear.
    707  *	Among the items returned is the tree ofparsed descriptors in dev_cfg;
    708  *	and the number of configurations parsed in dev_n_cfg.
    709  *
    710  * Arguments:
    711  *	dip		- pointer to devinfo node of the client
    712  *	dev_data	- return registration data at this address
    713  *	parse_level	- See above
    714  *	flags		- None used
    715  *
    716  * Return Values:
    717  *	USB_SUCCESS		- usb_register_client succeeded
    718  *	USB_INVALID_ARGS	- received null dip or reg argument
    719  *	USB_INVALID_CONTEXT	- called with sleep from callback context
    720  *	USB_FAILURE		- bad descriptor info or other internal failure
    721  *
    722  * Notes:
    723  * 	1) The non-standard USB descriptors are returned in RAW format.
    724  *
    725  *	2) The registration data is unshared. Each client receives its own copy.
    726  *	(The default control pipe may be shared, even though its tree
    727  *	description will be unique per device.)
    728  *
    729  */
    730 int usb_get_dev_data(
    731 	dev_info_t			*dip,
    732 	usb_client_dev_data_t		**dev_data,
    733 	usb_reg_parse_lvl_t		parse_level,
    734 	usb_flags_t			flags);
    735 
    736 /*
    737  * usb_free_dev_data:
    738  * undoes what usb_get_dev_data() set up.  It releases
    739  * memory for all strings, descriptors, and trees set up by usb_get_dev_data().
    740  *
    741  * Arguments:
    742  *	dip		- pointer to devinfo node of the client
    743  *	dev_data	- pointer to registration data containing the tree.
    744  */
    745 void usb_free_dev_data(
    746 	dev_info_t			*dip,
    747 	usb_client_dev_data_t		*dev_data);
    748 
    749 /*
    750  * usb_free_descr_tree:
    751  *	Take down the configuration tree while leaving the rest	of the
    752  *	registration intact.  This can be used, for example, after attach has
    753  *	copied any descriptors it needs from the tree, but the rest of the
    754  *	registration data needs to remain intact.
    755  *
    756  *	The following usb_client_dev_data_t fields will be modified:
    757  *		dev_cfg will be NULL
    758  *		dev_n_cfg will be 0
    759  *		dev_curr_cfg_ndx and dev_curr_if will be invalid
    760  *		dev_parse_level will be USB_REG_DESCR_NONE
    761  *
    762  * Arguments:
    763  *	dip		- pointer to devinfo node of the client
    764  *	dev_data	- pointer to registration data containing the tree.
    765  */
    766 void usb_free_descr_tree(
    767 	dev_info_t			*dip,
    768 	usb_client_dev_data_t		*dev_data);
    769 
    770 
    771 /*
    772  * usb_print_descr_tree:
    773  *	Dump to the screen a descriptor tree as returned by
    774  *	usbai_register_client.
    775  *
    776  * Arguments:
    777  *	dip		- pointer to devinfo of the client
    778  *	dev_data	- pointer to registration area containing the tree
    779  *
    780  * Returns:
    781  *	USB_SUCCESS		- tree successfully dumped
    782  *	USB_INVALID_CONTEXT	- called from callback context
    783  *	USB_INVALID_ARGS	- bad arguments given
    784  */
    785 int usb_print_descr_tree(
    786 	dev_info_t		*dip,
    787 	usb_client_dev_data_t	*dev_data);
    788 
    789 
    790 /*
    791  * ***************************************************************************
    792  * Registration and versioning
    793  * ***************************************************************************
    794  */
    795 
    796 
    797 /*
    798  * USBA client drivers are required to define USBDRV_MAJOR_VER
    799  * USBDRV_MINOR_VER and pass USBDRV_VERSION as the version
    800  * number to usb_client_attach
    801  */
    802 #if !defined(USBA_MAJOR_VER) || !defined(USBA_MINOR_VER)
    803 #error incorrect USBA header
    804 #endif
    805 
    806 /*
    807  * Driver major version must be the same as USBA major version, and
    808  * driver minor version must be <= USBA minor version
    809  */
    810 #if !defined(USBA_FRAMEWORK)
    811 #if defined(USBDRV_MAJOR_VER) && defined(USBDRV_MINOR_VER)
    812 
    813 #if (USBDRV_MAJOR_VER != USBA_MAJOR_VER)
    814 #error USBA and driver major versions do not match
    815 #endif
    816 #if (USBDRV_MINOR_VER > USBA_MINOR_VER)
    817 #error USBA and driver minor versions do not match
    818 #endif
    819 
    820 #endif
    821 #endif
    822 
    823 #define	USBA_MAKE_VER(major, minor) ((major) << 8 | (minor))
    824 #define	USBA_GET_MAJOR(ver) ((ver) >> 8)
    825 #define	USBA_GET_MINOR(ver) ((ver) & 0xff)
    826 
    827 #define	USBDRV_VERSION	USBA_MAKE_VER(USBDRV_MAJOR_VER, USBDRV_MINOR_VER)
    828 
    829 
    830 /*
    831  * usb_client_attach:
    832  *
    833  * Arguments:
    834  *	dip		- pointer to devinfo node of the client
    835  *	version 	- USBA registration version number
    836  *	flags		- None used
    837  *
    838  * Return Values:
    839  *	USB_SUCCESS		- attach succeeded
    840  *	USB_INVALID_ARGS	- received null dip or reg argument
    841  *	USB_INVALID_CONTEXT	- called with sleep from callback context
    842  *				  or not at attach time
    843  *	USB_INVALID_VERSION	- version argument is incorrect.
    844  *	USB_FAILURE		- other internal failure
    845  */
    846 int usb_client_attach(
    847 	dev_info_t			*dip,
    848 	uint_t				version,
    849 	usb_flags_t			flags);
    850 
    851 /*
    852  * usb_client_detach:
    853  *
    854  * Arguments:
    855  *	dip		- pointer to devinfo node of the client
    856  *	dev_data	- pointer to data to free. may be NULL
    857  */
    858 void usb_client_detach(
    859 	dev_info_t			*dip,
    860 	struct usb_client_dev_data	*dev_data);
    861 
    862 /*
    863  * ***************************************************************************
    864  * Functions for parsing / retrieving data from the descriptor tree
    865  * ***************************************************************************
    866  */
    867 
    868 /*
    869  * Function for unpacking any kind of little endian data, usually desriptors
    870  *
    871  * Arguments:
    872  *	format		- string indicating the format in c, s, w, eg. "2c4ws"
    873  *			  which describes 2 bytes, 4 int, one short.
    874  *			  The number prefix parses the number of items of
    875  *			  the following type.
    876  *	data		- pointer to the LE data buffer
    877  *	datalen		- length of the data
    878  *	structure	- pointer to return structure where the unpacked data
    879  *			  will be written
    880  *	structlen	- length of the return structure
    881  *
    882  * return value:
    883  *	total number of bytes of the original data that was unpacked
    884  *	or USB_PARSE_ERROR
    885  */
    886 #define	USB_PARSE_ERROR	0
    887 
    888 size_t usb_parse_data(
    889 	char			*format,
    890 	uchar_t 		*data,
    891 	size_t			datalen,
    892 	void			*structure,
    893 	size_t			structlen);
    894 
    895 /*
    896  * usb_lookup_ep_data:
    897  *	Function to get specific endpoint data
    898  *	This function will not access the device.
    899  *
    900  * Arguments:
    901  *	dip		- pointer to dev info
    902  *	dev_datap	- pointer to registration data
    903  *	interface	- requested interface
    904  *	alternate	- requested alternate
    905  *	skip		- number of endpoints which match the requested type and
    906  *			  direction to skip before finding one to retrieve
    907  *	type		- endpoint type
    908  *	direction	- endpoint direction: USB_EP_DIR_IN/OUT or none
    909  *
    910  * Return Values:
    911  *	NULL or an endpoint data pointer
    912  */
    913 usb_ep_data_t *usb_lookup_ep_data(
    914 	dev_info_t		*dip,
    915 	usb_client_dev_data_t	*dev_datap,
    916 	uint_t			interface,
    917 	uint_t			alternate,
    918 	uint_t			skip,
    919 	uint_t			type,
    920 	uint_t			direction);
    921 
    922 
    923 /* Language ID for string descriptors. */
    924 #define	USB_LANG_ID		0x0409		/* English, US */
    925 
    926 /*
    927  * usb_get_string_descr:
    928  *	Reads the string descriptor.  This function access the device and
    929  *	blocks.
    930  *
    931  * Arguments:
    932  *	dip		- pointer to devinfo of the client.
    933  *	langid		- LANGID to read different LOCALEs.
    934  *	index		- index to the string.
    935  *	buf		- user provided buffer for string descriptor.
    936  *	buflen		- user provided length of the buffer.
    937  *
    938  * Return Values:
    939  *	USB_SUCCESS	- descriptor is valid.
    940  *	USB_FAILURE	- full descriptor could not be retrieved.
    941  */
    942 int usb_get_string_descr(
    943 	dev_info_t		*dip,
    944 	uint16_t		langid,
    945 	uint8_t			index,
    946 	char			*buf,
    947 	size_t			buflen);
    948 
    949 
    950 /*
    951  * ***************************************************************************
    952  * Addressing utility functions
    953  * ***************************************************************************
    954  */
    955 
    956 /*
    957  * usb_get_addr returns the current usb address, mostly for debugging
    958  * purposes. The address may change after hotremove/insert.
    959  * This address will not change on a disconnect/reconnect of open device.
    960  */
    961 int usb_get_addr(dev_info_t *dip);
    962 
    963 
    964 /*
    965  * usb_get_if_number returns USB_COMBINED_NODE or USB_DEVICE_NODE
    966  * if the driver is responsible for the entire device.
    967  * Otherwise it returns the interface number.
    968  */
    969 #define	USB_COMBINED_NODE	-1
    970 #define	USB_DEVICE_NODE		-2
    971 
    972 int usb_get_if_number(
    973 	dev_info_t		*dip);
    974 
    975 boolean_t usb_owns_device(
    976 	dev_info_t		*dip);
    977 
    978 
    979 /*
    980  * ***************************************************************************
    981  * Pipe	Management definitions and functions
    982  * ***************************************************************************
    983  */
    984 
    985 
    986 /*
    987  *
    988  * usb_pipe_state:
    989  *
    990  * PIPE_STATE_IDLE:
    991  *	The pipe's policy is set, but the pipe currently isn't transferring
    992  *	data.
    993  *
    994  * PIPE_STATE_ACTIVE:
    995  *	The pipe's policy has been set, and the pipe is able to transmit data.
    996  *	When a control or bulk pipe is opened, the pipe's state is
    997  *	automatically set to PIPE_STATE_ACTIVE.  For an interrupt or
    998  *	isochronous pipe, the pipe state becomes PIPE_STATE_ACTIVE once
    999  *	the polling on the pipe has been initiated.
   1000  *
   1001  * PIPE_STATE_ERROR:
   1002  *	The device has generated a error on the pipe.  The client driver
   1003  *	must call usb_pipe_reset() to clear any leftover state that's associated
   1004  *	with the pipe, clear the data toggle, and reset the state of the pipe.
   1005  *
   1006  *	Calling usb_pipe_reset() on a control or bulk pipe resets the state to
   1007  *	PIPE_STATE_ACTIVE.  Calling usb_pipe_reset() on an interrupt or
   1008  *	isochronous pipe, resets the state to PIPE_STATE_IDLE.
   1009  *
   1010  * State Diagram for Bulk/Control
   1011  *
   1012  *			+-<--normal completion------------------<-------^
   1013  *			|						|
   1014  *			V						|
   1015  * usb_pipe_open-->[PIPE_STATE_IDLE]-usb_pipe_*_xfer->[PIPE_STATE_ACTIVE]
   1016  *			^						|
   1017  *			|						v
   1018  *			- usb_pipe_reset<-[PIPE_STATE_ERROR]<-device error
   1019  *
   1020  * State Diagram for Interrupt/Isochronous IN
   1021  *
   1022  *			+-<--usb_pipe_stop_isoc/intr_polling----<-------^
   1023  *			|						|
   1024  *			V						|
   1025  * usb_pipe_open-->[PIPE_STATE_IDLE]-usb_pipe_*_xfer->[PIPE_STATE_ACTIVE]
   1026  *			^						|
   1027  *			|						v
   1028  *			+ usb_pipe_reset<-[PIPE_STATE_ERROR]<-device error
   1029  *
   1030  * State Diagram for Interrupt/Isochronous OUT
   1031  *
   1032  *			+-<--normal completion------------------<-------^
   1033  *			|						|
   1034  *			V						|
   1035  * usb_pipe_open-->[PIPE_STATE_IDLE]-usb_pipe_*_xfer->[PIPE_STATE_ACTIVE]
   1036  *			^						|
   1037  *			|						v
   1038  *			+ usb_pipe_reset<-[PIPE_STATE_ERROR]<-device error
   1039  *
   1040  *
   1041  * The following table indicates which operations are allowed with each
   1042  * pipe state:
   1043  *
   1044  * -------------------------------------------------------------------------+
   1045  * ctrl/bulk	| idle	| active     | error  | sync closing | async closing|
   1046  * -------------------------------------------------------------------------+
   1047  * pipe xfer	|  OK	|queue (USBA)| reject | reject	     | reject	    |
   1048  * pipe reset	| no-op | OK	     |	OK    | reject	     | reject	    |
   1049  * pipe close	|  OK	| wait&close |	OK    | no-op	     | no-op	    |
   1050  * -------------------------------------------------------------------------+
   1051  *
   1052  * -------------------------------------------------------------------------+
   1053  * intr/isoc IN | idle	| active     | error  | sync closing | async closing|
   1054  * -------------------------------------------------------------------------+
   1055  * pipe xfer	|  OK	| reject     | reject | reject	     | reject	    |
   1056  * pipe stoppoll| no-op | OK	     | no-op  | reject	     | reject	    |
   1057  * pipe reset	| no-op | OK	     |	OK    | reject	     | reject	    |
   1058  * pipe close	|  OK	| wait&close |	OK    | no-op	     | no-op	    |
   1059  * -------------------------------------------------------------------------+
   1060  *
   1061  * -------------------------------------------------------------------------+
   1062  * intr/isoc OUT| idle	| active     | error  | sync closing | async closing|
   1063  * -------------------------------------------------------------------------+
   1064  * pipe xfer	|  OK	|queue (HCD) | reject | reject	     | reject	    |
   1065  * pipe stoppoll| reject| reject     | reject | reject	     | reject	    |
   1066  * pipe reset	| no-op | OK	     |	OK    | reject	     | reject	    |
   1067  * pipe close	|  OK	| wait&close |	OK    | no-op	     | no-op	    |
   1068  * -------------------------------------------------------------------------+
   1069  */
   1070 typedef enum {
   1071 	USB_PIPE_STATE_CLOSED		= 0,
   1072 	USB_PIPE_STATE_IDLE		= 1,
   1073 	USB_PIPE_STATE_ACTIVE		= 2,
   1074 	USB_PIPE_STATE_ERROR		= 3,
   1075 	USB_PIPE_STATE_CLOSING		= 4
   1076 } usb_pipe_state_t;
   1077 
   1078 
   1079 /*
   1080  * pipe state control:
   1081  *
   1082  * return values:
   1083  *	USB_SUCCESS	 - success
   1084  *	USB_FAILURE	 - unspecified failure
   1085  */
   1086 int usb_pipe_get_state(
   1087 	usb_pipe_handle_t	pipe_handle,
   1088 	usb_pipe_state_t	*pipe_state,
   1089 	usb_flags_t		flags);
   1090 
   1091 
   1092 /*
   1093  * usb_pipe_policy
   1094  *
   1095  *	Pipe policy specifies how a pipe to an endpoint	should be used
   1096  *	by the client driver and the HCD.
   1097  */
   1098 typedef struct usb_pipe_policy {
   1099 	/*
   1100 	 * This is a hint indicating how many asynchronous operations
   1101 	 * requiring a kernel thread will be concurrently active.
   1102 	 * Allow at least one for synch exception callback handling
   1103 	 * and another for asynchronous closing of pipes.
   1104 	 */
   1105 	uchar_t		pp_max_async_reqs;
   1106 } usb_pipe_policy_t;
   1107 
   1108 
   1109 /*
   1110  * usb_pipe_open():
   1111  *
   1112  * Before using any pipe including the default pipe, it must be opened.
   1113  * On success, a pipe handle is returned for use in other usb_pipe_*()
   1114  * functions.
   1115  *
   1116  * The default pipe can only be opened by the hub driver.
   1117  *
   1118  * For isochronous and interrupt pipes, bandwidth has been allocated and
   1119  * guaranteed.
   1120  *
   1121  * Only the default pipe can be shared.  All other control pipes are
   1122  * excusively opened by default.  A pipe policy and endpoint descriptor
   1123  * must always be provided except for default pipe.
   1124  *
   1125  * Arguments:
   1126  *	dip		- devinfo ptr.
   1127  *	ep		- endpoint descriptor pointer.
   1128  *	pipe_policy	- pointer to pipe policy which provides hints on how
   1129  *			  the pipe will be used.
   1130  *	flags		- USB_FLAGS_SLEEP wait for resources to become
   1131  *			  available.
   1132  *	pipe_handle	- a pipe handle pointer.  on a successful open,
   1133  *			  a pipe_handle is returned in this pointer.
   1134  *
   1135  * Return values:
   1136  *	USB_SUCCESS	 - open succeeded.
   1137  *	USB_FAILURE	 - unspecified open failure or pipe is already open.
   1138  *	USB_NO_RESOURCES - no resources were available to complete the open.
   1139  *	USB_NO_BANDWIDTH - no bandwidth available (isoc/intr pipes).
   1140  *	USB_*		 - refer to list of all possible return values in
   1141  *			   this file
   1142  */
   1143 int usb_pipe_open(
   1144 	dev_info_t		*dip,
   1145 	usb_ep_descr_t		*ep,
   1146 	usb_pipe_policy_t	*pipe_policy,
   1147 	usb_flags_t		flags,
   1148 	usb_pipe_handle_t	*pipe_handle);
   1149 
   1150 
   1151 /*
   1152  * usb_pipe_close():
   1153  *
   1154  * Closes the pipe, releases resources and frees the pipe_handle.
   1155  * Automatic polling, if active,  will be terminated.
   1156  *
   1157  * Arguments:
   1158  *	dip		- devinfo ptr.
   1159  *	pipe_handle	- pipe handle.
   1160  *	flags		- USB_FLAGS_SLEEP:
   1161  *				wait for resources, pipe
   1162  *				to become free, and all callbacks completed.
   1163  *	cb		- If USB_FLAGS_SLEEP has not been specified, a
   1164  *			  callback will be performed.
   1165  *	cb_arg		- the 2nd argument of the callback. Note that the
   1166  *			  pipehandle will be zeroed and therefore not passed.
   1167  *
   1168  * Notes:
   1169  *
   1170  * Pipe close always succeeds regardless whether USB_FLAGS_SLEEP has been
   1171  * specified or not.  An async close will always succeed if the hint in the
   1172  * pipe policy has been correct about the max number of async requests
   1173  * required.
   1174  * In the unlikely event that no async requests can be queued, this
   1175  * function will continue retrying before returning
   1176  *
   1177  * USBA prevents the client from submitting subsequent requests to a pipe
   1178  * that is being closed.
   1179  * Additional usb_pipe_close() requests on the same pipe causes USBA to
   1180  * wait for the previous close(s) to complete.
   1181  *
   1182  * The pipe will not be destroyed until all activity on the pipe has
   1183  * been drained, including outstanding request callbacks, async requests,
   1184  * and other usb_pipe_*() calls.
   1185  *
   1186  * Calling usb_pipe_close() from a deferred callback (in kernel context)
   1187  * with USB_FLAGS_SLEEP set, will cause deadlock
   1188  */
   1189 void usb_pipe_close(
   1190 	dev_info_t		*dip,
   1191 	usb_pipe_handle_t	pipe_handle,
   1192 	usb_flags_t		flags,
   1193 	void			(*cb)(
   1194 				    usb_pipe_handle_t	ph,
   1195 				    usb_opaque_t	arg,	/* cb arg */
   1196 				    int			rval,
   1197 				    usb_cb_flags_t	flags),
   1198 	usb_opaque_t		cb_arg);
   1199 
   1200 
   1201 /*
   1202  * usb_pipe_drain_reqs
   1203  *	this function blocks until there are no more requests
   1204  *	owned by this dip on the pipe
   1205  *
   1206  * Arguments:
   1207  *	dip		- devinfo pointer
   1208  *	pipe_handle	- opaque pipe handle
   1209  *	timeout 	- timeout in seconds
   1210  *	flags		- USB_FLAGS_SLEEP:
   1211  *				wait for completion.
   1212  *	cb		- if USB_FLAGS_SLEEP has not been specified
   1213  *			  this callback function will be called on
   1214  *			  completion. This callback may be NULL
   1215  *			  and no notification of completion will then
   1216  *			  be provided.
   1217  *	cb_arg		- 2nd argument to callback function.
   1218  *
   1219  * callback and callback_arg should be NULL if USB_FLAGS_SLEEP has
   1220  * been specified
   1221  *
   1222  * Returns:
   1223  *	USB_SUCCESS	- pipe successfully reset or request queued
   1224  *	USB_FAILURE	- timeout
   1225  *	USB_INVALID_PIPE - pipe is invalid or already closed
   1226  *	USB_INVALID_CONTEXT - called from interrupt context
   1227  *	USB_INVALID_ARGS - invalid arguments
   1228  *	USB_*		- refer to return values defines in this file
   1229  */
   1230 int usb_pipe_drain_reqs(
   1231 	dev_info_t		*dip,
   1232 	usb_pipe_handle_t	pipe_handle,
   1233 	uint_t			time,
   1234 	usb_flags_t		flags,
   1235 	void			(*cb)(
   1236 				    usb_pipe_handle_t	ph,
   1237 				    usb_opaque_t	arg,	/* cb arg */
   1238 				    int			rval,
   1239 				    usb_cb_flags_t	flags),
   1240 	usb_opaque_t		cb_arg);
   1241 
   1242 
   1243 /*
   1244  * Resetting a pipe: Refer to USB 2.0/10.5.2.2
   1245  *	The pipe's requests are retired and the pipe is cleared.  The host state
   1246  *	is moved to active. If the reflected endpoint state needs to be changed,
   1247  *	that must be explicitly requested by the client driver.  The reset
   1248  *	completes after all request callbacks have been completed.
   1249  *
   1250  * Arguments:
   1251  *	dip		- devinfo pointer.
   1252  *	pipe_handle	- pipe handle.
   1253  *	flags		- USB_FLAGS_SLEEP:
   1254  *				wait for completion.
   1255  *	cb		- if USB_FLAGS_SLEEP has not been specified
   1256  *			  this callback function will be called on
   1257  *			  completion. This callback may be NULL
   1258  *			  and no notification of completion will then
   1259  *			  be provided.
   1260  *	cb_arg		- 2nd argument to callback function.
   1261  *
   1262  * callback and callback_arg should be NULL if USB_FLAGS_SLEEP has
   1263  * been specified
   1264  *
   1265  * Note: Completion notification may be *before* all async request threads
   1266  *	have completed but *after* all immediate callbacks have completed.
   1267  */
   1268 void usb_pipe_reset(
   1269 	dev_info_t		*dip,
   1270 	usb_pipe_handle_t	pipe_handle,
   1271 	usb_flags_t		usb_flags,
   1272 	void			(*cb)(
   1273 					usb_pipe_handle_t ph,
   1274 					usb_opaque_t	arg,
   1275 					int		rval,
   1276 					usb_cb_flags_t	flags),
   1277 	usb_opaque_t		cb_arg);
   1278 
   1279 
   1280 /*
   1281  * The client driver can store a private data pointer in the
   1282  * pipe_handle.
   1283  *
   1284  * return values:
   1285  *	USB_SUCCESS	 - success
   1286  *	USB_FAILURE	 - unspecified failure
   1287  */
   1288 int usb_pipe_set_private(
   1289 	usb_pipe_handle_t	pipe_handle,
   1290 	usb_opaque_t		data);
   1291 
   1292 
   1293 usb_opaque_t usb_pipe_get_private(
   1294 	usb_pipe_handle_t	pipe_handle);
   1295 
   1296 
   1297 /*
   1298  * ***************************************************************************
   1299  * Transfer request definitions and functions
   1300  * ***************************************************************************
   1301  */
   1302 
   1303 
   1304 /*
   1305  * USB xfer request attributes.
   1306  * Set by the client driver, more than one may be set
   1307  *
   1308  * SHORT_XFER_OK if less data is transferred than specified, no error is
   1309  *		returned.
   1310  * AUTOCLEARING	if there is an exception, the pipe will be reset first
   1311  *		and a functional stall cleared before a callback is done.
   1312  * PIPE_RESET	if there is an exception, the pipe will be reset only
   1313  * ONE_XFER	polling will automatically stop on the first callback.
   1314  * ISOC_START_FRAME use startframe specified.
   1315  * USB_ATTRS_ISOC_XFER_ASAP let the host controller decide on the first
   1316  *		available frame.
   1317  *
   1318  * USB_ATTRS_ISOC_START_FRAME and USB_ATTRS_ISOC_XFER_ASAP are mutually
   1319  * exclusive
   1320  *
   1321  * combinations of flag and attributes:
   1322  *
   1323  * usb_flags	usb_req_attrs			semantics
   1324  * ---------------------------------------------------------
   1325  * SLEEP	USB_ATTRS_SHORT_XFER_OK		legal for IN pipes
   1326  * SLEEP	USB_ATTRS_AUTOCLEARING		legal
   1327  * SLEEP	USB_ATTRS_PIPE_RESET		legal
   1328  * SLEEP	USB_ATTRS_ONE_XFER		legal for interrupt IN pipes
   1329  * SLEEP	USB_ATTRS_ISOC_START_FRAME	illegal
   1330  * SLEEP	USB_ATTRS_ISOC_XFER_ASAP	illegal
   1331  *
   1332  * noSLEEP	USB_ATTRS_SHORT_XFER_OK		legal for all IN pipes
   1333  * noSLEEP	USB_ATTRS_AUTOCLEARING		legal
   1334  * noSLEEP	USB_ATTRS_PIPE_RESET		legal
   1335  * noSLEEP	USB_ATTRS_ONE_XFER		legal
   1336  * noSLEEP	USB_ATTRS_ISOC_START_FRAME	legal
   1337  * noSLEEP	USB_ATTRS_ISOC_XFER_ASAP	legal
   1338  */
   1339 typedef enum {
   1340 	USB_ATTRS_NONE			= 0,
   1341 
   1342 	/* only ctrl/bulk/intr IN pipes */
   1343 	USB_ATTRS_SHORT_XFER_OK		= 0x01,	/* short data xfer is ok */
   1344 	USB_ATTRS_PIPE_RESET		= 0x02,	/* reset pipe only on exc */
   1345 	USB_ATTRS_AUTOCLEARING		= 0x12, /* autoclear STALLs */
   1346 
   1347 	/* intr pipes only: one poll with data */
   1348 	USB_ATTRS_ONE_XFER		= 0x100,
   1349 
   1350 	/* only for isoch pipe */
   1351 	USB_ATTRS_ISOC_START_FRAME	= 0x200, /* Starting frame# specified */
   1352 	USB_ATTRS_ISOC_XFER_ASAP	= 0x400	/* HCD decides START_FRAME#  */
   1353 } usb_req_attrs_t;
   1354 
   1355 
   1356 /*
   1357  * Note: client drivers are required to provide data buffers (mblks) for most
   1358  * requests
   1359  *			IN		OUT
   1360  * ctlr request		if wLength > 0	if wLength > 0
   1361  * bulk request		yes		yes
   1362  * intr request		no		yes
   1363  * isoc request		no		yes
   1364  */
   1365 
   1366 /*
   1367  * ===========================================================================
   1368  * USB control request management
   1369  * ===========================================================================
   1370  */
   1371 
   1372 /*
   1373  * A client driver allocates and uses the usb_ctrl_req_t for all control
   1374  * pipe requests.
   1375  *
   1376  * Direction of the xfer will be determined based on the bmRequestType.
   1377  *
   1378  * NULL callbacks are permitted, timeout = 0 indicates infinite timeout.
   1379  * All timeouts are in seconds.
   1380  *
   1381  * All fields are initialized by client except for data on IN request
   1382  * in which case the client is responsible for deallocating.
   1383  *
   1384  * Control requests may be reused.  The client driver is responsible
   1385  * for reinitializing some fields, eg data read/write pointers.
   1386  *
   1387  * Control requests can be queued.
   1388  */
   1389 typedef struct usb_ctrl_req {
   1390 	uint8_t		ctrl_bmRequestType; /* characteristics of request */
   1391 	uint8_t		ctrl_bRequest;	/* specific request		*/
   1392 	uint16_t	ctrl_wValue;	/* varies according to request	*/
   1393 	uint16_t	ctrl_wIndex;	/* index or offset		*/
   1394 	uint16_t	ctrl_wLength;	/* number of bytes to xfer	*/
   1395 
   1396 	mblk_t		*ctrl_data;	/* the data for the data phase	*/
   1397 					/* IN: allocated by HCD		*/
   1398 					/* OUT: allocated by client	*/
   1399 	uint_t		ctrl_timeout;	/* how long before HCD retires req */
   1400 	usb_opaque_t	ctrl_client_private; /* for client private info	*/
   1401 	usb_req_attrs_t ctrl_attributes; /* attributes for this req */
   1402 
   1403 	/*
   1404 	 * callback function for control pipe requests
   1405 	 *
   1406 	 * a normal callback will be done upon:
   1407 	 *	- successful completion of a control pipe request
   1408 	 *
   1409 	 * callback arguments are:
   1410 	 *	- the pipe_handle
   1411 	 *	- usb_ctrl_req_t pointer
   1412 	 */
   1413 	void		(*ctrl_cb)(usb_pipe_handle_t ph,
   1414 				struct usb_ctrl_req *req);
   1415 
   1416 	/*
   1417 	 * exception callback function for control pipe
   1418 	 *
   1419 	 * a exception callback will be done upon:
   1420 	 *	- an exception/error (all types)
   1421 	 *	- partial xfer of data unless SHORT_XFER_OK has been set
   1422 	 *
   1423 	 * callback arguments are:
   1424 	 *	- the pipe_handle
   1425 	 *	- usb_ctrl_req_t pointer
   1426 	 *
   1427 	 * if USB_ATTRS_AUTOCLEARING was set, autoclearing will be attempted
   1428 	 * and usb_cb_flags_t in usb_ctrl_req may indicate what was done
   1429 	 */
   1430 	void		(*ctrl_exc_cb)(usb_pipe_handle_t ph,
   1431 				struct usb_ctrl_req *req);
   1432 
   1433 	/* set by USBA/HCD on completion */
   1434 	usb_cr_t	ctrl_completion_reason;	/* set by HCD */
   1435 	usb_cb_flags_t	ctrl_cb_flags;  /* Callback context / handling flgs */
   1436 } usb_ctrl_req_t;
   1437 
   1438 
   1439 /*
   1440  * In the setup packet, the descriptor type is passed in the high byte of the
   1441  * wValue field.
   1442  * descriptor types:
   1443  */
   1444 #define	USB_DESCR_TYPE_SETUP_DEV		0x0100
   1445 #define	USB_DESCR_TYPE_SETUP_CFG		0x0200
   1446 #define	USB_DESCR_TYPE_SETUP_STRING		0x0300
   1447 #define	USB_DESCR_TYPE_SETUP_IF			0x0400
   1448 #define	USB_DESCR_TYPE_SETUP_EP			0x0500
   1449 #define	USB_DESCR_TYPE_SETUP_DEV_QLF		0x0600
   1450 #define	USB_DESCR_TYPE_SETUP_OTHER_SPEED_CFG	0x0700
   1451 #define	USB_DESCR_TYPE_SETUP_IF_PWR		0x0800
   1452 
   1453 #define	USB_DESCR_TYPE_DEV			0x01
   1454 #define	USB_DESCR_TYPE_CFG			0x02
   1455 #define	USB_DESCR_TYPE_STRING			0x03
   1456 #define	USB_DESCR_TYPE_IF			0x04
   1457 #define	USB_DESCR_TYPE_EP			0x05
   1458 #define	USB_DESCR_TYPE_DEV_QLF			0x06
   1459 #define	USB_DESCR_TYPE_OTHER_SPEED_CFG		0x07
   1460 #define	USB_DESCR_TYPE_IF_PWR			0x08
   1461 #define	USB_DESCR_TYPE_IA			0x0B
   1462 
   1463 #define	USB_DESCR_TYPE_WA			0x21
   1464 #define	USB_DESCR_TYPE_RPIPE			0x22
   1465 
   1466 /* Wireless USB extension, refer to WUSB 1.0/7.4 */
   1467 #define	USB_DESCR_TYPE_SECURITY			0x0c
   1468 #define	USB_DESCR_TYPE_KEY			0x0d
   1469 #define	USB_DESCR_TYPE_ENCRYPTION		0x0e
   1470 #define	USB_DESCR_TYPE_BOS			0x0f
   1471 #define	USB_DESCR_TYPE_DEV_CAPABILITY		0x10
   1472 #define	USB_DESCR_TYPE_WIRELESS_EP_COMP		0x11
   1473 
   1474 #define	USB_WA_DESCR_SIZE			14
   1475 #define	USB_RPIPE_DESCR_SIZE			28
   1476 
   1477 /*
   1478  * device request type
   1479  */
   1480 #define	USB_DEV_REQ_HOST_TO_DEV		0x00
   1481 #define	USB_DEV_REQ_DEV_TO_HOST		0x80
   1482 #define	USB_DEV_REQ_DIR_MASK		0x80
   1483 
   1484 #define	USB_DEV_REQ_TYPE_STANDARD	0x00
   1485 #define	USB_DEV_REQ_TYPE_CLASS		0x20
   1486 #define	USB_DEV_REQ_TYPE_VENDOR		0x40
   1487 #define	USB_DEV_REQ_TYPE_MASK		0x60
   1488 
   1489 #define	USB_DEV_REQ_RCPT_DEV		0x00
   1490 #define	USB_DEV_REQ_RCPT_IF		0x01
   1491 #define	USB_DEV_REQ_RCPT_EP		0x02
   1492 #define	USB_DEV_REQ_RCPT_OTHER		0x03
   1493 #define	USB_DEV_REQ_RCPT_MASK		0x03
   1494 
   1495 /* Wire adapter class extension for request recipient */
   1496 #define	USB_DEV_REQ_RCPT_PORT		0x04
   1497 #define	USB_DEV_REQ_RCPT_RPIPE		0x05
   1498 
   1499 /*
   1500  * device request
   1501  */
   1502 #define	USB_REQ_GET_STATUS		0x00
   1503 #define	USB_REQ_CLEAR_FEATURE		0x01
   1504 #define	USB_REQ_SET_FEATURE		0x03
   1505 #define	USB_REQ_SET_ADDRESS		0x05
   1506 #define	USB_REQ_GET_DESCR		0x06
   1507 #define	USB_REQ_SET_DESCR		0x07
   1508 #define	USB_REQ_GET_CFG			0x08
   1509 #define	USB_REQ_SET_CFG			0x09
   1510 #define	USB_REQ_GET_IF			0x0a
   1511 #define	USB_REQ_SET_IF			0x0b
   1512 #define	USB_REQ_SYNC_FRAME		0x0c
   1513 /* Wireless USB extension, refer to WUSB 1.0/7.3.1 */
   1514 #define	USB_REQ_SET_ENCRYPTION		0x0d
   1515 #define	USB_REQ_GET_ENCRYPTION		0x0e
   1516 #define	USB_REQ_RPIPE_ABORT		0x0e
   1517 #define	USB_REQ_SET_HANDSHAKE		0x0f
   1518 #define	USB_REQ_RPIPE_RESET		0x0f
   1519 #define	USB_REQ_GET_HANDSHAKE		0x10
   1520 #define	USB_REQ_SET_CONNECTION		0x11
   1521 #define	USB_REQ_SET_SECURITY_DATA	0x12
   1522 #define	USB_REQ_GET_SECURITY_DATA	0x13
   1523 #define	USB_REQ_SET_WUSB_DATA		0x14
   1524 #define	USB_REQ_LOOPBACK_DATA_WRITE	0x15
   1525 #define	USB_REQ_LOOPBACK_DATA_READ	0x16
   1526 #define	USB_REQ_SET_INTERFACE_DS	0x17
   1527 
   1528 /* language ID for string descriptors */
   1529 #define	USB_LANG_ID			0x0409
   1530 
   1531 /*
   1532  * Standard Feature Selectors
   1533  */
   1534 #define	USB_EP_HALT			0x0000
   1535 #define	USB_DEV_REMOTE_WAKEUP		0x0001
   1536 #define	USB_DEV_TEST_MODE		0x0002
   1537 /* Wireless USB extension, refer to WUSB 1.0/7.3.1 */
   1538 #define	USB_DEV_WUSB			0x0003
   1539 
   1540 
   1541 /*
   1542  * Allocate usb control request
   1543  *
   1544  * Arguments:
   1545  *	dip	- dev_info pointer of the client driver
   1546  *	len	- length of "data" for this control request.
   1547  *		  if 0, no mblk is alloc'ed
   1548  *	flags	- USB_FLAGS_SLEEP: Sleep if resources are not available
   1549  *
   1550  * Return Values:
   1551  *	usb_ctrl_req_t pointer on success, NULL on failure
   1552  *
   1553  * Implementation NOTE: the dip allows checking on detach for memory leaks
   1554  */
   1555 usb_ctrl_req_t *usb_alloc_ctrl_req(
   1556 	dev_info_t		*dip,
   1557 	size_t			len,
   1558 	usb_flags_t		flags);
   1559 
   1560 
   1561 /*
   1562  * free USB control request
   1563  */
   1564 void usb_free_ctrl_req(
   1565 	usb_ctrl_req_t	*reqp);
   1566 
   1567 
   1568 /*
   1569  * usb_pipe_ctrl_xfer();
   1570  *	Client driver calls this function to issue the control
   1571  *	request to the USBA which will queue or transport it to the device
   1572  *
   1573  * Arguments:
   1574  *	pipe_handle	- control pipe pipehandle (obtained via usb_pipe_open()
   1575  *	reqp		- pointer to control request
   1576  *	flags		- USB_FLAGS_SLEEP:
   1577  *				wait for the request to complete
   1578  *
   1579  * Return values:
   1580  *	USB_SUCCESS	- successfully queued (no sleep) or successfully
   1581  *			  completed (with sleep specified)
   1582  *	USB_FAILURE	- failure
   1583  *	USB_NO_RESOURCES - no resources
   1584  */
   1585 int usb_pipe_ctrl_xfer(usb_pipe_handle_t pipe_handle,
   1586 	usb_ctrl_req_t	*reqp,
   1587 	usb_flags_t		flags);
   1588 
   1589 
   1590 /*
   1591  * ---------------------------------------------------------------------------
   1592  * Wrapper function which allocates and deallocates a request structure, and
   1593  * performs a control transfer.
   1594  * ---------------------------------------------------------------------------
   1595  */
   1596 
   1597 /*
   1598  * Setup arguments for usb_pipe_ctrl_xfer_wait:
   1599  *
   1600  *	bmRequestType	- characteristics of request
   1601  *	bRequest	- specific request
   1602  *	wValue		- varies according to request
   1603  *	wIndex		- index or offset
   1604  *	wLength		- number of bytes to xfer
   1605  *	attrs		- required request attributes
   1606  *	data		- pointer to pointer to data
   1607  *				IN: HCD will allocate data
   1608  *				OUT: clients driver allocates data
   1609  */
   1610 typedef struct usb_ctrl_setup {
   1611 	uchar_t		bmRequestType;
   1612 	uchar_t		bRequest;
   1613 	uint16_t	wValue;
   1614 	uint16_t	wIndex;
   1615 	uint16_t	wLength;
   1616 	usb_req_attrs_t	attrs;
   1617 } usb_ctrl_setup_t;
   1618 
   1619 
   1620 /*
   1621  * usb_pipe_ctrl_xfer_wait():
   1622  *	for simple synchronous control transactions this wrapper function
   1623  *	will perform the allocation, xfer, and deallocation.
   1624  *	USB_ATTRS_AUTOCLEARING will be enabled
   1625  *
   1626  * Arguments:
   1627  *	pipe_handle	- control pipe pipehandle (obtained via usb_pipe_open())
   1628  *	setup		- contains pointer to client's devinfo,
   1629  *			  setup descriptor params, attributes and data
   1630  *	completion_reason - completion status.
   1631  *	cb_flags	- request completions flags.
   1632  *	flags		- none.
   1633  *
   1634  * Return Values:
   1635  *	USB_SUCCESS	- request successfully executed.
   1636  *	USB_FAILURE	- request failed.
   1637  *	USB_*		- refer to list of all possible return values in
   1638  *			  this file
   1639  *
   1640  * NOTES:
   1641  * - in the case of failure, the client should check completion_reason and
   1642  *   and cb_flags and determine further recovery action
   1643  * - the client should check data and if non-zero, free the data on
   1644  *   completion
   1645  */
   1646 int usb_pipe_ctrl_xfer_wait(
   1647 	usb_pipe_handle_t	pipe_handle,
   1648 	usb_ctrl_setup_t	*setup,
   1649 	mblk_t			**data,
   1650 	usb_cr_t		*completion_reason,
   1651 	usb_cb_flags_t		*cb_flags,
   1652 	usb_flags_t		flags);
   1653 
   1654 
   1655 /*
   1656  * ---------------------------------------------------------------------------
   1657  * Some utility defines and wrapper functions for standard control requests.
   1658  * ---------------------------------------------------------------------------
   1659  */
   1660 
   1661 /*
   1662  *
   1663  * Status bits returned by a usb_get_status().
   1664  */
   1665 #define	USB_DEV_SLF_PWRD_STATUS	1	/* Supports Self Power	 */
   1666 #define	USB_DEV_RWAKEUP_STATUS	2	/* Remote Wakeup Enabled */
   1667 #define	USB_DEV_BAT_PWRD_STATUS	4	/* Battery Powered */
   1668 #define	USB_EP_HALT_STATUS	1	/* Endpoint is Halted	 */
   1669 #define	USB_IF_STATUS		0	/* Interface Status is 0 */
   1670 
   1671 /* length of data returned by USB_REQ_GET_STATUS */
   1672 #define	USB_GET_STATUS_LEN		2
   1673 
   1674 /*
   1675  * wrapper function returning status of device, interface, or endpoint
   1676  *
   1677  * Arguments:
   1678  *	dip		- devinfo pointer.
   1679  *	ph		- pipe handle
   1680  *	type		- bmRequestType to be used
   1681  *	what		- 0 for device, otherwise interface or ep number
   1682  *	status		- pointer to returned status.
   1683  *	flags		- USB_FLAGS_SLEEP (mandatory)
   1684  *
   1685  * Return Values:
   1686  *	valid usb_status_t	or USB_FAILURE
   1687  *
   1688  */
   1689 int usb_get_status(
   1690 	dev_info_t		*dip,
   1691 	usb_pipe_handle_t	ph,
   1692 	uint_t			type,	/* bmRequestType */
   1693 	uint_t			what,	/* 0, interface, endpoint number */
   1694 	uint16_t		*status,
   1695 	usb_flags_t		flags);
   1696 
   1697 
   1698 /*
   1699  * function for clearing feature of device, interface, or endpoint
   1700  *
   1701  * Arguments:
   1702  *	dip		- devinfo pointer.
   1703  *	type		- bmRequestType to be used
   1704  *	feature		- feature to be cleared
   1705  *	what		- 0 for device, otherwise interface or ep number
   1706  *	flags		- USB_FLAGS_SLEEP (mandatory)
   1707  *	cb		- if USB_FLAGS_SLEEP has not been specified
   1708  *			  this callback function will be called on
   1709  *			  completion. This callback may be NULL
   1710  *			  and no notification of completion will then
   1711  *			  be provided.
   1712  *	cb_arg		- 2nd argument to callback function.
   1713  *
   1714  * Return Values:
   1715  *	USB_SUCCESS	clearing feature succeeded
   1716  *	USB_FAILURE	clearing feature failed
   1717  *	USB_*		refer to list of all possible return values in
   1718  *			this file
   1719  */
   1720 int usb_clr_feature(
   1721 	dev_info_t		*dip,
   1722 	uint_t			type,	/* bmRequestType */
   1723 	uint_t			feature,
   1724 	uint_t			what,	/* 0, interface, endpoint number */
   1725 	usb_flags_t		flags,
   1726 	void			(*cb)(
   1727 					usb_pipe_handle_t ph,
   1728 					usb_opaque_t	arg,
   1729 					int		rval,
   1730 					usb_cb_flags_t	flags),
   1731 	usb_opaque_t		cb_arg);
   1732 
   1733 
   1734 /*
   1735  * usb_set_cfg():
   1736  *	Sets the configuration.  Use this function with caution as
   1737  *	the framework is normally responsible for configuration changes.
   1738  *	Changing configuration will fail if pipes are still open or
   1739  *	when invoked from a driver bound to an interface on a composite
   1740  *	device. This function access the device and blocks.
   1741  *
   1742  * Arguments:
   1743  *	dip		- devinfo pointer.
   1744  *	cfg_index	- Index of configuration to set.  Corresponds to
   1745  *			  index in the usb_client_dev_data_t tree of
   1746  *			  configurations.  See usb_client_dev_data_t(9F).
   1747  *	usb_flags	- USB_FLAGS_SLEEP:
   1748  *				wait for completion.
   1749  *	cb		- if USB_FLAGS_SLEEP has not been specified
   1750  *			  this callback function will be called on
   1751  *			  completion. This callback may be NULL
   1752  *			  and no notification of completion will then
   1753  *			  be provided.
   1754  *	cb_arg		- 2nd argument to callback function.
   1755  *
   1756  * callback and callback_arg should be NULL if USB_FLAGS_SLEEP has
   1757  * been specified
   1758  *
   1759  * Return Values:
   1760  *	USB_SUCCESS:	new configuration was set or async request
   1761  *			submitted successfully.
   1762  *	USB_FAILURE:	new configuration could not be set because
   1763  *			it may been illegal configuration or this
   1764  *			caller was not allowed to change configs or
   1765  *			pipes were still open or async request
   1766  *			could not be submitted.
   1767  *	USB_*		refer to list of all possible return values in
   1768  *			this file
   1769  *
   1770  * the pipe handle argument in the callback will be the default pipe handle
   1771  */
   1772 int usb_set_cfg(
   1773 	dev_info_t		*dip,
   1774 	uint_t			cfg_index,
   1775 	usb_flags_t		usb_flags,
   1776 	void			(*cb)(
   1777 					usb_pipe_handle_t ph,
   1778 					usb_opaque_t	arg,
   1779 					int		rval,
   1780 					usb_cb_flags_t	flags),
   1781 	usb_opaque_t		cb_arg);
   1782 
   1783 
   1784 /*
   1785  * usb_get_cfg:
   1786  *	dip		- pointer to devinfo node
   1787  *	cfgval		- pointer to cfgval
   1788  *	usb_flags	- none, will always block
   1789  *
   1790  * return values:
   1791  *	USB_SUCCESS	- current cfg value is returned to cfgval
   1792  *	USB_*		- refer to list of all possible return values in
   1793  *			  this file
   1794  */
   1795 int usb_get_cfg(
   1796 	dev_info_t		*dip,
   1797 	uint_t			*cfgval,
   1798 	usb_flags_t		usb_flags);
   1799 
   1800 
   1801 /*
   1802  * The following functions set or get the alternate interface
   1803  * setting.
   1804  *
   1805  * usb_set_alt_if:
   1806  *	dip		- pointer to devinfo node
   1807  *	interface	- interface
   1808  *	alt_number	- alternate to set to
   1809  *	usb_flags	- USB_FLAGS_SLEEP:
   1810  *				wait for completion.
   1811  *	cb		- if USB_FLAGS_SLEEP has not been specified
   1812  *			  this callback function will be called on
   1813  *			  completion. This callback may be NULL
   1814  *			  and no notification of completion will then
   1815  *			  be provided.
   1816  *	cb_arg		- 2nd argument to callback function.
   1817  *
   1818  * callback and callback_arg should be NULL if USB_FLAGS_SLEEP has
   1819  * been specified
   1820  *
   1821  * the pipe handle argument in the callback will be the default pipe handle
   1822  *
   1823  * return values:
   1824  *	USB_SUCCESS:	alternate was set or async request was
   1825  *			submitted.
   1826  *	USB_FAILURE:	alternate could not be set because pipes
   1827  *			were still open or some access error occurred
   1828  *			or an invalid alt if value was passed or
   1829  *			async request could not be submitted
   1830  *	USB_INVALID_PERM the driver does not own the device or the interface
   1831  *	USB_*		refer to list of all possible return values in
   1832  *			this file
   1833  */
   1834 int usb_set_alt_if(
   1835 	dev_info_t		*dip,
   1836 	uint_t			interface,
   1837 	uint_t			alt_number,
   1838 	usb_flags_t		usb_flags,
   1839 	void			(*cb)(
   1840 					usb_pipe_handle_t ph,
   1841 					usb_opaque_t	arg,
   1842 					int		rval,
   1843 					usb_cb_flags_t	flags),
   1844 	usb_opaque_t		cb_arg);
   1845 
   1846 
   1847 
   1848 /* flags must be USB_FLAGS_SLEEP, and this function will block */
   1849 int usb_get_alt_if(
   1850 	dev_info_t		*dip,
   1851 	uint_t			if_number,
   1852 	uint_t			*alt_number,
   1853 	usb_flags_t		flags);
   1854 
   1855 
   1856 /*
   1857  * ===========================================================================
   1858  * USB bulk request management
   1859  * ===========================================================================
   1860  */
   1861 
   1862 /*
   1863  * A client driver allocates/uses the usb_bulk_req_t for bulk pipe xfers.
   1864  *
   1865  * NOTES:
   1866  * - bulk pipe sharing is not supported
   1867  * - semantics of combinations of flag and attributes:
   1868  *
   1869  * flags     Type  attributes	data	timeout semantics
   1870  * ----------------------------------------------------------------
   1871  *  x	      x    x		== NULL    x	   illegal
   1872  *
   1873  * no sleep  IN    x		!= NULL    0	   fill buffer, no timeout
   1874  *						   callback when xfer-len has
   1875  *						   been xferred
   1876  * no sleep  IN    x		!= NULL    > 0	   fill buffer, with timeout
   1877  *						   callback when xfer-len has
   1878  *						   been xferred
   1879  *
   1880  * sleep     IN    x		!= NULL    0	   fill buffer, no timeout
   1881  *						   unblock when xfer-len has
   1882  *						   been xferred
   1883  *						   no callback
   1884  * sleep     IN    x		!= NULL    > 0	   fill buffer, with timeout
   1885  *						   unblock when xfer-len has
   1886  *						   been xferred or timeout
   1887  *						   no callback
   1888  *
   1889  *  X	     OUT SHORT_XFER_OK	  x	   x	   illegal
   1890  *
   1891  * no sleep  OUT   x		!= NULL    0	   empty buffer, no timeout
   1892  *						   callback when xfer-len has
   1893  *						   been xferred
   1894  * no sleep  OUT   x		!= NULL    > 0	   empty buffer, with timeout
   1895  *						   callback when xfer-len has
   1896  *						   been xferred or timeout
   1897  *
   1898  * sleep     OUT   x		!= NULL    0	   empty buffer, no timeout
   1899  *						   unblock when xfer-len has
   1900  *						   been xferred
   1901  *						   no callback
   1902  * sleep     OUT   x		!= NULL    > 0	   empty buffer, with timeout
   1903  *						   unblock when xfer-len has
   1904  *						   been xferred or timeout
   1905  *						   no callback
   1906  *
   1907  * - bulk_len and bulk_data must be > 0.  SHORT_XFER_OK is not applicable.
   1908  *
   1909  * - multiple bulk requests can be queued
   1910  *
   1911  * - Splitting large Bulk xfer:
   1912  * The HCD driver, due to internal constraints, can only do a limited size bulk
   1913  * data xfer per request.  The current limitations are 32K for UHCI and 128K
   1914  * for OHCI.  So, a client driver may first determine this limitation (by
   1915  * calling the USBA interface usb_pipe_bulk_transfer_size()); and restrict
   1916  * itself to doing xfers in multiples of this fixed size.  This forces a client
   1917  * driver to do data xfers in a loop for a large request, splitting it into
   1918  * multiple chunks of fixed size.
   1919  */
   1920 typedef struct usb_bulk_req {
   1921 	uint_t		bulk_len;	/* number of bytes to xfer	*/
   1922 	mblk_t		*bulk_data;	/* the data for the data phase	*/
   1923 					/* IN: allocated by HCD		*/
   1924 					/* OUT: allocated by client	*/
   1925 	uint_t		bulk_timeout;	/* xfer timeout value in secs	*/
   1926 	usb_opaque_t	bulk_client_private; /* Client specific information */
   1927 	usb_req_attrs_t bulk_attributes; /* xfer-attributes	*/
   1928 
   1929 	/* Normal Callback function (For synch xfers) */
   1930 	void		(*bulk_cb)(usb_pipe_handle_t ph,
   1931 				struct usb_bulk_req *req);
   1932 
   1933 	/* Exception Callback function (For asynch xfers) */
   1934 	void		(*bulk_exc_cb)(usb_pipe_handle_t ph,
   1935 				struct usb_bulk_req *req);
   1936 
   1937 	/* set by USBA/HCD on completion */
   1938 	usb_cr_t	bulk_completion_reason;	/* set by HCD		*/
   1939 	usb_cb_flags_t	bulk_cb_flags;  /* Callback context / handling flgs */
   1940 } usb_bulk_req_t;
   1941 
   1942 
   1943 /*
   1944  * Allocate/free usb bulk request
   1945  *
   1946  * Arguments:
   1947  *	dip		- pointer to dev_info_t of the client driver
   1948  *	len		- 0 or length of mblk to be allocated
   1949  *	flags		- USB_FLAGS_SLEEP:
   1950  *				wait for resources
   1951  *
   1952  * Return Values:
   1953  *	usb_bulk_req_t on success, NULL on failure
   1954  */
   1955 usb_bulk_req_t *usb_alloc_bulk_req(
   1956 	dev_info_t		*dip,
   1957 	size_t			len,
   1958 	usb_flags_t		flags);
   1959 
   1960 
   1961 void usb_free_bulk_req(
   1962 	usb_bulk_req_t	*reqp);
   1963 
   1964 
   1965 /*
   1966  * usb_pipe_bulk_xfer():
   1967  *
   1968  * Client drivers call this function to issue the bulk xfer to the USBA
   1969  * which will queue or transfer it to the device
   1970  *
   1971  * Arguments:
   1972  *	pipe_handle	- bulk pipe handle (obtained via usb_pipe_open()
   1973  *	reqp		- pointer to bulk data xfer request (IN or OUT)
   1974  *	flags		- USB_FLAGS_SLEEP:
   1975  *				wait for the request to complete
   1976  *
   1977  * Return Values:
   1978  *	USB_SUCCESS	- success
   1979  *	USB_FAILURE	- unspecified failure
   1980  *	USB_NO_RESOURCES - no resources
   1981  *
   1982  */
   1983 int usb_pipe_bulk_xfer(
   1984 	usb_pipe_handle_t	pipe_handle,
   1985 	usb_bulk_req_t		*reqp,
   1986 	usb_flags_t		flags);
   1987 
   1988 /* Get maximum bulk transfer size */
   1989 int usb_pipe_get_max_bulk_transfer_size(
   1990 	dev_info_t		*dip,
   1991 	size_t			*size);
   1992 
   1993 
   1994 /*
   1995  * ===========================================================================
   1996  * USB interrupt pipe request management
   1997  * ===========================================================================
   1998  */
   1999 
   2000 /*
   2001  * A client driver allocates and uses the usb_intr_req_t for
   2002  * all interrupt pipe transfers.
   2003  *
   2004  * USB_FLAGS_SLEEP indicates here just to wait for resources except
   2005  * for ONE_XFER where we also wait for completion
   2006  *
   2007  * semantics flags and attribute combinations:
   2008  *
   2009  * Notes:
   2010  * none attributes indicates neither ONE_XFER nor SHORT_XFER_OK
   2011  *
   2012  * flags     Type  attributes	   data    timeout semantics
   2013  * ----------------------------------------------------------------
   2014  *  x	     IN      x		   != NULL  x	    illegal
   2015  *  x	     IN   ONE_XFER=0	   x	   !=0	    illegal
   2016  *
   2017  *  x	     IN   ONE_XFER=0	   NULL     0	   continuous polling,
   2018  *						   many callbacks
   2019  *						   request is returned on
   2020  *						   stop polling
   2021  *
   2022  * no sleep  IN   ONE_XFER	   NULL     0	   one time poll, no timeout,
   2023  *						   one callback
   2024  * no sleep  IN   ONE_XFER	   NULL    !=0	   one time poll, with
   2025  *						   timeout, one callback
   2026  *
   2027  * sleep     IN   ONE_XFER	   NULL     0	   one time poll, no timeout,
   2028  *						   no callback,
   2029  *						   block for completion
   2030  * sleep     IN   ONE_XFER	   NULL    !=0	   one time poll, with timeout,
   2031  *						   no callback
   2032  *						   block for completion
   2033  *
   2034  *  x	     OUT     x		   NULL    x	   illegal
   2035  *  x	     OUT  ONE_XFER	   x	   x	   illegal
   2036  *  x	     OUT  SHORT_XFER_OK    x	   x	   illegal
   2037  *
   2038  *  x	     OUT   none		   != NULL 0	   xfer until data exhausted,
   2039  *						   no timeout,	one callback
   2040  *  x	     OUT   none		   != NULL !=0	   xfer until data exhausted,
   2041  *						   with timeout, one callback
   2042  *
   2043  * - Reads (IN):
   2044  *
   2045  * The client driver does *not* provide a data buffer.
   2046  * By default, a READ request would mean continuous polling for data IN. The
   2047  * HCD typically reads "wMaxPacketSize" amount of 'periodic data'. A client
   2048  * driver may force the HCD to read instead intr_len
   2049  * amount of 'periodic data' (See section 1).
   2050  *
   2051  * The HCD issues a callback to the client after each polling interval if
   2052  * it has read in some data. Note that the amount of data read IN is either
   2053  * intr_len or 'wMaxPacketSize' in length.
   2054  *
   2055  * Normally, the HCD keeps polling interrupt pipe forever even if there is
   2056  * no data to be read IN.  A client driver may stop this polling by
   2057  * calling usb_pipe_stop_intr_polling().
   2058  *
   2059  * If a client driver chooses to pass USB_ATTRS_ONE_XFER as
   2060  * 'xfer_attributes' the HCD will poll for data until some data is received.
   2061  * HCD reads in the data and does a callback and stops polling for any more
   2062  * data.  In this case, the client driver need not explicitly call
   2063  * usb_pipe_stop_intr_polling().
   2064  *
   2065  * When continuous polling is stopped, the original request is returned with
   2066  * USB_CR_STOPPED_POLLING.
   2067  *
   2068  * - Writes (OUT):
   2069  *
   2070  * A client driver provides the data buffer, and data, needed for intr write.
   2071  * There is no continuous write mode, a la  read (See previous section).
   2072  * The USB_ATTRS_ONE_XFER attribute is illegal.
   2073  * By default USBA keeps writing intr data until the provided data buffer
   2074  * has been written out. The HCD does ONE callback to the client driver.
   2075  * Queueing is supported.
   2076  * Max size is 8k
   2077  */
   2078 typedef struct usb_intr_req {
   2079 	uint_t		intr_len;	/* OUT: size of total xfer */
   2080 					/* IN : packet size */
   2081 	mblk_t		*intr_data;	/* the data for the data phase	*/
   2082 					/* IN: allocated by HCD		*/
   2083 					/* OUT: allocated by client	*/
   2084 	usb_opaque_t	intr_client_private; /* Client specific information  */
   2085 	uint_t		intr_timeout;	/* only with ONE TIME POLL, in secs */
   2086 	usb_req_attrs_t	intr_attributes;
   2087 
   2088 	/* Normal callback function (For synch transfers) */
   2089 	void		(*intr_cb)(usb_pipe_handle_t ph,
   2090 				struct usb_intr_req *req);
   2091 
   2092 	/* Exception callback function (For asynch transfers) */
   2093 	void		(*intr_exc_cb)(usb_pipe_handle_t ph,
   2094 				struct usb_intr_req *req);
   2095 
   2096 	/* set by USBA/HCD on completion */
   2097 	usb_cr_t	intr_completion_reason;	/* set by HCD */
   2098 	usb_cb_flags_t	intr_cb_flags;  /* Callback context / handling flgs */
   2099 } usb_intr_req_t;
   2100 
   2101 
   2102 /*
   2103  * Allocate/free usb interrupt pipe request
   2104  *
   2105  * Arguments:
   2106  *	dip		- pointer to dev_info_t of the client driver
   2107  *	reqp		- pointer to request structure
   2108  *	len		- 0 or length of mblk for this interrupt request
   2109  *	flags		- USB_FLAGS_SLEEP:
   2110  *				Sleep if resources are not available
   2111  *
   2112  * Return Values:
   2113  *	usb_intr_req_t on success, NULL on failure
   2114  */
   2115 usb_intr_req_t *usb_alloc_intr_req(
   2116 	dev_info_t		*dip,
   2117 	size_t			len,
   2118 	usb_flags_t		flags);
   2119 
   2120 
   2121 void usb_free_intr_req(
   2122 	usb_intr_req_t	*reqp);
   2123 
   2124 
   2125 /*
   2126  * usb_pipe_intr_xfer():
   2127  *
   2128  * Client drivers call this function to issue the intr xfer to USBA/HCD
   2129  * which starts polling the device
   2130  *
   2131  * Arguments:
   2132  *	pipe_handle	- interrupt pipe handle (obtained via usb_pipe_open()
   2133  *	reqp		- pointer tothe interrupt pipe xfer request (IN or OUT)
   2134  *	flags		- USB_FLAGS_SLEEP:
   2135  *				wait for resources to be available
   2136  *
   2137  * return values:
   2138  *	USB_SUCCESS	- success
   2139  *	USB_FAILURE	- unspecified failure
   2140  *	USB_NO_RESOURCES  - no resources
   2141  *
   2142  * NOTE: start polling on an IN pipe that is already being polled is a NOP.
   2143  *	 We don't queue requests on OUT pipe
   2144  */
   2145 int usb_pipe_intr_xfer(
   2146 	usb_pipe_handle_t	pipe_handle,
   2147 	usb_intr_req_t		*req,
   2148 	usb_flags_t		flags);
   2149 
   2150 
   2151 /*
   2152  * usb_pipe_stop_intr_polling():
   2153  *
   2154  * Client drivers call this function to stop the automatic data-in/out transfers
   2155  * without closing the pipe.
   2156  *
   2157  * If USB_FLAGS_SLEEP  has been specified then this function will block until
   2158  * polling has been stopped and all callbacks completed. If USB_FLAGS_SLEEP
   2159  * has NOT been specified then polling is terminated when the original
   2160  * request that started the polling has been returned with
   2161  * USB_CR_STOPPED_POLLING
   2162  *
   2163  * Stop polling should never fail.
   2164  *
   2165  * Args:-
   2166  *	pipe_handle	- interrupt pipe handle (obtained via usb_pipe_open()).
   2167  *	flags		- USB_FLAGS_SLEEP:
   2168  *				wait for the resources to be available.
   2169  */
   2170 void usb_pipe_stop_intr_polling(
   2171 	usb_pipe_handle_t	pipe_handle,
   2172 	usb_flags_t		flags);
   2173 
   2174 
   2175 /*
   2176  * ===========================================================================
   2177  * USB isochronous xfer management
   2178  * ===========================================================================
   2179  */
   2180 
   2181 /*
   2182  * The usb frame number is an absolute number since boot and incremented
   2183  * every 1 ms.
   2184  */
   2185 typedef	uint64_t	usb_frame_number_t;
   2186 
   2187 /*
   2188  * USB ischronous packet descriptor
   2189  *
   2190  * An array of structures of type usb_isoc_pkt_descr_t must be allocated and
   2191  * initialized by the client driver using usb_alloc_isoc_req(). The client
   2192  * driver must set isoc_pkt_length in each packet descriptor before submitting
   2193  * the request.
   2194  */
   2195 typedef struct usb_isoc_pkt_descr {
   2196 	/*
   2197 	 * Set by the client driver, for all isochronous requests, to the
   2198 	 * number of bytes to transfer in a frame.
   2199 	 */
   2200 	ushort_t	isoc_pkt_length;
   2201 
   2202 	/*
   2203 	 * Set by HCD to actual number of bytes sent/received in frame.
   2204 	 */
   2205 	ushort_t	isoc_pkt_actual_length;
   2206 
   2207 	/*
   2208 	 * Per frame status set by HCD both for the isochronous IN and OUT
   2209 	 * requests.  If any status is non-zero then isoc_error_count in the
   2210 	 * isoc_req will be non-zero.
   2211 	 */
   2212 	usb_cr_t	isoc_pkt_status;
   2213 } usb_isoc_pkt_descr_t;
   2214 
   2215 
   2216 /*
   2217  * USB isochronous request
   2218  *
   2219  * The client driver allocates the usb_isoc_req_t before sending an
   2220  * isochronous requests.
   2221  *
   2222  * USB_FLAGS_SLEEP indicates here just to wait for resources but not
   2223  * to wait for completion
   2224  *
   2225  * Semantics of various combinations for data xfers:
   2226  *
   2227  * Note: attributes considered in this table are ONE_XFER, START_FRAME,
   2228  *	XFER_ASAP, SHORT_XFER
   2229  *
   2230  *
   2231  * flags     Type  attributes		   data    semantics
   2232  * ---------------------------------------------------------------------
   2233  * x	     x	   x			NULL	   illegal
   2234  *
   2235  * x	     x	   ONE_XFER		 x	   illegal
   2236  *
   2237  * x	     IN    x			!=NULL	   continuous polling,
   2238  *						   many callbacks
   2239  *
   2240  * x	     IN    ISOC_START_FRAME	!=NULL	   invalid if Current_frame# >
   2241  *						   "isoc_frame_no"
   2242  * x	     IN    ISOC_XFER_ASAP	!=NULL	   "isoc_frame_no" ignored.
   2243  *						   HCD determines when to
   2244  *						   insert xfer
   2245  *
   2246  * x	     OUT   ONE_XFER		x	   illegal
   2247  * x	     OUT   SHORT_XFER_OK	x	   illegal
   2248  *
   2249  * x	     OUT   ISOC_START_FRAME	!=NULL	   invalid if Current_frame# >
   2250  *						   "isoc_frame_no"
   2251  * x	     OUT   ISOC_XFER_ASAP	!=NULL	   "isoc_frame_no" ignored.
   2252  *						    HCD determines when to
   2253  *						   insert xfer
   2254  */
   2255 typedef struct usb_isoc_req {
   2256 	/*
   2257 	 * Starting frame number will be set by the client driver in which
   2258 	 * to begin this request. This frame number is used to synchronize
   2259 	 * requests queued to different isochronous pipes. The frame number
   2260 	 * is optional and client driver can skip starting frame number by
   2261 	 * setting USB_ISOC_ATTRS_ASAP. In this case, HCD will decide starting
   2262 	 * frame number for this isochronous request.  If this field is 0,
   2263 	 * then this indicates an invalid frame number.
   2264 	 */
   2265 	usb_frame_number_t	isoc_frame_no;
   2266 
   2267 	/*
   2268 	 * Number of isochronous data packets.
   2269 	 * The first field is set by client  driver and may not exceed
   2270 	 * the maximum number of entries in the usb isochronous packet
   2271 	 * descriptors.
   2272 	 */
   2273 	ushort_t		isoc_pkts_count;
   2274 
   2275 	/*
   2276 	 * The sum of all pkt lengths in the isoc request. Recommend to
   2277 	 * set it to zero, so the sum of isoc_pkt_length in the
   2278 	 * isoc_pkt_descr list will be used automatically and no check
   2279 	 * will be apply to this element.
   2280 	 */
   2281 	ushort_t		isoc_pkts_length;
   2282 
   2283 	/*
   2284 	 * This field will be set by HCD and this field indicates the number
   2285 	 * of packets that completed with errors.
   2286 	 */
   2287 	ushort_t		isoc_error_count;
   2288 
   2289 	/*
   2290 	 * Attributes specific to particular usb isochronous request.
   2291 	 * Supported values are: USB_ATTRS_ISOC_START_FRAME,
   2292 	 * USB_ATTRS_ISOC_XFER_ASAP.
   2293 	 */
   2294 	usb_req_attrs_t 	isoc_attributes;
   2295 
   2296 	/*
   2297 	 * Isochronous OUT:
   2298 	 *	allocated and set by client driver, freed and zeroed by HCD
   2299 	 *	on successful completion
   2300 	 * Isochronous IN:
   2301 	 *	allocated and set by HCD, freed by client driver
   2302 	 */
   2303 	mblk_t			*isoc_data;
   2304 
   2305 	/*
   2306 	 * The client driver specific private information.
   2307 	 */
   2308 	usb_opaque_t		isoc_client_private;
   2309 
   2310 	/*
   2311 	 * Isochronous OUT:
   2312 	 *	must be allocated & initialized by client driver
   2313 	 * Isochronous IN:
   2314 	 *	must be allocated by client driver
   2315 	 */
   2316 	struct usb_isoc_pkt_descr *isoc_pkt_descr;
   2317 
   2318 	/* Normal callback function (For synch transfers) */
   2319 	void			(*isoc_cb)(usb_pipe_handle_t ph,
   2320 					struct usb_isoc_req *req);
   2321 
   2322 	/* Exception callback function (For asynch transfers) */
   2323 	void			(*isoc_exc_cb)(usb_pipe_handle_t ph,
   2324 					struct usb_isoc_req *req);
   2325 
   2326 	/* set by USBA/HCD on completion */
   2327 	usb_cr_t		isoc_completion_reason;	/* set by HCD */
   2328 					/* Callback context / handling flgs */
   2329 	usb_cb_flags_t		isoc_cb_flags;
   2330 } usb_isoc_req_t;
   2331 
   2332 
   2333 /*
   2334  * Allocate/free usb isochronous resources
   2335  *
   2336  * isoc_pkts_count must be > 0
   2337  *
   2338  * Arguments:
   2339  *	dip		- client driver's devinfo pointer
   2340  *	isoc_pkts_count - number of pkts required
   2341  *	len		- 0 or size of mblk to allocate
   2342  *	flags		- USB_FLAGS_SLEEP:
   2343  *				wait for resources
   2344  *
   2345  * Return Values:
   2346  *	usb_isoc_req pointer or NULL
   2347  */
   2348 usb_isoc_req_t *usb_alloc_isoc_req(
   2349 	dev_info_t		*dip,
   2350 	uint_t			isoc_pkts_count,
   2351 	size_t			len,
   2352 	usb_flags_t		flags);
   2353 
   2354 void	usb_free_isoc_req(
   2355 	usb_isoc_req_t		*usb_isoc_req);
   2356 
   2357 /*
   2358  * Returns current usb frame number.
   2359  */
   2360 usb_frame_number_t usb_get_current_frame_number(
   2361 	dev_info_t		*dip);
   2362 
   2363 /*
   2364  * Get maximum isochronous packets per usb isochronous request
   2365  */
   2366 uint_t usb_get_max_pkts_per_isoc_request(
   2367 	dev_info_t		*dip);
   2368 
   2369 /*
   2370  * usb_pipe_isoc_xfer()
   2371  *
   2372  * Client drivers call this to issue the isoch xfer (IN and OUT) to the USBA
   2373  * which starts polling the device.
   2374  *
   2375  * Arguments:
   2376  *	pipe_handle	- isoc pipe handle (obtained via usb_pipe_open().
   2377  *	reqp		- pointer to the isochronous pipe IN xfer request
   2378  *			  allocated by the client driver.
   2379  *	flags		- USB_FLAGS_SLEEP:
   2380  *				wait for the resources to be available.
   2381  *
   2382  * return values:
   2383  *	USB_SUCCESS	- success.
   2384  *	USB_FAILURE	- unspecified failure.
   2385  *	USB_NO_RESOURCES  - no resources.
   2386  *	USB_NO_FRAME_NUMBER - START_FRAME, ASAP flags not specified.
   2387  *	USB_INVALID_START_FRAME	- Starting USB frame number invalid.
   2388  *
   2389  * Notes:
   2390  * - usb_pipe_isoc_xfer on an IN pipe that is already being polled is a NOP.
   2391  * - requests can be queued on an OUT pipe.
   2392  */
   2393 int usb_pipe_isoc_xfer(
   2394 	usb_pipe_handle_t	pipe_handle,
   2395 	usb_isoc_req_t		*reqp,
   2396 	usb_flags_t		flags);
   2397 
   2398 /*
   2399  * usb_pipe_stop_isoc_polling():
   2400  *
   2401  * Client drivers call this function to stop the automatic data-in/out
   2402  * transfers without closing the isoc pipe.
   2403  *
   2404  * If USB_FLAGS_SLEEP  has been specified then this function will block until
   2405  * polling has been stopped and all callbacks completed. If USB_FLAGS_SLEEP
   2406  * has NOT been specified then polling is terminated when the original
   2407  * request that started the polling has been returned with
   2408  * USB_CR_STOPPED_POLLING
   2409  *
   2410  * Stop polling should never fail.
   2411  *
   2412  * Arguments:
   2413  *	pipe_handle	- isoc pipe handle (obtained via usb_pipe_open().
   2414  *	flags		- USB_FLAGS_SLEEP:
   2415  *				wait for polling to be stopped and all
   2416  *				callbacks completed.
   2417  */
   2418 void usb_pipe_stop_isoc_polling(
   2419 	usb_pipe_handle_t	pipe_handle,
   2420 	usb_flags_t		flags);
   2421 
   2422 /*
   2423  * ***************************************************************************
   2424  * USB device power management:
   2425  * ***************************************************************************
   2426  */
   2427 
   2428 /*
   2429  *
   2430  * As any usb device will have a max of 4 possible power states
   2431  * the #define	for them are provided below with mapping to the
   2432  * corresponding OS power levels.
   2433  */
   2434 #define	USB_DEV_PWR_D0		USB_DEV_OS_FULL_PWR
   2435 #define	USB_DEV_PWR_D1		5
   2436 #define	USB_DEV_PWR_D2		6
   2437 #define	USB_DEV_PWR_D3		USB_DEV_OS_PWR_OFF
   2438 
   2439 #define	USB_DEV_OS_PWR_0	0
   2440 #define	USB_DEV_OS_PWR_1	1
   2441 #define	USB_DEV_OS_PWR_2	2
   2442 #define	USB_DEV_OS_PWR_3	3
   2443 #define	USB_DEV_OS_PWR_OFF	USB_DEV_OS_PWR_0
   2444 #define	USB_DEV_OS_FULL_PWR	USB_DEV_OS_PWR_3
   2445 
   2446 /* Bit Masks for Power States */
   2447 #define	USB_DEV_OS_PWRMASK_D0	1
   2448 #define	USB_DEV_OS_PWRMASK_D1	2
   2449 #define	USB_DEV_OS_PWRMASK_D2	4
   2450 #define	USB_DEV_OS_PWRMASK_D3	8
   2451 
   2452 /* conversion for OS to Dx levels */
   2453 #define	USB_DEV_OS_PWR2USB_PWR(l)	(USB_DEV_OS_FULL_PWR - (l))
   2454 
   2455 /* from OS level to Dx mask */
   2456 #define	USB_DEV_PWRMASK(l)	(1 << (USB_DEV_OS_FULL_PWR - (l)))
   2457 
   2458 /* Macro to check valid power level */
   2459 #define	USB_DEV_PWRSTATE_OK(state, level) \
   2460 		(((state) & USB_DEV_PWRMASK((level))) == 0)
   2461 
   2462 int usb_handle_remote_wakeup(
   2463 	dev_info_t	*dip,
   2464 	int		cmd);
   2465 
   2466 /* argument to usb_handle_remote wakeup function */
   2467 #define	USB_REMOTE_WAKEUP_ENABLE	1
   2468 #define	USB_REMOTE_WAKEUP_DISABLE	2
   2469 
   2470 int usb_create_pm_components(
   2471 	dev_info_t	*dip,
   2472 	uint_t		*pwrstates);
   2473 
   2474 /*
   2475  * ***************************************************************************
   2476  * System event registration
   2477  * ***************************************************************************
   2478  */
   2479 
   2480 /* Functions for registering hotplug callback functions. */
   2481 
   2482 int usb_register_hotplug_cbs(
   2483 	dev_info_t	*dip,
   2484 	int		(*disconnect_event_handler)(dev_info_t *dip),
   2485 	int		(*reconnect_event_handler)(dev_info_t *dip));
   2486 
   2487 void usb_unregister_hotplug_cbs(dev_info_t *dip);
   2488 
   2489 /*
   2490  *	Reset_level determines the extent to which the device is reset,
   2491  *	It has the following values:
   2492  *
   2493  *	USB_RESET_LVL_REATTACH	- The device is reset, the original driver is
   2494  *				  detached and a new driver attaching process
   2495  *				  is started according to the updated
   2496  *				  compatible name. This reset level applies to
   2497  *				  the firmware download with the descriptors
   2498  *				  changing, or other situations in which the
   2499  *				  device needs to be reenumerated.
   2500  *
   2501  *	USB_RESET_LVL_DEFAULT	- Default reset level. The device is reset, all
   2502  *				  error status is cleared, the device state
   2503  *				  machines and registers are also cleared and
   2504  *				  need to be reinitialized in the driver. The
   2505  *				  current driver remains attached. This reset
   2506  *				  level applies to hardware error recovery, or
   2507  *				  firmware download without descriptors
   2508  *				  changing.
   2509  */
   2510 typedef enum {
   2511 	USB_RESET_LVL_REATTACH		= 0,
   2512 	USB_RESET_LVL_DEFAULT		= 1
   2513 } usb_dev_reset_lvl_t;
   2514 
   2515 /*
   2516  * usb_reset_device:
   2517  *
   2518  * Client drivers call this function to request hardware reset for themselves,
   2519  * which may be required in some situations such as:
   2520  *
   2521  * 1) Some USB devices need the driver to upload firmware into devices' RAM
   2522  *    and initiate a hardware reset in order to activate the new firmware.
   2523  * 2) Hardware reset may help drivers to recover devices from an error state
   2524  *    caused by physical or firmware defects.
   2525  *
   2526  * Arguments:
   2527  *	dip		    - pointer to devinfo of the client
   2528  *	reset_level	    - see above
   2529  *
   2530  * Return values:
   2531  *	USB_SUCCESS	    - With USB_RESET_LVL_DEFAULT: the device was reset
   2532  *			      successfully.
   2533  *			    - With USB_RESET_LVL_REATTACH: reenumeration was
   2534  *			      started successfully or a previous reset is still
   2535  *			      in progress.
   2536  *	USB_FAILURE	    - The state of the device's parent hub is invalid
   2537  *			      (disconnected or suspended).
   2538  *			    - Called when the driver being detached.
   2539  *			    - The device failed to be reset with
   2540  *			      USB_RESET_LVL_DEFAULT specified.
   2541  *			    - Reenumeration failed to start up with
   2542  *			    - USB_RESET_LVL_REATTACH specified.
   2543  *	USB_INVALID_ARGS    - Invalid arguments.
   2544  *	USB_INVALID_PERM    - The driver of the dip doesn't own entire device.
   2545  *	USB_BUSY	    - One or more pipes other than the default control
   2546  *			      pipe are open on the device with
   2547  *			      USB_RESET_LVL_DEFAULT specified.
   2548  *	USB_INVALID_CONTEXT - Called from interrupt context with
   2549  *			      USB_RESET_LVL_DEFAULT specified.
   2550  */
   2551 
   2552 int usb_reset_device(
   2553 	dev_info_t 		*dip,
   2554 	usb_dev_reset_lvl_t	reset_level);
   2555 
   2556 
   2557 /*
   2558  * **************************************************************************
   2559  * USB device driver registration and callback functions remaining
   2560  * Contracted Project Private (for VirtualBox USB Device Capture)
   2561  * **************************************************************************
   2562  */
   2563 
   2564 /*
   2565  * getting the device strings of manufacturer, product and serial number
   2566  */
   2567 typedef struct usb_dev_str {
   2568 	char	*usb_mfg;	/* manufacturer string */
   2569 	char	*usb_product;	/* product string */
   2570 	char	*usb_serialno;	/* serial number string */
   2571 } usb_dev_str_t;
   2572 
   2573 /*
   2574  * It is the callback function type for capture driver.
   2575  * Arguments:
   2576  *	dev_descr	- pointer to device descriptor
   2577  *	dev_str		- pointer to device strings
   2578  *	path		- pointer to device physical path
   2579  *	bus		- USB bus address
   2580  *	port		- USB port number
   2581  *	drv		- capture driver name.
   2582  *			  It is returned by the callback func.
   2583  * Return Values:
   2584  *      USB_SUCCESS     - VirtualBox will capture the device
   2585  *      USB_FAILURE     - VirtualBox will not capture the device
   2586  */
   2587 typedef int (*usb_dev_driver_callback_t)(
   2588 	usb_dev_descr_t	*dev_descr,
   2589 	usb_dev_str_t	*dev_str,
   2590 	char		*path,
   2591 	int		bus,
   2592 	int		port,
   2593 	char		**drv,
   2594 	void		*reserved);
   2595 
   2596 /*
   2597  * Register the callback function in the usba.
   2598  * Argument:
   2599  *	dip		- client driver's devinfo pointer
   2600  *	cb		- callback function
   2601  *
   2602  * Return Values:
   2603  *	USB_SUCCESS	- the registeration was successful
   2604  *	USB_FAILURE	- the registeration failed
   2605  */
   2606 int usb_register_dev_driver(
   2607 	dev_info_t			*dip,
   2608 	usb_dev_driver_callback_t	cb);
   2609 
   2610 /*
   2611  * Unregister the callback function in the usba.
   2612  */
   2613 void usb_unregister_dev_driver(dev_info_t *dip);
   2614 
   2615 
   2616 /*
   2617  * ***************************************************************************
   2618  * USB Device and interface class, subclass and protocol codes
   2619  * ***************************************************************************
   2620  */
   2621 
   2622 /*
   2623  * Available device and interface class codes.
   2624  * Those which are device class codes are noted.
   2625  */
   2626 
   2627 #define	USB_CLASS_AUDIO		1
   2628 #define	USB_CLASS_COMM		2	/* Communication device class and */
   2629 #define	USB_CLASS_CDC_CTRL	2	/* CDC-control iface class, also 2 */
   2630 #define	USB_CLASS_HID		3
   2631 #define	USB_CLASS_PHYSICAL	5
   2632 #define	USB_CLASS_IMAGE		6
   2633 #define	USB_CLASS_PRINTER	7
   2634 #define	USB_CLASS_MASS_STORAGE	8
   2635 #define	USB_CLASS_HUB		9	/* Device class */
   2636 #define	USB_CLASS_CDC_DATA	10
   2637 #define	USB_CLASS_CCID		11
   2638 #define	USB_CLASS_SECURITY	13
   2639 #define	USB_CLASS_VIDEO		14
   2640 #define	USB_CLASS_DIAG		220	/* Device class */
   2641 #define	USB_CLASS_WIRELESS	224
   2642 #define	USB_CLASS_MISC		239	/* Device class */
   2643 #define	USB_CLASS_APP		254
   2644 #define	USB_CLASS_VENDOR_SPEC	255	/* Device class */
   2645 
   2646 #define	USB_CLASS_PER_INTERFACE	0	/* Class info is at interface level */
   2647 
   2648 /* Audio subclass. */
   2649 #define	USB_SUBCLS_AUD_CONTROL		0x01
   2650 #define	USB_SUBCLS_AUD_STREAMING	0x02
   2651 #define	USB_SUBCLS_AUD_MIDI_STREAMING	0x03
   2652 
   2653 /* Comms  subclass. */
   2654 #define	USB_SUBCLS_CDCC_DIRECT_LINE	0x01
   2655 #define	USB_SUBCLS_CDCC_ABSTRCT_CTRL	0x02
   2656 #define	USB_SUBCLS_CDCC_PHONE_CTRL	0x03
   2657 #define	USB_SUBCLS_CDCC_MULTCNL_ISDN	0x04
   2658 #define	USB_SUBCLS_CDCC_ISDN		0x05
   2659 #define	USB_SUBCLS_CDCC_ETHERNET	0x06
   2660 #define	USB_SUBCLS_CDCC_ATM_NETWORK	0x07
   2661 
   2662 /* HID subclass and protocols. */
   2663 #define	USB_SUBCLS_HID_1		1
   2664 
   2665 #define	USB_PROTO_HID_KEYBOARD		0x01	/* legacy keyboard */
   2666 #define	USB_PROTO_HID_MOUSE		0x02	/* legacy mouse */
   2667 
   2668 /* Printer subclass and protocols. */
   2669 #define	USB_SUBCLS_PRINTER_1		1
   2670 
   2671 #define	USB_PROTO_PRINTER_UNI		0x01	/* Unidirectional interface */
   2672 #define	USB_PROTO_PRINTER_BI		0x02	/* Bidirectional interface */
   2673 
   2674 /* Mass storage subclasses and protocols. */
   2675 #define	USB_SUBCLS_MS_RBC_T10		0x1	/* flash */
   2676 #define	USB_SUBCLS_MS_SFF8020I		0x2	/* CD-ROM */
   2677 #define	USB_SUBCLS_MS_QIC_157		0x3	/* tape */
   2678 #define	USB_SUBCLS_MS_UFI		0x4	/* USB Floppy Disk Drive   */
   2679 #define	USB_SUBCLS_MS_SFF8070I		0x5	/* floppy */
   2680 #define	USB_SUBCLS_MS_SCSI		0x6	/* transparent scsi */
   2681 
   2682 #define	USB_PROTO_MS_CBI_WC		0x00	/* USB CBI Proto w/cmp intr */
   2683 #define	USB_PROTO_MS_CBI		0x01    /* USB CBI Protocol */
   2684 #define	USB_PROTO_MS_ISD_1999_SILICN	0x02    /* ZIP Protocol */
   2685 #define	USB_PROTO_MS_BULK_ONLY		0x50    /* USB Bulk Only Protocol */
   2686 
   2687 /* Application subclasses. */
   2688 #define	USB_SUBCLS_APP_FIRMWARE		0x01	/* app spec f/w subclass */
   2689 #define	USB_SUBCLS_APP_IRDA		0x02	/* app spec IrDa subclass */
   2690 #define	USB_SUBCLS_APP_TEST		0x03	/* app spec test subclass */
   2691 
   2692 /* Video subclasses */
   2693 #define	USB_SUBCLS_VIDEO_CONTROL	0x01	/* video control */
   2694 #define	USB_SUBCLS_VIDEO_STREAM		0x02	/* video stream */
   2695 #define	USB_SUBCLS_VIDEO_COLLECTION	0x03	/* video interface collection */
   2696 
   2697 /* Wireless controller subclasses and protocols, refer to WUSB 1.0 chapter 8 */
   2698 #define	USB_SUBCLS_WUSB_1		0x01	/* RF controller */
   2699 #define	USB_SUBCLS_WUSB_2		0x02	/* Wireless adapter */
   2700 #define	USB_PROTO_WUSB_HWA		0x01	/* host wire adapter */
   2701 #define	USB_PROTO_WUSB_DWA		0x02	/* device wire adapter */
   2702 #define	USB_PROTO_WUSB_DWA_ISO		0x03	/* device wire adapter isoc */
   2703 #define	USB_PROTO_WUSB_RC		0x02	/* UWB radio controller */
   2704 
   2705 /* Association subclass and protocol, Association Model Supplement to WUSB1.0 */
   2706 #define	USB_SUBCLS_CBAF			0x03	/* cable association */
   2707 #define	USB_PROTO_CBAF			0x01	/* CBAF protocol */
   2708 
   2709 /* Misc subclasses and protocols, refer to WUSB 1.0 chapter 8 */
   2710 #define	USB_SUBCLS_MISC_COMMON		0x02	/* common class */
   2711 #define	USB_PROTO_MISC_WA		0x02	/* multifunction wire adapter */
   2712 
   2713 #ifdef __cplusplus
   2714 }
   2715 #endif
   2716 
   2717 #endif /* _SYS_USB_USBAI_H */
   2718