blob: 7690c1beb9570a95191a2a5573d6d5880b681719 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Pradeep Kumar Goudaguntab6c426a2014-03-19 16:23:44 +05302 * Copyright (c) 2012-2014 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
34 Copyright (c) 2008 QUALCOMM Incorporated.
35 All Rights Reserved.
36 Qualcomm Confidential and Proprietary
37===========================================================================*/
38
39/*===========================================================================
40
41 EDIT HISTORY FOR FILE
42
43
44 This section contains comments describing changes made to the module.
45 Notice that changes are listed in reverse chronological order.
46
47
48 $Header:$ $DateTime: $ $Author: $
49
50
51 when who what, where, why
52 -------- --- --------------------------------------------------------
53
54===========================================================================*/
55
56/*---------------------------------------------------------------------------
57 * Include Files
58 * ------------------------------------------------------------------------*/
Jeff Johnson295189b2012-06-20 16:38:30 -070059#include "vos_memory.h"
60#include "vos_trace.h"
61
Mohit Khanna49a87a82012-09-11 18:03:14 -070062#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
63#include <linux/wcnss_wlan.h>
64#define WCNSS_PRE_ALLOC_GET_THRESHOLD (4*1024)
65#endif
66
Jeff Johnson295189b2012-06-20 16:38:30 -070067#ifdef MEMORY_DEBUG
68#include "wlan_hdd_dp_utils.h"
69
70hdd_list_t vosMemList;
71
72static v_U8_t WLAN_MEM_HEADER[] = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68 };
73static v_U8_t WLAN_MEM_TAIL[] = {0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87};
Arif Hussaind5218912013-12-05 01:10:55 -080074static int memory_dbug_flag;
Jeff Johnson295189b2012-06-20 16:38:30 -070075
76struct s_vos_mem_struct
77{
78 hdd_list_node_t pNode;
79 char* fileName;
80 unsigned int lineNum;
81 unsigned int size;
82 v_U8_t header[8];
83};
84#endif
85
86/*---------------------------------------------------------------------------
87 * Preprocessor Definitions and Constants
88 * ------------------------------------------------------------------------*/
89
90/*---------------------------------------------------------------------------
91 * Type Declarations
92 * ------------------------------------------------------------------------*/
93
94/*---------------------------------------------------------------------------
95 * Data definitions
96 * ------------------------------------------------------------------------*/
97
98/*---------------------------------------------------------------------------
99 * External Function implementation
100 * ------------------------------------------------------------------------*/
101#ifdef MEMORY_DEBUG
102void vos_mem_init()
103{
104 /* Initalizing the list with maximum size of 60000 */
105 hdd_list_init(&vosMemList, 60000);
Arif Hussaind5218912013-12-05 01:10:55 -0800106 memory_dbug_flag = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -0700107 return;
108}
109
110void vos_mem_clean()
111{
112 v_SIZE_t listSize;
113 hdd_list_size(&vosMemList, &listSize);
114
115 if(listSize)
116 {
117 hdd_list_node_t* pNode;
118 VOS_STATUS vosStatus;
119
120 struct s_vos_mem_struct* memStruct;
Manjunathappa Prakash0e7e3472013-11-22 15:38:14 -0800121 char* prev_mleak_file = "";
122 unsigned int prev_mleak_lineNum = 0;
123 unsigned int prev_mleak_sz = 0;
124 unsigned int mleak_cnt = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700125
126 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700127 "%s: List is not Empty. listSize %d ", __func__, (int)listSize);
Jeff Johnson295189b2012-06-20 16:38:30 -0700128
129 do
130 {
131 spin_lock(&vosMemList.lock);
132 vosStatus = hdd_list_remove_front(&vosMemList, &pNode);
133 spin_unlock(&vosMemList.lock);
134 if(VOS_STATUS_SUCCESS == vosStatus)
135 {
136 memStruct = (struct s_vos_mem_struct*)pNode;
Manjunathappa Prakash0e7e3472013-11-22 15:38:14 -0800137
138 /* Take care to log only once multiple memory leaks from
139 * the same place */
140 if(strcmp(prev_mleak_file, memStruct->fileName) ||
141 (prev_mleak_lineNum != memStruct->lineNum) ||
142 (prev_mleak_sz != memStruct->size))
143 {
144 if(mleak_cnt != 0)
145 {
146 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
147 "%d Time Memory Leak@ File %s, @Line %d, size %d",
148 mleak_cnt, prev_mleak_file, prev_mleak_lineNum,
149 prev_mleak_sz);
150 }
151 prev_mleak_file = memStruct->fileName;
152 prev_mleak_lineNum = memStruct->lineNum;
153 prev_mleak_sz = memStruct->size;
154 mleak_cnt = 0;
155 }
156 mleak_cnt++;
157
Jeff Johnson295189b2012-06-20 16:38:30 -0700158 kfree((v_VOID_t*)memStruct);
159 }
160 }while(vosStatus == VOS_STATUS_SUCCESS);
lukez092ea1a2013-03-15 14:53:55 -0700161
Manjunathappa Prakash0e7e3472013-11-22 15:38:14 -0800162 /* Print last memory leak from the module */
163 if(mleak_cnt)
164 {
165 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
166 "%d Time memory Leak@ File %s, @Line %d, size %d",
167 mleak_cnt, prev_mleak_file, prev_mleak_lineNum,
168 prev_mleak_sz);
169 }
170
171
lukez092ea1a2013-03-15 14:53:55 -0700172#ifdef CONFIG_HALT_KMEMLEAK
173 BUG_ON(0);
174#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700175 }
176}
177
178void vos_mem_exit()
179{
Arif Hussaind5218912013-12-05 01:10:55 -0800180 if (memory_dbug_flag)
181 {
182 vos_mem_clean();
183 hdd_list_destroy(&vosMemList);
184 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700185}
186
187v_VOID_t * vos_mem_malloc_debug( v_SIZE_t size, char* fileName, v_U32_t lineNum)
188{
189 struct s_vos_mem_struct* memStruct;
190 v_VOID_t* memPtr = NULL;
191 v_SIZE_t new_size;
Atul Mittal93d46592014-03-14 13:42:06 +0530192 int flags = GFP_KERNEL;
193 unsigned long IrqFlags;
194
Jeff Johnson295189b2012-06-20 16:38:30 -0700195
196 if (size > (1024*1024))
197 {
198 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700199 "%s: called with arg > 1024K; passed in %d !!!", __func__,size);
Jeff Johnson295189b2012-06-20 16:38:30 -0700200 return NULL;
201 }
Madan Mohan Koyyalamudi5c0fe232013-09-16 22:21:26 +0530202
Jeff Johnson295189b2012-06-20 16:38:30 -0700203 if (in_interrupt())
204 {
Atul Mittal1119d0b2014-03-25 12:14:37 +0530205 flags = GFP_ATOMIC;
Jeff Johnson295189b2012-06-20 16:38:30 -0700206 }
207
Arif Hussaind5218912013-12-05 01:10:55 -0800208 if (!memory_dbug_flag)
209 {
210#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
211 v_VOID_t* pmem;
212 if (size > WCNSS_PRE_ALLOC_GET_THRESHOLD)
213 {
214 pmem = wcnss_prealloc_get(size);
215 if (NULL != pmem)
216 return pmem;
217 }
218#endif
Atul Mittal93d46592014-03-14 13:42:06 +0530219 return kmalloc(size, flags);
Arif Hussaind5218912013-12-05 01:10:55 -0800220 }
221
Jeff Johnson295189b2012-06-20 16:38:30 -0700222 new_size = size + sizeof(struct s_vos_mem_struct) + 8;
223
Atul Mittal93d46592014-03-14 13:42:06 +0530224 memStruct = (struct s_vos_mem_struct*)kmalloc(new_size, flags);
Jeff Johnson295189b2012-06-20 16:38:30 -0700225
226 if(memStruct != NULL)
227 {
228 VOS_STATUS vosStatus;
229
230 memStruct->fileName = fileName;
231 memStruct->lineNum = lineNum;
232 memStruct->size = size;
233
234 vos_mem_copy(&memStruct->header[0], &WLAN_MEM_HEADER[0], sizeof(WLAN_MEM_HEADER));
235 vos_mem_copy( (v_U8_t*)(memStruct + 1) + size, &WLAN_MEM_TAIL[0], sizeof(WLAN_MEM_TAIL));
236
Atul Mittal93d46592014-03-14 13:42:06 +0530237 spin_lock_irqsave(&vosMemList.lock, IrqFlags);
Jeff Johnson295189b2012-06-20 16:38:30 -0700238 vosStatus = hdd_list_insert_front(&vosMemList, &memStruct->pNode);
Atul Mittal93d46592014-03-14 13:42:06 +0530239 spin_unlock_irqrestore(&vosMemList.lock, IrqFlags);
Jeff Johnson295189b2012-06-20 16:38:30 -0700240 if(VOS_STATUS_SUCCESS != vosStatus)
241 {
242 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain02882402013-11-17 21:55:29 -0800243 "%s: Unable to insert node into List vosStatus %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700244 }
245
246 memPtr = (v_VOID_t*)(memStruct + 1);
247 }
248 return memPtr;
249}
250
251v_VOID_t vos_mem_free( v_VOID_t *ptr )
252{
Madan Mohan Koyyalamudi5c0fe232013-09-16 22:21:26 +0530253
Atul Mittal93d46592014-03-14 13:42:06 +0530254 unsigned long IrqFlags;
Arif Hussaind5218912013-12-05 01:10:55 -0800255 if (ptr == NULL)
256 return;
257
Arif Hussaind5218912013-12-05 01:10:55 -0800258 if (!memory_dbug_flag)
259 {
260#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
261 if (wcnss_prealloc_put(ptr))
262 return;
263#endif
264 kfree(ptr);
265 }
266 else
Jeff Johnson295189b2012-06-20 16:38:30 -0700267 {
268 VOS_STATUS vosStatus;
269 struct s_vos_mem_struct* memStruct = ((struct s_vos_mem_struct*)ptr) - 1;
270
Atul Mittal93d46592014-03-14 13:42:06 +0530271 spin_lock_irqsave(&vosMemList.lock, IrqFlags);
Jeff Johnson295189b2012-06-20 16:38:30 -0700272 vosStatus = hdd_list_remove_node(&vosMemList, &memStruct->pNode);
Atul Mittal1119d0b2014-03-25 12:14:37 +0530273 spin_unlock_irqrestore(&vosMemList.lock, IrqFlags);
Jeff Johnson295189b2012-06-20 16:38:30 -0700274
275 if(VOS_STATUS_SUCCESS == vosStatus)
276 {
277 if(0 == vos_mem_compare(memStruct->header, &WLAN_MEM_HEADER[0], sizeof(WLAN_MEM_HEADER)) )
278 {
279 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
280 "Memory Header is corrupted. MemInfo: Filename %s, LineNum %d",
281 memStruct->fileName, (int)memStruct->lineNum);
282 }
283 if(0 == vos_mem_compare( (v_U8_t*)ptr + memStruct->size, &WLAN_MEM_TAIL[0], sizeof(WLAN_MEM_TAIL ) ) )
284 {
285 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
286 "Memory Trailer is corrupted. MemInfo: Filename %s, LineNum %d",
287 memStruct->fileName, (int)memStruct->lineNum);
288 }
289 kfree((v_VOID_t*)memStruct);
290 }
291 else
292 {
293 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700294 "%s: Unallocated memory (double free?)", __func__);
Pradeep Kumar Goudaguntab6c426a2014-03-19 16:23:44 +0530295 VOS_BUG(0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700296 }
297 }
298}
299#else
300v_VOID_t * vos_mem_malloc( v_SIZE_t size )
301{
Atul Mittal93d46592014-03-14 13:42:06 +0530302 int flags = GFP_KERNEL;
Mohit Khanna49a87a82012-09-11 18:03:14 -0700303#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
304 v_VOID_t* pmem;
305#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700306 if (size > (1024*1024))
307 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700308 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 -0700309 return NULL;
310 }
Atul Mittal93d46592014-03-14 13:42:06 +0530311 if (in_interrupt() || irqs_disabled() || in_atomic())
Jeff Johnson295189b2012-06-20 16:38:30 -0700312 {
Atul Mittal93d46592014-03-14 13:42:06 +0530313 flags = GFP_ATOMIC;
Jeff Johnson295189b2012-06-20 16:38:30 -0700314 }
Mohit Khanna49a87a82012-09-11 18:03:14 -0700315#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
316 if(size > WCNSS_PRE_ALLOC_GET_THRESHOLD)
317 {
318 pmem = wcnss_prealloc_get(size);
319 if(NULL != pmem)
320 return pmem;
321 }
322#endif
Atul Mittal93d46592014-03-14 13:42:06 +0530323 return kmalloc(size, flags);
Jeff Johnson295189b2012-06-20 16:38:30 -0700324}
325
326v_VOID_t vos_mem_free( v_VOID_t *ptr )
327{
328 if (ptr == NULL)
329 return;
Mohit Khanna49a87a82012-09-11 18:03:14 -0700330
Mohit Khanna49a87a82012-09-11 18:03:14 -0700331#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
332 if(wcnss_prealloc_put(ptr))
333 return;
334#endif
335
Jeff Johnson295189b2012-06-20 16:38:30 -0700336 kfree(ptr);
337}
338#endif
339
340v_VOID_t vos_mem_set( v_VOID_t *ptr, v_SIZE_t numBytes, v_BYTE_t value )
341{
342 if (ptr == NULL)
343 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700344 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s called with NULL parameter ptr", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700345 return;
346 }
347 memset(ptr, value, numBytes);
348}
349
350v_VOID_t vos_mem_zero( v_VOID_t *ptr, v_SIZE_t numBytes )
351{
352 if (0 == numBytes)
353 {
354 // special case where ptr can be NULL
355 return;
356 }
357
358 if (ptr == NULL)
359 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700360 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s called with NULL parameter ptr", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700361 return;
362 }
363 memset(ptr, 0, numBytes);
364
365}
366
Jeff Johnson295189b2012-06-20 16:38:30 -0700367v_VOID_t vos_mem_copy( v_VOID_t *pDst, const v_VOID_t *pSrc, v_SIZE_t numBytes )
368{
369 if (0 == numBytes)
370 {
371 // special case where pDst or pSrc can be NULL
372 return;
373 }
374
375 if ((pDst == NULL) || (pSrc==NULL))
376 {
377 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
378 "%s called with NULL parameter, source:%p destination:%p",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700379 __func__, pSrc, pDst);
Jeff Johnson295189b2012-06-20 16:38:30 -0700380 VOS_ASSERT(0);
381 return;
382 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700383 memcpy(pDst, pSrc, numBytes);
Jeff Johnson295189b2012-06-20 16:38:30 -0700384}
385
386v_VOID_t vos_mem_move( v_VOID_t *pDst, const v_VOID_t *pSrc, v_SIZE_t numBytes )
387{
388 if (0 == numBytes)
389 {
390 // special case where pDst or pSrc can be NULL
391 return;
392 }
393
394 if ((pDst == NULL) || (pSrc==NULL))
395 {
396 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
397 "%s called with NULL parameter, source:%p destination:%p",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700398 __func__, pSrc, pDst);
Jeff Johnson295189b2012-06-20 16:38:30 -0700399 VOS_ASSERT(0);
400 return;
401 }
402 memmove(pDst, pSrc, numBytes);
403}
404
405v_BOOL_t vos_mem_compare( v_VOID_t *pMemory1, v_VOID_t *pMemory2, v_U32_t numBytes )
406{
407 if (0 == numBytes)
408 {
409 // special case where pMemory1 or pMemory2 can be NULL
410 return VOS_TRUE;
411 }
412
413 if ((pMemory1 == NULL) || (pMemory2==NULL))
414 {
415 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
416 "%s called with NULL parameter, p1:%p p2:%p",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700417 __func__, pMemory1, pMemory2);
Jeff Johnson295189b2012-06-20 16:38:30 -0700418 VOS_ASSERT(0);
419 return VOS_FALSE;
420 }
421 return (memcmp(pMemory1, pMemory2, numBytes)?VOS_FALSE:VOS_TRUE);
422}
423
424
425v_SINT_t vos_mem_compare2( v_VOID_t *pMemory1, v_VOID_t *pMemory2, v_U32_t numBytes )
426
427{
428 return( (v_SINT_t) memcmp( pMemory1, pMemory2, numBytes ) );
429}
430
431/*----------------------------------------------------------------------------
432
433 \brief vos_mem_dma_malloc() - vOSS DMA Memory Allocation
434
435 This function will dynamicallly allocate the specified number of bytes of
436 memory. This memory will have special attributes making it DMA friendly i.e.
437 it will exist in contiguous, 32-byte aligned uncached memory. A normal
438 vos_mem_malloc does not yield memory with these attributes.
439
440 NOTE: the special DMA friendly memory is very scarce and this API must be
441 used sparingly
442
443 On WM, there is nothing special about this memory. SDHC allocates the
444 DMA friendly buffer and copies the data into it
445
446 \param size - the number of bytes of memory to allocate.
447
448 \return Upon successful allocate, returns a non-NULL pointer to the
449 allocated memory. If this function is unable to allocate the amount of
450 memory specified (for any reason) it returns NULL.
451
452 \sa
453
454 --------------------------------------------------------------------------*/
455#ifdef MEMORY_DEBUG
456v_VOID_t * vos_mem_dma_malloc_debug( v_SIZE_t size, char* fileName, v_U32_t lineNum)
457{
458 struct s_vos_mem_struct* memStruct;
459 v_VOID_t* memPtr = NULL;
460 v_SIZE_t new_size;
461
462 if (in_interrupt())
463 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700464 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 -0700465 return NULL;
466 }
467
Arif Hussaind5218912013-12-05 01:10:55 -0800468 if (!memory_dbug_flag)
469 return kmalloc(size, GFP_KERNEL);
470
Jeff Johnson295189b2012-06-20 16:38:30 -0700471 new_size = size + sizeof(struct s_vos_mem_struct) + 8;
472
473 memStruct = (struct s_vos_mem_struct*)kmalloc(new_size,GFP_KERNEL);
474
475 if(memStruct != NULL)
476 {
477 VOS_STATUS vosStatus;
478
479 memStruct->fileName = fileName;
480 memStruct->lineNum = lineNum;
481 memStruct->size = size;
482
483 vos_mem_copy(&memStruct->header[0], &WLAN_MEM_HEADER[0], sizeof(WLAN_MEM_HEADER));
484 vos_mem_copy( (v_U8_t*)(memStruct + 1) + size, &WLAN_MEM_TAIL[0], sizeof(WLAN_MEM_TAIL));
485
486 spin_lock(&vosMemList.lock);
487 vosStatus = hdd_list_insert_front(&vosMemList, &memStruct->pNode);
488 spin_unlock(&vosMemList.lock);
489 if(VOS_STATUS_SUCCESS != vosStatus)
490 {
491 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain02882402013-11-17 21:55:29 -0800492 "%s: Unable to insert node into List vosStatus %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700493 }
494
495 memPtr = (v_VOID_t*)(memStruct + 1);
496 }
497
498 return memPtr;
499}
500
501v_VOID_t vos_mem_dma_free( v_VOID_t *ptr )
502{
Arif Hussaind5218912013-12-05 01:10:55 -0800503 if (ptr == NULL)
504 return;
505
506 if (memory_dbug_flag)
Jeff Johnson295189b2012-06-20 16:38:30 -0700507 {
508 VOS_STATUS vosStatus;
509 struct s_vos_mem_struct* memStruct = ((struct s_vos_mem_struct*)ptr) - 1;
510
511 spin_lock(&vosMemList.lock);
512 vosStatus = hdd_list_remove_node(&vosMemList, &memStruct->pNode);
513 spin_unlock(&vosMemList.lock);
514
515 if(VOS_STATUS_SUCCESS == vosStatus)
516 {
517 if(0 == vos_mem_compare(memStruct->header, &WLAN_MEM_HEADER[0], sizeof(WLAN_MEM_HEADER)) )
518 {
519 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
520 "Memory Header is corrupted. MemInfo: Filename %s, LineNum %d",
521 memStruct->fileName, (int)memStruct->lineNum);
522 }
523 if(0 == vos_mem_compare( (v_U8_t*)ptr + memStruct->size, &WLAN_MEM_TAIL[0], sizeof(WLAN_MEM_TAIL ) ) )
524 {
525 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
526 "Memory Trailer is corrupted. MemInfo: Filename %s, LineNum %d",
527 memStruct->fileName, (int)memStruct->lineNum);
528 }
529 kfree((v_VOID_t*)memStruct);
530 }
531 }
Arif Hussaind5218912013-12-05 01:10:55 -0800532 else
533 kfree(ptr);
Jeff Johnson295189b2012-06-20 16:38:30 -0700534}
535#else
536v_VOID_t* vos_mem_dma_malloc( v_SIZE_t size )
537{
538 if (in_interrupt())
539 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700540 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 -0700541 return NULL;
542 }
543 return kmalloc(size, GFP_KERNEL);
544}
545
546/*----------------------------------------------------------------------------
547
548 \brief vos_mem_dma_free() - vOSS DMA Free Memory
549
550 This function will free special DMA friendly memory pointed to by 'ptr'.
551
552 On WM, there is nothing special about the memory being free'd. SDHC will
553 take care of free'ing the DMA friendly buffer
554
555 \param ptr - pointer to the starting address of the memory to be
556 free'd.
557
558 \return Nothing
559
560 \sa
561
562 --------------------------------------------------------------------------*/
563v_VOID_t vos_mem_dma_free( v_VOID_t *ptr )
564{
565 if (ptr == NULL)
566 return;
567 kfree(ptr);
568}
569#endif