usb_callback_flags(9s) 맨 페이지 - 윈디하나의 솔라나라

개요

섹션
맨 페이지 이름
검색(S)

usb_callback_flags(9s)

usb_callback_flags(9S)  Kernel & Driver Data Structures usb_callback_flags(9S)

NAME
       usb_callback_flags - USB callback flag definitions

SYNOPSIS
       #include <sys/usb/usba.h>

INTERFACE LEVEL
       Solaris DDI specific (Solaris DDI)

DESCRIPTION
       If  the  USB  framework detects an error during a request execution, it
       calls the client driver's exception callback  handler  to  report  what
       happened.  Callback flags (which are set prior to calling the exception
       callback handler) detail errors discovered during the exception  recov‐
       ery  process,  and  summarize recovery actions taken by the USBA frame‐
       work.


       Information from the callback flags supplements  information  from  the
       original  transport  error. For transfers, the original transport error
       status is returned to the callback handler through the original request
       (whose completion reason field contains  any  transport  error  indica‐
       tion).  For  command completion callbacks, the callback's rval argument
       contains the transport error status. A completion reason  of  USB_CR_OK
       means the transfer completed with no errors detected.


       The usb_cb_flags_t enumerated type contains the following definitions:

       USB_CB_NO_INFO             No  additional errors discovered or recovery
                                  actions taken.


       USB_CB_FUNCTIONAL_STALL    A  functional  stall  occurred  during   the
                                  transfer.  A  functional  stall  is  usually
                                  caused by a hardware error, and must be  ex‐
                                  plicitly  cleared. A functional stall is fa‐
                                  tal if it cannot  be  cleared.  The  default
                                  control pipe never shows a functional stall.


       USB_CB_STALL_CLEARED       A  functional  stall has been cleared by the
                                  USBA framework. This can happen  if  USB_AT‐
                                  TRS_AUTOCLEARING  is  set  in  the request's
                                  xxxx_attributes field.


       USB_CB_PROTOCOL_STALL      A protocol stall  has  occurred  during  the
                                  transfer. A protocol stall is caused usually
                                  by  an  invalid or misunderstood command. It
                                  is cleared automatically when the device  is
                                  given  its  next command. The USBA framework
                                  treats  stalls  detected  on  default   pipe
                                  transfers as protocol stalls.


       USB_CB_RESET_PIPE          A pipe with a stall has been reset automati‐
                                  cally  via  autoclearing, or via an explicit
                                  call to usb_pipe_reset(9F). Resetting a pipe
                                  consists of stopping all transactions  on  a
                                  pipe,  setting  the  pipe to the idle state,
                                  and if the pipe is  not  the  default  pipe,
                                  flushing  all  pending requests. The request
                                  which has the error, plus  all  pending  re‐
                                  quests  which  are  flushed, show USB_CB_RE‐
                                  SET_PIPE  set  in  the  usb_cb_flags_t  when
                                  their exception callback is called.


       USB_CB_ASYNC_REQ_FAILED    Resources  could not be allocated to process
                                  callbacks asynchronously. Callbacks  receiv‐
                                  ing  this  flag  must not block, since those
                                  callbacks are executing in a  context  which
                                  holds  resources  shared  by the rest of the
                                  system. Note that exception  callbacks  with
                                  USB_CB_ASYNC_REQ_FAILED  set may execute out
                                  of order from the  requests  which  preceded
                                  them. Normal callbacks may be already queued
                                  when  an exception hits that the USBA is un‐
                                  able to queue.


       USB_CB_SUBMIT_FAILED       A queued request was submitted to  the  host
                                  controller  driver  and  was  rejected.  The
                                  usb_completion_reason shows why the  request
                                  was rejected by the host controller.


       USB_CB_NO_RESOURCES        Insufficient  resources  were  available for
                                  recovery to proceed.


       USB_CB_INTR_CONTEXT        Callback is executing in  interrupt  context
                                  and should not block.



       The usb_cb_flags_t enumerated type defines a bitmask. Multiple bits can
       be set, reporting back multiple statuses to the exception callback han‐
       dler.

   CALLBACK HANDLER
       The  USBA framework supports callback handling as a way of asynchronous
       client driver notification. There are three kinds of callbacks:  Normal
       completion  transfer  callback,  exception  (error) completion transfer
       callback, and command completion callback, each described below.


       Callback handlers are called whenever they are specified in  a  request
       or command, regardless of whether or not that request or command speci‐
       fies  the  USB_FLAGS_SLEEP  flag. (USB_FLAGS_SLEEP tells the request or
       command to block until completed.) Callback handlers must be  specified
       whenever an asynchronous transfer is requested.

   PIPE POLICY
       Each  pipe  is  associated  with a pool of threads that are used to run
       callbacks associated with requests on that pipe. All  transfer  comple‐
       tion  callbacks  for  a  particular  pipe  are run serially by a single
       thread.


       Pipes taking requests with callbacks which can block  must  have  their
       pipe  policy  properly initialized. If a callback blocks on a condition
       that is only met by another thread associated with the same pipe, there
       must be sufficient threads available. Otherwise  that  callback  thread
       will block forever. Similarly, problems will ensue when callbacks over‐
       lap  and  there are not enough threads to handle the number of overlap‐
       ping callbacks.


       The pp_max_async_reqs field of the pipe_policy provides a hint  of  how
       many  threads  to allocate for asynchronous processing of request call‐
       backs on a pipe. Set this value high enough per pipe to accommodate all
       of the pipe's possible  asynchronous  conditions.  The  pipe_policy  is
       passed to usb_pipe_open(9F).


       Transfer completion callbacks (normal completion and exception):


       Most transfer completion callbacks are allowed to block, but only under
       certain conditions:

           1.     No  callback  is allowed to block if the callback flags show
                  USB_CB_INTR_CONTEXT set, since that flag indicates that  the
                  callback  is  running in interrupt context instead of kernel
                  context. Isochronous normal completion callbacks, plus those
                  with USB_CB_ASYNC_REQ_FAILED set, execute in interrupt  con‐
                  text.


           2.     Any  callback  except  for isochronous normal completion can
                  block for resources (for example to allocate memory).


           3.     No callback can block for synchronous completion of  a  com‐
                  mand  (for  example,  a  call to usb_pipe_close(9F) with the
                  USB_FLAGS_SLEEP flag passed) done on the same pipe. The com‐
                  mand could wait for all callbacks to complete, including the
                  callback which issued that command, causing  all  operations
                  on the pipe to deadlock. Note that asynchronous commands can
                  start  from  a  callback,  providing  that the pipe's policy
                  pp_max_async_reqs field is initialized to accommodate them.


           4.     Avoid callbacks that block  for  synchronous  completion  of
                  commands done on other pipes. Such conditions can cause com‐
                  plex dependencies and unpredictable results.


           5.     No callback can block waiting for a synchronous transfer re‐
                  quest to complete. (Note that making an asynchronous request
                  to start a new transfer or start polling does not block, and
                  is OK.)


           6.     No  callback  can block waiting for another callback to com‐
                  plete. (This is because all callbacks are done by  a  single
                  thread.)


           7.     Note  that  if  a  callback blocks, other callbacks awaiting
                  processing can back  up  behind  it,  impacting  system  re‐
                  sources.




       A  transfer  request can specify a non-null normal-completion callback.
       Such requests conclude by calling the normal-completion  callback  when
       the  transfer  completes  normally.  Similarly,  a transfer request can
       specify a non-null exception callback. Such requests conclude by  call‐
       ing the exception callback when the transfer completes abnormally. Note
       that  the  same callback can be used for both normal completion and ex‐
       ception callback handling. A completion  reason  of  USB_CR_OK  defines
       normal completion.


       All  request-callbacks  take  as  arguments  a  usb_pipe_handle_t and a
       pointer to the request:



         xxxx_cb(usb_pipe_handle_t ph, struct usb_ctrl_req *req);



       Such callbacks can retrieve saved state or other information  from  the
       private  area  of the pipe handle. (See usb_pipe_set_private(9F).) Han‐
       dlers also have access to the completion reason (usb_cr_t) and callback
       flags (usb_cb_flags_t) through the request argument they are passed.


       Request information follows. In the data below, xxxx  below  represents
       the type of request (ctrl, intr, isoc or bulk.)




                     Request structure name is usb_xxxx_req_t.

                     Normal completion callback handler field is xxxx_cb.

                     Exception callback handler field is xxxx_exc_cb.

                     Completion reason field is xxxx_completion_reason.

                     Callback flags field is xxxx_cb_flags.


   COMMAND COMPLETION CALLBACKS
       Calls to some non-transfer functions can be set up for callback notifi‐
       cation.    These    include   usb_pipe_close(9F),   usb_pipe_reset(9F),
       usb_pipe_drain_reqs(9F),   usb_set_cfg(9F),   usb_set_alt_if(9F)    and
       usb_clr_feature(9F).


       The signature of a command completion callback is as follows:



                         command_cb(
                             usb_pipe_handle_t cb_pipe_handle,
                             usb_opaque_t arg,
                             int rval,
                             usb_cb_flags_t flags);



       As  with  transfer  completion  callbacks, command completion callbacks
       take a usb_pipe_handle_t to retrieve saved state or  other  information
       from  the  pipe's  private area. Also, command completion callbacks are
       provided with an additional user-definable argument (usb_opaque_t arg),
       the return status of the executed command (int rval), and the  callback
       flags (usb_cb_flags_t flags).


       The  rval  argument is roughly equivalent to the completion reason of a
       transfer callback, indicating the overall status. See the return values
       of the relevant function for possible rval values which can  be  passed
       to the callback.


       The  callback  flags can be checked when rval indicates failure status.
       Just as for transfer completion callbacks, callback flags return  addi‐
       tional information on execution events.

ATTRIBUTES
       See attributes(7) for descriptions of the following attributes:

       tab()  box; cw(2.75i) |cw(2.75i) lw(2.75i) |lw(2.75i) ATTRIBUTE TYPEAT‐
       TRIBUTE VALUE _ ArchitecturePCI-based systems  _  Interface  Stability‐
       Committed _ Availabilitysystem/io/usb


SEE ALSO
       usb_alloc_request(9F),  usb_pipe_bulk_xfer(9F), usb_pipe_ctrl_xfer(9F),
       usb_pipe_intr_xfer(9F),  usb_pipe_isoc_xfer(9F),  usb_intr_request(9S),
       usb_bulk_request(9S), usb_ctrl_request(9S), usb_isoc_request(9S)

Oracle Solaris 11.4               11 May 2021           usb_callback_flags(9S)
맨 페이지 내용의 저작권은 맨 페이지 작성자에게 있습니다.
RSS ATOM XHTML 5 CSS3