linux/drivers/tty/serial
Uwe Kleine-König 43b1555313 serial: imx: fix a race condition in receive path
commit 101aa46bd2 upstream.

The main irq handler function starts by first masking disabled
interrupts in the status register values to ensure to only handle
enabled interrupts. This is important as when the RX path in the
hardware is disabled reading the RX fifo results in an external abort.

This checking must be done under the port lock, otherwise the following
can happen:

     CPU1                            | CPU2
                                     |
     irq triggers as there are chars |
     in the RX fifo                  |
				     | grab port lock
     imx_uart_int finds RRDY enabled |
     and calls imx_uart_rxint which  |
     has to wait for port lock       |
                                     | disable RX (e.g. because we're
                                     | using RS485 with !RX_DURING_TX)
                                     |
                                     | release port lock
     read from RX fifo with RX       |
     disabled => exception           |

So take the port lock only once in imx_uart_int() instead of in the
functions called from there.

Reported-by: Andre Renaud <arenaud@designa-electronics.com>
Cc: stable@vger.kernel.org
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Link: https://lore.kernel.org/r/20200121071702.20150-1-u.kleine-koenig@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2020-02-01 09:32:54 +00:00
..
8250 serial: 8250_bcm2835aux: Fix line mismatch on driver unbind 2020-02-01 09:32:53 +00:00
cpm_uart tty: cpm_uart: drop unused iflag macro 2019-05-24 10:09:16 +02:00
jsm tty: add SPDX identifiers to Kconfig and Makefiles 2019-04-04 18:48:43 +02:00
21285.c tty: add SPDX identifiers to all remaining files in drivers/tty/ 2017-11-08 13:08:12 +01:00
altera_jtaguart.c tty: serial: Remove redundant license text 2017-11-08 13:08:12 +01:00
altera_uart.c serial: altera: set RRDY flag also without irq 2018-02-28 13:30:09 +01:00
amba-pl010.c tty: serial: Remove redundant license text 2017-11-08 13:08:12 +01:00
amba-pl011.c serial: pl011: Fix DMA ->flush_buffer() 2019-11-18 12:47:06 +01:00
amba-pl011.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
apbuart.c tty: add SPDX identifiers to all remaining files in drivers/tty/ 2017-11-08 13:08:12 +01: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_uart: Fix build failure with disabled console 2019-03-19 15:37:44 +01:00
arc_uart.c serial: arc_uart: Fix out-of-bounds access through DT alias 2018-02-28 15:29:59 +01:00
atmel_serial.c tty/serial: atmel: fix out of range clock divider handling 2019-12-17 14:17:32 +01:00
atmel_serial.h tty/serial: atmel: add ISO7816 support 2018-10-02 13:38:55 -07:00
bcm63xx_uart.c MIPS changes for 4.15 2017-11-15 11:36:08 -08:00
clps711x.c serial: clps711x: Remove board support 2019-01-08 16:55:18 +01:00
digicolor-usart.c tty/serial: digicolor: Fix digicolor-usart already registered warning 2019-06-10 19:08:31 +02:00
dz.c tty: add SPDX identifiers to all remaining files in drivers/tty/ 2017-11-08 13:08:12 +01: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-arm-semihost.c tty: serial: Remove redundant license text 2017-11-08 13:08:12 +01:00
earlycon-riscv-sbi.c tty/serial: use uart_console_write in the RISC-V SBL early console 2019-01-23 15:41:50 -08:00
earlycon.c earlycon: Remove hardcoded port->uartclk initialization in of_setup_earlycon 2018-05-14 13:41:05 +02:00
efm32-uart.c tty: add SPDX identifiers to all remaining files in drivers/tty/ 2017-11-08 13:08:12 +01:00
fsl_linflexuart.c serial: fsl_linflexuart: Be consistent with the name 2019-10-16 06:11:24 -07:00
fsl_lpuart.c tty: serial: fsl_lpuart: use the sg count from dma_map_sg 2019-11-05 18:18:01 +01:00
icom.c tty: serial: Remove call to memset after pci_alloc_consistent 2019-09-04 12:43:44 +02:00
icom.h tty: serial: Remove redundant license text 2017-11-08 13:08:12 +01:00
ifx6x60.c serial: ifx6x60: add missed pm_runtime_disable 2019-11-18 12:47:06 +01:00
ifx6x60.h tty: serial: Remove redundant license text 2017-11-08 13:08:12 +01:00
imx.c serial: imx: fix a race condition in receive path 2020-02-01 09:32:54 +00:00
ip22zilog.c tty: add SPDX identifiers to all remaining files in drivers/tty/ 2017-11-08 13:08:12 +01: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 patches for 5.5-rc1 2019-12-03 14:09:14 -08:00
kgdb_nmi.c treewide: setup_timer() -> timer_setup() 2017-11-21 15:57:07 -08:00
kgdboc.c kgdboc: disable the console lock when in kgdb 2019-07-30 17:39:39 +02:00
lantiq.c serial: lantiq: Add support for Lightning Mountain SoC 2019-09-04 12:43:53 +02:00
lpc32xx_hs.c TTY/Serial driver changes for 5.4-rc1 2019-09-18 10:50:47 -07:00
Makefile {tty: serial, nand: onenand}: samsung: rename to fix build warning 2019-11-18 18:49:11 +01:00
max310x.c serial: max310x: turn off transmitter before activating AutoCTS or auto transmitter flow control 2019-09-05 09:57:44 +02:00
max3100.c treewide: setup_timer() -> timer_setup() 2017-11-21 15:57:07 -08:00
mcf.c tty: serial: Remove redundant license text 2017-11-08 13:08:12 +01:00
men_z135_uart.c drivers: mcb: use symbol namespaces 2019-11-03 19:54:53 +01:00
meson_uart.c tty: serial: meson: if no alias specified use an available id 2019-01-18 11:22:22 +01:00
milbeaut_usio.c serial: milbeaut_usio: Fix error handling in probe and remove 2019-04-29 16:20:24 +02:00
mpc52xx_uart.c tty: serial: Remove redundant license text 2017-11-08 13:08:12 +01:00
mps2-uart.c serial: mps2-uart: Add parentheses around conditional in mps2_uart_shutdown 2019-01-31 19:34:10 +01:00
msm_serial.c tty: serial: msm_serial: Fix lockup for sysrq and oops 2019-12-12 14:26:59 +01:00
mux.c treewide: setup_timer() -> timer_setup() 2017-11-21 15:57:07 -08:00
mvebu-uart.c tty: Remove dev_err() usage after platform_get_irq() 2019-09-04 12:43:49 +02:00
mxs-auart.c serial: mxs-auart: Don't check for mctrl_gpio_to_gpiod() returning error 2019-09-04 12:43:54 +02:00
omap-serial.c tty: omap-serial: Fix initial on-boot RTS GPIO level 2018-01-09 16:45:17 +01:00
owl-uart.c tty: serial: owl: Fix the link time qualifier of 'owl_uart_exit()' 2019-10-04 15:01:15 +02:00
pch_uart.c tty: serial: pch_uart: correct usage of dma_unmap_sg 2019-11-13 21:54:15 +08:00
pic32_uart.c serial: set suppress_bind_attrs flag only if builtin 2018-11-09 09:07:17 -08:00
pic32_uart.h tty: serial: Remove redundant license text 2017-11-08 13:08:12 +01:00
pmac_zilog.c tty: Use of_node_name_{eq,prefix} for node name comparisons 2018-12-17 16:12:17 +01:00
pmac_zilog.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
pnx8xxx_uart.c treewide: setup_timer() -> timer_setup() 2017-11-21 15:57:07 -08:00
pxa.c serial: pxa: Fix an error handling path in 'serial_pxa_probe()' 2018-06-28 21:07:54 +09:00
qcom_geni_serial.c tty: serial: qcom_geni_serial: Wakeup over UART RX 2019-10-10 14:29:44 +02:00
rda-uart.c tty: serial: rda: Fix the link time qualifier of 'rda_uart_exit()' 2019-10-04 15:01:15 +02:00
rp2.c treewide: devm_kzalloc() -> devm_kcalloc() 2018-06-12 16:19:22 -07:00
sa1100.c serial: sa1100: add note about modem control signals 2019-06-04 12:56:33 +01:00
samsung.h tty: serial: Remove redundant license text 2017-11-08 13:08:12 +01:00
samsung_tty.c {tty: serial, nand: onenand}: samsung: rename to fix build warning 2019-11-18 18:49:11 +01:00
sb1250-duart.c tty: serial: Remove redundant license text 2017-11-08 13:08:12 +01:00
sc16is7xx.c Merge 5.1-rc6 into tty-next 2019-04-21 23:20:08 +02:00
sccnxp.c tty: Remove dev_err() usage after platform_get_irq() 2019-09-04 12:43:49 +02:00
serial-tegra.c tty: serial: tegra: Use dma_request_chan() directly for channel request 2019-11-13 21:54:16 +08:00
serial_core.c tty: link tty and port before configuring it as console 2019-12-17 14:12:34 +01:00
serial_mctrl_gpio.c serial: mctrl_gpio: Check for NULL pointer 2019-10-07 13:21:54 +02:00
serial_mctrl_gpio.h serial: mctrl_gpio: Avoid probe failures in case of missing gpiolib 2019-09-04 12:43:50 +02:00
serial_txx9.c drivers: Remove explicit invocations of mmiowb() 2019-04-08 12:01:02 +01:00
sh-sci.c Merge 5.4-rc5 into driver-core-next 2019-10-27 18:54:13 +01:00
sh-sci.h serial: sh-sci: Support for HSCIF RX sampling point adjustment 2018-04-23 10:08:18 +02:00
sifive.c tty: Remove dev_err() usage after platform_get_irq() 2019-09-04 12:43:49 +02:00
sirfsoc_uart.c serial: sirf: Fix out-of-bounds access through DT alias 2018-02-28 15:30:00 +01:00
sirfsoc_uart.h serial: sirf: make register info static 2019-10-10 14:29:44 +02:00
sprd_serial.c serial: sprd: Add clearing break interrupt operation 2019-12-12 14:26:59 +01:00
st-asc.c tty: serial: simplify getting .drvdata 2018-04-22 17:29:43 +02:00
stm32-usart.c serial: stm32: fix clearing interrupt error flags 2019-11-21 18:23:02 +01:00
stm32-usart.h serial: stm32: add support of RX FIFO threshold 2019-06-21 11:17:36 +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 sunhv: Fix device naming inconsistency between sunhv_console and sunhv_reg 2019-06-13 14:04:37 -07:00
sunsab.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07: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/Serial driver patches for 4.21-rc1 2018-12-28 20:33:54 -08:00
sunzilog.c tty: add SPDX identifiers to all remaining files in drivers/tty/ 2017-11-08 13:08:12 +01: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 serial: Add Tegra Combined UART driver 2019-01-30 09:31:31 +01:00
timbuart.c tty: serial: Remove redundant license text 2017-11-08 13:08:12 +01:00
timbuart.h tty: serial: Remove redundant license text 2017-11-08 13:08:12 +01:00
uartlite.c Revert "serial-uartlite: Move the uart register" 2019-11-14 06:29:08 +08:00
ucc_uart.c docs: serial: move it to the driver-api 2019-07-15 11:03:03 -03:00
vr41xx_siu.c tty: serial: Remove redundant license text 2017-11-08 13:08:12 +01:00
vt8500_serial.c tty: serial: Remove redundant license text 2017-11-08 13:08:12 +01:00
xilinx_uartps.c serial: uartps: Fix uartps_major handling 2019-10-04 15:14:20 +02:00
zs.c tty: add SPDX identifiers to all remaining files in drivers/tty/ 2017-11-08 13:08:12 +01: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