diff --git a/umac/dfs/core/src/dfs.h b/umac/dfs/core/src/dfs.h index bc58755ddb..a698aa68df 100644 --- a/umac/dfs/core/src/dfs.h +++ b/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 }; diff --git a/umac/dfs/core/src/dfs_zero_cac.h b/umac/dfs/core/src/dfs_zero_cac.h index 8b6b04eee9..27ba97a867 100644 --- a/umac/dfs/core/src/dfs_zero_cac.h +++ b/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_ */ diff --git a/umac/dfs/dispatcher/inc/wlan_dfs_ioctl.h b/umac/dfs/dispatcher/inc/wlan_dfs_ioctl.h index 72162ced0e..90e43b5175 100644 --- a/umac/dfs/dispatcher/inc/wlan_dfs_ioctl.h +++ b/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_ */ diff --git a/umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h b/umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h index 49bf73eaf2..fc0fb71043 100644 --- a/umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h +++ b/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_ */ diff --git a/umac/dfs/dispatcher/src/wlan_dfs_init_deinit_api.c b/umac/dfs/dispatcher/src/wlan_dfs_init_deinit_api.c index 8f91af2669..8a3d64a2f3 100644 --- a/umac/dfs/dispatcher/src/wlan_dfs_init_deinit_api.c +++ b/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); diff --git a/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c b/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c index 7aff03090c..f6950115d7 100644 --- a/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c +++ b/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 */ diff --git a/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h b/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h index 720df56509..97675b0303 100644 --- a/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h +++ b/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 }; diff --git a/umac/global_umac_dispatcher/lmac_if/src/wlan_lmac_if.c b/umac/global_umac_dispatcher/lmac_if/src/wlan_lmac_if.c index 2344ee7881..53029fb764 100644 --- a/umac/global_umac_dispatcher/lmac_if/src/wlan_lmac_if.c +++ b/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