1 /* 2 * CmdBld.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 CmdBld.c 36 * \brief Command builder main 37 * 38 * \see CmdBld.h 39 */ 40 #define __FILE_ID__ FILE_ID_90 41 #include "TWDriver.h" 42 #include "osApi.h" 43 #include "tidef.h" 44 #include "report.h" 45 #include "public_infoele.h" 46 #include "CmdBld.h" 47 #include "txResult_api.h" 48 #include "CmdBldCmdIE.h" 49 #include "CmdBldCfgIE.h" 50 #include "CmdBldItrIE.h" 51 #include "CmdQueue_api.h" 52 #include "eventMbox_api.h" 53 #include "TWDriverInternal.h" 54 #include "HwInit_api.h" 55 56 #define DEFAULT_TRACE_ENABLE 0 57 #define DEFAULT_TRACE_OUT 0 58 59 #define DEFAULT_PBCC_DYNAMIC_ENABLE_VAL 0 60 #define DEFAULT_PBCC_DYNAMIC_INTERVAL 500 61 #define DEFAULT_PBCC_DYNAMIC_IGNORE_MCAST 0 62 63 #define DEFAULT_HW_RADIO_CHANNEL 11 64 65 #define DEFAULT_CW_MIN 15 66 67 #define DEFAULT_USE_DEVICE_ERROR_INTERRUPT 1 68 69 #define DEFAULT_UCAST_PRIORITY 0 70 71 #define DEFAULT_NUM_STATIONS 1 72 73 /* only for AP */ 74 /* 8 increase number of BC frames */ 75 #define DEFAULT_NUM_BCAST_TX_DESC 16 76 77 #define DEFAULT_BCAST_PRIORITY 0x81 78 79 /* hw access method*/ 80 typedef enum 81 { 82 HW_ACCESS_BUS_SLAVE_INDIRECT = 0, 83 HW_ACCESS_BUS_SLAVE_DIRECT = 1, 84 HW_ACCESS_BUS_MASTER = 2 85 86 } EHwAccessMethod; 87 88 typedef int (*TConfigFwCb) (TI_HANDLE, TI_STATUS); 89 90 91 static TI_STATUS cmdBld_ConfigSeq (TI_HANDLE hCmdBld); 92 static TI_STATUS cmdBld_GetCurrentAssociationId (TI_HANDLE hCmdBld, TI_UINT16 *pAidVal); 93 static TI_STATUS cmdBld_GetArpIpAddressesTable (TI_HANDLE hCmdBld, TIpAddr *pIpAddr, TI_UINT8 *pEnabled , EIpVer *pIpVer); 94 static TI_STATUS cmdBld_JoinCmpltForReconfigCb (TI_HANDLE hCmdBld); 95 static TI_STATUS cmdBld_DummyCb (TI_HANDLE hCmdBld); 96 97 98 99 100 TI_HANDLE cmdBld_Create (TI_HANDLE hOs) 101 { 102 TCmdBld *pCmdBld; 103 TI_UINT32 uNumOfStations; 104 TI_UINT32 i; 105 106 /* Allocate the command builder */ 107 pCmdBld = (TCmdBld *)os_memoryAlloc (hOs, sizeof(TCmdBld)); 108 if (pCmdBld == NULL) 109 { 110 WLAN_OS_REPORT(("cmdBld_Create: Error memory allocation\n")); 111 return NULL; 112 } 113 os_memoryZero (hOs, (void *)pCmdBld, sizeof(TCmdBld)); 114 115 pCmdBld->hOs = hOs; 116 117 /* Create the Params object */ 118 /* make this code flat, move it to configure */ 119 { 120 TWlanParams *pWlanParams = &DB_WLAN(pCmdBld); 121 TDmaParams *pDmaParams = &DB_DMA(pCmdBld); 122 TBssInfoParams *pBssInfoParams = &DB_BSS(pCmdBld); 123 TGenCounters *pGenCounters = &DB_CNT(pCmdBld); 124 125 /* General counters */ 126 pGenCounters->FcsErrCnt = 0; 127 128 /* BSS info paramaters */ 129 pBssInfoParams->RadioChannel = DEFAULT_HW_RADIO_CHANNEL; 130 pBssInfoParams->Ctrl = 0; 131 /* 132 * Intilaize the ctrl field in the BSS join structure 133 * Only bit_7 in the ctrl field is vurrently in use. 134 * If bit_7 is on => Doing Tx flash before joining new AP 135 */ 136 pBssInfoParams->Ctrl |= JOIN_CMD_CTRL_TX_FLUSH; 137 138 /* WLAN parameters*/ 139 140 /* Init filters as station (start/join with BssType will overwrite the values) */ 141 cmdBld_SetRxFilter ((TI_HANDLE)pCmdBld, RX_CONFIG_OPTION_MY_DST_MY_BSS, RX_FILTER_OPTION_FILTER_ALL); 142 pWlanParams->UseDeviceErrorInterrupt = DEFAULT_USE_DEVICE_ERROR_INTERRUPT; 143 /* Initialize the params object database fields */ 144 pWlanParams->hwAccessMethod = HW_ACCESS_BUS_SLAVE_INDIRECT; 145 pWlanParams->maxSitesFragCollect = TWD_SITE_FRAG_COLLECT_DEF; 146 pWlanParams->RtsThreshold = TWD_RTS_THRESHOLD_DEF; 147 pWlanParams->bJoin = TI_FALSE; 148 /* Soft Gemini defaults */ 149 pWlanParams->SoftGeminiEnable = SG_DISABLE; 150 /* Beacon filter defaults */ 151 pWlanParams->beaconFilterParams.desiredState = TI_FALSE; 152 pWlanParams->beaconFilterParams.numOfElements = DEF_NUM_STORED_FILTERS; 153 pWlanParams->beaconFilterIETable.numberOfIEs = DEF_BEACON_FILTER_IE_TABLE_NUM; 154 pWlanParams->beaconFilterIETable.IETableSize = BEACON_FILTER_IE_TABLE_DEF_SIZE; 155 /* Roaming parameters */ 156 pWlanParams->roamTriggers.BssLossTimeout = NO_BEACON_DEFAULT_TIMEOUT; 157 pWlanParams->roamTriggers.TsfMissThreshold = OUT_OF_SYNC_DEFAULT_THRESHOLD; 158 /* CoexActivity table */ 159 pWlanParams->tWlanParamsCoexActivityTable.numOfElements = COEX_ACTIVITY_TABLE_DEF_NUM; 160 161 /* DMA parameters */ 162 /* Initialize the Params object database fields*/ 163 pDmaParams->NumStations = DEFAULT_NUM_STATIONS; 164 uNumOfStations = (TI_UINT32)pDmaParams->NumStations; 165 /* 166 * loop an all rssi_snr triggers and initialize only index number. 167 * Reason: 'index' not initialized --> 'index = 0' --> triggers 1..7 will overrun trigger '0' in cmdBld_ConfigSeq 168 */ 169 for (i = 0; i < NUM_OF_RSSI_SNR_TRIGGERS ; i++) 170 { 171 pWlanParams->tRssiSnrTrigger[i].index = i; 172 } 173 } 174 175 pCmdBld->uLastElpCtrlMode = ELPCTRL_MODE_NORMAL; 176 177 /* Create security objects */ 178 pCmdBld->tSecurity.eSecurityMode = TWD_CIPHER_NONE; 179 pCmdBld->tSecurity.uNumOfStations = uNumOfStations; 180 DB_KEYS(pCmdBld).pReconfKeys = (TSecurityKeys*)os_memoryAlloc (hOs, 181 sizeof(TSecurityKeys) * (uNumOfStations * NO_OF_RECONF_SECUR_KEYS_PER_STATION + NO_OF_EXTRA_RECONF_SECUR_KEYS)); 182 os_memoryZero (hOs, 183 (void *)(DB_KEYS(pCmdBld).pReconfKeys), 184 sizeof(TSecurityKeys) * (uNumOfStations * NO_OF_RECONF_SECUR_KEYS_PER_STATION + NO_OF_EXTRA_RECONF_SECUR_KEYS)); 185 186 187 WLAN_INIT_REPORT(("cmdBld_Create end %x\n",(TI_HANDLE)pCmdBld)); 188 189 return (TI_HANDLE)pCmdBld; 190 } 191 192 193 TI_STATUS cmdBld_Destroy (TI_HANDLE hCmdBld) 194 { 195 TCmdBld *pCmdBld = (TCmdBld *)hCmdBld; 196 TDmaParams *pDmaParams = NULL; 197 TI_UINT32 uNumOfStations; 198 199 if (pCmdBld == NULL) 200 { 201 return TI_OK; 202 } 203 204 pDmaParams = &DB_DMA(hCmdBld); 205 206 uNumOfStations = (TI_UINT32)pDmaParams->NumStations; 207 208 if (DB_KEYS(pCmdBld).pReconfKeys) 209 { 210 os_memoryFree (pCmdBld->hOs, 211 DB_KEYS(pCmdBld).pReconfKeys, 212 sizeof(TSecurityKeys) * (uNumOfStations * NO_OF_RECONF_SECUR_KEYS_PER_STATION + NO_OF_EXTRA_RECONF_SECUR_KEYS)); 213 } 214 215 /* free the whalCtrl data structure */ 216 os_memoryFree (pCmdBld->hOs, pCmdBld, sizeof(TCmdBld)); 217 218 return TI_OK; 219 } 220 221 TI_STATUS cmdBld_Restart (TI_HANDLE hCmdBld) 222 { 223 TCmdBld *pCmdBld = (TCmdBld *)hCmdBld; 224 225 /* This init is for recovery stage */ 226 pCmdBld->uLastElpCtrlMode = ELPCTRL_MODE_NORMAL; 227 228 /* 229 * This call is to have the recovery process in AWAKE mode 230 * Prevent move to sleep mode between Hw_Init and Fw_Init 231 */ 232 cmdBld_CfgIeSleepAuth (hCmdBld, DB_WLAN(hCmdBld).minPowerLevel, NULL, NULL); 233 234 return TI_OK; 235 } 236 237 TI_STATUS cmdBld_Config (TI_HANDLE hCmdBld, 238 TI_HANDLE hReport, 239 void *fFinalizeDownload, 240 TI_HANDLE hFinalizeDownload, 241 TI_HANDLE hEventMbox, 242 TI_HANDLE hCmdQueue, 243 TI_HANDLE hTwIf) 244 { 245 TCmdBld *pCmdBld = (TCmdBld *)hCmdBld; 246 TI_UINT32 index; 247 248 pCmdBld->hReport = hReport; 249 pCmdBld->fFinalizeDownload = fFinalizeDownload; 250 pCmdBld->hFinalizeDownload = hFinalizeDownload; 251 pCmdBld->hEventMbox = hEventMbox; 252 pCmdBld->hCmdQueue = hCmdQueue; 253 pCmdBld->hTwIf = hTwIf; 254 255 /* Reset all reconfig valid fields*/ 256 DB_KEYS(pCmdBld).bHwEncDecrEnableValid = TI_FALSE; 257 DB_KEYS(pCmdBld).bDefaultKeyIdValid = TI_FALSE; 258 for (index = 0; 259 index < pCmdBld->tSecurity.uNumOfStations * NO_OF_RECONF_SECUR_KEYS_PER_STATION + NO_OF_EXTRA_RECONF_SECUR_KEYS; 260 index++) 261 (DB_KEYS(pCmdBld).pReconfKeys + index)->keyType = KEY_NULL; 262 263 264 return TI_OK; 265 } 266 267 268 269 static void cmdBld_ConfigFwCb (TI_HANDLE hCmdBld, TI_STATUS status, void *pData) 270 { 271 TCmdBld *pCmdBld = (TCmdBld *)hCmdBld; 272 MemoryMap_t *pMemMap = &pCmdBld->tMemMap; 273 TDmaParams *pDmaParams = &DB_DMA(hCmdBld); 274 275 /* Arrived from callback */ 276 if (pData) 277 { 278 TI_UINT32 *pSwap, i, uMemMapNumFields; 279 280 /* Solve endian problem (all fields are 32 bit) */ 281 uMemMapNumFields = (sizeof(MemoryMap_t) - sizeof(EleHdrStruct)) % 4; 282 pSwap = (TI_UINT32* )&(pMemMap->codeStart); 283 for (i = 0; i < uMemMapNumFields; i++) 284 { 285 pSwap[i] = ENDIAN_HANDLE_LONG(pSwap[i]); 286 } 287 } 288 289 /* Save number of TX blocks */ 290 pDmaParams->NumTxBlocks = pMemMap->numTxMemBlks; 291 /* Firmware Control block is internally pointing to TxResultInterface structure */ 292 pDmaParams->fwTxResultInterface = pMemMap->trqBlock.controlBlock; 293 pDmaParams->fwRxCBufPtr = pMemMap->rxCBufPtr; 294 pDmaParams->fwTxCBufPtr = pMemMap->txCBufPtr; 295 pDmaParams->fwRxControlPtr = pMemMap->rxControlPtr; 296 pDmaParams->fwTxControlPtr = pMemMap->txControlPtr; 297 298 pDmaParams->PacketMemoryPoolStart = (TI_UINT32)pMemMap->packetMemoryPoolStart; 299 300 /* Indicate that the reconfig process is over. */ 301 pCmdBld->bReconfigInProgress = TI_FALSE; 302 303 /* Call the upper layer callback */ 304 (*((TConfigFwCb)pCmdBld->fConfigFwCb)) (pCmdBld->hConfigFwCb, TI_OK); 305 } 306 307 308 /**************************************************************************** 309 * cmdBld_ConfigFw() 310 **************************************************************************** 311 * DESCRIPTION: Configure the WLAN firmware 312 * 313 * INPUTS: None 314 * 315 * OUTPUT: None 316 * 317 * RETURNS: TI_OK or TI_NOK 318 ****************************************************************************/ 319 TI_STATUS cmdBld_ConfigFw (TI_HANDLE hCmdBld, void *fConfigFwCb, TI_HANDLE hConfigFwCb) 320 { 321 TCmdBld *pCmdBld = (TCmdBld *)hCmdBld; 322 323 pCmdBld->fConfigFwCb = fConfigFwCb; 324 pCmdBld->hConfigFwCb = hConfigFwCb; 325 pCmdBld->uIniSeq = 0; 326 pCmdBld->bReconfigInProgress = TI_TRUE; 327 /* should be re-initialized for recovery, pCmdBld->uLastElpCtrlMode = ELPCTRL_MODE_KEEP_AWAKE; */ 328 329 /* Start configuration sequence */ 330 return cmdBld_ConfigSeq (hCmdBld); 331 } 332 333 334 typedef TI_STATUS (*TCmdCfgFunc) (TI_HANDLE); 335 336 337 static TI_STATUS __cmd_probe_req (TI_HANDLE hCmdBld) 338 { 339 TI_STATUS tStatus = TI_OK; 340 341 /* keep space for 2.4 GHz probe request */ 342 tStatus = cmdBld_CmdIeConfigureTemplateFrame (hCmdBld, 343 NULL, 344 DB_WLAN(hCmdBld).probeRequestTemplateSize, 345 CFG_TEMPLATE_PROBE_REQ_2_4, 346 0, 347 NULL, 348 NULL); 349 if (TI_OK != tStatus) 350 { 351 return tStatus; 352 } 353 354 /* keep space for 5.0 GHz probe request */ 355 return cmdBld_CmdIeConfigureTemplateFrame (hCmdBld, 356 NULL, 357 DB_WLAN(hCmdBld).probeRequestTemplateSize, 358 CFG_TEMPLATE_PROBE_REQ_5, 359 0, 360 (void *)cmdBld_ConfigSeq, 361 hCmdBld); 362 } 363 364 365 static TI_STATUS __cmd_null_data (TI_HANDLE hCmdBld) 366 { 367 return cmdBld_CmdIeConfigureTemplateFrame (hCmdBld, 368 NULL, 369 DB_WLAN(hCmdBld).nullTemplateSize, 370 TEMPLATE_NULL_DATA, 371 0, 372 (void *)cmdBld_ConfigSeq, 373 hCmdBld); 374 } 375 376 static TI_STATUS __cmd_burst_mode_enable (TI_HANDLE hCmdBld) 377 { 378 return cmdBld_CfgIeBurstMode (hCmdBld, 379 DB_AC(hCmdBld).isBurstModeEnabled, 380 (void *)cmdBld_ConfigSeq, 381 hCmdBld); 382 } 383 384 385 static TI_STATUS __cmd_disconn (TI_HANDLE hCmdBld) 386 { 387 return cmdBld_CmdIeConfigureTemplateFrame (hCmdBld, 388 NULL, 389 DB_WLAN(hCmdBld).disconnTemplateSize, 390 TEMPLATE_DISCONNECT, 391 0, 392 (void *)cmdBld_ConfigSeq, 393 hCmdBld); 394 } 395 396 static TI_STATUS __cmd_ps_poll (TI_HANDLE hCmdBld) 397 { 398 return cmdBld_CmdIeConfigureTemplateFrame (hCmdBld, 399 NULL, 400 DB_WLAN(hCmdBld).PsPollTemplateSize, 401 TEMPLATE_PS_POLL, 402 0, 403 (void *)cmdBld_ConfigSeq, 404 hCmdBld); 405 } 406 407 408 static TI_STATUS __cmd_qos_null_data (TI_HANDLE hCmdBld) 409 { 410 return cmdBld_CmdIeConfigureTemplateFrame (hCmdBld, 411 NULL, 412 DB_WLAN(hCmdBld).qosNullDataTemplateSize, 413 TEMPLATE_QOS_NULL_DATA, 414 0, 415 (void *)cmdBld_ConfigSeq, 416 hCmdBld); 417 } 418 419 420 static TI_STATUS __cmd_probe_resp (TI_HANDLE hCmdBld) 421 { 422 return cmdBld_CmdIeConfigureTemplateFrame (hCmdBld, 423 NULL, 424 DB_WLAN(hCmdBld).probeResponseTemplateSize, 425 TEMPLATE_PROBE_RESPONSE, 426 0, 427 (void *)cmdBld_ConfigSeq, 428 hCmdBld); 429 } 430 431 432 static TI_STATUS __cmd_beacon (TI_HANDLE hCmdBld) 433 { 434 return cmdBld_CmdIeConfigureTemplateFrame (hCmdBld, 435 NULL, 436 DB_WLAN(hCmdBld).beaconTemplateSize, 437 TEMPLATE_BEACON, 438 0, 439 (void *)cmdBld_ConfigSeq, 440 hCmdBld); 441 } 442 443 static TI_STATUS __cmd_keep_alive_tmpl (TI_HANDLE hCmdBld) 444 { 445 TI_UINT32 index; 446 TI_STATUS status = TI_NOK; 447 448 /* 449 * config templates 450 * fisr configure all indexes but the last one with no CB, and than configure the last one 451 * with a CB to continue configuration. 452 */ 453 for (index = 0; index < KLV_MAX_TMPL_NUM - 1; index++) 454 { 455 status = cmdBld_CmdIeConfigureTemplateFrame (hCmdBld, 456 NULL, 457 MAX_TEMPLATES_SIZE, 458 TEMPLATE_KLV, 459 index, 460 NULL, 461 NULL); 462 if (TI_OK != status) 463 { 464 return status; 465 } 466 } 467 468 status = cmdBld_CmdIeConfigureTemplateFrame (hCmdBld, 469 NULL, 470 MAX_TEMPLATES_SIZE, 471 TEMPLATE_KLV, 472 index, 473 (void *)cmdBld_ConfigSeq, 474 hCmdBld); 475 476 return status; 477 } 478 479 480 static TI_STATUS __cfg_mem (TI_HANDLE hCmdBld) 481 { 482 /* Configure the weight among the different hardware queues */ 483 return cmdBld_CfgIeConfigMemory (hCmdBld, &DB_DMA(hCmdBld), (void *)cmdBld_ConfigSeq, hCmdBld); 484 } 485 486 487 static TI_STATUS __cfg_rx_msdu_life_time (TI_HANDLE hCmdBld) 488 { 489 /* Configure the Rx Msdu Life Time (expiry time of de-fragmentation in FW) */ 490 return cmdBld_CfgIeRxMsduLifeTime (hCmdBld, 491 DB_WLAN(hCmdBld).MaxRxMsduLifetime, 492 (void *)cmdBld_ConfigSeq, 493 hCmdBld); 494 } 495 496 497 static TI_STATUS __cfg_rx (TI_HANDLE hCmdBld) 498 { 499 return cmdBld_CfgIeRx (hCmdBld, 500 DB_WLAN(hCmdBld).RxConfigOption, 501 DB_WLAN(hCmdBld).RxFilterOption, 502 (void *)cmdBld_ConfigSeq, 503 hCmdBld); 504 } 505 506 507 static TI_STATUS __cfg_ac_params_0 (TI_HANDLE hCmdBld) 508 { 509 /* 510 * NOTE: Set following parameter only if configured. 511 * Otherwise, is contains garbage. 512 */ 513 514 if (DB_AC(hCmdBld).isAcConfigured[0]) 515 { 516 return cmdBld_CfgAcParams (hCmdBld, &DB_AC(hCmdBld).ac[0], (void *)cmdBld_ConfigSeq, hCmdBld); 517 } 518 else 519 { 520 return TI_NOK; 521 } 522 } 523 524 525 static TI_STATUS __cfg_ac_params_1 (TI_HANDLE hCmdBld) 526 { 527 /* 528 * NOTE: Set following parameter only if configured. 529 * Otherwise, is contains garbage. 530 */ 531 532 if (DB_AC(hCmdBld).isAcConfigured[1]) 533 { 534 return cmdBld_CfgAcParams (hCmdBld, &DB_AC(hCmdBld).ac[1], (void *)cmdBld_ConfigSeq, hCmdBld); 535 } 536 else 537 { 538 return TI_NOK; 539 } 540 } 541 542 543 static TI_STATUS __cfg_ac_params_2 (TI_HANDLE hCmdBld) 544 { 545 /* 546 * NOTE: Set following parameter only if configured. 547 * Otherwise, is contains garbage. 548 */ 549 550 if (DB_AC(hCmdBld).isAcConfigured[2]) 551 { 552 return cmdBld_CfgAcParams (hCmdBld, &DB_AC(hCmdBld).ac[2], (void *)cmdBld_ConfigSeq, hCmdBld); 553 } 554 else 555 { 556 return TI_NOK; 557 } 558 } 559 560 561 static TI_STATUS __cfg_ac_params_3 (TI_HANDLE hCmdBld) 562 { 563 /* 564 * NOTE: Set following parameter only if configured. 565 * Otherwise, is contains garbage. 566 */ 567 568 if (DB_AC(hCmdBld).isAcConfigured[3]) 569 { 570 return cmdBld_CfgAcParams (hCmdBld, &DB_AC(hCmdBld).ac[3], (void *)cmdBld_ConfigSeq, hCmdBld); 571 } 572 else 573 { 574 return TI_NOK; 575 } 576 } 577 578 579 static TI_STATUS __cfg_tid_0 (TI_HANDLE hCmdBld) 580 { 581 /* 582 * NOTE: Set following parameter only if configured. 583 * Otherwise, is contains garbage. 584 */ 585 if (DB_QUEUES(hCmdBld).isQueueConfigured[0]) 586 { 587 return cmdBld_CfgTid (hCmdBld, &DB_QUEUES(hCmdBld).queues[0], (void *)cmdBld_ConfigSeq, hCmdBld); 588 } 589 else 590 { 591 return TI_NOK; 592 } 593 } 594 595 596 static TI_STATUS __cfg_tid_1 (TI_HANDLE hCmdBld) 597 { 598 /* 599 * NOTE: Set following parameter only if configured. 600 * Otherwise, is contains garbage. 601 */ 602 if (DB_QUEUES(hCmdBld).isQueueConfigured[1]) 603 { 604 return cmdBld_CfgTid (hCmdBld, &DB_QUEUES(hCmdBld).queues[1], (void *)cmdBld_ConfigSeq, hCmdBld); 605 } 606 else 607 { 608 return TI_NOK; 609 } 610 } 611 612 613 static TI_STATUS __cfg_tid_2 (TI_HANDLE hCmdBld) 614 { 615 /* 616 * NOTE: Set following parameter only if configured. 617 * Otherwise, is contains garbage. 618 */ 619 if (DB_QUEUES(hCmdBld).isQueueConfigured[2]) 620 { 621 return cmdBld_CfgTid (hCmdBld, &DB_QUEUES(hCmdBld).queues[2], (void *)cmdBld_ConfigSeq, hCmdBld); 622 } 623 else 624 { 625 return TI_NOK; 626 } 627 } 628 629 630 static TI_STATUS __cfg_tid_3 (TI_HANDLE hCmdBld) 631 { 632 /* 633 * NOTE: Set following parameter only if configured. 634 * Otherwise, is contains garbage. 635 */ 636 if (DB_QUEUES(hCmdBld).isQueueConfigured[3]) 637 { 638 return cmdBld_CfgTid (hCmdBld, &DB_QUEUES(hCmdBld).queues[3], (void *)cmdBld_ConfigSeq, hCmdBld); 639 } 640 else 641 { 642 return TI_NOK; 643 } 644 } 645 646 647 static TI_STATUS __cfg_ps_rx_streaming (TI_HANDLE hCmdBld) 648 { 649 TI_UINT32 index; 650 TI_STATUS eStatus; 651 TPsRxStreaming *pPsRxStreaming; 652 653 654 if (!DB_WLAN(hCmdBld).bJoin) 655 { 656 return TI_NOK; 657 } 658 659 /* Config enabled streams (disable is the FW default). */ 660 for (index = 0; index < MAX_NUM_OF_802_1d_TAGS - 1; index++) 661 { 662 pPsRxStreaming = &(DB_PS_STREAM(hCmdBld).tid[index]); 663 664 if (pPsRxStreaming->bEnabled) 665 { 666 eStatus = cmdBld_CfgPsRxStreaming (hCmdBld, pPsRxStreaming, NULL, NULL); 667 if (eStatus != TI_OK) 668 { 669 return eStatus; 670 } 671 } 672 } 673 674 /* Set NOK for a case the following config is skipped, to indicate that no callback is expected */ 675 eStatus = TI_NOK; 676 677 pPsRxStreaming = &(DB_PS_STREAM(hCmdBld).tid[MAX_NUM_OF_802_1d_TAGS - 1]); 678 if (pPsRxStreaming->bEnabled) 679 { 680 eStatus = cmdBld_CfgPsRxStreaming (hCmdBld, pPsRxStreaming, (void *)cmdBld_ConfigSeq, hCmdBld); 681 if (eStatus != TI_OK) 682 { 683 return eStatus; 684 } 685 } 686 687 return eStatus; 688 } 689 690 691 static TI_STATUS __cfg_rx_data_filter (TI_HANDLE hCmdBld) 692 { 693 TI_UINT32 index; 694 TI_STATUS eStatus; 695 TRxDataFilter *pFilters; 696 697 698 if (DB_RX_DATA_FLTR(hCmdBld).bEnabled) 699 { 700 eStatus = cmdBld_CfgIeEnableRxDataFilter (hCmdBld, 701 DB_RX_DATA_FLTR(hCmdBld).bEnabled, 702 DB_RX_DATA_FLTR(hCmdBld).eDefaultAction, 703 NULL, 704 NULL); 705 if (eStatus != TI_OK) 706 { 707 return eStatus; 708 } 709 } 710 711 /* 712 * Config enabled filters (last one is separated to use the callback) 713 */ 714 for (index = 0; index < MAX_DATA_FILTERS - 1; index++) 715 { 716 pFilters = &(DB_RX_DATA_FLTR(hCmdBld).aRxDataFilter[index]); 717 718 if (pFilters->uCommand == ADD_FILTER) 719 { 720 eStatus = cmdBld_CfgIeRxDataFilter (hCmdBld, 721 pFilters->uIndex, 722 pFilters->uCommand, 723 pFilters->eAction, 724 pFilters->uNumFieldPatterns, 725 pFilters->uLenFieldPatterns, 726 pFilters->aFieldPattern, 727 NULL, 728 NULL); 729 if (eStatus != TI_OK) 730 { 731 return eStatus; 732 } 733 } 734 } 735 736 /* Set NOK for a case the following config is skipped, to indicate that no callback is expected */ 737 eStatus = TI_NOK; 738 739 pFilters = &(DB_RX_DATA_FLTR(hCmdBld).aRxDataFilter[MAX_DATA_FILTERS - 1]); 740 if (pFilters->uCommand == ADD_FILTER) 741 { 742 eStatus = cmdBld_CfgIeRxDataFilter (hCmdBld, 743 pFilters->uIndex, 744 pFilters->uCommand, 745 pFilters->eAction, 746 pFilters->uNumFieldPatterns, 747 pFilters->uLenFieldPatterns, 748 pFilters->aFieldPattern, 749 (void *)cmdBld_ConfigSeq, 750 hCmdBld); 751 if (eStatus != TI_OK) 752 { 753 return eStatus; 754 } 755 } 756 757 return eStatus; 758 } 759 760 761 static TI_STATUS __cfg_pd_threshold (TI_HANDLE hCmdBld) 762 { 763 return cmdBld_CfgIePacketDetectionThreshold (hCmdBld, 764 DB_WLAN(hCmdBld).PacketDetectionThreshold, 765 (void *)cmdBld_ConfigSeq, 766 hCmdBld); 767 } 768 769 770 static TI_STATUS __cfg_slot_time (TI_HANDLE hCmdBld) 771 { 772 return cmdBld_CfgIeSlotTime (hCmdBld, DB_WLAN(hCmdBld).SlotTime, (void *)cmdBld_ConfigSeq, hCmdBld); 773 } 774 775 776 static TI_STATUS __cfg_arp_ip_filter (TI_HANDLE hCmdBld) 777 { 778 return cmdBld_CfgIeArpIpFilter (hCmdBld, 779 DB_WLAN(hCmdBld).arp_IP_addr, 780 (EArpFilterType)DB_WLAN(hCmdBld).arpFilterType, 781 (void *)cmdBld_ConfigSeq, 782 hCmdBld); 783 } 784 785 static TI_STATUS __cfg_group_address_table (TI_HANDLE hCmdBld) 786 { 787 return cmdBld_CfgIeGroupAdressTable (hCmdBld, 788 DB_WLAN(hCmdBld).numGroupAddrs, 789 DB_WLAN(hCmdBld).aGroupAddr, 790 DB_WLAN(hCmdBld).isMacAddrFilteringnabled, 791 (void *)cmdBld_ConfigSeq, 792 hCmdBld); 793 } 794 795 796 static TI_STATUS __cfg_service_period_timeout (TI_HANDLE hCmdBld) 797 { 798 return cmdBld_CfgIeServicePeriodTimeout (hCmdBld, 799 &DB_WLAN(hCmdBld).rxTimeOut, 800 (void *)cmdBld_ConfigSeq, 801 hCmdBld); 802 } 803 804 805 static TI_STATUS __cfg_rts_threshold (TI_HANDLE hCmdBld) 806 { 807 return cmdBld_CfgRtsThreshold (hCmdBld, 808 DB_WLAN(hCmdBld).RtsThreshold, 809 (void *)cmdBld_ConfigSeq, 810 hCmdBld); 811 } 812 813 static TI_STATUS __cfg_dco_itrim_params (TI_HANDLE hCmdBld) 814 { 815 return cmdBld_CfgDcoItrimParams (hCmdBld, 816 DB_WLAN(hCmdBld).dcoItrimEnabled, 817 DB_WLAN(hCmdBld).dcoItrimModerationTimeoutUsec, 818 (void *)cmdBld_ConfigSeq, 819 hCmdBld); 820 } 821 822 static TI_STATUS __cfg_fragment_threshold (TI_HANDLE hCmdBld) 823 { 824 return cmdBld_CfgIeFragmentThreshold (hCmdBld, 825 DB_WLAN(hCmdBld).FragmentThreshold, 826 (void *)cmdBld_ConfigSeq, 827 hCmdBld); 828 } 829 830 831 static TI_STATUS __cfg_pm_config (TI_HANDLE hCmdBld) 832 { 833 return cmdBld_CfgIePmConfig (hCmdBld, 834 DB_WLAN(hCmdBld).uHostClkSettlingTime, 835 DB_WLAN(hCmdBld).uHostFastWakeupSupport, 836 (void *)cmdBld_ConfigSeq, 837 hCmdBld); 838 } 839 840 841 static TI_STATUS __cfg_beacon_filter_opt (TI_HANDLE hCmdBld) 842 { 843 /* Set The Beacon Filter in HAL */ 844 return cmdBld_CfgIeBeaconFilterOpt (hCmdBld, 845 DB_WLAN(hCmdBld).beaconFilterParams.desiredState, 846 DB_WLAN(hCmdBld).beaconFilterParams.numOfElements, 847 (void *)cmdBld_ConfigSeq, 848 hCmdBld); 849 } 850 851 852 static TI_STATUS __cfg_beacon_filter_table (TI_HANDLE hCmdBld) 853 { 854 return cmdBld_CfgIeBeaconFilterTable (hCmdBld, 855 DB_WLAN(hCmdBld).beaconFilterIETable.numberOfIEs, 856 DB_WLAN(hCmdBld).beaconFilterIETable.IETable, 857 DB_WLAN(hCmdBld).beaconFilterIETable.IETableSize, 858 (void *)cmdBld_ConfigSeq, 859 hCmdBld); 860 } 861 862 863 static TI_STATUS __cfg_tx_cmplt_pacing (TI_HANDLE hCmdBld) 864 { 865 return cmdBld_CfgIeTxCmpltPacing (hCmdBld, 866 DB_WLAN(hCmdBld).TxCompletePacingThreshold, 867 DB_WLAN(hCmdBld).TxCompletePacingTimeout, 868 (void *)cmdBld_ConfigSeq, 869 hCmdBld); 870 } 871 872 873 static TI_STATUS __cfg_rx_intr_pacing (TI_HANDLE hCmdBld) 874 { 875 return cmdBld_CfgIeRxIntrPacing (hCmdBld, 876 DB_WLAN(hCmdBld).RxIntrPacingThreshold, 877 DB_WLAN(hCmdBld).RxIntrPacingTimeout, 878 (void *)cmdBld_ConfigSeq, 879 hCmdBld); 880 } 881 882 883 #ifdef TI_TEST 884 static TI_STATUS __cfg_coex_activity_table (TI_HANDLE hCmdBld) 885 { 886 TCmdBld *pCmdBld = (TCmdBld *)hCmdBld; 887 TI_UINT32 uNumberOfIEs = DB_WLAN(hCmdBld).tWlanParamsCoexActivityTable.numOfElements; 888 TCoexActivity *CoexActivityTable = DB_WLAN(hCmdBld).tWlanParamsCoexActivityTable.entry; 889 TI_STATUS status = TI_NOK; 890 TI_UINT32 index; 891 892 TRACE1(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION , " CoexActivity, uNumberOfIEs=%d\n", uNumberOfIEs); 893 if (uNumberOfIEs == 0) 894 { 895 return status; 896 } 897 /* 898 * config CoexActivity table 899 * first configure all indexes but the last one with no CB, and than configure the last one 900 * with a CB to continue configuration. 901 */ 902 for (index = 0; index < uNumberOfIEs-1; index++) 903 { 904 TRACE1(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION , " CoexActivity, send %d\n", index); 905 status = cmdBld_CfgIeCoexActivity (hCmdBld, &CoexActivityTable[index], 906 NULL, NULL); 907 if (TI_OK != status) 908 { 909 return status; 910 } 911 } 912 913 /* Send last activity with a callback to continue config sequence */ 914 TRACE1(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION , " CoexActivity, send last %d\n", index); 915 status = cmdBld_CfgIeCoexActivity (hCmdBld, &CoexActivityTable[index], 916 (void *)cmdBld_ConfigSeq, hCmdBld); 917 918 return status; 919 } 920 #endif 921 922 static TI_STATUS __cfg_cca_threshold (TI_HANDLE hCmdBld) 923 { 924 return cmdBld_CfgIeCcaThreshold (hCmdBld, 925 DB_WLAN(hCmdBld).ch14TelecCca, 926 (void *)cmdBld_ConfigSeq, 927 hCmdBld); 928 } 929 930 931 static TI_STATUS __cfg_bcn_brc_options (TI_HANDLE hCmdBld) 932 { 933 TPowerMgmtConfig powerMgmtConfig; 934 935 /* Beacon broadcast options */ 936 powerMgmtConfig.BcnBrcOptions = DB_WLAN(hCmdBld).BcnBrcOptions; 937 powerMgmtConfig.ConsecutivePsPollDeliveryFailureThreshold = DB_WLAN(hCmdBld).ConsecutivePsPollDeliveryFailureThreshold; 938 939 return cmdBld_CfgIeBcnBrcOptions (hCmdBld, 940 &powerMgmtConfig, 941 (void *)cmdBld_ConfigSeq, 942 hCmdBld); 943 } 944 945 946 static TI_STATUS __cmd_enable_rx (TI_HANDLE hCmdBld) 947 { 948 /* Enable rx path on the hardware */ 949 return cmdBld_CmdEnableRx (hCmdBld, (void *)cmdBld_ConfigSeq, hCmdBld); 950 } 951 952 953 static TI_STATUS __cmd_enable_tx (TI_HANDLE hCmdBld) 954 { 955 /* Enable tx path on the hardware */ 956 return cmdBld_CmdEnableTx (hCmdBld, 957 DB_DEFAULT_CHANNEL(hCmdBld), 958 (void *)cmdBld_ConfigSeq, 959 hCmdBld); 960 } 961 962 963 static TI_STATUS __cfg_ps_wmm (TI_HANDLE hCmdBld) 964 { 965 /* ACX for a work around for Wi-Fi test */ 966 return cmdBld_CfgIePsWmm (hCmdBld, 967 DB_WLAN(hCmdBld).WiFiWmmPS, 968 (void *)cmdBld_ConfigSeq, 969 hCmdBld); 970 } 971 972 973 static TI_STATUS __cfg_rssi_snr_weights (TI_HANDLE hCmdBld) 974 { 975 /* RSSI/SNR Weights for Average calculations */ 976 return cmdBld_CfgIeRssiSnrWeights (hCmdBld, 977 &DB_WLAN(hCmdBld).tRssiSnrWeights, 978 (void *)cmdBld_ConfigSeq, 979 hCmdBld); 980 } 981 982 983 static TI_STATUS __cfg_event_scan_cmplt (TI_HANDLE hCmdBld) 984 { 985 TCmdBld *pCmdBld = (TCmdBld *)hCmdBld; 986 987 /* Enable the scan complete interrupt source */ 988 return eventMbox_UnMaskEvent (pCmdBld->hEventMbox, 989 TWD_OWN_EVENT_SCAN_CMPLT, 990 (void *)cmdBld_ConfigSeq, 991 hCmdBld); 992 } 993 994 static TI_STATUS __cfg_event_sps_scan_cmplt (TI_HANDLE hCmdBld) 995 { 996 TCmdBld *pCmdBld = (TCmdBld *)hCmdBld; 997 998 return eventMbox_UnMaskEvent (pCmdBld->hEventMbox, 999 TWD_OWN_EVENT_SPS_SCAN_CMPLT, 1000 (void *)cmdBld_ConfigSeq, 1001 hCmdBld); 1002 } 1003 1004 static TI_STATUS __cfg_event_plt_rx_calibration_cmplt (TI_HANDLE hCmdBld) 1005 { 1006 TCmdBld *pCmdBld = (TCmdBld *)hCmdBld; 1007 1008 return eventMbox_UnMaskEvent (pCmdBld->hEventMbox, 1009 TWD_OWN_EVENT_PLT_RX_CALIBRATION_COMPLETE, 1010 (void *)cmdBld_ConfigSeq, 1011 hCmdBld); 1012 } 1013 1014 1015 static TI_STATUS __cfg_hw_enc_dec_enable (TI_HANDLE hCmdBld) 1016 { 1017 return cmdBld_CfgHwEncDecEnable (hCmdBld, TI_TRUE, (void *)cmdBld_ConfigSeq, hCmdBld); 1018 } 1019 1020 1021 static TI_STATUS __cfg_rssi_snr_trigger_0 (TI_HANDLE hCmdBld) 1022 { 1023 /* RSSI/SNR Troggers */ 1024 return cmdBld_CfgIeRssiSnrTrigger (hCmdBld, 1025 &DB_WLAN(hCmdBld).tRssiSnrTrigger[0], 1026 (void *)cmdBld_ConfigSeq, 1027 hCmdBld); 1028 } 1029 1030 1031 static TI_STATUS __cfg_rssi_snr_trigger_1 (TI_HANDLE hCmdBld) 1032 { 1033 /* RSSI/SNR Troggers */ 1034 return cmdBld_CfgIeRssiSnrTrigger (hCmdBld, 1035 &DB_WLAN(hCmdBld).tRssiSnrTrigger[1], 1036 (void *)cmdBld_ConfigSeq, 1037 hCmdBld); 1038 } 1039 1040 1041 static TI_STATUS __cfg_rssi_snr_trigger_2 (TI_HANDLE hCmdBld) 1042 { 1043 /* RSSI/SNR Troggers */ 1044 return cmdBld_CfgIeRssiSnrTrigger (hCmdBld, 1045 &DB_WLAN(hCmdBld).tRssiSnrTrigger[2], 1046 (void *)cmdBld_ConfigSeq, 1047 hCmdBld); 1048 } 1049 1050 1051 static TI_STATUS __cfg_rssi_snr_trigger_3 (TI_HANDLE hCmdBld) 1052 { 1053 /* RSSI/SNR Troggers */ 1054 return cmdBld_CfgIeRssiSnrTrigger (hCmdBld, 1055 &DB_WLAN(hCmdBld).tRssiSnrTrigger[3], 1056 (void *)cmdBld_ConfigSeq, 1057 hCmdBld); 1058 } 1059 1060 1061 static TI_STATUS __cfg_rssi_snr_trigger_4 (TI_HANDLE hCmdBld) 1062 { 1063 /* RSSI/SNR Troggers */ 1064 return cmdBld_CfgIeRssiSnrTrigger (hCmdBld, 1065 &DB_WLAN(hCmdBld).tRssiSnrTrigger[4], 1066 (void *)cmdBld_ConfigSeq, 1067 hCmdBld); 1068 } 1069 1070 1071 static TI_STATUS __cfg_rssi_snr_trigger_5 (TI_HANDLE hCmdBld) 1072 { 1073 /* RSSI/SNR Troggers */ 1074 return cmdBld_CfgIeRssiSnrTrigger (hCmdBld, 1075 &DB_WLAN(hCmdBld).tRssiSnrTrigger[5], 1076 (void *)cmdBld_ConfigSeq, 1077 hCmdBld); 1078 } 1079 1080 1081 static TI_STATUS __cfg_rssi_snr_trigger_6 (TI_HANDLE hCmdBld) 1082 { 1083 /* RSSI/SNR Troggers */ 1084 return cmdBld_CfgIeRssiSnrTrigger (hCmdBld, 1085 &DB_WLAN(hCmdBld).tRssiSnrTrigger[6], 1086 (void *)cmdBld_ConfigSeq, 1087 hCmdBld); 1088 } 1089 1090 1091 static TI_STATUS __cfg_rssi_snr_trigger_7 (TI_HANDLE hCmdBld) 1092 { 1093 /* RSSI/SNR Troggers */ 1094 return cmdBld_CfgIeRssiSnrTrigger (hCmdBld, 1095 &DB_WLAN(hCmdBld).tRssiSnrTrigger[7], 1096 (void *)cmdBld_ConfigSeq, 1097 hCmdBld); 1098 } 1099 1100 1101 static TI_STATUS __cfg_max_tx_retry (TI_HANDLE hCmdBld) 1102 { 1103 return cmdBld_CfgIeMaxTxRetry (hCmdBld, 1104 &DB_WLAN(hCmdBld).roamTriggers, 1105 (void *)cmdBld_ConfigSeq, 1106 hCmdBld); 1107 } 1108 1109 1110 1111 static TI_STATUS __cfg_split_scan_timeout (TI_HANDLE hCmdBld) 1112 { 1113 return cmdBld_CmdIeSetSplitScanTimeOut (hCmdBld, 1114 DB_WLAN(hCmdBld).uSlicedScanTimeOut, 1115 (void *)cmdBld_ConfigSeq, 1116 hCmdBld); 1117 } 1118 1119 1120 static TI_STATUS __cfg_conn_monit_params (TI_HANDLE hCmdBld) 1121 { 1122 return cmdBld_CfgIeConnMonitParams (hCmdBld, 1123 &DB_WLAN(hCmdBld).roamTriggers, 1124 (void *)cmdBld_ConfigSeq, 1125 hCmdBld); 1126 } 1127 1128 1129 static TI_STATUS __cfg_bet (TI_HANDLE hCmdBld) 1130 { 1131 return cmdBld_CfgBet (hCmdBld, 1132 DB_WLAN(hCmdBld).BetEnable, 1133 DB_WLAN(hCmdBld).MaximumConsecutiveET, 1134 (void *)cmdBld_ConfigSeq, 1135 hCmdBld); 1136 } 1137 1138 1139 static TI_STATUS __cfg_cts_protection (TI_HANDLE hCmdBld) 1140 { 1141 return cmdBld_CfgIeCtsProtection (hCmdBld, 1142 DB_WLAN(hCmdBld).CtsToSelf, 1143 (void *)cmdBld_ConfigSeq, 1144 hCmdBld); 1145 } 1146 1147 1148 static TI_STATUS __cfg_radio_params (TI_HANDLE hCmdBld) 1149 { 1150 return cmdBld_CfgIeRadioParams (hCmdBld, 1151 &DB_RADIO(hCmdBld), 1152 (void *)cmdBld_ConfigSeq, 1153 hCmdBld); 1154 } 1155 1156 1157 static TI_STATUS __cfg_extended_radio_params (TI_HANDLE hCmdBld) 1158 { 1159 return cmdBld_CfgIeExtendedRadioParams (hCmdBld, 1160 &DB_EXT_RADIO(hCmdBld), 1161 (void *)cmdBld_ConfigSeq, 1162 hCmdBld); 1163 } 1164 1165 1166 static TI_STATUS __cfg_platform_params (TI_HANDLE hCmdBld) 1167 { 1168 return cmdBld_CfgPlatformGenParams(hCmdBld, 1169 &DB_GEN(hCmdBld), 1170 (void *)cmdBld_ConfigSeq, 1171 hCmdBld); 1172 } 1173 1174 1175 1176 static TI_STATUS __cfg_tx_rate_policy (TI_HANDLE hCmdBld) 1177 { 1178 /* 1179 * JOIN (use the local parameters), otherwize the CORE will reconnect 1180 */ 1181 if (DB_WLAN(hCmdBld).bJoin) 1182 { 1183 /* Set TxRatePolicy */ 1184 return cmdBld_CfgTxRatePolicy (hCmdBld, 1185 &DB_BSS(hCmdBld).TxRateClassParams, 1186 (void *)cmdBld_ConfigSeq, 1187 hCmdBld); 1188 } 1189 1190 return TI_NOK; 1191 } 1192 1193 1194 static TI_STATUS __cmd_beacon_join (TI_HANDLE hCmdBld) 1195 { 1196 if (DB_WLAN(hCmdBld).bJoin && DB_TEMP(hCmdBld).Beacon.Size != 0) 1197 { 1198 return cmdBld_CmdIeConfigureTemplateFrame (hCmdBld, 1199 &(DB_TEMP(hCmdBld).Beacon), 1200 (TI_UINT16)DB_TEMP(hCmdBld).Beacon.Size, 1201 TEMPLATE_BEACON, 1202 0, 1203 (void *)cmdBld_ConfigSeq, 1204 hCmdBld); 1205 } 1206 1207 return TI_NOK; 1208 } 1209 1210 static TI_STATUS __cmd_probe_resp_join (TI_HANDLE hCmdBld) 1211 { 1212 if (DB_WLAN(hCmdBld).bJoin && DB_TEMP(hCmdBld).ProbeResp.Size != 0) 1213 { 1214 return cmdBld_CmdIeConfigureTemplateFrame (hCmdBld, 1215 &(DB_TEMP(hCmdBld).ProbeResp), 1216 (TI_UINT16)DB_TEMP(hCmdBld).ProbeResp.Size, 1217 TEMPLATE_PROBE_RESPONSE, 1218 0, 1219 (void *)cmdBld_ConfigSeq, 1220 hCmdBld); 1221 } 1222 1223 return TI_NOK; 1224 } 1225 1226 1227 static TI_STATUS __cmd_probe_req_join (TI_HANDLE hCmdBld) 1228 { 1229 TI_STATUS tStatus; 1230 1231 /* set Probe Req template also if join == false ! */ 1232 if (DB_TEMP(hCmdBld).ProbeReq24.Size != 0) 1233 { 1234 tStatus = cmdBld_CmdIeConfigureTemplateFrame (hCmdBld, 1235 &(DB_TEMP(hCmdBld).ProbeReq24), 1236 (TI_UINT16)DB_TEMP(hCmdBld).ProbeReq24.Size, 1237 CFG_TEMPLATE_PROBE_REQ_2_4, 1238 0, 1239 NULL, 1240 NULL); 1241 if (TI_OK != tStatus) 1242 { 1243 return tStatus; 1244 } 1245 } 1246 1247 /* set Probe Req template also if join == false ! */ 1248 if (DB_TEMP(hCmdBld).ProbeReq50.Size != 0) 1249 { 1250 return cmdBld_CmdIeConfigureTemplateFrame (hCmdBld, 1251 &(DB_TEMP(hCmdBld).ProbeReq50), 1252 (TI_UINT16)DB_TEMP(hCmdBld).ProbeReq50.Size, 1253 CFG_TEMPLATE_PROBE_REQ_5, 1254 0, 1255 (void *)cmdBld_ConfigSeq, 1256 hCmdBld); 1257 } 1258 1259 return TI_NOK; 1260 } 1261 1262 1263 static TI_STATUS __cmd_null_data_join (TI_HANDLE hCmdBld) 1264 { 1265 if (DB_WLAN(hCmdBld).bJoin && DB_TEMP(hCmdBld).NullData.Size != 0) 1266 { 1267 return cmdBld_CmdIeConfigureTemplateFrame (hCmdBld, 1268 &(DB_TEMP(hCmdBld).NullData), 1269 (TI_UINT16)DB_TEMP(hCmdBld).NullData.Size, 1270 TEMPLATE_NULL_DATA, 1271 0, 1272 (void *)cmdBld_ConfigSeq, 1273 hCmdBld); 1274 } 1275 1276 return TI_NOK; 1277 } 1278 1279 static TI_STATUS __cmd_disconn_join (TI_HANDLE hCmdBld) 1280 { 1281 if (DB_WLAN(hCmdBld).bJoin && DB_TEMP(hCmdBld).Disconn.Size != 0) 1282 { 1283 return cmdBld_CmdIeConfigureTemplateFrame (hCmdBld, 1284 &(DB_TEMP(hCmdBld).Disconn), 1285 (TI_UINT16)DB_TEMP(hCmdBld).Disconn.Size, 1286 TEMPLATE_DISCONNECT, 1287 0, 1288 (void *)cmdBld_ConfigSeq, 1289 hCmdBld); 1290 } 1291 1292 return TI_NOK; 1293 } 1294 1295 static TI_STATUS __cmd_ps_poll_join (TI_HANDLE hCmdBld) 1296 { 1297 if (DB_WLAN(hCmdBld).bJoin && DB_TEMP(hCmdBld).PsPoll.Size != 0) 1298 { 1299 return cmdBld_CmdIeConfigureTemplateFrame (hCmdBld, 1300 &(DB_TEMP(hCmdBld).PsPoll), 1301 (TI_UINT16)DB_TEMP(hCmdBld).PsPoll.Size, 1302 TEMPLATE_PS_POLL, 1303 0, 1304 (void *)cmdBld_ConfigSeq, 1305 hCmdBld); 1306 } 1307 1308 return TI_NOK; 1309 } 1310 1311 static TI_STATUS __cmd_arp_rsp (TI_HANDLE hCmdBld) 1312 { 1313 1314 return cmdBld_CmdIeConfigureTemplateFrame (hCmdBld, 1315 NULL, 1316 DB_WLAN(hCmdBld).ArpRspTemplateSize, 1317 TEMPLATE_ARP_RSP, 1318 0, 1319 (void *)cmdBld_ConfigSeq, 1320 hCmdBld); 1321 } 1322 1323 1324 static TI_STATUS __cmd_arp_rsp_join (TI_HANDLE hCmdBld) 1325 { 1326 1327 if ((DB_WLAN(hCmdBld).bJoin) && (DB_TEMP(hCmdBld).ArpRsp.Size != 0)) 1328 { 1329 return cmdBld_CmdIeConfigureTemplateFrame (hCmdBld, 1330 &(DB_TEMP(hCmdBld).ArpRsp), 1331 DB_TEMP(hCmdBld).ArpRsp.Size, 1332 TEMPLATE_ARP_RSP, 1333 0, 1334 (void *)cmdBld_ConfigSeq, 1335 hCmdBld); 1336 } 1337 1338 return TI_NOK; 1339 } 1340 1341 1342 1343 1344 static TI_STATUS __cmd_keep_alive_tmpl_join (TI_HANDLE hCmdBld) 1345 { 1346 TI_UINT32 index; 1347 TI_STATUS status = TI_NOK; 1348 1349 /* 1350 * config templates 1351 * first configure all indexes but the last one with no CB, and than configure the last one 1352 * with a CB to continue configuration. 1353 */ 1354 for (index = 0; index < KLV_MAX_TMPL_NUM - 1; index++) 1355 { 1356 if (DB_WLAN(hCmdBld).bJoin && DB_TEMP(hCmdBld).KeepAlive[ index ].Size != 0) 1357 { 1358 status = cmdBld_CmdIeConfigureTemplateFrame (hCmdBld, 1359 &(DB_TEMP(hCmdBld).KeepAlive[index]), 1360 (TI_UINT16)DB_TEMP(hCmdBld).KeepAlive[index].Size, 1361 TEMPLATE_KLV, 1362 index, 1363 NULL, 1364 NULL); 1365 if (TI_OK != status) 1366 { 1367 return status; 1368 } 1369 } 1370 } 1371 1372 if (DB_WLAN(hCmdBld).bJoin && DB_TEMP(hCmdBld).KeepAlive[ index ].Size != 0) 1373 { 1374 status = cmdBld_CmdIeConfigureTemplateFrame (hCmdBld, 1375 &(DB_TEMP(hCmdBld).KeepAlive[index]), 1376 (TI_UINT16)DB_TEMP(hCmdBld).KeepAlive[index].Size, 1377 TEMPLATE_KLV, 1378 index, 1379 (void *)cmdBld_ConfigSeq, 1380 hCmdBld); 1381 if (TI_OK != status) 1382 { 1383 return status; 1384 } 1385 } 1386 1387 return status; 1388 } 1389 1390 1391 static TI_STATUS __cmd_keep_alive_params(TI_HANDLE hCmdBld) 1392 { 1393 TI_UINT32 index; 1394 TI_STATUS status; 1395 1396 /* config gloabl enable / disable flag */ 1397 cmdBld_CfgKeepAliveEnaDis (hCmdBld, DB_KLV(hCmdBld).enaDisFlag, NULL, NULL); 1398 1399 /* 1400 * config per-template params 1401 * fisr configure all indexes but the last one with no CB, and than configure the last one 1402 * with a CB to continue configuration. 1403 */ 1404 for (index = 0; index < KLV_MAX_TMPL_NUM - 1; index++) 1405 { 1406 if (DB_WLAN(hCmdBld).bJoin && DB_KLV(hCmdBld).keepAliveParams[ index ].enaDisFlag != 0) 1407 { 1408 status = cmdBld_CmdIeConfigureKeepAliveParams (hCmdBld, 1409 index, 1410 DB_KLV(hCmdBld).keepAliveParams[ index ].enaDisFlag, 1411 DB_KLV(hCmdBld).keepAliveParams[ index ].trigType, 1412 DB_KLV(hCmdBld).keepAliveParams[ index ].interval, 1413 NULL, 1414 NULL); 1415 if (TI_OK != status) 1416 { 1417 return status; 1418 } 1419 } 1420 } 1421 1422 /* Set NOK for a case the following config is skipped, to indicate that no callback is expected */ 1423 status = TI_NOK; 1424 1425 if (DB_WLAN(hCmdBld).bJoin && DB_KLV(hCmdBld).keepAliveParams[ index ].enaDisFlag != 0) 1426 { 1427 status = cmdBld_CmdIeConfigureKeepAliveParams (hCmdBld, 1428 index, 1429 DB_KLV(hCmdBld).keepAliveParams[ index ].enaDisFlag, 1430 DB_KLV(hCmdBld).keepAliveParams[ index ].trigType, 1431 DB_KLV(hCmdBld).keepAliveParams[ index ].interval, 1432 (void *)cmdBld_ConfigSeq, 1433 hCmdBld); 1434 if (TI_OK != status) 1435 { 1436 return status; 1437 } 1438 } 1439 1440 return status; 1441 } 1442 1443 static TI_STATUS __cmd_power_auth (TI_HANDLE hCmdBld) 1444 { 1445 return cmdBld_CfgIeSleepAuth (hCmdBld, 1446 DB_WLAN(hCmdBld).minPowerLevel, 1447 (void *)cmdBld_ConfigSeq, 1448 hCmdBld); 1449 } 1450 1451 static TI_STATUS __cmd_start_join (TI_HANDLE hCmdBld) 1452 { 1453 TCmdBld *pCmdBld = (TCmdBld *)hCmdBld; 1454 1455 if (DB_WLAN(hCmdBld).bJoin) 1456 { 1457 /* 1458 * Replace the Join-Complete event CB by a local function. 1459 * Thus, the reconfig sequence will not continue until the Join is completed! 1460 * The original CB is restored after Join-Complete. 1461 */ 1462 eventMbox_ReplaceEvent (pCmdBld->hEventMbox, 1463 TWD_OWN_EVENT_JOIN_CMPLT, 1464 (void *)cmdBld_JoinCmpltForReconfigCb, 1465 hCmdBld, 1466 &pCmdBld->fJoinCmpltOriginalCbFunc, 1467 &pCmdBld->hJoinCmpltOriginalCbHndl); 1468 /* 1469 * Call the hardware to start/join the bss 1470 */ 1471 return cmdBld_CmdStartJoin (hCmdBld, 1472 (ScanBssType_e)DB_BSS(hCmdBld).ReqBssType, 1473 (void *)cmdBld_DummyCb, 1474 hCmdBld); 1475 } 1476 1477 return TI_NOK; 1478 } 1479 1480 static TI_STATUS __cmd_sta_state (TI_HANDLE hCmdBld) 1481 { 1482 if (DB_WLAN(hCmdBld).bStaConnected) 1483 { 1484 return cmdBld_CmdSetStaState (hCmdBld, 1485 STA_STATE_CONNECTED, 1486 (void *)cmdBld_ConfigSeq, 1487 hCmdBld); 1488 } 1489 1490 return TI_NOK; 1491 } 1492 1493 static TI_STATUS __cfg_aid (TI_HANDLE hCmdBld) 1494 { 1495 if (DB_WLAN(hCmdBld).bJoin) 1496 { 1497 return cmdBld_CfgAid (hCmdBld, DB_WLAN(hCmdBld).Aid, (void *)cmdBld_ConfigSeq, hCmdBld); 1498 } 1499 1500 return TI_NOK; 1501 } 1502 1503 1504 static TI_STATUS __cfg_slot_time_join (TI_HANDLE hCmdBld) 1505 { 1506 if (DB_WLAN(hCmdBld).bJoin) 1507 { 1508 /* Slot time must be setting after doing join */ 1509 return cmdBld_CfgSlotTime (hCmdBld, (ESlotTime)(DB_WLAN(hCmdBld).SlotTime), (void *)cmdBld_ConfigSeq, hCmdBld); 1510 } 1511 1512 return TI_NOK; 1513 } 1514 1515 1516 static TI_STATUS __cfg_preamble_join (TI_HANDLE hCmdBld) 1517 { 1518 if (DB_WLAN(hCmdBld).bJoin) 1519 { 1520 /* Preamble type must be set after doing join */ 1521 return cmdBld_CfgPreamble (hCmdBld, (Preamble_e) DB_WLAN(hCmdBld).preamble, (void *)cmdBld_ConfigSeq, hCmdBld); 1522 } 1523 1524 return TI_NOK; 1525 } 1526 1527 1528 static TI_STATUS __cfg_ht_capabilities (TI_HANDLE hCmdBld) 1529 { 1530 if (DB_WLAN(hCmdBld).bJoin && DB_BSS(hCmdBld).bHtCap) 1531 { 1532 /* HT capabilities must be set after doing join */ 1533 return cmdBld_CfgIeSetFwHtCapabilities (hCmdBld, 1534 DB_BSS(hCmdBld).uHtCapabilites, 1535 DB_BSS(hCmdBld).tMacAddress, 1536 DB_BSS(hCmdBld).uAmpduMaxLeng, 1537 DB_BSS(hCmdBld).uAmpduMinSpac, 1538 (void *)cmdBld_ConfigSeq, 1539 hCmdBld); 1540 } 1541 1542 return TI_NOK; 1543 } 1544 1545 1546 static TI_STATUS __cfg_ht_information (TI_HANDLE hCmdBld) 1547 { 1548 if (DB_WLAN(hCmdBld).bJoin && DB_BSS(hCmdBld).bHtInf) 1549 { 1550 /* HT Information must be set after doing join */ 1551 return cmdBld_CfgIeSetFwHtInformation (hCmdBld, 1552 DB_BSS(hCmdBld).uRifsMode, 1553 DB_BSS(hCmdBld).uHtProtection, 1554 DB_BSS(hCmdBld).uGfProtection, 1555 DB_BSS(hCmdBld).uHtTxBurstLimit, 1556 DB_BSS(hCmdBld).uDualCtsProtection, 1557 (void *)cmdBld_ConfigSeq, 1558 hCmdBld); 1559 } 1560 1561 return TI_NOK; 1562 } 1563 1564 1565 static TI_STATUS __cfg_ba_set_session (TI_HANDLE hCmdBld) 1566 { 1567 TI_STATUS tRes = TI_NOK; 1568 1569 if (DB_WLAN(hCmdBld).bJoin) 1570 { 1571 TI_UINT32 uTid; 1572 TI_UINT32 uLastTid = MAX_NUM_OF_802_1d_TAGS; /* initial value is "not found" */ 1573 1574 /* Look through configured BA sessions in data base to find the last set TID */ 1575 for (uTid = 0; uTid < MAX_NUM_OF_802_1d_TAGS; uTid++) 1576 { 1577 /* Is BA initiator or responder configured? */ 1578 if (DB_BSS(hCmdBld).bBaInitiator[uTid] || DB_BSS(hCmdBld).bBaResponder[uTid]) 1579 { 1580 uLastTid = uTid; 1581 } 1582 } 1583 1584 if (uLastTid != MAX_NUM_OF_802_1d_TAGS) 1585 { 1586 /* At least one TID is set */ 1587 for (uTid = 0; uTid < uLastTid; ++uTid) 1588 { 1589 if (DB_BSS(hCmdBld).bBaInitiator[uTid]) 1590 { 1591 /* set BA Initiator */ 1592 tRes = cmdBld_CfgIeSetBaSession (hCmdBld, 1593 ACX_BA_SESSION_INITIATOR_POLICY, 1594 uTid, 1595 DB_BSS(hCmdBld).tBaSessionInitiatorPolicy[uTid].uPolicy, 1596 DB_BSS(hCmdBld).tBaSessionInitiatorPolicy[uTid].aMacAddress, 1597 DB_BSS(hCmdBld).tBaSessionInitiatorPolicy[uTid].uWinSize, 1598 DB_BSS(hCmdBld).tBaSessionInitiatorPolicy[uTid].uInactivityTimeout, 1599 NULL, 1600 NULL); 1601 if (tRes != TI_OK) 1602 { 1603 return tRes; 1604 } 1605 } 1606 1607 if (DB_BSS(hCmdBld).bBaResponder[uTid]) 1608 { 1609 /* set BA Responder */ 1610 tRes = cmdBld_CfgIeSetBaSession (hCmdBld, 1611 ACX_BA_SESSION_RESPONDER_POLICY, 1612 uTid, 1613 DB_BSS(hCmdBld).tBaSessionResponderPolicy[uTid].uPolicy, 1614 DB_BSS(hCmdBld).tBaSessionResponderPolicy[uTid].aMacAddress, 1615 DB_BSS(hCmdBld).tBaSessionResponderPolicy[uTid].uWinSize, 1616 DB_BSS(hCmdBld).tBaSessionResponderPolicy[uTid].uInactivityTimeout, 1617 NULL, 1618 NULL); 1619 if (tRes != TI_OK) 1620 { 1621 return tRes; 1622 } 1623 } 1624 } 1625 1626 /* Push the last command of the last TID entry into queue with a call back function */ 1627 if (DB_BSS(hCmdBld).bBaInitiator[uLastTid] && !(DB_BSS(hCmdBld).bBaResponder[uLastTid])) 1628 { 1629 1630 tRes = cmdBld_CfgIeSetBaSession (hCmdBld, 1631 ACX_BA_SESSION_INITIATOR_POLICY, 1632 uLastTid, 1633 DB_BSS(hCmdBld).tBaSessionInitiatorPolicy[uLastTid].uPolicy, 1634 DB_BSS(hCmdBld).tBaSessionInitiatorPolicy[uLastTid].aMacAddress, 1635 DB_BSS(hCmdBld).tBaSessionInitiatorPolicy[uLastTid].uWinSize, 1636 DB_BSS(hCmdBld).tBaSessionInitiatorPolicy[uLastTid].uInactivityTimeout, 1637 (void *)cmdBld_ConfigSeq, 1638 hCmdBld); 1639 } 1640 else if (!(DB_BSS(hCmdBld).bBaInitiator[uLastTid]) && DB_BSS(hCmdBld).bBaResponder[uLastTid]) 1641 { 1642 tRes = cmdBld_CfgIeSetBaSession (hCmdBld, 1643 ACX_BA_SESSION_RESPONDER_POLICY, 1644 uLastTid, 1645 DB_BSS(hCmdBld).tBaSessionResponderPolicy[uLastTid].uPolicy, 1646 DB_BSS(hCmdBld).tBaSessionResponderPolicy[uLastTid].aMacAddress, 1647 DB_BSS(hCmdBld).tBaSessionResponderPolicy[uLastTid].uWinSize, 1648 DB_BSS(hCmdBld).tBaSessionResponderPolicy[uLastTid].uInactivityTimeout, 1649 (void *)cmdBld_ConfigSeq, 1650 hCmdBld); 1651 } 1652 else 1653 { 1654 /* Initiator & Responsder policy is to be set */ 1655 tRes = cmdBld_CfgIeSetBaSession (hCmdBld, 1656 ACX_BA_SESSION_INITIATOR_POLICY, 1657 uLastTid, 1658 DB_BSS(hCmdBld).tBaSessionInitiatorPolicy[uLastTid].uPolicy, 1659 DB_BSS(hCmdBld).tBaSessionInitiatorPolicy[uLastTid].aMacAddress, 1660 DB_BSS(hCmdBld).tBaSessionInitiatorPolicy[uLastTid].uWinSize, 1661 DB_BSS(hCmdBld).tBaSessionInitiatorPolicy[uLastTid].uInactivityTimeout, 1662 NULL, 1663 NULL); 1664 if (tRes != TI_OK) 1665 { 1666 return tRes; 1667 } 1668 1669 tRes = cmdBld_CfgIeSetBaSession (hCmdBld, 1670 ACX_BA_SESSION_RESPONDER_POLICY, 1671 uLastTid, 1672 DB_BSS(hCmdBld).tBaSessionResponderPolicy[uLastTid].uPolicy, 1673 DB_BSS(hCmdBld).tBaSessionResponderPolicy[uLastTid].aMacAddress, 1674 DB_BSS(hCmdBld).tBaSessionResponderPolicy[uLastTid].uWinSize, 1675 DB_BSS(hCmdBld).tBaSessionResponderPolicy[uLastTid].uInactivityTimeout, 1676 (void *)cmdBld_ConfigSeq, 1677 hCmdBld); 1678 } 1679 } 1680 } 1681 1682 return tRes; 1683 } 1684 1685 1686 static TI_STATUS __cfg_tx_power_join (TI_HANDLE hCmdBld) 1687 { 1688 if (DB_WLAN(hCmdBld).bJoin) 1689 { 1690 /* Tx-power must be set after doing join */ 1691 return cmdBld_CfgTxPowerDbm (hCmdBld, DB_WLAN(hCmdBld).TxPowerDbm, (void *)cmdBld_ConfigSeq, hCmdBld); 1692 } 1693 1694 return TI_NOK; 1695 } 1696 1697 1698 static TI_STATUS __cfg_keys (TI_HANDLE hCmdBld) 1699 { 1700 TCmdBld *pCmdBld = (TCmdBld *)hCmdBld; 1701 TI_UINT32 index; 1702 1703 if (!DB_WLAN(hCmdBld).bJoin) 1704 { 1705 return TI_NOK; 1706 } 1707 1708 if (pCmdBld->tSecurity.eSecurityMode != TWD_CIPHER_NONE) 1709 { 1710 /* 1711 * We are doing recovery during security so increase security-sequence-number by 255 just to ensure 1712 * the AP will see progress from last Tx before the recovery (actually needed only for TKIP and AES). 1713 * Decrementing the low byte by one is handled like it wrpped around, i.e. increment total number by 255. 1714 */ 1715 cmdBld_SetSecuritySeqNum (hCmdBld, (TI_UINT8)(pCmdBld->uSecuritySeqNumLow - 1)); 1716 1717 1718 /* set the keys to the HW*/ 1719 for (index = 0; 1720 index < pCmdBld->tSecurity.uNumOfStations * NO_OF_RECONF_SECUR_KEYS_PER_STATION + NO_OF_EXTRA_RECONF_SECUR_KEYS; 1721 index++) 1722 { 1723 if ((DB_KEYS(pCmdBld).pReconfKeys + index)->keyType != KEY_NULL) 1724 { 1725 if (cmdBld_CmdAddKey (hCmdBld, DB_KEYS(pCmdBld).pReconfKeys + index, TI_TRUE, NULL, NULL) != TI_OK) 1726 { 1727 TRACE1(pCmdBld->hReport, REPORT_SEVERITY_ERROR, "__cfg_keys: ERROR cmdBld_CmdAddKey failure index=%d\n", index); 1728 return TI_NOK; 1729 } 1730 } 1731 } 1732 1733 if (DB_KEYS(pCmdBld).bDefaultKeyIdValid) 1734 { 1735 /* Set the deafult key ID to the HW*/ 1736 if (cmdBld_CmdSetWepDefaultKeyId (hCmdBld, DB_KEYS(pCmdBld).uReconfDefaultKeyId, NULL, NULL) != TI_OK) 1737 { 1738 TRACE0(pCmdBld->hReport, REPORT_SEVERITY_ERROR, "__cfg_keys: ERROR cmdBld_CmdSetWepDefaultKeyId failure\n"); 1739 return TI_NOK; 1740 } 1741 } 1742 } 1743 1744 /* Set the encryption/decryption control on the HW */ 1745 if (cmdBld_CfgHwEncDecEnable (hCmdBld, 1746 DB_KEYS(pCmdBld).bReconfHwEncEnable, 1747 (void *)cmdBld_ConfigSeq, 1748 hCmdBld) != TI_OK) 1749 { 1750 TRACE0(pCmdBld->hReport, REPORT_SEVERITY_ERROR, "__cfg_keys: ERROR cmdBld_CfgHwEncDecEnable failure \n"); 1751 return TI_NOK; 1752 } 1753 1754 return TI_OK; 1755 } 1756 1757 static TI_STATUS __cfg_sg_enable (TI_HANDLE hCmdBld) 1758 { 1759 /* Set the Soft Gemini state */ 1760 return cmdBld_CfgSgEnable (hCmdBld, 1761 DB_WLAN(hCmdBld).SoftGeminiEnable, 1762 (void *)cmdBld_ConfigSeq, 1763 hCmdBld); 1764 } 1765 1766 1767 static TI_STATUS __cfg_sg (TI_HANDLE hCmdBld) 1768 { 1769 /* Set the Soft Gemini params */ 1770 1771 /* signals the FW to config all the paramters from the DB*/ 1772 DB_WLAN(hCmdBld).SoftGeminiParams.paramIdx = 0xFF; 1773 1774 return cmdBld_CfgSg (hCmdBld, 1775 &DB_WLAN(hCmdBld).SoftGeminiParams, 1776 (void *)cmdBld_ConfigSeq, 1777 hCmdBld); 1778 } 1779 1780 1781 static TI_STATUS __cfg_fm_coex (TI_HANDLE hCmdBld) 1782 { 1783 /* Set the FM Coexistence params */ 1784 return cmdBld_CfgIeFmCoex (hCmdBld, 1785 &DB_WLAN(hCmdBld).tFmCoexParams, 1786 (void *)cmdBld_ConfigSeq, 1787 hCmdBld); 1788 } 1789 1790 1791 static TI_STATUS __cfg_rate_management (TI_HANDLE hCmdBld) 1792 { 1793 DB_RM(hCmdBld).rateMngParams.paramIndex = (rateAdaptParam_e) 0xFF; 1794 1795 return cmdBld_CfgIeRateMngDbg(hCmdBld, 1796 &DB_RM(hCmdBld).rateMngParams, 1797 (void *)cmdBld_ConfigSeq, 1798 hCmdBld); 1799 1800 } 1801 1802 1803 TI_STATUS __itr_memory_map (TI_HANDLE hCmdBld) 1804 { 1805 TCmdBld *pCmdBld = (TCmdBld *)hCmdBld; 1806 1807 WLAN_OS_REPORT(("Interrogate TX/RX parameters\n")); 1808 1809 /* Interrogate TX/RX parameters */ 1810 return cmdBld_ItrIeMemoryMap (hCmdBld, 1811 &pCmdBld->tMemMap, 1812 (void *)cmdBld_ConfigFwCb, 1813 hCmdBld); 1814 } 1815 1816 1817 static const TCmdCfgFunc aCmdIniSeq [] = 1818 { 1819 __cfg_platform_params, 1820 __cfg_radio_params, 1821 __cfg_extended_radio_params, 1822 __cmd_probe_req, 1823 __cmd_null_data, 1824 __cmd_disconn, 1825 __cmd_ps_poll, 1826 __cmd_qos_null_data, 1827 __cmd_probe_resp, 1828 __cmd_beacon, 1829 __cmd_keep_alive_tmpl, 1830 __cfg_mem, 1831 __cfg_rx_msdu_life_time, 1832 __cfg_rx, 1833 __cfg_ac_params_0, 1834 __cfg_tid_0, 1835 __cfg_ac_params_1, 1836 __cfg_tid_1, 1837 __cfg_ac_params_2, 1838 __cfg_tid_2, 1839 __cfg_ac_params_3, 1840 __cfg_tid_3, 1841 __cfg_pd_threshold, 1842 __cfg_slot_time, 1843 __cmd_arp_rsp, 1844 __cfg_arp_ip_filter, 1845 __cfg_group_address_table, 1846 __cfg_service_period_timeout, 1847 __cfg_rts_threshold, 1848 __cfg_dco_itrim_params, 1849 __cfg_fragment_threshold, 1850 __cfg_pm_config, 1851 __cfg_beacon_filter_opt, 1852 __cfg_beacon_filter_table, 1853 __cfg_tx_cmplt_pacing, 1854 __cfg_rx_intr_pacing, 1855 __cfg_sg, 1856 __cfg_sg_enable, 1857 __cfg_fm_coex, 1858 __cfg_cca_threshold, 1859 __cfg_bcn_brc_options, 1860 __cmd_enable_rx, 1861 __cmd_enable_tx, 1862 __cfg_ps_wmm, 1863 __cfg_event_scan_cmplt, 1864 __cfg_event_sps_scan_cmplt, 1865 __cfg_event_plt_rx_calibration_cmplt, 1866 __cfg_hw_enc_dec_enable, 1867 __cfg_rssi_snr_weights, 1868 __cfg_rssi_snr_trigger_0, 1869 __cfg_rssi_snr_trigger_1, 1870 __cfg_rssi_snr_trigger_2, 1871 __cfg_rssi_snr_trigger_3, 1872 __cfg_rssi_snr_trigger_4, 1873 __cfg_rssi_snr_trigger_5, 1874 __cfg_rssi_snr_trigger_6, 1875 __cfg_rssi_snr_trigger_7, 1876 __cfg_max_tx_retry, 1877 __cfg_split_scan_timeout, 1878 1879 /* Re-join sequence */ 1880 __cfg_tx_rate_policy, 1881 __cmd_beacon_join, 1882 __cmd_probe_resp_join, 1883 __cmd_probe_req_join, 1884 __cmd_null_data_join, 1885 __cmd_disconn_join, 1886 __cmd_ps_poll_join, 1887 __cmd_keep_alive_tmpl_join, 1888 __cfg_slot_time_join, 1889 __cfg_preamble_join, 1890 __cfg_ht_capabilities, 1891 __cfg_ht_information, 1892 __cmd_start_join, 1893 __cfg_aid, 1894 __cfg_ba_set_session, 1895 __cfg_tx_power_join, 1896 __cfg_keys, 1897 __cmd_keep_alive_params, 1898 __cfg_conn_monit_params, 1899 __cfg_bet, 1900 __cfg_cts_protection, 1901 __cfg_ps_rx_streaming, 1902 __cfg_rx_data_filter, 1903 __cmd_sta_state, 1904 __cmd_power_auth, 1905 __cmd_burst_mode_enable, 1906 __cfg_rate_management, 1907 __cmd_arp_rsp_join, 1908 /* Interrogate command -> must be last!! */ 1909 __itr_memory_map, 1910 1911 NULL 1912 }; 1913 1914 1915 /**************************************************************************** 1916 * cmdBld_ConfigSeq() 1917 **************************************************************************** 1918 * DESCRIPTION: Configuration sequence engine 1919 * 1920 * INPUTS: None 1921 * 1922 * OUTPUT: None 1923 * 1924 * RETURNS: TI_OK or TI_NOK 1925 ****************************************************************************/ 1926 TI_STATUS cmdBld_ConfigSeq (TI_HANDLE hCmdBld) 1927 { 1928 TCmdBld *pCmdBld = (TCmdBld *)hCmdBld; 1929 1930 do 1931 { 1932 if (aCmdIniSeq [pCmdBld->uIniSeq++] == NULL) 1933 { 1934 return TI_NOK; 1935 } 1936 } 1937 while ((*aCmdIniSeq [pCmdBld->uIniSeq - 1])(hCmdBld) != TI_OK); 1938 1939 return TI_OK; 1940 } 1941 1942 /**************************************************************************** 1943 * cmdBld_FinalizeDownload() 1944 **************************************************************************** 1945 * DESCRIPTION: Finalize all the remaining initialization after the download has finished 1946 * 1947 * INPUTS: 1948 * 1949 * OUTPUT: None 1950 * 1951 * RETURNS: void 1952 ****************************************************************************/ 1953 void cmdBld_FinalizeDownload (TI_HANDLE hCmdBld, TBootAttr *pBootAttr, FwStaticData_t *pFwInfo) 1954 { 1955 TCmdBld *pCmdBld = (TCmdBld *)hCmdBld; 1956 TI_UINT8 *pMacAddr = pFwInfo->dot11StationID; 1957 TI_UINT32 i; 1958 TI_UINT8 uTmp; 1959 1960 /* Save FW version */ 1961 os_memoryCopy (pCmdBld->hOs, 1962 (void *)DB_HW(hCmdBld).fwVer, 1963 (void *)pFwInfo->FWVersion, 1964 sizeof(DB_HW(hCmdBld).fwVer)); 1965 1966 /* Save MAC adress (correct the bytes order first) */ 1967 for (i = 0; i < 3; i++) 1968 { 1969 uTmp = pMacAddr[i]; 1970 pMacAddr[i] = pMacAddr[5 - i]; 1971 pMacAddr[5 - i] = uTmp; 1972 } 1973 MAC_COPY (DB_HW(hCmdBld).macAddress, pMacAddr); 1974 1975 /* Save chip ID */ 1976 os_memoryCopy (pCmdBld->hOs, 1977 (void *)&(DB_HW(hCmdBld).uHardWareVersion), 1978 (void *)&(pFwInfo->HardWareVersion), 1979 sizeof(DB_HW(hCmdBld).uHardWareVersion)); 1980 1981 /* Save power-levels table */ 1982 os_memoryCopy (pCmdBld->hOs, 1983 (void *)DB_HW(hCmdBld).txPowerTable, 1984 (void *)pFwInfo->txPowerTable, 1985 sizeof(DB_HW(hCmdBld).txPowerTable)); 1986 1987 /* Call the upper layer callback */ 1988 (*((TFinalizeCb)pCmdBld->fFinalizeDownload)) (pCmdBld->hFinalizeDownload); 1989 } 1990 1991 1992 TI_STATUS cmdBld_GetParam (TI_HANDLE hCmdBld, TTwdParamInfo *pParamInfo) 1993 { 1994 TCmdBld *pCmdBld = (TCmdBld *)hCmdBld; 1995 TWlanParams *pWlanParams = &DB_WLAN(hCmdBld); 1996 1997 switch (pParamInfo->paramType) 1998 { 1999 case TWD_RTS_THRESHOLD_PARAM_ID: 2000 pParamInfo->content.halCtrlRtsThreshold = pWlanParams->RtsThreshold; 2001 break; 2002 2003 case TWD_FRAG_THRESHOLD_PARAM_ID: 2004 pParamInfo->content.halCtrlFragThreshold = pWlanParams->FragmentThreshold; 2005 break; 2006 2007 case TWD_COUNTERS_PARAM_ID: 2008 /* Constant zero because the ACX last buffer next pointer is always pointed 2009 to itself, so it's like an endless buffer*/ 2010 pParamInfo->content.halCtrlCounters.RecvNoBuffer = 0; 2011 pParamInfo->content.halCtrlCounters.FragmentsRecv = 0; /* not supported;*/ 2012 pParamInfo->content.halCtrlCounters.FrameDuplicates = 0;/* not supported*/ 2013 pParamInfo->content.halCtrlCounters.FcsErrors = DB_CNT(hCmdBld).FcsErrCnt; 2014 pParamInfo->content.halCtrlCounters.RecvError = DB_CNT(hCmdBld).FcsErrCnt; 2015 break; 2016 2017 case TWD_LISTEN_INTERVAL_PARAM_ID: 2018 pParamInfo->content.halCtrlListenInterval = pWlanParams->ListenInterval; 2019 break; 2020 2021 case TWD_RSN_DEFAULT_KEY_ID_PARAM_ID: 2022 /* Not implemented */ 2023 return TI_NOK; 2024 2025 case TWD_RSN_SECURITY_MODE_PARAM_ID: 2026 pParamInfo->content.rsnEncryptionStatus = pCmdBld->tSecurity.eSecurityMode; 2027 break; 2028 2029 case TWD_ACX_STATISTICS_PARAM_ID: 2030 /* Not implemented */ 2031 #if 0 2032 { 2033 acxStatisitcs_t acxStatisitics; 2034 pParamInfo->content.acxStatisitics.FWpacketReceived = acxStatisitics.FWpacketReceived; 2035 /* Not supported */ 2036 pParamInfo->content.acxStatisitics.HALpacketReceived = 0; 2037 } 2038 #endif 2039 return TI_NOK; 2040 2041 case TWD_MEDIUM_OCCUPANCY_PARAM_ID: 2042 if (cmdBld_ItrIeMediumOccupancy (hCmdBld, pParamInfo->content.interogateCmdCBParams) != TI_OK) 2043 return TI_NOK; 2044 break; 2045 2046 case TWD_TSF_DTIM_MIB_PARAM_ID: 2047 if (cmdBld_ItrIeTfsDtim (hCmdBld, pParamInfo->content.interogateCmdCBParams) != TI_OK) 2048 return TI_NOK; 2049 break; 2050 2051 case TWD_AID_PARAM_ID: 2052 if (cmdBld_GetCurrentAssociationId (hCmdBld, &pParamInfo->content.halCtrlAid) != TI_OK) 2053 return TI_NOK; 2054 2055 TRACE1(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION , " AID 2 %d\n", pParamInfo->content.halCtrlAid); 2056 break; 2057 2058 case TWD_NOISE_HISTOGRAM_PARAM_ID: 2059 if (cmdBld_ItrIeNoiseHistogramResults (hCmdBld, pParamInfo->content.interogateCmdCBParams) != TI_OK) 2060 { 2061 return TI_NOK; 2062 } 2063 break; 2064 2065 case TWD_CURRENT_CHANNEL_PARAM_ID: 2066 /* Get current channel number */ 2067 pParamInfo->content.halCtrlCurrentChannel = DB_BSS(hCmdBld).RadioChannel; 2068 break; 2069 2070 /* SNR and RSSI belongs to the same MIB, and the relevant CB is passed here*/ 2071 case TWD_RSSI_LEVEL_PARAM_ID: 2072 case TWD_SNR_RATIO_PARAM_ID: 2073 /* Retrive the Callback function and read buffer pointer that are in fact stored in the TIWLAN_ADAPTER and then send it to the Command Mailbox */ 2074 cmdBld_ItrRSSI (hCmdBld, 2075 pParamInfo->content.interogateCmdCBParams.fCb, 2076 pParamInfo->content.interogateCmdCBParams.hCb, 2077 pParamInfo->content.interogateCmdCBParams.pCb); 2078 break; 2079 2080 case TWD_BCN_BRC_OPTIONS_PARAM_ID: 2081 pParamInfo->content.BcnBrcOptions.BeaconRxTimeout = pWlanParams->BcnBrcOptions.BeaconRxTimeout; 2082 pParamInfo->content.BcnBrcOptions.BroadcastRxTimeout = pWlanParams->BcnBrcOptions.BroadcastRxTimeout; 2083 pParamInfo->content.BcnBrcOptions.RxBroadcastInPs = pWlanParams->BcnBrcOptions.RxBroadcastInPs; 2084 break; 2085 2086 case TWD_MAX_RX_MSDU_LIFE_TIME_PARAM_ID: 2087 pParamInfo->content.halCtrlMaxRxMsduLifetime = pWlanParams->MaxRxMsduLifetime; 2088 break; 2089 2090 case TWD_TX_RATE_CLASS_PARAM_ID: 2091 pParamInfo->content.pTxRatePlicy = &DB_BSS(hCmdBld).TxRateClassParams; 2092 break; 2093 2094 case TWD_SG_CONFIG_PARAM_ID: 2095 return cmdBld_ItrSg (hCmdBld, 2096 pParamInfo->content.interogateCmdCBParams.fCb, 2097 pParamInfo->content.interogateCmdCBParams.hCb, 2098 (void*)pParamInfo->content.interogateCmdCBParams.pCb); 2099 2100 case TWD_TX_POWER_PARAM_ID: 2101 pParamInfo->content.halCtrlTxPowerDbm = DB_WLAN(hCmdBld).TxPowerDbm; 2102 break; 2103 2104 case TWD_RADIO_TEST_PARAM_ID: 2105 TRACE0(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION , "Radio Test\n"); 2106 return cmdBld_CmdTest (hCmdBld, 2107 pParamInfo->content.interogateCmdCBParams.fCb, 2108 pParamInfo->content.interogateCmdCBParams.hCb, 2109 (TTestCmd*)pParamInfo->content.interogateCmdCBParams.pCb); 2110 2111 case TWD_DCO_ITRIM_PARAMS_ID: 2112 pParamInfo->content.tDcoItrimParams.enable = pWlanParams->dcoItrimEnabled; 2113 pParamInfo->content.tDcoItrimParams.moderationTimeoutUsec = pWlanParams->dcoItrimModerationTimeoutUsec; 2114 break; 2115 2116 default: 2117 TRACE1(pCmdBld->hReport, REPORT_SEVERITY_ERROR, "cmdBld_GetParam - ERROR - Param is not supported, %d\n\n", pParamInfo->paramType); 2118 return (PARAM_NOT_SUPPORTED); 2119 } 2120 2121 return TI_OK; 2122 } 2123 2124 2125 static TI_STATUS cmdBld_ReadMibBeaconFilterIETable (TI_HANDLE hCmdBld, TI_HANDLE hCb, void* fCb, void* pCb) 2126 { 2127 TCmdBld *pCmdBld = (TCmdBld *)hCmdBld; 2128 TMib *pMib = (TMib*)pCb; 2129 TCmdQueueInterrogateCb RetFunc = (TCmdQueueInterrogateCb)fCb; 2130 TI_UINT8 IETableSize = 0; 2131 2132 /*Get params*/ 2133 pMib->aData.BeaconFilter.iNumberOfIEs = DB_WLAN(hCmdBld).beaconFilterIETable.numberOfIEs; 2134 IETableSize = DB_WLAN(hCmdBld).beaconFilterIETable.IETableSize; 2135 2136 os_memoryZero (pCmdBld->hOs, 2137 pMib->aData.BeaconFilter.iIETable, 2138 sizeof(pMib->aData.BeaconFilter.iIETable)); 2139 2140 os_memoryCopy (pCmdBld->hOs, 2141 pMib->aData.BeaconFilter.iIETable, 2142 DB_WLAN(hCmdBld).beaconFilterIETable.IETable, 2143 IETableSize); 2144 2145 pMib->Length = IETableSize + 1; 2146 2147 RetFunc(hCb, TI_OK, pCb); 2148 2149 return TI_OK; 2150 } 2151 2152 /** 2153 * \author \n 2154 * \date \n 2155 * \brief Coordinates between legacy TxRatePolicy implementation and the MIB format: \n 2156 * Converts the pGwsi_txRatePolicy back to whal commands 2157 * Activates the whal whalCtrl_set function 2158 * Function Scope \e Public.\n 2159 * \param - \n 2160 * \return \n 2161 */ 2162 static TI_STATUS cmdBld_ReadMibTxRatePolicy (TI_HANDLE hCmdBld, TI_HANDLE hCb, void* fCb, void* pCb) 2163 { 2164 TMib* pMib = (TMib*)pCb; 2165 TCmdQueueInterrogateCb RetFunc = (TCmdQueueInterrogateCb)fCb; 2166 TTwdParamInfo param; 2167 TI_STATUS status = TI_OK; 2168 2169 param.paramType = TWD_TX_RATE_CLASS_PARAM_ID; 2170 cmdBld_GetParam (hCmdBld, ¶m); 2171 if (param.content.pTxRatePlicy == NULL) 2172 return TI_NOK; 2173 2174 /*Copy the data form the param to the MIB*/ 2175 pMib->aData.txRatePolicy = *param.content.pTxRatePlicy; 2176 pMib->Length = pMib->aData.txRatePolicy.numOfRateClasses * sizeof(pMib->aData.txRatePolicy.rateClass[0]) + 2177 sizeof(pMib->aData.txRatePolicy.numOfRateClasses); 2178 RetFunc (hCb, status, pCb); 2179 return status; 2180 } 2181 2182 2183 TI_STATUS cmdBld_ReadMib (TI_HANDLE hCmdBld, TI_HANDLE hCb, void* fCb, void* pCb) 2184 { 2185 TCmdBld *pCmdBld = (TCmdBld *)hCmdBld; 2186 TMib *pMibBuf = (TMib*)pCb; 2187 TCmdQueueInterrogateCb RetFunc = (TCmdQueueInterrogateCb)fCb; 2188 TI_STATUS Status = TI_OK; 2189 2190 TRACE1(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, "cmdBld_ReadMib :pMibBuf %p:\n",pMibBuf); 2191 2192 TRACE1(pCmdBld->hReport, REPORT_SEVERITY_INFORMATION, "cmdBld_ReadMib :aMib %x:\n", pMibBuf->aMib); 2193 2194 switch (pMibBuf->aMib) 2195 { 2196 case MIB_dot11MaxReceiveLifetime: 2197 { 2198 TTwdParamInfo ParamInfo; 2199 ParamInfo.paramType = TWD_MAX_RX_MSDU_LIFE_TIME_PARAM_ID; 2200 ParamInfo.paramLength = sizeof(ParamInfo.content.halCtrlMaxRxMsduLifetime); 2201 Status = cmdBld_GetParam (hCmdBld, &ParamInfo); 2202 pMibBuf->aData.MaxReceiveLifeTime = ParamInfo.content.halCtrlMaxRxMsduLifetime / 1024; /* converting from usecs to TUs*/ 2203 pMibBuf->Length = sizeof(pMibBuf->aData.MaxReceiveLifeTime); 2204 } 2205 break; 2206 2207 case MIB_dot11GroupAddressesTable: 2208 { 2209 Status = cmdBld_GetGroupAddressTable (hCmdBld, 2210 &pMibBuf->aData.GroupAddressTable.bFilteringEnable, 2211 &pMibBuf->aData.GroupAddressTable.nNumberOfAddresses, 2212 pMibBuf->aData.GroupAddressTable.aGroupTable); 2213 2214 pMibBuf->Length = sizeof(pMibBuf->aData.GroupAddressTable.bFilteringEnable) + 2215 sizeof(pMibBuf->aData.GroupAddressTable.nNumberOfAddresses) + 2216 pMibBuf->aData.GroupAddressTable.nNumberOfAddresses * sizeof(TMacAddr); 2217 } 2218 break; 2219 2220 case MIB_ctsToSelf: 2221 { 2222 TTwdParamInfo ParamInfo; 2223 ParamInfo.paramType = TWD_CTS_TO_SELF_PARAM_ID; 2224 ParamInfo.paramLength = sizeof(ParamInfo.content.halCtrlCtsToSelf); 2225 Status = cmdBld_GetParam (hCmdBld, &ParamInfo); 2226 pMibBuf->aData.CTSToSelfEnable = ParamInfo.content.halCtrlCtsToSelf; 2227 pMibBuf->Length = sizeof(pMibBuf->aData.CTSToSelfEnable); 2228 } 2229 break; 2230 2231 case MIB_arpIpAddressesTable: 2232 { 2233 TIpAddr IpAddress; 2234 EIpVer IPver; 2235 TI_UINT8 Enable; 2236 2237 pMibBuf->Length = sizeof(TMibArpIpAddressesTable); 2238 Status = cmdBld_GetArpIpAddressesTable (hCmdBld, &IpAddress, &Enable, &IPver); 2239 if (Status == TI_OK) 2240 { 2241 pMibBuf->aData.ArpIpAddressesTable.FilteringEnable = Enable; 2242 2243 if (IP_VER_4 == IPver) /* IP_VER_4 only */ 2244 { 2245 IP_COPY (pMibBuf->aData.ArpIpAddressesTable.addr, IpAddress); 2246 } 2247 else 2248 { 2249 Status = TI_NOK; 2250 } 2251 } 2252 return Status; 2253 } 2254 2255 case MIB_rxFilter: 2256 { 2257 TI_UINT32 RxConfigOption; 2258 TI_UINT32 RxFilterOption; 2259 2260 pMibBuf->Length = 1; 2261 pMibBuf->aData.RxFilter = 0; 2262 2263 /* Get RX filter data */ 2264 Status = cmdBld_GetRxFilters (hCmdBld, &RxConfigOption, &RxFilterOption); 2265 if (TI_OK == Status) 2266 { 2267 /*Translate to MIB bitmap*/ 2268 if ((RxConfigOption & RX_CFG_MAC) == RX_CFG_ENABLE_ANY_DEST_MAC) 2269 pMibBuf->aData.RxFilter |= MIB_RX_FILTER_PROMISCOUS_SET; 2270 2271 if ((RxConfigOption & RX_CFG_BSSID) == RX_CFG_ENABLE_ONLY_MY_BSSID) 2272 pMibBuf->aData.RxFilter |= MIB_RX_FILTER_BSSID_SET; 2273 } 2274 } 2275 break; 2276 2277 case MIB_beaconFilterIETable: 2278 return cmdBld_ReadMibBeaconFilterIETable (hCmdBld, hCb, fCb, pCb); 2279 2280 case MIB_txRatePolicy: 2281 return cmdBld_ReadMibTxRatePolicy (hCmdBld, hCb, fCb, pCb); 2282 2283 case MIB_countersTable: 2284 return cmdBld_ItrErrorCnt (hCmdBld, fCb, hCb, pCb); 2285 2286 case MIB_statisticsTable: 2287 return cmdBld_ItrRoamimgStatisitics (hCmdBld, fCb, hCb, pCb); 2288 2289 default: 2290 TRACE1(pCmdBld->hReport, REPORT_SEVERITY_ERROR, "TWD_ReadMib:MIB aMib 0x%x Not supported\n",pMibBuf->aMib); 2291 return TI_NOK; 2292 } 2293 2294 if(RetFunc) 2295 RetFunc(hCb, Status, pCb); 2296 2297 return TI_OK; 2298 } 2299 2300 2301 TI_STATUS cmdBld_GetGroupAddressTable (TI_HANDLE hCmdBld, TI_UINT8* pEnabled, TI_UINT8* pNumGroupAddrs, TMacAddr *pGroupAddr) 2302 { 2303 TCmdBld *pCmdBld = (TCmdBld *)hCmdBld; 2304 TI_UINT32 i; 2305 2306 if (NULL == pEnabled || NULL == pNumGroupAddrs || NULL == pGroupAddr) 2307 { 2308 TRACE3(pCmdBld->hReport, REPORT_SEVERITY_ERROR, "cmdBld_GetGroupAddressTable: pisEnabled=0x%p pnumGroupAddrs=0x%p Group_addr=0x%p !!!\n", pEnabled, pNumGroupAddrs, pGroupAddr); 2309 return PARAM_VALUE_NOT_VALID; 2310 } 2311 2312 *pNumGroupAddrs = DB_WLAN(hCmdBld).numGroupAddrs; 2313 *pEnabled = DB_WLAN(hCmdBld).isMacAddrFilteringnabled; 2314 2315 os_memoryZero (pCmdBld->hOs, pGroupAddr, sizeof(pGroupAddr)); 2316 for (i = 0; i < *pNumGroupAddrs; i++) 2317 { 2318 os_memoryCopy (pCmdBld->hOs, 2319 (void *)&((*pGroupAddr)[MAC_ADDR_LEN*i]), 2320 &DB_WLAN(hCmdBld).aGroupAddr[i], 2321 MAC_ADDR_LEN); 2322 } 2323 2324 return TI_OK; 2325 } 2326 2327 2328 TI_STATUS cmdBld_GetRxFilters (TI_HANDLE hCmdBld, TI_UINT32* pRxConfigOption, TI_UINT32* pRxFilterOption) 2329 { 2330 *pRxConfigOption = DB_WLAN(hCmdBld).RxConfigOption; 2331 *pRxFilterOption = DB_WLAN(hCmdBld).RxFilterOption; 2332 2333 return TI_OK; 2334 } 2335 2336 2337 TFwInfo * cmdBld_GetFWInfo (TI_HANDLE hCmdBld) 2338 { 2339 return &DB_HW(hCmdBld); 2340 } 2341 2342 2343 2344 TI_STATUS cmdBld_SetRadioBand (TI_HANDLE hCmdBld, ERadioBand eRadioBand) 2345 { 2346 DB_WLAN(hCmdBld).RadioBand = eRadioBand; 2347 2348 return TI_OK; 2349 } 2350 2351 2352 /**************************************************************************** 2353 * cmdBld_CurrentAssociationIdGet() 2354 **************************************************************************** 2355 * DESCRIPTION: Get the current TX antenna 2356 * 2357 * INPUTS: 2358 * 2359 * OUTPUT: 2360 * 2361 * RETURNS: TI_OK or TI_NOK 2362 ****************************************************************************/ 2363 TI_STATUS cmdBld_GetCurrentAssociationId (TI_HANDLE hCmdBld, TI_UINT16 *pAidVal) 2364 { 2365 *pAidVal = DB_WLAN(hCmdBld).Aid; 2366 2367 return TI_OK; 2368 } 2369 2370 2371 /**************************************************************************** 2372 * cmdBld_GetArpIpAddressesTable() 2373 **************************************************************************** 2374 * DESCRIPTION: Sets the Group table according to the given configuration. 2375 * 2376 * OUTPUT: None 2377 * 2378 * RETURNS: TI_OK or TI_NOK 2379 ****************************************************************************/ 2380 TI_STATUS cmdBld_GetArpIpAddressesTable (TI_HANDLE hCmdBld, TIpAddr *pIp, TI_UINT8* pbEnabled, EIpVer *pIpVer) 2381 { 2382 *pIpVer = (EIpVer)DB_WLAN(hCmdBld).arp_IP_ver; 2383 2384 IP_COPY (*pIp, DB_WLAN(hCmdBld).arp_IP_addr); 2385 2386 *pbEnabled = (TI_UINT8)DB_WLAN(hCmdBld).arpFilterType; 2387 2388 return TI_OK; 2389 } 2390 2391 2392 TI_STATUS cmdBld_ConvertAppRatesBitmap (TI_UINT32 uAppRatesBitmap, TI_UINT32 uAppModulation, EHwRateBitFiled *pHwRatesBitmap) 2393 { 2394 EHwRateBitFiled uRatesBitmap = 0; 2395 2396 if (uAppRatesBitmap & DRV_RATE_MASK_1_BARKER) uRatesBitmap |= HW_BIT_RATE_1MBPS; 2397 if (uAppRatesBitmap & DRV_RATE_MASK_2_BARKER) uRatesBitmap |= HW_BIT_RATE_2MBPS; 2398 if (uAppRatesBitmap & DRV_RATE_MASK_5_5_CCK) uRatesBitmap |= HW_BIT_RATE_5_5MBPS; 2399 if (uAppRatesBitmap & DRV_RATE_MASK_11_CCK) uRatesBitmap |= HW_BIT_RATE_11MBPS; 2400 if (uAppRatesBitmap & DRV_RATE_MASK_22_PBCC) uRatesBitmap |= HW_BIT_RATE_22MBPS; 2401 if (uAppRatesBitmap & DRV_RATE_MASK_6_OFDM) uRatesBitmap |= HW_BIT_RATE_6MBPS; 2402 if (uAppRatesBitmap & DRV_RATE_MASK_9_OFDM) uRatesBitmap |= HW_BIT_RATE_9MBPS; 2403 if (uAppRatesBitmap & DRV_RATE_MASK_12_OFDM) uRatesBitmap |= HW_BIT_RATE_12MBPS; 2404 if (uAppRatesBitmap & DRV_RATE_MASK_18_OFDM) uRatesBitmap |= HW_BIT_RATE_18MBPS; 2405 if (uAppRatesBitmap & DRV_RATE_MASK_24_OFDM) uRatesBitmap |= HW_BIT_RATE_24MBPS; 2406 if (uAppRatesBitmap & DRV_RATE_MASK_36_OFDM) uRatesBitmap |= HW_BIT_RATE_36MBPS; 2407 if (uAppRatesBitmap & DRV_RATE_MASK_48_OFDM) uRatesBitmap |= HW_BIT_RATE_48MBPS; 2408 if (uAppRatesBitmap & DRV_RATE_MASK_54_OFDM) uRatesBitmap |= HW_BIT_RATE_54MBPS; 2409 if (uAppRatesBitmap & DRV_RATE_MASK_MCS_0_OFDM) uRatesBitmap |= HW_BIT_RATE_MCS_0; 2410 if (uAppRatesBitmap & DRV_RATE_MASK_MCS_1_OFDM) uRatesBitmap |= HW_BIT_RATE_MCS_1; 2411 if (uAppRatesBitmap & DRV_RATE_MASK_MCS_2_OFDM) uRatesBitmap |= HW_BIT_RATE_MCS_2; 2412 if (uAppRatesBitmap & DRV_RATE_MASK_MCS_3_OFDM) uRatesBitmap |= HW_BIT_RATE_MCS_3; 2413 if (uAppRatesBitmap & DRV_RATE_MASK_MCS_4_OFDM) uRatesBitmap |= HW_BIT_RATE_MCS_4; 2414 if (uAppRatesBitmap & DRV_RATE_MASK_MCS_5_OFDM) uRatesBitmap |= HW_BIT_RATE_MCS_5; 2415 if (uAppRatesBitmap & DRV_RATE_MASK_MCS_6_OFDM) uRatesBitmap |= HW_BIT_RATE_MCS_6; 2416 if (uAppRatesBitmap & DRV_RATE_MASK_MCS_7_OFDM) uRatesBitmap |= HW_BIT_RATE_MCS_7; 2417 2418 *pHwRatesBitmap = uRatesBitmap; 2419 2420 return TI_OK; 2421 } 2422 2423 EHwRateBitFiled rateNumberToBitmap(TI_UINT8 uRate) 2424 { 2425 switch(uRate) 2426 { 2427 case 1: return HW_BIT_RATE_1MBPS; 2428 case 2: return HW_BIT_RATE_2MBPS; 2429 case 5: return HW_BIT_RATE_5_5MBPS; 2430 case 6: return HW_BIT_RATE_6MBPS; 2431 case 9: return HW_BIT_RATE_9MBPS; 2432 case 11: return HW_BIT_RATE_11MBPS; 2433 case 12: return HW_BIT_RATE_12MBPS; 2434 case 18: return HW_BIT_RATE_18MBPS; 2435 case 22: return HW_BIT_RATE_22MBPS; 2436 case 24: return HW_BIT_RATE_24MBPS; 2437 case 36: return HW_BIT_RATE_36MBPS; 2438 case 48: return HW_BIT_RATE_48MBPS; 2439 case 54: return HW_BIT_RATE_54MBPS; 2440 default: 2441 return 0; 2442 } 2443 } 2444 2445 TI_STATUS cmdBld_ConvertAppRate (ERate AppRate, TI_UINT8 *pHwRate) 2446 { 2447 TI_UINT8 Rate = 0; 2448 TI_STATUS status = TI_OK; 2449 2450 switch (AppRate) 2451 { 2452 /* 2453 * The handle for 5.5/11/22 PBCC was removed !!! 2454 */ 2455 2456 case DRV_RATE_1M: Rate = txPolicy1; break; 2457 case DRV_RATE_2M: Rate = txPolicy2; break; 2458 case DRV_RATE_5_5M: Rate = txPolicy5_5; break; 2459 case DRV_RATE_11M: Rate = txPolicy11; break; 2460 case DRV_RATE_22M: Rate = txPolicy22; break; 2461 case DRV_RATE_6M: Rate = txPolicy6; break; 2462 case DRV_RATE_9M: Rate = txPolicy9; break; 2463 case DRV_RATE_12M: Rate = txPolicy12; break; 2464 case DRV_RATE_18M: Rate = txPolicy18; break; 2465 case DRV_RATE_24M: Rate = txPolicy24; break; 2466 case DRV_RATE_36M: Rate = txPolicy36; break; 2467 case DRV_RATE_48M: Rate = txPolicy48; break; 2468 case DRV_RATE_54M: Rate = txPolicy54; break; 2469 case DRV_RATE_MCS_0: Rate = txPolicyMcs0; break; 2470 case DRV_RATE_MCS_1: Rate = txPolicyMcs1; break; 2471 case DRV_RATE_MCS_2: Rate = txPolicyMcs2; break; 2472 case DRV_RATE_MCS_3: Rate = txPolicyMcs3; break; 2473 case DRV_RATE_MCS_4: Rate = txPolicyMcs4; break; 2474 case DRV_RATE_MCS_5: Rate = txPolicyMcs5; break; 2475 case DRV_RATE_MCS_6: Rate = txPolicyMcs6; break; 2476 case DRV_RATE_MCS_7: Rate = txPolicyMcs7; break; 2477 2478 default: 2479 WLAN_OS_REPORT(("%s wrong app rate = %d\n",__FUNCTION__,AppRate)); 2480 status = TI_NOK; 2481 break; 2482 } 2483 2484 if (status == TI_OK) 2485 *pHwRate = Rate; 2486 else 2487 *pHwRate = txPolicy1; 2488 2489 return status; 2490 } 2491 2492 2493 TI_STATUS cmdBld_SetRxFilter (TI_HANDLE hCmdBld, TI_UINT32 uRxConfigOption, TI_UINT32 uRxFilterOption) 2494 { 2495 DB_WLAN(hCmdBld).RxConfigOption = uRxConfigOption; 2496 DB_WLAN(hCmdBld).RxFilterOption = uRxFilterOption; 2497 DB_WLAN(hCmdBld).RxConfigOption |= RX_CFG_ENABLE_PHY_HEADER_PLCP; 2498 2499 if (DB_WLAN(hCmdBld).RxDisableBroadcast) 2500 { 2501 DB_WLAN(hCmdBld).RxConfigOption |= RX_CFG_DISABLE_BCAST; 2502 } 2503 2504 return TI_OK; 2505 } 2506 2507 2508 TI_UINT8 cmdBld_GetBssType (TI_HANDLE hCmdBld) 2509 { 2510 return DB_BSS(hCmdBld).ReqBssType; 2511 } 2512 2513 2514 TI_UINT32 cmdBld_GetAckPolicy (TI_HANDLE hCmdBld, TI_UINT32 uQueueId) 2515 { 2516 return (TI_UINT32)DB_QUEUES(hCmdBld).queues[uQueueId].ackPolicy; 2517 } 2518 2519 2520 TI_STATUS cmdBld_SetSecuritySeqNum (TI_HANDLE hCmdBld, TI_UINT8 securitySeqNumLsByte) 2521 { 2522 TCmdBld *pCmdBld = (TCmdBld *)hCmdBld; 2523 2524 /* If 8 lsb wrap around occurred (new < old). */ 2525 if ((TI_UINT16)securitySeqNumLsByte < (pCmdBld->uSecuritySeqNumLow & 0xFF)) 2526 { 2527 /* Increment the upper byte of the 16 lsb. */ 2528 pCmdBld->uSecuritySeqNumLow += 0x100; 2529 2530 /* If 16 bit wrap around occurred, increment the upper 32 bit. */ 2531 if (!(pCmdBld->uSecuritySeqNumLow & 0xFF00)) 2532 pCmdBld->uSecuritySeqNumHigh++; 2533 } 2534 2535 /* Save new sequence number 8 lsb (received from the FW). */ 2536 pCmdBld->uSecuritySeqNumLow &= 0xFF00; 2537 pCmdBld->uSecuritySeqNumLow |= (TI_UINT16)securitySeqNumLsByte; 2538 2539 return TI_OK; 2540 } 2541 2542 /**************************************************************************** 2543 * cmdBld_JoinCmpltForReconfigCb() 2544 **************************************************************************** 2545 * DESCRIPTION: The Join-Complete callback used by the reconfig sequenc (see __cmd_start_join()). 2546 * It restores the original Join-Complete CB and continues the sequence. 2547 * It is needed so the reconfig sequence won't progress before the Join 2548 * command is completed (otherwise the FW may drop the other commands). 2549 * 2550 * INPUTS: hCmdBld - The module object 2551 * 2552 * OUTPUT: None 2553 * 2554 * RETURNS: TI_OK 2555 ****************************************************************************/ 2556 static TI_STATUS cmdBld_JoinCmpltForReconfigCb (TI_HANDLE hCmdBld) 2557 { 2558 TCmdBld *pCmdBld = (TCmdBld *)hCmdBld; 2559 void *fDummyCb; 2560 TI_HANDLE hDummyHndl; 2561 2562 /* Restored the original Join-Complete callback function */ 2563 eventMbox_ReplaceEvent (pCmdBld->hEventMbox, 2564 TWD_OWN_EVENT_JOIN_CMPLT, 2565 pCmdBld->fJoinCmpltOriginalCbFunc, 2566 pCmdBld->hJoinCmpltOriginalCbHndl, 2567 &fDummyCb, 2568 &hDummyHndl); 2569 2570 /* Call the reconfig sequence to continue the configuration after Join completion */ 2571 cmdBld_ConfigSeq (hCmdBld); 2572 2573 return TI_OK; 2574 } 2575 2576 2577 2578 static TI_STATUS cmdBld_DummyCb (TI_HANDLE hCmdBld) 2579 { 2580 return TI_OK; 2581 } 2582 2583 2584 2585 2586 2587 #ifdef TI_DBG 2588 2589 void cmdBld_DbgForceTemplatesRates (TI_HANDLE hCmdBld, TI_UINT32 uRateMask) 2590 { 2591 TCmdBld *pCmdBld = (TCmdBld *)hCmdBld; 2592 2593 pCmdBld->uDbgTemplatesRateMask = uRateMask; 2594 } 2595 2596 #endif /* TI_DBG */ 2597 2598