1 /* 2 * txCtrlParams.c 3 * 4 * Copyright(c) 1998 - 2009 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 /* MODULE: txCtrlParams.c */ 37 /* PURPOSE: The txCtrl module parameters handling. */ 38 /* This is a part of the txCtrl module (using the same object). */ 39 /* */ 40 /*******************************************************************************/ 41 42 #define __FILE_ID__ FILE_ID_57 43 #include "tidef.h" 44 #include "report.h" 45 #include "paramOut.h" 46 #include "osApi.h" 47 #include "timer.h" 48 #include "EvHandler.h" 49 #include "txCtrl.h" 50 51 52 53 54 55 /*********************************************************************** 56 * calcCreditFromTimer 57 *********************************************************************** 58 DESCRIPTION: This function is called when credit calculation timer 59 is expired. it calculate the credit for the admission ctrl 60 credit algorithm 61 62 63 INPUT: hTxCtrl - handle to the ts data object 64 bTwdInitOccured - Indicates if TWDriver recovery occured since timer started 65 66 OUTPUT: None 67 68 RETURN: void 69 ************************************************************************/ 70 static void calcCreditFromTimer(TI_HANDLE hTxCtrl, TI_BOOL bTwdInitOccured) 71 { 72 OS_802_11_THRESHOLD_CROSS_INDICATION_PARAMS mediumTimeCross; 73 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl; 74 TI_UINT32 ac; 75 TI_INT32 prevCredit; 76 TI_INT32 highCreditThreshold; 77 TI_INT32 lowCreditThreshold; 78 TI_INT32 usageRatio; 79 TI_INT32 currUsage; 80 TI_INT32 prevUsage; 81 TI_UINT32 currentTimeStamp = os_timeStampMs(pTxCtrl->hOs); /* get current time stamp */ 82 83 /* 84 * For each AC under admission control calculate the new usage and credit time, 85 * and send events if a threshold is crossed. 86 */ 87 for(ac = 0 ; ac < MAX_NUM_OF_AC ; ac++) 88 { 89 /* check if this queue is under admission ctrl operation */ 90 if(pTxCtrl->mediumTime[ac] == 0) 91 { 92 TRACE1(pTxCtrl->hReport, REPORT_SEVERITY_INFORMATION, ": ac = %d mediumTime = 0 \n", ac); 93 94 continue; 95 } 96 97 /* in case of wraparound */ 98 if(currentTimeStamp < pTxCtrl->lastCreditCalcTimeStamp[ac]) 99 pTxCtrl->lastCreditCalcTimeStamp[ac] = 0; 100 101 /* store prev credit */ 102 prevCredit = pTxCtrl->credit[ac]; 103 104 /* Calculate the medium usage ratio: totalUsedTime / mediumTime * 1000 105 Note that since the totalUsedTime is in usec and not msec we don't multiply by 1000. */ 106 usageRatio = pTxCtrl->totalUsedTime[ac] / pTxCtrl->mediumTime[ac]; 107 108 /* calculate credit */ 109 pTxCtrl->credit[ac] += (currentTimeStamp - pTxCtrl->lastCreditCalcTimeStamp[ac]) - usageRatio; 110 111 /* update last time stamp */ 112 pTxCtrl->lastCreditCalcTimeStamp[ac] = currentTimeStamp; 113 114 /* in case credit is bigger than mediumTime -> set credit to medium time */ 115 if (pTxCtrl->credit[ac] > (TI_INT32)(pTxCtrl->mediumTime[ac]) ) 116 pTxCtrl->credit[ac] = pTxCtrl->mediumTime[ac]; 117 118 TRACE2(pTxCtrl->hReport, REPORT_SEVERITY_INFORMATION, "credit = %d | TotalUsedTime = %d\n", pTxCtrl->credit[ac], pTxCtrl->totalUsedTime[ac]/1000); 119 120 /* Check medium-usage threshold cross events */ 121 /*********************************************/ 122 /* 123 * The medium-usage events are defined as follows: 124 * The high threshold triggers event only when crossed upward (traffic increased above threshold). 125 * The low threshold triggers event only when crossed downward (traffic decreased below threshold). 126 * Thus, the two thresholds provide hysteresis and prevent multiple triggering. 127 * The high threshold should be greater than the low threshold. 128 * 129 * Note: The driver doesn't delay traffic even if violating the usage limit! 130 * It only indicates the user application about the thresholds crossing. 131 */ 132 133 highCreditThreshold = (TI_INT32)((pTxCtrl->mediumTime[ac])*(pTxCtrl->highMediumUsageThreshold[ac])/100); 134 lowCreditThreshold = (TI_INT32)((pTxCtrl->mediumTime[ac])*(pTxCtrl->lowMediumUsageThreshold[ac])/100); 135 136 /* The credit is getting more negative as we get closer to the medium usage limit, so we invert 137 it before comparing to the thresholds (lower credit means higher usage). */ 138 currUsage = -pTxCtrl->credit[ac]; 139 prevUsage = -prevCredit; 140 141 /* crossing below the low threshold */ 142 if ( (currUsage < lowCreditThreshold) && (prevUsage >= lowCreditThreshold) ) 143 { 144 /* send event */ 145 mediumTimeCross.uAC = ac; 146 mediumTimeCross.uHighOrLowThresholdFlag = (TI_UINT32)LOW_THRESHOLD_CROSS; 147 mediumTimeCross.uAboveOrBelowFlag = (TI_UINT32)CROSS_BELOW; 148 149 EvHandlerSendEvent(pTxCtrl->hEvHandler, IPC_EVENT_MEDIUM_TIME_CROSS, 150 (TI_UINT8 *)&mediumTimeCross, sizeof(OS_802_11_THRESHOLD_CROSS_INDICATION_PARAMS)); 151 152 TRACE3(pTxCtrl->hReport, REPORT_SEVERITY_INFORMATION, "crossed below low threshold !!! prevUsage = %d, currUsage = %d, lowCreditThreshold = %d\n", prevUsage, currUsage, lowCreditThreshold); 153 } 154 155 /* crossing above the high threshold */ 156 else if ( (currUsage > highCreditThreshold) && (prevUsage <= highCreditThreshold) ) 157 { 158 /* send event */ 159 mediumTimeCross.uAC = ac; 160 mediumTimeCross.uHighOrLowThresholdFlag = (TI_UINT32)HIGH_THRESHOLD_CROSS; 161 mediumTimeCross.uAboveOrBelowFlag = (TI_UINT32)CROSS_ABOVE; 162 163 EvHandlerSendEvent(pTxCtrl->hEvHandler, IPC_EVENT_MEDIUM_TIME_CROSS, 164 (TI_UINT8 *)&mediumTimeCross, sizeof(OS_802_11_THRESHOLD_CROSS_INDICATION_PARAMS)); 165 166 TRACE3(pTxCtrl->hReport, REPORT_SEVERITY_INFORMATION, "crossed above high threshold !!! prevUsage = %d, currUsage = %d, highCreditThreshold = %d\n", prevUsage, currUsage, highCreditThreshold); 167 } 168 169 /* reset totalUsedTime */ 170 pTxCtrl->totalUsedTime[ac] = 0; 171 } 172 } 173 174 175 /**************************************************************************** 176 * updateDataPktPrototype() 177 **************************************************************************** 178 * DESCRIPTION: Updates the data packet prototype values according to 179 changed parameters (e.g. rate policy change). 180 ****************************************************************************/ 181 static void updateDataPktPrototype(txCtrl_t *pTxCtrl) 182 { 183 pTxCtrl->dataPktDescAttrib = pTxCtrl->txSessionCount << TX_ATTR_OFST_SESSION_COUNTER; 184 if (pTxCtrl->headerConverMode == HDR_CONVERT_QOS) 185 { 186 pTxCtrl->dataPktDescAttrib |= TX_ATTR_HEADER_PAD; 187 } 188 } 189 190 191 /*************************************************************************** 192 * txCtrlParams_resetCounters 193 **************************************************************************** 194 * DESCRIPTION: Reset the tx data module counters 195 * 196 * INPUTS: hTxCtrl - the object 197 * 198 * OUTPUT: 199 * 200 * RETURNS: 201 ***************************************************************************/ 202 void txCtrlParams_resetCounters(TI_HANDLE hTxCtrl) 203 { 204 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl; 205 206 os_memoryZero(pTxCtrl->hOs, &pTxCtrl->txDataCounters, sizeof(TTxDataCounters) * MAX_NUM_OF_AC); 207 os_memoryZero(pTxCtrl->hOs, &pTxCtrl->SumTotalDelayUs, sizeof(pTxCtrl->SumTotalDelayUs)); 208 pTxCtrl->currentConsecutiveRetryFail = 0; 209 } 210 211 212 /*************************************************************************** 213 * txCtrlParams_RegNotif * 214 ****************************************************************************/ 215 TI_HANDLE txCtrlParams_RegNotif(TI_HANDLE hTxCtrl, TI_UINT16 EventMask, GeneralEventCall_t CallBack, 216 TI_HANDLE context, TI_UINT32 Cookie) 217 { 218 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl; 219 if (!hTxCtrl) 220 return NULL; 221 return DistributorMgr_Reg(pTxCtrl->TxEventDistributor,EventMask,(TI_HANDLE)CallBack,context,Cookie); 222 } 223 224 225 /*************************************************************************** 226 * txCtrlParams_AddToNotifMask * 227 ****************************************************************************/ 228 TI_STATUS txCtrlParams_AddToNotifMask(TI_HANDLE hTxCtrl, TI_HANDLE Notifh, TI_UINT16 EventMask) 229 { 230 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl; 231 if (!hTxCtrl) 232 return TI_NOK; 233 return DistributorMgr_AddToMask(pTxCtrl->TxEventDistributor, Notifh, EventMask); 234 } 235 236 237 /*************************************************************************** 238 * txCtrlParams_UnRegNotif * 239 ****************************************************************************/ 240 TI_STATUS txCtrlParams_UnRegNotif(TI_HANDLE hTxCtrl, TI_HANDLE RegEventHandle) 241 { 242 TI_STATUS status; 243 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl; 244 245 if (!hTxCtrl) 246 return TI_NOK; 247 248 return (status = DistributorMgr_UnReg(pTxCtrl->TxEventDistributor,RegEventHandle)); 249 } 250 251 252 /*********************************************************************** 253 * txCtrlParams_setAdmissionCtrlParams 254 *********************************************************************** 255 DESCRIPTION: This function is called for add/delete a tspec in order 256 to update parameters. 257 258 INPUT: hTxCtrl - handale to the ts data object 259 acId - the AC of the tspec 260 mediumTime - tha alocated medium time for this UP 261 minimumPHYRate - the min phy rate to send a packet of this UP 262 admFlag - indicate if the its addition or deletion of tspec 263 264 OUTPUT: None 265 266 RETURN: void 267 ************************************************************************/ 268 TI_STATUS txCtrlParams_setAdmissionCtrlParams(TI_HANDLE hTxCtrl, TI_UINT8 acId, TI_UINT16 mediumTime, 269 TI_UINT32 minimumPHYRate, TI_BOOL admFlag) 270 { 271 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl; 272 TI_UINT32 i; 273 274 if(admFlag == TI_TRUE) 275 { 276 /* tspec added */ 277 pTxCtrl->mediumTime[acId] = mediumTime; 278 pTxCtrl->admissionState[acId] = AC_ADMITTED; 279 pTxCtrl->useAdmissionAlgo[acId] = TI_TRUE; 280 pTxCtrl->lastCreditCalcTimeStamp[acId] = os_timeStampMs(pTxCtrl->hOs); 281 pTxCtrl->credit[acId] = mediumTime; 282 } 283 else 284 { 285 /* tspaec deleted */ 286 pTxCtrl->mediumTime[acId] = 0; 287 pTxCtrl->admissionState[acId] = AC_NOT_ADMITTED; 288 pTxCtrl->useAdmissionAlgo[acId] = TI_FALSE; 289 pTxCtrl->lastCreditCalcTimeStamp[acId] = 0; 290 pTxCtrl->credit[acId] = 0; 291 } 292 293 /* Update the Tx queues mapping after admission change. */ 294 txCtrl_UpdateQueuesMapping (hTxCtrl); 295 296 /* If the timer was not enabled in registry than we will never set it */ 297 if (pTxCtrl->bCreditCalcTimerEnabled) 298 { 299 /* enable disable credit calculation timer */ 300 for (i = 0; i < MAX_NUM_OF_AC; i++) 301 { 302 if (pTxCtrl->useAdmissionAlgo[i]) 303 { 304 if (!pTxCtrl->bCreditCalcTimerRunning) 305 { 306 pTxCtrl->bCreditCalcTimerRunning = TI_TRUE; 307 tmr_StartTimer (pTxCtrl->hCreditTimer, 308 calcCreditFromTimer, 309 (TI_HANDLE)pTxCtrl, 310 pTxCtrl->creditCalculationTimeout, 311 TI_TRUE); 312 } 313 314 return TI_OK; 315 } 316 } 317 318 /* in all queues useAdmissionAlgo is not TRUE, so stop timer if running */ 319 if (pTxCtrl->bCreditCalcTimerRunning) 320 { 321 tmr_StopTimer (pTxCtrl->hCreditTimer); 322 pTxCtrl->bCreditCalcTimerRunning = TI_FALSE; 323 } 324 } 325 326 return TI_OK; 327 } 328 329 330 /*************************************************************************** 331 * txCtrlParams_getParam 332 **************************************************************************** 333 * DESCRIPTION: Get a specific parameter by an external user application. 334 * 335 * OUTPUT: pParamInfo - structure which include the value of 336 * the requested parameter 337 ***************************************************************************/ 338 TI_STATUS txCtrlParams_getParam(TI_HANDLE hTxCtrl, paramInfo_t *pParamInfo) 339 { 340 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl; 341 TI_UINT32 ac; 342 343 if(pTxCtrl == NULL) /* check handle validity */ 344 { 345 return TI_NOK; 346 } 347 348 switch (pParamInfo->paramType) 349 { 350 case TX_CTRL_COUNTERS_PARAM: 351 /* Convert total-delays units from usec to mSec. */ 352 for(ac = 0 ; ac < MAX_NUM_OF_AC ; ac++) 353 { 354 pTxCtrl->txDataCounters[ac].SumTotalDelayMs = pTxCtrl->SumTotalDelayUs[ac] / 1000; 355 } 356 os_memoryCopy( pTxCtrl->hOs, pParamInfo->content.pTxDataCounters, &(pTxCtrl->txDataCounters[0]), 357 sizeof(TTxDataCounters) * MAX_NUM_OF_AC); 358 pParamInfo->paramLength = sizeof(TTxDataCounters) * MAX_NUM_OF_AC; 359 break; 360 361 case TX_CTRL_GET_DATA_FRAME_COUNTER: 362 pParamInfo->content.txPacketsCount = 0; 363 for (ac = 0; ac < MAX_NUM_OF_AC; ac++) 364 pParamInfo->content.txPacketsCount += pTxCtrl->txDataCounters[ac].XmitOk; 365 break; 366 367 case TX_CTRL_REPORT_TS_STATISTICS: 368 ac = pParamInfo->content.tsMetricsCounters.acID; 369 os_memoryCopy(pTxCtrl->hOs, 370 pParamInfo->content.tsMetricsCounters.pTxDataCounters, 371 &(pTxCtrl->txDataCounters[ac]), 372 sizeof(TTxDataCounters)); 373 os_memoryZero(pTxCtrl->hOs, &(pTxCtrl->txDataCounters[ac]), sizeof(TTxDataCounters)); 374 break; 375 376 377 default: 378 TRACE0(pTxCtrl->hReport, REPORT_SEVERITY_ERROR, ": PARAMETER NOT SUPPORTED\n"); 379 return PARAM_NOT_SUPPORTED; 380 break; 381 } 382 383 return TI_OK; 384 } 385 386 387 /*************************************************************************** 388 * txCtrlParams_setParam 389 **************************************************************************** 390 * DESCRIPTION: Set a specific parameter by an external user application. 391 * 392 * INPUTS: hTxCtrl - the object 393 * pParamInfo - structure which include the value to set for 394 * the requested parameter 395 ***************************************************************************/ 396 TI_STATUS txCtrlParams_setParam(TI_HANDLE hTxCtrl, paramInfo_t *pParamInfo) 397 { 398 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl; 399 TI_UINT8 acID; 400 401 if(pTxCtrl == NULL) /* check handle validity */ 402 { 403 return TI_NOK; 404 } 405 406 switch (pParamInfo->paramType) 407 { 408 case TX_CTRL_SET_MEDIUM_USAGE_THRESHOLD: 409 acID = (TI_UINT8)pParamInfo->content.txDataMediumUsageThreshold.uAC; 410 if(acID < MAX_NUM_OF_AC) 411 { 412 pTxCtrl->highMediumUsageThreshold[acID] = 413 pParamInfo->content.txDataMediumUsageThreshold.uHighThreshold; 414 pTxCtrl->lowMediumUsageThreshold[acID] = 415 pParamInfo->content.txDataMediumUsageThreshold.uLowThreshold; 416 } 417 else 418 TRACE1(pTxCtrl->hReport, REPORT_SEVERITY_ERROR, ": Wrong AC (AC=%d > 3)\n", acID); 419 break; 420 421 case TX_CTRL_GET_MEDIUM_USAGE_THRESHOLD: 422 /* Note: SET operation is used for GET, because AC parameter should be supplied from Utility- 423 Adapter to driver (copy of user supplied block of data is only performed in SetParam calls). */ 424 acID = (TI_UINT8)pParamInfo->content.txDataMediumUsageThreshold.uAC; 425 pParamInfo->content.txDataMediumUsageThreshold.uHighThreshold = pTxCtrl->highMediumUsageThreshold[acID]; 426 pParamInfo->content.txDataMediumUsageThreshold.uLowThreshold = pTxCtrl->lowMediumUsageThreshold[acID]; 427 break; 428 429 case TX_CTRL_POLL_AP_PACKETS_FROM_AC: 430 TRACE0(pTxCtrl->hReport, REPORT_SEVERITY_ERROR, ": Poll-AP is not supported in this version!!\n"); 431 return PARAM_NOT_SUPPORTED; 432 433 case TX_CTRL_RESET_COUNTERS_PARAM: 434 txCtrlParams_resetCounters(hTxCtrl); 435 break; 436 437 default: 438 TRACE0(pTxCtrl->hReport, REPORT_SEVERITY_ERROR, ": PARAMETER NOT SUPPORTED\n"); 439 return PARAM_NOT_SUPPORTED; 440 } 441 442 return TI_OK; 443 } 444 445 446 /*********************************************************************** 447 * txCtrlParams_setBssId 448 *********************************************************************** 449 DESCRIPTION: Update the BSS-ID. 450 ************************************************************************/ 451 void txCtrlParams_setBssId (TI_HANDLE hTxCtrl, TMacAddr *pCurrBssId) 452 { 453 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl; 454 455 MAC_COPY (pTxCtrl->currBssId, *pCurrBssId); 456 } 457 458 459 /*********************************************************************** 460 * txCtrlParams_setBssType 461 *********************************************************************** 462 DESCRIPTION: Update the BSS type. 463 ************************************************************************/ 464 void txCtrlParams_setBssType (TI_HANDLE hTxCtrl, ScanBssType_e currBssType) 465 { 466 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl; 467 468 pTxCtrl->currBssType = currBssType; 469 } 470 471 472 /*********************************************************************** 473 * txCtrlParams_setQosHeaderConverMode 474 *********************************************************************** 475 DESCRIPTION: Update the BSS type. 476 ************************************************************************/ 477 void txCtrlParams_setQosHeaderConverMode (TI_HANDLE hTxCtrl, EHeaderConvertMode headerConverMode) 478 { 479 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl; 480 481 pTxCtrl->headerConverMode = headerConverMode; 482 483 updateDataPktPrototype(pTxCtrl); /* Needed due to QoS mode change. */ 484 } 485 486 /** 487 * \fn txCtrlParams_SetHtControl() 488 * \brief Update The HT Control Field on txCtrl module. 489 * 490 * \note 491 * \param hTxCtrl - the hTxCtrl handle. 492 * \param pHtCapabilitiesIe - input structure. 493 * \return TI_OK on success or TI_NOK on failure 494 * \sa 495 */ 496 TI_STATUS txCtrlParams_SetHtControl (TI_HANDLE hTxCtrl, TtxCtrlHtControl *pHtControl) 497 { 498 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl; 499 500 pTxCtrl->tTxCtrlHtControl.bHtEnable = pHtControl->bHtEnable; 501 502 return TI_OK; 503 } 504 505 /*********************************************************************** 506 * txCtrlParams_setCurrentPrivacyInvokedMode 507 *********************************************************************** 508 DESCRIPTION: Update the current privacy invoked mode. 509 ************************************************************************/ 510 void txCtrlParams_setCurrentPrivacyInvokedMode (TI_HANDLE hTxCtrl, TI_BOOL currentPrivacyInvokedMode) 511 { 512 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl; 513 514 pTxCtrl->currentPrivacyInvokedMode = currentPrivacyInvokedMode; 515 } 516 517 518 /*********************************************************************** 519 * txCtrlParams_setEapolEncryptionStatus 520 *********************************************************************** 521 DESCRIPTION: Update the Eapol Encryption Status. 522 ************************************************************************/ 523 void txCtrlParams_setEapolEncryptionStatus (TI_HANDLE hTxCtrl, TI_BOOL eapolEncryptionStatus) 524 { 525 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl; 526 527 pTxCtrl->eapolEncryptionStatus = eapolEncryptionStatus; 528 } 529 530 531 /*********************************************************************** 532 * txCtrlParams_setEncryptionFieldSizes 533 *********************************************************************** 534 DESCRIPTION: Update the encryption field size for the header padding. 535 ************************************************************************/ 536 void txCtrlParams_setEncryptionFieldSizes (TI_HANDLE hTxCtrl, TI_UINT8 encryptionFieldSize) 537 { 538 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl; 539 540 pTxCtrl->encryptionFieldSize = encryptionFieldSize; 541 } 542 543 544 /*********************************************************************** 545 * txCtrlParams_getCurrentEncryptionInfo 546 *********************************************************************** 547 DESCRIPTION: Provide the current encryption mode and padding size. 548 ************************************************************************/ 549 void txCtrlParams_getCurrentEncryptionInfo (TI_HANDLE hTxCtrl, 550 TI_BOOL *pCurrentPrivacyInvokedMode, 551 TI_UINT8 *pEncryptionFieldSize) 552 { 553 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl; 554 555 *pCurrentPrivacyInvokedMode = pTxCtrl->currentPrivacyInvokedMode; 556 *pEncryptionFieldSize = pTxCtrl->encryptionFieldSize; 557 } 558 559 560 /*********************************************************************** 561 * txCtrlParams_GetTxRate 562 *********************************************************************** 563 DESCRIPTION: Provide the last successfull data packet Tx rate. 564 ************************************************************************/ 565 ERate txCtrlParams_GetTxRate (TI_HANDLE hTxCtrl) 566 { 567 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl; 568 569 return pTxCtrl->eCurrentTxRate; 570 } 571 572 573 /*********************************************************************** 574 * txCtrlParams_setAcAdmissionStatus 575 *********************************************************************** 576 DESCRIPTION: Update the AC admission status - required or not and admitted or not. 577 Update also the queues mapping in case it should change. 578 ************************************************************************/ 579 void txCtrlParams_setAcAdmissionStatus (TI_HANDLE hTxCtrl, 580 TI_UINT8 ac, 581 EAdmissionState admissionRequired, 582 ETrafficAdmState admissionState) 583 { 584 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl; 585 586 pTxCtrl->admissionRequired[ac] = admissionRequired; 587 pTxCtrl->admissionState[ac] = admissionState; 588 589 /* Update the Tx queues mapping after admission change. */ 590 txCtrl_UpdateQueuesMapping (hTxCtrl); 591 } 592 593 594 /*********************************************************************** 595 * txCtrlParams_setAcMsduLifeTime 596 *********************************************************************** 597 DESCRIPTION: Update the AC MSDU lifetime. The units are TUs (1024 usec). 598 ************************************************************************/ 599 void txCtrlParams_setAcMsduLifeTime (TI_HANDLE hTxCtrl, TI_UINT8 ac, TI_UINT32 uMsduLifeTimeTu) 600 { 601 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl; 602 603 pTxCtrl->aMsduLifeTimeTu[ac] = (TI_UINT16)uMsduLifeTimeTu; 604 } 605 606 607 /*********************************************************************** 608 * txCtrlParams_setAcAckPolicy 609 *********************************************************************** 610 DESCRIPTION: Update the AC Ack policy. 611 ************************************************************************/ 612 void txCtrlParams_setAcAckPolicy (TI_HANDLE hTxCtrl, TI_UINT8 ac, AckPolicy_e ackPolicy) 613 { 614 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl; 615 616 pTxCtrl->ackPolicy[ac] = ackPolicy; 617 } 618 619 620 /*********************************************************************** 621 * txCtrlParams_updateMgmtRateAttributes 622 *********************************************************************** 623 DESCRIPTION: Update per AC the rate policy for Mgmnt packets or IBSS BCAST packets. 624 ************************************************************************/ 625 void txCtrlParams_updateMgmtRateAttributes(TI_HANDLE hTxCtrl, TI_UINT8 ratePolicyId, TI_UINT8 ac) 626 { 627 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl; 628 629 pTxCtrl->mgmtRatePolicy[ac] = ratePolicyId; 630 } 631 632 633 /*********************************************************************** 634 * txCtrlParams_updateDataRateAttributes 635 *********************************************************************** 636 DESCRIPTION: Update per AC the rate policy for regular data packets (excluding IBSS BCAST packets). 637 ************************************************************************/ 638 void txCtrlParams_updateDataRateAttributes(TI_HANDLE hTxCtrl, TI_UINT8 ratePolicyId, TI_UINT8 ac) 639 { 640 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl; 641 642 pTxCtrl->dataRatePolicy[ac] = ratePolicyId; 643 } 644 645 646 /*********************************************************************** 647 * txCtrlParams_updateTxSessionCount 648 *********************************************************************** 649 DESCRIPTION: Update the current Tx-session index configured to FW. 650 ************************************************************************/ 651 void txCtrlParams_updateTxSessionCount(TI_HANDLE hTxCtrl, TI_UINT16 txSessionCount) 652 { 653 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl; 654 655 pTxCtrl->txSessionCount = txSessionCount; 656 657 updateDataPktPrototype(pTxCtrl); 658 } 659 660 661 662 663 /******************************************************************************** 664 * * 665 * DEBUG FUNCTIONS IMPLEMENTATION * 666 * * 667 *********************************************************************************/ 668 669 #ifdef TI_DBG 670 671 /*********************************************************************** 672 * txCtrlParams_printInfo 673 *********************************************************************** 674 DESCRIPTION: Print module internal information. 675 ************************************************************************/ 676 void txCtrlParams_printInfo(TI_HANDLE hTxCtrl) 677 { 678 #ifdef REPORT_LOG 679 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl; 680 681 WLAN_OS_REPORT(("-------------- Tx-Ctrl Module Information --------------\n")); 682 WLAN_OS_REPORT(("========================================================\n")); 683 684 WLAN_OS_REPORT(("ACs Mapping:\n")); 685 WLAN_OS_REPORT(("------------\n")); 686 WLAN_OS_REPORT(("admissionRequired[3,2,1,0] = %d, %d, %d, %d\n", 687 pTxCtrl->admissionRequired[3], pTxCtrl->admissionRequired[2], 688 pTxCtrl->admissionRequired[1], pTxCtrl->admissionRequired[0])); 689 WLAN_OS_REPORT(("admissionState[3,2,1,0] = %d, %d, %d, %d\n", 690 pTxCtrl->admissionState[3], pTxCtrl->admissionState[2], 691 pTxCtrl->admissionState[1], pTxCtrl->admissionState[0])); 692 WLAN_OS_REPORT(("highestAdmittedAc[3,2,1,0] = %d, %d, %d, %d\n", 693 pTxCtrl->highestAdmittedAc[3], pTxCtrl->highestAdmittedAc[2], 694 pTxCtrl->highestAdmittedAc[1], pTxCtrl->highestAdmittedAc[0])); 695 WLAN_OS_REPORT(("admittedAcToTidMap[3,2,1,0] = 0x%x, 0x%x, 0x%x, 0x%x\n", 696 pTxCtrl->admittedAcToTidMap[3], pTxCtrl->admittedAcToTidMap[2], 697 pTxCtrl->admittedAcToTidMap[1], pTxCtrl->admittedAcToTidMap[0])); 698 WLAN_OS_REPORT(("busyAcBitmap = 0x%x\n", pTxCtrl->busyAcBitmap)); 699 WLAN_OS_REPORT(("busyTidBitmap = 0x%x\n", pTxCtrl->busyTidBitmap)); 700 WLAN_OS_REPORT(("--------------------------------------------------------\n")); 701 702 WLAN_OS_REPORT(("Tx Attributes:\n")); 703 WLAN_OS_REPORT(("--------------\n")); 704 WLAN_OS_REPORT(("mgmtRatePolicy[3,2,1,0] = %d, %d, %d, %d\n", 705 pTxCtrl->mgmtRatePolicy[3], pTxCtrl->mgmtRatePolicy[2], 706 pTxCtrl->mgmtRatePolicy[1], pTxCtrl->mgmtRatePolicy[0])); 707 WLAN_OS_REPORT(("dataRatePolicy[3,2,1,0] = %d, %d, %d, %d\n", 708 pTxCtrl->dataRatePolicy[3], pTxCtrl->dataRatePolicy[2], 709 pTxCtrl->dataRatePolicy[1], pTxCtrl->dataRatePolicy[0])); 710 WLAN_OS_REPORT(("dataPktDescAttrib = 0x%x\n", pTxCtrl->dataPktDescAttrib)); 711 WLAN_OS_REPORT(("--------------------------------------------------------\n")); 712 713 WLAN_OS_REPORT(("Parameters:\n")); 714 WLAN_OS_REPORT(("----------\n")); 715 WLAN_OS_REPORT(("headerConverMode = %d\n", pTxCtrl->headerConverMode)); 716 WLAN_OS_REPORT(("currentPrivacyInvokedMode = %d\n", pTxCtrl->currentPrivacyInvokedMode)); 717 WLAN_OS_REPORT(("eapolEncryptionStatus = %d\n", pTxCtrl->eapolEncryptionStatus)); 718 WLAN_OS_REPORT(("encryptionFieldSize = %d\n", pTxCtrl->encryptionFieldSize)); 719 WLAN_OS_REPORT(("currBssType = %d\n", pTxCtrl->currBssType)); 720 WLAN_OS_REPORT(("========================================================\n\n")); 721 #endif 722 } 723 724 725 /*********************************************************************** 726 * txCtrlParams_printDebugCounters 727 *********************************************************************** 728 DESCRIPTION: Print Tx statistics debug counters. 729 ************************************************************************/ 730 void txCtrlParams_printDebugCounters(TI_HANDLE hTxCtrl) 731 { 732 #ifdef REPORT_LOG 733 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl; 734 TI_UINT32 ac; 735 736 WLAN_OS_REPORT(("-------------- Tx-Ctrl Statistics Per AC ---------------\n")); 737 WLAN_OS_REPORT(("========================================================\n")); 738 739 WLAN_OS_REPORT(("---------- Packets Sent To Tx-Ctrl ---------------------\n")); 740 for(ac = 0; ac < MAX_NUM_OF_AC; ac++) 741 WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumPktsSent[ac])); 742 743 WLAN_OS_REPORT(("---------- Number of Queue-Stop (BP) -------------------\n")); 744 for(ac = 0; ac < MAX_NUM_OF_AC; ac++) 745 WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumPktsBackpressure[ac])); 746 747 WLAN_OS_REPORT(("---------- Number of AC Busy (Requeue pkt) -------------\n")); 748 for(ac = 0; ac < MAX_NUM_OF_AC; ac++) 749 WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumPktsBusy[ac])); 750 751 WLAN_OS_REPORT(("---------- Packets Sent to Xfer ------------------------\n")); 752 for(ac = 0; ac < MAX_NUM_OF_AC; ac++) 753 WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumPktsXfered[ac])); 754 755 WLAN_OS_REPORT(("----------- Xfer rc = Success --------------------------\n")); 756 for(ac = 0; ac < MAX_NUM_OF_AC; ac++) 757 WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumPktsSuccess[ac])); 758 759 WLAN_OS_REPORT(("----------- Xfer rc = Pending --------------------------\n")); 760 for(ac = 0; ac < MAX_NUM_OF_AC; ac++) 761 WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumPktsPending[ac])); 762 763 WLAN_OS_REPORT(("----------- Xfer rc = Error ----------------------------\n")); 764 for(ac = 0; ac < MAX_NUM_OF_AC; ac++) 765 WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumPktsError[ac])); 766 767 WLAN_OS_REPORT(("----------- Number of Tx-Complete Packets --------------\n")); 768 for(ac = 0; ac < MAX_NUM_OF_AC; ac++) 769 WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumTxCmplt[ac])); 770 771 WLAN_OS_REPORT(("----------- Number of Tx-Complete Packets TI_OK -----------\n")); 772 for(ac = 0; ac < MAX_NUM_OF_AC; ac++) 773 WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumTxCmpltOk[ac])); 774 775 WLAN_OS_REPORT(("----------- Number of Tx-Complete Packets Fails --------\n")); 776 for(ac = 0; ac < MAX_NUM_OF_AC; ac++) 777 WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumTxCmpltError[ac])); 778 779 WLAN_OS_REPORT(("----------- Number of Tx-Complete Bytes TI_OK -------------\n")); 780 for(ac = 0; ac < MAX_NUM_OF_AC; ac++) 781 WLAN_OS_REPORT(("AC %d = %d\n", ac, pTxCtrl->dbgCounters.dbgNumTxCmpltOkBytes[ac])); 782 WLAN_OS_REPORT(("--------------------------------------------------------\n")); 783 784 WLAN_OS_REPORT(("Total Number of Xfer-Complete Events = %d\n", pTxCtrl->dbgCounters.dbgNumXferCmplt)); 785 WLAN_OS_REPORT(("Total Number of Xfer-Pending Events = %d\n", 786 pTxCtrl->dbgCounters.dbgNumPktsPending[0] + pTxCtrl->dbgCounters.dbgNumPktsPending[1] + 787 pTxCtrl->dbgCounters.dbgNumPktsPending[2] + pTxCtrl->dbgCounters.dbgNumPktsPending[3])); 788 WLAN_OS_REPORT(("========================================================\n\n")); 789 #endif 790 } 791 792 793 /*************************************************************************** 794 * txCtrlParams_resetDbgCounters 795 **************************************************************************** 796 * DESCRIPTION: Reset the tx data module debug counters 797 ***************************************************************************/ 798 void txCtrlParams_resetDbgCounters(TI_HANDLE hTxCtrl) 799 { 800 txCtrl_t *pTxCtrl = (txCtrl_t *)hTxCtrl; 801 802 os_memoryZero(pTxCtrl->hOs, &pTxCtrl->dbgCounters, sizeof(txDataDbgCounters_t)); 803 } 804 805 806 807 #endif /* TI_DBG */ 808