blob: cbd89ba3b8f7841f9f79af7620e829259c05468c [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Kiet Lamaa8e15a2014-02-11 23:30:06 -08002 * Copyright (c) 2012-2013 Qualcomm Atheros, Inc.
3 * All Rights Reserved.
4 * Qualcomm Atheros Confidential and Proprietary.
Jeff Johnson295189b2012-06-20 16:38:30 -07005 */
Jeff Johnson295189b2012-06-20 16:38:30 -07006/*
7 * Airgo Networks, Inc proprietary. All rights reserved.
8 * This file schMessage.cc contains the message handler
9 *
10 * Author: Sandesh Goel
11 * Date: 02/25/02
12 * History:-
13 * Date Modified by Modification Information
14 * --------------------------------------------------------------------
15 *
16 */
17#include "palTypes.h"
18#include "sirCommon.h"
19
Jeff Johnson62c27982013-02-27 17:53:55 -080020#include "wniCfgSta.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070021#include "aniGlobal.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070022#include "cfgApi.h"
23#include "limApi.h"
24#include "pmmApi.h"
25#include "limSendMessages.h"
26
27
28#include "schApi.h"
29#include "schDebug.h"
30
31/// Minimum beacon interval allowed (in Kus)
32#define SCH_BEACON_INTERVAL_MIN 10
33
34/// Maximum beacon interval allowed (in Kus)
35#define SCH_BEACON_INTERVAL_MAX 10000
36
37/// convert the CW values into a tANI_U16
38#define GET_CW(pCw) ((tANI_U16) ((*(pCw) << 8) + *((pCw) + 1)))
39
40// local functions
41static tSirRetStatus getWmmLocalParams(tpAniSirGlobal pMac, tANI_U32 params[][WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN]);
42static void setSchEdcaParams(tpAniSirGlobal pMac, tANI_U32 params[][WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN], tpPESession psessionEntry);
43
44// --------------------------------------------------------------------
45/**
46 * schSetBeaconInterval
47 *
48 * FUNCTION:
49 *
50 * LOGIC:
51 *
52 * ASSUMPTIONS:
53 *
54 * NOTE:
55 *
56 * @param None
57 * @return None
58 */
59
60void schSetBeaconInterval(tpAniSirGlobal pMac,tpPESession psessionEntry)
61{
62 tANI_U32 bi;
63
64 bi = psessionEntry->beaconParams.beaconInterval;
65
66 if (bi < SCH_BEACON_INTERVAL_MIN || bi > SCH_BEACON_INTERVAL_MAX)
67 {
Kiran Kumar Lokereaf882c82013-03-18 16:07:05 -070068 schLog(pMac, LOGE, FL("Invalid beacon interval %d (should be [%d,%d]"),
Jeff Johnson295189b2012-06-20 16:38:30 -070069 bi, SCH_BEACON_INTERVAL_MIN, SCH_BEACON_INTERVAL_MAX);
70 return;
71 }
72
73 pMac->sch.schObject.gSchBeaconInterval = (tANI_U16)bi;
74}
75
76
77// --------------------------------------------------------------------
78/**
Jeff Johnson295189b2012-06-20 16:38:30 -070079 * schProcessMessage
80 *
81 * FUNCTION:
82 *
83 * LOGIC:
84 *
85 * ASSUMPTIONS:
86 *
87 * NOTE:
88 *
89 * @param None
90 * @return None
91 */
92
93void schProcessMessage(tpAniSirGlobal pMac,tpSirMsgQ pSchMsg)
94{
95#ifdef FIXME_GEN6
96 tANI_U32 *pBD;
97 tpSirMacMgmtHdr mh;
98 void *pPacket;
99#endif
100 tANI_U32 val;
101
102 tpPESession psessionEntry = &pMac->lim.gpSession[0]; //TBD-RAJESH HOW TO GET sessionEntry?????
Kiran Kumar Lokereaf882c82013-03-18 16:07:05 -0700103 PELOG3(schLog(pMac, LOG3, FL("Received message (%x) "), pSchMsg->type);)
Jeff Johnson295189b2012-06-20 16:38:30 -0700104
105 switch (pSchMsg->type)
106 {
107#ifdef FIXME_GEN6
108 case SIR_BB_XPORT_MGMT_MSG:
109 pMac->sch.gSchBBXportRcvCnt++;
110
111
Jeff Johnson295189b2012-06-20 16:38:30 -0700112 pBD = (tANI_U32 *) pSchMsg->bodyptr;
Jeff Johnson295189b2012-06-20 16:38:30 -0700113
114
115 mh = SIR_MAC_BD_TO_MPDUHEADER( pBD );
116
117 if (mh->fc.type == SIR_MAC_MGMT_FRAME &&
118 mh->fc.subType == SIR_MAC_MGMT_BEACON)
119 schBeaconProcess(pMac, pBD);
120 else
121 {
Kiran Kumar Lokereaf882c82013-03-18 16:07:05 -0700122 schLog(pMac, LOGE, FL("Unexpected message (%d,%d) rcvd"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700123 mh->fc.type, mh->fc.subType);
124 pMac->sch.gSchUnknownRcvCnt++;
125 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700126 break;
127#endif
128
129 case SIR_SCH_CHANNEL_SWITCH_REQUEST:
130 schLog(pMac, LOGE,
Kiran Kumar Lokereaf882c82013-03-18 16:07:05 -0700131 FL("Channel switch request not handled"));
Jeff Johnson295189b2012-06-20 16:38:30 -0700132 break;
133
134 case SIR_SCH_START_SCAN_REQ:
Jeff Johnson295189b2012-06-20 16:38:30 -0700135 pMac->sch.gSchScanReqRcvd = true;
136 if (pMac->sch.gSchHcfEnabled)
137 {
138 // In HCF mode, wait for TFP to stop before sending a response
139 if (pMac->sch.schObject.gSchCFBInitiated ||
140 pMac->sch.schObject.gSchCFPInitiated)
141 {
142 PELOG1(schLog(pMac, LOG1,
143 FL("Waiting for TFP to halt before sending "
Kiran Kumar Lokereaf882c82013-03-18 16:07:05 -0700144 "start scan response"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700145 }
146 else
147 schSendStartScanRsp(pMac);
148 }
149 else
150 {
151 // In eDCF mode, send the response right away
152 schSendStartScanRsp(pMac);
153 }
Jeff Johnson295189b2012-06-20 16:38:30 -0700154 break;
155
156 case SIR_SCH_END_SCAN_NTF:
157 PELOG3(schLog(pMac, LOG3,
Kiran Kumar Lokereaf882c82013-03-18 16:07:05 -0700158 FL("Received STOP_SCAN_NTF from LIM"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700159 pMac->sch.gSchScanReqRcvd = false;
Jeff Johnson295189b2012-06-20 16:38:30 -0700160 break;
161
162 case SIR_CFG_PARAM_UPDATE_IND:
163
164 if (wlan_cfgGetInt(pMac, (tANI_U16) pSchMsg->bodyval, &val) != eSIR_SUCCESS)
Kiran Kumar Lokereaf882c82013-03-18 16:07:05 -0700165 schLog(pMac, LOGP, FL("failed to cfg get id %d"), pSchMsg->bodyval);
Jeff Johnson295189b2012-06-20 16:38:30 -0700166
167 switch (pSchMsg->bodyval)
168 {
169 case WNI_CFG_BEACON_INTERVAL:
170 // What to do for IBSS ?? - TBD
171 if (psessionEntry->limSystemRole == eLIM_AP_ROLE)
172 schSetBeaconInterval(pMac,psessionEntry);
173 break;
174
175
176 case WNI_CFG_DTIM_PERIOD:
177 pMac->sch.schObject.gSchDTIMCount = 0;
178 break;
179
180 case WNI_CFG_CFP_PERIOD:
181 pMac->sch.schObject.gSchCFPCount = 0;
182 break;
183
184 case WNI_CFG_EDCA_PROFILE:
185 schEdcaProfileUpdate(pMac, psessionEntry);
186 break;
187
188 case WNI_CFG_EDCA_ANI_ACBK_LOCAL:
189 case WNI_CFG_EDCA_ANI_ACBE_LOCAL:
190 case WNI_CFG_EDCA_ANI_ACVI_LOCAL:
191 case WNI_CFG_EDCA_ANI_ACVO_LOCAL:
192 case WNI_CFG_EDCA_WME_ACBK_LOCAL:
193 case WNI_CFG_EDCA_WME_ACBE_LOCAL:
194 case WNI_CFG_EDCA_WME_ACVI_LOCAL:
195 case WNI_CFG_EDCA_WME_ACVO_LOCAL:
196 if (psessionEntry->limSystemRole == eLIM_AP_ROLE)
197 schQosUpdateLocal(pMac, psessionEntry);
198 break;
199
200 case WNI_CFG_EDCA_ANI_ACBK:
201 case WNI_CFG_EDCA_ANI_ACBE:
202 case WNI_CFG_EDCA_ANI_ACVI:
203 case WNI_CFG_EDCA_ANI_ACVO:
204 case WNI_CFG_EDCA_WME_ACBK:
205 case WNI_CFG_EDCA_WME_ACBE:
206 case WNI_CFG_EDCA_WME_ACVI:
207 case WNI_CFG_EDCA_WME_ACVO:
208 if (psessionEntry->limSystemRole == eLIM_AP_ROLE)
209 {
210 psessionEntry->gLimEdcaParamSetCount++;
211 schQosUpdateBroadcast(pMac, psessionEntry);
212 }
213 break;
214
215 default:
Kiran Kumar Lokereaf882c82013-03-18 16:07:05 -0700216 schLog(pMac, LOGE, FL("Cfg param %d indication not handled"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700217 pSchMsg->bodyval);
218 }
219 break;
Madan Mohan Koyyalamudi436cdab2012-09-24 12:19:47 -0700220
Jeff Johnson295189b2012-06-20 16:38:30 -0700221 default:
Kiran Kumar Lokereaf882c82013-03-18 16:07:05 -0700222 schLog(pMac, LOGE, FL("Unknown message in schMsgQ type %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700223 pSchMsg->type);
224 }
225
226}
227
228
Jeff Johnson295189b2012-06-20 16:38:30 -0700229// get the local or broadcast parameters based on the profile sepcified in the config
230// params are delivered in this order: BK, BE, VI, VO
231tSirRetStatus
232schGetParams(
233 tpAniSirGlobal pMac,
234 tANI_U32 params[][WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN],
235 tANI_U8 local)
236{
237 tANI_U32 val;
238 tANI_U32 i,idx;
239 tANI_U32 *prf;
240
241 tANI_U32 ani_l[] = { WNI_CFG_EDCA_ANI_ACBE_LOCAL,WNI_CFG_EDCA_ANI_ACBK_LOCAL,
242 WNI_CFG_EDCA_ANI_ACVI_LOCAL, WNI_CFG_EDCA_ANI_ACVO_LOCAL };
243 tANI_U32 wme_l[] = {WNI_CFG_EDCA_WME_ACBE_LOCAL, WNI_CFG_EDCA_WME_ACBK_LOCAL,
244 WNI_CFG_EDCA_WME_ACVI_LOCAL, WNI_CFG_EDCA_WME_ACVO_LOCAL};
245 tANI_U32 demo_l[] = {WNI_CFG_EDCA_TIT_DEMO_ACBE_LOCAL, WNI_CFG_EDCA_TIT_DEMO_ACBK_LOCAL,
246 WNI_CFG_EDCA_TIT_DEMO_ACVI_LOCAL, WNI_CFG_EDCA_TIT_DEMO_ACVO_LOCAL};
247 tANI_U32 ani_b[] = {WNI_CFG_EDCA_ANI_ACBE, WNI_CFG_EDCA_ANI_ACBK,
248 WNI_CFG_EDCA_ANI_ACVI, WNI_CFG_EDCA_ANI_ACVO};
249 tANI_U32 wme_b[] = {WNI_CFG_EDCA_WME_ACBE, WNI_CFG_EDCA_WME_ACBK,
250 WNI_CFG_EDCA_WME_ACVI, WNI_CFG_EDCA_WME_ACVO};
251 tANI_U32 demo_b[] = {WNI_CFG_EDCA_TIT_DEMO_ACBE, WNI_CFG_EDCA_TIT_DEMO_ACBK,
252 WNI_CFG_EDCA_TIT_DEMO_ACVI, WNI_CFG_EDCA_TIT_DEMO_ACVO};
253
254 if (wlan_cfgGetInt(pMac, WNI_CFG_EDCA_PROFILE, &val) != eSIR_SUCCESS)
255 {
Kiran Kumar Lokereaf882c82013-03-18 16:07:05 -0700256 schLog(pMac, LOGP, FL("failed to cfg get EDCA_PROFILE id %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700257 WNI_CFG_EDCA_PROFILE);
258 return eSIR_FAILURE;
259 }
260
261 if (val >= WNI_CFG_EDCA_PROFILE_MAX)
262 {
Kiran Kumar Lokereaf882c82013-03-18 16:07:05 -0700263 schLog(pMac, LOGE, FL("Invalid EDCA_PROFILE %d, using %d instead"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700264 val, WNI_CFG_EDCA_PROFILE_ANI);
265 val = WNI_CFG_EDCA_PROFILE_ANI;
266 }
267
Kiran Kumar Lokereaf882c82013-03-18 16:07:05 -0700268 schLog(pMac, LOGW, FL("EdcaProfile: Using %d (%s)"), val,
Jeff Johnson295189b2012-06-20 16:38:30 -0700269 ((val == WNI_CFG_EDCA_PROFILE_WMM) ? "WMM"
270 : ( (val == WNI_CFG_EDCA_PROFILE_TIT_DEMO) ? "Titan" : "HiPerf")));
271
272 if (local)
273 {
274 switch (val)
275 {
276 case WNI_CFG_EDCA_PROFILE_WMM:
277 prf = &wme_l[0];
278 break;
279 case WNI_CFG_EDCA_PROFILE_TIT_DEMO:
280 prf = &demo_l[0];
281 break;
282 case WNI_CFG_EDCA_PROFILE_ANI:
283 default:
284 prf = &ani_l[0];
285 break;
286 }
287 }
288 else
289 {
290 switch (val)
291 {
292 case WNI_CFG_EDCA_PROFILE_WMM:
293 prf = &wme_b[0];
294 break;
295 case WNI_CFG_EDCA_PROFILE_TIT_DEMO:
296 prf = &demo_b[0];
297 break;
298 case WNI_CFG_EDCA_PROFILE_ANI:
299 default:
300 prf = &ani_b[0];
301 break;
302 }
303 }
304
305 for (i=0; i < 4; i++)
306 {
307 tANI_U8 data[WNI_CFG_EDCA_ANI_ACBK_LEN];
308 tANI_U32 len = WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN;
309 if (wlan_cfgGetStr(pMac, (tANI_U16) prf[i], (tANI_U8 *) &data[0], &len) != eSIR_SUCCESS)
310 {
Kiran Kumar Lokereaf882c82013-03-18 16:07:05 -0700311 schLog(pMac, LOGP, FL("cfgGet failed for %d"), prf[i]);
Jeff Johnson295189b2012-06-20 16:38:30 -0700312 return eSIR_FAILURE;
313 }
314 if (len > WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN)
315 {
Kiran Kumar Lokereaf882c82013-03-18 16:07:05 -0700316 schLog(pMac, LOGE, FL("cfgGet for %d: length is %d instead of %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700317 prf[i], len, WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN);
318 return eSIR_FAILURE;
319 }
320 for (idx=0; idx < len; idx++)
321 params[i][idx] = (tANI_U32) data[idx];
322 }
Kiran Kumar Lokereaf882c82013-03-18 16:07:05 -0700323 PELOG1(schLog(pMac, LOG1, FL("GetParams: local=%d, profile = %d Done"), local, val);)
Jeff Johnson295189b2012-06-20 16:38:30 -0700324 return eSIR_SUCCESS;
325}
326
Madan Mohan Koyyalamudi436cdab2012-09-24 12:19:47 -0700327static void broadcastWMMOfConcurrentSTASession(tpAniSirGlobal pMac, tpPESession psessionEntry)
328{
329 tANI_U8 i,j;
330 tpPESession pConcurrentStaSessionEntry;
331
332 for (i =0;i < pMac->lim.maxBssId;i++)
333 {
334 /* Find another INFRA STA AP session on same operating channel. The session entry passed to this API is for GO/SoftAP session that is getting added currently */
335 if ( (pMac->lim.gpSession[i].valid == TRUE ) &&
336 (pMac->lim.gpSession[i].peSessionId != psessionEntry->peSessionId) &&
337 (pMac->lim.gpSession[i].currentOperChannel == psessionEntry->currentOperChannel) &&
338 (pMac->lim.gpSession[i].limSystemRole == eLIM_STA_ROLE)
339 )
340 {
341 pConcurrentStaSessionEntry = &(pMac->lim.gpSession[i]);
342 for (j=0; j<MAX_NUM_AC; j++)
343 {
344 psessionEntry->gLimEdcaParamsBC[j].aci.acm = pConcurrentStaSessionEntry->gLimEdcaParams[j].aci.acm;
345 psessionEntry->gLimEdcaParamsBC[j].aci.aifsn = pConcurrentStaSessionEntry->gLimEdcaParams[j].aci.aifsn;
346 psessionEntry->gLimEdcaParamsBC[j].cw.min = pConcurrentStaSessionEntry->gLimEdcaParams[j].cw.min;
347 psessionEntry->gLimEdcaParamsBC[j].cw.max = pConcurrentStaSessionEntry->gLimEdcaParams[j].cw.max;
348 psessionEntry->gLimEdcaParamsBC[j].txoplimit= pConcurrentStaSessionEntry->gLimEdcaParams[j].txoplimit;
349
Kiran Kumar Lokereaf882c82013-03-18 16:07:05 -0700350 PELOG1(schLog(pMac, LOG1, "QoSUpdateBCast changed again due to concurrent INFRA STA session: AC :%d: AIFSN: %d, ACM %d, CWmin %d, CWmax %d, TxOp %d",
Madan Mohan Koyyalamudi436cdab2012-09-24 12:19:47 -0700351 j,
352 psessionEntry->gLimEdcaParamsBC[j].aci.aifsn,
353 psessionEntry->gLimEdcaParamsBC[j].aci.acm,
354 psessionEntry->gLimEdcaParamsBC[j].cw.min,
355 psessionEntry->gLimEdcaParamsBC[j].cw.max,
356 psessionEntry->gLimEdcaParamsBC[j].txoplimit);)
357
358 }
359 /* Once atleast one concurrent session on same channel is found and WMM broadcast params for current SoftAP/GO session updated, return*/
360 break;
361 }
362 }
363}
364
Jeff Johnson295189b2012-06-20 16:38:30 -0700365void
366schQosUpdateBroadcast(tpAniSirGlobal pMac, tpPESession psessionEntry)
367{
368 tANI_U32 params[4][WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN];
369 tANI_U32 cwminidx, cwmaxidx, txopidx;
370 tANI_U32 phyMode;
371 tANI_U8 i;
372
373 if (schGetParams(pMac, params, false) != eSIR_SUCCESS)
374 {
Kiran Kumar Lokereaf882c82013-03-18 16:07:05 -0700375 PELOGE(schLog(pMac, LOGE, FL("QosUpdateBroadcast: failed"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700376 return;
377 }
378 limGetPhyMode(pMac, &phyMode, psessionEntry);
379
Kiran Kumar Lokereaf882c82013-03-18 16:07:05 -0700380 PELOG1(schLog(pMac, LOG1, "QosUpdBcast: mode %d", phyMode);)
Jeff Johnson295189b2012-06-20 16:38:30 -0700381
382 if (phyMode == WNI_CFG_PHY_MODE_11G)
383 {
384 cwminidx = WNI_CFG_EDCA_PROFILE_CWMING_IDX;
385 cwmaxidx = WNI_CFG_EDCA_PROFILE_CWMAXG_IDX;
386 txopidx = WNI_CFG_EDCA_PROFILE_TXOPG_IDX;
387 }
388 else if (phyMode == WNI_CFG_PHY_MODE_11B)
389 {
390 cwminidx = WNI_CFG_EDCA_PROFILE_CWMINB_IDX;
391 cwmaxidx = WNI_CFG_EDCA_PROFILE_CWMAXB_IDX;
392 txopidx = WNI_CFG_EDCA_PROFILE_TXOPB_IDX;
393 }
394 else // This can happen if mode is not set yet, assume 11a mode
395 {
396 cwminidx = WNI_CFG_EDCA_PROFILE_CWMINA_IDX;
397 cwmaxidx = WNI_CFG_EDCA_PROFILE_CWMAXA_IDX;
398 txopidx = WNI_CFG_EDCA_PROFILE_TXOPA_IDX;
399 }
400
401
402 for(i=0; i<MAX_NUM_AC; i++)
403 {
404 psessionEntry->gLimEdcaParamsBC[i].aci.acm = (tANI_U8) params[i][WNI_CFG_EDCA_PROFILE_ACM_IDX];
405 psessionEntry->gLimEdcaParamsBC[i].aci.aifsn = (tANI_U8) params[i][WNI_CFG_EDCA_PROFILE_AIFSN_IDX];
406 psessionEntry->gLimEdcaParamsBC[i].cw.min = convertCW(GET_CW(&params[i][cwminidx]));
407 psessionEntry->gLimEdcaParamsBC[i].cw.max = convertCW(GET_CW(&params[i][cwmaxidx]));
408 psessionEntry->gLimEdcaParamsBC[i].txoplimit= (tANI_U16) params[i][txopidx];
409
Kiran Kumar Lokereaf882c82013-03-18 16:07:05 -0700410 PELOG1(schLog(pMac, LOG1, "QoSUpdateBCast: AC :%d: AIFSN: %d, ACM %d, CWmin %d, CWmax %d, TxOp %d", i,
Jeff Johnson295189b2012-06-20 16:38:30 -0700411 psessionEntry->gLimEdcaParamsBC[i].aci.aifsn,
412 psessionEntry->gLimEdcaParamsBC[i].aci.acm,
413 psessionEntry->gLimEdcaParamsBC[i].cw.min,
414 psessionEntry->gLimEdcaParamsBC[i].cw.max,
415 psessionEntry->gLimEdcaParamsBC[i].txoplimit);)
416
417 }
418
Madan Mohan Koyyalamudi436cdab2012-09-24 12:19:47 -0700419 /* If there exists a concurrent STA-AP session, use its WMM params to broadcast in beacons. WFA Wifi Direct test plan 6.1.14 requirement */
420 broadcastWMMOfConcurrentSTASession(pMac, psessionEntry);
421
Jeff Johnson295189b2012-06-20 16:38:30 -0700422 if (schSetFixedBeaconFields(pMac,psessionEntry) != eSIR_SUCCESS)
Kiran Kumar Lokereaf882c82013-03-18 16:07:05 -0700423 PELOGE(schLog(pMac, LOGE, "Unable to set beacon fields!");)
Jeff Johnson295189b2012-06-20 16:38:30 -0700424}
425
426void
427schQosUpdateLocal(tpAniSirGlobal pMac, tpPESession psessionEntry)
428{
429
430 tANI_U32 params[4][WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN];
431 tANI_BOOLEAN highPerformance=eANI_BOOLEAN_TRUE;
432
433 if (schGetParams(pMac, params, true /*local*/) != eSIR_SUCCESS)
434 {
Kiran Kumar Lokereaf882c82013-03-18 16:07:05 -0700435 PELOGE(schLog(pMac, LOGE, FL("schGetParams(local) failed"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700436 return;
437 }
438
439 setSchEdcaParams(pMac, params, psessionEntry);
440
441 if (psessionEntry->limSystemRole == eLIM_AP_ROLE)
442 {
443 if (pMac->lim.gLimNumOfAniSTAs)
444 highPerformance = eANI_BOOLEAN_TRUE;
445 else
446 highPerformance = eANI_BOOLEAN_FALSE;
447 }
448 else if (psessionEntry->limSystemRole == eLIM_STA_IN_IBSS_ROLE)
449 {
450 highPerformance = eANI_BOOLEAN_TRUE;
451 }
452
453 //For AP, the bssID is stored in LIM Global context.
454 limSendEdcaParams(pMac, psessionEntry->gLimEdcaParams, psessionEntry->bssIdx, highPerformance);
455}
456
457/** ----------------------------------------------------------
458\fn schSetDefaultEdcaParams
459\brief This function sets the gLimEdcaParams to the default
460\ local wmm profile.
461\param tpAniSirGlobal pMac
462\return none
463\ ------------------------------------------------------------ */
464void
465schSetDefaultEdcaParams(tpAniSirGlobal pMac, tpPESession psessionEntry)
466{
467 tANI_U32 params[4][WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN];
468
469 if (getWmmLocalParams(pMac, params) != eSIR_SUCCESS)
470 {
Kiran Kumar Lokereaf882c82013-03-18 16:07:05 -0700471 PELOGE(schLog(pMac, LOGE, FL("getWmmLocalParams() failed"));)
Jeff Johnson295189b2012-06-20 16:38:30 -0700472 return;
473 }
474
475 setSchEdcaParams(pMac, params, psessionEntry);
476 return;
477}
478
479
480/** ----------------------------------------------------------
481\fn setSchEdcaParams
482\brief This function fills in the gLimEdcaParams structure
483\ with the given edca params.
484\param tpAniSirGlobal pMac
485\return none
486\ ------------------------------------------------------------ */
487static void
488setSchEdcaParams(tpAniSirGlobal pMac, tANI_U32 params[][WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN], tpPESession psessionEntry)
489{
490 tANI_U32 i;
491 tANI_U32 cwminidx, cwmaxidx, txopidx;
492 tANI_U32 phyMode;
493
494 limGetPhyMode(pMac, &phyMode, psessionEntry);
495
Kiran Kumar Lokereaf882c82013-03-18 16:07:05 -0700496 PELOG1(schLog(pMac, LOG1, FL("limGetPhyMode() = %d"), phyMode);)
Jeff Johnson295189b2012-06-20 16:38:30 -0700497
498 //if (pMac->lim.gLimPhyMode == WNI_CFG_PHY_MODE_11G)
499 if (phyMode == WNI_CFG_PHY_MODE_11G)
500 {
501 cwminidx = WNI_CFG_EDCA_PROFILE_CWMING_IDX;
502 cwmaxidx = WNI_CFG_EDCA_PROFILE_CWMAXG_IDX;
503 txopidx = WNI_CFG_EDCA_PROFILE_TXOPG_IDX;
504 }
505 //else if (pMac->lim.gLimPhyMode == WNI_CFG_PHY_MODE_11B)
506 else if (phyMode == WNI_CFG_PHY_MODE_11B)
507 {
508 cwminidx = WNI_CFG_EDCA_PROFILE_CWMINB_IDX;
509 cwmaxidx = WNI_CFG_EDCA_PROFILE_CWMAXB_IDX;
510 txopidx = WNI_CFG_EDCA_PROFILE_TXOPB_IDX;
511 }
512 else // This can happen if mode is not set yet, assume 11a mode
513 {
514 cwminidx = WNI_CFG_EDCA_PROFILE_CWMINA_IDX;
515 cwmaxidx = WNI_CFG_EDCA_PROFILE_CWMAXA_IDX;
516 txopidx = WNI_CFG_EDCA_PROFILE_TXOPA_IDX;
517 }
518
519 for(i=0; i<MAX_NUM_AC; i++)
520 {
521 psessionEntry->gLimEdcaParams[i].aci.acm = (tANI_U8) params[i][WNI_CFG_EDCA_PROFILE_ACM_IDX];
522 psessionEntry->gLimEdcaParams[i].aci.aifsn = (tANI_U8) params[i][WNI_CFG_EDCA_PROFILE_AIFSN_IDX];
523 psessionEntry->gLimEdcaParams[i].cw.min = convertCW(GET_CW(&params[i][cwminidx]));
524 psessionEntry->gLimEdcaParams[i].cw.max = convertCW(GET_CW(&params[i][cwmaxidx]));
525 psessionEntry->gLimEdcaParams[i].txoplimit= (tANI_U16) params[i][txopidx];
526
Kiran Kumar Lokereaf882c82013-03-18 16:07:05 -0700527 PELOG1(schLog(pMac, LOG1, FL("AC :%d: AIFSN: %d, ACM %d, CWmin %d, CWmax %d, TxOp %d"), i,
Jeff Johnson295189b2012-06-20 16:38:30 -0700528 psessionEntry->gLimEdcaParams[i].aci.aifsn,
529 psessionEntry->gLimEdcaParams[i].aci.acm,
530 psessionEntry->gLimEdcaParams[i].cw.min,
531 psessionEntry->gLimEdcaParams[i].cw.max,
532 psessionEntry->gLimEdcaParams[i].txoplimit);)
533
534 }
535 return;
536}
537
538/** ----------------------------------------------------------
539\fn getWmmLocalParams
540\brief This function gets the WMM local edca parameters.
541\param tpAniSirGlobal pMac
542\param tANI_U32 params[][WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN]
543\return none
544\ ------------------------------------------------------------ */
545static tSirRetStatus
546getWmmLocalParams(tpAniSirGlobal pMac, tANI_U32 params[][WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN])
547{
548 tANI_U32 i,idx;
549 tANI_U32 *prf;
550 tANI_U32 wme_l[] = {WNI_CFG_EDCA_WME_ACBE_LOCAL, WNI_CFG_EDCA_WME_ACBK_LOCAL,
551 WNI_CFG_EDCA_WME_ACVI_LOCAL, WNI_CFG_EDCA_WME_ACVO_LOCAL};
552
553 prf = &wme_l[0];
554 for (i=0; i < 4; i++)
555 {
556 tANI_U8 data[WNI_CFG_EDCA_ANI_ACBK_LEN];
557 tANI_U32 len = WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN;
558 if (wlan_cfgGetStr(pMac, (tANI_U16) prf[i], (tANI_U8 *) &data[0], &len) != eSIR_SUCCESS)
559 {
Kiran Kumar Lokereaf882c82013-03-18 16:07:05 -0700560 schLog(pMac, LOGP, FL("cfgGet failed for %d"), prf[i]);
Jeff Johnson295189b2012-06-20 16:38:30 -0700561 return eSIR_FAILURE;
562 }
563 if (len > WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN)
564 {
Kiran Kumar Lokereaf882c82013-03-18 16:07:05 -0700565 schLog(pMac, LOGE, FL("cfgGet for %d: length is %d instead of %d"),
Jeff Johnson295189b2012-06-20 16:38:30 -0700566 prf[i], len, WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN);
567 return eSIR_FAILURE;
568 }
569 for (idx=0; idx < len; idx++)
570 params[i][idx] = (tANI_U32) data[idx];
571 }
572 return eSIR_SUCCESS;
573}
574
575
576/** ----------------------------------------------------------
577\fn schEdcaProfileUpdate
578\brief This function updates the local and broadcast
579\ EDCA params in the gLimEdcaParams structure. It also
580\ updates the edcaParamSetCount.
581\param tpAniSirGlobal pMac
582\return none
583\ ------------------------------------------------------------ */
584void
585schEdcaProfileUpdate(tpAniSirGlobal pMac, tpPESession psessionEntry)
586{
587 if (psessionEntry->limSystemRole == eLIM_AP_ROLE || psessionEntry->limSystemRole == eLIM_STA_IN_IBSS_ROLE)
588 {
589 schQosUpdateLocal(pMac, psessionEntry);
590 psessionEntry->gLimEdcaParamSetCount++;
591 schQosUpdateBroadcast(pMac, psessionEntry);
592 }
593}
594
595// --------------------------------------------------------------------