Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nu11secur1ty
GitHub Repository: nu11secur1ty/Kali-Linux
Path: blob/master/ALFA-W1F1/RTL8814AU/core/rtw_mem.c
1307 views
1
/******************************************************************************
2
*
3
* Copyright(c) 2016 - 2017 Realtek Corporation.
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
*****************************************************************************/
15
16
#include <drv_types.h>
17
#include <rtw_mem.h>
18
19
MODULE_LICENSE("GPL");
20
MODULE_DESCRIPTION("Realtek Wireless Lan Driver");
21
MODULE_AUTHOR("Realtek Semiconductor Corp.");
22
MODULE_VERSION("DRIVERVERSION");
23
24
struct sk_buff_head rtk_skb_mem_q;
25
struct u8 *rtk_buf_mem[NR_RECVBUFF];
26
27
struct u8 *rtw_get_buf_premem(int index)
28
{
29
printk("%s, rtk_buf_mem index : %d\n", __func__, index);
30
return rtk_buf_mem[index];
31
}
32
33
u16 rtw_rtkm_get_buff_size(void)
34
{
35
return MAX_RTKM_RECVBUF_SZ;
36
}
37
EXPORT_SYMBOL(rtw_rtkm_get_buff_size);
38
39
u8 rtw_rtkm_get_nr_recv_skb(void)
40
{
41
return MAX_RTKM_NR_PREALLOC_RECV_SKB;
42
}
43
EXPORT_SYMBOL(rtw_rtkm_get_nr_recv_skb);
44
45
struct sk_buff *rtw_alloc_skb_premem(u16 in_size)
46
{
47
struct sk_buff *skb = NULL;
48
49
if (in_size > MAX_RTKM_RECVBUF_SZ) {
50
pr_info("warning %s: driver buffer size(%d) > rtkm buffer size(%d)\n", __func__, in_size, MAX_RTKM_RECVBUF_SZ);
51
WARN_ON(1);
52
return skb;
53
}
54
55
skb = skb_dequeue(&rtk_skb_mem_q);
56
57
printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));
58
59
return skb;
60
}
61
EXPORT_SYMBOL(rtw_alloc_skb_premem);
62
63
int rtw_free_skb_premem(struct sk_buff *pskb)
64
{
65
if (!pskb)
66
return -1;
67
68
if (skb_queue_len(&rtk_skb_mem_q) >= MAX_RTKM_NR_PREALLOC_RECV_SKB)
69
return -1;
70
71
skb_queue_tail(&rtk_skb_mem_q, pskb);
72
73
printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));
74
75
return 0;
76
}
77
EXPORT_SYMBOL(rtw_free_skb_premem);
78
79
static int __init rtw_mem_init(void)
80
{
81
int i;
82
SIZE_PTR tmpaddr = 0;
83
SIZE_PTR alignment = 0;
84
struct sk_buff *pskb = NULL;
85
86
printk("%s\n", __func__);
87
pr_info("MAX_RTKM_NR_PREALLOC_RECV_SKB: %d\n", MAX_RTKM_NR_PREALLOC_RECV_SKB);
88
pr_info("MAX_RTKM_RECVBUF_SZ: %d\n", MAX_RTKM_RECVBUF_SZ);
89
90
#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
91
for (i = 0; i < NR_RECVBUFF; i++)
92
rtk_buf_mem[i] = usb_buffer_alloc(dev, size, (in_interrupt() ? GFP_ATOMIC : GFP_KERNEL), dma);
93
#endif /* CONFIG_USE_USB_BUFFER_ALLOC_RX */
94
95
skb_queue_head_init(&rtk_skb_mem_q);
96
97
for (i = 0; i < MAX_RTKM_NR_PREALLOC_RECV_SKB; i++) {
98
pskb = __dev_alloc_skb(MAX_RTKM_RECVBUF_SZ + RECVBUFF_ALIGN_SZ, in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
99
if (pskb) {
100
tmpaddr = (SIZE_PTR)pskb->data;
101
alignment = tmpaddr & (RECVBUFF_ALIGN_SZ - 1);
102
skb_reserve(pskb, (RECVBUFF_ALIGN_SZ - alignment));
103
104
skb_queue_tail(&rtk_skb_mem_q, pskb);
105
} else
106
printk("%s, alloc skb memory fail!\n", __func__);
107
108
pskb = NULL;
109
}
110
111
printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));
112
113
return 0;
114
115
}
116
117
static void __exit rtw_mem_exit(void)
118
{
119
if (skb_queue_len(&rtk_skb_mem_q))
120
printk("%s, rtk_skb_mem_q len : %d\n", __func__, skb_queue_len(&rtk_skb_mem_q));
121
122
skb_queue_purge(&rtk_skb_mem_q);
123
124
printk("%s\n", __func__);
125
}
126
127
module_init(rtw_mem_init);
128
module_exit(rtw_mem_exit);
129
130