Bladeren bron

qcacmn: Add states events and API declarations for RCAC SM

As part of the Rolling CAC State Machine, introduce three state
enums (INIT, RUNNING and COMPLETE) and the corresponding state
events.

Introduce generic APIs such as dfs_rcac_sm_create,
dfs_rcac_sm_destroy and dfs_rcac_sm_deliver_evt for rolling
CAC State machine operations.

CRs-Fixed: 2659666
Change-Id: I528db71aa7d21dced7e47ff4f9cccfbfe94c8c21
Vignesh Mohan 5 jaren geleden
bovenliggende
commit
a23f9384c4

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

@@ -1308,6 +1308,9 @@ struct wlan_dfs_priv {
  * @dfs_nol_ctx: dfs NOL data for all radios.
  * @dfs_rcac_timer: Agile RCAC (Rolling CAC) timer.
  * @dfs_rcac_timer_running: RCAC (Rolling CAC) timer running flag.
+ * @dfs_rcac_sm_hdl: DFS Rolling CAC state machine handle.
+ * @dfs_rcac_curr_state: Current state of DFS rolling CAC state machine.
+ * @dfs_rcac_sm_lock: DFS Rolling CAC state machine lock.
  */
 struct dfs_soc_priv_obj {
 	struct wlan_objmgr_psoc *psoc;
@@ -1326,6 +1329,9 @@ struct dfs_soc_priv_obj {
 #if defined(QCA_SUPPORT_ADFS_RCAC)
 	qdf_timer_t dfs_rcac_timer;
 	bool dfs_rcac_timer_running;
+	wlan_sm *dfs_rcac_sm_hdl;
+	enum dfs_rcac_sm_state dfs_rcac_curr_state;
+	qdf_spinlock_t dfs_rcac_sm_lock;
 #endif
 };
 
@@ -1362,6 +1368,7 @@ enum {
 	WLAN_DEBUG_DFS_FALSE_DET  = 0x00080000,
 	WLAN_DEBUG_DFS_FALSE_DET2 = 0x00100000,
 	WLAN_DEBUG_DFS_RANDOM_CHAN = 0x00200000,
+	WLAN_DEBUG_DFS_RCAC       = 0x00400000,
 	WLAN_DEBUG_DFS_MAX        = 0x80000000,
 	WLAN_DEBUG_DFS_ALWAYS     = WLAN_DEBUG_DFS_MAX
 };

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

@@ -1256,4 +1256,77 @@ dfs_is_host_agile_rcac_config_enabled(struct wlan_dfs *dfs)
 }
 #endif
 
+#ifdef QCA_SUPPORT_ADFS_RCAC
+#define DFS_RCAC_SM_SPIN_LOCK(_soc_obj) \
+	qdf_spin_lock_bh((_soc_obj)->dfs_rcac_sm_lock)
+#define DFS_RCAC_SM_SPIN_UNLOCK(_soc_obj) \
+	qdf_spin_unlock_bh((_soc_obj)->dfs_rcac_sm_lock)
+
+/**
+ * enum dfs_rcac_sm_state - DFS Rolling CAC SM states.
+ * @DFS_RCAC_S_INIT:     Default state, where RCAC not in progress.
+ * @DFS_RCAC_S_RUNNING:  RCAC is in progress.
+ * @DFS_RCAC_S_COMPLETE: RCAC is completed.
+ * @DFS_RCAC_S_MAX:      Max (invalid) state.
+ */
+enum dfs_rcac_sm_state {
+	DFS_RCAC_S_INIT,
+	DFS_RCAC_S_RUNNING,
+	DFS_RCAC_S_COMPLETE,
+	DFS_RCAC_S_MAX,
+};
+
+/**
+ * dfs_rcac_sm_deliver_evt() - Deliver the event to RCAC SM.
+ * @dfs_soc_obj: Pointer to DFS soc object that holds the SM handle.
+ * @event: Event ID.
+ * @event_data_len: Length of event data.
+ * @event_data: pointer to event data.
+ *
+ * Return: Success if event is handled, else failure.
+ */
+QDF_STATUS dfs_rcac_sm_deliver_evt(struct dfs_soc_priv_obj *dfs_soc_obj,
+				   enum dfs_rcac_sm_evt event,
+				   uint16_t event_data_len,
+				   void *event_data);
+
+/**
+ * dfs_rcac_sm_create() - Create the Rolling CAC state machine.
+ * @dfs_soc_obj: Pointer to dfs_soc object that holds the SM handle.
+ *
+ * Return: QDF_STATUS_SUCCESS if successful, else failure status.
+ */
+QDF_STATUS dfs_rcac_sm_create(struct dfs_soc_priv_obj *dfs_soc_obj);
+
+/**
+ * dfs_rcac_sm_destroy() - Destroy the Rolling CAC state machine.
+ * @dfs_soc_obj: Pointer to dfs_soc object that holds the SM handle.
+ *
+ * Return: QDF_STATUS_SUCCESS if successful, else failure status.
+ */
+QDF_STATUS dfs_rcac_sm_destroy(struct dfs_soc_priv_obj *dfs_soc_obj);
+
+#else
+static inline
+QDF_STATUS dfs_rcac_sm_deliver_evt(struct dfs_soc_priv_obj *dfs_soc_obj,
+				   enum dfs_rcac_sm_evt event,
+				   uint16_t event_data_len,
+				   void *event_data)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline
+QDF_STATUS dfs_rcac_sm_create(struct dfs_soc_priv_obj *dfs_soc_obj)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline
+QDF_STATUS dfs_rcac_sm_destroy(struct dfs_soc_priv_obj *dfs_soc_obj)
+{
+	return QDF_STATUS_SUCCESS;
+}
+#endif /* QCA_SUPPORT_ADFS_RCAC */
+
 #endif /* _DFS_ZERO_CAC_H_ */

+ 17 - 0
umac/dfs/dispatcher/inc/wlan_dfs_ioctl.h

@@ -358,4 +358,21 @@ struct seq_store {
 	struct synthetic_seq *seq_arr[0];
 };
 #endif /* WLAN_DFS_PARTIAL_OFFLOAD && WLAN_DFS_SYNTHETIC_RADAR */
+
+/**
+ * enum dfs_rcac_sm_evt - DFS Rolling CAC SM events.
+ * @DFS_RCAC_SM_EV_RCAC_START: Event to start RCAC.
+ * @DFS_RCAC_SM_EV_NOL_EXPIRY: Event to try starting RCAC after NOL expiry.
+ * @DFS_RCAC_SM_EV_RCAC_DOWN:  Event to stop RCAC.
+ * @DFS_RCAC_SM_EV_RCAC_DONE:  Event to complete RCAC.
+ * @DFS_RCAC_SM_EV_ADFS_RADAR: Event to restart RCAC after radar in agile.
+ */
+enum dfs_rcac_sm_evt {
+	DFS_RCAC_SM_EV_RCAC_START = 0,
+	DFS_RCAC_SM_EV_NOL_EXPIRY = 1,
+	DFS_RCAC_SM_EV_RCAC_STOP = 2,
+	DFS_RCAC_SM_EV_RCAC_DONE = 3,
+	DFS_RCAC_SM_EV_ADFS_RADAR_FOUND = 4,
+};
+
 #endif  /* _DFS_IOCTL_H_ */

+ 25 - 0
umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h

@@ -977,4 +977,29 @@ void utils_dfs_deliver_event(struct wlan_objmgr_pdev *pdev, uint16_t freq,
  * Return: None.
  */
 void utils_dfs_reset_dfs_prevchan(struct wlan_objmgr_pdev *pdev);
+
+#ifdef QCA_SUPPORT_ADFS_RCAC
+/**
+ * utils_dfs_rcac_sm_deliver_evt() - API to post events to DFS rolling CAC SM.
+ * @pdev:           Pointer to DFS pdev object.
+ * @event:          Event to be posted to DFS RCAC SM.
+ * @event_data_len: Length of event data.
+ * @event_data:     Pointer to event data.
+ *
+ * Return: None.
+ */
+void utils_dfs_rcac_sm_deliver_evt(struct wlan_objmgr_pdev *pdev,
+				   enum dfs_rcac_sm_evt event,
+				   uint16_t event_data_len,
+				   void *event_data);
+#else
+static inline
+void utils_dfs_rcac_sm_deliver_evt(struct wlan_objmgr_pdev *pdev,
+				   enum dfs_rcac_sm_evt event,
+				   uint16_t event_data_len,
+				   void *event_data)
+{
+}
+#endif /* QCA_SUPPORT_ADFS_RCAC */
+
 #endif /* _WLAN_DFS_UTILS_API_H_ */

+ 6 - 0
umac/dfs/dispatcher/src/wlan_dfs_init_deinit_api.c

@@ -198,6 +198,9 @@ static QDF_STATUS dfs_psoc_obj_create_notification(struct wlan_objmgr_psoc *psoc
 	/* Initialize Rolling CAC timer */
 	dfs_rcac_timer_init(dfs_soc_obj);
 
+	/* DFS Rolling CAC SM initialization */
+	dfs_rcac_sm_create(dfs_soc_obj);
+
 	dfs_debug(NULL, WLAN_DEBUG_DFS1,
 		"DFS obj attach to psoc successfully");
 
@@ -225,6 +228,9 @@ static QDF_STATUS dfs_psoc_obj_destroy_notification(struct wlan_objmgr_psoc *pso
 		return QDF_STATUS_E_FAILURE;
 	}
 
+	/* Delete DFS Rolling CAC SM */
+	dfs_rcac_sm_destroy(dfs_soc_obj);
+
 	dfs_rcac_timer_deinit(dfs_soc_obj);
 	dfs_zero_cac_timer_detach(dfs_soc_obj);
 

+ 24 - 0
umac/dfs/dispatcher/src/wlan_dfs_utils_api.c

@@ -1618,3 +1618,27 @@ void utils_dfs_reset_dfs_prevchan(struct wlan_objmgr_pdev *pdev)
 
 	dfs_reset_dfs_prevchan(dfs);
 }
+
+#ifdef QCA_SUPPORT_ADFS_RCAC
+void utils_dfs_rcac_sm_deliver_evt(struct wlan_objmgr_pdev *pdev,
+				   enum dfs_rcac_sm_evt event,
+				   uint16_t event_data_len,
+				   void *event_data)
+{
+	struct wlan_dfs *dfs;
+
+	if (!tgt_dfs_is_pdev_5ghz(pdev))
+		return;
+
+	dfs = wlan_pdev_get_dfs_obj(pdev);
+	if (!dfs) {
+		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "dfs is null");
+		return;
+	}
+
+	dfs_rcac_sm_deliver_evt(dfs->dfs_soc_obj,
+				event,
+				event_data_len,
+				event_data);
+}
+#endif /* QCA_SUPPORT_ADFS_RCAC */

+ 5 - 0
umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h

@@ -1448,6 +1448,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_rcac_sm_deliver_evt:          API to post events to DFS rolling CAC SM.
  */
 struct wlan_lmac_if_dfs_rx_ops {
 	QDF_STATUS (*dfs_get_radars)(struct wlan_objmgr_pdev *pdev);
@@ -1638,6 +1639,10 @@ 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);
+	void (*dfs_rcac_sm_deliver_evt)(struct wlan_objmgr_pdev *pdev,
+					enum dfs_rcac_sm_evt event,
+					uint16_t event_data_len,
+					void *event_data);
 #endif
 };
 

+ 1 - 0
umac/global_umac_dispatcher/lmac_if/src/wlan_lmac_if.c

@@ -496,6 +496,7 @@ static void register_rcac_dfs_rx_ops(struct wlan_lmac_if_dfs_rx_ops *rx_ops)
 	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_rcac_sm_deliver_evt = utils_dfs_rcac_sm_deliver_evt;
 }
 #else
 static inline void