Commit 40a40714 authored by Ronald Wahl's avatar Ronald Wahl Committed by sanglipeng
Browse files

serial: 8250: 8250_omap: Do not start RX DMA on THRI interrupt

stable inclusion
from stable-v5.10.204
commit 8ffaaf80c64c341cd12c6038be7336fe3e97f263
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I9J4PL

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=8ffaaf80c64c341cd12c6038be7336fe3e97f263



--------------------------------

commit c6bb057418876cdfdd29a6f7b8cef54539ee8811 upstream.

Starting RX DMA on THRI interrupt is too early because TX may not have
finished yet.

This change is inspired by commit 90b8596a ("serial: 8250: Prevent
starting up DMA Rx on THRI interrupt") and fixes DMA issues I had with
an AM62 SoC that is using the 8250 OMAP variant.

Cc: stable@vger.kernel.org
Fixes: c26389f9 ("serial: 8250: 8250_omap: Add DMA support for UARTs on K3 SoCs")
Signed-off-by: default avatarRonald Wahl <ronald.wahl@raritan.com>
Reviewed-by: default avatarVignesh Raghavendra <vigneshr@ti.com>
Link: https://lore.kernel.org/r/20231101171431.16495-1-rwahl@gmx.de


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarsanglipeng <sanglipeng1@jd.com>
parent ff6b1513
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -1209,10 +1209,12 @@ static int omap_8250_dma_handle_irq(struct uart_port *port)

	status = serial_port_in(port, UART_LSR);

	if ((iir & 0x3f) != UART_IIR_THRI) {
		if (priv->habit & UART_HAS_EFR2)
			am654_8250_handle_rx_dma(up, iir, status);
		else
			status = omap_8250_handle_rx_dma(up, iir, status);
	}

	serial8250_modem_status(up);
	if (status & UART_LSR_THRE && up->dma->tx_err) {