[PATCH] tty: serial: lpuart: Add port lock for registers read in lpuart32_set_termios()

From: Sherry Sun (OSS)

Date: Wed Nov 11 2026 - 04:54:32 EST


From: Sherry Sun <sherry.sun@xxxxxxx>

lpuart32_set_termios() reads UARTCTRL at function entry without holding
the port lock. lpuart32_console_write() can run concurrently on another
CPU and temporarily clears the RIE (Receiver Interrupt Enable) bit while
it polls characters out. If the unlocked read in set_termios lands inside
that window, the stale snapshot is written back, permanently clearing
RIE. Once lost, no normal code path re-enables them, so the UART stops
receiving characters and becomes unresponsive.

Add port lock for the registers read in lpuart32_set_termios() to avoid
the unlocked snapshot captured.

Please note that this only fix the normal printk path, in the
oops_in_progress path of lpuart32_console_write(), when trylock fails,
RIE is cleared and old_cr restored without the port lock held, there is
still a risk of stale snapshot, but it's acceptable for the post-oops
state and the trylock-fail window.

Fixes: 380c966c093e ("tty: serial: fsl_lpuart: add 32-bit register interface support")
Signed-off-by: Sherry Sun <sherry.sun@xxxxxxx>
---
drivers/tty/serial/fsl_lpuart.c | 2 ++
1 file changed, 2 insertions(+)

diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c
index cd2575a3aef7..7c249b9371ae 100644
--- a/drivers/tty/serial/fsl_lpuart.c
+++ b/drivers/tty/serial/fsl_lpuart.c
@@ -2241,9 +2241,11 @@ lpuart32_set_termios(struct uart_port *port, struct ktermios *termios,
unsigned int baud;
unsigned int old_csize = old ? old->c_cflag & CSIZE : CS8;

+ uart_port_lock_irqsave(port, &flags);
ctrl = old_ctrl = lpuart32_read(port, UARTCTRL);
bd = lpuart32_read(port, UARTBAUD);
modem = lpuart32_read(port, UARTMODIR);
+ uart_port_unlock_irqrestore(port, flags);
sport->is_cs7 = false;
/*
* only support CS8 and CS7

---
base-commit: 793807ca13bf3072fc6d16ce6d90e9ab9beff2a5
change-id: 20261111-lpuart_port_lock-01f7deab451a

Best regards,
--
Sherry Sun <sherry.sun@xxxxxxx>