From 49a3bbbe288299ffd18c01925614e93ec47fdc00 Mon Sep 17 00:00:00 2001 From: Vignesh U Date: Tue, 10 Dec 2019 13:49:39 +0530 Subject: [PATCH] qcacmn: Add filters to the MKKN filter table The w53 updated pulses should be detected by the DFS algorithm. - Add new DFS filters to MKKN filter table. - Introduce duration margin check in confirm radar routine. Change-Id: Icf3fecb5c6027ba827cac05dbd43a1a55463209b CRs-Fixed: 2582300 --- .../src/filtering/dfs_partial_offload_radar.c | 13 +++++ .../src/filtering/dfs_process_radarevent.c | 47 +++++++++++++++++-- 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/umac/dfs/core/src/filtering/dfs_partial_offload_radar.c b/umac/dfs/core/src/filtering/dfs_partial_offload_radar.c index 662fbb5769..42eac0deab 100644 --- a/umac/dfs/core/src/filtering/dfs_partial_offload_radar.c +++ b/umac/dfs/core/src/filtering/dfs_partial_offload_radar.c @@ -104,6 +104,19 @@ static struct dfs_pulse dfs_mkkn_radars[] = { * New filters shall be added to this tables after proper testing * and verification. */ + /* constant PRF based */ + /* Type 1 */ + /* 0.8-5us, 200 300 PRF, 10 pulses */ + {10, 5, 200, 400, 0, 4, 5, 0, 8, 15, 0, 0, 2, 5, 0, 91}, + {10, 5, 400, 600, 0, 4, 5, 0, 8, 15, 0, 0, 2, 5, 0, 92}, + {10, 5, 600, 800, 0, 4, 5, 0, 8, 15, 0, 0, 2, 5, 0, 93}, + {10, 5, 800, 1000, 0, 4, 5, 0, 8, 15, 0, 0, 2, 5, 0, 94}, + /* {10, 5, 200, 1000, 0, 6, 5, 0, 8, 15, 0, 0, 2, 5, 33}, */ + + /* Type 2 */ + /* 0.8-15us, 200-1600 PRF, 15 pulses */ + {15, 15, 200, 1600, 0, 4, 8, 0, 18, 24, 0, 0, 0, 5, 0, 95}, + }; /** diff --git a/umac/dfs/core/src/filtering/dfs_process_radarevent.c b/umac/dfs/core/src/filtering/dfs_process_radarevent.c index d63b98db98..65ce054777 100644 --- a/umac/dfs/core/src/filtering/dfs_process_radarevent.c +++ b/umac/dfs/core/src/filtering/dfs_process_radarevent.c @@ -37,7 +37,8 @@ #define DFS_MAX_FREQ_SPREAD (1375 * 1) #define DFS_LARGE_PRI_MULTIPLIER 4 #define DFS_W53_DEFAULT_PRI_MULTIPLIER 2 -#define DFS_INVALID_PRI_LIMIT 100 /* should we use 135? */ +//#define DFS_INVALID_PRI_LIMIT 100 /* should we use 135? */ +#define DFS_INVALID_PRI_LIMIT 15 /* should we use 135? */ #define DFS_BIG_SIDX 10000 #define FRAC_PRI_SCORE_ARRAY_SIZE 40 @@ -137,6 +138,28 @@ static void dfs_print_radar_events(struct wlan_dfs *dfs) dfs->dfs_phyerr_freq_max = 0; } +/** + * dfs_get_durmargin() - Find duration margin + * @rf: Pointer to dfs_filter structure. + * @durmargin: Duration margin + */ +static inline void dfs_get_durmargin(struct dfs_filter *rf, + uint32_t *durmargin) +{ +#define DUR_THRESH 10 +#define LOW_MARGIN 4 +#define HIGH_MARGIN 6 + + if (rf->rf_maxdur < DUR_THRESH) + *durmargin = LOW_MARGIN; + else + *durmargin = HIGH_MARGIN; + +#undef DUR_THRESH +#undef LOW_MARGIN +#undef HIGH_MARGIN +} + /** * dfs_confirm_radar() - This function checks for fractional PRI and jitter in * sidx index to determine if the radar is real or not. @@ -163,6 +186,12 @@ static int dfs_confirm_radar(struct wlan_dfs *dfs, unsigned char max_score = 0; int max_score_index = 0; + uint32_t min_searchdur = 0xFFFFFFFF; + uint32_t max_searchdur = 0x0; + uint32_t durmargin = 0; + uint32_t this_dur; + uint32_t this_deltadur; + pl = dfs->pulses; OS_MEMZERO(scores, sizeof(scores)); @@ -170,6 +199,8 @@ static int dfs_confirm_radar(struct wlan_dfs *dfs, pri_margin = dfs_get_pri_margin(dfs, ext_chan_flag, (rf->rf_patterntype == 1)); + dfs_get_durmargin(rf, &durmargin); + /* * Look for the entry that matches dl_seq_num_second. @@ -181,6 +212,12 @@ static int dfs_confirm_radar(struct wlan_dfs *dfs, de = &dl->dl_elems[index]; if (dl->dl_seq_num_second == de->de_seq_num) target_ts = de->de_ts - de->de_time; + + if (de->de_dur < min_searchdur) + min_searchdur = de->de_dur; + + if (de->de_dur > max_searchdur) + max_searchdur = de->de_dur; } if (dfs->dfs_debug_mask & WLAN_DEBUG_DFS2) { @@ -226,6 +263,10 @@ static int dfs_confirm_radar(struct wlan_dfs *dfs, this_diff_ts = pl->pl_elems[next_index].p_time - pl->pl_elems[current_index].p_time; + this_dur = pl->pl_elems[next_index].p_dur; + this_deltadur = DFS_MIN(DFS_DIFF(this_dur, min_searchdur), + DFS_DIFF(this_dur, max_searchdur)); + /* Now update the score for this diff_ts */ for (i = 1; i < FRAC_PRI_SCORE_ARRAY_SIZE; i++) { search_bin = dl->dl_search_pri / (i + 1); @@ -242,8 +283,8 @@ static int dfs_confirm_radar(struct wlan_dfs *dfs, * search_bin +/- margin. */ if ((this_diff_ts >= (search_bin - pri_margin)) && - (this_diff_ts <= - (search_bin + pri_margin))) { + (this_diff_ts <= (search_bin + pri_margin)) && + (this_deltadur < durmargin)) { /*increment score */ scores[i]++; }