From ce6aed0852254f97363099a45e3e2da8672f9797 Mon Sep 17 00:00:00 2001 From: gaurank kathpalia Date: Thu, 11 Jun 2020 19:18:03 +0530 Subject: [PATCH] qcacld-3.0: Add ini to enable/disable dynamic cfg Currently the driver supports the dynamic configuration of nss and chain to FW for VDEV if the FW advertises the capability of supporting the same. However there is no support to overide this. Fix is to have an ini to enable/disable this feature of configuring the dynamic nss and chains to FW. Change-Id: I0b84bb5aec53966a43a00c11d4aba3863414005c CRs-Fixed: 2708303 --- components/mlme/core/src/wlan_mlme_main.c | 2 ++ .../mlme/dispatcher/inc/cfg_mlme_nss_chains.h | 26 +++++++++++++++++-- .../mlme/dispatcher/inc/wlan_mlme_api.h | 14 ++++++++++ .../dispatcher/inc/wlan_mlme_public_struct.h | 2 ++ .../mlme/dispatcher/inc/wlan_mlme_ucfg_api.h | 17 ++++++++++++ .../mlme/dispatcher/src/wlan_mlme_api.c | 15 +++++++++++ core/hdd/src/wlan_hdd_main.c | 17 ++++++++++-- 7 files changed, 89 insertions(+), 4 deletions(-) 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,