2022-10-18 15:37:39

by Kartik Rajput

[permalink] [raw]
Subject: [PATCH v2] 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: e9ea096dd225 ("serial: tegra: add serial driver")

Signed-off-by: Akhil R <[email protected]>
Signed-off-by: Kartik <[email protected]>
---
v1->v2:
* Pause the DMA before reading the DMA status.
* Updated commit message.

drivers/tty/serial/serial-tegra.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/tty/serial/serial-tegra.c b/drivers/tty/serial/serial-tegra.c
index b7170cb9a544..cda9cd4fa92c 100644
--- a/drivers/tty/serial/serial-tegra.c
+++ b/drivers/tty/serial/serial-tegra.c
@@ -619,8 +619,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);
@@ -763,8 +764,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;
--
2.17.1


2022-10-18 16:30:13

by Thierry Reding

[permalink] [raw]
Subject: Re: [PATCH v2] serial: tegra: Read DMA status before terminating

On Tue, Oct 18, 2022 at 08:28:06PM +0530, Kartik wrote:
> 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: e9ea096dd225 ("serial: tegra: add serial driver")
>
> Signed-off-by: Akhil R <[email protected]>
> Signed-off-by: Kartik <[email protected]>
> ---
> v1->v2:
> * Pause the DMA before reading the DMA status.
> * Updated commit message.
>
> drivers/tty/serial/serial-tegra.c | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)

Seems fine:

Acked-by: Thierry Reding <[email protected]>


Attachments:
(No filename) (711.00 B)
signature.asc (849.00 B)
Download all attachments

2022-10-19 10:36:54

by Ilpo Järvinen

[permalink] [raw]
Subject: Re: [PATCH v2] serial: tegra: Read DMA status before terminating

On Tue, 18 Oct 2022, Kartik wrote:

> 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: e9ea096dd225 ("serial: tegra: add serial driver")
>
> Signed-off-by: Akhil R <[email protected]>
> Signed-off-by: Kartik <[email protected]>
> ---
> v1->v2:
> * Pause the DMA before reading the DMA status.
> * Updated commit message.
>
> drivers/tty/serial/serial-tegra.c | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/tty/serial/serial-tegra.c b/drivers/tty/serial/serial-tegra.c
> index b7170cb9a544..cda9cd4fa92c 100644
> --- a/drivers/tty/serial/serial-tegra.c
> +++ b/drivers/tty/serial/serial-tegra.c
> @@ -619,8 +619,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);
> @@ -763,8 +764,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;

Reviewed-by: Ilpo J?rvinen <[email protected]>


--
i.

2022-10-19 11:36:01

by Jon Hunter

[permalink] [raw]
Subject: Re: [PATCH v2] serial: tegra: Read DMA status before terminating


On 18/10/2022 15:58, Kartik wrote:
> 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: e9ea096dd225 ("serial: tegra: add serial driver")
>
> Signed-off-by: Akhil R <[email protected]>
> Signed-off-by: Kartik <[email protected]>
> ---
> v1->v2:
> * Pause the DMA before reading the DMA status.
> * Updated commit message.
>
> drivers/tty/serial/serial-tegra.c | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/tty/serial/serial-tegra.c b/drivers/tty/serial/serial-tegra.c
> index b7170cb9a544..cda9cd4fa92c 100644
> --- a/drivers/tty/serial/serial-tegra.c
> +++ b/drivers/tty/serial/serial-tegra.c
> @@ -619,8 +619,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);
> @@ -763,8 +764,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;

Thanks!

Reviewed-by: Jon Hunter <[email protected]>

Jon

--
nvpublic