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.
Unified · Split
| @@ -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; |