Home | History | Annotate | Download | only in Ctrl
      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:     Ctrl.c                                                 */
     38 /*      PURPOSE:    Control module functions                               */
     39 /*                                                                         */
     40 /***************************************************************************/
     41 #include "Ctrl.h"
     42 #include "802_11Defs.h"
     43 #include "DataCtrl_Api.h"
     44 #include "osApi.h"
     45 #include "report.h"
     46 #include "utils.h"
     47 #include "smeApi.h"
     48 #include "siteMgrApi.h"
     49 #include "Ethernet.h"
     50 #include "tx.h"
     51 #include "TrafficMonitorAPI.h"
     52 #include "TI_IPC_Api.h"
     53 #include "EvHandler.h"
     54 #include "apConn.h"
     55 #include "TNETW_Driver_api.h"
     56 #include "Core_AdaptTx.h"
     57 #include "whalCtrl_api.h"
     58 
     59 static void selectRateTable(TI_HANDLE hCtrlData, UINT32 rateMask);
     60 static void ctrlData_setTxRatePolicies(ctrlData_t *pCtrlData);
     61 static void ctrlData_resetCounters(TI_HANDLE hCtrlData);
     62 
     63 static void ctrlData_resetCounters(TI_HANDLE hCtrlData);
     64 
     65 static void ctrlData_UnregisterTrafficIntensityEvents (TI_HANDLE hCtrlData);
     66 static void ctrlData_RegisterTrafficIntensityEvents (TI_HANDLE hCtrlData);
     67 
     68 static UINT32 ctrlData_buildHwBitMapFromArray(policyClassRatesArray_t *pArray);
     69 static void ctrlData_storeTSRateSet(ctrlData_t *pCtrlData, txDataQosParams_t *tsrsParams);
     70 static rate_e ctrlData_getClosestTSRate(ctrlData_t *pCtrlData, UINT32 ac, rate_e givenRate);
     71 
     72 void ctrlData_TrafficThresholdCrossed(TI_HANDLE Context,UINT32 Cookie);
     73 
     74 
     75 /* definitions for medium usage calculations - in uSec units*/
     76 #define AVERAGE_ACK_TIME   10
     77 #define AVERAGE_CTS_TIME   20
     78 #define B_SIFS             10
     79 
     80 #define SHORT_PREAMBLE_TIME   96
     81 #define LONG_PREAMBLE_TIME    192
     82 
     83 #define OFDM_PREAMBLE      12
     84 #define OFDM_SIGNAL_EXT    6
     85 #define OFDM_PLCP_HDR      24
     86 
     87 #define OFDM_DURATION           (B_SIFS + OFDM_PLCP_HDR + OFDM_SIGNAL_EXT)
     88 #define NONOFDM_SHORT_DURATION  (B_SIFS + SHORT_PREAMBLE_TIME)
     89 #define NONOFDM_LONG_DURATION   (B_SIFS + LONG_PREAMBLE_TIME)
     90 
     91 /*************************************************************************
     92 *                        ctrlData_create                                 *
     93 **************************************************************************
     94 * DESCRIPTION:  This function initializes the Ctrl data module.
     95 *
     96 * INPUT:        hOs - handle to Os Abstraction Layer
     97 *
     98 * OUTPUT:       TxCmplt_CB - call back function that return to configMngr
     99 *               in order to register in the Hal
    100 *
    101 * RETURN:       Handle to the allocated Ctrl data control block
    102 ************************************************************************/
    103 TI_HANDLE ctrlData_create(TI_HANDLE hOs)
    104 {
    105     ctrlData_t*         hCtrlData;
    106     rateAdaptation_t*   pRateAdaptation;
    107 #ifdef SUPPORT_4X
    108     fourX_t*            pFourX;
    109 #endif
    110     classifier_t*       pClsfr;
    111 
    112     if( hOs  == NULL )
    113     {
    114         WLAN_OS_REPORT(("FATAL ERROR: ctrlData_create(): OS handle Error - Aborting\n"));
    115         return NULL;
    116     }
    117 
    118     /* alocate Control module control block */
    119     hCtrlData = os_memoryAlloc(hOs, (sizeof(ctrlData_t)));
    120     if(!hCtrlData)
    121         return NULL;
    122 
    123     /* create rate adaptation module */
    124     pRateAdaptation = rateAdaptation_create(hOs);
    125 #ifdef SUPPORT_4X
    126     /* create 4X module */
    127     pFourX = fourX_create(hOs);
    128 #endif
    129     /* create the classifier module */
    130     pClsfr = Classifier_create(hOs);
    131 
    132     if ( (!pRateAdaptation)
    133 #ifdef SUPPORT_4X
    134          || (!pFourX)
    135 #endif
    136        )
    137     {
    138         utils_nullMemoryFree(hOs, pRateAdaptation, sizeof(rateAdaptation_t));
    139 #ifdef SUPPORT_4X
    140         utils_nullMemoryFree(hOs, pFourX, sizeof(fourX_t));
    141 #endif
    142         utils_nullMemoryFree(hOs, hCtrlData, sizeof(ctrlData_t));
    143 
    144         WLAN_OS_REPORT(("FATAL ERROR: ctrlData_create(): Error Creating Ctrl Module - Aborting\n"));
    145         return(NULL);
    146     }
    147 
    148     /* reset control module control block */
    149     os_memoryZero(hOs, hCtrlData, (sizeof(ctrlData_t)));
    150 
    151     hCtrlData->pRateAdaptation = pRateAdaptation;
    152 #ifdef SUPPORT_4X
    153     hCtrlData->pFourX = pFourX;
    154 #endif
    155     hCtrlData->pClsfr = pClsfr;
    156 
    157     hCtrlData->hOs = hOs;
    158 
    159     return(hCtrlData);
    160 }
    161 
    162 /***************************************************************************
    163 *                           ctrlData_config                                *
    164 ****************************************************************************
    165 * DESCRIPTION:  This function configures the Ctrl Data module
    166 *
    167 * INPUTS:       hCtrlData - The object
    168 *               hWhalCtrl - Handle to the Whal Ctrl object
    169 *               hSiteMgrHandle - Handle to the Site Mngr object
    170 *               hTxData - Handle to the Tx Data object
    171 *               hRxData - Handle to the Rx Data object
    172 *               hOs - Handle to the Os Abstraction Layer
    173 *               hReport - Handle to the Report object
    174 *               ctrlDataInitParams - pointer to Ctrl module init parameters
    175 * OUTPUT:
    176 *
    177 * RETURNS:      OK - Configuration succesfull
    178 *               NOK - Configuration unsuccesfull
    179 ***************************************************************************/
    180 TI_STATUS ctrlData_config(TI_HANDLE         hCtrlData,
    181                        TI_HANDLE            hWhalCtrl,
    182                        TI_HANDLE            hSiteMgrHandle,
    183                        TI_HANDLE            hTxData,
    184                        TI_HANDLE            hRxData,
    185                        TI_HANDLE            hOs,
    186                        TI_HANDLE            hReport,
    187                        TI_HANDLE            hMemMngr,
    188                        TI_HANDLE            hEvHandler,
    189                        TI_HANDLE            hAPConnection,
    190                        TI_HANDLE            hTrafficMonitor,
    191                        disassocSentCB_t     disassocSentCBFunc,
    192                        TI_HANDLE            disassocSentCBObj,
    193                        ctrlDataInitParams_t *ctrlDataInitParams)
    194 {
    195     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
    196     TI_STATUS Status = OK;
    197     rateClassClients_e clientIDindex;
    198     txRateClassId_e  TxRateIndex;
    199     UINT32 ac;
    200 
    201     /* check parameters validity */
    202     if( hCtrlData == NULL || hWhalCtrl == NULL || hSiteMgrHandle == NULL || hRxData == NULL ||
    203         hTxData == NULL || hOs == NULL || hReport == NULL || hMemMngr == NULL || ctrlDataInitParams == NULL)
    204     {
    205         WLAN_OS_REPORT(("FATAL ERROR: ctrlData_config(): Parameters Error - Aborting\n"));
    206         return NOK;
    207     }
    208 
    209     /* set objects handles */
    210     pCtrlData->hWhalCtrl =  hWhalCtrl;
    211     pCtrlData->hSiteMgr =   hSiteMgrHandle;
    212     pCtrlData->hTxData =    hTxData;
    213     pCtrlData->hRxData =    hRxData;
    214     pCtrlData->hOs =        hOs;
    215     pCtrlData->hReport =    hReport;
    216     pCtrlData->hAPConn = hAPConnection;
    217     pCtrlData->hEvHandler = hEvHandler;
    218     pCtrlData->hTrafficMonitor  = hTrafficMonitor;
    219 
    220     pCtrlData->disassocSentCBObj = disassocSentCBObj;
    221     pCtrlData->disassocSentCBFunc = disassocSentCBFunc;
    222 
    223     /*  set Control module parameters */
    224     pCtrlData->ctrlDataRateControlEnable = ctrlDataInitParams->ctrlDataRateControlEnable;
    225     pCtrlData->ctrlDataIbssProtectionType = ctrlDataInitParams->ctrlDataDesiredIbssProtection;
    226     pCtrlData->ctrlDataRtsCtsStatus = ctrlDataInitParams->ctrlDataDesiredCtsRtsStatus;
    227 
    228 #ifdef SUPPORT_4X
    229     pCtrlData->ctrlDataFourXEnable = ctrlDataInitParams->ctrlDataFourXEnable;
    230     pCtrlData->ctrlDataCerruentFourXstate = ctrlDataInitParams->ctrlDataFourXEnable;
    231 #else
    232     pCtrlData->ctrlDataFourXEnable = FALSE;
    233     pCtrlData->ctrlDataCerruentFourXstate = FALSE;
    234 #endif
    235 
    236     MAC_COPY(pCtrlData->hOs, (&pCtrlData->ctrlDataDeviceMacAddress),
    237             (&ctrlDataInitParams->ctrlDataDeviceMacAddress));
    238 
    239     pCtrlData->ctrlDataStartStoplinkControlAlg = DEF_START_STOP_LINK_CTRL_ALG;
    240     pCtrlData->ctrlDataCurrentBasicRate = DEF_BASIC_RATE;
    241     pCtrlData->ctrlDataBasicRateBitMask = DEF_BASIC_RATE_MASK;
    242     pCtrlData->ctrlDataCurrentBasicModulationType = DRV_MODULATION_QPSK;
    243     pCtrlData->ctrlDataCurrentModulationType = DEF_CURRENT_MUDULATION_TYPE;
    244     pCtrlData->ctrlDataCurrentBssType = BSS_INFRASTRUCTURE;
    245     os_memoryCopy(pCtrlData->hOs, &pCtrlData->ctrlDataRateTables,
    246                                   &ctrlDataInitParams->rateTable,
    247                                   sizeof(rateTables_t) );
    248 
    249     for (clientIDindex = (rateClassClients_e)0 ; clientIDindex < NUM_OF_RATE_CLASS_CLIENTS ; clientIDindex++)
    250     {
    251         pCtrlData->bIsClassAvailable[clientIDindex] = TRUE;
    252         /* by default all clients use all available rates */
    253         pCtrlData->currClientRateMask[clientIDindex] = ALL_RATES_AVAILABLE;
    254         pCtrlData->nextClientRateMask[clientIDindex] = ALL_RATES_AVAILABLE;
    255 
    256         /* Init Params are initialized for USER & SG policies only */
    257         /* Set short/long retry for all ACs */
    258         for (ac=0; ac < MAX_NUM_OF_AC; ac++)
    259         {
    260             pCtrlData->ctrlDataTxRatePolicy.rateClass[clientIDindex*MAX_NUM_OF_AC+ac].longRetryLimit  = ctrlDataInitParams->ctrlDataTxRatePolicy[clientIDindex].longRetryLimit;
    261             pCtrlData->ctrlDataTxRatePolicy.rateClass[clientIDindex*MAX_NUM_OF_AC+ac].shortRetryLimit = ctrlDataInitParams->ctrlDataTxRatePolicy[clientIDindex].shortRetryLimit;
    262         }
    263 
    264         for (TxRateIndex = txPolicy54; TxRateIndex < MAX_NUM_OF_TX_RATES_IN_CLASS; TxRateIndex++)
    265         {
    266             pCtrlData->policyClassRatesArrayCck[clientIDindex].txRate[TxRateIndex] = ctrlDataInitParams->policyClassRatesArrayCck[clientIDindex].txRate[TxRateIndex];
    267             pCtrlData->policyClassRatesArrayPbcc[clientIDindex].txRate[TxRateIndex] = ctrlDataInitParams->policyClassRatesArrayPbcc[clientIDindex].txRate[TxRateIndex];
    268             pCtrlData->policyClassRatesArrayOfdm[clientIDindex].txRate[TxRateIndex] = ctrlDataInitParams->policyClassRatesArrayOfdm[clientIDindex].txRate[TxRateIndex];
    269             pCtrlData->policyClassRatesArrayOfdmA[clientIDindex].txRate[TxRateIndex] = ctrlDataInitParams->policyClassRatesArrayOfdmA[clientIDindex].txRate[TxRateIndex];
    270         }
    271     }
    272     /* By default use USER_RATE_CLASS */
    273     pCtrlData->currClientRateID = USER_RATE_CLASS;
    274     pCtrlData->configuredClientRateID = USER_RATE_CLASS;
    275 
    276     pCtrlData->ctrlDataCurrentRateTable = &pCtrlData->ctrlDataRateTables.ctrlDataCckRateTable;
    277 
    278     /* reset Counters */
    279     ctrlData_resetCounters(pCtrlData);
    280 
    281     /* Configure Rate Adaptation Module */
    282     rateAdaptation_config(pCtrlData->pRateAdaptation, hOs, hReport, pCtrlData, hEvHandler,
    283                           hAPConnection, &ctrlDataInitParams->rateAdaptationInitParam);
    284 
    285 #ifdef SUPPORT_4X
    286     /* configure fourX Module */
    287     fourX_config(pCtrlData->pFourX, hOs, hReport, hMemMngr, hWhalCtrl, hTxData,
    288                             &ctrlDataInitParams->fourXInitParams);
    289 #endif
    290 
    291     /* configure the classifier Module */
    292     Status = Classifier_config(pCtrlData->pClsfr, hOs, hReport, &ctrlDataInitParams->ClsfrInitParam);
    293     if (Status != OK)
    294     {
    295         WLAN_OS_REPORT(("FATAL ERROR: ctrlData_config(): Classifier_config() failed - Aborting\n"));
    296         return Status;
    297     }
    298 
    299     /* Initialize traffic intensity threshold parameters */
    300     pCtrlData->ctrlDataTrafficIntensityEventsEnabled = ctrlDataInitParams->ctrlDataTrafficThresholdEnabled;
    301     pCtrlData->ctrlDataTrafficIntensityThresholds.uHighThreshold = ctrlDataInitParams->ctrlDataTrafficThreshold.uHighThreshold;
    302     pCtrlData->ctrlDataTrafficIntensityThresholds.uLowThreshold = ctrlDataInitParams->ctrlDataTrafficThreshold.uLowThreshold;
    303     pCtrlData->ctrlDataTrafficIntensityThresholds.TestInterval = ctrlDataInitParams->ctrlDataTrafficThreshold.TestInterval;
    304 
    305     WLAN_REPORT_INFORMATION(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
    306        ("\nTraffic Intensity parameters:\nEvents enabled = %d\nuHighThreshold = %d\nuLowThreshold = %d\nTestInterval = %d\n\n",
    307        pCtrlData->ctrlDataTrafficIntensityEventsEnabled,
    308        pCtrlData->ctrlDataTrafficIntensityThresholds.uHighThreshold,
    309        pCtrlData->ctrlDataTrafficIntensityThresholds.uLowThreshold,
    310        pCtrlData->ctrlDataTrafficIntensityThresholds.TestInterval));
    311 
    312     /* Register the traffic intensity events with the traffic monitor */
    313     ctrlData_RegisterTrafficIntensityEvents (pCtrlData);
    314 
    315     /* If the events are enabled, start notification, if disabled - then do nothing */
    316     ctrlData_ToggleTrafficIntensityNotification (pCtrlData, pCtrlData->ctrlDataTrafficIntensityEventsEnabled);
    317 
    318     WLAN_REPORT_INIT(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
    319         (".....Ctrl Data configured successfully ...\n"));
    320 
    321     return OK;
    322 }
    323 
    324 /***************************************************************************
    325 *                           ctrlData_unLoad                                *
    326 ****************************************************************************
    327 * DESCRIPTION:  This function unload the Ctrl data module.
    328 *
    329 * INPUTS:       hCtrlData - the object
    330 *
    331 * OUTPUT:
    332 *
    333 * RETURNS:      OK - Unload succesfull
    334 *               NOK - Unload unsuccesfull
    335 ***************************************************************************/
    336 
    337 TI_STATUS ctrlData_unLoad(TI_HANDLE hCtrlData)
    338 {
    339     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
    340 
    341     /* check parameters validity */
    342     if( pCtrlData == NULL )
    343     {
    344         WLAN_REPORT_ERROR(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
    345             (" ctrlData_unLoad() : parametrs value error \n"));
    346         return NOK;
    347     }
    348 
    349 
    350     rateAdaptation_destroy(pCtrlData->pRateAdaptation);
    351 #ifdef SUPPORT_4X
    352     fourX_destroy(pCtrlData->pFourX);
    353 #endif
    354     Classifier_destroy(pCtrlData->pClsfr);
    355 
    356     /* free timer */
    357     /* free control module controll block */
    358     os_memoryFree(pCtrlData->hOs, hCtrlData, sizeof(ctrlData_t));
    359 
    360     return OK;
    361 }
    362 /***************************************************************************
    363 *                           ctrlData_getParam                              *
    364 ****************************************************************************
    365 * DESCRIPTION:  get a specific parameter
    366 *
    367 * INPUTS:       hCtrlData - the object
    368 *
    369 *
    370 * OUTPUT:       pParamInfo - structure which include the value of
    371 *               the requested parameter
    372 *
    373 * RETURNS:      OK
    374 *               NOK
    375 ***************************************************************************/
    376 
    377 TI_STATUS ctrlData_getParam(TI_HANDLE hCtrlData, paramInfo_t *pParamInfo)
    378 {
    379     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
    380 
    381     /* WLAN_REPORT_INFORMATION(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
    382         ("ctrlData_getParam() : param=0x%x \n", pParamInfo->paramType)); */
    383 
    384     switch (pParamInfo->paramType)
    385     {
    386     case CTRL_DATA_RATE_CONTROL_ENABLE_PARAM:
    387         pParamInfo->content.ctrlDataRateControlEnable = pCtrlData->ctrlDataRateControlEnable;
    388         break;
    389 
    390     case CTRL_DATA_FOUR_X_ENABLE_PARAM:
    391         pParamInfo->content.ctrlDataFourXEnable = pCtrlData->ctrlDataFourXEnable;
    392         break;
    393 
    394     case CTRL_DATA_FOUR_X_CURRRENT_STATUS_PARAM:
    395         if (pCtrlData->ctrlDataCurrentBssType == BSS_INFRASTRUCTURE)
    396         {
    397             pParamInfo->content.ctrlDataCerruentFourXstate = pCtrlData->ctrlDataCerruentFourXstate;
    398         } else {
    399             pParamInfo->content.ctrlDataCerruentFourXstate = pCtrlData->ctrlDataFourXEnable;
    400         }
    401 
    402         break;
    403 
    404     case CTRL_DATA_CURRENT_BSSID_PARAM:
    405         MAC_COPY(pCtrlData->hOs, (&pParamInfo->content.ctrlDataCurrentBSSID),
    406                 (&pCtrlData->ctrlDataCurrentBSSID));
    407         break;
    408 
    409     case CTRL_DATA_CURRENT_BSS_TYPE_PARAM:
    410         pParamInfo->content.ctrlDataCurrentBssType = pCtrlData->ctrlDataCurrentBssType;
    411         break;
    412 
    413     case CTRL_DATA_CURRENT_MODULATION_TYPE_PARAM:
    414         pParamInfo->content.ctrlDataCurrentModulationType = pCtrlData->ctrlDataCurrentModulationType;
    415         break;
    416 
    417     case CTRL_DATA_CURRENT_PREAMBLE_TYPE_PARAM:
    418         pParamInfo->content.ctrlDataCurrentPreambleType = pCtrlData->ctrlDataCurrentPreambleType;
    419         break;
    420 
    421     case CTRL_DATA_MAC_ADDRESS:
    422         MAC_COPY(pCtrlData->hOs, (&pParamInfo->content.ctrlDataDeviceMacAddress), (&pCtrlData->ctrlDataDeviceMacAddress));
    423         break;
    424 
    425     case CTRL_DATA_CURRENT_BASIC_RATE_PARAM:
    426         pParamInfo->content.ctrlDataCurrentBasicRate = pCtrlData->ctrlDataCurrentBasicRate;
    427         break;
    428 
    429     case CTRL_DATA_CURRENT_BASIC_RATE_MASK_PARAM:
    430         pParamInfo->content.ctrlDataBasicRateBitMask = pCtrlData->ctrlDataBasicRateBitMask;
    431         break;
    432 
    433     case CTRL_DATA_CURRENT_BASIC_MODULATION_PARAM:
    434         pParamInfo->content.ctrlDataCurrentBasicModulationType = pCtrlData->ctrlDataCurrentBasicModulationType;
    435         break;
    436 
    437     case CTRL_DATA_COUNTERS_PARAM:
    438         os_memoryCopy(pCtrlData->hOs,&pParamInfo->content.ctrlDataCounters,
    439             &pCtrlData->ctrlDataCounters, sizeof(ctrlDataCounters_t));
    440         break;
    441 
    442     case CTRL_DATA_CURRENT_SUPPORTED_RATE_MASK_PARAM:
    443         pParamInfo->content.ctrlDataCurrentRateMask = pCtrlData->ctrlDataCurrentRateMask;
    444         break;
    445 
    446     case CTRL_DATA_CURRENT_PROTECTION_STATUS_PARAM:
    447         pParamInfo->content.ctrlDataProtectionEnabled = pCtrlData->ctrlDataProtectionEnabled;
    448         break;
    449 
    450     case CTRL_DATA_CURRENT_IBSS_PROTECTION_PARAM:
    451         pParamInfo->content.ctrlDataIbssProtecionType = pCtrlData->ctrlDataIbssProtectionType;
    452         break;
    453 
    454     case CTRL_DATA_CURRENT_RTS_CTS_STATUS_PARAM:
    455         pParamInfo->content.ctrlDataRtsCtsStatus = pCtrlData->ctrlDataRtsCtsStatus;
    456         break;
    457 
    458     case CTRL_DATA_CLSFR_TYPE:
    459         Classifier_getClsfrType (pCtrlData->pClsfr,&pParamInfo->content.ctrlDataClsfrType);
    460         break;
    461         /*
    462          * NOTE: currently supporting only USER_RATE_CLASS!!!!!!!!!
    463          */
    464     case CTRL_DATA_SHORT_RETRY_LIMIT_PARAM:
    465         pParamInfo->content.TxRatePolicy.rateClass[USER_RATE_CLASS].shortRetryLimit = pCtrlData->ctrlDataTxRatePolicy.rateClass[USER_RATE_CLASS].shortRetryLimit;
    466         break;
    467 
    468         /*
    469          * NOTE: currently supporting only ONE txRatePolicy!!!!!!!!!
    470          */
    471     case CTRL_DATA_LONG_RETRY_LIMIT_PARAM:
    472         pParamInfo->content.TxRatePolicy.rateClass[USER_RATE_CLASS].longRetryLimit = pCtrlData->ctrlDataTxRatePolicy.rateClass[USER_RATE_CLASS].longRetryLimit;
    473         break;
    474 
    475 
    476     case CTRL_DATA_TRAFFIC_INTENSITY_THRESHOLD:
    477         pParamInfo->content.ctrlDataTrafficIntensityThresholds.uHighThreshold = pCtrlData->ctrlDataTrafficIntensityThresholds.uHighThreshold;
    478         pParamInfo->content.ctrlDataTrafficIntensityThresholds.uLowThreshold = pCtrlData->ctrlDataTrafficIntensityThresholds.uLowThreshold;
    479         pParamInfo->content.ctrlDataTrafficIntensityThresholds.TestInterval = pCtrlData->ctrlDataTrafficIntensityThresholds.TestInterval;
    480         break;
    481 
    482     default:
    483         return (PARAM_NOT_SUPPORTED);
    484 /*        WLAN_REPORT_ERROR(pCtrlData->hReport, TX_DATA_MODULE_LOG,
    485             (" ctrlData_getParam() : PARAMETER NOT SUPPORTED \n"));
    486         return NOK;
    487         break; - unreachable */
    488     }
    489 
    490     return (OK);
    491 }
    492 
    493 
    494 /***************************************************************************
    495 *                           ctrlData_getParam                              *
    496 ****************************************************************************
    497 * DESCRIPTION:  get a specific parameter
    498 *
    499 * INPUTS:       hCtrlData - the object
    500 *
    501 *
    502 * OUTPUT:       pParamInfo - structure which include the value of
    503 *               the requested parameter
    504 *
    505 * RETURNS:      OK
    506 *               NOK
    507 ***************************************************************************/
    508 /* note: ctrlData_getParamPartial() is part of ctrlData_getParam() it was implemented to reduce Stack usage */
    509 TI_STATUS ctrlData_getParamPartial(TI_HANDLE hCtrlData, paramInfoPartial_t *pParamInfo)
    510 {
    511     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
    512 
    513   switch (pParamInfo->paramType)
    514     {
    515     case CTRL_DATA_CURRENT_PREAMBLE_TYPE_PARAM:
    516         pParamInfo->content.ctrlDataCurrentPreambleType = pCtrlData->ctrlDataCurrentPreambleType;
    517         break;
    518 
    519 	default:
    520         return (PARAM_NOT_SUPPORTED);
    521     }
    522 
    523     return (OK);
    524 }
    525 
    526 /***************************************************************************
    527 *                           ctrlData_buildSupportedHwRates                 *
    528 ****************************************************************************
    529 * DESCRIPTION:  builds HwRatesBitMap (supported rates) for txRatePolicy using 4 elements :
    530 *               1) AP support
    531 *               2) Driver support
    532 *               3) Client support (using currClientRateMask[clientIDindex] )
    533 *               4) Policy rates   (retries per client)
    534 *
    535 * OUTPUT:
    536 *
    537 * RETURNS:      OK
    538 *               NOK
    539 ***************************************************************************/
    540 static UINT32 ctrlData_buildSupportedHwRates(ctrlData_rateAdapt_t *pDriverTable,
    541                                              UINT32             APsupport,
    542                                              UINT32             clientSupport,
    543                                              UINT32             policySupport)
    544 {
    545     UINT16  AppRateBitMap = 0;
    546     UINT32  HwRatesBitMap, DriverTableBitMap = 0;
    547     UINT32 i = 0;
    548 
    549     /* 1. Convert Rates table into bit mask */
    550     while (i <= pDriverTable->len)
    551     {
    552         DriverTableBitMap |= (1 << (pDriverTable->rateAdaptRatesTable[i++] - 1));
    553     }
    554 
    555     /* 2. AND with other masks */
    556     AppRateBitMap = (UINT16)(DriverTableBitMap & APsupport & clientSupport & policySupport);
    557 
    558     /* In case there are no mutual rates, try to ignore policy settings */
    559     if (AppRateBitMap == 0)
    560     {
    561         AppRateBitMap = (UINT16)(DriverTableBitMap & APsupport);
    562     }
    563 
    564     /* 3. Set total supported rates bit map for txRatePolicy */
    565     ConvertAppRatesToBitmap(AppRateBitMap, &HwRatesBitMap);
    566 
    567     return HwRatesBitMap;
    568 }
    569 
    570 
    571 /***************************************************************************
    572 *                           ctrlData_setTxRatePolicies                     *
    573 ****************************************************************************
    574 * DESCRIPTION:  This function sets rate fallback policies to be configured to FW
    575 *               If TSRS is defined to specific AC, the policy is derived from it,
    576 *               otherwise it is derived from pre-defined map
    577 *
    578 * INPUTS:       pCtrlData - the object
    579 *
    580 * RETURNS:      -
    581 *
    582 ***************************************************************************/
    583 static void ctrlData_setTxRatePolicies(ctrlData_t *pCtrlData)
    584 {
    585     UINT32 ac, policyClassRateMask, supportedHwRatesBitMap, clientIDindex, hwRateIndex;
    586     UINT32 fwPolicyID;
    587     UINT8 shortRetryLimit, longRetryLimit;
    588     txRateClassId_e  txRateIndex;
    589     whalParamInfo_t param;
    590 
    591     pCtrlData->currClientRateID = pCtrlData->configuredClientRateID;
    592 
    593     for (clientIDindex = 0, fwPolicyID = 0; clientIDindex < NUM_OF_RATE_CLASS_CLIENTS; clientIDindex++)
    594     {
    595         /* Retrieve retry limits stored in first AC of current class */
    596         shortRetryLimit = pCtrlData->ctrlDataTxRatePolicy.rateClass[fwPolicyID].shortRetryLimit;
    597         longRetryLimit = pCtrlData->ctrlDataTxRatePolicy.rateClass[fwPolicyID].longRetryLimit;
    598 
    599         /* By default assume that this class can be enabled */
    600         pCtrlData->bIsClassAvailable[clientIDindex] = TRUE;
    601 
    602         /* Update the rate mask from nextClientRateMask, where it was stored untill now */
    603         pCtrlData->currClientRateMask[clientIDindex] = pCtrlData->nextClientRateMask[clientIDindex];
    604 
    605         for (ac = 0; ac < MAX_NUM_OF_AC; ac++)
    606         {
    607             /* 1. Check if there is special rate set defined for this access category, */
    608             /*    then verify that at least one rate is mutual between TSRS and class policy, */
    609             /*    otherwise use default settings for this class */
    610             if (pCtrlData->tsrsParameters[ac].supportedRatesMask[clientIDindex] != 0)
    611             {
    612                 /* Check if at least one rate is mutual between TSRS and current class policy, */
    613                 /* otherwise use default for this class */
    614                 policyClassRateMask = pCtrlData->tsrsParameters[ac].policyClassRateMask[clientIDindex];
    615             }
    616             else
    617             {
    618                 policyClassRateMask = ctrlData_buildHwBitMapFromArray(&(pCtrlData->pCurrPolicyClassRatesArray[clientIDindex]));
    619             }
    620 
    621             /* 2. Build a bitMap for the supported rates */
    622             supportedHwRatesBitMap = ctrlData_buildSupportedHwRates(
    623                                 pCtrlData->ctrlDataCurrentRateTable,            /* according to radio mode */
    624                                 pCtrlData->ctrlDataCurrentRateMask,             /* AP supported rates */
    625                                 pCtrlData->currClientRateMask[clientIDindex],   /* STA supported rates */
    626                                 policyClassRateMask);                           /* requested by class policy rates */
    627 
    628             if (supportedHwRatesBitMap == 0)
    629             {
    630                 WLAN_REPORT_ERROR(pCtrlData->hReport,CTRL_DATA_MODULE_LOG,
    631                                   ("%s No supported rates for client %d, ac %d \n", __FUNCTION__, clientIDindex, ac));
    632                 pCtrlData->bIsClassAvailable[clientIDindex] = FALSE;
    633                 pCtrlData->currClientRateID = USER_RATE_CLASS;
    634             }
    635 
    636             /* 3. Configure retransmission for the rates */
    637             for (hwRateIndex = HW_BIT_RATE_54MBPS, txRateIndex = txPolicy54;
    638                  txRateIndex < MAX_NUM_OF_TX_RATES_IN_CLASS;
    639                  hwRateIndex >>= 1, txRateIndex++)
    640             {
    641                 /* if supported rate */
    642                 if (supportedHwRatesBitMap & hwRateIndex)
    643                 {
    644                     /* if rate fall back is enabled */
    645                     if (pCtrlData->ctrlDataRateControlEnable)
    646                     {
    647                         /* Set retries as they were configured in ini file for this class; */
    648                         /* make sure at least one retransmission is defined, */
    649                         /* to take care of cases in which we ignored pre-defined policy */
    650                         pCtrlData->ctrlDataTxRatePolicy.rateClass[fwPolicyID].txRate[txRateIndex] =
    651                             (pCtrlData->pCurrPolicyClassRatesArray[clientIDindex].txRate[txRateIndex] > 1) ?
    652                             pCtrlData->pCurrPolicyClassRatesArray[clientIDindex].txRate[txRateIndex] : 1;
    653                     }
    654                     else /* no rate fallback */
    655                     {
    656                         /* set max reties because no fall back is implemented */
    657                         pCtrlData->ctrlDataTxRatePolicy.rateClass[fwPolicyID].txRate[txRateIndex] =
    658                             (shortRetryLimit > longRetryLimit) ? shortRetryLimit : longRetryLimit;
    659                         pCtrlData->ctrlDataTxRatePolicy.rateClass[fwPolicyID].flags |= TX_POLICY_FLAGS_TRUNCATE;
    660                     }
    661                 }
    662                 else
    663                 {
    664                     pCtrlData->ctrlDataTxRatePolicy.rateClass[fwPolicyID].txRate[txRateIndex] = 0;
    665                 }
    666 
    667                 WLAN_REPORT_INFORMATION(pCtrlData->hReport,CTRL_DATA_MODULE_LOG,
    668                     ("%s: AC %d, class %d, rate 0x%x[%d]\n", __FUNCTION__, ac, clientIDindex, hwRateIndex, pCtrlData->ctrlDataTxRatePolicy.rateClass[fwPolicyID].txRate[txRateIndex]));
    669             }
    670 
    671             /* Note that Long/Short retries are pre-set during configuration stage */
    672 
    673             /* 4. Finally, increase total number of policies */
    674             pCtrlData->tsrsParameters[ac].fwPolicyID[clientIDindex] = fwPolicyID++;
    675         }
    676     }
    677 
    678     /* Download policies to the FW. Num of policies is 8 - one for each AC for every class */
    679     WLAN_REPORT_INFORMATION(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
    680         ("%s: num of Rate policies: %d\n", __FUNCTION__, fwPolicyID));
    681 
    682     pCtrlData->ctrlDataTxRatePolicy.numOfRateClasses = fwPolicyID;
    683     param.paramType = HAL_CTRL_TX_RATE_CLASS_PARAMS;
    684     param.content.pTxRatePlicy = &pCtrlData->ctrlDataTxRatePolicy;
    685 
    686     whalCtrl_SetParam(pCtrlData->hWhalCtrl, &param);
    687 }
    688 
    689 
    690 /***************************************************************************
    691 *                           ctrlData_setParam                              *
    692 ****************************************************************************
    693 * DESCRIPTION:  set a specific parameter
    694 *
    695 * INPUTS:       hCtrlData - the object
    696 *               pParamInfo - structure which include the value to set for
    697 *               the requested parameter
    698 *
    699 * OUTPUT:
    700 *
    701 * RETURNS:      OK
    702 *               NOK
    703 ***************************************************************************/
    704 
    705 TI_STATUS ctrlData_setParam(TI_HANDLE hCtrlData, paramInfo_t *pParamInfo)
    706 {
    707     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
    708     whalParamInfo_t param;
    709     rateClassClients_e clientID;
    710 
    711     /* WLAN_REPORT_INFORMATION(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
    712         ("ctrlData_setParam() : param=0x%x \n", pParamInfo->paramType)); */
    713 
    714     switch (pParamInfo->paramType)
    715     {
    716     case CTRL_DATA_RATE_CONTROL_ENABLE_PARAM:
    717         pCtrlData->ctrlDataRateControlEnable = pParamInfo->content.ctrlDataRateControlEnable;
    718         selectRateTable(pCtrlData, pCtrlData->ctrlDataCurrentRateMask);
    719 
    720         ctrlData_setTxRatePolicies(pCtrlData);
    721 
    722         rateAdaptation_buildRateMapTable(pCtrlData->pRateAdaptation,
    723                                                  pCtrlData->ctrlDataCurrentRateTable,
    724                                                  pCtrlData->ctrlDataCurrentRateMask,
    725                                                  pCtrlData->currClientRateMask[pCtrlData->currClientRateID],
    726                                                  pCtrlData->ctrlDataCurrentModulationType,
    727                                                  pCtrlData->ctrlDataCerruentFourXstate,
    728                                           pCtrlData->ctrlDataCurrentBssType);
    729 
    730 
    731 
    732 
    733 
    734              if(pCtrlData->ctrlDataRateControlEnable == TRUE )
    735              {
    736                  /* start rate adaptation algorithm */
    737 
    738                 if( pCtrlData->ctrlDataStartStoplinkControlAlg == TRUE)
    739                 {
    740 
    741                 rateAdaptation_start(pCtrlData->pRateAdaptation);
    742             }
    743             else
    744             {
    745                 /* stop rate adaptation algorithm */
    746                 rateAdaptation_stop(pCtrlData->pRateAdaptation);
    747             }
    748         }
    749         else
    750         {
    751             rateAdaptation_stopTimer(pCtrlData->pRateAdaptation);
    752         }
    753         break;
    754 
    755     case CTRL_DATA_FOUR_X_ENABLE_PARAM:
    756 #ifdef SUPPORT_4X
    757         pCtrlData->ctrlDataFourXEnable = pParamInfo->content.ctrlDataFourXEnable;
    758         if(pCtrlData->ctrlDataStartStoplinkControlAlg == TRUE)
    759         {
    760             if(pCtrlData->ctrlDataFourXEnable == TRUE)
    761             {
    762                 pCtrlData->ctrlDataCerruentFourXstate = TRUE;
    763             }
    764             else
    765             {
    766                 pCtrlData->ctrlDataCerruentFourXstate = FALSE;
    767             }
    768         }
    769         rateAdaptation_update4xEnable(pCtrlData->pRateAdaptation,
    770                                       pCtrlData->ctrlDataCerruentFourXstate,
    771                                       pCtrlData->ctrlDataCurrentBssType );
    772 
    773 #else
    774         pCtrlData->ctrlDataFourXEnable = FALSE;
    775         pCtrlData->ctrlDataCerruentFourXstate = FALSE;
    776 #endif
    777         break;
    778 
    779     case CTRL_DATA_CURRENT_RATE_CLASS_CLIENT:
    780         /* set a new rate class client to be used on data packets */
    781         clientID = pParamInfo->content.ctrlDataRateClassID;
    782         /* always save the wanted configuration , even when not enabled */
    783         pCtrlData->configuredClientRateID = clientID;
    784 
    785         if (clientID == pCtrlData->currClientRateID)
    786         {
    787             /* Do nothing - already configured */
    788             break;
    789         }
    790         else
    791         {
    792             if (TRUE == pCtrlData->bIsClassAvailable[clientID])
    793             {
    794                 /* use the new clientID + reset rateAdaptation tables */
    795                 pCtrlData->currClientRateID = clientID;
    796                 selectRateTable(pCtrlData, pCtrlData->ctrlDataCurrentRateMask);
    797                 rateAdaptation_buildRateMapTable(pCtrlData->pRateAdaptation,
    798                                                      pCtrlData->ctrlDataCurrentRateTable,
    799                                                      pCtrlData->ctrlDataCurrentRateMask,
    800                                                      pCtrlData->currClientRateMask[pCtrlData->currClientRateID],
    801                                                      pCtrlData->ctrlDataCurrentModulationType,
    802                                                      pCtrlData->ctrlDataCerruentFourXstate,
    803                                                      pCtrlData->ctrlDataCurrentBssType);
    804                 break;
    805 
    806             }
    807             else
    808             {
    809                 /* The class could not be configured due to no rate support - don't use it */
    810                 WLAN_REPORT_ERROR(pCtrlData->hReport,CTRL_DATA_MODULE_LOG,
    811                     ("%s: Can't enable rate class ID %d\n",__FUNCTION__,clientID));
    812                 break;
    813             }
    814         }
    815 
    816     case CTRL_DATA_NEXT_RATE_MASK_FOR_CLIENT:
    817         /* configure the next rate mask to be used for a specific client on the next connection */
    818         /* NOTE : changing USER_RATE_CLASS configuration is not advisable */
    819         pCtrlData->nextClientRateMask[pParamInfo->content.ctrlDataRateClassMask.clientID] =
    820             pParamInfo->content.ctrlDataRateClassMask.clientRateMask;
    821         break;
    822 
    823     case CTRL_DATA_FOUR_X_CURRRENT_STATUS_PARAM:
    824 #ifdef SUPPORT_4X
    825         if((pCtrlData->ctrlDataFourXEnable == TRUE) &&
    826            (pCtrlData->ctrlDataCurrentBssType == BSS_INFRASTRUCTURE))
    827             pCtrlData->ctrlDataCerruentFourXstate = pParamInfo->content.ctrlDataCerruentFourXstate;
    828         else
    829             pCtrlData->ctrlDataCerruentFourXstate = FALSE;
    830 #else
    831         pCtrlData->ctrlDataCerruentFourXstate = FALSE;
    832 #endif
    833         break;
    834 
    835     case CTRL_DATA_CURRENT_BSSID_PARAM:
    836         MAC_COPY(pCtrlData->hOs, (&pCtrlData->ctrlDataCurrentBSSID),
    837             (&pParamInfo->content.ctrlDataCurrentBSSID));
    838         break;
    839 
    840     case CTRL_DATA_CURRENT_BSS_TYPE_PARAM:
    841         if( pParamInfo->content.ctrlDataCurrentBssType != BSS_INFRASTRUCTURE &&
    842             pParamInfo->content.ctrlDataCurrentBssType != BSS_INDEPENDENT )
    843             return(PARAM_VALUE_NOT_VALID);
    844 
    845         pCtrlData->ctrlDataCurrentBssType = pParamInfo->content.ctrlDataCurrentBssType;
    846         break;
    847 
    848     case CTRL_DATA_CURRENT_MODULATION_TYPE_PARAM:
    849         pCtrlData->ctrlDataCurrentModulationType = pParamInfo->content.ctrlDataCurrentModulationType;
    850         /* update rate modulatin table for Rate adaptation algorithm */
    851 
    852         rateAdaptation_updateModulation(pCtrlData->pRateAdaptation,
    853                                         pCtrlData->ctrlDataCurrentModulationType,
    854                                         pCtrlData->ctrlDataCurrentBssType);
    855 
    856         break;
    857 
    858     case CTRL_DATA_CURRENT_PREAMBLE_TYPE_PARAM:
    859         if( pParamInfo->content.ctrlDataCurrentPreambleType != PREAMBLE_LONG &&
    860             pParamInfo->content.ctrlDataCurrentPreambleType != PREAMBLE_SHORT )
    861             return(PARAM_VALUE_NOT_VALID);
    862 
    863         pCtrlData->ctrlDataCurrentPreambleType = pParamInfo->content.ctrlDataCurrentPreambleType;
    864 
    865         break;
    866 
    867     case CTRL_DATA_MAC_ADDRESS:
    868         {
    869             int status;
    870 			status = whalCtrl_SetMacAddress(pCtrlData->hWhalCtrl, &pParamInfo->content.ctrlDataDeviceMacAddress);
    871 			WLAN_REPORT_ERROR(pCtrlData->hReport, TX_DATA_MODULE_LOG,
    872 							  (" ctrlData_setParam() : MAC ADDRESS SET STATUS: %d \n",status));
    873 			if(status == OK)
    874 				MAC_COPY(pCtrlData->hOs, (&pCtrlData->ctrlDataDeviceMacAddress),
    875 						 (&pParamInfo->content.ctrlDataDeviceMacAddress));
    876 
    877         }
    878         break;
    879 
    880     case CTRL_DATA_CURRENT_BASIC_RATE_PARAM:
    881 
    882         pCtrlData->ctrlDataCurrentBasicRate = pParamInfo->content.ctrlDataCurrentBasicRate;
    883         /* for Basic Rate Set use the USER_RATE_CLASS (otherwise we could get 0 rates) */
    884         pCtrlData->ctrlDataBasicRateBitMask = rateAdaptation_Utils_buildRateBitMap(pCtrlData->pRateAdaptation,
    885                                                                                    pCtrlData->ctrlDataCurrentRateTable,
    886                                                                                    pCtrlData->ctrlDataCurrentBasicRate,
    887                                                                                    pCtrlData->ctrlDataCurrentRateMask,
    888                                                                                    pCtrlData->currClientRateMask[USER_RATE_CLASS]);
    889         break;
    890 
    891     case CTRL_DATA_CURRENT_BASIC_RATE_MASK_PARAM:
    892         pCtrlData->ctrlDataBasicRateBitMask = pParamInfo->content.ctrlDataBasicRateBitMask;
    893         break;
    894 
    895     case CTRL_DATA_CURRENT_BASIC_MODULATION_PARAM:
    896         pCtrlData->ctrlDataCurrentBasicModulationType = pParamInfo->content.ctrlDataCurrentBasicModulationType;
    897         break;
    898 
    899 
    900     case CTRL_DATA_CURRENT_SUPPORTED_RATE_MASK_PARAM:
    901         pCtrlData->ctrlDataCurrentRateMask = pParamInfo->content.ctrlDataCurrentRateMask;
    902         selectRateTable(pCtrlData, pCtrlData->ctrlDataCurrentRateMask);
    903         rateAdaptation_buildRateMapTable(pCtrlData->pRateAdaptation,
    904                                          pCtrlData->ctrlDataCurrentRateTable,
    905                                          pCtrlData->ctrlDataCurrentRateMask,
    906                                          pCtrlData->currClientRateMask[pCtrlData->currClientRateID],
    907                                          (modulationType_e)pCtrlData->ctrlDataCerruentFourXstate,
    908                                          pCtrlData->ctrlDataCurrentModulationType,
    909                                          pCtrlData->ctrlDataCurrentBssType);
    910 
    911 
    912         break;
    913 
    914     case CTRL_DATA_CURRENT_ACTIVE_RATE_PARAM:
    915         rateAdaptation_setCurrentRate(pCtrlData->pRateAdaptation, pParamInfo->content.ctrlDataCurrentActiveRate);
    916 
    917         break;
    918 
    919     case CTRL_DATA_TSRS_PARAM:
    920         ctrlData_storeTSRateSet(pCtrlData, &pParamInfo->content.txDataQosParams);
    921 
    922         break;
    923 
    924     case CTRL_DATA_CURRENT_PROTECTION_STATUS_PARAM:
    925         if (pCtrlData->ctrlDataProtectionEnabled != pParamInfo->content.ctrlDataProtectionEnabled)
    926         {
    927             pCtrlData->ctrlDataProtectionEnabled = pParamInfo->content.ctrlDataProtectionEnabled;
    928 
    929             /* set indication also to TNET */
    930             param.paramType = HAL_CTRL_CTS_TO_SELF_PARAM;
    931             if(pCtrlData->ctrlDataProtectionEnabled == TRUE)
    932                 param.content.halCtrlCtsToSelf = CTS_TO_SELF_ENABLE;
    933             else
    934                 param.content.halCtrlCtsToSelf = CTS_TO_SELF_DISABLE;
    935 
    936             whalCtrl_SetParam(pCtrlData->hWhalCtrl,&param);
    937 
    938 
    939             /* In case of using protection fragmentation should be disabled */
    940             param.paramType = HAL_CTRL_FRAG_THRESHOLD_PARAM;
    941             if(pCtrlData->ctrlDataProtectionEnabled == TRUE)
    942             {
    943                 /* save last non-protection mode fragmentation threshold */
    944                 whalCtrl_GetParam(pCtrlData->hWhalCtrl,&param);
    945                 pCtrlData->lastFragmentThreshold = param.content.halCtrlFragThreshold;
    946                 /* set fragmentation threshold to max (disable) */
    947                 param.content.halCtrlFragThreshold = HAL_CTRL_FRAG_THRESHOLD_MAX;
    948             }
    949             else
    950                 param.content.halCtrlFragThreshold = pCtrlData->lastFragmentThreshold;
    951 
    952             whalCtrl_SetParam(pCtrlData->hWhalCtrl,&param);
    953         }
    954 
    955         break;
    956 
    957     case CTRL_DATA_CURRENT_IBSS_PROTECTION_PARAM:
    958         pCtrlData->ctrlDataIbssProtectionType = pParamInfo->content.ctrlDataIbssProtecionType;
    959 
    960         /* set indication also to TNET */
    961         param.paramType = HAL_CTRL_CTS_TO_SELF_PARAM;
    962         if(pCtrlData->ctrlDataIbssProtectionType != ERP_PROTECTION_NONE)
    963             param.content.halCtrlCtsToSelf = CTS_TO_SELF_ENABLE;
    964         else
    965             param.content.halCtrlCtsToSelf = CTS_TO_SELF_DISABLE;
    966 
    967         whalCtrl_SetParam(pCtrlData->hWhalCtrl,&param);
    968 
    969         break;
    970 
    971     case CTRL_DATA_CURRENT_RTS_CTS_STATUS_PARAM:
    972         pCtrlData->ctrlDataRtsCtsStatus = pParamInfo->content.ctrlDataRtsCtsStatus;
    973         break;
    974     case CTRL_DATA_CLSFR_TYPE:
    975         ctrlData_clsfrSetClsfrType (pCtrlData->pClsfr,pParamInfo->content.ctrlDataClsfrType);
    976         break;
    977 
    978     case CTRL_DATA_CLSFR_CONFIG:
    979             Classifier_InsertClsfrEntry(pCtrlData->pClsfr, 1, &pParamInfo->content.ctrlDataClsfrInsertTable);
    980         break;
    981 
    982     case CTRL_DATA_CLSFR_REMOVE_ENTRY:
    983          classifier_RemoveClsfrEntry(pCtrlData->pClsfr, &pParamInfo->content.ctrlDataClsfrInsertTable);
    984        break;
    985 
    986     case CTRL_DATA_GET_USER_PRIORITY_OF_STREAM:
    987        Classifier_deriveUserPriorityFromStream (pCtrlData->pClsfr,&pParamInfo->content.ctrlDataUpOfStream);
    988        break;
    989             /*
    990          * NOTE: currently supporting only ONE txRatePolicy!!!!!!!!!
    991          */
    992     case CTRL_DATA_SHORT_RETRY_LIMIT_PARAM:
    993         pCtrlData->ctrlDataTxRatePolicy.rateClass[USER_RATE_CLASS].shortRetryLimit = pParamInfo->content.TxRatePolicy.rateClass[USER_RATE_CLASS].shortRetryLimit;
    994         break;
    995 
    996         /*
    997          * NOTE: currently supporting only ONE txRatePolicy!!!!!!!!!
    998          */
    999     case CTRL_DATA_LONG_RETRY_LIMIT_PARAM:
   1000         pCtrlData->ctrlDataTxRatePolicy.rateClass[USER_RATE_CLASS].longRetryLimit = pParamInfo->content.TxRatePolicy.rateClass[USER_RATE_CLASS].longRetryLimit;
   1001         break;
   1002 
   1003     case CTRL_DATA_TOGGLE_TRAFFIC_INTENSITY_EVENTS:
   1004 
   1005             /* Enable or disable events according to flag */
   1006             ctrlData_ToggleTrafficIntensityNotification (pCtrlData, (BOOL)pParamInfo->content.ctrlDataTrafficIntensityEventsFlag);
   1007 
   1008         break;
   1009 
   1010     case CTRL_DATA_TRAFFIC_INTENSITY_THRESHOLD:
   1011         {
   1012             OS_802_11_TRAFFIC_INTENSITY_THRESHOLD_PARAMS *localParams = &pParamInfo->content.ctrlDataTrafficIntensityThresholds;
   1013             BOOL savedEnableFlag;   /* Used to save previous enable/disable flag - before stopping/starting events for change in params */
   1014 
   1015             /* If any of the parameters has changed, we need to re-register with the Traffic Monitor */
   1016             if ((localParams->uHighThreshold != pCtrlData->ctrlDataTrafficIntensityThresholds.uHighThreshold) ||
   1017                 (localParams->uLowThreshold != pCtrlData->ctrlDataTrafficIntensityThresholds.uLowThreshold) ||
   1018                 (localParams->TestInterval != pCtrlData->ctrlDataTrafficIntensityThresholds.TestInterval))
   1019             {
   1020 
   1021                 os_memoryCopy(pCtrlData->hOs, &pCtrlData->ctrlDataTrafficIntensityThresholds,
   1022                                 localParams,
   1023                                 sizeof(OS_802_11_TRAFFIC_INTENSITY_THRESHOLD_PARAMS));
   1024 
   1025                 savedEnableFlag = pCtrlData->ctrlDataTrafficIntensityEventsEnabled;
   1026 
   1027                 /* Turn off traffic events */
   1028                 ctrlData_ToggleTrafficIntensityNotification (pCtrlData, FALSE);
   1029 
   1030                 /* Unregister current events */
   1031                 ctrlData_UnregisterTrafficIntensityEvents (pCtrlData);
   1032 
   1033                 /* And re-register with new thresholds */
   1034                 ctrlData_RegisterTrafficIntensityEvents (pCtrlData);
   1035 
   1036                 /* Enable events if they were enabled  */
   1037                 ctrlData_ToggleTrafficIntensityNotification (pCtrlData, savedEnableFlag);
   1038 
   1039             }
   1040         }
   1041 
   1042         break;
   1043 
   1044     default:
   1045         WLAN_REPORT_ERROR(pCtrlData->hReport, TX_DATA_MODULE_LOG,
   1046             (" ctrlData_setParam() : PARAMETER NOT SUPPORTED \n"));
   1047         return (PARAM_NOT_SUPPORTED);
   1048 /*        break; - unrechable */
   1049     }
   1050 
   1051     return (OK);
   1052 }
   1053 
   1054 /***************************************************************************
   1055 *                           ctrlData_getTspecsRateThresholds                                   *
   1056 ****************************************************************************
   1057 * DESCRIPTION:  The function retrieves the current low/high phy rate thresholds.
   1058 *
   1059 * INPUTS:       hCtrlData - the object
   1060 *               uAC       - The AC number.
   1061 *
   1062 * OUTPUT:       pHighThreshold - The current phy rate high threshold
   1063 *               pHighThreshold - The current phy rate low threshold
   1064 *
   1065 * RETURNS:
   1066 ***************************************************************************/
   1067 void ctrlData_getTspecsRateThresholds(TI_HANDLE hCtrlData, UINT8 uAC, UINT32* pHighThreshold, UINT32* pLowThreshold)
   1068 {
   1069     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
   1070     rateAdaptation_t* pRateAdaptation = (rateAdaptation_t*)pCtrlData->pRateAdaptation;
   1071 
   1072     *pHighThreshold = hostToUtilityRate(RateNumberToHost(pRateAdaptation->tspecsRateParameters[uAC].highRateThreshold));
   1073     *pLowThreshold = hostToUtilityRate(RateNumberToHost(pRateAdaptation->tspecsRateParameters[uAC].lowRateThreshold));
   1074 }
   1075 
   1076 /***************************************************************************
   1077 *                           selectRateTable                                *
   1078 ****************************************************************************
   1079 * DESCRIPTION:
   1080 *
   1081 * INPUTS:       hCtrlData - the object
   1082 *
   1083 * OUTPUT:
   1084 *
   1085 * RETURNS:
   1086 ***************************************************************************/
   1087 
   1088 static void selectRateTable(TI_HANDLE hCtrlData, UINT32 rateMask)
   1089 {
   1090     paramInfo_t param;
   1091     rate_e      rate;
   1092 
   1093     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
   1094 
   1095     rate = getMaxRatefromBitmap(rateMask);
   1096 
   1097     param.paramType = SITE_MGR_OPERATIONAL_MODE_PARAM;
   1098     siteMgr_getParam(pCtrlData->hSiteMgr, &param);
   1099 
   1100     switch(param.content.siteMgrDot11OperationalMode)
   1101     {
   1102         case DOT11_B_MODE:
   1103         {
   1104             if(rate == DRV_RATE_22M)
   1105             {
   1106                 pCtrlData->ctrlDataCurrentRateTable = &pCtrlData->ctrlDataRateTables.ctrlDataPbccRateTable;
   1107                 pCtrlData->pCurrPolicyClassRatesArray = pCtrlData->policyClassRatesArrayPbcc;
   1108             }
   1109             else
   1110             {
   1111                 pCtrlData->ctrlDataCurrentRateTable = &pCtrlData->ctrlDataRateTables.ctrlDataCckRateTable;
   1112                 pCtrlData->pCurrPolicyClassRatesArray = pCtrlData->policyClassRatesArrayCck;
   1113 
   1114             }
   1115         }
   1116         break;
   1117 
   1118         case DOT11_G_MODE:
   1119             if( (rate == DRV_RATE_22M) ||
   1120                 (rate == DRV_RATE_11M) ||
   1121                 (rate == DRV_RATE_5_5M)||
   1122                 (rate == DRV_RATE_2M)  ||
   1123                 (rate == DRV_RATE_1M)    )
   1124             {
   1125                 pCtrlData->ctrlDataCurrentRateTable = &pCtrlData->ctrlDataRateTables.ctrlDataPbccRateTable;
   1126                 pCtrlData->pCurrPolicyClassRatesArray = pCtrlData->policyClassRatesArrayPbcc;
   1127             }
   1128             else
   1129             {
   1130                 pCtrlData->ctrlDataCurrentRateTable = &pCtrlData->ctrlDataRateTables.ctrlDataOfdmRateTable ;
   1131                 pCtrlData->pCurrPolicyClassRatesArray = pCtrlData->policyClassRatesArrayOfdm;
   1132             }
   1133         break;
   1134 
   1135         case DOT11_A_MODE:
   1136             pCtrlData->ctrlDataCurrentRateTable = &pCtrlData->ctrlDataRateTables.ctrlDataOfdmARateTable;
   1137             pCtrlData->pCurrPolicyClassRatesArray = pCtrlData->policyClassRatesArrayOfdmA;
   1138 
   1139         break;
   1140         case DOT11_DUAL_MODE:
   1141         case DOT11_MAX_MODE:
   1142             WLAN_REPORT_ERROR(pCtrlData->hReport,CTRL_DATA_MODULE_LOG,
   1143                 ("%s ctrlDataCurrentRateTable not configured !!!",__FUNCTION__));
   1144             break;
   1145 
   1146     }
   1147 
   1148 
   1149 
   1150 }
   1151 
   1152 /***************************************************************************
   1153 *                           ctrlData_start                                 *
   1154 ****************************************************************************
   1155 * DESCRIPTION:  This function start the link control algorithms. It start
   1156 *               each algorithm (Rate Adaptation) if needed.
   1157 *
   1158 * INPUTS:       hCtrlData - the object
   1159 *
   1160 * OUTPUT:
   1161 *
   1162 * RETURNS:      OK
   1163 *               NOK
   1164 ***************************************************************************/
   1165 
   1166 TI_STATUS ctrlData_start(TI_HANDLE hCtrlData)
   1167 {
   1168     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
   1169 
   1170     pCtrlData->ctrlDataStartStoplinkControlAlg = TRUE;
   1171 
   1172 
   1173     /* start Rate Adaptation if needed */
   1174     if(pCtrlData->ctrlDataRateControlEnable == TRUE)
   1175     {
   1176         rateAdaptation_start(pCtrlData->pRateAdaptation);
   1177     }
   1178 
   1179 
   1180     WLAN_REPORT_INFORMATION(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
   1181         (" ctrlData_start() : Link control algorithms started successfully \n"));
   1182 
   1183     return OK;
   1184 }
   1185 
   1186 /***************************************************************************
   1187 *                           ctrlData_stop                                  *
   1188 ****************************************************************************
   1189 * DESCRIPTION:  This function stop the link control algorithms.
   1190 *
   1191 * INPUTS:       hCtrlData - the object
   1192 *
   1193 * OUTPUT:
   1194 *
   1195 * RETURNS:      OK
   1196 *               NOK
   1197 ***************************************************************************/
   1198 
   1199 TI_STATUS ctrlData_stop(TI_HANDLE hCtrlData)
   1200 {
   1201     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
   1202 
   1203     /* stop link control algorithm */
   1204     pCtrlData->ctrlDataStartStoplinkControlAlg = FALSE;
   1205 
   1206     /* set modulation option to default value*/
   1207     pCtrlData->ctrlDataCurrentModulationType = DEF_CURRENT_MUDULATION_TYPE;
   1208 
   1209     /* set Preamble length option to default value*/
   1210     pCtrlData->ctrlDataCurrentPreambleType = DEF_CURRENT_PREAMBLE;
   1211 
   1212     /* set mgmt rate to default value */
   1213     pCtrlData->ctrlDataCurrentBasicRate = DEF_BASIC_RATE;
   1214     pCtrlData->ctrlDataBasicRateBitMask = DEF_BASIC_RATE_MASK;
   1215     pCtrlData->ctrlDataCurrentBasicModulationType = DRV_MODULATION_QPSK;
   1216 
   1217     os_memoryZero(pCtrlData->hOs,
   1218                   &pCtrlData->tsrsParameters,
   1219                   sizeof(pCtrlData->tsrsParameters));
   1220 
   1221     WLAN_REPORT_INFORMATION(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
   1222         (" ctrlData_stop() : Link control algorithms stoped \n"));
   1223 
   1224     rateAdaptation_stop(pCtrlData->pRateAdaptation);
   1225 
   1226     return OK;
   1227 }
   1228 
   1229 /***************************************************************************
   1230 *                       ctrlData_receiveParamFromRx                        *
   1231 ****************************************************************************
   1232 * DESCRIPTION:  This function receive Msdu Rx parameters from the Rx data
   1233 *               module, update counters.
   1234 *
   1235 * INPUTS:       hCtrlData - the object
   1236 *               pRxMsduInfo - Information about the receive msdu
   1237 * OUTPUT:
   1238 *
   1239 * RETURNS:      OK
   1240 *               NOK
   1241 ***************************************************************************/
   1242 #ifdef SUPPORT_4X
   1243 TI_STATUS ctrlData_rxMsdu(TI_HANDLE         hCtrlData,
   1244                           mem_MSDU_T        **pRxMsdu)
   1245 {
   1246     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
   1247 
   1248     if(pCtrlData->ctrlDataStartStoplinkControlAlg == FALSE)
   1249         return OK;
   1250 
   1251     if((pCtrlData->ctrlDataFourXEnable == TRUE) &&
   1252        (pCtrlData->ctrlDataCurrentBssType == BSS_INFRASTRUCTURE))
   1253     {
   1254         /* Call fourX function */
   1255         if(fourX_rxMsdu(pCtrlData->pFourX, pRxMsdu) != OK)
   1256         {
   1257             WLAN_REPORT_ERROR(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
   1258                 (" failed in fourX_rxMsdu\n"));
   1259             return NOK;
   1260         }
   1261     }
   1262 
   1263     return OK;
   1264 }
   1265 #endif
   1266 /***************************************************************************
   1267 *                       ctrlData_getTxAttributes                           *
   1268 ****************************************************************************
   1269 * DESCRIPTION:  This function set the transmited parameters for a
   1270 *               specific msdu
   1271 *
   1272 * INPUTS:       hCtrlData - the object
   1273 *               txFlags - Information about the msdu
   1274 *
   1275 * OUTPUT:       pTxAttr - pointer to the tx parameters structure
   1276 *
   1277 * RETURNS:      OK
   1278 *               NOK
   1279 ***************************************************************************/
   1280 
   1281 TI_STATUS ctrlData_getTxAttributes(TI_HANDLE hCtrlData, UINT32 txFlags,
   1282                                 txData_attr_t *pTxAttr, UINT32 ac)
   1283 {
   1284     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
   1285     rateModulation4x_table_t* pRateModulation;
   1286 
   1287     os_memoryZero(pCtrlData->hOs, pTxAttr, sizeof(txData_attr_t));
   1288 
   1289 
   1290     if( ((txFlags & TX_DATA_MULTICAST_FRAME) && (pCtrlData->ctrlDataCurrentBssType == BSS_INDEPENDENT)) ||
   1291             (txFlags & TX_DATA_MGMT_MSDU) )
   1292     {
   1293         /* BCAST packets in IBSS should be sent at 2M and not in the highest basic rate. */
   1294         if (pCtrlData->ctrlDataCurrentRateMask & DRV_RATE_MASK_2_BARKER)
   1295         {
   1296             pTxAttr->Rate = DRV_RATE_2M;
   1297         }
   1298         else
   1299         {
   1300             pTxAttr->Rate = ctrlData_getClosestTSRate(pCtrlData, ac, pCtrlData->ctrlDataCurrentBasicRate);
   1301         }
   1302 
   1303         /* by default use USER_RATE_CLASS for this kind of packets */
   1304         pTxAttr->txRatePolicyId = pCtrlData->tsrsParameters[ac].fwPolicyID[USER_RATE_CLASS];
   1305     }
   1306     /* For regular data packets use the rate-adaptation rates. */
   1307     else
   1308     {
   1309         pRateModulation = rateAdaptation_getCurrent(pCtrlData->pRateAdaptation);
   1310         pTxAttr->Rate = ctrlData_getClosestTSRate(pCtrlData, ac, pRateModulation->rate);
   1311 
   1312         /* rate class Id ( retries profile per rate) */
   1313         pTxAttr->txRatePolicyId = pCtrlData->tsrsParameters[ac].fwPolicyID[pCtrlData->currClientRateID];
   1314 
   1315         /* For voice delivery PSPoll, use only basic rates */
   1316         if (txFlags & TX_DATA_PS_POLL)
   1317         {
   1318             paramInfo_t param;
   1319             modulationType_e tempModulation;
   1320 
   1321             param.paramType = SITE_MGR_OPERATIONAL_MODE_PARAM;
   1322             siteMgr_getParam(pCtrlData->hSiteMgr, &param);
   1323 
   1324             /* Get the max rate and modulation from the BasicRateBitMask. */
   1325             getMaxRate(pCtrlData->ctrlDataBasicRateBitMask,
   1326                        &pTxAttr->Rate,
   1327                        &tempModulation,
   1328                        param.content.siteMgrDot11OperationalMode);
   1329         }
   1330 
   1331 
   1332     }
   1333 
   1334     /* convert Application rate to HW rate */
   1335     ConvertAppRateToHwBitMapRate(pTxAttr->Rate, &(pTxAttr->HwRate));
   1336 
   1337     WLAN_REPORT_DEBUG_TX(pCtrlData->hReport,
   1338             ("%s: Rate = %d, HwRate = 0x%x\n",
   1339                 __FUNCTION__,
   1340                 pTxAttr->Rate,
   1341                 pTxAttr->HwRate));
   1342 
   1343     return OK;
   1344 }
   1345 
   1346 /***************************************************************************
   1347 *                        ctrlData_txCompleteStatus                         *
   1348 ****************************************************************************
   1349 * DESCRIPTION:  This function is called by the Hal for every Tx supportedBitMap
   1350 *               Interrupt - it update the rate adaptation algorithm about
   1351 *               the status of the last transmission and used as a trigger
   1352 *               for the Tx scheduler.
   1353 *
   1354 * INPUTS:       hCtrlData - the object
   1355 *               CmpltTxAttr - Information structure about the last
   1356 *               transmission
   1357 *
   1358 * OUTPUT:
   1359 *
   1360 * RETURNS:      void
   1361 ***************************************************************************/
   1362 void ctrlData_txCompleteStatus( TI_HANDLE hCtrlData,
   1363                                        txCompleteAttr_t *pTxCompleteAttr )
   1364 {
   1365     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
   1366     UINT8       txCompleteFlags;
   1367     BOOL        frameDataType = 0;
   1368     rate_e      txActualRate;
   1369     rate_e      txRequestRate;
   1370     UINT8       qId;
   1371     txPacketIdAttr_t    *pPacketId = (txPacketIdAttr_t*)pTxCompleteAttr->packetId;
   1372 
   1373 
   1374     /*
   1375      * perform rate adaptation algorithm if host processes packets
   1376      * and  not TNET.
   1377      * NOTE: MSDU was already freed in sendPacketTransfer
   1378      */
   1379     frameDataType = pPacketId->bDataMsdu;
   1380     qId = pPacketId->txQid;
   1381 
   1382     ConvertHwBitRateToAppRate(pTxCompleteAttr->rate, &txActualRate);
   1383     ConvertHwBitRateToAppRate(pPacketId->maxTransmitRate, &txRequestRate);
   1384 
   1385     /* perform rate adaptation algorithm if needed */
   1386     if((pCtrlData->ctrlDataRateControlEnable == TRUE ) &&
   1387        (pCtrlData->ctrlDataStartStoplinkControlAlg == TRUE) &&
   1388            (frameDataType))
   1389 
   1390     {
   1391         rateAdaptation_updateRateAdaptation(pCtrlData->pRateAdaptation, txActualRate,
   1392                                             txRequestRate,pTxCompleteAttr->status, 0);
   1393     }
   1394     txCompleteFlags = pPacketId->txCompleteFlags;
   1395 
   1396     if(txCompleteFlags & TX_DATA_DISASSOC_SYNC_TRIG)
   1397     {
   1398         WLAN_REPORT_INFORMATION(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,("Call disconnect test upon NULL data"));
   1399             pCtrlData->disassocSentCBFunc( pCtrlData->disassocSentCBObj );
   1400     }
   1401 
   1402 
   1403     if(txCompleteFlags & TX_DATA_DEAUTH_SYNC_TRIG)
   1404     {
   1405             WLAN_REPORT_INFORMATION(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
   1406             ("De Auth TxCmplt: txStatus = %d, txActualRate = %d  \n",pTxCompleteAttr->status,pTxCompleteAttr->rate));
   1407             pCtrlData->disassocSentCBFunc( pCtrlData->disassocSentCBObj );
   1408     }
   1409 
   1410     if(txData_isQueueUseMediumTime(pCtrlData->hTxData , qId) == TRUE )
   1411     {
   1412         WLAN_REPORT_INFORMATION(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
   1413             (" ctrlData_txCompleteStatus() :usedTime = %d  qNum = %d\n",
   1414             pTxCompleteAttr->actualDurationInAir, qId));
   1415 
   1416         txData_updateUsedTime(pCtrlData->hTxData,
   1417                               qId,
   1418                               pTxCompleteAttr->actualDurationInAir);
   1419     }
   1420     /*
   1421      * update tx complete status to txData (which schedule another packet also );
   1422      */
   1423     txData_txCompleteUpdate( pCtrlData->hTxData, pTxCompleteAttr );
   1424 
   1425 }
   1426 
   1427 /***************************************************************************
   1428 *                        ctrlData_resetCounters                            *
   1429 ****************************************************************************
   1430 * DESCRIPTION:  This function reset the Ctrl Data module counters
   1431 *
   1432 * INPUTS:       hCtrlData - the object
   1433 *
   1434 * OUTPUT:
   1435 *
   1436 * RETURNS:      void
   1437 ***************************************************************************/
   1438 static void ctrlData_resetCounters(TI_HANDLE hCtrlData)
   1439 {
   1440     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
   1441 
   1442     os_memoryZero(pCtrlData->hOs,&pCtrlData->ctrlDataCounters,
   1443                                 sizeof(ctrlDataCounters_t));
   1444 }
   1445 
   1446 /***************************************************************************
   1447 *                   ctrlData_getCurrBssTypeAndCurrBssId                    *
   1448 ****************************************************************************
   1449 * DESCRIPTION:  This function return the current BSSID and the
   1450 *               current BSS Type
   1451 *
   1452 * INPUTS:       hCtrlData - the object
   1453 *
   1454 * OUTPUT:       pCurrBssid - pointer to return the current bssid
   1455 *               pCurrBssType - pointer to return the current bss type
   1456 *
   1457 * RETURNS:      void
   1458 ***************************************************************************/
   1459 void ctrlData_getCurrBssTypeAndCurrBssId(TI_HANDLE hCtrlData, macAddress_t *pCurrBssid,
   1460                                            bssType_e *pCurrBssType)
   1461 {
   1462     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
   1463 
   1464     MAC_COPY(pCtrlData->hOs, (pCurrBssid), (&pCtrlData->ctrlDataCurrentBSSID));
   1465     *pCurrBssType = pCtrlData->ctrlDataCurrentBssType;
   1466 
   1467 }
   1468 
   1469 #ifdef SUPPORT_4X
   1470 /***************************************************************************
   1471 *                   ctrlData_get4xInfoElemnt                               *
   1472 ****************************************************************************
   1473 * DESCRIPTION:
   1474 *
   1475 * INPUTS:       hCtrlData - the object
   1476 *
   1477 * OUTPUT:
   1478 *
   1479 * RETURNS:
   1480 ***************************************************************************/
   1481 TI_STATUS ctrlData_get4xInfoElemnt(TI_HANDLE hCtrlData,
   1482                                    dot11_4X_t* fourXInfoElemnt)
   1483 {
   1484     TI_STATUS Status = NOK;
   1485 
   1486     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
   1487 
   1488     if((pCtrlData->ctrlDataFourXEnable == TRUE) &&
   1489        (pCtrlData->ctrlDataCurrentBssType == BSS_INFRASTRUCTURE))
   1490     {
   1491         Status = fourXManager_get4xInfoElemnt(pCtrlData->pFourX, fourXInfoElemnt);
   1492     }
   1493 
   1494     return Status;
   1495 }
   1496 #endif
   1497 /***************************************************************************
   1498 *                           ctrlData_get4xStatus                           *
   1499 ****************************************************************************
   1500 * DESCRIPTION:
   1501 *
   1502 * INPUTS:       hCtrlData - the object
   1503 *
   1504 * OUTPUT:
   1505 *
   1506 * RETURNS:
   1507 ***************************************************************************/
   1508 TI_STATUS ctrlData_get4xStatus(TI_HANDLE hCtrlData,BOOL* fourXEnable)
   1509 {
   1510     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
   1511 
   1512     *fourXEnable = pCtrlData->ctrlDataCerruentFourXstate;
   1513     return OK;
   1514 }
   1515 #ifdef SUPPORT_4X
   1516 /***************************************************************************
   1517 *                           ctrlData_evalSite                              *
   1518 ****************************************************************************
   1519 * DESCRIPTION:
   1520 *
   1521 * INPUTS:       hCtrlData - the object
   1522 *
   1523 * OUTPUT:
   1524 *
   1525 * RETURNS:
   1526 ***************************************************************************/
   1527 TI_STATUS ctrlData_evalSite(TI_HANDLE hCtrlData,
   1528                             dot11_4X_t* site4xParams,
   1529                             UINT32 *matchingLevel)
   1530 {
   1531     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
   1532 
   1533     if((pCtrlData->ctrlDataFourXEnable == TRUE) &&
   1534        (pCtrlData->ctrlDataCurrentBssType == BSS_INFRASTRUCTURE))
   1535     {
   1536         return (fourXManager_evalSite(pCtrlData->pFourX, site4xParams, matchingLevel));
   1537     }
   1538 
   1539     return OK;
   1540 }
   1541 #endif
   1542 /***************************************************************************
   1543 *                           ctrlData_setSite                               *
   1544 ****************************************************************************
   1545 * DESCRIPTION:
   1546 *
   1547 * INPUTS:       hCtrlData - the object
   1548 *
   1549 * OUTPUT:
   1550 *
   1551 * RETURNS:
   1552 ***************************************************************************/
   1553 
   1554 TI_STATUS ctrlData_setSite(TI_HANDLE hCtrlData,
   1555                            dot11_4X_t* site4xParams)
   1556 {
   1557     TI_STATUS   status = NOK;
   1558     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
   1559 #ifdef SUPPORT_4X
   1560     if((pCtrlData->ctrlDataFourXEnable == TRUE) &&
   1561        (pCtrlData->ctrlDataCurrentBssType == BSS_INFRASTRUCTURE))
   1562     {
   1563         status = fourXManager_setSite(pCtrlData->pFourX, site4xParams);
   1564     }
   1565 #endif
   1566     if(status != OK)
   1567         pCtrlData->ctrlDataCerruentFourXstate = FALSE;
   1568     else
   1569         pCtrlData->ctrlDataCerruentFourXstate = TRUE;
   1570 
   1571     return status;
   1572 }
   1573 
   1574 #ifdef SUPPORT_4X
   1575 /***************************************************************************
   1576 *                       ctrlData_txDequeueMsdu                            *
   1577 ****************************************************************************
   1578 * DESCRIPTION:
   1579 *
   1580 * INPUTS:       hCtrlData - the object
   1581 *
   1582 * OUTPUT:
   1583 *
   1584 * RETURNS:
   1585 ***************************************************************************/
   1586 TI_STATUS ctrlData_txDequeueMsdu(TI_HANDLE          hCtrlData,
   1587                                  mem_MSDU_T**       buildMsduPtr,
   1588                                  MsduList_t*        pMsduList,
   1589                                  whalTx_attr_t*     pWhalTx_attr,
   1590                                  hwTxInformation_t* pHwTxInformation)
   1591 {
   1592     TI_STATUS   status;
   1593     UINT32      currNumOfMsdu;
   1594 
   1595     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
   1596 
   1597     *buildMsduPtr = NULL;
   1598 
   1599     currNumOfMsdu = msduList_getCurrNumOfMsdu(pMsduList);
   1600     if(currNumOfMsdu == 0)
   1601         return DO_NOT_SEND_MSDU;
   1602 
   1603     if(pCtrlData->ctrlDataCerruentFourXstate == TRUE)
   1604     {
   1605         /* call 4x */
   1606         status = fourX_txMsduDeQueue(pCtrlData->pFourX, buildMsduPtr, pMsduList, pHwTxInformation);
   1607         if(status != OK)
   1608         {
   1609             return DO_NOT_SEND_MSDU;
   1610         }
   1611 
   1612         ctrlData_getTxAttributes(pCtrlData, (*buildMsduPtr)->txFlags, pWhalTx_attr, QOS_AC_BE); /* stub */
   1613         return SEND_ONE_MSDU;
   1614 
   1615     }
   1616     return FOUR_X_DISABLE;
   1617 
   1618 }
   1619 
   1620 /***************************************************************************
   1621 *                       ctrlData_txMsdu                                    *
   1622 ****************************************************************************
   1623 * DESCRIPTION:
   1624 *
   1625 * INPUTS:       hCtrlData - the object
   1626 *
   1627 * OUTPUT:
   1628 *
   1629 * RETURNS:
   1630 ***************************************************************************/
   1631 TI_STATUS ctrlData_txMsdu(TI_HANDLE         hCtrlData,
   1632                           mem_MSDU_T**      msduPtr)
   1633 {
   1634     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
   1635 
   1636     if(pCtrlData->ctrlDataCerruentFourXstate == TRUE)
   1637     {
   1638         fourX_txMsduBeforInsertToQueue(pCtrlData->pFourX, msduPtr);
   1639     }
   1640 
   1641     return OK;
   1642 }
   1643 #endif /* SUPPORT_4X */
   1644 
   1645 /***************************************************************************
   1646 *                       ctrlData_setTspecsRateEvent                       *
   1647 ****************************************************************************
   1648 * DESCRIPTION:
   1649 *
   1650 * INPUTS:       hCtrlData - the object
   1651 *
   1652 * OUTPUT:
   1653 *
   1654 * RETURNS:
   1655 ***************************************************************************/
   1656 
   1657 void ctrlData_setTspecsRateEvent(TI_HANDLE          hCtrlData,
   1658                                     UINT8           acID,
   1659                                     BOOL            enableEvent)
   1660 {
   1661     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
   1662 
   1663      rateAdaptation_setTspecsRateEvent(pCtrlData->pRateAdaptation, acID, enableEvent);
   1664 
   1665 }
   1666 
   1667 /***************************************************************************
   1668 *                   ctrlData_setTspecsRateThresholds                      *
   1669 ****************************************************************************
   1670 * DESCRIPTION:
   1671 *
   1672 * INPUTS:       hCtrlData - the object
   1673 *
   1674 * OUTPUT:
   1675 *
   1676 * RETURNS:
   1677 ***************************************************************************/
   1678 
   1679 void ctrlData_setTspecsRateThresholds(TI_HANDLE     hCtrlData,
   1680                                       UINT8         acID,
   1681                                       UINT8     highRateThreshold,
   1682                                       UINT8     lowRateThreshold)
   1683 {
   1684     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
   1685 
   1686     rateAdaptation_setTspecsRateThresholds(pCtrlData->pRateAdaptation, acID, highRateThreshold, lowRateThreshold);
   1687 }
   1688 
   1689 /************************************************************************
   1690  *                        Classifier functions
   1691  ************************************************************************ */
   1692 
   1693 /************************************************************************
   1694  *                        ctrlData_clsfrClassifyTxMSDU
   1695  ************************************************************************
   1696 
   1697 Input:
   1698 
   1699 * hCtrlData: hCtrlData - the object
   1700 * pMsdu: pointer to the MSDU
   1701 * packet_DTag: NDIS Packet 802.1 user priority (UP)
   1702 
   1703 Output:
   1704 
   1705 OK on success and PARAM_VALUE_NOT_VALID in case of input parameters problems.
   1706 If the value PARAM_VALUE_NOT_VALID is returned, the MSDU qosTag field is zero.
   1707 
   1708 Description:
   1709 
   1710 This function performs the classification algorithm on the MSDU by calling the
   1711 Classifier_classifyTxMSDU API.
   1712 
   1713 ************************************************************************/
   1714 
   1715 TI_STATUS ctrlData_ClsfrClassifyTxMSDU(TI_HANDLE    hCtrlData,
   1716                                        mem_MSDU_T   *pMsdu,
   1717                                        UINT8        packet_DTag)
   1718 {
   1719     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
   1720 
   1721     /* check parameters validity */
   1722     if(!hCtrlData)
   1723         return NOK;
   1724 
   1725     if (pMsdu == NULL)
   1726     {
   1727         WLAN_REPORT_ERROR(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
   1728             (" ctrlData_ClsfrClassifyTxMSDU() : parametrs value error (the MSDU's qosTag is not updated) \n"));
   1729         return PARAM_VALUE_NOT_VALID;
   1730     }
   1731 
   1732     return (Classifier_classifyTxMSDU(pCtrlData->pClsfr, pMsdu, packet_DTag));
   1733 
   1734 }
   1735 
   1736 
   1737 
   1738 /************************************************************************
   1739  *                        ctrlData_clsfrSetClsfrType
   1740  ************************************************************************
   1741 
   1742 Input:
   1743 
   1744 * hCtrlData: hCtrlData - the object
   1745 * newClsfrType: the new classifier type
   1746 
   1747 Output:
   1748 
   1749 OK on success and PARAM_VALUE_NOT_VALID in case of input parameters problems.
   1750 If the value PARAM_VALUE_NOT_VALID is returned, the classifier type is not updated.
   1751 
   1752 Description:
   1753 
   1754 This function changes the active classifier type by calling the
   1755 Classifier_setClsfrType API.
   1756 
   1757 ************************************************************************/
   1758 
   1759 
   1760 TI_STATUS ctrlData_clsfrSetClsfrType(TI_HANDLE          hCtrlData,
   1761                                     clsfrTypeAndSupport     newClsfrType)
   1762 {
   1763     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
   1764     /* check parameters validity */
   1765     if(!hCtrlData)
   1766         return PARAM_VALUE_NOT_VALID;
   1767 
   1768     return (Classifier_setClsfrType(pCtrlData->pClsfr, (clsfr_type_e)newClsfrType.ClsfrType));
   1769 
   1770 }
   1771 
   1772 
   1773 /*-----------------------------------------------------------------------------
   1774 Routine Name: ctrlData_ToggleTrafficIntensityNotification
   1775 Routine Description: turns ON/OFF traffic intensity notification events
   1776                      from Traffic Monitor module
   1777 Arguments:
   1778 Return Value:
   1779 -----------------------------------------------------------------------------*/
   1780 void ctrlData_ToggleTrafficIntensityNotification (TI_HANDLE hCtrlData, BOOL enabledFlag)
   1781 {
   1782     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
   1783     UINT8 idx;
   1784 
   1785    if (enabledFlag)
   1786    {
   1787       for (idx=0; idx < CTRL_DATA_TRAFFIC_INTENSITY_MAX_EVENTS; idx++)
   1788       {
   1789          TrafficMonitor_StartEventNotif (pCtrlData->hTrafficMonitor,pCtrlData->ctrlDataTrafficThresholdEvents[idx]);
   1790       }
   1791       WLAN_REPORT_INFORMATION(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
   1792          ("ctrlData_ToggleTrafficIntensityNotification (TRUE)\n"));
   1793    }
   1794    else
   1795    {
   1796       for (idx=0; idx < CTRL_DATA_TRAFFIC_INTENSITY_MAX_EVENTS; idx++)
   1797       {
   1798          TrafficMonitor_StopEventNotif (pCtrlData->hTrafficMonitor,pCtrlData->ctrlDataTrafficThresholdEvents[idx]);
   1799       }
   1800       WLAN_REPORT_INFORMATION(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
   1801          ("ctrlData_ToggleTrafficIntensityNotification (FALSE)\n"));
   1802    }
   1803    pCtrlData->ctrlDataTrafficIntensityEventsEnabled = enabledFlag;
   1804 
   1805 }
   1806 
   1807 /*-----------------------------------------------------------------------------
   1808 Routine Name: ctrlData_UnregisterTrafficIntensityEvents
   1809 Routine Description: unregisters existing events from traffic monitor
   1810 Arguments:
   1811 Return Value:
   1812 -----------------------------------------------------------------------------*/
   1813 static void ctrlData_UnregisterTrafficIntensityEvents (TI_HANDLE hCtrlData)
   1814 {
   1815     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
   1816     UINT8 idx;
   1817 
   1818     /* Loop through events and unregister them */
   1819     for (idx=0; idx < CTRL_DATA_TRAFFIC_INTENSITY_MAX_EVENTS; idx++)
   1820     {
   1821        TrafficMonitor_UnregEvent (pCtrlData->hTrafficMonitor,pCtrlData->ctrlDataTrafficThresholdEvents[idx]);
   1822     }
   1823 
   1824     WLAN_REPORT_INFORMATION(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
   1825        ("ctrlData_UnregisterTrafficIntensityEvents: Unregistered all events\n"));
   1826 
   1827 }
   1828 
   1829 
   1830 /*-----------------------------------------------------------------------------
   1831 Routine Name: ctrlData_RegisterTrafficIntensityEvents
   1832 Routine Description: Registers traffic intensity threshold events through traffic monitor
   1833 Arguments:
   1834 Return Value:
   1835 -----------------------------------------------------------------------------*/
   1836 static void ctrlData_RegisterTrafficIntensityEvents (TI_HANDLE hCtrlData)
   1837 {
   1838     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
   1839     TrafficAlertRegParm_t TrafficAlertRegParm;
   1840     TI_STATUS status;
   1841 
   1842     /* Register high threshold "direction up" event */
   1843     TrafficAlertRegParm.CallBack = ctrlData_TrafficThresholdCrossed;
   1844     TrafficAlertRegParm.Context = hCtrlData;
   1845     TrafficAlertRegParm.Cookie =  CTRL_DATA_TRAFFIC_INTENSITY_HIGH_CROSSED_ABOVE;
   1846     TrafficAlertRegParm.Direction = TRAFF_UP;
   1847     TrafficAlertRegParm.Trigger = TRAFF_EDGE;
   1848     TrafficAlertRegParm.TimeIntervalMs = pCtrlData->ctrlDataTrafficIntensityThresholds.TestInterval;
   1849     TrafficAlertRegParm.Threshold = pCtrlData->ctrlDataTrafficIntensityThresholds.uHighThreshold;
   1850     TrafficAlertRegParm.MonitorType = TX_RX_DIRECTED_FRAMES;
   1851     pCtrlData->ctrlDataTrafficThresholdEvents[0] = TrafficMonitor_RegEvent(pCtrlData->hTrafficMonitor,&TrafficAlertRegParm,FALSE);
   1852 
   1853     if (pCtrlData->ctrlDataTrafficThresholdEvents[0] == NULL)
   1854     {
   1855          WLAN_REPORT_ERROR(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
   1856             (" ctrlData_RegisterTrafficIntensityEvents() : Failed to register high treshold event (TRAFF_UP) \n"));
   1857          return;
   1858     }
   1859 
   1860     /* Register high threshold "direction down" event*/
   1861     TrafficAlertRegParm.Cookie =  CTRL_DATA_TRAFFIC_INTENSITY_HIGH_CROSSED_BELOW;
   1862     TrafficAlertRegParm.Direction = TRAFF_DOWN;
   1863     TrafficAlertRegParm.Trigger = TRAFF_EDGE;
   1864     TrafficAlertRegParm.Threshold = pCtrlData->ctrlDataTrafficIntensityThresholds.uHighThreshold;
   1865     pCtrlData->ctrlDataTrafficThresholdEvents[1] = TrafficMonitor_RegEvent(pCtrlData->hTrafficMonitor,&TrafficAlertRegParm,FALSE);
   1866 
   1867     if (pCtrlData->ctrlDataTrafficThresholdEvents[1] == NULL)
   1868     {
   1869          WLAN_REPORT_ERROR(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
   1870             (" ctrlData_RegisterTrafficIntensityEvents() : Failed to register high treshold event (TRAFF_DOWN) \n"));
   1871          return;
   1872     }
   1873 
   1874     /* Define the "direction below" and "direction above" events as opposites (events that reset eachother)*/
   1875     status = TrafficMonitor_SetRstCondition(pCtrlData->hTrafficMonitor,
   1876                                             pCtrlData->ctrlDataTrafficThresholdEvents[0],
   1877                                             pCtrlData->ctrlDataTrafficThresholdEvents[1],
   1878                                             TRUE);
   1879 
   1880     if (status != OK)
   1881     {
   1882       WLAN_REPORT_ERROR (pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
   1883          ("ctrlData_RegisterTrafficIntensityEvents: TrafficMonitor_SetRstCondition returned status = %d\n",status));
   1884     }
   1885 
   1886     /* Register low threshold "direction up" event */
   1887     TrafficAlertRegParm.Cookie =  CTRL_DATA_TRAFFIC_INTENSITY_LOW_CROSSED_ABOVE;
   1888     TrafficAlertRegParm.Direction = TRAFF_UP;
   1889     TrafficAlertRegParm.Trigger = TRAFF_EDGE;
   1890     TrafficAlertRegParm.Threshold = pCtrlData->ctrlDataTrafficIntensityThresholds.uLowThreshold;
   1891     pCtrlData->ctrlDataTrafficThresholdEvents[2] = TrafficMonitor_RegEvent(pCtrlData->hTrafficMonitor,&TrafficAlertRegParm,FALSE);
   1892 
   1893     if (pCtrlData->ctrlDataTrafficThresholdEvents[2] == NULL)
   1894     {
   1895          WLAN_REPORT_ERROR(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
   1896             (" ctrlData_RegisterTrafficIntensityEvents() : Failed to register low treshold event (TRAFF_UP) \n"));
   1897          return;
   1898     }
   1899 
   1900     /* Register low threshold "direction below" event */
   1901     TrafficAlertRegParm.Cookie =  CTRL_DATA_TRAFFIC_INTENSITY_LOW_CROSSED_BELOW;
   1902     TrafficAlertRegParm.Direction = TRAFF_DOWN;
   1903     TrafficAlertRegParm.Trigger = TRAFF_EDGE;
   1904     TrafficAlertRegParm.Threshold = pCtrlData->ctrlDataTrafficIntensityThresholds.uLowThreshold;
   1905     pCtrlData->ctrlDataTrafficThresholdEvents[3] = TrafficMonitor_RegEvent(pCtrlData->hTrafficMonitor,&TrafficAlertRegParm,FALSE);
   1906 
   1907     if (pCtrlData->ctrlDataTrafficThresholdEvents[3] == NULL)
   1908     {
   1909          WLAN_REPORT_ERROR(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
   1910             (" ctrlData_RegisterTrafficIntensityEvents() : Failed to register low treshold event (TRAFF_DOWN) \n"));
   1911          return;
   1912     }
   1913 
   1914     /* Define the "direction below" and "direction above" events as opposites (events that reset eachother)*/
   1915     status = TrafficMonitor_SetRstCondition(pCtrlData->hTrafficMonitor,
   1916                                             pCtrlData->ctrlDataTrafficThresholdEvents[2],
   1917                                             pCtrlData->ctrlDataTrafficThresholdEvents[3],
   1918                                             TRUE);
   1919 
   1920     if (status != OK)
   1921     {
   1922       WLAN_REPORT_ERROR (pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
   1923          ("ctrlData_RegisterTrafficIntensityEvents: TrafficMonitor_SetRstCondition returned status = %d\n",status));
   1924     }
   1925 
   1926     WLAN_REPORT_INFORMATION(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
   1927        (" ctrlData_RegisterTrafficIntensityEvents() : finished registering all events \n"));
   1928 
   1929 }
   1930 
   1931 
   1932 /*-----------------------------------------------------------------------------
   1933 Routine Name: ctrlData_TrafficThresholdCrossed
   1934 Routine Description: called whenever traffic intensity threshold is crossed.
   1935                      notifies event handler to send appropriate event with threshold parameters.
   1936 Arguments:
   1937 Return Value:
   1938 -----------------------------------------------------------------------------*/
   1939 void ctrlData_TrafficThresholdCrossed(TI_HANDLE Context,UINT32 Cookie)
   1940 {
   1941     ctrlData_t *pCtrlData = (ctrlData_t *)Context;
   1942     trafficIntensityThresholdCross_t crossInfo;
   1943 
   1944     switch(Cookie)
   1945     {
   1946     case CTRL_DATA_TRAFFIC_INTENSITY_HIGH_CROSSED_ABOVE:
   1947             crossInfo.thresholdCross = (UINT32)HIGH_THRESHOLD_CROSS;
   1948             crossInfo.thresholdCrossDirection = (UINT32)CROSS_ABOVE;
   1949             EvHandlerSendEvent(pCtrlData->hEvHandler, IPC_EVENT_TRAFFIC_INTENSITY_THRESHOLD_CROSSED, (UINT8 *)&crossInfo,sizeof(trafficIntensityThresholdCross_t));
   1950        break;
   1951 
   1952     case CTRL_DATA_TRAFFIC_INTENSITY_HIGH_CROSSED_BELOW:
   1953             crossInfo.thresholdCross = (UINT32)HIGH_THRESHOLD_CROSS;
   1954             crossInfo.thresholdCrossDirection = (UINT32)CROSS_BELOW;
   1955             EvHandlerSendEvent(pCtrlData->hEvHandler, IPC_EVENT_TRAFFIC_INTENSITY_THRESHOLD_CROSSED, (UINT8 *)&crossInfo,sizeof(trafficIntensityThresholdCross_t));
   1956        break;
   1957 
   1958     case CTRL_DATA_TRAFFIC_INTENSITY_LOW_CROSSED_ABOVE:
   1959             crossInfo.thresholdCross = (UINT32)LOW_THRESHOLD_CROSS;
   1960             crossInfo.thresholdCrossDirection = (UINT32)CROSS_ABOVE;
   1961             EvHandlerSendEvent(pCtrlData->hEvHandler, IPC_EVENT_TRAFFIC_INTENSITY_THRESHOLD_CROSSED, (UINT8 *)&crossInfo,sizeof(trafficIntensityThresholdCross_t));
   1962        break;
   1963 
   1964     case CTRL_DATA_TRAFFIC_INTENSITY_LOW_CROSSED_BELOW:
   1965             crossInfo.thresholdCross = (UINT32)LOW_THRESHOLD_CROSS;
   1966             crossInfo.thresholdCrossDirection = (UINT32)CROSS_BELOW;
   1967             EvHandlerSendEvent(pCtrlData->hEvHandler, IPC_EVENT_TRAFFIC_INTENSITY_THRESHOLD_CROSSED, (UINT8 *)&crossInfo,sizeof(trafficIntensityThresholdCross_t));
   1968        break;
   1969     default:
   1970          WLAN_REPORT_ERROR(pCtrlData->hReport, CTRL_DATA_MODULE_LOG,
   1971                 (" ctrlData_TrafficThresholdCrossed() : Unknown cookie received from traffic monitor !!! \n"));
   1972        break;
   1973    }
   1974 
   1975 }
   1976 
   1977 /***************************************************************************
   1978 *                           ctrlData_buildHwBitMapFromArray                 *
   1979 ****************************************************************************
   1980 * DESCRIPTION:  builds HwRatesBitMap (supported rates) for txRatePolicy
   1981 *               using an array that consist number of retries for each rate
   1982 *               all ew do is : if retry > 0 than the HwBit is ON.
   1983 *
   1984 * INPUTS:       Array of retries
   1985 *
   1986 * OUTPUT:       Bit Map of Hw rates.
   1987 *
   1988 * RETURNS:      Bit Map of Hw rates.
   1989 *
   1990 ***************************************************************************/
   1991 static UINT32 ctrlData_buildHwBitMapFromArray(policyClassRatesArray_t *pArray)
   1992 {
   1993     txRateClassId_e  TxRateIndex;
   1994     UINT32 policyRateMask = 0;
   1995     rateMask_e tempArray[MAX_NUM_OF_TX_RATES_IN_CLASS] =
   1996     {
   1997     DRV_RATE_MASK_54_OFDM,DRV_RATE_MASK_48_OFDM,DRV_RATE_MASK_36_OFDM,
   1998     DRV_RATE_MASK_24_OFDM,DRV_RATE_MASK_22_PBCC,DRV_RATE_MASK_18_OFDM,
   1999     DRV_RATE_MASK_12_OFDM,DRV_RATE_MASK_11_CCK,DRV_RATE_MASK_9_OFDM,
   2000     DRV_RATE_MASK_6_OFDM,DRV_RATE_MASK_5_5_CCK,DRV_RATE_MASK_2_BARKER,
   2001     DRV_RATE_MASK_1_BARKER};
   2002 
   2003 
   2004 
   2005     for (TxRateIndex = txPolicy54; TxRateIndex < MAX_NUM_OF_TX_RATES_IN_CLASS; TxRateIndex++)
   2006     {
   2007         if (pArray->txRate[TxRateIndex] > 0 )
   2008         {
   2009             policyRateMask |= tempArray[TxRateIndex];
   2010         }
   2011     }
   2012 
   2013     return policyRateMask;
   2014 }
   2015 
   2016 
   2017 /*************************************************************************
   2018  *                                                                       *
   2019  *                          DEBUG FUNCTIONS                              *
   2020  *                                                                       *
   2021  *************************************************************************/
   2022 
   2023 void ctrlData_printTxParameters(TI_HANDLE hCtrlData)
   2024 {
   2025     WLAN_OS_REPORT(("            Tx Parameters            \n"));
   2026     WLAN_OS_REPORT(("-------------------------------------\n"));
   2027     WLAN_OS_REPORT(("currentPreamble                     = %d\n\n",((ctrlData_t *)hCtrlData)->ctrlDataCurrentPreambleType));
   2028     WLAN_OS_REPORT(("currentModulation                   = %d\n",  ((ctrlData_t *)hCtrlData)->ctrlDataCurrentModulationType));
   2029     WLAN_OS_REPORT(("ctrlDataCurrentBasicModulationType  = %d\n",  ((ctrlData_t *)hCtrlData)->ctrlDataCurrentBasicModulationType));
   2030     WLAN_OS_REPORT(("ctrlDataCurrentBasicRate            = %d\n",  ((ctrlData_t *)hCtrlData)->ctrlDataCurrentBasicRate));
   2031     WLAN_OS_REPORT(("ctrlDataBasicRateBitMask            = 0x%X\n",((ctrlData_t *)hCtrlData)->ctrlDataBasicRateBitMask));
   2032     WLAN_OS_REPORT(("ctrlDataCurrentRateMask             = 0x%X\n",((ctrlData_t *)hCtrlData)->ctrlDataCurrentRateMask));
   2033 }
   2034 
   2035 void ctrlData_printRateAdaptation(TI_HANDLE hCtrlData)
   2036 {
   2037     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
   2038 
   2039     rateAdaptation_print(pCtrlData->pRateAdaptation);
   2040 }
   2041 #ifdef SUPPORT_4X
   2042 void ctrlData_printFourX(TI_HANDLE hCtrlData)
   2043 {
   2044     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
   2045 
   2046     fourX_printParams(pCtrlData->pFourX);
   2047 }
   2048 #endif
   2049 
   2050 void ctrlData_printCtrlBlock(TI_HANDLE hCtrlData)
   2051 {
   2052     rateClassClients_e  clientID;
   2053     txRateClassId_e  TxRateIndex;
   2054 
   2055     WLAN_OS_REPORT(("    CtrlData BLock    \n"));
   2056     WLAN_OS_REPORT(("----------------------\n"));
   2057 
   2058     WLAN_OS_REPORT(("hSiteMgr = 0x%X\n",((ctrlData_t *)hCtrlData)->hSiteMgr));
   2059     WLAN_OS_REPORT(("hTxData = 0x%X\n",((ctrlData_t *)hCtrlData)->hTxData));
   2060     WLAN_OS_REPORT(("hWhalCtrl = 0x%X\n",((ctrlData_t *)hCtrlData)->hWhalCtrl));
   2061     WLAN_OS_REPORT(("hOs = 0x%X\n",((ctrlData_t *)hCtrlData)->hOs));
   2062     WLAN_OS_REPORT(("hReport = 0x%X\n",((ctrlData_t *)hCtrlData)->hReport));
   2063 
   2064     WLAN_OS_REPORT(("ctrlDataDeviceMacAddress = 0x%X.0x%X.0x%X.0x%X.0x%X.0x%X. \n", ((ctrlData_t *)hCtrlData)->ctrlDataDeviceMacAddress.addr[0],
   2065                                                                                     ((ctrlData_t *)hCtrlData)->ctrlDataDeviceMacAddress.addr[1],
   2066                                                                                     ((ctrlData_t *)hCtrlData)->ctrlDataDeviceMacAddress.addr[2],
   2067                                                                                     ((ctrlData_t *)hCtrlData)->ctrlDataDeviceMacAddress.addr[3],
   2068                                                                                     ((ctrlData_t *)hCtrlData)->ctrlDataDeviceMacAddress.addr[4],
   2069                                                                                     ((ctrlData_t *)hCtrlData)->ctrlDataDeviceMacAddress.addr[5]));
   2070 
   2071     WLAN_OS_REPORT(("ctrlDataCurrentBSSID = 0x%X.0x%X.0x%X.0x%X.0x%X.0x%X. \n", ((ctrlData_t *)hCtrlData)->ctrlDataCurrentBSSID.addr[0],
   2072                                                                                 ((ctrlData_t *)hCtrlData)->ctrlDataCurrentBSSID.addr[1],
   2073                                                                                 ((ctrlData_t *)hCtrlData)->ctrlDataCurrentBSSID.addr[2],
   2074                                                                                 ((ctrlData_t *)hCtrlData)->ctrlDataCurrentBSSID.addr[3],
   2075                                                                                 ((ctrlData_t *)hCtrlData)->ctrlDataCurrentBSSID.addr[4],
   2076                                                                                 ((ctrlData_t *)hCtrlData)->ctrlDataCurrentBSSID.addr[5]));
   2077 
   2078     WLAN_OS_REPORT(("ctrlDataRateControlEnable = %d\n",((ctrlData_t *)hCtrlData)->ctrlDataRateControlEnable));
   2079     WLAN_OS_REPORT(("ctrlDataFourXEnable = %d\n",((ctrlData_t *)hCtrlData)->ctrlDataFourXEnable));
   2080     WLAN_OS_REPORT(("ctrlDataFourCurrState = %d\n",((ctrlData_t *)hCtrlData)->ctrlDataCerruentFourXstate));
   2081     WLAN_OS_REPORT(("ctrlDataStartStoplinkControlAlg = %d\n",((ctrlData_t *)hCtrlData)->ctrlDataStartStoplinkControlAlg));
   2082 
   2083     WLAN_OS_REPORT(("ctrlDataCurrentBssType = %d\n",((ctrlData_t *)hCtrlData)->ctrlDataCurrentBssType));
   2084     WLAN_OS_REPORT(("ctrlDataCurrentModulationType = %d\n",((ctrlData_t *)hCtrlData)->ctrlDataCurrentModulationType));
   2085     WLAN_OS_REPORT(("ctrlDataCurrentBasicRate = %d\n",((ctrlData_t *)hCtrlData)->ctrlDataCurrentBasicRate));
   2086 
   2087     WLAN_OS_REPORT(("ctrlDataBasicRateBitMask = 0x%X\n",((ctrlData_t *)hCtrlData)->ctrlDataBasicRateBitMask));
   2088     WLAN_OS_REPORT(("ctrlDataCurrentRateMask = 0x%X\n",((ctrlData_t *)hCtrlData)->ctrlDataCurrentRateMask));
   2089 
   2090     WLAN_OS_REPORT(("ctrlDataCurrentBasicModulationType = %d\n",((ctrlData_t *)hCtrlData)->ctrlDataCurrentBasicModulationType));
   2091     WLAN_OS_REPORT(("ctrlDataCurrentPreambleType = %d\n",((ctrlData_t *)hCtrlData)->ctrlDataCurrentPreambleType));
   2092 
   2093     WLAN_OS_REPORT(("Traffic Intensity threshold events status: %s\n", (((ctrlData_t *)hCtrlData)->ctrlDataTrafficIntensityEventsEnabled ? "Enabled" : "Disabled")));
   2094     WLAN_OS_REPORT(("Traffic Intensity high threshold: %d packets/sec \n", ((ctrlData_t *)hCtrlData)->ctrlDataTrafficIntensityThresholds.uHighThreshold));
   2095     WLAN_OS_REPORT(("Traffic Intensity low threshold: %d packets/sec \n", ((ctrlData_t *)hCtrlData)->ctrlDataTrafficIntensityThresholds.uLowThreshold));
   2096     WLAN_OS_REPORT(("Traffic Intensity test interval: %d ms\n", ((ctrlData_t *)hCtrlData)->ctrlDataTrafficIntensityThresholds.TestInterval));
   2097 
   2098     for (clientID = (rateClassClients_e)0 ; clientID < NUM_OF_RATE_CLASS_CLIENTS ; clientID++)
   2099     {
   2100         WLAN_OS_REPORT((" client = %d : bIsClassAvailable = %s currMask = 0x%x nextMask = 0x%x \n",
   2101              clientID,(TRUE == ((ctrlData_t *)hCtrlData)->bIsClassAvailable[clientID] ? "TRUE" : "FALSE"),
   2102              ((ctrlData_t *)hCtrlData)->currClientRateMask[clientID],((ctrlData_t *)hCtrlData)->nextClientRateMask[clientID]));
   2103         WLAN_OS_REPORT(("Policy for client %d (starting from 54): \n",clientID));
   2104         for (TxRateIndex = txPolicy54; TxRateIndex < MAX_NUM_OF_TX_RATES_IN_CLASS; TxRateIndex++)
   2105         {
   2106             WLAN_OS_REPORT(("retries for rate %d = %d\n",TxRateIndex,((ctrlData_t *)hCtrlData)->ctrlDataTxRatePolicy.rateClass[clientID*MAX_NUM_OF_AC].txRate[TxRateIndex]));
   2107         }
   2108         WLAN_OS_REPORT(("Long retry = %d  ,  Short retry = %d\n",
   2109             ((ctrlData_t *)hCtrlData)->ctrlDataTxRatePolicy.rateClass[clientID].longRetryLimit,((ctrlData_t *)hCtrlData)->ctrlDataTxRatePolicy.rateClass[clientID*MAX_NUM_OF_AC].shortRetryLimit));
   2110     }
   2111     WLAN_OS_REPORT(("current used client %d\n",((ctrlData_t *)hCtrlData)->currClientRateID));
   2112 }
   2113 
   2114 void ctrlData_printCtrlCounters(TI_HANDLE hCtrlData)
   2115 {
   2116     WLAN_OS_REPORT(("    CtrlData Counters    \n"));
   2117     WLAN_OS_REPORT(("-------------------------\n"));
   2118 
   2119     WLAN_OS_REPORT(("icvFailCounter        = %d\n",((ctrlData_t *)hCtrlData)->ctrlDataCounters.icvFailCounter));
   2120     WLAN_OS_REPORT(("keyNotFoundCounter    = %d\n",((ctrlData_t *)hCtrlData)->ctrlDataCounters.keyNotFoundCounter));
   2121     WLAN_OS_REPORT(("MicFailureCounter     = %d\n",((ctrlData_t *)hCtrlData)->ctrlDataCounters.MicFailureCounter));
   2122 }
   2123 
   2124 
   2125 #ifdef TI_DBG
   2126 
   2127 void ctrlData_printClsfrTable ( TI_HANDLE hCtrlData )
   2128 {
   2129    ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
   2130    Classifier_dbgPrintClsfrTable (pCtrlData->pClsfr);
   2131 }
   2132 
   2133 void ctrlData_clearClsfrTable ( TI_HANDLE hCtrlData )
   2134 {
   2135    clsfrTypeAndSupport myLocalType;
   2136    ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
   2137 
   2138    Classifier_getClsfrType (pCtrlData->pClsfr,&myLocalType);
   2139    ctrlData_clsfrSetClsfrType (pCtrlData,myLocalType);
   2140 }
   2141 
   2142 #endif
   2143 
   2144 
   2145 /***************************************************************************
   2146 *                           ctrlData_storeTSRateSet
   2147 ****************************************************************************
   2148 * DESCRIPTION:  This function translates TSRS rates into map of retransmissions
   2149 *               similar to predefined clients rates retransmissions, and stores
   2150 *               in the Ctrl database
   2151 *
   2152 * INPUTS:       pCtrlData - the object
   2153 *               acID
   2154 *               rates array
   2155 *
   2156 * RETURNS:      -
   2157 ****************************************************************************/
   2158 static void ctrlData_storeTSRateSet(ctrlData_t *pCtrlData, txDataQosParams_t *tsrsParams)
   2159 {
   2160     UINT32 rateCount;
   2161     UINT32 acID, rateID;
   2162     UINT32 tsrsRequestedMap;
   2163     rate_e rateNumber;
   2164     rateClassClients_e clientNumber;
   2165     txRateClassId_e rate_e_to_txRateClassId_e[DRV_RATE_MAX+1] =
   2166     {
   2167         txPolicy1,  txPolicy1, txPolicy2, txPolicy5_5, txPolicy11,
   2168         txPolicy22, txPolicy6, txPolicy9, txPolicy12,  txPolicy18,
   2169         txPolicy24, txPolicy36, txPolicy48, txPolicy54
   2170     };
   2171 
   2172     acID = tsrsParams->acID;
   2173     os_memoryZero(pCtrlData->hOs,
   2174                   &(pCtrlData->tsrsParameters[acID]),
   2175                   sizeof(pCtrlData->tsrsParameters[acID]));
   2176 
   2177 
   2178     for (clientNumber = (rateClassClients_e)0; clientNumber < NUM_OF_RATE_CLASS_CLIENTS; clientNumber++)
   2179     {
   2180         tsrsRequestedMap = 0;
   2181 
   2182         for (rateCount = 0; rateCount < tsrsParams->tsrsArrLen; rateCount++)
   2183         {
   2184             /* Erase Most significant bit in case it was raised to mark nominal PHY rates (& 0x7F) */
   2185             /* Convert multiplication of 500kb/sec to rate_e and then to txRateClassId_e */
   2186             /* and update retransmission map in accordance to USER_RATE client definitions */
   2187             rateNumber = RateNumberToHost((tsrsParams->tsrsArr[rateCount] & 0x7F) >> 1);
   2188             rateID = rate_e_to_txRateClassId_e[rateNumber];
   2189 
   2190             /* Update Rate Fallback policy map according to the class predefined policy map */
   2191             if (pCtrlData->pCurrPolicyClassRatesArray[clientNumber].txRate[rateID] > 0)
   2192             {
   2193                 pCtrlData->tsrsParameters[acID].policyClassRateMask[clientNumber] |= (1<<(rateNumber-1));
   2194             }
   2195             tsrsRequestedMap |= (1<<(rateNumber-1));
   2196         }
   2197         /* Update supportedRatesMask according to TSRS rates and rates supported for this class */
   2198         pCtrlData->tsrsParameters[acID].supportedRatesMask[clientNumber] =
   2199             pCtrlData->nextClientRateMask[clientNumber] & tsrsRequestedMap;
   2200 
   2201         /* Check that Rate Fallback policy map is not empty; if this is a case, ignore pre-defined policy */
   2202         if (pCtrlData->tsrsParameters[acID].policyClassRateMask[clientNumber] == 0)
   2203         {
   2204             pCtrlData->tsrsParameters[acID].policyClassRateMask[clientNumber] =
   2205                 pCtrlData->tsrsParameters[acID].supportedRatesMask[clientNumber];
   2206         }
   2207     }
   2208 }
   2209 
   2210 /***************************************************************************
   2211 *                           ctrlData_getClosestTSRate
   2212 ****************************************************************************
   2213 * DESCRIPTION:  This function checks if the TSRS is defined for the requested
   2214 *               access category or not; if requested, it chooses from the TSRS
   2215 *               a rate that is as close as possible to the requestede one.
   2216 *
   2217 * INPUTS:       pCtrlData - the object
   2218 *               acID
   2219 *
   2220 * RETURNS:      -
   2221 ****************************************************************************/
   2222 static rate_e ctrlData_getClosestTSRate(ctrlData_t *pCtrlData, UINT32 ac, rate_e givenRate)
   2223 {
   2224     UINT32 tsRate;
   2225     rate_e resultRate;
   2226 
   2227     if (pCtrlData->tsrsParameters[ac].supportedRatesMask[pCtrlData->currClientRateID] != 0)
   2228     {
   2229         /* From TSRS rates, choose the closest to the basic rate */
   2230         /* ((1 << givenRate) - 1) gives a map of all rates <= givenRate */
   2231         /* Logical AND with TSRS supported rates gives a map of supported rates <= givenRate */
   2232         /* Now just pick the maximal */
   2233         tsRate = pCtrlData->tsrsParameters[ac].supportedRatesMask[pCtrlData->currClientRateID]
   2234                     & ((1 << givenRate) - 1);
   2235         resultRate = calculateMaxSupportedRate(&tsRate);
   2236 
   2237         if (resultRate == DRV_RATE_INVALID)
   2238         {
   2239             return givenRate;
   2240         }
   2241         else
   2242         {
   2243             return resultRate;
   2244         }
   2245     }
   2246     else
   2247     {
   2248         return givenRate;
   2249     }
   2250 }
   2251 
   2252