Message ID | 20250107212702.169493-3-john.ogness@linutronix.de |
---|---|
State | New |
Headers | show |
Series | convert 8250 to nbcon | expand |
On Tue, Jan 07, 2025 at 10:32:58PM +0106, John Ogness wrote: > 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. ... > + /* > + * 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; I would use it in a form of tmout = 10 * USEC_PER_MSEC; This will give a hint of the real unit (10 ms in us).
diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c index 3a946ebe9139..ca8f6f3855eb 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -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);