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
This commit is contained in:
Padma Raghunathan 2020-04-24 12:13:07 +05:30 • committed by nshrivas
commit 79f10bc2d2
4 changed files with 124 additions and 0 deletions

View file

@ -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) {

View file

@ -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

View file

@ -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!");

View file

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