USB_REQUEST_ATTRIBUTES(9S) | Data Structures for Drivers | USB_REQUEST_ATTRIBUTES(9S) |
usb_request_attributes - Definition of USB request attributes
#include <sys/usb/usba.h>
illumos DDI specific (illumos DDI)
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
USB_ATTRS_PIPE_RESET
USB_ATTRS_AUTOCLEARING
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
USB_ATTRS_ISOC_START_FRAME
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
/*
* 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) {
...
}
See attributes(7) for descriptions of the following attributes:
ATTRIBUTE TYPE | ATTRIBUTE VALUE |
Architecture | PCI-based systems |
Interface stability | Committed |
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 | OmniOS |