12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- From: George Kashperko <george@znau.edu.ua>
- 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 <george@znau.edu.ua>
- ---
- 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);
- }
-
-
|