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);