diff options
Diffstat (limited to 'drivers/infiniband/hw/qib/qib_user_pages.c')
| -rw-r--r-- | drivers/infiniband/hw/qib/qib_user_pages.c | 20 | 
1 files changed, 12 insertions, 8 deletions
diff --git a/drivers/infiniband/hw/qib/qib_user_pages.c b/drivers/infiniband/hw/qib/qib_user_pages.c index ce83ba9a12ef..16543d5e80c3 100644 --- a/drivers/infiniband/hw/qib/qib_user_pages.c +++ b/drivers/infiniband/hw/qib/qib_user_pages.c @@ -99,23 +99,27 @@ bail:   *   * I'm sure we won't be so lucky with other iommu's, so FIXME.   */ -dma_addr_t qib_map_page(struct pci_dev *hwdev, struct page *page, -			unsigned long offset, size_t size, int direction) +int qib_map_page(struct pci_dev *hwdev, struct page *page, dma_addr_t *daddr)  {  	dma_addr_t phys; -	phys = pci_map_page(hwdev, page, offset, size, direction); +	phys = pci_map_page(hwdev, page, 0, PAGE_SIZE, PCI_DMA_FROMDEVICE); +	if (pci_dma_mapping_error(hwdev, phys)) +		return -ENOMEM; -	if (phys == 0) { -		pci_unmap_page(hwdev, phys, size, direction); -		phys = pci_map_page(hwdev, page, offset, size, direction); +	if (!phys) { +		pci_unmap_page(hwdev, phys, PAGE_SIZE, PCI_DMA_FROMDEVICE); +		phys = pci_map_page(hwdev, page, 0, PAGE_SIZE, +				    PCI_DMA_FROMDEVICE); +		if (pci_dma_mapping_error(hwdev, phys)) +			return -ENOMEM;  		/*  		 * FIXME: If we get 0 again, we should keep this page,  		 * map another, then free the 0 page.  		 */  	} - -	return phys; +	*daddr = phys; +	return 0;  }  /**  | 
