summaryrefslogtreecommitdiffstats
path: root/sys/dev/uart
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2004-06-25 10:54:05 +0000
committerphk <phk@FreeBSD.org>2004-06-25 10:54:05 +0000
commit6afc611f2d02f2c3719a1538e0fd24cd856fccc4 (patch)
treed55d76b7205e92acd355d30ea46a766ad89465f5 /sys/dev/uart
parentdf5acb7bc08d4c560df8c472fa57fabd06528bd7 (diff)
downloadFreeBSD-src-6afc611f2d02f2c3719a1538e0fd24cd856fccc4.zip
FreeBSD-src-6afc611f2d02f2c3719a1538e0fd24cd856fccc4.tar.gz
Use generic support for BREAK and modem control ioctls.
Diffstat (limited to 'sys/dev/uart')
-rw-r--r--sys/dev/uart/uart_tty.c92
1 files changed, 27 insertions, 65 deletions
diff --git a/sys/dev/uart/uart_tty.c b/sys/dev/uart/uart_tty.c
index c7b55d9..678e6df 100644
--- a/sys/dev/uart/uart_tty.c
+++ b/sys/dev/uart/uart_tty.c
@@ -240,6 +240,27 @@ uart_tty_param(struct tty *tp, struct termios *t)
return (0);
}
+static int
+uart_tty_modem(struct tty *tp, int biton, int bitoff)
+{
+ struct uart_softc *sc;
+
+ sc = tp->t_dev->si_drv1;
+ if (biton != 0 || bitoff != 0)
+ UART_SETSIG(sc, SER_DELTA(bitoff|biton) | biton);
+ return (sc->sc_hwsig);
+}
+
+static int
+uart_tty_break(struct tty *tp, int state)
+{
+ struct uart_softc *sc;
+
+ sc = tp->t_dev->si_drv1;
+ UART_IOCTL(sc, UART_IOCTL_BREAK, state);
+ return (0);
+}
+
static void
uart_tty_stop(struct tty *tp, int rw)
{
@@ -337,6 +358,8 @@ uart_tty_attach(struct uart_softc *sc)
tp->t_oproc = uart_tty_oproc;
tp->t_param = uart_tty_param;
tp->t_stop = uart_tty_stop;
+ tp->t_modem = uart_tty_modem;
+ tp->t_break = uart_tty_break;
if (sc->sc_sysdev != NULL && sc->sc_sysdev->type == UART_DEV_CONSOLE) {
sprintf(((struct consdev *)sc->sc_sysdev->cookie)->cn_name,
@@ -484,7 +507,7 @@ uart_tty_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int flags,
{
struct uart_softc *sc;
struct tty *tp;
- int bits, error, sig;
+ int error;
sc = dev->si_drv1;
if (sc == NULL || sc->sc_leaving)
@@ -495,69 +518,8 @@ uart_tty_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int flags,
if (error != ENOTTY)
return (error);
- error = 0;
- switch (cmd) {
- case TIOCSBRK:
- UART_IOCTL(sc, UART_IOCTL_BREAK, 1);
- break;
- case TIOCCBRK:
- UART_IOCTL(sc, UART_IOCTL_BREAK, 0);
- break;
- case TIOCSDTR:
- UART_SETSIG(sc, SER_DDTR | SER_DTR);
- break;
- case TIOCCDTR:
- UART_SETSIG(sc, SER_DDTR);
- break;
- case TIOCMSET:
- bits = *(int*)data;
- sig = SER_DDTR | SER_DRTS;
- if (bits & TIOCM_DTR)
- sig |= SER_DTR;
- if (bits & TIOCM_RTS)
- sig |= SER_RTS;
- UART_SETSIG(sc, sig);
- break;
- case TIOCMBIS:
- bits = *(int*)data;
- sig = 0;
- if (bits & TIOCM_DTR)
- sig |= SER_DDTR | SER_DTR;
- if (bits & TIOCM_RTS)
- sig |= SER_DRTS | SER_RTS;
- UART_SETSIG(sc, sig);
- break;
- case TIOCMBIC:
- bits = *(int*)data;
- sig = 0;
- if (bits & TIOCM_DTR)
- sig |= SER_DDTR;
- if (bits & TIOCM_RTS)
- sig |= SER_DRTS;
- UART_SETSIG(sc, sig);
- break;
- case TIOCMGET:
- sig = sc->sc_hwsig;
- bits = TIOCM_LE;
- if (sig & SER_DTR)
- bits |= TIOCM_DTR;
- if (sig & SER_RTS)
- bits |= TIOCM_RTS;
- if (sig & SER_DSR)
- bits |= TIOCM_DSR;
- if (sig & SER_CTS)
- bits |= TIOCM_CTS;
- if (sig & SER_DCD)
- bits |= TIOCM_CD;
- if (sig & (SER_DRI | SER_RI))
- bits |= TIOCM_RI;
- *(int*)data = bits;
- break;
- default:
- error = pps_ioctl(cmd, data, &sc->sc_pps);
- if (error == ENODEV)
- error = ENOTTY;
- break;
- }
+ error = pps_ioctl(cmd, data, &sc->sc_pps);
+ if (error == ENODEV)
+ error = ENOTTY;
return (error);
}
OpenPOWER on IntegriCloud