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 ******************************************************************************/
17 #include <osdep_service.h>
18 #include <drv_types.h>
19 #include <linux/ieee80211.h>
21 #include <rtl8723a_cmd.h>
22 #include <rtl8723a_hal.h>
23 #include <asm/unaligned.h>
24 #include <rtw_mlme_ext.h>
26 void init_mlme_ap_info23a(struct rtw_adapter
*padapter
)
28 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
29 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
30 struct wlan_acl_pool
*pacl_list
= &pstapriv
->acl_list
;
32 spin_lock_init(&pmlmepriv
->bcn_update_lock
);
35 _rtw_init_queue23a(&pacl_list
->acl_node_q
);
37 start_ap_mode23a(padapter
);
40 void free_mlme_ap_info23a(struct rtw_adapter
*padapter
)
42 struct sta_info
*psta
= NULL
;
43 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
44 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
45 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
46 struct mlme_ext_info
*pmlmeinfo
= &pmlmeext
->mlmext_info
;
48 pmlmepriv
->update_bcn
= false;
49 pmlmeext
->bstart_bss
= false;
51 rtw_sta_flush23a(padapter
);
53 pmlmeinfo
->state
= MSR_NOLINK
;
55 /* free_assoc_sta_resources */
56 rtw_free_all_stainfo23a(padapter
);
58 /* free bc/mc sta_info */
59 psta
= rtw_get_bcmc_stainfo23a(padapter
);
60 spin_lock_bh(&pstapriv
->sta_hash_lock
);
61 rtw_free_stainfo23a(padapter
, psta
);
62 spin_unlock_bh(&pstapriv
->sta_hash_lock
);
65 static void update_BCNTIM(struct rtw_adapter
*padapter
)
67 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
68 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
69 struct mlme_ext_info
*pmlmeinfo
= &pmlmeext
->mlmext_info
;
70 struct wlan_bssid_ex
*pnetwork_mlmeext
= &pmlmeinfo
->network
;
71 unsigned char *pie
= pnetwork_mlmeext
->IEs
;
72 u8
*p
, *dst_ie
, *premainder_ie
= NULL
, *pbackup_remainder_ie
= NULL
;
73 uint offset
, tmp_len
, tim_ielen
, tim_ie_offset
, remainder_ielen
;
75 p
= rtw_get_ie23a(pie
, WLAN_EID_TIM
, &tim_ielen
,
76 pnetwork_mlmeext
->IELength
);
77 if (p
!= NULL
&& tim_ielen
> 0) {
80 premainder_ie
= p
+tim_ielen
;
82 tim_ie_offset
= (int)(p
- pie
);
84 remainder_ielen
= pnetwork_mlmeext
->IELength
- tim_ie_offset
- tim_ielen
;
86 /* append TIM IE from dst_ie offset */
91 /* calculate head_len */
95 p
= rtw_get_ie23a(pie
, WLAN_EID_SSID
,
96 &tmp_len
, pnetwork_mlmeext
->IELength
);
100 /* get supported rates len */
101 p
= rtw_get_ie23a(pie
, WLAN_EID_SUPP_RATES
,
102 &tmp_len
, pnetwork_mlmeext
->IELength
);
106 /* DS Parameter Set IE, len = 3 */
109 premainder_ie
= pie
+ offset
;
111 remainder_ielen
= pnetwork_mlmeext
->IELength
- offset
- tim_ielen
;
113 /* append TIM IE from offset */
114 dst_ie
= pie
+ offset
;
117 if (remainder_ielen
> 0) {
118 pbackup_remainder_ie
= kmalloc(remainder_ielen
, GFP_ATOMIC
);
119 if (pbackup_remainder_ie
&& premainder_ie
)
120 memcpy(pbackup_remainder_ie
, premainder_ie
, remainder_ielen
);
123 *dst_ie
++ = WLAN_EID_TIM
;
125 if ((pstapriv
->tim_bitmap
&0xff00) && (pstapriv
->tim_bitmap
&0x00fc))
130 *dst_ie
++ = tim_ielen
;
132 *dst_ie
++ = 0; /* DTIM count */
133 *dst_ie
++ = 1; /* DTIM period */
135 if (pstapriv
->tim_bitmap
& BIT(0)) /* for bc/mc frames */
136 *dst_ie
++ = BIT(0); /* bitmap ctrl */
140 if (tim_ielen
== 4) {
141 *dst_ie
++ = pstapriv
->tim_bitmap
& 0xff;
142 } else if (tim_ielen
== 5) {
143 put_unaligned_le16(pstapriv
->tim_bitmap
, dst_ie
);
147 /* copy remainder IE */
148 if (pbackup_remainder_ie
) {
149 memcpy(dst_ie
, pbackup_remainder_ie
, remainder_ielen
);
151 kfree(pbackup_remainder_ie
);
154 offset
= (uint
)(dst_ie
- pie
);
155 pnetwork_mlmeext
->IELength
= offset
+ remainder_ielen
;
157 set_tx_beacon_cmd23a(padapter
);
160 static u8
chk_sta_is_alive(struct sta_info
*psta
)
164 if ((psta
->sta_stats
.last_rx_data_pkts
+
165 psta
->sta_stats
.last_rx_ctrl_pkts
) !=
166 (psta
->sta_stats
.rx_data_pkts
+ psta
->sta_stats
.rx_ctrl_pkts
))
169 sta_update_last_rx_pkts(psta
);
174 void expire_timeout_chk23a(struct rtw_adapter
*padapter
)
176 struct list_head
*phead
, *plist
, *ptmp
;
178 struct sta_info
*psta
;
179 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
180 u8 chk_alive_num
= 0;
181 struct sta_info
*chk_alive_list
[NUM_STA
];
184 spin_lock_bh(&pstapriv
->auth_list_lock
);
186 phead
= &pstapriv
->auth_list
;
188 /* check auth_queue */
189 list_for_each_safe(plist
, ptmp
, phead
) {
190 psta
= container_of(plist
, struct sta_info
, auth_list
);
192 if (psta
->expire_to
> 0) {
194 if (psta
->expire_to
== 0) {
195 list_del_init(&psta
->auth_list
);
196 pstapriv
->auth_list_cnt
--;
198 DBG_8723A("auth expire %pM\n", psta
->hwaddr
);
200 spin_unlock_bh(&pstapriv
->auth_list_lock
);
202 spin_lock_bh(&pstapriv
->sta_hash_lock
);
203 rtw_free_stainfo23a(padapter
, psta
);
204 spin_unlock_bh(&pstapriv
->sta_hash_lock
);
206 spin_lock_bh(&pstapriv
->auth_list_lock
);
212 spin_unlock_bh(&pstapriv
->auth_list_lock
);
214 spin_lock_bh(&pstapriv
->asoc_list_lock
);
216 phead
= &pstapriv
->asoc_list
;
218 /* check asoc_queue */
219 list_for_each_safe(plist
, ptmp
, phead
) {
220 psta
= container_of(plist
, struct sta_info
, asoc_list
);
222 if (chk_sta_is_alive(psta
) || !psta
->expire_to
) {
223 psta
->expire_to
= pstapriv
->expire_to
;
224 psta
->keep_alive_trycnt
= 0;
229 if (psta
->expire_to
<= 0) {
230 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
232 if (padapter
->registrypriv
.wifi_spec
== 1) {
233 psta
->expire_to
= pstapriv
->expire_to
;
237 if (psta
->state
& WIFI_SLEEP_STATE
) {
238 if (!(psta
->state
& WIFI_STA_ALIVE_CHK_STATE
)) {
240 * check if alive by another method
241 * if station is at ps mode.
243 psta
->expire_to
= pstapriv
->expire_to
;
244 psta
->state
|= WIFI_STA_ALIVE_CHK_STATE
;
246 * update bcn with tim_bitmap
249 pstapriv
->tim_bitmap
|= CHKBIT(psta
->aid
);
250 update_beacon23a(padapter
, WLAN_EID_TIM
, NULL
, false);
252 if (!pmlmeext
->active_keep_alive_check
)
257 if (pmlmeext
->active_keep_alive_check
) {
258 chk_alive_list
[chk_alive_num
++] = psta
;
262 list_del_init(&psta
->asoc_list
);
263 pstapriv
->asoc_list_cnt
--;
265 DBG_8723A("asoc expire %pM, state = 0x%x\n",
266 psta
->hwaddr
, psta
->state
);
267 updated
= ap_free_sta23a(padapter
, psta
, false, WLAN_REASON_DEAUTH_LEAVING
);
270 * TODO: Aging mechanism to digest frames in
271 * sleep_q to avoid running out of xmitframe
273 if (psta
->sleepq_len
> (NR_XMITFRAME
/pstapriv
->asoc_list_cnt
)
274 && padapter
->xmitpriv
.free_xmitframe_cnt
< ((NR_XMITFRAME
/pstapriv
->asoc_list_cnt
)/2)
276 DBG_8723A("%s sta:%pM, sleepq_len:%u, free_xmitframe_cnt:%u, asoc_list_cnt:%u, clear sleep_q\n",
280 padapter
->xmitpriv
.free_xmitframe_cnt
,
281 pstapriv
->asoc_list_cnt
);
282 wakeup_sta_to_xmit23a(padapter
, psta
);
287 spin_unlock_bh(&pstapriv
->asoc_list_lock
);
291 u8 backup_oper_channel
= 0;
292 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
294 * switch to correct channel of current
295 * network before issue keep-alive frames
297 if (rtw_get_oper_ch23a(padapter
) != pmlmeext
->cur_channel
) {
298 backup_oper_channel
= rtw_get_oper_ch23a(padapter
);
299 SelectChannel23a(padapter
, pmlmeext
->cur_channel
);
302 /* issue null data to check sta alive */
303 for (i
= 0; i
< chk_alive_num
; i
++) {
307 psta
= chk_alive_list
[i
];
308 if (!(psta
->state
& _FW_LINKED
))
311 if (psta
->state
& WIFI_SLEEP_STATE
)
312 ret
= issue_nulldata23a(padapter
, psta
->hwaddr
, 0, 1, 50);
314 ret
= issue_nulldata23a(padapter
, psta
->hwaddr
, 0, 3, 50);
316 psta
->keep_alive_trycnt
++;
317 if (ret
== _SUCCESS
) {
318 DBG_8723A("asoc check, sta(%pM) is alive\n",
320 psta
->expire_to
= pstapriv
->expire_to
;
321 psta
->keep_alive_trycnt
= 0;
323 } else if (psta
->keep_alive_trycnt
<= 3) {
324 DBG_8723A("ack check for asoc expire, keep_alive_trycnt =%d\n", psta
->keep_alive_trycnt
);
329 psta
->keep_alive_trycnt
= 0;
331 DBG_8723A("asoc expire %pM, state = 0x%x\n",
332 psta
->hwaddr
, psta
->state
);
333 spin_lock_bh(&pstapriv
->asoc_list_lock
);
334 if (!list_empty(&psta
->asoc_list
)) {
335 list_del_init(&psta
->asoc_list
);
336 pstapriv
->asoc_list_cnt
--;
337 updated
= ap_free_sta23a(padapter
, psta
, false, WLAN_REASON_DEAUTH_LEAVING
);
339 spin_unlock_bh(&pstapriv
->asoc_list_lock
);
343 if (backup_oper_channel
> 0) /* back to original operation channel */
344 SelectChannel23a(padapter
, backup_oper_channel
);
347 associated_clients_update23a(padapter
, updated
);
350 void add_RATid23a(struct rtw_adapter
*padapter
, struct sta_info
*psta
, u8 rssi_level
)
355 unsigned char sta_band
= 0, raid
, shortGIrate
= false;
357 unsigned int tx_ra_bitmap
= 0;
358 struct ht_priv
*psta_ht
= NULL
;
359 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
360 struct wlan_bssid_ex
*pcur_network
= &pmlmepriv
->cur_network
.network
;
363 psta_ht
= &psta
->htpriv
;
367 if (!(psta
->state
& _FW_LINKED
))
370 /* b/g mode ra_bitmap */
371 for (i
= 0; i
< sizeof(psta
->bssrateset
); i
++) {
372 if (psta
->bssrateset
[i
])
373 tx_ra_bitmap
|= rtw_get_bit_value_from_ieee_value23a(psta
->bssrateset
[i
]&0x7f);
375 /* n mode ra_bitmap */
376 if (psta_ht
->ht_option
) {
377 rf_type
= rtl8723a_get_rf_type(padapter
);
379 if (rf_type
== RF_2T2R
)
384 for (i
= 0; i
< limit
; i
++) {
385 if (psta_ht
->ht_cap
.mcs
.rx_mask
[i
/ 8] & BIT(i
% 8))
386 tx_ra_bitmap
|= BIT(i
+ 12);
389 /* max short GI rate */
390 shortGIrate
= psta_ht
->sgi
;
393 if (pcur_network
->DSConfig
> 14) {
395 if (tx_ra_bitmap
& 0xffff000)
396 sta_band
|= WIRELESS_11_5N
| WIRELESS_11A
;
398 sta_band
|= WIRELESS_11A
;
400 if (tx_ra_bitmap
& 0xffff000)
401 sta_band
|= WIRELESS_11_24N
| WIRELESS_11G
| WIRELESS_11B
;
402 else if (tx_ra_bitmap
& 0xff0)
403 sta_band
|= WIRELESS_11G
| WIRELESS_11B
;
405 sta_band
|= WIRELESS_11B
;
408 psta
->wireless_mode
= sta_band
;
410 raid
= networktype_to_raid23a(sta_band
);
411 init_rate
= get_highest_rate_idx23a(tx_ra_bitmap
&0x0fffffff)&0x3f;
413 if (psta
->aid
< NUM_STA
) {
416 arg
= psta
->mac_id
&0x1f;
418 arg
|= BIT(7); /* support entry 2~31 */
420 if (shortGIrate
== true)
423 tx_ra_bitmap
|= ((raid
<<28)&0xf0000000);
425 DBG_8723A("%s => mac_id:%d , raid:%d , bitmap = 0x%x, arg = "
427 __func__
, psta
->mac_id
, raid
, tx_ra_bitmap
, arg
);
429 /* bitmap[0:27] = tx_rate_bitmap */
430 /* bitmap[28:31]= Rate Adaptive id */
431 /* arg[0:4] = macid */
432 /* arg[5] = Short GI */
433 rtl8723a_add_rateatid(padapter
, tx_ra_bitmap
, arg
, rssi_level
);
435 if (shortGIrate
== true)
438 /* set ra_id, init_rate */
440 psta
->init_rate
= init_rate
;
443 DBG_8723A("station aid %d exceed the max number\n", psta
->aid
);
446 static void update_bmc_sta(struct rtw_adapter
*padapter
)
449 unsigned char network_type
, raid
;
450 int i
, supportRateNum
= 0;
451 unsigned int tx_ra_bitmap
= 0;
452 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
453 struct wlan_bssid_ex
*pcur_network
= &pmlmepriv
->cur_network
.network
;
454 struct sta_info
*psta
= rtw_get_bcmc_stainfo23a(padapter
);
457 psta
->aid
= 0; /* default set to 0 */
458 psta
->mac_id
= psta
->aid
+ 1;
460 psta
->qos_option
= 0;
461 psta
->htpriv
.ht_option
= false;
463 psta
->ieee8021x_blocked
= 0;
465 memset((void *)&psta
->sta_stats
, 0,
466 sizeof(struct stainfo_stats
));
468 /* prepare for add_RATid23a */
469 supportRateNum
= rtw_get_rateset_len23a((u8
*)&pcur_network
->SupportedRates
);
470 network_type
= rtw_check_network_type23a((u8
*)&pcur_network
->SupportedRates
, supportRateNum
, 1);
472 memcpy(psta
->bssrateset
, &pcur_network
->SupportedRates
, supportRateNum
);
473 psta
->bssratelen
= supportRateNum
;
475 /* b/g mode ra_bitmap */
476 for (i
= 0; i
< supportRateNum
; i
++) {
477 if (psta
->bssrateset
[i
])
478 tx_ra_bitmap
|= rtw_get_bit_value_from_ieee_value23a(psta
->bssrateset
[i
]&0x7f);
481 if (pcur_network
->DSConfig
> 14) {
482 /* force to A mode. 5G doesn't support CCK rates */
483 network_type
= WIRELESS_11A
;
484 tx_ra_bitmap
= 0x150; /* 6, 12, 24 Mbps */
486 /* force to b mode */
487 network_type
= WIRELESS_11B
;
491 raid
= networktype_to_raid23a(network_type
);
492 init_rate
= get_highest_rate_idx23a(tx_ra_bitmap
&0x0fffffff)&0x3f;
495 rtl8723a_SetHalODMVar(padapter
, HAL_ODM_STA_INFO
, psta
, true);
500 arg
= psta
->mac_id
&0x1f;
504 tx_ra_bitmap
|= ((raid
<<28)&0xf0000000);
506 DBG_8723A("update_bmc_sta, mask = 0x%x, arg = 0x%x\n", tx_ra_bitmap
, arg
);
508 /* bitmap[0:27] = tx_rate_bitmap */
509 /* bitmap[28:31]= Rate Adaptive id */
510 /* arg[0:4] = macid */
511 /* arg[5] = Short GI */
512 rtl8723a_add_rateatid(padapter
, tx_ra_bitmap
, arg
, 0);
515 /* set ra_id, init_rate */
517 psta
->init_rate
= init_rate
;
519 spin_lock_bh(&psta
->lock
);
520 psta
->state
= _FW_LINKED
;
521 spin_unlock_bh(&psta
->lock
);
524 DBG_8723A("add_RATid23a_bmc_sta error!\n");
528 * AID: 1~MAX for sta and 0 for bc/mc in ap/adhoc mode
529 * MAC_ID = AID+1 for sta in ap/adhoc mode
530 * MAC_ID = 1 for bc/mc for sta/ap/adhoc
531 * MAC_ID = 0 for bssid for sta/ap/adhoc
532 * CAM_ID = 0~3 for default key, cmd_id = macid + 3, macid = aid + 1;
534 void update_sta_info23a_apmode23a(struct rtw_adapter
*padapter
, struct sta_info
*psta
)
536 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
537 struct security_priv
*psecuritypriv
= &padapter
->securitypriv
;
538 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
539 struct ht_priv
*phtpriv_ap
= &pmlmepriv
->htpriv
;
540 struct ht_priv
*phtpriv_sta
= &psta
->htpriv
;
541 /* set intf_tag to if1 */
543 psta
->mac_id
= psta
->aid
+1;
544 DBG_8723A("%s\n", __func__
);
547 rtl8723a_SetHalODMVar(padapter
, HAL_ODM_STA_INFO
, psta
, true);
549 if (psecuritypriv
->dot11AuthAlgrthm
== dot11AuthAlgrthm_8021X
)
550 psta
->ieee8021x_blocked
= true;
552 psta
->ieee8021x_blocked
= false;
554 /* update sta's cap */
557 VCS_update23a(padapter
, psta
);
559 if (phtpriv_sta
->ht_option
) {
560 /* check if sta supports rx ampdu */
561 phtpriv_sta
->ampdu_enable
= phtpriv_ap
->ampdu_enable
;
563 /* check if sta support s Short GI */
564 if ((phtpriv_sta
->ht_cap
.cap_info
& phtpriv_ap
->ht_cap
.cap_info
) & cpu_to_le16(IEEE80211_HT_CAP_SGI_20
|IEEE80211_HT_CAP_SGI_40
))
565 phtpriv_sta
->sgi
= true;
568 if ((phtpriv_sta
->ht_cap
.cap_info
& phtpriv_ap
->ht_cap
.cap_info
) & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH_20_40
)) {
569 /* phtpriv_sta->bwmode = HT_CHANNEL_WIDTH_40; */
570 phtpriv_sta
->bwmode
= pmlmeext
->cur_bwmode
;
571 phtpriv_sta
->ch_offset
= pmlmeext
->cur_ch_offset
;
575 psta
->qos_option
= true;
578 phtpriv_sta
->ampdu_enable
= false;
580 phtpriv_sta
->sgi
= false;
581 phtpriv_sta
->bwmode
= HT_CHANNEL_WIDTH_20
;
582 phtpriv_sta
->ch_offset
= HAL_PRIME_CHNL_OFFSET_DONT_CARE
;
586 send_delba23a(padapter
, 0, psta
->hwaddr
); /* recipient */
589 send_delba23a(padapter
, 1, psta
->hwaddr
); /* originator */
590 phtpriv_sta
->agg_enable_bitmap
= 0x0;/* reset */
591 phtpriv_sta
->candidate_tid_bitmap
= 0x0;/* reset */
593 /* todo: init other variables */
595 memset((void *)&psta
->sta_stats
, 0, sizeof(struct stainfo_stats
));
597 spin_lock_bh(&psta
->lock
);
598 psta
->state
|= _FW_LINKED
;
599 spin_unlock_bh(&psta
->lock
);
602 static void update_hw_ht_param(struct rtw_adapter
*padapter
)
604 unsigned char max_AMPDU_len
;
605 unsigned char min_MPDU_spacing
;
606 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
607 struct mlme_ext_info
*pmlmeinfo
= &pmlmeext
->mlmext_info
;
609 DBG_8723A("%s\n", __func__
);
611 * handle A-MPDU parameter field
612 * AMPDU_para [1:0]:Max AMPDU Len => 0:8k, 1:16k, 2:32k, 3:64k
613 * AMPDU_para [4:2]:Min MPDU Start Spacing
615 max_AMPDU_len
= pmlmeinfo
->ht_cap
.ampdu_params_info
&
616 IEEE80211_HT_AMPDU_PARM_FACTOR
;
618 min_MPDU_spacing
= (pmlmeinfo
->ht_cap
.ampdu_params_info
&
619 IEEE80211_HT_AMPDU_PARM_DENSITY
) >> 2;
621 rtl8723a_set_ampdu_min_space(padapter
, min_MPDU_spacing
);
622 rtl8723a_set_ampdu_factor(padapter
, max_AMPDU_len
);
624 /* Config SM Power Save setting */
625 pmlmeinfo
->SM_PS
= (le16_to_cpu(pmlmeinfo
->ht_cap
.cap_info
) &
626 IEEE80211_HT_CAP_SM_PS
) >> 2;
627 if (pmlmeinfo
->SM_PS
== WLAN_HT_CAP_SM_PS_STATIC
)
628 DBG_8723A("%s(): WLAN_HT_CAP_SM_PS_STATIC\n", __func__
);
631 static void start_bss_network(struct rtw_adapter
*padapter
, u8
*pbuf
)
634 u8 val8
, cur_channel
, cur_bwmode
, cur_ch_offset
;
637 struct registry_priv
*pregpriv
= &padapter
->registrypriv
;
638 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
639 struct security_priv
*psecuritypriv
= &padapter
->securitypriv
;
640 struct wlan_bssid_ex
*pnetwork
= &pmlmepriv
->cur_network
.network
;
641 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
642 struct mlme_ext_info
*pmlmeinfo
= &pmlmeext
->mlmext_info
;
643 struct wlan_bssid_ex
*pnetwork_mlmeext
= &pmlmeinfo
->network
;
644 struct ieee80211_ht_operation
*pht_info
= NULL
;
646 bcn_interval
= (u16
)pnetwork
->beacon_interval
;
647 cur_channel
= pnetwork
->DSConfig
;
648 cur_bwmode
= HT_CHANNEL_WIDTH_20
;
649 cur_ch_offset
= HAL_PRIME_CHNL_OFFSET_DONT_CARE
;
652 * check if there is wps ie
653 * if there is wpsie in beacon the hostapd will
654 * update beacon twice when stating hostapd
655 * and at first time the security
656 * ie (RSN/WPA IE) will not include in beacon
658 if (!cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT
,
659 WLAN_OUI_TYPE_MICROSOFT_WPS
,
662 pmlmeext
->bstart_bss
= true;
664 /* todo: update wmm, ht cap */
665 /* pmlmeinfo->WMM_enable; */
666 /* pmlmeinfo->HT_enable; */
667 if (pmlmepriv
->qos_option
)
668 pmlmeinfo
->WMM_enable
= true;
669 if (pmlmepriv
->htpriv
.ht_option
) {
670 pmlmeinfo
->WMM_enable
= true;
671 pmlmeinfo
->HT_enable
= true;
673 update_hw_ht_param(padapter
);
676 if (pmlmepriv
->cur_network
.join_res
!= true) {
678 * setting only at first time
679 * WEP Key will be set before this
680 * function, do not clear CAM.
682 if (psecuritypriv
->dot11PrivacyAlgrthm
!=
683 WLAN_CIPHER_SUITE_WEP40
&&
684 psecuritypriv
->dot11PrivacyAlgrthm
!=
685 WLAN_CIPHER_SUITE_WEP104
)
686 flush_all_cam_entry23a(padapter
); /* clear CAM */
689 /* set MSR to AP_Mode */
690 rtl8723a_set_media_status(padapter
, MSR_AP
);
693 hw_var_set_bssid(padapter
, pnetwork
->MacAddress
);
695 /* Set EDCA param reg */
696 acparm
= 0x002F3217; /* VO */
697 rtl8723a_set_ac_param_vo(padapter
, acparm
);
698 acparm
= 0x005E4317; /* VI */
699 rtl8723a_set_ac_param_vi(padapter
, acparm
);
701 rtl8723a_set_ac_param_be(padapter
, acparm
);
702 acparm
= 0x0000A444; /* BK */
703 rtl8723a_set_ac_param_bk(padapter
, acparm
);
706 val8
= (psecuritypriv
->dot11AuthAlgrthm
== dot11AuthAlgrthm_8021X
) ?
708 rtl8723a_set_sec_cfg(padapter
, val8
);
710 /* Beacon Control related register */
711 rtl8723a_set_beacon_interval(padapter
, bcn_interval
);
713 UpdateBrateTbl23a(padapter
, pnetwork
->SupportedRates
);
714 HalSetBrateCfg23a(padapter
, pnetwork
->SupportedRates
);
716 if (!pmlmepriv
->cur_network
.join_res
) {
717 /* setting only at first time */
719 /* disable dynamic functions, such as high power, DIG */
721 /* turn on all dynamic functions */
722 rtl8723a_odm_support_ability_set(padapter
,
723 DYNAMIC_ALL_FUNC_ENABLE
);
725 /* set channel, bwmode */
727 p
= cfg80211_find_ie(WLAN_EID_HT_OPERATION
, pnetwork
->IEs
,
730 pht_info
= (struct ieee80211_ht_operation
*)(p
+ 2);
732 if (pregpriv
->cbw40_enable
&& pht_info
->ht_param
&
733 IEEE80211_HT_PARAM_CHAN_WIDTH_ANY
) {
734 /* switch to the 40M Hz mode */
735 cur_bwmode
= HT_CHANNEL_WIDTH_40
;
736 switch (pht_info
->ht_param
&
737 IEEE80211_HT_PARAM_CHA_SEC_OFFSET
) {
738 case IEEE80211_HT_PARAM_CHA_SEC_ABOVE
:
740 * pmlmeext->cur_ch_offset =
741 * HAL_PRIME_CHNL_OFFSET_LOWER;
743 cur_ch_offset
= HAL_PRIME_CHNL_OFFSET_LOWER
;
745 case IEEE80211_HT_PARAM_CHA_SEC_BELOW
:
746 cur_ch_offset
= HAL_PRIME_CHNL_OFFSET_UPPER
;
749 cur_ch_offset
= HAL_PRIME_CHNL_OFFSET_DONT_CARE
;
755 * TODO: need to judge the phy parameters
756 * on concurrent mode for single phy
758 set_channel_bwmode23a(padapter
, cur_channel
, cur_ch_offset
, cur_bwmode
);
760 DBG_8723A("CH =%d, BW =%d, offset =%d\n", cur_channel
, cur_bwmode
,
763 pmlmeext
->cur_channel
= cur_channel
;
764 pmlmeext
->cur_bwmode
= cur_bwmode
;
765 pmlmeext
->cur_ch_offset
= cur_ch_offset
;
766 pmlmeext
->cur_wireless_mode
= pmlmepriv
->cur_network
.network_type
;
768 /* update cur_wireless_mode */
769 update_wireless_mode23a(padapter
);
771 /* update capability after cur_wireless_mode updated */
772 update_capinfo23a(padapter
, pnetwork
->capability
);
774 /* let pnetwork_mlmeext == pnetwork_mlme. */
775 memcpy(pnetwork_mlmeext
, pnetwork
, pnetwork
->Length
);
777 if (pmlmeext
->bstart_bss
) {
778 update_beacon23a(padapter
, WLAN_EID_TIM
, NULL
, false);
780 /* issue beacon frame */
781 if (send_beacon23a(padapter
) == _FAIL
)
782 DBG_8723A("issue_beacon23a, fail!\n");
785 /* update bc/mc sta_info */
786 update_bmc_sta(padapter
);
789 int rtw_check_beacon_data23a(struct rtw_adapter
*padapter
,
790 struct ieee80211_mgmt
*mgmt
, unsigned int len
)
794 u8
*pHT_caps_ie
= NULL
;
795 u8
*pHT_info_ie
= NULL
;
796 struct sta_info
*psta
= NULL
;
799 int group_cipher
, pairwise_cipher
;
800 u8 channel
, network_type
, supportRate
[NDIS_802_11_LENGTH_RATES_EX
];
801 int supportRateNum
= 0;
802 u8 WMM_PARA_IE
[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01};
803 struct registry_priv
*pregistrypriv
= &padapter
->registrypriv
;
804 struct security_priv
*psecuritypriv
= &padapter
->securitypriv
;
805 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
806 struct wlan_bssid_ex
*pbss_network
= &pmlmepriv
->cur_network
.network
;
807 u8
*ie
= pbss_network
->IEs
;
808 u8
*pbuf
= mgmt
->u
.beacon
.variable
;
810 len
-= offsetof(struct ieee80211_mgmt
, u
.beacon
.variable
);
812 /* Supported rates */
814 /* WLAN_EID_COUNTRY */
815 /* ERP Information element */
816 /* Extended supported rates */
818 /* Wi-Fi Wireless Multimedia Extensions */
819 /* ht_capab, ht_oper */
822 DBG_8723A("%s, len =%d\n", __func__
, len
);
824 if (!check_fwstate(pmlmepriv
, WIFI_AP_STATE
))
830 pbss_network
->IELength
= len
;
832 memset(ie
, 0, MAX_IE_SZ
);
834 memcpy(ie
, pbuf
, pbss_network
->IELength
);
836 if (pbss_network
->ifmode
!= NL80211_IFTYPE_AP
&&
837 pbss_network
->ifmode
!= NL80211_IFTYPE_P2P_GO
)
840 pbss_network
->Rssi
= 0;
842 memcpy(pbss_network
->MacAddress
, myid(&padapter
->eeprompriv
), ETH_ALEN
);
845 p
= rtw_get_ie23a(ie
, WLAN_EID_SSID
, &ie_len
, pbss_network
->IELength
);
846 if (p
&& ie_len
> 0) {
847 memset(&pbss_network
->Ssid
, 0, sizeof(struct cfg80211_ssid
));
848 memcpy(pbss_network
->Ssid
.ssid
, (p
+ 2), ie_len
);
849 pbss_network
->Ssid
.ssid_len
= ie_len
;
854 p
= rtw_get_ie23a(ie
, WLAN_EID_DS_PARAMS
, &ie_len
,
855 pbss_network
->IELength
);
859 pbss_network
->DSConfig
= channel
;
861 memset(supportRate
, 0, NDIS_802_11_LENGTH_RATES_EX
);
862 /* get supported rates */
863 p
= rtw_get_ie23a(ie
, WLAN_EID_SUPP_RATES
, &ie_len
,
864 pbss_network
->IELength
);
866 memcpy(supportRate
, p
+2, ie_len
);
867 supportRateNum
= ie_len
;
870 /* get ext_supported rates */
871 p
= rtw_get_ie23a(ie
, WLAN_EID_EXT_SUPP_RATES
,
872 &ie_len
, pbss_network
->IELength
);
874 memcpy(supportRate
+supportRateNum
, p
+2, ie_len
);
875 supportRateNum
+= ie_len
;
878 network_type
= rtw_check_network_type23a(supportRate
,
879 supportRateNum
, channel
);
881 rtw_set_supported_rate23a(pbss_network
->SupportedRates
, network_type
);
884 p
= rtw_get_ie23a(ie
, WLAN_EID_ERP_INFO
, &ie_len
,
885 pbss_network
->IELength
);
887 ERP_IE_handler23a(padapter
, p
);
889 /* update privacy/security */
890 if (pbss_network
->capability
& BIT(4))
891 pbss_network
->Privacy
= 1;
893 pbss_network
->Privacy
= 0;
895 psecuritypriv
->wpa_psk
= 0;
898 group_cipher
= 0; pairwise_cipher
= 0;
899 psecuritypriv
->wpa2_group_cipher
= 0;
900 psecuritypriv
->wpa2_pairwise_cipher
= 0;
901 p
= rtw_get_ie23a(ie
, WLAN_EID_RSN
, &ie_len
,
902 pbss_network
->IELength
);
903 if (p
&& ie_len
> 0) {
904 if (rtw_parse_wpa2_ie23a(p
, ie_len
+2, &group_cipher
,
905 &pairwise_cipher
, NULL
) == _SUCCESS
) {
906 psecuritypriv
->dot11AuthAlgrthm
= dot11AuthAlgrthm_8021X
;
908 psecuritypriv
->dot8021xalg
= 1; /* psk, todo:802.1x */
909 psecuritypriv
->wpa_psk
|= BIT(1);
911 psecuritypriv
->wpa2_group_cipher
= group_cipher
;
912 psecuritypriv
->wpa2_pairwise_cipher
= pairwise_cipher
;
920 psecuritypriv
->wpa_group_cipher
= 0;
921 psecuritypriv
->wpa_pairwise_cipher
= 0;
922 for (p
= ie
; ; p
+= (ie_len
+ 2)) {
923 p
= rtw_get_ie23a(p
, WLAN_EID_VENDOR_SPECIFIC
, &ie_len
,
924 pbss_network
->IELength
- (ie_len
+ 2));
925 if ((p
) && (!memcmp(p
+2, RTW_WPA_OUI23A_TYPE
, 4))) {
926 if (rtw_parse_wpa_ie23a(p
, ie_len
+2, &group_cipher
,
927 &pairwise_cipher
, NULL
) == _SUCCESS
) {
928 psecuritypriv
->dot11AuthAlgrthm
= dot11AuthAlgrthm_8021X
;
930 /* psk, todo:802.1x */
931 psecuritypriv
->dot8021xalg
= 1;
933 psecuritypriv
->wpa_psk
|= BIT(0);
935 psecuritypriv
->wpa_group_cipher
= group_cipher
;
936 psecuritypriv
->wpa_pairwise_cipher
= pairwise_cipher
;
947 pmlmepriv
->qos_option
= 0;
948 if (pregistrypriv
->wmm_enable
) {
949 for (p
= ie
; ; p
+= (ie_len
+ 2)) {
950 p
= rtw_get_ie23a(p
, WLAN_EID_VENDOR_SPECIFIC
, &ie_len
,
951 (pbss_network
->IELength
-
953 if ((p
) && !memcmp(p
+2, WMM_PARA_IE
, 6)) {
954 pmlmepriv
->qos_option
= 1;
956 *(p
+ 8) |= BIT(7);/* QoS Info:support U-APSD */
958 /* disable all ACM bits since the WMM admission
959 * control is not supported
961 *(p
+ 10) &= ~BIT(4); /* BE */
962 *(p
+ 14) &= ~BIT(4); /* BK */
963 *(p
+ 18) &= ~BIT(4); /* VI */
964 *(p
+ 22) &= ~BIT(4); /* VO */
967 if ((p
== NULL
) || (ie_len
== 0))
971 /* parsing HT_CAP_IE */
972 p
= rtw_get_ie23a(ie
, WLAN_EID_HT_CAPABILITY
, &ie_len
,
973 pbss_network
->IELength
);
974 if (p
&& ie_len
> 0) {
977 struct ieee80211_ht_cap
*pht_cap
= (struct ieee80211_ht_cap
*)(p
+2);
982 network_type
|= WIRELESS_11_24N
;
984 rf_type
= rtl8723a_get_rf_type(padapter
);
986 if ((psecuritypriv
->wpa_pairwise_cipher
& WPA_CIPHER_CCMP
) ||
987 (psecuritypriv
->wpa2_pairwise_cipher
& WPA_CIPHER_CCMP
))
988 pht_cap
->ampdu_params_info
|= (IEEE80211_HT_AMPDU_PARM_DENSITY
& (0x07<<2));
990 pht_cap
->ampdu_params_info
|= (IEEE80211_HT_AMPDU_PARM_DENSITY
&0x00);
992 /* set Max Rx AMPDU size to 64K */
993 pht_cap
->ampdu_params_info
|= (IEEE80211_HT_AMPDU_PARM_FACTOR
& 0x03);
995 if (rf_type
== RF_1T1R
) {
996 pht_cap
->mcs
.rx_mask
[0] = 0xff;
997 pht_cap
->mcs
.rx_mask
[1] = 0x0;
1000 memcpy(&pmlmepriv
->htpriv
.ht_cap
, p
+2, ie_len
);
1003 /* parsing HT_INFO_IE */
1004 p
= rtw_get_ie23a(ie
, WLAN_EID_HT_OPERATION
, &ie_len
,
1005 pbss_network
->IELength
);
1006 if (p
&& ie_len
> 0)
1009 pmlmepriv
->cur_network
.network_type
= network_type
;
1011 pmlmepriv
->htpriv
.ht_option
= false;
1014 if (pregistrypriv
->ht_enable
&& ht_cap
) {
1015 pmlmepriv
->htpriv
.ht_option
= true;
1016 pmlmepriv
->qos_option
= 1;
1018 if (pregistrypriv
->ampdu_enable
== 1)
1019 pmlmepriv
->htpriv
.ampdu_enable
= true;
1021 HT_caps_handler23a(padapter
, pHT_caps_ie
);
1023 HT_info_handler23a(padapter
, pHT_info_ie
);
1026 pbss_network
->Length
= get_wlan_bssid_ex_sz(pbss_network
);
1028 /* issue beacon to start bss network */
1029 start_bss_network(padapter
, (u8
*)pbss_network
);
1031 /* alloc sta_info for ap itself */
1032 psta
= rtw_get_stainfo23a(&padapter
->stapriv
, pbss_network
->MacAddress
);
1034 psta
= rtw_alloc_stainfo23a(&padapter
->stapriv
,
1035 pbss_network
->MacAddress
,
1040 /* fix bug of flush_cam_entry at STOP AP mode */
1041 psta
->state
|= WIFI_AP_STATE
;
1042 rtw_indicate_connect23a(padapter
);
1044 /* for check if already set beacon */
1045 pmlmepriv
->cur_network
.join_res
= true;
1050 void rtw_set_macaddr_acl23a(struct rtw_adapter
*padapter
, int mode
)
1052 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
1053 struct wlan_acl_pool
*pacl_list
= &pstapriv
->acl_list
;
1055 DBG_8723A("%s, mode =%d\n", __func__
, mode
);
1057 pacl_list
->mode
= mode
;
1060 int rtw_acl_add_sta23a(struct rtw_adapter
*padapter
, u8
*addr
)
1062 struct list_head
*plist
, *phead
;
1065 struct rtw_wlan_acl_node
*paclnode
;
1066 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
1067 struct wlan_acl_pool
*pacl_list
= &pstapriv
->acl_list
;
1068 struct rtw_queue
*pacl_node_q
= &pacl_list
->acl_node_q
;
1070 DBG_8723A("%s(acl_num =%d) =%pM\n", __func__
, pacl_list
->num
, addr
);
1072 if ((NUM_ACL
-1) < pacl_list
->num
)
1075 spin_lock_bh(&pacl_node_q
->lock
);
1077 phead
= get_list_head(pacl_node_q
);
1079 list_for_each(plist
, phead
) {
1080 paclnode
= container_of(plist
, struct rtw_wlan_acl_node
, list
);
1082 if (!memcmp(paclnode
->addr
, addr
, ETH_ALEN
)) {
1083 if (paclnode
->valid
== true) {
1085 DBG_8723A("%s, sta has been added\n", __func__
);
1091 spin_unlock_bh(&pacl_node_q
->lock
);
1096 spin_lock_bh(&pacl_node_q
->lock
);
1098 for (i
= 0; i
< NUM_ACL
; i
++) {
1099 paclnode
= &pacl_list
->aclnode
[i
];
1101 if (!paclnode
->valid
) {
1102 INIT_LIST_HEAD(&paclnode
->list
);
1104 memcpy(paclnode
->addr
, addr
, ETH_ALEN
);
1106 paclnode
->valid
= true;
1108 list_add_tail(&paclnode
->list
, get_list_head(pacl_node_q
));
1116 DBG_8723A("%s, acl_num =%d\n", __func__
, pacl_list
->num
);
1118 spin_unlock_bh(&pacl_node_q
->lock
);
1122 int rtw_acl_remove_sta23a(struct rtw_adapter
*padapter
, u8
*addr
)
1124 struct list_head
*plist
, *phead
, *ptmp
;
1125 struct rtw_wlan_acl_node
*paclnode
;
1126 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
1127 struct wlan_acl_pool
*pacl_list
= &pstapriv
->acl_list
;
1128 struct rtw_queue
*pacl_node_q
= &pacl_list
->acl_node_q
;
1130 DBG_8723A("%s(acl_num =%d) = %pM\n", __func__
, pacl_list
->num
, addr
);
1132 spin_lock_bh(&pacl_node_q
->lock
);
1134 phead
= get_list_head(pacl_node_q
);
1136 list_for_each_safe(plist
, ptmp
, phead
) {
1137 paclnode
= container_of(plist
, struct rtw_wlan_acl_node
, list
);
1139 if (!memcmp(paclnode
->addr
, addr
, ETH_ALEN
)) {
1140 if (paclnode
->valid
) {
1141 paclnode
->valid
= false;
1143 list_del_init(&paclnode
->list
);
1150 spin_unlock_bh(&pacl_node_q
->lock
);
1152 DBG_8723A("%s, acl_num =%d\n", __func__
, pacl_list
->num
);
1157 static void update_bcn_fixed_ie(struct rtw_adapter
*padapter
)
1159 DBG_8723A("%s\n", __func__
);
1162 static void update_bcn_erpinfo_ie(struct rtw_adapter
*padapter
)
1164 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
1165 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1166 struct mlme_ext_info
*pmlmeinfo
= &pmlmeext
->mlmext_info
;
1167 struct wlan_bssid_ex
*pnetwork
= &pmlmeinfo
->network
;
1168 unsigned char *p
, *ie
= pnetwork
->IEs
;
1171 DBG_8723A("%s, ERP_enable =%d\n", __func__
, pmlmeinfo
->ERP_enable
);
1173 if (!pmlmeinfo
->ERP_enable
)
1176 /* parsing ERP_IE */
1177 p
= rtw_get_ie23a(ie
, WLAN_EID_ERP_INFO
, &len
, pnetwork
->IELength
);
1179 if (pmlmepriv
->num_sta_non_erp
== 1)
1180 p
[2] |= WLAN_ERP_NON_ERP_PRESENT
|
1181 WLAN_ERP_USE_PROTECTION
;
1183 p
[2] &= ~(WLAN_ERP_NON_ERP_PRESENT
|
1184 WLAN_ERP_USE_PROTECTION
);
1186 if (pmlmepriv
->num_sta_no_short_preamble
> 0)
1187 p
[2] |= WLAN_ERP_BARKER_PREAMBLE
;
1189 p
[2] &= ~(WLAN_ERP_BARKER_PREAMBLE
);
1191 ERP_IE_handler23a(padapter
, p
);
1195 static void update_bcn_htcap_ie(struct rtw_adapter
*padapter
)
1197 DBG_8723A("%s\n", __func__
);
1200 static void update_bcn_htinfo_ie(struct rtw_adapter
*padapter
)
1202 DBG_8723A("%s\n", __func__
);
1205 static void update_bcn_rsn_ie(struct rtw_adapter
*padapter
)
1207 DBG_8723A("%s\n", __func__
);
1210 static void update_bcn_wpa_ie(struct rtw_adapter
*padapter
)
1212 DBG_8723A("%s\n", __func__
);
1215 static void update_bcn_wmm_ie(struct rtw_adapter
*padapter
)
1217 DBG_8723A("%s\n", __func__
);
1220 static void update_bcn_wps_ie(struct rtw_adapter
*padapter
)
1222 DBG_8723A("%s\n", __func__
);
1225 static void update_bcn_p2p_ie(struct rtw_adapter
*padapter
)
1229 static void update_bcn_vendor_spec_ie(struct rtw_adapter
*padapter
, u8
*oui
)
1231 DBG_8723A("%s\n", __func__
);
1233 if (!memcmp(RTW_WPA_OUI23A_TYPE
, oui
, 4))
1234 update_bcn_wpa_ie(padapter
);
1235 else if (!memcmp(WMM_OUI23A
, oui
, 4))
1236 update_bcn_wmm_ie(padapter
);
1237 else if (!memcmp(WPS_OUI23A
, oui
, 4))
1238 update_bcn_wps_ie(padapter
);
1239 else if (!memcmp(P2P_OUI23A
, oui
, 4))
1240 update_bcn_p2p_ie(padapter
);
1242 DBG_8723A("unknown OUI type!\n");
1245 void update_beacon23a(struct rtw_adapter
*padapter
, u8 ie_id
, u8
*oui
, u8 tx
)
1247 struct mlme_priv
*pmlmepriv
;
1248 struct mlme_ext_priv
*pmlmeext
;
1249 /* struct mlme_ext_info *pmlmeinfo; */
1251 /* DBG_8723A("%s\n", __func__); */
1256 pmlmepriv
= &padapter
->mlmepriv
;
1257 pmlmeext
= &padapter
->mlmeextpriv
;
1258 /* pmlmeinfo = &pmlmeext->mlmext_info; */
1260 if (false == pmlmeext
->bstart_bss
)
1263 spin_lock_bh(&pmlmepriv
->bcn_update_lock
);
1267 /* 8: TimeStamp, 2: Beacon Interval 2:Capability */
1268 update_bcn_fixed_ie(padapter
);
1272 update_BCNTIM(padapter
);
1275 case WLAN_EID_ERP_INFO
:
1276 update_bcn_erpinfo_ie(padapter
);
1279 case WLAN_EID_HT_CAPABILITY
:
1280 update_bcn_htcap_ie(padapter
);
1284 update_bcn_rsn_ie(padapter
);
1287 case WLAN_EID_HT_OPERATION
:
1288 update_bcn_htinfo_ie(padapter
);
1291 case WLAN_EID_VENDOR_SPECIFIC
:
1292 update_bcn_vendor_spec_ie(padapter
, oui
);
1299 pmlmepriv
->update_bcn
= true;
1301 spin_unlock_bh(&pmlmepriv
->bcn_update_lock
);
1304 set_tx_beacon_cmd23a(padapter
);
1309 * Set to 0 (HT pure) under the following conditions
1310 * - all STAs in the BSS are 20/40 MHz HT in 20/40 MHz BSS or
1311 * - all STAs in the BSS are 20 MHz HT in 20 MHz BSS
1312 * Set to 1 (HT non-member protection) if there may be non-HT STAs
1313 * in both the primary and the secondary channel
1314 * Set to 2 if only HT STAs are associated in BSS,
1315 * however and at least one 20 MHz HT STA is associated
1316 * Set to 3 (HT mixed mode) when one or more non-HT STAs are associated
1317 * (currently non-GF HT station is considered as non-HT STA also)
1319 static int rtw_ht_operation_update(struct rtw_adapter
*padapter
)
1321 u16 cur_op_mode
, new_op_mode
;
1322 int op_mode_changes
= 0;
1323 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
1324 struct ht_priv
*phtpriv_ap
= &pmlmepriv
->htpriv
;
1326 if (pmlmepriv
->htpriv
.ht_option
)
1329 /* if (!iface->conf->ieee80211n || iface->conf->ht_op_mode_fixed) */
1332 DBG_8723A("%s current operation mode = 0x%X\n",
1333 __func__
, pmlmepriv
->ht_op_mode
);
1335 if (!(pmlmepriv
->ht_op_mode
& IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT
)
1336 && pmlmepriv
->num_sta_ht_no_gf
) {
1337 pmlmepriv
->ht_op_mode
|=
1338 IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT
;
1340 } else if ((pmlmepriv
->ht_op_mode
&
1341 IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT
) &&
1342 pmlmepriv
->num_sta_ht_no_gf
== 0) {
1343 pmlmepriv
->ht_op_mode
&=
1344 ~IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT
;
1348 if (!(pmlmepriv
->ht_op_mode
& IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT
) &&
1349 (pmlmepriv
->num_sta_no_ht
|| pmlmepriv
->olbc_ht
)) {
1350 pmlmepriv
->ht_op_mode
|= IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT
;
1352 } else if ((pmlmepriv
->ht_op_mode
&
1353 IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT
) &&
1354 (pmlmepriv
->num_sta_no_ht
== 0 && !pmlmepriv
->olbc_ht
)) {
1355 pmlmepriv
->ht_op_mode
&=
1356 ~IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT
;
1361 * Note: currently we switch to the MIXED op mode if HT non-greenfield
1362 * station is associated. Probably it's a theoretical case, since
1363 * it looks like all known HT STAs support greenfield.
1365 if (pmlmepriv
->num_sta_no_ht
||
1366 (pmlmepriv
->ht_op_mode
& IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT
))
1367 new_op_mode
= IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED
;
1368 else if ((le16_to_cpu(phtpriv_ap
->ht_cap
.cap_info
) &
1369 IEEE80211_HT_CAP_SUP_WIDTH_20_40
) &&
1370 pmlmepriv
->num_sta_ht_20mhz
)
1371 new_op_mode
= IEEE80211_HT_OP_MODE_PROTECTION_20MHZ
;
1372 else if (pmlmepriv
->olbc_ht
)
1373 new_op_mode
= IEEE80211_HT_OP_MODE_PROTECTION_NONMEMBER
;
1375 new_op_mode
= IEEE80211_HT_OP_MODE_PROTECTION_NONE
;
1377 cur_op_mode
= pmlmepriv
->ht_op_mode
& IEEE80211_HT_OP_MODE_PROTECTION
;
1378 if (cur_op_mode
!= new_op_mode
) {
1379 pmlmepriv
->ht_op_mode
&= ~IEEE80211_HT_OP_MODE_PROTECTION
;
1380 pmlmepriv
->ht_op_mode
|= new_op_mode
;
1384 DBG_8723A("%s new operation mode = 0x%X changes =%d\n",
1385 __func__
, pmlmepriv
->ht_op_mode
, op_mode_changes
);
1387 return op_mode_changes
;
1390 void associated_clients_update23a(struct rtw_adapter
*padapter
, u8 updated
)
1392 /* update associated stations cap. */
1393 if (updated
== true) {
1394 struct list_head
*phead
, *plist
, *ptmp
;
1395 struct sta_info
*psta
;
1396 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
1398 spin_lock_bh(&pstapriv
->asoc_list_lock
);
1400 phead
= &pstapriv
->asoc_list
;
1402 list_for_each_safe(plist
, ptmp
, phead
) {
1403 psta
= container_of(plist
, struct sta_info
, asoc_list
);
1405 VCS_update23a(padapter
, psta
);
1408 spin_unlock_bh(&pstapriv
->asoc_list_lock
);
1412 /* called > TSR LEVEL for USB or SDIO Interface */
1413 void bss_cap_update_on_sta_join23a(struct rtw_adapter
*padapter
, struct sta_info
*psta
)
1415 u8 beacon_updated
= false;
1416 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
1417 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1419 if (!(psta
->flags
& WLAN_STA_SHORT_PREAMBLE
)) {
1420 if (!psta
->no_short_preamble_set
) {
1421 psta
->no_short_preamble_set
= 1;
1423 pmlmepriv
->num_sta_no_short_preamble
++;
1425 if ((pmlmeext
->cur_wireless_mode
> WIRELESS_11B
) &&
1426 (pmlmepriv
->num_sta_no_short_preamble
== 1)) {
1427 beacon_updated
= true;
1428 update_beacon23a(padapter
, 0xFF, NULL
, true);
1433 if (psta
->no_short_preamble_set
) {
1434 psta
->no_short_preamble_set
= 0;
1436 pmlmepriv
->num_sta_no_short_preamble
--;
1438 if ((pmlmeext
->cur_wireless_mode
> WIRELESS_11B
) &&
1439 (pmlmepriv
->num_sta_no_short_preamble
== 0)) {
1440 beacon_updated
= true;
1441 update_beacon23a(padapter
, 0xFF, NULL
, true);
1447 if (psta
->flags
& WLAN_STA_NONERP
) {
1448 if (!psta
->nonerp_set
) {
1449 psta
->nonerp_set
= 1;
1451 pmlmepriv
->num_sta_non_erp
++;
1453 if (pmlmepriv
->num_sta_non_erp
== 1) {
1454 beacon_updated
= true;
1455 update_beacon23a(padapter
, WLAN_EID_ERP_INFO
, NULL
, true);
1460 if (psta
->nonerp_set
) {
1461 psta
->nonerp_set
= 0;
1463 pmlmepriv
->num_sta_non_erp
--;
1465 if (pmlmepriv
->num_sta_non_erp
== 0) {
1466 beacon_updated
= true;
1467 update_beacon23a(padapter
, WLAN_EID_ERP_INFO
, NULL
, true);
1473 if (!(psta
->capability
& WLAN_CAPABILITY_SHORT_SLOT_TIME
)) {
1474 if (!psta
->no_short_slot_time_set
) {
1475 psta
->no_short_slot_time_set
= 1;
1477 pmlmepriv
->num_sta_no_short_slot_time
++;
1479 if ((pmlmeext
->cur_wireless_mode
> WIRELESS_11B
) &&
1480 (pmlmepriv
->num_sta_no_short_slot_time
== 1)) {
1481 beacon_updated
= true;
1482 update_beacon23a(padapter
, 0xFF, NULL
, true);
1487 if (psta
->no_short_slot_time_set
) {
1488 psta
->no_short_slot_time_set
= 0;
1490 pmlmepriv
->num_sta_no_short_slot_time
--;
1492 if ((pmlmeext
->cur_wireless_mode
> WIRELESS_11B
) &&
1493 (pmlmepriv
->num_sta_no_short_slot_time
== 0)) {
1494 beacon_updated
= true;
1495 update_beacon23a(padapter
, 0xFF, NULL
, true);
1500 if (psta
->flags
& WLAN_STA_HT
) {
1501 u16 ht_capab
= le16_to_cpu(psta
->htpriv
.ht_cap
.cap_info
);
1503 DBG_8723A("HT: STA %pM HT Capabilities Info: 0x%04x\n",
1504 psta
->hwaddr
, ht_capab
);
1506 if (psta
->no_ht_set
) {
1507 psta
->no_ht_set
= 0;
1508 pmlmepriv
->num_sta_no_ht
--;
1511 if ((ht_capab
& IEEE80211_HT_CAP_GRN_FLD
) == 0) {
1512 if (!psta
->no_ht_gf_set
) {
1513 psta
->no_ht_gf_set
= 1;
1514 pmlmepriv
->num_sta_ht_no_gf
++;
1516 DBG_8723A("%s STA %pM - no greenfield, num of non-gf stations %d\n",
1517 __func__
, psta
->hwaddr
,
1518 pmlmepriv
->num_sta_ht_no_gf
);
1521 if ((ht_capab
& IEEE80211_HT_CAP_SUP_WIDTH_20_40
) == 0) {
1522 if (!psta
->ht_20mhz_set
) {
1523 psta
->ht_20mhz_set
= 1;
1524 pmlmepriv
->num_sta_ht_20mhz
++;
1526 DBG_8723A("%s STA %pM - 20 MHz HT, num of 20MHz HT STAs %d\n",
1527 __func__
, psta
->hwaddr
,
1528 pmlmepriv
->num_sta_ht_20mhz
);
1532 if (!psta
->no_ht_set
) {
1533 psta
->no_ht_set
= 1;
1534 pmlmepriv
->num_sta_no_ht
++;
1536 if (pmlmepriv
->htpriv
.ht_option
) {
1537 DBG_8723A("%s STA %pM - no HT, num of non-HT stations %d\n",
1538 __func__
, psta
->hwaddr
,
1539 pmlmepriv
->num_sta_no_ht
);
1543 if (rtw_ht_operation_update(padapter
) > 0) {
1544 update_beacon23a(padapter
, WLAN_EID_HT_CAPABILITY
, NULL
, false);
1545 update_beacon23a(padapter
, WLAN_EID_HT_OPERATION
, NULL
, true);
1548 /* update associated stations cap. */
1549 associated_clients_update23a(padapter
, beacon_updated
);
1551 DBG_8723A("%s, updated =%d\n", __func__
, beacon_updated
);
1554 u8
bss_cap_update_on_sta_leave23a(struct rtw_adapter
*padapter
, struct sta_info
*psta
)
1556 u8 beacon_updated
= false;
1557 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
1558 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1561 return beacon_updated
;
1563 if (psta
->no_short_preamble_set
) {
1564 psta
->no_short_preamble_set
= 0;
1565 pmlmepriv
->num_sta_no_short_preamble
--;
1566 if (pmlmeext
->cur_wireless_mode
> WIRELESS_11B
1567 && pmlmepriv
->num_sta_no_short_preamble
== 0) {
1568 beacon_updated
= true;
1569 update_beacon23a(padapter
, 0xFF, NULL
, true);
1573 if (psta
->nonerp_set
) {
1574 psta
->nonerp_set
= 0;
1575 pmlmepriv
->num_sta_non_erp
--;
1576 if (pmlmepriv
->num_sta_non_erp
== 0) {
1577 beacon_updated
= true;
1578 update_beacon23a(padapter
, WLAN_EID_ERP_INFO
,
1583 if (psta
->no_short_slot_time_set
) {
1584 psta
->no_short_slot_time_set
= 0;
1585 pmlmepriv
->num_sta_no_short_slot_time
--;
1586 if (pmlmeext
->cur_wireless_mode
> WIRELESS_11B
1587 && pmlmepriv
->num_sta_no_short_slot_time
== 0) {
1588 beacon_updated
= true;
1589 update_beacon23a(padapter
, 0xFF, NULL
, true);
1593 if (psta
->no_ht_gf_set
) {
1594 psta
->no_ht_gf_set
= 0;
1595 pmlmepriv
->num_sta_ht_no_gf
--;
1598 if (psta
->no_ht_set
) {
1599 psta
->no_ht_set
= 0;
1600 pmlmepriv
->num_sta_no_ht
--;
1603 if (psta
->ht_20mhz_set
) {
1604 psta
->ht_20mhz_set
= 0;
1605 pmlmepriv
->num_sta_ht_20mhz
--;
1608 if (rtw_ht_operation_update(padapter
) > 0) {
1609 update_beacon23a(padapter
, WLAN_EID_HT_CAPABILITY
, NULL
, false);
1610 update_beacon23a(padapter
, WLAN_EID_HT_OPERATION
, NULL
, true);
1613 /* update associated stations cap. */
1615 DBG_8723A("%s, updated =%d\n", __func__
, beacon_updated
);
1617 return beacon_updated
;
1620 u8
ap_free_sta23a(struct rtw_adapter
*padapter
, struct sta_info
*psta
, bool active
, u16 reason
)
1622 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
1623 u8 beacon_updated
= false;
1626 return beacon_updated
;
1629 /* tear down Rx AMPDU */
1630 send_delba23a(padapter
, 0, psta
->hwaddr
); /* recipient */
1632 /* tear down TX AMPDU */
1633 send_delba23a(padapter
, 1, psta
->hwaddr
); /* originator */
1635 issue_deauth23a(padapter
, psta
->hwaddr
, reason
);
1638 psta
->htpriv
.agg_enable_bitmap
= 0x0; /* reset */
1639 psta
->htpriv
.candidate_tid_bitmap
= 0x0; /* reset */
1641 /* report_del_sta_event23a(padapter, psta->hwaddr, reason); */
1643 /* clear cam entry / key */
1644 /* clear_cam_entry23a(padapter, (psta->mac_id + 3)); */
1645 rtw_clearstakey_cmd23a(padapter
, (u8
*)psta
, (u8
)(psta
->mac_id
+ 3),
1648 spin_lock_bh(&psta
->lock
);
1649 psta
->state
&= ~_FW_LINKED
;
1650 spin_unlock_bh(&psta
->lock
);
1652 rtw_cfg80211_indicate_sta_disassoc(padapter
, psta
->hwaddr
, reason
);
1654 report_del_sta_event23a(padapter
, psta
->hwaddr
, reason
);
1656 beacon_updated
= bss_cap_update_on_sta_leave23a(padapter
, psta
);
1658 spin_lock_bh(&pstapriv
->sta_hash_lock
);
1659 rtw_free_stainfo23a(padapter
, psta
);
1660 spin_unlock_bh(&pstapriv
->sta_hash_lock
);
1662 return beacon_updated
;
1665 int rtw_ap_inform_ch_switch23a(struct rtw_adapter
*padapter
, u8 new_ch
, u8 ch_offset
)
1667 struct list_head
*phead
, *plist
;
1668 struct sta_info
*psta
= NULL
;
1669 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
1670 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1671 struct mlme_ext_info
*pmlmeinfo
= &pmlmeext
->mlmext_info
;
1672 u8 bc_addr
[ETH_ALEN
] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
1674 if ((pmlmeinfo
->state
&0x03) != MSR_AP
)
1677 DBG_8723A("%s(%s): with ch:%u, offset:%u\n", __func__
,
1678 padapter
->pnetdev
->name
, new_ch
, ch_offset
);
1680 spin_lock_bh(&pstapriv
->asoc_list_lock
);
1681 phead
= &pstapriv
->asoc_list
;
1683 list_for_each(plist
, phead
) {
1684 psta
= container_of(plist
, struct sta_info
, asoc_list
);
1686 issue_action_spct_ch_switch23a(padapter
, psta
->hwaddr
, new_ch
, ch_offset
);
1687 psta
->expire_to
= ((pstapriv
->expire_to
* 2) > 5) ? 5 : (pstapriv
->expire_to
* 2);
1689 spin_unlock_bh(&pstapriv
->asoc_list_lock
);
1691 issue_action_spct_ch_switch23a(padapter
, bc_addr
, new_ch
, ch_offset
);
1696 int rtw_sta_flush23a(struct rtw_adapter
*padapter
)
1698 struct list_head
*phead
, *plist
, *ptmp
;
1699 struct sta_info
*psta
;
1700 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
1701 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1702 struct mlme_ext_info
*pmlmeinfo
= &pmlmeext
->mlmext_info
;
1703 u8 bc_addr
[ETH_ALEN
] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
1704 u8 chk_alive_num
= 0;
1705 struct sta_info
*chk_alive_list
[NUM_STA
];
1708 DBG_8723A("%s(%s)\n", __func__
, padapter
->pnetdev
->name
);
1710 if ((pmlmeinfo
->state
&0x03) != MSR_AP
)
1713 spin_lock_bh(&pstapriv
->asoc_list_lock
);
1714 phead
= &pstapriv
->asoc_list
;
1716 list_for_each_safe(plist
, ptmp
, phead
) {
1717 psta
= container_of(plist
, struct sta_info
, asoc_list
);
1719 /* Remove sta from asoc_list */
1720 list_del_init(&psta
->asoc_list
);
1721 pstapriv
->asoc_list_cnt
--;
1723 /* Keep sta for ap_free_sta23a() beyond this asoc_list loop */
1724 chk_alive_list
[chk_alive_num
++] = psta
;
1726 spin_unlock_bh(&pstapriv
->asoc_list_lock
);
1728 /* For each sta in chk_alive_list, call ap_free_sta23a */
1729 for (i
= 0; i
< chk_alive_num
; i
++)
1730 ap_free_sta23a(padapter
, chk_alive_list
[i
], true,
1731 WLAN_REASON_DEAUTH_LEAVING
);
1733 issue_deauth23a(padapter
, bc_addr
, WLAN_REASON_DEAUTH_LEAVING
);
1735 associated_clients_update23a(padapter
, true);
1740 /* called > TSR LEVEL for USB or SDIO Interface */
1741 void sta_info_update23a(struct rtw_adapter
*padapter
, struct sta_info
*psta
)
1743 int flags
= psta
->flags
;
1744 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
1746 /* update wmm cap. */
1747 if (WLAN_STA_WME
&flags
)
1748 psta
->qos_option
= 1;
1750 psta
->qos_option
= 0;
1752 if (pmlmepriv
->qos_option
== 0)
1753 psta
->qos_option
= 0;
1755 /* update 802.11n ht cap. */
1756 if (WLAN_STA_HT
&flags
) {
1757 psta
->htpriv
.ht_option
= true;
1758 psta
->qos_option
= 1;
1760 psta
->htpriv
.ht_option
= false;
1763 if (!pmlmepriv
->htpriv
.ht_option
)
1764 psta
->htpriv
.ht_option
= false;
1766 update_sta_info23a_apmode23a(padapter
, psta
);
1769 /* called >= TSR LEVEL for USB or SDIO Interface */
1770 void ap_sta_info_defer_update23a(struct rtw_adapter
*padapter
, struct sta_info
*psta
)
1772 if (psta
->state
& _FW_LINKED
) {
1774 add_RATid23a(padapter
, psta
, 0);/* DM_RATR_STA_INIT */
1778 /* restore hw setting from sw data structures */
1779 void rtw_ap_restore_network(struct rtw_adapter
*padapter
)
1781 struct mlme_priv
*mlmepriv
= &padapter
->mlmepriv
;
1782 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1783 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
1784 struct sta_info
*psta
;
1785 struct security_priv
*psecuritypriv
= &padapter
->securitypriv
;
1786 struct list_head
*phead
, *plist
, *ptmp
;
1787 u8 chk_alive_num
= 0;
1788 struct sta_info
*chk_alive_list
[NUM_STA
];
1791 rtw_setopmode_cmd23a(padapter
, NL80211_IFTYPE_AP
);
1793 set_channel_bwmode23a(padapter
, pmlmeext
->cur_channel
, pmlmeext
->cur_ch_offset
, pmlmeext
->cur_bwmode
);
1795 start_bss_network(padapter
, (u8
*)&mlmepriv
->cur_network
.network
);
1797 if (padapter
->securitypriv
.dot11PrivacyAlgrthm
==
1798 WLAN_CIPHER_SUITE_TKIP
||
1799 padapter
->securitypriv
.dot11PrivacyAlgrthm
==
1800 WLAN_CIPHER_SUITE_CCMP
) {
1801 /* restore group key, WEP keys is restored in ips_leave23a() */
1802 rtw_set_key23a(padapter
, psecuritypriv
,
1803 psecuritypriv
->dot118021XGrpKeyid
, 0);
1806 /* per sta pairwise key and settings */
1807 if (padapter
->securitypriv
.dot11PrivacyAlgrthm
!=
1808 WLAN_CIPHER_SUITE_TKIP
&&
1809 padapter
->securitypriv
.dot11PrivacyAlgrthm
!=
1810 WLAN_CIPHER_SUITE_CCMP
) {
1814 spin_lock_bh(&pstapriv
->asoc_list_lock
);
1816 phead
= &pstapriv
->asoc_list
;
1818 list_for_each_safe(plist
, ptmp
, phead
) {
1819 psta
= container_of(plist
, struct sta_info
, asoc_list
);
1821 chk_alive_list
[chk_alive_num
++] = psta
;
1824 spin_unlock_bh(&pstapriv
->asoc_list_lock
);
1826 for (i
= 0; i
< chk_alive_num
; i
++) {
1827 psta
= chk_alive_list
[i
];
1829 if (psta
->state
& _FW_LINKED
) {
1830 Update_RA_Entry23a(padapter
, psta
);
1832 rtw_setstakey_cmd23a(padapter
, (unsigned char *)psta
, true);
1837 void start_ap_mode23a(struct rtw_adapter
*padapter
)
1840 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
1841 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
1842 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1843 struct wlan_acl_pool
*pacl_list
= &pstapriv
->acl_list
;
1845 pmlmepriv
->update_bcn
= false;
1847 /* init_mlme_ap_info23a(padapter); */
1848 pmlmeext
->bstart_bss
= false;
1850 pmlmepriv
->num_sta_non_erp
= 0;
1852 pmlmepriv
->num_sta_no_short_slot_time
= 0;
1854 pmlmepriv
->num_sta_no_short_preamble
= 0;
1856 pmlmepriv
->num_sta_ht_no_gf
= 0;
1857 pmlmepriv
->num_sta_no_ht
= 0;
1858 pmlmepriv
->num_sta_ht_20mhz
= 0;
1860 pmlmepriv
->olbc
= false;
1862 pmlmepriv
->olbc_ht
= false;
1864 pmlmepriv
->ht_op_mode
= 0;
1866 for (i
= 0; i
< NUM_STA
; i
++)
1867 pstapriv
->sta_aid
[i
] = NULL
;
1870 INIT_LIST_HEAD(&pacl_list
->acl_node_q
.queue
);
1872 pacl_list
->mode
= 0;
1873 for (i
= 0; i
< NUM_ACL
; i
++) {
1874 INIT_LIST_HEAD(&pacl_list
->aclnode
[i
].list
);
1875 pacl_list
->aclnode
[i
].valid
= false;
1879 void stop_ap_mode23a(struct rtw_adapter
*padapter
)
1881 struct list_head
*phead
, *plist
, *ptmp
;
1882 struct rtw_wlan_acl_node
*paclnode
;
1883 struct sta_info
*psta
= NULL
;
1884 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
1885 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
1886 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1887 struct wlan_acl_pool
*pacl_list
= &pstapriv
->acl_list
;
1888 struct rtw_queue
*pacl_node_q
= &pacl_list
->acl_node_q
;
1890 pmlmepriv
->update_bcn
= false;
1891 pmlmeext
->bstart_bss
= false;
1894 * reset and init security priv , this can
1895 * refine with rtw_reset_securitypriv23a
1897 memset((unsigned char *)&padapter
->securitypriv
, 0, sizeof(struct security_priv
));
1898 padapter
->securitypriv
.ndisauthtype
= Ndis802_11AuthModeOpen
;
1899 padapter
->securitypriv
.ndisencryptstatus
= Ndis802_11WEPDisabled
;
1902 spin_lock_bh(&pacl_node_q
->lock
);
1903 phead
= get_list_head(pacl_node_q
);
1905 list_for_each_safe(plist
, ptmp
, phead
) {
1906 paclnode
= container_of(plist
, struct rtw_wlan_acl_node
, list
);
1908 if (paclnode
->valid
== true) {
1909 paclnode
->valid
= false;
1911 list_del_init(&paclnode
->list
);
1916 spin_unlock_bh(&pacl_node_q
->lock
);
1918 DBG_8723A("%s, free acl_node_queue, num =%d\n", __func__
, pacl_list
->num
);
1920 rtw_sta_flush23a(padapter
);
1922 /* free_assoc_sta_resources */
1923 rtw_free_all_stainfo23a(padapter
);
1925 psta
= rtw_get_bcmc_stainfo23a(padapter
);
1926 spin_lock_bh(&pstapriv
->sta_hash_lock
);
1927 rtw_free_stainfo23a(padapter
, psta
);
1928 spin_unlock_bh(&pstapriv
->sta_hash_lock
);
1930 rtw_init_bcmc_stainfo23a(padapter
);
1932 rtw23a_free_mlme_priv_ie_data(pmlmepriv
);