mac80211: brcm: backport remaining 5.6 kernel patches
[openwrt/openwrt.git] / package / kernel / mac80211 / patches / brcm / 119-v5.6-0001-brcmfmac-simplify-building-interface-combinations.patch
diff --git a/package/kernel/mac80211/patches/brcm/119-v5.6-0001-brcmfmac-simplify-building-interface-combinations.patch b/package/kernel/mac80211/patches/brcm/119-v5.6-0001-brcmfmac-simplify-building-interface-combinations.patch
new file mode 100644 (file)
index 0000000..d52a7a1
--- /dev/null
@@ -0,0 +1,103 @@
+From 24332f8068ff6df7f16aefee45d514de1de4de80 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
+Date: Thu, 26 Dec 2019 14:30:49 +0100
+Subject: [PATCH] brcmfmac: simplify building interface combinations
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Move similar/duplicated code out of combination specific code blocks.
+This simplifies code a bit and allows adding more combinations later.
+A list of combinations remains unchanged.
+
+Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
+Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
+---
+ .../broadcom/brcm80211/brcmfmac/cfg80211.c    | 43 ++++++-------------
+ 1 file changed, 14 insertions(+), 29 deletions(-)
+
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+@@ -6479,12 +6479,13 @@ static int brcmf_setup_ifmodes(struct wi
+       struct ieee80211_iface_limit *c0_limits = NULL;
+       struct ieee80211_iface_limit *p2p_limits = NULL;
+       struct ieee80211_iface_limit *mbss_limits = NULL;
+-      bool mbss, p2p, rsdb;
++      bool mbss, p2p, rsdb, mchan;
+       int i, c, n_combos;
+       mbss = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS);
+       p2p = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_P2P);
+       rsdb = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_RSDB);
++      mchan = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MCHAN);
+       n_combos = 1 + !!(p2p && !rsdb) + !!mbss;
+       combo = kcalloc(n_combos, sizeof(*combo), GFP_KERNEL);
+@@ -6494,6 +6495,10 @@ static int brcmf_setup_ifmodes(struct wi
+       wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
+                                BIT(NL80211_IFTYPE_ADHOC) |
+                                BIT(NL80211_IFTYPE_AP);
++      if (p2p)
++              wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
++                                        BIT(NL80211_IFTYPE_P2P_GO) |
++                                        BIT(NL80211_IFTYPE_P2P_DEVICE);
+       c = 0;
+       i = 0;
+@@ -6505,48 +6510,28 @@ static int brcmf_setup_ifmodes(struct wi
+               c0_limits = kcalloc(2, sizeof(*c0_limits), GFP_KERNEL);
+       if (!c0_limits)
+               goto err;
+-      if (p2p && rsdb) {
+-              combo[c].num_different_channels = 2;
+-              wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
+-                                        BIT(NL80211_IFTYPE_P2P_GO) |
+-                                        BIT(NL80211_IFTYPE_P2P_DEVICE);
+-              c0_limits[i].max = 2;
+-              c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
++
++      combo[c].num_different_channels = 1 + (rsdb || (p2p && mchan));
++      c0_limits[i].max = 1 + rsdb;
++      c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
++      if (p2p) {
+               c0_limits[i].max = 1;
+               c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE);
+-              c0_limits[i].max = 2;
++              c0_limits[i].max = 1 + rsdb;
+               c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
+                                      BIT(NL80211_IFTYPE_P2P_GO);
++      }
++      if (p2p && rsdb) {
+               c0_limits[i].max = 2;
+               c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
+               combo[c].max_interfaces = 5;
+       } else if (p2p) {
+-              if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MCHAN))
+-                      combo[c].num_different_channels = 2;
+-              else
+-                      combo[c].num_different_channels = 1;
+-              c0_limits[i].max = 1;
+-              c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
+-              wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
+-                                        BIT(NL80211_IFTYPE_P2P_GO) |
+-                                        BIT(NL80211_IFTYPE_P2P_DEVICE);
+-              c0_limits[i].max = 1;
+-              c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE);
+-              c0_limits[i].max = 1;
+-              c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
+-                                     BIT(NL80211_IFTYPE_P2P_GO);
+               combo[c].max_interfaces = i;
+       } else if (rsdb) {
+-              combo[c].num_different_channels = 2;
+-              c0_limits[i].max = 2;
+-              c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
+               c0_limits[i].max = 2;
+               c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
+               combo[c].max_interfaces = 3;
+       } else {
+-              combo[c].num_different_channels = 1;
+-              c0_limits[i].max = 1;
+-              c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
+               c0_limits[i].max = 1;
+               c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
+               combo[c].max_interfaces = i;