1 /*
2 * Platform Dependent file for usage of Preallocted Memory
3 *
4 * Portions of this code are copyright (c) 2021 Cypress Semiconductor Corporation
5 *
6 * Copyright (C) 1999-2017, Broadcom Corporation
7 *
8 * Unless you and Broadcom execute a separate written software license
9 * agreement governing use of this software, this software is licensed to you
10 * under the terms of the GNU General Public License version 2 (the "GPL"),
11 * available at http://www.broadcom.com/licenses/GPLv2.php, with the
12 * following added to such license:
13 *
14 * As a special exception, the copyright holders of this software give you
15 * permission to link this software with independent modules, and to copy and
16 * distribute the resulting executable under terms of your choice, provided that
17 * you also meet, for each linked independent module, the terms and conditions of
18 * the license of that module. An independent module is a module which is not
19 * derived from this software. The special exception does not apply to any
20 * modifications of the software.
21 *
22 * Notwithstanding the above, under no circumstances may you combine this
23 * software in any way with any other Broadcom software provided under a license
24 * other than the GPL, without Broadcom's express prior written consent.
25 *
26 * <<Broadcom-WL-IPTag/Open:>>
27 *
28 * $Id: dhd_custom_memprealloc.c 695148 2017-04-19 04:15:17Z $
29 */
30
31 #include <linux/device.h>
32 #include <linux/slab.h>
33 #include <linux/miscdevice.h>
34 #include <linux/sched.h>
35 #include <linux/module.h>
36 #include <linux/fs.h>
37 #include <linux/list.h>
38 #include <linux/io.h>
39 #include <linux/workqueue.h>
40 #include <linux/unistd.h>
41 #include <linux/bug.h>
42 #include <linux/skbuff.h>
43 #include <linux/init.h>
44
45 #ifdef CONFIG_BROADCOM_WIFI_RESERVED_MEM
46
47 #define WLAN_STATIC_SCAN_BUF0 5
48 #define WLAN_STATIC_SCAN_BUF1 6
49 #define WLAN_STATIC_DHD_INFO_BUF 7
50 #define WLAN_STATIC_DHD_WLFC_BUF 8
51 #define WLAN_STATIC_DHD_IF_FLOW_LKUP 9
52 #define WLAN_STATIC_DHD_MEMDUMP_RAM 11
53 #define WLAN_STATIC_DHD_WLFC_HANGER 12
54 #define WLAN_STATIC_DHD_PKTID_MAP 13
55 #define WLAN_STATIC_DHD_PKTID_IOCTL_MAP 14
56 #define WLAN_STATIC_DHD_LOG_DUMP_BUF 15
57 #define WLAN_STATIC_DHD_LOG_DUMP_BUF_EX 16
58 #define WLAN_STATIC_DHD_PKTLOG_DUMP_BUF 17
59
60 #define WLAN_SCAN_BUF_SIZE (64 * 1024)
61
62 #if defined(CONFIG_64BIT)
63 #define WLAN_DHD_INFO_BUF_SIZE (32 * 1024)
64 #define WLAN_DHD_WLFC_BUF_SIZE (64 * 1024)
65 #define WLAN_DHD_IF_FLOW_LKUP_SIZE (64 * 1024)
66 #else
67 #define WLAN_DHD_INFO_BUF_SIZE (32 * 1024)
68 #define WLAN_DHD_WLFC_BUF_SIZE (16 * 1024)
69 #define WLAN_DHD_IF_FLOW_LKUP_SIZE (20 * 1024)
70 #endif /* CONFIG_64BIT */
71 /* Have 2MB ramsize to accomodate future chips */
72 #define WLAN_DHD_MEMDUMP_SIZE (2048 * 1024)
73
74 #define PREALLOC_WLAN_SEC_NUM 4
75 #define PREALLOC_WLAN_BUF_NUM 160
76 #define PREALLOC_WLAN_SECTION_HEADER 24
77
78 #ifdef CONFIG_BCMDHD_PCIE
79 #define DHD_SKB_1PAGE_BUFSIZE (PAGE_SIZE*1)
80 #define DHD_SKB_2PAGE_BUFSIZE (PAGE_SIZE*2)
81 #define DHD_SKB_4PAGE_BUFSIZE (PAGE_SIZE*4)
82
83 #define WLAN_SECTION_SIZE_0 (PREALLOC_WLAN_BUF_NUM * 128)
84 #define WLAN_SECTION_SIZE_1 0
85 #define WLAN_SECTION_SIZE_2 0
86 #define WLAN_SECTION_SIZE_3 (PREALLOC_WLAN_BUF_NUM * 1024)
87
88 #define DHD_SKB_1PAGE_BUF_NUM 0
89 #define DHD_SKB_2PAGE_BUF_NUM 128
90 #define DHD_SKB_4PAGE_BUF_NUM 0
91
92 #else
93 #define DHD_SKB_HDRSIZE 336
94 #define DHD_SKB_1PAGE_BUFSIZE ((PAGE_SIZE*1)-DHD_SKB_HDRSIZE)
95 #define DHD_SKB_2PAGE_BUFSIZE ((PAGE_SIZE*2)-DHD_SKB_HDRSIZE)
96 #define DHD_SKB_4PAGE_BUFSIZE ((PAGE_SIZE*4)-DHD_SKB_HDRSIZE)
97
98 #define WLAN_SECTION_SIZE_0 (PREALLOC_WLAN_BUF_NUM * 128)
99 #define WLAN_SECTION_SIZE_1 (PREALLOC_WLAN_BUF_NUM * 128)
100 #define WLAN_SECTION_SIZE_2 (PREALLOC_WLAN_BUF_NUM * 512)
101 #define WLAN_SECTION_SIZE_3 (PREALLOC_WLAN_BUF_NUM * 1024)
102
103 #define DHD_SKB_1PAGE_BUF_NUM 8
104 #define DHD_SKB_2PAGE_BUF_NUM 8
105 #define DHD_SKB_4PAGE_BUF_NUM 1
106 #endif /* CONFIG_BCMDHD_PCIE */
107
108 #define WLAN_SKB_1_2PAGE_BUF_NUM ((DHD_SKB_1PAGE_BUF_NUM) + \
109 (DHD_SKB_2PAGE_BUF_NUM))
110 #define WLAN_SKB_BUF_NUM ((WLAN_SKB_1_2PAGE_BUF_NUM) + \
111 (DHD_SKB_4PAGE_BUF_NUM))
112
113 #define WLAN_MAX_PKTID_ITEMS (8192)
114 #define WLAN_DHD_PKTID_MAP_HDR_SIZE (20 + 4*(WLAN_MAX_PKTID_ITEMS + 1))
115 #define WLAN_DHD_PKTID_MAP_ITEM_SIZE (32)
116 #define WLAN_DHD_PKTID_MAP_SIZE ((WLAN_DHD_PKTID_MAP_HDR_SIZE) + \
117 ((WLAN_MAX_PKTID_ITEMS+1) * WLAN_DHD_PKTID_MAP_ITEM_SIZE))
118
119 #define WLAN_MAX_PKTID_IOCTL_ITEMS (32)
120 #define WLAN_DHD_PKTID_IOCTL_MAP_HDR_SIZE (20 + 4*(WLAN_MAX_PKTID_IOCTL_ITEMS + 1))
121 #define WLAN_DHD_PKTID_IOCTL_MAP_ITEM_SIZE (32)
122 #define WLAN_DHD_PKTID_IOCTL_MAP_SIZE ((WLAN_DHD_PKTID_IOCTL_MAP_HDR_SIZE) + \
123 ((WLAN_MAX_PKTID_IOCTL_ITEMS+1) * WLAN_DHD_PKTID_IOCTL_MAP_ITEM_SIZE))
124
125 #define DHD_LOG_DUMP_BUF_SIZE (1024 * 1024 * 4)
126 #define DHD_LOG_DUMP_BUF_EX_SIZE (1024 * 1024 * 4)
127
128 #define DHD_PKTLOG_DUMP_BUF_SIZE (64 * 1024)
129
130 #define WLAN_DHD_WLFC_HANGER_MAXITEMS 3072
131 #define WLAN_DHD_WLFC_HANGER_ITEM_SIZE 32
132 #define WLAN_DHD_WLFC_HANGER_SIZE ((WLAN_DHD_WLFC_HANGER_ITEM_SIZE) + \
133 ((WLAN_DHD_WLFC_HANGER_MAXITEMS) * (WLAN_DHD_WLFC_HANGER_ITEM_SIZE)))
134
135 static struct sk_buff *wlan_static_skb[WLAN_SKB_BUF_NUM];
136
137 struct wlan_mem_prealloc {
138 void *mem_ptr;
139 unsigned long size;
140 };
141
142 static struct wlan_mem_prealloc wlan_mem_array[PREALLOC_WLAN_SEC_NUM] = {
143 {NULL, (WLAN_SECTION_SIZE_0 + PREALLOC_WLAN_SECTION_HEADER)},
144 {NULL, (WLAN_SECTION_SIZE_1 + PREALLOC_WLAN_SECTION_HEADER)},
145 {NULL, (WLAN_SECTION_SIZE_2 + PREALLOC_WLAN_SECTION_HEADER)},
146 {NULL, (WLAN_SECTION_SIZE_3 + PREALLOC_WLAN_SECTION_HEADER)}
147 };
148
149 static void *wlan_static_scan_buf0 = NULL;
150 static void *wlan_static_scan_buf1 = NULL;
151 static void *wlan_static_dhd_info_buf = NULL;
152 static void *wlan_static_dhd_wlfc_buf = NULL;
153 static void *wlan_static_if_flow_lkup = NULL;
154 static void *wlan_static_dhd_memdump_ram = NULL;
155 static void *wlan_static_dhd_wlfc_hanger = NULL;
156 static void *wlan_static_dhd_pktid_map = NULL;
157 static void *wlan_static_dhd_pktid_ioctl_map = NULL;
158 static void *wlan_static_dhd_log_dump_buf = NULL;
159 static void *wlan_static_dhd_log_dump_buf_ex = NULL;
160 static void *wlan_static_dhd_pktlog_dump_buf = NULL;
161
162 void
dhd_wlan_mem_prealloc(int section,unsigned long size)163 *dhd_wlan_mem_prealloc(int section, unsigned long size)
164 {
165 if (section == PREALLOC_WLAN_SEC_NUM) {
166 return wlan_static_skb;
167 }
168
169 if (section == WLAN_STATIC_SCAN_BUF0) {
170 return wlan_static_scan_buf0;
171 }
172
173 if (section == WLAN_STATIC_SCAN_BUF1) {
174 return wlan_static_scan_buf1;
175 }
176
177 if (section == WLAN_STATIC_DHD_INFO_BUF) {
178 if (size > WLAN_DHD_INFO_BUF_SIZE) {
179 pr_err("request DHD_INFO size(%lu) is bigger than"
180 " static size(%d).\n", size,
181 WLAN_DHD_INFO_BUF_SIZE);
182 return NULL;
183 }
184 return wlan_static_dhd_info_buf;
185 }
186
187 if (section == WLAN_STATIC_DHD_WLFC_BUF) {
188 if (size > WLAN_DHD_WLFC_BUF_SIZE) {
189 pr_err("request DHD_WLFC size(%lu) is bigger than"
190 " static size(%d).\n",
191 size, WLAN_DHD_WLFC_BUF_SIZE);
192 return NULL;
193 }
194 return wlan_static_dhd_wlfc_buf;
195 }
196
197 if (section == WLAN_STATIC_DHD_WLFC_HANGER) {
198 if (size > WLAN_DHD_WLFC_HANGER_SIZE) {
199 pr_err("request DHD_WLFC_HANGER size(%lu) is bigger than"
200 " static size(%d).\n",
201 size, WLAN_DHD_WLFC_HANGER_SIZE);
202 return NULL;
203 }
204 return wlan_static_dhd_wlfc_hanger;
205 }
206
207 if (section == WLAN_STATIC_DHD_IF_FLOW_LKUP) {
208 if (size > WLAN_DHD_IF_FLOW_LKUP_SIZE) {
209 pr_err("request DHD_WLFC size(%lu) is bigger than"
210 " static size(%d).\n",
211 size, WLAN_DHD_WLFC_BUF_SIZE);
212 return NULL;
213 }
214 return wlan_static_if_flow_lkup;
215 }
216
217 if (section == WLAN_STATIC_DHD_MEMDUMP_RAM) {
218 if (size > WLAN_DHD_MEMDUMP_SIZE) {
219 pr_err("request DHD_MEMDUMP_RAM size(%lu) is bigger"
220 " than static size(%d).\n",
221 size, WLAN_DHD_MEMDUMP_SIZE);
222 return NULL;
223 }
224 return wlan_static_dhd_memdump_ram;
225 }
226
227 if (section == WLAN_STATIC_DHD_PKTID_MAP) {
228 if (size > WLAN_DHD_PKTID_MAP_SIZE) {
229 pr_err("request DHD_PKTID_MAP size(%lu) is bigger than"
230 " static size(%d).\n",
231 size, WLAN_DHD_PKTID_MAP_SIZE);
232 return NULL;
233 }
234 return wlan_static_dhd_pktid_map;
235 }
236
237 if (section == WLAN_STATIC_DHD_PKTID_IOCTL_MAP) {
238 if (size > WLAN_DHD_PKTID_IOCTL_MAP_SIZE) {
239 pr_err("request DHD_PKTID_IOCTL_MAP size(%lu) is bigger than"
240 " static size(%d).\n",
241 size, WLAN_DHD_PKTID_IOCTL_MAP_SIZE);
242 return NULL;
243 }
244 return wlan_static_dhd_pktid_ioctl_map;
245 }
246
247 if (section == WLAN_STATIC_DHD_LOG_DUMP_BUF) {
248 if (size > DHD_LOG_DUMP_BUF_SIZE) {
249 pr_err("request DHD_LOG_DUMP_BUF size(%lu) is bigger then"
250 " static size(%d).\n",
251 size, DHD_LOG_DUMP_BUF_SIZE);
252 return NULL;
253 }
254 return wlan_static_dhd_log_dump_buf;
255 }
256
257 if (section == WLAN_STATIC_DHD_LOG_DUMP_BUF_EX) {
258 if (size > DHD_LOG_DUMP_BUF_EX_SIZE) {
259 pr_err("request DHD_LOG_DUMP_BUF_EX size(%lu) is bigger then"
260 " static size(%d).\n",
261 size, DHD_LOG_DUMP_BUF_EX_SIZE);
262 return NULL;
263 }
264 return wlan_static_dhd_log_dump_buf_ex;
265 }
266
267 if (section == WLAN_STATIC_DHD_PKTLOG_DUMP_BUF) {
268 if (size > DHD_PKTLOG_DUMP_BUF_SIZE) {
269 pr_err("request DHD_PKTLOG_DUMP_BUF size(%lu) is bigger then"
270 " static size(%d).\n",
271 size, DHD_PKTLOG_DUMP_BUF_SIZE);
272 return NULL;
273 }
274 return wlan_static_dhd_pktlog_dump_buf;
275 }
276
277 if ((section < 0) || (section >= PREALLOC_WLAN_SEC_NUM)) {
278 return NULL;
279 }
280
281 if (wlan_mem_array[section].size < size) {
282 return NULL;
283 }
284
285 return wlan_mem_array[section].mem_ptr;
286 }
287 EXPORT_SYMBOL(dhd_wlan_mem_prealloc);
288
289 int
dhd_init_wlan_mem(void)290 dhd_init_wlan_mem(void)
291 {
292 int i;
293 int j;
294
295 #if !defined(CONFIG_BCMDHD_PCIE)
296 for (i = 0; i < DHD_SKB_1PAGE_BUF_NUM; i++) {
297 wlan_static_skb[i] = __dev_alloc_skb(DHD_SKB_1PAGE_BUFSIZE, GFP_KERNEL);
298 if (!wlan_static_skb[i]) {
299 goto err_skb_alloc;
300 }
301 }
302 #endif /* !CONFIG_BCMDHD_PCIE */
303
304 for (i = DHD_SKB_1PAGE_BUF_NUM; i < WLAN_SKB_1_2PAGE_BUF_NUM; i++) {
305 wlan_static_skb[i] = __dev_alloc_skb(DHD_SKB_2PAGE_BUFSIZE, GFP_KERNEL);
306 if (!wlan_static_skb[i]) {
307 goto err_skb_alloc;
308 }
309 }
310
311 #if !defined(CONFIG_BCMDHD_PCIE)
312 wlan_static_skb[i] = __dev_alloc_skb(DHD_SKB_4PAGE_BUFSIZE, GFP_KERNEL);
313 if (!wlan_static_skb[i]) {
314 goto err_skb_alloc;
315 }
316 #endif /* !CONFIG_BCMDHD_PCIE */
317
318 for (i = 0; i < PREALLOC_WLAN_SEC_NUM; i++) {
319 if (wlan_mem_array[i].size > 0) {
320 wlan_mem_array[i].mem_ptr =
321 kmalloc(wlan_mem_array[i].size, GFP_KERNEL);
322
323 if (!wlan_mem_array[i].mem_ptr) {
324 goto err_mem_alloc;
325 }
326 }
327 }
328
329 wlan_static_scan_buf0 = kmalloc(WLAN_SCAN_BUF_SIZE, GFP_KERNEL);
330 if (!wlan_static_scan_buf0) {
331 pr_err("Failed to alloc wlan_static_scan_buf0\n");
332 goto err_mem_alloc;
333 }
334
335 wlan_static_scan_buf1 = kmalloc(WLAN_SCAN_BUF_SIZE, GFP_KERNEL);
336 if (!wlan_static_scan_buf1) {
337 pr_err("Failed to alloc wlan_static_scan_buf1\n");
338 goto err_mem_alloc;
339 }
340
341 wlan_static_dhd_log_dump_buf = kmalloc(DHD_LOG_DUMP_BUF_SIZE, GFP_KERNEL);
342 if (!wlan_static_dhd_log_dump_buf) {
343 pr_err("Failed to alloc wlan_static_dhd_log_dump_buf\n");
344 goto err_mem_alloc;
345 }
346
347 wlan_static_dhd_log_dump_buf_ex = kmalloc(DHD_LOG_DUMP_BUF_EX_SIZE, GFP_KERNEL);
348 if (!wlan_static_dhd_log_dump_buf_ex) {
349 pr_err("Failed to alloc wlan_static_dhd_log_dump_buf_ex\n");
350 goto err_mem_alloc;
351 }
352
353 wlan_static_dhd_info_buf = kmalloc(WLAN_DHD_INFO_BUF_SIZE, GFP_KERNEL);
354 if (!wlan_static_dhd_info_buf) {
355 pr_err("Failed to alloc wlan_static_dhd_info_buf\n");
356 goto err_mem_alloc;
357 }
358
359 #ifdef CONFIG_BCMDHD_PCIE
360 wlan_static_if_flow_lkup = kmalloc(WLAN_DHD_IF_FLOW_LKUP_SIZE,
361 GFP_KERNEL);
362 if (!wlan_static_if_flow_lkup) {
363 pr_err("Failed to alloc wlan_static_if_flow_lkup\n");
364 goto err_mem_alloc;
365 }
366
367 #ifdef CONFIG_BCMDHD_PREALLOC_PKTIDMAP
368 wlan_static_dhd_pktid_map = kmalloc(WLAN_DHD_PKTID_MAP_SIZE,
369 GFP_KERNEL);
370 if (!wlan_static_dhd_pktid_map) {
371 pr_err("Failed to alloc wlan_static_dhd_pktid_map\n");
372 goto err_mem_alloc;
373 }
374
375 wlan_static_dhd_pktid_ioctl_map = kmalloc(WLAN_DHD_PKTID_IOCTL_MAP_SIZE,
376 GFP_KERNEL);
377 if (!wlan_static_dhd_pktid_ioctl_map) {
378 pr_err("Failed to alloc wlan_static_dhd_pktid_ioctl_map\n");
379 goto err_mem_alloc;
380 }
381 #endif /* CONFIG_BCMDHD_PREALLOC_PKTIDMAP */
382 #else
383 wlan_static_dhd_wlfc_buf = kmalloc(WLAN_DHD_WLFC_BUF_SIZE,
384 GFP_KERNEL);
385 if (!wlan_static_dhd_wlfc_buf) {
386 pr_err("Failed to alloc wlan_static_dhd_wlfc_buf\n");
387 goto err_mem_alloc;
388 }
389
390 wlan_static_dhd_wlfc_hanger = kmalloc(WLAN_DHD_WLFC_HANGER_SIZE,
391 GFP_KERNEL);
392 if (!wlan_static_dhd_wlfc_hanger) {
393 pr_err("Failed to alloc wlan_static_dhd_wlfc_hanger\n");
394 goto err_mem_alloc;
395 }
396 #endif /* CONFIG_BCMDHD_PCIE */
397
398 #ifdef CONFIG_BCMDHD_PREALLOC_MEMDUMP
399 wlan_static_dhd_memdump_ram = kmalloc(WLAN_DHD_MEMDUMP_SIZE, GFP_KERNEL);
400 if (!wlan_static_dhd_memdump_ram) {
401 pr_err("Failed to alloc wlan_static_dhd_memdump_ram\n");
402 goto err_mem_alloc;
403 }
404 #endif /* CONFIG_BCMDHD_PREALLOC_MEMDUMP */
405
406 wlan_static_dhd_pktlog_dump_buf = kmalloc(DHD_PKTLOG_DUMP_BUF_SIZE, GFP_KERNEL);
407 if (!wlan_static_dhd_pktlog_dump_buf) {
408 pr_err("Failed to alloc wlan_static_dhd_pktlog_dump_buf\n");
409 goto err_mem_alloc;
410 }
411
412 pr_err("%s: WIFI MEM Allocated\n", __FUNCTION__);
413 return 0;
414
415 err_mem_alloc:
416 #ifdef CONFIG_BCMDHD_PREALLOC_MEMDUMP
417 if (wlan_static_dhd_memdump_ram) {
418 kfree(wlan_static_dhd_memdump_ram);
419 }
420
421 #endif /* CONFIG_BCMDHD_PREALLOC_MEMDUMP */
422
423 #ifdef CONFIG_BCMDHD_PCIE
424 if (wlan_static_if_flow_lkup) {
425 kfree(wlan_static_if_flow_lkup);
426 }
427
428 #ifdef CONFIG_BCMDHD_PREALLOC_PKTIDMAP
429 if (wlan_static_dhd_pktid_map) {
430 kfree(wlan_static_dhd_pktid_map);
431 }
432
433 if (wlan_static_dhd_pktid_ioctl_map) {
434 kfree(wlan_static_dhd_pktid_ioctl_map);
435 }
436 #endif /* CONFIG_BCMDHD_PREALLOC_PKTIDMAP */
437 #else
438 if (wlan_static_dhd_wlfc_buf) {
439 kfree(wlan_static_dhd_wlfc_buf);
440 }
441
442 if (wlan_static_dhd_wlfc_hanger) {
443 kfree(wlan_static_dhd_wlfc_hanger);
444 }
445 #endif /* CONFIG_BCMDHD_PCIE */
446 if (wlan_static_dhd_info_buf) {
447 kfree(wlan_static_dhd_info_buf);
448 }
449
450 if (wlan_static_dhd_log_dump_buf) {
451 kfree(wlan_static_dhd_log_dump_buf);
452 }
453
454 if (wlan_static_dhd_log_dump_buf_ex) {
455 kfree(wlan_static_dhd_log_dump_buf_ex);
456 }
457
458 if (wlan_static_scan_buf1) {
459 kfree(wlan_static_scan_buf1);
460 }
461
462 if (wlan_static_scan_buf0) {
463 kfree(wlan_static_scan_buf0);
464 }
465
466 if (wlan_static_dhd_pktlog_dump_buf) {
467 kfree(wlan_static_dhd_pktlog_dump_buf);
468 }
469
470 pr_err("Failed to mem_alloc for WLAN\n");
471
472 for (j = 0; j < i; j++) {
473 kfree(wlan_mem_array[j].mem_ptr);
474 }
475
476 i = WLAN_SKB_BUF_NUM;
477
478 err_skb_alloc:
479 pr_err("Failed to skb_alloc for WLAN\n");
480 for (j = 0; j < i; j++) {
481 dev_kfree_skb(wlan_static_skb[j]);
482 }
483
484 return -ENOMEM;
485 }
486 EXPORT_SYMBOL(dhd_init_wlan_mem);
487
488 void
dhd_exit_wlan_mem(void)489 dhd_exit_wlan_mem(void)
490 {
491 int i = 0;
492
493 #ifdef CONFIG_BCMDHD_PREALLOC_MEMDUMP
494 if (wlan_static_dhd_memdump_ram) {
495 kfree(wlan_static_dhd_memdump_ram);
496 }
497
498 #endif /* CONFIG_BCMDHD_PREALLOC_MEMDUMP */
499
500 #ifdef CONFIG_BCMDHD_PCIE
501 if (wlan_static_if_flow_lkup) {
502 kfree(wlan_static_if_flow_lkup);
503 }
504
505 #ifdef CONFIG_BCMDHD_PREALLOC_PKTIDMAP
506 if (wlan_static_dhd_pktid_map) {
507 kfree(wlan_static_dhd_pktid_map);
508 }
509
510 if (wlan_static_dhd_pktid_ioctl_map) {
511 kfree(wlan_static_dhd_pktid_ioctl_map);
512 }
513 #endif /* CONFIG_BCMDHD_PREALLOC_PKTIDMAP */
514 #else
515 if (wlan_static_dhd_wlfc_buf) {
516 kfree(wlan_static_dhd_wlfc_buf);
517 }
518
519 if (wlan_static_dhd_wlfc_hanger) {
520 kfree(wlan_static_dhd_wlfc_hanger);
521 }
522 #endif /* CONFIG_BCMDHD_PCIE */
523 if (wlan_static_dhd_info_buf) {
524 kfree(wlan_static_dhd_info_buf);
525 }
526
527 if (wlan_static_dhd_log_dump_buf) {
528 kfree(wlan_static_dhd_log_dump_buf);
529 }
530
531 if (wlan_static_dhd_log_dump_buf_ex) {
532 kfree(wlan_static_dhd_log_dump_buf_ex);
533 }
534
535 if (wlan_static_scan_buf1) {
536 kfree(wlan_static_scan_buf1);
537 }
538
539 if (wlan_static_scan_buf0) {
540 kfree(wlan_static_scan_buf0);
541 }
542
543 if (wlan_static_dhd_pktlog_dump_buf) {
544 kfree(wlan_static_dhd_pktlog_dump_buf);
545 }
546
547 pr_err("Failed to mem_alloc for WLAN\n");
548
549 for (i = 0; i < PREALLOC_WLAN_SEC_NUM; i++) {
550 if (wlan_mem_array[i].mem_ptr) {
551 kfree(wlan_mem_array[i].mem_ptr);
552 }
553 }
554
555 pr_err("Failed to skb_alloc for WLAN\n");
556 for (i = 0; i < WLAN_SKB_BUF_NUM; i++) {
557 dev_kfree_skb(wlan_static_skb[i]);
558 }
559
560 return;
561 }
562 EXPORT_SYMBOL(dhd_exit_wlan_mem);
563 #endif /* CONFIG_BROADCOM_WIFI_RESERVED_MEM */
564