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