[go: nahoru, domu]

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