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