1 /* 2 * TWDriver.c 3 * 4 * Copyright(c) 1998 - 2010 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 /** \file TWDriver.c 36 * \brief TI WLAN Hardware Access Driver 37 * 38 * \see TWDriver.h 39 */ 40 41 #define __FILE_ID__ FILE_ID_117 42 #include "report.h" 43 #include "TWDriver.h" 44 #include "MacServices_api.h" 45 #include "txCtrlBlk_api.h" 46 #include "txHwQueue_api.h" 47 #include "txXfer_api.h" 48 #include "txResult_api.h" 49 #include "rxXfer_api.h" 50 #include "TwIf.h" 51 #include "FwEvent_api.h" 52 #include "CmdMBox_api.h" 53 #include "CmdQueue_api.h" 54 #include "eventMbox_api.h" 55 #include "fwDebug_api.h" 56 #include "osApi.h" 57 #include "TWDriverInternal.h" 58 #include "HwInit_api.h" 59 #include "CmdBld.h" 60 #include "RxQueue_api.h" 61 62 63 64 #define TWD_CB_MODULE_OWNER_MASK 0xff00 65 #define TWD_CB_TYPE_MASK 0x00ff 66 67 68 69 70 TI_HANDLE TWD_Create (TI_HANDLE hOs) 71 { 72 TTwd *pTWD; 73 74 /* Allocate the TNETW_Driver module */ 75 pTWD = (TTwd *)os_memoryAlloc (hOs, sizeof(TTwd)); 76 if (pTWD == NULL) 77 { 78 return NULL; 79 } 80 81 os_memoryZero (hOs, pTWD, sizeof(TTwd)); 82 83 pTWD->hOs = hOs; 84 85 /* Create TwIf module */ 86 pTWD->hTwIf = twIf_Create (hOs); 87 if (pTWD->hTwIf == NULL) 88 { 89 TRACE0(pTWD->hReport, REPORT_SEVERITY_CONSOLE,"twIf_Create failed\n"); 90 WLAN_OS_REPORT(("twIf_Create failed\n")); 91 TWD_Destroy ((TI_HANDLE)pTWD); 92 return NULL; 93 } 94 95 /* Create command builder module */ 96 pTWD->hCmdBld = cmdBld_Create (hOs); 97 if (pTWD->hCmdBld == NULL) 98 { 99 TRACE0(pTWD->hReport, REPORT_SEVERITY_CONSOLE,"cmdBld_Create failed\n"); 100 WLAN_OS_REPORT(("cmdBld_Create failed\n")); 101 TWD_Destroy ((TI_HANDLE)pTWD); 102 return NULL; 103 } 104 105 /* Create the MAC Services module */ 106 pTWD->hMacServices = MacServices_create (hOs); 107 if (pTWD->hMacServices == NULL) 108 { 109 TRACE0(pTWD->hReport, REPORT_SEVERITY_CONSOLE, "TWD MacServices_create failed!!!\n"); 110 WLAN_OS_REPORT(("TWD MacServices_create failed!!!\n")); 111 TWD_Destroy ((TI_HANDLE)pTWD); 112 return NULL; 113 } 114 115 /* Create the Ctrl module */ 116 pTWD->hCmdQueue = cmdQueue_Create (hOs); 117 if (pTWD->hCmdQueue == NULL) 118 { 119 TRACE0(pTWD->hReport, REPORT_SEVERITY_CONSOLE, "TWD cmdQueue_Create failed!!!\n"); 120 WLAN_OS_REPORT(("TWD cmdQueue_Create failed!!!\n")); 121 TWD_Destroy ((TI_HANDLE)pTWD); 122 return NULL; 123 } 124 125 /* 126 * Create the FW-Transfer modules: 127 */ 128 129 pTWD->hTxXfer = txXfer_Create (hOs); 130 if (pTWD->hTxXfer == NULL) 131 { 132 TRACE0(pTWD->hReport, REPORT_SEVERITY_CONSOLE,"TWD txXfer_Create failed!!!\n"); 133 WLAN_OS_REPORT(("TWD txXfer_Create failed!!!\n")); 134 TWD_Destroy ((TI_HANDLE)pTWD); 135 return NULL; 136 } 137 138 pTWD->hTxResult = txResult_Create (hOs); 139 if (pTWD->hTxResult == NULL) 140 { 141 TRACE0(pTWD->hReport, REPORT_SEVERITY_CONSOLE,"TWD txResult_Create failed!!!\n"); 142 WLAN_OS_REPORT(("TWD txResult_Create failed!!!\n")); 143 TWD_Destroy ((TI_HANDLE)pTWD); 144 return NULL; 145 } 146 147 pTWD->hRxXfer = rxXfer_Create (hOs); 148 if (pTWD->hRxXfer == NULL) 149 { 150 TRACE0(pTWD->hReport, REPORT_SEVERITY_CONSOLE,"TWD rxXfer_Create failed!!!\n"); 151 WLAN_OS_REPORT(("TWD rxXfer_Create failed!!!\n")); 152 TWD_Destroy ((TI_HANDLE)pTWD); 153 return NULL; 154 } 155 156 pTWD->hFwEvent = fwEvent_Create (hOs); 157 if (pTWD->hFwEvent == NULL) 158 { 159 TRACE0(pTWD->hReport, REPORT_SEVERITY_CONSOLE, "TWD fwEvent_Create failed!!!\n"); 160 WLAN_OS_REPORT(("TWD fwEvent_Create failed!!!\n")); 161 TWD_Destroy ((TI_HANDLE)pTWD); 162 return NULL; 163 } 164 165 pTWD->hEventMbox = eventMbox_Create (hOs); 166 if (pTWD->hEventMbox == NULL) 167 { 168 TRACE0(pTWD->hReport, REPORT_SEVERITY_CONSOLE, "TWD eventMbox_Create failed!!!\n"); 169 WLAN_OS_REPORT(("TWD eventMbox_Create failed!!!\n")); 170 TWD_Destroy ((TI_HANDLE)pTWD); 171 return NULL; 172 } 173 174 #ifdef TI_DBG 175 pTWD->hFwDbg = fwDbg_Create (hOs); 176 if (pTWD->hFwDbg == NULL) 177 { 178 TRACE0(pTWD->hReport, REPORT_SEVERITY_CONSOLE,"TWD fwDbg_Create failed!!!\n"); 179 WLAN_OS_REPORT(("TWD fwDbg_Create failed!!!\n")); 180 TWD_Destroy ((TI_HANDLE)pTWD); 181 return NULL; 182 } 183 #endif /* TI_DBG */ 184 185 pTWD->hCmdMbox = cmdMbox_Create (hOs); 186 if (pTWD->hCmdMbox == NULL) 187 { 188 TRACE0(pTWD->hReport, REPORT_SEVERITY_CONSOLE,"TWD cmdMbox_Create failed!!!\n"); 189 WLAN_OS_REPORT(("TWD cmdMbox_Create failed!!!\n")); 190 TWD_Destroy ((TI_HANDLE)pTWD); 191 return NULL; 192 } 193 194 pTWD->hRxQueue = RxQueue_Create (hOs); 195 if (pTWD->hRxQueue == NULL) 196 { 197 TRACE0(pTWD->hReport, REPORT_SEVERITY_CONSOLE, "TWD RxQueue_Create failed!!!\n"); 198 WLAN_OS_REPORT(("TWD RxQueue_Create failed!!!\n")); 199 TWD_Destroy ((TI_HANDLE)pTWD); 200 return NULL; 201 } 202 203 204 /* 205 * Create the Data-Services modules: 206 */ 207 208 pTWD->hTxCtrlBlk = txCtrlBlk_Create (hOs); 209 if (pTWD->hTxCtrlBlk == NULL) 210 { 211 TRACE0(pTWD->hReport, REPORT_SEVERITY_CONSOLE, "TWD txCtrlBlk_Create failed!!!\n"); 212 WLAN_OS_REPORT(("TWD txCtrlBlk_Create failed!!!\n")); 213 TWD_Destroy ((TI_HANDLE)pTWD); 214 return NULL; 215 } 216 217 pTWD->hTxHwQueue = txHwQueue_Create (hOs); 218 if (pTWD->hTxHwQueue == NULL) 219 { 220 TRACE0(pTWD->hReport, REPORT_SEVERITY_CONSOLE, "TWD txHwQueue_Create failed!!!\n"); 221 WLAN_OS_REPORT(("TWD txHwQueue_Create failed!!!\n")); 222 TWD_Destroy ((TI_HANDLE)pTWD); 223 return NULL; 224 } 225 226 pTWD->hHwInit = hwInit_Create (hOs); 227 if (pTWD->hHwInit == NULL) 228 { 229 TRACE0(pTWD->hReport, REPORT_SEVERITY_CONSOLE,"wInit_Create failed!\n"); 230 WLAN_OS_REPORT (("wInit_Create failed!\n")); 231 TWD_Destroy ((TI_HANDLE)pTWD); 232 return NULL; 233 } 234 235 WLAN_INIT_REPORT (("TWD_Create: CREATED !!!\n")); 236 237 return (TI_HANDLE)pTWD; 238 } 239 240 TI_STATUS TWD_Destroy (TI_HANDLE hTWD) 241 { 242 TTwd *pTWD = (TTwd *)hTWD; 243 244 WLAN_INIT_REPORT(("TWD_Destroy: called\n")); 245 if (pTWD == NULL) 246 { 247 return TI_NOK; 248 } 249 250 if (pTWD->hTwIf != NULL) 251 { 252 twIf_Destroy (pTWD->hTwIf); 253 pTWD->hTwIf = NULL; 254 } 255 256 /* Free the Command Builder */ 257 if (pTWD->hCmdBld != NULL) 258 { 259 cmdBld_Destroy (pTWD->hCmdBld); 260 pTWD->hCmdBld = NULL; 261 } 262 WLAN_INIT_REPORT(("TWD_Destroy: Command Builder released\n")); 263 264 /* Free the MAC Services */ 265 if (pTWD->hMacServices != NULL) 266 { 267 MacServices_destroy(pTWD->hMacServices); 268 pTWD->hMacServices = NULL; 269 } 270 WLAN_INIT_REPORT(("TWD_Destroy: Mac Services released\n")); 271 272 /* 273 * Free the Ctrl modules 274 */ 275 if (pTWD->hCmdQueue != NULL) 276 { 277 cmdQueue_Destroy(pTWD->hCmdQueue); 278 pTWD->hCmdQueue = NULL; 279 } 280 281 /* 282 * Free the FW-Transfer modules: 283 */ 284 if (pTWD->hTxXfer != NULL) 285 { 286 txXfer_Destroy (pTWD->hTxXfer); 287 pTWD->hTxXfer = NULL; 288 } 289 290 if (pTWD->hTxResult != NULL) 291 { 292 txResult_Destroy (pTWD->hTxResult); 293 pTWD->hTxResult = NULL; 294 } 295 296 if (pTWD->hRxXfer != NULL) 297 { 298 rxXfer_Destroy (pTWD->hRxXfer); 299 pTWD->hRxXfer = NULL; 300 } 301 302 if (pTWD->hEventMbox != NULL) 303 { 304 eventMbox_Destroy (pTWD->hEventMbox); 305 pTWD->hEventMbox = NULL; 306 } 307 308 #ifdef TI_DBG 309 if (pTWD->hFwDbg != NULL) 310 { 311 fwDbg_Destroy (pTWD->hFwDbg); 312 pTWD->hFwDbg = NULL; 313 } 314 #endif /* TI_DBG */ 315 316 if (pTWD->hFwEvent != NULL) 317 { 318 fwEvent_Destroy (pTWD->hFwEvent); 319 pTWD->hFwEvent = NULL; 320 } 321 322 if (pTWD->hCmdMbox != NULL) 323 { 324 cmdMbox_Destroy (pTWD->hCmdMbox); 325 pTWD->hCmdMbox = NULL; 326 } 327 328 if (pTWD->hRxQueue != NULL) 329 { 330 RxQueue_Destroy (pTWD->hRxQueue); 331 pTWD->hRxQueue = NULL; 332 } 333 334 /* 335 * Free the Data-Services modules: 336 */ 337 338 if (pTWD->hTxCtrlBlk != NULL) 339 { 340 txCtrlBlk_Destroy (pTWD->hTxCtrlBlk); 341 pTWD->hTxCtrlBlk = NULL; 342 } 343 344 if (pTWD->hTxHwQueue != NULL) 345 { 346 txHwQueue_Destroy (pTWD->hTxHwQueue); 347 pTWD->hTxHwQueue = NULL; 348 } 349 350 if (pTWD->hHwInit != NULL) 351 { 352 hwInit_Destroy (pTWD->hHwInit); 353 pTWD->hHwInit = NULL; 354 } 355 356 os_memoryFree (pTWD->hOs, (TI_HANDLE)pTWD, sizeof(TTwd)); 357 358 WLAN_INIT_REPORT(("TWD_Destroy pTNETW_Driver released!!!\n")); 359 360 return TI_OK; 361 } 362 363 364 /** 365 * \brief HW Init Callback 366 * 367 * \param hTWD - TWD module object handle 368 * \return void 369 * 370 * \par Description 371 * Static CB function 372 * Called during TWD Module Init by hwInit_Init in order to complete the HW Configuration init 373 * 374 * \sa TWD_InitHw 375 */ 376 static void TWD_InitHwCb (TI_HANDLE hTWD) 377 { 378 TTwd *pTWD = (TTwd *)hTWD; 379 380 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_InitHwCb: call fInitHwCb CB. In std drvMain_InitHwCb()\n"); 381 382 hwInit_InitPolarity(pTWD->hHwInit); 383 384 } 385 386 void TWD_Init (TI_HANDLE hTWD, 387 TI_HANDLE hReport, 388 TI_HANDLE hUser, 389 TI_HANDLE hTimer, 390 TI_HANDLE hContext, 391 TI_HANDLE hTxnQ, 392 TTwdCallback fInitHwCb, 393 TTwdCallback fInitFwCb, 394 TTwdCallback fConfigFwCb, 395 TTwdCallback fStopCb, 396 TTwdCallback fInitFailCb) 397 { 398 TTwd *pTWD = (TTwd *)hTWD; 399 pTWD->bInitSuccess = TI_FALSE; 400 pTWD->bRecoveryEnabled = TI_FALSE; 401 pTWD->hReport = hReport; 402 pTWD->hUser = hUser; 403 pTWD->hTimer = hTimer; 404 pTWD->hContext = hContext; 405 pTWD->hTxnQ = hTxnQ; 406 pTWD->fInitHwCb = fInitHwCb; 407 pTWD->fInitFwCb = fInitFwCb; 408 pTWD->fConfigFwCb = fConfigFwCb; 409 pTWD->fStopCb = fStopCb; 410 pTWD->fInitFailCb = fInitFailCb; 411 412 TRACE1(pTWD->hReport, REPORT_SEVERITY_INIT , "TWD_Init: %x\n", hTWD); 413 414 /* FwEvent should be configured first */ 415 fwEvent_Init (pTWD->hFwEvent, hTWD); 416 417 eventMbox_Config (pTWD->hEventMbox, pTWD->hTwIf, pTWD->hReport, pTWD->hFwEvent, pTWD->hCmdBld); 418 419 cmdQueue_Init (pTWD->hCmdQueue, 420 pTWD->hCmdMbox, 421 pTWD->hReport, 422 pTWD->hTwIf, 423 pTWD->hTimer); 424 425 /* Configure Command Builder */ 426 cmdBld_Config (pTWD->hCmdBld, 427 pTWD->hReport, 428 (void *)TWD_FinalizeDownload, 429 hTWD, 430 pTWD->hEventMbox, 431 pTWD->hCmdQueue, 432 pTWD->hTwIf); 433 434 hwInit_Init (pTWD->hHwInit, 435 pTWD->hReport, 436 pTWD->hTimer, 437 hTWD, 438 hTWD, 439 (TFinalizeCb)TWD_FinalizeDownload, 440 TWD_InitHwCb); 441 442 /* 443 * Initialize the FW-Transfer modules 444 */ 445 txXfer_Init (pTWD->hTxXfer, pTWD->hReport, pTWD->hTwIf); 446 447 txResult_Init (pTWD->hTxResult, pTWD->hReport, pTWD->hTwIf); 448 449 rxXfer_Init (pTWD->hRxXfer, pTWD->hFwEvent, pTWD->hReport, pTWD->hTwIf, pTWD->hRxQueue); 450 451 RxQueue_Init (pTWD->hRxQueue, pTWD->hReport, pTWD->hTimer); 452 453 #ifdef TI_DBG 454 fwDbg_Init (pTWD->hFwDbg, pTWD->hReport, pTWD->hTwIf); 455 #endif /* TI_DBG */ 456 457 /* Initialize the MAC Services */ 458 MacServices_init (pTWD->hMacServices, 459 pTWD->hReport, 460 hTWD, 461 pTWD->hCmdBld, 462 pTWD->hEventMbox, 463 pTWD->hTimer); 464 465 /* 466 * Initialize the Data-Services modules 467 */ 468 txCtrlBlk_Init (pTWD->hTxCtrlBlk, pTWD->hReport, pTWD->hContext); 469 txHwQueue_Init (pTWD->hTxHwQueue, pTWD->hReport); 470 471 /* Initialize the TwIf module */ 472 twIf_Init (pTWD->hTwIf, 473 pTWD->hReport, 474 pTWD->hContext, 475 pTWD->hTimer, 476 pTWD->hTxnQ, 477 (TRecoveryCb)TWD_StopComplete, 478 hTWD); 479 } 480 481 TI_STATUS TWD_InitHw (TI_HANDLE hTWD, 482 TI_UINT8 *pbuf, 483 TI_UINT32 length, 484 TI_UINT32 uRxDmaBufLen, 485 TI_UINT32 uTxDmaBufLen) 486 { 487 TTwd *pTWD = (TTwd *)hTWD; 488 TI_STATUS eStatus; 489 490 TRACE0(pTWD->hReport, REPORT_SEVERITY_INIT , "TWD_InitHw: called\n"); 491 492 /* Provide bus related parameters to Xfer modules before any usage of the bus! */ 493 rxXfer_SetBusParams (pTWD->hRxXfer, uRxDmaBufLen); 494 txXfer_SetBusParams (pTWD->hTxXfer, uTxDmaBufLen); 495 496 hwInit_SetNvsImage (pTWD->hHwInit, pbuf, length); 497 498 /* 499 * Update the TwIf that the HW is awake 500 * This will protect the initialization process from going to sleep 501 * After the firmware initializations completed (TWD_EnableExternalEvents), the sleep will be enabled 502 */ 503 twIf_Awake (pTWD->hTwIf); 504 twIf_HwAvailable (pTWD->hTwIf); 505 506 /* This initiates the HW init sequence */ 507 eStatus = hwInit_Boot(pTWD->hHwInit); 508 if (eStatus == TXN_STATUS_ERROR) 509 { 510 TRACE0(pTWD->hReport, REPORT_SEVERITY_ERROR , "TWD_InitHw: hwInit_Boot failed\n"); 511 return TI_NOK; 512 } 513 514 return TI_OK; 515 } 516 517 TI_STATUS TWD_BusOpen (TI_HANDLE hTWD, void* pParams) 518 { 519 TTwd *pTWD = (TTwd *)hTWD; 520 TI_STATUS uStatus; 521 522 TRACE0(pTWD->hReport, REPORT_SEVERITY_INIT , "TWD_BusOpen: called\n"); 523 524 /*uStatus = TNETWIF_Open(pTWD->hTNETWIF, pParams);*/ 525 uStatus = TI_OK; 526 527 return uStatus; 528 } 529 530 TI_STATUS TWD_BusClose (TI_HANDLE hTWD) 531 { 532 TTwd *pTWD = (TTwd *)hTWD; 533 TI_STATUS uStatus; 534 535 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_BusClose: called\n"); 536 537 /*uStatus = TNETWIF_Close(pTWD->hTNETWIF);*/ 538 uStatus = TI_OK; 539 540 return uStatus; 541 } 542 543 TI_STATUS TWD_InitFw (TI_HANDLE hTWD, TFileInfo *pFileInfo) 544 { 545 TTwd *pTWD = (TTwd *)hTWD; 546 TI_STATUS status; 547 548 /* check Parameters */ 549 if (( pTWD == NULL ) || ( pFileInfo == NULL )) 550 { 551 return (TI_NOK); 552 } 553 554 TRACE0(pTWD->hReport, REPORT_SEVERITY_INIT , "TWD_InitFw: called\n"); 555 556 hwInit_SetFwImage (pTWD->hHwInit, pFileInfo); 557 558 /* This will initiate the download to the FW */ 559 status = hwInit_LoadFw(pTWD->hHwInit); 560 561 if (status == TXN_STATUS_ERROR) 562 { 563 TRACE0(pTWD->hReport, REPORT_SEVERITY_ERROR , "TWD_InitFw: failed to initialize FW\n"); 564 565 return TI_NOK; 566 } 567 568 return TI_OK; 569 } 570 571 /** 572 * \brief Propagate interrogate results 573 * 574 * \param hTWD - TWD module object handle 575 * \param status - callback status 576 * \return TI_OK on success or TI_NOK on failure 577 * 578 * \par Description 579 * Static CB function 580 * Propagate interrogate results between TX and RX modules 581 * Called by TWD_ConfigFw 582 * 583 * \sa 584 */ 585 static TI_STATUS TWD_ConfigFwCb (TI_HANDLE hTWD, TI_STATUS status) 586 { 587 TTwd *pTWD = (TTwd *)hTWD; 588 TDmaParams *pDmaParams = &DB_DMA(pTWD->hCmdBld); 589 590 /* 591 * Store the addresses of the cyclic buffer (Rx/Tx) 592 * and the path status and control (Tx/Rx) in the corresponding modules 593 */ 594 txResult_setHwInfo (pTWD->hTxResult, pDmaParams); 595 596 rxXfer_Restart (pTWD->hRxXfer); 597 txXfer_Restart (pTWD->hTxXfer); 598 599 rxXfer_SetRxDirectAccessParams (pTWD->hRxXfer, pDmaParams); 600 601 /* Provide number of HW Tx-blocks and descriptors to Tx-HW-Queue module */ 602 txHwQueue_SetHwInfo (pTWD->hTxHwQueue, pDmaParams); 603 604 /* If the configure complete function was registered, we call it here - end of TWD_Configure stage */ 605 if (pTWD->fConfigFwCb) 606 { 607 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_ConfigFwCb: call TWD_OWNER_SELF_CONFIG CB. In std drvMain_ConfigFwCb()\n"); 608 609 pTWD->fConfigFwCb (pTWD->hUser, TI_OK); 610 } 611 612 return TI_OK; 613 } 614 615 616 TI_STATUS TWD_SetDefaults (TI_HANDLE hTWD, TTwdInitParams *pInitParams) 617 { 618 TTwd *pTWD = (TTwd *)hTWD; 619 620 TWlanParams *pWlanParams = &DB_WLAN(pTWD->hCmdBld); 621 TKeepAliveList *pKlvParams = &DB_KLV(pTWD->hCmdBld); 622 IniFileRadioParam *pRadioParams = &DB_RADIO(pTWD->hCmdBld); 623 IniFileExtendedRadioParam *pExtRadioParams = &DB_EXT_RADIO(pTWD->hCmdBld); 624 IniFileGeneralParam *pGenParams = &DB_GEN(pTWD->hCmdBld); 625 TRateMngParams *pRateMngParams = &DB_RM(pTWD->hCmdBld); 626 TDmaParams *pDmaParams = &DB_DMA(pTWD->hCmdBld); 627 628 TI_UINT32 k, uIndex; 629 int iParam; 630 631 TRACE0(pTWD->hReport, REPORT_SEVERITY_INIT , "TWD_SetDefaults: called\n"); 632 633 pTWD->bRecoveryEnabled = pInitParams->tGeneral.halCtrlRecoveryEnable; 634 635 pWlanParams->PacketDetectionThreshold = pInitParams->tGeneral.packetDetectionThreshold; 636 pWlanParams->qosNullDataTemplateSize = pInitParams->tGeneral.qosNullDataTemplateSize; 637 pWlanParams->PsPollTemplateSize = pInitParams->tGeneral.PsPollTemplateSize; 638 pWlanParams->probeResponseTemplateSize = pInitParams->tGeneral.probeResponseTemplateSize; 639 pWlanParams->probeRequestTemplateSize = pInitParams->tGeneral.probeRequestTemplateSize; 640 pWlanParams->beaconTemplateSize = pInitParams->tGeneral.beaconTemplateSize; 641 pWlanParams->nullTemplateSize = pInitParams->tGeneral.nullTemplateSize; 642 pWlanParams->disconnTemplateSize = pInitParams->tGeneral.disconnTemplateSize; 643 pWlanParams->ArpRspTemplateSize = pInitParams->tGeneral.ArpRspTemplateSize; 644 645 /* Beacon broadcast options */ 646 pWlanParams->BcnBrcOptions.BeaconRxTimeout = pInitParams->tGeneral.BeaconRxTimeout; 647 pWlanParams->BcnBrcOptions.BroadcastRxTimeout = pInitParams->tGeneral.BroadcastRxTimeout; 648 pWlanParams->BcnBrcOptions.RxBroadcastInPs = pInitParams->tGeneral.RxBroadcastInPs; 649 pWlanParams->ConsecutivePsPollDeliveryFailureThreshold = pInitParams->tGeneral.ConsecutivePsPollDeliveryFailureThreshold; 650 651 pWlanParams->RxDisableBroadcast = pInitParams->tGeneral.halCtrlRxDisableBroadcast; 652 pWlanParams->calibrationChannel2_4 = pInitParams->tGeneral.halCtrlCalibrationChannel2_4; 653 pWlanParams->calibrationChannel5_0 = pInitParams->tGeneral.halCtrlCalibrationChannel5_0; 654 655 /* Not used but need by Palau */ 656 pWlanParams->RtsThreshold = pInitParams->tGeneral.halCtrlRtsThreshold; 657 pWlanParams->CtsToSelf = CTS_TO_SELF_DISABLE; 658 659 pWlanParams->WiFiWmmPS = pInitParams->tGeneral.WiFiWmmPS; 660 661 pWlanParams->MaxTxMsduLifetime = pInitParams->tGeneral.halCtrlMaxTxMsduLifetime; 662 pWlanParams->MaxRxMsduLifetime = pInitParams->tGeneral.halCtrlMaxRxMsduLifetime; 663 664 pWlanParams->rxTimeOut.psPoll = pInitParams->tGeneral.rxTimeOut.psPoll; 665 pWlanParams->rxTimeOut.UPSD = pInitParams->tGeneral.rxTimeOut.UPSD; 666 667 /* RSSI/SNR Weights for Average calculations */ 668 pWlanParams->tRssiSnrWeights.rssiBeaconAverageWeight = pInitParams->tGeneral.uRssiBeaconAverageWeight; 669 pWlanParams->tRssiSnrWeights.rssiPacketAverageWeight = pInitParams->tGeneral.uRssiPacketAverageWeight; 670 pWlanParams->tRssiSnrWeights.snrBeaconAverageWeight = pInitParams->tGeneral.uSnrBeaconAverageWeight ; 671 pWlanParams->tRssiSnrWeights.snrPacketAverageWeight = pInitParams->tGeneral.uSnrPacketAverageWeight ; 672 673 /* PM config params */ 674 pWlanParams->uHostClkSettlingTime = pInitParams->tGeneral.uHostClkSettlingTime; 675 pWlanParams->uHostFastWakeupSupport = pInitParams->tGeneral.uHostFastWakeupSupport; 676 677 /* No used */ 678 pWlanParams->FragmentThreshold = pInitParams->tGeneral.halCtrlFragThreshold; 679 pWlanParams->ListenInterval = (TI_UINT8)pInitParams->tGeneral.halCtrlListenInterval; 680 pWlanParams->RateFallback = pInitParams->tGeneral.halCtrlRateFallbackRetry; 681 pWlanParams->MacClock = pInitParams->tGeneral.halCtrlMacClock; 682 pWlanParams->ArmClock = pInitParams->tGeneral.halCtrlArmClock; 683 684 pWlanParams->ch14TelecCca = pInitParams->tGeneral.halCtrlCh14TelecCca; 685 686 /* Data interrupts pacing */ 687 pWlanParams->TxCompletePacingThreshold = pInitParams->tGeneral.TxCompletePacingThreshold; 688 pWlanParams->TxCompletePacingTimeout = pInitParams->tGeneral.TxCompletePacingTimeout; 689 pWlanParams->RxIntrPacingThreshold = pInitParams->tGeneral.RxIntrPacingThreshold; 690 pWlanParams->RxIntrPacingTimeout = pInitParams->tGeneral.RxIntrPacingTimeout; 691 692 /* Number of Rx mem-blocks to allocate in FW */ 693 pDmaParams->NumRxBlocks = pInitParams->tGeneral.uRxMemBlksNum; 694 695 696 /* Configure ARP IP */ 697 pWlanParams->arpFilterType = pInitParams->tArpIpFilter.filterType; 698 IP_COPY (pWlanParams->arp_IP_addr, pInitParams->tArpIpFilter.addr); 699 700 /* Configure address group */ 701 pWlanParams->numGroupAddrs = pInitParams->tMacAddrFilter.numOfMacAddresses; 702 pWlanParams->isMacAddrFilteringnabled = pInitParams->tMacAddrFilter.isFilterEnabled; 703 704 for (k = 0; k < pWlanParams->numGroupAddrs; k++) 705 { 706 MAC_COPY (pWlanParams->aGroupAddr[k], pInitParams->tMacAddrFilter.macAddrTable[k]); 707 } 708 709 710 /* CoexActivity Table */ 711 TRACE1(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_SetDefaults: coex numOfElements %d\n", pInitParams->tGeneral.halCoexActivityTable.numOfElements); 712 713 pWlanParams->tWlanParamsCoexActivityTable.numOfElements = 0; 714 for (iParam=0; iParam < (int)pInitParams->tGeneral.halCoexActivityTable.numOfElements; iParam++) 715 { 716 TCoexActivity *pSaveCoex = &pWlanParams->tWlanParamsCoexActivityTable.entry[0]; 717 TCoexActivity *pParmCoex = &pInitParams->tGeneral.halCoexActivityTable.entry[0]; 718 int i, saveIndex; 719 720 /* Check if to overwrite existing entry or put on last index */ 721 for (i=0; i<iParam; i++) 722 { 723 if ((pSaveCoex[i].activityId == pParmCoex[iParam].activityId) && (pSaveCoex[i].coexIp == pParmCoex[iParam].coexIp)) 724 { 725 break; 726 } 727 } 728 729 if (i == iParam) 730 { 731 /* new entry */ 732 saveIndex = pWlanParams->tWlanParamsCoexActivityTable.numOfElements; 733 pWlanParams->tWlanParamsCoexActivityTable.numOfElements++; 734 } 735 else 736 { 737 /* overwrite existing */ 738 saveIndex = i; 739 } 740 741 TRACE4(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_SetDefaults: save coex Param %d in index %d, %d %d\n", iParam, saveIndex, pParmCoex[iParam].coexIp, pParmCoex[iParam].activityId); 742 743 pSaveCoex[saveIndex].coexIp = pParmCoex[iParam].coexIp; 744 pSaveCoex[saveIndex].activityId = pParmCoex[iParam].activityId; 745 pSaveCoex[saveIndex].defaultPriority = pParmCoex[iParam].defaultPriority; 746 pSaveCoex[saveIndex].raisedPriority = pParmCoex[iParam].raisedPriority; 747 pSaveCoex[saveIndex].minService = pParmCoex[iParam].minService; 748 pSaveCoex[saveIndex].maxService = pParmCoex[iParam].maxService; 749 } 750 751 /* configure keep-alive default mode to enabled */ 752 pKlvParams->enaDisFlag = TI_TRUE; 753 for (uIndex = 0; uIndex < KLV_MAX_TMPL_NUM; uIndex++) 754 { 755 pKlvParams->keepAliveParams[ uIndex ].enaDisFlag = TI_FALSE; 756 } 757 758 /* Configure the TWD modules */ 759 rxXfer_SetDefaults (pTWD->hRxXfer, pInitParams); 760 txXfer_SetDefaults (pTWD->hTxXfer, pInitParams); 761 txHwQueue_Config (pTWD->hTxHwQueue, pInitParams); 762 MacServices_config (pTWD->hMacServices, pInitParams); 763 764 /* 765 * 802.11n 766 */ 767 pWlanParams->tTwdHtCapabilities.b11nEnable = pInitParams->tGeneral.b11nEnable; 768 769 /* Configure HT capabilities setting */ 770 pWlanParams->tTwdHtCapabilities.uChannelWidth = CHANNEL_WIDTH_20MHZ; 771 pWlanParams->tTwdHtCapabilities.uRxSTBC = RXSTBC_NOT_SUPPORTED; 772 pWlanParams->tTwdHtCapabilities.uMaxAMSDU = MAX_MSDU_3839_OCTETS; 773 pWlanParams->tTwdHtCapabilities.uMaxAMPDU = pInitParams->tGeneral.uMaxAMPDU; 774 775 pWlanParams->tTwdHtCapabilities.uAMPDUSpacing = AMPDU_SPC_8_MICROSECONDS; 776 pWlanParams->tTwdHtCapabilities.aRxMCS[0] = (MCS_SUPPORT_MCS_0 | 777 MCS_SUPPORT_MCS_1 | 778 MCS_SUPPORT_MCS_2 | 779 MCS_SUPPORT_MCS_3 | 780 MCS_SUPPORT_MCS_4 | 781 MCS_SUPPORT_MCS_5 | 782 MCS_SUPPORT_MCS_6 | 783 MCS_SUPPORT_MCS_7); 784 os_memoryZero (pTWD->hOs, pWlanParams->tTwdHtCapabilities.aRxMCS + 1, RX_TX_MCS_BITMASK_SIZE - 1); 785 pWlanParams->tTwdHtCapabilities.aTxMCS[0] = (MCS_SUPPORT_MCS_0 | 786 MCS_SUPPORT_MCS_1 | 787 MCS_SUPPORT_MCS_2 | 788 MCS_SUPPORT_MCS_3 | 789 MCS_SUPPORT_MCS_4 | 790 MCS_SUPPORT_MCS_5 | 791 MCS_SUPPORT_MCS_6 | 792 MCS_SUPPORT_MCS_7); 793 os_memoryZero (pTWD->hOs, pWlanParams->tTwdHtCapabilities.aTxMCS + 1, RX_TX_MCS_BITMASK_SIZE - 1); 794 pWlanParams->tTwdHtCapabilities.uRxMaxDataRate = MCS_HIGHEST_SUPPORTED_RECEPTION_DATA_RATE_IN_MBIT_S; 795 pWlanParams->tTwdHtCapabilities.uPCOTransTime = PCO_TRANS_TIME_NO_TRANSITION; 796 pWlanParams->tTwdHtCapabilities.uHTCapabilitiesBitMask = (CAP_BIT_MASK_GREENFIELD_FRAME_FORMAT | 797 CAP_BIT_MASK_SHORT_GI_FOR_20MHZ_PACKETS); 798 pWlanParams->tTwdHtCapabilities.uMCSFeedback = MCS_FEEDBACK_NO; 799 800 os_memoryCopy(pTWD->hOs, (void*)pRadioParams, (void*)&pInitParams->tIniFileRadioParams, sizeof(IniFileRadioParam)); 801 os_memoryCopy(pTWD->hOs, (void*)pExtRadioParams, (void*)&pInitParams->tIniFileExtRadioParams, sizeof(IniFileExtendedRadioParam)); 802 os_memoryCopy(pTWD->hOs, (void*)pGenParams, (void*)&pInitParams->tPlatformGenParams, sizeof(IniFileGeneralParam)); 803 804 os_memoryCopy (pTWD->hOs, 805 (void*)&(pWlanParams->tFmCoexParams), 806 (void*)&(pInitParams->tGeneral.tFmCoexParams), 807 sizeof(TFmCoexParams)); 808 809 /* Rate management params */ 810 pRateMngParams->rateMngParams.InverseCuriosityFactor = pInitParams->tRateMngParams.InverseCuriosityFactor; 811 pRateMngParams->rateMngParams.MaxPer = pInitParams->tRateMngParams.MaxPer; 812 pRateMngParams->rateMngParams.PerAdd = pInitParams->tRateMngParams.PerAdd; 813 pRateMngParams->rateMngParams.PerAddShift = pInitParams->tRateMngParams.PerAddShift; 814 pRateMngParams->rateMngParams.PerAlphaShift = pInitParams->tRateMngParams.PerAlphaShift; 815 pRateMngParams->rateMngParams.PerBeta1Shift = pInitParams->tRateMngParams.PerBeta1Shift; 816 pRateMngParams->rateMngParams.PerBeta2Shift = pInitParams->tRateMngParams.PerBeta2Shift; 817 pRateMngParams->rateMngParams.PerTh1 = pInitParams->tRateMngParams.PerTh1; 818 pRateMngParams->rateMngParams.PerTh2 = pInitParams->tRateMngParams.PerTh2; 819 pRateMngParams->rateMngParams.RateCheckDown = pInitParams->tRateMngParams.RateCheckDown; 820 pRateMngParams->rateMngParams.RateCheckUp = pInitParams->tRateMngParams.RateCheckUp; 821 pRateMngParams->rateMngParams.RateRetryScore = pInitParams->tRateMngParams.RateRetryScore; 822 pRateMngParams->rateMngParams.TxFailHighTh = pInitParams->tRateMngParams.TxFailHighTh; 823 pRateMngParams->rateMngParams.TxFailLowTh = pInitParams->tRateMngParams.TxFailLowTh; 824 825 /* RATE_MNG_MAX_RETRY_POLICY_PARAMS_LEN */ 826 for (uIndex = 0; uIndex < 13; uIndex++) 827 { 828 pRateMngParams->rateMngParams.RateRetryPolicy[uIndex] = pInitParams->tRateMngParams.RateRetryPolicy[uIndex]; 829 } 830 831 /* DCO Itrim params */ 832 pWlanParams->dcoItrimEnabled = pInitParams->tDcoItrimParams.enable; 833 pWlanParams->dcoItrimModerationTimeoutUsec = pInitParams->tDcoItrimParams.moderationTimeoutUsec; 834 835 return TI_OK; 836 } 837 838 TI_STATUS TWD_ConfigFw (TI_HANDLE hTWD) 839 { 840 TTwd *pTWD = (TTwd *)hTWD; 841 842 TRACE0(pTWD->hReport, REPORT_SEVERITY_INIT , "TWD_ConfigFw: called\n"); 843 844 /* 845 * Configure the WLAN firmware after config all the hardware objects 846 */ 847 if (cmdBld_ConfigFw (pTWD->hCmdBld, (void *)TWD_ConfigFwCb, hTWD) != TI_OK) 848 { 849 return TI_NOK; 850 } 851 852 return TI_OK; 853 } 854 855 void TWD_FinalizeDownload (TI_HANDLE hTWD) 856 { 857 TTwd *pTWD = (TTwd *)hTWD; 858 859 TRACE0(pTWD->hReport, REPORT_SEVERITY_INIT , "TWD_FinalizeDownload: called\n"); 860 861 if ( pTWD == NULL ) 862 { 863 return; 864 } 865 /* Here at the end call the Initialize Complete callback that will release the user Init semaphore */ 866 TRACE0(pTWD->hReport, REPORT_SEVERITY_INIT, "Before sending the Init Complet callback !!!!!\n"); 867 868 /* Sign that init has succeeded */ 869 pTWD->bInitSuccess = TI_TRUE; 870 871 /* Call user application configuration callback */ 872 if (pTWD->fInitFwCb) 873 { 874 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_FinalizeDownload: call fInitFwCb CB. In std drvMain_InitFwCb()\n"); 875 876 (*pTWD->fInitFwCb) (pTWD->hUser, TI_OK); 877 } 878 } 879 880 void TWD_FinalizeOnFailure (TI_HANDLE hTWD) 881 { 882 TTwd *pTWD = (TTwd *)hTWD; 883 884 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_FinalizeOnFailure: called\n"); 885 886 /* Call the upper layer callback for init failure case */ 887 if (pTWD->fInitFailCb) 888 { 889 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_FinalizeOnFailure: call fInitFailCb CB. In std drvMain_InitFailCb()\n"); 890 891 pTWD->fInitFailCb (pTWD->hUser, TI_OK); 892 } 893 } 894 895 TI_STATUS TWD_CheckMailboxCb (TI_HANDLE hTWD, TI_UINT16 uMboxStatus, void *pItrParamBuf) 896 { 897 TTwd *pTWD = (TTwd *)hTWD; 898 899 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_CheckMailboxCb: called\n"); 900 901 if (uMboxStatus != TI_OK) 902 { 903 ++pTWD->uNumMboxFailures; 904 TRACE1(pTWD->hReport, REPORT_SEVERITY_WARNING, "TWD_CheckMailboxCb: Periodic intorregate check - Command mailbox failure was occur \n errors failure # %d", pTWD->uNumMboxFailures); 905 906 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_CheckMailboxCb: call TWD_INT_EVENT_FAILURE CB. In std healthMonitor_sendFailureEvent()\n"); 907 908 /* Indicating Upper Layer about Mbox Error */ 909 pTWD->fFailureEventCb (pTWD->hFailureEventCb, MBOX_FAILURE); 910 } 911 912 return TI_OK; 913 } 914 #ifdef RS_OVER_TWD 915 extern void (*gBusTxn_ErrorCb)(TI_HANDLE , int); 916 extern void *gBusTxn_ErrorHndle; 917 #endif 918 919 /** 920 * \brief Registers TWD Module Callbacks 921 * 922 * \param hTWD - TWD module object handle 923 * \param uCallBackID - Registered Callback ID 924 * \param fCb - Pointer to Input Registered CB function 925 * \param hCb - Handle to Input Registered CB parameters 926 * \return void 927 * 928 * \par Description 929 * Static CB function 930 * This CB Registers TWD CB functions for future use: 931 * CB which handles failure to the CMD Queue, MAC Service and TwIf 932 * CB which handles Command Complete for the CMD Queue 933 * Called by TWD_RegisterCb 934 * 935 * \sa TWD_RegisterCb 936 */ 937 static void TWD_RegisterOwnCb (TI_HANDLE hTWD, TI_UINT32 uCallBackID, void *fCb, TI_HANDLE hCb) 938 { 939 TTwd *pTWD = (TTwd *)hTWD; 940 941 TRACE1(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_RegisterOwnCB: callback ID=0x%x\n", uCallBackID); 942 943 switch (uCallBackID) 944 { 945 case TWD_INT_EVENT_FAILURE: 946 /* Save Health-Moitor callback */ 947 pTWD->fFailureEventCb = (TFailureEventCb)fCb; 948 pTWD->hFailureEventCb = hCb; 949 950 /* Register For Error Of Mailbox in case of timeout */ 951 cmdQueue_RegisterForErrorCb (pTWD->hCmdQueue, (void *)TWD_CheckMailboxCb, hTWD); 952 953 /* Forward the Health-Moitor callback to the MAC-Services modules */ 954 MacServices_registerFailureEventCB(pTWD->hMacServices, fCb, hCb); 955 956 /* Forward the Health-Moitor callback to the TwIf for bus errors */ 957 twIf_RegisterErrCb (pTWD->hTwIf, fCb, hCb); 958 959 /* Forward the Health-Moitor callback to the RxXfer for Rx packet errors */ 960 rxXfer_RegisterErrCb (pTWD->hRxXfer, fCb, hCb); 961 break; 962 963 case TWD_INT_COMMAND_COMPLETE: 964 cmdQueue_RegisterCmdCompleteGenericCb (pTWD->hCmdQueue, fCb, hCb); 965 break; 966 967 default: 968 TRACE0(pTWD->hReport, REPORT_SEVERITY_ERROR, "TWD_RegisterOwnCb - Illegal value\n"); 969 } 970 } 971 972 TI_STATUS TWD_RegisterCb (TI_HANDLE hTWD, TI_UINT32 event, TTwdCB *fCb, void *pData) 973 { 974 TTwd *pTWD = (TTwd *)hTWD; 975 TI_UINT32 uModuleId = event & TWD_CB_MODULE_OWNER_MASK; 976 TI_UINT32 uCallbackId = event & TWD_CB_TYPE_MASK; 977 978 if ((fCb == NULL) || (pData == NULL)) 979 { 980 TRACE0(pTWD->hReport, REPORT_SEVERITY_ERROR, "TWD_Register_CB: Invalid NULL Parameter\n"); 981 982 } 983 984 TRACE1(pTWD->hReport, REPORT_SEVERITY_INFORMATION, "TWD_Register_CB: (Value = 0x%x)\n", event); 985 986 /* First detect which module is the owner */ 987 988 switch (uModuleId) 989 { 990 case TWD_OWNER_TX_HW_QUEUE: 991 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION, "TWD_Register_CB: TWD_OWNER_TX_HW_QUEUE\n"); 992 txHwQueue_RegisterCb (pTWD->hTxHwQueue, uCallbackId, fCb, pData); 993 break; 994 995 case TWD_OWNER_DRIVER_TX_XFER: 996 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION, "TWD_Register_CB: TWD_OWNER_DRIVER_TX_XFER\n"); 997 txXfer_RegisterCb (pTWD->hTxXfer, uCallbackId, fCb, pData); 998 break; 999 1000 case TWD_OWNER_TX_RESULT: 1001 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION, "TWD_Register_CB: TWD_OWNER_TX_RESULT\n"); 1002 txResult_RegisterCb (pTWD->hTxResult, uCallbackId, fCb, pData); 1003 break; 1004 1005 case TWD_OWNER_RX_XFER: 1006 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION, "TWD_Register_CB: TWD_OWNER_RX_XFER\n"); 1007 rxXfer_Register_CB(pTWD->hRxXfer, uCallbackId, fCb, pData); 1008 break; 1009 1010 case TWD_OWNER_RX_QUEUE: 1011 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION, "TWD_Register_CB: TWD_OWNER_RX_QUEUE\n"); 1012 RxQueue_Register_CB(pTWD->hRxQueue, uCallbackId, fCb, pData); 1013 break; 1014 1015 case TWD_OWNER_SELF: 1016 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION, "TWD_Register_CB: TWD_OWNER_SELF\n"); 1017 TWD_RegisterOwnCb (hTWD, uCallbackId, fCb, pData); 1018 break; 1019 1020 case TWD_OWNER_MAC_SERVICES: 1021 switch (uCallbackId) 1022 { 1023 case TWD_OWN_EVENT_SCAN_CMPLT: 1024 MacServices_scanSRV_registerScanCompleteCB (pTWD->hMacServices, (TScanSrvCompleteCb)fCb, pData); 1025 break; 1026 default: 1027 TRACE0(pTWD->hReport, REPORT_SEVERITY_ERROR, "TWD_Register_CB: TWD_OWNER_MAC_SERVICES - Illegal value\n"); 1028 } 1029 break; 1030 1031 case TWD_OWNER_SELF_CONFIG: 1032 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION, "TWD_Register_CB: TWD_OWNER_SELF_CONFIG\n"); 1033 pTWD->fConfigFwCb = (TTwdCallback)fCb; 1034 break; 1035 1036 default: 1037 TRACE0(pTWD->hReport, REPORT_SEVERITY_ERROR, "TWD_Register_CB - Illegal value\n"); 1038 } 1039 1040 return TI_OK; 1041 } 1042 1043 TI_STATUS TWD_ExitFromInitMode (TI_HANDLE hTWD) 1044 { 1045 TTwd *pTWD = (TTwd *)hTWD; 1046 1047 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_ExitFromInitMode: called\n"); 1048 1049 /* Notify Event MailBox about init complete */ 1050 eventMbox_InitComplete (pTWD->hEventMbox); 1051 1052 /* Enable Mailbox */ 1053 cmdQueue_EnableMbox (pTWD->hCmdQueue); 1054 1055 return TI_OK; 1056 } 1057 1058 1059 #ifdef TI_DBG 1060 TI_STATUS TWD_PrintTxInfo (TI_HANDLE hTWD, ETwdPrintInfoType ePrintInfo) 1061 { 1062 TTwd *pTWD = (TTwd *)hTWD; 1063 1064 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_PrintTxInfo: called\n"); 1065 1066 switch (ePrintInfo) 1067 { 1068 case TWD_PRINT_TX_CTRL_BLK_TBL: 1069 txCtrlBlk_PrintTable (pTWD->hTxCtrlBlk); 1070 break; 1071 1072 case TWD_PRINT_TX_HW_QUEUE_INFO: 1073 txHwQueue_PrintInfo (pTWD->hTxHwQueue); 1074 break; 1075 1076 case TWD_PRINT_TX_XFER_INFO: 1077 txXfer_PrintStats (pTWD->hTxXfer); 1078 break; 1079 1080 case TWD_PRINT_TX_RESULT_INFO: 1081 txResult_PrintInfo (pTWD->hTxResult); 1082 break; 1083 1084 case TWD_CLEAR_TX_RESULT_INFO: 1085 txResult_ClearInfo (pTWD->hTxResult); 1086 break; 1087 1088 case TWD_CLEAR_TX_XFER_INFO: 1089 txXfer_ClearStats (pTWD->hTxXfer); 1090 break; 1091 1092 default: 1093 TRACE1(pTWD->hReport, REPORT_SEVERITY_ERROR, ": invalid print info request code: %d\n", ePrintInfo); 1094 } 1095 1096 return TI_OK; 1097 } 1098 1099 #endif /* TI_DBG */ 1100 1101 TI_STATUS TWD_InterruptRequest (TI_HANDLE hTWD) 1102 { 1103 TTwd *pTWD = (TTwd *)hTWD; 1104 1105 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_InterruptRequest: called\n"); 1106 1107 fwEvent_InterruptRequest (pTWD->hFwEvent); 1108 1109 return TI_OK; 1110 } 1111 1112 TI_STATUS TWD_RegisterEvent (TI_HANDLE hTWD, TI_UINT32 event, void *fCb, TI_HANDLE hCb) 1113 { 1114 TTwd *pTWD = (TTwd *)hTWD; 1115 1116 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_RegisterEvent: called\n"); 1117 1118 return eventMbox_RegisterEvent (pTWD->hEventMbox, event, fCb, hCb); 1119 } 1120 1121 TI_STATUS TWD_DisableEvent (TI_HANDLE hTWD, TI_UINT32 event) 1122 { 1123 TTwd *pTWD = (TTwd *)hTWD; 1124 1125 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_DisableEvent: called\n"); 1126 1127 return eventMbox_MaskEvent (pTWD->hEventMbox, event, NULL, NULL); 1128 } 1129 1130 TI_STATUS TWD_EnableEvent (TI_HANDLE hTWD, TI_UINT32 event) 1131 { 1132 TTwd *pTWD = (TTwd *)hTWD; 1133 1134 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_EnableEvent: called\n"); 1135 1136 return eventMbox_UnMaskEvent (pTWD->hEventMbox, event, NULL, NULL); 1137 } 1138 1139 void TWD_StopComplete (TI_HANDLE hTWD) 1140 { 1141 TTwd *pTWD = (TTwd *)hTWD; 1142 1143 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_StopComplete: called\n"); 1144 1145 1146 /* reinit last ELP mode flag in recovery */ 1147 cmdBld_Restart(pTWD->hCmdBld); 1148 1149 /* Call upper layer callback */ 1150 if (pTWD->fStopCb) 1151 { 1152 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_StopComplete: call fStopCb CB. In std drvMain_TwdStopCb()\n"); 1153 1154 (*pTWD->fStopCb) (pTWD->hUser, TI_OK); 1155 } 1156 } 1157 1158 TI_STATUS TWD_Stop (TI_HANDLE hTWD) 1159 { 1160 TTwd *pTWD = (TTwd *)hTWD; 1161 ETxnStatus status; 1162 1163 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_Stop: called\n"); 1164 1165 fwEvent_Stop (pTWD->hFwEvent); 1166 1167 1168 /* close all BA sessions */ 1169 TWD_CloseAllBaSessions(hTWD); 1170 1171 cmdMbox_Restart (pTWD->hCmdMbox); 1172 cmdQueue_Restart (pTWD->hCmdQueue); 1173 cmdQueue_DisableMbox (pTWD->hCmdQueue); 1174 eventMbox_Stop (pTWD->hEventMbox); 1175 MacServices_restart (pTWD->hMacServices); 1176 1177 status = twIf_Restart(pTWD->hTwIf); 1178 1179 /* Call user stop callback */ 1180 if (status != TXN_STATUS_PENDING) 1181 { 1182 TWD_StopComplete (hTWD); 1183 } 1184 1185 return TI_OK; 1186 } 1187 1188 void TWD_EnableExternalEvents (TI_HANDLE hTWD) 1189 { 1190 TTwd *pTWD = (TTwd *)hTWD; 1191 1192 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_EnableExternalEvents: called\n"); 1193 1194 /* 1195 * Enable sleep after all firmware initializations completed 1196 * The awake was in the TWD_initHw phase 1197 */ 1198 twIf_Sleep (pTWD->hTwIf); 1199 1200 fwEvent_EnableExternalEvents (pTWD->hFwEvent); 1201 } 1202 1203 TI_BOOL TWD_RecoveryEnabled (TI_HANDLE hTWD) 1204 { 1205 TTwd *pTWD = (TTwd *)hTWD; 1206 1207 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_RecoveryEnabled: called\n"); 1208 1209 return pTWD->bRecoveryEnabled; 1210 } 1211 1212 TI_UINT32 TWD_GetMaxNumberOfCommandsInQueue (TI_HANDLE hTWD) 1213 { 1214 TTwd *pTWD = (TTwd *)hTWD; 1215 1216 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_GetMaxNumberOfCommandsInQueue: called\n"); 1217 1218 return cmdQueue_GetMaxNumberOfCommands (pTWD->hCmdQueue); 1219 } 1220 1221 TI_STATUS TWD_SetPsMode (TI_HANDLE hTWD, 1222 E80211PsMode ePsMode, 1223 TI_BOOL bSendNullDataOnExit, 1224 TI_HANDLE hPowerSaveCompleteCb, 1225 TPowerSaveCompleteCb fPowerSaveCompleteCb, 1226 TPowerSaveResponseCb fPowerSaveResponseCb) 1227 { 1228 TTwd *pTWD = (TTwd *)hTWD; 1229 1230 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_SetPsMode: called\n"); 1231 1232 return MacServices_powerSrv_SetPsMode (pTWD->hMacServices, 1233 ePsMode, 1234 bSendNullDataOnExit, 1235 hPowerSaveCompleteCb, 1236 fPowerSaveCompleteCb, 1237 fPowerSaveResponseCb); 1238 } 1239 1240 TI_BOOL TWD_GetPsStatus (TI_HANDLE hTWD) 1241 { 1242 TTwd *pTWD = (TTwd *)hTWD; 1243 1244 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_GetPsStatus: called\n"); 1245 1246 return MacServices_powerSrv_getPsStatus (pTWD->hMacServices); 1247 } 1248 1249 TI_STATUS TWD_SetNullRateModulation (TI_HANDLE hTWD, TI_UINT16 rate) 1250 { 1251 TTwd *pTWD = (TTwd *)hTWD; 1252 1253 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_SetRateModulation: called\n"); 1254 1255 MacServices_powerSrv_SetRateModulation (pTWD->hMacServices, rate); 1256 1257 return TI_OK; 1258 } 1259 1260 void TWD_UpdateDtimTbtt (TI_HANDLE hTWD, TI_UINT8 uDtimPeriod, TI_UINT16 uBeaconInterval) 1261 { 1262 TTwd *pTWD = (TTwd *)hTWD; 1263 1264 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_UpdateDtimTbtt: called\n"); 1265 1266 MacServices_scanSrv_UpdateDtimTbtt (pTWD->hMacServices, uDtimPeriod, uBeaconInterval); 1267 } 1268 1269 TI_STATUS TWD_StartMeasurement (TI_HANDLE hTWD, 1270 TMeasurementRequest *pMsrRequest, 1271 TI_UINT32 uTimeToRequestExpiryMs, 1272 TCmdResponseCb fResponseCb, 1273 TI_HANDLE hResponseCb, 1274 TMeasurementSrvCompleteCb fCompleteCb, 1275 TI_HANDLE hCompleteCb) 1276 { 1277 TTwd *pTWD = (TTwd *)hTWD; 1278 1279 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_StartMeasurement: called\n"); 1280 1281 return MacServices_measurementSRV_startMeasurement (pTWD->hMacServices, 1282 pMsrRequest, 1283 uTimeToRequestExpiryMs, 1284 fResponseCb, 1285 hResponseCb, 1286 fCompleteCb, 1287 hCompleteCb); 1288 } 1289 1290 TI_STATUS TWD_StopMeasurement (TI_HANDLE hTWD, 1291 TI_BOOL bSendNullData, 1292 TCmdResponseCb fResponseCb, 1293 TI_HANDLE hResponseCb) 1294 { 1295 TTwd *pTWD = (TTwd *)hTWD; 1296 1297 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_StopMeasurement: called\n"); 1298 1299 return MacServices_measurementSRV_stopMeasurement (pTWD->hMacServices, 1300 bSendNullData, 1301 fResponseCb, 1302 hResponseCb); 1303 } 1304 1305 TI_STATUS TWD_RegisterScanCompleteCb (TI_HANDLE hTWD, 1306 TScanSrvCompleteCb fScanCompleteCb, 1307 TI_HANDLE hScanCompleteCb) 1308 { 1309 TTwd *pTWD = (TTwd *)hTWD; 1310 1311 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_RegisterScanCompleteCb: called\n"); 1312 1313 MacServices_scanSRV_registerScanCompleteCB (pTWD->hMacServices, 1314 fScanCompleteCb, 1315 hScanCompleteCb); 1316 1317 return TI_OK; 1318 } 1319 1320 #ifdef TI_DBG 1321 TI_STATUS TWD_PrintMacServDebugStatus (TI_HANDLE hTWD) 1322 { 1323 TTwd *pTWD = (TTwd *)hTWD; 1324 1325 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_PrintMacServDebugStatus: called\n"); 1326 1327 MacServices_scanSrv_printDebugStatus (pTWD->hMacServices); 1328 1329 return TI_OK; 1330 } 1331 #endif 1332 1333 TI_STATUS TWD_Scan (TI_HANDLE hTWD, 1334 TScanParams *pScanParams, 1335 EScanResultTag eScanTag, 1336 TI_BOOL bHighPriority, 1337 TI_BOOL bDriverMode, 1338 TI_BOOL bScanOnDriverModeError, 1339 E80211PsMode ePsRequest, 1340 TI_BOOL bSendNullData, 1341 TCmdResponseCb fResponseCb, 1342 TI_HANDLE hResponseCb) 1343 { 1344 TTwd *pTWD = (TTwd *)hTWD; 1345 1346 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_Scan: called\n"); 1347 1348 return MacServices_scanSRV_scan (pTWD->hMacServices, 1349 pScanParams, 1350 eScanTag, 1351 bHighPriority, 1352 bDriverMode, 1353 bScanOnDriverModeError, 1354 ePsRequest, 1355 bSendNullData, 1356 fResponseCb, 1357 hResponseCb); 1358 } 1359 1360 TI_STATUS TWD_StopScan (TI_HANDLE hTWD, 1361 EScanResultTag eScanTag, 1362 TI_BOOL bSendNullData, 1363 TCmdResponseCb fScanCommandResponseCb, 1364 TI_HANDLE hCb) 1365 { 1366 TTwd *pTWD = (TTwd *)hTWD; 1367 1368 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_StopScan: called\n"); 1369 1370 return MacServices_scanSRV_stopScan (pTWD->hMacServices, 1371 eScanTag, 1372 bSendNullData, 1373 fScanCommandResponseCb, 1374 hCb); 1375 } 1376 1377 TI_STATUS TWD_StopScanOnFWReset (TI_HANDLE hTWD) 1378 { 1379 TTwd *pTWD = (TTwd *)hTWD; 1380 1381 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_StopScanOnFWReset: called\n"); 1382 1383 return MacServices_scanSRV_stopOnFWReset (pTWD->hMacServices); 1384 } 1385 1386 TI_STATUS TWD_StartConnectionScan (TI_HANDLE hTWD, 1387 TPeriodicScanParams *pPeriodicScanParams, 1388 EScanResultTag eScanTag, 1389 TI_UINT32 uPassiveScanDfsDwellTimeMs, 1390 TCmdResponseCb fResponseCb, 1391 TI_HANDLE hResponseCb) 1392 { 1393 TTwd *pTWD = (TTwd *)hTWD; 1394 1395 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_StartConnectionScan: called\n"); 1396 1397 return cmdBld_StartPeriodicScan (pTWD->hCmdBld, pPeriodicScanParams, eScanTag, uPassiveScanDfsDwellTimeMs, 1398 (void*)fResponseCb, hResponseCb); 1399 } 1400 1401 TI_STATUS TWD_StopPeriodicScan (TI_HANDLE hTWD, 1402 EScanResultTag eScanTag, 1403 TCmdResponseCb fResponseCb, 1404 TI_HANDLE hResponseCb) 1405 { 1406 TTwd *pTWD = (TTwd *)hTWD; 1407 1408 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_StopPeriodicScan: called\n"); 1409 1410 return cmdBld_StopPeriodicScan (pTWD->hCmdBld, eScanTag, (void*)fResponseCb, hResponseCb); 1411 } 1412 1413 TI_STATUS TWD_readMem (TI_HANDLE hTWD, TFwDebugParams* pMemDebug, void* fCb, TI_HANDLE hCb) 1414 { 1415 if (hTWD == NULL || pMemDebug == NULL) 1416 { 1417 return (TI_NOK); 1418 } 1419 1420 TRACE0(((TTwd *)hTWD)->hReport, REPORT_SEVERITY_INFORMATION , "TWD_readMem: called\n"); 1421 1422 if (fwDbg_ReadAddr(((TTwd *)hTWD)->hFwDbg,pMemDebug->addr,pMemDebug->length,pMemDebug->UBuf.buf8,(TFwDubCallback)fCb,hCb) == TI_NOK) 1423 { 1424 TRACE0(((TTwd *)hTWD)->hReport, REPORT_SEVERITY_CONSOLE ,"TWD_readMem Error: fwDbg_handleCommand failed\n"); 1425 WLAN_OS_REPORT(("TWD_readMem Error: fwDbg_handleCommand failed\n")); 1426 return TI_NOK; 1427 } 1428 1429 return (TI_OK); 1430 } 1431 1432 TI_STATUS TWD_writeMem (TI_HANDLE hTWD, TFwDebugParams* pMemDebug, void* fCb, TI_HANDLE hCb) 1433 { 1434 if (hTWD == NULL || pMemDebug == NULL) 1435 { 1436 return (TI_NOK); 1437 } 1438 1439 TRACE0(((TTwd *)hTWD)->hReport, REPORT_SEVERITY_INFORMATION , "TWD_writeMem: called\n"); 1440 1441 if (fwDbg_WriteAddr(((TTwd *)hTWD)->hFwDbg,pMemDebug->addr,pMemDebug->length,pMemDebug->UBuf.buf8,(TFwDubCallback)fCb,hCb) == TI_NOK) 1442 { 1443 TRACE0(((TTwd *)hTWD)->hReport, REPORT_SEVERITY_CONSOLE ,"TWD_writeMem Error: fwDbg_handleCommand failed\n"); 1444 WLAN_OS_REPORT(("TWD_writeMem Error: fwDbg_handleCommand failed\n")); 1445 return TI_NOK; 1446 } 1447 1448 return(TI_OK); 1449 } 1450 1451 TI_BOOL TWD_isValidMemoryAddr (TI_HANDLE hTWD, TFwDebugParams* pMemDebug) 1452 { 1453 if (hTWD == NULL || pMemDebug == NULL) 1454 { 1455 return TI_FALSE; 1456 } 1457 1458 TRACE0(((TTwd *)hTWD)->hReport, REPORT_SEVERITY_INFORMATION , "TWD_isValidMemoryAddr: called\n"); 1459 1460 return fwDbg_isValidMemoryAddr(((TTwd *)hTWD)->hFwDbg,pMemDebug->addr,pMemDebug->length); 1461 } 1462 1463 TI_BOOL TWD_isValidRegAddr (TI_HANDLE hTWD, TFwDebugParams* pMemDebug) 1464 { 1465 if (hTWD == NULL || pMemDebug == NULL ) 1466 { 1467 return TI_FALSE; 1468 } 1469 1470 TRACE0(((TTwd *)hTWD)->hReport, REPORT_SEVERITY_INFORMATION , "TWD_isValidRegAddr: called\n"); 1471 1472 return fwDbg_isValidRegAddr(((TTwd *)hTWD)->hFwDbg,pMemDebug->addr,pMemDebug->length); 1473 } 1474 1475 /** 1476 * \brief Set Template Frame 1477 * 1478 * \param hTWD - TWD module object handle 1479 * \param pMib - Pointer to Input MIB Structure 1480 * \return TI_OK on success or TI_NOK on failure 1481 * 1482 * \par Description 1483 * Static function 1484 * Configure/Interrogate/Modulate the Frame Rate if needed (according to Templete Type) 1485 * and then write the MIB TemplateFrame to the FW 1486 * 1487 * \sa 1488 */ 1489 static TI_STATUS TWD_WriteMibTemplateFrame (TI_HANDLE hTWD, TMib* pMib) 1490 { 1491 TTwd *pTWD = (TTwd *)hTWD; 1492 TSetTemplate tSetTemplate; 1493 TI_UINT32 uRateMask = RATE_TO_MASK(pMib->aData.TemplateFrame.Rate); 1494 1495 /* 1496 * Construct the template MIB element 1497 */ 1498 switch(pMib->aData.TemplateFrame.FrameType) 1499 { 1500 case TEMPLATE_TYPE_BEACON: 1501 tSetTemplate.type = BEACON_TEMPLATE; 1502 break; 1503 1504 case TEMPLATE_TYPE_PROBE_REQUEST: 1505 tSetTemplate.type = PROBE_REQUEST_TEMPLATE; 1506 tSetTemplate.eBand = RADIO_BAND_2_4_GHZ; /* needed for GWSI, if so band must also be passed to choose correct template (G or A) */ 1507 break; 1508 1509 case TEMPLATE_TYPE_NULL_FRAME: 1510 tSetTemplate.type = NULL_DATA_TEMPLATE; 1511 MacServices_powerSrv_SetRateModulation (pTWD->hMacServices, (TI_UINT16)uRateMask); 1512 break; 1513 1514 case TEMPLATE_TYPE_PROBE_RESPONSE: 1515 tSetTemplate.type = PROBE_RESPONSE_TEMPLATE; 1516 break; 1517 1518 case TEMPLATE_TYPE_QOS_NULL_FRAME: 1519 tSetTemplate.type = QOS_NULL_DATA_TEMPLATE; 1520 break; 1521 1522 case TEMPLATE_TYPE_PS_POLL: 1523 tSetTemplate.type = PS_POLL_TEMPLATE; 1524 break; 1525 1526 default: 1527 TRACE1(pTWD->hReport, REPORT_SEVERITY_ERROR, "TWD_WriteMibTemplateFrame - ERROR - template is not supported, %d\n", pMib->aData.TemplateFrame.FrameType); 1528 return PARAM_NOT_SUPPORTED; 1529 } 1530 1531 tSetTemplate.len = pMib->aData.TemplateFrame.Length; 1532 tSetTemplate.ptr = (TI_UINT8 *) &(pMib->aData.TemplateFrame.Data); 1533 tSetTemplate.uRateMask = uRateMask; 1534 1535 return TWD_CmdTemplate (hTWD, &tSetTemplate, NULL, NULL); 1536 } 1537 1538 /** 1539 * \brief Set Beacon Filter IE Table 1540 * 1541 * \param hTWD - TWD module object handle 1542 * \param pMib - Pointer to Input MIB Structure 1543 * \return TI_OK on success or TI_NOK on failure 1544 * 1545 * \par Description 1546 * Static function 1547 * Configure the MIB Beacon Filter IE table 1548 * 1549 * \sa 1550 */ 1551 static TI_STATUS TWD_WriteMibBeaconFilterIETable (TI_HANDLE hTWD, TMib *pMib) 1552 { 1553 TTwd *pTWD = (TTwd *)hTWD; 1554 TI_UINT8 numOf221IE = 0; 1555 TI_UINT8 i = 0; 1556 TI_UINT8 IETableLen = 0; 1557 TI_UINT8 numOfIEs = 0; 1558 TI_UINT8 *IETable = NULL; 1559 1560 numOfIEs = pMib->aData.BeaconFilter.iNumberOfIEs; 1561 IETable = pMib->aData.BeaconFilter.iIETable; 1562 /* Find the actual IETableLen */ 1563 for (i = 0; i < numOfIEs; i++) 1564 { 1565 if (IETable[IETableLen] == 0xdd) 1566 { 1567 IETableLen += 8; 1568 numOf221IE++; 1569 } 1570 else 1571 { 1572 IETableLen += 2; 1573 } 1574 } 1575 1576 TRACE4(pTWD->hReport, REPORT_SEVERITY_INFORMATION, "TWD_WriteMibBeaconFilterIETable: IETable=0x%x Num Of IE=%d ( including %d 221 ) - Table Len=%d\n", IETable, numOfIEs, numOf221IE, IETableLen); 1577 1578 return TWD_CfgBeaconFilterTable (hTWD, numOfIEs, IETable, IETableLen); 1579 } 1580 1581 /** 1582 * \brief Set Tx Rate Policy 1583 * 1584 * \param hTWD - TWD module object handle 1585 * \param pMib - Pointer to Input MIB Structure 1586 * \return TI_OK on success or TI_NOK on failure 1587 * 1588 * \par Description 1589 * Static function 1590 * Coordinates between legacy TxRatePolicy implementation and the MIB format: 1591 * Converts the pGwsi_txRatePolicy back to command builder commands. 1592 * Activates the TWD_set function. 1593 * 1594 * \sa 1595 */ 1596 static TI_STATUS TWD_WriteMibTxRatePolicy (TI_HANDLE hTWD, TMib* pMib) 1597 { 1598 TTwd *pTWD = (TTwd *)hTWD; 1599 1600 #ifdef TI_DBG 1601 if (NULL == pMib) 1602 { 1603 TRACE0(pTWD->hReport, REPORT_SEVERITY_ERROR, "ERROR: TWD_WriteMibTxRatePolicy pMib=NULL !!!"); 1604 return TI_NOK; 1605 } 1606 #endif /* TI_DBG */ 1607 1608 return cmdBld_CfgTxRatePolicy (pTWD->hCmdBld, &pMib->aData.txRatePolicy, NULL, NULL); 1609 } 1610 1611 TI_STATUS TWD_WriteMib (TI_HANDLE hTWD, TMib *pMib) 1612 { 1613 TTwd *pTWD = (TTwd *)hTWD; 1614 1615 #ifdef TI_DBG 1616 TRACE1(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_WriteMib :pMib %p:\n",pMib); 1617 1618 TRACE1(pTWD->hReport, REPORT_SEVERITY_INFORMATION, "TWD_WriteMib :aMib %x:\n",pMib->aMib); 1619 1620 TRACE_INFO_HEX(pTWD->hReport, (TI_UINT8*)pMib, TI_MIN (sizeof(TMib), pMib->Length)); 1621 #endif /* TI_DBG */ 1622 1623 if (NULL == pMib) 1624 { 1625 TRACE0(pTWD->hReport, REPORT_SEVERITY_ERROR, "TWD_WriteMib :pMib = NULL !!\n"); 1626 return PARAM_VALUE_NOT_VALID; 1627 } 1628 1629 switch (pMib->aMib) 1630 { 1631 case MIB_dot11MaxReceiveLifetime: 1632 return cmdBld_CfgRxMsduLifeTime (pTWD->hCmdBld, pMib->aData.MaxReceiveLifeTime * 1024, (void *)NULL, (void *)NULL); 1633 1634 case MIB_ctsToSelf: 1635 return cmdBld_CfgCtsProtection (pTWD->hCmdBld, (TI_UINT8)pMib->aData.CTSToSelfEnable, (void *)NULL, (TI_HANDLE)NULL); 1636 1637 case MIB_dot11GroupAddressesTable: 1638 { 1639 if (NULL == pMib->aData.GroupAddressTable.aGroupTable) 1640 { 1641 TRACE0(pTWD->hReport, REPORT_SEVERITY_ERROR, "TWD_WriteMib(MIB_dot11GroupAddressesTable) :GroupTable = NULL !!\n"); 1642 return PARAM_VALUE_NOT_VALID; 1643 } 1644 1645 return TWD_CfgGroupAddressTable (hTWD, 1646 pMib->aData.GroupAddressTable.nNumberOfAddresses, 1647 pMib->aData.GroupAddressTable.aGroupTable, 1648 pMib->aData.GroupAddressTable.bFilteringEnable); 1649 } 1650 1651 case MIB_arpIpAddressesTable: 1652 { 1653 TIpAddr IpAddress; 1654 1655 IP_COPY (IpAddress, pMib->aData.ArpIpAddressesTable.addr); 1656 1657 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION, "TWD_WriteMib(MIB_arpIpAddressesTable) IpAddress:\n"); 1658 TRACE_INFO_HEX(pTWD->hReport, (TI_UINT8*)&IpAddress, 4); 1659 1660 return cmdBld_CfgArpIpAddrTable (pTWD->hCmdBld, 1661 IpAddress, 1662 (TI_BOOL)pMib->aData.ArpIpAddressesTable.FilteringEnable, 1663 IP_VER_4, 1664 NULL, 1665 NULL); 1666 } 1667 1668 case MIB_templateFrame: 1669 return TWD_WriteMibTemplateFrame (hTWD, pMib); 1670 1671 case MIB_beaconFilterIETable: 1672 return TWD_WriteMibBeaconFilterIETable (hTWD, pMib); 1673 1674 case MIB_rxFilter: 1675 { 1676 TI_UINT32 uRxFilter = 0; 1677 TI_UINT8 uMibRxFilter = pMib->aData.RxFilter; 1678 1679 if (uMibRxFilter & MIB_RX_FILTER_PROMISCOUS_SET) 1680 { 1681 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION, "\n TWD_WriteMib MIB_rxFilter - RX_CFG_ENABLE_ANY_DEST_MAC\n"); 1682 uRxFilter = RX_CFG_ENABLE_ANY_DEST_MAC; 1683 } 1684 else 1685 { 1686 uRxFilter = RX_CFG_ENABLE_ONLY_MY_DEST_MAC; 1687 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION, "\n halCtrl_WriteMib MIB_rxFilter - RX_CFG_ENABLE_ONLY_MY_DEST_MAC\n"); 1688 } 1689 1690 if ((uMibRxFilter & MIB_RX_FILTER_BSSID_SET) != 0) 1691 { 1692 uRxFilter = uRxFilter | RX_CFG_ENABLE_ONLY_MY_BSSID; 1693 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION, "\n halCtrl_WriteMib MIB_rxFilter - RX_CFG_ENABLE_ONLY_MY_BSSID\n"); 1694 } 1695 else 1696 { 1697 uRxFilter = uRxFilter | RX_CFG_ENABLE_ANY_BSSID; 1698 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION, "\n halCtrl_WriteMib MIB_rxFilter - RX_CFG_ENABLE_ANY_BSSID\n"); 1699 } 1700 1701 /* 1702 * Activates the TWD_setRxFilters function 1703 */ 1704 return TWD_CfgRx (hTWD, uRxFilter, RX_FILTER_OPTION_DEF); 1705 } 1706 1707 case MIB_txRatePolicy: 1708 return TWD_WriteMibTxRatePolicy (hTWD, pMib); 1709 1710 default: 1711 TRACE1(pTWD->hReport, REPORT_SEVERITY_ERROR, "TWD_WriteMib - ERROR - MIB element not supported, %d\n", pMib->aMib); 1712 1713 return TI_NOK; 1714 1715 } /* switch */ 1716 } 1717 1718 TI_STATUS TWD_ReadMib (TI_HANDLE hTWD, TI_HANDLE hCb, void* fCb, void* pCb) 1719 { 1720 TTwd *pTWD = (TTwd *)hTWD; 1721 1722 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_ReadMib: called\n"); 1723 1724 return cmdBld_ReadMib (pTWD->hCmdBld, hCb, fCb, pCb); 1725 } 1726 1727 void TWD_DisableInterrupts(TI_HANDLE hTWD) 1728 { 1729 TTwd *pTWD = (TTwd *)hTWD; 1730 1731 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_DisableInterrupts: called\n"); 1732 1733 fwEvent_DisableInterrupts(pTWD->hFwEvent); 1734 } 1735 1736 void TWD_EnableInterrupts(TI_HANDLE hTWD) 1737 { 1738 TTwd *pTWD = (TTwd *)hTWD; 1739 1740 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_EnableInterrupts: called\n"); 1741 1742 fwEvent_EnableInterrupts(pTWD->hFwEvent); 1743 } 1744 1745 TI_UINT32 TWD_TranslateToFwTime (TI_HANDLE hTWD, TI_UINT32 uHostTime) 1746 { 1747 TTwd *pTWD = (TTwd *)hTWD; 1748 1749 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_TranslateToFwTime: called\n"); 1750 1751 return fwEvent_TranslateToFwTime (pTWD->hFwEvent, uHostTime); 1752 } 1753 1754 void TWD_GetTwdHtCapabilities (TI_HANDLE hTWD, TTwdHtCapabilities **pTwdHtCapabilities) 1755 { 1756 TTwd *pTWD = (TTwd *)hTWD; 1757 TWlanParams *pWlanParams = &DB_WLAN(pTWD->hCmdBld); 1758 1759 TRACE0(pTWD->hReport, REPORT_SEVERITY_INFORMATION , "TWD_GetTwdHtCapabilities: called\n"); 1760 1761 *pTwdHtCapabilities = &(pWlanParams->tTwdHtCapabilities); 1762 } 1763 1764 /** 1765 * \brief TWD get FEM type 1766 * * 1767 * \param Handle - handle to object 1768 * \return uint8 1769 * 1770 * \par Description 1771 * The function return the Front end module that was read frm FW register * 1772 * \sa 1773 */ 1774 TI_UINT8 TWD_GetFEMType (TI_HANDLE hTWD) 1775 { 1776 TTwd *pTWD = (TTwd *)hTWD; 1777 IniFileGeneralParam *pGenParams = &DB_GEN(pTWD->hCmdBld); 1778 1779 return pGenParams->TXBiPFEMManufacturer; 1780 1781 } 1782 1783 /** 1784 * \brief TWD end function of read radio state machine 1785 * * * 1786 * \param Handle - handle to object 1787 * \return void 1788 * 1789 * \par Description 1790 * The function calling to HwInit call back function, after finish reading FEM registers * 1791 * \sa 1792 */ 1793 void TWD_FinalizeFEMRead(TI_HANDLE hTWD) 1794 { 1795 TTwd *pTWD = (TTwd *)hTWD; 1796 1797 (*pTWD->fInitHwCb) (pTWD->hUser, TI_OK); 1798 } 1799 1800 1801 1802 1803 void TWD_FinalizePolarityRead(TI_HANDLE hTWD) 1804 { 1805 TTwd *pTWD = (TTwd *)hTWD; 1806 /* allways read FEM type from Radio Registers */ 1807 hwInit_ReadRadioParams(pTWD->hHwInit); 1808 } 1809