]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/4.19.34/dmaengine-qcom_hidma-initialize-tx-flags-in-hidma_pr.patch
Linux 4.14.111
[thirdparty/kernel/stable-queue.git] / releases / 4.19.34 / dmaengine-qcom_hidma-initialize-tx-flags-in-hidma_pr.patch
1 From 578d28fdd180b9fde07e417571a02e68d28d2f28 Mon Sep 17 00:00:00 2001
2 From: Shunyong Yang <shunyong.yang@hxt-semitech.com>
3 Date: Mon, 7 Jan 2019 09:32:14 +0800
4 Subject: dmaengine: qcom_hidma: initialize tx flags in hidma_prep_dma_*
5
6 [ Upstream commit 875aac8a46424e5b73a9ff7f40b83311b609e407 ]
7
8 In async_tx_test_ack(), it uses flags in struct dma_async_tx_descriptor
9 to check the ACK status. As hidma reuses the descriptor in a free list
10 when hidma_prep_dma_*(memcpy/memset) is called, the flag will keep ACKed
11 if the descriptor has been used before. This will cause a BUG_ON in
12 async_tx_quiesce().
13
14 kernel BUG at crypto/async_tx/async_tx.c:282!
15 Internal error: Oops - BUG: 0 1 SMP
16 ...
17 task: ffff8017dd3ec000 task.stack: ffff8017dd3e8000
18 PC is at async_tx_quiesce+0x54/0x78 [async_tx]
19 LR is at async_trigger_callback+0x98/0x110 [async_tx]
20
21 This patch initializes flags in dma_async_tx_descriptor by the flags
22 passed from the caller when hidma_prep_dma_*(memcpy/memset) is called.
23
24 Cc: Joey Zheng <yu.zheng@hxt-semitech.com>
25 Reviewed-by: Sinan Kaya <okaya@kernel.org>
26 Signed-off-by: Shunyong Yang <shunyong.yang@hxt-semitech.com>
27 Signed-off-by: Vinod Koul <vkoul@kernel.org>
28 Signed-off-by: Sasha Levin <sashal@kernel.org>
29 ---
30 drivers/dma/qcom/hidma.c | 2 ++
31 1 file changed, 2 insertions(+)
32
33 diff --git a/drivers/dma/qcom/hidma.c b/drivers/dma/qcom/hidma.c
34 index ea219bca116d..411f91fde734 100644
35 --- a/drivers/dma/qcom/hidma.c
36 +++ b/drivers/dma/qcom/hidma.c
37 @@ -416,6 +416,7 @@ hidma_prep_dma_memcpy(struct dma_chan *dmach, dma_addr_t dest, dma_addr_t src,
38 if (!mdesc)
39 return NULL;
40
41 + mdesc->desc.flags = flags;
42 hidma_ll_set_transfer_params(mdma->lldev, mdesc->tre_ch,
43 src, dest, len, flags,
44 HIDMA_TRE_MEMCPY);
45 @@ -448,6 +449,7 @@ hidma_prep_dma_memset(struct dma_chan *dmach, dma_addr_t dest, int value,
46 if (!mdesc)
47 return NULL;
48
49 + mdesc->desc.flags = flags;
50 hidma_ll_set_transfer_params(mdma->lldev, mdesc->tre_ch,
51 value, dest, len, flags,
52 HIDMA_TRE_MEMSET);
53 --
54 2.19.1
55