linux/drivers/tty/serial
Johan Hovold 647cd4494c serial: qcom-geni: fix receiver enable
commit fa103d2599 upstream.

The receiver is supposed to be enabled in the startup() callback and not
in set_termios() which is called also during console setup.

This specifically avoids accepting input before the port has been opened
(and interrupts enabled), something which can also break the GENI
firmware (cancel fails and after abort, the "stale" counter handling
appears to be broken so that later input is not processed until twelve
chars have been received).

There also does not appear to be any need to keep the receiver disabled
while updating the port settings.

Since commit 6f3c3cafb1 ("serial: qcom-geni: disable interrupts during
console writes") the calls to manipulate the secondary interrupts, which
were done without holding the port lock, can also lead to the receiver
being left disabled when set_termios() races with the console code (e.g.
when init opens the tty during boot). This can manifest itself as a
serial getty not accepting input.

The calls to stop and start rx in set_termios() can similarly race with
DMA completion and, for example, cause the DMA buffer to be unmapped
twice or the mapping to be leaked.

Fix this by only enabling the receiver during startup and while holding
the port lock to avoid racing with the console code.

Fixes: 6f3c3cafb1 ("serial: qcom-geni: disable interrupts during console writes")
Fixes: 2aaa43c707 ("tty: serial: qcom-geni-serial: add support for serial engine DMA")
Fixes: c4f528795d ("tty: serial: msm_geni_serial: Add serial driver support for GENI based QUP")
Cc: stable@vger.kernel.org      # 6.3
Cc: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
Reviewed-by: Douglas Anderson <dianders@chromium.org>
Link: https://lore.kernel.org/r/20241009145110.16847-6-johan+linaro@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2024-10-22 15:46:35 +02:00
..
8250 serial: 8250: omap: Cleanup on error in request_irq 2024-10-04 16:29:40 +02:00
jsm drivers: serial: jsm: fix some leaks in probe 2022-09-22 16:11:43 +02:00
21285.c serial: drivers: switch ch and flag to u8 2023-07-25 19:21:04 +02:00
altera_jtaguart.c serial: altera_jtaguart: switch status to u32 2023-07-31 17:16:05 +02:00
altera_uart.c serial: drivers: switch ch and flag to u8 2023-07-25 19:21:04 +02:00
amba-pl010.c serial: drivers: switch ch and flag to u8 2023-07-25 19:21:04 +02:00
amba-pl011.c serial: amba-pl011: Fix DMA transmission in RS485 mode 2024-03-01 13:35:02 +01:00
apbuart.c serial: apbuart: fix console prompt on qemu 2024-01-25 15:35:55 -08:00
apbuart.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
ar933x_uart.c serial: ar933x: Use devm_platform_get_and_ioremap_resource() 2023-07-25 20:25:52 +02:00
arc_uart.c serial: drivers: switch ch and flag to u8 2023-07-25 19:21:04 +02:00
atmel_serial.c tty: atmel_serial: use the correct RTS flag. 2024-08-29 17:33:10 +02:00
atmel_serial.h tty: serial: atmel: Use FIELD_PREP/FIELD_GET 2022-09-22 16:32:25 +02:00
bcm63xx_uart.c serial: bcm63xx-uart: fix tx after conversion to uart_port_tx_limited() 2024-07-05 09:34:00 +02:00
clps711x.c serial: clps711x: Use devm_platform_get_and_ioremap_resource() 2023-07-25 20:25:52 +02:00
cpm_uart.c serial: cpm_uart: Remove cpm_uart/ subdirectory 2023-08-04 15:08:30 +02:00
cpm_uart.h serial: cpm_uart: Remove cpm_uart/ subdirectory 2023-08-04 15:08:30 +02:00
digicolor-usart.c serial: drivers: switch ch and flag to u8 2023-07-25 19:21:04 +02:00
dz.c serial: drivers: switch ch and flag to u8 2023-07-25 19:21:04 +02:00
dz.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
earlycon-riscv-sbi.c serial: make uart_console_write->putchar()'s character an unsigned char 2022-03-03 15:06:31 +01:00
earlycon-semihost.c serial: Rename earlycon semihost driver 2023-01-19 14:58:19 +01:00
earlycon.c earlycon: Let users set the clock frequency 2023-01-19 14:56:44 +01:00
fsl_linflexuart.c serial: linflexuart: Use devm_platform_get_and_ioremap_resource() 2023-07-25 20:25:52 +02:00
fsl_lpuart.c tty: serial: fsl_lpuart: mark last busy before uart_add_one_port 2024-08-29 17:33:10 +02:00
icom.c serial: Make ->set_termios() old ktermios const 2022-08-30 14:22:35 +02:00
imx.c serial: imx: Update mctrl old_status on RTSD interrupt 2024-10-22 15:46:33 +02:00
imx_earlycon.c serial: make uart_console_write->putchar()'s character an unsigned char 2022-03-03 15:06:31 +01:00
ip22zilog.c serial: drivers: switch ch and flag to u8 2023-07-25 19:21:04 +02:00
ip22zilog.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
Kconfig TTY/Serial driver updates for 6.5-rc1. 2023-07-03 13:14:58 -07:00
kgdb_nmi.c tty: make tty_operations::write()'s count size_t 2023-08-11 21:12:46 +02:00
kgdboc.c serial: kgdboc: Fix NMI-safety problems from keyboard reset code 2024-05-25 16:22:54 +02:00
lantiq.c tty: Explicitly include correct DT includes 2023-07-25 20:19:05 +02:00
liteuart.c tty: Explicitly include correct DT includes 2023-07-25 20:19:05 +02:00
lpc32xx_hs.c tty: serial: use uart_port_tx() helper 2022-11-03 03:32:40 +01:00
ma35d1_serial.c tty: serial: ma35d1: Add a NULL check for of_node 2024-07-18 13:21:21 +02:00
Makefile serial: cpm_uart: Remove cpm_uart/ subdirectory 2023-08-04 15:08:30 +02:00
max310x.c serial: max310x: fix NULL pointer dereference in I2C instantiation 2024-04-03 15:28:16 +02:00
max3100.c serial: max3100: Fix bitwise types 2024-06-12 11:12:17 +02:00
mcf.c tty: mcf: MCF54418 has 10 UARTS 2024-07-05 09:34:00 +02:00
men_z135_uart.c serial: men_z135_uart: Use uart_xmit_advance() 2022-11-03 03:35:41 +01:00
meson_uart.c tty: serial: meson: fix hard LOCKUP on crtscts mode 2023-11-28 17:19:57 +00:00
milbeaut_usio.c serial: drivers: switch ch and flag to u8 2023-07-25 19:21:04 +02:00
mpc52xx_uart.c tty: Explicitly include correct DT includes 2023-07-25 20:19:05 +02:00
mps2-uart.c serial: mps2-uart: Use devm_platform_get_and_ioremap_resource() 2023-07-25 20:26:06 +02:00
msm_serial.c serial: msm: add lock annotation to msm_set_baud_rate() 2023-01-19 15:53:09 +01:00
mux.c tty: serial: use uart_port_tx_limited() 2022-11-03 03:32:40 +01:00
mvebu-uart.c serial: mvebu-uart: Use devm_platform_get_and_ioremap_resource() 2023-07-25 20:26:07 +02:00
mxs-auart.c serial: mxs-auart: add spinlock around changing cts state 2024-04-27 17:11:39 +02:00
omap-serial.c serial: omap: do not override settings for RS485 support 2024-01-25 15:35:44 -08:00
owl-uart.c tty: serial: use uart_port_tx() helper 2022-11-03 03:32:40 +01:00
pch_uart.c tty: pcn_uart: fix memory leak with using debugfs_lookup() 2023-02-08 13:09:55 +01:00
pic32_uart.c tty: Explicitly include correct DT includes 2023-07-25 20:19:05 +02:00
pmac_zilog.c serial/pmac_zilog: Remove flawed mitigation for rx irq flood 2024-04-27 17:11:39 +02:00
pmac_zilog.h serial: pmac_zilog: remove unused uart_pmac_port::termios_cache 2022-05-19 18:23:19 +02:00
pxa.c serial: drivers: switch ch and flag to u8 2023-07-25 19:21:04 +02:00
qcom_geni_serial.c serial: qcom-geni: fix receiver enable 2024-10-22 15:46:35 +02:00
rda-uart.c serial: rda: Use uart_xmit_advance() 2022-11-03 03:35:42 +01:00
rp2.c tty: rp2: Fix reset with non forgiving PCIe host bridges 2024-10-04 16:29:51 +02:00
sa1100.c serial: drivers: switch ch and flag to u8 2023-07-25 19:21:04 +02:00
samsung_tty.c tty: serial: samsung: fix tx_empty() to return TIOCSER_TEMT 2024-03-26 18:20:05 -04:00
sb1250-duart.c serial: drivers: switch ch and flag to u8 2023-07-25 19:21:04 +02:00
sc16is7xx.c serial: sc16is7xx: fix bug in sc16is7xx_set_baud() when using prescaler 2024-06-12 11:12:35 +02:00
sccnxp.c serial: sccnxp: Use devm_platform_get_and_ioremap_resource() 2023-07-25 20:26:07 +02:00
serial-tegra.c serial: tegra: handle clk prepare error in tegra_uart_hw_init() 2023-08-22 15:29:18 +02:00
serial_base.h serial: core: Fix missing shutdown and startup for serial base port 2024-04-27 17:11:39 +02:00
serial_base_bus.c serial: core: Fix serial core port id, including multiport devices 2023-08-11 21:19:22 +02:00
serial_core.c serial: protect uart_port_dtr_rts() in uart_shutdown() too 2024-10-17 15:24:19 +02:00
serial_ctrl.c serial: core: Start managing serial controllers to enable runtime PM 2023-05-31 10:46:59 +01:00
serial_mctrl_gpio.c Documentation: serial: move GPIO kernel-doc to the functions 2022-07-28 10:37:42 +02:00
serial_mctrl_gpio.h serial: mctrl_gpio: add a new API to enable / disable wake_irq 2022-02-08 11:07:16 +01:00
serial_port.c serial: port: Introduce a common helper to read properties 2024-06-21 14:38:49 +02:00
serial_txx9.c serial: drivers: switch ch and flag to u8 2023-07-25 19:21:04 +02:00
sh-sci.c serial: sh-sci: protect invalidating RXDMA on shutdown 2024-06-12 11:12:30 +02:00
sh-sci.h tty: serial: sh-sci: Add support for tx end interrupt handling 2023-04-20 13:47:33 +02:00
sifive.c serial: sifive: Add suspend and resume operations 2023-08-22 15:29:10 +02:00
sprd_serial.c serial: sprd: Fix DMA buffer leak issue 2023-07-30 13:53:55 +02:00
st-asc.c drivers:tty: fix return value check in asc_init_port 2023-07-30 13:53:19 +02:00
stm32-usart.c serial: stm32: Reset .throttled state in .startup() 2024-04-27 17:11:39 +02:00
stm32-usart.h serial: stm32: group dma pause/resume error handling into single function 2023-08-22 15:28:51 +02:00
suncore.c tty: Use of_node_name_{eq,prefix} for node name comparisons 2018-12-17 16:12:17 +01:00
sunhv.c tty: Explicitly include correct DT includes 2023-07-25 20:19:05 +02:00
sunplus-uart.c serial: drivers: switch ch and flag to u8 2023-07-25 19:21:04 +02:00
sunsab.c tty: Explicitly include correct DT includes 2023-07-25 20:19:05 +02:00
sunsab.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
sunsu.c tty: Explicitly include correct DT includes 2023-07-25 20:19:05 +02:00
sunzilog.c tty: Explicitly include correct DT includes 2023-07-25 20:19:05 +02:00
sunzilog.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
tegra-tcu.c tty: Explicitly include correct DT includes 2023-07-25 20:19:05 +02:00
timbuart.c serial: timbuart: Use uart_xmit_advance() 2022-11-03 03:35:43 +01:00
timbuart.h tty: serial: Use the correct style for SPDX License Identifier 2020-03-07 09:52:01 +01:00
uartlite.c tty: Explicitly include correct DT includes 2023-07-25 20:19:05 +02:00
ucc_uart.c serial: cpm_uart: Don't include fs_uart_pd.h when not needed 2023-08-04 15:08:55 +02:00
vt8500_serial.c serial: vt8500: Use devm_platform_get_and_ioremap_resource() 2023-07-25 20:26:06 +02:00
xilinx_uartps.c tty: serial: xilinx_uartps: Do not check for 0 return after calling platform_get_irq() 2023-08-04 15:06:01 +02:00
zs.c serial: drivers: switch ch and flag to u8 2023-07-25 19:21:04 +02:00
zs.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00