On Thu, Jul 14, 2016 at 03:00:09PM -0700, Dave Jiang wrote: > Adding a new callback that will provide the error result for a transaction. > The result is allocated on the stack and the callback should create a copy > if it wishes to retain the information after exiting. > > Signed-off-by: Dave Jiang <dave.jiang@xxxxxxxxx> > --- > include/linux/dmaengine.h | 35 ++++++++++++++++++++++++++++++++--- > 1 file changed, 32 insertions(+), 3 deletions(-) > > diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h > index b601f23..ab8c498 100644 > --- a/include/linux/dmaengine.h > +++ b/include/linux/dmaengine.h > @@ -441,6 +441,21 @@ typedef bool (*dma_filter_fn)(struct dma_chan *chan, void *filter_param); > > typedef void (*dma_async_tx_callback)(void *dma_async_param); > > +enum dma_trans_result { dmaengine_tx_result? > + DMA_TRANS_NOERROR = 0, > + DMA_TRANS_READ_FAILED, > + DMA_TRANS_WRITE_FAILED, > + DMA_TRANS_ABORTED, > +}; > + > +struct dmaengine_result { > + enum dma_trans_result result; > + u32 residue; > +}; > + > +typedef void (*dma_async_tx_callback_result)(void *dma_async_param, > + struct dmaengine_result *result); > + > struct dmaengine_unmap_data { > u8 map_cnt; > u8 to_cnt; > @@ -478,6 +493,7 @@ struct dma_async_tx_descriptor { > dma_cookie_t (*tx_submit)(struct dma_async_tx_descriptor *tx); > int (*desc_free)(struct dma_async_tx_descriptor *tx); > dma_async_tx_callback callback; > + dma_async_tx_callback_result callback_result; > void *callback_param; > struct dmaengine_unmap_data *unmap; > #ifdef CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH > @@ -1374,6 +1390,7 @@ static inline int dmaengine_desc_free(struct dma_async_tx_descriptor *desc) > > struct dma_desc_callback { > dma_async_tx_callback callback; > + dma_async_tx_callback_result callback_result; > void *callback_param; > }; > > @@ -1382,14 +1399,26 @@ dmaengine_desc_get_callback(struct dma_async_tx_descriptor *tx, > struct dma_desc_callback *cb) > { > cb->callback = tx->callback; > + cb->callback_result = tx->callback_result; > cb->callback_param = tx->callback_param; > } > > static inline void > -dmaengine_desc_callback_invoke(struct dma_desc_callback *cb, void *result) > -{ > - if (cb->callback) > +dmaengine_desc_callback_invoke(struct dma_desc_callback *cb, > + struct dmaengine_result *result) > +{ > + struct dmaengine_result dummy_result = { > + .result = DMA_TRANS_NOERROR, > + .residue = 0 > + }; > + > + if (cb->callback_result) { > + if (!result) > + result = &dummy_result; > + cb->callback_result(cb->callback_param, result); > + } else if (cb->callback) { > cb->callback(cb->callback_param); > + } > } > > /* --- DMA device --- */ > -- ~Vinod -- To unsubscribe from this list: send the line "unsubscribe dmaengine" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html