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