History

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.

Kartik committed 4 years ago

Commit 109a9511 parent c2087b31 file · +4 −2Browse files

Unified · Split

drivers/tty/serial/serial-tegra.c+4−2
@@ -618,8 +618,9 @@ static void tegra_uart_stop_tx(struct uart_port *u) · 617 unmodified lines
618618 if (tup->tx_in_progress != TEGRA_UART_TX_DMA)
619619 return;
620620
621− dmaengine_terminate_all(tup->tx_dma_chan);
621+ dmaengine_pause(tup->tx_dma_chan);
622622 dmaengine_tx_status(tup->tx_dma_chan, tup->tx_cookie, &state);
623+ dmaengine_terminate_all(tup->tx_dma_chan);
623624 count = tup->tx_bytes_requested - state.residue;
624625 async_tx_ack(tup->tx_dma_desc);
625626 uart_xmit_advance(&tup->uport, count);
@@ -762,8 +763,9 @@ static void tegra_uart_terminate_rx_dma(struct tegra_uart_port *tup) · 136 unmodified lines
762763 return;
763764 }
764765
765− dmaengine_terminate_all(tup->rx_dma_chan);
766+ dmaengine_pause(tup->rx_dma_chan);
766767 dmaengine_tx_status(tup->rx_dma_chan, tup->rx_cookie, &state);
768+ dmaengine_terminate_all(tup->rx_dma_chan);
767769
768770 tegra_uart_rx_buffer_push(tup, state.residue);
769771 tup->rx_dma_active = false;