diff options
author | Johan Hovold <[email protected]> | 2024-10-09 16:51:04 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <[email protected]> | 2024-10-11 08:39:23 +0200 |
commit | 23f5f5debcaac1399cfeacec215278bf6dbc1d11 (patch) | |
tree | bff11cdf2b7bedf45b62029a8417ffb1a85a90a7 | |
parent | 19df76662a33d2f2fc41a66607cb8285fc02d6ec (diff) |
serial: qcom-geni: fix shutdown race
A commit adding back the stopping of tx on port shutdown failed to add
back the locking which had also been removed by commit e83766334f96
("tty: serial: qcom_geni_serial: No need to stop tx/rx on UART
shutdown").
Holding the port lock is needed to serialise against the console code,
which may update the interrupt enable register and access the port
state.
Fixes: d8aca2f96813 ("tty: serial: qcom-geni-serial: stop operations in progress at shutdown")
Fixes: 947cc4ecc06c ("serial: qcom-geni: fix soft lockup on sw flow control and suspend")
Cc: [email protected] # 6.3
Reviewed-by: Bartosz Golaszewski <[email protected]>
Signed-off-by: Johan Hovold <[email protected]>
Reviewed-by: Douglas Anderson <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Greg Kroah-Hartman <[email protected]>
-rw-r--r-- | drivers/tty/serial/qcom_geni_serial.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/tty/serial/qcom_geni_serial.c b/drivers/tty/serial/qcom_geni_serial.c index 2e4a5361f137..87cd974b76bf 100644 --- a/drivers/tty/serial/qcom_geni_serial.c +++ b/drivers/tty/serial/qcom_geni_serial.c @@ -1114,10 +1114,12 @@ static void qcom_geni_serial_shutdown(struct uart_port *uport) { disable_irq(uport->irq); + uart_port_lock_irq(uport); qcom_geni_serial_stop_tx(uport); qcom_geni_serial_stop_rx(uport); qcom_geni_serial_cancel_tx_cmd(uport); + uart_port_unlock_irq(uport); } static void qcom_geni_serial_flush_buffer(struct uart_port *uport) |