diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/usb/ucycom.c | 107 |
1 files changed, 13 insertions, 94 deletions
diff --git a/sys/dev/usb/ucycom.c b/sys/dev/usb/ucycom.c index 83c21b3..2c32a80 100644 --- a/sys/dev/usb/ucycom.c +++ b/sys/dev/usb/ucycom.c @@ -65,7 +65,6 @@ __FBSDID("$FreeBSD$"); struct ucycom_softc { device_t sc_dev; - struct cdev *sc_cdev; struct tty *sc_tty; int sc_error; unsigned long sc_cintr; @@ -101,35 +100,20 @@ struct ucycom_softc { uint8_t sc_ost; /* status flags for next output */ /* flags */ - char sc_open; char sc_dying; }; static int ucycom_probe(device_t); static int ucycom_attach(device_t); static int ucycom_detach(device_t); -static int ucycom_open(struct cdev *, int, int, struct thread *); -static int ucycom_close(struct cdev *, int, int, struct thread *); -static int ucycom_ioctl(struct cdev *, unsigned long, caddr_t, int, struct thread *); -static int ucycom_read(struct cdev *, struct uio *, int); -static int ucycom_write(struct cdev *, struct uio *, int); +static t_open_t ucycom_open; +static t_close_t ucycom_close; static void ucycom_start(struct tty *); static void ucycom_stop(struct tty *, int); static int ucycom_param(struct tty *, struct termios *); static int ucycom_configure(struct ucycom_softc *, uint32_t, uint8_t); static void ucycom_intr(usbd_xfer_handle, usbd_private_handle, usbd_status); -static struct cdevsw ucycom_cdevsw = { - .d_version = D_VERSION, - .d_open = ucycom_open, - .d_close = ucycom_close, - .d_ioctl = ucycom_ioctl, - .d_read = ucycom_read, - .d_write = ucycom_write, - .d_name = "ucycom", - .d_flags = D_TTY | D_NEEDGIANT, -}; - static device_method_t ucycom_methods[] = { DEVMETHOD(device_probe, ucycom_probe), DEVMETHOD(device_attach, ucycom_attach), @@ -274,11 +258,13 @@ ucycom_attach(device_t dev) sc->sc_iep = ued->bEndpointAddress; /* set up tty */ - sc->sc_tty = ttymalloc(sc->sc_tty); + sc->sc_tty = ttyalloc(); sc->sc_tty->t_sc = sc; sc->sc_tty->t_oproc = ucycom_start; sc->sc_tty->t_stop = ucycom_stop; sc->sc_tty->t_param = ucycom_param; + sc->sc_tty->t_open = ucycom_open; + sc->sc_tty->t_close = ucycom_close; SYSCTL_ADD_INT(device_get_sysctl_ctx(dev), SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), @@ -298,9 +284,7 @@ ucycom_attach(device_t dev) "output bytes"); /* create character device node */ - sc->sc_cdev = make_dev(&ucycom_cdevsw, device_get_unit(sc->sc_dev), - UID_ROOT, GID_WHEEL, 0640, "%s", device_get_nameunit(sc->sc_dev)); - sc->sc_cdev->si_drv1 = sc; + ttycreate(sc->sc_tty, NULL, 0, 0, "y%r", device_get_unit(sc->sc_dev)); return (0); } @@ -312,7 +296,7 @@ ucycom_detach(device_t dev) sc = device_get_softc(dev); - destroy_dev(sc->sc_cdev); + ttyfree(sc->sc_tty); return (0); } @@ -324,28 +308,14 @@ ucycom_detach(device_t dev) */ static int -ucycom_open(struct cdev *cdev, int flags, int type, struct thread *td) +ucycom_open(struct tty *tp, struct cdev *cdev) { - struct ucycom_softc *sc = cdev->si_drv1; + struct ucycom_softc *sc = tp->t_sc; int error; - if (sc->sc_open != 0) - return (EBUSY); - /* set default configuration */ ucycom_configure(sc, UCYCOM_DEFAULT_RATE, UCYCOM_DEFAULT_CFG); - /* open tty and line discipline */ - error = tty_open(cdev, sc->sc_tty); - if (error != 0) - return (error); - error = ttyld_open(sc->sc_tty, cdev); - if (error != 0) { - tty_close(sc->sc_tty); - return (error); - } - sc->sc_cdev->si_tty = sc->sc_tty; - /* open interrupt pipe */ error = usbd_open_pipe_intr(sc->sc_iface, sc->sc_iep, 0, &sc->sc_pipe, sc, sc->sc_ibuf, sc->sc_ilen, @@ -353,8 +323,6 @@ ucycom_open(struct cdev *cdev, int flags, int type, struct thread *td) if (error != 0) { device_printf(sc->sc_dev, "failed to open interrupt pipe: %s\n", usbd_errstr(error)); - ttyld_close(sc->sc_tty, 0); - tty_close(sc->sc_tty); return (ENXIO); } @@ -364,69 +332,20 @@ ucycom_open(struct cdev *cdev, int flags, int type, struct thread *td) "can" : "can't"); /* done! */ - sc->sc_open = 1; return (0); } -static int -ucycom_close(struct cdev *cdev, int flags, int type, struct thread *td) +static void +ucycom_close(struct tty *tp) { - struct ucycom_softc *sc = cdev->si_drv1; - - if (sc->sc_open == 0) - return (0); + struct ucycom_softc *sc = tp->t_sc; /* stop interrupts and close the interrupt pipe */ usbd_abort_pipe(sc->sc_pipe); usbd_close_pipe(sc->sc_pipe); sc->sc_pipe = 0; - /* close line discipline and tty */ - ttyld_close(sc->sc_tty, flags); - tty_close(sc->sc_tty); - - /* done! */ - sc->sc_open = 0; - return (0); -} - -static int -ucycom_ioctl(struct cdev *cdev, unsigned long cmd, caddr_t data, - int flags, struct thread *td) -{ - struct ucycom_softc *sc = cdev->si_drv1; - int error; - - (void)sc; - error = ttyioctl(cdev, cmd, data, flags, td); - - return (error); -} - -static int -ucycom_read(struct cdev *cdev, struct uio *uio, int flags) -{ - struct ucycom_softc *sc = cdev->si_drv1; - int error; - - if (sc->sc_error) - return (EIO); - - error = ttyld_read(sc->sc_tty, uio, flags); - return (error); -} - -static int -ucycom_write(struct cdev *cdev, struct uio *uio, int flags) -{ - struct ucycom_softc *sc = cdev->si_drv1; - int error; - - if (sc->sc_error) - return (EIO); - - error = ttyld_write(sc->sc_tty, uio, flags); - return (error); + return; } /***************************************************************************** |