1/*	$NetBSD: usb.h,v 1.121.4.1 2024/02/03 11:47:07 martin Exp $	*/
   2
   3/*
   4 * Copyright (c) 1998 The NetBSD Foundation, Inc.
   5 * All rights reserved.
   6 *
   7 * This code is derived from software contributed to The NetBSD Foundation
   8 * by Lennart Augustsson (lennart@augustsson.net) at
   9 * Carlstedt Research & Technology.
  10 *
  11 * Redistribution and use in source and binary forms, with or without
  12 * modification, are permitted provided that the following conditions
  13 * are met:
  14 * 1. Redistributions of source code must retain the above copyright
  15 *    notice, this list of conditions and the following disclaimer.
  16 * 2. Redistributions in binary form must reproduce the above copyright
  17 *    notice, this list of conditions and the following disclaimer in the
  18 *    documentation and/or other materials provided with the distribution.
  19 *
  20 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
  21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
  22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  23 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
  24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  30 * POSSIBILITY OF SUCH DAMAGE.
  31 */
  32
  33
  34#ifndef _USB_H_
  35#define _USB_H_
  36
  37#include <sys/types.h>
  38#include <sys/time.h>
  39
  40#include <sys/ioctl.h>
  41
  42#if defined(_KERNEL)
  43
  44#include <sys/device.h>
  45
  46#endif
  47
  48#ifdef USB_DEBUG
  49#define Static
  50#else
  51#define Static static
  52#endif
  53
  54#define USB_STACK_VERSION 2
  55
  56#define USB_MAX_DEVICES		128		/* 0, 1-127 */
  57#define USB_MIN_DEVICES		2               /* unused + root HUB */
  58#define USB_START_ADDR		0
  59
  60#define USB_CONTROL_ENDPOINT 0
  61#define USB_MAX_ENDPOINTS 16
  62
  63#define USB_FRAMES_PER_SECOND 1000
  64#define USB_UFRAMES_PER_FRAME 8
  65
  66/*
  67 * The USB records contain some unaligned little-endian word
  68 * components.  The U[SG]ETW macros take care of both the alignment
  69 * and endian problem and should always be used to access non-byte
  70 * values.
  71 */
  72typedef uint8_t uByte;
  73typedef uint8_t uWord[2];
  74typedef uint8_t uDWord[4];
  75
  76#define USETW2(w,h,l) ((w)[0] = (uint8_t)(l), (w)[1] = (uint8_t)(h))
  77
  78#define UGETW(w) ((w)[0] | ((w)[1] << 8))
  79#define USETW(w,v) ((w)[0] = (uint8_t)(v), (w)[1] = (uint8_t)((v) >> 8))
  80#define USETWD(val) { (uint8_t)(val), (uint8_t)((val) >> 8) }
  81#define UGETDW(w) ((w)[0] | ((w)[1] << 8) | ((w)[2] << 16) |	\
  82	    ((uint32_t)(w)[3] << 24))
  83#define USETDW(w,v) ((w)[0] = (uint8_t)(v), \
  84		     (w)[1] = (uint8_t)((v) >> 8), \
  85		     (w)[2] = (uint8_t)((v) >> 16), \
  86		     (w)[3] = (uint8_t)((v) >> 24))
  87#define UPACKED __packed
  88
  89typedef struct {
  90	uByte		bmRequestType;
  91	uByte		bRequest;
  92	uWord		wValue;
  93	uWord		wIndex;
  94	uWord		wLength;
  95} UPACKED usb_device_request_t;
  96
  97#define UT_GET_DIR(a) ((a) & 0x80)
  98#define UT_WRITE		0x00
  99#define UT_READ			0x80
 100
 101#define UT_GET_TYPE(a) ((a) & 0x60)
 102#define UT_STANDARD		0x00
 103#define UT_CLASS		0x20
 104#define UT_VENDOR		0x40
 105
 106#define UT_GET_RECIPIENT(a) ((a) & 0x1f)
 107#define UT_DEVICE		0x00
 108#define UT_INTERFACE		0x01
 109#define UT_ENDPOINT		0x02
 110#define UT_OTHER		0x03
 111
 112#define UT_READ_DEVICE		(UT_READ  | UT_STANDARD | UT_DEVICE)
 113#define UT_READ_INTERFACE	(UT_READ  | UT_STANDARD | UT_INTERFACE)
 114#define UT_READ_ENDPOINT	(UT_READ  | UT_STANDARD | UT_ENDPOINT)
 115#define UT_WRITE_DEVICE		(UT_WRITE | UT_STANDARD | UT_DEVICE)
 116#define UT_WRITE_INTERFACE	(UT_WRITE | UT_STANDARD | UT_INTERFACE)
 117#define UT_WRITE_ENDPOINT	(UT_WRITE | UT_STANDARD | UT_ENDPOINT)
 118#define UT_READ_CLASS_DEVICE	(UT_READ  | UT_CLASS | UT_DEVICE)
 119#define UT_READ_CLASS_INTERFACE	(UT_READ  | UT_CLASS | UT_INTERFACE)
 120#define UT_READ_CLASS_OTHER	(UT_READ  | UT_CLASS | UT_OTHER)
 121#define UT_READ_CLASS_ENDPOINT	(UT_READ  | UT_CLASS | UT_ENDPOINT)
 122#define UT_WRITE_CLASS_DEVICE	(UT_WRITE | UT_CLASS | UT_DEVICE)
 123#define UT_WRITE_CLASS_INTERFACE (UT_WRITE | UT_CLASS | UT_INTERFACE)
 124#define UT_WRITE_CLASS_OTHER	(UT_WRITE | UT_CLASS | UT_OTHER)
 125#define UT_WRITE_CLASS_ENDPOINT	(UT_WRITE | UT_CLASS | UT_ENDPOINT)
 126#define UT_READ_VENDOR_DEVICE	(UT_READ  | UT_VENDOR | UT_DEVICE)
 127#define UT_READ_VENDOR_INTERFACE (UT_READ  | UT_VENDOR | UT_INTERFACE)
 128#define UT_READ_VENDOR_OTHER	(UT_READ  | UT_VENDOR | UT_OTHER)
 129#define UT_READ_VENDOR_ENDPOINT	(UT_READ  | UT_VENDOR | UT_ENDPOINT)
 130#define UT_WRITE_VENDOR_DEVICE	(UT_WRITE | UT_VENDOR | UT_DEVICE)
 131#define UT_WRITE_VENDOR_INTERFACE (UT_WRITE | UT_VENDOR | UT_INTERFACE)
 132#define UT_WRITE_VENDOR_OTHER	(UT_WRITE | UT_VENDOR | UT_OTHER)
 133#define UT_WRITE_VENDOR_ENDPOINT (UT_WRITE | UT_VENDOR | UT_ENDPOINT)
 134
 135/* Standard Requests Codes from the USB 2.0 spec, table 9-4 */
 136#define UR_GET_STATUS		0x00
 137#define UR_CLEAR_FEATURE	0x01
 138#define UR_SET_FEATURE		0x03
 139#define UR_SET_ADDRESS		0x05
 140#define UR_GET_DESCRIPTOR	0x06
 141#define  UDESC_DEVICE		0x01
 142#define  UDESC_CONFIG		0x02
 143#define  UDESC_STRING		0x03
 144#define  UDESC_INTERFACE	0x04
 145#define  UDESC_ENDPOINT		0x05
 146#define  UDESC_DEVICE_QUALIFIER	0x06
 147#define  UDESC_OTHER_SPEED_CONFIGURATION 0x07
 148#define  UDESC_INTERFACE_POWER	0x08
 149#define  UDESC_OTG		0x09
 150#define  UDESC_DEBUG		0x0a
 151#define  UDESC_INTERFACE_ASSOC	0x0b
 152#define  UDESC_BOS		0x0f
 153#define  UDESC_DEVICE_CAPABILITY 0x10
 154#define  UDESC_CS_DEVICE	0x21	/* class specific */
 155#define  UDESC_CS_CONFIG	0x22
 156#define  UDESC_CS_STRING	0x23
 157#define  UDESC_CS_INTERFACE	0x24
 158#define  UDESC_CS_ENDPOINT	0x25
 159#define  UDESC_HUB		0x29
 160#define  UDESC_SS_HUB		0x2a	/* super speed */
 161#define  UDESC_ENDPOINT_SS_COMP 0x30	/* super speed */
 162#define  UDESC_ENDPOINT_ISOCH_SSP_COMP	0x31
 163#define UR_SET_DESCRIPTOR	0x07
 164#define UR_GET_CONFIG		0x08
 165#define UR_SET_CONFIG		0x09
 166#define UR_GET_INTERFACE	0x0a
 167#define UR_SET_INTERFACE	0x0b
 168#define UR_SYNCH_FRAME		0x0c
 169#define UR_SET_ENCRYPTION	0x0d
 170#define UR_GET_ENCRYPTION	0x0e
 171#define UR_SET_HANDSHAKE	0x0f
 172#define UR_GET_HANDSHAKE	0x10
 173#define UR_SET_CONNECTION	0x11
 174#define UR_SET_SECURITY_DATA	0x12
 175#define UR_GET_SECURITY_DATA	0x13
 176#define UR_SET_WUSB_DATA	0x14
 177#define UR_LOOPBACK_DATA_WRITE	0x15
 178#define UR_LOOPBACK_DATA_READ	0x16
 179#define UR_SET_INTERFACE_DS	0x17
 180#define UR_SET_SEL		0x30
 181#define UR_SET_ISOCH_DELAY	0x31
 182
 183/*
 184 * Feature selectors. USB 2.0 spec, table 9-6 and OTG and EH suppliment,
 185 * table 6-2
 186 */
 187#define UF_ENDPOINT_HALT	0
 188#define UF_INTERFACE_FUNCTION_SUSPEND	0
 189#define UF_DEVICE_REMOTE_WAKEUP	1
 190#define UF_TEST_MODE		2
 191#define UF_DEVICE_B_HNP_ENABLE	3
 192#define UF_DEVICE_A_HNP_SUPPORT	4
 193#define UF_DEVICE_A_ALT_HNP_SUPPORT 5
 194#define UF_DEVICE_WUSB_DEVICE	6
 195#define UF_U1_ENABLE		0x30
 196#define UF_U2_ENABLE		0x31
 197#define UF_LTM_ENABLE		0x32
 198
 199#define USB_MAX_IPACKET		8 /* maximum size of the initial packet */
 200
 201#define USB_2_MAX_CTRL_PACKET	64
 202#define USB_2_MAX_BULK_PACKET	512
 203
 204#define USB_3_MAX_CTRL_PACKET	512
 205
 206/*
 207 * This is the common header to all USB descriptors defined in the USB
 208 * specification.
 209 *
 210 * DO NOT CHANGE THIS TYPE!
 211 */
 212typedef struct {
 213	uByte		bLength;
 214	uByte		bDescriptorType;
 215} UPACKED usb_descriptor_t;
 216#define USB_DESCRIPTOR_SIZE 2
 217__CTASSERT(sizeof(usb_descriptor_t) == USB_DESCRIPTOR_SIZE);
 218
 219typedef struct {
 220	uByte		bLength;
 221	uByte		bDescriptorType;
 222	uWord		bcdUSB;
 223#define UD_USB_2_0		0x0200
 224#define UD_USB_3_0		0x0300
 225#define UD_IS_USB2(d) (UGETW((d)->bcdUSB) >= UD_USB_2_0)
 226#define UD_IS_USB3(d) (UGETW((d)->bcdUSB) >= UD_USB_3_0)
 227	uByte		bDeviceClass;
 228	uByte		bDeviceSubClass;
 229	uByte		bDeviceProtocol;
 230	uByte		bMaxPacketSize;
 231	/* The fields below are not part of the initial descriptor. */
 232	uWord		idVendor;
 233	uWord		idProduct;
 234	uWord		bcdDevice;
 235	uByte		iManufacturer;
 236	uByte		iProduct;
 237	uByte		iSerialNumber;
 238	uByte		bNumConfigurations;
 239} UPACKED usb_device_descriptor_t;
 240#define USB_DEVICE_DESCRIPTOR_SIZE 18
 241
 242typedef struct {
 243	uByte		bLength;
 244	uByte		bDescriptorType;
 245	uWord		wTotalLength;
 246	uByte		bNumInterface;
 247	uByte		bConfigurationValue;
 248	uByte		iConfiguration;
 249	uByte		bmAttributes;
 250#define UC_ATTR_MBO		0x80
 251#define UC_SELF_POWERED		0x40
 252#define UC_REMOTE_WAKEUP	0x20
 253	uByte		bMaxPower; /* max current in 2 mA units */
 254#define UC_POWER_FACTOR 2
 255#define UC_POWER_FACTOR_SS 8
 256} UPACKED usb_config_descriptor_t;
 257#define USB_CONFIG_DESCRIPTOR_SIZE 9
 258
 259typedef struct {
 260	uByte		bLength;
 261	uByte		bDescriptorType;
 262	uByte		bInterfaceNumber;
 263	uByte		bAlternateSetting;
 264	uByte		bNumEndpoints;
 265	uByte		bInterfaceClass;
 266	uByte		bInterfaceSubClass;
 267	uByte		bInterfaceProtocol;
 268	uByte		iInterface;
 269} UPACKED usb_interface_descriptor_t;
 270#define USB_INTERFACE_DESCRIPTOR_SIZE 9
 271
 272typedef struct {
 273	uByte		bLength;
 274	uByte		bDescriptorType;
 275	uByte		bFirstInterface;
 276	uByte		bInterfaceCount;
 277	uByte		bFunctionClass;
 278	uByte		bFunctionSubClass;
 279	uByte		bFunctionProtocol;
 280	uByte		iFunction;
 281} UPACKED usb_interface_assoc_descriptor_t;
 282#define USB_INTERFACE_ASSOC_DESCRIPTOR_SIZE 8
 283
 284typedef struct {
 285	uByte		bLength;
 286	uByte		bDescriptorType;
 287	uByte		bEndpointAddress;
 288#define UE_GET_DIR(a)	((a) & 0x80)
 289#define UE_SET_DIR(a,d)	((a) | (((d)&1) << 7))
 290#define UE_DIR_IN	0x80
 291#define UE_DIR_OUT	0x00
 292#define UE_ADDR		0x0f
 293#define UE_GET_ADDR(a)	((a) & UE_ADDR)
 294	uByte		bmAttributes;
 295#define UE_XFERTYPE	0x03
 296#define  UE_CONTROL	0x00
 297#define  UE_ISOCHRONOUS	0x01
 298#define  UE_BULK	0x02
 299#define  UE_INTERRUPT	0x03
 300#define UE_GET_XFERTYPE(a)	((a) & UE_XFERTYPE)
 301#define UE_ISO_TYPE	0x0c
 302#define  UE_ISO_ASYNC	0x04
 303#define  UE_ISO_ADAPT	0x08
 304#define  UE_ISO_SYNC	0x0c
 305#define UE_GET_ISO_TYPE(a)	((a) & UE_ISO_TYPE)
 306	uWord		wMaxPacketSize;
 307#define UE_GET_TRANS(a)		(((a) >> 11) & 0x3)
 308#define UE_GET_SIZE(a)		((a) & 0x7ff)
 309	uByte		bInterval;
 310} UPACKED usb_endpoint_descriptor_t;
 311#define USB_ENDPOINT_DESCRIPTOR_SIZE 7
 312
 313typedef struct {
 314	uByte		bLength;
 315	uByte		bDescriptorType;
 316	uByte		bMaxBurst;
 317	uByte		bmAttributes;
 318#define UE_GET_BULK_STREAMS_MASK	__BITS(4,0)
 319#define UE_GET_BULK_STREAMS(x)		__SHIFTOUT(x, UE_GET_BULK_STREAMS_MASK)
 320#define UE_GET_SS_ISO_MULT_MASK		__BITS(1,0)
 321#define UE_GET_SS_ISO_MULT(x)		__SHIFTOUT(x, UE_GET_SS_ISO_MULT_MASK)
 322#define UE_GET_SS_ISO_SSP_MASK		__BIT(7)
 323#define UE_GET_SS_ISO_SSP(x)		__SHIFTOUT(x, UE_GET_SS_ISO_SSP_MASK)
 324	/* The fields below are only valid for periodic endpoints */
 325	uWord		wBytesPerInterval;
 326} UPACKED usb_endpoint_ss_comp_descriptor_t;
 327#define USB_ENDPOINT_SS_COMP_DESCRIPTOR_SIZE 6
 328
 329/* USB 3.0 9.6.2, Table 9-12 */
 330typedef struct {
 331	uByte		bLength;
 332	uByte		bDescriptorType;
 333	uWord		wTotalLength;
 334	uByte		bNumDeviceCaps;
 335} UPACKED usb_bos_descriptor_t;
 336#define USB_BOS_DESCRIPTOR_SIZE 5
 337
 338/* common members of device capability descriptors */
 339typedef struct {
 340	uByte		bLength;
 341	uByte		bDescriptorType;
 342	uByte		bDevCapabilityType;
 343/* Table 9-14 */
 344#define USB_DEVCAP_RESERVED			0x00
 345#define USB_DEVCAP_WUSB				0x01
 346#define USB_DEVCAP_USB2EXT			0x02
 347#define USB_DEVCAP_SUPER_SPEED			0x03
 348#define USB_DEVCAP_CONTAINER_ID			0x04
 349#define USB_DEVCAP_PLATFORM			0x05
 350#define USB_DEVCAP_POWER_DELIVERY_CAPABILITY	0x06
 351#define USB_DEVCAP_BATTERY_INFO_CAPABILITY	0x07
 352#define USB_DEVCAP_PD_CONSUMER_PORT_CAPABILITY	0x08
 353#define USB_DEVCAP_PD_PROVIDER_PORT_CAPABILITY	0x09
 354#define USB_DEVCAP_SUPERSPEED_PLUS		0x0a
 355#define USB_DEVCAP_PRECISION_TIME_MEASUREMENT	0x0b
 356#define USB_DEVCAP_WUSB_EXT			0x0c
 357	/* data ... */
 358} UPACKED usb_device_capability_descriptor_t;
 359#define USB_DEVICE_CAPABILITY_DESCRIPTOR_SIZE 3 /* at least */
 360
 361/* 9.6.2.1 */
 362typedef struct {
 363	uByte		bLength;
 364	uByte		bDescriptorType;
 365	uByte		bDevCapabilityType;
 366	uDWord		bmAttributes;
 367#define USB_DEVCAP_V2EXT_LPM			__BIT(1)
 368#define USB_DEVCAP_V2EXT_BESL_SUPPORTED		__BIT(2)
 369#define USB_DEVCAP_V2EXT_BESL_BASELINE_VALID	__BIT(3)
 370#define USB_DEVCAP_V2EXT_BESL_DEEP_VALID	__BIT(4)
 371#define USB_DEVCAP_V2EXT_BESL_BASELINE_MASK	__BITS(11, 8)
 372#define USB_DEVCAP_V2EXT_BESL_BASELINE_GET(x)	__SHIFTOUT(x, USB_V2EXT_BESL_BASELINE_MASK)
 373#define USB_DEVCAP_V2EXT_BESL_DEEP_MASK		__BITS(15, 12)
 374#define USB_DEVCAP_V2EXT_BESL_DEEP_GET(x)	__SHIFTOUT(x, USB_V2EXT_BESL_DEEP_MASK)
 375} UPACKED usb_devcap_usb2ext_descriptor_t;
 376#define USB_DEVCAP_USB2EXT_DESCRIPTOR_SIZE 7
 377
 378/* 9.6.2.2 */
 379typedef struct {
 380	uByte		bLength;
 381	uByte		bDescriptorType;
 382	uByte		bDevCapabilityType;
 383	uByte		bmAttributes;
 384#define USB_DEVCAP_SS_LTM __BIT(1)
 385	uWord		wSpeedsSupported;
 386#define USB_DEVCAP_SS_SPEED_LS __BIT(0)
 387#define USB_DEVCAP_SS_SPEED_FS __BIT(1)
 388#define USB_DEVCAP_SS_SPEED_HS __BIT(2)
 389#define USB_DEVCAP_SS_SPEED_SS __BIT(3)
 390	uByte		bFunctionalitySupport;
 391	uByte		bU1DevExitLat;
 392	uWord		wU2DevExitLat;
 393} UPACKED usb_devcap_ss_descriptor_t;
 394#define USB_DEVCAP_SS_DESCRIPTOR_SIZE 10
 395
 396/* 9.6.2.4 */
 397typedef struct {
 398	uByte		bLength;
 399	uByte		bDescriptorType;
 400	uByte		bDevCapabilityType;
 401	uByte		bReserved;
 402	uByte		ContainerID[16];
 403} UPACKED usb_devcap_container_id_descriptor_t;
 404#define USB_DEVCAP_CONTAINER_ID_DESCRIPTOR_SIZE 20
 405
 406typedef struct {
 407	uByte		bLength;
 408	uByte		bDescriptorType;
 409	uByte		bDevCapabilityType;
 410	uByte		bReserved;
 411	uByte		PlatformCapabilityUUID[16];
 412	uByte		CapabilityData[0];
 413} UPACKED usb_devcap_platform_descriptor_t;
 414#define USB_DEVCAP_PLATFORM_DESCRIPTOR_SIZE 20
 415
 416/* usb 3.1 ch 9.6.2.5 */
 417typedef struct {
 418	uByte		bLength;
 419	uByte		bDescriptorType;
 420	uByte		bDevCapabilityType;
 421	uByte		bReserved;
 422	uDWord		bmAttributes;
 423#define	USB_DEVCAP_SSP_SSAC(x)			__SHIFTOUT(x, __BITS(4,0))
 424#define	USB_DEVCAP_SSP_SSIC(x)			__SHIFTOUT(x, __BITS(8,5))
 425	uWord		wFunctionalitySupport;
 426#define	USB_DEVCAP_SSP_SSID(x)			__SHIFTOUT(x, __BITS(3,0))
 427#define	USB_DEVCAP_SSP_MIN_RXLANE_COUNT(x)	__SHIFTOUT(x, __BITS(11,8))
 428#define	USB_DEVCAP_SSP_MIN_TXLANE_COUNT(x)	__SHIFTOUT(x, __BITS(15,12))
 429	uWord		wReserved;
 430	uDWord		bmSublinkSpeedAttr[0];
 431#define	USB_DEVCAP_SSP_SSID(x)			__SHIFTOUT(x, __BITS(3,0))
 432#define	USB_DEVCAP_SSP_LSE(x)			__SHIFTOUT(x, __BITS(5,4))
 433#define	USB_DEVCAP_SSP_ST(x)			__SHIFTOUT(x, __BITS(7,6))
 434#define	USB_DEVCAP_SSP_LP(x)			__SHIFTOUT(x, __BITS(15,14))
 435#define	USB_DEVCAP_SSP_LSM(x)			__SHIFTOUT(x, __BITS(31,16))
 436} UPACKED usb_devcap_ssp_descriptor_t;
 437#define USB_DEVCAP_SSP_DESCRIPTOR_SIZE 12 /* variable length */
 438
 439typedef struct {
 440	uByte		bLength;
 441	uByte		bDescriptorType;
 442	uWord		bString[126];
 443} UPACKED usb_string_descriptor_t;
 444#define USB_MAX_STRING_LEN 128
 445#define USB_LANGUAGE_TABLE 0	/* # of the string language id table */
 446#define USB_MAX_ENCODED_STRING_LEN (USB_MAX_STRING_LEN * 3) /* UTF8 */
 447
 448/* Hub specific request */
 449#define UR_GET_BUS_STATE	0x02
 450#define UR_CLEAR_TT_BUFFER	0x08
 451#define UR_RESET_TT		0x09
 452#define UR_GET_TT_STATE		0x0a
 453#define UR_STOP_TT		0x0b
 454#define UR_SET_AND_TEST		0x0c	/* USB 2.0 only */
 455#define UR_SET_HUB_DEPTH	0x0c	/* USB 3.0 only */
 456#define UR_GET_PORT_ERR_COUNT	0x0d
 457/* Port Status Type for GET_STATUS,  USB 3.1 10.16.2.6 and Table 10-12 */
 458#define  UR_PST_PORT_STATUS	0
 459#define  UR_PST_PD_STATUS	1
 460#define  UR_PST_EXT_PORT_STATUS	2
 461
 462/*
 463 * Hub features from USB 2.0 spec, table 11-17 and updated by the
 464 * LPM ECN table 4-7.
 465 */
 466#define UHF_C_HUB_LOCAL_POWER	0
 467#define UHF_C_HUB_OVER_CURRENT	1
 468#define UHF_PORT_CONNECTION	0
 469#define UHF_PORT_ENABLE		1
 470#define UHF_PORT_SUSPEND	2
 471#define UHF_PORT_OVER_CURRENT	3
 472#define UHF_PORT_RESET		4
 473#define UHF_PORT_LINK_STATE	5
 474#define UHF_PORT_POWER		8
 475#define UHF_PORT_LOW_SPEED	9
 476#define UHF_PORT_L1		10
 477#define UHF_C_PORT_CONNECTION	16
 478#define UHF_C_PORT_ENABLE	17
 479#define UHF_C_PORT_SUSPEND	18
 480#define UHF_C_PORT_OVER_CURRENT	19
 481#define UHF_C_PORT_RESET	20
 482#define UHF_PORT_TEST		21
 483#define UHF_PORT_INDICATOR	22
 484#define UHF_C_PORT_L1		23
 485
 486/* SS HUB specific features */
 487#define UHF_PORT_U1_TIMEOUT	23
 488#define UHF_PORT_U2_TIMEOUT	24
 489#define UHF_C_PORT_LINK_STATE	25
 490#define UHF_C_PORT_CONFIG_ERROR	26
 491#define UHF_PORT_REMOTE_WAKE_MASK	27
 492#define UHF_BH_PORT_RESET	28
 493#define UHF_C_BH_PORT_RESET	29
 494#define UHF_FORCE_LINKPM_ACCEPT	30
 495
 496typedef struct {
 497	uByte		bDescLength;
 498	uByte		bDescriptorType;
 499	uByte		bNbrPorts;
 500#define UHD_NPORTS_MAX		255
 501	uWord		wHubCharacteristics;
 502#define UHD_PWR			0x0003
 503#define  UHD_PWR_GANGED		0x0000
 504#define  UHD_PWR_INDIVIDUAL	0x0001
 505#define  UHD_PWR_NO_SWITCH	0x0002
 506#define UHD_COMPOUND		0x0004
 507#define UHD_OC			0x0018
 508#define  UHD_OC_GLOBAL		0x0000
 509#define  UHD_OC_INDIVIDUAL	0x0008
 510#define  UHD_OC_NONE		0x0010
 511#define UHD_TT_THINK		0x0060
 512#define  UHD_TT_THINK_8		0x0000
 513#define  UHD_TT_THINK_16	0x0020
 514#define  UHD_TT_THINK_24	0x0040
 515#define  UHD_TT_THINK_32	0x0060
 516#define UHD_PORT_IND		0x0080
 517	uByte		bPwrOn2PwrGood;	/* delay in 2 ms units */
 518#define UHD_PWRON_FACTOR 2
 519	uByte		bHubContrCurrent;
 520	uByte		DeviceRemovable[32]; /* max 255 ports */
 521#define UHD_NOT_REMOV(desc, i) \
 522    (((desc)->DeviceRemovable[(i)/8] >> ((i) % 8)) & 1)
 523	/* deprecated */ uByte		PortPowerCtrlMask[1];
 524} UPACKED usb_hub_descriptor_t;
 525#define USB_HUB_DESCRIPTOR_SIZE 9 /* includes deprecated PortPowerCtrlMask */
 526
 527typedef struct {
 528	uByte		bLength;
 529	uByte		bDescriptorType;
 530	uByte		bNbrPorts;
 531#define UHD_SS_NPORTS_MAX	15
 532	uWord		wHubCharacteristics;
 533	uByte		bPwrOn2PwrGood;	/* delay in 2 ms units */
 534	uByte		bHubContrCurrent;
 535	uByte		bHubHdrDecLat;
 536	uWord		wHubDelay;	/* forward delay in nanosec */
 537	uByte		DeviceRemovable[2]; /* max 15 ports */
 538} UPACKED usb_hub_ss_descriptor_t;
 539#define USB_HUB_SS_DESCRIPTOR_SIZE 12
 540
 541typedef struct {
 542	uByte		bLength;
 543	uByte		bDescriptorType;
 544	uWord		bcdUSB;
 545	uByte		bDeviceClass;
 546	uByte		bDeviceSubClass;
 547	uByte		bDeviceProtocol;
 548	uByte		bMaxPacketSize0;
 549	uByte		bNumConfigurations;
 550	uByte		bReserved;
 551} UPACKED usb_device_qualifier_t;
 552#define USB_DEVICE_QUALIFIER_SIZE 10
 553
 554typedef struct {
 555	uByte		bLength;
 556	uByte		bDescriptorType;
 557	uByte		bmAttributes;
 558#define UOTG_SRP	0x01
 559#define UOTG_HNP	0x02
 560} UPACKED usb_otg_descriptor_t;
 561
 562/* OTG feature selectors */
 563#define UOTG_B_HNP_ENABLE	3
 564#define UOTG_A_HNP_SUPPORT	4
 565#define UOTG_A_ALT_HNP_SUPPORT	5
 566
 567typedef struct {
 568	uByte		bLength;
 569	uByte		bDescriptorType;
 570	uByte		bDebugInEndpoint;
 571	uByte		bDebugOutEndpoint;
 572} UPACKED usb_debug_descriptor_t;
 573
 574typedef struct {
 575	uWord		wStatus;
 576/* Device status flags */
 577#define UDS_SELF_POWERED		0x0001
 578#define UDS_REMOTE_WAKEUP		0x0002
 579/* Endpoint status flags */
 580#define UES_HALT			0x0001
 581} UPACKED usb_status_t;
 582
 583typedef struct {
 584	uWord		wHubStatus;
 585#define UHS_LOCAL_POWER			0x0001
 586#define UHS_OVER_CURRENT		0x0002
 587	uWord		wHubChange;
 588} UPACKED usb_hub_status_t;
 589
 590typedef struct {
 591	uWord		wPortStatus;
 592#define UPS_CURRENT_CONNECT_STATUS	0x0001
 593#define UPS_PORT_ENABLED		0x0002
 594#define UPS_SUSPEND			0x0004
 595#define UPS_OVERCURRENT_INDICATOR	0x0008
 596#define UPS_RESET			0x0010
 597#define UPS_PORT_L1			0x0020
 598#define UPS_PORT_LS_MASK		__BITS(8,5)
 599#define UPS_PORT_LS_GET(x)		__SHIFTOUT(x, UPS_PORT_LS_MASK)
 600#define UPS_PORT_LS_SET(x)		__SHIFTIN(x, UPS_PORT_LS_MASK)
 601#define UPS_PORT_LS_U0			0x00
 602#define UPS_PORT_LS_U1			0x01
 603#define UPS_PORT_LS_U2			0x02
 604#define UPS_PORT_LS_U3			0x03
 605#define UPS_PORT_LS_SS_DIS		0x04
 606#define UPS_PORT_LS_RX_DET		0x05
 607#define UPS_PORT_LS_SS_INA		0x06
 608#define UPS_PORT_LS_POLL		0x07
 609#define UPS_PORT_LS_RECOVER		0x08
 610#define UPS_PORT_LS_HOT_RST		0x09
 611#define UPS_PORT_LS_COMP_MODE		0x0a
 612#define UPS_PORT_LS_LOOPBACK		0x0b
 613#define UPS_PORT_LS_RESUME		0x0f
 614#define UPS_PORT_POWER			0x0100
 615#define UPS_PORT_POWER_SS		0x0200
 616#define UPS_FULL_SPEED			0x0000	/* for completeness */
 617#define UPS_LOW_SPEED			0x0200
 618#define UPS_HIGH_SPEED			0x0400
 619#define UPS_PORT_TEST			0x0800
 620#define UPS_PORT_INDICATOR		0x1000
 621#define UPS_OTHER_SPEED			0x2000	/* currently NetBSD specific */
 622	uWord		wPortChange;
 623#define UPS_C_CONNECT_STATUS		0x0001
 624#define UPS_C_PORT_ENABLED		0x0002
 625#define UPS_C_SUSPEND			0x0004
 626#define UPS_C_OVERCURRENT_INDICATOR	0x0008
 627#define UPS_C_PORT_RESET		0x0010
 628#define UPS_C_PORT_L1			0x0020
 629#define UPS_C_BH_PORT_RESET		0x0020
 630#define UPS_C_PORT_LINK_STATE		0x0040
 631#define UPS_C_PORT_CONFIG_ERROR		0x0080
 632} UPACKED usb_port_status_t;
 633
 634/* 10.16.2.6 */
 635/* Valid when port status type is UR_PST_EXT_PORT_STATUS. */
 636typedef struct {
 637	uWord		wPortStatus;
 638	uWord		wPortChange;
 639	uDWord		dwExtPortStatus;
 640} UPACKED usb_port_status_ext_t;
 641
 642/* Device class codes */
 643#define UDCLASS_IN_INTERFACE	0x00
 644#define UDCLASS_COMM		0x02
 645#define UDCLASS_HUB		0x09
 646#define  UDSUBCLASS_HUB		0x00
 647#define  UDPROTO_FSHUB		0x00
 648#define  UDPROTO_HSHUBSTT	0x01
 649#define  UDPROTO_HSHUBMTT	0x02
 650#define  UDPROTO_SSHUB		0x03
 651#define UDCLASS_DIAGNOSTIC	0xdc
 652#define UDCLASS_WIRELESS	0xe0
 653#define  UDSUBCLASS_RF		0x01
 654#define   UDPROTO_BLUETOOTH	0x01
 655#define UDCLASS_VENDOR		0xff
 656
 657/* Interface class codes */
 658#define UICLASS_UNSPEC		0x00
 659
 660#define UICLASS_AUDIO		0x01
 661#define  UISUBCLASS_AUDIOCONTROL	1
 662#define  UISUBCLASS_AUDIOSTREAM		2
 663#define  UISUBCLASS_MIDISTREAM		3
 664
 665#define UICLASS_VIDEO		0x0e
 666#define  UISUBCLASS_VIDEOCONTROL	1
 667#define  UISUBCLASS_VIDEOSTREAMING	2
 668#define  UISUBCLASS_VIDEOCOLLECTION	3
 669
 670#define UICLASS_CDC		0x02 /* communication */
 671#define  UISUBCLASS_DIRECT_LINE_CONTROL_MODEL	1
 672#define  UISUBCLASS_ABSTRACT_CONTROL_MODEL	2
 673#define  UISUBCLASS_TELEPHONE_CONTROL_MODEL	3
 674#define  UISUBCLASS_MULTICHANNEL_CONTROL_MODEL	4
 675#define  UISUBCLASS_CAPI_CONTROLMODEL		5
 676#define  UISUBCLASS_ETHERNET_NETWORKING_CONTROL_MODEL 6
 677#define  UISUBCLASS_ATM_NETWORKING_CONTROL_MODEL 7
 678#define  UISUBCLASS_MOBILE_DIRECT_LINE_MODEL	10
 679#define  UISUBCLASS_NETWORK_CONTROL_MODEL	13
 680#define  UISUBCLASS_MOBILE_BROADBAND_INTERFACE_MODEL	14
 681#define  UIPROTO_CDC_NOCLASS			0 /* no class specific
 682						     protocol required */
 683#define  UIPROTO_CDC_AT				1
 684
 685#define UICLASS_HID		0x03
 686#define  UISUBCLASS_BOOT	1
 687#define  UIPROTO_BOOT_KEYBOARD	1
 688#define  UIPROTO_MOUSE		2
 689
 690#define UICLASS_PHYSICAL	0x05
 691
 692#define UICLASS_IMAGE		0x06
 693
 694#define UICLASS_PRINTER		0x07
 695#define  UISUBCLASS_PRINTER	1
 696#define  UIPROTO_PRINTER_UNI	1
 697#define  UIPROTO_PRINTER_BI	2
 698#define  UIPROTO_PRINTER_1284	3
 699
 700#define UICLASS_MASS		0x08
 701#define  UISUBCLASS_RBC		1
 702#define  UISUBCLASS_SFF8020I	2
 703#define  UISUBCLASS_QIC157	3
 704#define  UISUBCLASS_UFI		4
 705#define  UISUBCLASS_SFF8070I	5
 706#define  UISUBCLASS_SCSI	6
 707#define  UIPROTO_MASS_CBI_I	0
 708#define  UIPROTO_MASS_CBI	1
 709#define  UIPROTO_MASS_BBB_OLD	2	/* Not in the spec anymore */
 710#define  UIPROTO_MASS_BBB	80	/* 'P' for the Iomega Zip drive */
 711#define  UIPROTO_MASS_UAS	98	/* USB Attached SCSI */
 712
 713#define UICLASS_HUB		0x09
 714#define  UISUBCLASS_HUB		0
 715#define  UIPROTO_FSHUB		0
 716#define  UIPROTO_HSHUBSTT	0 /* Yes, same as previous */
 717#define  UIPROTO_HSHUBMTT	1
 718
 719#define UICLASS_CDC_DATA	0x0a
 720#define  UISUBCLASS_DATA		0
 721#define   UIPROTO_DATA_MBIM		0x02    /* MBIM */
 722#define   UIPROTO_DATA_ISDNBRI		0x30    /* Physical iface */
 723#define   UIPROTO_DATA_HDLC		0x31    /* HDLC */
 724#define   UIPROTO_DATA_TRANSPARENT	0x32    /* Transparent */
 725#define   UIPROTO_DATA_Q921M		0x50    /* Management for Q921 */
 726#define   UIPROTO_DATA_Q921		0x51    /* Data for Q921 */
 727#define   UIPROTO_DATA_Q921TM		0x52    /* TEI multiplexer for Q921 */
 728#define   UIPROTO_DATA_V42BIS		0x90    /* Data compression */
 729#define   UIPROTO_DATA_Q931		0x91    /* Euro-ISDN */
 730#define   UIPROTO_DATA_V120		0x92    /* V.24 rate adaption */
 731#define   UIPROTO_DATA_CAPI		0x93    /* CAPI 2.0 commands */
 732#define   UIPROTO_DATA_HOST_BASED	0xfd    /* Host based driver */
 733#define   UIPROTO_DATA_PUF		0xfe    /* see Prot. Unit Func. Desc.*/
 734#define   UIPROTO_DATA_VENDOR		0xff    /* Vendor specific */
 735
 736#define UICLASS_SMARTCARD	0x0b
 737
 738/*#define UICLASS_FIRM_UPD	0x0c*/
 739
 740#define UICLASS_SECURITY	0x0d
 741
 742#define UICLASS_DIAGNOSTIC	0xdc
 743
 744#define UICLASS_WIRELESS	0xe0
 745#define  UISUBCLASS_RF			0x01
 746#define   UIPROTO_BLUETOOTH		0x01
 747#define   UIPROTO_RNDIS			0x03
 748
 749#define UICLASS_APPL_SPEC	0xfe
 750#define  UISUBCLASS_FIRMWARE_DOWNLOAD	1
 751#define  UISUBCLASS_IRDA		2
 752#define  UIPROTO_IRDA			0
 753
 754#define UICLASS_VENDOR		0xff
 755
 756
 757#define USB_HUB_MAX_DEPTH 5
 758
 759/*
 760 * Minimum time a device needs to be powered down to go through
 761 * a power cycle.  XXX Are these time in the spec?
 762 */
 763#define USB_POWER_DOWN_TIME	200 /* ms */
 764#define USB_PORT_POWER_DOWN_TIME	100 /* ms */
 765
 766#if 0
 767/* These are the values from the spec. */
 768#define USB_PORT_RESET_DELAY	10  /* ms */
 769#define USB_PORT_ROOT_RESET_DELAY 50  /* ms */
 770#define USB_PORT_RESET_RECOVERY	10  /* ms */
 771#define USB_PORT_POWERUP_DELAY	100 /* ms */
 772#define USB_SET_ADDRESS_SETTLE	2   /* ms */
 773#define USB_RESUME_DELAY	(20*5)  /* ms */
 774#define USB_RESUME_WAIT		10  /* ms */
 775#define USB_RESUME_RECOVERY	10  /* ms */
 776#define USB_EXTRA_POWER_UP_TIME	0   /* ms */
 777#else
 778/* Allow for marginal (i.e. non-conforming) devices. */
 779#define USB_PORT_RESET_DELAY	50  /* ms */
 780#define USB_PORT_ROOT_RESET_DELAY 250  /* ms */
 781#define USB_PORT_RESET_RECOVERY	20  /* ms */
 782#define USB_PORT_POWERUP_DELAY	300 /* ms */
 783#define USB_SET_ADDRESS_SETTLE	10  /* ms */
 784#define USB_RESUME_DELAY	(50*5)  /* ms */
 785#define USB_RESUME_WAIT		50  /* ms */
 786#define USB_RESUME_RECOVERY	50  /* ms */
 787#define USB_EXTRA_POWER_UP_TIME	20  /* ms */
 788#endif
 789
 790#define USB_MIN_POWER		100 /* mA */
 791#define USB_MIN_POWER_SS	150 /* mA */
 792#define USB_MAX_POWER		500 /* mA */
 793#define USB_MAX_POWER_SS	900 /* mA */
 794
 795#define USB_BUS_RESET_DELAY	100 /* ms XXX?*/
 796
 797
 798#define USB_UNCONFIG_NO 0
 799#define USB_UNCONFIG_INDEX (-1)
 800
 801
 802/* Packet IDs */
 803#define UPID_RESERVED	0xf0
 804#define UPID_OUT	0xe1
 805#define UPID_ACK	0xd2
 806#define UPID_DATA0	0xc3
 807#define UPID_PING	0xb4
 808#define UPID_SOF	0xa5
 809#define UPID_NYET	0x96
 810#define UPID_DATA2	0x87
 811#define UPID_SPLIT	0x78
 812#define UPID_IN		0x69
 813#define UPID_NAK	0x5a
 814#define UPID_DATA1	0x4b
 815#define UPID_ERR	0x3c
 816#define UPID_PREAMBLE	0x3c
 817#define UPID_SETUP	0x2d
 818#define UPID_STALL	0x1e
 819#define UPID_MDATA	0x0f
 820
 821
 822/*** ioctl() related stuff ***/
 823
 824struct usb_ctl_request {
 825	int	ucr_addr;
 826	usb_device_request_t ucr_request;
 827	void	*ucr_data;
 828	int	ucr_flags;
 829#define USBD_SHORT_XFER_OK	0x04	/* allow short reads */
 830	int	ucr_actlen;		/* actual length transferred */
 831};
 832
 833struct usb_alt_interface {
 834	int	uai_config_index;
 835	int	uai_interface_index;
 836	int	uai_alt_no;
 837};
 838
 839#define USB_CURRENT_CONFIG_INDEX (-1)
 840#define USB_CURRENT_ALT_INDEX (-1)
 841
 842struct usb_config_desc {
 843	int	ucd_config_index;
 844	usb_config_descriptor_t ucd_desc;
 845};
 846
 847struct usb_interface_desc {
 848	int	uid_config_index;
 849	int	uid_interface_index;
 850	int	uid_alt_index;
 851	usb_interface_descriptor_t uid_desc;
 852};
 853
 854struct usb_endpoint_desc {
 855	int	ued_config_index;
 856	int	ued_interface_index;
 857	int	ued_alt_index;
 858	int	ued_endpoint_index;
 859	usb_endpoint_descriptor_t ued_desc;
 860};
 861
 862struct usb_full_desc {
 863	int		ufd_config_index;
 864	unsigned	ufd_size;
 865	unsigned char	*ufd_data;
 866};
 867
 868struct usb_string_desc {
 869	int	usd_string_index;
 870	int	usd_language_id;
 871	usb_string_descriptor_t usd_desc;
 872};
 873
 874struct usb_ctl_report_desc {
 875	int		ucrd_size;
 876	unsigned char	ucrd_data[1024];	/* filled data size will vary */
 877};
 878
 879typedef struct { uint32_t cookie; } usb_event_cookie_t;
 880
 881#define USB_MAX_DEVNAMES 4
 882#define USB_MAX_DEVNAMELEN 16
 883struct usb_device_info {
 884	uint8_t		udi_bus;
 885	uint8_t		udi_addr;	/* device address */
 886	usb_event_cookie_t udi_cookie;
 887	char		udi_product[USB_MAX_ENCODED_STRING_LEN];
 888	char		udi_vendor[USB_MAX_ENCODED_STRING_LEN];
 889	char		udi_release[8];
 890	char		udi_serial[USB_MAX_ENCODED_STRING_LEN];
 891	uint16_t	udi_productNo;
 892	uint16_t	udi_vendorNo;
 893	uint16_t	udi_releaseNo;
 894	uint8_t		udi_class;
 895	uint8_t		udi_subclass;
 896	uint8_t		udi_protocol;
 897	uint8_t		udi_config;
 898	uint8_t		udi_speed;
 899#define USB_SPEED_LOW  1
 900#define USB_SPEED_FULL 2
 901#define USB_SPEED_HIGH 3
 902#define USB_SPEED_SUPER 4
 903#define USB_SPEED_SUPER_PLUS 5
 904#define USB_IS_SS(X) ((X) == USB_SPEED_SUPER || (X) == USB_SPEED_SUPER_PLUS)
 905	int		udi_power;	/* power consumption in mA, 0 if selfpowered */
 906	int		udi_nports;
 907	char		udi_devnames[USB_MAX_DEVNAMES][USB_MAX_DEVNAMELEN];
 908	uint8_t		udi_ports[16];/* hub only: addresses of devices on ports */
 909#define USB_PORT_ENABLED 0xff
 910#define USB_PORT_SUSPENDED 0xfe
 911#define USB_PORT_POWERED 0xfd
 912#define USB_PORT_DISABLED 0xfc
 913};
 914
 915/* <=3.0 had this layout of the structure */
 916struct usb_device_info_old {
 917	uint8_t		udi_bus;
 918	uint8_t		udi_addr;       /* device address */
 919	usb_event_cookie_t udi_cookie;
 920	char		udi_product[USB_MAX_STRING_LEN];
 921	char		udi_vendor[USB_MAX_STRING_LEN];
 922	char		udi_release[8];
 923	uint16_t	udi_productNo;
 924	uint16_t	udi_vendorNo;
 925	uint16_t	udi_releaseNo;
 926	uint8_t		udi_class;
 927	uint8_t		udi_subclass;
 928	uint8_t		udi_protocol;
 929	uint8_t		udi_config;
 930	uint8_t		udi_speed;
 931	int		udi_power;      /* power consumption in mA, 0 if selfpowered */
 932	int		udi_nports;
 933	char		udi_devnames[USB_MAX_DEVNAMES][USB_MAX_DEVNAMELEN];
 934	uint8_t		udi_ports[16];/* hub only: addresses of devices on ports */
 935};
 936
 937struct usb_ctl_report {
 938	int		ucr_report;
 939	unsigned char	ucr_data[1024];	/* filled data size will vary */
 940};
 941
 942struct usb_device_stats {
 943	unsigned long	uds_requests[4];	/* indexed by transfer type UE_* */
 944};
 945
 946struct usb_bulk_ra_wb_opt {
 947	unsigned	ra_wb_buffer_size;
 948	unsigned	ra_wb_request_size;
 949};
 950
 951/* Events that can be read from /dev/usb */
 952struct usb_event {
 953	int			ue_type;
 954#define USB_EVENT_CTRLR_ATTACH 1
 955#define USB_EVENT_CTRLR_DETACH 2
 956#define USB_EVENT_DEVICE_ATTACH 3
 957#define USB_EVENT_DEVICE_DETACH 4
 958#define USB_EVENT_DRIVER_ATTACH 5
 959#define USB_EVENT_DRIVER_DETACH 6
 960#define USB_EVENT_IS_ATTACH(n) ((n) == USB_EVENT_CTRLR_ATTACH || (n) == USB_EVENT_DEVICE_ATTACH || (n) == USB_EVENT_DRIVER_ATTACH)
 961#define USB_EVENT_IS_DETACH(n) ((n) == USB_EVENT_CTRLR_DETACH || (n) == USB_EVENT_DEVICE_DETACH || (n) == USB_EVENT_DRIVER_DETACH)
 962	struct timespec		ue_time;
 963	union {
 964		struct {
 965			int			ue_bus;
 966		} ue_ctrlr;
 967		struct usb_device_info		ue_device;
 968		struct {
 969			usb_event_cookie_t	ue_cookie;
 970			char			ue_devname[16];
 971		} ue_driver;
 972	} u;
 973};
 974
 975/* old <=3.0 compat event */
 976struct usb_event_old {
 977	int                     ue_type;
 978	struct timespec         ue_time;
 979	union {
 980		struct {
 981			int                     ue_bus;
 982		} ue_ctrlr;
 983		struct usb_device_info_old          ue_device;
 984		struct {
 985			usb_event_cookie_t      ue_cookie;
 986			char                    ue_devname[16];
 987		} ue_driver;
 988	} u;
 989};
 990
 991
 992/* USB controller */
 993#define USB_REQUEST		_IOWR('U', 1, struct usb_ctl_request)
 994#define USB_SETDEBUG		_IOW ('U', 2, int)
 995#define USB_DISCOVER		_IO  ('U', 3)
 996#define USB_DEVICEINFO		_IOWR('U', 4, struct usb_device_info)
 997#define USB_DEVICEINFO_OLD	_IOWR('U', 4, struct usb_device_info_old)
 998#define USB_DEVICESTATS		_IOR ('U', 5, struct usb_device_stats)
 999
1000/* Generic HID device */
1001#define USB_GET_REPORT_DESC	_IOR ('U', 21, struct usb_ctl_report_desc)
1002#define USB_SET_IMMED		_IOW ('U', 22, int)
1003#define USB_GET_REPORT		_IOWR('U', 23, struct usb_ctl_report)
1004#define USB_SET_REPORT		_IOW ('U', 24, struct usb_ctl_report)
1005#define USB_GET_REPORT_ID	_IOR ('U', 25, int)
1006
1007/* Generic USB device */
1008#define USB_GET_CONFIG		_IOR ('U', 100, int)
1009#define USB_SET_CONFIG		_IOW ('U', 101, int)
1010#define USB_GET_ALTINTERFACE	_IOWR('U', 102, struct usb_alt_interface)
1011#define USB_SET_ALTINTERFACE	_IOWR('U', 103, struct usb_alt_interface)
1012#define USB_GET_NO_ALT		_IOWR('U', 104, struct usb_alt_interface)
1013#define USB_GET_DEVICE_DESC	_IOR ('U', 105, usb_device_descriptor_t)
1014#define USB_GET_CONFIG_DESC	_IOWR('U', 106, struct usb_config_desc)
1015#define USB_GET_INTERFACE_DESC	_IOWR('U', 107, struct usb_interface_desc)
1016#define USB_GET_ENDPOINT_DESC	_IOWR('U', 108, struct usb_endpoint_desc)
1017#define USB_GET_FULL_DESC	_IOWR('U', 109, struct usb_full_desc)
1018#define USB_GET_STRING_DESC	_IOWR('U', 110, struct usb_string_desc)
1019#define USB_DO_REQUEST		_IOWR('U', 111, struct usb_ctl_request)
1020#define USB_GET_DEVICEINFO	_IOR ('U', 112, struct usb_device_info)
1021#define USB_GET_DEVICEINFO_OLD	_IOR ('U', 112, struct usb_device_info_old)
1022#define USB_SET_SHORT_XFER	_IOW ('U', 113, int)
1023#define USB_SET_TIMEOUT		_IOW ('U', 114, int)
1024#define USB_SET_BULK_RA		_IOW ('U', 115, int)
1025#define USB_SET_BULK_WB		_IOW ('U', 116, int)
1026#define USB_SET_BULK_RA_OPT	_IOW ('U', 117, struct usb_bulk_ra_wb_opt)
1027#define USB_SET_BULK_WB_OPT	_IOW ('U', 118, struct usb_bulk_ra_wb_opt)
1028
1029/* Modem device */
1030#define USB_GET_CM_OVER_DATA	_IOR ('U', 130, int)
1031#define USB_SET_CM_OVER_DATA	_IOW ('U', 131, int)
1032
1033#endif /* _USB_H_ */