* [PATCH] dmaengine: tegra186: Fix residual calculation
@ 2024-02-29 6:52 Akhil R
2024-02-29 10:53 ` Jon Hunter
0 siblings, 1 reply; 2+ messages in thread
From: Akhil R @ 2024-02-29 6:52 UTC (permalink / raw)
To: ldewangan, jonathanh, vkoul, thierry.reding, digetx, dmaengine,
linux-tegra, linux-kernel
Cc: Akhil R
The exisiting residual calculation returns an incorrect value when
bytes_xfer == bytes_req. This scenario occurs particularly with
drivers like UART where DMA is scheduled for maximum number of bytes and
is terminated when the bytes inflow stops. At higher baud rates, it
could request the tx_status while there is no bytes left to transfer.
This will lead to incorrect residual being set. Hence return residual as
'0' when bytes transferred equals to the bytes requested.
Fixes: ee17028009d4 ("dmaengine: tegra: Add tegra gpcdma driver")
Signed-off-by: Akhil R <akhilrajeev@nvidia.com>
---
drivers/dma/tegra186-gpc-dma.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/dma/tegra186-gpc-dma.c b/drivers/dma/tegra186-gpc-dma.c
index 88547a23825b..3642508e88bb 100644
--- a/drivers/dma/tegra186-gpc-dma.c
+++ b/drivers/dma/tegra186-gpc-dma.c
@@ -746,6 +746,9 @@ static int tegra_dma_get_residual(struct tegra_dma_channel *tdc)
bytes_xfer = dma_desc->bytes_xfer +
sg_req[dma_desc->sg_idx].len - (wcount * 4);
+ if (dma_desc->bytes_req == bytes_xfer)
+ return 0;
+
residual = dma_desc->bytes_req - (bytes_xfer % dma_desc->bytes_req);
return residual;
--
2.43.2
^ permalink raw reply [flat|nested] 2+ messages in thread* Re: [PATCH] dmaengine: tegra186: Fix residual calculation
2024-02-29 6:52 [PATCH] dmaengine: tegra186: Fix residual calculation Akhil R
@ 2024-02-29 10:53 ` Jon Hunter
0 siblings, 0 replies; 2+ messages in thread
From: Jon Hunter @ 2024-02-29 10:53 UTC (permalink / raw)
To: Akhil R, ldewangan, vkoul, thierry.reding, digetx, dmaengine,
linux-tegra, linux-kernel
On 29/02/2024 06:52, Akhil R wrote:
> The exisiting residual calculation returns an incorrect value when
s/exisiting/existing/
> bytes_xfer == bytes_req. This scenario occurs particularly with
> drivers like UART where DMA is scheduled for maximum number of bytes and
> is terminated when the bytes inflow stops. At higher baud rates, it
> could request the tx_status while there is no bytes left to transfer.
> This will lead to incorrect residual being set. Hence return residual as
> '0' when bytes transferred equals to the bytes requested.
>
> Fixes: ee17028009d4 ("dmaengine: tegra: Add tegra gpcdma driver")
> Signed-off-by: Akhil R <akhilrajeev@nvidia.com>
> ---
> drivers/dma/tegra186-gpc-dma.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/drivers/dma/tegra186-gpc-dma.c b/drivers/dma/tegra186-gpc-dma.c
> index 88547a23825b..3642508e88bb 100644
> --- a/drivers/dma/tegra186-gpc-dma.c
> +++ b/drivers/dma/tegra186-gpc-dma.c
> @@ -746,6 +746,9 @@ static int tegra_dma_get_residual(struct tegra_dma_channel *tdc)
> bytes_xfer = dma_desc->bytes_xfer +
> sg_req[dma_desc->sg_idx].len - (wcount * 4);
>
> + if (dma_desc->bytes_req == bytes_xfer)
> + return 0;
> +
> residual = dma_desc->bytes_req - (bytes_xfer % dma_desc->bytes_req);
>
> return residual;
Thanks! Apart from the typo, looks good to me ...
Reviewed-by: Jon Hunter <jonathanh@nvidia.com>
Jon
--
nvpublic
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2024-02-29 10:53 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-02-29 6:52 [PATCH] dmaengine: tegra186: Fix residual calculation Akhil R
2024-02-29 10:53 ` Jon Hunter
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®