mac80211: brcmfmac: backport scheduled scan cleanup and chip support
[librecmc/librecmc.git] / package / kernel / mac80211 / patches / 357-0008-brcmfmac-move-scheduled-scan-activation-to-pno-sourc.patch
1 From 3e48611d31dd333be01576902f2dc11adefc9a06 Mon Sep 17 00:00:00 2001
2 From: Arend Van Spriel <arend.vanspriel@broadcom.com>
3 Date: Wed, 23 Nov 2016 10:25:27 +0000
4 Subject: [PATCH] brcmfmac: move scheduled scan activation to pno source file
5
6 Rework .sched_scan_start() callback moving actual configuration of
7 the device in pno source file.
8
9 Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
10 Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
11 Reviewed-by: Franky Lin <franky.lin@broadcom.com>
12 Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
13 Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
14 ---
15  .../broadcom/brcm80211/brcmfmac/cfg80211.c         |  65 +-----------
16  .../net/wireless/broadcom/brcm80211/brcmfmac/pno.c | 110 +++++++++++++++++----
17  .../net/wireless/broadcom/brcm80211/brcmfmac/pno.h |  29 +-----
18  3 files changed, 94 insertions(+), 110 deletions(-)
19
20 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
21 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
22 @@ -42,7 +42,6 @@
23  #include "common.h"
24  
25  #define BRCMF_SCAN_IE_LEN_MAX          2048
26 -#define BRCMF_SCHED_SCAN_PERIOD                30
27  
28  #define WPA_OUI                                "\x00\x50\xF2"  /* WPA OUI */
29  #define WPA_OUI_TYPE                   1
30 @@ -3342,24 +3341,6 @@ free_req:
31         return err;
32  }
33  
34 -static bool brcmf_is_ssid_active(struct cfg80211_ssid *ssid,
35 -                                struct cfg80211_sched_scan_request *req)
36 -{
37 -       int i;
38 -
39 -       if (!ssid || !req->ssids || !req->n_ssids)
40 -               return false;
41 -
42 -       for (i = 0; i < req->n_ssids; i++) {
43 -               if (ssid->ssid_len == req->ssids[i].ssid_len) {
44 -                       if (!strncmp(ssid->ssid, req->ssids[i].ssid,
45 -                                    ssid->ssid_len))
46 -                               return true;
47 -               }
48 -       }
49 -       return false;
50 -}
51 -
52  static int
53  brcmf_cfg80211_sched_scan_start(struct wiphy *wiphy,
54                                 struct net_device *ndev,
55 @@ -3367,9 +3348,6 @@ brcmf_cfg80211_sched_scan_start(struct w
56  {
57         struct brcmf_if *ifp = netdev_priv(ndev);
58         struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy);
59 -       struct cfg80211_ssid *ssid;
60 -       int i;
61 -       int ret = 0;
62  
63         brcmf_dbg(SCAN, "Enter n_match_sets:%d n_ssids:%d\n",
64                   req->n_match_sets, req->n_ssids);
65 @@ -3389,48 +3367,7 @@ brcmf_cfg80211_sched_scan_start(struct w
66                 return -EINVAL;
67         }
68  
69 -       /* clean up everything */
70 -       ret = brcmf_pno_clean(ifp);
71 -       if  (ret < 0) {
72 -               brcmf_err("failed error=%d\n", ret);
73 -               return ret;
74 -       }
75 -
76 -       /* configure pno */
77 -       ret = brcmf_pno_config(ifp, BRCMF_SCHED_SCAN_PERIOD, 0, 0);
78 -       if (ret < 0)
79 -               return ret;
80 -
81 -       /* configure random mac */
82 -       if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
83 -               ret = brcmf_pno_set_random(ifp, req->mac_addr,
84 -                                          req->mac_addr_mask);
85 -               if (ret < 0)
86 -                       return ret;
87 -       }
88 -
89 -       /* configure each match set */
90 -       for (i = 0; i < req->n_match_sets; i++) {
91 -
92 -               ssid = &req->match_sets[i].ssid;
93 -
94 -               if (!ssid->ssid_len) {
95 -                       brcmf_err("skip broadcast ssid\n");
96 -                       continue;
97 -               }
98 -
99 -               ret = brcmf_pno_add_ssid(ifp, ssid,
100 -                                        brcmf_is_ssid_active(ssid, req));
101 -               if (ret < 0)
102 -                       brcmf_dbg(SCAN, ">>> PNO filter %s for ssid (%s)\n",
103 -                                 ret == 0 ? "set" : "failed", ssid->ssid);
104 -       }
105 -       /* Enable the PNO */
106 -       ret = brcmf_fil_iovar_int_set(ifp, "pfn", 1);
107 -       if (ret < 0)
108 -               brcmf_err("PNO enable failed!! ret=%d\n", ret);
109 -
110 -       return ret;
111 +       return brcmf_pno_start_sched_scan(ifp, req);
112  }
113  
114  static int brcmf_cfg80211_sched_scan_stop(struct wiphy *wiphy,
115 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c
116 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c
117 @@ -32,25 +32,10 @@
118  #define BRCMF_PNO_SCAN_INCOMPLETE      0
119  #define BRCMF_PNO_WPA_AUTH_ANY         0xFFFFFFFF
120  #define BRCMF_PNO_HIDDEN_BIT           2
121 +#define BRCMF_PNO_SCHED_SCAN_PERIOD    30
122  
123 -int brcmf_pno_clean(struct brcmf_if *ifp)
124 -{
125 -       int ret;
126 -
127 -       /* Disable pfn */
128 -       ret = brcmf_fil_iovar_int_set(ifp, "pfn", 0);
129 -       if (ret == 0) {
130 -               /* clear pfn */
131 -               ret = brcmf_fil_iovar_data_set(ifp, "pfnclear", NULL, 0);
132 -       }
133 -       if (ret < 0)
134 -               brcmf_err("failed code %d\n", ret);
135 -
136 -       return ret;
137 -}
138 -
139 -int brcmf_pno_config(struct brcmf_if *ifp, u32 scan_freq,
140 -                    u32 mscan, u32 bestn)
141 +static int brcmf_pno_config(struct brcmf_if *ifp, u32 scan_freq,
142 +                           u32 mscan, u32 bestn)
143  {
144         struct brcmf_pno_param_le pfn_param;
145         u16 flags;
146 @@ -102,7 +87,8 @@ exit:
147         return err;
148  }
149  
150 -int brcmf_pno_set_random(struct brcmf_if *ifp, u8 *mac_addr, u8 *mac_mask)
151 +static int brcmf_pno_set_random(struct brcmf_if *ifp, u8 *mac_addr,
152 +                               u8 *mac_mask)
153  {
154         struct brcmf_pno_macaddr_le pfn_mac;
155         int err, i;
156 @@ -128,8 +114,8 @@ int brcmf_pno_set_random(struct brcmf_if
157         return err;
158  }
159  
160 -int brcmf_pno_add_ssid(struct brcmf_if *ifp, struct cfg80211_ssid *ssid,
161 -                      bool active)
162 +static int brcmf_pno_add_ssid(struct brcmf_if *ifp, struct cfg80211_ssid *ssid,
163 +                             bool active)
164  {
165         struct brcmf_pno_net_param_le pfn;
166  
167 @@ -144,3 +130,85 @@ int brcmf_pno_add_ssid(struct brcmf_if *
168         return brcmf_fil_iovar_data_set(ifp, "pfn_add", &pfn, sizeof(pfn));
169  }
170  
171 +static bool brcmf_is_ssid_active(struct cfg80211_ssid *ssid,
172 +                                struct cfg80211_sched_scan_request *req)
173 +{
174 +       int i;
175 +
176 +       if (!ssid || !req->ssids || !req->n_ssids)
177 +               return false;
178 +
179 +       for (i = 0; i < req->n_ssids; i++) {
180 +               if (ssid->ssid_len == req->ssids[i].ssid_len) {
181 +                       if (!strncmp(ssid->ssid, req->ssids[i].ssid,
182 +                                    ssid->ssid_len))
183 +                               return true;
184 +               }
185 +       }
186 +       return false;
187 +}
188 +
189 +int brcmf_pno_clean(struct brcmf_if *ifp)
190 +{
191 +       int ret;
192 +
193 +       /* Disable pfn */
194 +       ret = brcmf_fil_iovar_int_set(ifp, "pfn", 0);
195 +       if (ret == 0) {
196 +               /* clear pfn */
197 +               ret = brcmf_fil_iovar_data_set(ifp, "pfnclear", NULL, 0);
198 +       }
199 +       if (ret < 0)
200 +               brcmf_err("failed code %d\n", ret);
201 +
202 +       return ret;
203 +}
204 +
205 +int brcmf_pno_start_sched_scan(struct brcmf_if *ifp,
206 +                              struct cfg80211_sched_scan_request *req)
207 +{
208 +       struct cfg80211_ssid *ssid;
209 +       int i, ret;
210 +
211 +       /* clean up everything */
212 +       ret = brcmf_pno_clean(ifp);
213 +       if  (ret < 0) {
214 +               brcmf_err("failed error=%d\n", ret);
215 +               return ret;
216 +       }
217 +
218 +       /* configure pno */
219 +       ret = brcmf_pno_config(ifp, BRCMF_PNO_SCHED_SCAN_PERIOD, 0, 0);
220 +       if (ret < 0)
221 +               return ret;
222 +
223 +       /* configure random mac */
224 +       if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
225 +               ret = brcmf_pno_set_random(ifp, req->mac_addr,
226 +                                          req->mac_addr_mask);
227 +               if (ret < 0)
228 +                       return ret;
229 +       }
230 +
231 +       /* configure each match set */
232 +       for (i = 0; i < req->n_match_sets; i++) {
233 +               ssid = &req->match_sets[i].ssid;
234 +               if (!ssid->ssid_len) {
235 +                       brcmf_err("skip broadcast ssid\n");
236 +                       continue;
237 +               }
238 +
239 +               ret = brcmf_pno_add_ssid(ifp, ssid,
240 +                                        brcmf_is_ssid_active(ssid, req));
241 +               if (ret < 0)
242 +                       brcmf_dbg(SCAN, ">>> PNO filter %s for ssid (%s)\n",
243 +                                 ret == 0 ? "set" : "failed", ssid->ssid);
244 +       }
245 +       /* Enable the PNO */
246 +       ret = brcmf_fil_iovar_int_set(ifp, "pfn", 1);
247 +       if (ret < 0)
248 +               brcmf_err("PNO enable failed!! ret=%d\n", ret);
249 +
250 +       return ret;
251 +}
252 +
253 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.h
254 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.h
255 @@ -27,33 +27,12 @@
256  int brcmf_pno_clean(struct brcmf_if *ifp);
257  
258  /**
259 - * brcmf_pno_config - configure pno parameters.
260 + * brcmf_pno_start_sched_scan - initiate scheduled scan on device.
261   *
262   * @ifp: interface object used.
263 - * @scan_freq: scan frequency period in seconds.
264 - * @mscan: maximum number of scans stored in firmware.
265 - * @bestn: maximum number of APs per scan stored in firmware.
266 + * @req: configuration parameters for scheduled scan.
267   */
268 -int brcmf_pno_config(struct brcmf_if *ifp, u32 scan_freq,
269 -                    u32 mscan, u32 bestn);
270 -
271 -/**
272 - * brcmf_pno_set_random - setup randomisation mac address for pno.
273 - *
274 - * @ifp: interface object used.
275 - * @mac_addr: MAC address used with randomisation.
276 - * @mac_mask: MAC address mask used for randomisation.
277 - */
278 -int brcmf_pno_set_random(struct brcmf_if *ifp, u8 *mac_addr, u8 *mac_mask);
279 -
280 -/**
281 - * brcmf_pno_add_ssid - add ssid for pno in firmware.
282 - *
283 - * @ifp: interface object used.
284 - * @ssid: ssid information.
285 - * @active: indicate this ssid needs to be actively probed.
286 - */
287 -int brcmf_pno_add_ssid(struct brcmf_if *ifp, struct cfg80211_ssid *ssid,
288 -                      bool active);
289 +int brcmf_pno_start_sched_scan(struct brcmf_if *ifp,
290 +                              struct cfg80211_sched_scan_request *req);
291  
292  #endif /* _BRCMF_PNO_H */