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>
24 extern unsigned char WMM_OUI23A
[];
25 extern unsigned char WPS_OUI23A
[];
26 extern unsigned char P2P_OUI23A
[];
28 void init_mlme_ap_info23a(struct rtw_adapter
*padapter
)
30 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
31 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
32 struct wlan_acl_pool
*pacl_list
= &pstapriv
->acl_list
;
34 spin_lock_init(&pmlmepriv
->bcn_update_lock
);
37 _rtw_init_queue23a(&pacl_list
->acl_node_q
);
39 start_ap_mode23a(padapter
);
42 void free_mlme_ap_info23a(struct rtw_adapter
*padapter
)
44 struct sta_info
*psta
= NULL
;
45 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
46 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
47 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
48 struct mlme_ext_info
*pmlmeinfo
= &pmlmeext
->mlmext_info
;
50 pmlmepriv
->update_bcn
= false;
51 pmlmeext
->bstart_bss
= false;
53 rtw_sta_flush23a(padapter
);
55 pmlmeinfo
->state
= MSR_NOLINK
;
57 /* free_assoc_sta_resources */
58 rtw_free_all_stainfo23a(padapter
);
60 /* free bc/mc sta_info */
61 psta
= rtw_get_bcmc_stainfo23a(padapter
);
62 spin_lock_bh(&pstapriv
->sta_hash_lock
);
63 rtw_free_stainfo23a(padapter
, psta
);
64 spin_unlock_bh(&pstapriv
->sta_hash_lock
);
67 static void update_BCNTIM(struct rtw_adapter
*padapter
)
69 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
70 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
71 struct mlme_ext_info
*pmlmeinfo
= &pmlmeext
->mlmext_info
;
72 struct wlan_bssid_ex
*pnetwork_mlmeext
= &pmlmeinfo
->network
;
73 unsigned char *pie
= pnetwork_mlmeext
->IEs
;
74 u8
*p
, *dst_ie
, *premainder_ie
= NULL
, *pbackup_remainder_ie
= NULL
;
76 uint offset
, tmp_len
, tim_ielen
, tim_ie_offset
, remainder_ielen
;
78 tim_bitmap_le
= cpu_to_le16(pstapriv
->tim_bitmap
);
80 p
= rtw_get_ie23a(pie
, WLAN_EID_TIM
, &tim_ielen
,
81 pnetwork_mlmeext
->IELength
);
82 if (p
!= NULL
&& tim_ielen
> 0) {
85 premainder_ie
= p
+tim_ielen
;
87 tim_ie_offset
= (int)(p
- pie
);
89 remainder_ielen
= pnetwork_mlmeext
->IELength
- tim_ie_offset
- tim_ielen
;
91 /* append TIM IE from dst_ie offset */
96 /* calculate head_len */
100 p
= rtw_get_ie23a(pie
, WLAN_EID_SSID
,
101 &tmp_len
, pnetwork_mlmeext
->IELength
);
105 /* get supported rates len */
106 p
= rtw_get_ie23a(pie
, WLAN_EID_SUPP_RATES
,
107 &tmp_len
, pnetwork_mlmeext
->IELength
);
111 /* DS Parameter Set IE, len = 3 */
114 premainder_ie
= pie
+ offset
;
116 remainder_ielen
= pnetwork_mlmeext
->IELength
- offset
- tim_ielen
;
118 /* append TIM IE from offset */
119 dst_ie
= pie
+ offset
;
122 if (remainder_ielen
> 0) {
123 pbackup_remainder_ie
= kmalloc(remainder_ielen
, GFP_ATOMIC
);
124 if (pbackup_remainder_ie
&& premainder_ie
)
125 memcpy(pbackup_remainder_ie
, premainder_ie
, remainder_ielen
);
128 *dst_ie
++ = WLAN_EID_TIM
;
130 if ((pstapriv
->tim_bitmap
&0xff00) && (pstapriv
->tim_bitmap
&0x00fc))
135 *dst_ie
++ = tim_ielen
;
137 *dst_ie
++ = 0;/* DTIM count */
138 *dst_ie
++ = 1;/* DTIM period */
140 if (pstapriv
->tim_bitmap
& BIT(0))/* for bc/mc frames */
141 *dst_ie
++ = BIT(0);/* bitmap ctrl */
145 if (tim_ielen
== 4) {
146 *dst_ie
++ = *(u8
*)&tim_bitmap_le
;
147 } else if (tim_ielen
== 5) {
148 memcpy(dst_ie
, &tim_bitmap_le
, 2);
152 /* copy remainder IE */
153 if (pbackup_remainder_ie
) {
154 memcpy(dst_ie
, pbackup_remainder_ie
, remainder_ielen
);
156 kfree(pbackup_remainder_ie
);
159 offset
= (uint
)(dst_ie
- pie
);
160 pnetwork_mlmeext
->IELength
= offset
+ remainder_ielen
;
162 set_tx_beacon_cmd23a(padapter
);
165 static u8
chk_sta_is_alive(struct sta_info
*psta
)
169 if ((psta
->sta_stats
.last_rx_data_pkts
+
170 psta
->sta_stats
.last_rx_ctrl_pkts
) !=
171 (psta
->sta_stats
.rx_data_pkts
+ psta
->sta_stats
.rx_ctrl_pkts
))
174 sta_update_last_rx_pkts(psta
);
179 void expire_timeout_chk23a(struct rtw_adapter
*padapter
)
181 struct list_head
*phead
, *plist
, *ptmp
;
183 struct sta_info
*psta
;
184 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
185 u8 chk_alive_num
= 0;
186 struct sta_info
*chk_alive_list
[NUM_STA
];
189 spin_lock_bh(&pstapriv
->auth_list_lock
);
191 phead
= &pstapriv
->auth_list
;
193 /* check auth_queue */
194 list_for_each_safe(plist
, ptmp
, phead
) {
195 psta
= container_of(plist
, struct sta_info
, auth_list
);
197 if (psta
->expire_to
> 0) {
199 if (psta
->expire_to
== 0) {
200 list_del_init(&psta
->auth_list
);
201 pstapriv
->auth_list_cnt
--;
203 DBG_8723A("auth expire %pM\n", psta
->hwaddr
);
205 spin_unlock_bh(&pstapriv
->auth_list_lock
);
207 spin_lock_bh(&pstapriv
->sta_hash_lock
);
208 rtw_free_stainfo23a(padapter
, psta
);
209 spin_unlock_bh(&pstapriv
->sta_hash_lock
);
211 spin_lock_bh(&pstapriv
->auth_list_lock
);
217 spin_unlock_bh(&pstapriv
->auth_list_lock
);
219 spin_lock_bh(&pstapriv
->asoc_list_lock
);
221 phead
= &pstapriv
->asoc_list
;
223 /* check asoc_queue */
224 list_for_each_safe(plist
, ptmp
, phead
) {
225 psta
= container_of(plist
, struct sta_info
, asoc_list
);
227 if (chk_sta_is_alive(psta
) || !psta
->expire_to
) {
228 psta
->expire_to
= pstapriv
->expire_to
;
229 psta
->keep_alive_trycnt
= 0;
234 if (psta
->expire_to
<= 0)
236 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
238 if (padapter
->registrypriv
.wifi_spec
== 1)
240 psta
->expire_to
= pstapriv
->expire_to
;
244 if (psta
->state
& WIFI_SLEEP_STATE
) {
245 if (!(psta
->state
& WIFI_STA_ALIVE_CHK_STATE
)) {
246 /* to check if alive by another methods if station is at ps mode. */
247 psta
->expire_to
= pstapriv
->expire_to
;
248 psta
->state
|= WIFI_STA_ALIVE_CHK_STATE
;
250 /* to update bcn with tim_bitmap for this station */
251 pstapriv
->tim_bitmap
|= CHKBIT(psta
->aid
);
252 update_beacon23a(padapter
, WLAN_EID_TIM
, NULL
, false);
254 if (!pmlmeext
->active_keep_alive_check
)
259 if (pmlmeext
->active_keep_alive_check
) {
260 chk_alive_list
[chk_alive_num
++] = psta
;
264 list_del_init(&psta
->asoc_list
);
265 pstapriv
->asoc_list_cnt
--;
267 DBG_8723A("asoc expire "MAC_FMT
", state = 0x%x\n", MAC_ARG(psta
->hwaddr
), psta
->state
);
268 updated
= ap_free_sta23a(padapter
, psta
, false, WLAN_REASON_DEAUTH_LEAVING
);
270 /* TODO: Aging mechanism to digest frames in sleep_q to avoid running out of xmitframe */
271 if (psta
->sleepq_len
> (NR_XMITFRAME
/pstapriv
->asoc_list_cnt
)
272 && padapter
->xmitpriv
.free_xmitframe_cnt
< ((NR_XMITFRAME
/pstapriv
->asoc_list_cnt
)/2)
274 DBG_8723A("%s sta:"MAC_FMT
", sleepq_len:%u, free_xmitframe_cnt:%u, asoc_list_cnt:%u, clear sleep_q\n", __func__
,
275 MAC_ARG(psta
->hwaddr
),
277 padapter
->xmitpriv
.free_xmitframe_cnt
,
278 pstapriv
->asoc_list_cnt
);
279 wakeup_sta_to_xmit23a(padapter
, psta
);
284 spin_unlock_bh(&pstapriv
->asoc_list_lock
);
288 u8 backup_oper_channel
= 0;
289 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
290 /* switch to correct channel of current network before issue keep-alive frames */
291 if (rtw_get_oper_ch23a(padapter
) != pmlmeext
->cur_channel
) {
292 backup_oper_channel
= rtw_get_oper_ch23a(padapter
);
293 SelectChannel23a(padapter
, pmlmeext
->cur_channel
);
296 /* issue null data to check sta alive*/
297 for (i
= 0; i
< chk_alive_num
; i
++) {
301 psta
= chk_alive_list
[i
];
302 if (!(psta
->state
& _FW_LINKED
))
305 if (psta
->state
& WIFI_SLEEP_STATE
)
306 ret
= issue_nulldata23a(padapter
, psta
->hwaddr
, 0, 1, 50);
308 ret
= issue_nulldata23a(padapter
, psta
->hwaddr
, 0, 3, 50);
310 psta
->keep_alive_trycnt
++;
313 DBG_8723A("asoc check, sta(" MAC_FMT
") is alive\n", MAC_ARG(psta
->hwaddr
));
314 psta
->expire_to
= pstapriv
->expire_to
;
315 psta
->keep_alive_trycnt
= 0;
318 else if (psta
->keep_alive_trycnt
<= 3)
320 DBG_8723A("ack check for asoc expire, keep_alive_trycnt =%d\n", psta
->keep_alive_trycnt
);
325 psta
->keep_alive_trycnt
= 0;
327 DBG_8723A("asoc expire "MAC_FMT
", state = 0x%x\n", MAC_ARG(psta
->hwaddr
), psta
->state
);
328 spin_lock_bh(&pstapriv
->asoc_list_lock
);
329 if (!list_empty(&psta
->asoc_list
)) {
330 list_del_init(&psta
->asoc_list
);
331 pstapriv
->asoc_list_cnt
--;
332 updated
= ap_free_sta23a(padapter
, psta
, false, WLAN_REASON_DEAUTH_LEAVING
);
334 spin_unlock_bh(&pstapriv
->asoc_list_lock
);
338 if (backup_oper_channel
> 0) /* back to the original operation channel */
339 SelectChannel23a(padapter
, backup_oper_channel
);
342 associated_clients_update23a(padapter
, updated
);
345 void add_RATid23a(struct rtw_adapter
*padapter
, struct sta_info
*psta
, u8 rssi_level
)
350 unsigned char sta_band
= 0, raid
, shortGIrate
= false;
352 unsigned int tx_ra_bitmap
= 0;
353 struct ht_priv
*psta_ht
= NULL
;
354 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
355 struct wlan_bssid_ex
*pcur_network
= &pmlmepriv
->cur_network
.network
;
358 psta_ht
= &psta
->htpriv
;
362 if (!(psta
->state
& _FW_LINKED
))
365 /* b/g mode ra_bitmap */
366 for (i
= 0; i
< sizeof(psta
->bssrateset
); i
++)
368 if (psta
->bssrateset
[i
])
369 tx_ra_bitmap
|= rtw_get_bit_value_from_ieee_value23a(psta
->bssrateset
[i
]&0x7f);
371 /* n mode ra_bitmap */
372 if (psta_ht
->ht_option
) {
373 rf_type
= rtl8723a_get_rf_type(padapter
);
375 if (rf_type
== RF_2T2R
)
380 for (i
= 0; i
< limit
; i
++) {
381 if (psta_ht
->ht_cap
.mcs
.rx_mask
[i
/ 8] & BIT(i
% 8))
382 tx_ra_bitmap
|= BIT(i
+ 12);
385 /* max short GI rate */
386 shortGIrate
= psta_ht
->sgi
;
389 if (pcur_network
->DSConfig
> 14) {
391 if (tx_ra_bitmap
& 0xffff000)
392 sta_band
|= WIRELESS_11_5N
| WIRELESS_11A
;
394 sta_band
|= WIRELESS_11A
;
396 if (tx_ra_bitmap
& 0xffff000)
397 sta_band
|= WIRELESS_11_24N
| WIRELESS_11G
| WIRELESS_11B
;
398 else if (tx_ra_bitmap
& 0xff0)
399 sta_band
|= WIRELESS_11G
| WIRELESS_11B
;
401 sta_band
|= WIRELESS_11B
;
404 psta
->wireless_mode
= sta_band
;
406 raid
= networktype_to_raid23a(sta_band
);
407 init_rate
= get_highest_rate_idx23a(tx_ra_bitmap
&0x0fffffff)&0x3f;
409 if (psta
->aid
< NUM_STA
)
413 arg
= psta
->mac_id
&0x1f;
415 arg
|= BIT(7);/* support entry 2~31 */
417 if (shortGIrate
== true)
420 tx_ra_bitmap
|= ((raid
<<28)&0xf0000000);
422 DBG_8723A("%s => mac_id:%d , raid:%d , bitmap = 0x%x, arg = "
424 __func__
, psta
->mac_id
, raid
, tx_ra_bitmap
, arg
);
426 /* bitmap[0:27] = tx_rate_bitmap */
427 /* bitmap[28:31]= Rate Adaptive id */
428 /* arg[0:4] = macid */
429 /* arg[5] = Short GI */
430 rtl8723a_add_rateatid(padapter
, tx_ra_bitmap
, arg
, rssi_level
);
432 if (shortGIrate
== true)
435 /* set ra_id, init_rate */
437 psta
->init_rate
= init_rate
;
442 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
);
458 psta
->aid
= 0;/* default set to 0 */
459 psta
->mac_id
= psta
->aid
+ 1;
461 psta
->qos_option
= 0;
462 psta
->htpriv
.ht_option
= false;
464 psta
->ieee8021x_blocked
= 0;
466 memset((void *)&psta
->sta_stats
, 0,
467 sizeof(struct stainfo_stats
));
469 /* prepare for add_RATid23a */
470 supportRateNum
= rtw_get_rateset_len23a((u8
*)&pcur_network
->SupportedRates
);
471 network_type
= rtw_check_network_type23a((u8
*)&pcur_network
->SupportedRates
, supportRateNum
, 1);
473 memcpy(psta
->bssrateset
, &pcur_network
->SupportedRates
, supportRateNum
);
474 psta
->bssratelen
= supportRateNum
;
476 /* b/g mode ra_bitmap */
477 for (i
= 0; i
< supportRateNum
; i
++)
479 if (psta
->bssrateset
[i
])
480 tx_ra_bitmap
|= rtw_get_bit_value_from_ieee_value23a(psta
->bssrateset
[i
]&0x7f);
483 if (pcur_network
->DSConfig
> 14) {
484 /* force to A mode. 5G doesn't support CCK rates */
485 network_type
= WIRELESS_11A
;
486 tx_ra_bitmap
= 0x150; /* 6, 12, 24 Mbps */
488 /* force to b mode */
489 network_type
= WIRELESS_11B
;
493 raid
= networktype_to_raid23a(network_type
);
494 init_rate
= get_highest_rate_idx23a(tx_ra_bitmap
&0x0fffffff)&0x3f;
497 rtl8723a_SetHalODMVar(padapter
, HAL_ODM_STA_INFO
, psta
, true);
502 arg
= psta
->mac_id
&0x1f;
506 tx_ra_bitmap
|= ((raid
<<28)&0xf0000000);
508 DBG_8723A("update_bmc_sta, mask = 0x%x, arg = 0x%x\n", tx_ra_bitmap
, arg
);
510 /* bitmap[0:27] = tx_rate_bitmap */
511 /* bitmap[28:31]= Rate Adaptive id */
512 /* arg[0:4] = macid */
513 /* arg[5] = Short GI */
514 rtl8723a_add_rateatid(padapter
, tx_ra_bitmap
, arg
, 0);
517 /* set ra_id, init_rate */
519 psta
->init_rate
= init_rate
;
521 spin_lock_bh(&psta
->lock
);
522 psta
->state
= _FW_LINKED
;
523 spin_unlock_bh(&psta
->lock
);
528 DBG_8723A("add_RATid23a_bmc_sta error!\n");
533 /* AID: 1~MAX for sta and 0 for bc/mc in ap/adhoc mode */
534 /* MAC_ID = AID+1 for sta in ap/adhoc mode */
535 /* MAC_ID = 1 for bc/mc for sta/ap/adhoc */
536 /* MAC_ID = 0 for bssid for sta/ap/adhoc */
537 /* CAM_ID = 0~3 for default key, cmd_id = macid + 3, macid = aid+1; */
539 void update_sta_info23a_apmode23a(struct rtw_adapter
*padapter
, struct sta_info
*psta
)
541 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
542 struct security_priv
*psecuritypriv
= &padapter
->securitypriv
;
543 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
544 struct ht_priv
*phtpriv_ap
= &pmlmepriv
->htpriv
;
545 struct ht_priv
*phtpriv_sta
= &psta
->htpriv
;
546 /* set intf_tag to if1 */
548 psta
->mac_id
= psta
->aid
+1;
549 DBG_8723A("%s\n", __func__
);
552 rtl8723a_SetHalODMVar(padapter
, HAL_ODM_STA_INFO
, psta
, true);
554 if (psecuritypriv
->dot11AuthAlgrthm
== dot11AuthAlgrthm_8021X
)
555 psta
->ieee8021x_blocked
= true;
557 psta
->ieee8021x_blocked
= false;
559 /* update sta's cap */
562 VCS_update23a(padapter
, psta
);
564 if (phtpriv_sta
->ht_option
)
566 /* check if sta supports rx ampdu */
567 phtpriv_sta
->ampdu_enable
= phtpriv_ap
->ampdu_enable
;
569 /* check if sta support s Short GI */
570 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
))
571 phtpriv_sta
->sgi
= true;
574 if ((phtpriv_sta
->ht_cap
.cap_info
& phtpriv_ap
->ht_cap
.cap_info
) & cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH_20_40
)) {
575 /* phtpriv_sta->bwmode = HT_CHANNEL_WIDTH_40; */
576 phtpriv_sta
->bwmode
= pmlmeext
->cur_bwmode
;
577 phtpriv_sta
->ch_offset
= pmlmeext
->cur_ch_offset
;
581 psta
->qos_option
= true;
586 phtpriv_sta
->ampdu_enable
= false;
588 phtpriv_sta
->sgi
= false;
589 phtpriv_sta
->bwmode
= HT_CHANNEL_WIDTH_20
;
590 phtpriv_sta
->ch_offset
= HAL_PRIME_CHNL_OFFSET_DONT_CARE
;
594 send_delba23a(padapter
, 0, psta
->hwaddr
);/* recipient */
597 send_delba23a(padapter
, 1, psta
->hwaddr
);/* originator */
598 phtpriv_sta
->agg_enable_bitmap
= 0x0;/* reset */
599 phtpriv_sta
->candidate_tid_bitmap
= 0x0;/* reset */
601 /* todo: init other variables */
603 memset((void *)&psta
->sta_stats
, 0, sizeof(struct stainfo_stats
));
605 spin_lock_bh(&psta
->lock
);
606 psta
->state
|= _FW_LINKED
;
607 spin_unlock_bh(&psta
->lock
);
610 static void update_hw_ht_param(struct rtw_adapter
*padapter
)
612 unsigned char max_AMPDU_len
;
613 unsigned char min_MPDU_spacing
;
614 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
615 struct mlme_ext_info
*pmlmeinfo
= &pmlmeext
->mlmext_info
;
617 DBG_8723A("%s\n", __func__
);
619 /* handle A-MPDU parameter field */
621 AMPDU_para [1:0]:Max AMPDU Len => 0:8k , 1:16k, 2:32k, 3:64k
622 AMPDU_para [4:2]:Min MPDU Start Spacing
624 max_AMPDU_len
= pmlmeinfo
->ht_cap
.ampdu_params_info
&
625 IEEE80211_HT_AMPDU_PARM_FACTOR
;
627 min_MPDU_spacing
= (pmlmeinfo
->ht_cap
.ampdu_params_info
&
628 IEEE80211_HT_AMPDU_PARM_DENSITY
) >> 2;
630 rtl8723a_set_ampdu_min_space(padapter
, min_MPDU_spacing
);
631 rtl8723a_set_ampdu_factor(padapter
, max_AMPDU_len
);
633 /* Config SM Power Save setting */
634 pmlmeinfo
->SM_PS
= (le16_to_cpu(pmlmeinfo
->ht_cap
.cap_info
) &
635 IEEE80211_HT_CAP_SM_PS
) >> 2;
636 if (pmlmeinfo
->SM_PS
== WLAN_HT_CAP_SM_PS_STATIC
)
637 DBG_8723A("%s(): WLAN_HT_CAP_SM_PS_STATIC\n", __func__
);
640 static void start_bss_network(struct rtw_adapter
*padapter
, u8
*pbuf
)
643 u8 val8
, cur_channel
, cur_bwmode
, cur_ch_offset
;
646 struct registry_priv
*pregpriv
= &padapter
->registrypriv
;
647 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
648 struct security_priv
*psecuritypriv
= &padapter
->securitypriv
;
649 struct wlan_bssid_ex
*pnetwork
= &pmlmepriv
->cur_network
.network
;
650 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
651 struct mlme_ext_info
*pmlmeinfo
= &pmlmeext
->mlmext_info
;
652 struct wlan_bssid_ex
*pnetwork_mlmeext
= &pmlmeinfo
->network
;
653 struct ieee80211_ht_operation
*pht_info
= NULL
;
655 bcn_interval
= (u16
)pnetwork
->beacon_interval
;
656 cur_channel
= pnetwork
->DSConfig
;
657 cur_bwmode
= HT_CHANNEL_WIDTH_20
;;
658 cur_ch_offset
= HAL_PRIME_CHNL_OFFSET_DONT_CARE
;
660 /* check if there is wps ie, */
661 /* if there is wpsie in beacon, the hostapd will update beacon twice when stating hostapd, */
662 /* and at first time the security ie (RSN/WPA IE) will not include in beacon. */
663 if (NULL
== cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT
,
664 WLAN_OUI_TYPE_MICROSOFT_WPS
,
667 pmlmeext
->bstart_bss
= true;
669 /* todo: update wmm, ht cap */
670 /* pmlmeinfo->WMM_enable; */
671 /* pmlmeinfo->HT_enable; */
672 if (pmlmepriv
->qos_option
)
673 pmlmeinfo
->WMM_enable
= true;
674 if (pmlmepriv
->htpriv
.ht_option
) {
675 pmlmeinfo
->WMM_enable
= true;
676 pmlmeinfo
->HT_enable
= true;
678 update_hw_ht_param(padapter
);
681 if (pmlmepriv
->cur_network
.join_res
!= true) {
682 /* setting only at first time */
683 /* WEP Key will be set before this function, do not clear CAM. */
684 if (psecuritypriv
->dot11PrivacyAlgrthm
!=
685 WLAN_CIPHER_SUITE_WEP40
&&
686 psecuritypriv
->dot11PrivacyAlgrthm
!=
687 WLAN_CIPHER_SUITE_WEP104
)
688 flush_all_cam_entry23a(padapter
); /* clear CAM */
691 /* set MSR to AP_Mode */
692 rtl8723a_set_media_status(padapter
, MSR_AP
);
695 hw_var_set_bssid(padapter
, pnetwork
->MacAddress
);
697 /* Set EDCA param reg */
698 acparm
= 0x002F3217; /* VO */
699 rtl8723a_set_ac_param_vo(padapter
, acparm
);
700 acparm
= 0x005E4317; /* VI */
701 rtl8723a_set_ac_param_vi(padapter
, acparm
);
703 rtl8723a_set_ac_param_be(padapter
, acparm
);
704 acparm
= 0x0000A444; /* BK */
705 rtl8723a_set_ac_param_bk(padapter
, acparm
);
708 val8
= (psecuritypriv
->dot11AuthAlgrthm
== dot11AuthAlgrthm_8021X
) ?
710 rtl8723a_set_sec_cfg(padapter
, val8
);
712 /* Beacon Control related register */
713 rtl8723a_set_beacon_interval(padapter
, bcn_interval
);
715 UpdateBrateTbl23a(padapter
, pnetwork
->SupportedRates
);
716 HalSetBrateCfg23a(padapter
, pnetwork
->SupportedRates
);
718 if (!pmlmepriv
->cur_network
.join_res
) {
719 /* setting only at first time */
721 /* disable dynamic functions, such as high power, DIG */
723 /* turn on all dynamic functions */
724 rtl8723a_odm_support_ability_set(padapter
,
725 DYNAMIC_ALL_FUNC_ENABLE
);
727 /* set channel, bwmode */
729 p
= cfg80211_find_ie(WLAN_EID_HT_OPERATION
, pnetwork
->IEs
,
732 pht_info
= (struct ieee80211_ht_operation
*)(p
+ 2);
734 if (pregpriv
->cbw40_enable
&& pht_info
->ht_param
&
735 IEEE80211_HT_PARAM_CHAN_WIDTH_ANY
) {
736 /* switch to the 40M Hz mode */
737 cur_bwmode
= HT_CHANNEL_WIDTH_40
;
738 switch (pht_info
->ht_param
&
739 IEEE80211_HT_PARAM_CHA_SEC_OFFSET
) {
740 case IEEE80211_HT_PARAM_CHA_SEC_ABOVE
:
741 /* pmlmeext->cur_ch_offset =
742 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
;
754 /* TODO: need to judge the phy parameters on concurrent mode for single phy */
755 set_channel_bwmode23a(padapter
, cur_channel
, cur_ch_offset
, cur_bwmode
);
757 DBG_8723A("CH =%d, BW =%d, offset =%d\n", cur_channel
, cur_bwmode
,
760 pmlmeext
->cur_channel
= cur_channel
;
761 pmlmeext
->cur_bwmode
= cur_bwmode
;
762 pmlmeext
->cur_ch_offset
= cur_ch_offset
;
763 pmlmeext
->cur_wireless_mode
= pmlmepriv
->cur_network
.network_type
;
765 /* update cur_wireless_mode */
766 update_wireless_mode23a(padapter
);
768 /* update capability after cur_wireless_mode updated */
769 update_capinfo23a(padapter
, pnetwork
->capability
);
771 /* let pnetwork_mlmeext == pnetwork_mlme. */
772 memcpy(pnetwork_mlmeext
, pnetwork
, pnetwork
->Length
);
774 if (pmlmeext
->bstart_bss
) {
775 update_beacon23a(padapter
, WLAN_EID_TIM
, NULL
, false);
777 /* issue beacon frame */
778 if (send_beacon23a(padapter
) == _FAIL
)
779 DBG_8723A("issue_beacon23a, fail!\n");
782 /* update bc/mc sta_info */
783 update_bmc_sta(padapter
);
786 int rtw_check_beacon_data23a(struct rtw_adapter
*padapter
,
787 struct ieee80211_mgmt
*mgmt
, unsigned int len
)
791 u8
*pHT_caps_ie
= NULL
;
792 u8
*pHT_info_ie
= NULL
;
793 struct sta_info
*psta
= NULL
;
796 int group_cipher
, pairwise_cipher
;
797 u8 channel
, network_type
, supportRate
[NDIS_802_11_LENGTH_RATES_EX
];
798 int supportRateNum
= 0;
799 u8 WMM_PARA_IE
[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01};
800 struct registry_priv
*pregistrypriv
= &padapter
->registrypriv
;
801 struct security_priv
*psecuritypriv
= &padapter
->securitypriv
;
802 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
803 struct wlan_bssid_ex
*pbss_network
= &pmlmepriv
->cur_network
.network
;
804 u8
*ie
= pbss_network
->IEs
;
805 u8
*pbuf
= mgmt
->u
.beacon
.variable
;
806 len
-= offsetof(struct ieee80211_mgmt
, u
.beacon
.variable
);
808 /* Supported rates */
810 /* WLAN_EID_COUNTRY */
811 /* ERP Information element */
812 /* Extended supported rates */
814 /* Wi-Fi Wireless Multimedia Extensions */
815 /* ht_capab, ht_oper */
818 DBG_8723A("%s, len =%d\n", __func__
, len
);
820 if (!check_fwstate(pmlmepriv
, WIFI_AP_STATE
))
826 pbss_network
->IELength
= len
;
828 memset(ie
, 0, MAX_IE_SZ
);
830 memcpy(ie
, pbuf
, pbss_network
->IELength
);
832 if (pbss_network
->ifmode
!= NL80211_IFTYPE_AP
&&
833 pbss_network
->ifmode
!= NL80211_IFTYPE_P2P_GO
)
836 pbss_network
->Rssi
= 0;
838 memcpy(pbss_network
->MacAddress
, myid(&padapter
->eeprompriv
), ETH_ALEN
);
841 p
= rtw_get_ie23a(ie
, WLAN_EID_SSID
, &ie_len
, pbss_network
->IELength
);
842 if (p
&& ie_len
> 0) {
843 memset(&pbss_network
->Ssid
, 0, sizeof(struct cfg80211_ssid
));
844 memcpy(pbss_network
->Ssid
.ssid
, (p
+ 2), ie_len
);
845 pbss_network
->Ssid
.ssid_len
= ie_len
;
850 p
= rtw_get_ie23a(ie
, WLAN_EID_DS_PARAMS
, &ie_len
,
851 pbss_network
->IELength
);
855 pbss_network
->DSConfig
= channel
;
857 memset(supportRate
, 0, NDIS_802_11_LENGTH_RATES_EX
);
858 /* get supported rates */
859 p
= rtw_get_ie23a(ie
, WLAN_EID_SUPP_RATES
, &ie_len
,
860 pbss_network
->IELength
);
862 memcpy(supportRate
, p
+2, ie_len
);
863 supportRateNum
= ie_len
;
866 /* get ext_supported rates */
867 p
= rtw_get_ie23a(ie
, WLAN_EID_EXT_SUPP_RATES
,
868 &ie_len
, pbss_network
->IELength
);
870 memcpy(supportRate
+supportRateNum
, p
+2, ie_len
);
871 supportRateNum
+= ie_len
;
874 network_type
= rtw_check_network_type23a(supportRate
,
875 supportRateNum
, channel
);
877 rtw_set_supported_rate23a(pbss_network
->SupportedRates
, network_type
);
880 p
= rtw_get_ie23a(ie
, WLAN_EID_ERP_INFO
, &ie_len
,
881 pbss_network
->IELength
);
883 ERP_IE_handler23a(padapter
, p
);
885 /* update privacy/security */
886 if (pbss_network
->capability
& BIT(4))
887 pbss_network
->Privacy
= 1;
889 pbss_network
->Privacy
= 0;
891 psecuritypriv
->wpa_psk
= 0;
894 group_cipher
= 0; pairwise_cipher
= 0;
895 psecuritypriv
->wpa2_group_cipher
= 0;
896 psecuritypriv
->wpa2_pairwise_cipher
= 0;
897 p
= rtw_get_ie23a(ie
, WLAN_EID_RSN
, &ie_len
,
898 pbss_network
->IELength
);
899 if (p
&& ie_len
> 0) {
900 if (rtw_parse_wpa2_ie23a(p
, ie_len
+2, &group_cipher
,
901 &pairwise_cipher
, NULL
) == _SUCCESS
) {
902 psecuritypriv
->dot11AuthAlgrthm
= dot11AuthAlgrthm_8021X
;
904 psecuritypriv
->dot8021xalg
= 1;/* psk, todo:802.1x */
905 psecuritypriv
->wpa_psk
|= BIT(1);
907 psecuritypriv
->wpa2_group_cipher
= group_cipher
;
908 psecuritypriv
->wpa2_pairwise_cipher
= pairwise_cipher
;
916 psecuritypriv
->wpa_group_cipher
= 0;
917 psecuritypriv
->wpa_pairwise_cipher
= 0;
918 for (p
= ie
; ;p
+= (ie_len
+ 2)) {
919 p
= rtw_get_ie23a(p
, WLAN_EID_VENDOR_SPECIFIC
, &ie_len
,
920 pbss_network
->IELength
- (ie_len
+ 2));
921 if ((p
) && (!memcmp(p
+2, RTW_WPA_OUI23A_TYPE
, 4))) {
922 if (rtw_parse_wpa_ie23a(p
, ie_len
+2, &group_cipher
,
923 &pairwise_cipher
, NULL
) == _SUCCESS
) {
924 psecuritypriv
->dot11AuthAlgrthm
= dot11AuthAlgrthm_8021X
;
926 /* psk, todo:802.1x */
927 psecuritypriv
->dot8021xalg
= 1;
929 psecuritypriv
->wpa_psk
|= BIT(0);
931 psecuritypriv
->wpa_group_cipher
= group_cipher
;
932 psecuritypriv
->wpa_pairwise_cipher
= pairwise_cipher
;
937 if ((p
== NULL
) || (ie_len
== 0))
943 pmlmepriv
->qos_option
= 0;
944 if (pregistrypriv
->wmm_enable
) {
945 for (p
= ie
; ;p
+= (ie_len
+ 2)) {
946 p
= rtw_get_ie23a(p
, WLAN_EID_VENDOR_SPECIFIC
, &ie_len
,
947 (pbss_network
->IELength
-
949 if ((p
) && !memcmp(p
+2, WMM_PARA_IE
, 6)) {
950 pmlmepriv
->qos_option
= 1;
952 *(p
+8) |= BIT(7);/* QoS Info, support U-APSD */
954 /* disable all ACM bits since the WMM admission
955 * control is not supported
957 *(p
+ 10) &= ~BIT(4); /* BE */
958 *(p
+ 14) &= ~BIT(4); /* BK */
959 *(p
+ 18) &= ~BIT(4); /* VI */
960 *(p
+ 22) &= ~BIT(4); /* VO */
963 if ((p
== NULL
) || (ie_len
== 0))
967 /* parsing HT_CAP_IE */
968 p
= rtw_get_ie23a(ie
, WLAN_EID_HT_CAPABILITY
, &ie_len
,
969 pbss_network
->IELength
);
970 if (p
&& ie_len
> 0) {
973 struct ieee80211_ht_cap
*pht_cap
= (struct ieee80211_ht_cap
*)(p
+2);
978 network_type
|= WIRELESS_11_24N
;
980 rf_type
= rtl8723a_get_rf_type(padapter
);
982 if ((psecuritypriv
->wpa_pairwise_cipher
& WPA_CIPHER_CCMP
) ||
983 (psecuritypriv
->wpa2_pairwise_cipher
& WPA_CIPHER_CCMP
))
984 pht_cap
->ampdu_params_info
|= (IEEE80211_HT_AMPDU_PARM_DENSITY
& (0x07<<2));
986 pht_cap
->ampdu_params_info
|= (IEEE80211_HT_AMPDU_PARM_DENSITY
&0x00);
988 /* set Max Rx AMPDU size to 64K */
989 pht_cap
->ampdu_params_info
|= (IEEE80211_HT_AMPDU_PARM_FACTOR
& 0x03);
991 if (rf_type
== RF_1T1R
) {
992 pht_cap
->mcs
.rx_mask
[0] = 0xff;
993 pht_cap
->mcs
.rx_mask
[1] = 0x0;
996 memcpy(&pmlmepriv
->htpriv
.ht_cap
, p
+2, ie_len
);
999 /* parsing HT_INFO_IE */
1000 p
= rtw_get_ie23a(ie
, WLAN_EID_HT_OPERATION
, &ie_len
,
1001 pbss_network
->IELength
);
1002 if (p
&& ie_len
> 0)
1005 pmlmepriv
->cur_network
.network_type
= network_type
;
1007 pmlmepriv
->htpriv
.ht_option
= false;
1010 if (pregistrypriv
->ht_enable
&& ht_cap
) {
1011 pmlmepriv
->htpriv
.ht_option
= true;
1012 pmlmepriv
->qos_option
= 1;
1014 if (pregistrypriv
->ampdu_enable
== 1)
1015 pmlmepriv
->htpriv
.ampdu_enable
= true;
1017 HT_caps_handler23a(padapter
, pHT_caps_ie
);
1019 HT_info_handler23a(padapter
, pHT_info_ie
);
1022 pbss_network
->Length
= get_wlan_bssid_ex_sz(pbss_network
);
1024 /* issue beacon to start bss network */
1025 start_bss_network(padapter
, (u8
*)pbss_network
);
1027 /* alloc sta_info for ap itself */
1028 psta
= rtw_get_stainfo23a(&padapter
->stapriv
, pbss_network
->MacAddress
);
1030 psta
= rtw_alloc_stainfo23a(&padapter
->stapriv
,
1031 pbss_network
->MacAddress
,
1036 /* fix bug of flush_cam_entry at STOP AP mode */
1037 psta
->state
|= WIFI_AP_STATE
;
1038 rtw_indicate_connect23a(padapter
);
1040 /* for check if already set beacon */
1041 pmlmepriv
->cur_network
.join_res
= true;
1046 void rtw_set_macaddr_acl23a(struct rtw_adapter
*padapter
, int mode
)
1048 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
1049 struct wlan_acl_pool
*pacl_list
= &pstapriv
->acl_list
;
1051 DBG_8723A("%s, mode =%d\n", __func__
, mode
);
1053 pacl_list
->mode
= mode
;
1056 int rtw_acl_add_sta23a(struct rtw_adapter
*padapter
, u8
*addr
)
1058 struct list_head
*plist
, *phead
;
1061 struct rtw_wlan_acl_node
*paclnode
;
1062 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
1063 struct wlan_acl_pool
*pacl_list
= &pstapriv
->acl_list
;
1064 struct rtw_queue
*pacl_node_q
= &pacl_list
->acl_node_q
;
1066 DBG_8723A("%s(acl_num =%d) =" MAC_FMT
"\n", __func__
, pacl_list
->num
, MAC_ARG(addr
));
1068 if ((NUM_ACL
-1) < pacl_list
->num
)
1071 spin_lock_bh(&pacl_node_q
->lock
);
1073 phead
= get_list_head(pacl_node_q
);
1075 list_for_each(plist
, phead
) {
1076 paclnode
= container_of(plist
, struct rtw_wlan_acl_node
, list
);
1078 if (!memcmp(paclnode
->addr
, addr
, ETH_ALEN
)) {
1079 if (paclnode
->valid
== true) {
1081 DBG_8723A("%s, sta has been added\n", __func__
);
1087 spin_unlock_bh(&pacl_node_q
->lock
);
1092 spin_lock_bh(&pacl_node_q
->lock
);
1094 for (i
= 0; i
< NUM_ACL
; i
++) {
1095 paclnode
= &pacl_list
->aclnode
[i
];
1097 if (!paclnode
->valid
) {
1098 INIT_LIST_HEAD(&paclnode
->list
);
1100 memcpy(paclnode
->addr
, addr
, ETH_ALEN
);
1102 paclnode
->valid
= true;
1104 list_add_tail(&paclnode
->list
, get_list_head(pacl_node_q
));
1112 DBG_8723A("%s, acl_num =%d\n", __func__
, pacl_list
->num
);
1114 spin_unlock_bh(&pacl_node_q
->lock
);
1118 int rtw_acl_remove_sta23a(struct rtw_adapter
*padapter
, u8
*addr
)
1120 struct list_head
*plist
, *phead
, *ptmp
;
1121 struct rtw_wlan_acl_node
*paclnode
;
1122 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
1123 struct wlan_acl_pool
*pacl_list
= &pstapriv
->acl_list
;
1124 struct rtw_queue
*pacl_node_q
= &pacl_list
->acl_node_q
;
1126 DBG_8723A("%s(acl_num =%d) = %pM\n", __func__
, pacl_list
->num
, addr
);
1128 spin_lock_bh(&pacl_node_q
->lock
);
1130 phead
= get_list_head(pacl_node_q
);
1132 list_for_each_safe(plist
, ptmp
, phead
) {
1133 paclnode
= container_of(plist
, struct rtw_wlan_acl_node
, list
);
1135 if (!memcmp(paclnode
->addr
, addr
, ETH_ALEN
)) {
1136 if (paclnode
->valid
) {
1137 paclnode
->valid
= false;
1139 list_del_init(&paclnode
->list
);
1146 spin_unlock_bh(&pacl_node_q
->lock
);
1148 DBG_8723A("%s, acl_num =%d\n", __func__
, pacl_list
->num
);
1153 static void update_bcn_fixed_ie(struct rtw_adapter
*padapter
)
1155 DBG_8723A("%s\n", __func__
);
1158 static void update_bcn_erpinfo_ie(struct rtw_adapter
*padapter
)
1160 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
1161 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1162 struct mlme_ext_info
*pmlmeinfo
= &pmlmeext
->mlmext_info
;
1163 struct wlan_bssid_ex
*pnetwork
= &pmlmeinfo
->network
;
1164 unsigned char *p
, *ie
= pnetwork
->IEs
;
1167 DBG_8723A("%s, ERP_enable =%d\n", __func__
, pmlmeinfo
->ERP_enable
);
1169 if (!pmlmeinfo
->ERP_enable
)
1172 /* parsing ERP_IE */
1173 p
= rtw_get_ie23a(ie
, WLAN_EID_ERP_INFO
, &len
, pnetwork
->IELength
);
1175 if (pmlmepriv
->num_sta_non_erp
== 1)
1176 p
[2] |= WLAN_ERP_NON_ERP_PRESENT
|
1177 WLAN_ERP_USE_PROTECTION
;
1179 p
[2] &= ~(WLAN_ERP_NON_ERP_PRESENT
|
1180 WLAN_ERP_USE_PROTECTION
);
1182 if (pmlmepriv
->num_sta_no_short_preamble
> 0)
1183 p
[2] |= WLAN_ERP_BARKER_PREAMBLE
;
1185 p
[2] &= ~(WLAN_ERP_BARKER_PREAMBLE
);
1187 ERP_IE_handler23a(padapter
, p
);
1191 static void update_bcn_htcap_ie(struct rtw_adapter
*padapter
)
1193 DBG_8723A("%s\n", __func__
);
1196 static void update_bcn_htinfo_ie(struct rtw_adapter
*padapter
)
1198 DBG_8723A("%s\n", __func__
);
1201 static void update_bcn_rsn_ie(struct rtw_adapter
*padapter
)
1203 DBG_8723A("%s\n", __func__
);
1206 static void update_bcn_wpa_ie(struct rtw_adapter
*padapter
)
1208 DBG_8723A("%s\n", __func__
);
1211 static void update_bcn_wmm_ie(struct rtw_adapter
*padapter
)
1213 DBG_8723A("%s\n", __func__
);
1216 static void update_bcn_wps_ie(struct rtw_adapter
*padapter
)
1218 DBG_8723A("%s\n", __func__
);
1223 static void update_bcn_p2p_ie(struct rtw_adapter
*padapter
)
1227 static void update_bcn_vendor_spec_ie(struct rtw_adapter
*padapter
, u8
*oui
)
1229 DBG_8723A("%s\n", __func__
);
1231 if (!memcmp(RTW_WPA_OUI23A_TYPE
, oui
, 4))
1232 update_bcn_wpa_ie(padapter
);
1233 else if (!memcmp(WMM_OUI23A
, oui
, 4))
1234 update_bcn_wmm_ie(padapter
);
1235 else if (!memcmp(WPS_OUI23A
, oui
, 4))
1236 update_bcn_wps_ie(padapter
);
1237 else if (!memcmp(P2P_OUI23A
, oui
, 4))
1238 update_bcn_p2p_ie(padapter
);
1240 DBG_8723A("unknown OUI type!\n");
1243 void update_beacon23a(struct rtw_adapter
*padapter
, u8 ie_id
, u8
*oui
, u8 tx
)
1245 struct mlme_priv
*pmlmepriv
;
1246 struct mlme_ext_priv
*pmlmeext
;
1247 /* struct mlme_ext_info *pmlmeinfo; */
1249 /* DBG_8723A("%s\n", __func__); */
1254 pmlmepriv
= &padapter
->mlmepriv
;
1255 pmlmeext
= &padapter
->mlmeextpriv
;
1256 /* pmlmeinfo = &pmlmeext->mlmext_info; */
1258 if (false == pmlmeext
->bstart_bss
)
1261 spin_lock_bh(&pmlmepriv
->bcn_update_lock
);
1266 /* 8: TimeStamp, 2: Beacon Interval 2:Capability */
1267 update_bcn_fixed_ie(padapter
);
1271 update_BCNTIM(padapter
);
1274 case WLAN_EID_ERP_INFO
:
1275 update_bcn_erpinfo_ie(padapter
);
1278 case WLAN_EID_HT_CAPABILITY
:
1279 update_bcn_htcap_ie(padapter
);
1283 update_bcn_rsn_ie(padapter
);
1286 case WLAN_EID_HT_OPERATION
:
1287 update_bcn_htinfo_ie(padapter
);
1290 case WLAN_EID_VENDOR_SPECIFIC
:
1291 update_bcn_vendor_spec_ie(padapter
, oui
);
1298 pmlmepriv
->update_bcn
= true;
1300 spin_unlock_bh(&pmlmepriv
->bcn_update_lock
);
1303 set_tx_beacon_cmd23a(padapter
);
1308 Set to 0 (HT pure) under the following conditions
1309 - all STAs in the BSS are 20/40 MHz HT in 20/40 MHz BSS or
1310 - all STAs in the BSS are 20 MHz HT in 20 MHz BSS
1311 Set to 1 (HT non-member protection) if there may be non-HT STAs
1312 in both the primary and the secondary channel
1313 Set to 2 if only HT STAs are associated in BSS,
1314 however and at least one 20 MHz HT STA is associated
1315 Set to 3 (HT mixed mode) when one or more non-HT STAs are associated
1316 (currently non-GF HT station is considered as non-HT STA also)
1318 static int rtw_ht_operation_update(struct rtw_adapter
*padapter
)
1320 u16 cur_op_mode
, new_op_mode
;
1321 int op_mode_changes
= 0;
1322 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
1323 struct ht_priv
*phtpriv_ap
= &pmlmepriv
->htpriv
;
1325 if (pmlmepriv
->htpriv
.ht_option
)
1328 /* if (!iface->conf->ieee80211n || iface->conf->ht_op_mode_fixed) */
1331 DBG_8723A("%s current operation mode = 0x%X\n",
1332 __func__
, pmlmepriv
->ht_op_mode
);
1334 if (!(pmlmepriv
->ht_op_mode
& IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT
)
1335 && pmlmepriv
->num_sta_ht_no_gf
) {
1336 pmlmepriv
->ht_op_mode
|=
1337 IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT
;
1339 } else if ((pmlmepriv
->ht_op_mode
&
1340 IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT
) &&
1341 pmlmepriv
->num_sta_ht_no_gf
== 0) {
1342 pmlmepriv
->ht_op_mode
&=
1343 ~IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT
;
1347 if (!(pmlmepriv
->ht_op_mode
& IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT
) &&
1348 (pmlmepriv
->num_sta_no_ht
|| pmlmepriv
->olbc_ht
)) {
1349 pmlmepriv
->ht_op_mode
|= IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT
;
1351 } else if ((pmlmepriv
->ht_op_mode
&
1352 IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT
) &&
1353 (pmlmepriv
->num_sta_no_ht
== 0 && !pmlmepriv
->olbc_ht
)) {
1354 pmlmepriv
->ht_op_mode
&=
1355 ~IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT
;
1359 /* Note: currently we switch to the MIXED op mode if HT non-greenfield
1360 * station is associated. Probably it's a theoretical case, since
1361 * it looks like all known HT STAs support greenfield.
1363 if (pmlmepriv
->num_sta_no_ht
||
1364 (pmlmepriv
->ht_op_mode
& IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT
))
1365 new_op_mode
= IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED
;
1366 else if ((le16_to_cpu(phtpriv_ap
->ht_cap
.cap_info
) &
1367 IEEE80211_HT_CAP_SUP_WIDTH_20_40
) &&
1368 pmlmepriv
->num_sta_ht_20mhz
)
1369 new_op_mode
= IEEE80211_HT_OP_MODE_PROTECTION_20MHZ
;
1370 else if (pmlmepriv
->olbc_ht
)
1371 new_op_mode
= IEEE80211_HT_OP_MODE_PROTECTION_NONMEMBER
;
1373 new_op_mode
= IEEE80211_HT_OP_MODE_PROTECTION_NONE
;
1375 cur_op_mode
= pmlmepriv
->ht_op_mode
& IEEE80211_HT_OP_MODE_PROTECTION
;
1376 if (cur_op_mode
!= new_op_mode
) {
1377 pmlmepriv
->ht_op_mode
&= ~IEEE80211_HT_OP_MODE_PROTECTION
;
1378 pmlmepriv
->ht_op_mode
|= new_op_mode
;
1382 DBG_8723A("%s new operation mode = 0x%X changes =%d\n",
1383 __func__
, pmlmepriv
->ht_op_mode
, op_mode_changes
);
1385 return op_mode_changes
;
1388 void associated_clients_update23a(struct rtw_adapter
*padapter
, u8 updated
)
1390 /* update associated stations cap. */
1391 if (updated
== true)
1393 struct list_head
*phead
, *plist
, *ptmp
;
1394 struct sta_info
*psta
;
1395 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
1397 spin_lock_bh(&pstapriv
->asoc_list_lock
);
1399 phead
= &pstapriv
->asoc_list
;
1401 list_for_each_safe(plist
, ptmp
, phead
) {
1402 psta
= container_of(plist
, struct sta_info
, asoc_list
);
1404 VCS_update23a(padapter
, psta
);
1407 spin_unlock_bh(&pstapriv
->asoc_list_lock
);
1411 /* called > TSR LEVEL for USB or SDIO Interface*/
1412 void bss_cap_update_on_sta_join23a(struct rtw_adapter
*padapter
, struct sta_info
*psta
)
1414 u8 beacon_updated
= false;
1415 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
1416 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1418 if (!(psta
->flags
& WLAN_STA_SHORT_PREAMBLE
))
1420 if (!psta
->no_short_preamble_set
)
1422 psta
->no_short_preamble_set
= 1;
1424 pmlmepriv
->num_sta_no_short_preamble
++;
1426 if ((pmlmeext
->cur_wireless_mode
> WIRELESS_11B
) &&
1427 (pmlmepriv
->num_sta_no_short_preamble
== 1))
1429 beacon_updated
= true;
1430 update_beacon23a(padapter
, 0xFF, NULL
, true);
1437 if (psta
->no_short_preamble_set
)
1439 psta
->no_short_preamble_set
= 0;
1441 pmlmepriv
->num_sta_no_short_preamble
--;
1443 if ((pmlmeext
->cur_wireless_mode
> WIRELESS_11B
) &&
1444 (pmlmepriv
->num_sta_no_short_preamble
== 0))
1446 beacon_updated
= true;
1447 update_beacon23a(padapter
, 0xFF, NULL
, true);
1453 if (psta
->flags
& WLAN_STA_NONERP
)
1455 if (!psta
->nonerp_set
)
1457 psta
->nonerp_set
= 1;
1459 pmlmepriv
->num_sta_non_erp
++;
1461 if (pmlmepriv
->num_sta_non_erp
== 1)
1463 beacon_updated
= true;
1464 update_beacon23a(padapter
, WLAN_EID_ERP_INFO
, NULL
, true);
1471 if (psta
->nonerp_set
)
1473 psta
->nonerp_set
= 0;
1475 pmlmepriv
->num_sta_non_erp
--;
1477 if (pmlmepriv
->num_sta_non_erp
== 0)
1479 beacon_updated
= true;
1480 update_beacon23a(padapter
, WLAN_EID_ERP_INFO
, NULL
, true);
1486 if (!(psta
->capability
& WLAN_CAPABILITY_SHORT_SLOT_TIME
))
1488 if (!psta
->no_short_slot_time_set
)
1490 psta
->no_short_slot_time_set
= 1;
1492 pmlmepriv
->num_sta_no_short_slot_time
++;
1494 if ((pmlmeext
->cur_wireless_mode
> WIRELESS_11B
) &&
1495 (pmlmepriv
->num_sta_no_short_slot_time
== 1))
1497 beacon_updated
= true;
1498 update_beacon23a(padapter
, 0xFF, NULL
, true);
1505 if (psta
->no_short_slot_time_set
)
1507 psta
->no_short_slot_time_set
= 0;
1509 pmlmepriv
->num_sta_no_short_slot_time
--;
1511 if ((pmlmeext
->cur_wireless_mode
> WIRELESS_11B
) &&
1512 (pmlmepriv
->num_sta_no_short_slot_time
== 0))
1514 beacon_updated
= true;
1515 update_beacon23a(padapter
, 0xFF, NULL
, true);
1520 if (psta
->flags
& WLAN_STA_HT
)
1522 u16 ht_capab
= le16_to_cpu(psta
->htpriv
.ht_cap
.cap_info
);
1524 DBG_8723A("HT: STA " MAC_FMT
" HT Capabilities "
1525 "Info: 0x%04x\n", MAC_ARG(psta
->hwaddr
), ht_capab
);
1527 if (psta
->no_ht_set
) {
1528 psta
->no_ht_set
= 0;
1529 pmlmepriv
->num_sta_no_ht
--;
1532 if ((ht_capab
& IEEE80211_HT_CAP_GRN_FLD
) == 0) {
1533 if (!psta
->no_ht_gf_set
) {
1534 psta
->no_ht_gf_set
= 1;
1535 pmlmepriv
->num_sta_ht_no_gf
++;
1537 DBG_8723A("%s STA " MAC_FMT
" - no "
1538 "greenfield, num of non-gf stations %d\n",
1539 __func__
, MAC_ARG(psta
->hwaddr
),
1540 pmlmepriv
->num_sta_ht_no_gf
);
1543 if ((ht_capab
& IEEE80211_HT_CAP_SUP_WIDTH_20_40
) == 0) {
1544 if (!psta
->ht_20mhz_set
) {
1545 psta
->ht_20mhz_set
= 1;
1546 pmlmepriv
->num_sta_ht_20mhz
++;
1548 DBG_8723A("%s STA " MAC_FMT
" - 20 MHz HT, "
1549 "num of 20MHz HT STAs %d\n",
1550 __func__
, MAC_ARG(psta
->hwaddr
),
1551 pmlmepriv
->num_sta_ht_20mhz
);
1557 if (!psta
->no_ht_set
) {
1558 psta
->no_ht_set
= 1;
1559 pmlmepriv
->num_sta_no_ht
++;
1561 if (pmlmepriv
->htpriv
.ht_option
) {
1562 DBG_8723A("%s STA " MAC_FMT
1563 " - no HT, num of non-HT stations %d\n",
1564 __func__
, MAC_ARG(psta
->hwaddr
),
1565 pmlmepriv
->num_sta_no_ht
);
1569 if (rtw_ht_operation_update(padapter
) > 0)
1571 update_beacon23a(padapter
, WLAN_EID_HT_CAPABILITY
, NULL
, false);
1572 update_beacon23a(padapter
, WLAN_EID_HT_OPERATION
, NULL
, true);
1575 /* update associated stations cap. */
1576 associated_clients_update23a(padapter
, beacon_updated
);
1578 DBG_8723A("%s, updated =%d\n", __func__
, beacon_updated
);
1581 u8
bss_cap_update_on_sta_leave23a(struct rtw_adapter
*padapter
, struct sta_info
*psta
)
1583 u8 beacon_updated
= false;
1584 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
1585 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1588 return beacon_updated
;
1590 if (psta
->no_short_preamble_set
) {
1591 psta
->no_short_preamble_set
= 0;
1592 pmlmepriv
->num_sta_no_short_preamble
--;
1593 if (pmlmeext
->cur_wireless_mode
> WIRELESS_11B
1594 && pmlmepriv
->num_sta_no_short_preamble
== 0)
1596 beacon_updated
= true;
1597 update_beacon23a(padapter
, 0xFF, NULL
, true);
1601 if (psta
->nonerp_set
) {
1602 psta
->nonerp_set
= 0;
1603 pmlmepriv
->num_sta_non_erp
--;
1604 if (pmlmepriv
->num_sta_non_erp
== 0)
1606 beacon_updated
= true;
1607 update_beacon23a(padapter
, WLAN_EID_ERP_INFO
,
1612 if (psta
->no_short_slot_time_set
) {
1613 psta
->no_short_slot_time_set
= 0;
1614 pmlmepriv
->num_sta_no_short_slot_time
--;
1615 if (pmlmeext
->cur_wireless_mode
> WIRELESS_11B
1616 && pmlmepriv
->num_sta_no_short_slot_time
== 0)
1618 beacon_updated
= true;
1619 update_beacon23a(padapter
, 0xFF, NULL
, true);
1623 if (psta
->no_ht_gf_set
) {
1624 psta
->no_ht_gf_set
= 0;
1625 pmlmepriv
->num_sta_ht_no_gf
--;
1628 if (psta
->no_ht_set
) {
1629 psta
->no_ht_set
= 0;
1630 pmlmepriv
->num_sta_no_ht
--;
1633 if (psta
->ht_20mhz_set
) {
1634 psta
->ht_20mhz_set
= 0;
1635 pmlmepriv
->num_sta_ht_20mhz
--;
1638 if (rtw_ht_operation_update(padapter
) > 0)
1640 update_beacon23a(padapter
, WLAN_EID_HT_CAPABILITY
, NULL
, false);
1641 update_beacon23a(padapter
, WLAN_EID_HT_OPERATION
, NULL
, true);
1644 /* update associated stations cap. */
1646 DBG_8723A("%s, updated =%d\n", __func__
, beacon_updated
);
1648 return beacon_updated
;
1651 u8
ap_free_sta23a(struct rtw_adapter
*padapter
, struct sta_info
*psta
, bool active
, u16 reason
)
1653 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
1654 u8 beacon_updated
= false;
1657 return beacon_updated
;
1661 /* tear down Rx AMPDU */
1662 send_delba23a(padapter
, 0, psta
->hwaddr
);/* recipient */
1664 /* tear down TX AMPDU */
1665 send_delba23a(padapter
, 1, psta
->hwaddr
);/* originator */
1667 issue_deauth23a(padapter
, psta
->hwaddr
, reason
);
1670 psta
->htpriv
.agg_enable_bitmap
= 0x0;/* reset */
1671 psta
->htpriv
.candidate_tid_bitmap
= 0x0;/* reset */
1673 /* report_del_sta_event23a(padapter, psta->hwaddr, reason); */
1675 /* clear cam entry / key */
1676 /* clear_cam_entry23a(padapter, (psta->mac_id + 3)); */
1677 rtw_clearstakey_cmd23a(padapter
, (u8
*)psta
, (u8
)(psta
->mac_id
+ 3),
1680 spin_lock_bh(&psta
->lock
);
1681 psta
->state
&= ~_FW_LINKED
;
1682 spin_unlock_bh(&psta
->lock
);
1684 rtw_cfg80211_indicate_sta_disassoc(padapter
, psta
->hwaddr
, reason
);
1686 report_del_sta_event23a(padapter
, psta
->hwaddr
, reason
);
1688 beacon_updated
= bss_cap_update_on_sta_leave23a(padapter
, psta
);
1690 spin_lock_bh(&pstapriv
->sta_hash_lock
);
1691 rtw_free_stainfo23a(padapter
, psta
);
1692 spin_unlock_bh(&pstapriv
->sta_hash_lock
);
1694 return beacon_updated
;
1697 int rtw_ap_inform_ch_switch23a (struct rtw_adapter
*padapter
, u8 new_ch
, u8 ch_offset
)
1699 struct list_head
*phead
, *plist
;
1700 struct sta_info
*psta
= NULL
;
1701 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
1702 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1703 struct mlme_ext_info
*pmlmeinfo
= &pmlmeext
->mlmext_info
;
1704 u8 bc_addr
[ETH_ALEN
] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
1706 if ((pmlmeinfo
->state
&0x03) != MSR_AP
)
1709 DBG_8723A("%s(%s): with ch:%u, offset:%u\n", __func__
,
1710 padapter
->pnetdev
->name
, new_ch
, ch_offset
);
1712 spin_lock_bh(&pstapriv
->asoc_list_lock
);
1713 phead
= &pstapriv
->asoc_list
;
1715 list_for_each(plist
, phead
) {
1716 psta
= container_of(plist
, struct sta_info
, asoc_list
);
1718 issue_action_spct_ch_switch23a (padapter
, psta
->hwaddr
, new_ch
, ch_offset
);
1719 psta
->expire_to
= ((pstapriv
->expire_to
* 2) > 5) ? 5 : (pstapriv
->expire_to
* 2);
1721 spin_unlock_bh(&pstapriv
->asoc_list_lock
);
1723 issue_action_spct_ch_switch23a (padapter
, bc_addr
, new_ch
, ch_offset
);
1728 int rtw_sta_flush23a(struct rtw_adapter
*padapter
)
1730 struct list_head
*phead
, *plist
, *ptmp
;
1731 struct sta_info
*psta
;
1732 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
1733 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1734 struct mlme_ext_info
*pmlmeinfo
= &pmlmeext
->mlmext_info
;
1735 u8 bc_addr
[ETH_ALEN
] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
1736 u8 chk_alive_num
= 0;
1737 struct sta_info
*chk_alive_list
[NUM_STA
];
1740 DBG_8723A("%s(%s)\n", __func__
, padapter
->pnetdev
->name
);
1742 if ((pmlmeinfo
->state
&0x03) != MSR_AP
)
1745 spin_lock_bh(&pstapriv
->asoc_list_lock
);
1746 phead
= &pstapriv
->asoc_list
;
1748 list_for_each_safe(plist
, ptmp
, phead
) {
1749 psta
= container_of(plist
, struct sta_info
, asoc_list
);
1751 /* Remove sta from asoc_list */
1752 list_del_init(&psta
->asoc_list
);
1753 pstapriv
->asoc_list_cnt
--;
1755 /* Keep sta for ap_free_sta23a() beyond this asoc_list loop */
1756 chk_alive_list
[chk_alive_num
++] = psta
;
1758 spin_unlock_bh(&pstapriv
->asoc_list_lock
);
1760 /* For each sta in chk_alive_list, call ap_free_sta23a */
1761 for (i
= 0; i
< chk_alive_num
; i
++)
1762 ap_free_sta23a(padapter
, chk_alive_list
[i
], true,
1763 WLAN_REASON_DEAUTH_LEAVING
);
1765 issue_deauth23a(padapter
, bc_addr
, WLAN_REASON_DEAUTH_LEAVING
);
1767 associated_clients_update23a(padapter
, true);
1772 /* called > TSR LEVEL for USB or SDIO Interface*/
1773 void sta_info_update23a(struct rtw_adapter
*padapter
, struct sta_info
*psta
)
1775 int flags
= psta
->flags
;
1776 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
1778 /* update wmm cap. */
1779 if (WLAN_STA_WME
&flags
)
1780 psta
->qos_option
= 1;
1782 psta
->qos_option
= 0;
1784 if (pmlmepriv
->qos_option
== 0)
1785 psta
->qos_option
= 0;
1787 /* update 802.11n ht cap. */
1788 if (WLAN_STA_HT
&flags
)
1790 psta
->htpriv
.ht_option
= true;
1791 psta
->qos_option
= 1;
1795 psta
->htpriv
.ht_option
= false;
1798 if (!pmlmepriv
->htpriv
.ht_option
)
1799 psta
->htpriv
.ht_option
= false;
1801 update_sta_info23a_apmode23a(padapter
, psta
);
1804 /* called >= TSR LEVEL for USB or SDIO Interface*/
1805 void ap_sta_info_defer_update23a(struct rtw_adapter
*padapter
, struct sta_info
*psta
)
1807 if (psta
->state
& _FW_LINKED
)
1810 add_RATid23a(padapter
, psta
, 0);/* DM_RATR_STA_INIT */
1814 /* restore hw setting from sw data structures */
1815 void rtw_ap_restore_network(struct rtw_adapter
*padapter
)
1817 struct mlme_priv
*mlmepriv
= &padapter
->mlmepriv
;
1818 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1819 struct sta_priv
* pstapriv
= &padapter
->stapriv
;
1820 struct sta_info
*psta
;
1821 struct security_priv
*psecuritypriv
= &padapter
->securitypriv
;
1822 struct list_head
*phead
, *plist
, *ptmp
;
1823 u8 chk_alive_num
= 0;
1824 struct sta_info
*chk_alive_list
[NUM_STA
];
1827 rtw_setopmode_cmd23a(padapter
, NL80211_IFTYPE_AP
);
1829 set_channel_bwmode23a(padapter
, pmlmeext
->cur_channel
, pmlmeext
->cur_ch_offset
, pmlmeext
->cur_bwmode
);
1831 start_bss_network(padapter
, (u8
*)&mlmepriv
->cur_network
.network
);
1833 if (padapter
->securitypriv
.dot11PrivacyAlgrthm
==
1834 WLAN_CIPHER_SUITE_TKIP
||
1835 padapter
->securitypriv
.dot11PrivacyAlgrthm
==
1836 WLAN_CIPHER_SUITE_CCMP
) {
1837 /* restore group key, WEP keys is restored in ips_leave23a() */
1838 rtw_set_key23a(padapter
, psecuritypriv
,
1839 psecuritypriv
->dot118021XGrpKeyid
, 0);
1842 /* per sta pairwise key and settings */
1843 if (padapter
->securitypriv
.dot11PrivacyAlgrthm
!=
1844 WLAN_CIPHER_SUITE_TKIP
&&
1845 padapter
->securitypriv
.dot11PrivacyAlgrthm
!=
1846 WLAN_CIPHER_SUITE_CCMP
) {
1850 spin_lock_bh(&pstapriv
->asoc_list_lock
);
1852 phead
= &pstapriv
->asoc_list
;
1854 list_for_each_safe(plist
, ptmp
, phead
) {
1855 psta
= container_of(plist
, struct sta_info
, asoc_list
);
1857 chk_alive_list
[chk_alive_num
++] = psta
;
1860 spin_unlock_bh(&pstapriv
->asoc_list_lock
);
1862 for (i
= 0; i
< chk_alive_num
; i
++) {
1863 psta
= chk_alive_list
[i
];
1865 if (psta
->state
& _FW_LINKED
) {
1866 Update_RA_Entry23a(padapter
, psta
);
1868 rtw_setstakey_cmd23a(padapter
, (unsigned char *)psta
, true);
1873 void start_ap_mode23a(struct rtw_adapter
*padapter
)
1876 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
1877 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
1878 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1879 struct wlan_acl_pool
*pacl_list
= &pstapriv
->acl_list
;
1881 pmlmepriv
->update_bcn
= false;
1883 /* init_mlme_ap_info23a(padapter); */
1884 pmlmeext
->bstart_bss
= false;
1886 pmlmepriv
->num_sta_non_erp
= 0;
1888 pmlmepriv
->num_sta_no_short_slot_time
= 0;
1890 pmlmepriv
->num_sta_no_short_preamble
= 0;
1892 pmlmepriv
->num_sta_ht_no_gf
= 0;
1893 pmlmepriv
->num_sta_no_ht
= 0;
1894 pmlmepriv
->num_sta_ht_20mhz
= 0;
1896 pmlmepriv
->olbc
= false;
1898 pmlmepriv
->olbc_ht
= false;
1900 pmlmepriv
->ht_op_mode
= 0;
1902 for (i
= 0; i
< NUM_STA
; i
++)
1903 pstapriv
->sta_aid
[i
] = NULL
;
1906 INIT_LIST_HEAD(&pacl_list
->acl_node_q
.queue
);
1908 pacl_list
->mode
= 0;
1909 for (i
= 0; i
< NUM_ACL
; i
++) {
1910 INIT_LIST_HEAD(&pacl_list
->aclnode
[i
].list
);
1911 pacl_list
->aclnode
[i
].valid
= false;
1915 void stop_ap_mode23a(struct rtw_adapter
*padapter
)
1917 struct list_head
*phead
, *plist
, *ptmp
;
1918 struct rtw_wlan_acl_node
*paclnode
;
1919 struct sta_info
*psta
= NULL
;
1920 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
1921 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
1922 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1923 struct wlan_acl_pool
*pacl_list
= &pstapriv
->acl_list
;
1924 struct rtw_queue
*pacl_node_q
= &pacl_list
->acl_node_q
;
1926 pmlmepriv
->update_bcn
= false;
1927 pmlmeext
->bstart_bss
= false;
1929 /* reset and init security priv , this can refine with rtw_reset_securitypriv23a */
1930 memset((unsigned char *)&padapter
->securitypriv
, 0, sizeof (struct security_priv
));
1931 padapter
->securitypriv
.ndisauthtype
= Ndis802_11AuthModeOpen
;
1932 padapter
->securitypriv
.ndisencryptstatus
= Ndis802_11WEPDisabled
;
1935 spin_lock_bh(&pacl_node_q
->lock
);
1936 phead
= get_list_head(pacl_node_q
);
1938 list_for_each_safe(plist
, ptmp
, phead
) {
1939 paclnode
= container_of(plist
, struct rtw_wlan_acl_node
, list
);
1941 if (paclnode
->valid
== true) {
1942 paclnode
->valid
= false;
1944 list_del_init(&paclnode
->list
);
1949 spin_unlock_bh(&pacl_node_q
->lock
);
1951 DBG_8723A("%s, free acl_node_queue, num =%d\n", __func__
, pacl_list
->num
);
1953 rtw_sta_flush23a(padapter
);
1955 /* free_assoc_sta_resources */
1956 rtw_free_all_stainfo23a(padapter
);
1958 psta
= rtw_get_bcmc_stainfo23a(padapter
);
1959 spin_lock_bh(&pstapriv
->sta_hash_lock
);
1960 rtw_free_stainfo23a(padapter
, psta
);
1961 spin_unlock_bh(&pstapriv
->sta_hash_lock
);
1963 rtw_init_bcmc_stainfo23a(padapter
);
1965 rtw23a_free_mlme_priv_ie_data(pmlmepriv
);