@@ -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 dmaengine_tx_result {
+ DMA_TRANS_NOERROR = 0,
+ DMA_TRANS_READ_FAILED,
+ DMA_TRANS_WRITE_FAILED,
+ DMA_TRANS_ABORTED,
+};
+
+struct dmaengine_result {
+ enum dmaengine_tx_result result;
+ u32 residue;
+};
+
+typedef void (*dma_async_tx_callback_result)(void *dma_async_param,
+ const 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 dmaengine_desc_callback {
dma_async_tx_callback callback;
+ dma_async_tx_callback_result callback_result;
void *callback_param;
};
@@ -1382,15 +1399,26 @@ dmaengine_desc_get_callback(struct dma_async_tx_descriptor *tx,
struct dmaengine_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 dmaengine_desc_callback *cb,
- void *result)
-{
- if (cb->callback)
+ 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 --- */
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@intel.com> --- include/linux/dmaengine.h | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe dmaengine" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html