blob: 6ae50e706668f6fb1b2a45003491dfd3d6067d36 [file] [log] [blame]
/****************************************************************************
**+-----------------------------------------------------------------------+**
**| |**
**| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved. |**
**| All rights reserved. |**
**| |**
**| Redistribution and use in source and binary forms, with or without |**
**| modification, are permitted provided that the following conditions |**
**| are met: |**
**| |**
**| * Redistributions of source code must retain the above copyright |**
**| notice, this list of conditions and the following disclaimer. |**
**| * Redistributions in binary form must reproduce the above copyright |**
**| notice, this list of conditions and the following disclaimer in |**
**| the documentation and/or other materials provided with the |**
**| distribution. |**
**| * Neither the name Texas Instruments nor the names of its |**
**| contributors may be used to endorse or promote products derived |**
**| from this software without specific prior written permission. |**
**| |**
**| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |**
**| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |**
**| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
**| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |**
**| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
**| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |**
**| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
**| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
**| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |**
**| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
**| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |**
**| |**
**+-----------------------------------------------------------------------+**
****************************************************************************/
/**************************************************************************/
/* */
/* MODULE: memMngr.h */
/* PURPOSE: Driver memory management */
/* */
/**************************************************************************/
#ifndef _MEM_MNGR_H_
#define _MEM_MNGR_H_
#include "osTIType.h"
#include "commonTypes.h"
#include "osApi.h"
#include "TNETW_Driver_types.h"
/*Ronnie: set # of MSDUs and BDs to be used in memMngrEx.c*/
#define DEF_NUMBER_OF_MSDUS 200 /* Total number of packets queued in driver. */
#define DEF_NUMBER_OF_BDS 400 /* Assuming typical MSDU uses 2 or 3 BDs. */
#define MIN_NUMBER_OF_BUF_POOLS 1
#define MAX_NUMBER_OF_BUF_POOLS 3
#ifdef SUPPORT_4X
#define DEF_NUMBER_OF_BUF_POOLS 3
#define DEF_BUFFER_LENGTH_POOL_1 64
#define DEF_BUFFER_LENGTH_POOL_2 2048
#define DEF_BUFFER_LENGTH_POOL_3 4096
#else
#define DEF_NUMBER_OF_BUF_POOLS 3
#define DEF_BUFFER_LENGTH_POOL_1 64
#define DEF_BUFFER_LENGTH_POOL_2 256
#define DEF_BUFFER_LENGTH_POOL_3 2048
#endif
#define MIN_BUFFER_LENGTH 64
#define MAX_BUFFER_LENGTH 4096
#define DEF_NUMBER_OF_BUFFERS_IN_POOL_1 160
#define DEF_NUMBER_OF_BUFFERS_IN_POOL_2 160
#define DEF_NUMBER_OF_BUFFERS_IN_POOL_3 160
#define WLAN_DRV_NULL_MEM_HANDLE 0xffffffff
#define NUM_OF_FREE_ARGS 5
#define MAX_NUM_OF_TIME_STAMPS 8
#define memMgr_BufLength(BufAddr) ( ((mem_BD_T *)BufAddr)->length )
#define memMgr_BufOffset(BufAddr) ( ((mem_BD_T *)BufAddr)->dataOffset )
#define memMgr_BufData(BufAddr) ( ((mem_BD_T *)BufAddr)->data )
#define memMgr_BufNext(BufAddr) ( ((mem_BD_T *)BufAddr)->nextBDPtr )
#define memMgr_MsduHdrLen(MsduAddr) ( ((mem_MSDU_T *)MsduAddr)->headerLen )
#define memMgr_MsduFirstLen(MsduAddr) ( ((mem_MSDU_T *)MsduAddr)->firstBDPtr->length )
#define memMgr_MsduHandle(MsduAddr) ( ((mem_MSDU_T *)MsduAddr)->handle )
/*
* Header resides after the Descriptor
*/
#define memMgr_MsduHdrAddr(MsduAddr) ( memMgr_BufData(((mem_MSDU_T *)MsduAddr)->firstBDPtr) + \
memMgr_BufOffset(((mem_MSDU_T *)MsduAddr)->firstBDPtr) + sizeof(DbTescriptor))
#define memMgr_MsduNextAddr(MsduAddr) ( ((mem_MSDU_T *)MsduAddr)->firstBDPtr->nextBDPtr )
#define memMgr_MsduDataAddr(MsduAddr) ( ((mem_MSDU_T *)MsduAddr)->firstBDPtr )
#define memMgr_MsduDataSize(MsduAddr) ( ((mem_MSDU_T *)MsduAddr)->dataLen )
#define memMgr_MsduNextGet(MsduAddr) ( ((mem_MSDU_T *)MsduAddr)->nextMSDUinList)
#define memMgr_MsduFreeFuncGet(MsduAddr)( ((mem_MSDU_T *)MsduAddr)->freeFunc)
#define memMgr_MsduFreeArg0Get(MsduAddr)( ((mem_MSDU_T *)MsduAddr)->freeArgs[0])
#define memMgr_MsduFreeArg1Get(MsduAddr)( ((mem_MSDU_T *)MsduAddr)->freeArgs[1])
#define memMgr_MsduFreeArg2Get(MsduAddr)( ((mem_MSDU_T *)MsduAddr)->freeArgs[2])
#define memMgr_MsduFreeArg3Get(MsduAddr)( ((mem_MSDU_T *)MsduAddr)->freeArgs[3])
#define memMgr_MsduFreeArg4Get(MsduAddr)( ((mem_MSDU_T *)MsduAddr)->freeArgs[4])
typedef enum
{
/*
* Allocate on Tx
*/
MLME_MODULE = 0,
OS_ABS_TX_MODULE,
RSN_MODULE,
HAL_TX_MODULE,
CONCAT_MODULE,
DE_CONCAT_MODULE,
ACK_EMUL_MODULE,
TX_MODULE,
MEASUREMENT_MODULE,
SITE_MGR_MODULE,
EXC_MANAGER_MODULE,
TRACE_BUFFER_MODULE,
ADM_CTRL_QOS_MODULE,
CURRENT_BSS_MODULE,
/*
* Allocate on Rx
*/
HAL_RX_MODULE,
CORE_RX_MODULE,
MLME_RX_MODULE,
OS_ABS_RX_MODULE,
RSN_RX_MODULE,
MEASUREMENT_RX_MODULE,
SITE_MGR_RX_MODULE,
EXC_MANAGER_RX_MODULE,
HAL_WEP1_RX,
HAL_WEP2_RX,
HAL_DEFRAG_RX,
HAL_DUPLICA_RX,
/*
DO NOT TOUCH - MODULE_FREE_MSDU, MAX_NUMBER_OF_MODULE!
*/
MODULE_FREE_MSDU,
MAX_NUMBER_OF_MODULE
}allocatingModule_e;
typedef void (*ap_FreeMemFunc)(TI_HANDLE, TI_HANDLE, TI_STATUS);
#ifdef TNETW_MASTER_MODE
typedef void (*bd_FreeMemFunc)( UINT32 , UINT32, UINT32, UINT32, UINT32 );
#endif
typedef struct mem_DataBuf_T mem_DataBuf_T;
struct mem_DataBuf_T {
/* READ ONLY */
/* The user MUST not change the following fields */
UINT32 handle; /* Hanlde of this Data Buffer Structure */
mem_DataBuf_T* nextDataBuf; /* pointer to the next free DataBuf
when this DataBuf is in Free mode */
UINT32 refCount; /* number of instances of this Data Buf */
/* PUBLIC - For the use of the User */
UINT32 poolIndex; /* the buffer pool index */
UINT8 *data; /* pointer to the Data */
#if defined TNETW_MASTER_MODE
OS_PHYSICAL_ADDRESS data_physical; /* Physical address of the data */
#endif
};
typedef struct mem_BD_T mem_BD_T;
struct mem_BD_T {
/* READ ONLY */
/* The user MUST not change the following fields */
UINT32 handle; /* Hanlde of this BD Data Structure */
UINT32 refCount; /* number of instances of this BD */
mem_DataBuf_T* dataBuf; /* pointer to the Data Buffer */
/* PUBLIC - For the use of the User */
char* data; /* Pointer to the Data */
UINT32 dataOffset; /* offset of the data */
UINT32 length; /* Tx : the length of the entire data (including TxDescriptor,TNETWIF_WRITE_OFFSET_BYTES etc..) */
/* Rx : the length of the data (excluding TNETWIF_READ_OFFSET_BYTES) */
mem_BD_T* nextBDPtr; /* pointer to the next BD */
#if defined TNETW_MASTER_MODE
UINT32 data_physical_low; /* Physical address (low) of the data */
bd_FreeMemFunc freeFunc; /* pointer to the Data Buffer free function */
UINT32 freeArgs[NUM_OF_FREE_ARGS]; /* arguments to be send with the free function */
#endif
};
typedef struct mem_MSDU_T mem_MSDU_T;
struct mem_MSDU_T {
/* READ ONLY */
/* The user MUST not change the following fields */
UINT32 handle; /* handle of this MSDU data structure */
mem_MSDU_T * nextFreeMSDU; /* pointer to the next Free MSDU when
this MSDU Buffer is in Free mode */
/* PUBLIC - For the use of the User */
UINT32 headerLen; /* the length of the 802.11 header */
mem_BD_T * firstBDPtr; /* pointer to the first BD */
mem_BD_T * lastBDPtr; /* pointer to the last BD */
ap_FreeMemFunc freeFunc; /* pointer to the Data Buffer free function */
UINT32 freeArgs[NUM_OF_FREE_ARGS]; /* arguments to be send with the free function */
UINT32 dataLen; /* length of the data (only data) of the firstBDPtr */
allocatingModule_e module; /* the allocating module */
/* support Msdu List */
mem_MSDU_T * nextMSDUinList; /* pointer to the next MSDU in Tx queue link list. */
mem_MSDU_T * prevMSDUinList; /* pointer to the previos MSDU in Tx queue link list. */
UINT32 txFlags; /* Tx flags */
UINT8 txCompleteFlags; /* Tx complete flags */
UINT32 insertionTime; /* time of msdu insersion to driver. */
UINT8 qosTag; /* 802.11d qos tag */
#ifdef DM_USE_WORKQUEUE
mem_MSDU_T * msdu_next; /* Used for Workqueue list */
#endif /* DM_USE_WORKQUEUE */
#ifdef TI_DBG
UINT32 timeStamp [MAX_NUM_OF_TIME_STAMPS];
/* array of time stamps */
UINT32 timeStampNum; /* number of time stamps */
#endif
};
typedef struct
{
UINT32 buffersSize; /* the size of the buffers in the pool */
UINT32 numFreeDataBuf; /* number of free data buffers */
UINT32 dataBufMaxNumber; /* maximum number of buffers */
mem_DataBuf_T* firstFreeDataBuf; /* pointer to the first free Data Buffer */
mem_DataBuf_T* dataBufPool; /* list of Data Buffers */
#ifdef TNETW_MASTER_MODE
OS_PHYSICAL_ADDRESS physicalDataBufPoolPtr;
#endif
UINT8* dataBufPoolPtr;
}buffersPool_t;
/* structures for initialization of Memory manager */
typedef struct
{
UINT32 numOfbuffers;
UINT32 buffersSize;
}bufPoolInit_t;
typedef struct
{
UINT8 numOfPools;
bufPoolInit_t bufPoolInit[MAX_NUMBER_OF_BUF_POOLS];
}memMngrInit_t;
/* MemMngr Control Block */
typedef struct
{
TI_HANDLE hReport; /* report handle */
TI_HANDLE hOs; /* Os handle */
TI_HANDLE hCriticalSectionProtect;
UINT32 currentNumberOfPools;
UINT32 msduMaxNumber; /* maximum number of MSDUs */
UINT32 bdMaxNumber; /* maximum number of BD;s */
mem_MSDU_T* msduPool; /* list of MSDU Buffer Desciptors */
mem_BD_T* bdPool; /* list of BD Buffer Descriptors */
mem_MSDU_T* firstFreeMSDU; /* pointer to the first free MSDU */
mem_BD_T* firstFreeBD; /* pointer to the first free BD */
UINT32 numFreeMSDU; /* number of free MSDU's */
UINT32 numFreeBD; /* number of free BD's */
UINT32 moduleAllocCount[MAX_NUMBER_OF_MODULE]; /* counters of allocated */
/* msdu per module */
buffersPool_t buffersPool[MAX_NUMBER_OF_BUF_POOLS]; /* Pools of Data Buffers */
}memMngr_t;
typedef struct
{
UINT32 numOfFreeBufPool1;
UINT32 numOfFreeBufPool2;
UINT32 numOfFreeBufPool3;
UINT32 numOfFreeBDs;
UINT32 numOfFreeMsdu;
}memMgrResources_t;
/*************************************************************************
* wlan_memMngrInit *
*************************************************************************
DESCRIPTION: Init of the Memory Manager module
INPUT:
OUTPUT:
RETURN: OK/NOK
**************************************************************************/
TI_HANDLE wlan_memMngrInit(TI_HANDLE hOs);
/*************************************************************************
* wlan_memMngrDestroy *
*************************************************************************
DESCRIPTION:
INPUT:
OUTPUT:
RETURN: OK/NOK
**************************************************************************/
TI_STATUS wlan_memMngrDestroy(TI_HANDLE hMemMngr);
/*************************************************************************
* wlan_memMngrConfigure *
*************************************************************************
DESCRIPTION:
INPUT:
OUTPUT:
RETURN: OK/NOK
**************************************************************************/
TI_STATUS wlan_memMngrConfigure(TI_HANDLE hMemMngr, TI_HANDLE hOs, TI_HANDLE hReport);
/*************************************************************************
* wlan_memMngrAllocDataBuf *
*************************************************************************
DESCRIPTION:This function allocates BDs and Data Buffers according to the
required length. The memory manager will allocate the Data
Buffers, update the buffer pointer in the BD structure and link
the BDs when more than one Data Buffer is required.
INPUT: len - the length of the required data buffer
OUTPUT: BDPtr - a pointer in which this function will return a pointer
to the allocated BD
RETURN: OK/NOK
**************************************************************************/
TI_STATUS wlan_memMngrAllocDataBuf(TI_HANDLE hMemMngr, mem_BD_T** bdPtr, UINT32 len);
/*************************************************************************
* wlan_memMngrAllocBDs *
*************************************************************************
DESCRIPTION:This function allocates and returns a pointer to an array of BDs.
This function does not allocate any memory buffers.
INPUT: BDsNumber - number of required BDs
OUTPUT: BDsPtr - a pointer in which this function will return a pointer
to an array of BD pointers
RETURN: OK/NOK
**************************************************************************/
TI_STATUS wlan_memMngrAllocBDs(TI_HANDLE hMemMngr, UINT32 bdNumber, mem_BD_T** bdPtr);
/*************************************************************************
* wlan_memMngrAllocMSDU *
*************************************************************************
DESCRIPTION:This function allocates MPDU structure.
INPUT: len - the length of the required data buffer
if len=0, than only MSDU buffer will be allocated
OUTPUT: MSDUPtr - a pointer in which this function will return a pointer
to the MSDU structure
RETURN: OK/NOK
**************************************************************************/
TI_STATUS wlan_memMngrAllocMSDU (TI_HANDLE hMemMngr, mem_MSDU_T** MSDUPtr,
UINT32 len, allocatingModule_e module);
/*************************************************************************
* wlan_memMngrAllocMSDUBufferOnly *
*************************************************************************
DESCRIPTION:This function allocates MPDU structure - without Data Buffers
INPUT:
OUTPUT: MSDUPtr - a pointer in which this function will return a pointer
to the MSDU structure
RETURN: OK/NOK
**************************************************************************/
TI_STATUS wlan_memMngrAllocMSDUBufferOnly(TI_HANDLE hMemMngr, mem_MSDU_T** MSDUPtr,
allocatingModule_e module);
/*************************************************************************
* wlan_memMngrDuplicateMSDU *
*************************************************************************
DESCRIPTION:This function duplicates the MSDU.
INPUT: handle - handle of the MSDU the user want to duplicate
OUTPUT: newHandle - pointer in which this function sets the handle of
the duplicated MSDU.
RETURN: OK/NOK
**************************************************************************/
TI_STATUS wlan_memMngrDuplicateMSDU(TI_HANDLE hMemMngr, UINT32 handle, UINT32* newHandle);
/*************************************************************************
* wlan_memMngrFreeMSDU *
*************************************************************************
DESCRIPTION:Free MSDU structure. This function will free all BDs and Data
Buffers that are bind to this MSDU.
INPUT: handle - handle of this MSDU
OUTPUT:
RETURN: OK/NOK
**************************************************************************/
TI_STATUS wlan_memMngrFreeMSDU(TI_HANDLE hMemMngr, UINT32 handle);
/*************************************************************************
* *
*************************************************************************
DESCRIPTION:
INPUT:
OUTPUT:
RETURN: OK/NOK
**************************************************************************/
TI_STATUS wlan_memMngrFreeListOfMSDU(TI_HANDLE hMemMngr, UINT32 handle);
/*************************************************************************
* wlan_memMngrFreeBD *
*************************************************************************
DESCRIPTION:Free BD structure. This function will free a list of BD
structures and the Data Buffer that is being pointed by these BD
if any. (e.g. - free MPDU)
INPUT: handle - handle of this BD
OUTPUT:
RETURN: freeFlag - return TRUE if this BD list was freed
return FALSE if this BD list was not freed (refCount>0)
**************************************************************************/
UINT32 wlan_memMngrFreeBD(TI_HANDLE hMemMngr, UINT32 handle);
/*************************************************************************
* *
*************************************************************************
DESCRIPTION:
INPUT:
OUTPUT:
RETURN:
**************************************************************************/
TI_STATUS wlan_memMngrFreeAllOsAlocatesBuffer(TI_HANDLE hMemMngr);
/*************************************************************************
* *
*************************************************************************
DESCRIPTION:
INPUT:
OUTPUT:
RETURN:
**************************************************************************/
TI_STATUS wlan_memMngrCopyMsduFreeFunc(TI_HANDLE hMemMngr, UINT32 destMsduHandle, UINT32 sourceMsduHandle);
/*************************************************************************
* *
*************************************************************************
DESCRIPTION:
INPUT:
OUTPUT:
RETURN:
**************************************************************************/
TI_STATUS wlan_memMngrGetMemMgrResources(TI_HANDLE hMemMngr, memMgrResources_t* memMgrResources);
/*************************************************************************
* *
*************************************************************************
DESCRIPTION:
INPUT:
OUTPUT:
RETURN:
**************************************************************************/
TI_STATUS wlan_memMngrChangeMsduOwner(TI_HANDLE hMemMngr,allocatingModule_e newModule,mem_MSDU_T *pMsdu);
TI_STATUS wlan_memMngrSwapMsdu(TI_HANDLE hMemMngr, mem_MSDU_T *pMsdu_1, mem_MSDU_T *pMsdu_2);
TI_STATUS wlan_memMngrAddTimeStamp (TI_HANDLE hMemMngr, mem_MSDU_T *pMsdu);
/*************************************************************************
* TEST_FUNCTIONS *
*************************************************************************/
void memMngrPrintHandle(TI_HANDLE hMemMngr, UINT32 handle);
void memMngrFullPrint(TI_HANDLE hMemMngr);
void memMngrPrint(TI_HANDLE hMemMngr);
/*test function*/
TI_STATUS txDataSTUB_txSendMsdu(TI_HANDLE hMemMngr, mem_MSDU_T *pMsdu);
void print_MsduDataHeader(TI_HANDLE hMemMngr, mem_MSDU_T *pMsdu);
void memMngrPrintMSDUWithItsBds(mem_MSDU_T* pMsdu );
#endif