diff options
author | marcel <marcel@FreeBSD.org> | 2011-01-24 18:34:16 +0000 |
---|---|---|
committer | marcel <marcel@FreeBSD.org> | 2011-01-24 18:34:16 +0000 |
commit | c41873e0783dd4352f3571d497f39b7bbe79260f (patch) | |
tree | 24cf330382dc607a2a56f16193d460ecd524bc5b /sys/dev/uart | |
parent | fe2532f851b1780bda991f8f1b8735f11eb3f447 (diff) | |
download | FreeBSD-src-c41873e0783dd4352f3571d497f39b7bbe79260f.zip FreeBSD-src-c41873e0783dd4352f3571d497f39b7bbe79260f.tar.gz |
In uart_tty_outwakeup(), check CTS/RTS flow control settings and
prevent sending data when CTS is de-asserted.
In uart_tty_intr(), call uart_tty_outwakeup() when the CTS signal
changed, knowing that uart_tty_outwakeup() will do the right
thing for flow control. This avoids redundant conditionals.
PR: kern/148644
Submitted by: John Wehle <john@feith.com>
MFC after: 3 days
Diffstat (limited to 'sys/dev/uart')
-rw-r--r-- | sys/dev/uart/uart_tty.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/sys/dev/uart/uart_tty.c b/sys/dev/uart/uart_tty.c index f306af5..2170108 100644 --- a/sys/dev/uart/uart_tty.c +++ b/sys/dev/uart/uart_tty.c @@ -168,6 +168,14 @@ uart_tty_outwakeup(struct tty *tp) if (sc->sc_txbusy) return; + /* + * Respect RTS/CTS (output) flow control if enabled and not already + * handled by hardware. + */ + if ((tp->t_termios.c_cflag & CCTS_OFLOW) && !sc->sc_hwoflow && + !(sc->sc_hwsig & SER_CTS)) + return; + sc->sc_txdatasz = ttydisc_getc(tp, sc->sc_txbuf, sc->sc_txfifosz); if (sc->sc_txdatasz != 0) UART_TRANSMIT(sc); @@ -315,11 +323,8 @@ uart_tty_intr(void *arg) sig = pend & SER_INT_SIGMASK; if (sig & SER_DDCD) ttydisc_modem(tp, sig & SER_DCD); - if ((sig & SER_DCTS) && (tp->t_termios.c_cflag & CCTS_OFLOW) && - !sc->sc_hwoflow) { - if (sig & SER_CTS) - uart_tty_outwakeup(tp); - } + if (sig & SER_DCTS) + uart_tty_outwakeup(tp); } if (pend & SER_INT_TXIDLE) |