Explorar el Código

qcacmn: Add function to get CFR capture status

This function is used to disallow HW mode change if
CFR capture is in progress.

CRs-fixed:2663183

Change-Id: Ib5939c1f5743a1aa3cf7594c98fe4bbcc6ced49f
Manoj Ekbote hace 5 años
padre
commit
f87f43f8b2

+ 10 - 0
umac/cfr/dispatcher/inc/wlan_cfr_ucfg_api.h

@@ -37,6 +37,16 @@ int ucfg_cfr_start_capture(struct wlan_objmgr_pdev *pdev,
 			   struct wlan_objmgr_peer *peer,
 			   struct cfr_capture_params *cfr_params);
 
+/**
+ * ucfg_cfr_get_capture_status() - function to populate capture status
+ * @pdev: pointer to pdev object
+ * @status: capture status
+ *
+ * Return: none
+ */
+void ucfg_cfr_get_capture_status(struct wlan_objmgr_pdev *pdev,
+				 enum cfr_capt_status *status);
+
 /**
  * ucfg_cfr_stop_capture() - function to stop cfr capture for connected client
  * @pdev: pointer to pdev object

+ 11 - 2
umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h

@@ -1,3 +1,4 @@
+
 /*
  * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved.
  *
@@ -507,8 +508,16 @@ struct pdev_cfr {
 	qdf_spinlock_t lut_lock;
 };
 
-#define PEER_CFR_CAPTURE_ENABLE   1
-#define PEER_CFR_CAPTURE_DISABLE  0
+/**
+ * enum cfr_capt_status - CFR capture status
+ */
+enum cfr_capt_status {
+	/* Capture not in progress */
+	PEER_CFR_CAPTURE_DISABLE,
+	/* Capture in progress */
+	PEER_CFR_CAPTURE_ENABLE,
+};
+
 /**
  * struct peer_cfr - private peer object for cfr
  * peer_obj: pointer to peer_obj

+ 43 - 0
umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c

@@ -267,6 +267,49 @@ int ucfg_cfr_get_timer(struct wlan_objmgr_pdev *pdev)
 }
 qdf_export_symbol(ucfg_cfr_get_timer);
 
+static void cfr_iter_peer_handler(struct wlan_objmgr_pdev *pdev,
+				  void *object, void *arg)
+{
+	struct wlan_objmgr_peer *peer = (struct wlan_objmgr_peer *)object;
+	struct peer_cfr *pe;
+	int *cfr_capt_status = (int *)arg;
+
+	if (*cfr_capt_status == PEER_CFR_CAPTURE_ENABLE)
+		return;
+
+	if (!peer || !pdev) {
+		cfr_err("peer or pdev object is NULL");
+		return;
+	}
+
+	if (wlan_vdev_get_selfpeer(peer->peer_objmgr.vdev) == peer)
+		return;
+
+	pe = wlan_objmgr_peer_get_comp_private_obj(peer, WLAN_UMAC_COMP_CFR);
+	if (!pe) {
+		cfr_err("PEER cfr object is NULL!");
+		return;
+	}
+
+	if (pe->request == PEER_CFR_CAPTURE_ENABLE) {
+		*cfr_capt_status = pe->request;
+		cfr_debug("CFR capture running for peer "
+			  QDF_MAC_ADDR_STR,
+			  QDF_MAC_ADDR_ARRAY(peer->macaddr));
+	}
+}
+
+void ucfg_cfr_get_capture_status(struct wlan_objmgr_pdev *pdev,
+				 enum cfr_capt_status *status)
+{
+	*status = PEER_CFR_CAPTURE_DISABLE;
+
+	wlan_objmgr_pdev_iterate_obj_list(pdev, WLAN_PEER_OP,
+					  cfr_iter_peer_handler,
+					  status, 1, WLAN_CFR_ID);
+}
+qdf_export_symbol(ucfg_cfr_get_capture_status);
+
 int ucfg_cfr_stop_capture(struct wlan_objmgr_pdev *pdev,
 			  struct wlan_objmgr_peer *peer)
 {