USB_ALLOC_REQUEST(9F) | Kernel Functions for Drivers | USB_ALLOC_REQUEST(9F) |
#include <sys/usb/usba.h> usb_ctrl_req_t *usb_alloc_ctrl_req(dev_info_t *dip, size_t len, usb_flags_t flags);
void usb_free_ctrl_req(usb_ctrl_req_t *request);
usb_bulk_req_t *usb_alloc_bulk_req(dev_info_t dip, size_t len, usb_flags_t flags);
void usb_free_bulk_req(usb_bulk_req_t *request);
usb_intr_req_t *usb_alloc_intr_req(dev_info_t *dip, size_t len, usb_flags_t flags);
void usb_free_intr_req(usb_intr_req_t *request);
usb_isoc_req_t *usb_alloc_isoc_req(dev_info_t *dip, uint_t isoc_pkts_count, size_t len, usb_flags_t flags);
void usb_free_isoc_req(usb_isoc_req_t *request);
dip
len
flags
For usb_alloc_isoc_req():
dip
isoc_pkts_count
len
flags
For usb_free_ctrl_req(), usb_free_bulk_req(), usb_free_intr_req() and usb_free_isoc_req():
request
The usb_alloc_isoc_req() function also allocates a number of isochronous packet descriptors (usb_isoc_pkt_descr_t) specified by isoc_pkts_count to the end of the request proper (usb_isoc_req_t). See usb_isoc_request(9S) for more information on isochronous packet descriptors.
These functions always succeed when the USB_FLAGS_SLEEP flag is set, provided that they are given valid args and are not called from interrupt context.
The usb_free_ctrl_req(), usb_free_bulk_req(), usb_free_intr_req(), and usb_free_isoc_req() functions free their corresponding request. If the request's data block pointer is non-zero, the data block is also freed. For isoc requests, the array of packet descriptors is freed.
On success: returns a pointer to the appropriate usb_xxx_request_t.
On failure: returns NULL. Fails because the dip argument is invalid, USB_FLAGS_SLEEP is not set and memory is not available or because USB_FLAGS_SLEEP is set but the call was made in interrupt context.
For usb_free_ctrl_req(), usb_free_bulk_req(), usb_free_intr_req() and usb_free_isoc_req(): None.
The free routines may be called from kernel, user, and interrupt context.
/* This allocates and initializes an asynchronous control * request which will pass no data. Asynchronous requests * are used when they cannot block the calling thread. */ usb_ctrl_req_t *ctrl_req; if ((ctrl_req = usb_alloc_ctrl_req(dip, 0, 0)) == NULL) { return (FAILURE); } /* Now initialize. */ ctrl_req->ctrl_bmRequestType = USB_DEV_REQ_DEV_TO_HOST | USB_DEV_REQ_STANDARD | USB_DEV_REQ_RCPT_DEV; ctrl_req->ctrl_bRequest = (uint8_t)USB_REQ_GET_STATUS; ... ... ctrl_req->ctrl_callback = normal_callback; ctrl_req->ctrl_exc_callback = exception_callback; ... ...
ATTRIBUTE TYPE | ATTRIBUTE VALUE |
Architecture | PCI-based systems |
Interface stability | Committed |
July 25, 2004 | OmniOS |