2016-06-07 19:10:38

by Rafał Miłecki

[permalink] [raw]
Subject: [PATCH] brcmfmac: slightly simplify building interface combinations

This change reorders some operations in brcmf_setup_ifmodes in hope to
make it simpler:
1) It allocates arrays right before filling them. This way it's easier
to follow requested array length as it's immediately followed by
code filling it. It's easier to check e.g. why we need 4 entries for
P2P. Other than that it deduplicates some checks (e.g. for P2P).
2) It reorders code to first prepare limits and then define a new combo.
Previously this was mixed (e.g. we were setting num of channels
before preparing limits).
3) It modifies mbss code to use i variable just like other combos do.

Signed-off-by: Rafał Miłecki <[email protected]>
---
.../broadcom/brcm80211/brcmfmac/cfg80211.c | 37 ++++++++++------------
1 file changed, 16 insertions(+), 21 deletions(-)

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
index 4894eb7..33e682e 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
@@ -6300,29 +6300,15 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
if (!combo)
goto err;

- c0_limits = kcalloc(p2p ? 3 : 2, sizeof(*c0_limits), GFP_KERNEL);
- if (!c0_limits)
- goto err;
-
- if (p2p) {
- p2p_limits = kcalloc(4, sizeof(*p2p_limits), GFP_KERNEL);
- if (!p2p_limits)
- goto err;
- }
-
- if (mbss) {
- mbss_limits = kcalloc(1, sizeof(*mbss_limits), GFP_KERNEL);
- if (!mbss_limits)
- goto err;
- }
-
wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
BIT(NL80211_IFTYPE_ADHOC) |
BIT(NL80211_IFTYPE_AP);

c = 0;
i = 0;
- combo[c].num_different_channels = 1;
+ c0_limits = kcalloc(p2p ? 3 : 2, sizeof(*c0_limits), GFP_KERNEL);
+ if (!c0_limits)
+ goto err;
c0_limits[i].max = 1;
c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
if (p2p) {
@@ -6340,6 +6326,7 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
c0_limits[i].max = 1;
c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
}
+ combo[c].num_different_channels = 1;
combo[c].max_interfaces = i;
combo[c].n_limits = i;
combo[c].limits = c0_limits;
@@ -6347,7 +6334,9 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
if (p2p) {
c++;
i = 0;
- combo[c].num_different_channels = 1;
+ p2p_limits = kcalloc(4, sizeof(*p2p_limits), GFP_KERNEL);
+ if (!p2p_limits)
+ goto err;
p2p_limits[i].max = 1;
p2p_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
p2p_limits[i].max = 1;
@@ -6356,6 +6345,7 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
p2p_limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT);
p2p_limits[i].max = 1;
p2p_limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE);
+ combo[c].num_different_channels = 1;
combo[c].max_interfaces = i;
combo[c].n_limits = i;
combo[c].limits = p2p_limits;
@@ -6363,14 +6353,19 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)

if (mbss) {
c++;
+ i = 0;
+ mbss_limits = kcalloc(1, sizeof(*mbss_limits), GFP_KERNEL);
+ if (!mbss_limits)
+ goto err;
+ mbss_limits[i].max = 4;
+ mbss_limits[i++].types = BIT(NL80211_IFTYPE_AP);
combo[c].beacon_int_infra_match = true;
combo[c].num_different_channels = 1;
- mbss_limits[0].max = 4;
- mbss_limits[0].types = BIT(NL80211_IFTYPE_AP);
combo[c].max_interfaces = 4;
- combo[c].n_limits = 1;
+ combo[c].n_limits = i;
combo[c].limits = mbss_limits;
}
+
wiphy->n_iface_combinations = n_combos;
wiphy->iface_combinations = combo;
return 0;
--
1.8.4.5



2016-06-29 15:41:58

by Kalle Valo

[permalink] [raw]
Subject: Re: brcmfmac: slightly simplify building interface combinations

Rafał Miłecki wrote:
> This change reorders some operations in brcmf_setup_ifmodes in hope to
> make it simpler:
> 1) It allocates arrays right before filling them. This way it's easier
> to follow requested array length as it's immediately followed by
> code filling it. It's easier to check e.g. why we need 4 entries for
> P2P. Other than that it deduplicates some checks (e.g. for P2P).
> 2) It reorders code to first prepare limits and then define a new combo.
> Previously this was mixed (e.g. we were setting num of channels
> before preparing limits).
> 3) It modifies mbss code to use i variable just like other combos do.
>
> Signed-off-by: Rafał Miłecki <[email protected]>
> Acked-by: Arend van Spriel <[email protected]>

Thanks, 1 patch applied to wireless-drivers-next.git:

f568adac7d1a brcmfmac: slightly simplify building interface combinations

--
Sent by pwcli
https://patchwork.kernel.org/patch/9162267/


2016-06-09 18:56:56

by Arend Van Spriel

[permalink] [raw]
Subject: Re: [PATCH] brcmfmac: slightly simplify building interface combinations

On 07-06-16 21:10, Rafał Miłecki wrote:
> This change reorders some operations in brcmf_setup_ifmodes in hope to
> make it simpler:
> 1) It allocates arrays right before filling them. This way it's easier
> to follow requested array length as it's immediately followed by
> code filling it. It's easier to check e.g. why we need 4 entries for
> P2P. Other than that it deduplicates some checks (e.g. for P2P).
> 2) It reorders code to first prepare limits and then define a new combo.
> Previously this was mixed (e.g. we were setting num of channels
> before preparing limits).
> 3) It modifies mbss code to use i variable just like other combos do.

Acked-by: Arend van Spriel <[email protected]>
> Signed-off-by: Rafał Miłecki <[email protected]>
> ---
> .../broadcom/brcm80211/brcmfmac/cfg80211.c | 37 ++++++++++------------
> 1 file changed, 16 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
> index 4894eb7..33e682e 100644
> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
> @@ -6300,29 +6300,15 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
> if (!combo)
> goto err;
>
> - c0_limits = kcalloc(p2p ? 3 : 2, sizeof(*c0_limits), GFP_KERNEL);
> - if (!c0_limits)
> - goto err;
> -
> - if (p2p) {
> - p2p_limits = kcalloc(4, sizeof(*p2p_limits), GFP_KERNEL);
> - if (!p2p_limits)
> - goto err;
> - }
> -
> - if (mbss) {
> - mbss_limits = kcalloc(1, sizeof(*mbss_limits), GFP_KERNEL);
> - if (!mbss_limits)
> - goto err;
> - }
> -
> wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
> BIT(NL80211_IFTYPE_ADHOC) |
> BIT(NL80211_IFTYPE_AP);
>
> c = 0;
> i = 0;
> - combo[c].num_different_channels = 1;
> + c0_limits = kcalloc(p2p ? 3 : 2, sizeof(*c0_limits), GFP_KERNEL);
> + if (!c0_limits)
> + goto err;
> c0_limits[i].max = 1;
> c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
> if (p2p) {
> @@ -6340,6 +6326,7 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
> c0_limits[i].max = 1;
> c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
> }
> + combo[c].num_different_channels = 1;
> combo[c].max_interfaces = i;
> combo[c].n_limits = i;
> combo[c].limits = c0_limits;
> @@ -6347,7 +6334,9 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
> if (p2p) {
> c++;
> i = 0;
> - combo[c].num_different_channels = 1;
> + p2p_limits = kcalloc(4, sizeof(*p2p_limits), GFP_KERNEL);
> + if (!p2p_limits)
> + goto err;
> p2p_limits[i].max = 1;
> p2p_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
> p2p_limits[i].max = 1;
> @@ -6356,6 +6345,7 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
> p2p_limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT);
> p2p_limits[i].max = 1;
> p2p_limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE);
> + combo[c].num_different_channels = 1;
> combo[c].max_interfaces = i;
> combo[c].n_limits = i;
> combo[c].limits = p2p_limits;
> @@ -6363,14 +6353,19 @@ static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
>
> if (mbss) {
> c++;
> + i = 0;
> + mbss_limits = kcalloc(1, sizeof(*mbss_limits), GFP_KERNEL);
> + if (!mbss_limits)
> + goto err;
> + mbss_limits[i].max = 4;
> + mbss_limits[i++].types = BIT(NL80211_IFTYPE_AP);
> combo[c].beacon_int_infra_match = true;
> combo[c].num_different_channels = 1;
> - mbss_limits[0].max = 4;
> - mbss_limits[0].types = BIT(NL80211_IFTYPE_AP);
> combo[c].max_interfaces = 4;
> - combo[c].n_limits = 1;
> + combo[c].n_limits = i;
> combo[c].limits = mbss_limits;
> }
> +
> wiphy->n_iface_combinations = n_combos;
> wiphy->iface_combinations = combo;
> return 0;
>