Message ID | 20240111002056.28205-1-mcpratt@pm.me |
---|---|
State | New |
Headers | show |
Series | [v1,RESEND] serial: 8250: Set fifo timeout with uart_fifo_timeout() | expand |
On Thu, Jan 11, 2024 at 5:57 AM Michael Pratt <mcpratt@pm.me> wrote: > > Commit 8f3631f0f6eb ("serial/8250: Use fifo in 8250 console driver") > reworked functions for basic 8250 and 16550 type serial devices > in order to enable and use the internal FIFO device for buffering, > however the default timeout of 10 ms remained, which is proving > to be insufficient for low baud rates like 9600, causing data overrun. > > Unforunately, that commit was written and accepted just before commit > 31f6bd7fad3b ("serial: Store character timing information to uart_port") > which introduced the frame_time member of the uart_port struct > in order to store the amount of time it takes to send one UART frame > relative to the baud rate and other serial port configuration, > and commit f9008285bb69 ("serial: Drop timeout from uart_port") > which established function uart_fifo_timeout() in order to > calculate a reasonable timeout to wait for all frames > in the FIFO device to flush before writing data again > using the now stored frame_time value and size of the buffer. > > Fix this by using the new function to calculate the timeout > whenever the buffer is larger than 1 byte (unknown port default). > > Tested on a MIPS device (ar934x) at baud rates 625, 9600, 115200. > > Signed-off-by: Michael Pratt <mcpratt@pm.me> > --- > v1 thread: https://lore.kernel.org/linux-serial/20231125063552.517-1-mcpratt@pm.me/ > > drivers/tty/serial/8250/8250_port.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c > index 8ca061d3bbb9..777b61a79c5e 100644 > --- a/drivers/tty/serial/8250/8250_port.c > +++ b/drivers/tty/serial/8250/8250_port.c > @@ -2076,7 +2076,10 @@ static void wait_for_lsr(struct uart_8250_port *up, int bits) > { > unsigned int status, tmout = 10000; > > - /* Wait up to 10ms for the character(s) to be sent. */ > + /* Wait for a time relative to buffer size and baud */ > + if (up->port.fifosize > 1) > + tmout = jiffies_to_usecs(uart_fifo_timeout(&up->port)); > + Michael, I have copied you onto a patch addressing the similar issue, where it was considered to avoid the computation of timeout on call to wait_for_lsr. > for (;;) { > status = serial_lsr_in(up); > > -- > 2.30.2 > > >
diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c index 8ca061d3bbb9..777b61a79c5e 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -2076,7 +2076,10 @@ static void wait_for_lsr(struct uart_8250_port *up, int bits) { unsigned int status, tmout = 10000; - /* Wait up to 10ms for the character(s) to be sent. */ + /* Wait for a time relative to buffer size and baud */ + if (up->port.fifosize > 1) + tmout = jiffies_to_usecs(uart_fifo_timeout(&up->port)); + for (;;) { status = serial_lsr_in(up);
Commit 8f3631f0f6eb ("serial/8250: Use fifo in 8250 console driver") reworked functions for basic 8250 and 16550 type serial devices in order to enable and use the internal FIFO device for buffering, however the default timeout of 10 ms remained, which is proving to be insufficient for low baud rates like 9600, causing data overrun. Unforunately, that commit was written and accepted just before commit 31f6bd7fad3b ("serial: Store character timing information to uart_port") which introduced the frame_time member of the uart_port struct in order to store the amount of time it takes to send one UART frame relative to the baud rate and other serial port configuration, and commit f9008285bb69 ("serial: Drop timeout from uart_port") which established function uart_fifo_timeout() in order to calculate a reasonable timeout to wait for all frames in the FIFO device to flush before writing data again using the now stored frame_time value and size of the buffer. Fix this by using the new function to calculate the timeout whenever the buffer is larger than 1 byte (unknown port default). Tested on a MIPS device (ar934x) at baud rates 625, 9600, 115200. Signed-off-by: Michael Pratt <mcpratt@pm.me> --- v1 thread: https://lore.kernel.org/linux-serial/20231125063552.517-1-mcpratt@pm.me/ drivers/tty/serial/8250/8250_port.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)