Date: Sun, 1 Feb 2009 02:04:24 +0000 (UTC) From: Andrew Thompson <thompsa@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r187974 - in user/thompsa/usb/sys/dev/usb2: bluetooth core ethernet serial storage Message-ID: <200902010204.n1124O9m039927@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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; } }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200902010204.n1124O9m039927>