Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

serial: bcm63xx-uart: fix tx after conversion to uart_port_tx_limited()

When bcm63xx-uart was converted to uart_port_tx_limited(), it implicitly
added a call to stop_tx(). This causes garbage to be put out on the
serial console. To fix this, pass UART_TX_NOSTOP in flags, and manually
call stop_tx() ourselves analogue to how a similar issue was fixed in
commit 7be50f2e8f20 ("serial: mxs-auart: fix tx").

Fixes: d11cc8c3c4b6 ("tty: serial: use uart_port_tx_limited()")
Cc: stable@vger.kernel.org
Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
Signed-off-by: Doug Brown <doug@schmorgal.com>
Link: https://lore.kernel.org/r/20240606195632.173255-4-doug@schmorgal.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Jonas Gorski and committed by
Greg Kroah-Hartman
ea55c65d 9bb43b9e

+5 -2
+5 -2
drivers/tty/serial/bcm63xx_uart.c
··· 308 308 309 309 val = bcm_uart_readl(port, UART_MCTL_REG); 310 310 val = (val & UART_MCTL_TXFIFOFILL_MASK) >> UART_MCTL_TXFIFOFILL_SHIFT; 311 - 312 - pending = uart_port_tx_limited(port, ch, port->fifosize - val, 311 + pending = uart_port_tx_limited_flags(port, ch, UART_TX_NOSTOP, 312 + port->fifosize - val, 313 313 true, 314 314 bcm_uart_writel(port, ch, UART_FIFO_REG), 315 315 ({})); ··· 320 320 val = bcm_uart_readl(port, UART_IR_REG); 321 321 val &= ~UART_TX_INT_MASK; 322 322 bcm_uart_writel(port, val, UART_IR_REG); 323 + 324 + if (uart_tx_stopped(port)) 325 + bcm_uart_stop_tx(port); 323 326 } 324 327 325 328 /*