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
This commit is contained in:
parent
4de89d86cd
commit
f1fb96475a
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user