Commit 6654a862 authored by Tudor Ambarus's avatar Tudor Ambarus Committed by sanglipeng
Browse files

dmaengine: at_hdmac: Do not call the complete callback on device_terminate_all

stable inclusion
from stable-v5.10.155
commit ee356822618ee86cfab8fac1bec0bf66fb98ea2e
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I7M5F4

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=ee356822618ee86cfab8fac1bec0bf66fb98ea2e



--------------------------------

commit f645f85a upstream.

The method was wrong because it violated the dmaengine API. For aborted
transfers the complete callback should not be called. Fix the behavior and
do not call the complete callback on device_terminate_all.

Fixes: 808347f6 ("dmaengine: at_hdmac: add DMA slave transfers")
Reported-by: default avatarPeter Rosin <peda@axentia.se>
Signed-off-by: default avatarTudor Ambarus <tudor.ambarus@microchip.com>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/lkml/13c6c9a2-6db5-c3bf-349b-4c127ad3496a@axentia.se/


Acked-by: default avatarNicolas Ferre <nicolas.ferre@microchip.com>
Link: https://lore.kernel.org/r/20221025090306.297886-1-tudor.ambarus@microchip.com
Link: https://lore.kernel.org/r/20221025090306.297886-6-tudor.ambarus@microchip.com


Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarsanglipeng <sanglipeng1@jd.com>
parent df7e200b
Loading
Loading
Loading
Loading
+2 −9
Original line number Diff line number Diff line
@@ -1410,11 +1410,8 @@ static int atc_terminate_all(struct dma_chan *chan)
	struct at_dma_chan	*atchan = to_at_dma_chan(chan);
	struct at_dma		*atdma = to_at_dma(chan->device);
	int			chan_id = atchan->chan_common.chan_id;
	struct at_desc		*desc, *_desc;
	unsigned long		flags;

	LIST_HEAD(list);

	dev_vdbg(chan2dev(chan), "%s\n", __func__);

	/*
@@ -1433,15 +1430,11 @@ static int atc_terminate_all(struct dma_chan *chan)
		cpu_relax();

	/* active_list entries will end up before queued entries */
	list_splice_init(&atchan->queue, &list);
	list_splice_init(&atchan->active_list, &list);
	list_splice_tail_init(&atchan->queue, &atchan->free_list);
	list_splice_tail_init(&atchan->active_list, &atchan->free_list);

	spin_unlock_irqrestore(&atchan->lock, flags);

	/* Flush all pending and queued descriptors */
	list_for_each_entry_safe(desc, _desc, &list, desc_node)
		atc_chain_complete(atchan, desc);

	clear_bit(ATC_IS_PAUSED, &atchan->status);
	/* if channel dedicated to cyclic operations, free it */
	clear_bit(ATC_IS_CYCLIC, &atchan->status);