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