usb_pipe_intr_xfer(9f) 맨 페이지 - 윈디하나의 솔라나라

개요

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

usb_pipe_intr_xfer(9f)

usb_pipe_intr_xfer(9F)         Kernel Functions         usb_pipe_intr_xfer(9F)

NAME
       usb_pipe_intr_xfer, usb_pipe_stop_intr_polling - USB interrupt transfer
       and polling functions

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

       int usb_pipe_intr_xfer(usb_pipe_handle_t pipe_handle, usb_intr_req_t *request,
            usb_flags_t flags);


       void usb_pipe_stop_intr_polling(usb_pipe_handle_t pipe_handle, usb__flags_t flags);

INTERFACE LEVEL
       Solaris DDI specific (Solaris DDI)

PARAMETERS
       For usb_pipe_intr_xfer():

       pipe_handle    Interrupt pipe handle on which request is made.


       request        Pointer to interrupt transfer request.


       flags          USB_FLAGS_SLEEP  is  the  only flag recognized. Wait for
                      needed resources if unavailable. For requests specifying
                      the USB_ATTRS_ONE_XFER attribute, wait for  the  request
                      to complete.



       For usb_pipe_stop_intr_polling():

       pipe_handle    Interrupt pipe handle on which to stop polling for data.


       flags          USB_FLAGS_SLEEP  is  the  only flag recognized. Wait for
                      polling to stop.


DESCRIPTION
       The usb_pipe_intr_xfer() function requests the USBA framework  to  per‐
       form  a transfer through a USB interrupt pipe. The request is passed to
       the host controller driver (HCD), which performs the necessary transac‐
       tions to complete the request.


       There are three categories of interrupt transfers: periodic  or  polled
       interrupt-IN,  single-transfer  interrupt-IN, and (single-transfer) in‐
       terrupt-OUT.

   Periodic Interrupt-IN Transfers
       Periodic or polled interrupt-IN transfers  execute  on  input  requests
       which do not have the USB_ATTRS_ONE_XFER attribute set. One request en‐
       ables  repetitive  transfers  at  a periodic rate set by the endpoint's
       bInterval. There can be only one interrupt-IN request  submitted  at  a
       time.


       Periodic  interrupt-IN transfers are always asynchronous. Client driver
       notification of new data is always via a callback. The  USB_FLAGS_SLEEP
       flag  is only to wait for resources to become available. Callbacks must
       always be in place to receive transfer completion notification.  Please
       see usb_callback_flags(9S) for details on USB callbacks.


       Calls  made to usb_pipe_intr_xfer() for starting input polling need al‐
       locate only one request. The USBA framework  allocates  a  new  request
       each  time  polling has new data to return. (Note that each request re‐
       turned must be freed via usb_free_intr_req(9F). Specify a  zero  length
       when  calling  usb_alloc_intr_req()  to  allocate the original request,
       since it will not be used to return data. Set the intr_len in  the  re‐
       quest to specify how much data can be returned per polling interval.


       The  original  request passed to usb_pipe_intr_xfer() is used to return
       status when polling is terminated, or on an error  condition  when  the
       USB_ATTRS_AUTOCLEARING  attribute is set for the request. If autoclear‐
       ing is not set, the current (non-original) request is returned  on  er‐
       ror.  Call usb_pipe_reset(9F) to reset the pipe and get back the origi‐
       nal request in this case. The USB_CR_STOPPED_POLLING flag is always set
       for callbacks where the original request is returned.

   Single-transfer Interrupt-IN Transfers
       Interrupt-IN requests which have the USB_ATTRS_ONE_XFER attribute  per‐
       form  a  single  transfer.  Such  requests  are  synchronous  when  the
       USB_FLAGS_SLEEP flag is specified. Calls for  synchronous  requests  do
       not return until their transaction is complete, and their callbacks are
       optional.  The  request is returned to the client through the normal or
       the exception completion callback to signal either normal completion or
       an error condition.

   Interrupt-OUT Transfers
       Interrupt-OUT requests always set up for a  single  transfer.  However,
       multiple  requests  can be queued and execute in periodic fashion until
       depleted.


       Interrupt-OUT transfers are synchronous when the  USB_FLAGS_SLEEP  flag
       is set in the request's flags. Calls for synchronous transfers will not
       return  until  their  transaction has completed. Calls for asynchronous
       transfers notify the client driver of transaction completion via a nor‐
       mal callback, or error completion via an exception callback.


       The usb_pipe_stop_intr_polling() function terminates polling on  inter‐
       rupt-IN pipes and does the following:
         1. Cease polling.
         2.  Allow any requests-in-progress to complete and be returned to the
         client driver through the normal callback mechanism.
         3. Idle the pipe.
         4. Return the original polling request to the client  driver  through
         an    exception    callback    with    a    completion    reason   of
         USB_CR_STOPPED_POLLING.


       The client driver may restart polling from an exception  callback  only
       if  the  callback corresponds to an original request. The callback han‐
       dler checks for the following completion reasons to ensure that a call‐
       back corresponds to an original request:



                 USB_CR_STOPPED_POLLING,
                 USB_CR_PIPE_RESET,
                 USB_CR_PIPE_CLOSING,
                 USB_CR_NOT_SUPPORTED





       The callback handler also checks the request's intr_data field to  mark
       original  polling  requests,  when the requests are created with a zero
       len argument. In this case, a NULL intr_data field distinguishes a  re‐
       turned  original request from a request allocated by the framework dur‐
       ing polling.


       Mblks for data for interrupt-OUT requests are allocated when a  request
       is allocated via usb_alloc_intr_req(9F) by passing a non-negative value
       for the len argument.

RETURN VALUES
       For usb_pipe_intr_xfer()

       USB_SUCCESS              Transfer was successful.


       USB_INVALID_ARGS         Request is NULL.


       USB_INVALID_CONTEXT      Called   from   interrupt   context  with  the
                                USB_FLAGS_SLEEP flag set.


       USB_INVALID_REQUEST      The request has been freed or otherwise inval‐
                                idated.

                                A set of conflicting attributes was specified.
                                See usb_intr_request(9S).

                                The normal and/or exception callback was NULL,
                                USB_FLAGS_SLEEP  was  not  set   and   USB_AT‐
                                TRS_ONE_XFER was not set.

                                An interrupt request was specified with a NULL
                                data and a non-zero intr_len value.

                                An  IN  interrupt  request  was specified with
                                both polling (USB_ATTRS_ONE_XFER clear in  at‐
                                tributes) and non-zero timeout specified.

                                An  IN  interrupt request was specified with a
                                non-NULL data argument.

                                An OUT interrupt request was specified with  a
                                NULL data argument.


       USB_INVALID_PIPE         Pipe handle is NULL or invalid.

                                Pipe is closing or closed.


       USB_PIPE_ERROR           Pipe  handle  refers to a pipe which is in the
                                USB_PIPE_STATE_ERROR state.


       USB_NO_RESOURCES         Memory, descriptors  or  other  resources  un‐
                                available.


       USB_HC_HARDWARE_ERROR    Host controller is in error state.


       USB_FAILURE              An asynchronous transfer failed or an internal
                                error occurred.

                                An  intr polling request is made while polling
                                is already in progress.

                                The pipe is in  an  unsuitable  state  (error,
                                busy, not ready).

                                Additional status information may be available
                                in      the     intr_completion_reason     and
                                intr_cb_flags fields of  the  request.  Please
                                see  usb_completion_reason(9S)  and  usb_call‐
                                back_flags(9S) for more information.



       For usb_pipe_stop_intr_polling()


       None, but fails if called with USB_FLAGS_SLEEP specified from interrupt
       context, pipe handle is invalid, NULL  or  pertains  to  a  closing  or
       closed  pipe,  or  the  pipe  is  in an error state. Error messages are
       logged to the console logfile.


       Exception handlers' queued requests which are flushed by these commands
       before execution are returned with completion reason of USB_CR_FLUSHED.

CONTEXT
       Both of these functions can be called from kernel or user context with‐
       out regard to arguments, and may be called from interrupt context  only
       when the USB_FLAGS_SLEEP flag is clear.

EXAMPLES
          /* Start polling on interrupt-IN pipe. */

          usb_intr_req_t intr_req;
          void intr_pipe_callback(usb_pipe_handle_t, usb_intr_req_t*);
          void intr_pipe_exception_callback(
              usb_pipe_handle_t, usb_intr_req_t*);
          usb_ep_descr_t *ep_descr;

          ep_descr = ...;
          intr_req = usb_alloc_intr_req(dip, 0, USB_FLAGS_SLEEP);
          ...
          ...
          intr_req->intr_attributes   = USB_ATTRS_SHORT_XFER_OK;
          intr_req->intr_len          = ep_descr->wMaxPacketSize;
          ...
          ...
          intr_req->intr_cb           = intr_pipe_callback;
          intr_req->intr_exc_cb       = intr_pipe_exception_callback;

          if ((rval = usb_pipe_intr_xfer(pipe, intr_req, USB_FLAGS_NOSLEEP))
              != USB_SUCCESS) {
                cmn_err (CE_WARN, "%s%d: Error starting interrupt pipe polling.",
                    ddi_driver_name(dip), ddi_get_instance(dip));
          }

          -------

          /* Stop polling before setting device idle.  Wait for polling to stop. */

          usb_pipe_stop_intr_polling(pipe, USB_FLAGS_SLEEP);
          (void) pm_idle_component(dip, 0);

          -------

          /* Allocate, initialize and issue a synchronous intr-OUT request. */

          usb_intr_req_t intr_req;
          mblk_t *mblk;
          usb_ep_descr_t *ep_descr;

          ep_descr = ...;

          intr_req =
            usb_alloc_intr_req(dip, ep_descr->wMaxPacketSize, USB_FLAGS_SLEEP);

          intr_req->intr_attributes   = USB_ATTRS_AUTOCLEARING;
          mblk = intr_req->intr_data;
          bcopy(buffer, mblk->b_wptr, ep_descr->wMaxPacketSize);
          mblk->b_wptr += ep_descr->wMaxPacketSize;

          if ((rval = usb_pipe_intr_xfer(pipe, intr_req, USB_FLAGS_SLEEP))
              != USB_SUCCESS) {
                  cmn_err (CE_WARN, "%s%d: Error writing intr data.",
                      ddi_driver_name(dip), ddi_get_instance(dip));
          }



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
       attributes(7),      usb_pipe_get_state(9F),      usb_alloc_request(9F),
       usb_get_cfg(9F),      usb_get_status(9F),       usb_pipe_bulk_xfer(9F),
       usb_pipe_ctrl_xfer(9F),    usb_pipe_isoc_xfer(9F),   usb_pipe_open(9F),
       usb_pipe_reset(9F),    usb_bulk_request(9S),    usb_callback_flags(9S),
       usb_completion_reason(9S),    usb_ctrl_request(9S),   usb_ep_descr(9S),
       usb_intr_request(9S), usb_isoc_request(9S)

Oracle Solaris 11.4               3 Aug 2006            usb_pipe_intr_xfer(9F)
맨 페이지 내용의 저작권은 맨 페이지 작성자에게 있습니다.
RSS ATOM XHTML 5 CSS3