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 1435