|
@@ -757,6 +757,27 @@ static void ioat_dma_cleanup_tasklet(unsigned long data)
|
|
|
chan->reg_base + IOAT_CHANCTRL_OFFSET);
|
|
|
}
|
|
|
|
|
|
+static void
|
|
|
+ioat_dma_unmap(struct ioat_dma_chan *ioat_chan, struct ioat_desc_sw *desc)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * yes we are unmapping both _page and _single
|
|
|
+ * alloc'd regions with unmap_page. Is this
|
|
|
+ * *really* that bad?
|
|
|
+ */
|
|
|
+ if (!(desc->async_tx.flags & DMA_COMPL_SKIP_DEST_UNMAP))
|
|
|
+ pci_unmap_page(ioat_chan->device->pdev,
|
|
|
+ pci_unmap_addr(desc, dst),
|
|
|
+ pci_unmap_len(desc, len),
|
|
|
+ PCI_DMA_FROMDEVICE);
|
|
|
+
|
|
|
+ if (!(desc->async_tx.flags & DMA_COMPL_SKIP_SRC_UNMAP))
|
|
|
+ pci_unmap_page(ioat_chan->device->pdev,
|
|
|
+ pci_unmap_addr(desc, src),
|
|
|
+ pci_unmap_len(desc, len),
|
|
|
+ PCI_DMA_TODEVICE);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* ioat_dma_memcpy_cleanup - cleanup up finished descriptors
|
|
|
* @chan: ioat channel to be cleaned up
|
|
@@ -817,21 +838,7 @@ static void ioat_dma_memcpy_cleanup(struct ioat_dma_chan *ioat_chan)
|
|
|
*/
|
|
|
if (desc->async_tx.cookie) {
|
|
|
cookie = desc->async_tx.cookie;
|
|
|
-
|
|
|
- /*
|
|
|
- * yes we are unmapping both _page and _single
|
|
|
- * alloc'd regions with unmap_page. Is this
|
|
|
- * *really* that bad?
|
|
|
- */
|
|
|
- pci_unmap_page(ioat_chan->device->pdev,
|
|
|
- pci_unmap_addr(desc, dst),
|
|
|
- pci_unmap_len(desc, len),
|
|
|
- PCI_DMA_FROMDEVICE);
|
|
|
- pci_unmap_page(ioat_chan->device->pdev,
|
|
|
- pci_unmap_addr(desc, src),
|
|
|
- pci_unmap_len(desc, len),
|
|
|
- PCI_DMA_TODEVICE);
|
|
|
-
|
|
|
+ ioat_dma_unmap(ioat_chan, desc);
|
|
|
if (desc->async_tx.callback) {
|
|
|
desc->async_tx.callback(desc->async_tx.callback_param);
|
|
|
desc->async_tx.callback = NULL;
|
|
@@ -890,16 +897,7 @@ static void ioat_dma_memcpy_cleanup(struct ioat_dma_chan *ioat_chan)
|
|
|
if (desc->async_tx.cookie) {
|
|
|
cookie = desc->async_tx.cookie;
|
|
|
desc->async_tx.cookie = 0;
|
|
|
-
|
|
|
- pci_unmap_page(ioat_chan->device->pdev,
|
|
|
- pci_unmap_addr(desc, dst),
|
|
|
- pci_unmap_len(desc, len),
|
|
|
- PCI_DMA_FROMDEVICE);
|
|
|
- pci_unmap_page(ioat_chan->device->pdev,
|
|
|
- pci_unmap_addr(desc, src),
|
|
|
- pci_unmap_len(desc, len),
|
|
|
- PCI_DMA_TODEVICE);
|
|
|
-
|
|
|
+ ioat_dma_unmap(ioat_chan, desc);
|
|
|
if (desc->async_tx.callback) {
|
|
|
desc->async_tx.callback(desc->async_tx.callback_param);
|
|
|
desc->async_tx.callback = NULL;
|