29#ifdef USB_GLOBAL_INCLUDE_FILE
30#include USB_GLOBAL_INCLUDE_FILE
32#include <sys/stdint.h>
33#include <sys/stddef.h>
38#include <sys/kernel.h>
40#include <sys/module.h>
43#include <sys/condvar.h>
44#include <sys/sysctl.h>
46#include <sys/unistd.h>
47#include <sys/callout.h>
48#include <sys/malloc.h>
55#define USB_DEBUG_VAR usb_debug
89 .flags = {.proxy_buffer = 1,},
239 USB_ASSERT(align > 0, (
"Invalid alignment, 0x%08x\n",
266#ifdef USB_DMA_SINGLE_ALLOC
275 n_dma_pc = howmany(count, n_obj);
285 if (parm->
buf == NULL) {
295 for (x = 0; x != n_dma_pc; x++) {
300 for (x = 0; x !=
count; x++) {
322 for (x = 0; x != n_dma_pc; x++) {
332 for (x = 0; x != n_dma_pc; x++) {
348 for (y = 0; (y != n_obj); y++,
r--, pc++, pg += n_dma_pg) {
385 uint32_t max_packet_size;
386 uint32_t max_packet_count;
390 max_packet_count = 1;
399 (max_packet_size >> 11) & 3;
402 if (max_packet_count > 3)
403 max_packet_count = 3;
408 max_packet_size &= 0x7FF;
411 max_packet_count += (max_packet_size >> 11) & 3;
416 if ((max_packet_count == 0) ||
417 (max_packet_count > 16))
418 max_packet_count = 16;
422 max_packet_count = 1;
433 max_packet_count *= mult;
439 max_packet_size &= 0x7FF;
444 return (max_packet_size * max_packet_count);
503 switch (parm->
speed) {
608 uint16_t frame_limit;
620 switch (parm->
speed) {
638 if (xfer->
nframes > frame_limit) {
664 switch (parm->
speed) {
692 while ((temp != 0) && (temp < xfer->
interval)) {
697 switch (parm->
speed) {
718 if ((parm->
bufsize <= MIN_PKT) &&
784 if (parm->
bufsize <= REQ_SIZE) {
845 }
else if (parm->
buf != NULL) {
860 if (parm->
buf != NULL) {
930 for (x = 0; x != n_frbuffers; x++) {
965 uint8_t
type = setup_start[n_setup].
type;
988 const uint8_t *ifaces,
struct usb_xfer **ppxfer,
989 const struct usb_config *setup_start, uint16_t n_setup,
990 void *priv_sc,
struct mtx *xfer_mtx)
992 const struct usb_config *setup_end = setup_start + n_setup;
1004 WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL,
1005 "usbd_transfer_setup can sleep!");
1010 DPRINTFN(6,
"setup array has zero length!\n");
1013 if (ifaces == NULL) {
1014 DPRINTFN(6,
"ifaces array is NULL!\n");
1017 if (xfer_mtx == NULL) {
1018 DPRINTFN(6,
"using global lock\n");
1024 for (setup = setup_start,
n = 0;
1025 setup != setup_end; setup++,
n++) {
1047 memset(parm, 0,
sizeof(*parm));
1077 cv_init(&info->
cv_drain,
"WDRAIN");
1090 TAILQ_INIT(&info->
done_q.head);
1093 TAILQ_INIT(&info->dma_q.head);
1110 USB_BUS_CONTROL_XFER_PROC(udev->
bus);
1111 else if (xfer_mtx == &Giant)
1113 USB_BUS_GIANT_PROC(udev->
bus);
1116 USB_BUS_NON_GIANT_BULK_PROC(udev->
bus);
1119 USB_BUS_NON_GIANT_ISOC_PROC(udev->
bus);
1125 parm->
size[0] +=
sizeof(info[0]);
1127 for (setup = setup_start,
n = 0;
1128 setup != setup_end; setup++,
n++) {
1145 if ((ep == NULL) || (ep->
methods == NULL) ||
1187 memset(xfer, 0,
sizeof(*xfer));
1197 parm->
size[0] +=
sizeof(xfer[0]);
1228 panic(
"usbd_transfer_setup(): Refcount wrapped to zero\n");
1250 if (buf != NULL || parm->
err != 0)
1324 buf = malloc(parm->
size[0], M_USB, M_WAITOK | M_ZERO);
1325#if (USB_HAVE_MALLOC_WAITOK == 0)
1328 DPRINTFN(0,
"cannot allocate memory block for "
1329 "configuration (%d bytes)\n",
1397 pc = info->dma_page_cache_start;
1398 while (pc != info->dma_page_cache_end) {
1435 uint8_t needs_delay = 0;
1437 WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL,
1438 "usbd_transfer_unsetup can sleep!");
1441 xfer = pxfer[n_setup];
1467 pxfer[n_setup] = NULL;
1491 "reference count\n"));
1592 DPRINTFN(0,
"Too many frames: %u\n",
1620 DPRINTFN(0,
"Wrong framelength %u != %zu\n",
1634 DPRINTF(
"Misconfigured transfer\n");
1666 DPRINTFN(0,
"Length (%d) greater than "
1667 "remaining length (%d)\n",
len,
1679 DPRINTFN(0,
"Short control transfer without "
1680 "force_short_xfer set\n");
1699 DPRINTFN(0,
"Invalid parameter "
1728 DPRINTF(
"xfer=%p, endpoint=%p, nframes=%d, dir=%s\n",
1811 DPRINTF(
"xfer=%p nframes=0: stall "
1812 "or clear stall!\n", xfer);
1828 for (x = 0; x != xfer->
nframes; x++) {
2100 if (pq->
curr == xfer) {
2121 WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL,
2122 "usbd_transfer_drain can sleep!");
2158 KASSERT(frindex < xfer->max_frame_count, (
"frame index overflow"));
2168 KASSERT(frindex < xfer->max_frame_count, (
"frame index overflow"));
2171 return (page_info.
buffer);
2194 KASSERT(frindex < xfer->max_frame_count, (
"frame index overflow"));
2211 KASSERT(frindex < xfer->max_frame_count, (
"frame index overflow"));
2220 void **ptr,
int *
len)
2222 KASSERT(frindex < xfer->max_frame_count, (
"frame index overflow"));
2241 KASSERT(frindex < xfer->max_frame_count, (
"frame index overflow"));
2254 if (aframes != NULL)
2256 if (nframes != NULL)
2271 "when the USB buffer is external\n"));
2272 KASSERT(frindex < xfer->max_frame_count, (
"frame index overflow"));
2319 KASSERT(frindex < xfer->max_frame_count, (
"frame index overflow"));
2366 if (pq->
curr != xfer) {
2408 DPRINTFN(3,
"case 5 and 6\n");
2430 DPRINTFN(3,
"case 1-4\n");
2534 DPRINTFN(3,
"Completed %p\n", xfer);
2555 TAILQ_REMOVE(&pq->head, xfer, wait_entry);
2577 TAILQ_INSERT_TAIL(&pq->head, xfer, wait_entry);
2606 DPRINTF(
"not transferring\n");
2635 if (pq->
curr == xfer) {
2682 if (xfer->
error == 0)
2732 DPRINTFN(1,
"Sending zero-length packet.\n");
2844 udev, ep, &did_stall);
2852 DPRINTFN(0,
"No stall handler\n");
2916 if (xfer->
error == 0)
2987 bus->methods->start_dma_delay != NULL)) {
2998 DPRINTFN(3,
"DMA delay, %u ms, "
2999 "on %p\n", temp, xfer);
3009 if (
bus->methods->start_dma_delay != NULL) {
3010 (
bus->methods->start_dma_delay) (xfer);
3022 if (xfer->
error == 0) {
3023 panic(
"%s: actual number of frames, %d, is "
3024 "greater than initial number of frames, %d\n",
3034 for (x = 0; x != xfer->
aframes; x++) {
3043 for (; x < xfer->
nframes; x++) {
3049 if (xfer->
error == 0) {
3050 panic(
"%s: actual length, %d, is greater than "
3051 "initial length, %d\n",
3058 DPRINTFN(1,
"xfer=%p endpoint=%p sts=%d alen=%d, slen=%d, afrm=%d, nfrm=%d\n",
3066#if USB_HAVE_TT_SUPPORT
3067 switch (xfer->
error) {
3085 DPRINTFN(2,
"xfer=%p: Block On Failure "
3086 "on endpoint=%p\n", xfer, xfer->
endpoint);
3098 DPRINTFN(2,
"xfer=%p: Block On Failure on "
3099 "Short Transfer on endpoint %p.\n",
3110 DPRINTFN(5,
"xfer=%p: Control transfer "
3111 "active on endpoint=%p\n", xfer, xfer->
endpoint);
3155 if (pq->
curr != xfer) {
3157 if (pq->
curr != NULL) {
3159 DPRINTFN(6,
"busy %p\n", pq->
curr);
3177 if (pq->
curr == NULL) {
3178 xfer = TAILQ_FIRST(&pq->head);
3180 TAILQ_REMOVE(&pq->head, xfer,
3188 DPRINTFN(6,
"cb %p (enter)\n", pq->
curr);
3190 DPRINTFN(6,
"cb %p (leave)\n", pq->
curr);
3220 uint8_t iface_index;
3281 DPRINTFN(0,
"could not setup default "
3317 DPRINTFN(5,
"udev=%p endpoint=%p\n", udev, ep);
3361 if (xfer2 == NULL) {
3363 DPRINTF(
"NULL input parameter\n");
3436 uint16_t drop_bus_spin;
3440 for (
n = 0;
n != max;
n++) {
3445 xroot = xfer->
xroot;
3454 if (
bus->methods == NULL)
3456 if (
bus->methods->xfer_poll == NULL)
3465 while (mtx_owned(&
bus->bus_spin_lock)) {
3466 mtx_unlock_spin(&
bus->bus_spin_lock);
3471 while (mtx_owned(&
bus->bus_mtx)) {
3472 mtx_unlock(&
bus->bus_mtx);
3477 while (mtx_owned(xroot->
xfer_mtx)) {
3484 USB_BUS_CONTROL_XFER_PROC(
bus)->up_msleep = 0;
3485 USB_BUS_EXPLORE_PROC(
bus)->up_msleep = 0;
3486 USB_BUS_GIANT_PROC(
bus)->up_msleep = 0;
3487 USB_BUS_NON_GIANT_ISOC_PROC(
bus)->up_msleep = 0;
3488 USB_BUS_NON_GIANT_BULK_PROC(
bus)->up_msleep = 0;
3491 (
bus->methods->xfer_poll) (
bus);
3518 mtx_lock(&
bus->bus_mtx);
3521 while (drop_bus_spin--)
3522 mtx_lock_spin(&
bus->bus_spin_lock);
3564 memset(ptr, 0,
sizeof(*ptr));
3568 ptr->
range.
max = intr_range_max[speed];
3571 ptr->
range.
max = isoc_range_max[speed];
3575 temp = bulk_min[speed];
3577 temp = control_min[speed];
3580 ptr->
fixed[0] = temp;
3581 ptr->
fixed[1] = temp;
3582 ptr->
fixed[2] = temp;
3583 ptr->
fixed[3] = temp;
3594 ptr->
fixed[2] = 1024;
3595 ptr->
fixed[3] = 1536;
3693 uint32_t frame_min, uint32_t frame_ms, uint32_t frame_mask, uint32_t *p_frame_start)
3709 delta < (frame_ms + frame_min) ||
3710 delta > (frame_mask / 2)) {
3712 xfer->
endpoint->
isoc_next = (frame_curr + 2 * frame_ms + frame_min) & frame_mask;
3721 if (p_frame_start != NULL)
3726 delta &= frame_mask;
3739 duration = ((xfer->
nframes << shift) + 7) / 8;
void(* get_dma_delay)(struct usb_device *, uint32_t *)
void(* set_stall)(struct usb_device *udev, struct usb_endpoint *ep, uint8_t *did_stall)
void(* clear_stall)(struct usb_device *udev, struct usb_endpoint *ep)
void(* xfer_setup)(struct usb_setup_params *)
const struct usb_bus_methods * methods
struct usb_xfer_flags flags
enum usb_hc_mode usb_mode
usb_callback_t * callback
enum usb_hc_mode usb_mode
union usb_device_scratch scratch
struct usb_xfer * ctrl_xfer[USB_CTRL_XFER_MAX]
struct usb_device_statistics stats_err
struct usb_device_statistics stats_ok
struct usb_device_descriptor ddesc
uint32_t clear_stall_errors
struct usb_device * parent_hub
struct usb_device_statistics stats_cancelled
struct usb_udev_msg cs_msg[2]
struct usb_device_flags flags
struct usb_endpoint_descriptor ctrl_ep_desc
struct usb_xfer_root * xroot
struct usb_endpoint_ss_comp_descriptor * ecomp
struct usb_xfer_queue endpoint_q[USB_MAX_EP_STREAMS]
const struct usb_pipe_methods * methods
struct usb_endpoint_descriptor * edesc
struct usb_dma_parent_tag * tag_parent
void(* enter)(struct usb_xfer *)
void(* close)(struct usb_xfer *)
void(* open)(struct usb_xfer *)
void(* start)(struct usb_xfer *)
usb_proc_callback_t * pm_callback
uint32_t hc_max_frame_size
struct usb_page_cache * dma_page_cache_ptr
uint8_t hc_max_packet_count
struct usb_page * dma_page_ptr
struct usb_xfer * curr_xfer
struct usb_page_cache * xfer_page_cache_ptr
uint16_t hc_max_packet_size
usb_frlength_t bufsize_max
const struct usb_pipe_methods * methods
usb_frlength_t * xfer_length_ptr
const struct usb_config * curr_setup
struct usb_dma_tag * dma_tag_p
struct usb_std_packet_size::@91 range
enum usb_hc_mode usb_mode
void(* command)(struct usb_xfer_queue *pq)
struct usb_dma_parent_tag dma_parent_tag
struct usb_page_cache * xfer_page_cache_start
struct usb_page_cache * xfer_page_cache_end
struct usb_done_msg done_m[2]
struct usb_xfer_queue done_q
struct usb_process * done_p
usb_size_t setup_refcount
usb_frlength_t * frlengths
struct usb_page * dma_page_ptr
struct usb_xfer_queue * wait_queue
usb_frlength_t max_data_length
struct usb_page_cache * frbuffers
struct usb_callout timeout_handle
struct usb_endpoint * endpoint
struct usb_xfer_flags_int flags_int
usb_callback_t * callback
struct usb_xfer_flags flags
struct usb_xfer_root * xroot
usb_frlength_t max_hc_frame_size
usb_frcount_t max_frame_count
uint16_t isoc_time_complete
struct usb_setup_params parm
struct usb_device_scratch::@85 xfer_setup[1]
#define UT_WRITE_ENDPOINT
#define UE_GET_SS_ISO_MULT(x)
#define USB_BUS_CS_PROC(bus)
void usbd_get_page(struct usb_page_cache *pc, usb_frlength_t offset, struct usb_page_search *res)
void usbd_copy_in(struct usb_page_cache *cache, usb_frlength_t offset, const void *ptr, usb_frlength_t len)
void usbd_copy_out(struct usb_page_cache *cache, usb_frlength_t offset, void *ptr, usb_frlength_t len)
void usb_pc_dmamap_destroy(struct usb_page_cache *pc)
void usb_bdma_work_loop(struct usb_xfer_queue *pq)
void usb_pc_free_mem(struct usb_page_cache *pc)
uint8_t usb_pc_dmamap_create(struct usb_page_cache *pc, usb_size_t size)
uint8_t usb_pc_load_mem(struct usb_page_cache *pc, usb_size_t size, uint8_t sync)
void usb_dma_tag_setup(struct usb_dma_parent_tag *udpt, struct usb_dma_tag *udt, bus_dma_tag_t dmat, struct mtx *mtx, usb_dma_callback_t *func, uint8_t ndmabits, uint8_t nudt)
void usb_dma_tag_unsetup(struct usb_dma_parent_tag *udpt)
void usb_bdma_done_event(struct usb_dma_parent_tag *udpt)
void usb_bdma_post_sync(struct usb_xfer *xfer)
uint8_t usb_pc_alloc_mem(struct usb_page_cache *pc, struct usb_page *pg, usb_size_t size, usb_size_t align)
uint16_t usb_isoc_time_expand(struct usb_bus *bus, uint16_t isoc_time_curr)
#define USB_GET_DATA_ISREAD(xfer)
#define USB_XFER_LOCK(_x)
#define USB_ADD_BYTES(ptr, size)
#define USB_BUS_UNLOCK(_b)
#define USB_XFER_LOCK_ASSERT(_x, _t)
#define USB_XFER_UNLOCK(_x)
#define USB_BUS_LOCK_ASSERT(_b, _t)
void usb_dump_endpoint(struct usb_endpoint *ep)
enum usb_dev_speed usbd_get_speed(struct usb_device *udev)
uint8_t usbd_ctrl_lock(struct usb_device *udev)
void usbd_ctrl_unlock(struct usb_device *udev)
struct usb_endpoint * usbd_get_endpoint(struct usb_device *udev, uint8_t iface_index, const struct usb_config *setup)
#define USB_CTRL_XFER_MAX
const char * usbd_errstr(usb_error_t err)
#define USB_CALLOUT_ZERO_TICKS
#define USB_MAX_FS_ISOC_FRAMES_PER_XFER
#define USB_MAX_HS_ISOC_FRAMES_PER_XFER
#define USB_MAX_EP_STREAMS
#define USB_IN_POLLING_MODE_FUNC()
void usbpf_xfertap(struct usb_xfer *xfer, int type)
#define USBPF_XFERTAP_DONE
#define USBPF_XFERTAP_SUBMIT
void usb_proc_mwait(struct usb_process *up, void *_pm0, void *_pm1)
void * usb_proc_msignal(struct usb_process *up, void *_pm0, void *_pm1)
void usbd_xfer_set_timeout(struct usb_xfer *xfer, int t)
void usbd_xfer_set_flag(struct usb_xfer *xfer, int flag)
uint8_t usbd_xfer_get_and_clr_zlp(struct usb_xfer *xfer)
void usbd_transfer_submit(struct usb_xfer *xfer)
void usbd_xfer_set_frames(struct usb_xfer *xfer, usb_frcount_t n)
void usbd_pipe_enter(struct usb_xfer *xfer)
uint32_t usbd_get_max_frame_length(const struct usb_endpoint_descriptor *edesc, const struct usb_endpoint_ss_comp_descriptor *ecomp, enum usb_dev_speed speed)
void * usbd_xfer_get_priv(struct usb_xfer *xfer)
usb_frcount_t usbd_xfer_max_frames(struct usb_xfer *xfer)
uint8_t usbd_xfer_state(struct usb_xfer *xfer)
static uint8_t usbd_transfer_setup_has_bulk(const struct usb_config *setup_start, uint16_t n_setup)
void usbd_transfer_setup_sub(struct usb_setup_params *parm)
void usbd_transfer_unsetup(struct usb_xfer **pxfer, uint16_t n_setup)
void usbd_xfer_set_frame_data(struct usb_xfer *xfer, usb_frcount_t frindex, void *ptr, usb_frlength_t len)
void usbd_transfer_done(struct usb_xfer *xfer, usb_error_t error)
void usbd_xfer_set_frame_len(struct usb_xfer *xfer, usb_frcount_t frindex, usb_frlength_t len)
static void usbd_callback_ss_done_defer(struct usb_xfer *)
uint8_t usbd_clear_stall_callback(struct usb_xfer *xfer1, struct usb_xfer *xfer2)
static const struct usb_config usb_control_ep_cfg[USB_CTRL_XFER_MAX]
usb_frlength_t usbd_xfer_old_frame_length(struct usb_xfer *xfer, usb_frcount_t frindex)
void usbd_transfer_clear_stall(struct usb_xfer *xfer)
void usbd_ctrl_transfer_setup(struct usb_device *udev)
uint8_t usbd_xfer_get_fps_shift(struct usb_xfer *xfer)
usb_frlength_t usbd_xfer_frame_len(struct usb_xfer *xfer, usb_frcount_t frindex)
static int usbd_setup_ctrl_transfer(struct usb_xfer *)
usb_frlength_t usbd_xfer_max_framelen(struct usb_xfer *xfer)
uint16_t usbd_xfer_get_timestamp(struct usb_xfer *xfer)
static void usbd_update_max_frame_size(struct usb_xfer *)
void * usbd_xfer_get_frame_buffer(struct usb_xfer *xfer, usb_frcount_t frindex)
static const struct usb_config usb_control_ep_quirk_cfg[USB_CTRL_XFER_MAX]
struct usb_page_cache * usbd_xfer_get_frame(struct usb_xfer *xfer, usb_frcount_t frindex)
uint8_t usbd_xfer_maxp_was_clamped(struct usb_xfer *xfer)
usb_error_t usbd_transfer_setup(struct usb_device *udev, const uint8_t *ifaces, struct usb_xfer **ppxfer, const struct usb_config *setup_start, uint16_t n_setup, void *priv_sc, struct mtx *xfer_mtx)
void usbd_transfer_start(struct usb_xfer *xfer)
void usb_dma_delay_done_cb(struct usb_xfer *xfer)
void usbd_xfer_frame_data(struct usb_xfer *xfer, usb_frcount_t frindex, void **ptr, int *len)
static void usbd_transfer_unsetup_sub(struct usb_xfer_root *, uint8_t)
void usbd_transfer_dequeue(struct usb_xfer *xfer)
int usbd_xfer_is_stalled(struct usb_xfer *xfer)
static void usbd_callback_wrapper(struct usb_xfer_queue *)
usb_timeout_t usbd_get_dma_delay(struct usb_device *udev)
static uint8_t usbd_callback_wrapper_sub(struct usb_xfer *)
static void usb_callback_proc(struct usb_proc_msg *)
void usbd_xfer_set_priv(struct usb_xfer *xfer, void *ptr)
void usb_command_wrapper(struct usb_xfer_queue *pq, struct usb_xfer *xfer)
void usbd_transfer_drain(struct usb_xfer *xfer)
void usbd_xfer_set_frame_offset(struct usb_xfer *xfer, usb_frlength_t offset, usb_frcount_t frindex)
void usbd_xfer_clr_flag(struct usb_xfer *xfer, int flag)
void usbd_transfer_poll(struct usb_xfer **ppxfer, uint16_t max)
void usbd_pipe_start(struct usb_xfer_queue *pq)
void * usbd_xfer_softc(struct usb_xfer *xfer)
void usbd_xfer_set_stall(struct usb_xfer *xfer)
void usbd_xfer_set_interval(struct usb_xfer *xfer, int i)
void usbd_transfer_stop(struct usb_xfer *xfer)
void usbd_xfer_set_zlp(struct usb_xfer *xfer)
void usbd_transfer_enqueue(struct usb_xfer_queue *pq, struct usb_xfer *xfer)
void usbd_xfer_status(struct usb_xfer *xfer, int *actlen, int *sumlen, int *aframes, int *nframes)
uint8_t usbd_xfer_get_isochronous_start_frame(struct usb_xfer *xfer, uint32_t frame_curr, uint32_t frame_min, uint32_t frame_ms, uint32_t frame_mask, uint32_t *p_frame_start)
void usbd_transfer_timeout_ms(struct usb_xfer *xfer, void(*cb)(void *arg), usb_timeout_t ms)
static void usbd_control_transfer_init(struct usb_xfer *)
static void usbd_transfer_start_cb(void *)
static void usbd_get_std_packet_size(struct usb_std_packet_size *ptr, uint8_t type, enum usb_dev_speed speed)
usb_frlength_t usbd_xfer_max_len(struct usb_xfer *xfer)
void usbd_clear_stall_locked(struct usb_device *udev, struct usb_endpoint *ep)
uint8_t usbd_transfer_pending(struct usb_xfer *xfer)
void usbd_clear_data_toggle(struct usb_device *udev, struct usb_endpoint *ep)
static usb_callback_t usb_request_callback
static uint8_t usbd_control_transfer_did_data(struct usb_xfer *xfer)
usb_callback_t usb_handle_request_callback
usb_callback_t usb_do_clear_stall_callback
uint8_t usbd_transfer_setup_sub_malloc(struct usb_setup_params *parm, struct usb_page_cache **ppc, usb_size_t size, usb_size_t align, usb_size_t count)
usb_callback_t usbd_do_request_callback
void usbd_transfer_power_ref(struct usb_xfer *xfer, int val)
void usb_pause_mtx(struct mtx *mtx, int timo)
#define USB_MTX_UNLOCK(_m)
#define usb_callout_init_mtx(c, m, f)
#define USB_MANUAL_STATUS
#define USB_FORCE_SHORT_XFER
#define usb_callout_reset(c,...)
@ USB_ERR_NORMAL_COMPLETION
#define USB_SHORT_XFER_OK
#define usb_callout_drain(c)
#define USB_ST_TRANSFERRED
#define USB_MS_TO_TICKS(ms)
void() usb_callback_t(struct usb_xfer *, usb_error_t)
#define usb_callout_stop(c)
#define USB_GET_STATE(xfer)
#define USB_MULTI_SHORT_OK