aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/dma/ioat_dma.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/dma/ioat_dma.c')
-rw-r--r--drivers/dma/ioat_dma.c48
1 files changed, 23 insertions, 25 deletions
diff --git a/drivers/dma/ioat_dma.c b/drivers/dma/ioat_dma.c
index 90e5b0a28cbf..171cad69f318 100644
--- a/drivers/dma/ioat_dma.c
+++ b/drivers/dma/ioat_dma.c
@@ -757,6 +757,27 @@ static void ioat_dma_cleanup_tasklet(unsigned long data)
757 chan->reg_base + IOAT_CHANCTRL_OFFSET); 757 chan->reg_base + IOAT_CHANCTRL_OFFSET);
758} 758}
759 759
760static void
761ioat_dma_unmap(struct ioat_dma_chan *ioat_chan, struct ioat_desc_sw *desc)
762{
763 /*
764 * yes we are unmapping both _page and _single
765 * alloc'd regions with unmap_page. Is this
766 * *really* that bad?
767 */
768 if (!(desc->async_tx.flags & DMA_COMPL_SKIP_DEST_UNMAP))
769 pci_unmap_page(ioat_chan->device->pdev,
770 pci_unmap_addr(desc, dst),
771 pci_unmap_len(desc, len),
772 PCI_DMA_FROMDEVICE);
773
774 if (!(desc->async_tx.flags & DMA_COMPL_SKIP_SRC_UNMAP))
775 pci_unmap_page(ioat_chan->device->pdev,
776 pci_unmap_addr(desc, src),
777 pci_unmap_len(desc, len),
778 PCI_DMA_TODEVICE);
779}
780
760/** 781/**
761 * ioat_dma_memcpy_cleanup - cleanup up finished descriptors 782 * ioat_dma_memcpy_cleanup - cleanup up finished descriptors
762 * @chan: ioat channel to be cleaned up 783 * @chan: ioat channel to be cleaned up
@@ -817,21 +838,7 @@ static void ioat_dma_memcpy_cleanup(struct ioat_dma_chan *ioat_chan)
817 */ 838 */
818 if (desc->async_tx.cookie) { 839 if (desc->async_tx.cookie) {
819 cookie = desc->async_tx.cookie; 840 cookie = desc->async_tx.cookie;
820 841 ioat_dma_unmap(ioat_chan, desc);
821 /*
822 * yes we are unmapping both _page and _single
823 * alloc'd regions with unmap_page. Is this
824 * *really* that bad?
825 */
826 pci_unmap_page(ioat_chan->device->pdev,
827 pci_unmap_addr(desc, dst),
828 pci_unmap_len(desc, len),
829 PCI_DMA_FROMDEVICE);
830 pci_unmap_page(ioat_chan->device->pdev,
831 pci_unmap_addr(desc, src),
832 pci_unmap_len(desc, len),
833 PCI_DMA_TODEVICE);
834
835 if (desc->async_tx.callback) { 842 if (desc->async_tx.callback) {
836 desc->async_tx.callback(desc->async_tx.callback_param); 843 desc->async_tx.callback(desc->async_tx.callback_param);
837 desc->async_tx.callback = NULL; 844 desc->async_tx.callback = NULL;
@@ -890,16 +897,7 @@ static void ioat_dma_memcpy_cleanup(struct ioat_dma_chan *ioat_chan)
890 if (desc->async_tx.cookie) { 897 if (desc->async_tx.cookie) {
891 cookie = desc->async_tx.cookie; 898 cookie = desc->async_tx.cookie;
892 desc->async_tx.cookie = 0; 899 desc->async_tx.cookie = 0;
893 900 ioat_dma_unmap(ioat_chan, desc);
894 pci_unmap_page(ioat_chan->device->pdev,
895 pci_unmap_addr(desc, dst),
896 pci_unmap_len(desc, len),
897 PCI_DMA_FROMDEVICE);
898 pci_unmap_page(ioat_chan->device->pdev,
899 pci_unmap_addr(desc, src),
900 pci_unmap_len(desc, len),
901 PCI_DMA_TODEVICE);
902
903 if (desc->async_tx.callback) { 901 if (desc->async_tx.callback) {
904 desc->async_tx.callback(desc->async_tx.callback_param); 902 desc->async_tx.callback(desc->async_tx.callback_param);
905 desc->async_tx.callback = NULL; 903 desc->async_tx.callback = NULL;