diff options
Diffstat (limited to 'crypto/async_tx/async_tx.c')
-rw-r--r-- | crypto/async_tx/async_tx.c | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/crypto/async_tx/async_tx.c b/crypto/async_tx/async_tx.c index 9325c61208a0..78a61e7f631a 100644 --- a/crypto/async_tx/async_tx.c +++ b/crypto/async_tx/async_tx.c | |||
@@ -607,15 +607,7 @@ async_trigger_callback(enum async_tx_flags flags, | |||
607 | pr_debug("%s: (sync)\n", __func__); | 607 | pr_debug("%s: (sync)\n", __func__); |
608 | 608 | ||
609 | /* wait for any prerequisite operations */ | 609 | /* wait for any prerequisite operations */ |
610 | if (depend_tx) { | 610 | async_tx_quiesce(&depend_tx); |
611 | /* if ack is already set then we cannot be sure | ||
612 | * we are referring to the correct operation | ||
613 | */ | ||
614 | BUG_ON(async_tx_test_ack(depend_tx)); | ||
615 | if (dma_wait_for_async_tx(depend_tx) == DMA_ERROR) | ||
616 | panic("%s: DMA_ERROR waiting for depend_tx\n", | ||
617 | __func__); | ||
618 | } | ||
619 | 611 | ||
620 | async_tx_sync_epilog(flags, depend_tx, cb_fn, cb_param); | 612 | async_tx_sync_epilog(flags, depend_tx, cb_fn, cb_param); |
621 | } | 613 | } |
@@ -624,6 +616,25 @@ async_trigger_callback(enum async_tx_flags flags, | |||
624 | } | 616 | } |
625 | EXPORT_SYMBOL_GPL(async_trigger_callback); | 617 | EXPORT_SYMBOL_GPL(async_trigger_callback); |
626 | 618 | ||
619 | /** | ||
620 | * async_tx_quiesce - ensure tx is complete and freeable upon return | ||
621 | * @tx - transaction to quiesce | ||
622 | */ | ||
623 | void async_tx_quiesce(struct dma_async_tx_descriptor **tx) | ||
624 | { | ||
625 | if (*tx) { | ||
626 | /* if ack is already set then we cannot be sure | ||
627 | * we are referring to the correct operation | ||
628 | */ | ||
629 | BUG_ON(async_tx_test_ack(*tx)); | ||
630 | if (dma_wait_for_async_tx(*tx) == DMA_ERROR) | ||
631 | panic("DMA_ERROR waiting for transaction\n"); | ||
632 | async_tx_ack(*tx); | ||
633 | *tx = NULL; | ||
634 | } | ||
635 | } | ||
636 | EXPORT_SYMBOL_GPL(async_tx_quiesce); | ||
637 | |||
627 | module_init(async_tx_init); | 638 | module_init(async_tx_init); |
628 | module_exit(async_tx_exit); | 639 | module_exit(async_tx_exit); |
629 | 640 | ||