blob: 6803f4caa00f3039265930d9640a72a20dfa21eb [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Jeff Johnson32d95a32012-09-10 13:15:23 -07002 * Copyright (c) 2012, The Linux Foundation. All rights reserved.
Jeff Johnson295189b2012-06-20 16:38:30 -07003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21
22/*
23 * Airgo Networks, Inc proprietary. All rights reserved.
24 * This file schMessage.cc contains the message handler
25 *
26 * Author: Sandesh Goel
27 * Date: 02/25/02
28 * History:-
29 * Date Modified by Modification Information
30 * --------------------------------------------------------------------
31 *
32 */
33#include "palTypes.h"
34#include "sirCommon.h"
35
36#include "wniCfgAp.h"
37#include "aniGlobal.h"
38#ifdef FEATURE_WLAN_NON_INTEGRATED_SOC
39#include "halCommonApi.h"
40#endif
41#include "cfgApi.h"
42#include "limApi.h"
43#include "pmmApi.h"
44#include "limSendMessages.h"
45
46
47#include "schApi.h"
48#include "schDebug.h"
49
50/// Minimum beacon interval allowed (in Kus)
51#define SCH_BEACON_INTERVAL_MIN 10
52
53/// Maximum beacon interval allowed (in Kus)
54#define SCH_BEACON_INTERVAL_MAX 10000
55
56/// convert the CW values into a tANI_U16
57#define GET_CW(pCw) ((tANI_U16) ((*(pCw) << 8) + *((pCw) + 1)))
58
59// local functions
60static tSirRetStatus getWmmLocalParams(tpAniSirGlobal pMac, tANI_U32 params[][WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN]);
61static void setSchEdcaParams(tpAniSirGlobal pMac, tANI_U32 params[][WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN], tpPESession psessionEntry);
62
63// --------------------------------------------------------------------
64/**
65 * schSetBeaconInterval
66 *
67 * FUNCTION:
68 *
69 * LOGIC:
70 *
71 * ASSUMPTIONS:
72 *
73 * NOTE:
74 *
75 * @param None
76 * @return None
77 */
78
79void schSetBeaconInterval(tpAniSirGlobal pMac,tpPESession psessionEntry)
80{
81 tANI_U32 bi;
82
83 bi = psessionEntry->beaconParams.beaconInterval;
84
85 if (bi < SCH_BEACON_INTERVAL_MIN || bi > SCH_BEACON_INTERVAL_MAX)
86 {
87 schLog(pMac, LOGE, FL("Invalid beacon interval %d (should be [%d,%d]\n"),
88 bi, SCH_BEACON_INTERVAL_MIN, SCH_BEACON_INTERVAL_MAX);
89 return;
90 }
91
92 pMac->sch.schObject.gSchBeaconInterval = (tANI_U16)bi;
93}
94
95
96// --------------------------------------------------------------------
97/**
98 * schSetInitParams
99 *
100 * FUNCTION:
101 * Initialize parameters from CFG which do not depend on any other config
102 *
103 * LOGIC:
104 *
105 * ASSUMPTIONS:
106 *
107 * NOTE:
108 *
109 * @param None
110 * @return None
111 */
112
113#if 0 /* This function is not used anywhere */
114void
115schSetInitParams(tpAniSirGlobal pMac)
116{
117 pMac->sch.schObject.gSchDTIMCount = 0;
118 pMac->sch.schObject.gSchCFPCount = 0;
119
120 schQosUpdateLocal(pMac);
121
122 PELOG1(schLog(pMac, LOG1, FL("Finished init of SCH params\n"));)
123}
124#endif
125
126// --------------------------------------------------------------------
127/**
128 * schProcessMessage
129 *
130 * FUNCTION:
131 *
132 * LOGIC:
133 *
134 * ASSUMPTIONS:
135 *
136 * NOTE:
137 *
138 * @param None
139 * @return None
140 */
141
142void schProcessMessage(tpAniSirGlobal pMac,tpSirMsgQ pSchMsg)
143{
144#ifdef FIXME_GEN6
145 tANI_U32 *pBD;
146 tpSirMacMgmtHdr mh;
147 void *pPacket;
148#endif
149 tANI_U32 val;
150
151 tpPESession psessionEntry = &pMac->lim.gpSession[0]; //TBD-RAJESH HOW TO GET sessionEntry?????
152 PELOG3(schLog(pMac, LOG3, FL("Received message (%x) \n"), pSchMsg->type);)
153
154 switch (pSchMsg->type)
155 {
156#ifdef FIXME_GEN6
157 case SIR_BB_XPORT_MGMT_MSG:
158 pMac->sch.gSchBBXportRcvCnt++;
159
160
161#if defined (ANI_OS_TYPE_LINUX) || defined (ANI_OS_TYPE_OSX)
162 {
163 palGetPacketDataPtr( pMac->hHdd, HAL_TXRX_FRM_802_11_MGMT, pSchMsg->bodyptr, (void **) &(pBD) );
164 }
165#else
166 pBD = (tANI_U32 *) pSchMsg->bodyptr;
167#endif
168
169
170 mh = SIR_MAC_BD_TO_MPDUHEADER( pBD );
171
172 if (mh->fc.type == SIR_MAC_MGMT_FRAME &&
173 mh->fc.subType == SIR_MAC_MGMT_BEACON)
174 schBeaconProcess(pMac, pBD);
175 else
176 {
177 schLog(pMac, LOGE, FL("Unexpected message (%d,%d) rcvd\n"),
178 mh->fc.type, mh->fc.subType);
179 pMac->sch.gSchUnknownRcvCnt++;
180 }
181#if defined (ANI_OS_TYPE_LINUX) || defined (ANI_OS_TYPE_OSX)
182 // Free up allocated SK BUF
183 //for Windows, this is freed up by palHandleRxFrames
184 palPktFree( pMac->hHdd, HAL_TXRX_FRM_802_11_MGMT, pBD, (void *) pSchMsg->bodyptr) ;
185#endif
186 break;
187#endif
188
189 case SIR_SCH_CHANNEL_SWITCH_REQUEST:
190 schLog(pMac, LOGE,
191 FL("Channel switch request not handled\n"));
192 break;
193
194 case SIR_SCH_START_SCAN_REQ:
195 SIR_SCHED_LOCK();
196 pMac->sch.gSchScanReqRcvd = true;
197 if (pMac->sch.gSchHcfEnabled)
198 {
199 // In HCF mode, wait for TFP to stop before sending a response
200 if (pMac->sch.schObject.gSchCFBInitiated ||
201 pMac->sch.schObject.gSchCFPInitiated)
202 {
203 PELOG1(schLog(pMac, LOG1,
204 FL("Waiting for TFP to halt before sending "
205 "start scan response\n"));)
206 }
207 else
208 schSendStartScanRsp(pMac);
209 }
210 else
211 {
212 // In eDCF mode, send the response right away
213 schSendStartScanRsp(pMac);
214 }
215 SIR_SCHED_UNLOCK();
216 break;
217
218 case SIR_SCH_END_SCAN_NTF:
219 PELOG3(schLog(pMac, LOG3,
220 FL("Received STOP_SCAN_NTF from LIM\n"));)
221 pMac->sch.gSchScanReqRcvd = false;
222#ifdef WMM_SA
223#if (WNI_POLARIS_FW_PRODUCT == AP)
224 if (psessionEntry->limSystemRole == eLIM_AP_ROLE && pMac->sch.gSchHcfEnabled)
225 startCFB();
226#endif
227#endif
228 break;
229
230 case SIR_CFG_PARAM_UPDATE_IND:
231
232 if (wlan_cfgGetInt(pMac, (tANI_U16) pSchMsg->bodyval, &val) != eSIR_SUCCESS)
233 schLog(pMac, LOGP, FL("failed to cfg get id %d\n"), pSchMsg->bodyval);
234
235 switch (pSchMsg->bodyval)
236 {
237 case WNI_CFG_BEACON_INTERVAL:
238 // What to do for IBSS ?? - TBD
239 if (psessionEntry->limSystemRole == eLIM_AP_ROLE)
240 schSetBeaconInterval(pMac,psessionEntry);
241 break;
242
243
244 case WNI_CFG_DTIM_PERIOD:
245 pMac->sch.schObject.gSchDTIMCount = 0;
246 break;
247
248 case WNI_CFG_CFP_PERIOD:
249 pMac->sch.schObject.gSchCFPCount = 0;
250 break;
251
252 case WNI_CFG_EDCA_PROFILE:
253 schEdcaProfileUpdate(pMac, psessionEntry);
254 break;
255
256 case WNI_CFG_EDCA_ANI_ACBK_LOCAL:
257 case WNI_CFG_EDCA_ANI_ACBE_LOCAL:
258 case WNI_CFG_EDCA_ANI_ACVI_LOCAL:
259 case WNI_CFG_EDCA_ANI_ACVO_LOCAL:
260 case WNI_CFG_EDCA_WME_ACBK_LOCAL:
261 case WNI_CFG_EDCA_WME_ACBE_LOCAL:
262 case WNI_CFG_EDCA_WME_ACVI_LOCAL:
263 case WNI_CFG_EDCA_WME_ACVO_LOCAL:
264 if (psessionEntry->limSystemRole == eLIM_AP_ROLE)
265 schQosUpdateLocal(pMac, psessionEntry);
266 break;
267
268 case WNI_CFG_EDCA_ANI_ACBK:
269 case WNI_CFG_EDCA_ANI_ACBE:
270 case WNI_CFG_EDCA_ANI_ACVI:
271 case WNI_CFG_EDCA_ANI_ACVO:
272 case WNI_CFG_EDCA_WME_ACBK:
273 case WNI_CFG_EDCA_WME_ACBE:
274 case WNI_CFG_EDCA_WME_ACVI:
275 case WNI_CFG_EDCA_WME_ACVO:
276 if (psessionEntry->limSystemRole == eLIM_AP_ROLE)
277 {
278 psessionEntry->gLimEdcaParamSetCount++;
279 schQosUpdateBroadcast(pMac, psessionEntry);
280 }
281 break;
282
283 default:
284 schLog(pMac, LOGE, FL("Cfg param %d indication not handled\n"),
285 pSchMsg->bodyval);
286 }
287 break;
288
289 default:
290 schLog(pMac, LOGE, FL("Unknown message in schMsgQ type %d\n"),
291 pSchMsg->type);
292 }
293
294}
295
296
297// --------------------------------------------------------------------
298/**
299 * schProcessMessageQueue
300 *
301 * FUNCTION:
302 *
303 * LOGIC:
304 *
305 * ASSUMPTIONS:
306 *
307 * NOTE:
308 *
309 * @param None
310 * @return None
311 */
312
313void schProcessMessageQueue(tpAniSirGlobal pMac)
314{
315 tSirMsgQ schMsg;
316
317#if (WNI_POLARIS_FW_PRODUCT == AP)
318 if (pMac->lim.gLimSystemRole == eLIM_AP_ROLE)
319 pMac->sch.gSchRRRecd = false;
320#endif
321 memset(&schMsg, 0, sizeof(tSirMsgQ));
322 while (1)
323 {
324 if (tx_queue_receive(&pMac->sys.gSirSchMsgQ, (void *) &schMsg, TX_WAIT_FOREVER)
325 != TX_SUCCESS)
326 break;
327
328 schProcessMessage(pMac, &schMsg);
329 }
330#ifdef WMM_SA
331#if (WNI_POLARIS_FW_PRODUCT == AP)
332 if (pMac->lim.gLimSystemRole == eLIM_AP_ROLE && pMac->sch.gSchRRRecd)
333 startCFB();
334#endif
335#endif
336}
337
338#if 0 /* This function is not used anywhere */
339// set the default values for all params of interest
340void
341schUpdateQosInfo( tpAniSirGlobal pMac)
342{
343 // need to populate local info only on AP or IBSS, beacon processing
344 // takes care of others
345 psessionEntry->gLimEdcaParamSetCount = 0xFF;
346
347 if (pMac->lim.gLimSystemRole == eLIM_STA_IN_IBSS_ROLE)
348 {
349 schQosUpdateLocal(pMac);
350 }
351 else if (pMac->lim.gLimSystemRole == eLIM_AP_ROLE)
352 {
353 // fill local AP values
354 schQosUpdateLocal(pMac);
355
356 // fill broadcast values
357 schQosUpdateBroadcast(pMac, psessionEntry);
358 }
359}
360
361#endif
362
363// get the local or broadcast parameters based on the profile sepcified in the config
364// params are delivered in this order: BK, BE, VI, VO
365tSirRetStatus
366schGetParams(
367 tpAniSirGlobal pMac,
368 tANI_U32 params[][WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN],
369 tANI_U8 local)
370{
371 tANI_U32 val;
372 tANI_U32 i,idx;
373 tANI_U32 *prf;
374
375 tANI_U32 ani_l[] = { WNI_CFG_EDCA_ANI_ACBE_LOCAL,WNI_CFG_EDCA_ANI_ACBK_LOCAL,
376 WNI_CFG_EDCA_ANI_ACVI_LOCAL, WNI_CFG_EDCA_ANI_ACVO_LOCAL };
377 tANI_U32 wme_l[] = {WNI_CFG_EDCA_WME_ACBE_LOCAL, WNI_CFG_EDCA_WME_ACBK_LOCAL,
378 WNI_CFG_EDCA_WME_ACVI_LOCAL, WNI_CFG_EDCA_WME_ACVO_LOCAL};
379 tANI_U32 demo_l[] = {WNI_CFG_EDCA_TIT_DEMO_ACBE_LOCAL, WNI_CFG_EDCA_TIT_DEMO_ACBK_LOCAL,
380 WNI_CFG_EDCA_TIT_DEMO_ACVI_LOCAL, WNI_CFG_EDCA_TIT_DEMO_ACVO_LOCAL};
381 tANI_U32 ani_b[] = {WNI_CFG_EDCA_ANI_ACBE, WNI_CFG_EDCA_ANI_ACBK,
382 WNI_CFG_EDCA_ANI_ACVI, WNI_CFG_EDCA_ANI_ACVO};
383 tANI_U32 wme_b[] = {WNI_CFG_EDCA_WME_ACBE, WNI_CFG_EDCA_WME_ACBK,
384 WNI_CFG_EDCA_WME_ACVI, WNI_CFG_EDCA_WME_ACVO};
385 tANI_U32 demo_b[] = {WNI_CFG_EDCA_TIT_DEMO_ACBE, WNI_CFG_EDCA_TIT_DEMO_ACBK,
386 WNI_CFG_EDCA_TIT_DEMO_ACVI, WNI_CFG_EDCA_TIT_DEMO_ACVO};
387
388 if (wlan_cfgGetInt(pMac, WNI_CFG_EDCA_PROFILE, &val) != eSIR_SUCCESS)
389 {
390 schLog(pMac, LOGP, FL("failed to cfg get EDCA_PROFILE id %d\n"),
391 WNI_CFG_EDCA_PROFILE);
392 return eSIR_FAILURE;
393 }
394
395 if (val >= WNI_CFG_EDCA_PROFILE_MAX)
396 {
397 schLog(pMac, LOGE, FL("Invalid EDCA_PROFILE %d, using %d instead\n"),
398 val, WNI_CFG_EDCA_PROFILE_ANI);
399 val = WNI_CFG_EDCA_PROFILE_ANI;
400 }
401
402 schLog(pMac, LOGW, FL("EdcaProfile: Using %d (%s)\n"), val,
403 ((val == WNI_CFG_EDCA_PROFILE_WMM) ? "WMM"
404 : ( (val == WNI_CFG_EDCA_PROFILE_TIT_DEMO) ? "Titan" : "HiPerf")));
405
406 if (local)
407 {
408 switch (val)
409 {
410 case WNI_CFG_EDCA_PROFILE_WMM:
411 prf = &wme_l[0];
412 break;
413 case WNI_CFG_EDCA_PROFILE_TIT_DEMO:
414 prf = &demo_l[0];
415 break;
416 case WNI_CFG_EDCA_PROFILE_ANI:
417 default:
418 prf = &ani_l[0];
419 break;
420 }
421 }
422 else
423 {
424 switch (val)
425 {
426 case WNI_CFG_EDCA_PROFILE_WMM:
427 prf = &wme_b[0];
428 break;
429 case WNI_CFG_EDCA_PROFILE_TIT_DEMO:
430 prf = &demo_b[0];
431 break;
432 case WNI_CFG_EDCA_PROFILE_ANI:
433 default:
434 prf = &ani_b[0];
435 break;
436 }
437 }
438
439 for (i=0; i < 4; i++)
440 {
441 tANI_U8 data[WNI_CFG_EDCA_ANI_ACBK_LEN];
442 tANI_U32 len = WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN;
443 if (wlan_cfgGetStr(pMac, (tANI_U16) prf[i], (tANI_U8 *) &data[0], &len) != eSIR_SUCCESS)
444 {
445 schLog(pMac, LOGP, FL("cfgGet failed for %d\n"), prf[i]);
446 return eSIR_FAILURE;
447 }
448 if (len > WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN)
449 {
450 schLog(pMac, LOGE, FL("cfgGet for %d: length is %d instead of %d\n"),
451 prf[i], len, WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN);
452 return eSIR_FAILURE;
453 }
454 for (idx=0; idx < len; idx++)
455 params[i][idx] = (tANI_U32) data[idx];
456 }
457 PELOG1(schLog(pMac, LOG1, FL("GetParams: local=%d, profile = %d Done\n"), local, val);)
458 return eSIR_SUCCESS;
459}
460
461void
462schQosUpdateBroadcast(tpAniSirGlobal pMac, tpPESession psessionEntry)
463{
464 tANI_U32 params[4][WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN];
465 tANI_U32 cwminidx, cwmaxidx, txopidx;
466 tANI_U32 phyMode;
467 tANI_U8 i;
468
469 if (schGetParams(pMac, params, false) != eSIR_SUCCESS)
470 {
471 PELOGE(schLog(pMac, LOGE, FL("QosUpdateBroadcast: failed\n"));)
472 return;
473 }
474 limGetPhyMode(pMac, &phyMode, psessionEntry);
475
476 PELOG1(schLog(pMac, LOG1, "QosUpdBcast: mode %d\n", phyMode);)
477
478 if (phyMode == WNI_CFG_PHY_MODE_11G)
479 {
480 cwminidx = WNI_CFG_EDCA_PROFILE_CWMING_IDX;
481 cwmaxidx = WNI_CFG_EDCA_PROFILE_CWMAXG_IDX;
482 txopidx = WNI_CFG_EDCA_PROFILE_TXOPG_IDX;
483 }
484 else if (phyMode == WNI_CFG_PHY_MODE_11B)
485 {
486 cwminidx = WNI_CFG_EDCA_PROFILE_CWMINB_IDX;
487 cwmaxidx = WNI_CFG_EDCA_PROFILE_CWMAXB_IDX;
488 txopidx = WNI_CFG_EDCA_PROFILE_TXOPB_IDX;
489 }
490 else // This can happen if mode is not set yet, assume 11a mode
491 {
492 cwminidx = WNI_CFG_EDCA_PROFILE_CWMINA_IDX;
493 cwmaxidx = WNI_CFG_EDCA_PROFILE_CWMAXA_IDX;
494 txopidx = WNI_CFG_EDCA_PROFILE_TXOPA_IDX;
495 }
496
497
498 for(i=0; i<MAX_NUM_AC; i++)
499 {
500 psessionEntry->gLimEdcaParamsBC[i].aci.acm = (tANI_U8) params[i][WNI_CFG_EDCA_PROFILE_ACM_IDX];
501 psessionEntry->gLimEdcaParamsBC[i].aci.aifsn = (tANI_U8) params[i][WNI_CFG_EDCA_PROFILE_AIFSN_IDX];
502 psessionEntry->gLimEdcaParamsBC[i].cw.min = convertCW(GET_CW(&params[i][cwminidx]));
503 psessionEntry->gLimEdcaParamsBC[i].cw.max = convertCW(GET_CW(&params[i][cwmaxidx]));
504 psessionEntry->gLimEdcaParamsBC[i].txoplimit= (tANI_U16) params[i][txopidx];
505
506 PELOG1(schLog(pMac, LOG1, "QoSUpdateBCast: AC :%d: AIFSN: %d, ACM %d, CWmin %d, CWmax %d, TxOp %d\n", i,
507 psessionEntry->gLimEdcaParamsBC[i].aci.aifsn,
508 psessionEntry->gLimEdcaParamsBC[i].aci.acm,
509 psessionEntry->gLimEdcaParamsBC[i].cw.min,
510 psessionEntry->gLimEdcaParamsBC[i].cw.max,
511 psessionEntry->gLimEdcaParamsBC[i].txoplimit);)
512
513 }
514
515 if (schSetFixedBeaconFields(pMac,psessionEntry) != eSIR_SUCCESS)
516 PELOGE(schLog(pMac, LOGE, "Unable to set beacon fields!\n");)
517}
518
519void
520schQosUpdateLocal(tpAniSirGlobal pMac, tpPESession psessionEntry)
521{
522
523 tANI_U32 params[4][WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN];
524 tANI_BOOLEAN highPerformance=eANI_BOOLEAN_TRUE;
525
526 if (schGetParams(pMac, params, true /*local*/) != eSIR_SUCCESS)
527 {
528 PELOGE(schLog(pMac, LOGE, FL("schGetParams(local) failed\n"));)
529 return;
530 }
531
532 setSchEdcaParams(pMac, params, psessionEntry);
533
534 if (psessionEntry->limSystemRole == eLIM_AP_ROLE)
535 {
536 if (pMac->lim.gLimNumOfAniSTAs)
537 highPerformance = eANI_BOOLEAN_TRUE;
538 else
539 highPerformance = eANI_BOOLEAN_FALSE;
540 }
541 else if (psessionEntry->limSystemRole == eLIM_STA_IN_IBSS_ROLE)
542 {
543 highPerformance = eANI_BOOLEAN_TRUE;
544 }
545
546 //For AP, the bssID is stored in LIM Global context.
547 limSendEdcaParams(pMac, psessionEntry->gLimEdcaParams, psessionEntry->bssIdx, highPerformance);
548}
549
550/** ----------------------------------------------------------
551\fn schSetDefaultEdcaParams
552\brief This function sets the gLimEdcaParams to the default
553\ local wmm profile.
554\param tpAniSirGlobal pMac
555\return none
556\ ------------------------------------------------------------ */
557void
558schSetDefaultEdcaParams(tpAniSirGlobal pMac, tpPESession psessionEntry)
559{
560 tANI_U32 params[4][WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN];
561
562 if (getWmmLocalParams(pMac, params) != eSIR_SUCCESS)
563 {
564 PELOGE(schLog(pMac, LOGE, FL("getWmmLocalParams() failed\n"));)
565 return;
566 }
567
568 setSchEdcaParams(pMac, params, psessionEntry);
569 return;
570}
571
572
573/** ----------------------------------------------------------
574\fn setSchEdcaParams
575\brief This function fills in the gLimEdcaParams structure
576\ with the given edca params.
577\param tpAniSirGlobal pMac
578\return none
579\ ------------------------------------------------------------ */
580static void
581setSchEdcaParams(tpAniSirGlobal pMac, tANI_U32 params[][WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN], tpPESession psessionEntry)
582{
583 tANI_U32 i;
584 tANI_U32 cwminidx, cwmaxidx, txopidx;
585 tANI_U32 phyMode;
586
587 limGetPhyMode(pMac, &phyMode, psessionEntry);
588
589 PELOG1(schLog(pMac, LOG1, FL("limGetPhyMode() = %d\n"), phyMode);)
590
591 //if (pMac->lim.gLimPhyMode == WNI_CFG_PHY_MODE_11G)
592 if (phyMode == WNI_CFG_PHY_MODE_11G)
593 {
594 cwminidx = WNI_CFG_EDCA_PROFILE_CWMING_IDX;
595 cwmaxidx = WNI_CFG_EDCA_PROFILE_CWMAXG_IDX;
596 txopidx = WNI_CFG_EDCA_PROFILE_TXOPG_IDX;
597 }
598 //else if (pMac->lim.gLimPhyMode == WNI_CFG_PHY_MODE_11B)
599 else if (phyMode == WNI_CFG_PHY_MODE_11B)
600 {
601 cwminidx = WNI_CFG_EDCA_PROFILE_CWMINB_IDX;
602 cwmaxidx = WNI_CFG_EDCA_PROFILE_CWMAXB_IDX;
603 txopidx = WNI_CFG_EDCA_PROFILE_TXOPB_IDX;
604 }
605 else // This can happen if mode is not set yet, assume 11a mode
606 {
607 cwminidx = WNI_CFG_EDCA_PROFILE_CWMINA_IDX;
608 cwmaxidx = WNI_CFG_EDCA_PROFILE_CWMAXA_IDX;
609 txopidx = WNI_CFG_EDCA_PROFILE_TXOPA_IDX;
610 }
611
612 for(i=0; i<MAX_NUM_AC; i++)
613 {
614 psessionEntry->gLimEdcaParams[i].aci.acm = (tANI_U8) params[i][WNI_CFG_EDCA_PROFILE_ACM_IDX];
615 psessionEntry->gLimEdcaParams[i].aci.aifsn = (tANI_U8) params[i][WNI_CFG_EDCA_PROFILE_AIFSN_IDX];
616 psessionEntry->gLimEdcaParams[i].cw.min = convertCW(GET_CW(&params[i][cwminidx]));
617 psessionEntry->gLimEdcaParams[i].cw.max = convertCW(GET_CW(&params[i][cwmaxidx]));
618 psessionEntry->gLimEdcaParams[i].txoplimit= (tANI_U16) params[i][txopidx];
619
620 PELOG1(schLog(pMac, LOG1, FL("AC :%d: AIFSN: %d, ACM %d, CWmin %d, CWmax %d, TxOp %d\n"), i,
621 psessionEntry->gLimEdcaParams[i].aci.aifsn,
622 psessionEntry->gLimEdcaParams[i].aci.acm,
623 psessionEntry->gLimEdcaParams[i].cw.min,
624 psessionEntry->gLimEdcaParams[i].cw.max,
625 psessionEntry->gLimEdcaParams[i].txoplimit);)
626
627 }
628 return;
629}
630
631/** ----------------------------------------------------------
632\fn getWmmLocalParams
633\brief This function gets the WMM local edca parameters.
634\param tpAniSirGlobal pMac
635\param tANI_U32 params[][WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN]
636\return none
637\ ------------------------------------------------------------ */
638static tSirRetStatus
639getWmmLocalParams(tpAniSirGlobal pMac, tANI_U32 params[][WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN])
640{
641 tANI_U32 i,idx;
642 tANI_U32 *prf;
643 tANI_U32 wme_l[] = {WNI_CFG_EDCA_WME_ACBE_LOCAL, WNI_CFG_EDCA_WME_ACBK_LOCAL,
644 WNI_CFG_EDCA_WME_ACVI_LOCAL, WNI_CFG_EDCA_WME_ACVO_LOCAL};
645
646 prf = &wme_l[0];
647 for (i=0; i < 4; i++)
648 {
649 tANI_U8 data[WNI_CFG_EDCA_ANI_ACBK_LEN];
650 tANI_U32 len = WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN;
651 if (wlan_cfgGetStr(pMac, (tANI_U16) prf[i], (tANI_U8 *) &data[0], &len) != eSIR_SUCCESS)
652 {
653 schLog(pMac, LOGP, FL("cfgGet failed for %d\n"), prf[i]);
654 return eSIR_FAILURE;
655 }
656 if (len > WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN)
657 {
658 schLog(pMac, LOGE, FL("cfgGet for %d: length is %d instead of %d\n"),
659 prf[i], len, WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN);
660 return eSIR_FAILURE;
661 }
662 for (idx=0; idx < len; idx++)
663 params[i][idx] = (tANI_U32) data[idx];
664 }
665 return eSIR_SUCCESS;
666}
667
668
669/** ----------------------------------------------------------
670\fn schEdcaProfileUpdate
671\brief This function updates the local and broadcast
672\ EDCA params in the gLimEdcaParams structure. It also
673\ updates the edcaParamSetCount.
674\param tpAniSirGlobal pMac
675\return none
676\ ------------------------------------------------------------ */
677void
678schEdcaProfileUpdate(tpAniSirGlobal pMac, tpPESession psessionEntry)
679{
680 if (psessionEntry->limSystemRole == eLIM_AP_ROLE || psessionEntry->limSystemRole == eLIM_STA_IN_IBSS_ROLE)
681 {
682 schQosUpdateLocal(pMac, psessionEntry);
683 psessionEntry->gLimEdcaParamSetCount++;
684 schQosUpdateBroadcast(pMac, psessionEntry);
685 }
686}
687
688// --------------------------------------------------------------------