1 // SPDX-License-Identifier: ISC
2 /*
3  * Copyright (c) 2010 Broadcom Corporation
4  */
5 
6 /* Toplevel file. Relies on dhd_linux.c to send commands to the dongle. */
7 
8 #include <linux/kernel.h>
9 #include <linux/etherdevice.h>
10 #include <linux/module.h>
11 #include <linux/vmalloc.h>
12 #include <net/cfg80211.h>
13 #include <net/netlink.h>
14 #include <uapi/linux/if_arp.h>
15 
16 #include <brcmu_utils.h>
17 #include <defs.h>
18 #include <brcmu_wifi.h>
19 #include "core.h"
20 #include "debug.h"
21 #include "tracepoint.h"
22 #include "fwil_types.h"
23 #include "p2p.h"
24 #include "btcoex.h"
25 #include "pno.h"
26 #include "fwsignal.h"
27 #include "cfg80211.h"
28 #include "feature.h"
29 #include "fwil.h"
30 #include "proto.h"
31 #include "vendor.h"
32 #include "bus.h"
33 #include "common.h"
34 
35 #define BRCMF_SCAN_IE_LEN_MAX		2048
36 
37 #define WPA_OUI				"\x00\x50\xF2"	/* WPA OUI */
38 #define WPA_OUI_TYPE			1
39 #define RSN_OUI				"\x00\x0F\xAC"	/* RSN OUI */
40 #define	WME_OUI_TYPE			2
41 #define WPS_OUI_TYPE			4
42 
43 #define VS_IE_FIXED_HDR_LEN		6
44 #define WPA_IE_VERSION_LEN		2
45 #define WPA_IE_MIN_OUI_LEN		4
46 #define WPA_IE_SUITE_COUNT_LEN		2
47 
48 #define WPA_CIPHER_NONE			0	/* None */
49 #define WPA_CIPHER_WEP_40		1	/* WEP (40-bit) */
50 #define WPA_CIPHER_TKIP			2	/* TKIP: default for WPA */
51 #define WPA_CIPHER_AES_CCM		4	/* AES (CCM) */
52 #define WPA_CIPHER_WEP_104		5	/* WEP (104-bit) */
53 
54 #define RSN_AKM_NONE			0	/* None (IBSS) */
55 #define RSN_AKM_UNSPECIFIED		1	/* Over 802.1x */
56 #define RSN_AKM_PSK			2	/* Pre-shared Key */
57 #define RSN_AKM_SHA256_1X		5	/* SHA256, 802.1X */
58 #define RSN_AKM_SHA256_PSK		6	/* SHA256, Pre-shared Key */
59 #define RSN_AKM_SAE			8	/* SAE */
60 #define RSN_CAP_LEN			2	/* Length of RSN capabilities */
61 #define RSN_CAP_PTK_REPLAY_CNTR_MASK	(BIT(2) | BIT(3))
62 #define RSN_CAP_MFPR_MASK		BIT(6)
63 #define RSN_CAP_MFPC_MASK		BIT(7)
64 #define RSN_PMKID_COUNT_LEN		2
65 
66 #define VNDR_IE_CMD_LEN			4	/* length of the set command
67 						 * string :"add", "del" (+ NUL)
68 						 */
69 #define VNDR_IE_COUNT_OFFSET		4
70 #define VNDR_IE_PKTFLAG_OFFSET		8
71 #define VNDR_IE_VSIE_OFFSET		12
72 #define VNDR_IE_HDR_SIZE		12
73 #define VNDR_IE_PARSE_LIMIT		5
74 
75 #define	DOT11_MGMT_HDR_LEN		24	/* d11 management header len */
76 #define	DOT11_BCN_PRB_FIXED_LEN		12	/* beacon/probe fixed length */
77 
78 #define BRCMF_SCAN_JOIN_ACTIVE_DWELL_TIME_MS	320
79 #define BRCMF_SCAN_JOIN_PASSIVE_DWELL_TIME_MS	400
80 #define BRCMF_SCAN_JOIN_PROBE_INTERVAL_MS	20
81 
82 #define BRCMF_SCAN_CHANNEL_TIME		40
83 #define BRCMF_SCAN_UNASSOC_TIME		40
84 #define BRCMF_SCAN_PASSIVE_TIME		120
85 
86 #define BRCMF_ND_INFO_TIMEOUT		msecs_to_jiffies(2000)
87 
88 #define BRCMF_PS_MAX_TIMEOUT_MS		2000
89 
90 #define BRCMF_ASSOC_PARAMS_FIXED_SIZE \
91 	(sizeof(struct brcmf_assoc_params_le) - sizeof(u16))
92 
93 static bool check_vif_up(struct brcmf_cfg80211_vif *vif)
94 {
95 	if (!test_bit(BRCMF_VIF_STATUS_READY, &vif->sme_state)) {
96 		brcmf_dbg(INFO, "device is not ready : status (%lu)\n",
97 			  vif->sme_state);
98 		return false;
99 	}
100 	return true;
101 }
102 
103 #define RATE_TO_BASE100KBPS(rate)   (((rate) * 10) / 2)
104 #define RATETAB_ENT(_rateid, _flags) \
105 	{                                                               \
106 		.bitrate        = RATE_TO_BASE100KBPS(_rateid),     \
107 		.hw_value       = (_rateid),                            \
108 		.flags          = (_flags),                             \
109 	}
110 
111 static struct ieee80211_rate __wl_rates[] = {
112 	RATETAB_ENT(BRCM_RATE_1M, 0),
113 	RATETAB_ENT(BRCM_RATE_2M, IEEE80211_RATE_SHORT_PREAMBLE),
114 	RATETAB_ENT(BRCM_RATE_5M5, IEEE80211_RATE_SHORT_PREAMBLE),
115 	RATETAB_ENT(BRCM_RATE_11M, IEEE80211_RATE_SHORT_PREAMBLE),
116 	RATETAB_ENT(BRCM_RATE_6M, 0),
117 	RATETAB_ENT(BRCM_RATE_9M, 0),
118 	RATETAB_ENT(BRCM_RATE_12M, 0),
119 	RATETAB_ENT(BRCM_RATE_18M, 0),
120 	RATETAB_ENT(BRCM_RATE_24M, 0),
121 	RATETAB_ENT(BRCM_RATE_36M, 0),
122 	RATETAB_ENT(BRCM_RATE_48M, 0),
123 	RATETAB_ENT(BRCM_RATE_54M, 0),
124 };
125 
126 #define wl_g_rates		(__wl_rates + 0)
127 #define wl_g_rates_size		ARRAY_SIZE(__wl_rates)
128 #define wl_a_rates		(__wl_rates + 4)
129 #define wl_a_rates_size		(wl_g_rates_size - 4)
130 
131 #define CHAN2G(_channel, _freq) {				\
132 	.band			= NL80211_BAND_2GHZ,		\
133 	.center_freq		= (_freq),			\
134 	.hw_value		= (_channel),			\
135 	.max_antenna_gain	= 0,				\
136 	.max_power		= 30,				\
137 }
138 
139 #define CHAN5G(_channel) {					\
140 	.band			= NL80211_BAND_5GHZ,		\
141 	.center_freq		= 5000 + (5 * (_channel)),	\
142 	.hw_value		= (_channel),			\
143 	.max_antenna_gain	= 0,				\
144 	.max_power		= 30,				\
145 }
146 
147 static struct ieee80211_channel __wl_2ghz_channels[] = {
148 	CHAN2G(1, 2412), CHAN2G(2, 2417), CHAN2G(3, 2422), CHAN2G(4, 2427),
149 	CHAN2G(5, 2432), CHAN2G(6, 2437), CHAN2G(7, 2442), CHAN2G(8, 2447),
150 	CHAN2G(9, 2452), CHAN2G(10, 2457), CHAN2G(11, 2462), CHAN2G(12, 2467),
151 	CHAN2G(13, 2472), CHAN2G(14, 2484)
152 };
153 
154 static struct ieee80211_channel __wl_5ghz_channels[] = {
155 	CHAN5G(34), CHAN5G(36), CHAN5G(38), CHAN5G(40), CHAN5G(42),
156 	CHAN5G(44), CHAN5G(46), CHAN5G(48), CHAN5G(52), CHAN5G(56),
157 	CHAN5G(60), CHAN5G(64), CHAN5G(100), CHAN5G(104), CHAN5G(108),
158 	CHAN5G(112), CHAN5G(116), CHAN5G(120), CHAN5G(124), CHAN5G(128),
159 	CHAN5G(132), CHAN5G(136), CHAN5G(140), CHAN5G(144), CHAN5G(149),
160 	CHAN5G(153), CHAN5G(157), CHAN5G(161), CHAN5G(165)
161 };
162 
163 /* Band templates duplicated per wiphy. The channel info
164  * above is added to the band during setup.
165  */
166 static const struct ieee80211_supported_band __wl_band_2ghz = {
167 	.band = NL80211_BAND_2GHZ,
168 	.bitrates = wl_g_rates,
169 	.n_bitrates = wl_g_rates_size,
170 };
171 
172 static const struct ieee80211_supported_band __wl_band_5ghz = {
173 	.band = NL80211_BAND_5GHZ,
174 	.bitrates = wl_a_rates,
175 	.n_bitrates = wl_a_rates_size,
176 };
177 
178 /* This is to override regulatory domains defined in cfg80211 module (reg.c)
179  * By default world regulatory domain defined in reg.c puts the flags
180  * NL80211_RRF_NO_IR for 5GHz channels (for * 36..48 and 149..165).
181  * With respect to these flags, wpa_supplicant doesn't * start p2p
182  * operations on 5GHz channels. All the changes in world regulatory
183  * domain are to be done here.
184  */
185 static const struct ieee80211_regdomain brcmf_regdom = {
186 	.n_reg_rules = 4,
187 	.alpha2 =  "99",
188 	.reg_rules = {
189 		/* IEEE 802.11b/g, channels 1..11 */
190 		REG_RULE(2412-10, 2472+10, 40, 6, 20, 0),
191 		/* If any */
192 		/* IEEE 802.11 channel 14 - Only JP enables
193 		 * this and for 802.11b only
194 		 */
195 		REG_RULE(2484-10, 2484+10, 20, 6, 20, 0),
196 		/* IEEE 802.11a, channel 36..64 */
197 		REG_RULE(5150-10, 5350+10, 160, 6, 20, 0),
198 		/* IEEE 802.11a, channel 100..165 */
199 		REG_RULE(5470-10, 5850+10, 160, 6, 20, 0), }
200 };
201 
202 /* Note: brcmf_cipher_suites is an array of int defining which cipher suites
203  * are supported. A pointer to this array and the number of entries is passed
204  * on to upper layers. AES_CMAC defines whether or not the driver supports MFP.
205  * So the cipher suite AES_CMAC has to be the last one in the array, and when
206  * device does not support MFP then the number of suites will be decreased by 1
207  */
208 static const u32 brcmf_cipher_suites[] = {
209 	WLAN_CIPHER_SUITE_WEP40,
210 	WLAN_CIPHER_SUITE_WEP104,
211 	WLAN_CIPHER_SUITE_TKIP,
212 	WLAN_CIPHER_SUITE_CCMP,
213 	/* Keep as last entry: */
214 	WLAN_CIPHER_SUITE_AES_CMAC
215 };
216 
217 /* Vendor specific ie. id = 221, oui and type defines exact ie */
218 struct brcmf_vs_tlv {
219 	u8 id;
220 	u8 len;
221 	u8 oui[3];
222 	u8 oui_type;
223 };
224 
225 struct parsed_vndr_ie_info {
226 	u8 *ie_ptr;
227 	u32 ie_len;	/* total length including id & length field */
228 	struct brcmf_vs_tlv vndrie;
229 };
230 
231 struct parsed_vndr_ies {
232 	u32 count;
233 	struct parsed_vndr_ie_info ie_info[VNDR_IE_PARSE_LIMIT];
234 };
235 
236 static u8 nl80211_band_to_fwil(enum nl80211_band band)
237 {
238 	switch (band) {
239 	case NL80211_BAND_2GHZ:
240 		return WLC_BAND_2G;
241 	case NL80211_BAND_5GHZ:
242 		return WLC_BAND_5G;
243 	default:
244 		WARN_ON(1);
245 		break;
246 	}
247 	return 0;
248 }
249 
250 static u16 chandef_to_chanspec(struct brcmu_d11inf *d11inf,
251 			       struct cfg80211_chan_def *ch)
252 {
253 	struct brcmu_chan ch_inf;
254 	s32 primary_offset;
255 
256 	brcmf_dbg(TRACE, "chandef: control %d center %d width %d\n",
257 		  ch->chan->center_freq, ch->center_freq1, ch->width);
258 	ch_inf.chnum = ieee80211_frequency_to_channel(ch->center_freq1);
259 	primary_offset = ch->chan->center_freq - ch->center_freq1;
260 	switch (ch->width) {
261 	case NL80211_CHAN_WIDTH_20:
262 	case NL80211_CHAN_WIDTH_20_NOHT:
263 		ch_inf.bw = BRCMU_CHAN_BW_20;
264 		WARN_ON(primary_offset != 0);
265 		break;
266 	case NL80211_CHAN_WIDTH_40:
267 		ch_inf.bw = BRCMU_CHAN_BW_40;
268 		if (primary_offset > 0)
269 			ch_inf.sb = BRCMU_CHAN_SB_U;
270 		else
271 			ch_inf.sb = BRCMU_CHAN_SB_L;
272 		break;
273 	case NL80211_CHAN_WIDTH_80:
274 		ch_inf.bw = BRCMU_CHAN_BW_80;
275 		if (primary_offset == -30)
276 			ch_inf.sb = BRCMU_CHAN_SB_LL;
277 		else if (primary_offset == -10)
278 			ch_inf.sb = BRCMU_CHAN_SB_LU;
279 		else if (primary_offset == 10)
280 			ch_inf.sb = BRCMU_CHAN_SB_UL;
281 		else
282 			ch_inf.sb = BRCMU_CHAN_SB_UU;
283 		break;
284 	case NL80211_CHAN_WIDTH_160:
285 		ch_inf.bw = BRCMU_CHAN_BW_160;
286 		if (primary_offset == -70)
287 			ch_inf.sb = BRCMU_CHAN_SB_LLL;
288 		else if (primary_offset == -50)
289 			ch_inf.sb = BRCMU_CHAN_SB_LLU;
290 		else if (primary_offset == -30)
291 			ch_inf.sb = BRCMU_CHAN_SB_LUL;
292 		else if (primary_offset == -10)
293 			ch_inf.sb = BRCMU_CHAN_SB_LUU;
294 		else if (primary_offset == 10)
295 			ch_inf.sb = BRCMU_CHAN_SB_ULL;
296 		else if (primary_offset == 30)
297 			ch_inf.sb = BRCMU_CHAN_SB_ULU;
298 		else if (primary_offset == 50)
299 			ch_inf.sb = BRCMU_CHAN_SB_UUL;
300 		else
301 			ch_inf.sb = BRCMU_CHAN_SB_UUU;
302 		break;
303 	case NL80211_CHAN_WIDTH_80P80:
304 	case NL80211_CHAN_WIDTH_5:
305 	case NL80211_CHAN_WIDTH_10:
306 	default:
307 		WARN_ON_ONCE(1);
308 	}
309 	switch (ch->chan->band) {
310 	case NL80211_BAND_2GHZ:
311 		ch_inf.band = BRCMU_CHAN_BAND_2G;
312 		break;
313 	case NL80211_BAND_5GHZ:
314 		ch_inf.band = BRCMU_CHAN_BAND_5G;
315 		break;
316 	case NL80211_BAND_60GHZ:
317 	default:
318 		WARN_ON_ONCE(1);
319 	}
320 	d11inf->encchspec(&ch_inf);
321 
322 	brcmf_dbg(TRACE, "chanspec: 0x%x\n", ch_inf.chspec);
323 	return ch_inf.chspec;
324 }
325 
326 u16 channel_to_chanspec(struct brcmu_d11inf *d11inf,
327 			struct ieee80211_channel *ch)
328 {
329 	struct brcmu_chan ch_inf;
330 
331 	ch_inf.chnum = ieee80211_frequency_to_channel(ch->center_freq);
332 	ch_inf.bw = BRCMU_CHAN_BW_20;
333 	d11inf->encchspec(&ch_inf);
334 
335 	return ch_inf.chspec;
336 }
337 
338 /* Traverse a string of 1-byte tag/1-byte length/variable-length value
339  * triples, returning a pointer to the substring whose first element
340  * matches tag
341  */
342 static const struct brcmf_tlv *
343 brcmf_parse_tlvs(const void *buf, int buflen, uint key)
344 {
345 	const struct brcmf_tlv *elt = buf;
346 	int totlen = buflen;
347 
348 	/* find tagged parameter */
349 	while (totlen >= TLV_HDR_LEN) {
350 		int len = elt->len;
351 
352 		/* validate remaining totlen */
353 		if ((elt->id == key) && (totlen >= (len + TLV_HDR_LEN)))
354 			return elt;
355 
356 		elt = (struct brcmf_tlv *)((u8 *)elt + (len + TLV_HDR_LEN));
357 		totlen -= (len + TLV_HDR_LEN);
358 	}
359 
360 	return NULL;
361 }
362 
363 /* Is any of the tlvs the expected entry? If
364  * not update the tlvs buffer pointer/length.
365  */
366 static bool
367 brcmf_tlv_has_ie(const u8 *ie, const u8 **tlvs, u32 *tlvs_len,
368 		 const u8 *oui, u32 oui_len, u8 type)
369 {
370 	/* If the contents match the OUI and the type */
371 	if (ie[TLV_LEN_OFF] >= oui_len + 1 &&
372 	    !memcmp(&ie[TLV_BODY_OFF], oui, oui_len) &&
373 	    type == ie[TLV_BODY_OFF + oui_len]) {
374 		return true;
375 	}
376 
377 	if (tlvs == NULL)
378 		return false;
379 	/* point to the next ie */
380 	ie += ie[TLV_LEN_OFF] + TLV_HDR_LEN;
381 	/* calculate the length of the rest of the buffer */
382 	*tlvs_len -= (int)(ie - *tlvs);
383 	/* update the pointer to the start of the buffer */
384 	*tlvs = ie;
385 
386 	return false;
387 }
388 
389 static struct brcmf_vs_tlv *
390 brcmf_find_wpaie(const u8 *parse, u32 len)
391 {
392 	const struct brcmf_tlv *ie;
393 
394 	while ((ie = brcmf_parse_tlvs(parse, len, WLAN_EID_VENDOR_SPECIFIC))) {
395 		if (brcmf_tlv_has_ie((const u8 *)ie, &parse, &len,
396 				     WPA_OUI, TLV_OUI_LEN, WPA_OUI_TYPE))
397 			return (struct brcmf_vs_tlv *)ie;
398 	}
399 	return NULL;
400 }
401 
402 static struct brcmf_vs_tlv *
403 brcmf_find_wpsie(const u8 *parse, u32 len)
404 {
405 	const struct brcmf_tlv *ie;
406 
407 	while ((ie = brcmf_parse_tlvs(parse, len, WLAN_EID_VENDOR_SPECIFIC))) {
408 		if (brcmf_tlv_has_ie((u8 *)ie, &parse, &len,
409 				     WPA_OUI, TLV_OUI_LEN, WPS_OUI_TYPE))
410 			return (struct brcmf_vs_tlv *)ie;
411 	}
412 	return NULL;
413 }
414 
415 static int brcmf_vif_change_validate(struct brcmf_cfg80211_info *cfg,
416 				     struct brcmf_cfg80211_vif *vif,
417 				     enum nl80211_iftype new_type)
418 {
419 	struct brcmf_cfg80211_vif *pos;
420 	bool check_combos = false;
421 	int ret = 0;
422 	struct iface_combination_params params = {
423 		.num_different_channels = 1,
424 	};
425 
426 	list_for_each_entry(pos, &cfg->vif_list, list)
427 		if (pos == vif) {
428 			params.iftype_num[new_type]++;
429 		} else {
430 			/* concurrent interfaces so need check combinations */
431 			check_combos = true;
432 			params.iftype_num[pos->wdev.iftype]++;
433 		}
434 
435 	if (check_combos)
436 		ret = cfg80211_check_combinations(cfg->wiphy, &params);
437 
438 	return ret;
439 }
440 
441 static int brcmf_vif_add_validate(struct brcmf_cfg80211_info *cfg,
442 				  enum nl80211_iftype new_type)
443 {
444 	struct brcmf_cfg80211_vif *pos;
445 	struct iface_combination_params params = {
446 		.num_different_channels = 1,
447 	};
448 
449 	list_for_each_entry(pos, &cfg->vif_list, list)
450 		params.iftype_num[pos->wdev.iftype]++;
451 
452 	params.iftype_num[new_type]++;
453 	return cfg80211_check_combinations(cfg->wiphy, &params);
454 }
455 
456 static void convert_key_from_CPU(struct brcmf_wsec_key *key,
457 				 struct brcmf_wsec_key_le *key_le)
458 {
459 	key_le->index = cpu_to_le32(key->index);
460 	key_le->len = cpu_to_le32(key->len);
461 	key_le->algo = cpu_to_le32(key->algo);
462 	key_le->flags = cpu_to_le32(key->flags);
463 	key_le->rxiv.hi = cpu_to_le32(key->rxiv.hi);
464 	key_le->rxiv.lo = cpu_to_le16(key->rxiv.lo);
465 	key_le->iv_initialized = cpu_to_le32(key->iv_initialized);
466 	memcpy(key_le->data, key->data, sizeof(key->data));
467 	memcpy(key_le->ea, key->ea, sizeof(key->ea));
468 }
469 
470 static int
471 send_key_to_dongle(struct brcmf_if *ifp, struct brcmf_wsec_key *key)
472 {
473 	struct brcmf_pub *drvr = ifp->drvr;
474 	int err;
475 	struct brcmf_wsec_key_le key_le;
476 
477 	convert_key_from_CPU(key, &key_le);
478 
479 	brcmf_netdev_wait_pend8021x(ifp);
480 
481 	err = brcmf_fil_bsscfg_data_set(ifp, "wsec_key", &key_le,
482 					sizeof(key_le));
483 
484 	if (err)
485 		bphy_err(drvr, "wsec_key error (%d)\n", err);
486 	return err;
487 }
488 
489 static void
490 brcmf_cfg80211_update_proto_addr_mode(struct wireless_dev *wdev)
491 {
492 	struct brcmf_cfg80211_vif *vif;
493 	struct brcmf_if *ifp;
494 
495 	vif = container_of(wdev, struct brcmf_cfg80211_vif, wdev);
496 	ifp = vif->ifp;
497 
498 	if ((wdev->iftype == NL80211_IFTYPE_ADHOC) ||
499 	    (wdev->iftype == NL80211_IFTYPE_AP) ||
500 	    (wdev->iftype == NL80211_IFTYPE_P2P_GO))
501 		brcmf_proto_configure_addr_mode(ifp->drvr, ifp->ifidx,
502 						ADDR_DIRECT);
503 	else
504 		brcmf_proto_configure_addr_mode(ifp->drvr, ifp->ifidx,
505 						ADDR_INDIRECT);
506 }
507 
508 static int brcmf_get_first_free_bsscfgidx(struct brcmf_pub *drvr)
509 {
510 	int bsscfgidx;
511 
512 	for (bsscfgidx = 0; bsscfgidx < BRCMF_MAX_IFS; bsscfgidx++) {
513 		/* bsscfgidx 1 is reserved for legacy P2P */
514 		if (bsscfgidx == 1)
515 			continue;
516 		if (!drvr->iflist[bsscfgidx])
517 			return bsscfgidx;
518 	}
519 
520 	return -ENOMEM;
521 }
522 
523 static int brcmf_cfg80211_request_ap_if(struct brcmf_if *ifp)
524 {
525 	struct brcmf_pub *drvr = ifp->drvr;
526 	struct brcmf_mbss_ssid_le mbss_ssid_le;
527 	int bsscfgidx;
528 	int err;
529 
530 	memset(&mbss_ssid_le, 0, sizeof(mbss_ssid_le));
531 	bsscfgidx = brcmf_get_first_free_bsscfgidx(ifp->drvr);
532 	if (bsscfgidx < 0)
533 		return bsscfgidx;
534 
535 	mbss_ssid_le.bsscfgidx = cpu_to_le32(bsscfgidx);
536 	mbss_ssid_le.SSID_len = cpu_to_le32(5);
537 	sprintf(mbss_ssid_le.SSID, "ssid%d" , bsscfgidx);
538 
539 	err = brcmf_fil_bsscfg_data_set(ifp, "bsscfg:ssid", &mbss_ssid_le,
540 					sizeof(mbss_ssid_le));
541 	if (err < 0)
542 		bphy_err(drvr, "setting ssid failed %d\n", err);
543 
544 	return err;
545 }
546 
547 /**
548  * brcmf_ap_add_vif() - create a new AP virtual interface for multiple BSS
549  *
550  * @wiphy: wiphy device of new interface.
551  * @name: name of the new interface.
552  * @params: contains mac address for AP device.
553  */
554 static
555 struct wireless_dev *brcmf_ap_add_vif(struct wiphy *wiphy, const char *name,
556 				      struct vif_params *params)
557 {
558 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
559 	struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
560 	struct brcmf_pub *drvr = cfg->pub;
561 	struct brcmf_cfg80211_vif *vif;
562 	int err;
563 
564 	if (brcmf_cfg80211_vif_event_armed(cfg))
565 		return ERR_PTR(-EBUSY);
566 
567 	brcmf_dbg(INFO, "Adding vif \"%s\"\n", name);
568 
569 	vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_AP);
570 	if (IS_ERR(vif))
571 		return (struct wireless_dev *)vif;
572 
573 	brcmf_cfg80211_arm_vif_event(cfg, vif);
574 
575 	err = brcmf_cfg80211_request_ap_if(ifp);
576 	if (err) {
577 		brcmf_cfg80211_arm_vif_event(cfg, NULL);
578 		goto fail;
579 	}
580 
581 	/* wait for firmware event */
582 	err = brcmf_cfg80211_wait_vif_event(cfg, BRCMF_E_IF_ADD,
583 					    BRCMF_VIF_EVENT_TIMEOUT);
584 	brcmf_cfg80211_arm_vif_event(cfg, NULL);
585 	if (!err) {
586 		bphy_err(drvr, "timeout occurred\n");
587 		err = -EIO;
588 		goto fail;
589 	}
590 
591 	/* interface created in firmware */
592 	ifp = vif->ifp;
593 	if (!ifp) {
594 		bphy_err(drvr, "no if pointer provided\n");
595 		err = -ENOENT;
596 		goto fail;
597 	}
598 
599 	strncpy(ifp->ndev->name, name, sizeof(ifp->ndev->name) - 1);
600 	err = brcmf_net_attach(ifp, true);
601 	if (err) {
602 		bphy_err(drvr, "Registering netdevice failed\n");
603 		free_netdev(ifp->ndev);
604 		goto fail;
605 	}
606 
607 	return &ifp->vif->wdev;
608 
609 fail:
610 	brcmf_free_vif(vif);
611 	return ERR_PTR(err);
612 }
613 
614 static bool brcmf_is_apmode(struct brcmf_cfg80211_vif *vif)
615 {
616 	enum nl80211_iftype iftype;
617 
618 	iftype = vif->wdev.iftype;
619 	return iftype == NL80211_IFTYPE_AP || iftype == NL80211_IFTYPE_P2P_GO;
620 }
621 
622 static bool brcmf_is_ibssmode(struct brcmf_cfg80211_vif *vif)
623 {
624 	return vif->wdev.iftype == NL80211_IFTYPE_ADHOC;
625 }
626 
627 /**
628  * brcmf_mon_add_vif() - create monitor mode virtual interface
629  *
630  * @wiphy: wiphy device of new interface.
631  * @name: name of the new interface.
632  */
633 static struct wireless_dev *brcmf_mon_add_vif(struct wiphy *wiphy,
634 					      const char *name)
635 {
636 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
637 	struct brcmf_cfg80211_vif *vif;
638 	struct net_device *ndev;
639 	struct brcmf_if *ifp;
640 	int err;
641 
642 	if (cfg->pub->mon_if) {
643 		err = -EEXIST;
644 		goto err_out;
645 	}
646 
647 	vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_MONITOR);
648 	if (IS_ERR(vif)) {
649 		err = PTR_ERR(vif);
650 		goto err_out;
651 	}
652 
653 	ndev = alloc_netdev(sizeof(*ifp), name, NET_NAME_UNKNOWN, ether_setup);
654 	if (!ndev) {
655 		err = -ENOMEM;
656 		goto err_free_vif;
657 	}
658 	ndev->type = ARPHRD_IEEE80211_RADIOTAP;
659 	ndev->ieee80211_ptr = &vif->wdev;
660 	ndev->needs_free_netdev = true;
661 	ndev->priv_destructor = brcmf_cfg80211_free_netdev;
662 	SET_NETDEV_DEV(ndev, wiphy_dev(cfg->wiphy));
663 
664 	ifp = netdev_priv(ndev);
665 	ifp->vif = vif;
666 	ifp->ndev = ndev;
667 	ifp->drvr = cfg->pub;
668 
669 	vif->ifp = ifp;
670 	vif->wdev.netdev = ndev;
671 
672 	err = brcmf_net_mon_attach(ifp);
673 	if (err) {
674 		brcmf_err("Failed to attach %s device\n", ndev->name);
675 		free_netdev(ndev);
676 		goto err_free_vif;
677 	}
678 
679 	cfg->pub->mon_if = ifp;
680 
681 	return &vif->wdev;
682 
683 err_free_vif:
684 	brcmf_free_vif(vif);
685 err_out:
686 	return ERR_PTR(err);
687 }
688 
689 static int brcmf_mon_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev)
690 {
691 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
692 	struct net_device *ndev = wdev->netdev;
693 
694 	ndev->netdev_ops->ndo_stop(ndev);
695 
696 	brcmf_net_detach(ndev, true);
697 
698 	cfg->pub->mon_if = NULL;
699 
700 	return 0;
701 }
702 
703 static struct wireless_dev *brcmf_cfg80211_add_iface(struct wiphy *wiphy,
704 						     const char *name,
705 						     unsigned char name_assign_type,
706 						     enum nl80211_iftype type,
707 						     struct vif_params *params)
708 {
709 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
710 	struct brcmf_pub *drvr = cfg->pub;
711 	struct wireless_dev *wdev;
712 	int err;
713 
714 	brcmf_dbg(TRACE, "enter: %s type %d\n", name, type);
715 	err = brcmf_vif_add_validate(wiphy_to_cfg(wiphy), type);
716 	if (err) {
717 		bphy_err(drvr, "iface validation failed: err=%d\n", err);
718 		return ERR_PTR(err);
719 	}
720 	switch (type) {
721 	case NL80211_IFTYPE_ADHOC:
722 	case NL80211_IFTYPE_STATION:
723 	case NL80211_IFTYPE_AP_VLAN:
724 	case NL80211_IFTYPE_WDS:
725 	case NL80211_IFTYPE_MESH_POINT:
726 		return ERR_PTR(-EOPNOTSUPP);
727 	case NL80211_IFTYPE_MONITOR:
728 		return brcmf_mon_add_vif(wiphy, name);
729 	case NL80211_IFTYPE_AP:
730 		wdev = brcmf_ap_add_vif(wiphy, name, params);
731 		break;
732 	case NL80211_IFTYPE_P2P_CLIENT:
733 	case NL80211_IFTYPE_P2P_GO:
734 	case NL80211_IFTYPE_P2P_DEVICE:
735 		wdev = brcmf_p2p_add_vif(wiphy, name, name_assign_type, type, params);
736 		break;
737 	case NL80211_IFTYPE_UNSPECIFIED:
738 	default:
739 		return ERR_PTR(-EINVAL);
740 	}
741 
742 	if (IS_ERR(wdev))
743 		bphy_err(drvr, "add iface %s type %d failed: err=%d\n", name,
744 			 type, (int)PTR_ERR(wdev));
745 	else
746 		brcmf_cfg80211_update_proto_addr_mode(wdev);
747 
748 	return wdev;
749 }
750 
751 static void brcmf_scan_config_mpc(struct brcmf_if *ifp, int mpc)
752 {
753 	if (brcmf_feat_is_quirk_enabled(ifp, BRCMF_FEAT_QUIRK_NEED_MPC))
754 		brcmf_set_mpc(ifp, mpc);
755 }
756 
757 void brcmf_set_mpc(struct brcmf_if *ifp, int mpc)
758 {
759 	struct brcmf_pub *drvr = ifp->drvr;
760 	s32 err = 0;
761 
762 	if (check_vif_up(ifp->vif)) {
763 		err = brcmf_fil_iovar_int_set(ifp, "mpc", mpc);
764 		if (err) {
765 			bphy_err(drvr, "fail to set mpc\n");
766 			return;
767 		}
768 		brcmf_dbg(INFO, "MPC : %d\n", mpc);
769 	}
770 }
771 
772 s32 brcmf_notify_escan_complete(struct brcmf_cfg80211_info *cfg,
773 				struct brcmf_if *ifp, bool aborted,
774 				bool fw_abort)
775 {
776 	struct brcmf_pub *drvr = cfg->pub;
777 	struct brcmf_scan_params_le params_le;
778 	struct cfg80211_scan_request *scan_request;
779 	u64 reqid;
780 	u32 bucket;
781 	s32 err = 0;
782 
783 	brcmf_dbg(SCAN, "Enter\n");
784 
785 	/* clear scan request, because the FW abort can cause a second call */
786 	/* to this functon and might cause a double cfg80211_scan_done      */
787 	scan_request = cfg->scan_request;
788 	cfg->scan_request = NULL;
789 
790 	if (timer_pending(&cfg->escan_timeout))
791 		del_timer_sync(&cfg->escan_timeout);
792 
793 	if (fw_abort) {
794 		/* Do a scan abort to stop the driver's scan engine */
795 		brcmf_dbg(SCAN, "ABORT scan in firmware\n");
796 		memset(&params_le, 0, sizeof(params_le));
797 		eth_broadcast_addr(params_le.bssid);
798 		params_le.bss_type = DOT11_BSSTYPE_ANY;
799 		params_le.scan_type = 0;
800 		params_le.channel_num = cpu_to_le32(1);
801 		params_le.nprobes = cpu_to_le32(1);
802 		params_le.active_time = cpu_to_le32(-1);
803 		params_le.passive_time = cpu_to_le32(-1);
804 		params_le.home_time = cpu_to_le32(-1);
805 		/* Scan is aborted by setting channel_list[0] to -1 */
806 		params_le.channel_list[0] = cpu_to_le16(-1);
807 		/* E-Scan (or anyother type) can be aborted by SCAN */
808 		err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SCAN,
809 					     &params_le, sizeof(params_le));
810 		if (err)
811 			bphy_err(drvr, "Scan abort failed\n");
812 	}
813 
814 	brcmf_scan_config_mpc(ifp, 1);
815 
816 	/*
817 	 * e-scan can be initiated internally
818 	 * which takes precedence.
819 	 */
820 	if (cfg->int_escan_map) {
821 		brcmf_dbg(SCAN, "scheduled scan completed (%x)\n",
822 			  cfg->int_escan_map);
823 		while (cfg->int_escan_map) {
824 			bucket = __ffs(cfg->int_escan_map);
825 			cfg->int_escan_map &= ~BIT(bucket);
826 			reqid = brcmf_pno_find_reqid_by_bucket(cfg->pno,
827 							       bucket);
828 			if (!aborted) {
829 				brcmf_dbg(SCAN, "report results: reqid=%llu\n",
830 					  reqid);
831 				cfg80211_sched_scan_results(cfg_to_wiphy(cfg),
832 							    reqid);
833 			}
834 		}
835 	} else if (scan_request) {
836 		struct cfg80211_scan_info info = {
837 			.aborted = aborted,
838 		};
839 
840 		brcmf_dbg(SCAN, "ESCAN Completed scan: %s\n",
841 			  aborted ? "Aborted" : "Done");
842 		cfg80211_scan_done(scan_request, &info);
843 	}
844 	if (!test_and_clear_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status))
845 		brcmf_dbg(SCAN, "Scan complete, probably P2P scan\n");
846 
847 	return err;
848 }
849 
850 static int brcmf_cfg80211_del_ap_iface(struct wiphy *wiphy,
851 				       struct wireless_dev *wdev)
852 {
853 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
854 	struct net_device *ndev = wdev->netdev;
855 	struct brcmf_if *ifp = netdev_priv(ndev);
856 	struct brcmf_pub *drvr = cfg->pub;
857 	int ret;
858 	int err;
859 
860 	brcmf_cfg80211_arm_vif_event(cfg, ifp->vif);
861 
862 	err = brcmf_fil_bsscfg_data_set(ifp, "interface_remove", NULL, 0);
863 	if (err) {
864 		bphy_err(drvr, "interface_remove failed %d\n", err);
865 		goto err_unarm;
866 	}
867 
868 	/* wait for firmware event */
869 	ret = brcmf_cfg80211_wait_vif_event(cfg, BRCMF_E_IF_DEL,
870 					    BRCMF_VIF_EVENT_TIMEOUT);
871 	if (!ret) {
872 		bphy_err(drvr, "timeout occurred\n");
873 		err = -EIO;
874 		goto err_unarm;
875 	}
876 
877 	brcmf_remove_interface(ifp, true);
878 
879 err_unarm:
880 	brcmf_cfg80211_arm_vif_event(cfg, NULL);
881 	return err;
882 }
883 
884 static
885 int brcmf_cfg80211_del_iface(struct wiphy *wiphy, struct wireless_dev *wdev)
886 {
887 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
888 	struct net_device *ndev = wdev->netdev;
889 
890 	if (ndev && ndev == cfg_to_ndev(cfg))
891 		return -ENOTSUPP;
892 
893 	/* vif event pending in firmware */
894 	if (brcmf_cfg80211_vif_event_armed(cfg))
895 		return -EBUSY;
896 
897 	if (ndev) {
898 		if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status) &&
899 		    cfg->escan_info.ifp == netdev_priv(ndev))
900 			brcmf_notify_escan_complete(cfg, netdev_priv(ndev),
901 						    true, true);
902 
903 		brcmf_fil_iovar_int_set(netdev_priv(ndev), "mpc", 1);
904 	}
905 
906 	switch (wdev->iftype) {
907 	case NL80211_IFTYPE_ADHOC:
908 	case NL80211_IFTYPE_STATION:
909 	case NL80211_IFTYPE_AP_VLAN:
910 	case NL80211_IFTYPE_WDS:
911 	case NL80211_IFTYPE_MESH_POINT:
912 		return -EOPNOTSUPP;
913 	case NL80211_IFTYPE_MONITOR:
914 		return brcmf_mon_del_vif(wiphy, wdev);
915 	case NL80211_IFTYPE_AP:
916 		return brcmf_cfg80211_del_ap_iface(wiphy, wdev);
917 	case NL80211_IFTYPE_P2P_CLIENT:
918 	case NL80211_IFTYPE_P2P_GO:
919 	case NL80211_IFTYPE_P2P_DEVICE:
920 		return brcmf_p2p_del_vif(wiphy, wdev);
921 	case NL80211_IFTYPE_UNSPECIFIED:
922 	default:
923 		return -EINVAL;
924 	}
925 	return -EOPNOTSUPP;
926 }
927 
928 static s32
929 brcmf_cfg80211_change_iface(struct wiphy *wiphy, struct net_device *ndev,
930 			 enum nl80211_iftype type,
931 			 struct vif_params *params)
932 {
933 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
934 	struct brcmf_if *ifp = netdev_priv(ndev);
935 	struct brcmf_cfg80211_vif *vif = ifp->vif;
936 	struct brcmf_pub *drvr = cfg->pub;
937 	s32 infra = 0;
938 	s32 ap = 0;
939 	s32 err = 0;
940 
941 	brcmf_dbg(TRACE, "Enter, bsscfgidx=%d, type=%d\n", ifp->bsscfgidx,
942 		  type);
943 
944 	/* WAR: There are a number of p2p interface related problems which
945 	 * need to be handled initially (before doing the validate).
946 	 * wpa_supplicant tends to do iface changes on p2p device/client/go
947 	 * which are not always possible/allowed. However we need to return
948 	 * OK otherwise the wpa_supplicant wont start. The situation differs
949 	 * on configuration and setup (p2pon=1 module param). The first check
950 	 * is to see if the request is a change to station for p2p iface.
951 	 */
952 	if ((type == NL80211_IFTYPE_STATION) &&
953 	    ((vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT) ||
954 	     (vif->wdev.iftype == NL80211_IFTYPE_P2P_GO) ||
955 	     (vif->wdev.iftype == NL80211_IFTYPE_P2P_DEVICE))) {
956 		brcmf_dbg(TRACE, "Ignoring cmd for p2p if\n");
957 		/* Now depending on whether module param p2pon=1 was used the
958 		 * response needs to be either 0 or EOPNOTSUPP. The reason is
959 		 * that if p2pon=1 is used, but a newer supplicant is used then
960 		 * we should return an error, as this combination wont work.
961 		 * In other situations 0 is returned and supplicant will start
962 		 * normally. It will give a trace in cfg80211, but it is the
963 		 * only way to get it working. Unfortunately this will result
964 		 * in situation where we wont support new supplicant in
965 		 * combination with module param p2pon=1, but that is the way
966 		 * it is. If the user tries this then unloading of driver might
967 		 * fail/lock.
968 		 */
969 		if (cfg->p2p.p2pdev_dynamically)
970 			return -EOPNOTSUPP;
971 		else
972 			return 0;
973 	}
974 	err = brcmf_vif_change_validate(wiphy_to_cfg(wiphy), vif, type);
975 	if (err) {
976 		bphy_err(drvr, "iface validation failed: err=%d\n", err);
977 		return err;
978 	}
979 	switch (type) {
980 	case NL80211_IFTYPE_MONITOR:
981 	case NL80211_IFTYPE_WDS:
982 		bphy_err(drvr, "type (%d) : currently we do not support this type\n",
983 			 type);
984 		return -EOPNOTSUPP;
985 	case NL80211_IFTYPE_ADHOC:
986 		infra = 0;
987 		break;
988 	case NL80211_IFTYPE_STATION:
989 		infra = 1;
990 		break;
991 	case NL80211_IFTYPE_AP:
992 	case NL80211_IFTYPE_P2P_GO:
993 		ap = 1;
994 		break;
995 	default:
996 		err = -EINVAL;
997 		goto done;
998 	}
999 
1000 	if (ap) {
1001 		if (type == NL80211_IFTYPE_P2P_GO) {
1002 			brcmf_dbg(INFO, "IF Type = P2P GO\n");
1003 			err = brcmf_p2p_ifchange(cfg, BRCMF_FIL_P2P_IF_GO);
1004 		}
1005 		if (!err) {
1006 			brcmf_dbg(INFO, "IF Type = AP\n");
1007 		}
1008 	} else {
1009 		err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_INFRA, infra);
1010 		if (err) {
1011 			bphy_err(drvr, "WLC_SET_INFRA error (%d)\n", err);
1012 			err = -EAGAIN;
1013 			goto done;
1014 		}
1015 		brcmf_dbg(INFO, "IF Type = %s\n", brcmf_is_ibssmode(vif) ?
1016 			  "Adhoc" : "Infra");
1017 	}
1018 	ndev->ieee80211_ptr->iftype = type;
1019 
1020 	brcmf_cfg80211_update_proto_addr_mode(&vif->wdev);
1021 
1022 done:
1023 	brcmf_dbg(TRACE, "Exit\n");
1024 
1025 	return err;
1026 }
1027 
1028 static void brcmf_escan_prep(struct brcmf_cfg80211_info *cfg,
1029 			     struct brcmf_scan_params_le *params_le,
1030 			     struct cfg80211_scan_request *request)
1031 {
1032 	u32 n_ssids;
1033 	u32 n_channels;
1034 	s32 i;
1035 	s32 offset;
1036 	u16 chanspec;
1037 	char *ptr;
1038 	struct brcmf_ssid_le ssid_le;
1039 
1040 	eth_broadcast_addr(params_le->bssid);
1041 	params_le->bss_type = DOT11_BSSTYPE_ANY;
1042 	params_le->scan_type = BRCMF_SCANTYPE_ACTIVE;
1043 	params_le->channel_num = 0;
1044 	params_le->nprobes = cpu_to_le32(-1);
1045 	params_le->active_time = cpu_to_le32(-1);
1046 	params_le->passive_time = cpu_to_le32(-1);
1047 	params_le->home_time = cpu_to_le32(-1);
1048 	memset(&params_le->ssid_le, 0, sizeof(params_le->ssid_le));
1049 
1050 	n_ssids = request->n_ssids;
1051 	n_channels = request->n_channels;
1052 
1053 	/* Copy channel array if applicable */
1054 	brcmf_dbg(SCAN, "### List of channelspecs to scan ### %d\n",
1055 		  n_channels);
1056 	if (n_channels > 0) {
1057 		for (i = 0; i < n_channels; i++) {
1058 			chanspec = channel_to_chanspec(&cfg->d11inf,
1059 						       request->channels[i]);
1060 			brcmf_dbg(SCAN, "Chan : %d, Channel spec: %x\n",
1061 				  request->channels[i]->hw_value, chanspec);
1062 			params_le->channel_list[i] = cpu_to_le16(chanspec);
1063 		}
1064 	} else {
1065 		brcmf_dbg(SCAN, "Scanning all channels\n");
1066 	}
1067 	/* Copy ssid array if applicable */
1068 	brcmf_dbg(SCAN, "### List of SSIDs to scan ### %d\n", n_ssids);
1069 	if (n_ssids > 0) {
1070 		offset = offsetof(struct brcmf_scan_params_le, channel_list) +
1071 				n_channels * sizeof(u16);
1072 		offset = roundup(offset, sizeof(u32));
1073 		ptr = (char *)params_le + offset;
1074 		for (i = 0; i < n_ssids; i++) {
1075 			memset(&ssid_le, 0, sizeof(ssid_le));
1076 			ssid_le.SSID_len =
1077 					cpu_to_le32(request->ssids[i].ssid_len);
1078 			memcpy(ssid_le.SSID, request->ssids[i].ssid,
1079 			       request->ssids[i].ssid_len);
1080 			if (!ssid_le.SSID_len)
1081 				brcmf_dbg(SCAN, "%d: Broadcast scan\n", i);
1082 			else
1083 				brcmf_dbg(SCAN, "%d: scan for  %.32s size=%d\n",
1084 					  i, ssid_le.SSID, ssid_le.SSID_len);
1085 			memcpy(ptr, &ssid_le, sizeof(ssid_le));
1086 			ptr += sizeof(ssid_le);
1087 		}
1088 	} else {
1089 		brcmf_dbg(SCAN, "Performing passive scan\n");
1090 		params_le->scan_type = BRCMF_SCANTYPE_PASSIVE;
1091 	}
1092 	/* Adding mask to channel numbers */
1093 	params_le->channel_num =
1094 		cpu_to_le32((n_ssids << BRCMF_SCAN_PARAMS_NSSID_SHIFT) |
1095 			(n_channels & BRCMF_SCAN_PARAMS_COUNT_MASK));
1096 }
1097 
1098 static s32
1099 brcmf_run_escan(struct brcmf_cfg80211_info *cfg, struct brcmf_if *ifp,
1100 		struct cfg80211_scan_request *request)
1101 {
1102 	struct brcmf_pub *drvr = cfg->pub;
1103 	s32 params_size = BRCMF_SCAN_PARAMS_FIXED_SIZE +
1104 			  offsetof(struct brcmf_escan_params_le, params_le);
1105 	struct brcmf_escan_params_le *params;
1106 	s32 err = 0;
1107 
1108 	brcmf_dbg(SCAN, "E-SCAN START\n");
1109 
1110 	if (request != NULL) {
1111 		/* Allocate space for populating ssids in struct */
1112 		params_size += sizeof(u32) * ((request->n_channels + 1) / 2);
1113 
1114 		/* Allocate space for populating ssids in struct */
1115 		params_size += sizeof(struct brcmf_ssid_le) * request->n_ssids;
1116 	}
1117 
1118 	params = kzalloc(params_size, GFP_KERNEL);
1119 	if (!params) {
1120 		err = -ENOMEM;
1121 		goto exit;
1122 	}
1123 	BUG_ON(params_size + sizeof("escan") >= BRCMF_DCMD_MEDLEN);
1124 	brcmf_escan_prep(cfg, &params->params_le, request);
1125 	params->version = cpu_to_le32(BRCMF_ESCAN_REQ_VERSION);
1126 	params->action = cpu_to_le16(WL_ESCAN_ACTION_START);
1127 	params->sync_id = cpu_to_le16(0x1234);
1128 
1129 	err = brcmf_fil_iovar_data_set(ifp, "escan", params, params_size);
1130 	if (err) {
1131 		if (err == -EBUSY)
1132 			brcmf_dbg(INFO, "system busy : escan canceled\n");
1133 		else
1134 			bphy_err(drvr, "error (%d)\n", err);
1135 	}
1136 
1137 	kfree(params);
1138 exit:
1139 	return err;
1140 }
1141 
1142 static s32
1143 brcmf_do_escan(struct brcmf_if *ifp, struct cfg80211_scan_request *request)
1144 {
1145 	struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
1146 	s32 err;
1147 	struct brcmf_scan_results *results;
1148 	struct escan_info *escan = &cfg->escan_info;
1149 
1150 	brcmf_dbg(SCAN, "Enter\n");
1151 	escan->ifp = ifp;
1152 	escan->wiphy = cfg->wiphy;
1153 	escan->escan_state = WL_ESCAN_STATE_SCANNING;
1154 
1155 	brcmf_scan_config_mpc(ifp, 0);
1156 	results = (struct brcmf_scan_results *)cfg->escan_info.escan_buf;
1157 	results->version = 0;
1158 	results->count = 0;
1159 	results->buflen = WL_ESCAN_RESULTS_FIXED_SIZE;
1160 
1161 	err = escan->run(cfg, ifp, request);
1162 	if (err)
1163 		brcmf_scan_config_mpc(ifp, 1);
1164 	return err;
1165 }
1166 
1167 static s32
1168 brcmf_cfg80211_scan(struct wiphy *wiphy, struct cfg80211_scan_request *request)
1169 {
1170 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
1171 	struct brcmf_pub *drvr = cfg->pub;
1172 	struct brcmf_cfg80211_vif *vif;
1173 	s32 err = 0;
1174 
1175 	brcmf_dbg(TRACE, "Enter\n");
1176 	vif = container_of(request->wdev, struct brcmf_cfg80211_vif, wdev);
1177 	if (!check_vif_up(vif))
1178 		return -EIO;
1179 
1180 	if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) {
1181 		bphy_err(drvr, "Scanning already: status (%lu)\n",
1182 			 cfg->scan_status);
1183 		return -EAGAIN;
1184 	}
1185 	if (test_bit(BRCMF_SCAN_STATUS_ABORT, &cfg->scan_status)) {
1186 		bphy_err(drvr, "Scanning being aborted: status (%lu)\n",
1187 			 cfg->scan_status);
1188 		return -EAGAIN;
1189 	}
1190 	if (test_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status)) {
1191 		bphy_err(drvr, "Scanning suppressed: status (%lu)\n",
1192 			 cfg->scan_status);
1193 		return -EAGAIN;
1194 	}
1195 	if (test_bit(BRCMF_VIF_STATUS_CONNECTING, &vif->sme_state)) {
1196 		bphy_err(drvr, "Connecting: status (%lu)\n", vif->sme_state);
1197 		return -EAGAIN;
1198 	}
1199 
1200 	/* If scan req comes for p2p0, send it over primary I/F */
1201 	if (vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif)
1202 		vif = cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif;
1203 
1204 	brcmf_dbg(SCAN, "START ESCAN\n");
1205 
1206 	cfg->scan_request = request;
1207 	set_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status);
1208 
1209 	cfg->escan_info.run = brcmf_run_escan;
1210 	err = brcmf_p2p_scan_prep(wiphy, request, vif);
1211 	if (err)
1212 		goto scan_out;
1213 
1214 	err = brcmf_vif_set_mgmt_ie(vif, BRCMF_VNDR_IE_PRBREQ_FLAG,
1215 				    request->ie, request->ie_len);
1216 	if (err)
1217 		goto scan_out;
1218 
1219 	err = brcmf_do_escan(vif->ifp, request);
1220 	if (err)
1221 		goto scan_out;
1222 
1223 	/* Arm scan timeout timer */
1224 	mod_timer(&cfg->escan_timeout,
1225 		  jiffies + msecs_to_jiffies(BRCMF_ESCAN_TIMER_INTERVAL_MS));
1226 
1227 	return 0;
1228 
1229 scan_out:
1230 	bphy_err(drvr, "scan error (%d)\n", err);
1231 	clear_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status);
1232 	cfg->scan_request = NULL;
1233 	return err;
1234 }
1235 
1236 static s32 brcmf_set_rts(struct net_device *ndev, u32 rts_threshold)
1237 {
1238 	struct brcmf_if *ifp = netdev_priv(ndev);
1239 	struct brcmf_pub *drvr = ifp->drvr;
1240 	s32 err = 0;
1241 
1242 	err = brcmf_fil_iovar_int_set(ifp, "rtsthresh", rts_threshold);
1243 	if (err)
1244 		bphy_err(drvr, "Error (%d)\n", err);
1245 
1246 	return err;
1247 }
1248 
1249 static s32 brcmf_set_frag(struct net_device *ndev, u32 frag_threshold)
1250 {
1251 	struct brcmf_if *ifp = netdev_priv(ndev);
1252 	struct brcmf_pub *drvr = ifp->drvr;
1253 	s32 err = 0;
1254 
1255 	err = brcmf_fil_iovar_int_set(ifp, "fragthresh",
1256 				      frag_threshold);
1257 	if (err)
1258 		bphy_err(drvr, "Error (%d)\n", err);
1259 
1260 	return err;
1261 }
1262 
1263 static s32 brcmf_set_retry(struct net_device *ndev, u32 retry, bool l)
1264 {
1265 	struct brcmf_if *ifp = netdev_priv(ndev);
1266 	struct brcmf_pub *drvr = ifp->drvr;
1267 	s32 err = 0;
1268 	u32 cmd = (l ? BRCMF_C_SET_LRL : BRCMF_C_SET_SRL);
1269 
1270 	err = brcmf_fil_cmd_int_set(ifp, cmd, retry);
1271 	if (err) {
1272 		bphy_err(drvr, "cmd (%d) , error (%d)\n", cmd, err);
1273 		return err;
1274 	}
1275 	return err;
1276 }
1277 
1278 static s32 brcmf_cfg80211_set_wiphy_params(struct wiphy *wiphy, u32 changed)
1279 {
1280 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
1281 	struct net_device *ndev = cfg_to_ndev(cfg);
1282 	struct brcmf_if *ifp = netdev_priv(ndev);
1283 	s32 err = 0;
1284 
1285 	brcmf_dbg(TRACE, "Enter\n");
1286 	if (!check_vif_up(ifp->vif))
1287 		return -EIO;
1288 
1289 	if (changed & WIPHY_PARAM_RTS_THRESHOLD &&
1290 	    (cfg->conf->rts_threshold != wiphy->rts_threshold)) {
1291 		cfg->conf->rts_threshold = wiphy->rts_threshold;
1292 		err = brcmf_set_rts(ndev, cfg->conf->rts_threshold);
1293 		if (!err)
1294 			goto done;
1295 	}
1296 	if (changed & WIPHY_PARAM_FRAG_THRESHOLD &&
1297 	    (cfg->conf->frag_threshold != wiphy->frag_threshold)) {
1298 		cfg->conf->frag_threshold = wiphy->frag_threshold;
1299 		err = brcmf_set_frag(ndev, cfg->conf->frag_threshold);
1300 		if (!err)
1301 			goto done;
1302 	}
1303 	if (changed & WIPHY_PARAM_RETRY_LONG
1304 	    && (cfg->conf->retry_long != wiphy->retry_long)) {
1305 		cfg->conf->retry_long = wiphy->retry_long;
1306 		err = brcmf_set_retry(ndev, cfg->conf->retry_long, true);
1307 		if (!err)
1308 			goto done;
1309 	}
1310 	if (changed & WIPHY_PARAM_RETRY_SHORT
1311 	    && (cfg->conf->retry_short != wiphy->retry_short)) {
1312 		cfg->conf->retry_short = wiphy->retry_short;
1313 		err = brcmf_set_retry(ndev, cfg->conf->retry_short, false);
1314 		if (!err)
1315 			goto done;
1316 	}
1317 
1318 done:
1319 	brcmf_dbg(TRACE, "Exit\n");
1320 	return err;
1321 }
1322 
1323 static void brcmf_init_prof(struct brcmf_cfg80211_profile *prof)
1324 {
1325 	memset(prof, 0, sizeof(*prof));
1326 }
1327 
1328 static u16 brcmf_map_fw_linkdown_reason(const struct brcmf_event_msg *e)
1329 {
1330 	u16 reason;
1331 
1332 	switch (e->event_code) {
1333 	case BRCMF_E_DEAUTH:
1334 	case BRCMF_E_DEAUTH_IND:
1335 	case BRCMF_E_DISASSOC_IND:
1336 		reason = e->reason;
1337 		break;
1338 	case BRCMF_E_LINK:
1339 	default:
1340 		reason = 0;
1341 		break;
1342 	}
1343 	return reason;
1344 }
1345 
1346 static int brcmf_set_pmk(struct brcmf_if *ifp, const u8 *pmk_data, u16 pmk_len)
1347 {
1348 	struct brcmf_pub *drvr = ifp->drvr;
1349 	struct brcmf_wsec_pmk_le pmk;
1350 	int i, err;
1351 
1352 	/* convert to firmware key format */
1353 	pmk.key_len = cpu_to_le16(pmk_len << 1);
1354 	pmk.flags = cpu_to_le16(BRCMF_WSEC_PASSPHRASE);
1355 	for (i = 0; i < pmk_len; i++)
1356 		snprintf(&pmk.key[2 * i], 3, "%02x", pmk_data[i]);
1357 
1358 	/* store psk in firmware */
1359 	err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_WSEC_PMK,
1360 				     &pmk, sizeof(pmk));
1361 	if (err < 0)
1362 		bphy_err(drvr, "failed to change PSK in firmware (len=%u)\n",
1363 			 pmk_len);
1364 
1365 	return err;
1366 }
1367 
1368 static int brcmf_set_sae_password(struct brcmf_if *ifp, const u8 *pwd_data,
1369 				  u16 pwd_len)
1370 {
1371 	struct brcmf_pub *drvr = ifp->drvr;
1372 	struct brcmf_wsec_sae_pwd_le sae_pwd;
1373 	int err;
1374 
1375 	if (pwd_len > BRCMF_WSEC_MAX_SAE_PASSWORD_LEN) {
1376 		bphy_err(drvr, "sae_password must be less than %d\n",
1377 			 BRCMF_WSEC_MAX_SAE_PASSWORD_LEN);
1378 		return -EINVAL;
1379 	}
1380 
1381 	sae_pwd.key_len = cpu_to_le16(pwd_len);
1382 	memcpy(sae_pwd.key, pwd_data, pwd_len);
1383 
1384 	err = brcmf_fil_iovar_data_set(ifp, "sae_password", &sae_pwd,
1385 				       sizeof(sae_pwd));
1386 	if (err < 0)
1387 		bphy_err(drvr, "failed to set SAE password in firmware (len=%u)\n",
1388 			 pwd_len);
1389 
1390 	return err;
1391 }
1392 
1393 static void brcmf_link_down(struct brcmf_cfg80211_vif *vif, u16 reason,
1394 			    bool locally_generated)
1395 {
1396 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(vif->wdev.wiphy);
1397 	struct brcmf_pub *drvr = cfg->pub;
1398 	bool bus_up = drvr->bus_if->state == BRCMF_BUS_UP;
1399 	s32 err = 0;
1400 
1401 	brcmf_dbg(TRACE, "Enter\n");
1402 
1403 	if (test_and_clear_bit(BRCMF_VIF_STATUS_CONNECTED, &vif->sme_state)) {
1404 		if (bus_up) {
1405 			brcmf_dbg(INFO, "Call WLC_DISASSOC to stop excess roaming\n");
1406 			err = brcmf_fil_cmd_data_set(vif->ifp,
1407 						     BRCMF_C_DISASSOC, NULL, 0);
1408 			if (err)
1409 				bphy_err(drvr, "WLC_DISASSOC failed (%d)\n",
1410 					 err);
1411 		}
1412 
1413 		if ((vif->wdev.iftype == NL80211_IFTYPE_STATION) ||
1414 		    (vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT))
1415 			cfg80211_disconnected(vif->wdev.netdev, reason, NULL, 0,
1416 					      locally_generated, GFP_KERNEL);
1417 	}
1418 	clear_bit(BRCMF_VIF_STATUS_CONNECTING, &vif->sme_state);
1419 	clear_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status);
1420 	brcmf_btcoex_set_mode(vif, BRCMF_BTCOEX_ENABLED, 0);
1421 	if (vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_NONE) {
1422 		if (bus_up)
1423 			brcmf_set_pmk(vif->ifp, NULL, 0);
1424 		vif->profile.use_fwsup = BRCMF_PROFILE_FWSUP_NONE;
1425 	}
1426 	brcmf_dbg(TRACE, "Exit\n");
1427 }
1428 
1429 static s32
1430 brcmf_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *ndev,
1431 		      struct cfg80211_ibss_params *params)
1432 {
1433 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
1434 	struct brcmf_if *ifp = netdev_priv(ndev);
1435 	struct brcmf_cfg80211_profile *profile = &ifp->vif->profile;
1436 	struct brcmf_pub *drvr = cfg->pub;
1437 	struct brcmf_join_params join_params;
1438 	size_t join_params_size = 0;
1439 	s32 err = 0;
1440 	s32 wsec = 0;
1441 	s32 bcnprd;
1442 	u16 chanspec;
1443 	u32 ssid_len;
1444 
1445 	brcmf_dbg(TRACE, "Enter\n");
1446 	if (!check_vif_up(ifp->vif))
1447 		return -EIO;
1448 
1449 	if (params->ssid)
1450 		brcmf_dbg(CONN, "SSID: %s\n", params->ssid);
1451 	else {
1452 		brcmf_dbg(CONN, "SSID: NULL, Not supported\n");
1453 		return -EOPNOTSUPP;
1454 	}
1455 
1456 	set_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state);
1457 
1458 	if (params->bssid)
1459 		brcmf_dbg(CONN, "BSSID: %pM\n", params->bssid);
1460 	else
1461 		brcmf_dbg(CONN, "No BSSID specified\n");
1462 
1463 	if (params->chandef.chan)
1464 		brcmf_dbg(CONN, "channel: %d\n",
1465 			  params->chandef.chan->center_freq);
1466 	else
1467 		brcmf_dbg(CONN, "no channel specified\n");
1468 
1469 	if (params->channel_fixed)
1470 		brcmf_dbg(CONN, "fixed channel required\n");
1471 	else
1472 		brcmf_dbg(CONN, "no fixed channel required\n");
1473 
1474 	if (params->ie && params->ie_len)
1475 		brcmf_dbg(CONN, "ie len: %d\n", params->ie_len);
1476 	else
1477 		brcmf_dbg(CONN, "no ie specified\n");
1478 
1479 	if (params->beacon_interval)
1480 		brcmf_dbg(CONN, "beacon interval: %d\n",
1481 			  params->beacon_interval);
1482 	else
1483 		brcmf_dbg(CONN, "no beacon interval specified\n");
1484 
1485 	if (params->basic_rates)
1486 		brcmf_dbg(CONN, "basic rates: %08X\n", params->basic_rates);
1487 	else
1488 		brcmf_dbg(CONN, "no basic rates specified\n");
1489 
1490 	if (params->privacy)
1491 		brcmf_dbg(CONN, "privacy required\n");
1492 	else
1493 		brcmf_dbg(CONN, "no privacy required\n");
1494 
1495 	/* Configure Privacy for starter */
1496 	if (params->privacy)
1497 		wsec |= WEP_ENABLED;
1498 
1499 	err = brcmf_fil_iovar_int_set(ifp, "wsec", wsec);
1500 	if (err) {
1501 		bphy_err(drvr, "wsec failed (%d)\n", err);
1502 		goto done;
1503 	}
1504 
1505 	/* Configure Beacon Interval for starter */
1506 	if (params->beacon_interval)
1507 		bcnprd = params->beacon_interval;
1508 	else
1509 		bcnprd = 100;
1510 
1511 	err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_BCNPRD, bcnprd);
1512 	if (err) {
1513 		bphy_err(drvr, "WLC_SET_BCNPRD failed (%d)\n", err);
1514 		goto done;
1515 	}
1516 
1517 	/* Configure required join parameter */
1518 	memset(&join_params, 0, sizeof(struct brcmf_join_params));
1519 
1520 	/* SSID */
1521 	ssid_len = min_t(u32, params->ssid_len, IEEE80211_MAX_SSID_LEN);
1522 	memcpy(join_params.ssid_le.SSID, params->ssid, ssid_len);
1523 	join_params.ssid_le.SSID_len = cpu_to_le32(ssid_len);
1524 	join_params_size = sizeof(join_params.ssid_le);
1525 
1526 	/* BSSID */
1527 	if (params->bssid) {
1528 		memcpy(join_params.params_le.bssid, params->bssid, ETH_ALEN);
1529 		join_params_size += BRCMF_ASSOC_PARAMS_FIXED_SIZE;
1530 		memcpy(profile->bssid, params->bssid, ETH_ALEN);
1531 	} else {
1532 		eth_broadcast_addr(join_params.params_le.bssid);
1533 		eth_zero_addr(profile->bssid);
1534 	}
1535 
1536 	/* Channel */
1537 	if (params->chandef.chan) {
1538 		u32 target_channel;
1539 
1540 		cfg->channel =
1541 			ieee80211_frequency_to_channel(
1542 				params->chandef.chan->center_freq);
1543 		if (params->channel_fixed) {
1544 			/* adding chanspec */
1545 			chanspec = chandef_to_chanspec(&cfg->d11inf,
1546 						       &params->chandef);
1547 			join_params.params_le.chanspec_list[0] =
1548 				cpu_to_le16(chanspec);
1549 			join_params.params_le.chanspec_num = cpu_to_le32(1);
1550 			join_params_size += sizeof(join_params.params_le);
1551 		}
1552 
1553 		/* set channel for starter */
1554 		target_channel = cfg->channel;
1555 		err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_CHANNEL,
1556 					    target_channel);
1557 		if (err) {
1558 			bphy_err(drvr, "WLC_SET_CHANNEL failed (%d)\n", err);
1559 			goto done;
1560 		}
1561 	} else
1562 		cfg->channel = 0;
1563 
1564 	cfg->ibss_starter = false;
1565 
1566 
1567 	err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_SSID,
1568 				     &join_params, join_params_size);
1569 	if (err) {
1570 		bphy_err(drvr, "WLC_SET_SSID failed (%d)\n", err);
1571 		goto done;
1572 	}
1573 
1574 done:
1575 	if (err)
1576 		clear_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state);
1577 	brcmf_dbg(TRACE, "Exit\n");
1578 	return err;
1579 }
1580 
1581 static s32
1582 brcmf_cfg80211_leave_ibss(struct wiphy *wiphy, struct net_device *ndev)
1583 {
1584 	struct brcmf_if *ifp = netdev_priv(ndev);
1585 
1586 	brcmf_dbg(TRACE, "Enter\n");
1587 	if (!check_vif_up(ifp->vif)) {
1588 		/* When driver is being unloaded, it can end up here. If an
1589 		 * error is returned then later on a debug trace in the wireless
1590 		 * core module will be printed. To avoid this 0 is returned.
1591 		 */
1592 		return 0;
1593 	}
1594 
1595 	brcmf_link_down(ifp->vif, WLAN_REASON_DEAUTH_LEAVING, true);
1596 	brcmf_net_setcarrier(ifp, false);
1597 
1598 	brcmf_dbg(TRACE, "Exit\n");
1599 
1600 	return 0;
1601 }
1602 
1603 static s32 brcmf_set_wpa_version(struct net_device *ndev,
1604 				 struct cfg80211_connect_params *sme)
1605 {
1606 	struct brcmf_if *ifp = netdev_priv(ndev);
1607 	struct brcmf_cfg80211_profile *profile = ndev_to_prof(ndev);
1608 	struct brcmf_pub *drvr = ifp->drvr;
1609 	struct brcmf_cfg80211_security *sec;
1610 	s32 val = 0;
1611 	s32 err = 0;
1612 
1613 	if (sme->crypto.wpa_versions & NL80211_WPA_VERSION_1)
1614 		val = WPA_AUTH_PSK | WPA_AUTH_UNSPECIFIED;
1615 	else if (sme->crypto.wpa_versions & NL80211_WPA_VERSION_2)
1616 		val = WPA2_AUTH_PSK | WPA2_AUTH_UNSPECIFIED;
1617 	else if (sme->crypto.wpa_versions & NL80211_WPA_VERSION_3)
1618 		val = WPA3_AUTH_SAE_PSK;
1619 	else
1620 		val = WPA_AUTH_DISABLED;
1621 	brcmf_dbg(CONN, "setting wpa_auth to 0x%0x\n", val);
1622 	err = brcmf_fil_bsscfg_int_set(ifp, "wpa_auth", val);
1623 	if (err) {
1624 		bphy_err(drvr, "set wpa_auth failed (%d)\n", err);
1625 		return err;
1626 	}
1627 	sec = &profile->sec;
1628 	sec->wpa_versions = sme->crypto.wpa_versions;
1629 	return err;
1630 }
1631 
1632 static s32 brcmf_set_auth_type(struct net_device *ndev,
1633 			       struct cfg80211_connect_params *sme)
1634 {
1635 	struct brcmf_if *ifp = netdev_priv(ndev);
1636 	struct brcmf_cfg80211_profile *profile = ndev_to_prof(ndev);
1637 	struct brcmf_pub *drvr = ifp->drvr;
1638 	struct brcmf_cfg80211_security *sec;
1639 	s32 val = 0;
1640 	s32 err = 0;
1641 
1642 	switch (sme->auth_type) {
1643 	case NL80211_AUTHTYPE_OPEN_SYSTEM:
1644 		val = 0;
1645 		brcmf_dbg(CONN, "open system\n");
1646 		break;
1647 	case NL80211_AUTHTYPE_SHARED_KEY:
1648 		val = 1;
1649 		brcmf_dbg(CONN, "shared key\n");
1650 		break;
1651 	case NL80211_AUTHTYPE_SAE:
1652 		val = 3;
1653 		brcmf_dbg(CONN, "SAE authentication\n");
1654 		break;
1655 	default:
1656 		val = 2;
1657 		brcmf_dbg(CONN, "automatic, auth type (%d)\n", sme->auth_type);
1658 		break;
1659 	}
1660 
1661 	err = brcmf_fil_bsscfg_int_set(ifp, "auth", val);
1662 	if (err) {
1663 		bphy_err(drvr, "set auth failed (%d)\n", err);
1664 		return err;
1665 	}
1666 	sec = &profile->sec;
1667 	sec->auth_type = sme->auth_type;
1668 	return err;
1669 }
1670 
1671 static s32
1672 brcmf_set_wsec_mode(struct net_device *ndev,
1673 		    struct cfg80211_connect_params *sme)
1674 {
1675 	struct brcmf_if *ifp = netdev_priv(ndev);
1676 	struct brcmf_cfg80211_profile *profile = ndev_to_prof(ndev);
1677 	struct brcmf_pub *drvr = ifp->drvr;
1678 	struct brcmf_cfg80211_security *sec;
1679 	s32 pval = 0;
1680 	s32 gval = 0;
1681 	s32 wsec;
1682 	s32 err = 0;
1683 
1684 	if (sme->crypto.n_ciphers_pairwise) {
1685 		switch (sme->crypto.ciphers_pairwise[0]) {
1686 		case WLAN_CIPHER_SUITE_WEP40:
1687 		case WLAN_CIPHER_SUITE_WEP104:
1688 			pval = WEP_ENABLED;
1689 			break;
1690 		case WLAN_CIPHER_SUITE_TKIP:
1691 			pval = TKIP_ENABLED;
1692 			break;
1693 		case WLAN_CIPHER_SUITE_CCMP:
1694 			pval = AES_ENABLED;
1695 			break;
1696 		case WLAN_CIPHER_SUITE_AES_CMAC:
1697 			pval = AES_ENABLED;
1698 			break;
1699 		default:
1700 			bphy_err(drvr, "invalid cipher pairwise (%d)\n",
1701 				 sme->crypto.ciphers_pairwise[0]);
1702 			return -EINVAL;
1703 		}
1704 	}
1705 	if (sme->crypto.cipher_group) {
1706 		switch (sme->crypto.cipher_group) {
1707 		case WLAN_CIPHER_SUITE_WEP40:
1708 		case WLAN_CIPHER_SUITE_WEP104:
1709 			gval = WEP_ENABLED;
1710 			break;
1711 		case WLAN_CIPHER_SUITE_TKIP:
1712 			gval = TKIP_ENABLED;
1713 			break;
1714 		case WLAN_CIPHER_SUITE_CCMP:
1715 			gval = AES_ENABLED;
1716 			break;
1717 		case WLAN_CIPHER_SUITE_AES_CMAC:
1718 			gval = AES_ENABLED;
1719 			break;
1720 		default:
1721 			bphy_err(drvr, "invalid cipher group (%d)\n",
1722 				 sme->crypto.cipher_group);
1723 			return -EINVAL;
1724 		}
1725 	}
1726 
1727 	brcmf_dbg(CONN, "pval (%d) gval (%d)\n", pval, gval);
1728 	/* In case of privacy, but no security and WPS then simulate */
1729 	/* setting AES. WPS-2.0 allows no security                   */
1730 	if (brcmf_find_wpsie(sme->ie, sme->ie_len) && !pval && !gval &&
1731 	    sme->privacy)
1732 		pval = AES_ENABLED;
1733 
1734 	wsec = pval | gval;
1735 	err = brcmf_fil_bsscfg_int_set(ifp, "wsec", wsec);
1736 	if (err) {
1737 		bphy_err(drvr, "error (%d)\n", err);
1738 		return err;
1739 	}
1740 
1741 	sec = &profile->sec;
1742 	sec->cipher_pairwise = sme->crypto.ciphers_pairwise[0];
1743 	sec->cipher_group = sme->crypto.cipher_group;
1744 
1745 	return err;
1746 }
1747 
1748 static s32
1749 brcmf_set_key_mgmt(struct net_device *ndev, struct cfg80211_connect_params *sme)
1750 {
1751 	struct brcmf_if *ifp = netdev_priv(ndev);
1752 	struct brcmf_cfg80211_profile *profile = &ifp->vif->profile;
1753 	struct brcmf_pub *drvr = ifp->drvr;
1754 	s32 val;
1755 	s32 err;
1756 	const struct brcmf_tlv *rsn_ie;
1757 	const u8 *ie;
1758 	u32 ie_len;
1759 	u32 offset;
1760 	u16 rsn_cap;
1761 	u32 mfp;
1762 	u16 count;
1763 
1764 	profile->use_fwsup = BRCMF_PROFILE_FWSUP_NONE;
1765 	profile->is_ft = false;
1766 
1767 	if (!sme->crypto.n_akm_suites)
1768 		return 0;
1769 
1770 	err = brcmf_fil_bsscfg_int_get(netdev_priv(ndev), "wpa_auth", &val);
1771 	if (err) {
1772 		bphy_err(drvr, "could not get wpa_auth (%d)\n", err);
1773 		return err;
1774 	}
1775 	if (val & (WPA_AUTH_PSK | WPA_AUTH_UNSPECIFIED)) {
1776 		switch (sme->crypto.akm_suites[0]) {
1777 		case WLAN_AKM_SUITE_8021X:
1778 			val = WPA_AUTH_UNSPECIFIED;
1779 			if (sme->want_1x)
1780 				profile->use_fwsup = BRCMF_PROFILE_FWSUP_1X;
1781 			break;
1782 		case WLAN_AKM_SUITE_PSK:
1783 			val = WPA_AUTH_PSK;
1784 			break;
1785 		default:
1786 			bphy_err(drvr, "invalid akm suite (%d)\n",
1787 				 sme->crypto.akm_suites[0]);
1788 			return -EINVAL;
1789 		}
1790 	} else if (val & (WPA2_AUTH_PSK | WPA2_AUTH_UNSPECIFIED)) {
1791 		switch (sme->crypto.akm_suites[0]) {
1792 		case WLAN_AKM_SUITE_8021X:
1793 			val = WPA2_AUTH_UNSPECIFIED;
1794 			if (sme->want_1x)
1795 				profile->use_fwsup = BRCMF_PROFILE_FWSUP_1X;
1796 			break;
1797 		case WLAN_AKM_SUITE_8021X_SHA256:
1798 			val = WPA2_AUTH_1X_SHA256;
1799 			if (sme->want_1x)
1800 				profile->use_fwsup = BRCMF_PROFILE_FWSUP_1X;
1801 			break;
1802 		case WLAN_AKM_SUITE_PSK_SHA256:
1803 			val = WPA2_AUTH_PSK_SHA256;
1804 			break;
1805 		case WLAN_AKM_SUITE_PSK:
1806 			val = WPA2_AUTH_PSK;
1807 			break;
1808 		case WLAN_AKM_SUITE_FT_8021X:
1809 			val = WPA2_AUTH_UNSPECIFIED | WPA2_AUTH_FT;
1810 			profile->is_ft = true;
1811 			if (sme->want_1x)
1812 				profile->use_fwsup = BRCMF_PROFILE_FWSUP_1X;
1813 			break;
1814 		case WLAN_AKM_SUITE_FT_PSK:
1815 			val = WPA2_AUTH_PSK | WPA2_AUTH_FT;
1816 			profile->is_ft = true;
1817 			break;
1818 		default:
1819 			bphy_err(drvr, "invalid akm suite (%d)\n",
1820 				 sme->crypto.akm_suites[0]);
1821 			return -EINVAL;
1822 		}
1823 	} else if (val & WPA3_AUTH_SAE_PSK) {
1824 		switch (sme->crypto.akm_suites[0]) {
1825 		case WLAN_AKM_SUITE_SAE:
1826 			val = WPA3_AUTH_SAE_PSK;
1827 			if (sme->crypto.sae_pwd) {
1828 				brcmf_dbg(INFO, "using SAE offload\n");
1829 				profile->use_fwsup = BRCMF_PROFILE_FWSUP_SAE;
1830 			}
1831 			break;
1832 		case WLAN_AKM_SUITE_FT_OVER_SAE:
1833 			val = WPA3_AUTH_SAE_PSK | WPA2_AUTH_FT;
1834 			profile->is_ft = true;
1835 			if (sme->crypto.sae_pwd) {
1836 				brcmf_dbg(INFO, "using SAE offload\n");
1837 				profile->use_fwsup = BRCMF_PROFILE_FWSUP_SAE;
1838 			}
1839 			break;
1840 		default:
1841 			bphy_err(drvr, "invalid akm suite (%d)\n",
1842 				 sme->crypto.akm_suites[0]);
1843 			return -EINVAL;
1844 		}
1845 	}
1846 
1847 	if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_1X)
1848 		brcmf_dbg(INFO, "using 1X offload\n");
1849 
1850 	if (!brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MFP))
1851 		goto skip_mfp_config;
1852 	/* The MFP mode (1 or 2) needs to be determined, parse IEs. The
1853 	 * IE will not be verified, just a quick search for MFP config
1854 	 */
1855 	rsn_ie = brcmf_parse_tlvs((const u8 *)sme->ie, sme->ie_len,
1856 				  WLAN_EID_RSN);
1857 	if (!rsn_ie)
1858 		goto skip_mfp_config;
1859 	ie = (const u8 *)rsn_ie;
1860 	ie_len = rsn_ie->len + TLV_HDR_LEN;
1861 	/* Skip unicast suite */
1862 	offset = TLV_HDR_LEN + WPA_IE_VERSION_LEN + WPA_IE_MIN_OUI_LEN;
1863 	if (offset + WPA_IE_SUITE_COUNT_LEN >= ie_len)
1864 		goto skip_mfp_config;
1865 	/* Skip multicast suite */
1866 	count = ie[offset] + (ie[offset + 1] << 8);
1867 	offset += WPA_IE_SUITE_COUNT_LEN + (count * WPA_IE_MIN_OUI_LEN);
1868 	if (offset + WPA_IE_SUITE_COUNT_LEN >= ie_len)
1869 		goto skip_mfp_config;
1870 	/* Skip auth key management suite(s) */
1871 	count = ie[offset] + (ie[offset + 1] << 8);
1872 	offset += WPA_IE_SUITE_COUNT_LEN + (count * WPA_IE_MIN_OUI_LEN);
1873 	if (offset + WPA_IE_SUITE_COUNT_LEN > ie_len)
1874 		goto skip_mfp_config;
1875 	/* Ready to read capabilities */
1876 	mfp = BRCMF_MFP_NONE;
1877 	rsn_cap = ie[offset] + (ie[offset + 1] << 8);
1878 	if (rsn_cap & RSN_CAP_MFPR_MASK)
1879 		mfp = BRCMF_MFP_REQUIRED;
1880 	else if (rsn_cap & RSN_CAP_MFPC_MASK)
1881 		mfp = BRCMF_MFP_CAPABLE;
1882 	brcmf_fil_bsscfg_int_set(netdev_priv(ndev), "mfp", mfp);
1883 
1884 skip_mfp_config:
1885 	brcmf_dbg(CONN, "setting wpa_auth to %d\n", val);
1886 	err = brcmf_fil_bsscfg_int_set(netdev_priv(ndev), "wpa_auth", val);
1887 	if (err) {
1888 		bphy_err(drvr, "could not set wpa_auth (%d)\n", err);
1889 		return err;
1890 	}
1891 
1892 	return err;
1893 }
1894 
1895 static s32
1896 brcmf_set_sharedkey(struct net_device *ndev,
1897 		    struct cfg80211_connect_params *sme)
1898 {
1899 	struct brcmf_if *ifp = netdev_priv(ndev);
1900 	struct brcmf_pub *drvr = ifp->drvr;
1901 	struct brcmf_cfg80211_profile *profile = ndev_to_prof(ndev);
1902 	struct brcmf_cfg80211_security *sec;
1903 	struct brcmf_wsec_key key;
1904 	s32 val;
1905 	s32 err = 0;
1906 
1907 	brcmf_dbg(CONN, "key len (%d)\n", sme->key_len);
1908 
1909 	if (sme->key_len == 0)
1910 		return 0;
1911 
1912 	sec = &profile->sec;
1913 	brcmf_dbg(CONN, "wpa_versions 0x%x cipher_pairwise 0x%x\n",
1914 		  sec->wpa_versions, sec->cipher_pairwise);
1915 
1916 	if (sec->wpa_versions & (NL80211_WPA_VERSION_1 | NL80211_WPA_VERSION_2 |
1917 				 NL80211_WPA_VERSION_3))
1918 		return 0;
1919 
1920 	if (!(sec->cipher_pairwise &
1921 	    (WLAN_CIPHER_SUITE_WEP40 | WLAN_CIPHER_SUITE_WEP104)))
1922 		return 0;
1923 
1924 	memset(&key, 0, sizeof(key));
1925 	key.len = (u32) sme->key_len;
1926 	key.index = (u32) sme->key_idx;
1927 	if (key.len > sizeof(key.data)) {
1928 		bphy_err(drvr, "Too long key length (%u)\n", key.len);
1929 		return -EINVAL;
1930 	}
1931 	memcpy(key.data, sme->key, key.len);
1932 	key.flags = BRCMF_PRIMARY_KEY;
1933 	switch (sec->cipher_pairwise) {
1934 	case WLAN_CIPHER_SUITE_WEP40:
1935 		key.algo = CRYPTO_ALGO_WEP1;
1936 		break;
1937 	case WLAN_CIPHER_SUITE_WEP104:
1938 		key.algo = CRYPTO_ALGO_WEP128;
1939 		break;
1940 	default:
1941 		bphy_err(drvr, "Invalid algorithm (%d)\n",
1942 			 sme->crypto.ciphers_pairwise[0]);
1943 		return -EINVAL;
1944 	}
1945 	/* Set the new key/index */
1946 	brcmf_dbg(CONN, "key length (%d) key index (%d) algo (%d)\n",
1947 		  key.len, key.index, key.algo);
1948 	brcmf_dbg(CONN, "key \"%s\"\n", key.data);
1949 	err = send_key_to_dongle(ifp, &key);
1950 	if (err)
1951 		return err;
1952 
1953 	if (sec->auth_type == NL80211_AUTHTYPE_SHARED_KEY) {
1954 		brcmf_dbg(CONN, "set auth_type to shared key\n");
1955 		val = WL_AUTH_SHARED_KEY;	/* shared key */
1956 		err = brcmf_fil_bsscfg_int_set(ifp, "auth", val);
1957 		if (err)
1958 			bphy_err(drvr, "set auth failed (%d)\n", err);
1959 	}
1960 	return err;
1961 }
1962 
1963 static
1964 enum nl80211_auth_type brcmf_war_auth_type(struct brcmf_if *ifp,
1965 					   enum nl80211_auth_type type)
1966 {
1967 	if (type == NL80211_AUTHTYPE_AUTOMATIC &&
1968 	    brcmf_feat_is_quirk_enabled(ifp, BRCMF_FEAT_QUIRK_AUTO_AUTH)) {
1969 		brcmf_dbg(CONN, "WAR: use OPEN instead of AUTO\n");
1970 		type = NL80211_AUTHTYPE_OPEN_SYSTEM;
1971 	}
1972 	return type;
1973 }
1974 
1975 static void brcmf_set_join_pref(struct brcmf_if *ifp,
1976 				struct cfg80211_bss_selection *bss_select)
1977 {
1978 	struct brcmf_pub *drvr = ifp->drvr;
1979 	struct brcmf_join_pref_params join_pref_params[2];
1980 	enum nl80211_band band;
1981 	int err, i = 0;
1982 
1983 	join_pref_params[i].len = 2;
1984 	join_pref_params[i].rssi_gain = 0;
1985 
1986 	if (bss_select->behaviour != NL80211_BSS_SELECT_ATTR_BAND_PREF)
1987 		brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_ASSOC_PREFER, WLC_BAND_AUTO);
1988 
1989 	switch (bss_select->behaviour) {
1990 	case __NL80211_BSS_SELECT_ATTR_INVALID:
1991 		brcmf_c_set_joinpref_default(ifp);
1992 		return;
1993 	case NL80211_BSS_SELECT_ATTR_BAND_PREF:
1994 		join_pref_params[i].type = BRCMF_JOIN_PREF_BAND;
1995 		band = bss_select->param.band_pref;
1996 		join_pref_params[i].band = nl80211_band_to_fwil(band);
1997 		i++;
1998 		break;
1999 	case NL80211_BSS_SELECT_ATTR_RSSI_ADJUST:
2000 		join_pref_params[i].type = BRCMF_JOIN_PREF_RSSI_DELTA;
2001 		band = bss_select->param.adjust.band;
2002 		join_pref_params[i].band = nl80211_band_to_fwil(band);
2003 		join_pref_params[i].rssi_gain = bss_select->param.adjust.delta;
2004 		i++;
2005 		break;
2006 	case NL80211_BSS_SELECT_ATTR_RSSI:
2007 	default:
2008 		break;
2009 	}
2010 	join_pref_params[i].type = BRCMF_JOIN_PREF_RSSI;
2011 	join_pref_params[i].len = 2;
2012 	join_pref_params[i].rssi_gain = 0;
2013 	join_pref_params[i].band = 0;
2014 	err = brcmf_fil_iovar_data_set(ifp, "join_pref", join_pref_params,
2015 				       sizeof(join_pref_params));
2016 	if (err)
2017 		bphy_err(drvr, "Set join_pref error (%d)\n", err);
2018 }
2019 
2020 static s32
2021 brcmf_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev,
2022 		       struct cfg80211_connect_params *sme)
2023 {
2024 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
2025 	struct brcmf_if *ifp = netdev_priv(ndev);
2026 	struct brcmf_cfg80211_profile *profile = &ifp->vif->profile;
2027 	struct ieee80211_channel *chan = sme->channel;
2028 	struct brcmf_pub *drvr = ifp->drvr;
2029 	struct brcmf_join_params join_params;
2030 	size_t join_params_size;
2031 	const struct brcmf_tlv *rsn_ie;
2032 	const struct brcmf_vs_tlv *wpa_ie;
2033 	const void *ie;
2034 	u32 ie_len;
2035 	struct brcmf_ext_join_params_le *ext_join_params;
2036 	u16 chanspec;
2037 	s32 err = 0;
2038 	u32 ssid_len;
2039 
2040 	brcmf_dbg(TRACE, "Enter\n");
2041 	if (!check_vif_up(ifp->vif))
2042 		return -EIO;
2043 
2044 	if (!sme->ssid) {
2045 		bphy_err(drvr, "Invalid ssid\n");
2046 		return -EOPNOTSUPP;
2047 	}
2048 
2049 	if (ifp->vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif) {
2050 		/* A normal (non P2P) connection request setup. */
2051 		ie = NULL;
2052 		ie_len = 0;
2053 		/* find the WPA_IE */
2054 		wpa_ie = brcmf_find_wpaie((u8 *)sme->ie, sme->ie_len);
2055 		if (wpa_ie) {
2056 			ie = wpa_ie;
2057 			ie_len = wpa_ie->len + TLV_HDR_LEN;
2058 		} else {
2059 			/* find the RSN_IE */
2060 			rsn_ie = brcmf_parse_tlvs((const u8 *)sme->ie,
2061 						  sme->ie_len,
2062 						  WLAN_EID_RSN);
2063 			if (rsn_ie) {
2064 				ie = rsn_ie;
2065 				ie_len = rsn_ie->len + TLV_HDR_LEN;
2066 			}
2067 		}
2068 		brcmf_fil_iovar_data_set(ifp, "wpaie", ie, ie_len);
2069 	}
2070 
2071 	err = brcmf_vif_set_mgmt_ie(ifp->vif, BRCMF_VNDR_IE_ASSOCREQ_FLAG,
2072 				    sme->ie, sme->ie_len);
2073 	if (err)
2074 		bphy_err(drvr, "Set Assoc REQ IE Failed\n");
2075 	else
2076 		brcmf_dbg(TRACE, "Applied Vndr IEs for Assoc request\n");
2077 
2078 	set_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state);
2079 
2080 	if (chan) {
2081 		cfg->channel =
2082 			ieee80211_frequency_to_channel(chan->center_freq);
2083 		chanspec = channel_to_chanspec(&cfg->d11inf, chan);
2084 		brcmf_dbg(CONN, "channel=%d, center_req=%d, chanspec=0x%04x\n",
2085 			  cfg->channel, chan->center_freq, chanspec);
2086 	} else {
2087 		cfg->channel = 0;
2088 		chanspec = 0;
2089 	}
2090 
2091 	brcmf_dbg(INFO, "ie (%p), ie_len (%zd)\n", sme->ie, sme->ie_len);
2092 
2093 	err = brcmf_set_wpa_version(ndev, sme);
2094 	if (err) {
2095 		bphy_err(drvr, "wl_set_wpa_version failed (%d)\n", err);
2096 		goto done;
2097 	}
2098 
2099 	sme->auth_type = brcmf_war_auth_type(ifp, sme->auth_type);
2100 	err = brcmf_set_auth_type(ndev, sme);
2101 	if (err) {
2102 		bphy_err(drvr, "wl_set_auth_type failed (%d)\n", err);
2103 		goto done;
2104 	}
2105 
2106 	err = brcmf_set_wsec_mode(ndev, sme);
2107 	if (err) {
2108 		bphy_err(drvr, "wl_set_set_cipher failed (%d)\n", err);
2109 		goto done;
2110 	}
2111 
2112 	err = brcmf_set_key_mgmt(ndev, sme);
2113 	if (err) {
2114 		bphy_err(drvr, "wl_set_key_mgmt failed (%d)\n", err);
2115 		goto done;
2116 	}
2117 
2118 	err = brcmf_set_sharedkey(ndev, sme);
2119 	if (err) {
2120 		bphy_err(drvr, "brcmf_set_sharedkey failed (%d)\n", err);
2121 		goto done;
2122 	}
2123 
2124 	if (sme->crypto.psk &&
2125 	    profile->use_fwsup != BRCMF_PROFILE_FWSUP_SAE) {
2126 		if (WARN_ON(profile->use_fwsup != BRCMF_PROFILE_FWSUP_NONE)) {
2127 			err = -EINVAL;
2128 			goto done;
2129 		}
2130 		brcmf_dbg(INFO, "using PSK offload\n");
2131 		profile->use_fwsup = BRCMF_PROFILE_FWSUP_PSK;
2132 	}
2133 
2134 	if (profile->use_fwsup != BRCMF_PROFILE_FWSUP_NONE) {
2135 		/* enable firmware supplicant for this interface */
2136 		err = brcmf_fil_iovar_int_set(ifp, "sup_wpa", 1);
2137 		if (err < 0) {
2138 			bphy_err(drvr, "failed to enable fw supplicant\n");
2139 			goto done;
2140 		}
2141 	}
2142 
2143 	if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_PSK)
2144 		err = brcmf_set_pmk(ifp, sme->crypto.psk,
2145 				    BRCMF_WSEC_MAX_PSK_LEN);
2146 	else if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_SAE) {
2147 		/* clean up user-space RSNE */
2148 		err = brcmf_fil_iovar_data_set(ifp, "wpaie", NULL, 0);
2149 		if (err) {
2150 			bphy_err(drvr, "failed to clean up user-space RSNE\n");
2151 			goto done;
2152 		}
2153 		err = brcmf_set_sae_password(ifp, sme->crypto.sae_pwd,
2154 					     sme->crypto.sae_pwd_len);
2155 		if (!err && sme->crypto.psk)
2156 			err = brcmf_set_pmk(ifp, sme->crypto.psk,
2157 					    BRCMF_WSEC_MAX_PSK_LEN);
2158 	}
2159 	if (err)
2160 		goto done;
2161 
2162 	/* Join with specific BSSID and cached SSID
2163 	 * If SSID is zero join based on BSSID only
2164 	 */
2165 	join_params_size = offsetof(struct brcmf_ext_join_params_le, assoc_le) +
2166 		offsetof(struct brcmf_assoc_params_le, chanspec_list);
2167 	if (cfg->channel)
2168 		join_params_size += sizeof(u16);
2169 	ext_join_params = kzalloc(join_params_size, GFP_KERNEL);
2170 	if (ext_join_params == NULL) {
2171 		err = -ENOMEM;
2172 		goto done;
2173 	}
2174 	ssid_len = min_t(u32, sme->ssid_len, IEEE80211_MAX_SSID_LEN);
2175 	ext_join_params->ssid_le.SSID_len = cpu_to_le32(ssid_len);
2176 	memcpy(&ext_join_params->ssid_le.SSID, sme->ssid, ssid_len);
2177 	if (ssid_len < IEEE80211_MAX_SSID_LEN)
2178 		brcmf_dbg(CONN, "SSID \"%s\", len (%d)\n",
2179 			  ext_join_params->ssid_le.SSID, ssid_len);
2180 
2181 	/* Set up join scan parameters */
2182 	ext_join_params->scan_le.scan_type = -1;
2183 	ext_join_params->scan_le.home_time = cpu_to_le32(-1);
2184 
2185 	if (sme->bssid)
2186 		memcpy(&ext_join_params->assoc_le.bssid, sme->bssid, ETH_ALEN);
2187 	else
2188 		eth_broadcast_addr(ext_join_params->assoc_le.bssid);
2189 
2190 	if (cfg->channel) {
2191 		ext_join_params->assoc_le.chanspec_num = cpu_to_le32(1);
2192 
2193 		ext_join_params->assoc_le.chanspec_list[0] =
2194 			cpu_to_le16(chanspec);
2195 		/* Increase dwell time to receive probe response or detect
2196 		 * beacon from target AP at a noisy air only during connect
2197 		 * command.
2198 		 */
2199 		ext_join_params->scan_le.active_time =
2200 			cpu_to_le32(BRCMF_SCAN_JOIN_ACTIVE_DWELL_TIME_MS);
2201 		ext_join_params->scan_le.passive_time =
2202 			cpu_to_le32(BRCMF_SCAN_JOIN_PASSIVE_DWELL_TIME_MS);
2203 		/* To sync with presence period of VSDB GO send probe request
2204 		 * more frequently. Probe request will be stopped when it gets
2205 		 * probe response from target AP/GO.
2206 		 */
2207 		ext_join_params->scan_le.nprobes =
2208 			cpu_to_le32(BRCMF_SCAN_JOIN_ACTIVE_DWELL_TIME_MS /
2209 				    BRCMF_SCAN_JOIN_PROBE_INTERVAL_MS);
2210 	} else {
2211 		ext_join_params->scan_le.active_time = cpu_to_le32(-1);
2212 		ext_join_params->scan_le.passive_time = cpu_to_le32(-1);
2213 		ext_join_params->scan_le.nprobes = cpu_to_le32(-1);
2214 	}
2215 
2216 	brcmf_set_join_pref(ifp, &sme->bss_select);
2217 
2218 	err  = brcmf_fil_bsscfg_data_set(ifp, "join", ext_join_params,
2219 					 join_params_size);
2220 	kfree(ext_join_params);
2221 	if (!err)
2222 		/* This is it. join command worked, we are done */
2223 		goto done;
2224 
2225 	/* join command failed, fallback to set ssid */
2226 	memset(&join_params, 0, sizeof(join_params));
2227 	join_params_size = sizeof(join_params.ssid_le);
2228 
2229 	memcpy(&join_params.ssid_le.SSID, sme->ssid, ssid_len);
2230 	join_params.ssid_le.SSID_len = cpu_to_le32(ssid_len);
2231 
2232 	if (sme->bssid)
2233 		memcpy(join_params.params_le.bssid, sme->bssid, ETH_ALEN);
2234 	else
2235 		eth_broadcast_addr(join_params.params_le.bssid);
2236 
2237 	if (cfg->channel) {
2238 		join_params.params_le.chanspec_list[0] = cpu_to_le16(chanspec);
2239 		join_params.params_le.chanspec_num = cpu_to_le32(1);
2240 		join_params_size += sizeof(join_params.params_le);
2241 	}
2242 	err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_SSID,
2243 				     &join_params, join_params_size);
2244 	if (err)
2245 		bphy_err(drvr, "BRCMF_C_SET_SSID failed (%d)\n", err);
2246 
2247 done:
2248 	if (err)
2249 		clear_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state);
2250 	brcmf_dbg(TRACE, "Exit\n");
2251 	return err;
2252 }
2253 
2254 static s32
2255 brcmf_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *ndev,
2256 		       u16 reason_code)
2257 {
2258 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
2259 	struct brcmf_if *ifp = netdev_priv(ndev);
2260 	struct brcmf_cfg80211_profile *profile = &ifp->vif->profile;
2261 	struct brcmf_pub *drvr = cfg->pub;
2262 	struct brcmf_scb_val_le scbval;
2263 	s32 err = 0;
2264 
2265 	brcmf_dbg(TRACE, "Enter. Reason code = %d\n", reason_code);
2266 	if (!check_vif_up(ifp->vif))
2267 		return -EIO;
2268 
2269 	clear_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state);
2270 	clear_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state);
2271 	cfg80211_disconnected(ndev, reason_code, NULL, 0, true, GFP_KERNEL);
2272 
2273 	memcpy(&scbval.ea, &profile->bssid, ETH_ALEN);
2274 	scbval.val = cpu_to_le32(reason_code);
2275 	err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_DISASSOC,
2276 				     &scbval, sizeof(scbval));
2277 	if (err)
2278 		bphy_err(drvr, "error (%d)\n", err);
2279 
2280 	brcmf_dbg(TRACE, "Exit\n");
2281 	return err;
2282 }
2283 
2284 static s32
2285 brcmf_cfg80211_set_tx_power(struct wiphy *wiphy, struct wireless_dev *wdev,
2286 			    enum nl80211_tx_power_setting type, s32 mbm)
2287 {
2288 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
2289 	struct net_device *ndev = cfg_to_ndev(cfg);
2290 	struct brcmf_if *ifp = netdev_priv(ndev);
2291 	struct brcmf_pub *drvr = cfg->pub;
2292 	s32 err;
2293 	s32 disable;
2294 	u32 qdbm = 127;
2295 
2296 	brcmf_dbg(TRACE, "Enter %d %d\n", type, mbm);
2297 	if (!check_vif_up(ifp->vif))
2298 		return -EIO;
2299 
2300 	switch (type) {
2301 	case NL80211_TX_POWER_AUTOMATIC:
2302 		break;
2303 	case NL80211_TX_POWER_LIMITED:
2304 	case NL80211_TX_POWER_FIXED:
2305 		if (mbm < 0) {
2306 			bphy_err(drvr, "TX_POWER_FIXED - dbm is negative\n");
2307 			err = -EINVAL;
2308 			goto done;
2309 		}
2310 		qdbm =  MBM_TO_DBM(4 * mbm);
2311 		if (qdbm > 127)
2312 			qdbm = 127;
2313 		qdbm |= WL_TXPWR_OVERRIDE;
2314 		break;
2315 	default:
2316 		bphy_err(drvr, "Unsupported type %d\n", type);
2317 		err = -EINVAL;
2318 		goto done;
2319 	}
2320 	/* Make sure radio is off or on as far as software is concerned */
2321 	disable = WL_RADIO_SW_DISABLE << 16;
2322 	err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_RADIO, disable);
2323 	if (err)
2324 		bphy_err(drvr, "WLC_SET_RADIO error (%d)\n", err);
2325 
2326 	err = brcmf_fil_iovar_int_set(ifp, "qtxpower", qdbm);
2327 	if (err)
2328 		bphy_err(drvr, "qtxpower error (%d)\n", err);
2329 
2330 done:
2331 	brcmf_dbg(TRACE, "Exit %d (qdbm)\n", qdbm & ~WL_TXPWR_OVERRIDE);
2332 	return err;
2333 }
2334 
2335 static s32
2336 brcmf_cfg80211_get_tx_power(struct wiphy *wiphy, struct wireless_dev *wdev,
2337 			    s32 *dbm)
2338 {
2339 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
2340 	struct brcmf_cfg80211_vif *vif = wdev_to_vif(wdev);
2341 	struct brcmf_pub *drvr = cfg->pub;
2342 	s32 qdbm = 0;
2343 	s32 err;
2344 
2345 	brcmf_dbg(TRACE, "Enter\n");
2346 	if (!check_vif_up(vif))
2347 		return -EIO;
2348 
2349 	err = brcmf_fil_iovar_int_get(vif->ifp, "qtxpower", &qdbm);
2350 	if (err) {
2351 		bphy_err(drvr, "error (%d)\n", err);
2352 		goto done;
2353 	}
2354 	*dbm = (qdbm & ~WL_TXPWR_OVERRIDE) / 4;
2355 
2356 done:
2357 	brcmf_dbg(TRACE, "Exit (0x%x %d)\n", qdbm, *dbm);
2358 	return err;
2359 }
2360 
2361 static s32
2362 brcmf_cfg80211_config_default_key(struct wiphy *wiphy, struct net_device *ndev,
2363 				  u8 key_idx, bool unicast, bool multicast)
2364 {
2365 	struct brcmf_if *ifp = netdev_priv(ndev);
2366 	struct brcmf_pub *drvr = ifp->drvr;
2367 	u32 index;
2368 	u32 wsec;
2369 	s32 err = 0;
2370 
2371 	brcmf_dbg(TRACE, "Enter\n");
2372 	brcmf_dbg(CONN, "key index (%d)\n", key_idx);
2373 	if (!check_vif_up(ifp->vif))
2374 		return -EIO;
2375 
2376 	err = brcmf_fil_bsscfg_int_get(ifp, "wsec", &wsec);
2377 	if (err) {
2378 		bphy_err(drvr, "WLC_GET_WSEC error (%d)\n", err);
2379 		goto done;
2380 	}
2381 
2382 	if (wsec & WEP_ENABLED) {
2383 		/* Just select a new current key */
2384 		index = key_idx;
2385 		err = brcmf_fil_cmd_int_set(ifp,
2386 					    BRCMF_C_SET_KEY_PRIMARY, index);
2387 		if (err)
2388 			bphy_err(drvr, "error (%d)\n", err);
2389 	}
2390 done:
2391 	brcmf_dbg(TRACE, "Exit\n");
2392 	return err;
2393 }
2394 
2395 static s32
2396 brcmf_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev,
2397 		       u8 key_idx, bool pairwise, const u8 *mac_addr)
2398 {
2399 	struct brcmf_if *ifp = netdev_priv(ndev);
2400 	struct brcmf_wsec_key *key;
2401 	s32 err;
2402 
2403 	brcmf_dbg(TRACE, "Enter\n");
2404 	brcmf_dbg(CONN, "key index (%d)\n", key_idx);
2405 
2406 	if (!check_vif_up(ifp->vif))
2407 		return -EIO;
2408 
2409 	if (key_idx >= BRCMF_MAX_DEFAULT_KEYS) {
2410 		/* we ignore this key index in this case */
2411 		return -EINVAL;
2412 	}
2413 
2414 	key = &ifp->vif->profile.key[key_idx];
2415 
2416 	if (key->algo == CRYPTO_ALGO_OFF) {
2417 		brcmf_dbg(CONN, "Ignore clearing of (never configured) key\n");
2418 		return -EINVAL;
2419 	}
2420 
2421 	memset(key, 0, sizeof(*key));
2422 	key->index = (u32)key_idx;
2423 	key->flags = BRCMF_PRIMARY_KEY;
2424 
2425 	/* Clear the key/index */
2426 	err = send_key_to_dongle(ifp, key);
2427 
2428 	brcmf_dbg(TRACE, "Exit\n");
2429 	return err;
2430 }
2431 
2432 static s32
2433 brcmf_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
2434 		       u8 key_idx, bool pairwise, const u8 *mac_addr,
2435 		       struct key_params *params)
2436 {
2437 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
2438 	struct brcmf_if *ifp = netdev_priv(ndev);
2439 	struct brcmf_pub *drvr = cfg->pub;
2440 	struct brcmf_wsec_key *key;
2441 	s32 val;
2442 	s32 wsec;
2443 	s32 err;
2444 	u8 keybuf[8];
2445 	bool ext_key;
2446 
2447 	brcmf_dbg(TRACE, "Enter\n");
2448 	brcmf_dbg(CONN, "key index (%d)\n", key_idx);
2449 	if (!check_vif_up(ifp->vif))
2450 		return -EIO;
2451 
2452 	if (key_idx >= BRCMF_MAX_DEFAULT_KEYS) {
2453 		/* we ignore this key index in this case */
2454 		bphy_err(drvr, "invalid key index (%d)\n", key_idx);
2455 		return -EINVAL;
2456 	}
2457 
2458 	if (params->key_len == 0)
2459 		return brcmf_cfg80211_del_key(wiphy, ndev, key_idx, pairwise,
2460 					      mac_addr);
2461 
2462 	if (params->key_len > sizeof(key->data)) {
2463 		bphy_err(drvr, "Too long key length (%u)\n", params->key_len);
2464 		return -EINVAL;
2465 	}
2466 
2467 	ext_key = false;
2468 	if (mac_addr && (params->cipher != WLAN_CIPHER_SUITE_WEP40) &&
2469 	    (params->cipher != WLAN_CIPHER_SUITE_WEP104)) {
2470 		brcmf_dbg(TRACE, "Ext key, mac %pM", mac_addr);
2471 		ext_key = true;
2472 	}
2473 
2474 	key = &ifp->vif->profile.key[key_idx];
2475 	memset(key, 0, sizeof(*key));
2476 	if ((ext_key) && (!is_multicast_ether_addr(mac_addr)))
2477 		memcpy((char *)&key->ea, (void *)mac_addr, ETH_ALEN);
2478 	key->len = params->key_len;
2479 	key->index = key_idx;
2480 	memcpy(key->data, params->key, key->len);
2481 	if (!ext_key)
2482 		key->flags = BRCMF_PRIMARY_KEY;
2483 
2484 	if (params->seq && params->seq_len == 6) {
2485 		/* rx iv */
2486 		u8 *ivptr;
2487 
2488 		ivptr = (u8 *)params->seq;
2489 		key->rxiv.hi = (ivptr[5] << 24) | (ivptr[4] << 16) |
2490 			(ivptr[3] << 8) | ivptr[2];
2491 		key->rxiv.lo = (ivptr[1] << 8) | ivptr[0];
2492 		key->iv_initialized = true;
2493 	}
2494 
2495 	switch (params->cipher) {
2496 	case WLAN_CIPHER_SUITE_WEP40:
2497 		key->algo = CRYPTO_ALGO_WEP1;
2498 		val = WEP_ENABLED;
2499 		brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_WEP40\n");
2500 		break;
2501 	case WLAN_CIPHER_SUITE_WEP104:
2502 		key->algo = CRYPTO_ALGO_WEP128;
2503 		val = WEP_ENABLED;
2504 		brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_WEP104\n");
2505 		break;
2506 	case WLAN_CIPHER_SUITE_TKIP:
2507 		if (!brcmf_is_apmode(ifp->vif)) {
2508 			brcmf_dbg(CONN, "Swapping RX/TX MIC key\n");
2509 			memcpy(keybuf, &key->data[24], sizeof(keybuf));
2510 			memcpy(&key->data[24], &key->data[16], sizeof(keybuf));
2511 			memcpy(&key->data[16], keybuf, sizeof(keybuf));
2512 		}
2513 		key->algo = CRYPTO_ALGO_TKIP;
2514 		val = TKIP_ENABLED;
2515 		brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_TKIP\n");
2516 		break;
2517 	case WLAN_CIPHER_SUITE_AES_CMAC:
2518 		key->algo = CRYPTO_ALGO_AES_CCM;
2519 		val = AES_ENABLED;
2520 		brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_AES_CMAC\n");
2521 		break;
2522 	case WLAN_CIPHER_SUITE_CCMP:
2523 		key->algo = CRYPTO_ALGO_AES_CCM;
2524 		val = AES_ENABLED;
2525 		brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_CCMP\n");
2526 		break;
2527 	default:
2528 		bphy_err(drvr, "Invalid cipher (0x%x)\n", params->cipher);
2529 		err = -EINVAL;
2530 		goto done;
2531 	}
2532 
2533 	err = send_key_to_dongle(ifp, key);
2534 	if (ext_key || err)
2535 		goto done;
2536 
2537 	err = brcmf_fil_bsscfg_int_get(ifp, "wsec", &wsec);
2538 	if (err) {
2539 		bphy_err(drvr, "get wsec error (%d)\n", err);
2540 		goto done;
2541 	}
2542 	wsec |= val;
2543 	err = brcmf_fil_bsscfg_int_set(ifp, "wsec", wsec);
2544 	if (err) {
2545 		bphy_err(drvr, "set wsec error (%d)\n", err);
2546 		goto done;
2547 	}
2548 
2549 done:
2550 	brcmf_dbg(TRACE, "Exit\n");
2551 	return err;
2552 }
2553 
2554 static s32
2555 brcmf_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev, u8 key_idx,
2556 		       bool pairwise, const u8 *mac_addr, void *cookie,
2557 		       void (*callback)(void *cookie,
2558 					struct key_params *params))
2559 {
2560 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
2561 	struct key_params params;
2562 	struct brcmf_if *ifp = netdev_priv(ndev);
2563 	struct brcmf_cfg80211_profile *profile = &ifp->vif->profile;
2564 	struct brcmf_pub *drvr = cfg->pub;
2565 	struct brcmf_cfg80211_security *sec;
2566 	s32 wsec;
2567 	s32 err = 0;
2568 
2569 	brcmf_dbg(TRACE, "Enter\n");
2570 	brcmf_dbg(CONN, "key index (%d)\n", key_idx);
2571 	if (!check_vif_up(ifp->vif))
2572 		return -EIO;
2573 
2574 	memset(&params, 0, sizeof(params));
2575 
2576 	err = brcmf_fil_bsscfg_int_get(ifp, "wsec", &wsec);
2577 	if (err) {
2578 		bphy_err(drvr, "WLC_GET_WSEC error (%d)\n", err);
2579 		/* Ignore this error, may happen during DISASSOC */
2580 		err = -EAGAIN;
2581 		goto done;
2582 	}
2583 	if (wsec & WEP_ENABLED) {
2584 		sec = &profile->sec;
2585 		if (sec->cipher_pairwise & WLAN_CIPHER_SUITE_WEP40) {
2586 			params.cipher = WLAN_CIPHER_SUITE_WEP40;
2587 			brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_WEP40\n");
2588 		} else if (sec->cipher_pairwise & WLAN_CIPHER_SUITE_WEP104) {
2589 			params.cipher = WLAN_CIPHER_SUITE_WEP104;
2590 			brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_WEP104\n");
2591 		}
2592 	} else if (wsec & TKIP_ENABLED) {
2593 		params.cipher = WLAN_CIPHER_SUITE_TKIP;
2594 		brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_TKIP\n");
2595 	} else if (wsec & AES_ENABLED) {
2596 		params.cipher = WLAN_CIPHER_SUITE_AES_CMAC;
2597 		brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_AES_CMAC\n");
2598 	} else  {
2599 		bphy_err(drvr, "Invalid algo (0x%x)\n", wsec);
2600 		err = -EINVAL;
2601 		goto done;
2602 	}
2603 	callback(cookie, &params);
2604 
2605 done:
2606 	brcmf_dbg(TRACE, "Exit\n");
2607 	return err;
2608 }
2609 
2610 static s32
2611 brcmf_cfg80211_config_default_mgmt_key(struct wiphy *wiphy,
2612 				       struct net_device *ndev, u8 key_idx)
2613 {
2614 	struct brcmf_if *ifp = netdev_priv(ndev);
2615 
2616 	brcmf_dbg(TRACE, "Enter key_idx %d\n", key_idx);
2617 
2618 	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MFP))
2619 		return 0;
2620 
2621 	brcmf_dbg(INFO, "Not supported\n");
2622 
2623 	return -EOPNOTSUPP;
2624 }
2625 
2626 static void
2627 brcmf_cfg80211_reconfigure_wep(struct brcmf_if *ifp)
2628 {
2629 	struct brcmf_pub *drvr = ifp->drvr;
2630 	s32 err;
2631 	u8 key_idx;
2632 	struct brcmf_wsec_key *key;
2633 	s32 wsec;
2634 
2635 	for (key_idx = 0; key_idx < BRCMF_MAX_DEFAULT_KEYS; key_idx++) {
2636 		key = &ifp->vif->profile.key[key_idx];
2637 		if ((key->algo == CRYPTO_ALGO_WEP1) ||
2638 		    (key->algo == CRYPTO_ALGO_WEP128))
2639 			break;
2640 	}
2641 	if (key_idx == BRCMF_MAX_DEFAULT_KEYS)
2642 		return;
2643 
2644 	err = send_key_to_dongle(ifp, key);
2645 	if (err) {
2646 		bphy_err(drvr, "Setting WEP key failed (%d)\n", err);
2647 		return;
2648 	}
2649 	err = brcmf_fil_bsscfg_int_get(ifp, "wsec", &wsec);
2650 	if (err) {
2651 		bphy_err(drvr, "get wsec error (%d)\n", err);
2652 		return;
2653 	}
2654 	wsec |= WEP_ENABLED;
2655 	err = brcmf_fil_bsscfg_int_set(ifp, "wsec", wsec);
2656 	if (err)
2657 		bphy_err(drvr, "set wsec error (%d)\n", err);
2658 }
2659 
2660 static void brcmf_convert_sta_flags(u32 fw_sta_flags, struct station_info *si)
2661 {
2662 	struct nl80211_sta_flag_update *sfu;
2663 
2664 	brcmf_dbg(TRACE, "flags %08x\n", fw_sta_flags);
2665 	si->filled |= BIT_ULL(NL80211_STA_INFO_STA_FLAGS);
2666 	sfu = &si->sta_flags;
2667 	sfu->mask = BIT(NL80211_STA_FLAG_WME) |
2668 		    BIT(NL80211_STA_FLAG_AUTHENTICATED) |
2669 		    BIT(NL80211_STA_FLAG_ASSOCIATED) |
2670 		    BIT(NL80211_STA_FLAG_AUTHORIZED);
2671 	if (fw_sta_flags & BRCMF_STA_WME)
2672 		sfu->set |= BIT(NL80211_STA_FLAG_WME);
2673 	if (fw_sta_flags & BRCMF_STA_AUTHE)
2674 		sfu->set |= BIT(NL80211_STA_FLAG_AUTHENTICATED);
2675 	if (fw_sta_flags & BRCMF_STA_ASSOC)
2676 		sfu->set |= BIT(NL80211_STA_FLAG_ASSOCIATED);
2677 	if (fw_sta_flags & BRCMF_STA_AUTHO)
2678 		sfu->set |= BIT(NL80211_STA_FLAG_AUTHORIZED);
2679 }
2680 
2681 static void brcmf_fill_bss_param(struct brcmf_if *ifp, struct station_info *si)
2682 {
2683 	struct brcmf_pub *drvr = ifp->drvr;
2684 	struct {
2685 		__le32 len;
2686 		struct brcmf_bss_info_le bss_le;
2687 	} *buf;
2688 	u16 capability;
2689 	int err;
2690 
2691 	buf = kzalloc(WL_BSS_INFO_MAX, GFP_KERNEL);
2692 	if (!buf)
2693 		return;
2694 
2695 	buf->len = cpu_to_le32(WL_BSS_INFO_MAX);
2696 	err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_BSS_INFO, buf,
2697 				     WL_BSS_INFO_MAX);
2698 	if (err) {
2699 		bphy_err(drvr, "Failed to get bss info (%d)\n", err);
2700 		goto out_kfree;
2701 	}
2702 	si->filled |= BIT_ULL(NL80211_STA_INFO_BSS_PARAM);
2703 	si->bss_param.beacon_interval = le16_to_cpu(buf->bss_le.beacon_period);
2704 	si->bss_param.dtim_period = buf->bss_le.dtim_period;
2705 	capability = le16_to_cpu(buf->bss_le.capability);
2706 	if (capability & IEEE80211_HT_STBC_PARAM_DUAL_CTS_PROT)
2707 		si->bss_param.flags |= BSS_PARAM_FLAGS_CTS_PROT;
2708 	if (capability & WLAN_CAPABILITY_SHORT_PREAMBLE)
2709 		si->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_PREAMBLE;
2710 	if (capability & WLAN_CAPABILITY_SHORT_SLOT_TIME)
2711 		si->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_SLOT_TIME;
2712 
2713 out_kfree:
2714 	kfree(buf);
2715 }
2716 
2717 static s32
2718 brcmf_cfg80211_get_station_ibss(struct brcmf_if *ifp,
2719 				struct station_info *sinfo)
2720 {
2721 	struct brcmf_pub *drvr = ifp->drvr;
2722 	struct brcmf_scb_val_le scbval;
2723 	struct brcmf_pktcnt_le pktcnt;
2724 	s32 err;
2725 	u32 rate;
2726 	u32 rssi;
2727 
2728 	/* Get the current tx rate */
2729 	err = brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_RATE, &rate);
2730 	if (err < 0) {
2731 		bphy_err(drvr, "BRCMF_C_GET_RATE error (%d)\n", err);
2732 		return err;
2733 	}
2734 	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
2735 	sinfo->txrate.legacy = rate * 5;
2736 
2737 	memset(&scbval, 0, sizeof(scbval));
2738 	err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_RSSI, &scbval,
2739 				     sizeof(scbval));
2740 	if (err) {
2741 		bphy_err(drvr, "BRCMF_C_GET_RSSI error (%d)\n", err);
2742 		return err;
2743 	}
2744 	rssi = le32_to_cpu(scbval.val);
2745 	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
2746 	sinfo->signal = rssi;
2747 
2748 	err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_GET_PKTCNTS, &pktcnt,
2749 				     sizeof(pktcnt));
2750 	if (err) {
2751 		bphy_err(drvr, "BRCMF_C_GET_GET_PKTCNTS error (%d)\n", err);
2752 		return err;
2753 	}
2754 	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_PACKETS) |
2755 			 BIT_ULL(NL80211_STA_INFO_RX_DROP_MISC) |
2756 			 BIT_ULL(NL80211_STA_INFO_TX_PACKETS) |
2757 			 BIT_ULL(NL80211_STA_INFO_TX_FAILED);
2758 	sinfo->rx_packets = le32_to_cpu(pktcnt.rx_good_pkt);
2759 	sinfo->rx_dropped_misc = le32_to_cpu(pktcnt.rx_bad_pkt);
2760 	sinfo->tx_packets = le32_to_cpu(pktcnt.tx_good_pkt);
2761 	sinfo->tx_failed  = le32_to_cpu(pktcnt.tx_bad_pkt);
2762 
2763 	return 0;
2764 }
2765 
2766 static s32
2767 brcmf_cfg80211_get_station(struct wiphy *wiphy, struct net_device *ndev,
2768 			   const u8 *mac, struct station_info *sinfo)
2769 {
2770 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
2771 	struct brcmf_if *ifp = netdev_priv(ndev);
2772 	struct brcmf_pub *drvr = cfg->pub;
2773 	struct brcmf_scb_val_le scb_val;
2774 	s32 err = 0;
2775 	struct brcmf_sta_info_le sta_info_le;
2776 	u32 sta_flags;
2777 	u32 is_tdls_peer;
2778 	s32 total_rssi_avg = 0;
2779 	s32 total_rssi = 0;
2780 	s32 count_rssi = 0;
2781 	int rssi;
2782 	u32 i;
2783 
2784 	brcmf_dbg(TRACE, "Enter, MAC %pM\n", mac);
2785 	if (!check_vif_up(ifp->vif))
2786 		return -EIO;
2787 
2788 	if (brcmf_is_ibssmode(ifp->vif))
2789 		return brcmf_cfg80211_get_station_ibss(ifp, sinfo);
2790 
2791 	memset(&sta_info_le, 0, sizeof(sta_info_le));
2792 	memcpy(&sta_info_le, mac, ETH_ALEN);
2793 	err = brcmf_fil_iovar_data_get(ifp, "tdls_sta_info",
2794 				       &sta_info_le,
2795 				       sizeof(sta_info_le));
2796 	is_tdls_peer = !err;
2797 	if (err) {
2798 		err = brcmf_fil_iovar_data_get(ifp, "sta_info",
2799 					       &sta_info_le,
2800 					       sizeof(sta_info_le));
2801 		if (err < 0) {
2802 			bphy_err(drvr, "GET STA INFO failed, %d\n", err);
2803 			goto done;
2804 		}
2805 	}
2806 	brcmf_dbg(TRACE, "version %d\n", le16_to_cpu(sta_info_le.ver));
2807 	sinfo->filled = BIT_ULL(NL80211_STA_INFO_INACTIVE_TIME);
2808 	sinfo->inactive_time = le32_to_cpu(sta_info_le.idle) * 1000;
2809 	sta_flags = le32_to_cpu(sta_info_le.flags);
2810 	brcmf_convert_sta_flags(sta_flags, sinfo);
2811 	sinfo->sta_flags.mask |= BIT(NL80211_STA_FLAG_TDLS_PEER);
2812 	if (is_tdls_peer)
2813 		sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_TDLS_PEER);
2814 	else
2815 		sinfo->sta_flags.set &= ~BIT(NL80211_STA_FLAG_TDLS_PEER);
2816 	if (sta_flags & BRCMF_STA_ASSOC) {
2817 		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CONNECTED_TIME);
2818 		sinfo->connected_time = le32_to_cpu(sta_info_le.in);
2819 		brcmf_fill_bss_param(ifp, sinfo);
2820 	}
2821 	if (sta_flags & BRCMF_STA_SCBSTATS) {
2822 		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_FAILED);
2823 		sinfo->tx_failed = le32_to_cpu(sta_info_le.tx_failures);
2824 		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_PACKETS);
2825 		sinfo->tx_packets = le32_to_cpu(sta_info_le.tx_pkts);
2826 		sinfo->tx_packets += le32_to_cpu(sta_info_le.tx_mcast_pkts);
2827 		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_PACKETS);
2828 		sinfo->rx_packets = le32_to_cpu(sta_info_le.rx_ucast_pkts);
2829 		sinfo->rx_packets += le32_to_cpu(sta_info_le.rx_mcast_pkts);
2830 		if (sinfo->tx_packets) {
2831 			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
2832 			sinfo->txrate.legacy =
2833 				le32_to_cpu(sta_info_le.tx_rate) / 100;
2834 		}
2835 		if (sinfo->rx_packets) {
2836 			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BITRATE);
2837 			sinfo->rxrate.legacy =
2838 				le32_to_cpu(sta_info_le.rx_rate) / 100;
2839 		}
2840 		if (le16_to_cpu(sta_info_le.ver) >= 4) {
2841 			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BYTES);
2842 			sinfo->tx_bytes = le64_to_cpu(sta_info_le.tx_tot_bytes);
2843 			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BYTES);
2844 			sinfo->rx_bytes = le64_to_cpu(sta_info_le.rx_tot_bytes);
2845 		}
2846 		for (i = 0; i < BRCMF_ANT_MAX; i++) {
2847 			if (sta_info_le.rssi[i] == 0 ||
2848 			    sta_info_le.rx_lastpkt_rssi[i] == 0)
2849 				continue;
2850 			sinfo->chains |= BIT(count_rssi);
2851 			sinfo->chain_signal[count_rssi] =
2852 				sta_info_le.rx_lastpkt_rssi[i];
2853 			sinfo->chain_signal_avg[count_rssi] =
2854 				sta_info_le.rssi[i];
2855 			total_rssi += sta_info_le.rx_lastpkt_rssi[i];
2856 			total_rssi_avg += sta_info_le.rssi[i];
2857 			count_rssi++;
2858 		}
2859 		if (count_rssi) {
2860 			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
2861 			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
2862 			sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
2863 			sinfo->filled |=
2864 				BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG);
2865 			sinfo->signal = total_rssi / count_rssi;
2866 			sinfo->signal_avg = total_rssi_avg / count_rssi;
2867 		} else if (test_bit(BRCMF_VIF_STATUS_CONNECTED,
2868 			&ifp->vif->sme_state)) {
2869 			memset(&scb_val, 0, sizeof(scb_val));
2870 			err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_RSSI,
2871 						     &scb_val, sizeof(scb_val));
2872 			if (err) {
2873 				bphy_err(drvr, "Could not get rssi (%d)\n",
2874 					 err);
2875 				goto done;
2876 			} else {
2877 				rssi = le32_to_cpu(scb_val.val);
2878 				sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
2879 				sinfo->signal = rssi;
2880 				brcmf_dbg(CONN, "RSSI %d dBm\n", rssi);
2881 			}
2882 		}
2883 	}
2884 done:
2885 	brcmf_dbg(TRACE, "Exit\n");
2886 	return err;
2887 }
2888 
2889 static int
2890 brcmf_cfg80211_dump_station(struct wiphy *wiphy, struct net_device *ndev,
2891 			    int idx, u8 *mac, struct station_info *sinfo)
2892 {
2893 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
2894 	struct brcmf_if *ifp = netdev_priv(ndev);
2895 	struct brcmf_pub *drvr = cfg->pub;
2896 	s32 err;
2897 
2898 	brcmf_dbg(TRACE, "Enter, idx %d\n", idx);
2899 
2900 	if (idx == 0) {
2901 		cfg->assoclist.count = cpu_to_le32(BRCMF_MAX_ASSOCLIST);
2902 		err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_ASSOCLIST,
2903 					     &cfg->assoclist,
2904 					     sizeof(cfg->assoclist));
2905 		if (err) {
2906 			/* GET_ASSOCLIST unsupported by firmware of older chips */
2907 			if (err == -EBADE)
2908 				bphy_info_once(drvr, "BRCMF_C_GET_ASSOCLIST unsupported\n");
2909 			else
2910 				bphy_err(drvr, "BRCMF_C_GET_ASSOCLIST failed, err=%d\n",
2911 					 err);
2912 
2913 			cfg->assoclist.count = 0;
2914 			return -EOPNOTSUPP;
2915 		}
2916 	}
2917 	if (idx < le32_to_cpu(cfg->assoclist.count)) {
2918 		memcpy(mac, cfg->assoclist.mac[idx], ETH_ALEN);
2919 		return brcmf_cfg80211_get_station(wiphy, ndev, mac, sinfo);
2920 	}
2921 	return -ENOENT;
2922 }
2923 
2924 static s32
2925 brcmf_cfg80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *ndev,
2926 			   bool enabled, s32 timeout)
2927 {
2928 	s32 pm;
2929 	s32 err = 0;
2930 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
2931 	struct brcmf_if *ifp = netdev_priv(ndev);
2932 	struct brcmf_pub *drvr = cfg->pub;
2933 
2934 	brcmf_dbg(TRACE, "Enter\n");
2935 
2936 	/*
2937 	 * Powersave enable/disable request is coming from the
2938 	 * cfg80211 even before the interface is up. In that
2939 	 * scenario, driver will be storing the power save
2940 	 * preference in cfg struct to apply this to
2941 	 * FW later while initializing the dongle
2942 	 */
2943 	cfg->pwr_save = enabled;
2944 	if (!check_vif_up(ifp->vif)) {
2945 
2946 		brcmf_dbg(INFO, "Device is not ready, storing the value in cfg_info struct\n");
2947 		goto done;
2948 	}
2949 
2950 	pm = enabled ? PM_FAST : PM_OFF;
2951 	/* Do not enable the power save after assoc if it is a p2p interface */
2952 	if (ifp->vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT) {
2953 		brcmf_dbg(INFO, "Do not enable power save for P2P clients\n");
2954 		pm = PM_OFF;
2955 	}
2956 	brcmf_dbg(INFO, "power save %s\n", (pm ? "enabled" : "disabled"));
2957 
2958 	err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM, pm);
2959 	if (err) {
2960 		if (err == -ENODEV)
2961 			bphy_err(drvr, "net_device is not ready yet\n");
2962 		else
2963 			bphy_err(drvr, "error (%d)\n", err);
2964 	}
2965 
2966 	err = brcmf_fil_iovar_int_set(ifp, "pm2_sleep_ret",
2967 				min_t(u32, timeout, BRCMF_PS_MAX_TIMEOUT_MS));
2968 	if (err)
2969 		bphy_err(drvr, "Unable to set pm timeout, (%d)\n", err);
2970 
2971 done:
2972 	brcmf_dbg(TRACE, "Exit\n");
2973 	return err;
2974 }
2975 
2976 static s32 brcmf_inform_single_bss(struct brcmf_cfg80211_info *cfg,
2977 				   struct brcmf_bss_info_le *bi)
2978 {
2979 	struct wiphy *wiphy = cfg_to_wiphy(cfg);
2980 	struct brcmf_pub *drvr = cfg->pub;
2981 	struct cfg80211_bss *bss;
2982 	enum nl80211_band band;
2983 	struct brcmu_chan ch;
2984 	u16 channel;
2985 	u32 freq;
2986 	u16 notify_capability;
2987 	u16 notify_interval;
2988 	u8 *notify_ie;
2989 	size_t notify_ielen;
2990 	struct cfg80211_inform_bss bss_data = {};
2991 
2992 	if (le32_to_cpu(bi->length) > WL_BSS_INFO_MAX) {
2993 		bphy_err(drvr, "Bss info is larger than buffer. Discarding\n");
2994 		return -EINVAL;
2995 	}
2996 
2997 	if (!bi->ctl_ch) {
2998 		ch.chspec = le16_to_cpu(bi->chanspec);
2999 		cfg->d11inf.decchspec(&ch);
3000 		bi->ctl_ch = ch.control_ch_num;
3001 	}
3002 	channel = bi->ctl_ch;
3003 
3004 	if (channel <= CH_MAX_2G_CHANNEL)
3005 		band = NL80211_BAND_2GHZ;
3006 	else
3007 		band = NL80211_BAND_5GHZ;
3008 
3009 	freq = ieee80211_channel_to_frequency(channel, band);
3010 	bss_data.chan = ieee80211_get_channel(wiphy, freq);
3011 	bss_data.scan_width = NL80211_BSS_CHAN_WIDTH_20;
3012 	bss_data.boottime_ns = ktime_to_ns(ktime_get_boottime());
3013 
3014 	notify_capability = le16_to_cpu(bi->capability);
3015 	notify_interval = le16_to_cpu(bi->beacon_period);
3016 	notify_ie = (u8 *)bi + le16_to_cpu(bi->ie_offset);
3017 	notify_ielen = le32_to_cpu(bi->ie_length);
3018 	bss_data.signal = (s16)le16_to_cpu(bi->RSSI) * 100;
3019 
3020 	brcmf_dbg(CONN, "bssid: %pM\n", bi->BSSID);
3021 	brcmf_dbg(CONN, "Channel: %d(%d)\n", channel, freq);
3022 	brcmf_dbg(CONN, "Capability: %X\n", notify_capability);
3023 	brcmf_dbg(CONN, "Beacon interval: %d\n", notify_interval);
3024 	brcmf_dbg(CONN, "Signal: %d\n", bss_data.signal);
3025 
3026 	bss = cfg80211_inform_bss_data(wiphy, &bss_data,
3027 				       CFG80211_BSS_FTYPE_UNKNOWN,
3028 				       (const u8 *)bi->BSSID,
3029 				       0, notify_capability,
3030 				       notify_interval, notify_ie,
3031 				       notify_ielen, GFP_KERNEL);
3032 
3033 	if (!bss)
3034 		return -ENOMEM;
3035 
3036 	cfg80211_put_bss(wiphy, bss);
3037 
3038 	return 0;
3039 }
3040 
3041 static struct brcmf_bss_info_le *
3042 next_bss_le(struct brcmf_scan_results *list, struct brcmf_bss_info_le *bss)
3043 {
3044 	if (bss == NULL)
3045 		return list->bss_info_le;
3046 	return (struct brcmf_bss_info_le *)((unsigned long)bss +
3047 					    le32_to_cpu(bss->length));
3048 }
3049 
3050 static s32 brcmf_inform_bss(struct brcmf_cfg80211_info *cfg)
3051 {
3052 	struct brcmf_pub *drvr = cfg->pub;
3053 	struct brcmf_scan_results *bss_list;
3054 	struct brcmf_bss_info_le *bi = NULL;	/* must be initialized */
3055 	s32 err = 0;
3056 	int i;
3057 
3058 	bss_list = (struct brcmf_scan_results *)cfg->escan_info.escan_buf;
3059 	if (bss_list->count != 0 &&
3060 	    bss_list->version != BRCMF_BSS_INFO_VERSION) {
3061 		bphy_err(drvr, "Version %d != WL_BSS_INFO_VERSION\n",
3062 			 bss_list->version);
3063 		return -EOPNOTSUPP;
3064 	}
3065 	brcmf_dbg(SCAN, "scanned AP count (%d)\n", bss_list->count);
3066 	for (i = 0; i < bss_list->count; i++) {
3067 		bi = next_bss_le(bss_list, bi);
3068 		err = brcmf_inform_single_bss(cfg, bi);
3069 		if (err)
3070 			break;
3071 	}
3072 	return err;
3073 }
3074 
3075 static s32 brcmf_inform_ibss(struct brcmf_cfg80211_info *cfg,
3076 			     struct net_device *ndev, const u8 *bssid)
3077 {
3078 	struct wiphy *wiphy = cfg_to_wiphy(cfg);
3079 	struct brcmf_pub *drvr = cfg->pub;
3080 	struct ieee80211_channel *notify_channel;
3081 	struct brcmf_bss_info_le *bi = NULL;
3082 	struct ieee80211_supported_band *band;
3083 	struct cfg80211_bss *bss;
3084 	struct brcmu_chan ch;
3085 	u8 *buf = NULL;
3086 	s32 err = 0;
3087 	u32 freq;
3088 	u16 notify_capability;
3089 	u16 notify_interval;
3090 	u8 *notify_ie;
3091 	size_t notify_ielen;
3092 	s32 notify_signal;
3093 
3094 	brcmf_dbg(TRACE, "Enter\n");
3095 
3096 	buf = kzalloc(WL_BSS_INFO_MAX, GFP_KERNEL);
3097 	if (buf == NULL) {
3098 		err = -ENOMEM;
3099 		goto CleanUp;
3100 	}
3101 
3102 	*(__le32 *)buf = cpu_to_le32(WL_BSS_INFO_MAX);
3103 
3104 	err = brcmf_fil_cmd_data_get(netdev_priv(ndev), BRCMF_C_GET_BSS_INFO,
3105 				     buf, WL_BSS_INFO_MAX);
3106 	if (err) {
3107 		bphy_err(drvr, "WLC_GET_BSS_INFO failed: %d\n", err);
3108 		goto CleanUp;
3109 	}
3110 
3111 	bi = (struct brcmf_bss_info_le *)(buf + 4);
3112 
3113 	ch.chspec = le16_to_cpu(bi->chanspec);
3114 	cfg->d11inf.decchspec(&ch);
3115 
3116 	if (ch.band == BRCMU_CHAN_BAND_2G)
3117 		band = wiphy->bands[NL80211_BAND_2GHZ];
3118 	else
3119 		band = wiphy->bands[NL80211_BAND_5GHZ];
3120 
3121 	freq = ieee80211_channel_to_frequency(ch.control_ch_num, band->band);
3122 	cfg->channel = freq;
3123 	notify_channel = ieee80211_get_channel(wiphy, freq);
3124 
3125 	notify_capability = le16_to_cpu(bi->capability);
3126 	notify_interval = le16_to_cpu(bi->beacon_period);
3127 	notify_ie = (u8 *)bi + le16_to_cpu(bi->ie_offset);
3128 	notify_ielen = le32_to_cpu(bi->ie_length);
3129 	notify_signal = (s16)le16_to_cpu(bi->RSSI) * 100;
3130 
3131 	brcmf_dbg(CONN, "channel: %d(%d)\n", ch.control_ch_num, freq);
3132 	brcmf_dbg(CONN, "capability: %X\n", notify_capability);
3133 	brcmf_dbg(CONN, "beacon interval: %d\n", notify_interval);
3134 	brcmf_dbg(CONN, "signal: %d\n", notify_signal);
3135 
3136 	bss = cfg80211_inform_bss(wiphy, notify_channel,
3137 				  CFG80211_BSS_FTYPE_UNKNOWN, bssid, 0,
3138 				  notify_capability, notify_interval,
3139 				  notify_ie, notify_ielen, notify_signal,
3140 				  GFP_KERNEL);
3141 
3142 	if (!bss) {
3143 		err = -ENOMEM;
3144 		goto CleanUp;
3145 	}
3146 
3147 	cfg80211_put_bss(wiphy, bss);
3148 
3149 CleanUp:
3150 
3151 	kfree(buf);
3152 
3153 	brcmf_dbg(TRACE, "Exit\n");
3154 
3155 	return err;
3156 }
3157 
3158 static s32 brcmf_update_bss_info(struct brcmf_cfg80211_info *cfg,
3159 				 struct brcmf_if *ifp)
3160 {
3161 	struct brcmf_pub *drvr = cfg->pub;
3162 	struct brcmf_bss_info_le *bi;
3163 	const struct brcmf_tlv *tim;
3164 	size_t ie_len;
3165 	u8 *ie;
3166 	s32 err = 0;
3167 
3168 	brcmf_dbg(TRACE, "Enter\n");
3169 	if (brcmf_is_ibssmode(ifp->vif))
3170 		return err;
3171 
3172 	*(__le32 *)cfg->extra_buf = cpu_to_le32(WL_EXTRA_BUF_MAX);
3173 	err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_BSS_INFO,
3174 				     cfg->extra_buf, WL_EXTRA_BUF_MAX);
3175 	if (err) {
3176 		bphy_err(drvr, "Could not get bss info %d\n", err);
3177 		goto update_bss_info_out;
3178 	}
3179 
3180 	bi = (struct brcmf_bss_info_le *)(cfg->extra_buf + 4);
3181 	err = brcmf_inform_single_bss(cfg, bi);
3182 	if (err)
3183 		goto update_bss_info_out;
3184 
3185 	ie = ((u8 *)bi) + le16_to_cpu(bi->ie_offset);
3186 	ie_len = le32_to_cpu(bi->ie_length);
3187 
3188 	tim = brcmf_parse_tlvs(ie, ie_len, WLAN_EID_TIM);
3189 	if (!tim) {
3190 		/*
3191 		* active scan was done so we could not get dtim
3192 		* information out of probe response.
3193 		* so we speficially query dtim information to dongle.
3194 		*/
3195 		u32 var;
3196 		err = brcmf_fil_iovar_int_get(ifp, "dtim_assoc", &var);
3197 		if (err) {
3198 			bphy_err(drvr, "wl dtim_assoc failed (%d)\n", err);
3199 			goto update_bss_info_out;
3200 		}
3201 	}
3202 
3203 update_bss_info_out:
3204 	brcmf_dbg(TRACE, "Exit");
3205 	return err;
3206 }
3207 
3208 void brcmf_abort_scanning(struct brcmf_cfg80211_info *cfg)
3209 {
3210 	struct escan_info *escan = &cfg->escan_info;
3211 
3212 	set_bit(BRCMF_SCAN_STATUS_ABORT, &cfg->scan_status);
3213 	if (cfg->int_escan_map || cfg->scan_request) {
3214 		escan->escan_state = WL_ESCAN_STATE_IDLE;
3215 		brcmf_notify_escan_complete(cfg, escan->ifp, true, true);
3216 	}
3217 	clear_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status);
3218 	clear_bit(BRCMF_SCAN_STATUS_ABORT, &cfg->scan_status);
3219 }
3220 
3221 static void brcmf_cfg80211_escan_timeout_worker(struct work_struct *work)
3222 {
3223 	struct brcmf_cfg80211_info *cfg =
3224 			container_of(work, struct brcmf_cfg80211_info,
3225 				     escan_timeout_work);
3226 
3227 	brcmf_inform_bss(cfg);
3228 	brcmf_notify_escan_complete(cfg, cfg->escan_info.ifp, true, true);
3229 }
3230 
3231 static void brcmf_escan_timeout(struct timer_list *t)
3232 {
3233 	struct brcmf_cfg80211_info *cfg =
3234 			from_timer(cfg, t, escan_timeout);
3235 	struct brcmf_pub *drvr = cfg->pub;
3236 
3237 	if (cfg->int_escan_map || cfg->scan_request) {
3238 		bphy_err(drvr, "timer expired\n");
3239 		schedule_work(&cfg->escan_timeout_work);
3240 	}
3241 }
3242 
3243 static s32
3244 brcmf_compare_update_same_bss(struct brcmf_cfg80211_info *cfg,
3245 			      struct brcmf_bss_info_le *bss,
3246 			      struct brcmf_bss_info_le *bss_info_le)
3247 {
3248 	struct brcmu_chan ch_bss, ch_bss_info_le;
3249 
3250 	ch_bss.chspec = le16_to_cpu(bss->chanspec);
3251 	cfg->d11inf.decchspec(&ch_bss);
3252 	ch_bss_info_le.chspec = le16_to_cpu(bss_info_le->chanspec);
3253 	cfg->d11inf.decchspec(&ch_bss_info_le);
3254 
3255 	if (!memcmp(&bss_info_le->BSSID, &bss->BSSID, ETH_ALEN) &&
3256 		ch_bss.band == ch_bss_info_le.band &&
3257 		bss_info_le->SSID_len == bss->SSID_len &&
3258 		!memcmp(bss_info_le->SSID, bss->SSID, bss_info_le->SSID_len)) {
3259 		if ((bss->flags & BRCMF_BSS_RSSI_ON_CHANNEL) ==
3260 			(bss_info_le->flags & BRCMF_BSS_RSSI_ON_CHANNEL)) {
3261 			s16 bss_rssi = le16_to_cpu(bss->RSSI);
3262 			s16 bss_info_rssi = le16_to_cpu(bss_info_le->RSSI);
3263 
3264 			/* preserve max RSSI if the measurements are
3265 			* both on-channel or both off-channel
3266 			*/
3267 			if (bss_info_rssi > bss_rssi)
3268 				bss->RSSI = bss_info_le->RSSI;
3269 		} else if ((bss->flags & BRCMF_BSS_RSSI_ON_CHANNEL) &&
3270 			(bss_info_le->flags & BRCMF_BSS_RSSI_ON_CHANNEL) == 0) {
3271 			/* preserve the on-channel rssi measurement
3272 			* if the new measurement is off channel
3273 			*/
3274 			bss->RSSI = bss_info_le->RSSI;
3275 			bss->flags |= BRCMF_BSS_RSSI_ON_CHANNEL;
3276 		}
3277 		return 1;
3278 	}
3279 	return 0;
3280 }
3281 
3282 static s32
3283 brcmf_cfg80211_escan_handler(struct brcmf_if *ifp,
3284 			     const struct brcmf_event_msg *e, void *data)
3285 {
3286 	struct brcmf_pub *drvr = ifp->drvr;
3287 	struct brcmf_cfg80211_info *cfg = drvr->config;
3288 	s32 status;
3289 	struct brcmf_escan_result_le *escan_result_le;
3290 	u32 escan_buflen;
3291 	struct brcmf_bss_info_le *bss_info_le;
3292 	struct brcmf_bss_info_le *bss = NULL;
3293 	u32 bi_length;
3294 	struct brcmf_scan_results *list;
3295 	u32 i;
3296 	bool aborted;
3297 
3298 	status = e->status;
3299 
3300 	if (status == BRCMF_E_STATUS_ABORT)
3301 		goto exit;
3302 
3303 	if (!test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) {
3304 		bphy_err(drvr, "scan not ready, bsscfgidx=%d\n",
3305 			 ifp->bsscfgidx);
3306 		return -EPERM;
3307 	}
3308 
3309 	if (status == BRCMF_E_STATUS_PARTIAL) {
3310 		brcmf_dbg(SCAN, "ESCAN Partial result\n");
3311 		if (e->datalen < sizeof(*escan_result_le)) {
3312 			bphy_err(drvr, "invalid event data length\n");
3313 			goto exit;
3314 		}
3315 		escan_result_le = (struct brcmf_escan_result_le *) data;
3316 		if (!escan_result_le) {
3317 			bphy_err(drvr, "Invalid escan result (NULL pointer)\n");
3318 			goto exit;
3319 		}
3320 		escan_buflen = le32_to_cpu(escan_result_le->buflen);
3321 		if (escan_buflen > BRCMF_ESCAN_BUF_SIZE ||
3322 		    escan_buflen > e->datalen ||
3323 		    escan_buflen < sizeof(*escan_result_le)) {
3324 			bphy_err(drvr, "Invalid escan buffer length: %d\n",
3325 				 escan_buflen);
3326 			goto exit;
3327 		}
3328 		if (le16_to_cpu(escan_result_le->bss_count) != 1) {
3329 			bphy_err(drvr, "Invalid bss_count %d: ignoring\n",
3330 				 escan_result_le->bss_count);
3331 			goto exit;
3332 		}
3333 		bss_info_le = &escan_result_le->bss_info_le;
3334 
3335 		if (brcmf_p2p_scan_finding_common_channel(cfg, bss_info_le))
3336 			goto exit;
3337 
3338 		if (!cfg->int_escan_map && !cfg->scan_request) {
3339 			brcmf_dbg(SCAN, "result without cfg80211 request\n");
3340 			goto exit;
3341 		}
3342 
3343 		bi_length = le32_to_cpu(bss_info_le->length);
3344 		if (bi_length != escan_buflen -	WL_ESCAN_RESULTS_FIXED_SIZE) {
3345 			bphy_err(drvr, "Ignoring invalid bss_info length: %d\n",
3346 				 bi_length);
3347 			goto exit;
3348 		}
3349 
3350 		if (!(cfg_to_wiphy(cfg)->interface_modes &
3351 					BIT(NL80211_IFTYPE_ADHOC))) {
3352 			if (le16_to_cpu(bss_info_le->capability) &
3353 						WLAN_CAPABILITY_IBSS) {
3354 				bphy_err(drvr, "Ignoring IBSS result\n");
3355 				goto exit;
3356 			}
3357 		}
3358 
3359 		list = (struct brcmf_scan_results *)
3360 				cfg->escan_info.escan_buf;
3361 		if (bi_length > BRCMF_ESCAN_BUF_SIZE - list->buflen) {
3362 			bphy_err(drvr, "Buffer is too small: ignoring\n");
3363 			goto exit;
3364 		}
3365 
3366 		for (i = 0; i < list->count; i++) {
3367 			bss = bss ? (struct brcmf_bss_info_le *)
3368 				((unsigned char *)bss +
3369 				le32_to_cpu(bss->length)) : list->bss_info_le;
3370 			if (brcmf_compare_update_same_bss(cfg, bss,
3371 							  bss_info_le))
3372 				goto exit;
3373 		}
3374 		memcpy(&cfg->escan_info.escan_buf[list->buflen], bss_info_le,
3375 		       bi_length);
3376 		list->version = le32_to_cpu(bss_info_le->version);
3377 		list->buflen += bi_length;
3378 		list->count++;
3379 	} else {
3380 		cfg->escan_info.escan_state = WL_ESCAN_STATE_IDLE;
3381 		if (brcmf_p2p_scan_finding_common_channel(cfg, NULL))
3382 			goto exit;
3383 		if (cfg->int_escan_map || cfg->scan_request) {
3384 			brcmf_inform_bss(cfg);
3385 			aborted = status != BRCMF_E_STATUS_SUCCESS;
3386 			brcmf_notify_escan_complete(cfg, ifp, aborted, false);
3387 		} else
3388 			brcmf_dbg(SCAN, "Ignored scan complete result 0x%x\n",
3389 				  status);
3390 	}
3391 exit:
3392 	return 0;
3393 }
3394 
3395 static void brcmf_init_escan(struct brcmf_cfg80211_info *cfg)
3396 {
3397 	brcmf_fweh_register(cfg->pub, BRCMF_E_ESCAN_RESULT,
3398 			    brcmf_cfg80211_escan_handler);
3399 	cfg->escan_info.escan_state = WL_ESCAN_STATE_IDLE;
3400 	/* Init scan_timeout timer */
3401 	timer_setup(&cfg->escan_timeout, brcmf_escan_timeout, 0);
3402 	INIT_WORK(&cfg->escan_timeout_work,
3403 		  brcmf_cfg80211_escan_timeout_worker);
3404 }
3405 
3406 static struct cfg80211_scan_request *
3407 brcmf_alloc_internal_escan_request(struct wiphy *wiphy, u32 n_netinfo) {
3408 	struct cfg80211_scan_request *req;
3409 	size_t req_size;
3410 
3411 	req_size = sizeof(*req) +
3412 		   n_netinfo * sizeof(req->channels[0]) +
3413 		   n_netinfo * sizeof(*req->ssids);
3414 
3415 	req = kzalloc(req_size, GFP_KERNEL);
3416 	if (req) {
3417 		req->wiphy = wiphy;
3418 		req->ssids = (void *)(&req->channels[0]) +
3419 			     n_netinfo * sizeof(req->channels[0]);
3420 	}
3421 	return req;
3422 }
3423 
3424 static int brcmf_internal_escan_add_info(struct cfg80211_scan_request *req,
3425 					 u8 *ssid, u8 ssid_len, u8 channel)
3426 {
3427 	struct ieee80211_channel *chan;
3428 	enum nl80211_band band;
3429 	int freq, i;
3430 
3431 	if (channel <= CH_MAX_2G_CHANNEL)
3432 		band = NL80211_BAND_2GHZ;
3433 	else
3434 		band = NL80211_BAND_5GHZ;
3435 
3436 	freq = ieee80211_channel_to_frequency(channel, band);
3437 	if (!freq)
3438 		return -EINVAL;
3439 
3440 	chan = ieee80211_get_channel(req->wiphy, freq);
3441 	if (!chan)
3442 		return -EINVAL;
3443 
3444 	for (i = 0; i < req->n_channels; i++) {
3445 		if (req->channels[i] == chan)
3446 			break;
3447 	}
3448 	if (i == req->n_channels)
3449 		req->channels[req->n_channels++] = chan;
3450 
3451 	for (i = 0; i < req->n_ssids; i++) {
3452 		if (req->ssids[i].ssid_len == ssid_len &&
3453 		    !memcmp(req->ssids[i].ssid, ssid, ssid_len))
3454 			break;
3455 	}
3456 	if (i == req->n_ssids) {
3457 		memcpy(req->ssids[req->n_ssids].ssid, ssid, ssid_len);
3458 		req->ssids[req->n_ssids++].ssid_len = ssid_len;
3459 	}
3460 	return 0;
3461 }
3462 
3463 static int brcmf_start_internal_escan(struct brcmf_if *ifp, u32 fwmap,
3464 				      struct cfg80211_scan_request *request)
3465 {
3466 	struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
3467 	int err;
3468 
3469 	if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) {
3470 		if (cfg->int_escan_map)
3471 			brcmf_dbg(SCAN, "aborting internal scan: map=%u\n",
3472 				  cfg->int_escan_map);
3473 		/* Abort any on-going scan */
3474 		brcmf_abort_scanning(cfg);
3475 	}
3476 
3477 	brcmf_dbg(SCAN, "start internal scan: map=%u\n", fwmap);
3478 	set_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status);
3479 	cfg->escan_info.run = brcmf_run_escan;
3480 	err = brcmf_do_escan(ifp, request);
3481 	if (err) {
3482 		clear_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status);
3483 		return err;
3484 	}
3485 	cfg->int_escan_map = fwmap;
3486 	return 0;
3487 }
3488 
3489 static struct brcmf_pno_net_info_le *
3490 brcmf_get_netinfo_array(struct brcmf_pno_scanresults_le *pfn_v1)
3491 {
3492 	struct brcmf_pno_scanresults_v2_le *pfn_v2;
3493 	struct brcmf_pno_net_info_le *netinfo;
3494 
3495 	switch (pfn_v1->version) {
3496 	default:
3497 		WARN_ON(1);
3498 		fallthrough;
3499 	case cpu_to_le32(1):
3500 		netinfo = (struct brcmf_pno_net_info_le *)(pfn_v1 + 1);
3501 		break;
3502 	case cpu_to_le32(2):
3503 		pfn_v2 = (struct brcmf_pno_scanresults_v2_le *)pfn_v1;
3504 		netinfo = (struct brcmf_pno_net_info_le *)(pfn_v2 + 1);
3505 		break;
3506 	}
3507 
3508 	return netinfo;
3509 }
3510 
3511 /* PFN result doesn't have all the info which are required by the supplicant
3512  * (For e.g IEs) Do a target Escan so that sched scan results are reported
3513  * via wl_inform_single_bss in the required format. Escan does require the
3514  * scan request in the form of cfg80211_scan_request. For timebeing, create
3515  * cfg80211_scan_request one out of the received PNO event.
3516  */
3517 static s32
3518 brcmf_notify_sched_scan_results(struct brcmf_if *ifp,
3519 				const struct brcmf_event_msg *e, void *data)
3520 {
3521 	struct brcmf_pub *drvr = ifp->drvr;
3522 	struct brcmf_cfg80211_info *cfg = drvr->config;
3523 	struct brcmf_pno_net_info_le *netinfo, *netinfo_start;
3524 	struct cfg80211_scan_request *request = NULL;
3525 	struct wiphy *wiphy = cfg_to_wiphy(cfg);
3526 	int i, err = 0;
3527 	struct brcmf_pno_scanresults_le *pfn_result;
3528 	u32 bucket_map;
3529 	u32 result_count;
3530 	u32 status;
3531 	u32 datalen;
3532 
3533 	brcmf_dbg(SCAN, "Enter\n");
3534 
3535 	if (e->datalen < (sizeof(*pfn_result) + sizeof(*netinfo))) {
3536 		brcmf_dbg(SCAN, "Event data to small. Ignore\n");
3537 		return 0;
3538 	}
3539 
3540 	if (e->event_code == BRCMF_E_PFN_NET_LOST) {
3541 		brcmf_dbg(SCAN, "PFN NET LOST event. Do Nothing\n");
3542 		return 0;
3543 	}
3544 
3545 	pfn_result = (struct brcmf_pno_scanresults_le *)data;
3546 	result_count = le32_to_cpu(pfn_result->count);
3547 	status = le32_to_cpu(pfn_result->status);
3548 
3549 	/* PFN event is limited to fit 512 bytes so we may get
3550 	 * multiple NET_FOUND events. For now place a warning here.
3551 	 */
3552 	WARN_ON(status != BRCMF_PNO_SCAN_COMPLETE);
3553 	brcmf_dbg(SCAN, "PFN NET FOUND event. count: %d\n", result_count);
3554 	if (!result_count) {
3555 		bphy_err(drvr, "FALSE PNO Event. (pfn_count == 0)\n");
3556 		goto out_err;
3557 	}
3558 
3559 	netinfo_start = brcmf_get_netinfo_array(pfn_result);
3560 	datalen = e->datalen - ((void *)netinfo_start - (void *)pfn_result);
3561 	if (datalen < result_count * sizeof(*netinfo)) {
3562 		bphy_err(drvr, "insufficient event data\n");
3563 		goto out_err;
3564 	}
3565 
3566 	request = brcmf_alloc_internal_escan_request(wiphy,
3567 						     result_count);
3568 	if (!request) {
3569 		err = -ENOMEM;
3570 		goto out_err;
3571 	}
3572 
3573 	bucket_map = 0;
3574 	for (i = 0; i < result_count; i++) {
3575 		netinfo = &netinfo_start[i];
3576 
3577 		if (netinfo->SSID_len > IEEE80211_MAX_SSID_LEN)
3578 			netinfo->SSID_len = IEEE80211_MAX_SSID_LEN;
3579 		brcmf_dbg(SCAN, "SSID:%.32s Channel:%d\n",
3580 			  netinfo->SSID, netinfo->channel);
3581 		bucket_map |= brcmf_pno_get_bucket_map(cfg->pno, netinfo);
3582 		err = brcmf_internal_escan_add_info(request,
3583 						    netinfo->SSID,
3584 						    netinfo->SSID_len,
3585 						    netinfo->channel);
3586 		if (err)
3587 			goto out_err;
3588 	}
3589 
3590 	if (!bucket_map)
3591 		goto free_req;
3592 
3593 	err = brcmf_start_internal_escan(ifp, bucket_map, request);
3594 	if (!err)
3595 		goto free_req;
3596 
3597 out_err:
3598 	cfg80211_sched_scan_stopped(wiphy, 0);
3599 free_req:
3600 	kfree(request);
3601 	return err;
3602 }
3603 
3604 static int
3605 brcmf_cfg80211_sched_scan_start(struct wiphy *wiphy,
3606 				struct net_device *ndev,
3607 				struct cfg80211_sched_scan_request *req)
3608 {
3609 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
3610 	struct brcmf_if *ifp = netdev_priv(ndev);
3611 	struct brcmf_pub *drvr = cfg->pub;
3612 
3613 	brcmf_dbg(SCAN, "Enter: n_match_sets=%d n_ssids=%d\n",
3614 		  req->n_match_sets, req->n_ssids);
3615 
3616 	if (test_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status)) {
3617 		bphy_err(drvr, "Scanning suppressed: status=%lu\n",
3618 			 cfg->scan_status);
3619 		return -EAGAIN;
3620 	}
3621 
3622 	if (req->n_match_sets <= 0) {
3623 		brcmf_dbg(SCAN, "invalid number of matchsets specified: %d\n",
3624 			  req->n_match_sets);
3625 		return -EINVAL;
3626 	}
3627 
3628 	return brcmf_pno_start_sched_scan(ifp, req);
3629 }
3630 
3631 static int brcmf_cfg80211_sched_scan_stop(struct wiphy *wiphy,
3632 					  struct net_device *ndev, u64 reqid)
3633 {
3634 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
3635 	struct brcmf_if *ifp = netdev_priv(ndev);
3636 
3637 	brcmf_dbg(SCAN, "enter\n");
3638 	brcmf_pno_stop_sched_scan(ifp, reqid);
3639 	if (cfg->int_escan_map)
3640 		brcmf_notify_escan_complete(cfg, ifp, true, true);
3641 	return 0;
3642 }
3643 
3644 static __always_inline void brcmf_delay(u32 ms)
3645 {
3646 	if (ms < 1000 / HZ) {
3647 		cond_resched();
3648 		mdelay(ms);
3649 	} else {
3650 		msleep(ms);
3651 	}
3652 }
3653 
3654 static s32 brcmf_config_wowl_pattern(struct brcmf_if *ifp, u8 cmd[4],
3655 				     u8 *pattern, u32 patternsize, u8 *mask,
3656 				     u32 packet_offset)
3657 {
3658 	struct brcmf_fil_wowl_pattern_le *filter;
3659 	u32 masksize;
3660 	u32 patternoffset;
3661 	u8 *buf;
3662 	u32 bufsize;
3663 	s32 ret;
3664 
3665 	masksize = (patternsize + 7) / 8;
3666 	patternoffset = sizeof(*filter) - sizeof(filter->cmd) + masksize;
3667 
3668 	bufsize = sizeof(*filter) + patternsize + masksize;
3669 	buf = kzalloc(bufsize, GFP_KERNEL);
3670 	if (!buf)
3671 		return -ENOMEM;
3672 	filter = (struct brcmf_fil_wowl_pattern_le *)buf;
3673 
3674 	memcpy(filter->cmd, cmd, 4);
3675 	filter->masksize = cpu_to_le32(masksize);
3676 	filter->offset = cpu_to_le32(packet_offset);
3677 	filter->patternoffset = cpu_to_le32(patternoffset);
3678 	filter->patternsize = cpu_to_le32(patternsize);
3679 	filter->type = cpu_to_le32(BRCMF_WOWL_PATTERN_TYPE_BITMAP);
3680 
3681 	if ((mask) && (masksize))
3682 		memcpy(buf + sizeof(*filter), mask, masksize);
3683 	if ((pattern) && (patternsize))
3684 		memcpy(buf + sizeof(*filter) + masksize, pattern, patternsize);
3685 
3686 	ret = brcmf_fil_iovar_data_set(ifp, "wowl_pattern", buf, bufsize);
3687 
3688 	kfree(buf);
3689 	return ret;
3690 }
3691 
3692 static s32
3693 brcmf_wowl_nd_results(struct brcmf_if *ifp, const struct brcmf_event_msg *e,
3694 		      void *data)
3695 {
3696 	struct brcmf_pub *drvr = ifp->drvr;
3697 	struct brcmf_cfg80211_info *cfg = drvr->config;
3698 	struct brcmf_pno_scanresults_le *pfn_result;
3699 	struct brcmf_pno_net_info_le *netinfo;
3700 
3701 	brcmf_dbg(SCAN, "Enter\n");
3702 
3703 	if (e->datalen < (sizeof(*pfn_result) + sizeof(*netinfo))) {
3704 		brcmf_dbg(SCAN, "Event data to small. Ignore\n");
3705 		return 0;
3706 	}
3707 
3708 	pfn_result = (struct brcmf_pno_scanresults_le *)data;
3709 
3710 	if (e->event_code == BRCMF_E_PFN_NET_LOST) {
3711 		brcmf_dbg(SCAN, "PFN NET LOST event. Ignore\n");
3712 		return 0;
3713 	}
3714 
3715 	if (le32_to_cpu(pfn_result->count) < 1) {
3716 		bphy_err(drvr, "Invalid result count, expected 1 (%d)\n",
3717 			 le32_to_cpu(pfn_result->count));
3718 		return -EINVAL;
3719 	}
3720 
3721 	netinfo = brcmf_get_netinfo_array(pfn_result);
3722 	if (netinfo->SSID_len > IEEE80211_MAX_SSID_LEN)
3723 		netinfo->SSID_len = IEEE80211_MAX_SSID_LEN;
3724 	memcpy(cfg->wowl.nd->ssid.ssid, netinfo->SSID, netinfo->SSID_len);
3725 	cfg->wowl.nd->ssid.ssid_len = netinfo->SSID_len;
3726 	cfg->wowl.nd->n_channels = 1;
3727 	cfg->wowl.nd->channels[0] =
3728 		ieee80211_channel_to_frequency(netinfo->channel,
3729 			netinfo->channel <= CH_MAX_2G_CHANNEL ?
3730 					NL80211_BAND_2GHZ : NL80211_BAND_5GHZ);
3731 	cfg->wowl.nd_info->n_matches = 1;
3732 	cfg->wowl.nd_info->matches[0] = cfg->wowl.nd;
3733 
3734 	/* Inform (the resume task) that the net detect information was recvd */
3735 	cfg->wowl.nd_data_completed = true;
3736 	wake_up(&cfg->wowl.nd_data_wait);
3737 
3738 	return 0;
3739 }
3740 
3741 #ifdef CONFIG_PM
3742 
3743 static void brcmf_report_wowl_wakeind(struct wiphy *wiphy, struct brcmf_if *ifp)
3744 {
3745 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
3746 	struct brcmf_pub *drvr = cfg->pub;
3747 	struct brcmf_wowl_wakeind_le wake_ind_le;
3748 	struct cfg80211_wowlan_wakeup wakeup_data;
3749 	struct cfg80211_wowlan_wakeup *wakeup;
3750 	u32 wakeind;
3751 	s32 err;
3752 	int timeout;
3753 
3754 	err = brcmf_fil_iovar_data_get(ifp, "wowl_wakeind", &wake_ind_le,
3755 				       sizeof(wake_ind_le));
3756 	if (err) {
3757 		bphy_err(drvr, "Get wowl_wakeind failed, err = %d\n", err);
3758 		return;
3759 	}
3760 
3761 	wakeind = le32_to_cpu(wake_ind_le.ucode_wakeind);
3762 	if (wakeind & (BRCMF_WOWL_MAGIC | BRCMF_WOWL_DIS | BRCMF_WOWL_BCN |
3763 		       BRCMF_WOWL_RETR | BRCMF_WOWL_NET |
3764 		       BRCMF_WOWL_PFN_FOUND)) {
3765 		wakeup = &wakeup_data;
3766 		memset(&wakeup_data, 0, sizeof(wakeup_data));
3767 		wakeup_data.pattern_idx = -1;
3768 
3769 		if (wakeind & BRCMF_WOWL_MAGIC) {
3770 			brcmf_dbg(INFO, "WOWL Wake indicator: BRCMF_WOWL_MAGIC\n");
3771 			wakeup_data.magic_pkt = true;
3772 		}
3773 		if (wakeind & BRCMF_WOWL_DIS) {
3774 			brcmf_dbg(INFO, "WOWL Wake indicator: BRCMF_WOWL_DIS\n");
3775 			wakeup_data.disconnect = true;
3776 		}
3777 		if (wakeind & BRCMF_WOWL_BCN) {
3778 			brcmf_dbg(INFO, "WOWL Wake indicator: BRCMF_WOWL_BCN\n");
3779 			wakeup_data.disconnect = true;
3780 		}
3781 		if (wakeind & BRCMF_WOWL_RETR) {
3782 			brcmf_dbg(INFO, "WOWL Wake indicator: BRCMF_WOWL_RETR\n");
3783 			wakeup_data.disconnect = true;
3784 		}
3785 		if (wakeind & BRCMF_WOWL_NET) {
3786 			brcmf_dbg(INFO, "WOWL Wake indicator: BRCMF_WOWL_NET\n");
3787 			/* For now always map to pattern 0, no API to get
3788 			 * correct information available at the moment.
3789 			 */
3790 			wakeup_data.pattern_idx = 0;
3791 		}
3792 		if (wakeind & BRCMF_WOWL_PFN_FOUND) {
3793 			brcmf_dbg(INFO, "WOWL Wake indicator: BRCMF_WOWL_PFN_FOUND\n");
3794 			timeout = wait_event_timeout(cfg->wowl.nd_data_wait,
3795 				cfg->wowl.nd_data_completed,
3796 				BRCMF_ND_INFO_TIMEOUT);
3797 			if (!timeout)
3798 				bphy_err(drvr, "No result for wowl net detect\n");
3799 			else
3800 				wakeup_data.net_detect = cfg->wowl.nd_info;
3801 		}
3802 		if (wakeind & BRCMF_WOWL_GTK_FAILURE) {
3803 			brcmf_dbg(INFO, "WOWL Wake indicator: BRCMF_WOWL_GTK_FAILURE\n");
3804 			wakeup_data.gtk_rekey_failure = true;
3805 		}
3806 	} else {
3807 		wakeup = NULL;
3808 	}
3809 	cfg80211_report_wowlan_wakeup(&ifp->vif->wdev, wakeup, GFP_KERNEL);
3810 }
3811 
3812 #else
3813 
3814 static void brcmf_report_wowl_wakeind(struct wiphy *wiphy, struct brcmf_if *ifp)
3815 {
3816 }
3817 
3818 #endif /* CONFIG_PM */
3819 
3820 static s32 brcmf_cfg80211_resume(struct wiphy *wiphy)
3821 {
3822 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
3823 	struct net_device *ndev = cfg_to_ndev(cfg);
3824 	struct brcmf_if *ifp = netdev_priv(ndev);
3825 
3826 	brcmf_dbg(TRACE, "Enter\n");
3827 
3828 	if (cfg->wowl.active) {
3829 		brcmf_report_wowl_wakeind(wiphy, ifp);
3830 		brcmf_fil_iovar_int_set(ifp, "wowl_clear", 0);
3831 		brcmf_config_wowl_pattern(ifp, "clr", NULL, 0, NULL, 0);
3832 		if (!brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_ARP_ND))
3833 			brcmf_configure_arp_nd_offload(ifp, true);
3834 		brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM,
3835 				      cfg->wowl.pre_pmmode);
3836 		cfg->wowl.active = false;
3837 		if (cfg->wowl.nd_enabled) {
3838 			brcmf_cfg80211_sched_scan_stop(cfg->wiphy, ifp->ndev, 0);
3839 			brcmf_fweh_unregister(cfg->pub, BRCMF_E_PFN_NET_FOUND);
3840 			brcmf_fweh_register(cfg->pub, BRCMF_E_PFN_NET_FOUND,
3841 					    brcmf_notify_sched_scan_results);
3842 			cfg->wowl.nd_enabled = false;
3843 		}
3844 	}
3845 	return 0;
3846 }
3847 
3848 static void brcmf_configure_wowl(struct brcmf_cfg80211_info *cfg,
3849 				 struct brcmf_if *ifp,
3850 				 struct cfg80211_wowlan *wowl)
3851 {
3852 	u32 wowl_config;
3853 	struct brcmf_wowl_wakeind_le wowl_wakeind;
3854 	u32 i;
3855 
3856 	brcmf_dbg(TRACE, "Suspend, wowl config.\n");
3857 
3858 	if (!brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_ARP_ND))
3859 		brcmf_configure_arp_nd_offload(ifp, false);
3860 	brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_PM, &cfg->wowl.pre_pmmode);
3861 	brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM, PM_MAX);
3862 
3863 	wowl_config = 0;
3864 	if (wowl->disconnect)
3865 		wowl_config = BRCMF_WOWL_DIS | BRCMF_WOWL_BCN | BRCMF_WOWL_RETR;
3866 	if (wowl->magic_pkt)
3867 		wowl_config |= BRCMF_WOWL_MAGIC;
3868 	if ((wowl->patterns) && (wowl->n_patterns)) {
3869 		wowl_config |= BRCMF_WOWL_NET;
3870 		for (i = 0; i < wowl->n_patterns; i++) {
3871 			brcmf_config_wowl_pattern(ifp, "add",
3872 				(u8 *)wowl->patterns[i].pattern,
3873 				wowl->patterns[i].pattern_len,
3874 				(u8 *)wowl->patterns[i].mask,
3875 				wowl->patterns[i].pkt_offset);
3876 		}
3877 	}
3878 	if (wowl->nd_config) {
3879 		brcmf_cfg80211_sched_scan_start(cfg->wiphy, ifp->ndev,
3880 						wowl->nd_config);
3881 		wowl_config |= BRCMF_WOWL_PFN_FOUND;
3882 
3883 		cfg->wowl.nd_data_completed = false;
3884 		cfg->wowl.nd_enabled = true;
3885 		/* Now reroute the event for PFN to the wowl function. */
3886 		brcmf_fweh_unregister(cfg->pub, BRCMF_E_PFN_NET_FOUND);
3887 		brcmf_fweh_register(cfg->pub, BRCMF_E_PFN_NET_FOUND,
3888 				    brcmf_wowl_nd_results);
3889 	}
3890 	if (wowl->gtk_rekey_failure)
3891 		wowl_config |= BRCMF_WOWL_GTK_FAILURE;
3892 	if (!test_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state))
3893 		wowl_config |= BRCMF_WOWL_UNASSOC;
3894 
3895 	memcpy(&wowl_wakeind, "clear", 6);
3896 	brcmf_fil_iovar_data_set(ifp, "wowl_wakeind", &wowl_wakeind,
3897 				 sizeof(wowl_wakeind));
3898 	brcmf_fil_iovar_int_set(ifp, "wowl", wowl_config);
3899 	brcmf_fil_iovar_int_set(ifp, "wowl_activate", 1);
3900 	brcmf_bus_wowl_config(cfg->pub->bus_if, true);
3901 	cfg->wowl.active = true;
3902 }
3903 
3904 static int brcmf_keepalive_start(struct brcmf_if *ifp, unsigned int interval)
3905 {
3906 	struct brcmf_mkeep_alive_pkt_le kalive = {0};
3907 	int ret = 0;
3908 
3909 	/* Configure Null function/data keepalive */
3910 	kalive.version = cpu_to_le16(1);
3911 	kalive.period_msec = cpu_to_le32(interval * MSEC_PER_SEC);
3912 	kalive.len_bytes = cpu_to_le16(0);
3913 	kalive.keep_alive_id = 0;
3914 
3915 	ret = brcmf_fil_iovar_data_set(ifp, "mkeep_alive", &kalive, sizeof(kalive));
3916 	if (ret)
3917 		brcmf_err("keep-alive packet config failed, ret=%d\n", ret);
3918 
3919 	return ret;
3920 }
3921 
3922 static s32 brcmf_cfg80211_suspend(struct wiphy *wiphy,
3923 				  struct cfg80211_wowlan *wowl)
3924 {
3925 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
3926 	struct net_device *ndev = cfg_to_ndev(cfg);
3927 	struct brcmf_if *ifp = netdev_priv(ndev);
3928 	struct brcmf_cfg80211_vif *vif;
3929 
3930 	brcmf_dbg(TRACE, "Enter\n");
3931 
3932 	/* if the primary net_device is not READY there is nothing
3933 	 * we can do but pray resume goes smoothly.
3934 	 */
3935 	if (!check_vif_up(ifp->vif))
3936 		goto exit;
3937 
3938 	/* Stop scheduled scan */
3939 	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PNO))
3940 		brcmf_cfg80211_sched_scan_stop(wiphy, ndev, 0);
3941 
3942 	/* end any scanning */
3943 	if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status))
3944 		brcmf_abort_scanning(cfg);
3945 
3946 	if (wowl == NULL) {
3947 		brcmf_bus_wowl_config(cfg->pub->bus_if, false);
3948 		list_for_each_entry(vif, &cfg->vif_list, list) {
3949 			if (!test_bit(BRCMF_VIF_STATUS_READY, &vif->sme_state))
3950 				continue;
3951 			/* While going to suspend if associated with AP
3952 			 * disassociate from AP to save power while system is
3953 			 * in suspended state
3954 			 */
3955 			brcmf_link_down(vif, WLAN_REASON_UNSPECIFIED, true);
3956 			/* Make sure WPA_Supplicant receives all the event
3957 			 * generated due to DISASSOC call to the fw to keep
3958 			 * the state fw and WPA_Supplicant state consistent
3959 			 */
3960 			brcmf_delay(500);
3961 		}
3962 		/* Configure MPC */
3963 		brcmf_set_mpc(ifp, 1);
3964 
3965 	} else {
3966 		/* Configure WOWL paramaters */
3967 		brcmf_configure_wowl(cfg, ifp, wowl);
3968 
3969 		/* Prevent disassociation due to inactivity with keep-alive */
3970 		brcmf_keepalive_start(ifp, 30);
3971 	}
3972 
3973 exit:
3974 	brcmf_dbg(TRACE, "Exit\n");
3975 	/* clear any scanning activity */
3976 	cfg->scan_status = 0;
3977 	return 0;
3978 }
3979 
3980 static __used s32
3981 brcmf_update_pmklist(struct brcmf_cfg80211_info *cfg, struct brcmf_if *ifp)
3982 {
3983 	struct brcmf_pmk_list_le *pmk_list;
3984 	int i;
3985 	u32 npmk;
3986 	s32 err;
3987 
3988 	pmk_list = &cfg->pmk_list;
3989 	npmk = le32_to_cpu(pmk_list->npmk);
3990 
3991 	brcmf_dbg(CONN, "No of elements %d\n", npmk);
3992 	for (i = 0; i < npmk; i++)
3993 		brcmf_dbg(CONN, "PMK[%d]: %pM\n", i, &pmk_list->pmk[i].bssid);
3994 
3995 	err = brcmf_fil_iovar_data_set(ifp, "pmkid_info", pmk_list,
3996 				       sizeof(*pmk_list));
3997 
3998 	return err;
3999 }
4000 
4001 static s32
4002 brcmf_cfg80211_set_pmksa(struct wiphy *wiphy, struct net_device *ndev,
4003 			 struct cfg80211_pmksa *pmksa)
4004 {
4005 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
4006 	struct brcmf_if *ifp = netdev_priv(ndev);
4007 	struct brcmf_pmksa *pmk = &cfg->pmk_list.pmk[0];
4008 	struct brcmf_pub *drvr = cfg->pub;
4009 	s32 err;
4010 	u32 npmk, i;
4011 
4012 	brcmf_dbg(TRACE, "Enter\n");
4013 	if (!check_vif_up(ifp->vif))
4014 		return -EIO;
4015 
4016 	npmk = le32_to_cpu(cfg->pmk_list.npmk);
4017 	for (i = 0; i < npmk; i++)
4018 		if (!memcmp(pmksa->bssid, pmk[i].bssid, ETH_ALEN))
4019 			break;
4020 	if (i < BRCMF_MAXPMKID) {
4021 		memcpy(pmk[i].bssid, pmksa->bssid, ETH_ALEN);
4022 		memcpy(pmk[i].pmkid, pmksa->pmkid, WLAN_PMKID_LEN);
4023 		if (i == npmk) {
4024 			npmk++;
4025 			cfg->pmk_list.npmk = cpu_to_le32(npmk);
4026 		}
4027 	} else {
4028 		bphy_err(drvr, "Too many PMKSA entries cached %d\n", npmk);
4029 		return -EINVAL;
4030 	}
4031 
4032 	brcmf_dbg(CONN, "set_pmksa - PMK bssid: %pM =\n", pmk[npmk].bssid);
4033 	brcmf_dbg(CONN, "%*ph\n", WLAN_PMKID_LEN, pmk[npmk].pmkid);
4034 
4035 	err = brcmf_update_pmklist(cfg, ifp);
4036 
4037 	brcmf_dbg(TRACE, "Exit\n");
4038 	return err;
4039 }
4040 
4041 static s32
4042 brcmf_cfg80211_del_pmksa(struct wiphy *wiphy, struct net_device *ndev,
4043 			 struct cfg80211_pmksa *pmksa)
4044 {
4045 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
4046 	struct brcmf_if *ifp = netdev_priv(ndev);
4047 	struct brcmf_pmksa *pmk = &cfg->pmk_list.pmk[0];
4048 	struct brcmf_pub *drvr = cfg->pub;
4049 	s32 err;
4050 	u32 npmk, i;
4051 
4052 	brcmf_dbg(TRACE, "Enter\n");
4053 	if (!check_vif_up(ifp->vif))
4054 		return -EIO;
4055 
4056 	brcmf_dbg(CONN, "del_pmksa - PMK bssid = %pM\n", pmksa->bssid);
4057 
4058 	npmk = le32_to_cpu(cfg->pmk_list.npmk);
4059 	for (i = 0; i < npmk; i++)
4060 		if (!memcmp(pmksa->bssid, pmk[i].bssid, ETH_ALEN))
4061 			break;
4062 
4063 	if ((npmk > 0) && (i < npmk)) {
4064 		for (; i < (npmk - 1); i++) {
4065 			memcpy(&pmk[i].bssid, &pmk[i + 1].bssid, ETH_ALEN);
4066 			memcpy(&pmk[i].pmkid, &pmk[i + 1].pmkid,
4067 			       WLAN_PMKID_LEN);
4068 		}
4069 		memset(&pmk[i], 0, sizeof(*pmk));
4070 		cfg->pmk_list.npmk = cpu_to_le32(npmk - 1);
4071 	} else {
4072 		bphy_err(drvr, "Cache entry not found\n");
4073 		return -EINVAL;
4074 	}
4075 
4076 	err = brcmf_update_pmklist(cfg, ifp);
4077 
4078 	brcmf_dbg(TRACE, "Exit\n");
4079 	return err;
4080 
4081 }
4082 
4083 static s32
4084 brcmf_cfg80211_flush_pmksa(struct wiphy *wiphy, struct net_device *ndev)
4085 {
4086 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
4087 	struct brcmf_if *ifp = netdev_priv(ndev);
4088 	s32 err;
4089 
4090 	brcmf_dbg(TRACE, "Enter\n");
4091 	if (!check_vif_up(ifp->vif))
4092 		return -EIO;
4093 
4094 	memset(&cfg->pmk_list, 0, sizeof(cfg->pmk_list));
4095 	err = brcmf_update_pmklist(cfg, ifp);
4096 
4097 	brcmf_dbg(TRACE, "Exit\n");
4098 	return err;
4099 
4100 }
4101 
4102 static s32 brcmf_configure_opensecurity(struct brcmf_if *ifp)
4103 {
4104 	struct brcmf_pub *drvr = ifp->drvr;
4105 	s32 err;
4106 	s32 wpa_val;
4107 
4108 	/* set auth */
4109 	err = brcmf_fil_bsscfg_int_set(ifp, "auth", 0);
4110 	if (err < 0) {
4111 		bphy_err(drvr, "auth error %d\n", err);
4112 		return err;
4113 	}
4114 	/* set wsec */
4115 	err = brcmf_fil_bsscfg_int_set(ifp, "wsec", 0);
4116 	if (err < 0) {
4117 		bphy_err(drvr, "wsec error %d\n", err);
4118 		return err;
4119 	}
4120 	/* set upper-layer auth */
4121 	if (brcmf_is_ibssmode(ifp->vif))
4122 		wpa_val = WPA_AUTH_NONE;
4123 	else
4124 		wpa_val = WPA_AUTH_DISABLED;
4125 	err = brcmf_fil_bsscfg_int_set(ifp, "wpa_auth", wpa_val);
4126 	if (err < 0) {
4127 		bphy_err(drvr, "wpa_auth error %d\n", err);
4128 		return err;
4129 	}
4130 
4131 	return 0;
4132 }
4133 
4134 static bool brcmf_valid_wpa_oui(u8 *oui, bool is_rsn_ie)
4135 {
4136 	if (is_rsn_ie)
4137 		return (memcmp(oui, RSN_OUI, TLV_OUI_LEN) == 0);
4138 
4139 	return (memcmp(oui, WPA_OUI, TLV_OUI_LEN) == 0);
4140 }
4141 
4142 static s32
4143 brcmf_configure_wpaie(struct brcmf_if *ifp,
4144 		      const struct brcmf_vs_tlv *wpa_ie,
4145 		      bool is_rsn_ie)
4146 {
4147 	struct brcmf_pub *drvr = ifp->drvr;
4148 	u32 auth = 0; /* d11 open authentication */
4149 	u16 count;
4150 	s32 err = 0;
4151 	s32 len;
4152 	u32 i;
4153 	u32 wsec;
4154 	u32 pval = 0;
4155 	u32 gval = 0;
4156 	u32 wpa_auth = 0;
4157 	u32 offset;
4158 	u8 *data;
4159 	u16 rsn_cap;
4160 	u32 wme_bss_disable;
4161 	u32 mfp;
4162 
4163 	brcmf_dbg(TRACE, "Enter\n");
4164 	if (wpa_ie == NULL)
4165 		goto exit;
4166 
4167 	len = wpa_ie->len + TLV_HDR_LEN;
4168 	data = (u8 *)wpa_ie;
4169 	offset = TLV_HDR_LEN;
4170 	if (!is_rsn_ie)
4171 		offset += VS_IE_FIXED_HDR_LEN;
4172 	else
4173 		offset += WPA_IE_VERSION_LEN;
4174 
4175 	/* check for multicast cipher suite */
4176 	if (offset + WPA_IE_MIN_OUI_LEN > len) {
4177 		err = -EINVAL;
4178 		bphy_err(drvr, "no multicast cipher suite\n");
4179 		goto exit;
4180 	}
4181 
4182 	if (!brcmf_valid_wpa_oui(&data[offset], is_rsn_ie)) {
4183 		err = -EINVAL;
4184 		bphy_err(drvr, "ivalid OUI\n");
4185 		goto exit;
4186 	}
4187 	offset += TLV_OUI_LEN;
4188 
4189 	/* pick up multicast cipher */
4190 	switch (data[offset]) {
4191 	case WPA_CIPHER_NONE:
4192 		gval = 0;
4193 		break;
4194 	case WPA_CIPHER_WEP_40:
4195 	case WPA_CIPHER_WEP_104:
4196 		gval = WEP_ENABLED;
4197 		break;
4198 	case WPA_CIPHER_TKIP:
4199 		gval = TKIP_ENABLED;
4200 		break;
4201 	case WPA_CIPHER_AES_CCM:
4202 		gval = AES_ENABLED;
4203 		break;
4204 	default:
4205 		err = -EINVAL;
4206 		bphy_err(drvr, "Invalid multi cast cipher info\n");
4207 		goto exit;
4208 	}
4209 
4210 	offset++;
4211 	/* walk thru unicast cipher list and pick up what we recognize */
4212 	count = data[offset] + (data[offset + 1] << 8);
4213 	offset += WPA_IE_SUITE_COUNT_LEN;
4214 	/* Check for unicast suite(s) */
4215 	if (offset + (WPA_IE_MIN_OUI_LEN * count) > len) {
4216 		err = -EINVAL;
4217 		bphy_err(drvr, "no unicast cipher suite\n");
4218 		goto exit;
4219 	}
4220 	for (i = 0; i < count; i++) {
4221 		if (!brcmf_valid_wpa_oui(&data[offset], is_rsn_ie)) {
4222 			err = -EINVAL;
4223 			bphy_err(drvr, "ivalid OUI\n");
4224 			goto exit;
4225 		}
4226 		offset += TLV_OUI_LEN;
4227 		switch (data[offset]) {
4228 		case WPA_CIPHER_NONE:
4229 			break;
4230 		case WPA_CIPHER_WEP_40:
4231 		case WPA_CIPHER_WEP_104:
4232 			pval |= WEP_ENABLED;
4233 			break;
4234 		case WPA_CIPHER_TKIP:
4235 			pval |= TKIP_ENABLED;
4236 			break;
4237 		case WPA_CIPHER_AES_CCM:
4238 			pval |= AES_ENABLED;
4239 			break;
4240 		default:
4241 			bphy_err(drvr, "Invalid unicast security info\n");
4242 		}
4243 		offset++;
4244 	}
4245 	/* walk thru auth management suite list and pick up what we recognize */
4246 	count = data[offset] + (data[offset + 1] << 8);
4247 	offset += WPA_IE_SUITE_COUNT_LEN;
4248 	/* Check for auth key management suite(s) */
4249 	if (offset + (WPA_IE_MIN_OUI_LEN * count) > len) {
4250 		err = -EINVAL;
4251 		bphy_err(drvr, "no auth key mgmt suite\n");
4252 		goto exit;
4253 	}
4254 	for (i = 0; i < count; i++) {
4255 		if (!brcmf_valid_wpa_oui(&data[offset], is_rsn_ie)) {
4256 			err = -EINVAL;
4257 			bphy_err(drvr, "ivalid OUI\n");
4258 			goto exit;
4259 		}
4260 		offset += TLV_OUI_LEN;
4261 		switch (data[offset]) {
4262 		case RSN_AKM_NONE:
4263 			brcmf_dbg(TRACE, "RSN_AKM_NONE\n");
4264 			wpa_auth |= WPA_AUTH_NONE;
4265 			break;
4266 		case RSN_AKM_UNSPECIFIED:
4267 			brcmf_dbg(TRACE, "RSN_AKM_UNSPECIFIED\n");
4268 			is_rsn_ie ? (wpa_auth |= WPA2_AUTH_UNSPECIFIED) :
4269 				    (wpa_auth |= WPA_AUTH_UNSPECIFIED);
4270 			break;
4271 		case RSN_AKM_PSK:
4272 			brcmf_dbg(TRACE, "RSN_AKM_PSK\n");
4273 			is_rsn_ie ? (wpa_auth |= WPA2_AUTH_PSK) :
4274 				    (wpa_auth |= WPA_AUTH_PSK);
4275 			break;
4276 		case RSN_AKM_SHA256_PSK:
4277 			brcmf_dbg(TRACE, "RSN_AKM_MFP_PSK\n");
4278 			wpa_auth |= WPA2_AUTH_PSK_SHA256;
4279 			break;
4280 		case RSN_AKM_SHA256_1X:
4281 			brcmf_dbg(TRACE, "RSN_AKM_MFP_1X\n");
4282 			wpa_auth |= WPA2_AUTH_1X_SHA256;
4283 			break;
4284 		case RSN_AKM_SAE:
4285 			brcmf_dbg(TRACE, "RSN_AKM_SAE\n");
4286 			wpa_auth |= WPA3_AUTH_SAE_PSK;
4287 			break;
4288 		default:
4289 			bphy_err(drvr, "Invalid key mgmt info\n");
4290 		}
4291 		offset++;
4292 	}
4293 
4294 	mfp = BRCMF_MFP_NONE;
4295 	if (is_rsn_ie) {
4296 		wme_bss_disable = 1;
4297 		if ((offset + RSN_CAP_LEN) <= len) {
4298 			rsn_cap = data[offset] + (data[offset + 1] << 8);
4299 			if (rsn_cap & RSN_CAP_PTK_REPLAY_CNTR_MASK)
4300 				wme_bss_disable = 0;
4301 			if (rsn_cap & RSN_CAP_MFPR_MASK) {
4302 				brcmf_dbg(TRACE, "MFP Required\n");
4303 				mfp = BRCMF_MFP_REQUIRED;
4304 				/* Firmware only supports mfp required in
4305 				 * combination with WPA2_AUTH_PSK_SHA256,
4306 				 * WPA2_AUTH_1X_SHA256, or WPA3_AUTH_SAE_PSK.
4307 				 */
4308 				if (!(wpa_auth & (WPA2_AUTH_PSK_SHA256 |
4309 						  WPA2_AUTH_1X_SHA256 |
4310 						  WPA3_AUTH_SAE_PSK))) {
4311 					err = -EINVAL;
4312 					goto exit;
4313 				}
4314 				/* Firmware has requirement that WPA2_AUTH_PSK/
4315 				 * WPA2_AUTH_UNSPECIFIED be set, if SHA256 OUI
4316 				 * is to be included in the rsn ie.
4317 				 */
4318 				if (wpa_auth & WPA2_AUTH_PSK_SHA256)
4319 					wpa_auth |= WPA2_AUTH_PSK;
4320 				else if (wpa_auth & WPA2_AUTH_1X_SHA256)
4321 					wpa_auth |= WPA2_AUTH_UNSPECIFIED;
4322 			} else if (rsn_cap & RSN_CAP_MFPC_MASK) {
4323 				brcmf_dbg(TRACE, "MFP Capable\n");
4324 				mfp = BRCMF_MFP_CAPABLE;
4325 			}
4326 		}
4327 		offset += RSN_CAP_LEN;
4328 		/* set wme_bss_disable to sync RSN Capabilities */
4329 		err = brcmf_fil_bsscfg_int_set(ifp, "wme_bss_disable",
4330 					       wme_bss_disable);
4331 		if (err < 0) {
4332 			bphy_err(drvr, "wme_bss_disable error %d\n", err);
4333 			goto exit;
4334 		}
4335 
4336 		/* Skip PMKID cnt as it is know to be 0 for AP. */
4337 		offset += RSN_PMKID_COUNT_LEN;
4338 
4339 		/* See if there is BIP wpa suite left for MFP */
4340 		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MFP) &&
4341 		    ((offset + WPA_IE_MIN_OUI_LEN) <= len)) {
4342 			err = brcmf_fil_bsscfg_data_set(ifp, "bip",
4343 							&data[offset],
4344 							WPA_IE_MIN_OUI_LEN);
4345 			if (err < 0) {
4346 				bphy_err(drvr, "bip error %d\n", err);
4347 				goto exit;
4348 			}
4349 		}
4350 	}
4351 	/* FOR WPS , set SES_OW_ENABLED */
4352 	wsec = (pval | gval | SES_OW_ENABLED);
4353 
4354 	/* set auth */
4355 	err = brcmf_fil_bsscfg_int_set(ifp, "auth", auth);
4356 	if (err < 0) {
4357 		bphy_err(drvr, "auth error %d\n", err);
4358 		goto exit;
4359 	}
4360 	/* set wsec */
4361 	err = brcmf_fil_bsscfg_int_set(ifp, "wsec", wsec);
4362 	if (err < 0) {
4363 		bphy_err(drvr, "wsec error %d\n", err);
4364 		goto exit;
4365 	}
4366 	/* Configure MFP, this needs to go after wsec otherwise the wsec command
4367 	 * will overwrite the values set by MFP
4368 	 */
4369 	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MFP)) {
4370 		err = brcmf_fil_bsscfg_int_set(ifp, "mfp", mfp);
4371 		if (err < 0) {
4372 			bphy_err(drvr, "mfp error %d\n", err);
4373 			goto exit;
4374 		}
4375 	}
4376 	/* set upper-layer auth */
4377 	err = brcmf_fil_bsscfg_int_set(ifp, "wpa_auth", wpa_auth);
4378 	if (err < 0) {
4379 		bphy_err(drvr, "wpa_auth error %d\n", err);
4380 		goto exit;
4381 	}
4382 
4383 exit:
4384 	return err;
4385 }
4386 
4387 static s32
4388 brcmf_parse_vndr_ies(const u8 *vndr_ie_buf, u32 vndr_ie_len,
4389 		     struct parsed_vndr_ies *vndr_ies)
4390 {
4391 	struct brcmf_vs_tlv *vndrie;
4392 	struct brcmf_tlv *ie;
4393 	struct parsed_vndr_ie_info *parsed_info;
4394 	s32 remaining_len;
4395 
4396 	remaining_len = (s32)vndr_ie_len;
4397 	memset(vndr_ies, 0, sizeof(*vndr_ies));
4398 
4399 	ie = (struct brcmf_tlv *)vndr_ie_buf;
4400 	while (ie) {
4401 		if (ie->id != WLAN_EID_VENDOR_SPECIFIC)
4402 			goto next;
4403 		vndrie = (struct brcmf_vs_tlv *)ie;
4404 		/* len should be bigger than OUI length + one */
4405 		if (vndrie->len < (VS_IE_FIXED_HDR_LEN - TLV_HDR_LEN + 1)) {
4406 			brcmf_err("invalid vndr ie. length is too small %d\n",
4407 				  vndrie->len);
4408 			goto next;
4409 		}
4410 		/* if wpa or wme ie, do not add ie */
4411 		if (!memcmp(vndrie->oui, (u8 *)WPA_OUI, TLV_OUI_LEN) &&
4412 		    ((vndrie->oui_type == WPA_OUI_TYPE) ||
4413 		    (vndrie->oui_type == WME_OUI_TYPE))) {
4414 			brcmf_dbg(TRACE, "Found WPA/WME oui. Do not add it\n");
4415 			goto next;
4416 		}
4417 
4418 		parsed_info = &vndr_ies->ie_info[vndr_ies->count];
4419 
4420 		/* save vndr ie information */
4421 		parsed_info->ie_ptr = (char *)vndrie;
4422 		parsed_info->ie_len = vndrie->len + TLV_HDR_LEN;
4423 		memcpy(&parsed_info->vndrie, vndrie, sizeof(*vndrie));
4424 
4425 		vndr_ies->count++;
4426 
4427 		brcmf_dbg(TRACE, "** OUI %3ph, type 0x%02x\n",
4428 			  parsed_info->vndrie.oui,
4429 			  parsed_info->vndrie.oui_type);
4430 
4431 		if (vndr_ies->count >= VNDR_IE_PARSE_LIMIT)
4432 			break;
4433 next:
4434 		remaining_len -= (ie->len + TLV_HDR_LEN);
4435 		if (remaining_len <= TLV_HDR_LEN)
4436 			ie = NULL;
4437 		else
4438 			ie = (struct brcmf_tlv *)(((u8 *)ie) + ie->len +
4439 				TLV_HDR_LEN);
4440 	}
4441 	return 0;
4442 }
4443 
4444 static u32
4445 brcmf_vndr_ie(u8 *iebuf, s32 pktflag, u8 *ie_ptr, u32 ie_len, s8 *add_del_cmd)
4446 {
4447 	strscpy(iebuf, add_del_cmd, VNDR_IE_CMD_LEN);
4448 
4449 	put_unaligned_le32(1, &iebuf[VNDR_IE_COUNT_OFFSET]);
4450 
4451 	put_unaligned_le32(pktflag, &iebuf[VNDR_IE_PKTFLAG_OFFSET]);
4452 
4453 	memcpy(&iebuf[VNDR_IE_VSIE_OFFSET], ie_ptr, ie_len);
4454 
4455 	return ie_len + VNDR_IE_HDR_SIZE;
4456 }
4457 
4458 s32 brcmf_vif_set_mgmt_ie(struct brcmf_cfg80211_vif *vif, s32 pktflag,
4459 			  const u8 *vndr_ie_buf, u32 vndr_ie_len)
4460 {
4461 	struct brcmf_pub *drvr;
4462 	struct brcmf_if *ifp;
4463 	struct vif_saved_ie *saved_ie;
4464 	s32 err = 0;
4465 	u8  *iovar_ie_buf;
4466 	u8  *curr_ie_buf;
4467 	u8  *mgmt_ie_buf = NULL;
4468 	int mgmt_ie_buf_len;
4469 	u32 *mgmt_ie_len;
4470 	u32 del_add_ie_buf_len = 0;
4471 	u32 total_ie_buf_len = 0;
4472 	u32 parsed_ie_buf_len = 0;
4473 	struct parsed_vndr_ies old_vndr_ies;
4474 	struct parsed_vndr_ies new_vndr_ies;
4475 	struct parsed_vndr_ie_info *vndrie_info;
4476 	s32 i;
4477 	u8 *ptr;
4478 	int remained_buf_len;
4479 
4480 	if (!vif)
4481 		return -ENODEV;
4482 	ifp = vif->ifp;
4483 	drvr = ifp->drvr;
4484 	saved_ie = &vif->saved_ie;
4485 
4486 	brcmf_dbg(TRACE, "bsscfgidx %d, pktflag : 0x%02X\n", ifp->bsscfgidx,
4487 		  pktflag);
4488 	iovar_ie_buf = kzalloc(WL_EXTRA_BUF_MAX, GFP_KERNEL);
4489 	if (!iovar_ie_buf)
4490 		return -ENOMEM;
4491 	curr_ie_buf = iovar_ie_buf;
4492 	switch (pktflag) {
4493 	case BRCMF_VNDR_IE_PRBREQ_FLAG:
4494 		mgmt_ie_buf = saved_ie->probe_req_ie;
4495 		mgmt_ie_len = &saved_ie->probe_req_ie_len;
4496 		mgmt_ie_buf_len = sizeof(saved_ie->probe_req_ie);
4497 		break;
4498 	case BRCMF_VNDR_IE_PRBRSP_FLAG:
4499 		mgmt_ie_buf = saved_ie->probe_res_ie;
4500 		mgmt_ie_len = &saved_ie->probe_res_ie_len;
4501 		mgmt_ie_buf_len = sizeof(saved_ie->probe_res_ie);
4502 		break;
4503 	case BRCMF_VNDR_IE_BEACON_FLAG:
4504 		mgmt_ie_buf = saved_ie->beacon_ie;
4505 		mgmt_ie_len = &saved_ie->beacon_ie_len;
4506 		mgmt_ie_buf_len = sizeof(saved_ie->beacon_ie);
4507 		break;
4508 	case BRCMF_VNDR_IE_ASSOCREQ_FLAG:
4509 		mgmt_ie_buf = saved_ie->assoc_req_ie;
4510 		mgmt_ie_len = &saved_ie->assoc_req_ie_len;
4511 		mgmt_ie_buf_len = sizeof(saved_ie->assoc_req_ie);
4512 		break;
4513 	case BRCMF_VNDR_IE_ASSOCRSP_FLAG:
4514 		mgmt_ie_buf = saved_ie->assoc_res_ie;
4515 		mgmt_ie_len = &saved_ie->assoc_res_ie_len;
4516 		mgmt_ie_buf_len = sizeof(saved_ie->assoc_res_ie);
4517 		break;
4518 	default:
4519 		err = -EPERM;
4520 		bphy_err(drvr, "not suitable type\n");
4521 		goto exit;
4522 	}
4523 
4524 	if (vndr_ie_len > mgmt_ie_buf_len) {
4525 		err = -ENOMEM;
4526 		bphy_err(drvr, "extra IE size too big\n");
4527 		goto exit;
4528 	}
4529 
4530 	/* parse and save new vndr_ie in curr_ie_buff before comparing it */
4531 	if (vndr_ie_buf && vndr_ie_len && curr_ie_buf) {
4532 		ptr = curr_ie_buf;
4533 		brcmf_parse_vndr_ies(vndr_ie_buf, vndr_ie_len, &new_vndr_ies);
4534 		for (i = 0; i < new_vndr_ies.count; i++) {
4535 			vndrie_info = &new_vndr_ies.ie_info[i];
4536 			memcpy(ptr + parsed_ie_buf_len, vndrie_info->ie_ptr,
4537 			       vndrie_info->ie_len);
4538 			parsed_ie_buf_len += vndrie_info->ie_len;
4539 		}
4540 	}
4541 
4542 	if (mgmt_ie_buf && *mgmt_ie_len) {
4543 		if (parsed_ie_buf_len && (parsed_ie_buf_len == *mgmt_ie_len) &&
4544 		    (memcmp(mgmt_ie_buf, curr_ie_buf,
4545 			    parsed_ie_buf_len) == 0)) {
4546 			brcmf_dbg(TRACE, "Previous mgmt IE equals to current IE\n");
4547 			goto exit;
4548 		}
4549 
4550 		/* parse old vndr_ie */
4551 		brcmf_parse_vndr_ies(mgmt_ie_buf, *mgmt_ie_len, &old_vndr_ies);
4552 
4553 		/* make a command to delete old ie */
4554 		for (i = 0; i < old_vndr_ies.count; i++) {
4555 			vndrie_info = &old_vndr_ies.ie_info[i];
4556 
4557 			brcmf_dbg(TRACE, "DEL ID : %d, Len: %d , OUI:%3ph\n",
4558 				  vndrie_info->vndrie.id,
4559 				  vndrie_info->vndrie.len,
4560 				  vndrie_info->vndrie.oui);
4561 
4562 			del_add_ie_buf_len = brcmf_vndr_ie(curr_ie_buf, pktflag,
4563 							   vndrie_info->ie_ptr,
4564 							   vndrie_info->ie_len,
4565 							   "del");
4566 			curr_ie_buf += del_add_ie_buf_len;
4567 			total_ie_buf_len += del_add_ie_buf_len;
4568 		}
4569 	}
4570 
4571 	*mgmt_ie_len = 0;
4572 	/* Add if there is any extra IE */
4573 	if (mgmt_ie_buf && parsed_ie_buf_len) {
4574 		ptr = mgmt_ie_buf;
4575 
4576 		remained_buf_len = mgmt_ie_buf_len;
4577 
4578 		/* make a command to add new ie */
4579 		for (i = 0; i < new_vndr_ies.count; i++) {
4580 			vndrie_info = &new_vndr_ies.ie_info[i];
4581 
4582 			/* verify remained buf size before copy data */
4583 			if (remained_buf_len < (vndrie_info->vndrie.len +
4584 							VNDR_IE_VSIE_OFFSET)) {
4585 				bphy_err(drvr, "no space in mgmt_ie_buf: len left %d",
4586 					 remained_buf_len);
4587 				break;
4588 			}
4589 			remained_buf_len -= (vndrie_info->ie_len +
4590 					     VNDR_IE_VSIE_OFFSET);
4591 
4592 			brcmf_dbg(TRACE, "ADDED ID : %d, Len: %d, OUI:%3ph\n",
4593 				  vndrie_info->vndrie.id,
4594 				  vndrie_info->vndrie.len,
4595 				  vndrie_info->vndrie.oui);
4596 
4597 			del_add_ie_buf_len = brcmf_vndr_ie(curr_ie_buf, pktflag,
4598 							   vndrie_info->ie_ptr,
4599 							   vndrie_info->ie_len,
4600 							   "add");
4601 
4602 			/* save the parsed IE in wl struct */
4603 			memcpy(ptr + (*mgmt_ie_len), vndrie_info->ie_ptr,
4604 			       vndrie_info->ie_len);
4605 			*mgmt_ie_len += vndrie_info->ie_len;
4606 
4607 			curr_ie_buf += del_add_ie_buf_len;
4608 			total_ie_buf_len += del_add_ie_buf_len;
4609 		}
4610 	}
4611 	if (total_ie_buf_len) {
4612 		err  = brcmf_fil_bsscfg_data_set(ifp, "vndr_ie", iovar_ie_buf,
4613 						 total_ie_buf_len);
4614 		if (err)
4615 			bphy_err(drvr, "vndr ie set error : %d\n", err);
4616 	}
4617 
4618 exit:
4619 	kfree(iovar_ie_buf);
4620 	return err;
4621 }
4622 
4623 s32 brcmf_vif_clear_mgmt_ies(struct brcmf_cfg80211_vif *vif)
4624 {
4625 	s32 pktflags[] = {
4626 		BRCMF_VNDR_IE_PRBREQ_FLAG,
4627 		BRCMF_VNDR_IE_PRBRSP_FLAG,
4628 		BRCMF_VNDR_IE_BEACON_FLAG
4629 	};
4630 	int i;
4631 
4632 	for (i = 0; i < ARRAY_SIZE(pktflags); i++)
4633 		brcmf_vif_set_mgmt_ie(vif, pktflags[i], NULL, 0);
4634 
4635 	memset(&vif->saved_ie, 0, sizeof(vif->saved_ie));
4636 	return 0;
4637 }
4638 
4639 static s32
4640 brcmf_config_ap_mgmt_ie(struct brcmf_cfg80211_vif *vif,
4641 			struct cfg80211_beacon_data *beacon)
4642 {
4643 	struct brcmf_pub *drvr = vif->ifp->drvr;
4644 	s32 err;
4645 
4646 	/* Set Beacon IEs to FW */
4647 	err = brcmf_vif_set_mgmt_ie(vif, BRCMF_VNDR_IE_BEACON_FLAG,
4648 				    beacon->tail, beacon->tail_len);
4649 	if (err) {
4650 		bphy_err(drvr, "Set Beacon IE Failed\n");
4651 		return err;
4652 	}
4653 	brcmf_dbg(TRACE, "Applied Vndr IEs for Beacon\n");
4654 
4655 	/* Set Probe Response IEs to FW */
4656 	err = brcmf_vif_set_mgmt_ie(vif, BRCMF_VNDR_IE_PRBRSP_FLAG,
4657 				    beacon->proberesp_ies,
4658 				    beacon->proberesp_ies_len);
4659 	if (err)
4660 		bphy_err(drvr, "Set Probe Resp IE Failed\n");
4661 	else
4662 		brcmf_dbg(TRACE, "Applied Vndr IEs for Probe Resp\n");
4663 
4664 	/* Set Assoc Response IEs to FW */
4665 	err = brcmf_vif_set_mgmt_ie(vif, BRCMF_VNDR_IE_ASSOCRSP_FLAG,
4666 				    beacon->assocresp_ies,
4667 				    beacon->assocresp_ies_len);
4668 	if (err)
4669 		brcmf_err("Set Assoc Resp IE Failed\n");
4670 	else
4671 		brcmf_dbg(TRACE, "Applied Vndr IEs for Assoc Resp\n");
4672 
4673 	return err;
4674 }
4675 
4676 static s32
4677 brcmf_parse_configure_security(struct brcmf_if *ifp,
4678 			       struct cfg80211_ap_settings *settings,
4679 			       enum nl80211_iftype dev_role)
4680 {
4681 	const struct brcmf_tlv *rsn_ie;
4682 	const struct brcmf_vs_tlv *wpa_ie;
4683 	s32 err = 0;
4684 
4685 	/* find the RSN_IE */
4686 	rsn_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail,
4687 				  settings->beacon.tail_len, WLAN_EID_RSN);
4688 
4689 	/* find the WPA_IE */
4690 	wpa_ie = brcmf_find_wpaie((u8 *)settings->beacon.tail,
4691 				  settings->beacon.tail_len);
4692 
4693 	if (wpa_ie || rsn_ie) {
4694 		brcmf_dbg(TRACE, "WPA(2) IE is found\n");
4695 		if (wpa_ie) {
4696 			/* WPA IE */
4697 			err = brcmf_configure_wpaie(ifp, wpa_ie, false);
4698 			if (err < 0)
4699 				return err;
4700 		} else {
4701 			struct brcmf_vs_tlv *tmp_ie;
4702 
4703 			tmp_ie = (struct brcmf_vs_tlv *)rsn_ie;
4704 
4705 			/* RSN IE */
4706 			err = brcmf_configure_wpaie(ifp, tmp_ie, true);
4707 			if (err < 0)
4708 				return err;
4709 		}
4710 	} else {
4711 		brcmf_dbg(TRACE, "No WPA(2) IEs found\n");
4712 		brcmf_configure_opensecurity(ifp);
4713 	}
4714 
4715 	return err;
4716 }
4717 
4718 static s32
4719 brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
4720 			struct cfg80211_ap_settings *settings)
4721 {
4722 	s32 ie_offset;
4723 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
4724 	struct brcmf_if *ifp = netdev_priv(ndev);
4725 	struct brcmf_pub *drvr = cfg->pub;
4726 	struct brcmf_cfg80211_profile *profile = &ifp->vif->profile;
4727 	struct cfg80211_crypto_settings *crypto = &settings->crypto;
4728 	const struct brcmf_tlv *ssid_ie;
4729 	const struct brcmf_tlv *country_ie;
4730 	struct brcmf_ssid_le ssid_le;
4731 	s32 err = -EPERM;
4732 	struct brcmf_join_params join_params;
4733 	enum nl80211_iftype dev_role;
4734 	struct brcmf_fil_bss_enable_le bss_enable;
4735 	u16 chanspec = chandef_to_chanspec(&cfg->d11inf, &settings->chandef);
4736 	bool mbss;
4737 	int is_11d;
4738 	bool supports_11d;
4739 
4740 	brcmf_dbg(TRACE, "ctrlchn=%d, center=%d, bw=%d, beacon_interval=%d, dtim_period=%d,\n",
4741 		  settings->chandef.chan->hw_value,
4742 		  settings->chandef.center_freq1, settings->chandef.width,
4743 		  settings->beacon_interval, settings->dtim_period);
4744 	brcmf_dbg(TRACE, "ssid=%s(%zu), auth_type=%d, inactivity_timeout=%d\n",
4745 		  settings->ssid, settings->ssid_len, settings->auth_type,
4746 		  settings->inactivity_timeout);
4747 	dev_role = ifp->vif->wdev.iftype;
4748 	mbss = ifp->vif->mbss;
4749 
4750 	/* store current 11d setting */
4751 	if (brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_REGULATORY,
4752 				  &ifp->vif->is_11d)) {
4753 		is_11d = supports_11d = false;
4754 	} else {
4755 		country_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail,
4756 					      settings->beacon.tail_len,
4757 					      WLAN_EID_COUNTRY);
4758 		is_11d = country_ie ? 1 : 0;
4759 		supports_11d = true;
4760 	}
4761 
4762 	memset(&ssid_le, 0, sizeof(ssid_le));
4763 	if (settings->ssid == NULL || settings->ssid_len == 0) {
4764 		ie_offset = DOT11_MGMT_HDR_LEN + DOT11_BCN_PRB_FIXED_LEN;
4765 		ssid_ie = brcmf_parse_tlvs(
4766 				(u8 *)&settings->beacon.head[ie_offset],
4767 				settings->beacon.head_len - ie_offset,
4768 				WLAN_EID_SSID);
4769 		if (!ssid_ie || ssid_ie->len > IEEE80211_MAX_SSID_LEN)
4770 			return -EINVAL;
4771 
4772 		memcpy(ssid_le.SSID, ssid_ie->data, ssid_ie->len);
4773 		ssid_le.SSID_len = cpu_to_le32(ssid_ie->len);
4774 		brcmf_dbg(TRACE, "SSID is (%s) in Head\n", ssid_le.SSID);
4775 	} else {
4776 		memcpy(ssid_le.SSID, settings->ssid, settings->ssid_len);
4777 		ssid_le.SSID_len = cpu_to_le32((u32)settings->ssid_len);
4778 	}
4779 
4780 	if (!mbss) {
4781 		brcmf_set_mpc(ifp, 0);
4782 		brcmf_configure_arp_nd_offload(ifp, false);
4783 	}
4784 
4785 	/* Parameters shared by all radio interfaces */
4786 	if (!mbss) {
4787 		if ((supports_11d) && (is_11d != ifp->vif->is_11d)) {
4788 			err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_REGULATORY,
4789 						    is_11d);
4790 			if (err < 0) {
4791 				bphy_err(drvr, "Regulatory Set Error, %d\n",
4792 					 err);
4793 				goto exit;
4794 			}
4795 		}
4796 		if (settings->beacon_interval) {
4797 			err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_BCNPRD,
4798 						    settings->beacon_interval);
4799 			if (err < 0) {
4800 				bphy_err(drvr, "Beacon Interval Set Error, %d\n",
4801 					 err);
4802 				goto exit;
4803 			}
4804 		}
4805 		if (settings->dtim_period) {
4806 			err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_DTIMPRD,
4807 						    settings->dtim_period);
4808 			if (err < 0) {
4809 				bphy_err(drvr, "DTIM Interval Set Error, %d\n",
4810 					 err);
4811 				goto exit;
4812 			}
4813 		}
4814 
4815 		if ((dev_role == NL80211_IFTYPE_AP) &&
4816 		    ((ifp->ifidx == 0) ||
4817 		     (!brcmf_feat_is_enabled(ifp, BRCMF_FEAT_RSDB) &&
4818 		      !brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MCHAN)))) {
4819 			err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_DOWN, 1);
4820 			if (err < 0) {
4821 				bphy_err(drvr, "BRCMF_C_DOWN error %d\n",
4822 					 err);
4823 				goto exit;
4824 			}
4825 			brcmf_fil_iovar_int_set(ifp, "apsta", 0);
4826 		}
4827 
4828 		err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_INFRA, 1);
4829 		if (err < 0) {
4830 			bphy_err(drvr, "SET INFRA error %d\n", err);
4831 			goto exit;
4832 		}
4833 	} else if (WARN_ON(supports_11d && (is_11d != ifp->vif->is_11d))) {
4834 		/* Multiple-BSS should use same 11d configuration */
4835 		err = -EINVAL;
4836 		goto exit;
4837 	}
4838 
4839 	/* Interface specific setup */
4840 	if (dev_role == NL80211_IFTYPE_AP) {
4841 		if ((brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS)) && (!mbss))
4842 			brcmf_fil_iovar_int_set(ifp, "mbss", 1);
4843 
4844 		err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_AP, 1);
4845 		if (err < 0) {
4846 			bphy_err(drvr, "setting AP mode failed %d\n",
4847 				 err);
4848 			goto exit;
4849 		}
4850 		if (!mbss) {
4851 			/* Firmware 10.x requires setting channel after enabling
4852 			 * AP and before bringing interface up.
4853 			 */
4854 			err = brcmf_fil_iovar_int_set(ifp, "chanspec", chanspec);
4855 			if (err < 0) {
4856 				bphy_err(drvr, "Set Channel failed: chspec=%d, %d\n",
4857 					 chanspec, err);
4858 				goto exit;
4859 			}
4860 		}
4861 		err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 1);
4862 		if (err < 0) {
4863 			bphy_err(drvr, "BRCMF_C_UP error (%d)\n", err);
4864 			goto exit;
4865 		}
4866 
4867 		if (crypto->psk) {
4868 			brcmf_dbg(INFO, "using PSK offload\n");
4869 			profile->use_fwauth |= BIT(BRCMF_PROFILE_FWAUTH_PSK);
4870 			err = brcmf_set_pmk(ifp, crypto->psk,
4871 					    BRCMF_WSEC_MAX_PSK_LEN);
4872 			if (err < 0)
4873 				goto exit;
4874 		}
4875 		if (crypto->sae_pwd) {
4876 			brcmf_dbg(INFO, "using SAE offload\n");
4877 			profile->use_fwauth |= BIT(BRCMF_PROFILE_FWAUTH_SAE);
4878 			err = brcmf_set_sae_password(ifp, crypto->sae_pwd,
4879 						     crypto->sae_pwd_len);
4880 			if (err < 0)
4881 				goto exit;
4882 		}
4883 		if (profile->use_fwauth == 0)
4884 			profile->use_fwauth = BIT(BRCMF_PROFILE_FWAUTH_NONE);
4885 
4886 		err = brcmf_parse_configure_security(ifp, settings,
4887 						     NL80211_IFTYPE_AP);
4888 		if (err < 0) {
4889 			bphy_err(drvr, "brcmf_parse_configure_security error\n");
4890 			goto exit;
4891 		}
4892 
4893 		/* On DOWN the firmware removes the WEP keys, reconfigure
4894 		 * them if they were set.
4895 		 */
4896 		brcmf_cfg80211_reconfigure_wep(ifp);
4897 
4898 		memset(&join_params, 0, sizeof(join_params));
4899 		/* join parameters starts with ssid */
4900 		memcpy(&join_params.ssid_le, &ssid_le, sizeof(ssid_le));
4901 		/* create softap */
4902 		err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_SSID,
4903 					     &join_params, sizeof(join_params));
4904 		if (err < 0) {
4905 			bphy_err(drvr, "SET SSID error (%d)\n", err);
4906 			goto exit;
4907 		}
4908 
4909 		err = brcmf_fil_iovar_int_set(ifp, "closednet",
4910 					      settings->hidden_ssid);
4911 		if (err) {
4912 			bphy_err(drvr, "%s closednet error (%d)\n",
4913 				 settings->hidden_ssid ?
4914 				 "enabled" : "disabled",
4915 				 err);
4916 			goto exit;
4917 		}
4918 
4919 		brcmf_dbg(TRACE, "AP mode configuration complete\n");
4920 	} else if (dev_role == NL80211_IFTYPE_P2P_GO) {
4921 		err = brcmf_fil_iovar_int_set(ifp, "chanspec", chanspec);
4922 		if (err < 0) {
4923 			bphy_err(drvr, "Set Channel failed: chspec=%d, %d\n",
4924 				 chanspec, err);
4925 			goto exit;
4926 		}
4927 
4928 		err = brcmf_parse_configure_security(ifp, settings,
4929 						     NL80211_IFTYPE_P2P_GO);
4930 		if (err < 0) {
4931 			brcmf_err("brcmf_parse_configure_security error\n");
4932 			goto exit;
4933 		}
4934 
4935 		err = brcmf_fil_bsscfg_data_set(ifp, "ssid", &ssid_le,
4936 						sizeof(ssid_le));
4937 		if (err < 0) {
4938 			bphy_err(drvr, "setting ssid failed %d\n", err);
4939 			goto exit;
4940 		}
4941 		bss_enable.bsscfgidx = cpu_to_le32(ifp->bsscfgidx);
4942 		bss_enable.enable = cpu_to_le32(1);
4943 		err = brcmf_fil_iovar_data_set(ifp, "bss", &bss_enable,
4944 					       sizeof(bss_enable));
4945 		if (err < 0) {
4946 			bphy_err(drvr, "bss_enable config failed %d\n", err);
4947 			goto exit;
4948 		}
4949 
4950 		brcmf_dbg(TRACE, "GO mode configuration complete\n");
4951 	} else {
4952 		WARN_ON(1);
4953 	}
4954 
4955 	brcmf_config_ap_mgmt_ie(ifp->vif, &settings->beacon);
4956 	set_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state);
4957 	brcmf_net_setcarrier(ifp, true);
4958 
4959 exit:
4960 	if ((err) && (!mbss)) {
4961 		brcmf_set_mpc(ifp, 1);
4962 		brcmf_configure_arp_nd_offload(ifp, true);
4963 	}
4964 	return err;
4965 }
4966 
4967 static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
4968 {
4969 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
4970 	struct brcmf_if *ifp = netdev_priv(ndev);
4971 	struct brcmf_pub *drvr = cfg->pub;
4972 	struct brcmf_cfg80211_profile *profile = &ifp->vif->profile;
4973 	s32 err;
4974 	struct brcmf_fil_bss_enable_le bss_enable;
4975 	struct brcmf_join_params join_params;
4976 
4977 	brcmf_dbg(TRACE, "Enter\n");
4978 
4979 	if (ifp->vif->wdev.iftype == NL80211_IFTYPE_AP) {
4980 		/* Due to most likely deauths outstanding we sleep */
4981 		/* first to make sure they get processed by fw. */
4982 		msleep(400);
4983 
4984 		if (profile->use_fwauth != BIT(BRCMF_PROFILE_FWAUTH_NONE)) {
4985 			if (profile->use_fwauth & BIT(BRCMF_PROFILE_FWAUTH_PSK))
4986 				brcmf_set_pmk(ifp, NULL, 0);
4987 			if (profile->use_fwauth & BIT(BRCMF_PROFILE_FWAUTH_SAE))
4988 				brcmf_set_sae_password(ifp, NULL, 0);
4989 			profile->use_fwauth = BIT(BRCMF_PROFILE_FWAUTH_NONE);
4990 		}
4991 
4992 		if (ifp->vif->mbss) {
4993 			err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_DOWN, 1);
4994 			return err;
4995 		}
4996 
4997 		/* First BSS doesn't get a full reset */
4998 		if (ifp->bsscfgidx == 0)
4999 			brcmf_fil_iovar_int_set(ifp, "closednet", 0);
5000 
5001 		memset(&join_params, 0, sizeof(join_params));
5002 		err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_SSID,
5003 					     &join_params, sizeof(join_params));
5004 		if (err < 0)
5005 			bphy_err(drvr, "SET SSID error (%d)\n", err);
5006 		err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_DOWN, 1);
5007 		if (err < 0)
5008 			bphy_err(drvr, "BRCMF_C_DOWN error %d\n", err);
5009 		err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_AP, 0);
5010 		if (err < 0)
5011 			bphy_err(drvr, "setting AP mode failed %d\n", err);
5012 		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS))
5013 			brcmf_fil_iovar_int_set(ifp, "mbss", 0);
5014 		brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_REGULATORY,
5015 				      ifp->vif->is_11d);
5016 		/* Bring device back up so it can be used again */
5017 		err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 1);
5018 		if (err < 0)
5019 			bphy_err(drvr, "BRCMF_C_UP error %d\n", err);
5020 
5021 		brcmf_vif_clear_mgmt_ies(ifp->vif);
5022 	} else {
5023 		bss_enable.bsscfgidx = cpu_to_le32(ifp->bsscfgidx);
5024 		bss_enable.enable = cpu_to_le32(0);
5025 		err = brcmf_fil_iovar_data_set(ifp, "bss", &bss_enable,
5026 					       sizeof(bss_enable));
5027 		if (err < 0)
5028 			bphy_err(drvr, "bss_enable config failed %d\n", err);
5029 	}
5030 	brcmf_set_mpc(ifp, 1);
5031 	brcmf_configure_arp_nd_offload(ifp, true);
5032 	clear_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state);
5033 	brcmf_net_setcarrier(ifp, false);
5034 
5035 	return err;
5036 }
5037 
5038 static s32
5039 brcmf_cfg80211_change_beacon(struct wiphy *wiphy, struct net_device *ndev,
5040 			     struct cfg80211_beacon_data *info)
5041 {
5042 	struct brcmf_if *ifp = netdev_priv(ndev);
5043 	s32 err;
5044 
5045 	brcmf_dbg(TRACE, "Enter\n");
5046 
5047 	err = brcmf_config_ap_mgmt_ie(ifp->vif, info);
5048 
5049 	return err;
5050 }
5051 
5052 static int
5053 brcmf_cfg80211_del_station(struct wiphy *wiphy, struct net_device *ndev,
5054 			   struct station_del_parameters *params)
5055 {
5056 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
5057 	struct brcmf_pub *drvr = cfg->pub;
5058 	struct brcmf_scb_val_le scbval;
5059 	struct brcmf_if *ifp = netdev_priv(ndev);
5060 	s32 err;
5061 
5062 	if (!params->mac)
5063 		return -EFAULT;
5064 
5065 	brcmf_dbg(TRACE, "Enter %pM\n", params->mac);
5066 
5067 	if (ifp->vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif)
5068 		ifp = cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp;
5069 	if (!check_vif_up(ifp->vif))
5070 		return -EIO;
5071 
5072 	memcpy(&scbval.ea, params->mac, ETH_ALEN);
5073 	scbval.val = cpu_to_le32(params->reason_code);
5074 	err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SCB_DEAUTHENTICATE_FOR_REASON,
5075 				     &scbval, sizeof(scbval));
5076 	if (err)
5077 		bphy_err(drvr, "SCB_DEAUTHENTICATE_FOR_REASON failed %d\n",
5078 			 err);
5079 
5080 	brcmf_dbg(TRACE, "Exit\n");
5081 	return err;
5082 }
5083 
5084 static int
5085 brcmf_cfg80211_change_station(struct wiphy *wiphy, struct net_device *ndev,
5086 			      const u8 *mac, struct station_parameters *params)
5087 {
5088 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
5089 	struct brcmf_pub *drvr = cfg->pub;
5090 	struct brcmf_if *ifp = netdev_priv(ndev);
5091 	s32 err;
5092 
5093 	brcmf_dbg(TRACE, "Enter, MAC %pM, mask 0x%04x set 0x%04x\n", mac,
5094 		  params->sta_flags_mask, params->sta_flags_set);
5095 
5096 	/* Ignore all 00 MAC */
5097 	if (is_zero_ether_addr(mac))
5098 		return 0;
5099 
5100 	if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED)))
5101 		return 0;
5102 
5103 	if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED))
5104 		err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_SCB_AUTHORIZE,
5105 					     (void *)mac, ETH_ALEN);
5106 	else
5107 		err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_SCB_DEAUTHORIZE,
5108 					     (void *)mac, ETH_ALEN);
5109 	if (err < 0)
5110 		bphy_err(drvr, "Setting SCB (de-)authorize failed, %d\n", err);
5111 
5112 	return err;
5113 }
5114 
5115 static void
5116 brcmf_cfg80211_update_mgmt_frame_registrations(struct wiphy *wiphy,
5117 					       struct wireless_dev *wdev,
5118 					       struct mgmt_frame_regs *upd)
5119 {
5120 	struct brcmf_cfg80211_vif *vif;
5121 
5122 	vif = container_of(wdev, struct brcmf_cfg80211_vif, wdev);
5123 
5124 	vif->mgmt_rx_reg = upd->interface_stypes;
5125 }
5126 
5127 
5128 static int
5129 brcmf_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
5130 		       struct cfg80211_mgmt_tx_params *params, u64 *cookie)
5131 {
5132 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
5133 	struct ieee80211_channel *chan = params->chan;
5134 	struct brcmf_pub *drvr = cfg->pub;
5135 	const u8 *buf = params->buf;
5136 	size_t len = params->len;
5137 	const struct ieee80211_mgmt *mgmt;
5138 	struct brcmf_cfg80211_vif *vif;
5139 	s32 err = 0;
5140 	s32 ie_offset;
5141 	s32 ie_len;
5142 	struct brcmf_fil_action_frame_le *action_frame;
5143 	struct brcmf_fil_af_params_le *af_params;
5144 	bool ack;
5145 	s32 chan_nr;
5146 	u32 freq;
5147 
5148 	brcmf_dbg(TRACE, "Enter\n");
5149 
5150 	*cookie = 0;
5151 
5152 	mgmt = (const struct ieee80211_mgmt *)buf;
5153 
5154 	if (!ieee80211_is_mgmt(mgmt->frame_control)) {
5155 		bphy_err(drvr, "Driver only allows MGMT packet type\n");
5156 		return -EPERM;
5157 	}
5158 
5159 	vif = container_of(wdev, struct brcmf_cfg80211_vif, wdev);
5160 
5161 	if (ieee80211_is_probe_resp(mgmt->frame_control)) {
5162 		/* Right now the only reason to get a probe response */
5163 		/* is for p2p listen response or for p2p GO from     */
5164 		/* wpa_supplicant. Unfortunately the probe is send   */
5165 		/* on primary ndev, while dongle wants it on the p2p */
5166 		/* vif. Since this is only reason for a probe        */
5167 		/* response to be sent, the vif is taken from cfg.   */
5168 		/* If ever desired to send proberesp for non p2p     */
5169 		/* response then data should be checked for          */
5170 		/* "DIRECT-". Note in future supplicant will take    */
5171 		/* dedicated p2p wdev to do this and then this 'hack'*/
5172 		/* is not needed anymore.                            */
5173 		ie_offset =  DOT11_MGMT_HDR_LEN +
5174 			     DOT11_BCN_PRB_FIXED_LEN;
5175 		ie_len = len - ie_offset;
5176 		if (vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif)
5177 			vif = cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif;
5178 		err = brcmf_vif_set_mgmt_ie(vif,
5179 					    BRCMF_VNDR_IE_PRBRSP_FLAG,
5180 					    &buf[ie_offset],
5181 					    ie_len);
5182 		cfg80211_mgmt_tx_status(wdev, *cookie, buf, len, true,
5183 					GFP_KERNEL);
5184 	} else if (ieee80211_is_action(mgmt->frame_control)) {
5185 		if (len > BRCMF_FIL_ACTION_FRAME_SIZE + DOT11_MGMT_HDR_LEN) {
5186 			bphy_err(drvr, "invalid action frame length\n");
5187 			err = -EINVAL;
5188 			goto exit;
5189 		}
5190 		af_params = kzalloc(sizeof(*af_params), GFP_KERNEL);
5191 		if (af_params == NULL) {
5192 			bphy_err(drvr, "unable to allocate frame\n");
5193 			err = -ENOMEM;
5194 			goto exit;
5195 		}
5196 		action_frame = &af_params->action_frame;
5197 		/* Add the packet Id */
5198 		action_frame->packet_id = cpu_to_le32(*cookie);
5199 		/* Add BSSID */
5200 		memcpy(&action_frame->da[0], &mgmt->da[0], ETH_ALEN);
5201 		memcpy(&af_params->bssid[0], &mgmt->bssid[0], ETH_ALEN);
5202 		/* Add the length exepted for 802.11 header  */
5203 		action_frame->len = cpu_to_le16(len - DOT11_MGMT_HDR_LEN);
5204 		/* Add the channel. Use the one specified as parameter if any or
5205 		 * the current one (got from the firmware) otherwise
5206 		 */
5207 		if (chan)
5208 			freq = chan->center_freq;
5209 		else
5210 			brcmf_fil_cmd_int_get(vif->ifp, BRCMF_C_GET_CHANNEL,
5211 					      &freq);
5212 		chan_nr = ieee80211_frequency_to_channel(freq);
5213 		af_params->channel = cpu_to_le32(chan_nr);
5214 		af_params->dwell_time = cpu_to_le32(params->wait);
5215 		memcpy(action_frame->data, &buf[DOT11_MGMT_HDR_LEN],
5216 		       le16_to_cpu(action_frame->len));
5217 
5218 		brcmf_dbg(TRACE, "Action frame, cookie=%lld, len=%d, freq=%d\n",
5219 			  *cookie, le16_to_cpu(action_frame->len), freq);
5220 
5221 		ack = brcmf_p2p_send_action_frame(cfg, cfg_to_ndev(cfg),
5222 						  af_params);
5223 
5224 		cfg80211_mgmt_tx_status(wdev, *cookie, buf, len, ack,
5225 					GFP_KERNEL);
5226 		kfree(af_params);
5227 	} else {
5228 		brcmf_dbg(TRACE, "Unhandled, fc=%04x!!\n", mgmt->frame_control);
5229 		brcmf_dbg_hex_dump(true, buf, len, "payload, len=%zu\n", len);
5230 	}
5231 
5232 exit:
5233 	return err;
5234 }
5235 
5236 static int brcmf_cfg80211_set_cqm_rssi_range_config(struct wiphy *wiphy,
5237 						    struct net_device *ndev,
5238 						    s32 rssi_low, s32 rssi_high)
5239 {
5240 	struct brcmf_cfg80211_vif *vif;
5241 	struct brcmf_if *ifp;
5242 	int err = 0;
5243 
5244 	brcmf_dbg(TRACE, "low=%d high=%d", rssi_low, rssi_high);
5245 
5246 	ifp = netdev_priv(ndev);
5247 	vif = ifp->vif;
5248 
5249 	if (rssi_low != vif->cqm_rssi_low || rssi_high != vif->cqm_rssi_high) {
5250 		/* The firmware will send an event when the RSSI is less than or
5251 		 * equal to a configured level and the previous RSSI event was
5252 		 * less than or equal to a different level. Set a third level
5253 		 * so that we also detect the transition from rssi <= rssi_high
5254 		 * to rssi > rssi_high.
5255 		 */
5256 		struct brcmf_rssi_event_le config = {
5257 			.rate_limit_msec = cpu_to_le32(0),
5258 			.rssi_level_num = 3,
5259 			.rssi_levels = {
5260 				clamp_val(rssi_low, S8_MIN, S8_MAX - 2),
5261 				clamp_val(rssi_high, S8_MIN + 1, S8_MAX - 1),
5262 				S8_MAX,
5263 			},
5264 		};
5265 
5266 		err = brcmf_fil_iovar_data_set(ifp, "rssi_event", &config,
5267 					       sizeof(config));
5268 		if (err) {
5269 			err = -EINVAL;
5270 		} else {
5271 			vif->cqm_rssi_low = rssi_low;
5272 			vif->cqm_rssi_high = rssi_high;
5273 		}
5274 	}
5275 
5276 	return err;
5277 }
5278 
5279 static int
5280 brcmf_cfg80211_cancel_remain_on_channel(struct wiphy *wiphy,
5281 					struct wireless_dev *wdev,
5282 					u64 cookie)
5283 {
5284 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
5285 	struct brcmf_pub *drvr = cfg->pub;
5286 	struct brcmf_cfg80211_vif *vif;
5287 	int err = 0;
5288 
5289 	brcmf_dbg(TRACE, "Enter p2p listen cancel\n");
5290 
5291 	vif = cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif;
5292 	if (vif == NULL) {
5293 		bphy_err(drvr, "No p2p device available for probe response\n");
5294 		err = -ENODEV;
5295 		goto exit;
5296 	}
5297 	brcmf_p2p_cancel_remain_on_channel(vif->ifp);
5298 exit:
5299 	return err;
5300 }
5301 
5302 static int brcmf_cfg80211_get_channel(struct wiphy *wiphy,
5303 				      struct wireless_dev *wdev,
5304 				      struct cfg80211_chan_def *chandef)
5305 {
5306 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
5307 	struct net_device *ndev = wdev->netdev;
5308 	struct brcmf_pub *drvr = cfg->pub;
5309 	struct brcmu_chan ch;
5310 	enum nl80211_band band = 0;
5311 	enum nl80211_chan_width width = 0;
5312 	u32 chanspec;
5313 	int freq, err;
5314 
5315 	if (!ndev || drvr->bus_if->state != BRCMF_BUS_UP)
5316 		return -ENODEV;
5317 
5318 	err = brcmf_fil_iovar_int_get(netdev_priv(ndev), "chanspec", &chanspec);
5319 	if (err) {
5320 		bphy_err(drvr, "chanspec failed (%d)\n", err);
5321 		return err;
5322 	}
5323 
5324 	ch.chspec = chanspec;
5325 	cfg->d11inf.decchspec(&ch);
5326 
5327 	switch (ch.band) {
5328 	case BRCMU_CHAN_BAND_2G:
5329 		band = NL80211_BAND_2GHZ;
5330 		break;
5331 	case BRCMU_CHAN_BAND_5G:
5332 		band = NL80211_BAND_5GHZ;
5333 		break;
5334 	}
5335 
5336 	switch (ch.bw) {
5337 	case BRCMU_CHAN_BW_80:
5338 		width = NL80211_CHAN_WIDTH_80;
5339 		break;
5340 	case BRCMU_CHAN_BW_40:
5341 		width = NL80211_CHAN_WIDTH_40;
5342 		break;
5343 	case BRCMU_CHAN_BW_20:
5344 		width = NL80211_CHAN_WIDTH_20;
5345 		break;
5346 	case BRCMU_CHAN_BW_80P80:
5347 		width = NL80211_CHAN_WIDTH_80P80;
5348 		break;
5349 	case BRCMU_CHAN_BW_160:
5350 		width = NL80211_CHAN_WIDTH_160;
5351 		break;
5352 	}
5353 
5354 	freq = ieee80211_channel_to_frequency(ch.control_ch_num, band);
5355 	chandef->chan = ieee80211_get_channel(wiphy, freq);
5356 	chandef->width = width;
5357 	chandef->center_freq1 = ieee80211_channel_to_frequency(ch.chnum, band);
5358 	chandef->center_freq2 = 0;
5359 
5360 	return 0;
5361 }
5362 
5363 static int brcmf_cfg80211_crit_proto_start(struct wiphy *wiphy,
5364 					   struct wireless_dev *wdev,
5365 					   enum nl80211_crit_proto_id proto,
5366 					   u16 duration)
5367 {
5368 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
5369 	struct brcmf_cfg80211_vif *vif;
5370 
5371 	vif = container_of(wdev, struct brcmf_cfg80211_vif, wdev);
5372 
5373 	/* only DHCP support for now */
5374 	if (proto != NL80211_CRIT_PROTO_DHCP)
5375 		return -EINVAL;
5376 
5377 	/* suppress and abort scanning */
5378 	set_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status);
5379 	brcmf_abort_scanning(cfg);
5380 
5381 	return brcmf_btcoex_set_mode(vif, BRCMF_BTCOEX_DISABLED, duration);
5382 }
5383 
5384 static void brcmf_cfg80211_crit_proto_stop(struct wiphy *wiphy,
5385 					   struct wireless_dev *wdev)
5386 {
5387 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
5388 	struct brcmf_cfg80211_vif *vif;
5389 
5390 	vif = container_of(wdev, struct brcmf_cfg80211_vif, wdev);
5391 
5392 	brcmf_btcoex_set_mode(vif, BRCMF_BTCOEX_ENABLED, 0);
5393 	clear_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status);
5394 }
5395 
5396 static s32
5397 brcmf_notify_tdls_peer_event(struct brcmf_if *ifp,
5398 			     const struct brcmf_event_msg *e, void *data)
5399 {
5400 	switch (e->reason) {
5401 	case BRCMF_E_REASON_TDLS_PEER_DISCOVERED:
5402 		brcmf_dbg(TRACE, "TDLS Peer Discovered\n");
5403 		break;
5404 	case BRCMF_E_REASON_TDLS_PEER_CONNECTED:
5405 		brcmf_dbg(TRACE, "TDLS Peer Connected\n");
5406 		brcmf_proto_add_tdls_peer(ifp->drvr, ifp->ifidx, (u8 *)e->addr);
5407 		break;
5408 	case BRCMF_E_REASON_TDLS_PEER_DISCONNECTED:
5409 		brcmf_dbg(TRACE, "TDLS Peer Disconnected\n");
5410 		brcmf_proto_delete_peer(ifp->drvr, ifp->ifidx, (u8 *)e->addr);
5411 		break;
5412 	}
5413 
5414 	return 0;
5415 }
5416 
5417 static int brcmf_convert_nl80211_tdls_oper(enum nl80211_tdls_operation oper)
5418 {
5419 	int ret;
5420 
5421 	switch (oper) {
5422 	case NL80211_TDLS_DISCOVERY_REQ:
5423 		ret = BRCMF_TDLS_MANUAL_EP_DISCOVERY;
5424 		break;
5425 	case NL80211_TDLS_SETUP:
5426 		ret = BRCMF_TDLS_MANUAL_EP_CREATE;
5427 		break;
5428 	case NL80211_TDLS_TEARDOWN:
5429 		ret = BRCMF_TDLS_MANUAL_EP_DELETE;
5430 		break;
5431 	default:
5432 		brcmf_err("unsupported operation: %d\n", oper);
5433 		ret = -EOPNOTSUPP;
5434 	}
5435 	return ret;
5436 }
5437 
5438 static int brcmf_cfg80211_tdls_oper(struct wiphy *wiphy,
5439 				    struct net_device *ndev, const u8 *peer,
5440 				    enum nl80211_tdls_operation oper)
5441 {
5442 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
5443 	struct brcmf_pub *drvr = cfg->pub;
5444 	struct brcmf_if *ifp;
5445 	struct brcmf_tdls_iovar_le info;
5446 	int ret = 0;
5447 
5448 	ret = brcmf_convert_nl80211_tdls_oper(oper);
5449 	if (ret < 0)
5450 		return ret;
5451 
5452 	ifp = netdev_priv(ndev);
5453 	memset(&info, 0, sizeof(info));
5454 	info.mode = (u8)ret;
5455 	if (peer)
5456 		memcpy(info.ea, peer, ETH_ALEN);
5457 
5458 	ret = brcmf_fil_iovar_data_set(ifp, "tdls_endpoint",
5459 				       &info, sizeof(info));
5460 	if (ret < 0)
5461 		bphy_err(drvr, "tdls_endpoint iovar failed: ret=%d\n", ret);
5462 
5463 	return ret;
5464 }
5465 
5466 static int
5467 brcmf_cfg80211_update_conn_params(struct wiphy *wiphy,
5468 				  struct net_device *ndev,
5469 				  struct cfg80211_connect_params *sme,
5470 				  u32 changed)
5471 {
5472 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
5473 	struct brcmf_pub *drvr = cfg->pub;
5474 	struct brcmf_if *ifp;
5475 	int err;
5476 
5477 	if (!(changed & UPDATE_ASSOC_IES))
5478 		return 0;
5479 
5480 	ifp = netdev_priv(ndev);
5481 	err = brcmf_vif_set_mgmt_ie(ifp->vif, BRCMF_VNDR_IE_ASSOCREQ_FLAG,
5482 				    sme->ie, sme->ie_len);
5483 	if (err)
5484 		bphy_err(drvr, "Set Assoc REQ IE Failed\n");
5485 	else
5486 		brcmf_dbg(TRACE, "Applied Vndr IEs for Assoc request\n");
5487 
5488 	return err;
5489 }
5490 
5491 #ifdef CONFIG_PM
5492 static int
5493 brcmf_cfg80211_set_rekey_data(struct wiphy *wiphy, struct net_device *ndev,
5494 			      struct cfg80211_gtk_rekey_data *gtk)
5495 {
5496 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
5497 	struct brcmf_pub *drvr = cfg->pub;
5498 	struct brcmf_if *ifp = netdev_priv(ndev);
5499 	struct brcmf_gtk_keyinfo_le gtk_le;
5500 	int ret;
5501 
5502 	brcmf_dbg(TRACE, "Enter, bssidx=%d\n", ifp->bsscfgidx);
5503 
5504 	memcpy(gtk_le.kck, gtk->kck, sizeof(gtk_le.kck));
5505 	memcpy(gtk_le.kek, gtk->kek, sizeof(gtk_le.kek));
5506 	memcpy(gtk_le.replay_counter, gtk->replay_ctr,
5507 	       sizeof(gtk_le.replay_counter));
5508 
5509 	ret = brcmf_fil_iovar_data_set(ifp, "gtk_key_info", &gtk_le,
5510 				       sizeof(gtk_le));
5511 	if (ret < 0)
5512 		bphy_err(drvr, "gtk_key_info iovar failed: ret=%d\n", ret);
5513 
5514 	return ret;
5515 }
5516 #endif
5517 
5518 static int brcmf_cfg80211_set_pmk(struct wiphy *wiphy, struct net_device *dev,
5519 				  const struct cfg80211_pmk_conf *conf)
5520 {
5521 	struct brcmf_if *ifp;
5522 
5523 	brcmf_dbg(TRACE, "enter\n");
5524 
5525 	/* expect using firmware supplicant for 1X */
5526 	ifp = netdev_priv(dev);
5527 	if (WARN_ON(ifp->vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_1X))
5528 		return -EINVAL;
5529 
5530 	if (conf->pmk_len > BRCMF_WSEC_MAX_PSK_LEN)
5531 		return -ERANGE;
5532 
5533 	return brcmf_set_pmk(ifp, conf->pmk, conf->pmk_len);
5534 }
5535 
5536 static int brcmf_cfg80211_del_pmk(struct wiphy *wiphy, struct net_device *dev,
5537 				  const u8 *aa)
5538 {
5539 	struct brcmf_if *ifp;
5540 
5541 	brcmf_dbg(TRACE, "enter\n");
5542 	ifp = netdev_priv(dev);
5543 	if (WARN_ON(ifp->vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_1X))
5544 		return -EINVAL;
5545 
5546 	return brcmf_set_pmk(ifp, NULL, 0);
5547 }
5548 
5549 static struct cfg80211_ops brcmf_cfg80211_ops = {
5550 	.add_virtual_intf = brcmf_cfg80211_add_iface,
5551 	.del_virtual_intf = brcmf_cfg80211_del_iface,
5552 	.change_virtual_intf = brcmf_cfg80211_change_iface,
5553 	.scan = brcmf_cfg80211_scan,
5554 	.set_wiphy_params = brcmf_cfg80211_set_wiphy_params,
5555 	.join_ibss = brcmf_cfg80211_join_ibss,
5556 	.leave_ibss = brcmf_cfg80211_leave_ibss,
5557 	.get_station = brcmf_cfg80211_get_station,
5558 	.dump_station = brcmf_cfg80211_dump_station,
5559 	.set_tx_power = brcmf_cfg80211_set_tx_power,
5560 	.get_tx_power = brcmf_cfg80211_get_tx_power,
5561 	.add_key = brcmf_cfg80211_add_key,
5562 	.del_key = brcmf_cfg80211_del_key,
5563 	.get_key = brcmf_cfg80211_get_key,
5564 	.set_default_key = brcmf_cfg80211_config_default_key,
5565 	.set_default_mgmt_key = brcmf_cfg80211_config_default_mgmt_key,
5566 	.set_power_mgmt = brcmf_cfg80211_set_power_mgmt,
5567 	.connect = brcmf_cfg80211_connect,
5568 	.disconnect = brcmf_cfg80211_disconnect,
5569 	.suspend = brcmf_cfg80211_suspend,
5570 	.resume = brcmf_cfg80211_resume,
5571 	.set_pmksa = brcmf_cfg80211_set_pmksa,
5572 	.del_pmksa = brcmf_cfg80211_del_pmksa,
5573 	.flush_pmksa = brcmf_cfg80211_flush_pmksa,
5574 	.start_ap = brcmf_cfg80211_start_ap,
5575 	.stop_ap = brcmf_cfg80211_stop_ap,
5576 	.change_beacon = brcmf_cfg80211_change_beacon,
5577 	.del_station = brcmf_cfg80211_del_station,
5578 	.change_station = brcmf_cfg80211_change_station,
5579 	.sched_scan_start = brcmf_cfg80211_sched_scan_start,
5580 	.sched_scan_stop = brcmf_cfg80211_sched_scan_stop,
5581 	.update_mgmt_frame_registrations =
5582 		brcmf_cfg80211_update_mgmt_frame_registrations,
5583 	.mgmt_tx = brcmf_cfg80211_mgmt_tx,
5584 	.set_cqm_rssi_range_config = brcmf_cfg80211_set_cqm_rssi_range_config,
5585 	.remain_on_channel = brcmf_p2p_remain_on_channel,
5586 	.cancel_remain_on_channel = brcmf_cfg80211_cancel_remain_on_channel,
5587 	.get_channel = brcmf_cfg80211_get_channel,
5588 	.start_p2p_device = brcmf_p2p_start_device,
5589 	.stop_p2p_device = brcmf_p2p_stop_device,
5590 	.crit_proto_start = brcmf_cfg80211_crit_proto_start,
5591 	.crit_proto_stop = brcmf_cfg80211_crit_proto_stop,
5592 	.tdls_oper = brcmf_cfg80211_tdls_oper,
5593 	.update_connect_params = brcmf_cfg80211_update_conn_params,
5594 	.set_pmk = brcmf_cfg80211_set_pmk,
5595 	.del_pmk = brcmf_cfg80211_del_pmk,
5596 };
5597 
5598 struct cfg80211_ops *brcmf_cfg80211_get_ops(struct brcmf_mp_device *settings)
5599 {
5600 	struct cfg80211_ops *ops;
5601 
5602 	ops = kmemdup(&brcmf_cfg80211_ops, sizeof(brcmf_cfg80211_ops),
5603 		       GFP_KERNEL);
5604 
5605 	if (ops && settings->roamoff)
5606 		ops->update_connect_params = NULL;
5607 
5608 	return ops;
5609 }
5610 
5611 struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg,
5612 					   enum nl80211_iftype type)
5613 {
5614 	struct brcmf_cfg80211_vif *vif_walk;
5615 	struct brcmf_cfg80211_vif *vif;
5616 	bool mbss;
5617 	struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0);
5618 
5619 	brcmf_dbg(TRACE, "allocating virtual interface (size=%zu)\n",
5620 		  sizeof(*vif));
5621 	vif = kzalloc(sizeof(*vif), GFP_KERNEL);
5622 	if (!vif)
5623 		return ERR_PTR(-ENOMEM);
5624 
5625 	vif->wdev.wiphy = cfg->wiphy;
5626 	vif->wdev.iftype = type;
5627 
5628 	brcmf_init_prof(&vif->profile);
5629 
5630 	if (type == NL80211_IFTYPE_AP &&
5631 	    brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS)) {
5632 		mbss = false;
5633 		list_for_each_entry(vif_walk, &cfg->vif_list, list) {
5634 			if (vif_walk->wdev.iftype == NL80211_IFTYPE_AP) {
5635 				mbss = true;
5636 				break;
5637 			}
5638 		}
5639 		vif->mbss = mbss;
5640 	}
5641 
5642 	list_add_tail(&vif->list, &cfg->vif_list);
5643 	return vif;
5644 }
5645 
5646 void brcmf_free_vif(struct brcmf_cfg80211_vif *vif)
5647 {
5648 	list_del(&vif->list);
5649 	kfree(vif);
5650 }
5651 
5652 void brcmf_cfg80211_free_netdev(struct net_device *ndev)
5653 {
5654 	struct brcmf_cfg80211_vif *vif;
5655 	struct brcmf_if *ifp;
5656 
5657 	ifp = netdev_priv(ndev);
5658 	vif = ifp->vif;
5659 
5660 	if (vif)
5661 		brcmf_free_vif(vif);
5662 }
5663 
5664 static bool brcmf_is_linkup(struct brcmf_cfg80211_vif *vif,
5665 			    const struct brcmf_event_msg *e)
5666 {
5667 	u32 event = e->event_code;
5668 	u32 status = e->status;
5669 
5670 	if ((vif->profile.use_fwsup == BRCMF_PROFILE_FWSUP_PSK ||
5671 	     vif->profile.use_fwsup == BRCMF_PROFILE_FWSUP_SAE) &&
5672 	    event == BRCMF_E_PSK_SUP &&
5673 	    status == BRCMF_E_STATUS_FWSUP_COMPLETED)
5674 		set_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &vif->sme_state);
5675 	if (event == BRCMF_E_SET_SSID && status == BRCMF_E_STATUS_SUCCESS) {
5676 		brcmf_dbg(CONN, "Processing set ssid\n");
5677 		memcpy(vif->profile.bssid, e->addr, ETH_ALEN);
5678 		if (vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_PSK &&
5679 		    vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_SAE)
5680 			return true;
5681 
5682 		set_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS, &vif->sme_state);
5683 	}
5684 
5685 	if (test_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &vif->sme_state) &&
5686 	    test_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS, &vif->sme_state)) {
5687 		clear_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &vif->sme_state);
5688 		clear_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS, &vif->sme_state);
5689 		return true;
5690 	}
5691 	return false;
5692 }
5693 
5694 static bool brcmf_is_linkdown(struct brcmf_cfg80211_vif *vif,
5695 			    const struct brcmf_event_msg *e)
5696 {
5697 	u32 event = e->event_code;
5698 	u16 flags = e->flags;
5699 
5700 	if ((event == BRCMF_E_DEAUTH) || (event == BRCMF_E_DEAUTH_IND) ||
5701 	    (event == BRCMF_E_DISASSOC_IND) ||
5702 	    ((event == BRCMF_E_LINK) && (!(flags & BRCMF_EVENT_MSG_LINK)))) {
5703 		brcmf_dbg(CONN, "Processing link down\n");
5704 		clear_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &vif->sme_state);
5705 		clear_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS, &vif->sme_state);
5706 		return true;
5707 	}
5708 	return false;
5709 }
5710 
5711 static bool brcmf_is_nonetwork(struct brcmf_cfg80211_info *cfg,
5712 			       const struct brcmf_event_msg *e)
5713 {
5714 	u32 event = e->event_code;
5715 	u32 status = e->status;
5716 
5717 	if (event == BRCMF_E_LINK && status == BRCMF_E_STATUS_NO_NETWORKS) {
5718 		brcmf_dbg(CONN, "Processing Link %s & no network found\n",
5719 			  e->flags & BRCMF_EVENT_MSG_LINK ? "up" : "down");
5720 		return true;
5721 	}
5722 
5723 	if (event == BRCMF_E_SET_SSID && status != BRCMF_E_STATUS_SUCCESS) {
5724 		brcmf_dbg(CONN, "Processing connecting & no network found\n");
5725 		return true;
5726 	}
5727 
5728 	if (event == BRCMF_E_PSK_SUP &&
5729 	    status != BRCMF_E_STATUS_FWSUP_COMPLETED) {
5730 		brcmf_dbg(CONN, "Processing failed supplicant state: %u\n",
5731 			  status);
5732 		return true;
5733 	}
5734 
5735 	return false;
5736 }
5737 
5738 static void brcmf_clear_assoc_ies(struct brcmf_cfg80211_info *cfg)
5739 {
5740 	struct brcmf_cfg80211_connect_info *conn_info = cfg_to_conn(cfg);
5741 
5742 	kfree(conn_info->req_ie);
5743 	conn_info->req_ie = NULL;
5744 	conn_info->req_ie_len = 0;
5745 	kfree(conn_info->resp_ie);
5746 	conn_info->resp_ie = NULL;
5747 	conn_info->resp_ie_len = 0;
5748 }
5749 
5750 u8 brcmf_map_prio_to_prec(void *config, u8 prio)
5751 {
5752 	struct brcmf_cfg80211_info *cfg = (struct brcmf_cfg80211_info *)config;
5753 
5754 	if (!cfg)
5755 		return (prio == PRIO_8021D_NONE || prio == PRIO_8021D_BE) ?
5756 		       (prio ^ 2) : prio;
5757 
5758 	/* For those AC(s) with ACM flag set to 1, convert its 4-level priority
5759 	 * to an 8-level precedence which is the same as BE's
5760 	 */
5761 	if (prio > PRIO_8021D_EE &&
5762 	    cfg->ac_priority[prio] == cfg->ac_priority[PRIO_8021D_BE])
5763 		return cfg->ac_priority[prio] * 2;
5764 
5765 	/* Conversion of 4-level priority to 8-level precedence */
5766 	if (prio == PRIO_8021D_BE || prio == PRIO_8021D_BK ||
5767 	    prio == PRIO_8021D_CL || prio == PRIO_8021D_VO)
5768 		return cfg->ac_priority[prio] * 2;
5769 	else
5770 		return cfg->ac_priority[prio] * 2 + 1;
5771 }
5772 
5773 u8 brcmf_map_prio_to_aci(void *config, u8 prio)
5774 {
5775 	/* Prio here refers to the 802.1d priority in range of 0 to 7.
5776 	 * ACI here refers to the WLAN AC Index in range of 0 to 3.
5777 	 * This function will return ACI corresponding to input prio.
5778 	 */
5779 	struct brcmf_cfg80211_info *cfg = (struct brcmf_cfg80211_info *)config;
5780 
5781 	if (cfg)
5782 		return cfg->ac_priority[prio];
5783 
5784 	return prio;
5785 }
5786 
5787 static void brcmf_init_wmm_prio(u8 *priority)
5788 {
5789 	/* Initialize AC priority array to default
5790 	 * 802.1d priority as per following table:
5791 	 * 802.1d prio 0,3 maps to BE
5792 	 * 802.1d prio 1,2 maps to BK
5793 	 * 802.1d prio 4,5 maps to VI
5794 	 * 802.1d prio 6,7 maps to VO
5795 	 */
5796 	priority[0] = BRCMF_FWS_FIFO_AC_BE;
5797 	priority[3] = BRCMF_FWS_FIFO_AC_BE;
5798 	priority[1] = BRCMF_FWS_FIFO_AC_BK;
5799 	priority[2] = BRCMF_FWS_FIFO_AC_BK;
5800 	priority[4] = BRCMF_FWS_FIFO_AC_VI;
5801 	priority[5] = BRCMF_FWS_FIFO_AC_VI;
5802 	priority[6] = BRCMF_FWS_FIFO_AC_VO;
5803 	priority[7] = BRCMF_FWS_FIFO_AC_VO;
5804 }
5805 
5806 static void brcmf_wifi_prioritize_acparams(const
5807 	struct brcmf_cfg80211_edcf_acparam *acp, u8 *priority)
5808 {
5809 	u8 aci;
5810 	u8 aifsn;
5811 	u8 ecwmin;
5812 	u8 ecwmax;
5813 	u8 acm;
5814 	u8 ranking_basis[EDCF_AC_COUNT];
5815 	u8 aci_prio[EDCF_AC_COUNT]; /* AC_BE, AC_BK, AC_VI, AC_VO */
5816 	u8 index;
5817 
5818 	for (aci = 0; aci < EDCF_AC_COUNT; aci++, acp++) {
5819 		aifsn  = acp->ACI & EDCF_AIFSN_MASK;
5820 		acm = (acp->ACI & EDCF_ACM_MASK) ? 1 : 0;
5821 		ecwmin = acp->ECW & EDCF_ECWMIN_MASK;
5822 		ecwmax = (acp->ECW & EDCF_ECWMAX_MASK) >> EDCF_ECWMAX_SHIFT;
5823 		brcmf_dbg(CONN, "ACI %d aifsn %d acm %d ecwmin %d ecwmax %d\n",
5824 			  aci, aifsn, acm, ecwmin, ecwmax);
5825 		/* Default AC_VO will be the lowest ranking value */
5826 		ranking_basis[aci] = aifsn + ecwmin + ecwmax;
5827 		/* Initialise priority starting at 0 (AC_BE) */
5828 		aci_prio[aci] = 0;
5829 
5830 		/* If ACM is set, STA can't use this AC as per 802.11.
5831 		 * Change the ranking to BE
5832 		 */
5833 		if (aci != AC_BE && aci != AC_BK && acm == 1)
5834 			ranking_basis[aci] = ranking_basis[AC_BE];
5835 	}
5836 
5837 	/* Ranking method which works for AC priority
5838 	 * swapping when values for cwmin, cwmax and aifsn are varied
5839 	 * Compare each aci_prio against each other aci_prio
5840 	 */
5841 	for (aci = 0; aci < EDCF_AC_COUNT; aci++) {
5842 		for (index = 0; index < EDCF_AC_COUNT; index++) {
5843 			if (index != aci) {
5844 				/* Smaller ranking value has higher priority,
5845 				 * so increment priority for each ACI which has
5846 				 * a higher ranking value
5847 				 */
5848 				if (ranking_basis[aci] < ranking_basis[index])
5849 					aci_prio[aci]++;
5850 			}
5851 		}
5852 	}
5853 
5854 	/* By now, aci_prio[] will be in range of 0 to 3.
5855 	 * Use ACI prio to get the new priority value for
5856 	 * each 802.1d traffic type, in this range.
5857 	 */
5858 	if (!(aci_prio[AC_BE] == aci_prio[AC_BK] &&
5859 	      aci_prio[AC_BK] == aci_prio[AC_VI] &&
5860 	      aci_prio[AC_VI] == aci_prio[AC_VO])) {
5861 		/* 802.1d 0,3 maps to BE */
5862 		priority[0] = aci_prio[AC_BE];
5863 		priority[3] = aci_prio[AC_BE];
5864 
5865 		/* 802.1d 1,2 maps to BK */
5866 		priority[1] = aci_prio[AC_BK];
5867 		priority[2] = aci_prio[AC_BK];
5868 
5869 		/* 802.1d 4,5 maps to VO */
5870 		priority[4] = aci_prio[AC_VI];
5871 		priority[5] = aci_prio[AC_VI];
5872 
5873 		/* 802.1d 6,7 maps to VO */
5874 		priority[6] = aci_prio[AC_VO];
5875 		priority[7] = aci_prio[AC_VO];
5876 	} else {
5877 		/* Initialize to default priority */
5878 		brcmf_init_wmm_prio(priority);
5879 	}
5880 
5881 	brcmf_dbg(CONN, "Adj prio BE 0->%d, BK 1->%d, BK 2->%d, BE 3->%d\n",
5882 		  priority[0], priority[1], priority[2], priority[3]);
5883 
5884 	brcmf_dbg(CONN, "Adj prio VI 4->%d, VI 5->%d, VO 6->%d, VO 7->%d\n",
5885 		  priority[4], priority[5], priority[6], priority[7]);
5886 }
5887 
5888 static s32 brcmf_get_assoc_ies(struct brcmf_cfg80211_info *cfg,
5889 			       struct brcmf_if *ifp)
5890 {
5891 	struct brcmf_pub *drvr = cfg->pub;
5892 	struct brcmf_cfg80211_assoc_ielen_le *assoc_info;
5893 	struct brcmf_cfg80211_connect_info *conn_info = cfg_to_conn(cfg);
5894 	struct brcmf_cfg80211_edcf_acparam edcf_acparam_info[EDCF_AC_COUNT];
5895 	u32 req_len;
5896 	u32 resp_len;
5897 	s32 err = 0;
5898 
5899 	brcmf_clear_assoc_ies(cfg);
5900 
5901 	err = brcmf_fil_iovar_data_get(ifp, "assoc_info",
5902 				       cfg->extra_buf, WL_ASSOC_INFO_MAX);
5903 	if (err) {
5904 		bphy_err(drvr, "could not get assoc info (%d)\n", err);
5905 		return err;
5906 	}
5907 	assoc_info =
5908 		(struct brcmf_cfg80211_assoc_ielen_le *)cfg->extra_buf;
5909 	req_len = le32_to_cpu(assoc_info->req_len);
5910 	resp_len = le32_to_cpu(assoc_info->resp_len);
5911 	if (req_len) {
5912 		err = brcmf_fil_iovar_data_get(ifp, "assoc_req_ies",
5913 					       cfg->extra_buf,
5914 					       WL_ASSOC_INFO_MAX);
5915 		if (err) {
5916 			bphy_err(drvr, "could not get assoc req (%d)\n", err);
5917 			return err;
5918 		}
5919 		conn_info->req_ie_len = req_len;
5920 		conn_info->req_ie =
5921 		    kmemdup(cfg->extra_buf, conn_info->req_ie_len,
5922 			    GFP_KERNEL);
5923 		if (!conn_info->req_ie)
5924 			conn_info->req_ie_len = 0;
5925 	} else {
5926 		conn_info->req_ie_len = 0;
5927 		conn_info->req_ie = NULL;
5928 	}
5929 	if (resp_len) {
5930 		err = brcmf_fil_iovar_data_get(ifp, "assoc_resp_ies",
5931 					       cfg->extra_buf,
5932 					       WL_ASSOC_INFO_MAX);
5933 		if (err) {
5934 			bphy_err(drvr, "could not get assoc resp (%d)\n", err);
5935 			return err;
5936 		}
5937 		conn_info->resp_ie_len = resp_len;
5938 		conn_info->resp_ie =
5939 		    kmemdup(cfg->extra_buf, conn_info->resp_ie_len,
5940 			    GFP_KERNEL);
5941 		if (!conn_info->resp_ie)
5942 			conn_info->resp_ie_len = 0;
5943 
5944 		err = brcmf_fil_iovar_data_get(ifp, "wme_ac_sta",
5945 					       edcf_acparam_info,
5946 					       sizeof(edcf_acparam_info));
5947 		if (err) {
5948 			brcmf_err("could not get wme_ac_sta (%d)\n", err);
5949 			return err;
5950 		}
5951 
5952 		brcmf_wifi_prioritize_acparams(edcf_acparam_info,
5953 					       cfg->ac_priority);
5954 	} else {
5955 		conn_info->resp_ie_len = 0;
5956 		conn_info->resp_ie = NULL;
5957 	}
5958 	brcmf_dbg(CONN, "req len (%d) resp len (%d)\n",
5959 		  conn_info->req_ie_len, conn_info->resp_ie_len);
5960 
5961 	return err;
5962 }
5963 
5964 static s32
5965 brcmf_bss_roaming_done(struct brcmf_cfg80211_info *cfg,
5966 		       struct net_device *ndev,
5967 		       const struct brcmf_event_msg *e)
5968 {
5969 	struct brcmf_if *ifp = netdev_priv(ndev);
5970 	struct brcmf_cfg80211_profile *profile = &ifp->vif->profile;
5971 	struct brcmf_cfg80211_connect_info *conn_info = cfg_to_conn(cfg);
5972 	struct wiphy *wiphy = cfg_to_wiphy(cfg);
5973 	struct ieee80211_channel *notify_channel = NULL;
5974 	struct ieee80211_supported_band *band;
5975 	struct brcmf_bss_info_le *bi;
5976 	struct brcmu_chan ch;
5977 	struct cfg80211_roam_info roam_info = {};
5978 	u32 freq;
5979 	s32 err = 0;
5980 	u8 *buf;
5981 
5982 	brcmf_dbg(TRACE, "Enter\n");
5983 
5984 	brcmf_get_assoc_ies(cfg, ifp);
5985 	memcpy(profile->bssid, e->addr, ETH_ALEN);
5986 	brcmf_update_bss_info(cfg, ifp);
5987 
5988 	buf = kzalloc(WL_BSS_INFO_MAX, GFP_KERNEL);
5989 	if (buf == NULL) {
5990 		err = -ENOMEM;
5991 		goto done;
5992 	}
5993 
5994 	/* data sent to dongle has to be little endian */
5995 	*(__le32 *)buf = cpu_to_le32(WL_BSS_INFO_MAX);
5996 	err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_BSS_INFO,
5997 				     buf, WL_BSS_INFO_MAX);
5998 
5999 	if (err)
6000 		goto done;
6001 
6002 	bi = (struct brcmf_bss_info_le *)(buf + 4);
6003 	ch.chspec = le16_to_cpu(bi->chanspec);
6004 	cfg->d11inf.decchspec(&ch);
6005 
6006 	if (ch.band == BRCMU_CHAN_BAND_2G)
6007 		band = wiphy->bands[NL80211_BAND_2GHZ];
6008 	else
6009 		band = wiphy->bands[NL80211_BAND_5GHZ];
6010 
6011 	freq = ieee80211_channel_to_frequency(ch.control_ch_num, band->band);
6012 	notify_channel = ieee80211_get_channel(wiphy, freq);
6013 
6014 done:
6015 	kfree(buf);
6016 
6017 	roam_info.channel = notify_channel;
6018 	roam_info.bssid = profile->bssid;
6019 	roam_info.req_ie = conn_info->req_ie;
6020 	roam_info.req_ie_len = conn_info->req_ie_len;
6021 	roam_info.resp_ie = conn_info->resp_ie;
6022 	roam_info.resp_ie_len = conn_info->resp_ie_len;
6023 
6024 	cfg80211_roamed(ndev, &roam_info, GFP_KERNEL);
6025 	brcmf_dbg(CONN, "Report roaming result\n");
6026 
6027 	if (profile->use_fwsup == BRCMF_PROFILE_FWSUP_1X && profile->is_ft) {
6028 		cfg80211_port_authorized(ndev, profile->bssid, GFP_KERNEL);
6029 		brcmf_dbg(CONN, "Report port authorized\n");
6030 	}
6031 
6032 	set_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state);
6033 	brcmf_dbg(TRACE, "Exit\n");
6034 	return err;
6035 }
6036 
6037 static s32
6038 brcmf_bss_connect_done(struct brcmf_cfg80211_info *cfg,
6039 		       struct net_device *ndev, const struct brcmf_event_msg *e,
6040 		       bool completed)
6041 {
6042 	struct brcmf_if *ifp = netdev_priv(ndev);
6043 	struct brcmf_cfg80211_profile *profile = &ifp->vif->profile;
6044 	struct brcmf_cfg80211_connect_info *conn_info = cfg_to_conn(cfg);
6045 	struct cfg80211_connect_resp_params conn_params;
6046 
6047 	brcmf_dbg(TRACE, "Enter\n");
6048 
6049 	if (test_and_clear_bit(BRCMF_VIF_STATUS_CONNECTING,
6050 			       &ifp->vif->sme_state)) {
6051 		memset(&conn_params, 0, sizeof(conn_params));
6052 		if (completed) {
6053 			brcmf_get_assoc_ies(cfg, ifp);
6054 			brcmf_update_bss_info(cfg, ifp);
6055 			set_bit(BRCMF_VIF_STATUS_CONNECTED,
6056 				&ifp->vif->sme_state);
6057 			conn_params.status = WLAN_STATUS_SUCCESS;
6058 		} else {
6059 			conn_params.status = WLAN_STATUS_AUTH_TIMEOUT;
6060 		}
6061 		conn_params.bssid = profile->bssid;
6062 		conn_params.req_ie = conn_info->req_ie;
6063 		conn_params.req_ie_len = conn_info->req_ie_len;
6064 		conn_params.resp_ie = conn_info->resp_ie;
6065 		conn_params.resp_ie_len = conn_info->resp_ie_len;
6066 		cfg80211_connect_done(ndev, &conn_params, GFP_KERNEL);
6067 		brcmf_dbg(CONN, "Report connect result - connection %s\n",
6068 			  completed ? "succeeded" : "failed");
6069 	}
6070 	brcmf_dbg(TRACE, "Exit\n");
6071 	return 0;
6072 }
6073 
6074 static s32
6075 brcmf_notify_connect_status_ap(struct brcmf_cfg80211_info *cfg,
6076 			       struct net_device *ndev,
6077 			       const struct brcmf_event_msg *e, void *data)
6078 {
6079 	struct brcmf_pub *drvr = cfg->pub;
6080 	static int generation;
6081 	u32 event = e->event_code;
6082 	u32 reason = e->reason;
6083 	struct station_info *sinfo;
6084 
6085 	brcmf_dbg(CONN, "event %s (%u), reason %d\n",
6086 		  brcmf_fweh_event_name(event), event, reason);
6087 	if (event == BRCMF_E_LINK && reason == BRCMF_E_REASON_LINK_BSSCFG_DIS &&
6088 	    ndev != cfg_to_ndev(cfg)) {
6089 		brcmf_dbg(CONN, "AP mode link down\n");
6090 		complete(&cfg->vif_disabled);
6091 		return 0;
6092 	}
6093 
6094 	if (((event == BRCMF_E_ASSOC_IND) || (event == BRCMF_E_REASSOC_IND)) &&
6095 	    (reason == BRCMF_E_STATUS_SUCCESS)) {
6096 		if (!data) {
6097 			bphy_err(drvr, "No IEs present in ASSOC/REASSOC_IND\n");
6098 			return -EINVAL;
6099 		}
6100 
6101 		sinfo = kzalloc(sizeof(*sinfo), GFP_KERNEL);
6102 		if (!sinfo)
6103 			return -ENOMEM;
6104 
6105 		sinfo->assoc_req_ies = data;
6106 		sinfo->assoc_req_ies_len = e->datalen;
6107 		generation++;
6108 		sinfo->generation = generation;
6109 		cfg80211_new_sta(ndev, e->addr, sinfo, GFP_KERNEL);
6110 
6111 		kfree(sinfo);
6112 	} else if ((event == BRCMF_E_DISASSOC_IND) ||
6113 		   (event == BRCMF_E_DEAUTH_IND) ||
6114 		   (event == BRCMF_E_DEAUTH)) {
6115 		cfg80211_del_sta(ndev, e->addr, GFP_KERNEL);
6116 	}
6117 	return 0;
6118 }
6119 
6120 static s32
6121 brcmf_notify_connect_status(struct brcmf_if *ifp,
6122 			    const struct brcmf_event_msg *e, void *data)
6123 {
6124 	struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
6125 	struct net_device *ndev = ifp->ndev;
6126 	struct brcmf_cfg80211_profile *profile = &ifp->vif->profile;
6127 	struct ieee80211_channel *chan;
6128 	s32 err = 0;
6129 
6130 	if ((e->event_code == BRCMF_E_DEAUTH) ||
6131 	    (e->event_code == BRCMF_E_DEAUTH_IND) ||
6132 	    (e->event_code == BRCMF_E_DISASSOC_IND) ||
6133 	    ((e->event_code == BRCMF_E_LINK) && (!e->flags))) {
6134 		brcmf_proto_delete_peer(ifp->drvr, ifp->ifidx, (u8 *)e->addr);
6135 	}
6136 
6137 	if (brcmf_is_apmode(ifp->vif)) {
6138 		err = brcmf_notify_connect_status_ap(cfg, ndev, e, data);
6139 	} else if (brcmf_is_linkup(ifp->vif, e)) {
6140 		brcmf_dbg(CONN, "Linkup\n");
6141 		if (brcmf_is_ibssmode(ifp->vif)) {
6142 			brcmf_inform_ibss(cfg, ndev, e->addr);
6143 			chan = ieee80211_get_channel(cfg->wiphy, cfg->channel);
6144 			memcpy(profile->bssid, e->addr, ETH_ALEN);
6145 			cfg80211_ibss_joined(ndev, e->addr, chan, GFP_KERNEL);
6146 			clear_bit(BRCMF_VIF_STATUS_CONNECTING,
6147 				  &ifp->vif->sme_state);
6148 			set_bit(BRCMF_VIF_STATUS_CONNECTED,
6149 				&ifp->vif->sme_state);
6150 		} else
6151 			brcmf_bss_connect_done(cfg, ndev, e, true);
6152 		brcmf_net_setcarrier(ifp, true);
6153 	} else if (brcmf_is_linkdown(ifp->vif, e)) {
6154 		brcmf_dbg(CONN, "Linkdown\n");
6155 		if (!brcmf_is_ibssmode(ifp->vif) &&
6156 		    test_bit(BRCMF_VIF_STATUS_CONNECTED,
6157 			     &ifp->vif->sme_state)) {
6158 			if (memcmp(profile->bssid, e->addr, ETH_ALEN))
6159 				return err;
6160 
6161 			brcmf_bss_connect_done(cfg, ndev, e, false);
6162 			brcmf_link_down(ifp->vif,
6163 					brcmf_map_fw_linkdown_reason(e),
6164 					e->event_code &
6165 					(BRCMF_E_DEAUTH_IND |
6166 					BRCMF_E_DISASSOC_IND)
6167 					? false : true);
6168 			brcmf_init_prof(ndev_to_prof(ndev));
6169 			if (ndev != cfg_to_ndev(cfg))
6170 				complete(&cfg->vif_disabled);
6171 			brcmf_net_setcarrier(ifp, false);
6172 		}
6173 	} else if (brcmf_is_nonetwork(cfg, e)) {
6174 		if (brcmf_is_ibssmode(ifp->vif))
6175 			clear_bit(BRCMF_VIF_STATUS_CONNECTING,
6176 				  &ifp->vif->sme_state);
6177 		else
6178 			brcmf_bss_connect_done(cfg, ndev, e, false);
6179 	}
6180 
6181 	return err;
6182 }
6183 
6184 static s32
6185 brcmf_notify_roaming_status(struct brcmf_if *ifp,
6186 			    const struct brcmf_event_msg *e, void *data)
6187 {
6188 	struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
6189 	u32 event = e->event_code;
6190 	u32 status = e->status;
6191 
6192 	if (event == BRCMF_E_ROAM && status == BRCMF_E_STATUS_SUCCESS) {
6193 		if (test_bit(BRCMF_VIF_STATUS_CONNECTED,
6194 			     &ifp->vif->sme_state)) {
6195 			brcmf_bss_roaming_done(cfg, ifp->ndev, e);
6196 		} else {
6197 			brcmf_bss_connect_done(cfg, ifp->ndev, e, true);
6198 			brcmf_net_setcarrier(ifp, true);
6199 		}
6200 	}
6201 
6202 	return 0;
6203 }
6204 
6205 static s32
6206 brcmf_notify_mic_status(struct brcmf_if *ifp,
6207 			const struct brcmf_event_msg *e, void *data)
6208 {
6209 	u16 flags = e->flags;
6210 	enum nl80211_key_type key_type;
6211 
6212 	if (flags & BRCMF_EVENT_MSG_GROUP)
6213 		key_type = NL80211_KEYTYPE_GROUP;
6214 	else
6215 		key_type = NL80211_KEYTYPE_PAIRWISE;
6216 
6217 	cfg80211_michael_mic_failure(ifp->ndev, (u8 *)&e->addr, key_type, -1,
6218 				     NULL, GFP_KERNEL);
6219 
6220 	return 0;
6221 }
6222 
6223 static s32 brcmf_notify_rssi(struct brcmf_if *ifp,
6224 			     const struct brcmf_event_msg *e, void *data)
6225 {
6226 	struct brcmf_cfg80211_vif *vif = ifp->vif;
6227 	struct brcmf_rssi_be *info = data;
6228 	s32 rssi, snr, noise;
6229 	s32 low, high, last;
6230 
6231 	if (e->datalen < sizeof(*info)) {
6232 		brcmf_err("insufficient RSSI event data\n");
6233 		return 0;
6234 	}
6235 
6236 	rssi = be32_to_cpu(info->rssi);
6237 	snr = be32_to_cpu(info->snr);
6238 	noise = be32_to_cpu(info->noise);
6239 
6240 	low = vif->cqm_rssi_low;
6241 	high = vif->cqm_rssi_high;
6242 	last = vif->cqm_rssi_last;
6243 
6244 	brcmf_dbg(TRACE, "rssi=%d snr=%d noise=%d low=%d high=%d last=%d\n",
6245 		  rssi, snr, noise, low, high, last);
6246 
6247 	vif->cqm_rssi_last = rssi;
6248 
6249 	if (rssi <= low || rssi == 0) {
6250 		brcmf_dbg(INFO, "LOW rssi=%d\n", rssi);
6251 		cfg80211_cqm_rssi_notify(ifp->ndev,
6252 					 NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
6253 					 rssi, GFP_KERNEL);
6254 	} else if (rssi > high) {
6255 		brcmf_dbg(INFO, "HIGH rssi=%d\n", rssi);
6256 		cfg80211_cqm_rssi_notify(ifp->ndev,
6257 					 NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
6258 					 rssi, GFP_KERNEL);
6259 	}
6260 
6261 	return 0;
6262 }
6263 
6264 static s32 brcmf_notify_vif_event(struct brcmf_if *ifp,
6265 				  const struct brcmf_event_msg *e, void *data)
6266 {
6267 	struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
6268 	struct brcmf_if_event *ifevent = (struct brcmf_if_event *)data;
6269 	struct brcmf_cfg80211_vif_event *event = &cfg->vif_event;
6270 	struct brcmf_cfg80211_vif *vif;
6271 
6272 	brcmf_dbg(TRACE, "Enter: action %u flags %u ifidx %u bsscfgidx %u\n",
6273 		  ifevent->action, ifevent->flags, ifevent->ifidx,
6274 		  ifevent->bsscfgidx);
6275 
6276 	spin_lock(&event->vif_event_lock);
6277 	event->action = ifevent->action;
6278 	vif = event->vif;
6279 
6280 	switch (ifevent->action) {
6281 	case BRCMF_E_IF_ADD:
6282 		/* waiting process may have timed out */
6283 		if (!cfg->vif_event.vif) {
6284 			spin_unlock(&event->vif_event_lock);
6285 			return -EBADF;
6286 		}
6287 
6288 		ifp->vif = vif;
6289 		vif->ifp = ifp;
6290 		if (ifp->ndev) {
6291 			vif->wdev.netdev = ifp->ndev;
6292 			ifp->ndev->ieee80211_ptr = &vif->wdev;
6293 			SET_NETDEV_DEV(ifp->ndev, wiphy_dev(cfg->wiphy));
6294 		}
6295 		spin_unlock(&event->vif_event_lock);
6296 		wake_up(&event->vif_wq);
6297 		return 0;
6298 
6299 	case BRCMF_E_IF_DEL:
6300 		spin_unlock(&event->vif_event_lock);
6301 		/* event may not be upon user request */
6302 		if (brcmf_cfg80211_vif_event_armed(cfg))
6303 			wake_up(&event->vif_wq);
6304 		return 0;
6305 
6306 	case BRCMF_E_IF_CHANGE:
6307 		spin_unlock(&event->vif_event_lock);
6308 		wake_up(&event->vif_wq);
6309 		return 0;
6310 
6311 	default:
6312 		spin_unlock(&event->vif_event_lock);
6313 		break;
6314 	}
6315 	return -EINVAL;
6316 }
6317 
6318 static void brcmf_init_conf(struct brcmf_cfg80211_conf *conf)
6319 {
6320 	conf->frag_threshold = (u32)-1;
6321 	conf->rts_threshold = (u32)-1;
6322 	conf->retry_short = (u32)-1;
6323 	conf->retry_long = (u32)-1;
6324 }
6325 
6326 static void brcmf_register_event_handlers(struct brcmf_cfg80211_info *cfg)
6327 {
6328 	brcmf_fweh_register(cfg->pub, BRCMF_E_LINK,
6329 			    brcmf_notify_connect_status);
6330 	brcmf_fweh_register(cfg->pub, BRCMF_E_DEAUTH_IND,
6331 			    brcmf_notify_connect_status);
6332 	brcmf_fweh_register(cfg->pub, BRCMF_E_DEAUTH,
6333 			    brcmf_notify_connect_status);
6334 	brcmf_fweh_register(cfg->pub, BRCMF_E_DISASSOC_IND,
6335 			    brcmf_notify_connect_status);
6336 	brcmf_fweh_register(cfg->pub, BRCMF_E_ASSOC_IND,
6337 			    brcmf_notify_connect_status);
6338 	brcmf_fweh_register(cfg->pub, BRCMF_E_REASSOC_IND,
6339 			    brcmf_notify_connect_status);
6340 	brcmf_fweh_register(cfg->pub, BRCMF_E_ROAM,
6341 			    brcmf_notify_roaming_status);
6342 	brcmf_fweh_register(cfg->pub, BRCMF_E_MIC_ERROR,
6343 			    brcmf_notify_mic_status);
6344 	brcmf_fweh_register(cfg->pub, BRCMF_E_SET_SSID,
6345 			    brcmf_notify_connect_status);
6346 	brcmf_fweh_register(cfg->pub, BRCMF_E_PFN_NET_FOUND,
6347 			    brcmf_notify_sched_scan_results);
6348 	brcmf_fweh_register(cfg->pub, BRCMF_E_IF,
6349 			    brcmf_notify_vif_event);
6350 	brcmf_fweh_register(cfg->pub, BRCMF_E_P2P_PROBEREQ_MSG,
6351 			    brcmf_p2p_notify_rx_mgmt_p2p_probereq);
6352 	brcmf_fweh_register(cfg->pub, BRCMF_E_P2P_DISC_LISTEN_COMPLETE,
6353 			    brcmf_p2p_notify_listen_complete);
6354 	brcmf_fweh_register(cfg->pub, BRCMF_E_ACTION_FRAME_RX,
6355 			    brcmf_p2p_notify_action_frame_rx);
6356 	brcmf_fweh_register(cfg->pub, BRCMF_E_ACTION_FRAME_COMPLETE,
6357 			    brcmf_p2p_notify_action_tx_complete);
6358 	brcmf_fweh_register(cfg->pub, BRCMF_E_ACTION_FRAME_OFF_CHAN_COMPLETE,
6359 			    brcmf_p2p_notify_action_tx_complete);
6360 	brcmf_fweh_register(cfg->pub, BRCMF_E_PSK_SUP,
6361 			    brcmf_notify_connect_status);
6362 	brcmf_fweh_register(cfg->pub, BRCMF_E_RSSI, brcmf_notify_rssi);
6363 }
6364 
6365 static void brcmf_deinit_priv_mem(struct brcmf_cfg80211_info *cfg)
6366 {
6367 	kfree(cfg->conf);
6368 	cfg->conf = NULL;
6369 	kfree(cfg->extra_buf);
6370 	cfg->extra_buf = NULL;
6371 	kfree(cfg->wowl.nd);
6372 	cfg->wowl.nd = NULL;
6373 	kfree(cfg->wowl.nd_info);
6374 	cfg->wowl.nd_info = NULL;
6375 	kfree(cfg->escan_info.escan_buf);
6376 	cfg->escan_info.escan_buf = NULL;
6377 }
6378 
6379 static s32 brcmf_init_priv_mem(struct brcmf_cfg80211_info *cfg)
6380 {
6381 	cfg->conf = kzalloc(sizeof(*cfg->conf), GFP_KERNEL);
6382 	if (!cfg->conf)
6383 		goto init_priv_mem_out;
6384 	cfg->extra_buf = kzalloc(WL_EXTRA_BUF_MAX, GFP_KERNEL);
6385 	if (!cfg->extra_buf)
6386 		goto init_priv_mem_out;
6387 	cfg->wowl.nd = kzalloc(sizeof(*cfg->wowl.nd) + sizeof(u32), GFP_KERNEL);
6388 	if (!cfg->wowl.nd)
6389 		goto init_priv_mem_out;
6390 	cfg->wowl.nd_info = kzalloc(sizeof(*cfg->wowl.nd_info) +
6391 				    sizeof(struct cfg80211_wowlan_nd_match *),
6392 				    GFP_KERNEL);
6393 	if (!cfg->wowl.nd_info)
6394 		goto init_priv_mem_out;
6395 	cfg->escan_info.escan_buf = kzalloc(BRCMF_ESCAN_BUF_SIZE, GFP_KERNEL);
6396 	if (!cfg->escan_info.escan_buf)
6397 		goto init_priv_mem_out;
6398 
6399 	return 0;
6400 
6401 init_priv_mem_out:
6402 	brcmf_deinit_priv_mem(cfg);
6403 
6404 	return -ENOMEM;
6405 }
6406 
6407 static s32 wl_init_priv(struct brcmf_cfg80211_info *cfg)
6408 {
6409 	s32 err = 0;
6410 
6411 	cfg->scan_request = NULL;
6412 	cfg->pwr_save = true;
6413 	cfg->dongle_up = false;		/* dongle is not up yet */
6414 	err = brcmf_init_priv_mem(cfg);
6415 	if (err)
6416 		return err;
6417 	brcmf_register_event_handlers(cfg);
6418 	mutex_init(&cfg->usr_sync);
6419 	brcmf_init_escan(cfg);
6420 	brcmf_init_conf(cfg->conf);
6421 	brcmf_init_wmm_prio(cfg->ac_priority);
6422 	init_completion(&cfg->vif_disabled);
6423 	return err;
6424 }
6425 
6426 static void wl_deinit_priv(struct brcmf_cfg80211_info *cfg)
6427 {
6428 	cfg->dongle_up = false;	/* dongle down */
6429 	brcmf_abort_scanning(cfg);
6430 	brcmf_deinit_priv_mem(cfg);
6431 }
6432 
6433 static void init_vif_event(struct brcmf_cfg80211_vif_event *event)
6434 {
6435 	init_waitqueue_head(&event->vif_wq);
6436 	spin_lock_init(&event->vif_event_lock);
6437 }
6438 
6439 static s32 brcmf_dongle_roam(struct brcmf_if *ifp)
6440 {
6441 	struct brcmf_pub *drvr = ifp->drvr;
6442 	s32 err;
6443 	u32 bcn_timeout;
6444 	__le32 roamtrigger[2];
6445 	__le32 roam_delta[2];
6446 
6447 	/* Configure beacon timeout value based upon roaming setting */
6448 	if (ifp->drvr->settings->roamoff)
6449 		bcn_timeout = BRCMF_DEFAULT_BCN_TIMEOUT_ROAM_OFF;
6450 	else
6451 		bcn_timeout = BRCMF_DEFAULT_BCN_TIMEOUT_ROAM_ON;
6452 	err = brcmf_fil_iovar_int_set(ifp, "bcn_timeout", bcn_timeout);
6453 	if (err) {
6454 		bphy_err(drvr, "bcn_timeout error (%d)\n", err);
6455 		goto roam_setup_done;
6456 	}
6457 
6458 	/* Enable/Disable built-in roaming to allow supplicant to take care of
6459 	 * roaming.
6460 	 */
6461 	brcmf_dbg(INFO, "Internal Roaming = %s\n",
6462 		  ifp->drvr->settings->roamoff ? "Off" : "On");
6463 	err = brcmf_fil_iovar_int_set(ifp, "roam_off",
6464 				      ifp->drvr->settings->roamoff);
6465 	if (err) {
6466 		bphy_err(drvr, "roam_off error (%d)\n", err);
6467 		goto roam_setup_done;
6468 	}
6469 
6470 	roamtrigger[0] = cpu_to_le32(WL_ROAM_TRIGGER_LEVEL);
6471 	roamtrigger[1] = cpu_to_le32(BRCM_BAND_ALL);
6472 	err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_ROAM_TRIGGER,
6473 				     (void *)roamtrigger, sizeof(roamtrigger));
6474 	if (err)
6475 		bphy_err(drvr, "WLC_SET_ROAM_TRIGGER error (%d)\n", err);
6476 
6477 	roam_delta[0] = cpu_to_le32(WL_ROAM_DELTA);
6478 	roam_delta[1] = cpu_to_le32(BRCM_BAND_ALL);
6479 	err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_ROAM_DELTA,
6480 				     (void *)roam_delta, sizeof(roam_delta));
6481 	if (err)
6482 		bphy_err(drvr, "WLC_SET_ROAM_DELTA error (%d)\n", err);
6483 
6484 	return 0;
6485 
6486 roam_setup_done:
6487 	return err;
6488 }
6489 
6490 static s32
6491 brcmf_dongle_scantime(struct brcmf_if *ifp)
6492 {
6493 	struct brcmf_pub *drvr = ifp->drvr;
6494 	s32 err = 0;
6495 
6496 	err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_SCAN_CHANNEL_TIME,
6497 				    BRCMF_SCAN_CHANNEL_TIME);
6498 	if (err) {
6499 		bphy_err(drvr, "Scan assoc time error (%d)\n", err);
6500 		goto dongle_scantime_out;
6501 	}
6502 	err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_SCAN_UNASSOC_TIME,
6503 				    BRCMF_SCAN_UNASSOC_TIME);
6504 	if (err) {
6505 		bphy_err(drvr, "Scan unassoc time error (%d)\n", err);
6506 		goto dongle_scantime_out;
6507 	}
6508 
6509 	err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_SCAN_PASSIVE_TIME,
6510 				    BRCMF_SCAN_PASSIVE_TIME);
6511 	if (err) {
6512 		bphy_err(drvr, "Scan passive time error (%d)\n", err);
6513 		goto dongle_scantime_out;
6514 	}
6515 
6516 dongle_scantime_out:
6517 	return err;
6518 }
6519 
6520 static void brcmf_update_bw40_channel_flag(struct ieee80211_channel *channel,
6521 					   struct brcmu_chan *ch)
6522 {
6523 	u32 ht40_flag;
6524 
6525 	ht40_flag = channel->flags & IEEE80211_CHAN_NO_HT40;
6526 	if (ch->sb == BRCMU_CHAN_SB_U) {
6527 		if (ht40_flag == IEEE80211_CHAN_NO_HT40)
6528 			channel->flags &= ~IEEE80211_CHAN_NO_HT40;
6529 		channel->flags |= IEEE80211_CHAN_NO_HT40PLUS;
6530 	} else {
6531 		/* It should be one of
6532 		 * IEEE80211_CHAN_NO_HT40 or
6533 		 * IEEE80211_CHAN_NO_HT40PLUS
6534 		 */
6535 		channel->flags &= ~IEEE80211_CHAN_NO_HT40;
6536 		if (ht40_flag == IEEE80211_CHAN_NO_HT40)
6537 			channel->flags |= IEEE80211_CHAN_NO_HT40MINUS;
6538 	}
6539 }
6540 
6541 static int brcmf_construct_chaninfo(struct brcmf_cfg80211_info *cfg,
6542 				    u32 bw_cap[])
6543 {
6544 	struct wiphy *wiphy = cfg_to_wiphy(cfg);
6545 	struct brcmf_pub *drvr = cfg->pub;
6546 	struct brcmf_if *ifp = brcmf_get_ifp(drvr, 0);
6547 	struct ieee80211_supported_band *band;
6548 	struct ieee80211_channel *channel;
6549 	struct brcmf_chanspec_list *list;
6550 	struct brcmu_chan ch;
6551 	int err;
6552 	u8 *pbuf;
6553 	u32 i, j;
6554 	u32 total;
6555 	u32 chaninfo;
6556 
6557 	pbuf = kzalloc(BRCMF_DCMD_MEDLEN, GFP_KERNEL);
6558 
6559 	if (pbuf == NULL)
6560 		return -ENOMEM;
6561 
6562 	list = (struct brcmf_chanspec_list *)pbuf;
6563 
6564 	err = brcmf_fil_iovar_data_get(ifp, "chanspecs", pbuf,
6565 				       BRCMF_DCMD_MEDLEN);
6566 	if (err) {
6567 		bphy_err(drvr, "get chanspecs error (%d)\n", err);
6568 		goto fail_pbuf;
6569 	}
6570 
6571 	band = wiphy->bands[NL80211_BAND_2GHZ];
6572 	if (band)
6573 		for (i = 0; i < band->n_channels; i++)
6574 			band->channels[i].flags = IEEE80211_CHAN_DISABLED;
6575 	band = wiphy->bands[NL80211_BAND_5GHZ];
6576 	if (band)
6577 		for (i = 0; i < band->n_channels; i++)
6578 			band->channels[i].flags = IEEE80211_CHAN_DISABLED;
6579 
6580 	total = le32_to_cpu(list->count);
6581 	for (i = 0; i < total; i++) {
6582 		ch.chspec = (u16)le32_to_cpu(list->element[i]);
6583 		cfg->d11inf.decchspec(&ch);
6584 
6585 		if (ch.band == BRCMU_CHAN_BAND_2G) {
6586 			band = wiphy->bands[NL80211_BAND_2GHZ];
6587 		} else if (ch.band == BRCMU_CHAN_BAND_5G) {
6588 			band = wiphy->bands[NL80211_BAND_5GHZ];
6589 		} else {
6590 			bphy_err(drvr, "Invalid channel Spec. 0x%x.\n",
6591 				 ch.chspec);
6592 			continue;
6593 		}
6594 		if (!band)
6595 			continue;
6596 		if (!(bw_cap[band->band] & WLC_BW_40MHZ_BIT) &&
6597 		    ch.bw == BRCMU_CHAN_BW_40)
6598 			continue;
6599 		if (!(bw_cap[band->band] & WLC_BW_80MHZ_BIT) &&
6600 		    ch.bw == BRCMU_CHAN_BW_80)
6601 			continue;
6602 
6603 		channel = NULL;
6604 		for (j = 0; j < band->n_channels; j++) {
6605 			if (band->channels[j].hw_value == ch.control_ch_num) {
6606 				channel = &band->channels[j];
6607 				break;
6608 			}
6609 		}
6610 		if (!channel) {
6611 			/* It seems firmware supports some channel we never
6612 			 * considered. Something new in IEEE standard?
6613 			 */
6614 			bphy_err(drvr, "Ignoring unexpected firmware channel %d\n",
6615 				 ch.control_ch_num);
6616 			continue;
6617 		}
6618 
6619 		if (channel->orig_flags & IEEE80211_CHAN_DISABLED)
6620 			continue;
6621 
6622 		/* assuming the chanspecs order is HT20,
6623 		 * HT40 upper, HT40 lower, and VHT80.
6624 		 */
6625 		switch (ch.bw) {
6626 		case BRCMU_CHAN_BW_160:
6627 			channel->flags &= ~IEEE80211_CHAN_NO_160MHZ;
6628 			break;
6629 		case BRCMU_CHAN_BW_80:
6630 			channel->flags &= ~IEEE80211_CHAN_NO_80MHZ;
6631 			break;
6632 		case BRCMU_CHAN_BW_40:
6633 			brcmf_update_bw40_channel_flag(channel, &ch);
6634 			break;
6635 		default:
6636 			wiphy_warn(wiphy, "Firmware reported unsupported bandwidth %d\n",
6637 				   ch.bw);
6638 			fallthrough;
6639 		case BRCMU_CHAN_BW_20:
6640 			/* enable the channel and disable other bandwidths
6641 			 * for now as mentioned order assure they are enabled
6642 			 * for subsequent chanspecs.
6643 			 */
6644 			channel->flags = IEEE80211_CHAN_NO_HT40 |
6645 					 IEEE80211_CHAN_NO_80MHZ |
6646 					 IEEE80211_CHAN_NO_160MHZ;
6647 			ch.bw = BRCMU_CHAN_BW_20;
6648 			cfg->d11inf.encchspec(&ch);
6649 			chaninfo = ch.chspec;
6650 			err = brcmf_fil_bsscfg_int_get(ifp, "per_chan_info",
6651 						       &chaninfo);
6652 			if (!err) {
6653 				if (chaninfo & WL_CHAN_RADAR)
6654 					channel->flags |=
6655 						(IEEE80211_CHAN_RADAR |
6656 						 IEEE80211_CHAN_NO_IR);
6657 				if (chaninfo & WL_CHAN_PASSIVE)
6658 					channel->flags |=
6659 						IEEE80211_CHAN_NO_IR;
6660 			}
6661 		}
6662 	}
6663 
6664 fail_pbuf:
6665 	kfree(pbuf);
6666 	return err;
6667 }
6668 
6669 static int brcmf_enable_bw40_2g(struct brcmf_cfg80211_info *cfg)
6670 {
6671 	struct brcmf_pub *drvr = cfg->pub;
6672 	struct brcmf_if *ifp = brcmf_get_ifp(drvr, 0);
6673 	struct ieee80211_supported_band *band;
6674 	struct brcmf_fil_bwcap_le band_bwcap;
6675 	struct brcmf_chanspec_list *list;
6676 	u8 *pbuf;
6677 	u32 val;
6678 	int err;
6679 	struct brcmu_chan ch;
6680 	u32 num_chan;
6681 	int i, j;
6682 
6683 	/* verify support for bw_cap command */
6684 	val = WLC_BAND_5G;
6685 	err = brcmf_fil_iovar_int_get(ifp, "bw_cap", &val);
6686 
6687 	if (!err) {
6688 		/* only set 2G bandwidth using bw_cap command */
6689 		band_bwcap.band = cpu_to_le32(WLC_BAND_2G);
6690 		band_bwcap.bw_cap = cpu_to_le32(WLC_BW_CAP_40MHZ);
6691 		err = brcmf_fil_iovar_data_set(ifp, "bw_cap", &band_bwcap,
6692 					       sizeof(band_bwcap));
6693 	} else {
6694 		brcmf_dbg(INFO, "fallback to mimo_bw_cap\n");
6695 		val = WLC_N_BW_40ALL;
6696 		err = brcmf_fil_iovar_int_set(ifp, "mimo_bw_cap", val);
6697 	}
6698 
6699 	if (!err) {
6700 		/* update channel info in 2G band */
6701 		pbuf = kzalloc(BRCMF_DCMD_MEDLEN, GFP_KERNEL);
6702 
6703 		if (pbuf == NULL)
6704 			return -ENOMEM;
6705 
6706 		ch.band = BRCMU_CHAN_BAND_2G;
6707 		ch.bw = BRCMU_CHAN_BW_40;
6708 		ch.sb = BRCMU_CHAN_SB_NONE;
6709 		ch.chnum = 0;
6710 		cfg->d11inf.encchspec(&ch);
6711 
6712 		/* pass encoded chanspec in query */
6713 		*(__le16 *)pbuf = cpu_to_le16(ch.chspec);
6714 
6715 		err = brcmf_fil_iovar_data_get(ifp, "chanspecs", pbuf,
6716 					       BRCMF_DCMD_MEDLEN);
6717 		if (err) {
6718 			bphy_err(drvr, "get chanspecs error (%d)\n", err);
6719 			kfree(pbuf);
6720 			return err;
6721 		}
6722 
6723 		band = cfg_to_wiphy(cfg)->bands[NL80211_BAND_2GHZ];
6724 		list = (struct brcmf_chanspec_list *)pbuf;
6725 		num_chan = le32_to_cpu(list->count);
6726 		for (i = 0; i < num_chan; i++) {
6727 			ch.chspec = (u16)le32_to_cpu(list->element[i]);
6728 			cfg->d11inf.decchspec(&ch);
6729 			if (WARN_ON(ch.band != BRCMU_CHAN_BAND_2G))
6730 				continue;
6731 			if (WARN_ON(ch.bw != BRCMU_CHAN_BW_40))
6732 				continue;
6733 			for (j = 0; j < band->n_channels; j++) {
6734 				if (band->channels[j].hw_value == ch.control_ch_num)
6735 					break;
6736 			}
6737 			if (WARN_ON(j == band->n_channels))
6738 				continue;
6739 
6740 			brcmf_update_bw40_channel_flag(&band->channels[j], &ch);
6741 		}
6742 		kfree(pbuf);
6743 	}
6744 	return err;
6745 }
6746 
6747 static void brcmf_get_bwcap(struct brcmf_if *ifp, u32 bw_cap[])
6748 {
6749 	struct brcmf_pub *drvr = ifp->drvr;
6750 	u32 band, mimo_bwcap;
6751 	int err;
6752 
6753 	band = WLC_BAND_2G;
6754 	err = brcmf_fil_iovar_int_get(ifp, "bw_cap", &band);
6755 	if (!err) {
6756 		bw_cap[NL80211_BAND_2GHZ] = band;
6757 		band = WLC_BAND_5G;
6758 		err = brcmf_fil_iovar_int_get(ifp, "bw_cap", &band);
6759 		if (!err) {
6760 			bw_cap[NL80211_BAND_5GHZ] = band;
6761 			return;
6762 		}
6763 		WARN_ON(1);
6764 		return;
6765 	}
6766 	brcmf_dbg(INFO, "fallback to mimo_bw_cap info\n");
6767 	mimo_bwcap = 0;
6768 	err = brcmf_fil_iovar_int_get(ifp, "mimo_bw_cap", &mimo_bwcap);
6769 	if (err)
6770 		/* assume 20MHz if firmware does not give a clue */
6771 		mimo_bwcap = WLC_N_BW_20ALL;
6772 
6773 	switch (mimo_bwcap) {
6774 	case WLC_N_BW_40ALL:
6775 		bw_cap[NL80211_BAND_2GHZ] |= WLC_BW_40MHZ_BIT;
6776 		fallthrough;
6777 	case WLC_N_BW_20IN2G_40IN5G:
6778 		bw_cap[NL80211_BAND_5GHZ] |= WLC_BW_40MHZ_BIT;
6779 		fallthrough;
6780 	case WLC_N_BW_20ALL:
6781 		bw_cap[NL80211_BAND_2GHZ] |= WLC_BW_20MHZ_BIT;
6782 		bw_cap[NL80211_BAND_5GHZ] |= WLC_BW_20MHZ_BIT;
6783 		break;
6784 	default:
6785 		bphy_err(drvr, "invalid mimo_bw_cap value\n");
6786 	}
6787 }
6788 
6789 static void brcmf_update_ht_cap(struct ieee80211_supported_band *band,
6790 				u32 bw_cap[2], u32 nchain)
6791 {
6792 	band->ht_cap.ht_supported = true;
6793 	if (bw_cap[band->band] & WLC_BW_40MHZ_BIT) {
6794 		band->ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
6795 		band->ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
6796 	}
6797 	band->ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
6798 	band->ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
6799 	band->ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
6800 	band->ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_16;
6801 	memset(band->ht_cap.mcs.rx_mask, 0xff, nchain);
6802 	band->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
6803 }
6804 
6805 static __le16 brcmf_get_mcs_map(u32 nchain, enum ieee80211_vht_mcs_support supp)
6806 {
6807 	u16 mcs_map;
6808 	int i;
6809 
6810 	for (i = 0, mcs_map = 0xFFFF; i < nchain; i++)
6811 		mcs_map = (mcs_map << 2) | supp;
6812 
6813 	return cpu_to_le16(mcs_map);
6814 }
6815 
6816 static void brcmf_update_vht_cap(struct ieee80211_supported_band *band,
6817 				 u32 bw_cap[2], u32 nchain, u32 txstreams,
6818 				 u32 txbf_bfe_cap, u32 txbf_bfr_cap)
6819 {
6820 	__le16 mcs_map;
6821 
6822 	/* not allowed in 2.4G band */
6823 	if (band->band == NL80211_BAND_2GHZ)
6824 		return;
6825 
6826 	band->vht_cap.vht_supported = true;
6827 	/* 80MHz is mandatory */
6828 	band->vht_cap.cap |= IEEE80211_VHT_CAP_SHORT_GI_80;
6829 	if (bw_cap[band->band] & WLC_BW_160MHZ_BIT) {
6830 		band->vht_cap.cap |= IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ;
6831 		band->vht_cap.cap |= IEEE80211_VHT_CAP_SHORT_GI_160;
6832 	}
6833 	/* all support 256-QAM */
6834 	mcs_map = brcmf_get_mcs_map(nchain, IEEE80211_VHT_MCS_SUPPORT_0_9);
6835 	band->vht_cap.vht_mcs.rx_mcs_map = mcs_map;
6836 	band->vht_cap.vht_mcs.tx_mcs_map = mcs_map;
6837 
6838 	/* Beamforming support information */
6839 	if (txbf_bfe_cap & BRCMF_TXBF_SU_BFE_CAP)
6840 		band->vht_cap.cap |= IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE;
6841 	if (txbf_bfe_cap & BRCMF_TXBF_MU_BFE_CAP)
6842 		band->vht_cap.cap |= IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
6843 	if (txbf_bfr_cap & BRCMF_TXBF_SU_BFR_CAP)
6844 		band->vht_cap.cap |= IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE;
6845 	if (txbf_bfr_cap & BRCMF_TXBF_MU_BFR_CAP)
6846 		band->vht_cap.cap |= IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE;
6847 
6848 	if ((txbf_bfe_cap || txbf_bfr_cap) && (txstreams > 1)) {
6849 		band->vht_cap.cap |=
6850 			(2 << IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT);
6851 		band->vht_cap.cap |= ((txstreams - 1) <<
6852 				IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT);
6853 		band->vht_cap.cap |=
6854 			IEEE80211_VHT_CAP_VHT_LINK_ADAPTATION_VHT_MRQ_MFB;
6855 	}
6856 }
6857 
6858 static int brcmf_setup_wiphybands(struct brcmf_cfg80211_info *cfg)
6859 {
6860 	struct brcmf_pub *drvr = cfg->pub;
6861 	struct brcmf_if *ifp = brcmf_get_ifp(drvr, 0);
6862 	struct wiphy *wiphy = cfg_to_wiphy(cfg);
6863 	u32 nmode = 0;
6864 	u32 vhtmode = 0;
6865 	u32 bw_cap[2] = { WLC_BW_20MHZ_BIT, WLC_BW_20MHZ_BIT };
6866 	u32 rxchain;
6867 	u32 nchain;
6868 	int err;
6869 	s32 i;
6870 	struct ieee80211_supported_band *band;
6871 	u32 txstreams = 0;
6872 	u32 txbf_bfe_cap = 0;
6873 	u32 txbf_bfr_cap = 0;
6874 
6875 	(void)brcmf_fil_iovar_int_get(ifp, "vhtmode", &vhtmode);
6876 	err = brcmf_fil_iovar_int_get(ifp, "nmode", &nmode);
6877 	if (err) {
6878 		bphy_err(drvr, "nmode error (%d)\n", err);
6879 	} else {
6880 		brcmf_get_bwcap(ifp, bw_cap);
6881 	}
6882 	brcmf_dbg(INFO, "nmode=%d, vhtmode=%d, bw_cap=(%d, %d)\n",
6883 		  nmode, vhtmode, bw_cap[NL80211_BAND_2GHZ],
6884 		  bw_cap[NL80211_BAND_5GHZ]);
6885 
6886 	err = brcmf_fil_iovar_int_get(ifp, "rxchain", &rxchain);
6887 	if (err) {
6888 		/* rxchain unsupported by firmware of older chips */
6889 		if (err == -EBADE)
6890 			bphy_info_once(drvr, "rxchain unsupported\n");
6891 		else
6892 			bphy_err(drvr, "rxchain error (%d)\n", err);
6893 
6894 		nchain = 1;
6895 	} else {
6896 		for (nchain = 0; rxchain; nchain++)
6897 			rxchain = rxchain & (rxchain - 1);
6898 	}
6899 	brcmf_dbg(INFO, "nchain=%d\n", nchain);
6900 
6901 	err = brcmf_construct_chaninfo(cfg, bw_cap);
6902 	if (err) {
6903 		bphy_err(drvr, "brcmf_construct_chaninfo failed (%d)\n", err);
6904 		return err;
6905 	}
6906 
6907 	if (vhtmode) {
6908 		(void)brcmf_fil_iovar_int_get(ifp, "txstreams", &txstreams);
6909 		(void)brcmf_fil_iovar_int_get(ifp, "txbf_bfe_cap",
6910 					      &txbf_bfe_cap);
6911 		(void)brcmf_fil_iovar_int_get(ifp, "txbf_bfr_cap",
6912 					      &txbf_bfr_cap);
6913 	}
6914 
6915 	for (i = 0; i < ARRAY_SIZE(wiphy->bands); i++) {
6916 		band = wiphy->bands[i];
6917 		if (band == NULL)
6918 			continue;
6919 
6920 		if (nmode)
6921 			brcmf_update_ht_cap(band, bw_cap, nchain);
6922 		if (vhtmode)
6923 			brcmf_update_vht_cap(band, bw_cap, nchain, txstreams,
6924 					     txbf_bfe_cap, txbf_bfr_cap);
6925 	}
6926 
6927 	return 0;
6928 }
6929 
6930 static const struct ieee80211_txrx_stypes
6931 brcmf_txrx_stypes[NUM_NL80211_IFTYPES] = {
6932 	[NL80211_IFTYPE_STATION] = {
6933 		.tx = 0xffff,
6934 		.rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
6935 		      BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
6936 	},
6937 	[NL80211_IFTYPE_P2P_CLIENT] = {
6938 		.tx = 0xffff,
6939 		.rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
6940 		      BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
6941 	},
6942 	[NL80211_IFTYPE_P2P_GO] = {
6943 		.tx = 0xffff,
6944 		.rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) |
6945 		      BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) |
6946 		      BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
6947 		      BIT(IEEE80211_STYPE_DISASSOC >> 4) |
6948 		      BIT(IEEE80211_STYPE_AUTH >> 4) |
6949 		      BIT(IEEE80211_STYPE_DEAUTH >> 4) |
6950 		      BIT(IEEE80211_STYPE_ACTION >> 4)
6951 	},
6952 	[NL80211_IFTYPE_P2P_DEVICE] = {
6953 		.tx = 0xffff,
6954 		.rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
6955 		      BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
6956 	},
6957 	[NL80211_IFTYPE_AP] = {
6958 		.tx = 0xffff,
6959 		.rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) |
6960 		      BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) |
6961 		      BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
6962 		      BIT(IEEE80211_STYPE_DISASSOC >> 4) |
6963 		      BIT(IEEE80211_STYPE_AUTH >> 4) |
6964 		      BIT(IEEE80211_STYPE_DEAUTH >> 4) |
6965 		      BIT(IEEE80211_STYPE_ACTION >> 4)
6966 	}
6967 };
6968 
6969 /**
6970  * brcmf_setup_ifmodes() - determine interface modes and combinations.
6971  *
6972  * @wiphy: wiphy object.
6973  * @ifp: interface object needed for feat module api.
6974  *
6975  * The interface modes and combinations are determined dynamically here
6976  * based on firmware functionality.
6977  *
6978  * no p2p and no mbss:
6979  *
6980  *	#STA <= 1, #AP <= 1, channels = 1, 2 total
6981  *
6982  * no p2p and mbss:
6983  *
6984  *	#STA <= 1, #AP <= 1, channels = 1, 2 total
6985  *	#AP <= 4, matching BI, channels = 1, 4 total
6986  *
6987  * no p2p and rsdb:
6988  *	#STA <= 1, #AP <= 2, channels = 2, 4 total
6989  *
6990  * p2p, no mchan, and mbss:
6991  *
6992  *	#STA <= 1, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 1, channels = 1, 3 total
6993  *	#STA <= 1, #P2P-DEV <= 1, #AP <= 1, #P2P-CL <= 1, channels = 1, 4 total
6994  *	#AP <= 4, matching BI, channels = 1, 4 total
6995  *
6996  * p2p, mchan, and mbss:
6997  *
6998  *	#STA <= 1, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 1, channels = 2, 3 total
6999  *	#STA <= 1, #P2P-DEV <= 1, #AP <= 1, #P2P-CL <= 1, channels = 1, 4 total
7000  *	#AP <= 4, matching BI, channels = 1, 4 total
7001  *
7002  * p2p, rsdb, and no mbss:
7003  *	#STA <= 1, #P2P-DEV <= 1, #{P2P-CL, P2P-GO} <= 2, AP <= 2,
7004  *	 channels = 2, 4 total
7005  */
7006 static int brcmf_setup_ifmodes(struct wiphy *wiphy, struct brcmf_if *ifp)
7007 {
7008 	struct ieee80211_iface_combination *combo = NULL;
7009 	struct ieee80211_iface_limit *c0_limits = NULL;
7010 	struct ieee80211_iface_limit *p2p_limits = NULL;
7011 	struct ieee80211_iface_limit *mbss_limits = NULL;
7012 	bool mon_flag, mbss, p2p, rsdb, mchan;
7013 	int i, c, n_combos, n_limits;
7014 
7015 	mon_flag = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MONITOR_FLAG);
7016 	mbss = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS);
7017 	p2p = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_P2P);
7018 	rsdb = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_RSDB);
7019 	mchan = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MCHAN);
7020 
7021 	n_combos = 1 + !!(p2p && !rsdb) + !!mbss;
7022 	combo = kcalloc(n_combos, sizeof(*combo), GFP_KERNEL);
7023 	if (!combo)
7024 		goto err;
7025 
7026 	wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
7027 				 BIT(NL80211_IFTYPE_ADHOC) |
7028 				 BIT(NL80211_IFTYPE_AP);
7029 	if (mon_flag)
7030 		wiphy->interface_modes |= BIT(NL80211_IFTYPE_MONITOR);
7031 	if (p2p)
7032 		wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_CLIENT) |
7033 					  BIT(NL80211_IFTYPE_P2P_GO) |
7034 					  BIT(NL80211_IFTYPE_P2P_DEVICE);
7035 
7036 	c = 0;
7037 	i = 0;
7038 	n_limits = 1 + mon_flag + (p2p ? 2 : 0) + (rsdb || !p2p);
7039 	c0_limits = kcalloc(n_limits, sizeof(*c0_limits), GFP_KERNEL);
7040 	if (!c0_limits)
7041 		goto err;
7042 
7043 	combo[c].num_different_channels = 1 + (rsdb || (p2p && mchan));
7044 	c0_limits[i].max = 1;
7045 	c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
7046 	if (mon_flag) {
7047 		c0_limits[i].max = 1;
7048 		c0_limits[i++].types = BIT(NL80211_IFTYPE_MONITOR);
7049 	}
7050 	if (p2p) {
7051 		c0_limits[i].max = 1;
7052 		c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE);
7053 		c0_limits[i].max = 1 + rsdb;
7054 		c0_limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
7055 				       BIT(NL80211_IFTYPE_P2P_GO);
7056 	}
7057 	if (p2p && rsdb) {
7058 		c0_limits[i].max = 2;
7059 		c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
7060 		combo[c].max_interfaces = 4;
7061 	} else if (p2p) {
7062 		combo[c].max_interfaces = i;
7063 	} else if (rsdb) {
7064 		c0_limits[i].max = 2;
7065 		c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
7066 		combo[c].max_interfaces = 3;
7067 	} else {
7068 		c0_limits[i].max = 1;
7069 		c0_limits[i++].types = BIT(NL80211_IFTYPE_AP);
7070 		combo[c].max_interfaces = i;
7071 	}
7072 	combo[c].n_limits = i;
7073 	combo[c].limits = c0_limits;
7074 
7075 	if (p2p && !rsdb) {
7076 		c++;
7077 		i = 0;
7078 		p2p_limits = kcalloc(4, sizeof(*p2p_limits), GFP_KERNEL);
7079 		if (!p2p_limits)
7080 			goto err;
7081 		p2p_limits[i].max = 1;
7082 		p2p_limits[i++].types = BIT(NL80211_IFTYPE_STATION);
7083 		p2p_limits[i].max = 1;
7084 		p2p_limits[i++].types = BIT(NL80211_IFTYPE_AP);
7085 		p2p_limits[i].max = 1;
7086 		p2p_limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT);
7087 		p2p_limits[i].max = 1;
7088 		p2p_limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE);
7089 		combo[c].num_different_channels = 1;
7090 		combo[c].max_interfaces = i;
7091 		combo[c].n_limits = i;
7092 		combo[c].limits = p2p_limits;
7093 	}
7094 
7095 	if (mbss) {
7096 		c++;
7097 		i = 0;
7098 		n_limits = 1 + mon_flag;
7099 		mbss_limits = kcalloc(n_limits, sizeof(*mbss_limits),
7100 				      GFP_KERNEL);
7101 		if (!mbss_limits)
7102 			goto err;
7103 		mbss_limits[i].max = 4;
7104 		mbss_limits[i++].types = BIT(NL80211_IFTYPE_AP);
7105 		if (mon_flag) {
7106 			mbss_limits[i].max = 1;
7107 			mbss_limits[i++].types = BIT(NL80211_IFTYPE_MONITOR);
7108 		}
7109 		combo[c].beacon_int_infra_match = true;
7110 		combo[c].num_different_channels = 1;
7111 		combo[c].max_interfaces = 4 + mon_flag;
7112 		combo[c].n_limits = i;
7113 		combo[c].limits = mbss_limits;
7114 	}
7115 
7116 	wiphy->n_iface_combinations = n_combos;
7117 	wiphy->iface_combinations = combo;
7118 	return 0;
7119 
7120 err:
7121 	kfree(c0_limits);
7122 	kfree(p2p_limits);
7123 	kfree(mbss_limits);
7124 	kfree(combo);
7125 	return -ENOMEM;
7126 }
7127 
7128 #ifdef CONFIG_PM
7129 static const struct wiphy_wowlan_support brcmf_wowlan_support = {
7130 	.flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT,
7131 	.n_patterns = BRCMF_WOWL_MAXPATTERNS,
7132 	.pattern_max_len = BRCMF_WOWL_MAXPATTERNSIZE,
7133 	.pattern_min_len = 1,
7134 	.max_pkt_offset = 1500,
7135 };
7136 #endif
7137 
7138 static void brcmf_wiphy_wowl_params(struct wiphy *wiphy, struct brcmf_if *ifp)
7139 {
7140 #ifdef CONFIG_PM
7141 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
7142 	struct brcmf_pub *drvr = cfg->pub;
7143 	struct wiphy_wowlan_support *wowl;
7144 
7145 	wowl = kmemdup(&brcmf_wowlan_support, sizeof(brcmf_wowlan_support),
7146 		       GFP_KERNEL);
7147 	if (!wowl) {
7148 		bphy_err(drvr, "only support basic wowlan features\n");
7149 		wiphy->wowlan = &brcmf_wowlan_support;
7150 		return;
7151 	}
7152 
7153 	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PNO)) {
7154 		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_ND)) {
7155 			wowl->flags |= WIPHY_WOWLAN_NET_DETECT;
7156 			wowl->max_nd_match_sets = BRCMF_PNO_MAX_PFN_COUNT;
7157 			init_waitqueue_head(&cfg->wowl.nd_data_wait);
7158 		}
7159 	}
7160 	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_GTK)) {
7161 		wowl->flags |= WIPHY_WOWLAN_SUPPORTS_GTK_REKEY;
7162 		wowl->flags |= WIPHY_WOWLAN_GTK_REKEY_FAILURE;
7163 	}
7164 
7165 	wiphy->wowlan = wowl;
7166 #endif
7167 }
7168 
7169 static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp)
7170 {
7171 	struct brcmf_pub *drvr = ifp->drvr;
7172 	const struct ieee80211_iface_combination *combo;
7173 	struct ieee80211_supported_band *band;
7174 	u16 max_interfaces = 0;
7175 	bool gscan;
7176 	__le32 bandlist[3];
7177 	u32 n_bands;
7178 	int err, i;
7179 
7180 	wiphy->max_scan_ssids = WL_NUM_SCAN_MAX;
7181 	wiphy->max_scan_ie_len = BRCMF_SCAN_IE_LEN_MAX;
7182 	wiphy->max_num_pmkids = BRCMF_MAXPMKID;
7183 
7184 	err = brcmf_setup_ifmodes(wiphy, ifp);
7185 	if (err)
7186 		return err;
7187 
7188 	for (i = 0, combo = wiphy->iface_combinations;
7189 	     i < wiphy->n_iface_combinations; i++, combo++) {
7190 		max_interfaces = max(max_interfaces, combo->max_interfaces);
7191 	}
7192 
7193 	for (i = 0; i < max_interfaces && i < ARRAY_SIZE(drvr->addresses);
7194 	     i++) {
7195 		u8 *addr = drvr->addresses[i].addr;
7196 
7197 		memcpy(addr, drvr->mac, ETH_ALEN);
7198 		if (i) {
7199 			addr[0] |= BIT(1);
7200 			addr[ETH_ALEN - 1] ^= i;
7201 		}
7202 	}
7203 	wiphy->addresses = drvr->addresses;
7204 	wiphy->n_addresses = i;
7205 
7206 	wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
7207 	wiphy->cipher_suites = brcmf_cipher_suites;
7208 	wiphy->n_cipher_suites = ARRAY_SIZE(brcmf_cipher_suites);
7209 	if (!brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MFP))
7210 		wiphy->n_cipher_suites--;
7211 	wiphy->bss_select_support = BIT(NL80211_BSS_SELECT_ATTR_RSSI) |
7212 				    BIT(NL80211_BSS_SELECT_ATTR_BAND_PREF) |
7213 				    BIT(NL80211_BSS_SELECT_ATTR_RSSI_ADJUST);
7214 
7215 	wiphy->flags |= WIPHY_FLAG_NETNS_OK |
7216 			WIPHY_FLAG_PS_ON_BY_DEFAULT |
7217 			WIPHY_FLAG_HAVE_AP_SME |
7218 			WIPHY_FLAG_OFFCHAN_TX |
7219 			WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
7220 	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_TDLS))
7221 		wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;
7222 	if (!ifp->drvr->settings->roamoff)
7223 		wiphy->flags |= WIPHY_FLAG_SUPPORTS_FW_ROAM;
7224 	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_FWSUP)) {
7225 		wiphy_ext_feature_set(wiphy,
7226 				      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK);
7227 		wiphy_ext_feature_set(wiphy,
7228 				      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X);
7229 		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_SAE))
7230 			wiphy_ext_feature_set(wiphy,
7231 					      NL80211_EXT_FEATURE_SAE_OFFLOAD);
7232 	}
7233 	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_FWAUTH)) {
7234 		wiphy_ext_feature_set(wiphy,
7235 				      NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK);
7236 		if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_SAE))
7237 			wiphy_ext_feature_set(wiphy,
7238 					      NL80211_EXT_FEATURE_SAE_OFFLOAD_AP);
7239 	}
7240 	wiphy->mgmt_stypes = brcmf_txrx_stypes;
7241 	wiphy->max_remain_on_channel_duration = 5000;
7242 	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PNO)) {
7243 		gscan = brcmf_feat_is_enabled(ifp, BRCMF_FEAT_GSCAN);
7244 		brcmf_pno_wiphy_params(wiphy, gscan);
7245 	}
7246 	/* vendor commands/events support */
7247 	wiphy->vendor_commands = brcmf_vendor_cmds;
7248 	wiphy->n_vendor_commands = BRCMF_VNDR_CMDS_LAST - 1;
7249 
7250 	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL))
7251 		brcmf_wiphy_wowl_params(wiphy, ifp);
7252 	err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_BANDLIST, &bandlist,
7253 				     sizeof(bandlist));
7254 	if (err) {
7255 		bphy_err(drvr, "could not obtain band info: err=%d\n", err);
7256 		return err;
7257 	}
7258 	/* first entry in bandlist is number of bands */
7259 	n_bands = le32_to_cpu(bandlist[0]);
7260 	for (i = 1; i <= n_bands && i < ARRAY_SIZE(bandlist); i++) {
7261 		if (bandlist[i] == cpu_to_le32(WLC_BAND_2G)) {
7262 			band = kmemdup(&__wl_band_2ghz, sizeof(__wl_band_2ghz),
7263 				       GFP_KERNEL);
7264 			if (!band)
7265 				return -ENOMEM;
7266 
7267 			band->channels = kmemdup(&__wl_2ghz_channels,
7268 						 sizeof(__wl_2ghz_channels),
7269 						 GFP_KERNEL);
7270 			if (!band->channels) {
7271 				kfree(band);
7272 				return -ENOMEM;
7273 			}
7274 
7275 			band->n_channels = ARRAY_SIZE(__wl_2ghz_channels);
7276 			wiphy->bands[NL80211_BAND_2GHZ] = band;
7277 		}
7278 		if (bandlist[i] == cpu_to_le32(WLC_BAND_5G)) {
7279 			band = kmemdup(&__wl_band_5ghz, sizeof(__wl_band_5ghz),
7280 				       GFP_KERNEL);
7281 			if (!band)
7282 				return -ENOMEM;
7283 
7284 			band->channels = kmemdup(&__wl_5ghz_channels,
7285 						 sizeof(__wl_5ghz_channels),
7286 						 GFP_KERNEL);
7287 			if (!band->channels) {
7288 				kfree(band);
7289 				return -ENOMEM;
7290 			}
7291 
7292 			band->n_channels = ARRAY_SIZE(__wl_5ghz_channels);
7293 			wiphy->bands[NL80211_BAND_5GHZ] = band;
7294 		}
7295 	}
7296 
7297 	if (wiphy->bands[NL80211_BAND_5GHZ] &&
7298 	    brcmf_feat_is_enabled(ifp, BRCMF_FEAT_DOT11H))
7299 		wiphy_ext_feature_set(wiphy,
7300 				      NL80211_EXT_FEATURE_DFS_OFFLOAD);
7301 
7302 	wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
7303 
7304 	wiphy_read_of_freq_limits(wiphy);
7305 
7306 	return 0;
7307 }
7308 
7309 static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg)
7310 {
7311 	struct brcmf_pub *drvr = cfg->pub;
7312 	struct net_device *ndev;
7313 	struct wireless_dev *wdev;
7314 	struct brcmf_if *ifp;
7315 	s32 power_mode;
7316 	s32 err = 0;
7317 
7318 	if (cfg->dongle_up)
7319 		return err;
7320 
7321 	ndev = cfg_to_ndev(cfg);
7322 	wdev = ndev->ieee80211_ptr;
7323 	ifp = netdev_priv(ndev);
7324 
7325 	/* make sure RF is ready for work */
7326 	brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 0);
7327 
7328 	brcmf_dongle_scantime(ifp);
7329 
7330 	power_mode = cfg->pwr_save ? PM_FAST : PM_OFF;
7331 	err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM, power_mode);
7332 	if (err)
7333 		goto default_conf_out;
7334 	brcmf_dbg(INFO, "power save set to %s\n",
7335 		  (power_mode ? "enabled" : "disabled"));
7336 
7337 	err = brcmf_dongle_roam(ifp);
7338 	if (err)
7339 		goto default_conf_out;
7340 	err = brcmf_cfg80211_change_iface(wdev->wiphy, ndev, wdev->iftype,
7341 					  NULL);
7342 	if (err)
7343 		goto default_conf_out;
7344 
7345 	brcmf_configure_arp_nd_offload(ifp, true);
7346 
7347 	err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_FAKEFRAG, 1);
7348 	if (err) {
7349 		bphy_err(drvr, "failed to set frameburst mode\n");
7350 		goto default_conf_out;
7351 	}
7352 
7353 	cfg->dongle_up = true;
7354 default_conf_out:
7355 
7356 	return err;
7357 
7358 }
7359 
7360 static s32 __brcmf_cfg80211_up(struct brcmf_if *ifp)
7361 {
7362 	set_bit(BRCMF_VIF_STATUS_READY, &ifp->vif->sme_state);
7363 
7364 	return brcmf_config_dongle(ifp->drvr->config);
7365 }
7366 
7367 static s32 __brcmf_cfg80211_down(struct brcmf_if *ifp)
7368 {
7369 	struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
7370 
7371 	/*
7372 	 * While going down, if associated with AP disassociate
7373 	 * from AP to save power
7374 	 */
7375 	if (check_vif_up(ifp->vif)) {
7376 		brcmf_link_down(ifp->vif, WLAN_REASON_UNSPECIFIED, true);
7377 
7378 		/* Make sure WPA_Supplicant receives all the event
7379 		   generated due to DISASSOC call to the fw to keep
7380 		   the state fw and WPA_Supplicant state consistent
7381 		 */
7382 		brcmf_delay(500);
7383 	}
7384 
7385 	brcmf_abort_scanning(cfg);
7386 	clear_bit(BRCMF_VIF_STATUS_READY, &ifp->vif->sme_state);
7387 
7388 	return 0;
7389 }
7390 
7391 s32 brcmf_cfg80211_up(struct net_device *ndev)
7392 {
7393 	struct brcmf_if *ifp = netdev_priv(ndev);
7394 	struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
7395 	s32 err = 0;
7396 
7397 	mutex_lock(&cfg->usr_sync);
7398 	err = __brcmf_cfg80211_up(ifp);
7399 	mutex_unlock(&cfg->usr_sync);
7400 
7401 	return err;
7402 }
7403 
7404 s32 brcmf_cfg80211_down(struct net_device *ndev)
7405 {
7406 	struct brcmf_if *ifp = netdev_priv(ndev);
7407 	struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
7408 	s32 err = 0;
7409 
7410 	mutex_lock(&cfg->usr_sync);
7411 	err = __brcmf_cfg80211_down(ifp);
7412 	mutex_unlock(&cfg->usr_sync);
7413 
7414 	return err;
7415 }
7416 
7417 enum nl80211_iftype brcmf_cfg80211_get_iftype(struct brcmf_if *ifp)
7418 {
7419 	struct wireless_dev *wdev = &ifp->vif->wdev;
7420 
7421 	return wdev->iftype;
7422 }
7423 
7424 bool brcmf_get_vif_state_any(struct brcmf_cfg80211_info *cfg,
7425 			     unsigned long state)
7426 {
7427 	struct brcmf_cfg80211_vif *vif;
7428 
7429 	list_for_each_entry(vif, &cfg->vif_list, list) {
7430 		if (test_bit(state, &vif->sme_state))
7431 			return true;
7432 	}
7433 	return false;
7434 }
7435 
7436 static inline bool vif_event_equals(struct brcmf_cfg80211_vif_event *event,
7437 				    u8 action)
7438 {
7439 	u8 evt_action;
7440 
7441 	spin_lock(&event->vif_event_lock);
7442 	evt_action = event->action;
7443 	spin_unlock(&event->vif_event_lock);
7444 	return evt_action == action;
7445 }
7446 
7447 void brcmf_cfg80211_arm_vif_event(struct brcmf_cfg80211_info *cfg,
7448 				  struct brcmf_cfg80211_vif *vif)
7449 {
7450 	struct brcmf_cfg80211_vif_event *event = &cfg->vif_event;
7451 
7452 	spin_lock(&event->vif_event_lock);
7453 	event->vif = vif;
7454 	event->action = 0;
7455 	spin_unlock(&event->vif_event_lock);
7456 }
7457 
7458 bool brcmf_cfg80211_vif_event_armed(struct brcmf_cfg80211_info *cfg)
7459 {
7460 	struct brcmf_cfg80211_vif_event *event = &cfg->vif_event;
7461 	bool armed;
7462 
7463 	spin_lock(&event->vif_event_lock);
7464 	armed = event->vif != NULL;
7465 	spin_unlock(&event->vif_event_lock);
7466 
7467 	return armed;
7468 }
7469 
7470 int brcmf_cfg80211_wait_vif_event(struct brcmf_cfg80211_info *cfg,
7471 				  u8 action, ulong timeout)
7472 {
7473 	struct brcmf_cfg80211_vif_event *event = &cfg->vif_event;
7474 
7475 	return wait_event_timeout(event->vif_wq,
7476 				  vif_event_equals(event, action), timeout);
7477 }
7478 
7479 static s32 brcmf_translate_country_code(struct brcmf_pub *drvr, char alpha2[2],
7480 					struct brcmf_fil_country_le *ccreq)
7481 {
7482 	struct brcmfmac_pd_cc *country_codes;
7483 	struct brcmfmac_pd_cc_entry *cc;
7484 	s32 found_index;
7485 	int i;
7486 
7487 	country_codes = drvr->settings->country_codes;
7488 	if (!country_codes) {
7489 		brcmf_dbg(TRACE, "No country codes configured for device\n");
7490 		return -EINVAL;
7491 	}
7492 
7493 	if ((alpha2[0] == ccreq->country_abbrev[0]) &&
7494 	    (alpha2[1] == ccreq->country_abbrev[1])) {
7495 		brcmf_dbg(TRACE, "Country code already set\n");
7496 		return -EAGAIN;
7497 	}
7498 
7499 	found_index = -1;
7500 	for (i = 0; i < country_codes->table_size; i++) {
7501 		cc = &country_codes->table[i];
7502 		if ((cc->iso3166[0] == '\0') && (found_index == -1))
7503 			found_index = i;
7504 		if ((cc->iso3166[0] == alpha2[0]) &&
7505 		    (cc->iso3166[1] == alpha2[1])) {
7506 			found_index = i;
7507 			break;
7508 		}
7509 	}
7510 	if (found_index == -1) {
7511 		brcmf_dbg(TRACE, "No country code match found\n");
7512 		return -EINVAL;
7513 	}
7514 	memset(ccreq, 0, sizeof(*ccreq));
7515 	ccreq->rev = cpu_to_le32(country_codes->table[found_index].rev);
7516 	memcpy(ccreq->ccode, country_codes->table[found_index].cc,
7517 	       BRCMF_COUNTRY_BUF_SZ);
7518 	ccreq->country_abbrev[0] = alpha2[0];
7519 	ccreq->country_abbrev[1] = alpha2[1];
7520 	ccreq->country_abbrev[2] = 0;
7521 
7522 	return 0;
7523 }
7524 
7525 static void brcmf_cfg80211_reg_notifier(struct wiphy *wiphy,
7526 					struct regulatory_request *req)
7527 {
7528 	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
7529 	struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0);
7530 	struct brcmf_pub *drvr = cfg->pub;
7531 	struct brcmf_fil_country_le ccreq;
7532 	s32 err;
7533 	int i;
7534 
7535 	/* The country code gets set to "00" by default at boot, ignore */
7536 	if (req->alpha2[0] == '0' && req->alpha2[1] == '0')
7537 		return;
7538 
7539 	/* ignore non-ISO3166 country codes */
7540 	for (i = 0; i < 2; i++)
7541 		if (req->alpha2[i] < 'A' || req->alpha2[i] > 'Z') {
7542 			bphy_err(drvr, "not an ISO3166 code (0x%02x 0x%02x)\n",
7543 				 req->alpha2[0], req->alpha2[1]);
7544 			return;
7545 		}
7546 
7547 	brcmf_dbg(TRACE, "Enter: initiator=%d, alpha=%c%c\n", req->initiator,
7548 		  req->alpha2[0], req->alpha2[1]);
7549 
7550 	err = brcmf_fil_iovar_data_get(ifp, "country", &ccreq, sizeof(ccreq));
7551 	if (err) {
7552 		bphy_err(drvr, "Country code iovar returned err = %d\n", err);
7553 		return;
7554 	}
7555 
7556 	err = brcmf_translate_country_code(ifp->drvr, req->alpha2, &ccreq);
7557 	if (err)
7558 		return;
7559 
7560 	err = brcmf_fil_iovar_data_set(ifp, "country", &ccreq, sizeof(ccreq));
7561 	if (err) {
7562 		bphy_err(drvr, "Firmware rejected country setting\n");
7563 		return;
7564 	}
7565 	brcmf_setup_wiphybands(cfg);
7566 }
7567 
7568 static void brcmf_free_wiphy(struct wiphy *wiphy)
7569 {
7570 	int i;
7571 
7572 	if (!wiphy)
7573 		return;
7574 
7575 	if (wiphy->iface_combinations) {
7576 		for (i = 0; i < wiphy->n_iface_combinations; i++)
7577 			kfree(wiphy->iface_combinations[i].limits);
7578 	}
7579 	kfree(wiphy->iface_combinations);
7580 	if (wiphy->bands[NL80211_BAND_2GHZ]) {
7581 		kfree(wiphy->bands[NL80211_BAND_2GHZ]->channels);
7582 		kfree(wiphy->bands[NL80211_BAND_2GHZ]);
7583 	}
7584 	if (wiphy->bands[NL80211_BAND_5GHZ]) {
7585 		kfree(wiphy->bands[NL80211_BAND_5GHZ]->channels);
7586 		kfree(wiphy->bands[NL80211_BAND_5GHZ]);
7587 	}
7588 #if IS_ENABLED(CONFIG_PM)
7589 	if (wiphy->wowlan != &brcmf_wowlan_support)
7590 		kfree(wiphy->wowlan);
7591 #endif
7592 }
7593 
7594 struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr,
7595 						  struct cfg80211_ops *ops,
7596 						  bool p2pdev_forced)
7597 {
7598 	struct wiphy *wiphy = drvr->wiphy;
7599 	struct net_device *ndev = brcmf_get_ifp(drvr, 0)->ndev;
7600 	struct brcmf_cfg80211_info *cfg;
7601 	struct brcmf_cfg80211_vif *vif;
7602 	struct brcmf_if *ifp;
7603 	s32 err = 0;
7604 	s32 io_type;
7605 	u16 *cap = NULL;
7606 
7607 	if (!ndev) {
7608 		bphy_err(drvr, "ndev is invalid\n");
7609 		return NULL;
7610 	}
7611 
7612 	cfg = kzalloc(sizeof(*cfg), GFP_KERNEL);
7613 	if (!cfg) {
7614 		bphy_err(drvr, "Could not allocate wiphy device\n");
7615 		return NULL;
7616 	}
7617 
7618 	cfg->wiphy = wiphy;
7619 	cfg->pub = drvr;
7620 	init_vif_event(&cfg->vif_event);
7621 	INIT_LIST_HEAD(&cfg->vif_list);
7622 
7623 	vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_STATION);
7624 	if (IS_ERR(vif))
7625 		goto wiphy_out;
7626 
7627 	ifp = netdev_priv(ndev);
7628 	vif->ifp = ifp;
7629 	vif->wdev.netdev = ndev;
7630 	ndev->ieee80211_ptr = &vif->wdev;
7631 	SET_NETDEV_DEV(ndev, wiphy_dev(cfg->wiphy));
7632 
7633 	err = wl_init_priv(cfg);
7634 	if (err) {
7635 		bphy_err(drvr, "Failed to init iwm_priv (%d)\n", err);
7636 		brcmf_free_vif(vif);
7637 		goto wiphy_out;
7638 	}
7639 	ifp->vif = vif;
7640 
7641 	/* determine d11 io type before wiphy setup */
7642 	err = brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_VERSION, &io_type);
7643 	if (err) {
7644 		bphy_err(drvr, "Failed to get D11 version (%d)\n", err);
7645 		goto priv_out;
7646 	}
7647 	cfg->d11inf.io_type = (u8)io_type;
7648 	brcmu_d11_attach(&cfg->d11inf);
7649 
7650 	/* regulatory notifer below needs access to cfg so
7651 	 * assign it now.
7652 	 */
7653 	drvr->config = cfg;
7654 
7655 	err = brcmf_setup_wiphy(wiphy, ifp);
7656 	if (err < 0)
7657 		goto priv_out;
7658 
7659 	brcmf_dbg(INFO, "Registering custom regulatory\n");
7660 	wiphy->reg_notifier = brcmf_cfg80211_reg_notifier;
7661 	wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG;
7662 	wiphy_apply_custom_regulatory(wiphy, &brcmf_regdom);
7663 
7664 	/* firmware defaults to 40MHz disabled in 2G band. We signal
7665 	 * cfg80211 here that we do and have it decide we can enable
7666 	 * it. But first check if device does support 2G operation.
7667 	 */
7668 	if (wiphy->bands[NL80211_BAND_2GHZ]) {
7669 		cap = &wiphy->bands[NL80211_BAND_2GHZ]->ht_cap.cap;
7670 		*cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
7671 	}
7672 #ifdef CONFIG_PM
7673 	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_GTK))
7674 		ops->set_rekey_data = brcmf_cfg80211_set_rekey_data;
7675 #endif
7676 	err = wiphy_register(wiphy);
7677 	if (err < 0) {
7678 		bphy_err(drvr, "Could not register wiphy device (%d)\n", err);
7679 		goto priv_out;
7680 	}
7681 
7682 	err = brcmf_setup_wiphybands(cfg);
7683 	if (err) {
7684 		bphy_err(drvr, "Setting wiphy bands failed (%d)\n", err);
7685 		goto wiphy_unreg_out;
7686 	}
7687 
7688 	/* If cfg80211 didn't disable 40MHz HT CAP in wiphy_register(),
7689 	 * setup 40MHz in 2GHz band and enable OBSS scanning.
7690 	 */
7691 	if (cap && (*cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)) {
7692 		err = brcmf_enable_bw40_2g(cfg);
7693 		if (!err)
7694 			err = brcmf_fil_iovar_int_set(ifp, "obss_coex",
7695 						      BRCMF_OBSS_COEX_AUTO);
7696 		else
7697 			*cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
7698 	}
7699 
7700 	err = brcmf_fweh_activate_events(ifp);
7701 	if (err) {
7702 		bphy_err(drvr, "FWEH activation failed (%d)\n", err);
7703 		goto wiphy_unreg_out;
7704 	}
7705 
7706 	err = brcmf_p2p_attach(cfg, p2pdev_forced);
7707 	if (err) {
7708 		bphy_err(drvr, "P2P initialisation failed (%d)\n", err);
7709 		goto wiphy_unreg_out;
7710 	}
7711 	err = brcmf_btcoex_attach(cfg);
7712 	if (err) {
7713 		bphy_err(drvr, "BT-coex initialisation failed (%d)\n", err);
7714 		brcmf_p2p_detach(&cfg->p2p);
7715 		goto wiphy_unreg_out;
7716 	}
7717 	err = brcmf_pno_attach(cfg);
7718 	if (err) {
7719 		bphy_err(drvr, "PNO initialisation failed (%d)\n", err);
7720 		brcmf_btcoex_detach(cfg);
7721 		brcmf_p2p_detach(&cfg->p2p);
7722 		goto wiphy_unreg_out;
7723 	}
7724 
7725 	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_TDLS)) {
7726 		err = brcmf_fil_iovar_int_set(ifp, "tdls_enable", 1);
7727 		if (err) {
7728 			brcmf_dbg(INFO, "TDLS not enabled (%d)\n", err);
7729 			wiphy->flags &= ~WIPHY_FLAG_SUPPORTS_TDLS;
7730 		} else {
7731 			brcmf_fweh_register(cfg->pub, BRCMF_E_TDLS_PEER_EVENT,
7732 					    brcmf_notify_tdls_peer_event);
7733 		}
7734 	}
7735 
7736 	/* (re-) activate FWEH event handling */
7737 	err = brcmf_fweh_activate_events(ifp);
7738 	if (err) {
7739 		bphy_err(drvr, "FWEH activation failed (%d)\n", err);
7740 		goto detach;
7741 	}
7742 
7743 	/* Fill in some of the advertised nl80211 supported features */
7744 	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_SCAN_RANDOM_MAC)) {
7745 		wiphy->features |= NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR;
7746 #ifdef CONFIG_PM
7747 		if (wiphy->wowlan &&
7748 		    wiphy->wowlan->flags & WIPHY_WOWLAN_NET_DETECT)
7749 			wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR;
7750 #endif
7751 	}
7752 
7753 	return cfg;
7754 
7755 detach:
7756 	brcmf_pno_detach(cfg);
7757 	brcmf_btcoex_detach(cfg);
7758 	brcmf_p2p_detach(&cfg->p2p);
7759 wiphy_unreg_out:
7760 	wiphy_unregister(cfg->wiphy);
7761 priv_out:
7762 	wl_deinit_priv(cfg);
7763 	brcmf_free_vif(vif);
7764 	ifp->vif = NULL;
7765 wiphy_out:
7766 	brcmf_free_wiphy(wiphy);
7767 	kfree(cfg);
7768 	return NULL;
7769 }
7770 
7771 void brcmf_cfg80211_detach(struct brcmf_cfg80211_info *cfg)
7772 {
7773 	if (!cfg)
7774 		return;
7775 
7776 	brcmf_pno_detach(cfg);
7777 	brcmf_btcoex_detach(cfg);
7778 	wiphy_unregister(cfg->wiphy);
7779 	wl_deinit_priv(cfg);
7780 	brcmf_free_wiphy(cfg->wiphy);
7781 	kfree(cfg);
7782 }
7783