diff --git a/fw_offload/core/inc/wlan_fw_offload_main.h b/fw_offload/core/inc/wlan_fw_offload_main.h
index 82c97e857a..01d5ec49c5 100644
--- a/fw_offload/core/inc/wlan_fw_offload_main.h
+++ b/fw_offload/core/inc/wlan_fw_offload_main.h
@@ -112,11 +112,30 @@ struct wlan_fwol_ie_whitelist {
* coex_config: coex config items
* thermal_temp_cfg: Thermal temperature related config items
* ie_whitelist_cfg: IE Whitelist related config items
+ * @ani_enabled: ANI enable/disable
+ * @enable_rts_sifsbursting: Enable RTS SIFS Bursting
+ * @max_mpdus_inampdu: Max number of MPDUS
+ * @arp_ac_category: ARP AC category
+ * @enable_phy_reg_retention: Enable PHY reg retention
+ * @upper_brssi_thresh: Upper BRSSI threshold
+ * @lower_brssi_thresh: Lower BRSSI threshold
+ * @enable_dtim_1chrx: Enable/disable DTIM 1 CHRX
+ * @alternative_chainmask_enabled: Alternate chainmask
*/
struct wlan_fwol_cfg {
+ /* Add CFG and INI items here */
struct wlan_fwol_coex_config coex_config;
struct wlan_fwol_thermal_temp thermal_temp_cfg;
struct wlan_fwol_ie_whitelist ie_whitelist_cfg;
+ bool ani_enabled;
+ bool enable_rts_sifsbursting;
+ uint8_t max_mpdus_inampdu;
+ uint32_t arp_ac_category;
+ uint8_t enable_phy_reg_retention;
+ uint16_t upper_brssi_thresh;
+ uint16_t lower_brssi_thresh;
+ bool enable_dtim_1chrx;
+ bool alternative_chainmask_enabled;
};
/**
diff --git a/fw_offload/core/src/wlan_fw_offload_main.c b/fw_offload/core/src/wlan_fw_offload_main.c
index c4b05d788f..3055dbfa42 100644
--- a/fw_offload/core/src/wlan_fw_offload_main.c
+++ b/fw_offload/core/src/wlan_fw_offload_main.c
@@ -108,6 +108,17 @@ QDF_STATUS fwol_cfg_on_psoc_enable(struct wlan_objmgr_psoc *psoc)
fwol_init_coex_config_in_cfg(psoc, &fwol_cfg->coex_config);
fwol_init_thermal_temp_in_cfg(psoc, &fwol_cfg->thermal_temp_cfg);
fwol_init_ie_whiltelist_in_cfg(psoc, &fwol_cfg->ie_whitelist_cfg);
+ fwol_cfg->ani_enabled = cfg_get(psoc, CFG_ENABLE_ANI);
+ fwol_cfg->enable_rts_sifsbursting =
+ cfg_get(psoc, CFG_SET_RTS_FOR_SIFS_BURSTING);
+ fwol_cfg->max_mpdus_inampdu = cfg_get(psoc, CFG_MAX_MPDUS_IN_AMPDU);
+ fwol_cfg->arp_ac_category = cfg_get(psoc, CFG_ARP_AC_CATEGORY);
+ fwol_cfg->enable_phy_reg_retention = cfg_get(psoc, CFG_ENABLE_PHY_REG);
+ fwol_cfg->upper_brssi_thresh = cfg_get(psoc, CFG_UPPER_BRSSI_THRESH);
+ fwol_cfg->lower_brssi_thresh = cfg_get(psoc, CFG_LOWER_BRSSI_THRESH);
+ 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);
return status;
}
diff --git a/fw_offload/dispatcher/inc/cfg_fwol.h b/fw_offload/dispatcher/inc/cfg_fwol.h
index 3596bdd45e..91a2f75580 100644
--- a/fw_offload/dispatcher/inc/cfg_fwol.h
+++ b/fw_offload/dispatcher/inc/cfg_fwol.h
@@ -22,13 +22,14 @@
#include "cfg_define.h"
#include "cfg_converged.h"
#include "qdf_types.h"
-
#include "cfg_coex.h"
#include "cfg_thermal_temp.h"
#include "cfg_ie_whitelist.h"
+#include "cfg_fwol_generic.h"
#define CFG_FWOL_ALL \
CFG_COEX_ALL \
+ CFG_FWOL_GENERIC_ALL \
CFG_IE_WHITELIST \
CFG_THERMAL_TEMP_ALL
diff --git a/fw_offload/dispatcher/inc/cfg_fwol_generic.h b/fw_offload/dispatcher/inc/cfg_fwol_generic.h
new file mode 100644
index 0000000000..3e88c3db7a
--- /dev/null
+++ b/fw_offload/dispatcher/inc/cfg_fwol_generic.h
@@ -0,0 +1,248 @@
+/*
+ * Copyright (c) 2012-2018 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
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/**
+ * DOC: This file contains centralized definitions of converged configuration.
+ */
+
+#ifndef __CFG_FWOL_GENERIC_H
+#define __CFG_FWOL_GENERIC_H
+
+
+/*
+ *
+ *
+ * gEnableANI - Enable Adaptive Noise Immunity
+ * @Min: 0
+ * @Max: 1
+ * @Default: 1
+ *
+ * This ini is used to enable or disable Adaptive Noise Immunity.
+ *
+ * Related: None
+ *
+ * Supported Feature: ANI
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_ENABLE_ANI CFG_INI_BOOL( \
+ "gEnableANI", \
+ 1, \
+ "Enable/Disable Adaptive Noise Immunity")
+
+/**
+ * gSetRTSForSIFSBursting - set rts for sifs bursting
+ * @Min: 0
+ * @Max: 1
+ * @Default: 0
+ *
+ * This ini set rts for sifs bursting
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_SET_RTS_FOR_SIFS_BURSTING CFG_INI_BOOL( \
+ "gSetRTSForSIFSBursting", \
+ 0, \
+ "Set rts for sifs bursting")
+
+/**
+ *
+ * gMaxMPDUsInAMPDU - max mpdus in ampdu
+ * @Min: 0
+ * @Max: 64
+ * @Default: 0
+ *
+ * This ini configure max mpdus in ampdu
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_MAX_MPDUS_IN_AMPDU CFG_INI_INT( \
+ "gMaxMPDUsInAMPDU", \
+ 0, \
+ 64, \
+ 0, \
+ CFG_VALUE_OR_DEFAULT, \
+ "This ini configure max mpdus in ampdu")
+
+/**
+ * arp_ac_category - ARP access category
+ * @Min: 0
+ * @Max: 3
+ * @Default: 3
+ *
+ * Firmware by default categorizes ARP packets with VOICE TID.
+ * This ini shall be used to override the default configuration.
+ * Access category enums are referenced in ieee80211_common.h
+ * WME_AC_BE = 0 (Best effort)
+ * WME_AC_BK = 1 (Background)
+ * WME_AC_VI = 2 (Video)
+ * WME_AC_VO = 3 (Voice)
+ *
+ * Related: none
+ *
+ * Usage: Internal/External
+ *
+ *
+ */
+#define CFG_ARP_AC_CATEGORY CFG_INI_INT( \
+ "arp_ac_category", \
+ 0, \
+ 3, \
+ 3, \
+ CFG_VALUE_OR_DEFAULT, \
+ "Override the default ARP AC configuration")
+
+/*
+ *
+ * gEnableFastPwrTransition - Configuration for fast power transition
+ * @Min: 0
+ * @Max: 2
+ * @Default: 0
+ *
+ * This ini supported values:
+ * 0x0: Phy register retention disabled (Higher timeline, Good for power)
+ * 0x1: Phy register retention statically enabled
+ * 0x2: Phy register retention enabled/disabled dynamically
+ *
+ * Usage: Internal
+ *
+ *
+ */
+#define CFG_ENABLE_PHY_REG CFG_INI_UINT( \
+ "gEnableFastPwrTransition", \
+ 0x0, \
+ 0x2, \
+ 0x0, \
+ CFG_VALUE_OR_DEFAULT, \
+ "Configuration for fast power transition")
+
+/*
+ *
+ * gUpperBrssiThresh - Sets Upper threshold for beacon RSSI
+ * @Min: 36
+ * @Max: 66
+ * @Default: 46
+ *
+ * This ini sets Upper beacon threshold for beacon RSSI in FW
+ * Used to reduced RX chainmask in FW, once this threshold is
+ * reached FW will switch to 1X1 (Single chain).
+ *
+ * Supported Feature: STA
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_UPPER_BRSSI_THRESH CFG_INI_UINT( \
+ "gUpperBrssiThresh", \
+ 36, \
+ 66, \
+ 46, \
+ CFG_VALUE_OR_DEFAULT, \
+ "Sets Upper threshold for beacon RSSI")
+
+/*
+ *
+ * gLowerrBrssiThresh - Sets Lower threshold for beacon RSSI
+ * @Min: 6
+ * @Max: 36
+ * @Default: 26
+ *
+ * This ini sets Lower beacon threshold for beacon RSSI in FW
+ * Used to increase RX chainmask in FW, once this threshold is
+ * reached FW will switch to 2X2 chain.
+ *
+ * Supported Feature: STA
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_LOWER_BRSSI_THRESH CFG_INI_UINT( \
+ "gLowerBrssiThresh", \
+ 6, \
+ 36, \
+ 26, \
+ CFG_VALUE_OR_DEFAULT, \
+ "Sets Lower threshold for beacon RSSI")
+
+/*
+ *
+ * gDtim1ChRxEnable - Enable/Disable DTIM 1Chrx feature
+ * @Min: 0
+ * @Max: 1
+ * @Default: 1
+ *
+ * This ini Enables or Disables DTIM 1CHRX feature in FW
+ * If this flag is set FW enables shutting off one chain
+ * while going to power save.
+ *
+ * Supported Feature: STA
+ *
+ * Usage: External
+ *
+ *
+ */
+#define CFG_DTIM_1CHRX_ENABLE CFG_INI_BOOL( \
+ "gDtim1ChRxEnable", \
+ 1, \
+ "Enable/Disable DTIM 1Chrx feature")
+
+/*
+ *
+ * gEnableAlternativeChainmask - Enable Co-Ex Alternative Chainmask
+ * @Min: 0
+ * @Max: 1
+ * @Default: 0
+ *
+ * This ini is used to enable/disable the Co-ex Alternative Chainmask
+ * feature via the WMI_PDEV_PARAM_ALTERNATIVE_CHAINMASK_SCHEME
+ * firmware parameter.
+ *
+ * Related: None
+ *
+ * Supported Feature: STA
+ *
+ * Usage: Internal/External
+ *
+ *
+ */
+#define CFG_ENABLE_COEX_ALT_CHAINMASK CFG_INI_BOOL( \
+ "gEnableAlternativeChainmask", \
+ 0, \
+ "Enable Co-Ex Alternative Chainmask")
+
+
+#define CFG_FWOL_GENERIC_ALL \
+ CFG(CFG_ENABLE_ANI) \
+ CFG(CFG_SET_RTS_FOR_SIFS_BURSTING) \
+ CFG(CFG_MAX_MPDUS_IN_AMPDU) \
+ CFG(CFG_ARP_AC_CATEGORY) \
+ CFG(CFG_ENABLE_PHY_REG) \
+ CFG(CFG_UPPER_BRSSI_THRESH) \
+ CFG(CFG_LOWER_BRSSI_THRESH) \
+ CFG(CFG_DTIM_1CHRX_ENABLE) \
+ CFG(CFG_ENABLE_COEX_ALT_CHAINMASK)
+
+#endif
diff --git a/fw_offload/dispatcher/inc/wlan_fwol_ucfg_api.h b/fw_offload/dispatcher/inc/wlan_fwol_ucfg_api.h
index 8dd495756d..454961c79c 100644
--- a/fw_offload/dispatcher/inc/wlan_fwol_ucfg_api.h
+++ b/fw_offload/dispatcher/inc/wlan_fwol_ucfg_api.h
@@ -128,4 +128,85 @@ QDF_STATUS
ucfg_fwol_get_all_whitelist_params(struct wlan_objmgr_psoc *psoc,
struct wlan_fwol_ie_whitelist *whitelist);
+/** ucfg_fwol_get_ani_enabled() - Assigns the ani_enabled value
+ * @psoc: pointer to the psoc object
+ *
+ * Return: QDF Status
+ */
+QDF_STATUS ucfg_fwol_get_ani_enabled(struct wlan_objmgr_psoc *psoc,
+ bool *ani_enabled);
+
+/**
+ * ucfg_fwol_get_ani_enabled() - Assigns the enable_rts_sifsbursting value
+ * @psoc: pointer to the psoc object
+ *
+ * Return: QDF Status
+ */
+QDF_STATUS ucfg_get_enable_rts_sifsbursting(struct wlan_objmgr_psoc *psoc,
+ bool *enable_rts_sifsbursting);
+
+/**
+ * ucfg_get_max_mpdus_inampdu() - Assigns the max_mpdus_inampdu value
+ * @psoc: pointer to the psoc object
+ *
+ * Return: QDF Status
+ */
+QDF_STATUS ucfg_get_max_mpdus_inampdu(struct wlan_objmgr_psoc *psoc,
+ uint8_t *max_mpdus_inampdu);
+
+/**
+ * ucfg_get_arp_ac_category() - Assigns the arp_ac_category value
+ * @psoc: pointer to the psoc object
+ *
+ * Return: QDF Status
+ */
+QDF_STATUS ucfg_get_arp_ac_category(struct wlan_objmgr_psoc *psoc,
+ uint32_t *arp_ac_category);
+
+/**
+ * ucfg_get_enable_phy_reg_retention() - Assigns enable_phy_reg_retention value
+ * @psoc: pointer to the psoc object
+ *
+ * Return: QDF Status
+ */
+QDF_STATUS ucfg_get_enable_phy_reg_retention(struct wlan_objmgr_psoc *psoc,
+ uint8_t *enable_phy_reg_retention);
+
+/**
+ * ucfg_get_upper_brssi_thresh() - Assigns upper_brssi_thresh value
+ * @psoc: pointer to the psoc object
+ *
+ * Return: QDF Status
+ */
+QDF_STATUS ucfg_get_upper_brssi_thresh(struct wlan_objmgr_psoc *psoc,
+ uint16_t *upper_brssi_thresh);
+
+/**
+ * ucfg_get_lower_brssi_thresh() - Assigns lower_brssi_thresh value
+ * @psoc: pointer to the psoc object
+ *
+ * Return: QDF Status
+ */
+QDF_STATUS ucfg_get_lower_brssi_thresh(struct wlan_objmgr_psoc *psoc,
+ uint16_t *lower_brssi_thresh);
+
+/**
+ * ucfg_get_enable_dtim_1chrx() - Assigns enable_dtim_1chrx value
+ * @psoc: pointer to the psoc object
+ *
+ * Return: QDF Status
+ */
+QDF_STATUS ucfg_get_enable_dtim_1chrx(struct wlan_objmgr_psoc *psoc,
+ bool *enable_dtim_1chrx);
+
+/**
+ * ucfg_get_alternate_chainmask_enabled() - Assigns alt chainmask_enabled value
+ * @psoc: pointer to the psoc object
+ *
+ * Return: QDF Status
+ */
+QDF_STATUS
+ucfg_get_alternative_chainmask_enabled(struct wlan_objmgr_psoc *psoc,
+ bool *alternative_chainmask_enabled);
+
#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 fb842e003b..cafb3b83f2 100644
--- a/fw_offload/dispatcher/src/wlan_fwol_ucfg_api.c
+++ b/fw_offload/dispatcher/src/wlan_fwol_ucfg_api.c
@@ -215,6 +215,81 @@ ucfg_fwol_set_ie_whitelist(struct wlan_objmgr_psoc *psoc, bool ie_whitelist)
return QDF_STATUS_SUCCESS;
}
+QDF_STATUS ucfg_fwol_get_ani_enabled(struct wlan_objmgr_psoc *psoc,
+ bool *ani_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;
+ }
+
+ *ani_enabled = fwol_obj->cfg.ani_enabled;
+ return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS ucfg_get_enable_rts_sifsbursting(struct wlan_objmgr_psoc *psoc,
+ bool *enable_rts_sifsbursting)
+{
+ 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_rts_sifsbursting = fwol_obj->cfg.enable_rts_sifsbursting;
+ return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS ucfg_get_max_mpdus_inampdu(struct wlan_objmgr_psoc *psoc,
+ uint8_t *max_mpdus_inampdu)
+{
+ 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;
+ }
+
+ *max_mpdus_inampdu = fwol_obj->cfg.max_mpdus_inampdu;
+ return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS ucfg_get_arp_ac_category(struct wlan_objmgr_psoc *psoc,
+ uint32_t *arp_ac_category)
+{
+ 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;
+ }
+
+ *arp_ac_category = fwol_obj->cfg.arp_ac_category;
+ return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS ucfg_get_enable_phy_reg_retention(struct wlan_objmgr_psoc *psoc,
+ uint8_t *enable_phy_reg_retention)
+{
+ 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_phy_reg_retention = fwol_obj->cfg.enable_phy_reg_retention;
+ return QDF_STATUS_SUCCESS;
+}
+
bool ucfg_validate_ie_bitmaps(struct wlan_objmgr_psoc *psoc)
{
struct wlan_fwol_psoc_obj *fwol_obj;
@@ -250,6 +325,67 @@ ucfg_fwol_get_all_whitelist_params(struct wlan_objmgr_psoc *psoc,
}
*whitelist = fwol_obj->cfg.ie_whitelist_cfg;
-
+ return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS ucfg_get_upper_brssi_thresh(struct wlan_objmgr_psoc *psoc,
+ uint16_t *upper_brssi_thresh)
+{
+ 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;
+ }
+
+ *upper_brssi_thresh = fwol_obj->cfg.upper_brssi_thresh;
+ return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS ucfg_get_lower_brssi_thresh(struct wlan_objmgr_psoc *psoc,
+ uint16_t *lower_brssi_thresh)
+{
+ 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;
+ }
+
+ *lower_brssi_thresh = fwol_obj->cfg.lower_brssi_thresh;
+ return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS ucfg_get_enable_dtim_1chrx(struct wlan_objmgr_psoc *psoc,
+ bool *enable_dtim_1chrx)
+{
+ 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_dtim_1chrx = fwol_obj->cfg.enable_dtim_1chrx;
+ return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS
+ucfg_get_alternative_chainmask_enabled(struct wlan_objmgr_psoc *psoc,
+ bool *alternative_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;
+ }
+
+ *alternative_chainmask_enabled =
+ fwol_obj->cfg.alternative_chainmask_enabled;
return QDF_STATUS_SUCCESS;
}