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

qcacmn: Optimize vdev and pdev set param command frequency

Currently host sends many vdev or pdev set param commands
separately to firmware.

Combine all vdev or pdev set params together where ever
possible, send to WMI.Based on service capability
WMI_SERVICE_COMBINED_SET_PARAM_SUPPORT, host decides whether
to send all set params to firmware at once to reduce number of
transactions or need to follow legacy way i.e send params
separately one after the other.

Change-Id: I0a36dd66a7ccb27f2ecd437cf7b9d08667e27472
CRs-Fixed: 3151418
Divyajyothi Goparaju 2 жил өмнө
parent
commit
3ec79c4856

+ 50 - 0
umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_tx_defs.h

@@ -30,6 +30,7 @@
 #ifdef WLAN_FEATURE_11BE_MLO
 #include <wlan_mlo_mgr_public_structs.h>
 #endif
+#include <wlan_mlme_dbg.h>
 
 /** slot time long */
 #define WLAN_MLME_VDEV_SLOT_TIME_LONG   0x1
@@ -38,6 +39,14 @@
 
 #define WLAN_MU_SNIF_MAX_AIDS 4
 
+/**
+ * enum mlme_dev_setparam - type of set params pdev/vdev
+ */
+enum mlme_dev_setparam {
+	MLME_PDEV_SETPARAM = 0,
+	MLME_VDEV_SETPARAM,
+};
+
 /**
  * enum MLME_bcn_tx_rate_code - beacon tx rate code
  */
@@ -666,6 +675,47 @@ struct vdev_set_params {
 	uint32_t param_value;
 };
 
+/**
+ * struct dev_set_param_info - vdev/pdev set param info
+ * @param_id: parameter id
+ * @param_value: parameter value
+ */
+struct dev_set_param {
+	uint32_t param_id;
+	uint32_t param_value;
+};
+
+/**
+ * struct set_multiple_pdev_vdev_param
+ * @param_type: enum of type mlme_dev_setparam
+ * @is_host_pdev_id: to indicate @dev_id holds host pdev id in case of pdev set
+ * param, need conversion to target pdev id before sending to fw.
+ * @dev_id: unique dev_id identifying the VDEV/PDEV
+ * @n_params: Number of parambers to set
+ * @params: pointer to dev_set_param structure
+ */
+struct set_multiple_pdev_vdev_param {
+	enum mlme_dev_setparam param_type;
+	uint8_t is_host_pdev_id;
+	uint8_t dev_id;
+	uint8_t n_params;
+	struct dev_set_param *params;
+};
+
+static inline
+QDF_STATUS mlme_check_index_setparam(struct dev_set_param *param,
+				     uint32_t paramid, uint32_t paramvalue,
+				     uint8_t index, uint8_t n_params)
+{
+	if (index >= n_params) {
+		mlme_err("Index:%d OOB to fill param", index);
+		return QDF_STATUS_E_FAILURE;
+	}
+	param[index].param_id = paramid;
+	param[index].param_value = paramvalue;
+	return QDF_STATUS_SUCCESS;
+}
+
 /**
  * struct vdev_set_mu_snif_params - vdev set mu sniffer cmd parameter
  * @vdev_id: vdev id

+ 22 - 0
wmi/inc/wmi_unified_api.h

@@ -892,6 +892,28 @@ QDF_STATUS
 wmi_unified_vdev_set_param_send(wmi_unified_t wmi_handle,
 				struct vdev_set_params *param);
 
+/**
+ * wmi_unified_multiple_vdev_param_send() - sends multiple vdev set params
+ * @wmi_handle: handle to WMI.
+ * @params: pointer to hold set_multiple_pdev_vdev_param info.
+ *
+ * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
+ */
+QDF_STATUS
+wmi_unified_multiple_vdev_param_send(wmi_unified_t wmi_handle,
+				     struct set_multiple_pdev_vdev_param *params);
+
+/**
+ * wmi_unified_multiple_pdev_param_send() - sends multiple pdev set params
+ * @wmi_handle: handle to WMI.
+ * @params: pointer to hold set_multiple_pdev_vdev_param info
+ *
+ * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
+ */
+QDF_STATUS
+wmi_unified_multiple_pdev_param_send(wmi_unified_t wmi_handle,
+				     struct set_multiple_pdev_vdev_param *params);
+
 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
 /**
  * wmi_unified_roam_set_param_send() - WMI roam set parameter function

+ 92 - 0
wmi/inc/wmi_unified_param.h

@@ -5288,6 +5288,43 @@ typedef enum {
 	wmi_pdev_param_rate_retry_mcs_drop,
 	wmi_pdev_param_mcs_probe_intvl,
 	wmi_pdev_param_nss_probe_intvl,
+	wmi_pdev_param_dtim_synth,
+	wmi_pdev_param_1ch_dtim_optimized_chain_selection,
+	wmi_pdev_param_tx_sch_delay,
+	wmi_pdev_param_en_update_scram_seed,
+	wmi_pdev_param_secondary_retry_enable,
+	wmi_pdev_param_set_sap_xlna_bypass,
+	wmi_pdev_param_set_dfs_chan_ageout_time,
+	wmi_pdev_param_pdev_stats_tx_xretry_ext,
+	wmi_pdev_param_smart_chainmask_scheme,
+	wmi_pdev_param_alternative_chainmask_scheme,
+	wmi_pdev_param_enable_rts_sifs_bursting,
+	wmi_pdev_param_max_mpdus_in_ampdu,
+	wmi_pdev_param_set_iot_pattern,
+	wmi_pdev_param_mwscoex_scc_chavd_delay,
+	wmi_pdev_param_mwscoex_pcc_chavd_delay,
+	wmi_pdev_param_mwscoex_set_5gnr_pwr_limit,
+	wmi_pdev_param_mwscoex_4g_allow_quick_ftdm,
+	wmi_pdev_param_fast_pwr_transition,
+	wmi_pdev_auto_detect_power_failure,
+	wmi_pdev_param_gcmp_support_enable,
+	wmi_pdev_param_abg_mode_tx_chain_num,
+	wmi_pdev_param_peer_stats_info_enable,
+	wmi_pdev_param_enable_cck_txfir_override,
+	wmi_pdev_param_twt_ac_config,
+	wmi_pdev_param_pcie_hw_ilp,
+	wmi_pdev_param_disable_hw_assist,
+	wmi_pdev_param_ant_div_usrcfg,
+	wmi_pdev_param_ctrl_retry_limit,
+	wmi_pdev_param_propagation_delay,
+	wmi_pdev_param_ena_ant_div,
+	wmi_pdev_param_force_chain_ant,
+	wmi_pdev_param_ant_div_selftest,
+	wmi_pdev_param_ant_div_selftest_intvl,
+	wmi_pdev_param_data_stall_detect_enable,
+	wmi_pdev_param_cts2self_for_p2p_go_config,
+	wmi_pdev_param_txpower_reason_sar,
+	wmi_pdev_param_stats_observation_period,
 	wmi_pdev_param_max,
 } wmi_conv_pdev_params_id;
 
@@ -5454,6 +5491,58 @@ typedef enum {
 	wmi_vdev_param_set_multi_client_ll_feature_config,
 #endif
 	wmi_vdev_param_set_traffic_config,
+	wmi_vdev_param_he_range_ext,
+	wmi_vdev_param_non_data_he_range_ext,
+	wmi_vdev_param_ndp_inactivity_timeout,
+	wmi_vdev_param_ndp_keepalive_timeout,
+	wmi_vdev_param_final_bmiss_time_sec,
+	wmi_vdev_param_final_bmiss_time_wow_sec,
+	wmi_vdev_param_ap_keepalive_max_idle_inactive_secs,
+	wmi_vdev_param_per_band_mgmt_tx_rate,
+	wmi_vdev_param_max_li_of_moddtim,
+	wmi_vdev_param_moddtim_cnt,
+	wmi_vdev_param_max_li_of_moddtim_ms,
+	wmi_vdev_param_dyndtim_cnt,
+	wmi_vdev_param_wmm_txop_enable,
+	wmi_vdev_param_enable_bcast_probe_response,
+	wmi_vdev_param_fils_max_channel_guard_time,
+	wmi_vdev_param_probe_delay,
+	wmi_vdev_param_repeat_probe_time,
+	wmi_vdev_param_enable_disable_oce_features,
+	wmi_vdev_param_enable_disable_nan_config_features,
+	wmi_vdev_param_rsn_capability,
+	wmi_vdev_param_smps_intolerant,
+	wmi_vdev_param_abg_mode_tx_chain_num,
+	wmi_vdev_param_nth_beacon_to_host,
+	wmi_vdev_param_prohibit_data_mgmt,
+	wmi_vdev_param_skip_roam_eapol_4way_handshake,
+	wmi_vdev_param_skip_sae_roam_4way_handshake,
+	wmi_vdev_param_roam_11kv_ctrl,
+	wmi_vdev_param_disable_noa_p2p_go,
+	wmi_vdev_param_packet_capture_mode,
+	wmi_vdev_param_smart_monitor_config,
+	wmi_vdev_param_force_dtim_cnt,
+	wmi_vdev_param_sho_config,
+	wmi_vdev_param_gtx_enable,
+	wmi_vdev_param_mu_edca_fw_update_en,
+	wmi_vdev_param_enable_disable_rtt_initiator_random_mac,
+	wmi_vdev_param_allow_nan_initial_discovery_of_mp0_cluster,
+	wmi_vdev_param_txpower_scale_decr_db,
+	wmi_vdev_param_txpower_scale,
+	wmi_vdev_param_agg_sw_retry_th,
+	wmi_vdev_param_obsspd,
+	wmi_vdev_param_multi_client_ll_feature_configuration,
+	wmi_vdev_param_normal_latency_flags_configuration,
+	wmi_vdev_param_xr_latency_flags_configuration,
+	wmi_vdev_param_low_latency_flags_configuration,
+	wmi_vdev_param_ultra_low_latency_flags_configuration,
+	wmi_vdev_param_normal_latency_ul_dl_configuration,
+	wmi_vdev_param_xr_latency_ul_dl_configuration,
+	wmi_vdev_param_low_latency_ul_dl_configuration,
+	wmi_vdev_param_ultra_low_latency_ul_dl_configuration,
+	wmi_vdev_param_default_latency_level_configuration,
+	wmi_vdev_param_amsdu_aggregation_size_optimization,
+	wmi_vdev_param_non_agg_sw_retry_th,
 } wmi_conv_vdev_param_id;
 
 /**
@@ -5788,6 +5877,9 @@ typedef enum {
 	wmi_service_linkspeed_roam_trigger_support,
 #ifdef FEATURE_SET
 	wmi_service_feature_set_event_support,
+#endif
+#ifdef WLAN_PDEV_VDEV_SEND_MULTI_PARAM
+	wmi_service_combined_set_param_support,
 #endif
 	wmi_services_max,
 } wmi_conv_service_ids;

+ 8 - 0
wmi/inc/wmi_unified_priv.h

@@ -555,10 +555,14 @@ QDF_STATUS
 (*send_pdev_utf_cmd)(wmi_unified_t wmi_handle,
 				struct pdev_utf_params *param,
 				uint8_t mac_id);
+
 QDF_STATUS
 (*send_pdev_param_cmd)(wmi_unified_t wmi_handle,
 			   struct pdev_params *param,
 				uint8_t mac_id);
+QDF_STATUS
+(*send_multiple_pdev_param_cmd)(wmi_unified_t wmi_handle,
+				struct set_multiple_pdev_vdev_param *params);
 
 QDF_STATUS
 (*send_pdev_set_hw_mode_cmd)(wmi_unified_t wmi_handle,
@@ -605,6 +609,10 @@ QDF_STATUS
 QDF_STATUS (*send_vdev_set_param_cmd)(wmi_unified_t wmi_handle,
 				struct vdev_set_params *param);
 
+QDF_STATUS
+(*send_multiple_vdev_param_cmd)(wmi_unified_t wmi_handle,
+				struct set_multiple_pdev_vdev_param *params);
+
 QDF_STATUS (*send_vdev_set_mu_snif_cmd)(wmi_unified_t wmi_handle,
 					struct vdev_set_mu_snif_param *param);
 

+ 21 - 0
wmi/src/wmi_unified_api.c

@@ -291,6 +291,27 @@ wmi_unified_pdev_param_send(wmi_unified_t wmi_handle,
 	return QDF_STATUS_E_FAILURE;
 }
 
+QDF_STATUS
+wmi_unified_multiple_pdev_param_send(wmi_unified_t wmi_handle,
+				     struct set_multiple_pdev_vdev_param *params)
+{
+	if (wmi_handle->ops->send_multiple_pdev_param_cmd)
+		return wmi_handle->ops->send_multiple_pdev_param_cmd(wmi_handle,
+								     params);
+
+	return QDF_STATUS_E_FAILURE;
+}
+
+QDF_STATUS
+wmi_unified_multiple_vdev_param_send(wmi_unified_t wmi_handle,
+				     struct set_multiple_pdev_vdev_param *params)
+{
+	if (wmi_handle->ops->send_multiple_vdev_param_cmd)
+		return wmi_handle->ops->send_multiple_vdev_param_cmd(wmi_handle,
+								     params);
+	return QDF_STATUS_E_FAILURE;
+}
+
 QDF_STATUS wmi_unified_suspend_send(wmi_unified_t wmi_handle,
 				    struct suspend_params *param,
 				    uint8_t mac_id)

+ 424 - 21
wmi/src/wmi_unified_tlv.c

@@ -368,6 +368,70 @@ static const uint32_t pdev_param_tlv[] = {
 		WMI_PDEV_PARAM_MIN_MAX_MCS_PROBE_INTERVAL,
 	[wmi_pdev_param_nss_probe_intvl] =
 		WMI_PDEV_PARAM_MIN_MAX_NSS_PROBE_INTERVAL,
+	[wmi_pdev_param_dtim_synth] = WMI_PDEV_PARAM_DTIM_SYNTH,
+	[wmi_pdev_param_1ch_dtim_optimized_chain_selection] =
+			WMI_PDEV_PARAM_1CH_DTIM_OPTIMIZED_CHAIN_SELECTION,
+	[wmi_pdev_param_tx_sch_delay] = WMI_PDEV_PARAM_TX_SCH_DELAY,
+	[wmi_pdev_param_en_update_scram_seed] =
+					WMI_PDEV_PARAM_EN_UPDATE_SCRAM_SEED,
+	[wmi_pdev_param_secondary_retry_enable] =
+					WMI_PDEV_PARAM_SECONDARY_RETRY_ENABLE,
+	[wmi_pdev_param_set_sap_xlna_bypass] =
+					WMI_PDEV_PARAM_SET_SAP_XLNA_BYPASS,
+	[wmi_pdev_param_set_dfs_chan_ageout_time] =
+					WMI_PDEV_PARAM_SET_DFS_CHAN_AGEOUT_TIME,
+	[wmi_pdev_param_pdev_stats_tx_xretry_ext] =
+					WMI_PDEV_PARAM_PDEV_STATS_TX_XRETRY_EXT,
+	[wmi_pdev_param_smart_chainmask_scheme] =
+					WMI_PDEV_PARAM_SMART_CHAINMASK_SCHEME,
+	[wmi_pdev_param_alternative_chainmask_scheme] =
+				WMI_PDEV_PARAM_ALTERNATIVE_CHAINMASK_SCHEME,
+	[wmi_pdev_param_enable_rts_sifs_bursting] =
+					WMI_PDEV_PARAM_ENABLE_RTS_SIFS_BURSTING,
+	[wmi_pdev_param_max_mpdus_in_ampdu] = WMI_PDEV_PARAM_MAX_MPDUS_IN_AMPDU,
+	[wmi_pdev_param_set_iot_pattern] = WMI_PDEV_PARAM_SET_IOT_PATTERN,
+	[wmi_pdev_param_mwscoex_scc_chavd_delay] =
+					WMI_PDEV_PARAM_MWSCOEX_SCC_CHAVD_DELAY,
+	[wmi_pdev_param_mwscoex_pcc_chavd_delay] =
+					WMI_PDEV_PARAM_MWSCOEX_PCC_CHAVD_DELAY,
+	[wmi_pdev_param_mwscoex_set_5gnr_pwr_limit] =
+				WMI_PDEV_PARAM_MWSCOEX_SET_5GNR_PWR_LIMIT,
+	[wmi_pdev_param_mwscoex_4g_allow_quick_ftdm] =
+				WMI_PDEV_PARAM_MWSCOEX_4G_ALLOW_QUICK_FTDM,
+	[wmi_pdev_param_fast_pwr_transition] =
+					WMI_PDEV_PARAM_FAST_PWR_TRANSITION,
+	[wmi_pdev_auto_detect_power_failure] =
+					WMI_PDEV_AUTO_DETECT_POWER_FAILURE,
+	[wmi_pdev_param_gcmp_support_enable] =
+					WMI_PDEV_PARAM_GCMP_SUPPORT_ENABLE,
+	[wmi_pdev_param_abg_mode_tx_chain_num] =
+					WMI_PDEV_PARAM_ABG_MODE_TX_CHAIN_NUM,
+	[wmi_pdev_param_peer_stats_info_enable] =
+					WMI_PDEV_PARAM_PEER_STATS_INFO_ENABLE,
+	[wmi_pdev_param_enable_cck_txfir_override] =
+				WMI_PDEV_PARAM_ENABLE_CCK_TXFIR_OVERRIDE,
+	[wmi_pdev_param_twt_ac_config] = WMI_PDEV_PARAM_TWT_AC_CONFIG,
+	[wmi_pdev_param_pcie_hw_ilp] = WMI_PDEV_PARAM_PCIE_HW_ILP,
+	[wmi_pdev_param_disable_hw_assist] = WMI_PDEV_PARAM_DISABLE_HW_ASSIST,
+	[wmi_pdev_param_ant_div_usrcfg] = WMI_PDEV_PARAM_ANT_DIV_USRCFG,
+	[wmi_pdev_param_ctrl_retry_limit] = WMI_PDEV_PARAM_CTRL_RETRY_LIMIT,
+	[wmi_pdev_param_propagation_delay] = WMI_PDEV_PARAM_PROPAGATION_DELAY,
+	[wmi_pdev_param_ena_ant_div] = WMI_PDEV_PARAM_ENA_ANT_DIV,
+	[wmi_pdev_param_force_chain_ant] = WMI_PDEV_PARAM_FORCE_CHAIN_ANT,
+	[wmi_pdev_param_ant_div_selftest] = WMI_PDEV_PARAM_ANT_DIV_SELFTEST,
+	[wmi_pdev_param_ant_div_selftest_intvl] =
+					WMI_PDEV_PARAM_ANT_DIV_SELFTEST_INTVL,
+	[wmi_pdev_param_1ch_dtim_optimized_chain_selection] =
+			WMI_PDEV_PARAM_1CH_DTIM_OPTIMIZED_CHAIN_SELECTION,
+	[wmi_pdev_param_data_stall_detect_enable] =
+					WMI_PDEV_PARAM_DATA_STALL_DETECT_ENABLE,
+	[wmi_pdev_param_max_mpdus_in_ampdu] =
+					WMI_PDEV_PARAM_MAX_MPDUS_IN_AMPDU,
+	[wmi_pdev_param_stats_observation_period] =
+					WMI_PDEV_PARAM_STATS_OBSERVATION_PERIOD,
+	[wmi_pdev_param_cts2self_for_p2p_go_config] =
+				WMI_PDEV_PARAM_CTS2SELF_FOR_P2P_GO_CONFIG,
+	[wmi_pdev_param_txpower_reason_sar] = WMI_PDEV_PARAM_TXPOWER_REASON_SAR,
 };
 
 /**
@@ -576,6 +640,85 @@ static const uint32_t vdev_param_tlv[] = {
 #endif
 	[wmi_vdev_param_set_traffic_config] =
 			WMI_VDEV_PARAM_VDEV_TRAFFIC_CONFIG,
+	[wmi_vdev_param_he_range_ext] = WMI_VDEV_PARAM_HE_RANGE_EXT,
+	[wmi_vdev_param_non_data_he_range_ext] =
+					WMI_VDEV_PARAM_NON_DATA_HE_RANGE_EXT,
+	[wmi_vdev_param_ndp_inactivity_timeout] =
+					WMI_VDEV_PARAM_NDP_INACTIVITY_TIMEOUT,
+	[wmi_vdev_param_ndp_keepalive_timeout] =
+					WMI_VDEV_PARAM_NDP_KEEPALIVE_TIMEOUT,
+	[wmi_vdev_param_final_bmiss_time_sec] =
+					WMI_VDEV_PARAM_FINAL_BMISS_TIME_SEC,
+	[wmi_vdev_param_final_bmiss_time_wow_sec] =
+					WMI_VDEV_PARAM_FINAL_BMISS_TIME_WOW_SEC,
+	[wmi_vdev_param_ap_keepalive_max_idle_inactive_secs] =
+			WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
+	[wmi_vdev_param_per_band_mgmt_tx_rate] =
+					WMI_VDEV_PARAM_PER_BAND_MGMT_TX_RATE,
+	[wmi_vdev_param_max_li_of_moddtim] =
+					WMI_VDEV_PARAM_MAX_LI_OF_MODDTIM,
+	[wmi_vdev_param_moddtim_cnt] = WMI_VDEV_PARAM_MODDTIM_CNT,
+	[wmi_vdev_param_max_li_of_moddtim_ms] =
+					WMI_VDEV_PARAM_MAX_LI_OF_MODDTIM_MS,
+	[wmi_vdev_param_dyndtim_cnt] = WMI_VDEV_PARAM_DYNDTIM_CNT,
+	[wmi_vdev_param_wmm_txop_enable] = WMI_VDEV_PARAM_WMM_TXOP_ENABLE,
+	[wmi_vdev_param_enable_bcast_probe_response] =
+				WMI_VDEV_PARAM_ENABLE_BCAST_PROBE_RESPONSE,
+	[wmi_vdev_param_fils_max_channel_guard_time] =
+				WMI_VDEV_PARAM_FILS_MAX_CHANNEL_GUARD_TIME,
+	[wmi_vdev_param_probe_delay] = WMI_VDEV_PARAM_PROBE_DELAY,
+	[wmi_vdev_param_repeat_probe_time] = WMI_VDEV_PARAM_REPEAT_PROBE_TIME,
+	[wmi_vdev_param_enable_disable_oce_features] =
+				WMI_VDEV_PARAM_ENABLE_DISABLE_OCE_FEATURES,
+	[wmi_vdev_param_enable_disable_nan_config_features] =
+			WMI_VDEV_PARAM_ENABLE_DISABLE_NAN_CONFIG_FEATURES,
+	[wmi_vdev_param_rsn_capability] = WMI_VDEV_PARAM_RSN_CAPABILITY,
+	[wmi_vdev_param_smps_intolerant] = WMI_VDEV_PARAM_SMPS_INTOLERANT,
+	[wmi_vdev_param_abg_mode_tx_chain_num] = WMI_VDEV_PARAM_ABG_MODE_TX_CHAIN_NUM,
+	[wmi_vdev_param_nth_beacon_to_host] = WMI_VDEV_PARAM_NTH_BEACON_TO_HOST,
+	[wmi_vdev_param_prohibit_data_mgmt] = WMI_VDEV_PARAM_PROHIBIT_DATA_MGMT,
+	[wmi_vdev_param_skip_roam_eapol_4way_handshake] = WMI_VDEV_PARAM_SKIP_ROAM_EAPOL_4WAY_HANDSHAKE,
+	[wmi_vdev_param_skip_sae_roam_4way_handshake] = WMI_VDEV_PARAM_SKIP_SAE_ROAM_4WAY_HANDSHAKE,
+	[wmi_vdev_param_roam_11kv_ctrl] = WMI_VDEV_PARAM_ROAM_11KV_CTRL,
+	[wmi_vdev_param_disable_noa_p2p_go] = WMI_VDEV_PARAM_DISABLE_NOA_P2P_GO,
+	[wmi_vdev_param_packet_capture_mode] = WMI_VDEV_PARAM_PACKET_CAPTURE_MODE,
+	[wmi_vdev_param_smart_monitor_config] = WMI_VDEV_PARAM_SMART_MONITOR_CONFIG,
+	[wmi_vdev_param_force_dtim_cnt] = WMI_VDEV_PARAM_FORCE_DTIM_CNT,
+	[wmi_vdev_param_sho_config] = WMI_VDEV_PARAM_SHO_CONFIG,
+	[wmi_vdev_param_gtx_enable] = WMI_VDEV_PARAM_GTX_ENABLE,
+	[wmi_vdev_param_mu_edca_fw_update_en] = WMI_VDEV_PARAM_MU_EDCA_FW_UPDATE_EN,
+	[wmi_vdev_param_enable_disable_rtt_initiator_random_mac] =
+			WMI_VDEV_PARAM_ENABLE_DISABLE_RTT_INITIATOR_RANDOM_MAC,
+	[wmi_vdev_param_allow_nan_initial_discovery_of_mp0_cluster] =
+		WMI_VDEV_PARAM_ALLOW_NAN_INITIAL_DISCOVERY_OF_MP0_CLUSTER,
+	[wmi_vdev_param_txpower_scale_decr_db] = WMI_VDEV_PARAM_TXPOWER_SCALE_DECR_DB,
+	[wmi_vdev_param_txpower_scale] = WMI_VDEV_PARAM_TXPOWER_SCALE,
+	[wmi_vdev_param_agg_sw_retry_th] = WMI_VDEV_PARAM_AGG_SW_RETRY_TH,
+	[wmi_vdev_param_obsspd] = WMI_VDEV_PARAM_OBSSPD,
+	[wmi_vdev_param_multi_client_ll_feature_configuration] =
+			WMI_VDEV_PARAM_NORMAL_LATENCY_FLAGS_CONFIGURATION,
+	[wmi_vdev_param_normal_latency_flags_configuration] =
+			WMI_VDEV_PARAM_NORMAL_LATENCY_FLAGS_CONFIGURATION,
+	[wmi_vdev_param_xr_latency_flags_configuration] =
+				WMI_VDEV_PARAM_XR_LATENCY_FLAGS_CONFIGURATION,
+	[wmi_vdev_param_low_latency_flags_configuration] =
+				WMI_VDEV_PARAM_LOW_LATENCY_FLAGS_CONFIGURATION,
+	[wmi_vdev_param_ultra_low_latency_flags_configuration] =
+			WMI_VDEV_PARAM_ULTRA_LOW_LATENCY_FLAGS_CONFIGURATION,
+	[wmi_vdev_param_normal_latency_ul_dl_configuration] =
+			WMI_VDEV_PARAM_NORMAL_LATENCY_UL_DL_CONFIGURATION,
+	[wmi_vdev_param_xr_latency_ul_dl_configuration] =
+				WMI_VDEV_PARAM_XR_LATENCY_UL_DL_CONFIGURATION,
+	[wmi_vdev_param_low_latency_ul_dl_configuration] =
+				WMI_VDEV_PARAM_LOW_LATENCY_UL_DL_CONFIGURATION,
+	[wmi_vdev_param_ultra_low_latency_ul_dl_configuration] =
+			WMI_VDEV_PARAM_ULTRA_LOW_LATENCY_UL_DL_CONFIGURATION,
+	[wmi_vdev_param_default_latency_level_configuration] =
+			WMI_VDEV_PARAM_DEFAULT_LATENCY_LEVEL_CONFIGURATION,
+	[wmi_vdev_param_amsdu_aggregation_size_optimization] =
+			WMI_VDEV_PARAM_AMSDU_AGGREGATION_SIZE_OPTIMIZATION,
+	[wmi_vdev_param_non_agg_sw_retry_th] =
+					WMI_VDEV_PARAM_NON_AGG_SW_RETRY_TH,
 };
 #endif
 
@@ -1928,12 +2071,24 @@ static inline uint32_t convert_host_pdev_param_tlv(uint32_t host_param)
 		return pdev_param_tlv[host_param];
 	return WMI_UNAVAILABLE_PARAM;
 }
+
+static inline uint32_t convert_host_vdev_param_tlv(uint32_t host_param)
+{
+	if (host_param < QDF_ARRAY_SIZE(vdev_param_tlv))
+		return vdev_param_tlv[host_param];
+	return WMI_UNAVAILABLE_PARAM;
+}
 #else
 static inline uint32_t convert_host_pdev_param_tlv(uint32_t host_param)
 {
 	return host_param;
 }
-#endif
+
+static inline uint32_t convert_host_vdev_param_tlv(uint32_t host_param)
+{
+	return host_param;
+}
+#endif /* end of ENABLE_HOST_TO_TARGET_CONVERSION */
 
 /**
  * send_pdev_param_cmd_tlv() - set pdev parameters
@@ -1979,8 +2134,8 @@ send_pdev_param_cmd_tlv(wmi_unified_t wmi_handle,
 								mac_id);
 	cmd->param_id = pdev_param;
 	cmd->param_value = param->param_value;
-	wmi_debug("Setting pdev param = %x, value = %u", param->param_id,
-		 param->param_value);
+	wmi_debug("Setting pdev %d param = %x, value = %u", cmd->pdev_id,
+		  cmd->param_id, cmd->param_value);
 	wmi_mtrace(WMI_PDEV_SET_PARAM_CMDID, NO_SESSION, 0);
 	ret = wmi_unified_cmd_send(wmi_handle, buf, len,
 				   WMI_PDEV_SET_PARAM_CMDID);
@@ -1991,6 +2146,200 @@ send_pdev_param_cmd_tlv(wmi_unified_t wmi_handle,
 	return ret;
 }
 
+/**
+ * send_multi_param_cmd_using_pdev_set_param_tlv() - set pdev parameters
+ * @wmi_handle: wmi handle
+ * @params: pointer to hold set_multiple_pdev_vdev_param info
+ *
+ * Return: 0 on success, errno on failure
+ */
+static QDF_STATUS
+send_multi_param_cmd_using_pdev_set_param_tlv(wmi_unified_t wmi_handle,
+					      struct set_multiple_pdev_vdev_param *params)
+{
+	uint8_t index;
+	struct pdev_params pdevparam;
+	uint8_t n_params = params->n_params;
+
+	pdevparam.is_host_pdev_id = params->is_host_pdev_id;
+	for (index = 0; index < n_params; index++) {
+		pdevparam.param_id = params->params[index].param_id;
+		pdevparam.param_value = params->params[index].param_value;
+		if (QDF_IS_STATUS_ERROR(send_pdev_param_cmd_tlv(wmi_handle,
+								&pdevparam,
+								params->dev_id))) {
+			wmi_err("failed to send pdev setparam:%d",
+				pdevparam.param_id);
+			return QDF_STATUS_E_FAILURE;
+		}
+	}
+	return QDF_STATUS_SUCCESS;
+}
+
+#ifdef WLAN_PDEV_VDEV_SEND_MULTI_PARAM
+
+/**
+ * convert_host_pdev_vdev_param_id_to_target()- convert host params to target params
+ * @params: pointer to point set_multiple_pdev_vdev_param info
+ *
+ * Return: returns QDF_STATUS
+ */
+static QDF_STATUS
+convert_host_pdev_vdev_param_id_to_target(struct set_multiple_pdev_vdev_param *params)
+{
+	uint8_t index;
+	uint32_t dev_paramid;
+	uint8_t num = params->n_params;
+
+	if (params->param_type == MLME_PDEV_SETPARAM) {
+		for (index = 0; index < num; index++) {
+			dev_paramid = convert_host_pdev_param_tlv(params->params[index].param_id);
+			if (dev_paramid == WMI_UNAVAILABLE_PARAM) {
+				wmi_err("pdev param %d not available",
+					params->params[index].param_id);
+				return QDF_STATUS_E_INVAL;
+			}
+			params->params[index].param_id = dev_paramid;
+		}
+	} else if (params->param_type == MLME_VDEV_SETPARAM) {
+		for (index = 0; index < num; index++) {
+			dev_paramid = convert_host_vdev_param_tlv(params->params[index].param_id);
+			if (dev_paramid == WMI_UNAVAILABLE_PARAM) {
+				wmi_err("vdev param %d not available",
+					params->params[index].param_id);
+				return QDF_STATUS_E_INVAL;
+			}
+			params->params[index].param_id = dev_paramid;
+		}
+	} else {
+		wmi_err("invalid param type");
+		return QDF_STATUS_E_INVAL;
+	}
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * send_dev_multi_setparam_cmd_tlv()-to print the paramid and param value
+ * @setparam: buffer pointer where host is filling paramsid and value
+ * @params: pointer to hold set_multiple_pdev_vdev_param info
+ *
+ */
+static void send_dev_multi_setparam_cmd_tlv(wmi_set_param_info *setparam,
+					    struct set_multiple_pdev_vdev_param *params)
+{
+	if (params->param_type == MLME_VDEV_SETPARAM) {
+		wmi_debug("Setting vdev %d param = %x value = %u", params->dev_id,
+			  setparam->param_id, setparam->param_value);
+	} else {
+		wmi_debug("Setting pdev %d param = %x value = %u",
+			  params->dev_id, setparam->param_id, setparam->param_value);
+	}
+}
+
+/**
+ * send_multi_pdev_vdev_set_param_cmd_tlv()-set pdev/vdev params
+ * @wmi_handle: wmi handle
+ * @params: pointer to hold set_multiple_pdev_vdev_param info
+ *
+ * Return: returns QDF_STATUS
+ */
+static QDF_STATUS
+send_multi_pdev_vdev_set_param_cmd_tlv(
+				wmi_unified_t wmi_handle,
+				struct set_multiple_pdev_vdev_param *params)
+{
+	uint8_t *buf_ptr;
+	QDF_STATUS ret;
+	wmi_buf_t buf;
+	wmi_set_param_info *setparam;
+	wmi_set_multiple_pdev_vdev_param_cmd_fixed_param *cmd;
+	uint8_t num = params->n_params;
+	uint16_t len;
+	uint8_t index = 0;
+
+	if (convert_host_pdev_vdev_param_id_to_target(params))
+		return QDF_STATUS_E_INVAL;
+
+	len = sizeof(*cmd) + WMI_TLV_HDR_SIZE + (num * sizeof(*setparam));
+	buf = wmi_buf_alloc(wmi_handle, len);
+	if (!buf)
+		return QDF_STATUS_E_NOMEM;
+
+	buf_ptr = (uint8_t *)wmi_buf_data(buf);
+	cmd = (wmi_set_multiple_pdev_vdev_param_cmd_fixed_param *)buf_ptr;
+
+	WMITLV_SET_HDR(&cmd->tlv_header,
+		       WMITLV_TAG_STRUC_wmi_set_multiple_pdev_vdev_param_cmd_fixed_param,
+		       WMITLV_GET_STRUCT_TLVLEN(wmi_set_multiple_pdev_vdev_param_cmd_fixed_param));
+
+	cmd->is_vdev = params->param_type;
+	if (params->param_type == MLME_PDEV_SETPARAM) {
+		if (params->is_host_pdev_id)
+			params->dev_id = wmi_handle->ops->convert_host_pdev_id_to_target(wmi_handle,
+								params->dev_id);
+		else
+			params->dev_id = wmi_handle->ops->convert_pdev_id_host_to_target(wmi_handle,
+								params->dev_id);
+	}
+	cmd->dev_id = params->dev_id;
+	buf_ptr += sizeof(wmi_set_multiple_pdev_vdev_param_cmd_fixed_param);
+	WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC, (num * sizeof(*setparam)));
+	buf_ptr += WMI_TLV_HDR_SIZE;
+	for (index = 0; index < num; index++) {
+		setparam = (wmi_set_param_info *)buf_ptr;
+		WMITLV_SET_HDR(&setparam->tlv_header,
+			       WMITLV_TAG_STRUC_wmi_set_param_info,
+			       WMITLV_GET_STRUCT_TLVLEN(*setparam));
+		setparam->param_id = params->params[index].param_id;
+		setparam->param_value = params->params[index].param_value;
+		send_dev_multi_setparam_cmd_tlv(setparam, params);
+		buf_ptr += sizeof(*setparam);
+	}
+	wmi_mtrace(WMI_SET_MULTIPLE_PDEV_VDEV_PARAM_CMDID,
+		   cmd->dev_id, 0);
+	ret = wmi_unified_cmd_send(wmi_handle, buf, len,
+				   WMI_SET_MULTIPLE_PDEV_VDEV_PARAM_CMDID);
+	if (QDF_IS_STATUS_ERROR(ret)) {
+		wmi_err("failed to send WMI_SET_MULTIPLE_PDEV_VDEV_PARAM_CMDID");
+		wmi_buf_free(buf);
+	}
+	return ret;
+}
+
+/**
+ * send_multiple_pdev_param_cmd_tlv() - set pdev parameters
+ * @wmi_handle: wmi handle
+ * @params: pointer to set_multiple_pdev_vdev_param structure
+ *
+ * Return: 0 on success, errno on failure
+ */
+static QDF_STATUS
+send_multiple_pdev_param_cmd_tlv(wmi_unified_t wmi_handle,
+				 struct set_multiple_pdev_vdev_param *params)
+{
+	if (!wmi_service_enabled(wmi_handle,
+				 wmi_service_combined_set_param_support))
+		return send_multi_param_cmd_using_pdev_set_param_tlv(wmi_handle,
+								     params);
+	return send_multi_pdev_vdev_set_param_cmd_tlv(wmi_handle, params);
+}
+
+#else  /* WLAN_PDEV_VDEV_SEND_MULTI_PARAM */
+/**
+ * send_multiple_pdev_param_cmd_tlv() - set pdev parameters
+ * @wmi_handle: wmi handle
+ * @params: pointer to set_multiple_pdev_vdev_param structure
+ *
+ * Return: 0 on success, errno on failure
+ */
+static QDF_STATUS
+send_multiple_pdev_param_cmd_tlv(wmi_unified_t wmi_handle,
+				 struct set_multiple_pdev_vdev_param *params)
+{
+	return send_multi_param_cmd_using_pdev_set_param_tlv(wmi_handle, params);
+}
+#endif /* end of WLAN_PDEV_VDEV_SEND_MULTI_PARAM */
+
 /**
  * send_pdev_set_hw_mode_cmd_tlv() - Send WMI_PDEV_SET_HW_MODE_CMDID to FW
  * @wmi_handle: wmi handle
@@ -2358,20 +2707,6 @@ send_dbglog_cmd_tlv(wmi_unified_t wmi_handle,
 	return status;
 }
 
-#ifdef ENABLE_HOST_TO_TARGET_CONVERSION
-static inline uint32_t convert_host_vdev_param_tlv(uint32_t host_param)
-{
-	if (host_param < QDF_ARRAY_SIZE(vdev_param_tlv))
-		return vdev_param_tlv[host_param];
-	return WMI_UNAVAILABLE_PARAM;
-}
-#else
-static inline uint32_t convert_host_vdev_param_tlv(uint32_t host_param)
-{
-	return host_param;
-}
-#endif
-
 /**
  *  send_vdev_set_param_cmd_tlv() - WMI vdev set parameter function
  *  @param wmi_handle      : handle to WMI.
@@ -2403,16 +2738,14 @@ static QDF_STATUS send_vdev_set_param_cmd_tlv(wmi_unified_t wmi_handle,
 	cmd = (wmi_vdev_set_param_cmd_fixed_param *) wmi_buf_data(buf);
 	WMITLV_SET_HDR(&cmd->tlv_header,
 		       WMITLV_TAG_STRUC_wmi_vdev_set_param_cmd_fixed_param,
-		       WMITLV_GET_STRUCT_TLVLEN
-			       (wmi_vdev_set_param_cmd_fixed_param));
+		       WMITLV_GET_STRUCT_TLVLEN(wmi_vdev_set_param_cmd_fixed_param));
 	cmd->vdev_id = param->vdev_id;
 	cmd->param_id = vdev_param;
 	cmd->param_value = param->param_value;
 	wmi_debug("Setting vdev %d param = %x, value = %u",
 		 cmd->vdev_id, cmd->param_id, cmd->param_value);
 	wmi_mtrace(WMI_VDEV_SET_PARAM_CMDID, cmd->vdev_id, 0);
-	ret = wmi_unified_cmd_send(wmi_handle, buf, len,
-				   WMI_VDEV_SET_PARAM_CMDID);
+	ret = wmi_unified_cmd_send(wmi_handle, buf, len, WMI_VDEV_SET_PARAM_CMDID);
 	if (QDF_IS_STATUS_ERROR(ret)) {
 		wmi_err("Failed to send set param command ret = %d", ret);
 		wmi_buf_free(buf);
@@ -2421,6 +2754,70 @@ static QDF_STATUS send_vdev_set_param_cmd_tlv(wmi_unified_t wmi_handle,
 	return ret;
 }
 
+/**
+ *  send_multi_param_cmd_using_vdev_param_tlv() - vdev set parameter function
+ *  @wmi_handle : handle to WMI.
+ *  @dev_id: device id of pdev/vdev
+ *  @params: pointer to point array of structure dev_set_param with @n_params
+ *  @n_params: total number of set params that are combined with @params
+ *
+ *  Return:  returns QDF_STATUS.
+ */
+static QDF_STATUS
+send_multi_param_cmd_using_vdev_param_tlv(wmi_unified_t wmi_handle,
+					  struct set_multiple_pdev_vdev_param *params)
+{
+	uint8_t index;
+	struct vdev_set_params vdevparam;
+
+	for (index = 0; index < params->n_params; index++) {
+		vdevparam.param_id = params->params[index].param_id;
+		vdevparam.param_value = params->params[index].param_value;
+		vdevparam.vdev_id = params->dev_id;
+		if (QDF_IS_STATUS_ERROR(send_vdev_set_param_cmd_tlv(wmi_handle, &vdevparam))) {
+			wmi_err("failed to send param:%d", vdevparam.param_id);
+			return QDF_STATUS_E_FAILURE;
+		}
+	}
+	return QDF_STATUS_SUCCESS;
+}
+
+#ifdef WLAN_PDEV_VDEV_SEND_MULTI_PARAM
+/**
+ *  send_multiple_vdev_param_cmd_tlv() - WMI vdev set parameter function
+ *  @wmi_handle : handle to WMI.
+ *  @params: pointer to hold set_multiple_pdev_vdev_param info
+ *
+ *  Return: 0  on success and errorcode on failure.
+ */
+static QDF_STATUS
+send_multiple_vdev_param_cmd_tlv(wmi_unified_t wmi_handle,
+				 struct set_multiple_pdev_vdev_param *params)
+{
+	if (!wmi_service_enabled(wmi_handle,
+				 wmi_service_combined_set_param_support))
+		return send_multi_param_cmd_using_vdev_param_tlv(wmi_handle,
+								 params);
+	return send_multi_pdev_vdev_set_param_cmd_tlv(wmi_handle, params);
+}
+
+#else /* WLAN_PDEV_VDEV_SEND_MULTI_PARAM */
+
+/**
+ *  send_multiple_vdev_param_cmd_tlv() - WMI vdev set parameter function
+ *  @wmi_handle : handle to WMI.
+ *  @params: pointer to hold set_multiple_pdev_vdev_param info
+ *
+ *  Return: 0  on success and errorcode on failure.
+ */
+static QDF_STATUS
+send_multiple_vdev_param_cmd_tlv(wmi_unified_t wmi_handle,
+				 struct set_multiple_pdev_vdev_param *params)
+{
+	return send_multi_param_cmd_using_vdev_param_tlv(wmi_handle, params);
+}
+#endif /*end of WLAN_PDEV_VDEV_SEND_MULTI_PARAM */
+
 /**
  *  send_vdev_set_mu_snif_cmd_tlv() - WMI vdev set mu snif function
  *  @param wmi_handle      : handle to WMI.
@@ -18885,6 +19282,7 @@ struct wmi_ops tlv_ops =  {
 		send_peer_rx_reorder_queue_remove_cmd_tlv,
 	.send_pdev_utf_cmd = send_pdev_utf_cmd_tlv,
 	.send_pdev_param_cmd = send_pdev_param_cmd_tlv,
+	.send_multiple_pdev_param_cmd = send_multiple_pdev_param_cmd_tlv,
 	.send_pdev_set_hw_mode_cmd = send_pdev_set_hw_mode_cmd_tlv,
 	.send_suspend_cmd = send_suspend_cmd_tlv,
 	.send_resume_cmd = send_resume_cmd_tlv,
@@ -19337,6 +19735,7 @@ struct wmi_ops tlv_ops =  {
 #endif
 	.extract_health_mon_init_done_info_event =
 		extract_health_mon_init_done_info_event_tlv,
+	.send_multiple_vdev_param_cmd = send_multiple_vdev_param_cmd_tlv,
 };
 
 #ifdef WLAN_FEATURE_11BE_MLO
@@ -20318,6 +20717,10 @@ static void populate_tlv_service(uint32_t *wmi_service)
 #ifdef WLAN_FEATURE_11BE
 	wmi_service[wmi_service_radar_found_chan_freq_eq_center_freq] =
 		WMI_IS_RADAR_FOUND_CHAN_FREQ_IS_CENTER_FREQ;
+#endif
+#ifdef WLAN_PDEV_VDEV_SEND_MULTI_PARAM
+	wmi_service[wmi_service_combined_set_param_support] =
+			WMI_SERVICE_COMBINED_SET_PARAM_SUPPORT;
 #endif
 	wmi_service[wmi_service_pn_replay_check_support] =
 			WMI_SERVICE_PN_REPLAY_CHECK_SUPPORT;