8723BU: Update 8723BU wifi driver to version v4.3.16_14189.20150519_BTCOEX2015119...
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723bu / core / rtw_mem.c
1 \r
2 #include <drv_types.h>\r
3 #include <rtw_mem.h>\r
4 \r
5 MODULE_LICENSE("GPL");\r
6 MODULE_DESCRIPTION("Realtek Wireless Lan Driver");\r
7 MODULE_AUTHOR("Realtek Semiconductor Corp.");\r
8 MODULE_VERSION("DRIVERVERSION");\r
9 \r
10 struct sk_buff_head rtk_skb_mem_q;\r
11 struct u8* rtk_buf_mem[NR_RECVBUFF];\r
12 \r
13 struct u8       * rtw_get_buf_premem(int index)\r
14 {\r
15         printk("%s, rtk_buf_mem index : %d\n", __func__, index);\r
16         return rtk_buf_mem[index];\r
17 }\r
18 \r
19 struct sk_buff *rtw_alloc_skb_premem(void)\r
20 {\r
21         struct sk_buff *skb = NULL;\r
22 \r
23         skb = skb_dequeue(&rtk_skb_mem_q);\r
24 \r
25         printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));\r
26 \r
27         return skb;     \r
28 }\r
29 EXPORT_SYMBOL(rtw_alloc_skb_premem);\r
30 \r
31 int rtw_free_skb_premem(struct sk_buff *pskb)\r
32 {\r
33         if(!pskb)\r
34                 return -1;\r
35 \r
36         if(skb_queue_len(&rtk_skb_mem_q) >= NR_PREALLOC_RECV_SKB)       \r
37                 return -1;\r
38         \r
39         skb_queue_tail(&rtk_skb_mem_q, pskb);\r
40         \r
41         printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));\r
42 \r
43         return 0;\r
44 }\r
45 EXPORT_SYMBOL(rtw_free_skb_premem);\r
46 \r
47 static int __init rtw_mem_init(void)\r
48 {\r
49         int i;\r
50         SIZE_PTR tmpaddr=0;\r
51         SIZE_PTR alignment=0;\r
52         struct sk_buff *pskb=NULL;\r
53 \r
54         printk("%s\n", __func__);\r
55         pr_info("NR_PREALLOC_RECV_SKB: %d\n", NR_PREALLOC_RECV_SKB);\r
56         pr_info("MAX_RECVBUF_SZ: %d\n", MAX_RECVBUF_SZ);\r
57 \r
58 #ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX\r
59         for(i=0; i<NR_RECVBUFF; i++)\r\r
60         {\r\r
61                 rtk_buf_mem[i] = usb_buffer_alloc(dev, size, (in_interrupt() ? GFP_ATOMIC : GFP_KERNEL), dma);\r
62         }\r
63 #endif //CONFIG_USE_USB_BUFFER_ALLOC_RX\r
64 \r
65         skb_queue_head_init(&rtk_skb_mem_q);\r
66 \r
67         for(i=0; i<NR_PREALLOC_RECV_SKB; i++)\r
68         {\r
69                 pskb = __dev_alloc_skb(MAX_RECVBUF_SZ + RECVBUFF_ALIGN_SZ, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);\r
70                 if(pskb)\r
71                 {               \r
72                         tmpaddr = (SIZE_PTR)pskb->data;\r
73                         alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1);\r
74                         skb_reserve(pskb, (RECVBUFF_ALIGN_SZ - alignment));\r
75 \r
76                         skb_queue_tail(&rtk_skb_mem_q, pskb);\r
77                 }\r
78                 else\r
79                 {\r
80                         printk("%s, alloc skb memory fail!\n", __func__);\r
81                 }\r
82 \r
83                 pskb=NULL;\r
84         }\r
85 \r
86         printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));\r
87 \r
88         return 0;\r
89         \r
90 }\r
91 \r
92 static void __exit rtw_mem_exit(void)\r
93 {\r
94         if (skb_queue_len(&rtk_skb_mem_q)) {\r
95                 printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));\r
96         }\r
97 \r
98         skb_queue_purge(&rtk_skb_mem_q);\r
99 \r
100         printk("%s\n", __func__);\r
101 }\r
102 \r
103 module_init(rtw_mem_init);\r
104 module_exit(rtw_mem_exit);\r
105 \r