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