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