Commit 109a951a authored by Kartik's avatar Kartik Committed by Greg Kroah-Hartman
Browse files

serial: tegra: Read DMA status before terminating



Read the DMA status before terminating the DMA, as doing so deletes
the DMA desc.

Also, to get the correct transfer status information, pause the DMA
using dmaengine_pause() before reading the DMA status.

Fixes: e9ea096d ("serial: tegra: add serial driver")
Reviewed-by: default avatarJon Hunter <jonathanh@nvidia.com>
Reviewed-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Acked-by: default avatarThierry Reding <treding@nvidia.com>
Signed-off-by: default avatarAkhil R <akhilrajeev@nvidia.com>
Signed-off-by: default avatarKartik <kkartik@nvidia.com>
Link: https://lore.kernel.org/r/1666105086-17326-1-git-send-email-kkartik@nvidia.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent c2087b37
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -618,8 +618,9 @@ static void tegra_uart_stop_tx(struct uart_port *u)
	if (tup->tx_in_progress != TEGRA_UART_TX_DMA)
		return;

	dmaengine_terminate_all(tup->tx_dma_chan);
	dmaengine_pause(tup->tx_dma_chan);
	dmaengine_tx_status(tup->tx_dma_chan, tup->tx_cookie, &state);
	dmaengine_terminate_all(tup->tx_dma_chan);
	count = tup->tx_bytes_requested - state.residue;
	async_tx_ack(tup->tx_dma_desc);
	uart_xmit_advance(&tup->uport, count);
@@ -762,8 +763,9 @@ static void tegra_uart_terminate_rx_dma(struct tegra_uart_port *tup)
		return;
	}

	dmaengine_terminate_all(tup->rx_dma_chan);
	dmaengine_pause(tup->rx_dma_chan);
	dmaengine_tx_status(tup->rx_dma_chan, tup->rx_cookie, &state);
	dmaengine_terminate_all(tup->rx_dma_chan);

	tegra_uart_rx_buffer_push(tup, state.residue);
	tup->rx_dma_active = false;