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 ******************************************************************************/
15 #define _RTW_IOCTL_SET_C_
17 #include <drv_types.h>
18 #include <rtw_debug.h>
20 #define IS_MAC_ADDRESS_BROADCAST(addr) \
22 ((addr[0] == 0xff) && (addr[1] == 0xff) && \
23 (addr[2] == 0xff) && (addr[3] == 0xff) && \
24 (addr[4] == 0xff) && (addr[5] == 0xff)) ? true : false \
27 u8 rtw_validate_bssid(u8 *bssid)
31 if (is_zero_mac_addr(bssid)
32 || is_broadcast_mac_addr(bssid)
33 || is_multicast_mac_addr(bssid)
41 u8 rtw_validate_ssid(struct ndis_802_11_ssid *ssid)
45 if (ssid->SsidLength > 32) {
46 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("ssid length >32\n"));
51 #ifdef CONFIG_VALIDATE_SSID
52 for (i = 0; i < ssid->SsidLength; i++)
54 /* wifi, printable ascii code must be supported */
55 if (!((ssid->Ssid[i] >= 0x20) && (ssid->Ssid[i] <= 0x7e))) {
56 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("ssid has nonprintabl ascii\n"));
61 #endif /* CONFIG_VALIDATE_SSID */
67 u8 rtw_do_join(struct adapter *padapter);
68 u8 rtw_do_join(struct adapter *padapter)
70 struct list_head *plist, *phead;
72 struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
73 struct __queue *queue = &(pmlmepriv->scanned_queue);
76 spin_lock_bh(&(pmlmepriv->scanned_queue.lock));
77 phead = get_list_head(queue);
78 plist = get_next(phead);
80 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("\n rtw_do_join: phead = %p; plist = %p\n\n\n", phead, plist));
82 pmlmepriv->cur_network.join_res = -2;
84 set_fwstate(pmlmepriv, _FW_UNDER_LINKING);
86 pmlmepriv->pscanned = plist;
88 pmlmepriv->to_join = true;
90 if (list_empty(&queue->queue))
92 spin_unlock_bh(&(pmlmepriv->scanned_queue.lock));
93 _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
95 /* when set_ssid/set_bssid for rtw_do_join(), but scanning queue is empty */
96 /* we try to issue sitesurvey firstly */
98 if (pmlmepriv->LinkDetectInfo.bBusyTraffic ==false
99 || rtw_to_roam(padapter) > 0
102 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("rtw_do_join(): site survey if scanned_queue is empty\n."));
103 /* submit site_survey_cmd */
104 if (_SUCCESS!=(ret =rtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid, 1, NULL, 0))) {
105 pmlmepriv->to_join = false;
106 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("rtw_do_join(): site survey return error\n."));
111 pmlmepriv->to_join = false;
120 spin_unlock_bh(&(pmlmepriv->scanned_queue.lock));
121 if ((select_ret =rtw_select_and_join_from_scanned_queue(pmlmepriv)) == _SUCCESS)
123 pmlmepriv->to_join = false;
124 _set_timer(&pmlmepriv->assoc_timer, MAX_JOIN_TIMEOUT);
128 if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) ==true)
130 /* submit createbss_cmd to change to a ADHOC_MASTER */
132 /* pmlmepriv->lock has been acquired by caller... */
133 struct wlan_bssid_ex *pdev_network = &(padapter->registrypriv.dev_network);
135 pmlmepriv->fw_state = WIFI_ADHOC_MASTER_STATE;
137 pibss = padapter->registrypriv.dev_network.MacAddress;
139 memset(&pdev_network->Ssid, 0, sizeof(struct ndis_802_11_ssid));
140 memcpy(&pdev_network->Ssid, &pmlmepriv->assoc_ssid, sizeof(struct ndis_802_11_ssid));
142 rtw_update_registrypriv_dev_network(padapter);
144 rtw_generate_random_ibss(pibss);
146 if (rtw_createbss_cmd(padapter)!= _SUCCESS)
148 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("***Error =>do_goin: rtw_createbss_cmd status FAIL***\n "));
153 pmlmepriv->to_join = false;
155 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("***Error => rtw_select_and_join_from_scanned_queue FAIL under STA_Mode***\n "));
160 /* can't associate ; reset under-linking */
161 _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
163 /* when set_ssid/set_bssid for rtw_do_join(), but there are no desired bss in scanning queue */
164 /* we try to issue sitesurvey firstly */
165 if (pmlmepriv->LinkDetectInfo.bBusyTraffic ==false
166 || rtw_to_roam(padapter) > 0
169 /* DBG_871X("rtw_do_join() when no desired bss in scanning queue\n"); */
170 if (_SUCCESS!=(ret =rtw_sitesurvey_cmd(padapter, &pmlmepriv->assoc_ssid, 1, NULL, 0))) {
171 pmlmepriv->to_join = false;
172 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("do_join(): site survey return error\n."));
178 pmlmepriv->to_join = false;
190 u8 rtw_set_802_11_bssid(struct adapter *padapter, u8 *bssid)
192 u8 status = _SUCCESS;
194 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
196 DBG_871X_LEVEL(_drv_always_, "set bssid:%pM\n", bssid);
198 if ((bssid[0]== 0x00 && bssid[1]== 0x00 && bssid[2]== 0x00 && bssid[3]== 0x00 && bssid[4]== 0x00 &&bssid[5]== 0x00) ||
199 (bssid[0]== 0xFF && bssid[1]== 0xFF && bssid[2]== 0xFF && bssid[3]== 0xFF && bssid[4]== 0xFF &&bssid[5]== 0xFF))
205 spin_lock_bh(&pmlmepriv->lock);
208 DBG_871X("Set BSSID under fw_state = 0x%08x\n", get_fwstate(pmlmepriv));
209 if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == true) {
210 goto handle_tkip_countermeasure;
211 } else if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == true) {
212 goto release_mlme_lock;
215 if (check_fwstate(pmlmepriv, _FW_LINKED|WIFI_ADHOC_MASTER_STATE) == true)
217 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("set_bssid: _FW_LINKED||WIFI_ADHOC_MASTER_STATE\n"));
219 if (!memcmp(&pmlmepriv->cur_network.network.MacAddress, bssid, ETH_ALEN))
221 if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == false)
222 goto release_mlme_lock;/* it means driver is in WIFI_ADHOC_MASTER_STATE, we needn't create bss again. */
224 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("Set BSSID not the same bssid\n"));
225 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("set_bssid ="MAC_FMT"\n", MAC_ARG(bssid)));
226 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("cur_bssid ="MAC_FMT"\n", MAC_ARG(pmlmepriv->cur_network.network.MacAddress)));
228 rtw_disassoc_cmd(padapter, 0, true);
230 if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
231 rtw_indicate_disconnect(padapter);
233 rtw_free_assoc_resources(padapter, 1);
235 if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == true)) {
236 _clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE);
237 set_fwstate(pmlmepriv, WIFI_ADHOC_STATE);
242 handle_tkip_countermeasure:
243 if (rtw_handle_tkip_countermeasure(padapter, __func__) == _FAIL) {
245 goto release_mlme_lock;
248 memset(&pmlmepriv->assoc_ssid, 0, sizeof(struct ndis_802_11_ssid));
249 memcpy(&pmlmepriv->assoc_bssid, bssid, ETH_ALEN);
250 pmlmepriv->assoc_by_bssid =true;
252 if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == true) {
253 pmlmepriv->to_join = true;
256 status = rtw_do_join(padapter);
260 spin_unlock_bh(&pmlmepriv->lock);
263 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
264 ("rtw_set_802_11_bssid: status =%d\n", status));
269 u8 rtw_set_802_11_ssid(struct adapter *padapter, struct ndis_802_11_ssid *ssid)
271 u8 status = _SUCCESS;
273 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
274 struct wlan_network *pnetwork = &pmlmepriv->cur_network;
276 DBG_871X_LEVEL(_drv_always_, "set ssid [%s] fw_state = 0x%08x\n",
277 ssid->Ssid, get_fwstate(pmlmepriv));
279 if (padapter->hw_init_completed ==false) {
280 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
281 ("set_ssid: hw_init_completed ==false =>exit!!!\n"));
286 spin_lock_bh(&pmlmepriv->lock);
288 DBG_871X("Set SSID under fw_state = 0x%08x\n", get_fwstate(pmlmepriv));
289 if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == true) {
290 goto handle_tkip_countermeasure;
291 } else if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == true) {
292 goto release_mlme_lock;
295 if (check_fwstate(pmlmepriv, _FW_LINKED|WIFI_ADHOC_MASTER_STATE) == true)
297 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_,
298 ("set_ssid: _FW_LINKED||WIFI_ADHOC_MASTER_STATE\n"));
300 if ((pmlmepriv->assoc_ssid.SsidLength == ssid->SsidLength) &&
301 (!memcmp(&pmlmepriv->assoc_ssid.Ssid, ssid->Ssid, ssid->SsidLength)))
303 if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == false))
305 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
306 ("Set SSID is the same ssid, fw_state = 0x%08x\n",
307 get_fwstate(pmlmepriv)));
309 if (rtw_is_same_ibss(padapter, pnetwork) == false)
311 /* if in WIFI_ADHOC_MASTER_STATE | WIFI_ADHOC_STATE, create bss or rejoin again */
312 rtw_disassoc_cmd(padapter, 0, true);
314 if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
315 rtw_indicate_disconnect(padapter);
317 rtw_free_assoc_resources(padapter, 1);
319 if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == true) {
320 _clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE);
321 set_fwstate(pmlmepriv, WIFI_ADHOC_STATE);
326 goto release_mlme_lock;/* it means driver is in WIFI_ADHOC_MASTER_STATE, we needn't create bss again. */
330 rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_JOINBSS, 1);
335 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("Set SSID not the same ssid\n"));
336 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("set_ssid =[%s] len = 0x%x\n", ssid->Ssid, (unsigned int)ssid->SsidLength));
337 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));
339 rtw_disassoc_cmd(padapter, 0, true);
341 if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
342 rtw_indicate_disconnect(padapter);
344 rtw_free_assoc_resources(padapter, 1);
346 if (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == true) {
347 _clr_fwstate_(pmlmepriv, WIFI_ADHOC_MASTER_STATE);
348 set_fwstate(pmlmepriv, WIFI_ADHOC_STATE);
353 handle_tkip_countermeasure:
354 if (rtw_handle_tkip_countermeasure(padapter, __func__) == _FAIL) {
356 goto release_mlme_lock;
359 if (rtw_validate_ssid(ssid) == false) {
361 goto release_mlme_lock;
364 memcpy(&pmlmepriv->assoc_ssid, ssid, sizeof(struct ndis_802_11_ssid));
365 pmlmepriv->assoc_by_bssid =false;
367 if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == true) {
368 pmlmepriv->to_join = true;
371 status = rtw_do_join(padapter);
375 spin_unlock_bh(&pmlmepriv->lock);
378 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
379 ("-rtw_set_802_11_ssid: status =%d\n", status));
384 u8 rtw_set_802_11_connect(struct adapter *padapter, u8 *bssid, struct ndis_802_11_ssid *ssid)
386 u8 status = _SUCCESS;
387 bool bssid_valid = true;
388 bool ssid_valid = true;
389 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
391 if (!ssid || rtw_validate_ssid(ssid) == false)
394 if (!bssid || rtw_validate_bssid(bssid) == false)
397 if (ssid_valid == false && bssid_valid == false) {
398 DBG_871X(FUNC_ADPT_FMT" ssid:%p, ssid_valid:%d, bssid:%p, bssid_valid:%d\n",
399 FUNC_ADPT_ARG(padapter), ssid, ssid_valid, bssid, bssid_valid);
404 if (padapter->hw_init_completed ==false) {
405 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_,
406 ("set_ssid: hw_init_completed ==false =>exit!!!\n"));
411 spin_lock_bh(&pmlmepriv->lock);
413 DBG_871X_LEVEL(_drv_always_, FUNC_ADPT_FMT" fw_state = 0x%08x\n",
414 FUNC_ADPT_ARG(padapter), get_fwstate(pmlmepriv));
416 if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == true) {
417 goto handle_tkip_countermeasure;
418 } else if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == true) {
419 goto release_mlme_lock;
422 handle_tkip_countermeasure:
423 if (rtw_handle_tkip_countermeasure(padapter, __func__) == _FAIL) {
425 goto release_mlme_lock;
428 if (ssid && ssid_valid)
429 memcpy(&pmlmepriv->assoc_ssid, ssid, sizeof(struct ndis_802_11_ssid));
431 memset(&pmlmepriv->assoc_ssid, 0, sizeof(struct ndis_802_11_ssid));
433 if (bssid && bssid_valid) {
434 memcpy(&pmlmepriv->assoc_bssid, bssid, ETH_ALEN);
435 pmlmepriv->assoc_by_bssid = true;
437 pmlmepriv->assoc_by_bssid = false;
440 if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY) == true) {
441 pmlmepriv->to_join = true;
444 status = rtw_do_join(padapter);
448 spin_unlock_bh(&pmlmepriv->lock);
454 u8 rtw_set_802_11_infrastructure_mode(struct adapter *padapter,
455 enum NDIS_802_11_NETWORK_INFRASTRUCTURE networktype)
457 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
458 struct wlan_network *cur_network = &pmlmepriv->cur_network;
459 enum NDIS_802_11_NETWORK_INFRASTRUCTURE *pold_state = &(cur_network->network.InfrastructureMode);
461 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_notice_,
462 ("+rtw_set_802_11_infrastructure_mode: old =%d new =%d fw_state = 0x%08x\n",
463 *pold_state, networktype, get_fwstate(pmlmepriv)));
465 if (*pold_state != networktype)
467 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, (" change mode!"));
468 /* DBG_871X("change mode, old_mode =%d, new_mode =%d, fw_state = 0x%x\n", *pold_state, networktype, get_fwstate(pmlmepriv)); */
470 if (*pold_state ==Ndis802_11APMode)
472 /* change to other mode from Ndis802_11APMode */
473 cur_network->join_res = -1;
475 stop_ap_mode(padapter);
478 spin_lock_bh(&pmlmepriv->lock);
480 if ((check_fwstate(pmlmepriv, _FW_LINKED) == true) ||(*pold_state ==Ndis802_11IBSS))
481 rtw_disassoc_cmd(padapter, 0, true);
483 if ((check_fwstate(pmlmepriv, _FW_LINKED) == true) ||
484 (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == true))
485 rtw_free_assoc_resources(padapter, 1);
487 if ((*pold_state == Ndis802_11Infrastructure) ||(*pold_state == Ndis802_11IBSS))
489 if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
491 rtw_indicate_disconnect(padapter); /* will clr Linked_state; before this function, we must have chked whether issue dis-assoc_cmd or not */
495 *pold_state = networktype;
497 _clr_fwstate_(pmlmepriv, ~WIFI_NULL_STATE);
502 set_fwstate(pmlmepriv, WIFI_ADHOC_STATE);
505 case Ndis802_11Infrastructure:
506 set_fwstate(pmlmepriv, WIFI_STATION_STATE);
509 case Ndis802_11APMode:
510 set_fwstate(pmlmepriv, WIFI_AP_STATE);
511 start_ap_mode(padapter);
512 /* rtw_indicate_connect(padapter); */
516 case Ndis802_11AutoUnknown:
517 case Ndis802_11InfrastructureMax:
521 /* SecClearAllKeys(adapter); */
523 /* RT_TRACE(COMP_OID_SET, DBG_LOUD, ("set_infrastructure: fw_state:%x after changing mode\n", */
524 /* get_fwstate(pmlmepriv))); */
526 spin_unlock_bh(&pmlmepriv->lock);
532 u8 rtw_set_802_11_disassociate(struct adapter *padapter)
534 struct mlme_priv * pmlmepriv = &padapter->mlmepriv;
536 spin_lock_bh(&pmlmepriv->lock);
538 if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
540 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("MgntActrtw_set_802_11_disassociate: rtw_indicate_disconnect\n"));
542 rtw_disassoc_cmd(padapter, 0, true);
543 rtw_indicate_disconnect(padapter);
544 /* modify for CONFIG_IEEE80211W, none 11w can use it */
545 rtw_free_assoc_resources_cmd(padapter);
546 if (_FAIL == rtw_pwr_wakeup(padapter))
547 DBG_871X("%s(): rtw_pwr_wakeup fail !!!\n", __func__);
550 spin_unlock_bh(&pmlmepriv->lock);
555 u8 rtw_set_802_11_bssid_list_scan(struct adapter *padapter, struct ndis_802_11_ssid *pssid, int ssid_max_num)
557 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
560 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("+rtw_set_802_11_bssid_list_scan(), fw_state =%x\n", get_fwstate(pmlmepriv)));
562 if (padapter == NULL) {
566 if (padapter->hw_init_completed ==false) {
568 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("\n ===rtw_set_802_11_bssid_list_scan:hw_init_completed ==false ===\n"));
572 if ((check_fwstate(pmlmepriv, _FW_UNDER_SURVEY|_FW_UNDER_LINKING) == true) ||
573 (pmlmepriv->LinkDetectInfo.bBusyTraffic == true))
575 /* Scan or linking is in progress, do nothing. */
576 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)));
579 if (check_fwstate(pmlmepriv, (_FW_UNDER_SURVEY|_FW_UNDER_LINKING)) == true) {
580 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("\n###_FW_UNDER_SURVEY|_FW_UNDER_LINKING\n\n"));
582 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("\n###pmlmepriv->sitesurveyctrl.traffic_busy ==true\n\n"));
585 if (rtw_is_scan_deny(padapter)) {
586 DBG_871X(FUNC_ADPT_FMT": scan deny\n", FUNC_ADPT_ARG(padapter));
587 indicate_wx_scan_complete_event(padapter);
591 spin_lock_bh(&pmlmepriv->lock);
593 res = rtw_sitesurvey_cmd(padapter, pssid, ssid_max_num, NULL, 0);
595 spin_unlock_bh(&pmlmepriv->lock);
602 u8 rtw_set_802_11_authentication_mode(struct adapter *padapter, enum NDIS_802_11_AUTHENTICATION_MODE authmode)
604 struct security_priv *psecuritypriv = &padapter->securitypriv;
608 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("set_802_11_auth.mode(): mode =%x\n", authmode));
610 psecuritypriv->ndisauthtype =authmode;
612 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("rtw_set_802_11_authentication_mode:psecuritypriv->ndisauthtype =%d", psecuritypriv->ndisauthtype));
614 if (psecuritypriv->ndisauthtype>3)
615 psecuritypriv->dot11AuthAlgrthm =dot11AuthAlgrthm_8021X;
617 res =rtw_set_auth(padapter, psecuritypriv);
627 u8 rtw_set_802_11_add_wep(struct adapter *padapter, struct ndis_802_11_wep *wep) {
632 struct security_priv* psecuritypriv =&(padapter->securitypriv);
635 bdefaultkey =(wep->KeyIndex & 0x40000000) > 0 ? false : true; /* for ??? */
636 btransmitkey = (wep->KeyIndex & 0x80000000) > 0 ? true : false; /* for ??? */
637 keyid =wep->KeyIndex & 0x3fffffff;
641 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, ("MgntActrtw_set_802_11_add_wep:keyid>4 =>fail\n"));
646 switch (wep->KeyLength)
649 psecuritypriv->dot11PrivacyAlgrthm = _WEP40_;
650 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("MgntActrtw_set_802_11_add_wep:wep->KeyLength =5\n"));
653 psecuritypriv->dot11PrivacyAlgrthm = _WEP104_;
654 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("MgntActrtw_set_802_11_add_wep:wep->KeyLength = 13\n"));
657 psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_;
658 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("MgntActrtw_set_802_11_add_wep:wep->KeyLength!=5 or 13\n"));
662 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("rtw_set_802_11_add_wep:befor memcpy, wep->KeyLength = 0x%x wep->KeyIndex = 0x%x keyid =%x\n", wep->KeyLength, wep->KeyIndex, keyid));
664 memcpy(&(psecuritypriv->dot11DefKey[keyid].skey[0]),&(wep->KeyMaterial), wep->KeyLength);
666 psecuritypriv->dot11DefKeylen[keyid]=wep->KeyLength;
668 psecuritypriv->dot11PrivacyKeyIndex =keyid;
670 RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, ("rtw_set_802_11_add_wep:security key material : %x %x %x %x %x %x %x %x %x %x %x %x %x\n",
671 psecuritypriv->dot11DefKey[keyid].skey[0], psecuritypriv->dot11DefKey[keyid].skey[1], psecuritypriv->dot11DefKey[keyid].skey[2],
672 psecuritypriv->dot11DefKey[keyid].skey[3], psecuritypriv->dot11DefKey[keyid].skey[4], psecuritypriv->dot11DefKey[keyid].skey[5],
673 psecuritypriv->dot11DefKey[keyid].skey[6], psecuritypriv->dot11DefKey[keyid].skey[7], psecuritypriv->dot11DefKey[keyid].skey[8],
674 psecuritypriv->dot11DefKey[keyid].skey[9], psecuritypriv->dot11DefKey[keyid].skey[10], psecuritypriv->dot11DefKey[keyid].skey[11],
675 psecuritypriv->dot11DefKey[keyid].skey[12]));
677 res =rtw_set_key(padapter, psecuritypriv, keyid, 1, true);
687 * rtw_get_cur_max_rate -
688 * @adapter: pointer to struct adapter structure
690 * Return 0 or 100Kbps
692 u16 rtw_get_cur_max_rate(struct adapter *adapter)
695 u16 rate = 0, max_rate = 0;
696 struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
697 struct wlan_bssid_ex *pcur_bss = &pmlmepriv->cur_network.network;
698 struct sta_info *psta = NULL;
702 if ((check_fwstate(pmlmepriv, _FW_LINKED) != true)
703 && (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) != true))
706 psta = rtw_get_stainfo(&adapter->stapriv, get_bssid(pmlmepriv));
710 short_GI = query_ra_short_GI(psta);
712 if (IsSupportedHT(psta->wireless_mode)) {
713 rtw_hal_get_hwreg(adapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
715 max_rate = rtw_mcs_rate(
717 ((psta->bw_mode == CHANNEL_WIDTH_40)?1:0),
719 psta->htpriv.ht_cap.supp_mcs_set
724 while ((pcur_bss->SupportedRates[i]!= 0) && (pcur_bss->SupportedRates[i]!= 0xFF))
726 rate = pcur_bss->SupportedRates[i]&0x7F;
732 max_rate = max_rate*10/2;