OSDN Git Service

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