]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
serial: 8250: Use frame time to determine timeout
authorJohn Ogness <john.ogness@linutronix.de>
Tue, 7 Jan 2025 21:26:58 +0000 (22:32 +0106)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 10 Jan 2025 15:08:24 +0000 (16:08 +0100)
Rather than using a hard-coded per-character Tx-timeout of 10ms,
use the frame time to determine a timeout value. The value is
doubled to ensure that a timeout is only hit during unexpected
circumstances.

Since the frame time may not be available during early printing,
the previous 10ms value is kept as a fallback.

Signed-off-by: John Ogness <john.ogness@linutronix.de>
Reviewed-by: Petr Mladek <pmladek@suse.com>
Link: https://lore.kernel.org/r/20250107212702.169493-3-john.ogness@linutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/8250/8250_port.c

index 3a946ebe91395ca8bfd2d5b5faa792b7da70c7ea..ca8f6f3855eb26305469644b48e76e7ecf4dc204 100644 (file)
@@ -2081,9 +2081,17 @@ static void serial8250_break_ctl(struct uart_port *port, int break_state)
 /* Returns true if @bits were set, false on timeout */
 static bool wait_for_lsr(struct uart_8250_port *up, int bits)
 {
-       unsigned int status, tmout = 10000;
+       unsigned int status, tmout;
+
+       /*
+        * Wait for a character to be sent. Fallback to a safe default
+        * timeout value if @frame_time is not available.
+        */
+       if (up->port.frame_time)
+               tmout = up->port.frame_time * 2 / NSEC_PER_USEC;
+       else
+               tmout = 10000;
 
-       /* Wait up to 10ms for the character(s) to be sent. */
        for (;;) {
                status = serial_lsr_in(up);