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