Эх сурвалжийг харах

qcacld-3.0: Update NSS for SAP dynamically

Currently host driver does not support dynamic NSS update for
SAP. Based on new requirement update NSS for SAP.
To achieve this requirement, add a logic to update the NSS and
restart the SAP with the updated NSS based on the ini.

Change-Id: Ie770b1103ba4050c48cd4ba3674a5e0d89c86fdf
CRs-Fixed: 3307308
Ashish Kumar Dhanotiya 2 жил өмнө
parent
commit
3297080714

+ 3 - 0
components/mlme/core/src/wlan_mlme_main.c

@@ -2348,6 +2348,9 @@ static void mlme_init_nss_chains(struct wlan_objmgr_psoc *psoc,
 					   cfg_get(psoc, CFG_DISABLE_TX_MRC_5G);
 	nss_chains->enable_dynamic_nss_chains_cfg =
 			cfg_get(psoc, CFG_ENABLE_DYNAMIC_NSS_CHAIN_CONFIG);
+	nss_chains->restart_sap_on_dyn_nss_chains_cfg =
+			cfg_get(psoc,
+				CFG_RESTART_SAP_ON_DYNAMIC_NSS_CHAINS_CONFIG);
 }
 
 static void mlme_init_wep_cfg(struct wlan_mlme_wep_cfg *wep_params)

+ 24 - 1
components/mlme/dispatcher/inc/cfg_mlme_nss_chains.h

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2012-2018, 2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -554,6 +555,27 @@
 					1, \
 					"enable dynamic nss chain config")
 
+/*
+ * <ini>
+ * restart_sap_on_dynamic_nss_chains_config - Decide whether SAP needs to be
+ * restarted on dynamic nss chains update
+ * @Min: 0
+ * @Max: 1
+ * @Default: 0
+ *
+ * Related: SAP/P2P.
+ *
+ * Supported Feature: Dynamic chainmask
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_RESTART_SAP_ON_DYNAMIC_NSS_CHAINS_CONFIG CFG_INI_BOOL( \
+				"restart_sap_on_dynamic_nss_chains_config", \
+				0, \
+				"Restart SAP on dynamic nss chain config")
+
 #define CFG_NSS_CHAINS_ALL \
 	CFG(CFG_NUM_TX_CHAINS_2G) \
 	CFG(CFG_NUM_TX_CHAINS_5G) \
@@ -570,7 +592,8 @@
 	CFG(CFG_DISABLE_RX_MRC_2G) \
 	CFG(CFG_DISABLE_TX_MRC_5G) \
 	CFG(CFG_DISABLE_RX_MRC_5G) \
-	CFG(CFG_ENABLE_DYNAMIC_NSS_CHAIN_CONFIG)
+	CFG(CFG_ENABLE_DYNAMIC_NSS_CHAIN_CONFIG) \
+	CFG(CFG_RESTART_SAP_ON_DYNAMIC_NSS_CHAINS_CONFIG)
 
 #endif /* __CFG_MLME_NSS_CHAINS */
 

+ 16 - 0
components/mlme/dispatcher/inc/wlan_mlme_api.h

@@ -2230,6 +2230,22 @@ QDF_STATUS
 wlan_mlme_get_enable_dynamic_nss_chains_cfg(struct wlan_objmgr_psoc *psoc,
 					    bool *value);
 
+/**
+ * wlan_mlme_get_restart_sap_on_dynamic_nss_chains_cfg() - API to get whether
+ * SAP needs to be restarted or not on dynamic nss chain config
+ * @psoc: psoc context
+ * @value: data to be set
+ *
+ * API to get whether SAP needs to be restarted or not on dynamic nss chain
+ * config
+ *
+ * Return: QDF_STATUS_SUCCESS or QDF_STATUS_FAILURE
+ */
+QDF_STATUS
+wlan_mlme_get_restart_sap_on_dynamic_nss_chains_cfg(
+						struct wlan_objmgr_psoc *psoc,
+						bool *value);
+
 /**
  * wlan_mlme_get_vht_enable2x2() - Enables/disables VHT Tx/Rx MCS values for 2x2
  * @psoc: psoc context

+ 3 - 0
components/mlme/dispatcher/inc/wlan_mlme_public_struct.h

@@ -1609,6 +1609,8 @@ enum dot11p_mode {
  * @disable_rx_mrc:                  disable 2 rx chains, in rx nss 1 mode
  * @disable_tx_mrc:                  disable 2 tx chains, in tx nss 1 mode
  * @enable_dynamic_nss_chains_cfg:   enable the dynamic nss chain config to FW
+ * @restart_sap_on_dyn_nss_chains_cfg: restart SAP on dynamic NSS chains
+ * update
  */
 struct wlan_mlme_nss_chains {
 	uint32_t num_tx_chains[NSS_CHAINS_BAND_MAX];
@@ -1621,6 +1623,7 @@ struct wlan_mlme_nss_chains {
 	bool disable_rx_mrc[NSS_CHAINS_BAND_MAX];
 	bool disable_tx_mrc[NSS_CHAINS_BAND_MAX];
 	bool enable_dynamic_nss_chains_cfg;
+	bool restart_sap_on_dyn_nss_chains_cfg;
 };
 
 /**

+ 19 - 0
components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h

@@ -2605,6 +2605,25 @@ ucfg_mlme_get_enable_dynamic_nss_chains_cfg(struct wlan_objmgr_psoc *psoc,
 	return wlan_mlme_get_enable_dynamic_nss_chains_cfg(psoc, value);
 }
 
+/**
+ * ucfg_mlme_get_restart_sap_on_dynamic_nss_chains_cfg() - API to get whether
+ * SAP needs to be restarted or not on dynamic nss chain config
+ * @psoc: psoc context
+ * @value: data to be set
+ *
+ * API to get whether SAP needs to be restarted or not on dynamic nss chain
+ * config
+ *
+ * Return: QDF_STATUS_SUCCESS or QDF_STATUS_FAILURE
+ */
+static inline QDF_STATUS
+ucfg_mlme_get_restart_sap_on_dynamic_nss_chains_cfg(
+					struct wlan_objmgr_psoc *psoc,
+					bool *value)
+{
+	return wlan_mlme_get_restart_sap_on_dynamic_nss_chains_cfg(psoc, value);
+}
+
 /**
  * ucfg_mlme_get_vht_enable2x2() - Enables/disables VHT Tx/Rx MCS values for 2x2
  * @psoc: psoc context

+ 17 - 0
components/mlme/dispatcher/src/wlan_mlme_api.c

@@ -3842,6 +3842,23 @@ wlan_mlme_get_enable_dynamic_nss_chains_cfg(struct wlan_objmgr_psoc *psoc,
 	return QDF_STATUS_SUCCESS;
 }
 
+QDF_STATUS
+wlan_mlme_get_restart_sap_on_dynamic_nss_chains_cfg(
+						struct wlan_objmgr_psoc *psoc,
+						bool *value)
+{
+	struct wlan_mlme_psoc_ext_obj *mlme_obj;
+
+	mlme_obj = mlme_get_psoc_ext_obj(psoc);
+	if (!mlme_obj)
+		return QDF_STATUS_E_FAILURE;
+
+	*value =
+	mlme_obj->cfg.nss_chains_ini_cfg.restart_sap_on_dyn_nss_chains_cfg;
+
+	return QDF_STATUS_SUCCESS;
+}
+
 QDF_STATUS
 wlan_mlme_get_vht_enable2x2(struct wlan_objmgr_psoc *psoc, bool *value)
 {

+ 53 - 19
core/hdd/src/wlan_hdd_cfg.c

@@ -1124,6 +1124,40 @@ hdd_set_nss_params(struct hdd_adapter *adapter,
 	return QDF_STATUS_SUCCESS;
 }
 
+static void
+hdd_update_nss_in_vdev(struct hdd_adapter *adapter, mac_handle_t mac_handle,
+		       uint8_t tx_nss, uint8_t rx_nss)
+{
+	uint8_t band, max_supp_nss = MAX_VDEV_NSS;
+
+	for (band = NSS_CHAINS_BAND_2GHZ; band < NSS_CHAINS_BAND_MAX;
+	     band++) {
+		/* This API will change the global ini in mlme cfg */
+		sme_update_nss_in_mlme_cfg(mac_handle, rx_nss, tx_nss,
+					   adapter->device_mode, band);
+		/*
+		 * This API will change the vdev nss params in mac
+		 * context
+		 */
+		sme_update_vdev_type_nss(mac_handle, max_supp_nss,
+					 band);
+	}
+	/*
+	 * This API will change the ini and dynamic nss params in
+	 * mlme vdev priv obj.
+	 */
+	hdd_store_nss_chains_cfg_in_vdev(adapter);
+}
+
+static void hdd_set_sap_nss_params(struct hdd_context *hdd_ctx,
+				   struct hdd_adapter *adapter,
+				   mac_handle_t mac_handle,
+				   uint8_t tx_nss, uint8_t rx_nss)
+{
+	hdd_update_nss_in_vdev(adapter, mac_handle, tx_nss, rx_nss);
+	hdd_restart_sap(adapter);
+}
+
 QDF_STATUS hdd_update_nss(struct hdd_adapter *adapter, uint8_t tx_nss,
 			  uint8_t rx_nss)
 {
@@ -1138,7 +1172,7 @@ QDF_STATUS hdd_update_nss(struct hdd_adapter *adapter, uint8_t tx_nss,
 	uint8_t enable2x2;
 	mac_handle_t mac_handle;
 	bool bval = 0;
-	uint8_t band, max_supp_nss;
+	bool restart_sap = 0;
 
 	if ((tx_nss == 2 || rx_nss == 2) && (hdd_ctx->num_rf_chains != 2)) {
 		hdd_err("No support for 2 spatial streams");
@@ -1162,7 +1196,6 @@ QDF_STATUS hdd_update_nss(struct hdd_adapter *adapter, uint8_t tx_nss,
 		hdd_err("NULL MAC handle");
 		return QDF_STATUS_E_INVAL;
 	}
-	max_supp_nss = MAX_VDEV_NSS;
 
 	/*
 	 * If FW is supporting the dynamic nss update, this command is meant to
@@ -1170,6 +1203,23 @@ QDF_STATUS hdd_update_nss(struct hdd_adapter *adapter, uint8_t tx_nss,
 	 * and not the global param enable2x2
 	 */
 	if (hdd_ctx->dynamic_nss_chains_support) {
+		ucfg_mlme_get_restart_sap_on_dynamic_nss_chains_cfg(
+								hdd_ctx->psoc,
+								&restart_sap);
+		if ((adapter->device_mode == QDF_SAP_MODE ||
+		     adapter->device_mode == QDF_P2P_GO_MODE) && restart_sap) {
+			if ((tx_nss == 2 && rx_nss == 2) ||
+			    (tx_nss == 1 && rx_nss == 1)) {
+				hdd_set_sap_nss_params(hdd_ctx, adapter,
+						       mac_handle, tx_nss,
+						       rx_nss);
+				return QDF_STATUS_SUCCESS;
+			}
+			hdd_err("tx_nss %d rx_nss %d not supported ",
+				tx_nss, rx_nss);
+			return QDF_STATUS_E_FAILURE;
+		}
+
 		if (hdd_is_vdev_in_conn_state(adapter))
 			return hdd_set_nss_params(adapter, tx_nss, rx_nss);
 		hdd_debug("Vdev %d in disconnect state, changing ini nss params",
@@ -1179,23 +1229,7 @@ QDF_STATUS hdd_update_nss(struct hdd_adapter *adapter, uint8_t tx_nss,
 			return QDF_STATUS_SUCCESS;
 		}
 
-		for (band = NSS_CHAINS_BAND_2GHZ; band < NSS_CHAINS_BAND_MAX;
-		     band++) {
-			/* This API will change the global ini in mlme cfg */
-			sme_update_nss_in_mlme_cfg(mac_handle, rx_nss, tx_nss,
-						   adapter->device_mode, band);
-			/*
-			 * This API will change the vdev nss params in mac
-			 * context
-			 */
-			sme_update_vdev_type_nss(mac_handle, max_supp_nss,
-						 band);
-		}
-		/*
-		 * This API will change the ini and dynamic nss params in
-		 * mlme vdev priv obj.
-		 */
-		hdd_store_nss_chains_cfg_in_vdev(adapter);
+		hdd_update_nss_in_vdev(adapter, mac_handle, tx_nss, rx_nss);
 
 		return QDF_STATUS_SUCCESS;
 	}