--- a/driver/wl_linux.c +++ b/driver/wl_linux.c @@ -85,10 +85,9 @@ typedef void wlc_hw_info_t; #include #endif /* BCMJTAG */ - -#ifdef CONFIG_SSB -#include -#endif +#if defined(CONFIG_SSB) || defined(CONFIG_BCMA) +#include +#endif /* defined(CONFIG_SSB) || defined(CONFIG_BCMA) */ /* Linux wireless extension support */ #ifdef CONFIG_WIRELESS_EXT @@ -997,62 +996,32 @@ static struct pci_driver wl_pci_driver = #endif /* CONFIG_PCI */ #endif +#ifdef BCMJTAG +static bcmjtag_driver_t wl_jtag_driver = { + wl_jtag_probe, + wl_jtag_detach, + wl_jtag_poll, + }; +#endif /* BCMJTAG */ -static int wl_ssb_probe(struct ssb_device *dev, const struct ssb_device_id *id) +#if defined(CONFIG_SSB) || defined(CONFIG_BCMA) +static void * glue_attach_cb(u16 vendor, u16 device, + ulong mmio, void *dev, u32 irq) { - wl_info_t *wl; - void *mmio; - - if (dev->bus->bustype != SSB_BUSTYPE_SSB) { - printk("Attaching to SSB behind PCI is not supported. Please remove the b43 ssb bridge\n"); - return -EINVAL; - } - - mmio = (void *) 0x18000000 + dev->core_index * 0x1000; - wl = wl_attach(id->vendor, id->coreid, (ulong) mmio, SI_BUS, dev, dev->irq); - if (!wl) { - printk("wl_attach failed\n"); - return -ENODEV; - } - - ssb_set_drvdata(dev, wl); - - return 0; + return wl_attach(vendor, device, mmio, SI_BUS, dev, irq); } -static void wl_ssb_remove(struct ssb_device *dev) +static void glue_remove_cb(void *wldev) { - wl_info_t *wl = (wl_info_t *) ssb_get_drvdata(dev); + wl_info_t *wl = (wl_info_t *)wldev; WL_LOCK(wl); WL_APSTA_UPDN(("wl%d (%s): wl_remove() -> wl_down()\n", wl->pub->unit, wl->dev->name)); wl_down(wl); WL_UNLOCK(wl); wl_free(wl); - ssb_set_drvdata(dev, NULL); } - -static const struct ssb_device_id wl_ssb_tbl[] = { - SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, SSB_ANY_REV), - SSB_DEVTABLE_END -}; - -#ifdef CONFIG_SSB -static struct ssb_driver wl_ssb_driver = { - .name = KBUILD_MODNAME, - .id_table = wl_ssb_tbl, - .probe = wl_ssb_probe, - .remove = wl_ssb_remove, -}; -#endif - -#ifdef BCMJTAG -static bcmjtag_driver_t wl_jtag_driver = { - wl_jtag_probe, - wl_jtag_detach, - wl_jtag_poll, - }; -#endif /* BCMJTAG */ +#endif/* defined(CONFIG_SSB) || defined(CONFIG_BCMA) */ /** @@ -1067,11 +1036,13 @@ wl_module_init(void) { int error = -ENODEV; -#ifdef CONFIG_SSB - error = ssb_driver_register(&wl_ssb_driver); +#if defined(CONFIG_SSB) || defined(CONFIG_BCMA) + wl_glue_set_attach_callback(&glue_attach_cb); + wl_glue_set_remove_callback(&glue_remove_cb); + error = wl_glue_register(); if (error) return error; -#endif /* CONFIG_SSB */ +#endif /* defined(CONFIG_SSB) || defined(CONFIG_BCMA) */ #ifdef CONFIG_PCI error = pci_register_driver(&wl_pci_driver); @@ -1082,7 +1053,9 @@ wl_module_init(void) return 0; error_pci: - ssb_driver_unregister(&wl_ssb_driver); +#if defined(CONFIG_SSB) || defined(CONFIG_BCMA) + wl_glue_unregister(); +#endif /* defined(CONFIG_SSB) || defined(CONFIG_BCMA) */ return error; } @@ -1099,9 +1072,9 @@ wl_module_exit(void) #ifdef CONFIG_PCI pci_unregister_driver(&wl_pci_driver); #endif /* CONFIG_PCI */ -#ifdef CONFIG_SSB - ssb_driver_unregister(&wl_ssb_driver); -#endif /* CONFIG_SSB */ +#if defined(CONFIG_SSB) || defined(CONFIG_BCMA) + wl_glue_unregister(); +#endif /* defined(CONFIG_SSB) || defined(CONFIG_BCMA) */ } module_init(wl_module_init); --- a/driver/linux_osl.c +++ b/driver/linux_osl.c @@ -25,9 +25,9 @@ #include #endif /* mips */ #include -#ifdef CONFIG_SSB -#include -#endif +#if defined(CONFIG_SSB) || defined(CONFIG_BCMA) +#include +#endif /* defined(CONFIG_SSB) || defined(CONFIG_BCMA) */ #define PCI_CFG_RETRY 10 @@ -370,15 +370,17 @@ osl_dma_consistent_align(void) static struct device * osl_get_dmadev(osl_t *osh) { -#ifdef CONFIG_SSB +#if defined(CONFIG_SSB) || defined(CONFIG_BCMA) 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 */ + /* This can be SiliconBackplane emulated as pci with Broadcom, + * ssb or bcma device. Less harmful is to check for pci_bus_type and if + * no match then assume we got either ssb or bcma */ if (((struct pci_dev *)osh->pdev)->dev.bus != &pci_bus_type) - return ((struct ssb_device *)osh->pdev)->dma_dev; + { + return wl_glue_get_dmadev(osh->pdev); + } } -#endif +#endif /* defined(CONFIG_SSB) || defined(CONFIG_BCMA) */ return &((struct pci_dev *)osh->pdev)->dev; } --- a/driver/Makefile +++ b/driver/Makefile @@ -1,7 +1,7 @@ BUILD_TYPE=wl_apsta include $(src)/$(BUILD_TYPE)/buildflags.mk -EXTRA_CFLAGS += -I$(src)/include -I$(src) -DBCMDRIVER $(WLFLAGS) +EXTRA_CFLAGS += -I$(src)/include -I$(src) -I$(realpath $(src)/../glue) -DBCMDRIVER $(WLFLAGS) wl-objs := $(BUILD_TYPE)/wl_prebuilt.o wl_iw.o wl_linux.o linux_osl.o siutils.o aiutils.o hndpmu.o bcmutils.o sbutils.o nicpci.o hnddma.o bcmsrom.o nvram_stub.o