diff --git a/components/fw_offload/core/inc/wlan_fw_offload_main.h b/components/fw_offload/core/inc/wlan_fw_offload_main.h
index 07fb19fe99f6..5ec08e715ff4 100644
--- a/components/fw_offload/core/inc/wlan_fw_offload_main.h
+++ b/components/fw_offload/core/inc/wlan_fw_offload_main.h
@@ -127,6 +127,8 @@ struct wlan_fwol_ie_whitelist {
* @get_rts_profile: Set the RTS profile
* @enable_fw_log_level: Set the FW log level
* @enable_fw_log_type: Set the FW log type
+ * @enable_fw_module_log_level: enable fw module log level
+ * @enable_fw_module_log_level_num: enablefw module log level num
* @is_rate_limit_enabled: Enable/disable RA rate limited
* @tsf_gpio_pin: TSF GPIO Pin config
* @enable_dhcp_server_offload: DHCP Offload is enabled or not
@@ -150,6 +152,8 @@ struct wlan_fwol_cfg {
uint16_t get_rts_profile;
uint16_t enable_fw_log_level;
uint16_t enable_fw_log_type;
+ uint8_t enable_fw_module_log_level[FW_MODULE_LOG_LEVEL_STRING_LENGTH];
+ uint8_t enable_fw_module_log_level_num;
#ifdef FEATURE_WLAN_RA_FILTERING
bool is_rate_limit_enabled;
#endif
diff --git a/components/fw_offload/core/src/wlan_fw_offload_main.c b/components/fw_offload/core/src/wlan_fw_offload_main.c
index be177cf77c16..4e0608e94e25 100644
--- a/components/fw_offload/core/src/wlan_fw_offload_main.c
+++ b/components/fw_offload/core/src/wlan_fw_offload_main.c
@@ -267,6 +267,7 @@ QDF_STATUS fwol_cfg_on_psoc_enable(struct wlan_objmgr_psoc *psoc)
QDF_STATUS status = QDF_STATUS_SUCCESS;
struct wlan_fwol_psoc_obj *fwol_obj;
struct wlan_fwol_cfg *fwol_cfg;
+ qdf_size_t enable_fw_module_log_level_num;
fwol_obj = fwol_get_psoc_obj(psoc);
if (!fwol_obj) {
@@ -296,6 +297,12 @@ QDF_STATUS fwol_cfg_on_psoc_enable(struct wlan_objmgr_psoc *psoc)
fwol_cfg->enable_fw_log_level =
cfg_get(psoc, CFG_ENABLE_FW_DEBUG_LOG_LEVEL);
fwol_cfg->enable_fw_log_type = cfg_get(psoc, CFG_ENABLE_FW_LOG_TYPE);
+ qdf_uint8_array_parse(cfg_get(psoc, CFG_ENABLE_FW_MODULE_LOG_LEVEL),
+ fwol_cfg->enable_fw_module_log_level,
+ FW_MODULE_LOG_LEVEL_STRING_LENGTH,
+ &enable_fw_module_log_level_num);
+ fwol_cfg->enable_fw_module_log_level_num =
+ (uint8_t)enable_fw_module_log_level_num;
ucfg_fwol_fetch_ra_filter(psoc, fwol_cfg);
ucfg_fwol_fetch_tsf_gpio_pin(psoc, fwol_cfg);
ucfg_fwol_fetch_dhcp_server_settings(psoc, fwol_cfg);
diff --git a/components/fw_offload/dispatcher/inc/cfg_fwol_generic.h b/components/fw_offload/dispatcher/inc/cfg_fwol_generic.h
index 1c667125e936..4682f147f1af 100644
--- a/components/fw_offload/dispatcher/inc/cfg_fwol_generic.h
+++ b/components/fw_offload/dispatcher/inc/cfg_fwol_generic.h
@@ -348,6 +348,47 @@
CFG_VALUE_OR_DEFAULT, \
"Default value to be given to the net link cnss_diag service")
+/*
+ *
+ * gFwDebugModuleLoglevel - modulized firmware debug log level
+ * @Min: N/A
+ * @Max: N/A
+ * @Default: N/A
+ *
+ * This ini is used to set modulized firmware debug log level.
+ * FW module log level input string format looks like below:
+ * gFwDebugModuleLoglevel=",,..."
+ * For example:
+ * gFwDebugModuleLoglevel="1,0,2,1,3,2,4,3,5,4,6,5,7,6"
+ * The above input string means:
+ * For FW module ID 1 enable log level 0
+ * For FW module ID 2 enable log level 1
+ * For FW module ID 3 enable log level 2
+ * For FW module ID 4 enable log level 3
+ * For FW module ID 5 enable log level 4
+ * For FW module ID 6 enable log level 5
+ * For FW module ID 7 enable log level 6
+ * For valid values of log levels check enum DBGLOG_LOG_LVL and
+ * for valid values of module ids check enum WLAN_MODULE_ID.
+ *
+ * Related: None
+ *
+ * Supported Feature: Debugging
+ *
+ * Usage: Internal/External
+ *
+ *
+ */
+
+#define FW_MODULE_LOG_LEVEL_STRING_LENGTH (512)
+#define CFG_ENABLE_FW_MODULE_LOG_LEVEL CFG_INI_STRING( \
+ "gFwDebugModuleLoglevel", \
+ 0, \
+ FW_MODULE_LOG_LEVEL_STRING_LENGTH, \
+ "2,1,3,1,5,1,9,1,13,1,14,1,18,1,19,1,26,1,28,1,29,1,31,1,36,1,38,1,"\
+ "46,1,47,1,50,1,52,1,53,1,56,1,60,1,61,1,4,1", \
+ "Set modulized firmware debug log level")
+
#ifdef FEATURE_WLAN_RA_FILTERING
/*
* gRAFilterEnable
@@ -456,6 +497,7 @@
CFG(CFG_ENABLE_FW_RTS_PROFILE) \
CFG(CFG_ENABLE_FW_DEBUG_LOG_LEVEL) \
CFG(CFG_ENABLE_FW_LOG_TYPE) \
+ CFG(CFG_ENABLE_FW_MODULE_LOG_LEVEL) \
CFG(CFG_RA_FILTER_ENABLE) \
CFG(CFG_SET_TSF_GPIO_PIN)
diff --git a/components/fw_offload/dispatcher/inc/wlan_fwol_ucfg_api.h b/components/fw_offload/dispatcher/inc/wlan_fwol_ucfg_api.h
index cd103a7f5a54..f2066cb3bd47 100644
--- a/components/fw_offload/dispatcher/inc/wlan_fwol_ucfg_api.h
+++ b/components/fw_offload/dispatcher/inc/wlan_fwol_ucfg_api.h
@@ -236,6 +236,21 @@ QDF_STATUS ucfg_fwol_get_enable_fw_log_level(struct wlan_objmgr_psoc *psoc,
*/
QDF_STATUS ucfg_fwol_get_enable_fw_log_type(struct wlan_objmgr_psoc *psoc,
uint16_t *enable_fw_log_type);
+/**
+ * ucfg_fwol_get_enable_fw_module_log_level() - Assigns
+ * enable_fw_module_log_level string
+ * @psoc: pointer to the psoc object
+ * @enable_fw_module_log_level:
+ * pointer to enable_fw_module_log_level array
+ * @enable_fw_module_log_level_num:
+ * pointer to enable_fw_module_log_leve array element num
+ *
+ * Return: QDF Status
+ */
+QDF_STATUS ucfg_fwol_get_enable_fw_module_log_level(
+ struct wlan_objmgr_psoc *psoc,
+ uint8_t **enable_fw_module_log_level,
+ uint8_t *enable_fw_module_log_level_num);
#ifdef FEATURE_WLAN_RA_FILTERING
/**
diff --git a/components/fw_offload/dispatcher/src/wlan_fwol_ucfg_api.c b/components/fw_offload/dispatcher/src/wlan_fwol_ucfg_api.c
index 4b5cc4622425..f75bbcb5e47d 100644
--- a/components/fw_offload/dispatcher/src/wlan_fwol_ucfg_api.c
+++ b/components/fw_offload/dispatcher/src/wlan_fwol_ucfg_api.c
@@ -428,6 +428,25 @@ QDF_STATUS ucfg_fwol_get_enable_fw_log_type(struct wlan_objmgr_psoc *psoc,
return QDF_STATUS_SUCCESS;
}
+QDF_STATUS ucfg_fwol_get_enable_fw_module_log_level(
+ struct wlan_objmgr_psoc *psoc,
+ uint8_t **enable_fw_module_log_level,
+ uint8_t *enable_fw_module_log_level_num)
+{
+ struct wlan_fwol_psoc_obj *fwol_obj;
+
+ fwol_obj = fwol_get_psoc_obj(psoc);
+ if (!fwol_obj) {
+ fwol_err("Failed to get FWOL obj");
+ return QDF_STATUS_E_FAILURE;
+ }
+
+ *enable_fw_module_log_level = fwol_obj->cfg.enable_fw_module_log_level;
+ *enable_fw_module_log_level_num =
+ fwol_obj->cfg.enable_fw_module_log_level_num;
+ return QDF_STATUS_SUCCESS;
+}
+
#ifdef FEATURE_WLAN_RA_FILTERING
QDF_STATUS ucfg_fwol_set_is_rate_limit_enabled(struct wlan_objmgr_psoc *psoc,
bool is_rate_limit_enabled)
diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h
index fcc6f5ab2107..2db1292675bd 100644
--- a/core/hdd/inc/wlan_hdd_cfg.h
+++ b/core/hdd/inc/wlan_hdd_cfg.h
@@ -1750,41 +1750,6 @@ enum hdd_link_speed_rpt_type {
#define CFG_LINK_SPEED_RSSI_LOW_MAX (0)
#define CFG_LINK_SPEED_RSSI_LOW_DEFAULT (-80)
-/*
- *
- * gFwDebugModuleLoglevel - modulized firmware debug log level
- * @Min: N/A
- * @Max: N/A
- * @Default: N/A
- *
- * This ini is used to set modulized firmware debug log level.
- * FW module log level input string format looks like below:
- * gFwDebugModuleLoglevel=",,..."
- * For example:
- * gFwDebugModuleLoglevel="1,0,2,1,3,2,4,3,5,4,6,5,7,6"
- * The above input string means:
- * For FW module ID 1 enable log level 0
- * For FW module ID 2 enable log level 1
- * For FW module ID 3 enable log level 2
- * For FW module ID 4 enable log level 3
- * For FW module ID 5 enable log level 4
- * For FW module ID 6 enable log level 5
- * For FW module ID 7 enable log level 6
- * For valid values of log levels check enum DBGLOG_LOG_LVL and
- * for valid values of module ids check enum WLAN_MODULE_ID.
- *
- * Related: None
- *
- * Supported Feature: Debugging
- *
- * Usage: Internal/External
- *
- *
- */
-
-#define CFG_ENABLE_FW_MODULE_LOG_LEVEL "gFwDebugModuleLoglevel"
-#define CFG_ENABLE_FW_MODULE_LOG_DEFAULT "2,1,3,1,5,1,9,1,13,1,14,1,18,1,19,1,26,1,28,1,29,1,31,1,36,1,38,1,46,1,47,1,50,1,52,1,53,1,56,1,60,1,61,1,4,1"
-
#ifdef ENABLE_MTRACE_LOG
/*
* Enable MTRACE for all modules
@@ -3641,7 +3606,6 @@ struct hdd_config {
bool IpaClkScalingEnable;
bool fRegChangeDefCountry;
bool advertiseConcurrentOperation;
- uint8_t enableFwModuleLogLevel[FW_MODULE_LOG_LEVEL_STRING_LENGTH];
#ifdef FEATURE_WLAN_FORCE_SAP_SCC
uint8_t SapSccChanAvoidance;
diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c
index 9930622a2bab..6307b5264c97 100644
--- a/core/hdd/src/wlan_hdd_cfg.c
+++ b/core/hdd/src/wlan_hdd_cfg.c
@@ -470,11 +470,6 @@ struct reg_table_entry g_registry_table[] = {
CFG_PERIODIC_STATS_DISPLAY_TIME_MAX),
#endif
- REG_VARIABLE_STRING(CFG_ENABLE_FW_MODULE_LOG_LEVEL, WLAN_PARAM_String,
- struct hdd_config, enableFwModuleLogLevel,
- VAR_FLAGS_OPTIONAL,
- (void *)CFG_ENABLE_FW_MODULE_LOG_DEFAULT),
-
#ifdef DHCP_SERVER_OFFLOAD
REG_VARIABLE_STRING(CFG_DHCP_SERVER_IP_NAME, WLAN_PARAM_String,
struct hdd_config, dhcpServerIP,
diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c
index c1d0d63da107..b04d923f4a85 100644
--- a/core/hdd/src/wlan_hdd_main.c
+++ b/core/hdd/src/wlan_hdd_main.c
@@ -4579,9 +4579,6 @@ static QDF_STATUS hdd_check_for_existing_macaddr(struct hdd_context *hdd_ctx,
static void hdd_set_fw_log_params(struct hdd_context *hdd_ctx,
struct hdd_adapter *adapter)
{
- uint8_t count = 0, numentries = 0,
- moduleloglevel[FW_MODULE_LOG_LEVEL_STRING_LENGTH];
- uint32_t value = 0;
QDF_STATUS status;
uint16_t enable_fw_log_level, enable_fw_log_type;
int ret;
@@ -4617,51 +4614,8 @@ static void hdd_set_fw_log_params(struct hdd_context *hdd_ctx,
hdd_err("Failed to enable FW log level ret %d",
ret);
- hdd_string_to_u8_array(
- hdd_ctx->config->enableFwModuleLogLevel,
- moduleloglevel,
- &numentries,
- FW_MODULE_LOG_LEVEL_STRING_LENGTH);
-
- while (count < numentries) {
- /*
- * FW module log level input string looks like
- * below:
- * gFwDebugModuleLoglevel=,
- * ,...
- * For example:
- * gFwDebugModuleLoglevel=
- * 1,0,2,1,3,2,4,3,5,4,6,5,7,6
- * Above input string means :
- * For FW module ID 1 enable log level 0
- * For FW module ID 2 enable log level 1
- * For FW module ID 3 enable log level 2
- * For FW module ID 4 enable log level 3
- * For FW module ID 5 enable log level 4
- * For FW module ID 6 enable log level 5
- * For FW module ID 7 enable log level 6
- */
-
- if ((moduleloglevel[count] > WLAN_MODULE_ID_MAX)
- || (moduleloglevel[count + 1] > DBGLOG_LVL_MAX)) {
- hdd_err("Module id %d and dbglog level %d input length is more than max",
- moduleloglevel[count],
- moduleloglevel[count + 1]);
- return;
- }
-
- value = moduleloglevel[count] << 16;
- value |= moduleloglevel[count + 1];
- ret = sme_cli_set_command(adapter->session_id,
- WMI_DBGLOG_MOD_LOG_LEVEL,
- value, DBG_CMD);
- if (ret != 0)
- hdd_err("Failed to enable FW module log level %d ret %d",
- value, ret);
-
- count += 2;
- }
-
+ sme_enable_fw_module_log_level(hdd_ctx->mac_handle,
+ adapter->session_id);
}
#else
static void hdd_set_fw_log_params(struct hdd_context *hdd_ctx,
diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h
index 0567f13a08c2..6c0006590837 100644
--- a/core/sme/inc/sme_api.h
+++ b/core/sme/inc/sme_api.h
@@ -3167,4 +3167,13 @@ sme_get_roam_scan_stats(mac_handle_t mac_handle, roam_scan_stats_cb cb,
*/
void sme_update_score_config(mac_handle_t mac_handle,
struct scoring_config *score_config);
+
+/**
+ * sme_enable_fw_module_log_level() - enable fw module log level
+ * @mac_handle: handle returned by mac_open
+ * @vdev_id: vdev id
+ *
+ * Return: None
+ */
+void sme_enable_fw_module_log_level(mac_handle_t mac_handle, int vdev_id);
#endif /* #if !defined( __SME_API_H ) */
diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c
index b944e5441752..3db7a103ffc7 100644
--- a/core/sme/src/common/sme_api.c
+++ b/core/sme/src/common/sme_api.c
@@ -16462,3 +16462,59 @@ void sme_update_score_config(mac_handle_t mac_handle,
score_config->oce_wan_scoring.score_pcnt15_to_12 =
mlme_scoring_cfg->oce_wan_scoring.score_pcnt15_to_12;
}
+
+void sme_enable_fw_module_log_level(mac_handle_t mac_handle, int vdev_id)
+{
+ QDF_STATUS status;
+ struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
+ uint8_t *enable_fw_module_log_level;
+ uint8_t enable_fw_module_log_level_num;
+ uint8_t count = 0;
+ uint32_t value = 0;
+ int ret;
+
+ status = ucfg_fwol_get_enable_fw_module_log_level(
+ mac_ctx->psoc, &enable_fw_module_log_level,
+ &enable_fw_module_log_level_num);
+ if (QDF_IS_STATUS_ERROR(status))
+ return;
+
+ while (count < enable_fw_module_log_level_num) {
+ /*
+ * FW module log level input array looks like
+ * below:
+ * enable_fw_module_log_level = {,
+ * ,...}
+ * For example:
+ * enable_fw_module_log_level=
+ * {1,0,2,1,3,2,4,3,5,4,6,5,7,6}
+ * Above input array means :
+ * For FW module ID 1 enable log level 0
+ * For FW module ID 2 enable log level 1
+ * For FW module ID 3 enable log level 2
+ * For FW module ID 4 enable log level 3
+ * For FW module ID 5 enable log level 4
+ * For FW module ID 6 enable log level 5
+ * For FW module ID 7 enable log level 6
+ */
+
+ if ((enable_fw_module_log_level[count] > WLAN_MODULE_ID_MAX) ||
+ (enable_fw_module_log_level[count + 1] > DBGLOG_LVL_MAX)) {
+ sme_err("Module id %d or dbglog level %d input value is more than max",
+ enable_fw_module_log_level[count],
+ enable_fw_module_log_level[count + 1]);
+ continue;
+ }
+
+ value = enable_fw_module_log_level[count] << 16;
+ value |= enable_fw_module_log_level[count + 1];
+ ret = sme_cli_set_command(vdev_id,
+ WMI_DBGLOG_MOD_LOG_LEVEL,
+ value, DBG_CMD);
+ if (ret != 0)
+ sme_err("Failed to enable FW module log level %d ret %d",
+ value, ret);
+
+ count += 2;
+ }
+}