net: wireless: rockchip_wlan: add rtl8188eu support
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8188eu / 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 u16 rtw_rtkm_get_buff_size(void)\r
20 {\r
21         return MAX_RTKM_RECVBUF_SZ;\r
22 }\r
23 EXPORT_SYMBOL(rtw_rtkm_get_buff_size);\r
24 \r
25 u8 rtw_rtkm_get_nr_recv_skb(void)\r
26 {\r
27         return MAX_RTKM_NR_PREALLOC_RECV_SKB;\r
28 }\r
29 EXPORT_SYMBOL(rtw_rtkm_get_nr_recv_skb);\r
30 \r
31 struct sk_buff *rtw_alloc_skb_premem(u16 in_size)\r
32 {\r
33         struct sk_buff *skb = NULL;\r
34 \r
35         if (in_size > MAX_RTKM_RECVBUF_SZ) {\r
36                 pr_info("warning %s: driver buffer size(%d) > rtkm buffer size(%d)\n", __func__, in_size, MAX_RTKM_RECVBUF_SZ);\r
37                 WARN_ON(1);\r
38                 return skb;\r
39         }\r
40 \r
41         skb = skb_dequeue(&rtk_skb_mem_q);\r
42 \r
43         printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));\r
44 \r
45         return skb;     \r
46 }\r
47 EXPORT_SYMBOL(rtw_alloc_skb_premem);\r
48 \r
49 int rtw_free_skb_premem(struct sk_buff *pskb)\r
50 {\r
51         if(!pskb)\r
52                 return -1;\r
53 \r
54         if (skb_queue_len(&rtk_skb_mem_q) >= MAX_RTKM_NR_PREALLOC_RECV_SKB)     \r
55                 return -1;\r
56         \r
57         skb_queue_tail(&rtk_skb_mem_q, pskb);\r
58         \r
59         printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));\r
60 \r
61         return 0;\r
62 }\r
63 EXPORT_SYMBOL(rtw_free_skb_premem);\r
64 \r
65 static int __init rtw_mem_init(void)\r
66 {\r
67         int i;\r
68         SIZE_PTR tmpaddr=0;\r
69         SIZE_PTR alignment=0;\r
70         struct sk_buff *pskb=NULL;\r
71 \r
72         printk("%s\n", __func__);\r
73         pr_info("MAX_RTKM_NR_PREALLOC_RECV_SKB: %d\n", MAX_RTKM_NR_PREALLOC_RECV_SKB);\r
74         pr_info("MAX_RTKM_RECVBUF_SZ: %d\n", MAX_RTKM_RECVBUF_SZ);\r
75 \r
76 #ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX\r
77         for(i=0; i<NR_RECVBUFF; i++)\r\r
78         {\r\r
79                 rtk_buf_mem[i] = usb_buffer_alloc(dev, size, (in_interrupt() ? GFP_ATOMIC : GFP_KERNEL), dma);\r
80         }\r
81 #endif //CONFIG_USE_USB_BUFFER_ALLOC_RX\r
82 \r
83         skb_queue_head_init(&rtk_skb_mem_q);\r
84 \r
85         for(i=0; i<MAX_RTKM_NR_PREALLOC_RECV_SKB; i++)\r
86         {\r
87                 pskb = __dev_alloc_skb(MAX_RTKM_RECVBUF_SZ + RECVBUFF_ALIGN_SZ, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);\r
88                 if(pskb)\r
89                 {               \r
90                         tmpaddr = (SIZE_PTR)pskb->data;\r
91                         alignment = tmpaddr & (RECVBUFF_ALIGN_SZ-1);\r
92                         skb_reserve(pskb, (RECVBUFF_ALIGN_SZ - alignment));\r
93 \r
94                         skb_queue_tail(&rtk_skb_mem_q, pskb);\r
95                 }\r
96                 else\r
97                 {\r
98                         printk("%s, alloc skb memory fail!\n", __func__);\r
99                 }\r
100 \r
101                 pskb=NULL;\r
102         }\r
103 \r
104         printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));\r
105 \r
106         return 0;\r
107         \r
108 }\r
109 \r
110 static void __exit rtw_mem_exit(void)\r
111 {\r
112         if (skb_queue_len(&rtk_skb_mem_q)) {\r
113                 printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));\r
114         }\r
115 \r
116         skb_queue_purge(&rtk_skb_mem_q);\r
117 \r
118         printk("%s\n", __func__);\r
119 }\r
120 \r
121 module_init(rtw_mem_init);\r
122 module_exit(rtw_mem_exit);\r