2 * Copyright (c) 2004-2011 Atheros Communications Inc.
3 * Copyright (c) 2011-2012 Qualcomm Atheros, Inc.
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.
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.
18 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
20 #include <linux/moduleparam.h>
21 #include <linux/inetdevice.h>
22 #include <linux/export.h>
30 #define RATETAB_ENT(_rate, _rateid, _flags) { \
33 .hw_value = (_rateid), \
36 #define CHAN2G(_channel, _freq, _flags) { \
37 .band = IEEE80211_BAND_2GHZ, \
38 .hw_value = (_channel), \
39 .center_freq = (_freq), \
41 .max_antenna_gain = 0, \
45 #define CHAN5G(_channel, _flags) { \
46 .band = IEEE80211_BAND_5GHZ, \
47 .hw_value = (_channel), \
48 .center_freq = 5000 + (5 * (_channel)), \
50 .max_antenna_gain = 0, \
54 #define DEFAULT_BG_SCAN_PERIOD 60
56 static struct ieee80211_rate ath6kl_rates[] = {
57 RATETAB_ENT(10, 0x1, 0),
58 RATETAB_ENT(20, 0x2, 0),
59 RATETAB_ENT(55, 0x4, 0),
60 RATETAB_ENT(110, 0x8, 0),
61 RATETAB_ENT(60, 0x10, 0),
62 RATETAB_ENT(90, 0x20, 0),
63 RATETAB_ENT(120, 0x40, 0),
64 RATETAB_ENT(180, 0x80, 0),
65 RATETAB_ENT(240, 0x100, 0),
66 RATETAB_ENT(360, 0x200, 0),
67 RATETAB_ENT(480, 0x400, 0),
68 RATETAB_ENT(540, 0x800, 0),
71 #define ath6kl_a_rates (ath6kl_rates + 4)
72 #define ath6kl_a_rates_size 8
73 #define ath6kl_g_rates (ath6kl_rates + 0)
74 #define ath6kl_g_rates_size 12
76 #define ath6kl_g_htcap IEEE80211_HT_CAP_SGI_20
77 #define ath6kl_a_htcap (IEEE80211_HT_CAP_SUP_WIDTH_20_40 | \
78 IEEE80211_HT_CAP_SGI_20 | \
79 IEEE80211_HT_CAP_SGI_40)
81 static struct ieee80211_channel ath6kl_2ghz_channels[] = {
98 static struct ieee80211_channel ath6kl_5ghz_a_channels[] = {
99 CHAN5G(34, 0), CHAN5G(36, 0),
100 CHAN5G(38, 0), CHAN5G(40, 0),
101 CHAN5G(42, 0), CHAN5G(44, 0),
102 CHAN5G(46, 0), CHAN5G(48, 0),
103 CHAN5G(52, 0), CHAN5G(56, 0),
104 CHAN5G(60, 0), CHAN5G(64, 0),
105 CHAN5G(100, 0), CHAN5G(104, 0),
106 CHAN5G(108, 0), CHAN5G(112, 0),
107 CHAN5G(116, 0), CHAN5G(120, 0),
108 CHAN5G(124, 0), CHAN5G(128, 0),
109 CHAN5G(132, 0), CHAN5G(136, 0),
110 CHAN5G(140, 0), CHAN5G(149, 0),
111 CHAN5G(153, 0), CHAN5G(157, 0),
112 CHAN5G(161, 0), CHAN5G(165, 0),
113 CHAN5G(184, 0), CHAN5G(188, 0),
114 CHAN5G(192, 0), CHAN5G(196, 0),
115 CHAN5G(200, 0), CHAN5G(204, 0),
116 CHAN5G(208, 0), CHAN5G(212, 0),
120 static struct ieee80211_supported_band ath6kl_band_2ghz = {
121 .n_channels = ARRAY_SIZE(ath6kl_2ghz_channels),
122 .channels = ath6kl_2ghz_channels,
123 .n_bitrates = ath6kl_g_rates_size,
124 .bitrates = ath6kl_g_rates,
125 .ht_cap.cap = ath6kl_g_htcap,
126 .ht_cap.ht_supported = true,
129 static struct ieee80211_supported_band ath6kl_band_5ghz = {
130 .n_channels = ARRAY_SIZE(ath6kl_5ghz_a_channels),
131 .channels = ath6kl_5ghz_a_channels,
132 .n_bitrates = ath6kl_a_rates_size,
133 .bitrates = ath6kl_a_rates,
134 .ht_cap.cap = ath6kl_a_htcap,
135 .ht_cap.ht_supported = true,
138 #define CCKM_KRK_CIPHER_SUITE 0x004096ff /* use for KRK */
140 /* returns true if scheduled scan was stopped */
141 static bool __ath6kl_cfg80211_sscan_stop(struct ath6kl_vif *vif)
143 struct ath6kl *ar = vif->ar;
145 if (ar->state != ATH6KL_STATE_SCHED_SCAN)
148 del_timer_sync(&vif->sched_scan_timer);
150 ath6kl_wmi_set_host_sleep_mode_cmd(ar->wmi, vif->fw_vif_idx,
151 ATH6KL_HOST_MODE_AWAKE);
153 ar->state = ATH6KL_STATE_ON;
158 static void ath6kl_cfg80211_sscan_disable(struct ath6kl_vif *vif)
160 struct ath6kl *ar = vif->ar;
163 stopped = __ath6kl_cfg80211_sscan_stop(vif);
168 cfg80211_sched_scan_stopped(ar->wiphy);
171 static int ath6kl_set_wpa_version(struct ath6kl_vif *vif,
172 enum nl80211_wpa_versions wpa_version)
174 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: %u\n", __func__, wpa_version);
177 vif->auth_mode = NONE_AUTH;
178 } else if (wpa_version & NL80211_WPA_VERSION_2) {
179 vif->auth_mode = WPA2_AUTH;
180 } else if (wpa_version & NL80211_WPA_VERSION_1) {
181 vif->auth_mode = WPA_AUTH;
183 ath6kl_err("%s: %u not supported\n", __func__, wpa_version);
190 static int ath6kl_set_auth_type(struct ath6kl_vif *vif,
191 enum nl80211_auth_type auth_type)
193 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: 0x%x\n", __func__, auth_type);
196 case NL80211_AUTHTYPE_OPEN_SYSTEM:
197 vif->dot11_auth_mode = OPEN_AUTH;
199 case NL80211_AUTHTYPE_SHARED_KEY:
200 vif->dot11_auth_mode = SHARED_AUTH;
202 case NL80211_AUTHTYPE_NETWORK_EAP:
203 vif->dot11_auth_mode = LEAP_AUTH;
206 case NL80211_AUTHTYPE_AUTOMATIC:
207 vif->dot11_auth_mode = OPEN_AUTH | SHARED_AUTH;
211 ath6kl_err("%s: 0x%x not supported\n", __func__, auth_type);
218 static int ath6kl_set_cipher(struct ath6kl_vif *vif, u32 cipher, bool ucast)
220 u8 *ar_cipher = ucast ? &vif->prwise_crypto : &vif->grp_crypto;
221 u8 *ar_cipher_len = ucast ? &vif->prwise_crypto_len :
222 &vif->grp_crypto_len;
224 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: cipher 0x%x, ucast %u\n",
225 __func__, cipher, ucast);
229 /* our own hack to use value 0 as no crypto used */
230 *ar_cipher = NONE_CRYPT;
233 case WLAN_CIPHER_SUITE_WEP40:
234 *ar_cipher = WEP_CRYPT;
237 case WLAN_CIPHER_SUITE_WEP104:
238 *ar_cipher = WEP_CRYPT;
241 case WLAN_CIPHER_SUITE_TKIP:
242 *ar_cipher = TKIP_CRYPT;
245 case WLAN_CIPHER_SUITE_CCMP:
246 *ar_cipher = AES_CRYPT;
249 case WLAN_CIPHER_SUITE_SMS4:
250 *ar_cipher = WAPI_CRYPT;
254 ath6kl_err("cipher 0x%x not supported\n", cipher);
261 static void ath6kl_set_key_mgmt(struct ath6kl_vif *vif, u32 key_mgmt)
263 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: 0x%x\n", __func__, key_mgmt);
265 if (key_mgmt == WLAN_AKM_SUITE_PSK) {
266 if (vif->auth_mode == WPA_AUTH)
267 vif->auth_mode = WPA_PSK_AUTH;
268 else if (vif->auth_mode == WPA2_AUTH)
269 vif->auth_mode = WPA2_PSK_AUTH;
270 } else if (key_mgmt == 0x00409600) {
271 if (vif->auth_mode == WPA_AUTH)
272 vif->auth_mode = WPA_AUTH_CCKM;
273 else if (vif->auth_mode == WPA2_AUTH)
274 vif->auth_mode = WPA2_AUTH_CCKM;
275 } else if (key_mgmt != WLAN_AKM_SUITE_8021X) {
276 vif->auth_mode = NONE_AUTH;
280 static bool ath6kl_cfg80211_ready(struct ath6kl_vif *vif)
282 struct ath6kl *ar = vif->ar;
284 if (!test_bit(WMI_READY, &ar->flag)) {
285 ath6kl_err("wmi is not ready\n");
289 if (!test_bit(WLAN_ENABLED, &vif->flags)) {
290 ath6kl_err("wlan disabled\n");
297 static bool ath6kl_is_wpa_ie(const u8 *pos)
299 return pos[0] == WLAN_EID_WPA && pos[1] >= 4 &&
300 pos[2] == 0x00 && pos[3] == 0x50 &&
301 pos[4] == 0xf2 && pos[5] == 0x01;
304 static bool ath6kl_is_rsn_ie(const u8 *pos)
306 return pos[0] == WLAN_EID_RSN;
309 static bool ath6kl_is_wps_ie(const u8 *pos)
311 return (pos[0] == WLAN_EID_VENDOR_SPECIFIC &&
313 pos[2] == 0x00 && pos[3] == 0x50 && pos[4] == 0xf2 &&
317 static int ath6kl_set_assoc_req_ies(struct ath6kl_vif *vif, const u8 *ies,
320 struct ath6kl *ar = vif->ar;
327 * Clear previously set flag
330 ar->connect_ctrl_flags &= ~CONNECT_WPS_FLAG;
333 * Filter out RSN/WPA IE(s)
336 if (ies && ies_len) {
337 buf = kmalloc(ies_len, GFP_KERNEL);
342 while (pos + 1 < ies + ies_len) {
343 if (pos + 2 + pos[1] > ies + ies_len)
345 if (!(ath6kl_is_wpa_ie(pos) || ath6kl_is_rsn_ie(pos))) {
346 memcpy(buf + len, pos, 2 + pos[1]);
350 if (ath6kl_is_wps_ie(pos))
351 ar->connect_ctrl_flags |= CONNECT_WPS_FLAG;
357 ret = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx,
358 WMI_FRAME_ASSOC_REQ, buf, len);
363 static int ath6kl_nliftype_to_drv_iftype(enum nl80211_iftype type, u8 *nw_type)
366 case NL80211_IFTYPE_STATION:
367 *nw_type = INFRA_NETWORK;
369 case NL80211_IFTYPE_ADHOC:
370 *nw_type = ADHOC_NETWORK;
372 case NL80211_IFTYPE_AP:
373 *nw_type = AP_NETWORK;
375 case NL80211_IFTYPE_P2P_CLIENT:
376 *nw_type = INFRA_NETWORK;
378 case NL80211_IFTYPE_P2P_GO:
379 *nw_type = AP_NETWORK;
382 ath6kl_err("invalid interface type %u\n", type);
389 static bool ath6kl_is_valid_iftype(struct ath6kl *ar, enum nl80211_iftype type,
390 u8 *if_idx, u8 *nw_type)
394 if (ath6kl_nliftype_to_drv_iftype(type, nw_type))
397 if (ar->ibss_if_active || ((type == NL80211_IFTYPE_ADHOC) &&
401 if (type == NL80211_IFTYPE_STATION ||
402 type == NL80211_IFTYPE_AP || type == NL80211_IFTYPE_ADHOC) {
403 for (i = 0; i < ar->vif_max; i++) {
404 if ((ar->avail_idx_map >> i) & BIT(0)) {
411 if (type == NL80211_IFTYPE_P2P_CLIENT ||
412 type == NL80211_IFTYPE_P2P_GO) {
413 for (i = ar->max_norm_iface; i < ar->vif_max; i++) {
414 if ((ar->avail_idx_map >> i) & BIT(0)) {
424 static bool ath6kl_is_tx_pending(struct ath6kl *ar)
426 return ar->tx_pending[ath6kl_wmi_get_control_ep(ar->wmi)] == 0;
430 static int ath6kl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
431 struct cfg80211_connect_params *sme)
433 struct ath6kl *ar = ath6kl_priv(dev);
434 struct ath6kl_vif *vif = netdev_priv(dev);
436 u8 nw_subtype = (ar->p2p) ? SUBTYPE_P2PDEV : SUBTYPE_NONE;
439 ath6kl_cfg80211_sscan_disable(vif);
441 vif->sme_state = SME_CONNECTING;
443 if (!ath6kl_cfg80211_ready(vif))
446 if (test_bit(DESTROY_IN_PROGRESS, &ar->flag)) {
447 ath6kl_err("destroy in progress\n");
451 if (test_bit(SKIP_SCAN, &ar->flag) &&
452 ((sme->channel && sme->channel->center_freq == 0) ||
453 (sme->bssid && is_zero_ether_addr(sme->bssid)))) {
454 ath6kl_err("SkipScan: channel or bssid invalid\n");
458 if (down_interruptible(&ar->sem)) {
459 ath6kl_err("busy, couldn't get access\n");
463 if (test_bit(DESTROY_IN_PROGRESS, &ar->flag)) {
464 ath6kl_err("busy, destroy in progress\n");
469 if (ar->tx_pending[ath6kl_wmi_get_control_ep(ar->wmi)]) {
471 * sleep until the command queue drains
473 wait_event_interruptible_timeout(ar->event_wq,
474 ath6kl_is_tx_pending(ar),
476 if (signal_pending(current)) {
477 ath6kl_err("cmd queue drain timeout\n");
483 status = ath6kl_set_assoc_req_ies(vif, sme->ie, sme->ie_len);
489 if (sme->ie == NULL || sme->ie_len == 0)
490 ar->connect_ctrl_flags &= ~CONNECT_WPS_FLAG;
492 if (test_bit(CONNECTED, &vif->flags) &&
493 vif->ssid_len == sme->ssid_len &&
494 !memcmp(vif->ssid, sme->ssid, vif->ssid_len)) {
495 vif->reconnect_flag = true;
496 status = ath6kl_wmi_reconnect_cmd(ar->wmi, vif->fw_vif_idx,
502 ath6kl_err("wmi_reconnect_cmd failed\n");
506 } else if (vif->ssid_len == sme->ssid_len &&
507 !memcmp(vif->ssid, sme->ssid, vif->ssid_len)) {
508 ath6kl_disconnect(vif);
511 memset(vif->ssid, 0, sizeof(vif->ssid));
512 vif->ssid_len = sme->ssid_len;
513 memcpy(vif->ssid, sme->ssid, sme->ssid_len);
516 vif->ch_hint = sme->channel->center_freq;
518 memset(vif->req_bssid, 0, sizeof(vif->req_bssid));
519 if (sme->bssid && !is_broadcast_ether_addr(sme->bssid))
520 memcpy(vif->req_bssid, sme->bssid, sizeof(vif->req_bssid));
522 ath6kl_set_wpa_version(vif, sme->crypto.wpa_versions);
524 status = ath6kl_set_auth_type(vif, sme->auth_type);
530 if (sme->crypto.n_ciphers_pairwise)
531 ath6kl_set_cipher(vif, sme->crypto.ciphers_pairwise[0], true);
533 ath6kl_set_cipher(vif, 0, true);
535 ath6kl_set_cipher(vif, sme->crypto.cipher_group, false);
537 if (sme->crypto.n_akm_suites)
538 ath6kl_set_key_mgmt(vif, sme->crypto.akm_suites[0]);
540 if ((sme->key_len) &&
541 (vif->auth_mode == NONE_AUTH) &&
542 (vif->prwise_crypto == WEP_CRYPT)) {
543 struct ath6kl_key *key = NULL;
545 if (sme->key_idx > WMI_MAX_KEY_INDEX) {
546 ath6kl_err("key index %d out of bounds\n",
552 key = &vif->keys[sme->key_idx];
553 key->key_len = sme->key_len;
554 memcpy(key->key, sme->key, key->key_len);
555 key->cipher = vif->prwise_crypto;
556 vif->def_txkey_index = sme->key_idx;
558 ath6kl_wmi_addkey_cmd(ar->wmi, vif->fw_vif_idx, sme->key_idx,
560 GROUP_USAGE | TX_USAGE,
563 key->key, KEY_OP_INIT_VAL, NULL,
567 if (!ar->usr_bss_filter) {
568 clear_bit(CLEAR_BSSFILTER_ON_BEACON, &vif->flags);
569 if (ath6kl_wmi_bssfilter_cmd(ar->wmi, vif->fw_vif_idx,
570 ALL_BSS_FILTER, 0) != 0) {
571 ath6kl_err("couldn't set bss filtering\n");
577 vif->nw_type = vif->next_mode;
579 if (vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT)
580 nw_subtype = SUBTYPE_P2PCLIENT;
582 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
583 "%s: connect called with authmode %d dot11 auth %d"
584 " PW crypto %d PW crypto len %d GRP crypto %d"
585 " GRP crypto len %d channel hint %u\n",
587 vif->auth_mode, vif->dot11_auth_mode, vif->prwise_crypto,
588 vif->prwise_crypto_len, vif->grp_crypto,
589 vif->grp_crypto_len, vif->ch_hint);
591 vif->reconnect_flag = 0;
593 if (vif->nw_type == INFRA_NETWORK) {
594 interval = max_t(u16, vif->listen_intvl_t,
595 ATH6KL_MAX_WOW_LISTEN_INTL);
596 status = ath6kl_wmi_listeninterval_cmd(ar->wmi, vif->fw_vif_idx,
600 ath6kl_err("couldn't set listen intervel\n");
606 status = ath6kl_wmi_connect_cmd(ar->wmi, vif->fw_vif_idx, vif->nw_type,
607 vif->dot11_auth_mode, vif->auth_mode,
609 vif->prwise_crypto_len,
610 vif->grp_crypto, vif->grp_crypto_len,
611 vif->ssid_len, vif->ssid,
612 vif->req_bssid, vif->ch_hint,
613 ar->connect_ctrl_flags, nw_subtype);
615 /* disable background scan if period is 0 */
616 if (sme->bg_scan_period == 0)
617 sme->bg_scan_period = 0xffff;
619 /* configure default value if not specified */
620 if (sme->bg_scan_period == -1)
621 sme->bg_scan_period = DEFAULT_BG_SCAN_PERIOD;
623 ath6kl_wmi_scanparams_cmd(ar->wmi, vif->fw_vif_idx, 0, 0,
624 sme->bg_scan_period, 0, 0, 0, 3, 0, 0, 0);
628 if (status == -EINVAL) {
629 memset(vif->ssid, 0, sizeof(vif->ssid));
631 ath6kl_err("invalid request\n");
634 ath6kl_err("ath6kl_wmi_connect_cmd failed\n");
638 if ((!(ar->connect_ctrl_flags & CONNECT_DO_WPA_OFFLOAD)) &&
639 ((vif->auth_mode == WPA_PSK_AUTH) ||
640 (vif->auth_mode == WPA2_PSK_AUTH))) {
641 mod_timer(&vif->disconnect_timer,
642 jiffies + msecs_to_jiffies(DISCON_TIMER_INTVAL));
645 ar->connect_ctrl_flags &= ~CONNECT_DO_WPA_OFFLOAD;
646 set_bit(CONNECT_PEND, &vif->flags);
651 static struct cfg80211_bss *
652 ath6kl_add_bss_if_needed(struct ath6kl_vif *vif,
653 enum network_type nw_type,
655 struct ieee80211_channel *chan,
657 size_t beacon_ie_len)
659 struct ath6kl *ar = vif->ar;
660 struct cfg80211_bss *bss;
661 u16 cap_mask, cap_val;
664 if (nw_type & ADHOC_NETWORK) {
665 cap_mask = WLAN_CAPABILITY_IBSS;
666 cap_val = WLAN_CAPABILITY_IBSS;
668 cap_mask = WLAN_CAPABILITY_ESS;
669 cap_val = WLAN_CAPABILITY_ESS;
672 bss = cfg80211_get_bss(ar->wiphy, chan, bssid,
673 vif->ssid, vif->ssid_len,
677 * Since cfg80211 may not yet know about the BSS,
678 * generate a partial entry until the first BSS info
679 * event becomes available.
681 * Prepend SSID element since it is not included in the Beacon
682 * IEs from the target.
684 ie = kmalloc(2 + vif->ssid_len + beacon_ie_len, GFP_KERNEL);
687 ie[0] = WLAN_EID_SSID;
688 ie[1] = vif->ssid_len;
689 memcpy(ie + 2, vif->ssid, vif->ssid_len);
690 memcpy(ie + 2 + vif->ssid_len, beacon_ie, beacon_ie_len);
691 bss = cfg80211_inform_bss(ar->wiphy, chan,
692 bssid, 0, cap_val, 100,
693 ie, 2 + vif->ssid_len + beacon_ie_len,
696 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "added bss %pM to "
697 "cfg80211\n", bssid);
700 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "cfg80211 already has a bss\n");
705 void ath6kl_cfg80211_connect_event(struct ath6kl_vif *vif, u16 channel,
706 u8 *bssid, u16 listen_intvl,
708 enum network_type nw_type,
709 u8 beacon_ie_len, u8 assoc_req_len,
710 u8 assoc_resp_len, u8 *assoc_info)
712 struct ieee80211_channel *chan;
713 struct ath6kl *ar = vif->ar;
714 struct cfg80211_bss *bss;
716 /* capinfo + listen interval */
717 u8 assoc_req_ie_offset = sizeof(u16) + sizeof(u16);
719 /* capinfo + status code + associd */
720 u8 assoc_resp_ie_offset = sizeof(u16) + sizeof(u16) + sizeof(u16);
722 u8 *assoc_req_ie = assoc_info + beacon_ie_len + assoc_req_ie_offset;
723 u8 *assoc_resp_ie = assoc_info + beacon_ie_len + assoc_req_len +
724 assoc_resp_ie_offset;
726 assoc_req_len -= assoc_req_ie_offset;
727 assoc_resp_len -= assoc_resp_ie_offset;
730 * Store Beacon interval here; DTIM period will be available only once
731 * a Beacon frame from the AP is seen.
733 vif->assoc_bss_beacon_int = beacon_intvl;
734 clear_bit(DTIM_PERIOD_AVAIL, &vif->flags);
736 if (nw_type & ADHOC_NETWORK) {
737 if (vif->wdev.iftype != NL80211_IFTYPE_ADHOC) {
738 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
739 "%s: ath6k not in ibss mode\n", __func__);
744 if (nw_type & INFRA_NETWORK) {
745 if (vif->wdev.iftype != NL80211_IFTYPE_STATION &&
746 vif->wdev.iftype != NL80211_IFTYPE_P2P_CLIENT) {
747 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
748 "%s: ath6k not in station mode\n", __func__);
753 chan = ieee80211_get_channel(ar->wiphy, (int) channel);
755 bss = ath6kl_add_bss_if_needed(vif, nw_type, bssid, chan,
756 assoc_info, beacon_ie_len);
758 ath6kl_err("could not add cfg80211 bss entry\n");
762 if (nw_type & ADHOC_NETWORK) {
763 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "ad-hoc %s selected\n",
764 nw_type & ADHOC_CREATOR ? "creator" : "joiner");
765 cfg80211_ibss_joined(vif->ndev, bssid, GFP_KERNEL);
766 cfg80211_put_bss(bss);
770 if (vif->sme_state == SME_CONNECTING) {
771 /* inform connect result to cfg80211 */
772 vif->sme_state = SME_CONNECTED;
773 cfg80211_connect_result(vif->ndev, bssid,
774 assoc_req_ie, assoc_req_len,
775 assoc_resp_ie, assoc_resp_len,
776 WLAN_STATUS_SUCCESS, GFP_KERNEL);
777 cfg80211_put_bss(bss);
778 } else if (vif->sme_state == SME_CONNECTED) {
779 /* inform roam event to cfg80211 */
780 cfg80211_roamed_bss(vif->ndev, bss, assoc_req_ie, assoc_req_len,
781 assoc_resp_ie, assoc_resp_len, GFP_KERNEL);
785 static int ath6kl_cfg80211_disconnect(struct wiphy *wiphy,
786 struct net_device *dev, u16 reason_code)
788 struct ath6kl *ar = ath6kl_priv(dev);
789 struct ath6kl_vif *vif = netdev_priv(dev);
791 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: reason=%u\n", __func__,
794 ath6kl_cfg80211_sscan_disable(vif);
796 if (!ath6kl_cfg80211_ready(vif))
799 if (test_bit(DESTROY_IN_PROGRESS, &ar->flag)) {
800 ath6kl_err("busy, destroy in progress\n");
804 if (down_interruptible(&ar->sem)) {
805 ath6kl_err("busy, couldn't get access\n");
809 vif->reconnect_flag = 0;
810 ath6kl_disconnect(vif);
811 memset(vif->ssid, 0, sizeof(vif->ssid));
814 if (!test_bit(SKIP_SCAN, &ar->flag))
815 memset(vif->req_bssid, 0, sizeof(vif->req_bssid));
819 vif->sme_state = SME_DISCONNECTED;
824 void ath6kl_cfg80211_disconnect_event(struct ath6kl_vif *vif, u8 reason,
825 u8 *bssid, u8 assoc_resp_len,
826 u8 *assoc_info, u16 proto_reason)
828 struct ath6kl *ar = vif->ar;
831 cfg80211_scan_done(vif->scan_req, true);
832 vif->scan_req = NULL;
835 if (vif->nw_type & ADHOC_NETWORK) {
836 if (vif->wdev.iftype != NL80211_IFTYPE_ADHOC) {
837 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
838 "%s: ath6k not in ibss mode\n", __func__);
841 memset(bssid, 0, ETH_ALEN);
842 cfg80211_ibss_joined(vif->ndev, bssid, GFP_KERNEL);
846 if (vif->nw_type & INFRA_NETWORK) {
847 if (vif->wdev.iftype != NL80211_IFTYPE_STATION &&
848 vif->wdev.iftype != NL80211_IFTYPE_P2P_CLIENT) {
849 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
850 "%s: ath6k not in station mode\n", __func__);
856 * Send a disconnect command to target when a disconnect event is
857 * received with reason code other than 3 (DISCONNECT_CMD - disconnect
858 * request from host) to make the firmware stop trying to connect even
859 * after giving disconnect event. There will be one more disconnect
860 * event for this disconnect command with reason code DISCONNECT_CMD
861 * which will be notified to cfg80211.
864 if (reason != DISCONNECT_CMD) {
865 ath6kl_wmi_disconnect_cmd(ar->wmi, vif->fw_vif_idx);
869 clear_bit(CONNECT_PEND, &vif->flags);
871 if (vif->sme_state == SME_CONNECTING) {
872 cfg80211_connect_result(vif->ndev,
875 WLAN_STATUS_UNSPECIFIED_FAILURE,
877 } else if (vif->sme_state == SME_CONNECTED) {
878 cfg80211_disconnected(vif->ndev, reason,
879 NULL, 0, GFP_KERNEL);
882 vif->sme_state = SME_DISCONNECTED;
885 static int ath6kl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev,
886 struct cfg80211_scan_request *request)
888 struct ath6kl *ar = ath6kl_priv(ndev);
889 struct ath6kl_vif *vif = netdev_priv(ndev);
891 u16 *channels = NULL;
893 u32 force_fg_scan = 0;
895 if (!ath6kl_cfg80211_ready(vif))
898 ath6kl_cfg80211_sscan_disable(vif);
900 if (!ar->usr_bss_filter) {
901 clear_bit(CLEAR_BSSFILTER_ON_BEACON, &vif->flags);
902 ret = ath6kl_wmi_bssfilter_cmd(
903 ar->wmi, vif->fw_vif_idx,
904 (test_bit(CONNECTED, &vif->flags) ?
905 ALL_BUT_BSS_FILTER : ALL_BSS_FILTER), 0);
907 ath6kl_err("couldn't set bss filtering\n");
912 if (request->n_ssids && request->ssids[0].ssid_len) {
915 if (request->n_ssids > (MAX_PROBED_SSID_INDEX - 1))
916 request->n_ssids = MAX_PROBED_SSID_INDEX - 1;
918 for (i = 0; i < request->n_ssids; i++)
919 ath6kl_wmi_probedssid_cmd(ar->wmi, vif->fw_vif_idx,
920 i + 1, SPECIFIC_SSID_FLAG,
921 request->ssids[i].ssid_len,
922 request->ssids[i].ssid);
925 /* this also clears IE in fw if it's not set */
926 ret = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx,
928 request->ie, request->ie_len);
930 ath6kl_err("failed to set Probe Request appie for "
936 * Scan only the requested channels if the request specifies a set of
937 * channels. If the list is longer than the target supports, do not
938 * configure the list and instead, scan all available channels.
940 if (request->n_channels > 0 &&
941 request->n_channels <= WMI_MAX_CHANNELS) {
944 n_channels = request->n_channels;
946 channels = kzalloc(n_channels * sizeof(u16), GFP_KERNEL);
947 if (channels == NULL) {
948 ath6kl_warn("failed to set scan channels, "
949 "scan all channels");
953 for (i = 0; i < n_channels; i++)
954 channels[i] = request->channels[i]->center_freq;
957 if (test_bit(CONNECTED, &vif->flags))
960 vif->scan_req = request;
962 if (test_bit(ATH6KL_FW_CAPABILITY_STA_P2PDEV_DUPLEX,
963 ar->fw_capabilities)) {
965 * If capable of doing P2P mgmt operations using
966 * station interface, send additional information like
967 * supported rates to advertise and xmit rates for
970 ret = ath6kl_wmi_beginscan_cmd(ar->wmi, vif->fw_vif_idx,
971 WMI_LONG_SCAN, force_fg_scan,
973 ATH6KL_FG_SCAN_INTERVAL,
974 n_channels, channels,
978 ret = ath6kl_wmi_startscan_cmd(ar->wmi, vif->fw_vif_idx,
979 WMI_LONG_SCAN, force_fg_scan,
981 ATH6KL_FG_SCAN_INTERVAL,
982 n_channels, channels);
985 ath6kl_err("wmi_startscan_cmd failed\n");
986 vif->scan_req = NULL;
994 void ath6kl_cfg80211_scan_complete_event(struct ath6kl_vif *vif, bool aborted)
996 struct ath6kl *ar = vif->ar;
999 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: status%s\n", __func__,
1000 aborted ? " aborted" : "");
1008 if (vif->scan_req->n_ssids && vif->scan_req->ssids[0].ssid_len) {
1009 for (i = 0; i < vif->scan_req->n_ssids; i++) {
1010 ath6kl_wmi_probedssid_cmd(ar->wmi, vif->fw_vif_idx,
1011 i + 1, DISABLE_SSID_FLAG,
1017 cfg80211_scan_done(vif->scan_req, aborted);
1018 vif->scan_req = NULL;
1021 static int ath6kl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
1022 u8 key_index, bool pairwise,
1024 struct key_params *params)
1026 struct ath6kl *ar = ath6kl_priv(ndev);
1027 struct ath6kl_vif *vif = netdev_priv(ndev);
1028 struct ath6kl_key *key = NULL;
1033 if (!ath6kl_cfg80211_ready(vif))
1036 if (params->cipher == CCKM_KRK_CIPHER_SUITE) {
1037 if (params->key_len != WMI_KRK_LEN)
1039 return ath6kl_wmi_add_krk_cmd(ar->wmi, vif->fw_vif_idx,
1043 if (key_index > WMI_MAX_KEY_INDEX) {
1044 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
1045 "%s: key index %d out of bounds\n", __func__,
1050 key = &vif->keys[key_index];
1051 memset(key, 0, sizeof(struct ath6kl_key));
1054 key_usage = PAIRWISE_USAGE;
1056 key_usage = GROUP_USAGE;
1058 seq_len = params->seq_len;
1059 if (params->cipher == WLAN_CIPHER_SUITE_SMS4 &&
1060 seq_len > ATH6KL_KEY_SEQ_LEN) {
1061 /* Only first half of the WPI PN is configured */
1062 seq_len = ATH6KL_KEY_SEQ_LEN;
1064 if (params->key_len > WLAN_MAX_KEY_LEN ||
1065 seq_len > sizeof(key->seq))
1068 key->key_len = params->key_len;
1069 memcpy(key->key, params->key, key->key_len);
1070 key->seq_len = seq_len;
1071 memcpy(key->seq, params->seq, key->seq_len);
1072 key->cipher = params->cipher;
1074 switch (key->cipher) {
1075 case WLAN_CIPHER_SUITE_WEP40:
1076 case WLAN_CIPHER_SUITE_WEP104:
1077 key_type = WEP_CRYPT;
1080 case WLAN_CIPHER_SUITE_TKIP:
1081 key_type = TKIP_CRYPT;
1084 case WLAN_CIPHER_SUITE_CCMP:
1085 key_type = AES_CRYPT;
1087 case WLAN_CIPHER_SUITE_SMS4:
1088 key_type = WAPI_CRYPT;
1095 if (((vif->auth_mode == WPA_PSK_AUTH) ||
1096 (vif->auth_mode == WPA2_PSK_AUTH)) &&
1097 (key_usage & GROUP_USAGE))
1098 del_timer(&vif->disconnect_timer);
1100 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
1101 "%s: index %d, key_len %d, key_type 0x%x, key_usage 0x%x, seq_len %d\n",
1102 __func__, key_index, key->key_len, key_type,
1103 key_usage, key->seq_len);
1105 if (vif->nw_type == AP_NETWORK && !pairwise &&
1106 (key_type == TKIP_CRYPT || key_type == AES_CRYPT ||
1107 key_type == WAPI_CRYPT)) {
1108 ar->ap_mode_bkey.valid = true;
1109 ar->ap_mode_bkey.key_index = key_index;
1110 ar->ap_mode_bkey.key_type = key_type;
1111 ar->ap_mode_bkey.key_len = key->key_len;
1112 memcpy(ar->ap_mode_bkey.key, key->key, key->key_len);
1113 if (!test_bit(CONNECTED, &vif->flags)) {
1114 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "Delay initial group "
1115 "key configuration until AP mode has been "
1118 * The key will be set in ath6kl_connect_ap_mode() once
1119 * the connected event is received from the target.
1125 if (vif->next_mode == AP_NETWORK && key_type == WEP_CRYPT &&
1126 !test_bit(CONNECTED, &vif->flags)) {
1128 * Store the key locally so that it can be re-configured after
1129 * the AP mode has properly started
1130 * (ath6kl_install_statioc_wep_keys).
1132 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "Delay WEP key configuration "
1133 "until AP mode has been started\n");
1134 vif->wep_key_list[key_index].key_len = key->key_len;
1135 memcpy(vif->wep_key_list[key_index].key, key->key,
1140 return ath6kl_wmi_addkey_cmd(ar->wmi, vif->fw_vif_idx, key_index,
1141 key_type, key_usage, key->key_len,
1142 key->seq, key->seq_len, key->key,
1144 (u8 *) mac_addr, SYNC_BOTH_WMIFLAG);
1147 static int ath6kl_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev,
1148 u8 key_index, bool pairwise,
1151 struct ath6kl *ar = ath6kl_priv(ndev);
1152 struct ath6kl_vif *vif = netdev_priv(ndev);
1154 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: index %d\n", __func__, key_index);
1156 if (!ath6kl_cfg80211_ready(vif))
1159 if (key_index > WMI_MAX_KEY_INDEX) {
1160 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
1161 "%s: key index %d out of bounds\n", __func__,
1166 if (!vif->keys[key_index].key_len) {
1167 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
1168 "%s: index %d is empty\n", __func__, key_index);
1172 vif->keys[key_index].key_len = 0;
1174 return ath6kl_wmi_deletekey_cmd(ar->wmi, vif->fw_vif_idx, key_index);
1177 static int ath6kl_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev,
1178 u8 key_index, bool pairwise,
1179 const u8 *mac_addr, void *cookie,
1180 void (*callback) (void *cookie,
1181 struct key_params *))
1183 struct ath6kl_vif *vif = netdev_priv(ndev);
1184 struct ath6kl_key *key = NULL;
1185 struct key_params params;
1187 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: index %d\n", __func__, key_index);
1189 if (!ath6kl_cfg80211_ready(vif))
1192 if (key_index > WMI_MAX_KEY_INDEX) {
1193 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
1194 "%s: key index %d out of bounds\n", __func__,
1199 key = &vif->keys[key_index];
1200 memset(¶ms, 0, sizeof(params));
1201 params.cipher = key->cipher;
1202 params.key_len = key->key_len;
1203 params.seq_len = key->seq_len;
1204 params.seq = key->seq;
1205 params.key = key->key;
1207 callback(cookie, ¶ms);
1209 return key->key_len ? 0 : -ENOENT;
1212 static int ath6kl_cfg80211_set_default_key(struct wiphy *wiphy,
1213 struct net_device *ndev,
1214 u8 key_index, bool unicast,
1217 struct ath6kl *ar = ath6kl_priv(ndev);
1218 struct ath6kl_vif *vif = netdev_priv(ndev);
1219 struct ath6kl_key *key = NULL;
1221 enum crypto_type key_type = NONE_CRYPT;
1223 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: index %d\n", __func__, key_index);
1225 if (!ath6kl_cfg80211_ready(vif))
1228 if (key_index > WMI_MAX_KEY_INDEX) {
1229 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
1230 "%s: key index %d out of bounds\n",
1231 __func__, key_index);
1235 if (!vif->keys[key_index].key_len) {
1236 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: invalid key index %d\n",
1237 __func__, key_index);
1241 vif->def_txkey_index = key_index;
1242 key = &vif->keys[vif->def_txkey_index];
1243 key_usage = GROUP_USAGE;
1244 if (vif->prwise_crypto == WEP_CRYPT)
1245 key_usage |= TX_USAGE;
1247 key_type = vif->prwise_crypto;
1249 key_type = vif->grp_crypto;
1251 if (vif->next_mode == AP_NETWORK && !test_bit(CONNECTED, &vif->flags))
1252 return 0; /* Delay until AP mode has been started */
1254 return ath6kl_wmi_addkey_cmd(ar->wmi, vif->fw_vif_idx,
1255 vif->def_txkey_index,
1256 key_type, key_usage,
1257 key->key_len, key->seq, key->seq_len,
1259 KEY_OP_INIT_VAL, NULL,
1263 void ath6kl_cfg80211_tkip_micerr_event(struct ath6kl_vif *vif, u8 keyid,
1266 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
1267 "%s: keyid %d, ismcast %d\n", __func__, keyid, ismcast);
1269 cfg80211_michael_mic_failure(vif->ndev, vif->bssid,
1270 (ismcast ? NL80211_KEYTYPE_GROUP :
1271 NL80211_KEYTYPE_PAIRWISE), keyid, NULL,
1275 static int ath6kl_cfg80211_set_wiphy_params(struct wiphy *wiphy, u32 changed)
1277 struct ath6kl *ar = (struct ath6kl *)wiphy_priv(wiphy);
1278 struct ath6kl_vif *vif;
1281 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: changed 0x%x\n", __func__,
1284 vif = ath6kl_vif_first(ar);
1288 if (!ath6kl_cfg80211_ready(vif))
1291 if (changed & WIPHY_PARAM_RTS_THRESHOLD) {
1292 ret = ath6kl_wmi_set_rts_cmd(ar->wmi, wiphy->rts_threshold);
1294 ath6kl_err("ath6kl_wmi_set_rts_cmd failed\n");
1303 * The type nl80211_tx_power_setting replaces the following
1304 * data type from 2.6.36 onwards
1306 static int ath6kl_cfg80211_set_txpower(struct wiphy *wiphy,
1307 enum nl80211_tx_power_setting type,
1310 struct ath6kl *ar = (struct ath6kl *)wiphy_priv(wiphy);
1311 struct ath6kl_vif *vif;
1312 int dbm = MBM_TO_DBM(mbm);
1314 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: type 0x%x, dbm %d\n", __func__,
1317 vif = ath6kl_vif_first(ar);
1321 if (!ath6kl_cfg80211_ready(vif))
1325 case NL80211_TX_POWER_AUTOMATIC:
1327 case NL80211_TX_POWER_LIMITED:
1331 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: type 0x%x not supported\n",
1336 ath6kl_wmi_set_tx_pwr_cmd(ar->wmi, vif->fw_vif_idx, dbm);
1341 static int ath6kl_cfg80211_get_txpower(struct wiphy *wiphy, int *dbm)
1343 struct ath6kl *ar = (struct ath6kl *)wiphy_priv(wiphy);
1344 struct ath6kl_vif *vif;
1346 vif = ath6kl_vif_first(ar);
1350 if (!ath6kl_cfg80211_ready(vif))
1353 if (test_bit(CONNECTED, &vif->flags)) {
1356 if (ath6kl_wmi_get_tx_pwr_cmd(ar->wmi, vif->fw_vif_idx) != 0) {
1357 ath6kl_err("ath6kl_wmi_get_tx_pwr_cmd failed\n");
1361 wait_event_interruptible_timeout(ar->event_wq, ar->tx_pwr != 0,
1364 if (signal_pending(current)) {
1365 ath6kl_err("target did not respond\n");
1374 static int ath6kl_cfg80211_set_power_mgmt(struct wiphy *wiphy,
1375 struct net_device *dev,
1376 bool pmgmt, int timeout)
1378 struct ath6kl *ar = ath6kl_priv(dev);
1379 struct wmi_power_mode_cmd mode;
1380 struct ath6kl_vif *vif = netdev_priv(dev);
1382 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: pmgmt %d, timeout %d\n",
1383 __func__, pmgmt, timeout);
1385 if (!ath6kl_cfg80211_ready(vif))
1389 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: max perf\n", __func__);
1390 mode.pwr_mode = REC_POWER;
1392 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: rec power\n", __func__);
1393 mode.pwr_mode = MAX_PERF_POWER;
1396 if (ath6kl_wmi_powermode_cmd(ar->wmi, vif->fw_vif_idx,
1397 mode.pwr_mode) != 0) {
1398 ath6kl_err("wmi_powermode_cmd failed\n");
1405 static struct net_device *ath6kl_cfg80211_add_iface(struct wiphy *wiphy,
1407 enum nl80211_iftype type,
1409 struct vif_params *params)
1411 struct ath6kl *ar = wiphy_priv(wiphy);
1412 struct net_device *ndev;
1415 if (ar->num_vif == ar->vif_max) {
1416 ath6kl_err("Reached maximum number of supported vif\n");
1417 return ERR_PTR(-EINVAL);
1420 if (!ath6kl_is_valid_iftype(ar, type, &if_idx, &nw_type)) {
1421 ath6kl_err("Not a supported interface type\n");
1422 return ERR_PTR(-EINVAL);
1425 ndev = ath6kl_interface_add(ar, name, type, if_idx, nw_type);
1427 return ERR_PTR(-ENOMEM);
1434 static int ath6kl_cfg80211_del_iface(struct wiphy *wiphy,
1435 struct net_device *ndev)
1437 struct ath6kl *ar = wiphy_priv(wiphy);
1438 struct ath6kl_vif *vif = netdev_priv(ndev);
1440 spin_lock_bh(&ar->list_lock);
1441 list_del(&vif->list);
1442 spin_unlock_bh(&ar->list_lock);
1444 ath6kl_cleanup_vif(vif, test_bit(WMI_READY, &ar->flag));
1446 ath6kl_cfg80211_vif_cleanup(vif);
1451 static int ath6kl_cfg80211_change_iface(struct wiphy *wiphy,
1452 struct net_device *ndev,
1453 enum nl80211_iftype type, u32 *flags,
1454 struct vif_params *params)
1456 struct ath6kl_vif *vif = netdev_priv(ndev);
1459 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: type %u\n", __func__, type);
1462 * Don't bring up p2p on an interface which is not initialized
1463 * for p2p operation where fw does not have capability to switch
1464 * dynamically between non-p2p and p2p type interface.
1466 if (!test_bit(ATH6KL_FW_CAPABILITY_STA_P2PDEV_DUPLEX,
1467 vif->ar->fw_capabilities) &&
1468 (type == NL80211_IFTYPE_P2P_CLIENT ||
1469 type == NL80211_IFTYPE_P2P_GO)) {
1470 if (vif->ar->vif_max == 1) {
1471 if (vif->fw_vif_idx != 0)
1474 goto set_iface_type;
1477 for (i = vif->ar->max_norm_iface; i < vif->ar->vif_max; i++) {
1478 if (i == vif->fw_vif_idx)
1482 if (i == vif->ar->vif_max) {
1483 ath6kl_err("Invalid interface to bring up P2P\n");
1490 case NL80211_IFTYPE_STATION:
1491 vif->next_mode = INFRA_NETWORK;
1493 case NL80211_IFTYPE_ADHOC:
1494 vif->next_mode = ADHOC_NETWORK;
1496 case NL80211_IFTYPE_AP:
1497 vif->next_mode = AP_NETWORK;
1499 case NL80211_IFTYPE_P2P_CLIENT:
1500 vif->next_mode = INFRA_NETWORK;
1502 case NL80211_IFTYPE_P2P_GO:
1503 vif->next_mode = AP_NETWORK;
1506 ath6kl_err("invalid interface type %u\n", type);
1510 vif->wdev.iftype = type;
1515 static int ath6kl_cfg80211_join_ibss(struct wiphy *wiphy,
1516 struct net_device *dev,
1517 struct cfg80211_ibss_params *ibss_param)
1519 struct ath6kl *ar = ath6kl_priv(dev);
1520 struct ath6kl_vif *vif = netdev_priv(dev);
1523 if (!ath6kl_cfg80211_ready(vif))
1526 vif->ssid_len = ibss_param->ssid_len;
1527 memcpy(vif->ssid, ibss_param->ssid, vif->ssid_len);
1529 if (ibss_param->channel)
1530 vif->ch_hint = ibss_param->channel->center_freq;
1532 if (ibss_param->channel_fixed) {
1534 * TODO: channel_fixed: The channel should be fixed, do not
1535 * search for IBSSs to join on other channels. Target
1536 * firmware does not support this feature, needs to be
1542 memset(vif->req_bssid, 0, sizeof(vif->req_bssid));
1543 if (ibss_param->bssid && !is_broadcast_ether_addr(ibss_param->bssid))
1544 memcpy(vif->req_bssid, ibss_param->bssid,
1545 sizeof(vif->req_bssid));
1547 ath6kl_set_wpa_version(vif, 0);
1549 status = ath6kl_set_auth_type(vif, NL80211_AUTHTYPE_OPEN_SYSTEM);
1553 if (ibss_param->privacy) {
1554 ath6kl_set_cipher(vif, WLAN_CIPHER_SUITE_WEP40, true);
1555 ath6kl_set_cipher(vif, WLAN_CIPHER_SUITE_WEP40, false);
1557 ath6kl_set_cipher(vif, 0, true);
1558 ath6kl_set_cipher(vif, 0, false);
1561 vif->nw_type = vif->next_mode;
1563 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
1564 "%s: connect called with authmode %d dot11 auth %d"
1565 " PW crypto %d PW crypto len %d GRP crypto %d"
1566 " GRP crypto len %d channel hint %u\n",
1568 vif->auth_mode, vif->dot11_auth_mode, vif->prwise_crypto,
1569 vif->prwise_crypto_len, vif->grp_crypto,
1570 vif->grp_crypto_len, vif->ch_hint);
1572 status = ath6kl_wmi_connect_cmd(ar->wmi, vif->fw_vif_idx, vif->nw_type,
1573 vif->dot11_auth_mode, vif->auth_mode,
1575 vif->prwise_crypto_len,
1576 vif->grp_crypto, vif->grp_crypto_len,
1577 vif->ssid_len, vif->ssid,
1578 vif->req_bssid, vif->ch_hint,
1579 ar->connect_ctrl_flags, SUBTYPE_NONE);
1580 set_bit(CONNECT_PEND, &vif->flags);
1585 static int ath6kl_cfg80211_leave_ibss(struct wiphy *wiphy,
1586 struct net_device *dev)
1588 struct ath6kl_vif *vif = netdev_priv(dev);
1590 if (!ath6kl_cfg80211_ready(vif))
1593 ath6kl_disconnect(vif);
1594 memset(vif->ssid, 0, sizeof(vif->ssid));
1600 static const u32 cipher_suites[] = {
1601 WLAN_CIPHER_SUITE_WEP40,
1602 WLAN_CIPHER_SUITE_WEP104,
1603 WLAN_CIPHER_SUITE_TKIP,
1604 WLAN_CIPHER_SUITE_CCMP,
1605 CCKM_KRK_CIPHER_SUITE,
1606 WLAN_CIPHER_SUITE_SMS4,
1609 static bool is_rate_legacy(s32 rate)
1611 static const s32 legacy[] = { 1000, 2000, 5500, 11000,
1612 6000, 9000, 12000, 18000, 24000,
1617 for (i = 0; i < ARRAY_SIZE(legacy); i++)
1618 if (rate == legacy[i])
1624 static bool is_rate_ht20(s32 rate, u8 *mcs, bool *sgi)
1626 static const s32 ht20[] = { 6500, 13000, 19500, 26000, 39000,
1627 52000, 58500, 65000, 72200
1631 for (i = 0; i < ARRAY_SIZE(ht20); i++) {
1632 if (rate == ht20[i]) {
1633 if (i == ARRAY_SIZE(ht20) - 1)
1634 /* last rate uses sgi */
1646 static bool is_rate_ht40(s32 rate, u8 *mcs, bool *sgi)
1648 static const s32 ht40[] = { 13500, 27000, 40500, 54000,
1649 81000, 108000, 121500, 135000,
1654 for (i = 0; i < ARRAY_SIZE(ht40); i++) {
1655 if (rate == ht40[i]) {
1656 if (i == ARRAY_SIZE(ht40) - 1)
1657 /* last rate uses sgi */
1670 static int ath6kl_get_station(struct wiphy *wiphy, struct net_device *dev,
1671 u8 *mac, struct station_info *sinfo)
1673 struct ath6kl *ar = ath6kl_priv(dev);
1674 struct ath6kl_vif *vif = netdev_priv(dev);
1681 if (memcmp(mac, vif->bssid, ETH_ALEN) != 0)
1684 if (down_interruptible(&ar->sem))
1687 set_bit(STATS_UPDATE_PEND, &vif->flags);
1689 ret = ath6kl_wmi_get_stats_cmd(ar->wmi, vif->fw_vif_idx);
1696 left = wait_event_interruptible_timeout(ar->event_wq,
1697 !test_bit(STATS_UPDATE_PEND,
1708 if (vif->target_stats.rx_byte) {
1709 sinfo->rx_bytes = vif->target_stats.rx_byte;
1710 sinfo->filled |= STATION_INFO_RX_BYTES;
1711 sinfo->rx_packets = vif->target_stats.rx_pkt;
1712 sinfo->filled |= STATION_INFO_RX_PACKETS;
1715 if (vif->target_stats.tx_byte) {
1716 sinfo->tx_bytes = vif->target_stats.tx_byte;
1717 sinfo->filled |= STATION_INFO_TX_BYTES;
1718 sinfo->tx_packets = vif->target_stats.tx_pkt;
1719 sinfo->filled |= STATION_INFO_TX_PACKETS;
1722 sinfo->signal = vif->target_stats.cs_rssi;
1723 sinfo->filled |= STATION_INFO_SIGNAL;
1725 rate = vif->target_stats.tx_ucast_rate;
1727 if (is_rate_legacy(rate)) {
1728 sinfo->txrate.legacy = rate / 100;
1729 } else if (is_rate_ht20(rate, &mcs, &sgi)) {
1731 sinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI;
1732 sinfo->txrate.mcs = mcs - 1;
1734 sinfo->txrate.mcs = mcs;
1737 sinfo->txrate.flags |= RATE_INFO_FLAGS_MCS;
1738 } else if (is_rate_ht40(rate, &mcs, &sgi)) {
1740 sinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI;
1741 sinfo->txrate.mcs = mcs - 1;
1743 sinfo->txrate.mcs = mcs;
1746 sinfo->txrate.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH;
1747 sinfo->txrate.flags |= RATE_INFO_FLAGS_MCS;
1749 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
1750 "invalid rate from stats: %d\n", rate);
1751 ath6kl_debug_war(ar, ATH6KL_WAR_INVALID_RATE);
1755 sinfo->filled |= STATION_INFO_TX_BITRATE;
1757 if (test_bit(CONNECTED, &vif->flags) &&
1758 test_bit(DTIM_PERIOD_AVAIL, &vif->flags) &&
1759 vif->nw_type == INFRA_NETWORK) {
1760 sinfo->filled |= STATION_INFO_BSS_PARAM;
1761 sinfo->bss_param.flags = 0;
1762 sinfo->bss_param.dtim_period = vif->assoc_bss_dtim_period;
1763 sinfo->bss_param.beacon_interval = vif->assoc_bss_beacon_int;
1769 static int ath6kl_set_pmksa(struct wiphy *wiphy, struct net_device *netdev,
1770 struct cfg80211_pmksa *pmksa)
1772 struct ath6kl *ar = ath6kl_priv(netdev);
1773 struct ath6kl_vif *vif = netdev_priv(netdev);
1775 return ath6kl_wmi_setpmkid_cmd(ar->wmi, vif->fw_vif_idx, pmksa->bssid,
1776 pmksa->pmkid, true);
1779 static int ath6kl_del_pmksa(struct wiphy *wiphy, struct net_device *netdev,
1780 struct cfg80211_pmksa *pmksa)
1782 struct ath6kl *ar = ath6kl_priv(netdev);
1783 struct ath6kl_vif *vif = netdev_priv(netdev);
1785 return ath6kl_wmi_setpmkid_cmd(ar->wmi, vif->fw_vif_idx, pmksa->bssid,
1786 pmksa->pmkid, false);
1789 static int ath6kl_flush_pmksa(struct wiphy *wiphy, struct net_device *netdev)
1791 struct ath6kl *ar = ath6kl_priv(netdev);
1792 struct ath6kl_vif *vif = netdev_priv(netdev);
1794 if (test_bit(CONNECTED, &vif->flags))
1795 return ath6kl_wmi_setpmkid_cmd(ar->wmi, vif->fw_vif_idx,
1796 vif->bssid, NULL, false);
1800 static int ath6kl_wow_usr(struct ath6kl *ar, struct ath6kl_vif *vif,
1801 struct cfg80211_wowlan *wow, u32 *filter)
1804 u8 mask[WOW_MASK_SIZE];
1807 /* Configure the patterns that we received from the user. */
1808 for (i = 0; i < wow->n_patterns; i++) {
1811 * Convert given nl80211 specific mask value to equivalent
1812 * driver specific mask value and send it to the chip along
1813 * with patterns. For example, If the mask value defined in
1814 * struct cfg80211_wowlan is 0xA (equivalent binary is 1010),
1815 * then equivalent driver specific mask value is
1816 * "0xFF 0x00 0xFF 0x00".
1818 memset(&mask, 0, sizeof(mask));
1819 for (pos = 0; pos < wow->patterns[i].pattern_len; pos++) {
1820 if (wow->patterns[i].mask[pos / 8] & (0x1 << (pos % 8)))
1824 * Note: Pattern's offset is not passed as part of wowlan
1825 * parameter from CFG layer. So it's always passed as ZERO
1826 * to the firmware. It means, given WOW patterns are always
1827 * matched from the first byte of received pkt in the firmware.
1829 ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi,
1830 vif->fw_vif_idx, WOW_LIST_ID,
1831 wow->patterns[i].pattern_len,
1832 0 /* pattern offset */,
1833 wow->patterns[i].pattern, mask);
1838 if (wow->disconnect)
1839 *filter |= WOW_FILTER_OPTION_NWK_DISASSOC;
1842 *filter |= WOW_FILTER_OPTION_MAGIC_PACKET;
1844 if (wow->gtk_rekey_failure)
1845 *filter |= WOW_FILTER_OPTION_GTK_ERROR;
1847 if (wow->eap_identity_req)
1848 *filter |= WOW_FILTER_OPTION_EAP_REQ;
1850 if (wow->four_way_handshake)
1851 *filter |= WOW_FILTER_OPTION_8021X_4WAYHS;
1856 static int ath6kl_wow_ap(struct ath6kl *ar, struct ath6kl_vif *vif)
1858 static const u8 unicst_pattern[] = { 0x00, 0x00, 0x00,
1859 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1860 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1862 static const u8 unicst_mask[] = { 0x01, 0x00, 0x00,
1863 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1864 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1866 u8 unicst_offset = 0;
1867 static const u8 arp_pattern[] = { 0x08, 0x06 };
1868 static const u8 arp_mask[] = { 0xff, 0xff };
1870 static const u8 discvr_pattern[] = { 0xe0, 0x00, 0x00, 0xf8 };
1871 static const u8 discvr_mask[] = { 0xf0, 0x00, 0x00, 0xf8 };
1872 u8 discvr_offset = 38;
1873 static const u8 dhcp_pattern[] = { 0xff, 0xff, 0xff, 0xff,
1874 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1875 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
1876 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1877 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1878 0x00, 0x00, 0x00, 0x00, 0x00, 0x43 /* port 67 */ };
1879 static const u8 dhcp_mask[] = { 0xff, 0xff, 0xff, 0xff,
1880 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1881 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
1882 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1883 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1884 0x00, 0x00, 0x00, 0x00, 0xff, 0xff /* port 67 */ };
1888 /* Setup unicast IP, EAPOL-like and ARP pkt pattern */
1889 ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi,
1890 vif->fw_vif_idx, WOW_LIST_ID,
1891 sizeof(unicst_pattern), unicst_offset,
1892 unicst_pattern, unicst_mask);
1894 ath6kl_err("failed to add WOW unicast IP pattern\n");
1898 /* Setup all ARP pkt pattern */
1899 ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi,
1900 vif->fw_vif_idx, WOW_LIST_ID,
1901 sizeof(arp_pattern), arp_offset,
1902 arp_pattern, arp_mask);
1904 ath6kl_err("failed to add WOW ARP pattern\n");
1909 * Setup multicast pattern for mDNS 224.0.0.251,
1910 * SSDP 239.255.255.250 and LLMNR 224.0.0.252
1912 ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi,
1913 vif->fw_vif_idx, WOW_LIST_ID,
1914 sizeof(discvr_pattern), discvr_offset,
1915 discvr_pattern, discvr_mask);
1917 ath6kl_err("failed to add WOW mDNS/SSDP/LLMNR pattern\n");
1921 /* Setup all DHCP broadcast pkt pattern */
1922 ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi,
1923 vif->fw_vif_idx, WOW_LIST_ID,
1924 sizeof(dhcp_pattern), dhcp_offset,
1925 dhcp_pattern, dhcp_mask);
1927 ath6kl_err("failed to add WOW DHCP broadcast pattern\n");
1934 static int ath6kl_wow_sta(struct ath6kl *ar, struct ath6kl_vif *vif)
1936 struct net_device *ndev = vif->ndev;
1937 static const u8 discvr_pattern[] = { 0xe0, 0x00, 0x00, 0xf8 };
1938 static const u8 discvr_mask[] = { 0xf0, 0x00, 0x00, 0xf8 };
1939 u8 discvr_offset = 38;
1940 u8 mac_mask[ETH_ALEN];
1943 /* Setup unicast pkt pattern */
1944 memset(mac_mask, 0xff, ETH_ALEN);
1945 ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi,
1946 vif->fw_vif_idx, WOW_LIST_ID,
1947 ETH_ALEN, 0, ndev->dev_addr,
1950 ath6kl_err("failed to add WOW unicast pattern\n");
1955 * Setup multicast pattern for mDNS 224.0.0.251,
1956 * SSDP 239.255.255.250 and LLMNR 224.0.0.252
1958 if ((ndev->flags & IFF_ALLMULTI) ||
1959 (ndev->flags & IFF_MULTICAST && netdev_mc_count(ndev) > 0)) {
1960 ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi,
1961 vif->fw_vif_idx, WOW_LIST_ID,
1962 sizeof(discvr_pattern), discvr_offset,
1963 discvr_pattern, discvr_mask);
1965 ath6kl_err("failed to add WOW mDNS/SSDP/LLMNR "
1974 static int is_hsleep_mode_procsed(struct ath6kl_vif *vif)
1976 return test_bit(HOST_SLEEP_MODE_CMD_PROCESSED, &vif->flags);
1979 static bool is_ctrl_ep_empty(struct ath6kl *ar)
1981 return !ar->tx_pending[ar->ctrl_ep];
1984 static int ath6kl_cfg80211_host_sleep(struct ath6kl *ar, struct ath6kl_vif *vif)
1988 clear_bit(HOST_SLEEP_MODE_CMD_PROCESSED, &vif->flags);
1990 ret = ath6kl_wmi_set_host_sleep_mode_cmd(ar->wmi, vif->fw_vif_idx,
1991 ATH6KL_HOST_MODE_ASLEEP);
1995 left = wait_event_interruptible_timeout(ar->event_wq,
1996 is_hsleep_mode_procsed(vif),
1999 ath6kl_warn("timeout, didn't get host sleep cmd processed event\n");
2001 } else if (left < 0) {
2002 ath6kl_warn("error while waiting for host sleep cmd processed event %d\n",
2007 if (ar->tx_pending[ar->ctrl_ep]) {
2008 left = wait_event_interruptible_timeout(ar->event_wq,
2009 is_ctrl_ep_empty(ar),
2012 ath6kl_warn("clear wmi ctrl data timeout\n");
2014 } else if (left < 0) {
2015 ath6kl_warn("clear wmi ctrl data failed: %d\n", left);
2023 static int ath6kl_wow_suspend(struct ath6kl *ar, struct cfg80211_wowlan *wow)
2025 struct in_device *in_dev;
2026 struct in_ifaddr *ifa;
2027 struct ath6kl_vif *vif;
2032 __be32 ips[MAX_IP_ADDRS];
2034 vif = ath6kl_vif_first(ar);
2038 if (!ath6kl_cfg80211_ready(vif))
2041 if (!test_bit(CONNECTED, &vif->flags))
2044 if (wow && (wow->n_patterns > WOW_MAX_FILTERS_PER_LIST))
2047 /* Clear existing WOW patterns */
2048 for (i = 0; i < WOW_MAX_FILTERS_PER_LIST; i++)
2049 ath6kl_wmi_del_wow_pattern_cmd(ar->wmi, vif->fw_vif_idx,
2053 * Skip the default WOW pattern configuration
2054 * if the driver receives any WOW patterns from
2058 ret = ath6kl_wow_usr(ar, vif, wow, &filter);
2059 else if (vif->nw_type == AP_NETWORK)
2060 ret = ath6kl_wow_ap(ar, vif);
2062 ret = ath6kl_wow_sta(ar, vif);
2067 netif_stop_queue(vif->ndev);
2069 if (vif->nw_type != AP_NETWORK) {
2070 ret = ath6kl_wmi_listeninterval_cmd(ar->wmi, vif->fw_vif_idx,
2071 ATH6KL_MAX_WOW_LISTEN_INTL,
2076 /* Set listen interval x 15 times as bmiss time */
2077 bmiss_time = ATH6KL_MAX_WOW_LISTEN_INTL * 15;
2078 if (bmiss_time > ATH6KL_MAX_BMISS_TIME)
2079 bmiss_time = ATH6KL_MAX_BMISS_TIME;
2081 ret = ath6kl_wmi_bmisstime_cmd(ar->wmi, vif->fw_vif_idx,
2086 ret = ath6kl_wmi_scanparams_cmd(ar->wmi, vif->fw_vif_idx,
2087 0xFFFF, 0, 0xFFFF, 0, 0, 0,
2093 ar->state = ATH6KL_STATE_SUSPENDING;
2095 /* Setup own IP addr for ARP agent. */
2096 in_dev = __in_dev_get_rtnl(vif->ndev);
2100 ifa = in_dev->ifa_list;
2101 memset(&ips, 0, sizeof(ips));
2103 /* Configure IP addr only if IP address count < MAX_IP_ADDRS */
2104 while (index < MAX_IP_ADDRS && ifa) {
2105 ips[index] = ifa->ifa_local;
2106 ifa = ifa->ifa_next;
2111 ath6kl_err("total IP addr count is exceeding fw limit\n");
2115 ret = ath6kl_wmi_set_ip_cmd(ar->wmi, vif->fw_vif_idx, ips[0], ips[1]);
2117 ath6kl_err("fail to setup ip for arp agent\n");
2122 ret = ath6kl_wmi_set_wow_mode_cmd(ar->wmi, vif->fw_vif_idx,
2123 ATH6KL_WOW_MODE_ENABLE,
2125 WOW_HOST_REQ_DELAY);
2129 ret = ath6kl_cfg80211_host_sleep(ar, vif);
2136 static int ath6kl_wow_resume(struct ath6kl *ar)
2138 struct ath6kl_vif *vif;
2141 vif = ath6kl_vif_first(ar);
2145 ar->state = ATH6KL_STATE_RESUMING;
2147 ret = ath6kl_wmi_set_host_sleep_mode_cmd(ar->wmi, vif->fw_vif_idx,
2148 ATH6KL_HOST_MODE_AWAKE);
2150 ath6kl_warn("Failed to configure host sleep mode for "
2151 "wow resume: %d\n", ret);
2152 ar->state = ATH6KL_STATE_WOW;
2156 if (vif->nw_type != AP_NETWORK) {
2157 ret = ath6kl_wmi_scanparams_cmd(ar->wmi, vif->fw_vif_idx,
2158 0, 0, 0, 0, 0, 0, 3, 0, 0, 0);
2162 ret = ath6kl_wmi_listeninterval_cmd(ar->wmi, vif->fw_vif_idx,
2163 vif->listen_intvl_t, 0);
2167 ret = ath6kl_wmi_bmisstime_cmd(ar->wmi, vif->fw_vif_idx,
2168 vif->bmiss_time_t, 0);
2173 ar->state = ATH6KL_STATE_ON;
2175 netif_wake_queue(vif->ndev);
2180 static int ath6kl_cfg80211_deepsleep_suspend(struct ath6kl *ar)
2182 struct ath6kl_vif *vif;
2185 vif = ath6kl_vif_first(ar);
2189 if (!ath6kl_cfg80211_ready(vif))
2192 ath6kl_cfg80211_stop_all(ar);
2194 /* Save the current power mode before enabling power save */
2195 ar->wmi->saved_pwr_mode = ar->wmi->pwr_mode;
2197 ret = ath6kl_wmi_powermode_cmd(ar->wmi, 0, REC_POWER);
2201 /* Disable WOW mode */
2202 ret = ath6kl_wmi_set_wow_mode_cmd(ar->wmi, vif->fw_vif_idx,
2203 ATH6KL_WOW_MODE_DISABLE,
2208 /* Flush all non control pkts in TX path */
2209 ath6kl_tx_data_cleanup(ar);
2211 ret = ath6kl_cfg80211_host_sleep(ar, vif);
2218 static int ath6kl_cfg80211_deepsleep_resume(struct ath6kl *ar)
2220 struct ath6kl_vif *vif;
2223 vif = ath6kl_vif_first(ar);
2228 if (ar->wmi->pwr_mode != ar->wmi->saved_pwr_mode) {
2229 ret = ath6kl_wmi_powermode_cmd(ar->wmi, 0,
2230 ar->wmi->saved_pwr_mode);
2235 ret = ath6kl_wmi_set_host_sleep_mode_cmd(ar->wmi, vif->fw_vif_idx,
2236 ATH6KL_HOST_MODE_AWAKE);
2240 ar->state = ATH6KL_STATE_ON;
2242 /* Reset scan parameter to default values */
2243 ret = ath6kl_wmi_scanparams_cmd(ar->wmi, vif->fw_vif_idx,
2244 0, 0, 0, 0, 0, 0, 3, 0, 0, 0);
2251 int ath6kl_cfg80211_suspend(struct ath6kl *ar,
2252 enum ath6kl_cfg_suspend_mode mode,
2253 struct cfg80211_wowlan *wow)
2255 struct ath6kl_vif *vif;
2256 enum ath6kl_state prev_state;
2260 case ATH6KL_CFG_SUSPEND_WOW:
2262 ath6kl_dbg(ATH6KL_DBG_SUSPEND, "wow mode suspend\n");
2264 /* Flush all non control pkts in TX path */
2265 ath6kl_tx_data_cleanup(ar);
2267 prev_state = ar->state;
2269 ret = ath6kl_wow_suspend(ar, wow);
2271 ar->state = prev_state;
2275 ar->state = ATH6KL_STATE_WOW;
2278 case ATH6KL_CFG_SUSPEND_DEEPSLEEP:
2280 ath6kl_dbg(ATH6KL_DBG_SUSPEND, "deep sleep suspend\n");
2282 ret = ath6kl_cfg80211_deepsleep_suspend(ar);
2284 ath6kl_err("deepsleep suspend failed: %d\n", ret);
2288 ar->state = ATH6KL_STATE_DEEPSLEEP;
2292 case ATH6KL_CFG_SUSPEND_CUTPOWER:
2294 ath6kl_cfg80211_stop_all(ar);
2296 if (ar->state == ATH6KL_STATE_OFF) {
2297 ath6kl_dbg(ATH6KL_DBG_SUSPEND,
2298 "suspend hw off, no action for cutpower\n");
2302 ath6kl_dbg(ATH6KL_DBG_SUSPEND, "suspend cutting power\n");
2304 ret = ath6kl_init_hw_stop(ar);
2306 ath6kl_warn("failed to stop hw during suspend: %d\n",
2310 ar->state = ATH6KL_STATE_CUTPOWER;
2314 case ATH6KL_CFG_SUSPEND_SCHED_SCAN:
2316 * Nothing needed for schedule scan, firmware is already in
2317 * wow mode and sleeping most of the time.
2325 list_for_each_entry(vif, &ar->vif_list, list)
2326 ath6kl_cfg80211_scan_complete_event(vif, true);
2330 EXPORT_SYMBOL(ath6kl_cfg80211_suspend);
2332 int ath6kl_cfg80211_resume(struct ath6kl *ar)
2336 switch (ar->state) {
2337 case ATH6KL_STATE_WOW:
2338 ath6kl_dbg(ATH6KL_DBG_SUSPEND, "wow mode resume\n");
2340 ret = ath6kl_wow_resume(ar);
2342 ath6kl_warn("wow mode resume failed: %d\n", ret);
2348 case ATH6KL_STATE_DEEPSLEEP:
2349 ath6kl_dbg(ATH6KL_DBG_SUSPEND, "deep sleep resume\n");
2351 ret = ath6kl_cfg80211_deepsleep_resume(ar);
2353 ath6kl_warn("deep sleep resume failed: %d\n", ret);
2358 case ATH6KL_STATE_CUTPOWER:
2359 ath6kl_dbg(ATH6KL_DBG_SUSPEND, "resume restoring power\n");
2361 ret = ath6kl_init_hw_start(ar);
2363 ath6kl_warn("Failed to boot hw in resume: %d\n", ret);
2368 case ATH6KL_STATE_SCHED_SCAN:
2377 EXPORT_SYMBOL(ath6kl_cfg80211_resume);
2381 /* hif layer decides what suspend mode to use */
2382 static int __ath6kl_cfg80211_suspend(struct wiphy *wiphy,
2383 struct cfg80211_wowlan *wow)
2385 struct ath6kl *ar = wiphy_priv(wiphy);
2387 return ath6kl_hif_suspend(ar, wow);
2390 static int __ath6kl_cfg80211_resume(struct wiphy *wiphy)
2392 struct ath6kl *ar = wiphy_priv(wiphy);
2394 return ath6kl_hif_resume(ar);
2398 * FIXME: WOW suspend mode is selected if the host sdio controller supports
2399 * both sdio irq wake up and keep power. The target pulls sdio data line to
2400 * wake up the host when WOW pattern matches. This causes sdio irq handler
2401 * is being called in the host side which internally hits ath6kl's RX path.
2403 * Since sdio interrupt is not disabled, RX path executes even before
2404 * the host executes the actual resume operation from PM module.
2406 * In the current scenario, WOW resume should happen before start processing
2407 * any data from the target. So It's required to perform WOW resume in RX path.
2408 * Ideally we should perform WOW resume only in the actual platform
2409 * resume path. This area needs bit rework to avoid WOW resume in RX path.
2411 * ath6kl_check_wow_status() is called from ath6kl_rx().
2413 void ath6kl_check_wow_status(struct ath6kl *ar)
2415 if (ar->state == ATH6KL_STATE_SUSPENDING)
2418 if (ar->state == ATH6KL_STATE_WOW)
2419 ath6kl_cfg80211_resume(ar);
2424 void ath6kl_check_wow_status(struct ath6kl *ar)
2429 static int ath6kl_set_htcap(struct ath6kl_vif *vif, enum ieee80211_band band,
2432 struct ath6kl_htcap *htcap = &vif->htcap;
2434 if (htcap->ht_enable == ht_enable)
2438 /* Set default ht capabilities */
2439 htcap->ht_enable = true;
2440 htcap->cap_info = (band == IEEE80211_BAND_2GHZ) ?
2441 ath6kl_g_htcap : ath6kl_a_htcap;
2442 htcap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_16K;
2443 } else /* Disable ht */
2444 memset(htcap, 0, sizeof(*htcap));
2446 return ath6kl_wmi_set_htcap_cmd(vif->ar->wmi, vif->fw_vif_idx,
2450 static bool ath6kl_is_p2p_ie(const u8 *pos)
2452 return pos[0] == WLAN_EID_VENDOR_SPECIFIC && pos[1] >= 4 &&
2453 pos[2] == 0x50 && pos[3] == 0x6f &&
2454 pos[4] == 0x9a && pos[5] == 0x09;
2457 static int ath6kl_set_ap_probe_resp_ies(struct ath6kl_vif *vif,
2458 const u8 *ies, size_t ies_len)
2460 struct ath6kl *ar = vif->ar;
2467 * Filter out P2P IE(s) since they will be included depending on
2468 * the Probe Request frame in ath6kl_send_go_probe_resp().
2471 if (ies && ies_len) {
2472 buf = kmalloc(ies_len, GFP_KERNEL);
2476 while (pos + 1 < ies + ies_len) {
2477 if (pos + 2 + pos[1] > ies + ies_len)
2479 if (!ath6kl_is_p2p_ie(pos)) {
2480 memcpy(buf + len, pos, 2 + pos[1]);
2487 ret = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx,
2488 WMI_FRAME_PROBE_RESP, buf, len);
2493 static int ath6kl_set_ies(struct ath6kl_vif *vif,
2494 struct cfg80211_beacon_data *info)
2496 struct ath6kl *ar = vif->ar;
2499 /* this also clears IE in fw if it's not set */
2500 res = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx,
2503 info->beacon_ies_len);
2507 /* this also clears IE in fw if it's not set */
2508 res = ath6kl_set_ap_probe_resp_ies(vif, info->proberesp_ies,
2509 info->proberesp_ies_len);
2513 /* this also clears IE in fw if it's not set */
2514 res = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx,
2515 WMI_FRAME_ASSOC_RESP,
2516 info->assocresp_ies,
2517 info->assocresp_ies_len);
2524 static int ath6kl_set_channel(struct wiphy *wiphy, struct net_device *dev,
2525 struct ieee80211_channel *chan,
2526 enum nl80211_channel_type channel_type)
2528 struct ath6kl_vif *vif;
2531 * 'dev' could be NULL if a channel change is required for the hardware
2532 * device itself, instead of a particular VIF.
2534 * FIXME: To be handled properly when monitor mode is supported.
2539 vif = netdev_priv(dev);
2541 if (!ath6kl_cfg80211_ready(vif))
2544 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: center_freq=%u hw_value=%u\n",
2545 __func__, chan->center_freq, chan->hw_value);
2546 vif->next_chan = chan->center_freq;
2547 vif->next_ch_type = channel_type;
2548 vif->next_ch_band = chan->band;
2553 static int ath6kl_get_rsn_capab(struct cfg80211_beacon_data *beacon,
2563 rsn_ie = cfg80211_find_ie(WLAN_EID_RSN, beacon->tail, beacon->tail_len);
2567 rsn_ie_len = *(rsn_ie + 1);
2568 /* skip element id and length */
2571 /* skip version, group cipher */
2577 /* skip pairwise cipher suite */
2580 cnt = *((u16 *) rsn_ie);
2581 rsn_ie += (2 + cnt * 4);
2582 rsn_ie_len -= (2 + cnt * 4);
2584 /* skip akm suite */
2587 cnt = *((u16 *) rsn_ie);
2588 rsn_ie += (2 + cnt * 4);
2589 rsn_ie_len -= (2 + cnt * 4);
2594 memcpy(rsn_capab, rsn_ie, 2);
2599 static int ath6kl_start_ap(struct wiphy *wiphy, struct net_device *dev,
2600 struct cfg80211_ap_settings *info)
2602 struct ath6kl *ar = ath6kl_priv(dev);
2603 struct ath6kl_vif *vif = netdev_priv(dev);
2604 struct ieee80211_mgmt *mgmt;
2605 bool hidden = false;
2608 struct wmi_connect_cmd p;
2613 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s:\n", __func__);
2615 if (!ath6kl_cfg80211_ready(vif))
2618 if (vif->next_mode != AP_NETWORK)
2621 res = ath6kl_set_ies(vif, &info->beacon);
2623 ar->ap_mode_bkey.valid = false;
2630 if (info->beacon.head == NULL)
2632 mgmt = (struct ieee80211_mgmt *) info->beacon.head;
2633 ies = mgmt->u.beacon.variable;
2634 if (ies > info->beacon.head + info->beacon.head_len)
2636 ies_len = info->beacon.head + info->beacon.head_len - ies;
2638 if (info->ssid == NULL)
2640 memcpy(vif->ssid, info->ssid, info->ssid_len);
2641 vif->ssid_len = info->ssid_len;
2642 if (info->hidden_ssid != NL80211_HIDDEN_SSID_NOT_IN_USE)
2645 res = ath6kl_wmi_ap_hidden_ssid(ar->wmi, vif->fw_vif_idx, hidden);
2649 ret = ath6kl_set_auth_type(vif, info->auth_type);
2653 memset(&p, 0, sizeof(p));
2655 for (i = 0; i < info->crypto.n_akm_suites; i++) {
2656 switch (info->crypto.akm_suites[i]) {
2657 case WLAN_AKM_SUITE_8021X:
2658 if (info->crypto.wpa_versions & NL80211_WPA_VERSION_1)
2659 p.auth_mode |= WPA_AUTH;
2660 if (info->crypto.wpa_versions & NL80211_WPA_VERSION_2)
2661 p.auth_mode |= WPA2_AUTH;
2663 case WLAN_AKM_SUITE_PSK:
2664 if (info->crypto.wpa_versions & NL80211_WPA_VERSION_1)
2665 p.auth_mode |= WPA_PSK_AUTH;
2666 if (info->crypto.wpa_versions & NL80211_WPA_VERSION_2)
2667 p.auth_mode |= WPA2_PSK_AUTH;
2671 if (p.auth_mode == 0)
2672 p.auth_mode = NONE_AUTH;
2673 vif->auth_mode = p.auth_mode;
2675 for (i = 0; i < info->crypto.n_ciphers_pairwise; i++) {
2676 switch (info->crypto.ciphers_pairwise[i]) {
2677 case WLAN_CIPHER_SUITE_WEP40:
2678 case WLAN_CIPHER_SUITE_WEP104:
2679 p.prwise_crypto_type |= WEP_CRYPT;
2681 case WLAN_CIPHER_SUITE_TKIP:
2682 p.prwise_crypto_type |= TKIP_CRYPT;
2684 case WLAN_CIPHER_SUITE_CCMP:
2685 p.prwise_crypto_type |= AES_CRYPT;
2687 case WLAN_CIPHER_SUITE_SMS4:
2688 p.prwise_crypto_type |= WAPI_CRYPT;
2692 if (p.prwise_crypto_type == 0) {
2693 p.prwise_crypto_type = NONE_CRYPT;
2694 ath6kl_set_cipher(vif, 0, true);
2695 } else if (info->crypto.n_ciphers_pairwise == 1)
2696 ath6kl_set_cipher(vif, info->crypto.ciphers_pairwise[0], true);
2698 switch (info->crypto.cipher_group) {
2699 case WLAN_CIPHER_SUITE_WEP40:
2700 case WLAN_CIPHER_SUITE_WEP104:
2701 p.grp_crypto_type = WEP_CRYPT;
2703 case WLAN_CIPHER_SUITE_TKIP:
2704 p.grp_crypto_type = TKIP_CRYPT;
2706 case WLAN_CIPHER_SUITE_CCMP:
2707 p.grp_crypto_type = AES_CRYPT;
2709 case WLAN_CIPHER_SUITE_SMS4:
2710 p.grp_crypto_type = WAPI_CRYPT;
2713 p.grp_crypto_type = NONE_CRYPT;
2716 ath6kl_set_cipher(vif, info->crypto.cipher_group, false);
2718 p.nw_type = AP_NETWORK;
2719 vif->nw_type = vif->next_mode;
2721 p.ssid_len = vif->ssid_len;
2722 memcpy(p.ssid, vif->ssid, vif->ssid_len);
2723 p.dot11_auth_mode = vif->dot11_auth_mode;
2724 p.ch = cpu_to_le16(vif->next_chan);
2726 /* Enable uAPSD support by default */
2727 res = ath6kl_wmi_ap_set_apsd(ar->wmi, vif->fw_vif_idx, true);
2731 if (vif->wdev.iftype == NL80211_IFTYPE_P2P_GO) {
2732 p.nw_subtype = SUBTYPE_P2PGO;
2735 * Due to firmware limitation, it is not possible to
2736 * do P2P mgmt operations in AP mode
2738 p.nw_subtype = SUBTYPE_NONE;
2741 if (info->inactivity_timeout) {
2742 res = ath6kl_wmi_set_inact_period(ar->wmi, vif->fw_vif_idx,
2743 info->inactivity_timeout);
2748 if (ath6kl_set_htcap(vif, vif->next_ch_band,
2749 vif->next_ch_type != NL80211_CHAN_NO_HT))
2753 * Get the PTKSA replay counter in the RSN IE. Supplicant
2754 * will use the RSN IE in M3 message and firmware has to
2755 * advertise the same in beacon/probe response. Send
2756 * the complete RSN IE capability field to firmware
2758 if (!ath6kl_get_rsn_capab(&info->beacon, (u8 *) &rsn_capab) &&
2759 test_bit(ATH6KL_FW_CAPABILITY_RSN_CAP_OVERRIDE,
2760 ar->fw_capabilities)) {
2761 res = ath6kl_wmi_set_ie_cmd(ar->wmi, vif->fw_vif_idx,
2762 WLAN_EID_RSN, WMI_RSN_IE_CAPB,
2763 (const u8 *) &rsn_capab,
2769 res = ath6kl_wmi_ap_profile_commit(ar->wmi, vif->fw_vif_idx, &p);
2776 static int ath6kl_change_beacon(struct wiphy *wiphy, struct net_device *dev,
2777 struct cfg80211_beacon_data *beacon)
2779 struct ath6kl_vif *vif = netdev_priv(dev);
2781 if (!ath6kl_cfg80211_ready(vif))
2784 if (vif->next_mode != AP_NETWORK)
2787 return ath6kl_set_ies(vif, beacon);
2790 static int ath6kl_stop_ap(struct wiphy *wiphy, struct net_device *dev)
2792 struct ath6kl *ar = ath6kl_priv(dev);
2793 struct ath6kl_vif *vif = netdev_priv(dev);
2795 if (vif->nw_type != AP_NETWORK)
2797 if (!test_bit(CONNECTED, &vif->flags))
2800 ath6kl_wmi_disconnect_cmd(ar->wmi, vif->fw_vif_idx);
2801 clear_bit(CONNECTED, &vif->flags);
2803 /* Restore ht setting in firmware */
2804 if (ath6kl_set_htcap(vif, IEEE80211_BAND_2GHZ, true))
2807 if (ath6kl_set_htcap(vif, IEEE80211_BAND_5GHZ, true))
2813 static const u8 bcast_addr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
2815 static int ath6kl_del_station(struct wiphy *wiphy, struct net_device *dev,
2818 struct ath6kl *ar = ath6kl_priv(dev);
2819 struct ath6kl_vif *vif = netdev_priv(dev);
2820 const u8 *addr = mac ? mac : bcast_addr;
2822 return ath6kl_wmi_ap_set_mlme(ar->wmi, vif->fw_vif_idx, WMI_AP_DEAUTH,
2823 addr, WLAN_REASON_PREV_AUTH_NOT_VALID);
2826 static int ath6kl_change_station(struct wiphy *wiphy, struct net_device *dev,
2827 u8 *mac, struct station_parameters *params)
2829 struct ath6kl *ar = ath6kl_priv(dev);
2830 struct ath6kl_vif *vif = netdev_priv(dev);
2832 if (vif->nw_type != AP_NETWORK)
2835 /* Use this only for authorizing/unauthorizing a station */
2836 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED)))
2839 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED))
2840 return ath6kl_wmi_ap_set_mlme(ar->wmi, vif->fw_vif_idx,
2841 WMI_AP_MLME_AUTHORIZE, mac, 0);
2842 return ath6kl_wmi_ap_set_mlme(ar->wmi, vif->fw_vif_idx,
2843 WMI_AP_MLME_UNAUTHORIZE, mac, 0);
2846 static int ath6kl_remain_on_channel(struct wiphy *wiphy,
2847 struct net_device *dev,
2848 struct ieee80211_channel *chan,
2849 enum nl80211_channel_type channel_type,
2850 unsigned int duration,
2853 struct ath6kl *ar = ath6kl_priv(dev);
2854 struct ath6kl_vif *vif = netdev_priv(dev);
2857 /* TODO: if already pending or ongoing remain-on-channel,
2859 id = ++vif->last_roc_id;
2861 /* Do not use 0 as the cookie value */
2862 id = ++vif->last_roc_id;
2866 return ath6kl_wmi_remain_on_chnl_cmd(ar->wmi, vif->fw_vif_idx,
2867 chan->center_freq, duration);
2870 static int ath6kl_cancel_remain_on_channel(struct wiphy *wiphy,
2871 struct net_device *dev,
2874 struct ath6kl *ar = ath6kl_priv(dev);
2875 struct ath6kl_vif *vif = netdev_priv(dev);
2877 if (cookie != vif->last_roc_id)
2879 vif->last_cancel_roc_id = cookie;
2881 return ath6kl_wmi_cancel_remain_on_chnl_cmd(ar->wmi, vif->fw_vif_idx);
2884 static int ath6kl_send_go_probe_resp(struct ath6kl_vif *vif,
2885 const u8 *buf, size_t len,
2888 struct ath6kl *ar = vif->ar;
2893 const struct ieee80211_mgmt *mgmt;
2895 mgmt = (const struct ieee80211_mgmt *) buf;
2897 /* Include P2P IE(s) from the frame generated in user space. */
2899 p2p = kmalloc(len, GFP_KERNEL);
2904 pos = mgmt->u.probe_resp.variable;
2905 while (pos + 1 < buf + len) {
2906 if (pos + 2 + pos[1] > buf + len)
2908 if (ath6kl_is_p2p_ie(pos)) {
2909 memcpy(p2p + p2p_len, pos, 2 + pos[1]);
2910 p2p_len += 2 + pos[1];
2915 ret = ath6kl_wmi_send_probe_response_cmd(ar->wmi, vif->fw_vif_idx, freq,
2916 mgmt->da, p2p, p2p_len);
2921 static bool ath6kl_mgmt_powersave_ap(struct ath6kl_vif *vif,
2930 struct ieee80211_mgmt *mgmt;
2931 struct ath6kl_sta *conn;
2932 bool is_psq_empty = false;
2933 struct ath6kl_mgmt_buff *mgmt_buf;
2934 size_t mgmt_buf_size;
2935 struct ath6kl *ar = vif->ar;
2937 mgmt = (struct ieee80211_mgmt *) buf;
2938 if (is_multicast_ether_addr(mgmt->da))
2941 conn = ath6kl_find_sta(vif, mgmt->da);
2945 if (conn->sta_flags & STA_PS_SLEEP) {
2946 if (!(conn->sta_flags & STA_PS_POLLED)) {
2947 /* Queue the frames if the STA is sleeping */
2948 mgmt_buf_size = len + sizeof(struct ath6kl_mgmt_buff);
2949 mgmt_buf = kmalloc(mgmt_buf_size, GFP_KERNEL);
2953 INIT_LIST_HEAD(&mgmt_buf->list);
2955 mgmt_buf->freq = freq;
2956 mgmt_buf->wait = wait;
2957 mgmt_buf->len = len;
2958 mgmt_buf->no_cck = no_cck;
2959 memcpy(mgmt_buf->buf, buf, len);
2960 spin_lock_bh(&conn->psq_lock);
2961 is_psq_empty = skb_queue_empty(&conn->psq) &&
2962 (conn->mgmt_psq_len == 0);
2963 list_add_tail(&mgmt_buf->list, &conn->mgmt_psq);
2964 conn->mgmt_psq_len++;
2965 spin_unlock_bh(&conn->psq_lock);
2968 * If this is the first pkt getting queued
2969 * for this STA, update the PVB for this
2973 ath6kl_wmi_set_pvb_cmd(ar->wmi, vif->fw_vif_idx,
2979 * This tx is because of a PsPoll.
2980 * Determine if MoreData bit has to be set.
2982 spin_lock_bh(&conn->psq_lock);
2983 if (!skb_queue_empty(&conn->psq) || (conn->mgmt_psq_len != 0))
2985 spin_unlock_bh(&conn->psq_lock);
2991 /* Check if SSID length is greater than DIRECT- */
2992 static bool ath6kl_is_p2p_go_ssid(const u8 *buf, size_t len)
2994 const struct ieee80211_mgmt *mgmt;
2995 mgmt = (const struct ieee80211_mgmt *) buf;
2997 /* variable[1] contains the SSID tag length */
2998 if (buf + len >= &mgmt->u.probe_resp.variable[1] &&
2999 (mgmt->u.probe_resp.variable[1] > P2P_WILDCARD_SSID_LEN)) {
3006 static int ath6kl_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,
3007 struct ieee80211_channel *chan, bool offchan,
3008 enum nl80211_channel_type channel_type,
3009 bool channel_type_valid, unsigned int wait,
3010 const u8 *buf, size_t len, bool no_cck,
3011 bool dont_wait_for_ack, u64 *cookie)
3013 struct ath6kl *ar = ath6kl_priv(dev);
3014 struct ath6kl_vif *vif = netdev_priv(dev);
3016 const struct ieee80211_mgmt *mgmt;
3017 bool more_data, queued;
3019 mgmt = (const struct ieee80211_mgmt *) buf;
3020 if (vif->nw_type == AP_NETWORK && test_bit(CONNECTED, &vif->flags) &&
3021 ieee80211_is_probe_resp(mgmt->frame_control) &&
3022 ath6kl_is_p2p_go_ssid(buf, len)) {
3024 * Send Probe Response frame in GO mode using a separate WMI
3025 * command to allow the target to fill in the generic IEs.
3027 *cookie = 0; /* TX status not supported */
3028 return ath6kl_send_go_probe_resp(vif, buf, len,
3032 id = vif->send_action_id++;
3035 * 0 is a reserved value in the WMI command and shall not be
3036 * used for the command.
3038 id = vif->send_action_id++;
3043 /* AP mode Power saving processing */
3044 if (vif->nw_type == AP_NETWORK) {
3045 queued = ath6kl_mgmt_powersave_ap(vif,
3046 id, chan->center_freq,
3048 len, &more_data, no_cck);
3053 return ath6kl_wmi_send_mgmt_cmd(ar->wmi, vif->fw_vif_idx, id,
3054 chan->center_freq, wait,
3058 static void ath6kl_mgmt_frame_register(struct wiphy *wiphy,
3059 struct net_device *dev,
3060 u16 frame_type, bool reg)
3062 struct ath6kl_vif *vif = netdev_priv(dev);
3064 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: frame_type=0x%x reg=%d\n",
3065 __func__, frame_type, reg);
3066 if (frame_type == IEEE80211_STYPE_PROBE_REQ) {
3068 * Note: This notification callback is not allowed to sleep, so
3069 * we cannot send WMI_PROBE_REQ_REPORT_CMD here. Instead, we
3070 * hardcode target to report Probe Request frames all the time.
3072 vif->probe_req_report = reg;
3076 static int ath6kl_cfg80211_sscan_start(struct wiphy *wiphy,
3077 struct net_device *dev,
3078 struct cfg80211_sched_scan_request *request)
3080 struct ath6kl *ar = ath6kl_priv(dev);
3081 struct ath6kl_vif *vif = netdev_priv(dev);
3086 if (ar->state != ATH6KL_STATE_ON)
3089 if (vif->sme_state != SME_DISCONNECTED)
3092 ath6kl_cfg80211_scan_complete_event(vif, true);
3094 for (i = 0; i < ar->wiphy->max_sched_scan_ssids; i++) {
3095 ath6kl_wmi_probedssid_cmd(ar->wmi, vif->fw_vif_idx,
3096 i, DISABLE_SSID_FLAG,
3100 /* fw uses seconds, also make sure that it's >0 */
3101 interval = max_t(u16, 1, request->interval / 1000);
3103 ath6kl_wmi_scanparams_cmd(ar->wmi, vif->fw_vif_idx,
3105 10, 0, 0, 0, 3, 0, 0, 0);
3107 if (request->n_ssids && request->ssids[0].ssid_len) {
3108 for (i = 0; i < request->n_ssids; i++) {
3109 ath6kl_wmi_probedssid_cmd(ar->wmi, vif->fw_vif_idx,
3110 i, SPECIFIC_SSID_FLAG,
3111 request->ssids[i].ssid_len,
3112 request->ssids[i].ssid);
3116 ret = ath6kl_wmi_set_wow_mode_cmd(ar->wmi, vif->fw_vif_idx,
3117 ATH6KL_WOW_MODE_ENABLE,
3119 WOW_HOST_REQ_DELAY);
3121 ath6kl_warn("Failed to enable wow with ssid filter: %d\n", ret);
3125 /* this also clears IE in fw if it's not set */
3126 ret = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx,
3127 WMI_FRAME_PROBE_REQ,
3128 request->ie, request->ie_len);
3130 ath6kl_warn("Failed to set probe request IE for scheduled scan: %d",
3135 ret = ath6kl_wmi_set_host_sleep_mode_cmd(ar->wmi, vif->fw_vif_idx,
3136 ATH6KL_HOST_MODE_ASLEEP);
3138 ath6kl_warn("Failed to enable host sleep mode for sched scan: %d\n",
3143 ar->state = ATH6KL_STATE_SCHED_SCAN;
3148 static int ath6kl_cfg80211_sscan_stop(struct wiphy *wiphy,
3149 struct net_device *dev)
3151 struct ath6kl_vif *vif = netdev_priv(dev);
3154 stopped = __ath6kl_cfg80211_sscan_stop(vif);
3162 static const struct ieee80211_txrx_stypes
3163 ath6kl_mgmt_stypes[NUM_NL80211_IFTYPES] = {
3164 [NL80211_IFTYPE_STATION] = {
3165 .tx = BIT(IEEE80211_STYPE_ACTION >> 4) |
3166 BIT(IEEE80211_STYPE_PROBE_RESP >> 4),
3167 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
3168 BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
3170 [NL80211_IFTYPE_AP] = {
3171 .tx = BIT(IEEE80211_STYPE_ACTION >> 4) |
3172 BIT(IEEE80211_STYPE_PROBE_RESP >> 4),
3173 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
3174 BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
3176 [NL80211_IFTYPE_P2P_CLIENT] = {
3177 .tx = BIT(IEEE80211_STYPE_ACTION >> 4) |
3178 BIT(IEEE80211_STYPE_PROBE_RESP >> 4),
3179 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
3180 BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
3182 [NL80211_IFTYPE_P2P_GO] = {
3183 .tx = BIT(IEEE80211_STYPE_ACTION >> 4) |
3184 BIT(IEEE80211_STYPE_PROBE_RESP >> 4),
3185 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
3186 BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
3190 static struct cfg80211_ops ath6kl_cfg80211_ops = {
3191 .add_virtual_intf = ath6kl_cfg80211_add_iface,
3192 .del_virtual_intf = ath6kl_cfg80211_del_iface,
3193 .change_virtual_intf = ath6kl_cfg80211_change_iface,
3194 .scan = ath6kl_cfg80211_scan,
3195 .connect = ath6kl_cfg80211_connect,
3196 .disconnect = ath6kl_cfg80211_disconnect,
3197 .add_key = ath6kl_cfg80211_add_key,
3198 .get_key = ath6kl_cfg80211_get_key,
3199 .del_key = ath6kl_cfg80211_del_key,
3200 .set_default_key = ath6kl_cfg80211_set_default_key,
3201 .set_wiphy_params = ath6kl_cfg80211_set_wiphy_params,
3202 .set_tx_power = ath6kl_cfg80211_set_txpower,
3203 .get_tx_power = ath6kl_cfg80211_get_txpower,
3204 .set_power_mgmt = ath6kl_cfg80211_set_power_mgmt,
3205 .join_ibss = ath6kl_cfg80211_join_ibss,
3206 .leave_ibss = ath6kl_cfg80211_leave_ibss,
3207 .get_station = ath6kl_get_station,
3208 .set_pmksa = ath6kl_set_pmksa,
3209 .del_pmksa = ath6kl_del_pmksa,
3210 .flush_pmksa = ath6kl_flush_pmksa,
3211 CFG80211_TESTMODE_CMD(ath6kl_tm_cmd)
3213 .suspend = __ath6kl_cfg80211_suspend,
3214 .resume = __ath6kl_cfg80211_resume,
3216 .set_channel = ath6kl_set_channel,
3217 .start_ap = ath6kl_start_ap,
3218 .change_beacon = ath6kl_change_beacon,
3219 .stop_ap = ath6kl_stop_ap,
3220 .del_station = ath6kl_del_station,
3221 .change_station = ath6kl_change_station,
3222 .remain_on_channel = ath6kl_remain_on_channel,
3223 .cancel_remain_on_channel = ath6kl_cancel_remain_on_channel,
3224 .mgmt_tx = ath6kl_mgmt_tx,
3225 .mgmt_frame_register = ath6kl_mgmt_frame_register,
3226 .sched_scan_start = ath6kl_cfg80211_sscan_start,
3227 .sched_scan_stop = ath6kl_cfg80211_sscan_stop,
3230 void ath6kl_cfg80211_stop(struct ath6kl_vif *vif)
3232 ath6kl_cfg80211_sscan_disable(vif);
3234 switch (vif->sme_state) {
3235 case SME_DISCONNECTED:
3237 case SME_CONNECTING:
3238 cfg80211_connect_result(vif->ndev, vif->bssid, NULL, 0,
3240 WLAN_STATUS_UNSPECIFIED_FAILURE,
3244 cfg80211_disconnected(vif->ndev, 0, NULL, 0, GFP_KERNEL);
3248 if (test_bit(CONNECTED, &vif->flags) ||
3249 test_bit(CONNECT_PEND, &vif->flags))
3250 ath6kl_wmi_disconnect_cmd(vif->ar->wmi, vif->fw_vif_idx);
3252 vif->sme_state = SME_DISCONNECTED;
3253 clear_bit(CONNECTED, &vif->flags);
3254 clear_bit(CONNECT_PEND, &vif->flags);
3256 /* disable scanning */
3257 if (ath6kl_wmi_scanparams_cmd(vif->ar->wmi, vif->fw_vif_idx, 0xFFFF,
3258 0, 0, 0, 0, 0, 0, 0, 0, 0) != 0)
3259 ath6kl_warn("failed to disable scan during stop\n");
3261 ath6kl_cfg80211_scan_complete_event(vif, true);
3264 void ath6kl_cfg80211_stop_all(struct ath6kl *ar)
3266 struct ath6kl_vif *vif;
3268 vif = ath6kl_vif_first(ar);
3270 /* save the current power mode before enabling power save */
3271 ar->wmi->saved_pwr_mode = ar->wmi->pwr_mode;
3273 if (ath6kl_wmi_powermode_cmd(ar->wmi, 0, REC_POWER) != 0)
3274 ath6kl_warn("ath6kl_deep_sleep_enable: "
3275 "wmi_powermode_cmd failed\n");
3280 * FIXME: we should take ar->list_lock to protect changes in the
3281 * vif_list, but that's not trivial to do as ath6kl_cfg80211_stop()
3284 list_for_each_entry(vif, &ar->vif_list, list)
3285 ath6kl_cfg80211_stop(vif);
3288 static int ath6kl_cfg80211_vif_init(struct ath6kl_vif *vif)
3290 vif->aggr_cntxt = aggr_init(vif);
3291 if (!vif->aggr_cntxt) {
3292 ath6kl_err("failed to initialize aggr\n");
3296 setup_timer(&vif->disconnect_timer, disconnect_timer_handler,
3297 (unsigned long) vif->ndev);
3298 setup_timer(&vif->sched_scan_timer, ath6kl_wmi_sscan_timer,
3299 (unsigned long) vif);
3301 set_bit(WMM_ENABLED, &vif->flags);
3302 spin_lock_init(&vif->if_lock);
3304 INIT_LIST_HEAD(&vif->mc_filter);
3309 void ath6kl_cfg80211_vif_cleanup(struct ath6kl_vif *vif)
3311 struct ath6kl *ar = vif->ar;
3312 struct ath6kl_mc_filter *mc_filter, *tmp;
3314 aggr_module_destroy(vif->aggr_cntxt);
3316 ar->avail_idx_map |= BIT(vif->fw_vif_idx);
3318 if (vif->nw_type == ADHOC_NETWORK)
3319 ar->ibss_if_active = false;
3321 list_for_each_entry_safe(mc_filter, tmp, &vif->mc_filter, list) {
3322 list_del(&mc_filter->list);
3326 unregister_netdevice(vif->ndev);
3331 struct net_device *ath6kl_interface_add(struct ath6kl *ar, char *name,
3332 enum nl80211_iftype type, u8 fw_vif_idx,
3335 struct net_device *ndev;
3336 struct ath6kl_vif *vif;
3338 ndev = alloc_netdev(sizeof(*vif), name, ether_setup);
3342 vif = netdev_priv(ndev);
3343 ndev->ieee80211_ptr = &vif->wdev;
3344 vif->wdev.wiphy = ar->wiphy;
3347 SET_NETDEV_DEV(ndev, wiphy_dev(vif->wdev.wiphy));
3348 vif->wdev.netdev = ndev;
3349 vif->wdev.iftype = type;
3350 vif->fw_vif_idx = fw_vif_idx;
3351 vif->nw_type = nw_type;
3352 vif->next_mode = nw_type;
3353 vif->listen_intvl_t = ATH6KL_DEFAULT_LISTEN_INTVAL;
3354 vif->bmiss_time_t = ATH6KL_DEFAULT_BMISS_TIME;
3355 vif->htcap.ht_enable = true;
3357 memcpy(ndev->dev_addr, ar->mac_addr, ETH_ALEN);
3358 if (fw_vif_idx != 0)
3359 ndev->dev_addr[0] = (ndev->dev_addr[0] ^ (1 << fw_vif_idx)) |
3364 ath6kl_init_control_info(vif);
3366 if (ath6kl_cfg80211_vif_init(vif))
3369 if (register_netdevice(ndev))
3372 ar->avail_idx_map &= ~BIT(fw_vif_idx);
3373 vif->sme_state = SME_DISCONNECTED;
3374 set_bit(WLAN_ENABLED, &vif->flags);
3375 ar->wlan_pwr_state = WLAN_POWER_STATE_ON;
3376 set_bit(NETDEV_REGISTERED, &vif->flags);
3378 if (type == NL80211_IFTYPE_ADHOC)
3379 ar->ibss_if_active = true;
3381 spin_lock_bh(&ar->list_lock);
3382 list_add_tail(&vif->list, &ar->vif_list);
3383 spin_unlock_bh(&ar->list_lock);
3388 aggr_module_destroy(vif->aggr_cntxt);
3393 int ath6kl_cfg80211_init(struct ath6kl *ar)
3395 struct wiphy *wiphy = ar->wiphy;
3398 wiphy->mgmt_stypes = ath6kl_mgmt_stypes;
3400 wiphy->max_remain_on_channel_duration = 5000;
3402 /* set device pointer for wiphy */
3403 set_wiphy_dev(wiphy, ar->dev);
3405 wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
3406 BIT(NL80211_IFTYPE_ADHOC) |
3407 BIT(NL80211_IFTYPE_AP);
3409 wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_GO) |
3410 BIT(NL80211_IFTYPE_P2P_CLIENT);
3413 /* max num of ssids that can be probed during scanning */
3414 wiphy->max_scan_ssids = MAX_PROBED_SSID_INDEX;
3415 wiphy->max_scan_ie_len = 1000; /* FIX: what is correct limit? */
3416 wiphy->bands[IEEE80211_BAND_2GHZ] = &ath6kl_band_2ghz;
3417 wiphy->bands[IEEE80211_BAND_5GHZ] = &ath6kl_band_5ghz;
3418 wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
3420 wiphy->cipher_suites = cipher_suites;
3421 wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
3423 wiphy->wowlan.flags = WIPHY_WOWLAN_MAGIC_PKT |
3424 WIPHY_WOWLAN_DISCONNECT |
3425 WIPHY_WOWLAN_GTK_REKEY_FAILURE |
3426 WIPHY_WOWLAN_SUPPORTS_GTK_REKEY |
3427 WIPHY_WOWLAN_EAP_IDENTITY_REQ |
3428 WIPHY_WOWLAN_4WAY_HANDSHAKE;
3429 wiphy->wowlan.n_patterns = WOW_MAX_FILTERS_PER_LIST;
3430 wiphy->wowlan.pattern_min_len = 1;
3431 wiphy->wowlan.pattern_max_len = WOW_PATTERN_SIZE;
3433 wiphy->max_sched_scan_ssids = 10;
3435 ar->wiphy->flags |= WIPHY_FLAG_SUPPORTS_FW_ROAM |
3436 WIPHY_FLAG_HAVE_AP_SME |
3437 WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL |
3438 WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
3440 if (test_bit(ATH6KL_FW_CAPABILITY_SCHED_SCAN, ar->fw_capabilities))
3441 ar->wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN;
3443 if (test_bit(ATH6KL_FW_CAPABILITY_INACTIVITY_TIMEOUT,
3444 ar->fw_capabilities))
3445 ar->wiphy->features = NL80211_FEATURE_INACTIVITY_TIMER;
3447 ar->wiphy->probe_resp_offload =
3448 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
3449 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 |
3450 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P |
3451 NL80211_PROBE_RESP_OFFLOAD_SUPPORT_80211U;
3453 ret = wiphy_register(wiphy);
3455 ath6kl_err("couldn't register wiphy device\n");
3459 ar->wiphy_registered = true;
3464 void ath6kl_cfg80211_cleanup(struct ath6kl *ar)
3466 wiphy_unregister(ar->wiphy);
3468 ar->wiphy_registered = false;
3471 struct ath6kl *ath6kl_cfg80211_create(void)
3474 struct wiphy *wiphy;
3476 /* create a new wiphy for use with cfg80211 */
3477 wiphy = wiphy_new(&ath6kl_cfg80211_ops, sizeof(struct ath6kl));
3480 ath6kl_err("couldn't allocate wiphy device\n");
3484 ar = wiphy_priv(wiphy);
3490 /* Note: ar variable must not be accessed after calling this! */
3491 void ath6kl_cfg80211_destroy(struct ath6kl *ar)
3495 for (i = 0; i < AP_MAX_NUM_STA; i++)
3496 kfree(ar->sta_list[i].aggr_conn);
3498 wiphy_free(ar->wiphy);