Browse Source

qcacmn: Handle Agile PreCAC in the same SM as RCAC

Following are a part of this change:-

1. Add an API to check if PreCAC/RCAC is enabled. This API is used before
   delivering an external event to Agile SM.
2. Post an event to the Agile PreCAC SM if Radar is found on
   agile channel. Radar on primary channel is taken care of by the
   ensuing channel change.
3. Move all Agile PreCAC changes under macro QCA_SUPPORT_AGILE_DFS,
   only RCAC specific changes remain under QCA_SUPPORT_ADFS_RCAC.

Change-Id: I45d4b9f826d36e9e4093879b394165a15a52f324
Ananya Barat 5 years ago
parent
commit
b63669d9e2

+ 5 - 3
umac/dfs/core/src/dfs.h

@@ -42,7 +42,7 @@
 #include <osdep.h>
 #include <wlan_cmn.h>
 #include "target_type.h"
-#ifdef QCA_SUPPORT_ADFS_RCAC
+#ifdef QCA_SUPPORT_AGILE_DFS
 #include <wlan_sm_engine.h> /* for struct wlan_sm */
 #endif
 #include <wlan_dfs_public_struct.h>
@@ -938,7 +938,7 @@ struct dfs_mode_switch_defer_params {
 	bool is_radar_detected;
 };
 
-#ifdef QCA_SUPPORT_ADFS_RCAC
+#ifdef QCA_SUPPORT_AGILE_DFS
 #define DFS_PSOC_NO_IDX 0xFF
 /**
  * enum dfs_agile_sm_state - DFS AGILE SM states.
@@ -1363,8 +1363,10 @@ struct dfs_soc_priv_obj {
 	bool ocac_status;
 #endif
 	struct dfsreq_nolinfo *dfs_psoc_nolinfo;
-#if defined(QCA_SUPPORT_ADFS_RCAC)
+#ifdef QCA_SUPPORT_ADFS_RCAC
 	qdf_timer_t dfs_rcac_timer;
+#endif
+#ifdef QCA_SUPPORT_AGILE_DFS
 	struct wlan_sm *dfs_agile_sm_hdl;
 	enum dfs_agile_sm_state dfs_agile_sm_cur_state;
 	qdf_spinlock_t dfs_agile_sm_lock;

+ 63 - 23
umac/dfs/core/src/dfs_zero_cac.h

@@ -565,8 +565,9 @@ void dfs_find_pdev_for_agile_precac(struct wlan_objmgr_pdev *pdev,
 /**
  * dfs_prepare_agile_precac_chan() - Send Agile set request for given pdev.
  * @dfs: Pointer to wlan_dfs structure.
+ * @is_chan_found: True if a channel is available for PreCAC, false otherwise.
  */
-void dfs_prepare_agile_precac_chan(struct wlan_dfs *dfs);
+void dfs_prepare_agile_precac_chan(struct wlan_dfs *dfs, bool *is_chan_found);
 
 /**
  * dfs_process_ocac_complete() - Process Off-Channel CAC complete indication.
@@ -656,7 +657,8 @@ static inline void dfs_find_pdev_for_agile_precac(struct wlan_objmgr_pdev *pdev,
 {
 }
 
-static inline void dfs_prepare_agile_precac_chan(struct wlan_dfs *dfs)
+static inline void dfs_prepare_agile_precac_chan(struct wlan_dfs *dfs,
+						 bool *is_chan_found)
 {
 }
 
@@ -1249,7 +1251,7 @@ dfs_rcac_timer_deinit(struct dfs_soc_priv_obj *dfs_soc_obj)
 }
 #endif
 
-#ifdef QCA_SUPPORT_ADFS_RCAC
+#ifdef QCA_SUPPORT_AGILE_DFS
 #define DFS_AGILE_SM_SPIN_LOCK(_soc_obj) \
 	qdf_spin_lock_bh(&((_soc_obj)->dfs_agile_sm_lock))
 #define DFS_AGILE_SM_SPIN_UNLOCK(_soc_obj) \
@@ -1286,31 +1288,15 @@ QDF_STATUS dfs_agile_sm_create(struct dfs_soc_priv_obj *dfs_soc_obj);
 QDF_STATUS dfs_agile_sm_destroy(struct dfs_soc_priv_obj *dfs_soc_obj);
 
 /**
- * dfs_is_agile_rcac_enabled() - Determine if Rolling CAC is enabled or not.
+ * dfs_is_agile_cac_enabled() - Determine if Agile PreCAC/RCAC is enabled.
  * @dfs: Pointer to struct wlan_dfs.
  *
- * Following are the conditions needed to assertain that rolling CAC
- * is enabled:
- * 1. DFS domain of the PDEV must be FCC or MKK.
- * 2. User has enabled Rolling CAC configuration.
- * 3. FW capability to support ADFS. Only non-160 capability is checked here.
- *    If we happen to choose the next RCAC channel as 160/80-80,
- *    'dfs_fw_adfs_support_160' is also verified.
- *
- *
- * Return: True if RCAC support is enabled, false otherwise.
+ * Return: True if either Agile PreCAC/RCAC is enabled, false otherwise.
  */
-bool dfs_is_agile_rcac_enabled(struct wlan_dfs *dfs);
+bool dfs_is_agile_cac_enabled(struct wlan_dfs *dfs);
 
-/**
- * dfs_prepare_agile_rcac_channel() - Prepare agile RCAC channel.
- * @dfs: Pointer to struct wlan_dfs.
- * @is_rcac_chan_available: Flag to indicate if a valid RCAC channel is
- *                          found.
- */
-void dfs_prepare_agile_rcac_channel(struct wlan_dfs *dfs,
-				    bool *is_rcac_chan_available);
 #else
+
 static inline
 QDF_STATUS dfs_agile_sm_deliver_evt(struct dfs_soc_priv_obj *dfs_soc_obj,
 				    enum dfs_agile_sm_evt event,
@@ -1332,6 +1318,52 @@ QDF_STATUS dfs_agile_sm_destroy(struct dfs_soc_priv_obj *dfs_soc_obj)
 	return QDF_STATUS_SUCCESS;
 }
 
+static inline bool dfs_is_agile_cac_enabled(struct wlan_dfs *dfs)
+{
+	return false;
+}
+#endif /* QCA_SUPPORT_AGILE_DFS */
+
+#ifdef QCA_SUPPORT_ADFS_RCAC
+/**
+ * dfs_is_agile_rcac_enabled() - Determine if Rolling CAC is enabled or not.
+ * @dfs: Pointer to struct wlan_dfs.
+ *
+ * Following are the conditions needed to assertain that rolling CAC
+ * is enabled:
+ * 1. DFS domain of the PDEV must be FCC or MKK.
+ * 2. User has enabled Rolling CAC configuration.
+ * 3. FW capability to support ADFS. Only non-160 capability is checked here.
+ *    If we happen to choose the next RCAC channel as 160/80-80,
+ *    'dfs_fw_adfs_support_160' is also verified.
+ *
+ *
+ * Return: True if RCAC support is enabled, false otherwise.
+ */
+bool dfs_is_agile_rcac_enabled(struct wlan_dfs *dfs);
+
+/**
+ * dfs_prepare_agile_rcac_channel() - Prepare agile RCAC channel.
+ * @dfs: Pointer to struct wlan_dfs.
+ * @is_rcac_chan_available: Flag to indicate if a valid RCAC channel is
+ *                          found.
+ */
+void dfs_prepare_agile_rcac_channel(struct wlan_dfs *dfs,
+				    bool *is_rcac_chan_available);
+/**
+ * dfs_start_agile_rcac_timer() - Start Agile RCAC timer.
+ * @dfs: Pointer to struct wlan_dfs.
+ *
+ */
+void dfs_start_agile_rcac_timer(struct wlan_dfs *dfs);
+
+/**
+ * dfs_stop_agile_rcac_timer() - Stop Agile RCAC timer.
+ * @dfs: Pointer to struct wlan_dfs.
+ *
+ */
+void dfs_stop_agile_rcac_timer(struct wlan_dfs *dfs);
+#else
 static inline bool dfs_is_agile_rcac_enabled(struct wlan_dfs *dfs)
 {
 	return false;
@@ -1342,6 +1374,14 @@ dfs_prepare_agile_rcac_channel(struct wlan_dfs *dfs,
 			       bool *is_rcac_chan_available)
 {
 }
+
+static inline void dfs_start_agile_rcac_timer(struct wlan_dfs *dfs)
+{
+}
+
+static inline void dfs_stop_agile_rcac_timer(struct wlan_dfs *dfs)
+{
+}
 #endif /* QCA_SUPPORT_ADFS_RCAC */
 
 #endif /* _DFS_ZERO_CAC_H_ */

+ 1 - 2
umac/dfs/core/src/misc/dfs_process_radar_found_ind.c

@@ -1236,8 +1236,7 @@ QDF_STATUS dfs_process_radar_ind(struct wlan_dfs *dfs,
 				     nol_freq_list,
 				     num_channels);
 
-	if (dfs_is_agile_rcac_enabled(dfs) &&
-	    radar_found->detector_id == dfs_get_agile_detector_id(dfs))
+	if (radar_found->detector_id == dfs_get_agile_detector_id(dfs))
 		utils_dfs_agile_sm_deliver_evt(dfs->dfs_pdev_obj,
 					       DFS_AGILE_SM_EV_ADFS_RADAR);
 	/*

+ 9 - 7
umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h

@@ -978,7 +978,7 @@ void utils_dfs_deliver_event(struct wlan_objmgr_pdev *pdev, uint16_t freq,
  */
 void utils_dfs_reset_dfs_prevchan(struct wlan_objmgr_pdev *pdev);
 
-#ifdef QCA_SUPPORT_ADFS_RCAC
+#ifdef QCA_SUPPORT_AGILE_DFS
 /**
  * utils_dfs_agile_sm_deliver_evt() - API to post events to DFS Agile SM.
  * @pdev: Pointer to DFS pdev object.
@@ -988,7 +988,15 @@ void utils_dfs_reset_dfs_prevchan(struct wlan_objmgr_pdev *pdev);
  */
 void utils_dfs_agile_sm_deliver_evt(struct wlan_objmgr_pdev *pdev,
 				    enum dfs_agile_sm_evt event);
+#else
+static inline
+void utils_dfs_agile_sm_deliver_evt(struct wlan_objmgr_pdev *pdev,
+				    enum dfs_agile_sm_evt event)
+{
+}
+#endif/*QCA_SUPPORT_AGILE_DFS*/
 
+#ifdef QCA_SUPPORT_ADFS_RCAC
 /**
  * utils_dfs_get_rcac_channel() - Get the completed Rolling CAC channel if
  *                                available.
@@ -1002,12 +1010,6 @@ QDF_STATUS utils_dfs_get_rcac_channel(struct wlan_objmgr_pdev *pdev,
 				      struct ch_params *chan_params,
 				      qdf_freq_t *target_chan_freq);
 #else
-static inline
-void utils_dfs_agile_sm_deliver_evt(struct wlan_objmgr_pdev *pdev,
-				    enum dfs_agile_sm_evt event)
-{
-}
-
 static inline
 QDF_STATUS utils_dfs_get_rcac_channel(struct wlan_objmgr_pdev *pdev,
 				      struct ch_params *chan_params,

+ 5 - 2
umac/dfs/dispatcher/src/wlan_dfs_utils_api.c

@@ -1619,7 +1619,8 @@ void utils_dfs_reset_dfs_prevchan(struct wlan_objmgr_pdev *pdev)
 	dfs_reset_dfs_prevchan(dfs);
 }
 
-#ifdef QCA_SUPPORT_ADFS_RCAC
+#ifdef QCA_SUPPORT_AGILE_DFS
+
 void utils_dfs_agile_sm_deliver_evt(struct wlan_objmgr_pdev *pdev,
 				    enum dfs_agile_sm_evt event)
 {
@@ -1635,7 +1636,7 @@ void utils_dfs_agile_sm_deliver_evt(struct wlan_objmgr_pdev *pdev,
 		return;
 	}
 
-	if (!dfs_is_agile_rcac_enabled(dfs))
+	if (!dfs_is_agile_cac_enabled(dfs))
 		return;
 
 	event_data = (void *)dfs;
@@ -1645,7 +1646,9 @@ void utils_dfs_agile_sm_deliver_evt(struct wlan_objmgr_pdev *pdev,
 				 0,
 				 event_data);
 }
+#endif
 
+#ifdef QCA_SUPPORT_ADFS_RCAC
 QDF_STATUS utils_dfs_get_rcac_channel(struct wlan_objmgr_pdev *pdev,
 				      struct ch_params *chan_params,
 				      qdf_freq_t *target_chan_freq)

+ 4 - 1
umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h

@@ -1522,6 +1522,7 @@ struct wlan_lmac_if_wifi_pos_rx_ops {
  * @dfs_reinit_nol_from_psoc_copy:    Reinit DFS NOL from the PSOC NOL copy.
  * @dfs_reinit_precac_lists:          Reinit precac lists from other pdev.
  * @dfs_complete_deferred_tasks:      Process mode switch completion in DFS.
+ * @dfs_is_agile_rcac_enabled:        Checks if Agile RCAC is enabled.
  * @dfs_agile_sm_deliver_evt:         API to post events to DFS Agile  SM.
  */
 struct wlan_lmac_if_dfs_rx_ops {
@@ -1714,9 +1715,11 @@ struct wlan_lmac_if_dfs_rx_ops {
 					qdf_freq_t rcac_freq);
 	QDF_STATUS (*dfs_get_rcac_freq)(struct wlan_objmgr_pdev *pdev,
 					qdf_freq_t *rcac_freq);
+	bool (*dfs_is_agile_rcac_enabled)(struct wlan_objmgr_pdev *pdev);
+#endif
+#ifdef QCA_SUPPORT_AGILE_DFS
 	void (*dfs_agile_sm_deliver_evt)(struct wlan_objmgr_pdev *pdev,
 					 enum dfs_agile_sm_evt event);
-	bool (*dfs_is_agile_rcac_enabled)(struct wlan_objmgr_pdev *pdev);
 #endif
 };
 

+ 20 - 3
umac/global_umac_dispatcher/lmac_if/src/wlan_lmac_if.c

@@ -473,7 +473,7 @@ static void register_dfs_rx_ops_for_freq(struct wlan_lmac_if_dfs_rx_ops *rx_ops)
 #endif
 
 /*
- * register_agile_dfs_rx_ops() - Register DFS RX-Ops for Agile specific
+ * register_rcac_dfs_rx_ops() - Register DFS RX-Ops for RCAC specific
  * APIs.
  * @rx_ops: Pointer to wlan_lmac_if_dfs_rx_ops.
  */
@@ -482,12 +482,10 @@ static void register_rcac_dfs_rx_ops(struct wlan_lmac_if_dfs_rx_ops *rx_ops)
 {
 	if (!rx_ops)
 		return;
-
 	rx_ops->dfs_set_rcac_enable = ucfg_dfs_set_rcac_enable;
 	rx_ops->dfs_get_rcac_enable = ucfg_dfs_get_rcac_enable;
 	rx_ops->dfs_set_rcac_freq = ucfg_dfs_set_rcac_freq;
 	rx_ops->dfs_get_rcac_freq = ucfg_dfs_get_rcac_freq;
-	rx_ops->dfs_agile_sm_deliver_evt = utils_dfs_agile_sm_deliver_evt;
 	rx_ops->dfs_is_agile_rcac_enabled = ucfg_dfs_is_agile_rcac_enabled;
 }
 #else
@@ -497,6 +495,24 @@ register_rcac_dfs_rx_ops(struct wlan_lmac_if_dfs_rx_ops *rx_ops)
 }
 #endif
 
+/*
+ * register_agile_dfs_rx_ops() - Register Rx-Ops for Agile Specific APIs
+ * @rx_ops: Pointer to wlan_lmac_if_dfs_rx_ops.
+ */
+#ifdef QCA_SUPPORT_AGILE_DFS
+static void register_agile_dfs_rx_ops(struct wlan_lmac_if_dfs_rx_ops *rx_ops)
+{
+	if (!rx_ops)
+		return;
+	rx_ops->dfs_agile_sm_deliver_evt = utils_dfs_agile_sm_deliver_evt;
+}
+#else
+static inline void
+register_agile_dfs_rx_ops(struct wlan_lmac_if_dfs_rx_ops *rx_ops)
+{
+}
+#endif
+
 static QDF_STATUS
 wlan_lmac_if_umac_dfs_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
 {
@@ -581,6 +597,7 @@ wlan_lmac_if_umac_dfs_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
 	register_precac_auto_chan_rx_ops_freq(dfs_rx_ops);
 	register_dfs_rx_ops_for_freq(dfs_rx_ops);
 	register_rcac_dfs_rx_ops(dfs_rx_ops);
+	register_agile_dfs_rx_ops(dfs_rx_ops);
 
 	return QDF_STATUS_SUCCESS;
 }