xref: /linux/drivers/net/wireless/ath/ath6kl/cfg80211.c (revision 91a4855d6c03e770e42f17c798a36a3c46e63de2)
1 /*
2  * Copyright (c) 2004-2011 Atheros Communications Inc.
3  * Copyright (c) 2011-2012 Qualcomm Atheros, Inc.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
19 
20 #include <linux/moduleparam.h>
21 #include <linux/inetdevice.h>
22 #include <linux/export.h>
23 #include <linux/sched/signal.h>
24 
25 #include "core.h"
26 #include "cfg80211.h"
27 #include "debug.h"
28 #include "hif-ops.h"
29 #include "testmode.h"
30 
31 #define RATETAB_ENT(_rate, _rateid, _flags) {   \
32 	.bitrate    = (_rate),                  \
33 	.flags      = (_flags),                 \
34 	.hw_value   = (_rateid),                \
35 }
36 
37 #define CHAN2G(_channel, _freq, _flags) {   \
38 	.band           = NL80211_BAND_2GHZ,  \
39 	.hw_value       = (_channel),           \
40 	.center_freq    = (_freq),              \
41 	.flags          = (_flags),             \
42 	.max_antenna_gain   = 0,                \
43 	.max_power      = 30,                   \
44 }
45 
46 #define CHAN5G(_channel, _flags) {		    \
47 	.band           = NL80211_BAND_5GHZ,      \
48 	.hw_value       = (_channel),               \
49 	.center_freq    = 5000 + (5 * (_channel)),  \
50 	.flags          = (_flags),                 \
51 	.max_antenna_gain   = 0,                    \
52 	.max_power      = 30,                       \
53 }
54 
55 #define DEFAULT_BG_SCAN_PERIOD 60
56 
57 struct ath6kl_cfg80211_match_probe_ssid {
58 	struct cfg80211_ssid ssid;
59 	u8 flag;
60 };
61 
62 static struct ieee80211_rate ath6kl_rates[] = {
63 	RATETAB_ENT(10, 0x1, 0),
64 	RATETAB_ENT(20, 0x2, 0),
65 	RATETAB_ENT(55, 0x4, 0),
66 	RATETAB_ENT(110, 0x8, 0),
67 	RATETAB_ENT(60, 0x10, 0),
68 	RATETAB_ENT(90, 0x20, 0),
69 	RATETAB_ENT(120, 0x40, 0),
70 	RATETAB_ENT(180, 0x80, 0),
71 	RATETAB_ENT(240, 0x100, 0),
72 	RATETAB_ENT(360, 0x200, 0),
73 	RATETAB_ENT(480, 0x400, 0),
74 	RATETAB_ENT(540, 0x800, 0),
75 };
76 
77 #define ath6kl_a_rates     (ath6kl_rates + 4)
78 #define ath6kl_a_rates_size    8
79 #define ath6kl_g_rates     (ath6kl_rates + 0)
80 #define ath6kl_g_rates_size    12
81 
82 #define ath6kl_g_htcap IEEE80211_HT_CAP_SGI_20
83 #define ath6kl_a_htcap (IEEE80211_HT_CAP_SUP_WIDTH_20_40 | \
84 			IEEE80211_HT_CAP_SGI_20		 | \
85 			IEEE80211_HT_CAP_SGI_40)
86 
87 static struct ieee80211_channel ath6kl_2ghz_channels[] = {
88 	CHAN2G(1, 2412, 0),
89 	CHAN2G(2, 2417, 0),
90 	CHAN2G(3, 2422, 0),
91 	CHAN2G(4, 2427, 0),
92 	CHAN2G(5, 2432, 0),
93 	CHAN2G(6, 2437, 0),
94 	CHAN2G(7, 2442, 0),
95 	CHAN2G(8, 2447, 0),
96 	CHAN2G(9, 2452, 0),
97 	CHAN2G(10, 2457, 0),
98 	CHAN2G(11, 2462, 0),
99 	CHAN2G(12, 2467, 0),
100 	CHAN2G(13, 2472, 0),
101 	CHAN2G(14, 2484, 0),
102 };
103 
104 static struct ieee80211_channel ath6kl_5ghz_a_channels[] = {
105 	CHAN5G(36, 0), CHAN5G(40, 0),
106 	CHAN5G(44, 0), CHAN5G(48, 0),
107 	CHAN5G(52, 0), CHAN5G(56, 0),
108 	CHAN5G(60, 0), CHAN5G(64, 0),
109 	CHAN5G(100, 0), CHAN5G(104, 0),
110 	CHAN5G(108, 0), CHAN5G(112, 0),
111 	CHAN5G(116, 0), CHAN5G(120, 0),
112 	CHAN5G(124, 0), CHAN5G(128, 0),
113 	CHAN5G(132, 0), CHAN5G(136, 0),
114 	CHAN5G(140, 0), CHAN5G(149, 0),
115 	CHAN5G(153, 0), CHAN5G(157, 0),
116 	CHAN5G(161, 0), CHAN5G(165, 0),
117 	CHAN5G(184, 0), CHAN5G(188, 0),
118 	CHAN5G(192, 0), CHAN5G(196, 0),
119 	CHAN5G(200, 0), CHAN5G(204, 0),
120 	CHAN5G(208, 0), CHAN5G(212, 0),
121 	CHAN5G(216, 0),
122 };
123 
124 static struct ieee80211_supported_band ath6kl_band_2ghz = {
125 	.n_channels = ARRAY_SIZE(ath6kl_2ghz_channels),
126 	.channels = ath6kl_2ghz_channels,
127 	.n_bitrates = ath6kl_g_rates_size,
128 	.bitrates = ath6kl_g_rates,
129 	.ht_cap.cap = ath6kl_g_htcap,
130 	.ht_cap.ht_supported = true,
131 };
132 
133 static struct ieee80211_supported_band ath6kl_band_5ghz = {
134 	.n_channels = ARRAY_SIZE(ath6kl_5ghz_a_channels),
135 	.channels = ath6kl_5ghz_a_channels,
136 	.n_bitrates = ath6kl_a_rates_size,
137 	.bitrates = ath6kl_a_rates,
138 	.ht_cap.cap = ath6kl_a_htcap,
139 	.ht_cap.ht_supported = true,
140 };
141 
142 #define CCKM_KRK_CIPHER_SUITE 0x004096ff /* use for KRK */
143 
144 /* returns true if scheduled scan was stopped */
145 static bool __ath6kl_cfg80211_sscan_stop(struct ath6kl_vif *vif)
146 {
147 	struct ath6kl *ar = vif->ar;
148 
149 	if (!test_and_clear_bit(SCHED_SCANNING, &vif->flags))
150 		return false;
151 
152 	timer_delete_sync(&vif->sched_scan_timer);
153 
154 	if (ar->state == ATH6KL_STATE_RECOVERY)
155 		return true;
156 
157 	ath6kl_wmi_enable_sched_scan_cmd(ar->wmi, vif->fw_vif_idx, false);
158 
159 	return true;
160 }
161 
162 static void ath6kl_cfg80211_sscan_disable(struct ath6kl_vif *vif)
163 {
164 	struct ath6kl *ar = vif->ar;
165 	bool stopped;
166 
167 	stopped = __ath6kl_cfg80211_sscan_stop(vif);
168 
169 	if (!stopped)
170 		return;
171 
172 	cfg80211_sched_scan_stopped(ar->wiphy, 0);
173 }
174 
175 static int ath6kl_set_wpa_version(struct ath6kl_vif *vif,
176 				  enum nl80211_wpa_versions wpa_version)
177 {
178 	ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: %u\n", __func__, wpa_version);
179 
180 	if (!wpa_version) {
181 		vif->auth_mode = NONE_AUTH;
182 	} else if (wpa_version & NL80211_WPA_VERSION_2) {
183 		vif->auth_mode = WPA2_AUTH;
184 	} else if (wpa_version & NL80211_WPA_VERSION_1) {
185 		vif->auth_mode = WPA_AUTH;
186 	} else {
187 		ath6kl_err("%s: %u not supported\n", __func__, wpa_version);
188 		return -ENOTSUPP;
189 	}
190 
191 	return 0;
192 }
193 
194 static int ath6kl_set_auth_type(struct ath6kl_vif *vif,
195 				enum nl80211_auth_type auth_type)
196 {
197 	ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: 0x%x\n", __func__, auth_type);
198 
199 	switch (auth_type) {
200 	case NL80211_AUTHTYPE_OPEN_SYSTEM:
201 		vif->dot11_auth_mode = OPEN_AUTH;
202 		break;
203 	case NL80211_AUTHTYPE_SHARED_KEY:
204 		vif->dot11_auth_mode = SHARED_AUTH;
205 		break;
206 	case NL80211_AUTHTYPE_NETWORK_EAP:
207 		vif->dot11_auth_mode = LEAP_AUTH;
208 		break;
209 
210 	case NL80211_AUTHTYPE_AUTOMATIC:
211 		vif->dot11_auth_mode = OPEN_AUTH | SHARED_AUTH;
212 		break;
213 
214 	default:
215 		ath6kl_err("%s: 0x%x not supported\n", __func__, auth_type);
216 		return -ENOTSUPP;
217 	}
218 
219 	return 0;
220 }
221 
222 static int ath6kl_set_cipher(struct ath6kl_vif *vif, u32 cipher, bool ucast)
223 {
224 	u8 *ar_cipher = ucast ? &vif->prwise_crypto : &vif->grp_crypto;
225 	u8 *ar_cipher_len = ucast ? &vif->prwise_crypto_len :
226 		&vif->grp_crypto_len;
227 
228 	ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: cipher 0x%x, ucast %u\n",
229 		   __func__, cipher, ucast);
230 
231 	switch (cipher) {
232 	case 0:
233 		/* our own hack to use value 0 as no crypto used */
234 		*ar_cipher = NONE_CRYPT;
235 		*ar_cipher_len = 0;
236 		break;
237 	case WLAN_CIPHER_SUITE_WEP40:
238 		*ar_cipher = WEP_CRYPT;
239 		*ar_cipher_len = 5;
240 		break;
241 	case WLAN_CIPHER_SUITE_WEP104:
242 		*ar_cipher = WEP_CRYPT;
243 		*ar_cipher_len = 13;
244 		break;
245 	case WLAN_CIPHER_SUITE_TKIP:
246 		*ar_cipher = TKIP_CRYPT;
247 		*ar_cipher_len = 0;
248 		break;
249 	case WLAN_CIPHER_SUITE_CCMP:
250 		*ar_cipher = AES_CRYPT;
251 		*ar_cipher_len = 0;
252 		break;
253 	case WLAN_CIPHER_SUITE_SMS4:
254 		*ar_cipher = WAPI_CRYPT;
255 		*ar_cipher_len = 0;
256 		break;
257 	default:
258 		ath6kl_err("cipher 0x%x not supported\n", cipher);
259 		return -ENOTSUPP;
260 	}
261 
262 	return 0;
263 }
264 
265 static void ath6kl_set_key_mgmt(struct ath6kl_vif *vif, u32 key_mgmt)
266 {
267 	ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: 0x%x\n", __func__, key_mgmt);
268 
269 	if (key_mgmt == WLAN_AKM_SUITE_PSK) {
270 		if (vif->auth_mode == WPA_AUTH)
271 			vif->auth_mode = WPA_PSK_AUTH;
272 		else if (vif->auth_mode == WPA2_AUTH)
273 			vif->auth_mode = WPA2_PSK_AUTH;
274 	} else if (key_mgmt == 0x00409600) {
275 		if (vif->auth_mode == WPA_AUTH)
276 			vif->auth_mode = WPA_AUTH_CCKM;
277 		else if (vif->auth_mode == WPA2_AUTH)
278 			vif->auth_mode = WPA2_AUTH_CCKM;
279 	} else if (key_mgmt != WLAN_AKM_SUITE_8021X) {
280 		vif->auth_mode = NONE_AUTH;
281 	}
282 }
283 
284 static bool ath6kl_cfg80211_ready(struct ath6kl_vif *vif)
285 {
286 	struct ath6kl *ar = vif->ar;
287 
288 	if (!test_bit(WMI_READY, &ar->flag)) {
289 		ath6kl_err("wmi is not ready\n");
290 		return false;
291 	}
292 
293 	if (!test_bit(WLAN_ENABLED, &vif->flags)) {
294 		ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "wlan disabled\n");
295 		return false;
296 	}
297 
298 	return true;
299 }
300 
301 static bool ath6kl_is_wpa_ie(const u8 *pos)
302 {
303 	return pos[0] == WLAN_EID_VENDOR_SPECIFIC && pos[1] >= 4 &&
304 		pos[2] == 0x00 && pos[3] == 0x50 &&
305 		pos[4] == 0xf2 && pos[5] == 0x01;
306 }
307 
308 static bool ath6kl_is_rsn_ie(const u8 *pos)
309 {
310 	return pos[0] == WLAN_EID_RSN;
311 }
312 
313 static bool ath6kl_is_wps_ie(const u8 *pos)
314 {
315 	return (pos[0] == WLAN_EID_VENDOR_SPECIFIC &&
316 		pos[1] >= 4 &&
317 		pos[2] == 0x00 && pos[3] == 0x50 && pos[4] == 0xf2 &&
318 		pos[5] == 0x04);
319 }
320 
321 static int ath6kl_set_assoc_req_ies(struct ath6kl_vif *vif, const u8 *ies,
322 				    size_t ies_len)
323 {
324 	struct ath6kl *ar = vif->ar;
325 	const u8 *pos;
326 	u8 *buf = NULL;
327 	size_t len = 0;
328 	int ret;
329 
330 	/*
331 	 * Clear previously set flag
332 	 */
333 
334 	ar->connect_ctrl_flags &= ~CONNECT_WPS_FLAG;
335 
336 	/*
337 	 * Filter out RSN/WPA IE(s)
338 	 */
339 
340 	if (ies && ies_len) {
341 		buf = kmalloc(ies_len, GFP_KERNEL);
342 		if (buf == NULL)
343 			return -ENOMEM;
344 		pos = ies;
345 
346 		while (pos + 1 < ies + ies_len) {
347 			if (pos + 2 + pos[1] > ies + ies_len)
348 				break;
349 			if (!(ath6kl_is_wpa_ie(pos) || ath6kl_is_rsn_ie(pos))) {
350 				memcpy(buf + len, pos, 2 + pos[1]);
351 				len += 2 + pos[1];
352 			}
353 
354 			if (ath6kl_is_wps_ie(pos))
355 				ar->connect_ctrl_flags |= CONNECT_WPS_FLAG;
356 
357 			pos += 2 + pos[1];
358 		}
359 	}
360 
361 	ret = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx,
362 				       WMI_FRAME_ASSOC_REQ, buf, len);
363 	kfree(buf);
364 	return ret;
365 }
366 
367 static int ath6kl_nliftype_to_drv_iftype(enum nl80211_iftype type, u8 *nw_type)
368 {
369 	switch (type) {
370 	case NL80211_IFTYPE_STATION:
371 	case NL80211_IFTYPE_P2P_CLIENT:
372 		*nw_type = INFRA_NETWORK;
373 		break;
374 	case NL80211_IFTYPE_ADHOC:
375 		*nw_type = ADHOC_NETWORK;
376 		break;
377 	case NL80211_IFTYPE_AP:
378 	case NL80211_IFTYPE_P2P_GO:
379 		*nw_type = AP_NETWORK;
380 		break;
381 	default:
382 		ath6kl_err("invalid interface type %u\n", type);
383 		return -ENOTSUPP;
384 	}
385 
386 	return 0;
387 }
388 
389 static bool ath6kl_is_valid_iftype(struct ath6kl *ar, enum nl80211_iftype type,
390 				   u8 *if_idx, u8 *nw_type)
391 {
392 	int i;
393 
394 	if (ath6kl_nliftype_to_drv_iftype(type, nw_type))
395 		return false;
396 
397 	if (ar->ibss_if_active || ((type == NL80211_IFTYPE_ADHOC) &&
398 				   ar->num_vif))
399 		return false;
400 
401 	if (type == NL80211_IFTYPE_STATION ||
402 	    type == NL80211_IFTYPE_AP || type == NL80211_IFTYPE_ADHOC) {
403 		for (i = 0; i < ar->vif_max; i++) {
404 			if ((ar->avail_idx_map) & BIT(i)) {
405 				*if_idx = i;
406 				return true;
407 			}
408 		}
409 	}
410 
411 	if (type == NL80211_IFTYPE_P2P_CLIENT ||
412 	    type == NL80211_IFTYPE_P2P_GO) {
413 		for (i = ar->max_norm_iface; i < ar->vif_max; i++) {
414 			if ((ar->avail_idx_map) & BIT(i)) {
415 				*if_idx = i;
416 				return true;
417 			}
418 		}
419 	}
420 
421 	return false;
422 }
423 
424 static bool ath6kl_is_tx_pending(struct ath6kl *ar)
425 {
426 	return ar->tx_pending[ath6kl_wmi_get_control_ep(ar->wmi)] == 0;
427 }
428 
429 static void ath6kl_cfg80211_sta_bmiss_enhance(struct ath6kl_vif *vif,
430 					      bool enable)
431 {
432 	int err;
433 
434 	if (WARN_ON(!test_bit(WMI_READY, &vif->ar->flag)))
435 		return;
436 
437 	if (vif->nw_type != INFRA_NETWORK)
438 		return;
439 
440 	if (!test_bit(ATH6KL_FW_CAPABILITY_BMISS_ENHANCE,
441 		      vif->ar->fw_capabilities))
442 		return;
443 
444 	ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s fw bmiss enhance\n",
445 		   enable ? "enable" : "disable");
446 
447 	err = ath6kl_wmi_sta_bmiss_enhance_cmd(vif->ar->wmi,
448 					       vif->fw_vif_idx, enable);
449 	if (err)
450 		ath6kl_err("failed to %s enhanced bmiss detection: %d\n",
451 			   enable ? "enable" : "disable", err);
452 }
453 
454 static int ath6kl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
455 				   struct cfg80211_connect_params *sme)
456 {
457 	struct ath6kl *ar = ath6kl_priv(dev);
458 	struct ath6kl_vif *vif = netdev_priv(dev);
459 	int status;
460 	u8 nw_subtype = (ar->p2p) ? SUBTYPE_P2PDEV : SUBTYPE_NONE;
461 	u16 interval;
462 
463 	ath6kl_cfg80211_sscan_disable(vif);
464 
465 	vif->sme_state = SME_CONNECTING;
466 
467 	if (!ath6kl_cfg80211_ready(vif))
468 		return -EIO;
469 
470 	if (test_bit(DESTROY_IN_PROGRESS, &ar->flag)) {
471 		ath6kl_err("destroy in progress\n");
472 		return -EBUSY;
473 	}
474 
475 	if (test_bit(SKIP_SCAN, &ar->flag) &&
476 	    ((sme->channel && sme->channel->center_freq == 0) ||
477 	     (sme->bssid && is_zero_ether_addr(sme->bssid)))) {
478 		ath6kl_err("SkipScan: channel or bssid invalid\n");
479 		return -EINVAL;
480 	}
481 
482 	if (down_interruptible(&ar->sem)) {
483 		ath6kl_err("busy, couldn't get access\n");
484 		return -ERESTARTSYS;
485 	}
486 
487 	if (test_bit(DESTROY_IN_PROGRESS, &ar->flag)) {
488 		ath6kl_err("busy, destroy in progress\n");
489 		up(&ar->sem);
490 		return -EBUSY;
491 	}
492 
493 	if (ar->tx_pending[ath6kl_wmi_get_control_ep(ar->wmi)]) {
494 		/*
495 		 * sleep until the command queue drains
496 		 */
497 		wait_event_interruptible_timeout(ar->event_wq,
498 						 ath6kl_is_tx_pending(ar),
499 						 WMI_TIMEOUT);
500 		if (signal_pending(current)) {
501 			ath6kl_err("cmd queue drain timeout\n");
502 			up(&ar->sem);
503 			return -EINTR;
504 		}
505 	}
506 
507 	status = ath6kl_set_assoc_req_ies(vif, sme->ie, sme->ie_len);
508 	if (status) {
509 		up(&ar->sem);
510 		return status;
511 	}
512 
513 	if (sme->ie == NULL || sme->ie_len == 0)
514 		ar->connect_ctrl_flags &= ~CONNECT_WPS_FLAG;
515 
516 	if (test_bit(CONNECTED, &vif->flags) &&
517 	    vif->ssid_len == sme->ssid_len &&
518 	    !memcmp(vif->ssid, sme->ssid, vif->ssid_len)) {
519 		vif->reconnect_flag = true;
520 		status = ath6kl_wmi_reconnect_cmd(ar->wmi, vif->fw_vif_idx,
521 						  vif->req_bssid,
522 						  vif->ch_hint);
523 
524 		up(&ar->sem);
525 		if (status) {
526 			ath6kl_err("wmi_reconnect_cmd failed\n");
527 			return -EIO;
528 		}
529 		return 0;
530 	} else if (vif->ssid_len == sme->ssid_len &&
531 		   !memcmp(vif->ssid, sme->ssid, vif->ssid_len)) {
532 		ath6kl_disconnect(vif);
533 	}
534 
535 	memset(vif->ssid, 0, sizeof(vif->ssid));
536 	vif->ssid_len = sme->ssid_len;
537 	memcpy(vif->ssid, sme->ssid, sme->ssid_len);
538 
539 	if (sme->channel)
540 		vif->ch_hint = sme->channel->center_freq;
541 
542 	memset(vif->req_bssid, 0, sizeof(vif->req_bssid));
543 	if (sme->bssid && !is_broadcast_ether_addr(sme->bssid))
544 		memcpy(vif->req_bssid, sme->bssid, sizeof(vif->req_bssid));
545 
546 	ath6kl_set_wpa_version(vif, sme->crypto.wpa_versions);
547 
548 	status = ath6kl_set_auth_type(vif, sme->auth_type);
549 	if (status) {
550 		up(&ar->sem);
551 		return status;
552 	}
553 
554 	if (sme->crypto.n_ciphers_pairwise)
555 		ath6kl_set_cipher(vif, sme->crypto.ciphers_pairwise[0], true);
556 	else
557 		ath6kl_set_cipher(vif, 0, true);
558 
559 	ath6kl_set_cipher(vif, sme->crypto.cipher_group, false);
560 
561 	if (sme->crypto.n_akm_suites)
562 		ath6kl_set_key_mgmt(vif, sme->crypto.akm_suites[0]);
563 
564 	if ((sme->key_len) &&
565 	    (vif->auth_mode == NONE_AUTH) &&
566 	    (vif->prwise_crypto == WEP_CRYPT)) {
567 		struct ath6kl_key *key = NULL;
568 
569 		if (sme->key_idx > WMI_MAX_KEY_INDEX) {
570 			ath6kl_err("key index %d out of bounds\n",
571 				   sme->key_idx);
572 			up(&ar->sem);
573 			return -ENOENT;
574 		}
575 
576 		key = &vif->keys[sme->key_idx];
577 		key->key_len = sme->key_len;
578 		memcpy(key->key, sme->key, key->key_len);
579 		key->cipher = vif->prwise_crypto;
580 		vif->def_txkey_index = sme->key_idx;
581 
582 		ath6kl_wmi_addkey_cmd(ar->wmi, vif->fw_vif_idx, sme->key_idx,
583 				      vif->prwise_crypto,
584 				      GROUP_USAGE | TX_USAGE,
585 				      key->key_len,
586 				      NULL, 0,
587 				      key->key, KEY_OP_INIT_VAL, NULL,
588 				      NO_SYNC_WMIFLAG);
589 	}
590 
591 	if (!ar->usr_bss_filter) {
592 		clear_bit(CLEAR_BSSFILTER_ON_BEACON, &vif->flags);
593 		if (ath6kl_wmi_bssfilter_cmd(ar->wmi, vif->fw_vif_idx,
594 					     ALL_BSS_FILTER, 0) != 0) {
595 			ath6kl_err("couldn't set bss filtering\n");
596 			up(&ar->sem);
597 			return -EIO;
598 		}
599 	}
600 
601 	vif->nw_type = vif->next_mode;
602 
603 	/* enable enhanced bmiss detection if applicable */
604 	ath6kl_cfg80211_sta_bmiss_enhance(vif, true);
605 
606 	if (vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT)
607 		nw_subtype = SUBTYPE_P2PCLIENT;
608 
609 	ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
610 		   "%s: connect called with authmode %d dot11 auth %d"
611 		   " PW crypto %d PW crypto len %d GRP crypto %d"
612 		   " GRP crypto len %d channel hint %u\n",
613 		   __func__,
614 		   vif->auth_mode, vif->dot11_auth_mode, vif->prwise_crypto,
615 		   vif->prwise_crypto_len, vif->grp_crypto,
616 		   vif->grp_crypto_len, vif->ch_hint);
617 
618 	vif->reconnect_flag = 0;
619 
620 	if (vif->nw_type == INFRA_NETWORK) {
621 		interval = max_t(u16, vif->listen_intvl_t,
622 				 ATH6KL_MAX_WOW_LISTEN_INTL);
623 		status = ath6kl_wmi_listeninterval_cmd(ar->wmi, vif->fw_vif_idx,
624 						       interval,
625 						       0);
626 		if (status) {
627 			ath6kl_err("couldn't set listen intervel\n");
628 			up(&ar->sem);
629 			return status;
630 		}
631 	}
632 
633 	status = ath6kl_wmi_connect_cmd(ar->wmi, vif->fw_vif_idx, vif->nw_type,
634 					vif->dot11_auth_mode, vif->auth_mode,
635 					vif->prwise_crypto,
636 					vif->prwise_crypto_len,
637 					vif->grp_crypto, vif->grp_crypto_len,
638 					vif->ssid_len, vif->ssid,
639 					vif->req_bssid, vif->ch_hint,
640 					ar->connect_ctrl_flags, nw_subtype);
641 
642 	if (sme->bg_scan_period == 0) {
643 		/* disable background scan if period is 0 */
644 		sme->bg_scan_period = 0xffff;
645 	} else if (sme->bg_scan_period == -1) {
646 		/* configure default value if not specified */
647 		sme->bg_scan_period = DEFAULT_BG_SCAN_PERIOD;
648 	}
649 
650 	ath6kl_wmi_scanparams_cmd(ar->wmi, vif->fw_vif_idx, 0, 0,
651 				  sme->bg_scan_period, 0, 0, 0, 3, 0, 0, 0);
652 
653 	up(&ar->sem);
654 
655 	if (status == -EINVAL) {
656 		memset(vif->ssid, 0, sizeof(vif->ssid));
657 		vif->ssid_len = 0;
658 		ath6kl_err("invalid request\n");
659 		return -ENOENT;
660 	} else if (status) {
661 		ath6kl_err("ath6kl_wmi_connect_cmd failed\n");
662 		return -EIO;
663 	}
664 
665 	if ((!(ar->connect_ctrl_flags & CONNECT_DO_WPA_OFFLOAD)) &&
666 	    ((vif->auth_mode == WPA_PSK_AUTH) ||
667 	     (vif->auth_mode == WPA2_PSK_AUTH))) {
668 		mod_timer(&vif->disconnect_timer,
669 			  jiffies + msecs_to_jiffies(DISCON_TIMER_INTVAL));
670 	}
671 
672 	ar->connect_ctrl_flags &= ~CONNECT_DO_WPA_OFFLOAD;
673 	set_bit(CONNECT_PEND, &vif->flags);
674 
675 	return 0;
676 }
677 
678 static struct cfg80211_bss *
679 ath6kl_add_bss_if_needed(struct ath6kl_vif *vif,
680 			 enum network_type nw_type,
681 			 const u8 *bssid,
682 			 struct ieee80211_channel *chan,
683 			 const u8 *beacon_ie,
684 			 size_t beacon_ie_len)
685 {
686 	struct ath6kl *ar = vif->ar;
687 	struct cfg80211_bss *bss;
688 	u16 cap_val;
689 	enum ieee80211_bss_type bss_type;
690 	u8 *ie;
691 
692 	if (nw_type & ADHOC_NETWORK) {
693 		cap_val = WLAN_CAPABILITY_IBSS;
694 		bss_type = IEEE80211_BSS_TYPE_IBSS;
695 	} else {
696 		cap_val = WLAN_CAPABILITY_ESS;
697 		bss_type = IEEE80211_BSS_TYPE_ESS;
698 	}
699 
700 	bss = cfg80211_get_bss(ar->wiphy, chan, bssid,
701 			       vif->ssid, vif->ssid_len,
702 			       bss_type, IEEE80211_PRIVACY_ANY);
703 	if (bss == NULL) {
704 		/*
705 		 * Since cfg80211 may not yet know about the BSS,
706 		 * generate a partial entry until the first BSS info
707 		 * event becomes available.
708 		 *
709 		 * Prepend SSID element since it is not included in the Beacon
710 		 * IEs from the target.
711 		 */
712 		ie = kmalloc(2 + vif->ssid_len + beacon_ie_len, GFP_KERNEL);
713 		if (ie == NULL)
714 			return NULL;
715 		ie[0] = WLAN_EID_SSID;
716 		ie[1] = vif->ssid_len;
717 		memcpy(ie + 2, vif->ssid, vif->ssid_len);
718 		memcpy(ie + 2 + vif->ssid_len, beacon_ie, beacon_ie_len);
719 		bss = cfg80211_inform_bss(ar->wiphy, chan,
720 					  CFG80211_BSS_FTYPE_UNKNOWN,
721 					  bssid, 0, cap_val, 100,
722 					  ie, 2 + vif->ssid_len + beacon_ie_len,
723 					  0, GFP_KERNEL);
724 		if (bss)
725 			ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
726 				   "added bss %pM to cfg80211\n", bssid);
727 		kfree(ie);
728 	} else {
729 		ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "cfg80211 already has a bss\n");
730 	}
731 
732 	return bss;
733 }
734 
735 void ath6kl_cfg80211_connect_event(struct ath6kl_vif *vif, u16 channel,
736 				   u8 *bssid, u16 listen_intvl,
737 				   u16 beacon_intvl,
738 				   enum network_type nw_type,
739 				   u8 beacon_ie_len, u8 assoc_req_len,
740 				   u8 assoc_resp_len, u8 *assoc_info)
741 {
742 	struct ieee80211_channel *chan;
743 	struct ath6kl *ar = vif->ar;
744 	struct cfg80211_bss *bss;
745 
746 	/* capinfo + listen interval */
747 	u8 assoc_req_ie_offset = sizeof(u16) + sizeof(u16);
748 
749 	/* capinfo + status code +  associd */
750 	u8 assoc_resp_ie_offset = sizeof(u16) + sizeof(u16) + sizeof(u16);
751 
752 	u8 *assoc_req_ie = assoc_info + beacon_ie_len + assoc_req_ie_offset;
753 	u8 *assoc_resp_ie = assoc_info + beacon_ie_len + assoc_req_len +
754 	    assoc_resp_ie_offset;
755 
756 	assoc_req_len -= assoc_req_ie_offset;
757 	assoc_resp_len -= assoc_resp_ie_offset;
758 
759 	/*
760 	 * Store Beacon interval here; DTIM period will be available only once
761 	 * a Beacon frame from the AP is seen.
762 	 */
763 	vif->assoc_bss_beacon_int = beacon_intvl;
764 	clear_bit(DTIM_PERIOD_AVAIL, &vif->flags);
765 
766 	if (nw_type & ADHOC_NETWORK) {
767 		if (vif->wdev.iftype != NL80211_IFTYPE_ADHOC) {
768 			ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
769 				   "%s: ath6k not in ibss mode\n", __func__);
770 			return;
771 		}
772 	}
773 
774 	if (nw_type & INFRA_NETWORK) {
775 		if (vif->wdev.iftype != NL80211_IFTYPE_STATION &&
776 		    vif->wdev.iftype != NL80211_IFTYPE_P2P_CLIENT) {
777 			ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
778 				   "%s: ath6k not in station mode\n", __func__);
779 			return;
780 		}
781 	}
782 
783 	chan = ieee80211_get_channel(ar->wiphy, (int) channel);
784 
785 	bss = ath6kl_add_bss_if_needed(vif, nw_type, bssid, chan,
786 				       assoc_info, beacon_ie_len);
787 	if (!bss) {
788 		ath6kl_err("could not add cfg80211 bss entry\n");
789 		return;
790 	}
791 
792 	if (nw_type & ADHOC_NETWORK) {
793 		ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "ad-hoc %s selected\n",
794 			   nw_type & ADHOC_CREATOR ? "creator" : "joiner");
795 		cfg80211_ibss_joined(vif->ndev, bssid, chan, GFP_KERNEL);
796 		cfg80211_put_bss(ar->wiphy, bss);
797 		return;
798 	}
799 
800 	if (vif->sme_state == SME_CONNECTING) {
801 		/* inform connect result to cfg80211 */
802 		vif->sme_state = SME_CONNECTED;
803 		cfg80211_connect_result(vif->ndev, bssid,
804 					assoc_req_ie, assoc_req_len,
805 					assoc_resp_ie, assoc_resp_len,
806 					WLAN_STATUS_SUCCESS, GFP_KERNEL);
807 		cfg80211_put_bss(ar->wiphy, bss);
808 	} else if (vif->sme_state == SME_CONNECTED) {
809 		struct cfg80211_roam_info roam_info = {
810 			.links[0].bss = bss,
811 			.req_ie = assoc_req_ie,
812 			.req_ie_len = assoc_req_len,
813 			.resp_ie = assoc_resp_ie,
814 			.resp_ie_len = assoc_resp_len,
815 		};
816 		/* inform roam event to cfg80211 */
817 		cfg80211_roamed(vif->ndev, &roam_info, GFP_KERNEL);
818 	}
819 }
820 
821 static int ath6kl_cfg80211_disconnect(struct wiphy *wiphy,
822 				      struct net_device *dev, u16 reason_code)
823 {
824 	struct ath6kl *ar = ath6kl_priv(dev);
825 	struct ath6kl_vif *vif = netdev_priv(dev);
826 
827 	ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: reason=%u\n", __func__,
828 		   reason_code);
829 
830 	ath6kl_cfg80211_sscan_disable(vif);
831 
832 	if (!ath6kl_cfg80211_ready(vif))
833 		return -EIO;
834 
835 	if (test_bit(DESTROY_IN_PROGRESS, &ar->flag)) {
836 		ath6kl_err("busy, destroy in progress\n");
837 		return -EBUSY;
838 	}
839 
840 	if (down_interruptible(&ar->sem)) {
841 		ath6kl_err("busy, couldn't get access\n");
842 		return -ERESTARTSYS;
843 	}
844 
845 	vif->reconnect_flag = 0;
846 	ath6kl_disconnect(vif);
847 	memset(vif->ssid, 0, sizeof(vif->ssid));
848 	vif->ssid_len = 0;
849 
850 	if (!test_bit(SKIP_SCAN, &ar->flag))
851 		memset(vif->req_bssid, 0, sizeof(vif->req_bssid));
852 
853 	up(&ar->sem);
854 
855 	return 0;
856 }
857 
858 void ath6kl_cfg80211_disconnect_event(struct ath6kl_vif *vif, u8 reason,
859 				      u8 *bssid, u8 assoc_resp_len,
860 				      u8 *assoc_info, u16 proto_reason)
861 {
862 	struct ath6kl *ar = vif->ar;
863 
864 	if (vif->scan_req) {
865 		struct cfg80211_scan_info info = {
866 			.aborted = true,
867 		};
868 
869 		cfg80211_scan_done(vif->scan_req, &info);
870 		vif->scan_req = NULL;
871 	}
872 
873 	if (vif->nw_type & ADHOC_NETWORK) {
874 		if (vif->wdev.iftype != NL80211_IFTYPE_ADHOC)
875 			ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
876 				   "%s: ath6k not in ibss mode\n", __func__);
877 		return;
878 	}
879 
880 	if (vif->nw_type & INFRA_NETWORK) {
881 		if (vif->wdev.iftype != NL80211_IFTYPE_STATION &&
882 		    vif->wdev.iftype != NL80211_IFTYPE_P2P_CLIENT) {
883 			ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
884 				   "%s: ath6k not in station mode\n", __func__);
885 			return;
886 		}
887 	}
888 
889 	clear_bit(CONNECT_PEND, &vif->flags);
890 
891 	if (vif->sme_state == SME_CONNECTING) {
892 		cfg80211_connect_result(vif->ndev,
893 					bssid, NULL, 0,
894 					NULL, 0,
895 					WLAN_STATUS_UNSPECIFIED_FAILURE,
896 					GFP_KERNEL);
897 	} else if (vif->sme_state == SME_CONNECTED) {
898 		cfg80211_disconnected(vif->ndev, proto_reason,
899 				      NULL, 0, false, GFP_KERNEL);
900 	}
901 
902 	vif->sme_state = SME_DISCONNECTED;
903 
904 	/*
905 	 * Send a disconnect command to target when a disconnect event is
906 	 * received with reason code other than 3 (DISCONNECT_CMD - disconnect
907 	 * request from host) to make the firmware stop trying to connect even
908 	 * after giving disconnect event. There will be one more disconnect
909 	 * event for this disconnect command with reason code DISCONNECT_CMD
910 	 * which won't be notified to cfg80211.
911 	 */
912 	if (reason != DISCONNECT_CMD)
913 		ath6kl_wmi_disconnect_cmd(ar->wmi, vif->fw_vif_idx);
914 }
915 
916 static int ath6kl_set_probed_ssids(struct ath6kl *ar,
917 				   struct ath6kl_vif *vif,
918 				   struct cfg80211_ssid *ssids, int n_ssids,
919 				   struct cfg80211_match_set *match_set,
920 				   int n_match_ssid)
921 {
922 	u8 i, j, index_to_add, ssid_found = false;
923 	struct ath6kl_cfg80211_match_probe_ssid ssid_list[MAX_PROBED_SSIDS];
924 
925 	memset(ssid_list, 0, sizeof(ssid_list));
926 
927 	if (n_ssids > MAX_PROBED_SSIDS ||
928 	    n_match_ssid > MAX_PROBED_SSIDS)
929 		return -EINVAL;
930 
931 	for (i = 0; i < n_ssids; i++) {
932 		memcpy(ssid_list[i].ssid.ssid,
933 		       ssids[i].ssid,
934 		       ssids[i].ssid_len);
935 		ssid_list[i].ssid.ssid_len = ssids[i].ssid_len;
936 
937 		if (ssids[i].ssid_len)
938 			ssid_list[i].flag = SPECIFIC_SSID_FLAG;
939 		else
940 			ssid_list[i].flag = ANY_SSID_FLAG;
941 
942 		if (ar->wiphy->max_match_sets != 0 && n_match_ssid == 0)
943 			ssid_list[i].flag |= MATCH_SSID_FLAG;
944 	}
945 
946 	index_to_add = i;
947 
948 	for (i = 0; i < n_match_ssid; i++) {
949 		ssid_found = false;
950 
951 		for (j = 0; j < n_ssids; j++) {
952 			if ((match_set[i].ssid.ssid_len ==
953 			     ssid_list[j].ssid.ssid_len) &&
954 			    (!memcmp(ssid_list[j].ssid.ssid,
955 				     match_set[i].ssid.ssid,
956 				     match_set[i].ssid.ssid_len))) {
957 				ssid_list[j].flag |= MATCH_SSID_FLAG;
958 				ssid_found = true;
959 				break;
960 			}
961 		}
962 
963 		if (ssid_found)
964 			continue;
965 
966 		if (index_to_add >= MAX_PROBED_SSIDS)
967 			continue;
968 
969 		ssid_list[index_to_add].ssid.ssid_len =
970 			match_set[i].ssid.ssid_len;
971 		memcpy(ssid_list[index_to_add].ssid.ssid,
972 		       match_set[i].ssid.ssid,
973 		       match_set[i].ssid.ssid_len);
974 		ssid_list[index_to_add].flag |= MATCH_SSID_FLAG;
975 		index_to_add++;
976 	}
977 
978 	for (i = 0; i < index_to_add; i++) {
979 		ath6kl_wmi_probedssid_cmd(ar->wmi, vif->fw_vif_idx, i,
980 					  ssid_list[i].flag,
981 					  ssid_list[i].ssid.ssid_len,
982 					  ssid_list[i].ssid.ssid);
983 	}
984 
985 	/* Make sure no old entries are left behind */
986 	for (i = index_to_add; i < MAX_PROBED_SSIDS; i++) {
987 		ath6kl_wmi_probedssid_cmd(ar->wmi, vif->fw_vif_idx, i,
988 					  DISABLE_SSID_FLAG, 0, NULL);
989 	}
990 
991 	return 0;
992 }
993 
994 static int ath6kl_cfg80211_scan(struct wiphy *wiphy,
995 				struct cfg80211_scan_request *request)
996 {
997 	struct ath6kl_vif *vif = ath6kl_vif_from_wdev(request->wdev);
998 	struct ath6kl *ar = ath6kl_priv(vif->ndev);
999 	s8 n_channels = 0;
1000 	u16 *channels = NULL;
1001 	int ret = 0;
1002 	u32 force_fg_scan = 0;
1003 
1004 	if (!ath6kl_cfg80211_ready(vif))
1005 		return -EIO;
1006 
1007 	ath6kl_cfg80211_sscan_disable(vif);
1008 
1009 	if (!ar->usr_bss_filter) {
1010 		clear_bit(CLEAR_BSSFILTER_ON_BEACON, &vif->flags);
1011 		ret = ath6kl_wmi_bssfilter_cmd(ar->wmi, vif->fw_vif_idx,
1012 					       ALL_BSS_FILTER, 0);
1013 		if (ret) {
1014 			ath6kl_err("couldn't set bss filtering\n");
1015 			return ret;
1016 		}
1017 	}
1018 
1019 	ret = ath6kl_set_probed_ssids(ar, vif, request->ssids,
1020 				      request->n_ssids, NULL, 0);
1021 	if (ret < 0)
1022 		return ret;
1023 
1024 	/* this also clears IE in fw if it's not set */
1025 	ret = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx,
1026 				       WMI_FRAME_PROBE_REQ,
1027 				       request->ie, request->ie_len);
1028 	if (ret) {
1029 		ath6kl_err("failed to set Probe Request appie for scan\n");
1030 		return ret;
1031 	}
1032 
1033 	/*
1034 	 * Scan only the requested channels if the request specifies a set of
1035 	 * channels. If the list is longer than the target supports, do not
1036 	 * configure the list and instead, scan all available channels.
1037 	 */
1038 	if (request->n_channels > 0 &&
1039 	    request->n_channels <= WMI_MAX_CHANNELS) {
1040 		u8 i;
1041 
1042 		n_channels = request->n_channels;
1043 
1044 		channels = kcalloc(n_channels, sizeof(u16), GFP_KERNEL);
1045 		if (channels == NULL) {
1046 			ath6kl_warn("failed to set scan channels, scan all channels");
1047 			n_channels = 0;
1048 		}
1049 
1050 		for (i = 0; i < n_channels; i++)
1051 			channels[i] = request->channels[i]->center_freq;
1052 	}
1053 
1054 	if (test_bit(CONNECTED, &vif->flags))
1055 		force_fg_scan = 1;
1056 
1057 	vif->scan_req = request;
1058 
1059 	ret = ath6kl_wmi_beginscan_cmd(ar->wmi, vif->fw_vif_idx,
1060 				       WMI_LONG_SCAN, force_fg_scan,
1061 				       false, 0,
1062 				       ATH6KL_FG_SCAN_INTERVAL,
1063 				       n_channels, channels,
1064 				       request->no_cck,
1065 				       request->rates);
1066 	if (ret) {
1067 		ath6kl_err("failed to start scan: %d\n", ret);
1068 		vif->scan_req = NULL;
1069 	}
1070 
1071 	kfree(channels);
1072 
1073 	return ret;
1074 }
1075 
1076 void ath6kl_cfg80211_scan_complete_event(struct ath6kl_vif *vif, bool aborted)
1077 {
1078 	struct ath6kl *ar = vif->ar;
1079 	struct cfg80211_scan_info info = {
1080 		.aborted = aborted,
1081 	};
1082 	int i;
1083 
1084 	ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: status%s\n", __func__,
1085 		   aborted ? " aborted" : "");
1086 
1087 	if (!vif->scan_req)
1088 		return;
1089 
1090 	if (aborted)
1091 		goto out;
1092 
1093 	if (vif->scan_req->n_ssids && vif->scan_req->ssids[0].ssid_len) {
1094 		for (i = 0; i < vif->scan_req->n_ssids; i++) {
1095 			ath6kl_wmi_probedssid_cmd(ar->wmi, vif->fw_vif_idx,
1096 						  i, DISABLE_SSID_FLAG,
1097 						  0, NULL);
1098 		}
1099 	}
1100 
1101 out:
1102 	cfg80211_scan_done(vif->scan_req, &info);
1103 	vif->scan_req = NULL;
1104 }
1105 
1106 void ath6kl_cfg80211_ch_switch_notify(struct ath6kl_vif *vif, int freq,
1107 				      enum wmi_phy_mode mode)
1108 {
1109 	struct cfg80211_chan_def chandef;
1110 
1111 	ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
1112 		   "channel switch notify nw_type %d freq %d mode %d\n",
1113 		   vif->nw_type, freq, mode);
1114 
1115 	cfg80211_chandef_create(&chandef,
1116 				ieee80211_get_channel(vif->ar->wiphy, freq),
1117 				(mode == WMI_11G_HT20 &&
1118 				 ath6kl_band_2ghz.ht_cap.ht_supported) ?
1119 					NL80211_CHAN_HT20 : NL80211_CHAN_NO_HT);
1120 
1121 	wiphy_lock(vif->ar->wiphy);
1122 	cfg80211_ch_switch_notify(vif->ndev, &chandef, 0);
1123 	wiphy_unlock(vif->ar->wiphy);
1124 }
1125 
1126 static int ath6kl_cfg80211_add_key(struct wiphy *wiphy, struct wireless_dev *wdev,
1127 				   int link_id, u8 key_index, bool pairwise,
1128 				   const u8 *mac_addr,
1129 				   struct key_params *params)
1130 {
1131 	struct ath6kl *ar = ath6kl_priv(wdev->netdev);
1132 	struct ath6kl_vif *vif = netdev_priv(wdev->netdev);
1133 	struct ath6kl_key *key = NULL;
1134 	int seq_len;
1135 	u8 key_usage;
1136 	u8 key_type;
1137 
1138 	if (!ath6kl_cfg80211_ready(vif))
1139 		return -EIO;
1140 
1141 	if (params->cipher == CCKM_KRK_CIPHER_SUITE) {
1142 		if (params->key_len != WMI_KRK_LEN)
1143 			return -EINVAL;
1144 		return ath6kl_wmi_add_krk_cmd(ar->wmi, vif->fw_vif_idx,
1145 					      params->key);
1146 	}
1147 
1148 	if (key_index > WMI_MAX_KEY_INDEX) {
1149 		ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
1150 			   "%s: key index %d out of bounds\n", __func__,
1151 			   key_index);
1152 		return -ENOENT;
1153 	}
1154 
1155 	key = &vif->keys[key_index];
1156 	memset(key, 0, sizeof(struct ath6kl_key));
1157 
1158 	if (pairwise)
1159 		key_usage = PAIRWISE_USAGE;
1160 	else
1161 		key_usage = GROUP_USAGE;
1162 
1163 	seq_len = params->seq_len;
1164 	if (params->cipher == WLAN_CIPHER_SUITE_SMS4 &&
1165 	    seq_len > ATH6KL_KEY_SEQ_LEN) {
1166 		/* Only first half of the WPI PN is configured */
1167 		seq_len = ATH6KL_KEY_SEQ_LEN;
1168 	}
1169 	if (params->key_len > WLAN_MAX_KEY_LEN ||
1170 	    seq_len > sizeof(key->seq))
1171 		return -EINVAL;
1172 
1173 	key->key_len = params->key_len;
1174 	memcpy(key->key, params->key, key->key_len);
1175 	key->seq_len = seq_len;
1176 	memcpy(key->seq, params->seq, key->seq_len);
1177 	key->cipher = params->cipher;
1178 
1179 	switch (key->cipher) {
1180 	case WLAN_CIPHER_SUITE_WEP40:
1181 	case WLAN_CIPHER_SUITE_WEP104:
1182 		key_type = WEP_CRYPT;
1183 		break;
1184 
1185 	case WLAN_CIPHER_SUITE_TKIP:
1186 		key_type = TKIP_CRYPT;
1187 		break;
1188 
1189 	case WLAN_CIPHER_SUITE_CCMP:
1190 		key_type = AES_CRYPT;
1191 		break;
1192 	case WLAN_CIPHER_SUITE_SMS4:
1193 		key_type = WAPI_CRYPT;
1194 		break;
1195 
1196 	default:
1197 		return -ENOTSUPP;
1198 	}
1199 
1200 	if (((vif->auth_mode == WPA_PSK_AUTH) ||
1201 	     (vif->auth_mode == WPA2_PSK_AUTH)) &&
1202 	    (key_usage & GROUP_USAGE))
1203 		timer_delete(&vif->disconnect_timer);
1204 
1205 	ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
1206 		   "%s: index %d, key_len %d, key_type 0x%x, key_usage 0x%x, seq_len %d\n",
1207 		   __func__, key_index, key->key_len, key_type,
1208 		   key_usage, key->seq_len);
1209 
1210 	if (vif->nw_type == AP_NETWORK && !pairwise &&
1211 	    (key_type == TKIP_CRYPT || key_type == AES_CRYPT ||
1212 	     key_type == WAPI_CRYPT)) {
1213 		ar->ap_mode_bkey.valid = true;
1214 		ar->ap_mode_bkey.key_index = key_index;
1215 		ar->ap_mode_bkey.key_type = key_type;
1216 		ar->ap_mode_bkey.key_len = key->key_len;
1217 		memcpy(ar->ap_mode_bkey.key, key->key, key->key_len);
1218 		if (!test_bit(CONNECTED, &vif->flags)) {
1219 			ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
1220 				   "Delay initial group key configuration until AP mode has been started\n");
1221 			/*
1222 			 * The key will be set in ath6kl_connect_ap_mode() once
1223 			 * the connected event is received from the target.
1224 			 */
1225 			return 0;
1226 		}
1227 	}
1228 
1229 	if (vif->next_mode == AP_NETWORK && key_type == WEP_CRYPT &&
1230 	    !test_bit(CONNECTED, &vif->flags)) {
1231 		/*
1232 		 * Store the key locally so that it can be re-configured after
1233 		 * the AP mode has properly started
1234 		 * (ath6kl_install_statioc_wep_keys).
1235 		 */
1236 		ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
1237 			   "Delay WEP key configuration until AP mode has been started\n");
1238 		vif->wep_key_list[key_index].key_len = key->key_len;
1239 		memcpy(vif->wep_key_list[key_index].key, key->key,
1240 		       key->key_len);
1241 		return 0;
1242 	}
1243 
1244 	return ath6kl_wmi_addkey_cmd(ar->wmi, vif->fw_vif_idx, key_index,
1245 				     key_type, key_usage, key->key_len,
1246 				     key->seq, key->seq_len, key->key,
1247 				     KEY_OP_INIT_VAL,
1248 				     (u8 *) mac_addr, SYNC_BOTH_WMIFLAG);
1249 }
1250 
1251 static int ath6kl_cfg80211_del_key(struct wiphy *wiphy, struct wireless_dev *wdev,
1252 				   int link_id, u8 key_index, bool pairwise,
1253 				   const u8 *mac_addr)
1254 {
1255 	struct ath6kl *ar = ath6kl_priv(wdev->netdev);
1256 	struct ath6kl_vif *vif = netdev_priv(wdev->netdev);
1257 
1258 	ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: index %d\n", __func__, key_index);
1259 
1260 	if (!ath6kl_cfg80211_ready(vif))
1261 		return -EIO;
1262 
1263 	if (key_index > WMI_MAX_KEY_INDEX) {
1264 		ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
1265 			   "%s: key index %d out of bounds\n", __func__,
1266 			   key_index);
1267 		return -ENOENT;
1268 	}
1269 
1270 	if (!vif->keys[key_index].key_len) {
1271 		ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
1272 			   "%s: index %d is empty\n", __func__, key_index);
1273 		return 0;
1274 	}
1275 
1276 	vif->keys[key_index].key_len = 0;
1277 
1278 	return ath6kl_wmi_deletekey_cmd(ar->wmi, vif->fw_vif_idx, key_index);
1279 }
1280 
1281 static int ath6kl_cfg80211_get_key(struct wiphy *wiphy, struct wireless_dev *wdev,
1282 				   int link_id, u8 key_index, bool pairwise,
1283 				   const u8 *mac_addr, void *cookie,
1284 				   void (*callback) (void *cookie,
1285 						     struct key_params *))
1286 {
1287 	struct ath6kl_vif *vif = netdev_priv(wdev->netdev);
1288 	struct ath6kl_key *key = NULL;
1289 	struct key_params params;
1290 
1291 	ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: index %d\n", __func__, key_index);
1292 
1293 	if (!ath6kl_cfg80211_ready(vif))
1294 		return -EIO;
1295 
1296 	if (key_index > WMI_MAX_KEY_INDEX) {
1297 		ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
1298 			   "%s: key index %d out of bounds\n", __func__,
1299 			   key_index);
1300 		return -ENOENT;
1301 	}
1302 
1303 	key = &vif->keys[key_index];
1304 	memset(&params, 0, sizeof(params));
1305 	params.cipher = key->cipher;
1306 	params.key_len = key->key_len;
1307 	params.seq_len = key->seq_len;
1308 	params.seq = key->seq;
1309 	params.key = key->key;
1310 
1311 	callback(cookie, &params);
1312 
1313 	return key->key_len ? 0 : -ENOENT;
1314 }
1315 
1316 static int ath6kl_cfg80211_set_default_key(struct wiphy *wiphy,
1317 					   struct net_device *ndev, int link_id,
1318 					   u8 key_index, bool unicast,
1319 					   bool multicast)
1320 {
1321 	struct ath6kl *ar = ath6kl_priv(ndev);
1322 	struct ath6kl_vif *vif = netdev_priv(ndev);
1323 	struct ath6kl_key *key = NULL;
1324 	u8 key_usage;
1325 	enum ath6kl_crypto_type key_type = NONE_CRYPT;
1326 
1327 	ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: index %d\n", __func__, key_index);
1328 
1329 	if (!ath6kl_cfg80211_ready(vif))
1330 		return -EIO;
1331 
1332 	if (key_index > WMI_MAX_KEY_INDEX) {
1333 		ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
1334 			   "%s: key index %d out of bounds\n",
1335 			   __func__, key_index);
1336 		return -ENOENT;
1337 	}
1338 
1339 	if (!vif->keys[key_index].key_len) {
1340 		ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: invalid key index %d\n",
1341 			   __func__, key_index);
1342 		return -EINVAL;
1343 	}
1344 
1345 	vif->def_txkey_index = key_index;
1346 	key = &vif->keys[vif->def_txkey_index];
1347 	key_usage = GROUP_USAGE;
1348 	if (vif->prwise_crypto == WEP_CRYPT)
1349 		key_usage |= TX_USAGE;
1350 	if (unicast)
1351 		key_type = vif->prwise_crypto;
1352 	if (multicast)
1353 		key_type = vif->grp_crypto;
1354 
1355 	if (vif->next_mode == AP_NETWORK && !test_bit(CONNECTED, &vif->flags))
1356 		return 0; /* Delay until AP mode has been started */
1357 
1358 	return ath6kl_wmi_addkey_cmd(ar->wmi, vif->fw_vif_idx,
1359 				     vif->def_txkey_index,
1360 				     key_type, key_usage,
1361 				     key->key_len, key->seq, key->seq_len,
1362 				     key->key,
1363 				     KEY_OP_INIT_VAL, NULL,
1364 				     SYNC_BOTH_WMIFLAG);
1365 }
1366 
1367 void ath6kl_cfg80211_tkip_micerr_event(struct ath6kl_vif *vif, u8 keyid,
1368 				       bool ismcast)
1369 {
1370 	ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
1371 		   "%s: keyid %d, ismcast %d\n", __func__, keyid, ismcast);
1372 
1373 	cfg80211_michael_mic_failure(vif->ndev, vif->bssid,
1374 				     (ismcast ? NL80211_KEYTYPE_GROUP :
1375 				      NL80211_KEYTYPE_PAIRWISE), keyid, NULL,
1376 				     GFP_KERNEL);
1377 }
1378 
1379 static int ath6kl_cfg80211_set_wiphy_params(struct wiphy *wiphy, int radio_idx,
1380 					    u32 changed)
1381 {
1382 	struct ath6kl *ar = (struct ath6kl *)wiphy_priv(wiphy);
1383 	struct ath6kl_vif *vif;
1384 	int ret;
1385 
1386 	ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: changed 0x%x\n", __func__,
1387 		   changed);
1388 
1389 	vif = ath6kl_vif_first(ar);
1390 	if (!vif)
1391 		return -EIO;
1392 
1393 	if (!ath6kl_cfg80211_ready(vif))
1394 		return -EIO;
1395 
1396 	if (changed & WIPHY_PARAM_RTS_THRESHOLD) {
1397 		ret = ath6kl_wmi_set_rts_cmd(ar->wmi, wiphy->rts_threshold);
1398 		if (ret != 0) {
1399 			ath6kl_err("ath6kl_wmi_set_rts_cmd failed\n");
1400 			return -EIO;
1401 		}
1402 	}
1403 
1404 	return 0;
1405 }
1406 
1407 static int ath6kl_cfg80211_set_txpower(struct wiphy *wiphy,
1408 				       struct wireless_dev *wdev,
1409 				       int radio_idx,
1410 				       enum nl80211_tx_power_setting type,
1411 				       int mbm)
1412 {
1413 	struct ath6kl *ar = (struct ath6kl *)wiphy_priv(wiphy);
1414 	struct ath6kl_vif *vif;
1415 	int dbm = MBM_TO_DBM(mbm);
1416 
1417 	ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: type 0x%x, dbm %d\n", __func__,
1418 		   type, dbm);
1419 
1420 	vif = ath6kl_vif_first(ar);
1421 	if (!vif)
1422 		return -EIO;
1423 
1424 	if (!ath6kl_cfg80211_ready(vif))
1425 		return -EIO;
1426 
1427 	switch (type) {
1428 	case NL80211_TX_POWER_AUTOMATIC:
1429 		return 0;
1430 	case NL80211_TX_POWER_LIMITED:
1431 		ar->tx_pwr = dbm;
1432 		break;
1433 	default:
1434 		ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: type 0x%x not supported\n",
1435 			   __func__, type);
1436 		return -EOPNOTSUPP;
1437 	}
1438 
1439 	ath6kl_wmi_set_tx_pwr_cmd(ar->wmi, vif->fw_vif_idx, dbm);
1440 
1441 	return 0;
1442 }
1443 
1444 static int ath6kl_cfg80211_get_txpower(struct wiphy *wiphy,
1445 				       struct wireless_dev *wdev,
1446 				       int radio_idx,
1447 				       unsigned int link_id,
1448 				       int *dbm)
1449 {
1450 	struct ath6kl *ar = (struct ath6kl *)wiphy_priv(wiphy);
1451 	struct ath6kl_vif *vif;
1452 
1453 	vif = ath6kl_vif_first(ar);
1454 	if (!vif)
1455 		return -EIO;
1456 
1457 	if (!ath6kl_cfg80211_ready(vif))
1458 		return -EIO;
1459 
1460 	if (test_bit(CONNECTED, &vif->flags)) {
1461 		ar->tx_pwr = 255;
1462 
1463 		if (ath6kl_wmi_get_tx_pwr_cmd(ar->wmi, vif->fw_vif_idx) != 0) {
1464 			ath6kl_err("ath6kl_wmi_get_tx_pwr_cmd failed\n");
1465 			return -EIO;
1466 		}
1467 
1468 		wait_event_interruptible_timeout(ar->event_wq, ar->tx_pwr != 255,
1469 						 5 * HZ);
1470 
1471 		if (signal_pending(current)) {
1472 			ath6kl_err("target did not respond\n");
1473 			return -EINTR;
1474 		}
1475 	}
1476 
1477 	*dbm = ar->tx_pwr;
1478 	return 0;
1479 }
1480 
1481 static int ath6kl_cfg80211_set_power_mgmt(struct wiphy *wiphy,
1482 					  struct net_device *dev,
1483 					  bool pmgmt, int timeout)
1484 {
1485 	struct ath6kl *ar = ath6kl_priv(dev);
1486 	struct wmi_power_mode_cmd mode;
1487 	struct ath6kl_vif *vif = netdev_priv(dev);
1488 
1489 	ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: pmgmt %d, timeout %d\n",
1490 		   __func__, pmgmt, timeout);
1491 
1492 	if (!ath6kl_cfg80211_ready(vif))
1493 		return -EIO;
1494 
1495 	if (pmgmt) {
1496 		ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: rec power\n", __func__);
1497 		mode.pwr_mode = REC_POWER;
1498 	} else {
1499 		ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: max perf\n", __func__);
1500 		mode.pwr_mode = MAX_PERF_POWER;
1501 	}
1502 
1503 	if (ath6kl_wmi_powermode_cmd(ar->wmi, vif->fw_vif_idx,
1504 				     mode.pwr_mode) != 0) {
1505 		ath6kl_err("wmi_powermode_cmd failed\n");
1506 		return -EIO;
1507 	}
1508 
1509 	return 0;
1510 }
1511 
1512 static struct wireless_dev *ath6kl_cfg80211_add_iface(struct wiphy *wiphy,
1513 						      const char *name,
1514 						      unsigned char name_assign_type,
1515 						      enum nl80211_iftype type,
1516 						      struct vif_params *params)
1517 {
1518 	struct ath6kl *ar = wiphy_priv(wiphy);
1519 	struct wireless_dev *wdev;
1520 	u8 if_idx, nw_type;
1521 
1522 	if (ar->num_vif == ar->vif_max) {
1523 		ath6kl_err("Reached maximum number of supported vif\n");
1524 		return ERR_PTR(-EINVAL);
1525 	}
1526 
1527 	if (!ath6kl_is_valid_iftype(ar, type, &if_idx, &nw_type)) {
1528 		ath6kl_err("Not a supported interface type\n");
1529 		return ERR_PTR(-EINVAL);
1530 	}
1531 
1532 	wdev = ath6kl_interface_add(ar, name, name_assign_type, type, if_idx, nw_type);
1533 	if (!wdev)
1534 		return ERR_PTR(-ENOMEM);
1535 
1536 	ar->num_vif++;
1537 
1538 	return wdev;
1539 }
1540 
1541 static int ath6kl_cfg80211_del_iface(struct wiphy *wiphy,
1542 				     struct wireless_dev *wdev)
1543 {
1544 	struct ath6kl *ar = wiphy_priv(wiphy);
1545 	struct ath6kl_vif *vif = netdev_priv(wdev->netdev);
1546 
1547 	spin_lock_bh(&ar->list_lock);
1548 	list_del(&vif->list);
1549 	spin_unlock_bh(&ar->list_lock);
1550 
1551 	ath6kl_cfg80211_vif_stop(vif, test_bit(WMI_READY, &ar->flag));
1552 
1553 	rtnl_lock();
1554 	ath6kl_cfg80211_vif_cleanup(vif);
1555 	rtnl_unlock();
1556 
1557 	return 0;
1558 }
1559 
1560 static int ath6kl_cfg80211_change_iface(struct wiphy *wiphy,
1561 					struct net_device *ndev,
1562 					enum nl80211_iftype type,
1563 					struct vif_params *params)
1564 {
1565 	struct ath6kl_vif *vif = netdev_priv(ndev);
1566 	int i;
1567 
1568 	ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: type %u\n", __func__, type);
1569 
1570 	/*
1571 	 * Don't bring up p2p on an interface which is not initialized
1572 	 * for p2p operation where fw does not have capability to switch
1573 	 * dynamically between non-p2p and p2p type interface.
1574 	 */
1575 	if (!test_bit(ATH6KL_FW_CAPABILITY_STA_P2PDEV_DUPLEX,
1576 		      vif->ar->fw_capabilities) &&
1577 	    (type == NL80211_IFTYPE_P2P_CLIENT ||
1578 	     type == NL80211_IFTYPE_P2P_GO)) {
1579 		if (vif->ar->vif_max == 1) {
1580 			if (vif->fw_vif_idx != 0)
1581 				return -EINVAL;
1582 			else
1583 				goto set_iface_type;
1584 		}
1585 
1586 		for (i = vif->ar->max_norm_iface; i < vif->ar->vif_max; i++) {
1587 			if (i == vif->fw_vif_idx)
1588 				break;
1589 		}
1590 
1591 		if (i == vif->ar->vif_max) {
1592 			ath6kl_err("Invalid interface to bring up P2P\n");
1593 			return -EINVAL;
1594 		}
1595 	}
1596 
1597 	/* need to clean up enhanced bmiss detection fw state */
1598 	ath6kl_cfg80211_sta_bmiss_enhance(vif, false);
1599 
1600 set_iface_type:
1601 	switch (type) {
1602 	case NL80211_IFTYPE_STATION:
1603 	case NL80211_IFTYPE_P2P_CLIENT:
1604 		vif->next_mode = INFRA_NETWORK;
1605 		break;
1606 	case NL80211_IFTYPE_ADHOC:
1607 		vif->next_mode = ADHOC_NETWORK;
1608 		break;
1609 	case NL80211_IFTYPE_AP:
1610 	case NL80211_IFTYPE_P2P_GO:
1611 		vif->next_mode = AP_NETWORK;
1612 		break;
1613 	default:
1614 		ath6kl_err("invalid interface type %u\n", type);
1615 		return -EOPNOTSUPP;
1616 	}
1617 
1618 	vif->wdev.iftype = type;
1619 
1620 	return 0;
1621 }
1622 
1623 static int ath6kl_cfg80211_join_ibss(struct wiphy *wiphy,
1624 				     struct net_device *dev,
1625 				     struct cfg80211_ibss_params *ibss_param)
1626 {
1627 	struct ath6kl *ar = ath6kl_priv(dev);
1628 	struct ath6kl_vif *vif = netdev_priv(dev);
1629 	int status;
1630 
1631 	if (!ath6kl_cfg80211_ready(vif))
1632 		return -EIO;
1633 
1634 	vif->ssid_len = ibss_param->ssid_len;
1635 	memcpy(vif->ssid, ibss_param->ssid, vif->ssid_len);
1636 
1637 	if (ibss_param->chandef.chan)
1638 		vif->ch_hint = ibss_param->chandef.chan->center_freq;
1639 
1640 	if (ibss_param->channel_fixed) {
1641 		/*
1642 		 * TODO: channel_fixed: The channel should be fixed, do not
1643 		 * search for IBSSs to join on other channels. Target
1644 		 * firmware does not support this feature, needs to be
1645 		 * updated.
1646 		 */
1647 		return -EOPNOTSUPP;
1648 	}
1649 
1650 	memset(vif->req_bssid, 0, sizeof(vif->req_bssid));
1651 	if (ibss_param->bssid && !is_broadcast_ether_addr(ibss_param->bssid))
1652 		memcpy(vif->req_bssid, ibss_param->bssid,
1653 		       sizeof(vif->req_bssid));
1654 
1655 	ath6kl_set_wpa_version(vif, 0);
1656 
1657 	status = ath6kl_set_auth_type(vif, NL80211_AUTHTYPE_OPEN_SYSTEM);
1658 	if (status)
1659 		return status;
1660 
1661 	if (ibss_param->privacy) {
1662 		ath6kl_set_cipher(vif, WLAN_CIPHER_SUITE_WEP40, true);
1663 		ath6kl_set_cipher(vif, WLAN_CIPHER_SUITE_WEP40, false);
1664 	} else {
1665 		ath6kl_set_cipher(vif, 0, true);
1666 		ath6kl_set_cipher(vif, 0, false);
1667 	}
1668 
1669 	vif->nw_type = vif->next_mode;
1670 
1671 	ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
1672 		   "%s: connect called with authmode %d dot11 auth %d"
1673 		   " PW crypto %d PW crypto len %d GRP crypto %d"
1674 		   " GRP crypto len %d channel hint %u\n",
1675 		   __func__,
1676 		   vif->auth_mode, vif->dot11_auth_mode, vif->prwise_crypto,
1677 		   vif->prwise_crypto_len, vif->grp_crypto,
1678 		   vif->grp_crypto_len, vif->ch_hint);
1679 
1680 	status = ath6kl_wmi_connect_cmd(ar->wmi, vif->fw_vif_idx, vif->nw_type,
1681 					vif->dot11_auth_mode, vif->auth_mode,
1682 					vif->prwise_crypto,
1683 					vif->prwise_crypto_len,
1684 					vif->grp_crypto, vif->grp_crypto_len,
1685 					vif->ssid_len, vif->ssid,
1686 					vif->req_bssid, vif->ch_hint,
1687 					ar->connect_ctrl_flags, SUBTYPE_NONE);
1688 	set_bit(CONNECT_PEND, &vif->flags);
1689 
1690 	return 0;
1691 }
1692 
1693 static int ath6kl_cfg80211_leave_ibss(struct wiphy *wiphy,
1694 				      struct net_device *dev)
1695 {
1696 	struct ath6kl_vif *vif = netdev_priv(dev);
1697 
1698 	if (!ath6kl_cfg80211_ready(vif))
1699 		return -EIO;
1700 
1701 	ath6kl_disconnect(vif);
1702 	memset(vif->ssid, 0, sizeof(vif->ssid));
1703 	vif->ssid_len = 0;
1704 
1705 	return 0;
1706 }
1707 
1708 static const u32 cipher_suites[] = {
1709 	WLAN_CIPHER_SUITE_WEP40,
1710 	WLAN_CIPHER_SUITE_WEP104,
1711 	WLAN_CIPHER_SUITE_TKIP,
1712 	WLAN_CIPHER_SUITE_CCMP,
1713 	CCKM_KRK_CIPHER_SUITE,
1714 	WLAN_CIPHER_SUITE_SMS4,
1715 };
1716 
1717 static bool is_rate_legacy(s32 rate)
1718 {
1719 	static const s32 legacy[] = { 1000, 2000, 5500, 11000,
1720 		6000, 9000, 12000, 18000, 24000,
1721 		36000, 48000, 54000
1722 	};
1723 	u8 i;
1724 
1725 	for (i = 0; i < ARRAY_SIZE(legacy); i++)
1726 		if (rate == legacy[i])
1727 			return true;
1728 
1729 	return false;
1730 }
1731 
1732 static bool is_rate_ht20(s32 rate, u8 *mcs, bool *sgi)
1733 {
1734 	static const s32 ht20[] = { 6500, 13000, 19500, 26000, 39000,
1735 		52000, 58500, 65000, 72200
1736 	};
1737 	u8 i;
1738 
1739 	for (i = 0; i < ARRAY_SIZE(ht20); i++) {
1740 		if (rate == ht20[i]) {
1741 			if (i == ARRAY_SIZE(ht20) - 1)
1742 				/* last rate uses sgi */
1743 				*sgi = true;
1744 			else
1745 				*sgi = false;
1746 
1747 			*mcs = i;
1748 			return true;
1749 		}
1750 	}
1751 	return false;
1752 }
1753 
1754 static bool is_rate_ht40(s32 rate, u8 *mcs, bool *sgi)
1755 {
1756 	static const s32 ht40[] = { 13500, 27000, 40500, 54000,
1757 		81000, 108000, 121500, 135000,
1758 		150000
1759 	};
1760 	u8 i;
1761 
1762 	for (i = 0; i < ARRAY_SIZE(ht40); i++) {
1763 		if (rate == ht40[i]) {
1764 			if (i == ARRAY_SIZE(ht40) - 1)
1765 				/* last rate uses sgi */
1766 				*sgi = true;
1767 			else
1768 				*sgi = false;
1769 
1770 			*mcs = i;
1771 			return true;
1772 		}
1773 	}
1774 
1775 	return false;
1776 }
1777 
1778 static int ath6kl_get_station(struct wiphy *wiphy, struct wireless_dev *wdev,
1779 			      const u8 *mac, struct station_info *sinfo)
1780 {
1781 	struct net_device *dev = wdev->netdev;
1782 	struct ath6kl *ar = ath6kl_priv(dev);
1783 	struct ath6kl_vif *vif = netdev_priv(dev);
1784 	long left;
1785 	bool sgi;
1786 	s32 rate;
1787 	int ret;
1788 	u8 mcs;
1789 
1790 	if (memcmp(mac, vif->bssid, ETH_ALEN) != 0)
1791 		return -ENOENT;
1792 
1793 	if (down_interruptible(&ar->sem))
1794 		return -EBUSY;
1795 
1796 	set_bit(STATS_UPDATE_PEND, &vif->flags);
1797 
1798 	ret = ath6kl_wmi_get_stats_cmd(ar->wmi, vif->fw_vif_idx);
1799 
1800 	if (ret != 0) {
1801 		up(&ar->sem);
1802 		return -EIO;
1803 	}
1804 
1805 	left = wait_event_interruptible_timeout(ar->event_wq,
1806 						!test_bit(STATS_UPDATE_PEND,
1807 							  &vif->flags),
1808 						WMI_TIMEOUT);
1809 
1810 	up(&ar->sem);
1811 
1812 	if (left == 0)
1813 		return -ETIMEDOUT;
1814 	else if (left < 0)
1815 		return left;
1816 
1817 	if (vif->target_stats.rx_byte) {
1818 		sinfo->rx_bytes = vif->target_stats.rx_byte;
1819 		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BYTES64);
1820 		sinfo->rx_packets = vif->target_stats.rx_pkt;
1821 		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_PACKETS);
1822 	}
1823 
1824 	if (vif->target_stats.tx_byte) {
1825 		sinfo->tx_bytes = vif->target_stats.tx_byte;
1826 		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BYTES64);
1827 		sinfo->tx_packets = vif->target_stats.tx_pkt;
1828 		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_PACKETS);
1829 	}
1830 
1831 	sinfo->signal = vif->target_stats.cs_rssi;
1832 	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
1833 
1834 	rate = vif->target_stats.tx_ucast_rate;
1835 
1836 	if (is_rate_legacy(rate)) {
1837 		sinfo->txrate.legacy = rate / 100;
1838 	} else if (is_rate_ht20(rate, &mcs, &sgi)) {
1839 		if (sgi) {
1840 			sinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI;
1841 			sinfo->txrate.mcs = mcs - 1;
1842 		} else {
1843 			sinfo->txrate.mcs = mcs;
1844 		}
1845 
1846 		sinfo->txrate.flags |= RATE_INFO_FLAGS_MCS;
1847 		sinfo->txrate.bw = RATE_INFO_BW_20;
1848 	} else if (is_rate_ht40(rate, &mcs, &sgi)) {
1849 		if (sgi) {
1850 			sinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI;
1851 			sinfo->txrate.mcs = mcs - 1;
1852 		} else {
1853 			sinfo->txrate.mcs = mcs;
1854 		}
1855 
1856 		sinfo->txrate.bw = RATE_INFO_BW_40;
1857 		sinfo->txrate.flags |= RATE_INFO_FLAGS_MCS;
1858 	} else {
1859 		ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
1860 			   "invalid rate from stats: %d\n", rate);
1861 		ath6kl_debug_war(ar, ATH6KL_WAR_INVALID_RATE);
1862 		return 0;
1863 	}
1864 
1865 	sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
1866 
1867 	if (test_bit(CONNECTED, &vif->flags) &&
1868 	    test_bit(DTIM_PERIOD_AVAIL, &vif->flags) &&
1869 	    vif->nw_type == INFRA_NETWORK) {
1870 		sinfo->filled |= BIT_ULL(NL80211_STA_INFO_BSS_PARAM);
1871 		sinfo->bss_param.flags = 0;
1872 		sinfo->bss_param.dtim_period = vif->assoc_bss_dtim_period;
1873 		sinfo->bss_param.beacon_interval = vif->assoc_bss_beacon_int;
1874 	}
1875 
1876 	return 0;
1877 }
1878 
1879 static int ath6kl_set_pmksa(struct wiphy *wiphy, struct net_device *netdev,
1880 			    struct cfg80211_pmksa *pmksa)
1881 {
1882 	struct ath6kl *ar = ath6kl_priv(netdev);
1883 	struct ath6kl_vif *vif = netdev_priv(netdev);
1884 
1885 	return ath6kl_wmi_setpmkid_cmd(ar->wmi, vif->fw_vif_idx, pmksa->bssid,
1886 				       pmksa->pmkid, true);
1887 }
1888 
1889 static int ath6kl_del_pmksa(struct wiphy *wiphy, struct net_device *netdev,
1890 			    struct cfg80211_pmksa *pmksa)
1891 {
1892 	struct ath6kl *ar = ath6kl_priv(netdev);
1893 	struct ath6kl_vif *vif = netdev_priv(netdev);
1894 
1895 	return ath6kl_wmi_setpmkid_cmd(ar->wmi, vif->fw_vif_idx, pmksa->bssid,
1896 				       pmksa->pmkid, false);
1897 }
1898 
1899 static int ath6kl_flush_pmksa(struct wiphy *wiphy, struct net_device *netdev)
1900 {
1901 	struct ath6kl *ar = ath6kl_priv(netdev);
1902 	struct ath6kl_vif *vif = netdev_priv(netdev);
1903 
1904 	if (test_bit(CONNECTED, &vif->flags))
1905 		return ath6kl_wmi_setpmkid_cmd(ar->wmi, vif->fw_vif_idx,
1906 					       vif->bssid, NULL, false);
1907 	return 0;
1908 }
1909 
1910 static int ath6kl_wow_usr(struct ath6kl *ar, struct ath6kl_vif *vif,
1911 			  struct cfg80211_wowlan *wow, u32 *filter)
1912 {
1913 	int ret, pos;
1914 	u8 mask[WOW_PATTERN_SIZE];
1915 	u16 i;
1916 
1917 	/* Configure the patterns that we received from the user. */
1918 	for (i = 0; i < wow->n_patterns; i++) {
1919 		/*
1920 		 * Convert given nl80211 specific mask value to equivalent
1921 		 * driver specific mask value and send it to the chip along
1922 		 * with patterns. For example, If the mask value defined in
1923 		 * struct cfg80211_wowlan is 0xA (equivalent binary is 1010),
1924 		 * then equivalent driver specific mask value is
1925 		 * "0xFF 0x00 0xFF 0x00".
1926 		 */
1927 		memset(&mask, 0, sizeof(mask));
1928 		for (pos = 0; pos < wow->patterns[i].pattern_len; pos++) {
1929 			if (wow->patterns[i].mask[pos / 8] & (0x1 << (pos % 8)))
1930 				mask[pos] = 0xFF;
1931 		}
1932 		/*
1933 		 * Note: Pattern's offset is not passed as part of wowlan
1934 		 * parameter from CFG layer. So it's always passed as ZERO
1935 		 * to the firmware. It means, given WOW patterns are always
1936 		 * matched from the first byte of received pkt in the firmware.
1937 		 */
1938 		ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi,
1939 				vif->fw_vif_idx, WOW_LIST_ID,
1940 				wow->patterns[i].pattern_len,
1941 				0 /* pattern offset */,
1942 				wow->patterns[i].pattern, mask);
1943 		if (ret)
1944 			return ret;
1945 	}
1946 
1947 	if (wow->disconnect)
1948 		*filter |= WOW_FILTER_OPTION_NWK_DISASSOC;
1949 
1950 	if (wow->magic_pkt)
1951 		*filter |= WOW_FILTER_OPTION_MAGIC_PACKET;
1952 
1953 	if (wow->gtk_rekey_failure)
1954 		*filter |= WOW_FILTER_OPTION_GTK_ERROR;
1955 
1956 	if (wow->eap_identity_req)
1957 		*filter |= WOW_FILTER_OPTION_EAP_REQ;
1958 
1959 	if (wow->four_way_handshake)
1960 		*filter |= WOW_FILTER_OPTION_8021X_4WAYHS;
1961 
1962 	return 0;
1963 }
1964 
1965 static int ath6kl_wow_ap(struct ath6kl *ar, struct ath6kl_vif *vif)
1966 {
1967 	static const u8 unicst_pattern[] = { 0x00, 0x00, 0x00,
1968 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1969 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1970 		0x00, 0x08 };
1971 	static const u8 unicst_mask[] = { 0x01, 0x00, 0x00,
1972 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1973 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1974 		0x00, 0x7f };
1975 	u8 unicst_offset = 0;
1976 	static const u8 arp_pattern[] = { 0x08, 0x06 };
1977 	static const u8 arp_mask[] = { 0xff, 0xff };
1978 	u8 arp_offset = 20;
1979 	static const u8 discvr_pattern[] = { 0xe0, 0x00, 0x00, 0xf8 };
1980 	static const u8 discvr_mask[] = { 0xf0, 0x00, 0x00, 0xf8 };
1981 	u8 discvr_offset = 38;
1982 	static const u8 dhcp_pattern[] = { 0xff, 0xff, 0xff, 0xff,
1983 		0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1984 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
1985 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1986 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1987 		0x00, 0x00, 0x00, 0x00, 0x00, 0x43 /* port 67 */ };
1988 	static const u8 dhcp_mask[] = { 0xff, 0xff, 0xff, 0xff,
1989 		0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1990 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
1991 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1992 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1993 		0x00, 0x00, 0x00, 0x00, 0xff, 0xff /* port 67 */ };
1994 	u8 dhcp_offset = 0;
1995 	int ret;
1996 
1997 	/* Setup unicast IP, EAPOL-like and ARP pkt pattern */
1998 	ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi,
1999 			vif->fw_vif_idx, WOW_LIST_ID,
2000 			sizeof(unicst_pattern), unicst_offset,
2001 			unicst_pattern, unicst_mask);
2002 	if (ret) {
2003 		ath6kl_err("failed to add WOW unicast IP pattern\n");
2004 		return ret;
2005 	}
2006 
2007 	/* Setup all ARP pkt pattern */
2008 	ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi,
2009 			vif->fw_vif_idx, WOW_LIST_ID,
2010 			sizeof(arp_pattern), arp_offset,
2011 			arp_pattern, arp_mask);
2012 	if (ret) {
2013 		ath6kl_err("failed to add WOW ARP pattern\n");
2014 		return ret;
2015 	}
2016 
2017 	/*
2018 	 * Setup multicast pattern for mDNS 224.0.0.251,
2019 	 * SSDP 239.255.255.250 and LLMNR  224.0.0.252
2020 	 */
2021 	ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi,
2022 			vif->fw_vif_idx, WOW_LIST_ID,
2023 			sizeof(discvr_pattern), discvr_offset,
2024 			discvr_pattern, discvr_mask);
2025 	if (ret) {
2026 		ath6kl_err("failed to add WOW mDNS/SSDP/LLMNR pattern\n");
2027 		return ret;
2028 	}
2029 
2030 	/* Setup all DHCP broadcast pkt pattern */
2031 	ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi,
2032 			vif->fw_vif_idx, WOW_LIST_ID,
2033 			sizeof(dhcp_pattern), dhcp_offset,
2034 			dhcp_pattern, dhcp_mask);
2035 	if (ret) {
2036 		ath6kl_err("failed to add WOW DHCP broadcast pattern\n");
2037 		return ret;
2038 	}
2039 
2040 	return 0;
2041 }
2042 
2043 static int ath6kl_wow_sta(struct ath6kl *ar, struct ath6kl_vif *vif)
2044 {
2045 	struct net_device *ndev = vif->ndev;
2046 	static const u8 discvr_pattern[] = { 0xe0, 0x00, 0x00, 0xf8 };
2047 	static const u8 discvr_mask[] = { 0xf0, 0x00, 0x00, 0xf8 };
2048 	u8 discvr_offset = 38;
2049 	u8 mac_mask[ETH_ALEN];
2050 	int ret;
2051 
2052 	/* Setup unicast pkt pattern */
2053 	eth_broadcast_addr(mac_mask);
2054 	ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi,
2055 				vif->fw_vif_idx, WOW_LIST_ID,
2056 				ETH_ALEN, 0, ndev->dev_addr,
2057 				mac_mask);
2058 	if (ret) {
2059 		ath6kl_err("failed to add WOW unicast pattern\n");
2060 		return ret;
2061 	}
2062 
2063 	/*
2064 	 * Setup multicast pattern for mDNS 224.0.0.251,
2065 	 * SSDP 239.255.255.250 and LLMNR 224.0.0.252
2066 	 */
2067 	if ((ndev->flags & IFF_ALLMULTI) ||
2068 	    (ndev->flags & IFF_MULTICAST && netdev_mc_count(ndev) > 0)) {
2069 		ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi,
2070 				vif->fw_vif_idx, WOW_LIST_ID,
2071 				sizeof(discvr_pattern), discvr_offset,
2072 				discvr_pattern, discvr_mask);
2073 		if (ret) {
2074 			ath6kl_err("failed to add WOW mDNS/SSDP/LLMNR pattern\n");
2075 			return ret;
2076 		}
2077 	}
2078 
2079 	return 0;
2080 }
2081 
2082 static int is_hsleep_mode_procsed(struct ath6kl_vif *vif)
2083 {
2084 	return test_bit(HOST_SLEEP_MODE_CMD_PROCESSED, &vif->flags);
2085 }
2086 
2087 static bool is_ctrl_ep_empty(struct ath6kl *ar)
2088 {
2089 	return !ar->tx_pending[ar->ctrl_ep];
2090 }
2091 
2092 static int ath6kl_cfg80211_host_sleep(struct ath6kl *ar, struct ath6kl_vif *vif)
2093 {
2094 	int ret, left;
2095 
2096 	clear_bit(HOST_SLEEP_MODE_CMD_PROCESSED, &vif->flags);
2097 
2098 	ret = ath6kl_wmi_set_host_sleep_mode_cmd(ar->wmi, vif->fw_vif_idx,
2099 						 ATH6KL_HOST_MODE_ASLEEP);
2100 	if (ret)
2101 		return ret;
2102 
2103 	left = wait_event_interruptible_timeout(ar->event_wq,
2104 						is_hsleep_mode_procsed(vif),
2105 						WMI_TIMEOUT);
2106 	if (left == 0) {
2107 		ath6kl_warn("timeout, didn't get host sleep cmd processed event\n");
2108 		ret = -ETIMEDOUT;
2109 	} else if (left < 0) {
2110 		ath6kl_warn("error while waiting for host sleep cmd processed event %d\n",
2111 			    left);
2112 		ret = left;
2113 	}
2114 
2115 	if (ar->tx_pending[ar->ctrl_ep]) {
2116 		left = wait_event_interruptible_timeout(ar->event_wq,
2117 							is_ctrl_ep_empty(ar),
2118 							WMI_TIMEOUT);
2119 		if (left == 0) {
2120 			ath6kl_warn("clear wmi ctrl data timeout\n");
2121 			ret = -ETIMEDOUT;
2122 		} else if (left < 0) {
2123 			ath6kl_warn("clear wmi ctrl data failed: %d\n", left);
2124 			ret = left;
2125 		}
2126 	}
2127 
2128 	return ret;
2129 }
2130 
2131 static int ath6kl_wow_suspend_vif(struct ath6kl_vif *vif,
2132 				  struct cfg80211_wowlan *wow, u32 *filter)
2133 {
2134 	struct ath6kl *ar = vif->ar;
2135 	struct in_device *in_dev;
2136 	struct in_ifaddr *ifa;
2137 	int ret;
2138 	u16 i, bmiss_time;
2139 	__be32 ips[MAX_IP_ADDRS];
2140 	u8 index = 0;
2141 
2142 	if (!test_bit(NETDEV_MCAST_ALL_ON, &vif->flags) &&
2143 	    test_bit(ATH6KL_FW_CAPABILITY_WOW_MULTICAST_FILTER,
2144 		     ar->fw_capabilities)) {
2145 		ret = ath6kl_wmi_mcast_filter_cmd(vif->ar->wmi,
2146 						vif->fw_vif_idx, false);
2147 		if (ret)
2148 			return ret;
2149 	}
2150 
2151 	/* Clear existing WOW patterns */
2152 	for (i = 0; i < WOW_MAX_FILTERS_PER_LIST; i++)
2153 		ath6kl_wmi_del_wow_pattern_cmd(ar->wmi, vif->fw_vif_idx,
2154 					       WOW_LIST_ID, i);
2155 
2156 	/*
2157 	 * Skip the default WOW pattern configuration
2158 	 * if the driver receives any WOW patterns from
2159 	 * the user.
2160 	 */
2161 	if (wow)
2162 		ret = ath6kl_wow_usr(ar, vif, wow, filter);
2163 	else if (vif->nw_type == AP_NETWORK)
2164 		ret = ath6kl_wow_ap(ar, vif);
2165 	else
2166 		ret = ath6kl_wow_sta(ar, vif);
2167 
2168 	if (ret)
2169 		return ret;
2170 
2171 	netif_stop_queue(vif->ndev);
2172 
2173 	if (vif->nw_type != AP_NETWORK) {
2174 		ret = ath6kl_wmi_listeninterval_cmd(ar->wmi, vif->fw_vif_idx,
2175 						    ATH6KL_MAX_WOW_LISTEN_INTL,
2176 						    0);
2177 		if (ret)
2178 			return ret;
2179 
2180 		/* Set listen interval x 15 times as bmiss time */
2181 		bmiss_time = ATH6KL_MAX_WOW_LISTEN_INTL * 15;
2182 		if (bmiss_time > ATH6KL_MAX_BMISS_TIME)
2183 			bmiss_time = ATH6KL_MAX_BMISS_TIME;
2184 
2185 		ret = ath6kl_wmi_bmisstime_cmd(ar->wmi, vif->fw_vif_idx,
2186 					       bmiss_time, 0);
2187 		if (ret)
2188 			return ret;
2189 
2190 		ret = ath6kl_wmi_scanparams_cmd(ar->wmi, vif->fw_vif_idx,
2191 						0xFFFF, 0, 0xFFFF, 0, 0, 0,
2192 						0, 0, 0, 0);
2193 		if (ret)
2194 			return ret;
2195 	}
2196 
2197 	/* Setup own IP addr for ARP agent. */
2198 	in_dev = __in_dev_get_rtnl(vif->ndev);
2199 	if (!in_dev)
2200 		return 0;
2201 
2202 	ifa = rtnl_dereference(in_dev->ifa_list);
2203 	memset(&ips, 0, sizeof(ips));
2204 
2205 	/* Configure IP addr only if IP address count < MAX_IP_ADDRS */
2206 	while (index < MAX_IP_ADDRS && ifa) {
2207 		ips[index] = ifa->ifa_local;
2208 		ifa = rtnl_dereference(ifa->ifa_next);
2209 		index++;
2210 	}
2211 
2212 	if (ifa) {
2213 		ath6kl_err("total IP addr count is exceeding fw limit\n");
2214 		return -EINVAL;
2215 	}
2216 
2217 	ret = ath6kl_wmi_set_ip_cmd(ar->wmi, vif->fw_vif_idx, ips[0], ips[1]);
2218 	if (ret) {
2219 		ath6kl_err("fail to setup ip for arp agent\n");
2220 		return ret;
2221 	}
2222 
2223 	return ret;
2224 }
2225 
2226 static int ath6kl_wow_suspend(struct ath6kl *ar, struct cfg80211_wowlan *wow)
2227 {
2228 	struct ath6kl_vif *first_vif, *vif;
2229 	int ret = 0;
2230 	u32 filter = 0;
2231 	bool connected = false;
2232 
2233 	/* enter / leave wow suspend on first vif always */
2234 	first_vif = ath6kl_vif_first(ar);
2235 	if (WARN_ON(!first_vif) ||
2236 	    !ath6kl_cfg80211_ready(first_vif))
2237 		return -EIO;
2238 
2239 	if (wow && (wow->n_patterns > WOW_MAX_FILTERS_PER_LIST))
2240 		return -EINVAL;
2241 
2242 	/* install filters for each connected vif */
2243 	spin_lock_bh(&ar->list_lock);
2244 	list_for_each_entry(vif, &ar->vif_list, list) {
2245 		if (!test_bit(CONNECTED, &vif->flags) ||
2246 		    !ath6kl_cfg80211_ready(vif))
2247 			continue;
2248 		connected = true;
2249 
2250 		ret = ath6kl_wow_suspend_vif(vif, wow, &filter);
2251 		if (ret)
2252 			break;
2253 	}
2254 	spin_unlock_bh(&ar->list_lock);
2255 
2256 	if (!connected)
2257 		return -ENOTCONN;
2258 	else if (ret)
2259 		return ret;
2260 
2261 	ar->state = ATH6KL_STATE_SUSPENDING;
2262 
2263 	ret = ath6kl_wmi_set_wow_mode_cmd(ar->wmi, first_vif->fw_vif_idx,
2264 					  ATH6KL_WOW_MODE_ENABLE,
2265 					  filter,
2266 					  WOW_HOST_REQ_DELAY);
2267 	if (ret)
2268 		return ret;
2269 
2270 	return ath6kl_cfg80211_host_sleep(ar, first_vif);
2271 }
2272 
2273 static int ath6kl_wow_resume_vif(struct ath6kl_vif *vif)
2274 {
2275 	struct ath6kl *ar = vif->ar;
2276 	int ret;
2277 
2278 	if (vif->nw_type != AP_NETWORK) {
2279 		ret = ath6kl_wmi_scanparams_cmd(ar->wmi, vif->fw_vif_idx,
2280 						0, 0, 0, 0, 0, 0, 3, 0, 0, 0);
2281 		if (ret)
2282 			return ret;
2283 
2284 		ret = ath6kl_wmi_listeninterval_cmd(ar->wmi, vif->fw_vif_idx,
2285 						    vif->listen_intvl_t, 0);
2286 		if (ret)
2287 			return ret;
2288 
2289 		ret = ath6kl_wmi_bmisstime_cmd(ar->wmi, vif->fw_vif_idx,
2290 					       vif->bmiss_time_t, 0);
2291 		if (ret)
2292 			return ret;
2293 	}
2294 
2295 	if (!test_bit(NETDEV_MCAST_ALL_OFF, &vif->flags) &&
2296 	    test_bit(ATH6KL_FW_CAPABILITY_WOW_MULTICAST_FILTER,
2297 		     ar->fw_capabilities)) {
2298 		ret = ath6kl_wmi_mcast_filter_cmd(vif->ar->wmi,
2299 						  vif->fw_vif_idx, true);
2300 		if (ret)
2301 			return ret;
2302 	}
2303 
2304 	netif_wake_queue(vif->ndev);
2305 
2306 	return 0;
2307 }
2308 
2309 static int ath6kl_wow_resume(struct ath6kl *ar)
2310 {
2311 	struct ath6kl_vif *vif;
2312 	int ret;
2313 
2314 	vif = ath6kl_vif_first(ar);
2315 	if (WARN_ON(!vif) ||
2316 	    !ath6kl_cfg80211_ready(vif))
2317 		return -EIO;
2318 
2319 	ar->state = ATH6KL_STATE_RESUMING;
2320 
2321 	ret = ath6kl_wmi_set_host_sleep_mode_cmd(ar->wmi, vif->fw_vif_idx,
2322 						 ATH6KL_HOST_MODE_AWAKE);
2323 	if (ret) {
2324 		ath6kl_warn("Failed to configure host sleep mode for wow resume: %d\n",
2325 			    ret);
2326 		goto cleanup;
2327 	}
2328 
2329 	spin_lock_bh(&ar->list_lock);
2330 	list_for_each_entry(vif, &ar->vif_list, list) {
2331 		if (!test_bit(CONNECTED, &vif->flags) ||
2332 		    !ath6kl_cfg80211_ready(vif))
2333 			continue;
2334 		ret = ath6kl_wow_resume_vif(vif);
2335 		if (ret)
2336 			break;
2337 	}
2338 	spin_unlock_bh(&ar->list_lock);
2339 
2340 	if (ret)
2341 		goto cleanup;
2342 
2343 	ar->state = ATH6KL_STATE_ON;
2344 	return 0;
2345 
2346 cleanup:
2347 	ar->state = ATH6KL_STATE_WOW;
2348 	return ret;
2349 }
2350 
2351 static int ath6kl_cfg80211_deepsleep_suspend(struct ath6kl *ar)
2352 {
2353 	struct ath6kl_vif *vif;
2354 	int ret;
2355 
2356 	vif = ath6kl_vif_first(ar);
2357 	if (!vif)
2358 		return -EIO;
2359 
2360 	if (!test_bit(WMI_READY, &ar->flag)) {
2361 		ath6kl_err("deepsleep failed as wmi is not ready\n");
2362 		return -EIO;
2363 	}
2364 
2365 	ath6kl_cfg80211_stop_all(ar);
2366 
2367 	/* Save the current power mode before enabling power save */
2368 	ar->wmi->saved_pwr_mode = ar->wmi->pwr_mode;
2369 
2370 	ret = ath6kl_wmi_powermode_cmd(ar->wmi, 0, REC_POWER);
2371 	if (ret)
2372 		return ret;
2373 
2374 	/* Disable WOW mode */
2375 	ret = ath6kl_wmi_set_wow_mode_cmd(ar->wmi, vif->fw_vif_idx,
2376 					  ATH6KL_WOW_MODE_DISABLE,
2377 					  0, 0);
2378 	if (ret)
2379 		return ret;
2380 
2381 	/* Flush all non control pkts in TX path */
2382 	ath6kl_tx_data_cleanup(ar);
2383 
2384 	ret = ath6kl_cfg80211_host_sleep(ar, vif);
2385 	if (ret)
2386 		return ret;
2387 
2388 	return 0;
2389 }
2390 
2391 static int ath6kl_cfg80211_deepsleep_resume(struct ath6kl *ar)
2392 {
2393 	struct ath6kl_vif *vif;
2394 	int ret;
2395 
2396 	vif = ath6kl_vif_first(ar);
2397 
2398 	if (!vif)
2399 		return -EIO;
2400 
2401 	if (ar->wmi->pwr_mode != ar->wmi->saved_pwr_mode) {
2402 		ret = ath6kl_wmi_powermode_cmd(ar->wmi, 0,
2403 					       ar->wmi->saved_pwr_mode);
2404 		if (ret)
2405 			return ret;
2406 	}
2407 
2408 	ret = ath6kl_wmi_set_host_sleep_mode_cmd(ar->wmi, vif->fw_vif_idx,
2409 						 ATH6KL_HOST_MODE_AWAKE);
2410 	if (ret)
2411 		return ret;
2412 
2413 	ar->state = ATH6KL_STATE_ON;
2414 
2415 	/* Reset scan parameter to default values */
2416 	ret = ath6kl_wmi_scanparams_cmd(ar->wmi, vif->fw_vif_idx,
2417 					0, 0, 0, 0, 0, 0, 3, 0, 0, 0);
2418 	if (ret)
2419 		return ret;
2420 
2421 	return 0;
2422 }
2423 
2424 int ath6kl_cfg80211_suspend(struct ath6kl *ar,
2425 			    enum ath6kl_cfg_suspend_mode mode,
2426 			    struct cfg80211_wowlan *wow)
2427 {
2428 	struct ath6kl_vif *vif;
2429 	enum ath6kl_state prev_state;
2430 	int ret;
2431 
2432 	switch (mode) {
2433 	case ATH6KL_CFG_SUSPEND_WOW:
2434 
2435 		ath6kl_dbg(ATH6KL_DBG_SUSPEND, "wow mode suspend\n");
2436 
2437 		/* Flush all non control pkts in TX path */
2438 		ath6kl_tx_data_cleanup(ar);
2439 
2440 		prev_state = ar->state;
2441 
2442 		ret = ath6kl_wow_suspend(ar, wow);
2443 		if (ret) {
2444 			ar->state = prev_state;
2445 			return ret;
2446 		}
2447 
2448 		ar->state = ATH6KL_STATE_WOW;
2449 		break;
2450 
2451 	case ATH6KL_CFG_SUSPEND_DEEPSLEEP:
2452 
2453 		ath6kl_dbg(ATH6KL_DBG_SUSPEND, "deep sleep suspend\n");
2454 
2455 		ret = ath6kl_cfg80211_deepsleep_suspend(ar);
2456 		if (ret) {
2457 			ath6kl_err("deepsleep suspend failed: %d\n", ret);
2458 			return ret;
2459 		}
2460 
2461 		ar->state = ATH6KL_STATE_DEEPSLEEP;
2462 
2463 		break;
2464 
2465 	case ATH6KL_CFG_SUSPEND_CUTPOWER:
2466 
2467 		ath6kl_cfg80211_stop_all(ar);
2468 
2469 		if (ar->state == ATH6KL_STATE_OFF) {
2470 			ath6kl_dbg(ATH6KL_DBG_SUSPEND,
2471 				   "suspend hw off, no action for cutpower\n");
2472 			break;
2473 		}
2474 
2475 		ath6kl_dbg(ATH6KL_DBG_SUSPEND, "suspend cutting power\n");
2476 
2477 		ret = ath6kl_init_hw_stop(ar);
2478 		if (ret) {
2479 			ath6kl_warn("failed to stop hw during suspend: %d\n",
2480 				    ret);
2481 		}
2482 
2483 		ar->state = ATH6KL_STATE_CUTPOWER;
2484 
2485 		break;
2486 
2487 	default:
2488 		break;
2489 	}
2490 
2491 	list_for_each_entry(vif, &ar->vif_list, list)
2492 		ath6kl_cfg80211_scan_complete_event(vif, true);
2493 
2494 	return 0;
2495 }
2496 EXPORT_SYMBOL(ath6kl_cfg80211_suspend);
2497 
2498 int ath6kl_cfg80211_resume(struct ath6kl *ar)
2499 {
2500 	int ret;
2501 
2502 	switch (ar->state) {
2503 	case  ATH6KL_STATE_WOW:
2504 		ath6kl_dbg(ATH6KL_DBG_SUSPEND, "wow mode resume\n");
2505 
2506 		ret = ath6kl_wow_resume(ar);
2507 		if (ret) {
2508 			ath6kl_warn("wow mode resume failed: %d\n", ret);
2509 			return ret;
2510 		}
2511 
2512 		break;
2513 
2514 	case ATH6KL_STATE_DEEPSLEEP:
2515 		ath6kl_dbg(ATH6KL_DBG_SUSPEND, "deep sleep resume\n");
2516 
2517 		ret = ath6kl_cfg80211_deepsleep_resume(ar);
2518 		if (ret) {
2519 			ath6kl_warn("deep sleep resume failed: %d\n", ret);
2520 			return ret;
2521 		}
2522 		break;
2523 
2524 	case ATH6KL_STATE_CUTPOWER:
2525 		ath6kl_dbg(ATH6KL_DBG_SUSPEND, "resume restoring power\n");
2526 
2527 		ret = ath6kl_init_hw_start(ar);
2528 		if (ret) {
2529 			ath6kl_warn("Failed to boot hw in resume: %d\n", ret);
2530 			return ret;
2531 		}
2532 		break;
2533 
2534 	default:
2535 		break;
2536 	}
2537 
2538 	return 0;
2539 }
2540 EXPORT_SYMBOL(ath6kl_cfg80211_resume);
2541 
2542 #ifdef CONFIG_PM
2543 
2544 /* hif layer decides what suspend mode to use */
2545 static int __ath6kl_cfg80211_suspend(struct wiphy *wiphy,
2546 				 struct cfg80211_wowlan *wow)
2547 {
2548 	struct ath6kl *ar = wiphy_priv(wiphy);
2549 
2550 	ath6kl_recovery_suspend(ar);
2551 
2552 	return ath6kl_hif_suspend(ar, wow);
2553 }
2554 
2555 static int __ath6kl_cfg80211_resume(struct wiphy *wiphy)
2556 {
2557 	struct ath6kl *ar = wiphy_priv(wiphy);
2558 	int err;
2559 
2560 	err = ath6kl_hif_resume(ar);
2561 	if (err)
2562 		return err;
2563 
2564 	ath6kl_recovery_resume(ar);
2565 
2566 	return 0;
2567 }
2568 
2569 /*
2570  * FIXME: WOW suspend mode is selected if the host sdio controller supports
2571  * both sdio irq wake up and keep power. The target pulls sdio data line to
2572  * wake up the host when WOW pattern matches. This causes sdio irq handler
2573  * is being called in the host side which internally hits ath6kl's RX path.
2574  *
2575  * Since sdio interrupt is not disabled, RX path executes even before
2576  * the host executes the actual resume operation from PM module.
2577  *
2578  * In the current scenario, WOW resume should happen before start processing
2579  * any data from the target. So It's required to perform WOW resume in RX path.
2580  * Ideally we should perform WOW resume only in the actual platform
2581  * resume path. This area needs bit rework to avoid WOW resume in RX path.
2582  *
2583  * ath6kl_check_wow_status() is called from ath6kl_rx().
2584  */
2585 void ath6kl_check_wow_status(struct ath6kl *ar)
2586 {
2587 	if (ar->state == ATH6KL_STATE_SUSPENDING)
2588 		return;
2589 
2590 	if (ar->state == ATH6KL_STATE_WOW)
2591 		ath6kl_cfg80211_resume(ar);
2592 }
2593 
2594 #else
2595 
2596 void ath6kl_check_wow_status(struct ath6kl *ar)
2597 {
2598 }
2599 #endif
2600 
2601 static int ath6kl_set_htcap(struct ath6kl_vif *vif, enum nl80211_band band,
2602 			    bool ht_enable)
2603 {
2604 	struct ath6kl_htcap *htcap = &vif->htcap[band];
2605 
2606 	if (htcap->ht_enable == ht_enable)
2607 		return 0;
2608 
2609 	if (ht_enable) {
2610 		/* Set default ht capabilities */
2611 		htcap->ht_enable = true;
2612 		htcap->cap_info = (band == NL80211_BAND_2GHZ) ?
2613 				   ath6kl_g_htcap : ath6kl_a_htcap;
2614 		htcap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_16K;
2615 	} else /* Disable ht */
2616 		memset(htcap, 0, sizeof(*htcap));
2617 
2618 	return ath6kl_wmi_set_htcap_cmd(vif->ar->wmi, vif->fw_vif_idx,
2619 					band, htcap);
2620 }
2621 
2622 static int ath6kl_restore_htcap(struct ath6kl_vif *vif)
2623 {
2624 	struct wiphy *wiphy = vif->ar->wiphy;
2625 	int band, ret = 0;
2626 
2627 	for (band = 0; band < NUM_NL80211_BANDS; band++) {
2628 		if (!wiphy->bands[band])
2629 			continue;
2630 
2631 		ret = ath6kl_set_htcap(vif, band,
2632 				wiphy->bands[band]->ht_cap.ht_supported);
2633 		if (ret)
2634 			return ret;
2635 	}
2636 
2637 	return ret;
2638 }
2639 
2640 static bool ath6kl_is_p2p_ie(const u8 *pos)
2641 {
2642 	return pos[0] == WLAN_EID_VENDOR_SPECIFIC && pos[1] >= 4 &&
2643 		pos[2] == 0x50 && pos[3] == 0x6f &&
2644 		pos[4] == 0x9a && pos[5] == 0x09;
2645 }
2646 
2647 static int ath6kl_set_ap_probe_resp_ies(struct ath6kl_vif *vif,
2648 					const u8 *ies, size_t ies_len)
2649 {
2650 	struct ath6kl *ar = vif->ar;
2651 	const u8 *pos;
2652 	u8 *buf = NULL;
2653 	size_t len = 0;
2654 	int ret;
2655 
2656 	/*
2657 	 * Filter out P2P IE(s) since they will be included depending on
2658 	 * the Probe Request frame in ath6kl_send_go_probe_resp().
2659 	 */
2660 
2661 	if (ies && ies_len) {
2662 		buf = kmalloc(ies_len, GFP_KERNEL);
2663 		if (buf == NULL)
2664 			return -ENOMEM;
2665 		pos = ies;
2666 		while (pos + 1 < ies + ies_len) {
2667 			if (pos + 2 + pos[1] > ies + ies_len)
2668 				break;
2669 			if (!ath6kl_is_p2p_ie(pos)) {
2670 				memcpy(buf + len, pos, 2 + pos[1]);
2671 				len += 2 + pos[1];
2672 			}
2673 			pos += 2 + pos[1];
2674 		}
2675 	}
2676 
2677 	ret = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx,
2678 				       WMI_FRAME_PROBE_RESP, buf, len);
2679 	kfree(buf);
2680 	return ret;
2681 }
2682 
2683 static int ath6kl_set_ies(struct ath6kl_vif *vif,
2684 			  struct cfg80211_beacon_data *info)
2685 {
2686 	struct ath6kl *ar = vif->ar;
2687 	int res;
2688 
2689 	/* this also clears IE in fw if it's not set */
2690 	res = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx,
2691 				       WMI_FRAME_BEACON,
2692 				       info->beacon_ies,
2693 				       info->beacon_ies_len);
2694 	if (res)
2695 		return res;
2696 
2697 	/* this also clears IE in fw if it's not set */
2698 	res = ath6kl_set_ap_probe_resp_ies(vif, info->proberesp_ies,
2699 					   info->proberesp_ies_len);
2700 	if (res)
2701 		return res;
2702 
2703 	/* this also clears IE in fw if it's not set */
2704 	res = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx,
2705 				       WMI_FRAME_ASSOC_RESP,
2706 				       info->assocresp_ies,
2707 				       info->assocresp_ies_len);
2708 	if (res)
2709 		return res;
2710 
2711 	return 0;
2712 }
2713 
2714 static int ath6kl_get_rsn_capab(struct cfg80211_beacon_data *beacon,
2715 				u8 *rsn_capab)
2716 {
2717 	const u8 *rsn_ie;
2718 	size_t rsn_ie_len;
2719 	u16 cnt;
2720 
2721 	if (!beacon->tail)
2722 		return -EINVAL;
2723 
2724 	rsn_ie = cfg80211_find_ie(WLAN_EID_RSN, beacon->tail, beacon->tail_len);
2725 	if (!rsn_ie)
2726 		return -EINVAL;
2727 
2728 	rsn_ie_len = *(rsn_ie + 1);
2729 	/* skip element id and length */
2730 	rsn_ie += 2;
2731 
2732 	/* skip version */
2733 	if (rsn_ie_len < 2)
2734 		return -EINVAL;
2735 	rsn_ie +=  2;
2736 	rsn_ie_len -= 2;
2737 
2738 	/* skip group cipher suite */
2739 	if (rsn_ie_len < 4)
2740 		return 0;
2741 	rsn_ie +=  4;
2742 	rsn_ie_len -= 4;
2743 
2744 	/* skip pairwise cipher suite */
2745 	if (rsn_ie_len < 2)
2746 		return 0;
2747 	cnt = get_unaligned_le16(rsn_ie);
2748 	rsn_ie += (2 + cnt * 4);
2749 	rsn_ie_len -= (2 + cnt * 4);
2750 
2751 	/* skip akm suite */
2752 	if (rsn_ie_len < 2)
2753 		return 0;
2754 	cnt = get_unaligned_le16(rsn_ie);
2755 	rsn_ie += (2 + cnt * 4);
2756 	rsn_ie_len -= (2 + cnt * 4);
2757 
2758 	if (rsn_ie_len < 2)
2759 		return 0;
2760 
2761 	memcpy(rsn_capab, rsn_ie, 2);
2762 
2763 	return 0;
2764 }
2765 
2766 static int ath6kl_start_ap(struct wiphy *wiphy, struct net_device *dev,
2767 			   struct cfg80211_ap_settings *info)
2768 {
2769 	struct ath6kl *ar = ath6kl_priv(dev);
2770 	struct ath6kl_vif *vif = netdev_priv(dev);
2771 	struct ieee80211_mgmt *mgmt;
2772 	bool hidden = false;
2773 	u8 *ies;
2774 	struct wmi_connect_cmd p;
2775 	int res;
2776 	int i, ret;
2777 	u16 rsn_capab = 0;
2778 	int inactivity_timeout = 0;
2779 
2780 	ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s:\n", __func__);
2781 
2782 	if (!ath6kl_cfg80211_ready(vif))
2783 		return -EIO;
2784 
2785 	if (vif->next_mode != AP_NETWORK)
2786 		return -EOPNOTSUPP;
2787 
2788 	res = ath6kl_set_ies(vif, &info->beacon);
2789 
2790 	ar->ap_mode_bkey.valid = false;
2791 
2792 	ret = ath6kl_wmi_ap_set_beacon_intvl_cmd(ar->wmi, vif->fw_vif_idx,
2793 						 info->beacon_interval);
2794 
2795 	if (ret)
2796 		ath6kl_warn("Failed to set beacon interval: %d\n", ret);
2797 
2798 	ret = ath6kl_wmi_ap_set_dtim_cmd(ar->wmi, vif->fw_vif_idx,
2799 					 info->dtim_period);
2800 
2801 	/* ignore error, just print a warning and continue normally */
2802 	if (ret)
2803 		ath6kl_warn("Failed to set dtim_period in beacon: %d\n", ret);
2804 
2805 	if (info->beacon.head == NULL)
2806 		return -EINVAL;
2807 	mgmt = (struct ieee80211_mgmt *) info->beacon.head;
2808 	ies = mgmt->u.beacon.variable;
2809 	if (ies > info->beacon.head + info->beacon.head_len)
2810 		return -EINVAL;
2811 
2812 	if (info->ssid == NULL)
2813 		return -EINVAL;
2814 	memcpy(vif->ssid, info->ssid, info->ssid_len);
2815 	vif->ssid_len = info->ssid_len;
2816 	if (info->hidden_ssid != NL80211_HIDDEN_SSID_NOT_IN_USE)
2817 		hidden = true;
2818 
2819 	res = ath6kl_wmi_ap_hidden_ssid(ar->wmi, vif->fw_vif_idx, hidden);
2820 	if (res)
2821 		return res;
2822 
2823 	ret = ath6kl_set_auth_type(vif, info->auth_type);
2824 	if (ret)
2825 		return ret;
2826 
2827 	memset(&p, 0, sizeof(p));
2828 
2829 	for (i = 0; i < info->crypto.n_akm_suites; i++) {
2830 		switch (info->crypto.akm_suites[i]) {
2831 		case WLAN_AKM_SUITE_8021X:
2832 			if (info->crypto.wpa_versions & NL80211_WPA_VERSION_1)
2833 				p.auth_mode |= WPA_AUTH;
2834 			if (info->crypto.wpa_versions & NL80211_WPA_VERSION_2)
2835 				p.auth_mode |= WPA2_AUTH;
2836 			break;
2837 		case WLAN_AKM_SUITE_PSK:
2838 			if (info->crypto.wpa_versions & NL80211_WPA_VERSION_1)
2839 				p.auth_mode |= WPA_PSK_AUTH;
2840 			if (info->crypto.wpa_versions & NL80211_WPA_VERSION_2)
2841 				p.auth_mode |= WPA2_PSK_AUTH;
2842 			break;
2843 		}
2844 	}
2845 	if (p.auth_mode == 0)
2846 		p.auth_mode = NONE_AUTH;
2847 	vif->auth_mode = p.auth_mode;
2848 
2849 	for (i = 0; i < info->crypto.n_ciphers_pairwise; i++) {
2850 		switch (info->crypto.ciphers_pairwise[i]) {
2851 		case WLAN_CIPHER_SUITE_WEP40:
2852 		case WLAN_CIPHER_SUITE_WEP104:
2853 			p.prwise_crypto_type |= WEP_CRYPT;
2854 			break;
2855 		case WLAN_CIPHER_SUITE_TKIP:
2856 			p.prwise_crypto_type |= TKIP_CRYPT;
2857 			break;
2858 		case WLAN_CIPHER_SUITE_CCMP:
2859 			p.prwise_crypto_type |= AES_CRYPT;
2860 			break;
2861 		case WLAN_CIPHER_SUITE_SMS4:
2862 			p.prwise_crypto_type |= WAPI_CRYPT;
2863 			break;
2864 		}
2865 	}
2866 	if (p.prwise_crypto_type == 0) {
2867 		p.prwise_crypto_type = NONE_CRYPT;
2868 		ath6kl_set_cipher(vif, 0, true);
2869 	} else if (info->crypto.n_ciphers_pairwise == 1) {
2870 		ath6kl_set_cipher(vif, info->crypto.ciphers_pairwise[0], true);
2871 	}
2872 
2873 	switch (info->crypto.cipher_group) {
2874 	case WLAN_CIPHER_SUITE_WEP40:
2875 	case WLAN_CIPHER_SUITE_WEP104:
2876 		p.grp_crypto_type = WEP_CRYPT;
2877 		break;
2878 	case WLAN_CIPHER_SUITE_TKIP:
2879 		p.grp_crypto_type = TKIP_CRYPT;
2880 		break;
2881 	case WLAN_CIPHER_SUITE_CCMP:
2882 		p.grp_crypto_type = AES_CRYPT;
2883 		break;
2884 	case WLAN_CIPHER_SUITE_SMS4:
2885 		p.grp_crypto_type = WAPI_CRYPT;
2886 		break;
2887 	default:
2888 		p.grp_crypto_type = NONE_CRYPT;
2889 		break;
2890 	}
2891 	ath6kl_set_cipher(vif, info->crypto.cipher_group, false);
2892 
2893 	p.nw_type = AP_NETWORK;
2894 	vif->nw_type = vif->next_mode;
2895 
2896 	p.ssid_len = vif->ssid_len;
2897 	memcpy(p.ssid, vif->ssid, vif->ssid_len);
2898 	p.dot11_auth_mode = vif->dot11_auth_mode;
2899 	p.ch = cpu_to_le16(info->chandef.chan->center_freq);
2900 
2901 	/* Enable uAPSD support by default */
2902 	res = ath6kl_wmi_ap_set_apsd(ar->wmi, vif->fw_vif_idx, true);
2903 	if (res < 0)
2904 		return res;
2905 
2906 	if (vif->wdev.iftype == NL80211_IFTYPE_P2P_GO) {
2907 		p.nw_subtype = SUBTYPE_P2PGO;
2908 	} else {
2909 		/*
2910 		 * Due to firmware limitation, it is not possible to
2911 		 * do P2P mgmt operations in AP mode
2912 		 */
2913 		p.nw_subtype = SUBTYPE_NONE;
2914 	}
2915 
2916 	if (info->inactivity_timeout) {
2917 		inactivity_timeout = info->inactivity_timeout;
2918 
2919 		if (test_bit(ATH6KL_FW_CAPABILITY_AP_INACTIVITY_MINS,
2920 			     ar->fw_capabilities))
2921 			inactivity_timeout = DIV_ROUND_UP(inactivity_timeout,
2922 							  60);
2923 
2924 		res = ath6kl_wmi_set_inact_period(ar->wmi, vif->fw_vif_idx,
2925 						  inactivity_timeout);
2926 		if (res < 0)
2927 			return res;
2928 	}
2929 
2930 	if (ath6kl_set_htcap(vif, info->chandef.chan->band,
2931 			     cfg80211_get_chandef_type(&info->chandef)
2932 					!= NL80211_CHAN_NO_HT))
2933 		return -EIO;
2934 
2935 	/*
2936 	 * Get the PTKSA replay counter in the RSN IE. Supplicant
2937 	 * will use the RSN IE in M3 message and firmware has to
2938 	 * advertise the same in beacon/probe response. Send
2939 	 * the complete RSN IE capability field to firmware
2940 	 */
2941 	if (!ath6kl_get_rsn_capab(&info->beacon, (u8 *) &rsn_capab) &&
2942 	    test_bit(ATH6KL_FW_CAPABILITY_RSN_CAP_OVERRIDE,
2943 		     ar->fw_capabilities)) {
2944 		res = ath6kl_wmi_set_ie_cmd(ar->wmi, vif->fw_vif_idx,
2945 					    WLAN_EID_RSN, WMI_RSN_IE_CAPB,
2946 					    (const u8 *) &rsn_capab,
2947 					    sizeof(rsn_capab));
2948 		vif->rsn_capab = rsn_capab;
2949 		if (res < 0)
2950 			return res;
2951 	}
2952 
2953 	memcpy(&vif->profile, &p, sizeof(p));
2954 	res = ath6kl_wmi_ap_profile_commit(ar->wmi, vif->fw_vif_idx, &p);
2955 	if (res < 0)
2956 		return res;
2957 
2958 	return 0;
2959 }
2960 
2961 static int ath6kl_change_beacon(struct wiphy *wiphy, struct net_device *dev,
2962 				struct cfg80211_ap_update *params)
2963 {
2964 	struct ath6kl_vif *vif = netdev_priv(dev);
2965 
2966 	if (!ath6kl_cfg80211_ready(vif))
2967 		return -EIO;
2968 
2969 	if (vif->next_mode != AP_NETWORK)
2970 		return -EOPNOTSUPP;
2971 
2972 	return ath6kl_set_ies(vif, &params->beacon);
2973 }
2974 
2975 static int ath6kl_stop_ap(struct wiphy *wiphy, struct net_device *dev,
2976 			  unsigned int link_id)
2977 {
2978 	struct ath6kl *ar = ath6kl_priv(dev);
2979 	struct ath6kl_vif *vif = netdev_priv(dev);
2980 
2981 	if (vif->nw_type != AP_NETWORK)
2982 		return -EOPNOTSUPP;
2983 	if (!test_bit(CONNECTED, &vif->flags))
2984 		return -ENOTCONN;
2985 
2986 	ath6kl_wmi_disconnect_cmd(ar->wmi, vif->fw_vif_idx);
2987 	clear_bit(CONNECTED, &vif->flags);
2988 	netif_carrier_off(vif->ndev);
2989 
2990 	/* Restore ht setting in firmware */
2991 	return ath6kl_restore_htcap(vif);
2992 }
2993 
2994 static const u8 bcast_addr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
2995 
2996 static int ath6kl_del_station(struct wiphy *wiphy, struct wireless_dev *wdev,
2997 			      struct station_del_parameters *params)
2998 {
2999 	struct net_device *dev = wdev->netdev;
3000 	struct ath6kl *ar = ath6kl_priv(dev);
3001 	struct ath6kl_vif *vif = netdev_priv(dev);
3002 	const u8 *addr = params->mac ? params->mac : bcast_addr;
3003 
3004 	return ath6kl_wmi_ap_set_mlme(ar->wmi, vif->fw_vif_idx, WMI_AP_DEAUTH,
3005 				      addr, WLAN_REASON_PREV_AUTH_NOT_VALID);
3006 }
3007 
3008 static int ath6kl_change_station(struct wiphy *wiphy, struct wireless_dev *wdev,
3009 				 const u8 *mac,
3010 				 struct station_parameters *params)
3011 {
3012 	struct net_device *dev = wdev->netdev;
3013 	struct ath6kl *ar = ath6kl_priv(dev);
3014 	struct ath6kl_vif *vif = netdev_priv(dev);
3015 	int err;
3016 
3017 	if (vif->nw_type != AP_NETWORK)
3018 		return -EOPNOTSUPP;
3019 
3020 	err = cfg80211_check_station_change(wiphy, params,
3021 					    CFG80211_STA_AP_MLME_CLIENT);
3022 	if (err)
3023 		return err;
3024 
3025 	if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED))
3026 		return ath6kl_wmi_ap_set_mlme(ar->wmi, vif->fw_vif_idx,
3027 					      WMI_AP_MLME_AUTHORIZE, mac, 0);
3028 	return ath6kl_wmi_ap_set_mlme(ar->wmi, vif->fw_vif_idx,
3029 				      WMI_AP_MLME_UNAUTHORIZE, mac, 0);
3030 }
3031 
3032 static int ath6kl_remain_on_channel(struct wiphy *wiphy,
3033 				    struct wireless_dev *wdev,
3034 				    struct ieee80211_channel *chan,
3035 				    unsigned int duration,
3036 				    u64 *cookie)
3037 {
3038 	struct ath6kl_vif *vif = ath6kl_vif_from_wdev(wdev);
3039 	struct ath6kl *ar = ath6kl_priv(vif->ndev);
3040 	u32 id;
3041 
3042 	/* TODO: if already pending or ongoing remain-on-channel,
3043 	 * return -EBUSY */
3044 	id = ++vif->last_roc_id;
3045 	if (id == 0) {
3046 		/* Do not use 0 as the cookie value */
3047 		id = ++vif->last_roc_id;
3048 	}
3049 	*cookie = id;
3050 
3051 	return ath6kl_wmi_remain_on_chnl_cmd(ar->wmi, vif->fw_vif_idx,
3052 					     chan->center_freq, duration);
3053 }
3054 
3055 static int ath6kl_cancel_remain_on_channel(struct wiphy *wiphy,
3056 					   struct wireless_dev *wdev,
3057 					   u64 cookie)
3058 {
3059 	struct ath6kl_vif *vif = ath6kl_vif_from_wdev(wdev);
3060 	struct ath6kl *ar = ath6kl_priv(vif->ndev);
3061 
3062 	if (cookie != vif->last_roc_id)
3063 		return -ENOENT;
3064 	vif->last_cancel_roc_id = cookie;
3065 
3066 	return ath6kl_wmi_cancel_remain_on_chnl_cmd(ar->wmi, vif->fw_vif_idx);
3067 }
3068 
3069 static int ath6kl_send_go_probe_resp(struct ath6kl_vif *vif,
3070 				     const u8 *buf, size_t len,
3071 				     unsigned int freq)
3072 {
3073 	struct ath6kl *ar = vif->ar;
3074 	const u8 *pos;
3075 	u8 *p2p;
3076 	int p2p_len;
3077 	int ret;
3078 	const struct ieee80211_mgmt *mgmt;
3079 
3080 	mgmt = (const struct ieee80211_mgmt *) buf;
3081 
3082 	/* Include P2P IE(s) from the frame generated in user space. */
3083 
3084 	p2p = kmalloc(len, GFP_KERNEL);
3085 	if (p2p == NULL)
3086 		return -ENOMEM;
3087 	p2p_len = 0;
3088 
3089 	pos = mgmt->u.probe_resp.variable;
3090 	while (pos + 1 < buf + len) {
3091 		if (pos + 2 + pos[1] > buf + len)
3092 			break;
3093 		if (ath6kl_is_p2p_ie(pos)) {
3094 			memcpy(p2p + p2p_len, pos, 2 + pos[1]);
3095 			p2p_len += 2 + pos[1];
3096 		}
3097 		pos += 2 + pos[1];
3098 	}
3099 
3100 	ret = ath6kl_wmi_send_probe_response_cmd(ar->wmi, vif->fw_vif_idx, freq,
3101 						 mgmt->da, p2p, p2p_len);
3102 	kfree(p2p);
3103 	return ret;
3104 }
3105 
3106 static bool ath6kl_mgmt_powersave_ap(struct ath6kl_vif *vif,
3107 				     u32 id,
3108 				     u32 freq,
3109 				     u32 wait,
3110 				     const u8 *buf,
3111 				     size_t len,
3112 				     bool *more_data,
3113 				     bool no_cck)
3114 {
3115 	struct ieee80211_mgmt *mgmt;
3116 	struct ath6kl_sta *conn;
3117 	bool is_psq_empty = false;
3118 	struct ath6kl_mgmt_buff *mgmt_buf;
3119 	size_t mgmt_buf_size;
3120 	struct ath6kl *ar = vif->ar;
3121 
3122 	mgmt = (struct ieee80211_mgmt *) buf;
3123 	if (is_multicast_ether_addr(mgmt->da))
3124 		return false;
3125 
3126 	conn = ath6kl_find_sta(vif, mgmt->da);
3127 	if (!conn)
3128 		return false;
3129 
3130 	if (conn->sta_flags & STA_PS_SLEEP) {
3131 		if (!(conn->sta_flags & STA_PS_POLLED)) {
3132 			/* Queue the frames if the STA is sleeping */
3133 			mgmt_buf_size = len + sizeof(struct ath6kl_mgmt_buff);
3134 			mgmt_buf = kmalloc(mgmt_buf_size, GFP_KERNEL);
3135 			if (!mgmt_buf)
3136 				return false;
3137 
3138 			INIT_LIST_HEAD(&mgmt_buf->list);
3139 			mgmt_buf->id = id;
3140 			mgmt_buf->freq = freq;
3141 			mgmt_buf->wait = wait;
3142 			mgmt_buf->len = len;
3143 			mgmt_buf->no_cck = no_cck;
3144 			memcpy(mgmt_buf->buf, buf, len);
3145 			spin_lock_bh(&conn->psq_lock);
3146 			is_psq_empty = skb_queue_empty(&conn->psq) &&
3147 					(conn->mgmt_psq_len == 0);
3148 			list_add_tail(&mgmt_buf->list, &conn->mgmt_psq);
3149 			conn->mgmt_psq_len++;
3150 			spin_unlock_bh(&conn->psq_lock);
3151 
3152 			/*
3153 			 * If this is the first pkt getting queued
3154 			 * for this STA, update the PVB for this
3155 			 * STA.
3156 			 */
3157 			if (is_psq_empty)
3158 				ath6kl_wmi_set_pvb_cmd(ar->wmi, vif->fw_vif_idx,
3159 						       conn->aid, 1);
3160 			return true;
3161 		}
3162 
3163 		/*
3164 		 * This tx is because of a PsPoll.
3165 		 * Determine if MoreData bit has to be set.
3166 		 */
3167 		spin_lock_bh(&conn->psq_lock);
3168 		if (!skb_queue_empty(&conn->psq) || (conn->mgmt_psq_len != 0))
3169 			*more_data = true;
3170 		spin_unlock_bh(&conn->psq_lock);
3171 	}
3172 
3173 	return false;
3174 }
3175 
3176 /* Check if SSID length is greater than DIRECT- */
3177 static bool ath6kl_is_p2p_go_ssid(const u8 *buf, size_t len)
3178 {
3179 	const struct ieee80211_mgmt *mgmt;
3180 	mgmt = (const struct ieee80211_mgmt *) buf;
3181 
3182 	/* variable[1] contains the SSID tag length */
3183 	if (buf + len >= &mgmt->u.probe_resp.variable[1] &&
3184 	    (mgmt->u.probe_resp.variable[1] > P2P_WILDCARD_SSID_LEN)) {
3185 		return true;
3186 	}
3187 
3188 	return false;
3189 }
3190 
3191 static int ath6kl_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
3192 			  struct cfg80211_mgmt_tx_params *params, u64 *cookie)
3193 {
3194 	struct ath6kl_vif *vif = ath6kl_vif_from_wdev(wdev);
3195 	struct ath6kl *ar = ath6kl_priv(vif->ndev);
3196 	struct ieee80211_channel *chan = params->chan;
3197 	const u8 *buf = params->buf;
3198 	size_t len = params->len;
3199 	unsigned int wait = params->wait;
3200 	bool no_cck = params->no_cck;
3201 	u32 id, freq;
3202 	const struct ieee80211_mgmt *mgmt;
3203 	bool more_data, queued;
3204 
3205 	/* default to the current channel, but use the one specified as argument
3206 	 * if any
3207 	 */
3208 	freq = vif->ch_hint;
3209 	if (chan)
3210 		freq = chan->center_freq;
3211 
3212 	/* never send freq zero to the firmware */
3213 	if (WARN_ON(freq == 0))
3214 		return -EINVAL;
3215 
3216 	mgmt = (const struct ieee80211_mgmt *) buf;
3217 	if (vif->nw_type == AP_NETWORK && test_bit(CONNECTED, &vif->flags) &&
3218 	    ieee80211_is_probe_resp(mgmt->frame_control) &&
3219 	    ath6kl_is_p2p_go_ssid(buf, len)) {
3220 		/*
3221 		 * Send Probe Response frame in GO mode using a separate WMI
3222 		 * command to allow the target to fill in the generic IEs.
3223 		 */
3224 		*cookie = 0; /* TX status not supported */
3225 		return ath6kl_send_go_probe_resp(vif, buf, len, freq);
3226 	}
3227 
3228 	id = vif->send_action_id++;
3229 	if (id == 0) {
3230 		/*
3231 		 * 0 is a reserved value in the WMI command and shall not be
3232 		 * used for the command.
3233 		 */
3234 		id = vif->send_action_id++;
3235 	}
3236 
3237 	*cookie = id;
3238 
3239 	/* AP mode Power saving processing */
3240 	if (vif->nw_type == AP_NETWORK) {
3241 		queued = ath6kl_mgmt_powersave_ap(vif, id, freq, wait, buf, len,
3242 						  &more_data, no_cck);
3243 		if (queued)
3244 			return 0;
3245 	}
3246 
3247 	return ath6kl_wmi_send_mgmt_cmd(ar->wmi, vif->fw_vif_idx, id, freq,
3248 					wait, buf, len, no_cck);
3249 }
3250 
3251 static int ath6kl_get_antenna(struct wiphy *wiphy, int radio_idx,
3252 			      u32 *tx_ant, u32 *rx_ant)
3253 {
3254 	struct ath6kl *ar = wiphy_priv(wiphy);
3255 	*tx_ant = ar->hw.tx_ant;
3256 	*rx_ant = ar->hw.rx_ant;
3257 	return 0;
3258 }
3259 
3260 static void ath6kl_update_mgmt_frame_registrations(struct wiphy *wiphy,
3261 						   struct wireless_dev *wdev,
3262 						   struct mgmt_frame_regs *upd)
3263 {
3264 	struct ath6kl_vif *vif = ath6kl_vif_from_wdev(wdev);
3265 
3266 	/*
3267 	 * FIXME: send WMI_PROBE_REQ_REPORT_CMD here instead of hardcoding
3268 	 *	  the reporting in the target all the time, this callback
3269 	 *	  *is* allowed to sleep after all.
3270 	 */
3271 	vif->probe_req_report =
3272 		upd->interface_stypes & BIT(IEEE80211_STYPE_PROBE_REQ >> 4);
3273 }
3274 
3275 static int ath6kl_cfg80211_sscan_start(struct wiphy *wiphy,
3276 			struct net_device *dev,
3277 			struct cfg80211_sched_scan_request *request)
3278 {
3279 	struct ath6kl *ar = ath6kl_priv(dev);
3280 	struct ath6kl_vif *vif = netdev_priv(dev);
3281 	u16 interval;
3282 	int ret, rssi_thold;
3283 	int n_match_sets = request->n_match_sets;
3284 
3285 	/*
3286 	 * If there's a matchset w/o an SSID, then assume it's just for
3287 	 * the RSSI (nothing else is currently supported) and ignore it.
3288 	 * The device only supports a global RSSI filter that we set below.
3289 	 */
3290 	if (n_match_sets == 1 && !request->match_sets[0].ssid.ssid_len)
3291 		n_match_sets = 0;
3292 
3293 	if (ar->state != ATH6KL_STATE_ON)
3294 		return -EIO;
3295 
3296 	if (vif->sme_state != SME_DISCONNECTED)
3297 		return -EBUSY;
3298 
3299 	ath6kl_cfg80211_scan_complete_event(vif, true);
3300 
3301 	ret = ath6kl_set_probed_ssids(ar, vif, request->ssids,
3302 				      request->n_ssids,
3303 				      request->match_sets,
3304 				      n_match_sets);
3305 	if (ret < 0)
3306 		return ret;
3307 
3308 	if (!n_match_sets) {
3309 		ret = ath6kl_wmi_bssfilter_cmd(ar->wmi, vif->fw_vif_idx,
3310 					       ALL_BSS_FILTER, 0);
3311 		if (ret < 0)
3312 			return ret;
3313 	} else {
3314 		ret = ath6kl_wmi_bssfilter_cmd(ar->wmi, vif->fw_vif_idx,
3315 					       MATCHED_SSID_FILTER, 0);
3316 		if (ret < 0)
3317 			return ret;
3318 	}
3319 
3320 	if (test_bit(ATH6KL_FW_CAPABILITY_RSSI_SCAN_THOLD,
3321 		     ar->fw_capabilities)) {
3322 		if (request->min_rssi_thold <= NL80211_SCAN_RSSI_THOLD_OFF)
3323 			rssi_thold = 0;
3324 		else if (request->min_rssi_thold < -127)
3325 			rssi_thold = -127;
3326 		else
3327 			rssi_thold = request->min_rssi_thold;
3328 
3329 		ret = ath6kl_wmi_set_rssi_filter_cmd(ar->wmi, vif->fw_vif_idx,
3330 						     rssi_thold);
3331 		if (ret) {
3332 			ath6kl_err("failed to set RSSI threshold for scan\n");
3333 			return ret;
3334 		}
3335 	}
3336 
3337 	/* fw uses seconds, also make sure that it's >0 */
3338 	interval = max_t(u16, 1, request->scan_plans[0].interval);
3339 
3340 	ath6kl_wmi_scanparams_cmd(ar->wmi, vif->fw_vif_idx,
3341 				  interval, interval,
3342 				  vif->bg_scan_period, 0, 0, 0, 3, 0, 0, 0);
3343 
3344 	/* this also clears IE in fw if it's not set */
3345 	ret = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx,
3346 				       WMI_FRAME_PROBE_REQ,
3347 				       request->ie, request->ie_len);
3348 	if (ret) {
3349 		ath6kl_warn("Failed to set probe request IE for scheduled scan: %d\n",
3350 			    ret);
3351 		return ret;
3352 	}
3353 
3354 	ret = ath6kl_wmi_enable_sched_scan_cmd(ar->wmi, vif->fw_vif_idx, true);
3355 	if (ret)
3356 		return ret;
3357 
3358 	set_bit(SCHED_SCANNING, &vif->flags);
3359 
3360 	return 0;
3361 }
3362 
3363 static int ath6kl_cfg80211_sscan_stop(struct wiphy *wiphy,
3364 				      struct net_device *dev, u64 reqid)
3365 {
3366 	struct ath6kl_vif *vif = netdev_priv(dev);
3367 	bool stopped;
3368 
3369 	stopped = __ath6kl_cfg80211_sscan_stop(vif);
3370 
3371 	if (!stopped)
3372 		return -EIO;
3373 
3374 	return 0;
3375 }
3376 
3377 static int ath6kl_cfg80211_set_bitrate(struct wiphy *wiphy,
3378 				       struct net_device *dev,
3379 				       unsigned int link_id,
3380 				       const u8 *addr,
3381 				       const struct cfg80211_bitrate_mask *mask)
3382 {
3383 	struct ath6kl *ar = ath6kl_priv(dev);
3384 	struct ath6kl_vif *vif = netdev_priv(dev);
3385 
3386 	return ath6kl_wmi_set_bitrate_mask(ar->wmi, vif->fw_vif_idx,
3387 					   mask);
3388 }
3389 
3390 static int ath6kl_cfg80211_set_txe_config(struct wiphy *wiphy,
3391 					  struct net_device *dev,
3392 					  u32 rate, u32 pkts, u32 intvl)
3393 {
3394 	struct ath6kl *ar = ath6kl_priv(dev);
3395 	struct ath6kl_vif *vif = netdev_priv(dev);
3396 
3397 	if (vif->nw_type != INFRA_NETWORK ||
3398 	    !test_bit(ATH6KL_FW_CAPABILITY_TX_ERR_NOTIFY, ar->fw_capabilities))
3399 		return -EOPNOTSUPP;
3400 
3401 	if (vif->sme_state != SME_CONNECTED)
3402 		return -ENOTCONN;
3403 
3404 	/* save this since the firmware won't report the interval */
3405 	vif->txe_intvl = intvl;
3406 
3407 	return ath6kl_wmi_set_txe_notify(ar->wmi, vif->fw_vif_idx,
3408 					 rate, pkts, intvl);
3409 }
3410 
3411 static const struct ieee80211_txrx_stypes
3412 ath6kl_mgmt_stypes[NUM_NL80211_IFTYPES] = {
3413 	[NL80211_IFTYPE_STATION] = {
3414 		.tx = BIT(IEEE80211_STYPE_ACTION >> 4) |
3415 		BIT(IEEE80211_STYPE_PROBE_RESP >> 4),
3416 		.rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
3417 		BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
3418 	},
3419 	[NL80211_IFTYPE_AP] = {
3420 		.tx = BIT(IEEE80211_STYPE_ACTION >> 4) |
3421 		BIT(IEEE80211_STYPE_PROBE_RESP >> 4),
3422 		.rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
3423 		BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
3424 	},
3425 	[NL80211_IFTYPE_P2P_CLIENT] = {
3426 		.tx = BIT(IEEE80211_STYPE_ACTION >> 4) |
3427 		BIT(IEEE80211_STYPE_PROBE_RESP >> 4),
3428 		.rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
3429 		BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
3430 	},
3431 	[NL80211_IFTYPE_P2P_GO] = {
3432 		.tx = BIT(IEEE80211_STYPE_ACTION >> 4) |
3433 		BIT(IEEE80211_STYPE_PROBE_RESP >> 4),
3434 		.rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
3435 		BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
3436 	},
3437 };
3438 
3439 static struct cfg80211_ops ath6kl_cfg80211_ops = {
3440 	.add_virtual_intf = ath6kl_cfg80211_add_iface,
3441 	.del_virtual_intf = ath6kl_cfg80211_del_iface,
3442 	.change_virtual_intf = ath6kl_cfg80211_change_iface,
3443 	.scan = ath6kl_cfg80211_scan,
3444 	.connect = ath6kl_cfg80211_connect,
3445 	.disconnect = ath6kl_cfg80211_disconnect,
3446 	.add_key = ath6kl_cfg80211_add_key,
3447 	.get_key = ath6kl_cfg80211_get_key,
3448 	.del_key = ath6kl_cfg80211_del_key,
3449 	.set_default_key = ath6kl_cfg80211_set_default_key,
3450 	.set_wiphy_params = ath6kl_cfg80211_set_wiphy_params,
3451 	.set_tx_power = ath6kl_cfg80211_set_txpower,
3452 	.get_tx_power = ath6kl_cfg80211_get_txpower,
3453 	.set_power_mgmt = ath6kl_cfg80211_set_power_mgmt,
3454 	.join_ibss = ath6kl_cfg80211_join_ibss,
3455 	.leave_ibss = ath6kl_cfg80211_leave_ibss,
3456 	.get_station = ath6kl_get_station,
3457 	.set_pmksa = ath6kl_set_pmksa,
3458 	.del_pmksa = ath6kl_del_pmksa,
3459 	.flush_pmksa = ath6kl_flush_pmksa,
3460 	CFG80211_TESTMODE_CMD(ath6kl_tm_cmd)
3461 #ifdef CONFIG_PM
3462 	.suspend = __ath6kl_cfg80211_suspend,
3463 	.resume = __ath6kl_cfg80211_resume,
3464 #endif
3465 	.start_ap = ath6kl_start_ap,
3466 	.change_beacon = ath6kl_change_beacon,
3467 	.stop_ap = ath6kl_stop_ap,
3468 	.del_station = ath6kl_del_station,
3469 	.change_station = ath6kl_change_station,
3470 	.remain_on_channel = ath6kl_remain_on_channel,
3471 	.cancel_remain_on_channel = ath6kl_cancel_remain_on_channel,
3472 	.mgmt_tx = ath6kl_mgmt_tx,
3473 	.update_mgmt_frame_registrations =
3474 		ath6kl_update_mgmt_frame_registrations,
3475 	.get_antenna = ath6kl_get_antenna,
3476 	.sched_scan_start = ath6kl_cfg80211_sscan_start,
3477 	.sched_scan_stop = ath6kl_cfg80211_sscan_stop,
3478 	.set_bitrate_mask = ath6kl_cfg80211_set_bitrate,
3479 	.set_cqm_txe_config = ath6kl_cfg80211_set_txe_config,
3480 };
3481 
3482 void ath6kl_cfg80211_stop(struct ath6kl_vif *vif)
3483 {
3484 	ath6kl_cfg80211_sscan_disable(vif);
3485 
3486 	switch (vif->sme_state) {
3487 	case SME_DISCONNECTED:
3488 		break;
3489 	case SME_CONNECTING:
3490 		cfg80211_connect_result(vif->ndev, vif->bssid, NULL, 0,
3491 					NULL, 0,
3492 					WLAN_STATUS_UNSPECIFIED_FAILURE,
3493 					GFP_KERNEL);
3494 		break;
3495 	case SME_CONNECTED:
3496 		cfg80211_disconnected(vif->ndev, 0, NULL, 0, true, GFP_KERNEL);
3497 		break;
3498 	}
3499 
3500 	if (vif->ar->state != ATH6KL_STATE_RECOVERY &&
3501 	    (test_bit(CONNECTED, &vif->flags) ||
3502 	    test_bit(CONNECT_PEND, &vif->flags)))
3503 		ath6kl_wmi_disconnect_cmd(vif->ar->wmi, vif->fw_vif_idx);
3504 
3505 	vif->sme_state = SME_DISCONNECTED;
3506 	clear_bit(CONNECTED, &vif->flags);
3507 	clear_bit(CONNECT_PEND, &vif->flags);
3508 
3509 	/* Stop netdev queues, needed during recovery */
3510 	netif_stop_queue(vif->ndev);
3511 	netif_carrier_off(vif->ndev);
3512 
3513 	/* disable scanning */
3514 	if (vif->ar->state != ATH6KL_STATE_RECOVERY &&
3515 	    ath6kl_wmi_scanparams_cmd(vif->ar->wmi, vif->fw_vif_idx, 0xFFFF,
3516 				      0, 0, 0, 0, 0, 0, 0, 0, 0) != 0)
3517 		ath6kl_warn("failed to disable scan during stop\n");
3518 
3519 	ath6kl_cfg80211_scan_complete_event(vif, true);
3520 }
3521 
3522 void ath6kl_cfg80211_stop_all(struct ath6kl *ar)
3523 {
3524 	struct ath6kl_vif *vif;
3525 
3526 	vif = ath6kl_vif_first(ar);
3527 	if (!vif && ar->state != ATH6KL_STATE_RECOVERY) {
3528 		/* save the current power mode before enabling power save */
3529 		ar->wmi->saved_pwr_mode = ar->wmi->pwr_mode;
3530 
3531 		if (ath6kl_wmi_powermode_cmd(ar->wmi, 0, REC_POWER) != 0)
3532 			ath6kl_warn("ath6kl_deep_sleep_enable: wmi_powermode_cmd failed\n");
3533 		return;
3534 	}
3535 
3536 	/*
3537 	 * FIXME: we should take ar->list_lock to protect changes in the
3538 	 * vif_list, but that's not trivial to do as ath6kl_cfg80211_stop()
3539 	 * sleeps.
3540 	 */
3541 	list_for_each_entry(vif, &ar->vif_list, list)
3542 		ath6kl_cfg80211_stop(vif);
3543 }
3544 
3545 static void ath6kl_cfg80211_reg_notify(struct wiphy *wiphy,
3546 				       struct regulatory_request *request)
3547 {
3548 	struct ath6kl *ar = wiphy_priv(wiphy);
3549 	u32 rates[NUM_NL80211_BANDS];
3550 	int ret, i;
3551 
3552 	ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
3553 		   "cfg reg_notify %c%c%s%s initiator %d hint_type %d\n",
3554 		   request->alpha2[0], request->alpha2[1],
3555 		   request->intersect ? " intersect" : "",
3556 		   request->processed ? " processed" : "",
3557 		   request->initiator, request->user_reg_hint_type);
3558 
3559 	if (request->user_reg_hint_type != NL80211_USER_REG_HINT_CELL_BASE)
3560 		return;
3561 
3562 	ret = ath6kl_wmi_set_regdomain_cmd(ar->wmi, request->alpha2);
3563 	if (ret) {
3564 		ath6kl_err("failed to set regdomain: %d\n", ret);
3565 		return;
3566 	}
3567 
3568 	/*
3569 	 * Firmware will apply the regdomain change only after a scan is
3570 	 * issued and it will send a WMI_REGDOMAIN_EVENTID when it has been
3571 	 * changed.
3572 	 */
3573 
3574 	for (i = 0; i < NUM_NL80211_BANDS; i++)
3575 		if (wiphy->bands[i])
3576 			rates[i] = (1 << wiphy->bands[i]->n_bitrates) - 1;
3577 
3578 
3579 	ret = ath6kl_wmi_beginscan_cmd(ar->wmi, 0, WMI_LONG_SCAN, false,
3580 				       false, 0, ATH6KL_FG_SCAN_INTERVAL,
3581 				       0, NULL, false, rates);
3582 	if (ret) {
3583 		ath6kl_err("failed to start scan for a regdomain change: %d\n",
3584 			   ret);
3585 		return;
3586 	}
3587 }
3588 
3589 static int ath6kl_cfg80211_vif_init(struct ath6kl_vif *vif)
3590 {
3591 	vif->aggr_cntxt = aggr_init(vif);
3592 	if (!vif->aggr_cntxt) {
3593 		ath6kl_err("failed to initialize aggr\n");
3594 		return -ENOMEM;
3595 	}
3596 
3597 	timer_setup(&vif->disconnect_timer, disconnect_timer_handler, 0);
3598 	timer_setup(&vif->sched_scan_timer, ath6kl_wmi_sscan_timer, 0);
3599 
3600 	set_bit(WMM_ENABLED, &vif->flags);
3601 	spin_lock_init(&vif->if_lock);
3602 
3603 	INIT_LIST_HEAD(&vif->mc_filter);
3604 
3605 	return 0;
3606 }
3607 
3608 void ath6kl_cfg80211_vif_stop(struct ath6kl_vif *vif, bool wmi_ready)
3609 {
3610 	static u8 bcast_mac[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
3611 	bool discon_issued;
3612 
3613 	netif_stop_queue(vif->ndev);
3614 
3615 	clear_bit(WLAN_ENABLED, &vif->flags);
3616 
3617 	if (wmi_ready) {
3618 		discon_issued = test_bit(CONNECTED, &vif->flags) ||
3619 				test_bit(CONNECT_PEND, &vif->flags);
3620 		ath6kl_disconnect(vif);
3621 		timer_delete(&vif->disconnect_timer);
3622 
3623 		if (discon_issued)
3624 			ath6kl_disconnect_event(vif, DISCONNECT_CMD,
3625 						(vif->nw_type & AP_NETWORK) ?
3626 						bcast_mac : vif->bssid,
3627 						0, NULL, 0);
3628 	}
3629 
3630 	if (vif->scan_req) {
3631 		struct cfg80211_scan_info info = {
3632 			.aborted = true,
3633 		};
3634 
3635 		cfg80211_scan_done(vif->scan_req, &info);
3636 		vif->scan_req = NULL;
3637 	}
3638 
3639 	/* need to clean up enhanced bmiss detection fw state */
3640 	ath6kl_cfg80211_sta_bmiss_enhance(vif, false);
3641 }
3642 
3643 void ath6kl_cfg80211_vif_cleanup(struct ath6kl_vif *vif)
3644 {
3645 	struct ath6kl *ar = vif->ar;
3646 	struct ath6kl_mc_filter *mc_filter, *tmp;
3647 
3648 	aggr_module_destroy(vif->aggr_cntxt);
3649 
3650 	ar->avail_idx_map |= BIT(vif->fw_vif_idx);
3651 
3652 	if (vif->nw_type == ADHOC_NETWORK)
3653 		ar->ibss_if_active = false;
3654 
3655 	list_for_each_entry_safe(mc_filter, tmp, &vif->mc_filter, list) {
3656 		list_del(&mc_filter->list);
3657 		kfree(mc_filter);
3658 	}
3659 
3660 	cfg80211_unregister_netdevice(vif->ndev);
3661 
3662 	ar->num_vif--;
3663 }
3664 
3665 static const char ath6kl_gstrings_sta_stats[][ETH_GSTRING_LEN] = {
3666 	/* Common stats names used by many drivers. */
3667 	"tx_pkts_nic", "tx_bytes_nic", "rx_pkts_nic", "rx_bytes_nic",
3668 
3669 	/* TX stats. */
3670 	"d_tx_ucast_pkts", "d_tx_bcast_pkts",
3671 	"d_tx_ucast_bytes", "d_tx_bcast_bytes",
3672 	"d_tx_rts_ok", "d_tx_error", "d_tx_fail",
3673 	"d_tx_retry", "d_tx_multi_retry", "d_tx_rts_fail",
3674 	"d_tx_tkip_counter_measures",
3675 
3676 	/* RX Stats. */
3677 	"d_rx_ucast_pkts", "d_rx_ucast_rate", "d_rx_bcast_pkts",
3678 	"d_rx_ucast_bytes", "d_rx_bcast_bytes", "d_rx_frag_pkt",
3679 	"d_rx_error", "d_rx_crc_err", "d_rx_keycache_miss",
3680 	"d_rx_decrypt_crc_err", "d_rx_duplicate_frames",
3681 	"d_rx_mic_err", "d_rx_tkip_format_err", "d_rx_ccmp_format_err",
3682 	"d_rx_ccmp_replay_err",
3683 
3684 	/* Misc stats. */
3685 	"d_beacon_miss", "d_num_connects", "d_num_disconnects",
3686 	"d_beacon_avg_rssi", "d_arp_received", "d_arp_matched",
3687 	"d_arp_replied"
3688 };
3689 
3690 #define ATH6KL_STATS_LEN	ARRAY_SIZE(ath6kl_gstrings_sta_stats)
3691 
3692 static int ath6kl_get_sset_count(struct net_device *dev, int sset)
3693 {
3694 	int rv = 0;
3695 
3696 	if (sset == ETH_SS_STATS)
3697 		rv += ATH6KL_STATS_LEN;
3698 
3699 	if (rv == 0)
3700 		return -EOPNOTSUPP;
3701 	return rv;
3702 }
3703 
3704 static void ath6kl_get_stats(struct net_device *dev,
3705 			    struct ethtool_stats *stats,
3706 			    u64 *data)
3707 {
3708 	struct ath6kl_vif *vif = netdev_priv(dev);
3709 	struct ath6kl *ar = vif->ar;
3710 	int i = 0;
3711 	struct target_stats *tgt_stats;
3712 
3713 	memset(data, 0, sizeof(u64) * ATH6KL_STATS_LEN);
3714 
3715 	ath6kl_read_tgt_stats(ar, vif);
3716 
3717 	tgt_stats = &vif->target_stats;
3718 
3719 	data[i++] = tgt_stats->tx_ucast_pkt + tgt_stats->tx_bcast_pkt;
3720 	data[i++] = tgt_stats->tx_ucast_byte + tgt_stats->tx_bcast_byte;
3721 	data[i++] = tgt_stats->rx_ucast_pkt + tgt_stats->rx_bcast_pkt;
3722 	data[i++] = tgt_stats->rx_ucast_byte + tgt_stats->rx_bcast_byte;
3723 
3724 	data[i++] = tgt_stats->tx_ucast_pkt;
3725 	data[i++] = tgt_stats->tx_bcast_pkt;
3726 	data[i++] = tgt_stats->tx_ucast_byte;
3727 	data[i++] = tgt_stats->tx_bcast_byte;
3728 	data[i++] = tgt_stats->tx_rts_success_cnt;
3729 	data[i++] = tgt_stats->tx_err;
3730 	data[i++] = tgt_stats->tx_fail_cnt;
3731 	data[i++] = tgt_stats->tx_retry_cnt;
3732 	data[i++] = tgt_stats->tx_mult_retry_cnt;
3733 	data[i++] = tgt_stats->tx_rts_fail_cnt;
3734 	data[i++] = tgt_stats->tkip_cnter_measures_invoked;
3735 
3736 	data[i++] = tgt_stats->rx_ucast_pkt;
3737 	data[i++] = tgt_stats->rx_ucast_rate;
3738 	data[i++] = tgt_stats->rx_bcast_pkt;
3739 	data[i++] = tgt_stats->rx_ucast_byte;
3740 	data[i++] = tgt_stats->rx_bcast_byte;
3741 	data[i++] = tgt_stats->rx_frgment_pkt;
3742 	data[i++] = tgt_stats->rx_err;
3743 	data[i++] = tgt_stats->rx_crc_err;
3744 	data[i++] = tgt_stats->rx_key_cache_miss;
3745 	data[i++] = tgt_stats->rx_decrypt_err;
3746 	data[i++] = tgt_stats->rx_dupl_frame;
3747 	data[i++] = tgt_stats->tkip_local_mic_fail;
3748 	data[i++] = tgt_stats->tkip_fmt_err;
3749 	data[i++] = tgt_stats->ccmp_fmt_err;
3750 	data[i++] = tgt_stats->ccmp_replays;
3751 
3752 	data[i++] = tgt_stats->cs_bmiss_cnt;
3753 	data[i++] = tgt_stats->cs_connect_cnt;
3754 	data[i++] = tgt_stats->cs_discon_cnt;
3755 	data[i++] = tgt_stats->cs_ave_beacon_rssi;
3756 	data[i++] = tgt_stats->arp_received;
3757 	data[i++] = tgt_stats->arp_matched;
3758 	data[i++] = tgt_stats->arp_replied;
3759 
3760 	if (i !=  ATH6KL_STATS_LEN) {
3761 		WARN_ON_ONCE(1);
3762 		ath6kl_err("ethtool stats error, i: %d  STATS_LEN: %d\n",
3763 			   i, (int)ATH6KL_STATS_LEN);
3764 	}
3765 }
3766 
3767 /* These stats are per NIC, not really per vdev, so we just ignore dev. */
3768 static void ath6kl_get_strings(struct net_device *dev, u32 sset, u8 *data)
3769 {
3770 	int sz_sta_stats = 0;
3771 
3772 	if (sset == ETH_SS_STATS) {
3773 		sz_sta_stats = sizeof(ath6kl_gstrings_sta_stats);
3774 		memcpy(data, ath6kl_gstrings_sta_stats, sz_sta_stats);
3775 	}
3776 }
3777 
3778 static const struct ethtool_ops ath6kl_ethtool_ops = {
3779 	.get_drvinfo = cfg80211_get_drvinfo,
3780 	.get_link = ethtool_op_get_link,
3781 	.get_strings = ath6kl_get_strings,
3782 	.get_ethtool_stats = ath6kl_get_stats,
3783 	.get_sset_count = ath6kl_get_sset_count,
3784 };
3785 
3786 struct wireless_dev *ath6kl_interface_add(struct ath6kl *ar, const char *name,
3787 					  unsigned char name_assign_type,
3788 					  enum nl80211_iftype type,
3789 					  u8 fw_vif_idx, u8 nw_type)
3790 {
3791 	struct net_device *ndev;
3792 	struct ath6kl_vif *vif;
3793 	u8 addr[ETH_ALEN];
3794 
3795 	ndev = alloc_netdev(sizeof(*vif), name, name_assign_type, ether_setup);
3796 	if (!ndev)
3797 		return NULL;
3798 
3799 	vif = netdev_priv(ndev);
3800 	ndev->ieee80211_ptr = &vif->wdev;
3801 	vif->wdev.wiphy = ar->wiphy;
3802 	vif->ar = ar;
3803 	vif->ndev = ndev;
3804 	SET_NETDEV_DEV(ndev, wiphy_dev(vif->wdev.wiphy));
3805 	vif->wdev.netdev = ndev;
3806 	vif->wdev.iftype = type;
3807 	vif->fw_vif_idx = fw_vif_idx;
3808 	vif->nw_type = nw_type;
3809 	vif->next_mode = nw_type;
3810 	vif->listen_intvl_t = ATH6KL_DEFAULT_LISTEN_INTVAL;
3811 	vif->bmiss_time_t = ATH6KL_DEFAULT_BMISS_TIME;
3812 	vif->bg_scan_period = 0;
3813 	vif->htcap[NL80211_BAND_2GHZ].ht_enable = true;
3814 	vif->htcap[NL80211_BAND_5GHZ].ht_enable = true;
3815 
3816 	ether_addr_copy(addr, ar->mac_addr);
3817 	if (fw_vif_idx != 0) {
3818 		addr[0] = (addr[0] ^ (1 << fw_vif_idx)) | 0x2;
3819 		if (test_bit(ATH6KL_FW_CAPABILITY_CUSTOM_MAC_ADDR,
3820 			     ar->fw_capabilities))
3821 			addr[4] ^= 0x80;
3822 	}
3823 	eth_hw_addr_set(ndev, addr);
3824 
3825 	init_netdev(ndev);
3826 
3827 	ath6kl_init_control_info(vif);
3828 
3829 	if (ath6kl_cfg80211_vif_init(vif))
3830 		goto err;
3831 
3832 	netdev_set_default_ethtool_ops(ndev, &ath6kl_ethtool_ops);
3833 
3834 	if (cfg80211_register_netdevice(ndev))
3835 		goto err;
3836 
3837 	ar->avail_idx_map &= ~BIT(fw_vif_idx);
3838 	vif->sme_state = SME_DISCONNECTED;
3839 	set_bit(WLAN_ENABLED, &vif->flags);
3840 	ar->wlan_pwr_state = WLAN_POWER_STATE_ON;
3841 
3842 	if (type == NL80211_IFTYPE_ADHOC)
3843 		ar->ibss_if_active = true;
3844 
3845 	spin_lock_bh(&ar->list_lock);
3846 	list_add_tail(&vif->list, &ar->vif_list);
3847 	spin_unlock_bh(&ar->list_lock);
3848 
3849 	return &vif->wdev;
3850 
3851 err:
3852 	aggr_module_destroy(vif->aggr_cntxt);
3853 	free_netdev(ndev);
3854 	return NULL;
3855 }
3856 
3857 #ifdef CONFIG_PM
3858 static const struct wiphy_wowlan_support ath6kl_wowlan_support = {
3859 	.flags = WIPHY_WOWLAN_MAGIC_PKT |
3860 		 WIPHY_WOWLAN_DISCONNECT |
3861 		 WIPHY_WOWLAN_GTK_REKEY_FAILURE  |
3862 		 WIPHY_WOWLAN_SUPPORTS_GTK_REKEY |
3863 		 WIPHY_WOWLAN_EAP_IDENTITY_REQ   |
3864 		 WIPHY_WOWLAN_4WAY_HANDSHAKE,
3865 	.n_patterns = WOW_MAX_FILTERS_PER_LIST,
3866 	.pattern_min_len = 1,
3867 	.pattern_max_len = WOW_PATTERN_SIZE,
3868 };
3869 #endif
3870 
3871 int ath6kl_cfg80211_init(struct ath6kl *ar)
3872 {
3873 	struct wiphy *wiphy = ar->wiphy;
3874 	bool band_2gig = false, band_5gig = false, ht = false;
3875 	int ret;
3876 
3877 	wiphy->mgmt_stypes = ath6kl_mgmt_stypes;
3878 
3879 	wiphy->max_remain_on_channel_duration = 5000;
3880 
3881 	/* set device pointer for wiphy */
3882 	set_wiphy_dev(wiphy, ar->dev);
3883 
3884 	wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
3885 				 BIT(NL80211_IFTYPE_ADHOC) |
3886 				 BIT(NL80211_IFTYPE_AP);
3887 	if (ar->p2p) {
3888 		wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_GO) |
3889 					  BIT(NL80211_IFTYPE_P2P_CLIENT);
3890 	}
3891 
3892 	if (IS_ENABLED(CONFIG_ATH6KL_REGDOMAIN) &&
3893 	    test_bit(ATH6KL_FW_CAPABILITY_REGDOMAIN, ar->fw_capabilities)) {
3894 		wiphy->reg_notifier = ath6kl_cfg80211_reg_notify;
3895 		ar->wiphy->features |= NL80211_FEATURE_CELL_BASE_REG_HINTS;
3896 	}
3897 
3898 	/* max num of ssids that can be probed during scanning */
3899 	wiphy->max_scan_ssids = MAX_PROBED_SSIDS;
3900 
3901 	/* max num of ssids that can be matched after scan */
3902 	if (test_bit(ATH6KL_FW_CAPABILITY_SCHED_SCAN_MATCH_LIST,
3903 		     ar->fw_capabilities))
3904 		wiphy->max_match_sets = MAX_PROBED_SSIDS;
3905 
3906 	wiphy->max_scan_ie_len = 1000; /* FIX: what is correct limit? */
3907 	switch (ar->hw.cap) {
3908 	case WMI_11AN_CAP:
3909 		ht = true;
3910 		fallthrough;
3911 	case WMI_11A_CAP:
3912 		band_5gig = true;
3913 		break;
3914 	case WMI_11GN_CAP:
3915 		ht = true;
3916 		fallthrough;
3917 	case WMI_11G_CAP:
3918 		band_2gig = true;
3919 		break;
3920 	case WMI_11AGN_CAP:
3921 		ht = true;
3922 		fallthrough;
3923 	case WMI_11AG_CAP:
3924 		band_2gig = true;
3925 		band_5gig = true;
3926 		break;
3927 	default:
3928 		ath6kl_err("invalid phy capability!\n");
3929 		return -EINVAL;
3930 	}
3931 
3932 	/*
3933 	 * Even if the fw has HT support, advertise HT cap only when
3934 	 * the firmware has support to override RSN capability, otherwise
3935 	 * 4-way handshake would fail.
3936 	 */
3937 	if (!(ht &&
3938 	      test_bit(ATH6KL_FW_CAPABILITY_RSN_CAP_OVERRIDE,
3939 		       ar->fw_capabilities))) {
3940 		ath6kl_band_2ghz.ht_cap.cap = 0;
3941 		ath6kl_band_2ghz.ht_cap.ht_supported = false;
3942 		ath6kl_band_5ghz.ht_cap.cap = 0;
3943 		ath6kl_band_5ghz.ht_cap.ht_supported = false;
3944 
3945 		if (ht)
3946 			ath6kl_err("Firmware lacks RSN-CAP-OVERRIDE, so HT (802.11n) is disabled.");
3947 	}
3948 
3949 	if (test_bit(ATH6KL_FW_CAPABILITY_64BIT_RATES,
3950 		     ar->fw_capabilities)) {
3951 		ath6kl_band_2ghz.ht_cap.mcs.rx_mask[0] = 0xff;
3952 		ath6kl_band_5ghz.ht_cap.mcs.rx_mask[0] = 0xff;
3953 		ath6kl_band_2ghz.ht_cap.mcs.rx_mask[1] = 0xff;
3954 		ath6kl_band_5ghz.ht_cap.mcs.rx_mask[1] = 0xff;
3955 		ar->hw.tx_ant = 0x3; /* mask, 2 antenna */
3956 		ar->hw.rx_ant = 0x3;
3957 	} else {
3958 		ath6kl_band_2ghz.ht_cap.mcs.rx_mask[0] = 0xff;
3959 		ath6kl_band_5ghz.ht_cap.mcs.rx_mask[0] = 0xff;
3960 		ar->hw.tx_ant = 1;
3961 		ar->hw.rx_ant = 1;
3962 	}
3963 
3964 	wiphy->available_antennas_tx = ar->hw.tx_ant;
3965 	wiphy->available_antennas_rx = ar->hw.rx_ant;
3966 
3967 	if (band_2gig)
3968 		wiphy->bands[NL80211_BAND_2GHZ] = &ath6kl_band_2ghz;
3969 	if (band_5gig)
3970 		wiphy->bands[NL80211_BAND_5GHZ] = &ath6kl_band_5ghz;
3971 
3972 	wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
3973 
3974 	wiphy->cipher_suites = cipher_suites;
3975 	wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
3976 
3977 #ifdef CONFIG_PM
3978 	wiphy->wowlan = &ath6kl_wowlan_support;
3979 #endif
3980 
3981 	wiphy->max_sched_scan_ssids = MAX_PROBED_SSIDS;
3982 
3983 	ar->wiphy->flags |= WIPHY_FLAG_SUPPORTS_FW_ROAM |
3984 			    WIPHY_FLAG_HAVE_AP_SME |
3985 			    WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL |
3986 			    WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
3987 
3988 	if (test_bit(ATH6KL_FW_CAPABILITY_SCHED_SCAN_V2, ar->fw_capabilities))
3989 		ar->wiphy->max_sched_scan_reqs = 1;
3990 
3991 	if (test_bit(ATH6KL_FW_CAPABILITY_INACTIVITY_TIMEOUT,
3992 		     ar->fw_capabilities))
3993 		ar->wiphy->features |= NL80211_FEATURE_INACTIVITY_TIMER;
3994 
3995 	ar->wiphy->probe_resp_offload =
3996 		NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
3997 		NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 |
3998 		NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P;
3999 
4000 	ret = wiphy_register(wiphy);
4001 	if (ret < 0) {
4002 		ath6kl_err("couldn't register wiphy device\n");
4003 		return ret;
4004 	}
4005 
4006 	ar->wiphy_registered = true;
4007 
4008 	return 0;
4009 }
4010 
4011 void ath6kl_cfg80211_cleanup(struct ath6kl *ar)
4012 {
4013 	wiphy_unregister(ar->wiphy);
4014 
4015 	ar->wiphy_registered = false;
4016 }
4017 
4018 struct ath6kl *ath6kl_cfg80211_create(void)
4019 {
4020 	struct ath6kl *ar;
4021 	struct wiphy *wiphy;
4022 
4023 	/* create a new wiphy for use with cfg80211 */
4024 	wiphy = wiphy_new(&ath6kl_cfg80211_ops, sizeof(struct ath6kl));
4025 
4026 	if (!wiphy) {
4027 		ath6kl_err("couldn't allocate wiphy device\n");
4028 		return NULL;
4029 	}
4030 
4031 	ar = wiphy_priv(wiphy);
4032 	ar->wiphy = wiphy;
4033 
4034 	return ar;
4035 }
4036 
4037 /* Note: ar variable must not be accessed after calling this! */
4038 void ath6kl_cfg80211_destroy(struct ath6kl *ar)
4039 {
4040 	int i;
4041 
4042 	for (i = 0; i < AP_MAX_NUM_STA; i++)
4043 		kfree(ar->sta_list[i].aggr_conn);
4044 
4045 	wiphy_free(ar->wiphy);
4046 }
4047 
4048