diff options
| author | Paul Mackerras <paulus@samba.org> | 2008-03-26 08:44:18 +1100 | 
|---|---|---|
| committer | Paul Mackerras <paulus@samba.org> | 2008-03-26 08:44:18 +1100 | 
| commit | 54f53f2b94feb72622bec7a8563fc487d9f97720 (patch) | |
| tree | ab0c4e1dcadd25a00fa7a4febf41bc43b864cf73 /lib | |
| parent | f61fb8a52cdf8b9b6a6badde84aefe58cb35d315 (diff) | |
| parent | a4083c9271e0a697278e089f2c0b9a95363ada0a (diff) | |
| download | linux-54f53f2b94feb72622bec7a8563fc487d9f97720.tar.bz2 | |
Merge branch 'linux-2.6'
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/devres.c | 25 | ||||
| -rw-r--r-- | lib/iomap.c | 2 | ||||
| -rw-r--r-- | lib/swiotlb.c | 30 | 
3 files changed, 42 insertions, 15 deletions
diff --git a/lib/devres.c b/lib/devres.c index b1d336ce7f3d..edc27a5d1b73 100644 --- a/lib/devres.c +++ b/lib/devres.c @@ -298,6 +298,31 @@ int pcim_iomap_regions(struct pci_dev *pdev, u16 mask, const char *name)  EXPORT_SYMBOL(pcim_iomap_regions);  /** + * pcim_iomap_regions_request_all - Request all BARs and iomap specified ones + * @pdev: PCI device to map IO resources for + * @mask: Mask of BARs to iomap + * @name: Name used when requesting regions + * + * Request all PCI BARs and iomap regions specified by @mask. + */ +int pcim_iomap_regions_request_all(struct pci_dev *pdev, u16 mask, +				   const char *name) +{ +	int request_mask = ((1 << 6) - 1) & ~mask; +	int rc; + +	rc = pci_request_selected_regions(pdev, request_mask, name); +	if (rc) +		return rc; + +	rc = pcim_iomap_regions(pdev, mask, name); +	if (rc) +		pci_release_selected_regions(pdev, request_mask); +	return rc; +} +EXPORT_SYMBOL(pcim_iomap_regions_request_all); + +/**   * pcim_iounmap_regions - Unmap and release PCI BARs   * @pdev: PCI device to map IO resources for   * @mask: Mask of BARs to unmap and release diff --git a/lib/iomap.c b/lib/iomap.c index db004a9ff509..dd6ca48fe6b0 100644 --- a/lib/iomap.c +++ b/lib/iomap.c @@ -256,7 +256,7 @@ EXPORT_SYMBOL(ioport_unmap);   * */  void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen)  { -	unsigned long start = pci_resource_start(dev, bar); +	resource_size_t start = pci_resource_start(dev, bar);  	unsigned long len = pci_resource_len(dev, bar);  	unsigned long flags = pci_resource_flags(dev, bar); diff --git a/lib/swiotlb.c b/lib/swiotlb.c index 4bb5a11e18a2..025922807e6e 100644 --- a/lib/swiotlb.c +++ b/lib/swiotlb.c @@ -310,7 +310,9 @@ map_single(struct device *hwdev, char *buffer, size_t size, int dir)  	start_dma_addr = virt_to_bus(io_tlb_start) & mask;  	offset_slots = ALIGN(start_dma_addr, 1 << IO_TLB_SHIFT) >> IO_TLB_SHIFT; -	max_slots = ALIGN(mask + 1, 1 << IO_TLB_SHIFT) >> IO_TLB_SHIFT; +	max_slots = mask + 1 +		    ? ALIGN(mask + 1, 1 << IO_TLB_SHIFT) >> IO_TLB_SHIFT +		    : 1UL << (BITS_PER_LONG - IO_TLB_SHIFT);  	/*  	 * For mappings greater than a page, we limit the stride (and @@ -333,16 +335,18 @@ map_single(struct device *hwdev, char *buffer, size_t size, int dir)  		index = ALIGN(io_tlb_index, stride);  		if (index >= io_tlb_nslabs)  			index = 0; - -		while (is_span_boundary(index, nslots, offset_slots, -					max_slots)) { -			index += stride; -			if (index >= io_tlb_nslabs) -				index = 0; -		}  		wrap = index;  		do { +			while (is_span_boundary(index, nslots, offset_slots, +						max_slots)) { +				index += stride; +				if (index >= io_tlb_nslabs) +					index = 0; +				if (index == wrap) +					goto not_found; +			} +  			/*  			 * If we find a slot that indicates we have 'nslots'  			 * number of contiguous buffers, we allocate the @@ -367,14 +371,12 @@ map_single(struct device *hwdev, char *buffer, size_t size, int dir)  				goto found;  			} -			do { -				index += stride; -				if (index >= io_tlb_nslabs) -					index = 0; -			} while (is_span_boundary(index, nslots, offset_slots, -						  max_slots)); +			index += stride; +			if (index >= io_tlb_nslabs) +				index = 0;  		} while (index != wrap); +  not_found:  		spin_unlock_irqrestore(&io_tlb_lock, flags);  		return NULL;  	}  |