staging: rtl8188eu: Remove function rtw_hostapd_mlme_rx()
[linux-2.6-block.git] / drivers / staging / rtl8188eu / hal / rtl8188eu_recv.c
CommitLineData
7bc88639
LF
1/******************************************************************************
2 *
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
4 *
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.
8 *
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
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 *
19 ******************************************************************************/
20#define _RTL8188EU_RECV_C_
21#include <osdep_service.h>
22#include <drv_types.h>
23#include <recv_osdep.h>
24#include <mlme_osdep.h>
7bc88639
LF
25
26#include <usb_ops.h>
27#include <wifi.h>
28
29#include <rtl8188e_hal.h>
30
7bc88639
LF
31int rtl8188eu_init_recv_priv(struct adapter *padapter)
32{
33 struct recv_priv *precvpriv = &padapter->recvpriv;
34 int i, res = _SUCCESS;
35 struct recv_buf *precvbuf;
36
37 tasklet_init(&precvpriv->recv_tasklet,
38 (void(*)(unsigned long))rtl8188eu_recv_tasklet,
39 (unsigned long)padapter);
40
41 /* init recv_buf */
42 _rtw_init_queue(&precvpriv->free_recv_buf_queue);
43
44 precvpriv->pallocated_recv_buf = rtw_zmalloc(NR_RECVBUFF * sizeof(struct recv_buf) + 4);
45 if (precvpriv->pallocated_recv_buf == NULL) {
46 res = _FAIL;
47 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, ("alloc recv_buf fail!\n"));
48 goto exit;
49 }
50 _rtw_memset(precvpriv->pallocated_recv_buf, 0, NR_RECVBUFF * sizeof(struct recv_buf) + 4);
51
52 precvpriv->precv_buf = (u8 *)N_BYTE_ALIGMENT((size_t)(precvpriv->pallocated_recv_buf), 4);
53
54
55 precvbuf = (struct recv_buf *)precvpriv->precv_buf;
56
57 for (i = 0; i < NR_RECVBUFF; i++) {
7bc88639
LF
58 res = rtw_os_recvbuf_resource_alloc(padapter, precvbuf);
59 if (res == _FAIL)
60 break;
7bc88639
LF
61 precvbuf->adapter = padapter;
62 precvbuf++;
63 }
64 precvpriv->free_recv_buf_queue_cnt = NR_RECVBUFF;
65 skb_queue_head_init(&precvpriv->rx_skb_queue);
66 {
67 int i;
68 size_t tmpaddr = 0;
69 size_t alignment = 0;
70 struct sk_buff *pskb = NULL;
71
72 skb_queue_head_init(&precvpriv->free_recv_skb_queue);
73
74 for (i = 0; i < NR_PREALLOC_RECV_SKB; i++) {
75 pskb = __netdev_alloc_skb(padapter->pnetdev, MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ, GFP_KERNEL);
76 if (pskb) {
77 pskb->dev = padapter->pnetdev;
78 tmpaddr = (size_t)pskb->data;
79 alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1);
80 skb_reserve(pskb, (RECVBUFF_ALIGN_SZ - alignment));
81
82 skb_queue_tail(&precvpriv->free_recv_skb_queue, pskb);
83 }
84 pskb = NULL;
85 }
86 }
87exit:
88 return res;
89}
90
91void rtl8188eu_free_recv_priv(struct adapter *padapter)
92{
93 int i;
94 struct recv_buf *precvbuf;
95 struct recv_priv *precvpriv = &padapter->recvpriv;
96
97 precvbuf = (struct recv_buf *)precvpriv->precv_buf;
98
99 for (i = 0; i < NR_RECVBUFF; i++) {
100 rtw_os_recvbuf_resource_free(padapter, precvbuf);
101 precvbuf++;
102 }
103
104 kfree(precvpriv->pallocated_recv_buf);
105
106 if (skb_queue_len(&precvpriv->rx_skb_queue))
107 DBG_88E(KERN_WARNING "rx_skb_queue not empty\n");
108 skb_queue_purge(&precvpriv->rx_skb_queue);
109
110
111 if (skb_queue_len(&precvpriv->free_recv_skb_queue))
112 DBG_88E(KERN_WARNING "free_recv_skb_queue not empty, %d\n", skb_queue_len(&precvpriv->free_recv_skb_queue));
113
114 skb_queue_purge(&precvpriv->free_recv_skb_queue);
115}