]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
dmaengine: tegra186: Fix residual calculation
authorAkhil R <akhilrajeev@nvidia.com>
Fri, 15 Mar 2024 12:44:11 +0000 (18:14 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 2 May 2024 14:32:47 +0000 (16:32 +0200)
[ Upstream commit 30f0ced9971b2d8c8c24ae75786f9079489a012d ]

The existing 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>
Reviewed-by: Jon Hunter <jonathanh@nvidia.com>
Acked-by: Thierry Reding <treding@nvidia.com>
Link: https://lore.kernel.org/r/20240315124411.17582-1-akhilrajeev@nvidia.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/dma/tegra186-gpc-dma.c

index 33b10100110096f37b7a05f423d3a5b14539cb2f..674cf630528383a1b62a3f7ef3d139d3cc6dc9bc 100644 (file)
@@ -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;