serial: 8250: Fix UART_BUG_TXEN workaround
authorPeter Hurley <peter@hurleysoftware.com>
Mon, 2 Feb 2015 20:47:07 +0000 (15:47 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 7 Feb 2015 10:44:55 +0000 (18:44 +0800)
UARTs which do not trigger THRE interrupt if the fifo is already
empty when the interrupt is enabled need tx primed manually. These
UARTs are identified by the UART_BUG_TXEN flag to enable the
required workaround.

However, the current workaround is broken; if the fifo is already
empty but the shifter is still transmitting, then serial8250_tx_chars()
will not be called but no further THRE interrupt will occur, and
tx will stall. The appropriate check is for fifo empty (THRE), not
transmitter empty (TEMT).

Signed-off-by: Dick Hollenbeck <dick@softplc.com>
[pjh: rewrote commit log]
Signed-off-by: Peter Hurley <peter@hurleysoftware.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/8250/8250_core.c

index 46ae9fd..e3b9570 100644 (file)
@@ -1388,7 +1388,7 @@ static void serial8250_start_tx(struct uart_port *port)
                        unsigned char lsr;
                        lsr = serial_in(up, UART_LSR);
                        up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
-                       if (lsr & UART_LSR_TEMT)
+                       if (lsr & UART_LSR_THRE)
                                serial8250_tx_chars(up);
                }
        }