1e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*
2e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * This file holds USB constants and structures that are needed for
3e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * USB device APIs.  These are used by the USB device model, which is
4e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * defined in chapter 9 of the USB 2.0 specification and in the
5e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * Wireless USB 1.0 (spread around).  Linux has several APIs in C that
6e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * need these:
7e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
8e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * - the master/host side Linux-USB kernel driver API;
9e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * - the "usbfs" user space API; and
10e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * - the Linux "gadget" slave/device/peripheral side driver API.
11e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
12e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * USB 2.0 adds an additional "On The Go" (OTG) mode, which lets systems
13e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * act either as a USB master/host or as a USB slave/device.  That means
14e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * the master and slave side APIs benefit from working well together.
15e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
16e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * There's also "Wireless USB", using low power short range radios for
17e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * peripheral interconnection but otherwise building on the USB framework.
18e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
19e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * Note all descriptors are declared '__attribute__((packed))' so that:
20e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
21e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * [a] they never get padded, either internally (USB spec writers
22e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *     probably handled that) or externally;
23e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
24e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * [b] so that accessing bigger-than-a-bytes fields will never
25e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *     generate bus errors on any platform, even when the location of
26e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *     its descriptor inside a bundle isn't "naturally aligned", and
27e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
28e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * [c] for consistency, removing all doubt even when it appears to
29e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *     someone that the two other points are non-issues for that
30e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *     particular descriptor type.
31e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
32e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
33e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#ifndef __LINUX_USB_CH9_H
34e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define __LINUX_USB_CH9_H
35e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
36e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#include <linux/types.h>	/* __u8 etc */
37e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#include <asm/byteorder.h>	/* le16_to_cpu */
38e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
39e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*-------------------------------------------------------------------------*/
40e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
41e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* CONTROL REQUEST SUPPORT */
42e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
43e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*
44e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * USB directions
45e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
46e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * This bit flag is used in endpoint descriptors' bEndpointAddress field.
47e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * It's also one of three fields in control requests bRequestType.
48e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
49e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DIR_OUT			0		/* to device */
50e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DIR_IN			0x80		/* to host */
51e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
52e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*
53e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * USB types, the second of three bRequestType fields
54e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
55e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_TYPE_MASK			(0x03 << 5)
56e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_TYPE_STANDARD		(0x00 << 5)
57e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_TYPE_CLASS			(0x01 << 5)
58e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_TYPE_VENDOR			(0x02 << 5)
59e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_TYPE_RESERVED		(0x03 << 5)
60e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
61e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*
62e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * USB recipients, the third of three bRequestType fields
63e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
64e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_RECIP_MASK			0x1f
65e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_RECIP_DEVICE		0x00
66e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_RECIP_INTERFACE		0x01
67e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_RECIP_ENDPOINT		0x02
68e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_RECIP_OTHER			0x03
69e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* From Wireless USB 1.0 */
70e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_RECIP_PORT			0x04
71e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_RECIP_RPIPE		0x05
72e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
73e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*
74e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * Standard requests, for the bRequest field of a SETUP packet.
75e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
76e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * These are qualified by the bRequestType field, so that for example
77e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * TYPE_CLASS or TYPE_VENDOR specific feature flags could be retrieved
78e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * by a GET_STATUS request.
79e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
80e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_REQ_GET_STATUS		0x00
81e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_REQ_CLEAR_FEATURE		0x01
82e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_REQ_SET_FEATURE		0x03
83e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_REQ_SET_ADDRESS		0x05
84e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_REQ_GET_DESCRIPTOR		0x06
85e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_REQ_SET_DESCRIPTOR		0x07
86e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_REQ_GET_CONFIGURATION	0x08
87e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_REQ_SET_CONFIGURATION	0x09
88e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_REQ_GET_INTERFACE		0x0A
89e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_REQ_SET_INTERFACE		0x0B
90e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_REQ_SYNCH_FRAME		0x0C
91e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_REQ_SET_SEL			0x30
92e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
93e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_REQ_SET_ENCRYPTION		0x0D	/* Wireless USB */
94e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_REQ_GET_ENCRYPTION		0x0E
95e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_REQ_RPIPE_ABORT		0x0E
96e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_REQ_SET_HANDSHAKE		0x0F
97e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_REQ_RPIPE_RESET		0x0F
98e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_REQ_GET_HANDSHAKE		0x10
99e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_REQ_SET_CONNECTION		0x11
100e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_REQ_SET_SECURITY_DATA	0x12
101e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_REQ_GET_SECURITY_DATA	0x13
102e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_REQ_SET_WUSB_DATA		0x14
103e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_REQ_LOOPBACK_DATA_WRITE	0x15
104e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_REQ_LOOPBACK_DATA_READ	0x16
105e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_REQ_SET_INTERFACE_DS	0x17
106e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
107e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* The Link Power Management (LPM) ECN defines USB_REQ_TEST_AND_SET command,
108e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * used by hubs to put ports into a new L1 suspend state, except that it
109e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * forgot to define its number ...
110e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
111e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
112e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*
113e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * USB feature flags are written using USB_REQ_{CLEAR,SET}_FEATURE, and
114e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * are read as a bit array returned by USB_REQ_GET_STATUS.  (So there
115e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * are at most sixteen features of each type.)  Hubs may also support a
116e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * new USB_REQ_TEST_AND_SET_FEATURE to put ports into L1 suspend.
117e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
118e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DEVICE_SELF_POWERED		0	/* (read only) */
119e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DEVICE_REMOTE_WAKEUP	1	/* dev may initiate wakeup */
120e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DEVICE_TEST_MODE		2	/* (wired high speed only) */
121e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DEVICE_BATTERY		2	/* (wireless) */
122e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DEVICE_B_HNP_ENABLE		3	/* (otg) dev may initiate HNP */
123e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DEVICE_WUSB_DEVICE		3	/* (wireless)*/
124e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DEVICE_A_HNP_SUPPORT	4	/* (otg) RH port supports HNP */
125e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DEVICE_A_ALT_HNP_SUPPORT	5	/* (otg) other RH port does */
126e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DEVICE_DEBUG_MODE		6	/* (special devices only) */
127e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
128e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*
129e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * Test Mode Selectors
130e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * See USB 2.0 spec Table 9-7
131e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
132e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define	TEST_J		1
133e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define	TEST_K		2
134e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define	TEST_SE0_NAK	3
135e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define	TEST_PACKET	4
136e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define	TEST_FORCE_EN	5
137e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
138e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*
139e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * New Feature Selectors as added by USB 3.0
140e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * See USB 3.0 spec Table 9-6
141e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
142e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DEVICE_U1_ENABLE	48	/* dev may initiate U1 transition */
143e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DEVICE_U2_ENABLE	49	/* dev may initiate U2 transition */
144e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DEVICE_LTM_ENABLE	50	/* dev may send LTM */
145e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_INTRF_FUNC_SUSPEND	0	/* function suspend */
146e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
147e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_INTR_FUNC_SUSPEND_OPT_MASK	0xFF00
148e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*
149e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * Suspend Options, Table 9-7 USB 3.0 spec
150e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
151e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_INTRF_FUNC_SUSPEND_LP	(1 << (8 + 0))
152e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_INTRF_FUNC_SUSPEND_RW	(1 << (8 + 1))
153e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
154e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_ENDPOINT_HALT		0	/* IN/OUT will STALL */
155e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
156e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* Bit array elements as returned by the USB_REQ_GET_STATUS request. */
157e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DEV_STAT_U1_ENABLED		2	/* transition into U1 state */
158e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DEV_STAT_U2_ENABLED		3	/* transition into U2 state */
159e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DEV_STAT_LTM_ENABLED	4	/* Latency tolerance messages */
160e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
161e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/**
162e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * struct usb_ctrlrequest - SETUP data for a USB device control request
163e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * @bRequestType: matches the USB bmRequestType field
164e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * @bRequest: matches the USB bRequest field
165e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * @wValue: matches the USB wValue field (le16 byte order)
166e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * @wIndex: matches the USB wIndex field (le16 byte order)
167e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * @wLength: matches the USB wLength field (le16 byte order)
168e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
169e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * This structure is used to send control requests to a USB device.  It matches
170e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * the different fields of the USB 2.0 Spec section 9.3, table 9-2.  See the
171e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * USB spec for a fuller description of the different fields, and what they are
172e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * used for.
173e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
174e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * Note that the driver for any interface can issue control requests.
175e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * For most devices, interfaces don't coordinate with each other, so
176e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * such requests may be made at any time.
177e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
178e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystruct usb_ctrlrequest {
179e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8 bRequestType;
180e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8 bRequest;
181e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__le16 wValue;
182e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__le16 wIndex;
183e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__le16 wLength;
184e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby} __attribute__ ((packed));
185e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
186e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*-------------------------------------------------------------------------*/
187e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
188e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*
189e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * STANDARD DESCRIPTORS ... as returned by GET_DESCRIPTOR, or
190e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * (rarely) accepted by SET_DESCRIPTOR.
191e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
192e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * Note that all multi-byte values here are encoded in little endian
193e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * byte order "on the wire".  Within the kernel and when exposed
194e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * through the Linux-USB APIs, they are not converted to cpu byte
195e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * order; it is the responsibility of the client code to do this.
196e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * The single exception is when device and configuration descriptors (but
197e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * not other descriptors) are read from usbfs (i.e. /proc/bus/usb/BBB/DDD);
198e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * in this case the fields are converted to host endianness by the kernel.
199e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
200e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
201e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*
202e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * Descriptor types ... USB 2.0 spec table 9.5
203e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
204e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_DEVICE			0x01
205e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_CONFIG			0x02
206e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_STRING			0x03
207e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_INTERFACE		0x04
208e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_ENDPOINT			0x05
209e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_DEVICE_QUALIFIER		0x06
210e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_OTHER_SPEED_CONFIG	0x07
211e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_INTERFACE_POWER		0x08
212e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* these are from a minor usb 2.0 revision (ECN) */
213e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_OTG			0x09
214e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_DEBUG			0x0a
215e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_INTERFACE_ASSOCIATION	0x0b
216e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* these are from the Wireless USB spec */
217e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_SECURITY			0x0c
218e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_KEY			0x0d
219e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_ENCRYPTION_TYPE		0x0e
220e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_BOS			0x0f
221e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_DEVICE_CAPABILITY	0x10
222e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_WIRELESS_ENDPOINT_COMP	0x11
223e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_WIRE_ADAPTER		0x21
224e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_RPIPE			0x22
225e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_CS_RADIO_CONTROL		0x23
226e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* From the T10 UAS specification */
227e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_PIPE_USAGE		0x24
228e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* From the USB 3.0 spec */
229e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define	USB_DT_SS_ENDPOINT_COMP		0x30
230e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
231e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* Conventional codes for class-specific descriptors.  The convention is
232e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * defined in the USB "Common Class" Spec (3.11).  Individual class specs
233e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * are authoritative for their usage, not the "common class" writeup.
234e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
235e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_CS_DEVICE		(USB_TYPE_CLASS | USB_DT_DEVICE)
236e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_CS_CONFIG		(USB_TYPE_CLASS | USB_DT_CONFIG)
237e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_CS_STRING		(USB_TYPE_CLASS | USB_DT_STRING)
238e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_CS_INTERFACE		(USB_TYPE_CLASS | USB_DT_INTERFACE)
239e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_CS_ENDPOINT		(USB_TYPE_CLASS | USB_DT_ENDPOINT)
240e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
241e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* All standard descriptors have these 2 fields at the beginning */
242e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystruct usb_descriptor_header {
243e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bLength;
244e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDescriptorType;
245e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby} __attribute__ ((packed));
246e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
247e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
248e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*-------------------------------------------------------------------------*/
249e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
250e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* USB_DT_DEVICE: Device descriptor */
251e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystruct usb_device_descriptor {
252e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bLength;
253e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDescriptorType;
254e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
255e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__le16 bcdUSB;
256e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDeviceClass;
257e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDeviceSubClass;
258e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDeviceProtocol;
259e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bMaxPacketSize0;
260e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__le16 idVendor;
261e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__le16 idProduct;
262e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__le16 bcdDevice;
263e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  iManufacturer;
264e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  iProduct;
265e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  iSerialNumber;
266e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bNumConfigurations;
267e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby} __attribute__ ((packed));
268e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
269e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_DEVICE_SIZE		18
270e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
271e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
272e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*
273e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * Device and/or Interface Class codes
274e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * as found in bDeviceClass or bInterfaceClass
275e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * and defined by www.usb.org documents
276e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
277e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_CLASS_PER_INTERFACE		0	/* for DeviceClass */
278e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_CLASS_AUDIO			1
279e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_CLASS_COMM			2
280e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_CLASS_HID			3
281e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_CLASS_PHYSICAL		5
282e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_CLASS_STILL_IMAGE		6
283e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_CLASS_PRINTER		7
284e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_CLASS_MASS_STORAGE		8
285e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_CLASS_HUB			9
286e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_CLASS_CDC_DATA		0x0a
287e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_CLASS_CSCID			0x0b	/* chip+ smart card */
288e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_CLASS_CONTENT_SEC		0x0d	/* content security */
289e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_CLASS_VIDEO			0x0e
290e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_CLASS_WIRELESS_CONTROLLER	0xe0
291e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_CLASS_MISC			0xef
292e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_CLASS_APP_SPEC		0xfe
293e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_CLASS_VENDOR_SPEC		0xff
294e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
295e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_SUBCLASS_VENDOR_SPEC	0xff
296e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
297e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*-------------------------------------------------------------------------*/
298e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
299e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* USB_DT_CONFIG: Configuration descriptor information.
300e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
301e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * USB_DT_OTHER_SPEED_CONFIG is the same descriptor, except that the
302e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * descriptor type is different.  Highspeed-capable devices can look
303e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * different depending on what speed they're currently running.  Only
304e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * devices with a USB_DT_DEVICE_QUALIFIER have any OTHER_SPEED_CONFIG
305e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * descriptors.
306e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
307e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystruct usb_config_descriptor {
308e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bLength;
309e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDescriptorType;
310e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
311e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__le16 wTotalLength;
312e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bNumInterfaces;
313e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bConfigurationValue;
314e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  iConfiguration;
315e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bmAttributes;
316e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bMaxPower;
317e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby} __attribute__ ((packed));
318e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
319e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_CONFIG_SIZE		9
320e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
321e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* from config descriptor bmAttributes */
322e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_CONFIG_ATT_ONE		(1 << 7)	/* must be set */
323e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_CONFIG_ATT_SELFPOWER	(1 << 6)	/* self powered */
324e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_CONFIG_ATT_WAKEUP		(1 << 5)	/* can wakeup */
325e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_CONFIG_ATT_BATTERY		(1 << 4)	/* battery powered */
326e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
327e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*-------------------------------------------------------------------------*/
328e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
329e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* USB_DT_STRING: String descriptor */
330e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystruct usb_string_descriptor {
331e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bLength;
332e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDescriptorType;
333e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
334e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__le16 wData[1];		/* UTF-16LE encoded */
335e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby} __attribute__ ((packed));
336e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
337e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* note that "string" zero is special, it holds language codes that
338e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * the device supports, not Unicode characters.
339e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
340e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
341e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*-------------------------------------------------------------------------*/
342e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
343e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* USB_DT_INTERFACE: Interface descriptor */
344e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystruct usb_interface_descriptor {
345e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bLength;
346e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDescriptorType;
347e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
348e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bInterfaceNumber;
349e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bAlternateSetting;
350e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bNumEndpoints;
351e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bInterfaceClass;
352e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bInterfaceSubClass;
353e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bInterfaceProtocol;
354e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  iInterface;
355e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby} __attribute__ ((packed));
356e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
357e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_INTERFACE_SIZE		9
358e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
359e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*-------------------------------------------------------------------------*/
360e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
361e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* USB_DT_ENDPOINT: Endpoint descriptor */
362e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystruct usb_endpoint_descriptor {
363e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bLength;
364e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDescriptorType;
365e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
366e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bEndpointAddress;
367e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bmAttributes;
368e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__le16 wMaxPacketSize;
369e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bInterval;
370e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
371e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	/* NOTE:  these two are _only_ in audio endpoints. */
372e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	/* use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. */
373e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bRefresh;
374e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bSynchAddress;
375e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby} __attribute__ ((packed));
376e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
377e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_ENDPOINT_SIZE		7
378e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_ENDPOINT_AUDIO_SIZE	9	/* Audio extension */
379e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
380e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
381e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*
382e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * Endpoints
383e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
384e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_ENDPOINT_NUMBER_MASK	0x0f	/* in bEndpointAddress */
385e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_ENDPOINT_DIR_MASK		0x80
386e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
387e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_ENDPOINT_XFERTYPE_MASK	0x03	/* in bmAttributes */
388e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_ENDPOINT_XFER_CONTROL	0
389e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_ENDPOINT_XFER_ISOC		1
390e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_ENDPOINT_XFER_BULK		2
391e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_ENDPOINT_XFER_INT		3
392e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_ENDPOINT_MAX_ADJUSTABLE	0x80
393e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
394e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_ENDPOINT_SYNCTYPE		0x0c
395e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_ENDPOINT_SYNC_NONE		(0 << 2)
396e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_ENDPOINT_SYNC_ASYNC		(1 << 2)
397e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_ENDPOINT_SYNC_ADAPTIVE	(2 << 2)
398e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_ENDPOINT_SYNC_SYNC		(3 << 2)
399e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
400e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_ENDPOINT_USAGE_MASK		0x30
401e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_ENDPOINT_USAGE_DATA		0x00
402e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_ENDPOINT_USAGE_FEEDBACK	0x10
403e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_ENDPOINT_USAGE_IMPLICIT_FB	0x20	/* Implicit feedback Data endpoint */
404e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
405e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*-------------------------------------------------------------------------*/
406e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
407e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/**
408e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * usb_endpoint_num - get the endpoint's number
409e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * @epd: endpoint to be checked
410e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
411e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * Returns @epd's number: 0 to 15.
412e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
413e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystatic inline int usb_endpoint_num(const struct usb_endpoint_descriptor *epd)
414e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby{
415e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	return epd->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
416e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby}
417e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
418e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/**
419e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * usb_endpoint_type - get the endpoint's transfer type
420e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * @epd: endpoint to be checked
421e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
422e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * Returns one of USB_ENDPOINT_XFER_{CONTROL, ISOC, BULK, INT} according
423e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * to @epd's transfer type.
424e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
425e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystatic inline int usb_endpoint_type(const struct usb_endpoint_descriptor *epd)
426e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby{
427e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	return epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK;
428e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby}
429e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
430e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/**
431e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * usb_endpoint_dir_in - check if the endpoint has IN direction
432e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * @epd: endpoint to be checked
433e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
434e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * Returns true if the endpoint is of type IN, otherwise it returns false.
435e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
436e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystatic inline int usb_endpoint_dir_in(const struct usb_endpoint_descriptor *epd)
437e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby{
438e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN);
439e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby}
440e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
441e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/**
442e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * usb_endpoint_dir_out - check if the endpoint has OUT direction
443e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * @epd: endpoint to be checked
444e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
445e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * Returns true if the endpoint is of type OUT, otherwise it returns false.
446e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
447e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystatic inline int usb_endpoint_dir_out(
448e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby				const struct usb_endpoint_descriptor *epd)
449e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby{
450e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT);
451e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby}
452e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
453e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/**
454e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * usb_endpoint_xfer_bulk - check if the endpoint has bulk transfer type
455e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * @epd: endpoint to be checked
456e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
457e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * Returns true if the endpoint is of type bulk, otherwise it returns false.
458e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
459e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystatic inline int usb_endpoint_xfer_bulk(
460e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby				const struct usb_endpoint_descriptor *epd)
461e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby{
462e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
463e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby		USB_ENDPOINT_XFER_BULK);
464e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby}
465e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
466e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/**
467e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * usb_endpoint_xfer_control - check if the endpoint has control transfer type
468e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * @epd: endpoint to be checked
469e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
470e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * Returns true if the endpoint is of type control, otherwise it returns false.
471e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
472e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystatic inline int usb_endpoint_xfer_control(
473e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby				const struct usb_endpoint_descriptor *epd)
474e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby{
475e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
476e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby		USB_ENDPOINT_XFER_CONTROL);
477e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby}
478e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
479e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/**
480e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * usb_endpoint_xfer_int - check if the endpoint has interrupt transfer type
481e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * @epd: endpoint to be checked
482e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
483e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * Returns true if the endpoint is of type interrupt, otherwise it returns
484e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * false.
485e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
486e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystatic inline int usb_endpoint_xfer_int(
487e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby				const struct usb_endpoint_descriptor *epd)
488e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby{
489e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
490e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby		USB_ENDPOINT_XFER_INT);
491e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby}
492e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
493e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/**
494e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * usb_endpoint_xfer_isoc - check if the endpoint has isochronous transfer type
495e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * @epd: endpoint to be checked
496e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
497e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * Returns true if the endpoint is of type isochronous, otherwise it returns
498e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * false.
499e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
500e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystatic inline int usb_endpoint_xfer_isoc(
501e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby				const struct usb_endpoint_descriptor *epd)
502e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby{
503e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
504e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby		USB_ENDPOINT_XFER_ISOC);
505e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby}
506e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
507e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/**
508e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * usb_endpoint_is_bulk_in - check if the endpoint is bulk IN
509e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * @epd: endpoint to be checked
510e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
511e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * Returns true if the endpoint has bulk transfer type and IN direction,
512e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * otherwise it returns false.
513e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
514e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystatic inline int usb_endpoint_is_bulk_in(
515e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby				const struct usb_endpoint_descriptor *epd)
516e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby{
517e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	return usb_endpoint_xfer_bulk(epd) && usb_endpoint_dir_in(epd);
518e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby}
519e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
520e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/**
521e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * usb_endpoint_is_bulk_out - check if the endpoint is bulk OUT
522e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * @epd: endpoint to be checked
523e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
524e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * Returns true if the endpoint has bulk transfer type and OUT direction,
525e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * otherwise it returns false.
526e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
527e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystatic inline int usb_endpoint_is_bulk_out(
528e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby				const struct usb_endpoint_descriptor *epd)
529e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby{
530e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	return usb_endpoint_xfer_bulk(epd) && usb_endpoint_dir_out(epd);
531e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby}
532e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
533e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/**
534e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * usb_endpoint_is_int_in - check if the endpoint is interrupt IN
535e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * @epd: endpoint to be checked
536e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
537e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * Returns true if the endpoint has interrupt transfer type and IN direction,
538e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * otherwise it returns false.
539e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
540e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystatic inline int usb_endpoint_is_int_in(
541e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby				const struct usb_endpoint_descriptor *epd)
542e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby{
543e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	return usb_endpoint_xfer_int(epd) && usb_endpoint_dir_in(epd);
544e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby}
545e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
546e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/**
547e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * usb_endpoint_is_int_out - check if the endpoint is interrupt OUT
548e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * @epd: endpoint to be checked
549e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
550e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * Returns true if the endpoint has interrupt transfer type and OUT direction,
551e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * otherwise it returns false.
552e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
553e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystatic inline int usb_endpoint_is_int_out(
554e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby				const struct usb_endpoint_descriptor *epd)
555e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby{
556e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	return usb_endpoint_xfer_int(epd) && usb_endpoint_dir_out(epd);
557e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby}
558e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
559e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/**
560e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * usb_endpoint_is_isoc_in - check if the endpoint is isochronous IN
561e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * @epd: endpoint to be checked
562e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
563e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * Returns true if the endpoint has isochronous transfer type and IN direction,
564e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * otherwise it returns false.
565e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
566e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystatic inline int usb_endpoint_is_isoc_in(
567e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby				const struct usb_endpoint_descriptor *epd)
568e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby{
569e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	return usb_endpoint_xfer_isoc(epd) && usb_endpoint_dir_in(epd);
570e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby}
571e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
572e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/**
573e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * usb_endpoint_is_isoc_out - check if the endpoint is isochronous OUT
574e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * @epd: endpoint to be checked
575e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
576e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * Returns true if the endpoint has isochronous transfer type and OUT direction,
577e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * otherwise it returns false.
578e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
579e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystatic inline int usb_endpoint_is_isoc_out(
580e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby				const struct usb_endpoint_descriptor *epd)
581e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby{
582e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	return usb_endpoint_xfer_isoc(epd) && usb_endpoint_dir_out(epd);
583e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby}
584e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
585e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/**
586e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * usb_endpoint_maxp - get endpoint's max packet size
587e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * @epd: endpoint to be checked
588e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *
589e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * Returns @epd's max packet
590e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
591e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystatic inline int usb_endpoint_maxp(const struct usb_endpoint_descriptor *epd)
592e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby{
593e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	return __le16_to_cpu(epd->wMaxPacketSize);
594e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby}
595e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
596e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*-------------------------------------------------------------------------*/
597e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
598e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* USB_DT_SS_ENDPOINT_COMP: SuperSpeed Endpoint Companion descriptor */
599e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystruct usb_ss_ep_comp_descriptor {
600e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bLength;
601e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDescriptorType;
602e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
603e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bMaxBurst;
604e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bmAttributes;
605e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__le16 wBytesPerInterval;
606e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby} __attribute__ ((packed));
607e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
608e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_SS_EP_COMP_SIZE		6
609e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
610e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* Bits 4:0 of bmAttributes if this is a bulk endpoint */
611e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystatic inline int
612e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobyusb_ss_max_streams(const struct usb_ss_ep_comp_descriptor *comp)
613e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby{
614e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	int		max_streams;
615e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
616e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	if (!comp)
617e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby		return 0;
618e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
619e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	max_streams = comp->bmAttributes & 0x1f;
620e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
621e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	if (!max_streams)
622e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby		return 0;
623e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
624e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	max_streams = 1 << max_streams;
625e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
626e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	return max_streams;
627e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby}
628e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
629e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* Bits 1:0 of bmAttributes if this is an isoc endpoint */
630e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_SS_MULT(p)			(1 + ((p) & 0x3))
631e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
632e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*-------------------------------------------------------------------------*/
633e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
634e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* USB_DT_DEVICE_QUALIFIER: Device Qualifier descriptor */
635e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystruct usb_qualifier_descriptor {
636e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bLength;
637e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDescriptorType;
638e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
639e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__le16 bcdUSB;
640e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDeviceClass;
641e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDeviceSubClass;
642e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDeviceProtocol;
643e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bMaxPacketSize0;
644e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bNumConfigurations;
645e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bRESERVED;
646e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby} __attribute__ ((packed));
647e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
648e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
649e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*-------------------------------------------------------------------------*/
650e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
651e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* USB_DT_OTG (from OTG 1.0a supplement) */
652e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystruct usb_otg_descriptor {
653e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bLength;
654e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDescriptorType;
655e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
656e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bmAttributes;	/* support for HNP, SRP, etc */
657e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby} __attribute__ ((packed));
658e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
659e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* from usb_otg_descriptor.bmAttributes */
660e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_OTG_SRP		(1 << 0)
661e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_OTG_HNP		(1 << 1)	/* swap host/device roles */
662e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
663e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*-------------------------------------------------------------------------*/
664e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
665e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* USB_DT_DEBUG:  for special highspeed devices, replacing serial console */
666e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystruct usb_debug_descriptor {
667e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bLength;
668e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDescriptorType;
669e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
670e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	/* bulk endpoints with 8 byte maxpacket */
671e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDebugInEndpoint;
672e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDebugOutEndpoint;
673e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby} __attribute__((packed));
674e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
675e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*-------------------------------------------------------------------------*/
676e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
677e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* USB_DT_INTERFACE_ASSOCIATION: groups interfaces */
678e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystruct usb_interface_assoc_descriptor {
679e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bLength;
680e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDescriptorType;
681e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
682e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bFirstInterface;
683e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bInterfaceCount;
684e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bFunctionClass;
685e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bFunctionSubClass;
686e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bFunctionProtocol;
687e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  iFunction;
688e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby} __attribute__ ((packed));
689e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
690e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
691e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*-------------------------------------------------------------------------*/
692e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
693e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* USB_DT_SECURITY:  group of wireless security descriptors, including
694e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * encryption types available for setting up a CC/association.
695e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
696e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystruct usb_security_descriptor {
697e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bLength;
698e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDescriptorType;
699e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
700e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__le16 wTotalLength;
701e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bNumEncryptionTypes;
702e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby} __attribute__((packed));
703e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
704e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*-------------------------------------------------------------------------*/
705e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
706e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* USB_DT_KEY:  used with {GET,SET}_SECURITY_DATA; only public keys
707e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * may be retrieved.
708e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
709e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystruct usb_key_descriptor {
710e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bLength;
711e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDescriptorType;
712e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
713e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  tTKID[3];
714e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bReserved;
715e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bKeyData[0];
716e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby} __attribute__((packed));
717e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
718e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*-------------------------------------------------------------------------*/
719e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
720e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* USB_DT_ENCRYPTION_TYPE:  bundled in DT_SECURITY groups */
721e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystruct usb_encryption_descriptor {
722e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bLength;
723e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDescriptorType;
724e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
725e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bEncryptionType;
726e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define	USB_ENC_TYPE_UNSECURE		0
727e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define	USB_ENC_TYPE_WIRED		1	/* non-wireless mode */
728e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define	USB_ENC_TYPE_CCM_1		2	/* aes128/cbc session */
729e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define	USB_ENC_TYPE_RSA_1		3	/* rsa3072/sha1 auth */
730e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bEncryptionValue;		/* use in SET_ENCRYPTION */
731e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bAuthKeyIndex;
732e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby} __attribute__((packed));
733e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
734e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
735e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*-------------------------------------------------------------------------*/
736e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
737e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* USB_DT_BOS:  group of device-level capabilities */
738e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystruct usb_bos_descriptor {
739e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bLength;
740e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDescriptorType;
741e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
742e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__le16 wTotalLength;
743e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bNumDeviceCaps;
744e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby} __attribute__((packed));
745e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
746e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_BOS_SIZE		5
747e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*-------------------------------------------------------------------------*/
748e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
749e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* USB_DT_DEVICE_CAPABILITY:  grouped with BOS */
750e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystruct usb_dev_cap_header {
751e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bLength;
752e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDescriptorType;
753e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDevCapabilityType;
754e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby} __attribute__((packed));
755e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
756e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define	USB_CAP_TYPE_WIRELESS_USB	1
757e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
758e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystruct usb_wireless_cap_descriptor {	/* Ultra Wide Band */
759e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bLength;
760e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDescriptorType;
761e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDevCapabilityType;
762e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
763e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bmAttributes;
764e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define	USB_WIRELESS_P2P_DRD		(1 << 1)
765e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define	USB_WIRELESS_BEACON_MASK	(3 << 2)
766e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define	USB_WIRELESS_BEACON_SELF	(1 << 2)
767e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define	USB_WIRELESS_BEACON_DIRECTED	(2 << 2)
768e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define	USB_WIRELESS_BEACON_NONE	(3 << 2)
769e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__le16 wPHYRates;	/* bit rates, Mbps */
770e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define	USB_WIRELESS_PHY_53		(1 << 0)	/* always set */
771e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define	USB_WIRELESS_PHY_80		(1 << 1)
772e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define	USB_WIRELESS_PHY_107		(1 << 2)	/* always set */
773e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define	USB_WIRELESS_PHY_160		(1 << 3)
774e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define	USB_WIRELESS_PHY_200		(1 << 4)	/* always set */
775e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define	USB_WIRELESS_PHY_320		(1 << 5)
776e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define	USB_WIRELESS_PHY_400		(1 << 6)
777e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define	USB_WIRELESS_PHY_480		(1 << 7)
778e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bmTFITXPowerInfo;	/* TFI power levels */
779e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bmFFITXPowerInfo;	/* FFI power levels */
780e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__le16 bmBandGroup;
781e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bReserved;
782e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby} __attribute__((packed));
783e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
784e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* USB 2.0 Extension descriptor */
785e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define	USB_CAP_TYPE_EXT		2
786e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
787e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystruct usb_ext_cap_descriptor {		/* Link Power Management */
788e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bLength;
789e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDescriptorType;
790e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDevCapabilityType;
791e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__le32 bmAttributes;
792e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_LPM_SUPPORT			(1 << 1)	/* supports LPM */
793e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby} __attribute__((packed));
794e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
795e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_USB_EXT_CAP_SIZE	7
796e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
797e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*
798e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * SuperSpeed USB Capability descriptor: Defines the set of SuperSpeed USB
799e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * specific device level capabilities
800e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
801e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define		USB_SS_CAP_TYPE		3
802e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystruct usb_ss_cap_descriptor {		/* Link Power Management */
803e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bLength;
804e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDescriptorType;
805e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDevCapabilityType;
806e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bmAttributes;
807e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_LTM_SUPPORT			(1 << 1) /* supports LTM */
808e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__le16 wSpeedSupported;
809e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_LOW_SPEED_OPERATION		(1)	 /* Low speed operation */
810e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_FULL_SPEED_OPERATION	(1 << 1) /* Full speed operation */
811e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_HIGH_SPEED_OPERATION	(1 << 2) /* High speed operation */
812e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_5GBPS_OPERATION		(1 << 3) /* Operation at 5Gbps */
813e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bFunctionalitySupport;
814e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bU1devExitLat;
815e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__le16 bU2DevExitLat;
816e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby} __attribute__((packed));
817e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
818e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_USB_SS_CAP_SIZE	10
819e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
820e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*
821e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * Container ID Capability descriptor: Defines the instance unique ID used to
822e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * identify the instance across all operating modes
823e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
824e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define	CONTAINER_ID_TYPE	4
825e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystruct usb_ss_container_id_descriptor {
826e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bLength;
827e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDescriptorType;
828e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDevCapabilityType;
829e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bReserved;
830e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  ContainerID[16]; /* 128-bit number */
831e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby} __attribute__((packed));
832e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
833e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_DT_USB_SS_CONTN_ID_SIZE	20
834e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*-------------------------------------------------------------------------*/
835e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
836e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* USB_DT_WIRELESS_ENDPOINT_COMP:  companion descriptor associated with
837e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * each endpoint descriptor for a wireless device
838e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
839e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystruct usb_wireless_ep_comp_descriptor {
840e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bLength;
841e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bDescriptorType;
842e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
843e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bMaxBurst;
844e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bMaxSequence;
845e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__le16 wMaxStreamDelay;
846e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__le16 wOverTheAirPacketSize;
847e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bOverTheAirInterval;
848e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8  bmCompAttributes;
849e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_ENDPOINT_SWITCH_MASK	0x03	/* in bmCompAttributes */
850e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_ENDPOINT_SWITCH_NO		0
851e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_ENDPOINT_SWITCH_SWITCH	1
852e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_ENDPOINT_SWITCH_SCALE	2
853e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby} __attribute__((packed));
854e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
855e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*-------------------------------------------------------------------------*/
856e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
857e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* USB_REQ_SET_HANDSHAKE is a four-way handshake used between a wireless
858e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * host and a device for connection set up, mutual authentication, and
859e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * exchanging short lived session keys.  The handshake depends on a CC.
860e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
861e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystruct usb_handshake {
862e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8 bMessageNumber;
863e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8 bStatus;
864e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8 tTKID[3];
865e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8 bReserved;
866e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8 CDID[16];
867e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8 nonce[16];
868e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8 MIC[8];
869e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby} __attribute__((packed));
870e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
871e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*-------------------------------------------------------------------------*/
872e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
873e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* USB_REQ_SET_CONNECTION modifies or revokes a connection context (CC).
874e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * A CC may also be set up using non-wireless secure channels (including
875e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * wired USB!), and some devices may support CCs with multiple hosts.
876e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
877e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobystruct usb_connection_context {
878e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8 CHID[16];		/* persistent host id */
879e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8 CDID[16];		/* device id (unique w/in host context) */
880e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	__u8 CK[16];		/* connection key */
881e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby} __attribute__((packed));
882e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
883e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*-------------------------------------------------------------------------*/
884e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
885e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/* USB 2.0 defines three speeds, here's how Linux identifies them */
886e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
887e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobyenum usb_device_speed {
888e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	USB_SPEED_UNKNOWN = 0,			/* enumerating */
889e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	USB_SPEED_LOW, USB_SPEED_FULL,		/* usb 1.1 */
890e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	USB_SPEED_HIGH,				/* usb 2.0 */
891e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	USB_SPEED_WIRELESS,			/* wireless (usb 2.5) */
892e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	USB_SPEED_SUPER,			/* usb 3.0 */
893e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby};
894e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
895e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#ifdef __KERNEL__
896e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
897e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/**
898e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * usb_speed_string() - Returns human readable-name of the speed.
899e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * @speed: The speed to return human-readable name for.  If it's not
900e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *   any of the speeds defined in usb_device_speed enum, string for
901e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby *   USB_SPEED_UNKNOWN will be returned.
902e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
903e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobyextern const char *usb_speed_string(enum usb_device_speed speed);
904e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
905e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#endif
906e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
907e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Gobyenum usb_device_state {
908e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	/* NOTATTACHED isn't in the USB spec, and this state acts
909e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	 * the same as ATTACHED ... but it's clearer this way.
910e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	 */
911e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	USB_STATE_NOTATTACHED = 0,
912e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
913e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	/* chapter 9 and authentication (wireless) device states */
914e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	USB_STATE_ATTACHED,
915e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	USB_STATE_POWERED,			/* wired */
916e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	USB_STATE_RECONNECTING,			/* auth */
917e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	USB_STATE_UNAUTHENTICATED,		/* auth */
918e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	USB_STATE_DEFAULT,			/* limited function */
919e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	USB_STATE_ADDRESS,
920e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	USB_STATE_CONFIGURED,			/* most functions */
921e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
922e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	USB_STATE_SUSPENDED
923e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
924e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	/* NOTE:  there are actually four different SUSPENDED
925e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	 * states, returning to POWERED, DEFAULT, ADDRESS, or
926e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	 * CONFIGURED respectively when SOF tokens flow again.
927e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	 * At this level there's no difference between L1 and L2
928e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	 * suspend states.  (L2 being original USB 1.1 suspend.)
929e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby	 */
930e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby};
931e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
932e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*-------------------------------------------------------------------------*/
933e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
934e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby/*
935e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * As per USB compliance update, a device that is actively drawing
936e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * more than 100mA from USB must report itself as bus-powered in
937e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * the GetStatus(DEVICE) call.
938e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby * http://compliance.usb.org/index.asp?UpdateFile=Electrical&Format=Standard#34
939e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby */
940e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#define USB_SELF_POWER_VBUS_MAX_DRAW		100
941e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby
942e8a057dc7d40dfdcf7a03fc9ffc4f09be784f92eBenoit Goby#endif /* __LINUX_USB_CH9_H */
943