diff --git a/components/mlme/core/src/wlan_mlme_main.c b/components/mlme/core/src/wlan_mlme_main.c index d4d7d62ea3..b787c67620 100644 --- a/components/mlme/core/src/wlan_mlme_main.c +++ b/components/mlme/core/src/wlan_mlme_main.c @@ -1966,6 +1966,8 @@ static void mlme_init_nss_chains(struct wlan_objmgr_psoc *psoc, cfg_get(psoc, CFG_DISABLE_TX_MRC_2G); nss_chains->disable_tx_mrc[NSS_CHAINS_BAND_5GHZ] = cfg_get(psoc, CFG_DISABLE_TX_MRC_5G); + nss_chains->enable_dynamic_nss_chains_cfg = + cfg_get(psoc, CFG_ENABLE_DYNAMIC_NSS_CHAIN_CONFIG); } static void mlme_init_wep_keys(struct wlan_mlme_wep_cfg *wep_params) { diff --git a/components/mlme/dispatcher/inc/cfg_mlme_nss_chains.h b/components/mlme/dispatcher/inc/cfg_mlme_nss_chains.h index a4d47e71df..13a820e7f3 100644 --- a/components/mlme/dispatcher/inc/cfg_mlme_nss_chains.h +++ b/components/mlme/dispatcher/inc/cfg_mlme_nss_chains.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2018, 2020 The Linux Foundation. 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 @@ -533,6 +533,27 @@ 0, \ "disable diversity gain rx 5g") +/* + * + * enable_dynamic_nss_chain_config - Enable/Disable dynamic nss and chain config + * to FW. + * @Min: 0 + * @Max: 1 + * @Default: 1 + * + * Related: STA/SAP/P2P/NAN. + * + * Supported Feature: Dynamic chainmask + * + * Usage: External + * + * + */ +#define CFG_ENABLE_DYNAMIC_NSS_CHAIN_CONFIG CFG_INI_BOOL( \ + "enable_dynamic_nss_chain_config", \ + 1, \ + "enable dynamic nss chain config") + #define CFG_NSS_CHAINS_ALL \ CFG(CFG_NUM_TX_CHAINS_2G) \ CFG(CFG_NUM_TX_CHAINS_5G) \ @@ -548,7 +569,8 @@ CFG(CFG_DISABLE_TX_MRC_2G) \ CFG(CFG_DISABLE_RX_MRC_2G) \ CFG(CFG_DISABLE_TX_MRC_5G) \ - CFG(CFG_DISABLE_RX_MRC_5G) + CFG(CFG_DISABLE_RX_MRC_5G) \ + CFG(CFG_ENABLE_DYNAMIC_NSS_CHAIN_CONFIG) #endif /* __CFG_MLME_NSS_CHAINS */ diff --git a/components/mlme/dispatcher/inc/wlan_mlme_api.h b/components/mlme/dispatcher/inc/wlan_mlme_api.h index 20079a4532..7179ec63fa 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_api.h @@ -1924,6 +1924,20 @@ wlan_mlme_get_vht20_mcs9(struct wlan_objmgr_psoc *psoc, bool *value); QDF_STATUS wlan_mlme_get_force_sap_enabled(struct wlan_objmgr_psoc *psoc, bool *value); +/** + * wlan_mlme_get_enable_dynamic_nss_chains_cfg() - API to get whether dynamic + * nss and chain config is enabled or not + * @psoc: psoc context + * @value: data to be set + * + * API to get whether dynamic nss and chain config is enabled or not + * + * Return: QDF_STATUS_SUCCESS or QDF_STATUS_FAILURE + */ +QDF_STATUS +wlan_mlme_get_enable_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 diff --git a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h index b53c5391cb..ecb83d66c4 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h @@ -1318,6 +1318,7 @@ enum dot11p_mode { * @num_tx_chains_11a: number of tx chains in 11a 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 */ struct wlan_mlme_nss_chains { uint32_t num_tx_chains[NSS_CHAINS_BAND_MAX]; @@ -1329,6 +1330,7 @@ struct wlan_mlme_nss_chains { uint32_t num_tx_chains_11a; bool disable_rx_mrc[NSS_CHAINS_BAND_MAX]; bool disable_tx_mrc[NSS_CHAINS_BAND_MAX]; + bool enable_dynamic_nss_chains_cfg; }; /** diff --git a/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h b/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h index 81f7bdbd09..756ddaa254 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h @@ -2481,6 +2481,23 @@ ucfg_mlme_get_vht20_mcs9(struct wlan_objmgr_psoc *psoc, bool *value) return wlan_mlme_get_vht20_mcs9(psoc, value); } +/** + * ucfg_mlme_get_enable_dynamic_nss_chains_cfg() - API to get whether dynamic + * nss and chain config is enabled or not + * @psoc: psoc context + * @value: data to be set + * + * API to get whether dynamic nss and chain config is enabled or not + * + * Return: QDF_STATUS_SUCCESS or QDF_STATUS_FAILURE + */ +static inline QDF_STATUS +ucfg_mlme_get_enable_dynamic_nss_chains_cfg(struct wlan_objmgr_psoc *psoc, + bool *value) +{ + return wlan_mlme_get_enable_dynamic_nss_chains_cfg(psoc, value); +} + /** * ucfg_mlme_get_vht_enable2x2() - Enables/disables VHT Tx/Rx MCS values for 2x2 * @psoc: psoc context diff --git a/components/mlme/dispatcher/src/wlan_mlme_api.c b/components/mlme/dispatcher/src/wlan_mlme_api.c index 3aad1c6a67..76b2a3ab9a 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_api.c +++ b/components/mlme/dispatcher/src/wlan_mlme_api.c @@ -3014,6 +3014,21 @@ wlan_mlme_get_vht20_mcs9(struct wlan_objmgr_psoc *psoc, bool *value) return QDF_STATUS_SUCCESS; } +QDF_STATUS +wlan_mlme_get_enable_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.enable_dynamic_nss_chains_cfg; + + return QDF_STATUS_SUCCESS; +} + QDF_STATUS wlan_mlme_get_vht_enable2x2(struct wlan_objmgr_psoc *psoc, bool *value) { diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 36f1c1594d..a26cfe9635 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -2181,6 +2181,7 @@ int hdd_update_tgt_cfg(hdd_handle_t hdd_handle, struct wma_tgt_cfg *cfg) uint8_t value = 0; uint32_t fine_time_meas_cap = 0; enum nss_chains_band_info band; + bool enable_dynamic_cfg; if (!hdd_ctx) { hdd_err("HDD context is NULL"); @@ -2364,8 +2365,20 @@ int hdd_update_tgt_cfg(hdd_handle_t hdd_handle, struct wma_tgt_cfg *cfg) hdd_update_vdev_nss(hdd_ctx); - hdd_ctx->dynamic_nss_chains_support = - cfg->dynamic_nss_chains_support; + status = + ucfg_mlme_get_enable_dynamic_nss_chains_cfg(hdd_ctx->psoc, + &enable_dynamic_cfg); + if (QDF_IS_STATUS_ERROR(status)) { + hdd_err("unable to get enable dynamic config"); + hdd_ctx->dynamic_nss_chains_support = false; + } else { + hdd_ctx->dynamic_nss_chains_support = + cfg->dynamic_nss_chains_support & + enable_dynamic_cfg; + hdd_debug("Dynamic nss chain support FW %d driver %d", + cfg->dynamic_nss_chains_support, enable_dynamic_cfg); + } + ucfg_mlme_get_fine_time_meas_cap(hdd_ctx->psoc, &fine_time_meas_cap); fine_time_meas_cap &= cfg->fine_time_measurement_cap; status = ucfg_mlme_set_fine_time_meas_cap(hdd_ctx->psoc,