diff options
Diffstat (limited to 'drivers/dma/mv_xor.c')
-rw-r--r-- | drivers/dma/mv_xor.c | 58 |
1 files changed, 7 insertions, 51 deletions
diff --git a/drivers/dma/mv_xor.c b/drivers/dma/mv_xor.c index 536dcb8ba5fd..7807f0ef4e20 100644 --- a/drivers/dma/mv_xor.c +++ b/drivers/dma/mv_xor.c | |||
@@ -60,14 +60,6 @@ static u32 mv_desc_get_dest_addr(struct mv_xor_desc_slot *desc) | |||
60 | return hw_desc->phy_dest_addr; | 60 | return hw_desc->phy_dest_addr; |
61 | } | 61 | } |
62 | 62 | ||
63 | static u32 mv_desc_get_src_addr(struct mv_xor_desc_slot *desc, | ||
64 | int src_idx) | ||
65 | { | ||
66 | struct mv_xor_desc *hw_desc = desc->hw_desc; | ||
67 | return hw_desc->phy_src_addr[mv_phy_src_idx(src_idx)]; | ||
68 | } | ||
69 | |||
70 | |||
71 | static void mv_desc_set_byte_count(struct mv_xor_desc_slot *desc, | 63 | static void mv_desc_set_byte_count(struct mv_xor_desc_slot *desc, |
72 | u32 byte_count) | 64 | u32 byte_count) |
73 | { | 65 | { |
@@ -278,42 +270,9 @@ mv_xor_run_tx_complete_actions(struct mv_xor_desc_slot *desc, | |||
278 | desc->async_tx.callback( | 270 | desc->async_tx.callback( |
279 | desc->async_tx.callback_param); | 271 | desc->async_tx.callback_param); |
280 | 272 | ||
281 | /* unmap dma addresses | 273 | dma_descriptor_unmap(&desc->async_tx); |
282 | * (unmap_single vs unmap_page?) | 274 | if (desc->group_head) |
283 | */ | ||
284 | if (desc->group_head && desc->unmap_len) { | ||
285 | struct mv_xor_desc_slot *unmap = desc->group_head; | ||
286 | struct device *dev = mv_chan_to_devp(mv_chan); | ||
287 | u32 len = unmap->unmap_len; | ||
288 | enum dma_ctrl_flags flags = desc->async_tx.flags; | ||
289 | u32 src_cnt; | ||
290 | dma_addr_t addr; | ||
291 | dma_addr_t dest; | ||
292 | |||
293 | src_cnt = unmap->unmap_src_cnt; | ||
294 | dest = mv_desc_get_dest_addr(unmap); | ||
295 | if (!(flags & DMA_COMPL_SKIP_DEST_UNMAP)) { | ||
296 | enum dma_data_direction dir; | ||
297 | |||
298 | if (src_cnt > 1) /* is xor ? */ | ||
299 | dir = DMA_BIDIRECTIONAL; | ||
300 | else | ||
301 | dir = DMA_FROM_DEVICE; | ||
302 | dma_unmap_page(dev, dest, len, dir); | ||
303 | } | ||
304 | |||
305 | if (!(flags & DMA_COMPL_SKIP_SRC_UNMAP)) { | ||
306 | while (src_cnt--) { | ||
307 | addr = mv_desc_get_src_addr(unmap, | ||
308 | src_cnt); | ||
309 | if (addr == dest) | ||
310 | continue; | ||
311 | dma_unmap_page(dev, addr, len, | ||
312 | DMA_TO_DEVICE); | ||
313 | } | ||
314 | } | ||
315 | desc->group_head = NULL; | 275 | desc->group_head = NULL; |
316 | } | ||
317 | } | 276 | } |
318 | 277 | ||
319 | /* run dependent operations */ | 278 | /* run dependent operations */ |
@@ -749,7 +708,7 @@ static enum dma_status mv_xor_status(struct dma_chan *chan, | |||
749 | enum dma_status ret; | 708 | enum dma_status ret; |
750 | 709 | ||
751 | ret = dma_cookie_status(chan, cookie, txstate); | 710 | ret = dma_cookie_status(chan, cookie, txstate); |
752 | if (ret == DMA_SUCCESS) { | 711 | if (ret == DMA_COMPLETE) { |
753 | mv_xor_clean_completed_slots(mv_chan); | 712 | mv_xor_clean_completed_slots(mv_chan); |
754 | return ret; | 713 | return ret; |
755 | } | 714 | } |
@@ -874,7 +833,7 @@ static int mv_xor_memcpy_self_test(struct mv_xor_chan *mv_chan) | |||
874 | msleep(1); | 833 | msleep(1); |
875 | 834 | ||
876 | if (mv_xor_status(dma_chan, cookie, NULL) != | 835 | if (mv_xor_status(dma_chan, cookie, NULL) != |
877 | DMA_SUCCESS) { | 836 | DMA_COMPLETE) { |
878 | dev_err(dma_chan->device->dev, | 837 | dev_err(dma_chan->device->dev, |
879 | "Self-test copy timed out, disabling\n"); | 838 | "Self-test copy timed out, disabling\n"); |
880 | err = -ENODEV; | 839 | err = -ENODEV; |
@@ -968,7 +927,7 @@ mv_xor_xor_self_test(struct mv_xor_chan *mv_chan) | |||
968 | msleep(8); | 927 | msleep(8); |
969 | 928 | ||
970 | if (mv_xor_status(dma_chan, cookie, NULL) != | 929 | if (mv_xor_status(dma_chan, cookie, NULL) != |
971 | DMA_SUCCESS) { | 930 | DMA_COMPLETE) { |
972 | dev_err(dma_chan->device->dev, | 931 | dev_err(dma_chan->device->dev, |
973 | "Self-test xor timed out, disabling\n"); | 932 | "Self-test xor timed out, disabling\n"); |
974 | err = -ENODEV; | 933 | err = -ENODEV; |
@@ -1076,10 +1035,7 @@ mv_xor_channel_add(struct mv_xor_device *xordev, | |||
1076 | } | 1035 | } |
1077 | 1036 | ||
1078 | mv_chan->mmr_base = xordev->xor_base; | 1037 | mv_chan->mmr_base = xordev->xor_base; |
1079 | if (!mv_chan->mmr_base) { | 1038 | mv_chan->mmr_high_base = xordev->xor_high_base; |
1080 | ret = -ENOMEM; | ||
1081 | goto err_free_dma; | ||
1082 | } | ||
1083 | tasklet_init(&mv_chan->irq_tasklet, mv_xor_tasklet, (unsigned long) | 1039 | tasklet_init(&mv_chan->irq_tasklet, mv_xor_tasklet, (unsigned long) |
1084 | mv_chan); | 1040 | mv_chan); |
1085 | 1041 | ||
@@ -1138,7 +1094,7 @@ static void | |||
1138 | mv_xor_conf_mbus_windows(struct mv_xor_device *xordev, | 1094 | mv_xor_conf_mbus_windows(struct mv_xor_device *xordev, |
1139 | const struct mbus_dram_target_info *dram) | 1095 | const struct mbus_dram_target_info *dram) |
1140 | { | 1096 | { |
1141 | void __iomem *base = xordev->xor_base; | 1097 | void __iomem *base = xordev->xor_high_base; |
1142 | u32 win_enable = 0; | 1098 | u32 win_enable = 0; |
1143 | int i; | 1099 | int i; |
1144 | 1100 | ||