1 /**************************************************************************** 2 **+-----------------------------------------------------------------------+** 3 **| |** 4 **| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved. |** 5 **| All rights reserved. |** 6 **| |** 7 **| Redistribution and use in source and binary forms, with or without |** 8 **| modification, are permitted provided that the following conditions |** 9 **| are met: |** 10 **| |** 11 **| * Redistributions of source code must retain the above copyright |** 12 **| notice, this list of conditions and the following disclaimer. |** 13 **| * Redistributions in binary form must reproduce the above copyright |** 14 **| notice, this list of conditions and the following disclaimer in |** 15 **| the documentation and/or other materials provided with the |** 16 **| distribution. |** 17 **| * Neither the name Texas Instruments nor the names of its |** 18 **| contributors may be used to endorse or promote products derived |** 19 **| from this software without specific prior written permission. |** 20 **| |** 21 **| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |** 22 **| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |** 23 **| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |** 24 **| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |** 25 **| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |** 26 **| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |** 27 **| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |** 28 **| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |** 29 **| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |** 30 **| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |** 31 **| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |** 32 **| |** 33 **+-----------------------------------------------------------------------+** 34 ****************************************************************************/ 35 /**************************************************************************/ 36 /* */ 37 /* MODULE: Rate Adaptation.c */ 38 /* */ 39 /**************************************************************************/ 40 #include "RateAdaptation.h" 41 #include "DataCtrl_Api.h" 42 #include "802_11Defs.h" 43 #include "osApi.h" 44 #include "report.h" 45 #include "utils.h" 46 #include "EvHandler.h" 47 #include "apConn.h" 48 49 50 static TI_STATUS rateAdaptationa_rateToIndexInRateMapTable(rateAdaptation_t* pRateAdaptation, 51 rate_e rate, UINT8* Index); 52 53 static modulationType_e setModulationForRate(rateAdaptation_t *pRateAdaptation, 54 rate_e rate, 55 modulationType_e modulation, 56 bssType_e bssType); 57 58 BOOL rateAdaptation_isRateInTable(ctrlData_rateAdapt_t *currTable, 59 rate_e rate); 60 61 void rateAdaptation_getFallBackStepUp(ctrlData_rateAdapt_t *currTable, 62 rate_e rate,UINT8* FB,UINT8* SU); 63 64 static void rateAdaptation_rxTimeOut(TI_HANDLE hRateAdaptation); 65 66 static BOOL set4xEnableForRate(rateAdaptation_t* pRateAdaptation, 67 rate_e rate, 68 BOOL enable4x, 69 bssType_e bssType); 70 71 /************************************************************************* 72 * ctrlData_create 73 ************************************************************************** 74 * DESCRIPTION: This function create the rateAdaptation module. 75 * 76 * INPUT: hOs - handle to Os Abstraction Layer 77 * 78 * OUTPUT: 79 * 80 * RETURN: Handle to the allocated rateAdaptation block 81 ************************************************************************/ 82 83 rateAdaptation_t* rateAdaptation_create(TI_HANDLE hOs) 84 { 85 rateAdaptation_t* pRateAdaptation; 86 void *pTimer; 87 88 if( hOs == NULL ) 89 { 90 WLAN_OS_REPORT(("FATAL ERROR: rateAdaptation_create(): OS handle Error - Aborting\n")); 91 return NULL; 92 } 93 94 /* alocate RateAdaptation block */ 95 pRateAdaptation = os_memoryAlloc(hOs, (sizeof(rateAdaptation_t))); 96 if(!pRateAdaptation) 97 return NULL; 98 99 /* alocate Timer to use in PowerSave algorithm */ 100 pTimer = os_timerCreate(hOs, rateAdaptation_rxTimeOut, pRateAdaptation); 101 102 if (!pTimer) 103 { 104 utils_nullMemoryFree(hOs, pRateAdaptation, sizeof(rateAdaptation_t)); 105 WLAN_OS_REPORT(("FATAL ERROR: rateAdaptation_create(): Error Creating rateAdaptation Module - Aborting\n")); 106 return NULL; 107 } 108 109 110 /* reset RateAdaptation module block */ 111 os_memoryZero(hOs, pRateAdaptation, (sizeof(rateAdaptation_t))); 112 113 pRateAdaptation->pTimer = pTimer; 114 115 pRateAdaptation->hOs = hOs; 116 117 return(pRateAdaptation); 118 119 } 120 121 /*************************************************************************** 122 * rateAdaptation_config 123 **************************************************************************** 124 * DESCRIPTION: This function initialize the Rate Adaptation algorithm 125 * 126 * INPUTS: pRateAdaptation - the object 127 * hOs - Handle to the Os Abstraction Layer 128 * hReport - Handle to the Report object 129 * rateAdaptationInitParam - pointer to Rate Adaptation 130 * module init parameters 131 * 132 * OUTPUT: 133 * 134 * RETURNS: void 135 ***************************************************************************/ 136 TI_STATUS rateAdaptation_config(rateAdaptation_t* pRateAdaptation, 137 TI_HANDLE hOs, 138 TI_HANDLE hReport, 139 TI_HANDLE hCtrlData, 140 TI_HANDLE hEvHandler, 141 TI_HANDLE hAPConnection, 142 rateAdaptationInitParam_t* rateAdaptationInitParam) 143 { 144 145 UINT32 i; 146 147 if( (pRateAdaptation == NULL) || (hOs == NULL) || 148 (hReport == NULL) || (rateAdaptationInitParam == NULL) ) 149 { 150 WLAN_OS_REPORT(("FATAL ERROR: rateAdaptation_config(): Parameters Error - Aborting\n")); 151 return NOK; 152 } 153 154 pRateAdaptation->hOs = hOs; 155 pRateAdaptation->hReport = hReport; 156 pRateAdaptation->hCtrlData = hCtrlData; 157 pRateAdaptation->hEvHandler = hEvHandler; 158 pRateAdaptation->hAPConnection = hAPConnection; 159 160 pRateAdaptation->contTxPacketsThreshold = rateAdaptationInitParam->contTxPacketsThreshold; 161 pRateAdaptation->stepUpTxPacketsThreshold = rateAdaptationInitParam->stepUpTxPacketsThreshold; 162 pRateAdaptation->ctrlDataFBShortInterval = rateAdaptationInitParam->ctrlDataFBShortInterval; 163 pRateAdaptation->ctrlDataFBLongInterval = rateAdaptationInitParam->ctrlDataFBLongInterval; 164 pRateAdaptation->lowRateThreshold = DEF_LOW_RATE_THRESHOLD; 165 166 pRateAdaptation->rateAdapt_timeout = 1000*rateAdaptationInitParam->rateAdapt_timeout; 167 168 pRateAdaptation->txCount = 0; 169 pRateAdaptation->txSkipCount = 0; 170 pRateAdaptation->txFailCount = 0; 171 pRateAdaptation->txRateFallBackCount = 0; 172 173 pRateAdaptation->stepUpFlag = FALSE; 174 175 /* resset Tspecs Rate Parameters */ 176 for(i = 0 ; i < MAX_NUM_OF_AC ; i++) 177 { 178 pRateAdaptation->tspecsRateParameters[i].enableEvent = FALSE; 179 if(rateAdaptationInitParam->tspecsRateParameters[i].highRateThreshold < rateAdaptationInitParam->tspecsRateParameters[i].lowRateThreshold) 180 { 181 WLAN_REPORT_ERROR(pRateAdaptation->hReport, RATE_ADAPTATION_MODULE_LOG, 182 (" rateAdaptation_config() ERROR: highRateThreshold < lowRateThreshold, ac = %d\n",i)); 183 184 pRateAdaptation->tspecsRateParameters[i].highRateThreshold = 0; 185 pRateAdaptation->tspecsRateParameters[i].lowRateThreshold = 0; 186 187 } 188 /* if either one of the threshold is zero all threshold should be with zero default value */ 189 else if( (rateAdaptationInitParam->tspecsRateParameters[i].highRateThreshold == 0) || 190 (rateAdaptationInitParam->tspecsRateParameters[i].lowRateThreshold == 0)) 191 { 192 pRateAdaptation->tspecsRateParameters[i].highRateThreshold = 0; 193 pRateAdaptation->tspecsRateParameters[i].lowRateThreshold = 0; 194 } 195 else 196 { 197 pRateAdaptation->tspecsRateParameters[i].highRateThreshold = rateAdaptationInitParam->tspecsRateParameters[i].highRateThreshold; 198 pRateAdaptation->tspecsRateParameters[i].lowRateThreshold = rateAdaptationInitParam->tspecsRateParameters[i].lowRateThreshold; 199 } 200 } 201 202 WLAN_REPORT_INFORMATION(pRateAdaptation->hReport, RATE_ADAPTATION_MODULE_LOG, 203 (" Rate Adaptation initialize success\n")); 204 205 return OK; 206 207 } 208 209 /*************************************************************************** 210 * rateAdaptation_destroy 211 **************************************************************************** 212 * DESCRIPTION: This function destroy the rateAdaptation object. 213 * 214 * INPUTS: rateAdaptation - the object 215 * 216 * RETURNS: OK - Unload succesfull 217 * NOK - Unload unsuccesfull 218 ***************************************************************************/ 219 220 TI_STATUS rateAdaptation_destroy(rateAdaptation_t* pRateAdaptation) 221 { 222 223 /* check parameters validity */ 224 if( pRateAdaptation == NULL ) 225 { 226 WLAN_REPORT_ERROR(pRateAdaptation->hReport, RATE_ADAPTATION_MODULE_LOG, 227 (" rateAdaptation_destroy() : parametrs value error \n")); 228 return NOK; 229 } 230 231 /* free timer */ 232 os_timerStop(pRateAdaptation->hOs, pRateAdaptation->pTimer); 233 utils_nullTimerDestroy(pRateAdaptation->hOs, pRateAdaptation->pTimer); 234 235 236 /* free rateAdaptation block */ 237 os_memoryFree(pRateAdaptation->hOs, pRateAdaptation, sizeof(rateAdaptation_t)); 238 239 return OK; 240 } 241 242 /*************************************************************************** 243 * rateAdaptation_rxTimeOut 244 **************************************************************************** 245 * DESCRIPTION: 246 ****************************************************************************/ 247 248 static void rateAdaptation_rxTimeOut(TI_HANDLE hRateAdaptation) 249 { 250 rateAdaptation_t* pRateAdaptation = (rateAdaptation_t *) hRateAdaptation; 251 UINT8 prevIndex = pRateAdaptation->currRateIndex,i; 252 OS_802_11_THRESHOLD_CROSS_INDICATION_PARAMS tspecRateCross; 253 254 os_timerStop(pRateAdaptation->hOs, pRateAdaptation->pTimer); 255 os_timerStart(pRateAdaptation->hOs, pRateAdaptation->pTimer,pRateAdaptation->rateAdapt_timeout,FALSE); 256 257 pRateAdaptation->txCount = 0; 258 pRateAdaptation->txSkipCount = 0; 259 pRateAdaptation->txFailCount = 0; 260 pRateAdaptation->txRateFallBackCount = 0; 261 pRateAdaptation->currRateIndex = pRateAdaptation->maxRateIndex; 262 263 264 /* update OS with the current rate */ 265 if(prevIndex != pRateAdaptation->currRateIndex) 266 { 267 UINT32 statusData; 268 paramInfo_t param; 269 270 pRateAdaptation->expirTimeTick = os_timeStampMs(pRateAdaptation->hOs) + pRateAdaptation->ctrlDataFBShortInterval; 271 pRateAdaptation->stepUpFlag = TRUE; 272 273 WLAN_REPORT_WARNING(pRateAdaptation->hReport, RATE_ADAPTATION_MODULE_LOG, 274 (" RateAdapt() : Time: %d, (60sec) OldRate(Index,Rate): %d,%d, NewRate(Index,Rate): %d,%d\n", 275 os_timeStampMs(pRateAdaptation->hOs), 276 prevIndex,pRateAdaptation->RatesMap[prevIndex].rateNumber, 277 pRateAdaptation->currRateIndex, pRateAdaptation->RatesMap[pRateAdaptation->currRateIndex].rateNumber )); 278 279 /* update OS with the current rate */ 280 param.paramType = CTRL_DATA_FOUR_X_CURRRENT_STATUS_PARAM; 281 param.content.ctrlDataCerruentFourXstate = pRateAdaptation->RatesMap[pRateAdaptation->currRateIndex].fourXEnable; 282 ctrlData_setParam(pRateAdaptation->hCtrlData, ¶m); 283 284 /* update OS with the current rate */ 285 286 statusData = hostToUtilityRate(pRateAdaptation->RatesMap[pRateAdaptation->currRateIndex].rate); 287 288 EvHandlerSendEvent(pRateAdaptation->hEvHandler, IPC_EVENT_LINK_SPEED, (UINT8 *)&statusData,sizeof(UINT32)); 289 290 /* send Tspecs Rate Event */ 291 for(i = 0 ; i < MAX_NUM_OF_AC ; i++) 292 { 293 if(pRateAdaptation->tspecsRateParameters[i].enableEvent == FALSE) 294 { 295 continue; 296 } 297 else 298 { 299 if( ((pRateAdaptation->RatesMap[prevIndex].rateNumber) < (pRateAdaptation->tspecsRateParameters[i].highRateThreshold)) && 300 (pRateAdaptation->RatesMap[pRateAdaptation->currRateIndex].rateNumber >= (pRateAdaptation->tspecsRateParameters[i].highRateThreshold)) ) 301 { 302 tspecRateCross.uAC = i; 303 tspecRateCross.uHighOrLowThresholdFlag = HIGH_THRESHOLD_CROSS; 304 tspecRateCross.uAboveOrBelowFlag = CROSS_ABOVE; 305 EvHandlerSendEvent(pRateAdaptation->hEvHandler, IPC_EVENT_TSPEC_RATE_STATUS, (UINT8 *)&tspecRateCross,sizeof(tspecRateCross)); 306 } 307 else 308 if( ((pRateAdaptation->RatesMap[prevIndex].rateNumber) < (pRateAdaptation->tspecsRateParameters[i].lowRateThreshold)) && 309 (hostRateToNumber((rate_e)pRateAdaptation->RatesMap[pRateAdaptation->currRateIndex].rateNumber) >= (pRateAdaptation->tspecsRateParameters[i].lowRateThreshold)) ) 310 { 311 tspecRateCross.uAC = i; 312 tspecRateCross.uHighOrLowThresholdFlag = LOW_THRESHOLD_CROSS; 313 tspecRateCross.uAboveOrBelowFlag = CROSS_ABOVE; 314 EvHandlerSendEvent(pRateAdaptation->hEvHandler, IPC_EVENT_TSPEC_RATE_STATUS, (UINT8 *)&tspecRateCross,sizeof(OS_802_11_THRESHOLD_CROSS_INDICATION_PARAMS)); 315 } 316 317 } 318 } 319 } 320 else { 321 /* no change */ 322 pRateAdaptation->expirTimeTick = os_timeStampMs(pRateAdaptation->hOs) + pRateAdaptation->ctrlDataFBLongInterval; 323 pRateAdaptation->stepUpFlag = FALSE; 324 } 325 326 } 327 /*************************************************************************** 328 * rateAdaptation_getCurrent 329 **************************************************************************** 330 * DESCRIPTION: get current state - Rate and Modulation 331 * Note: since a pointer to the rates map is returned, 332 * Its content should be treated as READ ONLY!!! 333 ****************************************************************************/ 334 rateModulation4x_table_t* rateAdaptation_getCurrent(rateAdaptation_t* pRateAdaptation) 335 { 336 return &(pRateAdaptation->RatesMap[pRateAdaptation->currRateIndex]); 337 } 338 339 /*************************************************************************** 340 * rateAdaptation_getCurrentRate 341 **************************************************************************** 342 * DESCRIPTION: get current Rate 343 ****************************************************************************/ 344 rate_e rateAdaptation_getCurrentRate(rateAdaptation_t* pRateAdaptation) 345 { 346 return pRateAdaptation->RatesMap[pRateAdaptation->currRateIndex].rate; 347 } 348 349 /*************************************************************************** 350 * rateAdaptation_getCurrentModulation * 351 **************************************************************************** 352 * DESCRIPTION: get current Modulation 353 ****************************************************************************/ 354 modulationType_e rateAdaptation_getCurrentModulation(rateAdaptation_t* pRateAdaptation) 355 { 356 return pRateAdaptation->RatesMap[pRateAdaptation->currRateIndex].modulation; 357 } 358 359 /*************************************************************************** 360 * rateAdaptation_getCurrentFourXEnable * 361 **************************************************************************** 362 * DESCRIPTION: get current fourx status 363 ****************************************************************************/ 364 BOOL rateAdaptation_getCurrentFourXEnable(rateAdaptation_t* pRateAdaptation) 365 { 366 return pRateAdaptation->RatesMap[pRateAdaptation->currRateIndex].fourXEnable; 367 } 368 369 /*************************************************************************** 370 * rateAdaptation_buildRateMapTable * 371 **************************************************************************** 372 * DESCRIPTION: build the rate map table 373 ****************************************************************************/ 374 TI_STATUS rateAdaptation_buildRateMapTable(rateAdaptation_t *pRateAdaptation, 375 ctrlData_rateAdapt_t *currTable, 376 UINT32 supportedBitMap, 377 UINT32 clientBitMap, 378 modulationType_e modulation, 379 BOOL enable4x, 380 bssType_e bssType) 381 { 382 UINT8 i = 0; 383 UINT8 index = 0; 384 UINT32 statusData; 385 UINT8 fallBack,stepUp; 386 387 /* 388 Note : allRates[] is changed due to the fact that rate_e was set in the 389 wrong order : 6,9 were in higher numeric value then 5.5 and 11 !!! 390 */ 391 rate_e allRates[] = {DRV_RATE_1M, 392 DRV_RATE_2M, 393 DRV_RATE_5_5M, 394 DRV_RATE_6M, 395 DRV_RATE_9M, 396 DRV_RATE_11M, 397 DRV_RATE_12M, 398 DRV_RATE_18M, 399 DRV_RATE_22M, 400 DRV_RATE_24M, 401 DRV_RATE_36M, 402 DRV_RATE_48M, 403 DRV_RATE_54M 404 }; 405 406 while(i < DRV_RATE_MAX) 407 { 408 if(rateAdaptation_Utils_IsRateInBitmap(pRateAdaptation, 409 supportedBitMap, 410 allRates[i]) == OK) 411 { 412 /* update rates parameters */ 413 pRateAdaptation->RatesMap[index].rate = allRates[i]; 414 pRateAdaptation->RatesMap[index].rateNumber = hostRateToNumber(allRates[i]); 415 416 if((rateAdaptation_isRateInTable(currTable,pRateAdaptation->RatesMap[index].rate)) && 417 (rateAdaptation_Utils_IsRateInBitmap(pRateAdaptation, 418 clientBitMap, 419 allRates[i]) == OK)) 420 { 421 pRateAdaptation->RatesMap[index].valid = TRUE; 422 rateAdaptation_getFallBackStepUp(currTable,pRateAdaptation->RatesMap[index].rate,&fallBack,&stepUp); 423 pRateAdaptation->RatesMap[index].rateAdaptFallBack = fallBack; 424 pRateAdaptation->RatesMap[index].rateAdaptStepUp = stepUp; 425 426 /* update modulation parameter */ 427 pRateAdaptation->RatesMap[index].modulation = setModulationForRate(pRateAdaptation, 428 pRateAdaptation->RatesMap[index].rate, 429 modulation,bssType); 430 431 /* update 4x enable parameter */ 432 pRateAdaptation->RatesMap[index].fourXEnable = set4xEnableForRate(pRateAdaptation, 433 pRateAdaptation->RatesMap[index].rate, 434 enable4x, bssType); 435 436 pRateAdaptation->maxRateIndex = index; 437 pRateAdaptation->currRateIndex = index; 438 } 439 else 440 { 441 pRateAdaptation->RatesMap[index].valid = FALSE; 442 pRateAdaptation->RatesMap[index].modulation = setModulationForRate(pRateAdaptation, 443 pRateAdaptation->RatesMap[index].rate, 444 modulation,bssType); 445 } 446 447 index++; 448 } 449 450 i++; 451 } 452 453 /* report the current rate to OS */ 454 statusData = hostToUtilityRate(pRateAdaptation->RatesMap[pRateAdaptation->currRateIndex].rate); 455 456 EvHandlerSendEvent(pRateAdaptation->hEvHandler, IPC_EVENT_LINK_SPEED, (UINT8 *)&statusData,sizeof(UINT32)); 457 458 return OK; 459 } 460 461 /*************************************************************************** 462 * buildRateBitMap * 463 **************************************************************************** 464 * DESCRIPTION: 465 ****************************************************************************/ 466 467 UINT32 rateAdaptation_Utils_buildRateBitMap(rateAdaptation_t *pRateAdaptation, 468 ctrlData_rateAdapt_t *currTable, 469 rate_e rate, 470 UINT32 supportedBitMap, 471 UINT32 clientBitMap) 472 { 473 UINT32 buildRateBitMap = 0; 474 UINT8 rateNumber = hostRateToNumber(rate); 475 476 if( (rateNumber >= hostRateToNumber(DRV_RATE_1M)) && (rateAdaptation_isRateInTable(currTable, DRV_RATE_1M) ) ) buildRateBitMap |= (clientBitMap & supportedBitMap & DRV_RATE_MASK_1_BARKER); 477 if( (rateNumber >= hostRateToNumber(DRV_RATE_2M)) && (rateAdaptation_isRateInTable(currTable, DRV_RATE_2M) ) ) buildRateBitMap |= (clientBitMap & supportedBitMap & DRV_RATE_MASK_2_BARKER); 478 if( (rateNumber >= hostRateToNumber(DRV_RATE_5_5M)) && (rateAdaptation_isRateInTable(currTable, DRV_RATE_5_5M) ) ) buildRateBitMap |= (clientBitMap & supportedBitMap & DRV_RATE_MASK_5_5_CCK); 479 if( (rateNumber >= hostRateToNumber(DRV_RATE_11M)) && (rateAdaptation_isRateInTable(currTable, DRV_RATE_11M) ) ) buildRateBitMap |= (clientBitMap & supportedBitMap & DRV_RATE_MASK_11_CCK); 480 if( (rateNumber >= hostRateToNumber(DRV_RATE_22M)) && (rateAdaptation_isRateInTable(currTable, DRV_RATE_22M) ) ) buildRateBitMap |= (clientBitMap & supportedBitMap & DRV_RATE_MASK_22_PBCC); 481 if( (rateNumber >= hostRateToNumber(DRV_RATE_6M)) && (rateAdaptation_isRateInTable(currTable, DRV_RATE_6M) ) ) buildRateBitMap |= (clientBitMap & supportedBitMap & DRV_RATE_MASK_6_OFDM); 482 if( (rateNumber >= hostRateToNumber(DRV_RATE_9M)) && (rateAdaptation_isRateInTable(currTable, DRV_RATE_9M) ) ) buildRateBitMap |= (clientBitMap & supportedBitMap & DRV_RATE_MASK_9_OFDM); 483 if( (rateNumber >= hostRateToNumber(DRV_RATE_12M)) && (rateAdaptation_isRateInTable(currTable, DRV_RATE_12M) ) ) buildRateBitMap |= (clientBitMap & supportedBitMap & DRV_RATE_MASK_12_OFDM); 484 if( (rateNumber >= hostRateToNumber(DRV_RATE_18M)) && (rateAdaptation_isRateInTable(currTable, DRV_RATE_18M) ) ) buildRateBitMap |= (clientBitMap & supportedBitMap & DRV_RATE_MASK_18_OFDM); 485 if( (rateNumber >= hostRateToNumber(DRV_RATE_24M)) && (rateAdaptation_isRateInTable(currTable, DRV_RATE_24M) ) ) buildRateBitMap |= (clientBitMap & supportedBitMap & DRV_RATE_MASK_24_OFDM); 486 if( (rateNumber >= hostRateToNumber(DRV_RATE_36M)) && (rateAdaptation_isRateInTable(currTable, DRV_RATE_36M) ) ) buildRateBitMap |= (clientBitMap & supportedBitMap & DRV_RATE_MASK_36_OFDM); 487 if( (rateNumber >= hostRateToNumber(DRV_RATE_48M)) && (rateAdaptation_isRateInTable(currTable, DRV_RATE_48M) ) ) buildRateBitMap |= (clientBitMap & supportedBitMap & DRV_RATE_MASK_48_OFDM); 488 if( (rateNumber >= hostRateToNumber(DRV_RATE_54M)) && (rateAdaptation_isRateInTable(currTable, DRV_RATE_54M) ) ) buildRateBitMap |= (clientBitMap & supportedBitMap & DRV_RATE_MASK_54_OFDM); 489 490 return buildRateBitMap; 491 } 492 493 /*************************************************************************** 494 * rateAdaptation_isRateInTable * 495 **************************************************************************** 496 * DESCRIPTION: check if a specific rate is in a rates table 497 ****************************************************************************/ 498 499 BOOL rateAdaptation_isRateInTable(ctrlData_rateAdapt_t *currTable, 500 rate_e rate) 501 { 502 UINT8 i = 0; 503 504 while(i <= currTable->len) 505 { 506 if(currTable->rateAdaptRatesTable[i++] == rate) 507 return TRUE; 508 } 509 return FALSE; 510 } 511 512 /*************************************************************************** 513 * rateAdaptation_getFallBackStepUp * 514 **************************************************************************** 515 * DESCRIPTION: return Fall Back & Step UP values of a certain rate 516 ****************************************************************************/ 517 518 void rateAdaptation_getFallBackStepUp(ctrlData_rateAdapt_t *currTable, 519 rate_e rate,UINT8* FB,UINT8* SU) 520 { 521 UINT8 i = 0; 522 523 while(i <= currTable->len) 524 { 525 if(currTable->rateAdaptRatesTable[i++] == rate) 526 { 527 *FB = currTable->rateAdaptFBTable[--i]; 528 *SU = currTable->rateAdaptSUTable[i]; 529 return; 530 } 531 } 532 533 *FB = 0; 534 *SU = 0; 535 } 536 537 538 /*************************************************************************** 539 * IsRateInBitmap * 540 **************************************************************************** 541 * DESCRIPTION: check if a specific rate is in a rates bitmap 542 ****************************************************************************/ 543 TI_STATUS rateAdaptation_Utils_IsRateInBitmap(rateAdaptation_t *pRateAdaptation, 544 UINT32 ratesBitMap, 545 rate_e rate) 546 { 547 if( ( (rate == DRV_RATE_1M) && (ratesBitMap & DRV_RATE_MASK_1_BARKER) )|| 548 ( (rate == DRV_RATE_2M) && (ratesBitMap & DRV_RATE_MASK_2_BARKER) ) || 549 ( (rate == DRV_RATE_5_5M) && (ratesBitMap & DRV_RATE_MASK_5_5_CCK) ) || 550 ( (rate == DRV_RATE_11M) && (ratesBitMap & DRV_RATE_MASK_11_CCK) ) || 551 ( (rate == DRV_RATE_22M) && (ratesBitMap & DRV_RATE_MASK_22_PBCC) ) || 552 ( (rate == DRV_RATE_6M) && (ratesBitMap & DRV_RATE_MASK_6_OFDM) ) || 553 ( (rate == DRV_RATE_9M) && (ratesBitMap & DRV_RATE_MASK_9_OFDM) ) || 554 ( (rate == DRV_RATE_12M) && (ratesBitMap & DRV_RATE_MASK_12_OFDM) ) || 555 ( (rate == DRV_RATE_18M) && (ratesBitMap & DRV_RATE_MASK_18_OFDM) ) || 556 ( (rate == DRV_RATE_24M) && (ratesBitMap & DRV_RATE_MASK_24_OFDM) ) || 557 ( (rate == DRV_RATE_36M) && (ratesBitMap & DRV_RATE_MASK_36_OFDM) ) || 558 ( (rate == DRV_RATE_48M) && (ratesBitMap & DRV_RATE_MASK_48_OFDM) ) || 559 ( (rate == DRV_RATE_54M) && (ratesBitMap & DRV_RATE_MASK_54_OFDM) ) ) 560 { 561 return OK; 562 } 563 564 return NOK; 565 } 566 /*************************************************************************** 567 * setModulationForRate * 568 **************************************************************************** 569 * DESCRIPTION: set modulation for the rate map table 570 ****************************************************************************/ 571 572 static modulationType_e setModulationForRate(rateAdaptation_t *pRateAdaptation, 573 rate_e rate, 574 modulationType_e modulation, 575 bssType_e bssType) 576 { 577 switch(rate) 578 { 579 case DRV_RATE_1M: 580 return DRV_MODULATION_QPSK; 581 582 case DRV_RATE_2M: 583 return DRV_MODULATION_QPSK; 584 585 case DRV_RATE_5_5M: 586 if( (modulation == DRV_MODULATION_PBCC) && 587 (bssType == BSS_INFRASTRUCTURE) ) 588 return DRV_MODULATION_PBCC; 589 else 590 return DRV_MODULATION_CCK; 591 592 case DRV_RATE_11M: 593 if( (modulation == DRV_MODULATION_PBCC) && 594 (bssType == BSS_INFRASTRUCTURE) ) 595 return DRV_MODULATION_PBCC; 596 else 597 return DRV_MODULATION_CCK; 598 599 case DRV_RATE_22M: 600 return DRV_MODULATION_PBCC; 601 602 case DRV_RATE_6M: 603 return DRV_MODULATION_OFDM; 604 605 case DRV_RATE_9M: 606 return DRV_MODULATION_OFDM; 607 608 case DRV_RATE_18M: 609 return DRV_MODULATION_OFDM; 610 611 case DRV_RATE_12M: 612 return DRV_MODULATION_OFDM; 613 614 case DRV_RATE_24M: 615 return DRV_MODULATION_OFDM; 616 617 case DRV_RATE_36M: 618 return DRV_MODULATION_OFDM; 619 620 case DRV_RATE_48M: 621 return DRV_MODULATION_OFDM; 622 623 case DRV_RATE_54M: 624 return DRV_MODULATION_OFDM; 625 626 default: 627 WLAN_REPORT_ERROR(pRateAdaptation->hReport, RATE_ADAPTATION_MODULE_LOG, 628 (" setModulationForRate(): unKnown rate !!! \n")); 629 return DRV_MODULATION_NONE; 630 631 } 632 } 633 634 static BOOL set4xEnableForRate(rateAdaptation_t* pRateAdaptation, 635 rate_e rate, 636 BOOL enable4x, 637 bssType_e bssType) 638 { 639 if(bssType == BSS_INDEPENDENT) 640 return FALSE; 641 642 switch(rate) 643 { 644 case DRV_RATE_1M: 645 return FALSE; 646 647 case DRV_RATE_2M: 648 return FALSE; 649 650 case DRV_RATE_5_5M: 651 return FALSE; 652 653 case DRV_RATE_11M: 654 return enable4x; 655 656 case DRV_RATE_22M: 657 return enable4x; 658 659 case DRV_RATE_6M: 660 return FALSE; 661 662 case DRV_RATE_9M: 663 return FALSE; 664 665 case DRV_RATE_18M: 666 return enable4x; 667 668 case DRV_RATE_12M: 669 return enable4x; 670 671 case DRV_RATE_24M: 672 return enable4x; 673 674 case DRV_RATE_36M: 675 return enable4x; 676 677 case DRV_RATE_48M: 678 return enable4x; 679 680 case DRV_RATE_54M: 681 return enable4x; 682 683 default: 684 WLAN_REPORT_ERROR(pRateAdaptation->hReport, RATE_ADAPTATION_MODULE_LOG, 685 (" set4xEnableForRate(): unKnown rate !!! \n")); 686 return DRV_MODULATION_NONE; 687 688 } 689 690 691 } 692 /*************************************************************************** 693 * rateAdaptation_setMaxActivRate 694 **************************************************************************** 695 * DESCRIPTION: set current rate 696 ****************************************************************************/ 697 TI_STATUS rateAdaptation_setMaxActivRate(rateAdaptation_t* pRateAdaptation, rate_e rate) 698 { 699 UINT8 index; 700 UINT32 status; 701 702 status = rateAdaptationa_rateToIndexInRateMapTable(pRateAdaptation, rate, &index); 703 704 if(status != OK) 705 return NOK; 706 707 pRateAdaptation->maxRateIndex = index; 708 709 return OK; 710 } 711 712 /*************************************************************************** 713 * rateAdaptation_configLowRateThrsh 714 **************************************************************************** 715 * DESCRIPTION: set low rate threshold 716 ****************************************************************************/ 717 TI_STATUS rateAdaptation_configLowRateThrsh(rateAdaptation_t *pRateAdaptation, UINT8 rate) 718 { 719 pRateAdaptation->lowRateThreshold = rate; 720 721 WLAN_REPORT_INFORMATION(pRateAdaptation->hReport, RATE_ADAPTATION_MODULE_LOG, 722 (" \nrateAdaptation_configLowRateThrsh:rate %d, translated to %d \n", rate, pRateAdaptation->lowRateThreshold)); 723 724 return OK; 725 } 726 727 /*************************************************************************** 728 * rateAdaptation_updateModulation 729 **************************************************************************** 730 * DESCRIPTION: set current rate 731 ****************************************************************************/ 732 void rateAdaptation_updateModulation(rateAdaptation_t* pRateAdaptation, 733 modulationType_e modulation, 734 bssType_e bssType) 735 { 736 UINT8 index = 0; 737 738 for(index = 0 ; index < pRateAdaptation->maxRateIndex ; index++) 739 { 740 pRateAdaptation->RatesMap[index].modulation = setModulationForRate(pRateAdaptation, 741 pRateAdaptation->RatesMap[index].rate, 742 modulation, 743 bssType); 744 } 745 } 746 /*************************************************************************** 747 * rateAdaptation_updateModulation 748 **************************************************************************** 749 * DESCRIPTION: set current rate 750 ****************************************************************************/ 751 void rateAdaptation_update4xEnable(rateAdaptation_t* pRateAdaptation, 752 BOOL enable4x, 753 bssType_e bssType) 754 { 755 UINT8 index = 0; 756 757 for(index = 0 ; index < pRateAdaptation->maxRateIndex ; index++) 758 { 759 pRateAdaptation->RatesMap[index].fourXEnable = set4xEnableForRate(pRateAdaptation, 760 pRateAdaptation->RatesMap[index].rate, 761 enable4x, bssType); 762 763 } 764 } 765 /*************************************************************************** 766 * ctrlData_rateAdaptationStart 767 **************************************************************************** 768 * DESCRIPTION: This function start the Rate Adaptation algorithm 769 ***************************************************************************/ 770 TI_STATUS rateAdaptation_start(rateAdaptation_t* pRateAdaptation) 771 { 772 UINT32 statusData; 773 774 pRateAdaptation->txCount = 0; 775 pRateAdaptation->txSkipCount = 0; 776 pRateAdaptation->txFailCount = 0; 777 pRateAdaptation->txRateFallBackCount = 0; 778 779 pRateAdaptation->stepUpFlag = FALSE; 780 781 os_timerStart(pRateAdaptation->hOs, pRateAdaptation->pTimer,pRateAdaptation->rateAdapt_timeout,FALSE); 782 783 pRateAdaptation->expirTimeTick = os_timeStampMs(pRateAdaptation->hOs) + pRateAdaptation->ctrlDataFBLongInterval; 784 785 /* update OS with the current rate */ 786 statusData = hostToUtilityRate(pRateAdaptation->RatesMap[pRateAdaptation->currRateIndex].rate); 787 788 EvHandlerSendEvent(pRateAdaptation->hEvHandler, IPC_EVENT_LINK_SPEED, (UINT8 *)&statusData,sizeof(UINT32)); 789 790 return OK; 791 } 792 793 /*************************************************************************** 794 * ctrlData_rateAdaptationStop 795 **************************************************************************** 796 * DESCRIPTION: This function stop the rate adaptation algorithm 797 ***************************************************************************/ 798 TI_STATUS rateAdaptation_stop(rateAdaptation_t* pRateAdaptation) 799 { 800 os_timerStop(pRateAdaptation->hOs, pRateAdaptation->pTimer); 801 802 pRateAdaptation->txCount = 0; 803 pRateAdaptation->txSkipCount = 0; 804 pRateAdaptation->txFailCount = 0; 805 pRateAdaptation->txRateFallBackCount = 0; 806 pRateAdaptation->stepUpFlag = FALSE; 807 pRateAdaptation->expirTimeTick = 0; 808 809 pRateAdaptation->currRateIndex = pRateAdaptation->maxRateIndex; 810 811 812 return OK; 813 } 814 815 /*************************************************************************** 816 * rateAdaptation_stopTimer 817 **************************************************************************** 818 * DESCRIPTION: This function stop the rate adaptation timer 819 ***************************************************************************/ 820 TI_STATUS rateAdaptation_stopTimer(rateAdaptation_t* pRateAdaptation) 821 { 822 os_timerStop(pRateAdaptation->hOs, pRateAdaptation->pTimer); 823 824 return OK; 825 } 826 827 828 /*************************************************************************** 829 * rateAdaptation_setCurrentRate 830 **************************************************************************** 831 * DESCRIPTION: set current rate 832 ****************************************************************************/ 833 TI_STATUS rateAdaptation_setCurrentRate(rateAdaptation_t* pRateAdaptation,rate_e rate) 834 { 835 UINT8 index; 836 UINT32 statusData; 837 838 if(rateAdaptationa_rateToIndexInRateMapTable(pRateAdaptation, rate, &index) == OK) 839 pRateAdaptation->currRateIndex = index; 840 else 841 pRateAdaptation->currRateIndex = pRateAdaptation->maxRateIndex; 842 843 /* report the current rate to OS */ 844 845 statusData = hostToUtilityRate(pRateAdaptation->RatesMap[pRateAdaptation->currRateIndex].rate); 846 847 EvHandlerSendEvent(pRateAdaptation->hEvHandler, IPC_EVENT_LINK_SPEED, (UINT8 *)&statusData,sizeof(UINT32)); 848 849 return OK; 850 } 851 852 /*************************************************************************** 853 * ctrlData_rateToIndexInRateMapTable 854 **************************************************************************** 855 * DESCRIPTION: This function convert a specific rate to index in the 856 * Rate Adaptation algorithm ratemap table 857 * 858 * INPUTS: pRateAdaptation - the object 859 * rate - the rate to convert 860 * 861 * OUTPUT: Index - the index of the rate in the table. 862 * 863 * RETURNS: If the rate is not in the table - return NOK otherwise OK 864 ***************************************************************************/ 865 static TI_STATUS rateAdaptationa_rateToIndexInRateMapTable(rateAdaptation_t* pRateAdaptation, 866 rate_e rate, UINT8* Index) 867 { 868 UINT8 i; 869 870 for(i = 0 ; i <= pRateAdaptation->maxRateIndex ; i++) 871 { 872 if(pRateAdaptation->RatesMap[i].rate == rate) 873 { 874 *Index = i; 875 return OK; 876 } 877 } 878 879 return NOK; 880 } 881 882 /*************************************************************************** 883 * getPrevRate 884 **************************************************************************** 885 * DESCRIPTION: 886 * 887 * INPUTS: pRateAdaptation - the object 888 * 889 * RETURNS: new rate 890 ****************************************************************************/ 891 UINT8 getPrevRate(rateAdaptation_t *pRateAdaptation) 892 { 893 INT16 i; 894 if(pRateAdaptation->currRateIndex != 0) 895 { 896 for(i = pRateAdaptation->currRateIndex - 1; i > 0; i--) 897 { 898 if(pRateAdaptation->RatesMap[i].valid) 899 return (UINT8)i; 900 } 901 } 902 return pRateAdaptation->currRateIndex; 903 } 904 905 906 907 /*************************************************************************** 908 * getNextRate 909 **************************************************************************** 910 * DESCRIPTION: 911 * 912 * INPUTS: pRateAdaptation - the object 913 * 914 * RETURNS: new rate 915 ****************************************************************************/ 916 UINT8 getNextRate(rateAdaptation_t *pRateAdaptation) 917 { 918 UINT32 i; 919 920 for(i = pRateAdaptation->currRateIndex + 1; i <= pRateAdaptation->maxRateIndex; i++) 921 { 922 if(pRateAdaptation->RatesMap[i].valid) 923 return i; 924 } 925 926 return pRateAdaptation->currRateIndex; 927 } 928 929 /*************************************************************************** 930 * rateAdaptation_updateRateAdaptation 931 **************************************************************************** 932 * DESCRIPTION: This function perform the Rate Adaptation algorithm. It 933 * called for every tx complete. 934 * 935 * INPUTS: pRateAdaptation - the object 936 * actualTxRate - the actual tx rate 937 * requestTxRate - the request tx rate 938 * TxStatus - the tx status 939 * txNumWaiting - the number of descriptors in the HW with previous rate 940 * 941 * RETURNS: OK/NOK 942 ****************************************************************************/ 943 TI_STATUS rateAdaptation_updateRateAdaptation(rateAdaptation_t* pRateAdaptation, 944 rate_e actualTxRate, 945 rate_e requestTxRate, 946 UINT32 TxStatus, 947 int txNumWaiting) 948 { 949 950 UINT32 txFailPercent; 951 UINT32 timeStamp; 952 UINT8 actualTxRateNumber = hostRateToNumber(actualTxRate); 953 UINT8 requestTxRateNumber = hostRateToNumber(requestTxRate); 954 OS_802_11_THRESHOLD_CROSS_INDICATION_PARAMS tspecRateCross; 955 UINT8 i,prevIndex = pRateAdaptation->currRateIndex; 956 957 /* Check if need to skip some packets due to rate update */ 958 if (pRateAdaptation->txSkipCount > 0) { 959 pRateAdaptation->txSkipCount--; 960 return OK; 961 } 962 963 timeStamp = os_timeStampMs(pRateAdaptation->hOs); 964 965 pRateAdaptation->txCount++; 966 967 /* if the TxStatus wasn't SUCCESS or the rate was falling back - we will update the mechanism, unless */ 968 /* the TxStatus is LIFETIME_EXCEEDED and there were no retries - we won't update the mechanism */ 969 if(((TxStatus != SEND_COMPLETE_SUCCESS) && (TxStatus != SEND_COMPLETE_LIFETIME_EXCEEDED)) 970 || (actualTxRateNumber < requestTxRateNumber)) 971 { 972 pRateAdaptation->txFailCount++; 973 if (actualTxRateNumber < requestTxRateNumber) 974 pRateAdaptation->txRateFallBackCount++; 975 } 976 977 /* Verify if the checking time has come. */ 978 if( TS_EXCEEDS(timeStamp, pRateAdaptation->expirTimeTick) ) 979 { 980 /* If step up has just done wait for 10 packets only. */ 981 if((pRateAdaptation->stepUpFlag == TRUE) && 982 (pRateAdaptation->txCount > pRateAdaptation->stepUpTxPacketsThreshold )) 983 { 984 /* Calculate the packet fail percent. */ 985 txFailPercent = (pRateAdaptation->txFailCount * 100) / pRateAdaptation->txCount; 986 987 pRateAdaptation->stepUpFlag = FALSE; /* Flag is off for next time. */ 988 989 if( (txFailPercent > pRateAdaptation->RatesMap[pRateAdaptation->currRateIndex].rateAdaptFallBack) && 990 (pRateAdaptation->currRateIndex > 0) ) 991 { 992 pRateAdaptation->currRateIndex = getPrevRate(pRateAdaptation); 993 } 994 } 995 else if (pRateAdaptation->txCount > pRateAdaptation->contTxPacketsThreshold ) 996 { 997 /* Calculate the packet fail percents. */ 998 txFailPercent = (pRateAdaptation->txFailCount * 100) / pRateAdaptation->txCount; 999 1000 if ( (txFailPercent > pRateAdaptation->RatesMap[pRateAdaptation->currRateIndex].rateAdaptFallBack) && 1001 (pRateAdaptation->currRateIndex > 0) ) 1002 { 1003 pRateAdaptation->currRateIndex = getPrevRate(pRateAdaptation); 1004 } 1005 else if ((txFailPercent < pRateAdaptation->RatesMap[pRateAdaptation->currRateIndex].rateAdaptStepUp) && 1006 (pRateAdaptation->currRateIndex < pRateAdaptation->maxRateIndex)) 1007 { 1008 pRateAdaptation->currRateIndex = getNextRate(pRateAdaptation); 1009 pRateAdaptation->stepUpFlag = TRUE; /* Flag is on for next time. */ 1010 } 1011 } 1012 else 1013 { 1014 return OK; 1015 } 1016 1017 /* update OS with the current rate */ 1018 if(prevIndex != pRateAdaptation->currRateIndex) 1019 { 1020 UINT32 statusData; 1021 paramInfo_t param; 1022 rate_e currentRate = pRateAdaptation->RatesMap[pRateAdaptation->currRateIndex].rate; 1023 UINT8 currentRateNumber = pRateAdaptation->RatesMap[pRateAdaptation->currRateIndex].rateNumber; 1024 1025 WLAN_REPORT_WARNING(pRateAdaptation->hReport, RATE_ADAPTATION_MODULE_LOG, 1026 (" RateAdapt() : Time: %d, Fail: %d, Count: %d,Skip: %d\n", 1027 timeStamp,pRateAdaptation->txFailCount,pRateAdaptation->txCount,txNumWaiting)); 1028 1029 WLAN_REPORT_WARNING(pRateAdaptation->hReport, RATE_ADAPTATION_MODULE_LOG, 1030 (" OldRate(Index,Rate): %d,%d\n ",prevIndex,pRateAdaptation->RatesMap[prevIndex].rateNumber)); 1031 WLAN_REPORT_WARNING(pRateAdaptation->hReport, RATE_ADAPTATION_MODULE_LOG, 1032 (" NewRate(Index,Rate): %d,%d\n ",pRateAdaptation->currRateIndex,currentRateNumber)); 1033 1034 /* If the current rate is lower or equal to the roaming threshold, issue roaming trigger. */ 1035 if (currentRateNumber <= pRateAdaptation->lowRateThreshold) 1036 { 1037 roamingEventData_u RoamingEventData; 1038 1039 RoamingEventData.rate = currentRate; 1040 apConn_reportRoamingEvent(pRateAdaptation->hAPConnection, ROAMING_TRIGGER_LOW_TX_RATE, &RoamingEventData); 1041 } 1042 1043 /* Rate update - initialize the skip counter for packets that are already in the queue with old rates */ 1044 if ((txNumWaiting >= 0) && (txNumWaiting <= 100)) { 1045 /* In reasonable range */ 1046 pRateAdaptation->txSkipCount = (UINT32)txNumWaiting; 1047 } else { 1048 pRateAdaptation->txSkipCount = 30; /* something happened, at least skip 30 packets */ 1049 } 1050 1051 /* update OS with the current rate */ 1052 param.paramType = CTRL_DATA_FOUR_X_CURRRENT_STATUS_PARAM; 1053 param.content.ctrlDataCerruentFourXstate = pRateAdaptation->RatesMap[pRateAdaptation->currRateIndex].fourXEnable; 1054 ctrlData_setParam(pRateAdaptation->hCtrlData, ¶m); 1055 1056 /* update OS with the current rate */ 1057 1058 statusData = hostToUtilityRate(currentRate); 1059 1060 EvHandlerSendEvent(pRateAdaptation->hEvHandler, IPC_EVENT_LINK_SPEED, (UINT8 *)&statusData,sizeof(UINT32)); 1061 1062 /* send Tspecs Rate Event */ 1063 for(i = 0 ; i < MAX_NUM_OF_AC ; i++) 1064 { 1065 if(pRateAdaptation->tspecsRateParameters[i].enableEvent == FALSE) 1066 { 1067 continue; 1068 } 1069 else 1070 { 1071 if ( (pRateAdaptation->RatesMap[prevIndex].rateNumber < pRateAdaptation->tspecsRateParameters[i].highRateThreshold) && 1072 (currentRateNumber >= pRateAdaptation->tspecsRateParameters[i].highRateThreshold) ) 1073 { 1074 tspecRateCross.uAC = i; 1075 tspecRateCross.uHighOrLowThresholdFlag = HIGH_THRESHOLD_CROSS; 1076 tspecRateCross.uAboveOrBelowFlag = CROSS_ABOVE; 1077 EvHandlerSendEvent(pRateAdaptation->hEvHandler, IPC_EVENT_TSPEC_RATE_STATUS, (UINT8 *)&tspecRateCross,sizeof(OS_802_11_THRESHOLD_CROSS_INDICATION_PARAMS)); 1078 } 1079 else 1080 if( (pRateAdaptation->RatesMap[prevIndex].rateNumber >= pRateAdaptation->tspecsRateParameters[i].highRateThreshold) && 1081 (currentRateNumber < pRateAdaptation->tspecsRateParameters[i].highRateThreshold) ) 1082 { 1083 tspecRateCross.uAC = i; 1084 tspecRateCross.uHighOrLowThresholdFlag = HIGH_THRESHOLD_CROSS; 1085 tspecRateCross.uAboveOrBelowFlag = CROSS_BELOW; 1086 EvHandlerSendEvent(pRateAdaptation->hEvHandler, IPC_EVENT_TSPEC_RATE_STATUS, (UINT8 *)&tspecRateCross,sizeof(OS_802_11_THRESHOLD_CROSS_INDICATION_PARAMS)); 1087 } 1088 else 1089 if( (pRateAdaptation->RatesMap[prevIndex].rateNumber >= pRateAdaptation->tspecsRateParameters[i].lowRateThreshold) && 1090 (currentRateNumber < pRateAdaptation->tspecsRateParameters[i].lowRateThreshold) ) 1091 { 1092 tspecRateCross.uAC = i; 1093 tspecRateCross.uHighOrLowThresholdFlag = LOW_THRESHOLD_CROSS; 1094 tspecRateCross.uAboveOrBelowFlag = CROSS_BELOW; 1095 EvHandlerSendEvent(pRateAdaptation->hEvHandler, IPC_EVENT_TSPEC_RATE_STATUS, (UINT8 *)&tspecRateCross,sizeof(OS_802_11_THRESHOLD_CROSS_INDICATION_PARAMS)); 1096 } 1097 else 1098 if( (pRateAdaptation->RatesMap[prevIndex].rateNumber < pRateAdaptation->tspecsRateParameters[i].lowRateThreshold) && 1099 (currentRateNumber >= pRateAdaptation->tspecsRateParameters[i].lowRateThreshold) ) 1100 { 1101 tspecRateCross.uAC = i; 1102 tspecRateCross.uHighOrLowThresholdFlag = LOW_THRESHOLD_CROSS; 1103 tspecRateCross.uAboveOrBelowFlag = CROSS_ABOVE; 1104 EvHandlerSendEvent(pRateAdaptation->hEvHandler, IPC_EVENT_TSPEC_RATE_STATUS, (UINT8 *)&tspecRateCross,sizeof(OS_802_11_THRESHOLD_CROSS_INDICATION_PARAMS)); 1105 } 1106 1107 } 1108 } 1109 1110 } 1111 1112 pRateAdaptation->txCount = 0; 1113 pRateAdaptation->txFailCount = 0; 1114 pRateAdaptation->txRateFallBackCount = 0; 1115 TS_ADVANCE( timeStamp, pRateAdaptation->expirTimeTick, 1116 (pRateAdaptation->stepUpFlag ? pRateAdaptation->ctrlDataFBShortInterval : pRateAdaptation->ctrlDataFBLongInterval)); 1117 1118 } 1119 1120 return OK; 1121 } 1122 1123 /*************************************************************************** 1124 * rateAdaptation_setTspecsRateParams 1125 **************************************************************************** 1126 * DESCRIPTION: 1127 * 1128 * INPUTS: pRateAdaptation - the object 1129 ** 1130 * RETURNS: OK/NOK 1131 ****************************************************************************/ 1132 1133 void rateAdaptation_setTspecsRateEvent(rateAdaptation_t* pRateAdaptation, 1134 UINT8 acID, 1135 BOOL enableEvent) 1136 { 1137 1138 /* Prevent ENABLE_EVENTS if one of the threshold of that AC is ZERO */ 1139 if (((pRateAdaptation->tspecsRateParameters[acID].highRateThreshold == 0) || 1140 (pRateAdaptation->tspecsRateParameters[acID].lowRateThreshold == 0)) && (enableEvent == TRUE)) 1141 return; 1142 1143 pRateAdaptation->tspecsRateParameters[acID].enableEvent = enableEvent; 1144 } 1145 1146 /*************************************************************************** 1147 * rateAdaptation_setTspecsRateThresholds 1148 **************************************************************************** 1149 * DESCRIPTION: 1150 * 1151 * INPUTS: pRateAdaptation - the object 1152 ** 1153 * RETURNS: OK/NOK 1154 ****************************************************************************/ 1155 1156 void rateAdaptation_setTspecsRateThresholds(rateAdaptation_t* pRateAdaptation, 1157 UINT8 acID, 1158 UINT8 highRateThreshold, 1159 UINT8 lowRateThreshold) 1160 { 1161 if(highRateThreshold < lowRateThreshold) 1162 { 1163 WLAN_REPORT_ERROR(pRateAdaptation->hReport, RATE_ADAPTATION_MODULE_LOG, 1164 (" rateAdaptation_setTspecsRateThresholds() ERROR: highRateThreshold < lowRateThreshold, ac = %d\n",acID)); 1165 1166 pRateAdaptation->tspecsRateParameters[acID].highRateThreshold = 0; 1167 pRateAdaptation->tspecsRateParameters[acID].lowRateThreshold = 0; 1168 1169 } 1170 else 1171 { 1172 pRateAdaptation->tspecsRateParameters[acID].highRateThreshold = highRateThreshold; 1173 pRateAdaptation->tspecsRateParameters[acID].lowRateThreshold = lowRateThreshold; 1174 } 1175 } 1176 1177 1178 /************************************************************************* 1179 * * 1180 * DEBUG FUNCTIONS * 1181 * * 1182 *************************************************************************/ 1183 void rateAdaptation_print(rateAdaptation_t *pRateAdaptation) 1184 { 1185 UINT32 count; 1186 1187 WLAN_OS_REPORT((" Rate Adaptation Parameters \n")); 1188 WLAN_OS_REPORT(("-----------------------------------\n")); 1189 WLAN_OS_REPORT(("txCount = %d\n",pRateAdaptation->txCount)); 1190 WLAN_OS_REPORT(("txFailCount = %d\n",pRateAdaptation->txFailCount)); 1191 WLAN_OS_REPORT(("txRateFallBackCount = %d\n",pRateAdaptation->txRateFallBackCount)); 1192 WLAN_OS_REPORT(("txSkipCount = %d\n",pRateAdaptation->txSkipCount)); 1193 WLAN_OS_REPORT(("currRateIndex = %d\n",pRateAdaptation->currRateIndex)); 1194 WLAN_OS_REPORT(("currRate Number = %d\n",pRateAdaptation->RatesMap[pRateAdaptation->currRateIndex].rateNumber)); 1195 WLAN_OS_REPORT(("maxRateIndex = %d\n",pRateAdaptation->maxRateIndex)); 1196 WLAN_OS_REPORT(("maxRate Number = %d\n",pRateAdaptation->RatesMap[pRateAdaptation->maxRateIndex].rateNumber)); 1197 WLAN_OS_REPORT(("stepUpFlag = %d\n",pRateAdaptation->stepUpFlag)); 1198 WLAN_OS_REPORT(("expirTimeTick = %d\n",pRateAdaptation->expirTimeTick)); 1199 WLAN_OS_REPORT(("stepUpTxPacketsThreshold = %d\n",pRateAdaptation->stepUpTxPacketsThreshold)); 1200 WLAN_OS_REPORT(("contTxPacketsThreshold = %d\n",pRateAdaptation->contTxPacketsThreshold)); 1201 WLAN_OS_REPORT(("ctrlDataFBShortInterval = %d\n",pRateAdaptation->ctrlDataFBShortInterval)); 1202 WLAN_OS_REPORT(("ctrlDataFBLongInterval = %d\n",pRateAdaptation->ctrlDataFBLongInterval)); 1203 1204 WLAN_OS_REPORT((" Rate Adaptation Table \n")); 1205 WLAN_OS_REPORT(("-----------------------------\n")); 1206 for(count = 0 ; count < MAX_SUPPORTED_RATES ; count++) 1207 { 1208 WLAN_OS_REPORT(("Index = %d ,RateNumber = %d,StepUp = %d ,FallBack = %d , Modulation = %d 4X = %d valid = %d,\n", 1209 count, 1210 pRateAdaptation->RatesMap[count].rateNumber, 1211 pRateAdaptation->RatesMap[count].rateAdaptStepUp, 1212 pRateAdaptation->RatesMap[count].rateAdaptFallBack, 1213 pRateAdaptation->RatesMap[count].modulation, 1214 pRateAdaptation->RatesMap[count].fourXEnable, 1215 pRateAdaptation->RatesMap[count].valid)); 1216 } 1217 1218 WLAN_OS_REPORT(("Tspecs Rate Parameters AC = %d \n",count)); 1219 WLAN_OS_REPORT(("-----------------------------\n")); 1220 for(count = 0 ; count < MAX_NUM_OF_AC ; count++) 1221 { 1222 WLAN_OS_REPORT(("AC = %d \n",count)); 1223 WLAN_OS_REPORT(("---------\n")); 1224 WLAN_OS_REPORT(("enableEvent = %d \n",pRateAdaptation->tspecsRateParameters[count].enableEvent)); 1225 WLAN_OS_REPORT(("highRateThreshold = %d \n",pRateAdaptation->tspecsRateParameters[count].highRateThreshold)); 1226 WLAN_OS_REPORT(("lowRateThreshold = %d \n",pRateAdaptation->tspecsRateParameters[count].lowRateThreshold)); 1227 } 1228 1229 1230 } 1231 1232