diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-12-18 15:05:53 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-12-18 15:05:53 -0500 |
| commit | 59da1f87b276c593b852766c2fdcad62835970f7 (patch) | |
| tree | 3c3ace81c2132aaf13223df10c4491c38a46c976 /drivers/dma/iop-adma.c | |
| parent | 69098bac169d630a777b362470f20451b9446e39 (diff) | |
| parent | a06d568f7c5e40e34ea64881842deb8f4382babf (diff) | |
Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/async_tx
* 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/async_tx:
async_xor: dma_map destination DMA_BIDIRECTIONAL
dmaengine: protect 'id' from concurrent registrations
ioat: wait for self-test completion
Diffstat (limited to 'drivers/dma/iop-adma.c')
| -rw-r--r-- | drivers/dma/iop-adma.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/drivers/dma/iop-adma.c b/drivers/dma/iop-adma.c index c7a9306d951d..6be317262200 100644 --- a/drivers/dma/iop-adma.c +++ b/drivers/dma/iop-adma.c | |||
| @@ -85,18 +85,28 @@ iop_adma_run_tx_complete_actions(struct iop_adma_desc_slot *desc, | |||
| 85 | enum dma_ctrl_flags flags = desc->async_tx.flags; | 85 | enum dma_ctrl_flags flags = desc->async_tx.flags; |
| 86 | u32 src_cnt; | 86 | u32 src_cnt; |
| 87 | dma_addr_t addr; | 87 | dma_addr_t addr; |
| 88 | dma_addr_t dest; | ||
| 88 | 89 | ||
| 90 | src_cnt = unmap->unmap_src_cnt; | ||
| 91 | dest = iop_desc_get_dest_addr(unmap, iop_chan); | ||
| 89 | if (!(flags & DMA_COMPL_SKIP_DEST_UNMAP)) { | 92 | if (!(flags & DMA_COMPL_SKIP_DEST_UNMAP)) { |
| 90 | addr = iop_desc_get_dest_addr(unmap, iop_chan); | 93 | enum dma_data_direction dir; |
| 91 | dma_unmap_page(dev, addr, len, DMA_FROM_DEVICE); | 94 | |
| 95 | if (src_cnt > 1) /* is xor? */ | ||
| 96 | dir = DMA_BIDIRECTIONAL; | ||
| 97 | else | ||
| 98 | dir = DMA_FROM_DEVICE; | ||
| 99 | |||
| 100 | dma_unmap_page(dev, dest, len, dir); | ||
| 92 | } | 101 | } |
| 93 | 102 | ||
| 94 | if (!(flags & DMA_COMPL_SKIP_SRC_UNMAP)) { | 103 | if (!(flags & DMA_COMPL_SKIP_SRC_UNMAP)) { |
| 95 | src_cnt = unmap->unmap_src_cnt; | ||
| 96 | while (src_cnt--) { | 104 | while (src_cnt--) { |
| 97 | addr = iop_desc_get_src_addr(unmap, | 105 | addr = iop_desc_get_src_addr(unmap, |
| 98 | iop_chan, | 106 | iop_chan, |
| 99 | src_cnt); | 107 | src_cnt); |
| 108 | if (addr == dest) | ||
| 109 | continue; | ||
| 100 | dma_unmap_page(dev, addr, len, | 110 | dma_unmap_page(dev, addr, len, |
| 101 | DMA_TO_DEVICE); | 111 | DMA_TO_DEVICE); |
| 102 | } | 112 | } |
