PERFORCE change 98974 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Sun Jun 11 08:25:55 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=98974
Change 98974 by hselasky at hselasky_mini_itx on 2006/06/11 08:22:50
Improve handling of "clear-stall".
Affected files ...
.. //depot/projects/usb/src/sys/dev/usb/ums.c#5 edit
Differences ...
==== //depot/projects/usb/src/sys/dev/usb/ums.c#5 (text+ko) ====
@@ -110,7 +110,7 @@
#define UMS_FLAG_T_AXIS 0x0008
#define UMS_FLAG_SBU 0x0010 /* spurious button up events */
#define UMS_FLAG_SELECT 0x0020 /* select is waiting */
-#define UMS_FLAG_PIPE_ERROR 0x0040 /* set if transfer error */
+#define UMS_FLAG_INTR_STALL 0x0040 /* set if transfer error */
#define UMS_FLAG_WAIT_USB 0x0080 /* device is waiting for callbacks */
#define UMS_FLAG_WAIT_CO 0x0100 /* device is waiting for callbacks */
#define UMS_FLAG_GONE 0x0200 /* device is gone */
@@ -152,40 +152,29 @@
}
static void
-ums_clear_stall_callback(struct usbd_xfer *xfer1)
+ums_clear_stall_callback(struct usbd_xfer *xfer)
{
- usb_device_request_t *req = xfer1->buffer;
- struct ums_softc *sc = xfer1->priv_sc;
- struct usbd_xfer *xfer0 = sc->sc_xfer[0];
+ struct ums_softc *sc = xfer->priv_sc;
- USBD_CHECK_STATUS(xfer1);
+ USBD_CHECK_STATUS(xfer);
tr_setup:
-
- /* setup a CLEAR STALL packet */
-
- req->bmRequestType = UT_WRITE_ENDPOINT;
- req->bRequest = UR_CLEAR_FEATURE;
- USETW(req->wValue, UF_ENDPOINT_HALT);
- req->wIndex[0] = xfer0->pipe->edesc->bEndpointAddress;
- req->wIndex[1] = 0;
- USETW(req->wLength, 0);
-
- usbd_start_hardware(xfer1);
+ /* start clear stall */
+ usbd_clear_stall_tr_setup(xfer, sc->sc_xfer[0]);
return;
- tr_error:
tr_transferred:
+ usbd_clear_stall_tr_transferred(xfer, sc->sc_xfer[0]);
- sc->sc_flags &= ~UMS_FLAG_PIPE_ERROR;
+ sc->sc_flags &= ~UMS_FLAG_INTR_STALL;
+ usbd_transfer_start(sc->sc_xfer[0]);
+ return;
- if (xfer1->error != USBD_CANCELLED) {
-
- xfer0->pipe->clearstall = 0;
- xfer0->pipe->toggle_next = 0;
-
- usbd_transfer_start(xfer0);
- }
+ tr_error:
+ /* bomb out */
+ sc->sc_flags &= ~UMS_FLAG_INTR_STALL;
+ DPRINTF(0, "clear stall failed, error=%s!\n",
+ usbd_errstr(xfer->error));
return;
}
@@ -294,18 +283,21 @@
}
tr_setup:
- USBD_IF_POLL(&sc->sc_rdq_free, m);
+ if (sc->sc_flags & UMS_FLAG_INTR_STALL) {
+ usbd_transfer_start(sc->sc_xfer[1]);
+ } else {
+ USBD_IF_POLL(&sc->sc_rdq_free, m);
- if (m && (!(sc->sc_flags & UMS_FLAG_PIPE_ERROR))) {
- usbd_start_hardware(xfer);
+ if (m) {
+ usbd_start_hardware(xfer);
+ }
}
return;
tr_error:
if (xfer->error != USBD_CANCELLED) {
/* start clear stall */
- sc->sc_flags |= UMS_FLAG_PIPE_ERROR;
-
+ sc->sc_flags |= UMS_FLAG_INTR_STALL;
usbd_transfer_start(sc->sc_xfer[1]);
}
return;
More information about the p4-projects
mailing list