aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/usb2/core
diff options
context:
space:
mode:
authorAndrew Thompson <thompsa@FreeBSD.org>2009-01-13 19:03:12 +0000
committerAndrew Thompson <thompsa@FreeBSD.org>2009-01-13 19:03:12 +0000
commit13bd84042e7965cb455b03d55dba5440d3d47154 (patch)
tree519a4c63c1a67b3734b84daa7d5a69bd66415caa /sys/dev/usb2/core
parentf892798d89d68fa805d79dca4297b2730aa258f4 (diff)
Notes
Diffstat (limited to 'sys/dev/usb2/core')
-rw-r--r--sys/dev/usb2/core/usb2_busdma.c14
-rw-r--r--sys/dev/usb2/core/usb2_core.h11
-rw-r--r--sys/dev/usb2/core/usb2_debug.c12
-rw-r--r--sys/dev/usb2/core/usb2_handle_request.c22
-rw-r--r--sys/dev/usb2/core/usb2_hub.c2
-rw-r--r--sys/dev/usb2/core/usb2_request.c28
-rw-r--r--sys/dev/usb2/core/usb2_transfer.c192
-rw-r--r--sys/dev/usb2/core/usb2_transfer.h10
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;