8250.c: less than 2400 baud fix.
authorChristian Melki <christian.melki@ericsson.se>
Mon, 30 Apr 2012 09:21:26 +0000 (11:21 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 1 May 2012 17:40:29 +0000 (13:40 -0400)
We noticed that we were loosing data at speed less than 2400 baud.
It turned out our (TI16750 compatible) uart with 64 byte outgoing fifo
was truncated to 16 byte (bit 5 sets fifo len) when modifying the fcr
reg.
The input code still fills the buffer with 64 bytes if I remember
correctly and thus data is lost.
Our fix was to remove whiping of the fcr content and just add the
TRIGGER_1 which we want for latency.
I can't see why this would not work on less than 2400 always, for all
uarts ...
Otherwise one would have to make sure the filling of the fifo re-checks
the current state of available fifo size (urrk).

Signed-off-by: Christian Melki <christian.melki@ericsson.se>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/8250/8250.c

index 182efcc90e2e985c9ecc9e74e737575498d134b3..c9ac4eabe35a7c76b6b4eb5ce50600be80e37885 100644 (file)
@@ -2259,10 +2259,11 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
                quot++;
 
        if (up->capabilities & UART_CAP_FIFO && port->fifosize > 1) {
-               if (baud < 2400)
-                       fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1;
-               else
-                       fcr = uart_config[port->type].fcr;
+               fcr = uart_config[port->type].fcr;
+               if (baud < 2400) {
+                       fcr &= ~UART_FCR_TRIGGER_MASK;
+                       fcr |= UART_FCR_TRIGGER_1;
+               }
        }
 
        /*