Commit | Line | Data |
---|---|---|
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 | * | |
7bc88639 LF |
14 | ******************************************************************************/ |
15 | #define _RTL8188EU_RECV_C_ | |
bc83c4cf | 16 | #include <linux/kmemleak.h> |
7bc88639 LF |
17 | #include <osdep_service.h> |
18 | #include <drv_types.h> | |
19 | #include <recv_osdep.h> | |
20 | #include <mlme_osdep.h> | |
7bc88639 | 21 | |
17452ee9 | 22 | #include <usb_ops_linux.h> |
7bc88639 LF |
23 | #include <wifi.h> |
24 | ||
25 | #include <rtl8188e_hal.h> | |
26 | ||
286fe9b3 | 27 | int rtw_hal_init_recv_priv(struct adapter *padapter) |
7bc88639 LF |
28 | { |
29 | struct recv_priv *precvpriv = &padapter->recvpriv; | |
30 | int i, res = _SUCCESS; | |
31 | struct recv_buf *precvbuf; | |
32 | ||
33 | tasklet_init(&precvpriv->recv_tasklet, | |
34 | (void(*)(unsigned long))rtl8188eu_recv_tasklet, | |
35 | (unsigned long)padapter); | |
36 | ||
37 | /* init recv_buf */ | |
38 | _rtw_init_queue(&precvpriv->free_recv_buf_queue); | |
39 | ||
94b6a662 | 40 | precvpriv->precv_buf = |
7f399026 | 41 | kcalloc(NR_RECVBUFF, sizeof(struct recv_buf), GFP_KERNEL); |
94b6a662 | 42 | if (!precvpriv->precv_buf) { |
7bc88639 | 43 | res = _FAIL; |
66ed681a AR |
44 | RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, |
45 | ("alloc recv_buf fail!\n")); | |
7bc88639 LF |
46 | goto exit; |
47 | } | |
63764c7f | 48 | precvbuf = precvpriv->precv_buf; |
7bc88639 LF |
49 | |
50 | for (i = 0; i < NR_RECVBUFF; i++) { | |
7bc88639 LF |
51 | res = rtw_os_recvbuf_resource_alloc(padapter, precvbuf); |
52 | if (res == _FAIL) | |
53 | break; | |
7bc88639 LF |
54 | precvbuf->adapter = padapter; |
55 | precvbuf++; | |
56 | } | |
7bc88639 LF |
57 | skb_queue_head_init(&precvpriv->rx_skb_queue); |
58 | { | |
59 | int i; | |
7bc88639 LF |
60 | struct sk_buff *pskb = NULL; |
61 | ||
62 | skb_queue_head_init(&precvpriv->free_recv_skb_queue); | |
63 | ||
64 | for (i = 0; i < NR_PREALLOC_RECV_SKB; i++) { | |
66ed681a | 65 | pskb = __netdev_alloc_skb(padapter->pnetdev, |
49cb9d47 | 66 | MAX_RECVBUF_SZ, GFP_KERNEL); |
7bc88639 | 67 | if (pskb) { |
bc83c4cf | 68 | kmemleak_not_leak(pskb); |
66ed681a AR |
69 | skb_queue_tail(&precvpriv->free_recv_skb_queue, |
70 | pskb); | |
7bc88639 LF |
71 | } |
72 | pskb = NULL; | |
73 | } | |
74 | } | |
75 | exit: | |
76 | return res; | |
77 | } | |
78 | ||
67f7ada8 | 79 | void rtw_hal_free_recv_priv(struct adapter *padapter) |
7bc88639 LF |
80 | { |
81 | int i; | |
82 | struct recv_buf *precvbuf; | |
83 | struct recv_priv *precvpriv = &padapter->recvpriv; | |
84 | ||
63764c7f | 85 | precvbuf = precvpriv->precv_buf; |
7bc88639 LF |
86 | |
87 | for (i = 0; i < NR_RECVBUFF; i++) { | |
cba1ce62 | 88 | usb_free_urb(precvbuf->purb); |
7bc88639 LF |
89 | precvbuf++; |
90 | } | |
91 | ||
94b6a662 | 92 | kfree(precvpriv->precv_buf); |
7bc88639 LF |
93 | |
94 | if (skb_queue_len(&precvpriv->rx_skb_queue)) | |
95 | DBG_88E(KERN_WARNING "rx_skb_queue not empty\n"); | |
96 | skb_queue_purge(&precvpriv->rx_skb_queue); | |
97 | ||
98 | ||
99 | if (skb_queue_len(&precvpriv->free_recv_skb_queue)) | |
66ed681a AR |
100 | DBG_88E(KERN_WARNING "free_recv_skb_queue not empty, %d\n", |
101 | skb_queue_len(&precvpriv->free_recv_skb_queue)); | |
7bc88639 LF |
102 | |
103 | skb_queue_purge(&precvpriv->free_recv_skb_queue); | |
104 | } |