xref: /illumos-gate/usr/src/uts/common/io/usb/usba/README (revision e4b86885570d77af552e9cf94f142f4d744fb8c8)
1#
2# CDDL HEADER START
3#
4# The contents of this file are subject to the terms of the
5# Common Development and Distribution License (the "License").
6# You may not use this file except in compliance with the License.
7#
8# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9# or http://www.opensolaris.org/os/licensing.
10# See the License for the specific language governing permissions
11# and limitations under the License.
12#
13# When distributing Covered Code, include this CDDL HEADER in each
14# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15# If applicable, add the following below this CDDL HEADER, with the
16# fields enclosed by brackets "[]" replaced with your own identifying
17# information: Portions Copyright [yyyy] [name of copyright owner]
18#
19# CDDL HEADER END
20#
21/*
22 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26
27				USBA PIPE STATE TRANSITIONS INFORMATION
28				---------------------------------------
29
301. Control pipe state transitions:-
31
32   o Default control pipe (endpoint number 0):
33
34     NOTE:- Queuing of control requests are allowed at USBA level.
35
36     Calls			Current state		additional condition		Action			Next state
37     -----			-------------		--------------------		------			-----------
38     usb_pipe_open		USB_PIPE_STATE_CLOSED	-				Initialize pipe		USB_PIPE_STATE_IDLE
39
40     usb_pipe_ctrl_xfer		USB_PIPE_STATE_IDLE	No outstanding request		send req to hcd		USB_PIPE_STATE_ACTIVE
41   							Outstanding reqs pending	queue the requests	USB_PIPE_STATE_IDLE
42 											(cb() will send
43 											next reqs to hcd)
44
45 				USB_PIPE_STATE_ACTIVE	-				queue the requests	USB_PIPE_STATE_ACTIVE
46 											(cb() will send
47 											next reqs to hcd)
48
49 				USB_PIPE_STATE_ERROR	-				queue the requests	USB_PIPE_STATE_ERROR
50 											(cb() will send
51 											next reqs to hcd)
52
53 				USB_PIPE_STATE_CLOSING	-				return failure		USB_PIPE_STATE_CLOSING
54
55
56     usba_hcdi_cb		USB_PIPE_STATE_ACTIVE	-				Before doing callback	USB_PIPE_STATE_IDLE
57     (Normal callback)					No outstanding request		-			USB_PIPE_STATE_IDLE
58  							Outstanding reqs pending	Send next req to hcd	USB_PIPE_STATE_ACTIVE
59
60
61 				USB_PIPE_STATE_ERROR	-				Don't send any more req	USB_PIPE_STATE_ERROR
62
63 				USB_PIPE_STATE_CLOSING	-				Don't send any more req	USB_PIPE_STATE_CLOSING
64
65
66     usba_hcdi_cb
67     (exceptional callback)	USB_PIPE_STATE_ACTIVE	-				Before auto clear	USB_PIPE_STATE_ERROR
68							-				On auto clear		USB_PIPE_STATE_IDLE
69											(Don't remove
70											outstanding requests)
71							No outstanding request		-			USB_PIPE_STATE_IDLE
72							Outstanding reqs pending	Send next req to hcd	USB_PIPE_STATE_ACTIVE
73
74     usb_pipe_reset		USB_PIPE_STATE_XXXX	-				Return failure		USB_PIPE_STATE_XXXX
75  											(Not allowed)
76
77
78     usb_pipe_close		USB_PIPE_STATE_IDLE	-				-			USB_PIPE_STATE_CLOSING
79				USB_PIPE_STATE_ACTIVE
80				USB_PIPE_STATE_ERROR
81							Once pipe is closed		-			USB_PIPE_STATE_CLOSED
82
83
84   o Normal control pipe (endpoint number > 0):
85
86     NOTE:- Queuing of control requests are allowed at USBA level.
87
88     Calls			Current state		additional condition		Action			Next state
89     -----			-------------		--------------------		------			-----------
90     usb_pipe_open		USB_PIPE_STATE_CLOSED	-				Initialize pipe		USB_PIPE_STATE_IDLE
91
92     usb_pipe_ctrl_xfer		USB_PIPE_STATE_IDLE	No outstanding request		send req to hcd		USB_PIPE_STATE_ACTIVE
93   							Outstanding reqs pending	queue the requests	USB_PIPE_STATE_IDLE
94 											(cb() will send
95 											next reqs to hcd)
96
97 				USB_PIPE_STATE_ACTIVE	-				queue the requests	USB_PIPE_STATE_ACTIVE
98 											(cb() will send
99 											next reqs to hcd)
100
101 				USB_PIPE_STATE_ERROR	-				return failure		USB_PIPE_STATE_ERROR
102
103 				USB_PIPE_STATE_CLOSING	-				return failure		USB_PIPE_STATE_CLOSING
104
105
106     usba_hcdi_cb		USB_PIPE_STATE_ACTIVE	-				Before doing callback	USB_PIPE_STATE_IDLE
107     (Normal callback)					No outstanding request		-			USB_PIPE_STATE_IDLE
108  							Outstanding reqs pending	Send next req to hcd	USB_PIPE_STATE_ACTIVE
109
110
111 				USB_PIPE_STATE_ERROR	-				Don't send any more req	USB_PIPE_STATE_ERROR
112 				USB_PIPE_STATE_CLOSING
113
114
115     usba_hcdi_cb
116     (exceptional callback)	USB_PIPE_STATE_ACTIVE	-				Before auto clear	USB_PIPE_STATE_ERROR
117							-				On auto clear		USB_PIPE_STATE_IDLE
118											(Remove all outstanding
119											requests)
120
121     usb_pipe_reset		USB_PIPE_STATE_XXXX	-				Remove all outstanding	USB_PIPE_STATE_IDLE
122  											requests
123
124
125     usb_pipe_close		USB_PIPE_STATE_IDLE	-				-			USB_PIPE_STATE_CLOSING
126				USB_PIPE_STATE_ACTIVE
127				USB_PIPE_STATE_ERROR
128							Once pipe is closed		-			USB_PIPE_STATE_CLOSED
129
1302. Bulk pipe state transitions (endpoint number > 1, both IN and OUT):-
131
132   NOTE:- Queuing of bulk requests are allowed at USBA level.
133
134   Calls			Current state		additional condition		Action			Next state
135   -----			-------------		--------------------		------			-----------
136   usb_pipe_open		USB_PIPE_STATE_CLOSED	-				Initialize pipe		USB_PIPE_STATE_IDLE
137
138   usb_pipe_bulk_xfer		USB_PIPE_STATE_IDLE	No outstanding request		send req to hcd		USB_PIPE_STATE_ACTIVE
139
140
141 				USB_PIPE_STATE_ACTIVE	-				send req to hcd		USB_PIPE_STATE_ACTIVE
142
143 				USB_PIPE_STATE_ERROR	-				return failure		USB_PIPE_STATE_ERROR
144
145 				USB_PIPE_STATE_CLOSING	-				return failure		USB_PIPE_STATE_CLOSING
146
147   usba_hcdi_cb			USB_PIPE_STATE_ACTIVE	if no requests are pending	Before doing callback	USB_PIPE_STATE_IDLE
148  							else outstanding reqs pending	Before doing callback	USB_PIPE_STATE_ACTIVE
149
150
151 				USB_PIPE_STATE_ERROR	-				-			USB_PIPE_STATE_ERROR
152 				USB_PIPE_STATE_CLOSING	-				-			USB_PIPE_STATE_CLOSING
153
154
155   usba_hcdi_cb
156   (exceptional callback)	USB_PIPE_STATE_ACTIVE	-				Before auto clear	USB_PIPE_STATE_ERROR
157							-				On auto clear		USB_PIPE_STATE_IDLE
158											(Remove all outstanding
159											requests)
160
161   usb_pipe_reset		USB_PIPE_STATE_XXXX	-				Remove all outstanding	USB_PIPE_STATE_IDLE
162  											requests
163
164
165   usb_pipe_close		USB_PIPE_STATE_IDLE	-				-			USB_PIPE_STATE_CLOSING
166				USB_PIPE_STATE_ACTIVE
167				USB_PIPE_STATE_ERROR
168							Once pipe is closed		-			USB_PIPE_STATE_CLOSED
169
1703. Interrupt pipe state transitions (endpoint number > 1, both IN and OUT) :-
171
172   Interrupt IN:
173
174   Calls			Current state		additional condition		Action			Next state
175   -----			-------------		--------------------		------			-----------
176   usb_pipe_open		USB_PIPE_STATE_CLOSED	-				Initialize pipe		USB_PIPE_STATE_IDLE
177
178   usb_pipe_intr_xfer		USB_PIPE_STATE_IDLE	-				send req to hcd		USB_PIPE_STATE_ACTIVE
179
180 				USB_PIPE_STATE_ACTIVE	-				return failure		USB_PIPE_STATE_ACTIVE
181 				USB_PIPE_STATE_ERROR
182 				USB_PIPE_STATE_CLOSING
183
184   usba_hcdi_cb			USB_PIPE_STATE_ACTIVE	One time xfer			Before doing callback	USB_PIPE_STATE_IDLE
185							USB_CR_STOPPED_POLLING
186							USB_CR_PIPE_RESET
187
188 				USB_PIPE_STATE_ERROR	-				-			USB_PIPE_STATE_ERROR
189 				USB_PIPE_STATE_CLOSING	-				-			USB_PIPE_STATE_CLOSING
190
191
192   usba_hcdi_cb
193   (exceptional callback)	USB_PIPE_STATE_ACTIVE	-				Before auto clear	USB_PIPE_STATE_ERROR
194							-				On auto clear		USB_PIPE_STATE_IDLE
195											(Remove all outstanding
196											requests)
197
198   usb_pipe_reset		USB_PIPE_STATE_XXXX	-				Remove all outstanding	USB_PIPE_STATE_IDLE
199  											requests
200
201
202   usb_pipe_close		USB_PIPE_STATE_IDLE	-				-			USB_PIPE_STATE_CLOSING
203				USB_PIPE_STATE_ACTIVE
204				USB_PIPE_STATE_ERROR
205							Once pipe is closed		-			USB_PIPE_STATE_CLOSED
206
207   Interrupt OUT:
208
209   NOTE: Send all interrupt OUT requests to HCD and no queuing at USBA level.
210
211   Calls			Current state		additional condition		Action			Next state
212   -----			-------------		--------------------		------			-----------
213   usb_pipe_open		USB_PIPE_STATE_CLOSED	-				Initialize pipe		USB_PIPE_STATE_IDLE
214
215   usb_pipe_intr_xfer		USB_PIPE_STATE_IDLE	-				send req to hcd		USB_PIPE_STATE_ACTIVE
216
217
218 				USB_PIPE_STATE_ACTIVE	-				send req to hcd		USB_PIPE_STATE_ACTIVE
219
220 				USB_PIPE_STATE_ERROR	-				return failure		USB_PIPE_STATE_ERROR
221
222 				USB_PIPE_STATE_CLOSING	-				return failure		USB_PIPE_STATE_CLOSING
223
224   usba_hcdi_cb			USB_PIPE_STATE_ACTIVE	if no requests are pending	Before doing callback	USB_PIPE_STATE_IDLE
225  							else outstanding reqs pending	Before doing callback	USB_PIPE_STATE_ACTIVE
226
227
228 				USB_PIPE_STATE_ERROR	-				-			USB_PIPE_STATE_ERROR
229 				USB_PIPE_STATE_CLOSING	-				-			USB_PIPE_STATE_CLOSING
230
231
232   usba_hcdi_cb
233   (exceptional callback)	USB_PIPE_STATE_ACTIVE	-				Before auto clear	USB_PIPE_STATE_ERROR
234							-				On auto clear		USB_PIPE_STATE_IDLE
235											(Remove all outstanding
236											requests)
237
238   usb_pipe_reset		USB_PIPE_STATE_XXXX	-				Remove all outstanding	USB_PIPE_STATE_IDLE
239  											requests
240
241
242   usb_pipe_close		USB_PIPE_STATE_IDLE	-				-			USB_PIPE_STATE_CLOSING
243				USB_PIPE_STATE_ACTIVE
244				USB_PIPE_STATE_ERROR
245							Once pipe is closed		-			USB_PIPE_STATE_CLOSED
246
2474. Isochronous pipe state transitions (endpoint number > 1, both IN and OUT):-
248
249   Isochronous IN:
250
251   Calls			Current state		additional condition		Action			Next state
252   -----			-------------		--------------------		------			-----------
253   usb_pipe_open		USB_PIPE_STATE_CLOSED	-				Initialize pipe		USB_PIPE_STATE_IDLE
254
255   usb_pipe_isoch_xfer		USB_PIPE_STATE_IDLE	-				send req to hcd		USB_PIPE_STATE_ACTIVE
256
257 				USB_PIPE_STATE_ACTIVE	-				return failure		USB_PIPE_STATE_ACTIVE
258 				USB_PIPE_STATE_ERROR
259 				USB_PIPE_STATE_CLOSING
260
261   usba_hcdi_cb			USB_PIPE_STATE_ACTIVE	One time xfer			Before doing callback	USB_PIPE_STATE_IDLE
262							USB_CR_STOPPED_POLLING
263							USB_CR_PIPE_RESET
264
265 				USB_PIPE_STATE_ERROR	-				-			USB_PIPE_STATE_ERROR
266 				USB_PIPE_STATE_CLOSING	-				-			USB_PIPE_STATE_CLOSING
267
268
269   usba_hcdi_cb
270   (exceptional callback)	USB_PIPE_STATE_ACTIVE	-				Before auto clear	USB_PIPE_STATE_ERROR
271							-				On auto clear		USB_PIPE_STATE_IDLE
272											(Remove all outstanding
273											requests)
274
275   usb_pipe_reset		USB_PIPE_STATE_XXXX	-				Remove all outstanding	USB_PIPE_STATE_IDLE
276  											requests
277
278
279   usb_pipe_close		USB_PIPE_STATE_IDLE	-				-			USB_PIPE_STATE_CLOSING
280				USB_PIPE_STATE_ACTIVE
281				USB_PIPE_STATE_ERROR
282							Once pipe is closed		-			USB_PIPE_STATE_CLOSED
283
284   Isochronous OUT:-
285
286   NOTE: Send all isochronous OUT requests to HCD and no queuing at USBA level.
287
288   Calls			Current state		additional condition		Action			Next state
289   -----			-------------		--------------------		------			-----------
290   usb_pipe_open		USB_PIPE_STATE_CLOSED	-				Initialize pipe		USB_PIPE_STATE_IDLE
291
292   usb_pipe_intr_xfer		USB_PIPE_STATE_IDLE	-				send req to hcd		USB_PIPE_STATE_ACTIVE
293
294
295 				USB_PIPE_STATE_ACTIVE	-				send req to hcd		USB_PIPE_STATE_ACTIVE
296
297 				USB_PIPE_STATE_ERROR	-				return failure		USB_PIPE_STATE_ERROR
298
299 				USB_PIPE_STATE_CLOSING	-				return failure		USB_PIPE_STATE_CLOSING
300
301   usba_hcdi_cb			USB_PIPE_STATE_ACTIVE	if no requests are pending	Before doing callback	USB_PIPE_STATE_IDLE
302  							else outstanding reqs pending	Before doing callback	USB_PIPE_STATE_ACTIVE
303
304
305 				USB_PIPE_STATE_ERROR	-				-			USB_PIPE_STATE_ERROR
306 				USB_PIPE_STATE_CLOSING	-				-			USB_PIPE_STATE_CLOSING
307
308
309   usba_hcdi_cb
310   (exceptional callback)	USB_PIPE_STATE_ACTIVE	-				Before auto clear	USB_PIPE_STATE_ERROR
311							-				On auto clear		USB_PIPE_STATE_IDLE
312											(Remove all outstanding
313											requests)
314
315   usb_pipe_reset		USB_PIPE_STATE_XXXX	-				Remove all outstanding	USB_PIPE_STATE_IDLE
316  											requests
317
318
319   usb_pipe_close		USB_PIPE_STATE_IDLE	-				-			USB_PIPE_STATE_CLOSING
320				USB_PIPE_STATE_ACTIVE
321				USB_PIPE_STATE_ERROR
322							Once pipe is closed		-			USB_PIPE_STATE_CLOSED
323
324