Commit 59a33d83 authored by Ilpo Järvinen's avatar Ilpo Järvinen Committed by Greg Kroah-Hartman
Browse files

serial: 8250: Protect LCR write in shutdown



The 8250_dw driver needs to potentially perform very complex operations
during LCR writes because its BUSY handling prevents updates to LCR
while UART is BUSY (which is not fully under our control without those
complex operations). Thus, LCR writes should occur under port's lock.

Move LCR write under port's lock in serial8250_do_shutdown(). Also
split the LCR RMW so that the logic is on a separate line for clarity.

Reported-by: default avatarBandal, Shankar <shankar.bandal@intel.com>
Tested-by: default avatarBandal, Shankar <shankar.bandal@intel.com>
Tested-by: default avatarMurthy, Shanth <shanth.murthy@intel.com>
Cc: stable <stable@kernel.org>
Reviewed-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Link: https://patch.msgid.link/20260203171049.4353-2-ilpo.jarvinen@linux.intel.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 9c0072bc
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -2348,6 +2348,7 @@ static int serial8250_startup(struct uart_port *port)
void serial8250_do_shutdown(struct uart_port *port)
{
	struct uart_8250_port *up = up_to_u8250p(port);
	u32 lcr;

	serial8250_rpm_get(up);
	/*
@@ -2374,13 +2375,13 @@ void serial8250_do_shutdown(struct uart_port *port)
			port->mctrl &= ~TIOCM_OUT2;

		serial8250_set_mctrl(port, port->mctrl);

		/* Disable break condition */
		lcr = serial_port_in(port, UART_LCR);
		lcr &= ~UART_LCR_SBC;
		serial_port_out(port, UART_LCR, lcr);
	}

	/*
	 * Disable break condition and FIFOs
	 */
	serial_port_out(port, UART_LCR,
			serial_port_in(port, UART_LCR) & ~UART_LCR_SBC);
	serial8250_clear_fifos(up);

	rsa_disable(up);