mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-21 14:37:57 +00:00
189edfef1a
When the original mac addresses are not valid assign the first one to the internal wifi core, this matches the manufacture mac address in most cases. In addition refresh the patches. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> SVN-Revision: 41545
89 lines
2.7 KiB
Diff
89 lines
2.7 KiB
Diff
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);
|
|
}
|
|
|
|
|