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
618 if (tup->tx_in_progress != TEGRA_UART_TX_DMA)618 if (tup->tx_in_progress != TEGRA_UART_TX_DMA)
619 return;619 return;
620 620
621 dmaengine_terminate_all(tup->tx_dma_chan);621 dmaengine_pause(tup->tx_dma_chan);
622 dmaengine_tx_status(tup->tx_dma_chan, tup->tx_cookie, &state);622 dmaengine_tx_status(tup->tx_dma_chan, tup->tx_cookie, &state);
623 dmaengine_terminate_all(tup->tx_dma_chan);
623 count = tup->tx_bytes_requested - state.residue;624 count = tup->tx_bytes_requested - state.residue;
624 async_tx_ack(tup->tx_dma_desc);625 async_tx_ack(tup->tx_dma_desc);
625 uart_xmit_advance(&tup->uport, count);626 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
762 return;763 return;
763 }764 }
764 765
765 dmaengine_terminate_all(tup->rx_dma_chan);766 dmaengine_pause(tup->rx_dma_chan);
766 dmaengine_tx_status(tup->rx_dma_chan, tup->rx_cookie, &state);767 dmaengine_tx_status(tup->rx_dma_chan, tup->rx_cookie, &state);
768 dmaengine_terminate_all(tup->rx_dma_chan);
767 769
768 tegra_uart_rx_buffer_push(tup, state.residue);770 tegra_uart_rx_buffer_push(tup, state.residue);
769 tup->rx_dma_active = false;771 tup->rx_dma_active = false;