diff --git a/target_if/spectral/target_if_spectral.c b/target_if/spectral/target_if_spectral.c index c42c981621..8ff1a54994 100644 --- a/target_if/spectral/target_if_spectral.c +++ b/target_if/spectral/target_if_spectral.c @@ -2232,9 +2232,13 @@ target_if_populate_supported_sscan_bws_be(struct target_if_spectral *spectral) supported_bws = &spectral->supported_bws [SPECTRAL_SCAN_MODE_NORMAL][op_bw]; supported_bws->bandwidths |= 1 << get_supported_sscan_bw_pos(op_bw); + spectral->supported_sscan_bw_list + [SPECTRAL_SCAN_MODE_NORMAL][op_bw] = true; supported_bws = &spectral->supported_bws [SPECTRAL_SCAN_MODE_AGILE][op_bw]; supported_bws->bandwidths |= 1 << get_supported_sscan_bw_pos(op_bw); + spectral->supported_sscan_bw_list + [SPECTRAL_SCAN_MODE_AGILE][op_bw] = true; for (op_bw = CH_WIDTH_40MHZ; op_bw < CH_WIDTH_MAX; op_bw++) { bool is_supported; @@ -2257,17 +2261,24 @@ target_if_populate_supported_sscan_bws_be(struct target_if_spectral *spectral) [SPECTRAL_SCAN_MODE_NORMAL][op_bw]; supported_bws->bandwidths |= 1 << get_supported_sscan_bw_pos(op_bw); + spectral->supported_sscan_bw_list + [SPECTRAL_SCAN_MODE_NORMAL][op_bw] = true; /* Agile mode */ supported_bws = &spectral->supported_bws [SPECTRAL_SCAN_MODE_AGILE][op_bw]; supported_bws->bandwidths |= 1 << get_supported_sscan_bw_pos(op_bw); + spectral->supported_sscan_bw_list + [SPECTRAL_SCAN_MODE_AGILE][op_bw] = true; half_op_bw = target_if_get_half_bandwidth(op_bw); - if (half_op_bw != CH_WIDTH_INVALID) + if (half_op_bw != CH_WIDTH_INVALID) { supported_bws->bandwidths |= 1 << get_supported_sscan_bw_pos(half_op_bw); + spectral->supported_sscan_bw_list + [SPECTRAL_SCAN_MODE_AGILE][half_op_bw] = true; + } } return QDF_STATUS_SUCCESS; @@ -2327,10 +2338,14 @@ target_if_populate_supported_sscan_bws(struct target_if_spectral *spectral, * If fragmentation is supported, then only 80Hz * agile width is supported */ - if (spectral->rparams.fragmentation_160[smode]) + if (spectral->rparams. + fragmentation_160[smode]) { supported_bws->bandwidths |= 1 << get_supported_sscan_bw_pos( CH_WIDTH_80MHZ); + spectral->supported_sscan_bw_list + [smode][CH_WIDTH_80MHZ] = true; + } /** * If restricted 80p80 is supported, then both @@ -2343,15 +2358,23 @@ target_if_populate_supported_sscan_bws(struct target_if_spectral *spectral, supported_bws->bandwidths |= 1 << get_supported_sscan_bw_pos( CH_WIDTH_160MHZ); - if (op_bw == CH_WIDTH_160MHZ) + spectral->supported_sscan_bw_list + [smode][CH_WIDTH_160MHZ] = true; + + if (op_bw == CH_WIDTH_160MHZ) { supported_bws->bandwidths |= 1 << get_supported_sscan_bw_pos( CH_WIDTH_80P80MHZ); + spectral->supported_sscan_bw_list + [smode][CH_WIDTH_80P80MHZ] = true; + } } } else { supported_bws->bandwidths |= 1 << get_supported_sscan_bw_pos( op_bw); + spectral->supported_sscan_bw_list + [smode][op_bw] = true; } } } @@ -3087,7 +3110,6 @@ target_if_spectral_report_params_init( smode = SPECTRAL_SCAN_MODE_NORMAL; for (; smode < SPECTRAL_SCAN_MODE_MAX; smode++) rparams->fragmentation_160[smode] = false; - rparams->max_agile_ch_width = CH_WIDTH_80P80MHZ; } else { rparams->version = SPECTRAL_REPORT_FORMAT_VERSION_1; rparams->num_spectral_detectors = @@ -3095,7 +3117,6 @@ target_if_spectral_report_params_init( smode = SPECTRAL_SCAN_MODE_NORMAL; for (; smode < SPECTRAL_SCAN_MODE_MAX; smode++) rparams->fragmentation_160[smode] = true; - rparams->max_agile_ch_width = CH_WIDTH_80MHZ; } switch (rparams->version) { @@ -3391,7 +3412,7 @@ target_if_spectral_detector_list_init(struct target_if_spectral *spectral) * always be pri80 detector, and second detector for sec80. */ ch_width = CH_WIDTH_20MHZ; - for (; ch_width <= CH_WIDTH_80P80MHZ; ch_width++) { + for (; ch_width < CH_WIDTH_MAX; ch_width++) { /* Normal spectral scan */ smode = SPECTRAL_SCAN_MODE_NORMAL; spectral_debug("is_hw_mode_sbs: %d is_using_phya1:%d", @@ -3399,6 +3420,9 @@ target_if_spectral_detector_list_init(struct target_if_spectral *spectral) qdf_spin_lock_bh(&spectral->detector_list_lock); + if (!spectral->supported_sscan_bw_list[smode][ch_width]) + goto agile_handling; + det_list = &spectral->detector_list[smode][ch_width]; det_list->num_detectors = 1; @@ -3413,26 +3437,22 @@ target_if_spectral_detector_list_init(struct target_if_spectral *spectral) det_list->detectors[1] = SPECTRAL_DETECTOR_ID_1; } +agile_handling: /* Agile spectral scan */ smode = SPECTRAL_SCAN_MODE_AGILE; + if (!spectral->supported_sscan_bw_list[smode][ch_width]) { + qdf_spin_unlock_bh(&spectral->detector_list_lock); + continue; + } + det_list = &spectral->detector_list[smode][ch_width]; det_list->num_detectors = 1; - if (spectral->rparams.fragmentation_160[smode]) { - /** - * Skip to next iteration if 160/80p80 MHz for Agile - * scan. Only 20/40/80 MHz is supported on platforms - * with fragmentation, as only 1 detector is available. - */ - if (is_ch_width_160_or_80p80(ch_width)) { - qdf_spin_unlock_bh( - &spectral->detector_list_lock); - continue; - } + if (spectral->rparams.fragmentation_160[smode]) det_list->detectors[0] = SPECTRAL_DETECTOR_ID_2; - } else { + else det_list->detectors[0] = SPECTRAL_DETECTOR_ID_1; - } + qdf_spin_unlock_bh(&spectral->detector_list_lock); } diff --git a/target_if/spectral/target_if_spectral.h b/target_if/spectral/target_if_spectral.h index 6b8f207964..c245daa783 100644 --- a/target_if/spectral/target_if_spectral.h +++ b/target_if/spectral/target_if_spectral.h @@ -603,7 +603,6 @@ struct spectral_fft_bin_len_adj_swar { * of FFT bins. * @fragmentation_160: This indicates whether Spectral reports in 160/80p80 is * fragmented. - * @max_agile_ch_width: Maximum agile BW supported by the target * @detid_mode_table: Detector ID to Spectral scan mode table * @num_spectral_detectors: Total number of Spectral detectors * @marker: Describes the boundaries of pri80, 5 MHz and sec80 bins @@ -613,7 +612,6 @@ struct spectral_report_params { uint8_t ssumaary_padding_bytes; uint8_t fft_report_hdr_len; bool fragmentation_160[SPECTRAL_SCAN_MODE_MAX]; - enum phy_ch_width max_agile_ch_width; enum spectral_scan_mode detid_mode_table[SPECTRAL_DETECTOR_ID_MAX]; uint8_t num_spectral_detectors; struct spectral_fft_bin_markers_160_165mhz @@ -1225,6 +1223,7 @@ int get_supported_sscan_bw_pos(enum phy_ch_width sscan_bw); * @session_report_info_lock: Lock to synchronize access to session report info * @supported_bws: Supported sscan bandwidths for all sscan modes and * operating widths + * @supported_sscan_bw_list: List of supported sscan widths for all sscan modes */ struct target_if_spectral { struct wlan_objmgr_pdev *pdev_obj; @@ -1356,6 +1355,8 @@ struct target_if_spectral { qdf_spinlock_t session_report_info_lock; struct spectral_supported_bws supported_bws[SPECTRAL_SCAN_MODE_MAX][CH_WIDTH_MAX]; + /* Whether a given sscan BW is supported on a given smode */ + bool supported_sscan_bw_list[SPECTRAL_SCAN_MODE_MAX][CH_WIDTH_MAX]; }; /**