OSDN Git Service

original
[gb-231r1-is01/Gingerbread_2.3.3_r1_IS01.git] / system / wlan / ti / sta_dk_4_0_4_32 / common / src / utils / memMngrEx.c
1 /****************************************************************************
2 **+-----------------------------------------------------------------------+**
3 **|                                                                       |**
4 **| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved.      |**
5 **| All rights reserved.                                                  |**
6 **|                                                                       |**
7 **| Redistribution and use in source and binary forms, with or without    |**
8 **| modification, are permitted provided that the following conditions    |**
9 **| are met:                                                              |**
10 **|                                                                       |**
11 **|  * Redistributions of source code must retain the above copyright     |**
12 **|    notice, this list of conditions and the following disclaimer.      |**
13 **|  * Redistributions in binary form must reproduce the above copyright  |**
14 **|    notice, this list of conditions and the following disclaimer in    |**
15 **|    the documentation and/or other materials provided with the         |**
16 **|    distribution.                                                      |**
17 **|  * Neither the name Texas Instruments nor the names of its            |**
18 **|    contributors may be used to endorse or promote products derived    |**
19 **|    from this software without specific prior written permission.      |**
20 **|                                                                       |**
21 **| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |**
22 **| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |**
23 **| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
24 **| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |**
25 **| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
26 **| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |**
27 **| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
28 **| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
29 **| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |**
30 **| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
31 **| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |**
32 **|                                                                       |**
33 **+-----------------------------------------------------------------------+**
34 ****************************************************************************/
35  
36 /**************************************************************************/
37 /*                                                                        */
38 /*  MODULE:  memMngr.c                                                */
39 /*  PURPOSE: manage the SDRAM buffers for MSDU Data Buffers allocations   */
40 /*                                                                        */
41 /**************************************************************************/
42
43 #include "memMngrEx.h"
44 #include "osApi.h"
45 #include "report.h"
46
47
48 /*************************************************************************
49 *                        wlan_memMngrInit                                *
50 **************************************************************************
51 * DESCRIPTION:  Init of the Memory Manager module. This function allocated
52 *               all memroy resources needed for the MemMngr. It tallocate
53 *               a pool of Msdu structure, pool of Bd structure, and
54 *               number of pools of data buffers.
55 *               
56 * INPUT:        hOs - handle to Os abstraction layer
57 *
58 * OUTPUT:
59 *
60 * RETURN:       Handle to the allocated MemMngr control block
61 **************************************************************************/
62 TI_HANDLE wlan_memMngrInit(TI_HANDLE hOs)
63 {
64     memMngr_t   *pMemMngr;
65     UINT32      count,i;
66     memMngrInit_t pMemMngrInit;
67
68     if( hOs  == NULL )
69     {
70         WLAN_OS_REPORT(("wlan_memMngrInit() : FATAL ERROR: OS handle Error - Aborting\n"));
71         return NULL;
72     }
73
74     /* structures for initialization of Memory manager */
75     pMemMngrInit.numOfPools = DEF_NUMBER_OF_BUF_POOLS;
76     pMemMngrInit.bufPoolInit[0].buffersSize = DEF_BUFFER_LENGTH_POOL_1;
77     pMemMngrInit.bufPoolInit[0].numOfbuffers = DEF_NUMBER_OF_BUFFERS_IN_POOL_1;
78     pMemMngrInit.bufPoolInit[1].buffersSize = DEF_BUFFER_LENGTH_POOL_2;
79     pMemMngrInit.bufPoolInit[1].numOfbuffers = DEF_NUMBER_OF_BUFFERS_IN_POOL_2;
80     pMemMngrInit.bufPoolInit[2].buffersSize = DEF_BUFFER_LENGTH_POOL_3;
81     pMemMngrInit.bufPoolInit[2].numOfbuffers = DEF_NUMBER_OF_BUFFERS_IN_POOL_3;
82
83     for( count = 0 ; count  < pMemMngrInit.numOfPools ; count++ )
84     {
85         if( pMemMngrInit.bufPoolInit[count].buffersSize > MAX_BUFFER_LENGTH ||
86             pMemMngrInit.bufPoolInit[count].buffersSize < MIN_BUFFER_LENGTH)
87         {
88             WLAN_OS_REPORT(("wlan_memMngrInit() : FATAL ERROR: Buffer length out of range - Aborting\n"));
89             return NULL;
90         }
91         if( count != 0 )
92         {
93             if(pMemMngrInit.bufPoolInit[count].buffersSize < pMemMngrInit.bufPoolInit[count-1].buffersSize )
94             {
95                 WLAN_OS_REPORT(("wlan_memMngrInit() : FATAL ERROR: Buffer length's out of order - Aborting\n"));
96                 return NULL;
97             }
98         }
99     }
100
101     /* alocate MemMngr module control block */
102     pMemMngr = os_memoryAlloc(hOs, (sizeof(memMngr_t)));
103     if(!pMemMngr) {
104         WLAN_OS_REPORT(("FATAL ERROR: Could not allocate pMemMngr - Aborting\n"));
105         return NULL;
106     }
107
108     os_memoryZero(hOs, pMemMngr, sizeof(memMngr_t));
109
110     pMemMngr->hOs = hOs;
111
112     pMemMngr->msduMaxNumber = DEF_NUMBER_OF_MSDUS; 
113     pMemMngr->bdMaxNumber = DEF_NUMBER_OF_BDS; 
114     pMemMngr->numFreeMSDU = pMemMngr->msduMaxNumber;
115     pMemMngr->numFreeBD = pMemMngr->bdMaxNumber;
116
117     pMemMngr->msduPool = (mem_MSDU_T*)os_memoryCAlloc(hOs, pMemMngr->msduMaxNumber, sizeof(mem_MSDU_T));
118     os_profile (hOs, 8, pMemMngr->msduMaxNumber * sizeof(mem_MSDU_T));
119
120     if (pMemMngr->msduPool == NULL) 
121     {
122         wlan_memMngrDestroy(pMemMngr);
123         WLAN_OS_REPORT(("FATAL ERROR: Could not allocate memory for MEM MNGR - Aborting\n"));
124         return NULL;
125     }
126
127     pMemMngr->bdPool = (mem_BD_T*)os_memoryCAlloc(hOs, pMemMngr->bdMaxNumber, sizeof(mem_BD_T));
128     os_profile (hOs, 8, pMemMngr->bdMaxNumber * sizeof(mem_BD_T));
129     
130     if (pMemMngr->bdPool == NULL) 
131     {
132         wlan_memMngrDestroy(pMemMngr);
133         WLAN_OS_REPORT(("FATAL ERROR: Could not allocate memory for MEM MNGR - Aborting\n"));
134         return NULL;
135     }
136
137     /* initialize buffer pools objects */
138     pMemMngr->currentNumberOfPools = pMemMngrInit.numOfPools;
139     for( count = 0 ; count  < pMemMngr->currentNumberOfPools  ; count++ )
140     {
141         pMemMngr->buffersPool[count].buffersSize = pMemMngrInit.bufPoolInit[count].buffersSize;
142
143         pMemMngr->buffersPool[count].numFreeDataBuf = pMemMngrInit.bufPoolInit[count].numOfbuffers;
144         
145         pMemMngr->buffersPool[count].dataBufMaxNumber = pMemMngrInit.bufPoolInit[count].numOfbuffers;
146         
147         if((pMemMngr->buffersPool[count].dataBufPool = (mem_DataBuf_T*)os_memoryCAlloc(hOs, 
148             pMemMngr->buffersPool[count].dataBufMaxNumber, sizeof(mem_DataBuf_T))) == NULL)
149         {
150             wlan_memMngrDestroy(pMemMngr);
151             WLAN_OS_REPORT(("FATAL ERROR: Could not allocate buffer pools  for MEM MNGR - Aborting\n"));
152             return NULL;
153         }
154         os_profile (hOs, 8, pMemMngr->buffersPool[count].dataBufMaxNumber * sizeof(mem_DataBuf_T));
155
156         pMemMngr->buffersPool[count].firstFreeDataBuf = pMemMngr->buffersPool[count].dataBufPool;
157         
158         os_memoryZero(hOs, pMemMngr->buffersPool[count].dataBufPool, 
159             (pMemMngr->buffersPool[count].numFreeDataBuf * sizeof(mem_DataBuf_T)));
160
161 #ifdef TNETW_MASTER_MODE
162         if((pMemMngr->buffersPool[count].dataBufPoolPtr = (UINT8 *)os_memorySharedAlloc(hOs,
163             pMemMngr->buffersPool[count].buffersSize * pMemMngr->buffersPool[count].dataBufMaxNumber,
164             (void *)&pMemMngr->buffersPool[count].physicalDataBufPoolPtr)) == NULL)
165         {
166             wlan_memMngrDestroy(pMemMngr);
167             WLAN_OS_REPORT(("FATAL ERROR: Could not allocate buffers for MEM MNGR (count=%d / %d, size=%d) - Aborting\n",
168                 count, pMemMngr->currentNumberOfPools, 
169                 pMemMngr->buffersPool[count].buffersSize * pMemMngr->buffersPool[count].dataBufMaxNumber));
170             return NULL;
171         }
172 #else
173         if((pMemMngr->buffersPool[count].dataBufPoolPtr = (UINT8 *)os_memoryPreAlloc(hOs, count,
174             pMemMngr->buffersPool[count].buffersSize * pMemMngr->buffersPool[count].dataBufMaxNumber)) == NULL)
175         {
176             wlan_memMngrDestroy(pMemMngr);
177             WLAN_OS_REPORT(("FATAL ERROR: Could not allocate buffers for MEM MNGR - Aborting\n"));
178             return NULL;
179         }
180 #endif
181         os_profile (hOs, 8, pMemMngr->buffersPool[count].buffersSize * pMemMngr->buffersPool[count].dataBufMaxNumber);
182
183         /* alocate the buffers */
184         for (i = 0; i < pMemMngr->buffersPool[count].dataBufMaxNumber; ++i) 
185         {
186 #ifdef TNETW_MASTER_MODE
187             pMemMngr->buffersPool[count].dataBufPool[i].data = (UINT8 *)
188                 (pMemMngr->buffersPool[count].dataBufPoolPtr
189                 + i*pMemMngr->buffersPool[count].buffersSize);
190
191             pMemMngr->buffersPool[count].dataBufPool[i].data_physical.u.LowPart = (ULONG)
192                 (pMemMngr->buffersPool[count].physicalDataBufPoolPtr.u.LowPart + i*pMemMngr->buffersPool[count].buffersSize);
193 #else
194
195             pMemMngr->buffersPool[count].dataBufPool[i].data = (UINT8 *)
196                 (pMemMngr->buffersPool[count].dataBufPoolPtr
197                 + i*pMemMngr->buffersPool[count].buffersSize);
198
199 #endif
200
201             pMemMngr->buffersPool[count].dataBufPool[i].poolIndex = count;
202         }
203     }
204
205     /* chain the items in each list */
206     for (count = 0; count < pMemMngr->msduMaxNumber; ++count) {
207         pMemMngr->msduPool[count].handle = count;
208         if (count < pMemMngr->msduMaxNumber-1)  /* update next pointer except of the last one */
209             pMemMngr->msduPool[count].nextFreeMSDU = &(pMemMngr->msduPool[count+1]);
210     }
211     for (count = 0; count < pMemMngr->bdMaxNumber; ++count) {
212         pMemMngr->bdPool[count].handle = count;
213         if (count < pMemMngr->bdMaxNumber-1)    /* update next pointer except of the last one */
214             pMemMngr->bdPool[count].nextBDPtr = &(pMemMngr->bdPool[count+1]);
215     }
216     for (i = 0; i < pMemMngr->currentNumberOfPools; ++i) {
217         for (count = 0; count < pMemMngr->buffersPool[i].dataBufMaxNumber; ++count) {
218             pMemMngr->buffersPool[i].dataBufPool[count].handle = count;
219             if (count < pMemMngr->buffersPool[i].dataBufMaxNumber-1)        /* update next pointer except of the last one */
220                 pMemMngr->buffersPool[i].dataBufPool[count].nextDataBuf = &(pMemMngr->buffersPool[i].dataBufPool[count+1]);
221         }
222     }
223
224     /* assign a pointer for the start of each list */
225     pMemMngr->firstFreeMSDU = pMemMngr->msduPool;
226     pMemMngr->firstFreeBD = pMemMngr->bdPool;
227
228     for(count=0 ; count < MAX_NUMBER_OF_MODULE; count++)
229         pMemMngr->moduleAllocCount[count] = 0;
230
231     if(( pMemMngr->hCriticalSectionProtect = os_protectCreate(hOs)) == NULL)
232     {
233         wlan_memMngrDestroy(pMemMngr);
234         WLAN_OS_REPORT(("FATAL ERROR: Could not Create Critical Section Protection for MEM MNGR - Aborting\n"));
235         return NULL;
236     }
237
238     return pMemMngr;
239 }
240 /***************************************************************************
241 *                       wlan_memMngrConfigure                              *
242 ****************************************************************************
243 * DESCRIPTION:  This function configures MemMngr module     
244
245 * INPUTS:       hMemMngr - The object 
246 *               hOs - Handle to the Os Abstraction Layer
247 *               hReport - Handle to the Report object
248 * OUTPUT:       
249
250 * RETURNS:      OK - Configuration succesfull
251 *               NOK - Configuration unsuccesfull
252 ***************************************************************************/
253 TI_STATUS wlan_memMngrConfigure(TI_HANDLE hMemMngr, TI_HANDLE hOs, TI_HANDLE hReport)
254 {
255     memMngr_t *pMemMngr = (memMngr_t *)hMemMngr;
256
257     pMemMngr->hReport = hReport;
258
259     WLAN_REPORT_INIT(pMemMngr->hReport, MEM_MGR_MODULE_LOG,
260         (".....MemMngr configured successfully\n"));
261
262     return OK;
263 }
264 /***************************************************************************
265 *                           wlan_memMngrDestroy                            *
266 ****************************************************************************
267 * DESCRIPTION:  This function unload the tMemMngr module. It first free  
268 *               the msdu pool, bd pool, data buffers pools and
269 *               then free the tMemMngr control block
270
271 * INPUTS:       hMemMngr - the object
272 *       
273 * OUTPUT:       
274
275 * RETURNS:      OK - Unload succesfull
276 *               NOK - Unload unsuccesfull
277 ***************************************************************************/
278
279 TI_STATUS wlan_memMngrDestroy(TI_HANDLE hMemMngr)
280 {
281     UINT32 count;
282     memMngr_t *pMemMngr = (memMngr_t *)hMemMngr;
283
284     /* Free Msdu pool */
285     if(pMemMngr->msduPool)
286     {
287         os_memoryFree(pMemMngr->hOs, pMemMngr->msduPool,
288             sizeof(mem_MSDU_T)*pMemMngr->msduMaxNumber); 
289     }
290     /* Free Bd pool */
291     if(pMemMngr->bdPool)
292     {
293         os_memoryFree(pMemMngr->hOs, pMemMngr->bdPool,
294             sizeof(mem_BD_T)*pMemMngr->bdMaxNumber); 
295     }
296
297     /* free data buf pools according to the number of pools */
298     for( count = 0 ; count  < pMemMngr->currentNumberOfPools  ; count++ )
299     {
300 #ifdef TNETW_MASTER_MODE
301         if(pMemMngr->buffersPool[count].dataBufPoolPtr)
302         {
303             os_memorySharedFree(pMemMngr->hOs,pMemMngr->buffersPool[count].dataBufPoolPtr,
304                 pMemMngr->buffersPool[count].buffersSize*pMemMngr->buffersPool[count].dataBufMaxNumber,
305                 pMemMngr->buffersPool[count].physicalDataBufPoolPtr);
306         }
307 #else
308         if(pMemMngr->buffersPool[count].dataBufPoolPtr)
309         {
310             os_memoryFree(pMemMngr->hOs,pMemMngr->buffersPool[count].dataBufPoolPtr,
311                 pMemMngr->buffersPool[count].buffersSize*pMemMngr->buffersPool[count].dataBufMaxNumber);
312         }
313 #endif
314
315         if(pMemMngr->buffersPool[count].dataBufPool)
316         {
317             os_memoryFree(pMemMngr->hOs, pMemMngr->buffersPool[count].dataBufPool,
318                 sizeof(mem_DataBuf_T)*pMemMngr->buffersPool[count].dataBufMaxNumber); 
319         }
320     }
321
322     /* free os_protect resources */
323     if(pMemMngr->hCriticalSectionProtect)
324         os_protectDestroy(pMemMngr->hOs,pMemMngr->hCriticalSectionProtect);
325
326     /* free the MemMngr control block */
327     os_memoryFree(pMemMngr->hOs, pMemMngr,sizeof(memMngr_t)); 
328
329     return OK;
330 }
331
332 /*************************************************************************
333 *                        wlan_memMngrAllocDataBuf                        *
334 **************************************************************************
335 * DESCRIPTION:  This function allocates BDs and Data Buffers according 
336 *               to the required length. The memory manager will allocate 
337 *               the Data Buffers, update the buffer pointer in the BD 
338 *               structure and link the BDs when more than one Data 
339 *               Buffer is required. The Buffer length is selected that 
340 *               minimum beffer len will allocted.
341 *
342 * INPUT:        hMemMngr - the object
343 *               len - the length of the required data buffer
344 *
345 * OUTPUT:       BDPtr - a pointer in which this function will return 
346 *                   to the allocated BD
347
348 *RETURN:        OK/NOK
349 **************************************************************************/
350 TI_STATUS wlan_memMngrAllocDataBuf(TI_HANDLE hMemMngr, mem_BD_T** bdPtr, UINT32 len)
351 {
352     UINT32          poolIndex,count,dataBufNum;
353     mem_BD_T*       allocBdTmp;         /* pointer to the current allocated BD in the new list */
354     mem_DataBuf_T*  allocDataBufTmp;    /* pointer to the current allocated Data Buf */
355     buffersPool_t*  tempBuffersPool;
356
357     memMngr_t *pMemMngr = (memMngr_t *)hMemMngr;
358
359     /* calculate the length and the number of Data Buffers we need allocate */
360     for (poolIndex = 0; poolIndex < pMemMngr->currentNumberOfPools-1; poolIndex++) 
361     {
362         if(len < pMemMngr->buffersPool[poolIndex].buffersSize)
363             break;
364     }
365
366     /* the selected buffer pool */
367     tempBuffersPool = &pMemMngr->buffersPool[poolIndex];
368
369     /* calculate the number of buffers needed */
370     dataBufNum = (len / tempBuffersPool->buffersSize) + 1;
371
372     os_protectLock(pMemMngr->hOs, pMemMngr->hCriticalSectionProtect); /* START OF CRITICAL SECTION */
373     
374     allocBdTmp = pMemMngr->firstFreeBD;
375     *bdPtr = pMemMngr->firstFreeBD;
376
377     allocDataBufTmp = tempBuffersPool->firstFreeDataBuf;
378
379     /* check if we have enough memory - Data buffers (in the selected pool) and Bds */
380     if ((pMemMngr->numFreeBD < dataBufNum) || (tempBuffersPool->numFreeDataBuf < dataBufNum)) 
381     {
382         os_protectUnlock(pMemMngr->hOs, pMemMngr->hCriticalSectionProtect);  /* END OF CRITICAL SECTION */
383         WLAN_REPORT_ERROR(pMemMngr->hReport, MEM_MGR_MODULE_LOG, 
384             ("DB: mem_allocDataBuf: not enough memory numFreeBD=%d numFreeDataBuf=%d in Pool number=%d req DataBufs=%d\n",
385                 pMemMngr->numFreeBD, tempBuffersPool->numFreeDataBuf,poolIndex, dataBufNum));
386         *bdPtr = NULL;
387         return NOK;
388     }
389
390     /* update the pointers to the head of the list */
391     for (count = 0 ; count < dataBufNum ; ++count) 
392     {
393         allocBdTmp->refCount = 1;
394         allocBdTmp->dataBuf = allocDataBufTmp;
395         allocBdTmp->data = (char*)(allocDataBufTmp->data);
396 #ifdef TNETW_MASTER_MODE
397         allocBdTmp->data_physical_low = os_memoryGetPhysicalLow(allocDataBufTmp->data_physical);
398 #endif
399         allocDataBufTmp->refCount = 1;
400         allocBdTmp->length = tempBuffersPool->buffersSize;
401         if (count == (dataBufNum-1)) 
402         {
403             /* the last BD in the allocated list */
404             pMemMngr->firstFreeBD = allocBdTmp->nextBDPtr;
405             tempBuffersPool->firstFreeDataBuf = allocDataBufTmp->nextDataBuf;
406             allocBdTmp->nextBDPtr = NULL;
407             allocDataBufTmp->nextDataBuf = NULL;
408         }
409         else 
410         {
411             allocBdTmp = allocBdTmp->nextBDPtr;
412             allocDataBufTmp = allocDataBufTmp->nextDataBuf;
413         }
414     }
415
416     /* update counter of free Bds and Data buffers */
417     pMemMngr->numFreeBD -= dataBufNum;
418     tempBuffersPool->numFreeDataBuf -= dataBufNum;
419
420     os_protectUnlock(pMemMngr->hOs, pMemMngr->hCriticalSectionProtect);  /* END OF CRITICAL SECTION */
421
422     return OK;
423 }
424
425
426 /*************************************************************************
427 *                         wlan_memMngrAllocBDs                           *
428 **************************************************************************
429 * DESCRIPTION:  This function allocates and returns a pointer to a link
430 *               list of BDs. This function allocates only Bds structure
431 *               and does not allocate any memory buffers.
432 *
433 * INPUT:        hMemMngr - The object
434 *               bdNumber - number of required BDs
435 *               
436 * OUTPUT:       bdPtr - a pointer in which this function will return 
437 *                    to the first Bd in the allocated list
438 *
439 * RETURN:     OK/NOK
440 **************************************************************************/
441 TI_STATUS wlan_memMngrAllocBDs(TI_HANDLE hMemMngr, UINT32 bdNumber, mem_BD_T** bdPtr)
442 {
443     UINT32          count;
444     mem_BD_T*       allocBdTmp; /* pointer to the current allocated BD in the new list */
445
446     memMngr_t *pMemMngr = (memMngr_t *)hMemMngr;
447
448     if (bdNumber == 0) 
449     {
450         *bdPtr = NULL;
451         return NOK;
452     }
453
454     os_protectLock(pMemMngr->hOs, pMemMngr->hCriticalSectionProtect); /* START OF CRITICAL SECTION */
455     allocBdTmp = pMemMngr->firstFreeBD;
456     *bdPtr = pMemMngr->firstFreeBD;
457
458     /* check if we have enough Bds */
459     if (pMemMngr->numFreeBD < bdNumber) 
460     {
461         os_protectUnlock(pMemMngr->hOs, pMemMngr->hCriticalSectionProtect);  /* END OF CRITICAL SECTION */
462         WLAN_REPORT_ERROR(pMemMngr->hReport, MEM_MGR_MODULE_LOG,  
463             ("DB: wlan_memMngrAllocBDs: not enough memory\n"));
464         *bdPtr = NULL;
465         return NOK;
466     }
467
468     /* update the pointers to the head of the list */
469     for (count = 0 ; count < bdNumber ; ++count) 
470     {
471         allocBdTmp->refCount = 1;
472         if (count == (bdNumber-1)) 
473         {
474             /* the last bd in the allocated list */
475             pMemMngr->firstFreeBD = allocBdTmp->nextBDPtr;
476             allocBdTmp->nextBDPtr = NULL;
477         }
478         else 
479         {
480             allocBdTmp = allocBdTmp->nextBDPtr;
481         }
482     }
483
484     /* update counter of free Bds  */
485     pMemMngr->numFreeBD -= bdNumber;
486
487     os_protectUnlock(pMemMngr->hOs, pMemMngr->hCriticalSectionProtect); /* END OF CRITICAL SECTION */
488
489     return OK;
490 }
491
492
493 /*************************************************************************
494 *                        wlan_memMngrAllocMSDU                           *
495 **************************************************************************
496 * DESCRIPTION:  This function allocates MSDU structure with a number of
497 *               BDs and Data Buffers as required by 'len'.
498 *
499 * INPUT:        hMemMngr - The object
500 *               len - the length of the required data buffer
501 *                   if len=0, than only MSDU buffer will be allocated
502 *               module - the module that allocate this Msdu
503 *
504 * OUTPUT:       MSDUPtr - a pointer in which this function will 
505 *                   return to the allocated MSDU structure
506 *
507 * RETURN:     OK/NOK
508 **************************************************************************/
509 TI_STATUS wlan_memMngrAllocMSDU (TI_HANDLE hMemMngr, mem_MSDU_T** MSDUPtr,  
510                               UINT32 len, allocatingModule_e module)
511 {
512     UINT32      rc;
513     mem_BD_T*   bdTmp;
514
515     memMngr_t *pMemMngr = (memMngr_t *)hMemMngr;
516
517     if (pMemMngr->msduPool == NULL)
518     {
519         /* object not initiated yet (!!!) */
520         *MSDUPtr = NULL;
521         WLAN_REPORT_ERROR(pMemMngr->hReport, MEM_MGR_MODULE_LOG,  
522             ("wlan_memMngrAllocMSDU: failed!\n"));
523         memMngrPrint(hMemMngr);
524         return NOK;
525     }
526
527     if (len > 0) 
528     {   
529         /* we need to allocate BD and Data Buffers */
530         rc = wlan_memMngrAllocDataBuf(hMemMngr,&bdTmp, len);
531         if (rc == NOK)
532         {
533             *MSDUPtr = NULL;
534             WLAN_REPORT_ERROR(pMemMngr->hReport, MEM_MGR_MODULE_LOG,  
535                 ("wlan_memMngrAllocMSDU: failed! no data bufs\n"));
536             memMngrPrint(hMemMngr);
537             return NOK;
538         }
539     }
540     else 
541     {
542         /* len = 0 - need to allocate msdu structure only */
543         rc = wlan_memMngrAllocMSDUBufferOnly(hMemMngr, MSDUPtr, module);
544         if (rc == NOK)
545         {
546             *MSDUPtr = NULL;
547             WLAN_REPORT_ERROR(pMemMngr->hReport, MEM_MGR_MODULE_LOG,  
548                 ("wlan_memMngrAllocMSDU: failed to alloc buffer only!\n"));
549             memMngrPrint(hMemMngr);
550             return NOK;
551         }
552         return OK;
553         
554     }
555
556     os_protectLock(pMemMngr->hOs, pMemMngr->hCriticalSectionProtect);  /* START OF CRITICAL SECTION */
557     
558     /* check if we have enough free Msdu's */
559      if (pMemMngr->firstFreeMSDU == NULL) 
560     {
561         /* no free MSDU buffers */
562         WLAN_REPORT_ERROR(pMemMngr->hReport, MEM_MGR_MODULE_LOG,  
563                 ("wlan_memMngrAllocMSDU no free MSDU in MemMngr !!!\n"));
564         os_protectUnlock(pMemMngr->hOs, pMemMngr->hCriticalSectionProtect); /* END OF CRITICAL SECTION */
565         memMngrPrint(hMemMngr);
566         
567         /* In case we dont have free msdu - free the allocated Bds */
568         wlan_memMngrFreeBD(hMemMngr,bdTmp->handle);
569         *MSDUPtr = NULL;
570         return NOK;
571     }
572
573     *MSDUPtr = pMemMngr->firstFreeMSDU;
574     pMemMngr->firstFreeMSDU = pMemMngr->firstFreeMSDU->nextFreeMSDU;
575     pMemMngr->moduleAllocCount[module]++;
576
577     /* update counter of free msdu's  */
578     pMemMngr->numFreeMSDU--;
579
580     os_protectUnlock(pMemMngr->hOs, pMemMngr->hCriticalSectionProtect); /* END OF CRITICAL SECTION */
581
582     (*MSDUPtr)->nextFreeMSDU = NULL;
583     (*MSDUPtr)->freeFunc = NULL;
584     (*MSDUPtr)->firstBDPtr = bdTmp;
585     (*MSDUPtr)->lastBDPtr = bdTmp;
586     (*MSDUPtr)->dataLen = len;
587     (*MSDUPtr)->nextMSDUinList = NULL; 
588     (*MSDUPtr)->prevMSDUinList = NULL; 
589     (*MSDUPtr)->txFlags = 0;        
590     (*MSDUPtr)->txCompleteFlags = 0;
591     (*MSDUPtr)->module = module;
592   #ifdef TI_DBG
593     (*MSDUPtr)->timeStampNum = 0;
594   #endif
595
596     return OK;
597 }
598
599 /*************************************************************************
600 *                 wlan_memMngrAllocMSDUBufferOnly                        *
601 **************************************************************************
602 * DESCRIPTION:  This function allocates MSDU structure - without 
603 *                   Bds and Data Buffers
604 *
605 * INPUT:        hMemMngr - The object
606 *
607 * OUTPUT:       MSDUPtr - a pointer in which this function will return 
608 *                     to the allocated MSDU structure
609 *               module - the module that allocate this Msdu
610 *
611 * RETURN:       OK/NOK
612 **************************************************************************/
613 TI_STATUS wlan_memMngrAllocMSDUBufferOnly(TI_HANDLE hMemMngr, mem_MSDU_T** MSDUPtr, allocatingModule_e module)
614 {
615     memMngr_t *pMemMngr = (memMngr_t *)hMemMngr;
616
617     os_protectLock(pMemMngr->hOs, pMemMngr->hCriticalSectionProtect); /* START OF CRITICAL SECTION */
618     
619     if (pMemMngr->firstFreeMSDU == NULL) 
620     {
621         /* no free MSDU buffers */
622         WLAN_REPORT_ERROR(pMemMngr->hReport, MEM_MGR_MODULE_LOG,  
623                 ("wlan_memMngrAllocMSDUBufferOnly no free MSDU in MemMngr !!!\n"));
624         os_protectUnlock(pMemMngr->hOs, pMemMngr->hCriticalSectionProtect); /* END OF CRITICAL SECTION */
625         *MSDUPtr = NULL;
626         return NOK;
627     }
628
629     *MSDUPtr = pMemMngr->firstFreeMSDU;
630     pMemMngr->firstFreeMSDU = pMemMngr->firstFreeMSDU->nextFreeMSDU;
631     pMemMngr->moduleAllocCount[module]++;
632
633     /* update counter of free msdu's  */
634     pMemMngr->numFreeMSDU--;
635
636     os_protectUnlock(pMemMngr->hOs, pMemMngr->hCriticalSectionProtect);  /* END OF CRITICAL SECTION */
637
638     (*MSDUPtr)->nextFreeMSDU = NULL;
639     (*MSDUPtr)->freeFunc = NULL;
640     (*MSDUPtr)->firstBDPtr = NULL;
641     (*MSDUPtr)->lastBDPtr = NULL;
642     (*MSDUPtr)->dataLen = 0;
643     (*MSDUPtr)->nextMSDUinList = NULL; 
644     (*MSDUPtr)->prevMSDUinList = NULL; 
645     (*MSDUPtr)->txFlags = 0;
646     (*MSDUPtr)->txCompleteFlags = 0;
647     (*MSDUPtr)->module = module;
648   #ifdef TI_DBG
649     (*MSDUPtr)->timeStampNum = 0;
650   #endif
651
652     return OK;
653 }
654
655 /*************************************************************************
656 *                     wlan_memMngrFreeListOfMSDU                         *
657 **************************************************************************
658 * DESCRIPTION:  Free list of MSDUs structure. This function will run 
659 *               over the MSDU list (if exist) and free all MSDU's with 
660 *               all BDs and Data Buffers that are bind to this MSDU.
661 *
662 * INPUT:        hMemMngr - The object
663 *               handle - handle to the first MSDU in the list
664 *
665 * OUTPUT:       
666 *
667 * RETURN:       OK/NOK
668 **************************************************************************/
669 TI_STATUS wlan_memMngrFreeListOfMSDU(TI_HANDLE hMemMngr, UINT32 handle)
670 {
671     mem_MSDU_T          *msduTmp,*nextTmpMsdu;  
672     
673     memMngr_t *pMemMngr = (memMngr_t *)hMemMngr;
674
675     msduTmp = &(pMemMngr->msduPool[handle]);
676
677     while (msduTmp != NULL) 
678     {
679         nextTmpMsdu = msduTmp->nextMSDUinList;
680         if(wlan_memMngrFreeMSDU(hMemMngr,memMgr_MsduHandle(msduTmp)) != OK)
681         {
682             WLAN_REPORT_ERROR(pMemMngr->hReport, MEM_MGR_MODULE_LOG,  
683                 ("wlan_memMngrFreeListOfMSDU This MSDU is already free\n"));
684                     //os_protectUnlock(pMemMngr->hOs, pMemMngr->hCriticalSectionProtect); /* END OF CRITICAL SECTION */
685             return NOK;
686         }
687         msduTmp = nextTmpMsdu;
688     }
689
690     return OK;
691 }
692
693 /*************************************************************************
694 *                        wlan_memMngrFreeMSDU                            *
695 **************************************************************************
696 * DESCRIPTION:  Free ONE MSDU structure. This function will free all 
697 *               BDs and Data Buffers that are bind to this MSDU.
698 *
699 * INPUT:        hMemMngr - The object
700 *               handle - handle of the MSDU
701 *
702 * OUTPUT:
703 *
704 * RETURN:       OK/NOK
705 **************************************************************************/
706 TI_STATUS wlan_memMngrFreeMSDU(TI_HANDLE hMemMngr, UINT32 handle)
707 {
708     UINT32 freeFlag;
709     ap_FreeMemFunc      freeFunc = NULL;        /* pointer to the Data Buffer free function */
710     UINT32              freeArgs[NUM_OF_FREE_ARGS]; /* arguments to be send with the free function */
711     int i;
712
713     memMngr_t *pMemMngr = (memMngr_t *)hMemMngr;
714
715     if( handle == WLAN_DRV_NULL_MEM_HANDLE )
716         return OK;
717
718     /* check if the msdu is already free */
719     if(pMemMngr->msduPool[handle].module == MODULE_FREE_MSDU)
720     {
721         WLAN_REPORT_ERROR(pMemMngr->hReport, MEM_MGR_MODULE_LOG,  
722                 ("wlan_memMngrFreeMSDU This MSDU is already free\n"));
723         return NOK;
724
725     }
726
727     if (pMemMngr->msduPool[handle].firstBDPtr != NULL) 
728     {
729         /* free all BDs and Data Buffers */
730         freeFlag = wlan_memMngrFreeBD(hMemMngr, pMemMngr->msduPool[handle].firstBDPtr->handle);
731
732         if ((freeFlag == TRUE) && (pMemMngr->msduPool[handle].freeFunc != NULL)) 
733         {
734             /* save the free parameters to do it at the end of the function */
735             freeFunc = pMemMngr->msduPool[handle].freeFunc;
736             for (i=0; i<NUM_OF_FREE_ARGS; i++)
737                 freeArgs[i] = pMemMngr->msduPool[handle].freeArgs[i];
738         }
739     }
740
741     os_protectLock(pMemMngr->hOs, pMemMngr->hCriticalSectionProtect);  /* START OF CRITICAL SECTION */
742
743     /* reset the fields of the MSDU buffer */
744     pMemMngr->msduPool[handle].firstBDPtr = NULL;
745     pMemMngr->msduPool[handle].freeFunc = NULL;
746     pMemMngr->msduPool[handle].freeArgs[0] = 0;
747     pMemMngr->msduPool[handle].freeArgs[1] = 0;
748     pMemMngr->msduPool[handle].freeArgs[2] = 0;
749     pMemMngr->msduPool[handle].dataLen = 0;
750     pMemMngr->msduPool[handle].headerLen = 0;
751     pMemMngr->msduPool[handle].txFlags = 0;
752     pMemMngr->msduPool[handle].txCompleteFlags = 0;
753     pMemMngr->msduPool[handle].nextMSDUinList = 0;
754     pMemMngr->msduPool[handle].prevMSDUinList = 0;
755     pMemMngr->numFreeMSDU++;
756
757     pMemMngr->moduleAllocCount[pMemMngr->msduPool[handle].module]--;
758     
759     pMemMngr->msduPool[handle].module = MODULE_FREE_MSDU;
760
761     /* add the MSDU to the free MSDU list */
762     pMemMngr->msduPool[handle].nextFreeMSDU = pMemMngr->firstFreeMSDU;
763     pMemMngr->firstFreeMSDU = &(pMemMngr->msduPool[handle]);
764
765     os_protectUnlock(pMemMngr->hOs, pMemMngr->hCriticalSectionProtect); /* END OF CRITICAL SECTION */
766
767     /* !!!!!!!! The free should be only after os_protectUnlock !!!!!!!! */
768     if (freeFunc != NULL) 
769     {
770         /* call free function */
771         freeFunc((TI_HANDLE)(freeArgs[0]),
772                  (TI_HANDLE)(freeArgs[1]),
773                  (TI_STATUS)(freeArgs[2]));
774     }
775
776     return OK;
777 }
778
779
780 /*************************************************************************
781 *                            allocDataBuf                                *
782 **************************************************************************
783 * DESCRIPTION:  Allocate Data Buffer
784
785 * INPUT:        hMemMngr - The object
786 *               dataBuf - pointer to the new allocated Data Buffer
787 *               poolIndex - The index of the pool to allocate from
788 *
789 * OUTPUT:
790 *
791 * RETURN:       OK/NOK
792 **************************************************************************/
793 #if 0
794 static TI_STATUS allocDataBuf(TI_HANDLE hMemMngr, mem_DataBuf_T* dataBuf, UINT32 poolIndex)
795 {
796     memMngr_t *pMemMngr = (memMngr_t *)hMemMngr;
797
798     os_protectLock(pMemMngr->hOs, pMemMngr->hCriticalSectionProtect); /* START OF CRITICAL SECTION */
799     if (pMemMngr->buffersPool[poolIndex].firstFreeDataBuf == NULL) {
800         os_protectUnlock(pMemMngr->hOs, pMemMngr->hCriticalSectionProtect);/* END OF CRITICAL SECTION */
801         return NOK;
802     }
803     dataBuf = pMemMngr->buffersPool[poolIndex].firstFreeDataBuf;
804     pMemMngr->buffersPool[poolIndex].firstFreeDataBuf = pMemMngr->buffersPool[poolIndex].firstFreeDataBuf->nextDataBuf;
805     pMemMngr->buffersPool[poolIndex].numFreeDataBuf--;
806     os_protectUnlock(pMemMngr->hOs, pMemMngr->hCriticalSectionProtect);/* END OF CRITICAL SECTION */
807
808     return OK;
809 }
810 #endif
811
812
813 /*************************************************************************
814 *                          freeDataBuf                                   *
815 **************************************************************************
816 * DESCRIPTION:  Free Data Buffer. 
817 *
818 * INPUT:        hMemMngr - The object
819 *               dataBuf - pointer to the Data Buffer
820 *
821 * OUTPUT:
822 *
823 * RETURN:       OK/NOK
824 **************************************************************************/
825 static TI_STATUS freeDataBuf(TI_HANDLE hMemMngr, mem_DataBuf_T* dataBuf)
826 {
827     buffersPool_t   *tempBuffersPool;
828     memMngr_t *pMemMngr = (memMngr_t *)hMemMngr;
829
830     if (dataBuf->refCount == 0) {
831         WLAN_REPORT_ERROR(pMemMngr->hReport, MEM_MGR_MODULE_LOG,  
832             ("DB: freeDataBuf FATAL ERROR: dataBuf->refCount < 0\n"));
833         return NOK;
834     }
835
836     if (--(dataBuf->refCount) == 0) {
837         tempBuffersPool = &pMemMngr->buffersPool[dataBuf->poolIndex];
838         /* add this Data Buffer to the free list of the correct pool*/
839         dataBuf->nextDataBuf = tempBuffersPool->firstFreeDataBuf;
840         tempBuffersPool->firstFreeDataBuf = dataBuf;
841         tempBuffersPool->numFreeDataBuf++;
842     }
843
844     return OK;
845 }
846
847
848 /*************************************************************************
849 *                        wlan_memMngrFreeBD                              *
850 **************************************************************************
851 * DESCRIPTION:  Free BD structure. This function will free a list of BD
852 *               structures and the Data Buffer that is being pointed by 
853 *               these BD if any.
854 *
855 * INPUT:        hMemMngr - The object
856 *               handle - handle of this BD
857 * OUTPUT:
858 * RETURN:       freeFlag - return TRUE if this BD list was freed
859 *                   return FALSE if this BD list was not freed (refCount>0)
860 **************************************************************************/
861 UINT32 wlan_memMngrFreeBD(TI_HANDLE hMemMngr, UINT32 handle)
862 {
863     UINT32              rc = FALSE;
864     mem_DataBuf_T*      dataBuf;
865     mem_BD_T*           bdTmp;     /* pointer to the current BD we need to free */
866     mem_BD_T*           nextBdTmp; /* pointer to the next BD we need to free    */
867
868     memMngr_t *pMemMngr = (memMngr_t *)hMemMngr;
869
870     bdTmp = &(pMemMngr->bdPool[handle]);
871
872     os_protectLock(pMemMngr->hOs, pMemMngr->hCriticalSectionProtect); /* START OF CRITICAL SECTION */    
873     
874     while (bdTmp != NULL) 
875     {
876         dataBuf = bdTmp->dataBuf;
877         nextBdTmp = bdTmp->nextBDPtr;
878         if (bdTmp->refCount == 0) 
879         {
880             WLAN_REPORT_ERROR(pMemMngr->hReport, MEM_MGR_MODULE_LOG,  
881                 ("DB: wlan_memMngrFreeBD FATAL ERROR: bdTmp->refCount < 0\n"));
882             os_protectUnlock(pMemMngr->hOs, pMemMngr->hCriticalSectionProtect);/* END OF CRITICAL SECTION */
883             return FALSE;
884         }
885         if (dataBuf != NULL) 
886         {
887             freeDataBuf(hMemMngr, dataBuf);
888         }
889
890 #ifdef TNETW_MASTER_MODE
891         if( bdTmp->freeFunc != NULL)
892         {
893             bdTmp->freeFunc(  bdTmp->freeArgs[0], bdTmp->freeArgs[1], bdTmp->freeArgs[2],
894                               bdTmp->freeArgs[3], bdTmp->freeArgs[4]);
895         }
896 #endif
897
898         if (--(bdTmp->refCount) == 0) 
899         {
900             bdTmp->dataBuf = NULL;
901             bdTmp->data = NULL;
902
903 #ifdef TNETW_MASTER_MODE
904             bdTmp->data_physical_low = 0;
905             bdTmp->freeFunc     = NULL;
906             os_memoryZero(pMemMngr->hOs, bdTmp->freeArgs, sizeof(UINT32)*NUM_OF_FREE_ARGS);
907 #endif
908             bdTmp->dataOffset = 0;
909             bdTmp->length = 0; 
910             /* adding the free BD to the free BD list */
911             bdTmp->nextBDPtr = pMemMngr->firstFreeBD;
912             pMemMngr->firstFreeBD = bdTmp;
913             pMemMngr->numFreeBD++;
914         }
915         if (nextBdTmp == NULL)
916         {
917             if (bdTmp->refCount <= 0)
918             {
919                 rc = TRUE;
920             }
921         }
922         bdTmp = nextBdTmp;
923     }
924
925     os_protectUnlock(pMemMngr->hOs, pMemMngr->hCriticalSectionProtect); /* END OF CRITICAL SECTION */
926     return rc;
927 }
928
929
930 /*************************************************************************
931 *                wlan_memMngrFreeAllOsAlocatesBuffer                     *
932 **************************************************************************
933 * DESCRIPTION:  This function run over the all msdus in the MemMngr 
934 *               and call the free function of the os allocated buffers
935 *
936 * INPUT:        hMemMngr - The object
937 *           
938 * OUTPUT:
939 *               
940 * RETURN:       OK
941 **************************************************************************/
942
943 TI_STATUS wlan_memMngrFreeAllOsAlocatesBuffer(TI_HANDLE hMemMngr)
944 {
945     UINT32 count;
946
947     memMngr_t *pMemMngr = (memMngr_t *)hMemMngr;
948
949     os_protectLock(pMemMngr->hOs, pMemMngr->hCriticalSectionProtect);/* START OF CRITICAL SECTION */
950
951     for(count = 0 ; count < pMemMngr->msduMaxNumber ; count++)
952     {
953         if (pMemMngr->msduPool[count].freeFunc)
954         {
955             WLAN_OS_REPORT(("wlan_memMngrFreeAllOsAlocatesBuffer() - Call Os free func */*/*/**/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/ :\n"));
956 #ifndef TNETW_MASTER_MODE
957             pMemMngr->msduPool[count].freeArgs[2] = NOK;
958 #endif
959             /* call free function */
960             pMemMngr->msduPool[count].freeFunc((TI_HANDLE)(pMemMngr->msduPool[count].freeArgs[0]),
961                                                 (TI_HANDLE)(pMemMngr->msduPool[count].freeArgs[1]),
962                                                 (TI_STATUS)(pMemMngr->msduPool[count].freeArgs[2]));
963
964             pMemMngr->msduPool[count].freeFunc = NULL;
965             pMemMngr->msduPool[count].freeArgs[0] = 0;
966             pMemMngr->msduPool[count].freeArgs[1] = 0;
967             pMemMngr->msduPool[count].freeArgs[2] = 0;
968         }
969     }
970
971     os_protectUnlock(pMemMngr->hOs, pMemMngr->hCriticalSectionProtect);/* END OF CRITICAL SECTION */
972
973     return OK;
974 }
975
976 /*************************************************************************
977 *                 wlan_memMngrCopyMsduFreeFunc                           *
978 **************************************************************************
979 * DESCRIPTION:  Copy The free function and the free arguments from on 
980 *               Msdu to another 
981 *
982 * INPUT:        hMemMngr - The object
983 *               destMsduHandle - the handle of the destination msdu
984 *               sourceMsduHandle - the handle of the source msdu    
985
986 * OUTPUT:
987 *
988 * RETURN:       OK
989 **************************************************************************/
990
991 TI_STATUS wlan_memMngrCopyMsduFreeFunc(TI_HANDLE hMemMngr, UINT32 destMsduHandle, UINT32 sourceMsduHandle)
992 {
993     mem_MSDU_T*             sourceMsdu; 
994     mem_MSDU_T*             destMsdu;   
995
996     memMngr_t *pMemMngr = (memMngr_t *)hMemMngr;
997
998      if( destMsduHandle == WLAN_DRV_NULL_MEM_HANDLE || sourceMsduHandle == WLAN_DRV_NULL_MEM_HANDLE )
999          return NOK;
1000
1001     os_protectLock(pMemMngr->hOs, pMemMngr->hCriticalSectionProtect);  /* START OF CRITICAL SECTION */
1002
1003     sourceMsdu = &(pMemMngr->msduPool[sourceMsduHandle]);
1004     destMsdu = &(pMemMngr->msduPool[destMsduHandle]);
1005
1006     destMsdu->freeFunc = sourceMsdu->freeFunc;
1007     
1008     os_memoryCopy(pMemMngr->hOs, (void *)destMsdu->freeArgs, (void *)sourceMsdu->freeArgs,(NUM_OF_FREE_ARGS*sizeof(UINT32)));
1009
1010     os_protectUnlock(pMemMngr->hOs, pMemMngr->hCriticalSectionProtect);/* END OF CRITICAL SECTION */
1011
1012     return OK;
1013 }
1014
1015 /*************************************************************************
1016 *                 wlan_memMngrChangeMsduOwner                            *
1017 **************************************************************************
1018 * DESCRIPTION:  the function changes the msdu module owner.
1019 *
1020 * INPUT:        hMemMngr - The object
1021 *               newModule - msdu new module owner
1022 *               pMsdu - the msdu to be changed  
1023
1024 * OUTPUT:
1025 *
1026 * RETURN:       OK
1027 **************************************************************************/
1028
1029 TI_STATUS wlan_memMngrChangeMsduOwner(TI_HANDLE hMemMngr,allocatingModule_e newModule,mem_MSDU_T *pMsdu)
1030 {
1031     memMngr_t *pMemMngr = (memMngr_t *)hMemMngr;
1032     allocatingModule_e oldModule;
1033
1034     if(pMsdu == NULL)
1035     {
1036         WLAN_REPORT_ERROR(pMemMngr->hReport, MEM_MGR_MODULE_LOG,
1037             ("wlan_memMngrChangeMsduOwner: pMsdu == NULL\n"));
1038         return NOK;
1039
1040     }
1041
1042     oldModule = pMsdu->module;
1043
1044     if(pMemMngr->moduleAllocCount[oldModule] > 0)
1045     {
1046         pMemMngr->moduleAllocCount[oldModule]--;
1047     }
1048     else
1049     {
1050         WLAN_REPORT_ERROR(pMemMngr->hReport, MEM_MGR_MODULE_LOG,
1051                             ("wlan_memMngrChangeMsduOwner: oldModule %d  AllocCount < 0 ,newModule %d\n", oldModule,newModule));
1052         return NOK;
1053     }
1054     
1055
1056     pMemMngr->moduleAllocCount[newModule]++;
1057
1058     pMsdu->module = newModule;
1059
1060     WLAN_REPORT_INFORMATION(pMemMngr->hReport, MEM_MGR_MODULE_LOG,
1061                         ("wlan_memMngrChangeMsduOwner: oldModule: %d , newModule: %d\n", oldModule, newModule));
1062
1063
1064     return OK;
1065
1066
1067
1068     
1069
1070
1071 }
1072
1073
1074 /*************************************************************************
1075 *                 wlan_memMngrSwapMsdu                                  *
1076 **************************************************************************
1077 * DESCRIPTION:  Swap two Msdu, only the MSDU descriptor and not all fields
1078 *                
1079 * INPUT:        
1080
1081 * OUTPUT:
1082 *
1083 * RETURN:       OK
1084 **************************************************************************/
1085 TI_STATUS wlan_memMngrSwapMsdu(TI_HANDLE hMemMngr, mem_MSDU_T *pMsdu_1, mem_MSDU_T *pMsdu_2)
1086 {
1087     memMngr_t *pMemMngr = (memMngr_t *)hMemMngr;
1088     mem_MSDU_T Msdu_tmp;
1089
1090     os_protectLock(pMemMngr->hOs, pMemMngr->hCriticalSectionProtect);  /* START OF CRITICAL SECTION */
1091
1092     /* copy msdu 1 to Temporary msdu */
1093     Msdu_tmp.freeFunc = pMsdu_1->freeFunc;  
1094     os_memoryCopy(pMemMngr->hOs, (void *)Msdu_tmp.freeArgs, (void *)pMsdu_1->freeArgs,(NUM_OF_FREE_ARGS*sizeof(UINT32)));
1095     Msdu_tmp.dataLen = pMsdu_1->dataLen;
1096     Msdu_tmp.headerLen = pMsdu_1->headerLen;
1097     Msdu_tmp.firstBDPtr = pMsdu_1->firstBDPtr;
1098     Msdu_tmp.lastBDPtr  = pMsdu_1->lastBDPtr;
1099
1100     /* copy msdu 2 to msdu 1 */
1101     pMsdu_1->freeFunc = pMsdu_2->freeFunc;  
1102     os_memoryCopy(pMemMngr->hOs, (void *)pMsdu_1->freeArgs, (void *)pMsdu_2->freeArgs,(NUM_OF_FREE_ARGS*sizeof(UINT32)));
1103     pMsdu_1->dataLen = pMsdu_2->dataLen;
1104     pMsdu_1->headerLen = pMsdu_2->headerLen;
1105     pMsdu_1->firstBDPtr = pMsdu_2->firstBDPtr;
1106     pMsdu_1->lastBDPtr  = pMsdu_2->lastBDPtr;
1107
1108     /* copy Temporary msdu to msdu 2 */
1109     pMsdu_2->freeFunc = Msdu_tmp.freeFunc;  
1110     os_memoryCopy(pMemMngr->hOs, (void *)pMsdu_2->freeArgs, (void *)Msdu_tmp.freeArgs,(NUM_OF_FREE_ARGS*sizeof(UINT32)));
1111     pMsdu_2->dataLen = Msdu_tmp.dataLen;
1112     pMsdu_2->headerLen = Msdu_tmp.headerLen;
1113     pMsdu_2->firstBDPtr = Msdu_tmp.firstBDPtr;
1114     pMsdu_2->lastBDPtr  = Msdu_tmp.lastBDPtr;
1115         
1116     os_protectUnlock(pMemMngr->hOs, pMemMngr->hCriticalSectionProtect);/* END OF CRITICAL SECTION */
1117
1118     return OK;
1119 }
1120
1121 TI_STATUS wlan_memMngrGetMemMgrResources(TI_HANDLE hMemMngr, memMgrResources_t* memMgrResources)
1122 {
1123     memMngr_t *pMemMngr = (memMngr_t *)hMemMngr;
1124
1125     memMgrResources->numOfFreeBDs = pMemMngr->numFreeBD;
1126     memMgrResources->numOfFreeMsdu = pMemMngr->numFreeMSDU;
1127     memMgrResources->numOfFreeBufPool1 = pMemMngr->buffersPool[0].numFreeDataBuf;
1128     memMgrResources->numOfFreeBufPool2 = pMemMngr->buffersPool[1].numFreeDataBuf;
1129     memMgrResources->numOfFreeBufPool3 = pMemMngr->buffersPool[2].numFreeDataBuf;
1130     
1131     return OK;
1132 }
1133
1134
1135 TI_STATUS wlan_memMngrAddTimeStamp (TI_HANDLE hMemMngr, mem_MSDU_T *pMsdu)
1136 {
1137   #ifdef TI_DBG
1138     memMngr_t *pMemMngr = (memMngr_t *)hMemMngr;
1139
1140     if (pMsdu->timeStampNum < MAX_NUM_OF_TIME_STAMPS)
1141         pMsdu->timeStamp[pMsdu->timeStampNum ++] =
1142             os_timeStampUs (pMemMngr->hOs);
1143   #endif
1144
1145     return OK;
1146 }
1147
1148
1149 /*************************************************************************
1150 **************************************************************************
1151 *                                                                        *
1152 *                            TEST FUNCTIONS                              *
1153 *                                                                        *
1154 **************************************************************************
1155 **************************************************************************/
1156
1157 void memMngrPrintMSDU(mem_MSDU_T* pMsdu )
1158 {
1159     WLAN_OS_REPORT(("\nPrinting MSDU :\n"));
1160     WLAN_OS_REPORT(("handle          = %X\n",pMsdu->handle));
1161     WLAN_OS_REPORT(("nextFreeMSDU          = %X\n",pMsdu->nextFreeMSDU));     
1162     WLAN_OS_REPORT(("headerLen       = %d\n",pMsdu->headerLen));    
1163     WLAN_OS_REPORT(("firstBDPtr      = %X\n",pMsdu->firstBDPtr));   
1164     WLAN_OS_REPORT(("lastBDPtr       = %X\n",pMsdu->lastBDPtr));     
1165     WLAN_OS_REPORT(("freeFunc        = %X\n",pMsdu->freeFunc));      
1166     WLAN_OS_REPORT(("freeArgs[0]     = %X\n",pMsdu->freeArgs[0]));   
1167     WLAN_OS_REPORT(("freeArgs[1]     = %X\n",pMsdu->freeArgs[1]));   
1168     WLAN_OS_REPORT(("freeArgs[2]     = %X\n",pMsdu->freeArgs[2]));   
1169     WLAN_OS_REPORT(("freeArgs[3]     = %X\n",pMsdu->freeArgs[3]));   
1170     WLAN_OS_REPORT(("freeArgs[4]     = %X\n",pMsdu->freeArgs[4]));   
1171     WLAN_OS_REPORT(("dataLen         = %d\n",pMsdu->dataLen));       
1172     WLAN_OS_REPORT(("module          = %d\n",pMsdu->module));       
1173     WLAN_OS_REPORT(("nextMSDUinList  = %X\n",pMsdu->nextMSDUinList));
1174     WLAN_OS_REPORT(("prevMSDUinList  = %X\n",pMsdu->prevMSDUinList));
1175     WLAN_OS_REPORT(("txFlags         = %X\n",pMsdu->txFlags));       
1176     WLAN_OS_REPORT(("txCompleteFlags = %X\n",pMsdu->txCompleteFlags));       
1177
1178 }
1179
1180 void memMngrPrintBD(mem_BD_T * pBd )
1181 {
1182     WLAN_OS_REPORT(("\nPrinting BD \n"));
1183     WLAN_OS_REPORT(("handle           = %X\n",pBd->handle));     
1184     WLAN_OS_REPORT(("refCount         = %d\n",pBd->refCount));   
1185     WLAN_OS_REPORT(("dataBuf          = %X\n",pBd->dataBuf));    
1186     WLAN_OS_REPORT(("data             = %X\n",pBd->data));       
1187     WLAN_OS_REPORT(("dataOffset       = %d\n",pBd->dataOffset)); 
1188     WLAN_OS_REPORT(("length           = %d\n",pBd->length));     
1189     WLAN_OS_REPORT(("nextBDPtr        = %X\n",pBd->nextBDPtr));
1190 #ifdef TNETW_MASTER_MODE 
1191     WLAN_OS_REPORT(("data_physical_low = %X\n",pBd->data_physical_low));
1192 #endif
1193 }
1194
1195 void memMngrPrintDataBuf(mem_DataBuf_T* pDataBuf )
1196 {
1197     WLAN_OS_REPORT(("\nPrinting DataBuf \n"));
1198     WLAN_OS_REPORT(("handle      = %X\n",pDataBuf->handle));     
1199     WLAN_OS_REPORT(("nextDataBuf = %X\n",pDataBuf->nextDataBuf));    
1200     WLAN_OS_REPORT(("refCount    = %d\n",pDataBuf->refCount));  
1201     WLAN_OS_REPORT(("poolIndex  = %X\n",pDataBuf->poolIndex));       
1202     WLAN_OS_REPORT(("data               = %d\n",pDataBuf->data)); 
1203 }
1204
1205 void memMngrPrintMSDUWithItsBds(mem_MSDU_T* pMsdu )
1206 {
1207     mem_BD_T *bdTmp = pMsdu->firstBDPtr;
1208
1209     memMngrPrintMSDU(pMsdu);
1210
1211     while(bdTmp != NULL)
1212     {
1213         memMngrPrintBD(bdTmp);
1214         bdTmp = bdTmp->nextBDPtr;
1215     }
1216 }
1217
1218 void memMngrPrintHandle(TI_HANDLE hMemMngr, UINT32 handle)
1219 {
1220     mem_BD_T*       tmpBD;
1221
1222     memMngr_t *pMemMngr = (memMngr_t *)hMemMngr;
1223
1224     WLAN_REPORT_INFORMATION(pMemMngr->hReport, MEM_MGR_MODULE_LOG, 
1225         ("MSDU handle = %d firstBDPtr=%X length=%d\n", handle,  
1226                             pMemMngr->msduPool[handle].firstBDPtr,
1227                             pMemMngr->msduPool[handle].dataLen));
1228
1229     tmpBD = pMemMngr->msduPool[handle].firstBDPtr;
1230     while (tmpBD != NULL) {
1231         WLAN_REPORT_INFORMATION(pMemMngr->hReport, MEM_MGR_MODULE_LOG,
1232             ("MSDU BD=%X handle=%d refCount=%d\n", tmpBD, tmpBD->handle, tmpBD->refCount));
1233         tmpBD = tmpBD->nextBDPtr;
1234     }
1235
1236 }
1237
1238 void memMngrFullPrint(TI_HANDLE hMemMngr)
1239 {
1240     mem_MSDU_T*     tmpMSDU;
1241     mem_BD_T*       tmpBD;
1242     mem_DataBuf_T*  tmpDataBuf;
1243     UINT32  j,i=0;
1244
1245     memMngr_t *pMemMngr = (memMngr_t *)hMemMngr;
1246
1247     WLAN_OS_REPORT(("memMngrPrint\n"));
1248     WLAN_OS_REPORT(("numFreeMSDU %d numFreeBD %d  \n", pMemMngr->numFreeMSDU, pMemMngr->numFreeBD));
1249     for(j = 0 ;j < pMemMngr->currentNumberOfPools; j++)
1250         WLAN_OS_REPORT(("Pool Num %d   buffer length %d   numFreeDataBuf %d \n",
1251         j, pMemMngr->buffersPool[j].buffersSize, pMemMngr->buffersPool[j].numFreeDataBuf));
1252
1253     WLAN_OS_REPORT(("\nAllocated by modules : MLME=%d, OS_ABS=%d,  RSN=%d,  HAL_RX=%d\n",
1254         pMemMngr->moduleAllocCount[MLME_MODULE],pMemMngr->moduleAllocCount[OS_ABS_TX_MODULE],
1255         pMemMngr->moduleAllocCount[RSN_MODULE],pMemMngr->moduleAllocCount[HAL_RX_MODULE]));
1256
1257
1258     WLAN_OS_REPORT(("\nfirstFreeMSDU=%X\n",pMemMngr->firstFreeMSDU));
1259     tmpMSDU = pMemMngr->firstFreeMSDU;
1260     while (++i, tmpMSDU != NULL) {
1261         WLAN_OS_REPORT(("tmpMSDU %d = %X handle=%d tmpMSDU->nextMSDU=%X\n", 
1262             i, tmpMSDU, tmpMSDU->handle, tmpMSDU->nextFreeMSDU));
1263         tmpMSDU = tmpMSDU->nextFreeMSDU;
1264     }
1265
1266     WLAN_OS_REPORT(("\nfirstFreeBD=%X\n",pMemMngr->firstFreeBD));
1267     i = 0;
1268     tmpBD = pMemMngr->firstFreeBD;
1269     while (++i, tmpBD != NULL) {
1270         WLAN_OS_REPORT(("tmpBD %d = %X handle=%d tmpBD->nextBDPtr=%X\n",
1271             i, tmpBD, tmpBD->handle, tmpBD->nextBDPtr));
1272         tmpBD = tmpBD->nextBDPtr;
1273     }
1274     WLAN_OS_REPORT(("\n"));
1275
1276     for(j = 0 ;j < pMemMngr->currentNumberOfPools; j++) {
1277         i = 0;
1278         tmpDataBuf = pMemMngr->buffersPool[j].firstFreeDataBuf;
1279         WLAN_OS_REPORT(("\npoolIndex=%d  firstFreeDataBuf=%X\n",j,pMemMngr->buffersPool[j].firstFreeDataBuf));
1280         while (++i, tmpDataBuf != NULL) {
1281             WLAN_OS_REPORT(("Buf %d = %X handle=%d  next=%X poolIndex=%d pData=%X\n", i, tmpDataBuf,
1282                 tmpDataBuf->handle,tmpDataBuf->nextDataBuf, tmpDataBuf->poolIndex, tmpDataBuf->data));
1283             tmpDataBuf = tmpDataBuf->nextDataBuf;
1284         }
1285         WLAN_OS_REPORT(("\n"));
1286     }
1287     WLAN_OS_REPORT(("\n"));
1288 }
1289
1290
1291 void memMngrPrint(TI_HANDLE hMemMngr)
1292 {
1293 #if 0
1294     memMngr_t *pMemMngr = (memMngr_t *)hMemMngr;
1295
1296     WLAN_OS_REPORT(("memMngrPrint\n"));
1297     WLAN_OS_REPORT(("numFreeMSDU %d numFreeBD %d  \n", pMemMngr->numFreeMSDU, pMemMngr->numFreeBD));
1298     for(j = 0 ;j < pMemMngr->currentNumberOfPools; j++)
1299         WLAN_OS_REPORT(("Pool Num %d   buffer length %d   numFreeDataBuf %d \n", j, 
1300             pMemMngr->buffersPool[j].buffersSize, pMemMngr->buffersPool[j].numFreeDataBuf));
1301
1302     WLAN_OS_REPORT(("\nAllocated by modules on Tx\n"));
1303
1304
1305     WLAN_OS_REPORT(("\nAllocated by modules : MLME=%d, OS_ABS=%d,  RSN=%d  \n", 
1306                                             pMemMngr->moduleAllocCount[MLME_MODULE],
1307                                             pMemMngr->moduleAllocCount[OS_ABS_TX_MODULE],
1308                                             pMemMngr->moduleAllocCount[RSN_MODULE]));
1309
1310     WLAN_OS_REPORT(("\nAllocated by modules : HAL_TX=%d, CONCAT=%d,  DE_CONCAT=%d,  TX=%d\n", 
1311                                             pMemMngr->moduleAllocCount[HAL_TX_MODULE],
1312                                             pMemMngr->moduleAllocCount[CONCAT_MODULE],
1313                                             pMemMngr->moduleAllocCount[DE_CONCAT_MODULE],
1314                                             pMemMngr->moduleAllocCount[TX_MODULE]));
1315
1316     WLAN_OS_REPORT(("\nAllocated by modules : ACK_EMUL=%d, MEASUREMENT=%d,  SITE_MGR=%d,  EXC_MANAGER=%d\n", 
1317                                             pMemMngr->moduleAllocCount[ACK_EMUL_MODULE],
1318                                             pMemMngr->moduleAllocCount[MEASUREMENT_MODULE],
1319                                             pMemMngr->moduleAllocCount[SITE_MGR_MODULE],
1320                                             pMemMngr->moduleAllocCount[EXC_MANAGER_MODULE]));
1321
1322     WLAN_OS_REPORT(("\nAllocated by modules on Rx\n"));
1323
1324     WLAN_OS_REPORT(("\nAllocated by modules : HAL_RX=%d, CORE_RX=%d,  MLME_RX=%d,  OS_ABS_RX=%d\n", 
1325                                             pMemMngr->moduleAllocCount[HAL_RX_MODULE],
1326                                             pMemMngr->moduleAllocCount[CORE_RX_MODULE],
1327                                             pMemMngr->moduleAllocCount[MLME_RX_MODULE],
1328                                             pMemMngr->moduleAllocCount[OS_ABS_RX_MODULE]));
1329
1330     WLAN_OS_REPORT(("\nAllocated by modules : RSN_RX=%d, MEASUREMENT_RX=%d,  SITE_MGR_RX=%d,  EXC_MANAGER_RX=%d\n", 
1331                                             pMemMngr->moduleAllocCount[RSN_RX_MODULE],
1332                                             pMemMngr->moduleAllocCount[MEASUREMENT_RX_MODULE],
1333                                             pMemMngr->moduleAllocCount[SITE_MGR_RX_MODULE],
1334                                             pMemMngr->moduleAllocCount[EXC_MANAGER_RX_MODULE]));
1335
1336
1337
1338     WLAN_OS_REPORT(("\nAllocated by modules : HAL_WEP1_RX=%d, HAL_WEP2_RX=%d, HAL_DEFRAG_RX=%d,  HAL_DUPLICA_RX=%d\n", 
1339                                             pMemMngr->moduleAllocCount[HAL_WEP1_RX],
1340                                             pMemMngr->moduleAllocCount[HAL_WEP2_RX],
1341                                             pMemMngr->moduleAllocCount[HAL_DEFRAG_RX],
1342                                             pMemMngr->moduleAllocCount[HAL_DUPLICA_RX]));
1343
1344
1345
1346
1347     WLAN_OS_REPORT(("\nAllocated by modules : FREE_MSDU=%d\n", 
1348                                         pMemMngr->moduleAllocCount[MODULE_FREE_MSDU]));
1349
1350 #endif
1351 }
1352
1353 void print_MsduDataHeader(TI_HANDLE hMemMngr, mem_MSDU_T *pMsdu)
1354 {
1355     mem_BD_T            *pBd;
1356     UINT8               tempBuffer[40],*pTempBuffer;
1357     UINT32              lengthToPrint = 40;
1358     UINT32              i;
1359
1360     memMngr_t *pMemMngr = (memMngr_t *)hMemMngr;
1361
1362     pTempBuffer = tempBuffer;
1363     pBd =  pMsdu->firstBDPtr;
1364
1365     while (lengthToPrint != 0)
1366     {
1367         if (pBd->length < lengthToPrint)    
1368         {
1369             os_memoryCopy(pMemMngr->hOs, (void *)pTempBuffer, (void *)pBd->data, pBd->length);
1370             lengthToPrint -= pBd->length;
1371             pTempBuffer += pBd->length;         
1372             pBd = pBd->nextBDPtr;
1373         }
1374         else                            /* enough place in current BD*/
1375         {
1376             os_memoryCopy(pMemMngr->hOs, (void *)pTempBuffer, (void *)pBd->data, lengthToPrint);
1377             lengthToPrint = 0;
1378         }
1379     }
1380     WLAN_OS_REPORT(("\n"));
1381     for(i = 0 ; i < 60 ; i++)
1382     {
1383         WLAN_OS_REPORT(("%02X ",tempBuffer[i]));
1384     }
1385     WLAN_OS_REPORT(("\n\n"));
1386 }
1387 /*void DumpMemory(char* data, int size)
1388 {
1389     char NumStr[60], CharStr[20], ResStr[81];
1390     int bank, i, space;
1391     
1392     bank = 0;
1393     
1394     for(i=0; i<size; i++) {
1395         
1396         sprintf(&NumStr[bank*3], "%02X ", (UCHAR)data[i]);
1397         CharStr[bank] = (data[i]>=0x20 && data[i]<=0x7E) ? data[i] : '.';
1398         
1399         if(++bank == 16) {
1400             CharStr[bank] = 0;
1401             sprintf(ResStr, "%s        %s", NumStr, CharStr);
1402             printf("%s\n",ResStr);
1403             bank = 0;
1404         }
1405         
1406     }
1407     
1408     if(bank) {
1409         CharStr[bank] = 0;
1410         printf("%s", NumStr);
1411         if(size < 16)
1412             space = 6;
1413         else
1414             space = 56-strlen(NumStr);
1415         for(i=0; i<space; i++)
1416             printf(" ");
1417         printf("%s\n",CharStr);
1418     }
1419     
1420 }
1421 */
1422
1423 TI_STATUS txDataSTUB_txSendMsdu(TI_HANDLE hMemMngr, mem_MSDU_T *pMsdu)
1424 {
1425     TI_STATUS status;
1426     memMngr_t *pMemMngr = (memMngr_t *)hMemMngr;
1427
1428     status = wlan_memMngrFreeMSDU(pMemMngr, memMgr_MsduHandle(pMsdu));
1429     if(status != OK)
1430         return NOK;
1431     
1432     return OK;
1433 }
1434