Home | History | Annotate | Download | only in Data_link
      1 /*
      2  * Ctrl.c
      3  *
      4  * Copyright(c) 1998 - 2010 Texas Instruments. All rights reserved.
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  *
     11  *  * Redistributions of source code must retain the above copyright
     12  *    notice, this list of conditions and the following disclaimer.
     13  *  * Redistributions in binary form must reproduce the above copyright
     14  *    notice, this list of conditions and the following disclaimer in
     15  *    the documentation and/or other materials provided with the
     16  *    distribution.
     17  *  * Neither the name Texas Instruments nor the names of its
     18  *    contributors may be used to endorse or promote products derived
     19  *    from this software without specific prior written permission.
     20  *
     21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     24  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     25  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     26  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     27  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     31  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     32  */
     33 
     34 /***************************************************************************/
     35 /*                                                                         */
     36 /*      MODULE:     Ctrl.c                                                 */
     37 /*      PURPOSE:    Control module functions                               */
     38 /*                                                                         */
     39 /***************************************************************************/
     40 #define __FILE_ID__  FILE_ID_51
     41 #include "Ctrl.h"
     42 #include "802_11Defs.h"
     43 #include "DataCtrl_Api.h"
     44 #include "osApi.h"
     45 #include "report.h"
     46 #include "smeApi.h"
     47 #include "siteMgrApi.h"
     48 #include "TrafficMonitorAPI.h"
     49 #include "TI_IPC_Api.h"
     50 #include "EvHandler.h"
     51 #include "apConn.h"
     52 #include "rate.h"
     53 #include "TWDriver.h"
     54 #include "DrvMainModules.h"
     55 #include "StaCap.h"
     56 
     57 static void selectRateTable(TI_HANDLE hCtrlData, TI_UINT32 rateMask);
     58 static void ctrlData_setTxRatePolicies(ctrlData_t *pCtrlData);
     59 static void ctrlData_UnregisterTrafficIntensityEvents (TI_HANDLE hCtrlData);
     60 static void ctrlData_RegisterTrafficIntensityEvents (TI_HANDLE hCtrlData);
     61 static void ctrlData_storeTSRateSet(ctrlData_t *pCtrlData, TTxDataQosParams *tsrsParams);
     62 static void ctrlData_TrafficThresholdCrossed(TI_HANDLE Context,TI_UINT32 Cookie);
     63 
     64 
     65 /* definitions for medium usage calculations - in uSec units*/
     66 #define AVERAGE_ACK_TIME   10
     67 #define AVERAGE_CTS_TIME   20
     68 #define B_SIFS             10
     69 
     70 #define SHORT_PREAMBLE_TIME   96
     71 #define LONG_PREAMBLE_TIME    192
     72 
     73 #define OFDM_PREAMBLE      12
     74 #define OFDM_SIGNAL_EXT    6
     75 #define OFDM_PLCP_HDR      24
     76 
     77 #define OFDM_DURATION           (B_SIFS + OFDM_PLCP_HDR + OFDM_SIGNAL_EXT)
     78 #define NONOFDM_SHORT_DURATION  (B_SIFS + SHORT_PREAMBLE_TIME)
     79 #define NONOFDM_LONG_DURATION   (B_SIFS + LONG_PREAMBLE_TIME)
     80 
     81 /*************************************************************************
     82 *                        ctrlData_create                                 *
     83 **************************************************************************
     84 * DESCRIPTION:  This function initializes the Ctrl data module.
     85 *
     86 * INPUT:        hOs - handle to Os Abstraction Layer
     87 *
     88 * RETURN:       Handle to the allocated Ctrl data control block
     89 ************************************************************************/
     90 TI_HANDLE ctrlData_create(TI_HANDLE hOs)
     91 {
     92     TI_HANDLE hCtrlData;
     93 
     94     if( hOs  == NULL )
     95     {
     96         WLAN_OS_REPORT(("FATAL ERROR: ctrlData_create(): OS handle Error - Aborting\n"));
     97         return NULL;
     98     }
     99 
    100     /* alocate Control module control block */
    101     hCtrlData = os_memoryAlloc (hOs, sizeof(ctrlData_t));
    102     if (!hCtrlData)
    103     {
    104         return NULL;
    105     }
    106 
    107     /* reset control module control block */
    108     os_memoryZero (hOs, hCtrlData, sizeof(ctrlData_t));
    109 
    110     ((ctrlData_t *)hCtrlData)->hOs = hOs;
    111 
    112     return (hCtrlData);
    113 }
    114 
    115 
    116 /***************************************************************************
    117 *                           ctrlData_config                                *
    118 ****************************************************************************
    119 * DESCRIPTION:  This function configures the Ctrl Data module
    120 *
    121 * INPUTS:       pStadHandles        - Other modules handles
    122 *               retriesUpdateCBFunc - Link test retries callback function
    123 *               retriesUpdateCBObj  - Link test retries callback handle
    124 *
    125 * OUTPUT:
    126 *
    127 * RETURNS:      void
    128 ***************************************************************************/
    129 void ctrlData_init (TStadHandlesList *pStadHandles,
    130                     retriesCB_t       retriesUpdateCBFunc,
    131                     TI_HANDLE         retriesUpdateCBObj)
    132 {
    133     ctrlData_t *pCtrlData = (ctrlData_t *)(pStadHandles->hCtrlData);
    134 
    135     /* set objects handles */
    136     pCtrlData->hTWD         = pStadHandles->hTWD;
    137     pCtrlData->hSiteMgr     = pStadHandles->hSiteMgr;
    138 	pCtrlData->hTxCtrl      = pStadHandles->hTxCtrl;
    139     pCtrlData->hRxData      = pStadHandles->hRxData;
    140     pCtrlData->hOs          = pStadHandles->hOs;
    141     pCtrlData->hReport      = pStadHandles->hReport;
    142     pCtrlData->hAPConn      = pStadHandles->hAPConnection;
    143     pCtrlData->hEvHandler   = pStadHandles->hEvHandler;
    144     pCtrlData->hTrafficMonitor = pStadHandles->hTrafficMon;
    145     pCtrlData->hTxDataQ     = pStadHandles->hTxDataQ;
    146     pCtrlData->hStaCap      = pStadHandles->hStaCap;
    147 
    148 #ifdef XCC_MODULE_INCLUDED
    149 	/* Register the link test retries CB */
    150 	pCtrlData->retriesUpdateCBFunc = retriesUpdateCBFunc;
    151 	pCtrlData->retriesUpdateCBObj  = retriesUpdateCBObj;
    152 #endif
    153 
    154     TRACE0(pCtrlData->hReport, REPORT_SEVERITY_INIT, ".....Ctrl Data configured successfully ...\n");
    155 }
    156 
    157 
    158 TI_STATUS ctrlData_SetDefaults (TI_HANDLE hCtrlData, ctrlDataInitParams_t *ctrlDataInitParams)
    159 {
    160     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
    161     TI_UINT32 ac;
    162 
    163     /*  set Control module parameters */
    164     pCtrlData->ctrlDataDesiredIbssProtection = ctrlDataInitParams->ctrlDataDesiredIbssProtection;
    165     pCtrlData->ctrlDataIbssProtectionType = ctrlDataInitParams->ctrlDataDesiredIbssProtection;
    166     pCtrlData->ctrlDataRtsCtsStatus = ctrlDataInitParams->ctrlDataDesiredCtsRtsStatus;
    167 
    168     MAC_COPY (pCtrlData->ctrlDataDeviceMacAddress,
    169               ctrlDataInitParams->ctrlDataDeviceMacAddress);
    170 
    171     pCtrlData->ctrlDataCurrentBssType = BSS_INFRASTRUCTURE;
    172 
    173     /* Set short/long retry for all ACs plus one policy for management packets */
    174     for (ac=0; ac < MAX_NUM_OF_AC + 1; ac++)
    175     {
    176         pCtrlData->ctrlDataTxRatePolicy.rateClass[ac].longRetryLimit  = ctrlDataInitParams->ctrlDataTxRatePolicy.longRetryLimit;
    177         pCtrlData->ctrlDataTxRatePolicy.rateClass[ac].shortRetryLimit = ctrlDataInitParams->ctrlDataTxRatePolicy.shortRetryLimit;
    178     }
    179 
    180     /* Set enabled rates bitmap for each rates mode */
    181     pCtrlData->policyEnabledRatesMaskCck   = ctrlDataInitParams->policyEnabledRatesMaskCck;
    182     pCtrlData->policyEnabledRatesMaskOfdm  = ctrlDataInitParams->policyEnabledRatesMaskOfdm;
    183     pCtrlData->policyEnabledRatesMaskOfdmA = ctrlDataInitParams->policyEnabledRatesMaskOfdmA;
    184     pCtrlData->policyEnabledRatesMaskOfdmN = ctrlDataInitParams->policyEnabledRatesMaskOfdmN;
    185 
    186     ctrlData_updateTxRateAttributes(hCtrlData); /* Update TxCtrl module with rate change.*/
    187 
    188     /* Initialize traffic intensity threshold parameters */
    189     pCtrlData->ctrlDataTrafficIntensityEventsEnabled = ctrlDataInitParams->ctrlDataTrafficThresholdEnabled;
    190     pCtrlData->ctrlDataTrafficIntensityThresholds.uHighThreshold = ctrlDataInitParams->ctrlDataTrafficThreshold.uHighThreshold;
    191     pCtrlData->ctrlDataTrafficIntensityThresholds.uLowThreshold = ctrlDataInitParams->ctrlDataTrafficThreshold.uLowThreshold;
    192     pCtrlData->ctrlDataTrafficIntensityThresholds.TestInterval = ctrlDataInitParams->ctrlDataTrafficThreshold.TestInterval;
    193 
    194     TRACE4(pCtrlData->hReport, REPORT_SEVERITY_INFORMATION, "\nTraffic Intensity parameters:\nEvents enabled = %d\nuHighThreshold = %d\nuLowThreshold = %d\nTestInterval = %d\n\n", pCtrlData->ctrlDataTrafficIntensityEventsEnabled, pCtrlData->ctrlDataTrafficIntensityThresholds.uHighThreshold, pCtrlData->ctrlDataTrafficIntensityThresholds.uLowThreshold, pCtrlData->ctrlDataTrafficIntensityThresholds.TestInterval);
    195 
    196     /* Register the traffic intensity events with the traffic monitor */
    197     ctrlData_RegisterTrafficIntensityEvents (pCtrlData);
    198 
    199     /* If the events are enabled, start notification, if disabled - then do nothing */
    200     ctrlData_ToggleTrafficIntensityNotification (pCtrlData, pCtrlData->ctrlDataTrafficIntensityEventsEnabled);
    201 
    202     return TI_OK;
    203 }
    204 
    205 
    206 /***************************************************************************
    207 *                           ctrlData_unLoad                                *
    208 ****************************************************************************
    209 * DESCRIPTION:  This function unload the Ctrl data module.
    210 *
    211 * INPUTS:       hCtrlData - the object
    212 *
    213 * OUTPUT:
    214 *
    215 * RETURNS:      TI_OK - Unload succesfull
    216 *               TI_NOK - Unload unsuccesfull
    217 ***************************************************************************/
    218 TI_STATUS ctrlData_unLoad(TI_HANDLE hCtrlData)
    219 {
    220     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
    221 
    222     /* check parameters validity */
    223     if( pCtrlData == NULL )
    224     {
    225         return TI_NOK;
    226     }
    227 
    228     /* free control module object */
    229     os_memoryFree(pCtrlData->hOs, hCtrlData, sizeof(ctrlData_t));
    230 
    231     return TI_OK;
    232 }
    233 
    234 TI_STATUS ctrlData_getParamProtType(TI_HANDLE hCtrlData, erpProtectionType_e *protType)
    235 { /* CTRL_DATA_CURRENT_IBSS_PROTECTION_PARAM */
    236     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
    237 
    238     *protType = pCtrlData->ctrlDataIbssProtectionType;
    239     return TI_OK;
    240 }
    241 
    242 TI_STATUS ctrlData_getParamPreamble(TI_HANDLE hCtrlData, EPreamble *preamble)
    243 { /* CTRL_DATA_CURRENT_PREAMBLE_TYPE_PARAM */
    244     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
    245 
    246     *preamble = pCtrlData->ctrlDataCurrentPreambleType;
    247     return TI_OK;
    248 }
    249 
    250 /***************************************************************************
    251 *                           ctrlData_getParamBssid                         *
    252 ****************************************************************************
    253 * DESCRIPTION:  get a specific parameter related to Bssid
    254 *
    255 * INPUTS:       hCtrlData - the object
    256 *               paramVal  - type of parameter
    257 *
    258 *
    259 * OUTPUT:       bssid
    260 *
    261 * RETURNS:      TI_OK
    262 *               TI_NOK
    263 ***************************************************************************/
    264 TI_STATUS ctrlData_getParamBssid(TI_HANDLE hCtrlData, EInternalParam paramVal, TMacAddr bssid)
    265 {
    266     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
    267 
    268     if (paramVal == CTRL_DATA_CURRENT_BSSID_PARAM) {
    269         MAC_COPY (bssid, pCtrlData->ctrlDataCurrentBSSID);
    270     }
    271     else if (paramVal == CTRL_DATA_MAC_ADDRESS) {
    272         TFwInfo *pFwInfo = TWD_GetFWInfo (pCtrlData->hTWD);
    273         MAC_COPY (bssid, pFwInfo->macAddress);
    274     }
    275 
    276     return TI_OK;
    277 }
    278 
    279 /***************************************************************************
    280 *                           ctrlData_getParam                              *
    281 ****************************************************************************
    282 * DESCRIPTION:  get a specific parameter
    283 *
    284 * INPUTS:       hCtrlData - the object
    285 *
    286 *
    287 * OUTPUT:       pParamInfo - structure which include the value of
    288 *               the requested parameter
    289 *
    290 * RETURNS:      TI_OK
    291 *               TI_NOK
    292 ***************************************************************************/
    293 
    294 TI_STATUS ctrlData_getParam(TI_HANDLE hCtrlData, paramInfo_t *pParamInfo)
    295 {
    296     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
    297 
    298     TRACE1(pCtrlData->hReport, REPORT_SEVERITY_INFORMATION, "ctrlData_getParam() : param=0x%x \n", pParamInfo->paramType);
    299 
    300     switch (pParamInfo->paramType)
    301     {
    302     case CTRL_DATA_CURRENT_BSSID_PARAM:
    303 		MAC_COPY (pParamInfo->content.ctrlDataCurrentBSSID,
    304                   pCtrlData->ctrlDataCurrentBSSID);
    305         break;
    306 
    307     case CTRL_DATA_CURRENT_BSS_TYPE_PARAM:
    308         pParamInfo->content.ctrlDataCurrentBssType = pCtrlData->ctrlDataCurrentBssType;
    309         break;
    310 
    311     case CTRL_DATA_CURRENT_PREAMBLE_TYPE_PARAM:
    312         pParamInfo->content.ctrlDataCurrentPreambleType = pCtrlData->ctrlDataCurrentPreambleType;
    313         break;
    314 
    315     case CTRL_DATA_MAC_ADDRESS:
    316         {
    317             TFwInfo *pFwInfo = TWD_GetFWInfo (pCtrlData->hTWD);
    318             MAC_COPY (pParamInfo->content.ctrlDataDeviceMacAddress, pFwInfo->macAddress);
    319         }
    320         break;
    321 
    322     case CTRL_DATA_CURRENT_PROTECTION_STATUS_PARAM:
    323         pParamInfo->content.ctrlDataProtectionEnabled = pCtrlData->ctrlDataProtectionEnabled;
    324         break;
    325 
    326     case CTRL_DATA_CURRENT_IBSS_PROTECTION_PARAM:
    327         pParamInfo->content.ctrlDataIbssProtecionType = pCtrlData->ctrlDataIbssProtectionType;
    328         break;
    329 
    330     case CTRL_DATA_CURRENT_RTS_CTS_STATUS_PARAM:
    331         pParamInfo->content.ctrlDataRtsCtsStatus = pCtrlData->ctrlDataRtsCtsStatus;
    332         break;
    333 
    334     case CTRL_DATA_CLSFR_TYPE:
    335         txDataClsfr_GetClsfrType (pCtrlData->hTxDataQ, &pParamInfo->content.ctrlDataClsfrType);
    336         break;
    337 
    338     case CTRL_DATA_TRAFFIC_INTENSITY_THRESHOLD:
    339         pParamInfo->content.ctrlDataTrafficIntensityThresholds.uHighThreshold = pCtrlData->ctrlDataTrafficIntensityThresholds.uHighThreshold;
    340         pParamInfo->content.ctrlDataTrafficIntensityThresholds.uLowThreshold = pCtrlData->ctrlDataTrafficIntensityThresholds.uLowThreshold;
    341         pParamInfo->content.ctrlDataTrafficIntensityThresholds.TestInterval = pCtrlData->ctrlDataTrafficIntensityThresholds.TestInterval;
    342         break;
    343 
    344     default:
    345         TRACE0(pCtrlData->hReport, REPORT_SEVERITY_ERROR, " ctrlData_getParam() : PARAMETER NOT SUPPORTED \n");
    346 		return (PARAM_NOT_SUPPORTED);
    347     }
    348 
    349     return (TI_OK);
    350 }
    351 
    352 /***************************************************************************
    353 *                           ctrlData_buildSupportedHwRates                 *
    354 ****************************************************************************
    355 * DESCRIPTION:  builds HwRatesBitMap (supported rates) for txRatePolicy by anding
    356 *                   the AP support and the Policy rates (Enabled/Disabled rates)
    357 *
    358 * OUTPUT:
    359 *
    360 * RETURNS:      TI_OK
    361 *               TI_NOK
    362 ***************************************************************************/
    363 static TI_UINT32 ctrlData_buildSupportedHwRates (TI_UINT32 APsupport,
    364                                                  TI_UINT32 policySupport)
    365 {
    366     TI_UINT32  AppRateBitMap = 0;
    367     TI_UINT32  HwRatesBitMap = 0;
    368 
    369     /* 1. AND all Supported Rates masks */
    370     AppRateBitMap = APsupport & policySupport;
    371 
    372     /* 2. Incase there are no mutual rates: ignor Policy Rate Settings (use only AP Rates) */
    373 	if ( AppRateBitMap == 0 )
    374 	{
    375 		AppRateBitMap = APsupport;
    376     }
    377 
    378     /* 3. Set total supported rates bit map for txRatePolicy */
    379     rate_DrvBitmapToHwBitmap (AppRateBitMap, &HwRatesBitMap);
    380 
    381     return HwRatesBitMap;
    382 }
    383 
    384 
    385 /***************************************************************************
    386 *                           ctrlData_setTxRatePolicies                     *
    387 ****************************************************************************
    388 * DESCRIPTION:  This function sets rate fallback policies to be configured to FW
    389 *               If TSRS is defined to specific AC, the policy is derived from it,
    390 *               otherwise it is derived from pre-defined map
    391 *
    392 * INPUTS:       pCtrlData - the object
    393 *
    394 * RETURNS:      -
    395 *
    396 ***************************************************************************/
    397 static void ctrlData_setTxRatePolicies(ctrlData_t *pCtrlData)
    398 {
    399     TI_UINT32 		ac;
    400 	TI_UINT32 		uPolicyRateMask;    /* policy rates */
    401 	TI_UINT32 		uSupportedRateMask; /* AP supported rates */
    402     TI_UINT32       fwPolicyID = 0;
    403     TI_UINT32       uEnabledHwRatesMask;
    404     TI_UINT32       uShiftedBit;
    405     TI_UINT32       i;
    406     TTwdParamInfo   param;
    407 
    408     for (ac = 0; ac < MAX_NUM_OF_AC; ac++)
    409     {
    410         /* 1. If a special rate set is defined for this AC, use its related policy */
    411         /*    Otherwise use default settings for this class */
    412         if (pCtrlData->tsrsParameters[ac].supportedRatesMask != 0)
    413         {
    414             uPolicyRateMask    = pCtrlData->tsrsParameters[ac].policyClassRateMask;
    415             uSupportedRateMask = pCtrlData->tsrsParameters[ac].supportedRatesMask;
    416         }
    417         else
    418         {
    419             uPolicyRateMask    = pCtrlData->uCurrPolicyEnabledRatesMask;
    420             uSupportedRateMask = pCtrlData->ctrlDataCurrentRateMask;
    421         }
    422 
    423         /* 2. Build a bitMap for the supported rates */
    424         uEnabledHwRatesMask = ctrlData_buildSupportedHwRates (uSupportedRateMask, uPolicyRateMask);
    425         pCtrlData->ctrlDataTxRatePolicy.rateClass[fwPolicyID].txEnabledRates = uEnabledHwRatesMask;
    426 
    427         TRACE2(pCtrlData->hReport, REPORT_SEVERITY_INFORMATION, "ctrlData_setTxRatePolicies: AC %d, rate-policy 0x%x", ac, uEnabledHwRatesMask);
    428 
    429         /* Note that Long/Short retries are pre-set during configuration stage */
    430 
    431         /* 3. Finally, increase total number of policies */
    432         pCtrlData->tsrsParameters[ac].fwPolicyID = fwPolicyID++;
    433 
    434     } /* for (ac = 0; ac < MAX_NUM_OF_AC; ac++) */
    435 
    436     /* Add a specific policy for management packets, which uses only the lowest supported rate */
    437     pCtrlData->uMgmtPolicyId = fwPolicyID;
    438     uShiftedBit = 1;
    439     for (i = 0; i < 32; i++)
    440     {
    441         if ((uShiftedBit & uEnabledHwRatesMask) != 0)
    442         {
    443             break;
    444         }
    445         uShiftedBit = uShiftedBit << 1;
    446     }
    447     pCtrlData->ctrlDataTxRatePolicy.rateClass[fwPolicyID].txEnabledRates = uShiftedBit;
    448     fwPolicyID++;
    449 
    450     /* Download policies to the FW. Num of policies is 8 - one for each AC for every class */
    451     TRACE1(pCtrlData->hReport, REPORT_SEVERITY_INFORMATION, "ctrlData_setTxRatePolicies: num of Rate policies: %d\n", fwPolicyID);
    452 
    453     pCtrlData->ctrlDataTxRatePolicy.numOfRateClasses = fwPolicyID;
    454     param.paramType = TWD_TX_RATE_CLASS_PARAM_ID;
    455     param.content.pTxRatePlicy = &pCtrlData->ctrlDataTxRatePolicy;
    456 
    457     TWD_SetParam (pCtrlData->hTWD, &param);
    458 }
    459 
    460 
    461 /***************************************************************************
    462 *                           ctrlData_setParam                              *
    463 ****************************************************************************
    464 * DESCRIPTION:  set a specific parameter
    465 *
    466 * INPUTS:       hCtrlData - the object
    467 *               pParamInfo - structure which include the value to set for
    468 *               the requested parameter
    469 *
    470 * OUTPUT:
    471 *
    472 * RETURNS:      TI_OK
    473 *               TI_NOK
    474 ***************************************************************************/
    475 
    476 TI_STATUS ctrlData_setParam(TI_HANDLE hCtrlData, paramInfo_t *pParamInfo)
    477 {
    478     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
    479     TTwdParamInfo param;
    480 
    481     TRACE1(pCtrlData->hReport, REPORT_SEVERITY_INFORMATION, "ctrlData_setParam() : param=0x%x \n", pParamInfo->paramType);
    482 
    483     switch (pParamInfo->paramType)
    484     {
    485     case CTRL_DATA_RATE_CONTROL_ENABLE_PARAM:
    486         selectRateTable(pCtrlData, pCtrlData->ctrlDataCurrentRateMask);
    487 
    488         ctrlData_setTxRatePolicies(pCtrlData);
    489 
    490 		ctrlData_updateTxRateAttributes(hCtrlData); /* Update the TxCtrl module with rate changes. */
    491 
    492         break;
    493 
    494     case CTRL_DATA_CURRENT_BSSID_PARAM:
    495 		MAC_COPY (pCtrlData->ctrlDataCurrentBSSID,
    496 			      pParamInfo->content.ctrlDataCurrentBSSID);
    497 		txCtrlParams_setBssId (pCtrlData->hTxCtrl, &(pCtrlData->ctrlDataCurrentBSSID));
    498         break;
    499 
    500     case CTRL_DATA_CURRENT_BSS_TYPE_PARAM:
    501         if( pParamInfo->content.ctrlDataCurrentBssType != BSS_INFRASTRUCTURE &&
    502             pParamInfo->content.ctrlDataCurrentBssType != BSS_INDEPENDENT )
    503             return(PARAM_VALUE_NOT_VALID);
    504 
    505         pCtrlData->ctrlDataCurrentBssType = pParamInfo->content.ctrlDataCurrentBssType;
    506 		txCtrlParams_setBssType (pCtrlData->hTxCtrl, pCtrlData->ctrlDataCurrentBssType);
    507         break;
    508 
    509     case CTRL_DATA_CURRENT_PREAMBLE_TYPE_PARAM:
    510         if( pParamInfo->content.ctrlDataCurrentPreambleType != PREAMBLE_LONG &&
    511             pParamInfo->content.ctrlDataCurrentPreambleType != PREAMBLE_SHORT )
    512             return(PARAM_VALUE_NOT_VALID);
    513  pCtrlData->ctrlDataCurrentPreambleType = pParamInfo->content.ctrlDataCurrentPreambleType;
    514         break;
    515 
    516     case CTRL_DATA_CURRENT_SUPPORTED_RATE_MASK_PARAM:
    517         pCtrlData->ctrlDataCurrentRateMask = pParamInfo->content.ctrlDataCurrentRateMask;
    518         selectRateTable(pCtrlData, pCtrlData->ctrlDataCurrentRateMask);
    519 		ctrlData_updateTxRateAttributes(hCtrlData); /* Update the TxCtrl module with rate changes. */
    520         break;
    521 
    522     case CTRL_DATA_TSRS_PARAM:
    523         ctrlData_storeTSRateSet(pCtrlData, &pParamInfo->content.txDataQosParams);
    524 
    525         break;
    526 
    527     case CTRL_DATA_CURRENT_PROTECTION_STATUS_PARAM:
    528         if (pCtrlData->ctrlDataProtectionEnabled != pParamInfo->content.ctrlDataProtectionEnabled)
    529         {
    530             pCtrlData->ctrlDataProtectionEnabled = pParamInfo->content.ctrlDataProtectionEnabled;
    531 
    532             /* set indication also to TNET */
    533             param.paramType = TWD_CTS_TO_SELF_PARAM_ID;
    534             if(pCtrlData->ctrlDataProtectionEnabled == TI_TRUE)
    535                 param.content.halCtrlCtsToSelf = CTS_TO_SELF_ENABLE;
    536             else
    537                 param.content.halCtrlCtsToSelf = CTS_TO_SELF_DISABLE;
    538 
    539             TWD_SetParam (pCtrlData->hTWD, &param);
    540 
    541 
    542             /* In case of using protection fragmentation should be disabled */
    543             param.paramType = TWD_FRAG_THRESHOLD_PARAM_ID;
    544             if(pCtrlData->ctrlDataProtectionEnabled == TI_TRUE)
    545             {
    546                 /* save last non-protection mode fragmentation threshold */
    547                 TWD_GetParam(pCtrlData->hTWD,&param);
    548                 pCtrlData->lastFragmentThreshold = param.content.halCtrlFragThreshold;
    549                 /* set fragmentation threshold to max (disable) */
    550                 param.content.halCtrlFragThreshold = TWD_FRAG_THRESHOLD_MAX;
    551             }
    552             else
    553                 param.content.halCtrlFragThreshold = pCtrlData->lastFragmentThreshold;
    554 
    555             TWD_SetParam(pCtrlData->hTWD,&param);
    556         }
    557 
    558         break;
    559 
    560     case CTRL_DATA_CURRENT_IBSS_PROTECTION_PARAM:
    561         if(ERP_PROTECTION_STANDARD == pCtrlData->ctrlDataDesiredIbssProtection)
    562         {
    563             pCtrlData->ctrlDataIbssProtectionType = pParamInfo->content.ctrlDataIbssProtecionType;
    564         }
    565         else
    566         {
    567             pCtrlData->ctrlDataIbssProtectionType = ERP_PROTECTION_NONE;
    568         }
    569 
    570         /* set indication also to TNET */
    571         param.paramType = TWD_CTS_TO_SELF_PARAM_ID;
    572         if(pCtrlData->ctrlDataIbssProtectionType != ERP_PROTECTION_NONE)
    573             param.content.halCtrlCtsToSelf = CTS_TO_SELF_ENABLE;
    574         else
    575             param.content.halCtrlCtsToSelf = CTS_TO_SELF_DISABLE;
    576 
    577         TWD_SetParam (pCtrlData->hTWD, &param);
    578         break;
    579 
    580     case CTRL_DATA_CURRENT_RTS_CTS_STATUS_PARAM:
    581         pCtrlData->ctrlDataRtsCtsStatus = pParamInfo->content.ctrlDataRtsCtsStatus;
    582         break;
    583     case CTRL_DATA_CLSFR_TYPE:
    584         txDataClsfr_SetClsfrType (pCtrlData->hTxDataQ, pParamInfo->content.ctrlDataClsfrType);
    585         break;
    586 
    587     case CTRL_DATA_CLSFR_CONFIG:
    588         txDataClsfr_InsertClsfrEntry(pCtrlData->hTxDataQ, &pParamInfo->content.ctrlDataClsfrInsertTable);
    589         break;
    590 
    591     case CTRL_DATA_CLSFR_REMOVE_ENTRY:
    592         txDataClsfr_RemoveClsfrEntry(pCtrlData->hTxDataQ, &pParamInfo->content.ctrlDataClsfrInsertTable);
    593        break;
    594 
    595     case CTRL_DATA_TOGGLE_TRAFFIC_INTENSITY_EVENTS:
    596 
    597             /* Enable or disable events according to flag */
    598             ctrlData_ToggleTrafficIntensityNotification (pCtrlData, (TI_BOOL)pParamInfo->content.ctrlDataTrafficIntensityEventsFlag);
    599 
    600         break;
    601 
    602     case CTRL_DATA_TRAFFIC_INTENSITY_THRESHOLD:
    603         {
    604             OS_802_11_TRAFFIC_INTENSITY_THRESHOLD_PARAMS *localParams = &pParamInfo->content.ctrlDataTrafficIntensityThresholds;
    605             TI_BOOL savedEnableFlag;   /* Used to save previous enable/disable flag - before stopping/starting events for change in params */
    606 
    607             /* If any of the parameters has changed, we need to re-register with the Traffic Monitor */
    608             if ((localParams->uHighThreshold != pCtrlData->ctrlDataTrafficIntensityThresholds.uHighThreshold) ||
    609                 (localParams->uLowThreshold != pCtrlData->ctrlDataTrafficIntensityThresholds.uLowThreshold) ||
    610                 (localParams->TestInterval != pCtrlData->ctrlDataTrafficIntensityThresholds.TestInterval))
    611             {
    612 
    613                 os_memoryCopy(pCtrlData->hOs, &pCtrlData->ctrlDataTrafficIntensityThresholds,
    614                                 localParams,
    615                                 sizeof(OS_802_11_TRAFFIC_INTENSITY_THRESHOLD_PARAMS));
    616 
    617                 savedEnableFlag = pCtrlData->ctrlDataTrafficIntensityEventsEnabled;
    618 
    619                 /* Turn off traffic events */
    620                 ctrlData_ToggleTrafficIntensityNotification (pCtrlData, TI_FALSE);
    621 
    622                 /* Unregister current events */
    623                 ctrlData_UnregisterTrafficIntensityEvents (pCtrlData);
    624 
    625                 /* And re-register with new thresholds */
    626                 ctrlData_RegisterTrafficIntensityEvents (pCtrlData);
    627 
    628                 /* Enable events if they were enabled  */
    629                 ctrlData_ToggleTrafficIntensityNotification (pCtrlData, savedEnableFlag);
    630 
    631             }
    632         }
    633 
    634         break;
    635 
    636     default:
    637 TRACE0(pCtrlData->hReport, REPORT_SEVERITY_ERROR, " ctrlData_setParam() : PARAMETER NOT SUPPORTED \n");
    638         return (PARAM_NOT_SUPPORTED);
    639     }
    640 
    641     return (TI_OK);
    642 }
    643 
    644 
    645 /***************************************************************************
    646 *                           selectRateTable                                *
    647 ****************************************************************************
    648 * DESCRIPTION:
    649 *
    650 * INPUTS:       hCtrlData - the object
    651 *
    652 * OUTPUT:
    653 *
    654 * RETURNS:
    655 ***************************************************************************/
    656 
    657 static void selectRateTable(TI_HANDLE hCtrlData, TI_UINT32 rateMask)
    658 {
    659     paramInfo_t param;
    660     ERate       rate;
    661     TI_BOOL     b11nEnable;
    662 
    663     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
    664 
    665     rate = rate_GetMaxFromDrvBitmap (rateMask);
    666 
    667     param.paramType = SITE_MGR_OPERATIONAL_MODE_PARAM;
    668     siteMgr_getParam(pCtrlData->hSiteMgr, &param);
    669 
    670     switch(param.content.siteMgrDot11OperationalMode)
    671     {
    672         case DOT11_B_MODE:
    673             pCtrlData->uCurrPolicyEnabledRatesMask = pCtrlData->policyEnabledRatesMaskCck;
    674             break;
    675 
    676         case DOT11_G_MODE:
    677             if( (rate == DRV_RATE_11M) ||
    678                 (rate == DRV_RATE_5_5M)||
    679                 (rate == DRV_RATE_2M)  ||
    680                 (rate == DRV_RATE_1M)    )
    681             {
    682                 pCtrlData->uCurrPolicyEnabledRatesMask = pCtrlData->policyEnabledRatesMaskCck;
    683             }
    684             else
    685             {
    686                pCtrlData->uCurrPolicyEnabledRatesMask = pCtrlData->policyEnabledRatesMaskOfdm;
    687             }
    688             break;
    689 
    690         case DOT11_A_MODE:
    691             pCtrlData->uCurrPolicyEnabledRatesMask = pCtrlData->policyEnabledRatesMaskOfdmA;
    692             break;
    693 
    694         case DOT11_DUAL_MODE:
    695         case DOT11_MAX_MODE:
    696         case DOT11_N_MODE:
    697             TRACE0(pCtrlData->hReport, REPORT_SEVERITY_ERROR, " uCurrPolicyEnabledRatesMask not configured !!!");
    698             break;
    699     }
    700 
    701     /* add HT MCS rates */
    702     StaCap_IsHtEnable (pCtrlData->hStaCap, &b11nEnable);
    703     if (b11nEnable == TI_TRUE)
    704     {
    705         if ((rate == DRV_RATE_MCS_0) |
    706             (rate == DRV_RATE_MCS_1) |
    707             (rate == DRV_RATE_MCS_2) |
    708             (rate == DRV_RATE_MCS_3) |
    709             (rate == DRV_RATE_MCS_4) |
    710             (rate == DRV_RATE_MCS_5) |
    711             (rate == DRV_RATE_MCS_6) |
    712             (rate == DRV_RATE_MCS_7))
    713         {
    714             pCtrlData->uCurrPolicyEnabledRatesMask = pCtrlData->policyEnabledRatesMaskOfdmN;
    715         }
    716     }
    717 }
    718 
    719 
    720 /***************************************************************************
    721 *                           ctrlData_stop                                  *
    722 ****************************************************************************
    723 * DESCRIPTION:  This function stop the link control algorithms.
    724 *
    725 * INPUTS:       hCtrlData - the object
    726 *
    727 * OUTPUT:
    728 *
    729 * RETURNS:      TI_OK
    730 *               TI_NOK
    731 ***************************************************************************/
    732 
    733 TI_STATUS ctrlData_stop(TI_HANDLE hCtrlData)
    734 {
    735     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
    736 
    737     /* set Preamble length option to default value*/
    738     pCtrlData->ctrlDataCurrentPreambleType = DEF_CURRENT_PREAMBLE;
    739 
    740     os_memoryZero(pCtrlData->hOs,
    741                   &pCtrlData->tsrsParameters,
    742                   sizeof(pCtrlData->tsrsParameters));
    743 
    744     TRACE0(pCtrlData->hReport, REPORT_SEVERITY_INFORMATION, " ctrlData_stop() : Link control algorithms stoped \n");
    745 
    746     return TI_OK;
    747 }
    748 
    749 
    750 /***************************************************************************
    751 *						ctrlData_updateTxRateAttributes		               *
    752 ****************************************************************************
    753 * DESCRIPTION:	This function updates the TxCtrl module with all Tx rate attributes
    754 *				  whenever any of them changes.
    755 *				It is called from ctrlData_setParam() after any rate param update.
    756 ***************************************************************************/
    757 void ctrlData_updateTxRateAttributes(TI_HANDLE hCtrlData)
    758 {
    759 	ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
    760 	TI_UINT8    ac;
    761 
    762 	/* For each AC, get current Tx-rate policy for Data and for Mgmt packets and update the TxCtrl module. */
    763 	for (ac = 0; ac < MAX_NUM_OF_AC; ac++)
    764 	{
    765 		txCtrlParams_updateMgmtRateAttributes(pCtrlData->hTxCtrl, pCtrlData->uMgmtPolicyId, ac);
    766 		txCtrlParams_updateDataRateAttributes(pCtrlData->hTxCtrl, pCtrlData->tsrsParameters[ac].fwPolicyID, ac);
    767 	}
    768 }
    769 
    770 /***************************************************************************
    771 *                   ctrlData_getCurrBssTypeAndCurrBssId                    *
    772 ****************************************************************************
    773 * DESCRIPTION:  This function return the current BSSID and the
    774 *               current BSS Type
    775 *
    776 * INPUTS:       hCtrlData - the object
    777 *
    778 * OUTPUT:       pCurrBssid - pointer to return the current bssid
    779 *               pCurrBssType - pointer to return the current bss type
    780 *
    781 * RETURNS:      void
    782 ***************************************************************************/
    783 void ctrlData_getCurrBssTypeAndCurrBssId(TI_HANDLE hCtrlData, TMacAddr *pCurrBssid,
    784                                            ScanBssType_e *pCurrBssType)
    785 {
    786     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
    787 
    788 	MAC_COPY (*pCurrBssid, pCtrlData->ctrlDataCurrentBSSID);
    789     *pCurrBssType = pCtrlData->ctrlDataCurrentBssType;
    790 
    791 }
    792 
    793 
    794 /*-----------------------------------------------------------------------------
    795 Routine Name: ctrlData_ToggleTrafficIntensityNotification
    796 Routine Description: turns ON/OFF traffic intensity notification events
    797                      from Traffic Monitor module
    798 Arguments:
    799 Return Value:
    800 -----------------------------------------------------------------------------*/
    801 void ctrlData_ToggleTrafficIntensityNotification (TI_HANDLE hCtrlData, TI_BOOL enabledFlag)
    802 {
    803     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
    804     TI_UINT8 idx;
    805 
    806    if (enabledFlag)
    807    {
    808       for (idx=0; idx < CTRL_DATA_TRAFFIC_INTENSITY_MAX_EVENTS; idx++)
    809       {
    810          TrafficMonitor_StartEventNotif (pCtrlData->hTrafficMonitor,pCtrlData->ctrlDataTrafficThresholdEvents[idx]);
    811       }
    812       TRACE0(pCtrlData->hReport, REPORT_SEVERITY_INFORMATION, "ctrlData_ToggleTrafficIntensityNotification (TI_TRUE)\n");
    813    }
    814    else
    815    {
    816       for (idx=0; idx < CTRL_DATA_TRAFFIC_INTENSITY_MAX_EVENTS; idx++)
    817       {
    818          TrafficMonitor_StopEventNotif (pCtrlData->hTrafficMonitor,pCtrlData->ctrlDataTrafficThresholdEvents[idx]);
    819       }
    820       TRACE0(pCtrlData->hReport, REPORT_SEVERITY_INFORMATION, "ctrlData_ToggleTrafficIntensityNotification (TI_FALSE)\n");
    821    }
    822    pCtrlData->ctrlDataTrafficIntensityEventsEnabled = enabledFlag;
    823 
    824 }
    825 
    826 /*-----------------------------------------------------------------------------
    827 Routine Name: ctrlData_UnregisterTrafficIntensityEvents
    828 Routine Description: unregisters existing events from traffic monitor
    829 Arguments:
    830 Return Value:
    831 -----------------------------------------------------------------------------*/
    832 static void ctrlData_UnregisterTrafficIntensityEvents (TI_HANDLE hCtrlData)
    833 {
    834     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
    835     TI_UINT8 idx;
    836 
    837     /* Loop through events and unregister them */
    838     for (idx=0; idx < CTRL_DATA_TRAFFIC_INTENSITY_MAX_EVENTS; idx++)
    839     {
    840        TrafficMonitor_UnregEvent (pCtrlData->hTrafficMonitor,pCtrlData->ctrlDataTrafficThresholdEvents[idx]);
    841     }
    842 
    843     TRACE0(pCtrlData->hReport, REPORT_SEVERITY_INFORMATION, "ctrlData_UnregisterTrafficIntensityEvents: Unregistered all events\n");
    844 
    845 }
    846 
    847 
    848 /*-----------------------------------------------------------------------------
    849 Routine Name: ctrlData_RegisterTrafficIntensityEvents
    850 Routine Description: Registers traffic intensity threshold events through traffic monitor
    851 Arguments:
    852 Return Value:
    853 -----------------------------------------------------------------------------*/
    854 static void ctrlData_RegisterTrafficIntensityEvents (TI_HANDLE hCtrlData)
    855 {
    856     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
    857     TrafficAlertRegParm_t TrafficAlertRegParm;
    858     TI_STATUS status;
    859 
    860     /* Register high threshold "direction up" event */
    861     TrafficAlertRegParm.CallBack = ctrlData_TrafficThresholdCrossed;
    862     TrafficAlertRegParm.Context = hCtrlData;
    863     TrafficAlertRegParm.Cookie =  CTRL_DATA_TRAFFIC_INTENSITY_HIGH_CROSSED_ABOVE;
    864     TrafficAlertRegParm.Direction = TRAFF_UP;
    865     TrafficAlertRegParm.Trigger = TRAFF_EDGE;
    866     TrafficAlertRegParm.TimeIntervalMs = pCtrlData->ctrlDataTrafficIntensityThresholds.TestInterval;
    867     TrafficAlertRegParm.Threshold = pCtrlData->ctrlDataTrafficIntensityThresholds.uHighThreshold;
    868     TrafficAlertRegParm.MonitorType = TX_RX_DIRECTED_FRAMES;
    869     pCtrlData->ctrlDataTrafficThresholdEvents[0] = TrafficMonitor_RegEvent(pCtrlData->hTrafficMonitor,&TrafficAlertRegParm,TI_FALSE);
    870 
    871     if (pCtrlData->ctrlDataTrafficThresholdEvents[0] == NULL)
    872     {
    873          TRACE0(pCtrlData->hReport, REPORT_SEVERITY_ERROR, " ctrlData_RegisterTrafficIntensityEvents() : Failed to register high treshold event (TRAFF_UP) \n");
    874          return;
    875     }
    876 
    877     /* Register high threshold "direction down" event*/
    878     TrafficAlertRegParm.Cookie =  CTRL_DATA_TRAFFIC_INTENSITY_HIGH_CROSSED_BELOW;
    879     TrafficAlertRegParm.Direction = TRAFF_DOWN;
    880     TrafficAlertRegParm.Trigger = TRAFF_EDGE;
    881     TrafficAlertRegParm.Threshold = pCtrlData->ctrlDataTrafficIntensityThresholds.uHighThreshold;
    882     pCtrlData->ctrlDataTrafficThresholdEvents[1] = TrafficMonitor_RegEvent(pCtrlData->hTrafficMonitor,&TrafficAlertRegParm,TI_FALSE);
    883 
    884     if (pCtrlData->ctrlDataTrafficThresholdEvents[1] == NULL)
    885     {
    886          TRACE0(pCtrlData->hReport, REPORT_SEVERITY_ERROR, " ctrlData_RegisterTrafficIntensityEvents() : Failed to register high treshold event (TRAFF_DOWN) \n");
    887          return;
    888     }
    889 
    890     /* Define the "direction below" and "direction above" events as opposites (events that reset eachother)*/
    891     status = TrafficMonitor_SetRstCondition(pCtrlData->hTrafficMonitor,
    892                                             pCtrlData->ctrlDataTrafficThresholdEvents[0],
    893                                             pCtrlData->ctrlDataTrafficThresholdEvents[1],
    894                                             TI_TRUE);
    895 
    896     if (status != TI_OK)
    897     {
    898       TRACE1(pCtrlData->hReport, REPORT_SEVERITY_ERROR , "ctrlData_RegisterTrafficIntensityEvents: TrafficMonitor_SetRstCondition returned status = %d\n",status);
    899     }
    900 
    901     /* Register low threshold "direction up" event */
    902     TrafficAlertRegParm.Cookie =  CTRL_DATA_TRAFFIC_INTENSITY_LOW_CROSSED_ABOVE;
    903     TrafficAlertRegParm.Direction = TRAFF_UP;
    904     TrafficAlertRegParm.Trigger = TRAFF_EDGE;
    905     TrafficAlertRegParm.Threshold = pCtrlData->ctrlDataTrafficIntensityThresholds.uLowThreshold;
    906     pCtrlData->ctrlDataTrafficThresholdEvents[2] = TrafficMonitor_RegEvent(pCtrlData->hTrafficMonitor,&TrafficAlertRegParm,TI_FALSE);
    907 
    908     if (pCtrlData->ctrlDataTrafficThresholdEvents[2] == NULL)
    909     {
    910          TRACE0(pCtrlData->hReport, REPORT_SEVERITY_ERROR, " ctrlData_RegisterTrafficIntensityEvents() : Failed to register low treshold event (TRAFF_UP) \n");
    911          return;
    912     }
    913 
    914     /* Register low threshold "direction below" event */
    915     TrafficAlertRegParm.Cookie =  CTRL_DATA_TRAFFIC_INTENSITY_LOW_CROSSED_BELOW;
    916     TrafficAlertRegParm.Direction = TRAFF_DOWN;
    917     TrafficAlertRegParm.Trigger = TRAFF_EDGE;
    918     TrafficAlertRegParm.Threshold = pCtrlData->ctrlDataTrafficIntensityThresholds.uLowThreshold;
    919     pCtrlData->ctrlDataTrafficThresholdEvents[3] = TrafficMonitor_RegEvent(pCtrlData->hTrafficMonitor,&TrafficAlertRegParm,TI_FALSE);
    920 
    921     if (pCtrlData->ctrlDataTrafficThresholdEvents[3] == NULL)
    922     {
    923          TRACE0(pCtrlData->hReport, REPORT_SEVERITY_ERROR, " ctrlData_RegisterTrafficIntensityEvents() : Failed to register low treshold event (TRAFF_DOWN) \n");
    924          return;
    925     }
    926 
    927     /* Define the "direction below" and "direction above" events as opposites (events that reset eachother)*/
    928     status = TrafficMonitor_SetRstCondition(pCtrlData->hTrafficMonitor,
    929                                             pCtrlData->ctrlDataTrafficThresholdEvents[2],
    930                                             pCtrlData->ctrlDataTrafficThresholdEvents[3],
    931                                             TI_TRUE);
    932 
    933     if (status != TI_OK)
    934     {
    935       TRACE1(pCtrlData->hReport, REPORT_SEVERITY_ERROR , "ctrlData_RegisterTrafficIntensityEvents: TrafficMonitor_SetRstCondition returned status = %d\n",status);
    936     }
    937 
    938     TRACE0(pCtrlData->hReport, REPORT_SEVERITY_INFORMATION, " ctrlData_RegisterTrafficIntensityEvents() : finished registering all events \n");
    939 
    940 }
    941 
    942 
    943 /*-----------------------------------------------------------------------------
    944 Routine Name: ctrlData_TrafficThresholdCrossed
    945 Routine Description: called whenever traffic intensity threshold is crossed.
    946                      notifies event handler to send appropriate event with threshold parameters.
    947 Arguments:
    948 Return Value:
    949 -----------------------------------------------------------------------------*/
    950 static void ctrlData_TrafficThresholdCrossed(TI_HANDLE Context,TI_UINT32 Cookie)
    951 {
    952     ctrlData_t *pCtrlData = (ctrlData_t *)Context;
    953     trafficIntensityThresholdCross_t crossInfo;
    954 
    955     switch(Cookie)
    956     {
    957     case CTRL_DATA_TRAFFIC_INTENSITY_HIGH_CROSSED_ABOVE:
    958             crossInfo.thresholdCross = (TI_UINT32)HIGH_THRESHOLD_CROSS;
    959             crossInfo.thresholdCrossDirection = (TI_UINT32)CROSS_ABOVE;
    960             EvHandlerSendEvent(pCtrlData->hEvHandler, IPC_EVENT_TRAFFIC_INTENSITY_THRESHOLD_CROSSED, (TI_UINT8 *)&crossInfo,sizeof(trafficIntensityThresholdCross_t));
    961        break;
    962 
    963     case CTRL_DATA_TRAFFIC_INTENSITY_HIGH_CROSSED_BELOW:
    964             crossInfo.thresholdCross = (TI_UINT32)HIGH_THRESHOLD_CROSS;
    965             crossInfo.thresholdCrossDirection = (TI_UINT32)CROSS_BELOW;
    966             EvHandlerSendEvent(pCtrlData->hEvHandler, IPC_EVENT_TRAFFIC_INTENSITY_THRESHOLD_CROSSED, (TI_UINT8 *)&crossInfo,sizeof(trafficIntensityThresholdCross_t));
    967        break;
    968 
    969     case CTRL_DATA_TRAFFIC_INTENSITY_LOW_CROSSED_ABOVE:
    970             crossInfo.thresholdCross = (TI_UINT32)LOW_THRESHOLD_CROSS;
    971             crossInfo.thresholdCrossDirection = (TI_UINT32)CROSS_ABOVE;
    972             EvHandlerSendEvent(pCtrlData->hEvHandler, IPC_EVENT_TRAFFIC_INTENSITY_THRESHOLD_CROSSED, (TI_UINT8 *)&crossInfo,sizeof(trafficIntensityThresholdCross_t));
    973        break;
    974 
    975     case CTRL_DATA_TRAFFIC_INTENSITY_LOW_CROSSED_BELOW:
    976             crossInfo.thresholdCross = (TI_UINT32)LOW_THRESHOLD_CROSS;
    977             crossInfo.thresholdCrossDirection = (TI_UINT32)CROSS_BELOW;
    978             EvHandlerSendEvent(pCtrlData->hEvHandler, IPC_EVENT_TRAFFIC_INTENSITY_THRESHOLD_CROSSED, (TI_UINT8 *)&crossInfo,sizeof(trafficIntensityThresholdCross_t));
    979        break;
    980     default:
    981          TRACE0(pCtrlData->hReport, REPORT_SEVERITY_ERROR, " ctrlData_TrafficThresholdCrossed() : Unknown cookie received from traffic monitor !!! \n");
    982        break;
    983    }
    984 
    985 }
    986 
    987 /*************************************************************************
    988  *                                                                       *
    989  *                          DEBUG FUNCTIONS                              *
    990  *                                                                       *
    991  *************************************************************************/
    992 
    993 #ifdef TI_DBG
    994 
    995 void ctrlData_printTxParameters(TI_HANDLE hCtrlData)
    996 {
    997 #ifdef REPORT_LOG
    998     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
    999 
   1000     WLAN_OS_REPORT(("            Tx Parameters            \n"));
   1001     WLAN_OS_REPORT(("-------------------------------------\n"));
   1002     WLAN_OS_REPORT(("currentPreamble                     = %d\n\n",pCtrlData->ctrlDataCurrentPreambleType));
   1003     WLAN_OS_REPORT(("ctrlDataCurrentRateMask             = 0x%X\n",pCtrlData->ctrlDataCurrentRateMask));
   1004 #endif
   1005 }
   1006 
   1007 
   1008 void ctrlData_printCtrlBlock(TI_HANDLE hCtrlData)
   1009 {
   1010 #ifdef REPORT_LOG
   1011     ctrlData_t *pCtrlData = (ctrlData_t *)hCtrlData;
   1012     TI_UINT32  i;
   1013 
   1014     WLAN_OS_REPORT(("    CtrlData BLock    \n"));
   1015     WLAN_OS_REPORT(("----------------------\n"));
   1016 
   1017     WLAN_OS_REPORT(("hSiteMgr = 0x%X\n",pCtrlData->hSiteMgr));
   1018     WLAN_OS_REPORT(("hTWD = 0x%X\n",pCtrlData->hTWD));
   1019     WLAN_OS_REPORT(("hOs = 0x%X\n",pCtrlData->hOs));
   1020     WLAN_OS_REPORT(("hReport = 0x%X\n",pCtrlData->hReport));
   1021 
   1022     WLAN_OS_REPORT(("ctrlDataDeviceMacAddress = 0x%X.0x%X.0x%X.0x%X.0x%X.0x%X. \n", pCtrlData->ctrlDataDeviceMacAddress[0],
   1023                                                                                     pCtrlData->ctrlDataDeviceMacAddress[1],
   1024                                                                                     pCtrlData->ctrlDataDeviceMacAddress[2],
   1025                                                                                     pCtrlData->ctrlDataDeviceMacAddress[3],
   1026                                                                                     pCtrlData->ctrlDataDeviceMacAddress[4],
   1027                                                                                     pCtrlData->ctrlDataDeviceMacAddress[5]));
   1028 
   1029     WLAN_OS_REPORT(("ctrlDataCurrentBSSID = 0x%X.0x%X.0x%X.0x%X.0x%X.0x%X. \n", pCtrlData->ctrlDataCurrentBSSID[0],
   1030                                                                                 pCtrlData->ctrlDataCurrentBSSID[1],
   1031                                                                                 pCtrlData->ctrlDataCurrentBSSID[2],
   1032                                                                                 pCtrlData->ctrlDataCurrentBSSID[3],
   1033                                                                                 pCtrlData->ctrlDataCurrentBSSID[4],
   1034                                                                                 pCtrlData->ctrlDataCurrentBSSID[5]));
   1035 
   1036     WLAN_OS_REPORT(("ctrlDataCurrentBssType      = %d\n", pCtrlData->ctrlDataCurrentBssType));
   1037     WLAN_OS_REPORT(("ctrlDataCurrentRateMask     = 0x%X\n", pCtrlData->ctrlDataCurrentRateMask));
   1038     WLAN_OS_REPORT(("ctrlDataCurrentPreambleType = %d\n", pCtrlData->ctrlDataCurrentPreambleType));
   1039 
   1040     WLAN_OS_REPORT(("Traffic Intensity threshold events status: %s\n", (pCtrlData->ctrlDataTrafficIntensityEventsEnabled ? "Enabled" : "Disabled")));
   1041     WLAN_OS_REPORT(("Traffic Intensity high threshold: %d packets/sec \n", pCtrlData->ctrlDataTrafficIntensityThresholds.uHighThreshold));
   1042     WLAN_OS_REPORT(("Traffic Intensity low threshold: %d packets/sec \n", pCtrlData->ctrlDataTrafficIntensityThresholds.uLowThreshold));
   1043     WLAN_OS_REPORT(("Traffic Intensity test interval: %d ms\n", pCtrlData->ctrlDataTrafficIntensityThresholds.TestInterval));
   1044 
   1045     for (i=0; i < pCtrlData->ctrlDataTxRatePolicy.numOfRateClasses; i++)
   1046     {
   1047         WLAN_OS_REPORT(("Rate Enable/Disable Mask = 0x%x\n",
   1048 						pCtrlData->ctrlDataTxRatePolicy.rateClass[i].txEnabledRates));
   1049 
   1050         WLAN_OS_REPORT(("Long retry = %d, Short retry = %d\n",
   1051 						pCtrlData->ctrlDataTxRatePolicy.rateClass[i].longRetryLimit,
   1052 						pCtrlData->ctrlDataTxRatePolicy.rateClass[i].shortRetryLimit));
   1053     }
   1054 #endif
   1055 }
   1056 
   1057 
   1058 #endif /*TI_DBG*/
   1059 
   1060 
   1061 /***************************************************************************
   1062 *                           ctrlData_storeTSRateSet
   1063 ****************************************************************************
   1064 * DESCRIPTION:  This function translates TSRS rates into map of retransmissions
   1065 *               similar to predefined clients rates retransmissions, and stores
   1066 *               in the Ctrl database
   1067 *
   1068 * INPUTS:       pCtrlData - the object
   1069 *               acID
   1070 *               rates array
   1071 *
   1072 * RETURNS:      -
   1073 ****************************************************************************/
   1074 static void ctrlData_storeTSRateSet(ctrlData_t *pCtrlData, TTxDataQosParams *tsrsParams)
   1075 {
   1076     TI_UINT32 rateCount;
   1077     TI_UINT32 acID;
   1078     TI_UINT32 tsrsRequestedMap;
   1079     ERate rateNumber;
   1080 
   1081     acID = tsrsParams->acID;
   1082     os_memoryZero(pCtrlData->hOs,
   1083                   &(pCtrlData->tsrsParameters[acID]),
   1084                   sizeof(pCtrlData->tsrsParameters[acID]));
   1085 
   1086     tsrsRequestedMap = 0;
   1087 
   1088     for (rateCount = 0; rateCount < tsrsParams->tsrsArrLen; rateCount++)
   1089     {
   1090         /* Erase Most significant bit in case it was raised to mark nominal PHY rates (& 0x7F) */
   1091         /* Convert multiplication of 500kb/sec to ERate and then to ETxRateClassId */
   1092         /* and update retransmission map in accordance to rate definitions */
   1093         rateNumber = rate_NumberToDrv ((tsrsParams->tsrsArr[rateCount] & 0x7F) >> 1);
   1094 
   1095         pCtrlData->tsrsParameters[acID].policyClassRateMask = pCtrlData->uCurrPolicyEnabledRatesMask;
   1096 
   1097         tsrsRequestedMap |= 1 << (rateNumber - 1);
   1098     }
   1099     /* Update supportedRatesMask according to TSRS rates and rates supported */
   1100     pCtrlData->tsrsParameters[acID].supportedRatesMask = tsrsRequestedMap;
   1101 
   1102     /* Check that Rate Fallback policy map is not empty; if this is the case, ignore pre-defined policy */
   1103     if (pCtrlData->tsrsParameters[acID].policyClassRateMask == 0)
   1104     {
   1105         pCtrlData->tsrsParameters[acID].policyClassRateMask = pCtrlData->tsrsParameters[acID].supportedRatesMask;
   1106     }
   1107 }
   1108 
   1109 
   1110 
   1111 
   1112