Browse Source

qcacmn: Iterate through all vdevs and check if CAC is in progress

Add an API to iterate through all vdevs and check if any vdev is
in CAC in-progress state.

When DFS CAC is going on for SAP, if 5 GHz mac is occupied by the
SAP and it's not available for 5 GHz NAN discovery. Enabling NAN
on 5 GHz in such cases cause inconsistency in firmware state machine
and firmware may assert as DFS MAC is not supposed to be disturbed
while CAC is going on.

So, check if NAN enable request has 5 GHz NAN channel also and reject
the request. Allow NAN enable command if it's 2 GHz only NAN enable
request, while CAC is going on.

Change-Id: Idcd92e29d4b6078332d439efb75eba6800e986bb
CRs-Fixed: 3492054
Vijay Patil 2 years ago
parent
commit
c3a34a4987

+ 11 - 0
umac/cmn_services/utils/inc/wlan_utility.h

@@ -1044,4 +1044,15 @@ void wlan_minidump_remove(void *start_addr, const size_t size,
 			  enum wlan_minidump_host_data type,
 			  const char *name);
 
+/**
+ * wlan_util_is_vdev_in_cac_wait() - Check if dfs sap vdev is in cac wait
+ * @pdev: pdev object
+ * @dbg_id: object manager ref id
+ *
+ * This function checks if dfs sap vdev is in cac wait state
+ *
+ * Return: true, if cac is in progress, otherwise false
+ */
+bool wlan_util_is_vdev_in_cac_wait(struct wlan_objmgr_pdev *pdev,
+				   wlan_objmgr_ref_dbgid dbg_id);
 #endif /* _WLAN_UTILITY_H_ */

+ 28 - 0
umac/cmn_services/utils/src/wlan_utility.c

@@ -2323,3 +2323,31 @@ void wlan_minidump_remove(void *start_addr, const size_t size,
 		qdf_minidump_remove(start_addr, size, name);
 }
 qdf_export_symbol(wlan_minidump_remove);
+
+static void vdev_cac_in_progress(struct wlan_objmgr_pdev *pdev,
+				 void *object, void *arg)
+{
+	struct wlan_objmgr_vdev *vdev = (struct wlan_objmgr_vdev *)object;
+	bool *cac_is_in_progress = (bool *)arg;
+
+	if (*cac_is_in_progress)
+		return;
+
+	if (wlan_vdev_is_dfs_cac_wait(vdev) == QDF_STATUS_SUCCESS)
+		*cac_is_in_progress = true;
+}
+
+bool wlan_util_is_vdev_in_cac_wait(struct wlan_objmgr_pdev *pdev,
+				   wlan_objmgr_ref_dbgid dbg_id)
+{
+	bool cac_is_in_progress = false;
+
+	wlan_objmgr_pdev_iterate_obj_list(pdev, WLAN_VDEV_OP,
+					  vdev_cac_in_progress,
+					  &cac_is_in_progress, 0,
+					  dbg_id);
+
+	return cac_is_in_progress;
+}
+
+qdf_export_symbol(wlan_util_is_vdev_in_cac_wait);