From 79f10bc2d2446e35f7b260f3a7f3098a4e45460b Mon Sep 17 00:00:00 2001 From: Padma Raghunathan Date: Fri, 24 Apr 2020 12:13:07 +0530 Subject: [PATCH] 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 --- umac/cfr/core/src/cfr_common.c | 74 ++++++++++++++++++++ umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h | 8 +++ umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c | 10 +++ umac/cfr/dispatcher/src/wlan_cfr_utils_api.c | 32 +++++++++ 4 files changed, 124 insertions(+) diff --git a/umac/cfr/core/src/cfr_common.c b/umac/cfr/core/src/cfr_common.c index 10b81df248c9..ec8d00d3fbc6 100644 --- a/umac/cfr/core/src/cfr_common.c +++ b/umac/cfr/core/src/cfr_common.c @@ -25,6 +25,37 @@ #include #include #include +#include +#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) { diff --git a/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h b/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h index 36d1f8261174..8ba2dbcd46e8 100644 --- a/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h +++ b/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 diff --git a/umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c b/umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c index be4c0e1c1b8b..0db73d4735b0 100644 --- a/umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c +++ b/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!"); diff --git a/umac/cfr/dispatcher/src/wlan_cfr_utils_api.c b/umac/cfr/dispatcher/src/wlan_cfr_utils_api.c index 42fac87a8fcf..ba31addabc41 100644 --- a/umac/cfr/dispatcher/src/wlan_cfr_utils_api.c +++ b/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);