mac80211: backport latest patches except for NVRAM support
[openwrt/openwrt.git] / package / kernel / mac80211 / patches / 312-brcmfmac-check-all-combinations-when-setting-wiphy-s.patch
diff --git a/package/kernel/mac80211/patches/312-brcmfmac-check-all-combinations-when-setting-wiphy-s.patch b/package/kernel/mac80211/patches/312-brcmfmac-check-all-combinations-when-setting-wiphy-s.patch
new file mode 100644 (file)
index 0000000..bb27115
--- /dev/null
@@ -0,0 +1,46 @@
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
+Date: Thu, 20 Aug 2015 00:16:42 +0200
+Subject: [PATCH] brcmfmac: check all combinations when setting wiphy's
+ addresses
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Broadcom is working on better reflection of interface combinations. With
+upcoming patches we may have 1st combination supporting less interfaces
+than others.
+To don't run out of addresses check all combinations to find the one
+with the greatest max_interfaces value.
+
+Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+---
+
+--- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
++++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
+@@ -5786,7 +5786,9 @@ static void brcmf_wiphy_wowl_params(stru
+ static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp)
+ {
+       struct brcmf_pub *drvr = ifp->drvr;
++      const struct ieee80211_iface_combination *combo;
+       struct ieee80211_supported_band *band;
++      u16 max_interfaces = 0;
+       __le32 bandlist[3];
+       u32 n_bands;
+       int err, i;
+@@ -5799,8 +5801,13 @@ static int brcmf_setup_wiphy(struct wiph
+       if (err)
+               return err;
+-      for (i = 0; i < wiphy->iface_combinations->max_interfaces &&
+-           i < ARRAY_SIZE(drvr->addresses); i++) {
++      for (i = 0, combo = wiphy->iface_combinations;
++           i < wiphy->n_iface_combinations; i++, combo++) {
++              max_interfaces = max(max_interfaces, combo->max_interfaces);
++      }
++
++      for (i = 0; i < max_interfaces && i < ARRAY_SIZE(drvr->addresses);
++           i++) {
+               u8 *addr = drvr->addresses[i].addr;
+               memcpy(addr, drvr->mac, ETH_ALEN);