Эх сурвалжийг харах

qcacmn: Skip CFR umac handling when feature is disabled

Retrieve the INI option to disable CFR and store the
same in pdev feature ext caps.

When CFR feature is disabled -
1. Skip pdev/peer cfr object allocations
2. Skip CFR SRNG allocations
3. Skip WMI registration for DBR and TX completion events

Change-Id: I5a7a6ae67d2c3a863b952e00e317c44a71e9fbc1
CRs-Fixed: 2671620
Padma Raghunathan 5 жил өмнө
parent
commit
79f10bc2d2

+ 74 - 0
umac/cfr/core/src/cfr_common.c

@@ -25,6 +25,37 @@
 #include <qdf_streamfs.h>
 #include <target_if.h>
 #include <wlan_osif_priv.h>
+#include <cfg_ucfg_api.h>
+#include "cfr_cfg.h"
+
+/**
+ * wlan_cfr_is_ini_disabled() - Check if cfr feature is disabled
+ * @pdev - the physical device object.
+ *
+ * Return : true if cfr is disabled, else false.
+ */
+static bool
+wlan_cfr_is_ini_disabled(struct wlan_objmgr_pdev *pdev)
+{
+	struct wlan_objmgr_psoc *psoc;
+	uint8_t cfr_disable_bitmap;
+
+	psoc = wlan_pdev_get_psoc(pdev);
+	if (!psoc) {
+		cfr_err("psoc is null");
+		return true;
+	}
+
+	cfr_disable_bitmap = cfg_get(psoc, CFG_CFR_DISABLE);
+
+	if (cfr_disable_bitmap & (1 << wlan_objmgr_pdev_get_pdev_id(pdev))) {
+		cfr_info("cfr is disabled for pdev[%d]",
+			 wlan_objmgr_pdev_get_pdev_id(pdev));
+		return true;
+	}
+
+	return false;
+}
 
 QDF_STATUS
 wlan_cfr_psoc_obj_create_handler(struct wlan_objmgr_psoc *psoc, void *arg)
@@ -73,6 +104,13 @@ wlan_cfr_pdev_obj_create_handler(struct wlan_objmgr_pdev *pdev, void *arg)
 		return QDF_STATUS_E_FAILURE;
 	}
 
+	if (wlan_cfr_is_ini_disabled(pdev)) {
+		wlan_pdev_nif_feat_ext_cap_clear(pdev, WLAN_PDEV_FEXT_CFR_EN);
+		return QDF_STATUS_E_NOSUPPORT;
+	}
+
+	wlan_pdev_nif_feat_ext_cap_set(pdev, WLAN_PDEV_FEXT_CFR_EN);
+
 	pa = (struct pdev_cfr *)qdf_mem_malloc(sizeof(struct pdev_cfr));
 	if (NULL == pa) {
 		cfr_err("Failed to allocate pdev_cfr object\n");
@@ -97,6 +135,11 @@ wlan_cfr_pdev_obj_destroy_handler(struct wlan_objmgr_pdev *pdev, void *arg)
 		return QDF_STATUS_E_FAILURE;
 	}
 
+	if (wlan_cfr_is_feature_disabled(pdev)) {
+		cfr_info("cfr is disabled");
+		return QDF_STATUS_E_NOSUPPORT;
+	}
+
 	pa = wlan_objmgr_pdev_get_comp_private_obj(pdev, WLAN_UMAC_COMP_CFR);
 	if (NULL != pa) {
 		wlan_objmgr_pdev_component_obj_detach(pdev, WLAN_UMAC_COMP_CFR,
@@ -111,12 +154,28 @@ QDF_STATUS
 wlan_cfr_peer_obj_create_handler(struct wlan_objmgr_peer *peer, void *arg)
 {
 	struct peer_cfr *pe = NULL;
+	struct wlan_objmgr_vdev *vdev;
+	struct wlan_objmgr_pdev *pdev = NULL;
 
 	if (NULL == peer) {
 		cfr_err("PEER is NULL\n");
 		return QDF_STATUS_E_FAILURE;
 	}
 
+	vdev = wlan_peer_get_vdev(peer);
+	if (vdev)
+		pdev = wlan_vdev_get_pdev(vdev);
+
+	if (!pdev) {
+		cfr_err("PDEV is NULL\n");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	if (wlan_cfr_is_feature_disabled(pdev)) {
+		cfr_info("cfr is disabled");
+		return QDF_STATUS_E_NOSUPPORT;
+	}
+
 	pe = (struct peer_cfr *)qdf_mem_malloc(sizeof(struct peer_cfr));
 	if (NULL == pe) {
 		cfr_err("Failed to allocate peer_cfr object\n");
@@ -148,6 +207,11 @@ wlan_cfr_peer_obj_destroy_handler(struct wlan_objmgr_peer *peer, void *arg)
 	if (vdev)
 		pdev = wlan_vdev_get_pdev(vdev);
 
+	if (wlan_cfr_is_feature_disabled(pdev)) {
+		cfr_info("cfr is disabled");
+		return QDF_STATUS_E_NOSUPPORT;
+	}
+
 	if (pdev)
 		pa = wlan_objmgr_pdev_get_comp_private_obj(pdev,
 							   WLAN_UMAC_COMP_CFR);
@@ -214,6 +278,11 @@ QDF_STATUS cfr_streamfs_init(struct wlan_objmgr_pdev *pdev)
 		return QDF_STATUS_E_FAILURE;
 	}
 
+	if (wlan_cfr_is_feature_disabled(pdev)) {
+		cfr_info("cfr is disabled");
+		return QDF_STATUS_COMP_DISABLED;
+	}
+
 	pa = wlan_objmgr_pdev_get_comp_private_obj(pdev, WLAN_UMAC_COMP_CFR);
 
 	if (pa == NULL) {
@@ -259,6 +328,11 @@ QDF_STATUS cfr_streamfs_remove(struct wlan_objmgr_pdev *pdev)
 {
 	struct pdev_cfr *pa = NULL;
 
+	if (wlan_cfr_is_feature_disabled(pdev)) {
+		cfr_info("cfr is disabled");
+		return QDF_STATUS_COMP_DISABLED;
+	}
+
 	pa = wlan_objmgr_pdev_get_comp_private_obj(pdev, WLAN_UMAC_COMP_CFR);
 	if (pa) {
 		if (pa->chan_ptr) {

+ 8 - 0
umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h

@@ -588,6 +588,14 @@ QDF_STATUS wlan_cfr_pdev_close(struct wlan_objmgr_pdev *pdev);
  */
 uint8_t count_set_bits(uint32_t value);
 
+/**
+ * wlan_cfr_is_feature_disabled() - Check if cfr feature is disabled
+ * @pdev - the physical device object.
+ *
+ * Return : true if cfr is disabled, else false.
+ */
+bool wlan_cfr_is_feature_disabled(struct wlan_objmgr_pdev *pdev);
+
 #ifdef WLAN_ENH_CFR_ENABLE
 /**
  * wlan_cfr_rx_tlv_process() - Process PPDU status TLVs and store info in

+ 10 - 0
umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c

@@ -233,6 +233,11 @@ int ucfg_cfr_set_timer(struct wlan_objmgr_pdev *pdev, uint32_t value)
 {
 	struct pdev_cfr *pa;
 
+	if (wlan_cfr_is_feature_disabled(pdev)) {
+		cfr_err("cfr is disabled");
+		return QDF_STATUS_E_NOSUPPORT;
+	}
+
 	pa = wlan_objmgr_pdev_get_comp_private_obj(pdev, WLAN_UMAC_COMP_CFR);
 	if (pa == NULL) {
 		cfr_err("PDEV cfr object is NULL!");
@@ -252,6 +257,11 @@ int ucfg_cfr_get_timer(struct wlan_objmgr_pdev *pdev)
 {
 	struct pdev_cfr *pa;
 
+	if (wlan_cfr_is_feature_disabled(pdev)) {
+		cfr_err("cfr is disabled");
+		return QDF_STATUS_E_NOSUPPORT;
+	}
+
 	pa = wlan_objmgr_pdev_get_comp_private_obj(pdev, WLAN_UMAC_COMP_CFR);
 	if (pa == NULL) {
 		cfr_err("PDEV cfr object is NULL!");

+ 32 - 0
umac/cfr/dispatcher/src/wlan_cfr_utils_api.c

@@ -98,6 +98,10 @@ QDF_STATUS wlan_cfr_pdev_open(struct wlan_objmgr_pdev *pdev)
 {
 	int status;
 
+	if (wlan_cfr_is_feature_disabled(pdev)) {
+		cfr_err("cfr is disabled");
+		return QDF_STATUS_COMP_DISABLED;
+	}
 	/* chip specific init */
 	status = tgt_cfr_init_pdev(pdev);
 
@@ -120,6 +124,11 @@ QDF_STATUS wlan_cfr_pdev_open(struct wlan_objmgr_pdev *pdev)
 QDF_STATUS wlan_cfr_pdev_close(struct wlan_objmgr_pdev *pdev)
 {
 	int status = QDF_STATUS_SUCCESS;
+
+	if (wlan_cfr_is_feature_disabled(pdev)) {
+		cfr_err("cfr is disabled");
+		return QDF_STATUS_COMP_DISABLED;
+	}
 	/*
 	 * DBR does not have close as of now;
 	 * but this is getting added as part for new gerrit
@@ -134,6 +143,11 @@ QDF_STATUS cfr_initialize_pdev(struct wlan_objmgr_pdev *pdev)
 {
 	int status = QDF_STATUS_SUCCESS;
 
+	if (wlan_cfr_is_feature_disabled(pdev)) {
+		cfr_err("cfr is disabled");
+		return QDF_STATUS_COMP_DISABLED;
+	}
+
 	/* chip specific init */
 
 	status = tgt_cfr_init_pdev(pdev);
@@ -149,6 +163,11 @@ QDF_STATUS cfr_deinitialize_pdev(struct wlan_objmgr_pdev *pdev)
 {
 	int status = QDF_STATUS_SUCCESS;
 
+	if (wlan_cfr_is_feature_disabled(pdev)) {
+		cfr_err("cfr is disabled");
+		return QDF_STATUS_COMP_DISABLED;
+	}
+
 	/* chip specific deinit */
 
 	status = tgt_cfr_deinit_pdev(pdev);
@@ -182,3 +201,16 @@ void wlan_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf)
 
 qdf_export_symbol(wlan_cfr_rx_tlv_process);
 #endif
+
+bool wlan_cfr_is_feature_disabled(struct wlan_objmgr_pdev *pdev)
+{
+	if (!pdev) {
+		cfr_err("PDEV is NULL!");
+		return true;
+	}
+
+	return (wlan_pdev_nif_feat_ext_cap_get(pdev, WLAN_PDEV_FEXT_CFR_EN) ?
+		false : true);
+}
+
+qdf_export_symbol(wlan_cfr_is_feature_disabled);