From 4ae200caad89349774cdfa2a7b32496c6c836e7c Mon Sep 17 00:00:00 2001 From: Priyadarshnee S Date: Sun, 28 Jul 2019 15:05:45 +0530 Subject: [PATCH] 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 --- umac/dfs/core/src/dfs.h | 14 ++++++ umac/dfs/core/src/dfs_zero_cac.h | 4 ++ umac/dfs/core/src/misc/dfs.c | 9 ++++ umac/dfs/dispatcher/inc/wlan_dfs_ucfg_api.h | 28 ++++++++++++ umac/dfs/dispatcher/src/wlan_dfs_ucfg_api.c | 48 ++++++++++++++++++++- 5 files changed, 102 insertions(+), 1 deletion(-) diff --git a/umac/dfs/core/src/dfs.h b/umac/dfs/core/src/dfs.h index 4dc9c147768f..b143538dcbf8 100644 --- a/umac/dfs/core/src/dfs.h +++ b/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_ */ diff --git a/umac/dfs/core/src/dfs_zero_cac.h b/umac/dfs/core/src/dfs_zero_cac.h index 5ddacd109c4c..be7990318a0a 100644 --- a/umac/dfs/core/src/dfs_zero_cac.h +++ b/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. diff --git a/umac/dfs/core/src/misc/dfs.c b/umac/dfs/core/src/misc/dfs.c index 0c2a3a0c666b..230d8e6b0d63 100644 --- a/umac/dfs/core/src/misc/dfs.c +++ b/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; +} diff --git a/umac/dfs/dispatcher/inc/wlan_dfs_ucfg_api.h b/umac/dfs/dispatcher/inc/wlan_dfs_ucfg_api.h index 35f6f7f9b4cf..110f3d6c8726 100644 --- a/umac/dfs/dispatcher/inc/wlan_dfs_ucfg_api.h +++ b/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_ */ diff --git a/umac/dfs/dispatcher/src/wlan_dfs_ucfg_api.c b/umac/dfs/dispatcher/src/wlan_dfs_ucfg_api.c index 2f284b433320..93c42ed32eae 100644 --- a/umac/dfs/dispatcher/src/wlan_dfs_ucfg_api.c +++ b/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);