Michal Koutný 13eced
From: Kartik <kkartik@nvidia.com>
Michal Koutný 13eced
Date: Tue, 18 Oct 2022 20:28:06 +0530
Michal Koutný 13eced
Subject: serial: tegra: Read DMA status before terminating
Michal Koutný 13eced
Git-commit: 109a951a9f1fd8a34ebd1896cbbd5d5cede880a7
Michal Koutný 13eced
Patch-mainline: v6.2-rc1
Michal Koutný 13eced
References: jsc#PED-1763
Michal Koutný 13eced
Michal Koutný 13eced
Read the DMA status before terminating the DMA, as doing so deletes
Michal Koutný 13eced
the DMA desc.
Michal Koutný 13eced
Michal Koutný 13eced
Also, to get the correct transfer status information, pause the DMA
Michal Koutný 13eced
using dmaengine_pause() before reading the DMA status.
Michal Koutný 13eced
Michal Koutný 13eced
Fixes: e9ea096dd225 ("serial: tegra: add serial driver")
Michal Koutný 13eced
Reviewed-by: Jon Hunter <jonathanh@nvidia.com>
Michal Koutný 13eced
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Michal Koutný 13eced
Acked-by: Thierry Reding <treding@nvidia.com>
Michal Koutný 13eced
Signed-off-by: Akhil R <akhilrajeev@nvidia.com>
Michal Koutný 13eced
Signed-off-by: Kartik <kkartik@nvidia.com>
Michal Koutný 13eced
Link: https://lore.kernel.org/r/1666105086-17326-1-git-send-email-kkartik@nvidia.com
Michal Koutný 13eced
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Michal Koutný 13eced
Signed-off-by: Matthias Brugger <mbrugger@suse.com>
Michal Koutný 13eced
---
Michal Koutný 13eced
 drivers/tty/serial/serial-tegra.c | 6 ++++--
Michal Koutný 13eced
 1 file changed, 4 insertions(+), 2 deletions(-)
Michal Koutný 13eced
Michal Koutný 13eced
diff --git a/drivers/tty/serial/serial-tegra.c b/drivers/tty/serial/serial-tegra.c
Michal Koutný 13eced
index 4304e3f9307dd..e5b9773db5e36 100644
Michal Koutný 13eced
--- a/drivers/tty/serial/serial-tegra.c
Michal Koutný 13eced
+++ b/drivers/tty/serial/serial-tegra.c
Michal Koutný 13eced
@@ -618,8 +618,9 @@ static void tegra_uart_stop_tx(struct uart_port *u)
Michal Koutný 13eced
 	if (tup->tx_in_progress != TEGRA_UART_TX_DMA)
Michal Koutný 13eced
 		return;
Michal Koutný 13eced
 
Michal Koutný 13eced
-	dmaengine_terminate_all(tup->tx_dma_chan);
Michal Koutný 13eced
+	dmaengine_pause(tup->tx_dma_chan);
Michal Koutný 13eced
 	dmaengine_tx_status(tup->tx_dma_chan, tup->tx_cookie, &state);
Michal Koutný 13eced
+	dmaengine_terminate_all(tup->tx_dma_chan);
Michal Koutný 13eced
 	count = tup->tx_bytes_requested - state.residue;
Michal Koutný 13eced
 	async_tx_ack(tup->tx_dma_desc);
Michal Koutný 13eced
 	uart_xmit_advance(&tup->uport, count);
Michal Koutný 13eced
@@ -762,8 +763,9 @@ static void tegra_uart_terminate_rx_dma(struct tegra_uart_port *tup)
Michal Koutný 13eced
 		return;
Michal Koutný 13eced
 	}
Michal Koutný 13eced
 
Michal Koutný 13eced
-	dmaengine_terminate_all(tup->rx_dma_chan);
Michal Koutný 13eced
+	dmaengine_pause(tup->rx_dma_chan);
Michal Koutný 13eced
 	dmaengine_tx_status(tup->rx_dma_chan, tup->rx_cookie, &state);
Michal Koutný 13eced
+	dmaengine_terminate_all(tup->rx_dma_chan);
Michal Koutný 13eced
 
Michal Koutný 13eced
 	tegra_uart_rx_buffer_push(tup, state.residue);
Michal Koutný 13eced
 	tup->rx_dma_active = false;
Michal Koutný 13eced
-- 
Michal Koutný 13eced
2.38.1
Michal Koutný 13eced