diff options
author | phk <phk@FreeBSD.org> | 2004-06-21 20:09:23 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2004-06-21 20:09:23 +0000 |
commit | 44cdf7deb47a6e1c33d2167e9ff3a7554deb57d1 (patch) | |
tree | 68d5c16afd344897db9bbd5b4f365fcb789190a8 /sys/dev/sio | |
parent | 98d43ce6f11b67bbc596c1d5813c3ae5468389c5 (diff) | |
download | FreeBSD-src-44cdf7deb47a6e1c33d2167e9ff3a7554deb57d1.zip FreeBSD-src-44cdf7deb47a6e1c33d2167e9ff3a7554deb57d1.tar.gz |
Give control devices their own cdevsw{} so that we can eliminate them
from the trafic functions.
Do not use com_addr() when we don't need it.
Diffstat (limited to 'sys/dev/sio')
-rw-r--r-- | sys/dev/sio/sio.c | 162 |
1 files changed, 111 insertions, 51 deletions
diff --git a/sys/dev/sio/sio.c b/sys/dev/sio/sio.c index 3281428..a716883 100644 --- a/sys/dev/sio/sio.c +++ b/sys/dev/sio/sio.c @@ -327,6 +327,22 @@ static struct cdevsw sio_cdevsw = { .d_flags = D_TTY | D_NEEDGIANT, }; +static d_open_t siocopen; +static d_close_t siocclose; +static d_read_t siocrdwr; +static d_ioctl_t siocioctl; + +static struct cdevsw sioc_cdevsw = { + .d_version = D_VERSION, + .d_open = siocopen, + .d_close = siocclose, + .d_read = siocrdwr, + .d_write = siocrdwr, + .d_ioctl = siocioctl, + .d_name = sio_driver_name, + .d_flags = D_TTY | D_NEEDGIANT, +}; + int comconsole = -1; static volatile speed_t comdefaultrate = CONSPEED; static u_long comdefaultrclk = DEFAULT_RCLK; @@ -1125,16 +1141,16 @@ determined_type: ; minorbase = UNIT_TO_MINOR(unit); com->devs[0] = make_dev(&sio_cdevsw, minorbase, UID_ROOT, GID_WHEEL, 0600, "ttyd%r", unit); - com->devs[1] = make_dev(&sio_cdevsw, minorbase | CONTROL_INIT_STATE, + com->devs[1] = make_dev(&sioc_cdevsw, minorbase | CONTROL_INIT_STATE, UID_ROOT, GID_WHEEL, 0600, "ttyid%r", unit); - com->devs[2] = make_dev(&sio_cdevsw, minorbase | CONTROL_LOCK_STATE, + com->devs[2] = make_dev(&sioc_cdevsw, minorbase | CONTROL_LOCK_STATE, UID_ROOT, GID_WHEEL, 0600, "ttyld%r", unit); com->devs[3] = make_dev(&sio_cdevsw, minorbase | CALLOUT_MASK, UID_UUCP, GID_DIALER, 0660, "cuaa%r", unit); - com->devs[4] = make_dev(&sio_cdevsw, + com->devs[4] = make_dev(&sioc_cdevsw, minorbase | CALLOUT_MASK | CONTROL_INIT_STATE, UID_UUCP, GID_DIALER, 0660, "cuaia%r", unit); - com->devs[5] = make_dev(&sio_cdevsw, + com->devs[5] = make_dev(&sioc_cdevsw, minorbase | CALLOUT_MASK | CONTROL_LOCK_STATE, UID_UUCP, GID_DIALER, 0660, "cuala%r", unit); for (rid = 0; rid < 6; rid++) @@ -1179,6 +1195,23 @@ determined_type: ; } static int +siocopen(dev, flag, mode, td) + struct cdev *dev; + int flag; + int mode; + struct thread *td; +{ + struct com_s *com; + + com = dev->si_drv1; + if (com == NULL) + return (ENXIO); + if (com->gone) + return (ENXIO); + return (0); +} + +static int sioopen(dev, flag, mode, td) struct cdev *dev; int flag; @@ -1194,13 +1227,11 @@ sioopen(dev, flag, mode, td) mynor = minor(dev); unit = MINOR_TO_UNIT(mynor); - com = com_addr(unit); + com = dev->si_drv1; if (com == NULL) return (ENXIO); if (com->gone) return (ENXIO); - if (mynor & CONTROL_MASK) - return (0); tp = dev->si_tty = com->tp = ttymalloc(com->tp); s = spltty(); /* @@ -1362,6 +1393,17 @@ out: } static int +siocclose(dev, flag, mode, td) + struct cdev *dev; + int flag; + int mode; + struct thread *td; +{ + + return (0); +} + +static int sioclose(dev, flag, mode, td) struct cdev *dev; int flag; @@ -1374,9 +1416,7 @@ sioclose(dev, flag, mode, td) struct tty *tp; mynor = minor(dev); - if (mynor & CONTROL_MASK) - return (0); - com = com_addr(MINOR_TO_UNIT(mynor)); + com = dev->si_drv1; if (com == NULL) return (ENODEV); tp = com->tp; @@ -1459,18 +1499,24 @@ comhardclose(com) } static int +siocrdwr(dev, uio, flag) + struct cdev *dev; + struct uio *uio; + int flag; +{ + + return (ENODEV); +} + +static int sioread(dev, uio, flag) struct cdev *dev; struct uio *uio; int flag; { - int mynor; struct com_s *com; - mynor = minor(dev); - if (mynor & CONTROL_MASK) - return (ENODEV); - com = com_addr(MINOR_TO_UNIT(mynor)); + com = dev->si_drv1; if (com == NULL || com->gone) return (ENODEV); return (ttyld_read(com->tp, uio, flag)); @@ -1487,8 +1533,6 @@ siowrite(dev, uio, flag) int unit; mynor = minor(dev); - if (mynor & CONTROL_MASK) - return (ENODEV); unit = MINOR_TO_UNIT(mynor); com = com_addr(unit); @@ -1960,6 +2004,55 @@ txrdy: } static int +siocioctl(dev, cmd, data, flag, td) + struct cdev *dev; + u_long cmd; + caddr_t data; + int flag; + struct thread *td; +{ + struct com_s *com; + int error; + int mynor; + struct termios *ct; + + mynor = minor(dev); + com = com_addr(MINOR_TO_UNIT(mynor)); + if (com == NULL || com->gone) + return (ENODEV); + + switch (mynor & CONTROL_MASK) { + case CONTROL_INIT_STATE: + ct = mynor & CALLOUT_MASK ? &com->it_out : &com->it_in; + break; + case CONTROL_LOCK_STATE: + ct = mynor & CALLOUT_MASK ? &com->lt_out : &com->lt_in; + break; + default: + return (ENODEV); /* /dev/nodev */ + } + switch (cmd) { + case TIOCSETA: + error = suser(td); + if (error != 0) + return (error); + *ct = *(struct termios *)data; + return (0); + case TIOCGETA: + *(struct termios *)data = *ct; + return (0); + case TIOCGETD: + *(int *)data = TTYDISC; + return (0); + case TIOCGWINSZ: + bzero(data, sizeof(struct winsize)); + return (0); + default: + return (ENOTTY); + } +} + +static int sioioctl(dev, cmd, data, flag, td) struct cdev *dev; u_long cmd; @@ -1978,42 +2071,9 @@ sioioctl(dev, cmd, data, flag, td) #endif mynor = minor(dev); - com = com_addr(MINOR_TO_UNIT(mynor)); + com = dev->si_drv1; if (com == NULL || com->gone) return (ENODEV); - if (mynor & CONTROL_MASK) { - struct termios *ct; - - switch (mynor & CONTROL_MASK) { - case CONTROL_INIT_STATE: - ct = mynor & CALLOUT_MASK ? &com->it_out : &com->it_in; - break; - case CONTROL_LOCK_STATE: - ct = mynor & CALLOUT_MASK ? &com->lt_out : &com->lt_in; - break; - default: - return (ENODEV); /* /dev/nodev */ - } - switch (cmd) { - case TIOCSETA: - error = suser(td); - if (error != 0) - return (error); - *ct = *(struct termios *)data; - return (0); - case TIOCGETA: - *(struct termios *)data = *ct; - return (0); - case TIOCGETD: - *(int *)data = TTYDISC; - return (0); - case TIOCGWINSZ: - bzero(data, sizeof(struct winsize)); - return (0); - default: - return (ENOTTY); - } - } tp = com->tp; #if defined(COMPAT_43) term = tp->t_termios; |