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