diff --git a/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_tx_defs.h b/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_tx_defs.h index 14c05fc9bb..93c57e1542 100644 --- a/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_tx_defs.h +++ b/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_tx_defs.h @@ -30,6 +30,7 @@ #ifdef WLAN_FEATURE_11BE_MLO #include #endif +#include /** 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 diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index ef0fb02e85..d92dd0396e 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/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 diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index 093e7a996e..fcbd02aa12 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/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; diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 8aa71e7e38..629e800dbf 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/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); diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c index 98605cc931..d243da664c 100644 --- a/wmi/src/wmi_unified_api.c +++ b/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) diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index b4e2331c85..9b44cf5aa9 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/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;