diff --git a/target_if/init_deinit/src/init_event_handler.c b/target_if/init_deinit/src/init_event_handler.c index 382d531890..53a534f8e1 100644 --- a/target_if/init_deinit/src/init_event_handler.c +++ b/target_if/init_deinit/src/init_event_handler.c @@ -612,6 +612,12 @@ static int init_deinit_service_ext2_ready_event_handler(ol_scn_t scn_handle, target_if_err("Legacy callback return error!"); goto exit; } + + if (wmi_service_enabled(wmi_handle, wmi_service_radar_flags_support)) { + target_if_debug("Full bw nol supported"); + info->wlan_res_cfg.is_full_bw_nol_supported = true; + } + target_if_regulatory_set_ext_tpc(psoc); target_if_reg_set_lower_6g_edge_ch_info(psoc); 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 3f0a308172..b8fea62619 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 @@ -890,6 +890,31 @@ dfs_radar_action_for_hw_mode_switch(struct wlan_dfs *dfs, } #ifdef CONFIG_CHAN_FREQ_API +#ifdef MOBILE_DFS_SUPPORT +static uint8_t +dfs_find_radar_full_bw_channels(struct wlan_dfs *dfs, + struct radar_found_info *radar_found, + uint16_t *freq_list) +{ + uint8_t num_channels = 0; + + if (radar_found->is_full_bw_nol) + num_channels = + dfs_get_bonding_channel_without_seg_info_for_freq + (dfs->dfs_curchan, freq_list); + + return num_channels; +} +#else +static uint8_t +dfs_find_radar_full_bw_channels(struct wlan_dfs *dfs, + struct radar_found_info *radar_found, + uint16_t *freq_list) +{ + return 0; +} +#endif + uint8_t dfs_find_radar_affected_channels(struct wlan_dfs *dfs, struct radar_found_info *radar_found, @@ -898,6 +923,11 @@ dfs_find_radar_affected_channels(struct wlan_dfs *dfs, { uint8_t num_channels; + num_channels = dfs_find_radar_full_bw_channels(dfs, radar_found, + freq_list); + if (num_channels) + return num_channels; + if (dfs->dfs_bangradar_type == DFS_BANGRADAR_FOR_ALL_SUBCHANS) num_channels = dfs_get_bonding_channel_without_seg_info_for_freq diff --git a/umac/dfs/dispatcher/inc/wlan_dfs_public_struct.h b/umac/dfs/dispatcher/inc/wlan_dfs_public_struct.h index 692983d931..3c842d23e5 100644 --- a/umac/dfs/dispatcher/inc/wlan_dfs_public_struct.h +++ b/umac/dfs/dispatcher/inc/wlan_dfs_public_struct.h @@ -39,6 +39,7 @@ * @chan_freq: channel frequency (Primary channel frequency). * @radar_freq: radar frequency (Is it same as '@chan_freq'?). * @sidx: sidx value (same as freq_offset). + * @is_full_bw_nol: Is full bandwidth needed to put to NOL. */ struct radar_found_info { uint32_t pdev_id; @@ -52,6 +53,7 @@ struct radar_found_info { uint32_t chan_freq; uint32_t radar_freq; int32_t sidx; + uint8_t is_full_bw_nol; }; /** diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index 372e47a9f3..2c14a5508a 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -6437,6 +6437,7 @@ typedef enum { wmi_service_atf_max_client_512_support, #endif wmi_service_fisa_dynamic_msdu_aggr_size_support, + wmi_service_radar_flags_support, wmi_services_max, } wmi_conv_service_ids; #define WMI_SERVICE_UNAVAILABLE 0xFFFF @@ -6817,6 +6818,7 @@ struct target_feature_set { * @tx_ilp_enable: capability to support TX ILP from host * @rf_path: Indicates RF path 0 primary, 1 secondary * @fw_ast_indication_disable: Disable AST indication + * @is_full_bw_nol_supported: Is full bandwidth needed to put to NOL */ typedef struct { uint32_t num_vdevs; @@ -6951,6 +6953,7 @@ typedef struct { #endif bool rf_path; bool fw_ast_indication_disable; + bool is_full_bw_nol_supported; } target_resource_config; /** diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 681aa68863..5e3b68dcf0 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -9401,6 +9401,22 @@ void wmi_copy_latency_flowq_support(wmi_resource_config *resource_cfg, } #endif +#ifdef MOBILE_DFS_SUPPORT +static inline +void wmi_copy_full_bw_nol_cfg(wmi_resource_config *resource_cfg, + target_resource_config *tgt_res_cfg) +{ + WMI_RSRC_CFG_HOST_SERVICE_FLAG_RADAR_FLAGS_FULL_BW_NOL_SET(resource_cfg->host_service_flags, + tgt_res_cfg->is_full_bw_nol_supported); +} +#else +static inline +void wmi_copy_full_bw_nol_cfg(wmi_resource_config *resource_cfg, + target_resource_config *tgt_res_cfg) +{ +} +#endif + static void wmi_copy_resource_config(wmi_resource_config *resource_cfg, target_resource_config *tgt_res_cfg) @@ -9700,6 +9716,8 @@ void wmi_copy_resource_config(wmi_resource_config *resource_cfg, } wmi_copy_latency_flowq_support(resource_cfg, tgt_res_cfg); + wmi_copy_full_bw_nol_cfg(resource_cfg, tgt_res_cfg); + } #ifdef FEATURE_SET @@ -17279,6 +17297,7 @@ static QDF_STATUS extract_dfs_radar_detection_event_tlv( if (radar_found->pdev_id == WMI_HOST_PDEV_ID_INVALID) return QDF_STATUS_E_FAILURE; + qdf_mem_zero(radar_found, sizeof(struct radar_found_info)); radar_found->detection_mode = radar_event->detection_mode; radar_found->chan_freq = radar_event->chan_freq; radar_found->chan_width = radar_event->chan_width; @@ -17289,6 +17308,19 @@ static QDF_STATUS extract_dfs_radar_detection_event_tlv( radar_found->freq_offset = radar_event->freq_offset; radar_found->sidx = radar_event->sidx; + if (is_service_enabled_tlv(wmi_handle, + WMI_SERVICE_RADAR_FLAGS_SUPPORT)) { + WMI_RADAR_FLAGS *radar_flags; + + radar_flags = param_tlv->radar_flags; + if (radar_flags) { + radar_found->is_full_bw_nol = + WMI_RADAR_FLAGS_FULL_BW_NOL_GET(radar_flags->flags); + wmi_debug("Is full bw nol %d", + radar_found->is_full_bw_nol); + } + } + wmi_debug("processed radar found event pdev %d," "Radar Event Info:pdev_id %d,timestamp %d,chan_freq (dur) %d," "chan_width (RSSI) %d,detector_id (false_radar) %d," @@ -22765,6 +22797,8 @@ static void populate_tlv_service(uint32_t *wmi_service) #endif wmi_service[wmi_service_fisa_dynamic_msdu_aggr_size_support] = WMI_SERVICE_FISA_DYNAMIC_MSDU_AGGR_SIZE_SUPPORT; + wmi_service[wmi_service_radar_flags_support] = + WMI_SERVICE_RADAR_FLAGS_SUPPORT; } /**