Merge branch 'upstream-jeff' of git://git.kernel.org/pub/scm/linux/kernel/git/romieu...
[linux-2.6-microblaze.git] / crypto / async_tx / async_xor.c
index 12cba1a..3a0dddc 100644 (file)
@@ -45,8 +45,9 @@ do_async_xor(struct dma_device *device,
        dma_addr_t *dma_src = (dma_addr_t *) src_list;
        struct dma_async_tx_descriptor *tx;
        int i;
+       unsigned long dma_prep_flags = cb_fn ? DMA_PREP_INTERRUPT : 0;
 
-       pr_debug("%s: len: %zu\n", __FUNCTION__, len);
+       pr_debug("%s: len: %zu\n", __func__, len);
 
        dma_dest = dma_map_page(device->dev, dest, offset, len,
                                DMA_FROM_DEVICE);
@@ -60,7 +61,7 @@ do_async_xor(struct dma_device *device,
         * in case they can not provide a descriptor
         */
        tx = device->device_prep_dma_xor(chan, dma_dest, dma_src, src_cnt, len,
-                                        cb_fn != NULL);
+                                        dma_prep_flags);
        if (!tx) {
                if (depend_tx)
                        dma_wait_for_async_tx(depend_tx);
@@ -68,7 +69,7 @@ do_async_xor(struct dma_device *device,
                while (!tx)
                        tx = device->device_prep_dma_xor(chan, dma_dest,
                                                         dma_src, src_cnt, len,
-                                                        cb_fn != NULL);
+                                                        dma_prep_flags);
        }
 
        async_tx_submit(chan, tx, flags, depend_tx, cb_fn, cb_param);
@@ -85,7 +86,7 @@ do_sync_xor(struct page *dest, struct page **src_list, unsigned int offset,
        void *_dest;
        int i;
 
-       pr_debug("%s: len: %zu\n", __FUNCTION__, len);
+       pr_debug("%s: len: %zu\n", __func__, len);
 
        /* reuse the 'src_list' array to convert to buffer pointers */
        for (i = 0; i < src_cnt; i++)
@@ -128,7 +129,9 @@ async_xor(struct page *dest, struct page **src_list, unsigned int offset,
        struct dma_async_tx_descriptor *depend_tx,
        dma_async_tx_callback cb_fn, void *cb_param)
 {
-       struct dma_chan *chan = async_tx_find_channel(depend_tx, DMA_XOR);
+       struct dma_chan *chan = async_tx_find_channel(depend_tx, DMA_XOR,
+                                                     &dest, 1, src_list,
+                                                     src_cnt, len);
        struct dma_device *device = chan ? chan->device : NULL;
        struct dma_async_tx_descriptor *tx = NULL;
        dma_async_tx_callback _cb_fn;
@@ -188,12 +191,12 @@ async_xor(struct page *dest, struct page **src_list, unsigned int offset,
                                /* if ack is already set then we cannot be sure
                                 * we are referring to the correct operation
                                 */
-                               BUG_ON(depend_tx->ack);
+                               BUG_ON(async_tx_test_ack(depend_tx));
                                if (dma_wait_for_async_tx(depend_tx) ==
                                        DMA_ERROR)
                                        panic("%s: DMA_ERROR waiting for "
                                                "depend_tx\n",
-                                               __FUNCTION__);
+                                               __func__);
                        }
 
                        do_sync_xor(dest, &src_list[src_off], offset,
@@ -260,17 +263,20 @@ async_xor_zero_sum(struct page *dest, struct page **src_list,
        struct dma_async_tx_descriptor *depend_tx,
        dma_async_tx_callback cb_fn, void *cb_param)
 {
-       struct dma_chan *chan = async_tx_find_channel(depend_tx, DMA_ZERO_SUM);
+       struct dma_chan *chan = async_tx_find_channel(depend_tx, DMA_ZERO_SUM,
+                                                     &dest, 1, src_list,
+                                                     src_cnt, len);
        struct dma_device *device = chan ? chan->device : NULL;
        struct dma_async_tx_descriptor *tx = NULL;
 
        BUG_ON(src_cnt <= 1);
 
-       if (device) {
+       if (device && src_cnt <= device->max_xor) {
                dma_addr_t *dma_src = (dma_addr_t *) src_list;
+               unsigned long dma_prep_flags = cb_fn ? DMA_PREP_INTERRUPT : 0;
                int i;
 
-               pr_debug("%s: (async) len: %zu\n", __FUNCTION__, len);
+               pr_debug("%s: (async) len: %zu\n", __func__, len);
 
                for (i = 0; i < src_cnt; i++)
                        dma_src[i] = dma_map_page(device->dev, src_list[i],
@@ -278,7 +284,7 @@ async_xor_zero_sum(struct page *dest, struct page **src_list,
 
                tx = device->device_prep_dma_zero_sum(chan, dma_src, src_cnt,
                                                      len, result,
-                                                     cb_fn != NULL);
+                                                     dma_prep_flags);
                if (!tx) {
                        if (depend_tx)
                                dma_wait_for_async_tx(depend_tx);
@@ -286,14 +292,14 @@ async_xor_zero_sum(struct page *dest, struct page **src_list,
                        while (!tx)
                                tx = device->device_prep_dma_zero_sum(chan,
                                        dma_src, src_cnt, len, result,
-                                       cb_fn != NULL);
+                                       dma_prep_flags);
                }
 
                async_tx_submit(chan, tx, flags, depend_tx, cb_fn, cb_param);
        } else {
                unsigned long xor_flags = flags;
 
-               pr_debug("%s: (sync) len: %zu\n", __FUNCTION__, len);
+               pr_debug("%s: (sync) len: %zu\n", __func__, len);
 
                xor_flags |= ASYNC_TX_XOR_DROP_DST;
                xor_flags &= ~ASYNC_TX_ACK;
@@ -304,7 +310,7 @@ async_xor_zero_sum(struct page *dest, struct page **src_list,
                if (tx) {
                        if (dma_wait_for_async_tx(tx) == DMA_ERROR)
                                panic("%s: DMA_ERROR waiting for tx\n",
-                                       __FUNCTION__);
+                                       __func__);
                        async_tx_ack(tx);
                }