diff options
| author | Ian Dowse <iedowse@FreeBSD.org> | 2005-04-12 23:45:34 +0000 |
|---|---|---|
| committer | Ian Dowse <iedowse@FreeBSD.org> | 2005-04-12 23:45:34 +0000 |
| commit | daa923680cc0f4cc9a42d99b82ead36bcda45a5d (patch) | |
| tree | 91e68cdb43e17362181f06aed12cee87c33c5398 /sys/dev | |
| parent | 1d632169c36a0fb1f1c4cebcc14a68f977b4e10b (diff) | |
Notes
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/usb/ucom.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/sys/dev/usb/ucom.c b/sys/dev/usb/ucom.c index f85619563cb2..44dd458ad236 100644 --- a/sys/dev/usb/ucom.c +++ b/sys/dev/usb/ucom.c @@ -381,6 +381,7 @@ ucomopen(struct cdev *dev, int flag, int mode, usb_proc_ptr p) (minor(dev) & UCOM_CALLOUT_MASK)) ttyld_modem(tp, 1); + sc->sc_state |= UCS_RXSTOP; ucomstartread(sc); } @@ -929,7 +930,7 @@ ucomstop(struct tty *tp, int flag) DPRINTF(("ucomstop: %d\n", flag)); - if (flag & FREAD) { + if ((flag & FREAD) && (sc->sc_state & UCS_RXSTOP) == 0) { DPRINTF(("ucomstop: read\n")); ucomstopread(sc); ucomstartread(sc); @@ -1009,10 +1010,9 @@ ucomstartread(struct ucom_softc *sc) DPRINTF(("ucomstartread: start\n")); - sc->sc_state &= ~UCS_RXSTOP; - - if (sc->sc_bulkin_pipe == NULL) + if (sc->sc_bulkin_pipe == NULL || (sc->sc_state & UCS_RXSTOP) == 0) return (USBD_NORMAL_COMPLETION); + sc->sc_state &= ~UCS_RXSTOP; usbd_setup_xfer(sc->sc_ixfer, sc->sc_bulkin_pipe, (usbd_private_handle)sc, @@ -1021,7 +1021,8 @@ ucomstartread(struct ucom_softc *sc) USBD_NO_TIMEOUT, ucomreadcb); err = usbd_transfer(sc->sc_ixfer); - if (err != USBD_IN_PROGRESS) { + if (err && err != USBD_IN_PROGRESS) { + sc->sc_state |= UCS_RXSTOP; DPRINTF(("ucomstartread: err = %s\n", usbd_errstr(err))); return (err); } @@ -1046,11 +1047,13 @@ ucomreadcb(usbd_xfer_handle xfer, usbd_private_handle p, usbd_status status) if (!(sc->sc_state & UCS_RXSTOP)) printf("%s: ucomreadcb: %s\n", USBDEVNAME(sc->sc_dev), usbd_errstr(status)); + sc->sc_state |= UCS_RXSTOP; if (status == USBD_STALLED) usbd_clear_endpoint_stall_async(sc->sc_bulkin_pipe); /* XXX we should restart after some delay. */ return; } + sc->sc_state |= UCS_RXSTOP; usbd_get_xfer_status(xfer, NULL, (void **)&cp, &cc, NULL); DPRINTF(("ucomreadcb: got %d chars, tp = %p\n", cc, tp)); |
