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