diff --git a/umac/dfs/core/src/dfs.h b/umac/dfs/core/src/dfs.h index f1189d60e4e5..1e81a4b93786 100644 --- a/umac/dfs/core/src/dfs.h +++ b/umac/dfs/core/src/dfs.h @@ -932,9 +932,6 @@ struct dfs_event_log { * received. * @is_radar_during_precac: Radar found during precac. * @dfs_precac_lock: Lock to protect precac lists. - * @dfs_precac_enable: Enable the precac for legacy chips. - * @dfs_agile_precac_enable: Enable preCAC for chips that supports agile - * detector engine. * @dfs_precac_secondary_freq: Second segment freq for precac. * Applicable to only legacy chips. * @dfs_precac_primary_freq: PreCAC Primary freq applicable only to @@ -1037,6 +1034,11 @@ struct dfs_event_log { * to be sent in NOL IE with RCSA. * @dfs_is_rcsa_ie_sent: To send or to not send RCSA IE. * @dfs_is_nol_ie_sent: To send or to not send NOL IE. + * @dfs_legacy_precac_ucfg: User configuration for legacy preCAC in + * partial offload chipsets. + * @dfs_agile_precac_ucfg: User configuration for agile preCAC. + * @dfs_fw_adfs_support_non_160: Target Agile DFS support for non-160 BWs. + * @dfs_fw_adfs_support_160: Target Agile DFS support for 160 BW. * @dfs_allow_hw_pulses: Allow/Block HW pulses. When synthetic * pulses are injected, the HW pulses should * be blocked and this variable should be @@ -1087,7 +1089,6 @@ struct wlan_dfs { bool dfs_radar_found_for_fo; bool is_radar_during_precac; qdf_spinlock_t dfs_precac_lock; - bool dfs_precac_enable; uint8_t dfs_precac_secondary_freq; uint8_t dfs_precac_primary_freq; uint8_t dfs_defer_precac_channel_change; @@ -1182,7 +1183,10 @@ struct wlan_dfs { uint8_t dfs_nol_ie_bitmap; bool dfs_is_rcsa_ie_sent; bool dfs_is_nol_ie_sent; - bool dfs_agile_precac_enable; + uint8_t dfs_legacy_precac_ucfg:1, + dfs_agile_precac_ucfg:1, + dfs_fw_adfs_support_non_160:1, + dfs_fw_adfs_support_160:1; #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(WLAN_DFS_SYNTHETIC_RADAR) bool dfs_allow_hw_pulses; #endif diff --git a/umac/dfs/core/src/dfs_zero_cac.h b/umac/dfs/core/src/dfs_zero_cac.h index 0458cc433041..aab82ccc2fdb 100644 --- a/umac/dfs/core/src/dfs_zero_cac.h +++ b/umac/dfs/core/src/dfs_zero_cac.h @@ -460,6 +460,18 @@ void dfs_agile_precac_start(struct wlan_dfs *dfs); void dfs_start_agile_precac_timer(struct wlan_dfs *dfs, uint8_t ocac_status, struct dfs_agile_cac_params *adfs_param); + +/** + * dfs_set_fw_adfs_support() - Set FW aDFS support in dfs object. + * @dfs: Pointer to wlan_dfs structure. + * @fw_adfs_support_160: aDFS enabled when pdev is on 160/80P80MHz. + * @fw_adfs_support_non_160: aDFS enabled when pdev is on 20/40/80MHz. + * + * Return: void. + */ +void dfs_set_fw_adfs_support(struct wlan_dfs *dfs, + bool fw_adfs_support_160, + bool fw_adfs_support_non_160); #else static inline void dfs_find_pdev_for_agile_precac(struct wlan_objmgr_pdev *pdev, uint8_t *cur_precac_dfs_index) @@ -494,6 +506,13 @@ dfs_start_agile_precac_timer(struct wlan_dfs *dfs, struct dfs_agile_cac_params *adfs_param) { } + +static inline void +dfs_set_fw_adfs_support(struct wlan_dfs *dfs, + bool fw_adfs_support_160, + bool fw_adfs_support_non_160) +{ +} #endif #if defined(QCA_SUPPORT_AGILE_DFS) || defined(ATH_SUPPORT_ZERO_CAC_DFS) @@ -515,7 +534,7 @@ static inline void dfs_agile_soc_obj_init(struct wlan_dfs *dfs, /** * dfs_set_precac_enable() - Set precac enable flag. * @dfs: Pointer to wlan_dfs structure. - * @value: input value for dfs_precac_enable flag. + * @value: input value for dfs_legacy_precac_ucfg flag. */ #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && !defined(QCA_MCL_DFS_SUPPORT) void dfs_set_precac_enable(struct wlan_dfs *dfs, @@ -528,28 +547,35 @@ static inline void dfs_set_precac_enable(struct wlan_dfs *dfs, #endif /** - * dfs_get_precac_enable() - Get precac enable flag. - * @dfs: Pointer to wlan_dfs structure. + * dfs_is_legacy_precac_enabled() - Check if legacy preCAC is enabled for the + * DFS onject. + * @dfs: Pointer to the wlan_dfs object. + * + * Return: True if legacy preCAC is enabled, else false. */ #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && !defined(QCA_MCL_DFS_SUPPORT) -uint32_t dfs_get_precac_enable(struct wlan_dfs *dfs); +bool dfs_is_legacy_precac_enabled(struct wlan_dfs *dfs); #else -static inline uint32_t dfs_get_precac_enable(struct wlan_dfs *dfs) +static inline bool dfs_is_legacy_precac_enabled(struct wlan_dfs *dfs) { return 0; } #endif /** - * dfs_get_agile_precac_enable() - Get agile precac enable flag. - * @dfs: Pointer to wlan_dfs structure. + * dfs_is_agile_precac_enabled() - Check if agile preCAC is enabled for the DFS. + * @dfs: Pointer to the wlan_dfs object. * - * Return: Value of flag dfs_agile_precac_enable + * Return: True if agile DFS is enabled, else false. + * + * For agile preCAC to be enabled, + * 1. User configuration should be set. + * 2. Target should support aDFS. */ #ifdef QCA_SUPPORT_AGILE_DFS -bool dfs_get_agile_precac_enable(struct wlan_dfs *dfs); +bool dfs_is_agile_precac_enabled(struct wlan_dfs *dfs); #else -static inline bool dfs_get_agile_precac_enable(struct wlan_dfs *dfs) +static inline bool dfs_is_agile_precac_enabled(struct wlan_dfs *dfs) { return false; } @@ -560,7 +586,7 @@ static inline bool dfs_get_agile_precac_enable(struct wlan_dfs *dfs) * dfs_set_precac_intermediate_chan() - Set intermediate chan to be used while * doing precac. * @dfs: Pointer to wlan_dfs structure. - * @value: input value for dfs_precac_enable flag. + * @value: input value for dfs_legacy_precac_ucfg flag. * * Return: * * 0 - Successfully set intermediate channel. diff --git a/umac/dfs/core/src/misc/dfs_process_radar_found_ind.c b/umac/dfs/core/src/misc/dfs_process_radar_found_ind.c index 9e4af40c8a27..4334b07e7041 100644 --- a/umac/dfs/core/src/misc/dfs_process_radar_found_ind.c +++ b/umac/dfs/core/src/misc/dfs_process_radar_found_ind.c @@ -348,7 +348,7 @@ dfs_compute_radar_found_cfreq(struct wlan_dfs *dfs, * legacy chips. */ if (dfs_is_precac_timer_running(dfs) && - (dfs->dfs_precac_enable)) { + dfs_is_legacy_precac_enabled(dfs)) { *freq_center = utils_dfs_chan_to_freq( dfs->dfs_precac_secondary_freq); } else { @@ -542,7 +542,8 @@ uint8_t dfs_get_bonding_channels(struct wlan_dfs *dfs, * agile engines. * 2. preCAC timer is not running. */ - if (dfs_is_precac_timer_running(dfs) && dfs->dfs_precac_enable) + if (dfs_is_precac_timer_running(dfs) && + dfs_is_legacy_precac_enabled(dfs)) center_chan = dfs->dfs_precac_secondary_freq; else center_chan = curchan->dfs_ch_vhtop_ch_freq_seg2; @@ -785,7 +786,8 @@ QDF_STATUS dfs_process_radar_ind(struct wlan_dfs *dfs, /* Sanity checks for radar on Agile detector */ if (radar_found->detector_id == AGILE_DETECTOR_ID && - (!dfs->dfs_agile_precac_enable || !dfs->dfs_agile_precac_freq)) { + (!dfs_is_agile_precac_enabled(dfs) || + !dfs->dfs_agile_precac_freq)) { dfs_err(dfs, WLAN_DEBUG_DFS, "radar on Agile detector when ADFS is not running"); return QDF_STATUS_E_FAILURE; diff --git a/umac/dfs/dispatcher/inc/wlan_dfs_tgt_api.h b/umac/dfs/dispatcher/inc/wlan_dfs_tgt_api.h index 6634a346a270..6005cf648695 100644 --- a/umac/dfs/dispatcher/inc/wlan_dfs_tgt_api.h +++ b/umac/dfs/dispatcher/inc/wlan_dfs_tgt_api.h @@ -525,4 +525,24 @@ tgt_dfs_send_subchan_marking(struct wlan_objmgr_pdev *pdev, bool subchanmark) return QDF_STATUS_SUCCESS; } #endif +#ifdef QCA_SUPPORT_AGILE_DFS +/** + * tgt_dfs_set_fw_adfs_support() - Set FW aDFS support in dfs object. + * @pdev: Pointer to pdev object. + * @fw_adfs_support_160: aDFS enabled when pdev is on 160/80P80MHz. + * @fw_adfs_support_non_160: aDFS enabled when pdev is on 20/40/80MHz. + * + * Return: void. + */ +void tgt_dfs_set_fw_adfs_support(struct wlan_objmgr_pdev *pdev, + bool fw_adfs_support_160, + bool fw_adfs_support_non_160); +#else +static inline +void tgt_dfs_set_fw_adfs_support(struct wlan_objmgr_pdev *pdev, + bool fw_adfs_support_160, + bool fw_adfs_support_non_160) +{ +} +#endif #endif /* _WLAN_DFS_TGT_API_H_ */ diff --git a/umac/dfs/dispatcher/inc/wlan_dfs_ucfg_api.h b/umac/dfs/dispatcher/inc/wlan_dfs_ucfg_api.h index 8b9c54b90221..700810f78f7f 100644 --- a/umac/dfs/dispatcher/inc/wlan_dfs_ucfg_api.h +++ b/umac/dfs/dispatcher/inc/wlan_dfs_ucfg_api.h @@ -240,7 +240,7 @@ QDF_STATUS ucfg_dfs_override_precac_timeout(struct wlan_objmgr_pdev *pdev, /** * ucfg_dfs_set_precac_enable() - Set precac enable flag. * @pdev: Pointer to DFS pdev object. - * @value: input value for dfs_precac_enable flag. + * @value: input value for dfs_legacy_precac_ucfg flag. * * Wrapper function for dfs_set_precac_enable(). * This function called from outside of dfs component. @@ -249,21 +249,23 @@ QDF_STATUS ucfg_dfs_set_precac_enable(struct wlan_objmgr_pdev *pdev, uint32_t value); /** - * ucfg_dfs_get_precac_enable() - Get precac enable flag. + * ucfg_dfs_get_legacy_precac_enable() - Get the legacy precac enable flag. * @pdev: Pointer to DFS pdev object. * @buff: Pointer to save precac_enable value. * - * Wrapper function for dfs_get_precac_enable(). + * Wrapper function for dfs_is_legacy_precac_enabled() and returns the + * legacy precac enable flag for partial offload chipsets. * This function called from outside of dfs component. */ -QDF_STATUS ucfg_dfs_get_precac_enable(struct wlan_objmgr_pdev *pdev, int *buff); +QDF_STATUS ucfg_dfs_get_legacy_precac_enable(struct wlan_objmgr_pdev *pdev, + bool *buff); /** * ucfg_dfs_get_agile_precac_enable() - Get agile precac enable flag. * @pdev: Pointer to DFS pdev object. - * @buff: Pointer to save dfs_agile_precac_enable value. + * @buff: Pointer to save dfs_agile_precac_ucfg value. * - * Wrapper function for dfs_get_agile_precac_enable(). + * Wrapper function for dfs_is_legacy_precac_enabled(). * This function called from outside of dfs component. * * Return: diff --git a/umac/dfs/dispatcher/src/wlan_dfs_tgt_api.c b/umac/dfs/dispatcher/src/wlan_dfs_tgt_api.c index 0f3602861722..880f4b205f57 100644 --- a/umac/dfs/dispatcher/src/wlan_dfs_tgt_api.c +++ b/umac/dfs/dispatcher/src/wlan_dfs_tgt_api.c @@ -772,3 +772,24 @@ bool tgt_dfs_is_stadfs_enabled(struct wlan_objmgr_pdev *pdev) return dfs->dfs_is_stadfs_enabled; } + +#ifdef QCA_SUPPORT_AGILE_DFS +void tgt_dfs_set_fw_adfs_support(struct wlan_objmgr_pdev *pdev, + bool fw_adfs_support_160, + bool fw_adfs_support_non_160) +{ + struct wlan_dfs *dfs; + + dfs = wlan_pdev_get_dfs_obj(pdev); + if (!dfs) { + dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL"); + return; + } + + dfs_set_fw_adfs_support(dfs, + fw_adfs_support_160, + fw_adfs_support_non_160); +} + +qdf_export_symbol(tgt_dfs_set_fw_adfs_support); +#endif diff --git a/umac/dfs/dispatcher/src/wlan_dfs_ucfg_api.c b/umac/dfs/dispatcher/src/wlan_dfs_ucfg_api.c index c1698f6528f6..0193e5826141 100644 --- a/umac/dfs/dispatcher/src/wlan_dfs_ucfg_api.c +++ b/umac/dfs/dispatcher/src/wlan_dfs_ucfg_api.c @@ -139,8 +139,8 @@ QDF_STATUS ucfg_dfs_set_precac_enable(struct wlan_objmgr_pdev *pdev, } qdf_export_symbol(ucfg_dfs_set_precac_enable); -QDF_STATUS ucfg_dfs_get_precac_enable(struct wlan_objmgr_pdev *pdev, - int *buff) +QDF_STATUS ucfg_dfs_get_legacy_precac_enable(struct wlan_objmgr_pdev *pdev, + bool *buff) { struct wlan_dfs *dfs; @@ -153,11 +153,12 @@ QDF_STATUS ucfg_dfs_get_precac_enable(struct wlan_objmgr_pdev *pdev, return QDF_STATUS_E_FAILURE; } - *buff = dfs_get_precac_enable(dfs); + *buff = dfs_is_legacy_precac_enabled(dfs); return QDF_STATUS_SUCCESS; } -qdf_export_symbol(ucfg_dfs_get_precac_enable); + +qdf_export_symbol(ucfg_dfs_get_legacy_precac_enable); QDF_STATUS ucfg_dfs_get_agile_precac_enable(struct wlan_objmgr_pdev *pdev, bool *buff) @@ -178,7 +179,7 @@ QDF_STATUS ucfg_dfs_get_agile_precac_enable(struct wlan_objmgr_pdev *pdev, return QDF_STATUS_E_FAILURE; } - *buff = dfs_get_agile_precac_enable(dfs); + *buff = dfs_is_agile_precac_enabled(dfs); return QDF_STATUS_SUCCESS; } 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 e9102f511a31..541bec670dd0 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 @@ -1243,7 +1243,8 @@ struct wlan_lmac_if_wifi_pos_rx_ops { * @dfs_cancel_precac_timer: Cancel the precac timer. * @dfs_override_precac_timeout: Override the default precac timeout. * @dfs_set_precac_enable: Set precac enable flag. - * @dfs_get_precac_enable: Get precac enable flag. + * @dfs_get_legacy_precac_enable: Get the precac enable flag for + * partial offload (legacy) chipsets. * @dfs_set_precac_intermediate_chan: Set intermediate channel for precac. * @dfs_get_precac_intermediate_chan: Get intermediate channel for precac. * @dfs_precac_preferred_chan: Configure preferred channel during @@ -1324,8 +1325,9 @@ struct wlan_lmac_if_dfs_rx_ops { int precac_timeout); QDF_STATUS (*dfs_set_precac_enable)(struct wlan_objmgr_pdev *pdev, uint32_t value); - QDF_STATUS (*dfs_get_precac_enable)(struct wlan_objmgr_pdev *pdev, - int *buff); + QDF_STATUS + (*dfs_get_legacy_precac_enable)(struct wlan_objmgr_pdev *pdev, + bool *buff); QDF_STATUS (*dfs_get_agile_precac_enable)(struct wlan_objmgr_pdev *pdev, bool *buff); #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT @@ -1390,6 +1392,9 @@ struct wlan_lmac_if_dfs_rx_ops { void (*dfs_allow_hw_pulses)(struct wlan_objmgr_pdev *pdev, bool allow_hw_pulses); bool (*dfs_is_hw_pulses_allowed)(struct wlan_objmgr_pdev *pdev); + void (*dfs_set_fw_adfs_support)(struct wlan_objmgr_pdev *pdev, + bool fw_adfs_support_160, + bool fw_adfs_support_non_160); }; /** 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 4d19a95c6ae4..0ed3c5085403 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 @@ -391,8 +391,10 @@ wlan_lmac_if_umac_dfs_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops) dfs_rx_ops->dfs_override_precac_timeout = ucfg_dfs_override_precac_timeout; dfs_rx_ops->dfs_set_precac_enable = ucfg_dfs_set_precac_enable; - dfs_rx_ops->dfs_get_precac_enable = ucfg_dfs_get_precac_enable; - dfs_rx_ops->dfs_get_agile_precac_enable = ucfg_dfs_get_agile_precac_enable; + dfs_rx_ops->dfs_get_legacy_precac_enable = + ucfg_dfs_get_legacy_precac_enable; + dfs_rx_ops->dfs_get_agile_precac_enable = + ucfg_dfs_get_agile_precac_enable; dfs_rx_ops->dfs_get_override_precac_timeout = ucfg_dfs_get_override_precac_timeout; dfs_rx_ops->dfs_set_current_channel = tgt_dfs_set_current_channel; @@ -428,6 +430,8 @@ wlan_lmac_if_umac_dfs_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops) ucfg_dfs_allow_hw_pulses; dfs_rx_ops->dfs_is_hw_pulses_allowed = ucfg_dfs_is_hw_pulses_allowed; + dfs_rx_ops->dfs_set_fw_adfs_support = + tgt_dfs_set_fw_adfs_support; register_precac_auto_chan_rx_ops(dfs_rx_ops);