Browse Source

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
Arif Hussain 6 năm trước cách đây
mục cha
commit
aad545423d
1 tập tin đã thay đổi với 35 bổ sung2 xóa
  1. 35 2
      core/sme/src/csr/csr_api_roam.c

+ 35 - 2
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 +