diff --git a/spectral/dispatcher/inc/spectral_ioctl.h b/spectral/dispatcher/inc/spectral_ioctl.h index c654794fd8..1b57949678 100644 --- a/spectral/dispatcher/inc/spectral_ioctl.h +++ b/spectral/dispatcher/inc/spectral_ioctl.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2011, 2017-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -247,6 +248,7 @@ struct spectral_config_frequency { * struct spectral_config - spectral config parameters * @ss_fft_period: Skip interval for FFT reports * @ss_period: Spectral scan period + * @ss_recapture Set this to allow FFT recapture if scan period > 52us * @ss_count: # of reports to return from ss_active * @ss_short_report: Set to report only 1 set of FFT results * @radar_bin_thresh_sel: Select threshold to classify strong bin for FFT @@ -322,6 +324,7 @@ struct spectral_config_frequency { struct spectral_config { uint16_t ss_fft_period; uint16_t ss_period; + uint16_t ss_recapture; uint16_t ss_count; uint16_t ss_short_report; uint8_t radar_bin_thresh_sel; @@ -410,6 +413,8 @@ struct spectral_caps { #define MAX_NUM_DETECTORS (2) #define MAX_SPECTRAL_PAYLOAD (3028) +#define SPECTRAL_RECAPTURE_SCAN_PERIOD_THRESHOLD (52) + /** * enum dcs_int_type - Interference type indicated by DCS * @SPECTRAL_DCS_INT_NONE: No interference diff --git a/spectral/dispatcher/inc/wlan_spectral_public_structs.h b/spectral/dispatcher/inc/wlan_spectral_public_structs.h index be4ae9216d..b89c3ae3bc 100644 --- a/spectral/dispatcher/inc/wlan_spectral_public_structs.h +++ b/spectral/dispatcher/inc/wlan_spectral_public_structs.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2011,2017-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. * * * Permission to use, copy, modify, and/or distribute this software for @@ -89,6 +90,7 @@ #define SPECTRAL_SCAN_DBM_ADJ_DEFAULT (1) #define SPECTRAL_SCAN_CHN_MASK_DEFAULT (1) #define SPECTRAL_SCAN_FREQUENCY_DEFAULT (0) +#define SPECTRAL_FFT_RECAPTURE_DEFAULT (0) #endif /* SPECTRAL_USE_EMU_DEFAULTS */ /* The below two definitions apply only to pre-11ac chipsets */ diff --git a/target_if/spectral/target_if_spectral.c b/target_if/spectral/target_if_spectral.c index c059c1f242..7386a12875 100644 --- a/target_if/spectral/target_if_spectral.c +++ b/target_if/spectral/target_if_spectral.c @@ -518,6 +518,7 @@ target_if_send_vdev_spectral_configure_cmd(struct target_if_spectral *spectral, sparam.count = param->ss_count; sparam.period = param->ss_period; + sparam.fft_recap = param->ss_recapture; sparam.spectral_pri = param->ss_spectral_pri; sparam.fft_size = param->ss_fft_size; sparam.gc_enable = param->ss_gc_ena; @@ -883,6 +884,8 @@ target_if_spectral_info_init_defaults(struct target_if_spectral *spectral, info->osps_cache.osc_params.ss_period = SPECTRAL_SCAN_PERIOD_GEN_II_DEFAULT; + info->osps_cache.osc_params.ss_recapture = + SPECTRAL_FFT_RECAPTURE_DEFAULT; info->osps_cache.osc_params.ss_spectral_pri = SPECTRAL_SCAN_PRIORITY_DEFAULT; @@ -1011,10 +1014,11 @@ target_if_log_read_spectral_params( const char *function_name, struct spectral_config *pparam) { - spectral_debug("%s: TARGET_IF_SPECTRAL_INFO_PARAMS. Returning following params:\nss_count = %u\nss_period = %u\nss_spectral_pri = %u\nss_fft_size = %u\nss_gc_ena = %u\nss_restart_ena = %u\nss_noise_floor_ref = %d\nss_init_delay = %u\nss_nb_tone_thr = %u\nss_str_bin_thr = %u\nss_wb_rpt_mode = %u\nss_rssi_rpt_mode = %u\nss_rssi_thr = %d\nss_pwr_format = %u\nss_rpt_mode = %u\nss_bin_scale = %u\nss_dbm_adj = %u\nss_chn_mask = %u\nss_frequency1=%u\nss_frequency2=%u\n", + spectral_debug("%s: TARGET_IF_SPECTRAL_INFO_PARAMS. Returning following params:\nss_count = %u\nss_period = %u\nss_recapture = %u\nss_spectral_pri = %u\nss_fft_size = %u\nss_gc_ena = %u\nss_restart_ena = %u\nss_noise_floor_ref = %d\nss_init_delay = %u\nss_nb_tone_thr = %u\nss_str_bin_thr = %u\nss_wb_rpt_mode = %u\nss_rssi_rpt_mode = %u\nss_rssi_thr = %d\nss_pwr_format = %u\nss_rpt_mode = %u\nss_bin_scale = %u\nss_dbm_adj = %u\nss_chn_mask = %u\nss_frequency1=%u\nss_frequency2=%u\n", function_name, pparam->ss_count, pparam->ss_period, + pparam->ss_recapture, pparam->ss_spectral_pri, pparam->ss_fft_size, pparam->ss_gc_ena, @@ -1088,10 +1092,11 @@ target_if_log_read_spectral_params_catch_validate( const char *function_name, struct spectral_config *pparam) { - spectral_debug("%s: TARGET_IF_SPECTRAL_INFO_PARAMS on initial cache validation\nReturning following params:\nss_count = %u\nss_period = %u\nss_spectral_pri = %u\nss_fft_size = %u\nss_gc_ena = %u\nss_restart_ena = %u\nss_noise_floor_ref = %d\nss_init_delay = %u\nss_nb_tone_thr = %u\nss_str_bin_thr = %u\nss_wb_rpt_mode = %u\nss_rssi_rpt_mode = %u\nss_rssi_thr = %d\nss_pwr_format = %u\nss_rpt_mode = %u\nss_bin_scale = %u\nss_dbm_adj = %u\nss_chn_mask = %u", + spectral_debug("%s: TARGET_IF_SPECTRAL_INFO_PARAMS on initial cache validation\nReturning following params:\nss_count = %u\nss_period = %u\nss_recapture = %u\nss_spectral_pri = %u\nss_fft_size = %u\nss_gc_ena = %u\nss_restart_ena = %u\nss_noise_floor_ref = %d\nss_init_delay = %u\nss_nb_tone_thr = %u\nss_str_bin_thr = %u\nss_wb_rpt_mode = %u\nss_rssi_rpt_mode = %u\nss_rssi_thr = %d\nss_pwr_format = %u\nss_rpt_mode = %u\nss_bin_scale = %u\nss_dbm_adj = %u\nss_chn_mask = %u", function_name, pparam->ss_count, pparam->ss_period, + pparam->ss_recapture, pparam->ss_spectral_pri, pparam->ss_fft_size, pparam->ss_gc_ena, @@ -1334,10 +1339,11 @@ target_if_log_write_spectral_params( const char *function_name, int ret) { - spectral_debug("%s: TARGET_IF_SPECTRAL_INFO_PARAMS. Params:\nss_count = %u\nss_period = %u\nss_spectral_pri = %u\nss_fft_size = %u\nss_gc_ena = %u\nss_restart_ena = %u\nss_noise_floor_ref = %d\nss_init_delay = %u\nss_nb_tone_thr = %u\nss_str_bin_thr = %u\nss_wb_rpt_mode = %u\nss_rssi_rpt_mode = %u\nss_rssi_thr = %d\nss_pwr_format = %u\nss_rpt_mode = %u\nss_bin_scale = %u\nss_dbm_adj = %u\nss_chn_mask = %u\nss_frequency1=%u\nss_frequency2=%u\nstatus = %d", + spectral_debug("%s: TARGET_IF_SPECTRAL_INFO_PARAMS. Params:\nss_count = %u\nss_period = %u\nss_recapture = %u\nss_spectral_pri = %u\nss_fft_size = %u\nss_gc_ena = %u\nss_restart_ena = %u\nss_noise_floor_ref = %d\nss_init_delay = %u\nss_nb_tone_thr = %u\nss_str_bin_thr = %u\nss_wb_rpt_mode = %u\nss_rssi_rpt_mode = %u\nss_rssi_thr = %d\nss_pwr_format = %u\nss_rpt_mode = %u\nss_bin_scale = %u\nss_dbm_adj = %u\nss_chn_mask = %u\nss_frequency1=%u\nss_frequency2=%u\nstatus = %d", function_name, param->ss_count, param->ss_period, + param->ss_recapture, param->ss_spectral_pri, param->ss_fft_size, param->ss_gc_ena, @@ -1769,6 +1775,17 @@ target_if_sops_stop_spectral_scan(void *arg, enum spectral_scan_mode smode) p_sops->configure_spectral(spectral, sparams, smode); } + if (ret == 0 && smode == SPECTRAL_SCAN_MODE_NORMAL) { + struct target_if_spectral_ops *p_sops; + struct spectral_config *sparams; + + p_sops = GET_TARGET_IF_SPECTRAL_OPS(spectral); + sparams = &spectral->params[smode]; + sparams->ss_recapture = false; + + p_sops->configure_spectral(spectral, sparams, smode); + } + return ret; } @@ -4414,6 +4431,12 @@ _target_if_set_spectral_config(struct target_if_spectral *spectral, break; case SPECTRAL_PARAM_SCAN_PERIOD: sparams->ss_period = param->value; + if ((sparams->ss_period >= + SPECTRAL_RECAPTURE_SCAN_PERIOD_THRESHOLD) && + (smode == SPECTRAL_SCAN_MODE_NORMAL)) + sparams->ss_recapture = true; + else + sparams->ss_recapture = false; break; case SPECTRAL_PARAM_SCAN_COUNT: sparams->ss_count = param->value; diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index ad7d06dee3..b86ca7ccfe 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -2950,6 +2950,7 @@ struct smart_ant_enable_tx_feedback_params { * @vdev_id: VDEV id * @count: count * @period: period + * @fft_recap: FFT recapture enable/disable * @spectral_pri: Spectral priority * @fft_size: FFT size * @gc_enable: GC enable @@ -2976,6 +2977,7 @@ struct vdev_spectral_configure_params { uint8_t vdev_id; uint16_t count; uint16_t period; + uint16_t fft_recap; uint16_t spectral_pri; uint16_t fft_size; uint16_t gc_enable; diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 7fdc6225c7..e09d1001b9 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -7179,6 +7179,7 @@ static QDF_STATUS send_vdev_spectral_configure_cmd_tlv(wmi_unified_t wmi_handle, cmd->spectral_scan_center_freq1 = param->center_freq1; cmd->spectral_scan_center_freq2 = param->center_freq2; cmd->spectral_scan_chan_width = param->chan_width; + cmd->recapture_sample_on_gain_change = param->fft_recap; /* Not used, fill with zeros */ cmd->spectral_scan_chan_freq = 0; @@ -7196,6 +7197,7 @@ static QDF_STATUS send_vdev_spectral_configure_cmd_tlv(wmi_unified_t wmi_handle, param->vdev_id, param->count); wmi_debug("spectral_scan_period: %u spectral_scan_priority: %u", param->period, param->spectral_pri); + wmi_debug("spectral_fft_recapture_cap: %u", param->fft_recap); wmi_debug("spectral_scan_fft_size: %u spectral_scan_gc_ena: %u", param->fft_size, param->gc_enable); wmi_debug("spectral_scan_restart_ena: %u", param->restart_enable);