1 //------------------------------------------------------------------------------
2 // Copyright (c) 2004-2010 Atheros Communications Inc.
3 // All rights reserved.
7 // Permission to use, copy, modify, and/or distribute this software for any
8 // purpose with or without fee is hereby granted, provided that the above
9 // copyright notice and this permission notice appear in all copies.
11 // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21 // Author(s): ="Atheros"
22 //------------------------------------------------------------------------------
24 #include <linux/wireless.h>
25 #include <linux/ieee80211.h>
26 #include <net/cfg80211.h>
28 #include "ar6000_drv.h"
31 extern A_WAITQUEUE_HEAD arEvent;
32 extern unsigned int wmitimeout;
33 extern int reconnect_flag;
36 #define RATETAB_ENT(_rate, _rateid, _flags) { \
39 .hw_value = (_rateid), \
42 #define CHAN2G(_channel, _freq, _flags) { \
43 .band = IEEE80211_BAND_2GHZ, \
44 .hw_value = (_channel), \
45 .center_freq = (_freq), \
47 .max_antenna_gain = 0, \
51 #define CHAN5G(_channel, _flags) { \
52 .band = IEEE80211_BAND_5GHZ, \
53 .hw_value = (_channel), \
54 .center_freq = 5000 + (5 * (_channel)), \
56 .max_antenna_gain = 0, \
61 ieee80211_rate ar6k_rates[] = {
62 RATETAB_ENT(10, 0x1, 0),
63 RATETAB_ENT(20, 0x2, 0),
64 RATETAB_ENT(55, 0x4, 0),
65 RATETAB_ENT(110, 0x8, 0),
66 RATETAB_ENT(60, 0x10, 0),
67 RATETAB_ENT(90, 0x20, 0),
68 RATETAB_ENT(120, 0x40, 0),
69 RATETAB_ENT(180, 0x80, 0),
70 RATETAB_ENT(240, 0x100, 0),
71 RATETAB_ENT(360, 0x200, 0),
72 RATETAB_ENT(480, 0x400, 0),
73 RATETAB_ENT(540, 0x800, 0),
76 #define ar6k_a_rates (ar6k_rates + 4)
77 #define ar6k_a_rates_size 8
78 #define ar6k_g_rates (ar6k_rates + 0)
79 #define ar6k_g_rates_size 12
82 ieee80211_channel ar6k_2ghz_channels[] = {
100 ieee80211_channel ar6k_5ghz_a_channels[] = {
101 CHAN5G(34, 0), CHAN5G(36, 0),
102 CHAN5G(38, 0), CHAN5G(40, 0),
103 CHAN5G(42, 0), CHAN5G(44, 0),
104 CHAN5G(46, 0), CHAN5G(48, 0),
105 CHAN5G(52, 0), CHAN5G(56, 0),
106 CHAN5G(60, 0), CHAN5G(64, 0),
107 CHAN5G(100, 0), CHAN5G(104, 0),
108 CHAN5G(108, 0), CHAN5G(112, 0),
109 CHAN5G(116, 0), CHAN5G(120, 0),
110 CHAN5G(124, 0), CHAN5G(128, 0),
111 CHAN5G(132, 0), CHAN5G(136, 0),
112 CHAN5G(140, 0), CHAN5G(149, 0),
113 CHAN5G(153, 0), CHAN5G(157, 0),
114 CHAN5G(161, 0), CHAN5G(165, 0),
115 CHAN5G(184, 0), CHAN5G(188, 0),
116 CHAN5G(192, 0), CHAN5G(196, 0),
117 CHAN5G(200, 0), CHAN5G(204, 0),
118 CHAN5G(208, 0), CHAN5G(212, 0),
123 ieee80211_supported_band ar6k_band_2ghz = {
124 .n_channels = ARRAY_SIZE(ar6k_2ghz_channels),
125 .channels = ar6k_2ghz_channels,
126 .n_bitrates = ar6k_g_rates_size,
127 .bitrates = ar6k_g_rates,
131 ieee80211_supported_band ar6k_band_5ghz = {
132 .n_channels = ARRAY_SIZE(ar6k_5ghz_a_channels),
133 .channels = ar6k_5ghz_a_channels,
134 .n_bitrates = ar6k_a_rates_size,
135 .bitrates = ar6k_a_rates,
139 ar6k_set_wpa_version(struct ar6_softc *ar, enum nl80211_wpa_versions wpa_version)
142 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: %u\n", __func__, wpa_version));
145 ar->arAuthMode = NONE_AUTH;
146 } else if (wpa_version & NL80211_WPA_VERSION_1) {
147 ar->arAuthMode = WPA_AUTH;
148 } else if (wpa_version & NL80211_WPA_VERSION_2) {
149 ar->arAuthMode = WPA2_AUTH;
151 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
152 ("%s: %u not spported\n", __func__, wpa_version));
160 ar6k_set_auth_type(struct ar6_softc *ar, enum nl80211_auth_type auth_type)
163 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: 0x%x\n", __func__, auth_type));
166 case NL80211_AUTHTYPE_OPEN_SYSTEM:
167 ar->arDot11AuthMode = OPEN_AUTH;
169 case NL80211_AUTHTYPE_SHARED_KEY:
170 ar->arDot11AuthMode = SHARED_AUTH;
172 case NL80211_AUTHTYPE_NETWORK_EAP:
173 ar->arDot11AuthMode = LEAP_AUTH;
176 case NL80211_AUTHTYPE_AUTOMATIC:
177 ar->arDot11AuthMode = OPEN_AUTH;
178 ar->arAutoAuthStage = AUTH_OPEN_IN_PROGRESS;
182 ar->arDot11AuthMode = OPEN_AUTH;
183 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,
184 ("%s: 0x%x not spported\n", __func__, auth_type));
192 ar6k_set_cipher(struct ar6_softc *ar, u32 cipher, bool ucast)
194 u8 *ar_cipher = ucast ? &ar->arPairwiseCrypto :
196 u8 *ar_cipher_len = ucast ? &ar->arPairwiseCryptoLen :
197 &ar->arGroupCryptoLen;
199 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,
200 ("%s: cipher 0x%x, ucast %u\n", __func__, cipher, ucast));
204 case IW_AUTH_CIPHER_NONE:
205 *ar_cipher = NONE_CRYPT;
208 case WLAN_CIPHER_SUITE_WEP40:
209 *ar_cipher = WEP_CRYPT;
212 case WLAN_CIPHER_SUITE_WEP104:
213 *ar_cipher = WEP_CRYPT;
216 case WLAN_CIPHER_SUITE_TKIP:
217 *ar_cipher = TKIP_CRYPT;
220 case WLAN_CIPHER_SUITE_CCMP:
221 *ar_cipher = AES_CRYPT;
225 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
226 ("%s: cipher 0x%x not supported\n", __func__, cipher));
234 ar6k_set_key_mgmt(struct ar6_softc *ar, u32 key_mgmt)
236 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: 0x%x\n", __func__, key_mgmt));
238 if (WLAN_AKM_SUITE_PSK == key_mgmt) {
239 if (WPA_AUTH == ar->arAuthMode) {
240 ar->arAuthMode = WPA_PSK_AUTH;
241 } else if (WPA2_AUTH == ar->arAuthMode) {
242 ar->arAuthMode = WPA2_PSK_AUTH;
244 } else if (WLAN_AKM_SUITE_8021X != key_mgmt) {
245 ar->arAuthMode = NONE_AUTH;
250 ar6k_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
251 struct cfg80211_connect_params *sme)
253 struct ar6_softc *ar = ar6k_priv(dev);
256 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: \n", __func__));
257 ar->smeState = SME_CONNECTING;
259 if(ar->arWmiReady == false) {
260 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wmi not ready yet\n", __func__));
264 if(ar->arWlanState == WLAN_DISABLED) {
265 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wlan disabled\n", __func__));
269 if(ar->bIsDestroyProgress) {
270 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: destroy in progress\n", __func__));
274 if(!sme->ssid_len || IEEE80211_MAX_SSID_LEN < sme->ssid_len) {
275 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: ssid invalid\n", __func__));
279 if(ar->arSkipScan == true &&
280 ((sme->channel && sme->channel->center_freq == 0) ||
281 (sme->bssid && !sme->bssid[0] && !sme->bssid[1] && !sme->bssid[2] &&
282 !sme->bssid[3] && !sme->bssid[4] && !sme->bssid[5])))
284 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s:SkipScan: channel or bssid invalid\n", __func__));
288 if(down_interruptible(&ar->arSem)) {
289 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: busy, couldn't get access\n", __func__));
293 if(ar->bIsDestroyProgress) {
294 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: busy, destroy in progress\n", __func__));
299 if(ar->arTxPending[wmi_get_control_ep(ar->arWmi)]) {
301 * sleep until the command queue drains
303 wait_event_interruptible_timeout(arEvent,
304 ar->arTxPending[wmi_get_control_ep(ar->arWmi)] == 0, wmitimeout * HZ);
305 if (signal_pending(current)) {
306 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: cmd queue drain timeout\n", __func__));
312 if(ar->arConnected == true &&
313 ar->arSsidLen == sme->ssid_len &&
314 !memcmp(ar->arSsid, sme->ssid, ar->arSsidLen)) {
315 reconnect_flag = true;
316 status = wmi_reconnect_cmd(ar->arWmi,
322 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: wmi_reconnect_cmd failed\n", __func__));
326 } else if(ar->arSsidLen == sme->ssid_len &&
327 !memcmp(ar->arSsid, sme->ssid, ar->arSsidLen)) {
328 ar6000_disconnect(ar);
331 A_MEMZERO(ar->arSsid, sizeof(ar->arSsid));
332 ar->arSsidLen = sme->ssid_len;
333 memcpy(ar->arSsid, sme->ssid, sme->ssid_len);
336 ar->arChannelHint = sme->channel->center_freq;
339 A_MEMZERO(ar->arReqBssid, sizeof(ar->arReqBssid));
341 if(memcmp(&sme->bssid, bcast_mac, AR6000_ETH_ADDR_LEN)) {
342 memcpy(ar->arReqBssid, sme->bssid, sizeof(ar->arReqBssid));
346 ar6k_set_wpa_version(ar, sme->crypto.wpa_versions);
347 ar6k_set_auth_type(ar, sme->auth_type);
349 if(sme->crypto.n_ciphers_pairwise) {
350 ar6k_set_cipher(ar, sme->crypto.ciphers_pairwise[0], true);
352 ar6k_set_cipher(ar, IW_AUTH_CIPHER_NONE, true);
354 ar6k_set_cipher(ar, sme->crypto.cipher_group, false);
356 if(sme->crypto.n_akm_suites) {
357 ar6k_set_key_mgmt(ar, sme->crypto.akm_suites[0]);
361 (NONE_AUTH == ar->arAuthMode) &&
362 (WEP_CRYPT == ar->arPairwiseCrypto)) {
363 struct ar_key *key = NULL;
365 if(sme->key_idx < WMI_MIN_KEY_INDEX || sme->key_idx > WMI_MAX_KEY_INDEX) {
366 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
367 ("%s: key index %d out of bounds\n", __func__, sme->key_idx));
372 key = &ar->keys[sme->key_idx];
373 key->key_len = sme->key_len;
374 memcpy(key->key, sme->key, key->key_len);
375 key->cipher = ar->arPairwiseCrypto;
376 ar->arDefTxKeyIndex = sme->key_idx;
378 wmi_addKey_cmd(ar->arWmi, sme->key_idx,
379 ar->arPairwiseCrypto,
380 GROUP_USAGE | TX_USAGE,
383 key->key, KEY_OP_INIT_VAL, NULL,
387 if (!ar->arUserBssFilter) {
388 if (wmi_bssfilter_cmd(ar->arWmi, ALL_BSS_FILTER, 0) != 0) {
389 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Couldn't set bss filtering\n", __func__));
395 ar->arNetworkType = ar->arNextMode;
397 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: Connect called with authmode %d dot11 auth %d"\
398 " PW crypto %d PW crypto Len %d GRP crypto %d"\
399 " GRP crypto Len %d channel hint %u\n",
400 __func__, ar->arAuthMode, ar->arDot11AuthMode,
401 ar->arPairwiseCrypto, ar->arPairwiseCryptoLen,
402 ar->arGroupCrypto, ar->arGroupCryptoLen, ar->arChannelHint));
405 status = wmi_connect_cmd(ar->arWmi, ar->arNetworkType,
406 ar->arDot11AuthMode, ar->arAuthMode,
407 ar->arPairwiseCrypto, ar->arPairwiseCryptoLen,
408 ar->arGroupCrypto,ar->arGroupCryptoLen,
409 ar->arSsidLen, ar->arSsid,
410 ar->arReqBssid, ar->arChannelHint,
411 ar->arConnectCtrlFlags);
415 if (A_EINVAL == status) {
416 A_MEMZERO(ar->arSsid, sizeof(ar->arSsid));
418 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Invalid request\n", __func__));
421 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: wmi_connect_cmd failed\n", __func__));
425 if ((!(ar->arConnectCtrlFlags & CONNECT_DO_WPA_OFFLOAD)) &&
426 ((WPA_PSK_AUTH == ar->arAuthMode) || (WPA2_PSK_AUTH == ar->arAuthMode)))
428 A_TIMEOUT_MS(&ar->disconnect_timer, A_DISCONNECT_TIMER_INTERVAL, 0);
431 ar->arConnectCtrlFlags &= ~CONNECT_DO_WPA_OFFLOAD;
432 ar->arConnectPending = true;
438 ar6k_cfg80211_connect_event(struct ar6_softc *ar, u16 channel,
439 u8 *bssid, u16 listenInterval,
440 u16 beaconInterval,NETWORK_TYPE networkType,
441 u8 beaconIeLen, u8 assocReqLen,
442 u8 assocRespLen, u8 *assocInfo)
446 struct cfg80211_bss *bss = NULL;
447 struct ieee80211_mgmt *mgmt = NULL;
448 struct ieee80211_channel *ibss_channel = NULL;
449 s32 signal = 50 * 100;
451 unsigned char ie_buf[256];
452 unsigned char *ptr_ie_buf = ie_buf;
453 unsigned char *ieeemgmtbuf = NULL;
454 u8 source_mac[ATH_MAC_LEN];
456 u8 assocReqIeOffset = sizeof(u16) + /* capinfo*/
457 sizeof(u16); /* listen interval */
458 u8 assocRespIeOffset = sizeof(u16) + /* capinfo*/
459 sizeof(u16) + /* status Code */
460 sizeof(u16); /* associd */
461 u8 *assocReqIe = assocInfo + beaconIeLen + assocReqIeOffset;
462 u8 *assocRespIe = assocInfo + beaconIeLen + assocReqLen + assocRespIeOffset;
464 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: \n", __func__));
466 assocReqLen -= assocReqIeOffset;
467 assocRespLen -= assocRespIeOffset;
469 ar->arAutoAuthStage = AUTH_IDLE;
471 if((ADHOC_NETWORK & networkType)) {
472 if(NL80211_IFTYPE_ADHOC != ar->wdev->iftype) {
473 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,
474 ("%s: ath6k not in ibss mode\n", __func__));
479 if((INFRA_NETWORK & networkType)) {
480 if(NL80211_IFTYPE_STATION != ar->wdev->iftype) {
481 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,
482 ("%s: ath6k not in station mode\n", __func__));
487 /* Before informing the join/connect event, make sure that
488 * bss entry is present in scan list, if it not present
489 * construct and insert into scan list, otherwise that
490 * event will be dropped on the way by cfg80211, due to
491 * this keys will not be plumbed in case of WEP and
492 * application will not be aware of join/connect status. */
493 bss = cfg80211_get_bss(ar->wdev->wiphy, NULL, bssid,
494 ar->wdev->ssid, ar->wdev->ssid_len,
495 ((ADHOC_NETWORK & networkType) ? WLAN_CAPABILITY_IBSS : WLAN_CAPABILITY_ESS),
496 ((ADHOC_NETWORK & networkType) ? WLAN_CAPABILITY_IBSS : WLAN_CAPABILITY_ESS));
499 * Earlier we were updating the cfg about bss by making a beacon frame
500 * only if the entry for bss is not there. This can have some issue if
501 * ROAM event is generated and a heavy traffic is ongoing. The ROAM
502 * event is handled through a work queue and by the time it really gets
503 * handled, BSS would have been aged out. So it is better to update the
504 * cfg about BSS irrespective of its entry being present right now or
508 if (ADHOC_NETWORK & networkType) {
509 /* construct 802.11 mgmt beacon */
511 *ptr_ie_buf++ = WLAN_EID_SSID;
512 *ptr_ie_buf++ = ar->arSsidLen;
513 memcpy(ptr_ie_buf, ar->arSsid, ar->arSsidLen);
514 ptr_ie_buf +=ar->arSsidLen;
516 *ptr_ie_buf++ = WLAN_EID_IBSS_PARAMS;
517 *ptr_ie_buf++ = 2; /* length */
518 *ptr_ie_buf++ = 0; /* ATIM window */
519 *ptr_ie_buf++ = 0; /* ATIM window */
521 /* TODO: update ibss params and include supported rates,
522 * DS param set, extened support rates, wmm. */
524 ie_buf_len = ptr_ie_buf - ie_buf;
527 capability |= IEEE80211_CAPINFO_IBSS;
528 if(WEP_CRYPT == ar->arPairwiseCrypto) {
529 capability |= IEEE80211_CAPINFO_PRIVACY;
531 memcpy(source_mac, ar->arNetDev->dev_addr, ATH_MAC_LEN);
534 capability = *(u16 *)(&assocInfo[beaconIeLen]);
535 memcpy(source_mac, bssid, ATH_MAC_LEN);
536 ptr_ie_buf = assocReqIe;
537 ie_buf_len = assocReqLen;
540 size = offsetof(struct ieee80211_mgmt, u)
541 + sizeof(mgmt->u.beacon)
544 ieeemgmtbuf = A_MALLOC_NOWAIT(size);
546 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
547 ("%s: ieeeMgmtbuf alloc error\n", __func__));
551 A_MEMZERO(ieeemgmtbuf, size);
552 mgmt = (struct ieee80211_mgmt *)ieeemgmtbuf;
553 mgmt->frame_control = (IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_BEACON);
554 memcpy(mgmt->da, bcast_mac, ATH_MAC_LEN);
555 memcpy(mgmt->sa, source_mac, ATH_MAC_LEN);
556 memcpy(mgmt->bssid, bssid, ATH_MAC_LEN);
557 mgmt->u.beacon.beacon_int = beaconInterval;
558 mgmt->u.beacon.capab_info = capability;
559 memcpy(mgmt->u.beacon.variable, ptr_ie_buf, ie_buf_len);
561 ibss_channel = ieee80211_get_channel(ar->wdev->wiphy, (int)channel);
563 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,
564 ("%s: inform bss with bssid %pM channel %d beaconInterval %d "
565 "capability 0x%x\n", __func__, mgmt->bssid,
566 ibss_channel->hw_value, beaconInterval, capability));
568 bss = cfg80211_inform_bss_frame(ar->wdev->wiphy,
573 cfg80211_put_bss(bss);
575 if((ADHOC_NETWORK & networkType)) {
576 cfg80211_ibss_joined(ar->arNetDev, bssid, GFP_KERNEL);
580 if (false == ar->arConnected) {
581 /* inform connect result to cfg80211 */
582 ar->smeState = SME_DISCONNECTED;
583 cfg80211_connect_result(ar->arNetDev, bssid,
584 assocReqIe, assocReqLen,
585 assocRespIe, assocRespLen,
586 WLAN_STATUS_SUCCESS, GFP_KERNEL);
588 /* inform roam event to cfg80211 */
589 cfg80211_roamed(ar->arNetDev, bssid,
590 assocReqIe, assocReqLen,
591 assocRespIe, assocRespLen,
597 ar6k_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *dev,
600 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
602 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: reason=%u\n", __func__, reason_code));
604 if(ar->arWmiReady == false) {
605 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wmi not ready\n", __func__));
609 if(ar->arWlanState == WLAN_DISABLED) {
610 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wlan disabled\n", __func__));
614 if(ar->bIsDestroyProgress) {
615 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: busy, destroy in progress\n", __func__));
619 if(down_interruptible(&ar->arSem)) {
620 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: busy, couldn't get access\n", __func__));
625 ar6000_disconnect(ar);
626 A_MEMZERO(ar->arSsid, sizeof(ar->arSsid));
629 if (ar->arSkipScan == false) {
630 A_MEMZERO(ar->arReqBssid, sizeof(ar->arReqBssid));
639 ar6k_cfg80211_disconnect_event(struct ar6_softc *ar, u8 reason,
640 u8 *bssid, u8 assocRespLen,
641 u8 *assocInfo, u16 protocolReasonStatus)
646 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: reason=%u\n", __func__, reason));
648 if (ar->scan_request) {
649 cfg80211_scan_done(ar->scan_request, true);
650 ar->scan_request = NULL;
652 if((ADHOC_NETWORK & ar->arNetworkType)) {
653 if(NL80211_IFTYPE_ADHOC != ar->wdev->iftype) {
654 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,
655 ("%s: ath6k not in ibss mode\n", __func__));
658 A_MEMZERO(bssid, ETH_ALEN);
659 cfg80211_ibss_joined(ar->arNetDev, bssid, GFP_KERNEL);
663 if((INFRA_NETWORK & ar->arNetworkType)) {
664 if(NL80211_IFTYPE_STATION != ar->wdev->iftype) {
665 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,
666 ("%s: ath6k not in station mode\n", __func__));
671 if(true == ar->arConnectPending) {
672 if(NO_NETWORK_AVAIL == reason) {
673 /* connect cmd failed */
674 wmi_disconnect_cmd(ar->arWmi);
675 } else if (reason == DISCONNECT_CMD) {
676 if (ar->arAutoAuthStage) {
678 * If the current auth algorithm is open try shared
679 * and make autoAuthStage idle. We do not make it
680 * leap for now being.
682 if (ar->arDot11AuthMode == OPEN_AUTH) {
683 struct ar_key *key = NULL;
684 key = &ar->keys[ar->arDefTxKeyIndex];
685 if (down_interruptible(&ar->arSem)) {
686 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: busy, couldn't get access\n", __func__));
691 ar->arDot11AuthMode = SHARED_AUTH;
692 ar->arAutoAuthStage = AUTH_IDLE;
694 wmi_addKey_cmd(ar->arWmi, ar->arDefTxKeyIndex,
695 ar->arPairwiseCrypto,
696 GROUP_USAGE | TX_USAGE,
699 key->key, KEY_OP_INIT_VAL, NULL,
702 status = wmi_connect_cmd(ar->arWmi,
706 ar->arPairwiseCrypto,
707 ar->arPairwiseCryptoLen,
709 ar->arGroupCryptoLen,
714 ar->arConnectCtrlFlags);
717 } else if (ar->arDot11AuthMode == SHARED_AUTH) {
718 /* should not reach here */
721 ar->arConnectPending = false;
722 if (ar->smeState == SME_CONNECTING) {
723 cfg80211_connect_result(ar->arNetDev, bssid,
726 WLAN_STATUS_UNSPECIFIED_FAILURE,
729 cfg80211_disconnected(ar->arNetDev,
734 ar->smeState = SME_DISCONNECTED;
738 if (reason != DISCONNECT_CMD)
739 wmi_disconnect_cmd(ar->arWmi);
744 ar6k_cfg80211_scan_node(void *arg, bss_t *ni)
746 struct wiphy *wiphy = (struct wiphy *)arg;
748 unsigned char *ieeemgmtbuf = NULL;
749 struct ieee80211_mgmt *mgmt;
750 struct ieee80211_channel *channel;
751 struct ieee80211_supported_band *band;
752 struct ieee80211_common_ie *cie;
758 #define CHAN_IS_11A(x) (!((x >= 2412) && (x <= 2484)))
759 if(CHAN_IS_11A(cie->ie_chan)) {
761 band = wiphy->bands[IEEE80211_BAND_5GHZ];
762 } else if((cie->ie_erp) || (cie->ie_xrates)) {
764 band = wiphy->bands[IEEE80211_BAND_2GHZ];
767 band = wiphy->bands[IEEE80211_BAND_2GHZ];
770 size = ni->ni_framelen + offsetof(struct ieee80211_mgmt, u);
771 ieeemgmtbuf = A_MALLOC_NOWAIT(size);
774 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: ieeeMgmtbuf alloc error\n", __func__));
779 TODO: Update target to include 802.11 mac header while sending bss info.
780 Target removes 802.11 mac header while sending the bss info to host,
781 cfg80211 needs it, for time being just filling the da, sa and bssid fields alone.
783 mgmt = (struct ieee80211_mgmt *)ieeemgmtbuf;
784 memcpy(mgmt->da, bcast_mac, ATH_MAC_LEN);
785 memcpy(mgmt->sa, ni->ni_macaddr, ATH_MAC_LEN);
786 memcpy(mgmt->bssid, ni->ni_macaddr, ATH_MAC_LEN);
787 memcpy(ieeemgmtbuf + offsetof(struct ieee80211_mgmt, u),
788 ni->ni_buf, ni->ni_framelen);
791 channel = ieee80211_get_channel(wiphy, freq);
792 signal = ni->ni_snr * 100;
794 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,
795 ("%s: bssid %pM channel %d freq %d size %d\n", __func__,
796 mgmt->bssid, channel->hw_value, freq, size));
797 cfg80211_inform_bss_frame(wiphy, channel, mgmt,
805 ar6k_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev,
806 struct cfg80211_scan_request *request)
808 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(ndev);
812 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: \n", __func__));
814 if(ar->arWmiReady == false) {
815 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wmi not ready\n", __func__));
819 if(ar->arWlanState == WLAN_DISABLED) {
820 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wlan disabled\n", __func__));
824 if (!ar->arUserBssFilter) {
825 if (wmi_bssfilter_cmd(ar->arWmi,
826 (ar->arConnected ? ALL_BUT_BSS_FILTER : ALL_BSS_FILTER),
828 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Couldn't set bss filtering\n", __func__));
833 if(request->n_ssids &&
834 request->ssids[0].ssid_len) {
837 if(request->n_ssids > (MAX_PROBED_SSID_INDEX - 1)) {
838 request->n_ssids = MAX_PROBED_SSID_INDEX - 1;
841 for (i = 0; i < request->n_ssids; i++) {
842 wmi_probedSsid_cmd(ar->arWmi, i+1, SPECIFIC_SSID_FLAG,
843 request->ssids[i].ssid_len,
844 request->ssids[i].ssid);
848 if(ar->arConnected) {
852 if(wmi_startscan_cmd(ar->arWmi, WMI_LONG_SCAN, forceFgScan, false, \
853 0, 0, 0, NULL) != 0) {
854 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: wmi_startscan_cmd failed\n", __func__));
858 ar->scan_request = request;
864 ar6k_cfg80211_scanComplete_event(struct ar6_softc *ar, int status)
867 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: status %d\n", __func__, status));
871 /* Translate data to cfg80211 mgmt format */
872 wmi_iterate_nodes(ar->arWmi, ar6k_cfg80211_scan_node, ar->wdev->wiphy);
874 cfg80211_scan_done(ar->scan_request,
875 ((status & A_ECANCELED) || (status & A_EBUSY)) ? true : false);
877 if(ar->scan_request->n_ssids &&
878 ar->scan_request->ssids[0].ssid_len) {
881 for (i = 0; i < ar->scan_request->n_ssids; i++) {
882 wmi_probedSsid_cmd(ar->arWmi, i+1, DISABLE_SSID_FLAG,
886 ar->scan_request = NULL;
891 ar6k_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
892 u8 key_index, bool pairwise, const u8 *mac_addr,
893 struct key_params *params)
895 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(ndev);
896 struct ar_key *key = NULL;
901 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s:\n", __func__));
903 if(ar->arWmiReady == false) {
904 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wmi not ready\n", __func__));
908 if(ar->arWlanState == WLAN_DISABLED) {
909 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wlan disabled\n", __func__));
913 if(key_index < WMI_MIN_KEY_INDEX || key_index > WMI_MAX_KEY_INDEX) {
914 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,
915 ("%s: key index %d out of bounds\n", __func__, key_index));
919 key = &ar->keys[key_index];
920 A_MEMZERO(key, sizeof(struct ar_key));
922 if(!mac_addr || is_broadcast_ether_addr(mac_addr)) {
923 key_usage = GROUP_USAGE;
925 key_usage = PAIRWISE_USAGE;
929 if(params->key_len > WLAN_MAX_KEY_LEN ||
930 params->seq_len > IW_ENCODE_SEQ_MAX_SIZE)
933 key->key_len = params->key_len;
934 memcpy(key->key, params->key, key->key_len);
935 key->seq_len = params->seq_len;
936 memcpy(key->seq, params->seq, key->seq_len);
937 key->cipher = params->cipher;
940 switch (key->cipher) {
941 case WLAN_CIPHER_SUITE_WEP40:
942 case WLAN_CIPHER_SUITE_WEP104:
943 key_type = WEP_CRYPT;
946 case WLAN_CIPHER_SUITE_TKIP:
947 key_type = TKIP_CRYPT;
950 case WLAN_CIPHER_SUITE_CCMP:
951 key_type = AES_CRYPT;
958 if (((WPA_PSK_AUTH == ar->arAuthMode) || (WPA2_PSK_AUTH == ar->arAuthMode)) &&
959 (GROUP_USAGE & key_usage))
961 A_UNTIMEOUT(&ar->disconnect_timer);
964 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,
965 ("%s: index %d, key_len %d, key_type 0x%x,"\
966 " key_usage 0x%x, seq_len %d\n",
967 __func__, key_index, key->key_len, key_type,
968 key_usage, key->seq_len));
970 ar->arDefTxKeyIndex = key_index;
971 status = wmi_addKey_cmd(ar->arWmi, ar->arDefTxKeyIndex, key_type, key_usage,
972 key->key_len, key->seq, key->key, KEY_OP_INIT_VAL,
973 (u8 *)mac_addr, SYNC_BOTH_WMIFLAG);
984 ar6k_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev,
985 u8 key_index, bool pairwise, const u8 *mac_addr)
987 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(ndev);
989 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: index %d\n", __func__, key_index));
991 if(ar->arWmiReady == false) {
992 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wmi not ready\n", __func__));
996 if(ar->arWlanState == WLAN_DISABLED) {
997 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wlan disabled\n", __func__));
1001 if(key_index < WMI_MIN_KEY_INDEX || key_index > WMI_MAX_KEY_INDEX) {
1002 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,
1003 ("%s: key index %d out of bounds\n", __func__, key_index));
1007 if(!ar->keys[key_index].key_len) {
1008 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: index %d is empty\n", __func__, key_index));
1012 ar->keys[key_index].key_len = 0;
1014 return wmi_deleteKey_cmd(ar->arWmi, key_index);
1019 ar6k_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev,
1020 u8 key_index, bool pairwise, const u8 *mac_addr,
1022 void (*callback)(void *cookie, struct key_params*))
1024 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(ndev);
1025 struct ar_key *key = NULL;
1026 struct key_params params;
1028 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: index %d\n", __func__, key_index));
1030 if(ar->arWmiReady == false) {
1031 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wmi not ready\n", __func__));
1035 if(ar->arWlanState == WLAN_DISABLED) {
1036 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wlan disabled\n", __func__));
1040 if(key_index < WMI_MIN_KEY_INDEX || key_index > WMI_MAX_KEY_INDEX) {
1041 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,
1042 ("%s: key index %d out of bounds\n", __func__, key_index));
1046 key = &ar->keys[key_index];
1047 A_MEMZERO(¶ms, sizeof(params));
1048 params.cipher = key->cipher;
1049 params.key_len = key->key_len;
1050 params.seq_len = key->seq_len;
1051 params.seq = key->seq;
1052 params.key = key->key;
1054 callback(cookie, ¶ms);
1056 return key->key_len ? 0 : -ENOENT;
1061 ar6k_cfg80211_set_default_key(struct wiphy *wiphy, struct net_device *ndev,
1062 u8 key_index, bool unicast, bool multicast)
1064 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(ndev);
1065 struct ar_key *key = NULL;
1069 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: index %d\n", __func__, key_index));
1071 if(ar->arWmiReady == false) {
1072 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wmi not ready\n", __func__));
1076 if(ar->arWlanState == WLAN_DISABLED) {
1077 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wlan disabled\n", __func__));
1081 if(key_index < WMI_MIN_KEY_INDEX || key_index > WMI_MAX_KEY_INDEX) {
1082 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,
1083 ("%s: key index %d out of bounds\n",
1084 __func__, key_index));
1088 if(!ar->keys[key_index].key_len) {
1089 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: invalid key index %d\n",
1090 __func__, key_index));
1094 ar->arDefTxKeyIndex = key_index;
1095 key = &ar->keys[ar->arDefTxKeyIndex];
1096 key_usage = GROUP_USAGE;
1097 if (WEP_CRYPT == ar->arPairwiseCrypto) {
1098 key_usage |= TX_USAGE;
1101 status = wmi_addKey_cmd(ar->arWmi, ar->arDefTxKeyIndex,
1102 ar->arPairwiseCrypto, key_usage,
1103 key->key_len, key->seq, key->key, KEY_OP_INIT_VAL,
1104 NULL, SYNC_BOTH_WMIFLAG);
1113 ar6k_cfg80211_set_default_mgmt_key(struct wiphy *wiphy, struct net_device *ndev,
1116 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(ndev);
1118 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: index %d\n", __func__, key_index));
1120 if(ar->arWmiReady == false) {
1121 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wmi not ready\n", __func__));
1125 if(ar->arWlanState == WLAN_DISABLED) {
1126 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wlan disabled\n", __func__));
1130 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: not supported\n", __func__));
1135 ar6k_cfg80211_tkip_micerr_event(struct ar6_softc *ar, u8 keyid, bool ismcast)
1137 AR_DEBUG_PRINTF(ATH_DEBUG_INFO,
1138 ("%s: keyid %d, ismcast %d\n", __func__, keyid, ismcast));
1140 cfg80211_michael_mic_failure(ar->arNetDev, ar->arBssid,
1141 (ismcast ? NL80211_KEYTYPE_GROUP : NL80211_KEYTYPE_PAIRWISE),
1142 keyid, NULL, GFP_KERNEL);
1146 ar6k_cfg80211_set_wiphy_params(struct wiphy *wiphy, u32 changed)
1148 struct ar6_softc *ar = (struct ar6_softc *)wiphy_priv(wiphy);
1150 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: changed 0x%x\n", __func__, changed));
1152 if(ar->arWmiReady == false) {
1153 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wmi not ready\n", __func__));
1157 if(ar->arWlanState == WLAN_DISABLED) {
1158 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wlan disabled\n", __func__));
1162 if (changed & WIPHY_PARAM_RTS_THRESHOLD) {
1163 if (wmi_set_rts_cmd(ar->arWmi,wiphy->rts_threshold) != 0){
1164 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: wmi_set_rts_cmd failed\n", __func__));
1173 ar6k_cfg80211_set_bitrate_mask(struct wiphy *wiphy, struct net_device *dev,
1175 const struct cfg80211_bitrate_mask *mask)
1177 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Setting rates: Not supported\n"));
1181 /* The type nl80211_tx_power_setting replaces the following data type from 2.6.36 onwards */
1183 ar6k_cfg80211_set_txpower(struct wiphy *wiphy, enum nl80211_tx_power_setting type, int dbm)
1185 struct ar6_softc *ar = (struct ar6_softc *)wiphy_priv(wiphy);
1188 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: type 0x%x, dbm %d\n", __func__, type, dbm));
1190 if(ar->arWmiReady == false) {
1191 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wmi not ready\n", __func__));
1195 if(ar->arWlanState == WLAN_DISABLED) {
1196 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wlan disabled\n", __func__));
1200 ar->arTxPwrSet = false;
1202 case NL80211_TX_POWER_AUTOMATIC:
1204 case NL80211_TX_POWER_LIMITED:
1205 ar->arTxPwr = ar_dbm = dbm;
1206 ar->arTxPwrSet = true;
1209 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: type 0x%x not supported\n", __func__, type));
1213 wmi_set_txPwr_cmd(ar->arWmi, ar_dbm);
1219 ar6k_cfg80211_get_txpower(struct wiphy *wiphy, int *dbm)
1221 struct ar6_softc *ar = (struct ar6_softc *)wiphy_priv(wiphy);
1223 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: \n", __func__));
1225 if(ar->arWmiReady == false) {
1226 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wmi not ready\n", __func__));
1230 if(ar->arWlanState == WLAN_DISABLED) {
1231 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wlan disabled\n", __func__));
1235 if((ar->arConnected == true)) {
1238 if(wmi_get_txPwr_cmd(ar->arWmi) != 0) {
1239 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: wmi_get_txPwr_cmd failed\n", __func__));
1243 wait_event_interruptible_timeout(arEvent, ar->arTxPwr != 0, 5 * HZ);
1245 if(signal_pending(current)) {
1246 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Target did not respond\n", __func__));
1256 ar6k_cfg80211_set_power_mgmt(struct wiphy *wiphy,
1257 struct net_device *dev,
1258 bool pmgmt, int timeout)
1260 struct ar6_softc *ar = ar6k_priv(dev);
1261 WMI_POWER_MODE_CMD pwrMode;
1263 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: pmgmt %d, timeout %d\n", __func__, pmgmt, timeout));
1265 if(ar->arWmiReady == false) {
1266 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wmi not ready\n", __func__));
1270 if(ar->arWlanState == WLAN_DISABLED) {
1271 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wlan disabled\n", __func__));
1276 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: Max Perf\n", __func__));
1277 pwrMode.powerMode = REC_POWER;
1279 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: Rec Power\n", __func__));
1280 pwrMode.powerMode = MAX_PERF_POWER;
1283 if(wmi_powermode_cmd(ar->arWmi, pwrMode.powerMode) != 0) {
1284 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: wmi_powermode_cmd failed\n", __func__));
1291 static struct net_device *
1292 ar6k_cfg80211_add_virtual_intf(struct wiphy *wiphy, char *name,
1293 enum nl80211_iftype type, u32 *flags,
1294 struct vif_params *params)
1297 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: not supported\n", __func__));
1299 /* Multiple virtual interface is not supported.
1300 * The default interface supports STA and IBSS type
1302 return ERR_PTR(-EOPNOTSUPP);
1306 ar6k_cfg80211_del_virtual_intf(struct wiphy *wiphy, struct net_device *dev)
1309 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: not supported\n", __func__));
1311 /* Multiple virtual interface is not supported.
1312 * The default interface supports STA and IBSS type
1318 ar6k_cfg80211_change_iface(struct wiphy *wiphy, struct net_device *ndev,
1319 enum nl80211_iftype type, u32 *flags,
1320 struct vif_params *params)
1322 struct ar6_softc *ar = ar6k_priv(ndev);
1323 struct wireless_dev *wdev = ar->wdev;
1325 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: type %u\n", __func__, type));
1327 if(ar->arWmiReady == false) {
1328 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wmi not ready\n", __func__));
1332 if(ar->arWlanState == WLAN_DISABLED) {
1333 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wlan disabled\n", __func__));
1338 case NL80211_IFTYPE_STATION:
1339 ar->arNextMode = INFRA_NETWORK;
1341 case NL80211_IFTYPE_ADHOC:
1342 ar->arNextMode = ADHOC_NETWORK;
1345 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: type %u\n", __func__, type));
1349 wdev->iftype = type;
1355 ar6k_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *dev,
1356 struct cfg80211_ibss_params *ibss_param)
1358 struct ar6_softc *ar = ar6k_priv(dev);
1361 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: \n", __func__));
1363 if(ar->arWmiReady == false) {
1364 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wmi not ready\n", __func__));
1368 if(ar->arWlanState == WLAN_DISABLED) {
1369 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wlan disabled\n", __func__));
1373 if(!ibss_param->ssid_len || IEEE80211_MAX_SSID_LEN < ibss_param->ssid_len) {
1374 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: ssid invalid\n", __func__));
1378 ar->arSsidLen = ibss_param->ssid_len;
1379 memcpy(ar->arSsid, ibss_param->ssid, ar->arSsidLen);
1381 if(ibss_param->channel) {
1382 ar->arChannelHint = ibss_param->channel->center_freq;
1385 if(ibss_param->channel_fixed) {
1386 /* TODO: channel_fixed: The channel should be fixed, do not search for
1387 * IBSSs to join on other channels. Target firmware does not support this
1388 * feature, needs to be updated.*/
1391 A_MEMZERO(ar->arReqBssid, sizeof(ar->arReqBssid));
1392 if(ibss_param->bssid) {
1393 if(memcmp(&ibss_param->bssid, bcast_mac, AR6000_ETH_ADDR_LEN)) {
1394 memcpy(ar->arReqBssid, ibss_param->bssid, sizeof(ar->arReqBssid));
1398 ar6k_set_wpa_version(ar, 0);
1399 ar6k_set_auth_type(ar, NL80211_AUTHTYPE_OPEN_SYSTEM);
1401 if(ibss_param->privacy) {
1402 ar6k_set_cipher(ar, WLAN_CIPHER_SUITE_WEP40, true);
1403 ar6k_set_cipher(ar, WLAN_CIPHER_SUITE_WEP40, false);
1405 ar6k_set_cipher(ar, IW_AUTH_CIPHER_NONE, true);
1406 ar6k_set_cipher(ar, IW_AUTH_CIPHER_NONE, false);
1409 ar->arNetworkType = ar->arNextMode;
1411 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: Connect called with authmode %d dot11 auth %d"\
1412 " PW crypto %d PW crypto Len %d GRP crypto %d"\
1413 " GRP crypto Len %d channel hint %u\n",
1414 __func__, ar->arAuthMode, ar->arDot11AuthMode,
1415 ar->arPairwiseCrypto, ar->arPairwiseCryptoLen,
1416 ar->arGroupCrypto, ar->arGroupCryptoLen, ar->arChannelHint));
1418 status = wmi_connect_cmd(ar->arWmi, ar->arNetworkType,
1419 ar->arDot11AuthMode, ar->arAuthMode,
1420 ar->arPairwiseCrypto, ar->arPairwiseCryptoLen,
1421 ar->arGroupCrypto,ar->arGroupCryptoLen,
1422 ar->arSsidLen, ar->arSsid,
1423 ar->arReqBssid, ar->arChannelHint,
1424 ar->arConnectCtrlFlags);
1425 ar->arConnectPending = true;
1431 ar6k_cfg80211_leave_ibss(struct wiphy *wiphy, struct net_device *dev)
1433 struct ar6_softc *ar = (struct ar6_softc *)ar6k_priv(dev);
1435 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: \n", __func__));
1437 if(ar->arWmiReady == false) {
1438 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wmi not ready\n", __func__));
1442 if(ar->arWlanState == WLAN_DISABLED) {
1443 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: Wlan disabled\n", __func__));
1447 ar6000_disconnect(ar);
1448 A_MEMZERO(ar->arSsid, sizeof(ar->arSsid));
1456 u32 cipher_suites[] = {
1457 WLAN_CIPHER_SUITE_WEP40,
1458 WLAN_CIPHER_SUITE_WEP104,
1459 WLAN_CIPHER_SUITE_TKIP,
1460 WLAN_CIPHER_SUITE_CCMP,
1464 cfg80211_ops ar6k_cfg80211_ops = {
1465 .change_virtual_intf = ar6k_cfg80211_change_iface,
1466 .add_virtual_intf = ar6k_cfg80211_add_virtual_intf,
1467 .del_virtual_intf = ar6k_cfg80211_del_virtual_intf,
1468 .scan = ar6k_cfg80211_scan,
1469 .connect = ar6k_cfg80211_connect,
1470 .disconnect = ar6k_cfg80211_disconnect,
1471 .add_key = ar6k_cfg80211_add_key,
1472 .get_key = ar6k_cfg80211_get_key,
1473 .del_key = ar6k_cfg80211_del_key,
1474 .set_default_key = ar6k_cfg80211_set_default_key,
1475 .set_default_mgmt_key = ar6k_cfg80211_set_default_mgmt_key,
1476 .set_wiphy_params = ar6k_cfg80211_set_wiphy_params,
1477 .set_bitrate_mask = ar6k_cfg80211_set_bitrate_mask,
1478 .set_tx_power = ar6k_cfg80211_set_txpower,
1479 .get_tx_power = ar6k_cfg80211_get_txpower,
1480 .set_power_mgmt = ar6k_cfg80211_set_power_mgmt,
1481 .join_ibss = ar6k_cfg80211_join_ibss,
1482 .leave_ibss = ar6k_cfg80211_leave_ibss,
1485 struct wireless_dev *
1486 ar6k_cfg80211_init(struct device *dev)
1489 struct wireless_dev *wdev;
1491 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: \n", __func__));
1493 wdev = kzalloc(sizeof(struct wireless_dev), GFP_KERNEL);
1495 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
1496 ("%s: Couldn't allocate wireless device\n", __func__));
1497 return ERR_PTR(-ENOMEM);
1500 /* create a new wiphy for use with cfg80211 */
1501 wdev->wiphy = wiphy_new(&ar6k_cfg80211_ops, sizeof(struct ar6_softc));
1503 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
1504 ("%s: Couldn't allocate wiphy device\n", __func__));
1506 return ERR_PTR(-ENOMEM);
1509 /* set device pointer for wiphy */
1510 set_wiphy_dev(wdev->wiphy, dev);
1512 wdev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
1513 BIT(NL80211_IFTYPE_ADHOC);
1514 /* max num of ssids that can be probed during scanning */
1515 wdev->wiphy->max_scan_ssids = MAX_PROBED_SSID_INDEX;
1516 wdev->wiphy->bands[IEEE80211_BAND_2GHZ] = &ar6k_band_2ghz;
1517 wdev->wiphy->bands[IEEE80211_BAND_5GHZ] = &ar6k_band_5ghz;
1518 wdev->wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
1520 wdev->wiphy->cipher_suites = cipher_suites;
1521 wdev->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
1523 ret = wiphy_register(wdev->wiphy);
1525 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
1526 ("%s: Couldn't register wiphy device\n", __func__));
1527 wiphy_free(wdev->wiphy);
1528 return ERR_PTR(ret);
1535 ar6k_cfg80211_deinit(struct ar6_softc *ar)
1537 struct wireless_dev *wdev = ar->wdev;
1539 AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%s: \n", __func__));
1541 if(ar->scan_request) {
1542 cfg80211_scan_done(ar->scan_request, true);
1543 ar->scan_request = NULL;
1549 wiphy_unregister(wdev->wiphy);
1550 wiphy_free(wdev->wiphy);