diff options
Diffstat (limited to 'drivers/dma/ioat_dma.c')
| -rw-r--r-- | drivers/dma/ioat_dma.c | 43 | 
1 files changed, 27 insertions, 16 deletions
diff --git a/drivers/dma/ioat_dma.c b/drivers/dma/ioat_dma.c index e4fc33c1c32..1955ee8d6d2 100644 --- a/drivers/dma/ioat_dma.c +++ b/drivers/dma/ioat_dma.c @@ -1063,22 +1063,31 @@ static void ioat_dma_cleanup_tasklet(unsigned long data)  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_DEST_UNMAP)) { +		if (desc->async_tx.flags & DMA_COMPL_DEST_UNMAP_SINGLE) +			pci_unmap_single(ioat_chan->device->pdev, +					 pci_unmap_addr(desc, dst), +					 pci_unmap_len(desc, len), +					 PCI_DMA_FROMDEVICE); +		else +			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); +	if (!(desc->async_tx.flags & DMA_COMPL_SKIP_SRC_UNMAP)) { +		if (desc->async_tx.flags & DMA_COMPL_SRC_UNMAP_SINGLE) +			pci_unmap_single(ioat_chan->device->pdev, +					 pci_unmap_addr(desc, src), +					 pci_unmap_len(desc, len), +					 PCI_DMA_TODEVICE); +		else +			pci_unmap_page(ioat_chan->device->pdev, +				       pci_unmap_addr(desc, src), +				       pci_unmap_len(desc, len), +				       PCI_DMA_TODEVICE); +	}  }  /** @@ -1363,6 +1372,7 @@ static int ioat_dma_self_test(struct ioatdma_device *device)  	int err = 0;  	struct completion cmp;  	unsigned long tmo; +	unsigned long flags;  	src = kzalloc(sizeof(u8) * IOAT_TEST_SIZE, GFP_KERNEL);  	if (!src) @@ -1392,8 +1402,9 @@ static int ioat_dma_self_test(struct ioatdma_device *device)  				 DMA_TO_DEVICE);  	dma_dest = dma_map_single(dma_chan->device->dev, dest, IOAT_TEST_SIZE,  				  DMA_FROM_DEVICE); +	flags = DMA_COMPL_SRC_UNMAP_SINGLE | DMA_COMPL_DEST_UNMAP_SINGLE;  	tx = device->common.device_prep_dma_memcpy(dma_chan, dma_dest, dma_src, -						   IOAT_TEST_SIZE, 0); +						   IOAT_TEST_SIZE, flags);  	if (!tx) {  		dev_err(&device->pdev->dev,  			"Self-test prep failed, disabling\n");  |