blob: 584b512fa3dc3d130219e991c2fa6cc2827dfbd8 [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"
Abhishek Singh837adf22015-10-01 17:37:37 +053058#include "vos_api.h"
Hanumantha Reddy Pothula72342952015-02-26 14:43:54 +053059#include <vmalloc.h>
Jeff Johnson295189b2012-06-20 16:38:30 -070060
Mohit Khanna49a87a82012-09-11 18:03:14 -070061#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
62#include <linux/wcnss_wlan.h>
63#define WCNSS_PRE_ALLOC_GET_THRESHOLD (4*1024)
64#endif
65
Jeff Johnson295189b2012-06-20 16:38:30 -070066#ifdef MEMORY_DEBUG
67#include "wlan_hdd_dp_utils.h"
68
69hdd_list_t vosMemList;
70
71static v_U8_t WLAN_MEM_HEADER[] = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68 };
72static v_U8_t WLAN_MEM_TAIL[] = {0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87};
Arif Hussaind5218912013-12-05 01:10:55 -080073static int memory_dbug_flag;
Jeff Johnson295189b2012-06-20 16:38:30 -070074
75struct s_vos_mem_struct
76{
77 hdd_list_node_t pNode;
78 char* fileName;
79 unsigned int lineNum;
80 unsigned int size;
81 v_U8_t header[8];
82};
83#endif
84
85/*---------------------------------------------------------------------------
86 * Preprocessor Definitions and Constants
87 * ------------------------------------------------------------------------*/
88
89/*---------------------------------------------------------------------------
90 * Type Declarations
91 * ------------------------------------------------------------------------*/
92
93/*---------------------------------------------------------------------------
94 * Data definitions
95 * ------------------------------------------------------------------------*/
96
97/*---------------------------------------------------------------------------
98 * External Function implementation
99 * ------------------------------------------------------------------------*/
100#ifdef MEMORY_DEBUG
101void vos_mem_init()
102{
103 /* Initalizing the list with maximum size of 60000 */
104 hdd_list_init(&vosMemList, 60000);
Arif Hussaind5218912013-12-05 01:10:55 -0800105 memory_dbug_flag = 1;
Jeff Johnson295189b2012-06-20 16:38:30 -0700106 return;
107}
108
109void vos_mem_clean()
110{
111 v_SIZE_t listSize;
112 hdd_list_size(&vosMemList, &listSize);
113
114 if(listSize)
115 {
116 hdd_list_node_t* pNode;
117 VOS_STATUS vosStatus;
118
119 struct s_vos_mem_struct* memStruct;
Manjunathappa Prakash0e7e3472013-11-22 15:38:14 -0800120 char* prev_mleak_file = "";
121 unsigned int prev_mleak_lineNum = 0;
122 unsigned int prev_mleak_sz = 0;
123 unsigned int mleak_cnt = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700124
125 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700126 "%s: List is not Empty. listSize %d ", __func__, (int)listSize);
Jeff Johnson295189b2012-06-20 16:38:30 -0700127
128 do
129 {
130 spin_lock(&vosMemList.lock);
131 vosStatus = hdd_list_remove_front(&vosMemList, &pNode);
132 spin_unlock(&vosMemList.lock);
133 if(VOS_STATUS_SUCCESS == vosStatus)
134 {
135 memStruct = (struct s_vos_mem_struct*)pNode;
Manjunathappa Prakash0e7e3472013-11-22 15:38:14 -0800136
137 /* Take care to log only once multiple memory leaks from
138 * the same place */
139 if(strcmp(prev_mleak_file, memStruct->fileName) ||
140 (prev_mleak_lineNum != memStruct->lineNum) ||
141 (prev_mleak_sz != memStruct->size))
142 {
143 if(mleak_cnt != 0)
144 {
145 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
146 "%d Time Memory Leak@ File %s, @Line %d, size %d",
147 mleak_cnt, prev_mleak_file, prev_mleak_lineNum,
148 prev_mleak_sz);
149 }
150 prev_mleak_file = memStruct->fileName;
151 prev_mleak_lineNum = memStruct->lineNum;
152 prev_mleak_sz = memStruct->size;
153 mleak_cnt = 0;
154 }
155 mleak_cnt++;
156
Jeff Johnson295189b2012-06-20 16:38:30 -0700157 kfree((v_VOID_t*)memStruct);
158 }
159 }while(vosStatus == VOS_STATUS_SUCCESS);
lukez092ea1a2013-03-15 14:53:55 -0700160
Manjunathappa Prakash0e7e3472013-11-22 15:38:14 -0800161 /* Print last memory leak from the module */
162 if(mleak_cnt)
163 {
164 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
165 "%d Time memory Leak@ File %s, @Line %d, size %d",
166 mleak_cnt, prev_mleak_file, prev_mleak_lineNum,
167 prev_mleak_sz);
168 }
169
170
lukez092ea1a2013-03-15 14:53:55 -0700171#ifdef CONFIG_HALT_KMEMLEAK
172 BUG_ON(0);
173#endif
Jeff Johnson295189b2012-06-20 16:38:30 -0700174 }
175}
176
177void vos_mem_exit()
178{
Arif Hussaind5218912013-12-05 01:10:55 -0800179 if (memory_dbug_flag)
180 {
181 vos_mem_clean();
182 hdd_list_destroy(&vosMemList);
183 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700184}
185
186v_VOID_t * vos_mem_malloc_debug( v_SIZE_t size, char* fileName, v_U32_t lineNum)
187{
188 struct s_vos_mem_struct* memStruct;
189 v_VOID_t* memPtr = NULL;
190 v_SIZE_t new_size;
Atul Mittal93d46592014-03-14 13:42:06 +0530191 int flags = GFP_KERNEL;
192 unsigned long IrqFlags;
193
Jeff Johnson295189b2012-06-20 16:38:30 -0700194
Hanumantha Reddy Pothulaf7d308c2015-03-24 13:44:52 +0530195 if (size > (1024*1024) || size == 0)
Jeff Johnson295189b2012-06-20 16:38:30 -0700196 {
197 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Hanumantha Reddy Pothulaf7d308c2015-03-24 13:44:52 +0530198 "%s: called with invalid arg %u !!!", __func__, size);
Jeff Johnson295189b2012-06-20 16:38:30 -0700199 return NULL;
200 }
Madan Mohan Koyyalamudi5c0fe232013-09-16 22:21:26 +0530201
Nirav Shah20aec4a2015-08-24 14:55:13 +0530202 if (in_interrupt() || irqs_disabled() || in_atomic())
Jeff Johnson295189b2012-06-20 16:38:30 -0700203 {
Atul Mittal1119d0b2014-03-25 12:14:37 +0530204 flags = GFP_ATOMIC;
Jeff Johnson295189b2012-06-20 16:38:30 -0700205 }
206
Arif Hussaind5218912013-12-05 01:10:55 -0800207 if (!memory_dbug_flag)
208 {
209#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
210 v_VOID_t* pmem;
211 if (size > WCNSS_PRE_ALLOC_GET_THRESHOLD)
212 {
213 pmem = wcnss_prealloc_get(size);
214 if (NULL != pmem)
215 return pmem;
216 }
217#endif
Abhishek Singh837adf22015-10-01 17:37:37 +0530218 memPtr = kmalloc(size, flags);
219 if ((flags != GFP_ATOMIC) && (NULL == memPtr))
220 {
221 WARN_ON(1);
222 vos_fatal_event_logs_req(WLAN_LOG_TYPE_FATAL,
223 WLAN_LOG_INDICATOR_HOST_ONLY,
224 WLAN_LOG_REASON_MALLOC_FAIL,
225 false, true);
226 }
227 return memPtr;
Arif Hussaind5218912013-12-05 01:10:55 -0800228 }
229
Jeff Johnson295189b2012-06-20 16:38:30 -0700230 new_size = size + sizeof(struct s_vos_mem_struct) + 8;
231
Atul Mittal93d46592014-03-14 13:42:06 +0530232 memStruct = (struct s_vos_mem_struct*)kmalloc(new_size, flags);
Jeff Johnson295189b2012-06-20 16:38:30 -0700233
234 if(memStruct != NULL)
235 {
236 VOS_STATUS vosStatus;
237
238 memStruct->fileName = fileName;
239 memStruct->lineNum = lineNum;
240 memStruct->size = size;
241
242 vos_mem_copy(&memStruct->header[0], &WLAN_MEM_HEADER[0], sizeof(WLAN_MEM_HEADER));
243 vos_mem_copy( (v_U8_t*)(memStruct + 1) + size, &WLAN_MEM_TAIL[0], sizeof(WLAN_MEM_TAIL));
244
Atul Mittal93d46592014-03-14 13:42:06 +0530245 spin_lock_irqsave(&vosMemList.lock, IrqFlags);
Jeff Johnson295189b2012-06-20 16:38:30 -0700246 vosStatus = hdd_list_insert_front(&vosMemList, &memStruct->pNode);
Atul Mittal93d46592014-03-14 13:42:06 +0530247 spin_unlock_irqrestore(&vosMemList.lock, IrqFlags);
Jeff Johnson295189b2012-06-20 16:38:30 -0700248 if(VOS_STATUS_SUCCESS != vosStatus)
249 {
250 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain02882402013-11-17 21:55:29 -0800251 "%s: Unable to insert node into List vosStatus %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700252 }
253
254 memPtr = (v_VOID_t*)(memStruct + 1);
255 }
Abhishek Singh837adf22015-10-01 17:37:37 +0530256 if ((flags != GFP_ATOMIC) && (NULL == memStruct))
257 {
258 WARN_ON(1);
259 vos_fatal_event_logs_req(WLAN_LOG_TYPE_FATAL,
260 WLAN_LOG_INDICATOR_HOST_ONLY,
261 WLAN_LOG_REASON_MALLOC_FAIL,
262 false, true);
263 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700264 return memPtr;
265}
266
267v_VOID_t vos_mem_free( v_VOID_t *ptr )
268{
Madan Mohan Koyyalamudi5c0fe232013-09-16 22:21:26 +0530269
Atul Mittal93d46592014-03-14 13:42:06 +0530270 unsigned long IrqFlags;
Arif Hussaind5218912013-12-05 01:10:55 -0800271 if (ptr == NULL)
272 return;
273
Arif Hussaind5218912013-12-05 01:10:55 -0800274 if (!memory_dbug_flag)
275 {
276#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
277 if (wcnss_prealloc_put(ptr))
278 return;
279#endif
280 kfree(ptr);
281 }
282 else
Jeff Johnson295189b2012-06-20 16:38:30 -0700283 {
284 VOS_STATUS vosStatus;
285 struct s_vos_mem_struct* memStruct = ((struct s_vos_mem_struct*)ptr) - 1;
286
Atul Mittal93d46592014-03-14 13:42:06 +0530287 spin_lock_irqsave(&vosMemList.lock, IrqFlags);
Jeff Johnson295189b2012-06-20 16:38:30 -0700288 vosStatus = hdd_list_remove_node(&vosMemList, &memStruct->pNode);
Atul Mittal1119d0b2014-03-25 12:14:37 +0530289 spin_unlock_irqrestore(&vosMemList.lock, IrqFlags);
Jeff Johnson295189b2012-06-20 16:38:30 -0700290
291 if(VOS_STATUS_SUCCESS == vosStatus)
292 {
293 if(0 == vos_mem_compare(memStruct->header, &WLAN_MEM_HEADER[0], sizeof(WLAN_MEM_HEADER)) )
294 {
295 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
296 "Memory Header is corrupted. MemInfo: Filename %s, LineNum %d",
297 memStruct->fileName, (int)memStruct->lineNum);
298 }
299 if(0 == vos_mem_compare( (v_U8_t*)ptr + memStruct->size, &WLAN_MEM_TAIL[0], sizeof(WLAN_MEM_TAIL ) ) )
300 {
301 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
302 "Memory Trailer is corrupted. MemInfo: Filename %s, LineNum %d",
303 memStruct->fileName, (int)memStruct->lineNum);
304 }
305 kfree((v_VOID_t*)memStruct);
306 }
307 else
308 {
309 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700310 "%s: Unallocated memory (double free?)", __func__);
Pradeep Kumar Goudaguntab6c426a2014-03-19 16:23:44 +0530311 VOS_BUG(0);
Jeff Johnson295189b2012-06-20 16:38:30 -0700312 }
313 }
314}
315#else
316v_VOID_t * vos_mem_malloc( v_SIZE_t size )
317{
Atul Mittal93d46592014-03-14 13:42:06 +0530318 int flags = GFP_KERNEL;
Abhishek Singh837adf22015-10-01 17:37:37 +0530319 v_VOID_t* memPtr = NULL;
Mohit Khanna49a87a82012-09-11 18:03:14 -0700320#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
321 v_VOID_t* pmem;
322#endif
Hanumantha Reddy Pothulaf7d308c2015-03-24 13:44:52 +0530323 if (size > (1024*1024) || size == 0)
Jeff Johnson295189b2012-06-20 16:38:30 -0700324 {
Hanumantha Reddy Pothulaf7d308c2015-03-24 13:44:52 +0530325 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
326 "%s: called with invalid arg %u !!!", __func__, size);
Jeff Johnson295189b2012-06-20 16:38:30 -0700327 return NULL;
328 }
Atul Mittal93d46592014-03-14 13:42:06 +0530329 if (in_interrupt() || irqs_disabled() || in_atomic())
Jeff Johnson295189b2012-06-20 16:38:30 -0700330 {
Atul Mittal93d46592014-03-14 13:42:06 +0530331 flags = GFP_ATOMIC;
Jeff Johnson295189b2012-06-20 16:38:30 -0700332 }
Mohit Khanna49a87a82012-09-11 18:03:14 -0700333#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
334 if(size > WCNSS_PRE_ALLOC_GET_THRESHOLD)
335 {
336 pmem = wcnss_prealloc_get(size);
337 if(NULL != pmem)
338 return pmem;
339 }
340#endif
Abhishek Singh837adf22015-10-01 17:37:37 +0530341 memPtr = kmalloc(size, flags);
342 if ((flags != GFP_ATOMIC) && (NULL == memPtr))
343 {
344 WARN_ON(1);
345 vos_fatal_event_logs_req(WLAN_LOG_TYPE_FATAL,
346 WLAN_LOG_INDICATOR_HOST_ONLY,
347 WLAN_LOG_REASON_MALLOC_FAIL,
348 false, true);
349 }
350 return memPtr;
351
Jeff Johnson295189b2012-06-20 16:38:30 -0700352}
353
354v_VOID_t vos_mem_free( v_VOID_t *ptr )
355{
356 if (ptr == NULL)
357 return;
Mohit Khanna49a87a82012-09-11 18:03:14 -0700358
Mohit Khanna49a87a82012-09-11 18:03:14 -0700359#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
360 if(wcnss_prealloc_put(ptr))
361 return;
362#endif
363
Jeff Johnson295189b2012-06-20 16:38:30 -0700364 kfree(ptr);
365}
366#endif
367
Hanumantha Reddy Pothula72342952015-02-26 14:43:54 +0530368v_VOID_t * vos_mem_vmalloc(v_SIZE_t size)
369{
370 if (size == 0 || size >= (1024*1024))
371 {
372 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
373 "%s invalid size: %u", __func__, size);
374 return NULL;
375 }
376
377 return vmalloc(size);
378}
379
380v_VOID_t vos_mem_vfree(void *addr)
381{
382 if (addr == NULL)
383 {
384 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
385 "%s NULL address passed to free", __func__);
386 return;
387 }
388
389 vfree(addr);
390 return;
391}
392
Jeff Johnson295189b2012-06-20 16:38:30 -0700393v_VOID_t vos_mem_set( v_VOID_t *ptr, v_SIZE_t numBytes, v_BYTE_t value )
394{
395 if (ptr == NULL)
396 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700397 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s called with NULL parameter ptr", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700398 return;
399 }
400 memset(ptr, value, numBytes);
401}
402
403v_VOID_t vos_mem_zero( v_VOID_t *ptr, v_SIZE_t numBytes )
404{
405 if (0 == numBytes)
406 {
407 // special case where ptr can be NULL
408 return;
409 }
410
411 if (ptr == NULL)
412 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700413 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s called with NULL parameter ptr", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700414 return;
415 }
416 memset(ptr, 0, numBytes);
417
418}
419
Jeff Johnson295189b2012-06-20 16:38:30 -0700420v_VOID_t vos_mem_copy( v_VOID_t *pDst, const v_VOID_t *pSrc, v_SIZE_t numBytes )
421{
422 if (0 == numBytes)
423 {
424 // special case where pDst or pSrc can be NULL
425 return;
426 }
427
428 if ((pDst == NULL) || (pSrc==NULL))
429 {
430 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
431 "%s called with NULL parameter, source:%p destination:%p",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700432 __func__, pSrc, pDst);
Jeff Johnson295189b2012-06-20 16:38:30 -0700433 VOS_ASSERT(0);
434 return;
435 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700436 memcpy(pDst, pSrc, numBytes);
Jeff Johnson295189b2012-06-20 16:38:30 -0700437}
438
439v_VOID_t vos_mem_move( v_VOID_t *pDst, const v_VOID_t *pSrc, v_SIZE_t numBytes )
440{
441 if (0 == numBytes)
442 {
443 // special case where pDst or pSrc can be NULL
444 return;
445 }
446
447 if ((pDst == NULL) || (pSrc==NULL))
448 {
449 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
450 "%s called with NULL parameter, source:%p destination:%p",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700451 __func__, pSrc, pDst);
Jeff Johnson295189b2012-06-20 16:38:30 -0700452 VOS_ASSERT(0);
453 return;
454 }
455 memmove(pDst, pSrc, numBytes);
456}
457
Anand N Sunkadb3ab97d2015-07-29 09:58:13 +0530458v_BOOL_t vos_mem_compare(
459#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
460 const v_VOID_t *pMemory1,
461#else
462 v_VOID_t *pMemory1,
463#endif
464#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
465 const v_VOID_t *pMemory2,
466#else
467 v_VOID_t *pMemory2,
468#endif
469 v_U32_t numBytes )
Jeff Johnson295189b2012-06-20 16:38:30 -0700470{
471 if (0 == numBytes)
472 {
473 // special case where pMemory1 or pMemory2 can be NULL
474 return VOS_TRUE;
475 }
476
477 if ((pMemory1 == NULL) || (pMemory2==NULL))
478 {
479 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
480 "%s called with NULL parameter, p1:%p p2:%p",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700481 __func__, pMemory1, pMemory2);
Jeff Johnson295189b2012-06-20 16:38:30 -0700482 VOS_ASSERT(0);
483 return VOS_FALSE;
484 }
485 return (memcmp(pMemory1, pMemory2, numBytes)?VOS_FALSE:VOS_TRUE);
486}
487
488
489v_SINT_t vos_mem_compare2( v_VOID_t *pMemory1, v_VOID_t *pMemory2, v_U32_t numBytes )
490
491{
492 return( (v_SINT_t) memcmp( pMemory1, pMemory2, numBytes ) );
493}
494
495/*----------------------------------------------------------------------------
496
497 \brief vos_mem_dma_malloc() - vOSS DMA Memory Allocation
498
499 This function will dynamicallly allocate the specified number of bytes of
500 memory. This memory will have special attributes making it DMA friendly i.e.
501 it will exist in contiguous, 32-byte aligned uncached memory. A normal
502 vos_mem_malloc does not yield memory with these attributes.
503
504 NOTE: the special DMA friendly memory is very scarce and this API must be
505 used sparingly
506
507 On WM, there is nothing special about this memory. SDHC allocates the
508 DMA friendly buffer and copies the data into it
509
510 \param size - the number of bytes of memory to allocate.
511
512 \return Upon successful allocate, returns a non-NULL pointer to the
513 allocated memory. If this function is unable to allocate the amount of
514 memory specified (for any reason) it returns NULL.
515
516 \sa
517
518 --------------------------------------------------------------------------*/
519#ifdef MEMORY_DEBUG
520v_VOID_t * vos_mem_dma_malloc_debug( v_SIZE_t size, char* fileName, v_U32_t lineNum)
521{
522 struct s_vos_mem_struct* memStruct;
523 v_VOID_t* memPtr = NULL;
524 v_SIZE_t new_size;
525
526 if (in_interrupt())
527 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700528 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 -0700529 return NULL;
530 }
531
Arif Hussaind5218912013-12-05 01:10:55 -0800532 if (!memory_dbug_flag)
533 return kmalloc(size, GFP_KERNEL);
534
Jeff Johnson295189b2012-06-20 16:38:30 -0700535 new_size = size + sizeof(struct s_vos_mem_struct) + 8;
536
537 memStruct = (struct s_vos_mem_struct*)kmalloc(new_size,GFP_KERNEL);
538
539 if(memStruct != NULL)
540 {
541 VOS_STATUS vosStatus;
542
543 memStruct->fileName = fileName;
544 memStruct->lineNum = lineNum;
545 memStruct->size = size;
546
547 vos_mem_copy(&memStruct->header[0], &WLAN_MEM_HEADER[0], sizeof(WLAN_MEM_HEADER));
548 vos_mem_copy( (v_U8_t*)(memStruct + 1) + size, &WLAN_MEM_TAIL[0], sizeof(WLAN_MEM_TAIL));
549
550 spin_lock(&vosMemList.lock);
551 vosStatus = hdd_list_insert_front(&vosMemList, &memStruct->pNode);
552 spin_unlock(&vosMemList.lock);
553 if(VOS_STATUS_SUCCESS != vosStatus)
554 {
555 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
Arif Hussain02882402013-11-17 21:55:29 -0800556 "%s: Unable to insert node into List vosStatus %d", __func__, vosStatus);
Jeff Johnson295189b2012-06-20 16:38:30 -0700557 }
558
559 memPtr = (v_VOID_t*)(memStruct + 1);
560 }
561
562 return memPtr;
563}
564
565v_VOID_t vos_mem_dma_free( v_VOID_t *ptr )
566{
Arif Hussaind5218912013-12-05 01:10:55 -0800567 if (ptr == NULL)
568 return;
569
570 if (memory_dbug_flag)
Jeff Johnson295189b2012-06-20 16:38:30 -0700571 {
572 VOS_STATUS vosStatus;
573 struct s_vos_mem_struct* memStruct = ((struct s_vos_mem_struct*)ptr) - 1;
574
575 spin_lock(&vosMemList.lock);
576 vosStatus = hdd_list_remove_node(&vosMemList, &memStruct->pNode);
577 spin_unlock(&vosMemList.lock);
578
579 if(VOS_STATUS_SUCCESS == vosStatus)
580 {
581 if(0 == vos_mem_compare(memStruct->header, &WLAN_MEM_HEADER[0], sizeof(WLAN_MEM_HEADER)) )
582 {
583 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
584 "Memory Header is corrupted. MemInfo: Filename %s, LineNum %d",
585 memStruct->fileName, (int)memStruct->lineNum);
586 }
587 if(0 == vos_mem_compare( (v_U8_t*)ptr + memStruct->size, &WLAN_MEM_TAIL[0], sizeof(WLAN_MEM_TAIL ) ) )
588 {
589 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL,
590 "Memory Trailer is corrupted. MemInfo: Filename %s, LineNum %d",
591 memStruct->fileName, (int)memStruct->lineNum);
592 }
593 kfree((v_VOID_t*)memStruct);
594 }
595 }
Arif Hussaind5218912013-12-05 01:10:55 -0800596 else
597 kfree(ptr);
Jeff Johnson295189b2012-06-20 16:38:30 -0700598}
599#else
600v_VOID_t* vos_mem_dma_malloc( v_SIZE_t size )
601{
602 if (in_interrupt())
603 {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700604 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 -0700605 return NULL;
606 }
607 return kmalloc(size, GFP_KERNEL);
608}
609
610/*----------------------------------------------------------------------------
611
612 \brief vos_mem_dma_free() - vOSS DMA Free Memory
613
614 This function will free special DMA friendly memory pointed to by 'ptr'.
615
616 On WM, there is nothing special about the memory being free'd. SDHC will
617 take care of free'ing the DMA friendly buffer
618
619 \param ptr - pointer to the starting address of the memory to be
620 free'd.
621
622 \return Nothing
623
624 \sa
625
626 --------------------------------------------------------------------------*/
627v_VOID_t vos_mem_dma_free( v_VOID_t *ptr )
628{
629 if (ptr == NULL)
630 return;
631 kfree(ptr);
632}
633#endif