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