1 /******************************************************************************
3 * Copyright(c) 2007 - 2011 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_WLAN_UTIL_C_
23 #include <osdep_service.h>
24 #include <drv_types.h>
28 unsigned char ARTHEROS_OUI1
[] = {0x00, 0x03, 0x7f};
29 unsigned char ARTHEROS_OUI2
[] = {0x00, 0x13, 0x74};
31 unsigned char BROADCOM_OUI1
[] = {0x00, 0x10, 0x18};
32 unsigned char BROADCOM_OUI2
[] = {0x00, 0x0a, 0xf7};
33 unsigned char BROADCOM_OUI3
[] = {0x00, 0x05, 0xb5};
35 unsigned char CISCO_OUI
[] = {0x00, 0x40, 0x96};
36 unsigned char MARVELL_OUI
[] = {0x00, 0x50, 0x43};
37 unsigned char RALINK_OUI
[] = {0x00, 0x0c, 0x43};
38 unsigned char REALTEK_OUI
[] = {0x00, 0xe0, 0x4c};
39 unsigned char AIRGOCAP_OUI
[] = {0x00, 0x0a, 0xf5};
41 unsigned char REALTEK_96B_IE
[] = {0x00, 0xe0, 0x4c, 0x02, 0x01, 0x20};
43 extern unsigned char MCS_rate_2R
[16];
44 #ifdef CONFIG_DISABLE_MCS13TO15
45 extern unsigned char MCS_rate_2R_MCS13TO15_OFF
[16];
46 #endif //CONFIG_DISABLE_MCS13TO15
47 extern unsigned char MCS_rate_1R
[16];
48 extern unsigned char RTW_WPA_OUI
[];
49 extern unsigned char WPA_TKIP_CIPHER
[4];
50 extern unsigned char RSN_TKIP_CIPHER
[4];
52 #define R2T_PHY_DELAY (0)
54 //#define WAIT_FOR_BCN_TO_MIN (3000)
55 #define WAIT_FOR_BCN_TO_MIN (6000)
56 #define WAIT_FOR_BCN_TO_MAX (20000)
58 static u8 rtw_basic_rate_cck
[4] = {
59 IEEE80211_CCK_RATE_1MB
|IEEE80211_BASIC_RATE_MASK
, IEEE80211_CCK_RATE_2MB
|IEEE80211_BASIC_RATE_MASK
,
60 IEEE80211_CCK_RATE_5MB
|IEEE80211_BASIC_RATE_MASK
, IEEE80211_CCK_RATE_11MB
|IEEE80211_BASIC_RATE_MASK
63 static u8 rtw_basic_rate_ofdm
[3] = {
64 IEEE80211_OFDM_RATE_6MB
|IEEE80211_BASIC_RATE_MASK
, IEEE80211_OFDM_RATE_12MB
|IEEE80211_BASIC_RATE_MASK
,
65 IEEE80211_OFDM_RATE_24MB
|IEEE80211_BASIC_RATE_MASK
68 static u8 rtw_basic_rate_mix
[7] = {
69 IEEE80211_CCK_RATE_1MB
|IEEE80211_BASIC_RATE_MASK
, IEEE80211_CCK_RATE_2MB
|IEEE80211_BASIC_RATE_MASK
,
70 IEEE80211_CCK_RATE_5MB
|IEEE80211_BASIC_RATE_MASK
, IEEE80211_CCK_RATE_11MB
|IEEE80211_BASIC_RATE_MASK
,
71 IEEE80211_OFDM_RATE_6MB
|IEEE80211_BASIC_RATE_MASK
, IEEE80211_OFDM_RATE_12MB
|IEEE80211_BASIC_RATE_MASK
,
72 IEEE80211_OFDM_RATE_24MB
|IEEE80211_BASIC_RATE_MASK
76 int cckrates_included(unsigned char *rate
, int ratelen
)
80 for(i
= 0; i
< ratelen
; i
++)
82 if ( (((rate
[i
]) & 0x7f) == 2) || (((rate
[i
]) & 0x7f) == 4) ||
83 (((rate
[i
]) & 0x7f) == 11) || (((rate
[i
]) & 0x7f) == 22) )
91 int cckratesonly_included(unsigned char *rate
, int ratelen
)
95 for(i
= 0; i
< ratelen
; i
++)
97 if ( (((rate
[i
]) & 0x7f) != 2) && (((rate
[i
]) & 0x7f) != 4) &&
98 (((rate
[i
]) & 0x7f) != 11) && (((rate
[i
]) & 0x7f) != 22) )
105 unsigned char networktype_to_raid(unsigned char network_type
)
121 case WIRELESS_11_24N
:
125 case WIRELESS_11A_5N
:
126 case WIRELESS_11G_24N
:
129 case WIRELESS_11BG_24N
:
142 int judge_network_type(_adapter
*padapter
, unsigned char *rate
, int ratelen
)
144 int network_type
= 0;
145 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
146 struct mlme_ext_info
*pmlmeinfo
= &(pmlmeext
->mlmext_info
);
149 if(pmlmeext
->cur_channel
> 14)
151 if (pmlmeinfo
->HT_enable
)
153 network_type
= WIRELESS_11_5N
;
156 network_type
|= WIRELESS_11A
;
160 if (pmlmeinfo
->HT_enable
)
162 network_type
= WIRELESS_11_24N
;
165 if ((cckratesonly_included(rate
, ratelen
)) == _TRUE
)
167 network_type
|= WIRELESS_11B
;
169 else if((cckrates_included(rate
, ratelen
)) == _TRUE
)
171 network_type
|= WIRELESS_11BG
;
175 network_type
|= WIRELESS_11G
;
182 unsigned char ratetbl_val_2wifirate(unsigned char rate
);
183 unsigned char ratetbl_val_2wifirate(unsigned char rate
)
185 unsigned char val
= 0;
190 val
= IEEE80211_CCK_RATE_1MB
;
194 val
= IEEE80211_CCK_RATE_2MB
;
198 val
= IEEE80211_CCK_RATE_5MB
;
202 val
= IEEE80211_CCK_RATE_11MB
;
206 val
= IEEE80211_OFDM_RATE_6MB
;
210 val
= IEEE80211_OFDM_RATE_9MB
;
214 val
= IEEE80211_OFDM_RATE_12MB
;
218 val
= IEEE80211_OFDM_RATE_18MB
;
222 val
= IEEE80211_OFDM_RATE_24MB
;
226 val
= IEEE80211_OFDM_RATE_36MB
;
230 val
= IEEE80211_OFDM_RATE_48MB
;
234 val
= IEEE80211_OFDM_RATE_54MB
;
243 int is_basicrate(_adapter
*padapter
, unsigned char rate
);
244 int is_basicrate(_adapter
*padapter
, unsigned char rate
)
248 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
250 for(i
= 0; i
< NumRates
; i
++)
252 val
= pmlmeext
->basicrate
[i
];
254 if ((val
!= 0xff) && (val
!= 0xfe))
256 if (rate
== ratetbl_val_2wifirate(val
))
266 unsigned int ratetbl2rateset(_adapter
*padapter
, unsigned char *rateset
);
267 unsigned int ratetbl2rateset(_adapter
*padapter
, unsigned char *rateset
)
271 unsigned int len
= 0;
272 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
274 for (i
= 0; i
< NumRates
; i
++)
276 rate
= pmlmeext
->datarate
[i
];
287 rate
= ratetbl_val_2wifirate(rate
);
289 if (is_basicrate(padapter
, rate
) == _TRUE
)
291 rate
|= IEEE80211_BASIC_RATE_MASK
;
303 void get_rate_set(_adapter
*padapter
, unsigned char *pbssrate
, int *bssrate_len
)
305 unsigned char supportedrates
[NumRates
];
307 _rtw_memset(supportedrates
, 0, NumRates
);
308 *bssrate_len
= ratetbl2rateset(padapter
, supportedrates
);
309 _rtw_memcpy(pbssrate
, supportedrates
, *bssrate_len
);
320 // 1M, 2M, 5.5M, 11M, 6M, 12M, 24M are mandatory.
321 for(i
=0;i
<NDIS_802_11_LENGTH_RATES_EX
;i
++)
323 rate
= mBratesOS
[i
] & 0x7f;
326 case IEEE80211_CCK_RATE_1MB
:
327 case IEEE80211_CCK_RATE_2MB
:
328 case IEEE80211_CCK_RATE_5MB
:
329 case IEEE80211_CCK_RATE_11MB
:
330 case IEEE80211_OFDM_RATE_6MB
:
331 case IEEE80211_OFDM_RATE_12MB
:
332 case IEEE80211_OFDM_RATE_24MB
:
333 mBratesOS
[i
] |= IEEE80211_BASIC_RATE_MASK
;
340 void UpdateBrateTblForSoftAP(u8
*bssrateset
, u32 bssratelen
)
345 for(i
=0;i
<bssratelen
;i
++)
347 rate
= bssrateset
[i
] & 0x7f;
350 case IEEE80211_CCK_RATE_1MB
:
351 case IEEE80211_CCK_RATE_2MB
:
352 case IEEE80211_CCK_RATE_5MB
:
353 case IEEE80211_CCK_RATE_11MB
:
354 bssrateset
[i
] |= IEEE80211_BASIC_RATE_MASK
;
361 void Save_DM_Func_Flag(_adapter
*padapter
)
363 u8 bSaveFlag
= _TRUE
;
365 #ifdef CONFIG_CONCURRENT_MODE
366 _adapter
*pbuddy_adapter
= padapter
->pbuddy_adapter
;
368 rtw_hal_set_hwreg(pbuddy_adapter
, HW_VAR_DM_FUNC_OP
, (u8
*)(&bSaveFlag
));
371 rtw_hal_set_hwreg(padapter
, HW_VAR_DM_FUNC_OP
, (u8
*)(&bSaveFlag
));
375 void Restore_DM_Func_Flag(_adapter
*padapter
)
377 u8 bSaveFlag
= _FALSE
;
378 #ifdef CONFIG_CONCURRENT_MODE
379 _adapter
*pbuddy_adapter
= padapter
->pbuddy_adapter
;
381 rtw_hal_set_hwreg(pbuddy_adapter
, HW_VAR_DM_FUNC_OP
, (u8
*)(&bSaveFlag
));
383 rtw_hal_set_hwreg(padapter
, HW_VAR_DM_FUNC_OP
, (u8
*)(&bSaveFlag
));
386 void Switch_DM_Func(_adapter
*padapter
, u8 mode
, u8 enable
)
388 #ifdef CONFIG_CONCURRENT_MODE
389 _adapter
*pbuddy_adapter
= padapter
->pbuddy_adapter
;
394 #ifdef CONFIG_CONCURRENT_MODE
396 rtw_hal_set_hwreg(pbuddy_adapter
, HW_VAR_DM_FUNC_SET
, (u8
*)(&mode
));
398 rtw_hal_set_hwreg(padapter
, HW_VAR_DM_FUNC_SET
, (u8
*)(&mode
));
402 #ifdef CONFIG_CONCURRENT_MODE
404 rtw_hal_set_hwreg(pbuddy_adapter
, HW_VAR_DM_FUNC_CLR
, (u8
*)(&mode
));
406 rtw_hal_set_hwreg(padapter
, HW_VAR_DM_FUNC_CLR
, (u8
*)(&mode
));
412 val8
= rtw_read8(padapter
, FW_DYNAMIC_FUN_SWITCH
);
416 rtw_write8(padapter
, FW_DYNAMIC_FUN_SWITCH
, (val8
| mode
));
420 rtw_write8(padapter
, FW_DYNAMIC_FUN_SWITCH
, (val8
& mode
));
426 static void Set_NETYPE1_MSR(_adapter
*padapter
, u8 type
)
428 rtw_hal_set_hwreg(padapter
, HW_VAR_MEDIA_STATUS1
, (u8
*)(&type
));
431 static void Set_NETYPE0_MSR(_adapter
*padapter
, u8 type
)
433 rtw_hal_set_hwreg(padapter
, HW_VAR_MEDIA_STATUS
, (u8
*)(&type
));
436 void Set_MSR(_adapter
*padapter
, u8 type
)
438 #ifdef CONFIG_CONCURRENT_MODE
439 if(padapter
->iface_type
== IFACE_PORT1
)
441 Set_NETYPE1_MSR(padapter
, type
);
446 Set_NETYPE0_MSR(padapter
, type
);
450 inline u8
rtw_get_oper_ch(_adapter
*adapter
)
452 return adapter_to_dvobj(adapter
)->oper_channel
;
455 inline void rtw_set_oper_ch(_adapter
*adapter
, u8 ch
)
457 if (adapter_to_dvobj(adapter
)->oper_channel
!= ch
)
458 adapter_to_dvobj(adapter
)->on_oper_ch_time
= rtw_get_current_time();
460 adapter_to_dvobj(adapter
)->oper_channel
= ch
;
463 inline u8
rtw_get_oper_bw(_adapter
*adapter
)
465 return adapter_to_dvobj(adapter
)->oper_bwmode
;
468 inline void rtw_set_oper_bw(_adapter
*adapter
, u8 bw
)
470 adapter_to_dvobj(adapter
)->oper_bwmode
= bw
;
473 inline u8
rtw_get_oper_choffset(_adapter
*adapter
)
475 return adapter_to_dvobj(adapter
)->oper_ch_offset
;
478 inline void rtw_set_oper_choffset(_adapter
*adapter
, u8 offset
)
480 adapter_to_dvobj(adapter
)->oper_ch_offset
= offset
;
483 inline u32
rtw_get_on_oper_ch_time(_adapter
*adapter
)
485 return adapter_to_dvobj(adapter
)->on_oper_ch_time
;
488 inline u32
rtw_get_on_cur_ch_time(_adapter
*adapter
)
490 if (adapter
->mlmeextpriv
.cur_channel
== adapter_to_dvobj(adapter
)->oper_channel
)
491 return adapter_to_dvobj(adapter
)->on_oper_ch_time
;
496 void SelectChannel(_adapter
*padapter
, unsigned char channel
)
498 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
500 #ifdef CONFIG_DUALMAC_CONCURRENT
502 rtw_set_oper_ch(padapter
, channel
);
503 dc_SelectChannel(padapter
, channel
);
504 #else //CONFIG_DUALMAC_CONCURRENT
506 _enter_critical_mutex(&(adapter_to_dvobj(padapter
)->setch_mutex
), NULL
);
509 rtw_set_oper_ch(padapter
, channel
);
511 rtw_hal_set_chan(padapter
, channel
);
513 _exit_critical_mutex(&(adapter_to_dvobj(padapter
)->setch_mutex
), NULL
);
515 #endif // CONFIG_DUALMAC_CONCURRENT
518 void SetBWMode(_adapter
*padapter
, unsigned short bwmode
, unsigned char channel_offset
)
520 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
522 #ifdef CONFIG_DUALMAC_CONCURRENT
524 rtw_set_oper_bw(padapter
, bwmode
);
525 rtw_set_oper_choffset(padapter
, channel_offset
);
526 dc_SetBWMode(padapter
, bwmode
, channel_offset
);
527 #else //CONFIG_DUALMAC_CONCURRENT
529 _enter_critical_mutex(&(adapter_to_dvobj(padapter
)->setbw_mutex
), NULL
);
532 rtw_set_oper_bw(padapter
, bwmode
);
533 rtw_set_oper_choffset(padapter
, channel_offset
);
535 rtw_hal_set_bwmode(padapter
, (HT_CHANNEL_WIDTH
)bwmode
, channel_offset
);
537 _exit_critical_mutex(&(adapter_to_dvobj(padapter
)->setbw_mutex
), NULL
);
539 #endif // CONFIG_DUALMAC_CONCURRENT
542 void set_channel_bwmode(_adapter
*padapter
, unsigned char channel
, unsigned char channel_offset
, unsigned short bwmode
)
545 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
547 if ( padapter
->bNotifyChannelChange
)
549 DBG_871X( "[%s] ch = %d, offset = %d, bwmode = %d\n", __FUNCTION__
, channel
, channel_offset
, bwmode
);
552 if((bwmode
== HT_CHANNEL_WIDTH_20
)||(channel_offset
== HAL_PRIME_CHNL_OFFSET_DONT_CARE
))
554 //SelectChannel(padapter, channel);
559 //switch to the proper channel
560 if (channel_offset
== HAL_PRIME_CHNL_OFFSET_LOWER
)
562 //SelectChannel(padapter, channel + 2);
563 center_ch
= channel
+ 2;
567 //SelectChannel(padapter, channel - 2);
568 center_ch
= channel
- 2;
572 //set Channel , must be independant for correct co_ch value/
573 #ifdef CONFIG_DUALMAC_CONCURRENT
574 //saved channel/bw info
575 rtw_set_oper_ch(padapter
, channel
);
576 rtw_set_oper_bw(padapter
, bwmode
);
577 rtw_set_oper_choffset(padapter
, channel_offset
);
578 dc_SelectChannel(padapter
, center_ch
);// set center channel
579 #else //CONFIG_DUALMAC_CONCURRENT
581 _enter_critical_mutex(&(adapter_to_dvobj(padapter
)->setch_mutex
), NULL
);
583 //saved channel/bw info
584 rtw_set_oper_ch(padapter
, channel
);
585 rtw_set_oper_bw(padapter
, bwmode
);
586 rtw_set_oper_choffset(padapter
, channel_offset
);
588 rtw_hal_set_chan(padapter
, center_ch
);
590 _exit_critical_mutex(&(adapter_to_dvobj(padapter
)->setch_mutex
), NULL
);
592 #endif // CONFIG_DUALMAC_CONCURRENT
596 SetBWMode(padapter
, bwmode
, channel_offset
);
600 int get_bsstype(unsigned short capability
)
602 if (capability
& BIT(0))
604 return WIFI_FW_AP_STATE
;
606 else if (capability
& BIT(1))
608 return WIFI_FW_ADHOC_STATE
;
616 __inline u8
*get_my_bssid(WLAN_BSSID_EX
*pnetwork
)
618 return (pnetwork
->MacAddress
);
621 u16
get_beacon_interval(WLAN_BSSID_EX
*bss
)
624 _rtw_memcpy((unsigned char *)&val
, rtw_get_beacon_interval_from_ie(bss
->IEs
), 2);
626 return le16_to_cpu(val
);
630 int is_client_associated_to_ap(_adapter
*padapter
)
632 struct mlme_ext_priv
*pmlmeext
;
633 struct mlme_ext_info
*pmlmeinfo
;
638 pmlmeext
= &padapter
->mlmeextpriv
;
639 pmlmeinfo
= &(pmlmeext
->mlmext_info
);
641 if ((pmlmeinfo
->state
& WIFI_FW_ASSOC_SUCCESS
) && ((pmlmeinfo
->state
&0x03) == WIFI_FW_STATION_STATE
))
651 int is_client_associated_to_ibss(_adapter
*padapter
)
653 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
654 struct mlme_ext_info
*pmlmeinfo
= &(pmlmeext
->mlmext_info
);
656 if ((pmlmeinfo
->state
& WIFI_FW_ASSOC_SUCCESS
) && ((pmlmeinfo
->state
&0x03) == WIFI_FW_ADHOC_STATE
))
666 int is_IBSS_empty(_adapter
*padapter
)
669 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
670 struct mlme_ext_info
*pmlmeinfo
= &(pmlmeext
->mlmext_info
);
672 for (i
= IBSS_START_MAC_ID
; i
< NUM_STA
; i
++)
674 if (pmlmeinfo
->FW_sta_info
[i
].status
== 1)
684 unsigned int decide_wait_for_beacon_timeout(unsigned int bcn_interval
)
686 if ((bcn_interval
<< 2) < WAIT_FOR_BCN_TO_MIN
)
688 return WAIT_FOR_BCN_TO_MIN
;
690 else if ((bcn_interval
<< 2) > WAIT_FOR_BCN_TO_MAX
)
692 return WAIT_FOR_BCN_TO_MAX
;
696 return ((bcn_interval
<< 2));
700 void CAM_empty_entry(
705 rtw_hal_set_hwreg(Adapter
, HW_VAR_CAM_EMPTY_ENTRY
, (u8
*)(&ucIndex
));
708 void invalidate_cam_all(_adapter
*padapter
)
710 rtw_hal_set_hwreg(padapter
, HW_VAR_CAM_INVALID_ALL
, 0);
713 static u32
_ReadCAM(_adapter
*padapter
,u32 addr
)
716 cmd
= CAM_POLLINIG
|addr
;
717 rtw_write32(padapter
, RWCAM
, cmd
);
720 if(0 == (rtw_read32(padapter
,REG_CAMCMD
) & CAM_POLLINIG
)){
723 }while(count
++ < 100);
725 return rtw_read32(padapter
,REG_CAMREAD
);
727 void read_cam(_adapter
*padapter
,u8 entry
)
729 u32 j
,count
= 0, addr
, cmd
;
732 printk("********* DUMP CAM Entry_#%02d***************\n",entry
);
733 for (j
= 0; j
< 6; j
++)
735 cmd
= _ReadCAM(padapter
,addr
+j
);
736 printk("offset:0x%02x => 0x%08x \n",addr
+j
,cmd
);
738 printk("*********************************\n");
742 void write_cam(_adapter
*padapter
, u8 entry
, u16 ctrl
, u8
*mac
, u8
*key
)
744 unsigned int i
, val
, addr
;
751 for (j
= 5; j
>= 0; j
--)
756 val
= (ctrl
| (mac
[0] << 16) | (mac
[1] << 24) );
760 val
= (mac
[2] | ( mac
[3] << 8) | (mac
[4] << 16) | (mac
[5] << 24));
765 val
= (key
[i
] | (key
[i
+1] << 8) | (key
[i
+2] << 16) | (key
[i
+3] << 24));
771 cam_val
[1] = addr
+ (unsigned int)j
;
773 rtw_hal_set_hwreg(padapter
, HW_VAR_CAM_WRITE
, (u8
*)cam_val
);
775 //rtw_write32(padapter, WCAMI, val);
777 //cmd = CAM_POLLINIG | CAM_WRITE | (addr + j);
778 //rtw_write32(padapter, RWCAM, cmd);
780 //DBG_871X("%s=> cam write: %x, %x\n",__FUNCTION__, cmd, val);
786 void clear_cam_entry(_adapter
*padapter
, u8 entry
)
796 cam_val
[1] = addr
+ (unsigned int)0;
798 rtw_hal_set_hwreg(padapter
, HW_VAR_CAM_WRITE
, (u8
*)cam_val
);
803 cam_val
[1] = addr
+ (unsigned int)1;
805 rtw_hal_set_hwreg(padapter
, HW_VAR_CAM_WRITE
, (u8
*)cam_val
);
808 unsigned char null_sta
[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
810 unsigned char null_key
[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00};
812 write_cam(padapter
, entry
, 0, null_sta
, null_key
);
817 int allocate_fw_sta_entry(_adapter
*padapter
)
820 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
821 struct mlme_ext_info
*pmlmeinfo
= &(pmlmeext
->mlmext_info
);
823 for (mac_id
= IBSS_START_MAC_ID
; mac_id
< NUM_STA
; mac_id
++)
825 if (pmlmeinfo
->FW_sta_info
[mac_id
].status
== 0)
827 pmlmeinfo
->FW_sta_info
[mac_id
].status
= 1;
828 pmlmeinfo
->FW_sta_info
[mac_id
].retry
= 0;
836 void flush_all_cam_entry(_adapter
*padapter
)
838 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
839 struct mlme_ext_info
*pmlmeinfo
= &(pmlmeext
->mlmext_info
);
841 #ifdef CONFIG_CONCURRENT_MODE
843 struct mlme_priv
*pmlmepriv
= &(padapter
->mlmepriv
);
845 //if(check_buddy_mlmeinfo_state(padapter, _HW_STATE_NOLINK_))
846 if(check_buddy_fwstate(padapter
, _FW_LINKED
) == _FALSE
)
848 rtw_hal_set_hwreg(padapter
, HW_VAR_CAM_INVALID_ALL
, 0);
852 if(check_fwstate(pmlmepriv
, WIFI_STATION_STATE
))
854 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
855 struct sta_info
*psta
;
856 u8 cam_id
;//cam_entry
858 psta
= rtw_get_stainfo(pstapriv
, pmlmeinfo
->network
.MacAddress
);
860 if(psta
->state
& WIFI_AP_STATE
)
861 {} //clear cam when ap free per sta_info
868 //clear_cam_entry(padapter, cam_id);
869 rtw_clearstakey_cmd(padapter
, (u8
*)psta
, cam_id
, _FALSE
);
872 else if(check_fwstate(pmlmepriv
, WIFI_AP_STATE
) == _TRUE
)
874 //clear cam when ap free per sta_info
877 #else //CONFIG_CONCURRENT_MODE
879 rtw_hal_set_hwreg(padapter
, HW_VAR_CAM_INVALID_ALL
, 0);
881 #endif //CONFIG_CONCURRENT_MODE
883 _rtw_memset((u8
*)(pmlmeinfo
->FW_sta_info
), 0, sizeof(pmlmeinfo
->FW_sta_info
));
887 #if defined(CONFIG_P2P) && defined(CONFIG_WFD)
888 int WFD_info_handler(_adapter
*padapter
, PNDIS_802_11_VARIABLE_IEs pIE
)
890 struct registry_priv
*pregpriv
= &padapter
->registrypriv
;
891 struct mlme_priv
*pmlmepriv
= &(padapter
->mlmepriv
);
892 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
893 struct mlme_ext_info
*pmlmeinfo
= &(pmlmeext
->mlmext_info
);
894 struct wifidirect_info
*pwdinfo
;
895 u8 wfd_ie
[ 128 ] = { 0x00 };
899 pwdinfo
= &padapter
->wdinfo
;
900 if ( rtw_get_wfd_ie( ( u8
* ) pIE
, pIE
->Length
, wfd_ie
, &wfd_ielen
) )
902 u8 attr_content
[ 10 ] = { 0x00 };
903 u32 attr_contentlen
= 0;
905 printk( "[%s] Found WFD IE\n", __FUNCTION__
);
906 rtw_get_wfd_attr_content( wfd_ie
, wfd_ielen
, WFD_ATTR_DEVICE_INFO
, attr_content
, &attr_contentlen
);
907 if ( attr_contentlen
)
909 pwdinfo
->wfd_info
->peer_rtsp_ctrlport
= RTW_GET_BE16( attr_content
+ 2 );
910 DBG_8192C( "[%s] Peer PORT NUM = %d\n", __FUNCTION__
, pwdinfo
->wfd_info
->peer_rtsp_ctrlport
);
916 printk( "[%s] NO WFD IE\n", __FUNCTION__
);
923 int WMM_param_handler(_adapter
*padapter
, PNDIS_802_11_VARIABLE_IEs pIE
)
925 //struct registry_priv *pregpriv = &padapter->registrypriv;
926 struct mlme_priv
*pmlmepriv
= &(padapter
->mlmepriv
);
927 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
928 struct mlme_ext_info
*pmlmeinfo
= &(pmlmeext
->mlmext_info
);
930 if(pmlmepriv
->qospriv
.qos_option
==0)
932 pmlmeinfo
->WMM_enable
= 0;
936 pmlmeinfo
->WMM_enable
= 1;
937 _rtw_memcpy(&(pmlmeinfo
->WMM_param
), (pIE
->data
+ 6), sizeof(struct WMM_para_element
));
940 /*if (pregpriv->wifi_spec == 1)
942 if (pmlmeinfo->WMM_enable == 1)
944 //todo: compare the parameter set count & decide wheher to update or not
949 pmlmeinfo->WMM_enable = 1;
950 _rtw_rtw_memcpy(&(pmlmeinfo->WMM_param), (pIE->data + 6), sizeof(struct WMM_para_element));
956 pmlmeinfo->WMM_enable = 0;
962 void WMMOnAssocRsp(_adapter
*padapter
)
964 u8 ACI
, ACM
, AIFS
, ECWMin
, ECWMax
, aSifsTime
;
968 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
969 struct mlme_ext_info
*pmlmeinfo
= &(pmlmeext
->mlmext_info
);
971 if (pmlmeinfo
->WMM_enable
== 0)
973 padapter
->mlmepriv
.acm_mask
= 0;
979 if( pmlmeext
->cur_wireless_mode
== WIRELESS_11B
)
984 for (i
= 0; i
< 4; i
++)
986 ACI
= (pmlmeinfo
->WMM_param
.ac_param
[i
].ACI_AIFSN
>> 5) & 0x03;
987 ACM
= (pmlmeinfo
->WMM_param
.ac_param
[i
].ACI_AIFSN
>> 4) & 0x01;
989 //AIFS = AIFSN * slot time + SIFS - r2t phy delay
990 AIFS
= (pmlmeinfo
->WMM_param
.ac_param
[i
].ACI_AIFSN
& 0x0f) * pmlmeinfo
->slotTime
+ aSifsTime
;
992 ECWMin
= (pmlmeinfo
->WMM_param
.ac_param
[i
].CW
& 0x0f);
993 ECWMax
= (pmlmeinfo
->WMM_param
.ac_param
[i
].CW
& 0xf0) >> 4;
994 TXOP
= le16_to_cpu(pmlmeinfo
->WMM_param
.ac_param
[i
].TXOP_limit
);
996 acParm
= AIFS
| (ECWMin
<< 8) | (ECWMax
<< 12) | (TXOP
<< 16);
1001 rtw_hal_set_hwreg(padapter
, HW_VAR_AC_PARAM_BE
, (u8
*)(&acParm
));
1002 acm_mask
|= (ACM
? BIT(1):0);
1006 rtw_hal_set_hwreg(padapter
, HW_VAR_AC_PARAM_BK
, (u8
*)(&acParm
));
1007 //acm_mask |= (ACM? BIT(0):0);
1011 rtw_hal_set_hwreg(padapter
, HW_VAR_AC_PARAM_VI
, (u8
*)(&acParm
));
1012 acm_mask
|= (ACM
? BIT(2):0);
1016 rtw_hal_set_hwreg(padapter
, HW_VAR_AC_PARAM_VO
, (u8
*)(&acParm
));
1017 acm_mask
|= (ACM
? BIT(3):0);
1021 DBG_871X("WMM(%x): %x, %x\n", ACI
, ACM
, acParm
);
1024 if(padapter
->registrypriv
.acm_method
== 1)
1025 rtw_hal_set_hwreg(padapter
, HW_VAR_ACM_CTRL
, (u8
*)(&acm_mask
));
1027 padapter
->mlmepriv
.acm_mask
= acm_mask
;
1032 static void bwmode_update_check(_adapter
*padapter
, PNDIS_802_11_VARIABLE_IEs pIE
)
1034 unsigned char new_bwmode
;
1035 unsigned char new_ch_offset
;
1036 struct HT_info_element
*pHT_info
;
1037 struct mlme_priv
*pmlmepriv
= &(padapter
->mlmepriv
);
1038 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1039 struct mlme_ext_info
*pmlmeinfo
= &(pmlmeext
->mlmext_info
);
1040 struct registry_priv
*pregistrypriv
= &padapter
->registrypriv
;
1041 struct ht_priv
*phtpriv
= &pmlmepriv
->htpriv
;
1047 if(phtpriv
->ht_option
== _FALSE
) return;
1049 if(pIE
->Length
> sizeof(struct HT_info_element
))
1052 pHT_info
= (struct HT_info_element
*)pIE
->data
;
1054 if (pmlmeext
->cur_channel
> 14) {
1055 if (pregistrypriv
->cbw40_enable
& BIT(1))
1058 if (pregistrypriv
->cbw40_enable
& BIT(0))
1062 if((pHT_info
->infos
[0] & BIT(2)) && cbw40_enable
)
1064 new_bwmode
= HT_CHANNEL_WIDTH_40
;
1066 switch (pHT_info
->infos
[0] & 0x3)
1069 new_ch_offset
= HAL_PRIME_CHNL_OFFSET_LOWER
;
1073 new_ch_offset
= HAL_PRIME_CHNL_OFFSET_UPPER
;
1077 new_ch_offset
= HAL_PRIME_CHNL_OFFSET_DONT_CARE
;
1083 new_bwmode
= HT_CHANNEL_WIDTH_20
;
1084 new_ch_offset
= HAL_PRIME_CHNL_OFFSET_DONT_CARE
;
1088 if((new_bwmode
!= pmlmeext
->cur_bwmode
) || (new_ch_offset
!=pmlmeext
->cur_ch_offset
))
1090 pmlmeinfo
->bwmode_updated
= _TRUE
;
1092 pmlmeext
->cur_bwmode
= new_bwmode
;
1093 pmlmeext
->cur_ch_offset
= new_ch_offset
;
1095 //update HT info also
1096 HT_info_handler(padapter
, pIE
);
1100 pmlmeinfo
->bwmode_updated
= _FALSE
;
1104 if(_TRUE
== pmlmeinfo
->bwmode_updated
)
1106 struct sta_info
*psta
;
1107 WLAN_BSSID_EX
*cur_network
= &(pmlmeinfo
->network
);
1108 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
1110 //set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
1113 //update ap's stainfo
1114 psta
= rtw_get_stainfo(pstapriv
, cur_network
->MacAddress
);
1117 struct ht_priv
*phtpriv_sta
= &psta
->htpriv
;
1119 if(phtpriv_sta
->ht_option
)
1122 phtpriv_sta
->bwmode
= pmlmeext
->cur_bwmode
;
1123 phtpriv_sta
->ch_offset
= pmlmeext
->cur_ch_offset
;
1127 phtpriv_sta
->bwmode
= HT_CHANNEL_WIDTH_20
;
1128 phtpriv_sta
->ch_offset
= HAL_PRIME_CHNL_OFFSET_DONT_CARE
;
1133 //pmlmeinfo->bwmode_updated = _FALSE;//bwmode_updated done, reset it!
1139 void HT_caps_handler(_adapter
*padapter
, PNDIS_802_11_VARIABLE_IEs pIE
)
1143 u8 max_AMPDU_len
, min_MPDU_spacing
;
1144 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1145 struct mlme_ext_info
*pmlmeinfo
= &(pmlmeext
->mlmext_info
);
1146 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
1147 struct ht_priv
*phtpriv
= &pmlmepriv
->htpriv
;
1148 struct registry_priv
*pregistrypriv
= &padapter
->registrypriv
;
1150 if(pIE
==NULL
) return;
1152 if(phtpriv
->ht_option
== _FALSE
) return;
1154 pmlmeinfo
->HT_caps_enable
= 1;
1156 for (i
= 0; i
< (pIE
->Length
); i
++)
1160 // Commented by Albert 2010/07/12
1161 // Got the endian issue here.
1162 pmlmeinfo
->HT_caps
.u
.HT_cap
[i
] &= (pIE
->data
[i
]);
1166 //modify from fw by Thomas 2010/11/17
1167 if ((pmlmeinfo
->HT_caps
.u
.HT_cap_element
.AMPDU_para
& 0x3) > (pIE
->data
[i
] & 0x3))
1169 max_AMPDU_len
= (pIE
->data
[i
] & 0x3);
1173 max_AMPDU_len
= (pmlmeinfo
->HT_caps
.u
.HT_cap_element
.AMPDU_para
& 0x3);
1176 if ((pmlmeinfo
->HT_caps
.u
.HT_cap_element
.AMPDU_para
& 0x1c) > (pIE
->data
[i
] & 0x1c))
1178 min_MPDU_spacing
= (pmlmeinfo
->HT_caps
.u
.HT_cap_element
.AMPDU_para
& 0x1c);
1182 min_MPDU_spacing
= (pIE
->data
[i
] & 0x1c);
1185 pmlmeinfo
->HT_caps
.u
.HT_cap_element
.AMPDU_para
= max_AMPDU_len
| min_MPDU_spacing
;
1189 // Commented by Albert 2010/07/12
1190 // Have to handle the endian issue after copying.
1191 // HT_ext_caps didn't be used yet.
1192 pmlmeinfo
->HT_caps
.u
.HT_cap_element
.HT_caps_info
= le16_to_cpu( pmlmeinfo
->HT_caps
.u
.HT_cap_element
.HT_caps_info
);
1193 pmlmeinfo
->HT_caps
.u
.HT_cap_element
.HT_ext_caps
= le16_to_cpu( pmlmeinfo
->HT_caps
.u
.HT_cap_element
.HT_ext_caps
);
1195 rtw_hal_get_hwreg(padapter
, HW_VAR_RF_TYPE
, (u8
*)(&rf_type
));
1197 //update the MCS rates
1198 for (i
= 0; i
< 16; i
++)
1200 if((rf_type
== RF_1T1R
) || (rf_type
== RF_1T2R
))
1202 pmlmeinfo
->HT_caps
.u
.HT_cap_element
.MCS_rate
[i
] &= MCS_rate_1R
[i
];
1206 #ifdef CONFIG_DISABLE_MCS13TO15
1207 if(pmlmeext
->cur_bwmode
== HT_CHANNEL_WIDTH_40
&& (pregistrypriv
->wifi_spec
!=1))
1208 pmlmeinfo
->HT_caps
.u
.HT_cap_element
.MCS_rate
[i
] &= MCS_rate_2R_MCS13TO15_OFF
[i
];
1210 pmlmeinfo
->HT_caps
.u
.HT_cap_element
.MCS_rate
[i
] &= MCS_rate_2R
[i
];
1212 pmlmeinfo
->HT_caps
.u
.HT_cap_element
.MCS_rate
[i
] &= MCS_rate_2R
[i
];
1213 #endif //CONFIG_DISABLE_MCS13TO15
1215 #ifdef RTL8192C_RECONFIG_TO_1T1R
1217 pmlmeinfo
->HT_caps
.u
.HT_cap_element
.MCS_rate
[i
] &= MCS_rate_1R
[i
];
1221 if(pregistrypriv
->special_rf_path
)
1222 pmlmeinfo
->HT_caps
.u
.HT_cap_element
.MCS_rate
[i
] &= MCS_rate_1R
[i
];
1229 void HT_info_handler(_adapter
*padapter
, PNDIS_802_11_VARIABLE_IEs pIE
)
1231 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1232 struct mlme_ext_info
*pmlmeinfo
= &(pmlmeext
->mlmext_info
);
1233 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
1234 struct ht_priv
*phtpriv
= &pmlmepriv
->htpriv
;
1236 if(pIE
==NULL
) return;
1238 if(phtpriv
->ht_option
== _FALSE
) return;
1241 if(pIE
->Length
> sizeof(struct HT_info_element
))
1244 pmlmeinfo
->HT_info_enable
= 1;
1245 _rtw_memcpy(&(pmlmeinfo
->HT_info
), pIE
->data
, pIE
->Length
);
1250 void HTOnAssocRsp(_adapter
*padapter
)
1252 unsigned char max_AMPDU_len
;
1253 unsigned char min_MPDU_spacing
;
1254 //struct registry_priv *pregpriv = &padapter->registrypriv;
1255 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1256 struct mlme_ext_info
*pmlmeinfo
= &(pmlmeext
->mlmext_info
);
1258 DBG_871X("%s\n", __FUNCTION__
);
1260 if ((pmlmeinfo
->HT_info_enable
) && (pmlmeinfo
->HT_caps_enable
))
1262 pmlmeinfo
->HT_enable
= 1;
1266 pmlmeinfo
->HT_enable
= 0;
1267 //set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
1271 //handle A-MPDU parameter field
1273 AMPDU_para [1:0]:Max AMPDU Len => 0:8k , 1:16k, 2:32k, 3:64k
1274 AMPDU_para [4:2]:Min MPDU Start Spacing
1276 max_AMPDU_len
= pmlmeinfo
->HT_caps
.u
.HT_cap_element
.AMPDU_para
& 0x03;
1278 min_MPDU_spacing
= (pmlmeinfo
->HT_caps
.u
.HT_cap_element
.AMPDU_para
& 0x1c) >> 2;
1280 rtw_hal_set_hwreg(padapter
, HW_VAR_AMPDU_MIN_SPACE
, (u8
*)(&min_MPDU_spacing
));
1282 rtw_hal_set_hwreg(padapter
, HW_VAR_AMPDU_FACTOR
, (u8
*)(&max_AMPDU_len
));
1284 #if 0 //move to rtw_update_ht_cap()
1285 if ((pregpriv
->cbw40_enable
) &&
1286 (pmlmeinfo
->HT_caps
.u
.HT_cap_element
.HT_caps_info
& BIT(1)) &&
1287 (pmlmeinfo
->HT_info
.infos
[0] & BIT(2)))
1289 //switch to the 40M Hz mode accoring to the AP
1290 pmlmeext
->cur_bwmode
= HT_CHANNEL_WIDTH_40
;
1291 switch ((pmlmeinfo
->HT_info
.infos
[0] & 0x3))
1293 case HT_EXTCHNL_OFFSET_UPPER
:
1294 pmlmeext
->cur_ch_offset
= HAL_PRIME_CHNL_OFFSET_LOWER
;
1297 case HT_EXTCHNL_OFFSET_LOWER
:
1298 pmlmeext
->cur_ch_offset
= HAL_PRIME_CHNL_OFFSET_UPPER
;
1302 pmlmeext
->cur_ch_offset
= HAL_PRIME_CHNL_OFFSET_DONT_CARE
;
1306 //SelectChannel(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset);
1310 //set_channel_bwmode(padapter, pmlmeext->cur_channel, pmlmeext->cur_ch_offset, pmlmeext->cur_bwmode);
1312 #if 0 //move to rtw_update_ht_cap()
1314 // Config SM Power Save setting
1316 pmlmeinfo
->SM_PS
= (pmlmeinfo
->HT_caps
.u
.HT_cap_element
.HT_caps_info
& 0x0C) >> 2;
1317 if(pmlmeinfo
->SM_PS
== WLAN_HT_CAP_SM_PS_STATIC
)
1320 //update the MCS rates
1321 for (i = 0; i < 16; i++)
1323 pmlmeinfo->HT_caps.HT_cap_element.MCS_rate[i] &= MCS_rate_1R[i];
1325 DBG_871X("%s(): WLAN_HT_CAP_SM_PS_STATIC\n",__FUNCTION__
);
1329 // Config current HT Protection mode.
1331 pmlmeinfo
->HT_protection
= pmlmeinfo
->HT_info
.infos
[1] & 0x3;
1336 void ERP_IE_handler(_adapter
*padapter
, PNDIS_802_11_VARIABLE_IEs pIE
)
1338 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1339 struct mlme_ext_info
*pmlmeinfo
= &(pmlmeext
->mlmext_info
);
1344 pmlmeinfo
->ERP_enable
= 1;
1345 _rtw_memcpy(&(pmlmeinfo
->ERP_IE
), pIE
->data
, pIE
->Length
);
1348 void VCS_update(_adapter
*padapter
, struct sta_info
*psta
)
1350 struct registry_priv
*pregpriv
= &padapter
->registrypriv
;
1351 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1352 struct mlme_ext_info
*pmlmeinfo
= &(pmlmeext
->mlmext_info
);
1354 switch (pregpriv
->vrtl_carrier_sense
)/* 0:off 1:on 2:auto */
1362 if (pregpriv
->vcs_type
== 1) /* 1:RTS/CTS 2:CTS to self */
1376 if ((pmlmeinfo
->ERP_enable
) && (pmlmeinfo
->ERP_IE
& BIT(1)))
1378 if (pregpriv
->vcs_type
== 1)
1399 int check_ap_tdls_prohibited(u8
*pframe
, u8 pkt_len
)
1401 u8 tdls_prohibited_bit
= 0x40; //bit(38); TDLS_prohibited
1409 if( (*pframe
) & tdls_prohibited_bit
)
1414 #endif //CONFIG_TDLS
1416 void update_beacon_info(_adapter
*padapter
, u8
*pframe
, uint pkt_len
, struct sta_info
*psta
)
1420 PNDIS_802_11_VARIABLE_IEs pIE
;
1423 struct tdls_info
*ptdlsinfo
= &padapter
->tdlsinfo
;
1424 u8 tdls_prohibited
[] = { 0x00, 0x00, 0x00, 0x00, 0x10 }; //bit(38): TDLS_prohibited
1425 #endif //CONFIG_TDLS
1427 len
= pkt_len
- (_BEACON_IE_OFFSET_
+ WLAN_HDR_A3_LEN
);
1429 for (i
= 0; i
< len
;)
1431 pIE
= (PNDIS_802_11_VARIABLE_IEs
)(pframe
+ (_BEACON_IE_OFFSET_
+ WLAN_HDR_A3_LEN
) + i
);
1433 switch (pIE
->ElementID
)
1436 case _VENDOR_SPECIFIC_IE_
:
1437 //todo: to update WMM paramter set while receiving beacon
1438 if (_rtw_memcmp(pIE
->data
, WMM_PARA_OUI
, 6)) //WMM
1440 (WMM_param_handler(padapter
, pIE
))? WMMOnAssocRsp(padapter
): 0;
1445 case _HT_EXTRA_INFO_IE_
: //HT info
1446 //HT_info_handler(padapter, pIE);
1447 bwmode_update_check(padapter
, pIE
);
1451 ERP_IE_handler(padapter
, pIE
);
1452 VCS_update(padapter
, psta
);
1457 if( check_ap_tdls_prohibited(pIE
->data
, pIE
->Length
) == _TRUE
)
1458 ptdlsinfo
->ap_prohibited
= _TRUE
;
1460 #endif //CONFIG_TDLS
1465 i
+= (pIE
->Length
+ 2);
1470 void process_csa_ie(_adapter
*padapter
, u8
*pframe
, uint pkt_len
)
1474 PNDIS_802_11_VARIABLE_IEs pIE
;
1477 len
= pkt_len
- (_BEACON_IE_OFFSET_
+ WLAN_HDR_A3_LEN
);
1479 for (i
= 0; i
< len
;)
1481 pIE
= (PNDIS_802_11_VARIABLE_IEs
)(pframe
+ (_BEACON_IE_OFFSET_
+ WLAN_HDR_A3_LEN
) + i
);
1483 switch (pIE
->ElementID
)
1485 case _CH_SWTICH_ANNOUNCE_
:
1486 _rtw_memcpy(&new_ch_no
, pIE
->data
+1, 1);
1487 rtw_set_csa_cmd(padapter
, new_ch_no
);
1494 i
+= (pIE
->Length
+ 2);
1499 unsigned int is_ap_in_tkip(_adapter
*padapter
)
1502 PNDIS_802_11_VARIABLE_IEs pIE
;
1503 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1504 struct mlme_ext_info
*pmlmeinfo
= &(pmlmeext
->mlmext_info
);
1505 WLAN_BSSID_EX
*cur_network
= &(pmlmeinfo
->network
);
1507 if (rtw_get_capability((WLAN_BSSID_EX
*)cur_network
) & WLAN_CAPABILITY_PRIVACY
)
1509 for (i
= sizeof(NDIS_802_11_FIXED_IEs
); i
< pmlmeinfo
->network
.IELength
;)
1511 pIE
= (PNDIS_802_11_VARIABLE_IEs
)(pmlmeinfo
->network
.IEs
+ i
);
1513 switch (pIE
->ElementID
)
1515 case _VENDOR_SPECIFIC_IE_
:
1516 if ((_rtw_memcmp(pIE
->data
, RTW_WPA_OUI
, 4)) && (_rtw_memcmp((pIE
->data
+ 12), WPA_TKIP_CIPHER
, 4)))
1523 if (_rtw_memcmp((pIE
->data
+ 8), RSN_TKIP_CIPHER
, 4))
1532 i
+= (pIE
->Length
+ 2);
1544 int wifirate2_ratetbl_inx(unsigned char rate
);
1545 int wifirate2_ratetbl_inx(unsigned char rate
)
1603 unsigned int update_basic_rate(unsigned char *ptn
, unsigned int ptn_sz
)
1605 unsigned int i
, num_of_rate
;
1606 unsigned int mask
= 0;
1608 num_of_rate
= (ptn_sz
> NumRates
)? NumRates
: ptn_sz
;
1610 for (i
= 0; i
< num_of_rate
; i
++)
1612 if ((*(ptn
+ i
)) & 0x80)
1614 mask
|= 0x1 << wifirate2_ratetbl_inx(*(ptn
+ i
));
1620 unsigned int update_supported_rate(unsigned char *ptn
, unsigned int ptn_sz
)
1622 unsigned int i
, num_of_rate
;
1623 unsigned int mask
= 0;
1625 num_of_rate
= (ptn_sz
> NumRates
)? NumRates
: ptn_sz
;
1627 for (i
= 0; i
< num_of_rate
; i
++)
1629 mask
|= 0x1 << wifirate2_ratetbl_inx(*(ptn
+ i
));
1635 unsigned int update_MSC_rate(struct HT_caps_element
*pHT_caps
)
1637 unsigned int mask
= 0;
1639 mask
= ((pHT_caps
->u
.HT_cap_element
.MCS_rate
[0] << 12) | (pHT_caps
->u
.HT_cap_element
.MCS_rate
[1] << 20));
1644 int support_short_GI(_adapter
*padapter
, struct HT_caps_element
*pHT_caps
)
1646 unsigned char bit_offset
;
1647 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1648 struct mlme_ext_info
*pmlmeinfo
= &(pmlmeext
->mlmext_info
);
1650 if (!(pmlmeinfo
->HT_enable
))
1653 if ((pmlmeinfo
->assoc_AP_vendor
== ralinkAP
))
1656 bit_offset
= (pmlmeext
->cur_bwmode
& HT_CHANNEL_WIDTH_40
)? 6: 5;
1658 if (pHT_caps
->u
.HT_cap_element
.HT_caps_info
& (0x1 << bit_offset
))
1668 unsigned char get_highest_rate_idx(u32 mask
)
1671 unsigned char rate_idx
=0;
1673 for(i
=27; i
>=0; i
--)
1685 unsigned char get_highest_mcs_rate(struct HT_caps_element
*pHT_caps
);
1686 unsigned char get_highest_mcs_rate(struct HT_caps_element
*pHT_caps
)
1690 mcs_rate
= (pHT_caps
->u
.HT_cap_element
.MCS_rate
[0] | (pHT_caps
->u
.HT_cap_element
.MCS_rate
[1] << 8));
1692 for (i
= 15; i
>= 0; i
--)
1694 if (mcs_rate
& (0x1 << i
))
1703 void Update_RA_Entry(_adapter
*padapter
, u32 mac_id
)
1705 rtw_hal_update_ra_mask(padapter
, mac_id
);
1708 void enable_rate_adaptive(_adapter
*padapter
, u32 mac_id
);
1709 void enable_rate_adaptive(_adapter
*padapter
, u32 mac_id
)
1711 Update_RA_Entry(padapter
, mac_id
);
1714 void set_sta_rate(_adapter
*padapter
, struct sta_info
*psta
)
1717 enable_rate_adaptive(padapter
, psta
->mac_id
);
1720 // Update RRSR and Rate for USERATE
1721 void update_tx_basic_rate(_adapter
*padapter
, u8 wirelessmode
)
1723 NDIS_802_11_RATES_EX supported_rates
;
1724 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1726 struct wifidirect_info
* pwdinfo
= &padapter
->wdinfo
;
1728 // Added by Albert 2011/03/22
1729 // In the P2P mode, the driver should not support the b mode.
1730 // So, the Tx packet shouldn't use the CCK rate
1731 if(!rtw_p2p_chk_state(pwdinfo
, P2P_STATE_NONE
))
1734 #ifdef CONFIG_INTEL_WIDI
1735 if (padapter
->mlmepriv
.widi_state
!= INTEL_WIDI_STATE_NONE
)
1737 #endif //CONFIG_INTEL_WIDI
1739 _rtw_memset(supported_rates
, 0, NDIS_802_11_LENGTH_RATES_EX
);
1741 //clear B mod if current channel is in 5G band, avoid tx cck rate in 5G band.
1742 if(pmlmeext
->cur_channel
> 14)
1743 wirelessmode
&= ~(WIRELESS_11B
);
1745 if ((wirelessmode
& WIRELESS_11B
) && (wirelessmode
== WIRELESS_11B
)) {
1746 _rtw_memcpy(supported_rates
, rtw_basic_rate_cck
, 4);
1747 } else if (wirelessmode
& WIRELESS_11B
) {
1748 _rtw_memcpy(supported_rates
, rtw_basic_rate_mix
, 7);
1750 _rtw_memcpy(supported_rates
, rtw_basic_rate_ofdm
, 3);
1753 if (wirelessmode
& WIRELESS_11B
)
1754 update_mgnt_tx_rate(padapter
, IEEE80211_CCK_RATE_1MB
);
1756 update_mgnt_tx_rate(padapter
, IEEE80211_OFDM_RATE_6MB
);
1758 rtw_hal_set_hwreg(padapter
, HW_VAR_BASIC_RATE
, supported_rates
);
1761 unsigned char check_assoc_AP(u8
*pframe
, uint len
)
1764 PNDIS_802_11_VARIABLE_IEs pIE
;
1766 for (i
= sizeof(NDIS_802_11_FIXED_IEs
); i
< len
;)
1768 pIE
= (PNDIS_802_11_VARIABLE_IEs
)(pframe
+ i
);
1770 switch (pIE
->ElementID
)
1772 case _VENDOR_SPECIFIC_IE_
:
1773 if ((_rtw_memcmp(pIE
->data
, ARTHEROS_OUI1
, 3)) || (_rtw_memcmp(pIE
->data
, ARTHEROS_OUI2
, 3)))
1775 DBG_871X("link to Artheros AP\n");
1778 else if ((_rtw_memcmp(pIE
->data
, BROADCOM_OUI1
, 3))
1779 || (_rtw_memcmp(pIE
->data
, BROADCOM_OUI2
, 3))
1780 || (_rtw_memcmp(pIE
->data
, BROADCOM_OUI2
, 3)))
1782 DBG_871X("link to Broadcom AP\n");
1785 else if (_rtw_memcmp(pIE
->data
, MARVELL_OUI
, 3))
1787 DBG_871X("link to Marvell AP\n");
1790 else if (_rtw_memcmp(pIE
->data
, RALINK_OUI
, 3))
1792 DBG_871X("link to Ralink AP\n");
1795 else if (_rtw_memcmp(pIE
->data
, CISCO_OUI
, 3))
1797 DBG_871X("link to Cisco AP\n");
1800 else if (_rtw_memcmp(pIE
->data
, REALTEK_OUI
, 3))
1802 DBG_871X("link to Realtek 96B\n");
1805 else if (_rtw_memcmp(pIE
->data
, AIRGOCAP_OUI
,3))
1807 DBG_871X("link to Airgo Cap\n");
1819 i
+= (pIE
->Length
+ 2);
1822 DBG_871X("link to new AP\n");
1826 void update_IOT_info(_adapter
*padapter
)
1828 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1829 struct mlme_ext_info
*pmlmeinfo
= &(pmlmeext
->mlmext_info
);
1831 switch (pmlmeinfo
->assoc_AP_vendor
)
1834 pmlmeinfo
->turboMode_cts2self
= 1;
1835 pmlmeinfo
->turboMode_rtsen
= 0;
1839 pmlmeinfo
->turboMode_cts2self
= 0;
1840 pmlmeinfo
->turboMode_rtsen
= 1;
1841 //disable high power
1842 Switch_DM_Func(padapter
, (~DYNAMIC_FUNC_HP
), _FALSE
);
1845 //rtw_write16(padapter, 0x4cc, 0xffff);
1846 //rtw_write16(padapter, 0x546, 0x01c0);
1847 //disable high power
1848 Switch_DM_Func(padapter
, (~DYNAMIC_FUNC_HP
), _FALSE
);
1851 pmlmeinfo
->turboMode_cts2self
= 0;
1852 pmlmeinfo
->turboMode_rtsen
= 1;
1858 void update_capinfo(PADAPTER Adapter
, u16 updateCap
)
1860 struct mlme_ext_priv
*pmlmeext
= &Adapter
->mlmeextpriv
;
1861 struct mlme_ext_info
*pmlmeinfo
= &(pmlmeext
->mlmext_info
);
1862 BOOLEAN ShortPreamble
;
1864 // Check preamble mode, 2005.01.06, by rcnjko.
1865 // Mark to update preamble value forever, 2008.03.18 by lanhsin
1866 //if( pMgntInfo->RegPreambleMode == PREAMBLE_AUTO )
1869 if(updateCap
& cShortPreamble
)
1871 if(pmlmeinfo
->preamble_mode
!= PREAMBLE_SHORT
) // PREAMBLE_LONG or PREAMBLE_AUTO
1873 ShortPreamble
= _TRUE
;
1874 pmlmeinfo
->preamble_mode
= PREAMBLE_SHORT
;
1875 rtw_hal_set_hwreg( Adapter
, HW_VAR_ACK_PREAMBLE
, (u8
*)&ShortPreamble
);
1880 if(pmlmeinfo
->preamble_mode
!= PREAMBLE_LONG
) // PREAMBLE_SHORT or PREAMBLE_AUTO
1882 ShortPreamble
= _FALSE
;
1883 pmlmeinfo
->preamble_mode
= PREAMBLE_LONG
;
1884 rtw_hal_set_hwreg( Adapter
, HW_VAR_ACK_PREAMBLE
, (u8
*)&ShortPreamble
);
1889 if ( updateCap
& cIBSS
) {
1890 //Filen: See 802.11-2007 p.91
1891 pmlmeinfo
->slotTime
= NON_SHORT_SLOT_TIME
;
1895 //Filen: See 802.11-2007 p.90
1896 if( pmlmeext
->cur_wireless_mode
& (WIRELESS_11G
| WIRELESS_11_24N
))
1898 if( (updateCap
& cShortSlotTime
) /* && (!(pMgntInfo->pHTInfo->RT2RT_HT_Mode & RT_HT_CAP_USE_LONG_PREAMBLE)) */)
1899 { // Short Slot Time
1900 if(pmlmeinfo
->slotTime
!= SHORT_SLOT_TIME
)
1902 pmlmeinfo
->slotTime
= SHORT_SLOT_TIME
;
1907 if(pmlmeinfo
->slotTime
!= NON_SHORT_SLOT_TIME
)
1909 pmlmeinfo
->slotTime
= NON_SHORT_SLOT_TIME
;
1913 else if( pmlmeext
->cur_wireless_mode
& (WIRELESS_11A
| WIRELESS_11_5N
))
1915 pmlmeinfo
->slotTime
= SHORT_SLOT_TIME
;
1920 pmlmeinfo
->slotTime
= NON_SHORT_SLOT_TIME
;
1924 rtw_hal_set_hwreg( Adapter
, HW_VAR_SLOT_TIME
, &pmlmeinfo
->slotTime
);
1928 void update_wireless_mode(_adapter
*padapter
)
1931 int ratelen
, network_type
= 0;
1932 u32 SIFS_Timer
, mask
;
1933 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1934 struct mlme_ext_info
*pmlmeinfo
= &(pmlmeext
->mlmext_info
);
1935 WLAN_BSSID_EX
*cur_network
= &(pmlmeinfo
->network
);
1936 unsigned char *rate
= cur_network
->SupportedRates
;
1937 #ifdef CONFIG_CONCURRENT_MODE
1938 _adapter
*pbuddy_adapter
= padapter
->pbuddy_adapter
;
1939 #endif //CONFIG_CONCURRENT_MODE
1941 ratelen
= rtw_get_rateset_len(cur_network
->SupportedRates
);
1943 if ((pmlmeinfo
->HT_info_enable
) && (pmlmeinfo
->HT_caps_enable
))
1945 pmlmeinfo
->HT_enable
= 1;
1948 if(pmlmeext
->cur_channel
> 14)
1950 if (pmlmeinfo
->HT_enable
)
1952 network_type
= WIRELESS_11_5N
;
1955 network_type
|= WIRELESS_11A
;
1959 if (pmlmeinfo
->HT_enable
)
1961 network_type
= WIRELESS_11_24N
;
1964 if ((cckratesonly_included(rate
, ratelen
)) == _TRUE
)
1966 network_type
|= WIRELESS_11B
;
1968 else if((cckrates_included(rate
, ratelen
)) == _TRUE
)
1970 network_type
|= WIRELESS_11BG
;
1974 network_type
|= WIRELESS_11G
;
1978 pmlmeext
->cur_wireless_mode
= network_type
& padapter
->registrypriv
.wireless_mode
;
1980 //For STA mode, driver need to modify initial data rate, or MAC will use wrong tx rate.
1981 //Modified by Thomas 2012-12-3
1982 mask
= update_supported_rate(cur_network
->SupportedRates
, ratelen
);
1983 init_rate
= get_highest_rate_idx(mask
)&0x3f;
1984 rtw_hal_set_hwreg( padapter
, HW_VAR_INIT_DATA_RATE
, (u8
*)&init_rate
);
1987 if((pmlmeext->cur_wireless_mode==WIRELESS_11G) ||
1988 (pmlmeext->cur_wireless_mode==WIRELESS_11BG))//WIRELESS_MODE_G)
1989 SIFS_Timer = 0x0a0a;//CCK
1991 SIFS_Timer = 0x0e0e;//pHalData->SifsTime; //OFDM
1994 SIFS_Timer
= 0x0a0a0808; //0x0808 -> for CCK, 0x0a0a -> for OFDM
1995 //change this value if having IOT issues.
1997 rtw_hal_set_hwreg( padapter
, HW_VAR_RESP_SIFS
, (u8
*)&SIFS_Timer
);
1999 if (pmlmeext
->cur_wireless_mode
& WIRELESS_11B
)
2000 update_mgnt_tx_rate(padapter
, IEEE80211_CCK_RATE_1MB
);
2003 update_mgnt_tx_rate(padapter
, IEEE80211_OFDM_RATE_6MB
);
2004 #ifdef CONFIG_CONCURRENT_MODE
2005 if(pbuddy_adapter
&& (pmlmeext
->cur_wireless_mode
& WIRELESS_11A
))
2006 update_mgnt_tx_rate(pbuddy_adapter
, IEEE80211_OFDM_RATE_6MB
);
2007 #endif //CONFIG_CONCURRENT_MODE
2011 void fire_write_MAC_cmd(_adapter
*padapter
, unsigned int addr
, unsigned int value
);
2012 void fire_write_MAC_cmd(_adapter
*padapter
, unsigned int addr
, unsigned int value
)
2015 struct cmd_obj
*ph2c
;
2016 struct reg_rw_parm
*pwriteMacPara
;
2017 struct cmd_priv
*pcmdpriv
= &(padapter
->cmdpriv
);
2019 if ((ph2c
= (struct cmd_obj
*)rtw_zmalloc(sizeof(struct cmd_obj
))) == NULL
)
2024 if ((pwriteMacPara
= (struct reg_rw_parm
*)rtw_malloc(sizeof(struct reg_rw_parm
))) == NULL
)
2026 rtw_mfree((unsigned char *)ph2c
, sizeof(struct cmd_obj
));
2030 pwriteMacPara
->rw
= 1;
2031 pwriteMacPara
->addr
= addr
;
2032 pwriteMacPara
->value
= value
;
2034 init_h2fwcmd_w_parm_no_rsp(ph2c
, pwriteMacPara
, GEN_CMD_CODE(_Write_MACREG
));
2035 rtw_enqueue_cmd(pcmdpriv
, ph2c
);
2039 void update_bmc_sta_support_rate(_adapter
*padapter
, u32 mac_id
)
2041 struct mlme_ext_priv
*pmlmeext
= &(padapter
->mlmeextpriv
);
2042 struct mlme_ext_info
*pmlmeinfo
= &(pmlmeext
->mlmext_info
);
2044 if(pmlmeext
->cur_wireless_mode
& WIRELESS_11B
)
2046 // Only B, B/G, and B/G/N AP could use CCK rate
2047 _rtw_memcpy((pmlmeinfo
->FW_sta_info
[mac_id
].SupportedRates
), rtw_basic_rate_cck
, 4);
2051 _rtw_memcpy((pmlmeinfo
->FW_sta_info
[mac_id
].SupportedRates
), rtw_basic_rate_ofdm
, 3);
2055 int update_sta_support_rate(_adapter
*padapter
, u8
* pvar_ie
, uint var_ie_len
, int cam_idx
)
2057 unsigned int ie_len
;
2058 PNDIS_802_11_VARIABLE_IEs pIE
;
2059 int supportRateNum
= 0;
2060 struct mlme_ext_priv
*pmlmeext
= &(padapter
->mlmeextpriv
);
2061 struct mlme_ext_info
*pmlmeinfo
= &(pmlmeext
->mlmext_info
);
2063 pIE
= (PNDIS_802_11_VARIABLE_IEs
)rtw_get_ie(pvar_ie
, _SUPPORTEDRATES_IE_
, &ie_len
, var_ie_len
);
2069 _rtw_memcpy(pmlmeinfo
->FW_sta_info
[cam_idx
].SupportedRates
, pIE
->data
, ie_len
);
2070 supportRateNum
= ie_len
;
2072 pIE
= (PNDIS_802_11_VARIABLE_IEs
)rtw_get_ie(pvar_ie
, _EXT_SUPPORTEDRATES_IE_
, &ie_len
, var_ie_len
);
2075 _rtw_memcpy((pmlmeinfo
->FW_sta_info
[cam_idx
].SupportedRates
+ supportRateNum
), pIE
->data
, ie_len
);
2082 void process_addba_req(_adapter
*padapter
, u8
*paddba_req
, u8
*addr
)
2084 struct sta_info
*psta
;
2085 u16 tid
, start_seq
, param
;
2086 struct recv_reorder_ctrl
*preorder_ctrl
;
2087 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
2088 struct ADDBA_request
*preq
= (struct ADDBA_request
*)paddba_req
;
2089 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
2090 struct mlme_ext_info
*pmlmeinfo
= &(pmlmeext
->mlmext_info
);
2092 psta
= rtw_get_stainfo(pstapriv
, addr
);
2096 start_seq
= le16_to_cpu(preq
->BA_starting_seqctrl
) >> 4;
2098 param
= le16_to_cpu(preq
->BA_para_set
);
2099 tid
= (param
>>2)&0x0f;
2101 preorder_ctrl
= &psta
->recvreorder_ctrl
[tid
];
2103 #ifdef CONFIG_UPDATE_INDICATE_SEQ_WHILE_PROCESS_ADDBA_REQ
2104 preorder_ctrl
->indicate_seq
= start_seq
;
2106 DBG_871X("DBG_RX_SEQ %s:%d IndicateSeq: %d, start_seq: %d\n", __FUNCTION__
, __LINE__
,
2107 preorder_ctrl
->indicate_seq
, start_seq
);
2110 preorder_ctrl
->indicate_seq
= 0xffff;
2113 preorder_ctrl
->enable
=(pmlmeinfo
->bAcceptAddbaReq
== _TRUE
)? _TRUE
:_FALSE
;
2118 void update_TSF(struct mlme_ext_priv
*pmlmeext
, u8
*pframe
, uint len
)
2123 pIE
= pframe
+ sizeof(struct rtw_ieee80211_hdr_3addr
);
2126 pmlmeext
->TSFValue
= le32_to_cpu(*(pbuf
+1));
2128 pmlmeext
->TSFValue
= pmlmeext
->TSFValue
<< 32;
2130 pmlmeext
->TSFValue
|= le32_to_cpu(*pbuf
);
2133 void correct_TSF(_adapter
*padapter
, struct mlme_ext_priv
*pmlmeext
)
2135 rtw_hal_set_hwreg(padapter
, HW_VAR_CORRECT_TSF
, 0);
2138 void beacon_timing_control(_adapter
*padapter
)
2140 rtw_hal_bcn_related_reg_setting(padapter
);
2144 unsigned int setup_beacon_frame(_adapter
*padapter
, unsigned char *beacon_frame
)
2146 unsigned short ATIMWindow
;
2147 unsigned char *pframe
;
2148 struct tx_desc
*ptxdesc
;
2149 struct rtw_ieee80211_hdr
*pwlanhdr
;
2150 unsigned short *fctrl
;
2151 unsigned int rate_len
, len
= 0;
2152 struct xmit_priv
*pxmitpriv
= &(padapter
->xmitpriv
);
2153 struct mlme_ext_priv
*pmlmeext
= &(padapter
->mlmeextpriv
);
2154 struct mlme_ext_info
*pmlmeinfo
= &(pmlmeext
->mlmext_info
);
2155 WLAN_BSSID_EX
*cur_network
= &(pmlmeinfo
->network
);
2156 u8 bc_addr
[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
2158 _rtw_memset(beacon_frame
, 0, 256);
2160 pframe
= beacon_frame
+ TXDESC_SIZE
;
2162 pwlanhdr
= (struct rtw_ieee80211_hdr
*)pframe
;
2164 fctrl
= &(pwlanhdr
->frame_ctl
);
2167 _rtw_memcpy(pwlanhdr
->addr1
, bc_addr
, ETH_ALEN
);
2168 _rtw_memcpy(pwlanhdr
->addr2
, myid(&(padapter
->eeprompriv
)), ETH_ALEN
);
2169 _rtw_memcpy(pwlanhdr
->addr3
, get_my_bssid(cur_network
), ETH_ALEN
);
2171 SetFrameSubType(pframe
, WIFI_BEACON
);
2173 pframe
+= sizeof(struct rtw_ieee80211_hdr_3addr
);
2174 len
= sizeof(struct rtw_ieee80211_hdr_3addr
);
2176 //timestamp will be inserted by hardware
2180 // beacon interval: 2 bytes
2181 _rtw_memcpy(pframe
, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network
->IEs
)), 2);
2186 // capability info: 2 bytes
2187 _rtw_memcpy(pframe
, (unsigned char *)(rtw_get_capability_from_ie(cur_network
->IEs
)), 2);
2193 pframe
= rtw_set_ie(pframe
, _SSID_IE_
, cur_network
->Ssid
.SsidLength
, cur_network
->Ssid
.Ssid
, &len
);
2195 // supported rates...
2196 rate_len
= rtw_get_rateset_len(cur_network
->SupportedRates
);
2197 pframe
= rtw_set_ie(pframe
, _SUPPORTEDRATES_IE_
, ((rate_len
> 8)? 8: rate_len
), cur_network
->SupportedRates
, &len
);
2200 pframe
= rtw_set_ie(pframe
, _DSSET_IE_
, 1, (unsigned char *)&(cur_network
->Configuration
.DSConfig
), &len
);
2202 // IBSS Parameter Set...
2203 //ATIMWindow = cur->Configuration.ATIMWindow;
2205 pframe
= rtw_set_ie(pframe
, _IBSS_PARA_IE_
, 2, (unsigned char *)(&ATIMWindow
), &len
);
2209 // EXTERNDED SUPPORTED RATE
2212 pframe
= rtw_set_ie(pframe
, _EXT_SUPPORTEDRATES_IE_
, (rate_len
- 8), (cur_network
->SupportedRates
+ 8), &len
);
2215 if ((len
+ TXDESC_SIZE
) > 256)
2217 //DBG_871X("marc: beacon frame too large\n");
2221 //fill the tx descriptor
2222 ptxdesc
= (struct tx_desc
*)beacon_frame
;
2225 ptxdesc
->txdw0
|= cpu_to_le32(len
& 0x0000ffff);
2226 ptxdesc
->txdw0
|= cpu_to_le32(((TXDESC_SIZE
+ OFFSET_SZ
) << OFFSET_SHT
) & 0x00ff0000); //default = 32 bytes for TX Desc
2229 ptxdesc
->txdw1
|= cpu_to_le32((0x10 << QSEL_SHT
) & 0x00001f00);
2232 ptxdesc
->txdw2
|= cpu_to_le32(BMC
);
2233 ptxdesc
->txdw2
|= cpu_to_le32(BK
);
2236 ptxdesc
->txdw4
= 0x80000000;
2239 ptxdesc
->txdw5
= 0x00000000; //1M
2241 return (len
+ TXDESC_SIZE
);
2245 static _adapter
*pbuddy_padapter
= NULL
;
2247 int rtw_handle_dualmac(_adapter
*adapter
, bool init
)
2249 int status
= _SUCCESS
;
2250 struct dvobj_priv
*dvobj
= adapter_to_dvobj(adapter
);
2252 if (!IS_HARDWARE_TYPE_8192D(adapter
))
2256 rtw_hal_get_def_var(adapter
, HAL_DEF_DUAL_MAC_MODE
, &dvobj
->DualMacMode
);
2257 if (dvobj
->DualMacMode
== _TRUE
) {
2258 // temply disable IPS For 92D-VC
2259 adapter
->registrypriv
.ips_mode
= IPS_NONE
;
2262 /* For SMSP on 92DU-VC, driver do not probe another Interface. */
2263 if ((dvobj
->DualMacMode
!= _TRUE
) && (dvobj
->InterfaceNumber
!= 0)) {
2264 DBG_871X("%s(): Do not init another Interface because SMSP\n",__FUNCTION__
);
2269 #ifndef CONFIG_CONCURRENT_MODE
2270 if (dvobj
->DualMacMode
== _TRUE
) {
2271 if (pbuddy_padapter
== NULL
) {
2272 pbuddy_padapter
= adapter
;
2273 DBG_871X("%s(): pbuddy_padapter == NULL, Set pbuddy_padapter\n",__FUNCTION__
);
2275 adapter
->pbuddy_adapter
= pbuddy_padapter
;
2276 pbuddy_padapter
->pbuddy_adapter
= adapter
;
2277 // clear global value
2278 pbuddy_padapter
= NULL
;
2279 DBG_871X("%s(): pbuddy_padapter exist, Exchange Information\n",__FUNCTION__
);
2283 #ifdef CONFIG_DUALMAC_CONCURRENT
2284 if (dvobj
->InterfaceNumber
== 0) {
2285 //set adapter_type/iface type
2286 adapter
->isprimary
= _TRUE
;
2287 adapter
->adapter_type
= PRIMARY_ADAPTER
;
2288 adapter
->iface_type
= IFACE_PORT0
;
2289 DBG_871X("%s(): PRIMARY_ADAPTER\n",__FUNCTION__
);
2291 //set adapter_type/iface type
2292 adapter
->isprimary
= _FALSE
;
2293 adapter
->adapter_type
= SECONDARY_ADAPTER
;
2294 adapter
->iface_type
= IFACE_PORT1
;
2295 DBG_871X("%s(): SECONDARY_ADAPTER\n",__FUNCTION__
);
2300 pbuddy_padapter
= NULL
;