linux/drivers/tty/serial
Hugo Villeneuve d02bb770ec serial: sc16is7xx: fix bug in flow control levels init
commit 535fd4c984 upstream.

When trying to set MCR[2], XON1 is incorrectly accessed instead. And when
writing to the TCR register to configure flow control levels, we are
incorrectly writing to the MSR register. The default value of $00 is then
used for TCR, which means that selectable trigger levels in FCR are used
in place of TCR.

TCR/TLR access requires EFR[4] (enable enhanced functions) and MCR[2]
to be set. EFR[4] is already set in probe().

MCR access requires LCR[7] to be zero.

Since LCR is set to $BF when trying to set MCR[2], XON1 is incorrectly
accessed instead because MCR shares the same address space as XON1.

Since MCR[2] is unmodified and still zero, when writing to TCR we are in
fact writing to MSR because TCR/TLR registers share the same address space
as MSR/SPR.

Fix by first removing useless reconfiguration of EFR[4] (enable enhanced
functions), as it is already enabled in sc16is7xx_probe() since commit
43c51bb573 ("sc16is7xx: make sure device is in suspend once probed").
Now LCR is $00, which means that MCR access is enabled.

Also remove regcache_cache_bypass() calls since we no longer access the
enhanced registers set, and TCR is already declared as volatile (in fact
by declaring MSR as volatile, which shares the same address).

Finally disable access to TCR/TLR registers after modifying them by
clearing MCR[2].

Note: the comment about "... and internal clock div" is wrong and can be
      ignored/removed as access to internal clock div registers (DLL/DLH)
      is permitted only when LCR[7] is logic 1, not when enhanced features
      is enabled. And DLL/DLH access is not needed in sc16is7xx_startup().

Fixes: dfeae619d7 ("serial: sc16is7xx")
Cc: stable@vger.kernel.org
Signed-off-by: Hugo Villeneuve <hvilleneuve@dimonoff.com>
Link: https://lore.kernel.org/r/20250731124451.1108864-1-hugo@hugovil.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2025-09-19 16:35:48 +02:00
..
8250 serial: 8250: fix panic due to PSLVERR 2025-08-28 16:30:53 +02:00
jsm serial: jsm: fix NPE during jsm_uart_port_init 2025-06-10 07:13:00 -04:00
21285.c serial: 21285: Use port lock wrappers 2023-09-18 11:18:08 +02:00
altera_jtaguart.c serial: altera_jtaguart: Convert to platform remove callback returning void 2023-11-23 19:12:30 +00:00
altera_uart.c tty/serial: altera_uart: use more informative labels in /proc/interrupts 2024-01-04 16:20:51 +01:00
amba-pl010.c serial: amba-pl010: Use port lock wrappers 2023-09-18 11:18:09 +02:00
amba-pl011.c serial: amba-pl011: fix build regression 2024-12-05 14:02:54 +01:00
apbuart.c serial: apbuart: fix console prompt on qemu 2024-01-04 16:21:06 +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: Remove unneeded static structure 2024-04-09 17:07:10 +02:00
arc_uart.c tty: serial: switch from circ_buf to kfifo 2024-04-09 15:28:03 +02:00
atmel_serial.c serial: mctrl_gpio: split disable_ms into sync and no_sync APIs 2025-05-29 11:02:45 +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-06-24 16:14:48 +02:00
clps711x.c tty: serial: switch from circ_buf to kfifo 2024-04-09 15:28:03 +02:00
cpm_uart.c tty: serial: switch from circ_buf to kfifo 2024-04-09 15:28:03 +02:00
cpm_uart.h serial: cpm_uart: Remove cpm_uart/ subdirectory 2023-08-04 15:08:30 +02:00
digicolor-usart.c tty: serial: switch from circ_buf to kfifo 2024-04-09 15:28:03 +02:00
dz.c tty: serial: switch from circ_buf to kfifo 2024-04-09 15:28:03 +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 tty/serial: Add RISC-V SBI debug console based earlycon 2024-01-10 07:04:04 -08: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
esp32_acm.c tty: add missing MODULE_DESCRIPTION() macros 2024-06-24 16:10:11 +02:00
esp32_uart.c tty: add missing MODULE_DESCRIPTION() macros 2024-06-24 16:10:11 +02:00
fsl_linflexuart.c tty: serial: switch from circ_buf to kfifo 2024-04-09 15:28:03 +02:00
fsl_lpuart.c tty: serial: lpuart: only disable CTS instead of overwriting the whole UARTMODIR register 2025-04-10 14:39:36 +02:00
icom.c tty: serial: switch from circ_buf to kfifo 2024-04-09 15:28:03 +02:00
imx.c serial: imx: Restore original RXTL for console to fix data loss 2025-07-06 11:01:43 +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 tty: serial: switch from circ_buf to kfifo 2024-04-09 15:28:03 +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 serial: sc16is7xx: re-add Kconfig SPI or I2C dependency 2024-06-04 14:10:28 +02: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-04-26 17:14:10 +01:00
lantiq.c serial: lantiq: Convert to platform remove callback returning void 2023-11-23 19:12:32 +00:00
liteuart.c serial: liteuart: Convert to platform remove callback returning void 2023-11-23 19:12:32 +00:00
lpc32xx_hs.c serial: lpc32xx_hs: Use uart_prepare_sysrq_char() to handle sysrq. 2024-03-02 22:06:21 +01:00
ma35d1_serial.c tty: serial: ma35d1: Add a NULL check for of_node 2024-07-03 16:12:06 +02:00
Makefile serial: sc16is7xx: rename Kconfig CONFIG_SERIAL_SC16IS7XX_CORE 2024-06-04 14:10:28 +02:00
max310x.c tty: serial: max310x: convert to use maple tree register cache 2024-04-09 16:50:36 +02:00
max3100.c move asm/unaligned.h to linux/unaligned.h 2024-10-02 17:23:23 -04:00
mcf.c tty: mcf: MCF54418 has 10 UARTS 2024-06-24 16:13:05 +02:00
men_z135_uart.c tty: serial: switch from circ_buf to kfifo 2024-04-09 15:28:03 +02:00
meson_uart.c serial: meson+qcom: don't advance the kfifo twice 2024-04-16 09:05:43 +02:00
milbeaut_usio.c serial: Fix potential null-ptr-deref in mlb_usio_probe() 2025-06-19 15:32:11 +02:00
mpc52xx_uart.c serial: mpc52xx: Convert to platform remove callback returning void 2023-11-23 19:12:32 +00:00
mps2-uart.c serial: mps2-uart: Use port lock wrappers 2023-09-18 11:18:12 +02:00
msm_serial.c serial: msm: Configure correct working mode before starting earlycon 2025-05-02 07:59:11 +02:00
mux.c tty: serial: use uart_port_tx_limited() 2022-11-03 03:32:40 +01:00
mvebu-uart.c tty: serial: switch from circ_buf to kfifo 2024-04-09 15:28:03 +02:00
mxs-auart.c Merge 6.9-rc5 into tty-next 2024-04-23 13:24:45 +02:00
omap-serial.c serial: omap: remove redundant assignment to variable tmout 2024-04-11 14:08:36 +02:00
owl-uart.c tty: add missing MODULE_DESCRIPTION() macros 2024-06-24 16:10:11 +02:00
pch_uart.c pch_uart: Fix dma_sync_sg_for_device() nents value 2025-07-24 08:56:21 +02:00
pic32_uart.c serial: pic32_uart: Replace of_gpio.h by proper one 2024-04-09 15:48:43 +02:00
pmac_zilog.c Merge 6.9-rc5 into tty-next 2024-04-23 13:24:45 +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: pxa: Use uart_prepare_sysrq_char(). 2024-03-02 22:06:21 +01:00
qcom_geni_serial.c serial: qcom-geni: rename suspend functions 2024-10-11 08:39:24 +02:00
rda-uart.c tty: serial: switch from circ_buf to kfifo 2024-04-09 15:28:03 +02:00
rp2.c tty: rp2: Fix reset with non forgiving PCIe host bridges 2024-09-11 15:46:55 +02:00
sa1100.c serial: sa1100: Convert to platform remove callback returning void 2023-11-23 19:12:33 +00:00
samsung_tty.c tty: serial: samsung: Fix serial rx on Apple A7-A9 2024-09-11 15:47:13 +02:00
sb1250-duart.c tty: serial: switch from circ_buf to kfifo 2024-04-09 15:28:03 +02:00
sc16is7xx.c serial: sc16is7xx: fix bug in flow control levels init 2025-09-19 16:35:48 +02:00
sc16is7xx.h serial: sc16is7xx: split into core and I2C/SPI parts (sc16is7xx_regcfg) 2024-04-11 14:08:08 +02:00
sc16is7xx_i2c.c serial: sc16is7xx: split into core and I2C/SPI parts (sc16is7xx_regcfg) 2024-04-11 14:08:08 +02:00
sc16is7xx_spi.c serial: sc16is7xx: split into core and I2C/SPI parts (sc16is7xx_regcfg) 2024-04-11 14:08:08 +02:00
sccnxp.c tty: serial: switch from circ_buf to kfifo 2024-04-09 15:28:03 +02:00
serial-tegra.c tty: serial: switch from circ_buf to kfifo 2024-04-09 15:28:03 +02:00
serial_base.h serial: core: Add serial_base_match_and_update_preferred_console() 2024-07-04 15:41:44 +02:00
serial_base_bus.c serial: core: restore of_node information in sysfs 2025-07-06 11:01:43 +02:00
serial_core.c tty: serial: fix print format specifiers 2025-08-20 18:30:26 +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 serial: mctrl_gpio: split disable_ms into sync and no_sync APIs 2025-05-29 11:02:45 +02:00
serial_mctrl_gpio.h serial: mctrl_gpio: split disable_ms into sync and no_sync APIs 2025-05-29 11:02:45 +02:00
serial_port.c serial: port: Always update ->iotype in __uart_read_properties() 2025-02-21 14:01:35 +01:00
serial_txx9.c serial: txx9: Add missing #include <asm/txx9/generic.h> 2024-01-27 19:05:39 -08:00
sh-sci.c serial: sh-sci: Increment the runtime usage counter for the earlycon device 2025-06-27 11:11:45 +01: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: lock port in startup()/shutdown() callbacks 2025-05-02 07:59:11 +02:00
sprd_serial.c tty: serial: switch from circ_buf to kfifo 2024-04-09 15:28:03 +02:00
st-asc.c serial: st-asc: Switch from CONFIG_PM_SLEEP guards to pm_sleep_ptr() 2024-07-31 12:32:25 +02:00
stm32-usart.c serial: mctrl_gpio: split disable_ms into sync and no_sync APIs 2025-05-29 11:02:45 +02:00
stm32-usart.h serial: stm32: get FIFO size from hwcfg register 2024-01-27 19:04:11 -08: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: serial: switch from circ_buf to kfifo 2024-04-09 15:28:03 +02:00
sunplus-uart.c tty: serial: switch from circ_buf to kfifo 2024-04-09 15:28:03 +02:00
sunsab.c tty: serial: switch from circ_buf to kfifo 2024-04-09 15:28:03 +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: sunsu: Simplify device_node cleanup by using __free 2024-06-04 14:00:16 +02:00
sunzilog.c tty: serial: switch from circ_buf to kfifo 2024-04-09 15:28:03 +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: serial: switch from circ_buf to kfifo 2024-04-09 15:28:03 +02:00
timbuart.c tty: serial: switch from circ_buf to kfifo 2024-04-09 15:28:03 +02:00
timbuart.h tty: serial: Use the correct style for SPDX License Identifier 2020-03-07 09:52:01 +01:00
uartlite.c tty: serial: uartlite: register uart driver in init 2025-07-06 11:01:35 +02:00
ucc_uart.c tty: serial: switch from circ_buf to kfifo 2024-04-09 15:28:03 +02:00
vt8500_serial.c serial: vt8500: Use port lock wrappers 2023-09-18 11:18:16 +02:00
xilinx_uartps.c tty: xilinx_uartps: split sysrq handling 2025-02-17 10:04:57 +01:00
zs.c tty: serial: switch from circ_buf to kfifo 2024-04-09 15:28:03 +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