Thread (3 messages) 3 messages, 2 authors, 2019-02-02

[v2] dmaengine: at_xdmac: Fix wrongfull report of a channel as in use

From: Vinod Koul <vkoul@kernel.org>
Date: 2019-02-02 10:27:18
Also in: linux-arm-kernel, lkml

On 23-01-19, 16:33, Codrin.Ciubotariu@microchip.com wrote:
From: Codrin Ciubotariu <codrin.ciubotariu@microchip.com>

atchan->status variable is used to store two different information:
 - pass channel interrupts status from interrupt handler to tasklet;
 - channel information like whether it is cyclic or paused;

This causes a bug when device_terminate_all() is called,
(AT_XDMAC_CHAN_IS_CYCLIC cleared on atchan->status) and then a late End
of Block interrupt arrives (AT_XDMAC_CIS_BIS), which sets bit 0 of
atchan->status. Bit 0 is also used for AT_XDMAC_CHAN_IS_CYCLIC, so when
a new descriptor for a cyclic transfer is created, the driver reports
the channel as in use:

if (test_and_set_bit(AT_XDMAC_CHAN_IS_CYCLIC, &atchan->status)) {
	dev_err(chan2dev(chan), "channel currently used\n");
	return NULL;
}

This patch fixes the bug by adding a different struct member to keep
the interrupts status separated from the channel status bits.
Applied, thanks
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help