diff --git a/fw_offload/core/inc/wlan_fw_offload_main.h b/fw_offload/core/inc/wlan_fw_offload_main.h index 01d5ec49c5..bfc1d339d5 100644 --- a/fw_offload/core/inc/wlan_fw_offload_main.h +++ b/fw_offload/core/inc/wlan_fw_offload_main.h @@ -121,6 +121,14 @@ struct wlan_fwol_ie_whitelist { * @lower_brssi_thresh: Lower BRSSI threshold * @enable_dtim_1chrx: Enable/disable DTIM 1 CHRX * @alternative_chainmask_enabled: Alternate chainmask + * @smart_chainmask_enabled: Enable/disable chainmask + * @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 + * @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 + * @dhcp_max_num_clients: Max number of DHCP client supported */ struct wlan_fwol_cfg { /* Add CFG and INI items here */ @@ -136,6 +144,20 @@ struct wlan_fwol_cfg { uint16_t lower_brssi_thresh; bool enable_dtim_1chrx; bool alternative_chainmask_enabled; + bool smart_chainmask_enabled; + uint16_t get_rts_profile; + uint16_t enable_fw_log_level; + uint16_t enable_fw_log_type; +#ifdef FEATURE_WLAN_RA_FILTERING + bool is_rate_limit_enabled; +#endif +#ifdef WLAN_FEATURE_TSF + uint32_t tsf_gpio_pin; +#endif +#ifdef DHCP_SERVER_OFFLOAD + bool enable_dhcp_server_offload; + uint32_t dhcp_max_num_clients; +#endif }; /** diff --git a/fw_offload/core/src/wlan_fw_offload_main.c b/fw_offload/core/src/wlan_fw_offload_main.c index 3055dbfa42..7675af7824 100644 --- a/fw_offload/core/src/wlan_fw_offload_main.c +++ b/fw_offload/core/src/wlan_fw_offload_main.c @@ -91,6 +91,70 @@ fwol_init_ie_whiltelist_in_cfg(struct wlan_objmgr_psoc *psoc, whitelist->ie_bitmap_7 = cfg_get(psoc, CFG_PROBE_REQ_IE_BIT_MAP7); } +/** + * ucfg_fwol_fetch_dhcp_server_settings: Populate the enable_dhcp_server_offload + * and dhcp_max_num_clients from cfg + * @psoc: The global psoc handler + * @fwol_cfg: The cfg structure + * + * Return: none + */ +#ifdef DHCP_SERVER_OFFLOAD +static void ucfg_fwol_fetch_dhcp_server_settings(struct wlan_objmgr_psoc *psoc, + struct wlan_fwol_cfg *fwol_cfg) +{ + fwol_cfg->enable_dhcp_server_offload = + cfg_get(psoc, CFG_DHCP_SERVER_OFFLOAD_SUPPORT); + fwol_cfg->dhcp_max_num_clients = + cfg_get(psoc, CFG_DHCP_SERVER_OFFLOAD_NUM_CLIENT); +} +#else +static void ucfg_fwol_fetch_dhcp_server_settings(struct wlan_objmgr_psoc *psoc, + struct wlan_fwol_cfg *fwol_cfg) +{ +} +#endif + +/** + * ucfg_fwol_fetch_tsf_gpio_pin: Populate the tsf_gpio_pin from cfg + * @psoc: The global psoc handler + * @fwol_cfg: The cfg structure + * + * Return: none + */ +#ifdef WLAN_FEATURE_TSF +static void ucfg_fwol_fetch_tsf_gpio_pin(struct wlan_objmgr_psoc *psoc, + struct wlan_fwol_cfg *fwol_cfg) +{ + fwol_cfg->tsf_gpio_pin = cfg_get(psoc, CFG_SET_TSF_GPIO_PIN); +} +#else +static void ucfg_fwol_fetch_tsf_gpio_pin(struct wlan_objmgr_psoc *psoc, + struct wlan_fwol_cfg *fwol_cfg) +{ +} +#endif + +/** + * ucfg_fwol_fetch_ra_filter: Populate the RA filter enabled or not from cfg + * @psoc: The global psoc handler + * @fwol_cfg: The cfg structure + * + * Return: none + */ +#ifdef FEATURE_WLAN_RA_FILTERING +static void ucfg_fwol_fetch_ra_filter(struct wlan_objmgr_psoc *psoc, + struct wlan_fwol_cfg *fwol_cfg) +{ + fwol_cfg->is_rate_limit_enabled = cfg_get(psoc, CFG_RA_FILTER_ENABLE); +} +#else +static void ucfg_fwol_fetch_ra_filter(struct wlan_objmgr_psoc *psoc, + struct wlan_fwol_cfg *fwol_cfg) +{ +} +#endif + QDF_STATUS fwol_cfg_on_psoc_enable(struct wlan_objmgr_psoc *psoc) { QDF_STATUS status = QDF_STATUS_SUCCESS; @@ -119,6 +183,15 @@ QDF_STATUS fwol_cfg_on_psoc_enable(struct wlan_objmgr_psoc *psoc) fwol_cfg->enable_dtim_1chrx = cfg_get(psoc, CFG_DTIM_1CHRX_ENABLE); fwol_cfg->alternative_chainmask_enabled = cfg_get(psoc, CFG_ENABLE_COEX_ALT_CHAINMASK); + fwol_cfg->smart_chainmask_enabled = + cfg_get(psoc, CFG_ENABLE_SMART_CHAINMASK); + fwol_cfg->get_rts_profile = cfg_get(psoc, CFG_ENABLE_FW_RTS_PROFILE); + 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); + 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); return status; } diff --git a/fw_offload/dispatcher/inc/cfg_fwol_generic.h b/fw_offload/dispatcher/inc/cfg_fwol_generic.h index 3e88c3db7a..c04bb60ca7 100644 --- a/fw_offload/dispatcher/inc/cfg_fwol_generic.h +++ b/fw_offload/dispatcher/inc/cfg_fwol_generic.h @@ -233,8 +233,215 @@ 0, \ "Enable Co-Ex Alternative Chainmask") +/* + * + * gEnableSmartChainmask - Enable Smart Chainmask + * @Min: 0 + * @Max: 1 + * @Default: 0 + * + * This ini is used to enable/disable the Smart Chainmask feature via + * the WMI_PDEV_PARAM_SMART_CHAINMASK_SCHEME firmware parameter. + * + * Related: None + * + * Supported Feature: STA + * + * Usage: Internal/External + * + * + */ +#define CFG_ENABLE_SMART_CHAINMASK CFG_INI_BOOL( \ + "gEnableSmartChainmask", \ + 0, \ + "Enable/disable the Smart Chainmask feature") + +/* + * + * gEnableRTSProfiles - It will use configuring different RTS profiles + * @Min: 0 + * @Max: 66 + * @Default: 33 + * + * This ini used for configuring different RTS profiles + * to firmware. + * Following are the valid values for the rts profile: + * RTSCTS_DISABLED 0 + * NOT_ALLOWED 1 + * NOT_ALLOWED 2 + * RTSCTS_DISABLED 16 + * RTSCTS_ENABLED_4_SECOND_RATESERIES 17 + * CTS2SELF_ENABLED_4_SECOND_RATESERIES 18 + * RTSCTS_DISABLED 32 + * RTSCTS_ENABLED_4_SWRETRIES 33 + * CTS2SELF_ENABLED_4_SWRETRIES 34 + * NOT_ALLOWED 48 + * NOT_ALLOWED 49 + * NOT_ALLOWED 50 + * RTSCTS_DISABLED 64 + * RTSCTS_ENABLED_4_ALL_RATESERIES 65 + * CTS2SELF_ENABLED_4_ALL_RATESERIES 66 + * + * Related: None + * + * Supported Feature: STA + * + * Usage: Internal/External + * + * + */ +#define CFG_ENABLE_FW_RTS_PROFILE CFG_INI_INT( \ + "gEnableRTSProfiles", \ + 0, \ + 66, \ + 33, \ + CFG_VALUE_OR_DEFAULT, \ + "It is used to configure different RTS profiles") + +/* + * gFwDebugLogLevel: Takes values from enum DBGLOG_LOG_LVL, + * make default value as DBGLOG_WARN to enable error and + * warning logs by default. + * @Min: 0 + * @Max: 255 + * @Default: 3 + * + * Related: None + * + * Supported Features: Debugging + * + * Usage: Internal + * + * + */ +#define CFG_ENABLE_FW_DEBUG_LOG_LEVEL CFG_INI_INT( \ + "gFwDebugLogLevel", \ + 0, \ + 255, \ + 3, \ + CFG_VALUE_OR_DEFAULT, \ + "enable error and warning logs by default") + +/* + * gFwDebugLogType: takes values from enum dbglog_process_t, + * make default value as DBGLOG_PROCESS_NET_RAW to give the + * logs to net link since cnss_diag service is started at boot + * time by default. + * @Min: 0 + * @Max: 255 + * @Default: 3 + * + * Related: None + * + * Supported Features: Debugging + * + * Usage: Internal + * + * + */ +#define CFG_ENABLE_FW_LOG_TYPE CFG_INI_INT( \ + "gFwDebugLogType", \ + 0, \ + 255, \ + 3, \ + CFG_VALUE_OR_DEFAULT, \ + "Default value to be given to the net link cnss_diag service") + +#ifdef FEATURE_WLAN_RA_FILTERING +/* + * gRAFilterEnable + * @Min: 0 + * @Max: 1 + * @Default: 1 + * + * Related: None + * + * Usage: Internal + * + * + */ +#define CFG_RA_FILTER_ENABLE CFG_INI_BOOL( \ + "gRAFilterEnable", \ + 1, \ + "Enable RA Filter") +#else +#define CFG_RA_FILTER_ENABLE +#endif + +/* + * gtsf_gpio_pin + * @Min: 0 + * @Max: 254 + * @Default: 255 + * + * GPIO pin to toggle when capture tsf + * + * Related: None + * + * Usage: Internal + * + * + */ +#define CFG_SET_TSF_GPIO_PIN CFG_INI_INT( \ + "gtsf_gpio_pin", \ + 0, \ + 254, \ + 255, \ + CFG_VALUE_OR_DEFAULT, \ + "GPIO pin to toggle when capture tsf") + +#ifdef DHCP_SERVER_OFFLOAD +/* + * gEnableDeauthToDisassocMap + * @Min: 0 + * @Max: 1 + * @Default: 0 + * + * DHCP Server offload support + * + * Related: None + * + * Usage: Internal + * + * + */ +#define CFG_DHCP_SERVER_OFFLOAD_SUPPORT CFG_INI_BOOL( \ + "gEnableDeauthToDisassocMap", \ + 0, \ + "DHCP Server offload support") + +/* + * gDHCPMaxNumClients + * @Min: 1 + * @Max: 8 + * @Default: 8 + * + * Number of DHCP server offload clients + * + * Related: None + * + * Usage: Internal + * + * + */ +#define CFG_DHCP_SERVER_OFFLOAD_NUM_CLIENT CFG_INI_INT( \ + "gDHCPMaxNumClients", \ + 1, \ + 8, \ + 8, \ + CFG_VALUE_OR_DEFAULT, \ + "Number of DHCP server offload clients") + +#define CFG_FWOL_DHCP \ + CFG(CFG_DHCP_SERVER_OFFLOAD_SUPPORT) \ + CFG(CFG_DHCP_SERVER_OFFLOAD_NUM_CLIENT) + +#else +#define CFG_FWOL_DHCP +#endif #define CFG_FWOL_GENERIC_ALL \ + CFG_FWOL_DHCP \ CFG(CFG_ENABLE_ANI) \ CFG(CFG_SET_RTS_FOR_SIFS_BURSTING) \ CFG(CFG_MAX_MPDUS_IN_AMPDU) \ @@ -243,6 +450,12 @@ CFG(CFG_UPPER_BRSSI_THRESH) \ CFG(CFG_LOWER_BRSSI_THRESH) \ CFG(CFG_DTIM_1CHRX_ENABLE) \ - CFG(CFG_ENABLE_COEX_ALT_CHAINMASK) + CFG(CFG_ENABLE_COEX_ALT_CHAINMASK) \ + CFG(CFG_ENABLE_SMART_CHAINMASK) \ + CFG(CFG_ENABLE_FW_RTS_PROFILE) \ + CFG(CFG_ENABLE_FW_DEBUG_LOG_LEVEL) \ + CFG(CFG_ENABLE_FW_LOG_TYPE) \ + CFG(CFG_RA_FILTER_ENABLE) \ + CFG(CFG_SET_TSF_GPIO_PIN) #endif diff --git a/fw_offload/dispatcher/inc/wlan_fwol_ucfg_api.h b/fw_offload/dispatcher/inc/wlan_fwol_ucfg_api.h index 454961c79c..cb2b757b3f 100644 --- a/fw_offload/dispatcher/inc/wlan_fwol_ucfg_api.h +++ b/fw_offload/dispatcher/inc/wlan_fwol_ucfg_api.h @@ -209,4 +209,92 @@ QDF_STATUS ucfg_get_alternative_chainmask_enabled(struct wlan_objmgr_psoc *psoc, bool *alternative_chainmask_enabled); +/** + * ucfg_get_smart_chainmask_enabled() - Assigns smart_chainmask_enabled value + * @psoc: pointer to the psoc object + * + * Return: QDF Status + */ +QDF_STATUS ucfg_get_smart_chainmask_enabled(struct wlan_objmgr_psoc *psoc, + bool *smart_chainmask_enabled); + +/** + * ucfg_fwol_get_rts_profile() - Assigns get_rts_profile value + * @psoc: pointer to the psoc object + * + * Return: QDF Status + */ +QDF_STATUS ucfg_fwol_get_rts_profile(struct wlan_objmgr_psoc *psoc, + uint16_t *get_rts_profile); + +/** + * ucfg_fwol_get_enable_fw_log_level() - Assigns enable_fw_log_level value + * @psoc: pointer to the psoc object + * + * Return: QDF Status + */ +QDF_STATUS ucfg_fwol_get_enable_fw_log_level(struct wlan_objmgr_psoc *psoc, + uint16_t *enable_fw_log_level); + +/** + * ucfg_fwol_get_enable_fw_log_type() - Assigns enable_fw_log_type value + * @psoc: pointer to the psoc object + * + * Return: QDF Status + */ +QDF_STATUS ucfg_fwol_get_enable_fw_log_type(struct wlan_objmgr_psoc *psoc, + uint16_t *enable_fw_log_type); + +#ifdef FEATURE_WLAN_RA_FILTERING +/** + * ucfg_fwol_set_is_rate_limit_enabled() - Sets the is_rate_limit_enabled value + * @psoc: pointer to the psoc object + * + * Return: QDF Status + */ +QDF_STATUS ucfg_fwol_set_is_rate_limit_enabled(struct wlan_objmgr_psoc *psoc, + bool is_rate_limit_enabled); + +/** + * ucfg_fwol_get_is_rate_limit_enabled() - Assigns is_rate_limit_enabled value + * @psoc: pointer to the psoc object + * + * Return: QDF Status + */ +QDF_STATUS ucfg_fwol_get_is_rate_limit_enabled(struct wlan_objmgr_psoc *psoc, + bool *is_rate_limit_enabled); + +#endif /* FEATURE_WLAN_RA_FILTERING */ + +/** + * ucfg_fwol_get_tsf_gpio_pin() - Assigns tsf_gpio_pin value + * @psoc: pointer to the psoc object + * + * Return: QDF Status + */ + +QDF_STATUS ucfg_fwol_get_tsf_gpio_pin(struct wlan_objmgr_psoc *psoc, + uint32_t *tsf_gpio_pin); + +#ifdef DHCP_SERVER_OFFLOAD +/** + * ucfg_fwol_get_enable_dhcp_server_offload()-Assign enable_dhcp_server_offload + * @psoc: pointer to the psoc object + * + * Return: QDF Status + */ +QDF_STATUS +ucfg_fwol_get_enable_dhcp_server_offload(struct wlan_objmgr_psoc *psoc, + bool *enable_dhcp_server_offload); + +/** + * ucfg_fwol_get_dhcp_max_num_clients() - Assigns dhcp_max_num_clients value + * @psoc: pointer to the psoc object + * + * Return: QDF Status + */ +QDF_STATUS ucfg_fwol_get_dhcp_max_num_clients(struct wlan_objmgr_psoc *psoc, + uint32_t *dhcp_max_num_clients); + +#endif #endif /* _WLAN_FWOL_UCFG_API_H_ */ diff --git a/fw_offload/dispatcher/src/wlan_fwol_ucfg_api.c b/fw_offload/dispatcher/src/wlan_fwol_ucfg_api.c index cafb3b83f2..971a101a01 100644 --- a/fw_offload/dispatcher/src/wlan_fwol_ucfg_api.c +++ b/fw_offload/dispatcher/src/wlan_fwol_ucfg_api.c @@ -389,3 +389,153 @@ ucfg_get_alternative_chainmask_enabled(struct wlan_objmgr_psoc *psoc, fwol_obj->cfg.alternative_chainmask_enabled; return QDF_STATUS_SUCCESS; } + +QDF_STATUS ucfg_get_smart_chainmask_enabled(struct wlan_objmgr_psoc *psoc, + bool *smart_chainmask_enabled) +{ + 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; + } + + *smart_chainmask_enabled = + fwol_obj->cfg.smart_chainmask_enabled; + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS ucfg_fwol_get_rts_profile(struct wlan_objmgr_psoc *psoc, + uint16_t *get_rts_profile) +{ + 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; + } + + *get_rts_profile = fwol_obj->cfg.get_rts_profile; + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS ucfg_fwol_get_enable_fw_log_level(struct wlan_objmgr_psoc *psoc, + uint16_t *enable_fw_log_level) +{ + 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_log_level = fwol_obj->cfg.enable_fw_log_level; + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS ucfg_fwol_get_enable_fw_log_type(struct wlan_objmgr_psoc *psoc, + uint16_t *enable_fw_log_type) +{ + 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_log_type = fwol_obj->cfg.enable_fw_log_type; + 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) +{ + 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; + } + + fwol_obj->cfg.is_rate_limit_enabled = is_rate_limit_enabled; + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS ucfg_fwol_get_is_rate_limit_enabled(struct wlan_objmgr_psoc *psoc, + bool *is_rate_limit_enabled) +{ + 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; + } + + *is_rate_limit_enabled = fwol_obj->cfg.is_rate_limit_enabled; + return QDF_STATUS_SUCCESS; +} +#endif + +#ifdef WLAN_FEATURE_TSF +QDF_STATUS ucfg_fwol_get_tsf_gpio_pin(struct wlan_objmgr_psoc *psoc, + uint32_t *tsf_gpio_pin) +{ + 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; + } + + *tsf_gpio_pin = fwol_obj->cfg.tsf_gpio_pin; + return QDF_STATUS_SUCCESS; +} +#else +QDF_STATUS ucfg_fwol_get_tsf_gpio_pin(struct wlan_objmgr_psoc *psoc, + uint32_t *tsf_gpio_pin) +{ + return QDF_STATUS_SUCCESS; +} +#endif + +#ifdef DHCP_SERVER_OFFLOAD +QDF_STATUS +ucfg_fwol_get_enable_dhcp_server_offload(struct wlan_objmgr_psoc *psoc, + bool *enable_dhcp_server_offload) +{ + 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_dhcp_server_offload = fwol_obj->cfg.enable_dhcp_server_offload; + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS ucfg_fwol_get_dhcp_max_num_clients(struct wlan_objmgr_psoc *psoc, + uint32_t *dhcp_max_num_clients) +{ + 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; + } + + *dhcp_max_num_clients = fwol_obj->cfg.dhcp_max_num_clients; + return QDF_STATUS_SUCCESS; +} +#endif +