diff mbox

[4/5] brcmfmac: allow wowlan support to be per device

Message ID 1485518971-28183-5-git-send-email-arend.vanspriel@broadcom.com
State Superseded
Headers show

Commit Message

Arend Van Spriel Jan. 27, 2017, 12:09 p.m. UTC
The wowlan support is (partially) determined dynamic by checking the
device/firmware capabilities. So they can differ per device. So it
is not possible to use a static global. Instead use the global as a
template and use kmemdup(). When kmemdup() fails the template is used
unmodified.

Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
Reviewed-by: Franky Lin <franky.lin@broadcom.com>
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
---
 .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 26 ++++++++++++++++------
 1 file changed, 19 insertions(+), 7 deletions(-)

Comments

Arend Van Spriel Jan. 27, 2017, 12:22 p.m. UTC | #1
On 27-1-2017 13:09, Arend van Spriel wrote:
> The wowlan support is (partially) determined dynamic by checking the
> device/firmware capabilities. So they can differ per device. So it
> is not possible to use a static global. Instead use the global as a
> template and use kmemdup(). When kmemdup() fails the template is used
> unmodified.
> 
> Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
> Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
> Reviewed-by: Franky Lin <franky.lin@broadcom.com>
> Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
> ---
>  .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 26 ++++++++++++++++------
>  1 file changed, 19 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
> index c81d78f..9d5a561 100644
> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
> @@ -6339,7 +6339,7 @@ static void brcmf_wiphy_pno_params(struct wiphy *wiphy)
>  }
>  
>  #ifdef CONFIG_PM
> -static struct wiphy_wowlan_support brcmf_wowlan_support = {
> +static const struct wiphy_wowlan_support brcmf_wowlan_support = {
>  	.flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT,
>  	.n_patterns = BRCMF_WOWL_MAXPATTERNS,
>  	.pattern_max_len = BRCMF_WOWL_MAXPATTERNSIZE,
> @@ -6352,21 +6352,29 @@ static void brcmf_wiphy_wowl_params(struct wiphy *wiphy, struct brcmf_if *ifp)
>  {
>  #ifdef CONFIG_PM
>  	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
> +	struct wiphy_wowlan_support *wowlan_support;
> +
> +	wowlan_support = kmemdup(&brcmf_wowlan_support,
> +				 sizeof(brcmf_wowlan_support), GFP_KERNEL);
> +	if (!wowlan_support) {
> +		brcmf_err("only support basic wowlan features\n");
> +		wiphy->wowlan = &brcmf_wowlan_support;
> +		return;
> +	}
>  
>  	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PNO)) {
>  		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_ND)) {
> -			brcmf_wowlan_support.flags |= WIPHY_WOWLAN_NET_DETECT;
> -			brcmf_wowlan_support.max_nd_match_sets =
> -				BRCMF_PNO_MAX_PFN_COUNT;
> +			wowlan_support->flags |= WIPHY_WOWLAN_NET_DETECT;
> +			wowlan_support->max_nd_match_sets = BRCMF_PNO_MAX_PFN_COUNT;

Did not checkpatch these before sending. This is over 80 chars so please
drop this series and I will send a V2.

Regards,
Arend
diff mbox

Patch

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
index c81d78f..9d5a561 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
@@ -6339,7 +6339,7 @@  static void brcmf_wiphy_pno_params(struct wiphy *wiphy)
 }
 
 #ifdef CONFIG_PM
-static struct wiphy_wowlan_support brcmf_wowlan_support = {
+static const struct wiphy_wowlan_support brcmf_wowlan_support = {
 	.flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT,
 	.n_patterns = BRCMF_WOWL_MAXPATTERNS,
 	.pattern_max_len = BRCMF_WOWL_MAXPATTERNSIZE,
@@ -6352,21 +6352,29 @@  static void brcmf_wiphy_wowl_params(struct wiphy *wiphy, struct brcmf_if *ifp)
 {
 #ifdef CONFIG_PM
 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
+	struct wiphy_wowlan_support *wowlan_support;
+
+	wowlan_support = kmemdup(&brcmf_wowlan_support,
+				 sizeof(brcmf_wowlan_support), GFP_KERNEL);
+	if (!wowlan_support) {
+		brcmf_err("only support basic wowlan features\n");
+		wiphy->wowlan = &brcmf_wowlan_support;
+		return;
+	}
 
 	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PNO)) {
 		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_ND)) {
-			brcmf_wowlan_support.flags |= WIPHY_WOWLAN_NET_DETECT;
-			brcmf_wowlan_support.max_nd_match_sets =
-				BRCMF_PNO_MAX_PFN_COUNT;
+			wowlan_support->flags |= WIPHY_WOWLAN_NET_DETECT;
+			wowlan_support->max_nd_match_sets = BRCMF_PNO_MAX_PFN_COUNT;
 			init_waitqueue_head(&cfg->wowl.nd_data_wait);
 		}
 	}
 	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_GTK)) {
-		brcmf_wowlan_support.flags |= WIPHY_WOWLAN_SUPPORTS_GTK_REKEY;
-		brcmf_wowlan_support.flags |= WIPHY_WOWLAN_GTK_REKEY_FAILURE;
+		wowlan_support->flags |= WIPHY_WOWLAN_SUPPORTS_GTK_REKEY;
+		wowlan_support->flags |= WIPHY_WOWLAN_GTK_REKEY_FAILURE;
 	}
 
-	wiphy->wowlan = &brcmf_wowlan_support;
+	wiphy->wowlan = wowlan_support;
 #endif
 }
 
@@ -6747,6 +6755,10 @@  static void brcmf_free_wiphy(struct wiphy *wiphy)
 		kfree(wiphy->bands[NL80211_BAND_5GHZ]->channels);
 		kfree(wiphy->bands[NL80211_BAND_5GHZ]);
 	}
+#if IS_ENABLED(CONFIG_PM)
+	if (wiphy->wowlan != &brcmf_wowlan_support)
+		kfree(wiphy->wowlan);
+#endif
 	wiphy_free(wiphy);
 }