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.
23 static unsigned int ath6kl_p2p
;
24 static unsigned int multi_norm_if_support
;
26 module_param(ath6kl_p2p
, uint
, 0644);
27 module_param(multi_norm_if_support
, uint
, 0644);
29 #define RATETAB_ENT(_rate, _rateid, _flags) { \
32 .hw_value = (_rateid), \
35 #define CHAN2G(_channel, _freq, _flags) { \
36 .band = IEEE80211_BAND_2GHZ, \
37 .hw_value = (_channel), \
38 .center_freq = (_freq), \
40 .max_antenna_gain = 0, \
44 #define CHAN5G(_channel, _flags) { \
45 .band = IEEE80211_BAND_5GHZ, \
46 .hw_value = (_channel), \
47 .center_freq = 5000 + (5 * (_channel)), \
49 .max_antenna_gain = 0, \
53 static struct ieee80211_rate ath6kl_rates
[] = {
54 RATETAB_ENT(10, 0x1, 0),
55 RATETAB_ENT(20, 0x2, 0),
56 RATETAB_ENT(55, 0x4, 0),
57 RATETAB_ENT(110, 0x8, 0),
58 RATETAB_ENT(60, 0x10, 0),
59 RATETAB_ENT(90, 0x20, 0),
60 RATETAB_ENT(120, 0x40, 0),
61 RATETAB_ENT(180, 0x80, 0),
62 RATETAB_ENT(240, 0x100, 0),
63 RATETAB_ENT(360, 0x200, 0),
64 RATETAB_ENT(480, 0x400, 0),
65 RATETAB_ENT(540, 0x800, 0),
68 #define ath6kl_a_rates (ath6kl_rates + 4)
69 #define ath6kl_a_rates_size 8
70 #define ath6kl_g_rates (ath6kl_rates + 0)
71 #define ath6kl_g_rates_size 12
73 static struct ieee80211_channel ath6kl_2ghz_channels
[] = {
90 static struct ieee80211_channel ath6kl_5ghz_a_channels
[] = {
91 CHAN5G(34, 0), CHAN5G(36, 0),
92 CHAN5G(38, 0), CHAN5G(40, 0),
93 CHAN5G(42, 0), CHAN5G(44, 0),
94 CHAN5G(46, 0), CHAN5G(48, 0),
95 CHAN5G(52, 0), CHAN5G(56, 0),
96 CHAN5G(60, 0), CHAN5G(64, 0),
97 CHAN5G(100, 0), CHAN5G(104, 0),
98 CHAN5G(108, 0), CHAN5G(112, 0),
99 CHAN5G(116, 0), CHAN5G(120, 0),
100 CHAN5G(124, 0), CHAN5G(128, 0),
101 CHAN5G(132, 0), CHAN5G(136, 0),
102 CHAN5G(140, 0), CHAN5G(149, 0),
103 CHAN5G(153, 0), CHAN5G(157, 0),
104 CHAN5G(161, 0), CHAN5G(165, 0),
105 CHAN5G(184, 0), CHAN5G(188, 0),
106 CHAN5G(192, 0), CHAN5G(196, 0),
107 CHAN5G(200, 0), CHAN5G(204, 0),
108 CHAN5G(208, 0), CHAN5G(212, 0),
112 static struct ieee80211_supported_band ath6kl_band_2ghz
= {
113 .n_channels
= ARRAY_SIZE(ath6kl_2ghz_channels
),
114 .channels
= ath6kl_2ghz_channels
,
115 .n_bitrates
= ath6kl_g_rates_size
,
116 .bitrates
= ath6kl_g_rates
,
119 static struct ieee80211_supported_band ath6kl_band_5ghz
= {
120 .n_channels
= ARRAY_SIZE(ath6kl_5ghz_a_channels
),
121 .channels
= ath6kl_5ghz_a_channels
,
122 .n_bitrates
= ath6kl_a_rates_size
,
123 .bitrates
= ath6kl_a_rates
,
126 #define CCKM_KRK_CIPHER_SUITE 0x004096ff /* use for KRK */
128 static int ath6kl_set_wpa_version(struct ath6kl_vif
*vif
,
129 enum nl80211_wpa_versions wpa_version
)
131 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: %u\n", __func__
, wpa_version
);
134 vif
->auth_mode
= NONE_AUTH
;
135 } else if (wpa_version
& NL80211_WPA_VERSION_2
) {
136 vif
->auth_mode
= WPA2_AUTH
;
137 } else if (wpa_version
& NL80211_WPA_VERSION_1
) {
138 vif
->auth_mode
= WPA_AUTH
;
140 ath6kl_err("%s: %u not supported\n", __func__
, wpa_version
);
147 static int ath6kl_set_auth_type(struct ath6kl_vif
*vif
,
148 enum nl80211_auth_type auth_type
)
150 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: 0x%x\n", __func__
, auth_type
);
153 case NL80211_AUTHTYPE_OPEN_SYSTEM
:
154 vif
->dot11_auth_mode
= OPEN_AUTH
;
156 case NL80211_AUTHTYPE_SHARED_KEY
:
157 vif
->dot11_auth_mode
= SHARED_AUTH
;
159 case NL80211_AUTHTYPE_NETWORK_EAP
:
160 vif
->dot11_auth_mode
= LEAP_AUTH
;
163 case NL80211_AUTHTYPE_AUTOMATIC
:
164 vif
->dot11_auth_mode
= OPEN_AUTH
| SHARED_AUTH
;
168 ath6kl_err("%s: 0x%x not spported\n", __func__
, auth_type
);
175 static int ath6kl_set_cipher(struct ath6kl_vif
*vif
, u32 cipher
, bool ucast
)
177 u8
*ar_cipher
= ucast
? &vif
->prwise_crypto
: &vif
->grp_crypto
;
178 u8
*ar_cipher_len
= ucast
? &vif
->prwise_crypto_len
:
179 &vif
->grp_crypto_len
;
181 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: cipher 0x%x, ucast %u\n",
182 __func__
, cipher
, ucast
);
186 /* our own hack to use value 0 as no crypto used */
187 *ar_cipher
= NONE_CRYPT
;
190 case WLAN_CIPHER_SUITE_WEP40
:
191 *ar_cipher
= WEP_CRYPT
;
194 case WLAN_CIPHER_SUITE_WEP104
:
195 *ar_cipher
= WEP_CRYPT
;
198 case WLAN_CIPHER_SUITE_TKIP
:
199 *ar_cipher
= TKIP_CRYPT
;
202 case WLAN_CIPHER_SUITE_CCMP
:
203 *ar_cipher
= AES_CRYPT
;
207 ath6kl_err("cipher 0x%x not supported\n", cipher
);
214 static void ath6kl_set_key_mgmt(struct ath6kl_vif
*vif
, u32 key_mgmt
)
216 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: 0x%x\n", __func__
, key_mgmt
);
218 if (key_mgmt
== WLAN_AKM_SUITE_PSK
) {
219 if (vif
->auth_mode
== WPA_AUTH
)
220 vif
->auth_mode
= WPA_PSK_AUTH
;
221 else if (vif
->auth_mode
== WPA2_AUTH
)
222 vif
->auth_mode
= WPA2_PSK_AUTH
;
223 } else if (key_mgmt
== 0x00409600) {
224 if (vif
->auth_mode
== WPA_AUTH
)
225 vif
->auth_mode
= WPA_AUTH_CCKM
;
226 else if (vif
->auth_mode
== WPA2_AUTH
)
227 vif
->auth_mode
= WPA2_AUTH_CCKM
;
228 } else if (key_mgmt
!= WLAN_AKM_SUITE_8021X
) {
229 vif
->auth_mode
= NONE_AUTH
;
233 static bool ath6kl_cfg80211_ready(struct ath6kl_vif
*vif
)
235 struct ath6kl
*ar
= vif
->ar
;
237 if (!test_bit(WMI_READY
, &ar
->flag
)) {
238 ath6kl_err("wmi is not ready\n");
242 if (!test_bit(WLAN_ENABLED
, &vif
->flags
)) {
243 ath6kl_err("wlan disabled\n");
250 static bool ath6kl_is_wpa_ie(const u8
*pos
)
252 return pos
[0] == WLAN_EID_WPA
&& pos
[1] >= 4 &&
253 pos
[2] == 0x00 && pos
[3] == 0x50 &&
254 pos
[4] == 0xf2 && pos
[5] == 0x01;
257 static bool ath6kl_is_rsn_ie(const u8
*pos
)
259 return pos
[0] == WLAN_EID_RSN
;
262 static bool ath6kl_is_wps_ie(const u8
*pos
)
264 return (pos
[0] == WLAN_EID_VENDOR_SPECIFIC
&&
266 pos
[2] == 0x00 && pos
[3] == 0x50 && pos
[4] == 0xf2 &&
270 static int ath6kl_set_assoc_req_ies(struct ath6kl_vif
*vif
, const u8
*ies
,
273 struct ath6kl
*ar
= vif
->ar
;
280 * Clear previously set flag
283 ar
->connect_ctrl_flags
&= ~CONNECT_WPS_FLAG
;
286 * Filter out RSN/WPA IE(s)
289 if (ies
&& ies_len
) {
290 buf
= kmalloc(ies_len
, GFP_KERNEL
);
295 while (pos
+ 1 < ies
+ ies_len
) {
296 if (pos
+ 2 + pos
[1] > ies
+ ies_len
)
298 if (!(ath6kl_is_wpa_ie(pos
) || ath6kl_is_rsn_ie(pos
))) {
299 memcpy(buf
+ len
, pos
, 2 + pos
[1]);
303 if (ath6kl_is_wps_ie(pos
))
304 ar
->connect_ctrl_flags
|= CONNECT_WPS_FLAG
;
310 ret
= ath6kl_wmi_set_appie_cmd(ar
->wmi
, vif
->fw_vif_idx
,
311 WMI_FRAME_ASSOC_REQ
, buf
, len
);
316 static int ath6kl_nliftype_to_drv_iftype(enum nl80211_iftype type
, u8
*nw_type
)
319 case NL80211_IFTYPE_STATION
:
320 *nw_type
= INFRA_NETWORK
;
322 case NL80211_IFTYPE_ADHOC
:
323 *nw_type
= ADHOC_NETWORK
;
325 case NL80211_IFTYPE_AP
:
326 *nw_type
= AP_NETWORK
;
328 case NL80211_IFTYPE_P2P_CLIENT
:
329 *nw_type
= INFRA_NETWORK
;
331 case NL80211_IFTYPE_P2P_GO
:
332 *nw_type
= AP_NETWORK
;
335 ath6kl_err("invalid interface type %u\n", type
);
342 static bool ath6kl_is_valid_iftype(struct ath6kl
*ar
, enum nl80211_iftype type
,
343 u8
*if_idx
, u8
*nw_type
)
347 if (ath6kl_nliftype_to_drv_iftype(type
, nw_type
))
350 if (ar
->ibss_if_active
|| ((type
== NL80211_IFTYPE_ADHOC
) &&
354 if (type
== NL80211_IFTYPE_STATION
||
355 type
== NL80211_IFTYPE_AP
|| type
== NL80211_IFTYPE_ADHOC
) {
356 for (i
= 0; i
< MAX_NUM_VIF
; i
++) {
357 if ((ar
->avail_idx_map
>> i
) & BIT(0)) {
364 if (type
== NL80211_IFTYPE_P2P_CLIENT
||
365 type
== NL80211_IFTYPE_P2P_GO
) {
366 for (i
= ar
->max_norm_iface
; i
< MAX_NUM_VIF
; i
++) {
367 if ((ar
->avail_idx_map
>> i
) & BIT(0)) {
377 static int ath6kl_cfg80211_connect(struct wiphy
*wiphy
, struct net_device
*dev
,
378 struct cfg80211_connect_params
*sme
)
380 struct ath6kl
*ar
= ath6kl_priv(dev
);
381 struct ath6kl_vif
*vif
= netdev_priv(dev
);
384 vif
->sme_state
= SME_CONNECTING
;
386 if (!ath6kl_cfg80211_ready(vif
))
389 if (test_bit(DESTROY_IN_PROGRESS
, &ar
->flag
)) {
390 ath6kl_err("destroy in progress\n");
394 if (test_bit(SKIP_SCAN
, &ar
->flag
) &&
395 ((sme
->channel
&& sme
->channel
->center_freq
== 0) ||
396 (sme
->bssid
&& is_zero_ether_addr(sme
->bssid
)))) {
397 ath6kl_err("SkipScan: channel or bssid invalid\n");
401 if (down_interruptible(&ar
->sem
)) {
402 ath6kl_err("busy, couldn't get access\n");
406 if (test_bit(DESTROY_IN_PROGRESS
, &ar
->flag
)) {
407 ath6kl_err("busy, destroy in progress\n");
412 if (ar
->tx_pending
[ath6kl_wmi_get_control_ep(ar
->wmi
)]) {
414 * sleep until the command queue drains
416 wait_event_interruptible_timeout(ar
->event_wq
,
417 ar
->tx_pending
[ath6kl_wmi_get_control_ep(ar
->wmi
)] == 0,
419 if (signal_pending(current
)) {
420 ath6kl_err("cmd queue drain timeout\n");
426 if (sme
->ie
&& (sme
->ie_len
> 0)) {
427 status
= ath6kl_set_assoc_req_ies(vif
, sme
->ie
, sme
->ie_len
);
432 if (test_bit(CONNECTED
, &vif
->flags
) &&
433 vif
->ssid_len
== sme
->ssid_len
&&
434 !memcmp(vif
->ssid
, sme
->ssid
, vif
->ssid_len
)) {
435 vif
->reconnect_flag
= true;
436 status
= ath6kl_wmi_reconnect_cmd(ar
->wmi
, vif
->fw_vif_idx
,
442 ath6kl_err("wmi_reconnect_cmd failed\n");
446 } else if (vif
->ssid_len
== sme
->ssid_len
&&
447 !memcmp(vif
->ssid
, sme
->ssid
, vif
->ssid_len
)) {
448 ath6kl_disconnect(vif
);
451 memset(vif
->ssid
, 0, sizeof(vif
->ssid
));
452 vif
->ssid_len
= sme
->ssid_len
;
453 memcpy(vif
->ssid
, sme
->ssid
, sme
->ssid_len
);
456 vif
->ch_hint
= sme
->channel
->center_freq
;
458 memset(vif
->req_bssid
, 0, sizeof(vif
->req_bssid
));
459 if (sme
->bssid
&& !is_broadcast_ether_addr(sme
->bssid
))
460 memcpy(vif
->req_bssid
, sme
->bssid
, sizeof(vif
->req_bssid
));
462 ath6kl_set_wpa_version(vif
, sme
->crypto
.wpa_versions
);
464 status
= ath6kl_set_auth_type(vif
, sme
->auth_type
);
470 if (sme
->crypto
.n_ciphers_pairwise
)
471 ath6kl_set_cipher(vif
, sme
->crypto
.ciphers_pairwise
[0], true);
473 ath6kl_set_cipher(vif
, 0, true);
475 ath6kl_set_cipher(vif
, sme
->crypto
.cipher_group
, false);
477 if (sme
->crypto
.n_akm_suites
)
478 ath6kl_set_key_mgmt(vif
, sme
->crypto
.akm_suites
[0]);
480 if ((sme
->key_len
) &&
481 (vif
->auth_mode
== NONE_AUTH
) &&
482 (vif
->prwise_crypto
== WEP_CRYPT
)) {
483 struct ath6kl_key
*key
= NULL
;
485 if (sme
->key_idx
< WMI_MIN_KEY_INDEX
||
486 sme
->key_idx
> WMI_MAX_KEY_INDEX
) {
487 ath6kl_err("key index %d out of bounds\n",
493 key
= &vif
->keys
[sme
->key_idx
];
494 key
->key_len
= sme
->key_len
;
495 memcpy(key
->key
, sme
->key
, key
->key_len
);
496 key
->cipher
= vif
->prwise_crypto
;
497 vif
->def_txkey_index
= sme
->key_idx
;
499 ath6kl_wmi_addkey_cmd(ar
->wmi
, vif
->fw_vif_idx
, sme
->key_idx
,
501 GROUP_USAGE
| TX_USAGE
,
504 key
->key
, KEY_OP_INIT_VAL
, NULL
,
508 if (!ar
->usr_bss_filter
) {
509 clear_bit(CLEAR_BSSFILTER_ON_BEACON
, &vif
->flags
);
510 if (ath6kl_wmi_bssfilter_cmd(ar
->wmi
, vif
->fw_vif_idx
,
511 ALL_BSS_FILTER
, 0) != 0) {
512 ath6kl_err("couldn't set bss filtering\n");
518 vif
->nw_type
= vif
->next_mode
;
520 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
521 "%s: connect called with authmode %d dot11 auth %d"
522 " PW crypto %d PW crypto len %d GRP crypto %d"
523 " GRP crypto len %d channel hint %u\n",
525 vif
->auth_mode
, vif
->dot11_auth_mode
, vif
->prwise_crypto
,
526 vif
->prwise_crypto_len
, vif
->grp_crypto
,
527 vif
->grp_crypto_len
, vif
->ch_hint
);
529 vif
->reconnect_flag
= 0;
530 status
= ath6kl_wmi_connect_cmd(ar
->wmi
, vif
->fw_vif_idx
, vif
->nw_type
,
531 vif
->dot11_auth_mode
, vif
->auth_mode
,
533 vif
->prwise_crypto_len
,
534 vif
->grp_crypto
, vif
->grp_crypto_len
,
535 vif
->ssid_len
, vif
->ssid
,
536 vif
->req_bssid
, vif
->ch_hint
,
537 ar
->connect_ctrl_flags
);
541 if (status
== -EINVAL
) {
542 memset(vif
->ssid
, 0, sizeof(vif
->ssid
));
544 ath6kl_err("invalid request\n");
547 ath6kl_err("ath6kl_wmi_connect_cmd failed\n");
551 if ((!(ar
->connect_ctrl_flags
& CONNECT_DO_WPA_OFFLOAD
)) &&
552 ((vif
->auth_mode
== WPA_PSK_AUTH
)
553 || (vif
->auth_mode
== WPA2_PSK_AUTH
))) {
554 mod_timer(&vif
->disconnect_timer
,
555 jiffies
+ msecs_to_jiffies(DISCON_TIMER_INTVAL
));
558 ar
->connect_ctrl_flags
&= ~CONNECT_DO_WPA_OFFLOAD
;
559 set_bit(CONNECT_PEND
, &vif
->flags
);
564 static int ath6kl_add_bss_if_needed(struct ath6kl_vif
*vif
, const u8
*bssid
,
565 struct ieee80211_channel
*chan
,
566 const u8
*beacon_ie
, size_t beacon_ie_len
)
568 struct ath6kl
*ar
= vif
->ar
;
569 struct cfg80211_bss
*bss
;
572 bss
= cfg80211_get_bss(ar
->wiphy
, chan
, bssid
,
573 vif
->ssid
, vif
->ssid_len
, WLAN_CAPABILITY_ESS
,
574 WLAN_CAPABILITY_ESS
);
577 * Since cfg80211 may not yet know about the BSS,
578 * generate a partial entry until the first BSS info
579 * event becomes available.
581 * Prepend SSID element since it is not included in the Beacon
582 * IEs from the target.
584 ie
= kmalloc(2 + vif
->ssid_len
+ beacon_ie_len
, GFP_KERNEL
);
587 ie
[0] = WLAN_EID_SSID
;
588 ie
[1] = vif
->ssid_len
;
589 memcpy(ie
+ 2, vif
->ssid
, vif
->ssid_len
);
590 memcpy(ie
+ 2 + vif
->ssid_len
, beacon_ie
, beacon_ie_len
);
591 bss
= cfg80211_inform_bss(ar
->wiphy
, chan
,
592 bssid
, 0, WLAN_CAPABILITY_ESS
, 100,
593 ie
, 2 + vif
->ssid_len
+ beacon_ie_len
,
596 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "added dummy bss for "
597 "%pM prior to indicating connect/roamed "
601 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "cfg80211 already has a bss "
607 cfg80211_put_bss(bss
);
612 void ath6kl_cfg80211_connect_event(struct ath6kl_vif
*vif
, u16 channel
,
613 u8
*bssid
, u16 listen_intvl
,
615 enum network_type nw_type
,
616 u8 beacon_ie_len
, u8 assoc_req_len
,
617 u8 assoc_resp_len
, u8
*assoc_info
)
619 struct ieee80211_channel
*chan
;
620 struct ath6kl
*ar
= vif
->ar
;
622 /* capinfo + listen interval */
623 u8 assoc_req_ie_offset
= sizeof(u16
) + sizeof(u16
);
625 /* capinfo + status code + associd */
626 u8 assoc_resp_ie_offset
= sizeof(u16
) + sizeof(u16
) + sizeof(u16
);
628 u8
*assoc_req_ie
= assoc_info
+ beacon_ie_len
+ assoc_req_ie_offset
;
629 u8
*assoc_resp_ie
= assoc_info
+ beacon_ie_len
+ assoc_req_len
+
630 assoc_resp_ie_offset
;
632 assoc_req_len
-= assoc_req_ie_offset
;
633 assoc_resp_len
-= assoc_resp_ie_offset
;
636 * Store Beacon interval here; DTIM period will be available only once
637 * a Beacon frame from the AP is seen.
639 vif
->assoc_bss_beacon_int
= beacon_intvl
;
640 clear_bit(DTIM_PERIOD_AVAIL
, &vif
->flags
);
642 if (nw_type
& ADHOC_NETWORK
) {
643 if (vif
->wdev
.iftype
!= NL80211_IFTYPE_ADHOC
) {
644 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
645 "%s: ath6k not in ibss mode\n", __func__
);
650 if (nw_type
& INFRA_NETWORK
) {
651 if (vif
->wdev
.iftype
!= NL80211_IFTYPE_STATION
&&
652 vif
->wdev
.iftype
!= NL80211_IFTYPE_P2P_CLIENT
) {
653 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
654 "%s: ath6k not in station mode\n", __func__
);
659 chan
= ieee80211_get_channel(ar
->wiphy
, (int) channel
);
662 if (nw_type
& ADHOC_NETWORK
) {
663 cfg80211_ibss_joined(vif
->ndev
, bssid
, GFP_KERNEL
);
667 if (ath6kl_add_bss_if_needed(vif
, bssid
, chan
, assoc_info
,
668 beacon_ie_len
) < 0) {
669 ath6kl_err("could not add cfg80211 bss entry for "
670 "connect/roamed notification\n");
674 if (vif
->sme_state
== SME_CONNECTING
) {
675 /* inform connect result to cfg80211 */
676 vif
->sme_state
= SME_CONNECTED
;
677 cfg80211_connect_result(vif
->ndev
, bssid
,
678 assoc_req_ie
, assoc_req_len
,
679 assoc_resp_ie
, assoc_resp_len
,
680 WLAN_STATUS_SUCCESS
, GFP_KERNEL
);
681 } else if (vif
->sme_state
== SME_CONNECTED
) {
682 /* inform roam event to cfg80211 */
683 cfg80211_roamed(vif
->ndev
, chan
, bssid
,
684 assoc_req_ie
, assoc_req_len
,
685 assoc_resp_ie
, assoc_resp_len
, GFP_KERNEL
);
689 static int ath6kl_cfg80211_disconnect(struct wiphy
*wiphy
,
690 struct net_device
*dev
, u16 reason_code
)
692 struct ath6kl
*ar
= (struct ath6kl
*)ath6kl_priv(dev
);
693 struct ath6kl_vif
*vif
= netdev_priv(dev
);
695 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: reason=%u\n", __func__
,
698 if (!ath6kl_cfg80211_ready(vif
))
701 if (test_bit(DESTROY_IN_PROGRESS
, &ar
->flag
)) {
702 ath6kl_err("busy, destroy in progress\n");
706 if (down_interruptible(&ar
->sem
)) {
707 ath6kl_err("busy, couldn't get access\n");
711 vif
->reconnect_flag
= 0;
712 ath6kl_disconnect(vif
);
713 memset(vif
->ssid
, 0, sizeof(vif
->ssid
));
716 if (!test_bit(SKIP_SCAN
, &ar
->flag
))
717 memset(vif
->req_bssid
, 0, sizeof(vif
->req_bssid
));
721 vif
->sme_state
= SME_DISCONNECTED
;
726 void ath6kl_cfg80211_disconnect_event(struct ath6kl_vif
*vif
, u8 reason
,
727 u8
*bssid
, u8 assoc_resp_len
,
728 u8
*assoc_info
, u16 proto_reason
)
730 struct ath6kl
*ar
= vif
->ar
;
733 cfg80211_scan_done(vif
->scan_req
, true);
734 vif
->scan_req
= NULL
;
737 if (vif
->nw_type
& ADHOC_NETWORK
) {
738 if (vif
->wdev
.iftype
!= NL80211_IFTYPE_ADHOC
) {
739 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
740 "%s: ath6k not in ibss mode\n", __func__
);
743 memset(bssid
, 0, ETH_ALEN
);
744 cfg80211_ibss_joined(vif
->ndev
, bssid
, GFP_KERNEL
);
748 if (vif
->nw_type
& INFRA_NETWORK
) {
749 if (vif
->wdev
.iftype
!= NL80211_IFTYPE_STATION
&&
750 vif
->wdev
.iftype
!= NL80211_IFTYPE_P2P_CLIENT
) {
751 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
752 "%s: ath6k not in station mode\n", __func__
);
758 * Send a disconnect command to target when a disconnect event is
759 * received with reason code other than 3 (DISCONNECT_CMD - disconnect
760 * request from host) to make the firmware stop trying to connect even
761 * after giving disconnect event. There will be one more disconnect
762 * event for this disconnect command with reason code DISCONNECT_CMD
763 * which will be notified to cfg80211.
766 if (reason
!= DISCONNECT_CMD
) {
767 ath6kl_wmi_disconnect_cmd(ar
->wmi
, vif
->fw_vif_idx
);
771 clear_bit(CONNECT_PEND
, &vif
->flags
);
773 if (vif
->sme_state
== SME_CONNECTING
) {
774 cfg80211_connect_result(vif
->ndev
,
777 WLAN_STATUS_UNSPECIFIED_FAILURE
,
779 } else if (vif
->sme_state
== SME_CONNECTED
) {
780 cfg80211_disconnected(vif
->ndev
, reason
,
781 NULL
, 0, GFP_KERNEL
);
784 vif
->sme_state
= SME_DISCONNECTED
;
787 static int ath6kl_cfg80211_scan(struct wiphy
*wiphy
, struct net_device
*ndev
,
788 struct cfg80211_scan_request
*request
)
790 struct ath6kl
*ar
= (struct ath6kl
*)ath6kl_priv(ndev
);
791 struct ath6kl_vif
*vif
= netdev_priv(ndev
);
793 u16
*channels
= NULL
;
795 u32 force_fg_scan
= 0;
797 if (!ath6kl_cfg80211_ready(vif
))
800 if (!ar
->usr_bss_filter
) {
801 clear_bit(CLEAR_BSSFILTER_ON_BEACON
, &vif
->flags
);
802 ret
= ath6kl_wmi_bssfilter_cmd(
803 ar
->wmi
, vif
->fw_vif_idx
,
804 (test_bit(CONNECTED
, &vif
->flags
) ?
805 ALL_BUT_BSS_FILTER
: ALL_BSS_FILTER
), 0);
807 ath6kl_err("couldn't set bss filtering\n");
812 if (request
->n_ssids
&& request
->ssids
[0].ssid_len
) {
815 if (request
->n_ssids
> (MAX_PROBED_SSID_INDEX
- 1))
816 request
->n_ssids
= MAX_PROBED_SSID_INDEX
- 1;
818 for (i
= 0; i
< request
->n_ssids
; i
++)
819 ath6kl_wmi_probedssid_cmd(ar
->wmi
, vif
->fw_vif_idx
,
820 i
+ 1, SPECIFIC_SSID_FLAG
,
821 request
->ssids
[i
].ssid_len
,
822 request
->ssids
[i
].ssid
);
826 ret
= ath6kl_wmi_set_appie_cmd(ar
->wmi
, vif
->fw_vif_idx
,
828 request
->ie
, request
->ie_len
);
830 ath6kl_err("failed to set Probe Request appie for "
837 * Scan only the requested channels if the request specifies a set of
838 * channels. If the list is longer than the target supports, do not
839 * configure the list and instead, scan all available channels.
841 if (request
->n_channels
> 0 &&
842 request
->n_channels
<= WMI_MAX_CHANNELS
) {
845 n_channels
= request
->n_channels
;
847 channels
= kzalloc(n_channels
* sizeof(u16
), GFP_KERNEL
);
848 if (channels
== NULL
) {
849 ath6kl_warn("failed to set scan channels, "
850 "scan all channels");
854 for (i
= 0; i
< n_channels
; i
++)
855 channels
[i
] = request
->channels
[i
]->center_freq
;
858 if (test_bit(CONNECTED
, &vif
->flags
))
861 ret
= ath6kl_wmi_startscan_cmd(ar
->wmi
, vif
->fw_vif_idx
, WMI_LONG_SCAN
,
862 force_fg_scan
, false, 0, 0, n_channels
,
865 ath6kl_err("wmi_startscan_cmd failed\n");
867 vif
->scan_req
= request
;
874 void ath6kl_cfg80211_scan_complete_event(struct ath6kl_vif
*vif
, bool aborted
)
876 struct ath6kl
*ar
= vif
->ar
;
879 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: status%s\n", __func__
,
880 aborted
? " aborted" : "");
888 if (vif
->scan_req
->n_ssids
&& vif
->scan_req
->ssids
[0].ssid_len
) {
889 for (i
= 0; i
< vif
->scan_req
->n_ssids
; i
++) {
890 ath6kl_wmi_probedssid_cmd(ar
->wmi
, vif
->fw_vif_idx
,
891 i
+ 1, DISABLE_SSID_FLAG
,
897 cfg80211_scan_done(vif
->scan_req
, aborted
);
898 vif
->scan_req
= NULL
;
901 static int ath6kl_cfg80211_add_key(struct wiphy
*wiphy
, struct net_device
*ndev
,
902 u8 key_index
, bool pairwise
,
904 struct key_params
*params
)
906 struct ath6kl
*ar
= (struct ath6kl
*)ath6kl_priv(ndev
);
907 struct ath6kl_vif
*vif
= netdev_priv(ndev
);
908 struct ath6kl_key
*key
= NULL
;
913 if (!ath6kl_cfg80211_ready(vif
))
916 if (params
->cipher
== CCKM_KRK_CIPHER_SUITE
) {
917 if (params
->key_len
!= WMI_KRK_LEN
)
919 return ath6kl_wmi_add_krk_cmd(ar
->wmi
, vif
->fw_vif_idx
,
923 if (key_index
< WMI_MIN_KEY_INDEX
|| key_index
> WMI_MAX_KEY_INDEX
) {
924 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
925 "%s: key index %d out of bounds\n", __func__
,
930 key
= &vif
->keys
[key_index
];
931 memset(key
, 0, sizeof(struct ath6kl_key
));
934 key_usage
= PAIRWISE_USAGE
;
936 key_usage
= GROUP_USAGE
;
939 if (params
->key_len
> WLAN_MAX_KEY_LEN
||
940 params
->seq_len
> sizeof(key
->seq
))
943 key
->key_len
= params
->key_len
;
944 memcpy(key
->key
, params
->key
, key
->key_len
);
945 key
->seq_len
= params
->seq_len
;
946 memcpy(key
->seq
, params
->seq
, key
->seq_len
);
947 key
->cipher
= params
->cipher
;
950 switch (key
->cipher
) {
951 case WLAN_CIPHER_SUITE_WEP40
:
952 case WLAN_CIPHER_SUITE_WEP104
:
953 key_type
= WEP_CRYPT
;
956 case WLAN_CIPHER_SUITE_TKIP
:
957 key_type
= TKIP_CRYPT
;
960 case WLAN_CIPHER_SUITE_CCMP
:
961 key_type
= AES_CRYPT
;
968 if (((vif
->auth_mode
== WPA_PSK_AUTH
)
969 || (vif
->auth_mode
== WPA2_PSK_AUTH
))
970 && (key_usage
& GROUP_USAGE
))
971 del_timer(&vif
->disconnect_timer
);
973 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
974 "%s: index %d, key_len %d, key_type 0x%x, key_usage 0x%x, seq_len %d\n",
975 __func__
, key_index
, key
->key_len
, key_type
,
976 key_usage
, key
->seq_len
);
978 vif
->def_txkey_index
= key_index
;
980 if (vif
->nw_type
== AP_NETWORK
&& !pairwise
&&
981 (key_type
== TKIP_CRYPT
|| key_type
== AES_CRYPT
) && params
) {
982 ar
->ap_mode_bkey
.valid
= true;
983 ar
->ap_mode_bkey
.key_index
= key_index
;
984 ar
->ap_mode_bkey
.key_type
= key_type
;
985 ar
->ap_mode_bkey
.key_len
= key
->key_len
;
986 memcpy(ar
->ap_mode_bkey
.key
, key
->key
, key
->key_len
);
987 if (!test_bit(CONNECTED
, &vif
->flags
)) {
988 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "Delay initial group "
989 "key configuration until AP mode has been "
992 * The key will be set in ath6kl_connect_ap_mode() once
993 * the connected event is received from the target.
999 if (vif
->next_mode
== AP_NETWORK
&& key_type
== WEP_CRYPT
&&
1000 !test_bit(CONNECTED
, &vif
->flags
)) {
1002 * Store the key locally so that it can be re-configured after
1003 * the AP mode has properly started
1004 * (ath6kl_install_statioc_wep_keys).
1006 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "Delay WEP key configuration "
1007 "until AP mode has been started\n");
1008 vif
->wep_key_list
[key_index
].key_len
= key
->key_len
;
1009 memcpy(vif
->wep_key_list
[key_index
].key
, key
->key
,
1014 status
= ath6kl_wmi_addkey_cmd(ar
->wmi
, vif
->fw_vif_idx
,
1015 vif
->def_txkey_index
,
1016 key_type
, key_usage
, key
->key_len
,
1017 key
->seq
, key
->seq_len
, key
->key
,
1019 (u8
*) mac_addr
, SYNC_BOTH_WMIFLAG
);
1027 static int ath6kl_cfg80211_del_key(struct wiphy
*wiphy
, struct net_device
*ndev
,
1028 u8 key_index
, bool pairwise
,
1031 struct ath6kl
*ar
= (struct ath6kl
*)ath6kl_priv(ndev
);
1032 struct ath6kl_vif
*vif
= netdev_priv(ndev
);
1034 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: index %d\n", __func__
, key_index
);
1036 if (!ath6kl_cfg80211_ready(vif
))
1039 if (key_index
< WMI_MIN_KEY_INDEX
|| key_index
> WMI_MAX_KEY_INDEX
) {
1040 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
1041 "%s: key index %d out of bounds\n", __func__
,
1046 if (!vif
->keys
[key_index
].key_len
) {
1047 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
1048 "%s: index %d is empty\n", __func__
, key_index
);
1052 vif
->keys
[key_index
].key_len
= 0;
1054 return ath6kl_wmi_deletekey_cmd(ar
->wmi
, vif
->fw_vif_idx
, key_index
);
1057 static int ath6kl_cfg80211_get_key(struct wiphy
*wiphy
, struct net_device
*ndev
,
1058 u8 key_index
, bool pairwise
,
1059 const u8
*mac_addr
, void *cookie
,
1060 void (*callback
) (void *cookie
,
1061 struct key_params
*))
1063 struct ath6kl_vif
*vif
= netdev_priv(ndev
);
1064 struct ath6kl_key
*key
= NULL
;
1065 struct key_params params
;
1067 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: index %d\n", __func__
, key_index
);
1069 if (!ath6kl_cfg80211_ready(vif
))
1072 if (key_index
< WMI_MIN_KEY_INDEX
|| key_index
> WMI_MAX_KEY_INDEX
) {
1073 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
1074 "%s: key index %d out of bounds\n", __func__
,
1079 key
= &vif
->keys
[key_index
];
1080 memset(¶ms
, 0, sizeof(params
));
1081 params
.cipher
= key
->cipher
;
1082 params
.key_len
= key
->key_len
;
1083 params
.seq_len
= key
->seq_len
;
1084 params
.seq
= key
->seq
;
1085 params
.key
= key
->key
;
1087 callback(cookie
, ¶ms
);
1089 return key
->key_len
? 0 : -ENOENT
;
1092 static int ath6kl_cfg80211_set_default_key(struct wiphy
*wiphy
,
1093 struct net_device
*ndev
,
1094 u8 key_index
, bool unicast
,
1097 struct ath6kl
*ar
= (struct ath6kl
*)ath6kl_priv(ndev
);
1098 struct ath6kl_vif
*vif
= netdev_priv(ndev
);
1099 struct ath6kl_key
*key
= NULL
;
1102 enum crypto_type key_type
= NONE_CRYPT
;
1104 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: index %d\n", __func__
, key_index
);
1106 if (!ath6kl_cfg80211_ready(vif
))
1109 if (key_index
< WMI_MIN_KEY_INDEX
|| key_index
> WMI_MAX_KEY_INDEX
) {
1110 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
1111 "%s: key index %d out of bounds\n",
1112 __func__
, key_index
);
1116 if (!vif
->keys
[key_index
].key_len
) {
1117 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: invalid key index %d\n",
1118 __func__
, key_index
);
1122 vif
->def_txkey_index
= key_index
;
1123 key
= &vif
->keys
[vif
->def_txkey_index
];
1124 key_usage
= GROUP_USAGE
;
1125 if (vif
->prwise_crypto
== WEP_CRYPT
)
1126 key_usage
|= TX_USAGE
;
1128 key_type
= vif
->prwise_crypto
;
1130 key_type
= vif
->grp_crypto
;
1132 if (vif
->next_mode
== AP_NETWORK
&& !test_bit(CONNECTED
, &vif
->flags
))
1133 return 0; /* Delay until AP mode has been started */
1135 status
= ath6kl_wmi_addkey_cmd(ar
->wmi
, vif
->fw_vif_idx
,
1136 vif
->def_txkey_index
,
1137 key_type
, key_usage
,
1138 key
->key_len
, key
->seq
, key
->seq_len
,
1140 KEY_OP_INIT_VAL
, NULL
,
1148 void ath6kl_cfg80211_tkip_micerr_event(struct ath6kl_vif
*vif
, u8 keyid
,
1151 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
1152 "%s: keyid %d, ismcast %d\n", __func__
, keyid
, ismcast
);
1154 cfg80211_michael_mic_failure(vif
->ndev
, vif
->bssid
,
1155 (ismcast
? NL80211_KEYTYPE_GROUP
:
1156 NL80211_KEYTYPE_PAIRWISE
), keyid
, NULL
,
1160 static int ath6kl_cfg80211_set_wiphy_params(struct wiphy
*wiphy
, u32 changed
)
1162 struct ath6kl
*ar
= (struct ath6kl
*)wiphy_priv(wiphy
);
1163 struct ath6kl_vif
*vif
;
1166 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: changed 0x%x\n", __func__
,
1169 vif
= ath6kl_vif_first(ar
);
1173 if (!ath6kl_cfg80211_ready(vif
))
1176 if (changed
& WIPHY_PARAM_RTS_THRESHOLD
) {
1177 ret
= ath6kl_wmi_set_rts_cmd(ar
->wmi
, wiphy
->rts_threshold
);
1179 ath6kl_err("ath6kl_wmi_set_rts_cmd failed\n");
1188 * The type nl80211_tx_power_setting replaces the following
1189 * data type from 2.6.36 onwards
1191 static int ath6kl_cfg80211_set_txpower(struct wiphy
*wiphy
,
1192 enum nl80211_tx_power_setting type
,
1195 struct ath6kl
*ar
= (struct ath6kl
*)wiphy_priv(wiphy
);
1196 struct ath6kl_vif
*vif
;
1199 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: type 0x%x, dbm %d\n", __func__
,
1202 vif
= ath6kl_vif_first(ar
);
1206 if (!ath6kl_cfg80211_ready(vif
))
1210 case NL80211_TX_POWER_AUTOMATIC
:
1212 case NL80211_TX_POWER_LIMITED
:
1213 ar
->tx_pwr
= ath6kl_dbm
= dbm
;
1216 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: type 0x%x not supported\n",
1221 ath6kl_wmi_set_tx_pwr_cmd(ar
->wmi
, vif
->fw_vif_idx
, ath6kl_dbm
);
1226 static int ath6kl_cfg80211_get_txpower(struct wiphy
*wiphy
, int *dbm
)
1228 struct ath6kl
*ar
= (struct ath6kl
*)wiphy_priv(wiphy
);
1229 struct ath6kl_vif
*vif
;
1231 vif
= ath6kl_vif_first(ar
);
1235 if (!ath6kl_cfg80211_ready(vif
))
1238 if (test_bit(CONNECTED
, &vif
->flags
)) {
1241 if (ath6kl_wmi_get_tx_pwr_cmd(ar
->wmi
, vif
->fw_vif_idx
) != 0) {
1242 ath6kl_err("ath6kl_wmi_get_tx_pwr_cmd failed\n");
1246 wait_event_interruptible_timeout(ar
->event_wq
, ar
->tx_pwr
!= 0,
1249 if (signal_pending(current
)) {
1250 ath6kl_err("target did not respond\n");
1259 static int ath6kl_cfg80211_set_power_mgmt(struct wiphy
*wiphy
,
1260 struct net_device
*dev
,
1261 bool pmgmt
, int timeout
)
1263 struct ath6kl
*ar
= ath6kl_priv(dev
);
1264 struct wmi_power_mode_cmd mode
;
1265 struct ath6kl_vif
*vif
= netdev_priv(dev
);
1267 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: pmgmt %d, timeout %d\n",
1268 __func__
, pmgmt
, timeout
);
1270 if (!ath6kl_cfg80211_ready(vif
))
1274 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: max perf\n", __func__
);
1275 mode
.pwr_mode
= REC_POWER
;
1277 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: rec power\n", __func__
);
1278 mode
.pwr_mode
= MAX_PERF_POWER
;
1281 if (ath6kl_wmi_powermode_cmd(ar
->wmi
, vif
->fw_vif_idx
,
1282 mode
.pwr_mode
) != 0) {
1283 ath6kl_err("wmi_powermode_cmd failed\n");
1290 static struct net_device
*ath6kl_cfg80211_add_iface(struct wiphy
*wiphy
,
1292 enum nl80211_iftype type
,
1294 struct vif_params
*params
)
1296 struct ath6kl
*ar
= wiphy_priv(wiphy
);
1297 struct net_device
*ndev
;
1300 if (ar
->num_vif
== MAX_NUM_VIF
) {
1301 ath6kl_err("Reached maximum number of supported vif\n");
1302 return ERR_PTR(-EINVAL
);
1305 if (!ath6kl_is_valid_iftype(ar
, type
, &if_idx
, &nw_type
)) {
1306 ath6kl_err("Not a supported interface type\n");
1307 return ERR_PTR(-EINVAL
);
1310 ndev
= ath6kl_interface_add(ar
, name
, type
, if_idx
, nw_type
);
1312 return ERR_PTR(-ENOMEM
);
1319 static int ath6kl_cfg80211_del_iface(struct wiphy
*wiphy
,
1320 struct net_device
*ndev
)
1322 struct ath6kl
*ar
= wiphy_priv(wiphy
);
1323 struct ath6kl_vif
*vif
= netdev_priv(ndev
);
1325 spin_lock_bh(&ar
->list_lock
);
1326 list_del(&vif
->list
);
1327 spin_unlock_bh(&ar
->list_lock
);
1329 ath6kl_cleanup_vif(vif
, test_bit(WMI_READY
, &ar
->flag
));
1331 ath6kl_deinit_if_data(vif
);
1336 static int ath6kl_cfg80211_change_iface(struct wiphy
*wiphy
,
1337 struct net_device
*ndev
,
1338 enum nl80211_iftype type
, u32
*flags
,
1339 struct vif_params
*params
)
1341 struct ath6kl_vif
*vif
= netdev_priv(ndev
);
1343 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: type %u\n", __func__
, type
);
1345 if (!ath6kl_cfg80211_ready(vif
))
1349 case NL80211_IFTYPE_STATION
:
1350 vif
->next_mode
= INFRA_NETWORK
;
1352 case NL80211_IFTYPE_ADHOC
:
1353 vif
->next_mode
= ADHOC_NETWORK
;
1355 case NL80211_IFTYPE_AP
:
1356 vif
->next_mode
= AP_NETWORK
;
1358 case NL80211_IFTYPE_P2P_CLIENT
:
1359 vif
->next_mode
= INFRA_NETWORK
;
1361 case NL80211_IFTYPE_P2P_GO
:
1362 vif
->next_mode
= AP_NETWORK
;
1365 ath6kl_err("invalid interface type %u\n", type
);
1369 vif
->wdev
.iftype
= type
;
1374 static int ath6kl_cfg80211_join_ibss(struct wiphy
*wiphy
,
1375 struct net_device
*dev
,
1376 struct cfg80211_ibss_params
*ibss_param
)
1378 struct ath6kl
*ar
= ath6kl_priv(dev
);
1379 struct ath6kl_vif
*vif
= netdev_priv(dev
);
1382 if (!ath6kl_cfg80211_ready(vif
))
1385 vif
->ssid_len
= ibss_param
->ssid_len
;
1386 memcpy(vif
->ssid
, ibss_param
->ssid
, vif
->ssid_len
);
1388 if (ibss_param
->channel
)
1389 vif
->ch_hint
= ibss_param
->channel
->center_freq
;
1391 if (ibss_param
->channel_fixed
) {
1393 * TODO: channel_fixed: The channel should be fixed, do not
1394 * search for IBSSs to join on other channels. Target
1395 * firmware does not support this feature, needs to be
1401 memset(vif
->req_bssid
, 0, sizeof(vif
->req_bssid
));
1402 if (ibss_param
->bssid
&& !is_broadcast_ether_addr(ibss_param
->bssid
))
1403 memcpy(vif
->req_bssid
, ibss_param
->bssid
,
1404 sizeof(vif
->req_bssid
));
1406 ath6kl_set_wpa_version(vif
, 0);
1408 status
= ath6kl_set_auth_type(vif
, NL80211_AUTHTYPE_OPEN_SYSTEM
);
1412 if (ibss_param
->privacy
) {
1413 ath6kl_set_cipher(vif
, WLAN_CIPHER_SUITE_WEP40
, true);
1414 ath6kl_set_cipher(vif
, WLAN_CIPHER_SUITE_WEP40
, false);
1416 ath6kl_set_cipher(vif
, 0, true);
1417 ath6kl_set_cipher(vif
, 0, false);
1420 vif
->nw_type
= vif
->next_mode
;
1422 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
1423 "%s: connect called with authmode %d dot11 auth %d"
1424 " PW crypto %d PW crypto len %d GRP crypto %d"
1425 " GRP crypto len %d channel hint %u\n",
1427 vif
->auth_mode
, vif
->dot11_auth_mode
, vif
->prwise_crypto
,
1428 vif
->prwise_crypto_len
, vif
->grp_crypto
,
1429 vif
->grp_crypto_len
, vif
->ch_hint
);
1431 status
= ath6kl_wmi_connect_cmd(ar
->wmi
, vif
->fw_vif_idx
, vif
->nw_type
,
1432 vif
->dot11_auth_mode
, vif
->auth_mode
,
1434 vif
->prwise_crypto_len
,
1435 vif
->grp_crypto
, vif
->grp_crypto_len
,
1436 vif
->ssid_len
, vif
->ssid
,
1437 vif
->req_bssid
, vif
->ch_hint
,
1438 ar
->connect_ctrl_flags
);
1439 set_bit(CONNECT_PEND
, &vif
->flags
);
1444 static int ath6kl_cfg80211_leave_ibss(struct wiphy
*wiphy
,
1445 struct net_device
*dev
)
1447 struct ath6kl_vif
*vif
= netdev_priv(dev
);
1449 if (!ath6kl_cfg80211_ready(vif
))
1452 ath6kl_disconnect(vif
);
1453 memset(vif
->ssid
, 0, sizeof(vif
->ssid
));
1459 static const u32 cipher_suites
[] = {
1460 WLAN_CIPHER_SUITE_WEP40
,
1461 WLAN_CIPHER_SUITE_WEP104
,
1462 WLAN_CIPHER_SUITE_TKIP
,
1463 WLAN_CIPHER_SUITE_CCMP
,
1464 CCKM_KRK_CIPHER_SUITE
,
1467 static bool is_rate_legacy(s32 rate
)
1469 static const s32 legacy
[] = { 1000, 2000, 5500, 11000,
1470 6000, 9000, 12000, 18000, 24000,
1475 for (i
= 0; i
< ARRAY_SIZE(legacy
); i
++)
1476 if (rate
== legacy
[i
])
1482 static bool is_rate_ht20(s32 rate
, u8
*mcs
, bool *sgi
)
1484 static const s32 ht20
[] = { 6500, 13000, 19500, 26000, 39000,
1485 52000, 58500, 65000, 72200
1489 for (i
= 0; i
< ARRAY_SIZE(ht20
); i
++) {
1490 if (rate
== ht20
[i
]) {
1491 if (i
== ARRAY_SIZE(ht20
) - 1)
1492 /* last rate uses sgi */
1504 static bool is_rate_ht40(s32 rate
, u8
*mcs
, bool *sgi
)
1506 static const s32 ht40
[] = { 13500, 27000, 40500, 54000,
1507 81000, 108000, 121500, 135000,
1512 for (i
= 0; i
< ARRAY_SIZE(ht40
); i
++) {
1513 if (rate
== ht40
[i
]) {
1514 if (i
== ARRAY_SIZE(ht40
) - 1)
1515 /* last rate uses sgi */
1528 static int ath6kl_get_station(struct wiphy
*wiphy
, struct net_device
*dev
,
1529 u8
*mac
, struct station_info
*sinfo
)
1531 struct ath6kl
*ar
= ath6kl_priv(dev
);
1532 struct ath6kl_vif
*vif
= netdev_priv(dev
);
1539 if (memcmp(mac
, vif
->bssid
, ETH_ALEN
) != 0)
1542 if (down_interruptible(&ar
->sem
))
1545 set_bit(STATS_UPDATE_PEND
, &vif
->flags
);
1547 ret
= ath6kl_wmi_get_stats_cmd(ar
->wmi
, vif
->fw_vif_idx
);
1554 left
= wait_event_interruptible_timeout(ar
->event_wq
,
1555 !test_bit(STATS_UPDATE_PEND
,
1566 if (vif
->target_stats
.rx_byte
) {
1567 sinfo
->rx_bytes
= vif
->target_stats
.rx_byte
;
1568 sinfo
->filled
|= STATION_INFO_RX_BYTES
;
1569 sinfo
->rx_packets
= vif
->target_stats
.rx_pkt
;
1570 sinfo
->filled
|= STATION_INFO_RX_PACKETS
;
1573 if (vif
->target_stats
.tx_byte
) {
1574 sinfo
->tx_bytes
= vif
->target_stats
.tx_byte
;
1575 sinfo
->filled
|= STATION_INFO_TX_BYTES
;
1576 sinfo
->tx_packets
= vif
->target_stats
.tx_pkt
;
1577 sinfo
->filled
|= STATION_INFO_TX_PACKETS
;
1580 sinfo
->signal
= vif
->target_stats
.cs_rssi
;
1581 sinfo
->filled
|= STATION_INFO_SIGNAL
;
1583 rate
= vif
->target_stats
.tx_ucast_rate
;
1585 if (is_rate_legacy(rate
)) {
1586 sinfo
->txrate
.legacy
= rate
/ 100;
1587 } else if (is_rate_ht20(rate
, &mcs
, &sgi
)) {
1589 sinfo
->txrate
.flags
|= RATE_INFO_FLAGS_SHORT_GI
;
1590 sinfo
->txrate
.mcs
= mcs
- 1;
1592 sinfo
->txrate
.mcs
= mcs
;
1595 sinfo
->txrate
.flags
|= RATE_INFO_FLAGS_MCS
;
1596 } else if (is_rate_ht40(rate
, &mcs
, &sgi
)) {
1598 sinfo
->txrate
.flags
|= RATE_INFO_FLAGS_SHORT_GI
;
1599 sinfo
->txrate
.mcs
= mcs
- 1;
1601 sinfo
->txrate
.mcs
= mcs
;
1604 sinfo
->txrate
.flags
|= RATE_INFO_FLAGS_40_MHZ_WIDTH
;
1605 sinfo
->txrate
.flags
|= RATE_INFO_FLAGS_MCS
;
1607 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
,
1608 "invalid rate from stats: %d\n", rate
);
1609 ath6kl_debug_war(ar
, ATH6KL_WAR_INVALID_RATE
);
1613 sinfo
->filled
|= STATION_INFO_TX_BITRATE
;
1615 if (test_bit(CONNECTED
, &vif
->flags
) &&
1616 test_bit(DTIM_PERIOD_AVAIL
, &vif
->flags
) &&
1617 vif
->nw_type
== INFRA_NETWORK
) {
1618 sinfo
->filled
|= STATION_INFO_BSS_PARAM
;
1619 sinfo
->bss_param
.flags
= 0;
1620 sinfo
->bss_param
.dtim_period
= vif
->assoc_bss_dtim_period
;
1621 sinfo
->bss_param
.beacon_interval
= vif
->assoc_bss_beacon_int
;
1627 static int ath6kl_set_pmksa(struct wiphy
*wiphy
, struct net_device
*netdev
,
1628 struct cfg80211_pmksa
*pmksa
)
1630 struct ath6kl
*ar
= ath6kl_priv(netdev
);
1631 struct ath6kl_vif
*vif
= netdev_priv(netdev
);
1633 return ath6kl_wmi_setpmkid_cmd(ar
->wmi
, vif
->fw_vif_idx
, pmksa
->bssid
,
1634 pmksa
->pmkid
, true);
1637 static int ath6kl_del_pmksa(struct wiphy
*wiphy
, struct net_device
*netdev
,
1638 struct cfg80211_pmksa
*pmksa
)
1640 struct ath6kl
*ar
= ath6kl_priv(netdev
);
1641 struct ath6kl_vif
*vif
= netdev_priv(netdev
);
1643 return ath6kl_wmi_setpmkid_cmd(ar
->wmi
, vif
->fw_vif_idx
, pmksa
->bssid
,
1644 pmksa
->pmkid
, false);
1647 static int ath6kl_flush_pmksa(struct wiphy
*wiphy
, struct net_device
*netdev
)
1649 struct ath6kl
*ar
= ath6kl_priv(netdev
);
1650 struct ath6kl_vif
*vif
= netdev_priv(netdev
);
1652 if (test_bit(CONNECTED
, &vif
->flags
))
1653 return ath6kl_wmi_setpmkid_cmd(ar
->wmi
, vif
->fw_vif_idx
,
1654 vif
->bssid
, NULL
, false);
1658 int ath6kl_cfg80211_suspend(struct ath6kl
*ar
,
1659 enum ath6kl_cfg_suspend_mode mode
)
1663 ath6kl_cfg80211_stop(ar
);
1666 case ATH6KL_CFG_SUSPEND_DEEPSLEEP
:
1667 /* save the current power mode before enabling power save */
1668 ar
->wmi
->saved_pwr_mode
= ar
->wmi
->pwr_mode
;
1670 ret
= ath6kl_wmi_powermode_cmd(ar
->wmi
, 0, REC_POWER
);
1672 ath6kl_warn("wmi powermode command failed during suspend: %d\n",
1676 ar
->state
= ATH6KL_STATE_DEEPSLEEP
;
1680 case ATH6KL_CFG_SUSPEND_CUTPOWER
:
1681 if (ar
->state
== ATH6KL_STATE_OFF
) {
1682 ath6kl_dbg(ATH6KL_DBG_SUSPEND
,
1683 "suspend hw off, no action for cutpower\n");
1687 ath6kl_dbg(ATH6KL_DBG_SUSPEND
, "suspend cutting power\n");
1689 ret
= ath6kl_init_hw_stop(ar
);
1691 ath6kl_warn("failed to stop hw during suspend: %d\n",
1695 ar
->state
= ATH6KL_STATE_CUTPOWER
;
1706 int ath6kl_cfg80211_resume(struct ath6kl
*ar
)
1710 switch (ar
->state
) {
1711 case ATH6KL_STATE_DEEPSLEEP
:
1712 if (ar
->wmi
->pwr_mode
!= ar
->wmi
->saved_pwr_mode
) {
1713 ret
= ath6kl_wmi_powermode_cmd(ar
->wmi
, 0,
1714 ar
->wmi
->saved_pwr_mode
);
1716 ath6kl_warn("wmi powermode command failed during resume: %d\n",
1721 ar
->state
= ATH6KL_STATE_ON
;
1725 case ATH6KL_STATE_CUTPOWER
:
1726 ath6kl_dbg(ATH6KL_DBG_SUSPEND
, "resume restoring power\n");
1728 ret
= ath6kl_init_hw_start(ar
);
1730 ath6kl_warn("Failed to boot hw in resume: %d\n", ret
);
1743 /* hif layer decides what suspend mode to use */
1744 static int __ath6kl_cfg80211_suspend(struct wiphy
*wiphy
,
1745 struct cfg80211_wowlan
*wow
)
1747 struct ath6kl
*ar
= wiphy_priv(wiphy
);
1749 return ath6kl_hif_suspend(ar
);
1752 static int __ath6kl_cfg80211_resume(struct wiphy
*wiphy
)
1754 struct ath6kl
*ar
= wiphy_priv(wiphy
);
1756 return ath6kl_hif_resume(ar
);
1760 static int ath6kl_set_channel(struct wiphy
*wiphy
, struct net_device
*dev
,
1761 struct ieee80211_channel
*chan
,
1762 enum nl80211_channel_type channel_type
)
1764 struct ath6kl_vif
*vif
= netdev_priv(dev
);
1766 if (!ath6kl_cfg80211_ready(vif
))
1769 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: center_freq=%u hw_value=%u\n",
1770 __func__
, chan
->center_freq
, chan
->hw_value
);
1771 vif
->next_chan
= chan
->center_freq
;
1776 static bool ath6kl_is_p2p_ie(const u8
*pos
)
1778 return pos
[0] == WLAN_EID_VENDOR_SPECIFIC
&& pos
[1] >= 4 &&
1779 pos
[2] == 0x50 && pos
[3] == 0x6f &&
1780 pos
[4] == 0x9a && pos
[5] == 0x09;
1783 static int ath6kl_set_ap_probe_resp_ies(struct ath6kl_vif
*vif
,
1784 const u8
*ies
, size_t ies_len
)
1786 struct ath6kl
*ar
= vif
->ar
;
1793 * Filter out P2P IE(s) since they will be included depending on
1794 * the Probe Request frame in ath6kl_send_go_probe_resp().
1797 if (ies
&& ies_len
) {
1798 buf
= kmalloc(ies_len
, GFP_KERNEL
);
1802 while (pos
+ 1 < ies
+ ies_len
) {
1803 if (pos
+ 2 + pos
[1] > ies
+ ies_len
)
1805 if (!ath6kl_is_p2p_ie(pos
)) {
1806 memcpy(buf
+ len
, pos
, 2 + pos
[1]);
1813 ret
= ath6kl_wmi_set_appie_cmd(ar
->wmi
, vif
->fw_vif_idx
,
1814 WMI_FRAME_PROBE_RESP
, buf
, len
);
1819 static int ath6kl_ap_beacon(struct wiphy
*wiphy
, struct net_device
*dev
,
1820 struct beacon_parameters
*info
, bool add
)
1822 struct ath6kl
*ar
= ath6kl_priv(dev
);
1823 struct ath6kl_vif
*vif
= netdev_priv(dev
);
1824 struct ieee80211_mgmt
*mgmt
;
1827 struct wmi_connect_cmd p
;
1831 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: add=%d\n", __func__
, add
);
1833 if (!ath6kl_cfg80211_ready(vif
))
1836 if (vif
->next_mode
!= AP_NETWORK
)
1839 if (info
->beacon_ies
) {
1840 res
= ath6kl_wmi_set_appie_cmd(ar
->wmi
, vif
->fw_vif_idx
,
1843 info
->beacon_ies_len
);
1847 if (info
->proberesp_ies
) {
1848 res
= ath6kl_set_ap_probe_resp_ies(vif
, info
->proberesp_ies
,
1849 info
->proberesp_ies_len
);
1853 if (info
->assocresp_ies
) {
1854 res
= ath6kl_wmi_set_appie_cmd(ar
->wmi
, vif
->fw_vif_idx
,
1855 WMI_FRAME_ASSOC_RESP
,
1856 info
->assocresp_ies
,
1857 info
->assocresp_ies_len
);
1865 ar
->ap_mode_bkey
.valid
= false;
1872 if (info
->head
== NULL
)
1874 mgmt
= (struct ieee80211_mgmt
*) info
->head
;
1875 ies
= mgmt
->u
.beacon
.variable
;
1876 if (ies
> info
->head
+ info
->head_len
)
1878 ies_len
= info
->head
+ info
->head_len
- ies
;
1880 if (info
->ssid
== NULL
)
1882 memcpy(vif
->ssid
, info
->ssid
, info
->ssid_len
);
1883 vif
->ssid_len
= info
->ssid_len
;
1884 if (info
->hidden_ssid
!= NL80211_HIDDEN_SSID_NOT_IN_USE
)
1885 return -EOPNOTSUPP
; /* TODO */
1887 vif
->dot11_auth_mode
= OPEN_AUTH
;
1889 memset(&p
, 0, sizeof(p
));
1891 for (i
= 0; i
< info
->crypto
.n_akm_suites
; i
++) {
1892 switch (info
->crypto
.akm_suites
[i
]) {
1893 case WLAN_AKM_SUITE_8021X
:
1894 if (info
->crypto
.wpa_versions
& NL80211_WPA_VERSION_1
)
1895 p
.auth_mode
|= WPA_AUTH
;
1896 if (info
->crypto
.wpa_versions
& NL80211_WPA_VERSION_2
)
1897 p
.auth_mode
|= WPA2_AUTH
;
1899 case WLAN_AKM_SUITE_PSK
:
1900 if (info
->crypto
.wpa_versions
& NL80211_WPA_VERSION_1
)
1901 p
.auth_mode
|= WPA_PSK_AUTH
;
1902 if (info
->crypto
.wpa_versions
& NL80211_WPA_VERSION_2
)
1903 p
.auth_mode
|= WPA2_PSK_AUTH
;
1907 if (p
.auth_mode
== 0)
1908 p
.auth_mode
= NONE_AUTH
;
1909 vif
->auth_mode
= p
.auth_mode
;
1911 for (i
= 0; i
< info
->crypto
.n_ciphers_pairwise
; i
++) {
1912 switch (info
->crypto
.ciphers_pairwise
[i
]) {
1913 case WLAN_CIPHER_SUITE_WEP40
:
1914 case WLAN_CIPHER_SUITE_WEP104
:
1915 p
.prwise_crypto_type
|= WEP_CRYPT
;
1917 case WLAN_CIPHER_SUITE_TKIP
:
1918 p
.prwise_crypto_type
|= TKIP_CRYPT
;
1920 case WLAN_CIPHER_SUITE_CCMP
:
1921 p
.prwise_crypto_type
|= AES_CRYPT
;
1925 if (p
.prwise_crypto_type
== 0) {
1926 p
.prwise_crypto_type
= NONE_CRYPT
;
1927 ath6kl_set_cipher(vif
, 0, true);
1928 } else if (info
->crypto
.n_ciphers_pairwise
== 1)
1929 ath6kl_set_cipher(vif
, info
->crypto
.ciphers_pairwise
[0], true);
1931 switch (info
->crypto
.cipher_group
) {
1932 case WLAN_CIPHER_SUITE_WEP40
:
1933 case WLAN_CIPHER_SUITE_WEP104
:
1934 p
.grp_crypto_type
= WEP_CRYPT
;
1936 case WLAN_CIPHER_SUITE_TKIP
:
1937 p
.grp_crypto_type
= TKIP_CRYPT
;
1939 case WLAN_CIPHER_SUITE_CCMP
:
1940 p
.grp_crypto_type
= AES_CRYPT
;
1943 p
.grp_crypto_type
= NONE_CRYPT
;
1946 ath6kl_set_cipher(vif
, info
->crypto
.cipher_group
, false);
1948 p
.nw_type
= AP_NETWORK
;
1949 vif
->nw_type
= vif
->next_mode
;
1951 p
.ssid_len
= vif
->ssid_len
;
1952 memcpy(p
.ssid
, vif
->ssid
, vif
->ssid_len
);
1953 p
.dot11_auth_mode
= vif
->dot11_auth_mode
;
1954 p
.ch
= cpu_to_le16(vif
->next_chan
);
1956 res
= ath6kl_wmi_ap_profile_commit(ar
->wmi
, vif
->fw_vif_idx
, &p
);
1963 static int ath6kl_add_beacon(struct wiphy
*wiphy
, struct net_device
*dev
,
1964 struct beacon_parameters
*info
)
1966 return ath6kl_ap_beacon(wiphy
, dev
, info
, true);
1969 static int ath6kl_set_beacon(struct wiphy
*wiphy
, struct net_device
*dev
,
1970 struct beacon_parameters
*info
)
1972 return ath6kl_ap_beacon(wiphy
, dev
, info
, false);
1975 static int ath6kl_del_beacon(struct wiphy
*wiphy
, struct net_device
*dev
)
1977 struct ath6kl
*ar
= ath6kl_priv(dev
);
1978 struct ath6kl_vif
*vif
= netdev_priv(dev
);
1980 if (vif
->nw_type
!= AP_NETWORK
)
1982 if (!test_bit(CONNECTED
, &vif
->flags
))
1985 ath6kl_wmi_disconnect_cmd(ar
->wmi
, vif
->fw_vif_idx
);
1986 clear_bit(CONNECTED
, &vif
->flags
);
1991 static int ath6kl_change_station(struct wiphy
*wiphy
, struct net_device
*dev
,
1992 u8
*mac
, struct station_parameters
*params
)
1994 struct ath6kl
*ar
= ath6kl_priv(dev
);
1995 struct ath6kl_vif
*vif
= netdev_priv(dev
);
1997 if (vif
->nw_type
!= AP_NETWORK
)
2000 /* Use this only for authorizing/unauthorizing a station */
2001 if (!(params
->sta_flags_mask
& BIT(NL80211_STA_FLAG_AUTHORIZED
)))
2004 if (params
->sta_flags_set
& BIT(NL80211_STA_FLAG_AUTHORIZED
))
2005 return ath6kl_wmi_ap_set_mlme(ar
->wmi
, vif
->fw_vif_idx
,
2006 WMI_AP_MLME_AUTHORIZE
, mac
, 0);
2007 return ath6kl_wmi_ap_set_mlme(ar
->wmi
, vif
->fw_vif_idx
,
2008 WMI_AP_MLME_UNAUTHORIZE
, mac
, 0);
2011 static int ath6kl_remain_on_channel(struct wiphy
*wiphy
,
2012 struct net_device
*dev
,
2013 struct ieee80211_channel
*chan
,
2014 enum nl80211_channel_type channel_type
,
2015 unsigned int duration
,
2018 struct ath6kl
*ar
= ath6kl_priv(dev
);
2019 struct ath6kl_vif
*vif
= netdev_priv(dev
);
2022 /* TODO: if already pending or ongoing remain-on-channel,
2024 id
= ++vif
->last_roc_id
;
2026 /* Do not use 0 as the cookie value */
2027 id
= ++vif
->last_roc_id
;
2031 return ath6kl_wmi_remain_on_chnl_cmd(ar
->wmi
, vif
->fw_vif_idx
,
2032 chan
->center_freq
, duration
);
2035 static int ath6kl_cancel_remain_on_channel(struct wiphy
*wiphy
,
2036 struct net_device
*dev
,
2039 struct ath6kl
*ar
= ath6kl_priv(dev
);
2040 struct ath6kl_vif
*vif
= netdev_priv(dev
);
2042 if (cookie
!= vif
->last_roc_id
)
2044 vif
->last_cancel_roc_id
= cookie
;
2046 return ath6kl_wmi_cancel_remain_on_chnl_cmd(ar
->wmi
, vif
->fw_vif_idx
);
2049 static int ath6kl_send_go_probe_resp(struct ath6kl_vif
*vif
,
2050 const u8
*buf
, size_t len
,
2053 struct ath6kl
*ar
= vif
->ar
;
2058 const struct ieee80211_mgmt
*mgmt
;
2060 mgmt
= (const struct ieee80211_mgmt
*) buf
;
2062 /* Include P2P IE(s) from the frame generated in user space. */
2064 p2p
= kmalloc(len
, GFP_KERNEL
);
2069 pos
= mgmt
->u
.probe_resp
.variable
;
2070 while (pos
+ 1 < buf
+ len
) {
2071 if (pos
+ 2 + pos
[1] > buf
+ len
)
2073 if (ath6kl_is_p2p_ie(pos
)) {
2074 memcpy(p2p
+ p2p_len
, pos
, 2 + pos
[1]);
2075 p2p_len
+= 2 + pos
[1];
2080 ret
= ath6kl_wmi_send_probe_response_cmd(ar
->wmi
, vif
->fw_vif_idx
, freq
,
2081 mgmt
->da
, p2p
, p2p_len
);
2086 static int ath6kl_mgmt_tx(struct wiphy
*wiphy
, struct net_device
*dev
,
2087 struct ieee80211_channel
*chan
, bool offchan
,
2088 enum nl80211_channel_type channel_type
,
2089 bool channel_type_valid
, unsigned int wait
,
2090 const u8
*buf
, size_t len
, bool no_cck
,
2091 bool dont_wait_for_ack
, u64
*cookie
)
2093 struct ath6kl
*ar
= ath6kl_priv(dev
);
2094 struct ath6kl_vif
*vif
= netdev_priv(dev
);
2096 const struct ieee80211_mgmt
*mgmt
;
2098 mgmt
= (const struct ieee80211_mgmt
*) buf
;
2099 if (buf
+ len
>= mgmt
->u
.probe_resp
.variable
&&
2100 vif
->nw_type
== AP_NETWORK
&& test_bit(CONNECTED
, &vif
->flags
) &&
2101 ieee80211_is_probe_resp(mgmt
->frame_control
)) {
2103 * Send Probe Response frame in AP mode using a separate WMI
2104 * command to allow the target to fill in the generic IEs.
2106 *cookie
= 0; /* TX status not supported */
2107 return ath6kl_send_go_probe_resp(vif
, buf
, len
,
2111 id
= vif
->send_action_id
++;
2114 * 0 is a reserved value in the WMI command and shall not be
2115 * used for the command.
2117 id
= vif
->send_action_id
++;
2121 return ath6kl_wmi_send_action_cmd(ar
->wmi
, vif
->fw_vif_idx
, id
,
2122 chan
->center_freq
, wait
,
2126 static void ath6kl_mgmt_frame_register(struct wiphy
*wiphy
,
2127 struct net_device
*dev
,
2128 u16 frame_type
, bool reg
)
2130 struct ath6kl_vif
*vif
= netdev_priv(dev
);
2132 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG
, "%s: frame_type=0x%x reg=%d\n",
2133 __func__
, frame_type
, reg
);
2134 if (frame_type
== IEEE80211_STYPE_PROBE_REQ
) {
2136 * Note: This notification callback is not allowed to sleep, so
2137 * we cannot send WMI_PROBE_REQ_REPORT_CMD here. Instead, we
2138 * hardcode target to report Probe Request frames all the time.
2140 vif
->probe_req_report
= reg
;
2144 static const struct ieee80211_txrx_stypes
2145 ath6kl_mgmt_stypes
[NUM_NL80211_IFTYPES
] = {
2146 [NL80211_IFTYPE_STATION
] = {
2147 .tx
= BIT(IEEE80211_STYPE_ACTION
>> 4) |
2148 BIT(IEEE80211_STYPE_PROBE_RESP
>> 4),
2149 .rx
= BIT(IEEE80211_STYPE_ACTION
>> 4) |
2150 BIT(IEEE80211_STYPE_PROBE_REQ
>> 4)
2152 [NL80211_IFTYPE_P2P_CLIENT
] = {
2153 .tx
= BIT(IEEE80211_STYPE_ACTION
>> 4) |
2154 BIT(IEEE80211_STYPE_PROBE_RESP
>> 4),
2155 .rx
= BIT(IEEE80211_STYPE_ACTION
>> 4) |
2156 BIT(IEEE80211_STYPE_PROBE_REQ
>> 4)
2158 [NL80211_IFTYPE_P2P_GO
] = {
2159 .tx
= BIT(IEEE80211_STYPE_ACTION
>> 4) |
2160 BIT(IEEE80211_STYPE_PROBE_RESP
>> 4),
2161 .rx
= BIT(IEEE80211_STYPE_ACTION
>> 4) |
2162 BIT(IEEE80211_STYPE_PROBE_REQ
>> 4)
2166 static struct cfg80211_ops ath6kl_cfg80211_ops
= {
2167 .add_virtual_intf
= ath6kl_cfg80211_add_iface
,
2168 .del_virtual_intf
= ath6kl_cfg80211_del_iface
,
2169 .change_virtual_intf
= ath6kl_cfg80211_change_iface
,
2170 .scan
= ath6kl_cfg80211_scan
,
2171 .connect
= ath6kl_cfg80211_connect
,
2172 .disconnect
= ath6kl_cfg80211_disconnect
,
2173 .add_key
= ath6kl_cfg80211_add_key
,
2174 .get_key
= ath6kl_cfg80211_get_key
,
2175 .del_key
= ath6kl_cfg80211_del_key
,
2176 .set_default_key
= ath6kl_cfg80211_set_default_key
,
2177 .set_wiphy_params
= ath6kl_cfg80211_set_wiphy_params
,
2178 .set_tx_power
= ath6kl_cfg80211_set_txpower
,
2179 .get_tx_power
= ath6kl_cfg80211_get_txpower
,
2180 .set_power_mgmt
= ath6kl_cfg80211_set_power_mgmt
,
2181 .join_ibss
= ath6kl_cfg80211_join_ibss
,
2182 .leave_ibss
= ath6kl_cfg80211_leave_ibss
,
2183 .get_station
= ath6kl_get_station
,
2184 .set_pmksa
= ath6kl_set_pmksa
,
2185 .del_pmksa
= ath6kl_del_pmksa
,
2186 .flush_pmksa
= ath6kl_flush_pmksa
,
2187 CFG80211_TESTMODE_CMD(ath6kl_tm_cmd
)
2189 .suspend
= __ath6kl_cfg80211_suspend
,
2190 .resume
= __ath6kl_cfg80211_resume
,
2192 .set_channel
= ath6kl_set_channel
,
2193 .add_beacon
= ath6kl_add_beacon
,
2194 .set_beacon
= ath6kl_set_beacon
,
2195 .del_beacon
= ath6kl_del_beacon
,
2196 .change_station
= ath6kl_change_station
,
2197 .remain_on_channel
= ath6kl_remain_on_channel
,
2198 .cancel_remain_on_channel
= ath6kl_cancel_remain_on_channel
,
2199 .mgmt_tx
= ath6kl_mgmt_tx
,
2200 .mgmt_frame_register
= ath6kl_mgmt_frame_register
,
2203 void ath6kl_cfg80211_stop(struct ath6kl
*ar
)
2205 struct ath6kl_vif
*vif
;
2207 /* FIXME: for multi vif */
2208 vif
= ath6kl_vif_first(ar
);
2210 /* save the current power mode before enabling power save */
2211 ar
->wmi
->saved_pwr_mode
= ar
->wmi
->pwr_mode
;
2213 if (ath6kl_wmi_powermode_cmd(ar
->wmi
, 0, REC_POWER
) != 0)
2214 ath6kl_warn("ath6kl_deep_sleep_enable: "
2215 "wmi_powermode_cmd failed\n");
2219 switch (vif
->sme_state
) {
2220 case SME_CONNECTING
:
2221 cfg80211_connect_result(vif
->ndev
, vif
->bssid
, NULL
, 0,
2223 WLAN_STATUS_UNSPECIFIED_FAILURE
,
2229 * FIXME: oddly enough smeState is in DISCONNECTED during
2230 * suspend, why? Need to send disconnected event in that
2233 cfg80211_disconnected(vif
->ndev
, 0, NULL
, 0, GFP_KERNEL
);
2237 if (test_bit(CONNECTED
, &vif
->flags
) ||
2238 test_bit(CONNECT_PEND
, &vif
->flags
))
2239 ath6kl_wmi_disconnect_cmd(ar
->wmi
, vif
->fw_vif_idx
);
2241 vif
->sme_state
= SME_DISCONNECTED
;
2242 clear_bit(CONNECTED
, &vif
->flags
);
2243 clear_bit(CONNECT_PEND
, &vif
->flags
);
2245 /* disable scanning */
2246 if (ath6kl_wmi_scanparams_cmd(ar
->wmi
, vif
->fw_vif_idx
, 0xFFFF, 0, 0,
2247 0, 0, 0, 0, 0, 0, 0) != 0)
2248 printk(KERN_WARNING
"ath6kl: failed to disable scan "
2249 "during suspend\n");
2251 ath6kl_cfg80211_scan_complete_event(vif
, true);
2254 struct ath6kl
*ath6kl_core_alloc(struct device
*dev
)
2257 struct wiphy
*wiphy
;
2260 /* create a new wiphy for use with cfg80211 */
2261 wiphy
= wiphy_new(&ath6kl_cfg80211_ops
, sizeof(struct ath6kl
));
2264 ath6kl_err("couldn't allocate wiphy device\n");
2268 ar
= wiphy_priv(wiphy
);
2269 if (!multi_norm_if_support
)
2270 ar
->p2p
= !!ath6kl_p2p
;
2274 if (multi_norm_if_support
)
2275 ar
->max_norm_iface
= 2;
2277 ar
->max_norm_iface
= 1;
2279 /* FIXME: Remove this once the multivif support is enabled */
2280 ar
->max_norm_iface
= 1;
2282 spin_lock_init(&ar
->lock
);
2283 spin_lock_init(&ar
->mcastpsq_lock
);
2284 spin_lock_init(&ar
->list_lock
);
2286 init_waitqueue_head(&ar
->event_wq
);
2287 sema_init(&ar
->sem
, 1);
2289 INIT_LIST_HEAD(&ar
->amsdu_rx_buffer_queue
);
2290 INIT_LIST_HEAD(&ar
->vif_list
);
2292 clear_bit(WMI_ENABLED
, &ar
->flag
);
2293 clear_bit(SKIP_SCAN
, &ar
->flag
);
2294 clear_bit(DESTROY_IN_PROGRESS
, &ar
->flag
);
2296 ar
->listen_intvl_t
= A_DEFAULT_LISTEN_INTERVAL
;
2297 ar
->listen_intvl_b
= 0;
2301 memset(&ar
->sc_params
, 0, sizeof(ar
->sc_params
));
2302 ar
->sc_params
.short_scan_ratio
= WMI_SHORTSCANRATIO_DEFAULT
;
2303 ar
->sc_params
.scan_ctrl_flags
= DEFAULT_SCAN_CTRL_FLAGS
;
2304 ar
->lrssi_roam_threshold
= DEF_LRSSI_ROAM_THRESHOLD
;
2306 ar
->state
= ATH6KL_STATE_OFF
;
2308 memset((u8
*)ar
->sta_list
, 0,
2309 AP_MAX_NUM_STA
* sizeof(struct ath6kl_sta
));
2311 /* Init the PS queues */
2312 for (ctr
= 0; ctr
< AP_MAX_NUM_STA
; ctr
++) {
2313 spin_lock_init(&ar
->sta_list
[ctr
].psq_lock
);
2314 skb_queue_head_init(&ar
->sta_list
[ctr
].psq
);
2317 skb_queue_head_init(&ar
->mcastpsq
);
2319 memcpy(ar
->ap_country_code
, DEF_AP_COUNTRY_CODE
, 3);
2324 int ath6kl_register_ieee80211_hw(struct ath6kl
*ar
)
2326 struct wiphy
*wiphy
= ar
->wiphy
;
2329 wiphy
->mgmt_stypes
= ath6kl_mgmt_stypes
;
2331 wiphy
->max_remain_on_channel_duration
= 5000;
2333 /* set device pointer for wiphy */
2334 set_wiphy_dev(wiphy
, ar
->dev
);
2336 wiphy
->interface_modes
= BIT(NL80211_IFTYPE_STATION
) |
2337 BIT(NL80211_IFTYPE_ADHOC
) |
2338 BIT(NL80211_IFTYPE_AP
);
2340 wiphy
->interface_modes
|= BIT(NL80211_IFTYPE_P2P_GO
) |
2341 BIT(NL80211_IFTYPE_P2P_CLIENT
);
2344 /* max num of ssids that can be probed during scanning */
2345 wiphy
->max_scan_ssids
= MAX_PROBED_SSID_INDEX
;
2346 wiphy
->max_scan_ie_len
= 1000; /* FIX: what is correct limit? */
2347 wiphy
->bands
[IEEE80211_BAND_2GHZ
] = &ath6kl_band_2ghz
;
2348 wiphy
->bands
[IEEE80211_BAND_5GHZ
] = &ath6kl_band_5ghz
;
2349 wiphy
->signal_type
= CFG80211_SIGNAL_TYPE_MBM
;
2351 wiphy
->cipher_suites
= cipher_suites
;
2352 wiphy
->n_cipher_suites
= ARRAY_SIZE(cipher_suites
);
2354 ret
= wiphy_register(wiphy
);
2356 ath6kl_err("couldn't register wiphy device\n");
2363 static int ath6kl_init_if_data(struct ath6kl_vif
*vif
)
2365 vif
->aggr_cntxt
= aggr_init(vif
->ndev
);
2366 if (!vif
->aggr_cntxt
) {
2367 ath6kl_err("failed to initialize aggr\n");
2371 setup_timer(&vif
->disconnect_timer
, disconnect_timer_handler
,
2372 (unsigned long) vif
->ndev
);
2373 set_bit(WMM_ENABLED
, &vif
->flags
);
2374 spin_lock_init(&vif
->if_lock
);
2379 void ath6kl_deinit_if_data(struct ath6kl_vif
*vif
)
2381 struct ath6kl
*ar
= vif
->ar
;
2383 aggr_module_destroy(vif
->aggr_cntxt
);
2385 ar
->avail_idx_map
|= BIT(vif
->fw_vif_idx
);
2387 if (vif
->nw_type
== ADHOC_NETWORK
)
2388 ar
->ibss_if_active
= false;
2390 unregister_netdevice(vif
->ndev
);
2395 struct net_device
*ath6kl_interface_add(struct ath6kl
*ar
, char *name
,
2396 enum nl80211_iftype type
, u8 fw_vif_idx
,
2399 struct net_device
*ndev
;
2400 struct ath6kl_vif
*vif
;
2402 ndev
= alloc_netdev(sizeof(*vif
), name
, ether_setup
);
2406 vif
= netdev_priv(ndev
);
2407 ndev
->ieee80211_ptr
= &vif
->wdev
;
2408 vif
->wdev
.wiphy
= ar
->wiphy
;
2411 SET_NETDEV_DEV(ndev
, wiphy_dev(vif
->wdev
.wiphy
));
2412 vif
->wdev
.netdev
= ndev
;
2413 vif
->wdev
.iftype
= type
;
2414 vif
->fw_vif_idx
= fw_vif_idx
;
2415 vif
->nw_type
= vif
->next_mode
= nw_type
;
2417 memcpy(ndev
->dev_addr
, ar
->mac_addr
, ETH_ALEN
);
2418 if (fw_vif_idx
!= 0)
2419 ndev
->dev_addr
[0] = (ndev
->dev_addr
[0] ^ (1 << fw_vif_idx
)) |
2424 ath6kl_init_control_info(vif
);
2426 /* TODO: Pass interface specific pointer instead of ar */
2427 if (ath6kl_init_if_data(vif
))
2430 if (register_netdevice(ndev
))
2433 ar
->avail_idx_map
&= ~BIT(fw_vif_idx
);
2434 vif
->sme_state
= SME_DISCONNECTED
;
2435 set_bit(WLAN_ENABLED
, &vif
->flags
);
2436 ar
->wlan_pwr_state
= WLAN_POWER_STATE_ON
;
2437 set_bit(NETDEV_REGISTERED
, &vif
->flags
);
2439 if (type
== NL80211_IFTYPE_ADHOC
)
2440 ar
->ibss_if_active
= true;
2442 spin_lock_bh(&ar
->list_lock
);
2443 list_add_tail(&vif
->list
, &ar
->vif_list
);
2444 spin_unlock_bh(&ar
->list_lock
);
2449 aggr_module_destroy(vif
->aggr_cntxt
);
2454 void ath6kl_deinit_ieee80211_hw(struct ath6kl
*ar
)
2456 wiphy_unregister(ar
->wiphy
);
2457 wiphy_free(ar
->wiphy
);