qcacmn: Find proper radar-found secondary frequency

Bring up a Hawkeye AP in ETSI domain in HT80_80 mode and enable preCAC
(preCACEn). When preCAC timer is running, if radar gets detected in the
secondary segment (which is DFS), radar found frequency gets computed
from "dfs_precac_secondary_freq" variable which does not get populated
for Lithium chipsets as "dfs_precac_secondary_freq" is specific to
legacy preCAC.

Since the secondary frequency gets assigned as 0, radar found offset gets
computed wrongly and channels are not added to NOL.

Ensure that "dfs_precac_secondary_freq" is used for secondary frequency
computation only for legacy chips. For chips that have a separate agile
radar detector engine, use "dfs_ch_vhtop_ch_freq_seg2" variable to
compute the secondary frequency.

CRs-Fixed: 2515454
Change-Id: Id1ec0c1500bf4df02a0fe52b4960141122da4f16
This commit is contained in:
Priyadarshnee S
2019-08-29 15:06:04 +05:30
committed by nshrivas
parent 46f2727365
commit ddb699577c
3 changed files with 27 additions and 8 deletions

View File

@@ -932,9 +932,13 @@ 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.
* @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.
* @dfs_precac_primary_freq: Primary freq.
* Applicable to only legacy chips.
* @dfs_precac_primary_freq: PreCAC Primary freq applicable only to
* legacy chips.
* @dfs_defer_precac_channel_change: Defer precac channel change.
* @dfs_precac_inter_chan: Intermediate non-DFS channel used while
* doing precac.

View File

@@ -69,6 +69,8 @@
#define DFS_CHIRP_OFFSET 10
/* second segment freq offset */
#define DFS_160MHZ_SECOND_SEG_OFFSET 40
/*Primary segment id is 0 */
#define PRIMARY_SEG 0
/* Frequency offset indices */
#define CENTER_CH 0

View File

@@ -330,20 +330,33 @@ dfs_compute_radar_found_cfreq(struct wlan_dfs *dfs,
uint32_t *freq_center)
{
struct dfs_channel *curchan = dfs->dfs_curchan;
/* Radar found on agile detector ID.
* Applicable to chips that have a separate agile radar detector
* engine.
*/
if (radar_found->detector_id == AGILE_DETECTOR_ID) {
*freq_center = utils_dfs_chan_to_freq(
dfs->dfs_agile_precac_freq);
} else if (!radar_found->segment_id) {
/* Radar found on primary segment by the HW. */
} else if (radar_found->segment_id == PRIMARY_SEG) {
*freq_center = utils_dfs_chan_to_freq(
curchan->dfs_ch_vhtop_ch_freq_seg1);
} else {
if (dfs_is_precac_timer_running(dfs)) {
/* Radar found on secondary segment by the HW when
* preCAC was running. It (dfs_precac_enable) is specific to
* legacy chips.
*/
if (dfs_is_precac_timer_running(dfs) &&
(dfs->dfs_precac_enable)) {
*freq_center = utils_dfs_chan_to_freq(
dfs->dfs_precac_secondary_freq);
} else {
*freq_center = utils_dfs_chan_to_freq(
curchan->dfs_ch_vhtop_ch_freq_seg2);
/* Radar found on secondary segment by the HW, when preCAC
* was not running in legacy chips or preCAC was running
* in Lithium chips.
*/
*freq_center = utils_dfs_chan_to_freq(
curchan->dfs_ch_vhtop_ch_freq_seg2);
if (WLAN_IS_CHAN_MODE_160(curchan)) {
/* If center frequency of entire 160 band
* is less than center frequency of primary
@@ -352,7 +365,7 @@ dfs_compute_radar_found_cfreq(struct wlan_dfs *dfs,
* frequency of entire 160 segment.
*/
if (curchan->dfs_ch_vhtop_ch_freq_seg2 <
curchan->dfs_ch_vhtop_ch_freq_seg1)
curchan->dfs_ch_vhtop_ch_freq_seg1)
*freq_center -=
DFS_160MHZ_SECOND_SEG_OFFSET;
else