diff --git a/core/hdd/inc/wlan_hdd_cfr.h b/core/hdd/inc/wlan_hdd_cfr.h index 31279e39312d..947eb1d0745b 100644 --- a/core/hdd/inc/wlan_hdd_cfr.h +++ b/core/hdd/inc/wlan_hdd_cfr.h @@ -49,6 +49,24 @@ 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 +82,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_assoc.c b/core/hdd/src/wlan_hdd_assoc.c index f9bb1f539c33..e410040400d9 100644 --- a/core/hdd/src/wlan_hdd_assoc.c +++ b/core/hdd/src/wlan_hdd_assoc.c @@ -84,6 +84,7 @@ #include "wlan_hdd_twt.h" #include "wma_api.h" +#include "wlan_hdd_cfr.h" /* These are needed to recognize WPA and RSN suite types */ #define HDD_WPA_OUI_SIZE 4 @@ -2059,7 +2060,7 @@ static QDF_STATUS hdd_dis_connect_handler(struct hdd_adapter *adapter, /* update P2P connection status */ ucfg_p2p_status_disconnect(adapter->vdev); - + hdd_cfr_disconnect(adapter->vdev); if (adapter->device_mode == QDF_STA_MODE) { /* Inform BLM about the disconnection with the AP */ ucfg_blm_update_bssid_connect_params(hdd_ctx->pdev, diff --git a/core/hdd/src/wlan_hdd_cfr.c b/core/hdd/src/wlan_hdd_cfr.c index 7d9ac2d2b981..48961eb7ac76 100644 --- a/core/hdd/src/wlan_hdd_cfr.c +++ b/core/hdd/src/wlan_hdd_cfr.c @@ -461,6 +461,30 @@ wlan_cfg80211_peer_cfr_capture_cfg_adrastea(struct hdd_adapter *adapter, } #endif +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) @@ -497,21 +521,12 @@ 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: