USB_REQUEST_ATTRIBUTES(9S) Data Structures for Drivers
NAME
usb_request_attributes - Definition of USB request attributes
SYNOPSIS
#include <sys/usb/usba.h>
INTERFACE LEVEL
illumos DDI specific (illumos DDI)
DESCRIPTION
Request attributes specify how the USBA framework handles request
execution. Request attributes are specified in the request's
*_attributes field and belong to the enumerated type usb_req_attrs_t.
Supported request attributes are:
USB_ATTRS_SHORT_XFER_OK Use this attribute when the maximum
transfer size is known, but it is
possible for the request to receive a
smaller amount of data. This attribute
tells the USBA framework to accept
without error transfers which are
shorter than expected.
USB_ATTRS_PIPE_RESET Have the USB framework reset the pipe
automatically if an error occurs
during the transfer. Do not attempt to
clear any stall. The USB_CB_RESET_PIPE
callback flag is passed to the client
driver's exception handler to show the
pipe has been reset. Pending requests
on pipes which are reset are flushed
unless the pipe is the default pipe.
USB_ATTRS_AUTOCLEARING Have the USB framework reset the pipe
and clear functional stalls
automatically if an error occurs during
the transfer. The callback flags passed
to the client driver's exception
handler show the status after the
attempt to clear the stall.
USB_CB_FUNCTIONAL_STALL is set in the
callback flags to indicate that a
functional stall occurred.
USB_CB_STALL_CLEARED is also set if the
stall is cleared. The default pipe
never shows a functional stall if the
USB_ATTRS_AUTOCLEARING attribute is
set. If USB_CB_FUNCTIONAL_STALL is seen
when autoclearing is enabled, the
device has a fatal error.
USB_CB_PROTOCOL_STALL is set without
USB_CB_STALL_CLEARED in the callback
flags to indicate that a protocol stall
was seen but was not explicitly
cleared. Protocol stalls are cleared
automatically when a subsequent command
is issued.
Autoclearing a stalled default pipe is
not allowed. The USB_CB_PROTOCOL_STALL
callback flag is set in the callback
flags to indicate the default pipe is
stalled.
Autoclearing is not allowed when the
request is USB_REQ_GET_STATUS on the
default pipe.
USB_ATTRS_ONE_XFER Applies only to interrupt-IN requests.
Without this flag, interrupt-IN
requests start periodic polling of the
interrupt pipe. This flag specifies to
perform only a single transfer. Do not
start periodic transfers with this
request.
USB_ATTRS_ISOC_START_FRAME Applies only to isochronous requests
and specifies that a request be started
at a given frame number. The starting
frame number is provided in the
isoc_frame_no field of the
usb_isoc_req_t. Please see
usb_isoc_request(9S) for more
information about isochronous requests.
USB_ATTRS_ISOC_START_FRAME can be used
to delay a transfer by a few frames,
allowing transfers to an endpoint to
sync up with another source. (For
example, synching up audio endpoints to
a video source.) The number of a
suitable starting frame in the near
future can be found by adding an offset
number of frames (usually between four
and ten) to the current frame number
returned from
usb_get_current_frame_number(9F). Note
that requests with starting frames
which have passed are rejected.
USB_ATTRS_ISOC_XFER_ASAP Applies only to isochronous requests
and specifies that a request start as
soon as possible. The host controller
driver picks a starting frame number
which immediately follows the last
frame of the last queued request. The
isoc_frame_no of the usb_isoc_req_t is
ignored. Please see
usb_isoc_request(9S) for more
information about isochronous requests.
EXAMPLES
/*
* Allocate, initialize and issue a synchronous bulk-IN request.
* Allow for short transfers.
*/
struct buf *bp;
usb_bulk_req_t bulk_req;
mblk_t *mblk;
bulk_req = usb_alloc_bulk_req(dip, bp->b_bcount, USB_FLAGS_SLEEP);
bulk_req->bulk_attributes =
USB_ATTRS_AUTOCLEARING | USB_ATTRS_SHORT_XFER_OK;
if ((rval = usb_pipe_bulk_xfer(pipe, bulk_req, USB_FLAGS_SLEEP)) !=
USB_SUCCESS) {
cmn_err (CE_WARN, "%s%d: Error reading bulk data.",
ddi_driver_name(dip), ddi_get_instance(dip));
}
mblk = bulk_req->bulk_data;
bcopy(mblk->rptr, buf->b_un.b_addr, mblk->wptr - mblk->rptr);
bp->b_resid = bp->b_count - (mblk->wptr = mblk->rptr);
...
...
----
usb_pipe_handle_t handle;
usb_frame_number_t offset = 10;
usb_isoc_req_t *isoc_req;
isoc_req = usb_alloc_isoc_req(...);
...
...
isoc_req->isoc_frame_no = usb_get_current_frame_number(dip) + offset;
isoc_req->isoc_attributes = USB_ATTRS_ISOC_START_FRAME;
...
...
if (usb_pipe_isoc_xfer(handle, isoc_req, 0) != USB_SUCCESS) {
...
}
ATTRIBUTES
See
attributes(7) for descriptions of the following attributes:
+--------------------+-------------------+
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
+--------------------+-------------------+
|Architecture | PCI-based systems |
+--------------------+-------------------+
|Interface stability | Committed |
+--------------------+-------------------+
SEE ALSO
usb_alloc_request(9F),
usb_get_current_frame_number(9F),
usb_pipe_bulk_xfer(9F),
usb_pipe_ctrl_xfer(9F),
usb_pipe_intr_xfer(9F),
usb_pipe_isoc_xfer(9F),
usb_bulk_request(9S),
usb_callback_flags(9S),
usb_completion_reason(9S),
usb_ctrl_request(9S),
usb_intr_request(9S),
usb_isoc_request(9S) January 5, 2004 USB_REQUEST_ATTRIBUTES(9S)