svn commit: r218000 - stable/8/sys/dev/uart
Marcel Moolenaar
marcel at FreeBSD.org
Fri Jan 28 00:22:04 UTC 2011
Author: marcel
Date: Fri Jan 28 00:22:03 2011
New Revision: 218000
URL: http://svn.freebsd.org/changeset/base/218000
Log:
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 at feith.com>
Modified:
stable/8/sys/dev/uart/uart_tty.c
Directory Properties:
stable/8/sys/ (props changed)
stable/8/sys/amd64/include/xen/ (props changed)
stable/8/sys/cddl/contrib/opensolaris/ (props changed)
stable/8/sys/contrib/dev/acpica/ (props changed)
stable/8/sys/contrib/pf/ (props changed)
Modified: stable/8/sys/dev/uart/uart_tty.c
==============================================================================
--- stable/8/sys/dev/uart/uart_tty.c Thu Jan 27 23:28:00 2011 (r217999)
+++ stable/8/sys/dev/uart/uart_tty.c Fri Jan 28 00:22:03 2011 (r218000)
@@ -169,6 +169,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);
@@ -316,11 +324,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)
More information about the svn-src-stable-8
mailing list