Date: Sun, 21 Sep 2008 14:45:25 GMT From: Hans Petter Selasky <hselasky@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 150210 for review Message-ID: <200809211445.m8LEjPTt058945@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=150210 Change 150210 by hselasky@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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200809211445.m8LEjPTt058945>
