--- /dev/null
+/****************************************************************************
+**+-----------------------------------------------------------------------+**
+**| |**
+**| 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