8250: fix break handling for Intel 82571 (fixed)
RFC 1/1 8250: fix break handling for Intel 82571 (fixed)
Quoted 1 line
From
7500b1f602aad75901774a67a687ee985d85893fMon Sep 17 00:00:00 2001
From: Aristeu Rozanski <[email protected]>
Date: Wed, 23 Jul 2008 21:29:45 -0700
Subject: [PATCH] 8250: fix break handling for Intel 82571
[ Upstream commit 7500b1f602aad75901774a67a687ee985d85893f ]
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]>
Acked-by Alan Cox <[email protected]>
Signed-off-by Andrew Morton <[email protected]>
Signed-off-by Linus Torvalds <[email protected]>
CC Oliver Pinter <[email protected]>
drivers/serial/8250.c +14 -3
@@ -1293,7 +1293,18 @@ receive_chars(struct uart_8250_port *up, unsigned int *status)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++;
@@ -1342,7 +1353,7 @@ receive_chars(struct uart_8250_port *up, unsigned int *status) 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);
@@ -1425,7 +1436,7 @@ serial8250_handle_port(struct uart_8250_port *up)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 )