Home | History | Annotate | Download | only in Sta_Management
      1 /*
      2  * qosMngr.c
      3  *
      4  * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved.
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  *
     11  *  * Redistributions of source code must retain the above copyright
     12  *    notice, this list of conditions and the following disclaimer.
     13  *  * Redistributions in binary form must reproduce the above copyright
     14  *    notice, this list of conditions and the following disclaimer in
     15  *    the documentation and/or other materials provided with the
     16  *    distribution.
     17  *  * Neither the name Texas Instruments nor the names of its
     18  *    contributors may be used to endorse or promote products derived
     19  *    from this software without specific prior written permission.
     20  *
     21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     24  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     25  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     26  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     27  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     31  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     32  */
     33 
     34 /** \file qosMngr.c
     35  *  \brief QOS module interface
     36  *
     37  *  \see qosMngr.h
     38  */
     39 
     40 /****************************************************************************************************/
     41 /*																									*/
     42 /*		MODULE:		qosMGr.c																	    */
     43 /*		PURPOSE:	QOS module interface.												            */
     44 /*                  This module handles the QOS manager configuration.	 							*/
     45 /*																						 			*/
     46 /****************************************************************************************************/
     47 #define __FILE_ID__  FILE_ID_74
     48 #include "report.h"
     49 #include "osApi.h"
     50 #include "paramOut.h"
     51 #include "siteMgrApi.h"
     52 #include "qosMngr.h"
     53 #include "qosMngr_API.h"
     54 #include "sme.h"
     55 #include "EvHandler.h"
     56 #ifdef XCC_MODULE_INCLUDED
     57 #include "XCCMngr.h"
     58 #include "XCCTSMngr.h"
     59 #endif
     60 #include "TWDriver.h"
     61 #include "DrvMainModules.h"
     62 #include "StaCap.h"
     63 
     64 
     65 extern int WMEQosTagToACTable[MAX_NUM_OF_802_1d_TAGS];
     66 
     67 /* Translate input AC to TID */
     68 const TI_UINT8 WMEQosAcToTid[MAX_NUM_OF_AC] = { 0, 2, 4, 6 };
     69 
     70 /* Translate input TID to the other TID of the same AC */
     71 const TI_UINT32 WMEQosMateTid[MAX_NUM_OF_802_1d_TAGS] = { 3, 2, 1, 0, 5, 4, 7, 6 };
     72 
     73 /* Used to indicate no user priority is assigned for AC */
     74 #define INACTIVE_USER_PRIORITY 0xFF
     75 
     76 
     77 /********************************************************************************/
     78 /*						Internal functions prototypes.							*/
     79 /********************************************************************************/
     80 static void release_module(qosMngr_t *pQosMngr, TI_UINT32 initVec);
     81 static TI_STATUS verifyAndConfigTrafficParams(qosMngr_t *pQosMngr, TQueueTrafficParams *pQtrafficParams);
     82 static TI_STATUS verifyAndConfigQosParams(qosMngr_t *pQosMngr,TAcQosParams *pAcQosParams);
     83 static TI_STATUS getWMEInfoElement(qosMngr_t *pQosMngr,TI_UINT8 *pWMEie,TI_UINT8 *pLen);
     84 static TI_STATUS verifyWmeIeParams(qosMngr_t *pQosMngr,TI_UINT8 *pQosIeParams);
     85 static TI_STATUS updateACParams(qosMngr_t *pQosMngr,dot11_ACParameters_t *pAcParams);
     86 static TI_STATUS setWmeSiteParams(qosMngr_t *pQosMngr, TI_UINT8 *pQosIeParams);
     87 static void qosMngr_resetAdmCtrlParameters(TI_HANDLE hQosMngr);
     88 static TI_STATUS qosMngr_getCurrAcStatus(TI_HANDLE hQosMngr, OS_802_11_AC_UPSD_STATUS_PARAMS *pAcStatusParams);
     89 static void deleteTspecConfiguration(qosMngr_t *pQosMngr, TI_UINT8 acID);
     90 static void setNonQosAdmissionState(qosMngr_t *pQosMngr, TI_UINT8 acID);
     91 static void qosMngr_storeTspecCandidateParams (tspecInfo_t *pCandidateParams, OS_802_11_QOS_TSPEC_PARAMS *pTSPECParams, TI_UINT8 ac);
     92 static TI_STATUS qosMngr_SetPsRxStreaming (qosMngr_t *pQosMngr, TPsRxStreaming *pNewParams);
     93 
     94 /********************************************************************************
     95  *							qosMngr_create										*
     96  ********************************************************************************
     97 DESCRIPTION: QOS module creation function, called by the config mgr in creation phase.
     98 				performs the following:
     99 				- Allocate the QOS MNGR handle.
    100 INPUT:      hOs -			Handle to OS
    101 
    102 
    103 OUTPUT:
    104 
    105 RETURN:     Handle to the QOS MNGR module on success, NULL otherwise
    106 
    107 ************************************************************************/
    108 TI_HANDLE qosMngr_create(TI_HANDLE hOs)
    109 {
    110 	qosMngr_t		*pQosMngr = NULL;
    111 	TI_UINT32			initVec = 0;
    112 
    113 	if(!hOs)
    114 		return NULL;
    115 
    116 	/* allocating the WME object */
    117 	pQosMngr = os_memoryAlloc(hOs,sizeof(qosMngr_t));
    118 
    119 	if (pQosMngr == NULL)
    120 		return NULL;
    121 
    122     os_memoryZero (hOs, pQosMngr, sizeof(qosMngr_t));
    123 
    124 	initVec |= (1 << QOS_MNGR_INIT_BIT_LOCAL_VECTOR);
    125 
    126 	/* create admission control object */
    127 	pQosMngr->pTrafficAdmCtrl = trafficAdmCtrl_create(hOs);
    128 
    129 	if (pQosMngr->pTrafficAdmCtrl == NULL)
    130 	{
    131 		qosMngr_destroy(pQosMngr);
    132 		return NULL;
    133 	}
    134 
    135 	initVec |= (1 << QOS_MNGR_INIT_BIT_ADM_CTRL);
    136 
    137 	return(pQosMngr);
    138 }
    139 
    140 /************************************************************************
    141  *                        qosMngr_destroy							    *
    142  ************************************************************************
    143 DESCRIPTION: QOS MNGR module destroy function, called by the config mgr in
    144 				 the destroy phase
    145 				 performs the following:
    146 				-	Free all memory alocated by the module
    147 
    148 INPUT:      hQosMngr	-	QOS Manager handle.
    149 
    150 OUTPUT:
    151 
    152 RETURN:     TI_OK on success, TI_NOK otherwise
    153 
    154 ************************************************************************/
    155 TI_STATUS qosMngr_destroy(TI_HANDLE hQosMngr)
    156 {
    157 	TI_UINT32				   initVec;
    158 	qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
    159 
    160 	if (pQosMngr == NULL)
    161 		return TI_OK;
    162 
    163 	initVec = 0xFFFF;
    164     release_module(pQosMngr, initVec);
    165 
    166 	return TI_OK;
    167 }
    168 
    169 /***********************************************************************
    170  *                        release_module
    171  ***********************************************************************
    172 DESCRIPTION:	Called by the destroy function or by the create function (on failure)
    173 				Go over the vector, for each bit that is set, release the corresponding module.
    174 
    175 INPUT:      pQosMngr  -  QOS Mngr pointer.
    176 			initVec	  -	 Vector that contains a bit set for each module thah had been initiualized
    177 
    178 OUTPUT:
    179 
    180 RETURN:     TI_OK on success, TI_NOK otherwise
    181 ************************************************************************/
    182 static void release_module(qosMngr_t *pQosMngr, TI_UINT32 initVec)
    183 {
    184 
    185 	if (initVec & (1 << QOS_MNGR_INIT_BIT_ADM_CTRL))
    186 		trafficAdmCtrl_unload(pQosMngr->pTrafficAdmCtrl);
    187 
    188 	if (initVec & (1 << QOS_MNGR_INIT_BIT_LOCAL_VECTOR))
    189 		os_memoryFree(pQosMngr->hOs, pQosMngr, sizeof(qosMngr_t));
    190 
    191 	initVec = 0;
    192 }
    193 
    194 /************************************************************************
    195  *                        qosMngr_init		     						*
    196  ************************************************************************
    197 DESCRIPTION: QOS Manager module configuration function, called by the config
    198 				mgr in configuration phase
    199 				performs the following:
    200 				-	Reset & initiailzes local variables
    201 				-	Init the handles to be used by the module
    202 
    203 INPUT:      pStadHandles  - The driver modules handles
    204 
    205 
    206 OUTPUT:
    207 
    208 RETURN:     void
    209 ************************************************************************/
    210 void qosMngr_init (TStadHandlesList *pStadHandles)
    211 {
    212     qosMngr_t *pQosMngr = (qosMngr_t *)(pStadHandles->hQosMngr);
    213 
    214     /* init handles */
    215     pQosMngr->hOs              = pStadHandles->hOs;
    216     pQosMngr->hReport          = pStadHandles->hReport;
    217     pQosMngr->hSiteMgr         = pStadHandles->hSiteMgr;
    218     pQosMngr->hTWD             = pStadHandles->hTWD;
    219     pQosMngr->hTxCtrl          = pStadHandles->hTxCtrl;
    220     pQosMngr->hTxMgmtQ         = pStadHandles->hTxMgmtQ;
    221     pQosMngr->hMeasurementMngr = pStadHandles->hMeasurementMgr;
    222     pQosMngr->hSmeSm           = pStadHandles->hSme;
    223     pQosMngr->hCtrlData        = pStadHandles->hCtrlData;
    224 	pQosMngr->hEvHandler       = pStadHandles->hEvHandler;
    225 	pQosMngr->hXCCMgr          = pStadHandles->hXCCMngr;
    226 	pQosMngr->hTimer           = pStadHandles->hTimer;
    227     pQosMngr->hStaCap          = pStadHandles->hStaCap;
    228 
    229     pQosMngr->isConnected = TI_FALSE;
    230 }
    231 
    232 
    233 TI_STATUS qosMngr_SetDefaults (TI_HANDLE hQosMngr, QosMngrInitParams_t *pQosMngrInitParams)
    234 {
    235     qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
    236     TI_UINT8   acID, uTid;
    237     TI_STATUS  status;
    238 
    239     /* init params */
    240     pQosMngr->WMEEnable = pQosMngrInitParams->wmeEnable;
    241     pQosMngr->trafficAdmCtrlEnable = pQosMngrInitParams->trafficAdmCtrlEnable;
    242     pQosMngr->tagZeroConverHeader = pQosMngrInitParams->qosTagZeroConverHeader;
    243 	pQosMngr->qosPacketBurstEnable = pQosMngrInitParams->PacketBurstEnable;
    244 	pQosMngr->qosPacketBurstTxOpLimit = pQosMngrInitParams->PacketBurstTxOpLimit;
    245 	pQosMngr->desiredPsMode = pQosMngrInitParams->desiredPsMode;
    246     pQosMngr->bCwFromUserEnable = pQosMngrInitParams->bCwFromUserEnable;
    247     pQosMngr->uDesireCwMin = pQosMngrInitParams->uDesireCwMin;
    248     pQosMngr->uDesireCwMax = pQosMngrInitParams->uDesireCwMax;
    249 	pQosMngr->bEnableBurstMode = pQosMngrInitParams->bEnableBurstMode;
    250 
    251 
    252     pQosMngr->activeProtocol    = QOS_NONE;
    253     pQosMngr->WMESiteSupport    = TI_FALSE;
    254 
    255 	pQosMngr->desiredMaxSpLen	= pQosMngrInitParams->desiredMaxSpLen;
    256 
    257     pQosMngr->voiceTspecConfigured = TI_FALSE;
    258 	pQosMngr->videoTspecConfigured = TI_FALSE;
    259     pQosMngr->performTSPECRenegotiation = TI_FALSE;
    260 	pQosMngr->TSPECNegotiationResultCallb = NULL;
    261 	pQosMngr->TSPECNegotiationResultModule = NULL;
    262 
    263     /* No template has been set for UPSD */
    264     pQosMngr->QosNullDataTemplateUserPriority = 0xFF;
    265 
    266 	TWD_CfgBurstMode(pQosMngr->hTWD, pQosMngr->bEnableBurstMode);
    267 
    268 	/* configure admission control parameters */
    269 	qosMngr_resetAdmCtrlParameters(pQosMngr);
    270 
    271 	status = trafficAdmCtrl_config (pQosMngr->pTrafficAdmCtrl,
    272                                     pQosMngr->hTxMgmtQ,
    273                                     pQosMngr->hReport,
    274                                     pQosMngr->hOs,
    275                                     pQosMngr,
    276                                     pQosMngr->hCtrlData,
    277                                     pQosMngr->hXCCMgr,
    278                                     pQosMngr->hTimer,
    279                                     pQosMngr->hTWD,
    280                                     pQosMngr->hTxCtrl,
    281                                     &pQosMngrInitParams->trafficAdmCtrlInitParams);
    282 	if(status != TI_OK)
    283 		return TI_NOK;
    284 
    285 	/*
    286 	 * configure per AC traffic parameters
    287 	 */
    288     for(acID = FIRST_AC_INDEX;acID < MAX_NUM_OF_AC; acID++)
    289 	{
    290 		/*
    291 		 * setting ac traffic params for TrafficCategoryCfg (TNET configuration
    292 		 * The parameters can be changed in run-time, so they are saved in "init params"
    293 		 * for 'disconnecting' .
    294 		 * the parameters being set in setSite; "select" phase.
    295          */
    296 		pQosMngr->acParams[acID].QtrafficParams.queueID       = acID;
    297 		pQosMngr->acParams[acID].QtrafficParams.channelType   = CHANNEL_TYPE_EDCF;
    298 		pQosMngr->acParams[acID].QtrafficParams.tsid          = acID;
    299 		pQosMngr->acParams[acID].QtrafficParams.dot11EDCATableMSDULifeTime = 0;
    300 		pQosMngr->acParams[acID].QtrafficParams.psScheme      = PS_SCHEME_LEGACY;
    301 		pQosMngr->acParams[acID].QtrafficParams.ackPolicy     = pQosMngrInitParams->acAckPolicy[acID];
    302 		pQosMngr->acParams[acID].QtrafficParams.APSDConf[0]   = 0;
    303 		pQosMngr->acParams[acID].QtrafficParams.APSDConf[1]   = 0;
    304 
    305 
    306 		/*
    307 		 * Update the qTrafficInitParams as well
    308 		 */
    309 		os_memoryCopy(pQosMngr->hOs,
    310                       &pQosMngr->acParams[acID].QTrafficInitParams,
    311                       &pQosMngr->acParams[acID].QtrafficParams,
    312                       sizeof(TQueueTrafficParams));
    313 
    314 		/* will be config only after select */
    315 		verifyAndConfigTrafficParams(pQosMngr,&(pQosMngr->acParams[acID].QtrafficParams));
    316 
    317 		/*
    318 		 * setting ac QoS params for acQosParams (TNET configuration)
    319 		 * The parameters can be changed in run-time, so they are saved in "init params"
    320 		 * for 'disconnecting'.
    321 		 * the parameters being set in setSite; "select" phase.
    322          */
    323 		pQosMngr->acParams[acID].acQosParams.ac        = acID;
    324 		pQosMngr->acParams[acID].acQosParams.aifsn     = AIFS_DEF;
    325 		pQosMngr->acParams[acID].acQosParams.cwMax     = pQosMngr->uDesireCwMax;
    326 		pQosMngr->acParams[acID].acQosParams.cwMin     = pQosMngr->uDesireCwMin;
    327 		pQosMngr->acParams[acID].acQosParams.txopLimit = QOS_TX_OP_LIMIT_DEF;
    328 		pQosMngr->acParams[acID].msduLifeTimeParam     = pQosMngrInitParams->MsduLifeTime[acID];
    329 
    330 		/* The protocol is QOS_NONE. If Packet Burst is Enable,            */
    331 		/* then, the BE queue is configured to the TxOP Limit of Packet burst */
    332 		/* (that is, 3 ms) and the txopContinuation is set to  qosPacketBurstEnable  */
    333 		/* The protocol is QOS_NONE. If Packet Burst is Enable,            */
    334 		/* then, the BE queue is configured to the TxOP Limit of Packet burst */
    335 		/* (that is, 3 ms) and the txopContinuation is set to  qosPacketBurstEnable  */
    336 
    337 		if (acID == QOS_AC_BE)
    338 		{
    339 			if (pQosMngr->qosPacketBurstEnable==TI_TRUE)
    340 			{
    341 				pQosMngr->acParams[QOS_AC_BE].acQosParams.txopLimit = pQosMngr->qosPacketBurstTxOpLimit;
    342 			}
    343 			else
    344 			{
    345 				pQosMngr->acParams[QOS_AC_BE].acQosParams.txopLimit = QOS_TX_OP_LIMIT_DEF;
    346 			}
    347 		}
    348 
    349 		/*
    350 		 * Update the acQosInitParams as well
    351 		 */
    352 		os_memoryCopy(pQosMngr->hOs,
    353                       &pQosMngr->acParams[acID].acQosInitParams,
    354                       &pQosMngr->acParams[acID].acQosParams,
    355                       sizeof(TAcQosParams));
    356 
    357 		/* will be config only after select */
    358 		if(verifyAndConfigQosParams(hQosMngr,&(pQosMngr->acParams[acID].acQosParams)) != TI_OK)
    359 		{
    360 			TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_SetDefault: failed on verifyAndConfigQosParams\n");
    361 		}
    362 
    363         /*
    364 		 * setting ps mode per ac for protocol specific configuration.
    365 		 */
    366 
    367         /* validity check - allow to set the desired Ps mode per-AC to UPSD ONLY IF the station supports UPSD */
    368         if ((pQosMngrInitParams->desiredPsMode == PS_SCHEME_UPSD_TRIGGER) && (pQosMngrInitParams->desiredWmeAcPsMode[acID] == PS_SCHEME_UPSD_TRIGGER))
    369         {
    370 		        pQosMngr->acParams[acID].desiredWmeAcPsMode = PS_SCHEME_UPSD_TRIGGER;
    371         }
    372         else
    373         {
    374                pQosMngr->acParams[acID].desiredWmeAcPsMode = PS_SCHEME_LEGACY;
    375         }
    376 
    377 		pQosMngr->acParams[acID].currentWmeAcPsMode  = PS_SCHEME_LEGACY; /* default configuration is legacy PS  for all queues */
    378 
    379 		/* configure AC params to TxCtrl. */
    380 		txCtrlParams_setAcMsduLifeTime(pQosMngr->hTxCtrl, acID, pQosMngrInitParams->MsduLifeTime[acID]);
    381 		txCtrlParams_setAcAckPolicy(pQosMngr->hTxCtrl, acID, ACK_POLICY_LEGACY);
    382 
    383 		/* setting wme Ack Policy */
    384 		pQosMngr->acParams[acID].wmeAcAckPolicy = pQosMngrInitParams->acAckPolicy[acID];
    385 
    386 		/* Set admission state per AC for non-QoS and update the Tx module. */
    387 		setNonQosAdmissionState(pQosMngr, acID);
    388 	}
    389 
    390     /* Reset all PS-Rx-Streaming configurations */
    391     for (uTid = 0; uTid < MAX_NUM_OF_802_1d_TAGS; uTid++)
    392     {
    393         pQosMngr->aTidPsRxStreaming[uTid].uTid     = uTid;
    394         pQosMngr->aTidPsRxStreaming[uTid].bEnabled = TI_FALSE;
    395     }
    396     pQosMngr->uNumEnabledPsRxStreams = 0;
    397 
    398 	/* update Tx header convert mode */
    399 	txCtrlParams_setQosHeaderConverMode(pQosMngr->hTxCtrl, HDR_CONVERT_LEGACY);
    400 
    401 
    402     /* 802.11n BA session setting */
    403     for (uTid = 0; uTid < MAX_NUM_OF_802_1d_TAGS; ++uTid)
    404     {
    405         pQosMngr->aBaPolicy[uTid] = pQosMngrInitParams->aBaPolicy[uTid];
    406         pQosMngr->aBaInactivityTimeout[uTid] = pQosMngrInitParams->aBaInactivityTimeout[uTid];
    407     }
    408 
    409 
    410 
    411     TRACE0(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_config : QoS configuration complete!");
    412 
    413     return TI_OK;
    414 }
    415 
    416 /************************************************************************
    417  *                    qosMngr_resetAdmCtrlParameters	                *
    418  ************************************************************************
    419 DESCRIPTION: reset the admCtrl parameters
    420 
    421 INPUT:      hQosMngr	         -	Qos Manager handle.
    422 
    423 OUTPUT:
    424 
    425 RETURN:
    426 
    427 ************************************************************************/
    428 
    429 void qosMngr_resetAdmCtrlParameters(TI_HANDLE hQosMngr)
    430 {
    431 	TI_UINT8 acID;
    432     qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
    433 
    434 	/* reset admission control parameters */
    435 	for(acID = FIRST_AC_INDEX ; acID < MAX_NUM_OF_AC ; acID++)
    436 	{
    437 		pQosMngr->resourceMgmtTable.currentTspecInfo[acID].AC = (EAcTrfcType)acID;
    438 		pQosMngr->resourceMgmtTable.currentTspecInfo[acID].userPriority = INACTIVE_USER_PRIORITY; /* Setting invalid user Priority to prevent GET_TSPEC or DELETE */
    439 		pQosMngr->resourceMgmtTable.currentTspecInfo[acID].nominalMsduSize = 0;
    440         pQosMngr->resourceMgmtTable.currentTspecInfo[acID].minimumPHYRate = 0;
    441 		pQosMngr->resourceMgmtTable.currentTspecInfo[acID].meanDataRate = 0;
    442 		pQosMngr->resourceMgmtTable.currentTspecInfo[acID].surplausBwAllowance = 0;
    443 		pQosMngr->resourceMgmtTable.currentTspecInfo[acID].mediumTime = 0;
    444 		pQosMngr->resourceMgmtTable.currentTspecInfo[acID].UPSDFlag = 0;
    445 		pQosMngr->resourceMgmtTable.currentTspecInfo[acID].uMinimumServiceInterval = 0;
    446 		pQosMngr->resourceMgmtTable.currentTspecInfo[acID].uMaximumServiceInterval = 0;
    447 		pQosMngr->resourceMgmtTable.currentTspecInfo[acID].streamDirection = BI_DIRECTIONAL;
    448 		pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState = AC_NOT_ADMITTED;
    449 
    450 		pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].AC = (EAcTrfcType)acID;
    451 		pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].userPriority = INACTIVE_USER_PRIORITY; /* Setting invalid user Priority to prevent GET_TSPEC or DELETE */
    452 		pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].nominalMsduSize = 0;
    453         pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].minimumPHYRate = 0;
    454 		pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].meanDataRate = 0;
    455 		pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].surplausBwAllowance = 0;
    456 		pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].mediumTime = 0;
    457 		pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].UPSDFlag = 0;
    458 		pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].uMinimumServiceInterval = 0;
    459 		pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].uMaximumServiceInterval = 0;
    460 		pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].streamDirection = BI_DIRECTIONAL;
    461 		pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState = AC_NOT_ADMITTED;
    462 
    463 		pQosMngr->resourceMgmtTable.totalAllocatedMediumTime = 0;
    464 	}
    465 }
    466 
    467 
    468 /************************************************************************
    469  *                        qosMngr_disconnect   			                *
    470  ************************************************************************
    471 DESCRIPTION: the function is called upon driver disconnecting to reset all
    472              QOS parameters to init values.
    473 
    474 INPUT:      hQosMngr	-	Qos Manager handle.
    475             bDisconnect - True if full AP disconnection, False if roaming to another AP
    476 
    477 OUTPUT:
    478 
    479 RETURN:     TI_OK on success, TI_NOK otherwise
    480 
    481 ************************************************************************/
    482 TI_STATUS qosMngr_disconnect (TI_HANDLE hQosMngr, TI_BOOL bDisconnect)
    483 {
    484     qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
    485 	TI_UINT32  acID;
    486 	TI_STATUS  status;
    487 
    488 	if(hQosMngr == NULL)
    489 		return TI_OK;
    490 
    491 	pQosMngr->activeProtocol    = QOS_NONE;
    492     pQosMngr->WMESiteSupport    = TI_FALSE;
    493 
    494 	/* clear admission control params */
    495 	qosMngr_resetAdmCtrlParameters(pQosMngr);
    496 
    497 	trafficAdmCtrl_stop(pQosMngr->pTrafficAdmCtrl);
    498 
    499 	for(acID = FIRST_AC_INDEX;acID < MAX_NUM_OF_AC; acID++)
    500 	{
    501         /* Disable medium time events in TX */
    502 		txCtrlParams_setAdmissionCtrlParams(pQosMngr->hTxCtrl, acID, 0 , 0, TI_FALSE);
    503 
    504 		/* The protocol after disconnect is QOS_NONE. If Packet Burst is Enabled, the BE queue InitParams
    505 		    is configured to the TxOP Limit of Packet burst  (that is, 3 ms) and the
    506 		    txopContinuation is set to qosPacketBurstEnable. */
    507 
    508 		if (acID == QOS_AC_BE)
    509 		{
    510 			if (pQosMngr->qosPacketBurstEnable==TI_TRUE)
    511 			{
    512 				pQosMngr->acParams[QOS_AC_BE].acQosInitParams.txopLimit = pQosMngr->qosPacketBurstTxOpLimit;
    513 			}
    514 			else
    515 			{
    516 				pQosMngr->acParams[QOS_AC_BE].acQosInitParams.txopLimit = QOS_TX_OP_LIMIT_DEF;
    517 			}
    518 		}
    519 
    520 		/* Copy init traffic params (non-QoS defaults) to current traffic params, and config to HAL and TNET. */
    521        os_memoryCopy(pQosMngr->hOs,&(pQosMngr->acParams[acID].acQosParams),&(pQosMngr->acParams[acID].acQosInitParams),sizeof(TAcQosParams));
    522 
    523 		/*
    524 		 * Update the qTrafficInitParams as well
    525 		 */
    526 	   os_memoryCopy(pQosMngr->hOs,&(pQosMngr->acParams[acID].QtrafficParams),&(pQosMngr->acParams[acID].QTrafficInitParams),sizeof(TQueueTrafficParams));
    527 
    528 
    529 	   pQosMngr->acParams[acID].currentWmeAcPsMode  = PS_SCHEME_LEGACY; /* default configuration is legacy PS  for all queues */
    530 
    531 	   /* configure Ack-Policy to TxCtrl (working in Non-QoS method). */
    532 	   txCtrlParams_setAcAckPolicy(pQosMngr->hTxCtrl, acID, ACK_POLICY_LEGACY);
    533 
    534 	   /* Set admission state per AC for non-QoS and update the Tx module. */
    535 	   setNonQosAdmissionState(pQosMngr, acID);
    536 	}
    537 
    538 	/*
    539 	 * configure only BE AC
    540 	 * NOTE : this is done after "disconnect" or Init phase so those are defaults BE params
    541 	 */
    542 
    543 	/*
    544 	 * configureQueue
    545 	 */
    546 	status = verifyAndConfigTrafficParams(hQosMngr,&(pQosMngr->acParams[QOS_AC_BE].QtrafficParams));
    547 	if (status != TI_OK)
    548 	{
    549 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_setSite:failed to init NON_QOS Queue Traffic parameters!!!\n\n");
    550 			return status;
    551 	}
    552 
    553 	/*
    554 	 * configureAC
    555 	 */
    556 
    557 	status = verifyAndConfigQosParams(hQosMngr,&(pQosMngr->acParams[QOS_AC_BE].acQosParams));
    558 	if (status != TI_OK)
    559 	{
    560         TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_setSite:failed to init NON_QOS AC QoS parameters!!!\n\n");
    561         return status;
    562 	}
    563 
    564 	/* update Tx header convert mode */
    565 	txCtrlParams_setQosHeaderConverMode(pQosMngr->hTxCtrl, HDR_CONVERT_LEGACY);
    566 
    567     /* If disconnect (not roaming), reset all PS-Rx-Streaming configurations. */
    568     if (bDisconnect)
    569     {
    570         TI_UINT32  uTid;
    571         for (uTid = 0; uTid < MAX_NUM_OF_802_1d_TAGS; uTid++)
    572         {
    573             TPsRxStreaming *pCurrTidParams = &pQosMngr->aTidPsRxStreaming[uTid];
    574 
    575             if (pCurrTidParams->bEnabled)
    576             {
    577                 pCurrTidParams->bEnabled = TI_FALSE;
    578                 TWD_CfgPsRxStreaming (pQosMngr->hTWD, pCurrTidParams, NULL, NULL);
    579             }
    580         }
    581         pQosMngr->uNumEnabledPsRxStreams = 0;
    582     }
    583 
    584     /* Update our internal state */
    585     pQosMngr->isConnected = TI_FALSE;
    586 
    587     /* Mark that no Qos Null template is currently set into firmware */
    588     pQosMngr->QosNullDataTemplateUserPriority = 0xFF;
    589 
    590     pQosMngr->voiceTspecConfigured = TI_FALSE;
    591     pQosMngr->videoTspecConfigured = TI_FALSE;
    592 
    593     /* Mark that no Qos Null template is currently set into firmware */
    594     pQosMngr->QosNullDataTemplateUserPriority = 0xFF;
    595 
    596 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_disconnect : QoS disconnect complete!");
    597 
    598 #ifdef XCC_MODULE_INCLUDED
    599 	measurementMgr_stopTsMetrics(pQosMngr->hMeasurementMngr);
    600 #endif
    601 
    602 	return TI_OK;
    603 }
    604 
    605 
    606 /************************************************************************
    607  *                        qosMngr_connect   			                *
    608  ************************************************************************
    609 DESCRIPTION: the function is called upon driver connection to inform all
    610              the other modules about the voice mode
    611 
    612 INPUT:      hQosMngr	         -	Qos Manager handle.
    613 
    614 OUTPUT:
    615 
    616 RETURN:     TI_OK on success, TI_NOK otherwise
    617 
    618 ************************************************************************/
    619 
    620 TI_STATUS qosMngr_connect(TI_HANDLE hQosMngr)
    621 {
    622     qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
    623     psPollTemplate_t        psPollTemplate;
    624     TSetTemplate            templateStruct;
    625     QosNullDataTemplate_t   QosNullDataTemplate;
    626     TI_UINT8   acID,UPSDCnt=0;
    627 
    628    if (pQosMngr->isConnected == TI_TRUE)
    629    {
    630 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_connect : Already connected !!!\n");
    631      return TI_OK;
    632    }
    633 
    634     /* Send PsPoll template to HAL */
    635 
    636     templateStruct.ptr = (TI_UINT8 *)&psPollTemplate;
    637     templateStruct.type = PS_POLL_TEMPLATE;
    638     templateStruct.uRateMask = RATE_MASK_UNSPECIFIED;
    639     buildPsPollTemplate(pQosMngr->hSiteMgr, &templateStruct);
    640     TWD_CmdTemplate (pQosMngr->hTWD, &templateStruct, NULL, NULL);
    641 
    642     /* Update our internal state */
    643     pQosMngr->isConnected = TI_TRUE;
    644 
    645     /* Set Qos-Null Data template into firmware */
    646 	for(acID = FIRST_AC_INDEX;acID < MAX_NUM_OF_AC; acID++)
    647 	{
    648         /* Set QOS Null data template into the firmware (only if at least one AC is configured as UPSD )*/
    649         if (pQosMngr->acParams[acID].currentWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
    650         {
    651            UPSDCnt++;
    652            if ( pQosMngr->acParams[acID].apInitAdmissionState != ADMISSION_REQUIRED )
    653            {
    654             pQosMngr->QosNullDataTemplateUserPriority = WMEQosAcToTid[acID];
    655 
    656             templateStruct.ptr = (TI_UINT8 *)&QosNullDataTemplate;
    657             templateStruct.type = QOS_NULL_DATA_TEMPLATE;
    658             templateStruct.uRateMask = RATE_MASK_UNSPECIFIED;
    659             buildQosNullDataTemplate(pQosMngr->hSiteMgr, &templateStruct,pQosMngr->QosNullDataTemplateUserPriority);
    660             TWD_CmdTemplate (pQosMngr->hTWD, &templateStruct, NULL, NULL);
    661 
    662             TRACE2(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "setWmeSiteParams: Setting QOS Null data for UserPriority %d (belongs to AC %d)\n", WMEQosAcToTid[acID], acID);
    663 
    664             break; /* Only need to set ONE template, so after setting it, we can exit the loop */
    665            }
    666         }
    667 
    668     }
    669 
    670     /* If MAX_NUM_OF_AC (4) ACs were found as UPSD, but we still haven't configured any UP in the Qos Null data template, it must mean all ACs require admission - not valid*/
    671     if ((pQosMngr->QosNullDataTemplateUserPriority == 0xFF) && (UPSDCnt == MAX_NUM_OF_AC))
    672     {
    673       TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_connect : QOS Null Data template not set since all ACs require admission !!!\n");
    674 	}
    675 
    676     return TI_OK;
    677 }
    678 
    679 /**
    680  * \fn     qosMngr_SetBaPolicies
    681  * \brief  Set the BA session policies to the FW.
    682  *
    683  * \note
    684  * \param  hQosMngr	- Qos Manager handle.
    685  * \return None
    686  * \sa
    687  */
    688 void qosMngr_SetBaPolicies(TI_HANDLE hQosMngr)
    689 {
    690     qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
    691     TI_BOOL     b11nEnable;
    692     TI_UINT32   uTidIndex;
    693     paramInfo_t param;
    694 
    695     StaCap_IsHtEnable(pQosMngr->hStaCap, &b11nEnable);
    696 
    697     if (b11nEnable)
    698     {
    699 
    700         param.paramType = CTRL_DATA_CURRENT_BSSID_PARAM;
    701         ctrlData_getParam(pQosMngr->hCtrlData, &param);
    702 
    703         /* 802.11n BA session setting */
    704         for (uTidIndex = 0; uTidIndex < MAX_NUM_OF_802_1d_TAGS; ++uTidIndex)
    705         {
    706             if ((pQosMngr->aBaPolicy[uTidIndex] == BA_POLICY_INITIATOR) ||
    707                 (pQosMngr->aBaPolicy[uTidIndex] == BA_POLICY_INITIATOR_AND_RECEIVER))
    708             {
    709                 TWD_CfgSetBaInitiator (pQosMngr->hTWD,
    710                                        uTidIndex,
    711                                        TI_TRUE,
    712                                        param.content.ctrlDataCurrentBSSID,
    713                                        RX_QUEUE_WIN_SIZE,
    714                                        pQosMngr->aBaInactivityTimeout[uTidIndex]);
    715             }
    716 
    717             if ((pQosMngr->aBaPolicy[uTidIndex] == BA_POLICY_RECEIVER) ||
    718                 (pQosMngr->aBaPolicy[uTidIndex] == BA_POLICY_INITIATOR_AND_RECEIVER))
    719             {
    720                 TWD_CfgSetBaReceiver (pQosMngr->hTWD,
    721                                       uTidIndex,
    722                                       TI_TRUE,
    723                                       param.content.ctrlDataCurrentBSSID,
    724                                       RX_QUEUE_WIN_SIZE);
    725             }
    726         }
    727     }
    728 }
    729 
    730 
    731 /************************************************************************
    732  *                        qosMngr_evalSite					            *
    733  ************************************************************************
    734 DESCRIPTION: Evaluate the site for the selction algorithm
    735 			 In case the station is configure to work in UPSD mode
    736 			 prefer a site that support UPSD and return 1.
    737 			 All other case return 0.
    738 
    739 INPUT:      siteAPSDSupport - the UPSD capabilit of the site
    740 
    741 OUTPUT:
    742 
    743 RETURN:     1 - evaluation is good...
    744 			0 - evaluation can be better....
    745 
    746 ************************************************************************/
    747 TI_UINT8 qosMngr_evalSite(TI_HANDLE hQosMngr, TI_BOOL siteAPSDSupport)
    748 {
    749    qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
    750 
    751    if (pQosMngr->desiredPsMode == PS_SCHEME_UPSD_TRIGGER && siteAPSDSupport)
    752    {
    753 		return 1;
    754    }
    755 
    756    return 0;
    757 }
    758 
    759 TI_STATUS qosMngr_getParamsActiveProtocol(TI_HANDLE hQosMngr, EQosProtocol *actProt)
    760 {
    761     qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
    762 
    763 	if (pQosMngr == NULL)
    764 		return TI_NOK;
    765     *actProt = pQosMngr->activeProtocol;
    766     return TI_OK;
    767 }
    768 
    769 /************************************************************************
    770  *                        qosMngr_getACparams           			    *
    771  ************************************************************************
    772 DESCRIPTION: The function is an API for external modules to qet qos parameters
    773 
    774 INPUT:      hQosMngr	         -	Qos Manager handle.
    775             pParamInfo           -  qos parameters information.
    776 
    777 
    778 OUTPUT:
    779 
    780 RETURN:     TI_OK on success, TI_NOK otherwise
    781 
    782 ************************************************************************/
    783 
    784 TI_STATUS qosMngr_getParams(TI_HANDLE  hQosMngr,paramInfo_t *pParamInfo)
    785 {
    786 	EAcTrfcType           acID;
    787 	qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
    788 
    789 	if(pQosMngr == NULL)
    790 		return TI_NOK;
    791 
    792     TRACE1(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_getParams: %x\n", pParamInfo->paramType);
    793 
    794 	switch(pParamInfo->paramType)
    795 	{
    796 	case QOS_PACKET_BURST_ENABLE:
    797 		pParamInfo->content.qosPacketBurstEnb = pQosMngr->qosPacketBurstEnable;
    798 		break;
    799 	case QOS_MNGR_CURRENT_PS_MODE:
    800 		pParamInfo->content.currentPsMode = pQosMngr->currentPsMode;
    801 		break;
    802 
    803     case QOS_MNGR_ACTIVE_PROTOCOL:
    804        pParamInfo->content.qosSiteProtocol = pQosMngr->activeProtocol;
    805        break;
    806 
    807     case QOS_MNGR_GET_DESIRED_PS_MODE:
    808         pParamInfo->content.qosDesiredPsMode.uDesiredPsMode = pQosMngr->desiredPsMode;
    809 		for(acID = FIRST_AC_INDEX; acID < MAX_NUM_OF_AC ; acID++ )
    810 			pParamInfo->content.qosDesiredPsMode.uDesiredWmeAcPsMode[acID] = pQosMngr->acParams[acID].desiredWmeAcPsMode;
    811         break;
    812 
    813 	case QOS_MNGR_VOICE_RE_NEGOTIATE_TSPEC:
    814 	/* Check if voice call present. If so, store current TSPEC configuration */
    815 		pParamInfo->content.TspecConfigure.voiceTspecConfigure = (TI_UINT8)pQosMngr->voiceTspecConfigured;
    816         pParamInfo->content.TspecConfigure.videoTspecConfigure = (TI_UINT8)pQosMngr->videoTspecConfigured;
    817 
    818         TRACE1(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_getParams: QOS_MNGR_VOICE_RE_NEGOTIATE_TSPEC=%d\n", pQosMngr->voiceTspecConfigured);
    819 
    820 		if (pQosMngr->voiceTspecConfigured == TI_TRUE)
    821 		{
    822 			OS_802_11_QOS_TSPEC_PARAMS *pTspecParams;
    823 			tspecInfo_t *pConfiguredParams;
    824 
    825 			/* Store voice TSPEC params - must be configured */
    826 			pTspecParams = &pQosMngr->tspecRenegotiationParams[USER_PRIORITY_6];
    827 			pConfiguredParams = &pQosMngr->resourceMgmtTable.candidateTspecInfo[USER_PRIORITY_6];
    828 
    829 			pTspecParams->uUserPriority = pConfiguredParams->userPriority;
    830 			pTspecParams->uNominalMSDUsize = pConfiguredParams->nominalMsduSize;
    831 			pTspecParams->uMeanDataRate = pConfiguredParams->meanDataRate;
    832 			pTspecParams->uMinimumPHYRate = pConfiguredParams->minimumPHYRate;
    833 			pTspecParams->uSurplusBandwidthAllowance = pConfiguredParams->surplausBwAllowance;
    834 			pTspecParams->uAPSDFlag = pConfiguredParams->UPSDFlag;
    835 			pTspecParams->uMinimumServiceInterval = pConfiguredParams->uMinimumServiceInterval;
    836 			pTspecParams->uMaximumServiceInterval = pConfiguredParams->uMaximumServiceInterval;
    837 			pTspecParams->uMediumTime = pConfiguredParams->mediumTime;
    838 		}
    839 		else
    840 		{
    841 			pQosMngr->tspecRenegotiationParams[USER_PRIORITY_6].uUserPriority = MAX_USER_PRIORITY;
    842 		}
    843 
    844 		if (pQosMngr->videoTspecConfigured == TI_TRUE)
    845 		{
    846 			OS_802_11_QOS_TSPEC_PARAMS *pTspecParams;
    847 			tspecInfo_t *pConfiguredParams;
    848 
    849 			/* Store signalling TSPEC params if configured in user priority 4 */
    850 			pTspecParams = &pQosMngr->tspecRenegotiationParams[USER_PRIORITY_4];
    851 			pConfiguredParams = &pQosMngr->resourceMgmtTable.candidateTspecInfo[USER_PRIORITY_4];
    852 
    853 				pTspecParams->uUserPriority = pConfiguredParams->userPriority;
    854 				pTspecParams->uNominalMSDUsize = pConfiguredParams->nominalMsduSize;
    855 				pTspecParams->uMeanDataRate = pConfiguredParams->meanDataRate;
    856 				pTspecParams->uMinimumPHYRate = pConfiguredParams->minimumPHYRate;
    857 				pTspecParams->uSurplusBandwidthAllowance = pConfiguredParams->surplausBwAllowance;
    858 				pTspecParams->uAPSDFlag = pConfiguredParams->UPSDFlag;
    859 				pTspecParams->uMinimumServiceInterval = pConfiguredParams->uMinimumServiceInterval;
    860 				pTspecParams->uMaximumServiceInterval = pConfiguredParams->uMaximumServiceInterval;
    861 				pTspecParams->uMediumTime = pConfiguredParams->mediumTime;
    862 			}
    863 			else
    864 			{
    865 				pQosMngr->tspecRenegotiationParams[USER_PRIORITY_4].uUserPriority = MAX_USER_PRIORITY;
    866 		}
    867 		break;
    868 
    869 	case QOS_MNGR_AC_STATUS:
    870 		switch (qosMngr_getCurrAcStatus (hQosMngr,&pParamInfo->content.qosCurrentAcStatus))
    871 		{
    872    			case TI_OK:
    873       			return TI_OK;
    874 			case NOT_CONNECTED:
    875                 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "Not connected to an AP...\n");
    876 				break;
    877    			case NO_QOS_AP:
    878                 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "AP does not support QOS...\n");
    879       			break;
    880    			case TI_NOK:
    881                 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "Invalid parameter...\n");
    882       			break;
    883    			default:
    884                 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "Unknown return value...\n");
    885       			break;
    886    		}
    887 		return TI_NOK;
    888 
    889 	case QOS_MNGR_OS_TSPEC_PARAMS:
    890 
    891 		if( pParamInfo->content.qosTspecParameters.uUserPriority > MAX_USER_PRIORITY )
    892 		{
    893 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_getTspecParams: userPriority > 7 -> Ignore !!!\n");
    894 			return TI_NOK;
    895 		}
    896 
    897 		if(pQosMngr->isConnected == TI_FALSE)
    898 		{
    899 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_getTspecParams: Not connected - Ignoring request !!!\n");
    900 			return NOT_CONNECTED;
    901 		}
    902 
    903 		if(pQosMngr->activeProtocol == QOS_NONE)
    904 		{
    905 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_getTspecParams: Not connected to QOS AP - Ignoring reqeust !!!\n");
    906 			return NO_QOS_AP;
    907 		}
    908 
    909 		acID = (EAcTrfcType)WMEQosTagToACTable[pParamInfo->content.qosTspecParameters.uUserPriority];
    910 
    911 		/* check if signaling is already in process*/
    912 		if(pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState == AC_WAIT_ADMISSION)
    913 		{
    914 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_requestAdmission: AC = %d , TSPEC Signaling is in progress -> Ignoring request !!!\n",acID);
    915 			return TRAFIC_ADM_PENDING;
    916 		}
    917 
    918 	   /* check if UP is admitted or not */
    919 	   if(pQosMngr->resourceMgmtTable.currentTspecInfo[acID].userPriority != pParamInfo->content.qosTspecParameters.uUserPriority)
    920        {
    921 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_getTspecParams: user priority is not admitted. -> Ignore !!!\n");
    922 		 return USER_PRIORITY_NOT_ADMITTED;
    923 		}
    924 
    925 		pParamInfo->content.qosTspecParameters.uMeanDataRate = pQosMngr->resourceMgmtTable.currentTspecInfo[acID].meanDataRate;
    926 		pParamInfo->content.qosTspecParameters.uNominalMSDUsize = pQosMngr->resourceMgmtTable.currentTspecInfo[acID].nominalMsduSize;
    927 		pParamInfo->content.qosTspecParameters.uAPSDFlag  = pQosMngr->resourceMgmtTable.currentTspecInfo[acID].UPSDFlag;
    928 		pParamInfo->content.qosTspecParameters.uMinimumServiceInterval  = pQosMngr->resourceMgmtTable.currentTspecInfo[acID].uMinimumServiceInterval;
    929 		pParamInfo->content.qosTspecParameters.uMaximumServiceInterval  = pQosMngr->resourceMgmtTable.currentTspecInfo[acID].uMaximumServiceInterval;
    930 		pParamInfo->content.qosTspecParameters.uMinimumPHYRate  = pQosMngr->resourceMgmtTable.currentTspecInfo[acID].minimumPHYRate;
    931 		pParamInfo->content.qosTspecParameters.uSurplusBandwidthAllowance  = pQosMngr->resourceMgmtTable.currentTspecInfo[acID].surplausBwAllowance;
    932 		pParamInfo->content.qosTspecParameters.uMediumTime = pQosMngr->resourceMgmtTable.currentTspecInfo[acID].mediumTime;
    933 		break;
    934 
    935 	case QOS_MNGR_AP_QOS_PARAMETERS:  /* API GetAPQosParameters */
    936 		acID = (EAcTrfcType) pParamInfo->content.qosApQosParams.uAC;
    937 
    938 		if(acID > QOS_HIGHEST_AC_INDEX)
    939 		{
    940             TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_setParams :Error  trying to set invalid acId: %d param\n",pParamInfo->content.qosApQosParams.uAC);
    941 			return (PARAM_VALUE_NOT_VALID);
    942 		}
    943 		if(pQosMngr->isConnected == TI_FALSE)
    944 		{
    945             TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "Not connected to an AP...\n");
    946 			return NOT_CONNECTED;
    947 		}
    948 		if(pQosMngr->activeProtocol == QOS_NONE)
    949 		{
    950             TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "AP does not support QOS...\n");
    951 			return NO_QOS_AP;
    952 		}
    953 
    954 		pParamInfo->content.qosApQosParams.uAssocAdmissionCtrlFlag = pQosMngr->acParams[acID].apInitAdmissionState; /* admission flag */
    955 		pParamInfo->content.qosApQosParams.uAIFS = pQosMngr->acParams[acID].acQosParams.aifsn;
    956 		pParamInfo->content.qosApQosParams.uCwMin = (1 << pQosMngr->acParams[acID].acQosParams.cwMin)-1;
    957 		pParamInfo->content.qosApQosParams.uCwMax = (1 << pQosMngr->acParams[acID].acQosParams.cwMax)-1;
    958 		pParamInfo->content.qosApQosParams.uTXOPLimit = pQosMngr->acParams[acID].acQosParams.txopLimit << 5;
    959 
    960 		break;
    961 
    962     case QOS_MNGR_PS_RX_STREAMING:
    963         {
    964             TPsRxStreaming *pParams    = &pParamInfo->content.tPsRxStreaming;
    965             TI_UINT32       uTid       = pParams->uTid;
    966             TPsRxStreaming *pTidStream = &pQosMngr->aTidPsRxStreaming[uTid];
    967 
    968             os_memoryCopy (pQosMngr->hOs, (void *)pParams, (void *)pTidStream, sizeof(TPsRxStreaming));
    969         }
    970 		break;
    971 
    972 
    973 	default:
    974            TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_getParams Error: unknown paramType 0x%x!\n",pParamInfo->paramType);
    975 			return (PARAM_NOT_SUPPORTED);
    976 
    977 	}
    978 	return TI_OK;
    979 }
    980 
    981 /************************************************************************
    982  *                        qosMngr_setParams              			    *
    983  ************************************************************************
    984 DESCRIPTION: The function is an API for external modules to set qos parameters
    985 
    986 INPUT:      hQosMngr	         -	Qos Manager handle.
    987             pParamInfo           -  qos parameters information.
    988 
    989 
    990 OUTPUT:
    991 
    992 RETURN:     TI_OK on success, TI_NOK otherwise
    993 
    994 ************************************************************************/
    995 
    996 TI_STATUS qosMngr_setParams(TI_HANDLE  hQosMngr,paramInfo_t *pParamInfo)
    997 {
    998     qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
    999 	TTwdParamInfo		   param;
   1000 	EAcTrfcType           acID;
   1001 	TI_STATUS              status;
   1002 
   1003 	if(pQosMngr == NULL)
   1004 		return TI_NOK;
   1005 
   1006 	if(pParamInfo == NULL)
   1007 	{
   1008 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_setParams :Error trying to set NULL params!\n");
   1009 		return TI_NOK;
   1010 	}
   1011 
   1012 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_setParams: %x\n", pParamInfo->paramType);
   1013 
   1014 	switch(pParamInfo->paramType)
   1015 	{
   1016 
   1017 		case QOS_PACKET_BURST_ENABLE:
   1018 
   1019 			if (pParamInfo->content.qosPacketBurstEnb > QOS_PACKET_BURST_ENABLE_MAX)
   1020 				return (PARAM_VALUE_NOT_VALID);
   1021 
   1022 			/* No change */
   1023 			if (pParamInfo->content.qosPacketBurstEnb == pQosMngr->qosPacketBurstEnable)
   1024 				return TI_OK;
   1025 
   1026 			/* Update the qosPacketBurstEnable parameter */
   1027 			pQosMngr->qosPacketBurstEnable = pParamInfo->content.qosPacketBurstEnb;
   1028 
   1029 			/* Packet burst enable changed from F to T */
   1030 			if (pParamInfo->content.qosPacketBurstEnb == TI_TRUE)
   1031 			{
   1032 				/* Update the acTrafficInitParams of BE to the packet burst def*/
   1033 				pQosMngr->acParams[QOS_AC_BE].acQosInitParams.txopLimit = pQosMngr->qosPacketBurstTxOpLimit;
   1034 
   1035 				/* Update the acTrafficParams of BE and the hal to the packet burst def*/
   1036 				if (pQosMngr->activeProtocol == QOS_NONE)
   1037 				{
   1038 					pQosMngr->acParams[QOS_AC_BE].acQosParams.txopLimit = pQosMngr->qosPacketBurstTxOpLimit;
   1039 					/* verify the parameters and update the hal */
   1040 					status = verifyAndConfigQosParams(hQosMngr,&(pQosMngr->acParams[QOS_AC_BE].acQosParams));
   1041 					if(status != TI_OK)
   1042 						return status;
   1043 				}
   1044 			}
   1045 
   1046 			/* Packet burst enable changed from T to F*/
   1047 			else
   1048 			{
   1049 				/* Update the acTrafficInitParams of BE to the AC def*/
   1050 				pQosMngr->acParams[QOS_AC_BE].acQosInitParams.txopLimit = QOS_TX_OP_LIMIT_DEF;
   1051 
   1052 				/* Update the acTrafficParams of BE  and the hal to the AC def*/
   1053 				if (pQosMngr->activeProtocol == QOS_NONE)
   1054 				{
   1055 					pQosMngr->acParams[QOS_AC_BE].acQosParams.txopLimit = QOS_TX_OP_LIMIT_DEF;
   1056 					/* verify the parameters and update the hal */
   1057 					status = verifyAndConfigQosParams(hQosMngr,&(pQosMngr->acParams[QOS_AC_BE].acQosParams));
   1058 					if(status != TI_OK)
   1059 						return status;
   1060 				}
   1061 			}
   1062 			break;
   1063 
   1064 		case QOS_MNGR_SET_SITE_PROTOCOL:
   1065 			if(pParamInfo->content.qosSiteProtocol == QOS_WME)
   1066 				pQosMngr->WMESiteSupport = TI_TRUE;
   1067 			else
   1068 				pQosMngr->WMESiteSupport = TI_FALSE;
   1069 		break;
   1070 
   1071 
   1072     case QOS_MNGR_PS_RX_STREAMING:
   1073         return qosMngr_SetPsRxStreaming (pQosMngr, &pParamInfo->content.tPsRxStreaming);
   1074 
   1075 
   1076 	case QOS_MNGR_SET_OS_PARAMS:
   1077 		if((EAcTrfcType)pParamInfo->content.qosOsParams.acID > QOS_HIGHEST_AC_INDEX)
   1078 		{
   1079 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_setParams :Error  trying to set invalid acId: %d param\n",pParamInfo->content.qosOsParams.acID);
   1080 
   1081 			return (PARAM_VALUE_NOT_VALID);
   1082 		}
   1083 
   1084 		if(((PSScheme_e)pParamInfo->content.qosOsParams.PSDeliveryProtocol != PS_SCHEME_LEGACY) && ((PSScheme_e)pParamInfo->content.qosOsParams.PSDeliveryProtocol != PS_SCHEME_UPSD_TRIGGER))
   1085 		{
   1086 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_setParams :Error trying to set invalid PSDeliveryProtocol: %d param\n",pParamInfo->content.qosOsParams.PSDeliveryProtocol);
   1087 
   1088 			return (PARAM_VALUE_NOT_VALID);
   1089 		}
   1090 
   1091 		/* config tidConf */
   1092 		acID = (EAcTrfcType)pParamInfo->content.qosOsParams.acID;
   1093 
   1094 		if( (pParamInfo->content.qosOsParams.PSDeliveryProtocol != pQosMngr->acParams[acID].desiredWmeAcPsMode) &&
   1095 			(pQosMngr->isConnected == TI_TRUE) )
   1096 		{
   1097 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_setParams :Error  trying to set new PS protocol while connected");
   1098 
   1099 			return (PARAM_VALUE_NOT_VALID);
   1100 		}
   1101 
   1102 
   1103 		/* UPSD_FW open in upsd integration */
   1104 		/* set the current PS mode. In not connected state it is always Legacy since the currentPsMode only
   1105 		 update after connection */
   1106 		pQosMngr->acParams[acID].QtrafficParams.psScheme = pQosMngr->acParams[acID].currentWmeAcPsMode;
   1107 		pQosMngr->acParams[acID].msduLifeTimeParam = pParamInfo->content.qosOsParams.MaxLifeTime;
   1108 
   1109 		status = verifyAndConfigTrafficParams(pQosMngr,&(pQosMngr->acParams[acID].QtrafficParams));
   1110 		if(status != TI_OK)
   1111 			return status;
   1112 
   1113 		/* configure MSDU-Lifetime to TxCtrl. */
   1114 		txCtrlParams_setAcMsduLifeTime(pQosMngr->hTxCtrl, acID, pParamInfo->content.qosOsParams.MaxLifeTime);
   1115 
   1116 		/* synch psPoll mode with qosMngr */
   1117 		/* Update the PsMode parameter */
   1118 		pQosMngr->acParams[acID].desiredWmeAcPsMode = (PSScheme_e) pParamInfo->content.qosOsParams.PSDeliveryProtocol;
   1119 		break;
   1120 
   1121 	case QOS_MNGR_CURRENT_PS_MODE:
   1122 		if( (pQosMngr->activeProtocol == QOS_WME) && (pQosMngr->desiredPsMode == PS_SCHEME_UPSD_TRIGGER) && (pParamInfo->content.currentPsMode == PS_SCHEME_UPSD_TRIGGER) )
   1123 			pQosMngr->currentPsMode = PS_SCHEME_UPSD_TRIGGER;
   1124 		else
   1125 			pQosMngr->currentPsMode = PS_SCHEME_LEGACY;
   1126 		break;
   1127 
   1128     case QOS_MNGR_ADD_TSPEC_REQUEST:
   1129 		pQosMngr->TSPECNegotiationResultCallb = NULL;
   1130 		pQosMngr->TSPECNegotiationResultModule = NULL;
   1131 		status = qosMngr_requestAdmission(hQosMngr,  &pParamInfo->content.qosAddTspecRequest);
   1132 		switch (status)
   1133    		{
   1134    			case TI_OK:
   1135       			return TI_OK;
   1136 
   1137    			case TRAFIC_ADM_PENDING:
   1138       TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "Driver is still waiting for a response of previous request...\n");
   1139       			break;
   1140    			case AC_ALREADY_IN_USE:
   1141       TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "Other user priority from the same AC has already used a TSPEC...\n");
   1142       			break;
   1143    			case NOT_CONNECTED:
   1144       TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "Not connected to an AP...\n");
   1145       			break;
   1146    			case NO_QOS_AP:
   1147       TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "AP does not support QOS...\n");
   1148       			break;
   1149    			case TI_NOK:
   1150       TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "Invalid parameter...\n");
   1151       			break;
   1152    			default:
   1153       TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "Unknown return value...\n");
   1154       			break;
   1155    		}
   1156 		return TI_NOK;
   1157 
   1158 	case QOS_MNGR_RESEND_TSPEC_REQUEST:
   1159 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_setParams: QOS_MNGR_RESEND_TSPEC_REQUEST\n");
   1160 		pQosMngr->TSPECNegotiationResultCallb = (qosMngrCallb_t)pParamInfo->content.qosRenegotiateTspecRequest.callback;
   1161 		pQosMngr->TSPECNegotiationResultModule = pParamInfo->content.qosRenegotiateTspecRequest.handler;
   1162 		status = qosMngr_requestAdmission(hQosMngr,  &pQosMngr->tspecRenegotiationParams[USER_PRIORITY_6]);
   1163 
   1164 		if ((status == TI_OK) && (pQosMngr->tspecRenegotiationParams[USER_PRIORITY_4].uUserPriority != MAX_USER_PRIORITY))
   1165 		{
   1166 			status = qosMngr_requestAdmission(hQosMngr,  &pQosMngr->tspecRenegotiationParams[USER_PRIORITY_4]);
   1167 		}
   1168 		return (status);
   1169 
   1170     case QOS_MNGR_DEL_TSPEC_REQUEST:
   1171 		status = qosMngr_deleteAdmission(hQosMngr, &pParamInfo->content.qosDelTspecRequest);
   1172 		switch (status)
   1173    		{
   1174    			case TI_OK:
   1175       			return TI_OK;
   1176 			case NOT_CONNECTED:
   1177 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "Not connected to an AP...\n");
   1178 				break;
   1179    			case NO_QOS_AP:
   1180       TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "AP does not support QOS...\n");
   1181       			break;
   1182    			case TI_NOK:
   1183       TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "Invalid parameter...\n");
   1184       			break;
   1185    			default:
   1186       TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "Unknown return value...\n");
   1187       			break;
   1188    		}
   1189 		return TI_NOK;
   1190 
   1191 	case QOS_SET_RX_TIME_OUT:
   1192 		if (pParamInfo->content.rxTimeOut.UPSD == 0)
   1193 		{
   1194 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, " :Error trying to set invalid zero timeout for UPSD \n");
   1195 				return PARAM_VALUE_NOT_VALID;
   1196 
   1197 		}
   1198 		pQosMngr->rxTimeOut.psPoll = (TI_UINT16)pParamInfo->content.rxTimeOut.psPoll;
   1199 		pQosMngr->rxTimeOut.UPSD = (TI_UINT16)pParamInfo->content.rxTimeOut.UPSD;
   1200 
   1201 
   1202 		/* set RxTimeOut to FW */
   1203 		param.paramType	= TWD_RX_TIME_OUT_PARAM_ID;
   1204 		param.content.halCtrlRxTimeOut = pQosMngr->rxTimeOut;
   1205 		TWD_SetParam (pQosMngr->hTWD, &param);
   1206 		break;
   1207 
   1208 	case QOS_MNGR_VOICE_RE_NEGOTIATE_TSPEC:
   1209 
   1210 		if( pParamInfo->content.TspecConfigure.voiceTspecConfigure || pParamInfo->content.TspecConfigure.videoTspecConfigure)
   1211             pQosMngr->performTSPECRenegotiation = TI_TRUE;
   1212 		else
   1213 			pQosMngr->performTSPECRenegotiation = TI_FALSE;
   1214 
   1215 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_setParams: QOS_MNGR_VOICE_RE_NEGOTIATE_TSPEC=%d\n", pQosMngr->performTSPECRenegotiation);
   1216 	   break;
   1217 
   1218 	default:
   1219          TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_getParams Error: unknown paramType 0x%x!\n",pParamInfo->paramType);
   1220 			return (PARAM_NOT_SUPPORTED);
   1221 	}
   1222 
   1223 	return TI_OK;
   1224 
   1225 
   1226 }
   1227 
   1228 /************************************************************************
   1229  *                        verifyAndConfigTrafficParams  			    *
   1230  ************************************************************************
   1231 DESCRIPTION: The function verifies the parameters set by qosMngr to
   1232              the queue traffic params in whalCtrl to be configured to TNET.
   1233 
   1234 INPUT:      hQosMngr	         -	Qos Manager handle.
   1235             pAcTrafficParams     -  pointer to ac parameters.
   1236 
   1237 OUTPUT:
   1238 
   1239 RETURN:     TI_OK on success, TI_NOK otherwise
   1240 
   1241 ************************************************************************/
   1242 
   1243 static TI_STATUS verifyAndConfigTrafficParams(qosMngr_t *pQosMngr, TQueueTrafficParams *pQtrafficParams)
   1244 {
   1245     TTwdParamInfo		   param;
   1246     TQueueTrafficParams   queueTrafficParams;
   1247 
   1248 	if(pQtrafficParams->queueID > MAX_NUM_OF_AC - 1)
   1249     {
   1250 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "verifyAndConfigTrafficParams :Error  trying to set invalid queueID: %d param",pQtrafficParams->queueID);
   1251 
   1252 		return (PARAM_VALUE_NOT_VALID);
   1253 	}
   1254 
   1255 
   1256 	if(pQtrafficParams->channelType > MAX_CHANNEL_TYPE)
   1257 	{
   1258 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "verifyAndConfigTrafficParams :Error  trying to set invalid channelType: %d param",pQtrafficParams->channelType);
   1259 
   1260 		return (PARAM_VALUE_NOT_VALID);
   1261 
   1262 	}
   1263 
   1264     /* TBD */
   1265 	if(pQtrafficParams->tsid > AC_PARAMS_MAX_TSID)
   1266 	{
   1267 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "verifyAndConfigTrafficParams :Error  trying to set invalid tsid: %d param",pQtrafficParams->tsid);
   1268 
   1269 		return (PARAM_VALUE_NOT_VALID);
   1270 
   1271 	}
   1272 
   1273 	if(pQtrafficParams->psScheme > MAX_PS_SCHEME)
   1274 	{
   1275 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "verifyAndConfigTrafficParams :Error  trying to set invalid psScheme: %d param",pQtrafficParams->psScheme);
   1276 
   1277 		return (PARAM_VALUE_NOT_VALID);
   1278 	}
   1279 
   1280 	if(pQtrafficParams->ackPolicy > MAX_ACK_POLICY)
   1281 	{
   1282 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "verifyAndConfigTrafficParams :Error  trying to set invalid ackPolicy: %d param",pQtrafficParams->ackPolicy);
   1283 
   1284 		return (PARAM_VALUE_NOT_VALID);
   1285 	}
   1286 
   1287     queueTrafficParams = *pQtrafficParams;
   1288 
   1289 	param.paramType = TWD_QUEUES_PARAM_ID;
   1290 	/* set parameters */
   1291 	param.content.pQueueTrafficParams = &queueTrafficParams;
   1292 
   1293 	return TWD_SetParam (pQosMngr->hTWD, &param);
   1294 }
   1295 
   1296 /************************************************************************
   1297  *                        verifyAndConfigQosParams          		    *
   1298  ************************************************************************
   1299 DESCRIPTION: The function verifies the parameters set by qosMngr to
   1300              the AC Qos params in whalCtrl to be configured to TNET.
   1301 
   1302 INPUT:      hQosMngr	         -	Qos Manager handle.
   1303             pAcTrafficParams     -  pointer to ac parameters.
   1304 
   1305 OUTPUT:
   1306 
   1307 RETURN:     TI_OK on success, TI_NOK otherwise
   1308 
   1309 ************************************************************************/
   1310 
   1311 static TI_STATUS  verifyAndConfigQosParams(qosMngr_t *pQosMngr,TAcQosParams *pAcQosParams)
   1312 {
   1313 	TAcQosParams          acQosParams;
   1314 
   1315 	if(pAcQosParams->ac >  MAX_NUM_OF_AC - 1 )
   1316     {
   1317         TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "verifyAndConfigQosParams :Error  trying to set invalid ac : %d param",pAcQosParams->ac);
   1318         return (PARAM_VALUE_NOT_VALID);
   1319 	}
   1320     /*  verification is unnecessary due to limited range of pAcQosParams->aifsn data type (TI_UINT8)
   1321 	if(pAcQosParams->aifsn >  QOS_AIFS_MAX )
   1322     {
   1323         TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "verifyAndConfigQosParams :Error  trying to set invalid aifsn : %d param",pAcQosParams->aifsn);
   1324 
   1325        return (PARAM_VALUE_NOT_VALID);
   1326 	}
   1327     */
   1328 	if(pAcQosParams->cwMax >  QOS_CWMAX_MAX )
   1329     {
   1330         TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "verifyAndConfigQosParams :Error  trying to set invalid cwMax : %d param",pAcQosParams->cwMax);
   1331         return (PARAM_VALUE_NOT_VALID);
   1332 	}
   1333 
   1334 	if(pAcQosParams->cwMin >  QOS_CWMIN_MAX )
   1335     {
   1336         TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "verifyAndConfigQosParams :Error  trying to set invalid cwMax : %d param",pAcQosParams->cwMax);
   1337         return (PARAM_VALUE_NOT_VALID);
   1338 	}
   1339 
   1340 	if(pAcQosParams->txopLimit >  QOS_TX_OP_LIMIT_MAX )
   1341     {
   1342         TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "verifyAndConfigQosParams :Error  trying to set invalid txopLimit : %d param",pAcQosParams->txopLimit);
   1343         return (PARAM_VALUE_NOT_VALID);
   1344 	}
   1345 
   1346 	acQosParams.ac = pAcQosParams->ac;
   1347 	acQosParams.aifsn =  pAcQosParams->aifsn;
   1348 
   1349 	/* convert to TNET units */
   1350 	acQosParams.cwMax =  (1 << pAcQosParams->cwMax) - 1; /* CwMax = 2^CwMax - 1*/
   1351 	acQosParams.cwMin =  (1 << pAcQosParams->cwMin) - 1; /* CwMin = 2^CwMin - 1*/
   1352 	acQosParams.txopLimit =  pAcQosParams->txopLimit << 5; /* in us */
   1353 
   1354 	return TWD_CfgAcParams (pQosMngr->hTWD, &acQosParams, NULL, NULL);
   1355 }
   1356 
   1357 /************************************************************************
   1358  *                        qosMngr_GetWmeEnableFlag    			            *
   1359  ************************************************************************
   1360 DESCRIPTION: The function is called in order to get the WME enable flag
   1361              of qosMngr according to init file desired mode.
   1362              called from StaCap_GetHtCapabilitiesIe.
   1363 
   1364 INPUT:      hQosMngr	         -	Qos Manager handle.
   1365             bWmeEnable           -  return flag.
   1366 
   1367 OUTPUT:
   1368 
   1369 RETURN:     TI_OK on success, TI_NOK otherwise
   1370 
   1371 ************************************************************************/
   1372 TI_STATUS qosMngr_GetWmeEnableFlag(TI_HANDLE hQosMngr, TI_BOOL *bWmeEnable)
   1373 {
   1374    	qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
   1375 
   1376 	*bWmeEnable = pQosMngr->WMEEnable;
   1377 
   1378     return TI_OK;
   1379 }
   1380 
   1381 /************************************************************************
   1382  *                        qosMngr_selectActiveProtocol    			            *
   1383  ************************************************************************
   1384 DESCRIPTION: The function is called in order to set the active protocol in
   1385              the qosMngr according to site capabilities and desired mode.
   1386              called from SystemConfig.
   1387 
   1388 INPUT:
   1389 
   1390 OUTPUT:
   1391 
   1392 RETURN:     TI_OK on success, TI_NOK otherwise
   1393 
   1394 ************************************************************************/
   1395 TI_STATUS qosMngr_selectActiveProtocol(TI_HANDLE  hQosMngr)
   1396 {
   1397    	qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
   1398 
   1399 	/* decide qos protocol */
   1400 	/* NOTE: if both XCC qnd wme supported wme is chosen */
   1401 	if(pQosMngr->WMESiteSupport && pQosMngr->WMEEnable)
   1402 	{
   1403 		pQosMngr->activeProtocol = QOS_WME;
   1404 	}
   1405 	else
   1406     {
   1407 		pQosMngr->activeProtocol = QOS_NONE;
   1408 	}
   1409 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, " qosMngr_selectActiveProtocol() : pQosMngr->activeProtocol %d\n",pQosMngr->activeProtocol);
   1410 
   1411     return TI_OK;
   1412 }
   1413 
   1414 /************************************************************************
   1415  *                        qosMngr_setAcPsDeliveryMode    			            *
   1416  ************************************************************************
   1417 DESCRIPTION: The function is called in order to set the upsd/ps_poll according
   1418              to the desired and current upsd mode (per AC as well).
   1419              called from systemConfig.
   1420 
   1421 INPUT:
   1422 
   1423 OUTPUT:
   1424 
   1425 RETURN:     TI_OK on success, TI_NOK otherwise
   1426 
   1427 ************************************************************************/
   1428 TI_STATUS qosMngr_setAcPsDeliveryMode(TI_HANDLE  hQosMngr)
   1429 {
   1430    TI_UINT8 acID;
   1431    qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
   1432 
   1433 	/* in case the current PS mode is not UPSD  - the IE is empty */
   1434 	if(pQosMngr->currentPsMode == PS_SCHEME_UPSD_TRIGGER)
   1435 	{
   1436 		for(acID = FIRST_AC_INDEX;acID < MAX_NUM_OF_AC; acID++)
   1437 		{
   1438 			if(pQosMngr->acParams[acID].desiredWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
   1439 			{
   1440 				pQosMngr->acParams[acID].currentWmeAcPsMode = PS_SCHEME_UPSD_TRIGGER;
   1441 			}
   1442 		}
   1443     }
   1444 
   1445 	return TI_OK;
   1446 
   1447 }
   1448 
   1449 
   1450 /************************************************************************
   1451  *                        qosMngr_getQosCapabiltyInfeElement    			            *
   1452  ************************************************************************
   1453 DESCRIPTION: The function is called in order to build the Qos Capability
   1454 			 IE for the associatiomn request.
   1455 
   1456 INPUT:
   1457 
   1458 OUTPUT:
   1459 
   1460 RETURN:     TI_OK on success, TI_NOK otherwise
   1461 
   1462 ************************************************************************/
   1463 TI_STATUS qosMngr_getQosCapabiltyInfeElement(TI_HANDLE  hQosMngr, TI_UINT8 *pQosIe, TI_UINT32 *pLen)
   1464 {
   1465 	qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
   1466 	dot11_QOS_CAPABILITY_IE_t *dot11_QOS_CAPABILITY_IE = (dot11_QOS_CAPABILITY_IE_t *)pQosIe;
   1467 	TI_STATUS status = TI_OK;
   1468 	TI_UINT8	extraIeLen = 0;
   1469 
   1470 	if(pQosMngr->activeProtocol == QOS_WME)
   1471 	{
   1472 		dot11_QOS_CAPABILITY_IE->hdr[0]    = DOT11_QOS_CAPABILITY_ELE_ID;
   1473 		dot11_QOS_CAPABILITY_IE->hdr[1]   = DOT11_QOS_CAPABILITY_ELE_LEN;
   1474 
   1475 		/* The default configuration of QoS info Field is legacy PS for all ACs */
   1476 		dot11_QOS_CAPABILITY_IE->QosInfoField = 0;
   1477 
   1478 		/* in case the current PS mode is not UPSD  - the IE is empty */
   1479 		if(pQosMngr->currentPsMode == PS_SCHEME_UPSD_TRIGGER)
   1480 		{
   1481 			if(pQosMngr->acParams[QOS_AC_VO].currentWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
   1482 			{
   1483 				dot11_QOS_CAPABILITY_IE->QosInfoField |= (1 << AC_VO_APSD_FLAGS_SHIFT);
   1484 			}
   1485 			if(pQosMngr->acParams[QOS_AC_VI].currentWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
   1486 			{
   1487 				dot11_QOS_CAPABILITY_IE->QosInfoField |= (1 << AC_VI_APSD_FLAGS_SHIFT);
   1488 			}
   1489 
   1490 			if(pQosMngr->acParams[QOS_AC_BK].currentWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
   1491 			{
   1492 				dot11_QOS_CAPABILITY_IE->QosInfoField |= (1 << AC_BK_APSD_FLAGS_SHIFT);
   1493 			}
   1494 
   1495 			if(pQosMngr->acParams[QOS_AC_BE].currentWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
   1496 			{
   1497 				dot11_QOS_CAPABILITY_IE->QosInfoField |= (1 << AC_BE_APSD_FLAGS_SHIFT);
   1498 			}
   1499 
   1500 			dot11_QOS_CAPABILITY_IE->QosInfoField |= (((pQosMngr->desiredMaxSpLen) & MAX_SP_LENGTH_MASK) << MAX_SP_LENGTH_SHIFT);
   1501 
   1502             TRACE1(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "dot11_QOS_CAPABILITY_IE->QosInfoField = 0x%x\n",dot11_QOS_CAPABILITY_IE->QosInfoField);
   1503 		}
   1504 
   1505 		*pLen = dot11_QOS_CAPABILITY_IE->hdr[1] + sizeof(dot11_eleHdr_t);
   1506 
   1507 #ifdef XCC_MODULE_INCLUDED
   1508 		/* If required, add XCC info-elements to the association request packets */
   1509 		if (pQosMngr->performTSPECRenegotiation == TI_TRUE)
   1510 		{
   1511             TRACE0(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_getQosCapabiltyInfeElement: performing TSPEC renegotiation\n");
   1512 
   1513 			status = XCCMngr_getXCCQosIElements(pQosMngr->hXCCMgr, (pQosIe+(*pLen)), &extraIeLen);
   1514 		}
   1515 #endif
   1516 		*pLen += extraIeLen;
   1517 	}
   1518 	else
   1519 	{
   1520 		*pLen = 0;
   1521 	}
   1522 
   1523 	return status;
   1524 
   1525 }
   1526 /************************************************************************
   1527  *                        qosMngr_assocReqBuild    			            *
   1528  ************************************************************************
   1529 DESCRIPTION: The function is called in order to build the assocReq IE for
   1530              the current site QOS protocol.
   1531 
   1532 INPUT:      hQosMngr	         -	Qos Manager handle.
   1533 
   1534 OUTPUT:
   1535 
   1536 RETURN:     TI_OK on success, TI_NOK otherwise
   1537 
   1538 ************************************************************************/
   1539 
   1540 TI_STATUS qosMngr_assocReqBuild(TI_HANDLE  hQosMngr, TI_UINT8 *pQosIe, TI_UINT32 *pLen)
   1541 {
   1542     qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
   1543 	TI_STATUS		status;
   1544 	TI_UINT8 temp;
   1545 
   1546 
   1547 	if(pQosMngr == NULL)
   1548 	{
   1549 		*pLen = 0;
   1550 		return TI_OK;
   1551 	}
   1552 
   1553 	/* building assocReq frame */
   1554 	switch(pQosMngr->activeProtocol)
   1555 	{
   1556 	case QOS_WME:
   1557 		status = getWMEInfoElement(pQosMngr,pQosIe,&temp);
   1558 		if (status !=TI_OK)
   1559 		{
   1560 			*pLen = 0;
   1561 		}
   1562 		*pLen = temp;
   1563 		break;
   1564 
   1565 	case QOS_NONE:
   1566 			*pLen = 0;
   1567 			return TI_OK;
   1568 
   1569 	default:
   1570 			*pLen = 0;
   1571 		break;
   1572 	}
   1573 
   1574 	return TI_OK;
   1575 }
   1576 
   1577 /************************************************************************
   1578  *                        getWMEInfoElement     			            *
   1579  ************************************************************************
   1580 DESCRIPTION: building QOS_WME IE.
   1581 
   1582 INPUT:      hQosMngr	         -	Qos Manager handle.
   1583 
   1584 OUTPUT:
   1585 
   1586 RETURN:     TI_OK on success, TI_NOK otherwise
   1587 
   1588 ************************************************************************/
   1589 
   1590 static TI_STATUS getWMEInfoElement(qosMngr_t *pQosMngr,TI_UINT8 *pWMEie,TI_UINT8 *pLen)
   1591 {
   1592 	dot11_WME_IE_t *pDot11_WME_IE = (dot11_WME_IE_t *)pWMEie;
   1593 
   1594 	pDot11_WME_IE->hdr[0]         = DOT11_WME_ELE_ID;
   1595 	pDot11_WME_IE->hdr[1]        = DOT11_WME_ELE_LEN;
   1596 	pDot11_WME_IE->OUI[0]            = 0x00;
   1597 	pDot11_WME_IE->OUI[1]            = 0x50;
   1598 	pDot11_WME_IE->OUI[2]            = 0xf2;
   1599 	pDot11_WME_IE->OUIType           = dot11_WME_OUI_TYPE;
   1600 	pDot11_WME_IE->OUISubType        = dot11_WME_OUI_SUB_TYPE_IE;
   1601 	pDot11_WME_IE->version           = dot11_WME_VERSION;
   1602 	pDot11_WME_IE->ACInfoField       = 0;
   1603 
   1604 	if(pQosMngr->currentPsMode == PS_SCHEME_UPSD_TRIGGER)
   1605 	{
   1606 		if(pQosMngr->acParams[QOS_AC_VO].currentWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
   1607 		{
   1608 			pDot11_WME_IE->ACInfoField |= (1 << AC_VO_APSD_FLAGS_SHIFT);
   1609 		}
   1610 		if(pQosMngr->acParams[QOS_AC_VI].currentWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
   1611 		{
   1612 			pDot11_WME_IE->ACInfoField |= (1 << AC_VI_APSD_FLAGS_SHIFT);
   1613 		}
   1614 
   1615 		if(pQosMngr->acParams[QOS_AC_BK].currentWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
   1616 		{
   1617 			pDot11_WME_IE->ACInfoField |= (1 << AC_BK_APSD_FLAGS_SHIFT);
   1618 		}
   1619 
   1620 		if(pQosMngr->acParams[QOS_AC_BE].currentWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER)
   1621 		{
   1622 			pDot11_WME_IE->ACInfoField |= (1 << AC_BE_APSD_FLAGS_SHIFT);
   1623 		}
   1624 
   1625 		pDot11_WME_IE->ACInfoField |= (((pQosMngr->desiredMaxSpLen) & MAX_SP_LENGTH_MASK) << MAX_SP_LENGTH_SHIFT);
   1626 	}
   1627 
   1628 	*pLen = pDot11_WME_IE->hdr[1] + sizeof(dot11_eleHdr_t);
   1629 
   1630 	return TI_OK;
   1631 
   1632 }
   1633 
   1634 /************************************************************************
   1635  *                        qosMngr_checkTspecRenegResults		        *
   1636  ************************************************************************
   1637 DESCRIPTION: The function is called upon association response to check
   1638             Tspec renegotiation results
   1639 
   1640 INPUT:      hQosMngr	  -	Qos Manager handle.
   1641             assocRsp      -  pointer to received IE parameters received
   1642 			                 in association response.
   1643 OUTPUT:
   1644 
   1645 RETURN:     -
   1646 
   1647 ************************************************************************/
   1648 void qosMngr_checkTspecRenegResults(TI_HANDLE hQosMngr, assocRsp_t *assocRsp)
   1649 {
   1650 	tspecInfo_t	tspecInfo;
   1651 	qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
   1652 #ifdef XCC_MODULE_INCLUDED
   1653 	TI_UINT32 acCount;
   1654 #endif
   1655 
   1656 TRACE2(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_checkTspecRenegResults: performTSPECRenegotiation = %d, tspecParams received= %x\n",		pQosMngr->performTSPECRenegotiation, assocRsp->tspecVoiceParameters);
   1657 
   1658 	if (pQosMngr->performTSPECRenegotiation != TI_TRUE)
   1659 	{
   1660 		/* If no re-negotiation was requested, no parsing shall be done */
   1661 #ifdef XCC_MODULE_INCLUDED
   1662 		measurementMgr_disableTsMetrics(pQosMngr->hMeasurementMngr, MAX_NUM_OF_AC);
   1663 #endif
   1664 		return;
   1665 	}
   1666 
   1667 	if ( (assocRsp->tspecVoiceParameters == NULL) && (assocRsp->tspecSignalParameters == NULL) )
   1668 	{
   1669 		/* The renegotiation request was ignored - update QoS Manager database */
   1670 		qosMngr_setAdmissionInfo(pQosMngr, USER_PRIORITY_6,
   1671 								 &pQosMngr->resourceMgmtTable.candidateTspecInfo[USER_PRIORITY_6],
   1672 								 STATUS_TRAFFIC_ADM_REQUEST_REJECT);
   1673 
   1674 		if (pQosMngr->tspecRenegotiationParams[USER_PRIORITY_4].uUserPriority != MAX_USER_PRIORITY)
   1675 		{
   1676 			qosMngr_setAdmissionInfo(pQosMngr, USER_PRIORITY_4,
   1677 									 &pQosMngr->resourceMgmtTable.candidateTspecInfo[USER_PRIORITY_4],
   1678 									 STATUS_TRAFFIC_ADM_REQUEST_REJECT);
   1679 		}
   1680 #ifdef XCC_MODULE_INCLUDED
   1681         measurementMgr_disableTsMetrics(pQosMngr->hMeasurementMngr, MAX_NUM_OF_AC);
   1682 #endif
   1683 		return;
   1684 	}
   1685 
   1686 
   1687 	if (assocRsp->tspecVoiceParameters != NULL)
   1688 	{
   1689 	/* The renogitaion was performed - update QoS Manager database */
   1690 	pQosMngr->voiceTspecConfigured = TI_TRUE;
   1691 	trafficAdmCtrl_parseTspecIE(&tspecInfo, assocRsp->tspecVoiceParameters);
   1692 
   1693 	qosMngr_setAdmissionInfo(pQosMngr, tspecInfo.AC, &tspecInfo, STATUS_TRAFFIC_ADM_REQUEST_ACCEPT);
   1694 	}
   1695 
   1696 	if (assocRsp->tspecSignalParameters != NULL)
   1697 	{
   1698 		/* Signal TSPEC was re-negotiated as well */
   1699 		pQosMngr->videoTspecConfigured = TI_TRUE;
   1700 		trafficAdmCtrl_parseTspecIE(&tspecInfo, assocRsp->tspecSignalParameters);
   1701 		qosMngr_setAdmissionInfo(pQosMngr, tspecInfo.AC, &tspecInfo, STATUS_TRAFFIC_ADM_REQUEST_ACCEPT);
   1702 	}
   1703 	else if (pQosMngr->tspecRenegotiationParams[USER_PRIORITY_4].uUserPriority != MAX_USER_PRIORITY)
   1704 	{
   1705 		/* Signal TSPEC was not re-negotiated although requested to - ERROR */
   1706 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_setSite: Signal TSPEC was not re-negotiated while voice was \n");
   1707 		qosMngr_setAdmissionInfo(pQosMngr, USER_PRIORITY_4,
   1708 								 &pQosMngr->resourceMgmtTable.candidateTspecInfo[USER_PRIORITY_4],
   1709 								 STATUS_TRAFFIC_ADM_REQUEST_REJECT);
   1710 	}
   1711 
   1712 #ifdef XCC_MODULE_INCLUDED
   1713 	/* If XCC IEs are present for one or more ACs, update other modules with received parameters */
   1714 	for (acCount = 0; acCount < MAX_NUM_OF_AC; acCount++)
   1715 	{
   1716 		XCCMngr_setXCCQoSParams(pQosMngr->hXCCMgr, &assocRsp->XCCIEs[acCount], acCount);
   1717 	}
   1718 #endif
   1719 }
   1720 
   1721 
   1722 /************************************************************************
   1723  *                        qosMngr_setSite        			            *
   1724  ************************************************************************
   1725 DESCRIPTION: The function is called upon association response to set site
   1726              parameters.
   1727 
   1728 INPUT:      hQosMngr	  -	Qos Manager handle.
   1729             assocRsp      -  pointer to received IE parameters received
   1730 			                 in association response.
   1731 OUTPUT:
   1732 
   1733 RETURN:     TI_OK on success, TI_NOK otherwise
   1734 
   1735 ************************************************************************/
   1736 TI_STATUS qosMngr_setSite(TI_HANDLE hQosMngr, assocRsp_t *assocRsp)
   1737 {
   1738 	qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
   1739 	TI_STATUS  status;
   1740 
   1741 	if(hQosMngr == NULL)
   1742         return TI_NOK;
   1743 
   1744 	/* checking active protocol */
   1745 	switch(pQosMngr->activeProtocol)
   1746 	{
   1747 		case QOS_WME:
   1748 			/* verify QOS protocol received in association response */
   1749 			status = verifyWmeIeParams(pQosMngr, (TI_UINT8 *)assocRsp->WMEParams);
   1750 			if(status != TI_OK)
   1751 			{
   1752                 pQosMngr->activeProtocol = QOS_NONE;
   1753                 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_setSite: setting active protocol QOS_WME params with non QOS_WME IE params frame, setting active protocol back to NONE \n");
   1754                 return TI_NOK;
   1755 			}
   1756 
   1757             status = setWmeSiteParams(pQosMngr, (TI_UINT8 *)assocRsp->WMEParams);
   1758 			if (status != TI_OK)
   1759 			{
   1760                 pQosMngr->activeProtocol = QOS_NONE;
   1761                 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "Warning: qosMngr_setSite-> failed to set AC QOS_WME parameters!!! , setting active protocol back to NONE\n");
   1762                 return TI_NOK;
   1763 			}
   1764 			/* update siteMgr with recevied params */
   1765 			status = siteMgr_setWMEParamsSite(pQosMngr->hSiteMgr, assocRsp->WMEParams);
   1766 			if (status != TI_OK)
   1767 			{
   1768                 pQosMngr->activeProtocol = QOS_NONE;
   1769                 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_setSite:failed to init QOS_WME parameters!!! , setting active protocol back to NONE\n\n");
   1770                 return TI_NOK;
   1771 			}
   1772 
   1773 			break;
   1774 
   1775 	case QOS_NONE:
   1776 
   1777 			/* Check if the packet burst is enable, if it is,
   1778 			should update the BE parames and the hal to the packet burst def */
   1779 			if (pQosMngr->qosPacketBurstEnable == TI_TRUE)
   1780 			{
   1781 				/* Update the acTrafficInitParams of BE to the packet burst def*/
   1782 				pQosMngr->acParams[QOS_AC_BE].acQosInitParams.txopLimit = pQosMngr->qosPacketBurstTxOpLimit;
   1783 				/* Update the acTrafficParams of BE to the packet burst def*/
   1784 				pQosMngr->acParams[QOS_AC_BE].acQosInitParams.txopLimit = pQosMngr->qosPacketBurstTxOpLimit;
   1785 				/* verify the parameters and update the hal */
   1786 				status = verifyAndConfigQosParams(hQosMngr,&(pQosMngr->acParams[QOS_AC_BE].acQosParams));
   1787 				if (status != TI_OK)
   1788 				{
   1789 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_WARNING, "qosMngr_setSite:failed to init NON_QOS parameters!!!\n\n");
   1790 					return TI_NOK;
   1791 				}
   1792 			}
   1793 
   1794 		break;
   1795 
   1796 	default:
   1797 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_WARNING, "Warning: qosMngr_setSite NO active protocls To set \n");
   1798 		break;
   1799 	}
   1800 
   1801 	/* Check if TSPEC re-negotiation was performed, if so - look for results */
   1802 	qosMngr_checkTspecRenegResults(pQosMngr, assocRsp);
   1803 
   1804     return TI_OK;
   1805 
   1806 }
   1807 
   1808 /************************************************************************
   1809  *                        qosMngr_updateIEinfo     			            *
   1810  ************************************************************************
   1811 DESCRIPTION: The function is called upon run-time update of AC parameters
   1812 
   1813 INPUT:      hQosMngr	         -	Qos Manager handle.
   1814             pQosIeParams         -  pointer to received IE parameters received
   1815 			                        in beacon or probe response.
   1816 OUTPUT:
   1817 
   1818 RETURN:     TI_OK on success, TI_NOK otherwise
   1819 
   1820 ************************************************************************/
   1821 
   1822 void qosMngr_updateIEinfo(TI_HANDLE hQosMngr, TI_UINT8 *pQosIeParams, EQosProtocol qosSetProtocol)
   1823 {
   1824 	qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
   1825 	TI_STATUS  status;
   1826 	dot11_WME_PARAM_t		*pWMEparams;
   1827 
   1828 
   1829 
   1830 	if(pQosMngr == NULL)
   1831 		return;
   1832 
   1833 	/* checking active protocol */
   1834 	switch(pQosMngr->activeProtocol)
   1835 	{
   1836 	case QOS_WME:
   1837 		if(qosSetProtocol != QOS_WME)
   1838 			return;
   1839 
   1840 		if(pQosIeParams == NULL)
   1841 		{
   1842 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_WARNING, "Warning: updateIEinfo -> trying to update QOS_WME parameters with NULL site parameters!!!\n");
   1843 			return ;
   1844 		}
   1845 
   1846 		/* verify QOS protocol received in update IE */
   1847 		status = verifyWmeIeParams(pQosMngr,pQosIeParams);
   1848 		if(status != TI_OK)
   1849 		{
   1850 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_WARNING, "Warning: updateIEinfo ->upadting active protocl QOS_WME params with non QOS_WME IE params frame !!!\n");
   1851 			return ;
   1852 		}
   1853 		pWMEparams = (dot11_WME_PARAM_t *)pQosIeParams;
   1854 
   1855 		/* update AC params */
   1856 		status = updateACParams(pQosMngr,&(pWMEparams->WME_ACParameteres));
   1857 		if(status != TI_OK)
   1858 		{
   1859 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_WARNING, "updateIEinfo-> failed to update AC QOS_WME parameters!!!\n\n");
   1860 			return ;
   1861 		}
   1862 		break;
   1863 
   1864 
   1865 	default:
   1866 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_WARNING, "updateIEinfo-> trying to update qos paramters without active protocol !!!");
   1867 		break;
   1868 	}
   1869 }
   1870 
   1871 /************************************************************************
   1872  *                        qosMngr_buildTSPec       			            *
   1873  ************************************************************************/
   1874 TI_UINT32 qosMngr_buildTSPec(TI_HANDLE hQosMngr, TI_UINT32 user_priority, TI_UINT8 *pQosIe)
   1875 {
   1876 	qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
   1877 	OS_802_11_QOS_TSPEC_PARAMS *pPreservedParams;
   1878 	tspecInfo_t *pCandidateParams;
   1879 	TI_UINT32 ieLen;
   1880 
   1881 	pPreservedParams = &pQosMngr->tspecRenegotiationParams[user_priority];
   1882 	pCandidateParams = &pQosMngr->resourceMgmtTable.candidateTspecInfo[user_priority];
   1883 
   1884 	if (pPreservedParams->uUserPriority != MAX_USER_PRIORITY)
   1885 	{
   1886 		qosMngr_storeTspecCandidateParams (pCandidateParams, pPreservedParams, user_priority);
   1887 		pCandidateParams->trafficAdmState = AC_WAIT_ADMISSION;
   1888 
   1889 		trafficAdmCtrl_buildTSPec(pQosMngr->pTrafficAdmCtrl, pCandidateParams, pQosIe, &ieLen);
   1890 		return ieLen;
   1891 	}
   1892 	else
   1893 	{
   1894 		return 0;
   1895 	}
   1896 }
   1897 
   1898 /************************************************************************
   1899  *                        setWmeSiteParams        			            *
   1900  ************************************************************************
   1901 DESCRIPTION: The function is called upon association response to set QOS_WME site
   1902              parameters.
   1903 
   1904 INPUT:      hQosMngr	         -	Qos Manager handle.
   1905             pQosIeParams         -  pointer to received IE parameters received
   1906 			                        in association response.
   1907 OUTPUT:
   1908 
   1909 RETURN:     TI_OK on success, TI_NOK otherwise
   1910 
   1911 ************************************************************************/
   1912 
   1913 static TI_STATUS setWmeSiteParams(qosMngr_t *pQosMngr, TI_UINT8 *pQosIeParams)
   1914 {
   1915 	dot11_WME_PARAM_t  *pWMEparams = (dot11_WME_PARAM_t *)pQosIeParams;
   1916 	TI_STATUS           status;
   1917 	TI_UINT8               acID;
   1918 
   1919 	if (pQosIeParams == NULL)
   1920 	{
   1921 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_WARNING, "setWmeSiteParams: pQosIeParams is NULL !");
   1922 		return TI_NOK;
   1923 	}
   1924 
   1925 	for(acID = FIRST_AC_INDEX;acID < MAX_NUM_OF_AC; acID++)
   1926 	{
   1927 	   /* configure Ack-Policy to TxCtrl. */
   1928 		txCtrlParams_setAcAckPolicy(pQosMngr->hTxCtrl, acID, pQosMngr->acParams[acID].wmeAcAckPolicy);
   1929 	}
   1930 
   1931 	/* update AC params */
   1932 	pWMEparams->WME_ACParameteres.ACBEParametersRecord.TXOPLimit =
   1933 		ENDIAN_HANDLE_WORD(pWMEparams->WME_ACParameteres.ACBEParametersRecord.TXOPLimit);
   1934 	pWMEparams->WME_ACParameteres.ACBKParametersRecord.TXOPLimit =
   1935 		ENDIAN_HANDLE_WORD(pWMEparams->WME_ACParameteres.ACBKParametersRecord.TXOPLimit);
   1936 	pWMEparams->WME_ACParameteres.ACVIParametersRecord.TXOPLimit =
   1937 		ENDIAN_HANDLE_WORD(pWMEparams->WME_ACParameteres.ACVIParametersRecord.TXOPLimit);
   1938 	pWMEparams->WME_ACParameteres.ACVOParametersRecord.TXOPLimit =
   1939 		ENDIAN_HANDLE_WORD(pWMEparams->WME_ACParameteres.ACVOParametersRecord.TXOPLimit);
   1940 
   1941 	status = updateACParams(pQosMngr,&(pWMEparams->WME_ACParameteres));
   1942 	if(status != TI_OK)
   1943 		return status;
   1944 
   1945 	/* update Tx header convert mode */
   1946 	txCtrlParams_setQosHeaderConverMode(pQosMngr->hTxCtrl, HDR_CONVERT_QOS);
   1947 
   1948 	return TI_OK;
   1949 }
   1950 
   1951 
   1952 /************************************************************************
   1953  *                        updateACParams     			                *
   1954  ************************************************************************
   1955 DESCRIPTION: the function is called upon QOS protocol updates paramters
   1956              to TNET and TxCtrl object
   1957 
   1958 INPUT:      hQosMngr	         -	Qos Manager handle.
   1959 
   1960 OUTPUT:
   1961 
   1962 RETURN:     TI_OK on success, TI_NOK otherwise
   1963 
   1964 ************************************************************************/
   1965 
   1966 static TI_STATUS updateACParams(qosMngr_t *pQosMngr,dot11_ACParameters_t *pAcParams)
   1967 {
   1968 	TI_UINT8    acID,i;
   1969 	TI_STATUS   status;
   1970     dot11_QOS_AC_IE_ParametersRecord_t *pACParameteresRecord;
   1971     ETrafficAdmState *pAcTrafficAdmState;
   1972 
   1973 
   1974 	/*
   1975 	 * For QOS_WME: setting ac traffic params (edcf etc')
   1976 	 * in this order BE, BK , VI, VO .
   1977 	 */
   1978 
   1979     pACParameteresRecord = (dot11_QOS_AC_IE_ParametersRecord_t *)pAcParams;
   1980 
   1981 	for(i = FIRST_AC_INDEX; i < MAX_NUM_OF_AC; i++, pACParameteresRecord++)
   1982 	{
   1983         acID = (pACParameteresRecord->ACI_AIFSN & AC_PARAMS_ACI_MASK) >> 5;
   1984 
   1985         pAcTrafficAdmState = &(pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState);
   1986 
   1987 		/* edcf params */
   1988 
   1989 		pQosMngr->acParams[acID].acQosParams.ac        				   = acID;
   1990 		pQosMngr->acParams[acID].acQosParams.aifsn                     = pACParameteresRecord->ACI_AIFSN & AC_PARAMS_AIFSN_MASK;
   1991 		pQosMngr->acParams[acID].acQosParams.txopLimit                 = pACParameteresRecord->TXOPLimit;
   1992 
   1993         /* to use user setting ? */
   1994         if(TI_TRUE ==pQosMngr->bCwFromUserEnable)
   1995         {
   1996             pQosMngr->acParams[acID].acQosParams.cwMin                 = pQosMngr->uDesireCwMin;
   1997             pQosMngr->acParams[acID].acQosParams.cwMax                 = pQosMngr->uDesireCwMax;
   1998         }
   1999         else
   2000         {
   2001             pQosMngr->acParams[acID].acQosParams.cwMin                 = pACParameteresRecord->ECWmin_ECWmax & AC_PARAMS_CWMIN_MASK;
   2002             pQosMngr->acParams[acID].acQosParams.cwMax                 = (pACParameteresRecord->ECWmin_ECWmax & AC_PARAMS_CWMAX_MASK) >> 4;
   2003         }
   2004 
   2005 		status = verifyAndConfigQosParams(pQosMngr,&(pQosMngr->acParams[acID].acQosParams));
   2006 		if(status != TI_OK)
   2007 			return status;
   2008 
   2009 
   2010 		/* UPSD configuration */
   2011 		pQosMngr->acParams[acID].QtrafficParams.psScheme = pQosMngr->acParams[acID].currentWmeAcPsMode;
   2012 		status = verifyAndConfigTrafficParams(pQosMngr,&(pQosMngr->acParams[acID].QtrafficParams));
   2013 		if(status != TI_OK)
   2014 			return status;
   2015 
   2016 
   2017 		/* update admission state */
   2018 		if(pACParameteresRecord->ACI_AIFSN & AC_PARAMS_ACM_MASK)
   2019 		{
   2020 			pQosMngr->acParams[acID].apInitAdmissionState = ADMISSION_REQUIRED;
   2021 			*pAcTrafficAdmState = AC_NOT_ADMITTED;
   2022 
   2023 			txCtrlParams_setAcAdmissionStatus(pQosMngr->hTxCtrl, acID, ADMISSION_REQUIRED, AC_NOT_ADMITTED);
   2024 		}
   2025 		else
   2026 		{
   2027 			pQosMngr->acParams[acID].apInitAdmissionState = ADMISSION_NOT_REQUIRED;
   2028 			*pAcTrafficAdmState = AC_ADMITTED;
   2029 
   2030 			txCtrlParams_setAcAdmissionStatus(pQosMngr->hTxCtrl, acID, ADMISSION_NOT_REQUIRED, AC_ADMITTED);
   2031 		}
   2032 
   2033         /* If AC is admidtted and has enabled PS-Rx-Streamings, configure it to FW */
   2034         /* Note: this may occur after roaming */
   2035         if (*pAcTrafficAdmState == AC_ADMITTED)
   2036         {
   2037             TI_UINT32       uTid1       = WMEQosAcToTid[acID];
   2038             TI_UINT32       uTid2       = WMEQosMateTid[uTid1];
   2039             TPsRxStreaming *pTid1Params = &pQosMngr->aTidPsRxStreaming[uTid1];
   2040             TPsRxStreaming *pTid2Params = &pQosMngr->aTidPsRxStreaming[uTid2];
   2041 
   2042             if (pTid1Params->bEnabled)
   2043             {
   2044                 TWD_CfgPsRxStreaming (pQosMngr->hTWD, pTid1Params, NULL, NULL);
   2045             }
   2046             if (pTid2Params->bEnabled)
   2047             {
   2048                 TWD_CfgPsRxStreaming (pQosMngr->hTWD, pTid2Params, NULL, NULL);
   2049             }
   2050         }
   2051 	}
   2052 
   2053 	return TI_OK;
   2054 }
   2055 
   2056 
   2057 
   2058 /************************************************************************
   2059  *                        verifyWmeIeParams     			            *
   2060  ************************************************************************
   2061 DESCRIPTION: verify QOS_WME IE.
   2062 
   2063 INPUT:      hQosMngr	         -	Qos Manager handle.
   2064 
   2065 OUTPUT:
   2066 
   2067 RETURN:     TI_OK on success, TI_NOK otherwise
   2068 
   2069 ************************************************************************/
   2070 
   2071 static TI_STATUS verifyWmeIeParams(qosMngr_t *pQosMngr,TI_UINT8 *pQosIeParams)
   2072 {
   2073 	dot11_WME_IE_t  WMEie;
   2074 	TI_UINT8           Len;
   2075 	dot11_WME_IE_t  *pWMERecvIe = (dot11_WME_IE_t  *)pQosIeParams;
   2076 
   2077 	if(pQosIeParams == NULL)
   2078 	{
   2079 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_WARNING, ": pQosIeParams is NULL!! \n");
   2080 		return TI_NOK;
   2081 	}
   2082 
   2083 	/* get QOS_WME IE */
   2084 	getWMEInfoElement(pQosMngr,(TI_UINT8 *)&WMEie,(TI_UINT8 *)&Len);
   2085 
   2086 	if((WMEie.hdr[0] != pWMERecvIe->hdr[0] ) ||
   2087 	   (WMEie.OUI[0] != pWMERecvIe->OUI[0]) ||
   2088 	   (WMEie.OUI[1] != pWMERecvIe->OUI[1]) ||
   2089 	   (WMEie.OUI[2] != pWMERecvIe->OUI[2]) ||
   2090 	   (WMEie.OUIType != pWMERecvIe->OUIType))
   2091 	{
   2092 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_WARNING, ": QosIeParams mismatch (ID or OUI)!! \n");
   2093 		return TI_NOK;
   2094 	}
   2095 
   2096 
   2097     if(WMEie.version != pWMERecvIe->version)
   2098 TRACE2(pQosMngr->hReport, REPORT_SEVERITY_WARNING, ": Driver QOS_WME version: %d, Site QOS_WME version: %d\n", WMEie.version, pWMERecvIe->version);
   2099 
   2100 	return TI_OK;
   2101 }
   2102 
   2103 
   2104 /************************************************************************
   2105  *                        qosMngr_SetPsRxStreaming                      *
   2106  ************************************************************************
   2107 DESCRIPTION: Verify and configure a TID PS-Rx-Streaming setting
   2108 
   2109 INPUT:      pQosMngr	- Qos Manager handle.
   2110             pNewParams  - The new TID streaming parameters to configure
   2111 
   2112 OUTPUT:
   2113 
   2114 RETURN:     TI_OK on success, relevant failures otherwise
   2115 
   2116 ************************************************************************/
   2117 static TI_STATUS qosMngr_SetPsRxStreaming (qosMngr_t *pQosMngr, TPsRxStreaming *pNewParams)
   2118 {
   2119     TI_UINT32       uCurrTid            = pNewParams->uTid;
   2120     TI_UINT32       uAcId               = WMEQosTagToACTable[uCurrTid];
   2121     TPsRxStreaming  *pCurrTidParams     = &pQosMngr->aTidPsRxStreaming[uCurrTid];
   2122     TI_BOOL         bTidPrevEnabled     = pCurrTidParams->bEnabled;
   2123 
   2124 	/* Verify STA is connected to AP */
   2125 	if (pQosMngr->isConnected == TI_FALSE)
   2126 	{
   2127 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_SetPsRxStreaming: Not connected - Ignoring request !!!\n");
   2128 		return NOT_CONNECTED;
   2129 	}
   2130 
   2131 	/* Verify that the AP supports QOS_WME */
   2132 	if (pQosMngr->activeProtocol != QOS_WME)
   2133 	{
   2134 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_SetPsRxStreaming: Not connected to a QOS AP - Ignoring request !!!\n");
   2135 		return NO_QOS_AP;
   2136 	}
   2137 
   2138 	/* Check TID validity */
   2139 	if (uCurrTid > MAX_USER_PRIORITY)
   2140 	{
   2141 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "TID = %d > 7 !!!\n", uCurrTid);
   2142 		return PARAM_VALUE_NOT_VALID;
   2143 	}
   2144 
   2145 	/* Verify that the AC is admitted */
   2146 	if (pQosMngr->resourceMgmtTable.currentTspecInfo[uAcId].trafficAdmState != AC_ADMITTED)
   2147 	{
   2148 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_SetPsRxStreaming: AC = %d is not admitted -> Ignoring request !!!\n", uAcId);
   2149 		return USER_PRIORITY_NOT_ADMITTED;
   2150 	}
   2151 
   2152 	/* Verify that a disabled TID is not beeing disabled again */
   2153 	if (!pNewParams->bEnabled && !pCurrTidParams->bEnabled)
   2154 	{
   2155 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_SetPsRxStreaming: TID %d is already disabled -> Ignoring request !!!\n", uCurrTid);
   2156 		return PARAM_VALUE_NOT_VALID;
   2157 	}
   2158 
   2159 	/* Verify that the max number of enabled TIDs is not exeeded */
   2160 	if (pNewParams->bEnabled  &&
   2161         !pCurrTidParams->bEnabled  &&
   2162         pQosMngr->uNumEnabledPsRxStreams == MAX_ENABLED_PS_RX_STREAMS)
   2163 	{
   2164 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_SetPsRxStreaming: Can't have more than %d TIDs enabled -> Ignoring request !!!\n", MAX_ENABLED_PS_RX_STREAMS);
   2165 		return PARAM_VALUE_NOT_VALID;
   2166 	}
   2167 
   2168     /* Save the new streaming configuration of the TID */
   2169     os_memoryCopy (pQosMngr->hOs, (void *)pCurrTidParams, (void *)pNewParams, sizeof(TPsRxStreaming));
   2170 
   2171     /* Update the relevant AC which of its TIDs parameters to use (save pointer of desired TID) */
   2172 	if (pCurrTidParams->bEnabled)
   2173     {
   2174         if (!bTidPrevEnabled)
   2175         {
   2176             pQosMngr->uNumEnabledPsRxStreams++;
   2177         }
   2178     }
   2179 	else
   2180     {
   2181         pQosMngr->uNumEnabledPsRxStreams--;
   2182     }
   2183 
   2184     /* Send configuration update to the FW */
   2185     return TWD_CfgPsRxStreaming (pQosMngr->hTWD, pCurrTidParams, NULL, NULL);
   2186 }
   2187 
   2188 
   2189 /************************************************************************
   2190  *                    Admission Control Functions     		            *
   2191  ************************************************************************/
   2192 /************************************************************************
   2193  *                        qosMngr_requestAdmission     			        *
   2194  ************************************************************************
   2195 DESCRIPTION: This function is API function for TSPEC request.
   2196 
   2197 INPUT:      hQosMngr	         -	Qos Manager handle.
   2198 			addTspecParams		 -  The Tspec Parameters
   2199 OUTPUT:
   2200 
   2201 RETURN:     TI_OK on success, TI_NOK otherwise
   2202 
   2203 ************************************************************************/
   2204 
   2205 TI_STATUS qosMngr_requestAdmission(TI_HANDLE			hQosMngr,
   2206                                    OS_802_11_QOS_TSPEC_PARAMS *addTspecParams)
   2207 {
   2208 
   2209     qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
   2210 	TI_STATUS	status;
   2211 	TI_UINT8		acID;
   2212 
   2213 
   2214 	/* check if STA is already connected to AP */
   2215 	if(pQosMngr->isConnected == TI_FALSE)
   2216 	{
   2217 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_requestAdmission: Not connected - Ignoring request !!!\n");
   2218 		return NOT_CONNECTED;
   2219 	}
   2220 
   2221 	/* check if AP support QOS_WME */
   2222 	if(pQosMngr->activeProtocol != QOS_WME)
   2223 	{
   2224 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_requestAdmission: Not connected to a QOS AP - Ignoring request !!!\n");
   2225 		return NO_QOS_AP;
   2226 	}
   2227 
   2228 	/* check if Traffic Admission Control is enable */
   2229 	if(pQosMngr->trafficAdmCtrlEnable == TI_FALSE)
   2230 	{
   2231 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_requestAdmission: Admission-Control is disabled - Ignoring request !!!\n");
   2232 		return ADM_CTRL_DISABLE;
   2233 	}
   2234 
   2235 	/* check UP validity */
   2236 	if( addTspecParams->uUserPriority > MAX_USER_PRIORITY)
   2237 	{
   2238 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "uUserPriority = %d > 7 !!!\n",addTspecParams->uUserPriority);
   2239 		return TI_NOK;
   2240 	}
   2241 
   2242 	/* find acID from the user priority */
   2243 	acID = WMEQosTagToACTable[addTspecParams->uUserPriority];
   2244 
   2245 	/* check if signaling is already in process for this AC */
   2246 	if(pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState == AC_WAIT_ADMISSION)
   2247 	{
   2248 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_requestAdmission: AC = %d , signaling is in process -> Ignore Request !!!\n",acID);
   2249 		return TRAFIC_ADM_PENDING;
   2250 	}
   2251 
   2252 	/* check if AC is already admitted with other UP */
   2253 	if( (pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState == AC_ADMITTED) &&
   2254 		(pQosMngr->resourceMgmtTable.currentTspecInfo[acID].userPriority <= MAX_USER_PRIORITY) &&
   2255 		(pQosMngr->resourceMgmtTable.currentTspecInfo[acID].userPriority != addTspecParams->uUserPriority) )
   2256 	{
   2257 TRACE2(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_requestAdmission: AC = %d , another UP (%d) on same AC is already admited -> Ignoring request !!!\n",			acID, pQosMngr->resourceMgmtTable.currentTspecInfo[acID].userPriority);
   2258 		return AC_ALREADY_IN_USE;
   2259 	}
   2260 
   2261 	/* check msdu size validity */
   2262 	if( addTspecParams->uNominalMSDUsize > MAX_DATA_BODY_LENGTH)
   2263 	{
   2264 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "uNominalMSDUsize = %d > 2312, !!!\n",addTspecParams->uNominalMSDUsize);
   2265 		return TI_NOK;
   2266 	}
   2267 
   2268 	/* check PS mode validity */
   2269 	if( (addTspecParams->uAPSDFlag == PS_SCHEME_UPSD_TRIGGER) && (pQosMngr->currentPsMode != PS_SCHEME_UPSD_TRIGGER) )
   2270 	{
   2271 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "The STA's current status does not support UPSD -> Ignoring TSPEC request that has UPSD on !!!\n");
   2272 		return TI_NOK;
   2273 	}
   2274 
   2275 TRACE2(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_requestAdmission: UP = %d , acID = %d\n",addTspecParams->uUserPriority, acID);
   2276 
   2277 	/* set tspec parameters in candidateTspecInfo table */
   2278 	qosMngr_storeTspecCandidateParams (&(pQosMngr->resourceMgmtTable.candidateTspecInfo[acID]),
   2279 										addTspecParams, (TI_UINT8)acID);
   2280 
   2281 	/* Perhaps this should be done only if the request was successfully sent */
   2282 	if (acID == QOS_AC_VO)
   2283 	{
   2284 		pQosMngr->voiceTspecConfigured = TI_TRUE;
   2285 	}
   2286 
   2287 	if (acID == QOS_AC_VI)
   2288 	{
   2289 		pQosMngr->videoTspecConfigured = TI_TRUE;
   2290 	}
   2291 
   2292 	/* call TrafficAdmCtrl API function for the signaling proccess */
   2293 	status = trafficAdmCtrl_startAdmRequest(pQosMngr->pTrafficAdmCtrl, &(pQosMngr->resourceMgmtTable.candidateTspecInfo[acID]));
   2294 
   2295 	if(status == TI_OK)
   2296 	{
   2297 		/* request transmitted TI_OK */
   2298 		pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState = AC_WAIT_ADMISSION;
   2299 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_requestAdmission: UP = %d , request TI_OK !!!\n",addTspecParams->uUserPriority);
   2300 	}
   2301 	else
   2302 	{
   2303 		/* reaquest not transmitted TI_OK */
   2304 		pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState = AC_NOT_ADMITTED;
   2305 TRACE2(pQosMngr->hReport, REPORT_SEVERITY_WARNING, "qosMngr_requestAdmission: UP = %d , request  NOT TI_OK status=%d!!!\n",addTspecParams->uUserPriority, status);
   2306 		return TI_NOK;
   2307 	}
   2308 
   2309 	return status;
   2310 }
   2311 
   2312 /************************************************************************
   2313  *                        qosMngr_deleteAdmission     		            *
   2314  ************************************************************************
   2315 DESCRIPTION: This function is API fuunction for tspec delete.
   2316 
   2317 INPUT:      hQosMngr	         -	Qos Manager handle.
   2318 			delAdmissionParams	 -
   2319 OUTPUT:
   2320 
   2321 RETURN:     TI_OK on success, TI_NOK otherwise
   2322 
   2323 ************************************************************************/
   2324 
   2325 TI_STATUS qosMngr_deleteAdmission(TI_HANDLE hQosMngr, OS_802_11_QOS_DELETE_TSPEC_PARAMS *delAdmissionParams)
   2326 {
   2327 
   2328     qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
   2329 	TI_UINT8		acID;
   2330 
   2331 	/* check UP validity */
   2332 	if( delAdmissionParams->uUserPriority > MAX_USER_PRIORITY )
   2333 	{
   2334 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_deleteAdmission: userPriority > 7 -> Ignore !!!");
   2335 		return TI_NOK;
   2336 	}
   2337 
   2338 	/* check if STA is already connected to AP */
   2339 	if(pQosMngr->isConnected == TI_FALSE)
   2340 	{
   2341 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_deleteAdmission: pQosMngr->connected == TI_FALSE -> Ignore !!!");
   2342 		return NOT_CONNECTED;
   2343 	}
   2344 
   2345 	/* check if AP support QOS_WME */
   2346 	if(pQosMngr->activeProtocol != QOS_WME)
   2347 	{
   2348 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_deleteAdmission: activeProtocol != QOS_WME -> Ignore !!!");
   2349 		return NO_QOS_AP;
   2350 	}
   2351 
   2352 	/* find acID from the user priority */
   2353 	acID = WMEQosTagToACTable[delAdmissionParams->uUserPriority];
   2354 
   2355 	/* check if tspec is already addmited for this AC */
   2356 	if(pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState != AC_ADMITTED)
   2357 	{
   2358 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_deleteAdmission: AC is not ADMITED -> Ignore !!!");
   2359 		return TI_NOK;
   2360 	}
   2361 
   2362 	/* check if AC is already admited with the same UP */
   2363 	if(pQosMngr->resourceMgmtTable.currentTspecInfo[acID].userPriority != delAdmissionParams->uUserPriority)
   2364 	{
   2365 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_deleteAdmission: user priority is invalid. -> Ignore !!!\n");
   2366 		return USER_PRIORITY_NOT_ADMITTED;
   2367 	}
   2368 
   2369 	/* check if signaling is already in procces for this AC */
   2370 	if(pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState == AC_WAIT_ADMISSION)
   2371 	{
   2372 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_deleteAdmission: AC is under negotiation -> Ignore !!!");
   2373 		return TRAFIC_ADM_PENDING;
   2374 	}
   2375 
   2376 
   2377 
   2378 	/* call TrafficAdmCtrl API function for the delete tspec */
   2379 	trafficAdmCtrl_sendDeltsFrame(pQosMngr->pTrafficAdmCtrl, &(pQosMngr->resourceMgmtTable.currentTspecInfo[acID]),
   2380 										(TI_UINT8)delAdmissionParams->uReasonCode );
   2381 
   2382 
   2383 	deleteTspecConfiguration(pQosMngr, acID);
   2384 
   2385 	return TI_OK;
   2386 
   2387 }
   2388 /************************************************************************
   2389  *                        deleteTspecConfiguration     		            *
   2390  ************************************************************************
   2391 DESCRIPTION: configure the driver and FW to default configuration after
   2392 			 tspec deletion.
   2393 
   2394 INPUT:      hQosMngr	             - Qos Manager handle.
   2395 			acID					 - the AC of the Tspec to delete
   2396 OUTPUT:
   2397 
   2398 RETURN:     TI_OK on success, TI_NOK otherwise
   2399 
   2400 ************************************************************************/
   2401 
   2402 static void deleteTspecConfiguration(qosMngr_t *pQosMngr, TI_UINT8 acID)
   2403 {
   2404 	paramInfo_t param;
   2405 
   2406     /* Zero Tspec parameters */
   2407     pQosMngr->resourceMgmtTable.currentTspecInfo[acID].nominalMsduSize = 0;
   2408     pQosMngr->resourceMgmtTable.currentTspecInfo[acID].minimumPHYRate = 0;
   2409     pQosMngr->resourceMgmtTable.currentTspecInfo[acID].meanDataRate = 0;
   2410     pQosMngr->resourceMgmtTable.currentTspecInfo[acID].surplausBwAllowance = 0;
   2411     pQosMngr->resourceMgmtTable.currentTspecInfo[acID].mediumTime = 0;
   2412     pQosMngr->resourceMgmtTable.currentTspecInfo[acID].UPSDFlag = 0;
   2413     pQosMngr->resourceMgmtTable.currentTspecInfo[acID].uMinimumServiceInterval = 0;
   2414     pQosMngr->resourceMgmtTable.currentTspecInfo[acID].uMaximumServiceInterval = 0;
   2415     pQosMngr->resourceMgmtTable.currentTspecInfo[acID].streamDirection = BI_DIRECTIONAL;
   2416 
   2417 	/* update total medium time */
   2418 	pQosMngr->resourceMgmtTable.totalAllocatedMediumTime -= pQosMngr->resourceMgmtTable.currentTspecInfo[acID].mediumTime;
   2419 
   2420 	/* disable TSRS for this ac */
   2421 	param.content.txDataQosParams.acID = acID;
   2422 	param.content.txDataQosParams.tsrsArrLen = 0;
   2423 	param.paramType = CTRL_DATA_TSRS_PARAM;
   2424 	ctrlData_setParam(pQosMngr->hCtrlData, &param);
   2425 
   2426 	/* stop TS metrix for this ac */
   2427 #ifdef XCC_MODULE_INCLUDED
   2428 	measurementMgr_disableTsMetrics(pQosMngr->hMeasurementMngr, acID);
   2429 #endif
   2430 
   2431 	/* update medium time and rate adaptation event only when init admission bit was 0 */
   2432 	if( pQosMngr->acParams[acID].apInitAdmissionState == ADMISSION_REQUIRED )
   2433 	{
   2434 		/* update currentTspecInfo parameters */
   2435 		pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState = AC_NOT_ADMITTED;
   2436 
   2437 		/* set params to TX */
   2438 		txCtrlParams_setAdmissionCtrlParams(pQosMngr->hTxCtrl,
   2439 									acID,
   2440 									pQosMngr->resourceMgmtTable.currentTspecInfo[acID].mediumTime ,
   2441 									pQosMngr->resourceMgmtTable.currentTspecInfo[acID].minimumPHYRate, TI_FALSE);
   2442 	}
   2443 	else
   2444 	{
   2445 		pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState = AC_ADMITTED;
   2446 	}
   2447 
   2448     /* After we have updated the TxCtrl with the new status of the UP, we can zero the userPriority field */
   2449     pQosMngr->resourceMgmtTable.currentTspecInfo[acID].userPriority = INACTIVE_USER_PRIORITY;
   2450 
   2451 	/* set PS mode according to the PS mode from the association */
   2452     /* restore the current Ps mode per AC to UPSD ONLY IF both the station and AP support UPSD */
   2453     if ((pQosMngr->currentPsMode == PS_SCHEME_UPSD_TRIGGER) && (pQosMngr->acParams[acID].desiredWmeAcPsMode == PS_SCHEME_UPSD_TRIGGER))
   2454     {
   2455 	  pQosMngr->acParams[acID].currentWmeAcPsMode = PS_SCHEME_UPSD_TRIGGER;
   2456     }
   2457     else
   2458     {
   2459 	  pQosMngr->acParams[acID].currentWmeAcPsMode = PS_SCHEME_LEGACY;
   2460     }
   2461 
   2462 	if(acID == QOS_AC_VO)
   2463 	{
   2464 		pQosMngr->voiceTspecConfigured = TI_FALSE;
   2465 	}
   2466 
   2467 	if (acID == QOS_AC_VI)
   2468 	{
   2469 		pQosMngr->videoTspecConfigured = TI_FALSE;
   2470     }
   2471 
   2472 	/* UPSD_FW - open comment in UPSD FW integration */
   2473 
   2474 	/* UPSD configuration */
   2475 	pQosMngr->acParams[acID].QtrafficParams.psScheme = pQosMngr->acParams[acID].currentWmeAcPsMode;
   2476 	verifyAndConfigTrafficParams(pQosMngr,&(pQosMngr->acParams[acID].QtrafficParams));
   2477 
   2478     /* If the AC is not admitted, disable its TIDs' PS-Streamings if enabled */
   2479     if (pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState == AC_NOT_ADMITTED)
   2480     {
   2481         TI_UINT32       uTid1       = WMEQosAcToTid[acID];
   2482         TI_UINT32       uTid2       = WMEQosMateTid[uTid1];
   2483         TPsRxStreaming *pTid1Params = &pQosMngr->aTidPsRxStreaming[uTid1];
   2484         TPsRxStreaming *pTid2Params = &pQosMngr->aTidPsRxStreaming[uTid2];
   2485 
   2486         if (pTid1Params->bEnabled)
   2487         {
   2488             pTid1Params->bEnabled = TI_FALSE;
   2489             TWD_CfgPsRxStreaming (pQosMngr->hTWD, pTid1Params, NULL, NULL);
   2490             pQosMngr->uNumEnabledPsRxStreams--;
   2491         }
   2492         if (pTid2Params->bEnabled)
   2493         {
   2494             pTid2Params->bEnabled = TI_FALSE;
   2495             TWD_CfgPsRxStreaming (pQosMngr->hTWD, pTid2Params, NULL, NULL);
   2496             pQosMngr->uNumEnabledPsRxStreams--;
   2497         }
   2498     }
   2499 }
   2500 
   2501 /*-----------------------------------------------------------------------------
   2502 Routine Name: qosMngr_sendUnexpectedTSPECResponse
   2503 Routine Description: send event to user application, informing of unexpected TSPEC response
   2504 					 which might imply loss of UPSD mode synch between AP and STA
   2505 Arguments: pTspecInfo - contains unexpected TSPEC response information
   2506 Return Value:
   2507 -----------------------------------------------------------------------------*/
   2508 TI_STATUS qosMngr_sendUnexpectedTSPECResponseEvent(TI_HANDLE	hQosMngr,
   2509 								   tspecInfo_t	*pTspecInfo)
   2510 {
   2511 	OS_802_11_QOS_TSPEC_PARAMS addtsReasonCode;
   2512     qosMngr_t *pQosMngr =	(qosMngr_t *)hQosMngr;
   2513 
   2514 	/* set the event params */
   2515 	addtsReasonCode.uAPSDFlag = pTspecInfo->UPSDFlag;
   2516 	addtsReasonCode.uMinimumServiceInterval = pTspecInfo->uMinimumServiceInterval;
   2517 	addtsReasonCode.uMaximumServiceInterval = pTspecInfo->uMaximumServiceInterval;
   2518 	addtsReasonCode.uUserPriority = pTspecInfo->userPriority;
   2519 	addtsReasonCode.uNominalMSDUsize = pTspecInfo->nominalMsduSize;
   2520 	addtsReasonCode.uMeanDataRate = pTspecInfo->meanDataRate;
   2521 	addtsReasonCode.uMinimumPHYRate = pTspecInfo->minimumPHYRate;
   2522 	addtsReasonCode.uSurplusBandwidthAllowance = pTspecInfo->surplausBwAllowance;
   2523 	addtsReasonCode.uMediumTime = pTspecInfo->mediumTime;
   2524 
   2525     addtsReasonCode.uReasonCode = pTspecInfo->statusCode + TSPEC_RESPONSE_UNEXPECTED;
   2526 
   2527 	/* send event */
   2528 	EvHandlerSendEvent(pQosMngr->hEvHandler, IPC_EVENT_TSPEC_STATUS, (TI_UINT8*)(&addtsReasonCode), sizeof(OS_802_11_QOS_TSPEC_PARAMS));
   2529 
   2530 	return TI_OK;
   2531 }
   2532 
   2533 /************************************************************************
   2534  *                        qosMngr_setAdmissionInfo                      *
   2535  ************************************************************************
   2536 DESCRIPTION: This function is API function.
   2537             the trafficAdmCtrl object calls this function in
   2538             order to update the QOSMngr on TSPEC request status
   2539 
   2540 INPUT:      hQosMngr                 - Qos Manager handle.
   2541             pTspecInfo               - The TSPEC Parameters
   2542             trafficAdmRequestStatus  - the status of the request
   2543 OUTPUT:
   2544 
   2545 RETURN:     TI_OK on success, TI_NOK otherwise
   2546 
   2547 ************************************************************************/
   2548 TI_STATUS qosMngr_setAdmissionInfo(TI_HANDLE    hQosMngr,
   2549                                    TI_UINT8        acID,
   2550                                    tspecInfo_t  *pTspecInfo,
   2551                                    trafficAdmRequestStatus_e trafficAdmRequestStatus)
   2552 {
   2553     TI_UINT32                 actualMediumTime;
   2554     OS_802_11_QOS_TSPEC_PARAMS addtsReasonCode;
   2555     qosMngr_t *pQosMngr =  (qosMngr_t *)hQosMngr;
   2556     TSetTemplate           templateStruct;
   2557     QosNullDataTemplate_t  QosNullDataTemplate;
   2558 
   2559     /* Check if the updated AC is in WAIT state */
   2560     if(pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState != AC_WAIT_ADMISSION)
   2561     {
   2562         TRACE1(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_setAdmissionInfo: acID = %d, trafficAdmState != WAIT. IGNORE !!!\n", acID);
   2563 
   2564         return TI_NOK;
   2565     }
   2566 
   2567     if (pQosMngr->TSPECNegotiationResultCallb != NULL)
   2568     {
   2569         pQosMngr->TSPECNegotiationResultCallb (pQosMngr->TSPECNegotiationResultModule, trafficAdmRequestStatus);
   2570         pQosMngr->TSPECNegotiationResultCallb = NULL;
   2571         pQosMngr->TSPECNegotiationResultModule = NULL;
   2572     }
   2573 
   2574     switch(trafficAdmRequestStatus)
   2575     {
   2576     case STATUS_TRAFFIC_ADM_REQUEST_ACCEPT:
   2577         /* Received admission response with status accept */
   2578 
   2579         TRACE3(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_setAdmissionInfo: admCtrl status =  REQUEST_ACCEPT [ acID = %d, mediumTime = %d, minimumPHYRate = %d ]\n", acID, pTspecInfo->mediumTime, pTspecInfo->minimumPHYRate);
   2580 
   2581         /* Set the event params */
   2582         addtsReasonCode.uAPSDFlag = pTspecInfo->UPSDFlag;
   2583         addtsReasonCode.uMinimumServiceInterval = pTspecInfo->uMinimumServiceInterval;
   2584         addtsReasonCode.uMaximumServiceInterval = pTspecInfo->uMaximumServiceInterval;
   2585         addtsReasonCode.uUserPriority = pTspecInfo->userPriority;
   2586         addtsReasonCode.uNominalMSDUsize = pTspecInfo->nominalMsduSize;
   2587         addtsReasonCode.uMeanDataRate = pTspecInfo->meanDataRate;
   2588         addtsReasonCode.uMinimumPHYRate = pTspecInfo->minimumPHYRate;
   2589         addtsReasonCode.uSurplusBandwidthAllowance = pTspecInfo->surplausBwAllowance;
   2590         addtsReasonCode.uMediumTime = pTspecInfo->mediumTime;
   2591 
   2592         /* Free the candidate parameters */
   2593         pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState = AC_NOT_ADMITTED;
   2594 
   2595         /* Validate tid matching */
   2596         if (pTspecInfo->tid == pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].tid)
   2597         {
   2598             addtsReasonCode.uReasonCode = ADDTS_RESPONSE_ACCEPT;
   2599 
   2600             /* Send event */
   2601             EvHandlerSendEvent (pQosMngr->hEvHandler,
   2602                                 IPC_EVENT_TSPEC_STATUS,
   2603                                 (TI_UINT8*)&addtsReasonCode,
   2604                                 sizeof(OS_802_11_QOS_TSPEC_PARAMS));
   2605         }
   2606         else
   2607         {
   2608             addtsReasonCode.uReasonCode = ADDTS_RESPONSE_AP_PARAM_INVALID;
   2609 
   2610             /* Send event */
   2611             EvHandlerSendEvent (pQosMngr->hEvHandler,
   2612                                 IPC_EVENT_TSPEC_STATUS,
   2613                                 (TI_UINT8*)&addtsReasonCode,
   2614                                 sizeof(OS_802_11_QOS_TSPEC_PARAMS));
   2615             return TI_OK;
   2616         }
   2617 
   2618         /* Update the current TSPEC parameters from the received TSPEC */
   2619         os_memoryCopy (pQosMngr->hOs,
   2620                        &pQosMngr->resourceMgmtTable.currentTspecInfo[acID],
   2621                        pTspecInfo,
   2622                        sizeof(tspecInfo_t));
   2623 
   2624         /* Set the TSPEC to admitted */
   2625         pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState = AC_ADMITTED;
   2626 
   2627         /* Update total medium time */
   2628         pQosMngr->resourceMgmtTable.totalAllocatedMediumTime += pTspecInfo->mediumTime;
   2629 
   2630         /*
   2631          * Set QOS Null-data template into the firmware.
   2632          * When a new TSPEC with UPSD is "accepted" by the AP,
   2633          * we set the user priority of it into the firmware.
   2634          * Since this AC is already ADMITTED (we are processing the successful response),
   2635          * it is TI_OK to set the qos null data template with this UP
   2636          */
   2637         if (addtsReasonCode.uAPSDFlag == PS_SCHEME_UPSD_TRIGGER &&
   2638             pQosMngr->QosNullDataTemplateUserPriority == 0xFF)
   2639         {
   2640             /* Remember the user priority which we have set */
   2641             pQosMngr->QosNullDataTemplateUserPriority = (TI_UINT8)addtsReasonCode.uUserPriority;
   2642 
   2643             templateStruct.ptr = (TI_UINT8 *)&QosNullDataTemplate;
   2644             templateStruct.type = QOS_NULL_DATA_TEMPLATE;
   2645             templateStruct.uRateMask = RATE_MASK_UNSPECIFIED;
   2646             buildQosNullDataTemplate (pQosMngr->hSiteMgr, &templateStruct, pQosMngr->QosNullDataTemplateUserPriority);
   2647             TWD_CmdTemplate (pQosMngr->hTWD, &templateStruct, NULL, NULL);
   2648 
   2649             TRACE1(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_setAdmissionInfo: Setting QOS null data for UserPriority=%d (due to TSPEC ACCEPT response)\n", addtsReasonCode.uUserPriority);
   2650         }
   2651 
   2652         /* Set params to TX */
   2653         /*------------------*/
   2654 
   2655         /* Update medium time and rate adaptation event only when init admission bit was 0 */
   2656         if (pQosMngr->acParams[acID].apInitAdmissionState == ADMISSION_REQUIRED)
   2657         {
   2658             /* mediumTime is in units of 32uSec and we work in mSec */
   2659             actualMediumTime = (pTspecInfo->mediumTime * 32) / 1000;
   2660 
   2661             /* Set TX params */
   2662 			txCtrlParams_setAdmissionCtrlParams(pQosMngr->hTxCtrl,
   2663                                           acID,
   2664                                           actualMediumTime,
   2665                                           pTspecInfo->minimumPHYRate,
   2666                                           TI_TRUE);
   2667         }
   2668 
   2669         {
   2670             PSScheme_e psMode = pTspecInfo->UPSDFlag ? PS_SCHEME_UPSD_TRIGGER
   2671                                                      : PS_SCHEME_LEGACY;
   2672 
   2673             if (pQosMngr->acParams[acID].currentWmeAcPsMode != psMode)
   2674             {
   2675                 TI_STATUS status;
   2676 
   2677                 pQosMngr->acParams[acID].currentWmeAcPsMode = psMode;
   2678 
   2679                 /* UPSD_FW - open comment in UPSD FW integration */
   2680                 pQosMngr->acParams[acID].QtrafficParams.psScheme = pQosMngr->acParams[acID].currentWmeAcPsMode;
   2681                 status = verifyAndConfigTrafficParams (pQosMngr, &pQosMngr->acParams[acID].QtrafficParams);
   2682                 if (status != TI_OK)
   2683                     return status;
   2684             }
   2685         }
   2686         break;
   2687 
   2688     case STATUS_TRAFFIC_ADM_REQUEST_REJECT:
   2689         /* Received admission response with status reject */
   2690 
   2691         TRACE1(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_setAdmissionInfo: admCtrl status = REQUEST_REJECT [ acID = %d ]\n", acID);
   2692 
   2693         /* Validate tid matching */
   2694         if (pTspecInfo->tid == pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].tid)
   2695         {
   2696             addtsReasonCode.uReasonCode = pTspecInfo->statusCode;
   2697         }
   2698         else
   2699         {
   2700             addtsReasonCode.uReasonCode = ADDTS_RESPONSE_AP_PARAM_INVALID;
   2701         }
   2702 
   2703         /* Free the candidate parameters */
   2704         pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState = AC_NOT_ADMITTED;
   2705 
   2706         /* Send event to application */
   2707         addtsReasonCode.uAPSDFlag = pTspecInfo->UPSDFlag;
   2708         addtsReasonCode.uMinimumServiceInterval = pTspecInfo->uMinimumServiceInterval;
   2709         addtsReasonCode.uMaximumServiceInterval = pTspecInfo->uMaximumServiceInterval;
   2710         addtsReasonCode.uUserPriority = pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].userPriority;
   2711         addtsReasonCode.uNominalMSDUsize = pTspecInfo->nominalMsduSize;
   2712         addtsReasonCode.uMeanDataRate = pTspecInfo->meanDataRate;
   2713         addtsReasonCode.uMinimumPHYRate = pTspecInfo->minimumPHYRate;
   2714         addtsReasonCode.uSurplusBandwidthAllowance = pTspecInfo->surplausBwAllowance;
   2715         addtsReasonCode.uMediumTime = pTspecInfo->mediumTime;
   2716 
   2717         EvHandlerSendEvent (pQosMngr->hEvHandler,
   2718                             IPC_EVENT_TSPEC_STATUS,
   2719                             (TI_UINT8*)&addtsReasonCode,
   2720                             sizeof(OS_802_11_QOS_TSPEC_PARAMS));
   2721         break;
   2722 
   2723     case STATUS_TRAFFIC_ADM_REQUEST_TIMEOUT:
   2724         TRACE1(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "qosMngr_setAdmissionInfo: admCtrl status = REQUEST_TIMEOUT [ acID = %d ]\n", acID);
   2725 
   2726         /* Free the candidate parameters */
   2727         pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].trafficAdmState = AC_NOT_ADMITTED;
   2728 
   2729         /* Send event to application */
   2730         addtsReasonCode.uUserPriority = pQosMngr->resourceMgmtTable.candidateTspecInfo[acID].userPriority;
   2731         addtsReasonCode.uReasonCode = ADDTS_RESPONSE_TIMEOUT;
   2732         addtsReasonCode.uAPSDFlag = 0;
   2733         addtsReasonCode.uMinimumServiceInterval = 0;
   2734         addtsReasonCode.uMaximumServiceInterval = 0;
   2735         addtsReasonCode.uNominalMSDUsize = 0;
   2736         addtsReasonCode.uMeanDataRate = 0;
   2737         addtsReasonCode.uMinimumPHYRate = 0;
   2738         addtsReasonCode.uSurplusBandwidthAllowance = 0;
   2739         addtsReasonCode.uMediumTime = 0;
   2740 
   2741         EvHandlerSendEvent (pQosMngr->hEvHandler,
   2742                             IPC_EVENT_TSPEC_STATUS,
   2743                             (TI_UINT8*)&addtsReasonCode,
   2744                             sizeof(OS_802_11_QOS_TSPEC_PARAMS));
   2745         break;
   2746 
   2747     default:
   2748         TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_setAdmissionInfo: receive state from admCtrl = unknown !!! \n");
   2749         break;
   2750     }
   2751 
   2752     return TI_OK;
   2753 }
   2754 
   2755 /************************************************************************
   2756  *                    QosMngr_receiveActionFrames                       *
   2757  ************************************************************************
   2758 DESCRIPTION:
   2759 
   2760 RETURN:     TI_OK on success, TI_NOK otherwise
   2761 
   2762 ************************************************************************/
   2763 TI_STATUS QosMngr_receiveActionFrames(TI_HANDLE hQosMngr, TI_UINT8* pData, TI_UINT8 action, TI_UINT32 bodyLen)
   2764 {
   2765 	TI_UINT8					acID;
   2766 	tsInfo_t				tsInfo;
   2767 	TI_UINT8					userPriority;
   2768     OS_802_11_QOS_TSPEC_PARAMS addtsReasonCode;
   2769 
   2770 
   2771     qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
   2772 
   2773 	/* check if STA is already connected to AP */
   2774 	if( (pQosMngr->isConnected == TI_FALSE) ||
   2775 		(pQosMngr->activeProtocol != QOS_WME) ||
   2776 		(pQosMngr->trafficAdmCtrlEnable == TI_FALSE) )
   2777 	{
   2778 TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "QosMngr_receiveActionFrames:  Ignore  !!!");
   2779 		return TI_NOK;
   2780 	}
   2781 
   2782 	/* check DELTS action code */
   2783 	if (action == DELTS_ACTION)
   2784 	{
   2785 		/*
   2786 		 *  parse the frame
   2787 		 */
   2788 
   2789 		/* skip dialog-token (1 byte), status-code (1 byte) and dot11_WME_TSPEC_IE header (8 bytes). */
   2790 		pData += 10;
   2791 
   2792 		/*  Get TS-Info from TSpec IE in DELTS, and get from it the user-priority. */
   2793 		tsInfo.tsInfoArr[0] = *pData;
   2794 		pData++;
   2795 		tsInfo.tsInfoArr[1] = *pData;
   2796 		pData++;
   2797 		tsInfo.tsInfoArr[2] = *pData;
   2798 
   2799         userPriority = (((tsInfo.tsInfoArr[1]) & TS_INFO_1_USER_PRIORITY_MASK) >> USER_PRIORITY_SHIFT);
   2800 
   2801 		acID = WMEQosTagToACTable[userPriority];
   2802 
   2803 
   2804 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_INFORMATION, "QosMngr_receiveActionFrames: DELTS [ acID = %d ] \n", acID);
   2805 
   2806 
   2807 		/* check if this AC is admitted with the correct userPriority */
   2808 		if( (pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState == AC_ADMITTED) &&
   2809 			( pQosMngr->resourceMgmtTable.currentTspecInfo[acID].userPriority == userPriority) )
   2810 		{
   2811 			deleteTspecConfiguration(pQosMngr, acID);
   2812 
   2813             /* Send event to notify DEL_TS */
   2814             addtsReasonCode.uAPSDFlag = 0;
   2815             addtsReasonCode.uMinimumServiceInterval = 0;
   2816             addtsReasonCode.uMaximumServiceInterval = 0;
   2817 		    addtsReasonCode.uUserPriority = userPriority;
   2818             addtsReasonCode.uReasonCode = TSPEC_DELETED_BY_AP;
   2819 		    addtsReasonCode.uNominalMSDUsize = 0;
   2820 		    addtsReasonCode.uMeanDataRate = 0;
   2821 		    addtsReasonCode.uMinimumPHYRate = 0;
   2822 		    addtsReasonCode.uSurplusBandwidthAllowance = 0;
   2823 		    addtsReasonCode.uMediumTime = 0;
   2824 
   2825             EvHandlerSendEvent(pQosMngr->hEvHandler, IPC_EVENT_TSPEC_STATUS, (TI_UINT8*)(&addtsReasonCode), sizeof(OS_802_11_QOS_TSPEC_PARAMS));
   2826 		}
   2827 		else
   2828 		{
   2829 TRACE3(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "QosMngr_receiveActionFrames: DELTS [ acID = %d userPriority = %d  currentUserPriority = %d] Current State in not ADMITED !! \n", acID, userPriority,pQosMngr->resourceMgmtTable.currentTspecInfo[acID].userPriority);
   2830 
   2831 		}
   2832 	}
   2833 	/* if action code is ADDTS call trafficAdmCtrl object API function */
   2834 	else if (action == ADDTS_RESPONSE_ACTION)
   2835 	{
   2836 		if (trafficAdmCtrl_recv(pQosMngr->pTrafficAdmCtrl, pData, action) == TI_OK)
   2837 		{
   2838 #ifdef XCC_MODULE_INCLUDED
   2839 			/* Check if XCC IEs present, if so, parse them and update relevant modules;
   2840                skip the TSPEC IE;
   2841                do not forget 2 bytes of status and dialog code that must be skipped as well */
   2842 			XCCv4IEs_t			XCCIE;
   2843 			TI_UINT32 				readLen;
   2844 
   2845 			XCCIE.edcaLifetimeParameter = NULL;
   2846 			XCCIE.trafficStreamParameter = NULL;
   2847 			XCCIE.tsMetrixParameter = NULL;
   2848 
   2849 			userPriority = GET_USER_PRIORITY_FROM_WME_TSPEC_IE(pData+2);
   2850 			acID = WMEQosTagToACTable[userPriority];
   2851 
   2852 			/* The length is in the second byte of the IE header, after the token and status. */
   2853 			readLen = (TI_UINT32)(*(pData + 3));
   2854 
   2855 			/* 4 stands for 1 byte of token + 1 byte of status + 1 byte of EID + 1 byte of len */
   2856 			bodyLen = bodyLen - 4 - readLen;
   2857 			pData = pData + 4 + readLen;
   2858 
   2859 			while (bodyLen)
   2860 			{
   2861 				mlmeParser_readXCCOui(pData, bodyLen, &readLen, &XCCIE);
   2862 				bodyLen -= readLen;
   2863 				pData += readLen;
   2864 			}
   2865 
   2866 			XCCMngr_setXCCQoSParams(pQosMngr->hXCCMgr, &XCCIE, acID);
   2867 #endif
   2868 		}
   2869 	}
   2870 	else
   2871 	{
   2872 TRACE1(pQosMngr->hReport, REPORT_SEVERITY_WARNING, "QosMngr_receiveActionFrames: Receive unknown action code = %d  -> Ignore !! \n",action);
   2873 	}
   2874 
   2875 	return TI_OK;
   2876 }
   2877 
   2878 /************************************************************************
   2879  *                        qosMngr_getCurrAcStatus     		            *
   2880  ************************************************************************
   2881 DESCRIPTION: This function is API fuunction for getting tha AC status .
   2882 
   2883 INPUT:      hQosMngr	             - Qos Manager handle.
   2884 			pAcStatusParams
   2885 
   2886 OUTPUT:
   2887 
   2888 RETURN:     TI_OK on success, TI_NOK otherwise
   2889 
   2890 ************************************************************************/
   2891 static TI_STATUS qosMngr_getCurrAcStatus(TI_HANDLE hQosMngr, OS_802_11_AC_UPSD_STATUS_PARAMS *pAcStatusParams)
   2892 {
   2893     qosMngr_t *pQosMngr = (qosMngr_t *)hQosMngr;
   2894 
   2895 	/* check AC validity */
   2896 	if( pAcStatusParams->uAC > MAX_NUM_OF_AC - 1 )
   2897 	{
   2898 		TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_getCurrAcStatus: acID > 3 -> Ignore !!!");
   2899 		return TI_NOK;
   2900 	}
   2901 
   2902 	/* check if sta is connected to AP */
   2903 	if(pQosMngr->isConnected == TI_FALSE)
   2904 	{
   2905 		TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_getCurrAcStatus: pQosMngr->connected == TI_FALSE -> Ignore !!!");
   2906 		return NOT_CONNECTED;
   2907 	}
   2908 
   2909 	 /* check if AP support QOS_WME */
   2910 	if(pQosMngr->activeProtocol != QOS_WME)
   2911 	{
   2912 		TRACE0(pQosMngr->hReport, REPORT_SEVERITY_ERROR, "qosMngr_getCurrAcStatus: activeProtocol != QOS_WME -> Ignore !!!");
   2913 		return NO_QOS_AP;
   2914 	}
   2915 
   2916 	pAcStatusParams->uCurrentUAPSDStatus = pQosMngr->acParams[pAcStatusParams->uAC].currentWmeAcPsMode;
   2917 	pAcStatusParams->pCurrentAdmissionStatus = pQosMngr->resourceMgmtTable.currentTspecInfo[pAcStatusParams->uAC].trafficAdmState;
   2918 
   2919 	return TI_OK;
   2920 }
   2921 
   2922 
   2923 
   2924 /************************************************************************
   2925  *                        setNonQosAdmissionState  		                *
   2926  ************************************************************************
   2927 DESCRIPTION: This function resets the admission state variables as required
   2928 				for non-QoS mode and configures the Tx module.
   2929 
   2930 INPUT:      pQosMngr	- Qos Manager pointer.
   2931 			acId		- the AC to update.
   2932 
   2933 OUTPUT:
   2934 
   2935 RETURN:
   2936 
   2937 ************************************************************************/
   2938 
   2939 static void setNonQosAdmissionState(qosMngr_t *pQosMngr, TI_UINT8 acID)
   2940 {
   2941 	if(acID == QOS_AC_BE)
   2942 	{
   2943 		pQosMngr->acParams[acID].apInitAdmissionState = ADMISSION_NOT_REQUIRED;
   2944 		pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState = AC_ADMITTED;
   2945 
   2946 		txCtrlParams_setAcAdmissionStatus(pQosMngr->hTxCtrl, acID, ADMISSION_NOT_REQUIRED, AC_ADMITTED);
   2947 	}
   2948 	else
   2949 	{
   2950 		pQosMngr->acParams[acID].apInitAdmissionState = ADMISSION_REQUIRED;
   2951 		pQosMngr->resourceMgmtTable.currentTspecInfo[acID].trafficAdmState = AC_NOT_ADMITTED;
   2952 
   2953 		txCtrlParams_setAcAdmissionStatus(pQosMngr->hTxCtrl, acID, ADMISSION_REQUIRED, AC_NOT_ADMITTED);
   2954 	}
   2955 }
   2956 
   2957 static void qosMngr_storeTspecCandidateParams (tspecInfo_t *pCandidateParams, OS_802_11_QOS_TSPEC_PARAMS *pTSPECParams, TI_UINT8 ac)
   2958 {
   2959 	pCandidateParams->AC = (EAcTrfcType)ac;
   2960 	pCandidateParams->tid = (TI_UINT8)pTSPECParams->uUserPriority;
   2961 	pCandidateParams->userPriority = (TI_UINT8)pTSPECParams->uUserPriority;
   2962 	pCandidateParams->meanDataRate = pTSPECParams->uMeanDataRate;
   2963 	pCandidateParams->nominalMsduSize = (TI_UINT16)pTSPECParams->uNominalMSDUsize;
   2964 	pCandidateParams->UPSDFlag = (TI_BOOL)pTSPECParams->uAPSDFlag;
   2965 	pCandidateParams->uMinimumServiceInterval = pTSPECParams->uMinimumServiceInterval;
   2966 	pCandidateParams->uMaximumServiceInterval = pTSPECParams->uMaximumServiceInterval;
   2967 	pCandidateParams->surplausBwAllowance = (TI_UINT16)pTSPECParams->uSurplusBandwidthAllowance;
   2968 	pCandidateParams->minimumPHYRate = pTSPECParams->uMinimumPHYRate;
   2969 	pCandidateParams->streamDirection = BI_DIRECTIONAL;
   2970 	pCandidateParams->mediumTime = 0;
   2971 }
   2972