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