From 4df4b660e5c73c44deab96c6caa67495e20c0d57 Mon Sep 17 00:00:00 2001 From: Krunal Soni Date: Tue, 25 Jul 2017 11:02:53 -0700 Subject: [PATCH] qcacld-3.0: Don't discard nss update when channel bonding is disabled For STA-DUT, when host receives the beacon forwarded by firmware which contains NSS update, host discards that beacon if channel bonding is disabled from INI. This is incorrect behavior. When channel bonding is disabled from INI and host should discard the beacon when it contains channel width related updates. Change-Id: I76b42caec6ed0faea7b1650407ff5c1565ac6947 CRs-Fixed: 2059895 --- core/mac/src/pe/sch/sch_beacon_process.c | 34 +++++++++++++++++++----- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/core/mac/src/pe/sch/sch_beacon_process.c b/core/mac/src/pe/sch/sch_beacon_process.c index 7bcbe9f127c2..32ea95b28749 100644 --- a/core/mac/src/pe/sch/sch_beacon_process.c +++ b/core/mac/src/pe/sch/sch_beacon_process.c @@ -535,7 +535,7 @@ sch_bcn_update_he_ies(tpAniSirGlobal mac_ctx, tpDphHashNode sta_ds, static void sch_bcn_update_opmode_change(tpAniSirGlobal mac_ctx, tpDphHashNode sta_ds, tpPESession session, tpSchBeaconStruct bcn, - tpSirMacMgmtHdr mac_hdr) + tpSirMacMgmtHdr mac_hdr, uint8_t cb_mode) { bool skip_opmode_update = false; uint8_t oper_mode; @@ -543,10 +543,22 @@ sch_bcn_update_opmode_change(tpAniSirGlobal mac_ctx, tpDphHashNode sta_ds, uint8_t ch_width = 0; if (session->vhtCapability && bcn->OperatingMode.present) { + update_nss(mac_ctx, sta_ds, bcn, session, mac_hdr); oper_mode = get_operating_channel_width(sta_ds); if ((oper_mode == eHT_CHANNEL_WIDTH_80MHZ) && (bcn->OperatingMode.chanWidth > eHT_CHANNEL_WIDTH_80MHZ)) skip_opmode_update = true; + if (WNI_CFG_CHANNEL_BONDING_MODE_DISABLE == cb_mode) { + /* + * if channel bonding is disabled from INI and + * receiving beacon which has operating mode IE + * containing channel width change then don't update + * CH_WIDTH + */ + pe_err("CB disabled & CH_WIDTH changed old[%d] new[%d]", + oper_mode, bcn->OperatingMode.chanWidth); + return; + } if (!skip_opmode_update && ((oper_mode != bcn->OperatingMode.chanWidth) || @@ -608,6 +620,17 @@ sch_bcn_update_opmode_change(tpAniSirGlobal mac_ctx, tpDphHashNode sta_ds, (oper_mode < bcn->VHTOperation.chanWidth)) skip_opmode_update = true; + if (WNI_CFG_CHANNEL_BONDING_MODE_DISABLE == cb_mode) { + /* + * if channel bonding is disabled from INI and + * receiving beacon which has operating mode IE + * containing channel width change then don't update + * CH_WIDTH + */ + pe_err("CB disabled & CH_WIDTH changed old[%d] new[%d]", + oper_mode, bcn->OperatingMode.chanWidth); + return; + } if (!skip_opmode_update && (oper_mode != bcn->VHTOperation.chanWidth)) { pe_debug("received VHTOP CHWidth %d staIdx = %d", @@ -695,12 +718,11 @@ sch_bcn_process_sta_ibss(tpAniSirGlobal mac_ctx, /* check for VHT capability */ pStaDs = dph_lookup_hash_entry(mac_ctx, pMh->sa, &aid, &session->dph.dphHashTable); - if ((NULL == pStaDs) || - (WNI_CFG_CHANNEL_BONDING_MODE_DISABLE == cb_mode) || - ((NULL != pStaDs) && - (STA_INVALID_IDX == pStaDs->staIndex))) + if ((NULL == pStaDs) || ((NULL != pStaDs) && + (STA_INVALID_IDX == pStaDs->staIndex))) return; - sch_bcn_update_opmode_change(mac_ctx, pStaDs, session, bcn, pMh); + sch_bcn_update_opmode_change(mac_ctx, pStaDs, session, bcn, pMh, + cb_mode); sch_bcn_update_he_ies(mac_ctx, pStaDs, session, bcn, pMh); return; }