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: whalRecovery.c 39 * PURPOSE: Handle Recovery and ACI in the Hal 40 * 41 * Recovery 42 * CheckHwStatus - called periodically from the CORE to check the following triggers: 43 * Consecutive fcs error 44 * CheckMailbox - call interrogate with callback (only print) 45 * RxFreeMem register image 46 * TxQueue 47 * TxQueue 48 * Mailbox error - call the CORE failure event MBOX_FAILURE 49 * Event mailbox 50 * MacStatus event - receive the register value for CONS_FCS_ERR and Rx_FREE_MEM triggers 51 * Health event - device error callback to CORE 52 * PowerCtrl timeout fail - call the CORE failure event HW_AWAKE_FAILURE 53 * StopHal - called from the CORE as first step in the recovery process 54 * Reconfig - called from the CORE as second step in the recovery process 55 * LNA/ACI 56 * ACI event - get SCR_PAD8 value, accumulate it locally for later read/write by the CORE 57 * Rx reset 58 * API to access the RX_RESET register 59 * 60 * Issues 61 * Add API to 62 * Move the whalCtrl_hwStatus_t from HwCtrl into Recovery object 63 * Remove CheckMailbox in CheckHwStatus 64 * Device error is not enabled 65 * 66 ****************************************************************************/ 67 68 #include "whalCommon.h" 69 #include "whalCtrl_api.h" 70 #include "whalCtrl.h" 71 #include "whalSecurity.h" 72 #include "eventMbox_api.h" 73 #include "CmdQueue_api.h" 74 #include "whalBus_Api.h" 75 #include "shmBus.h" 76 #include "whalHwAccess.h" 77 #include "TNETW_Driver.h" 78 #include "FwEvent_api.h" 79 80 #ifdef USE_RECOVERY 81 82 /* Aci Indication Callback */ 83 /* typedef void (*AciIndicationCB_t)(TI_HANDLE handle, char* str , UINT32 strLen);*/ 84 85 86 void whalCtrl_HealthReoprt_CB(TI_HANDLE hWhalCtrl, char* Report , UINT32 strLen); 87 void whalCtrl_MacStatus_CB(TI_HANDLE hWhalCtrl, char* Status , UINT32 strLen); 88 int whalCtrl_PeriodicCheckMailboxCb(TI_HANDLE hWhalCtrl, UINT16 MboxStatus,char *InterrogateParamsBuf); 89 90 /* 91 * ---------------------------------------------------------------------------- 92 * Function : whalCtrl_RegisterCallbacks 93 * 94 * Input : 95 * Output : 96 * Process : 97 * Register all health/sanityCheck/Recovery callbacks 98 * -------------------------------------------------- 99 * DeviceError - CORE callback for full recovery 100 * HealthReport - Event Mbox callback for extracting device error 101 * MacStatus - Event Mbox callback for checkHwStatus FCS_ERR, RX_FREE_MEM regs 102 * AciIndication - Event Mbox callback for accumulate SCR_PAD8 image 103 * Mailbox error - Mailbox queue callback for case of timeout/error 104 * Power control error - PowerMngr callback in case of power ctrl timeout 105 * Failure event - CORE Callback in case of MailboxError or PowerCtrl error 106 * 107 * Note(s) : Done 108 * ----------------------------------------------------------------------------- 109 */ 110 int whalCtrl_RegisterErrorsCallbacks(TI_HANDLE hWhalCtrl) 111 { 112 WHAL_CTRL *pWhalCtrl = (WHAL_CTRL *)hWhalCtrl; 113 /*FW events : BUS_ERROR and DEVICE_ERROR*/ 114 pWhalCtrl->HealthReportCB_CB = whalCtrl_HealthReoprt_CB; 115 pWhalCtrl->HealthReportCB_handle = pWhalCtrl; 116 117 eventMbox_RegisterEventCB (pWhalCtrl->hEventMbox, HAL_EVENT_HEALTH_REPORT,(void*)pWhalCtrl->HealthReportCB_CB, pWhalCtrl); 118 /* The health report event will be enabled in the ConfigHw stage */ 119 120 121 122 /*FW events : FCS_ERROR and HEALTH_TEST_OK*/ 123 pWhalCtrl->MacStatusCB_CB = whalCtrl_MacStatus_CB; 124 pWhalCtrl->MacStatusCB_CB_handle = pWhalCtrl; 125 126 eventMbox_RegisterEventCB(pWhalCtrl->hEventMbox, HAL_EVENT_MAC_STATUS, (void*)pWhalCtrl->MacStatusCB_CB, pWhalCtrl); 127 eventMbox_EvUnMask(pWhalCtrl->hEventMbox, HAL_EVENT_MAC_STATUS); 128 129 130 /* Register For Error Of Mailbox in case of timeout */ 131 CmdQueue_RegisterForErrorCB(((TnetwDrv_t*)pWhalCtrl->hTNETW_Driver)->hCmdQueue, (void *)whalCtrl_CheckMailboxCb, hWhalCtrl); 132 133 #ifdef HW_ACCESS_SDIO 134 TNETWIF_RegisterBusFailureEventCB(((whalBus_T *)(pWhalCtrl->pHwCtrl->hWhalBus))->hTNETWIF, 135 (void *)whalCtrl_HealthReoprt_CB,pWhalCtrl); 136 #endif 137 138 return OK; 139 } 140 141 /* 142 * ---------------------------------------------------------------------------- 143 * Function : whalCtrl_CheckHwStatus 144 * 145 * Input : 146 * Output : 147 * Process : 148 * CheckFcsError 149 * Test the register CONS_FCR_ERR value that came periodically in event 150 * Try to recover by setting RX_RESET 151 * Disable full recovery by StaDk_4.1 team !!!!!!!!!!! 152 * CheckMailbox 153 * Call interrogate (with callback) to StationId IE 154 * The callback is just for print 155 * There is no need for this trigger because of the event mechanizm 156 * CheckRxFreeMem 157 * Test the register RX_FREE_MEM value that came periodically in event 158 * CheckTxQueue 159 * Check the queue is not empty and no tx complete 160 * CheckRxQueue 161 * Disabled 162 * 163 * Note(s) : Done 164 * ----------------------------------------------------------------------------- 165 */ 166 int whalCtrl_CheckHwStatus(TI_HANDLE hWhalCtrl) 167 { 168 WHAL_CTRL *pWhalCtrl = (WHAL_CTRL *)hWhalCtrl; 169 170 #if 0 171 WLAN_REPORT_FATAL_ERROR(pWhalCtrl->hReport, HAL_CTRL_MODULE_LOG, 172 ("whalCtrl_CheckHwStatus: Start test\n")); 173 #endif 174 /* 175 * Trigger the FW health test command and wait for results. 176 * ------------------------------------------------------- 177 */ 178 whal_hwCtrl_healthCheck(pWhalCtrl->pHwCtrl); 179 180 return OK; 181 } 182 183 /* 184 * ---------------------------------------------------------------------------- 185 * Function : whalCtrl_RecoveryEnded 186 * 187 * Input : 188 * Output : 189 * Process : 190 * aanouce all the modules about the end of the recovery proccess. 191 * Note(s) : Done 192 * ----------------------------------------------------------------------------- 193 */ 194 void whalCtrl_RecoveryEnded(TI_HANDLE hWhalCtrl) 195 { 196 WHAL_CTRL *pWhalCtrl = (WHAL_CTRL *)hWhalCtrl; 197 198 /*Change the State of the mboxQueue and the interrupt Module and 199 After recovery we should enable back all interrupts according to the last interrupt shadow mask*/ 200 whalCtrl_exitFromInitMode(hWhalCtrl); 201 202 /* 203 Indicates the MboxQueue that Reconfig Ended in Order To Call the CallBacks 204 That Was saved before the recovery process started 205 */ 206 CmdQueue_EndReconfig(((TnetwDrv_t*)pWhalCtrl->hTNETW_Driver)->hCmdQueue); 207 208 WLAN_REPORT_INFORMATION(pWhalCtrl->hReport, HAL_CTRL_MODULE_LOG, 209 ("whalCtrl_ReConfig: End (%d)\n", os_timeStampMs(pWhalCtrl->hOs))); 210 } 211 212 213 /* 214 * ---------------------------------------------------------------------------- 215 * Function : whalCtrl_ReConfigCb 216 * 217 * Input : 218 * Output : 219 * Process : 220 * Do firmware download 221 * Run the firmware 222 * Configure stage (ConfigHw) 223 * Re-Join if needed 224 * Note(s) : Done 225 * ----------------------------------------------------------------------------- 226 */ 227 static int whalCtrl_ReConfigCb (TI_HANDLE hWhalCtrl, TI_STATUS status) 228 { 229 WHAL_CTRL *pWhalCtrl = (WHAL_CTRL *)hWhalCtrl; 230 WlanParams_T *pWlanParams = whal_ParamsGetWlanParams (pWhalCtrl->pWhalParams); 231 whalParamInfo_t param; 232 233 234 if (status != OK) 235 { 236 WLAN_REPORT_INFORMATION (pWhalCtrl->hReport, HAL_CTRL_MODULE_LOG, 237 ("whalCtrl_ReConfig: whal_hwCtrl_ConfigHw failed\n")); 238 return NOK; 239 } 240 241 whalSecur_HwEncDecrEnable (pWhalCtrl->pWhalSecurity, 1); 242 243 /* Re-config roaming thresholds */ 244 /* SNR */ 245 whal_hwCtrl_SetSNRParams(pWhalCtrl->pHwCtrl, &pWhalCtrl->pWhalParams->WlanParams.roamTriggers); 246 247 /* RSSI */ 248 whalCtrl_SetRSSIParamsCmd (pWhalCtrl, &pWhalCtrl->pWhalParams->WlanParams.roamTriggers); 249 /* Max consecutive NACK */ 250 whalCtrl_SetMaxTxRetryParamsCmd (pWhalCtrl, &pWhalCtrl->pWhalParams->WlanParams.roamTriggers); 251 /* Out of sync */ 252 whalCtrl_SetBssLossTsfThresholdParamsCmd (pWhalCtrl, &pWhalCtrl->pWhalParams->WlanParams.roamTriggers); 253 254 255 #ifdef DO_CALIBRATION_IN_DRIVER 256 /* Perform single calibration for APP scan usage. */ 257 whalCtrl_sendRadioAction (pWhalCtrl, MANUAL_CALIB); 258 #endif /* DO_CALIBRATION_IN_DRIVER */ 259 260 /* Join (use the local parameters), otherwise the core will reconnect */ 261 if (pWlanParams->bJoin) 262 { 263 /* Set TxRatePolicy */ 264 param.paramType = HAL_CTRL_TX_RATE_CLASS_PARAMS; 265 param.content.pTxRatePlicy = &pWhalCtrl->pWhalParams->BssInfoParams.TxRateClassParams; 266 267 whalCtrl_SetParam (pWhalCtrl->pHwCtrl, ¶m); 268 269 status = (TI_STATUS)whalCtrl_ReJoinBss (hWhalCtrl); 270 if (status != OK) 271 { 272 WLAN_REPORT_INFORMATION (pWhalCtrl->hReport, HAL_CTRL_MODULE_LOG, 273 ("whalCtrl_ReConfig: whalCtrl_ReJoinBss failed\n")); 274 return NOK; 275 } 276 whal_hwCtrl_AidSet (pWhalCtrl->pHwCtrl, pWhalCtrl->pWhalParams->WlanParams.Aid); 277 278 /* Slot time must be setting after doing join */ 279 whal_hwCtrl_SetSlotTime (pWhalCtrl->pHwCtrl, (slotTime_e)pWhalCtrl->pWhalParams->WlanParams.SlotTime); 280 281 /* Re-config security keys, default key Id and encryption/decryption control to the FW */ 282 if (whalSecur_KeysReconfig (pWhalCtrl->pWhalSecurity) != OK) 283 { 284 WLAN_REPORT_INFORMATION (pWhalCtrl->hReport, HAL_CTRL_MODULE_LOG, 285 ("whalCtrl_ReConfig: ## whalSecur_KeysReconfig failed\n")); 286 return NOK; 287 } 288 } 289 290 return OK; 291 } 292 293 294 /* 295 * ---------------------------------------------------------------------------- 296 * Function : whalCtrl_ReConfig 297 * 298 * Input : 299 * Output : 300 * Process : 301 * Do firmware download 302 * Run the firmware 303 * Configure stage (ConfigHw) 304 * Re-Join if needed 305 * Note(s) : Done 306 * ----------------------------------------------------------------------------- 307 */ 308 int whalCtrl_ReConfig (TI_HANDLE hWhalCtrl, int DoReJoin) 309 { 310 WHAL_CTRL *pWhalCtrl = (WHAL_CTRL *)hWhalCtrl; 311 WlanParams_T *pWlanParams = whal_ParamsGetWlanParams (pWhalCtrl->pWhalParams); 312 int Stt; 313 314 if (!pWlanParams->RecoveryEnable) 315 { 316 WLAN_OS_REPORT(("Recovery is disabled in registry, abort recovery process\n")); 317 return OK; 318 } 319 320 #if 0 321 /* L.M. PATCH for card eject */ 322 if (!whalBus_FwCtrl_isCardIn (pWhalCtrl->pHwCtrl->hWhalBus)) 323 { 324 WLAN_REPORT_REPLY (pWhalCtrl->hReport, HAL_CTRL_MODULE_LOG, 325 ("whalCtrl_ReConfig: card was removed => not proceeding\n")); 326 return OK; 327 } 328 #endif/*_WINDOWS*/ 329 330 /* 331 * Initiate the wlan hardware (FW download). 332 * ----------------------------------------- 333 */ 334 WLAN_REPORT_INFORMATION (pWhalCtrl->hReport, HAL_CTRL_MODULE_LOG, 335 ("whalCtrl_ReConfig: Start(%d)\n", os_timeStampMs (pWhalCtrl->hOs))); 336 Stt = whal_hwCtrl_Initiate (pWhalCtrl->pHwCtrl); 337 if (Stt != OK) 338 { 339 WLAN_REPORT_ERROR (pWhalCtrl->hReport, HAL_CTRL_MODULE_LOG, 340 ("whalCtrl_ReConfig: whal_hwCtrl_Initiate failed\n")); 341 return NOK; 342 } 343 344 /* Configure the WLAN hardware */ 345 Stt = whal_hwCtrl_ConfigHw (pWhalCtrl->pHwCtrl, (void *)whalCtrl_ReConfigCb, hWhalCtrl, TRUE); 346 347 return OK; 348 } 349 350 351 /* 352 * ---------------------------------------------------------------------------- 353 * Function : whalCtrl_CheckMailboxCb 354 * 355 * Input : 356 * Output : 357 * Process : 358 * When the command mailbox queue identify mailbox error or timeout, it will call 359 * to this function to handle the error. 360 * Call the CORE callback with MBOX_FAILURE type to do the recovery 361 * 362 * Note(s) : Done 363 * ----------------------------------------------------------------------------- 364 */ 365 int whalCtrl_CheckMailboxCb(TI_HANDLE hWhalCtrl,UINT16 MboxStatus, char *InterrogateParamsBuf) 366 { 367 368 WHAL_CTRL *pWhalCtrl = (WHAL_CTRL *)hWhalCtrl; 369 whalCtrl_hwStatus_t *pHwStatus = &pWhalCtrl->pHwCtrl->HwStatus; 370 371 if(MboxStatus != OK) 372 { 373 ++pHwStatus->NumMboxFailures; 374 WLAN_REPORT_WARNING(pWhalCtrl->hReport, HAL_CTRL_MODULE_LOG, 375 ("whalCtrl_PeriodicCheckMailboxCb: Periodic intorregate check - Command mailbox failure was occur \n errors failure # %d " 376 ,pHwStatus->NumMboxFailures)); 377 378 /* Indicating Upper Layer about Mbox Error */ 379 pWhalCtrl->FailureEvent_CB(pWhalCtrl->FailureEvent_CB_handle,MBOX_FAILURE); 380 } 381 382 return OK; 383 } 384 385 /* 386 * ---------------------------------------------------------------------------- 387 * Function : whalCtrl_MacStatus_CB 388 * : Callback from the EventMbox in case Mac status Event Occur 389 * Input : 390 * Output : 391 * Process : 392 * Note(s) : Done 393 * ----------------------------------------------------------------------------- 394 */ 395 void whalCtrl_MacStatus_CB(TI_HANDLE hWhalCtrl, char* Status , UINT32 strLen) 396 { 397 WHAL_CTRL *pWhalCtrl = (WHAL_CTRL *)hWhalCtrl; 398 UINT32 currFcsCounter; 399 400 401 /* The FCS error is updated by the MacStatus event from the firmware */ 402 currFcsCounter = (*(UINT32*)Status); 403 404 WLAN_REPORT_INFORMATION(pWhalCtrl->hReport, HAL_CTRL_MODULE_LOG, 405 ("whalCtrl_MacStatus_CB: Mac Status report currFcsCounter=%d LastConsFcsCounter=%d\n", 406 currFcsCounter)); 407 408 /* This event shouldn't be received, so it is not passed on to anybody */ 409 } 410 411 #define HEALTH_REPORT_DEVICE_ERROR_BIT BIT_0 412 #define HEALTH_REPORT_HOST2FW_SEQ_ERROR BIT_1 413 414 415 /* 416 * ---------------------------------------------------------------------------- 417 * Function : whalCtrl_HealthReoprt_CB 418 * : Callback from the EventMbox in case HealthReport Event Occur 419 * Input : 420 * Output : 421 * Process : 422 * Note(s) : Done 423 * ----------------------------------------------------------------------------- 424 */ 425 426 void whalCtrl_HealthReoprt_CB(TI_HANDLE hWhalCtrl, char* Report , UINT32 strLen) 427 { 428 WHAL_CTRL *pWhalCtrl = (WHAL_CTRL *)hWhalCtrl; 429 UINT16 HealthReport = *((UINT16*)Report); 430 431 if(HealthReport & HEALTH_REPORT_DEVICE_ERROR_BIT) 432 { 433 WLAN_REPORT_ERROR(pWhalCtrl->hReport, HAL_CTRL_MODULE_LOG, 434 ("whalCtrl_HealthReoprt_CB: Firmware reports about DEVICE_ERROR, handle by callback")); 435 /* Indicating Upper Layer about Device Error */ 436 pWhalCtrl->FailureEvent_CB(pWhalCtrl->FailureEvent_CB_handle, DEVICE_ERROR); 437 } 438 else 439 if(HealthReport & HEALTH_REPORT_HOST2FW_SEQ_ERROR) 440 /* For USB Health Check */ 441 { 442 WLAN_REPORT_ERROR(pWhalCtrl->hReport, HAL_CTRL_MODULE_LOG, 443 ("whalCtrl_HealthReoprt_CB: Firmware reports about HOST2FW_SEQ_ERROR")); 444 /* This shall invoke softice, if occure we will handle this case locally*/ 445 /* ASSERT(0);*/ 446 } 447 else 448 if (HealthReport & HEALTH_REPORT_BUS_ERROR) 449 { 450 WLAN_REPORT_ERROR(pWhalCtrl->hReport, HAL_CTRL_MODULE_LOG, 451 ("whalCtrl_HealthReoprt_CB: Low level bus driver reported bus error. Performing hardware reset of the bus\n")); 452 453 pWhalCtrl->FailureEvent_CB(pWhalCtrl->FailureEvent_CB_handle, BUS_ERROR); 454 } 455 else 456 { 457 WLAN_REPORT_ERROR(pWhalCtrl->hReport, HAL_CTRL_MODULE_LOG, 458 ("whalCtrl_HealthReoprt_CB: UnKnown Health report ID 0x%x ", (int)HealthReport)); 459 } 460 } 461 462 /* 463 * ---------------------------------------------------------------------------- 464 * Function : whalCtrl_resetMacRx 465 * 466 * Input : 467 * Output : 468 * Process : Reset the Rx. 469 * Note(s) : Done 470 * ----------------------------------------------------------------------------- 471 */ 472 int whalCtrl_resetMacRx (TI_HANDLE hWhalCtrl) 473 { 474 WHAL_CTRL *pWhalCtrl = (WHAL_CTRL *)hWhalCtrl; 475 476 WLAN_REPORT_ERROR(pWhalCtrl->hReport, HAL_CTRL_MODULE_LOG,("whalCtrl_resetMacRx:\n")); 477 478 return whal_HwCtrl_resetMacRx (pWhalCtrl->pHwCtrl); 479 } 480 481 /* 482 * ---------------------------------------------------------------------------- 483 * Function : whalCtrl_PrintHwStatus 484 * 485 * Input : 486 * Output : 487 * Process : 488 * Print the Recovery status 489 * Note(s) : Done 490 * ----------------------------------------------------------------------------- 491 */ 492 int whalCtrl_PrintHwStatus(TI_HANDLE hWhalCtrl) 493 { 494 #ifdef REPORT_LOG 495 496 WHAL_CTRL *pWhalCtrl = (WHAL_CTRL *)hWhalCtrl; 497 whalCtrl_hwStatus_t *pHwStatus = &pWhalCtrl->pHwCtrl->HwStatus; 498 499 WLAN_OS_REPORT(("--------------- whalCtrl_PrintHwStatus ---------------\n\n")); 500 WLAN_OS_REPORT(("NumMboxErrDueToPeriodicBuiltInTestCheck = %d\n", pHwStatus->NumMboxErrDueToPeriodicBuiltInTestCheck)); 501 WLAN_OS_REPORT(("NumMboxFailures = %d\n", pHwStatus->NumMboxFailures)); 502 503 #endif 504 505 return OK; 506 } 507 508 509 /* 510 * ---------------------------------------------------------------------------- 511 * Function : whalCtrl_ResetBusAfterHardBoot 512 * 513 * Input : 514 * Output : 515 * Process : 516 * Restart the buss access layer after hard boot. 517 * Note(s) : Done 518 * ----------------------------------------------------------------------------- 519 */ 520 void whalCtrl_ResetBusAfterHardBoot(TI_HANDLE hWhalCtrl) 521 { 522 523 #ifdef HW_ACCESS_SDIO 524 WHAL_CTRL *pWhalCtrl = (WHAL_CTRL *)hWhalCtrl; 525 whalBus_ReConfig( pWhalCtrl->hWhalBus ); 526 #endif 527 528 } 529 530 #endif /* USE_RECOVERY */ 531 532 533 /* 534 * ---------------------------------------------------------------------------- 535 * Function : whalCtrl_LNAControl 536 * 537 * Input : LNAControlField, 0=> Turn Off , 1=> Turn On 538 * Output : 539 * Process : 540 * Call the mailbox (need to be called directly without HwCtrl) 541 * Note(s) : Done 542 * ----------------------------------------------------------------------------- 543 */ 544 int whalCtrl_LNAControl (TI_HANDLE hWhalCtrl, UINT8 LNAControlField) 545 { 546 WHAL_CTRL *pWhalCtrl = (WHAL_CTRL *)hWhalCtrl; 547 548 WLAN_REPORT_INFORMATION(pWhalCtrl->hReport, HAL_CTRL_MODULE_LOG,("whalCtrl_LNAControl: Set LAN to %d\n",LNAControlField)); 549 550 return whal_HwCtrl_LNAControl (pWhalCtrl->pHwCtrl, LNAControlField); 551 } 552 553