PERFORCE change 102572 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Thu Jul 27 16:46:09 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=102572
Change 102572 by hselasky at hselasky_mini_itx on 2006/07/27 16:45:46
Make sure that STALL is cleared before starting access to
BULK/INTERRUPT endpoints and not afterwards.
Affected files ...
.. //depot/projects/usb/src/sys/dev/usb/ubsa.c#6 edit
.. //depot/projects/usb/src/sys/dev/usb/ukbd.c#8 edit
.. //depot/projects/usb/src/sys/dev/usb/ulpt.c#10 edit
.. //depot/projects/usb/src/sys/dev/usb/umodem.c#8 edit
.. //depot/projects/usb/src/sys/dev/usb/ums.c#8 edit
.. //depot/projects/usb/src/sys/dev/usb/uplcom.c#7 edit
.. //depot/projects/usb/src/sys/dev/usb/uvisor.c#6 edit
.. //depot/projects/usb/src/sys/dev/usb/uvscom.c#8 edit
Differences ...
==== //depot/projects/usb/src/sys/dev/usb/ubsa.c#6 (text+ko) ====
@@ -742,6 +742,12 @@
ubsa_open(struct ucom_softc *ucom)
{
struct ubsa_softc *sc = ucom->sc_parent;
+
+ /* clear stall first: */
+ sc->sc_flag |= (UBSA_FLAG_WRITE_STALL|
+ UBSA_FLAG_READ_STALL|
+ UBSA_FLAG_INTR_STALL);
+
usbd_transfer_start(sc->sc_xfer[4]);
return 0;
}
==== //depot/projects/usb/src/sys/dev/usb/ukbd.c#8 (text+ko) ====
@@ -136,7 +136,7 @@
#define UKBD_FLAG_COMPOSE 0x0001
#define UKBD_FLAG_POLLING 0x0002
#define UKBD_FLAG_SET_LEDS 0x0004
-#define UKBD_FLAG_PIPE_ERROR 0x0008
+#define UKBD_FLAG_INTR_STALL 0x0008
#define UKBD_FLAG_ATTACHED 0x0010
#define UKBD_FLAG_GONE 0x0020
@@ -437,42 +437,29 @@
}
static void
-ukbd_clear_stall_callback(struct usbd_xfer *xfer1)
+ukbd_clear_stall_callback(struct usbd_xfer *xfer)
{
- usb_device_request_t *req = xfer1->buffer;
- struct ukbd_softc *sc = xfer1->priv_sc;
- struct usbd_xfer *xfer0 = sc->sc_xfer[0];
+ struct ukbd_softc *sc = xfer->priv_sc;
+ struct usbd_xfer *xfer_other = sc->sc_xfer[0];
- USBD_CHECK_STATUS(xfer1);
+ USBD_CHECK_STATUS(xfer);
tr_setup:
+ /* start clear stall */
+ usbd_clear_stall_tr_setup(xfer, xfer_other);
+ return;
- /* setup a CLEAR STALL packet */
+ tr_transferred:
+ usbd_clear_stall_tr_transferred(xfer, xfer_other);
- 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);
+ sc->sc_flags &= ~UKBD_FLAG_INTR_STALL;
+ usbd_transfer_start(xfer_other);
+ return;
- usbd_start_hardware(xfer1);
- return;
-
tr_error:
- DPRINTF(0, "error=%s\n", usbd_errstr(xfer1->error));
-
- tr_transferred:
-
- sc->sc_flags &= ~UKBD_FLAG_PIPE_ERROR;
-
- if (xfer1->error != USBD_CANCELLED) {
-
- xfer0->pipe->clearstall = 0;
- xfer0->pipe->toggle_next = 0;
-
- usbd_transfer_start(xfer0);
- }
+ /* bomb out */
+ sc->sc_flags &= ~UKBD_FLAG_INTR_STALL;
+ DPRINTF(0, "error=%s\n", usbd_errstr(xfer->error));
return;
}
@@ -510,12 +497,14 @@
}
tr_setup:
- if (!(sc->sc_flags & UKBD_FLAG_PIPE_ERROR)) {
- if (sc->sc_inputs < UKBD_IN_BUF_FULL) {
- usbd_start_hardware(xfer);
- } else {
- DPRINTF(0, "input queue is full!\n");
- }
+ if (sc->sc_flags & UKBD_FLAG_INTR_STALL) {
+ usbd_transfer_start(sc->sc_xfer[1]);
+ return;
+ }
+ if (sc->sc_inputs < UKBD_IN_BUF_FULL) {
+ usbd_start_hardware(xfer);
+ } else {
+ DPRINTF(0, "input queue is full!\n");
}
return;
@@ -523,10 +512,8 @@
DPRINTF(0, "error=%s\n", usbd_errstr(xfer->error));
if (xfer->error != USBD_CANCELLED) {
-
- /* start clear stall */
- sc->sc_flags |= UKBD_FLAG_PIPE_ERROR;
-
+ /* try to clear stall first */
+ sc->sc_flags |= UKBD_FLAG_INTR_STALL;
usbd_transfer_start(sc->sc_xfer[1]);
}
return;
@@ -718,6 +705,10 @@
genkbd_diag(kbd, bootverbose);
}
+ /* clear stall first */
+
+ sc->sc_flags |= UKBD_FLAG_INTR_STALL;
+
/* start the keyboard */
usbd_transfer_start(sc->sc_xfer[0]);
==== //depot/projects/usb/src/sys/dev/usb/ulpt.c#10 (text+ko) ====
@@ -452,6 +452,16 @@
struct ulpt_softc *sc = cdev->sc_priv_ptr;
int32_t error = 0;
+ if (fflags & FREAD) {
+ /* clear stall first */
+ sc->sc_flags |= ULPT_FLAG_READ_STALL;
+ }
+
+ if (fflags & FWRITE) {
+ /* clear stall first */
+ sc->sc_flags |= ULPT_FLAG_WRITE_STALL;
+ }
+
if (prime) {
DPRINTF(0, "opening prime device (reset)\n");
==== //depot/projects/usb/src/sys/dev/usb/umodem.c#8 (text+ko) ====
@@ -536,6 +536,11 @@
DPRINTF(0, "sc=%p\n", sc);
+ /* clear stall first */
+ sc->sc_flag |= (UMODEM_FLAG_READ_STALL|
+ UMODEM_FLAG_WRITE_STALL|
+ UMODEM_FLAG_INTR_STALL);
+
if (sc->sc_xfer_intr[0]) {
usbd_transfer_start(sc->sc_xfer_intr[0]);
}
==== //depot/projects/usb/src/sys/dev/usb/ums.c#8 (text+ko) ====
@@ -735,6 +735,10 @@
sc->sc_status.dz = 0;
/* sc->sc_status.dt = 0; */
+ /* clear stall first */
+
+ sc->sc_flags |= UMS_FLAG_INTR_STALL;
+
/* start interrupt transfer */
usbd_transfer_start(sc->sc_xfer[0]);
==== //depot/projects/usb/src/sys/dev/usb/uplcom.c#7 (text+ko) ====
@@ -775,6 +775,11 @@
DPRINTF(0, "sc=%p\n", sc);
+ /* clear stall first */
+ sc->sc_flag |= (UPLCOM_FLAG_INTR_STALL|
+ UPLCOM_FLAG_READ_STALL|
+ UPLCOM_FLAG_WRITE_STALL);
+
usbd_transfer_start(sc->sc_xfer_intr[0]);
return (0);
==== //depot/projects/usb/src/sys/dev/usb/uvisor.c#6 (text+ko) ====
@@ -184,6 +184,9 @@
usbd_status
uvisor_init(struct uvisor_softc *sc, struct usbd_device *udev, struct usbd_config *config);
+static int
+uvisor_open(struct ucom_softc *ucom);
+
static void
uvisor_close(struct ucom_softc *ucom);
@@ -264,6 +267,7 @@
};
static const struct ucom_callback uvisor_callback = {
+ .ucom_open = &uvisor_open,
.ucom_close = &uvisor_close,
.ucom_start_read = &uvisor_start_read,
.ucom_stop_read = &uvisor_stop_read,
@@ -589,6 +593,17 @@
return err;
}
+static int
+uvisor_open(struct ucom_softc *ucom)
+{
+ struct uvisor_softc *sc = ucom->sc_parent;
+
+ /* clear stall first */
+ sc->sc_flag |= (UVISOR_FLAG_WRITE_STALL|
+ UVISOR_FLAG_READ_STALL);
+ return 0;
+}
+
static void
uvisor_close(struct ucom_softc *ucom)
{
==== //depot/projects/usb/src/sys/dev/usb/uvscom.c#8 (text+ko) ====
@@ -473,6 +473,10 @@
goto detach;
}
+ /* clear stall first */
+
+ sc->sc_flag |= UVSCOM_FLAG_INTR_STALL;
+
/* start interrupt pipe */
usbd_transfer_start(sc->sc_xfer[4]);
@@ -971,7 +975,10 @@
DPRINTF(0, "sc = %p\n", sc);
- sc->sc_flag |= UVSCOM_FLAG_OPEN;
+ /* clear stall first */
+ sc->sc_flag |= (UVSCOM_FLAG_OPEN|
+ UVSCOM_FLAG_WRITE_STALL|
+ UVSCOM_FLAG_READ_STALL);
/* check if PC card was inserted */
More information about the p4-projects
mailing list