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

qcacld-3.0: Stop CFR once get disconnection event

CFR only works when DUT as STA and connected to AP. But, host doesn't
stop CFR if CFR started and disconnect to AP. So add this change to
stop CFR once get disconnection event.

Change-Id: I5a616dbe4c35311fb260514a8d33ed9a1361c514
CRs-Fixed: 3026715
Wu Gao 3 жил өмнө
parent
commit
36d764e1af

+ 24 - 0
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 */
 

+ 29 - 15
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, &params);
-	} 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;

+ 2 - 0
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);