blob: fee2836df499e8b6c8ac9193fa4fedce524a2e34 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Hanumantha Reddy Pothula72342952015-02-26 14:43:54 +05302 * Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
Kiet Lam1ed83fc2014-02-19 01:15:45 -08003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
Gopichand Nakkala92f07d82013-01-08 21:16:34 -080020 */
Kiet Lam1ed83fc2014-02-19 01:15:45 -080021
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
Jeff Johnson295189b2012-06-20 16:38:30 -070028/*===========================================================================
29 @file vos_memory.c
30
31 @brief Virtual Operating System Services Memory API
32
33
Jeff Johnson295189b2012-06-20 16:38:30 -070034===========================================================================*/
35
36/*===========================================================================
37
38 EDIT HISTORY FOR FILE
39
40
41 This section contains comments describing changes made to the module.
42 Notice that changes are listed in reverse chronological order.
43
44
45 $Header:$ $DateTime: $ $Author: $
46
47
48 when who what, where, why
49 -------- --- --------------------------------------------------------
50
51===========================================================================*/
52
53/*---------------------------------------------------------------------------
54 * Include Files
55 * ------------------------------------------------------------------------*/
Jeff Johnson295189b2012-06-20 16:38:30 -070056#include "vos_memory.h"
57#include "vos_trace.h"
Hanumantha Reddy Pothula72342952015-02-26 14:43:54 +053058#include <vmalloc.h>
Jeff Johnson295189b2012-06-20 16:38:30 -070059
Mohit Khanna49a87a82012-09-11 18:03:14 -070060#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
61#include <linux/wcnss_wlan.h>
62#define WCNSS_PRE_ALLOC_GET_THRESHOLD (4*1024)
63#endif
64
Jeff Johnson295189b2012-06-20 16:38:30 -070065#ifdef MEMORY_DEBUG
66#include "wlan_hdd_dp_utils.h"
67
68hdd_list_t vosMemList;
69
70static v_U8_t WLAN_MEM_HEADER[] = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68 };
71static v_U8_t WLAN_MEM_TAIL[] = {0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87};
Arif Hussaind5218912013-12-05 01:10:55 -080072static int memory_dbug_flag;
Jeff Johnson295189b2012-06-20 16:38:30 -070073
74struct s_vos_mem_struct
75{
76 hdd_list_node_t pNode;
77 char* fileName;
78 unsigned int lineNum;
79 unsigned int size;
80 v_U8_t header[8];
81};
82#endif
83
84/*---------------------------------------------------------------------------
85 * Preprocessor Definitions and Constants
86 * ------------------------------------------------------------------------*/
87
88/*---------------------------------------------------------------------------
89 * Type Declarations
90 * ------------------------------------------------------------------------*/
91
92/*---------------------------------------------------------------------------
93 * Data definitions
94 * ------------------------------------------------------------------------*/
95
96/*---------------------------------------------------------------------------
97 * External Function implementation
98 * ------------------------------------------------------------------------*/
99#ifdef MEMORY_DEBUG
100void vos_mem_init()
101{
102 /* Initalizing the list with maximum size of 60000 */
103 hdd_list_init(&vosMemList, 60000);
Arif Hussaind5218912013-12-05 01:10:55 -0800104 memory_dbug_flag = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -0700105 return;
106}
107
108void vos_mem_clean()
109{
110 v_SIZE_t listSize;
111 hdd_list_size(&vosMemList, &listSize);
112
113 if(listSize)
114 {
115 hdd_list_node_t* pNode;
116 VOS_STATUS vosStatus;
117
118 struct s_vos_mem_struct* memStruct;
Manjunathappa Prakash0e7e3472013-11-22 15:38:14 -0800119 char* prev_mleak_file = "";
120 unsigned int prev_mleak_lineNum = 0;
121 unsigned int prev_mleak_sz = 0;
122 unsigned int mleak_cnt = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700123
124 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700125 "%s: List is not Empty. listSize %d ", __func__, (int)listSize);
Jeff Johnson295189b2012-06-20 16:38:30 -0700126
127 do
128 {
129 spin_lock(&vosMemList.lock);
130 vosStatus = hdd_list_remove_front(&vosMemList, &pNode);
131 spin_unlock(&vosMemList.lock);
132 if(VOS_STATUS_SUCCESS == vosStatus)
133 {
134 memStruct = (struct s_vos_mem_struct*)pNode;
Manjunathappa Prakash0e7e3472013-11-22 15:38:14 -0800135
136 /* Take care to log only once multiple memory leaks from
137 * the same place */
138 if(strcmp(prev_mleak_file, memStruct->fileName) ||
139 (prev_mleak_lineNum != memStruct->lineNum) ||
140 (prev_mleak_sz != memStruct->size))
141 {
142 if(mleak_cnt != 0)
143 {
144 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
145 "%d Time Memory Leak@ File %s, @Line %d, size %d",
146 mleak_cnt, prev_mleak_file, prev_mleak_lineNum,
147 prev_mleak_sz);
148 }
149 prev_mleak_file = memStruct->fileName;
150 prev_mleak_lineNum = memStruct->lineNum;
151 prev_mleak_sz = memStruct->size;
152 mleak_cnt = 0;
153 }
154 mleak_cnt++;
155
Jeff Johnson295189b2012-06-20 16:38:30 -0700156 kfree((v_VOID_t*)memStruct);
157 }
158 }while(vosStatus == VOS_STATUS_SUCCESS);
lukez092ea1a2013-03-15 14:53:55 -0700159
Manjunathappa Prakash0e7e3472013-11-22 15:38:14 -0800160 /* Print last memory leak from the module */
161 if(mleak_cnt)
162 {
163 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
164 "%d Time memory Leak@ File %s, @Line %d, size %d",
165 mleak_cnt, prev_mleak_file, prev_mleak_lineNum,
166 prev_mleak_sz);
167 }
168
169
lukez092ea1a2013-03-15 14:53:55 -0700170#ifdef CONFIG_HALT_KMEMLEAK
171 BUG_ON(0);
172#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700173 }
174}
175
176void vos_mem_exit()
177{
Arif Hussaind5218912013-12-05 01:10:55 -0800178 if (memory_dbug_flag)
179 {
180 vos_mem_clean();
181 hdd_list_destroy(&vosMemList);
182 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700183}
184
185v_VOID_t * vos_mem_malloc_debug( v_SIZE_t size, char* fileName, v_U32_t lineNum)
186{
187 struct s_vos_mem_struct* memStruct;
188 v_VOID_t* memPtr = NULL;
189 v_SIZE_t new_size;
Atul Mittal93d46592014-03-14 13:42:06 +0530190 int flags = GFP_KERNEL;
191 unsigned long IrqFlags;
192
Jeff Johnson295189b2012-06-20 16:38:30 -0700193
194 if (size > (1024*1024))
195 {
196 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700197 "%s: called with arg > 1024K; passed in %d !!!", __func__,size);
Jeff Johnson295189b2012-06-20 16:38:30 -0700198 return NULL;
199 }
Madan Mohan Koyyalamudi5c0fe232013-09-16 22:21:26 +0530200
Jeff Johnson295189b2012-06-20 16:38:30 -0700201 if (in_interrupt())
202 {
Atul Mittal1119d0b2014-03-25 12:14:37 +0530203 flags = GFP_ATOMIC;
Jeff Johnson295189b2012-06-20 16:38:30 -0700204 }
205
Arif Hussaind5218912013-12-05 01:10:55 -0800206 if (!memory_dbug_flag)
207 {
208#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
209 v_VOID_t* pmem;
210 if (size > WCNSS_PRE_ALLOC_GET_THRESHOLD)
211 {
212 pmem = wcnss_prealloc_get(size);
213 if (NULL != pmem)
214 return pmem;
215 }
216#endif
Atul Mittal93d46592014-03-14 13:42:06 +0530217 return kmalloc(size, flags);
Arif Hussaind5218912013-12-05 01:10:55 -0800218 }
219
Jeff Johnson295189b2012-06-20 16:38:30 -0700220 new_size = size + sizeof(struct s_vos_mem_struct) + 8;
221
Atul Mittal93d46592014-03-14 13:42:06 +0530222 memStruct = (struct s_vos_mem_struct*)kmalloc(new_size, flags);
Jeff Johnson295189b2012-06-20 16:38:30 -0700223
224 if(memStruct != NULL)
225 {
226 VOS_STATUS vosStatus;
227
228 memStruct->fileName = fileName;
229 memStruct->lineNum = lineNum;
230 memStruct->size = size;
231
232 vos_mem_copy(&memStruct->header[0], &WLAN_MEM_HEADER[0], sizeof(WLAN_MEM_HEADER));
233 vos_mem_copy( (v_U8_t*)(memStruct + 1) + size, &WLAN_MEM_TAIL[0], sizeof(WLAN_MEM_TAIL));
234
Atul Mittal93d46592014-03-14 13:42:06 +0530235 spin_lock_irqsave(&vosMemList.lock, IrqFlags);
Jeff Johnson295189b2012-06-20 16:38:30 -0700236 vosStatus = hdd_list_insert_front(&vosMemList, &memStruct->pNode);
Atul Mittal93d46592014-03-14 13:42:06 +0530237 spin_unlock_irqrestore(&vosMemList.lock, IrqFlags);
Jeff Johnson295189b2012-06-20 16:38:30 -0700238 if(VOS_STATUS_SUCCESS != vosStatus)
239 {
240 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain02882402013-11-17 21:55:29 -0800241 "%s: Unable to insert node into List vosStatus %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700242 }
243
244 memPtr = (v_VOID_t*)(memStruct + 1);
245 }
246 return memPtr;
247}
248
249v_VOID_t vos_mem_free( v_VOID_t *ptr )
250{
Madan Mohan Koyyalamudi5c0fe232013-09-16 22:21:26 +0530251
Atul Mittal93d46592014-03-14 13:42:06 +0530252 unsigned long IrqFlags;
Arif Hussaind5218912013-12-05 01:10:55 -0800253 if (ptr == NULL)
254 return;
255
Arif Hussaind5218912013-12-05 01:10:55 -0800256 if (!memory_dbug_flag)
257 {
258#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
259 if (wcnss_prealloc_put(ptr))
260 return;
261#endif
262 kfree(ptr);
263 }
264 else
Jeff Johnson295189b2012-06-20 16:38:30 -0700265 {
266 VOS_STATUS vosStatus;
267 struct s_vos_mem_struct* memStruct = ((struct s_vos_mem_struct*)ptr) - 1;
268
Atul Mittal93d46592014-03-14 13:42:06 +0530269 spin_lock_irqsave(&vosMemList.lock, IrqFlags);
Jeff Johnson295189b2012-06-20 16:38:30 -0700270 vosStatus = hdd_list_remove_node(&vosMemList, &memStruct->pNode);
Atul Mittal1119d0b2014-03-25 12:14:37 +0530271 spin_unlock_irqrestore(&vosMemList.lock, IrqFlags);
Jeff Johnson295189b2012-06-20 16:38:30 -0700272
273 if(VOS_STATUS_SUCCESS == vosStatus)
274 {
275 if(0 == vos_mem_compare(memStruct->header, &WLAN_MEM_HEADER[0], sizeof(WLAN_MEM_HEADER)) )
276 {
277 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
278 "Memory Header is corrupted. MemInfo: Filename %s, LineNum %d",
279 memStruct->fileName, (int)memStruct->lineNum);
280 }
281 if(0 == vos_mem_compare( (v_U8_t*)ptr + memStruct->size, &WLAN_MEM_TAIL[0], sizeof(WLAN_MEM_TAIL ) ) )
282 {
283 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
284 "Memory Trailer is corrupted. MemInfo: Filename %s, LineNum %d",
285 memStruct->fileName, (int)memStruct->lineNum);
286 }
287 kfree((v_VOID_t*)memStruct);
288 }
289 else
290 {
291 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700292 "%s: Unallocated memory (double free?)", __func__);
Pradeep Kumar Goudaguntab6c426a2014-03-19 16:23:44 +0530293 VOS_BUG(0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700294 }
295 }
296}
297#else
298v_VOID_t * vos_mem_malloc( v_SIZE_t size )
299{
Atul Mittal93d46592014-03-14 13:42:06 +0530300 int flags = GFP_KERNEL;
Mohit Khanna49a87a82012-09-11 18:03:14 -0700301#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
302 v_VOID_t* pmem;
303#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700304 if (size > (1024*1024))
305 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700306 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s: called with arg > 1024K; passed in %d !!!", __func__,size);
Jeff Johnson295189b2012-06-20 16:38:30 -0700307 return NULL;
308 }
Atul Mittal93d46592014-03-14 13:42:06 +0530309 if (in_interrupt() || irqs_disabled() || in_atomic())
Jeff Johnson295189b2012-06-20 16:38:30 -0700310 {
Atul Mittal93d46592014-03-14 13:42:06 +0530311 flags = GFP_ATOMIC;
Jeff Johnson295189b2012-06-20 16:38:30 -0700312 }
Mohit Khanna49a87a82012-09-11 18:03:14 -0700313#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
314 if(size > WCNSS_PRE_ALLOC_GET_THRESHOLD)
315 {
316 pmem = wcnss_prealloc_get(size);
317 if(NULL != pmem)
318 return pmem;
319 }
320#endif
Atul Mittal93d46592014-03-14 13:42:06 +0530321 return kmalloc(size, flags);
Jeff Johnson295189b2012-06-20 16:38:30 -0700322}
323
324v_VOID_t vos_mem_free( v_VOID_t *ptr )
325{
326 if (ptr == NULL)
327 return;
Mohit Khanna49a87a82012-09-11 18:03:14 -0700328
Mohit Khanna49a87a82012-09-11 18:03:14 -0700329#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
330 if(wcnss_prealloc_put(ptr))
331 return;
332#endif
333
Jeff Johnson295189b2012-06-20 16:38:30 -0700334 kfree(ptr);
335}
336#endif
337
Hanumantha Reddy Pothula72342952015-02-26 14:43:54 +0530338v_VOID_t * vos_mem_vmalloc(v_SIZE_t size)
339{
340 if (size == 0 || size >= (1024*1024))
341 {
342 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
343 "%s invalid size: %u", __func__, size);
344 return NULL;
345 }
346
347 return vmalloc(size);
348}
349
350v_VOID_t vos_mem_vfree(void *addr)
351{
352 if (addr == NULL)
353 {
354 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
355 "%s NULL address passed to free", __func__);
356 return;
357 }
358
359 vfree(addr);
360 return;
361}
362
Jeff Johnson295189b2012-06-20 16:38:30 -0700363v_VOID_t vos_mem_set( v_VOID_t *ptr, v_SIZE_t numBytes, v_BYTE_t value )
364{
365 if (ptr == NULL)
366 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700367 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s called with NULL parameter ptr", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700368 return;
369 }
370 memset(ptr, value, numBytes);
371}
372
373v_VOID_t vos_mem_zero( v_VOID_t *ptr, v_SIZE_t numBytes )
374{
375 if (0 == numBytes)
376 {
377 // special case where ptr can be NULL
378 return;
379 }
380
381 if (ptr == NULL)
382 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700383 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s called with NULL parameter ptr", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700384 return;
385 }
386 memset(ptr, 0, numBytes);
387
388}
389
Jeff Johnson295189b2012-06-20 16:38:30 -0700390v_VOID_t vos_mem_copy( v_VOID_t *pDst, const v_VOID_t *pSrc, v_SIZE_t numBytes )
391{
392 if (0 == numBytes)
393 {
394 // special case where pDst or pSrc can be NULL
395 return;
396 }
397
398 if ((pDst == NULL) || (pSrc==NULL))
399 {
400 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
401 "%s called with NULL parameter, source:%p destination:%p",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700402 __func__, pSrc, pDst);
Jeff Johnson295189b2012-06-20 16:38:30 -0700403 VOS_ASSERT(0);
404 return;
405 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700406 memcpy(pDst, pSrc, numBytes);
Jeff Johnson295189b2012-06-20 16:38:30 -0700407}
408
409v_VOID_t vos_mem_move( v_VOID_t *pDst, const v_VOID_t *pSrc, v_SIZE_t numBytes )
410{
411 if (0 == numBytes)
412 {
413 // special case where pDst or pSrc can be NULL
414 return;
415 }
416
417 if ((pDst == NULL) || (pSrc==NULL))
418 {
419 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
420 "%s called with NULL parameter, source:%p destination:%p",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700421 __func__, pSrc, pDst);
Jeff Johnson295189b2012-06-20 16:38:30 -0700422 VOS_ASSERT(0);
423 return;
424 }
425 memmove(pDst, pSrc, numBytes);
426}
427
428v_BOOL_t vos_mem_compare( v_VOID_t *pMemory1, v_VOID_t *pMemory2, v_U32_t numBytes )
429{
430 if (0 == numBytes)
431 {
432 // special case where pMemory1 or pMemory2 can be NULL
433 return VOS_TRUE;
434 }
435
436 if ((pMemory1 == NULL) || (pMemory2==NULL))
437 {
438 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
439 "%s called with NULL parameter, p1:%p p2:%p",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700440 __func__, pMemory1, pMemory2);
Jeff Johnson295189b2012-06-20 16:38:30 -0700441 VOS_ASSERT(0);
442 return VOS_FALSE;
443 }
444 return (memcmp(pMemory1, pMemory2, numBytes)?VOS_FALSE:VOS_TRUE);
445}
446
447
448v_SINT_t vos_mem_compare2( v_VOID_t *pMemory1, v_VOID_t *pMemory2, v_U32_t numBytes )
449
450{
451 return( (v_SINT_t) memcmp( pMemory1, pMemory2, numBytes ) );
452}
453
454/*----------------------------------------------------------------------------
455
456 \brief vos_mem_dma_malloc() - vOSS DMA Memory Allocation
457
458 This function will dynamicallly allocate the specified number of bytes of
459 memory. This memory will have special attributes making it DMA friendly i.e.
460 it will exist in contiguous, 32-byte aligned uncached memory. A normal
461 vos_mem_malloc does not yield memory with these attributes.
462
463 NOTE: the special DMA friendly memory is very scarce and this API must be
464 used sparingly
465
466 On WM, there is nothing special about this memory. SDHC allocates the
467 DMA friendly buffer and copies the data into it
468
469 \param size - the number of bytes of memory to allocate.
470
471 \return Upon successful allocate, returns a non-NULL pointer to the
472 allocated memory. If this function is unable to allocate the amount of
473 memory specified (for any reason) it returns NULL.
474
475 \sa
476
477 --------------------------------------------------------------------------*/
478#ifdef MEMORY_DEBUG
479v_VOID_t * vos_mem_dma_malloc_debug( v_SIZE_t size, char* fileName, v_U32_t lineNum)
480{
481 struct s_vos_mem_struct* memStruct;
482 v_VOID_t* memPtr = NULL;
483 v_SIZE_t new_size;
484
485 if (in_interrupt())
486 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700487 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s cannot be called from interrupt context!!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700488 return NULL;
489 }
490
Arif Hussaind5218912013-12-05 01:10:55 -0800491 if (!memory_dbug_flag)
492 return kmalloc(size, GFP_KERNEL);
493
Jeff Johnson295189b2012-06-20 16:38:30 -0700494 new_size = size + sizeof(struct s_vos_mem_struct) + 8;
495
496 memStruct = (struct s_vos_mem_struct*)kmalloc(new_size,GFP_KERNEL);
497
498 if(memStruct != NULL)
499 {
500 VOS_STATUS vosStatus;
501
502 memStruct->fileName = fileName;
503 memStruct->lineNum = lineNum;
504 memStruct->size = size;
505
506 vos_mem_copy(&memStruct->header[0], &WLAN_MEM_HEADER[0], sizeof(WLAN_MEM_HEADER));
507 vos_mem_copy( (v_U8_t*)(memStruct + 1) + size, &WLAN_MEM_TAIL[0], sizeof(WLAN_MEM_TAIL));
508
509 spin_lock(&vosMemList.lock);
510 vosStatus = hdd_list_insert_front(&vosMemList, &memStruct->pNode);
511 spin_unlock(&vosMemList.lock);
512 if(VOS_STATUS_SUCCESS != vosStatus)
513 {
514 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain02882402013-11-17 21:55:29 -0800515 "%s: Unable to insert node into List vosStatus %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700516 }
517
518 memPtr = (v_VOID_t*)(memStruct + 1);
519 }
520
521 return memPtr;
522}
523
524v_VOID_t vos_mem_dma_free( v_VOID_t *ptr )
525{
Arif Hussaind5218912013-12-05 01:10:55 -0800526 if (ptr == NULL)
527 return;
528
529 if (memory_dbug_flag)
Jeff Johnson295189b2012-06-20 16:38:30 -0700530 {
531 VOS_STATUS vosStatus;
532 struct s_vos_mem_struct* memStruct = ((struct s_vos_mem_struct*)ptr) - 1;
533
534 spin_lock(&vosMemList.lock);
535 vosStatus = hdd_list_remove_node(&vosMemList, &memStruct->pNode);
536 spin_unlock(&vosMemList.lock);
537
538 if(VOS_STATUS_SUCCESS == vosStatus)
539 {
540 if(0 == vos_mem_compare(memStruct->header, &WLAN_MEM_HEADER[0], sizeof(WLAN_MEM_HEADER)) )
541 {
542 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
543 "Memory Header is corrupted. MemInfo: Filename %s, LineNum %d",
544 memStruct->fileName, (int)memStruct->lineNum);
545 }
546 if(0 == vos_mem_compare( (v_U8_t*)ptr + memStruct->size, &WLAN_MEM_TAIL[0], sizeof(WLAN_MEM_TAIL ) ) )
547 {
548 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
549 "Memory Trailer is corrupted. MemInfo: Filename %s, LineNum %d",
550 memStruct->fileName, (int)memStruct->lineNum);
551 }
552 kfree((v_VOID_t*)memStruct);
553 }
554 }
Arif Hussaind5218912013-12-05 01:10:55 -0800555 else
556 kfree(ptr);
Jeff Johnson295189b2012-06-20 16:38:30 -0700557}
558#else
559v_VOID_t* vos_mem_dma_malloc( v_SIZE_t size )
560{
561 if (in_interrupt())
562 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700563 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s cannot be called from interrupt context!!!", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700564 return NULL;
565 }
566 return kmalloc(size, GFP_KERNEL);
567}
568
569/*----------------------------------------------------------------------------
570
571 \brief vos_mem_dma_free() - vOSS DMA Free Memory
572
573 This function will free special DMA friendly memory pointed to by 'ptr'.
574
575 On WM, there is nothing special about the memory being free'd. SDHC will
576 take care of free'ing the DMA friendly buffer
577
578 \param ptr - pointer to the starting address of the memory to be
579 free'd.
580
581 \return Nothing
582
583 \sa
584
585 --------------------------------------------------------------------------*/
586v_VOID_t vos_mem_dma_free( v_VOID_t *ptr )
587{
588 if (ptr == NULL)
589 return;
590 kfree(ptr);
591}
592#endif