Kaynağa Gözat

qcacld-3.0: Add support to set no ack policy for ac

Add support to configure no ack policy for WMM access category.

Change-Id: Idf87507b78cdaf0ac8fdfc975e4fcbe0957423fa
CRs-Fixed: 2198241
Kiran Kumar Lokere 7 yıl önce
ebeveyn
işleme
3324f63c57

+ 21 - 1
core/hdd/src/wlan_hdd_cfg80211.c

@@ -6300,6 +6300,10 @@ wlan_hdd_wifi_test_config_policy[
 			.type = NLA_U8},
 		[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_ADDBA_BUFF_SIZE] = {
 			.type = NLA_U8},
+		[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_ENABLE_NO_ACK] = {
+			.type = NLA_U8},
+		[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_NO_ACK_AC] = {
+			.type = NLA_U8},
 };
 
 /**
@@ -7280,7 +7284,7 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy,
 	uint8_t set_val = 0;
 	tSmeConfigParams *sme_config;
 	bool update_sme_cfg = false;
-	uint8_t tid = 0;
+	uint8_t tid = 0, ac;
 	uint16_t buff_size = 0;
 
 	ENTER_DEV(dev);
@@ -7434,6 +7438,22 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy,
 				WMI_VDEV_PARAM_BA_MODE, set_val, VDEV_CMD);
 	}
 
+	if (tb[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_ENABLE_NO_ACK]) {
+		if (tb[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_NO_ACK_AC]) {
+			ac = nla_get_u8(tb[
+			     QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_NO_ACK_AC]);
+		} else {
+			hdd_err("AC is not set for NO ACK policy config");
+			ret_val = -EINVAL;
+			goto send_err;
+		}
+		cfg_val = nla_get_u8(tb[
+			QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_ENABLE_NO_ACK]);
+		hdd_debug("Set NO_ACK to %d for ac %d", cfg_val, ac);
+		ret_val = sme_set_no_ack_policy(hdd_ctx->hHal,
+				adapter->session_id, cfg_val, ac);
+	}
+
 	if (update_sme_cfg)
 		sme_update_config(hdd_ctx->hHal, sme_config);
 

+ 1 - 0
core/mac/inc/ani_global.h

@@ -956,6 +956,7 @@ typedef struct sAniSirGlobal {
 	bool is_11k_offload_supported;
 	uint8_t reject_addba_req;
 	uint16_t usr_cfg_ba_buff_size;
+	uint8_t no_ack_policy_cfg[MAX_NUM_AC];
 } tAniSirGlobal;
 
 

+ 1 - 0
core/mac/inc/sir_mac_prot_def.h

@@ -1166,6 +1166,7 @@ typedef struct sSirMacEdcaParamRecord {
 	tSirMacAciAifsn aci;
 	tSirMacCW cw;
 	uint16_t txoplimit;
+	uint8_t no_ack;
 } qdf_packed tSirMacEdcaParamRecord;
 
 typedef struct sSirMacQosInfo {

+ 10 - 0
core/mac/src/pe/lim/lim_send_messages.c

@@ -366,6 +366,16 @@ void lim_set_active_edca_params(tpAniSirGlobal mac_ctx,
 	pe_session->gLimEdcaParamsActive[EDCA_AC_BK] = edca_params[EDCA_AC_BK];
 	pe_session->gLimEdcaParamsActive[EDCA_AC_VI] = edca_params[EDCA_AC_VI];
 	pe_session->gLimEdcaParamsActive[EDCA_AC_VO] = edca_params[EDCA_AC_VO];
+
+	pe_session->gLimEdcaParamsActive[EDCA_AC_BE].no_ack =
+					mac_ctx->no_ack_policy_cfg[EDCA_AC_BE];
+	pe_session->gLimEdcaParamsActive[EDCA_AC_BK].no_ack =
+					mac_ctx->no_ack_policy_cfg[EDCA_AC_BK];
+	pe_session->gLimEdcaParamsActive[EDCA_AC_VI].no_ack =
+					mac_ctx->no_ack_policy_cfg[EDCA_AC_VI];
+	pe_session->gLimEdcaParamsActive[EDCA_AC_VO].no_ack =
+					mac_ctx->no_ack_policy_cfg[EDCA_AC_VO];
+
 	/* An AC requires downgrade if the ACM bit is set, and the AC has not
 	 * yet been admitted in uplink or bi-directions.
 	 * If an AC requires downgrade, it will downgrade to the next beset AC

+ 12 - 0
core/sme/inc/sme_api.h

@@ -2141,6 +2141,18 @@ int sme_set_ba_buff_size(tHalHandle hal, uint8_t session_id,
 int sme_send_addba_req(tHalHandle hal, uint8_t session_id, uint8_t tid,
 		uint16_t buff_size);
 
+/**
+ * sme_set_no_ack_policy() - Sets no ack policy for AC
+ * @hal: Pointer to HAL
+ * @session_id: SME session id
+ * @val: no ack policy value
+ * @ac: access category
+ *
+ * Return: 0 on success else err code
+ */
+int sme_set_no_ack_policy(tHalHandle hal, uint8_t session_id,
+		uint8_t val, uint8_t ac);
+
 #ifdef WLAN_FEATURE_11AX
 /**
  * sme_update_he_cap_nss() - sets the nss based on user request

+ 25 - 0
core/sme/src/common/sme_api.c

@@ -10157,6 +10157,31 @@ int sme_send_addba_req(tHalHandle hal, uint8_t session_id, uint8_t tid,
 	return 0;
 }
 
+int sme_set_no_ack_policy(tHalHandle hal, uint8_t session_id,
+		uint8_t val, uint8_t ac)
+{
+	tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
+	uint8_t i, set_val;
+
+	if (ac > MAX_NUM_AC) {
+		sme_err("invalid ac val %d", ac);
+		return -EINVAL;
+	}
+	if (val)
+		set_val = 1;
+	else
+		set_val = 0;
+	if (ac == MAX_NUM_AC) {
+		for (i = 0; i < ac; i++)
+			mac_ctx->no_ack_policy_cfg[i] = set_val;
+	} else {
+		mac_ctx->no_ack_policy_cfg[ac] = set_val;
+	}
+	sme_debug("no ack is set to %d for ac %d", set_val, ac);
+
+	return 0;
+}
+
 #define HT20_SHORT_GI_MCS7_RATE 722
 /*
  * sme_send_rate_update_ind() -

+ 1 - 2
core/wma/src/wma_power.c

@@ -328,8 +328,7 @@ void wma_update_edca_params_for_ac(tSirMacEdcaParamRecord *edca_param,
 	wmm_param->txoplimit = edca_param->txoplimit;
 	wmm_param->acm = edca_param->aci.acm;
 
-	/* TODO: No ack is not present in EdcaParamRecord */
-	wmm_param->noackpolicy = 0;
+	wmm_param->noackpolicy = edca_param->no_ack;
 
 	WMA_LOGD("WMM PARAMS AC[%d]: AIFS %d Min %d Max %d TXOP %d ACM %d NOACK %d",
 		ac, wmm_param->aifs, wmm_param->cwmin, wmm_param->cwmax,