diff --git a/core/hdd/inc/wlan_hdd_cfr.h b/core/hdd/inc/wlan_hdd_cfr.h index 31279e3931..ad5cfd625d 100644 --- a/core/hdd/inc/wlan_hdd_cfr.h +++ b/core/hdd/inc/wlan_hdd_cfr.h @@ -49,6 +49,25 @@ wlan_hdd_cfg80211_peer_cfr_capture_cfg(struct wiphy *wiphy, const void *data, int data_len); +#ifdef WLAN_ENH_CFR_ENABLE +/** + * hdd_cfr_disconnect() - Handle disconnection event in CFR + * @vdev: Pointer to vdev object + * + * Handle disconnection event in CFR. Stop CFR if it started and get + * disconnection event. + * + * Return: QDF status + */ +QDF_STATUS hdd_cfr_disconnect(struct wlan_objmgr_vdev *vdev); +#else +static inline QDF_STATUS +hdd_cfr_disconnect(struct wlan_objmgr_vdev *vdev) +{ + return QDF_STATUS_SUCCESS; +} +#endif + extern const struct nla_policy cfr_config_policy[ QCA_WLAN_VENDOR_ATTR_PEER_CFR_MAX + 1]; @@ -64,6 +83,11 @@ extern const struct nla_policy cfr_config_policy[ }, #else #define FEATURE_CFR_VENDOR_COMMANDS +static inline QDF_STATUS +hdd_cfr_disconnect(struct wlan_objmgr_vdev *vdev) +{ + return QDF_STATUS_SUCCESS; +} #endif /* WLAN_CFR_ENABLE */ #endif /* _WLAN_HDD_CFR_H */ diff --git a/core/hdd/src/wlan_hdd_cfr.c b/core/hdd/src/wlan_hdd_cfr.c index aaaea3cbdd..e071e2e1a1 100644 --- a/core/hdd/src/wlan_hdd_cfr.c +++ b/core/hdd/src/wlan_hdd_cfr.c @@ -349,6 +349,30 @@ wlan_cfg80211_cfr_set_config(struct wlan_objmgr_vdev *vdev, return 0; } +static QDF_STATUS hdd_stop_enh_cfr(struct wlan_objmgr_vdev *vdev) +{ + if (!ucfg_cfr_get_rcc_enabled(vdev)) + return QDF_STATUS_SUCCESS; + + hdd_debug("cleanup rcc mode"); + wlan_objmgr_vdev_try_get_ref(vdev, WLAN_CFR_ID); + ucfg_cfr_set_rcc_mode(vdev, RCC_DIS_ALL_MODE, 0); + ucfg_cfr_subscribe_ppdu_desc(wlan_vdev_get_pdev(vdev), + false); + ucfg_cfr_committed_rcc_config(vdev); + ucfg_cfr_stop_indication(vdev); + ucfg_cfr_suspend(wlan_vdev_get_pdev(vdev)); + hdd_debug("stop indication done"); + wlan_objmgr_vdev_release_ref(vdev, WLAN_CFR_ID); + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS hdd_cfr_disconnect(struct wlan_objmgr_vdev *vdev) +{ + return hdd_stop_enh_cfr(vdev); +} + static int wlan_cfg80211_peer_enh_cfr_capture(struct hdd_adapter *adapter, struct nlattr **tb) @@ -385,23 +409,13 @@ wlan_cfg80211_peer_enh_cfr_capture(struct hdd_adapter *adapter, QCA_WLAN_VENDOR_ATTR_PEER_CFR_ENABLE_GROUP_BITMAP]); hdd_debug("params.en_cfg %d", params.en_cfg); ucfg_cfr_set_en_bitmap(vdev, ¶ms); - } else { - hdd_debug("cleanup rcc mode"); - ucfg_cfr_set_rcc_mode(vdev, RCC_DIS_ALL_MODE, 0); - } - - if (is_start_capture) ucfg_cfr_resume(wlan_vdev_get_pdev(vdev)); - - ucfg_cfr_subscribe_ppdu_desc(wlan_vdev_get_pdev(vdev), - is_start_capture); - ucfg_cfr_committed_rcc_config(vdev); - if (!is_start_capture) { - ucfg_cfr_stop_indication(vdev); - ucfg_cfr_suspend(wlan_vdev_get_pdev(vdev)); - hdd_debug("stop indication done"); + ucfg_cfr_subscribe_ppdu_desc(wlan_vdev_get_pdev(vdev), + true); + ucfg_cfr_committed_rcc_config(vdev); + } else { + hdd_stop_enh_cfr(vdev); } - out: hdd_objmgr_put_vdev_by_user(vdev, WLAN_CFR_ID); return ret; diff --git a/core/hdd/src/wlan_hdd_cm_disconnect.c b/core/hdd/src/wlan_hdd_cm_disconnect.c index a19f97ff5f..df04c09725 100644 --- a/core/hdd/src/wlan_hdd_cm_disconnect.c +++ b/core/hdd/src/wlan_hdd_cm_disconnect.c @@ -45,6 +45,7 @@ #include "hif.h" #include "wlan_hdd_power.h" #include "wlan_hdd_napi.h" +#include "wlan_hdd_cfr.h" #include "wlan_roam_debug.h" #include "wma_api.h" @@ -155,6 +156,7 @@ void __hdd_cm_disconnect_handler_post_user_update(struct hdd_adapter *adapter, /* update P2P connection status */ ucfg_p2p_status_disconnect(vdev); + hdd_cfr_disconnect(adapter->vdev); hdd_wmm_adapter_clear(adapter); ucfg_cm_ft_reset(vdev);