staging: rtl8723au: Use kernel memory allocator for sta_priv allocations

The kernel has a great memory allocator, use it instead of hacking up
something in the driver.

Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Jes Sorensen 2014-05-09 15:03:48 +02:00 committed by Greg Kroah-Hartman
parent 6964213a94
commit 2ad7c3d940
2 changed files with 11 additions and 64 deletions

View file

@ -50,29 +50,15 @@ static void _rtw_init_stainfo(struct sta_info *psta)
u32 _rtw_init_sta_priv23a(struct sta_priv *pstapriv) u32 _rtw_init_sta_priv23a(struct sta_priv *pstapriv)
{ {
struct sta_info *psta; int i;
s32 i;
pstapriv->pallocated_stainfo_buf = rtw_zvmalloc(sizeof(struct sta_info) * NUM_STA+ 4);
if (!pstapriv->pallocated_stainfo_buf)
return _FAIL;
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); spin_lock_init(&pstapriv->sta_hash_lock);
pstapriv->asoc_sta_count = 0; pstapriv->asoc_sta_count = 0;
_rtw_init_queue23a(&pstapriv->sleep_q); _rtw_init_queue23a(&pstapriv->sleep_q);
_rtw_init_queue23a(&pstapriv->wakeup_q); _rtw_init_queue23a(&pstapriv->wakeup_q);
psta = (struct sta_info *)(pstapriv->pstainfo_buf); for (i = 0; i < NUM_STA; i++)
for (i = 0; i < NUM_STA; i++) {
_rtw_init_stainfo(psta);
INIT_LIST_HEAD(&pstapriv->sta_hash[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 #ifdef CONFIG_8723AU_AP_MODE
pstapriv->sta_dz_bitmap = 0; pstapriv->sta_dz_bitmap = 0;
pstapriv->tim_bitmap = 0; pstapriv->tim_bitmap = 0;
@ -92,27 +78,6 @@ u32 _rtw_init_sta_priv23a(struct sta_priv *pstapriv)
return _SUCCESS; return _SUCCESS;
} }
/* this function is used to free the memory of lock || sema for all stainfos */
static 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);
}
static 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) u32 _rtw_free_sta_priv23a(struct sta_priv *pstapriv)
{ {
struct list_head *phead, *plist, *ptmp; struct list_head *phead, *plist, *ptmp;
@ -138,11 +103,6 @@ u32 _rtw_free_sta_priv23a(struct sta_priv *pstapriv)
} }
spin_unlock_bh(&pstapriv->sta_hash_lock); 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; return _SUCCESS;
} }
@ -151,24 +111,17 @@ struct sta_info *rtw_alloc_stainfo23a(struct sta_priv *pstapriv, u8 *hwaddr)
{ {
struct list_head *phash_list; struct list_head *phash_list;
struct sta_info *psta; struct sta_info *psta;
struct rtw_queue *pfree_sta_queue;
struct recv_reorder_ctrl *preorder_ctrl; struct recv_reorder_ctrl *preorder_ctrl;
s32 index; s32 index;
int i = 0; int i = 0;
u16 wRxSeqInitialValue = 0xffff; u16 wRxSeqInitialValue = 0xffff;
pfree_sta_queue = &pstapriv->free_sta_queue; psta = (struct sta_info *)kmalloc(sizeof(struct sta_info), GFP_ATOMIC);
if (!psta)
return NULL;
spin_lock_bh(&pstapriv->sta_hash_lock); spin_lock_bh(&pstapriv->sta_hash_lock);
if (_rtw_queue_empty23a(pfree_sta_queue)) {
spin_unlock_bh(&pstapriv->sta_hash_lock);
return NULL;
}
psta = container_of((&pfree_sta_queue->queue)->next, struct sta_info, list);
list_del_init(&psta->list);
_rtw_init_stainfo(psta); _rtw_init_stainfo(psta);
psta->padapter = pstapriv->padapter; psta->padapter = pstapriv->padapter;
@ -233,9 +186,8 @@ exit:
} }
/* using pstapriv->sta_hash_lock to protect */ /* using pstapriv->sta_hash_lock to protect */
u32 rtw_free_stainfo23a(struct rtw_adapter *padapter, struct sta_info *psta) u32 rtw_free_stainfo23a(struct rtw_adapter *padapter, struct sta_info *psta)
{ {
struct rtw_queue *pfree_sta_queue;
struct recv_reorder_ctrl *preorder_ctrl; struct recv_reorder_ctrl *preorder_ctrl;
struct sta_xmit_priv *pstaxmitpriv; struct sta_xmit_priv *pstaxmitpriv;
struct xmit_priv *pxmitpriv = &padapter->xmitpriv; struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
@ -250,8 +202,6 @@ u32 rtw_free_stainfo23a(struct rtw_adapter *padapter, struct sta_info *psta)
psta->state &= ~_FW_LINKED; psta->state &= ~_FW_LINKED;
spin_unlock_bh(&psta->lock); spin_unlock_bh(&psta->lock);
pfree_sta_queue = &pstapriv->free_sta_queue;
pstaxmitpriv = &psta->sta_xmitpriv; pstaxmitpriv = &psta->sta_xmitpriv;
spin_lock_bh(&pxmitpriv->lock); spin_lock_bh(&pxmitpriv->lock);
@ -355,7 +305,8 @@ u32 rtw_free_stainfo23a(struct rtw_adapter *padapter, struct sta_info *psta)
psta->aid = 0; psta->aid = 0;
} }
#endif /* CONFIG_8723AU_AP_MODE */ #endif /* CONFIG_8723AU_AP_MODE */
list_add_tail(&psta->list, get_list_head(pfree_sta_queue));
kfree(psta);
exit: exit:
return _SUCCESS; return _SUCCESS;
} }

View file

@ -310,13 +310,9 @@ struct sta_info {
#define STA_PKTS_FMT "(m:%llu, c:%llu, d:%llu)" #define STA_PKTS_FMT "(m:%llu, c:%llu, d:%llu)"
struct sta_priv { struct sta_priv {
u8 *pallocated_stainfo_buf;
u8 *pstainfo_buf;
struct rtw_queue free_sta_queue;
spinlock_t sta_hash_lock; spinlock_t sta_hash_lock;
struct list_head sta_hash[NUM_STA]; struct list_head sta_hash[NUM_STA];
int asoc_sta_count; int asoc_sta_count;
struct rtw_queue sleep_q; struct rtw_queue sleep_q;
struct rtw_queue wakeup_q; struct rtw_queue wakeup_q;