staging: rtl8723au: rtw_sta_mgt: change rtw_alloc_stainfo23a to use gfp_t instead...
[cascardo/linux.git] / drivers / staging / rtl8723au / core / rtw_sta_mgt.c
index 451b58f..b829c2e 100644 (file)
@@ -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 = (struct sta_info *)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;