8322 nl: misleading-indentation
[unleashed/tickless.git] / usr / src / man / man9s / usb_callback_flags.9s
blobb275e9f4615f43f5d2e98c7b118732ab37bb0327
1 '\" te
2 .\" Copyright (c) 2004, Sun Microsystems, Inc., All Rights Reserved
3 .\" The contents of this file are subject to the terms of the Common Development and Distribution License (the "License").  You may not use this file except in compliance with the License.
4 .\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing.  See the License for the specific language governing permissions and limitations under the License.
5 .\" When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE.  If applicable, add the following below this CDDL HEADER, with the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner]
6 .TH USB_CALLBACK_FLAGS 9S "Jan 5, 2004"
7 .SH NAME
8 usb_callback_flags \- USB callback flag definitions
9 .SH SYNOPSIS
10 .LP
11 .nf
12 #include <sys/usb/usba.h>
13 .fi
15 .SH INTERFACE LEVEL
16 .sp
17 .LP
18 Solaris DDI specific (Solaris DDI)
19 .SH DESCRIPTION
20 .sp
21 .LP
22 If the USB framework detects an error during a request execution, it calls the
23 client driver's exception callback handler to report what happened. Callback
24 flags (which are set prior to calling the exception callback handler) detail
25 errors discovered during the exception recovery process, and summarize recovery
26 actions taken by the USBA framework.
27 .sp
28 .LP
29 Information from the callback flags supplements information from the original
30 transport error. For transfers, the original transport error status is returned
31 to the callback handler through the original request (whose completion reason
32 field contains any transport error indication). For command completion
33 callbacks, the callback's rval argument contains the transport error status. A
34 completion reason of \fBUSB_CR_OK\fR means the transfer completed with no
35 errors detected.
36 .sp
37 .LP
38 The usb_cb_flags_t enumerated type contains the following definitions:
39 .sp
40 .ne 2
41 .na
42 \fBUSB_CB_NO_INFO\fR
43 .ad
44 .RS 27n
45 No additional errors discovered or recovery actions taken.
46 .RE
48 .sp
49 .ne 2
50 .na
51 \fBUSB_CB_FUNCTIONAL_STALL\fR
52 .ad
53 .RS 27n
54 A functional stall occurred during the transfer. A functional      stall is
55 usually caused by a hardware error, and must be explicitly cleared. A
56 functional stall is fatal if it cannot be cleared. The default control pipe
57 never shows a functional stall.
58 .RE
60 .sp
61 .ne 2
62 .na
63 \fBUSB_CB_STALL_CLEARED\fR
64 .ad
65 .RS 27n
66 A functional stall has been cleared by the USBA framework. This             can
67 happen if USB_ATTRS_AUTOCLEARING is set in the request's xxxx_attributes field.
68 .RE
70 .sp
71 .ne 2
72 .na
73 \fBUSB_CB_PROTOCOL_STALL\fR
74 .ad
75 .RS 27n
76 A protocol stall has occurred during the transfer. A protocol stall is caused
77 usually by an invalid or misunderstood command. It is cleared automatically
78 when the device is given its next             command. The USBA framework
79 treats stalls detected on default pipe transfers as protocol stalls.
80 .RE
82 .sp
83 .ne 2
84 .na
85 \fBUSB_CB_RESET_PIPE\fR
86 .ad
87 .RS 27n
88 A pipe with a stall has been reset automatically via autoclearing, or via an
89 explicit call to \fBusb_pipe_reset\fR(9F). Resetting a pipe consists of
90 stopping all transactions on a pipe, setting the pipe to the idle state, and if
91 the pipe is not the default pipe, flushing all pending requests. The request
92 which has the error, plus all pending requests which are flushed, show
93 USB_CB_RESET_PIPE set in the usb_cb_flags_t when their exception callback is
94 called.
95 .RE
97 .sp
98 .ne 2
99 .na
100 \fBUSB_CB_ASYNC_REQ_FAILED\fR
102 .RS 27n
103 Resources could not be allocated to process callbacks
104 asynchronously. Callbacks receiving this flag must not block, since those
105 callbacks are executing in a context which holds resources shared by the rest
106 of the system. Note that exception callbacks with USB_CB_ASYNC_REQ_FAILED set
107 may execute out of order from the requests which preceded them. Normal
108 callbacks may be already queued when an exception hits that the USBA is unable
109 to queue.
113 .ne 2
115 \fBUSB_CB_SUBMIT_FAILED\fR
117 .RS 27n
118 A queued request was submitted to the host controller driver and
119 was rejected. The usb_completion_reason shows why the request was rejected by
120 the host controller.
124 .ne 2
126 \fBUSB_CB_NO_RESOURCES\fR
128 .RS 27n
129 Insufficient resources were available for recovery to proceed.
133 .ne 2
135 \fBUSB_CB_INTR_CONTEXT\fR
137 .RS 27n
138 Callback is executing in interrupt context and should not block.
143 The usb_cb_flags_t enumerated type defines a bitmask. Multiple bits can be set,
144 reporting back multiple statuses to the exception callback handler.
145 .SS "CALLBACK HANDLER"
148 The USBA framework supports callback handling as a way of asynchronous client
149 driver notification. There are three kinds of callbacks: Normal completion
150 transfer callback, exception (error) completion transfer callback, and command
151 completion callback, each described below.
154 Callback handlers are called whenever they are specified in a request or
155 command, regardless of whether or not that request or command specifies the
156 USB_FLAGS_SLEEP flag. (USB_FLAGS_SLEEP tells the request or command to block
157 until completed.)  Callback handlers must be specified whenever an asynchronous
158 transfer is requested.
159 .SS "PIPE POLICY"
162 Each pipe is associated with a pool of threads that are used to run callbacks
163 associated with requests on that pipe.  All transfer completion callbacks for a
164 particular pipe are run serially by a single thread.
167 Pipes taking requests with callbacks which can block must have their pipe
168 policy properly initialized. If a callback blocks on a condition that is only
169 met by another thread associated with the same pipe, there must be sufficient
170 threads available. Otherwise that callback thread will block forever.
171 Similarly, problems will ensue when callbacks overlap and there are not enough
172 threads to handle the number of overlapping callbacks.
175 The pp_max_async_reqs field of the pipe_policy provides a hint of how many
176 threads to allocate for asynchronous processing of request callbacks on a pipe.
177 Set this value high enough per pipe to accommodate all of the pipe's possible
178 asynchronous conditions.  The pipe_policy is passed to \fBusb_pipe_open\fR(9F).
181 Transfer completion callbacks (normal completion and exception):
184 Most transfer completion callbacks are allowed to block, but only under certain
185 conditions:
186 .RS +4
189 No callback is allowed to block if the callback flags show
190 USB_CB_INTR_CONTEXT set, since that flag indicates that the callback is running
191 in interrupt context instead of kernel context. Isochronous  normal completion
192 callbacks, plus those with USB_CB_ASYNC_REQ_FAILED set, execute in  interrupt
193 context.
195 .RS +4
198 Any callback except for isochronous normal completion can block for
199 resources (for example to allocate memory).
201 .RS +4
204 No callback can block for synchronous completion of a command (for example,
205 a call to \fBusb_pipe_close\fR(9F) with the USB_FLAGS_SLEEP flag passed) done
206 on the same pipe. The command could wait for all callbacks to complete,
207 including the callback which issued that command, causing all operations on the
208 pipe to deadlock. Note that asynchronous commands can start from a callback,
209 providing that the pipe's policy pp_max_async_reqs field is initialized to
210 accommodate them.
212 .RS +4
215 Avoid callbacks that block for synchronous completion of commands done on
216 other pipes. Such conditions can cause complex dependencies and unpredictable
217 results.
219 .RS +4
222 No callback can block waiting for a synchronous transfer request to
223 complete. (Note that making an asynchronous request to start a new transfer or
224 start polling does not block, and is OK.)
226 .RS +4
229 No callback can block waiting for another callback to complete. (This is
230 because all callbacks are done by a single thread.)
232 .RS +4
235 Note that if a callback blocks, other callbacks awaiting processing can
236 backup behind it, impacting system resources.
240 A transfer request can specify a non-null normal-completion callback. Such
241 requests conclude by calling the normal-completion callback when the transfer
242 completes normally. Similarly, a transfer request can specify a non-null
243 exception callback. Such requests conclude by calling the exception callback
244 when the transfer completes abnormally. Note that the same callback can be used
245 for both normal completion and exception callback handling. A completion reason
246 of USB_CR_OK defines normal completion.
249 All request-callbacks take as arguments a usb_pipe_handle_t and a pointer to
250 the request:
252 .in +2
254 xxxx_cb(usb_pipe_handle_t ph, struct usb_ctrl_req *req);
256 .in -2
260 Such callbacks can retrieve saved state or other information from the private
261 area of the pipe handle.  (See \fBusb_pipe_set_private\fR(9F).) Handlers also
262 have access to the completion reason (usb_cr_t) and callback flags
263 (usb_cb_flags_t) through the request argument they are passed.
266 Request information follows. In the data below, \fIxxxx\fR below represents the
267 type of request (ctrl, intr, isoc or bulk.)
269 .in +2
271             Request structure name is usb_xxxx_req_t.
273             Normal completion callback handler field is xxxx_cb.
275             Exception callback handler field is xxxx_exc_cb.
277             Completion reason field is xxxx_completion_reason.
279             Callback flags field is xxxx_cb_flags.
281 .in -2
283 .SS "COMMAND COMPLETION CALLBACKS"
286 Calls to some non-transfer functions can be set up for callback notification.
287 These include \fBusb_pipe_close\fR(9F), \fBusb_pipe_reset\fR(9F),
288 \fBusb_pipe_drain_reqs\fR(9F), \fBusb_set_cfg\fR(9F), \fBusb_set_alt_if\fR(9F)
289 and \fBusb_clr_feature\fR(9F).
292 The signature of a command completion callback is as follows:
294 .in +2
296                 command_cb(
297                     usb_pipe_handle_t cb_pipe_handle,
298                     usb_opaque_t arg,
299                     int rval,
300                     usb_cb_flags_t flags);
302 .in -2
306 As with transfer completion callbacks, command completion callbacks take a
307 usb_pipe_handle_t to retrieve saved state or other information from the pipe's
308 private area. Also, command completion callbacks are provided with an
309 additional user-definable argument (usb_opaque_t arg), the return status of the
310 executed command (int rval), and the callback flags (usb_cb_flags_t flags).
313 The rval argument is roughly equivalent to the completion reason of a transfer
314 callback, indicating the overall status.  See the return values of the relevant
315 function for possible rval values which can be passed to the callback.
318 The callback flags can be checked when rval indicates failure status. Just as
319 for transfer completion callbacks, callback flags return additional information
320 on execution events.
321 .SH ATTRIBUTES
324 See attributes(5) for descriptions of the following attributes:
329 box;
330 c | c
331 l | l .
332 ATTRIBUTE TYPE  ATTRIBUTE VALUE
334 Architecture    PCI-based systems
336 Interface stability     Committed
339 .SH SEE ALSO
342 \fBusb_alloc_request\fR(9F), \fBusb_pipe_bulk_xfer\fR(9F),
343 \fBusb_pipe_ctrl_xfer\fR(9F), \fBusb_pipe_intr_xfer\fR(9F),
344 \fBusb_pipe_isoc_xfer\fR(9F), \fBusb_bulk_request\fR(9S),
345 \fBusb_ctrl_request\fR(9S), \fBusb_intr_request\fR(9S),
346 \fBusb_isoc_request\fR(9S)