diff --git a/umac/dfs/core/src/dfs.h b/umac/dfs/core/src/dfs.h index 5596100a41f2..a4a7fc9b9312 100644 --- a/umac/dfs/core/src/dfs.h +++ b/umac/dfs/core/src/dfs.h @@ -884,6 +884,8 @@ struct dfs_event_log { #define MIN_DFS_SUBCHAN_BW 20 /* Minimum bandwidth of each subchannel. */ +#define FREQ_OFFSET_BOUNDARY_FOR_80MHZ 40 + /** * struct wlan_dfs - The main dfs structure. * @dfs_debug_mask: Current debug bitmask. @@ -920,6 +922,9 @@ struct dfs_event_log { * @wlan_dfswaittimer: Dfs wait timer. * @wlan_dfstesttimer: Dfs mute test timer. * @wlan_dfs_debug_timer: Dfs debug timer. + * @dfs_bangradar: Radar simulation on entire segment. + * @dfs_enh_bangradar: Radar (Chirp or non-chirp) simulation on + * particular frequency. * @dfs_second_segment_bangradar: Bangaradar on second segment of * VHT80_80/160. * @is_radar_found_on_secondary_seg: Radar on second segment. @@ -1069,6 +1074,7 @@ struct wlan_dfs { os_timer_t wlan_dfstesttimer; os_timer_t wlan_dfs_debug_timer; uint8_t dfs_bangradar; + bool dfs_enh_bangradar; bool dfs_second_segment_bangradar; bool is_radar_found_on_secondary_seg; bool dfs_radar_found_for_fo; diff --git a/umac/dfs/core/src/filtering/dfs_process_radarevent.c b/umac/dfs/core/src/filtering/dfs_process_radarevent.c index 435d855f7b79..97724715bcb0 100644 --- a/umac/dfs/core/src/filtering/dfs_process_radarevent.c +++ b/umac/dfs/core/src/filtering/dfs_process_radarevent.c @@ -588,13 +588,20 @@ static inline int dfs_handle_bangradar( int *retval) { - if (dfs->dfs_bangradar) { + if (dfs->dfs_enh_bangradar || dfs->dfs_bangradar) { /* - * Bangradar will always simulate radar found on the primary - * channel. - */ + * Bangradar will always simulate radar found on + * the primary channel. + * + * Enhanced Bangradar will save the params in dfs + * and simulate radar on given frequency + */ *rs = &dfs->dfs_radar[dfs->dfs_curchan_radindex]; - dfs_debug(dfs, WLAN_DEBUG_DFS, "bangradar"); + if (dfs->dfs_enh_bangradar) + *seg_id = dfs->dfs_seg_id; + dfs_debug(dfs, WLAN_DEBUG_DFS, + "bangradar %d, Enhanced Bangradar %d", + dfs->dfs_bangradar, dfs->dfs_enh_bangradar); *retval = 1; return 1; } diff --git a/umac/dfs/core/src/misc/dfs.c b/umac/dfs/core/src/misc/dfs.c index b362576f4416..cf5d4a936dc2 100644 --- a/umac/dfs/core/src/misc/dfs.c +++ b/umac/dfs/core/src/misc/dfs.c @@ -383,6 +383,13 @@ int dfs_control(struct wlan_dfs *dfs, bangradar_enh_params = (struct dfs_bangradar_enh_params *)indata; if (bangradar_enh_params) { + if (abs(bangradar_enh_params->freq_offset) > + FREQ_OFFSET_BOUNDARY_FOR_80MHZ) { + dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, + "Frequency Offset out of bound"); + error = -EINVAL; + break; + } dfs->dfs_seg_id = bangradar_enh_params->seg_id; dfs->dfs_is_chirp = bangradar_enh_params->is_chirp; dfs->dfs_freq_offset = @@ -393,7 +400,8 @@ int dfs_control(struct wlan_dfs *dfs, (dfs, SEG_ID_PRIMARY, &dfs_unit_test); } else { - dfs->dfs_bangradar = 1; + dfs->dfs_enh_bangradar = true; + dfs->dfs_bangradar = 0; error = dfs_start_host_based_bangradar(dfs); } } else { 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 51666a22fecc..50cea79f754c 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 @@ -561,6 +561,7 @@ static inline void dfs_reset_bangradar(struct wlan_dfs *dfs) { dfs->dfs_bangradar = 0; dfs->dfs_second_segment_bangradar = 0; + dfs->dfs_enh_bangradar = false; } /* dfs_prepare_nol_ie_bitmap: Create a Bitmap from the radar found subchannels