Merge android-msm-pixel-4.19-tm into android-msm-pixel-4.19-tm-qpr1
Bug: 238572661
SBMerger: 442815275
Change-Id: I1a9da0e6bc14efe248dfa96a2a9f795fa233e4dd
Signed-off-by: SecurityBot <android-nexus-securitybot@system.gserviceaccount.com>
Signed-off-by: Lucas Wei <lucaswei@google.com>
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 b91f036..f35b278 100644
--- a/components/fw_offload/core/inc/wlan_fw_offload_main.h
+++ b/components/fw_offload/core/inc/wlan_fw_offload_main.h
@@ -183,6 +183,7 @@
* @enable_dhcp_server_offload: DHCP Offload is enabled or not
* @dhcp_max_num_clients: Max number of DHCP client supported
* @dwelltime_params: adaptive dwell time parameters
+ * @disable_hw_assist: Flag to configure HW assist feature in FW
*/
struct wlan_fwol_cfg {
/* Add CFG and INI items here */
@@ -229,6 +230,7 @@
uint32_t dhcp_max_num_clients;
#endif
struct adaptive_dwelltime_params dwelltime_params;
+ bool disable_hw_assist;
};
/**
@@ -340,4 +342,13 @@
QDF_STATUS
fwol_set_adaptive_dwelltime_config(
struct adaptive_dwelltime_params *dwelltime_params);
+/**
+ * fwol_configure_hw_assist() - API to configure HW assist feature in FW
+ * @pdev: pointer to the pdev object
+ * @disable_he_assist: Flag to enable/disable HW assist feature
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS fwol_configure_hw_assist(struct wlan_objmgr_pdev *pdev,
+ bool disable_hw_assist);
#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 8416c93..512a7eb 100644
--- a/components/fw_offload/core/src/wlan_fw_offload_main.c
+++ b/components/fw_offload/core/src/wlan_fw_offload_main.c
@@ -22,6 +22,7 @@
#include "wlan_fw_offload_main.h"
#include "cds_api.h"
#include "wma.h"
+#include "wlan_fwol_tgt_api.h"
struct wlan_fwol_psoc_obj *fwol_get_psoc_obj(struct wlan_objmgr_psoc *psoc)
{
@@ -482,7 +483,7 @@
ucfg_fwol_fetch_tsf_irq_host_gpio_pin(psoc, fwol_cfg);
ucfg_fwol_fetch_dhcp_server_settings(psoc, fwol_cfg);
fwol_cfg->sap_xlna_bypass = cfg_get(psoc, CFG_SET_SAP_XLNA_BYPASS);
-
+ fwol_cfg->disable_hw_assist = cfg_get(psoc, CFG_DISABLE_HW_ASSIST);
return status;
}
@@ -585,3 +586,19 @@
wlan_objmgr_psoc_release_ref(event->psoc, WLAN_FWOL_SB_ID);
qdf_mem_free(event);
}
+
+QDF_STATUS fwol_configure_hw_assist(struct wlan_objmgr_pdev *pdev,
+ bool disable_hw_assist)
+{
+ QDF_STATUS status;
+ struct pdev_params pdev_param;
+
+ pdev_param.param_id = WMI_PDEV_PARAM_DISABLE_HW_ASSIST;
+ pdev_param.param_value = disable_hw_assist;
+
+ status = tgt_fwol_pdev_param_send(pdev, pdev_param);
+ if (QDF_IS_STATUS_ERROR(status))
+ fwol_err("WMI_PDEV_PARAM_DISABLE_HW_ASSIST failed %d", status);
+
+ return status;
+}
diff --git a/components/fw_offload/dispatcher/inc/cfg_fwol_generic.h b/components/fw_offload/dispatcher/inc/cfg_fwol_generic.h
index 3caeee2..bf091f7 100644
--- a/components/fw_offload/dispatcher/inc/cfg_fwol_generic.h
+++ b/components/fw_offload/dispatcher/inc/cfg_fwol_generic.h
@@ -661,6 +661,27 @@
"xlna_bypass", \
0, \
"SAP xLNA bypass control")
+/*
+ * <ini>
+ * g_disable_hw_assist - Flag to disable HW assist feature
+ * @Default: 0
+ *
+ * This ini is used to enable/disable the HW assist feature in FW
+ *
+ * Related: none
+ *
+ * Supported Feature: STA/SAP
+ *
+ * Usage: External
+ *
+ * <ini>
+ */
+
+#define CFG_DISABLE_HW_ASSIST CFG_INI_BOOL( \
+ "g_disable_hw_assist", \
+ 0, \
+ "Disable HW assist feature in FW")
+
#define CFG_FWOL_GENERIC_ALL \
CFG_FWOL_DHCP \
@@ -686,6 +707,6 @@
CFG(CFG_ENABLE_GCMP) \
CFG(CFG_TX_SCH_DELAY) \
CFG(CFG_ENABLE_SECONDARY_RATE) \
- CFG(CFG_SET_SAP_XLNA_BYPASS)
-
+ CFG(CFG_SET_SAP_XLNA_BYPASS) \
+ CFG(CFG_DISABLE_HW_ASSIST)
#endif
diff --git a/components/fw_offload/dispatcher/inc/wlan_fwol_tgt_api.h b/components/fw_offload/dispatcher/inc/wlan_fwol_tgt_api.h
index 4bf88b2..cdf183e 100644
--- a/components/fw_offload/dispatcher/inc/wlan_fwol_tgt_api.h
+++ b/components/fw_offload/dispatcher/inc/wlan_fwol_tgt_api.h
@@ -24,6 +24,7 @@
#include "wlan_fwol_public_structs.h"
+#define FWOL_WILDCARD_PDEV_ID 0
/**
* tgt_fwol_register_ev_handler() - register south bound event handler
* @psoc: psoc handle
@@ -47,4 +48,14 @@
* Return: QDF_STATUS_SUCCESS on success
*/
QDF_STATUS tgt_fwol_register_rx_ops(struct wlan_fwol_rx_ops *rx_ops);
+
+/**
+ * tgt_fwol_pdev_param_send() - send pdev params to firmware
+ * @pdev: pdev handle
+ * @pdev_params: pdev params
+ *
+ * Return: QDF_STATUS_SUCCESS on success
+ */
+QDF_STATUS tgt_fwol_pdev_param_send(struct wlan_objmgr_pdev *pdev,
+ struct pdev_params pdev_param);
#endif /* _WLAN_FWOL_TGT_API_H */
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 f564cb8..1ec3b4e 100644
--- a/components/fw_offload/dispatcher/inc/wlan_fwol_ucfg_api.h
+++ b/components/fw_offload/dispatcher/inc/wlan_fwol_ucfg_api.h
@@ -551,6 +551,36 @@
return QDF_STATUS_SUCCESS;
}
#endif
+
+/**
+ * ucfg_fwol_configure_global_params - API to configure global params
+ * @psoc: pointer to psoc object
+ * @pdev: pointer to pdev object
+ *
+ * Used to configure global firmware params. This is invoked from hdd during
+ * bootup.
+ *
+ * Return: QDF Status
+ */
+QDF_STATUS ucfg_fwol_configure_global_params(struct wlan_objmgr_psoc *psoc,
+ struct wlan_objmgr_pdev *pdev);
+
+/**
+ * ucfg_fwol_configure_vdev_params - API to configure vdev specific params
+ * @psoc: pointer to psoc object
+ * @pdev: pointer to pdev object
+ * @device_mode: device mode
+ * @vdev_id: vdev ID
+ *
+ * Used to configure per vdev firmware params based on device mode. This is
+ * invoked from hdd during vdev creation.
+ *
+ * Return: QDF Status
+ */
+QDF_STATUS ucfg_fwol_configure_vdev_params(struct wlan_objmgr_psoc *psoc,
+ struct wlan_objmgr_pdev *pdev,
+ enum QDF_OPMODE device_mode,
+ uint8_t vdev_id);
#else
static inline QDF_STATUS ucfg_fwol_psoc_open(struct wlan_objmgr_psoc *psoc)
{
@@ -839,6 +869,21 @@
}
#endif /* FEATURE_WLAN_RA_FILTERING */
+static inline QDF_STATUS
+ucfg_fwol_configure_global_params(struct wlan_objmgr_psoc *psoc,
+ struct wlan_objmgr_pdev *pdev)
+{
+ return QDF_STATUS_E_FAILURE;
+}
+
+static inline QDF_STATUS
+ucfg_fwol_configure_vdev_params(struct wlan_objmgr_psoc *psoc,
+ struct wlan_objmgr_pdev *pdev,
+ enum QDF_OPMODE device_mode, uint8_t vdev_id)
+{
+ return QDF_STATUS_E_FAILURE;
+}
+
#endif /* WLAN_FW_OFFLOAD */
#endif /* _WLAN_FWOL_UCFG_API_H_ */
diff --git a/components/fw_offload/dispatcher/src/wlan_fwol_tgt_api.c b/components/fw_offload/dispatcher/src/wlan_fwol_tgt_api.c
index 8778fc6..5170a7c 100644
--- a/components/fw_offload/dispatcher/src/wlan_fwol_tgt_api.c
+++ b/components/fw_offload/dispatcher/src/wlan_fwol_tgt_api.c
@@ -28,6 +28,7 @@
#include "wlan_fwol_ucfg_api.h"
#include "wlan_fwol_tgt_api.h"
#include "wlan_fw_offload_main.h"
+#include "target_if.h"
QDF_STATUS tgt_fwol_register_ev_handler(struct wlan_objmgr_psoc *psoc)
{
@@ -171,3 +172,12 @@
return QDF_STATUS_SUCCESS;
}
+
+QDF_STATUS tgt_fwol_pdev_param_send(struct wlan_objmgr_pdev *pdev,
+ struct pdev_params pdev_param)
+{
+ struct wmi_unified *wmi_handle = get_wmi_unified_hdl_from_pdev(pdev);
+
+ return wmi_unified_pdev_param_send(wmi_handle, &pdev_param,
+ FWOL_WILDCARD_PDEV_ID);
+}
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 8fbd06d..851c78b 100644
--- a/components/fw_offload/dispatcher/src/wlan_fwol_ucfg_api.c
+++ b/components/fw_offload/dispatcher/src/wlan_fwol_ucfg_api.c
@@ -440,6 +440,20 @@
return QDF_STATUS_SUCCESS;
}
+static QDF_STATUS ucfg_fwol_get_hw_assist_config(struct wlan_objmgr_psoc *psoc,
+ bool *disable_hw_assist)
+{
+ 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;
+ }
+ *disable_hw_assist = fwol_obj->cfg.disable_hw_assist;
+ return QDF_STATUS_SUCCESS;
+}
+
QDF_STATUS ucfg_fwol_get_enable_fw_log_level(struct wlan_objmgr_psoc *psoc,
uint16_t *enable_fw_log_level)
{
@@ -906,3 +920,28 @@
return status;
}
#endif /* WLAN_SEND_DSCP_UP_MAP_TO_FW */
+
+QDF_STATUS ucfg_fwol_configure_global_params(struct wlan_objmgr_psoc *psoc,
+ struct wlan_objmgr_pdev *pdev)
+{
+ QDF_STATUS status;
+ bool value;
+
+ /* Configure HW assist feature in FW */
+ status = ucfg_fwol_get_hw_assist_config(psoc, &value);
+ if (QDF_IS_STATUS_ERROR(status))
+ return status;
+ status = fwol_configure_hw_assist(pdev, value);
+ if (QDF_IS_STATUS_ERROR(status))
+ return status;
+
+ return status;
+}
+
+QDF_STATUS ucfg_fwol_configure_vdev_params(struct wlan_objmgr_psoc *psoc,
+ struct wlan_objmgr_pdev *pdev,
+ enum QDF_OPMODE device_mode,
+ uint8_t vdev_id)
+{
+ return QDF_STATUS_SUCCESS;
+}
diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c
index e34c3e3..f1c5c0b 100644
--- a/core/hdd/src/wlan_hdd_main.c
+++ b/core/hdd/src/wlan_hdd_main.c
@@ -5060,6 +5060,10 @@
}
hdd_store_nss_chains_cfg_in_vdev(adapter);
+ /* Configure vdev params */
+ ucfg_fwol_configure_vdev_params(hdd_ctx->psoc, hdd_ctx->pdev,
+ adapter->device_mode, adapter->vdev_id);
+
hdd_nofl_debug("vdev %d created successfully", adapter->vdev_id);
return 0;
@@ -11758,6 +11762,11 @@
if (ret)
goto out;
+ /* Configure global firmware params */
+ ret = ucfg_fwol_configure_global_params(hdd_ctx->psoc, hdd_ctx->pdev);
+ if (ret)
+ goto out;
+
status = hdd_set_sme_chan_list(hdd_ctx);
if (status != QDF_STATUS_SUCCESS) {
hdd_err("Failed to init channel list: %d", status);