From aad545423d3138c78473c74185a47948d6cd3262 Mon Sep 17 00:00:00 2001 From: Arif Hussain Date: Tue, 28 Aug 2018 00:02:02 -0700 Subject: [PATCH] qcacld-3.0: Disable uAPSD if TWT is allowed Disable uAPSD if TWT can be allowed for a given session. Change-Id: Ia2d0b4b1ab5fc7fd703db66fda28e16a1e611c56 CRs-Fixed: 2287743 --- core/sme/src/csr/csr_api_roam.c | 37 +++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 19d5258a9a..c65c2ba959 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -15516,6 +15516,39 @@ static bool csr_enable_twt(tDot11fBeaconIEs *ie) return ie->QCN_IE.present; } +/** + * csr_enable_uapsd() - Used to disable uapsd if both twt and uapsd is enabled + * @mac_ctx: pointer to global mac structure + * @ie: pointer to beacon/probe resp ie's + * + * Return: true or flase + */ +static bool csr_enable_uapsd(tpAniSirGlobal mac_ctx, tDot11fBeaconIEs *ie) +{ + uint32_t value = 0; + QDF_STATUS status = QDF_STATUS_E_FAILURE; + + /* In non-HE case, TWT is enabled only for Q2Q. + * So keed uAPSD enabled for non-Q2Q in this non-HE case. + */ + if (!csr_enable_twt(ie)) + return true; + + if (!ie) { + sme_debug("Beacon ie buffer is null"); + return true; + } + + CFG_GET_INT(status, mac_ctx, WNI_CFG_TWT_REQUESTOR, value); + if ((value || IS_FEATURE_SUPPORTED_BY_FW(DOT11AX)) && + ie->he_cap.twt_responder) { + sme_debug("twt supported, disable uapsd"); + return false; + } + + return true; +} + /** * The communication between HDD and LIM is thru mailbox (MB). * Both sides will access the data structure "tSirSmeJoinReq". @@ -15808,7 +15841,6 @@ QDF_STATUS csr_send_join_req_msg(tpAniSirGlobal pMac, uint32_t sessionId, sme_debug("CSR PERSONA: %d CSR CbMode: %d force 24gh ht20 %d", pProfile->csrPersona, pSession->bssParams.cbMode, csr_join_req->force_24ghz_in_ht20); - csr_join_req->uapsdPerAcBitmask = pProfile->uapsd_mask; pSession->uapsd_mask = pProfile->uapsd_mask; status = csr_get_rate_set(pMac, pProfile, @@ -16352,7 +16384,8 @@ QDF_STATUS csr_send_join_req_msg(tpAniSirGlobal pMac, uint32_t sessionId, &csr_join_req->supportedChannels.numChnl, false); - csr_join_req->uapsdPerAcBitmask = (uint8_t)pProfile->uapsd_mask; + if (csr_enable_uapsd(pMac, pIes)) + csr_join_req->uapsdPerAcBitmask = pProfile->uapsd_mask; /* Move the entire BssDescription into the join request. */ qdf_mem_copy(&csr_join_req->bssDescription, pBssDescription, pBssDescription->length +