94f2e6b972b4fd6fedae69c0e3e6e8d5d08ffa77
[librecmc/librecmc.git] / package / kernel / mac80211 / patches / 357-0003-brcmfmac-move-pno-helper-functions-in-separate-sourc.patch
1 From ac55136f43d3336c7b40238b779c404008229929 Mon Sep 17 00:00:00 2001
2 From: Arend Van Spriel <arend.vanspriel@broadcom.com>
3 Date: Wed, 23 Nov 2016 10:25:22 +0000
4 Subject: [PATCH] brcmfmac: move pno helper functions in separate source file
5
6 Introducing new source file for pno related functionality. Moving
7 existing pno functions.
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  .../wireless/broadcom/brcm80211/brcmfmac/Makefile  |   3 +-
16  .../broadcom/brcm80211/brcmfmac/cfg80211.c         |  93 ++-----------------
17  .../net/wireless/broadcom/brcm80211/brcmfmac/pno.c | 100 +++++++++++++++++++++
18  .../net/wireless/broadcom/brcm80211/brcmfmac/pno.h |  40 +++++++++
19  4 files changed, 150 insertions(+), 86 deletions(-)
20  create mode 100644 drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c
21  create mode 100644 drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.h
22
23 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
24 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
25 @@ -35,7 +35,8 @@ brcmfmac-objs += \
26                 firmware.o \
27                 feature.o \
28                 btcoex.o \
29 -               vendor.o
30 +               vendor.o \
31 +               pno.o
32  brcmfmac-$(CPTCFG_BRCMFMAC_PROTO_BCDC) += \
33                 bcdc.o
34  brcmfmac-$(CPTCFG_BRCMFMAC_PROTO_MSGBUF) += \
35 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
36 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
37 @@ -32,6 +32,7 @@
38  #include "fwil_types.h"
39  #include "p2p.h"
40  #include "btcoex.h"
41 +#include "pno.h"
42  #include "cfg80211.h"
43  #include "feature.h"
44  #include "fwil.h"
45 @@ -41,16 +42,6 @@
46  #include "common.h"
47  
48  #define BRCMF_SCAN_IE_LEN_MAX          2048
49 -#define BRCMF_PNO_VERSION              2
50 -#define BRCMF_PNO_TIME                 30
51 -#define BRCMF_PNO_REPEAT               4
52 -#define BRCMF_PNO_FREQ_EXPO_MAX                3
53 -#define BRCMF_PNO_MAX_PFN_COUNT                16
54 -#define BRCMF_PNO_ENABLE_ADAPTSCAN_BIT 6
55 -#define BRCMF_PNO_HIDDEN_BIT           2
56 -#define BRCMF_PNO_WPA_AUTH_ANY         0xFFFFFFFF
57 -#define BRCMF_PNO_SCAN_COMPLETE                1
58 -#define BRCMF_PNO_SCAN_INCOMPLETE      0
59  
60  #define WPA_OUI                                "\x00\x50\xF2"  /* WPA OUI */
61  #define WPA_OUI_TYPE                   1
62 @@ -3323,76 +3314,6 @@ out_err:
63         return err;
64  }
65  
66 -static int brcmf_dev_pno_clean(struct net_device *ndev)
67 -{
68 -       int ret;
69 -
70 -       /* Disable pfn */
71 -       ret = brcmf_fil_iovar_int_set(netdev_priv(ndev), "pfn", 0);
72 -       if (ret == 0) {
73 -               /* clear pfn */
74 -               ret = brcmf_fil_iovar_data_set(netdev_priv(ndev), "pfnclear",
75 -                                              NULL, 0);
76 -       }
77 -       if (ret < 0)
78 -               brcmf_err("failed code %d\n", ret);
79 -
80 -       return ret;
81 -}
82 -
83 -static int brcmf_dev_pno_config(struct brcmf_if *ifp,
84 -                               struct cfg80211_sched_scan_request *request)
85 -{
86 -       struct brcmf_pno_param_le pfn_param;
87 -       struct brcmf_pno_macaddr_le pfn_mac;
88 -       s32 err;
89 -       u8 *mac_mask;
90 -       int i;
91 -
92 -       memset(&pfn_param, 0, sizeof(pfn_param));
93 -       pfn_param.version = cpu_to_le32(BRCMF_PNO_VERSION);
94 -
95 -       /* set extra pno params */
96 -       pfn_param.flags = cpu_to_le16(1 << BRCMF_PNO_ENABLE_ADAPTSCAN_BIT);
97 -       pfn_param.repeat = BRCMF_PNO_REPEAT;
98 -       pfn_param.exp = BRCMF_PNO_FREQ_EXPO_MAX;
99 -
100 -       /* set up pno scan fr */
101 -       pfn_param.scan_freq = cpu_to_le32(BRCMF_PNO_TIME);
102 -
103 -       err = brcmf_fil_iovar_data_set(ifp, "pfn_set", &pfn_param,
104 -                                      sizeof(pfn_param));
105 -       if (err) {
106 -               brcmf_err("pfn_set failed, err=%d\n", err);
107 -               return err;
108 -       }
109 -
110 -       /* Find out if mac randomization should be turned on */
111 -       if (!(request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR))
112 -               return 0;
113 -
114 -       pfn_mac.version = BRCMF_PFN_MACADDR_CFG_VER;
115 -       pfn_mac.flags = BRCMF_PFN_MAC_OUI_ONLY | BRCMF_PFN_SET_MAC_UNASSOC;
116 -
117 -       memcpy(pfn_mac.mac, request->mac_addr, ETH_ALEN);
118 -       mac_mask = request->mac_addr_mask;
119 -       for (i = 0; i < ETH_ALEN; i++) {
120 -               pfn_mac.mac[i] &= mac_mask[i];
121 -               pfn_mac.mac[i] |= get_random_int() & ~(mac_mask[i]);
122 -       }
123 -       /* Clear multi bit */
124 -       pfn_mac.mac[0] &= 0xFE;
125 -       /* Set locally administered */
126 -       pfn_mac.mac[0] |= 0x02;
127 -
128 -       err = brcmf_fil_iovar_data_set(ifp, "pfn_macaddr", &pfn_mac,
129 -                                      sizeof(pfn_mac));
130 -       if (err)
131 -               brcmf_err("pfn_macaddr failed, err=%d\n", err);
132 -
133 -       return err;
134 -}
135 -
136  static int
137  brcmf_cfg80211_sched_scan_start(struct wiphy *wiphy,
138                                 struct net_device *ndev,
139 @@ -3436,15 +3357,16 @@ brcmf_cfg80211_sched_scan_start(struct w
140  
141         if (request->n_match_sets > 0) {
142                 /* clean up everything */
143 -               ret = brcmf_dev_pno_clean(ndev);
144 +               ret = brcmf_pno_clean(ifp);
145                 if  (ret < 0) {
146                         brcmf_err("failed error=%d\n", ret);
147                         return ret;
148                 }
149  
150                 /* configure pno */
151 -               if (brcmf_dev_pno_config(ifp, request))
152 -                       return -EINVAL;
153 +               ret = brcmf_pno_config(ifp, request);
154 +               if (ret < 0)
155 +                       return ret;
156  
157                 /* configure each match set */
158                 for (i = 0; i < request->n_match_sets; i++) {
159 @@ -3486,11 +3408,12 @@ static int brcmf_cfg80211_sched_scan_sto
160                                           struct net_device *ndev)
161  {
162         struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
163 +       struct brcmf_if *ifp = netdev_priv(ndev);
164  
165         brcmf_dbg(SCAN, "enter\n");
166 -       brcmf_dev_pno_clean(ndev);
167 +       brcmf_pno_clean(ifp);
168         if (cfg->sched_escan)
169 -               brcmf_notify_escan_complete(cfg, netdev_priv(ndev), true, true);
170 +               brcmf_notify_escan_complete(cfg, ifp, true, true);
171         return 0;
172  }
173  
174 --- /dev/null
175 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c
176 @@ -0,0 +1,100 @@
177 +/*
178 + * Copyright (c) 2016 Broadcom
179 + *
180 + * Permission to use, copy, modify, and/or distribute this software for any
181 + * purpose with or without fee is hereby granted, provided that the above
182 + * copyright notice and this permission notice appear in all copies.
183 + *
184 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
185 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
186 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
187 + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
188 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
189 + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
190 + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
191 + */
192 +#include <linux/netdevice.h>
193 +#include <net/cfg80211.h>
194 +
195 +#include "core.h"
196 +#include "debug.h"
197 +#include "pno.h"
198 +#include "fwil.h"
199 +#include "fwil_types.h"
200 +
201 +#define BRCMF_PNO_VERSION              2
202 +#define BRCMF_PNO_TIME                 30
203 +#define BRCMF_PNO_REPEAT               4
204 +#define BRCMF_PNO_FREQ_EXPO_MAX                3
205 +#define BRCMF_PNO_ENABLE_ADAPTSCAN_BIT 6
206 +#define BRCMF_PNO_SCAN_INCOMPLETE      0
207 +
208 +int brcmf_pno_clean(struct brcmf_if *ifp)
209 +{
210 +       int ret;
211 +
212 +       /* Disable pfn */
213 +       ret = brcmf_fil_iovar_int_set(ifp, "pfn", 0);
214 +       if (ret == 0) {
215 +               /* clear pfn */
216 +               ret = brcmf_fil_iovar_data_set(ifp, "pfnclear", NULL, 0);
217 +       }
218 +       if (ret < 0)
219 +               brcmf_err("failed code %d\n", ret);
220 +
221 +       return ret;
222 +}
223 +
224 +int brcmf_pno_config(struct brcmf_if *ifp,
225 +                    struct cfg80211_sched_scan_request *request)
226 +{
227 +       struct brcmf_pno_param_le pfn_param;
228 +       struct brcmf_pno_macaddr_le pfn_mac;
229 +       s32 err;
230 +       u8 *mac_mask;
231 +       int i;
232 +
233 +       memset(&pfn_param, 0, sizeof(pfn_param));
234 +       pfn_param.version = cpu_to_le32(BRCMF_PNO_VERSION);
235 +
236 +       /* set extra pno params */
237 +       pfn_param.flags = cpu_to_le16(1 << BRCMF_PNO_ENABLE_ADAPTSCAN_BIT);
238 +       pfn_param.repeat = BRCMF_PNO_REPEAT;
239 +       pfn_param.exp = BRCMF_PNO_FREQ_EXPO_MAX;
240 +
241 +       /* set up pno scan fr */
242 +       pfn_param.scan_freq = cpu_to_le32(BRCMF_PNO_TIME);
243 +
244 +       err = brcmf_fil_iovar_data_set(ifp, "pfn_set", &pfn_param,
245 +                                      sizeof(pfn_param));
246 +       if (err) {
247 +               brcmf_err("pfn_set failed, err=%d\n", err);
248 +               return err;
249 +       }
250 +
251 +       /* Find out if mac randomization should be turned on */
252 +       if (!(request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR))
253 +               return 0;
254 +
255 +       pfn_mac.version = BRCMF_PFN_MACADDR_CFG_VER;
256 +       pfn_mac.flags = BRCMF_PFN_MAC_OUI_ONLY | BRCMF_PFN_SET_MAC_UNASSOC;
257 +
258 +       memcpy(pfn_mac.mac, request->mac_addr, ETH_ALEN);
259 +       mac_mask = request->mac_addr_mask;
260 +       for (i = 0; i < ETH_ALEN; i++) {
261 +               pfn_mac.mac[i] &= mac_mask[i];
262 +               pfn_mac.mac[i] |= get_random_int() & ~(mac_mask[i]);
263 +       }
264 +       /* Clear multi bit */
265 +       pfn_mac.mac[0] &= 0xFE;
266 +       /* Set locally administered */
267 +       pfn_mac.mac[0] |= 0x02;
268 +
269 +       err = brcmf_fil_iovar_data_set(ifp, "pfn_macaddr", &pfn_mac,
270 +                                      sizeof(pfn_mac));
271 +       if (err)
272 +               brcmf_err("pfn_macaddr failed, err=%d\n", err);
273 +
274 +       return err;
275 +}
276 +
277 --- /dev/null
278 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.h
279 @@ -0,0 +1,40 @@
280 +/*
281 + * Copyright (c) 2016 Broadcom
282 + *
283 + * Permission to use, copy, modify, and/or distribute this software for any
284 + * purpose with or without fee is hereby granted, provided that the above
285 + * copyright notice and this permission notice appear in all copies.
286 + *
287 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
288 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
289 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
290 + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
291 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
292 + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
293 + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
294 + */
295 +#ifndef _BRCMF_PNO_H
296 +#define _BRCMF_PNO_H
297 +
298 +#define BRCMF_PNO_SCAN_COMPLETE                1
299 +#define BRCMF_PNO_WPA_AUTH_ANY         0xFFFFFFFF
300 +#define BRCMF_PNO_HIDDEN_BIT           2
301 +#define BRCMF_PNO_MAX_PFN_COUNT                16
302 +
303 +/**
304 + * brcmf_pno_clean - disable and clear pno in firmware.
305 + *
306 + * @ifp: interface object used.
307 + */
308 +int brcmf_pno_clean(struct brcmf_if *ifp);
309 +
310 +/**
311 + * brcmf_pno_config - configure pno parameters.
312 + *
313 + * @ifp: interface object used.
314 + * @request: scheduled scan parameters.
315 + */
316 +int brcmf_pno_config(struct brcmf_if *ifp,
317 +                    struct cfg80211_sched_scan_request *request);
318 +
319 +#endif /* _BRCMF_PNO_H */