Browse Source

qcacld-3.0: Add support for HE OM control configuration

Add support for configuring the HE OM control field

Change-Id: I2b934411d16f006f53d068a51af54a14dbd01a46
CRs-Fixed: 2311409
Kiran Kumar Lokere 6 years ago
parent
commit
9463415ae2
4 changed files with 175 additions and 0 deletions
  1. 25 0
      core/hdd/src/wlan_hdd_cfg80211.c
  2. 4 0
      core/mac/inc/ani_global.h
  3. 34 0
      core/sme/inc/sme_api.h
  4. 112 0
      core/sme/src/common/sme_api.c

+ 25 - 0
core/hdd/src/wlan_hdd_cfg80211.c

@@ -5165,6 +5165,12 @@ wlan_hdd_wifi_test_config_policy[
 			.type = NLA_U8},
 		[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_OM_CTRL_SUPP] = {
 			.type = NLA_U8},
+		[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_OM_CTRL_BW] = {
+			.type = NLA_U8},
+		[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_OM_CTRL_NSS] = {
+			.type = NLA_U8},
+		[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_CLEAR_HE_OM_CTRL_CONFIG] = {
+			.type = NLA_FLAG},
 };
 
 /**
@@ -6190,6 +6196,7 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy,
 	bool bval = false;
 	uint8_t value = 0;
 	uint8_t wmm_mode = 0;
+	uint32_t cmd_id;
 
 	hdd_enter_dev(dev);
 
@@ -6512,6 +6519,24 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy,
 						     cfg_val);
 	}
 
+	cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_OM_CTRL_BW;
+	if (tb[cmd_id]) {
+		cfg_val = nla_get_u8(tb[cmd_id]);
+		ret_val = sme_send_he_om_ctrl_bw_update(hdd_ctx->mac_handle,
+							adapter->session_id,
+							cfg_val);
+	}
+	cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_OM_CTRL_NSS;
+	if (tb[cmd_id]) {
+		cfg_val = nla_get_u8(tb[cmd_id]);
+		ret_val = sme_send_he_om_ctrl_nss_update(hdd_ctx->mac_handle,
+							 adapter->session_id,
+							 cfg_val);
+	}
+
+	if (tb[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_CLEAR_HE_OM_CTRL_CONFIG])
+		sme_reset_he_om_ctrl(hdd_ctx->mac_handle);
+
 	if (update_sme_cfg)
 		sme_update_config(mac_handle, sme_config);
 

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

@@ -908,6 +908,10 @@ struct mac_context {
 	struct mgmt_beacon_probe_filter bcn_filter;
 	tSirMacEdcaParamRecord usr_mu_edca_params[MAX_NUM_AC];
 	bool usr_cfg_mu_edca_params;
+	bool he_om_ctrl_cfg_bw_set;
+	uint8_t he_om_ctrl_cfg_bw;
+	bool he_om_ctrl_cfg_nss_set;
+	uint8_t he_om_ctrl_cfg_nss;
 #ifdef WLAN_FEATURE_11AX
 	tDot11fIEhe_cap he_cap_2g;
 	tDot11fIEhe_cap he_cap_5g;

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

@@ -2611,6 +2611,22 @@ int sme_update_he_trigger_frm_mac_pad(mac_handle_t hal, uint8_t session_id,
  */
 int sme_update_he_om_ctrl_supp(mac_handle_t hal, uint8_t session_id,
 			       uint8_t cfg_val);
+
+#define NUM_OM_CTRL_UPDATE_CFG_PARAMS 7
+#define OM_CTRL_CMD_MAC_BITS31 1
+#define OM_CTRL_CMD_MAC_BITS47 2
+#define OM_CTRL_CMD_RX_NSS 3
+#define OM_CTRL_CMD_BW 4
+#define OM_CTRL_CMD_ULMU 5
+#define OM_CTRL_CMD_TX_NSS 6
+int sme_send_he_om_ctrl_bw_update(mac_handle_t hal, uint8_t session_id,
+				  uint8_t cfg_val);
+
+int sme_send_he_om_ctrl_nss_update(mac_handle_t hal, uint8_t session_id,
+				   uint8_t cfg_val);
+
+void sme_reset_he_om_ctrl(mac_handle_t hal);
+
 /**
  * sme_set_usr_cfg_mu_edca() - sets the user cfg MU EDCA params flag
  * @hal: Pointer to HAL
@@ -2715,6 +2731,24 @@ static inline int sme_update_he_om_ctrl_supp(mac_handle_t hal,
 	return 0;
 }
 
+static inline int sme_send_he_om_ctrl_bw_update(mac_handle_t hal,
+						uint8_t session_id,
+						uint8_t cfg_val)
+{
+	return 0;
+}
+
+static inline int sme_send_he_om_ctrl_nss_update(mac_handle_t hal,
+						 uint8_t session_id,
+						 uint8_t cfg_val)
+{
+	return 0;
+}
+
+static inline void sme_reset_he_om_ctrl(mac_handle_t hal)
+{
+}
+
 static inline void sme_set_usr_cfg_mu_edca(mac_handle_t hal, bool val)
 {
 }

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

@@ -12771,6 +12771,118 @@ int sme_update_he_om_ctrl_supp(mac_handle_t hal, uint8_t session_id,
 				 cfg_val);
 }
 
+int sme_send_he_om_ctrl_bw_update(mac_handle_t hal, uint8_t session_id,
+				  uint8_t cfg_val)
+{
+	uint32_t om_ctrl_cmd[NUM_OM_CTRL_UPDATE_CFG_PARAMS] = {0};
+	QDF_STATUS status;
+	tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
+	struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
+
+	if (!session) {
+		sme_err("Session does not exist, Session_id: %d", session_id);
+		return -EINVAL;
+	}
+	if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
+		sme_info("STA is not connected, Session_id: %d", session_id);
+		return -EINVAL;
+	}
+	if (cfg_val > session->connectedProfile.vht_channel_width) {
+		sme_info("OM ctrl BW %d is greater than connected BW %d",
+			  cfg_val, session->connectedProfile.vht_channel_width);
+		return -EINVAL;
+	}
+	mac_ctx->he_om_ctrl_cfg_bw_set = true;
+	mac_ctx->he_om_ctrl_cfg_bw = cfg_val;
+	om_ctrl_cmd[0] = 1;
+	qdf_mem_copy((void *)&om_ctrl_cmd[OM_CTRL_CMD_MAC_BITS31],
+		     (void *)session->connectedProfile.bssid.bytes,
+		     sizeof(uint32_t));
+	qdf_mem_copy((void *)&om_ctrl_cmd[OM_CTRL_CMD_MAC_BITS47],
+		     (void *)&session->connectedProfile.bssid.bytes[4],
+		     sizeof(uint16_t));
+	if (mac_ctx->he_om_ctrl_cfg_nss_set) {
+		om_ctrl_cmd[OM_CTRL_CMD_RX_NSS] =
+			mac_ctx->he_om_ctrl_cfg_nss - 1;
+		om_ctrl_cmd[OM_CTRL_CMD_TX_NSS] =
+			mac_ctx->he_om_ctrl_cfg_nss - 1;
+	} else {
+		om_ctrl_cmd[OM_CTRL_CMD_RX_NSS] = session->nss - 1;
+		om_ctrl_cmd[OM_CTRL_CMD_TX_NSS] = session->nss - 1;
+	}
+	om_ctrl_cmd[OM_CTRL_CMD_BW] = cfg_val;
+	om_ctrl_cmd[OM_CTRL_CMD_ULMU] = 1;
+	status = wma_form_unit_test_cmd_and_send(session_id, 13, 7,
+						 om_ctrl_cmd);
+	if (QDF_STATUS_SUCCESS != status) {
+		sme_err("send_unit_test_cmd returned %d", status);
+		return -EIO;
+	}
+
+	return 0;
+}
+
+int sme_send_he_om_ctrl_nss_update(mac_handle_t hal, uint8_t session_id,
+				  uint8_t cfg_val)
+{
+	uint32_t om_ctrl_cmd[NUM_OM_CTRL_UPDATE_CFG_PARAMS] = {0};
+	QDF_STATUS status;
+	tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
+	struct csr_roam_session *session = CSR_GET_SESSION(mac_ctx, session_id);
+
+	if (!session) {
+		sme_err("Session does not exist, Session_id: %d", session_id);
+		return -EINVAL;
+	}
+	if (!csr_is_conn_state_connected_infra(mac_ctx, session_id)) {
+		sme_info("STA not in connected state Session_id: %d",
+			 session_id);
+		return -EINVAL;
+	}
+	if (cfg_val > session->nss) {
+		sme_info("OM ctrl Nss %d is greater than connected Nss %d",
+			 cfg_val, session->nss);
+		return -EINVAL;
+	}
+	mac_ctx->he_om_ctrl_cfg_nss_set = true;
+	mac_ctx->he_om_ctrl_cfg_nss = cfg_val;
+	om_ctrl_cmd[0] = 1;
+	qdf_mem_copy((void *)&om_ctrl_cmd[OM_CTRL_CMD_MAC_BITS31],
+		     (void *)session->connectedProfile.bssid.bytes,
+		     sizeof(uint32_t));
+	qdf_mem_copy((void *)&om_ctrl_cmd[OM_CTRL_CMD_MAC_BITS47],
+		     (void *)&session->connectedProfile.bssid.bytes[4],
+		     sizeof(uint16_t));
+
+	if (mac_ctx->he_om_ctrl_cfg_bw_set)
+		om_ctrl_cmd[OM_CTRL_CMD_BW] = mac_ctx->he_om_ctrl_cfg_bw;
+	else
+		om_ctrl_cmd[OM_CTRL_CMD_BW] =
+			session->connectedProfile.vht_channel_width;
+
+	om_ctrl_cmd[OM_CTRL_CMD_RX_NSS] = cfg_val - 1;
+	om_ctrl_cmd[OM_CTRL_CMD_TX_NSS] = cfg_val - 1;
+	om_ctrl_cmd[OM_CTRL_CMD_ULMU] = 1;
+	status = wma_form_unit_test_cmd_and_send(session_id, 13, 7,
+						 om_ctrl_cmd);
+	if (QDF_STATUS_SUCCESS != status) {
+		sme_err("send_unit_test_cmd returned %d", status);
+		return -EIO;
+	}
+
+	return 0;
+}
+
+void sme_reset_he_om_ctrl(mac_handle_t hal)
+{
+	tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
+
+	mac_ctx->he_om_ctrl_cfg_bw_set = false;
+	mac_ctx->he_om_ctrl_cfg_nss_set = false;
+	mac_ctx->he_om_ctrl_cfg_bw = 0;
+	mac_ctx->he_om_ctrl_cfg_nss = 0;
+}
+
 int sme_update_he_tx_bfee_nsts(mac_handle_t hal, uint8_t session_id,
 			       uint8_t cfg_val)
 {