diff options
author | phk <phk@FreeBSD.org> | 2004-09-28 20:23:49 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2004-09-28 20:23:49 +0000 |
commit | fd3b3185c9a72cba0bd7bc840f9bf3be86ee9b91 (patch) | |
tree | 8948e54f7ca4ca16b86864b035e0b5c43641f30f /sys | |
parent | f2271ed30b095a72f234bd411a7c251a8de45675 (diff) | |
download | FreeBSD-src-fd3b3185c9a72cba0bd7bc840f9bf3be86ee9b91.zip FreeBSD-src-fd3b3185c9a72cba0bd7bc840f9bf3be86ee9b91.tar.gz |
Use generic infrastructure for the ucom driver instead of local stuff.
This changes the naming of USB serial devices to: /dev/ttyU%d and
/dev/cuaU%d for call-in and call-out devices respectively. (Please
notice: capital 'U')
Please also note that we now have .init and .lock devices for USB
serial ports. These are not persistent across device removal. devd(8)
can be used to configure them on attachment time.
These changes also improve the chances of the system surviving if
the USB device is unplugged at an inconvenient time. At least we
do not rip things apart while there are any threads in the device
driver anymore.
Remove cdevsw, rely on the tty generic one.
Don't make_dev(), use ttycreate() which does all the magic.
In detach, do close procesing if we ripped things apart
while the device was open. Call ttyfree() once we're done
cleaning up.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/usb/ucom.c | 42 | ||||
-rw-r--r-- | sys/dev/usb/ucomvar.h | 2 |
2 files changed, 5 insertions, 39 deletions
diff --git a/sys/dev/usb/ucom.c b/sys/dev/usb/ucom.c index 76e07f1..98856b5 100644 --- a/sys/dev/usb/ucom.c +++ b/sys/dev/usb/ucom.c @@ -117,16 +117,6 @@ SYSCTL_INT(_hw_usb_ucom, OID_AUTO, debug, CTLFLAG_RW, #define DPRINTFN(n, x) #endif - - -static struct cdevsw ucom_cdevsw = { - .d_version = D_VERSION, - .d_open = ttyopen, - .d_close = ttyclose, - .d_name = "ucom", - .d_flags = D_TTY | D_NEEDGIANT, -}; - Static void ucom_cleanup(struct ucom_softc *); Static int ucomparam(struct tty *, struct termios *); Static void ucomstart(struct tty *); @@ -166,11 +156,6 @@ ucom_attach(struct ucom_softc *sc) unit = device_get_unit(sc->sc_dev); sc->sc_tty = tp = ttyalloc(); - sc->dev = make_dev(&ucom_cdevsw, unit | UCOM_CALLOUT_MASK, - UID_UUCP, GID_DIALER, 0660, - "ucom%d", unit); - sc->dev->si_tty = tp; - tp->t_dev = sc->dev; tp->t_sc = sc; tp->t_oproc = ucomstart; tp->t_param = ucomparam; @@ -183,7 +168,8 @@ ucom_attach(struct ucom_softc *sc) DPRINTF(("ucom_attach: tty_attach tp = %p\n", tp)); - DPRINTF(("ucom_attach: make_dev: ucom%d\n", unit)); + ttycreate(tp, NULL, unit, MINOR_CALLOUT, "U%d", unit); + DPRINTF(("ucom_attach: ttycreate: ttyU%d\n", unit)); return (0); } @@ -191,40 +177,25 @@ ucom_attach(struct ucom_softc *sc) int ucom_detach(struct ucom_softc *sc) { - struct tty *tp = sc->sc_tty; int s; DPRINTF(("ucom_detach: sc = %p, tp = %p\n", sc, sc->sc_tty)); sc->sc_dying = 1; ttygone(sc->sc_tty); + if (sc->sc_tty->t_state & TS_ISOPEN) + ucomclose(sc->sc_tty); if (sc->sc_bulkin_pipe != NULL) usbd_abort_pipe(sc->sc_bulkin_pipe); if (sc->sc_bulkout_pipe != NULL) usbd_abort_pipe(sc->sc_bulkout_pipe); - if (tp != NULL) { - if (tp->t_state & TS_ISOPEN) { - device_printf(sc->sc_dev, - "still open, forcing close\n"); - ttyld_close(tp, 0); - tty_close(tp); - } - } else { - DPRINTF(("ucom_detach: no tty\n")); - return (0); - } + ttyfree(sc->sc_tty); s = splusb(); - if (--sc->sc_refcnt >= 0) { - /* Wait for processes to go away. */ - usb_detach_wait(USBDEV(sc->sc_dev)); - } splx(s); - destroy_dev(sc->dev); - return (0); } @@ -329,7 +300,6 @@ ucomopen(struct tty *tp, struct cdev *dev) ucomstartread(sc); sc->sc_poll = 1; - sc->sc_refcnt++; return (0); @@ -351,8 +321,6 @@ ucomclose(struct tty *tp) if (sc->sc_callback->ucom_close != NULL) sc->sc_callback->ucom_close(sc->sc_parent, sc->sc_portno); - if (--sc->sc_refcnt < 0) - usb_detach_wakeup(USBDEV(sc->sc_dev)); } static int diff --git a/sys/dev/usb/ucomvar.h b/sys/dev/usb/ucomvar.h index 98aa0dd..3c6a487 100644 --- a/sys/dev/usb/ucomvar.h +++ b/sys/dev/usb/ucomvar.h @@ -153,10 +153,8 @@ struct ucom_softc { u_char sc_msr; u_char sc_mcr; - int sc_refcnt; u_char sc_dying; /* disconnecting */ - struct cdev *dev; /* special device node */ }; extern devclass_t ucom_devclass; |