1  /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2  /*
3   * This file holds Hub protocol constants and data structures that are
4   * defined in chapter 11 (Hub Specification) of the USB 2.0 specification.
5   *
6   * It is used/shared between the USB core, the HCDs and couple of other USB
7   * drivers.
8   */
9  
10  #ifndef __LINUX_CH11_H
11  #define __LINUX_CH11_H
12  
13  #include <linux/types.h>	/* __u8 etc */
14  
15  /* This is arbitrary.
16   * From USB 2.0 spec Table 11-13, offset 7, a hub can
17   * have up to 255 ports. The most yet reported is 10.
18   * Upcoming hardware might raise that limit.
19   * Because the arrays need to add a bit for hub status data, we
20   * use 31, so plus one evens out to four bytes.
21   */
22  #define USB_MAXCHILDREN		31
23  
24  /* See USB 3.1 spec Table 10-5 */
25  #define USB_SS_MAXPORTS		15
26  
27  /*
28   * Hub request types
29   */
30  
31  #define USB_RT_HUB	(USB_TYPE_CLASS | USB_RECIP_DEVICE)
32  #define USB_RT_PORT	(USB_TYPE_CLASS | USB_RECIP_OTHER)
33  
34  /*
35   * Port status type for GetPortStatus requests added in USB 3.1
36   * See USB 3.1 spec Table 10-12
37   */
38  #define HUB_PORT_STATUS		0
39  #define HUB_PORT_PD_STATUS	1
40  #define HUB_EXT_PORT_STATUS	2
41  
42  /*
43   * Hub class requests
44   * See USB 2.0 spec Table 11-16
45   */
46  #define HUB_CLEAR_TT_BUFFER	8
47  #define HUB_RESET_TT		9
48  #define HUB_GET_TT_STATE	10
49  #define HUB_STOP_TT		11
50  
51  /*
52   * Hub class additional requests defined by USB 3.0 spec
53   * See USB 3.0 spec Table 10-6
54   */
55  #define HUB_SET_DEPTH		12
56  #define HUB_GET_PORT_ERR_COUNT	13
57  
58  /*
59   * Hub Class feature numbers
60   * See USB 2.0 spec Table 11-17
61   */
62  #define C_HUB_LOCAL_POWER	0
63  #define C_HUB_OVER_CURRENT	1
64  
65  /*
66   * Port feature numbers
67   * See USB 2.0 spec Table 11-17
68   */
69  #define USB_PORT_FEAT_CONNECTION	0
70  #define USB_PORT_FEAT_ENABLE		1
71  #define USB_PORT_FEAT_SUSPEND		2	/* L2 suspend */
72  #define USB_PORT_FEAT_OVER_CURRENT	3
73  #define USB_PORT_FEAT_RESET		4
74  #define USB_PORT_FEAT_L1		5	/* L1 suspend */
75  #define USB_PORT_FEAT_POWER		8
76  #define USB_PORT_FEAT_LOWSPEED		9	/* Should never be used */
77  #define USB_PORT_FEAT_C_CONNECTION	16
78  #define USB_PORT_FEAT_C_ENABLE		17
79  #define USB_PORT_FEAT_C_SUSPEND		18
80  #define USB_PORT_FEAT_C_OVER_CURRENT	19
81  #define USB_PORT_FEAT_C_RESET		20
82  #define USB_PORT_FEAT_TEST              21
83  #define USB_PORT_FEAT_INDICATOR         22
84  #define USB_PORT_FEAT_C_PORT_L1         23
85  
86  /*
87   * Port feature selectors added by USB 3.0 spec.
88   * See USB 3.0 spec Table 10-7
89   */
90  #define USB_PORT_FEAT_LINK_STATE		5
91  #define USB_PORT_FEAT_U1_TIMEOUT		23
92  #define USB_PORT_FEAT_U2_TIMEOUT		24
93  #define USB_PORT_FEAT_C_PORT_LINK_STATE		25
94  #define USB_PORT_FEAT_C_PORT_CONFIG_ERROR	26
95  #define USB_PORT_FEAT_REMOTE_WAKE_MASK		27
96  #define USB_PORT_FEAT_BH_PORT_RESET		28
97  #define USB_PORT_FEAT_C_BH_PORT_RESET		29
98  #define USB_PORT_FEAT_FORCE_LINKPM_ACCEPT	30
99  
100  #define USB_PORT_LPM_TIMEOUT(p)			(((p) & 0xff) << 8)
101  
102  /* USB 3.0 hub remote wake mask bits, see table 10-14 */
103  #define USB_PORT_FEAT_REMOTE_WAKE_CONNECT	(1 << 8)
104  #define USB_PORT_FEAT_REMOTE_WAKE_DISCONNECT	(1 << 9)
105  #define USB_PORT_FEAT_REMOTE_WAKE_OVER_CURRENT	(1 << 10)
106  
107  /*
108   * Hub Status and Hub Change results
109   * See USB 2.0 spec Table 11-19 and Table 11-20
110   * USB 3.1 extends the port status request and may return 4 additional bytes.
111   * See USB 3.1 spec section 10.16.2.6 Table 10-12 and 10-15
112   */
113  struct usb_port_status {
114  	__le16 wPortStatus;
115  	__le16 wPortChange;
116  	__le32 dwExtPortStatus;
117  } __attribute__ ((packed));
118  
119  /*
120   * wPortStatus bit field
121   * See USB 2.0 spec Table 11-21
122   */
123  #define USB_PORT_STAT_CONNECTION	0x0001
124  #define USB_PORT_STAT_ENABLE		0x0002
125  #define USB_PORT_STAT_SUSPEND		0x0004
126  #define USB_PORT_STAT_OVERCURRENT	0x0008
127  #define USB_PORT_STAT_RESET		0x0010
128  #define USB_PORT_STAT_L1		0x0020
129  /* bits 6 to 7 are reserved */
130  #define USB_PORT_STAT_POWER		0x0100
131  #define USB_PORT_STAT_LOW_SPEED		0x0200
132  #define USB_PORT_STAT_HIGH_SPEED        0x0400
133  #define USB_PORT_STAT_TEST              0x0800
134  #define USB_PORT_STAT_INDICATOR         0x1000
135  /* bits 13 to 15 are reserved */
136  
137  /*
138   * Additions to wPortStatus bit field from USB 3.0
139   * See USB 3.0 spec Table 10-10
140   */
141  #define USB_PORT_STAT_LINK_STATE	0x01e0
142  #define USB_SS_PORT_STAT_POWER		0x0200
143  #define USB_SS_PORT_STAT_SPEED		0x1c00
144  #define USB_PORT_STAT_SPEED_5GBPS	0x0000
145  /* Valid only if port is enabled */
146  /* Bits that are the same from USB 2.0 */
147  #define USB_SS_PORT_STAT_MASK (USB_PORT_STAT_CONNECTION |	    \
148  				USB_PORT_STAT_ENABLE |	    \
149  				USB_PORT_STAT_OVERCURRENT | \
150  				USB_PORT_STAT_RESET)
151  
152  /*
153   * Definitions for PORT_LINK_STATE values
154   * (bits 5-8) in wPortStatus
155   */
156  #define USB_SS_PORT_LS_U0		0x0000
157  #define USB_SS_PORT_LS_U1		0x0020
158  #define USB_SS_PORT_LS_U2		0x0040
159  #define USB_SS_PORT_LS_U3		0x0060
160  #define USB_SS_PORT_LS_SS_DISABLED	0x0080
161  #define USB_SS_PORT_LS_RX_DETECT	0x00a0
162  #define USB_SS_PORT_LS_SS_INACTIVE	0x00c0
163  #define USB_SS_PORT_LS_POLLING		0x00e0
164  #define USB_SS_PORT_LS_RECOVERY		0x0100
165  #define USB_SS_PORT_LS_HOT_RESET	0x0120
166  #define USB_SS_PORT_LS_COMP_MOD		0x0140
167  #define USB_SS_PORT_LS_LOOPBACK		0x0160
168  
169  /*
170   * wPortChange bit field
171   * See USB 2.0 spec Table 11-22 and USB 2.0 LPM ECN Table-4.10
172   * Bits 0 to 5 shown, bits 6 to 15 are reserved
173   */
174  #define USB_PORT_STAT_C_CONNECTION	0x0001
175  #define USB_PORT_STAT_C_ENABLE		0x0002
176  #define USB_PORT_STAT_C_SUSPEND		0x0004
177  #define USB_PORT_STAT_C_OVERCURRENT	0x0008
178  #define USB_PORT_STAT_C_RESET		0x0010
179  #define USB_PORT_STAT_C_L1		0x0020
180  /*
181   * USB 3.0 wPortChange bit fields
182   * See USB 3.0 spec Table 10-11
183   */
184  #define USB_PORT_STAT_C_BH_RESET	0x0020
185  #define USB_PORT_STAT_C_LINK_STATE	0x0040
186  #define USB_PORT_STAT_C_CONFIG_ERROR	0x0080
187  
188  /*
189   * USB 3.1 dwExtPortStatus field masks
190   * See USB 3.1 spec 10.16.2.6.3 Table 10-15
191   */
192  
193  #define USB_EXT_PORT_STAT_RX_SPEED_ID	0x0000000f
194  #define USB_EXT_PORT_STAT_TX_SPEED_ID	0x000000f0
195  #define USB_EXT_PORT_STAT_RX_LANES	0x00000f00
196  #define USB_EXT_PORT_STAT_TX_LANES	0x0000f000
197  
198  #define USB_EXT_PORT_RX_LANES(p) \
199  			(((p) & USB_EXT_PORT_STAT_RX_LANES) >> 8)
200  #define USB_EXT_PORT_TX_LANES(p) \
201  			(((p) & USB_EXT_PORT_STAT_TX_LANES) >> 12)
202  
203  /*
204   * wHubCharacteristics (masks)
205   * See USB 2.0 spec Table 11-13, offset 3
206   */
207  #define HUB_CHAR_LPSM		0x0003 /* Logical Power Switching Mode mask */
208  #define HUB_CHAR_COMMON_LPSM	0x0000 /* All ports power control at once */
209  #define HUB_CHAR_INDV_PORT_LPSM	0x0001 /* per-port power control */
210  #define HUB_CHAR_NO_LPSM	0x0002 /* no power switching */
211  
212  #define HUB_CHAR_COMPOUND	0x0004 /* hub is part of a compound device */
213  
214  #define HUB_CHAR_OCPM		0x0018 /* Over-Current Protection Mode mask */
215  #define HUB_CHAR_COMMON_OCPM	0x0000 /* All ports Over-Current reporting */
216  #define HUB_CHAR_INDV_PORT_OCPM	0x0008 /* per-port Over-current reporting */
217  #define HUB_CHAR_NO_OCPM	0x0010 /* No Over-current Protection support */
218  
219  #define HUB_CHAR_TTTT		0x0060 /* TT Think Time mask */
220  #define HUB_CHAR_PORTIND	0x0080 /* per-port indicators (LEDs) */
221  
222  struct usb_hub_status {
223  	__le16 wHubStatus;
224  	__le16 wHubChange;
225  } __attribute__ ((packed));
226  
227  /*
228   * Hub Status & Hub Change bit masks
229   * See USB 2.0 spec Table 11-19 and Table 11-20
230   * Bits 0 and 1 for wHubStatus and wHubChange
231   * Bits 2 to 15 are reserved for both
232   */
233  #define HUB_STATUS_LOCAL_POWER	0x0001
234  #define HUB_STATUS_OVERCURRENT	0x0002
235  #define HUB_CHANGE_LOCAL_POWER	0x0001
236  #define HUB_CHANGE_OVERCURRENT	0x0002
237  
238  
239  /*
240   * Hub descriptor
241   * See USB 2.0 spec Table 11-13
242   */
243  
244  #define USB_DT_HUB			(USB_TYPE_CLASS | 0x09)
245  #define USB_DT_SS_HUB			(USB_TYPE_CLASS | 0x0a)
246  #define USB_DT_HUB_NONVAR_SIZE		7
247  #define USB_DT_SS_HUB_SIZE              12
248  
249  /*
250   * Hub Device descriptor
251   * USB Hub class device protocols
252   */
253  
254  #define USB_HUB_PR_FS		0 /* Full speed hub */
255  #define USB_HUB_PR_HS_NO_TT	0 /* Hi-speed hub without TT */
256  #define USB_HUB_PR_HS_SINGLE_TT	1 /* Hi-speed hub with single TT */
257  #define USB_HUB_PR_HS_MULTI_TT	2 /* Hi-speed hub with multiple TT */
258  #define USB_HUB_PR_SS		3 /* Super speed hub */
259  
260  struct usb_hub_descriptor {
261  	__u8  bDescLength;
262  	__u8  bDescriptorType;
263  	__u8  bNbrPorts;
264  	__le16 wHubCharacteristics;
265  	__u8  bPwrOn2PwrGood;
266  	__u8  bHubContrCurrent;
267  
268  	/* 2.0 and 3.0 hubs differ here */
269  	union {
270  		struct {
271  			/* add 1 bit for hub status change; round to bytes */
272  			__u8  DeviceRemovable[(USB_MAXCHILDREN + 1 + 7) / 8];
273  			__u8  PortPwrCtrlMask[(USB_MAXCHILDREN + 1 + 7) / 8];
274  		}  __attribute__ ((packed)) hs;
275  
276  		struct {
277  			__u8 bHubHdrDecLat;
278  			__le16 wHubDelay;
279  			__le16 DeviceRemovable;
280  		}  __attribute__ ((packed)) ss;
281  	} u;
282  } __attribute__ ((packed));
283  
284  /* port indicator status selectors, tables 11-7 and 11-25 */
285  #define HUB_LED_AUTO	0
286  #define HUB_LED_AMBER	1
287  #define HUB_LED_GREEN	2
288  #define HUB_LED_OFF	3
289  
290  enum hub_led_mode {
291  	INDICATOR_AUTO = 0,
292  	INDICATOR_CYCLE,
293  	/* software blinks for attention:  software, hardware, reserved */
294  	INDICATOR_GREEN_BLINK, INDICATOR_GREEN_BLINK_OFF,
295  	INDICATOR_AMBER_BLINK, INDICATOR_AMBER_BLINK_OFF,
296  	INDICATOR_ALT_BLINK, INDICATOR_ALT_BLINK_OFF
297  } __attribute__ ((packed));
298  
299  /* Transaction Translator Think Times, in bits */
300  #define HUB_TTTT_8_BITS		0x00
301  #define HUB_TTTT_16_BITS	0x20
302  #define HUB_TTTT_24_BITS	0x40
303  #define HUB_TTTT_32_BITS	0x60
304  
305  #endif /* __LINUX_CH11_H */
306