From a23f9384c423e22c6afde56e69d4b9d259feec03 Mon Sep 17 00:00:00 2001 From: Vignesh Mohan Date: Thu, 9 Apr 2020 11:28:32 +0530 Subject: [PATCH] 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 --- umac/dfs/core/src/dfs.h | 7 ++ umac/dfs/core/src/dfs_zero_cac.h | 73 +++++++++++++++++++ umac/dfs/dispatcher/inc/wlan_dfs_ioctl.h | 17 +++++ umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h | 25 +++++++ .../dispatcher/src/wlan_dfs_init_deinit_api.c | 6 ++ umac/dfs/dispatcher/src/wlan_dfs_utils_api.c | 24 ++++++ .../lmac_if/inc/wlan_lmac_if_def.h | 5 ++ .../lmac_if/src/wlan_lmac_if.c | 1 + 8 files changed, 158 insertions(+) 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