1 /******************************************************************************
3 * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 ******************************************************************************/
20 #define _RTW_IOCTL_SET_C_
23 #include <osdep_service.h>
24 #include <drv_types.h>
25 #include <rtw_ioctl_set.h>
28 #include <usb_osintf.h>
31 extern void indicate_wx_scan_complete_event(struct adapter *padapter);
33 #define IS_MAC_ADDRESS_BROADCAST(addr) \
35 ((addr[0] == 0xff) && (addr[1] == 0xff) && \
36 (addr[2] == 0xff) && (addr[3] == 0xff) && \
37 (addr[4] == 0xff) && (addr[5] == 0xff)) ? true : false \
40 u8 rtw_validate_ssid(struct ndis_802_11_ssid *ssid)
46 if (ssid->SsidLength > 32) {
47 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("ssid length >32\n"));
52 for (i = 0; i < ssid->SsidLength; i++) {
53 /* wifi, printable ascii code must be supported */
54 if (!((ssid->Ssid[i] >= 0x20) && (ssid->Ssid[i] <= 0x7e))) {
55 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("ssid has nonprintabl ascii\n"));
66 u8 rtw_do_join(struct adapter *padapter)
68 struct list_head *plist, *phead;
70 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
71 struct __queue *queue = &(pmlmepriv->scanned_queue);
75 spin_lock_bh(&(pmlmepriv->scanned_queue.lock));
76 phead = get_list_head(queue);
79 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("\n rtw_do_join: phead = %p; plist = %p\n\n\n", phead, plist));
81 pmlmepriv->cur_network.join_res = -2;
83 set_fwstate(pmlmepriv, _FW_UNDER_LINKING);
85 pmlmepriv->pscanned = plist;
87 pmlmepriv->to_join = true;
89 if (_rtw_queue_empty(queue)) {
90 spin_unlock_bh(&(pmlmepriv->scanned_queue.lock));
91 _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
93 /* when set_ssid/set_bssid for rtw_do_join(), but scanning queue is empty */
94 /* we try to issue sitesurvey firstly */
96 if (!pmlmepriv->LinkDetectInfo.bBusyTraffic ||
97 pmlmepriv->to_roaming > 0) {
98 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("rtw_do_join(): site survey if scanned_queue is empty\n."));
99 /* submit site_survey_cmd */
100 ret = rtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid, 1, NULL, 0);
101 if (_SUCCESS != ret) {
102 pmlmepriv->to_join = false;
103 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("rtw_do_join(): site survey return error\n."));
106 pmlmepriv->to_join = false;
114 spin_unlock_bh(&(pmlmepriv->scanned_queue.lock));
115 select_ret = rtw_select_and_join_from_scanned_queue(pmlmepriv);
116 if (select_ret == _SUCCESS) {
117 pmlmepriv->to_join = false;
118 _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT);
120 if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == true) {
121 /* submit createbss_cmd to change to a ADHOC_MASTER */
123 /* pmlmepriv->lock has been acquired by caller... */
124 struct wlan_bssid_ex *pdev_network = &(padapter->registrypriv.dev_network);
126 pmlmepriv->fw_state = WIFI_ADHOC_MASTER_STATE;
128 pibss = padapter->registrypriv.dev_network.MacAddress;
130 _rtw_memset(&pdev_network->Ssid, 0, sizeof(struct ndis_802_11_ssid));
131 memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(struct ndis_802_11_ssid));
133 rtw_update_registrypriv_dev_network(padapter);
135 rtw_generate_random_ibss(pibss);
137 if (rtw_createbss_cmd(padapter) != _SUCCESS) {
138 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("***Error =>do_goin: rtw_createbss_cmd status FAIL***\n "));
142 pmlmepriv->to_join = false;
144 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_,
145 ("***Error => rtw_select_and_join_from_scanned_queue FAIL under STA_Mode***\n "));
147 /* can't associate ; reset under-linking */
148 _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
150 /* when set_ssid/set_bssid for rtw_do_join(), but there are no desired bss in scanning queue */
151 /* we try to issue sitesurvey firstly */
152 if (!pmlmepriv->LinkDetectInfo.bBusyTraffic ||
153 pmlmepriv->to_roaming > 0) {
154 ret = rtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid, 1, NULL, 0);
155 if (_SUCCESS != ret) {
156 pmlmepriv->to_join = false;
157 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("do_join(): site survey return error\n."));
161 pmlmepriv->to_join = false;
173 u8 rtw_set_802_11_bssid(struct adapter *padapter, u8 *bssid)
175 u8 status = _SUCCESS;
177 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
180 DBG_88E_LEVEL(_drv_info_, "set bssid:%pM\n", bssid);
182 if ((bssid[0] == 0x00 && bssid[1] == 0x00 && bssid[2] == 0x00 &&
183 bssid[3] == 0x00 && bssid[4] == 0x00 && bssid[5] == 0x00) ||
184 (bssid[0] == 0xFF && bssid[1] == 0xFF && bssid[2] == 0xFF &&
185 bssid[3] == 0xFF && bssid[4] == 0xFF && bssid[5] == 0xFF)) {
190 spin_lock_bh(&pmlmepriv->lock);
193 DBG_88E("Set BSSID under fw_state = 0x%08x\n", get_fwstate(pmlmepriv));
194 if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == true)
195 goto handle_tkip_countermeasure;
196 else if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING))
197 goto release_mlme_lock;
199 if (check_fwstate(pmlmepriv, _FW_LINKED|WIFI_ADHOC_MASTER_STATE)) {
200 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("set_bssid: _FW_LINKED||WIFI_ADHOC_MASTER_STATE\n"));
202 if (!memcmp(&pmlmepriv->cur_network.network.MacAddress, bssid, ETH_ALEN)) {
203 if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == false)
204 goto release_mlme_lock;/* it means driver is in WIFI_ADHOC_MASTER_STATE, we needn't create bss again. */
206 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("Set BSSID not the same bssid\n"));
207 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("set_bssid =%pM\n", (bssid)));
208 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("cur_bssid =%pM\n", (pmlmepriv->cur_network.network.MacAddress)));
210 rtw_disassoc_cmd(padapter, 0, true);
212 if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
213 rtw_indicate_disconnect(padapter);
215 rtw_free_assoc_resources(padapter, 1);
217 if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == true)) {
218 _clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE);
219 set_fwstate(pmlmepriv, WIFI_ADHOC_STATE);
224 handle_tkip_countermeasure:
225 /* should we add something here...? */
227 if (padapter->securitypriv.btkip_countermeasure) {
230 if ((cur_time - padapter->securitypriv.btkip_countermeasure_time) > 60 * HZ) {
231 padapter->securitypriv.btkip_countermeasure = false;
232 padapter->securitypriv.btkip_countermeasure_time = 0;
235 goto release_mlme_lock;
239 memcpy(&pmlmepriv->assoc_bssid, bssid, ETH_ALEN);
240 pmlmepriv->assoc_by_bssid = true;
242 if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY))
243 pmlmepriv->to_join = true;
245 status = rtw_do_join(padapter);
248 spin_unlock_bh(&pmlmepriv->lock);
251 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
252 ("rtw_set_802_11_bssid: status=%d\n", status));
258 u8 rtw_set_802_11_ssid(struct adapter *padapter, struct ndis_802_11_ssid *ssid)
260 u8 status = _SUCCESS;
263 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
264 struct wlan_network *pnetwork = &pmlmepriv->cur_network;
267 DBG_88E_LEVEL(_drv_info_, "set ssid [%s] fw_state=0x%08x\n",
268 ssid->Ssid, get_fwstate(pmlmepriv));
270 if (!padapter->hw_init_completed) {
271 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
272 ("set_ssid: hw_init_completed == false =>exit!!!\n"));
277 spin_lock_bh(&pmlmepriv->lock);
279 DBG_88E("Set SSID under fw_state = 0x%08x\n", get_fwstate(pmlmepriv));
280 if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == true)
281 goto handle_tkip_countermeasure;
282 else if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == true)
283 goto release_mlme_lock;
285 if (check_fwstate(pmlmepriv, _FW_LINKED|WIFI_ADHOC_MASTER_STATE)) {
286 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_,
287 ("set_ssid: _FW_LINKED||WIFI_ADHOC_MASTER_STATE\n"));
289 if ((pmlmepriv->assoc_ssid.SsidLength == ssid->SsidLength) &&
290 (!memcmp(&pmlmepriv->assoc_ssid.Ssid, ssid->Ssid, ssid->SsidLength))) {
291 if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == false)) {
292 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
293 ("Set SSID is the same ssid, fw_state = 0x%08x\n",
294 get_fwstate(pmlmepriv)));
296 if (!rtw_is_same_ibss(padapter, pnetwork)) {
297 /* if in WIFI_ADHOC_MASTER_STATE | WIFI_ADHOC_STATE, create bss or rejoin again */
298 rtw_disassoc_cmd(padapter, 0, true);
300 if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
301 rtw_indicate_disconnect(padapter);
303 rtw_free_assoc_resources(padapter, 1);
305 if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == true) {
306 _clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE);
307 set_fwstate(pmlmepriv, WIFI_ADHOC_STATE);
310 goto release_mlme_lock;/* it means driver is in WIFI_ADHOC_MASTER_STATE, we needn't create bss again. */
313 rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_JOINBSS, 1);
316 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("Set SSID not the same ssid\n"));
317 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("set_ssid =[%s] len = 0x%x\n", ssid->Ssid, (unsigned int)ssid->SsidLength));
318 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("assoc_ssid =[%s] len = 0x%x\n", pmlmepriv->assoc_ssid.Ssid, (unsigned int)pmlmepriv->assoc_ssid.SsidLength));
320 rtw_disassoc_cmd(padapter, 0, true);
322 if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
323 rtw_indicate_disconnect(padapter);
325 rtw_free_assoc_resources(padapter, 1);
327 if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == true) {
328 _clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE);
329 set_fwstate(pmlmepriv, WIFI_ADHOC_STATE);
334 handle_tkip_countermeasure:
336 if (padapter->securitypriv.btkip_countermeasure) {
339 if ((cur_time - padapter->securitypriv.btkip_countermeasure_time) > 60 * HZ) {
340 padapter->securitypriv.btkip_countermeasure = false;
341 padapter->securitypriv.btkip_countermeasure_time = 0;
344 goto release_mlme_lock;
348 memcpy(&pmlmepriv->assoc_ssid, ssid, sizeof(struct ndis_802_11_ssid));
349 pmlmepriv->assoc_by_bssid = false;
351 if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == true)
352 pmlmepriv->to_join = true;
354 status = rtw_do_join(padapter);
357 spin_unlock_bh(&pmlmepriv->lock);
360 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
361 ("-rtw_set_802_11_ssid: status =%d\n", status));
365 u8 rtw_set_802_11_infrastructure_mode(struct adapter *padapter,
366 enum ndis_802_11_network_infra networktype)
368 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
369 struct wlan_network *cur_network = &pmlmepriv->cur_network;
370 enum ndis_802_11_network_infra *pold_state = &(cur_network->network.InfrastructureMode);
373 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_notice_,
374 ("+rtw_set_802_11_infrastructure_mode: old =%d new =%d fw_state = 0x%08x\n",
375 *pold_state, networktype, get_fwstate(pmlmepriv)));
377 if (*pold_state != networktype) {
378 spin_lock_bh(&pmlmepriv->lock);
380 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, (" change mode!"));
381 /* DBG_88E("change mode, old_mode =%d, new_mode =%d, fw_state = 0x%x\n", *pold_state, networktype, get_fwstate(pmlmepriv)); */
383 if (*pold_state == Ndis802_11APMode) {
384 /* change to other mode from Ndis802_11APMode */
385 cur_network->join_res = -1;
387 #ifdef CONFIG_88EU_AP_MODE
388 stop_ap_mode(padapter);
392 if ((check_fwstate(pmlmepriv, _FW_LINKED)) ||
393 (*pold_state == Ndis802_11IBSS))
394 rtw_disassoc_cmd(padapter, 0, true);
396 if ((check_fwstate(pmlmepriv, _FW_LINKED)) ||
397 (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)))
398 rtw_free_assoc_resources(padapter, 1);
400 if ((*pold_state == Ndis802_11Infrastructure) || (*pold_state == Ndis802_11IBSS)) {
401 if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
402 rtw_indicate_disconnect(padapter); /* will clr Linked_state; before this function, we must have checked whether issue dis-assoc_cmd or not */
405 *pold_state = networktype;
407 _clr_fwstate_(pmlmepriv, ~WIFI_NULL_STATE);
409 switch (networktype) {
411 set_fwstate(pmlmepriv, WIFI_ADHOC_STATE);
413 case Ndis802_11Infrastructure:
414 set_fwstate(pmlmepriv, WIFI_STATION_STATE);
416 case Ndis802_11APMode:
417 set_fwstate(pmlmepriv, WIFI_AP_STATE);
418 #ifdef CONFIG_88EU_AP_MODE
419 start_ap_mode(padapter);
422 case Ndis802_11AutoUnknown:
423 case Ndis802_11InfrastructureMax:
426 spin_unlock_bh(&pmlmepriv->lock);
434 u8 rtw_set_802_11_disassociate(struct adapter *padapter)
436 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
439 spin_lock_bh(&pmlmepriv->lock);
441 if (check_fwstate(pmlmepriv, _FW_LINKED)) {
442 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_,
443 ("MgntActrtw_set_802_11_disassociate: rtw_indicate_disconnect\n"));
445 rtw_disassoc_cmd(padapter, 0, true);
446 rtw_indicate_disconnect(padapter);
447 rtw_free_assoc_resources(padapter, 1);
448 rtw_pwr_wakeup(padapter);
451 spin_unlock_bh(&pmlmepriv->lock);
457 u8 rtw_set_802_11_bssid_list_scan(struct adapter *padapter, struct ndis_802_11_ssid *pssid, int ssid_max_num)
459 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
463 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("+rtw_set_802_11_bssid_list_scan(), fw_state =%x\n", get_fwstate(pmlmepriv)));
465 if (padapter == NULL) {
469 if (!padapter->hw_init_completed) {
471 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("\n === rtw_set_802_11_bssid_list_scan:hw_init_completed == false ===\n"));
475 if ((check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING)) ||
476 (pmlmepriv->LinkDetectInfo.bBusyTraffic)) {
477 /* Scan or linking is in progress, do nothing. */
478 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("rtw_set_802_11_bssid_list_scan fail since fw_state = %x\n", get_fwstate(pmlmepriv)));
481 if (check_fwstate(pmlmepriv,
482 (_FW_UNDER_SURVEY|_FW_UNDER_LINKING)) == true)
483 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("\n###_FW_UNDER_SURVEY|_FW_UNDER_LINKING\n\n"));
485 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("\n###pmlmepriv->sitesurveyctrl.traffic_busy == true\n\n"));
488 if (rtw_is_scan_deny(padapter)) {
489 DBG_88E(FUNC_ADPT_FMT": scan deny\n", FUNC_ADPT_ARG(padapter));
490 indicate_wx_scan_complete_event(padapter);
494 spin_lock_bh(&pmlmepriv->lock);
496 res = rtw_sitesurvey_cmd(padapter, pssid, ssid_max_num, NULL, 0);
498 spin_unlock_bh(&pmlmepriv->lock);
506 u8 rtw_set_802_11_authentication_mode(struct adapter *padapter, enum ndis_802_11_auth_mode authmode)
508 struct security_priv *psecuritypriv = &padapter->securitypriv;
513 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("set_802_11_auth.mode(): mode =%x\n", authmode));
515 psecuritypriv->ndisauthtype = authmode;
517 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_,
518 ("rtw_set_802_11_authentication_mode:psecuritypriv->ndisauthtype=%d",
519 psecuritypriv->ndisauthtype));
521 if (psecuritypriv->ndisauthtype > 3)
522 psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X;
524 res = rtw_set_auth(padapter, psecuritypriv);
535 u8 rtw_set_802_11_add_wep(struct adapter *padapter, struct ndis_802_11_wep *wep)
538 struct security_priv *psecuritypriv = &(padapter->securitypriv);
542 keyid = wep->KeyIndex & 0x3fffffff;
545 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("MgntActrtw_set_802_11_add_wep:keyid>4 =>fail\n"));
550 switch (wep->KeyLength) {
552 psecuritypriv->dot11PrivacyAlgrthm = _WEP40_;
553 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("MgntActrtw_set_802_11_add_wep:wep->KeyLength = 5\n"));
556 psecuritypriv->dot11PrivacyAlgrthm = _WEP104_;
557 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("MgntActrtw_set_802_11_add_wep:wep->KeyLength = 13\n"));
560 psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_;
561 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("MgntActrtw_set_802_11_add_wep:wep->KeyLength!= 5 or 13\n"));
564 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_,
565 ("rtw_set_802_11_add_wep:before memcpy, wep->KeyLength = 0x%x wep->KeyIndex = 0x%x keyid =%x\n",
566 wep->KeyLength, wep->KeyIndex, keyid));
568 memcpy(&(psecuritypriv->dot11DefKey[keyid].skey[0]), &(wep->KeyMaterial), wep->KeyLength);
570 psecuritypriv->dot11DefKeylen[keyid] = wep->KeyLength;
572 psecuritypriv->dot11PrivacyKeyIndex = keyid;
574 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_,
575 ("rtw_set_802_11_add_wep:security key material : %x %x %x %x %x %x %x %x %x %x %x %x %x\n",
576 psecuritypriv->dot11DefKey[keyid].skey[0],
577 psecuritypriv->dot11DefKey[keyid].skey[1],
578 psecuritypriv->dot11DefKey[keyid].skey[2],
579 psecuritypriv->dot11DefKey[keyid].skey[3],
580 psecuritypriv->dot11DefKey[keyid].skey[4],
581 psecuritypriv->dot11DefKey[keyid].skey[5],
582 psecuritypriv->dot11DefKey[keyid].skey[6],
583 psecuritypriv->dot11DefKey[keyid].skey[7],
584 psecuritypriv->dot11DefKey[keyid].skey[8],
585 psecuritypriv->dot11DefKey[keyid].skey[9],
586 psecuritypriv->dot11DefKey[keyid].skey[10],
587 psecuritypriv->dot11DefKey[keyid].skey[11],
588 psecuritypriv->dot11DefKey[keyid].skey[12]));
590 res = rtw_set_key(padapter, psecuritypriv, keyid, 1);
598 u8 rtw_set_802_11_remove_wep(struct adapter *padapter, u32 keyindex)
602 if (keyindex >= 0x80000000 || padapter == NULL) {
607 struct security_priv *psecuritypriv = &(padapter->securitypriv);
609 _rtw_memset(&psecuritypriv->dot11DefKey[keyindex], 0, 16);
610 res = rtw_set_key(padapter, psecuritypriv, keyindex, 0);
611 psecuritypriv->dot11DefKeylen[keyindex] = 0;
623 u8 rtw_set_802_11_add_key(struct adapter *padapter, struct ndis_802_11_key *key)
627 struct sta_info *stainfo;
629 u8 bgrouptkey = false;/* can be removed later */
633 if (((key->KeyIndex & 0x80000000) == 0) && ((key->KeyIndex & 0x40000000) > 0)) {
634 /* It is invalid to clear bit 31 and set bit 30. If the miniport driver encounters this combination, */
635 /* it must fail the request and return NDIS_STATUS_INVALID_DATA. */
636 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_,
637 ("rtw_set_802_11_add_key: ((key->KeyIndex & 0x80000000)==0)[=%d]",
638 (int)(key->KeyIndex & 0x80000000) == 0));
639 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_,
640 ("rtw_set_802_11_add_key:((key->KeyIndex & 0x40000000)>0)[=%d]",
641 (int)(key->KeyIndex & 0x40000000) > 0));
642 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_,
643 ("rtw_set_802_11_add_key: key->KeyIndex=%d\n",
644 (int)key->KeyIndex));
649 if (key->KeyIndex & 0x40000000) {
652 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("OID_802_11_ADD_KEY: +++++ Pairwise key +++++\n"));
654 pbssid = get_bssid(&padapter->mlmepriv);
655 stainfo = rtw_get_stainfo(&padapter->stapriv, pbssid);
657 if ((stainfo != NULL) && (padapter->securitypriv.dot11AuthAlgrthm == dot11AuthAlgrthm_8021X)) {
658 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
659 ("OID_802_11_ADD_KEY:(stainfo!=NULL)&&(Adapter->securitypriv.dot11AuthAlgrthm==dot11AuthAlgrthm_8021X)\n"));
660 encryptionalgo = stainfo->dot118021XPrivacy;
662 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("OID_802_11_ADD_KEY: stainfo == NULL)||(Adapter->securitypriv.dot11AuthAlgrthm!= dot11AuthAlgrthm_8021X)\n"));
663 encryptionalgo = padapter->securitypriv.dot11PrivacyAlgrthm;
666 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
667 ("rtw_set_802_11_add_key: (encryptionalgo==%d)!\n",
669 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
670 ("rtw_set_802_11_add_key: (Adapter->securitypriv.dot11PrivacyAlgrthm==%d)!\n",
671 padapter->securitypriv.dot11PrivacyAlgrthm));
672 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
673 ("rtw_set_802_11_add_key: (Adapter->securitypriv.dot11AuthAlgrthm==%d)!\n",
674 padapter->securitypriv.dot11AuthAlgrthm));
676 if ((stainfo != NULL))
677 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
678 ("rtw_set_802_11_add_key: (stainfo->dot118021XPrivacy==%d)!\n",
679 stainfo->dot118021XPrivacy));
681 if (key->KeyIndex & 0x000000FF) {
682 /* The key index is specified in the lower 8 bits by values of zero to 255. */
683 /* The key index should be set to zero for a Pairwise key, and the driver should fail with */
684 /* NDIS_STATUS_INVALID_DATA if the lower 8 bits is not zero */
685 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, (" key->KeyIndex & 0x000000FF.\n"));
691 if (IS_MAC_ADDRESS_BROADCAST(key->BSSID) == true) {
692 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("MacAddr_isBcst(key->BSSID)\n"));
697 /* Check key length for TKIP. */
698 if ((encryptionalgo == _TKIP_) && (key->KeyLength != 32)) {
699 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("TKIP KeyLength:0x%x != 32\n", key->KeyLength));
704 /* Check key length for AES. */
705 if ((encryptionalgo == _AES_) && (key->KeyLength != 16)) {
706 /* For our supplicant, EAPPkt9x.vxd, cannot differentiate TKIP and AES case. */
707 if (key->KeyLength == 32) {
715 /* Check key length for WEP. For NDTEST, 2005.01.27, by rcnjko. */
716 if ((encryptionalgo == _WEP40_ || encryptionalgo == _WEP104_) &&
717 (key->KeyLength != 5 && key->KeyLength != 13)) {
718 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("WEP KeyLength:0x%x != 5 or 13\n", key->KeyLength));
725 /* Check the pairwise key. Added by Annie, 2005-07-06. */
726 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("------------------------------------------\n"));
727 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("[Pairwise Key set]\n"));
728 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("------------------------------------------\n"));
729 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("key index: 0x%8x(0x%8x)\n", key->KeyIndex, (key->KeyIndex&0x3)));
730 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("key Length: %d\n", key->KeyLength));
731 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("------------------------------------------\n"));
734 /* Group key - KeyIndex(BIT30 == 0) */
735 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("OID_802_11_ADD_KEY: +++++ Group key +++++\n"));
738 /* when add wep key through add key and didn't assigned encryption type before */
739 if ((padapter->securitypriv.ndisauthtype <= 3) &&
740 (padapter->securitypriv.dot118021XGrpPrivacy == 0)) {
741 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
742 ("keylen =%d(Adapter->securitypriv.dot11PrivacyAlgrthm=%x )padapter->securitypriv.dot118021XGrpPrivacy(%x)\n",
743 key->KeyLength, padapter->securitypriv.dot11PrivacyAlgrthm,
744 padapter->securitypriv.dot118021XGrpPrivacy));
745 switch (key->KeyLength) {
747 padapter->securitypriv.dot11PrivacyAlgrthm = _WEP40_;
748 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
749 ("Adapter->securitypriv.dot11PrivacyAlgrthm=%x key->KeyLength=%u\n",
750 padapter->securitypriv.dot11PrivacyAlgrthm, key->KeyLength));
753 padapter->securitypriv.dot11PrivacyAlgrthm = _WEP104_;
754 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
755 ("Adapter->securitypriv.dot11PrivacyAlgrthm=%x key->KeyLength=%u\n",
756 padapter->securitypriv.dot11PrivacyAlgrthm, key->KeyLength));
759 padapter->securitypriv.dot11PrivacyAlgrthm = _NO_PRIVACY_;
760 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
761 ("Adapter->securitypriv.dot11PrivacyAlgrthm=%x key->KeyLength=%u\n",
762 padapter->securitypriv.dot11PrivacyAlgrthm, key->KeyLength));
766 encryptionalgo = padapter->securitypriv.dot11PrivacyAlgrthm;
768 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
769 (" Adapter->securitypriv.dot11PrivacyAlgrthm=%x\n",
770 padapter->securitypriv.dot11PrivacyAlgrthm));
773 encryptionalgo = padapter->securitypriv.dot118021XGrpPrivacy;
774 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
775 ("(Adapter->securitypriv.dot11PrivacyAlgrthm=%x)encryptionalgo(%x)=padapter->securitypriv.dot118021XGrpPrivacy(%x)keylen=%d\n",
776 padapter->securitypriv.dot11PrivacyAlgrthm, encryptionalgo,
777 padapter->securitypriv.dot118021XGrpPrivacy, key->KeyLength));
780 if ((check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE) == true) && (IS_MAC_ADDRESS_BROADCAST(key->BSSID) == false)) {
781 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
782 (" IBSS but BSSID is not Broadcast Address.\n"));
787 /* Check key length for TKIP */
788 if ((encryptionalgo == _TKIP_) && (key->KeyLength != 32)) {
789 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
790 (" TKIP GTK KeyLength:%u != 32\n", key->KeyLength));
793 } else if (encryptionalgo == _AES_ && (key->KeyLength != 16 && key->KeyLength != 32)) {
794 /* Check key length for AES */
795 /* For NDTEST, we allow keylen = 32 in this case. 2005.01.27, by rcnjko. */
796 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
797 ("<=== SetInfo, OID_802_11_ADD_KEY: AES GTK KeyLength:%u != 16 or 32\n",
803 /* Change the key length for EAPPkt9x.vxd. Added by Annie, 2005-11-03. */
804 if ((encryptionalgo == _AES_) && (key->KeyLength == 32)) {
806 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("AES key length changed: %u\n", key->KeyLength));
809 if (key->KeyIndex & 0x8000000) {/* error ??? 0x8000_0000 */
813 if ((check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE)) &&
814 (check_fwstate(&padapter->mlmepriv, _FW_LINKED)))
817 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("------------------------------------------\n"));
818 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("[Group Key set]\n"));
819 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("------------------------------------------\n")) ;
820 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("key index: 0x%8x(0x%8x)\n", key->KeyIndex, (key->KeyIndex&0x3)));
821 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("key Length: %d\n", key->KeyLength)) ;
822 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("------------------------------------------\n"));
825 /* If WEP encryption algorithm, just call rtw_set_802_11_add_wep(). */
826 if ((padapter->securitypriv.dot11AuthAlgrthm != dot11AuthAlgrthm_8021X) &&
827 (encryptionalgo == _WEP40_ || encryptionalgo == _WEP104_)) {
829 u32 len = FIELD_OFFSET(struct ndis_802_11_key, KeyMaterial) + key->KeyLength;
830 struct ndis_802_11_wep *wep = &padapter->securitypriv.ndiswep;
832 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("OID_802_11_ADD_KEY: +++++ WEP key +++++\n"));
835 keyindex = key->KeyIndex&0x7fffffff;
836 wep->KeyIndex = keyindex ;
837 wep->KeyLength = key->KeyLength;
839 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("OID_802_11_ADD_KEY:Before memcpy\n"));
841 memcpy(wep->KeyMaterial, key->KeyMaterial, key->KeyLength);
842 memcpy(&(padapter->securitypriv.dot11DefKey[keyindex].skey[0]), key->KeyMaterial, key->KeyLength);
844 padapter->securitypriv.dot11DefKeylen[keyindex] = key->KeyLength;
845 padapter->securitypriv.dot11PrivacyKeyIndex = keyindex;
847 ret = rtw_set_802_11_add_wep(padapter, wep);
850 if (key->KeyIndex & 0x20000000) {
852 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("OID_802_11_ADD_KEY: +++++ SetRSC+++++\n"));
854 unsigned long long keysrc = key->KeyRSC & 0x00FFFFFFFFFFFFULL;
855 memcpy(&padapter->securitypriv.dot11Grprxpn, &keysrc, 8);
857 unsigned long long keysrc = key->KeyRSC & 0x00FFFFFFFFFFFFULL;
858 memcpy(&padapter->securitypriv.dot11Grptxpn, &keysrc, 8);
862 /* Indicate this key idx is used for TX */
863 /* Save the key in KeyMaterial */
864 if (bgroup) { /* Group transmit key */
868 padapter->securitypriv.dot118021XGrpKeyid = (u8)key->KeyIndex;
869 if ((key->KeyIndex&0x3) == 0) {
873 _rtw_memset(&padapter->securitypriv.dot118021XGrpKey[(u8)((key->KeyIndex) & 0x03)], 0, 16);
874 _rtw_memset(&padapter->securitypriv.dot118021XGrptxmickey[(u8)((key->KeyIndex) & 0x03)], 0, 16);
875 _rtw_memset(&padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)], 0, 16);
877 if ((key->KeyIndex & 0x10000000)) {
878 memcpy(&padapter->securitypriv.dot118021XGrptxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 16, 8);
879 memcpy(&padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 24, 8);
881 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
882 ("\n rtw_set_802_11_add_key:rx mic :0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n",
883 padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[0],
884 padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[1],
885 padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[2],
886 padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[3],
887 padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[4],
888 padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[5],
889 padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[6],
890 padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[7]));
891 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("\n rtw_set_802_11_add_key:set Group mic key!!!!!!!!\n"));
893 memcpy(&padapter->securitypriv.dot118021XGrptxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 24, 8);
894 memcpy(&padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial + 16, 8);
896 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
897 ("\n rtw_set_802_11_add_key:rx mic :0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n",
898 padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[0],
899 padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[1],
900 padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[2],
901 padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[3],
902 padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[4],
903 padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[5],
904 padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex) & 0x03)].skey[6],
905 padapter->securitypriv.dot118021XGrprxmickey[(u8)((key->KeyIndex-1) & 0x03)].skey[7]));
906 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
907 ("\n rtw_set_802_11_add_key:set Group mic key!!!!!!!!\n"));
910 /* set group key by index */
911 memcpy(&padapter->securitypriv.dot118021XGrpKey[(u8)((key->KeyIndex) & 0x03)], key->KeyMaterial, key->KeyLength);
913 key->KeyIndex = key->KeyIndex & 0x03;
915 padapter->securitypriv.binstallGrpkey = true;
917 padapter->securitypriv.bcheck_grpkey = false;
919 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("reset group key"));
921 res = rtw_set_key(padapter, &padapter->securitypriv, key->KeyIndex, 1);
928 } else { /* Pairwise Key */
931 pbssid = get_bssid(&padapter->mlmepriv);
932 stainfo = rtw_get_stainfo(&padapter->stapriv, pbssid);
934 if (stainfo != NULL) {
935 _rtw_memset(&stainfo->dot118021x_UncstKey, 0, 16);/* clear keybuffer */
937 memcpy(&stainfo->dot118021x_UncstKey, key->KeyMaterial, 16);
939 if (encryptionalgo == _TKIP_) {
940 padapter->securitypriv.busetkipkey = false;
942 /* _set_timer(&padapter->securitypriv.tkip_timer, 50); */
944 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("\n========== _set_timer\n"));
946 /* if TKIP, save the Receive/Transmit MIC key in KeyMaterial[128-255] */
947 if ((key->KeyIndex & 0x10000000)) {
948 memcpy(&stainfo->dot11tkiptxmickey, key->KeyMaterial + 16, 8);
949 memcpy(&stainfo->dot11tkiprxmickey, key->KeyMaterial + 24, 8);
952 memcpy(&stainfo->dot11tkiptxmickey, key->KeyMaterial + 24, 8);
953 memcpy(&stainfo->dot11tkiprxmickey, key->KeyMaterial + 16, 8);
958 /* Set key to CAM through H2C command */
959 if (bgrouptkey) { /* never go to here */
960 res = rtw_setstakey_cmd(padapter, (unsigned char *)stainfo, false);
961 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("\n rtw_set_802_11_add_key:rtw_setstakey_cmd(group)\n"));
963 res = rtw_setstakey_cmd(padapter, (unsigned char *)stainfo, true);
964 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("\n rtw_set_802_11_add_key:rtw_setstakey_cmd(unicast)\n"));
975 u8 rtw_set_802_11_remove_key(struct adapter *padapter, struct ndis_802_11_remove_key *key)
978 struct sta_info *stainfo;
979 u8 bgroup = (key->KeyIndex & 0x4000000) > 0 ? false : true;
980 u8 keyIndex = (u8)key->KeyIndex & 0x03;
984 if ((key->KeyIndex & 0xbffffffc) > 0) {
990 /* clear group key by index */
992 _rtw_memset(&padapter->securitypriv.dot118021XGrpKey[keyIndex], 0, 16);
994 /* \todo Send a H2C Command to Firmware for removing this Key in CAM Entry. */
996 pbssid = get_bssid(&padapter->mlmepriv);
997 stainfo = rtw_get_stainfo(&padapter->stapriv, pbssid);
999 /* clear key by BSSID */
1000 _rtw_memset(&stainfo->dot118021x_UncstKey, 0, 16);
1002 /* \todo Send a H2C Command to Firmware for disable this Key in CAM Entry. */
1014 * rtw_get_cur_max_rate -
1015 * @adapter: pointer to struct adapter structure
1017 * Return 0 or 100Kbps
1019 u16 rtw_get_cur_max_rate(struct adapter *adapter)
1023 u16 rate = 0, max_rate = 0;
1024 struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
1025 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
1026 struct registry_priv *pregistrypriv = &adapter->registrypriv;
1027 struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
1028 struct wlan_bssid_ex *pcur_bss = &pmlmepriv->cur_network.network;
1029 struct rtw_ieee80211_ht_cap *pht_capie;
1031 u8 bw_40MHz = 0, short_GI_20 = 0, short_GI_40 = 0;
1035 if (adapter->registrypriv.mp_mode == 1) {
1036 if (check_fwstate(pmlmepriv, WIFI_MP_STATE))
1040 if ((!check_fwstate(pmlmepriv, _FW_LINKED)) &&
1041 (!check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)))
1044 if (pmlmeext->cur_wireless_mode & (WIRELESS_11_24N|WIRELESS_11_5N)) {
1045 p = rtw_get_ie(&pcur_bss->IEs[12], _HT_CAPABILITY_IE_, &ht_ielen, pcur_bss->IELength-12);
1046 if (p && ht_ielen > 0) {
1047 pht_capie = (struct rtw_ieee80211_ht_cap *)(p+2);
1049 memcpy(&mcs_rate, pht_capie->supp_mcs_set, 2);
1051 /* cur_bwmod is updated by beacon, pmlmeinfo is updated by association response */
1052 bw_40MHz = (pmlmeext->cur_bwmode && (HT_INFO_HT_PARAM_REC_TRANS_CHNL_WIDTH & pmlmeinfo->HT_info.infos[0])) ? 1 : 0;
1054 short_GI_20 = (le16_to_cpu(pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info) & IEEE80211_HT_CAP_SGI_20) ? 1 : 0;
1055 short_GI_40 = (le16_to_cpu(pmlmeinfo->HT_caps.u.HT_cap_element.HT_caps_info) & IEEE80211_HT_CAP_SGI_40) ? 1 : 0;
1057 rtw_hal_get_hwreg(adapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
1058 max_rate = rtw_mcs_rate(
1060 bw_40MHz & (pregistrypriv->cbw40_enable),
1063 pmlmeinfo->HT_caps.u.HT_cap_element.MCS_rate
1067 while ((pcur_bss->SupportedRates[i] != 0) && (pcur_bss->SupportedRates[i] != 0xFF)) {
1068 rate = pcur_bss->SupportedRates[i]&0x7F;
1069 if (rate > max_rate)
1074 max_rate = max_rate*10/2;
1081 * rtw_set_scan_mode -
1082 * @adapter: pointer to struct adapter structure
1085 * Return _SUCCESS or _FAIL
1087 int rtw_set_scan_mode(struct adapter *adapter, enum rt_scan_type scan_mode)
1089 if (scan_mode != SCAN_ACTIVE && scan_mode != SCAN_PASSIVE)
1092 adapter->mlmepriv.scan_mode = scan_mode;
1098 * rtw_set_channel_plan -
1099 * @adapter: pointer to struct adapter structure
1102 * Return _SUCCESS or _FAIL
1104 int rtw_set_channel_plan(struct adapter *adapter, u8 channel_plan)
1106 /* handle by cmd_thread to sync with scan operation */
1107 return rtw_set_chplan_cmd(adapter, channel_plan, 1);
1112 * @adapter: pointer to struct adapter structure
1113 * @country_code: string of country code
1115 * Return _SUCCESS or _FAIL
1117 int rtw_set_country(struct adapter *adapter, const char *country_code)
1119 int channel_plan = RT_CHANNEL_DOMAIN_WORLD_WIDE_5G;
1121 DBG_88E("%s country_code:%s\n", __func__, country_code);
1123 /* TODO: should have a table to match country code and RT_CHANNEL_DOMAIN */
1124 /* TODO: should consider 2-character and 3-character country code */
1125 if (0 == strcmp(country_code, "US"))
1126 channel_plan = RT_CHANNEL_DOMAIN_FCC;
1127 else if (0 == strcmp(country_code, "EU"))
1128 channel_plan = RT_CHANNEL_DOMAIN_ETSI;
1129 else if (0 == strcmp(country_code, "JP"))
1130 channel_plan = RT_CHANNEL_DOMAIN_MKK;
1131 else if (0 == strcmp(country_code, "CN"))
1132 channel_plan = RT_CHANNEL_DOMAIN_CHINA;
1134 DBG_88E("%s unknown country_code:%s\n", __func__, country_code);
1136 return rtw_set_channel_plan(adapter, channel_plan);