Bläddra i källkod

qcacmn: Reduce the PRI threshold to detect w53 duplet pulses

So far the DFS algorithm detected only a train of single pulses and the
diff ts(PRI) which is the difference in time stamps between 2 consecutive
pulses, should be greater than a threshold DFS_INVALID_PRI_LIMIT of 100us.

When the diff ts is less than 100us, the radar queue gets reset. With the
updated w53 DFS specification for Japan country, new sets of duplets have
been introduced and the time interval between the 2 pulses in a single
duplet can be as low as 20us. Since, the diff ts threshold
DFS_INVALID_PRI_LIMIT is 100us, the duplets with a time interval less than
100us is not be detected.

Reduce the diff ts threshold DFS_INVALID_PRI_LIMIT to 15us for MKKN
DFS domain.

CRs-Fixed: 2656660
Change-Id: I67b8ebab80155a5bcefcaa33f5a8d75c30d2ef40
Vignesh U 5 år sedan
förälder
incheckning
70eb719dfe

+ 1 - 0
umac/dfs/core/src/dfs.h

@@ -1278,6 +1278,7 @@ struct wlan_dfs {
 	uint16_t       dfs_agile_rcac_freq_ucfg;
 	struct ch_params dfs_rcac_ch_params;
 #endif
+	uint16_t       dfs_lowest_pri_limit;
 };
 
 #if defined(QCA_SUPPORT_AGILE_DFS) || defined(ATH_SUPPORT_ZERO_CAC_DFS)

+ 6 - 0
umac/dfs/core/src/dfs_confirm_radar.h

@@ -25,6 +25,12 @@
 #include "dfs_internal.h"
 
 #define DFS_INVALID_PRI_LIMIT 100  /* should we use 135? */
+/* The time interval between two sucessive pulses
+ * in case of w53 chirp type can be as low as 50us.
+ * Experimentally the PRI limit was found to be as
+ * low as 15us.
+ */
+#define DFS_INVALID_PRI_LIMIT_MKKN 15
 #define FRAC_PRI_SCORE_ARRAY_SIZE 40
 
 /**

+ 6 - 0
umac/dfs/core/src/filtering/dfs_partial_offload_radar.c

@@ -437,6 +437,7 @@ void dfs_get_po_radars(struct wlan_dfs *dfs)
 		dfs_debug(dfs, WLAN_DEBUG_DFS_ALWAYS, "FCC domain");
 		rinfo.dfsdomain = DFS_FCC_DOMAIN;
 		dfs_assign_fcc_pulse_table(&rinfo, target_type, tx_ops);
+		dfs->dfs_lowest_pri_limit = DFS_INVALID_PRI_LIMIT;
 		break;
 	case DFS_CN_DOMAIN:
 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
@@ -452,6 +453,7 @@ void dfs_get_po_radars(struct wlan_dfs *dfs)
 		rinfo.numradars = QDF_ARRAY_SIZE(dfs_china_radars);
 		rinfo.b5pulses = NULL;
 		rinfo.numb5radars = 0;
+		dfs->dfs_lowest_pri_limit = DFS_INVALID_PRI_LIMIT;
 		break;
 	case DFS_ETSI_DOMAIN:
 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, "ETSI domain");
@@ -469,6 +471,7 @@ void dfs_get_po_radars(struct wlan_dfs *dfs)
 		}
 		rinfo.b5pulses = NULL;
 		rinfo.numb5radars = 0;
+		dfs->dfs_lowest_pri_limit = DFS_INVALID_PRI_LIMIT;
 		break;
 	case DFS_KR_DOMAIN:
 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
@@ -487,6 +490,7 @@ void dfs_get_po_radars(struct wlan_dfs *dfs)
 		rinfo.numradars = QDF_ARRAY_SIZE(dfs_korea_radars);
 		rinfo.b5pulses = NULL;
 		rinfo.numb5radars = 0;
+		dfs->dfs_lowest_pri_limit = DFS_INVALID_PRI_LIMIT;
 		break;
 	case DFS_MKKN_DOMAIN:
 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, "MKKN domain");
@@ -494,6 +498,7 @@ void dfs_get_po_radars(struct wlan_dfs *dfs)
 		rinfo.dfs_radars = dfs_mkk4_radars;
 		rinfo.numradars = QDF_ARRAY_SIZE(dfs_mkk4_radars);
 		dfs_assign_mkk_bin5_radars(&rinfo, target_type, tx_ops);
+		dfs->dfs_lowest_pri_limit = DFS_INVALID_PRI_LIMIT_MKKN;
 		break;
 	case DFS_MKK4_DOMAIN:
 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, "MKK4 domain");
@@ -501,6 +506,7 @@ void dfs_get_po_radars(struct wlan_dfs *dfs)
 		rinfo.dfs_radars = dfs_mkk4_radars;
 		rinfo.numradars = QDF_ARRAY_SIZE(dfs_mkk4_radars);
 		dfs_assign_mkk_bin5_radars(&rinfo, target_type, tx_ops);
+		dfs->dfs_lowest_pri_limit = DFS_INVALID_PRI_LIMIT;
 		break;
 	default:
 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, "UNINIT domain");

+ 2 - 2
umac/dfs/core/src/filtering/dfs_process_radarevent.c

@@ -298,7 +298,7 @@ static bool dfs_is_real_radar(struct wlan_dfs *dfs,
 			 * We do not give score to PRI that is lower then the
 			 * limit.
 			 */
-			if (search_bin < DFS_INVALID_PRI_LIMIT)
+			if (search_bin < dfs->dfs_lowest_pri_limit)
 				break;
 
 			/*
@@ -1248,7 +1248,7 @@ static inline void dfs_conditional_clear_delaylines(
 	 * false detects.
 	 */
 
-	if (diff_ts < DFS_INVALID_PRI_LIMIT) {
+	if (diff_ts < dfs->dfs_lowest_pri_limit) {
 		dfs->dfs_seq_num = 0;
 		dfs_reset_alldelaylines(dfs);
 		dfs_reset_radarq(dfs);