1*4882a593Smuzhiyun #include <linux/module.h>
2*4882a593Smuzhiyun #include <linux/kernel.h>
3*4882a593Smuzhiyun #include <linux/init.h>
4*4882a593Smuzhiyun #include <linux/platform_device.h>
5*4882a593Smuzhiyun #include <linux/delay.h>
6*4882a593Smuzhiyun #include <linux/err.h>
7*4882a593Smuzhiyun #include <linux/skbuff.h>
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #define DHD_STATIC_VERSION_STR "101.10.361.25 (wlan=r892223-20220928-2)"
10*4882a593Smuzhiyun #define STATIC_ERROR_LEVEL BIT(0)
11*4882a593Smuzhiyun #define STATIC_TRACE_LEVEL BIT(1)
12*4882a593Smuzhiyun #define STATIC_MSG_LEVEL BIT(0)
13*4882a593Smuzhiyun uint static_msg_level = STATIC_ERROR_LEVEL | STATIC_MSG_LEVEL;
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun #define DHD_STATIC_MSG(x, args...) \
16*4882a593Smuzhiyun do { \
17*4882a593Smuzhiyun if (static_msg_level & STATIC_MSG_LEVEL) { \
18*4882a593Smuzhiyun pr_err("[dhd] STATIC-MSG) %s : " x, __func__, ## args); \
19*4882a593Smuzhiyun } \
20*4882a593Smuzhiyun } while (0)
21*4882a593Smuzhiyun #define DHD_STATIC_ERROR(x, args...) \
22*4882a593Smuzhiyun do { \
23*4882a593Smuzhiyun if (static_msg_level & STATIC_ERROR_LEVEL) { \
24*4882a593Smuzhiyun pr_err("[dhd] STATIC-ERROR) %s : " x, __func__, ## args); \
25*4882a593Smuzhiyun } \
26*4882a593Smuzhiyun } while (0)
27*4882a593Smuzhiyun #define DHD_STATIC_TRACE(x, args...) \
28*4882a593Smuzhiyun do { \
29*4882a593Smuzhiyun if (static_msg_level & STATIC_TRACE_LEVEL) { \
30*4882a593Smuzhiyun pr_err("[dhd] STATIC-TRACE) %s : " x, __func__, ## args); \
31*4882a593Smuzhiyun } \
32*4882a593Smuzhiyun } while (0)
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun #define BCMDHD_SDIO
35*4882a593Smuzhiyun #define BCMDHD_PCIE
36*4882a593Smuzhiyun //#define BCMDHD_USB
37*4882a593Smuzhiyun #define CONFIG_BCMDHD_VTS { : = y}
38*4882a593Smuzhiyun #define CONFIG_BCMDHD_DEBUG { : = y}
39*4882a593Smuzhiyun //#define BCMDHD_UNUSE_MEM
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun #ifndef MAX_NUM_ADAPTERS
42*4882a593Smuzhiyun #define MAX_NUM_ADAPTERS 1
43*4882a593Smuzhiyun #endif
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun enum dhd_prealloc_index {
46*4882a593Smuzhiyun DHD_PREALLOC_PROT = 0,
47*4882a593Smuzhiyun #if defined(BCMDHD_SDIO)
48*4882a593Smuzhiyun DHD_PREALLOC_RXBUF = 1,
49*4882a593Smuzhiyun DHD_PREALLOC_DATABUF = 2,
50*4882a593Smuzhiyun #endif /* BCMDHD_SDIO */
51*4882a593Smuzhiyun DHD_PREALLOC_OSL_BUF = 3,
52*4882a593Smuzhiyun DHD_PREALLOC_SKB_BUF = 4,
53*4882a593Smuzhiyun DHD_PREALLOC_WIPHY_ESCAN0 = 5,
54*4882a593Smuzhiyun DHD_PREALLOC_WIPHY_ESCAN1 = 6,
55*4882a593Smuzhiyun DHD_PREALLOC_DHD_INFO = 7,
56*4882a593Smuzhiyun #if defined(BCMDHD_SDIO) || defined(BCMDHD_USB)
57*4882a593Smuzhiyun DHD_PREALLOC_DHD_WLFC_INFO = 8,
58*4882a593Smuzhiyun #endif /* BCMDHD_SDIO | BCMDHD_USB */
59*4882a593Smuzhiyun #ifdef BCMDHD_PCIE
60*4882a593Smuzhiyun DHD_PREALLOC_IF_FLOW_LKUP = 9,
61*4882a593Smuzhiyun #endif /* BCMDHD_PCIE */
62*4882a593Smuzhiyun DHD_PREALLOC_MEMDUMP_BUF = 10,
63*4882a593Smuzhiyun #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG)
64*4882a593Smuzhiyun DHD_PREALLOC_MEMDUMP_RAM = 11,
65*4882a593Smuzhiyun #endif /* CONFIG_BCMDHD_VTS | CONFIG_BCMDHD_DEBUG */
66*4882a593Smuzhiyun #if defined(BCMDHD_SDIO) || defined(BCMDHD_USB)
67*4882a593Smuzhiyun DHD_PREALLOC_DHD_WLFC_HANGER = 12,
68*4882a593Smuzhiyun #endif /* BCMDHD_SDIO | BCMDHD_USB */
69*4882a593Smuzhiyun DHD_PREALLOC_PKTID_MAP = 13,
70*4882a593Smuzhiyun DHD_PREALLOC_PKTID_MAP_IOCTL = 14,
71*4882a593Smuzhiyun #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG)
72*4882a593Smuzhiyun DHD_PREALLOC_DHD_LOG_DUMP_BUF = 15,
73*4882a593Smuzhiyun DHD_PREALLOC_DHD_LOG_DUMP_BUF_EX = 16,
74*4882a593Smuzhiyun #endif /* CONFIG_BCMDHD_VTS | CONFIG_BCMDHD_DEBUG */
75*4882a593Smuzhiyun DHD_PREALLOC_DHD_PKTLOG_DUMP_BUF = 17,
76*4882a593Smuzhiyun DHD_PREALLOC_STAT_REPORT_BUF = 18,
77*4882a593Smuzhiyun DHD_PREALLOC_WL_ESCAN = 19,
78*4882a593Smuzhiyun DHD_PREALLOC_FW_VERBOSE_RING = 20,
79*4882a593Smuzhiyun DHD_PREALLOC_FW_EVENT_RING = 21,
80*4882a593Smuzhiyun DHD_PREALLOC_DHD_EVENT_RING = 22,
81*4882a593Smuzhiyun #if defined(BCMDHD_UNUSE_MEM)
82*4882a593Smuzhiyun DHD_PREALLOC_NAN_EVENT_RING = 23,
83*4882a593Smuzhiyun #endif /* BCMDHD_UNUSE_MEM */
84*4882a593Smuzhiyun DHD_PREALLOC_MAX
85*4882a593Smuzhiyun };
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun #define STATIC_BUF_MAX_NUM 20
88*4882a593Smuzhiyun #define STATIC_BUF_SIZE (PAGE_SIZE * 2)
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun #ifndef CUSTOM_LOG_DUMP_BUFSIZE_MB
91*4882a593Smuzhiyun /* DHD_LOG_DUMP_BUF_SIZE 4 MB static memory in kernel */
92*4882a593Smuzhiyun #define CUSTOM_LOG_DUMP_BUFSIZE_MB 4
93*4882a593Smuzhiyun #endif /* CUSTOM_LOG_DUMP_BUFSIZE_MB */
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun #define DHD_PREALLOC_PROT_SIZE (16 * 1024)
96*4882a593Smuzhiyun #define DHD_PREALLOC_RXBUF_SIZE (24 * 1024)
97*4882a593Smuzhiyun #define DHD_PREALLOC_DATABUF_SIZE (64 * 1024)
98*4882a593Smuzhiyun #define DHD_PREALLOC_OSL_BUF_SIZE (STATIC_BUF_MAX_NUM * STATIC_BUF_SIZE)
99*4882a593Smuzhiyun #define DHD_PREALLOC_WIPHY_ESCAN0_SIZE (64 * 1024)
100*4882a593Smuzhiyun #define DHD_PREALLOC_DHD_INFO_SIZE (43 * 1024)
101*4882a593Smuzhiyun #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG)
102*4882a593Smuzhiyun #define DHD_PREALLOC_MEMDUMP_RAM_SIZE (1290 * 1024)
103*4882a593Smuzhiyun #endif /* CONFIG_BCMDHD_VTS | CONFIG_BCMDHD_DEBUG */
104*4882a593Smuzhiyun #define DHD_PREALLOC_DHD_WLFC_HANGER_SIZE (73 * 1024)
105*4882a593Smuzhiyun #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG)
106*4882a593Smuzhiyun #define DHD_PREALLOC_DHD_LOG_DUMP_BUF_SIZE (1024 * 1024 * CUSTOM_LOG_DUMP_BUFSIZE_MB)
107*4882a593Smuzhiyun #define DHD_PREALLOC_DHD_LOG_DUMP_BUF_EX_SIZE (8 * 1024)
108*4882a593Smuzhiyun #endif /* CONFIG_BCMDHD_VTS | CONFIG_BCMDHD_DEBUG */
109*4882a593Smuzhiyun #define DHD_PREALLOC_WL_ESCAN_SIZE (70 * 1024)
110*4882a593Smuzhiyun #ifdef CONFIG_64BIT
111*4882a593Smuzhiyun #define DHD_PREALLOC_IF_FLOW_LKUP_SIZE (20 * 1024 * 2)
112*4882a593Smuzhiyun #else
113*4882a593Smuzhiyun #define DHD_PREALLOC_IF_FLOW_LKUP_SIZE (20 * 1024)
114*4882a593Smuzhiyun #endif
115*4882a593Smuzhiyun #define FW_VERBOSE_RING_SIZE (256 * 1024)
116*4882a593Smuzhiyun #define FW_EVENT_RING_SIZE (64 * 1024)
117*4882a593Smuzhiyun #define DHD_EVENT_RING_SIZE (64 * 1024)
118*4882a593Smuzhiyun #define NAN_EVENT_RING_SIZE (64 * 1024)
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun #if defined(CONFIG_64BIT)
121*4882a593Smuzhiyun #define WLAN_DHD_INFO_BUF_SIZE (24 * 1024)
122*4882a593Smuzhiyun #define WLAN_DHD_WLFC_BUF_SIZE (64 * 1024)
123*4882a593Smuzhiyun #define WLAN_DHD_IF_FLOW_LKUP_SIZE (64 * 1024)
124*4882a593Smuzhiyun #else
125*4882a593Smuzhiyun #define WLAN_DHD_INFO_BUF_SIZE (16 * 1024)
126*4882a593Smuzhiyun #define WLAN_DHD_WLFC_BUF_SIZE (64 * 1024)
127*4882a593Smuzhiyun #define WLAN_DHD_IF_FLOW_LKUP_SIZE (20 * 1024)
128*4882a593Smuzhiyun #endif /* CONFIG_64BIT */
129*4882a593Smuzhiyun #define WLAN_DHD_MEMDUMP_SIZE (800 * 1024)
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun #define DHD_SKB_1PAGE_BUFSIZE (PAGE_SIZE * 1)
132*4882a593Smuzhiyun #define DHD_SKB_2PAGE_BUFSIZE (PAGE_SIZE * 2)
133*4882a593Smuzhiyun #define DHD_SKB_4PAGE_BUFSIZE (PAGE_SIZE * 4)
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun #ifdef BCMDHD_PCIE
136*4882a593Smuzhiyun #define DHD_SKB_1PAGE_BUF_NUM 0
137*4882a593Smuzhiyun #define DHD_SKB_2PAGE_BUF_NUM 192
138*4882a593Smuzhiyun #elif defined(BCMDHD_SDIO)
139*4882a593Smuzhiyun #define DHD_SKB_1PAGE_BUF_NUM 8
140*4882a593Smuzhiyun #define DHD_SKB_2PAGE_BUF_NUM 8
141*4882a593Smuzhiyun #endif /* BCMDHD_PCIE */
142*4882a593Smuzhiyun #define DHD_SKB_4PAGE_BUF_NUM 1
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun /* The number is defined in linux_osl.c
145*4882a593Smuzhiyun * WLAN_SKB_1_2PAGE_BUF_NUM => STATIC_PKT_1_2PAGE_NUM
146*4882a593Smuzhiyun * WLAN_SKB_BUF_NUM => STATIC_PKT_MAX_NUM
147*4882a593Smuzhiyun */
148*4882a593Smuzhiyun #if defined(BCMDHD_SDIO) || defined(BCMDHD_PCIE)
149*4882a593Smuzhiyun #define WLAN_SKB_1_2PAGE_BUF_NUM ((DHD_SKB_1PAGE_BUF_NUM) + \
150*4882a593Smuzhiyun (DHD_SKB_2PAGE_BUF_NUM))
151*4882a593Smuzhiyun #define WLAN_SKB_BUF_NUM ((WLAN_SKB_1_2PAGE_BUF_NUM) + (DHD_SKB_4PAGE_BUF_NUM))
152*4882a593Smuzhiyun #endif
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun void *wlan_static_prot[MAX_NUM_ADAPTERS] = {};
155*4882a593Smuzhiyun void *wlan_static_rxbuf[MAX_NUM_ADAPTERS] = {};
156*4882a593Smuzhiyun void *wlan_static_databuf[MAX_NUM_ADAPTERS] = {};
157*4882a593Smuzhiyun void *wlan_static_osl_buf[MAX_NUM_ADAPTERS] = {};
158*4882a593Smuzhiyun void *wlan_static_scan_buf0[MAX_NUM_ADAPTERS] = {};
159*4882a593Smuzhiyun void *wlan_static_scan_buf1[MAX_NUM_ADAPTERS] = {};
160*4882a593Smuzhiyun void *wlan_static_dhd_info_buf[MAX_NUM_ADAPTERS] = {};
161*4882a593Smuzhiyun void *wlan_static_dhd_wlfc_info_buf[MAX_NUM_ADAPTERS] = {};
162*4882a593Smuzhiyun void *wlan_static_if_flow_lkup[MAX_NUM_ADAPTERS] = {};
163*4882a593Smuzhiyun void *wlan_static_dhd_memdump_ram_buf[MAX_NUM_ADAPTERS] = {};
164*4882a593Smuzhiyun void *wlan_static_dhd_wlfc_hanger_buf[MAX_NUM_ADAPTERS] = {};
165*4882a593Smuzhiyun #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG)
166*4882a593Smuzhiyun void *wlan_static_dhd_log_dump_buf[MAX_NUM_ADAPTERS] = {};
167*4882a593Smuzhiyun void *wlan_static_dhd_log_dump_buf_ex[MAX_NUM_ADAPTERS] = {};
168*4882a593Smuzhiyun #endif /* CONFIG_BCMDHD_VTS | CONFIG_BCMDHD_DEBUG */
169*4882a593Smuzhiyun void *wlan_static_wl_escan_info_buf[MAX_NUM_ADAPTERS] = {};
170*4882a593Smuzhiyun void *wlan_static_fw_verbose_ring_buf[MAX_NUM_ADAPTERS] = {};
171*4882a593Smuzhiyun void *wlan_static_fw_event_ring_buf[MAX_NUM_ADAPTERS] = {};
172*4882a593Smuzhiyun void *wlan_static_dhd_event_ring_buf[MAX_NUM_ADAPTERS] = {};
173*4882a593Smuzhiyun void *wlan_static_nan_event_ring_buf[MAX_NUM_ADAPTERS] = {};
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun #if defined(BCMDHD_SDIO) || defined(BCMDHD_PCIE)
176*4882a593Smuzhiyun static struct sk_buff *wlan_static_skb[MAX_NUM_ADAPTERS][WLAN_SKB_BUF_NUM] = {};
177*4882a593Smuzhiyun #endif /* BCMDHD_SDIO | BCMDHD_PCIE */
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun void *
dhd_wlan_mem_prealloc(uint bus_type,int index,int section,unsigned long size)180*4882a593Smuzhiyun dhd_wlan_mem_prealloc(
181*4882a593Smuzhiyun #if defined(BCMDHD_MDRIVER) && !defined(DHD_STATIC_IN_DRIVER)
182*4882a593Smuzhiyun uint bus_type, int index,
183*4882a593Smuzhiyun #endif
184*4882a593Smuzhiyun int section, unsigned long size)
185*4882a593Smuzhiyun {
186*4882a593Smuzhiyun #if !defined(BCMDHD_MDRIVER) || defined(DHD_STATIC_IN_DRIVER)
187*4882a593Smuzhiyun int index = 0;
188*4882a593Smuzhiyun #endif
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun #if defined(BCMDHD_MDRIVER) && !defined(DHD_STATIC_IN_DRIVER)
191*4882a593Smuzhiyun DHD_STATIC_MSG("bus_type %d, index %d, section %d, size %ld\n",
192*4882a593Smuzhiyun bus_type, index, section, size);
193*4882a593Smuzhiyun #else
194*4882a593Smuzhiyun DHD_STATIC_MSG("section %d, size %ld\n", section, size);
195*4882a593Smuzhiyun #endif
196*4882a593Smuzhiyun
197*4882a593Smuzhiyun if (section == DHD_PREALLOC_PROT)
198*4882a593Smuzhiyun return wlan_static_prot[index];
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun #if defined(BCMDHD_SDIO)
201*4882a593Smuzhiyun if (section == DHD_PREALLOC_RXBUF)
202*4882a593Smuzhiyun return wlan_static_rxbuf[index];
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun if (section == DHD_PREALLOC_DATABUF)
205*4882a593Smuzhiyun return wlan_static_databuf[index];
206*4882a593Smuzhiyun #endif /* BCMDHD_SDIO */
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun #if defined(BCMDHD_SDIO) || defined(BCMDHD_PCIE)
209*4882a593Smuzhiyun if (section == DHD_PREALLOC_SKB_BUF)
210*4882a593Smuzhiyun return wlan_static_skb[index];
211*4882a593Smuzhiyun #endif /* BCMDHD_SDIO | BCMDHD_PCIE */
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun if (section == DHD_PREALLOC_WIPHY_ESCAN0)
214*4882a593Smuzhiyun return wlan_static_scan_buf0[index];
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun if (section == DHD_PREALLOC_WIPHY_ESCAN1)
217*4882a593Smuzhiyun return wlan_static_scan_buf1[index];
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun if (section == DHD_PREALLOC_OSL_BUF) {
220*4882a593Smuzhiyun if (size > DHD_PREALLOC_OSL_BUF_SIZE) {
221*4882a593Smuzhiyun DHD_STATIC_ERROR("request OSL_BUF(%lu) > %ld\n",
222*4882a593Smuzhiyun size, DHD_PREALLOC_OSL_BUF_SIZE);
223*4882a593Smuzhiyun return NULL;
224*4882a593Smuzhiyun }
225*4882a593Smuzhiyun return wlan_static_osl_buf[index];
226*4882a593Smuzhiyun }
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun if (section == DHD_PREALLOC_DHD_INFO) {
229*4882a593Smuzhiyun if (size > DHD_PREALLOC_DHD_INFO_SIZE) {
230*4882a593Smuzhiyun DHD_STATIC_ERROR("request DHD_INFO(%lu) > %d\n",
231*4882a593Smuzhiyun size, DHD_PREALLOC_DHD_INFO_SIZE);
232*4882a593Smuzhiyun return NULL;
233*4882a593Smuzhiyun }
234*4882a593Smuzhiyun return wlan_static_dhd_info_buf[index];
235*4882a593Smuzhiyun }
236*4882a593Smuzhiyun #if defined(BCMDHD_SDIO) || defined(BCMDHD_USB)
237*4882a593Smuzhiyun if (section == DHD_PREALLOC_DHD_WLFC_INFO) {
238*4882a593Smuzhiyun if (size > WLAN_DHD_WLFC_BUF_SIZE) {
239*4882a593Smuzhiyun DHD_STATIC_ERROR("request DHD_WLFC_INFO(%lu) > %d\n",
240*4882a593Smuzhiyun size, WLAN_DHD_WLFC_BUF_SIZE);
241*4882a593Smuzhiyun return NULL;
242*4882a593Smuzhiyun }
243*4882a593Smuzhiyun return wlan_static_dhd_wlfc_info_buf[index];
244*4882a593Smuzhiyun }
245*4882a593Smuzhiyun #endif /* BCMDHD_SDIO | BCMDHD_USB */
246*4882a593Smuzhiyun #ifdef BCMDHD_PCIE
247*4882a593Smuzhiyun if (section == DHD_PREALLOC_IF_FLOW_LKUP) {
248*4882a593Smuzhiyun if (size > DHD_PREALLOC_IF_FLOW_LKUP_SIZE) {
249*4882a593Smuzhiyun DHD_STATIC_ERROR("request DHD_IF_FLOW_LKUP(%lu) > %d\n",
250*4882a593Smuzhiyun size, DHD_PREALLOC_IF_FLOW_LKUP_SIZE);
251*4882a593Smuzhiyun return NULL;
252*4882a593Smuzhiyun }
253*4882a593Smuzhiyun return wlan_static_if_flow_lkup[index];
254*4882a593Smuzhiyun }
255*4882a593Smuzhiyun #endif /* BCMDHD_PCIE */
256*4882a593Smuzhiyun #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG)
257*4882a593Smuzhiyun if (section == DHD_PREALLOC_MEMDUMP_RAM) {
258*4882a593Smuzhiyun if (size > DHD_PREALLOC_MEMDUMP_RAM_SIZE) {
259*4882a593Smuzhiyun DHD_STATIC_ERROR("request DHD_PREALLOC_MEMDUMP_RAM(%lu) > %d\n",
260*4882a593Smuzhiyun size, DHD_PREALLOC_MEMDUMP_RAM_SIZE);
261*4882a593Smuzhiyun return NULL;
262*4882a593Smuzhiyun }
263*4882a593Smuzhiyun return wlan_static_dhd_memdump_ram_buf[index];
264*4882a593Smuzhiyun }
265*4882a593Smuzhiyun #endif /* CONFIG_BCMDHD_VTS | CONFIG_BCMDHD_DEBUG */
266*4882a593Smuzhiyun #if defined(BCMDHD_SDIO) || defined(BCMDHD_USB)
267*4882a593Smuzhiyun if (section == DHD_PREALLOC_DHD_WLFC_HANGER) {
268*4882a593Smuzhiyun if (size > DHD_PREALLOC_DHD_WLFC_HANGER_SIZE) {
269*4882a593Smuzhiyun DHD_STATIC_ERROR("request DHD_WLFC_HANGER(%lu) > %d\n",
270*4882a593Smuzhiyun size, DHD_PREALLOC_DHD_WLFC_HANGER_SIZE);
271*4882a593Smuzhiyun return NULL;
272*4882a593Smuzhiyun }
273*4882a593Smuzhiyun return wlan_static_dhd_wlfc_hanger_buf[index];
274*4882a593Smuzhiyun }
275*4882a593Smuzhiyun #endif /* BCMDHD_SDIO | BCMDHD_USB */
276*4882a593Smuzhiyun #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG)
277*4882a593Smuzhiyun if (section == DHD_PREALLOC_DHD_LOG_DUMP_BUF) {
278*4882a593Smuzhiyun if (size > DHD_PREALLOC_DHD_LOG_DUMP_BUF_SIZE) {
279*4882a593Smuzhiyun DHD_STATIC_ERROR("request DHD_PREALLOC_DHD_LOG_DUMP_BUF(%lu) > %d\n",
280*4882a593Smuzhiyun size, DHD_PREALLOC_DHD_LOG_DUMP_BUF_SIZE);
281*4882a593Smuzhiyun return NULL;
282*4882a593Smuzhiyun }
283*4882a593Smuzhiyun return wlan_static_dhd_log_dump_buf[index];
284*4882a593Smuzhiyun }
285*4882a593Smuzhiyun if (section == DHD_PREALLOC_DHD_LOG_DUMP_BUF_EX) {
286*4882a593Smuzhiyun if (size > DHD_PREALLOC_DHD_LOG_DUMP_BUF_EX_SIZE) {
287*4882a593Smuzhiyun DHD_STATIC_ERROR("request DHD_PREALLOC_DHD_LOG_DUMP_BUF_EX(%lu) > %d\n",
288*4882a593Smuzhiyun size, DHD_PREALLOC_DHD_LOG_DUMP_BUF_EX_SIZE);
289*4882a593Smuzhiyun return NULL;
290*4882a593Smuzhiyun }
291*4882a593Smuzhiyun return wlan_static_dhd_log_dump_buf_ex[index];
292*4882a593Smuzhiyun }
293*4882a593Smuzhiyun #endif /* CONFIG_BCMDHD_VTS | CONFIG_BCMDHD_DEBUG */
294*4882a593Smuzhiyun if (section == DHD_PREALLOC_WL_ESCAN) {
295*4882a593Smuzhiyun if (size > DHD_PREALLOC_WL_ESCAN_SIZE) {
296*4882a593Smuzhiyun DHD_STATIC_ERROR("request DHD_PREALLOC_WL_ESCAN(%lu) > %d\n",
297*4882a593Smuzhiyun size, DHD_PREALLOC_WL_ESCAN_SIZE);
298*4882a593Smuzhiyun return NULL;
299*4882a593Smuzhiyun }
300*4882a593Smuzhiyun return wlan_static_wl_escan_info_buf[index];
301*4882a593Smuzhiyun }
302*4882a593Smuzhiyun if (section == DHD_PREALLOC_FW_VERBOSE_RING) {
303*4882a593Smuzhiyun if (size > FW_VERBOSE_RING_SIZE) {
304*4882a593Smuzhiyun DHD_STATIC_ERROR("request DHD_PREALLOC_FW_VERBOSE_RING(%lu) > %d\n",
305*4882a593Smuzhiyun size, FW_VERBOSE_RING_SIZE);
306*4882a593Smuzhiyun return NULL;
307*4882a593Smuzhiyun }
308*4882a593Smuzhiyun return wlan_static_fw_verbose_ring_buf[index];
309*4882a593Smuzhiyun }
310*4882a593Smuzhiyun if (section == DHD_PREALLOC_FW_EVENT_RING) {
311*4882a593Smuzhiyun if (size > FW_EVENT_RING_SIZE) {
312*4882a593Smuzhiyun DHD_STATIC_ERROR("request DHD_PREALLOC_FW_EVENT_RING(%lu) > %d\n",
313*4882a593Smuzhiyun size, FW_EVENT_RING_SIZE);
314*4882a593Smuzhiyun return NULL;
315*4882a593Smuzhiyun }
316*4882a593Smuzhiyun return wlan_static_fw_event_ring_buf[index];
317*4882a593Smuzhiyun }
318*4882a593Smuzhiyun if (section == DHD_PREALLOC_DHD_EVENT_RING) {
319*4882a593Smuzhiyun if (size > DHD_EVENT_RING_SIZE) {
320*4882a593Smuzhiyun DHD_STATIC_ERROR("request DHD_PREALLOC_DHD_EVENT_RING(%lu) > %d\n",
321*4882a593Smuzhiyun size, DHD_EVENT_RING_SIZE);
322*4882a593Smuzhiyun return NULL;
323*4882a593Smuzhiyun }
324*4882a593Smuzhiyun return wlan_static_dhd_event_ring_buf[index];
325*4882a593Smuzhiyun }
326*4882a593Smuzhiyun #if defined(BCMDHD_UNUSE_MEM)
327*4882a593Smuzhiyun if (section == DHD_PREALLOC_NAN_EVENT_RING) {
328*4882a593Smuzhiyun if (size > NAN_EVENT_RING_SIZE) {
329*4882a593Smuzhiyun DHD_STATIC_ERROR("request DHD_PREALLOC_NAN_EVENT_RING(%lu) > %d\n",
330*4882a593Smuzhiyun size, NAN_EVENT_RING_SIZE);
331*4882a593Smuzhiyun return NULL;
332*4882a593Smuzhiyun }
333*4882a593Smuzhiyun return wlan_static_nan_event_ring_buf[index];
334*4882a593Smuzhiyun }
335*4882a593Smuzhiyun #endif /* BCMDHD_UNUSE_MEM */
336*4882a593Smuzhiyun if ((section < 0) || (section > DHD_PREALLOC_MAX))
337*4882a593Smuzhiyun DHD_STATIC_ERROR("request section id(%d) is out of max index %d\n",
338*4882a593Smuzhiyun section, DHD_PREALLOC_MAX);
339*4882a593Smuzhiyun
340*4882a593Smuzhiyun DHD_STATIC_ERROR("failed to alloc section %d, size=%ld\n",
341*4882a593Smuzhiyun section, size);
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun return NULL;
344*4882a593Smuzhiyun }
345*4882a593Smuzhiyun #ifndef DHD_STATIC_IN_DRIVER
346*4882a593Smuzhiyun EXPORT_SYMBOL(dhd_wlan_mem_prealloc);
347*4882a593Smuzhiyun #endif
348*4882a593Smuzhiyun
349*4882a593Smuzhiyun static void
dhd_deinit_wlan_mem(int index)350*4882a593Smuzhiyun dhd_deinit_wlan_mem(int index)
351*4882a593Smuzhiyun {
352*4882a593Smuzhiyun #if defined(BCMDHD_SDIO) || defined(BCMDHD_PCIE)
353*4882a593Smuzhiyun int i;
354*4882a593Smuzhiyun #endif /* BCMDHD_SDIO | BCMDHD_PCIE */
355*4882a593Smuzhiyun
356*4882a593Smuzhiyun if (wlan_static_prot[index])
357*4882a593Smuzhiyun kfree(wlan_static_prot[index]);
358*4882a593Smuzhiyun #if defined(BCMDHD_SDIO)
359*4882a593Smuzhiyun if (wlan_static_rxbuf[index])
360*4882a593Smuzhiyun kfree(wlan_static_rxbuf[index]);
361*4882a593Smuzhiyun if (wlan_static_databuf[index])
362*4882a593Smuzhiyun kfree(wlan_static_databuf[index]);
363*4882a593Smuzhiyun #endif /* BCMDHD_SDIO */
364*4882a593Smuzhiyun if (wlan_static_osl_buf[index])
365*4882a593Smuzhiyun kfree(wlan_static_osl_buf[index]);
366*4882a593Smuzhiyun if (wlan_static_scan_buf0[index])
367*4882a593Smuzhiyun kfree(wlan_static_scan_buf0[index]);
368*4882a593Smuzhiyun if (wlan_static_scan_buf1[index])
369*4882a593Smuzhiyun kfree(wlan_static_scan_buf1[index]);
370*4882a593Smuzhiyun if (wlan_static_dhd_info_buf[index])
371*4882a593Smuzhiyun kfree(wlan_static_dhd_info_buf[index]);
372*4882a593Smuzhiyun #if defined(BCMDHD_SDIO) || defined(BCMDHD_USB)
373*4882a593Smuzhiyun if (wlan_static_dhd_wlfc_info_buf[index])
374*4882a593Smuzhiyun kfree(wlan_static_dhd_wlfc_info_buf[index]);
375*4882a593Smuzhiyun #endif /* BCMDHD_SDIO | BCMDHD_USB */
376*4882a593Smuzhiyun #ifdef BCMDHD_PCIE
377*4882a593Smuzhiyun if (wlan_static_if_flow_lkup[index])
378*4882a593Smuzhiyun kfree(wlan_static_if_flow_lkup[index]);
379*4882a593Smuzhiyun #endif /* BCMDHD_PCIE */
380*4882a593Smuzhiyun #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG)
381*4882a593Smuzhiyun if (wlan_static_dhd_memdump_ram_buf[index])
382*4882a593Smuzhiyun kfree(wlan_static_dhd_memdump_ram_buf[index]);
383*4882a593Smuzhiyun #endif /* CONFIG_BCMDHD_VTS | CONFIG_BCMDHD_DEBUG */
384*4882a593Smuzhiyun #if defined(BCMDHD_SDIO) || defined(BCMDHD_USB)
385*4882a593Smuzhiyun if (wlan_static_dhd_wlfc_hanger_buf[index])
386*4882a593Smuzhiyun kfree(wlan_static_dhd_wlfc_hanger_buf[index]);
387*4882a593Smuzhiyun #endif /* BCMDHD_SDIO | BCMDHD_USB */
388*4882a593Smuzhiyun #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG)
389*4882a593Smuzhiyun if (wlan_static_dhd_log_dump_buf[index])
390*4882a593Smuzhiyun kfree(wlan_static_dhd_log_dump_buf[index]);
391*4882a593Smuzhiyun if (wlan_static_dhd_log_dump_buf_ex[index])
392*4882a593Smuzhiyun kfree(wlan_static_dhd_log_dump_buf_ex[index]);
393*4882a593Smuzhiyun #endif /* CONFIG_BCMDHD_VTS | CONFIG_BCMDHD_DEBUG */
394*4882a593Smuzhiyun if (wlan_static_wl_escan_info_buf[index])
395*4882a593Smuzhiyun kfree(wlan_static_wl_escan_info_buf[index]);
396*4882a593Smuzhiyun if (wlan_static_fw_verbose_ring_buf[index])
397*4882a593Smuzhiyun kfree(wlan_static_fw_verbose_ring_buf[index]);
398*4882a593Smuzhiyun if (wlan_static_fw_event_ring_buf[index])
399*4882a593Smuzhiyun kfree(wlan_static_fw_event_ring_buf[index]);
400*4882a593Smuzhiyun if (wlan_static_dhd_event_ring_buf[index])
401*4882a593Smuzhiyun kfree(wlan_static_dhd_event_ring_buf[index]);
402*4882a593Smuzhiyun #if defined(BCMDHD_UNUSE_MEM)
403*4882a593Smuzhiyun if (wlan_static_nan_event_ring_buf[index])
404*4882a593Smuzhiyun kfree(wlan_static_nan_event_ring_buf[index]);
405*4882a593Smuzhiyun #endif /* BCMDHD_UNUSE_MEM */
406*4882a593Smuzhiyun
407*4882a593Smuzhiyun #if defined(BCMDHD_SDIO) || defined(BCMDHD_PCIE)
408*4882a593Smuzhiyun for (i=0; i<WLAN_SKB_BUF_NUM; i++) {
409*4882a593Smuzhiyun if (wlan_static_skb[index][i])
410*4882a593Smuzhiyun dev_kfree_skb(wlan_static_skb[index][i]);
411*4882a593Smuzhiyun }
412*4882a593Smuzhiyun #endif /* BCMDHD_SDIO | BCMDHD_PCIE */
413*4882a593Smuzhiyun
414*4882a593Smuzhiyun return;
415*4882a593Smuzhiyun }
416*4882a593Smuzhiyun
417*4882a593Smuzhiyun static int
dhd_init_wlan_mem(int index)418*4882a593Smuzhiyun dhd_init_wlan_mem(int index)
419*4882a593Smuzhiyun {
420*4882a593Smuzhiyun #if defined(BCMDHD_SDIO) || defined(BCMDHD_PCIE)
421*4882a593Smuzhiyun int i;
422*4882a593Smuzhiyun #endif
423*4882a593Smuzhiyun unsigned long size = 0;
424*4882a593Smuzhiyun
425*4882a593Smuzhiyun #if defined(BCMDHD_SDIO) || defined(BCMDHD_PCIE)
426*4882a593Smuzhiyun for (i = 0; i < WLAN_SKB_BUF_NUM; i++)
427*4882a593Smuzhiyun wlan_static_skb[index][i] = NULL;
428*4882a593Smuzhiyun
429*4882a593Smuzhiyun for (i = 0; i < DHD_SKB_1PAGE_BUF_NUM; i++) {
430*4882a593Smuzhiyun wlan_static_skb[index][i] = dev_alloc_skb(DHD_SKB_1PAGE_BUFSIZE);
431*4882a593Smuzhiyun if (!wlan_static_skb[index][i])
432*4882a593Smuzhiyun goto err_mem_alloc;
433*4882a593Smuzhiyun size += DHD_SKB_1PAGE_BUFSIZE;
434*4882a593Smuzhiyun DHD_STATIC_TRACE("section %d skb[%d], size=%ld\n",
435*4882a593Smuzhiyun DHD_PREALLOC_SKB_BUF, i, DHD_SKB_1PAGE_BUFSIZE);
436*4882a593Smuzhiyun }
437*4882a593Smuzhiyun
438*4882a593Smuzhiyun for (i = DHD_SKB_1PAGE_BUF_NUM; i < WLAN_SKB_1_2PAGE_BUF_NUM; i++) {
439*4882a593Smuzhiyun wlan_static_skb[index][i] = dev_alloc_skb(DHD_SKB_2PAGE_BUFSIZE);
440*4882a593Smuzhiyun if (!wlan_static_skb[index][i])
441*4882a593Smuzhiyun goto err_mem_alloc;
442*4882a593Smuzhiyun size += DHD_SKB_2PAGE_BUFSIZE;
443*4882a593Smuzhiyun DHD_STATIC_TRACE("section %d skb[%d], size=%ld\n",
444*4882a593Smuzhiyun DHD_PREALLOC_SKB_BUF, i, DHD_SKB_2PAGE_BUFSIZE);
445*4882a593Smuzhiyun }
446*4882a593Smuzhiyun #endif /* BCMDHD_SDIO | BCMDHD_PCIE */
447*4882a593Smuzhiyun
448*4882a593Smuzhiyun #if defined(BCMDHD_SDIO)
449*4882a593Smuzhiyun wlan_static_skb[index][i] = dev_alloc_skb(DHD_SKB_4PAGE_BUFSIZE);
450*4882a593Smuzhiyun if (!wlan_static_skb[index][i])
451*4882a593Smuzhiyun goto err_mem_alloc;
452*4882a593Smuzhiyun size += DHD_SKB_4PAGE_BUFSIZE;
453*4882a593Smuzhiyun DHD_STATIC_TRACE("section %d skb[%d], size=%ld\n",
454*4882a593Smuzhiyun DHD_PREALLOC_SKB_BUF, i, DHD_SKB_4PAGE_BUFSIZE);
455*4882a593Smuzhiyun #endif /* BCMDHD_SDIO */
456*4882a593Smuzhiyun
457*4882a593Smuzhiyun wlan_static_prot[index] = kmalloc(DHD_PREALLOC_PROT_SIZE, GFP_KERNEL);
458*4882a593Smuzhiyun if (!wlan_static_prot[index])
459*4882a593Smuzhiyun goto err_mem_alloc;
460*4882a593Smuzhiyun size += DHD_PREALLOC_PROT_SIZE;
461*4882a593Smuzhiyun DHD_STATIC_TRACE("section %d, size=%d\n",
462*4882a593Smuzhiyun DHD_PREALLOC_PROT, DHD_PREALLOC_PROT_SIZE);
463*4882a593Smuzhiyun
464*4882a593Smuzhiyun #if defined(BCMDHD_SDIO)
465*4882a593Smuzhiyun wlan_static_rxbuf[index] = kmalloc(DHD_PREALLOC_RXBUF_SIZE, GFP_KERNEL);
466*4882a593Smuzhiyun if (!wlan_static_rxbuf[index])
467*4882a593Smuzhiyun goto err_mem_alloc;
468*4882a593Smuzhiyun size += DHD_PREALLOC_RXBUF_SIZE;
469*4882a593Smuzhiyun DHD_STATIC_TRACE("section %d, size=%d\n",
470*4882a593Smuzhiyun DHD_PREALLOC_RXBUF, DHD_PREALLOC_RXBUF_SIZE);
471*4882a593Smuzhiyun
472*4882a593Smuzhiyun wlan_static_databuf[index] = kmalloc(DHD_PREALLOC_DATABUF_SIZE, GFP_KERNEL);
473*4882a593Smuzhiyun if (!wlan_static_databuf[index])
474*4882a593Smuzhiyun goto err_mem_alloc;
475*4882a593Smuzhiyun size += DHD_PREALLOC_DATABUF_SIZE;
476*4882a593Smuzhiyun DHD_STATIC_TRACE("section %d, size=%d\n",
477*4882a593Smuzhiyun DHD_PREALLOC_DATABUF, DHD_PREALLOC_DATABUF_SIZE);
478*4882a593Smuzhiyun #endif /* BCMDHD_SDIO */
479*4882a593Smuzhiyun
480*4882a593Smuzhiyun wlan_static_osl_buf[index] = kmalloc(DHD_PREALLOC_OSL_BUF_SIZE, GFP_KERNEL);
481*4882a593Smuzhiyun if (!wlan_static_osl_buf[index])
482*4882a593Smuzhiyun goto err_mem_alloc;
483*4882a593Smuzhiyun size += DHD_PREALLOC_OSL_BUF_SIZE;
484*4882a593Smuzhiyun DHD_STATIC_TRACE("section %d, size=%ld\n",
485*4882a593Smuzhiyun DHD_PREALLOC_OSL_BUF, DHD_PREALLOC_OSL_BUF_SIZE);
486*4882a593Smuzhiyun
487*4882a593Smuzhiyun wlan_static_scan_buf0[index] = kmalloc(DHD_PREALLOC_WIPHY_ESCAN0_SIZE, GFP_KERNEL);
488*4882a593Smuzhiyun if (!wlan_static_scan_buf0[index])
489*4882a593Smuzhiyun goto err_mem_alloc;
490*4882a593Smuzhiyun size += DHD_PREALLOC_WIPHY_ESCAN0_SIZE;
491*4882a593Smuzhiyun DHD_STATIC_TRACE("section %d, size=%d\n",
492*4882a593Smuzhiyun DHD_PREALLOC_WIPHY_ESCAN0, DHD_PREALLOC_WIPHY_ESCAN0_SIZE);
493*4882a593Smuzhiyun
494*4882a593Smuzhiyun wlan_static_dhd_info_buf[index] = kmalloc(DHD_PREALLOC_DHD_INFO_SIZE, GFP_KERNEL);
495*4882a593Smuzhiyun if (!wlan_static_dhd_info_buf[index])
496*4882a593Smuzhiyun goto err_mem_alloc;
497*4882a593Smuzhiyun size += DHD_PREALLOC_DHD_INFO_SIZE;
498*4882a593Smuzhiyun DHD_STATIC_TRACE("section %d, size=%d\n",
499*4882a593Smuzhiyun DHD_PREALLOC_DHD_INFO, DHD_PREALLOC_DHD_INFO_SIZE);
500*4882a593Smuzhiyun
501*4882a593Smuzhiyun #if defined(BCMDHD_SDIO) || defined(BCMDHD_USB)
502*4882a593Smuzhiyun wlan_static_dhd_wlfc_info_buf[index] = kmalloc(WLAN_DHD_WLFC_BUF_SIZE, GFP_KERNEL);
503*4882a593Smuzhiyun if (!wlan_static_dhd_wlfc_info_buf[index])
504*4882a593Smuzhiyun goto err_mem_alloc;
505*4882a593Smuzhiyun size += WLAN_DHD_WLFC_BUF_SIZE;
506*4882a593Smuzhiyun DHD_STATIC_TRACE("section %d, size=%d\n",
507*4882a593Smuzhiyun DHD_PREALLOC_DHD_WLFC_INFO, WLAN_DHD_WLFC_BUF_SIZE);
508*4882a593Smuzhiyun #endif /* BCMDHD_SDIO | BCMDHD_USB */
509*4882a593Smuzhiyun
510*4882a593Smuzhiyun #ifdef BCMDHD_PCIE
511*4882a593Smuzhiyun wlan_static_if_flow_lkup[index] = kmalloc(DHD_PREALLOC_IF_FLOW_LKUP_SIZE, GFP_KERNEL);
512*4882a593Smuzhiyun if (!wlan_static_if_flow_lkup[index])
513*4882a593Smuzhiyun goto err_mem_alloc;
514*4882a593Smuzhiyun size += DHD_PREALLOC_IF_FLOW_LKUP_SIZE;
515*4882a593Smuzhiyun DHD_STATIC_TRACE("section %d, size=%d\n",
516*4882a593Smuzhiyun DHD_PREALLOC_IF_FLOW_LKUP, DHD_PREALLOC_IF_FLOW_LKUP_SIZE);
517*4882a593Smuzhiyun #endif /* BCMDHD_PCIE */
518*4882a593Smuzhiyun
519*4882a593Smuzhiyun #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG)
520*4882a593Smuzhiyun wlan_static_dhd_memdump_ram_buf[index] = kmalloc(DHD_PREALLOC_MEMDUMP_RAM_SIZE, GFP_KERNEL);
521*4882a593Smuzhiyun if (!wlan_static_dhd_memdump_ram_buf[index])
522*4882a593Smuzhiyun goto err_mem_alloc;
523*4882a593Smuzhiyun size += DHD_PREALLOC_MEMDUMP_RAM_SIZE;
524*4882a593Smuzhiyun DHD_STATIC_TRACE("section %d, size=%d\n",
525*4882a593Smuzhiyun DHD_PREALLOC_MEMDUMP_RAM, DHD_PREALLOC_MEMDUMP_RAM_SIZE);
526*4882a593Smuzhiyun #endif /* CONFIG_BCMDHD_VTS | CONFIG_BCMDHD_DEBUG */
527*4882a593Smuzhiyun
528*4882a593Smuzhiyun #if defined(BCMDHD_SDIO) || defined(BCMDHD_USB)
529*4882a593Smuzhiyun wlan_static_dhd_wlfc_hanger_buf[index] = kmalloc(DHD_PREALLOC_DHD_WLFC_HANGER_SIZE, GFP_KERNEL);
530*4882a593Smuzhiyun if (!wlan_static_dhd_wlfc_hanger_buf[index])
531*4882a593Smuzhiyun goto err_mem_alloc;
532*4882a593Smuzhiyun size += DHD_PREALLOC_DHD_WLFC_HANGER_SIZE;
533*4882a593Smuzhiyun DHD_STATIC_TRACE("section %d, size=%d\n",
534*4882a593Smuzhiyun DHD_PREALLOC_DHD_WLFC_HANGER, DHD_PREALLOC_DHD_WLFC_HANGER_SIZE);
535*4882a593Smuzhiyun #endif /* BCMDHD_SDIO | BCMDHD_USB */
536*4882a593Smuzhiyun
537*4882a593Smuzhiyun #if defined(CONFIG_BCMDHD_VTS) || defined(CONFIG_BCMDHD_DEBUG)
538*4882a593Smuzhiyun wlan_static_dhd_log_dump_buf[index] = kmalloc(DHD_PREALLOC_DHD_LOG_DUMP_BUF_SIZE, GFP_KERNEL);
539*4882a593Smuzhiyun if (!wlan_static_dhd_log_dump_buf[index])
540*4882a593Smuzhiyun goto err_mem_alloc;
541*4882a593Smuzhiyun size += DHD_PREALLOC_DHD_LOG_DUMP_BUF_SIZE;
542*4882a593Smuzhiyun DHD_STATIC_TRACE("section %d, size=%d\n",
543*4882a593Smuzhiyun DHD_PREALLOC_DHD_LOG_DUMP_BUF, DHD_PREALLOC_DHD_LOG_DUMP_BUF_SIZE);
544*4882a593Smuzhiyun
545*4882a593Smuzhiyun wlan_static_dhd_log_dump_buf_ex[index] = kmalloc(DHD_PREALLOC_DHD_LOG_DUMP_BUF_EX_SIZE, GFP_KERNEL);
546*4882a593Smuzhiyun if (!wlan_static_dhd_log_dump_buf_ex[index])
547*4882a593Smuzhiyun goto err_mem_alloc;
548*4882a593Smuzhiyun size += DHD_PREALLOC_DHD_LOG_DUMP_BUF_EX_SIZE;
549*4882a593Smuzhiyun DHD_STATIC_TRACE("section %d, size=%d\n",
550*4882a593Smuzhiyun DHD_PREALLOC_DHD_LOG_DUMP_BUF_EX, DHD_PREALLOC_DHD_LOG_DUMP_BUF_EX_SIZE);
551*4882a593Smuzhiyun #endif /* CONFIG_BCMDHD_VTS | CONFIG_BCMDHD_DEBUG */
552*4882a593Smuzhiyun
553*4882a593Smuzhiyun wlan_static_wl_escan_info_buf[index] = kmalloc(DHD_PREALLOC_WL_ESCAN_SIZE, GFP_KERNEL);
554*4882a593Smuzhiyun if (!wlan_static_wl_escan_info_buf[index])
555*4882a593Smuzhiyun goto err_mem_alloc;
556*4882a593Smuzhiyun size += DHD_PREALLOC_WL_ESCAN_SIZE;
557*4882a593Smuzhiyun DHD_STATIC_TRACE("section %d, size=%d\n",
558*4882a593Smuzhiyun DHD_PREALLOC_WL_ESCAN, DHD_PREALLOC_WL_ESCAN_SIZE);
559*4882a593Smuzhiyun
560*4882a593Smuzhiyun wlan_static_fw_verbose_ring_buf[index] = kmalloc(FW_VERBOSE_RING_SIZE, GFP_KERNEL);
561*4882a593Smuzhiyun if (!wlan_static_fw_verbose_ring_buf[index])
562*4882a593Smuzhiyun goto err_mem_alloc;
563*4882a593Smuzhiyun size += FW_VERBOSE_RING_SIZE;
564*4882a593Smuzhiyun DHD_STATIC_TRACE("section %d, size=%d\n",
565*4882a593Smuzhiyun DHD_PREALLOC_FW_VERBOSE_RING, FW_VERBOSE_RING_SIZE);
566*4882a593Smuzhiyun
567*4882a593Smuzhiyun wlan_static_fw_event_ring_buf[index] = kmalloc(FW_EVENT_RING_SIZE, GFP_KERNEL);
568*4882a593Smuzhiyun if (!wlan_static_fw_event_ring_buf[index])
569*4882a593Smuzhiyun goto err_mem_alloc;
570*4882a593Smuzhiyun size += FW_EVENT_RING_SIZE;
571*4882a593Smuzhiyun DHD_STATIC_TRACE("section %d, size=%d\n",
572*4882a593Smuzhiyun DHD_PREALLOC_FW_EVENT_RING, FW_EVENT_RING_SIZE);
573*4882a593Smuzhiyun
574*4882a593Smuzhiyun wlan_static_dhd_event_ring_buf[index] = kmalloc(DHD_EVENT_RING_SIZE, GFP_KERNEL);
575*4882a593Smuzhiyun if (!wlan_static_dhd_event_ring_buf[index])
576*4882a593Smuzhiyun goto err_mem_alloc;
577*4882a593Smuzhiyun size += DHD_EVENT_RING_SIZE;
578*4882a593Smuzhiyun DHD_STATIC_TRACE("section %d, size=%d\n",
579*4882a593Smuzhiyun DHD_PREALLOC_DHD_EVENT_RING, DHD_EVENT_RING_SIZE);
580*4882a593Smuzhiyun
581*4882a593Smuzhiyun #if defined(BCMDHD_UNUSE_MEM)
582*4882a593Smuzhiyun wlan_static_nan_event_ring_buf[index] = kmalloc(NAN_EVENT_RING_SIZE, GFP_KERNEL);
583*4882a593Smuzhiyun if (!wlan_static_nan_event_ring_buf[index])
584*4882a593Smuzhiyun goto err_mem_alloc;
585*4882a593Smuzhiyun size += NAN_EVENT_RING_SIZE;
586*4882a593Smuzhiyun DHD_STATIC_TRACE("section %d, size=%d\n",
587*4882a593Smuzhiyun DHD_PREALLOC_NAN_EVENT_RING, NAN_EVENT_RING_SIZE);
588*4882a593Smuzhiyun #endif /* BCMDHD_UNUSE_MEM */
589*4882a593Smuzhiyun
590*4882a593Smuzhiyun DHD_STATIC_MSG("prealloc ok for index %d: %ld(%ldK)\n", index, size, size / 1024);
591*4882a593Smuzhiyun return 0;
592*4882a593Smuzhiyun
593*4882a593Smuzhiyun err_mem_alloc:
594*4882a593Smuzhiyun DHD_STATIC_ERROR("Failed to allocate memory for index %d\n", index);
595*4882a593Smuzhiyun
596*4882a593Smuzhiyun return -ENOMEM;
597*4882a593Smuzhiyun }
598*4882a593Smuzhiyun
599*4882a593Smuzhiyun #ifdef DHD_STATIC_IN_DRIVER
600*4882a593Smuzhiyun int
601*4882a593Smuzhiyun #else
602*4882a593Smuzhiyun static int __init
603*4882a593Smuzhiyun #endif
dhd_static_buf_init(void)604*4882a593Smuzhiyun dhd_static_buf_init(void)
605*4882a593Smuzhiyun {
606*4882a593Smuzhiyun int i, ret = 0;
607*4882a593Smuzhiyun
608*4882a593Smuzhiyun DHD_STATIC_MSG("%s\n", DHD_STATIC_VERSION_STR);
609*4882a593Smuzhiyun
610*4882a593Smuzhiyun for (i=0; i<MAX_NUM_ADAPTERS; i++) {
611*4882a593Smuzhiyun ret = dhd_init_wlan_mem(i);
612*4882a593Smuzhiyun if (ret)
613*4882a593Smuzhiyun break;
614*4882a593Smuzhiyun }
615*4882a593Smuzhiyun
616*4882a593Smuzhiyun if (ret) {
617*4882a593Smuzhiyun for (i=0; i<MAX_NUM_ADAPTERS; i++)
618*4882a593Smuzhiyun dhd_deinit_wlan_mem(i);
619*4882a593Smuzhiyun }
620*4882a593Smuzhiyun
621*4882a593Smuzhiyun return ret;
622*4882a593Smuzhiyun }
623*4882a593Smuzhiyun
624*4882a593Smuzhiyun #ifdef DHD_STATIC_IN_DRIVER
625*4882a593Smuzhiyun void
626*4882a593Smuzhiyun #else
627*4882a593Smuzhiyun static void __exit
628*4882a593Smuzhiyun #endif
dhd_static_buf_exit(void)629*4882a593Smuzhiyun dhd_static_buf_exit(void)
630*4882a593Smuzhiyun {
631*4882a593Smuzhiyun int i;
632*4882a593Smuzhiyun
633*4882a593Smuzhiyun DHD_STATIC_MSG("Enter\n");
634*4882a593Smuzhiyun
635*4882a593Smuzhiyun for (i=0; i<MAX_NUM_ADAPTERS; i++)
636*4882a593Smuzhiyun dhd_deinit_wlan_mem(i);
637*4882a593Smuzhiyun }
638*4882a593Smuzhiyun
639*4882a593Smuzhiyun #ifndef DHD_STATIC_IN_DRIVER
640*4882a593Smuzhiyun module_init(dhd_static_buf_init);
641*4882a593Smuzhiyun module_exit(dhd_static_buf_exit);
642*4882a593Smuzhiyun #endif
643