diff options
| author | Andrew Thompson <thompsa@FreeBSD.org> | 2009-01-13 19:03:12 +0000 |
|---|---|---|
| committer | Andrew Thompson <thompsa@FreeBSD.org> | 2009-01-13 19:03:12 +0000 |
| commit | 13bd84042e7965cb455b03d55dba5440d3d47154 (patch) | |
| tree | 519a4c63c1a67b3734b84daa7d5a69bd66415caa /sys/dev/usb2/core | |
| parent | f892798d89d68fa805d79dca4297b2730aa258f4 (diff) | |
Notes
Diffstat (limited to 'sys/dev/usb2/core')
| -rw-r--r-- | sys/dev/usb2/core/usb2_busdma.c | 14 | ||||
| -rw-r--r-- | sys/dev/usb2/core/usb2_core.h | 11 | ||||
| -rw-r--r-- | sys/dev/usb2/core/usb2_debug.c | 12 | ||||
| -rw-r--r-- | sys/dev/usb2/core/usb2_handle_request.c | 22 | ||||
| -rw-r--r-- | sys/dev/usb2/core/usb2_hub.c | 2 | ||||
| -rw-r--r-- | sys/dev/usb2/core/usb2_request.c | 28 | ||||
| -rw-r--r-- | sys/dev/usb2/core/usb2_transfer.c | 192 | ||||
| -rw-r--r-- | sys/dev/usb2/core/usb2_transfer.h | 10 |
8 files changed, 149 insertions, 142 deletions
diff --git a/sys/dev/usb2/core/usb2_busdma.c b/sys/dev/usb2/core/usb2_busdma.c index be99e00d4abc..6c1f182e34ac 100644 --- a/sys/dev/usb2/core/usb2_busdma.c +++ b/sys/dev/usb2/core/usb2_busdma.c @@ -1226,15 +1226,15 @@ usb2_bdma_work_loop(struct usb2_xfer_queue *pq) uint32_t nframes; xfer = pq->curr; - info = xfer->usb2_root; + info = xfer->xroot; - mtx_assert(info->priv_mtx, MA_OWNED); + mtx_assert(info->xfer_mtx, MA_OWNED); if (xfer->error) { /* some error happened */ - USB_BUS_LOCK(xfer->udev->bus); + USB_BUS_LOCK(info->bus); usb2_transfer_done(xfer, 0); - USB_BUS_UNLOCK(xfer->udev->bus); + USB_BUS_UNLOCK(info->bus); return; } if (!xfer->flags_int.bdma_setup) { @@ -1306,9 +1306,9 @@ usb2_bdma_work_loop(struct usb2_xfer_queue *pq) } if (info->dma_error) { - USB_BUS_LOCK(xfer->udev->bus); + USB_BUS_LOCK(info->bus); usb2_transfer_done(xfer, USB_ERR_DMA_LOAD_FAILED); - USB_BUS_UNLOCK(xfer->udev->bus); + USB_BUS_UNLOCK(info->bus); return; } if (info->dma_currframe != info->dma_nframes) { @@ -1352,7 +1352,7 @@ usb2_bdma_done_event(struct usb2_dma_parent_tag *udpt) info = udpt->info; - mtx_assert(info->priv_mtx, MA_OWNED); + mtx_assert(info->xfer_mtx, MA_OWNED); /* copy error */ info->dma_error = udpt->dma_error; diff --git a/sys/dev/usb2/core/usb2_core.h b/sys/dev/usb2/core/usb2_core.h index 217ba38698bf..156ec5d29705 100644 --- a/sys/dev/usb2/core/usb2_core.h +++ b/sys/dev/usb2/core/usb2_core.h @@ -160,9 +160,9 @@ #define USB_BUS_LOCK(_b) mtx_lock(&(_b)->bus_mtx) #define USB_BUS_UNLOCK(_b) mtx_unlock(&(_b)->bus_mtx) #define USB_BUS_LOCK_ASSERT(_b, _t) mtx_assert(&(_b)->bus_mtx, _t) -#define USB_XFER_LOCK(_x) mtx_lock((_x)->xfer_mtx) -#define USB_XFER_UNLOCK(_x) mtx_unlock((_x)->xfer_mtx) -#define USB_XFER_LOCK_ASSERT(_x, _t) mtx_assert((_x)->xfer_mtx, _t) +#define USB_XFER_LOCK(_x) mtx_lock((_x)->xroot->xfer_mtx) +#define USB_XFER_UNLOCK(_x) mtx_unlock((_x)->xroot->xfer_mtx) +#define USB_XFER_LOCK_ASSERT(_x, _t) mtx_assert((_x)->xroot->xfer_mtx, _t) /* structure prototypes */ struct file; @@ -307,10 +307,7 @@ struct usb2_xfer { * are waiting on */ struct usb2_page *dma_page_ptr; struct usb2_pipe *pipe; /* our USB pipe */ - struct usb2_device *udev; - struct mtx *xfer_mtx; /* cannot be changed during operation */ - struct usb2_xfer_root *usb2_root; /* used by HC driver */ - void *usb2_sc; /* used by HC driver */ + struct usb2_xfer_root *xroot; /* used by HC driver */ void *qh_start[2]; /* used by HC driver */ void *td_start[2]; /* used by HC driver */ void *td_transfer_first; /* used by HC driver */ diff --git a/sys/dev/usb2/core/usb2_debug.c b/sys/dev/usb2/core/usb2_debug.c index dc9067d1332c..46d27b4eda4e 100644 --- a/sys/dev/usb2/core/usb2_debug.c +++ b/sys/dev/usb2/core/usb2_debug.c @@ -31,6 +31,8 @@ #include <dev/usb2/core/usb2_debug.h> #include <dev/usb2/core/usb2_process.h> #include <dev/usb2/core/usb2_device.h> +#include <dev/usb2/core/usb2_busdma.h> +#include <dev/usb2/core/usb2_transfer.h> /* * Define this unconditionally in case a kernel module is loaded that @@ -128,6 +130,7 @@ usb2_dump_pipe(struct usb2_pipe *pipe) void usb2_dump_xfer(struct usb2_xfer *xfer) { + struct usb2_device *udev; printf("usb2_dump_xfer: xfer=%p\n", xfer); if (xfer == NULL) { return; @@ -137,12 +140,13 @@ usb2_dump_xfer(struct usb2_xfer *xfer) xfer); return; } + udev = xfer->xroot->udev; printf("xfer %p: udev=%p vid=0x%04x pid=0x%04x addr=%d " "pipe=%p ep=0x%02x attr=0x%02x\n", - xfer, xfer->udev, - UGETW(xfer->udev->ddesc.idVendor), - UGETW(xfer->udev->ddesc.idProduct), - xfer->udev->address, xfer->pipe, + xfer, udev, + UGETW(udev->ddesc.idVendor), + UGETW(udev->ddesc.idProduct), + udev->address, xfer->pipe, xfer->pipe->edesc->bEndpointAddress, xfer->pipe->edesc->bmAttributes); } diff --git a/sys/dev/usb2/core/usb2_handle_request.c b/sys/dev/usb2/core/usb2_handle_request.c index c7659978b53a..65f0f0187d72 100644 --- a/sys/dev/usb2/core/usb2_handle_request.c +++ b/sys/dev/usb2/core/usb2_handle_request.c @@ -86,7 +86,7 @@ usb2_handle_request_callback(struct usb2_xfer *xfer) if (err == USB_ERR_BAD_CONTEXT) { /* we need to re-setup the control transfer */ - usb2_needs_explore(xfer->udev->bus, 0); + usb2_needs_explore(xfer->xroot->bus, 0); break; } /* @@ -126,6 +126,7 @@ tr_restart: static usb2_error_t usb2_handle_set_config(struct usb2_xfer *xfer, uint8_t conf_no) { + struct usb2_device *udev = xfer->xroot->udev; usb2_error_t err = 0; /* @@ -134,7 +135,7 @@ usb2_handle_set_config(struct usb2_xfer *xfer, uint8_t conf_no) */ USB_XFER_UNLOCK(xfer); mtx_lock(&Giant); /* XXX */ - sx_xlock(xfer->udev->default_sx + 1); + sx_xlock(udev->default_sx + 1); if (conf_no == USB_UNCONFIG_NO) { conf_no = USB_UNCONFIG_INDEX; @@ -146,19 +147,19 @@ usb2_handle_set_config(struct usb2_xfer *xfer, uint8_t conf_no) conf_no--; } - if (usb2_set_config_index(xfer->udev, conf_no)) { + if (usb2_set_config_index(udev, conf_no)) { DPRINTF("set config %d failed\n", conf_no); err = USB_ERR_STALLED; goto done; } - if (usb2_probe_and_attach(xfer->udev, USB_IFACE_INDEX_ANY)) { + if (usb2_probe_and_attach(udev, USB_IFACE_INDEX_ANY)) { DPRINTF("probe and attach failed\n"); err = USB_ERR_STALLED; goto done; } done: mtx_unlock(&Giant); /* XXX */ - sx_unlock(xfer->udev->default_sx + 1); + sx_unlock(udev->default_sx + 1); USB_XFER_LOCK(xfer); return (err); } @@ -177,7 +178,7 @@ usb2_handle_iface_request(struct usb2_xfer *xfer, { struct usb2_interface *iface; struct usb2_interface *iface_parent; /* parent interface */ - struct usb2_device *udev = xfer->udev; + struct usb2_device *udev = xfer->xroot->udev; int error; uint8_t iface_index; @@ -332,11 +333,12 @@ tr_stalled: static usb2_error_t usb2_handle_set_stall(struct usb2_xfer *xfer, uint8_t ep, uint8_t do_stall) { + struct usb2_device *udev = xfer->xroot->udev; usb2_error_t err; USB_XFER_UNLOCK(xfer); - err = usb2_set_endpoint_stall(xfer->udev, - usb2_get_pipe_by_addr(xfer->udev, ep), do_stall); + err = usb2_set_endpoint_stall(udev, + usb2_get_pipe_by_addr(udev, ep), do_stall); USB_XFER_LOCK(xfer); return (err); } @@ -379,7 +381,7 @@ usb2_handle_remote_wakeup(struct usb2_xfer *xfer, uint8_t is_on) struct usb2_device *udev; struct usb2_bus *bus; - udev = xfer->udev; + udev = xfer->xroot->udev; bus = udev->bus; USB_BUS_LOCK(bus); @@ -479,7 +481,7 @@ usb2_handle_request(struct usb2_xfer *xfer) max_len = 0; src_zcopy = NULL; src_mcopy = NULL; - udev = xfer->udev; + udev = xfer->xroot->udev; /* get some request fields decoded */ diff --git a/sys/dev/usb2/core/usb2_hub.c b/sys/dev/usb2/core/usb2_hub.c index e5c9c8dd903f..cbc1763827a7 100644 --- a/sys/dev/usb2/core/usb2_hub.c +++ b/sys/dev/usb2/core/usb2_hub.c @@ -1429,7 +1429,7 @@ usb2_transfer_power_ref(struct usb2_xfer *xfer, int val) uint8_t needs_hw_power; uint8_t xfer_type; - udev = xfer->udev; + udev = xfer->xroot->udev; if (udev->device_index == USB_ROOT_HUB_ADDR) { /* no power save for root HUB */ diff --git a/sys/dev/usb2/core/usb2_request.c b/sys/dev/usb2/core/usb2_request.c index b1eb81fa9b10..3e48dc1ba0c7 100644 --- a/sys/dev/usb2/core/usb2_request.c +++ b/sys/dev/usb2/core/usb2_request.c @@ -80,7 +80,7 @@ usb2_do_request_callback(struct usb2_xfer *xfer) usb2_start_hardware(xfer); break; default: - usb2_cv_signal(xfer->udev->default_cv); + usb2_cv_signal(xfer->xroot->udev->default_cv); break; } } @@ -94,18 +94,21 @@ void usb2_do_clear_stall_callback(struct usb2_xfer *xfer) { struct usb2_device_request req; + struct usb2_device *udev; struct usb2_pipe *pipe; struct usb2_pipe *pipe_end; struct usb2_pipe *pipe_first; uint8_t to = USB_EP_MAX; - USB_BUS_LOCK(xfer->udev->bus); + udev = xfer->xroot->udev; + + USB_BUS_LOCK(udev->bus); /* round robin pipe clear stall */ - pipe = xfer->udev->pipe_curr; - pipe_end = xfer->udev->pipes + USB_EP_MAX; - pipe_first = xfer->udev->pipes; + pipe = udev->pipe_curr; + pipe_end = udev->pipes + USB_EP_MAX; + pipe_first = udev->pipes; if (pipe == NULL) { pipe = pipe_first; } @@ -145,11 +148,11 @@ tr_setup: /* set length */ xfer->frlengths[0] = sizeof(req); xfer->nframes = 1; - USB_BUS_UNLOCK(xfer->udev->bus); + USB_BUS_UNLOCK(udev->bus); usb2_start_hardware(xfer); - USB_BUS_LOCK(xfer->udev->bus); + USB_BUS_LOCK(udev->bus); break; } pipe++; @@ -165,8 +168,8 @@ tr_setup: } /* store current pipe */ - xfer->udev->pipe_curr = pipe; - USB_BUS_UNLOCK(xfer->udev->bus); + udev->pipe_curr = pipe; + USB_BUS_UNLOCK(udev->bus); } /*------------------------------------------------------------------------* @@ -367,7 +370,8 @@ usb2_do_request_flags(struct usb2_device *udev, struct mtx *mtx, } if (temp > 0) { usb2_pause_mtx( - xfer->xfer_mtx, temp); + xfer->xroot->xfer_mtx, + temp); } #endif xfer->flags.manual_status = 0; @@ -384,8 +388,8 @@ usb2_do_request_flags(struct usb2_device *udev, struct mtx *mtx, if ((flags & USB_USE_POLLING) || cold) { usb2_do_poll(udev->default_xfer, USB_DEFAULT_XFER_MAX); } else { - usb2_cv_wait(xfer->udev->default_cv, - xfer->xfer_mtx); + usb2_cv_wait(udev->default_cv, + xfer->xroot->xfer_mtx); } } diff --git a/sys/dev/usb2/core/usb2_transfer.c b/sys/dev/usb2/core/usb2_transfer.c index c415b88d9ca4..2237c7ec286d 100644 --- a/sys/dev/usb2/core/usb2_transfer.c +++ b/sys/dev/usb2/core/usb2_transfer.c @@ -243,12 +243,12 @@ usb2_transfer_setup_sub_malloc(struct usb2_setup_params *parm, for (x = 0; x != n_dma_pc; x++) { /* need to initialize the page cache */ parm->dma_page_cache_ptr[x].tag_parent = - &parm->curr_xfer->usb2_root->dma_parent_tag; + &parm->curr_xfer->xroot->dma_parent_tag; } for (x = 0; x != count; x++) { /* need to initialize the page cache */ parm->xfer_page_cache_ptr[x].tag_parent = - &parm->curr_xfer->usb2_root->dma_parent_tag; + &parm->curr_xfer->xroot->dma_parent_tag; } if (ppc) { @@ -670,7 +670,7 @@ usb2_transfer_setup_sub(struct usb2_setup_params *parm) if (parm->buf) { for (x = 0; x != n_frbuffers; x++) { xfer->frbuffers[x].tag_parent = - &xfer->usb2_root->dma_parent_tag; + &xfer->xroot->dma_parent_tag; if (xfer->flags_int.bdma_enable && (parm->bufsize_max > 0)) { @@ -715,7 +715,7 @@ usb2_error_t usb2_transfer_setup(struct usb2_device *udev, const uint8_t *ifaces, struct usb2_xfer **ppxfer, const struct usb2_config *setup_start, uint16_t n_setup, - void *priv_sc, struct mtx *priv_mtx) + void *priv_sc, struct mtx *xfer_mtx) { struct usb2_xfer dummy; struct usb2_setup_params parm; @@ -745,9 +745,9 @@ usb2_transfer_setup(struct usb2_device *udev, DPRINTFN(6, "ifaces array is NULL!\n"); return (USB_ERR_INVAL); } - if (priv_mtx == NULL) { + if (xfer_mtx == NULL) { DPRINTFN(6, "using global lock\n"); - priv_mtx = &Giant; + xfer_mtx = &Giant; } /* sanity checks */ for (setup = setup_start, n = 0; @@ -799,13 +799,14 @@ usb2_transfer_setup(struct usb2_device *udev, usb2_cv_init(&info->cv_drain, "WDRAIN"); - info->priv_mtx = priv_mtx; + info->xfer_mtx = xfer_mtx; usb2_dma_tag_setup(&info->dma_parent_tag, parm.dma_tag_p, udev->bus->dma_parent_tag[0].tag, - priv_mtx, &usb2_bdma_done_event, info, 32, parm.dma_tag_max); + xfer_mtx, &usb2_bdma_done_event, info, 32, parm.dma_tag_max); info->bus = udev->bus; + info->udev = udev; TAILQ_INIT(&info->done_q.head); info->done_q.command = &usb2_callback_wrapper; @@ -814,9 +815,9 @@ usb2_transfer_setup(struct usb2_device *udev, info->dma_q.command = &usb2_bdma_work_loop; info->done_m[0].hdr.pm_callback = &usb2_callback_proc; - info->done_m[0].usb2_root = info; + info->done_m[0].xroot = info; info->done_m[1].hdr.pm_callback = &usb2_callback_proc; - info->done_m[1].usb2_root = info; + info->done_m[1].xroot = info; /* create a callback thread */ @@ -871,11 +872,9 @@ usb2_transfer_setup(struct usb2_device *udev, xfer = USB_ADD_BYTES(buf, parm.size[0]); ppxfer[n] = xfer; - xfer->udev = udev; xfer->address = udev->address; xfer->priv_sc = priv_sc; - xfer->xfer_mtx = priv_mtx; - xfer->usb2_root = info; + xfer->xroot = info; info->setup_refcount++; usb2_callout_init_mtx(&xfer->timeout_handle, @@ -1100,7 +1099,7 @@ usb2_transfer_unsetup(struct usb2_xfer **pxfer, uint16_t n_setup) if (xfer) { if (xfer->pipe) { USB_XFER_LOCK(xfer); - USB_BUS_LOCK(xfer->udev->bus); + USB_BUS_LOCK(xfer->xroot->bus); /* * HINT: when you start/stop a transfer, it @@ -1112,7 +1111,7 @@ usb2_transfer_unsetup(struct usb2_xfer **pxfer, uint16_t n_setup) * * That way, if your code has many parts that * will not stop running under the same - * lock, in other words "priv_mtx", the + * lock, in other words "xfer_mtx", the * usb2_transfer_start and * usb2_transfer_stop functions will simply * return when they detect a NULL pointer @@ -1124,7 +1123,7 @@ usb2_transfer_unsetup(struct usb2_xfer **pxfer, uint16_t n_setup) */ pxfer[n_setup] = NULL; - USB_BUS_UNLOCK(xfer->udev->bus); + USB_BUS_UNLOCK(xfer->xroot->bus); USB_XFER_UNLOCK(xfer); usb2_transfer_drain(xfer); @@ -1145,8 +1144,8 @@ usb2_transfer_unsetup(struct usb2_xfer **pxfer, uint16_t n_setup) usb2_callout_drain(&xfer->timeout_handle); - if (xfer->usb2_root) { - info = xfer->usb2_root; + if (xfer->xroot) { + info = xfer->xroot; USB_BUS_LOCK(info->bus); @@ -1349,16 +1348,16 @@ usb2_start_hardware(struct usb2_xfer *xfer) #if USB_DEBUG if (USB_DEBUG_VAR > 0) { - USB_BUS_LOCK(xfer->udev->bus); + USB_BUS_LOCK(xfer->xroot->bus); usb2_dump_pipe(xfer->pipe); - USB_BUS_UNLOCK(xfer->udev->bus); + USB_BUS_UNLOCK(xfer->xroot->bus); } #endif USB_XFER_LOCK_ASSERT(xfer, MA_OWNED); - USB_BUS_LOCK_ASSERT(xfer->udev->bus, MA_NOTOWNED); + USB_BUS_LOCK_ASSERT(xfer->xroot->bus, MA_NOTOWNED); /* Only open the USB transfer once! */ if (!xfer->flags_int.open) { @@ -1366,9 +1365,9 @@ usb2_start_hardware(struct usb2_xfer *xfer) DPRINTF("open\n"); - USB_BUS_LOCK(xfer->udev->bus); + USB_BUS_LOCK(xfer->xroot->bus); (xfer->pipe->methods->open) (xfer); - USB_BUS_UNLOCK(xfer->udev->bus); + USB_BUS_UNLOCK(xfer->xroot->bus); } /* set "transferring" flag */ xfer->flags_int.transferring = 1; @@ -1381,9 +1380,9 @@ usb2_start_hardware(struct usb2_xfer *xfer) * frequently the "done_q": */ if (xfer->wait_queue) { - USB_BUS_LOCK(xfer->udev->bus); + USB_BUS_LOCK(xfer->xroot->bus); usb2_transfer_dequeue(xfer); - USB_BUS_UNLOCK(xfer->udev->bus); + USB_BUS_UNLOCK(xfer->xroot->bus); } /* clear "did_dma_delay" flag */ xfer->flags_int.did_dma_delay = 0; @@ -1415,16 +1414,16 @@ usb2_start_hardware(struct usb2_xfer *xfer) */ DPRINTF("xfer=%p nframes=0: stall " "or clear stall!\n", xfer); - USB_BUS_LOCK(xfer->udev->bus); + USB_BUS_LOCK(xfer->xroot->bus); xfer->flags_int.can_cancel_immed = 1; /* start the transfer */ usb2_command_wrapper(&xfer->pipe->pipe_q, xfer); - USB_BUS_UNLOCK(xfer->udev->bus); + USB_BUS_UNLOCK(xfer->xroot->bus); return; } - USB_BUS_LOCK(xfer->udev->bus); + USB_BUS_LOCK(xfer->xroot->bus); usb2_transfer_done(xfer, USB_ERR_INVAL); - USB_BUS_UNLOCK(xfer->udev->bus); + USB_BUS_UNLOCK(xfer->xroot->bus); return; } /* compute total transfer length */ @@ -1433,9 +1432,9 @@ usb2_start_hardware(struct usb2_xfer *xfer) xfer->sumlen += xfer->frlengths[x]; if (xfer->sumlen < xfer->frlengths[x]) { /* length wrapped around */ - USB_BUS_LOCK(xfer->udev->bus); + USB_BUS_LOCK(xfer->xroot->bus); usb2_transfer_done(xfer, USB_ERR_INVAL); - USB_BUS_UNLOCK(xfer->udev->bus); + USB_BUS_UNLOCK(xfer->xroot->bus); return; } } @@ -1450,9 +1449,9 @@ usb2_start_hardware(struct usb2_xfer *xfer) if (xfer->flags_int.control_xfr) { if (usb2_start_hardware_sub(xfer)) { - USB_BUS_LOCK(xfer->udev->bus); + USB_BUS_LOCK(xfer->xroot->bus); usb2_transfer_done(xfer, USB_ERR_STALLED); - USB_BUS_UNLOCK(xfer->udev->bus); + USB_BUS_UNLOCK(xfer->xroot->bus); return; } } @@ -1488,7 +1487,7 @@ usb2_start_hardware(struct usb2_xfer *xfer) */ if (xfer->flags_int.bdma_enable) { /* insert the USB transfer last in the BUS-DMA queue */ - usb2_command_wrapper(&xfer->usb2_root->dma_q, xfer); + usb2_command_wrapper(&xfer->xroot->dma_q, xfer); return; } /* @@ -1508,7 +1507,7 @@ usb2_pipe_enter(struct usb2_xfer *xfer) USB_XFER_LOCK_ASSERT(xfer, MA_OWNED); - USB_BUS_LOCK(xfer->udev->bus); + USB_BUS_LOCK(xfer->xroot->bus); pipe = xfer->pipe; @@ -1524,7 +1523,7 @@ usb2_pipe_enter(struct usb2_xfer *xfer) if (xfer->error) { /* some error has happened */ usb2_transfer_done(xfer, 0); - USB_BUS_UNLOCK(xfer->udev->bus); + USB_BUS_UNLOCK(xfer->xroot->bus); return; } } else { @@ -1533,7 +1532,7 @@ usb2_pipe_enter(struct usb2_xfer *xfer) /* start the transfer */ usb2_command_wrapper(&pipe->pipe_q, xfer); - USB_BUS_UNLOCK(xfer->udev->bus); + USB_BUS_UNLOCK(xfer->xroot->bus); } /*------------------------------------------------------------------------* @@ -1562,10 +1561,10 @@ usb2_transfer_start(struct usb2_xfer *xfer) if (xfer->flags_int.transferring) { return; } - USB_BUS_LOCK(xfer->udev->bus); + USB_BUS_LOCK(xfer->xroot->bus); /* call the USB transfer callback */ usb2_callback_ss_done_defer(xfer); - USB_BUS_UNLOCK(xfer->udev->bus); + USB_BUS_UNLOCK(xfer->xroot->bus); } /*------------------------------------------------------------------------* @@ -1596,7 +1595,7 @@ usb2_transfer_stop(struct usb2_xfer *xfer) } /* try to stop the current USB transfer */ - USB_BUS_LOCK(xfer->udev->bus); + USB_BUS_LOCK(xfer->xroot->bus); xfer->error = USB_ERR_CANCELLED;/* override any previous error */ /* * Clear "open" and "started" when both private and USB lock @@ -1648,7 +1647,7 @@ usb2_transfer_stop(struct usb2_xfer *xfer) } } - USB_BUS_UNLOCK(xfer->udev->bus); + USB_BUS_UNLOCK(xfer->xroot->bus); } /*------------------------------------------------------------------------* @@ -1672,22 +1671,22 @@ usb2_transfer_pending(struct usb2_xfer *xfer) /* trivial case */ return (1); } - USB_BUS_LOCK(xfer->udev->bus); + USB_BUS_LOCK(xfer->xroot->bus); if (xfer->wait_queue) { /* we are waiting on a queue somewhere */ - USB_BUS_UNLOCK(xfer->udev->bus); + USB_BUS_UNLOCK(xfer->xroot->bus); return (1); } - info = xfer->usb2_root; + info = xfer->xroot; pq = &info->done_q; if (pq->curr == xfer) { /* we are currently scheduled for callback */ - USB_BUS_UNLOCK(xfer->udev->bus); + USB_BUS_UNLOCK(xfer->xroot->bus); return (1); } /* we are not pending */ - USB_BUS_UNLOCK(xfer->udev->bus); + USB_BUS_UNLOCK(xfer->xroot->bus); return (0); } @@ -1709,7 +1708,7 @@ usb2_transfer_drain(struct usb2_xfer *xfer) /* transfer is gone */ return; } - if (xfer->xfer_mtx != &Giant) { + if (xfer->xroot->xfer_mtx != &Giant) { USB_XFER_LOCK_ASSERT(xfer, MA_NOTOWNED); } USB_XFER_LOCK(xfer); @@ -1722,7 +1721,7 @@ usb2_transfer_drain(struct usb2_xfer *xfer) * Wait until the current outstanding USB * transfer is complete ! */ - usb2_cv_wait(&xfer->usb2_root->cv_drain, xfer->xfer_mtx); + usb2_cv_wait(&xfer->xroot->cv_drain, xfer->xroot->xfer_mtx); } USB_XFER_UNLOCK(xfer); } @@ -1769,7 +1768,7 @@ static void usb2_callback_proc(struct usb2_proc_msg *_pm) { struct usb2_done_msg *pm = (void *)_pm; - struct usb2_xfer_root *info = pm->usb2_root; + struct usb2_xfer_root *info = pm->xroot; /* Change locking order */ USB_BUS_UNLOCK(info->bus); @@ -1778,14 +1777,14 @@ usb2_callback_proc(struct usb2_proc_msg *_pm) * We exploit the fact that the mutex is the same for all * callbacks that will be called from this thread: */ - mtx_lock(info->priv_mtx); + mtx_lock(info->xfer_mtx); USB_BUS_LOCK(info->bus); /* Continue where we lost track */ usb2_command_wrapper(&info->done_q, info->done_q.curr); - mtx_unlock(info->priv_mtx); + mtx_unlock(info->xfer_mtx); } /*------------------------------------------------------------------------* @@ -1797,10 +1796,10 @@ usb2_callback_proc(struct usb2_proc_msg *_pm) static void usb2_callback_ss_done_defer(struct usb2_xfer *xfer) { - struct usb2_xfer_root *info = xfer->usb2_root; + struct usb2_xfer_root *info = xfer->xroot; struct usb2_xfer_queue *pq = &info->done_q; - USB_BUS_LOCK_ASSERT(xfer->udev->bus, MA_OWNED); + USB_BUS_LOCK_ASSERT(xfer->xroot->bus, MA_OWNED); if (pq->curr != xfer) { usb2_transfer_enqueue(pq, xfer); @@ -1836,10 +1835,10 @@ static void usb2_callback_wrapper(struct usb2_xfer_queue *pq) { struct usb2_xfer *xfer = pq->curr; - struct usb2_xfer_root *info = xfer->usb2_root; + struct usb2_xfer_root *info = xfer->xroot; - USB_BUS_LOCK_ASSERT(xfer->udev->bus, MA_OWNED); - if (!mtx_owned(xfer->xfer_mtx)) { + USB_BUS_LOCK_ASSERT(xfer->xroot->bus, MA_OWNED); + if (!mtx_owned(xfer->xroot->xfer_mtx)) { /* * Cases that end up here: * @@ -1870,22 +1869,22 @@ usb2_callback_wrapper(struct usb2_xfer_queue *pq) /* get next USB transfer in the queue */ info->done_q.curr = NULL; - USB_BUS_UNLOCK(xfer->udev->bus); - USB_BUS_LOCK_ASSERT(xfer->udev->bus, MA_NOTOWNED); + USB_BUS_UNLOCK(xfer->xroot->bus); + USB_BUS_LOCK_ASSERT(xfer->xroot->bus, MA_NOTOWNED); /* set correct USB state for callback */ if (!xfer->flags_int.transferring) { xfer->usb2_state = USB_ST_SETUP; if (!xfer->flags_int.started) { /* we got stopped before we even got started */ - USB_BUS_LOCK(xfer->udev->bus); + USB_BUS_LOCK(xfer->xroot->bus); goto done; } } else { if (usb2_callback_wrapper_sub(xfer)) { /* the callback has been deferred */ - USB_BUS_LOCK(xfer->udev->bus); + USB_BUS_LOCK(xfer->xroot->bus); goto done; } /* decrement power reference */ @@ -1911,7 +1910,7 @@ usb2_callback_wrapper(struct usb2_xfer_queue *pq) (xfer->callback) (xfer); /* pickup the USB mutex again */ - USB_BUS_LOCK(xfer->udev->bus); + USB_BUS_LOCK(xfer->xroot->bus); /* * Check if we got started after that we got cancelled, but @@ -1933,7 +1932,7 @@ done: (!xfer->flags_int.transferring)) { /* "usb2_transfer_drain()" is waiting for end of transfer */ xfer->flags_int.draining = 0; - usb2_cv_broadcast(&xfer->usb2_root->cv_drain); + usb2_cv_broadcast(&xfer->xroot->cv_drain); } /* do the next callback, if any */ @@ -1954,7 +1953,7 @@ usb2_dma_delay_done_cb(void *arg) { struct usb2_xfer *xfer = arg; - USB_BUS_LOCK_ASSERT(xfer->udev->bus, MA_OWNED); + USB_BUS_LOCK_ASSERT(xfer->xroot->bus, MA_OWNED); DPRINTFN(3, "Completed %p\n", xfer); @@ -2019,7 +2018,7 @@ usb2_transfer_done(struct usb2_xfer *xfer, usb2_error_t error) { struct usb2_xfer_queue *pq; - USB_BUS_LOCK_ASSERT(xfer->udev->bus, MA_OWNED); + USB_BUS_LOCK_ASSERT(xfer->xroot->bus, MA_OWNED); DPRINTF("err=%s\n", usb2_errstr(error)); @@ -2045,12 +2044,12 @@ usb2_transfer_done(struct usb2_xfer *xfer, usb2_error_t error) */ usb2_transfer_dequeue(xfer); - if (mtx_owned(xfer->xfer_mtx)) { + if (mtx_owned(xfer->xroot->xfer_mtx)) { /* * If the private USB lock is not locked, then we assume * that the BUS-DMA load stage has been passed: */ - pq = &xfer->usb2_root->dma_q; + pq = &xfer->xroot->dma_q; if (pq->curr == xfer) { /* start the next BUS-DMA load, if any */ @@ -2059,10 +2058,10 @@ usb2_transfer_done(struct usb2_xfer *xfer, usb2_error_t error) } /* keep some statistics */ if (xfer->error) { - xfer->udev->bus->stats_err.uds_requests + xfer->xroot->bus->stats_err.uds_requests [xfer->pipe->edesc->bmAttributes & UE_XFERTYPE]++; } else { - xfer->udev->bus->stats_ok.uds_requests + xfer->xroot->bus->stats_ok.uds_requests [xfer->pipe->edesc->bmAttributes & UE_XFERTYPE]++; } @@ -2083,7 +2082,7 @@ usb2_transfer_start_cb(void *arg) struct usb2_xfer *xfer = arg; struct usb2_pipe *pipe = xfer->pipe; - USB_BUS_LOCK_ASSERT(xfer->udev->bus, MA_OWNED); + USB_BUS_LOCK_ASSERT(xfer->xroot->bus, MA_OWNED); DPRINTF("start\n"); @@ -2118,11 +2117,11 @@ usb2_transfer_set_stall(struct usb2_xfer *xfer) USB_XFER_LOCK_ASSERT(xfer, MA_OWNED); /* avoid any races by locking the USB mutex */ - USB_BUS_LOCK(xfer->udev->bus); + USB_BUS_LOCK(xfer->xroot->bus); xfer->flags.stall_pipe = 1; - USB_BUS_UNLOCK(xfer->udev->bus); + USB_BUS_UNLOCK(xfer->xroot->bus); } /*------------------------------------------------------------------------* @@ -2141,11 +2140,11 @@ usb2_transfer_clear_stall(struct usb2_xfer *xfer) USB_XFER_LOCK_ASSERT(xfer, MA_OWNED); /* avoid any races by locking the USB mutex */ - USB_BUS_LOCK(xfer->udev->bus); + USB_BUS_LOCK(xfer->xroot->bus); xfer->flags.stall_pipe = 0; - USB_BUS_UNLOCK(xfer->udev->bus); + USB_BUS_UNLOCK(xfer->xroot->bus); } /*------------------------------------------------------------------------* @@ -2163,7 +2162,7 @@ usb2_pipe_start(struct usb2_xfer_queue *pq) xfer = pq->curr; pipe = xfer->pipe; - USB_BUS_LOCK_ASSERT(xfer->udev->bus, MA_OWNED); + USB_BUS_LOCK_ASSERT(xfer->xroot->bus, MA_OWNED); /* * If the pipe is already stalled we do nothing ! @@ -2187,14 +2186,15 @@ usb2_pipe_start(struct usb2_xfer_queue *pq) struct usb2_device *udev; struct usb2_xfer_root *info; - udev = xfer->udev; + info = xfer->xroot; + udev = info->udev; pipe->is_stalled = 1; if (udev->flags.usb2_mode == USB_MODE_DEVICE) { (udev->bus->methods->set_stall) ( udev, NULL, pipe); } else if (udev->default_xfer[1]) { - info = udev->default_xfer[1]->usb2_root; + info = udev->default_xfer[1]->xroot; if (usb2_proc_msignal(&info->done_p, &udev->cs_msg[0], &udev->cs_msg[1])) { /* ignore */ @@ -2265,7 +2265,7 @@ void usb2_transfer_timeout_ms(struct usb2_xfer *xfer, void (*cb) (void *arg), uint32_t ms) { - USB_BUS_LOCK_ASSERT(xfer->udev->bus, MA_OWNED); + USB_BUS_LOCK_ASSERT(xfer->xroot->bus, MA_OWNED); /* defer delay */ usb2_callout_reset(&xfer->timeout_handle, @@ -2298,9 +2298,9 @@ usb2_callback_wrapper_sub(struct usb2_xfer *xfer) if ((!xfer->flags_int.open) && (!xfer->flags_int.did_close)) { DPRINTF("close\n"); - USB_BUS_LOCK(xfer->udev->bus); + USB_BUS_LOCK(xfer->xroot->bus); (xfer->pipe->methods->close) (xfer); - USB_BUS_UNLOCK(xfer->udev->bus); + USB_BUS_UNLOCK(xfer->xroot->bus); /* only close once */ xfer->flags_int.did_close = 1; return (1); /* wait for new callback */ @@ -2321,16 +2321,16 @@ usb2_callback_wrapper_sub(struct usb2_xfer *xfer) /* we can not cancel this delay */ xfer->flags_int.can_cancel_immed = 0; - temp = usb2_get_dma_delay(xfer->udev->bus); + temp = usb2_get_dma_delay(xfer->xroot->bus); DPRINTFN(3, "DMA delay, %u ms, " "on %p\n", temp, xfer); if (temp != 0) { - USB_BUS_LOCK(xfer->udev->bus); + USB_BUS_LOCK(xfer->xroot->bus); usb2_transfer_timeout_ms(xfer, &usb2_dma_delay_done_cb, temp); - USB_BUS_UNLOCK(xfer->udev->bus); + USB_BUS_UNLOCK(xfer->xroot->bus); return (1); /* wait for new callback */ } } @@ -2422,7 +2422,7 @@ usb2_callback_wrapper_sub(struct usb2_xfer *xfer) * If the current USB transfer is completing we need to start the * next one: */ - USB_BUS_LOCK(xfer->udev->bus); + USB_BUS_LOCK(xfer->xroot->bus); if (pipe->pipe_q.curr == xfer) { usb2_command_wrapper(&pipe->pipe_q, NULL); @@ -2434,7 +2434,7 @@ usb2_callback_wrapper_sub(struct usb2_xfer *xfer) xfer->pipe->is_synced = 0; } } - USB_BUS_UNLOCK(xfer->udev->bus); + USB_BUS_UNLOCK(xfer->xroot->bus); done: return (0); } @@ -2637,7 +2637,7 @@ usb2_clear_stall_callback(struct usb2_xfer *xfer1, * "ata-usb.c" depends on this) */ - usb2_clear_data_toggle(xfer2->udev, xfer2->pipe); + usb2_clear_data_toggle(xfer2->xroot->udev, xfer2->pipe); /* setup a clear-stall packet */ @@ -2730,7 +2730,7 @@ void usb2_do_poll(struct usb2_xfer **ppxfer, uint16_t max) { struct usb2_xfer *xfer; - struct usb2_xfer_root *usb2_root; + struct usb2_xfer_root *xroot; struct usb2_device *udev; struct usb2_proc_msg *pm; uint32_t to; @@ -2744,8 +2744,8 @@ usb2_do_poll(struct usb2_xfer **ppxfer, uint16_t max) for (n = 0; n != max; n++) { xfer = ppxfer[n]; if (xfer) { - usb2_root = xfer->usb2_root; - udev = xfer->udev; + xroot = xfer->xroot; + udev = xroot->udev; /* * Poll hardware - signal that we are polling by @@ -2756,10 +2756,10 @@ usb2_do_poll(struct usb2_xfer **ppxfer, uint16_t max) USB_XFER_UNLOCK(xfer); /* poll clear stall start */ - USB_BUS_LOCK(xfer->udev->bus); + USB_BUS_LOCK(xfer->xroot->bus); pm = &udev->cs_msg[0].hdr; (pm->pm_callback) (pm); - USB_BUS_UNLOCK(xfer->udev->bus); + USB_BUS_UNLOCK(xfer->xroot->bus); if (udev->default_xfer[1]) { @@ -2767,20 +2767,20 @@ usb2_do_poll(struct usb2_xfer **ppxfer, uint16_t max) usb2_callout_poll(udev->default_xfer[1]); /* poll clear stall done thread */ - USB_BUS_LOCK(xfer->udev->bus); + USB_BUS_LOCK(xfer->xroot->bus); pm = &udev->default_xfer[1]-> - usb2_root->done_m[0].hdr; + xroot->done_m[0].hdr; (pm->pm_callback) (pm); - USB_BUS_UNLOCK(xfer->udev->bus); + USB_BUS_UNLOCK(xfer->xroot->bus); } /* poll timeout */ usb2_callout_poll(xfer); /* poll done thread */ - USB_BUS_LOCK(xfer->udev->bus); - pm = &usb2_root->done_m[0].hdr; + USB_BUS_LOCK(xfer->xroot->bus); + pm = &xroot->done_m[0].hdr; (pm->pm_callback) (pm); - USB_BUS_UNLOCK(xfer->udev->bus); + USB_BUS_UNLOCK(xfer->xroot->bus); } } } diff --git a/sys/dev/usb2/core/usb2_transfer.h b/sys/dev/usb2/core/usb2_transfer.h index 698509c5e061..7e95be1a83f8 100644 --- a/sys/dev/usb2/core/usb2_transfer.h +++ b/sys/dev/usb2/core/usb2_transfer.h @@ -33,7 +33,7 @@ */ struct usb2_done_msg { struct usb2_proc_msg hdr; - struct usb2_xfer_root *usb2_root; + struct usb2_xfer_root *xroot; }; /* @@ -46,17 +46,17 @@ struct usb2_xfer_root { struct usb2_xfer_queue done_q; struct usb2_done_msg done_m[2]; struct cv cv_drain; - struct usb2_dma_parent_tag dma_parent_tag; - struct usb2_process done_p; + void *memory_base; - struct mtx *priv_mtx; + struct mtx *xfer_mtx; /* cannot be changed during operation */ struct usb2_page_cache *dma_page_cache_start; struct usb2_page_cache *dma_page_cache_end; struct usb2_page_cache *xfer_page_cache_start; struct usb2_page_cache *xfer_page_cache_end; - struct usb2_bus *bus; + struct usb2_bus *bus; /* pointer to USB bus (cached) */ + struct usb2_device *udev; /* pointer to USB device */ uint32_t memory_size; uint32_t setup_refcount; |
