| From a5dea05f758bf091d009d3d317250cf7ee3f66f1 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 23 Oct 2021 15:41:01 +0200 |
| Subject: dmaengine: dmaengine_desc_callback_valid(): Check for |
| `callback_result` |
| |
| From: Lars-Peter Clausen <lars@metafoo.de> |
| |
| [ Upstream commit e7e1e880b114ca640a2f280b0d5d38aed98f98c6 ] |
| |
| Before the `callback_result` callback was introduced drivers coded their |
| invocation to the callback in a similar way to: |
| |
| if (cb->callback) { |
| spin_unlock(&dma->lock); |
| cb->callback(cb->callback_param); |
| spin_lock(&dma->lock); |
| } |
| |
| With the introduction of `callback_result` two helpers where introduced to |
| transparently handle both types of callbacks. And drivers where updated to |
| look like this: |
| |
| if (dmaengine_desc_callback_valid(cb)) { |
| spin_unlock(&dma->lock); |
| dmaengine_desc_callback_invoke(cb, ...); |
| spin_lock(&dma->lock); |
| } |
| |
| dmaengine_desc_callback_invoke() correctly handles both `callback_result` |
| and `callback`. But we forgot to update the dmaengine_desc_callback_valid() |
| function to check for `callback_result`. As a result DMA descriptors that |
| use the `callback_result` rather than `callback` don't have their callback |
| invoked by drivers that follow the pattern above. |
| |
| Fix this by checking for both `callback` and `callback_result` in |
| dmaengine_desc_callback_valid(). |
| |
| Fixes: f067025bc676 ("dmaengine: add support to provide error result from a DMA transation") |
| Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> |
| Acked-by: Dave Jiang <dave.jiang@intel.com> |
| Link: https://lore.kernel.org/r/20211023134101.28042-1-lars@metafoo.de |
| Signed-off-by: Vinod Koul <vkoul@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/dma/dmaengine.h | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/drivers/dma/dmaengine.h b/drivers/dma/dmaengine.h |
| index 501c0b063f852..302f13efd35d9 100644 |
| --- a/drivers/dma/dmaengine.h |
| +++ b/drivers/dma/dmaengine.h |
| @@ -168,7 +168,7 @@ dmaengine_desc_get_callback_invoke(struct dma_async_tx_descriptor *tx, |
| static inline bool |
| dmaengine_desc_callback_valid(struct dmaengine_desc_callback *cb) |
| { |
| - return (cb->callback) ? true : false; |
| + return cb->callback || cb->callback_result; |
| } |
| |
| #endif |
| -- |
| 2.33.0 |
| |