mac80211: brcmfmac: backport scheduled scan cleanup and chip support
[openwrt/openwrt.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 */