| --- a/driver/wl_linux.c | 
 | +++ b/driver/wl_linux.c | 
 | @@ -85,10 +85,9 @@ typedef void wlc_hw_info_t; | 
 |  #include <bcmjtag.h> | 
 |  #endif	/* BCMJTAG */ | 
 |   | 
 | - | 
 | -#ifdef CONFIG_SSB | 
 | -#include <linux/ssb/ssb.h> | 
 | -#endif | 
 | +#if defined(CONFIG_SSB) || defined(CONFIG_BCMA) | 
 | +#include <wl_glue.h> | 
 | +#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,11 @@ wl_module_init(void) | 
 |  	return 0; | 
 |   | 
 |  error_pci: | 
 | -	ssb_driver_unregister(&wl_ssb_driver); | 
 | +#if defined(CONFIG_SSB) || defined(CONFIG_BCMA) | 
 | +	wl_glue_unregister(); | 
 | +	wl_glue_set_attach_callback(NULL); | 
 | +	wl_glue_set_remove_callback(NULL); | 
 | +#endif /* defined(CONFIG_SSB) || defined(CONFIG_BCMA) */ | 
 |  	return error; | 
 |  } | 
 |   | 
 | @@ -1099,9 +1074,11 @@ 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(); | 
 | +	wl_glue_set_attach_callback(NULL); | 
 | +	wl_glue_set_remove_callback(NULL); | 
 | +#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 <asm/paccess.h> | 
 |  #endif /* mips */ | 
 |  #include <pcicfg.h> | 
 | -#ifdef CONFIG_SSB | 
 | -#include <linux/ssb/ssb.h> | 
 | -#endif | 
 | +#if defined(CONFIG_SSB) || defined(CONFIG_BCMA) | 
 | +#include <wl_glue.h> | 
 | +#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 | 
 |   |