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