Index: dwc_otg.c =================================================================== RCS file: /cvsroot/src/sys/dev/usb/dwc_otg.c,v retrieving revision 1.32 diff -u -p -u -r1.32 dwc_otg.c --- dwc_otg.c 21 Jan 2013 13:25:44 -0000 1.32 +++ dwc_otg.c 22 Jan 2013 12:43:15 -0000 @@ -245,8 +245,6 @@ Static void dwc_otg_worker(struct work Static void dwc_otg_rhc(void *); Static void dwc_otg_vbus_interrupt(struct dwc_otg_softc *); Static void dwc_otg_standard_done(usbd_xfer_handle); -Static usbd_status dwc_otg_standard_done_sub(usbd_xfer_handle); -Static void dwc_otg_device_done(usbd_xfer_handle, usbd_status); Static void dwc_otg_setup_standard_chain(usbd_xfer_handle); Static void dwc_otg_start_standard_chain(usbd_xfer_handle); @@ -3994,120 +3992,52 @@ dwc_otg_rhc(void *addr) } -Static usbd_status -dwc_otg_standard_done_sub(usbd_xfer_handle xfer) +Static void +dwc_otg_standard_done(usbd_xfer_handle xfer) { - struct dwc_otg_xfer *dxfer = (struct dwc_otg_xfer *)xfer; - usbd_pipe_handle pipe = xfer->pipe; + struct dwc_otg_xfer *dxfer = DWC_OTG_XFER2DXFER(xfer); + struct dwc_otg_softc *sc = xfer->pipe->device->bus->hci_private; struct dwc_otg_td *td; - uint32_t len; - usbd_status error; + usbd_status err = 0; - DPRINTFN(9, "td %p\n", dxfer->td_transfer_cache); + DPRINTFN(13, "xfer=%p endpoint=%p transfer done\n", + xfer, xfer->pipe->endpoint); - td = dxfer->td_transfer_cache; + /* reset scanner */ - do { - xfer->actlen += td->actlen; + for (td = dxfer->td_transfer_first; ; td = td->obj_next) { - len = td->remainder; + xfer->actlen += td->actlen; /* store last data toggle */ - pipe->endpoint->datatoggle = td->toggle; + xfer->pipe->endpoint->datatoggle = td->toggle; /* Check for transfer error */ if (td->error_any) { /* the transfer is finished */ - error = (td->error_stall ? USBD_STALLED : USBD_IOERROR); - td = NULL; + err = (td->error_stall ? USBD_STALLED : USBD_IOERROR); break; } + /* Check for short transfer */ - if (len > 0) { - //if (xfer->flags & USBD_SHORT_XFER_OK) { - if (0) { - /* follow alt next */ - if (td->alt_next) { - td = td->obj_next; - } else { - td = NULL; - } - } else { - /* the transfer is finished */ - td = NULL; - } - error = 0; + if (td->remainder > 0) { + /* the transfer is finished */ + err = 0; break; } - td = td->obj_next; - - /* this USB frame is complete */ - error = 0; - break; - - } while (0); - - /* update transfer cache */ - - dxfer->td_transfer_cache = td; - - return error; -} - -Static void -dwc_otg_standard_done(usbd_xfer_handle xfer) -{ - struct dwc_otg_xfer *dxfer = DWC_OTG_XFER2DXFER(xfer); - - struct dwc_otg_td *td; - usbd_status err = 0; - - DPRINTFN(13, "xfer=%p endpoint=%p transfer done\n", - xfer, xfer->pipe->endpoint); - - /* reset scanner */ - - dxfer->td_transfer_cache = dxfer->td_transfer_first; - td = dxfer->td_transfer_first; - - while (td != NULL) { - err = dwc_otg_standard_done_sub(xfer); - if (dxfer->td_transfer_cache == NULL) { - goto done; - } + /* this TD is complete - move onto next if more to do */ if (td == dxfer->td_transfer_last) break; - td = td->obj_next; - }; -done: - dwc_otg_device_done(xfer, err); -} - -/*------------------------------------------------------------------------* - * dwc_otg_device_done - * - * NOTE: this function can be called more than one time on the - * same USB transfer! - *------------------------------------------------------------------------*/ -Static void -dwc_otg_device_done(usbd_xfer_handle xfer, usbd_status error) -{ - struct dwc_otg_xfer *dxfer = (struct dwc_otg_xfer *)xfer; - struct dwc_otg_softc *sc = DWC_OTG_XFER2SC(xfer); - - DPRINTFN(9, "xfer=%p, endpoint=%p, error=%d\n", - xfer, xfer->pipe->endpoint, error); - struct dwc_otg_td *td; + }; KASSERT(mutex_owned(&sc->sc_intr_lock)); - td = dxfer->td_transfer_first; - + if (td != NULL) dwc_otg_host_channel_free(td); - xfer->status = error; + xfer->status = err; TAILQ_REMOVE(&sc->sc_active, dxfer, xnext); callout_stop(&xfer->timeout_handle);