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