summaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2015-06-19 10:07:07 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2015-06-19 10:07:07 -0400
commitc0b59fafe31bf91f589736be304d739b13952fdd (patch)
tree0088a41c6b68132739294643be06734e3af67677 /crypto
parent28bceeaaf81140d69647acd0eb7dc9312f27844a (diff)
parentbfa1ce5f38938cc9e6c7f2d1011f88eba2b9e2b2 (diff)
Merge branch 'mvebu/drivers' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
Merge the mvebu/drivers branch of the arm-soc tree which contains just a single patch bfa1ce5f38938cc9e6c7f2d1011f88eba2b9e2b2 ("bus: mvebu-mbus: add mv_mbus_dram_info_nooverlap()") that happens to be a prerequisite of the new marvell/cesa crypto driver.
Diffstat (limited to 'crypto')
-rw-r--r--crypto/async_tx/async_pq.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/crypto/async_tx/async_pq.c b/crypto/async_tx/async_pq.c
index d05327caf69d..5d355e0c2633 100644
--- a/crypto/async_tx/async_pq.c
+++ b/crypto/async_tx/async_pq.c
@@ -124,6 +124,7 @@ do_sync_gen_syndrome(struct page **blocks, unsigned int offset, int disks,
124{ 124{
125 void **srcs; 125 void **srcs;
126 int i; 126 int i;
127 int start = -1, stop = disks - 3;
127 128
128 if (submit->scribble) 129 if (submit->scribble)
129 srcs = submit->scribble; 130 srcs = submit->scribble;
@@ -134,10 +135,21 @@ do_sync_gen_syndrome(struct page **blocks, unsigned int offset, int disks,
134 if (blocks[i] == NULL) { 135 if (blocks[i] == NULL) {
135 BUG_ON(i > disks - 3); /* P or Q can't be zero */ 136 BUG_ON(i > disks - 3); /* P or Q can't be zero */
136 srcs[i] = (void*)raid6_empty_zero_page; 137 srcs[i] = (void*)raid6_empty_zero_page;
137 } else 138 } else {
138 srcs[i] = page_address(blocks[i]) + offset; 139 srcs[i] = page_address(blocks[i]) + offset;
140 if (i < disks - 2) {
141 stop = i;
142 if (start == -1)
143 start = i;
144 }
145 }
139 } 146 }
140 raid6_call.gen_syndrome(disks, len, srcs); 147 if (submit->flags & ASYNC_TX_PQ_XOR_DST) {
148 BUG_ON(!raid6_call.xor_syndrome);
149 if (start >= 0)
150 raid6_call.xor_syndrome(disks, start, stop, len, srcs);
151 } else
152 raid6_call.gen_syndrome(disks, len, srcs);
141 async_tx_sync_epilog(submit); 153 async_tx_sync_epilog(submit);
142} 154}
143 155
@@ -178,7 +190,8 @@ async_gen_syndrome(struct page **blocks, unsigned int offset, int disks,
178 if (device) 190 if (device)
179 unmap = dmaengine_get_unmap_data(device->dev, disks, GFP_NOIO); 191 unmap = dmaengine_get_unmap_data(device->dev, disks, GFP_NOIO);
180 192
181 if (unmap && 193 /* XORing P/Q is only implemented in software */
194 if (unmap && !(submit->flags & ASYNC_TX_PQ_XOR_DST) &&
182 (src_cnt <= dma_maxpq(device, 0) || 195 (src_cnt <= dma_maxpq(device, 0) ||
183 dma_maxpq(device, DMA_PREP_CONTINUE) > 0) && 196 dma_maxpq(device, DMA_PREP_CONTINUE) > 0) &&
184 is_dma_pq_aligned(device, offset, 0, len)) { 197 is_dma_pq_aligned(device, offset, 0, len)) {