OSDN Git Service

brcmfmac: simplify building interface combinations
authorRafał Miłecki <rafal@milecki.pl>
Thu, 26 Dec 2019 13:30:49 +0000 (14:30 +0100)
committerKalle Valo <kvalo@codeaurora.org>
Sun, 26 Jan 2020 15:41:48 +0000 (17:41 +0200)
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>
drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c

index 6eb3064..3ecb91a 100644 (file)
@@ -6547,12 +6547,13 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
        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);
@@ -6562,6 +6563,10 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
        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;
@@ -6573,48 +6578,28 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
                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;