79c9c65c2b833b5fd49a8512c1b2282c716752d0
[librecmc/librecmc.git] / package / kernel / mac80211 / patches / 364-0003-brcmfmac-allow-wowlan-support-to-be-per-device.patch
1 From 0b57010fc18e12c19d14379cd739d4eb7c3898f3 Mon Sep 17 00:00:00 2001
2 From: Arend Van Spriel <arend.vanspriel@broadcom.com>
3 Date: Fri, 27 Jan 2017 12:27:47 +0000
4 Subject: [PATCH] brcmfmac: allow wowlan support to be per device
5
6 The wowlan support is (partially) determined dynamic by checking the
7 device/firmware capabilities. So they can differ per device. So it
8 is not possible to use a static global. Instead use the global as a
9 template and use kmemdup(). When kmemdup() fails the template is used
10 unmodified.
11
12 Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
13 Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
14 Reviewed-by: Franky Lin <franky.lin@broadcom.com>
15 Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
16 Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
17 ---
18  .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 26 ++++++++++++++++------
19  1 file changed, 19 insertions(+), 7 deletions(-)
20
21 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
22 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
23 @@ -6337,7 +6337,7 @@ static void brcmf_wiphy_pno_params(struc
24  }
25  
26  #ifdef CONFIG_PM
27 -static struct wiphy_wowlan_support brcmf_wowlan_support = {
28 +static const struct wiphy_wowlan_support brcmf_wowlan_support = {
29         .flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT,
30         .n_patterns = BRCMF_WOWL_MAXPATTERNS,
31         .pattern_max_len = BRCMF_WOWL_MAXPATTERNSIZE,
32 @@ -6350,21 +6350,29 @@ static void brcmf_wiphy_wowl_params(stru
33  {
34  #ifdef CONFIG_PM
35         struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
36 +       struct wiphy_wowlan_support *wowl;
37 +
38 +       wowl = kmemdup(&brcmf_wowlan_support, sizeof(brcmf_wowlan_support),
39 +                      GFP_KERNEL);
40 +       if (!wowl) {
41 +               brcmf_err("only support basic wowlan features\n");
42 +               wiphy->wowlan = &brcmf_wowlan_support;
43 +               return;
44 +       }
45  
46         if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PNO)) {
47                 if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_ND)) {
48 -                       brcmf_wowlan_support.flags |= WIPHY_WOWLAN_NET_DETECT;
49 -                       brcmf_wowlan_support.max_nd_match_sets =
50 -                               BRCMF_PNO_MAX_PFN_COUNT;
51 +                       wowl->flags |= WIPHY_WOWLAN_NET_DETECT;
52 +                       wowl->max_nd_match_sets = BRCMF_PNO_MAX_PFN_COUNT;
53                         init_waitqueue_head(&cfg->wowl.nd_data_wait);
54                 }
55         }
56         if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_GTK)) {
57 -               brcmf_wowlan_support.flags |= WIPHY_WOWLAN_SUPPORTS_GTK_REKEY;
58 -               brcmf_wowlan_support.flags |= WIPHY_WOWLAN_GTK_REKEY_FAILURE;
59 +               wowl->flags |= WIPHY_WOWLAN_SUPPORTS_GTK_REKEY;
60 +               wowl->flags |= WIPHY_WOWLAN_GTK_REKEY_FAILURE;
61         }
62  
63 -       wiphy->wowlan = &brcmf_wowlan_support;
64 +       wiphy->wowlan = wowl;
65  #endif
66  }
67  
68 @@ -6745,6 +6753,10 @@ static void brcmf_free_wiphy(struct wiph
69                 kfree(wiphy->bands[NL80211_BAND_5GHZ]->channels);
70                 kfree(wiphy->bands[NL80211_BAND_5GHZ]);
71         }
72 +#if IS_ENABLED(CONFIG_PM)
73 +       if (wiphy->wowlan != &brcmf_wowlan_support)
74 +               kfree(wiphy->wowlan);
75 +#endif
76         wiphy_free(wiphy);
77  }
78