svn commit: r187974 - in user/thompsa/usb/sys/dev/usb2: bluetooth
core ethernet serial storage
Andrew Thompson
thompsa at FreeBSD.org
Sat Jan 31 18:04:25 PST 2009
Author: thompsa
Date: Sun Feb 1 02:04:24 2009
New Revision: 187974
URL: http://svn.freebsd.org/changeset/base/187974
Log:
- Resubmit the xfer when pipe_stall is set, this removes the need for gotos.
- Use usb2_clear_endpoint_stall() throughout.
Modified:
user/thompsa/usb/sys/dev/usb2/bluetooth/ng_ubt2.c
user/thompsa/usb/sys/dev/usb2/bluetooth/ubtbcmfw2.c
user/thompsa/usb/sys/dev/usb2/core/usb2_core.h
user/thompsa/usb/sys/dev/usb2/core/usb2_handle_request.c
user/thompsa/usb/sys/dev/usb2/core/usb2_hub.c
user/thompsa/usb/sys/dev/usb2/core/usb2_transfer.c
user/thompsa/usb/sys/dev/usb2/ethernet/if_cdce2.c
user/thompsa/usb/sys/dev/usb2/serial/u3g2.c
user/thompsa/usb/sys/dev/usb2/storage/ustorage2_fs.c
Modified: user/thompsa/usb/sys/dev/usb2/bluetooth/ng_ubt2.c
==============================================================================
--- user/thompsa/usb/sys/dev/usb2/bluetooth/ng_ubt2.c Sun Feb 1 01:50:09 2009 (r187973)
+++ user/thompsa/usb/sys/dev/usb2/bluetooth/ng_ubt2.c Sun Feb 1 02:04:24 2009 (r187974)
@@ -742,8 +742,8 @@ submit_next:
usb2_errstr(xfer->error));
/* Try to clear stall first */
- xfer->flags.stall_pipe = 1;
- goto submit_next;
+ usb2_clear_endpoint_stall(xfer);
+ return;
}
/* transfer cancelled */
break;
@@ -838,8 +838,8 @@ submit_next:
usb2_errstr(xfer->error));
/* Try to clear stall first */
- xfer->flags.stall_pipe = 1;
- goto submit_next;
+ usb2_clear_endpoint_stall(xfer);
+ return;
}
/* transfer cancelled */
break;
@@ -866,7 +866,6 @@ ubt_bulk_write_callback(struct usb2_xfer
/* FALLTHROUGH */
case USB_ST_SETUP:
-send_next:
/* Get next mbuf, if any */
UBT_NG_LOCK(sc);
NG_BT_MBUFQ_DEQUEUE(&sc->sc_aclq, m);
@@ -901,8 +900,8 @@ send_next:
UBT_STAT_OERROR(sc);
/* try to clear stall first */
- xfer->flags.stall_pipe = 1;
- goto send_next;
+ usb2_clear_endpoint_stall(xfer);
+ return;
}
/* transfer cancelled */
break;
Modified: user/thompsa/usb/sys/dev/usb2/bluetooth/ubtbcmfw2.c
==============================================================================
--- user/thompsa/usb/sys/dev/usb2/bluetooth/ubtbcmfw2.c Sun Feb 1 01:50:09 2009 (r187973)
+++ user/thompsa/usb/sys/dev/usb2/bluetooth/ubtbcmfw2.c Sun Feb 1 02:04:24 2009 (r187974)
@@ -265,7 +265,6 @@ ubtbcmfw_write_callback(struct usb2_xfer
switch (USB_GET_STATE(xfer)) {
case USB_ST_SETUP:
case USB_ST_TRANSFERRED:
-setup_next:
if (usb2_fifo_get_data(f, xfer->frbuffers, 0,
xfer->max_data_length, &actlen, 0)) {
xfer->frlengths[0] = actlen;
@@ -276,8 +275,8 @@ setup_next:
default: /* Error */
if (xfer->error != USB_ERR_CANCELLED) {
/* try to clear stall first */
- xfer->flags.stall_pipe = 1;
- goto setup_next;
+ usb2_clear_endpoint_stall(xfer);
+ return;
}
break;
}
@@ -299,7 +298,6 @@ ubtbcmfw_read_callback(struct usb2_xfer
/* FALLTHROUGH */
case USB_ST_SETUP:
-setup_next:
if (usb2_fifo_put_bytes_max(fifo) > 0) {
xfer->frlengths[0] = xfer->max_data_length;
usb2_start_hardware(xfer);
@@ -309,8 +307,8 @@ setup_next:
default: /* Error */
if (xfer->error != USB_ERR_CANCELLED) {
/* try to clear stall first */
- xfer->flags.stall_pipe = 1;
- goto setup_next;
+ usb2_clear_endpoint_stall(xfer);
+ return;
}
break;
}
Modified: user/thompsa/usb/sys/dev/usb2/core/usb2_core.h
==============================================================================
--- user/thompsa/usb/sys/dev/usb2/core/usb2_core.h Sun Feb 1 01:50:09 2009 (r187973)
+++ user/thompsa/usb/sys/dev/usb2/core/usb2_core.h Sun Feb 1 02:04:24 2009 (r187974)
@@ -445,9 +445,8 @@ void usb2_set_frame_data(struct usb2_xfe
void usb2_set_frame_offset(struct usb2_xfer *xfer, uint32_t offset,
uint32_t frindex);
void usb2_start_hardware(struct usb2_xfer *xfer);
-void usb2_transfer_clear_stall(struct usb2_xfer *xfer);
void usb2_transfer_drain(struct usb2_xfer *xfer);
-void usb2_transfer_set_stall(struct usb2_xfer *xfer);
+void usb2_clear_endpoint_stall(struct usb2_xfer *xfer);
void usb2_transfer_start(struct usb2_xfer *xfer);
void usb2_transfer_stop(struct usb2_xfer *xfer);
void usb2_transfer_unsetup(struct usb2_xfer **pxfer, uint16_t n_setup);
Modified: user/thompsa/usb/sys/dev/usb2/core/usb2_handle_request.c
==============================================================================
--- user/thompsa/usb/sys/dev/usb2/core/usb2_handle_request.c Sun Feb 1 01:50:09 2009 (r187973)
+++ user/thompsa/usb/sys/dev/usb2/core/usb2_handle_request.c Sun Feb 1 02:04:24 2009 (r187974)
@@ -93,7 +93,11 @@ usb2_handle_request_callback(struct usb2
* If no control transfer is active,
* receive the next SETUP message:
*/
- goto tr_restart;
+ xfer->frlengths[0] = sizeof(struct usb2_device_request);
+ xfer->nframes = 1;
+ xfer->flags.manual_status = 1;
+ xfer->flags.force_short_xfer = 0;
+ xfer->flags.stall_pipe = 1; /* cancel previous transfer, if any */
}
usb2_start_hardware(xfer);
break;
@@ -101,19 +105,11 @@ usb2_handle_request_callback(struct usb2
default:
if (xfer->error != USB_ERR_CANCELLED) {
/* should not happen - try stalling */
- goto tr_restart;
+ usb2_clear_endpoint_stall(xfer);
+ return;
}
break;
}
- return;
-
-tr_restart:
- xfer->frlengths[0] = sizeof(struct usb2_device_request);
- xfer->nframes = 1;
- xfer->flags.manual_status = 1;
- xfer->flags.force_short_xfer = 0;
- xfer->flags.stall_pipe = 1; /* cancel previous transfer, if any */
- usb2_start_hardware(xfer);
}
/*------------------------------------------------------------------------*
Modified: user/thompsa/usb/sys/dev/usb2/core/usb2_hub.c
==============================================================================
--- user/thompsa/usb/sys/dev/usb2/core/usb2_hub.c Sun Feb 1 01:50:09 2009 (r187973)
+++ user/thompsa/usb/sys/dev/usb2/core/usb2_hub.c Sun Feb 1 02:04:24 2009 (r187974)
@@ -170,14 +170,9 @@ uhub_intr_callback(struct usb2_xfer *xfe
default: /* Error */
if (xfer->error != USB_ERR_CANCELLED) {
- /*
- * Do a clear-stall. The "stall_pipe" flag
- * will get cleared before next callback by
- * the USB stack.
- */
- xfer->flags.stall_pipe = 1;
- xfer->frlengths[0] = xfer->max_data_length;
- usb2_start_hardware(xfer);
+ /* Do a clear-stall. */
+ usb2_clear_endpoint_stall(xfer);
+ return;
}
break;
}
Modified: user/thompsa/usb/sys/dev/usb2/core/usb2_transfer.c
==============================================================================
--- user/thompsa/usb/sys/dev/usb2/core/usb2_transfer.c Sun Feb 1 01:50:09 2009 (r187973)
+++ user/thompsa/usb/sys/dev/usb2/core/usb2_transfer.c Sun Feb 1 02:04:24 2009 (r187974)
@@ -1909,6 +1909,11 @@ usb2_callback_wrapper(struct usb2_xfer_q
/* call processing routine */
(xfer->callback) (xfer);
+ if (xfer->usb2_state == USB_ST_ERROR && xfer->flags.stall_pipe) {
+ /* resubmit xfer */
+ xfer->usb2_state = USB_ST_SETUP;
+ (xfer->callback) (xfer);
+ }
/* pickup the USB mutex again */
USB_BUS_LOCK(xfer->xroot->bus);
@@ -2108,7 +2113,7 @@ usb2_transfer_start_cb(void *arg)
* callback. This function is NULL safe.
*------------------------------------------------------------------------*/
void
-usb2_transfer_set_stall(struct usb2_xfer *xfer)
+usb2_clear_endpoint_stall(struct usb2_xfer *xfer)
{
if (xfer == NULL) {
/* tearing down */
@@ -2125,29 +2130,6 @@ usb2_transfer_set_stall(struct usb2_xfer
}
/*------------------------------------------------------------------------*
- * usb2_transfer_clear_stall
- *
- * This function is used to clear the stall flag outside the
- * callback. This function is NULL safe.
- *------------------------------------------------------------------------*/
-void
-usb2_transfer_clear_stall(struct usb2_xfer *xfer)
-{
- if (xfer == NULL) {
- /* tearing down */
- return;
- }
- USB_XFER_LOCK_ASSERT(xfer, MA_OWNED);
-
- /* avoid any races by locking the USB mutex */
- USB_BUS_LOCK(xfer->xroot->bus);
-
- xfer->flags.stall_pipe = 0;
-
- USB_BUS_UNLOCK(xfer->xroot->bus);
-}
-
-/*------------------------------------------------------------------------*
* usb2_pipe_start
*
* This function is used to add an USB transfer to the pipe transfer list.
Modified: user/thompsa/usb/sys/dev/usb2/ethernet/if_cdce2.c
==============================================================================
--- user/thompsa/usb/sys/dev/usb2/ethernet/if_cdce2.c Sun Feb 1 01:50:09 2009 (r187973)
+++ user/thompsa/usb/sys/dev/usb2/ethernet/if_cdce2.c Sun Feb 1 02:04:24 2009 (r187974)
@@ -598,7 +598,6 @@ cdce_bulk_write_512x4_callback(struct us
/* FALLTHROUGH */
case USB_ST_SETUP:
-tr_setup:
x = 0; /* number of frames */
y = 1; /* number of fragments */
@@ -683,8 +682,8 @@ tr_setup:
if (xfer->error != USB_ERR_CANCELLED) {
/* try to clear stall first */
- xfer->flags.stall_pipe = 1;
- goto tr_setup;
+ usb2_clear_endpoint_stall(xfer);
+ return;
}
break;
}
@@ -772,8 +771,8 @@ tr_setup:
if (xfer->error != USB_ERR_CANCELLED) {
/* try to clear stall first */
- xfer->flags.stall_pipe = 1;
- goto tr_setup;
+ usb2_clear_endpoint_stall(xfer);
+ return;
}
break;
}
@@ -906,8 +905,8 @@ cdce_init_locked(struct cdce_softc *sc)
if (sc->sc_flags & CDCE_FLAG_DETACH)
return;
- usb2_transfer_set_stall(sc->sc_xfer[CDCE_BULK_A]);
- usb2_transfer_set_stall(sc->sc_xfer[CDCE_BULK_B]);
+ usb2_clear_endpoint_stall(sc->sc_xfer[CDCE_BULK_A]);
+ usb2_clear_endpoint_stall(sc->sc_xfer[CDCE_BULK_B]);
ifp->if_drv_flags |= IFF_DRV_RUNNING;
cdce_start_transfers(sc);
@@ -947,8 +946,8 @@ cdce_bulk_read_512x4_callback(struct usb
(sc->sc_rx.hdr.bSig[0] != 'F') ||
(sc->sc_rx.hdr.bSig[1] != 'L')) {
/* try to clear stall first */
- xfer->flags.stall_pipe = 1;
- goto tr_setup;
+ usb2_clear_endpoint_stall(xfer);
+ return;
}
rx_frags = (xfer->actlen -
CDCE_512X4_FRAG_LENGTH_OFFSET) / 2;
@@ -966,7 +965,6 @@ cdce_bulk_read_512x4_callback(struct usb
/* FALLTHROUGH */
case USB_ST_SETUP:
-tr_setup:
if (xfer->flags.stall_pipe) {
/* we are done */
sc->sc_flags &= ~CDCE_FLAG_RX_DATA;
@@ -985,8 +983,8 @@ tr_setup:
/* verify number of fragments */
if (rx_frags > CDCE_512X4_FRAGS_MAX) {
/* try to clear stall first */
- xfer->flags.stall_pipe = 1;
- goto tr_setup;
+ usb2_clear_endpoint_stall(xfer);
+ return;
}
/* check if the last fragment does not complete a frame */
x = rx_frags - 1;
@@ -994,8 +992,8 @@ tr_setup:
if (!(flen & CDCE_512X4_FRAG_LAST_MASK)) {
DPRINTF("no last frag mask\n");
/* try to clear stall first */
- xfer->flags.stall_pipe = 1;
- goto tr_setup;
+ usb2_clear_endpoint_stall(xfer);
+ return;
}
/*
* Setup a new USB transfer chain to receive all the
@@ -1025,8 +1023,8 @@ tr_setup:
*/
if (offset > (MCLBYTES - ETHER_ALIGN)) {
/* try to clear stall first */
- xfer->flags.stall_pipe = 1;
- goto tr_setup;
+ usb2_clear_endpoint_stall(xfer);
+ return;
} if (offset > (MHLEN - ETHER_ALIGN)) {
m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
} else {
@@ -1085,8 +1083,8 @@ tr_setup:
}
if (y == CDCE_512X4_FRAMES_MAX) {
/* try to clear stall first */
- xfer->flags.stall_pipe = 1;
- goto tr_setup;
+ usb2_clear_endpoint_stall(xfer);
+ return;
}
}
@@ -1103,8 +1101,8 @@ tr_setup:
if (xfer->error != USB_ERR_CANCELLED) {
/* try to clear stall first */
- xfer->flags.stall_pipe = 1;
- goto tr_setup;
+ usb2_clear_endpoint_stall(xfer);
+ return;
}
free_mq = 1;
break;
@@ -1192,8 +1190,8 @@ tr_setup:
if (xfer->error != USB_ERR_CANCELLED) {
/* try to clear stall first */
- xfer->flags.stall_pipe = 1;
- goto tr_setup;
+ usb2_clear_endpoint_stall(xfer);
+ return;
}
return;
}
@@ -1257,7 +1255,6 @@ cdce_intr_read_callback(struct usb2_xfer
/* FALLTHROUGH */
case USB_ST_SETUP:
-tr_setup:
xfer->frlengths[0] = xfer->max_data_length;
usb2_start_hardware(xfer);
break;
@@ -1265,8 +1262,8 @@ tr_setup:
default: /* Error */
if (xfer->error != USB_ERR_CANCELLED) {
/* start clear stall */
- xfer->flags.stall_pipe = 1;
- goto tr_setup;
+ usb2_clear_endpoint_stall(xfer);
+ return;
}
break;
}
@@ -1283,7 +1280,6 @@ cdce_intr_write_callback(struct usb2_xfe
/* FALLTHROUGH */
case USB_ST_SETUP:
-tr_setup:
#if 0
xfer->frlengths[0] = XXX;
usb2_start_hardware(xfer);
@@ -1293,8 +1289,8 @@ tr_setup:
default: /* Error */
if (xfer->error != USB_ERR_CANCELLED) {
/* start clear stall */
- xfer->flags.stall_pipe = 1;
- goto tr_setup;
+ usb2_clear_endpoint_stall(xfer);
+ return;
}
break;
}
Modified: user/thompsa/usb/sys/dev/usb2/serial/u3g2.c
==============================================================================
--- user/thompsa/usb/sys/dev/usb2/serial/u3g2.c Sun Feb 1 01:50:09 2009 (r187973)
+++ user/thompsa/usb/sys/dev/usb2/serial/u3g2.c Sun Feb 1 02:04:24 2009 (r187974)
@@ -420,8 +420,8 @@ u3g_attach(device_t dev)
goto detach;
}
/* set stall by default */
- usb2_transfer_set_stall(sc->sc_xfer[m][U3G_BULK_WR]);
- usb2_transfer_set_stall(sc->sc_xfer[m][U3G_BULK_RD]);
+ usb2_clear_endpoint_stall(sc->sc_xfer[m][U3G_BULK_WR]);
+ usb2_clear_endpoint_stall(sc->sc_xfer[m][U3G_BULK_RD]);
}
sc->sc_numports = m;
@@ -508,7 +508,6 @@ u3g_write_callback(struct usb2_xfer *xfe
switch (USB_GET_STATE(xfer)) {
case USB_ST_TRANSFERRED:
case USB_ST_SETUP:
-tr_setup:
if (usb2_com_get_data(ucom, xfer->frbuffers, 0,
U3G_BSIZE, &actlen)) {
xfer->frlengths[0] = actlen;
@@ -519,8 +518,8 @@ tr_setup:
default: /* Error */
if (xfer->error != USB_ERR_CANCELLED) {
/* do a builtin clear-stall */
- xfer->flags.stall_pipe = 1;
- goto tr_setup;
+ usb2_clear_endpoint_stall(xfer);
+ return;
}
break;
}
@@ -537,7 +536,6 @@ u3g_read_callback(struct usb2_xfer *xfer
usb2_com_put_data(ucom, xfer->frbuffers, 0, xfer->actlen);
case USB_ST_SETUP:
-tr_setup:
xfer->frlengths[0] = xfer->max_data_length;
usb2_start_hardware(xfer);
break;
@@ -545,8 +543,8 @@ tr_setup:
default: /* Error */
if (xfer->error != USB_ERR_CANCELLED) {
/* do a builtin clear-stall */
- xfer->flags.stall_pipe = 1;
- goto tr_setup;
+ usb2_clear_endpoint_stall(xfer);
+ return;
}
break;
}
Modified: user/thompsa/usb/sys/dev/usb2/storage/ustorage2_fs.c
==============================================================================
--- user/thompsa/usb/sys/dev/usb2/storage/ustorage2_fs.c Sun Feb 1 01:50:09 2009 (r187973)
+++ user/thompsa/usb/sys/dev/usb2/storage/ustorage2_fs.c Sun Feb 1 02:04:24 2009 (r187974)
@@ -560,15 +560,7 @@ ustorage_fs_t_bbb_command_callback(struc
break;
case USB_ST_SETUP:
-tr_setup:
- if (sc->sc_transfer.data_error) {
- sc->sc_transfer.data_error = 0;
- xfer->flags.stall_pipe = 1;
- DPRINTF("stall pipe\n");
- } else {
- xfer->flags.stall_pipe = 0;
- }
-
+ sc->sc_transfer.data_error = 0;
xfer->frlengths[0] = sizeof(sc->sc_cbw);
usb2_set_frame_data(xfer, &sc->sc_cbw, 0);
usb2_start_hardware(xfer);
@@ -581,10 +573,10 @@ tr_setup:
}
/* If the pipe is already stalled, don't do another stall */
if (!xfer->pipe->is_stalled) {
- sc->sc_transfer.data_error = 1;
+ usb2_clear_endpoint_stall(xfer);
+ return;
}
- /* try again */
- goto tr_setup;
+ break;
}
if (error) {
if (sc->sc_csw.bCSWStatus == 0) {
@@ -628,16 +620,10 @@ ustorage_fs_t_bbb_data_dump_callback(str
/* Fallthrough */
case USB_ST_SETUP:
-tr_setup:
if (max_bulk > sc->sc_transfer.data_rem) {
max_bulk = sc->sc_transfer.data_rem;
}
- if (sc->sc_transfer.data_error) {
- sc->sc_transfer.data_error = 0;
- xfer->flags.stall_pipe = 1;
- } else {
- xfer->flags.stall_pipe = 0;
- }
+ sc->sc_transfer.data_error = 0;
xfer->frlengths[0] = max_bulk;
usb2_start_hardware(xfer);
break;
@@ -650,10 +636,10 @@ tr_setup:
* If the pipe is already stalled, don't do another stall:
*/
if (!xfer->pipe->is_stalled) {
- sc->sc_transfer.data_error = 1;
+ usb2_clear_endpoint_stall(xfer);
+ return;
}
- /* try again */
- goto tr_setup;
+ break;
}
}
@@ -681,17 +667,10 @@ ustorage_fs_t_bbb_data_read_callback(str
/* Fallthrough */
case USB_ST_SETUP:
-tr_setup:
if (max_bulk > sc->sc_transfer.data_rem) {
max_bulk = sc->sc_transfer.data_rem;
}
- if (sc->sc_transfer.data_error) {
- sc->sc_transfer.data_error = 0;
- xfer->flags.stall_pipe = 1;
- } else {
- xfer->flags.stall_pipe = 0;
- }
-
+ sc->sc_transfer.data_error = 0;
xfer->frlengths[0] = max_bulk;
usb2_set_frame_data(xfer, sc->sc_transfer.data_ptr, 0);
usb2_start_hardware(xfer);
@@ -703,10 +682,10 @@ tr_setup:
}
/* If the pipe is already stalled, don't do another stall */
if (!xfer->pipe->is_stalled) {
- sc->sc_transfer.data_error = 1;
+ usb2_clear_endpoint_stall(xfer);
+ return;
}
- /* try again */
- goto tr_setup;
+ break;
}
}
@@ -732,7 +711,6 @@ ustorage_fs_t_bbb_data_write_callback(st
break;
}
case USB_ST_SETUP:
-tr_setup:
if (max_bulk >= sc->sc_transfer.data_rem) {
max_bulk = sc->sc_transfer.data_rem;
if (sc->sc_transfer.data_short) {
@@ -744,13 +722,7 @@ tr_setup:
xfer->flags.force_short_xfer = 0;
}
- if (sc->sc_transfer.data_error) {
- sc->sc_transfer.data_error = 0;
- xfer->flags.stall_pipe = 1;
- } else {
- xfer->flags.stall_pipe = 0;
- }
-
+ sc->sc_transfer.data_error = 0;
xfer->frlengths[0] = max_bulk;
usb2_set_frame_data(xfer, sc->sc_transfer.data_ptr, 0);
usb2_start_hardware(xfer);
@@ -765,10 +737,10 @@ tr_setup:
* stall
*/
if (!xfer->pipe->is_stalled) {
- sc->sc_transfer.data_error = 1;
+ usb2_clear_endpoint_stall(xfer);
+ return;
}
- /* try again */
- goto tr_setup;
+ break;
}
}
@@ -785,17 +757,10 @@ ustorage_fs_t_bbb_status_callback(struct
break;
case USB_ST_SETUP:
-tr_setup:
USETDW(sc->sc_csw.dCSWSignature, CSWSIGNATURE);
USETDW(sc->sc_csw.dCSWDataResidue, sc->sc_transfer.data_rem);
- if (sc->sc_transfer.data_error) {
- sc->sc_transfer.data_error = 0;
- xfer->flags.stall_pipe = 1;
- } else {
- xfer->flags.stall_pipe = 0;
- }
-
+ sc->sc_transfer.data_error = 0;
xfer->frlengths[0] = sizeof(sc->sc_csw);
usb2_set_frame_data(xfer, &sc->sc_csw, 0);
usb2_start_hardware(xfer);
@@ -807,10 +772,10 @@ tr_setup:
}
/* If the pipe is already stalled, don't do another stall */
if (!xfer->pipe->is_stalled) {
- sc->sc_transfer.data_error = 1;
+ usb2_clear_endpoint_stall(xfer);
+ return;
}
- /* try again */
- goto tr_setup;
+ break;
}
}
More information about the svn-src-user
mailing list