| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 | 
							- From: George Kashperko <[email protected]>
 
- broadcom-wl driver bound to ssb device with ssb driver probe
 
- have osh handle struct pdev pointer value initialized with
 
- ssb_device pointer. Later on pdev is used with legacy pci
 
- dma api as pci_dev thus causing oops sometimes.
 
- The patch replaces legacy pci dma api and pass relevant
 
- device struct pointer to avoid crashes.
 
- Signed-off-by: George Kashperko <[email protected]>
 
- ---
 
-  driver/linux_osl.c |   28 +++++++++++++++++++++++-----
 
-  1 file changed, 23 insertions(+), 5 deletions(-)
 
- --- a/driver/linux_osl.c
 
- +++ b/driver/linux_osl.c
 
- @@ -25,6 +25,9 @@
 
-  #include <asm/paccess.h>
 
-  #endif /* mips */
 
-  #include <pcicfg.h>
 
- +#ifdef CONFIG_SSB
 
- +#include <linux/ssb/ssb.h>
 
- +#endif
 
-  
 
-  #define PCI_CFG_RETRY 		10
 
-  
 
- @@ -364,12 +367,27 @@ osl_dma_consistent_align(void)
 
-  	return (PAGE_SIZE);
 
-  }
 
-  
 
- +static struct device *
 
- +osl_get_dmadev(osl_t *osh)
 
- +{
 
- +#ifdef CONFIG_SSB
 
- +	if (osh->bustype == SI_BUS) {
 
- +		/* This can be SiliconBackplane emulated as pci with Broadcom or
 
- +		 * ssb device. Less harmful is to check for pci_bus_type and if
 
- +		 * no match then assume we got ssb */
 
- +		if (((struct pci_dev *)osh->pdev)->dev.bus != &pci_bus_type)
 
- +			return ((struct ssb_device *)osh->pdev)->dma_dev;
 
- +	}
 
- +#endif
 
- +	return &((struct pci_dev *)osh->pdev)->dev;
 
- +}
 
- +
 
-  void*
 
-  osl_dma_alloc_consistent(osl_t *osh, uint size, ulong *pap)
 
-  {
 
-  	ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC)));
 
-  
 
- -	return (pci_alloc_consistent(osh->pdev, size, (dma_addr_t*)pap));
 
- +	return (dma_alloc_coherent(osl_get_dmadev(osh), size, (dma_addr_t*)pap, GFP_ATOMIC));
 
-  }
 
-  
 
-  void
 
- @@ -377,7 +395,7 @@ osl_dma_free_consistent(osl_t *osh, void
 
-  {
 
-  	ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC)));
 
-  
 
- -	pci_free_consistent(osh->pdev, size, va, (dma_addr_t)pa);
 
- +	dma_free_coherent(osl_get_dmadev(osh), size, va, (dma_addr_t)pa);
 
-  }
 
-  
 
-  uint BCMFASTPATH
 
- @@ -386,13 +404,13 @@ osl_dma_map(osl_t *osh, void *va, uint s
 
-  	ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC)));
 
-  
 
-  	if (direction == DMA_TX)
 
- -		return (pci_map_single(osh->pdev, va, size, PCI_DMA_TODEVICE));
 
- +		return (dma_map_single(osl_get_dmadev(osh), va, size, PCI_DMA_TODEVICE));
 
-  	else {
 
-  #ifdef mips
 
-  		dma_cache_inv((uint)va, size);
 
-  		return (virt_to_phys(va));
 
-  #else /* mips */
 
- -		return (pci_map_single(osh->pdev, va, size, PCI_DMA_FROMDEVICE));
 
- +		return (dma_map_single(osl_get_dmadev(osh), va, size, PCI_DMA_FROMDEVICE));
 
-  #endif /* mips */
 
-  	}
 
-  }
 
- @@ -404,7 +422,7 @@ osl_dma_unmap(osl_t *osh, uint pa, uint
 
-  
 
-  	ASSERT((osh && (osh->magic == OS_HANDLE_MAGIC)));
 
-  	dir = (direction == DMA_TX)? PCI_DMA_TODEVICE: PCI_DMA_FROMDEVICE;
 
- -	pci_unmap_single(osh->pdev, (uint32)pa, size, dir);
 
- +	dma_unmap_single(osl_get_dmadev(osh), (uint32)pa, size, dir);
 
-  }
 
-  
 
-  
 
 
  |