blob: e746f8b742ea19fe3295655911c9c5619c72a710 [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
2 * Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
3 *
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 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
28#include "cds_api.h"
29#include "sir_common.h"
30
31#include "wni_cfg.h"
32#include "ani_global.h"
33#include "cfg_api.h"
34#include "lim_api.h"
35#include "lim_send_messages.h"
36
37#include "sch_api.h"
38#include "sch_debug.h"
39
40/* / Minimum beacon interval allowed (in Kus) */
41#define SCH_BEACON_INTERVAL_MIN 10
42
43/* / Maximum beacon interval allowed (in Kus) */
44#define SCH_BEACON_INTERVAL_MAX 10000
45
46/* / convert the CW values into a uint16_t */
47#define GET_CW(pCw) ((uint16_t) ((*(pCw) << 8) + *((pCw) + 1)))
48
49/* local functions */
50static tSirRetStatus get_wmm_local_params(tpAniSirGlobal pMac,
51 uint32_t
52 params[]
53 [WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN]);
54static void set_sch_edca_params(tpAniSirGlobal pMac,
55 uint32_t params[][WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN],
56 tpPESession psessionEntry);
57
58/* -------------------------------------------------------------------- */
59/**
60 * sch_set_beacon_interval
61 *
62 * FUNCTION:
63 *
64 * LOGIC:
65 *
66 * ASSUMPTIONS:
67 *
68 * NOTE:
69 *
70 * @param None
71 * @return None
72 */
73
74void sch_set_beacon_interval(tpAniSirGlobal pMac, tpPESession psessionEntry)
75{
76 uint32_t bi;
77
78 bi = psessionEntry->beaconParams.beaconInterval;
79
80 if (bi < SCH_BEACON_INTERVAL_MIN || bi > SCH_BEACON_INTERVAL_MAX) {
81 sch_log(pMac, LOGE,
82 FL("Invalid beacon interval %d (should be [%d,%d]"), bi,
83 SCH_BEACON_INTERVAL_MIN, SCH_BEACON_INTERVAL_MAX);
84 return;
85 }
86
87 pMac->sch.schObject.gSchBeaconInterval = (uint16_t) bi;
88}
89
90/* -------------------------------------------------------------------- */
91/**
92 * sch_process_message
93 *
94 * FUNCTION:
95 *
96 * LOGIC:
97 *
98 * ASSUMPTIONS:
99 *
100 * NOTE:
101 *
102 * @param None
103 * @return None
104 */
105
106void sch_process_message(tpAniSirGlobal pMac, tpSirMsgQ pSchMsg)
107{
108 uint32_t val;
109
110 tpPESession psessionEntry = &pMac->lim.gpSession[0];
111 PELOG3(sch_log(pMac, LOG3, FL("Received message (%x) "), pSchMsg->type);)
112
113 switch (pSchMsg->type) {
114
115 case SIR_SCH_CHANNEL_SWITCH_REQUEST:
116 sch_log(pMac, LOGE, FL("Channel switch request not handled"));
117 break;
118
119 case SIR_SCH_START_SCAN_REQ:
120 pMac->sch.gSchScanReqRcvd = true;
121 if (pMac->sch.gSchHcfEnabled) {
122 /* In HCF mode, wait for TFP to stop before sending a response */
123 if (pMac->sch.schObject.gSchCFBInitiated ||
124 pMac->sch.schObject.gSchCFPInitiated) {
125 PELOG1(sch_log(pMac, LOG1,
126 FL
127 ("Waiting for TFP to halt before sending "
128 "start scan response"));
129 )
130 } else
131 sch_send_start_scan_rsp(pMac);
132 } else {
133 /* In eDCF mode, send the response right away */
134 sch_send_start_scan_rsp(pMac);
135 }
136 break;
137
138 case SIR_SCH_END_SCAN_NTF:
139 PELOG3(sch_log(pMac, LOG3,
140 FL("Received STOP_SCAN_NTF from LIM"));
141 )
142 pMac->sch.gSchScanReqRcvd = false;
143 break;
144
145 case SIR_CFG_PARAM_UPDATE_IND:
146
147 if (wlan_cfg_get_int(pMac, (uint16_t) pSchMsg->bodyval, &val) !=
148 eSIR_SUCCESS)
149 sch_log(pMac, LOGP, FL("failed to cfg get id %d"),
150 pSchMsg->bodyval);
151
152 switch (pSchMsg->bodyval) {
153 case WNI_CFG_BEACON_INTERVAL:
154 /* What to do for IBSS ?? - TBD */
155 if (LIM_IS_AP_ROLE(psessionEntry))
156 sch_set_beacon_interval(pMac, psessionEntry);
157 break;
158
159 case WNI_CFG_DTIM_PERIOD:
160 pMac->sch.schObject.gSchDTIMCount = 0;
161 break;
162
163 case WNI_CFG_CFP_PERIOD:
164 pMac->sch.schObject.gSchCFPCount = 0;
165 break;
166
167 case WNI_CFG_EDCA_PROFILE:
168 sch_edca_profile_update(pMac, psessionEntry);
169 break;
170
171 case WNI_CFG_EDCA_ANI_ACBK_LOCAL:
172 case WNI_CFG_EDCA_ANI_ACBE_LOCAL:
173 case WNI_CFG_EDCA_ANI_ACVI_LOCAL:
174 case WNI_CFG_EDCA_ANI_ACVO_LOCAL:
175 case WNI_CFG_EDCA_WME_ACBK_LOCAL:
176 case WNI_CFG_EDCA_WME_ACBE_LOCAL:
177 case WNI_CFG_EDCA_WME_ACVI_LOCAL:
178 case WNI_CFG_EDCA_WME_ACVO_LOCAL:
179 if (LIM_IS_AP_ROLE(psessionEntry))
180 sch_qos_update_local(pMac, psessionEntry);
181 break;
182
183 case WNI_CFG_EDCA_ANI_ACBK:
184 case WNI_CFG_EDCA_ANI_ACBE:
185 case WNI_CFG_EDCA_ANI_ACVI:
186 case WNI_CFG_EDCA_ANI_ACVO:
187 case WNI_CFG_EDCA_WME_ACBK:
188 case WNI_CFG_EDCA_WME_ACBE:
189 case WNI_CFG_EDCA_WME_ACVI:
190 case WNI_CFG_EDCA_WME_ACVO:
191 if (LIM_IS_AP_ROLE(psessionEntry)) {
192 psessionEntry->gLimEdcaParamSetCount++;
193 sch_qos_update_broadcast(pMac, psessionEntry);
194 }
195 break;
196
197 default:
198 sch_log(pMac, LOGE,
199 FL("Cfg param %d indication not handled"),
200 pSchMsg->bodyval);
201 }
202 break;
203
204 default:
205 sch_log(pMac, LOGE, FL("Unknown message in schMsgQ type %d"),
206 pSchMsg->type);
207 }
208
209}
210
211/* get the local or broadcast parameters based on the profile sepcified in the config */
212/* params are delivered in this order: BK, BE, VI, VO */
213tSirRetStatus
214sch_get_params(tpAniSirGlobal pMac,
215 uint32_t params[][WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN], uint8_t local)
216{
217 uint32_t val;
218 uint32_t i, idx;
219 uint32_t *prf;
220
221 uint32_t ani_l[] = {
222 WNI_CFG_EDCA_ANI_ACBE_LOCAL, WNI_CFG_EDCA_ANI_ACBK_LOCAL,
223 WNI_CFG_EDCA_ANI_ACVI_LOCAL, WNI_CFG_EDCA_ANI_ACVO_LOCAL};
224 uint32_t wme_l[] = {
225 WNI_CFG_EDCA_WME_ACBE_LOCAL, WNI_CFG_EDCA_WME_ACBK_LOCAL,
226 WNI_CFG_EDCA_WME_ACVI_LOCAL, WNI_CFG_EDCA_WME_ACVO_LOCAL};
227 uint32_t ani_b[] = { WNI_CFG_EDCA_ANI_ACBE, WNI_CFG_EDCA_ANI_ACBK,
228 WNI_CFG_EDCA_ANI_ACVI, WNI_CFG_EDCA_ANI_ACVO};
229 uint32_t wme_b[] = { WNI_CFG_EDCA_WME_ACBE, WNI_CFG_EDCA_WME_ACBK,
230 WNI_CFG_EDCA_WME_ACVI, WNI_CFG_EDCA_WME_ACVO};
231
232 if (wlan_cfg_get_int(pMac, WNI_CFG_EDCA_PROFILE, &val) != eSIR_SUCCESS) {
233 sch_log(pMac, LOGP, FL("failed to cfg get EDCA_PROFILE id %d"),
234 WNI_CFG_EDCA_PROFILE);
235 return eSIR_FAILURE;
236 }
237
238 if (val >= WNI_CFG_EDCA_PROFILE_MAX) {
239 sch_log(pMac, LOGE,
240 FL("Invalid EDCA_PROFILE %d, using %d instead"), val,
241 WNI_CFG_EDCA_PROFILE_ANI);
242 val = WNI_CFG_EDCA_PROFILE_ANI;
243 }
244
245 sch_log(pMac, LOGW, FL("EdcaProfile: Using %d (%s)"), val,
246 ((val == WNI_CFG_EDCA_PROFILE_WMM) ? "WMM" : "HiPerf"));
247
248 if (local) {
249 switch (val) {
250 case WNI_CFG_EDCA_PROFILE_WMM:
251 prf = &wme_l[0];
252 break;
253 case WNI_CFG_EDCA_PROFILE_ANI:
254 default:
255 prf = &ani_l[0];
256 break;
257 }
258 } else {
259 switch (val) {
260 case WNI_CFG_EDCA_PROFILE_WMM:
261 prf = &wme_b[0];
262 break;
263 case WNI_CFG_EDCA_PROFILE_ANI:
264 default:
265 prf = &ani_b[0];
266 break;
267 }
268 }
269
270 for (i = 0; i < 4; i++) {
271 uint8_t data[WNI_CFG_EDCA_ANI_ACBK_LEN];
272 uint32_t len = WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN;
273 if (wlan_cfg_get_str
274 (pMac, (uint16_t) prf[i], (uint8_t *) &data[0],
275 &len) != eSIR_SUCCESS) {
276 sch_log(pMac, LOGP, FL("cfgGet failed for %d"), prf[i]);
277 return eSIR_FAILURE;
278 }
279 if (len > WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN) {
280 sch_log(pMac, LOGE,
281 FL("cfgGet for %d: length is %d instead of %d"),
282 prf[i], len, WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN);
283 return eSIR_FAILURE;
284 }
285 for (idx = 0; idx < len; idx++)
286 params[i][idx] = (uint32_t) data[idx];
287 }
288 PELOG1(sch_log
289 (pMac, LOG1, FL("GetParams: local=%d, profile = %d Done"), local,
290 val);
291 )
292 return eSIR_SUCCESS;
293}
294
295/**
296 * broadcast_wmm_of_concurrent_sta_session() - broadcasts wmm info
297 * @mac_ctx: mac global context
298 * @session: pesession entry
299 *
300 * Return: void
301 */
302static void
303broadcast_wmm_of_concurrent_sta_session(tpAniSirGlobal mac_ctx,
304 tpPESession session)
305{
306 uint8_t i, j;
307 tpPESession concurrent_session = NULL;
308
309 for (i = 0; i < mac_ctx->lim.maxBssId; i++) {
310 /*
311 * Find another INFRA STA AP session on same operating channel.
312 * The session entry passed to this API is for GO/SoftAP session
313 * that is getting added currently
314 */
315 if (!((mac_ctx->lim.gpSession[i].valid == true) &&
316 (mac_ctx->lim.gpSession[i].peSessionId !=
317 session->peSessionId)
318 && (mac_ctx->lim.gpSession[i].currentOperChannel ==
319 session->currentOperChannel)
320 && (mac_ctx->lim.gpSession[i].limSystemRole
321 == eLIM_STA_ROLE)))
322 continue;
323
324 concurrent_session = &(mac_ctx->lim.gpSession[i]);
325 break;
326 }
327
328 if (concurrent_session == NULL)
329 return;
330 /*
331 * Once atleast one concurrent session on same channel is found and WMM
332 * broadcast params for current SoftAP/GO session updated, return
333 */
334 for (j = 0; j < MAX_NUM_AC; j++) {
335 session->gLimEdcaParamsBC[j].aci.acm =
336 concurrent_session->gLimEdcaParams[j].aci.acm;
337 session->gLimEdcaParamsBC[j].aci.aifsn =
338 concurrent_session->gLimEdcaParams[j].aci.aifsn;
339 session->gLimEdcaParamsBC[j].cw.min =
340 concurrent_session->gLimEdcaParams[j].cw.min;
341 session->gLimEdcaParamsBC[j].cw.max =
342 concurrent_session->gLimEdcaParams[j].cw.max;
343 session->gLimEdcaParamsBC[j].txoplimit =
344 concurrent_session->gLimEdcaParams[j].txoplimit;
345 PELOG1(sch_log(mac_ctx, LOG1,
346 FL("QoSUpdateBCast changed again due to concurrent INFRA STA session: AC :%d: AIFSN: %d, ACM %d, CWmin %d, CWmax %d, TxOp %d"),
347 j, session->gLimEdcaParamsBC[j].aci.aifsn,
348 session->gLimEdcaParamsBC[j].aci.acm,
349 session->gLimEdcaParamsBC[j].cw.min,
350 session->gLimEdcaParamsBC[j].cw.max,
351 session->gLimEdcaParamsBC[j].txoplimit);)
352 }
353}
354
355void sch_qos_update_broadcast(tpAniSirGlobal pMac, tpPESession psessionEntry)
356{
357 uint32_t params[4][WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN];
358 uint32_t cwminidx, cwmaxidx, txopidx;
359 uint32_t phyMode;
360 uint8_t i;
361
362 if (sch_get_params(pMac, params, false) != eSIR_SUCCESS) {
363 PELOGE(sch_log(pMac, LOGE, FL("QosUpdateBroadcast: failed"));)
364 return;
365 }
366 lim_get_phy_mode(pMac, &phyMode, psessionEntry);
367
368 PELOG1(sch_log(pMac, LOG1, "QosUpdBcast: mode %d", phyMode);)
369
370 if (phyMode == WNI_CFG_PHY_MODE_11G) {
371 cwminidx = WNI_CFG_EDCA_PROFILE_CWMING_IDX;
372 cwmaxidx = WNI_CFG_EDCA_PROFILE_CWMAXG_IDX;
373 txopidx = WNI_CFG_EDCA_PROFILE_TXOPG_IDX;
374 } else if (phyMode == WNI_CFG_PHY_MODE_11B) {
375 cwminidx = WNI_CFG_EDCA_PROFILE_CWMINB_IDX;
376 cwmaxidx = WNI_CFG_EDCA_PROFILE_CWMAXB_IDX;
377 txopidx = WNI_CFG_EDCA_PROFILE_TXOPB_IDX;
378 } else {
379 /* This can happen if mode is not set yet, assume 11a mode */
380 cwminidx = WNI_CFG_EDCA_PROFILE_CWMINA_IDX;
381 cwmaxidx = WNI_CFG_EDCA_PROFILE_CWMAXA_IDX;
382 txopidx = WNI_CFG_EDCA_PROFILE_TXOPA_IDX;
383 }
384
385 for (i = 0; i < MAX_NUM_AC; i++) {
386 psessionEntry->gLimEdcaParamsBC[i].aci.acm =
387 (uint8_t) params[i][WNI_CFG_EDCA_PROFILE_ACM_IDX];
388 psessionEntry->gLimEdcaParamsBC[i].aci.aifsn =
389 (uint8_t) params[i][WNI_CFG_EDCA_PROFILE_AIFSN_IDX];
390 psessionEntry->gLimEdcaParamsBC[i].cw.min =
391 convert_cw(GET_CW(&params[i][cwminidx]));
392 psessionEntry->gLimEdcaParamsBC[i].cw.max =
393 convert_cw(GET_CW(&params[i][cwmaxidx]));
394 psessionEntry->gLimEdcaParamsBC[i].txoplimit =
395 (uint16_t) params[i][txopidx];
396
397 PELOG1(sch_log
398 (pMac, LOG1,
399 "QoSUpdateBCast: AC :%d: AIFSN: %d, ACM %d, CWmin %d, CWmax %d, TxOp %d",
400 i, psessionEntry->gLimEdcaParamsBC[i].aci.aifsn,
401 psessionEntry->gLimEdcaParamsBC[i].aci.acm,
402 psessionEntry->gLimEdcaParamsBC[i].cw.min,
403 psessionEntry->gLimEdcaParamsBC[i].cw.max,
404 psessionEntry->gLimEdcaParamsBC[i].txoplimit);
405 )
406
407 }
408
409 /* 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 */
410 broadcast_wmm_of_concurrent_sta_session(pMac, psessionEntry);
411
412 if (sch_set_fixed_beacon_fields(pMac, psessionEntry) != eSIR_SUCCESS)
413 PELOGE(sch_log(pMac, LOGE, "Unable to set beacon fields!");)
414}
415
416void sch_qos_update_local(tpAniSirGlobal pMac, tpPESession psessionEntry)
417{
418
419 uint32_t params[4][WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN];
420
421 if (sch_get_params(pMac, params, true /*local */) != eSIR_SUCCESS) {
422 PELOGE(sch_log(pMac, LOGE, FL("sch_get_params(local) failed"));)
423 return;
424 }
425
426 set_sch_edca_params(pMac, params, psessionEntry);
427
428 /* For AP, the bssID is stored in LIM Global context. */
429 lim_send_edca_params(pMac, psessionEntry->gLimEdcaParams,
430 psessionEntry->bssIdx);
431}
432
433/** ----------------------------------------------------------
434 \fn sch_set_default_edca_params
435 \brief This function sets the gLimEdcaParams to the default
436 \ local wmm profile.
437 \param tpAniSirGlobal pMac
438 \return none
439 \ ------------------------------------------------------------ */
440void sch_set_default_edca_params(tpAniSirGlobal pMac, tpPESession psessionEntry)
441{
442 uint32_t params[4][WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN];
443
444 if (get_wmm_local_params(pMac, params) != eSIR_SUCCESS) {
445 PELOGE(sch_log(pMac, LOGE, FL("get_wmm_local_params() failed"));)
446 return;
447 }
448
449 set_sch_edca_params(pMac, params, psessionEntry);
450 return;
451}
452
453/** ----------------------------------------------------------
454 \fn set_sch_edca_params
455 \brief This function fills in the gLimEdcaParams structure
456 \ with the given edca params.
457 \param tpAniSirGlobal pMac
458 \return none
459 \ ------------------------------------------------------------ */
460static void
461set_sch_edca_params(tpAniSirGlobal pMac,
462 uint32_t params[][WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN],
463 tpPESession psessionEntry)
464{
465 uint32_t i;
466 uint32_t cwminidx, cwmaxidx, txopidx;
467 uint32_t phyMode;
468
469 lim_get_phy_mode(pMac, &phyMode, psessionEntry);
470
471 PELOG1(sch_log(pMac, LOG1, FL("lim_get_phy_mode() = %d"), phyMode);)
472 /* if (pMac->lim.gLimPhyMode == WNI_CFG_PHY_MODE_11G) */
473 if (phyMode == WNI_CFG_PHY_MODE_11G) {
474 cwminidx = WNI_CFG_EDCA_PROFILE_CWMING_IDX;
475 cwmaxidx = WNI_CFG_EDCA_PROFILE_CWMAXG_IDX;
476 txopidx = WNI_CFG_EDCA_PROFILE_TXOPG_IDX;
477 }
478 /* else if (pMac->lim.gLimPhyMode == WNI_CFG_PHY_MODE_11B) */
479 else if (phyMode == WNI_CFG_PHY_MODE_11B) {
480 cwminidx = WNI_CFG_EDCA_PROFILE_CWMINB_IDX;
481 cwmaxidx = WNI_CFG_EDCA_PROFILE_CWMAXB_IDX;
482 txopidx = WNI_CFG_EDCA_PROFILE_TXOPB_IDX;
483 } else {
484 /* This can happen if mode is not set yet, assume 11a mode */
485 cwminidx = WNI_CFG_EDCA_PROFILE_CWMINA_IDX;
486 cwmaxidx = WNI_CFG_EDCA_PROFILE_CWMAXA_IDX;
487 txopidx = WNI_CFG_EDCA_PROFILE_TXOPA_IDX;
488 }
489
490 for (i = 0; i < MAX_NUM_AC; i++) {
491 psessionEntry->gLimEdcaParams[i].aci.acm =
492 (uint8_t) params[i][WNI_CFG_EDCA_PROFILE_ACM_IDX];
493 psessionEntry->gLimEdcaParams[i].aci.aifsn =
494 (uint8_t) params[i][WNI_CFG_EDCA_PROFILE_AIFSN_IDX];
495 psessionEntry->gLimEdcaParams[i].cw.min =
496 convert_cw(GET_CW(&params[i][cwminidx]));
497 psessionEntry->gLimEdcaParams[i].cw.max =
498 convert_cw(GET_CW(&params[i][cwmaxidx]));
499 psessionEntry->gLimEdcaParams[i].txoplimit =
500 (uint16_t) params[i][txopidx];
501
502 PELOG1(sch_log
503 (pMac, LOG1,
504 FL
505 ("AC :%d: AIFSN: %d, ACM %d, CWmin %d, CWmax %d, TxOp %d"),
506 i, psessionEntry->gLimEdcaParams[i].aci.aifsn,
507 psessionEntry->gLimEdcaParams[i].aci.acm,
508 psessionEntry->gLimEdcaParams[i].cw.min,
509 psessionEntry->gLimEdcaParams[i].cw.max,
510 psessionEntry->gLimEdcaParams[i].txoplimit);
511 )
512
513 }
514 return;
515}
516
517/** ----------------------------------------------------------
518 \fn get_wmm_local_params
519 \brief This function gets the WMM local edca parameters.
520 \param tpAniSirGlobal pMac
521 \param uint32_t params[][WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN]
522 \return none
523 \ ------------------------------------------------------------ */
524static tSirRetStatus
525get_wmm_local_params(tpAniSirGlobal pMac,
526 uint32_t params[][WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN])
527{
528 uint32_t i, idx;
529 uint32_t *prf;
530 uint32_t wme_l[] = {
531 WNI_CFG_EDCA_WME_ACBE_LOCAL, WNI_CFG_EDCA_WME_ACBK_LOCAL,
532 WNI_CFG_EDCA_WME_ACVI_LOCAL, WNI_CFG_EDCA_WME_ACVO_LOCAL};
533
534 prf = &wme_l[0];
535 for (i = 0; i < 4; i++) {
536 uint8_t data[WNI_CFG_EDCA_ANI_ACBK_LEN];
537 uint32_t len = WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN;
538 if (wlan_cfg_get_str
539 (pMac, (uint16_t) prf[i], (uint8_t *) &data[0],
540 &len) != eSIR_SUCCESS) {
541 sch_log(pMac, LOGP, FL("cfgGet failed for %d"), prf[i]);
542 return eSIR_FAILURE;
543 }
544 if (len > WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN) {
545 sch_log(pMac, LOGE,
546 FL("cfgGet for %d: length is %d instead of %d"),
547 prf[i], len, WNI_CFG_EDCA_ANI_ACBK_LOCAL_LEN);
548 return eSIR_FAILURE;
549 }
550 for (idx = 0; idx < len; idx++)
551 params[i][idx] = (uint32_t) data[idx];
552 }
553 return eSIR_SUCCESS;
554}
555
556/** ----------------------------------------------------------
557 \fn sch_edca_profile_update
558 \brief This function updates the local and broadcast
559 \ EDCA params in the gLimEdcaParams structure. It also
560 \ updates the edcaParamSetCount.
561 \param tpAniSirGlobal pMac
562 \return none
563 \ ------------------------------------------------------------ */
564void sch_edca_profile_update(tpAniSirGlobal pMac, tpPESession psessionEntry)
565{
566 if (LIM_IS_AP_ROLE(psessionEntry) ||
567 LIM_IS_IBSS_ROLE(psessionEntry)) {
568 sch_qos_update_local(pMac, psessionEntry);
569 psessionEntry->gLimEdcaParamSetCount++;
570 sch_qos_update_broadcast(pMac, psessionEntry);
571 }
572}
573
574/* -------------------------------------------------------------------- */