PERFORCE change 150210 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Sun Sep 21 14:45:27 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=150210
Change 150210 by hselasky at hselasky_laptop001 on 2008/09/21 14:45:03
usb2_fifo_opened() returns the wrong value when
the FIFOs are being flushed. Store a pointer
to the last opened FIFO instead, because "ulpt" has
two devices: /dev/ulptX and /dev/unlptX and only
one can be opened at a time.
Affected files ...
.. //depot/projects/usb/src/sys/dev/usb2/serial/ulpt2.c#7 edit
Differences ...
==== //depot/projects/usb/src/sys/dev/usb2/serial/ulpt2.c#7 (text+ko) ====
@@ -96,6 +96,7 @@
device_t sc_dev;
struct usb2_device *sc_udev;
+ struct usb2_fifo *sc_fifo_open[2];
struct usb2_xfer *sc_xfer[ULPT_N_TRANSFER];
int sc_fflags; /* current open flags, FREAD and
@@ -125,7 +126,6 @@
static void ulpt_reset(struct ulpt_softc *sc);
static void ulpt_watchdog(void *arg);
-static struct usb2_fifo *ulpt_find_fifo(struct ulpt_softc *sc, uint8_t dir);
static usb2_fifo_close_t ulpt_close;
static usb2_fifo_cmd_t ulpt_start_read;
@@ -191,30 +191,26 @@
return;
}
-static struct usb2_fifo *
-ulpt_find_fifo(struct ulpt_softc *sc, uint8_t dir)
-{
- if (usb2_fifo_opened(sc->sc_fifo.fp[dir])) {
- return (sc->sc_fifo.fp[dir]);
- }
- /* else we assume that the other FIFO is opened */
- return (sc->sc_fifo_noreset.fp[dir]);
-}
-
-
static void
ulpt_write_callback(struct usb2_xfer *xfer)
{
struct ulpt_softc *sc = xfer->priv_sc;
- struct usb2_fifo *f = ulpt_find_fifo(sc, USB_FIFO_TX);
+ struct usb2_fifo *f = sc->sc_fifo_open[USB_FIFO_TX];
uint32_t actlen;
+ if (f == NULL) {
+ /* should not happen */
+ DPRINTF("no FIFO\n");
+ return;
+ }
+ DPRINTF("state=0x%x\n", USB_GET_STATE(xfer));
+
switch (USB_GET_STATE(xfer)) {
case USB_ST_TRANSFERRED:
case USB_ST_SETUP:
if (sc->sc_flags & ULPT_FLAG_WRITE_STALL) {
usb2_transfer_start(sc->sc_xfer[3]);
- return;
+ break;
}
if (usb2_fifo_get_data(f, xfer->frbuffers,
0, xfer->max_data_length, &actlen, 0)) {
@@ -222,7 +218,7 @@
xfer->frlengths[0] = actlen;
usb2_start_hardware(xfer);
}
- return;
+ break;
default: /* Error */
if (xfer->error != USB_ERR_CANCELLED) {
@@ -230,8 +226,9 @@
sc->sc_flags |= ULPT_FLAG_WRITE_STALL;
usb2_transfer_start(sc->sc_xfer[3]);
}
- return;
+ break;
}
+ return;
}
static void
@@ -252,7 +249,14 @@
ulpt_read_callback(struct usb2_xfer *xfer)
{
struct ulpt_softc *sc = xfer->priv_sc;
- struct usb2_fifo *f = ulpt_find_fifo(sc, USB_FIFO_RX);
+ struct usb2_fifo *f = sc->sc_fifo_open[USB_FIFO_RX];
+
+ if (f == NULL) {
+ /* should not happen */
+ DPRINTF("no FIFO\n");
+ return;
+ }
+ DPRINTF("state=0x%x\n", USB_GET_STATE(xfer));
switch (USB_GET_STATE(xfer)) {
case USB_ST_TRANSFERRED:
@@ -278,13 +282,13 @@
case USB_ST_SETUP:
if (sc->sc_flags & ULPT_FLAG_READ_STALL) {
usb2_transfer_start(sc->sc_xfer[4]);
- return;
+ break;
}
if (usb2_fifo_put_bytes_max(f) != 0) {
xfer->frlengths[0] = xfer->max_data_length;
usb2_start_hardware(xfer);
}
- return;
+ break;
default: /* Error */
/* disable BULK throttle */
@@ -296,8 +300,9 @@
sc->sc_flags |= ULPT_FLAG_READ_STALL;
usb2_transfer_start(sc->sc_xfer[4]);
}
- return;
+ break;
}
+ return;
}
static void
@@ -486,6 +491,8 @@
ULPT_IFQ_MAXLEN)) {
return (ENOMEM);
}
+ /* set which FIFO is opened */
+ sc->sc_fifo_open[USB_FIFO_RX] = fifo;
}
if (fflags & FWRITE) {
/* clear stall first */
@@ -497,6 +504,8 @@
ULPT_IFQ_MAXLEN)) {
return (ENOMEM);
}
+ /* set which FIFO is opened */
+ sc->sc_fifo_open[USB_FIFO_TX] = fifo;
}
sc->sc_fflags |= fflags & (FREAD | FWRITE);
return (0);
More information about the p4-projects
mailing list