From cd2facf67c6d6e6bc3ff55344cc25511f8cae5f8 Mon Sep 17 00:00:00 2001 From: Liangwei Dong Date: Mon, 28 Nov 2016 02:58:25 -0500 Subject: qcacld-3.0: Fix WME ParamSetCount error qcacld-2.0 to qcacld-3.0 propagation During the WFA WME test, the ParamSetCount in beacon IE is mismatch with the value in ASSOC response. The root cause is the value will be updated when station gets connected no matter the WME parameter changing or not. The fix is to avoid updating the ParamSetCount count when there is no change in the WME parameters. Change-Id: Ied4cb68c6bbf210084bc3f94607354f2054f7fc0 CRs-Fixed: 1080760 --- core/mac/src/pe/sch/sch_message.c | 51 ++++++++++++++++++++++++++++++--------- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/core/mac/src/pe/sch/sch_message.c b/core/mac/src/pe/sch/sch_message.c index ff363a07254e..020821169399 100644 --- a/core/mac/src/pe/sch/sch_message.c +++ b/core/mac/src/pe/sch/sch_message.c @@ -189,7 +189,6 @@ void sch_process_message(tpAniSirGlobal pMac, tpSirMsgQ pSchMsg) case WNI_CFG_EDCA_WME_ACVI: case WNI_CFG_EDCA_WME_ACVO: if (LIM_IS_AP_ROLE(psessionEntry)) { - psessionEntry->gLimEdcaParamSetCount++; sch_qos_update_broadcast(pMac, psessionEntry); } break; @@ -298,9 +297,9 @@ sch_get_params(tpAniSirGlobal pMac, * @mac_ctx: mac global context * @session: pesession entry * - * Return: void + * Return: true if wmm param updated, false if wmm param not updated */ -static void +static bool broadcast_wmm_of_concurrent_sta_session(tpAniSirGlobal mac_ctx, tpPESession session) { @@ -327,7 +326,13 @@ broadcast_wmm_of_concurrent_sta_session(tpAniSirGlobal mac_ctx, } if (concurrent_session == NULL) - return; + return false; + + if (!qdf_mem_cmp(session->gLimEdcaParamsBC, + concurrent_session->gLimEdcaParams, + sizeof(concurrent_session->gLimEdcaParams))) + return false; + /* * Once atleast one concurrent session on same channel is found and WMM * broadcast params for current SoftAP/GO session updated, return @@ -351,6 +356,7 @@ broadcast_wmm_of_concurrent_sta_session(tpAniSirGlobal mac_ctx, session->gLimEdcaParamsBC[j].cw.max, session->gLimEdcaParamsBC[j].txoplimit);) } + return true; } void sch_qos_update_broadcast(tpAniSirGlobal pMac, tpPESession psessionEntry) @@ -359,6 +365,7 @@ void sch_qos_update_broadcast(tpAniSirGlobal pMac, tpPESession psessionEntry) uint32_t cwminidx, cwmaxidx, txopidx; uint32_t phyMode; uint8_t i; + bool updated = false; if (sch_get_params(pMac, params, false) != eSIR_SUCCESS) { PELOGE(sch_log(pMac, LOGE, FL("QosUpdateBroadcast: failed"));) @@ -384,16 +391,36 @@ void sch_qos_update_broadcast(tpAniSirGlobal pMac, tpPESession psessionEntry) } for (i = 0; i < MAX_NUM_AC; i++) { - psessionEntry->gLimEdcaParamsBC[i].aci.acm = + if (psessionEntry->gLimEdcaParamsBC[i].aci.acm != + (uint8_t) params[i][WNI_CFG_EDCA_PROFILE_ACM_IDX]) { + psessionEntry->gLimEdcaParamsBC[i].aci.acm = (uint8_t) params[i][WNI_CFG_EDCA_PROFILE_ACM_IDX]; - psessionEntry->gLimEdcaParamsBC[i].aci.aifsn = + updated = true; + } + if (psessionEntry->gLimEdcaParamsBC[i].aci.aifsn != + (uint8_t) params[i][WNI_CFG_EDCA_PROFILE_AIFSN_IDX]) { + psessionEntry->gLimEdcaParamsBC[i].aci.aifsn = (uint8_t) params[i][WNI_CFG_EDCA_PROFILE_AIFSN_IDX]; - psessionEntry->gLimEdcaParamsBC[i].cw.min = + updated = true; + } + if (psessionEntry->gLimEdcaParamsBC[i].cw.min != + convert_cw(GET_CW(¶ms[i][cwminidx]))) { + psessionEntry->gLimEdcaParamsBC[i].cw.min = convert_cw(GET_CW(¶ms[i][cwminidx])); - psessionEntry->gLimEdcaParamsBC[i].cw.max = + updated = true; + } + if (psessionEntry->gLimEdcaParamsBC[i].cw.max != + convert_cw(GET_CW(¶ms[i][cwmaxidx]))) { + psessionEntry->gLimEdcaParamsBC[i].cw.max = convert_cw(GET_CW(¶ms[i][cwmaxidx])); - psessionEntry->gLimEdcaParamsBC[i].txoplimit = + updated = true; + } + if (psessionEntry->gLimEdcaParamsBC[i].txoplimit != + (uint16_t) params[i][txopidx]) { + psessionEntry->gLimEdcaParamsBC[i].txoplimit = (uint16_t) params[i][txopidx]; + updated = true; + } PELOG1(sch_log (pMac, LOG1, @@ -408,7 +435,10 @@ void sch_qos_update_broadcast(tpAniSirGlobal pMac, tpPESession psessionEntry) } /* 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 */ - broadcast_wmm_of_concurrent_sta_session(pMac, psessionEntry); + if (broadcast_wmm_of_concurrent_sta_session(pMac, psessionEntry)) + updated = true; + if (updated) + psessionEntry->gLimEdcaParamSetCount++; if (sch_set_fixed_beacon_fields(pMac, psessionEntry) != eSIR_SUCCESS) PELOGE(sch_log(pMac, LOGE, "Unable to set beacon fields!");) @@ -567,7 +597,6 @@ void sch_edca_profile_update(tpAniSirGlobal pMac, tpPESession psessionEntry) if (LIM_IS_AP_ROLE(psessionEntry) || LIM_IS_IBSS_ROLE(psessionEntry)) { sch_qos_update_local(pMac, psessionEntry); - psessionEntry->gLimEdcaParamSetCount++; sch_qos_update_broadcast(pMac, psessionEntry); } } -- cgit v1.2.3