Commit e1ca3ff2 authored by Ryo Takakura's avatar Ryo Takakura Committed by Greg Kroah-Hartman
Browse files

serial: sifive: lock port in startup()/shutdown() callbacks



startup()/shutdown() callbacks access SIFIVE_SERIAL_IE_OFFS.
The register is also accessed from write() callback.

If console were printing and startup()/shutdown() callback
gets called, its access to the register could be overwritten.

Add port->lock to startup()/shutdown() callbacks to make sure
their access to SIFIVE_SERIAL_IE_OFFS is synchronized against
write() callback.

Fixes: 45c054d0 ("tty: serial: add driver for the SiFive UART")
Signed-off-by: default avatarRyo Takakura <ryotkkr98@gmail.com>
Reviewed-by: default avatarPetr Mladek <pmladek@suse.com>
Cc: stable@vger.kernel.org
Reviewed-by: default avatarJohn Ogness <john.ogness@linutronix.de>
Rule: add
Link: https://lore.kernel.org/stable/20250330003522.386632-1-ryotkkr98%40gmail.com
Link: https://lore.kernel.org/r/20250412001847.183221-1-ryotkkr98@gmail.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent ee6a44da
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -563,8 +563,11 @@ static void sifive_serial_break_ctl(struct uart_port *port, int break_state)
static int sifive_serial_startup(struct uart_port *port)
{
	struct sifive_serial_port *ssp = port_to_sifive_serial_port(port);
	unsigned long flags;

	uart_port_lock_irqsave(&ssp->port, &flags);
	__ssp_enable_rxwm(ssp);
	uart_port_unlock_irqrestore(&ssp->port, flags);

	return 0;
}
@@ -572,9 +575,12 @@ static int sifive_serial_startup(struct uart_port *port)
static void sifive_serial_shutdown(struct uart_port *port)
{
	struct sifive_serial_port *ssp = port_to_sifive_serial_port(port);
	unsigned long flags;

	uart_port_lock_irqsave(&ssp->port, &flags);
	__ssp_disable_rxwm(ssp);
	__ssp_disable_txwm(ssp);
	uart_port_unlock_irqrestore(&ssp->port, flags);
}

/**