Message ID | 1485518971-28183-5-git-send-email-arend.vanspriel@broadcom.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
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 --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); }