164064216a8433360745f69edddce19a606659163The Android Open Source Project/**************************************************************************** 264064216a8433360745f69edddce19a606659163The Android Open Source Project**+-----------------------------------------------------------------------+** 364064216a8433360745f69edddce19a606659163The Android Open Source Project**| |** 464064216a8433360745f69edddce19a606659163The Android Open Source Project**| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved. |** 564064216a8433360745f69edddce19a606659163The Android Open Source Project**| All rights reserved. |** 664064216a8433360745f69edddce19a606659163The Android Open Source Project**| |** 764064216a8433360745f69edddce19a606659163The Android Open Source Project**| Redistribution and use in source and binary forms, with or without |** 864064216a8433360745f69edddce19a606659163The Android Open Source Project**| modification, are permitted provided that the following conditions |** 964064216a8433360745f69edddce19a606659163The Android Open Source Project**| are met: |** 1064064216a8433360745f69edddce19a606659163The Android Open Source Project**| |** 1164064216a8433360745f69edddce19a606659163The Android Open Source Project**| * Redistributions of source code must retain the above copyright |** 1264064216a8433360745f69edddce19a606659163The Android Open Source Project**| notice, this list of conditions and the following disclaimer. |** 1364064216a8433360745f69edddce19a606659163The Android Open Source Project**| * Redistributions in binary form must reproduce the above copyright |** 1464064216a8433360745f69edddce19a606659163The Android Open Source Project**| notice, this list of conditions and the following disclaimer in |** 1564064216a8433360745f69edddce19a606659163The Android Open Source Project**| the documentation and/or other materials provided with the |** 1664064216a8433360745f69edddce19a606659163The Android Open Source Project**| distribution. |** 1764064216a8433360745f69edddce19a606659163The Android Open Source Project**| * Neither the name Texas Instruments nor the names of its |** 1864064216a8433360745f69edddce19a606659163The Android Open Source Project**| contributors may be used to endorse or promote products derived |** 1964064216a8433360745f69edddce19a606659163The Android Open Source Project**| from this software without specific prior written permission. |** 2064064216a8433360745f69edddce19a606659163The Android Open Source Project**| |** 2164064216a8433360745f69edddce19a606659163The Android Open Source Project**| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |** 2264064216a8433360745f69edddce19a606659163The Android Open Source Project**| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |** 2364064216a8433360745f69edddce19a606659163The Android Open Source Project**| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |** 2464064216a8433360745f69edddce19a606659163The Android Open Source Project**| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |** 2564064216a8433360745f69edddce19a606659163The Android Open Source Project**| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |** 2664064216a8433360745f69edddce19a606659163The Android Open Source Project**| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |** 2764064216a8433360745f69edddce19a606659163The Android Open Source Project**| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |** 2864064216a8433360745f69edddce19a606659163The Android Open Source Project**| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |** 2964064216a8433360745f69edddce19a606659163The Android Open Source Project**| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |** 3064064216a8433360745f69edddce19a606659163The Android Open Source Project**| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |** 3164064216a8433360745f69edddce19a606659163The Android Open Source Project**| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |** 3264064216a8433360745f69edddce19a606659163The Android Open Source Project**| |** 3364064216a8433360745f69edddce19a606659163The Android Open Source Project**+-----------------------------------------------------------------------+** 3464064216a8433360745f69edddce19a606659163The Android Open Source Project****************************************************************************/ 3564064216a8433360745f69edddce19a606659163The Android Open Source Project 3664064216a8433360745f69edddce19a606659163The Android Open Source Project 3764064216a8433360745f69edddce19a606659163The Android Open Source Project#include "arch_ti.h" 3864064216a8433360745f69edddce19a606659163The Android Open Source Project 3964064216a8433360745f69edddce19a606659163The Android Open Source Project#include <linux/stddef.h> 4064064216a8433360745f69edddce19a606659163The Android Open Source Project#include <linux/string.h> 4164064216a8433360745f69edddce19a606659163The Android Open Source Project#include <linux/time.h> 4264064216a8433360745f69edddce19a606659163The Android Open Source Project#include <linux/timer.h> 4364064216a8433360745f69edddce19a606659163The Android Open Source Project 4464064216a8433360745f69edddce19a606659163The Android Open Source Project#include <linux/module.h> 4564064216a8433360745f69edddce19a606659163The Android Open Source Project#include <linux/kernel.h> 4664064216a8433360745f69edddce19a606659163The Android Open Source Project#include <linux/netdevice.h> 4764064216a8433360745f69edddce19a606659163The Android Open Source Project#include <linux/etherdevice.h> 4864064216a8433360745f69edddce19a606659163The Android Open Source Project#include <linux/vmalloc.h> 4964064216a8433360745f69edddce19a606659163The Android Open Source Project#include <linux/string.h> 5064064216a8433360745f69edddce19a606659163The Android Open Source Project#include <linux/delay.h> 5164064216a8433360745f69edddce19a606659163The Android Open Source Project#include <linux/time.h> 5264064216a8433360745f69edddce19a606659163The Android Open Source Project#include <linux/list.h> 5364064216a8433360745f69edddce19a606659163The Android Open Source Project 5464064216a8433360745f69edddce19a606659163The Android Open Source Project#include "osApi.h" 5564064216a8433360745f69edddce19a606659163The Android Open Source Project#include "osTIType.h" 5664064216a8433360745f69edddce19a606659163The Android Open Source Project#include "esta_drv.h" 5764064216a8433360745f69edddce19a606659163The Android Open Source Project 5864064216a8433360745f69edddce19a606659163The Android Open Source Projecttypedef void (*os_free)(void *); 5964064216a8433360745f69edddce19a606659163The Android Open Source Projectstruct os_mem_block 6064064216a8433360745f69edddce19a606659163The Android Open Source Project{ 6164064216a8433360745f69edddce19a606659163The Android Open Source Project struct list_head blk_list; 6264064216a8433360745f69edddce19a606659163The Android Open Source Project os_free f_free; 6364064216a8433360745f69edddce19a606659163The Android Open Source Project __u32 size; 6464064216a8433360745f69edddce19a606659163The Android Open Source Project __u32 signature; 6564064216a8433360745f69edddce19a606659163The Android Open Source Project}; 6664064216a8433360745f69edddce19a606659163The Android Open Source Project#define MEM_BLOCK_START (('m'<<24) | ('e'<<16) | ('m'<<8) | 's') 6764064216a8433360745f69edddce19a606659163The Android Open Source Project#define MEM_BLOCK_END (('m'<<24) | ('e'<<16) | ('m'<<8) | 'e') 6864064216a8433360745f69edddce19a606659163The Android Open Source Project 6964064216a8433360745f69edddce19a606659163The Android Open Source Project/**************************************************************************************** 7064064216a8433360745f69edddce19a606659163The Android Open Source Project * * 7164064216a8433360745f69edddce19a606659163The Android Open Source Project * OS Memory API * 7264064216a8433360745f69edddce19a606659163The Android Open Source Project * * 7364064216a8433360745f69edddce19a606659163The Android Open Source Project ****************************************************************************************/ 7464064216a8433360745f69edddce19a606659163The Android Open Source Project 7564064216a8433360745f69edddce19a606659163The Android Open Source Project/**************************************************************************************** 7664064216a8433360745f69edddce19a606659163The Android Open Source Project * os_memoryAlloc() 7764064216a8433360745f69edddce19a606659163The Android Open Source Project **************************************************************************************** 7864064216a8433360745f69edddce19a606659163The Android Open Source ProjectDESCRIPTION: Allocates resident (nonpaged) system-space memory. 7964064216a8433360745f69edddce19a606659163The Android Open Source Project 8064064216a8433360745f69edddce19a606659163The Android Open Source ProjectARGUMENTS: OsContext - our adapter context. 8164064216a8433360745f69edddce19a606659163The Android Open Source Project Size - Specifies the size, in bytes, to be allocated. 8264064216a8433360745f69edddce19a606659163The Android Open Source Project 8364064216a8433360745f69edddce19a606659163The Android Open Source ProjectRETURN: Pointer to the allocated memory. 8464064216a8433360745f69edddce19a606659163The Android Open Source Project NULL if there is insufficient memory available. 8564064216a8433360745f69edddce19a606659163The Android Open Source Project 8664064216a8433360745f69edddce19a606659163The Android Open Source ProjectNOTES: With the call to vmalloc it is assumed that this function will 8764064216a8433360745f69edddce19a606659163The Android Open Source Project never be called in an interrupt context. vmalloc has the potential to 8864064216a8433360745f69edddce19a606659163The Android Open Source Project sleep the caller while waiting for memory to become available. 8964064216a8433360745f69edddce19a606659163The Android Open Source Project 9064064216a8433360745f69edddce19a606659163The Android Open Source Project*****************************************************************************************/ 9164064216a8433360745f69edddce19a606659163The Android Open Source ProjectPVOID 9264064216a8433360745f69edddce19a606659163The Android Open Source Projectos_memoryAlloc( 9364064216a8433360745f69edddce19a606659163The Android Open Source Project TI_HANDLE OsContext, 9464064216a8433360745f69edddce19a606659163The Android Open Source Project UINT32 Size 9564064216a8433360745f69edddce19a606659163The Android Open Source Project ) 9664064216a8433360745f69edddce19a606659163The Android Open Source Project{ 9764064216a8433360745f69edddce19a606659163The Android Open Source Project struct os_mem_block *blk; 9864064216a8433360745f69edddce19a606659163The Android Open Source Project __u32 total_size = Size + sizeof(struct os_mem_block) + sizeof(__u32); 9964064216a8433360745f69edddce19a606659163The Android Open Source Project 10064064216a8433360745f69edddce19a606659163The Android Open Source Project#ifdef TI_MEM_ALLOC_TRACE 10164064216a8433360745f69edddce19a606659163The Android Open Source Project os_printf("MTT:%s:%d ::os_memoryAlloc(0x%p, %lu) : %lu\n",__FUNCTION__, __LINE__,OsContext,Size,total_size); 10264064216a8433360745f69edddce19a606659163The Android Open Source Project#endif 10364064216a8433360745f69edddce19a606659163The Android Open Source Project if( total_size < Size ) { /* Dm: Security fix */ 10464064216a8433360745f69edddce19a606659163The Android Open Source Project return NULL; 10564064216a8433360745f69edddce19a606659163The Android Open Source Project } 10664064216a8433360745f69edddce19a606659163The Android Open Source Project /* 10764064216a8433360745f69edddce19a606659163The Android Open Source Project memory optimization issue. Allocate 8 kB and less from the SLAB allocator (2^n) 10864064216a8433360745f69edddce19a606659163The Android Open Source Project otherwise allocate from virtual pool. 10964064216a8433360745f69edddce19a606659163The Android Open Source Project */ 11064064216a8433360745f69edddce19a606659163The Android Open Source Project /* 2 pages */ 1119e2fac0a4ecb09f18a82862079172579a6947428Dmitry Shmidt if (total_size < 2 * 4096) 11264064216a8433360745f69edddce19a606659163The Android Open Source Project { 11364064216a8433360745f69edddce19a606659163The Android Open Source Project if (in_atomic()) 11464064216a8433360745f69edddce19a606659163The Android Open Source Project blk = kmalloc(total_size, GFP_ATOMIC); 11564064216a8433360745f69edddce19a606659163The Android Open Source Project else 11664064216a8433360745f69edddce19a606659163The Android Open Source Project blk = kmalloc(total_size, GFP_KERNEL); 11764064216a8433360745f69edddce19a606659163The Android Open Source Project if (!blk) 11864064216a8433360745f69edddce19a606659163The Android Open Source Project return NULL; 11964064216a8433360745f69edddce19a606659163The Android Open Source Project blk->f_free = (os_free)kfree; 12064064216a8433360745f69edddce19a606659163The Android Open Source Project } 12164064216a8433360745f69edddce19a606659163The Android Open Source Project else 12264064216a8433360745f69edddce19a606659163The Android Open Source Project { 12364064216a8433360745f69edddce19a606659163The Android Open Source Project /* We expect that the big allocations should be made outside the interrupt, 12464064216a8433360745f69edddce19a606659163The Android Open Source Project otherwise fail 12564064216a8433360745f69edddce19a606659163The Android Open Source Project */ 12664064216a8433360745f69edddce19a606659163The Android Open Source Project if (in_atomic()) 12764064216a8433360745f69edddce19a606659163The Android Open Source Project return NULL; 12864064216a8433360745f69edddce19a606659163The Android Open Source Project blk = vmalloc(total_size); 12964064216a8433360745f69edddce19a606659163The Android Open Source Project if (!blk) 13064064216a8433360745f69edddce19a606659163The Android Open Source Project return NULL; 13164064216a8433360745f69edddce19a606659163The Android Open Source Project blk->f_free = (os_free)vfree; 13264064216a8433360745f69edddce19a606659163The Android Open Source Project } 13364064216a8433360745f69edddce19a606659163The Android Open Source Project 13464064216a8433360745f69edddce19a606659163The Android Open Source Project os_profile (OsContext, 4, total_size); 13564064216a8433360745f69edddce19a606659163The Android Open Source Project 13664064216a8433360745f69edddce19a606659163The Android Open Source Project /*list_add(&blk->blk_list, &drv->mem_blocks);*/ 13764064216a8433360745f69edddce19a606659163The Android Open Source Project blk->size = Size; 13864064216a8433360745f69edddce19a606659163The Android Open Source Project blk->signature = MEM_BLOCK_START; 13964064216a8433360745f69edddce19a606659163The Android Open Source Project *(__u32 *)((unsigned char *)blk + total_size - sizeof(__u32)) = MEM_BLOCK_END; 14064064216a8433360745f69edddce19a606659163The Android Open Source Project return (PVOID)((char *)blk + sizeof(struct os_mem_block)); 14164064216a8433360745f69edddce19a606659163The Android Open Source Project} 14264064216a8433360745f69edddce19a606659163The Android Open Source Project 14364064216a8433360745f69edddce19a606659163The Android Open Source Project/**************************************************************************************** 14464064216a8433360745f69edddce19a606659163The Android Open Source Project * os_memoryPreFree() 14564064216a8433360745f69edddce19a606659163The Android Open Source Project **************************************************************************************** 14664064216a8433360745f69edddce19a606659163The Android Open Source ProjectDESCRIPTION: Frees preallocated by the kernel memory. 14764064216a8433360745f69edddce19a606659163The Android Open Source Project 14864064216a8433360745f69edddce19a606659163The Android Open Source ProjectARGUMENTS: ptr - pointer to memory 14964064216a8433360745f69edddce19a606659163The Android Open Source Project*****************************************************************************************/ 15064064216a8433360745f69edddce19a606659163The Android Open Source Projectvoid os_memoryPreFree( void *ptr ) 15164064216a8433360745f69edddce19a606659163The Android Open Source Project{ 15264064216a8433360745f69edddce19a606659163The Android Open Source Project} 15364064216a8433360745f69edddce19a606659163The Android Open Source Project 15464064216a8433360745f69edddce19a606659163The Android Open Source Project/**************************************************************************************** 15564064216a8433360745f69edddce19a606659163The Android Open Source Project * os_memoryPreAlloc() 15664064216a8433360745f69edddce19a606659163The Android Open Source Project **************************************************************************************** 15764064216a8433360745f69edddce19a606659163The Android Open Source ProjectDESCRIPTION: Gets system-space memory preallocated by kernel. 15864064216a8433360745f69edddce19a606659163The Android Open Source Project 15964064216a8433360745f69edddce19a606659163The Android Open Source ProjectARGUMENTS: OsContext - our adapter context. 16064064216a8433360745f69edddce19a606659163The Android Open Source Project section - section number 16164064216a8433360745f69edddce19a606659163The Android Open Source Project Size - Specifies the size, in bytes, to be allocated. 16264064216a8433360745f69edddce19a606659163The Android Open Source Project 16364064216a8433360745f69edddce19a606659163The Android Open Source ProjectRETURN: Pointer to the allocated memory. 16464064216a8433360745f69edddce19a606659163The Android Open Source Project NULL if there is insufficient memory available. 16564064216a8433360745f69edddce19a606659163The Android Open Source Project*****************************************************************************************/ 16664064216a8433360745f69edddce19a606659163The Android Open Source ProjectPVOID 16764064216a8433360745f69edddce19a606659163The Android Open Source Projectos_memoryPreAlloc( 16864064216a8433360745f69edddce19a606659163The Android Open Source Project TI_HANDLE OsContext, 16964064216a8433360745f69edddce19a606659163The Android Open Source Project int section, 17064064216a8433360745f69edddce19a606659163The Android Open Source Project UINT32 Size 17164064216a8433360745f69edddce19a606659163The Android Open Source Project ) 17264064216a8433360745f69edddce19a606659163The Android Open Source Project{ 17364064216a8433360745f69edddce19a606659163The Android Open Source Project struct os_mem_block *blk; 17464064216a8433360745f69edddce19a606659163The Android Open Source Project __u32 total_size = Size + sizeof(struct os_mem_block) + sizeof(__u32); 17564064216a8433360745f69edddce19a606659163The Android Open Source Project 17664064216a8433360745f69edddce19a606659163The Android Open Source Project#ifdef TI_MEM_ALLOC_TRACE 17764064216a8433360745f69edddce19a606659163The Android Open Source Project os_printf("MTT:%s:%d ::os_memoryPreAlloc(0x%p, %lu) : %lu\n",__FUNCTION__, __LINE__,OsContext,Size,total_size); 17864064216a8433360745f69edddce19a606659163The Android Open Source Project#endif 17964064216a8433360745f69edddce19a606659163The Android Open Source Project if( total_size < Size ) { /* Dm: Security fix */ 18064064216a8433360745f69edddce19a606659163The Android Open Source Project return NULL; 18164064216a8433360745f69edddce19a606659163The Android Open Source Project } 18264064216a8433360745f69edddce19a606659163The Android Open Source Project 18364064216a8433360745f69edddce19a606659163The Android Open Source Project blk = (struct os_mem_block *)wifi_kernel_prealloc( section, total_size ); 18464064216a8433360745f69edddce19a606659163The Android Open Source Project if( !blk ) { 18564064216a8433360745f69edddce19a606659163The Android Open Source Project return os_memoryAlloc(OsContext, Size); 18664064216a8433360745f69edddce19a606659163The Android Open Source Project } 18764064216a8433360745f69edddce19a606659163The Android Open Source Project blk->f_free = (os_free)os_memoryPreFree; 18864064216a8433360745f69edddce19a606659163The Android Open Source Project 18964064216a8433360745f69edddce19a606659163The Android Open Source Project os_profile (OsContext, 4, total_size); 19064064216a8433360745f69edddce19a606659163The Android Open Source Project 19164064216a8433360745f69edddce19a606659163The Android Open Source Project /*list_add(&blk->blk_list, &drv->mem_blocks);*/ 19264064216a8433360745f69edddce19a606659163The Android Open Source Project blk->size = Size; 19364064216a8433360745f69edddce19a606659163The Android Open Source Project blk->signature = MEM_BLOCK_START; 19464064216a8433360745f69edddce19a606659163The Android Open Source Project *(__u32 *)((unsigned char *)blk + total_size - sizeof(__u32)) = MEM_BLOCK_END; 19564064216a8433360745f69edddce19a606659163The Android Open Source Project return (PVOID)((char *)blk + sizeof(struct os_mem_block)); 19664064216a8433360745f69edddce19a606659163The Android Open Source Project} 19764064216a8433360745f69edddce19a606659163The Android Open Source Project 19864064216a8433360745f69edddce19a606659163The Android Open Source Project 19964064216a8433360745f69edddce19a606659163The Android Open Source Project/**************************************************************************************** 20064064216a8433360745f69edddce19a606659163The Android Open Source Project * os_memoryCAlloc() 20164064216a8433360745f69edddce19a606659163The Android Open Source Project **************************************************************************************** 20264064216a8433360745f69edddce19a606659163The Android Open Source ProjectDESCRIPTION: Allocates an array in memory with elements initialized to 0. 20364064216a8433360745f69edddce19a606659163The Android Open Source Project 20464064216a8433360745f69edddce19a606659163The Android Open Source ProjectARGUMENTS: OsContext - our adapter context. 20564064216a8433360745f69edddce19a606659163The Android Open Source Project Number - Number of elements 20664064216a8433360745f69edddce19a606659163The Android Open Source Project Size - Length in bytes of each element 20764064216a8433360745f69edddce19a606659163The Android Open Source Project 20864064216a8433360745f69edddce19a606659163The Android Open Source ProjectRETURN: None 20964064216a8433360745f69edddce19a606659163The Android Open Source Project 21064064216a8433360745f69edddce19a606659163The Android Open Source ProjectNOTES: 21164064216a8433360745f69edddce19a606659163The Android Open Source Project*****************************************************************************************/ 21264064216a8433360745f69edddce19a606659163The Android Open Source ProjectPVOID 21364064216a8433360745f69edddce19a606659163The Android Open Source Projectos_memoryCAlloc( 21464064216a8433360745f69edddce19a606659163The Android Open Source Project TI_HANDLE OsContext, 21564064216a8433360745f69edddce19a606659163The Android Open Source Project UINT32 Number, 21664064216a8433360745f69edddce19a606659163The Android Open Source Project UINT32 Size 21764064216a8433360745f69edddce19a606659163The Android Open Source Project ) 21864064216a8433360745f69edddce19a606659163The Android Open Source Project{ 21964064216a8433360745f69edddce19a606659163The Android Open Source Project PVOID pAllocatedMem; 22064064216a8433360745f69edddce19a606659163The Android Open Source Project ULONG MemSize; 22164064216a8433360745f69edddce19a606659163The Android Open Source Project 22264064216a8433360745f69edddce19a606659163The Android Open Source Project#ifdef TI_MEM_ALLOC_TRACE 22364064216a8433360745f69edddce19a606659163The Android Open Source Project os_printf("MTT:%s:%d ::os_memoryCAlloc(0x%p, %lu, %lu) : %lu\n",__FUNCTION__,__LINE__,OsContext,Number,Size,Number*Size); 22464064216a8433360745f69edddce19a606659163The Android Open Source Project#endif 22564064216a8433360745f69edddce19a606659163The Android Open Source Project MemSize = Number * Size; 22664064216a8433360745f69edddce19a606659163The Android Open Source Project 22764064216a8433360745f69edddce19a606659163The Android Open Source Project if( (Number > 0) && (Size >= (0xFFFFFFFFUL / Number)) ) { /* Dm: Security fix */ 22864064216a8433360745f69edddce19a606659163The Android Open Source Project return NULL; 22964064216a8433360745f69edddce19a606659163The Android Open Source Project } 23064064216a8433360745f69edddce19a606659163The Android Open Source Project 23164064216a8433360745f69edddce19a606659163The Android Open Source Project pAllocatedMem = os_memoryAlloc(OsContext, MemSize); 23264064216a8433360745f69edddce19a606659163The Android Open Source Project 23364064216a8433360745f69edddce19a606659163The Android Open Source Project if(!pAllocatedMem) 23464064216a8433360745f69edddce19a606659163The Android Open Source Project return NULL; 23564064216a8433360745f69edddce19a606659163The Android Open Source Project 23664064216a8433360745f69edddce19a606659163The Android Open Source Project memset(pAllocatedMem,0,MemSize); 23764064216a8433360745f69edddce19a606659163The Android Open Source Project 23864064216a8433360745f69edddce19a606659163The Android Open Source Project return pAllocatedMem; 23964064216a8433360745f69edddce19a606659163The Android Open Source Project} 24064064216a8433360745f69edddce19a606659163The Android Open Source Project 24164064216a8433360745f69edddce19a606659163The Android Open Source Project/**************************************************************************************** 24264064216a8433360745f69edddce19a606659163The Android Open Source Project * os_memoryFree() 24364064216a8433360745f69edddce19a606659163The Android Open Source Project **************************************************************************************** 24464064216a8433360745f69edddce19a606659163The Android Open Source ProjectDESCRIPTION: This function releases a block of memory previously allocated with the 24564064216a8433360745f69edddce19a606659163The Android Open Source Project os_memoryAlloc function. 24664064216a8433360745f69edddce19a606659163The Android Open Source Project 24764064216a8433360745f69edddce19a606659163The Android Open Source Project 24864064216a8433360745f69edddce19a606659163The Android Open Source ProjectARGUMENTS: OsContext - our adapter context. 24964064216a8433360745f69edddce19a606659163The Android Open Source Project pMemPtr - Pointer to the base virtual address of the allocated memory. 25064064216a8433360745f69edddce19a606659163The Android Open Source Project This address was returned by the os_memoryAlloc function. 25164064216a8433360745f69edddce19a606659163The Android Open Source Project Size - Specifies the size, in bytes, of the memory block to be released. 25264064216a8433360745f69edddce19a606659163The Android Open Source Project This parameter must be identical to the Length that was passed to 25364064216a8433360745f69edddce19a606659163The Android Open Source Project os_memoryAlloc. 25464064216a8433360745f69edddce19a606659163The Android Open Source Project 25564064216a8433360745f69edddce19a606659163The Android Open Source ProjectRETURN: None 25664064216a8433360745f69edddce19a606659163The Android Open Source Project 25764064216a8433360745f69edddce19a606659163The Android Open Source ProjectNOTES: 25864064216a8433360745f69edddce19a606659163The Android Open Source Project*****************************************************************************************/ 25964064216a8433360745f69edddce19a606659163The Android Open Source ProjectVOID 26064064216a8433360745f69edddce19a606659163The Android Open Source Projectos_memoryFree( 26164064216a8433360745f69edddce19a606659163The Android Open Source Project TI_HANDLE OsContext, 26264064216a8433360745f69edddce19a606659163The Android Open Source Project PVOID pMemPtr, 26364064216a8433360745f69edddce19a606659163The Android Open Source Project UINT32 Size 26464064216a8433360745f69edddce19a606659163The Android Open Source Project ) 26564064216a8433360745f69edddce19a606659163The Android Open Source Project{ 26664064216a8433360745f69edddce19a606659163The Android Open Source Project struct os_mem_block *blk = 26764064216a8433360745f69edddce19a606659163The Android Open Source Project (struct os_mem_block *)((char *)pMemPtr - sizeof(struct os_mem_block)); 26864064216a8433360745f69edddce19a606659163The Android Open Source Project 26964064216a8433360745f69edddce19a606659163The Android Open Source Project#ifdef TI_MEM_ALLOC_TRACE 27064064216a8433360745f69edddce19a606659163The Android Open Source Project os_printf("MTT:%s:%d ::os_memoryFree(0x%p, 0x%p, %lu) : %d\n",__FUNCTION__,__LINE__,OsContext,pMemPtr,Size,-Size); 27164064216a8433360745f69edddce19a606659163The Android Open Source Project#endif 27264064216a8433360745f69edddce19a606659163The Android Open Source Project if (blk->signature != MEM_BLOCK_START) 27364064216a8433360745f69edddce19a606659163The Android Open Source Project { 27464064216a8433360745f69edddce19a606659163The Android Open Source Project printk("\n\n%s: memory block signature is incorrect - 0x%x\n\n\n", 27564064216a8433360745f69edddce19a606659163The Android Open Source Project __FUNCTION__, blk->signature); 27664064216a8433360745f69edddce19a606659163The Android Open Source Project return; 27764064216a8433360745f69edddce19a606659163The Android Open Source Project } 27864064216a8433360745f69edddce19a606659163The Android Open Source Project *(char *)(&blk->signature) = '~'; 27964064216a8433360745f69edddce19a606659163The Android Open Source Project if (*(__u32 *)((unsigned char *)blk + blk->size + sizeof(struct os_mem_block)) 28064064216a8433360745f69edddce19a606659163The Android Open Source Project != MEM_BLOCK_END) 28164064216a8433360745f69edddce19a606659163The Android Open Source Project { 28264064216a8433360745f69edddce19a606659163The Android Open Source Project printk("\n\n%s: memory block corruption. Size=%u\n\n\n", 28364064216a8433360745f69edddce19a606659163The Android Open Source Project __FUNCTION__, blk->size); 28464064216a8433360745f69edddce19a606659163The Android Open Source Project } 28564064216a8433360745f69edddce19a606659163The Android Open Source Project 28664064216a8433360745f69edddce19a606659163The Android Open Source Project os_profile (OsContext, 5, blk->size + sizeof(struct os_mem_block) + sizeof(__u32)); 28764064216a8433360745f69edddce19a606659163The Android Open Source Project 28864064216a8433360745f69edddce19a606659163The Android Open Source Project blk->f_free(blk); 28964064216a8433360745f69edddce19a606659163The Android Open Source Project} 29064064216a8433360745f69edddce19a606659163The Android Open Source Project 29164064216a8433360745f69edddce19a606659163The Android Open Source Project 29264064216a8433360745f69edddce19a606659163The Android Open Source Project/**************************************************************************************** 29364064216a8433360745f69edddce19a606659163The Android Open Source Project * os_memorySet() 29464064216a8433360745f69edddce19a606659163The Android Open Source Project **************************************************************************************** 29564064216a8433360745f69edddce19a606659163The Android Open Source ProjectDESCRIPTION: This function fills a block of memory with given value. 29664064216a8433360745f69edddce19a606659163The Android Open Source Project 29764064216a8433360745f69edddce19a606659163The Android Open Source ProjectARGUMENTS: OsContext - our adapter context. 29864064216a8433360745f69edddce19a606659163The Android Open Source Project pMemPtr - Specifies the base address of a block of memory 29964064216a8433360745f69edddce19a606659163The Android Open Source Project Value - Specifies the value to set 30064064216a8433360745f69edddce19a606659163The Android Open Source Project Length - Specifies the size, in bytes, to copy. 30164064216a8433360745f69edddce19a606659163The Android Open Source Project 30264064216a8433360745f69edddce19a606659163The Android Open Source ProjectRETURN: None 30364064216a8433360745f69edddce19a606659163The Android Open Source Project 30464064216a8433360745f69edddce19a606659163The Android Open Source ProjectNOTES: 30564064216a8433360745f69edddce19a606659163The Android Open Source Project*****************************************************************************************/ 30664064216a8433360745f69edddce19a606659163The Android Open Source ProjectVOID 30764064216a8433360745f69edddce19a606659163The Android Open Source Projectos_memorySet( 30864064216a8433360745f69edddce19a606659163The Android Open Source Project TI_HANDLE OsContext, 30964064216a8433360745f69edddce19a606659163The Android Open Source Project PVOID pMemPtr, 31064064216a8433360745f69edddce19a606659163The Android Open Source Project INT32 Value, 31164064216a8433360745f69edddce19a606659163The Android Open Source Project UINT32 Length 31264064216a8433360745f69edddce19a606659163The Android Open Source Project ) 31364064216a8433360745f69edddce19a606659163The Android Open Source Project{ 31464064216a8433360745f69edddce19a606659163The Android Open Source Project memset(pMemPtr,Value,Length); 31564064216a8433360745f69edddce19a606659163The Android Open Source Project} 31664064216a8433360745f69edddce19a606659163The Android Open Source Project 31764064216a8433360745f69edddce19a606659163The Android Open Source Project/**************************************************************************************** 31864064216a8433360745f69edddce19a606659163The Android Open Source Project * _os_memoryAlloc4HwDma() 31964064216a8433360745f69edddce19a606659163The Android Open Source Project **************************************************************************************** 32064064216a8433360745f69edddce19a606659163The Android Open Source ProjectDESCRIPTION: Allocates resident (nonpaged) system-space memory for DMA operations. 32164064216a8433360745f69edddce19a606659163The Android Open Source Project 32264064216a8433360745f69edddce19a606659163The Android Open Source ProjectARGUMENTS: OsContext - our adapter context. 32364064216a8433360745f69edddce19a606659163The Android Open Source Project Size - Specifies the size, in bytes, to be allocated. 32464064216a8433360745f69edddce19a606659163The Android Open Source Project 32564064216a8433360745f69edddce19a606659163The Android Open Source ProjectRETURN: Pointer to the allocated memory. 32664064216a8433360745f69edddce19a606659163The Android Open Source Project NULL if there is insufficient memory available. 32764064216a8433360745f69edddce19a606659163The Android Open Source Project 32864064216a8433360745f69edddce19a606659163The Android Open Source ProjectNOTES: 32964064216a8433360745f69edddce19a606659163The Android Open Source Project 33064064216a8433360745f69edddce19a606659163The Android Open Source Project*****************************************************************************************/ 33164064216a8433360745f69edddce19a606659163The Android Open Source ProjectPVOID 33264064216a8433360745f69edddce19a606659163The Android Open Source Projectos_memoryAlloc4HwDma( 33364064216a8433360745f69edddce19a606659163The Android Open Source Project TI_HANDLE pOsContext, 33464064216a8433360745f69edddce19a606659163The Android Open Source Project UINT32 Size 33564064216a8433360745f69edddce19a606659163The Android Open Source Project ) 33664064216a8433360745f69edddce19a606659163The Android Open Source Project{ 33764064216a8433360745f69edddce19a606659163The Android Open Source Project struct os_mem_block *blk; 33864064216a8433360745f69edddce19a606659163The Android Open Source Project __u32 total_size = Size + sizeof(struct os_mem_block) + sizeof(__u32); 33964064216a8433360745f69edddce19a606659163The Android Open Source Project /* 34064064216a8433360745f69edddce19a606659163The Android Open Source Project if the size is greater than 2 pages then we cant allocate the memory through kmalloc so the function fails 34164064216a8433360745f69edddce19a606659163The Android Open Source Project */ 34264064216a8433360745f69edddce19a606659163The Android Open Source Project if (Size < 2 * OS_PAGE_SIZE) 34364064216a8433360745f69edddce19a606659163The Android Open Source Project { 34464064216a8433360745f69edddce19a606659163The Android Open Source Project blk = kmalloc(total_size, GFP_ATOMIC); 34564064216a8433360745f69edddce19a606659163The Android Open Source Project if (!blk) 34664064216a8433360745f69edddce19a606659163The Android Open Source Project return NULL; 34764064216a8433360745f69edddce19a606659163The Android Open Source Project blk->f_free = (os_free)kfree; 34864064216a8433360745f69edddce19a606659163The Android Open Source Project } 34964064216a8433360745f69edddce19a606659163The Android Open Source Project else 35064064216a8433360745f69edddce19a606659163The Android Open Source Project { 35164064216a8433360745f69edddce19a606659163The Android Open Source Project printk("\n\n%s: memory cant be allocated-Size = %d\n\n\n", 35264064216a8433360745f69edddce19a606659163The Android Open Source Project __FUNCTION__, Size); 35364064216a8433360745f69edddce19a606659163The Android Open Source Project return NULL; 35464064216a8433360745f69edddce19a606659163The Android Open Source Project } 35564064216a8433360745f69edddce19a606659163The Android Open Source Project 35664064216a8433360745f69edddce19a606659163The Android Open Source Project blk->size = Size; 35764064216a8433360745f69edddce19a606659163The Android Open Source Project blk->signature = MEM_BLOCK_START; 35864064216a8433360745f69edddce19a606659163The Android Open Source Project *(__u32 *)((unsigned char *)blk + total_size - sizeof(__u32)) = MEM_BLOCK_END; 35964064216a8433360745f69edddce19a606659163The Android Open Source Project return (PVOID)((char *)blk + sizeof(struct os_mem_block)); 36064064216a8433360745f69edddce19a606659163The Android Open Source Project} 36164064216a8433360745f69edddce19a606659163The Android Open Source Project 36264064216a8433360745f69edddce19a606659163The Android Open Source Project/**************************************************************************************** 36364064216a8433360745f69edddce19a606659163The Android Open Source Project * _os_memory4HwDmaFree() 36464064216a8433360745f69edddce19a606659163The Android Open Source Project **************************************************************************************** 36564064216a8433360745f69edddce19a606659163The Android Open Source ProjectDESCRIPTION: This function releases a block of memory previously allocated with the 36664064216a8433360745f69edddce19a606659163The Android Open Source Project _os_memoryAlloc4HwDma function. 36764064216a8433360745f69edddce19a606659163The Android Open Source Project 36864064216a8433360745f69edddce19a606659163The Android Open Source Project 36964064216a8433360745f69edddce19a606659163The Android Open Source ProjectARGUMENTS: OsContext - our adapter context. 37064064216a8433360745f69edddce19a606659163The Android Open Source Project pMemPtr - Pointer to the base virtual address of the allocated memory. 37164064216a8433360745f69edddce19a606659163The Android Open Source Project This address was returned by the os_memoryAlloc function. 37264064216a8433360745f69edddce19a606659163The Android Open Source Project Size - Specifies the size, in bytes, of the memory block to be released. 37364064216a8433360745f69edddce19a606659163The Android Open Source Project This parameter must be identical to the Length that was passed to 37464064216a8433360745f69edddce19a606659163The Android Open Source Project os_memoryAlloc. 37564064216a8433360745f69edddce19a606659163The Android Open Source Project 37664064216a8433360745f69edddce19a606659163The Android Open Source ProjectRETURN: None 37764064216a8433360745f69edddce19a606659163The Android Open Source Project 37864064216a8433360745f69edddce19a606659163The Android Open Source ProjectNOTES: 37964064216a8433360745f69edddce19a606659163The Android Open Source Project*****************************************************************************************/ 38064064216a8433360745f69edddce19a606659163The Android Open Source Projectvoid 38164064216a8433360745f69edddce19a606659163The Android Open Source Projectos_memory4HwDmaFree( 38264064216a8433360745f69edddce19a606659163The Android Open Source Project TI_HANDLE pOsContext, 38364064216a8433360745f69edddce19a606659163The Android Open Source Project PVOID pMem_ptr, 38464064216a8433360745f69edddce19a606659163The Android Open Source Project UINT32 Size 38564064216a8433360745f69edddce19a606659163The Android Open Source Project ) 38664064216a8433360745f69edddce19a606659163The Android Open Source Project{ 38764064216a8433360745f69edddce19a606659163The Android Open Source Project struct os_mem_block *blk = 38864064216a8433360745f69edddce19a606659163The Android Open Source Project (struct os_mem_block *)((char *)pMem_ptr - sizeof(struct os_mem_block)); 38964064216a8433360745f69edddce19a606659163The Android Open Source Project 39064064216a8433360745f69edddce19a606659163The Android Open Source Project if (blk->signature != MEM_BLOCK_START) 39164064216a8433360745f69edddce19a606659163The Android Open Source Project { 39264064216a8433360745f69edddce19a606659163The Android Open Source Project printk("\n\n%s: memory block signature is incorrect - 0x%x\n\n\n", 39364064216a8433360745f69edddce19a606659163The Android Open Source Project __FUNCTION__, blk->signature); 39464064216a8433360745f69edddce19a606659163The Android Open Source Project return; 39564064216a8433360745f69edddce19a606659163The Android Open Source Project } 39664064216a8433360745f69edddce19a606659163The Android Open Source Project *(char *)(&blk->signature) = '~'; 39764064216a8433360745f69edddce19a606659163The Android Open Source Project if (*(__u32 *)((unsigned char *)blk + blk->size + sizeof(struct os_mem_block)) 39864064216a8433360745f69edddce19a606659163The Android Open Source Project != MEM_BLOCK_END) 39964064216a8433360745f69edddce19a606659163The Android Open Source Project { 40064064216a8433360745f69edddce19a606659163The Android Open Source Project printk("\n\n%s: memory block corruption. Size=%u\n\n\n", 40164064216a8433360745f69edddce19a606659163The Android Open Source Project __FUNCTION__, blk->size); 40264064216a8433360745f69edddce19a606659163The Android Open Source Project } 40364064216a8433360745f69edddce19a606659163The Android Open Source Project 40464064216a8433360745f69edddce19a606659163The Android Open Source Project blk->f_free(blk); 40564064216a8433360745f69edddce19a606659163The Android Open Source Project} 40664064216a8433360745f69edddce19a606659163The Android Open Source Project 40764064216a8433360745f69edddce19a606659163The Android Open Source Project/**************************************************************************************** 40864064216a8433360745f69edddce19a606659163The Android Open Source Project * os_memoryZero() 40964064216a8433360745f69edddce19a606659163The Android Open Source Project **************************************************************************************** 41064064216a8433360745f69edddce19a606659163The Android Open Source ProjectDESCRIPTION: This function fills a block of memory with 0s. 41164064216a8433360745f69edddce19a606659163The Android Open Source Project 41264064216a8433360745f69edddce19a606659163The Android Open Source ProjectARGUMENTS: OsContext - our adapter context. 41364064216a8433360745f69edddce19a606659163The Android Open Source Project pMemPtr - Specifies the base address of a block of memory 41464064216a8433360745f69edddce19a606659163The Android Open Source Project Length - Specifies how many bytes to fill with 0s. 41564064216a8433360745f69edddce19a606659163The Android Open Source Project 41664064216a8433360745f69edddce19a606659163The Android Open Source ProjectRETURN: None 41764064216a8433360745f69edddce19a606659163The Android Open Source Project 41864064216a8433360745f69edddce19a606659163The Android Open Source ProjectNOTES: 41964064216a8433360745f69edddce19a606659163The Android Open Source Project*****************************************************************************************/ 42064064216a8433360745f69edddce19a606659163The Android Open Source ProjectVOID 42164064216a8433360745f69edddce19a606659163The Android Open Source Projectos_memoryZero( 42264064216a8433360745f69edddce19a606659163The Android Open Source Project TI_HANDLE OsContext, 42364064216a8433360745f69edddce19a606659163The Android Open Source Project PVOID pMemPtr, 42464064216a8433360745f69edddce19a606659163The Android Open Source Project UINT32 Length 42564064216a8433360745f69edddce19a606659163The Android Open Source Project ) 42664064216a8433360745f69edddce19a606659163The Android Open Source Project{ 42764064216a8433360745f69edddce19a606659163The Android Open Source Project memset(pMemPtr,0,Length); 42864064216a8433360745f69edddce19a606659163The Android Open Source Project} 42964064216a8433360745f69edddce19a606659163The Android Open Source Project 43064064216a8433360745f69edddce19a606659163The Android Open Source Project 43164064216a8433360745f69edddce19a606659163The Android Open Source Project/**************************************************************************************** 43264064216a8433360745f69edddce19a606659163The Android Open Source Project * os_memoryCopy() 43364064216a8433360745f69edddce19a606659163The Android Open Source Project **************************************************************************************** 43464064216a8433360745f69edddce19a606659163The Android Open Source ProjectDESCRIPTION: This function copies a specified number of bytes from one caller-supplied 43564064216a8433360745f69edddce19a606659163The Android Open Source Project location to another. 43664064216a8433360745f69edddce19a606659163The Android Open Source Project 43764064216a8433360745f69edddce19a606659163The Android Open Source ProjectARGUMENTS: OsContext - our adapter context. 43864064216a8433360745f69edddce19a606659163The Android Open Source Project pDstPtr - Destination buffer 43964064216a8433360745f69edddce19a606659163The Android Open Source Project pSrcPtr - Source buffer 44064064216a8433360745f69edddce19a606659163The Android Open Source Project Size - Specifies the size, in bytes, to copy. 44164064216a8433360745f69edddce19a606659163The Android Open Source Project 44264064216a8433360745f69edddce19a606659163The Android Open Source ProjectRETURN: None 44364064216a8433360745f69edddce19a606659163The Android Open Source Project 44464064216a8433360745f69edddce19a606659163The Android Open Source ProjectNOTES: 44564064216a8433360745f69edddce19a606659163The Android Open Source Project*****************************************************************************************/ 44664064216a8433360745f69edddce19a606659163The Android Open Source ProjectVOID 44764064216a8433360745f69edddce19a606659163The Android Open Source Projectos_memoryCopy( 44864064216a8433360745f69edddce19a606659163The Android Open Source Project TI_HANDLE OsContext, 44964064216a8433360745f69edddce19a606659163The Android Open Source Project PVOID pDstPtr, 45064064216a8433360745f69edddce19a606659163The Android Open Source Project PVOID pSrcPtr, 45164064216a8433360745f69edddce19a606659163The Android Open Source Project UINT32 Size 45264064216a8433360745f69edddce19a606659163The Android Open Source Project ) 45364064216a8433360745f69edddce19a606659163The Android Open Source Project{ 45464064216a8433360745f69edddce19a606659163The Android Open Source Project memcpy(pDstPtr,pSrcPtr,Size); 45564064216a8433360745f69edddce19a606659163The Android Open Source Project} 45664064216a8433360745f69edddce19a606659163The Android Open Source Project 45764064216a8433360745f69edddce19a606659163The Android Open Source Project/**************************************************************************************** 45864064216a8433360745f69edddce19a606659163The Android Open Source Project * os_memoryCompare() 45964064216a8433360745f69edddce19a606659163The Android Open Source Project **************************************************************************************** 46064064216a8433360745f69edddce19a606659163The Android Open Source ProjectDESCRIPTION: Compare characters in two buffers. 46164064216a8433360745f69edddce19a606659163The Android Open Source Project 46264064216a8433360745f69edddce19a606659163The Android Open Source ProjectARGUMENTS: OsContext - our adapter context. 46364064216a8433360745f69edddce19a606659163The Android Open Source Project Buf1 - First buffer 46464064216a8433360745f69edddce19a606659163The Android Open Source Project Buf2 - Second buffer 46564064216a8433360745f69edddce19a606659163The Android Open Source Project Count - Number of characters 46664064216a8433360745f69edddce19a606659163The Android Open Source Project 46764064216a8433360745f69edddce19a606659163The Android Open Source ProjectRETURN: The return value indicates the relationship between the buffers: 46864064216a8433360745f69edddce19a606659163The Android Open Source Project < 0 Buf1 less than Buf2 46964064216a8433360745f69edddce19a606659163The Android Open Source Project 0 Buf1 identical to Buf2 47064064216a8433360745f69edddce19a606659163The Android Open Source Project > 0 Buf1 greater than Buf2 47164064216a8433360745f69edddce19a606659163The Android Open Source Project 47264064216a8433360745f69edddce19a606659163The Android Open Source ProjectNOTES: 47364064216a8433360745f69edddce19a606659163The Android Open Source Project*****************************************************************************************/ 47464064216a8433360745f69edddce19a606659163The Android Open Source ProjectINT32 47564064216a8433360745f69edddce19a606659163The Android Open Source Projectos_memoryCompare( 47664064216a8433360745f69edddce19a606659163The Android Open Source Project TI_HANDLE OsContext, 47764064216a8433360745f69edddce19a606659163The Android Open Source Project PUINT8 Buf1, 47864064216a8433360745f69edddce19a606659163The Android Open Source Project PUINT8 Buf2, 47964064216a8433360745f69edddce19a606659163The Android Open Source Project INT32 Count 48064064216a8433360745f69edddce19a606659163The Android Open Source Project ) 48164064216a8433360745f69edddce19a606659163The Android Open Source Project{ 48264064216a8433360745f69edddce19a606659163The Android Open Source Project return memcmp(Buf1, Buf2, Count); 48364064216a8433360745f69edddce19a606659163The Android Open Source Project} 484