From: Hauke Mehrtens <hauke@hauke-m.de>
Date: Fri, 1 Jun 2012 21:17:04 +0000 (+0000)
Subject: mac80211: brcmsmac: add some patches starting to add support for some more chips
X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=cedf84c3487ba24bf7d70accc485f39da0b59041;p=openwrt%2Fstaging%2Fdangole.git

mac80211: brcmsmac: add some patches starting to add support for some more chips

SVN-Revision: 32020
---

diff --git a/package/mac80211/patches/840-brcmsmac-add-device-found-on-some-SoCs-like-the-bcm4.patch b/package/mac80211/patches/840-brcmsmac-add-device-found-on-some-SoCs-like-the-bcm4.patch
deleted file mode 100644
index df48e1e79e..0000000000
--- a/package/mac80211/patches/840-brcmsmac-add-device-found-on-some-SoCs-like-the-bcm4.patch
+++ /dev/null
@@ -1,39 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
-@@ -94,6 +94,7 @@ MODULE_LICENSE("Dual BSD/GPL");
- static struct bcma_device_id brcms_coreid_table[] = {
- 	BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 23, BCMA_ANY_CLASS),
- 	BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 24, BCMA_ANY_CLASS),
-+//	BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 17, BCMA_ANY_CLASS),
- 	BCMA_CORETABLE_END
- };
- MODULE_DEVICE_TABLE(bcma, brcms_coreid_table);
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -719,7 +719,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 */
--	if (D11REV_IS(wlc_hw->corerev, 23)) {
-+	if (D11REV_IS(wlc_hw->corerev, 17) || D11REV_IS(wlc_hw->corerev, 23)) {
- 		if (BRCMS_ISNPHY(wlc_hw->band))
- 			brcms_c_write_inits(wlc_hw, ucode->d11n0bsinitvals16);
- 		else
-@@ -2242,7 +2242,7 @@ static void brcms_ucode_download(struct 
- 	if (wlc_hw->ucode_loaded)
- 		return;
- 
--	if (D11REV_IS(wlc_hw->corerev, 23)) {
-+	if (D11REV_IS(wlc_hw->corerev, 17) || D11REV_IS(wlc_hw->corerev, 23)) {
- 		if (BRCMS_ISNPHY(wlc_hw->band)) {
- 			brcms_ucode_write(wlc_hw, ucode->bcm43xx_16_mimo,
- 					  ucode->bcm43xx_16_mimosz);
-@@ -3218,7 +3218,7 @@ static void brcms_b_coreinit(struct brcm
- 
- 	sflags = bcma_aread32(core, BCMA_IOST);
- 
--	if (D11REV_IS(wlc_hw->corerev, 23)) {
-+	if (D11REV_IS(wlc_hw->corerev, 17) || D11REV_IS(wlc_hw->corerev, 23)) {
- 		if (BRCMS_ISNPHY(wlc_hw->band))
- 			brcms_c_write_inits(wlc_hw, ucode->d11n0initvals16);
- 		else
diff --git a/package/mac80211/patches/840-brcmsmac-remove-PCIE.patch b/package/mac80211/patches/840-brcmsmac-remove-PCIE.patch
new file mode 100644
index 0000000000..de8b46c942
--- /dev/null
+++ b/package/mac80211/patches/840-brcmsmac-remove-PCIE.patch
@@ -0,0 +1,31 @@
+--- 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__)
+@@ -777,7 +775,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);
+ }
+ 
+@@ -795,7 +793,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-add-support-for-BCM43224.patch b/package/mac80211/patches/841-brcmsmac-add-support-for-BCM43224.patch
deleted file mode 100644
index 56fd1ebf9b..0000000000
--- a/package/mac80211/patches/841-brcmsmac-add-support-for-BCM43224.patch
+++ /dev/null
@@ -1,29 +0,0 @@
---- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
-+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
-@@ -4132,6 +4132,7 @@ void brcms_c_wme_setparams(struct brcms_
- 					  M_EDCF_QINFO +
- 					  wme_ac2fifo[aci] * M_EDCF_QLEN + i,
- 					  *shm_entry++);
-+		printk("dummy\n");
- 	}
- 
- 	if (suspend) {
-@@ -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)
- 		/* Dualband boards */
- 		wlc_hw->_nbands = 2;
- 	else
-@@ -5791,7 +5793,7 @@ bool brcms_c_chipmatch(u16 vendor, u16 d
- 		return false;
- 	}
- 
--	if (device == BCM43224_D11N_ID_VEN1)
-+	if (device == BCM43224_D11N_ID_VEN1 || device == BCM43224_CHIP_ID)
- 		return true;
- 	if ((device == BCM43224_D11N_ID) || (device == BCM43225_D11N2G_ID))
- 		return true;
diff --git a/package/mac80211/patches/841-brcmsmac-remove-PCI_FORCEHT.patch b/package/mac80211/patches/841-brcmsmac-remove-PCI_FORCEHT.patch
new file mode 100644
index 0000000000..04d74d73f0
--- /dev/null
+++ b/package/mac80211/patches/841-brcmsmac-remove-PCI_FORCEHT.patch
@@ -0,0 +1,54 @@
+--- 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
+@@ -755,9 +753,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;
+@@ -766,15 +761,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);
+ }
+@@ -783,16 +772,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-add-some-conditions-for-the-bcm4716-again.patch b/package/mac80211/patches/842-brcmsmac-add-some-conditions-for-the-bcm4716-again.patch
deleted file mode 100644
index 40ccde90b5..0000000000
--- a/package/mac80211/patches/842-brcmsmac-add-some-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
-@@ -1943,7 +1943,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
-@@ -2024,7 +2025,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/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
new file mode 100644
index 0000000000..80c6fc966b
--- /dev/null
+++ b/package/mac80211/patches/842-brcmsmac-remove-ai_get_buscoretype-and-ai_get_buscor.patch
@@ -0,0 +1,48 @@
+--- 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;
+ }
+ 
+@@ -807,15 +804,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
new file mode 100644
index 0000000000..ba12eda125
--- /dev/null
+++ b/package/mac80211/patches/843-brcmsmac-use-container_of-instead-of-cast.patch
@@ -0,0 +1,74 @@
+--- 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 */
+@@ -716,7 +716,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;
+@@ -748,7 +748,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);
+@@ -759,7 +759,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);
+@@ -770,7 +770,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);
+@@ -793,7 +793,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
new file mode 100644
index 0000000000..3fc914f90e
--- /dev/null
+++ b/package/mac80211/patches/844-brcmsmac-remove-ai_findcore.patch
@@ -0,0 +1,145 @@
+--- 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.
+  */
+@@ -689,12 +668,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;
+ 
+@@ -726,7 +706,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)
+@@ -750,7 +730,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;
+ }
+@@ -779,9 +759,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
new file mode 100644
index 0000000000..167f373ab0
--- /dev/null
+++ b/package/mac80211/patches/845-brcmsmac-use-core-id-constants-from-bcma.patch
@@ -0,0 +1,86 @@
+--- 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
new file mode 100644
index 0000000000..24c3e2356f
--- /dev/null
+++ b/package/mac80211/patches/846-brcmsmac-remove-some-unnessessacry-casts-and-void-po.patch
@@ -0,0 +1,36 @@
+--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
++++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
+@@ -4233,9 +4233,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);
+@@ -4256,10 +4255,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)
+@@ -4299,7 +4296,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
new file mode 100644
index 0000000000..ecf41b5598
--- /dev/null
+++ b/package/mac80211/patches/847-brcmsmac-add-suome-conditions-for-the-bcm4716-again.patch
@@ -0,0 +1,202 @@
+--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
++++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
+@@ -1943,7 +1943,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
+@@ -2024,7 +2025,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
new file mode 100644
index 0000000000..c5cf2fd67f
--- /dev/null
+++ b/package/mac80211/patches/848-brcmsmac-some-more-fixes-for-different-core-revs.patch
@@ -0,0 +1,73 @@
+--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
++++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
+@@ -270,7 +270,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;
+@@ -334,6 +334,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 */
+@@ -344,6 +364,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
+@@ -4611,8 +4643,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
new file mode 100644
index 0000000000..9cef6975a5
--- /dev/null
+++ b/package/mac80211/patches/849-brcmsmac-add-device-found-on-some-SoCs-like-the-bcm4.patch
@@ -0,0 +1,39 @@
+--- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
++++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
+@@ -92,6 +92,7 @@ MODULE_LICENSE("Dual BSD/GPL");
+ 
+ /* recognized BCMA Core IDs */
+ static struct bcma_device_id brcms_coreid_table[] = {
++//	BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 17, BCMA_ANY_CLASS),
+ 	BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 23, BCMA_ANY_CLASS),
+ 	BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 24, BCMA_ANY_CLASS),
+ 	BCMA_CORETABLE_END
+--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
++++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
+@@ -751,7 +751,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 */
+-	if (D11REV_IS(wlc_hw->corerev, 23)) {
++	if (D11REV_IS(wlc_hw->corerev, 17) || D11REV_IS(wlc_hw->corerev, 23)) {
+ 		if (BRCMS_ISNPHY(wlc_hw->band))
+ 			brcms_c_write_inits(wlc_hw, ucode->d11n0bsinitvals16);
+ 		else
+@@ -2276,7 +2276,7 @@ static void brcms_ucode_download(struct
+ 	if (wlc_hw->ucode_loaded)
+ 		return;
+ 
+-	if (D11REV_IS(wlc_hw->corerev, 23)) {
++	if (D11REV_IS(wlc_hw->corerev, 17) || D11REV_IS(wlc_hw->corerev, 23)) {
+ 		if (BRCMS_ISNPHY(wlc_hw->band)) {
+ 			brcms_ucode_write(wlc_hw, ucode->bcm43xx_16_mimo,
+ 					  ucode->bcm43xx_16_mimosz);
+@@ -3252,7 +3252,7 @@ static void brcms_b_coreinit(struct brcm
+ 
+ 	sflags = bcma_aread32(core, BCMA_IOST);
+ 
+-	if (D11REV_IS(wlc_hw->corerev, 23)) {
++	if (D11REV_IS(wlc_hw->corerev, 17) || D11REV_IS(wlc_hw->corerev, 23)) {
+ 		if (BRCMS_ISNPHY(wlc_hw->band))
+ 			brcms_c_write_inits(wlc_hw, ucode->d11n0initvals16);
+ 		else
diff --git a/package/mac80211/patches/850-brcmsmac-add-support-for-BCM43224.patch b/package/mac80211/patches/850-brcmsmac-add-support-for-BCM43224.patch
new file mode 100644
index 0000000000..df53b00f49
--- /dev/null
+++ b/package/mac80211/patches/850-brcmsmac-add-support-for-BCM43224.patch
@@ -0,0 +1,29 @@
+--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
++++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
+@@ -4166,6 +4166,7 @@ void brcms_c_wme_setparams(struct brcms_
+ 					  M_EDCF_QINFO +
+ 					  wme_ac2fifo[aci] * M_EDCF_QLEN + i,
+ 					  *shm_entry++);
++		printk("dummy\n");
+ 	}
+ 
+ 	if (suspend) {
+@@ -4570,7 +4571,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)
+ 		/* Dualband boards */
+ 		wlc_hw->_nbands = 2;
+ 	else
+@@ -5831,7 +5833,7 @@ bool brcms_c_chipmatch(u16 vendor, u16 d
+ 		return false;
+ 	}
+ 
+-	if (device == BCM43224_D11N_ID_VEN1)
++	if (device == BCM43224_D11N_ID_VEN1 || device == BCM43224_CHIP_ID)
+ 		return true;
+ 	if ((device == BCM43224_D11N_ID) || (device == BCM43225_D11N2G_ID))
+ 		return true;
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
new file mode 100644
index 0000000000..1b64f56ccc
--- /dev/null
+++ b/package/mac80211/patches/851-brcmsmac-start-adding-support-for-core-rev-28.patch
@@ -0,0 +1,66 @@
+--- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
++++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
+@@ -95,6 +95,7 @@ static struct bcma_device_id brcms_corei
+ //	BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 17, BCMA_ANY_CLASS),
+ 	BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 23, BCMA_ANY_CLASS),
+ 	BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 24, BCMA_ANY_CLASS),
++//	BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 28, BCMA_ANY_CLASS),
+ 	BCMA_CORETABLE_END
+ };
+ MODULE_DEVICE_TABLE(bcma, brcms_coreid_table);
+--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
++++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
+@@ -751,7 +751,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 */
+-	if (D11REV_IS(wlc_hw->corerev, 17) || D11REV_IS(wlc_hw->corerev, 23)) {
++	if (D11REV_IS(wlc_hw->corerev, 17) || D11REV_IS(wlc_hw->corerev, 23) || D11REV_IS(wlc_hw->corerev, 28)) {
+ 		if (BRCMS_ISNPHY(wlc_hw->band))
+ 			brcms_c_write_inits(wlc_hw, ucode->d11n0bsinitvals16);
+ 		else
+@@ -2276,7 +2276,7 @@ static void brcms_ucode_download(struct
+ 	if (wlc_hw->ucode_loaded)
+ 		return;
+ 
+-	if (D11REV_IS(wlc_hw->corerev, 17) || D11REV_IS(wlc_hw->corerev, 23)) {
++	if (D11REV_IS(wlc_hw->corerev, 17) || D11REV_IS(wlc_hw->corerev, 23) || D11REV_IS(wlc_hw->corerev, 28)) {
+ 		if (BRCMS_ISNPHY(wlc_hw->band)) {
+ 			brcms_ucode_write(wlc_hw, ucode->bcm43xx_16_mimo,
+ 					  ucode->bcm43xx_16_mimosz);
+@@ -3252,7 +3252,7 @@ static void brcms_b_coreinit(struct brcm
+ 
+ 	sflags = bcma_aread32(core, BCMA_IOST);
+ 
+-	if (D11REV_IS(wlc_hw->corerev, 17) || D11REV_IS(wlc_hw->corerev, 23)) {
++	if (D11REV_IS(wlc_hw->corerev, 17) || D11REV_IS(wlc_hw->corerev, 23) || D11REV_IS(wlc_hw->corerev, 28)) {
+ 		if (BRCMS_ISNPHY(wlc_hw->band))
+ 			brcms_c_write_inits(wlc_hw, ucode->d11n0initvals16);
+ 		else
+--- a/drivers/net/wireless/brcm80211/brcmsmac/main.h
++++ b/drivers/net/wireless/brcm80211/brcmsmac/main.h
+@@ -65,7 +65,7 @@
+ #define	SW_TIMER_MAC_STAT_UPD		30	/* periodic MAC stats update */
+ 
+ /* max # supported core revisions (0 .. MAXCOREREV - 1) */
+-#define	MAXCOREREV		28
++#define	MAXCOREREV		29
+ 
+ /* Double check that unsupported cores are not enabled */
+ #if CONF_MSK(D11CONF, 0x4f) || CONF_GE(D11CONF, MAXCOREREV)
+--- a/drivers/net/wireless/brcm80211/brcmsmac/types.h
++++ b/drivers/net/wireless/brcm80211/brcmsmac/types.h
+@@ -93,11 +93,11 @@
+ #define BOARD_GPIO_13		0x2000
+ 
+ /* **** Core type/rev defaults **** */
+-#define D11CONF		0x0fffffb0	/* Supported  D11 revs: 4, 5, 7-27
++#define D11CONF		0x1fffffb0	/* Supported  D11 revs: 4, 5, 7-27
+ 					 * also need to update wlc.h MAXCOREREV
+ 					 */
+ 
+-#define NCONF		0x000001ff	/* Supported nphy revs:
++#define NCONF		0x000002ff	/* Supported nphy revs:
+ 					 *      0       4321a0
+ 					 *      1       4321a1
+ 					 *      2       4321b0/b1/c0/c1