summaryrefslogtreecommitdiff
path: root/package/kernel/mac80211/patches/319-0020-brcmfmac-ignore-11d-configuration-errors.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/kernel/mac80211/patches/319-0020-brcmfmac-ignore-11d-configuration-errors.patch')
-rw-r--r--package/kernel/mac80211/patches/319-0020-brcmfmac-ignore-11d-configuration-errors.patch84
1 files changed, 84 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/319-0020-brcmfmac-ignore-11d-configuration-errors.patch b/package/kernel/mac80211/patches/319-0020-brcmfmac-ignore-11d-configuration-errors.patch
new file mode 100644
index 0000000..1c24f2d
--- /dev/null
+++ b/package/kernel/mac80211/patches/319-0020-brcmfmac-ignore-11d-configuration-errors.patch
@@ -0,0 +1,84 @@
+From b3589dfe02123a0d0ea82076a9f8ef84a46852c0 Mon Sep 17 00:00:00 2001
+From: Hante Meuleman <hante.meuleman@broadcom.com>
+Date: Mon, 19 Sep 2016 12:09:51 +0100
+Subject: [PATCH] brcmfmac: ignore 11d configuration errors
+
+802.11d is not always supported by firmware anymore. Currently the
+AP configuration of 11d will cause an abort if the ioctl set is
+failing. This behavior is not correct and the error should be
+ignored.
+
+Reviewed-by: Arend Van Spriel <arend.vanspriel@broadcom.com>
+Reviewed-by: Franky Lin <franky.lin@broadcom.com>
+Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
+Signed-off-by: Hante Meuleman <hante.meuleman@broadcom.com>
+Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+---
+ .../broadcom/brcm80211/brcmfmac/cfg80211.c | 27 ++++++++++++----------
+ 1 file changed, 15 insertions(+), 12 deletions(-)
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+@@ -4498,6 +4498,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wi
+ u16 chanspec = chandef_to_chanspec(&cfg->d11inf, &settings->chandef);
+ bool mbss;
+ int is_11d;
++ bool supports_11d;
+
+ brcmf_dbg(TRACE, "ctrlchn=%d, center=%d, bw=%d, beacon_interval=%d, dtim_period=%d,\n",
+ settings->chandef.chan->hw_value,
+@@ -4510,11 +4511,16 @@ brcmf_cfg80211_start_ap(struct wiphy *wi
+ mbss = ifp->vif->mbss;
+
+ /* store current 11d setting */
+- brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_REGULATORY, &ifp->vif->is_11d);
+- country_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail,
+- settings->beacon.tail_len,
+- WLAN_EID_COUNTRY);
+- is_11d = country_ie ? 1 : 0;
++ if (brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_REGULATORY,
++ &ifp->vif->is_11d)) {
++ supports_11d = false;
++ } else {
++ country_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail,
++ settings->beacon.tail_len,
++ WLAN_EID_COUNTRY);
++ is_11d = country_ie ? 1 : 0;
++ supports_11d = true;
++ }
+
+ memset(&ssid_le, 0, sizeof(ssid_le));
+ if (settings->ssid == NULL || settings->ssid_len == 0) {
+@@ -4573,7 +4579,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wi
+
+ /* Parameters shared by all radio interfaces */
+ if (!mbss) {
+- if (is_11d != ifp->vif->is_11d) {
++ if ((supports_11d) && (is_11d != ifp->vif->is_11d)) {
+ err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_REGULATORY,
+ is_11d);
+ if (err < 0) {
+@@ -4615,7 +4621,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wi
+ brcmf_err("SET INFRA error %d\n", err);
+ goto exit;
+ }
+- } else if (WARN_ON(is_11d != ifp->vif->is_11d)) {
++ } else if (WARN_ON(supports_11d && (is_11d != ifp->vif->is_11d))) {
+ /* Multiple-BSS should use same 11d configuration */
+ err = -EINVAL;
+ goto exit;
+@@ -4749,11 +4755,8 @@ static int brcmf_cfg80211_stop_ap(struct
+ brcmf_err("setting INFRA mode failed %d\n", err);
+ if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS))
+ brcmf_fil_iovar_int_set(ifp, "mbss", 0);
+- err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_REGULATORY,
+- ifp->vif->is_11d);
+- if (err < 0)
+- brcmf_err("restoring REGULATORY setting failed %d\n",
+- err);
++ brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_REGULATORY,
++ ifp->vif->is_11d);
+ /* Bring device back up so it can be used again */
+ err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 1);
+ if (err < 0)