Merge branch 'topic/convert-tasklet' into to-push
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / crypto / async_tx / async_xor.c
index 65974c6d3d7a78dbc40e9437b416d5990e04e9a2..595b78672b36ad90e27cf50ed28126bb43970fb5 100644 (file)
@@ -53,10 +53,17 @@ do_async_xor(struct dma_chan *chan, struct page *dest, struct page **src_list,
        int xor_src_cnt;
        dma_addr_t dma_dest;
 
-       dma_dest = dma_map_page(dma->dev, dest, offset, len, DMA_FROM_DEVICE);
-       for (i = 0; i < src_cnt; i++)
+       /* map the dest bidrectional in case it is re-used as a source */
+       dma_dest = dma_map_page(dma->dev, dest, offset, len, DMA_BIDIRECTIONAL);
+       for (i = 0; i < src_cnt; i++) {
+               /* only map the dest once */
+               if (unlikely(src_list[i] == dest)) {
+                       dma_src[i] = dma_dest;
+                       continue;
+               }
                dma_src[i] = dma_map_page(dma->dev, src_list[i], offset,
                                          len, DMA_TO_DEVICE);
+       }
 
        while (src_cnt) {
                async_flags = flags;
@@ -263,11 +270,12 @@ async_xor_zero_sum(struct page *dest, struct page **src_list,
                if (unlikely(!tx)) {
                        async_tx_quiesce(&depend_tx);
 
-                       while (!tx)
+                       while (!tx) {
                                dma_async_issue_pending(chan);
                                tx = device->device_prep_dma_zero_sum(chan,
                                        dma_src, src_cnt, len, result,
                                        dma_prep_flags);
+                       }
                }
 
                async_tx_submit(chan, tx, flags, depend_tx, cb_fn, cb_param);