2 * Copyright (c) 2004-2011 Atheros Communications Inc.
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 #include <linux/moduleparam.h>
18 #include <linux/inetdevice.h>
26 static unsigned int ath6kl_p2p
;
28 module_param(ath6kl_p2p
, uint
, 0644);
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 static struct ieee80211_rate ath6kl_rates
[] = {
55 RATETAB_ENT(10, 0x1, 0),
56 RATETAB_ENT(20, 0x2, 0),
57 RATETAB_ENT(55, 0x4, 0),
58 RATETAB_ENT(110, 0x8, 0),
59 RATETAB_ENT(60, 0x10, 0),
60 RATETAB_ENT(90, 0x20, 0),
61 RATETAB_ENT(120, 0x40, 0),
62 RATETAB_ENT(180, 0x80, 0),
63 RATETAB_ENT(240, 0x100, 0),
64 RATETAB_ENT(360, 0x200, 0),
65 RATETAB_ENT(480, 0x400, 0),
66 RATETAB_ENT(540, 0x800, 0),
69 #define ath6kl_a_rates (ath6kl_rates + 4)
70 #define ath6kl_a_rates_size 8
71 #define ath6kl_g_rates (ath6kl_rates + 0)
72 #define ath6kl_g_rates_size 12
74 static struct ieee80211_channel ath6kl_2ghz_channels
[] = {
91 static struct ieee80211_channel ath6kl_5ghz_a_channels
[] = {
92 CHAN5G(34, 0), CHAN5G(36, 0),
93 CHAN5G(38, 0), CHAN5G(40, 0),
94 CHAN5G(42, 0), CHAN5G(44, 0),
95 CHAN5G(46, 0), CHAN5G(48, 0),
96 CHAN5G(52, 0), CHAN5G(56, 0),
97 CHAN5G(60, 0), CHAN5G(64, 0),
98 CHAN5G(100, 0), CHAN5G(104, 0),
99 CHAN5G(108, 0), CHAN5G(112, 0),
100 CHAN5G(116, 0), CHAN5G(120, 0),
101 CHAN5G(124, 0), CHAN5G(128, 0),
102 CHAN5G(132, 0), CHAN5G(136, 0),
103 CHAN5G(140, 0), CHAN5G(149, 0),
104 CHAN5G(153, 0), CHAN5G(157, 0),
105 CHAN5G(161, 0), CHAN5G(165, 0),
106 CHAN5G(184, 0), CHAN5G(188, 0),
107 CHAN5G(192, 0), CHAN5G(196, 0),
108 CHAN5G(200, 0), CHAN5G(204, 0),
109 CHAN5G(208, 0), CHAN5G(212, 0),
113 static struct ieee80211_supported_band ath6kl_band_2ghz
= {
114 .n_channels
= ARRAY_SIZE(ath6kl_2ghz_channels
),
115 .channels
= ath6kl_2ghz_channels
,
116 .n_bitrates
= ath6kl_g_rates_size
,
117 .bitrates
= ath6kl_g_rates
,
120 static struct ieee80211_supported_band ath6kl_band_5ghz
= {
121 .n_channels
= ARRAY_SIZE(ath6kl_5ghz_a_channels
),
122 .channels
= ath6kl_5ghz_a_channels
,
123 .n_bitrates
= ath6kl_a_rates_size
,
124 .bitrates
= ath6kl_a_rates
,
127 #define CCKM_KRK_CIPHER_SUITE 0x004096ff /* use for KRK */
129 /* returns true if scheduled scan was stopped */
130 static bool __ath6kl_cfg80211_sscan_stop(struct ath6kl_vif
*vif
)
132 struct ath6kl
*ar
= vif
->ar
;
134 if (ar
->state
!= ATH6KL_STATE_SCHED_SCAN
)
137 del_timer_sync(&vif
->sched_scan_timer
);
139 ath6kl_wmi_set_host_sleep_mode_cmd(ar
->wmi
, vif
->fw_vif_idx
,
140 ATH6KL_HOST_MODE_AWAKE
);
142 ar
->state
= ATH6KL_STATE_ON
;
147 static void ath6kl_cfg80211_sscan_disable(struct ath6kl_vif
*vif
)
149 struct ath6kl
*ar
= vif
->ar
;
152 stopped
= __ath6kl_cfg80211_sscan_stop(vif
);
157 cfg80211_sched_scan_stopped(ar
->wiphy
);
160 static int ath6kl_set_wpa_version(struct ath6kl_vif
*vif
,
161 enum nl80211_wpa_versions wpa_version
)
163 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: %u\n", __func__
, wpa_version
);
166 vif
->auth_mode
= NONE_AUTH
;
167 } else if (wpa_version
& NL80211_WPA_VERSION_2
) {
168 vif
->auth_mode
= WPA2_AUTH
;
169 } else if (wpa_version
& NL80211_WPA_VERSION_1
) {
170 vif
->auth_mode
= WPA_AUTH
;
172 ath6kl_err("%s: %u not supported\n", __func__
, wpa_version
);
179 static int ath6kl_set_auth_type(struct ath6kl_vif
*vif
,
180 enum nl80211_auth_type auth_type
)
182 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: 0x%x\n", __func__
, auth_type
);
185 case NL80211_AUTHTYPE_OPEN_SYSTEM
:
186 vif
->dot11_auth_mode
= OPEN_AUTH
;
188 case NL80211_AUTHTYPE_SHARED_KEY
:
189 vif
->dot11_auth_mode
= SHARED_AUTH
;
191 case NL80211_AUTHTYPE_NETWORK_EAP
:
192 vif
->dot11_auth_mode
= LEAP_AUTH
;
195 case NL80211_AUTHTYPE_AUTOMATIC
:
196 vif
->dot11_auth_mode
= OPEN_AUTH
| SHARED_AUTH
;
200 ath6kl_err("%s: 0x%x not spported\n", __func__
, auth_type
);
207 static int ath6kl_set_cipher(struct ath6kl_vif
*vif
, u32 cipher
, bool ucast
)
209 u8
*ar_cipher
= ucast
? &vif
->prwise_crypto
: &vif
->grp_crypto
;
210 u8
*ar_cipher_len
= ucast
? &vif
->prwise_crypto_len
:
211 &vif
->grp_crypto_len
;
213 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: cipher 0x%x, ucast %u\n",
214 __func__
, cipher
, ucast
);
218 /* our own hack to use value 0 as no crypto used */
219 *ar_cipher
= NONE_CRYPT
;
222 case WLAN_CIPHER_SUITE_WEP40
:
223 *ar_cipher
= WEP_CRYPT
;
226 case WLAN_CIPHER_SUITE_WEP104
:
227 *ar_cipher
= WEP_CRYPT
;
230 case WLAN_CIPHER_SUITE_TKIP
:
231 *ar_cipher
= TKIP_CRYPT
;
234 case WLAN_CIPHER_SUITE_CCMP
:
235 *ar_cipher
= AES_CRYPT
;
238 case WLAN_CIPHER_SUITE_SMS4
:
239 *ar_cipher
= WAPI_CRYPT
;
243 ath6kl_err("cipher 0x%x not supported\n", cipher
);
250 static void ath6kl_set_key_mgmt(struct ath6kl_vif
*vif
, u32 key_mgmt
)
252 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: 0x%x\n", __func__
, key_mgmt
);
254 if (key_mgmt
== WLAN_AKM_SUITE_PSK
) {
255 if (vif
->auth_mode
== WPA_AUTH
)
256 vif
->auth_mode
= WPA_PSK_AUTH
;
257 else if (vif
->auth_mode
== WPA2_AUTH
)
258 vif
->auth_mode
= WPA2_PSK_AUTH
;
259 } else if (key_mgmt
== 0x00409600) {
260 if (vif
->auth_mode
== WPA_AUTH
)
261 vif
->auth_mode
= WPA_AUTH_CCKM
;
262 else if (vif
->auth_mode
== WPA2_AUTH
)
263 vif
->auth_mode
= WPA2_AUTH_CCKM
;
264 } else if (key_mgmt
!= WLAN_AKM_SUITE_8021X
) {
265 vif
->auth_mode
= NONE_AUTH
;
269 static bool ath6kl_cfg80211_ready(struct ath6kl_vif
*vif
)
271 struct ath6kl
*ar
= vif
->ar
;
273 if (!test_bit(WMI_READY
, &ar
->flag
)) {
274 ath6kl_err("wmi is not ready\n");
278 if (!test_bit(WLAN_ENABLED
, &vif
->flags
)) {
279 ath6kl_err("wlan disabled\n");
286 static bool ath6kl_is_wpa_ie(const u8
*pos
)
288 return pos
[0] == WLAN_EID_WPA
&& pos
[1] >= 4 &&
289 pos
[2] == 0x00 && pos
[3] == 0x50 &&
290 pos
[4] == 0xf2 && pos
[5] == 0x01;
293 static bool ath6kl_is_rsn_ie(const u8
*pos
)
295 return pos
[0] == WLAN_EID_RSN
;
298 static bool ath6kl_is_wps_ie(const u8
*pos
)
300 return (pos
[0] == WLAN_EID_VENDOR_SPECIFIC
&&
302 pos
[2] == 0x00 && pos
[3] == 0x50 && pos
[4] == 0xf2 &&
306 static int ath6kl_set_assoc_req_ies(struct ath6kl_vif
*vif
, const u8
*ies
,
309 struct ath6kl
*ar
= vif
->ar
;
316 * Clear previously set flag
319 ar
->connect_ctrl_flags
&= ~CONNECT_WPS_FLAG
;
322 * Filter out RSN/WPA IE(s)
325 if (ies
&& ies_len
) {
326 buf
= kmalloc(ies_len
, GFP_KERNEL
);
331 while (pos
+ 1 < ies
+ ies_len
) {
332 if (pos
+ 2 + pos
[1] > ies
+ ies_len
)
334 if (!(ath6kl_is_wpa_ie(pos
) || ath6kl_is_rsn_ie(pos
))) {
335 memcpy(buf
+ len
, pos
, 2 + pos
[1]);
339 if (ath6kl_is_wps_ie(pos
))
340 ar
->connect_ctrl_flags
|= CONNECT_WPS_FLAG
;
346 ret
= ath6kl_wmi_set_appie_cmd(ar
->wmi
, vif
->fw_vif_idx
,
347 WMI_FRAME_ASSOC_REQ
, buf
, len
);
352 static int ath6kl_nliftype_to_drv_iftype(enum nl80211_iftype type
, u8
*nw_type
)
355 case NL80211_IFTYPE_STATION
:
356 *nw_type
= INFRA_NETWORK
;
358 case NL80211_IFTYPE_ADHOC
:
359 *nw_type
= ADHOC_NETWORK
;
361 case NL80211_IFTYPE_AP
:
362 *nw_type
= AP_NETWORK
;
364 case NL80211_IFTYPE_P2P_CLIENT
:
365 *nw_type
= INFRA_NETWORK
;
367 case NL80211_IFTYPE_P2P_GO
:
368 *nw_type
= AP_NETWORK
;
371 ath6kl_err("invalid interface type %u\n", type
);
378 static bool ath6kl_is_valid_iftype(struct ath6kl
*ar
, enum nl80211_iftype type
,
379 u8
*if_idx
, u8
*nw_type
)
383 if (ath6kl_nliftype_to_drv_iftype(type
, nw_type
))
386 if (ar
->ibss_if_active
|| ((type
== NL80211_IFTYPE_ADHOC
) &&
390 if (type
== NL80211_IFTYPE_STATION
||
391 type
== NL80211_IFTYPE_AP
|| type
== NL80211_IFTYPE_ADHOC
) {
392 for (i
= 0; i
< ar
->vif_max
; i
++) {
393 if ((ar
->avail_idx_map
>> i
) & BIT(0)) {
400 if (type
== NL80211_IFTYPE_P2P_CLIENT
||
401 type
== NL80211_IFTYPE_P2P_GO
) {
402 for (i
= ar
->max_norm_iface
; i
< ar
->vif_max
; i
++) {
403 if ((ar
->avail_idx_map
>> i
) & BIT(0)) {
413 static int ath6kl_cfg80211_connect(struct wiphy
*wiphy
, struct net_device
*dev
,
414 struct cfg80211_connect_params
*sme
)
416 struct ath6kl
*ar
= ath6kl_priv(dev
);
417 struct ath6kl_vif
*vif
= netdev_priv(dev
);
419 u8 nw_subtype
= (ar
->p2p
) ? SUBTYPE_P2PDEV
: SUBTYPE_NONE
;
421 ath6kl_cfg80211_sscan_disable(vif
);
423 vif
->sme_state
= SME_CONNECTING
;
425 if (!ath6kl_cfg80211_ready(vif
))
428 if (test_bit(DESTROY_IN_PROGRESS
, &ar
->flag
)) {
429 ath6kl_err("destroy in progress\n");
433 if (test_bit(SKIP_SCAN
, &ar
->flag
) &&
434 ((sme
->channel
&& sme
->channel
->center_freq
== 0) ||
435 (sme
->bssid
&& is_zero_ether_addr(sme
->bssid
)))) {
436 ath6kl_err("SkipScan: channel or bssid invalid\n");
440 if (down_interruptible(&ar
->sem
)) {
441 ath6kl_err("busy, couldn't get access\n");
445 if (test_bit(DESTROY_IN_PROGRESS
, &ar
->flag
)) {
446 ath6kl_err("busy, destroy in progress\n");
451 if (ar
->tx_pending
[ath6kl_wmi_get_control_ep(ar
->wmi
)]) {
453 * sleep until the command queue drains
455 wait_event_interruptible_timeout(ar
->event_wq
,
456 ar
->tx_pending
[ath6kl_wmi_get_control_ep(ar
->wmi
)] == 0,
458 if (signal_pending(current
)) {
459 ath6kl_err("cmd queue drain timeout\n");
465 status
= ath6kl_set_assoc_req_ies(vif
, sme
->ie
, sme
->ie_len
);
471 if (sme
->ie
== NULL
|| sme
->ie_len
== 0)
472 ar
->connect_ctrl_flags
&= ~CONNECT_WPS_FLAG
;
474 if (test_bit(CONNECTED
, &vif
->flags
) &&
475 vif
->ssid_len
== sme
->ssid_len
&&
476 !memcmp(vif
->ssid
, sme
->ssid
, vif
->ssid_len
)) {
477 vif
->reconnect_flag
= true;
478 status
= ath6kl_wmi_reconnect_cmd(ar
->wmi
, vif
->fw_vif_idx
,
484 ath6kl_err("wmi_reconnect_cmd failed\n");
488 } else if (vif
->ssid_len
== sme
->ssid_len
&&
489 !memcmp(vif
->ssid
, sme
->ssid
, vif
->ssid_len
)) {
490 ath6kl_disconnect(vif
);
493 memset(vif
->ssid
, 0, sizeof(vif
->ssid
));
494 vif
->ssid_len
= sme
->ssid_len
;
495 memcpy(vif
->ssid
, sme
->ssid
, sme
->ssid_len
);
498 vif
->ch_hint
= sme
->channel
->center_freq
;
500 memset(vif
->req_bssid
, 0, sizeof(vif
->req_bssid
));
501 if (sme
->bssid
&& !is_broadcast_ether_addr(sme
->bssid
))
502 memcpy(vif
->req_bssid
, sme
->bssid
, sizeof(vif
->req_bssid
));
504 ath6kl_set_wpa_version(vif
, sme
->crypto
.wpa_versions
);
506 status
= ath6kl_set_auth_type(vif
, sme
->auth_type
);
512 if (sme
->crypto
.n_ciphers_pairwise
)
513 ath6kl_set_cipher(vif
, sme
->crypto
.ciphers_pairwise
[0], true);
515 ath6kl_set_cipher(vif
, 0, true);
517 ath6kl_set_cipher(vif
, sme
->crypto
.cipher_group
, false);
519 if (sme
->crypto
.n_akm_suites
)
520 ath6kl_set_key_mgmt(vif
, sme
->crypto
.akm_suites
[0]);
522 if ((sme
->key_len
) &&
523 (vif
->auth_mode
== NONE_AUTH
) &&
524 (vif
->prwise_crypto
== WEP_CRYPT
)) {
525 struct ath6kl_key
*key
= NULL
;
527 if (sme
->key_idx
< WMI_MIN_KEY_INDEX
||
528 sme
->key_idx
> WMI_MAX_KEY_INDEX
) {
529 ath6kl_err("key index %d out of bounds\n",
535 key
= &vif
->keys
[sme
->key_idx
];
536 key
->key_len
= sme
->key_len
;
537 memcpy(key
->key
, sme
->key
, key
->key_len
);
538 key
->cipher
= vif
->prwise_crypto
;
539 vif
->def_txkey_index
= sme
->key_idx
;
541 ath6kl_wmi_addkey_cmd(ar
->wmi
, vif
->fw_vif_idx
, sme
->key_idx
,
543 GROUP_USAGE
| TX_USAGE
,
546 key
->key
, KEY_OP_INIT_VAL
, NULL
,
550 if (!ar
->usr_bss_filter
) {
551 clear_bit(CLEAR_BSSFILTER_ON_BEACON
, &vif
->flags
);
552 if (ath6kl_wmi_bssfilter_cmd(ar
->wmi
, vif
->fw_vif_idx
,
553 ALL_BSS_FILTER
, 0) != 0) {
554 ath6kl_err("couldn't set bss filtering\n");
560 vif
->nw_type
= vif
->next_mode
;
562 if (vif
->wdev
.iftype
== NL80211_IFTYPE_P2P_CLIENT
)
563 nw_subtype
= SUBTYPE_P2PCLIENT
;
565 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
566 "%s: connect called with authmode %d dot11 auth %d"
567 " PW crypto %d PW crypto len %d GRP crypto %d"
568 " GRP crypto len %d channel hint %u\n",
570 vif
->auth_mode
, vif
->dot11_auth_mode
, vif
->prwise_crypto
,
571 vif
->prwise_crypto_len
, vif
->grp_crypto
,
572 vif
->grp_crypto_len
, vif
->ch_hint
);
574 vif
->reconnect_flag
= 0;
575 status
= ath6kl_wmi_connect_cmd(ar
->wmi
, vif
->fw_vif_idx
, vif
->nw_type
,
576 vif
->dot11_auth_mode
, vif
->auth_mode
,
578 vif
->prwise_crypto_len
,
579 vif
->grp_crypto
, vif
->grp_crypto_len
,
580 vif
->ssid_len
, vif
->ssid
,
581 vif
->req_bssid
, vif
->ch_hint
,
582 ar
->connect_ctrl_flags
, nw_subtype
);
586 if (status
== -EINVAL
) {
587 memset(vif
->ssid
, 0, sizeof(vif
->ssid
));
589 ath6kl_err("invalid request\n");
592 ath6kl_err("ath6kl_wmi_connect_cmd failed\n");
596 if ((!(ar
->connect_ctrl_flags
& CONNECT_DO_WPA_OFFLOAD
)) &&
597 ((vif
->auth_mode
== WPA_PSK_AUTH
)
598 || (vif
->auth_mode
== WPA2_PSK_AUTH
))) {
599 mod_timer(&vif
->disconnect_timer
,
600 jiffies
+ msecs_to_jiffies(DISCON_TIMER_INTVAL
));
603 ar
->connect_ctrl_flags
&= ~CONNECT_DO_WPA_OFFLOAD
;
604 set_bit(CONNECT_PEND
, &vif
->flags
);
609 static struct cfg80211_bss
*
610 ath6kl_add_bss_if_needed(struct ath6kl_vif
*vif
,
611 enum network_type nw_type
,
613 struct ieee80211_channel
*chan
,
615 size_t beacon_ie_len
)
617 struct ath6kl
*ar
= vif
->ar
;
618 struct cfg80211_bss
*bss
;
619 u16 cap_mask
, cap_val
;
622 if (nw_type
& ADHOC_NETWORK
) {
623 cap_mask
= WLAN_CAPABILITY_IBSS
;
624 cap_val
= WLAN_CAPABILITY_IBSS
;
626 cap_mask
= WLAN_CAPABILITY_ESS
;
627 cap_val
= WLAN_CAPABILITY_ESS
;
630 bss
= cfg80211_get_bss(ar
->wiphy
, chan
, bssid
,
631 vif
->ssid
, vif
->ssid_len
,
635 * Since cfg80211 may not yet know about the BSS,
636 * generate a partial entry until the first BSS info
637 * event becomes available.
639 * Prepend SSID element since it is not included in the Beacon
640 * IEs from the target.
642 ie
= kmalloc(2 + vif
->ssid_len
+ beacon_ie_len
, GFP_KERNEL
);
645 ie
[0] = WLAN_EID_SSID
;
646 ie
[1] = vif
->ssid_len
;
647 memcpy(ie
+ 2, vif
->ssid
, vif
->ssid_len
);
648 memcpy(ie
+ 2 + vif
->ssid_len
, beacon_ie
, beacon_ie_len
);
649 bss
= cfg80211_inform_bss(ar
->wiphy
, chan
,
650 bssid
, 0, cap_val
, 100,
651 ie
, 2 + vif
->ssid_len
+ beacon_ie_len
,
654 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "added bss %pM to "
655 "cfg80211\n", bssid
);
658 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "cfg80211 already has a bss\n");
663 void ath6kl_cfg80211_connect_event(struct ath6kl_vif
*vif
, u16 channel
,
664 u8
*bssid
, u16 listen_intvl
,
666 enum network_type nw_type
,
667 u8 beacon_ie_len
, u8 assoc_req_len
,
668 u8 assoc_resp_len
, u8
*assoc_info
)
670 struct ieee80211_channel
*chan
;
671 struct ath6kl
*ar
= vif
->ar
;
672 struct cfg80211_bss
*bss
;
674 /* capinfo + listen interval */
675 u8 assoc_req_ie_offset
= sizeof(u16
) + sizeof(u16
);
677 /* capinfo + status code + associd */
678 u8 assoc_resp_ie_offset
= sizeof(u16
) + sizeof(u16
) + sizeof(u16
);
680 u8
*assoc_req_ie
= assoc_info
+ beacon_ie_len
+ assoc_req_ie_offset
;
681 u8
*assoc_resp_ie
= assoc_info
+ beacon_ie_len
+ assoc_req_len
+
682 assoc_resp_ie_offset
;
684 assoc_req_len
-= assoc_req_ie_offset
;
685 assoc_resp_len
-= assoc_resp_ie_offset
;
688 * Store Beacon interval here; DTIM period will be available only once
689 * a Beacon frame from the AP is seen.
691 vif
->assoc_bss_beacon_int
= beacon_intvl
;
692 clear_bit(DTIM_PERIOD_AVAIL
, &vif
->flags
);
694 if (nw_type
& ADHOC_NETWORK
) {
695 if (vif
->wdev
.iftype
!= NL80211_IFTYPE_ADHOC
) {
696 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
697 "%s: ath6k not in ibss mode\n", __func__
);
702 if (nw_type
& INFRA_NETWORK
) {
703 if (vif
->wdev
.iftype
!= NL80211_IFTYPE_STATION
&&
704 vif
->wdev
.iftype
!= NL80211_IFTYPE_P2P_CLIENT
) {
705 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
706 "%s: ath6k not in station mode\n", __func__
);
711 chan
= ieee80211_get_channel(ar
->wiphy
, (int) channel
);
713 bss
= ath6kl_add_bss_if_needed(vif
, nw_type
, bssid
, chan
,
714 assoc_info
, beacon_ie_len
);
716 ath6kl_err("could not add cfg80211 bss entry\n");
720 if (nw_type
& ADHOC_NETWORK
) {
721 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "ad-hoc %s selected\n",
722 nw_type
& ADHOC_CREATOR
? "creator" : "joiner");
723 cfg80211_ibss_joined(vif
->ndev
, bssid
, GFP_KERNEL
);
724 cfg80211_put_bss(bss
);
728 if (vif
->sme_state
== SME_CONNECTING
) {
729 /* inform connect result to cfg80211 */
730 vif
->sme_state
= SME_CONNECTED
;
731 cfg80211_connect_result(vif
->ndev
, bssid
,
732 assoc_req_ie
, assoc_req_len
,
733 assoc_resp_ie
, assoc_resp_len
,
734 WLAN_STATUS_SUCCESS
, GFP_KERNEL
);
735 cfg80211_put_bss(bss
);
736 } else if (vif
->sme_state
== SME_CONNECTED
) {
737 /* inform roam event to cfg80211 */
738 cfg80211_roamed_bss(vif
->ndev
, bss
, assoc_req_ie
, assoc_req_len
,
739 assoc_resp_ie
, assoc_resp_len
, GFP_KERNEL
);
743 static int ath6kl_cfg80211_disconnect(struct wiphy
*wiphy
,
744 struct net_device
*dev
, u16 reason_code
)
746 struct ath6kl
*ar
= ath6kl_priv(dev
);
747 struct ath6kl_vif
*vif
= netdev_priv(dev
);
749 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: reason=%u\n", __func__
,
752 ath6kl_cfg80211_sscan_disable(vif
);
754 if (!ath6kl_cfg80211_ready(vif
))
757 if (test_bit(DESTROY_IN_PROGRESS
, &ar
->flag
)) {
758 ath6kl_err("busy, destroy in progress\n");
762 if (down_interruptible(&ar
->sem
)) {
763 ath6kl_err("busy, couldn't get access\n");
767 vif
->reconnect_flag
= 0;
768 ath6kl_disconnect(vif
);
769 memset(vif
->ssid
, 0, sizeof(vif
->ssid
));
772 if (!test_bit(SKIP_SCAN
, &ar
->flag
))
773 memset(vif
->req_bssid
, 0, sizeof(vif
->req_bssid
));
777 vif
->sme_state
= SME_DISCONNECTED
;
782 void ath6kl_cfg80211_disconnect_event(struct ath6kl_vif
*vif
, u8 reason
,
783 u8
*bssid
, u8 assoc_resp_len
,
784 u8
*assoc_info
, u16 proto_reason
)
786 struct ath6kl
*ar
= vif
->ar
;
789 cfg80211_scan_done(vif
->scan_req
, true);
790 vif
->scan_req
= NULL
;
793 if (vif
->nw_type
& ADHOC_NETWORK
) {
794 if (vif
->wdev
.iftype
!= NL80211_IFTYPE_ADHOC
) {
795 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
796 "%s: ath6k not in ibss mode\n", __func__
);
799 memset(bssid
, 0, ETH_ALEN
);
800 cfg80211_ibss_joined(vif
->ndev
, bssid
, GFP_KERNEL
);
804 if (vif
->nw_type
& INFRA_NETWORK
) {
805 if (vif
->wdev
.iftype
!= NL80211_IFTYPE_STATION
&&
806 vif
->wdev
.iftype
!= NL80211_IFTYPE_P2P_CLIENT
) {
807 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
808 "%s: ath6k not in station mode\n", __func__
);
814 * Send a disconnect command to target when a disconnect event is
815 * received with reason code other than 3 (DISCONNECT_CMD - disconnect
816 * request from host) to make the firmware stop trying to connect even
817 * after giving disconnect event. There will be one more disconnect
818 * event for this disconnect command with reason code DISCONNECT_CMD
819 * which will be notified to cfg80211.
822 if (reason
!= DISCONNECT_CMD
) {
823 ath6kl_wmi_disconnect_cmd(ar
->wmi
, vif
->fw_vif_idx
);
827 clear_bit(CONNECT_PEND
, &vif
->flags
);
829 if (vif
->sme_state
== SME_CONNECTING
) {
830 cfg80211_connect_result(vif
->ndev
,
833 WLAN_STATUS_UNSPECIFIED_FAILURE
,
835 } else if (vif
->sme_state
== SME_CONNECTED
) {
836 cfg80211_disconnected(vif
->ndev
, reason
,
837 NULL
, 0, GFP_KERNEL
);
840 vif
->sme_state
= SME_DISCONNECTED
;
843 static int ath6kl_cfg80211_scan(struct wiphy
*wiphy
, struct net_device
*ndev
,
844 struct cfg80211_scan_request
*request
)
846 struct ath6kl
*ar
= ath6kl_priv(ndev
);
847 struct ath6kl_vif
*vif
= netdev_priv(ndev
);
849 u16
*channels
= NULL
;
851 u32 force_fg_scan
= 0;
853 if (!ath6kl_cfg80211_ready(vif
))
856 ath6kl_cfg80211_sscan_disable(vif
);
858 if (!ar
->usr_bss_filter
) {
859 clear_bit(CLEAR_BSSFILTER_ON_BEACON
, &vif
->flags
);
860 ret
= ath6kl_wmi_bssfilter_cmd(
861 ar
->wmi
, vif
->fw_vif_idx
,
862 (test_bit(CONNECTED
, &vif
->flags
) ?
863 ALL_BUT_BSS_FILTER
: ALL_BSS_FILTER
), 0);
865 ath6kl_err("couldn't set bss filtering\n");
870 if (request
->n_ssids
&& request
->ssids
[0].ssid_len
) {
873 if (request
->n_ssids
> (MAX_PROBED_SSID_INDEX
- 1))
874 request
->n_ssids
= MAX_PROBED_SSID_INDEX
- 1;
876 for (i
= 0; i
< request
->n_ssids
; i
++)
877 ath6kl_wmi_probedssid_cmd(ar
->wmi
, vif
->fw_vif_idx
,
878 i
+ 1, SPECIFIC_SSID_FLAG
,
879 request
->ssids
[i
].ssid_len
,
880 request
->ssids
[i
].ssid
);
884 * FIXME: we should clear the IE in fw if it's not set so just
885 * remove the check altogether
888 ret
= ath6kl_wmi_set_appie_cmd(ar
->wmi
, vif
->fw_vif_idx
,
890 request
->ie
, request
->ie_len
);
892 ath6kl_err("failed to set Probe Request appie for "
899 * Scan only the requested channels if the request specifies a set of
900 * channels. If the list is longer than the target supports, do not
901 * configure the list and instead, scan all available channels.
903 if (request
->n_channels
> 0 &&
904 request
->n_channels
<= WMI_MAX_CHANNELS
) {
907 n_channels
= request
->n_channels
;
909 channels
= kzalloc(n_channels
* sizeof(u16
), GFP_KERNEL
);
910 if (channels
== NULL
) {
911 ath6kl_warn("failed to set scan channels, "
912 "scan all channels");
916 for (i
= 0; i
< n_channels
; i
++)
917 channels
[i
] = request
->channels
[i
]->center_freq
;
920 if (test_bit(CONNECTED
, &vif
->flags
))
923 if (test_bit(ATH6KL_FW_CAPABILITY_STA_P2PDEV_DUPLEX
,
924 ar
->fw_capabilities
)) {
926 * If capable of doing P2P mgmt operations using
927 * station interface, send additional information like
928 * supported rates to advertise and xmit rates for
931 ret
= ath6kl_wmi_beginscan_cmd(ar
->wmi
, vif
->fw_vif_idx
,
932 WMI_LONG_SCAN
, force_fg_scan
,
933 false, 0, 0, n_channels
,
934 channels
, request
->no_cck
,
937 ret
= ath6kl_wmi_startscan_cmd(ar
->wmi
, vif
->fw_vif_idx
,
938 WMI_LONG_SCAN
, force_fg_scan
,
939 false, 0, 0, n_channels
,
943 ath6kl_err("wmi_startscan_cmd failed\n");
945 vif
->scan_req
= request
;
952 void ath6kl_cfg80211_scan_complete_event(struct ath6kl_vif
*vif
, bool aborted
)
954 struct ath6kl
*ar
= vif
->ar
;
957 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: status%s\n", __func__
,
958 aborted
? " aborted" : "");
966 if (vif
->scan_req
->n_ssids
&& vif
->scan_req
->ssids
[0].ssid_len
) {
967 for (i
= 0; i
< vif
->scan_req
->n_ssids
; i
++) {
968 ath6kl_wmi_probedssid_cmd(ar
->wmi
, vif
->fw_vif_idx
,
969 i
+ 1, DISABLE_SSID_FLAG
,
975 cfg80211_scan_done(vif
->scan_req
, aborted
);
976 vif
->scan_req
= NULL
;
979 static int ath6kl_cfg80211_add_key(struct wiphy
*wiphy
, struct net_device
*ndev
,
980 u8 key_index
, bool pairwise
,
982 struct key_params
*params
)
984 struct ath6kl
*ar
= ath6kl_priv(ndev
);
985 struct ath6kl_vif
*vif
= netdev_priv(ndev
);
986 struct ath6kl_key
*key
= NULL
;
990 if (!ath6kl_cfg80211_ready(vif
))
993 if (params
->cipher
== CCKM_KRK_CIPHER_SUITE
) {
994 if (params
->key_len
!= WMI_KRK_LEN
)
996 return ath6kl_wmi_add_krk_cmd(ar
->wmi
, vif
->fw_vif_idx
,
1000 if (key_index
< WMI_MIN_KEY_INDEX
|| key_index
> WMI_MAX_KEY_INDEX
) {
1001 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
1002 "%s: key index %d out of bounds\n", __func__
,
1007 key
= &vif
->keys
[key_index
];
1008 memset(key
, 0, sizeof(struct ath6kl_key
));
1011 key_usage
= PAIRWISE_USAGE
;
1013 key_usage
= GROUP_USAGE
;
1016 int seq_len
= params
->seq_len
;
1017 if (params
->cipher
== WLAN_CIPHER_SUITE_SMS4
&&
1018 seq_len
> ATH6KL_KEY_SEQ_LEN
) {
1019 /* Only first half of the WPI PN is configured */
1020 seq_len
= ATH6KL_KEY_SEQ_LEN
;
1022 if (params
->key_len
> WLAN_MAX_KEY_LEN
||
1023 seq_len
> sizeof(key
->seq
))
1026 key
->key_len
= params
->key_len
;
1027 memcpy(key
->key
, params
->key
, key
->key_len
);
1028 key
->seq_len
= seq_len
;
1029 memcpy(key
->seq
, params
->seq
, key
->seq_len
);
1030 key
->cipher
= params
->cipher
;
1033 switch (key
->cipher
) {
1034 case WLAN_CIPHER_SUITE_WEP40
:
1035 case WLAN_CIPHER_SUITE_WEP104
:
1036 key_type
= WEP_CRYPT
;
1039 case WLAN_CIPHER_SUITE_TKIP
:
1040 key_type
= TKIP_CRYPT
;
1043 case WLAN_CIPHER_SUITE_CCMP
:
1044 key_type
= AES_CRYPT
;
1046 case WLAN_CIPHER_SUITE_SMS4
:
1047 key_type
= WAPI_CRYPT
;
1054 if (((vif
->auth_mode
== WPA_PSK_AUTH
)
1055 || (vif
->auth_mode
== WPA2_PSK_AUTH
))
1056 && (key_usage
& GROUP_USAGE
))
1057 del_timer(&vif
->disconnect_timer
);
1059 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
1060 "%s: index %d, key_len %d, key_type 0x%x, key_usage 0x%x, seq_len %d\n",
1061 __func__
, key_index
, key
->key_len
, key_type
,
1062 key_usage
, key
->seq_len
);
1064 if (vif
->nw_type
== AP_NETWORK
&& !pairwise
&&
1065 (key_type
== TKIP_CRYPT
|| key_type
== AES_CRYPT
||
1066 key_type
== WAPI_CRYPT
) && params
) {
1067 ar
->ap_mode_bkey
.valid
= true;
1068 ar
->ap_mode_bkey
.key_index
= key_index
;
1069 ar
->ap_mode_bkey
.key_type
= key_type
;
1070 ar
->ap_mode_bkey
.key_len
= key
->key_len
;
1071 memcpy(ar
->ap_mode_bkey
.key
, key
->key
, key
->key_len
);
1072 if (!test_bit(CONNECTED
, &vif
->flags
)) {
1073 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "Delay initial group "
1074 "key configuration until AP mode has been "
1077 * The key will be set in ath6kl_connect_ap_mode() once
1078 * the connected event is received from the target.
1084 if (vif
->next_mode
== AP_NETWORK
&& key_type
== WEP_CRYPT
&&
1085 !test_bit(CONNECTED
, &vif
->flags
)) {
1087 * Store the key locally so that it can be re-configured after
1088 * the AP mode has properly started
1089 * (ath6kl_install_statioc_wep_keys).
1091 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "Delay WEP key configuration "
1092 "until AP mode has been started\n");
1093 vif
->wep_key_list
[key_index
].key_len
= key
->key_len
;
1094 memcpy(vif
->wep_key_list
[key_index
].key
, key
->key
,
1099 return ath6kl_wmi_addkey_cmd(ar
->wmi
, vif
->fw_vif_idx
, key_index
,
1100 key_type
, key_usage
, key
->key_len
,
1101 key
->seq
, key
->seq_len
, key
->key
,
1103 (u8
*) mac_addr
, SYNC_BOTH_WMIFLAG
);
1106 static int ath6kl_cfg80211_del_key(struct wiphy
*wiphy
, struct net_device
*ndev
,
1107 u8 key_index
, bool pairwise
,
1110 struct ath6kl
*ar
= ath6kl_priv(ndev
);
1111 struct ath6kl_vif
*vif
= netdev_priv(ndev
);
1113 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: index %d\n", __func__
, key_index
);
1115 if (!ath6kl_cfg80211_ready(vif
))
1118 if (key_index
< WMI_MIN_KEY_INDEX
|| key_index
> WMI_MAX_KEY_INDEX
) {
1119 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
1120 "%s: key index %d out of bounds\n", __func__
,
1125 if (!vif
->keys
[key_index
].key_len
) {
1126 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
1127 "%s: index %d is empty\n", __func__
, key_index
);
1131 vif
->keys
[key_index
].key_len
= 0;
1133 return ath6kl_wmi_deletekey_cmd(ar
->wmi
, vif
->fw_vif_idx
, key_index
);
1136 static int ath6kl_cfg80211_get_key(struct wiphy
*wiphy
, struct net_device
*ndev
,
1137 u8 key_index
, bool pairwise
,
1138 const u8
*mac_addr
, void *cookie
,
1139 void (*callback
) (void *cookie
,
1140 struct key_params
*))
1142 struct ath6kl_vif
*vif
= netdev_priv(ndev
);
1143 struct ath6kl_key
*key
= NULL
;
1144 struct key_params params
;
1146 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: index %d\n", __func__
, key_index
);
1148 if (!ath6kl_cfg80211_ready(vif
))
1151 if (key_index
< WMI_MIN_KEY_INDEX
|| key_index
> WMI_MAX_KEY_INDEX
) {
1152 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
1153 "%s: key index %d out of bounds\n", __func__
,
1158 key
= &vif
->keys
[key_index
];
1159 memset(¶ms
, 0, sizeof(params
));
1160 params
.cipher
= key
->cipher
;
1161 params
.key_len
= key
->key_len
;
1162 params
.seq_len
= key
->seq_len
;
1163 params
.seq
= key
->seq
;
1164 params
.key
= key
->key
;
1166 callback(cookie
, ¶ms
);
1168 return key
->key_len
? 0 : -ENOENT
;
1171 static int ath6kl_cfg80211_set_default_key(struct wiphy
*wiphy
,
1172 struct net_device
*ndev
,
1173 u8 key_index
, bool unicast
,
1176 struct ath6kl
*ar
= ath6kl_priv(ndev
);
1177 struct ath6kl_vif
*vif
= netdev_priv(ndev
);
1178 struct ath6kl_key
*key
= NULL
;
1180 enum crypto_type key_type
= NONE_CRYPT
;
1182 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: index %d\n", __func__
, key_index
);
1184 if (!ath6kl_cfg80211_ready(vif
))
1187 if (key_index
< WMI_MIN_KEY_INDEX
|| key_index
> WMI_MAX_KEY_INDEX
) {
1188 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
1189 "%s: key index %d out of bounds\n",
1190 __func__
, key_index
);
1194 if (!vif
->keys
[key_index
].key_len
) {
1195 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: invalid key index %d\n",
1196 __func__
, key_index
);
1200 vif
->def_txkey_index
= key_index
;
1201 key
= &vif
->keys
[vif
->def_txkey_index
];
1202 key_usage
= GROUP_USAGE
;
1203 if (vif
->prwise_crypto
== WEP_CRYPT
)
1204 key_usage
|= TX_USAGE
;
1206 key_type
= vif
->prwise_crypto
;
1208 key_type
= vif
->grp_crypto
;
1210 if (vif
->next_mode
== AP_NETWORK
&& !test_bit(CONNECTED
, &vif
->flags
))
1211 return 0; /* Delay until AP mode has been started */
1213 return ath6kl_wmi_addkey_cmd(ar
->wmi
, vif
->fw_vif_idx
,
1214 vif
->def_txkey_index
,
1215 key_type
, key_usage
,
1216 key
->key_len
, key
->seq
, key
->seq_len
,
1218 KEY_OP_INIT_VAL
, NULL
,
1222 void ath6kl_cfg80211_tkip_micerr_event(struct ath6kl_vif
*vif
, u8 keyid
,
1225 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
1226 "%s: keyid %d, ismcast %d\n", __func__
, keyid
, ismcast
);
1228 cfg80211_michael_mic_failure(vif
->ndev
, vif
->bssid
,
1229 (ismcast
? NL80211_KEYTYPE_GROUP
:
1230 NL80211_KEYTYPE_PAIRWISE
), keyid
, NULL
,
1234 static int ath6kl_cfg80211_set_wiphy_params(struct wiphy
*wiphy
, u32 changed
)
1236 struct ath6kl
*ar
= (struct ath6kl
*)wiphy_priv(wiphy
);
1237 struct ath6kl_vif
*vif
;
1240 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: changed 0x%x\n", __func__
,
1243 vif
= ath6kl_vif_first(ar
);
1247 if (!ath6kl_cfg80211_ready(vif
))
1250 if (changed
& WIPHY_PARAM_RTS_THRESHOLD
) {
1251 ret
= ath6kl_wmi_set_rts_cmd(ar
->wmi
, wiphy
->rts_threshold
);
1253 ath6kl_err("ath6kl_wmi_set_rts_cmd failed\n");
1262 * The type nl80211_tx_power_setting replaces the following
1263 * data type from 2.6.36 onwards
1265 static int ath6kl_cfg80211_set_txpower(struct wiphy
*wiphy
,
1266 enum nl80211_tx_power_setting type
,
1269 struct ath6kl
*ar
= (struct ath6kl
*)wiphy_priv(wiphy
);
1270 struct ath6kl_vif
*vif
;
1272 int dbm
= MBM_TO_DBM(mbm
);
1274 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: type 0x%x, dbm %d\n", __func__
,
1277 vif
= ath6kl_vif_first(ar
);
1281 if (!ath6kl_cfg80211_ready(vif
))
1285 case NL80211_TX_POWER_AUTOMATIC
:
1287 case NL80211_TX_POWER_LIMITED
:
1288 ar
->tx_pwr
= ath6kl_dbm
= dbm
;
1291 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: type 0x%x not supported\n",
1296 ath6kl_wmi_set_tx_pwr_cmd(ar
->wmi
, vif
->fw_vif_idx
, ath6kl_dbm
);
1301 static int ath6kl_cfg80211_get_txpower(struct wiphy
*wiphy
, int *dbm
)
1303 struct ath6kl
*ar
= (struct ath6kl
*)wiphy_priv(wiphy
);
1304 struct ath6kl_vif
*vif
;
1306 vif
= ath6kl_vif_first(ar
);
1310 if (!ath6kl_cfg80211_ready(vif
))
1313 if (test_bit(CONNECTED
, &vif
->flags
)) {
1316 if (ath6kl_wmi_get_tx_pwr_cmd(ar
->wmi
, vif
->fw_vif_idx
) != 0) {
1317 ath6kl_err("ath6kl_wmi_get_tx_pwr_cmd failed\n");
1321 wait_event_interruptible_timeout(ar
->event_wq
, ar
->tx_pwr
!= 0,
1324 if (signal_pending(current
)) {
1325 ath6kl_err("target did not respond\n");
1334 static int ath6kl_cfg80211_set_power_mgmt(struct wiphy
*wiphy
,
1335 struct net_device
*dev
,
1336 bool pmgmt
, int timeout
)
1338 struct ath6kl
*ar
= ath6kl_priv(dev
);
1339 struct wmi_power_mode_cmd mode
;
1340 struct ath6kl_vif
*vif
= netdev_priv(dev
);
1342 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: pmgmt %d, timeout %d\n",
1343 __func__
, pmgmt
, timeout
);
1345 if (!ath6kl_cfg80211_ready(vif
))
1349 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: max perf\n", __func__
);
1350 mode
.pwr_mode
= REC_POWER
;
1352 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: rec power\n", __func__
);
1353 mode
.pwr_mode
= MAX_PERF_POWER
;
1356 if (ath6kl_wmi_powermode_cmd(ar
->wmi
, vif
->fw_vif_idx
,
1357 mode
.pwr_mode
) != 0) {
1358 ath6kl_err("wmi_powermode_cmd failed\n");
1365 static struct net_device
*ath6kl_cfg80211_add_iface(struct wiphy
*wiphy
,
1367 enum nl80211_iftype type
,
1369 struct vif_params
*params
)
1371 struct ath6kl
*ar
= wiphy_priv(wiphy
);
1372 struct net_device
*ndev
;
1375 if (ar
->num_vif
== ar
->vif_max
) {
1376 ath6kl_err("Reached maximum number of supported vif\n");
1377 return ERR_PTR(-EINVAL
);
1380 if (!ath6kl_is_valid_iftype(ar
, type
, &if_idx
, &nw_type
)) {
1381 ath6kl_err("Not a supported interface type\n");
1382 return ERR_PTR(-EINVAL
);
1385 ndev
= ath6kl_interface_add(ar
, name
, type
, if_idx
, nw_type
);
1387 return ERR_PTR(-ENOMEM
);
1394 static int ath6kl_cfg80211_del_iface(struct wiphy
*wiphy
,
1395 struct net_device
*ndev
)
1397 struct ath6kl
*ar
= wiphy_priv(wiphy
);
1398 struct ath6kl_vif
*vif
= netdev_priv(ndev
);
1400 spin_lock_bh(&ar
->list_lock
);
1401 list_del(&vif
->list
);
1402 spin_unlock_bh(&ar
->list_lock
);
1404 ath6kl_cleanup_vif(vif
, test_bit(WMI_READY
, &ar
->flag
));
1406 ath6kl_deinit_if_data(vif
);
1411 static int ath6kl_cfg80211_change_iface(struct wiphy
*wiphy
,
1412 struct net_device
*ndev
,
1413 enum nl80211_iftype type
, u32
*flags
,
1414 struct vif_params
*params
)
1416 struct ath6kl_vif
*vif
= netdev_priv(ndev
);
1418 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: type %u\n", __func__
, type
);
1421 case NL80211_IFTYPE_STATION
:
1422 vif
->next_mode
= INFRA_NETWORK
;
1424 case NL80211_IFTYPE_ADHOC
:
1425 vif
->next_mode
= ADHOC_NETWORK
;
1427 case NL80211_IFTYPE_AP
:
1428 vif
->next_mode
= AP_NETWORK
;
1430 case NL80211_IFTYPE_P2P_CLIENT
:
1431 vif
->next_mode
= INFRA_NETWORK
;
1433 case NL80211_IFTYPE_P2P_GO
:
1434 vif
->next_mode
= AP_NETWORK
;
1437 ath6kl_err("invalid interface type %u\n", type
);
1441 vif
->wdev
.iftype
= type
;
1446 static int ath6kl_cfg80211_join_ibss(struct wiphy
*wiphy
,
1447 struct net_device
*dev
,
1448 struct cfg80211_ibss_params
*ibss_param
)
1450 struct ath6kl
*ar
= ath6kl_priv(dev
);
1451 struct ath6kl_vif
*vif
= netdev_priv(dev
);
1454 if (!ath6kl_cfg80211_ready(vif
))
1457 vif
->ssid_len
= ibss_param
->ssid_len
;
1458 memcpy(vif
->ssid
, ibss_param
->ssid
, vif
->ssid_len
);
1460 if (ibss_param
->channel
)
1461 vif
->ch_hint
= ibss_param
->channel
->center_freq
;
1463 if (ibss_param
->channel_fixed
) {
1465 * TODO: channel_fixed: The channel should be fixed, do not
1466 * search for IBSSs to join on other channels. Target
1467 * firmware does not support this feature, needs to be
1473 memset(vif
->req_bssid
, 0, sizeof(vif
->req_bssid
));
1474 if (ibss_param
->bssid
&& !is_broadcast_ether_addr(ibss_param
->bssid
))
1475 memcpy(vif
->req_bssid
, ibss_param
->bssid
,
1476 sizeof(vif
->req_bssid
));
1478 ath6kl_set_wpa_version(vif
, 0);
1480 status
= ath6kl_set_auth_type(vif
, NL80211_AUTHTYPE_OPEN_SYSTEM
);
1484 if (ibss_param
->privacy
) {
1485 ath6kl_set_cipher(vif
, WLAN_CIPHER_SUITE_WEP40
, true);
1486 ath6kl_set_cipher(vif
, WLAN_CIPHER_SUITE_WEP40
, false);
1488 ath6kl_set_cipher(vif
, 0, true);
1489 ath6kl_set_cipher(vif
, 0, false);
1492 vif
->nw_type
= vif
->next_mode
;
1494 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
1495 "%s: connect called with authmode %d dot11 auth %d"
1496 " PW crypto %d PW crypto len %d GRP crypto %d"
1497 " GRP crypto len %d channel hint %u\n",
1499 vif
->auth_mode
, vif
->dot11_auth_mode
, vif
->prwise_crypto
,
1500 vif
->prwise_crypto_len
, vif
->grp_crypto
,
1501 vif
->grp_crypto_len
, vif
->ch_hint
);
1503 status
= ath6kl_wmi_connect_cmd(ar
->wmi
, vif
->fw_vif_idx
, vif
->nw_type
,
1504 vif
->dot11_auth_mode
, vif
->auth_mode
,
1506 vif
->prwise_crypto_len
,
1507 vif
->grp_crypto
, vif
->grp_crypto_len
,
1508 vif
->ssid_len
, vif
->ssid
,
1509 vif
->req_bssid
, vif
->ch_hint
,
1510 ar
->connect_ctrl_flags
, SUBTYPE_NONE
);
1511 set_bit(CONNECT_PEND
, &vif
->flags
);
1516 static int ath6kl_cfg80211_leave_ibss(struct wiphy
*wiphy
,
1517 struct net_device
*dev
)
1519 struct ath6kl_vif
*vif
= netdev_priv(dev
);
1521 if (!ath6kl_cfg80211_ready(vif
))
1524 ath6kl_disconnect(vif
);
1525 memset(vif
->ssid
, 0, sizeof(vif
->ssid
));
1531 static const u32 cipher_suites
[] = {
1532 WLAN_CIPHER_SUITE_WEP40
,
1533 WLAN_CIPHER_SUITE_WEP104
,
1534 WLAN_CIPHER_SUITE_TKIP
,
1535 WLAN_CIPHER_SUITE_CCMP
,
1536 CCKM_KRK_CIPHER_SUITE
,
1537 WLAN_CIPHER_SUITE_SMS4
,
1540 static bool is_rate_legacy(s32 rate
)
1542 static const s32 legacy
[] = { 1000, 2000, 5500, 11000,
1543 6000, 9000, 12000, 18000, 24000,
1548 for (i
= 0; i
< ARRAY_SIZE(legacy
); i
++)
1549 if (rate
== legacy
[i
])
1555 static bool is_rate_ht20(s32 rate
, u8
*mcs
, bool *sgi
)
1557 static const s32 ht20
[] = { 6500, 13000, 19500, 26000, 39000,
1558 52000, 58500, 65000, 72200
1562 for (i
= 0; i
< ARRAY_SIZE(ht20
); i
++) {
1563 if (rate
== ht20
[i
]) {
1564 if (i
== ARRAY_SIZE(ht20
) - 1)
1565 /* last rate uses sgi */
1577 static bool is_rate_ht40(s32 rate
, u8
*mcs
, bool *sgi
)
1579 static const s32 ht40
[] = { 13500, 27000, 40500, 54000,
1580 81000, 108000, 121500, 135000,
1585 for (i
= 0; i
< ARRAY_SIZE(ht40
); i
++) {
1586 if (rate
== ht40
[i
]) {
1587 if (i
== ARRAY_SIZE(ht40
) - 1)
1588 /* last rate uses sgi */
1601 static int ath6kl_get_station(struct wiphy
*wiphy
, struct net_device
*dev
,
1602 u8
*mac
, struct station_info
*sinfo
)
1604 struct ath6kl
*ar
= ath6kl_priv(dev
);
1605 struct ath6kl_vif
*vif
= netdev_priv(dev
);
1612 if (memcmp(mac
, vif
->bssid
, ETH_ALEN
) != 0)
1615 if (down_interruptible(&ar
->sem
))
1618 set_bit(STATS_UPDATE_PEND
, &vif
->flags
);
1620 ret
= ath6kl_wmi_get_stats_cmd(ar
->wmi
, vif
->fw_vif_idx
);
1627 left
= wait_event_interruptible_timeout(ar
->event_wq
,
1628 !test_bit(STATS_UPDATE_PEND
,
1639 if (vif
->target_stats
.rx_byte
) {
1640 sinfo
->rx_bytes
= vif
->target_stats
.rx_byte
;
1641 sinfo
->filled
|= STATION_INFO_RX_BYTES
;
1642 sinfo
->rx_packets
= vif
->target_stats
.rx_pkt
;
1643 sinfo
->filled
|= STATION_INFO_RX_PACKETS
;
1646 if (vif
->target_stats
.tx_byte
) {
1647 sinfo
->tx_bytes
= vif
->target_stats
.tx_byte
;
1648 sinfo
->filled
|= STATION_INFO_TX_BYTES
;
1649 sinfo
->tx_packets
= vif
->target_stats
.tx_pkt
;
1650 sinfo
->filled
|= STATION_INFO_TX_PACKETS
;
1653 sinfo
->signal
= vif
->target_stats
.cs_rssi
;
1654 sinfo
->filled
|= STATION_INFO_SIGNAL
;
1656 rate
= vif
->target_stats
.tx_ucast_rate
;
1658 if (is_rate_legacy(rate
)) {
1659 sinfo
->txrate
.legacy
= rate
/ 100;
1660 } else if (is_rate_ht20(rate
, &mcs
, &sgi
)) {
1662 sinfo
->txrate
.flags
|= RATE_INFO_FLAGS_SHORT_GI
;
1663 sinfo
->txrate
.mcs
= mcs
- 1;
1665 sinfo
->txrate
.mcs
= mcs
;
1668 sinfo
->txrate
.flags
|= RATE_INFO_FLAGS_MCS
;
1669 } else if (is_rate_ht40(rate
, &mcs
, &sgi
)) {
1671 sinfo
->txrate
.flags
|= RATE_INFO_FLAGS_SHORT_GI
;
1672 sinfo
->txrate
.mcs
= mcs
- 1;
1674 sinfo
->txrate
.mcs
= mcs
;
1677 sinfo
->txrate
.flags
|= RATE_INFO_FLAGS_40_MHZ_WIDTH
;
1678 sinfo
->txrate
.flags
|= RATE_INFO_FLAGS_MCS
;
1680 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
1681 "invalid rate from stats: %d\n", rate
);
1682 ath6kl_debug_war(ar
, ATH6KL_WAR_INVALID_RATE
);
1686 sinfo
->filled
|= STATION_INFO_TX_BITRATE
;
1688 if (test_bit(CONNECTED
, &vif
->flags
) &&
1689 test_bit(DTIM_PERIOD_AVAIL
, &vif
->flags
) &&
1690 vif
->nw_type
== INFRA_NETWORK
) {
1691 sinfo
->filled
|= STATION_INFO_BSS_PARAM
;
1692 sinfo
->bss_param
.flags
= 0;
1693 sinfo
->bss_param
.dtim_period
= vif
->assoc_bss_dtim_period
;
1694 sinfo
->bss_param
.beacon_interval
= vif
->assoc_bss_beacon_int
;
1700 static int ath6kl_set_pmksa(struct wiphy
*wiphy
, struct net_device
*netdev
,
1701 struct cfg80211_pmksa
*pmksa
)
1703 struct ath6kl
*ar
= ath6kl_priv(netdev
);
1704 struct ath6kl_vif
*vif
= netdev_priv(netdev
);
1706 return ath6kl_wmi_setpmkid_cmd(ar
->wmi
, vif
->fw_vif_idx
, pmksa
->bssid
,
1707 pmksa
->pmkid
, true);
1710 static int ath6kl_del_pmksa(struct wiphy
*wiphy
, struct net_device
*netdev
,
1711 struct cfg80211_pmksa
*pmksa
)
1713 struct ath6kl
*ar
= ath6kl_priv(netdev
);
1714 struct ath6kl_vif
*vif
= netdev_priv(netdev
);
1716 return ath6kl_wmi_setpmkid_cmd(ar
->wmi
, vif
->fw_vif_idx
, pmksa
->bssid
,
1717 pmksa
->pmkid
, false);
1720 static int ath6kl_flush_pmksa(struct wiphy
*wiphy
, struct net_device
*netdev
)
1722 struct ath6kl
*ar
= ath6kl_priv(netdev
);
1723 struct ath6kl_vif
*vif
= netdev_priv(netdev
);
1725 if (test_bit(CONNECTED
, &vif
->flags
))
1726 return ath6kl_wmi_setpmkid_cmd(ar
->wmi
, vif
->fw_vif_idx
,
1727 vif
->bssid
, NULL
, false);
1731 static int ath6kl_wow_suspend(struct ath6kl
*ar
, struct cfg80211_wowlan
*wow
)
1733 struct in_device
*in_dev
;
1734 struct in_ifaddr
*ifa
;
1735 struct ath6kl_vif
*vif
;
1739 u8 mask
[WOW_MASK_SIZE
], index
= 0;
1740 __be32 ips
[MAX_IP_ADDRS
];
1742 vif
= ath6kl_vif_first(ar
);
1746 if (!ath6kl_cfg80211_ready(vif
))
1749 if (!test_bit(CONNECTED
, &vif
->flags
))
1752 /* Clear existing WOW patterns */
1753 for (i
= 0; i
< WOW_MAX_FILTERS_PER_LIST
; i
++)
1754 ath6kl_wmi_del_wow_pattern_cmd(ar
->wmi
, vif
->fw_vif_idx
,
1756 /* Configure new WOW patterns */
1757 for (i
= 0; i
< wow
->n_patterns
; i
++) {
1760 * Convert given nl80211 specific mask value to equivalent
1761 * driver specific mask value and send it to the chip along
1762 * with patterns. For example, If the mask value defined in
1763 * struct cfg80211_wowlan is 0xA (equivalent binary is 1010),
1764 * then equivalent driver specific mask value is
1765 * "0xFF 0x00 0xFF 0x00".
1767 memset(&mask
, 0, sizeof(mask
));
1768 for (pos
= 0; pos
< wow
->patterns
[i
].pattern_len
; pos
++) {
1769 if (wow
->patterns
[i
].mask
[pos
/ 8] & (0x1 << (pos
% 8)))
1773 * Note: Pattern's offset is not passed as part of wowlan
1774 * parameter from CFG layer. So it's always passed as ZERO
1775 * to the firmware. It means, given WOW patterns are always
1776 * matched from the first byte of received pkt in the firmware.
1778 ret
= ath6kl_wmi_add_wow_pattern_cmd(ar
->wmi
,
1779 vif
->fw_vif_idx
, WOW_LIST_ID
,
1780 wow
->patterns
[i
].pattern_len
,
1781 0 /* pattern offset */,
1782 wow
->patterns
[i
].pattern
, mask
);
1787 /* Setup own IP addr for ARP agent. */
1788 in_dev
= __in_dev_get_rtnl(vif
->ndev
);
1792 ifa
= in_dev
->ifa_list
;
1793 memset(&ips
, 0, sizeof(ips
));
1795 /* Configure IP addr only if IP address count < MAX_IP_ADDRS */
1796 while (index
< MAX_IP_ADDRS
&& ifa
) {
1797 ips
[index
] = ifa
->ifa_local
;
1798 ifa
= ifa
->ifa_next
;
1803 ath6kl_err("total IP addr count is exceeding fw limit\n");
1807 ret
= ath6kl_wmi_set_ip_cmd(ar
->wmi
, vif
->fw_vif_idx
, ips
[0], ips
[1]);
1809 ath6kl_err("fail to setup ip for arp agent\n");
1814 if (wow
->disconnect
)
1815 filter
|= WOW_FILTER_OPTION_NWK_DISASSOC
;
1818 filter
|= WOW_FILTER_OPTION_MAGIC_PACKET
;
1820 if (wow
->gtk_rekey_failure
)
1821 filter
|= WOW_FILTER_OPTION_GTK_ERROR
;
1823 if (wow
->eap_identity_req
)
1824 filter
|= WOW_FILTER_OPTION_EAP_REQ
;
1826 if (wow
->four_way_handshake
)
1827 filter
|= WOW_FILTER_OPTION_8021X_4WAYHS
;
1829 ret
= ath6kl_wmi_set_wow_mode_cmd(ar
->wmi
, vif
->fw_vif_idx
,
1830 ATH6KL_WOW_MODE_ENABLE
,
1832 WOW_HOST_REQ_DELAY
);
1836 ret
= ath6kl_wmi_set_host_sleep_mode_cmd(ar
->wmi
, vif
->fw_vif_idx
,
1837 ATH6KL_HOST_MODE_ASLEEP
);
1841 if (ar
->tx_pending
[ar
->ctrl_ep
]) {
1842 left
= wait_event_interruptible_timeout(ar
->event_wq
,
1843 ar
->tx_pending
[ar
->ctrl_ep
] == 0, WMI_TIMEOUT
);
1845 ath6kl_warn("clear wmi ctrl data timeout\n");
1847 } else if (left
< 0) {
1848 ath6kl_warn("clear wmi ctrl data failed: %d\n", left
);
1856 static int ath6kl_wow_resume(struct ath6kl
*ar
)
1858 struct ath6kl_vif
*vif
;
1861 vif
= ath6kl_vif_first(ar
);
1865 ret
= ath6kl_wmi_set_host_sleep_mode_cmd(ar
->wmi
, vif
->fw_vif_idx
,
1866 ATH6KL_HOST_MODE_AWAKE
);
1870 int ath6kl_cfg80211_suspend(struct ath6kl
*ar
,
1871 enum ath6kl_cfg_suspend_mode mode
,
1872 struct cfg80211_wowlan
*wow
)
1877 case ATH6KL_CFG_SUSPEND_WOW
:
1879 ath6kl_dbg(ATH6KL_DBG_SUSPEND
, "wow mode suspend\n");
1881 /* Flush all non control pkts in TX path */
1882 ath6kl_tx_data_cleanup(ar
);
1884 ret
= ath6kl_wow_suspend(ar
, wow
);
1886 ath6kl_err("wow suspend failed: %d\n", ret
);
1889 ar
->state
= ATH6KL_STATE_WOW
;
1892 case ATH6KL_CFG_SUSPEND_DEEPSLEEP
:
1894 ath6kl_cfg80211_stop_all(ar
);
1896 /* save the current power mode before enabling power save */
1897 ar
->wmi
->saved_pwr_mode
= ar
->wmi
->pwr_mode
;
1899 ret
= ath6kl_wmi_powermode_cmd(ar
->wmi
, 0, REC_POWER
);
1901 ath6kl_warn("wmi powermode command failed during suspend: %d\n",
1905 ar
->state
= ATH6KL_STATE_DEEPSLEEP
;
1909 case ATH6KL_CFG_SUSPEND_CUTPOWER
:
1911 ath6kl_cfg80211_stop_all(ar
);
1913 if (ar
->state
== ATH6KL_STATE_OFF
) {
1914 ath6kl_dbg(ATH6KL_DBG_SUSPEND
,
1915 "suspend hw off, no action for cutpower\n");
1919 ath6kl_dbg(ATH6KL_DBG_SUSPEND
, "suspend cutting power\n");
1921 ret
= ath6kl_init_hw_stop(ar
);
1923 ath6kl_warn("failed to stop hw during suspend: %d\n",
1927 ar
->state
= ATH6KL_STATE_CUTPOWER
;
1931 case ATH6KL_CFG_SUSPEND_SCHED_SCAN
:
1933 * Nothing needed for schedule scan, firmware is already in
1934 * wow mode and sleeping most of the time.
1945 int ath6kl_cfg80211_resume(struct ath6kl
*ar
)
1949 switch (ar
->state
) {
1950 case ATH6KL_STATE_WOW
:
1951 ath6kl_dbg(ATH6KL_DBG_SUSPEND
, "wow mode resume\n");
1953 ret
= ath6kl_wow_resume(ar
);
1955 ath6kl_warn("wow mode resume failed: %d\n", ret
);
1959 ar
->state
= ATH6KL_STATE_ON
;
1962 case ATH6KL_STATE_DEEPSLEEP
:
1963 if (ar
->wmi
->pwr_mode
!= ar
->wmi
->saved_pwr_mode
) {
1964 ret
= ath6kl_wmi_powermode_cmd(ar
->wmi
, 0,
1965 ar
->wmi
->saved_pwr_mode
);
1967 ath6kl_warn("wmi powermode command failed during resume: %d\n",
1972 ar
->state
= ATH6KL_STATE_ON
;
1976 case ATH6KL_STATE_CUTPOWER
:
1977 ath6kl_dbg(ATH6KL_DBG_SUSPEND
, "resume restoring power\n");
1979 ret
= ath6kl_init_hw_start(ar
);
1981 ath6kl_warn("Failed to boot hw in resume: %d\n", ret
);
1986 case ATH6KL_STATE_SCHED_SCAN
:
1998 /* hif layer decides what suspend mode to use */
1999 static int __ath6kl_cfg80211_suspend(struct wiphy
*wiphy
,
2000 struct cfg80211_wowlan
*wow
)
2002 struct ath6kl
*ar
= wiphy_priv(wiphy
);
2004 return ath6kl_hif_suspend(ar
, wow
);
2007 static int __ath6kl_cfg80211_resume(struct wiphy
*wiphy
)
2009 struct ath6kl
*ar
= wiphy_priv(wiphy
);
2011 return ath6kl_hif_resume(ar
);
2015 * FIXME: WOW suspend mode is selected if the host sdio controller supports
2016 * both sdio irq wake up and keep power. The target pulls sdio data line to
2017 * wake up the host when WOW pattern matches. This causes sdio irq handler
2018 * is being called in the host side which internally hits ath6kl's RX path.
2020 * Since sdio interrupt is not disabled, RX path executes even before
2021 * the host executes the actual resume operation from PM module.
2023 * In the current scenario, WOW resume should happen before start processing
2024 * any data from the target. So It's required to perform WOW resume in RX path.
2025 * Ideally we should perform WOW resume only in the actual platform
2026 * resume path. This area needs bit rework to avoid WOW resume in RX path.
2028 * ath6kl_check_wow_status() is called from ath6kl_rx().
2030 void ath6kl_check_wow_status(struct ath6kl
*ar
)
2032 if (ar
->state
== ATH6KL_STATE_WOW
)
2033 ath6kl_cfg80211_resume(ar
);
2038 void ath6kl_check_wow_status(struct ath6kl
*ar
)
2043 static int ath6kl_set_channel(struct wiphy
*wiphy
, struct net_device
*dev
,
2044 struct ieee80211_channel
*chan
,
2045 enum nl80211_channel_type channel_type
)
2047 struct ath6kl_vif
*vif
;
2050 * 'dev' could be NULL if a channel change is required for the hardware
2051 * device itself, instead of a particular VIF.
2053 * FIXME: To be handled properly when monitor mode is supported.
2058 vif
= netdev_priv(dev
);
2060 if (!ath6kl_cfg80211_ready(vif
))
2063 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: center_freq=%u hw_value=%u\n",
2064 __func__
, chan
->center_freq
, chan
->hw_value
);
2065 vif
->next_chan
= chan
->center_freq
;
2070 static bool ath6kl_is_p2p_ie(const u8
*pos
)
2072 return pos
[0] == WLAN_EID_VENDOR_SPECIFIC
&& pos
[1] >= 4 &&
2073 pos
[2] == 0x50 && pos
[3] == 0x6f &&
2074 pos
[4] == 0x9a && pos
[5] == 0x09;
2077 static int ath6kl_set_ap_probe_resp_ies(struct ath6kl_vif
*vif
,
2078 const u8
*ies
, size_t ies_len
)
2080 struct ath6kl
*ar
= vif
->ar
;
2087 * Filter out P2P IE(s) since they will be included depending on
2088 * the Probe Request frame in ath6kl_send_go_probe_resp().
2091 if (ies
&& ies_len
) {
2092 buf
= kmalloc(ies_len
, GFP_KERNEL
);
2096 while (pos
+ 1 < ies
+ ies_len
) {
2097 if (pos
+ 2 + pos
[1] > ies
+ ies_len
)
2099 if (!ath6kl_is_p2p_ie(pos
)) {
2100 memcpy(buf
+ len
, pos
, 2 + pos
[1]);
2107 ret
= ath6kl_wmi_set_appie_cmd(ar
->wmi
, vif
->fw_vif_idx
,
2108 WMI_FRAME_PROBE_RESP
, buf
, len
);
2113 static int ath6kl_ap_beacon(struct wiphy
*wiphy
, struct net_device
*dev
,
2114 struct beacon_parameters
*info
, bool add
)
2116 struct ath6kl
*ar
= ath6kl_priv(dev
);
2117 struct ath6kl_vif
*vif
= netdev_priv(dev
);
2118 struct ieee80211_mgmt
*mgmt
;
2121 struct wmi_connect_cmd p
;
2125 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: add=%d\n", __func__
, add
);
2127 if (!ath6kl_cfg80211_ready(vif
))
2130 if (vif
->next_mode
!= AP_NETWORK
)
2133 if (info
->beacon_ies
) {
2134 res
= ath6kl_wmi_set_appie_cmd(ar
->wmi
, vif
->fw_vif_idx
,
2137 info
->beacon_ies_len
);
2141 if (info
->proberesp_ies
) {
2142 res
= ath6kl_set_ap_probe_resp_ies(vif
, info
->proberesp_ies
,
2143 info
->proberesp_ies_len
);
2147 if (info
->assocresp_ies
) {
2148 res
= ath6kl_wmi_set_appie_cmd(ar
->wmi
, vif
->fw_vif_idx
,
2149 WMI_FRAME_ASSOC_RESP
,
2150 info
->assocresp_ies
,
2151 info
->assocresp_ies_len
);
2159 ar
->ap_mode_bkey
.valid
= false;
2166 if (info
->head
== NULL
)
2168 mgmt
= (struct ieee80211_mgmt
*) info
->head
;
2169 ies
= mgmt
->u
.beacon
.variable
;
2170 if (ies
> info
->head
+ info
->head_len
)
2172 ies_len
= info
->head
+ info
->head_len
- ies
;
2174 if (info
->ssid
== NULL
)
2176 memcpy(vif
->ssid
, info
->ssid
, info
->ssid_len
);
2177 vif
->ssid_len
= info
->ssid_len
;
2178 if (info
->hidden_ssid
!= NL80211_HIDDEN_SSID_NOT_IN_USE
)
2179 return -EOPNOTSUPP
; /* TODO */
2181 ret
= ath6kl_set_auth_type(vif
, info
->auth_type
);
2185 memset(&p
, 0, sizeof(p
));
2187 for (i
= 0; i
< info
->crypto
.n_akm_suites
; i
++) {
2188 switch (info
->crypto
.akm_suites
[i
]) {
2189 case WLAN_AKM_SUITE_8021X
:
2190 if (info
->crypto
.wpa_versions
& NL80211_WPA_VERSION_1
)
2191 p
.auth_mode
|= WPA_AUTH
;
2192 if (info
->crypto
.wpa_versions
& NL80211_WPA_VERSION_2
)
2193 p
.auth_mode
|= WPA2_AUTH
;
2195 case WLAN_AKM_SUITE_PSK
:
2196 if (info
->crypto
.wpa_versions
& NL80211_WPA_VERSION_1
)
2197 p
.auth_mode
|= WPA_PSK_AUTH
;
2198 if (info
->crypto
.wpa_versions
& NL80211_WPA_VERSION_2
)
2199 p
.auth_mode
|= WPA2_PSK_AUTH
;
2203 if (p
.auth_mode
== 0)
2204 p
.auth_mode
= NONE_AUTH
;
2205 vif
->auth_mode
= p
.auth_mode
;
2207 for (i
= 0; i
< info
->crypto
.n_ciphers_pairwise
; i
++) {
2208 switch (info
->crypto
.ciphers_pairwise
[i
]) {
2209 case WLAN_CIPHER_SUITE_WEP40
:
2210 case WLAN_CIPHER_SUITE_WEP104
:
2211 p
.prwise_crypto_type
|= WEP_CRYPT
;
2213 case WLAN_CIPHER_SUITE_TKIP
:
2214 p
.prwise_crypto_type
|= TKIP_CRYPT
;
2216 case WLAN_CIPHER_SUITE_CCMP
:
2217 p
.prwise_crypto_type
|= AES_CRYPT
;
2219 case WLAN_CIPHER_SUITE_SMS4
:
2220 p
.prwise_crypto_type
|= WAPI_CRYPT
;
2224 if (p
.prwise_crypto_type
== 0) {
2225 p
.prwise_crypto_type
= NONE_CRYPT
;
2226 ath6kl_set_cipher(vif
, 0, true);
2227 } else if (info
->crypto
.n_ciphers_pairwise
== 1)
2228 ath6kl_set_cipher(vif
, info
->crypto
.ciphers_pairwise
[0], true);
2230 switch (info
->crypto
.cipher_group
) {
2231 case WLAN_CIPHER_SUITE_WEP40
:
2232 case WLAN_CIPHER_SUITE_WEP104
:
2233 p
.grp_crypto_type
= WEP_CRYPT
;
2235 case WLAN_CIPHER_SUITE_TKIP
:
2236 p
.grp_crypto_type
= TKIP_CRYPT
;
2238 case WLAN_CIPHER_SUITE_CCMP
:
2239 p
.grp_crypto_type
= AES_CRYPT
;
2241 case WLAN_CIPHER_SUITE_SMS4
:
2242 p
.grp_crypto_type
= WAPI_CRYPT
;
2245 p
.grp_crypto_type
= NONE_CRYPT
;
2248 ath6kl_set_cipher(vif
, info
->crypto
.cipher_group
, false);
2250 p
.nw_type
= AP_NETWORK
;
2251 vif
->nw_type
= vif
->next_mode
;
2253 p
.ssid_len
= vif
->ssid_len
;
2254 memcpy(p
.ssid
, vif
->ssid
, vif
->ssid_len
);
2255 p
.dot11_auth_mode
= vif
->dot11_auth_mode
;
2256 p
.ch
= cpu_to_le16(vif
->next_chan
);
2258 if (vif
->wdev
.iftype
== NL80211_IFTYPE_P2P_GO
) {
2259 p
.nw_subtype
= SUBTYPE_P2PGO
;
2262 * Due to firmware limitation, it is not possible to
2263 * do P2P mgmt operations in AP mode
2265 p
.nw_subtype
= SUBTYPE_NONE
;
2268 res
= ath6kl_wmi_ap_profile_commit(ar
->wmi
, vif
->fw_vif_idx
, &p
);
2275 static int ath6kl_add_beacon(struct wiphy
*wiphy
, struct net_device
*dev
,
2276 struct beacon_parameters
*info
)
2278 return ath6kl_ap_beacon(wiphy
, dev
, info
, true);
2281 static int ath6kl_set_beacon(struct wiphy
*wiphy
, struct net_device
*dev
,
2282 struct beacon_parameters
*info
)
2284 return ath6kl_ap_beacon(wiphy
, dev
, info
, false);
2287 static int ath6kl_del_beacon(struct wiphy
*wiphy
, struct net_device
*dev
)
2289 struct ath6kl
*ar
= ath6kl_priv(dev
);
2290 struct ath6kl_vif
*vif
= netdev_priv(dev
);
2292 if (vif
->nw_type
!= AP_NETWORK
)
2294 if (!test_bit(CONNECTED
, &vif
->flags
))
2297 ath6kl_wmi_disconnect_cmd(ar
->wmi
, vif
->fw_vif_idx
);
2298 clear_bit(CONNECTED
, &vif
->flags
);
2303 static int ath6kl_change_station(struct wiphy
*wiphy
, struct net_device
*dev
,
2304 u8
*mac
, struct station_parameters
*params
)
2306 struct ath6kl
*ar
= ath6kl_priv(dev
);
2307 struct ath6kl_vif
*vif
= netdev_priv(dev
);
2309 if (vif
->nw_type
!= AP_NETWORK
)
2312 /* Use this only for authorizing/unauthorizing a station */
2313 if (!(params
->sta_flags_mask
& BIT(NL80211_STA_FLAG_AUTHORIZED
)))
2316 if (params
->sta_flags_set
& BIT(NL80211_STA_FLAG_AUTHORIZED
))
2317 return ath6kl_wmi_ap_set_mlme(ar
->wmi
, vif
->fw_vif_idx
,
2318 WMI_AP_MLME_AUTHORIZE
, mac
, 0);
2319 return ath6kl_wmi_ap_set_mlme(ar
->wmi
, vif
->fw_vif_idx
,
2320 WMI_AP_MLME_UNAUTHORIZE
, mac
, 0);
2323 static int ath6kl_remain_on_channel(struct wiphy
*wiphy
,
2324 struct net_device
*dev
,
2325 struct ieee80211_channel
*chan
,
2326 enum nl80211_channel_type channel_type
,
2327 unsigned int duration
,
2330 struct ath6kl
*ar
= ath6kl_priv(dev
);
2331 struct ath6kl_vif
*vif
= netdev_priv(dev
);
2334 /* TODO: if already pending or ongoing remain-on-channel,
2336 id
= ++vif
->last_roc_id
;
2338 /* Do not use 0 as the cookie value */
2339 id
= ++vif
->last_roc_id
;
2343 return ath6kl_wmi_remain_on_chnl_cmd(ar
->wmi
, vif
->fw_vif_idx
,
2344 chan
->center_freq
, duration
);
2347 static int ath6kl_cancel_remain_on_channel(struct wiphy
*wiphy
,
2348 struct net_device
*dev
,
2351 struct ath6kl
*ar
= ath6kl_priv(dev
);
2352 struct ath6kl_vif
*vif
= netdev_priv(dev
);
2354 if (cookie
!= vif
->last_roc_id
)
2356 vif
->last_cancel_roc_id
= cookie
;
2358 return ath6kl_wmi_cancel_remain_on_chnl_cmd(ar
->wmi
, vif
->fw_vif_idx
);
2361 static int ath6kl_send_go_probe_resp(struct ath6kl_vif
*vif
,
2362 const u8
*buf
, size_t len
,
2365 struct ath6kl
*ar
= vif
->ar
;
2370 const struct ieee80211_mgmt
*mgmt
;
2372 mgmt
= (const struct ieee80211_mgmt
*) buf
;
2374 /* Include P2P IE(s) from the frame generated in user space. */
2376 p2p
= kmalloc(len
, GFP_KERNEL
);
2381 pos
= mgmt
->u
.probe_resp
.variable
;
2382 while (pos
+ 1 < buf
+ len
) {
2383 if (pos
+ 2 + pos
[1] > buf
+ len
)
2385 if (ath6kl_is_p2p_ie(pos
)) {
2386 memcpy(p2p
+ p2p_len
, pos
, 2 + pos
[1]);
2387 p2p_len
+= 2 + pos
[1];
2392 ret
= ath6kl_wmi_send_probe_response_cmd(ar
->wmi
, vif
->fw_vif_idx
, freq
,
2393 mgmt
->da
, p2p
, p2p_len
);
2398 static int ath6kl_mgmt_tx(struct wiphy
*wiphy
, struct net_device
*dev
,
2399 struct ieee80211_channel
*chan
, bool offchan
,
2400 enum nl80211_channel_type channel_type
,
2401 bool channel_type_valid
, unsigned int wait
,
2402 const u8
*buf
, size_t len
, bool no_cck
,
2403 bool dont_wait_for_ack
, u64
*cookie
)
2405 struct ath6kl
*ar
= ath6kl_priv(dev
);
2406 struct ath6kl_vif
*vif
= netdev_priv(dev
);
2408 const struct ieee80211_mgmt
*mgmt
;
2410 mgmt
= (const struct ieee80211_mgmt
*) buf
;
2411 if (buf
+ len
>= mgmt
->u
.probe_resp
.variable
&&
2412 vif
->nw_type
== AP_NETWORK
&& test_bit(CONNECTED
, &vif
->flags
) &&
2413 ieee80211_is_probe_resp(mgmt
->frame_control
)) {
2415 * Send Probe Response frame in AP mode using a separate WMI
2416 * command to allow the target to fill in the generic IEs.
2418 *cookie
= 0; /* TX status not supported */
2419 return ath6kl_send_go_probe_resp(vif
, buf
, len
,
2423 id
= vif
->send_action_id
++;
2426 * 0 is a reserved value in the WMI command and shall not be
2427 * used for the command.
2429 id
= vif
->send_action_id
++;
2434 if (test_bit(ATH6KL_FW_CAPABILITY_STA_P2PDEV_DUPLEX
,
2435 ar
->fw_capabilities
)) {
2437 * If capable of doing P2P mgmt operations using
2438 * station interface, send additional information like
2439 * supported rates to advertise and xmit rates for
2442 return ath6kl_wmi_send_mgmt_cmd(ar
->wmi
, vif
->fw_vif_idx
, id
,
2443 chan
->center_freq
, wait
,
2446 return ath6kl_wmi_send_action_cmd(ar
->wmi
, vif
->fw_vif_idx
, id
,
2447 chan
->center_freq
, wait
,
2452 static void ath6kl_mgmt_frame_register(struct wiphy
*wiphy
,
2453 struct net_device
*dev
,
2454 u16 frame_type
, bool reg
)
2456 struct ath6kl_vif
*vif
= netdev_priv(dev
);
2458 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: frame_type=0x%x reg=%d\n",
2459 __func__
, frame_type
, reg
);
2460 if (frame_type
== IEEE80211_STYPE_PROBE_REQ
) {
2462 * Note: This notification callback is not allowed to sleep, so
2463 * we cannot send WMI_PROBE_REQ_REPORT_CMD here. Instead, we
2464 * hardcode target to report Probe Request frames all the time.
2466 vif
->probe_req_report
= reg
;
2470 static int ath6kl_cfg80211_sscan_start(struct wiphy
*wiphy
,
2471 struct net_device
*dev
,
2472 struct cfg80211_sched_scan_request
*request
)
2474 struct ath6kl
*ar
= ath6kl_priv(dev
);
2475 struct ath6kl_vif
*vif
= netdev_priv(dev
);
2480 if (ar
->state
!= ATH6KL_STATE_ON
)
2483 if (vif
->sme_state
!= SME_DISCONNECTED
)
2486 for (i
= 0; i
< ar
->wiphy
->max_sched_scan_ssids
; i
++) {
2487 ath6kl_wmi_probedssid_cmd(ar
->wmi
, vif
->fw_vif_idx
,
2488 i
, DISABLE_SSID_FLAG
,
2492 /* fw uses seconds, also make sure that it's >0 */
2493 interval
= max_t(u16
, 1, request
->interval
/ 1000);
2495 ath6kl_wmi_scanparams_cmd(ar
->wmi
, vif
->fw_vif_idx
,
2497 10, 0, 0, 0, 3, 0, 0, 0);
2499 if (request
->n_ssids
&& request
->ssids
[0].ssid_len
) {
2500 for (i
= 0; i
< request
->n_ssids
; i
++) {
2501 ath6kl_wmi_probedssid_cmd(ar
->wmi
, vif
->fw_vif_idx
,
2502 i
, SPECIFIC_SSID_FLAG
,
2503 request
->ssids
[i
].ssid_len
,
2504 request
->ssids
[i
].ssid
);
2508 ret
= ath6kl_wmi_set_wow_mode_cmd(ar
->wmi
, vif
->fw_vif_idx
,
2509 ATH6KL_WOW_MODE_ENABLE
,
2511 WOW_HOST_REQ_DELAY
);
2513 ath6kl_warn("Failed to enable wow with ssid filter: %d\n", ret
);
2517 /* this also clears IE in fw if it's not set */
2518 ret
= ath6kl_wmi_set_appie_cmd(ar
->wmi
, vif
->fw_vif_idx
,
2519 WMI_FRAME_PROBE_REQ
,
2520 request
->ie
, request
->ie_len
);
2522 ath6kl_warn("Failed to set probe request IE for scheduled scan: %d",
2527 ret
= ath6kl_wmi_set_host_sleep_mode_cmd(ar
->wmi
, vif
->fw_vif_idx
,
2528 ATH6KL_HOST_MODE_ASLEEP
);
2530 ath6kl_warn("Failed to enable host sleep mode for sched scan: %d\n",
2535 ar
->state
= ATH6KL_STATE_SCHED_SCAN
;
2540 static int ath6kl_cfg80211_sscan_stop(struct wiphy
*wiphy
,
2541 struct net_device
*dev
)
2543 struct ath6kl_vif
*vif
= netdev_priv(dev
);
2546 stopped
= __ath6kl_cfg80211_sscan_stop(vif
);
2554 static const struct ieee80211_txrx_stypes
2555 ath6kl_mgmt_stypes
[NUM_NL80211_IFTYPES
] = {
2556 [NL80211_IFTYPE_STATION
] = {
2557 .tx
= BIT(IEEE80211_STYPE_ACTION
>> 4) |
2558 BIT(IEEE80211_STYPE_PROBE_RESP
>> 4),
2559 .rx
= BIT(IEEE80211_STYPE_ACTION
>> 4) |
2560 BIT(IEEE80211_STYPE_PROBE_REQ
>> 4)
2562 [NL80211_IFTYPE_P2P_CLIENT
] = {
2563 .tx
= BIT(IEEE80211_STYPE_ACTION
>> 4) |
2564 BIT(IEEE80211_STYPE_PROBE_RESP
>> 4),
2565 .rx
= BIT(IEEE80211_STYPE_ACTION
>> 4) |
2566 BIT(IEEE80211_STYPE_PROBE_REQ
>> 4)
2568 [NL80211_IFTYPE_P2P_GO
] = {
2569 .tx
= BIT(IEEE80211_STYPE_ACTION
>> 4) |
2570 BIT(IEEE80211_STYPE_PROBE_RESP
>> 4),
2571 .rx
= BIT(IEEE80211_STYPE_ACTION
>> 4) |
2572 BIT(IEEE80211_STYPE_PROBE_REQ
>> 4)
2576 static struct cfg80211_ops ath6kl_cfg80211_ops
= {
2577 .add_virtual_intf
= ath6kl_cfg80211_add_iface
,
2578 .del_virtual_intf
= ath6kl_cfg80211_del_iface
,
2579 .change_virtual_intf
= ath6kl_cfg80211_change_iface
,
2580 .scan
= ath6kl_cfg80211_scan
,
2581 .connect
= ath6kl_cfg80211_connect
,
2582 .disconnect
= ath6kl_cfg80211_disconnect
,
2583 .add_key
= ath6kl_cfg80211_add_key
,
2584 .get_key
= ath6kl_cfg80211_get_key
,
2585 .del_key
= ath6kl_cfg80211_del_key
,
2586 .set_default_key
= ath6kl_cfg80211_set_default_key
,
2587 .set_wiphy_params
= ath6kl_cfg80211_set_wiphy_params
,
2588 .set_tx_power
= ath6kl_cfg80211_set_txpower
,
2589 .get_tx_power
= ath6kl_cfg80211_get_txpower
,
2590 .set_power_mgmt
= ath6kl_cfg80211_set_power_mgmt
,
2591 .join_ibss
= ath6kl_cfg80211_join_ibss
,
2592 .leave_ibss
= ath6kl_cfg80211_leave_ibss
,
2593 .get_station
= ath6kl_get_station
,
2594 .set_pmksa
= ath6kl_set_pmksa
,
2595 .del_pmksa
= ath6kl_del_pmksa
,
2596 .flush_pmksa
= ath6kl_flush_pmksa
,
2597 CFG80211_TESTMODE_CMD(ath6kl_tm_cmd
)
2599 .suspend
= __ath6kl_cfg80211_suspend
,
2600 .resume
= __ath6kl_cfg80211_resume
,
2602 .set_channel
= ath6kl_set_channel
,
2603 .add_beacon
= ath6kl_add_beacon
,
2604 .set_beacon
= ath6kl_set_beacon
,
2605 .del_beacon
= ath6kl_del_beacon
,
2606 .change_station
= ath6kl_change_station
,
2607 .remain_on_channel
= ath6kl_remain_on_channel
,
2608 .cancel_remain_on_channel
= ath6kl_cancel_remain_on_channel
,
2609 .mgmt_tx
= ath6kl_mgmt_tx
,
2610 .mgmt_frame_register
= ath6kl_mgmt_frame_register
,
2611 .sched_scan_start
= ath6kl_cfg80211_sscan_start
,
2612 .sched_scan_stop
= ath6kl_cfg80211_sscan_stop
,
2615 void ath6kl_cfg80211_stop(struct ath6kl_vif
*vif
)
2617 ath6kl_cfg80211_sscan_disable(vif
);
2619 switch (vif
->sme_state
) {
2620 case SME_DISCONNECTED
:
2622 case SME_CONNECTING
:
2623 cfg80211_connect_result(vif
->ndev
, vif
->bssid
, NULL
, 0,
2625 WLAN_STATUS_UNSPECIFIED_FAILURE
,
2629 cfg80211_disconnected(vif
->ndev
, 0, NULL
, 0, GFP_KERNEL
);
2633 if (test_bit(CONNECTED
, &vif
->flags
) ||
2634 test_bit(CONNECT_PEND
, &vif
->flags
))
2635 ath6kl_wmi_disconnect_cmd(vif
->ar
->wmi
, vif
->fw_vif_idx
);
2637 vif
->sme_state
= SME_DISCONNECTED
;
2638 clear_bit(CONNECTED
, &vif
->flags
);
2639 clear_bit(CONNECT_PEND
, &vif
->flags
);
2641 /* disable scanning */
2642 if (ath6kl_wmi_scanparams_cmd(vif
->ar
->wmi
, vif
->fw_vif_idx
, 0xFFFF,
2643 0, 0, 0, 0, 0, 0, 0, 0, 0) != 0)
2644 ath6kl_warn("failed to disable scan during stop\n");
2646 ath6kl_cfg80211_scan_complete_event(vif
, true);
2649 void ath6kl_cfg80211_stop_all(struct ath6kl
*ar
)
2651 struct ath6kl_vif
*vif
;
2653 vif
= ath6kl_vif_first(ar
);
2655 /* save the current power mode before enabling power save */
2656 ar
->wmi
->saved_pwr_mode
= ar
->wmi
->pwr_mode
;
2658 if (ath6kl_wmi_powermode_cmd(ar
->wmi
, 0, REC_POWER
) != 0)
2659 ath6kl_warn("ath6kl_deep_sleep_enable: "
2660 "wmi_powermode_cmd failed\n");
2665 * FIXME: we should take ar->list_lock to protect changes in the
2666 * vif_list, but that's not trivial to do as ath6kl_cfg80211_stop()
2669 list_for_each_entry(vif
, &ar
->vif_list
, list
)
2670 ath6kl_cfg80211_stop(vif
);
2673 struct ath6kl
*ath6kl_core_alloc(struct device
*dev
)
2676 struct wiphy
*wiphy
;
2679 /* create a new wiphy for use with cfg80211 */
2680 wiphy
= wiphy_new(&ath6kl_cfg80211_ops
, sizeof(struct ath6kl
));
2683 ath6kl_err("couldn't allocate wiphy device\n");
2687 ar
= wiphy_priv(wiphy
);
2688 ar
->p2p
= !!ath6kl_p2p
;
2694 ar
->max_norm_iface
= 1;
2696 spin_lock_init(&ar
->lock
);
2697 spin_lock_init(&ar
->mcastpsq_lock
);
2698 spin_lock_init(&ar
->list_lock
);
2700 init_waitqueue_head(&ar
->event_wq
);
2701 sema_init(&ar
->sem
, 1);
2703 INIT_LIST_HEAD(&ar
->amsdu_rx_buffer_queue
);
2704 INIT_LIST_HEAD(&ar
->vif_list
);
2706 clear_bit(WMI_ENABLED
, &ar
->flag
);
2707 clear_bit(SKIP_SCAN
, &ar
->flag
);
2708 clear_bit(DESTROY_IN_PROGRESS
, &ar
->flag
);
2710 ar
->listen_intvl_t
= A_DEFAULT_LISTEN_INTERVAL
;
2711 ar
->listen_intvl_b
= 0;
2715 ar
->lrssi_roam_threshold
= DEF_LRSSI_ROAM_THRESHOLD
;
2717 ar
->state
= ATH6KL_STATE_OFF
;
2719 memset((u8
*)ar
->sta_list
, 0,
2720 AP_MAX_NUM_STA
* sizeof(struct ath6kl_sta
));
2722 /* Init the PS queues */
2723 for (ctr
= 0; ctr
< AP_MAX_NUM_STA
; ctr
++) {
2724 spin_lock_init(&ar
->sta_list
[ctr
].psq_lock
);
2725 skb_queue_head_init(&ar
->sta_list
[ctr
].psq
);
2728 skb_queue_head_init(&ar
->mcastpsq
);
2730 memcpy(ar
->ap_country_code
, DEF_AP_COUNTRY_CODE
, 3);
2735 int ath6kl_register_ieee80211_hw(struct ath6kl
*ar
)
2737 struct wiphy
*wiphy
= ar
->wiphy
;
2740 wiphy
->mgmt_stypes
= ath6kl_mgmt_stypes
;
2742 wiphy
->max_remain_on_channel_duration
= 5000;
2744 /* set device pointer for wiphy */
2745 set_wiphy_dev(wiphy
, ar
->dev
);
2747 wiphy
->interface_modes
= BIT(NL80211_IFTYPE_STATION
) |
2748 BIT(NL80211_IFTYPE_ADHOC
) |
2749 BIT(NL80211_IFTYPE_AP
);
2751 wiphy
->interface_modes
|= BIT(NL80211_IFTYPE_P2P_GO
) |
2752 BIT(NL80211_IFTYPE_P2P_CLIENT
);
2755 /* max num of ssids that can be probed during scanning */
2756 wiphy
->max_scan_ssids
= MAX_PROBED_SSID_INDEX
;
2757 wiphy
->max_scan_ie_len
= 1000; /* FIX: what is correct limit? */
2758 wiphy
->bands
[IEEE80211_BAND_2GHZ
] = &ath6kl_band_2ghz
;
2759 wiphy
->bands
[IEEE80211_BAND_5GHZ
] = &ath6kl_band_5ghz
;
2760 wiphy
->signal_type
= CFG80211_SIGNAL_TYPE_MBM
;
2762 wiphy
->cipher_suites
= cipher_suites
;
2763 wiphy
->n_cipher_suites
= ARRAY_SIZE(cipher_suites
);
2765 wiphy
->wowlan
.flags
= WIPHY_WOWLAN_MAGIC_PKT
|
2766 WIPHY_WOWLAN_DISCONNECT
|
2767 WIPHY_WOWLAN_GTK_REKEY_FAILURE
|
2768 WIPHY_WOWLAN_SUPPORTS_GTK_REKEY
|
2769 WIPHY_WOWLAN_EAP_IDENTITY_REQ
|
2770 WIPHY_WOWLAN_4WAY_HANDSHAKE
;
2771 wiphy
->wowlan
.n_patterns
= WOW_MAX_FILTERS_PER_LIST
;
2772 wiphy
->wowlan
.pattern_min_len
= 1;
2773 wiphy
->wowlan
.pattern_max_len
= WOW_PATTERN_SIZE
;
2775 wiphy
->max_sched_scan_ssids
= 10;
2777 ret
= wiphy_register(wiphy
);
2779 ath6kl_err("couldn't register wiphy device\n");
2786 static int ath6kl_init_if_data(struct ath6kl_vif
*vif
)
2788 vif
->aggr_cntxt
= aggr_init(vif
->ndev
);
2789 if (!vif
->aggr_cntxt
) {
2790 ath6kl_err("failed to initialize aggr\n");
2794 setup_timer(&vif
->disconnect_timer
, disconnect_timer_handler
,
2795 (unsigned long) vif
->ndev
);
2796 setup_timer(&vif
->sched_scan_timer
, ath6kl_wmi_sscan_timer
,
2797 (unsigned long) vif
);
2799 set_bit(WMM_ENABLED
, &vif
->flags
);
2800 spin_lock_init(&vif
->if_lock
);
2805 void ath6kl_deinit_if_data(struct ath6kl_vif
*vif
)
2807 struct ath6kl
*ar
= vif
->ar
;
2809 aggr_module_destroy(vif
->aggr_cntxt
);
2811 ar
->avail_idx_map
|= BIT(vif
->fw_vif_idx
);
2813 if (vif
->nw_type
== ADHOC_NETWORK
)
2814 ar
->ibss_if_active
= false;
2816 unregister_netdevice(vif
->ndev
);
2821 struct net_device
*ath6kl_interface_add(struct ath6kl
*ar
, char *name
,
2822 enum nl80211_iftype type
, u8 fw_vif_idx
,
2825 struct net_device
*ndev
;
2826 struct ath6kl_vif
*vif
;
2828 ndev
= alloc_netdev(sizeof(*vif
), name
, ether_setup
);
2832 vif
= netdev_priv(ndev
);
2833 ndev
->ieee80211_ptr
= &vif
->wdev
;
2834 vif
->wdev
.wiphy
= ar
->wiphy
;
2837 SET_NETDEV_DEV(ndev
, wiphy_dev(vif
->wdev
.wiphy
));
2838 vif
->wdev
.netdev
= ndev
;
2839 vif
->wdev
.iftype
= type
;
2840 vif
->fw_vif_idx
= fw_vif_idx
;
2841 vif
->nw_type
= vif
->next_mode
= nw_type
;
2843 memcpy(ndev
->dev_addr
, ar
->mac_addr
, ETH_ALEN
);
2844 if (fw_vif_idx
!= 0)
2845 ndev
->dev_addr
[0] = (ndev
->dev_addr
[0] ^ (1 << fw_vif_idx
)) |
2850 ath6kl_init_control_info(vif
);
2852 /* TODO: Pass interface specific pointer instead of ar */
2853 if (ath6kl_init_if_data(vif
))
2856 if (register_netdevice(ndev
))
2859 ar
->avail_idx_map
&= ~BIT(fw_vif_idx
);
2860 vif
->sme_state
= SME_DISCONNECTED
;
2861 set_bit(WLAN_ENABLED
, &vif
->flags
);
2862 ar
->wlan_pwr_state
= WLAN_POWER_STATE_ON
;
2863 set_bit(NETDEV_REGISTERED
, &vif
->flags
);
2865 if (type
== NL80211_IFTYPE_ADHOC
)
2866 ar
->ibss_if_active
= true;
2868 spin_lock_bh(&ar
->list_lock
);
2869 list_add_tail(&vif
->list
, &ar
->vif_list
);
2870 spin_unlock_bh(&ar
->list_lock
);
2875 aggr_module_destroy(vif
->aggr_cntxt
);
2880 void ath6kl_deinit_ieee80211_hw(struct ath6kl
*ar
)
2882 wiphy_unregister(ar
->wiphy
);
2883 wiphy_free(ar
->wiphy
);