Browse Source

qcacld-3.0: Add new INI param for SAP SHO configuration

The SHO feature is used to offload beacon/probe response to HW.
So a new  vdev param is required to enable/disable this feature.

Change-Id: I83d71d63485dee8d3433bf967a7feb56c1039f93
CRs-Fixed: 2815270
Abdul Muqtadeer Ahmed 4 years ago
parent
commit
70ea08a0fe

+ 15 - 0
components/fw_offload/core/inc/wlan_fw_offload_main.h

@@ -215,6 +215,7 @@ struct wlan_fwol_neighbor_report_cfg {
  * @dhcp_max_num_clients: Max number of DHCP client supported
  * @dwelltime_params: adaptive dwell time parameters
  * @enable_ilp: ILP HW block configuration
+ * @sap_sho: SAP SHO HW offload configuration
  */
 struct wlan_fwol_cfg {
 	/* Add CFG and INI items here */
@@ -268,6 +269,7 @@ struct wlan_fwol_cfg {
 #endif
 	struct adaptive_dwelltime_params dwelltime_params;
 	bool enable_ilp;
+	uint32_t sap_sho;
 };
 
 /**
@@ -403,4 +405,17 @@ fwol_set_adaptive_dwelltime_config(
  */
 QDF_STATUS fwol_set_ilp_config(struct wlan_objmgr_pdev *pdev,
 			       bool enable_ilp);
+
+/**
+ * fwol_set_sap_sho() - API to set SAP SHO config
+ * @psoc: pointer to the psoc object
+ * @vdev_id: vdev id
+ * @sap_sho: enable/disable config for SAP SHO
+ * SHO- SoftAP hardware offload – When enabled the beacon/probe resp
+ * will be offloaded to HW.
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS fwol_set_sap_sho(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
+			    uint32_t sap_sho);
 #endif

+ 18 - 0
components/fw_offload/core/src/wlan_fw_offload_main.c

@@ -556,6 +556,7 @@ QDF_STATUS fwol_cfg_on_psoc_enable(struct wlan_objmgr_psoc *psoc)
 	ucfg_fwol_fetch_dhcp_server_settings(psoc, fwol_cfg);
 	fwol_cfg->sap_xlna_bypass = cfg_get(psoc, CFG_SET_SAP_XLNA_BYPASS);
 	fwol_cfg->enable_ilp = cfg_get(psoc, CFG_SET_ENABLE_ILP);
+	fwol_cfg->sap_sho = cfg_get(psoc, CFG_SAP_SHO_CONFIG);
 
 	return status;
 }
@@ -674,3 +675,20 @@ QDF_STATUS fwol_set_ilp_config(struct wlan_objmgr_pdev *pdev, bool enable_ilp)
 
 	return status;
 }
+
+QDF_STATUS fwol_set_sap_sho(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
+			    uint32_t sap_sho)
+{
+	QDF_STATUS status;
+	struct vdev_set_params vdev_param;
+
+	vdev_param.vdev_id = vdev_id;
+	vdev_param.param_id = WMI_VDEV_PARAM_SHO_CONFIG;
+	vdev_param.param_value = sap_sho;
+
+	status = tgt_fwol_vdev_param_send(psoc, vdev_param);
+	if (QDF_IS_STATUS_ERROR(status))
+		fwol_err("WMI_VDEV_PARAM_SHO_CONFIG failed %d", status);
+
+	return status;
+}

+ 32 - 1
components/fw_offload/dispatcher/inc/cfg_fwol_generic.h

@@ -787,6 +787,35 @@
 		1, \
 		"ILP configuration")
 
+/*
+ *
+ * <ini>
+ * sap_sho_config - Bitmap to Enable/Disable SAP HW offload
+ * @Min: 0
+ * @Max: 3
+ * @Default: 0
+ *
+ * This INI is used to configure sap hw offload.
+ *
+ * bit-0: enable/disable SHO
+ * bit-1: enable for Sta connected state as well.
+ * bit-2 to bit-31: Reserved
+ *
+ * Related: None
+ *
+ * Supported Feature: SAP
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_SAP_SHO_CONFIG CFG_INI_UINT(\
+		"sap_sho_config", \
+		0, \
+		3, \
+		1, \
+		CFG_VALUE_OR_DEFAULT, \
+		"enable SHO config")
+
 #define CFG_FWOL_GENERIC_ALL \
 	CFG_FWOL_DHCP \
 	CFG(CFG_ENABLE_ANI) \
@@ -815,5 +844,7 @@
 	CFG(CFG_ENABLE_SECONDARY_RATE) \
 	CFG(CFG_SET_SAP_XLNA_BYPASS) \
 	CFG(CFG_SET_ENABLE_ILP) \
-	CFG(CFG_ENABLE_FW_WOW_MODULE_LOG_LEVEL)
+	CFG(CFG_ENABLE_FW_WOW_MODULE_LOG_LEVEL) \
+	CFG(CFG_SAP_SHO_CONFIG)
+
 #endif

+ 10 - 0
components/fw_offload/dispatcher/inc/wlan_fwol_tgt_api.h

@@ -60,4 +60,14 @@ QDF_STATUS tgt_fwol_register_rx_ops(struct wlan_fwol_rx_ops *rx_ops);
 QDF_STATUS tgt_fwol_pdev_param_send(struct wlan_objmgr_pdev *pdev,
 				    struct pdev_params pdev_param);
 
+/**
+ * tgt_fwol_vdev_param_send() - send vdev params to firmware
+ * @psoc: psoc handle
+ * @vdev_set_params: vdev params
+ *
+ * Return: QDF_STATUS_SUCCESS on success
+ */
+QDF_STATUS tgt_fwol_vdev_param_send(struct wlan_objmgr_psoc *psoc,
+				    struct vdev_set_params vdev_param);
+
 #endif /* _WLAN_FWOL_TGT_API_H */

+ 11 - 0
components/fw_offload/dispatcher/src/wlan_fwol_tgt_api.c

@@ -236,3 +236,14 @@ QDF_STATUS tgt_fwol_pdev_param_send(struct wlan_objmgr_pdev *pdev,
 	return wmi_unified_pdev_param_send(wmi_handle, &pdev_param,
 					   FWOL_WILDCARD_PDEV_ID);
 }
+
+QDF_STATUS tgt_fwol_vdev_param_send(struct wlan_objmgr_psoc *psoc,
+				    struct vdev_set_params vdev_param)
+{
+	wmi_unified_t wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
+
+	if (!wmi_handle)
+		return QDF_STATUS_E_FAILURE;
+
+	return wmi_unified_vdev_set_param_send(wmi_handle, &vdev_param);
+}

+ 29 - 1
components/fw_offload/dispatcher/src/wlan_fwol_ucfg_api.c

@@ -359,6 +359,21 @@ static QDF_STATUS ucfg_fwol_get_ilp_config(struct wlan_objmgr_psoc *psoc,
 	return QDF_STATUS_SUCCESS;
 }
 
+static QDF_STATUS ucfg_fwol_get_sap_sho(struct wlan_objmgr_psoc *psoc,
+					uint32_t *sap_sho)
+{
+	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;
+	}
+
+	*sap_sho = fwol_obj->cfg.sap_sho;
+	return QDF_STATUS_SUCCESS;
+}
+
 QDF_STATUS ucfg_get_enable_rts_sifsbursting(struct wlan_objmgr_psoc *psoc,
 					    bool *enable_rts_sifsbursting)
 {
@@ -1058,5 +1073,18 @@ QDF_STATUS ucfg_fwol_configure_vdev_params(struct wlan_objmgr_psoc *psoc,
 					   enum QDF_OPMODE device_mode,
 					   uint8_t vdev_id)
 {
-	return QDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
+	uint32_t value;
+
+	if (device_mode == QDF_SAP_MODE) {
+		status = ucfg_fwol_get_sap_sho(psoc, &value);
+		if (QDF_IS_STATUS_ERROR(status))
+			return status;
+
+		status = fwol_set_sap_sho(psoc, vdev_id, value);
+		if (QDF_IS_STATUS_ERROR(status))
+			return status;
+	}
+
+	return status;
 }