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: e9ea096dd2 ("serial: tegra: add serial driver")
Reviewed-by: Jon Hunter <jonathanh@nvidia.com>
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Acked-by: Thierry Reding <treding@nvidia.com>
Signed-off-by: Akhil R <akhilrajeev@nvidia.com>
Signed-off-by: Kartik <kkartik@nvidia.com>
Link: https://lore.kernel.org/r/1666105086-17326-1-git-send-email-kkartik@nvidia.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Kartik 2022-10-18 20:28:06 +05:30 committed by Greg Kroah-Hartman
parent c2087b37d1
commit 109a951a9f
1 changed files with 4 additions and 2 deletions

View File

@ -618,8 +618,9 @@ static void tegra_uart_stop_tx(struct uart_port *u)
if (tup->tx_in_progress != TEGRA_UART_TX_DMA) if (tup->tx_in_progress != TEGRA_UART_TX_DMA)
return; 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_tx_status(tup->tx_dma_chan, tup->tx_cookie, &state);
dmaengine_terminate_all(tup->tx_dma_chan);
count = tup->tx_bytes_requested - state.residue; count = tup->tx_bytes_requested - state.residue;
async_tx_ack(tup->tx_dma_desc); async_tx_ack(tup->tx_dma_desc);
uart_xmit_advance(&tup->uport, count); uart_xmit_advance(&tup->uport, count);
@ -762,8 +763,9 @@ static void tegra_uart_terminate_rx_dma(struct tegra_uart_port *tup)
return; 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_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); tegra_uart_rx_buffer_push(tup, state.residue);
tup->rx_dma_active = false; tup->rx_dma_active = false;