diff --git a/package/mac80211/patches/840-brcmsmac-backport.patch b/package/mac80211/patches/840-brcmsmac-backport.patch
new file mode 100644
index 0000000000000000000000000000000000000000..82750336458aefa9e57120259f5ad5d637a7c08b
--- /dev/null
+++ b/package/mac80211/patches/840-brcmsmac-backport.patch
@@ -0,0 +1,1193 @@
+--- a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
++++ b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
+@@ -320,10 +320,6 @@
+ #define	IS_SIM(chippkg)	\
+ 	((chippkg == HDLSIM_PKG_ID) || (chippkg == HWSIM_PKG_ID))
+ 
+-#define PCIE(sih)	(ai_get_buscoretype(sih) == PCIE_CORE_ID)
+-
+-#define PCI_FORCEHT(sih) (PCIE(sih) && (ai_get_chip_id(sih) == BCM4716_CHIP_ID))
+-
+ #ifdef DEBUG
+ #define	SI_MSG(fmt, ...)	pr_debug(fmt, ##__VA_ARGS__)
+ #else
+@@ -475,9 +471,6 @@ ai_buscore_setup(struct si_info *sii, st
+ 		sii->pub.pmurev = sii->pub.pmucaps & PCAP_REV_MASK;
+ 	}
+ 
+-	/* figure out buscore */
+-	sii->buscore = ai_findcore(&sii->pub, PCIE_CORE_ID, 0);
+-
+ 	return true;
+ }
+ 
+@@ -485,11 +478,7 @@ static struct si_info *ai_doattach(struc
+ 				   struct bcma_bus *pbus)
+ {
+ 	struct si_pub *sih = &sii->pub;
+-	u32 w, savewin;
+ 	struct bcma_device *cc;
+-	struct ssb_sprom *sprom = &pbus->sprom;
+-
+-	savewin = 0;
+ 
+ 	sii->icbus = pbus;
+ 	sii->pcibus = pbus->host_pci;
+@@ -512,47 +501,7 @@ static struct si_info *ai_doattach(struc
+ 
+ 	/* PMU specific initializations */
+ 	if (ai_get_cccaps(sih) & CC_CAP_PMU) {
+-		si_pmu_init(sih);
+ 		(void)si_pmu_measure_alpclk(sih);
+-		si_pmu_res_init(sih);
+-	}
+-
+-	/* setup the GPIO based LED powersave register */
+-	w = (sprom->leddc_on_time << BCMA_CC_GPIOTIMER_ONTIME_SHIFT) |
+-		 (sprom->leddc_off_time << BCMA_CC_GPIOTIMER_OFFTIME_SHIFT);
+-	if (w == 0)
+-		w = DEFAULT_GPIOTIMERVAL;
+-	ai_cc_reg(sih, offsetof(struct chipcregs, gpiotimerval),
+-		  ~0, w);
+-
+-	if (ai_get_chip_id(sih) == BCM43224_CHIP_ID) {
+-		/*
+-		 * enable 12 mA drive strenth for 43224 and
+-		 * set chipControl register bit 15
+-		 */
+-		if (ai_get_chiprev(sih) == 0) {
+-			SI_MSG("Applying 43224A0 WARs\n");
+-			ai_cc_reg(sih, offsetof(struct chipcregs, chipcontrol),
+-				  CCTRL43224_GPIO_TOGGLE,
+-				  CCTRL43224_GPIO_TOGGLE);
+-			si_pmu_chipcontrol(sih, 0, CCTRL_43224A0_12MA_LED_DRIVE,
+-					   CCTRL_43224A0_12MA_LED_DRIVE);
+-		}
+-		if (ai_get_chiprev(sih) >= 1) {
+-			SI_MSG("Applying 43224B0+ WARs\n");
+-			si_pmu_chipcontrol(sih, 0, CCTRL_43224B0_12MA_LED_DRIVE,
+-					   CCTRL_43224B0_12MA_LED_DRIVE);
+-		}
+-	}
+-
+-	if (ai_get_chip_id(sih) == BCM4313_CHIP_ID) {
+-		/*
+-		 * enable 12 mA drive strenth for 4313 and
+-		 * set chipControl register bit 1
+-		 */
+-		SI_MSG("Applying 4313 WARs\n");
+-		si_pmu_chipcontrol(sih, 0, CCTRL_4313_12MA_LED_DRIVE,
+-				   CCTRL_4313_12MA_LED_DRIVE);
+ 	}
+ 
+ 	return sii;
+@@ -591,7 +540,7 @@ void ai_detach(struct si_pub *sih)
+ 	struct si_pub *si_local = NULL;
+ 	memcpy(&si_local, &sih, sizeof(struct si_pub **));
+ 
+-	sii = (struct si_info *)sih;
++	sii = container_of(sih, struct si_info, pub);
+ 
+ 	if (sii == NULL)
+ 		return;
+@@ -599,27 +548,6 @@ void ai_detach(struct si_pub *sih)
+ 	kfree(sii);
+ }
+ 
+-/* return index of coreid or BADIDX if not found */
+-struct bcma_device *ai_findcore(struct si_pub *sih, u16 coreid, u16 coreunit)
+-{
+-	struct bcma_device *core;
+-	struct si_info *sii;
+-	uint found;
+-
+-	sii = (struct si_info *)sih;
+-
+-	found = 0;
+-
+-	list_for_each_entry(core, &sii->icbus->cores, list)
+-		if (core->id.id == coreid) {
+-			if (found == coreunit)
+-				return core;
+-			found++;
+-		}
+-
+-	return NULL;
+-}
+-
+ /*
+  * read/modify chipcommon core register.
+  */
+@@ -629,7 +557,7 @@ uint ai_cc_reg(struct si_pub *sih, uint
+ 	u32 w;
+ 	struct si_info *sii;
+ 
+-	sii = (struct si_info *)sih;
++	sii = container_of(sih, struct si_info, pub);
+ 	cc = sii->icbus->drv_cc.core;
+ 
+ 	/* mask and set */
+@@ -695,12 +623,13 @@ ai_clkctl_setdelay(struct si_pub *sih, s
+ /* initialize power control delay registers */
+ void ai_clkctl_init(struct si_pub *sih)
+ {
++	struct si_info *sii = container_of(sih, struct si_info, pub);
+ 	struct bcma_device *cc;
+ 
+ 	if (!(ai_get_cccaps(sih) & CC_CAP_PWR_CTL))
+ 		return;
+ 
+-	cc = ai_findcore(sih, BCMA_CORE_CHIPCOMMON, 0);
++	cc = sii->icbus->drv_cc.core;
+ 	if (cc == NULL)
+ 		return;
+ 
+@@ -722,7 +651,7 @@ u16 ai_clkctl_fast_pwrup_delay(struct si
+ 	uint slowminfreq;
+ 	u16 fpdelay;
+ 
+-	sii = (struct si_info *)sih;
++	sii = container_of(sih, struct si_info, pub);
+ 	if (ai_get_cccaps(sih) & CC_CAP_PMU) {
+ 		fpdelay = si_pmu_fast_pwrup_delay(sih);
+ 		return fpdelay;
+@@ -732,7 +661,7 @@ u16 ai_clkctl_fast_pwrup_delay(struct si
+ 		return 0;
+ 
+ 	fpdelay = 0;
+-	cc = ai_findcore(sih, CC_CORE_ID, 0);
++	cc = sii->icbus->drv_cc.core;
+ 	if (cc) {
+ 		slowminfreq = ai_slowclk_freq(sih, false, cc);
+ 		fpdelay = (((bcma_read32(cc, CHIPCREGOFFS(pll_on_delay)) + 2)
+@@ -754,12 +683,9 @@ bool ai_clkctl_cc(struct si_pub *sih, en
+ 	struct si_info *sii;
+ 	struct bcma_device *cc;
+ 
+-	sii = (struct si_info *)sih;
+-
+-	if (PCI_FORCEHT(sih))
+-		return mode == BCMA_CLKMODE_FAST;
++	sii = container_of(sih, struct si_info, pub);
+ 
+-	cc = ai_findcore(&sii->pub, BCMA_CORE_CHIPCOMMON, 0);
++	cc = sii->icbus->drv_cc.core;
+ 	bcma_core_set_clockmode(cc, mode);
+ 	return mode == BCMA_CLKMODE_FAST;
+ }
+@@ -767,16 +693,10 @@ bool ai_clkctl_cc(struct si_pub *sih, en
+ void ai_pci_up(struct si_pub *sih)
+ {
+ 	struct si_info *sii;
+-	struct bcma_device *cc;
+ 
+-	sii = (struct si_info *)sih;
++	sii = container_of(sih, struct si_info, pub);
+ 
+-	if (PCI_FORCEHT(sih)) {
+-		cc = ai_findcore(&sii->pub, BCMA_CORE_CHIPCOMMON, 0);
+-		bcma_core_set_clockmode(cc, BCMA_CLKMODE_FAST);
+-	}
+-
+-	if (PCIE(sih))
++	if (sii->icbus->hosttype == BCMA_HOSTTYPE_PCI)
+ 		bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci, true);
+ }
+ 
+@@ -784,26 +704,20 @@ void ai_pci_up(struct si_pub *sih)
+ void ai_pci_down(struct si_pub *sih)
+ {
+ 	struct si_info *sii;
+-	struct bcma_device *cc;
+ 
+-	sii = (struct si_info *)sih;
++	sii = container_of(sih, struct si_info, pub);
+ 
+-	/* release FORCEHT since chip is going to "down" state */
+-	if (PCI_FORCEHT(sih)) {
+-		cc = ai_findcore(&sii->pub, BCMA_CORE_CHIPCOMMON, 0);
+-		bcma_core_set_clockmode(cc, BCMA_CLKMODE_DYNAMIC);
+-	}
+-
+-	if (PCIE(sih))
++	if (sii->icbus->hosttype == BCMA_HOSTTYPE_PCI)
+ 		bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci, false);
+ }
+ 
+ /* Enable BT-COEX & Ex-PA for 4313 */
+ void ai_epa_4313war(struct si_pub *sih)
+ {
++	struct si_info *sii = container_of(sih, struct si_info, pub);
+ 	struct bcma_device *cc;
+ 
+-	cc = ai_findcore(sih, CC_CORE_ID, 0);
++	cc = sii->icbus->drv_cc.core;
+ 
+ 	/* EPA Fix */
+ 	bcma_set32(cc, CHIPCREGOFFS(gpiocontrol), GPIO_CTRL_EPA_EN_MASK);
+@@ -815,7 +729,7 @@ bool ai_deviceremoved(struct si_pub *sih
+ 	u32 w;
+ 	struct si_info *sii;
+ 
+-	sii = (struct si_info *)sih;
++	sii = container_of(sih, struct si_info, pub);
+ 
+ 	if (sii->icbus->hosttype != BCMA_HOSTTYPE_PCI)
+ 		return false;
+@@ -826,15 +740,3 @@ bool ai_deviceremoved(struct si_pub *sih
+ 
+ 	return false;
+ }
+-
+-uint ai_get_buscoretype(struct si_pub *sih)
+-{
+-	struct si_info *sii = (struct si_info *)sih;
+-	return sii->buscore->id.id;
+-}
+-
+-uint ai_get_buscorerev(struct si_pub *sih)
+-{
+-	struct si_info *sii = (struct si_info *)sih;
+-	return sii->buscore->id.rev;
+-}
+--- a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.h
++++ b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.h
+@@ -88,16 +88,6 @@
+ #define	CLKD_OTP		0x000f0000
+ #define	CLKD_OTP_SHIFT		16
+ 
+-/* Package IDs */
+-#define	BCM4717_PKG_ID		9	/* 4717 package id */
+-#define	BCM4718_PKG_ID		10	/* 4718 package id */
+-#define BCM43224_FAB_SMIC	0xa	/* the chip is manufactured by SMIC */
+-
+-/* these are router chips */
+-#define	BCM4716_CHIP_ID		0x4716	/* 4716 chipcommon chipid */
+-#define	BCM47162_CHIP_ID	47162	/* 47162 chipcommon chipid */
+-#define	BCM4748_CHIP_ID		0x4748	/* 4716 chipcommon chipid (OTP, RBBU) */
+-
+ /* dynamic clock control defines */
+ #define	LPOMINFREQ		25000	/* low power oscillator min */
+ #define	LPOMAXFREQ		43000	/* low power oscillator max */
+@@ -168,7 +158,6 @@ struct si_info {
+ 	struct si_pub pub;	/* back plane public state (must be first) */
+ 	struct bcma_bus *icbus;	/* handle to soc interconnect bus */
+ 	struct pci_dev *pcibus;	/* handle to pci bus */
+-	struct bcma_device *buscore;
+ 
+ 	u32 chipst;		/* chip status */
+ };
+@@ -183,8 +172,6 @@ struct si_info {
+ 
+ 
+ /* AMBA Interconnect exported externs */
+-extern struct bcma_device *ai_findcore(struct si_pub *sih,
+-				       u16 coreid, u16 coreunit);
+ extern u32 ai_core_cflags(struct bcma_device *core, u32 mask, u32 val);
+ 
+ /* === exported functions === */
+@@ -202,9 +189,6 @@ extern void ai_pci_up(struct si_pub *sih
+ /* Enable Ex-PA for 4313 */
+ extern void ai_epa_4313war(struct si_pub *sih);
+ 
+-extern uint ai_get_buscoretype(struct si_pub *sih);
+-extern uint ai_get_buscorerev(struct si_pub *sih);
+-
+ static inline u32 ai_get_cccaps(struct si_pub *sih)
+ {
+ 	return sih->cccaps;
+--- a/drivers/net/wireless/brcm80211/brcmsmac/dma.c
++++ b/drivers/net/wireless/brcm80211/brcmsmac/dma.c
+@@ -574,6 +574,7 @@ struct dma_pub *dma_attach(char *name, s
+ 	struct dma_info *di;
+ 	u8 rev = core->id.rev;
+ 	uint size;
++	struct si_info *sii = container_of(sih, struct si_info, pub);
+ 
+ 	/* allocate private info structure */
+ 	di = kzalloc(sizeof(struct dma_info), GFP_ATOMIC);
+@@ -634,16 +635,20 @@ struct dma_pub *dma_attach(char *name, s
+ 	 */
+ 	di->ddoffsetlow = 0;
+ 	di->dataoffsetlow = 0;
+-	/* add offset for pcie with DMA64 bus */
+-	di->ddoffsetlow = 0;
+-	di->ddoffsethigh = SI_PCIE_DMA_H32;
++	/* for pci bus, add offset */
++	if (sii->icbus->hosttype == BCMA_HOSTTYPE_PCI) {
++		/* add offset for pcie with DMA64 bus */
++		di->ddoffsetlow = 0;
++		di->ddoffsethigh = SI_PCIE_DMA_H32;
++	}
+ 	di->dataoffsetlow = di->ddoffsetlow;
+ 	di->dataoffsethigh = di->ddoffsethigh;
++
+ 	/* WAR64450 : DMACtl.Addr ext fields are not supported in SDIOD core. */
+-	if ((core->id.id == SDIOD_CORE_ID)
++	if ((core->id.id == BCMA_CORE_SDIO_DEV)
+ 	    && ((rev > 0) && (rev <= 2)))
+ 		di->addrext = false;
+-	else if ((core->id.id == I2S_CORE_ID) &&
++	else if ((core->id.id == BCMA_CORE_I2S) &&
+ 		 ((rev == 0) || (rev == 1)))
+ 		di->addrext = false;
+ 	else
+--- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
++++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
+@@ -321,8 +321,7 @@ static void brcms_ops_stop(struct ieee80
+ 		return;
+ 
+ 	spin_lock_bh(&wl->lock);
+-	status = brcms_c_chipmatch(wl->wlc->hw->vendorid,
+-				   wl->wlc->hw->deviceid);
++	status = brcms_c_chipmatch(wl->wlc->hw->d11core);
+ 	spin_unlock_bh(&wl->lock);
+ 	if (!status) {
+ 		wiphy_err(wl->wiphy,
+--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
++++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
+@@ -271,7 +271,7 @@ struct brcms_c_bit_desc {
+  */
+ 
+ /* Starting corerev for the fifo size table */
+-#define XMTFIFOTBL_STARTREV	20
++#define XMTFIFOTBL_STARTREV	17
+ 
+ struct d11init {
+ 	__le16 addr;
+@@ -335,6 +335,12 @@ const u8 wlc_prio2prec_map[] = {
+ };
+ 
+ static const u16 xmtfifo_sz[][NFIFO] = {
++	/* corerev 17: 5120, 49152, 49152, 5376, 4352, 1280 */
++	{20, 192, 192, 21, 17, 5},
++	/* corerev 18: */
++	{0, 0, 0, 0, 0, 0},
++	/* corerev 19: */
++	{0, 0, 0, 0, 0, 0},
+ 	/* corerev 20: 5120, 49152, 49152, 5376, 4352, 1280 */
+ 	{20, 192, 192, 21, 17, 5},
+ 	/* corerev 21: 2304, 14848, 5632, 3584, 3584, 1280 */
+@@ -345,6 +351,14 @@ static const u16 xmtfifo_sz[][NFIFO] = {
+ 	{20, 192, 192, 21, 17, 5},
+ 	/* corerev 24: 2304, 14848, 5632, 3584, 3584, 1280 */
+ 	{9, 58, 22, 14, 14, 5},
++	/* corerev 25: */
++	{0, 0, 0, 0, 0, 0},
++	/* corerev 26: */
++	{0, 0, 0, 0, 0, 0},
++	/* corerev 27: */
++	{0, 0, 0, 0, 0, 0},
++	/* corerev 28: 2304, 14848, 5632, 3584, 3584, 1280 */
++	{9, 58, 22, 14, 14, 5},
+ };
+ 
+ #ifdef DEBUG
+@@ -1944,7 +1958,8 @@ static bool brcms_b_radio_read_hwdisable
+ 		 * accesses phyreg throughput mac. This can be skipped since
+ 		 * only mac reg is accessed below
+ 		 */
+-		flags |= SICF_PCLKE;
++		if (D11REV_GE(wlc_hw->corerev, 18))
++			flags |= SICF_PCLKE;
+ 
+ 		/*
+ 		 * TODO: test suspend/resume
+@@ -2025,7 +2040,8 @@ void brcms_b_corereset(struct brcms_hard
+ 	 * phyreg throughput mac, AND phy_reset is skipped at early stage when
+ 	 * band->pi is invalid. need to enable PHY CLK
+ 	 */
+-	flags |= SICF_PCLKE;
++	if (D11REV_GE(wlc_hw->corerev, 18))
++		flags |= SICF_PCLKE;
+ 
+ 	/*
+ 	 * reset the core
+@@ -2128,8 +2144,8 @@ void brcms_b_switch_macfreq(struct brcms
+ {
+ 	struct bcma_device *core = wlc_hw->d11core;
+ 
+-	if ((ai_get_chip_id(wlc_hw->sih) == BCM43224_CHIP_ID) ||
+-	    (ai_get_chip_id(wlc_hw->sih) == BCM43225_CHIP_ID)) {
++	if ((ai_get_chip_id(wlc_hw->sih) == BCMA_CHIP_ID_BCM43224) ||
++	    (ai_get_chip_id(wlc_hw->sih) == BCMA_CHIP_ID_BCM43225)) {
+ 		if (spurmode == WL_SPURAVOID_ON2) {	/* 126Mhz */
+ 			bcma_write16(core, D11REGOFFS(tsf_clk_frac_l), 0x2082);
+ 			bcma_write16(core, D11REGOFFS(tsf_clk_frac_h), 0x8);
+@@ -2793,7 +2809,7 @@ void brcms_b_core_phypll_ctl(struct brcm
+ 	tmp = 0;
+ 
+ 	if (on) {
+-		if ((ai_get_chip_id(wlc_hw->sih) == BCM4313_CHIP_ID)) {
++		if ((ai_get_chip_id(wlc_hw->sih) == BCMA_CHIP_ID_BCM4313)) {
+ 			bcma_set32(core, D11REGOFFS(clk_ctl_st),
+ 				   CCS_ERSRC_REQ_HT |
+ 				   CCS_ERSRC_REQ_D11PLL |
+@@ -4220,9 +4236,8 @@ static void brcms_c_radio_timer(void *ar
+ }
+ 
+ /* common low-level watchdog code */
+-static void brcms_b_watchdog(void *arg)
++static void brcms_b_watchdog(struct brcms_c_info *wlc)
+ {
+-	struct brcms_c_info *wlc = (struct brcms_c_info *) arg;
+ 	struct brcms_hardware *wlc_hw = wlc->hw;
+ 
+ 	BCMMSG(wlc->wiphy, "wl%d\n", wlc_hw->unit);
+@@ -4243,10 +4258,8 @@ static void brcms_b_watchdog(void *arg)
+ }
+ 
+ /* common watchdog code */
+-static void brcms_c_watchdog(void *arg)
++static void brcms_c_watchdog(struct brcms_c_info *wlc)
+ {
+-	struct brcms_c_info *wlc = (struct brcms_c_info *) arg;
+-
+ 	BCMMSG(wlc->wiphy, "wl%d\n", wlc->pub->unit);
+ 
+ 	if (!wlc->pub->up)
+@@ -4286,7 +4299,9 @@ static void brcms_c_watchdog(void *arg)
+ 
+ static void brcms_c_watchdog_by_timer(void *arg)
+ {
+-	brcms_c_watchdog(arg);
++	struct brcms_c_info *wlc = (struct brcms_c_info *) arg;
++
++	brcms_c_watchdog(wlc);
+ }
+ 
+ static bool brcms_c_timers_init(struct brcms_c_info *wlc, int unit)
+@@ -4456,11 +4471,9 @@ static int brcms_b_attach(struct brcms_c
+ 	}
+ 
+ 	/* verify again the device is supported */
+-	if (core->bus->hosttype == BCMA_HOSTTYPE_PCI &&
+-	    !brcms_c_chipmatch(pcidev->vendor, pcidev->device)) {
+-		wiphy_err(wiphy, "wl%d: brcms_b_attach: Unsupported "
+-			"vendor/device (0x%x/0x%x)\n",
+-			 unit, pcidev->vendor, pcidev->device);
++	if (!brcms_c_chipmatch(core)) {
++		wiphy_err(wiphy, "wl%d: brcms_b_attach: Unsupported device\n",
++			 unit);
+ 		err = 12;
+ 		goto fail;
+ 	}
+@@ -4530,7 +4543,7 @@ static int brcms_b_attach(struct brcms_c
+ 	else
+ 		wlc_hw->_nbands = 1;
+ 
+-	if ((ai_get_chip_id(wlc_hw->sih) == BCM43225_CHIP_ID))
++	if ((ai_get_chip_id(wlc_hw->sih) == BCMA_CHIP_ID_BCM43225))
+ 		wlc_hw->_nbands = 1;
+ 
+ 	/* BMAC_NOTE: remove init of pub values when brcms_c_attach()
+@@ -4597,8 +4610,12 @@ static int brcms_b_attach(struct brcms_c
+ 		wlc_hw->machwcap_backup = wlc_hw->machwcap;
+ 
+ 		/* init tx fifo size */
++		WARN_ON((wlc_hw->corerev - XMTFIFOTBL_STARTREV) < 0 ||
++			(wlc_hw->corerev - XMTFIFOTBL_STARTREV) >
++				ARRAY_SIZE(xmtfifo_sz));
+ 		wlc_hw->xmtfifo_sz =
+ 		    xmtfifo_sz[(wlc_hw->corerev - XMTFIFOTBL_STARTREV)];
++		WARN_ON(!wlc_hw->xmtfifo_sz[0]);
+ 
+ 		/* Get a phy for this band */
+ 		wlc_hw->band->pi =
+@@ -5038,7 +5055,7 @@ static void brcms_b_hw_up(struct brcms_h
+ 	wlc_hw->wlc->pub->hw_up = true;
+ 
+ 	if ((wlc_hw->boardflags & BFL_FEM)
+-	    && (ai_get_chip_id(wlc_hw->sih) == BCM4313_CHIP_ID)) {
++	    && (ai_get_chip_id(wlc_hw->sih) == BCMA_CHIP_ID_BCM4313)) {
+ 		if (!
+ 		    (wlc_hw->boardrev >= 0x1250
+ 		     && (wlc_hw->boardflags & BFL_FEM_BT)))
+@@ -5132,7 +5149,7 @@ int brcms_c_up(struct brcms_c_info *wlc)
+ 	}
+ 
+ 	if ((wlc->pub->boardflags & BFL_FEM)
+-	    && (ai_get_chip_id(wlc->hw->sih) == BCM4313_CHIP_ID)) {
++	    && (ai_get_chip_id(wlc->hw->sih) == BCMA_CHIP_ID_BCM4313)) {
+ 		if (wlc->pub->boardrev >= 0x1250
+ 		    && (wlc->pub->boardflags & BFL_FEM_BT))
+ 			brcms_b_mhf(wlc->hw, MHF5, MHF5_4313_GPIOCTRL,
+@@ -5769,8 +5786,12 @@ void brcms_c_print_txstatus(struct tx_st
+ 		 (txs->ackphyrxsh & PRXS1_SQ_MASK) >> PRXS1_SQ_SHIFT);
+ }
+ 
+-bool brcms_c_chipmatch(u16 vendor, u16 device)
++static bool brcms_c_chipmatch_pci(struct bcma_device *core)
+ {
++	struct pci_dev *pcidev = core->bus->host_pci;
++	u16 vendor = pcidev->vendor;
++	u16 device = pcidev->device;
++
+ 	if (vendor != PCI_VENDOR_ID_BROADCOM) {
+ 		pr_err("unknown vendor id %04x\n", vendor);
+ 		return false;
+@@ -5789,6 +5810,30 @@ bool brcms_c_chipmatch(u16 vendor, u16 d
+ 	return false;
+ }
+ 
++static bool brcms_c_chipmatch_soc(struct bcma_device *core)
++{
++	struct bcma_chipinfo *chipinfo = &core->bus->chipinfo;
++
++	if (chipinfo->id == BCMA_CHIP_ID_BCM4716)
++		return true;
++
++	pr_err("unknown chip id %04x\n", chipinfo->id);
++	return false;
++}
++
++bool brcms_c_chipmatch(struct bcma_device *core)
++{
++	switch (core->bus->hosttype) {
++	case BCMA_HOSTTYPE_PCI:
++		return brcms_c_chipmatch_pci(core);
++	case BCMA_HOSTTYPE_SOC:
++		return brcms_c_chipmatch_soc(core);
++	default:
++		pr_err("unknown host type: %i\n", core->bus->hosttype);
++		return false;
++	}
++}
++
+ #if defined(DEBUG)
+ void brcms_c_print_txdesc(struct d11txh *txh)
+ {
+--- a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_cmn.c
++++ b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_cmn.c
+@@ -198,6 +198,8 @@ u16 read_radio_reg(struct brcms_phy *pi,
+ 
+ void write_radio_reg(struct brcms_phy *pi, u16 addr, u16 val)
+ {
++	struct si_info *sii = container_of(pi->sh->sih, struct si_info, pub);
++
+ 	if ((D11REV_GE(pi->sh->corerev, 24)) ||
+ 	    (D11REV_IS(pi->sh->corerev, 22)
+ 	     && (pi->pubpi.phy_type != PHY_TYPE_SSN))) {
+@@ -209,7 +211,8 @@ void write_radio_reg(struct brcms_phy *p
+ 		bcma_write16(pi->d11core, D11REGOFFS(phy4wdatalo), val);
+ 	}
+ 
+-	if (++pi->phy_wreg >= pi->phy_wreg_limit) {
++	if ((sii->icbus->hosttype == BCMA_HOSTTYPE_PCI) &&
++	    (++pi->phy_wreg >= pi->phy_wreg_limit)) {
+ 		(void)bcma_read32(pi->d11core, D11REGOFFS(maccontrol));
+ 		pi->phy_wreg = 0;
+ 	}
+@@ -292,10 +295,13 @@ void write_phy_reg(struct brcms_phy *pi,
+ 	bcma_wflush16(pi->d11core, D11REGOFFS(phyregaddr), addr);
+ 	bcma_write16(pi->d11core, D11REGOFFS(phyregdata), val);
+ 	if (addr == 0x72)
+-		(void)bcma_read16(pi->d11core, D11REGOFFS(phyversion));
++		(void)bcma_read16(pi->d11core, D11REGOFFS(phyregdata));
+ #else
++	struct si_info *sii = container_of(pi->sh->sih, struct si_info, pub);
++
+ 	bcma_write32(pi->d11core, D11REGOFFS(phyregaddr), addr | (val << 16));
+-	if (++pi->phy_wreg >= pi->phy_wreg_limit) {
++	if ((sii->icbus->hosttype == BCMA_HOSTTYPE_PCI) &&
++	    (++pi->phy_wreg >= pi->phy_wreg_limit)) {
+ 		pi->phy_wreg = 0;
+ 		(void)bcma_read16(pi->d11core, D11REGOFFS(phyversion));
+ 	}
+@@ -837,7 +843,7 @@ wlc_phy_table_addr(struct brcms_phy *pi,
+ 	pi->tbl_data_hi = tblDataHi;
+ 	pi->tbl_data_lo = tblDataLo;
+ 
+-	if (pi->sh->chip == BCM43224_CHIP_ID &&
++	if (pi->sh->chip == BCMA_CHIP_ID_BCM43224 &&
+ 	    pi->sh->chiprev == 1) {
+ 		pi->tbl_addr = tblAddr;
+ 		pi->tbl_save_id = tbl_id;
+@@ -847,7 +853,7 @@ wlc_phy_table_addr(struct brcms_phy *pi,
+ 
+ void wlc_phy_table_data_write(struct brcms_phy *pi, uint width, u32 val)
+ {
+-	if ((pi->sh->chip == BCM43224_CHIP_ID) &&
++	if ((pi->sh->chip == BCMA_CHIP_ID_BCM43224) &&
+ 	    (pi->sh->chiprev == 1) &&
+ 	    (pi->tbl_save_id == NPHY_TBL_ID_ANTSWCTRLLUT)) {
+ 		read_phy_reg(pi, pi->tbl_data_lo);
+@@ -881,7 +887,7 @@ wlc_phy_write_table(struct brcms_phy *pi
+ 
+ 	for (idx = 0; idx < ptbl_info->tbl_len; idx++) {
+ 
+-		if ((pi->sh->chip == BCM43224_CHIP_ID) &&
++		if ((pi->sh->chip == BCMA_CHIP_ID_BCM43224) &&
+ 		    (pi->sh->chiprev == 1) &&
+ 		    (tbl_id == NPHY_TBL_ID_ANTSWCTRLLUT)) {
+ 			read_phy_reg(pi, tblDataLo);
+@@ -918,7 +924,7 @@ wlc_phy_read_table(struct brcms_phy *pi,
+ 
+ 	for (idx = 0; idx < ptbl_info->tbl_len; idx++) {
+ 
+-		if ((pi->sh->chip == BCM43224_CHIP_ID) &&
++		if ((pi->sh->chip == BCMA_CHIP_ID_BCM43224) &&
+ 		    (pi->sh->chiprev == 1)) {
+ 			(void)read_phy_reg(pi, tblDataLo);
+ 
+@@ -2894,7 +2900,7 @@ const u8 *wlc_phy_get_ofdm_rate_lookup(v
+ 
+ void wlc_lcnphy_epa_switch(struct brcms_phy *pi, bool mode)
+ {
+-	if ((pi->sh->chip == BCM4313_CHIP_ID) &&
++	if ((pi->sh->chip == BCMA_CHIP_ID_BCM4313) &&
+ 	    (pi->sh->boardflags & BFL_FEM)) {
+ 		if (mode) {
+ 			u16 txant = 0;
+--- a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_n.c
++++ b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_n.c
+@@ -17895,6 +17895,8 @@ static u32 *wlc_phy_get_ipa_gaintbl_nphy
+ 					nphy_tpc_txgain_ipa_2g_2057rev7;
+ 		} else if (NREV_IS(pi->pubpi.phy_rev, 6)) {
+ 			tx_pwrctrl_tbl = nphy_tpc_txgain_ipa_rev6;
++			if (pi->sh->chip == BCMA_CHIP_ID_BCM47162)
++				tx_pwrctrl_tbl = nphy_tpc_txgain_ipa_rev5;
+ 		} else if (NREV_IS(pi->pubpi.phy_rev, 5)) {
+ 			tx_pwrctrl_tbl = nphy_tpc_txgain_ipa_rev5;
+ 		} else {
+@@ -19256,8 +19258,14 @@ static void wlc_phy_spurwar_nphy(struct
+ 			case 38:
+ 			case 102:
+ 			case 118:
+-				nphy_adj_tone_id_buf[0] = 0;
+-				nphy_adj_noise_var_buf[0] = 0x0;
++				if ((pi->sh->chip == BCMA_CHIP_ID_BCM4716) &&
++				    (pi->sh->chippkg == BCMA_PKG_ID_BCM4717)) {
++					nphy_adj_tone_id_buf[0] = 32;
++					nphy_adj_noise_var_buf[0] = 0x21f;
++				} else {
++					nphy_adj_tone_id_buf[0] = 0;
++					nphy_adj_noise_var_buf[0] = 0x0;
++				}
+ 				break;
+ 			case 134:
+ 				nphy_adj_tone_id_buf[0] = 32;
+@@ -19311,8 +19319,8 @@ void wlc_phy_init_nphy(struct brcms_phy
+ 		pi->measure_hold |= PHY_HOLD_FOR_NOT_ASSOC;
+ 
+ 	if ((ISNPHY(pi)) && (NREV_GE(pi->pubpi.phy_rev, 5)) &&
+-	    ((pi->sh->chippkg == BCM4717_PKG_ID) ||
+-	     (pi->sh->chippkg == BCM4718_PKG_ID))) {
++	    ((pi->sh->chippkg == BCMA_PKG_ID_BCM4717) ||
++	     (pi->sh->chippkg == BCMA_PKG_ID_BCM4718))) {
+ 		if ((pi->sh->boardflags & BFL_EXTLNA) &&
+ 		    (CHSPEC_IS2G(pi->radio_chanspec)))
+ 			ai_cc_reg(pi->sh->sih,
+@@ -19320,6 +19328,10 @@ void wlc_phy_init_nphy(struct brcms_phy
+ 				  0x40, 0x40);
+ 	}
+ 
++	if ((!PHY_IPA(pi)) && (pi->sh->chip == BCMA_CHIP_ID_BCM5357))
++		si_pmu_chipcontrol(pi->sh->sih, 1, CCTRL5357_EXTPA,
++				   CCTRL5357_EXTPA);
++
+ 	if ((pi->nphy_gband_spurwar2_en) && CHSPEC_IS2G(pi->radio_chanspec) &&
+ 	    CHSPEC_IS40(pi->radio_chanspec)) {
+ 
+@@ -20697,12 +20709,22 @@ wlc_phy_chanspec_radio2056_setup(struct
+ 			write_radio_reg(pi, RADIO_2056_SYN_PLL_LOOPFILTER2 |
+ 					RADIO_2056_SYN, 0x1f);
+ 
+-			write_radio_reg(pi,
+-					RADIO_2056_SYN_PLL_LOOPFILTER4 |
+-					RADIO_2056_SYN, 0xb);
+-			write_radio_reg(pi,
+-					RADIO_2056_SYN_PLL_CP2 |
+-					RADIO_2056_SYN, 0x14);
++			if ((pi->sh->chip == BCMA_CHIP_ID_BCM4716) ||
++			    (pi->sh->chip == BCMA_CHIP_ID_BCM47162)) {
++				write_radio_reg(pi,
++						RADIO_2056_SYN_PLL_LOOPFILTER4 |
++						RADIO_2056_SYN, 0x14);
++				write_radio_reg(pi,
++						RADIO_2056_SYN_PLL_CP2 |
++						RADIO_2056_SYN, 0x00);
++			} else {
++				write_radio_reg(pi,
++						RADIO_2056_SYN_PLL_LOOPFILTER4 |
++						RADIO_2056_SYN, 0xb);
++				write_radio_reg(pi,
++						RADIO_2056_SYN_PLL_CP2 |
++						RADIO_2056_SYN, 0x14);
++			}
+ 		}
+ 	}
+ 
+@@ -20749,24 +20771,30 @@ wlc_phy_chanspec_radio2056_setup(struct
+ 				WRITE_RADIO_REG2(pi, RADIO_2056, TX, core,
+ 						 PADG_IDAC, 0xcc);
+ 
+-				bias = 0x25;
+-				cascbias = 0x20;
++				if ((pi->sh->chip == BCMA_CHIP_ID_BCM4716) ||
++				    (pi->sh->chip == BCMA_CHIP_ID_BCM47162)) {
++					bias = 0x40;
++					cascbias = 0x45;
++					pag_boost_tune = 0x5;
++					pgag_boost_tune = 0x33;
++					padg_boost_tune = 0x77;
++					mixg_boost_tune = 0x55;
++				} else {
++					bias = 0x25;
++					cascbias = 0x20;
+ 
+-				if ((pi->sh->chip ==
+-				     BCM43224_CHIP_ID)
+-				    || (pi->sh->chip ==
+-					BCM43225_CHIP_ID)) {
+-					if (pi->sh->chippkg ==
+-					    BCM43224_FAB_SMIC) {
++					if ((pi->sh->chip == BCMA_CHIP_ID_BCM43224 ||
++					     pi->sh->chip == BCMA_CHIP_ID_BCM43225) &&
++					    pi->sh->chippkg == BCMA_PKG_ID_BCM43224_FAB_SMIC) {
+ 						bias = 0x2a;
+ 						cascbias = 0x38;
+ 					}
+-				}
+ 
+-				pag_boost_tune = 0x4;
+-				pgag_boost_tune = 0x03;
+-				padg_boost_tune = 0x77;
+-				mixg_boost_tune = 0x65;
++					pag_boost_tune = 0x4;
++					pgag_boost_tune = 0x03;
++					padg_boost_tune = 0x77;
++					mixg_boost_tune = 0x65;
++				}
+ 
+ 				WRITE_RADIO_REG2(pi, RADIO_2056, TX, core,
+ 						 INTPAG_IMAIN_STAT, bias);
+@@ -20865,11 +20893,10 @@ wlc_phy_chanspec_radio2056_setup(struct
+ 
+ 			cascbias = 0x30;
+ 
+-			if ((pi->sh->chip == BCM43224_CHIP_ID) ||
+-			    (pi->sh->chip == BCM43225_CHIP_ID)) {
+-				if (pi->sh->chippkg == BCM43224_FAB_SMIC)
+-					cascbias = 0x35;
+-			}
++			if ((pi->sh->chip == BCMA_CHIP_ID_BCM43224 ||
++			     pi->sh->chip == BCMA_CHIP_ID_BCM43225) &&
++			    pi->sh->chippkg == BCMA_PKG_ID_BCM43224_FAB_SMIC)
++				cascbias = 0x35;
+ 
+ 			pabias = (pi->phy_pabias == 0) ? 0x30 : pi->phy_pabias;
+ 
+@@ -21108,6 +21135,7 @@ wlc_phy_chanspec_nphy_setup(struct brcms
+ 			    const struct nphy_sfo_cfg *ci)
+ {
+ 	u16 val;
++	struct si_info *sii = container_of(pi->sh->sih, struct si_info, pub);
+ 
+ 	val = read_phy_reg(pi, 0x09) & NPHY_BandControl_currentBand;
+ 	if (CHSPEC_IS5G(chanspec) && !val) {
+@@ -21180,22 +21208,32 @@ wlc_phy_chanspec_nphy_setup(struct brcms
+ 		} else if (NREV_GE(pi->pubpi.phy_rev, 7)) {
+ 			if (val == 54)
+ 				spuravoid = 1;
+-		} else {
+-			if (pi->nphy_aband_spurwar_en &&
+-			    ((val == 38) || (val == 102)
+-			     || (val == 118)))
++		} else if (pi->nphy_aband_spurwar_en &&
++		    ((val == 38) || (val == 102) || (val == 118))) {
++			if ((pi->sh->chip == BCMA_CHIP_ID_BCM4716)
++			    && (pi->sh->chippkg == BCMA_PKG_ID_BCM4717)) {
++				spuravoid = 0;
++			} else {
+ 				spuravoid = 1;
++			}
+ 		}
+ 
+ 		if (pi->phy_spuravoid == SPURAVOID_FORCEON)
+ 			spuravoid = 1;
+ 
+-		wlapi_bmac_core_phypll_ctl(pi->sh->physhim, false);
+-		si_pmu_spuravoid_pllupdate(pi->sh->sih, spuravoid);
+-		wlapi_bmac_core_phypll_ctl(pi->sh->physhim, true);
++		if ((pi->sh->chip == BCMA_CHIP_ID_BCM4716) ||
++		    (pi->sh->chip == BCMA_CHIP_ID_BCM43225)) {
++			bcma_pmu_spuravoid_pllupdate(&sii->icbus->drv_cc,
++						     spuravoid);
++		} else {
++			wlapi_bmac_core_phypll_ctl(pi->sh->physhim, false);
++			bcma_pmu_spuravoid_pllupdate(&sii->icbus->drv_cc,
++						     spuravoid);
++			wlapi_bmac_core_phypll_ctl(pi->sh->physhim, true);
++		}
+ 
+-		if ((pi->sh->chip == BCM43224_CHIP_ID) ||
+-		    (pi->sh->chip == BCM43225_CHIP_ID)) {
++		if ((pi->sh->chip == BCMA_CHIP_ID_BCM43224) ||
++		    (pi->sh->chip == BCMA_CHIP_ID_BCM43225)) {
+ 			if (spuravoid == 1) {
+ 				bcma_write16(pi->d11core,
+ 					     D11REGOFFS(tsf_clk_frac_l),
+@@ -21211,7 +21249,9 @@ wlc_phy_chanspec_nphy_setup(struct brcms
+ 			}
+ 		}
+ 
+-		wlapi_bmac_core_phypll_reset(pi->sh->physhim);
++		if (!((pi->sh->chip == BCMA_CHIP_ID_BCM4716) ||
++		      (pi->sh->chip == BCMA_CHIP_ID_BCM47162)))
++			wlapi_bmac_core_phypll_reset(pi->sh->physhim);
+ 
+ 		mod_phy_reg(pi, 0x01, (0x1 << 15),
+ 			    ((spuravoid > 0) ? (0x1 << 15) : 0));
+@@ -22173,9 +22213,15 @@ s16 wlc_phy_tempsense_nphy(struct brcms_
+ 		wlc_phy_table_write_nphy(pi, NPHY_TBL_ID_AFECTRL, 1, 0x03, 16,
+ 					 &auxADC_rssi_ctrlH_save);
+ 
+-		radio_temp[0] = (179 * (radio_temp[1] + radio_temp2[1])
+-				 + 82 * (auxADC_Vl) - 28861 +
+-				 128) / 256;
++		if (pi->sh->chip == BCMA_CHIP_ID_BCM5357) {
++			radio_temp[0] = (193 * (radio_temp[1] + radio_temp2[1])
++					 + 88 * (auxADC_Vl) - 27111 +
++					 128) / 256;
++		} else {
++			radio_temp[0] = (179 * (radio_temp[1] + radio_temp2[1])
++					 + 82 * (auxADC_Vl) - 28861 +
++					 128) / 256;
++		}
+ 
+ 		offset = (s16) pi->phy_tempsense_offset;
+ 
+@@ -24925,14 +24971,16 @@ wlc_phy_a2_nphy(struct brcms_phy *pi, st
+ 			if (txgains->useindex) {
+ 				phy_a4 = 15 - ((txgains->index) >> 3);
+ 				if (CHSPEC_IS2G(pi->radio_chanspec)) {
+-					if (NREV_GE(pi->pubpi.phy_rev, 6))
++					if (NREV_GE(pi->pubpi.phy_rev, 6) &&
++					    pi->sh->chip == BCMA_CHIP_ID_BCM47162) {
++						phy_a5 = 0x10f7 | (phy_a4 << 8);
++					} else if (NREV_GE(pi->pubpi.phy_rev, 6)) {
+ 						phy_a5 = 0x00f7 | (phy_a4 << 8);
+-
+-					else
+-					if (NREV_IS(pi->pubpi.phy_rev, 5))
++					} else if (NREV_IS(pi->pubpi.phy_rev, 5)) {
+ 						phy_a5 = 0x10f7 | (phy_a4 << 8);
+-					else
++					} else {
+ 						phy_a5 = 0x50f7 | (phy_a4 << 8);
++					}
+ 				} else {
+ 					phy_a5 = 0x70f7 | (phy_a4 << 8);
+ 				}
+--- a/drivers/net/wireless/brcm80211/brcmsmac/pmu.c
++++ b/drivers/net/wireless/brcm80211/brcmsmac/pmu.c
+@@ -74,16 +74,6 @@
+  * PMU<rev>_PLL<num>_XX where <rev> is PMU corerev and <num> is an arbitrary
+  * number to differentiate different PLLs controlled by the same PMU rev.
+  */
+-/* pllcontrol registers:
+- * ndiv_pwrdn, pwrdn_ch<x>, refcomp_pwrdn, dly_ch<x>,
+- * p1div, p2div, _bypass_sdmod
+- */
+-#define PMU1_PLL0_PLLCTL0		0
+-#define PMU1_PLL0_PLLCTL1		1
+-#define PMU1_PLL0_PLLCTL2		2
+-#define PMU1_PLL0_PLLCTL3		3
+-#define PMU1_PLL0_PLLCTL4		4
+-#define PMU1_PLL0_PLLCTL5		5
+ 
+ /* pmu XtalFreqRatio */
+ #define	PMU_XTALFREQ_REG_ILPCTR_MASK	0x00001FFF
+@@ -108,118 +98,14 @@
+ #define	RES4313_HT_AVAIL_RSRC		14
+ #define	RES4313_MACPHY_CLK_AVAIL_RSRC	15
+ 
+-/* Determine min/max rsrc masks. Value 0 leaves hardware at default. */
+-static void si_pmu_res_masks(struct si_pub *sih, u32 * pmin, u32 * pmax)
+-{
+-	u32 min_mask = 0, max_mask = 0;
+-	uint rsrcs;
+-
+-	/* # resources */
+-	rsrcs = (ai_get_pmucaps(sih) & PCAP_RC_MASK) >> PCAP_RC_SHIFT;
+-
+-	/* determine min/max rsrc masks */
+-	switch (ai_get_chip_id(sih)) {
+-	case BCM43224_CHIP_ID:
+-	case BCM43225_CHIP_ID:
+-		/* ??? */
+-		break;
+-
+-	case BCM4313_CHIP_ID:
+-		min_mask = PMURES_BIT(RES4313_BB_PU_RSRC) |
+-		    PMURES_BIT(RES4313_XTAL_PU_RSRC) |
+-		    PMURES_BIT(RES4313_ALP_AVAIL_RSRC) |
+-		    PMURES_BIT(RES4313_BB_PLL_PWRSW_RSRC);
+-		max_mask = 0xffff;
+-		break;
+-	default:
+-		break;
+-	}
+-
+-	*pmin = min_mask;
+-	*pmax = max_mask;
+-}
+-
+-void si_pmu_spuravoid_pllupdate(struct si_pub *sih, u8 spuravoid)
+-{
+-	u32 tmp = 0;
+-	struct bcma_device *core;
+-
+-	/* switch to chipc */
+-	core = ai_findcore(sih, BCMA_CORE_CHIPCOMMON, 0);
+-
+-	switch (ai_get_chip_id(sih)) {
+-	case BCM43224_CHIP_ID:
+-	case BCM43225_CHIP_ID:
+-		if (spuravoid == 1) {
+-			bcma_write32(core, CHIPCREGOFFS(pllcontrol_addr),
+-				     PMU1_PLL0_PLLCTL0);
+-			bcma_write32(core, CHIPCREGOFFS(pllcontrol_data),
+-				     0x11500010);
+-			bcma_write32(core, CHIPCREGOFFS(pllcontrol_addr),
+-				     PMU1_PLL0_PLLCTL1);
+-			bcma_write32(core, CHIPCREGOFFS(pllcontrol_data),
+-				     0x000C0C06);
+-			bcma_write32(core, CHIPCREGOFFS(pllcontrol_addr),
+-				     PMU1_PLL0_PLLCTL2);
+-			bcma_write32(core, CHIPCREGOFFS(pllcontrol_data),
+-				     0x0F600a08);
+-			bcma_write32(core, CHIPCREGOFFS(pllcontrol_addr),
+-				     PMU1_PLL0_PLLCTL3);
+-			bcma_write32(core, CHIPCREGOFFS(pllcontrol_data),
+-				     0x00000000);
+-			bcma_write32(core, CHIPCREGOFFS(pllcontrol_addr),
+-				     PMU1_PLL0_PLLCTL4);
+-			bcma_write32(core, CHIPCREGOFFS(pllcontrol_data),
+-				     0x2001E920);
+-			bcma_write32(core, CHIPCREGOFFS(pllcontrol_addr),
+-				     PMU1_PLL0_PLLCTL5);
+-			bcma_write32(core, CHIPCREGOFFS(pllcontrol_data),
+-				     0x88888815);
+-		} else {
+-			bcma_write32(core, CHIPCREGOFFS(pllcontrol_addr),
+-				     PMU1_PLL0_PLLCTL0);
+-			bcma_write32(core, CHIPCREGOFFS(pllcontrol_data),
+-				     0x11100010);
+-			bcma_write32(core, CHIPCREGOFFS(pllcontrol_addr),
+-				     PMU1_PLL0_PLLCTL1);
+-			bcma_write32(core, CHIPCREGOFFS(pllcontrol_data),
+-				     0x000c0c06);
+-			bcma_write32(core, CHIPCREGOFFS(pllcontrol_addr),
+-				     PMU1_PLL0_PLLCTL2);
+-			bcma_write32(core, CHIPCREGOFFS(pllcontrol_data),
+-				     0x03000a08);
+-			bcma_write32(core, CHIPCREGOFFS(pllcontrol_addr),
+-				     PMU1_PLL0_PLLCTL3);
+-			bcma_write32(core, CHIPCREGOFFS(pllcontrol_data),
+-				     0x00000000);
+-			bcma_write32(core, CHIPCREGOFFS(pllcontrol_addr),
+-				     PMU1_PLL0_PLLCTL4);
+-			bcma_write32(core, CHIPCREGOFFS(pllcontrol_data),
+-				     0x200005c0);
+-			bcma_write32(core, CHIPCREGOFFS(pllcontrol_addr),
+-				     PMU1_PLL0_PLLCTL5);
+-			bcma_write32(core, CHIPCREGOFFS(pllcontrol_data),
+-				     0x88888815);
+-		}
+-		tmp = 1 << 10;
+-		break;
+-
+-	default:
+-		/* bail out */
+-		return;
+-	}
+-
+-	bcma_set32(core, CHIPCREGOFFS(pmucontrol), tmp);
+-}
+-
+ u16 si_pmu_fast_pwrup_delay(struct si_pub *sih)
+ {
+ 	uint delay = PMU_MAX_TRANSITION_DLY;
+ 
+ 	switch (ai_get_chip_id(sih)) {
+-	case BCM43224_CHIP_ID:
+-	case BCM43225_CHIP_ID:
+-	case BCM4313_CHIP_ID:
++	case BCMA_CHIP_ID_BCM43224:
++	case BCMA_CHIP_ID_BCM43225:
++	case BCMA_CHIP_ID_BCM4313:
+ 		delay = 3700;
+ 		break;
+ 	default:
+@@ -270,9 +156,9 @@ u32 si_pmu_alp_clock(struct si_pub *sih)
+ 		return clock;
+ 
+ 	switch (ai_get_chip_id(sih)) {
+-	case BCM43224_CHIP_ID:
+-	case BCM43225_CHIP_ID:
+-	case BCM4313_CHIP_ID:
++	case BCMA_CHIP_ID_BCM43224:
++	case BCMA_CHIP_ID_BCM43225:
++	case BCMA_CHIP_ID_BCM4313:
+ 		/* always 20Mhz */
+ 		clock = 20000 * 1000;
+ 		break;
+@@ -283,51 +169,9 @@ u32 si_pmu_alp_clock(struct si_pub *sih)
+ 	return clock;
+ }
+ 
+-/* initialize PMU */
+-void si_pmu_init(struct si_pub *sih)
+-{
+-	struct bcma_device *core;
+-
+-	/* select chipc */
+-	core = ai_findcore(sih, BCMA_CORE_CHIPCOMMON, 0);
+-
+-	if (ai_get_pmurev(sih) == 1)
+-		bcma_mask32(core, CHIPCREGOFFS(pmucontrol),
+-			    ~PCTL_NOILP_ON_WAIT);
+-	else if (ai_get_pmurev(sih) >= 2)
+-		bcma_set32(core, CHIPCREGOFFS(pmucontrol), PCTL_NOILP_ON_WAIT);
+-}
+-
+-/* initialize PMU resources */
+-void si_pmu_res_init(struct si_pub *sih)
+-{
+-	struct bcma_device *core;
+-	u32 min_mask = 0, max_mask = 0;
+-
+-	/* select to chipc */
+-	core = ai_findcore(sih, BCMA_CORE_CHIPCOMMON, 0);
+-
+-	/* Determine min/max rsrc masks */
+-	si_pmu_res_masks(sih, &min_mask, &max_mask);
+-
+-	/* It is required to program max_mask first and then min_mask */
+-
+-	/* Program max resource mask */
+-
+-	if (max_mask)
+-		bcma_write32(core, CHIPCREGOFFS(max_res_mask), max_mask);
+-
+-	/* Program min resource mask */
+-
+-	if (min_mask)
+-		bcma_write32(core, CHIPCREGOFFS(min_res_mask), min_mask);
+-
+-	/* Add some delay; allow resources to come up and settle. */
+-	mdelay(2);
+-}
+-
+ u32 si_pmu_measure_alpclk(struct si_pub *sih)
+ {
++	struct si_info *sii = container_of(sih, struct si_info, pub);
+ 	struct bcma_device *core;
+ 	u32 alp_khz;
+ 
+@@ -335,7 +179,7 @@ u32 si_pmu_measure_alpclk(struct si_pub
+ 		return 0;
+ 
+ 	/* Remember original core before switch to chipc */
+-	core = ai_findcore(sih, BCMA_CORE_CHIPCOMMON, 0);
++	core = sii->icbus->drv_cc.core;
+ 
+ 	if (bcma_read32(core, CHIPCREGOFFS(pmustatus)) & PST_EXTLPOAVAIL) {
+ 		u32 ilp_ctr, alp_hz;
+--- a/drivers/net/wireless/brcm80211/brcmsmac/pmu.h
++++ b/drivers/net/wireless/brcm80211/brcmsmac/pmu.h
+@@ -26,10 +26,7 @@ extern u32 si_pmu_chipcontrol(struct si_
+ extern u32 si_pmu_regcontrol(struct si_pub *sih, uint reg, u32 mask, u32 val);
+ extern u32 si_pmu_alp_clock(struct si_pub *sih);
+ extern void si_pmu_pllupd(struct si_pub *sih);
+-extern void si_pmu_spuravoid_pllupdate(struct si_pub *sih, u8 spuravoid);
+ extern u32 si_pmu_pllcontrol(struct si_pub *sih, uint reg, u32 mask, u32 val);
+-extern void si_pmu_init(struct si_pub *sih);
+-extern void si_pmu_res_init(struct si_pub *sih);
+ extern u32 si_pmu_measure_alpclk(struct si_pub *sih);
+ 
+ #endif /* _BRCM_PMU_H_ */
+--- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h
++++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h
+@@ -311,7 +311,7 @@ extern uint brcms_c_detach(struct brcms_
+ extern int brcms_c_up(struct brcms_c_info *wlc);
+ extern uint brcms_c_down(struct brcms_c_info *wlc);
+ 
+-extern bool brcms_c_chipmatch(u16 vendor, u16 device);
++extern bool brcms_c_chipmatch(struct bcma_device *core);
+ extern void brcms_c_init(struct brcms_c_info *wlc, bool mute_tx);
+ extern void brcms_c_reset(struct brcms_c_info *wlc);
+ 
+--- a/drivers/net/wireless/brcm80211/include/soc.h
++++ b/drivers/net/wireless/brcm80211/include/soc.h
+@@ -19,68 +19,6 @@
+ 
+ #define SI_ENUM_BASE		0x18000000	/* Enumeration space base */
+ 
+-/* core codes */
+-#define	NODEV_CORE_ID		0x700	/* Invalid coreid */
+-#define	CC_CORE_ID		0x800	/* chipcommon core */
+-#define	ILINE20_CORE_ID		0x801	/* iline20 core */
+-#define	SRAM_CORE_ID		0x802	/* sram core */
+-#define	SDRAM_CORE_ID		0x803	/* sdram core */
+-#define	PCI_CORE_ID		0x804	/* pci core */
+-#define	MIPS_CORE_ID		0x805	/* mips core */
+-#define	ENET_CORE_ID		0x806	/* enet mac core */
+-#define	CODEC_CORE_ID		0x807	/* v90 codec core */
+-#define	USB_CORE_ID		0x808	/* usb 1.1 host/device core */
+-#define	ADSL_CORE_ID		0x809	/* ADSL core */
+-#define	ILINE100_CORE_ID	0x80a	/* iline100 core */
+-#define	IPSEC_CORE_ID		0x80b	/* ipsec core */
+-#define	UTOPIA_CORE_ID		0x80c	/* utopia core */
+-#define	PCMCIA_CORE_ID		0x80d	/* pcmcia core */
+-#define	SOCRAM_CORE_ID		0x80e	/* internal memory core */
+-#define	MEMC_CORE_ID		0x80f	/* memc sdram core */
+-#define	OFDM_CORE_ID		0x810	/* OFDM phy core */
+-#define	EXTIF_CORE_ID		0x811	/* external interface core */
+-#define	D11_CORE_ID		0x812	/* 802.11 MAC core */
+-#define	APHY_CORE_ID		0x813	/* 802.11a phy core */
+-#define	BPHY_CORE_ID		0x814	/* 802.11b phy core */
+-#define	GPHY_CORE_ID		0x815	/* 802.11g phy core */
+-#define	MIPS33_CORE_ID		0x816	/* mips3302 core */
+-#define	USB11H_CORE_ID		0x817	/* usb 1.1 host core */
+-#define	USB11D_CORE_ID		0x818	/* usb 1.1 device core */
+-#define	USB20H_CORE_ID		0x819	/* usb 2.0 host core */
+-#define	USB20D_CORE_ID		0x81a	/* usb 2.0 device core */
+-#define	SDIOH_CORE_ID		0x81b	/* sdio host core */
+-#define	ROBO_CORE_ID		0x81c	/* roboswitch core */
+-#define	ATA100_CORE_ID		0x81d	/* parallel ATA core */
+-#define	SATAXOR_CORE_ID		0x81e	/* serial ATA & XOR DMA core */
+-#define	GIGETH_CORE_ID		0x81f	/* gigabit ethernet core */
+-#define	PCIE_CORE_ID		0x820	/* pci express core */
+-#define	NPHY_CORE_ID		0x821	/* 802.11n 2x2 phy core */
+-#define	SRAMC_CORE_ID		0x822	/* SRAM controller core */
+-#define	MINIMAC_CORE_ID		0x823	/* MINI MAC/phy core */
+-#define	ARM11_CORE_ID		0x824	/* ARM 1176 core */
+-#define	ARM7S_CORE_ID		0x825	/* ARM7tdmi-s core */
+-#define	LPPHY_CORE_ID		0x826	/* 802.11a/b/g phy core */
+-#define	PMU_CORE_ID		0x827	/* PMU core */
+-#define	SSNPHY_CORE_ID		0x828	/* 802.11n single-stream phy core */
+-#define	SDIOD_CORE_ID		0x829	/* SDIO device core */
+-#define	ARMCM3_CORE_ID		0x82a	/* ARM Cortex M3 core */
+-#define	HTPHY_CORE_ID		0x82b	/* 802.11n 4x4 phy core */
+-#define	MIPS74K_CORE_ID		0x82c	/* mips 74k core */
+-#define	GMAC_CORE_ID		0x82d	/* Gigabit MAC core */
+-#define	DMEMC_CORE_ID		0x82e	/* DDR1/2 memory controller core */
+-#define	PCIERC_CORE_ID		0x82f	/* PCIE Root Complex core */
+-#define	OCP_CORE_ID		0x830	/* OCP2OCP bridge core */
+-#define	SC_CORE_ID		0x831	/* shared common core */
+-#define	AHB_CORE_ID		0x832	/* OCP2AHB bridge core */
+-#define	SPIH_CORE_ID		0x833	/* SPI host core */
+-#define	I2S_CORE_ID		0x834	/* I2S core */
+-#define	DMEMS_CORE_ID		0x835	/* SDR/DDR1 memory controller core */
+-#define	DEF_SHIM_COMP		0x837	/* SHIM component in ubus/6362 */
+-#define OOB_ROUTER_CORE_ID	0x367	/* OOB router core ID */
+-#define	DEF_AI_COMP		0xfff	/* Default component, in ai chips it
+-					 * maps all unused address ranges
+-					 */
+-
+ /* Common core control flags */
+ #define	SICF_BIST_EN		0x8000
+ #define	SICF_PME_EN		0x4000
diff --git a/package/mac80211/patches/840-brcmsmac-remove-PCIE.patch b/package/mac80211/patches/840-brcmsmac-remove-PCIE.patch
deleted file mode 100644
index ccb6fd09b7433427b28c7235a79b7e202f2fba67..0000000000000000000000000000000000000000
--- a/package/mac80211/patches/840-brcmsmac-remove-PCIE.patch
+++ /dev/null
@@ -1,31 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
-@@ -320,9 +320,7 @@
- #define	IS_SIM(chippkg)	\
- 	((chippkg == HDLSIM_PKG_ID) || (chippkg == HWSIM_PKG_ID))
- 
--#define PCIE(sih)	(ai_get_buscoretype(sih) == PCIE_CORE_ID)
--
--#define PCI_FORCEHT(sih) (PCIE(sih) && (ai_get_chip_id(sih) == BCM4716_CHIP_ID))
-+#define PCI_FORCEHT(sih) ((ai_get_buscoretype(sih) == PCIE_CORE_ID) && (ai_get_chip_id(sih) == BCM4716_CHIP_ID))
- 
- #ifdef DEBUG
- #define	SI_MSG(fmt, ...)	pr_debug(fmt, ##__VA_ARGS__)
-@@ -776,7 +774,7 @@ void ai_pci_up(struct si_pub *sih)
- 		bcma_core_set_clockmode(cc, BCMA_CLKMODE_FAST);
- 	}
- 
--	if (PCIE(sih))
-+	if (sii->icbus->hosttype == BCMA_HOSTTYPE_PCI)
- 		bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci, true);
- }
- 
-@@ -794,7 +792,7 @@ void ai_pci_down(struct si_pub *sih)
- 		bcma_core_set_clockmode(cc, BCMA_CLKMODE_DYNAMIC);
- 	}
- 
--	if (PCIE(sih))
-+	if (sii->icbus->hosttype == BCMA_HOSTTYPE_PCI)
- 		bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci, false);
- }
- 
diff --git a/package/mac80211/patches/841-brcmsmac-remove-PCI_FORCEHT.patch b/package/mac80211/patches/841-brcmsmac-remove-PCI_FORCEHT.patch
deleted file mode 100644
index 0777a7822a05f27582f5384a8ea5b964a0b01fda..0000000000000000000000000000000000000000
--- a/package/mac80211/patches/841-brcmsmac-remove-PCI_FORCEHT.patch
+++ /dev/null
@@ -1,54 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
-@@ -320,8 +320,6 @@
- #define	IS_SIM(chippkg)	\
- 	((chippkg == HDLSIM_PKG_ID) || (chippkg == HWSIM_PKG_ID))
- 
--#define PCI_FORCEHT(sih) ((ai_get_buscoretype(sih) == PCIE_CORE_ID) && (ai_get_chip_id(sih) == BCM4716_CHIP_ID))
--
- #ifdef DEBUG
- #define	SI_MSG(fmt, ...)	pr_debug(fmt, ##__VA_ARGS__)
- #else
-@@ -754,9 +752,6 @@ bool ai_clkctl_cc(struct si_pub *sih, en
- 
- 	sii = (struct si_info *)sih;
- 
--	if (PCI_FORCEHT(sih))
--		return mode == BCMA_CLKMODE_FAST;
--
- 	cc = ai_findcore(&sii->pub, BCMA_CORE_CHIPCOMMON, 0);
- 	bcma_core_set_clockmode(cc, mode);
- 	return mode == BCMA_CLKMODE_FAST;
-@@ -765,15 +760,9 @@ bool ai_clkctl_cc(struct si_pub *sih, en
- void ai_pci_up(struct si_pub *sih)
- {
- 	struct si_info *sii;
--	struct bcma_device *cc;
- 
- 	sii = (struct si_info *)sih;
- 
--	if (PCI_FORCEHT(sih)) {
--		cc = ai_findcore(&sii->pub, BCMA_CORE_CHIPCOMMON, 0);
--		bcma_core_set_clockmode(cc, BCMA_CLKMODE_FAST);
--	}
--
- 	if (sii->icbus->hosttype == BCMA_HOSTTYPE_PCI)
- 		bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci, true);
- }
-@@ -782,16 +771,9 @@ void ai_pci_up(struct si_pub *sih)
- void ai_pci_down(struct si_pub *sih)
- {
- 	struct si_info *sii;
--	struct bcma_device *cc;
- 
- 	sii = (struct si_info *)sih;
- 
--	/* release FORCEHT since chip is going to "down" state */
--	if (PCI_FORCEHT(sih)) {
--		cc = ai_findcore(&sii->pub, BCMA_CORE_CHIPCOMMON, 0);
--		bcma_core_set_clockmode(cc, BCMA_CLKMODE_DYNAMIC);
--	}
--
- 	if (sii->icbus->hosttype == BCMA_HOSTTYPE_PCI)
- 		bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci, false);
- }
diff --git a/package/mac80211/patches/842-brcmsmac-remove-ai_get_buscoretype-and-ai_get_buscor.patch b/package/mac80211/patches/842-brcmsmac-remove-ai_get_buscoretype-and-ai_get_buscor.patch
deleted file mode 100644
index 6d98defdde3fdc12cb52bb8c737ef8b2e09127c3..0000000000000000000000000000000000000000
--- a/package/mac80211/patches/842-brcmsmac-remove-ai_get_buscoretype-and-ai_get_buscor.patch
+++ /dev/null
@@ -1,48 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
-@@ -471,9 +471,6 @@ ai_buscore_setup(struct si_info *sii, st
- 		sii->pub.pmurev = sii->pub.pmucaps & PCAP_REV_MASK;
- 	}
- 
--	/* figure out buscore */
--	sii->buscore = ai_findcore(&sii->pub, PCIE_CORE_ID, 0);
--
- 	return true;
- }
- 
-@@ -806,15 +803,3 @@ bool ai_deviceremoved(struct si_pub *sih
- 
- 	return false;
- }
--
--uint ai_get_buscoretype(struct si_pub *sih)
--{
--	struct si_info *sii = (struct si_info *)sih;
--	return sii->buscore->id.id;
--}
--
--uint ai_get_buscorerev(struct si_pub *sih)
--{
--	struct si_info *sii = (struct si_info *)sih;
--	return sii->buscore->id.rev;
--}
---- a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.h
-@@ -168,7 +168,6 @@ struct si_info {
- 	struct si_pub pub;	/* back plane public state (must be first) */
- 	struct bcma_bus *icbus;	/* handle to soc interconnect bus */
- 	struct pci_dev *pcibus;	/* handle to pci bus */
--	struct bcma_device *buscore;
- 
- 	u32 chipst;		/* chip status */
- };
-@@ -202,9 +201,6 @@ extern void ai_pci_up(struct si_pub *sih
- /* Enable Ex-PA for 4313 */
- extern void ai_epa_4313war(struct si_pub *sih);
- 
--extern uint ai_get_buscoretype(struct si_pub *sih);
--extern uint ai_get_buscorerev(struct si_pub *sih);
--
- static inline u32 ai_get_cccaps(struct si_pub *sih)
- {
- 	return sih->cccaps;
diff --git a/package/mac80211/patches/843-brcmsmac-use-container_of-instead-of-cast.patch b/package/mac80211/patches/843-brcmsmac-use-container_of-instead-of-cast.patch
deleted file mode 100644
index a90f7043b8af5b7d8f6809a50a10191b83d90623..0000000000000000000000000000000000000000
--- a/package/mac80211/patches/843-brcmsmac-use-container_of-instead-of-cast.patch
+++ /dev/null
@@ -1,74 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
-@@ -584,7 +584,7 @@ void ai_detach(struct si_pub *sih)
- 	struct si_pub *si_local = NULL;
- 	memcpy(&si_local, &sih, sizeof(struct si_pub **));
- 
--	sii = (struct si_info *)sih;
-+	sii = container_of(sih, struct si_info, pub);
- 
- 	if (sii == NULL)
- 		return;
-@@ -599,7 +599,7 @@ struct bcma_device *ai_findcore(struct s
- 	struct si_info *sii;
- 	uint found;
- 
--	sii = (struct si_info *)sih;
-+	sii = container_of(sih, struct si_info, pub);
- 
- 	found = 0;
- 
-@@ -622,7 +622,7 @@ uint ai_cc_reg(struct si_pub *sih, uint 
- 	u32 w;
- 	struct si_info *sii;
- 
--	sii = (struct si_info *)sih;
-+	sii = container_of(sih, struct si_info, pub);
- 	cc = sii->icbus->drv_cc.core;
- 
- 	/* mask and set */
-@@ -715,7 +715,7 @@ u16 ai_clkctl_fast_pwrup_delay(struct si
- 	uint slowminfreq;
- 	u16 fpdelay;
- 
--	sii = (struct si_info *)sih;
-+	sii = container_of(sih, struct si_info, pub);
- 	if (ai_get_cccaps(sih) & CC_CAP_PMU) {
- 		fpdelay = si_pmu_fast_pwrup_delay(sih);
- 		return fpdelay;
-@@ -747,7 +747,7 @@ bool ai_clkctl_cc(struct si_pub *sih, en
- 	struct si_info *sii;
- 	struct bcma_device *cc;
- 
--	sii = (struct si_info *)sih;
-+	sii = container_of(sih, struct si_info, pub);
- 
- 	cc = ai_findcore(&sii->pub, BCMA_CORE_CHIPCOMMON, 0);
- 	bcma_core_set_clockmode(cc, mode);
-@@ -758,7 +758,7 @@ void ai_pci_up(struct si_pub *sih)
- {
- 	struct si_info *sii;
- 
--	sii = (struct si_info *)sih;
-+	sii = container_of(sih, struct si_info, pub);
- 
- 	if (sii->icbus->hosttype == BCMA_HOSTTYPE_PCI)
- 		bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci, true);
-@@ -769,7 +769,7 @@ void ai_pci_down(struct si_pub *sih)
- {
- 	struct si_info *sii;
- 
--	sii = (struct si_info *)sih;
-+	sii = container_of(sih, struct si_info, pub);
- 
- 	if (sii->icbus->hosttype == BCMA_HOSTTYPE_PCI)
- 		bcma_core_pci_extend_L1timer(&sii->icbus->drv_pci, false);
-@@ -792,7 +792,7 @@ bool ai_deviceremoved(struct si_pub *sih
- 	u32 w;
- 	struct si_info *sii;
- 
--	sii = (struct si_info *)sih;
-+	sii = container_of(sih, struct si_info, pub);
- 
- 	if (sii->icbus->hosttype != BCMA_HOSTTYPE_PCI)
- 		return false;
diff --git a/package/mac80211/patches/844-brcmsmac-remove-ai_findcore.patch b/package/mac80211/patches/844-brcmsmac-remove-ai_findcore.patch
deleted file mode 100644
index 0e8750de479139dc3277774920723457e9f8d12c..0000000000000000000000000000000000000000
--- a/package/mac80211/patches/844-brcmsmac-remove-ai_findcore.patch
+++ /dev/null
@@ -1,145 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.c
-@@ -592,27 +592,6 @@ void ai_detach(struct si_pub *sih)
- 	kfree(sii);
- }
- 
--/* return index of coreid or BADIDX if not found */
--struct bcma_device *ai_findcore(struct si_pub *sih, u16 coreid, u16 coreunit)
--{
--	struct bcma_device *core;
--	struct si_info *sii;
--	uint found;
--
--	sii = container_of(sih, struct si_info, pub);
--
--	found = 0;
--
--	list_for_each_entry(core, &sii->icbus->cores, list)
--		if (core->id.id == coreid) {
--			if (found == coreunit)
--				return core;
--			found++;
--		}
--
--	return NULL;
--}
--
- /*
-  * read/modify chipcommon core register.
-  */
-@@ -688,12 +667,13 @@ ai_clkctl_setdelay(struct si_pub *sih, s
- /* initialize power control delay registers */
- void ai_clkctl_init(struct si_pub *sih)
- {
-+	struct si_info *sii = container_of(sih, struct si_info, pub);
- 	struct bcma_device *cc;
- 
- 	if (!(ai_get_cccaps(sih) & CC_CAP_PWR_CTL))
- 		return;
- 
--	cc = ai_findcore(sih, BCMA_CORE_CHIPCOMMON, 0);
-+	cc = sii->icbus->drv_cc.core;;
- 	if (cc == NULL)
- 		return;
- 
-@@ -725,7 +705,7 @@ u16 ai_clkctl_fast_pwrup_delay(struct si
- 		return 0;
- 
- 	fpdelay = 0;
--	cc = ai_findcore(sih, CC_CORE_ID, 0);
-+	cc = sii->icbus->drv_cc.core;;
- 	if (cc) {
- 		slowminfreq = ai_slowclk_freq(sih, false, cc);
- 		fpdelay = (((bcma_read32(cc, CHIPCREGOFFS(pll_on_delay)) + 2)
-@@ -749,7 +729,7 @@ bool ai_clkctl_cc(struct si_pub *sih, en
- 
- 	sii = container_of(sih, struct si_info, pub);
- 
--	cc = ai_findcore(&sii->pub, BCMA_CORE_CHIPCOMMON, 0);
-+	cc = sii->icbus->drv_cc.core;;
- 	bcma_core_set_clockmode(cc, mode);
- 	return mode == BCMA_CLKMODE_FAST;
- }
-@@ -778,9 +758,10 @@ void ai_pci_down(struct si_pub *sih)
- /* Enable BT-COEX & Ex-PA for 4313 */
- void ai_epa_4313war(struct si_pub *sih)
- {
-+	struct si_info *sii =container_of(sih, struct si_info, pub);
- 	struct bcma_device *cc;
- 
--	cc = ai_findcore(sih, CC_CORE_ID, 0);
-+	cc = sii->icbus->drv_cc.core;
- 
- 	/* EPA Fix */
- 	bcma_set32(cc, CHIPCREGOFFS(gpiocontrol), GPIO_CTRL_EPA_EN_MASK);
---- a/drivers/net/wireless/brcm80211/brcmsmac/aiutils.h
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/aiutils.h
-@@ -182,8 +182,6 @@ struct si_info {
- 
- 
- /* AMBA Interconnect exported externs */
--extern struct bcma_device *ai_findcore(struct si_pub *sih,
--				       u16 coreid, u16 coreunit);
- extern u32 ai_core_cflags(struct bcma_device *core, u32 mask, u32 val);
- 
- /* === exported functions === */
---- a/drivers/net/wireless/brcm80211/brcmsmac/pmu.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/pmu.c
-@@ -142,10 +142,11 @@ static void si_pmu_res_masks(struct si_p
- void si_pmu_spuravoid_pllupdate(struct si_pub *sih, u8 spuravoid)
- {
- 	u32 tmp = 0;
-+	struct si_info *sii = container_of(sih, struct si_info, pub);
- 	struct bcma_device *core;
- 
- 	/* switch to chipc */
--	core = ai_findcore(sih, BCMA_CORE_CHIPCOMMON, 0);
-+	core = sii->icbus->drv_cc.core;
- 
- 	switch (ai_get_chip_id(sih)) {
- 	case BCM43224_CHIP_ID:
-@@ -286,10 +287,11 @@ u32 si_pmu_alp_clock(struct si_pub *sih)
- /* initialize PMU */
- void si_pmu_init(struct si_pub *sih)
- {
-+	struct si_info *sii = container_of(sih, struct si_info, pub);
- 	struct bcma_device *core;
- 
- 	/* select chipc */
--	core = ai_findcore(sih, BCMA_CORE_CHIPCOMMON, 0);
-+	core = sii->icbus->drv_cc.core;
- 
- 	if (ai_get_pmurev(sih) == 1)
- 		bcma_mask32(core, CHIPCREGOFFS(pmucontrol),
-@@ -301,11 +303,12 @@ void si_pmu_init(struct si_pub *sih)
- /* initialize PMU resources */
- void si_pmu_res_init(struct si_pub *sih)
- {
-+	struct si_info *sii = container_of(sih, struct si_info, pub);
- 	struct bcma_device *core;
- 	u32 min_mask = 0, max_mask = 0;
- 
- 	/* select to chipc */
--	core = ai_findcore(sih, BCMA_CORE_CHIPCOMMON, 0);
-+	core = sii->icbus->drv_cc.core;
- 
- 	/* Determine min/max rsrc masks */
- 	si_pmu_res_masks(sih, &min_mask, &max_mask);
-@@ -328,6 +331,7 @@ void si_pmu_res_init(struct si_pub *sih)
- 
- u32 si_pmu_measure_alpclk(struct si_pub *sih)
- {
-+	struct si_info *sii = container_of(sih, struct si_info, pub);
- 	struct bcma_device *core;
- 	u32 alp_khz;
- 
-@@ -335,7 +339,7 @@ u32 si_pmu_measure_alpclk(struct si_pub 
- 		return 0;
- 
- 	/* Remember original core before switch to chipc */
--	core = ai_findcore(sih, BCMA_CORE_CHIPCOMMON, 0);
-+	core = sii->icbus->drv_cc.core;
- 
- 	if (bcma_read32(core, CHIPCREGOFFS(pmustatus)) & PST_EXTLPOAVAIL) {
- 		u32 ilp_ctr, alp_hz;
diff --git a/package/mac80211/patches/845-brcmsmac-use-core-id-constants-from-bcma.patch b/package/mac80211/patches/845-brcmsmac-use-core-id-constants-from-bcma.patch
deleted file mode 100644
index 167f373ab041c02bdbc2bf81638e8a233e70da1c..0000000000000000000000000000000000000000
--- a/package/mac80211/patches/845-brcmsmac-use-core-id-constants-from-bcma.patch
+++ /dev/null
@@ -1,86 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/dma.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/dma.c
-@@ -640,10 +640,10 @@ struct dma_pub *dma_attach(char *name, s
- 	di->dataoffsetlow = di->ddoffsetlow;
- 	di->dataoffsethigh = di->ddoffsethigh;
- 	/* WAR64450 : DMACtl.Addr ext fields are not supported in SDIOD core. */
--	if ((core->id.id == SDIOD_CORE_ID)
-+	if ((core->id.id == BCMA_CORE_SDIO_DEV)
- 	    && ((rev > 0) && (rev <= 2)))
- 		di->addrext = false;
--	else if ((core->id.id == I2S_CORE_ID) &&
-+	else if ((core->id.id == BCMA_CORE_I2S) &&
- 		 ((rev == 0) || (rev == 1)))
- 		di->addrext = false;
- 	else
---- a/drivers/net/wireless/brcm80211/include/soc.h
-+++ b/drivers/net/wireless/brcm80211/include/soc.h
-@@ -19,68 +19,6 @@
- 
- #define SI_ENUM_BASE		0x18000000	/* Enumeration space base */
- 
--/* core codes */
--#define	NODEV_CORE_ID		0x700	/* Invalid coreid */
--#define	CC_CORE_ID		0x800	/* chipcommon core */
--#define	ILINE20_CORE_ID		0x801	/* iline20 core */
--#define	SRAM_CORE_ID		0x802	/* sram core */
--#define	SDRAM_CORE_ID		0x803	/* sdram core */
--#define	PCI_CORE_ID		0x804	/* pci core */
--#define	MIPS_CORE_ID		0x805	/* mips core */
--#define	ENET_CORE_ID		0x806	/* enet mac core */
--#define	CODEC_CORE_ID		0x807	/* v90 codec core */
--#define	USB_CORE_ID		0x808	/* usb 1.1 host/device core */
--#define	ADSL_CORE_ID		0x809	/* ADSL core */
--#define	ILINE100_CORE_ID	0x80a	/* iline100 core */
--#define	IPSEC_CORE_ID		0x80b	/* ipsec core */
--#define	UTOPIA_CORE_ID		0x80c	/* utopia core */
--#define	PCMCIA_CORE_ID		0x80d	/* pcmcia core */
--#define	SOCRAM_CORE_ID		0x80e	/* internal memory core */
--#define	MEMC_CORE_ID		0x80f	/* memc sdram core */
--#define	OFDM_CORE_ID		0x810	/* OFDM phy core */
--#define	EXTIF_CORE_ID		0x811	/* external interface core */
--#define	D11_CORE_ID		0x812	/* 802.11 MAC core */
--#define	APHY_CORE_ID		0x813	/* 802.11a phy core */
--#define	BPHY_CORE_ID		0x814	/* 802.11b phy core */
--#define	GPHY_CORE_ID		0x815	/* 802.11g phy core */
--#define	MIPS33_CORE_ID		0x816	/* mips3302 core */
--#define	USB11H_CORE_ID		0x817	/* usb 1.1 host core */
--#define	USB11D_CORE_ID		0x818	/* usb 1.1 device core */
--#define	USB20H_CORE_ID		0x819	/* usb 2.0 host core */
--#define	USB20D_CORE_ID		0x81a	/* usb 2.0 device core */
--#define	SDIOH_CORE_ID		0x81b	/* sdio host core */
--#define	ROBO_CORE_ID		0x81c	/* roboswitch core */
--#define	ATA100_CORE_ID		0x81d	/* parallel ATA core */
--#define	SATAXOR_CORE_ID		0x81e	/* serial ATA & XOR DMA core */
--#define	GIGETH_CORE_ID		0x81f	/* gigabit ethernet core */
--#define	PCIE_CORE_ID		0x820	/* pci express core */
--#define	NPHY_CORE_ID		0x821	/* 802.11n 2x2 phy core */
--#define	SRAMC_CORE_ID		0x822	/* SRAM controller core */
--#define	MINIMAC_CORE_ID		0x823	/* MINI MAC/phy core */
--#define	ARM11_CORE_ID		0x824	/* ARM 1176 core */
--#define	ARM7S_CORE_ID		0x825	/* ARM7tdmi-s core */
--#define	LPPHY_CORE_ID		0x826	/* 802.11a/b/g phy core */
--#define	PMU_CORE_ID		0x827	/* PMU core */
--#define	SSNPHY_CORE_ID		0x828	/* 802.11n single-stream phy core */
--#define	SDIOD_CORE_ID		0x829	/* SDIO device core */
--#define	ARMCM3_CORE_ID		0x82a	/* ARM Cortex M3 core */
--#define	HTPHY_CORE_ID		0x82b	/* 802.11n 4x4 phy core */
--#define	MIPS74K_CORE_ID		0x82c	/* mips 74k core */
--#define	GMAC_CORE_ID		0x82d	/* Gigabit MAC core */
--#define	DMEMC_CORE_ID		0x82e	/* DDR1/2 memory controller core */
--#define	PCIERC_CORE_ID		0x82f	/* PCIE Root Complex core */
--#define	OCP_CORE_ID		0x830	/* OCP2OCP bridge core */
--#define	SC_CORE_ID		0x831	/* shared common core */
--#define	AHB_CORE_ID		0x832	/* OCP2AHB bridge core */
--#define	SPIH_CORE_ID		0x833	/* SPI host core */
--#define	I2S_CORE_ID		0x834	/* I2S core */
--#define	DMEMS_CORE_ID		0x835	/* SDR/DDR1 memory controller core */
--#define	DEF_SHIM_COMP		0x837	/* SHIM component in ubus/6362 */
--#define OOB_ROUTER_CORE_ID	0x367	/* OOB router core ID */
--#define	DEF_AI_COMP		0xfff	/* Default component, in ai chips it
--					 * maps all unused address ranges
--					 */
--
- /* Common core control flags */
- #define	SICF_BIST_EN		0x8000
- #define	SICF_PME_EN		0x4000
diff --git a/package/mac80211/patches/846-brcmsmac-remove-some-unnessessacry-casts-and-void-po.patch b/package/mac80211/patches/846-brcmsmac-remove-some-unnessessacry-casts-and-void-po.patch
deleted file mode 100644
index dacc2d230d0438502a16e472d0b4bcdbdd4dec23..0000000000000000000000000000000000000000
--- a/package/mac80211/patches/846-brcmsmac-remove-some-unnessessacry-casts-and-void-po.patch
+++ /dev/null
@@ -1,36 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -4220,9 +4220,8 @@ static void brcms_c_radio_timer(void *ar
- }
- 
- /* common low-level watchdog code */
--static void brcms_b_watchdog(void *arg)
-+static void brcms_b_watchdog(struct brcms_c_info *wlc)
- {
--	struct brcms_c_info *wlc = (struct brcms_c_info *) arg;
- 	struct brcms_hardware *wlc_hw = wlc->hw;
- 
- 	BCMMSG(wlc->wiphy, "wl%d\n", wlc_hw->unit);
-@@ -4243,10 +4242,8 @@ static void brcms_b_watchdog(void *arg)
- }
- 
- /* common watchdog code */
--static void brcms_c_watchdog(void *arg)
-+static void brcms_c_watchdog(struct brcms_c_info *wlc)
- {
--	struct brcms_c_info *wlc = (struct brcms_c_info *) arg;
--
- 	BCMMSG(wlc->wiphy, "wl%d\n", wlc->pub->unit);
- 
- 	if (!wlc->pub->up)
-@@ -4286,7 +4283,9 @@ static void brcms_c_watchdog(void *arg)
- 
- static void brcms_c_watchdog_by_timer(void *arg)
- {
--	brcms_c_watchdog(arg);
-+	struct brcms_c_info *wlc = (struct brcms_c_info *) arg;
-+
-+	brcms_c_watchdog(wlc);
- }
- 
- static bool brcms_c_timers_init(struct brcms_c_info *wlc, int unit)
diff --git a/package/mac80211/patches/847-brcmsmac-add-suome-conditions-for-the-bcm4716-again.patch b/package/mac80211/patches/847-brcmsmac-add-suome-conditions-for-the-bcm4716-again.patch
deleted file mode 100644
index 9da72691100b88caa935ca81a1f51123771886e6..0000000000000000000000000000000000000000
--- a/package/mac80211/patches/847-brcmsmac-add-suome-conditions-for-the-bcm4716-again.patch
+++ /dev/null
@@ -1,202 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -1944,7 +1944,8 @@ static bool brcms_b_radio_read_hwdisable
- 		 * accesses phyreg throughput mac. This can be skipped since
- 		 * only mac reg is accessed below
- 		 */
--		flags |= SICF_PCLKE;
-+		if (D11REV_GE(wlc_hw->corerev, 18))
-+			flags |= SICF_PCLKE;
- 
- 		/*
- 		 * TODO: test suspend/resume
-@@ -2025,7 +2026,8 @@ void brcms_b_corereset(struct brcms_hard
- 	 * phyreg throughput mac, AND phy_reset is skipped at early stage when
- 	 * band->pi is invalid. need to enable PHY CLK
- 	 */
--	flags |= SICF_PCLKE;
-+	if (D11REV_GE(wlc_hw->corerev, 18))
-+		flags |= SICF_PCLKE;
- 
- 	/*
- 	 * reset the core
---- a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_n.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_n.c
-@@ -17895,6 +17895,9 @@ static u32 *wlc_phy_get_ipa_gaintbl_nphy
- 					nphy_tpc_txgain_ipa_2g_2057rev7;
- 		} else if (NREV_IS(pi->pubpi.phy_rev, 6)) {
- 			tx_pwrctrl_tbl = nphy_tpc_txgain_ipa_rev6;
-+			if (pi->sh->chip == BCM47162_CHIP_ID) {
-+				tx_pwrctrl_tbl = nphy_tpc_txgain_ipa_rev5;
-+			}
- 		} else if (NREV_IS(pi->pubpi.phy_rev, 5)) {
- 			tx_pwrctrl_tbl = nphy_tpc_txgain_ipa_rev5;
- 		} else {
-@@ -19256,8 +19259,14 @@ static void wlc_phy_spurwar_nphy(struct 
- 			case 38:
- 			case 102:
- 			case 118:
--				nphy_adj_tone_id_buf[0] = 0;
--				nphy_adj_noise_var_buf[0] = 0x0;
-+				if ((pi->sh->chip == BCM4716_CHIP_ID) &&
-+				    (pi->sh->chippkg == BCM4717_PKG_ID)) {
-+					nphy_adj_tone_id_buf[0] = 32;
-+					nphy_adj_noise_var_buf[0] = 0x21f;
-+				} else {
-+					nphy_adj_tone_id_buf[0] = 0;
-+					nphy_adj_noise_var_buf[0] = 0x0;
-+				}
- 				break;
- 			case 134:
- 				nphy_adj_tone_id_buf[0] = 32;
-@@ -20697,12 +20706,22 @@ wlc_phy_chanspec_radio2056_setup(struct 
- 			write_radio_reg(pi, RADIO_2056_SYN_PLL_LOOPFILTER2 |
- 					RADIO_2056_SYN, 0x1f);
- 
--			write_radio_reg(pi,
--					RADIO_2056_SYN_PLL_LOOPFILTER4 |
--					RADIO_2056_SYN, 0xb);
--			write_radio_reg(pi,
--					RADIO_2056_SYN_PLL_CP2 |
--					RADIO_2056_SYN, 0x14);
-+			if ((pi->sh->chip == BCM4716_CHIP_ID) ||
-+			    (pi->sh->chip == BCM47162_CHIP_ID)) {
-+				write_radio_reg(pi,
-+						RADIO_2056_SYN_PLL_LOOPFILTER4 |
-+						RADIO_2056_SYN, 0x14);
-+				write_radio_reg(pi,
-+						RADIO_2056_SYN_PLL_CP2 |
-+						RADIO_2056_SYN, 0x00);
-+			} else {
-+				write_radio_reg(pi,
-+						RADIO_2056_SYN_PLL_LOOPFILTER4 |
-+						RADIO_2056_SYN, 0xb);
-+				write_radio_reg(pi,
-+						RADIO_2056_SYN_PLL_CP2 |
-+						RADIO_2056_SYN, 0x14);
-+			}
- 		}
- 	}
- 
-@@ -20749,24 +20768,33 @@ wlc_phy_chanspec_radio2056_setup(struct 
- 				WRITE_RADIO_REG2(pi, RADIO_2056, TX, core,
- 						 PADG_IDAC, 0xcc);
- 
--				bias = 0x25;
--				cascbias = 0x20;
-+				if ((pi->sh->chip == BCM4716_CHIP_ID) ||
-+				    (pi->sh->chip ==
-+				     BCM47162_CHIP_ID)) {
-+					bias = 0x40;
-+					cascbias = 0x45;
-+					pag_boost_tune = 0x5;
-+					pgag_boost_tune = 0x33;
-+					padg_boost_tune = 0x77;
-+					mixg_boost_tune = 0x55;
-+				} else {
-+					bias = 0x25;
-+					cascbias = 0x20;
- 
--				if ((pi->sh->chip ==
--				     BCM43224_CHIP_ID)
--				    || (pi->sh->chip ==
--					BCM43225_CHIP_ID)) {
--					if (pi->sh->chippkg ==
--					    BCM43224_FAB_SMIC) {
--						bias = 0x2a;
--						cascbias = 0x38;
-+					if ((pi->sh->chip == BCM43224_CHIP_ID)
-+					    || (pi->sh->chip ==	BCM43225_CHIP_ID)) {
-+						if (pi->sh->chippkg ==
-+						    BCM43224_FAB_SMIC) {
-+							bias = 0x2a;
-+							cascbias = 0x38;
-+						}
- 					}
--				}
- 
--				pag_boost_tune = 0x4;
--				pgag_boost_tune = 0x03;
--				padg_boost_tune = 0x77;
--				mixg_boost_tune = 0x65;
-+					pag_boost_tune = 0x4;
-+					pgag_boost_tune = 0x03;
-+					padg_boost_tune = 0x77;
-+					mixg_boost_tune = 0x65;
-+				}
- 
- 				WRITE_RADIO_REG2(pi, RADIO_2056, TX, core,
- 						 INTPAG_IMAIN_STAT, bias);
-@@ -21180,19 +21208,27 @@ wlc_phy_chanspec_nphy_setup(struct brcms
- 		} else if (NREV_GE(pi->pubpi.phy_rev, 7)) {
- 			if (val == 54)
- 				spuravoid = 1;
--		} else {
--			if (pi->nphy_aband_spurwar_en &&
--			    ((val == 38) || (val == 102)
--			     || (val == 118)))
-+		} else if (pi->nphy_aband_spurwar_en &&
-+			    ((val == 38) || (val == 102) || (val == 118))) {
-+			if ((pi->sh->chip == BCM4716_CHIP_ID)
-+			    && (pi->sh->chippkg == BCM4717_PKG_ID)) {
-+				spuravoid = 0;
-+			} else {
- 				spuravoid = 1;
-+			}
- 		}
- 
- 		if (pi->phy_spuravoid == SPURAVOID_FORCEON)
- 			spuravoid = 1;
- 
--		wlapi_bmac_core_phypll_ctl(pi->sh->physhim, false);
--		si_pmu_spuravoid_pllupdate(pi->sh->sih, spuravoid);
--		wlapi_bmac_core_phypll_ctl(pi->sh->physhim, true);
-+		if ((pi->sh->chip == BCM4716_CHIP_ID) ||
-+		    (pi->sh->chip == BCM47162_CHIP_ID)) {
-+			si_pmu_spuravoid_pllupdate(pi->sh->sih, spuravoid);
-+		} else {
-+			wlapi_bmac_core_phypll_ctl(pi->sh->physhim, false);
-+			si_pmu_spuravoid_pllupdate(pi->sh->sih, spuravoid);
-+			wlapi_bmac_core_phypll_ctl(pi->sh->physhim, true);
-+		}
- 
- 		if ((pi->sh->chip == BCM43224_CHIP_ID) ||
- 		    (pi->sh->chip == BCM43225_CHIP_ID)) {
-@@ -21211,7 +21247,10 @@ wlc_phy_chanspec_nphy_setup(struct brcms
- 			}
- 		}
- 
--		wlapi_bmac_core_phypll_reset(pi->sh->physhim);
-+		if (!((pi->sh->chip == BCM4716_CHIP_ID) ||
-+		      (pi->sh->chip == BCM47162_CHIP_ID))) {
-+			wlapi_bmac_core_phypll_reset(pi->sh->physhim);
-+		}
- 
- 		mod_phy_reg(pi, 0x01, (0x1 << 15),
- 			    ((spuravoid > 0) ? (0x1 << 15) : 0));
-@@ -24925,14 +24964,20 @@ wlc_phy_a2_nphy(struct brcms_phy *pi, st
- 			if (txgains->useindex) {
- 				phy_a4 = 15 - ((txgains->index) >> 3);
- 				if (CHSPEC_IS2G(pi->radio_chanspec)) {
--					if (NREV_GE(pi->pubpi.phy_rev, 6))
-+					if (NREV_GE(pi->pubpi.phy_rev, 6)) {
- 						phy_a5 = 0x00f7 | (phy_a4 << 8);
--
--					else
--					if (NREV_IS(pi->pubpi.phy_rev, 5))
-+						if (pi->sh->chip ==
-+						    BCM47162_CHIP_ID) {
-+							phy_a5 =
-+							    0x10f7 | (phy_a4 <<
-+								      8);
-+						}
-+					} else
-+					if (NREV_IS(pi->pubpi.phy_rev, 5)) {
- 						phy_a5 = 0x10f7 | (phy_a4 << 8);
--					else
-+					} else {
- 						phy_a5 = 0x50f7 | (phy_a4 << 8);
-+					}
- 				} else {
- 					phy_a5 = 0x70f7 | (phy_a4 << 8);
- 				}
diff --git a/package/mac80211/patches/848-brcmsmac-some-more-fixes-for-different-core-revs.patch b/package/mac80211/patches/848-brcmsmac-some-more-fixes-for-different-core-revs.patch
deleted file mode 100644
index f6efb714bdee23f035e4a630a8e042a9b561e598..0000000000000000000000000000000000000000
--- a/package/mac80211/patches/848-brcmsmac-some-more-fixes-for-different-core-revs.patch
+++ /dev/null
@@ -1,73 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -271,7 +271,7 @@ struct brcms_c_bit_desc {
-  */
- 
- /* Starting corerev for the fifo size table */
--#define XMTFIFOTBL_STARTREV	20
-+#define XMTFIFOTBL_STARTREV	10
- 
- struct d11init {
- 	__le16 addr;
-@@ -335,6 +335,26 @@ const u8 wlc_prio2prec_map[] = {
- };
- 
- static const u16 xmtfifo_sz[][NFIFO] = {
-+	/* corerev 10: */
-+	{0, 0, 0, 0, 0, 0},
-+	/* corerev 11: */
-+	{0, 0, 0, 0, 0, 0},
-+	/* corerev 12: */
-+	{0, 0, 0, 0, 0, 0},
-+	/* corerev 13: */
-+	{0, 0, 0, 0, 0, 0},
-+	/* corerev 14: */
-+	{0, 0, 0, 0, 0, 0},
-+	/* corerev 15: */
-+	{0, 0, 0, 0, 0, 0},
-+	/* corerev 16: */
-+	{0, 0, 0, 0, 0, 0},
-+	/* corerev 17: 5120, 49152, 49152, 5376, 4352, 1280 */
-+	{20, 192, 192, 21, 17, 5},
-+	/* corerev 18: */
-+	{0, 0, 0, 0, 0, 0},
-+	/* corerev 19: */
-+	{0, 0, 0, 0, 0, 0},
- 	/* corerev 20: 5120, 49152, 49152, 5376, 4352, 1280 */
- 	{20, 192, 192, 21, 17, 5},
- 	/* corerev 21: 2304, 14848, 5632, 3584, 3584, 1280 */
-@@ -345,6 +365,18 @@ static const u16 xmtfifo_sz[][NFIFO] = {
- 	{20, 192, 192, 21, 17, 5},
- 	/* corerev 24: 2304, 14848, 5632, 3584, 3584, 1280 */
- 	{9, 58, 22, 14, 14, 5},
-+	/* corerev 25: */
-+	{0, 0, 0, 0, 0, 0},
-+	/* corerev 26: */
-+	{0, 0, 0, 0, 0, 0},
-+	/* corerev 27: */
-+	{0, 0, 0, 0, 0, 0},
-+	/* corerev 28: 5120, 49152, 49152, 5376, 4352, 1280 */
-+	{20, 192, 192, 21, 17, 5},
-+	/* corerev 29: */
-+	{0, 0, 0, 0, 0, 0},
-+	/* corerev 30: */
-+	{0, 0, 0, 0, 0, 0},
- };
- 
- #ifdef DEBUG
-@@ -4598,8 +4630,15 @@ static int brcms_b_attach(struct brcms_c
- 		wlc_hw->machwcap_backup = wlc_hw->machwcap;
- 
- 		/* init tx fifo size */
-+		WARN_ON((wlc_hw->corerev - XMTFIFOTBL_STARTREV) < 0 ||
-+		        (wlc_hw->corerev - XMTFIFOTBL_STARTREV) >
-+		            ARRAY_SIZE(xmtfifo_sz));
- 		wlc_hw->xmtfifo_sz =
- 		    xmtfifo_sz[(wlc_hw->corerev - XMTFIFOTBL_STARTREV)];
-+		pr_err("use fifi: %i, %i, %i, %i, %i, %i\n",
-+		       wlc_hw->xmtfifo_sz[0], wlc_hw->xmtfifo_sz[1],
-+		       wlc_hw->xmtfifo_sz[2], wlc_hw->xmtfifo_sz[3],
-+		       wlc_hw->xmtfifo_sz[4], wlc_hw->xmtfifo_sz[5]);
- 
- 		/* Get a phy for this band */
- 		wlc_hw->band->pi =
diff --git a/package/mac80211/patches/849-brcmsmac-add-device-found-on-some-SoCs-like-the-bcm4.patch b/package/mac80211/patches/849-brcmsmac-add-device-found-on-some-SoCs-like-the-bcm4.patch
index e7bf689ade04f2aea31305dcf5119f70a1d3fe84..c94d2ecdaead7eb65f90f7dac531c988d58ac773 100644
--- a/package/mac80211/patches/849-brcmsmac-add-device-found-on-some-SoCs-like-the-bcm4.patch
+++ b/package/mac80211/patches/849-brcmsmac-add-device-found-on-some-SoCs-like-the-bcm4.patch
@@ -10,7 +10,7 @@
  	BCMA_CORETABLE_END
 --- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
 +++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -752,7 +752,7 @@ static void brcms_c_ucode_bsinit(struct 
+@@ -734,7 +734,7 @@ static void brcms_c_ucode_bsinit(struct
  	brcms_c_write_mhf(wlc_hw, wlc_hw->band->mhfs);
  
  	/* do band-specific ucode IHR, SHM, and SCR inits */
@@ -19,7 +19,7 @@
  		if (BRCMS_ISNPHY(wlc_hw->band))
  			brcms_c_write_inits(wlc_hw, ucode->d11n0bsinitvals16);
  		else
-@@ -2277,7 +2277,7 @@ static void brcms_ucode_download(struct 
+@@ -2259,7 +2259,7 @@ static void brcms_ucode_download(struct
  	if (wlc_hw->ucode_loaded)
  		return;
  
@@ -28,7 +28,7 @@
  		if (BRCMS_ISNPHY(wlc_hw->band)) {
  			brcms_ucode_write(wlc_hw, ucode->bcm43xx_16_mimo,
  					  ucode->bcm43xx_16_mimosz);
-@@ -3239,7 +3239,7 @@ static void brcms_b_coreinit(struct brcm
+@@ -3221,7 +3221,7 @@ static void brcms_b_coreinit(struct brcm
  
  	sflags = bcma_aread32(core, BCMA_IOST);
  
diff --git a/package/mac80211/patches/850-brcmsmac-add-support-for-BCM43224.patch b/package/mac80211/patches/850-brcmsmac-add-support-for-BCM43224.patch
index 161da8c6c596da4e8d03d0b85249553817ebe86c..b135c7d3ff178ce33a0641aace9b1057f55f4b3c 100644
--- a/package/mac80211/patches/850-brcmsmac-add-support-for-BCM43224.patch
+++ b/package/mac80211/patches/850-brcmsmac-add-support-for-BCM43224.patch
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
 +++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -4153,6 +4153,7 @@ void brcms_c_wme_setparams(struct brcms_
+@@ -4135,6 +4135,7 @@ void brcms_c_wme_setparams(struct brcms_
  					  M_EDCF_QINFO +
  					  wme_ac2fifo[aci] * M_EDCF_QLEN + i,
  					  *shm_entry++);
@@ -8,17 +8,17 @@
  	}
  
  	if (suspend) {
-@@ -4557,7 +4558,8 @@ static int brcms_b_attach(struct brcms_c
+@@ -4537,7 +4538,8 @@ static int brcms_b_attach(struct brcms_c
  
  	/* check device id(srom, nvram etc.) to set bands */
  	if (wlc_hw->deviceid == BCM43224_D11N_ID ||
 -	    wlc_hw->deviceid == BCM43224_D11N_ID_VEN1)
-+	    wlc_hw->deviceid == BCM43224_D11N_ID_VEN1||
-+    	    wlc_hw->deviceid == BCM43224_CHIP_ID)
++	    wlc_hw->deviceid == BCM43224_D11N_ID_VEN1 ||
++	    wlc_hw->deviceid == BCM43224_CHIP_ID)
  		/* Dualband boards */
  		wlc_hw->_nbands = 2;
  	else
-@@ -5816,7 +5818,7 @@ bool brcms_c_chipmatch(u16 vendor, u16 d
+@@ -5797,7 +5799,7 @@ static bool brcms_c_chipmatch_pci(struct
  		return false;
  	}
  
diff --git a/package/mac80211/patches/851-brcmsmac-start-adding-support-for-core-rev-28.patch b/package/mac80211/patches/851-brcmsmac-start-adding-support-for-core-rev-28.patch
index 4cb089a2545e6287e2de1ec7eae71e7e5c0627e9..c36432675865d5859b4fcfb761cf8d9823a04c9d 100644
--- a/package/mac80211/patches/851-brcmsmac-start-adding-support-for-core-rev-28.patch
+++ b/package/mac80211/patches/851-brcmsmac-start-adding-support-for-core-rev-28.patch
@@ -10,7 +10,7 @@
  MODULE_DEVICE_TABLE(bcma, brcms_coreid_table);
 --- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
 +++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -752,7 +752,7 @@ static void brcms_c_ucode_bsinit(struct 
+@@ -734,7 +734,7 @@ static void brcms_c_ucode_bsinit(struct
  	brcms_c_write_mhf(wlc_hw, wlc_hw->band->mhfs);
  
  	/* do band-specific ucode IHR, SHM, and SCR inits */
@@ -19,7 +19,7 @@
  		if (BRCMS_ISNPHY(wlc_hw->band))
  			brcms_c_write_inits(wlc_hw, ucode->d11n0bsinitvals16);
  		else
-@@ -2277,7 +2277,7 @@ static void brcms_ucode_download(struct 
+@@ -2259,7 +2259,7 @@ static void brcms_ucode_download(struct
  	if (wlc_hw->ucode_loaded)
  		return;
  
@@ -28,7 +28,7 @@
  		if (BRCMS_ISNPHY(wlc_hw->band)) {
  			brcms_ucode_write(wlc_hw, ucode->bcm43xx_16_mimo,
  					  ucode->bcm43xx_16_mimosz);
-@@ -3239,7 +3239,7 @@ static void brcms_b_coreinit(struct brcm
+@@ -3221,7 +3221,7 @@ static void brcms_b_coreinit(struct brcm
  
  	sflags = bcma_aread32(core, BCMA_IOST);
  
@@ -37,6 +37,15 @@
  		if (BRCMS_ISNPHY(wlc_hw->band))
  			brcms_c_write_inits(wlc_hw, ucode->d11n0initvals16);
  		else
+@@ -5818,6 +5818,8 @@ static bool brcms_c_chipmatch_soc(struct
+ 
+ 	if (chipinfo->id == BCMA_CHIP_ID_BCM4716)
+ 		return true;
++	if (chipinfo->id == BCMA_CHIP_ID_BCM5357)
++		return true;
+ 
+ 	pr_err("unknown chip id %04x\n", chipinfo->id);
+ 	return false;
 --- a/drivers/net/wireless/brcm80211/brcmsmac/main.h
 +++ b/drivers/net/wireless/brcm80211/brcmsmac/main.h
 @@ -65,7 +65,7 @@