diff options
Diffstat (limited to 'drivers/staging/rtl8723au/core/rtw_sta_mgt.c')
-rw-r--r-- | drivers/staging/rtl8723au/core/rtw_sta_mgt.c | 127 |
1 files changed, 30 insertions, 97 deletions
diff --git a/drivers/staging/rtl8723au/core/rtw_sta_mgt.c b/drivers/staging/rtl8723au/core/rtw_sta_mgt.c index 451b58f47287..14a82bea826f 100644 --- a/drivers/staging/rtl8723au/core/rtw_sta_mgt.c +++ b/drivers/staging/rtl8723au/core/rtw_sta_mgt.c @@ -20,8 +20,9 @@ #include <xmit_osdep.h> #include <mlme_osdep.h> #include <sta_info.h> +#include <rtl8723a_hal.h> -void _rtw_init_stainfo(struct sta_info *psta) +static void _rtw_init_stainfo(struct sta_info *psta) { memset((u8 *)psta, 0, sizeof (struct sta_info)); spin_lock_init(&psta->lock); @@ -48,31 +49,15 @@ void _rtw_init_stainfo(struct sta_info *psta) #endif /* CONFIG_8723AU_AP_MODE */ } -u32 _rtw_init_sta_priv23a(struct sta_priv *pstapriv) +int _rtw_init_sta_priv23a(struct sta_priv *pstapriv) { - struct sta_info *psta; - s32 i; - - pstapriv->pallocated_stainfo_buf = rtw_zvmalloc(sizeof(struct sta_info) * NUM_STA+ 4); - - if (!pstapriv->pallocated_stainfo_buf) - return _FAIL; + int i; - pstapriv->pstainfo_buf = pstapriv->pallocated_stainfo_buf + 4 - - ((unsigned long)(pstapriv->pallocated_stainfo_buf) & 3); - _rtw_init_queue23a(&pstapriv->free_sta_queue); spin_lock_init(&pstapriv->sta_hash_lock); pstapriv->asoc_sta_count = 0; - _rtw_init_queue23a(&pstapriv->sleep_q); - _rtw_init_queue23a(&pstapriv->wakeup_q); - psta = (struct sta_info *)(pstapriv->pstainfo_buf); - - for (i = 0; i < NUM_STA; i++) { - _rtw_init_stainfo(psta); + for (i = 0; i < NUM_STA; i++) INIT_LIST_HEAD(&pstapriv->sta_hash[i]); - list_add_tail(&psta->list, get_list_head(&pstapriv->free_sta_queue)); - psta++; - } + #ifdef CONFIG_8723AU_AP_MODE pstapriv->sta_dz_bitmap = 0; pstapriv->tim_bitmap = 0; @@ -92,49 +77,12 @@ u32 _rtw_init_sta_priv23a(struct sta_priv *pstapriv) return _SUCCESS; } -inline int rtw_stainfo_offset23a(struct sta_priv *stapriv, struct sta_info *sta) -{ - int offset = (((u8 *)sta) - stapriv->pstainfo_buf)/sizeof(struct sta_info); - - if (!stainfo_offset_valid(offset)) - DBG_8723A("%s invalid offset(%d), out of range!!!", __func__, offset); - return offset; -} - -inline struct sta_info *rtw_get_stainfo23a_by_offset23a(struct sta_priv *stapriv, int offset) -{ - if (!stainfo_offset_valid(offset)) - DBG_8723A("%s invalid offset(%d), out of range!!!", __func__, offset); - return (struct sta_info *)(stapriv->pstainfo_buf + offset * sizeof(struct sta_info)); -} - -/* this function is used to free the memory of lock || sema for all stainfos */ -void rtw_mfree_all_stainfo(struct sta_priv *pstapriv) -{ - struct list_head *plist, *phead; - struct sta_info *psta; - - spin_lock_bh(&pstapriv->sta_hash_lock); - - phead = get_list_head(&pstapriv->free_sta_queue); - - /* we really achieve a lot in this loop .... */ - list_for_each(plist, phead) - psta = container_of(plist, struct sta_info, list); - spin_unlock_bh(&pstapriv->sta_hash_lock); -} - -void rtw_mfree_sta_priv_lock(struct sta_priv *pstapriv) -{ - rtw_mfree_all_stainfo(pstapriv); /* be done before free sta_hash_lock */ -} - -u32 _rtw_free_sta_priv23a(struct sta_priv *pstapriv) +int _rtw_free_sta_priv23a(struct sta_priv *pstapriv) { struct list_head *phead, *plist, *ptmp; struct sta_info *psta; struct recv_reorder_ctrl *preorder_ctrl; - int index; + int index; if (pstapriv) { /* delete all reordering_ctrl_timer */ @@ -154,39 +102,25 @@ u32 _rtw_free_sta_priv23a(struct sta_priv *pstapriv) } spin_unlock_bh(&pstapriv->sta_hash_lock); /*===============================*/ - - rtw_mfree_sta_priv_lock(pstapriv); - - if (pstapriv->pallocated_stainfo_buf) - rtw_vmfree(pstapriv->pallocated_stainfo_buf, sizeof(struct sta_info)*NUM_STA+4); } return _SUCCESS; } -struct sta_info *rtw_alloc_stainfo23a(struct sta_priv *pstapriv, u8 *hwaddr) +struct sta_info * +rtw_alloc_stainfo23a(struct sta_priv *pstapriv, u8 *hwaddr, gfp_t gfp) { struct list_head *phash_list; struct sta_info *psta; - struct rtw_queue *pfree_sta_queue; struct recv_reorder_ctrl *preorder_ctrl; - uint tmp_aid; s32 index; int i = 0; u16 wRxSeqInitialValue = 0xffff; - pfree_sta_queue = &pstapriv->free_sta_queue; - - spin_lock_bh(&pstapriv->sta_hash_lock); - - if (_rtw_queue_empty23a(pfree_sta_queue)) { - spin_unlock_bh(&pstapriv->sta_hash_lock); + psta = kmalloc(sizeof(struct sta_info), gfp); + if (!psta) return NULL; - } - psta = container_of((&pfree_sta_queue->queue)->next, struct sta_info, list); - list_del_init(&psta->list); - - tmp_aid = psta->aid; + spin_lock_bh(&pstapriv->sta_hash_lock); _rtw_init_stainfo(psta); @@ -252,9 +186,8 @@ exit: } /* using pstapriv->sta_hash_lock to protect */ -u32 rtw_free_stainfo23a(struct rtw_adapter *padapter, struct sta_info *psta) +int rtw_free_stainfo23a(struct rtw_adapter *padapter, struct sta_info *psta) { - struct rtw_queue *pfree_sta_queue; struct recv_reorder_ctrl *preorder_ctrl; struct sta_xmit_priv *pstaxmitpriv; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; @@ -269,8 +202,6 @@ u32 rtw_free_stainfo23a(struct rtw_adapter *padapter, struct sta_info *psta) psta->state &= ~_FW_LINKED; spin_unlock_bh(&psta->lock); - pfree_sta_queue = &pstapriv->free_sta_queue; - pstaxmitpriv = &psta->sta_xmitpriv; spin_lock_bh(&pxmitpriv->lock); @@ -323,7 +254,6 @@ u32 rtw_free_stainfo23a(struct rtw_adapter *padapter, struct sta_info *psta) struct list_head *phead, *plist; struct recv_frame *prframe; struct rtw_queue *ppending_recvframe_queue; - struct rtw_queue *pfree_recv_queue = &padapter->recvpriv.free_recv_queue; preorder_ctrl = &psta->recvreorder_ctrl[i]; @@ -339,12 +269,12 @@ u32 rtw_free_stainfo23a(struct rtw_adapter *padapter, struct sta_info *psta) prframe = container_of(plist, struct recv_frame, list); plist = plist->next; list_del_init(&prframe->list); - rtw_free_recvframe23a(prframe, pfree_recv_queue); + rtw_free_recvframe23a(prframe); } spin_unlock_bh(&ppending_recvframe_queue->lock); } if (!(psta->state & WIFI_AP_STATE)) - rtw_hal_set_odm_var23a(padapter, HAL_ODM_STA_INFO, psta, false); + rtl8723a_SetHalODMVar(padapter, HAL_ODM_STA_INFO, psta, false); #ifdef CONFIG_8723AU_AP_MODE spin_lock_bh(&pstapriv->auth_list_lock); if (!list_empty(&psta->auth_list)) { @@ -374,7 +304,8 @@ u32 rtw_free_stainfo23a(struct rtw_adapter *padapter, struct sta_info *psta) psta->aid = 0; } #endif /* CONFIG_8723AU_AP_MODE */ - list_add_tail(&psta->list, get_list_head(pfree_sta_queue)); + + kfree(psta); exit: return _SUCCESS; } @@ -384,9 +315,11 @@ void rtw_free_all_stainfo23a(struct rtw_adapter *padapter) { struct list_head *plist, *phead, *ptmp; struct sta_info *psta; - struct sta_priv *pstapriv = &padapter->stapriv; + struct sta_priv *pstapriv = &padapter->stapriv; struct sta_info* pbcmc_stainfo = rtw_get_bcmc_stainfo23a(padapter); - s32 index; if (pstapriv->asoc_sta_count == 1) + s32 index; + + if (pstapriv->asoc_sta_count == 1) return; spin_lock_bh(&pstapriv->sta_hash_lock); @@ -405,12 +338,12 @@ void rtw_free_all_stainfo23a(struct rtw_adapter *padapter) } /* any station allocated can be searched by hash list */ -struct sta_info *rtw_get_stainfo23a(struct sta_priv *pstapriv, u8 *hwaddr) +struct sta_info *rtw_get_stainfo23a(struct sta_priv *pstapriv, const u8 *hwaddr) { struct list_head *plist, *phead; struct sta_info *psta = NULL; u32 index; - u8 *addr; + const u8 *addr; u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; if (hwaddr == NULL) @@ -440,15 +373,15 @@ struct sta_info *rtw_get_stainfo23a(struct sta_priv *pstapriv, u8 *hwaddr) return psta; } -u32 rtw_init_bcmc_stainfo23a(struct rtw_adapter* padapter) +int rtw_init_bcmc_stainfo23a(struct rtw_adapter* padapter) { struct sta_priv *pstapriv = &padapter->stapriv; struct sta_info *psta; struct tx_servq *ptxservq; - u32 res = _SUCCESS; + int res = _SUCCESS; unsigned char bcast_addr[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - psta = rtw_alloc_stainfo23a(pstapriv, bcast_addr); + psta = rtw_alloc_stainfo23a(pstapriv, bcast_addr, GFP_KERNEL); if (psta == NULL) { res = _FAIL; RT_TRACE(_module_rtl871x_sta_mgt_c_, _drv_err_, @@ -472,13 +405,13 @@ struct sta_info *rtw_get_bcmc_stainfo23a(struct rtw_adapter *padapter) return psta; } -u8 rtw_access_ctrl23a(struct rtw_adapter *padapter, u8 *mac_addr) +bool rtw_access_ctrl23a(struct rtw_adapter *padapter, u8 *mac_addr) { - u8 res = true; + bool res = true; #ifdef CONFIG_8723AU_AP_MODE struct list_head *plist, *phead; struct rtw_wlan_acl_node *paclnode; - u8 match = false; + bool match = false; struct sta_priv *pstapriv = &padapter->stapriv; struct wlan_acl_pool *pacl_list = &pstapriv->acl_list; struct rtw_queue *pacl_node_q = &pacl_list->acl_node_q; |