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;
25 module_param(ath6kl_p2p, uint, 0644);
27 #define RATETAB_ENT(_rate, _rateid, _flags) { \
30 .hw_value = (_rateid), \
33 #define CHAN2G(_channel, _freq, _flags) { \
34 .band = IEEE80211_BAND_2GHZ, \
35 .hw_value = (_channel), \
36 .center_freq = (_freq), \
38 .max_antenna_gain = 0, \
42 #define CHAN5G(_channel, _flags) { \
43 .band = IEEE80211_BAND_5GHZ, \
44 .hw_value = (_channel), \
45 .center_freq = 5000 + (5 * (_channel)), \
47 .max_antenna_gain = 0, \
51 static struct ieee80211_rate ath6kl_rates[] = {
52 RATETAB_ENT(10, 0x1, 0),
53 RATETAB_ENT(20, 0x2, 0),
54 RATETAB_ENT(55, 0x4, 0),
55 RATETAB_ENT(110, 0x8, 0),
56 RATETAB_ENT(60, 0x10, 0),
57 RATETAB_ENT(90, 0x20, 0),
58 RATETAB_ENT(120, 0x40, 0),
59 RATETAB_ENT(180, 0x80, 0),
60 RATETAB_ENT(240, 0x100, 0),
61 RATETAB_ENT(360, 0x200, 0),
62 RATETAB_ENT(480, 0x400, 0),
63 RATETAB_ENT(540, 0x800, 0),
66 #define ath6kl_a_rates (ath6kl_rates + 4)
67 #define ath6kl_a_rates_size 8
68 #define ath6kl_g_rates (ath6kl_rates + 0)
69 #define ath6kl_g_rates_size 12
71 static struct ieee80211_channel ath6kl_2ghz_channels[] = {
88 static struct ieee80211_channel ath6kl_5ghz_a_channels[] = {
89 CHAN5G(34, 0), CHAN5G(36, 0),
90 CHAN5G(38, 0), CHAN5G(40, 0),
91 CHAN5G(42, 0), CHAN5G(44, 0),
92 CHAN5G(46, 0), CHAN5G(48, 0),
93 CHAN5G(52, 0), CHAN5G(56, 0),
94 CHAN5G(60, 0), CHAN5G(64, 0),
95 CHAN5G(100, 0), CHAN5G(104, 0),
96 CHAN5G(108, 0), CHAN5G(112, 0),
97 CHAN5G(116, 0), CHAN5G(120, 0),
98 CHAN5G(124, 0), CHAN5G(128, 0),
99 CHAN5G(132, 0), CHAN5G(136, 0),
100 CHAN5G(140, 0), CHAN5G(149, 0),
101 CHAN5G(153, 0), CHAN5G(157, 0),
102 CHAN5G(161, 0), CHAN5G(165, 0),
103 CHAN5G(184, 0), CHAN5G(188, 0),
104 CHAN5G(192, 0), CHAN5G(196, 0),
105 CHAN5G(200, 0), CHAN5G(204, 0),
106 CHAN5G(208, 0), CHAN5G(212, 0),
110 static struct ieee80211_supported_band ath6kl_band_2ghz = {
111 .n_channels = ARRAY_SIZE(ath6kl_2ghz_channels),
112 .channels = ath6kl_2ghz_channels,
113 .n_bitrates = ath6kl_g_rates_size,
114 .bitrates = ath6kl_g_rates,
117 static struct ieee80211_supported_band ath6kl_band_5ghz = {
118 .n_channels = ARRAY_SIZE(ath6kl_5ghz_a_channels),
119 .channels = ath6kl_5ghz_a_channels,
120 .n_bitrates = ath6kl_a_rates_size,
121 .bitrates = ath6kl_a_rates,
124 static int ath6kl_set_wpa_version(struct ath6kl *ar,
125 enum nl80211_wpa_versions wpa_version)
127 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: %u\n", __func__, wpa_version);
130 ar->auth_mode = NONE_AUTH;
131 } else if (wpa_version & NL80211_WPA_VERSION_2) {
132 ar->auth_mode = WPA2_AUTH;
133 } else if (wpa_version & NL80211_WPA_VERSION_1) {
134 ar->auth_mode = WPA_AUTH;
136 ath6kl_err("%s: %u not supported\n", __func__, wpa_version);
143 static int ath6kl_set_auth_type(struct ath6kl *ar,
144 enum nl80211_auth_type auth_type)
147 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: 0x%x\n", __func__, auth_type);
150 case NL80211_AUTHTYPE_OPEN_SYSTEM:
151 ar->dot11_auth_mode = OPEN_AUTH;
153 case NL80211_AUTHTYPE_SHARED_KEY:
154 ar->dot11_auth_mode = SHARED_AUTH;
156 case NL80211_AUTHTYPE_NETWORK_EAP:
157 ar->dot11_auth_mode = LEAP_AUTH;
160 case NL80211_AUTHTYPE_AUTOMATIC:
161 ar->dot11_auth_mode = OPEN_AUTH | SHARED_AUTH;
165 ath6kl_err("%s: 0x%x not spported\n", __func__, auth_type);
172 static int ath6kl_set_cipher(struct ath6kl *ar, u32 cipher, bool ucast)
174 u8 *ar_cipher = ucast ? &ar->prwise_crypto : &ar->grp_crypto;
175 u8 *ar_cipher_len = ucast ? &ar->prwise_crypto_len :
178 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: cipher 0x%x, ucast %u\n",
179 __func__, cipher, ucast);
183 /* our own hack to use value 0 as no crypto used */
184 *ar_cipher = NONE_CRYPT;
187 case WLAN_CIPHER_SUITE_WEP40:
188 *ar_cipher = WEP_CRYPT;
191 case WLAN_CIPHER_SUITE_WEP104:
192 *ar_cipher = WEP_CRYPT;
195 case WLAN_CIPHER_SUITE_TKIP:
196 *ar_cipher = TKIP_CRYPT;
199 case WLAN_CIPHER_SUITE_CCMP:
200 *ar_cipher = AES_CRYPT;
204 ath6kl_err("cipher 0x%x not supported\n", cipher);
211 static void ath6kl_set_key_mgmt(struct ath6kl *ar, u32 key_mgmt)
213 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: 0x%x\n", __func__, key_mgmt);
215 if (key_mgmt == WLAN_AKM_SUITE_PSK) {
216 if (ar->auth_mode == WPA_AUTH)
217 ar->auth_mode = WPA_PSK_AUTH;
218 else if (ar->auth_mode == WPA2_AUTH)
219 ar->auth_mode = WPA2_PSK_AUTH;
220 } else if (key_mgmt != WLAN_AKM_SUITE_8021X) {
221 ar->auth_mode = NONE_AUTH;
225 static bool ath6kl_cfg80211_ready(struct ath6kl *ar)
227 if (!test_bit(WMI_READY, &ar->flag)) {
228 ath6kl_err("wmi is not ready\n");
232 if (!test_bit(WLAN_ENABLED, &ar->flag)) {
233 ath6kl_err("wlan disabled\n");
240 static int ath6kl_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
241 struct cfg80211_connect_params *sme)
243 struct ath6kl *ar = ath6kl_priv(dev);
246 ar->sme_state = SME_CONNECTING;
248 if (!ath6kl_cfg80211_ready(ar))
251 if (test_bit(DESTROY_IN_PROGRESS, &ar->flag)) {
252 ath6kl_err("destroy in progress\n");
256 if (test_bit(SKIP_SCAN, &ar->flag) &&
257 ((sme->channel && sme->channel->center_freq == 0) ||
258 (sme->bssid && is_zero_ether_addr(sme->bssid)))) {
259 ath6kl_err("SkipScan: channel or bssid invalid\n");
263 if (down_interruptible(&ar->sem)) {
264 ath6kl_err("busy, couldn't get access\n");
268 if (test_bit(DESTROY_IN_PROGRESS, &ar->flag)) {
269 ath6kl_err("busy, destroy in progress\n");
274 if (ar->tx_pending[ath6kl_wmi_get_control_ep(ar->wmi)]) {
276 * sleep until the command queue drains
278 wait_event_interruptible_timeout(ar->event_wq,
279 ar->tx_pending[ath6kl_wmi_get_control_ep(ar->wmi)] == 0,
281 if (signal_pending(current)) {
282 ath6kl_err("cmd queue drain timeout\n");
288 if (test_bit(CONNECTED, &ar->flag) &&
289 ar->ssid_len == sme->ssid_len &&
290 !memcmp(ar->ssid, sme->ssid, ar->ssid_len)) {
291 ar->reconnect_flag = true;
292 status = ath6kl_wmi_reconnect_cmd(ar->wmi, ar->req_bssid,
297 ath6kl_err("wmi_reconnect_cmd failed\n");
301 } else if (ar->ssid_len == sme->ssid_len &&
302 !memcmp(ar->ssid, sme->ssid, ar->ssid_len)) {
303 ath6kl_disconnect(ar);
306 memset(ar->ssid, 0, sizeof(ar->ssid));
307 ar->ssid_len = sme->ssid_len;
308 memcpy(ar->ssid, sme->ssid, sme->ssid_len);
311 ar->ch_hint = sme->channel->center_freq;
313 memset(ar->req_bssid, 0, sizeof(ar->req_bssid));
314 if (sme->bssid && !is_broadcast_ether_addr(sme->bssid))
315 memcpy(ar->req_bssid, sme->bssid, sizeof(ar->req_bssid));
317 ath6kl_set_wpa_version(ar, sme->crypto.wpa_versions);
319 status = ath6kl_set_auth_type(ar, sme->auth_type);
325 if (sme->crypto.n_ciphers_pairwise)
326 ath6kl_set_cipher(ar, sme->crypto.ciphers_pairwise[0], true);
328 ath6kl_set_cipher(ar, 0, true);
330 ath6kl_set_cipher(ar, sme->crypto.cipher_group, false);
332 if (sme->crypto.n_akm_suites)
333 ath6kl_set_key_mgmt(ar, sme->crypto.akm_suites[0]);
335 if ((sme->key_len) &&
336 (ar->auth_mode == NONE_AUTH) && (ar->prwise_crypto == WEP_CRYPT)) {
337 struct ath6kl_key *key = NULL;
339 if (sme->key_idx < WMI_MIN_KEY_INDEX ||
340 sme->key_idx > WMI_MAX_KEY_INDEX) {
341 ath6kl_err("key index %d out of bounds\n",
347 key = &ar->keys[sme->key_idx];
348 key->key_len = sme->key_len;
349 memcpy(key->key, sme->key, key->key_len);
350 key->cipher = ar->prwise_crypto;
351 ar->def_txkey_index = sme->key_idx;
353 ath6kl_wmi_addkey_cmd(ar->wmi, sme->key_idx,
355 GROUP_USAGE | TX_USAGE,
358 key->key, KEY_OP_INIT_VAL, NULL,
362 if (!ar->usr_bss_filter) {
363 clear_bit(CLEAR_BSSFILTER_ON_BEACON, &ar->flag);
364 if (ath6kl_wmi_bssfilter_cmd(ar->wmi, ALL_BSS_FILTER, 0) != 0) {
365 ath6kl_err("couldn't set bss filtering\n");
371 ar->nw_type = ar->next_mode;
373 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
374 "%s: connect called with authmode %d dot11 auth %d"
375 " PW crypto %d PW crypto len %d GRP crypto %d"
376 " GRP crypto len %d channel hint %u\n",
378 ar->auth_mode, ar->dot11_auth_mode, ar->prwise_crypto,
379 ar->prwise_crypto_len, ar->grp_crypto,
380 ar->grp_crypto_len, ar->ch_hint);
382 ar->reconnect_flag = 0;
383 status = ath6kl_wmi_connect_cmd(ar->wmi, ar->nw_type,
384 ar->dot11_auth_mode, ar->auth_mode,
386 ar->prwise_crypto_len,
387 ar->grp_crypto, ar->grp_crypto_len,
388 ar->ssid_len, ar->ssid,
389 ar->req_bssid, ar->ch_hint,
390 ar->connect_ctrl_flags);
394 if (status == -EINVAL) {
395 memset(ar->ssid, 0, sizeof(ar->ssid));
397 ath6kl_err("invalid request\n");
400 ath6kl_err("ath6kl_wmi_connect_cmd failed\n");
404 if ((!(ar->connect_ctrl_flags & CONNECT_DO_WPA_OFFLOAD)) &&
405 ((ar->auth_mode == WPA_PSK_AUTH)
406 || (ar->auth_mode == WPA2_PSK_AUTH))) {
407 mod_timer(&ar->disconnect_timer,
408 jiffies + msecs_to_jiffies(DISCON_TIMER_INTVAL));
411 ar->connect_ctrl_flags &= ~CONNECT_DO_WPA_OFFLOAD;
412 set_bit(CONNECT_PEND, &ar->flag);
417 static int ath6kl_add_bss_if_needed(struct ath6kl *ar, const u8 *bssid,
418 struct ieee80211_channel *chan,
419 const u8 *beacon_ie, size_t beacon_ie_len)
421 struct cfg80211_bss *bss;
424 bss = cfg80211_get_bss(ar->wdev->wiphy, chan, bssid,
425 ar->ssid, ar->ssid_len, WLAN_CAPABILITY_ESS,
426 WLAN_CAPABILITY_ESS);
429 * Since cfg80211 may not yet know about the BSS,
430 * generate a partial entry until the first BSS info
431 * event becomes available.
433 * Prepend SSID element since it is not included in the Beacon
434 * IEs from the target.
436 ie = kmalloc(2 + ar->ssid_len + beacon_ie_len, GFP_KERNEL);
439 ie[0] = WLAN_EID_SSID;
440 ie[1] = ar->ssid_len;
441 memcpy(ie + 2, ar->ssid, ar->ssid_len);
442 memcpy(ie + 2 + ar->ssid_len, beacon_ie, beacon_ie_len);
443 bss = cfg80211_inform_bss(ar->wdev->wiphy, chan,
444 bssid, 0, WLAN_CAPABILITY_ESS, 100,
445 ie, 2 + ar->ssid_len + beacon_ie_len,
448 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "added dummy bss for "
449 "%pM prior to indicating connect/roamed "
453 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "cfg80211 already has a bss "
459 cfg80211_put_bss(bss);
464 void ath6kl_cfg80211_connect_event(struct ath6kl *ar, u16 channel,
465 u8 *bssid, u16 listen_intvl,
467 enum network_type nw_type,
468 u8 beacon_ie_len, u8 assoc_req_len,
469 u8 assoc_resp_len, u8 *assoc_info)
471 struct ieee80211_channel *chan;
473 /* capinfo + listen interval */
474 u8 assoc_req_ie_offset = sizeof(u16) + sizeof(u16);
476 /* capinfo + status code + associd */
477 u8 assoc_resp_ie_offset = sizeof(u16) + sizeof(u16) + sizeof(u16);
479 u8 *assoc_req_ie = assoc_info + beacon_ie_len + assoc_req_ie_offset;
480 u8 *assoc_resp_ie = assoc_info + beacon_ie_len + assoc_req_len +
481 assoc_resp_ie_offset;
483 assoc_req_len -= assoc_req_ie_offset;
484 assoc_resp_len -= assoc_resp_ie_offset;
487 * Store Beacon interval here; DTIM period will be available only once
488 * a Beacon frame from the AP is seen.
490 ar->assoc_bss_beacon_int = beacon_intvl;
491 clear_bit(DTIM_PERIOD_AVAIL, &ar->flag);
493 if (nw_type & ADHOC_NETWORK) {
494 if (ar->wdev->iftype != NL80211_IFTYPE_ADHOC) {
495 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
496 "%s: ath6k not in ibss mode\n", __func__);
501 if (nw_type & INFRA_NETWORK) {
502 if (ar->wdev->iftype != NL80211_IFTYPE_STATION &&
503 ar->wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) {
504 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
505 "%s: ath6k not in station mode\n", __func__);
510 chan = ieee80211_get_channel(ar->wdev->wiphy, (int) channel);
513 if (nw_type & ADHOC_NETWORK) {
514 cfg80211_ibss_joined(ar->net_dev, bssid, GFP_KERNEL);
518 if (ath6kl_add_bss_if_needed(ar, bssid, chan, assoc_info,
519 beacon_ie_len) < 0) {
520 ath6kl_err("could not add cfg80211 bss entry for "
521 "connect/roamed notification\n");
525 if (ar->sme_state == SME_CONNECTING) {
526 /* inform connect result to cfg80211 */
527 ar->sme_state = SME_CONNECTED;
528 cfg80211_connect_result(ar->net_dev, bssid,
529 assoc_req_ie, assoc_req_len,
530 assoc_resp_ie, assoc_resp_len,
531 WLAN_STATUS_SUCCESS, GFP_KERNEL);
532 } else if (ar->sme_state == SME_CONNECTED) {
533 /* inform roam event to cfg80211 */
534 cfg80211_roamed(ar->net_dev, chan, bssid,
535 assoc_req_ie, assoc_req_len,
536 assoc_resp_ie, assoc_resp_len, GFP_KERNEL);
540 static int ath6kl_cfg80211_disconnect(struct wiphy *wiphy,
541 struct net_device *dev, u16 reason_code)
543 struct ath6kl *ar = (struct ath6kl *)ath6kl_priv(dev);
545 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: reason=%u\n", __func__,
548 if (!ath6kl_cfg80211_ready(ar))
551 if (test_bit(DESTROY_IN_PROGRESS, &ar->flag)) {
552 ath6kl_err("busy, destroy in progress\n");
556 if (down_interruptible(&ar->sem)) {
557 ath6kl_err("busy, couldn't get access\n");
561 ar->reconnect_flag = 0;
562 ath6kl_disconnect(ar);
563 memset(ar->ssid, 0, sizeof(ar->ssid));
566 if (!test_bit(SKIP_SCAN, &ar->flag))
567 memset(ar->req_bssid, 0, sizeof(ar->req_bssid));
571 ar->sme_state = SME_DISCONNECTED;
576 void ath6kl_cfg80211_disconnect_event(struct ath6kl *ar, u8 reason,
577 u8 *bssid, u8 assoc_resp_len,
578 u8 *assoc_info, u16 proto_reason)
581 cfg80211_scan_done(ar->scan_req, true);
585 if (ar->nw_type & ADHOC_NETWORK) {
586 if (ar->wdev->iftype != NL80211_IFTYPE_ADHOC) {
587 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
588 "%s: ath6k not in ibss mode\n", __func__);
591 memset(bssid, 0, ETH_ALEN);
592 cfg80211_ibss_joined(ar->net_dev, bssid, GFP_KERNEL);
596 if (ar->nw_type & INFRA_NETWORK) {
597 if (ar->wdev->iftype != NL80211_IFTYPE_STATION &&
598 ar->wdev->iftype != NL80211_IFTYPE_P2P_CLIENT) {
599 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
600 "%s: ath6k not in station mode\n", __func__);
606 * Send a disconnect command to target when a disconnect event is
607 * received with reason code other than 3 (DISCONNECT_CMD - disconnect
608 * request from host) to make the firmware stop trying to connect even
609 * after giving disconnect event. There will be one more disconnect
610 * event for this disconnect command with reason code DISCONNECT_CMD
611 * which will be notified to cfg80211.
614 if (reason != DISCONNECT_CMD) {
615 ath6kl_wmi_disconnect_cmd(ar->wmi);
619 clear_bit(CONNECT_PEND, &ar->flag);
621 if (ar->sme_state == SME_CONNECTING) {
622 cfg80211_connect_result(ar->net_dev,
625 WLAN_STATUS_UNSPECIFIED_FAILURE,
627 } else if (ar->sme_state == SME_CONNECTED) {
628 cfg80211_disconnected(ar->net_dev, reason,
629 NULL, 0, GFP_KERNEL);
632 ar->sme_state = SME_DISCONNECTED;
635 static int ath6kl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev,
636 struct cfg80211_scan_request *request)
638 struct ath6kl *ar = (struct ath6kl *)ath6kl_priv(ndev);
640 u16 *channels = NULL;
642 u32 force_fg_scan = 0;
644 if (!ath6kl_cfg80211_ready(ar))
647 if (!ar->usr_bss_filter) {
648 clear_bit(CLEAR_BSSFILTER_ON_BEACON, &ar->flag);
649 ret = ath6kl_wmi_bssfilter_cmd(
651 (test_bit(CONNECTED, &ar->flag) ?
652 ALL_BUT_BSS_FILTER : ALL_BSS_FILTER), 0);
654 ath6kl_err("couldn't set bss filtering\n");
659 if (request->n_ssids && request->ssids[0].ssid_len) {
662 if (request->n_ssids > (MAX_PROBED_SSID_INDEX - 1))
663 request->n_ssids = MAX_PROBED_SSID_INDEX - 1;
665 for (i = 0; i < request->n_ssids; i++)
666 ath6kl_wmi_probedssid_cmd(ar->wmi, i + 1,
668 request->ssids[i].ssid_len,
669 request->ssids[i].ssid);
673 ret = ath6kl_wmi_set_appie_cmd(ar->wmi, WMI_FRAME_PROBE_REQ,
674 request->ie, request->ie_len);
676 ath6kl_err("failed to set Probe Request appie for "
683 * Scan only the requested channels if the request specifies a set of
684 * channels. If the list is longer than the target supports, do not
685 * configure the list and instead, scan all available channels.
687 if (request->n_channels > 0 &&
688 request->n_channels <= WMI_MAX_CHANNELS) {
691 n_channels = request->n_channels;
693 channels = kzalloc(n_channels * sizeof(u16), GFP_KERNEL);
694 if (channels == NULL) {
695 ath6kl_warn("failed to set scan channels, "
696 "scan all channels");
700 for (i = 0; i < n_channels; i++)
701 channels[i] = request->channels[i]->center_freq;
704 if (test_bit(CONNECTED, &ar->flag))
707 ret = ath6kl_wmi_startscan_cmd(ar->wmi, WMI_LONG_SCAN, force_fg_scan,
708 false, 0, 0, n_channels, channels);
710 ath6kl_err("wmi_startscan_cmd failed\n");
712 ar->scan_req = request;
719 void ath6kl_cfg80211_scan_complete_event(struct ath6kl *ar, int status)
723 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: status %d\n", __func__, status);
728 if ((status == -ECANCELED) || (status == -EBUSY)) {
729 cfg80211_scan_done(ar->scan_req, true);
733 cfg80211_scan_done(ar->scan_req, false);
735 if (ar->scan_req->n_ssids && ar->scan_req->ssids[0].ssid_len) {
736 for (i = 0; i < ar->scan_req->n_ssids; i++) {
737 ath6kl_wmi_probedssid_cmd(ar->wmi, i + 1,
747 static int ath6kl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
748 u8 key_index, bool pairwise,
750 struct key_params *params)
752 struct ath6kl *ar = (struct ath6kl *)ath6kl_priv(ndev);
753 struct ath6kl_key *key = NULL;
758 if (!ath6kl_cfg80211_ready(ar))
761 if (key_index < WMI_MIN_KEY_INDEX || key_index > WMI_MAX_KEY_INDEX) {
762 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
763 "%s: key index %d out of bounds\n", __func__,
768 key = &ar->keys[key_index];
769 memset(key, 0, sizeof(struct ath6kl_key));
772 key_usage = PAIRWISE_USAGE;
774 key_usage = GROUP_USAGE;
777 if (params->key_len > WLAN_MAX_KEY_LEN ||
778 params->seq_len > sizeof(key->seq))
781 key->key_len = params->key_len;
782 memcpy(key->key, params->key, key->key_len);
783 key->seq_len = params->seq_len;
784 memcpy(key->seq, params->seq, key->seq_len);
785 key->cipher = params->cipher;
788 switch (key->cipher) {
789 case WLAN_CIPHER_SUITE_WEP40:
790 case WLAN_CIPHER_SUITE_WEP104:
791 key_type = WEP_CRYPT;
794 case WLAN_CIPHER_SUITE_TKIP:
795 key_type = TKIP_CRYPT;
798 case WLAN_CIPHER_SUITE_CCMP:
799 key_type = AES_CRYPT;
806 if (((ar->auth_mode == WPA_PSK_AUTH)
807 || (ar->auth_mode == WPA2_PSK_AUTH))
808 && (key_usage & GROUP_USAGE))
809 del_timer(&ar->disconnect_timer);
811 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
812 "%s: index %d, key_len %d, key_type 0x%x, key_usage 0x%x, seq_len %d\n",
813 __func__, key_index, key->key_len, key_type,
814 key_usage, key->seq_len);
816 ar->def_txkey_index = key_index;
818 if (ar->nw_type == AP_NETWORK && !pairwise &&
819 (key_type == TKIP_CRYPT || key_type == AES_CRYPT) && params) {
820 ar->ap_mode_bkey.valid = true;
821 ar->ap_mode_bkey.key_index = key_index;
822 ar->ap_mode_bkey.key_type = key_type;
823 ar->ap_mode_bkey.key_len = key->key_len;
824 memcpy(ar->ap_mode_bkey.key, key->key, key->key_len);
825 if (!test_bit(CONNECTED, &ar->flag)) {
826 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "Delay initial group "
827 "key configuration until AP mode has been "
830 * The key will be set in ath6kl_connect_ap_mode() once
831 * the connected event is received from the target.
837 if (ar->next_mode == AP_NETWORK && key_type == WEP_CRYPT &&
838 !test_bit(CONNECTED, &ar->flag)) {
840 * Store the key locally so that it can be re-configured after
841 * the AP mode has properly started
842 * (ath6kl_install_statioc_wep_keys).
844 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "Delay WEP key configuration "
845 "until AP mode has been started\n");
846 ar->wep_key_list[key_index].key_len = key->key_len;
847 memcpy(ar->wep_key_list[key_index].key, key->key, key->key_len);
851 status = ath6kl_wmi_addkey_cmd(ar->wmi, ar->def_txkey_index,
852 key_type, key_usage, key->key_len,
853 key->seq, key->key, KEY_OP_INIT_VAL,
854 (u8 *) mac_addr, SYNC_BOTH_WMIFLAG);
862 static int ath6kl_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev,
863 u8 key_index, bool pairwise,
866 struct ath6kl *ar = (struct ath6kl *)ath6kl_priv(ndev);
868 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: index %d\n", __func__, key_index);
870 if (!ath6kl_cfg80211_ready(ar))
873 if (key_index < WMI_MIN_KEY_INDEX || key_index > WMI_MAX_KEY_INDEX) {
874 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
875 "%s: key index %d out of bounds\n", __func__,
880 if (!ar->keys[key_index].key_len) {
881 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
882 "%s: index %d is empty\n", __func__, key_index);
886 ar->keys[key_index].key_len = 0;
888 return ath6kl_wmi_deletekey_cmd(ar->wmi, key_index);
891 static int ath6kl_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev,
892 u8 key_index, bool pairwise,
893 const u8 *mac_addr, void *cookie,
894 void (*callback) (void *cookie,
895 struct key_params *))
897 struct ath6kl *ar = (struct ath6kl *)ath6kl_priv(ndev);
898 struct ath6kl_key *key = NULL;
899 struct key_params params;
901 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: index %d\n", __func__, key_index);
903 if (!ath6kl_cfg80211_ready(ar))
906 if (key_index < WMI_MIN_KEY_INDEX || key_index > WMI_MAX_KEY_INDEX) {
907 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
908 "%s: key index %d out of bounds\n", __func__,
913 key = &ar->keys[key_index];
914 memset(¶ms, 0, sizeof(params));
915 params.cipher = key->cipher;
916 params.key_len = key->key_len;
917 params.seq_len = key->seq_len;
918 params.seq = key->seq;
919 params.key = key->key;
921 callback(cookie, ¶ms);
923 return key->key_len ? 0 : -ENOENT;
926 static int ath6kl_cfg80211_set_default_key(struct wiphy *wiphy,
927 struct net_device *ndev,
928 u8 key_index, bool unicast,
931 struct ath6kl *ar = (struct ath6kl *)ath6kl_priv(ndev);
932 struct ath6kl_key *key = NULL;
935 enum crypto_type key_type = NONE_CRYPT;
937 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: index %d\n", __func__, key_index);
939 if (!ath6kl_cfg80211_ready(ar))
942 if (key_index < WMI_MIN_KEY_INDEX || key_index > WMI_MAX_KEY_INDEX) {
943 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
944 "%s: key index %d out of bounds\n",
945 __func__, key_index);
949 if (!ar->keys[key_index].key_len) {
950 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: invalid key index %d\n",
951 __func__, key_index);
955 ar->def_txkey_index = key_index;
956 key = &ar->keys[ar->def_txkey_index];
957 key_usage = GROUP_USAGE;
958 if (ar->prwise_crypto == WEP_CRYPT)
959 key_usage |= TX_USAGE;
961 key_type = ar->prwise_crypto;
963 key_type = ar->grp_crypto;
965 if (ar->next_mode == AP_NETWORK && !test_bit(CONNECTED, &ar->flag))
966 return 0; /* Delay until AP mode has been started */
968 status = ath6kl_wmi_addkey_cmd(ar->wmi, ar->def_txkey_index,
970 key->key_len, key->seq, key->key,
971 KEY_OP_INIT_VAL, NULL,
979 void ath6kl_cfg80211_tkip_micerr_event(struct ath6kl *ar, u8 keyid,
982 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
983 "%s: keyid %d, ismcast %d\n", __func__, keyid, ismcast);
985 cfg80211_michael_mic_failure(ar->net_dev, ar->bssid,
986 (ismcast ? NL80211_KEYTYPE_GROUP :
987 NL80211_KEYTYPE_PAIRWISE), keyid, NULL,
991 static int ath6kl_cfg80211_set_wiphy_params(struct wiphy *wiphy, u32 changed)
993 struct ath6kl *ar = (struct ath6kl *)wiphy_priv(wiphy);
996 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: changed 0x%x\n", __func__,
999 if (!ath6kl_cfg80211_ready(ar))
1002 if (changed & WIPHY_PARAM_RTS_THRESHOLD) {
1003 ret = ath6kl_wmi_set_rts_cmd(ar->wmi, wiphy->rts_threshold);
1005 ath6kl_err("ath6kl_wmi_set_rts_cmd failed\n");
1014 * The type nl80211_tx_power_setting replaces the following
1015 * data type from 2.6.36 onwards
1017 static int ath6kl_cfg80211_set_txpower(struct wiphy *wiphy,
1018 enum nl80211_tx_power_setting type,
1021 struct ath6kl *ar = (struct ath6kl *)wiphy_priv(wiphy);
1024 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: type 0x%x, dbm %d\n", __func__,
1027 if (!ath6kl_cfg80211_ready(ar))
1031 case NL80211_TX_POWER_AUTOMATIC:
1033 case NL80211_TX_POWER_LIMITED:
1034 ar->tx_pwr = ath6kl_dbm = dbm;
1037 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: type 0x%x not supported\n",
1042 ath6kl_wmi_set_tx_pwr_cmd(ar->wmi, ath6kl_dbm);
1047 static int ath6kl_cfg80211_get_txpower(struct wiphy *wiphy, int *dbm)
1049 struct ath6kl *ar = (struct ath6kl *)wiphy_priv(wiphy);
1051 if (!ath6kl_cfg80211_ready(ar))
1054 if (test_bit(CONNECTED, &ar->flag)) {
1057 if (ath6kl_wmi_get_tx_pwr_cmd(ar->wmi) != 0) {
1058 ath6kl_err("ath6kl_wmi_get_tx_pwr_cmd failed\n");
1062 wait_event_interruptible_timeout(ar->event_wq, ar->tx_pwr != 0,
1065 if (signal_pending(current)) {
1066 ath6kl_err("target did not respond\n");
1075 static int ath6kl_cfg80211_set_power_mgmt(struct wiphy *wiphy,
1076 struct net_device *dev,
1077 bool pmgmt, int timeout)
1079 struct ath6kl *ar = ath6kl_priv(dev);
1080 struct wmi_power_mode_cmd mode;
1082 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: pmgmt %d, timeout %d\n",
1083 __func__, pmgmt, timeout);
1085 if (!ath6kl_cfg80211_ready(ar))
1089 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: max perf\n", __func__);
1090 mode.pwr_mode = REC_POWER;
1092 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: rec power\n", __func__);
1093 mode.pwr_mode = MAX_PERF_POWER;
1096 if (ath6kl_wmi_powermode_cmd(ar->wmi, mode.pwr_mode) != 0) {
1097 ath6kl_err("wmi_powermode_cmd failed\n");
1104 static int ath6kl_cfg80211_change_iface(struct wiphy *wiphy,
1105 struct net_device *ndev,
1106 enum nl80211_iftype type, u32 *flags,
1107 struct vif_params *params)
1109 struct ath6kl *ar = ath6kl_priv(ndev);
1110 struct wireless_dev *wdev = ar->wdev;
1112 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: type %u\n", __func__, type);
1114 if (!ath6kl_cfg80211_ready(ar))
1118 case NL80211_IFTYPE_STATION:
1119 ar->next_mode = INFRA_NETWORK;
1121 case NL80211_IFTYPE_ADHOC:
1122 ar->next_mode = ADHOC_NETWORK;
1124 case NL80211_IFTYPE_AP:
1125 ar->next_mode = AP_NETWORK;
1127 case NL80211_IFTYPE_P2P_CLIENT:
1128 ar->next_mode = INFRA_NETWORK;
1130 case NL80211_IFTYPE_P2P_GO:
1131 ar->next_mode = AP_NETWORK;
1134 ath6kl_err("invalid interface type %u\n", type);
1138 wdev->iftype = type;
1143 static int ath6kl_cfg80211_join_ibss(struct wiphy *wiphy,
1144 struct net_device *dev,
1145 struct cfg80211_ibss_params *ibss_param)
1147 struct ath6kl *ar = ath6kl_priv(dev);
1150 if (!ath6kl_cfg80211_ready(ar))
1153 ar->ssid_len = ibss_param->ssid_len;
1154 memcpy(ar->ssid, ibss_param->ssid, ar->ssid_len);
1156 if (ibss_param->channel)
1157 ar->ch_hint = ibss_param->channel->center_freq;
1159 if (ibss_param->channel_fixed) {
1161 * TODO: channel_fixed: The channel should be fixed, do not
1162 * search for IBSSs to join on other channels. Target
1163 * firmware does not support this feature, needs to be
1169 memset(ar->req_bssid, 0, sizeof(ar->req_bssid));
1170 if (ibss_param->bssid && !is_broadcast_ether_addr(ibss_param->bssid))
1171 memcpy(ar->req_bssid, ibss_param->bssid, sizeof(ar->req_bssid));
1173 ath6kl_set_wpa_version(ar, 0);
1175 status = ath6kl_set_auth_type(ar, NL80211_AUTHTYPE_OPEN_SYSTEM);
1179 if (ibss_param->privacy) {
1180 ath6kl_set_cipher(ar, WLAN_CIPHER_SUITE_WEP40, true);
1181 ath6kl_set_cipher(ar, WLAN_CIPHER_SUITE_WEP40, false);
1183 ath6kl_set_cipher(ar, 0, true);
1184 ath6kl_set_cipher(ar, 0, false);
1187 ar->nw_type = ar->next_mode;
1189 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
1190 "%s: connect called with authmode %d dot11 auth %d"
1191 " PW crypto %d PW crypto len %d GRP crypto %d"
1192 " GRP crypto len %d channel hint %u\n",
1194 ar->auth_mode, ar->dot11_auth_mode, ar->prwise_crypto,
1195 ar->prwise_crypto_len, ar->grp_crypto,
1196 ar->grp_crypto_len, ar->ch_hint);
1198 status = ath6kl_wmi_connect_cmd(ar->wmi, ar->nw_type,
1199 ar->dot11_auth_mode, ar->auth_mode,
1201 ar->prwise_crypto_len,
1202 ar->grp_crypto, ar->grp_crypto_len,
1203 ar->ssid_len, ar->ssid,
1204 ar->req_bssid, ar->ch_hint,
1205 ar->connect_ctrl_flags);
1206 set_bit(CONNECT_PEND, &ar->flag);
1211 static int ath6kl_cfg80211_leave_ibss(struct wiphy *wiphy,
1212 struct net_device *dev)
1214 struct ath6kl *ar = (struct ath6kl *)ath6kl_priv(dev);
1216 if (!ath6kl_cfg80211_ready(ar))
1219 ath6kl_disconnect(ar);
1220 memset(ar->ssid, 0, sizeof(ar->ssid));
1226 static const u32 cipher_suites[] = {
1227 WLAN_CIPHER_SUITE_WEP40,
1228 WLAN_CIPHER_SUITE_WEP104,
1229 WLAN_CIPHER_SUITE_TKIP,
1230 WLAN_CIPHER_SUITE_CCMP,
1233 static bool is_rate_legacy(s32 rate)
1235 static const s32 legacy[] = { 1000, 2000, 5500, 11000,
1236 6000, 9000, 12000, 18000, 24000,
1241 for (i = 0; i < ARRAY_SIZE(legacy); i++)
1242 if (rate == legacy[i])
1248 static bool is_rate_ht20(s32 rate, u8 *mcs, bool *sgi)
1250 static const s32 ht20[] = { 6500, 13000, 19500, 26000, 39000,
1251 52000, 58500, 65000, 72200
1255 for (i = 0; i < ARRAY_SIZE(ht20); i++) {
1256 if (rate == ht20[i]) {
1257 if (i == ARRAY_SIZE(ht20) - 1)
1258 /* last rate uses sgi */
1270 static bool is_rate_ht40(s32 rate, u8 *mcs, bool *sgi)
1272 static const s32 ht40[] = { 13500, 27000, 40500, 54000,
1273 81000, 108000, 121500, 135000,
1278 for (i = 0; i < ARRAY_SIZE(ht40); i++) {
1279 if (rate == ht40[i]) {
1280 if (i == ARRAY_SIZE(ht40) - 1)
1281 /* last rate uses sgi */
1294 static int ath6kl_get_station(struct wiphy *wiphy, struct net_device *dev,
1295 u8 *mac, struct station_info *sinfo)
1297 struct ath6kl *ar = ath6kl_priv(dev);
1304 if (memcmp(mac, ar->bssid, ETH_ALEN) != 0)
1307 if (down_interruptible(&ar->sem))
1310 set_bit(STATS_UPDATE_PEND, &ar->flag);
1312 ret = ath6kl_wmi_get_stats_cmd(ar->wmi);
1319 left = wait_event_interruptible_timeout(ar->event_wq,
1320 !test_bit(STATS_UPDATE_PEND,
1331 if (ar->target_stats.rx_byte) {
1332 sinfo->rx_bytes = ar->target_stats.rx_byte;
1333 sinfo->filled |= STATION_INFO_RX_BYTES;
1334 sinfo->rx_packets = ar->target_stats.rx_pkt;
1335 sinfo->filled |= STATION_INFO_RX_PACKETS;
1338 if (ar->target_stats.tx_byte) {
1339 sinfo->tx_bytes = ar->target_stats.tx_byte;
1340 sinfo->filled |= STATION_INFO_TX_BYTES;
1341 sinfo->tx_packets = ar->target_stats.tx_pkt;
1342 sinfo->filled |= STATION_INFO_TX_PACKETS;
1345 sinfo->signal = ar->target_stats.cs_rssi;
1346 sinfo->filled |= STATION_INFO_SIGNAL;
1348 rate = ar->target_stats.tx_ucast_rate;
1350 if (is_rate_legacy(rate)) {
1351 sinfo->txrate.legacy = rate / 100;
1352 } else if (is_rate_ht20(rate, &mcs, &sgi)) {
1354 sinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI;
1355 sinfo->txrate.mcs = mcs - 1;
1357 sinfo->txrate.mcs = mcs;
1360 sinfo->txrate.flags |= RATE_INFO_FLAGS_MCS;
1361 } else if (is_rate_ht40(rate, &mcs, &sgi)) {
1363 sinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI;
1364 sinfo->txrate.mcs = mcs - 1;
1366 sinfo->txrate.mcs = mcs;
1369 sinfo->txrate.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH;
1370 sinfo->txrate.flags |= RATE_INFO_FLAGS_MCS;
1372 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
1373 "invalid rate from stats: %d\n", rate);
1374 ath6kl_debug_war(ar, ATH6KL_WAR_INVALID_RATE);
1378 sinfo->filled |= STATION_INFO_TX_BITRATE;
1380 if (test_bit(CONNECTED, &ar->flag) &&
1381 test_bit(DTIM_PERIOD_AVAIL, &ar->flag) &&
1382 ar->nw_type == INFRA_NETWORK) {
1383 sinfo->filled |= STATION_INFO_BSS_PARAM;
1384 sinfo->bss_param.flags = 0;
1385 sinfo->bss_param.dtim_period = ar->assoc_bss_dtim_period;
1386 sinfo->bss_param.beacon_interval = ar->assoc_bss_beacon_int;
1392 static int ath6kl_set_pmksa(struct wiphy *wiphy, struct net_device *netdev,
1393 struct cfg80211_pmksa *pmksa)
1395 struct ath6kl *ar = ath6kl_priv(netdev);
1396 return ath6kl_wmi_setpmkid_cmd(ar->wmi, pmksa->bssid,
1397 pmksa->pmkid, true);
1400 static int ath6kl_del_pmksa(struct wiphy *wiphy, struct net_device *netdev,
1401 struct cfg80211_pmksa *pmksa)
1403 struct ath6kl *ar = ath6kl_priv(netdev);
1404 return ath6kl_wmi_setpmkid_cmd(ar->wmi, pmksa->bssid,
1405 pmksa->pmkid, false);
1408 static int ath6kl_flush_pmksa(struct wiphy *wiphy, struct net_device *netdev)
1410 struct ath6kl *ar = ath6kl_priv(netdev);
1411 if (test_bit(CONNECTED, &ar->flag))
1412 return ath6kl_wmi_setpmkid_cmd(ar->wmi, ar->bssid, NULL, false);
1417 static int ar6k_cfg80211_suspend(struct wiphy *wiphy,
1418 struct cfg80211_wowlan *wow)
1420 struct ath6kl *ar = wiphy_priv(wiphy);
1422 return ath6kl_hif_suspend(ar);
1426 static int ath6kl_set_channel(struct wiphy *wiphy, struct net_device *dev,
1427 struct ieee80211_channel *chan,
1428 enum nl80211_channel_type channel_type)
1430 struct ath6kl *ar = ath6kl_priv(dev);
1432 if (!ath6kl_cfg80211_ready(ar))
1435 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: center_freq=%u hw_value=%u\n",
1436 __func__, chan->center_freq, chan->hw_value);
1437 ar->next_chan = chan->center_freq;
1442 static bool ath6kl_is_p2p_ie(const u8 *pos)
1444 return pos[0] == WLAN_EID_VENDOR_SPECIFIC && pos[1] >= 4 &&
1445 pos[2] == 0x50 && pos[3] == 0x6f &&
1446 pos[4] == 0x9a && pos[5] == 0x09;
1449 static int ath6kl_set_ap_probe_resp_ies(struct ath6kl *ar, const u8 *ies,
1458 * Filter out P2P IE(s) since they will be included depending on
1459 * the Probe Request frame in ath6kl_send_go_probe_resp().
1462 if (ies && ies_len) {
1463 buf = kmalloc(ies_len, GFP_KERNEL);
1467 while (pos + 1 < ies + ies_len) {
1468 if (pos + 2 + pos[1] > ies + ies_len)
1470 if (!ath6kl_is_p2p_ie(pos)) {
1471 memcpy(buf + len, pos, 2 + pos[1]);
1478 ret = ath6kl_wmi_set_appie_cmd(ar->wmi, WMI_FRAME_PROBE_RESP,
1484 static int ath6kl_ap_beacon(struct wiphy *wiphy, struct net_device *dev,
1485 struct beacon_parameters *info, bool add)
1487 struct ath6kl *ar = ath6kl_priv(dev);
1488 struct ieee80211_mgmt *mgmt;
1491 struct wmi_connect_cmd p;
1495 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: add=%d\n", __func__, add);
1497 if (!ath6kl_cfg80211_ready(ar))
1500 if (ar->next_mode != AP_NETWORK)
1503 if (info->beacon_ies) {
1504 res = ath6kl_wmi_set_appie_cmd(ar->wmi, WMI_FRAME_BEACON,
1506 info->beacon_ies_len);
1510 if (info->proberesp_ies) {
1511 res = ath6kl_set_ap_probe_resp_ies(ar, info->proberesp_ies,
1512 info->proberesp_ies_len);
1516 if (info->assocresp_ies) {
1517 res = ath6kl_wmi_set_appie_cmd(ar->wmi, WMI_FRAME_ASSOC_RESP,
1518 info->assocresp_ies,
1519 info->assocresp_ies_len);
1527 ar->ap_mode_bkey.valid = false;
1534 if (info->head == NULL)
1536 mgmt = (struct ieee80211_mgmt *) info->head;
1537 ies = mgmt->u.beacon.variable;
1538 if (ies > info->head + info->head_len)
1540 ies_len = info->head + info->head_len - ies;
1542 if (info->ssid == NULL)
1544 memcpy(ar->ssid, info->ssid, info->ssid_len);
1545 ar->ssid_len = info->ssid_len;
1546 if (info->hidden_ssid != NL80211_HIDDEN_SSID_NOT_IN_USE)
1547 return -EOPNOTSUPP; /* TODO */
1549 ar->dot11_auth_mode = OPEN_AUTH;
1551 memset(&p, 0, sizeof(p));
1553 for (i = 0; i < info->crypto.n_akm_suites; i++) {
1554 switch (info->crypto.akm_suites[i]) {
1555 case WLAN_AKM_SUITE_8021X:
1556 if (info->crypto.wpa_versions & NL80211_WPA_VERSION_1)
1557 p.auth_mode |= WPA_AUTH;
1558 if (info->crypto.wpa_versions & NL80211_WPA_VERSION_2)
1559 p.auth_mode |= WPA2_AUTH;
1561 case WLAN_AKM_SUITE_PSK:
1562 if (info->crypto.wpa_versions & NL80211_WPA_VERSION_1)
1563 p.auth_mode |= WPA_PSK_AUTH;
1564 if (info->crypto.wpa_versions & NL80211_WPA_VERSION_2)
1565 p.auth_mode |= WPA2_PSK_AUTH;
1569 if (p.auth_mode == 0)
1570 p.auth_mode = NONE_AUTH;
1571 ar->auth_mode = p.auth_mode;
1573 for (i = 0; i < info->crypto.n_ciphers_pairwise; i++) {
1574 switch (info->crypto.ciphers_pairwise[i]) {
1575 case WLAN_CIPHER_SUITE_WEP40:
1576 case WLAN_CIPHER_SUITE_WEP104:
1577 p.prwise_crypto_type |= WEP_CRYPT;
1579 case WLAN_CIPHER_SUITE_TKIP:
1580 p.prwise_crypto_type |= TKIP_CRYPT;
1582 case WLAN_CIPHER_SUITE_CCMP:
1583 p.prwise_crypto_type |= AES_CRYPT;
1587 if (p.prwise_crypto_type == 0) {
1588 p.prwise_crypto_type = NONE_CRYPT;
1589 ath6kl_set_cipher(ar, 0, true);
1590 } else if (info->crypto.n_ciphers_pairwise == 1)
1591 ath6kl_set_cipher(ar, info->crypto.ciphers_pairwise[0], true);
1593 switch (info->crypto.cipher_group) {
1594 case WLAN_CIPHER_SUITE_WEP40:
1595 case WLAN_CIPHER_SUITE_WEP104:
1596 p.grp_crypto_type = WEP_CRYPT;
1598 case WLAN_CIPHER_SUITE_TKIP:
1599 p.grp_crypto_type = TKIP_CRYPT;
1601 case WLAN_CIPHER_SUITE_CCMP:
1602 p.grp_crypto_type = AES_CRYPT;
1605 p.grp_crypto_type = NONE_CRYPT;
1608 ath6kl_set_cipher(ar, info->crypto.cipher_group, false);
1610 p.nw_type = AP_NETWORK;
1611 ar->nw_type = ar->next_mode;
1613 p.ssid_len = ar->ssid_len;
1614 memcpy(p.ssid, ar->ssid, ar->ssid_len);
1615 p.dot11_auth_mode = ar->dot11_auth_mode;
1616 p.ch = cpu_to_le16(ar->next_chan);
1618 res = ath6kl_wmi_ap_profile_commit(ar->wmi, &p);
1625 static int ath6kl_add_beacon(struct wiphy *wiphy, struct net_device *dev,
1626 struct beacon_parameters *info)
1628 return ath6kl_ap_beacon(wiphy, dev, info, true);
1631 static int ath6kl_set_beacon(struct wiphy *wiphy, struct net_device *dev,
1632 struct beacon_parameters *info)
1634 return ath6kl_ap_beacon(wiphy, dev, info, false);
1637 static int ath6kl_del_beacon(struct wiphy *wiphy, struct net_device *dev)
1639 struct ath6kl *ar = ath6kl_priv(dev);
1641 if (ar->nw_type != AP_NETWORK)
1643 if (!test_bit(CONNECTED, &ar->flag))
1646 ath6kl_wmi_disconnect_cmd(ar->wmi);
1647 clear_bit(CONNECTED, &ar->flag);
1652 static int ath6kl_change_station(struct wiphy *wiphy, struct net_device *dev,
1653 u8 *mac, struct station_parameters *params)
1655 struct ath6kl *ar = ath6kl_priv(dev);
1657 if (ar->nw_type != AP_NETWORK)
1660 /* Use this only for authorizing/unauthorizing a station */
1661 if (!(params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED)))
1664 if (params->sta_flags_set & BIT(NL80211_STA_FLAG_AUTHORIZED))
1665 return ath6kl_wmi_ap_set_mlme(ar->wmi, WMI_AP_MLME_AUTHORIZE,
1667 return ath6kl_wmi_ap_set_mlme(ar->wmi, WMI_AP_MLME_UNAUTHORIZE, mac,
1671 static int ath6kl_remain_on_channel(struct wiphy *wiphy,
1672 struct net_device *dev,
1673 struct ieee80211_channel *chan,
1674 enum nl80211_channel_type channel_type,
1675 unsigned int duration,
1678 struct ath6kl *ar = ath6kl_priv(dev);
1680 /* TODO: if already pending or ongoing remain-on-channel,
1682 *cookie = 1; /* only a single pending request is supported */
1684 return ath6kl_wmi_remain_on_chnl_cmd(ar->wmi, chan->center_freq,
1688 static int ath6kl_cancel_remain_on_channel(struct wiphy *wiphy,
1689 struct net_device *dev,
1692 struct ath6kl *ar = ath6kl_priv(dev);
1697 return ath6kl_wmi_cancel_remain_on_chnl_cmd(ar->wmi);
1700 static int ath6kl_send_go_probe_resp(struct ath6kl *ar, const u8 *buf,
1701 size_t len, unsigned int freq)
1707 const struct ieee80211_mgmt *mgmt;
1709 mgmt = (const struct ieee80211_mgmt *) buf;
1711 /* Include P2P IE(s) from the frame generated in user space. */
1713 p2p = kmalloc(len, GFP_KERNEL);
1718 pos = mgmt->u.probe_resp.variable;
1719 while (pos + 1 < buf + len) {
1720 if (pos + 2 + pos[1] > buf + len)
1722 if (ath6kl_is_p2p_ie(pos)) {
1723 memcpy(p2p + p2p_len, pos, 2 + pos[1]);
1724 p2p_len += 2 + pos[1];
1729 ret = ath6kl_wmi_send_probe_response_cmd(ar->wmi, freq, mgmt->da,
1735 static int ath6kl_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,
1736 struct ieee80211_channel *chan, bool offchan,
1737 enum nl80211_channel_type channel_type,
1738 bool channel_type_valid, unsigned int wait,
1739 const u8 *buf, size_t len, bool no_cck,
1740 bool dont_wait_for_ack, u64 *cookie)
1742 struct ath6kl *ar = ath6kl_priv(dev);
1744 const struct ieee80211_mgmt *mgmt;
1746 mgmt = (const struct ieee80211_mgmt *) buf;
1747 if (buf + len >= mgmt->u.probe_resp.variable &&
1748 ar->nw_type == AP_NETWORK && test_bit(CONNECTED, &ar->flag) &&
1749 ieee80211_is_probe_resp(mgmt->frame_control)) {
1751 * Send Probe Response frame in AP mode using a separate WMI
1752 * command to allow the target to fill in the generic IEs.
1754 *cookie = 0; /* TX status not supported */
1755 return ath6kl_send_go_probe_resp(ar, buf, len,
1759 id = ar->send_action_id++;
1762 * 0 is a reserved value in the WMI command and shall not be
1763 * used for the command.
1765 id = ar->send_action_id++;
1769 return ath6kl_wmi_send_action_cmd(ar->wmi, id, chan->center_freq, wait,
1773 static void ath6kl_mgmt_frame_register(struct wiphy *wiphy,
1774 struct net_device *dev,
1775 u16 frame_type, bool reg)
1777 struct ath6kl *ar = ath6kl_priv(dev);
1779 ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "%s: frame_type=0x%x reg=%d\n",
1780 __func__, frame_type, reg);
1781 if (frame_type == IEEE80211_STYPE_PROBE_REQ) {
1783 * Note: This notification callback is not allowed to sleep, so
1784 * we cannot send WMI_PROBE_REQ_REPORT_CMD here. Instead, we
1785 * hardcode target to report Probe Request frames all the time.
1787 ar->probe_req_report = reg;
1791 static const struct ieee80211_txrx_stypes
1792 ath6kl_mgmt_stypes[NUM_NL80211_IFTYPES] = {
1793 [NL80211_IFTYPE_STATION] = {
1794 .tx = BIT(IEEE80211_STYPE_ACTION >> 4) |
1795 BIT(IEEE80211_STYPE_PROBE_RESP >> 4),
1796 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
1797 BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
1799 [NL80211_IFTYPE_P2P_CLIENT] = {
1800 .tx = BIT(IEEE80211_STYPE_ACTION >> 4) |
1801 BIT(IEEE80211_STYPE_PROBE_RESP >> 4),
1802 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
1803 BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
1805 [NL80211_IFTYPE_P2P_GO] = {
1806 .tx = BIT(IEEE80211_STYPE_ACTION >> 4) |
1807 BIT(IEEE80211_STYPE_PROBE_RESP >> 4),
1808 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
1809 BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
1813 static struct cfg80211_ops ath6kl_cfg80211_ops = {
1814 .change_virtual_intf = ath6kl_cfg80211_change_iface,
1815 .scan = ath6kl_cfg80211_scan,
1816 .connect = ath6kl_cfg80211_connect,
1817 .disconnect = ath6kl_cfg80211_disconnect,
1818 .add_key = ath6kl_cfg80211_add_key,
1819 .get_key = ath6kl_cfg80211_get_key,
1820 .del_key = ath6kl_cfg80211_del_key,
1821 .set_default_key = ath6kl_cfg80211_set_default_key,
1822 .set_wiphy_params = ath6kl_cfg80211_set_wiphy_params,
1823 .set_tx_power = ath6kl_cfg80211_set_txpower,
1824 .get_tx_power = ath6kl_cfg80211_get_txpower,
1825 .set_power_mgmt = ath6kl_cfg80211_set_power_mgmt,
1826 .join_ibss = ath6kl_cfg80211_join_ibss,
1827 .leave_ibss = ath6kl_cfg80211_leave_ibss,
1828 .get_station = ath6kl_get_station,
1829 .set_pmksa = ath6kl_set_pmksa,
1830 .del_pmksa = ath6kl_del_pmksa,
1831 .flush_pmksa = ath6kl_flush_pmksa,
1832 CFG80211_TESTMODE_CMD(ath6kl_tm_cmd)
1834 .suspend = ar6k_cfg80211_suspend,
1836 .set_channel = ath6kl_set_channel,
1837 .add_beacon = ath6kl_add_beacon,
1838 .set_beacon = ath6kl_set_beacon,
1839 .del_beacon = ath6kl_del_beacon,
1840 .change_station = ath6kl_change_station,
1841 .remain_on_channel = ath6kl_remain_on_channel,
1842 .cancel_remain_on_channel = ath6kl_cancel_remain_on_channel,
1843 .mgmt_tx = ath6kl_mgmt_tx,
1844 .mgmt_frame_register = ath6kl_mgmt_frame_register,
1847 struct wireless_dev *ath6kl_cfg80211_init(struct device *dev)
1850 struct wireless_dev *wdev;
1853 wdev = kzalloc(sizeof(struct wireless_dev), GFP_KERNEL);
1855 ath6kl_err("couldn't allocate wireless device\n");
1859 /* create a new wiphy for use with cfg80211 */
1860 wdev->wiphy = wiphy_new(&ath6kl_cfg80211_ops, sizeof(struct ath6kl));
1862 ath6kl_err("couldn't allocate wiphy device\n");
1867 ar = wiphy_priv(wdev->wiphy);
1868 ar->p2p = !!ath6kl_p2p;
1870 wdev->wiphy->mgmt_stypes = ath6kl_mgmt_stypes;
1872 wdev->wiphy->max_remain_on_channel_duration = 5000;
1874 /* set device pointer for wiphy */
1875 set_wiphy_dev(wdev->wiphy, dev);
1877 wdev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
1878 BIT(NL80211_IFTYPE_ADHOC) | BIT(NL80211_IFTYPE_AP);
1880 wdev->wiphy->interface_modes |= BIT(NL80211_IFTYPE_P2P_GO) |
1881 BIT(NL80211_IFTYPE_P2P_CLIENT);
1883 /* max num of ssids that can be probed during scanning */
1884 wdev->wiphy->max_scan_ssids = MAX_PROBED_SSID_INDEX;
1885 wdev->wiphy->max_scan_ie_len = 1000; /* FIX: what is correct limit? */
1886 wdev->wiphy->bands[IEEE80211_BAND_2GHZ] = &ath6kl_band_2ghz;
1887 wdev->wiphy->bands[IEEE80211_BAND_5GHZ] = &ath6kl_band_5ghz;
1888 wdev->wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
1890 wdev->wiphy->cipher_suites = cipher_suites;
1891 wdev->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
1893 ret = wiphy_register(wdev->wiphy);
1895 ath6kl_err("couldn't register wiphy device\n");
1896 wiphy_free(wdev->wiphy);
1904 void ath6kl_cfg80211_deinit(struct ath6kl *ar)
1906 struct wireless_dev *wdev = ar->wdev;
1909 cfg80211_scan_done(ar->scan_req, true);
1910 ar->scan_req = NULL;
1916 wiphy_unregister(wdev->wiphy);
1917 wiphy_free(wdev->wiphy);