diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2015-06-19 10:07:07 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2015-06-19 10:07:07 -0400 |
commit | c0b59fafe31bf91f589736be304d739b13952fdd (patch) | |
tree | 0088a41c6b68132739294643be06734e3af67677 /crypto | |
parent | 28bceeaaf81140d69647acd0eb7dc9312f27844a (diff) | |
parent | bfa1ce5f38938cc9e6c7f2d1011f88eba2b9e2b2 (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.c | 19 |
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)) { |