From e664ac25ca0a9c1fc883e1ce08bbd39c650f76e6 Mon Sep 17 00:00:00 2001 From: Aristeu Rozanski Date: Wed, 23 Jul 2008 21:29:45 -0700 Subject: [PATCH] --- yaml --- r: 105431 b: refs/heads/master c: 7500b1f602aad75901774a67a687ee985d85893f h: refs/heads/master i: 105429: d25b523f5b0b73f7a2ff7f66abf3cfa89fca731c 105427: 6b3e56c84ae3c86de3a8f25b6b8d80b73b8ca797 105423: 0e3e7b4b5adc39911319756b5d149876cee181fa v: v3 --- [refs] | 2 +- trunk/drivers/serial/8250.c | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index e2d52b05056b..bd01c13b831f 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 920519c1c31ca46ef6caab1a4be102ed0dfb5fbc +refs/heads/master: 7500b1f602aad75901774a67a687ee985d85893f diff --git a/trunk/drivers/serial/8250.c b/trunk/drivers/serial/8250.c index 27f34a9f9cb7..a97f1ae11f78 100644 --- a/trunk/drivers/serial/8250.c +++ b/trunk/drivers/serial/8250.c @@ -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)