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