8250: fix break handling for Intel 82571
PATCH 1/1 8250: fix break handling for Intel 82571
Intel 82571 has a "Serial Over LAN" feature that doesn't properly implements the receiving of break characters. When a break is received, it doesn't set UART_LSR_DR and unless another character is received, the break won't be received by the application.
Signed-off-by Aristeu Rozanski <[email protected]>
--- drivers/serial/8250.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-)
drivers/serial/8250.c +14 -3
@@ -1296,7 +1296,18 @@ receive_chars(struct uart_8250_port *up,char flag; do { - ch = serial_inp(up, UART_RX); + if (likely(lsr & UART_LSR_DR)) + ch = serial_inp(up, UART_RX); + else + /* + * Intel 82571 has a Serial Over Lan device that will + * set UART_LSR_BI without setting UART_LSR_DR when + * it receives a break. To avoid reading from the + * receive buffer without UART_LSR_DR bit set, we + * just force the read character to be 0 + */ + ch = 0; + flag = TTY_NORMAL; up->port.icount.rx++;
@@ -1345,7 +1356,7 @@ receive_chars(struct uart_8250_port *up, ignore_char: lsr =serial_inp (up,UART_LSR ); - }while ((lsr &UART_LSR_DR ) && (max_count-- >0 )); + }while ((lsr & (UART_LSR_DR |UART_LSR_BI )) && (max_count-- >0 ));spin_unlock (&up->port.lock);tty_flip_buffer_push (tty);spin_lock (&up->port.lock);
@@ -1428,7 +1439,7 @@ serial8250_handle_port(struct uart_8250_DEBUG_INTR ("status = %x..." , status); -if (status &UART_LSR_DR ) +if (status & (UART_LSR_DR |UART_LSR_BI ))receive_chars (up, &status);check_modem_status (up);if (status &UART_LSR_THRE )