ソースを参照

qcacmn: Add DFS APIs to reset ADFS and reinitialize DFS Timers

Add DFS APIs to
1. reset Agile DFS config
2. reinitialize DFS Timers

Change-Id: I7ede1b961f899f2e713b9be56aa8f5fe29360d66
CRs-Fixed: 2481535
Priyadarshnee S 5 年 前
コミット
4ae200caad

+ 14 - 0
umac/dfs/core/src/dfs.h

@@ -2655,4 +2655,18 @@ static inline int dfs_is_disable_radar_marking_set(struct wlan_dfs *dfs,
 #if defined(WLAN_DFS_FULL_OFFLOAD) && defined(QCA_DFS_NOL_OFFLOAD)
 bool dfs_get_disable_radar_marking(struct wlan_dfs *dfs);
 #endif
+
+/**
+ * dfs_reset_agile_config() - Reset the ADFS config variables.
+ * @dfs: Pointer to dfs_soc_priv_obj.
+ */
+#ifdef QCA_SUPPORT_AGILE_DFS
+void dfs_reset_agile_config(struct dfs_soc_priv_obj *dfs_soc);
+#endif
+
+/**
+ * dfs_reinit_timers() - Reinit timers in DFS.
+ * @dfs: Pointer to wlan_dfs.
+ */
+int dfs_reinit_timers(struct wlan_dfs *dfs);
 #endif  /* _DFS_H_ */

+ 4 - 0
umac/dfs/core/src/dfs_zero_cac.h

@@ -63,6 +63,10 @@
 #define MIN_WEATHER_PRECAC_DURATION          (60 * 60 * 1000) /* 1 hour */
 #define MAX_PRECAC_DURATION              (4 * 60 * 60 * 1000) /* 4 hours */
 #define MAX_WEATHER_PRECAC_DURATION     (24 * 60 * 60 * 1000) /* 24 hours */
+
+#define PCAC_DFS_INDEX_ZERO               0
+#define PCAC_TIMER_NOT_RUNNING            0
+#define PRECAC_NOT_STARTED                0
 /**
  * struct precac_tree_node - Individual tree node structure for every node in
  *                           the precac forest maintained.

+ 9 - 0
umac/dfs/core/src/misc/dfs.c

@@ -755,3 +755,12 @@ void dfs_update_cur_chan_flags(struct wlan_dfs *dfs,
 	dfs->dfs_curchan->dfs_ch_flags = flags;
 	dfs->dfs_curchan->dfs_ch_flagext = flagext;
 }
+
+int dfs_reinit_timers(struct wlan_dfs *dfs)
+{
+	dfs_cac_attach(dfs);
+	dfs_zero_cac_timer_init(dfs->dfs_soc_obj);
+	dfs_nol_timer_init(dfs);
+	dfs_main_task_testtimer_init(dfs);
+	return 0;
+}

+ 28 - 0
umac/dfs/dispatcher/inc/wlan_dfs_ucfg_api.h

@@ -434,4 +434,32 @@ QDF_STATUS ucfg_dfs_set_nol_subchannel_marking(struct wlan_objmgr_pdev *pdev,
  */
 QDF_STATUS ucfg_dfs_get_nol_subchannel_marking(struct wlan_objmgr_pdev *pdev,
 					       bool *nol_subchannel_marking);
+/**
+ * ucfg_dfs_reinit_timers() - Init DFS timers.
+ * @pdev: Pointer to wlan_objmgr_pdev structure.
+ *
+ * Wrapper function to reset CAC, NOL, DFS Test Timer and ZeroCAC Timer.
+ * This is invoked per pdev to reinitialize timers after HW Mode Switch is
+ * triggered.
+ */
+QDF_STATUS ucfg_dfs_reinit_timers(struct wlan_objmgr_pdev *pdev);
+
+/**
+ * ucfg_dfs_reset_agile_config() - Reset ADFS config.
+ * @pdev: Pointer to wlan_objmgr_pdev structure.
+ *
+ * Wrapper function to reset Agile DFS config such as the variables which hold
+ * information about the state of the preCAC timer, active precac
+ * dfs index and OCAC status. It is invoked before HW Mode switch is triggered
+ * to ensure ADFS config is in a well known consistent state.
+ */
+#ifdef QCA_SUPPORT_AGILE_DFS
+QDF_STATUS ucfg_dfs_reset_agile_config(struct wlan_objmgr_psoc *psoc);
+#else
+static inline QDF_STATUS ucfg_dfs_reset_agile_config(struct wlan_objmgr_psoc
+						    *psoc)
+{
+	return QDF_STATUS_SUCCESS;
+}
+#endif
 #endif /* _WLAN_DFS_UCFG_API_H_ */

+ 47 - 1
umac/dfs/dispatcher/src/wlan_dfs_ucfg_api.c

@@ -341,7 +341,7 @@ bool ucfg_dfs_is_hw_pulses_allowed(struct wlan_objmgr_pdev *pdev)
 	dfs = wlan_pdev_get_dfs_obj(pdev);
 	if (!dfs) {
 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
-		return  false;
+		return;
 	}
 
 	return dfs_is_hw_pulses_allowed(dfs);
@@ -349,3 +349,49 @@ bool ucfg_dfs_is_hw_pulses_allowed(struct wlan_objmgr_pdev *pdev)
 
 qdf_export_symbol(ucfg_dfs_is_hw_pulses_allowed);
 #endif
+
+#ifdef QCA_SUPPORT_AGILE_DFS
+QDF_STATUS ucfg_dfs_reset_agile_config(struct wlan_objmgr_psoc *psoc)
+{
+	struct dfs_soc_priv_obj *soc_obj;
+
+	if (!psoc) {
+		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,  "psoc is null");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
+							WLAN_UMAC_COMP_DFS);
+	if (!soc_obj) {
+		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,
+			"Failed to get dfs psoc component");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	dfs_reset_agile_config(soc_obj);
+
+	return QDF_STATUS_SUCCESS;
+}
+
+qdf_export_symbol(ucfg_dfs_reset_agile_config);
+#endif
+
+QDF_STATUS ucfg_dfs_reinit_timers(struct wlan_objmgr_pdev *pdev)
+{
+	struct wlan_dfs *dfs;
+
+	if (!tgt_dfs_is_pdev_5ghz(pdev))
+		return QDF_STATUS_SUCCESS;
+
+	dfs = wlan_pdev_get_dfs_obj(pdev);
+	if (!dfs) {
+		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	dfs_reinit_timers(dfs);
+
+	return QDF_STATUS_SUCCESS;
+}
+
+qdf_export_symbol(ucfg_dfs_reinit_timers);