Re: [PATCH] serial: 8250_mid: wait for LSR tx empty before setting termios
From: Andy Shevchenko
Date: Fri Aug 28 2026 - 11:18:44 EST
On Fri, Aug 28, 2026 at 02:45:17PM +0000, Tate Whiteberg wrote:
> If mid8250_set_termios is called while data is still in transmission,
mid8250_set_termios()
> the corresponding register updates will corrupt the transmission.
>
> Fix this by locking the port and and waiting for the transmitter to
> empty before performing updates. It is necessary to wait for both
> UART_LSR_THRE and UART_LSR_TEMT to ensure the final character is sent.
Fixes tag?
...
> static void mid8250_set_termios(struct uart_port *p, struct ktermios *termios,
> {
> unsigned int baud = tty_termios_baud_rate(termios);
> struct mid8250 *mid = p->private_data;
> + struct uart_8250_port *up = up_to_u8250p(p);
Move it one line up.
> unsigned short ps = 16;
> unsigned long fuart = baud * ps;
> unsigned long w = BIT(24) - 1;
> /* Gracefully handle the B0 case: fall back to B9600 */
> fuart = fuart ? fuart : 9600 * 16;
>
> + uart_port_lock_irq(p);
+ blank line.
Do we need to protect the preliminary calculations?
> if (mid->board->freq < fuart) {
> /* Find prescaler value that satisfies Fuart < Fref */
> if (mid->board->freq > baud)
> @@ -231,11 +233,14 @@ static void mid8250_set_termios(struct uart_port *p, struct ktermios *termios,
> }
>
> rational_best_approximation(fuart, mid->board->freq, w, w, &mul, &div);
> + serial8250_wait_for_xmitr(up, UART_LSR_BOTH_EMPTY);
Can't it be done one line after? Somewhere...
> p->uartclk = fuart * 16 / ps; /* core uses ps = 16 always */
...here?
> writel(ps, p->membase + INTEL_MID_UART_PS); /* set PS */
> writel(mul, p->membase + INTEL_MID_UART_MUL); /* set MUL */
> writel(div, p->membase + INTEL_MID_UART_DIV);
+ blank line.
> + uart_port_unlock_irq(p);
>
> serial8250_do_set_termios(p, termios, old);
...
> diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c
> index 38fa45e74a37..4eaf417f1fd7 100644
All below better to split to another prerequisite patch.
--
With Best Regards,
Andy Shevchenko