xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8821cs/hal/phydm/phydm_dfs.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /******************************************************************************
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * Copyright(c) 2007 - 2017  Realtek Corporation.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * This program is free software; you can redistribute it and/or modify it
6*4882a593Smuzhiyun  * under the terms of version 2 of the GNU General Public License as
7*4882a593Smuzhiyun  * published by the Free Software Foundation.
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * This program is distributed in the hope that it will be useful, but WITHOUT
10*4882a593Smuzhiyun  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11*4882a593Smuzhiyun  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
12*4882a593Smuzhiyun  * more details.
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  * The full GNU General Public License is included in this distribution in the
15*4882a593Smuzhiyun  * file called LICENSE.
16*4882a593Smuzhiyun  *
17*4882a593Smuzhiyun  * Contact Information:
18*4882a593Smuzhiyun  * wlanfae <wlanfae@realtek.com>
19*4882a593Smuzhiyun  * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20*4882a593Smuzhiyun  * Hsinchu 300, Taiwan.
21*4882a593Smuzhiyun  *
22*4882a593Smuzhiyun  * Larry Finger <Larry.Finger@lwfinger.net>
23*4882a593Smuzhiyun  *
24*4882a593Smuzhiyun  *****************************************************************************/
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun /*@
27*4882a593Smuzhiyun  * ============================================================
28*4882a593Smuzhiyun  * include files
29*4882a593Smuzhiyun  * ============================================================
30*4882a593Smuzhiyun  */
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #include "mp_precomp.h"
33*4882a593Smuzhiyun #include "phydm_precomp.h"
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun #if defined(CONFIG_PHYDM_DFS_MASTER)
36*4882a593Smuzhiyun 
phydm_dfs_is_meteorology_channel(void * dm_void)37*4882a593Smuzhiyun boolean phydm_dfs_is_meteorology_channel(void *dm_void)
38*4882a593Smuzhiyun {
39*4882a593Smuzhiyun 	struct dm_struct *dm = (struct dm_struct *)dm_void;
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun 	u8 ch = *dm->channel;
42*4882a593Smuzhiyun 	u8 bw = *dm->band_width;
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun 	return ((bw  == CHANNEL_WIDTH_80 && (ch) >= 116 && (ch) <= 128) ||
45*4882a593Smuzhiyun 		(bw  == CHANNEL_WIDTH_40 && (ch) >= 116 && (ch) <= 128) ||
46*4882a593Smuzhiyun 		(bw  == CHANNEL_WIDTH_20 && (ch) >= 120 && (ch) <= 128));
47*4882a593Smuzhiyun }
48*4882a593Smuzhiyun 
phydm_dfs_segment_distinguish(void * dm_void,enum rf_syn syn_path)49*4882a593Smuzhiyun void phydm_dfs_segment_distinguish(void *dm_void, enum rf_syn syn_path)
50*4882a593Smuzhiyun {
51*4882a593Smuzhiyun 	struct dm_struct *dm = (struct dm_struct *)dm_void;
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun 	if (!(dm->support_ic_type & (ODM_RTL8814B | ODM_RTL8814C)))
54*4882a593Smuzhiyun 		return;
55*4882a593Smuzhiyun 	if (syn_path == RF_SYN1)
56*4882a593Smuzhiyun 		dm->seg1_dfs_flag = 1;
57*4882a593Smuzhiyun 	else
58*4882a593Smuzhiyun 		dm->seg1_dfs_flag = 0;
59*4882a593Smuzhiyun }
60*4882a593Smuzhiyun 
phydm_dfs_segment_flag_reset(void * dm_void)61*4882a593Smuzhiyun void phydm_dfs_segment_flag_reset(void *dm_void)
62*4882a593Smuzhiyun {
63*4882a593Smuzhiyun 	struct dm_struct *dm = (struct dm_struct *)dm_void;
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun 	if (!(dm->support_ic_type & (ODM_RTL8814B | ODM_RTL8814C)))
66*4882a593Smuzhiyun 		return;
67*4882a593Smuzhiyun 	if (dm->seg1_dfs_flag)
68*4882a593Smuzhiyun 		dm->seg1_dfs_flag = 0;
69*4882a593Smuzhiyun }
70*4882a593Smuzhiyun 
phydm_radar_detect_reset(void * dm_void)71*4882a593Smuzhiyun void phydm_radar_detect_reset(void *dm_void)
72*4882a593Smuzhiyun {
73*4882a593Smuzhiyun 	struct dm_struct *dm = (struct dm_struct *)dm_void;
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun 	if (dm->support_ic_type & (ODM_RTL8198F | ODM_RTL8822C | ODM_RTL8812F |
76*4882a593Smuzhiyun 				   ODM_RTL8197G | ODM_RTL8723F)) {
77*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xa40, BIT(15), 0);
78*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xa40, BIT(15), 1);
79*4882a593Smuzhiyun 	#if (RTL8721D_SUPPORT)
80*4882a593Smuzhiyun 	} else if (dm->support_ic_type & (ODM_RTL8721D)) {
81*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xf58, BIT(29), 0);
82*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xf58, BIT(29), 1);
83*4882a593Smuzhiyun 	#endif
84*4882a593Smuzhiyun 	} else if (dm->support_ic_type & (ODM_RTL8814B | ODM_RTL8814C)) {
85*4882a593Smuzhiyun 		if (dm->seg1_dfs_flag == 1) {
86*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa6c, BIT(0), 0);
87*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa6c, BIT(0), 1);
88*4882a593Smuzhiyun 			return;
89*4882a593Smuzhiyun 		}
90*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xa40, BIT(15), 0);
91*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xa40, BIT(15), 1);
92*4882a593Smuzhiyun 	} else {
93*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0x924, BIT(15), 0);
94*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0x924, BIT(15), 1);
95*4882a593Smuzhiyun 	}
96*4882a593Smuzhiyun }
97*4882a593Smuzhiyun 
phydm_radar_detect_disable(void * dm_void)98*4882a593Smuzhiyun void phydm_radar_detect_disable(void *dm_void)
99*4882a593Smuzhiyun {
100*4882a593Smuzhiyun 	struct dm_struct *dm = (struct dm_struct *)dm_void;
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun 	if (dm->support_ic_type & (ODM_RTL8198F | ODM_RTL8822C | ODM_RTL8812F |
103*4882a593Smuzhiyun 				   ODM_RTL8197G | ODM_RTL8723F))
104*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xa40, BIT(15), 0);
105*4882a593Smuzhiyun 	else if (dm->support_ic_type & (ODM_RTL8814B | ODM_RTL8814C)) {
106*4882a593Smuzhiyun 		if (dm->seg1_dfs_flag == 1) {
107*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa6c, BIT(0), 0);
108*4882a593Smuzhiyun 			dm->seg1_dfs_flag = 0;
109*4882a593Smuzhiyun 			return;
110*4882a593Smuzhiyun 		}
111*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xa40, BIT(15), 0);
112*4882a593Smuzhiyun 	}
113*4882a593Smuzhiyun 	#if (RTL8721D_SUPPORT)
114*4882a593Smuzhiyun 	else if (dm->support_ic_type & (ODM_RTL8721D))
115*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xf58, BIT(29), 0);
116*4882a593Smuzhiyun 	#endif
117*4882a593Smuzhiyun 	else
118*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0x924, BIT(15), 0);
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun 	PHYDM_DBG(dm, DBG_DFS, "\n");
121*4882a593Smuzhiyun }
122*4882a593Smuzhiyun 
phydm_radar_detect_with_dbg_parm(void * dm_void)123*4882a593Smuzhiyun static void phydm_radar_detect_with_dbg_parm(void *dm_void)
124*4882a593Smuzhiyun {
125*4882a593Smuzhiyun 	struct dm_struct *dm = (struct dm_struct *)dm_void;
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun 	if (dm->support_ic_type & ODM_RTL8721D) {
128*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xf54, MASKDWORD,
129*4882a593Smuzhiyun 			       dm->radar_detect_reg_f54);
130*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xf58, MASKDWORD,
131*4882a593Smuzhiyun 			       dm->radar_detect_reg_f58);
132*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xf5c, MASKDWORD,
133*4882a593Smuzhiyun 			       dm->radar_detect_reg_f5c);
134*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xf70, MASKDWORD,
135*4882a593Smuzhiyun 			       dm->radar_detect_reg_f70);
136*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xf74, MASKDWORD,
137*4882a593Smuzhiyun 			       dm->radar_detect_reg_f74);
138*4882a593Smuzhiyun 	} else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
139*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xa40, MASKDWORD,
140*4882a593Smuzhiyun 			       dm->radar_detect_reg_a40);
141*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xa44, MASKDWORD,
142*4882a593Smuzhiyun 			       dm->radar_detect_reg_a44);
143*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xa48, MASKDWORD,
144*4882a593Smuzhiyun 			       dm->radar_detect_reg_a48);
145*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xa4c, MASKDWORD,
146*4882a593Smuzhiyun 			       dm->radar_detect_reg_a4c);
147*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xa50, MASKDWORD,
148*4882a593Smuzhiyun 			       dm->radar_detect_reg_a50);
149*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xa54, MASKDWORD,
150*4882a593Smuzhiyun 			       dm->radar_detect_reg_a54);
151*4882a593Smuzhiyun 	} else {
152*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0x918, MASKDWORD,
153*4882a593Smuzhiyun 			       dm->radar_detect_reg_918);
154*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0x91c, MASKDWORD,
155*4882a593Smuzhiyun 			       dm->radar_detect_reg_91c);
156*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0x920, MASKDWORD,
157*4882a593Smuzhiyun 			       dm->radar_detect_reg_920);
158*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0x924, MASKDWORD,
159*4882a593Smuzhiyun 			       dm->radar_detect_reg_924);
160*4882a593Smuzhiyun 	}
161*4882a593Smuzhiyun }
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun /* @Init radar detection parameters, called after ch, bw is set */
164*4882a593Smuzhiyun 
phydm_radar_detect_enable(void * dm_void)165*4882a593Smuzhiyun void phydm_radar_detect_enable(void *dm_void)
166*4882a593Smuzhiyun {
167*4882a593Smuzhiyun 	struct dm_struct *dm = (struct dm_struct *)dm_void;
168*4882a593Smuzhiyun 	struct _DFS_STATISTICS *dfs = &dm->dfs;
169*4882a593Smuzhiyun 	u8 region_domain = dm->dfs_region_domain;
170*4882a593Smuzhiyun 	u8 c_channel = *dm->channel;
171*4882a593Smuzhiyun 	u8 band_width = *dm->band_width;
172*4882a593Smuzhiyun 	u8 enable = 0, i;
173*4882a593Smuzhiyun 	u8 short_pw_upperbound = 0;
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun 	PHYDM_DBG(dm, DBG_DFS, "test, region_domain = %d\n", region_domain);
176*4882a593Smuzhiyun 	if (region_domain == PHYDM_DFS_DOMAIN_UNKNOWN) {
177*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "PHYDM_DFS_DOMAIN_UNKNOWN\n");
178*4882a593Smuzhiyun 		goto exit;
179*4882a593Smuzhiyun 	}
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun 	if (dm->support_ic_type & (ODM_RTL8821 | ODM_RTL8812 | ODM_RTL8881A)) {
182*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0x814, 0x3fffffff, 0x04cc4d10);
183*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0x834, MASKBYTE0, 0x06);
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun 		if (dm->radar_detect_dbg_parm_en) {
186*4882a593Smuzhiyun 			phydm_radar_detect_with_dbg_parm(dm);
187*4882a593Smuzhiyun 			enable = 1;
188*4882a593Smuzhiyun 			goto exit;
189*4882a593Smuzhiyun 		}
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun 		if (region_domain == PHYDM_DFS_DOMAIN_ETSI) {
192*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x918, MASKDWORD, 0x1c17ecdf);
193*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x924, MASKDWORD, 0x01528500);
194*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x91c, MASKDWORD, 0x0fa21a20);
195*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x920, MASKDWORD, 0xe0f69204);
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun 		} else if (region_domain == PHYDM_DFS_DOMAIN_MKK) {
198*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x924, MASKDWORD, 0x01528500);
199*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x920, MASKDWORD, 0xe0d67234);
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun 			if (c_channel >= 52 && c_channel <= 64) {
202*4882a593Smuzhiyun 				odm_set_bb_reg(dm, R_0x918, MASKDWORD,
203*4882a593Smuzhiyun 					       0x1c16ecdf);
204*4882a593Smuzhiyun 				odm_set_bb_reg(dm, R_0x91c, MASKDWORD,
205*4882a593Smuzhiyun 					       0x0f141a20);
206*4882a593Smuzhiyun 			} else {
207*4882a593Smuzhiyun 				odm_set_bb_reg(dm, R_0x918, MASKDWORD,
208*4882a593Smuzhiyun 					       0x1c16acdf);
209*4882a593Smuzhiyun 				if (band_width == CHANNEL_WIDTH_20)
210*4882a593Smuzhiyun 					odm_set_bb_reg(dm, R_0x91c, MASKDWORD,
211*4882a593Smuzhiyun 						       0x64721a20);
212*4882a593Smuzhiyun 				else
213*4882a593Smuzhiyun 					odm_set_bb_reg(dm, R_0x91c, MASKDWORD,
214*4882a593Smuzhiyun 						       0x68721a20);
215*4882a593Smuzhiyun 			}
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun 		} else if (region_domain == PHYDM_DFS_DOMAIN_FCC) {
218*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x918, MASKDWORD, 0x1c16acdf);
219*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x924, MASKDWORD, 0x01528500);
220*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x920, MASKDWORD, 0xe0d67231);
221*4882a593Smuzhiyun 			if (band_width == CHANNEL_WIDTH_20)
222*4882a593Smuzhiyun 				odm_set_bb_reg(dm, R_0x91c, MASKDWORD,
223*4882a593Smuzhiyun 					       0x64741a20);
224*4882a593Smuzhiyun 			else
225*4882a593Smuzhiyun 				odm_set_bb_reg(dm, R_0x91c, MASKDWORD,
226*4882a593Smuzhiyun 					       0x68741a20);
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun 		} else {
229*4882a593Smuzhiyun 			/* not supported */
230*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS,
231*4882a593Smuzhiyun 				  "Unsupported dfs_region_domain:%d\n",
232*4882a593Smuzhiyun 				  region_domain);
233*4882a593Smuzhiyun 			goto exit;
234*4882a593Smuzhiyun 		}
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun 	} else if (dm->support_ic_type &
237*4882a593Smuzhiyun 		   (ODM_RTL8814A | ODM_RTL8822B | ODM_RTL8821C)) {
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0x814, 0x3fffffff, 0x04cc4d10);
240*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0x834, MASKBYTE0, 0x06);
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun 		/* @8822B only, when BW = 20M, DFIR output is 40Mhz,
243*4882a593Smuzhiyun 		 * but DFS input is 80MMHz, so it need to upgrade to 80MHz
244*4882a593Smuzhiyun 		 */
245*4882a593Smuzhiyun 		if (dm->support_ic_type & (ODM_RTL8822B | ODM_RTL8821C)) {
246*4882a593Smuzhiyun 			if (band_width == CHANNEL_WIDTH_20)
247*4882a593Smuzhiyun 				odm_set_bb_reg(dm, R_0x1984, BIT(26), 1);
248*4882a593Smuzhiyun 			else
249*4882a593Smuzhiyun 				odm_set_bb_reg(dm, R_0x1984, BIT(26), 0);
250*4882a593Smuzhiyun 		}
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun 		if (dm->radar_detect_dbg_parm_en) {
253*4882a593Smuzhiyun 			phydm_radar_detect_with_dbg_parm(dm);
254*4882a593Smuzhiyun 			enable = 1;
255*4882a593Smuzhiyun 			goto exit;
256*4882a593Smuzhiyun 		}
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun 		if (region_domain == PHYDM_DFS_DOMAIN_ETSI) {
259*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x918, MASKDWORD, 0x1c16acdf);
260*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x924, MASKDWORD, 0x095a8500);
261*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x91c, MASKDWORD, 0x0fc01a1f);
262*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x920, MASKDWORD, 0xe0f57204);
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun 		} else if (region_domain == PHYDM_DFS_DOMAIN_MKK) {
265*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x924, MASKDWORD, 0x095a8500);
266*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x920, MASKDWORD, 0xe0d67234);
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun 			if (c_channel >= 52 && c_channel <= 64) {
269*4882a593Smuzhiyun 				odm_set_bb_reg(dm, R_0x918, MASKDWORD,
270*4882a593Smuzhiyun 					       0x1c16ecdf);
271*4882a593Smuzhiyun 				odm_set_bb_reg(dm, R_0x91c, MASKDWORD,
272*4882a593Smuzhiyun 					       0x0f141a1f);
273*4882a593Smuzhiyun 			} else {
274*4882a593Smuzhiyun 				odm_set_bb_reg(dm, R_0x918, MASKDWORD,
275*4882a593Smuzhiyun 					       0x1c166cdf);
276*4882a593Smuzhiyun 				if (band_width == CHANNEL_WIDTH_20)
277*4882a593Smuzhiyun 					odm_set_bb_reg(dm, R_0x91c, MASKDWORD,
278*4882a593Smuzhiyun 						       0x64721a1f);
279*4882a593Smuzhiyun 				else
280*4882a593Smuzhiyun 					odm_set_bb_reg(dm, R_0x91c, MASKDWORD,
281*4882a593Smuzhiyun 						       0x68721a1f);
282*4882a593Smuzhiyun 			}
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun 		} else if (region_domain == PHYDM_DFS_DOMAIN_FCC) {
285*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x918, MASKDWORD, 0x1c176cdf);
286*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x924, MASKDWORD, 0x095a8400);
287*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x920, MASKDWORD, 0xe076d231);
288*4882a593Smuzhiyun 			if (band_width == CHANNEL_WIDTH_20)
289*4882a593Smuzhiyun 				odm_set_bb_reg(dm, R_0x91c, MASKDWORD,
290*4882a593Smuzhiyun 					       0x64901a1f);
291*4882a593Smuzhiyun 			else
292*4882a593Smuzhiyun 				odm_set_bb_reg(dm, R_0x91c, MASKDWORD,
293*4882a593Smuzhiyun 					       0x62901a1f);
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun 		} else {
296*4882a593Smuzhiyun 			/* not supported */
297*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS,
298*4882a593Smuzhiyun 				  "Unsupported dfs_region_domain:%d\n",
299*4882a593Smuzhiyun 				  region_domain);
300*4882a593Smuzhiyun 			goto exit;
301*4882a593Smuzhiyun 		}
302*4882a593Smuzhiyun 		/*RXHP low corner will extend the pulse width,
303*4882a593Smuzhiyun 		 *so we need to increase the upper bound.
304*4882a593Smuzhiyun 		 */
305*4882a593Smuzhiyun 		if (dm->support_ic_type & (ODM_RTL8822B | ODM_RTL8821C)) {
306*4882a593Smuzhiyun 			if (odm_get_bb_reg(dm, 0x8d8,
307*4882a593Smuzhiyun 					   BIT28 | BIT27 | BIT26) == 0) {
308*4882a593Smuzhiyun 				short_pw_upperbound =
309*4882a593Smuzhiyun 					(u8)odm_get_bb_reg(dm, 0x91c,
310*4882a593Smuzhiyun 						       BIT23 | BIT22 |
311*4882a593Smuzhiyun 						       BIT21 | BIT20);
312*4882a593Smuzhiyun 				if ((short_pw_upperbound + 4) > 15)
313*4882a593Smuzhiyun 					odm_set_bb_reg(dm, 0x91c,
314*4882a593Smuzhiyun 						       BIT23 | BIT22 |
315*4882a593Smuzhiyun 						       BIT21 | BIT20, 15);
316*4882a593Smuzhiyun 				else
317*4882a593Smuzhiyun 					odm_set_bb_reg(dm, 0x91c,
318*4882a593Smuzhiyun 						       BIT23 | BIT22 |
319*4882a593Smuzhiyun 						       BIT21 | BIT20,
320*4882a593Smuzhiyun 						       short_pw_upperbound + 4);
321*4882a593Smuzhiyun 			}
322*4882a593Smuzhiyun 			/*@if peak index -1~+1, use original NB method*/
323*4882a593Smuzhiyun 			odm_set_bb_reg(dm, 0x19e4, 0x003C0000, 13);
324*4882a593Smuzhiyun 			odm_set_bb_reg(dm, 0x924, 0x70000, 0);
325*4882a593Smuzhiyun 		}
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun 		if (dm->support_ic_type & (ODM_RTL8881A))
328*4882a593Smuzhiyun 			odm_set_bb_reg(dm, 0xb00, 0xc0000000, 3);
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun 		/*@for 8814 new dfs mechanism setting*/
331*4882a593Smuzhiyun 		if (dm->support_ic_type &
332*4882a593Smuzhiyun 		    (ODM_RTL8814A | ODM_RTL8822B | ODM_RTL8821C)) {
333*4882a593Smuzhiyun 			/*Turn off dfs scaling factor*/
334*4882a593Smuzhiyun 			odm_set_bb_reg(dm, 0x19e4, 0x1fff, 0x0c00);
335*4882a593Smuzhiyun 			/*NonDC peak_th = 2times DC peak_th*/
336*4882a593Smuzhiyun 			odm_set_bb_reg(dm, 0x19e4, 0x30000, 1);
337*4882a593Smuzhiyun 			/*power for debug and auto test flow latch after ST*/
338*4882a593Smuzhiyun 			odm_set_bb_reg(dm, 0x9f8, 0xc0000000, 3);
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun 			/*@low pulse width radar pattern will cause wrong drop*/
341*4882a593Smuzhiyun 			/*@disable peak index should the same
342*4882a593Smuzhiyun 			 *during the same short pulse (new mechan)
343*4882a593Smuzhiyun 			 */
344*4882a593Smuzhiyun 			odm_set_bb_reg(dm, 0x9f4, 0x80000000, 0);
345*4882a593Smuzhiyun 
346*4882a593Smuzhiyun 			/*@disable peak index should the same
347*4882a593Smuzhiyun 			 *during the same short pulse (old mechan)
348*4882a593Smuzhiyun 			 */
349*4882a593Smuzhiyun 			odm_set_bb_reg(dm, 0x924, 0x20000000, 0);
350*4882a593Smuzhiyun 
351*4882a593Smuzhiyun 			/*@if peak index diff >=2, then drop the result*/
352*4882a593Smuzhiyun 			odm_set_bb_reg(dm, 0x19e4, 0xe000, 2);
353*4882a593Smuzhiyun 			if (region_domain == 2) {
354*4882a593Smuzhiyun 				if ((c_channel >= 52) && (c_channel <= 64)) {
355*4882a593Smuzhiyun 					/*pulse width hist th setting*/
356*4882a593Smuzhiyun 					/*th1=2*04us*/
357*4882a593Smuzhiyun 					odm_set_bb_reg(dm, 0x19e4,
358*4882a593Smuzhiyun 						       0xff000000, 2);
359*4882a593Smuzhiyun 					/*th2 = 3*0.4us, th3 = 4*0.4us
360*4882a593Smuzhiyun 					 *th4 = 7*0.4, th5 = 34*0.4
361*4882a593Smuzhiyun 					 */
362*4882a593Smuzhiyun 					odm_set_bb_reg(dm, 0x19e8,
363*4882a593Smuzhiyun 						       MASKDWORD, 0x22070403);
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun 					/*PRI hist th setting*/
366*4882a593Smuzhiyun 					/*th1=42*32us*/
367*4882a593Smuzhiyun 					odm_set_bb_reg(dm, 0x19b8,
368*4882a593Smuzhiyun 						       0x00007f80, 42);
369*4882a593Smuzhiyun 					/*th2=47*32us, th3=115*32us,
370*4882a593Smuzhiyun 					 *th4=123*32us, th5=130*32us
371*4882a593Smuzhiyun 					 */
372*4882a593Smuzhiyun 					odm_set_bb_reg(dm, 0x19ec,
373*4882a593Smuzhiyun 						       MASKDWORD, 0x827b732f);
374*4882a593Smuzhiyun 				} else {
375*4882a593Smuzhiyun 					/*pulse width hist th setting*/
376*4882a593Smuzhiyun 					/*th1=2*04us*/
377*4882a593Smuzhiyun 					odm_set_bb_reg(dm, 0x19e4,
378*4882a593Smuzhiyun 						       0xff000000, 1);
379*4882a593Smuzhiyun 					/*th2 = 13*0.4us, th3 = 26*0.4us
380*4882a593Smuzhiyun 					 *th4 = 75*0.4us, th5 = 255*0.4us
381*4882a593Smuzhiyun 					 */
382*4882a593Smuzhiyun 					odm_set_bb_reg(dm, 0x19e8,
383*4882a593Smuzhiyun 						       MASKDWORD, 0xff4b1a0d);
384*4882a593Smuzhiyun 					/*PRI hist th setting*/
385*4882a593Smuzhiyun 					/*th1=4*32us*/
386*4882a593Smuzhiyun 
387*4882a593Smuzhiyun 					odm_set_bb_reg(dm, 0x19b8,
388*4882a593Smuzhiyun 						       0x00007f80, 4);
389*4882a593Smuzhiyun 					/*th2=8*32us, th3=16*32us,
390*4882a593Smuzhiyun 					 *th4=32*32us, th5=128*32=4096us
391*4882a593Smuzhiyun 					 */
392*4882a593Smuzhiyun 					odm_set_bb_reg(dm, 0x19ec,
393*4882a593Smuzhiyun 						       MASKDWORD, 0x80201008);
394*4882a593Smuzhiyun 				}
395*4882a593Smuzhiyun 			}
396*4882a593Smuzhiyun 			/*@ETSI*/
397*4882a593Smuzhiyun 			else if (region_domain == 3) {
398*4882a593Smuzhiyun 				/*pulse width hist th setting*/
399*4882a593Smuzhiyun 				/*th1=2*04us*/
400*4882a593Smuzhiyun 				odm_set_bb_reg(dm, 0x19e4, 0xff000000, 1);
401*4882a593Smuzhiyun 				odm_set_bb_reg(dm, 0x19e8,
402*4882a593Smuzhiyun 					       MASKDWORD, 0x68260d06);
403*4882a593Smuzhiyun 				/*PRI hist th setting*/
404*4882a593Smuzhiyun 				/*th1=7*32us*/
405*4882a593Smuzhiyun 				odm_set_bb_reg(dm, 0x19b8, 0x00007f80, 7);
406*4882a593Smuzhiyun 				/*th2=40*32us, th3=80*32us,
407*4882a593Smuzhiyun 				 *th4=110*32us, th5=157*32=5024
408*4882a593Smuzhiyun 				 */
409*4882a593Smuzhiyun 				odm_set_bb_reg(dm, 0x19ec,
410*4882a593Smuzhiyun 					       MASKDWORD, 0xc06e2010);
411*4882a593Smuzhiyun 			}
412*4882a593Smuzhiyun 			/*@FCC*/
413*4882a593Smuzhiyun 			else if (region_domain == 1) {
414*4882a593Smuzhiyun 				/*pulse width hist th setting*/
415*4882a593Smuzhiyun 				/*th1=2*04us*/
416*4882a593Smuzhiyun 				odm_set_bb_reg(dm, 0x19e4, 0xff000000, 2);
417*4882a593Smuzhiyun 				/*th2 = 13*0.4us, th3 = 26*0.4us,
418*4882a593Smuzhiyun 				 *th4 = 75*0.4us, th5 = 255*0.4us
419*4882a593Smuzhiyun 				 */
420*4882a593Smuzhiyun 				odm_set_bb_reg(dm, 0x19e8,
421*4882a593Smuzhiyun 					       MASKDWORD, 0xff4b1a0d);
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun 				/*PRI hist th setting*/
424*4882a593Smuzhiyun 				/*th1=4*32us*/
425*4882a593Smuzhiyun 				odm_set_bb_reg(dm, 0x19b8, 0x00007f80, 4);
426*4882a593Smuzhiyun 				/*th2=8*32us, th3=21*32us,
427*4882a593Smuzhiyun 				 *th4=32*32us, th5=96*32=3072
428*4882a593Smuzhiyun 				 */
429*4882a593Smuzhiyun 				if (band_width == CHANNEL_WIDTH_20)
430*4882a593Smuzhiyun 					odm_set_bb_reg(dm, 0x19ec,
431*4882a593Smuzhiyun 						       MASKDWORD, 0x60282010);
432*4882a593Smuzhiyun 				else
433*4882a593Smuzhiyun 					odm_set_bb_reg(dm, 0x19ec,
434*4882a593Smuzhiyun 						       MASKDWORD, 0x60282420);
435*4882a593Smuzhiyun 			} else {
436*4882a593Smuzhiyun 			}
437*4882a593Smuzhiyun 		}
438*4882a593Smuzhiyun 	} else if (dm->support_ic_type &
439*4882a593Smuzhiyun 		   ODM_IC_JGR3_SERIES) {
440*4882a593Smuzhiyun 		if (dm->radar_detect_dbg_parm_en) {
441*4882a593Smuzhiyun 			phydm_radar_detect_with_dbg_parm(dm);
442*4882a593Smuzhiyun 			enable = 1;
443*4882a593Smuzhiyun 			goto exit;
444*4882a593Smuzhiyun 		}
445*4882a593Smuzhiyun 		if (region_domain == PHYDM_DFS_DOMAIN_ETSI) {
446*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa40, MASKDWORD, 0xb25dc0bd);
447*4882a593Smuzhiyun 			if (dm->support_ic_type &
448*4882a593Smuzhiyun 			    (ODM_RTL8814B | ODM_RTL8814C)) {
449*4882a593Smuzhiyun 				if (dm->seg1_dfs_flag == 1)
450*4882a593Smuzhiyun 					odm_set_bb_reg(dm, R_0xa6c, BIT(0), 1);
451*4882a593Smuzhiyun 			}
452*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa44, MASKDWORD, 0x3030bea0);
453*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa48, MASKDWORD, 0x2a521254);
454*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa4c, MASKDWORD, 0x42533345);
455*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa50, MASKDWORD, 0x605be0c3);
456*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa54, MASKDWORD, 0x500009e8);
457*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x180c, 0xe0000, 0x0);
458*4882a593Smuzhiyun 		} else if (region_domain == PHYDM_DFS_DOMAIN_MKK) {
459*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa40, MASKDWORD, 0xb25dc0bd);
460*4882a593Smuzhiyun 			if (dm->support_ic_type &
461*4882a593Smuzhiyun 			    (ODM_RTL8814B | ODM_RTL8814C)) {
462*4882a593Smuzhiyun 				if (dm->seg1_dfs_flag == 1)
463*4882a593Smuzhiyun 					odm_set_bb_reg(dm, R_0xa6c, BIT(0), 1);
464*4882a593Smuzhiyun 			}
465*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa44, MASKDWORD, 0x3030bea0);
466*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa48, MASKDWORD, 0x2a521254);
467*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa4c, MASKDWORD, 0x42533345);
468*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa50, MASKDWORD, 0x605be0c3);
469*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa54, MASKDWORD, 0x500009e8);
470*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x180c, 0xe0000, 0x0);
471*4882a593Smuzhiyun 		} else if (region_domain == PHYDM_DFS_DOMAIN_FCC) {
472*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa40, MASKDWORD, 0xb25dc0bd);
473*4882a593Smuzhiyun 			if (dm->support_ic_type &
474*4882a593Smuzhiyun 			    (ODM_RTL8814B | ODM_RTL8814C)) {
475*4882a593Smuzhiyun 				if (dm->seg1_dfs_flag == 1)
476*4882a593Smuzhiyun 					odm_set_bb_reg(dm, R_0xa6c, BIT(0), 1);
477*4882a593Smuzhiyun 			}
478*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa44, MASKDWORD, 0x3030bea0);
479*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa48, MASKDWORD, 0x2a521254);
480*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa4c, MASKDWORD, 0x42533345);
481*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa50, MASKDWORD, 0x605be0c3);
482*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa54, MASKDWORD, 0x500009e8);
483*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x180c, 0xe0000, 0x0);
484*4882a593Smuzhiyun 		} else {
485*4882a593Smuzhiyun 			/* not supported */
486*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS,
487*4882a593Smuzhiyun 				  "Unsupported dfs_region_domain:%d\n",
488*4882a593Smuzhiyun 				  region_domain);
489*4882a593Smuzhiyun 			goto exit;
490*4882a593Smuzhiyun 		}
491*4882a593Smuzhiyun 	#if (RTL8721D_SUPPORT)
492*4882a593Smuzhiyun 	} else if (dm->support_ic_type & ODM_RTL8721D) {
493*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0x814, 0x3fffffff, 0x04cc4d10);
494*4882a593Smuzhiyun 		/*CCA MASK*/
495*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xc38, 0x07c00000, 0x06);
496*4882a593Smuzhiyun 		/*CCA Threshold*/
497*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xc3c, 0x00000007, 0x0);
498*4882a593Smuzhiyun 
499*4882a593Smuzhiyun 		if (dm->radar_detect_dbg_parm_en) {
500*4882a593Smuzhiyun 			phydm_radar_detect_with_dbg_parm(dm);
501*4882a593Smuzhiyun 			enable = 1;
502*4882a593Smuzhiyun 			goto exit;
503*4882a593Smuzhiyun 		}
504*4882a593Smuzhiyun 
505*4882a593Smuzhiyun 		if (region_domain == PHYDM_DFS_DOMAIN_ETSI) {
506*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xf54, MASKDWORD, 0x230006a8);
507*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xf58, MASKDWORD, 0x354cd7dd);
508*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xf5c, MASKDWORD, 0x9984ab25);
509*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xf70, MASKDWORD, 0xbd9fab98);
510*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xf74, MASKDWORD, 0xcc45029f);
511*4882a593Smuzhiyun 
512*4882a593Smuzhiyun 		} else if (region_domain == PHYDM_DFS_DOMAIN_MKK) {
513*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xf54, MASKDWORD, 0x230006a8);
514*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xf5c, MASKDWORD, 0x9984ab25);
515*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xf70, MASKDWORD, 0xbd9fb398);
516*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xf74, MASKDWORD, 0xcc450e9d);
517*4882a593Smuzhiyun 
518*4882a593Smuzhiyun 			if (c_channel >= 52 && c_channel <= 64) {
519*4882a593Smuzhiyun 				odm_set_bb_reg(dm, R_0xf58, MASKDWORD,
520*4882a593Smuzhiyun 					       0x354cd7fd);
521*4882a593Smuzhiyun 			} else {
522*4882a593Smuzhiyun 				odm_set_bb_reg(dm, R_0xf58, MASKDWORD,
523*4882a593Smuzhiyun 					       0x354cd7bd);
524*4882a593Smuzhiyun 			}
525*4882a593Smuzhiyun 		} else if (region_domain == PHYDM_DFS_DOMAIN_FCC) {
526*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xf54, MASKDWORD, 0x230006a8);
527*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xf58, MASKDWORD, 0x3558d7bd);
528*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xf5c, MASKDWORD, 0x9984ab35);
529*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xf70, MASKDWORD, 0xbd9fb398);
530*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xf74, MASKDWORD, 0xcc444e9d);
531*4882a593Smuzhiyun 		} else {
532*4882a593Smuzhiyun 			/* not supported */
533*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS,
534*4882a593Smuzhiyun 				  "Unsupported dfs_region_domain:%d\n",
535*4882a593Smuzhiyun 				  region_domain);
536*4882a593Smuzhiyun 			goto exit;
537*4882a593Smuzhiyun 		}
538*4882a593Smuzhiyun 
539*4882a593Smuzhiyun 		/*if peak index -1~+1, use original NB method*/
540*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xf70, 0x00070000, 0x7);
541*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xf74, 0x000c0000, 0);
542*4882a593Smuzhiyun 
543*4882a593Smuzhiyun 		/*Turn off dfs scaling factor*/
544*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xf70, 0x00080000, 0x0);
545*4882a593Smuzhiyun 		/*NonDC peak_th = 2times DC peak_th*/
546*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xf58, 0x00007800, 1);
547*4882a593Smuzhiyun 
548*4882a593Smuzhiyun 		/*low pulse width radar pattern will cause wrong drop*/
549*4882a593Smuzhiyun 		/*disable peak index should the same*/
550*4882a593Smuzhiyun 		/*during the same short pulse (new mechan)*/
551*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xf70, 0x00100000, 0x0);
552*4882a593Smuzhiyun 		/*if peak index diff >=2, then drop the result*/
553*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0xf70, 0x30000000, 0x2);
554*4882a593Smuzhiyun 	#endif
555*4882a593Smuzhiyun 	} else {
556*4882a593Smuzhiyun 		/*not supported IC type*/
557*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "Unsupported IC type:%d\n",
558*4882a593Smuzhiyun 			  dm->support_ic_type);
559*4882a593Smuzhiyun 		goto exit;
560*4882a593Smuzhiyun 	}
561*4882a593Smuzhiyun 
562*4882a593Smuzhiyun 	enable = 1;
563*4882a593Smuzhiyun 
564*4882a593Smuzhiyun 	if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
565*4882a593Smuzhiyun 		dfs->st_l2h_cur = (u8)odm_get_bb_reg(dm, R_0xa40, 0x00007f00);
566*4882a593Smuzhiyun 		dfs->pwdb_th_cur = (u8)odm_get_bb_reg(dm, R_0xa50, 0x000000f0);
567*4882a593Smuzhiyun 		dfs->peak_th = (u8)odm_get_bb_reg(dm, R_0xa48, 0x00c00000);
568*4882a593Smuzhiyun 		dfs->short_pulse_cnt_th = (u8)odm_get_bb_reg(dm, R_0xa50,
569*4882a593Smuzhiyun 							     0x00f00000);
570*4882a593Smuzhiyun 		dfs->long_pulse_cnt_th = (u8)odm_get_bb_reg(dm, R_0xa4c,
571*4882a593Smuzhiyun 							    0xf0000000);
572*4882a593Smuzhiyun 		dfs->peak_window = (u8)odm_get_bb_reg(dm, R_0xa40, 0x00030000);
573*4882a593Smuzhiyun 		dfs->three_peak_opt = (u8)odm_get_bb_reg(dm, R_0xa40,
574*4882a593Smuzhiyun 							 0x30000000);
575*4882a593Smuzhiyun 		dfs->three_peak_th2 = (u8)odm_get_bb_reg(dm, R_0xa44,
576*4882a593Smuzhiyun 							 0x00000007);
577*4882a593Smuzhiyun 	#if (RTL8721D_SUPPORT)
578*4882a593Smuzhiyun 	} else if (dm->support_ic_type & (ODM_RTL8721D)) {
579*4882a593Smuzhiyun 		dfs->st_l2h_cur = (u8)odm_get_bb_reg(dm, R_0xf54,
580*4882a593Smuzhiyun 						     0x0000001f) << 2);
581*4882a593Smuzhiyun 		dfs->st_l2h_cur += (u8)odm_get_bb_reg(dm, R_0xf58, 0xc0000000);
582*4882a593Smuzhiyun 		dfs->pwdb_th_cur = (u8)odm_get_bb_reg(dm, R_0xf70, 0x03c00000);
583*4882a593Smuzhiyun 		dfs->peak_th = (u8)odm_get_bb_reg(dm, R_0xf5c, 0x00000030);
584*4882a593Smuzhiyun 		dfs->short_pulse_cnt_th = (u8)odm_get_bb_reg(dm, R_0xf70,
585*4882a593Smuzhiyun 							     0x00007800);
586*4882a593Smuzhiyun 		dfs->long_pulse_cnt_th = (u8)odm_get_bb_reg(dm, R_0xf74,
587*4882a593Smuzhiyun 							    0x0000000f);
588*4882a593Smuzhiyun 		dfs->peak_window = (u8)odm_get_bb_reg(dm, R_0xf58, 0x18000000);
589*4882a593Smuzhiyun 		dfs->three_peak_opt = (u8)odm_get_bb_reg(dm, R_0xf58,
590*4882a593Smuzhiyun 							 0x00030000);
591*4882a593Smuzhiyun 		dfs->three_peak_th2 = (u8)odm_get_bb_reg(dm,
592*4882a593Smuzhiyun 							 R_0xf58, 0x00007c00);
593*4882a593Smuzhiyun 	#endif
594*4882a593Smuzhiyun 	} else {
595*4882a593Smuzhiyun 		dfs->st_l2h_cur = (u8)odm_get_bb_reg(dm, R_0x91c, 0x000000ff);
596*4882a593Smuzhiyun 		dfs->pwdb_th_cur = (u8)odm_get_bb_reg(dm, R_0x918, 0x00001f00);
597*4882a593Smuzhiyun 		dfs->peak_th = (u8)odm_get_bb_reg(dm, R_0x918, 0x00030000);
598*4882a593Smuzhiyun 		dfs->short_pulse_cnt_th = (u8)odm_get_bb_reg(dm, R_0x920,
599*4882a593Smuzhiyun 							     0x000f0000);
600*4882a593Smuzhiyun 		dfs->long_pulse_cnt_th = (u8)odm_get_bb_reg(dm, R_0x920,
601*4882a593Smuzhiyun 							    0x00f00000);
602*4882a593Smuzhiyun 		dfs->peak_window = (u8)odm_get_bb_reg(dm, R_0x920, 0x00000300);
603*4882a593Smuzhiyun 		dfs->three_peak_opt = (u8)odm_get_bb_reg(dm, 0x924, 0x00000180);
604*4882a593Smuzhiyun 		dfs->three_peak_th2 = (u8)odm_get_bb_reg(dm, 0x924, 0x00007000);
605*4882a593Smuzhiyun 	}
606*4882a593Smuzhiyun 
607*4882a593Smuzhiyun 		phydm_dfs_parameter_init(dm);
608*4882a593Smuzhiyun 
609*4882a593Smuzhiyun exit:
610*4882a593Smuzhiyun 	if (enable) {
611*4882a593Smuzhiyun 		phydm_radar_detect_reset(dm);
612*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "on cch:%u, bw:%u\n", c_channel,
613*4882a593Smuzhiyun 			  band_width);
614*4882a593Smuzhiyun 	} else
615*4882a593Smuzhiyun 		phydm_radar_detect_disable(dm);
616*4882a593Smuzhiyun }
617*4882a593Smuzhiyun 
phydm_dfs_parameter_init(void * dm_void)618*4882a593Smuzhiyun void phydm_dfs_parameter_init(void *dm_void)
619*4882a593Smuzhiyun {
620*4882a593Smuzhiyun 	struct dm_struct *dm = (struct dm_struct *)dm_void;
621*4882a593Smuzhiyun 	struct _DFS_STATISTICS *dfs = &dm->dfs;
622*4882a593Smuzhiyun 
623*4882a593Smuzhiyun 	u8 i;
624*4882a593Smuzhiyun 	for (i = 0; i < 5; i++) {
625*4882a593Smuzhiyun 		dfs->pulse_flag_hist[i] = 0;
626*4882a593Smuzhiyun 		dfs->pulse_type_hist[i] = 0;
627*4882a593Smuzhiyun 		dfs->radar_det_mask_hist[i] = 0;
628*4882a593Smuzhiyun 		dfs->fa_inc_hist[i] = 0;
629*4882a593Smuzhiyun 	}
630*4882a593Smuzhiyun 
631*4882a593Smuzhiyun 	/*@for dfs mode*/
632*4882a593Smuzhiyun 	dfs->force_TP_mode = 0;
633*4882a593Smuzhiyun 	dfs->sw_trigger_mode = 0;
634*4882a593Smuzhiyun 	dfs->det_print = 0;
635*4882a593Smuzhiyun 	dfs->det_print2 = 0;
636*4882a593Smuzhiyun 	dfs->print_hist_rpt = 0;
637*4882a593Smuzhiyun 	if (dm->support_ic_type & (ODM_RTL8814A | ODM_RTL8822B | ODM_RTL8821C))
638*4882a593Smuzhiyun 		dfs->hist_cond_on = 1;
639*4882a593Smuzhiyun 	else
640*4882a593Smuzhiyun 		dfs->hist_cond_on = 0;
641*4882a593Smuzhiyun 	if (dm->support_ic_type & (ODM_RTL8723F | ODM_RTL8822C)) {
642*4882a593Smuzhiyun 		dfs->det_print_jar3 = 1;
643*4882a593Smuzhiyun 		dfs->nhm_dfs_en = true;
644*4882a593Smuzhiyun 		dfs->det_jar3_en = true;
645*4882a593Smuzhiyun 	} else {
646*4882a593Smuzhiyun 		dfs->det_print_jar3 = 0;
647*4882a593Smuzhiyun 		dfs->nhm_dfs_en = false;
648*4882a593Smuzhiyun 		dfs->det_jar3_en = false;
649*4882a593Smuzhiyun 	}
650*4882a593Smuzhiyun 
651*4882a593Smuzhiyun 	/*@for flag en*/
652*4882a593Smuzhiyun 	dfs->pw_flag_en = true;
653*4882a593Smuzhiyun 	dfs->pri_flag_en = true;
654*4882a593Smuzhiyun 	dfs->loct_flag_en = true;
655*4882a593Smuzhiyun 	dfs->nhm_cnt_th = 4;
656*4882a593Smuzhiyun 	dfs->nhm_dty_th = 40;
657*4882a593Smuzhiyun 
658*4882a593Smuzhiyun 	/*@for jgar3*/
659*4882a593Smuzhiyun 	dfs->pri_var_offset = 2;
660*4882a593Smuzhiyun 	dfs->pri_var_tp_offset = 10;
661*4882a593Smuzhiyun 	dfs->pri_cnt_th = 2;
662*4882a593Smuzhiyun 	dfs->loct_diff_th = 15;
663*4882a593Smuzhiyun 	dfs->dc_cnt_th = 3;
664*4882a593Smuzhiyun 
665*4882a593Smuzhiyun 	/*@for dynamic dfs*/
666*4882a593Smuzhiyun 	dfs->pwdb_th = 8;
667*4882a593Smuzhiyun 	dfs->fa_mask_th = 120 * dfs->dfs_polling_time / 100;
668*4882a593Smuzhiyun 	dfs->st_l2h_min = 0x20;
669*4882a593Smuzhiyun 	dfs->st_l2h_max = 0x4e;
670*4882a593Smuzhiyun 	dfs->pwdb_scalar_factor = 12;
671*4882a593Smuzhiyun 
672*4882a593Smuzhiyun 	/*@for dfs histogram*/
673*4882a593Smuzhiyun 	dfs->pri_hist_th = 5;
674*4882a593Smuzhiyun 	dfs->pri_sum_g1_th = 9;
675*4882a593Smuzhiyun 	dfs->pri_sum_g5_th = 5;
676*4882a593Smuzhiyun 	dfs->pri_sum_g1_fcc_th = 4;		/*@FCC Type6*/
677*4882a593Smuzhiyun 	dfs->pri_sum_g3_fcc_th = 6;
678*4882a593Smuzhiyun 	dfs->pri_sum_safe_th = 50;
679*4882a593Smuzhiyun 	dfs->pri_sum_safe_fcc_th = 110;		/*@30 for AP*/
680*4882a593Smuzhiyun 	dfs->pri_sum_type4_th = 16;
681*4882a593Smuzhiyun 	dfs->pri_sum_type6_th = 12;
682*4882a593Smuzhiyun 	dfs->pri_sum_g5_under_g1_th = 4;
683*4882a593Smuzhiyun 	dfs->pri_pw_diff_th = 4;
684*4882a593Smuzhiyun 	dfs->pri_pw_diff_fcc_th = 8;
685*4882a593Smuzhiyun 	dfs->pri_pw_diff_fcc_idle_th = 2;
686*4882a593Smuzhiyun 	dfs->pri_pw_diff_w53_th = 10;
687*4882a593Smuzhiyun 	dfs->pw_std_th = 7;			/*@FCC Type4*/
688*4882a593Smuzhiyun 	dfs->pw_std_idle_th = 10;
689*4882a593Smuzhiyun 	dfs->pri_std_th = 6;			/*@FCC Type3,4,6*/
690*4882a593Smuzhiyun 	dfs->pri_std_idle_th = 10;
691*4882a593Smuzhiyun 	dfs->pri_type1_upp_fcc_th = 110;
692*4882a593Smuzhiyun 	dfs->pri_type1_low_fcc_th = 50;
693*4882a593Smuzhiyun 	dfs->pri_type1_cen_fcc_th = 70;
694*4882a593Smuzhiyun 	dfs->pw_g0_th = 8;
695*4882a593Smuzhiyun 	dfs->pw_long_lower_th = 6;		/*@7->6*/
696*4882a593Smuzhiyun 	dfs->pri_long_upper_th = 30;
697*4882a593Smuzhiyun 	dfs->pw_long_lower_20m_th = 7;		/*@7 for AP*/
698*4882a593Smuzhiyun 	dfs->pw_long_sum_upper_th = 60;
699*4882a593Smuzhiyun 	dfs->type4_pw_max_cnt = 7;
700*4882a593Smuzhiyun 	dfs->type4_safe_pri_sum_th = 5;
701*4882a593Smuzhiyun }
702*4882a593Smuzhiyun 
phydm_dfs_dynamic_setting(void * dm_void)703*4882a593Smuzhiyun void phydm_dfs_dynamic_setting(
704*4882a593Smuzhiyun 	void *dm_void)
705*4882a593Smuzhiyun {
706*4882a593Smuzhiyun 	struct dm_struct *dm = (struct dm_struct *)dm_void;
707*4882a593Smuzhiyun 	struct _DFS_STATISTICS *dfs = &dm->dfs;
708*4882a593Smuzhiyun 
709*4882a593Smuzhiyun 	u8 peak_th_cur = 0, short_pulse_cnt_th_cur = 0;
710*4882a593Smuzhiyun 	u8 long_pulse_cnt_th_cur = 0, three_peak_opt_cur = 0;
711*4882a593Smuzhiyun 	u8 three_peak_th2_cur = 0;
712*4882a593Smuzhiyun 	u8 peak_window_cur = 0;
713*4882a593Smuzhiyun 	u8 region_domain = dm->dfs_region_domain;
714*4882a593Smuzhiyun 	u8 c_channel = *dm->channel;
715*4882a593Smuzhiyun 
716*4882a593Smuzhiyun 	if (dm->rx_tp + dm->tx_tp <= 2) {
717*4882a593Smuzhiyun 		dfs->idle_mode = 1;
718*4882a593Smuzhiyun 		if (dfs->force_TP_mode)
719*4882a593Smuzhiyun 			dfs->idle_mode = 0;
720*4882a593Smuzhiyun 	} else {
721*4882a593Smuzhiyun 		dfs->idle_mode = 0;
722*4882a593Smuzhiyun 	}
723*4882a593Smuzhiyun 
724*4882a593Smuzhiyun 	if (dfs->idle_mode == 1) { /*@idle (no traffic)*/
725*4882a593Smuzhiyun 		peak_th_cur = 3;
726*4882a593Smuzhiyun 		short_pulse_cnt_th_cur = 6;
727*4882a593Smuzhiyun 		long_pulse_cnt_th_cur = 9;
728*4882a593Smuzhiyun 		peak_window_cur = 2;
729*4882a593Smuzhiyun 		three_peak_opt_cur = 0;
730*4882a593Smuzhiyun 		three_peak_th2_cur = 2;
731*4882a593Smuzhiyun 		if (region_domain == PHYDM_DFS_DOMAIN_MKK) {
732*4882a593Smuzhiyun 			if (c_channel >= 52 && c_channel <= 64) {
733*4882a593Smuzhiyun 				short_pulse_cnt_th_cur = 14;
734*4882a593Smuzhiyun 				long_pulse_cnt_th_cur = 15;
735*4882a593Smuzhiyun 				three_peak_th2_cur = 0;
736*4882a593Smuzhiyun 			} else {
737*4882a593Smuzhiyun 				short_pulse_cnt_th_cur = 6;
738*4882a593Smuzhiyun 				three_peak_th2_cur = 0;
739*4882a593Smuzhiyun 				long_pulse_cnt_th_cur = 10;
740*4882a593Smuzhiyun 			}
741*4882a593Smuzhiyun 		} else if (region_domain == PHYDM_DFS_DOMAIN_FCC) {
742*4882a593Smuzhiyun 			three_peak_th2_cur = 0;
743*4882a593Smuzhiyun 		} else if (region_domain == PHYDM_DFS_DOMAIN_ETSI) {
744*4882a593Smuzhiyun 			long_pulse_cnt_th_cur = 15;
745*4882a593Smuzhiyun 			if (phydm_dfs_is_meteorology_channel(dm)) {
746*4882a593Smuzhiyun 			/*need to add check cac end condition*/
747*4882a593Smuzhiyun 				peak_th_cur = 2;
748*4882a593Smuzhiyun 				three_peak_opt_cur = 0;
749*4882a593Smuzhiyun 				three_peak_th2_cur = 0;
750*4882a593Smuzhiyun 				short_pulse_cnt_th_cur = 7;
751*4882a593Smuzhiyun 			} else {
752*4882a593Smuzhiyun 				three_peak_opt_cur = 0;
753*4882a593Smuzhiyun 				three_peak_th2_cur = 0;
754*4882a593Smuzhiyun 				short_pulse_cnt_th_cur = 7;
755*4882a593Smuzhiyun 			}
756*4882a593Smuzhiyun 		} else /*@default: FCC*/
757*4882a593Smuzhiyun 			three_peak_th2_cur = 0;
758*4882a593Smuzhiyun 
759*4882a593Smuzhiyun 	} else { /*@in service (with TP)*/
760*4882a593Smuzhiyun 		peak_th_cur = 2;
761*4882a593Smuzhiyun 		short_pulse_cnt_th_cur = 6;
762*4882a593Smuzhiyun 		long_pulse_cnt_th_cur = 7;
763*4882a593Smuzhiyun 		peak_window_cur = 2;
764*4882a593Smuzhiyun 		three_peak_opt_cur = 0;
765*4882a593Smuzhiyun 		three_peak_th2_cur = 2;
766*4882a593Smuzhiyun 		if (region_domain == PHYDM_DFS_DOMAIN_MKK) {
767*4882a593Smuzhiyun 			if (c_channel >= 52 && c_channel <= 64) {
768*4882a593Smuzhiyun 				long_pulse_cnt_th_cur = 15;
769*4882a593Smuzhiyun 				/*@for high duty cycle*/
770*4882a593Smuzhiyun 				short_pulse_cnt_th_cur = 5;
771*4882a593Smuzhiyun 				three_peak_th2_cur = 0;
772*4882a593Smuzhiyun 			} else {
773*4882a593Smuzhiyun 				three_peak_opt_cur = 0;
774*4882a593Smuzhiyun 				three_peak_th2_cur = 0;
775*4882a593Smuzhiyun 				long_pulse_cnt_th_cur = 8;
776*4882a593Smuzhiyun 			}
777*4882a593Smuzhiyun 		} else if (region_domain == PHYDM_DFS_DOMAIN_FCC) {
778*4882a593Smuzhiyun 			long_pulse_cnt_th_cur = 5;	/*for 80M FCC*/
779*4882a593Smuzhiyun 			short_pulse_cnt_th_cur = 5;	/*for 80M FCC*/
780*4882a593Smuzhiyun 		} else if (region_domain == PHYDM_DFS_DOMAIN_ETSI) {
781*4882a593Smuzhiyun 			long_pulse_cnt_th_cur = 15;
782*4882a593Smuzhiyun 			short_pulse_cnt_th_cur = 5;
783*4882a593Smuzhiyun 			three_peak_opt_cur = 0;
784*4882a593Smuzhiyun 		}
785*4882a593Smuzhiyun 	}
786*4882a593Smuzhiyun 
787*4882a593Smuzhiyun 	if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
788*4882a593Smuzhiyun 		/*
789*4882a593Smuzhiyun 		if (dfs->peak_th != peak_th_cur)
790*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa48, 0x00c00000, peak_th_cur);
791*4882a593Smuzhiyun 		if (dfs->short_pulse_cnt_th != short_pulse_cnt_th_cur)
792*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa50, 0x00f00000,
793*4882a593Smuzhiyun 				       short_pulse_cnt_th_cur);
794*4882a593Smuzhiyun 		if (dfs->long_pulse_cnt_th != long_pulse_cnt_th_cur)
795*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa4c, 0xf0000000,
796*4882a593Smuzhiyun 				       long_pulse_cnt_th_cur);
797*4882a593Smuzhiyun 		if (dfs->peak_window != peak_window_cur)
798*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa40, 0x00030000,
799*4882a593Smuzhiyun 				       peak_window_cur);
800*4882a593Smuzhiyun 		if (dfs->three_peak_opt != three_peak_opt_cur)
801*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa40, 0x30000000,
802*4882a593Smuzhiyun 				       three_peak_opt_cur);
803*4882a593Smuzhiyun 		if (dfs->three_peak_th2 != three_peak_th2_cur)
804*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa44, 0x00000007,
805*4882a593Smuzhiyun 				       three_peak_th2_cur);
806*4882a593Smuzhiyun 		*/
807*4882a593Smuzhiyun 	#if (RTL8721D_SUPPORT)
808*4882a593Smuzhiyun 	} else if (dm->support_ic_type & (ODM_RTL8721D)) {
809*4882a593Smuzhiyun 		if (dfs->peak_th != peak_th_cur)
810*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xf5c, 0x00000030, peak_th_cur);
811*4882a593Smuzhiyun 		if (dfs->short_pulse_cnt_th != short_pulse_cnt_th_cur)
812*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xf70, 0x00007800,
813*4882a593Smuzhiyun 				       short_pulse_cnt_th_cur);
814*4882a593Smuzhiyun 		if (dfs->long_pulse_cnt_th != long_pulse_cnt_th_cur)
815*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xf74, 0x0000000f,
816*4882a593Smuzhiyun 				       long_pulse_cnt_th_cur);
817*4882a593Smuzhiyun 		if (dfs->peak_window != peak_window_cur)
818*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xf58, 0x18000000,
819*4882a593Smuzhiyun 				       peak_window_cur);
820*4882a593Smuzhiyun 		if (dfs->three_peak_opt != three_peak_opt_cur)
821*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xf58, 0x00030000,
822*4882a593Smuzhiyun 				       three_peak_opt_cur);
823*4882a593Smuzhiyun 		if (dfs->three_peak_th2 != three_peak_th2_cur)
824*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xf58, 0x00007c00,
825*4882a593Smuzhiyun 				       three_peak_th2_cur);
826*4882a593Smuzhiyun 	#endif
827*4882a593Smuzhiyun 	} else {
828*4882a593Smuzhiyun 		if (dfs->peak_th != peak_th_cur)
829*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x918, 0x00030000, peak_th_cur);
830*4882a593Smuzhiyun 		if (dfs->short_pulse_cnt_th != short_pulse_cnt_th_cur)
831*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x920, 0x000f0000,
832*4882a593Smuzhiyun 				       short_pulse_cnt_th_cur);
833*4882a593Smuzhiyun 		if (dfs->long_pulse_cnt_th != long_pulse_cnt_th_cur)
834*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x920, 0x00f00000,
835*4882a593Smuzhiyun 				       long_pulse_cnt_th_cur);
836*4882a593Smuzhiyun 		if (dfs->peak_window != peak_window_cur)
837*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x920, 0x00000300,
838*4882a593Smuzhiyun 				       peak_window_cur);
839*4882a593Smuzhiyun 		if (dfs->three_peak_opt != three_peak_opt_cur)
840*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x924, 0x00000180,
841*4882a593Smuzhiyun 				       three_peak_opt_cur);
842*4882a593Smuzhiyun 		if (dfs->three_peak_th2 != three_peak_th2_cur)
843*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x924, 0x00007000,
844*4882a593Smuzhiyun 				       three_peak_th2_cur);
845*4882a593Smuzhiyun 	}
846*4882a593Smuzhiyun 
847*4882a593Smuzhiyun 	dfs->peak_th = peak_th_cur;
848*4882a593Smuzhiyun 	dfs->short_pulse_cnt_th = short_pulse_cnt_th_cur;
849*4882a593Smuzhiyun 	dfs->long_pulse_cnt_th = long_pulse_cnt_th_cur;
850*4882a593Smuzhiyun 	dfs->peak_window = peak_window_cur;
851*4882a593Smuzhiyun 	dfs->three_peak_opt = three_peak_opt_cur;
852*4882a593Smuzhiyun 	dfs->three_peak_th2 = three_peak_th2_cur;
853*4882a593Smuzhiyun }
854*4882a593Smuzhiyun 
855*4882a593Smuzhiyun boolean
phydm_radar_detect_dm_check(void * dm_void)856*4882a593Smuzhiyun phydm_radar_detect_dm_check(
857*4882a593Smuzhiyun 	void *dm_void)
858*4882a593Smuzhiyun {
859*4882a593Smuzhiyun 	struct dm_struct *dm = (struct dm_struct *)dm_void;
860*4882a593Smuzhiyun 	struct _DFS_STATISTICS *dfs = &dm->dfs;
861*4882a593Smuzhiyun 	struct phydm_fa_struct *fa_t = &dm->false_alm_cnt;
862*4882a593Smuzhiyun 	u8 region_domain = dm->dfs_region_domain, index = 0;
863*4882a593Smuzhiyun 
864*4882a593Smuzhiyun 	u16 i = 0, j = 0, fa_count_cur = 0, fa_count_inc = 0;
865*4882a593Smuzhiyun 	u16 total_fa_in_hist = 0, total_pulse_count_inc = 0;
866*4882a593Smuzhiyun 	u16 short_pulse_cnt_inc = 0, short_pulse_cnt_cur = 0;
867*4882a593Smuzhiyun 	u16 long_pulse_cnt_inc = 0, long_pulse_cnt_cur = 0;
868*4882a593Smuzhiyun 	u32 regf98_value = 0, reg918_value = 0, reg91c_value = 0;
869*4882a593Smuzhiyun 	u32 reg920_value = 0, reg924_value = 0, radar_rpt_reg_value = 0;
870*4882a593Smuzhiyun 	u32 regf54_value = 0, regf58_value = 0, regf5c_value = 0;
871*4882a593Smuzhiyun 	u32 regdf4_value = 0, regf70_value = 0, regf74_value = 0;
872*4882a593Smuzhiyun 	#if (RTL8812F_SUPPORT || RTL8822C_SUPPORT || RTL8814B_SUPPORT || RTL8723F_SUPPORT)
873*4882a593Smuzhiyun 	u32 rega40_value = 0, rega44_value = 0, rega48_value = 0;
874*4882a593Smuzhiyun 	u32 rega4c_value = 0, rega50_value = 0, rega54_value = 0;
875*4882a593Smuzhiyun 	u32 reg_2e08 = 0, reg_2e24 = 0, reg_2e28 = 0;
876*4882a593Smuzhiyun 	u32 reg_2e2c = 0, reg_2e30 = 0, reg_2e34 = 0;
877*4882a593Smuzhiyun 	u32 reg_2e0c = 0, reg_2e10 = 0, reg_2e20 = 0;
878*4882a593Smuzhiyun 	#endif
879*4882a593Smuzhiyun 	#if (RTL8721D_SUPPORT)
880*4882a593Smuzhiyun 	u32 reg908_value = 0, regdf4_value = 0;
881*4882a593Smuzhiyun 	u32 regf54_value = 0, regf58_value = 0, regf5c_value = 0;
882*4882a593Smuzhiyun 	u32 regf70_value = 0, regf74_value = 0;
883*4882a593Smuzhiyun 	#endif
884*4882a593Smuzhiyun 	boolean tri_short_pulse = 0, tri_long_pulse = 0, radar_type = 0;
885*4882a593Smuzhiyun 	boolean fault_flag_det = 0, fault_flag_psd = 0, fa_flag = 0;
886*4882a593Smuzhiyun 	boolean radar_detected = 0;
887*4882a593Smuzhiyun 	u8 st_l2h_new = 0, fa_mask_th = 0, k = 0, sum = 0;
888*4882a593Smuzhiyun 	u8 c_channel = *dm->channel;
889*4882a593Smuzhiyun 
890*4882a593Smuzhiyun 	/*@Get FA count during past 100ms, R_0xf48 for AC series*/
891*4882a593Smuzhiyun 	if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
892*4882a593Smuzhiyun 		/*fa_count_cur = (u16)odm_get_bb_reg(dm, R_0x2d00, MASKLWORD);*/
893*4882a593Smuzhiyun 		/*1-sec period*/
894*4882a593Smuzhiyun 		fa_count_cur = (u16)(fa_t->cnt_all * dfs->dfs_polling_time / 1000);
895*4882a593Smuzhiyun 	#if (RTL8721D_SUPPORT)
896*4882a593Smuzhiyun 	else if (dm->support_ic_type & (ODM_RTL8721D)) {
897*4882a593Smuzhiyun 		fa_count_cur = (u16)odm_get_bb_reg(dm,
898*4882a593Smuzhiyun 						   ODM_REG_OFDM_FA_TYPE2_11N,
899*4882a593Smuzhiyun 						   MASKHWORD);
900*4882a593Smuzhiyun 		fa_count_cur += (u16)odm_get_bb_reg(dm,
901*4882a593Smuzhiyun 						    ODM_REG_OFDM_FA_TYPE3_11N,
902*4882a593Smuzhiyun 						    MASKLWORD);
903*4882a593Smuzhiyun 		fa_count_cur += (u16)odm_get_bb_reg(dm,
904*4882a593Smuzhiyun 						    ODM_REG_OFDM_FA_TYPE3_11N,
905*4882a593Smuzhiyun 						    MASKHWORD);
906*4882a593Smuzhiyun 		fa_count_cur += (u16)odm_get_bb_reg(dm,
907*4882a593Smuzhiyun 						    ODM_REG_OFDM_FA_TYPE4_11N,
908*4882a593Smuzhiyun 						    MASKLWORD);
909*4882a593Smuzhiyun 		fa_count_cur += (u16)odm_get_bb_reg(dm,
910*4882a593Smuzhiyun 						    ODM_REG_OFDM_FA_TYPE1_11N,
911*4882a593Smuzhiyun 						    MASKLWORD);
912*4882a593Smuzhiyun 		fa_count_cur += (u16)odm_get_bb_reg(dm,
913*4882a593Smuzhiyun 						    ODM_REG_OFDM_FA_TYPE1_11N,
914*4882a593Smuzhiyun 						    MASKHWORD);
915*4882a593Smuzhiyun 	}
916*4882a593Smuzhiyun 	#endif
917*4882a593Smuzhiyun 	else
918*4882a593Smuzhiyun 		fa_count_cur = (u16)odm_get_bb_reg(dm, R_0xf48, 0x0000ffff);
919*4882a593Smuzhiyun 
920*4882a593Smuzhiyun 	if (!(dm->support_ic_type & ODM_IC_JGR3_SERIES)) {
921*4882a593Smuzhiyun 		if (dfs->fa_count_pre == 0)
922*4882a593Smuzhiyun 			fa_count_inc = 0;
923*4882a593Smuzhiyun 		else if (fa_count_cur >= dfs->fa_count_pre)
924*4882a593Smuzhiyun 			fa_count_inc = fa_count_cur - dfs->fa_count_pre;
925*4882a593Smuzhiyun 		else
926*4882a593Smuzhiyun 			fa_count_inc = fa_count_cur;
927*4882a593Smuzhiyun 		dfs->fa_count_pre = fa_count_cur;
928*4882a593Smuzhiyun 	} else {
929*4882a593Smuzhiyun 		fa_count_inc = fa_count_cur;
930*4882a593Smuzhiyun 	}
931*4882a593Smuzhiyun 
932*4882a593Smuzhiyun 	for (i = 0; i < 5; i++)
933*4882a593Smuzhiyun 		total_fa_in_hist = total_fa_in_hist + dfs->fa_inc_hist[i];
934*4882a593Smuzhiyun 
935*4882a593Smuzhiyun 	if (dfs->mask_idx >= 2)
936*4882a593Smuzhiyun 		index = dfs->mask_idx - 2;
937*4882a593Smuzhiyun 	else
938*4882a593Smuzhiyun 		index = 5 + dfs->mask_idx - 2;
939*4882a593Smuzhiyun 
940*4882a593Smuzhiyun 	if (dm->support_ic_type & (ODM_RTL8198F | ODM_RTL8822C | ODM_RTL8812F |
941*4882a593Smuzhiyun 				   ODM_RTL8197G| ODM_RTL8723F)) {
942*4882a593Smuzhiyun 		radar_rpt_reg_value = odm_get_bb_reg(dm, R_0x2e00, 0xffffffff);
943*4882a593Smuzhiyun 		short_pulse_cnt_cur = (u16)((radar_rpt_reg_value & 0x000ff800)
944*4882a593Smuzhiyun 					    >> 11);
945*4882a593Smuzhiyun 		long_pulse_cnt_cur = (u16)((radar_rpt_reg_value & 0x0fc00000)
946*4882a593Smuzhiyun 					    >> 22);
947*4882a593Smuzhiyun 	#if (RTL8721D_SUPPORT)
948*4882a593Smuzhiyun 	} else if (dm->support_ic_type & (ODM_RTL8721D)) {
949*4882a593Smuzhiyun 		reg908_value = (u32)odm_get_bb_reg(dm, R_0x908, MASKDWORD);
950*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0x908, MASKDWORD, 0x254);
951*4882a593Smuzhiyun 		regdf4_value = odm_get_bb_reg(dm, R_0xdf4, MASKDWORD);
952*4882a593Smuzhiyun 		short_pulse_cnt_cur = (u16)((regdf4_value & 0x000ff000) >> 12);
953*4882a593Smuzhiyun 		long_pulse_cnt_cur = (u16)((regdf4_value & 0x0fc00000) >> 22);
954*4882a593Smuzhiyun 
955*4882a593Smuzhiyun 		tri_short_pulse = (regdf4_value & BIT(20)) ? 1 : 0;
956*4882a593Smuzhiyun 		tri_long_pulse = (regdf4_value & BIT(28)) ? 1 : 0;
957*4882a593Smuzhiyun 		if (tri_short_pulse || tri_long_pulse) {
958*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xf58, BIT(29), 0);
959*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xf58, BIT(29), 1);
960*4882a593Smuzhiyun 		}
961*4882a593Smuzhiyun 	#endif
962*4882a593Smuzhiyun 	} else if (dm->support_ic_type & (ODM_RTL8814B | ODM_RTL8814C)) {
963*4882a593Smuzhiyun 		if (dm->seg1_dfs_flag == 1)
964*4882a593Smuzhiyun 			radar_rpt_reg_value = odm_get_bb_reg(dm, R_0x2e20,
965*4882a593Smuzhiyun 							     0xffffffff);
966*4882a593Smuzhiyun 		else
967*4882a593Smuzhiyun 			radar_rpt_reg_value = odm_get_bb_reg(dm, R_0x2e00,
968*4882a593Smuzhiyun 							     0xffffffff);
969*4882a593Smuzhiyun 		short_pulse_cnt_cur = (u16)((radar_rpt_reg_value & 0x000ff800)
970*4882a593Smuzhiyun 					    >> 11);
971*4882a593Smuzhiyun 		long_pulse_cnt_cur = (u16)((radar_rpt_reg_value & 0x0fc00000)
972*4882a593Smuzhiyun 					    >> 22);
973*4882a593Smuzhiyun 	} else {
974*4882a593Smuzhiyun 		regf98_value = odm_get_bb_reg(dm, R_0xf98, 0xffffffff);
975*4882a593Smuzhiyun 		short_pulse_cnt_cur = (u16)(regf98_value & 0x000000ff);
976*4882a593Smuzhiyun 		long_pulse_cnt_cur = (u16)((regf98_value & 0x0000ff00) >> 8);
977*4882a593Smuzhiyun 	}
978*4882a593Smuzhiyun 
979*4882a593Smuzhiyun 	/*@Get short pulse count, need carefully handle the counter overflow*/
980*4882a593Smuzhiyun 	if (short_pulse_cnt_cur >= dfs->short_pulse_cnt_pre) {
981*4882a593Smuzhiyun 		short_pulse_cnt_inc = short_pulse_cnt_cur -
982*4882a593Smuzhiyun 				      dfs->short_pulse_cnt_pre;
983*4882a593Smuzhiyun 	} else {
984*4882a593Smuzhiyun 		short_pulse_cnt_inc = short_pulse_cnt_cur;
985*4882a593Smuzhiyun 	}
986*4882a593Smuzhiyun 	dfs->short_pulse_cnt_pre = short_pulse_cnt_cur;
987*4882a593Smuzhiyun 
988*4882a593Smuzhiyun 	/*@Get long pulse count, need carefully handle the counter overflow*/
989*4882a593Smuzhiyun 	if (long_pulse_cnt_cur >= dfs->long_pulse_cnt_pre) {
990*4882a593Smuzhiyun 		long_pulse_cnt_inc = long_pulse_cnt_cur -
991*4882a593Smuzhiyun 				     dfs->long_pulse_cnt_pre;
992*4882a593Smuzhiyun 	} else {
993*4882a593Smuzhiyun 		long_pulse_cnt_inc = long_pulse_cnt_cur;
994*4882a593Smuzhiyun 	}
995*4882a593Smuzhiyun 	dfs->long_pulse_cnt_pre = long_pulse_cnt_cur;
996*4882a593Smuzhiyun 
997*4882a593Smuzhiyun 	total_pulse_count_inc = short_pulse_cnt_inc + long_pulse_cnt_inc;
998*4882a593Smuzhiyun 
999*4882a593Smuzhiyun 	if (dfs->det_print) {
1000*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS,
1001*4882a593Smuzhiyun 			  "===============================================\n");
1002*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "FA_count_inc[%d]\n", fa_count_inc);
1003*4882a593Smuzhiyun 		if (dm->support_ic_type & (ODM_RTL8721D)) {
1004*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS,
1005*4882a593Smuzhiyun 				  "Init_Gain[%x] st_l2h_cur[%x] 0xdf4[%08x] short_pulse_cnt_inc[%d] long_pulse_cnt_inc[%d]\n",
1006*4882a593Smuzhiyun 				  dfs->igi_cur, dfs->st_l2h_cur, regdf4_value,
1007*4882a593Smuzhiyun 				  short_pulse_cnt_inc, long_pulse_cnt_inc);
1008*4882a593Smuzhiyun 			regf54_value = odm_get_bb_reg(dm, R_0xf54, MASKDWORD);
1009*4882a593Smuzhiyun 			regf58_value = odm_get_bb_reg(dm, R_0xf58, MASKDWORD);
1010*4882a593Smuzhiyun 			regf5c_value = odm_get_bb_reg(dm, R_0xf5c, MASKDWORD);
1011*4882a593Smuzhiyun 			regf70_value = odm_get_bb_reg(dm, R_0xf70, MASKDWORD);
1012*4882a593Smuzhiyun 			regf74_value = odm_get_bb_reg(dm, R_0xf74, MASKDWORD);
1013*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS,
1014*4882a593Smuzhiyun 				  "0xf54[%08x] 0xf58[%08x] 0xf5c[%08x] 0xf70[%08x] 0xf74[%08x]\n",
1015*4882a593Smuzhiyun 				  regf54_value, regf58_value, regf5c_value,
1016*4882a593Smuzhiyun 				  regf70_value, regf74_value);
1017*4882a593Smuzhiyun 		} else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
1018*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS,
1019*4882a593Smuzhiyun 				  "Init_Gain[%x] st_l2h_cur[%x] 0x2dbc[%08x] short_pulse_cnt_inc[%d] long_pulse_cnt_inc[%d]\n",
1020*4882a593Smuzhiyun 				  dfs->igi_cur, dfs->st_l2h_cur,
1021*4882a593Smuzhiyun 				  radar_rpt_reg_value, short_pulse_cnt_inc,
1022*4882a593Smuzhiyun 				  long_pulse_cnt_inc);
1023*4882a593Smuzhiyun 		#if (RTL8812F_SUPPORT || RTL8822C_SUPPORT || RTL8814B_SUPPORT)
1024*4882a593Smuzhiyun 			rega40_value = odm_get_bb_reg(dm, R_0xa40, MASKDWORD);
1025*4882a593Smuzhiyun 			rega44_value = odm_get_bb_reg(dm, R_0xa44, MASKDWORD);
1026*4882a593Smuzhiyun 			rega48_value = odm_get_bb_reg(dm, R_0xa48, MASKDWORD);
1027*4882a593Smuzhiyun 			rega4c_value = odm_get_bb_reg(dm, R_0xa4c, MASKDWORD);
1028*4882a593Smuzhiyun 			rega50_value = odm_get_bb_reg(dm, R_0xa50, MASKDWORD);
1029*4882a593Smuzhiyun 			rega54_value = odm_get_bb_reg(dm, R_0xa54, MASKDWORD);
1030*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS,
1031*4882a593Smuzhiyun 				  "0xa40[%08x] 0xa44[%08x] 0xa48[%08x] 0xa4c[%08x] 0xa50[%08x] 0xa54[%08x]\n",
1032*4882a593Smuzhiyun 				  rega40_value, rega44_value, rega48_value,
1033*4882a593Smuzhiyun 				  rega4c_value, rega50_value, rega54_value);
1034*4882a593Smuzhiyun 		#endif
1035*4882a593Smuzhiyun 		} else {
1036*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS,
1037*4882a593Smuzhiyun 				  "Init_Gain[%x] 0x91c[%x] 0xf98[%08x] short_pulse_cnt_inc[%d] long_pulse_cnt_inc[%d]\n",
1038*4882a593Smuzhiyun 				  dfs->igi_cur, dfs->st_l2h_cur, regf98_value,
1039*4882a593Smuzhiyun 				  short_pulse_cnt_inc, long_pulse_cnt_inc);
1040*4882a593Smuzhiyun 			reg918_value = odm_get_bb_reg(dm, R_0x918,
1041*4882a593Smuzhiyun 						      0xffffffff);
1042*4882a593Smuzhiyun 			reg91c_value = odm_get_bb_reg(dm, R_0x91c,
1043*4882a593Smuzhiyun 						      0xffffffff);
1044*4882a593Smuzhiyun 			reg920_value = odm_get_bb_reg(dm, R_0x920,
1045*4882a593Smuzhiyun 						      0xffffffff);
1046*4882a593Smuzhiyun 			reg924_value = odm_get_bb_reg(dm, R_0x924,
1047*4882a593Smuzhiyun 						      0xffffffff);
1048*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS,
1049*4882a593Smuzhiyun 				  "0x918[%08x] 0x91c[%08x] 0x920[%08x] 0x924[%08x]\n",
1050*4882a593Smuzhiyun 				  reg918_value, reg91c_value,
1051*4882a593Smuzhiyun 				  reg920_value, reg924_value);
1052*4882a593Smuzhiyun 		}
1053*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "Throughput: %dMbps\n",
1054*4882a593Smuzhiyun 			  (dm->rx_tp + dm->tx_tp));
1055*4882a593Smuzhiyun 
1056*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS,
1057*4882a593Smuzhiyun 			  "dfs_regdomain = %d, dbg_mode = %d, idle_mode = %d, print_hist_rpt = %d, hist_cond_on = %d\n",
1058*4882a593Smuzhiyun 			  region_domain, dfs->dbg_mode,
1059*4882a593Smuzhiyun 			  dfs->idle_mode, dfs->print_hist_rpt,
1060*4882a593Smuzhiyun 			  dfs->hist_cond_on);
1061*4882a593Smuzhiyun 	}
1062*4882a593Smuzhiyun 	if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
1063*4882a593Smuzhiyun 		tri_short_pulse = (radar_rpt_reg_value & BIT(20)) ? 1 : 0;
1064*4882a593Smuzhiyun 		tri_long_pulse = (radar_rpt_reg_value & BIT(28)) ? 1 : 0;
1065*4882a593Smuzhiyun 	} else {
1066*4882a593Smuzhiyun 		tri_short_pulse = (regf98_value & BIT(17)) ? 1 : 0;
1067*4882a593Smuzhiyun 		tri_long_pulse = (regf98_value & BIT(19)) ? 1 : 0;
1068*4882a593Smuzhiyun 	}
1069*4882a593Smuzhiyun 
1070*4882a593Smuzhiyun 	if (tri_long_pulse){
1071*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "\n");
1072*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "tri_long_pulse = %d\n", tri_long_pulse);
1073*4882a593Smuzhiyun 		dfs->pulse_flag_hist[dfs->mask_idx] = 1;
1074*4882a593Smuzhiyun 		dfs->pulse_type_hist[dfs->mask_idx] = 1;
1075*4882a593Smuzhiyun 		}
1076*4882a593Smuzhiyun 
1077*4882a593Smuzhiyun 	else if (tri_short_pulse){
1078*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "\n");
1079*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "tri_short_pulse = %d\n", tri_short_pulse);
1080*4882a593Smuzhiyun 		dfs->pulse_flag_hist[dfs->mask_idx] = 1;
1081*4882a593Smuzhiyun 		dfs->pulse_type_hist[dfs->mask_idx] = 0;
1082*4882a593Smuzhiyun 		}
1083*4882a593Smuzhiyun 
1084*4882a593Smuzhiyun 	else{
1085*4882a593Smuzhiyun 		dfs->pulse_flag_hist[dfs->mask_idx] = 0;
1086*4882a593Smuzhiyun 		dfs->pulse_type_hist[dfs->mask_idx] = 0;
1087*4882a593Smuzhiyun 		}
1088*4882a593Smuzhiyun 
1089*4882a593Smuzhiyun 
1090*4882a593Smuzhiyun 
1091*4882a593Smuzhiyun 	if (tri_short_pulse) {
1092*4882a593Smuzhiyun 		if (!(dm->support_ic_type & ODM_IC_JGR3_SERIES))
1093*4882a593Smuzhiyun 			phydm_radar_detect_reset(dm);
1094*4882a593Smuzhiyun 	}
1095*4882a593Smuzhiyun 	if (tri_long_pulse) {
1096*4882a593Smuzhiyun 		/*
1097*4882a593Smuzhiyun 		if (!(dm->support_ic_type & ODM_IC_JGR3_SERIES))
1098*4882a593Smuzhiyun 			phydm_radar_detect_reset(dm);
1099*4882a593Smuzhiyun 		*/
1100*4882a593Smuzhiyun 		if (region_domain == PHYDM_DFS_DOMAIN_MKK) {
1101*4882a593Smuzhiyun 			if (c_channel >= 52 && c_channel <= 64) {
1102*4882a593Smuzhiyun 				tri_long_pulse = 0;
1103*4882a593Smuzhiyun 			}
1104*4882a593Smuzhiyun 		}
1105*4882a593Smuzhiyun 		if (region_domain == PHYDM_DFS_DOMAIN_ETSI) {
1106*4882a593Smuzhiyun 			tri_long_pulse = 0;
1107*4882a593Smuzhiyun 		}
1108*4882a593Smuzhiyun 	}
1109*4882a593Smuzhiyun 
1110*4882a593Smuzhiyun 	st_l2h_new = dfs->st_l2h_cur;
1111*4882a593Smuzhiyun #if (RTL8723F_SUPPORT||RTL8822C_SUPPORT)
1112*4882a593Smuzhiyun 	if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
1113*4882a593Smuzhiyun 		if (dfs->pulse_type_hist[dfs->mask_idx])
1114*4882a593Smuzhiyun 			dfs->radar_type = 1;
1115*4882a593Smuzhiyun 		else
1116*4882a593Smuzhiyun 			dfs->radar_type = 0;
1117*4882a593Smuzhiyun 
1118*4882a593Smuzhiyun 		if (dfs->pulse_flag_hist[dfs->mask_idx]) {
1119*4882a593Smuzhiyun 			if (dfs->det_jar3_en)
1120*4882a593Smuzhiyun 				phydm_dfs_rpt_distinguish(dm);
1121*4882a593Smuzhiyun 			phydm_radar_detect_reset(dm);
1122*4882a593Smuzhiyun 		}
1123*4882a593Smuzhiyun 	}
1124*4882a593Smuzhiyun #endif
1125*4882a593Smuzhiyun 
1126*4882a593Smuzhiyun 	/* PSD(not ready) */
1127*4882a593Smuzhiyun 
1128*4882a593Smuzhiyun 	fault_flag_det = 0;
1129*4882a593Smuzhiyun 	fault_flag_psd = 0;
1130*4882a593Smuzhiyun 	fa_flag = 0;
1131*4882a593Smuzhiyun 	if (region_domain == PHYDM_DFS_DOMAIN_ETSI) {
1132*4882a593Smuzhiyun 		fa_mask_th = dfs->fa_mask_th + 20;
1133*4882a593Smuzhiyun 	} else {
1134*4882a593Smuzhiyun 		fa_mask_th = dfs->fa_mask_th;
1135*4882a593Smuzhiyun 	}
1136*4882a593Smuzhiyun 	if (total_fa_in_hist >= fa_mask_th || dfs->igi_cur >= 0x30) {
1137*4882a593Smuzhiyun 		/* st_l2h_new = dfs->st_l2h_max; */
1138*4882a593Smuzhiyun 		dfs->radar_det_mask_hist[index] = 1;
1139*4882a593Smuzhiyun 		if (dfs->pulse_flag_hist[index] == 1) {
1140*4882a593Smuzhiyun 			dfs->pulse_flag_hist[index] = 0;
1141*4882a593Smuzhiyun 			if (dfs->det_print2) {
1142*4882a593Smuzhiyun 				PHYDM_DBG(dm, DBG_DFS,
1143*4882a593Smuzhiyun 					  "Radar is masked : FA mask\n");
1144*4882a593Smuzhiyun 			}
1145*4882a593Smuzhiyun 		}
1146*4882a593Smuzhiyun 		fa_flag = 1;
1147*4882a593Smuzhiyun 	} else {
1148*4882a593Smuzhiyun 		dfs->radar_det_mask_hist[index] = 0;
1149*4882a593Smuzhiyun 	}
1150*4882a593Smuzhiyun 
1151*4882a593Smuzhiyun 	if (dfs->det_print) {
1152*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "mask_idx: %d\n", dfs->mask_idx);
1153*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "radar_det_mask_hist: ");
1154*4882a593Smuzhiyun 		for (i = 0; i < 5; i++)
1155*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "%d ",
1156*4882a593Smuzhiyun 				  dfs->radar_det_mask_hist[i]);
1157*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "pulse_flag_hist: ");
1158*4882a593Smuzhiyun 		for (i = 0; i < 5; i++)
1159*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "%d ", dfs->pulse_flag_hist[i]);
1160*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "fa_inc_hist: ");
1161*4882a593Smuzhiyun 		for (i = 0; i < 5; i++)
1162*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "%d ", dfs->fa_inc_hist[i]);
1163*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS,
1164*4882a593Smuzhiyun 			  "\nfa_mask_th: %d, total_fa_in_hist: %d ",
1165*4882a593Smuzhiyun 			  fa_mask_th, total_fa_in_hist);
1166*4882a593Smuzhiyun 	}
1167*4882a593Smuzhiyun 
1168*4882a593Smuzhiyun 	sum = 0;
1169*4882a593Smuzhiyun 	for (k = 0; k < 5; k++) {
1170*4882a593Smuzhiyun 		if (dfs->radar_det_mask_hist[k] == 1)
1171*4882a593Smuzhiyun 			sum++;
1172*4882a593Smuzhiyun 	}
1173*4882a593Smuzhiyun 
1174*4882a593Smuzhiyun 	if (dfs->mask_hist_checked <= 5)
1175*4882a593Smuzhiyun 		dfs->mask_hist_checked++;
1176*4882a593Smuzhiyun 
1177*4882a593Smuzhiyun 	if (dfs->mask_hist_checked >= 5 && dfs->pulse_flag_hist[dfs->mask_idx]) {
1178*4882a593Smuzhiyun 		if (sum <= 2) {
1179*4882a593Smuzhiyun 			if (dfs->hist_cond_on) {
1180*4882a593Smuzhiyun 				/*return the value from hist_radar_detected*/
1181*4882a593Smuzhiyun 				radar_detected = phydm_dfs_hist_log(dm, index);
1182*4882a593Smuzhiyun 			} else if (dfs->det_jar3_en) {
1183*4882a593Smuzhiyun 				if (dfs->nhm_dfs_flag || dfs->b_flag) {
1184*4882a593Smuzhiyun 					radar_detected = false;
1185*4882a593Smuzhiyun 				} else if (dfs->pw_flag && dfs->pri_flag &&
1186*4882a593Smuzhiyun 					   dfs->loct_flag) {
1187*4882a593Smuzhiyun 					PHYDM_DBG(dm, DBG_DFS, "Detected type %d radar signal!\n",
1188*4882a593Smuzhiyun 						  dfs->radar_type);
1189*4882a593Smuzhiyun 					radar_detected = true;
1190*4882a593Smuzhiyun 				}
1191*4882a593Smuzhiyun 			} else {
1192*4882a593Smuzhiyun 				if (dfs->pulse_type_hist[dfs->mask_idx] == 0)
1193*4882a593Smuzhiyun 					dfs->radar_type = 0;
1194*4882a593Smuzhiyun 				else if (dfs->pulse_type_hist[dfs->mask_idx] == 1)
1195*4882a593Smuzhiyun 					dfs->radar_type = 1;
1196*4882a593Smuzhiyun 				radar_detected = true;
1197*4882a593Smuzhiyun 				PHYDM_DBG(dm, DBG_DFS,
1198*4882a593Smuzhiyun 					  "Detected type %d radar signal!\n",
1199*4882a593Smuzhiyun 					  dfs->radar_type);
1200*4882a593Smuzhiyun 			}
1201*4882a593Smuzhiyun 		} else {
1202*4882a593Smuzhiyun 			fault_flag_det = 1;
1203*4882a593Smuzhiyun 			if (dfs->det_print2) {
1204*4882a593Smuzhiyun 				PHYDM_DBG(dm, DBG_DFS,
1205*4882a593Smuzhiyun 					  "Radar is masked : mask_hist large than thd\n");
1206*4882a593Smuzhiyun 			}
1207*4882a593Smuzhiyun 		}
1208*4882a593Smuzhiyun 	}
1209*4882a593Smuzhiyun 
1210*4882a593Smuzhiyun 	dfs->mask_idx++;
1211*4882a593Smuzhiyun 	if (dfs->mask_idx == 5)
1212*4882a593Smuzhiyun 		dfs->mask_idx = 0;
1213*4882a593Smuzhiyun 
1214*4882a593Smuzhiyun 	if (fault_flag_det == 0 && fault_flag_psd == 0 && fa_flag == 0) {
1215*4882a593Smuzhiyun 		if (dfs->igi_cur < 0x30) {
1216*4882a593Smuzhiyun 			st_l2h_new = dfs->st_l2h_min;
1217*4882a593Smuzhiyun 		}
1218*4882a593Smuzhiyun 	}
1219*4882a593Smuzhiyun 
1220*4882a593Smuzhiyun 	if (st_l2h_new != dfs->st_l2h_cur) {
1221*4882a593Smuzhiyun 		if (st_l2h_new < dfs->st_l2h_min) {
1222*4882a593Smuzhiyun 			dfs->st_l2h_cur = dfs->st_l2h_min;
1223*4882a593Smuzhiyun 		} else if (st_l2h_new > dfs->st_l2h_max)
1224*4882a593Smuzhiyun 			dfs->st_l2h_cur = dfs->st_l2h_max;
1225*4882a593Smuzhiyun 		else
1226*4882a593Smuzhiyun 			dfs->st_l2h_cur = st_l2h_new;
1227*4882a593Smuzhiyun 		/*odm_set_bb_reg(dm, R_0x91c, 0xff, dfs->st_l2h_cur);*/
1228*4882a593Smuzhiyun 
1229*4882a593Smuzhiyun 		dfs->pwdb_th_cur = ((int)dfs->st_l2h_cur - (int)dfs->igi_cur)
1230*4882a593Smuzhiyun 				    / 2 + dfs->pwdb_scalar_factor;
1231*4882a593Smuzhiyun 
1232*4882a593Smuzhiyun 		/*@limit the pwdb value to absolute lower bound 8*/
1233*4882a593Smuzhiyun 		dfs->pwdb_th_cur = MAX_2(dfs->pwdb_th_cur, (int)dfs->pwdb_th);
1234*4882a593Smuzhiyun 
1235*4882a593Smuzhiyun 		/*@limit the pwdb value to absolute upper bound 0x1f*/
1236*4882a593Smuzhiyun 		dfs->pwdb_th_cur = MIN_2(dfs->pwdb_th_cur, 0x1f);
1237*4882a593Smuzhiyun 
1238*4882a593Smuzhiyun 		if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
1239*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa50, 0x000000f0,
1240*4882a593Smuzhiyun 				       dfs->pwdb_th_cur);
1241*4882a593Smuzhiyun 		#if (RTL8721D_SUPPORT)
1242*4882a593Smuzhiyun 		else if (dm->support_ic_type & ODM_RTL8721D) {
1243*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xf54, 0x0000001f,
1244*4882a593Smuzhiyun 				       ((dfs->st_l2h_cur & 0x0000007c) >> 2));
1245*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xf58, 0xc0000000,
1246*4882a593Smuzhiyun 				       (dfs->st_l2h_cur & 0x00000003));
1247*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xf70, 0x03c00000,
1248*4882a593Smuzhiyun 				       dfs->pwdb_th_cur);
1249*4882a593Smuzhiyun 		}
1250*4882a593Smuzhiyun 		#endif
1251*4882a593Smuzhiyun 		else
1252*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x918, 0x00001f00,
1253*4882a593Smuzhiyun 				       dfs->pwdb_th_cur);
1254*4882a593Smuzhiyun 	}
1255*4882a593Smuzhiyun 
1256*4882a593Smuzhiyun 	if (dfs->det_print) {
1257*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS,
1258*4882a593Smuzhiyun 			  "fault_flag_det[%d], fault_flag_psd[%d], DFS_detected [%d]\n",
1259*4882a593Smuzhiyun 			  fault_flag_det, fault_flag_psd, radar_detected);
1260*4882a593Smuzhiyun 	}
1261*4882a593Smuzhiyun 	#if (RTL8721D_SUPPORT)
1262*4882a593Smuzhiyun 	if (dm->support_ic_type & (ODM_RTL8721D))
1263*4882a593Smuzhiyun 		odm_set_bb_reg(dm, R_0x908, MASKDWORD, reg908_value);
1264*4882a593Smuzhiyun 	#endif
1265*4882a593Smuzhiyun 
1266*4882a593Smuzhiyun 	return radar_detected;
1267*4882a593Smuzhiyun }
1268*4882a593Smuzhiyun #if (RTL8723F_SUPPORT || RTL8822C_SUPPORT)
phydm_dfs_rpt_distinguish(void * dm_void)1269*4882a593Smuzhiyun void phydm_dfs_rpt_distinguish(void *dm_void)
1270*4882a593Smuzhiyun {
1271*4882a593Smuzhiyun 	struct dm_struct *dm = (struct dm_struct *)dm_void;
1272*4882a593Smuzhiyun 	struct _DFS_STATISTICS *dfs = &dm->dfs;
1273*4882a593Smuzhiyun 	struct ccx_info *ccx = &dm->dm_ccx_info;
1274*4882a593Smuzhiyun 
1275*4882a593Smuzhiyun 	u8 region_domain = dm->dfs_region_domain;
1276*4882a593Smuzhiyun 	u8 c_channel = *dm->channel;
1277*4882a593Smuzhiyun 	u8 band_width = *dm->band_width;
1278*4882a593Smuzhiyun 
1279*4882a593Smuzhiyun 	u32 reg_2e08, reg_2e24, reg_2e28, reg_2e2c, reg_2e30, reg_2e34;
1280*4882a593Smuzhiyun 	u32 reg_2e0c, reg_2e10, reg_2e20;
1281*4882a593Smuzhiyun 	u16 pw_rpt_set[12] = {0}, pri_rpt_set[12] = {0};
1282*4882a593Smuzhiyun 	s8 loct_rpt_set[12] = {0};
1283*4882a593Smuzhiyun 	u8 pw_lth[10] = {255,255,255,255,255,255,255,255,255,255};
1284*4882a593Smuzhiyun        u16 pw_uth[10] = {255,255,255,255,255,255,255,255,255,255};
1285*4882a593Smuzhiyun        u8 pri_lth[10] = {255,255,255,255,255,255,255,255,255,255};
1286*4882a593Smuzhiyun        u8 pri_uth[10] = {255,255,255,255,255,255,255,255,255,255};
1287*4882a593Smuzhiyun 	u8 pri_vd_max = 0, pri_vd_min = 255, rdr_tmp = 0;
1288*4882a593Smuzhiyun 	u8 i, j, dc_cnt = 0, rdr_num = 0, rdr_cnt[10] = {0};
1289*4882a593Smuzhiyun 	u8 short_cnt_th, long_cnt_th, loop_cnt, cnt_th, loct_diff = 0;
1290*4882a593Smuzhiyun 	u8 pri_var_up, pri_var_low, pri_cnt_tmp, pri_cnt_fnl = 0;
1291*4882a593Smuzhiyun 	u8 pri_cnt_th = dfs->pri_cnt_th;
1292*4882a593Smuzhiyun 
1293*4882a593Smuzhiyun 	/* PW : Wordlength : U(8,0) , unit: 400ns */
1294*4882a593Smuzhiyun 	reg_2e08 = odm_get_bb_reg(dm, 0x2e08, 0xffffffff);
1295*4882a593Smuzhiyun 	pw_rpt_set[0]=(unsigned int)(reg_2e08 & 0x000000ff);
1296*4882a593Smuzhiyun 	pw_rpt_set[1]=(unsigned int)((reg_2e08 & 0x0000ff00)>>8);
1297*4882a593Smuzhiyun 	pw_rpt_set[2]=(unsigned int)((reg_2e08 & 0x00ff0000)>>16);
1298*4882a593Smuzhiyun 	pw_rpt_set[3]=(unsigned int)((reg_2e08 & 0xff000000)>>24);
1299*4882a593Smuzhiyun 	reg_2e24 = odm_get_bb_reg(dm, 0x2e24, 0xffffffff);
1300*4882a593Smuzhiyun 	pw_rpt_set[4]=(unsigned int)(reg_2e24 & 0x000000ff);
1301*4882a593Smuzhiyun 	pw_rpt_set[5]=(unsigned int)((reg_2e24 & 0x0000ff00)>>8);
1302*4882a593Smuzhiyun 	pw_rpt_set[6]=(unsigned int)((reg_2e24 & 0x00ff0000)>>16);
1303*4882a593Smuzhiyun 	pw_rpt_set[7]=(unsigned int)((reg_2e24 & 0xff000000)>>24);
1304*4882a593Smuzhiyun 	reg_2e28 = odm_get_bb_reg(dm, 0x2e28, 0xffffffff);
1305*4882a593Smuzhiyun 	pw_rpt_set[8]=(unsigned int)(reg_2e28 & 0x000000ff);
1306*4882a593Smuzhiyun 	pw_rpt_set[9]=(unsigned int)((reg_2e28 & 0x0000ff00)>>8);
1307*4882a593Smuzhiyun 	pw_rpt_set[10]=(unsigned int)((reg_2e28 & 0x00ff0000)>>16);
1308*4882a593Smuzhiyun 	pw_rpt_set[11]=(unsigned int)((reg_2e28 & 0xff000000)>>24);
1309*4882a593Smuzhiyun 
1310*4882a593Smuzhiyun 	/* PRI : Wordlength : U(8,0) , unit: 25.6us */
1311*4882a593Smuzhiyun 	reg_2e2c = odm_get_bb_reg(dm, 0x2e2c, 0xffffffff);
1312*4882a593Smuzhiyun 	pri_rpt_set[0]=(unsigned int)(reg_2e2c & 0x000000ff);
1313*4882a593Smuzhiyun 	pri_rpt_set[1]=(unsigned int)((reg_2e2c & 0x0000ff00)>>8);
1314*4882a593Smuzhiyun 	pri_rpt_set[2]=(unsigned int)((reg_2e2c & 0x00ff0000)>>16);
1315*4882a593Smuzhiyun 	pri_rpt_set[3]=(unsigned int)((reg_2e2c & 0xff000000)>>24);
1316*4882a593Smuzhiyun 	reg_2e30 = odm_get_bb_reg(dm, 0x2e30, 0xffffffff);
1317*4882a593Smuzhiyun 	pri_rpt_set[4]=(unsigned int)(reg_2e30 & 0x000000ff);
1318*4882a593Smuzhiyun 	pri_rpt_set[5]=(unsigned int)((reg_2e30 & 0x0000ff00)>>8);
1319*4882a593Smuzhiyun 	pri_rpt_set[6]=(unsigned int)((reg_2e30 & 0x00ff0000)>>16);
1320*4882a593Smuzhiyun 	pri_rpt_set[7]=(unsigned int)((reg_2e30 & 0xff000000)>>24);
1321*4882a593Smuzhiyun 	reg_2e34 = odm_get_bb_reg(dm, 0x2e34, 0xffffffff);
1322*4882a593Smuzhiyun 	pri_rpt_set[8]=(unsigned int)(reg_2e34 & 0x000000ff);
1323*4882a593Smuzhiyun 	pri_rpt_set[9]=(unsigned int)((reg_2e34 & 0x0000ff00)>>8);
1324*4882a593Smuzhiyun 	pri_rpt_set[10]=(unsigned int)((reg_2e34 & 0x00ff0000)>>16);
1325*4882a593Smuzhiyun 	pri_rpt_set[11]=(unsigned int)((reg_2e34 & 0xff000000)>>24);
1326*4882a593Smuzhiyun 
1327*4882a593Smuzhiyun 	/* Location : Wordlength : S(8,0) , unit: MHz */
1328*4882a593Smuzhiyun 	reg_2e0c = odm_get_bb_reg(dm, 0x2e0c, 0xffffffff);
1329*4882a593Smuzhiyun 	loct_rpt_set[0]=(signed char)(reg_2e0c & 0x000000ff);
1330*4882a593Smuzhiyun 	loct_rpt_set[1]=(signed char)((reg_2e0c & 0x0000ff00)>>8);
1331*4882a593Smuzhiyun 	loct_rpt_set[2]=(signed char)((reg_2e0c & 0x00ff0000)>>16);
1332*4882a593Smuzhiyun 	loct_rpt_set[3]=(signed char)((reg_2e0c & 0xff000000)>>24);
1333*4882a593Smuzhiyun 	reg_2e10 = odm_get_bb_reg(dm, 0x2e10, 0xffffffff);
1334*4882a593Smuzhiyun 	loct_rpt_set[4]=(signed char)(reg_2e10 & 0x000000ff);
1335*4882a593Smuzhiyun 	loct_rpt_set[5]=(signed char)((reg_2e10 & 0x0000ff00)>>8);
1336*4882a593Smuzhiyun 	loct_rpt_set[6]=(signed char)((reg_2e10 & 0x00ff0000)>>16);
1337*4882a593Smuzhiyun 	loct_rpt_set[7]=(signed char)((reg_2e10 & 0xff000000)>>24);
1338*4882a593Smuzhiyun 	reg_2e20 = odm_get_bb_reg(dm, 0x2e20, 0xffffffff);
1339*4882a593Smuzhiyun 	loct_rpt_set[8]=(signed char)(reg_2e20 & 0x000000ff);
1340*4882a593Smuzhiyun 	loct_rpt_set[9]=(signed char)((reg_2e20 & 0x0000ff00)>>8);
1341*4882a593Smuzhiyun 	loct_rpt_set[10]=(signed char)((reg_2e20 & 0x00ff0000)>>16);
1342*4882a593Smuzhiyun 	loct_rpt_set[11]=(signed char)((reg_2e20 & 0xff000000)>>24);
1343*4882a593Smuzhiyun 
1344*4882a593Smuzhiyun 	dfs->pw_flag = false;
1345*4882a593Smuzhiyun 	dfs->loct_flag = false;
1346*4882a593Smuzhiyun 	dfs->pri_flag = false;
1347*4882a593Smuzhiyun 	for (i = 0; i < 12; i++) {
1348*4882a593Smuzhiyun 		dfs->pw_rslt[i] = 0;
1349*4882a593Smuzhiyun 		dfs->loct_rslt[i] = 0;
1350*4882a593Smuzhiyun 		dfs->pri_rslt[i] = 0;
1351*4882a593Smuzhiyun 	}
1352*4882a593Smuzhiyun 
1353*4882a593Smuzhiyun 	// for NHMxDFS //
1354*4882a593Smuzhiyun 	dfs->nhm_dfs_cnt = 0;
1355*4882a593Smuzhiyun 	dfs->nhm_dfs_flag = false;
1356*4882a593Smuzhiyun 	dfs->b_flag = false;
1357*4882a593Smuzhiyun 
1358*4882a593Smuzhiyun 	short_cnt_th = (u8)odm_get_bb_reg(dm, 0xa50, 0x00f00000);
1359*4882a593Smuzhiyun 	long_cnt_th = (u8)odm_get_bb_reg(dm, 0xa4c, 0xf0000000);
1360*4882a593Smuzhiyun 
1361*4882a593Smuzhiyun 	if (dfs->radar_type)
1362*4882a593Smuzhiyun 		loop_cnt = long_cnt_th + 2;
1363*4882a593Smuzhiyun 	else
1364*4882a593Smuzhiyun 		loop_cnt = short_cnt_th  + 2;
1365*4882a593Smuzhiyun 
1366*4882a593Smuzhiyun 	if (region_domain == PHYDM_DFS_DOMAIN_ETSI)
1367*4882a593Smuzhiyun 		loop_cnt = short_cnt_th  + 2;
1368*4882a593Smuzhiyun 
1369*4882a593Smuzhiyun 	if (loop_cnt > 12)
1370*4882a593Smuzhiyun 		loop_cnt = 12;
1371*4882a593Smuzhiyun 
1372*4882a593Smuzhiyun 	cnt_th = loop_cnt / 2;
1373*4882a593Smuzhiyun 
1374*4882a593Smuzhiyun 	/* Calculate the difference between each element (1st Not calculated) */
1375*4882a593Smuzhiyun 	for(i = 0; i < loop_cnt; i++)
1376*4882a593Smuzhiyun 		dfs->loct_rslt[i] = loct_rpt_set[i];
1377*4882a593Smuzhiyun 	for(i = 1; i < loop_cnt; i++)
1378*4882a593Smuzhiyun 		loct_diff = loct_diff + abs(dfs->loct_rslt[i] - dfs->loct_rslt[i-1]);
1379*4882a593Smuzhiyun 
1380*4882a593Smuzhiyun 	for (i = 0; i < loop_cnt; i++) {
1381*4882a593Smuzhiyun 		if ((-2 < loct_rpt_set[i]) && (loct_rpt_set[i] < 2))
1382*4882a593Smuzhiyun 			dc_cnt++;
1383*4882a593Smuzhiyun 	}
1384*4882a593Smuzhiyun 
1385*4882a593Smuzhiyun 	if (region_domain == PHYDM_DFS_DOMAIN_FCC){
1386*4882a593Smuzhiyun 		rdr_num = 7;
1387*4882a593Smuzhiyun 
1388*4882a593Smuzhiyun 		pw_lth[0]=2;
1389*4882a593Smuzhiyun 		pw_lth[1]=2;
1390*4882a593Smuzhiyun 		pw_lth[2]=2;
1391*4882a593Smuzhiyun 		pw_lth[3]=12;
1392*4882a593Smuzhiyun 		pw_lth[4]=22;
1393*4882a593Smuzhiyun 		pw_lth[5]=120;
1394*4882a593Smuzhiyun 		pw_lth[6]=2;
1395*4882a593Smuzhiyun 
1396*4882a593Smuzhiyun 		pw_uth[0]=3;
1397*4882a593Smuzhiyun 		pw_uth[1]=3;
1398*4882a593Smuzhiyun 		pw_uth[2]=15;
1399*4882a593Smuzhiyun 		pw_uth[3]=30;
1400*4882a593Smuzhiyun 		pw_uth[4]=60;
1401*4882a593Smuzhiyun 		pw_uth[5]=253;
1402*4882a593Smuzhiyun 		pw_uth[6]=3;
1403*4882a593Smuzhiyun 
1404*4882a593Smuzhiyun 		pri_lth[0]=50;
1405*4882a593Smuzhiyun 		pri_lth[1]=18;
1406*4882a593Smuzhiyun 		pri_lth[2]=5;
1407*4882a593Smuzhiyun 		pri_lth[3]=7;
1408*4882a593Smuzhiyun 		pri_lth[4]=7;
1409*4882a593Smuzhiyun 		pri_lth[5]=38;
1410*4882a593Smuzhiyun 		pri_lth[6]=11;
1411*4882a593Smuzhiyun 
1412*4882a593Smuzhiyun 		pri_uth[0]=62;
1413*4882a593Smuzhiyun 		pri_uth[1]=130;
1414*4882a593Smuzhiyun 		pri_uth[2]=10;
1415*4882a593Smuzhiyun 		pri_uth[3]=21;
1416*4882a593Smuzhiyun 		pri_uth[4]=21;
1417*4882a593Smuzhiyun 		pri_uth[5]=80;
1418*4882a593Smuzhiyun 		pri_uth[6]=15;
1419*4882a593Smuzhiyun 		if (dc_cnt > dfs->dc_cnt_th){
1420*4882a593Smuzhiyun 			pw_lth[0] = 0;
1421*4882a593Smuzhiyun 			pw_lth[1] = 0;
1422*4882a593Smuzhiyun 			pw_lth[2] = 0;
1423*4882a593Smuzhiyun 			pw_lth[3] = 0;
1424*4882a593Smuzhiyun 			pw_lth[4] = 0;
1425*4882a593Smuzhiyun 			pw_lth[5] = 80;
1426*4882a593Smuzhiyun 			pw_lth[6] = 0;
1427*4882a593Smuzhiyun 			}
1428*4882a593Smuzhiyun 		}
1429*4882a593Smuzhiyun 	else if (region_domain == PHYDM_DFS_DOMAIN_MKK){
1430*4882a593Smuzhiyun 		rdr_num = 8;
1431*4882a593Smuzhiyun 		if (c_channel >= 52 && c_channel <= 64){
1432*4882a593Smuzhiyun 			dfs->loct_diff_th = dfs->loct_diff_th + 15;
1433*4882a593Smuzhiyun 			pw_lth[0]=1;
1434*4882a593Smuzhiyun 			pw_lth[1]=1;
1435*4882a593Smuzhiyun 			pw_lth[2]=1;
1436*4882a593Smuzhiyun 			pw_lth[3]=1;
1437*4882a593Smuzhiyun 			pw_lth[4]=1;
1438*4882a593Smuzhiyun 			pw_lth[5]=1;
1439*4882a593Smuzhiyun 			pw_lth[6]=1;
1440*4882a593Smuzhiyun 			pw_lth[7]=1;
1441*4882a593Smuzhiyun 
1442*4882a593Smuzhiyun 			pw_uth[0]=14;
1443*4882a593Smuzhiyun 			pw_uth[1]=40;
1444*4882a593Smuzhiyun 			pw_uth[2]=14;
1445*4882a593Smuzhiyun 			pw_uth[3]=40;
1446*4882a593Smuzhiyun 			pw_uth[4]=5;
1447*4882a593Smuzhiyun 			pw_uth[5]=5;
1448*4882a593Smuzhiyun 			pw_uth[6]=5;
1449*4882a593Smuzhiyun 			pw_uth[7]=5;
1450*4882a593Smuzhiyun 
1451*4882a593Smuzhiyun 			pri_lth[0]=35;
1452*4882a593Smuzhiyun 			pri_lth[1]=20;
1453*4882a593Smuzhiyun 			pri_lth[2]=35;
1454*4882a593Smuzhiyun 			pri_lth[3]=18;
1455*4882a593Smuzhiyun 			pri_lth[4]=32;
1456*4882a593Smuzhiyun 			pri_lth[5]=38;
1457*4882a593Smuzhiyun 			pri_lth[6]=40;
1458*4882a593Smuzhiyun 			pri_lth[7]=48;
1459*4882a593Smuzhiyun 
1460*4882a593Smuzhiyun 			pri_uth[0]=200;
1461*4882a593Smuzhiyun 			pri_uth[1]=200;
1462*4882a593Smuzhiyun 			pri_uth[2]=200;
1463*4882a593Smuzhiyun 			pri_uth[3]=200;
1464*4882a593Smuzhiyun 			pri_uth[4]=38;
1465*4882a593Smuzhiyun 			pri_uth[5]=44;
1466*4882a593Smuzhiyun 			pri_uth[6]=48;
1467*4882a593Smuzhiyun 			pri_uth[7]=55;
1468*4882a593Smuzhiyun 			if (dc_cnt > dfs->dc_cnt_th){
1469*4882a593Smuzhiyun 				pw_lth[0] = 0;
1470*4882a593Smuzhiyun 				pw_lth[1] = 0;
1471*4882a593Smuzhiyun 				pw_lth[2] = 0;
1472*4882a593Smuzhiyun 				pw_lth[3] = 0;
1473*4882a593Smuzhiyun 				pw_lth[4] = 0;
1474*4882a593Smuzhiyun 				pw_lth[5] = 0;
1475*4882a593Smuzhiyun 				pw_lth[6] = 0;
1476*4882a593Smuzhiyun 				pw_lth[7] = 0;
1477*4882a593Smuzhiyun 				cnt_th--;
1478*4882a593Smuzhiyun 				}
1479*4882a593Smuzhiyun 			}
1480*4882a593Smuzhiyun 		else{
1481*4882a593Smuzhiyun 			pw_lth[0]=1;
1482*4882a593Smuzhiyun 			pw_lth[1]=2;
1483*4882a593Smuzhiyun 			pw_lth[2]=4;
1484*4882a593Smuzhiyun 			pw_lth[3]=2;
1485*4882a593Smuzhiyun 			pw_lth[4]=12;
1486*4882a593Smuzhiyun 			pw_lth[5]=22;
1487*4882a593Smuzhiyun 			pw_lth[6]=100;
1488*4882a593Smuzhiyun 			pw_lth[7]=2;
1489*4882a593Smuzhiyun 
1490*4882a593Smuzhiyun 			pw_uth[0]=2;
1491*4882a593Smuzhiyun 			pw_uth[1]=3;
1492*4882a593Smuzhiyun 			pw_uth[2]=6;
1493*4882a593Smuzhiyun 			pw_uth[3]=15;
1494*4882a593Smuzhiyun 			pw_uth[4]=30;
1495*4882a593Smuzhiyun 			pw_uth[5]=60;
1496*4882a593Smuzhiyun 			pw_uth[6]=300;
1497*4882a593Smuzhiyun 			pw_uth[7]=3;
1498*4882a593Smuzhiyun 
1499*4882a593Smuzhiyun 			pri_lth[0]=33;
1500*4882a593Smuzhiyun 			pri_lth[1]=35;
1501*4882a593Smuzhiyun 			pri_lth[2]=130;
1502*4882a593Smuzhiyun 			pri_lth[3]=5;
1503*4882a593Smuzhiyun 			pri_lth[4]=7;
1504*4882a593Smuzhiyun 			pri_lth[5]=7;
1505*4882a593Smuzhiyun 			pri_lth[6]=35;
1506*4882a593Smuzhiyun 			pri_lth[7]=11;
1507*4882a593Smuzhiyun 
1508*4882a593Smuzhiyun 			pri_uth[0]=73;
1509*4882a593Smuzhiyun 			pri_uth[1]=75;
1510*4882a593Smuzhiyun 			pri_uth[2]=170;
1511*4882a593Smuzhiyun 			pri_uth[3]=10;
1512*4882a593Smuzhiyun 			pri_uth[4]=22;
1513*4882a593Smuzhiyun 			pri_uth[5]=22;
1514*4882a593Smuzhiyun 			pri_uth[6]=86;
1515*4882a593Smuzhiyun 			pri_uth[7]=15;
1516*4882a593Smuzhiyun 			if (dc_cnt > dfs->dc_cnt_th){
1517*4882a593Smuzhiyun 				pw_lth[0] = 0;
1518*4882a593Smuzhiyun 				pw_lth[1] = 0;
1519*4882a593Smuzhiyun 				pw_lth[2] = 0;
1520*4882a593Smuzhiyun 				pw_lth[3] = 0;
1521*4882a593Smuzhiyun 				pw_lth[4] = 0;
1522*4882a593Smuzhiyun 				pw_lth[5] = 0;
1523*4882a593Smuzhiyun 				pw_lth[6] = 80;
1524*4882a593Smuzhiyun 				pw_lth[7] = 0;
1525*4882a593Smuzhiyun 				}
1526*4882a593Smuzhiyun 			}
1527*4882a593Smuzhiyun 		}
1528*4882a593Smuzhiyun 	else if (region_domain == PHYDM_DFS_DOMAIN_ETSI){
1529*4882a593Smuzhiyun 		rdr_num = 6;
1530*4882a593Smuzhiyun 		pw_lth[0]=1;
1531*4882a593Smuzhiyun 		pw_lth[1]=1;
1532*4882a593Smuzhiyun 		pw_lth[2]=1;
1533*4882a593Smuzhiyun 		pw_lth[3]=40;
1534*4882a593Smuzhiyun 		pw_lth[4]=1;
1535*4882a593Smuzhiyun 		pw_lth[5]=1;
1536*4882a593Smuzhiyun 
1537*4882a593Smuzhiyun 		pw_uth[0]=15;
1538*4882a593Smuzhiyun 		pw_uth[1]=45;
1539*4882a593Smuzhiyun 		pw_uth[2]=45;
1540*4882a593Smuzhiyun 		pw_uth[3]=90;
1541*4882a593Smuzhiyun 		pw_uth[4]=6;
1542*4882a593Smuzhiyun 		pw_uth[5]=6;
1543*4882a593Smuzhiyun 
1544*4882a593Smuzhiyun 		pri_lth[0]=35;
1545*4882a593Smuzhiyun 		pri_lth[1]=21;
1546*4882a593Smuzhiyun 		pri_lth[2]=8;
1547*4882a593Smuzhiyun 		pri_lth[3]=8;
1548*4882a593Smuzhiyun 		pri_lth[4]=87;
1549*4882a593Smuzhiyun 		pri_lth[5]=29;
1550*4882a593Smuzhiyun 
1551*4882a593Smuzhiyun 		pri_uth[0]=215;
1552*4882a593Smuzhiyun 		pri_uth[1]=215;
1553*4882a593Smuzhiyun 		pri_uth[2]=19;
1554*4882a593Smuzhiyun 		pri_uth[3]=22;
1555*4882a593Smuzhiyun 		pri_uth[4]=144;
1556*4882a593Smuzhiyun 		pri_uth[5]=108;
1557*4882a593Smuzhiyun 		if (dc_cnt > dfs->dc_cnt_th){
1558*4882a593Smuzhiyun 			pw_lth[0] = 0;
1559*4882a593Smuzhiyun 			pw_lth[1] = 0;
1560*4882a593Smuzhiyun 			pw_lth[2] = 0;
1561*4882a593Smuzhiyun 			pw_lth[3] = 0;
1562*4882a593Smuzhiyun 			pw_lth[4] = 0;
1563*4882a593Smuzhiyun 			pw_lth[5] = 0;
1564*4882a593Smuzhiyun 			}
1565*4882a593Smuzhiyun 		}
1566*4882a593Smuzhiyun 
1567*4882a593Smuzhiyun 	for (i = 0; i < loop_cnt; i++) {
1568*4882a593Smuzhiyun 		dfs->pw_rslt[i] = (u8)pw_rpt_set[i];
1569*4882a593Smuzhiyun 		dfs->pri_rslt[i] = (u8)pri_rpt_set[i];
1570*4882a593Smuzhiyun 		for (j = 0; j < rdr_num; j++) {
1571*4882a593Smuzhiyun 			if (dfs->radar_type) {
1572*4882a593Smuzhiyun 				if ((pw_lth[j] <= dfs->pw_rslt[i]) && (dfs->pw_rslt[i] <= pw_uth[j]))
1573*4882a593Smuzhiyun 					rdr_cnt[j]++;
1574*4882a593Smuzhiyun 			} else {
1575*4882a593Smuzhiyun 				if ((pw_lth[j] <= dfs->pw_rslt[i]) && (dfs->pw_rslt[i] <= pw_uth[j]) &&
1576*4882a593Smuzhiyun 				    (pri_lth[j] <= dfs->pri_rslt[i]) && (dfs->pri_rslt[i] <= pri_uth[j])) {
1577*4882a593Smuzhiyun 					rdr_cnt[j]++;
1578*4882a593Smuzhiyun 					if (dfs->pri_rslt[i] > pri_vd_max)
1579*4882a593Smuzhiyun 						pri_vd_max = dfs->pri_rslt[i];
1580*4882a593Smuzhiyun 					if (dfs->pri_rslt[i] < pri_vd_min)
1581*4882a593Smuzhiyun 						pri_vd_min = dfs->pri_rslt[i];
1582*4882a593Smuzhiyun 				}
1583*4882a593Smuzhiyun 			}
1584*4882a593Smuzhiyun 		}
1585*4882a593Smuzhiyun 	}
1586*4882a593Smuzhiyun 
1587*4882a593Smuzhiyun 	/* Pattern Judgement */
1588*4882a593Smuzhiyun 	for (i = 0; i < rdr_num; i++){
1589*4882a593Smuzhiyun 		if (rdr_cnt[i] >= cnt_th){
1590*4882a593Smuzhiyun 			dfs->pw_flag = true;
1591*4882a593Smuzhiyun 			rdr_tmp = i;
1592*4882a593Smuzhiyun 			}
1593*4882a593Smuzhiyun 		}
1594*4882a593Smuzhiyun 
1595*4882a593Smuzhiyun 	/* Add NHM to decide the validity of the three flags */
1596*4882a593Smuzhiyun 	/* Use for chaotic open space */
1597*4882a593Smuzhiyun 	if (dfs->nhm_dfs_en) {
1598*4882a593Smuzhiyun 		for (i = 0; i <= (NHM_RPT_NUM - 1); i++) {
1599*4882a593Smuzhiyun 			if (ccx->nhm_result[i] > 0)
1600*4882a593Smuzhiyun 				break;
1601*4882a593Smuzhiyun 		}
1602*4882a593Smuzhiyun 		for (j = (i + 1); j <= (NHM_RPT_NUM - 1); j++) {
1603*4882a593Smuzhiyun 			if (ccx->nhm_result[j] > 0)
1604*4882a593Smuzhiyun 				dfs->nhm_dfs_cnt++;
1605*4882a593Smuzhiyun 		}
1606*4882a593Smuzhiyun 		if (dfs->nhm_dfs_cnt > dfs->nhm_cnt_th) {
1607*4882a593Smuzhiyun 			dfs->nhm_dfs_flag = true;
1608*4882a593Smuzhiyun 			cnt_th = loop_cnt;
1609*4882a593Smuzhiyun 		}
1610*4882a593Smuzhiyun 	}
1611*4882a593Smuzhiyun 	if (dm->support_ability & ODM_BB_ENV_MONITOR) {
1612*4882a593Smuzhiyun 		if ((100-((ccx->nhm_rpt_sum * 100) >> 8)) >= dfs->nhm_dty_th) {
1613*4882a593Smuzhiyun 			dfs->b_flag = true;
1614*4882a593Smuzhiyun 			cnt_th = loop_cnt;
1615*4882a593Smuzhiyun 		}
1616*4882a593Smuzhiyun 	}
1617*4882a593Smuzhiyun 
1618*4882a593Smuzhiyun 	/* Relax */
1619*4882a593Smuzhiyun 	if (!(dfs->idle_mode)) {
1620*4882a593Smuzhiyun 		pri_cnt_th--;
1621*4882a593Smuzhiyun 		if (!(region_domain == PHYDM_DFS_DOMAIN_ETSI)){
1622*4882a593Smuzhiyun 			dfs->pri_var_offset = 15;
1623*4882a593Smuzhiyun 			if (region_domain == PHYDM_DFS_DOMAIN_MKK)
1624*4882a593Smuzhiyun 				dfs->pri_var_offset = 5 + 10*pri_vd_min/20;
1625*4882a593Smuzhiyun 			}
1626*4882a593Smuzhiyun 		else
1627*4882a593Smuzhiyun 			dfs->pri_var_offset = dfs->pri_var_tp_offset;
1628*4882a593Smuzhiyun 	}
1629*4882a593Smuzhiyun 
1630*4882a593Smuzhiyun 	// Mode approximation for PRI
1631*4882a593Smuzhiyun 	for (i = 0; i < (loop_cnt - 1); i++) {
1632*4882a593Smuzhiyun 		pri_cnt_tmp = 0;
1633*4882a593Smuzhiyun 		for (j = 0; j < (loop_cnt - 1); j++) {
1634*4882a593Smuzhiyun 			if ((i == j) || (dfs->pri_rslt[i] <= 4))
1635*4882a593Smuzhiyun 				continue;
1636*4882a593Smuzhiyun 			if (dfs->pri_rslt[j] > (255 - dfs->pri_var_offset))
1637*4882a593Smuzhiyun 				pri_var_up = 255;
1638*4882a593Smuzhiyun 			else
1639*4882a593Smuzhiyun 				pri_var_up = dfs->pri_rslt[j] + dfs->pri_var_offset;
1640*4882a593Smuzhiyun 			if (dfs->pri_var_offset >= dfs->pri_rslt[j])
1641*4882a593Smuzhiyun 				pri_var_low = 0;
1642*4882a593Smuzhiyun 			else
1643*4882a593Smuzhiyun 				pri_var_low = dfs->pri_rslt[j] - dfs->pri_var_offset;
1644*4882a593Smuzhiyun 			if ((dfs->pri_rslt[i] <= pri_var_up) && (dfs->pri_rslt[i] >= pri_var_low) &&
1645*4882a593Smuzhiyun 			    (dfs->pri_rslt[i] <= pri_vd_max) && (dfs->pri_rslt[i] >= pri_vd_min))
1646*4882a593Smuzhiyun 				pri_cnt_tmp++;
1647*4882a593Smuzhiyun 		}
1648*4882a593Smuzhiyun 		if (pri_cnt_tmp > pri_cnt_fnl)
1649*4882a593Smuzhiyun 			pri_cnt_fnl = pri_cnt_tmp;
1650*4882a593Smuzhiyun 	}
1651*4882a593Smuzhiyun 
1652*4882a593Smuzhiyun 	// Advanced PRI Judgement (Bypass for long pulse flag)
1653*4882a593Smuzhiyun 	if (pri_cnt_fnl != 0)
1654*4882a593Smuzhiyun 		pri_cnt_fnl++;
1655*4882a593Smuzhiyun 
1656*4882a593Smuzhiyun 	/* PRI */
1657*4882a593Smuzhiyun 	if (dfs->radar_type)
1658*4882a593Smuzhiyun 		dfs->pri_flag= true;
1659*4882a593Smuzhiyun 	else if (pri_cnt_fnl >= pri_cnt_th)
1660*4882a593Smuzhiyun 		dfs->pri_flag= true;
1661*4882a593Smuzhiyun 	/* For the case of SRTC */
1662*4882a593Smuzhiyun 	else if ((dfs->pri_rslt[0] == 0) && (dfs->pri_rslt[1] > 0) &&
1663*4882a593Smuzhiyun 		 (dfs->pri_rslt[2] == 0) && (dfs->pri_rslt[3] > 0))
1664*4882a593Smuzhiyun 		dfs->pri_flag= true;
1665*4882a593Smuzhiyun 	else if ((dfs->pri_rslt[0] > 0) && (dfs->pri_rslt[1] == 0) &&
1666*4882a593Smuzhiyun 		 (dfs->pri_rslt[2] > 0) && (dfs->pri_rslt[3] == 0))
1667*4882a593Smuzhiyun 		dfs->pri_flag= true;
1668*4882a593Smuzhiyun 	else if (!(dfs->pri_flag_en))
1669*4882a593Smuzhiyun 		dfs->pri_flag= true;
1670*4882a593Smuzhiyun 
1671*4882a593Smuzhiyun 	if (region_domain == PHYDM_DFS_DOMAIN_MKK){
1672*4882a593Smuzhiyun 		if (c_channel >= 52 && c_channel <= 64){
1673*4882a593Smuzhiyun 			if (!(dfs->idle_mode))
1674*4882a593Smuzhiyun 				dfs->pri_flag= true;     // MKK, 52<=ch<=64 , TP mode
1675*4882a593Smuzhiyun 			}
1676*4882a593Smuzhiyun 		}
1677*4882a593Smuzhiyun 
1678*4882a593Smuzhiyun 	/* PW */
1679*4882a593Smuzhiyun 	if (!(dfs->pw_flag_en))
1680*4882a593Smuzhiyun 		dfs->pw_flag = true;
1681*4882a593Smuzhiyun 
1682*4882a593Smuzhiyun 	/* LOCT */
1683*4882a593Smuzhiyun 	if (!(dfs->idle_mode))
1684*4882a593Smuzhiyun 		dfs->loct_diff_th = dfs->loct_diff_th + 15;
1685*4882a593Smuzhiyun 	if (loct_diff <= dfs->loct_diff_th)
1686*4882a593Smuzhiyun 		dfs->loct_flag = true;
1687*4882a593Smuzhiyun 	else if (dfs->radar_type)
1688*4882a593Smuzhiyun 		dfs->loct_flag = true;
1689*4882a593Smuzhiyun 	else if (!(dfs->loct_flag_en))
1690*4882a593Smuzhiyun 		dfs->loct_flag = true;
1691*4882a593Smuzhiyun 
1692*4882a593Smuzhiyun 	if (dfs->det_print_jar3) {
1693*4882a593Smuzhiyun 		if (dfs->nhm_dfs_flag || dfs->b_flag)
1694*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "Anti-FRD Rdr Drop\n");
1695*4882a593Smuzhiyun 		if (!(dfs->pw_flag_en) || !(dfs->loct_flag_en) || !(dfs->pri_flag_en))
1696*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "Byps flag scenario\n");
1697*4882a593Smuzhiyun 	       if (dc_cnt > dfs->dc_cnt_th)
1698*4882a593Smuzhiyun 		   	PHYDM_DBG(dm, DBG_DFS, "Radar is near DC\n");
1699*4882a593Smuzhiyun 		if (!(dfs->pw_flag))
1700*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "- PW/PRI-J Failure\n");
1701*4882a593Smuzhiyun 		if (!(dfs->loct_flag))
1702*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "- Loct-J Failure\n");
1703*4882a593Smuzhiyun 		if (!(dfs->pri_flag))
1704*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "- Adv-PRI-J Failure\n");
1705*4882a593Smuzhiyun 		if (!(dfs->pw_flag) || !(dfs->pri_flag) || !(dfs->loct_flag))
1706*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "Suspected radar result is dropped by SW mechanism !!\n");
1707*4882a593Smuzhiyun 
1708*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "\n");
1709*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "The current information: ([Lower bound / Upper bound])\n");
1710*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "pw_th1 : [%d, %d], pw_th2 : [%d, %d], pw_th3 : [%d, %d]\n",
1711*4882a593Smuzhiyun 			  pw_lth[0], pw_uth[0], pw_lth[1], pw_uth[1],
1712*4882a593Smuzhiyun 			  pw_lth[2], pw_uth[2]);
1713*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "pw_th4 : [%d, %d], pw_th5 : [%d, %d], pw_th6 : [%d, %d] \n",
1714*4882a593Smuzhiyun 			  pw_lth[3], pw_uth[3], pw_lth[4],
1715*4882a593Smuzhiyun 			  pw_uth[4], pw_lth[5], pw_uth[5]);
1716*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "pw_th7 : [%d, %d], pw_th8 : [%d, %d]\n",
1717*4882a593Smuzhiyun 			  pw_lth[6], pw_uth[6], pw_lth[7], pw_uth[7]);
1718*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "pri_th1 : [%d, %d], pri_th2 : [%d, %d], pri_th3 : [%d, %d]\n",
1719*4882a593Smuzhiyun 			  pri_lth[0], pri_uth[0], pri_lth[1], pri_uth[1],
1720*4882a593Smuzhiyun 			  pri_lth[2], pri_uth[2]);
1721*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "pri_th4 : [%d, %d], pri_th5 : [%d, %d], pri_th6 : [%d, %d]\n",
1722*4882a593Smuzhiyun 			  pri_lth[3], pri_uth[3], pri_lth[4], pri_uth[4],
1723*4882a593Smuzhiyun 			  pri_lth[5], pri_uth[5]);
1724*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "pri_th7 : [%d, %d], pri_th8 : [%d, %d]\n",
1725*4882a593Smuzhiyun 			  pri_lth[6], pri_uth[6], pri_lth[7], pri_uth[7]);
1726*4882a593Smuzhiyun 
1727*4882a593Smuzhiyun 		if (!(dfs->idle_mode))
1728*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "loct_diff_th = [%d](Relax for TP mode)\n",
1729*4882a593Smuzhiyun 				  dfs->loct_diff_th);
1730*4882a593Smuzhiyun 		else
1731*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "loct_diff_th = [%d](Idle mode)\n",
1732*4882a593Smuzhiyun 				  dfs->loct_diff_th);
1733*4882a593Smuzhiyun 
1734*4882a593Smuzhiyun 		if (!(dfs->idle_mode)) {
1735*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "pri_var_offset = [%d] (Relax for TP mode)\n",
1736*4882a593Smuzhiyun 				  dfs->pri_var_offset);
1737*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "pri_cnt_th = [%d] (Relax for TP mode)\n",
1738*4882a593Smuzhiyun 				  pri_cnt_th);
1739*4882a593Smuzhiyun 		} else {
1740*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "pri_var_offset = [%d] (Idle mode)\n",
1741*4882a593Smuzhiyun 				  dfs->pri_var_offset);
1742*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "pri_cnt_th = [%d] (Idle mode)\n",
1743*4882a593Smuzhiyun 				  pri_cnt_th);
1744*4882a593Smuzhiyun 		}
1745*4882a593Smuzhiyun 
1746*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "\n");
1747*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "loop_cnt = [%d]\n", loop_cnt);
1748*4882a593Smuzhiyun 		if (dfs->nhm_dfs_flag) {
1749*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "Nmode cnt = %d!\n",
1750*4882a593Smuzhiyun 				  dfs->nhm_dfs_cnt);
1751*4882a593Smuzhiyun 		}
1752*4882a593Smuzhiyun 		else if (dfs->b_flag) {
1753*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "Bmode DTY = %d\n",
1754*4882a593Smuzhiyun 				  (100-((ccx->nhm_rpt_sum * 100) >> 8)));
1755*4882a593Smuzhiyun 		}
1756*4882a593Smuzhiyun 		else {
1757*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "cnt_th = [%d] (Default : Half of loop cnt)\n",
1758*4882a593Smuzhiyun 				  cnt_th);
1759*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "Bmode DTY = %d\n",
1760*4882a593Smuzhiyun 				  (100-((ccx->nhm_rpt_sum * 100) >> 8)));
1761*4882a593Smuzhiyun 		}
1762*4882a593Smuzhiyun 
1763*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "\n");
1764*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "The current report:\n");
1765*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "pw_rpt(1-12) = [%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d]\n",
1766*4882a593Smuzhiyun 			  pw_rpt_set[0], pw_rpt_set[1], pw_rpt_set[2],
1767*4882a593Smuzhiyun 			  pw_rpt_set[3], pw_rpt_set[4], pw_rpt_set[5],
1768*4882a593Smuzhiyun 			  pw_rpt_set[6], pw_rpt_set[7], pw_rpt_set[8],
1769*4882a593Smuzhiyun 			  pw_rpt_set[9], pw_rpt_set[10], pw_rpt_set[11]);
1770*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "loct_rpt(1-12) = [%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d]\n",
1771*4882a593Smuzhiyun 			  loct_rpt_set[0], loct_rpt_set[1],
1772*4882a593Smuzhiyun 			  loct_rpt_set[2], loct_rpt_set[3],
1773*4882a593Smuzhiyun 			  loct_rpt_set[4], loct_rpt_set[5],
1774*4882a593Smuzhiyun 			  loct_rpt_set[6], loct_rpt_set[7],
1775*4882a593Smuzhiyun 			  loct_rpt_set[8], loct_rpt_set[9],
1776*4882a593Smuzhiyun 			  loct_rpt_set[10], loct_rpt_set[11]);
1777*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "pri_rpt(1-12) = [%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d]\n",
1778*4882a593Smuzhiyun 			  pri_rpt_set[0], pri_rpt_set[1],
1779*4882a593Smuzhiyun 			  pri_rpt_set[2], pri_rpt_set[3],
1780*4882a593Smuzhiyun 			  pri_rpt_set[4], pri_rpt_set[5],
1781*4882a593Smuzhiyun 			  pri_rpt_set[6], pri_rpt_set[7],
1782*4882a593Smuzhiyun 			  pri_rpt_set[8], pri_rpt_set[9],
1783*4882a593Smuzhiyun 			  pri_rpt_set[10], pri_rpt_set[11]);
1784*4882a593Smuzhiyun 
1785*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "\n");
1786*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "dc_cnt = [%d]\n", dc_cnt);
1787*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "loct_diff = [%d]\n", loct_diff);
1788*4882a593Smuzhiyun 
1789*4882a593Smuzhiyun 		if (pri_vd_max == 0 && pri_vd_min == 255)
1790*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "No vaild pri_max and pri_min");
1791*4882a593Smuzhiyun 		else
1792*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "pri_vaild_max = %d, pri_vaild_min = %d\n",
1793*4882a593Smuzhiyun 				  pri_vd_max, pri_vd_min);
1794*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "advanced_pri_cnt = %d\n",
1795*4882a593Smuzhiyun 			  pri_cnt_fnl);
1796*4882a593Smuzhiyun 
1797*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "radar_class_cnt[1-8] = [%d, %d, %d, %d, %d, %d, %d, %d]\n",
1798*4882a593Smuzhiyun 			  rdr_cnt[0], rdr_cnt[1], rdr_cnt[2], rdr_cnt[3],
1799*4882a593Smuzhiyun 			  rdr_cnt[4], rdr_cnt[5], rdr_cnt[6], rdr_cnt[7]);
1800*4882a593Smuzhiyun 	}
1801*4882a593Smuzhiyun }
1802*4882a593Smuzhiyun #endif
1803*4882a593Smuzhiyun 
1804*4882a593Smuzhiyun #if (RTL8814A_SUPPORT || RTL8822B_SUPPORT || RTL8821C_SUPPORT)
phydm_dfs_histogram_radar_distinguish(void * dm_void)1805*4882a593Smuzhiyun void phydm_dfs_histogram_radar_distinguish(
1806*4882a593Smuzhiyun 	void *dm_void)
1807*4882a593Smuzhiyun {
1808*4882a593Smuzhiyun 	struct dm_struct *dm = (struct dm_struct *)dm_void;
1809*4882a593Smuzhiyun 	struct _DFS_STATISTICS *dfs = &dm->dfs;
1810*4882a593Smuzhiyun 	u8 region_domain = dm->dfs_region_domain;
1811*4882a593Smuzhiyun 	u8 c_channel = *dm->channel;
1812*4882a593Smuzhiyun 	u8 band_width = *dm->band_width;
1813*4882a593Smuzhiyun 
1814*4882a593Smuzhiyun 	u8 dfs_pw_thd1 = 0, dfs_pw_thd2 = 0, dfs_pw_thd3 = 0;
1815*4882a593Smuzhiyun 	u8 dfs_pw_thd4 = 0, dfs_pw_thd5 = 0;
1816*4882a593Smuzhiyun 	u8 dfs_pri_thd1 = 0, dfs_pri_thd2 = 0, dfs_pri_thd3 = 0;
1817*4882a593Smuzhiyun 	u8 dfs_pri_thd4 = 0, dfs_pri_thd5 = 0;
1818*4882a593Smuzhiyun 	u8 pri_th = 0, i = 0;
1819*4882a593Smuzhiyun 	u8 max_pri_idx = 0, max_pw_idx = 0, max_pri_cnt_th = 0;
1820*4882a593Smuzhiyun 	u8 max_pri_cnt_fcc_g1_th = 0, max_pri_cnt_fcc_g3_th = 0;
1821*4882a593Smuzhiyun 	u8 safe_pri_pw_diff_th = 0, safe_pri_pw_diff_fcc_th = 0;
1822*4882a593Smuzhiyun 	u8 safe_pri_pw_diff_w53_th = 0, safe_pri_pw_diff_fcc_idle_th = 0;
1823*4882a593Smuzhiyun 	u8 j = 0;
1824*4882a593Smuzhiyun 	u32 dfs_hist1_pw = 0, dfs_hist2_pw = 0, g_pw[6] = {0};
1825*4882a593Smuzhiyun 	u32 dfs_hist1_pri = 0, dfs_hist2_pri = 0, g_pri[6] = {0};
1826*4882a593Smuzhiyun 	u8 pw_sum_g0g5 = 0, pw_sum_g1g2g3g4 = 0;
1827*4882a593Smuzhiyun 	u8 pri_sum_g0g5 = 0, pri_sum_g1g2g3g4 = 0;
1828*4882a593Smuzhiyun 	u16 pw_sum_ss_g1g2g3g4 = 0, pri_sum_ss_g1g2g3g4 = 0;
1829*4882a593Smuzhiyun 	u8 max_pri_cnt = 0, max_pw_cnt = 0;
1830*4882a593Smuzhiyun 	#if (RTL8721D_SUPPORT)
1831*4882a593Smuzhiyun 	if (dm->support_ic_type & (ODM_RTL8721D))
1832*4882a593Smuzhiyun 		return;
1833*4882a593Smuzhiyun 	#endif
1834*4882a593Smuzhiyun 
1835*4882a593Smuzhiyun 	/*read pulse width hist report*/
1836*4882a593Smuzhiyun 	odm_set_bb_reg(dm, 0x19e4, BIT(22) | BIT(23), 0x1);
1837*4882a593Smuzhiyun 	dfs_hist1_pw = odm_get_bb_reg(dm, 0xf5c, 0xffffffff);
1838*4882a593Smuzhiyun 	dfs_hist2_pw = odm_get_bb_reg(dm, 0xf74, 0xffffffff);
1839*4882a593Smuzhiyun 
1840*4882a593Smuzhiyun 	g_pw[0] = (unsigned int)((dfs_hist2_pw & 0xff000000) >> 24);
1841*4882a593Smuzhiyun 	g_pw[1] = (unsigned int)((dfs_hist2_pw & 0x00ff0000) >> 16);
1842*4882a593Smuzhiyun 	g_pw[2] = (unsigned int)((dfs_hist2_pw & 0x0000ff00) >> 8);
1843*4882a593Smuzhiyun 	g_pw[3] = (unsigned int)dfs_hist2_pw & 0x000000ff;
1844*4882a593Smuzhiyun 	g_pw[4] = (unsigned int)((dfs_hist1_pw & 0xff000000) >> 24);
1845*4882a593Smuzhiyun 	g_pw[5] = (unsigned int)((dfs_hist1_pw & 0x00ff0000) >> 16);
1846*4882a593Smuzhiyun 
1847*4882a593Smuzhiyun 	/*read pulse repetition interval hist report*/
1848*4882a593Smuzhiyun 	odm_set_bb_reg(dm, 0x19e4, BIT(22) | BIT(23), 0x3);
1849*4882a593Smuzhiyun 	dfs_hist1_pri = odm_get_bb_reg(dm, 0xf5c, 0xffffffff);
1850*4882a593Smuzhiyun 	dfs_hist2_pri = odm_get_bb_reg(dm, 0xf74, 0xffffffff);
1851*4882a593Smuzhiyun 	odm_set_bb_reg(dm, 0x19b4, 0x10000000, 1); /*reset histo report*/
1852*4882a593Smuzhiyun 	odm_set_bb_reg(dm, 0x19b4, 0x10000000, 0); /*@continue histo report*/
1853*4882a593Smuzhiyun 
1854*4882a593Smuzhiyun 	g_pri[0] = (unsigned int)((dfs_hist2_pri & 0xff000000) >> 24);
1855*4882a593Smuzhiyun 	g_pri[1] = (unsigned int)((dfs_hist2_pri & 0x00ff0000) >> 16);
1856*4882a593Smuzhiyun 	g_pri[2] = (unsigned int)((dfs_hist2_pri & 0x0000ff00) >> 8);
1857*4882a593Smuzhiyun 	g_pri[3] = (unsigned int)dfs_hist2_pri & 0x000000ff;
1858*4882a593Smuzhiyun 	g_pri[4] = (unsigned int)((dfs_hist1_pri & 0xff000000) >> 24);
1859*4882a593Smuzhiyun 	g_pri[5] = (unsigned int)((dfs_hist1_pri & 0x00ff0000) >> 16);
1860*4882a593Smuzhiyun 
1861*4882a593Smuzhiyun 	dfs->pri_cond1 = 0;
1862*4882a593Smuzhiyun 	dfs->pri_cond2 = 0;
1863*4882a593Smuzhiyun 	dfs->pri_cond3 = 0;
1864*4882a593Smuzhiyun 	dfs->pri_cond4 = 0;
1865*4882a593Smuzhiyun 	dfs->pri_cond5 = 0;
1866*4882a593Smuzhiyun 	dfs->pw_cond1 = 0;
1867*4882a593Smuzhiyun 	dfs->pw_cond2 = 0;
1868*4882a593Smuzhiyun 	dfs->pw_cond3 = 0;
1869*4882a593Smuzhiyun 	dfs->pri_type3_4_cond1 = 0;	/*@for ETSI*/
1870*4882a593Smuzhiyun 	dfs->pri_type3_4_cond2 = 0;	/*@for ETSI*/
1871*4882a593Smuzhiyun 	dfs->pw_long_cond1 = 0;		/*@for long radar*/
1872*4882a593Smuzhiyun 	dfs->pw_long_cond2 = 0;		/*@for long radar*/
1873*4882a593Smuzhiyun 	dfs->pri_long_cond1 = 0;	/*@for long radar*/
1874*4882a593Smuzhiyun 	dfs->pw_flag = 0;
1875*4882a593Smuzhiyun 	dfs->pri_flag = 0;
1876*4882a593Smuzhiyun 	dfs->pri_type3_4_flag = 0;	/*@for ETSI*/
1877*4882a593Smuzhiyun 	dfs->long_radar_flag = 0;
1878*4882a593Smuzhiyun 	dfs->pw_std = 0;	/*The std(var) of reasonable num of pw group*/
1879*4882a593Smuzhiyun 	dfs->pri_std = 0;	/*The std(var) of reasonable num of pri group*/
1880*4882a593Smuzhiyun 
1881*4882a593Smuzhiyun 	for (i = 0; i < 6; i++) {
1882*4882a593Smuzhiyun 		dfs->pw_hold_sum[i] = 0;
1883*4882a593Smuzhiyun 		dfs->pri_hold_sum[i] = 0;
1884*4882a593Smuzhiyun 	}
1885*4882a593Smuzhiyun 
1886*4882a593Smuzhiyun 	if (dfs->idle_mode == 1)
1887*4882a593Smuzhiyun 		pri_th = dfs->pri_hist_th;
1888*4882a593Smuzhiyun 	else
1889*4882a593Smuzhiyun 		pri_th = dfs->pri_hist_th - 1;
1890*4882a593Smuzhiyun 
1891*4882a593Smuzhiyun 	for (i = 0; i < 6; i++) {
1892*4882a593Smuzhiyun 		dfs->pw_hold[dfs->hist_idx][i] = (u8)g_pw[i];
1893*4882a593Smuzhiyun 		dfs->pri_hold[dfs->hist_idx][i] = (u8)g_pri[i];
1894*4882a593Smuzhiyun 		/*@collect whole histogram report may take some time
1895*4882a593Smuzhiyun 		 *so we add the counter of 2 time slots in FCC and ETSI
1896*4882a593Smuzhiyun 		 */
1897*4882a593Smuzhiyun 		dfs->pw_hold_sum[i] = dfs->pw_hold_sum[i] +
1898*4882a593Smuzhiyun 			dfs->pw_hold[(dfs->hist_idx + 1) % 3][i] +
1899*4882a593Smuzhiyun 			dfs->pw_hold[(dfs->hist_idx + 2) % 3][i];
1900*4882a593Smuzhiyun 		dfs->pri_hold_sum[i] = dfs->pri_hold_sum[i] +
1901*4882a593Smuzhiyun 			dfs->pri_hold[(dfs->hist_idx + 1) % 3][i] +
1902*4882a593Smuzhiyun 			dfs->pri_hold[(dfs->hist_idx + 2) % 3][i];
1903*4882a593Smuzhiyun 	}
1904*4882a593Smuzhiyun 	/*@For long radar type*/
1905*4882a593Smuzhiyun 	for (j = 1; j < 4; j++) {
1906*4882a593Smuzhiyun 		dfs->pw_long_hold_sum[i] = dfs->pw_long_hold_sum[i] +
1907*4882a593Smuzhiyun 			dfs->pw_hold[(dfs->hist_long_idx + j) % 4][i];
1908*4882a593Smuzhiyun 		dfs->pri_long_hold_sum[i] = dfs->pri_long_hold_sum[i] +
1909*4882a593Smuzhiyun 			dfs->pri_hold[(dfs->hist_long_idx + j) % 4][i];
1910*4882a593Smuzhiyun 	}
1911*4882a593Smuzhiyun 
1912*4882a593Smuzhiyun 	dfs->hist_idx++;
1913*4882a593Smuzhiyun 	if (dfs->hist_idx == 3)
1914*4882a593Smuzhiyun 		dfs->hist_idx = 0;
1915*4882a593Smuzhiyun 	dfs->hist_long_idx++;
1916*4882a593Smuzhiyun 	if (dfs->hist_long_idx == 4)
1917*4882a593Smuzhiyun 		dfs->hist_long_idx = 0;
1918*4882a593Smuzhiyun 
1919*4882a593Smuzhiyun 	max_pri_cnt = 0;
1920*4882a593Smuzhiyun 	max_pri_idx = 0;
1921*4882a593Smuzhiyun 	max_pw_cnt = 0;
1922*4882a593Smuzhiyun 	max_pw_idx = 0;
1923*4882a593Smuzhiyun 	max_pri_cnt_th = dfs->pri_sum_g1_th;
1924*4882a593Smuzhiyun 	max_pri_cnt_fcc_g1_th = dfs->pri_sum_g1_fcc_th;
1925*4882a593Smuzhiyun 	max_pri_cnt_fcc_g3_th = dfs->pri_sum_g3_fcc_th;
1926*4882a593Smuzhiyun 	safe_pri_pw_diff_th = dfs->pri_pw_diff_th;
1927*4882a593Smuzhiyun 	safe_pri_pw_diff_fcc_th = dfs->pri_pw_diff_fcc_th;
1928*4882a593Smuzhiyun 	safe_pri_pw_diff_fcc_idle_th = dfs->pri_pw_diff_fcc_idle_th;
1929*4882a593Smuzhiyun 	safe_pri_pw_diff_w53_th = dfs->pri_pw_diff_w53_th;
1930*4882a593Smuzhiyun 
1931*4882a593Smuzhiyun 	/*@g1 to g4 is the reseasonable range of pri and pw*/
1932*4882a593Smuzhiyun 	for (i = 1; i <= 4; i++) {
1933*4882a593Smuzhiyun 		if (dfs->pri_hold_sum[i] > max_pri_cnt) {
1934*4882a593Smuzhiyun 			max_pri_cnt = dfs->pri_hold_sum[i];
1935*4882a593Smuzhiyun 			max_pri_idx = i;
1936*4882a593Smuzhiyun 		}
1937*4882a593Smuzhiyun 		if (dfs->pw_hold_sum[i] > max_pw_cnt) {
1938*4882a593Smuzhiyun 			max_pw_cnt = dfs->pw_hold_sum[i];
1939*4882a593Smuzhiyun 			max_pw_idx = i;
1940*4882a593Smuzhiyun 		}
1941*4882a593Smuzhiyun 		if (dfs->pri_hold_sum[i] >= pri_th)
1942*4882a593Smuzhiyun 			dfs->pri_cond1 = 1;
1943*4882a593Smuzhiyun 	}
1944*4882a593Smuzhiyun 
1945*4882a593Smuzhiyun 	pri_sum_g0g5 = dfs->pri_hold_sum[0];
1946*4882a593Smuzhiyun 	if (pri_sum_g0g5 == 0)
1947*4882a593Smuzhiyun 		pri_sum_g0g5 = 1;
1948*4882a593Smuzhiyun 	pri_sum_g1g2g3g4 = dfs->pri_hold_sum[1] + dfs->pri_hold_sum[2]
1949*4882a593Smuzhiyun 			 + dfs->pri_hold_sum[3] + dfs->pri_hold_sum[4];
1950*4882a593Smuzhiyun 
1951*4882a593Smuzhiyun 	/*pw will reduce because of dc, so we do not treat g0 as illegal group*/
1952*4882a593Smuzhiyun 	pw_sum_g0g5 = dfs->pw_hold_sum[5];
1953*4882a593Smuzhiyun 	if (pw_sum_g0g5 == 0)
1954*4882a593Smuzhiyun 		pw_sum_g0g5 = 1;
1955*4882a593Smuzhiyun 	pw_sum_g1g2g3g4 = dfs->pw_hold_sum[1] + dfs->pw_hold_sum[2] +
1956*4882a593Smuzhiyun 				dfs->pw_hold_sum[3] + dfs->pw_hold_sum[4];
1957*4882a593Smuzhiyun 
1958*4882a593Smuzhiyun 	/*@Calculate the variation from g1 to g4*/
1959*4882a593Smuzhiyun 	for (i = 1; i < 5; i++) {
1960*4882a593Smuzhiyun 		/*Sum of square*/
1961*4882a593Smuzhiyun 		pw_sum_ss_g1g2g3g4 = pw_sum_ss_g1g2g3g4 +
1962*4882a593Smuzhiyun 		(dfs->pw_hold_sum[i] - (pw_sum_g1g2g3g4 / 4)) *
1963*4882a593Smuzhiyun 		(dfs->pw_hold_sum[i] - (pw_sum_g1g2g3g4 / 4));
1964*4882a593Smuzhiyun 		pri_sum_ss_g1g2g3g4 = pri_sum_ss_g1g2g3g4 +
1965*4882a593Smuzhiyun 		(dfs->pri_hold_sum[i] - (pri_sum_g1g2g3g4 / 4)) *
1966*4882a593Smuzhiyun 		(dfs->pri_hold_sum[i] - (pri_sum_g1g2g3g4 / 4));
1967*4882a593Smuzhiyun 	}
1968*4882a593Smuzhiyun 	/*The value may less than the normal variance,
1969*4882a593Smuzhiyun 	 *since the variable type is int (not float)
1970*4882a593Smuzhiyun 	 */
1971*4882a593Smuzhiyun 		dfs->pw_std = (u8)(pw_sum_ss_g1g2g3g4 / 4);
1972*4882a593Smuzhiyun 		dfs->pri_std = (u8)(pri_sum_ss_g1g2g3g4 / 4);
1973*4882a593Smuzhiyun 
1974*4882a593Smuzhiyun 	if (region_domain == 1) {
1975*4882a593Smuzhiyun 		dfs->pri_type3_4_flag = 1;	/*@ETSI flag*/
1976*4882a593Smuzhiyun 
1977*4882a593Smuzhiyun 		/*(OTA) Cancel long PRI case*/
1978*4882a593Smuzhiyun 		dfs->pri_cond2 = 1;
1979*4882a593Smuzhiyun 
1980*4882a593Smuzhiyun 		/*reasonable group shouldn't large*/
1981*4882a593Smuzhiyun 		if ((pri_sum_g0g5 + pri_sum_g1g2g3g4) / pri_sum_g0g5 > 2 &&
1982*4882a593Smuzhiyun 		    pri_sum_g1g2g3g4 <= dfs->pri_sum_safe_fcc_th)
1983*4882a593Smuzhiyun 			dfs->pri_cond3 = 1;
1984*4882a593Smuzhiyun 
1985*4882a593Smuzhiyun 		/*@Cancel the condition that the abs between pri and pw*/
1986*4882a593Smuzhiyun 		if (dfs->pri_std >= dfs->pri_std_th)
1987*4882a593Smuzhiyun 			dfs->pri_cond4 = 1;
1988*4882a593Smuzhiyun 		else if (max_pri_idx == 1 &&
1989*4882a593Smuzhiyun 			 max_pri_cnt >= max_pri_cnt_fcc_g1_th)
1990*4882a593Smuzhiyun 			dfs->pri_cond4 = 1;
1991*4882a593Smuzhiyun 
1992*4882a593Smuzhiyun 		/*(OTA) Cancel the condition (type 3,4 distinction)*/
1993*4882a593Smuzhiyun 		dfs->pri_cond5 = 1;
1994*4882a593Smuzhiyun 
1995*4882a593Smuzhiyun 		if (dfs->pri_cond1 && dfs->pri_cond2 && dfs->pri_cond3 &&
1996*4882a593Smuzhiyun 		    dfs->pri_cond4 && dfs->pri_cond5)
1997*4882a593Smuzhiyun 			dfs->pri_flag = 1;
1998*4882a593Smuzhiyun 
1999*4882a593Smuzhiyun 		/* PW judgment conditions for short radar type */
2000*4882a593Smuzhiyun 		/*ratio of reasonable and illegal group && g5 should be zero*/
2001*4882a593Smuzhiyun 		if (((pw_sum_g0g5 + pw_sum_g1g2g3g4) / pw_sum_g0g5 > 2) &&
2002*4882a593Smuzhiyun 		    (dfs->pw_hold_sum[5] <= 1))
2003*4882a593Smuzhiyun 			dfs->pw_cond1 = 1;
2004*4882a593Smuzhiyun 		/*unreasonable group*/
2005*4882a593Smuzhiyun 		if (dfs->pw_hold_sum[4] == 0 && dfs->pw_hold_sum[5] == 0)
2006*4882a593Smuzhiyun 			dfs->pw_cond2 = 1;
2007*4882a593Smuzhiyun 		/*pw's std (short radar) should be large(=7)*/
2008*4882a593Smuzhiyun 		if (dfs->pw_std >= dfs->pw_std_th)
2009*4882a593Smuzhiyun 			dfs->pw_cond3 = 1;
2010*4882a593Smuzhiyun 		if (dfs->pw_cond1 && dfs->pw_cond2 && dfs->pw_cond3)
2011*4882a593Smuzhiyun 			dfs->pw_flag = 1;
2012*4882a593Smuzhiyun 
2013*4882a593Smuzhiyun 		/* @Judgment conditions of long radar type */
2014*4882a593Smuzhiyun 		if (band_width == CHANNEL_WIDTH_20) {
2015*4882a593Smuzhiyun 			if (dfs->pw_long_hold_sum[4] >=
2016*4882a593Smuzhiyun 			    dfs->pw_long_lower_20m_th)
2017*4882a593Smuzhiyun 				dfs->pw_long_cond1 = 1;
2018*4882a593Smuzhiyun 		} else{
2019*4882a593Smuzhiyun 			if (dfs->pw_long_hold_sum[4] >= dfs->pw_long_lower_th)
2020*4882a593Smuzhiyun 				dfs->pw_long_cond1 = 1;
2021*4882a593Smuzhiyun 		}
2022*4882a593Smuzhiyun 		/* @Disable the condition that dfs->pw_long_hold_sum[1] */
2023*4882a593Smuzhiyun 		if (dfs->pw_long_hold_sum[2] + dfs->pw_long_hold_sum[3] +
2024*4882a593Smuzhiyun 		    dfs->pw_long_hold_sum[4] <= dfs->pw_long_sum_upper_th &&
2025*4882a593Smuzhiyun 		    dfs->pw_long_hold_sum[2] <= dfs->pw_long_hold_sum[4] &&
2026*4882a593Smuzhiyun 		    dfs->pw_long_hold_sum[3] <= dfs->pw_long_hold_sum[4])
2027*4882a593Smuzhiyun 			dfs->pw_long_cond2 = 1;
2028*4882a593Smuzhiyun 		/*@g4 should be large for long radar*/
2029*4882a593Smuzhiyun 		if (dfs->pri_long_hold_sum[4] <= dfs->pri_long_upper_th)
2030*4882a593Smuzhiyun 			dfs->pri_long_cond1 = 1;
2031*4882a593Smuzhiyun 		if (dfs->pw_long_cond1 && dfs->pw_long_cond2 &&
2032*4882a593Smuzhiyun 		    dfs->pri_long_cond1)
2033*4882a593Smuzhiyun 			dfs->long_radar_flag = 1;
2034*4882a593Smuzhiyun 	} else if (region_domain == 2) {
2035*4882a593Smuzhiyun 		dfs->pri_type3_4_flag = 1;	/*@ETSI flag*/
2036*4882a593Smuzhiyun 
2037*4882a593Smuzhiyun 		/*PRI judgment conditions for short radar type*/
2038*4882a593Smuzhiyun 		if ((pri_sum_g0g5 + pri_sum_g1g2g3g4) / pri_sum_g0g5 > 2)
2039*4882a593Smuzhiyun 			dfs->pri_cond2 = 1;
2040*4882a593Smuzhiyun 
2041*4882a593Smuzhiyun 		/*reasonable group shouldn't too large*/
2042*4882a593Smuzhiyun 		if (pri_sum_g1g2g3g4 <= dfs->pri_sum_safe_fcc_th)
2043*4882a593Smuzhiyun 			dfs->pri_cond3 = 1;
2044*4882a593Smuzhiyun 
2045*4882a593Smuzhiyun 		/*Cancel the abs diff between pri and pw for idle mode (thr=2)*/
2046*4882a593Smuzhiyun 		dfs->pri_cond4 = 1;
2047*4882a593Smuzhiyun 
2048*4882a593Smuzhiyun 		if (dfs->idle_mode == 1) {
2049*4882a593Smuzhiyun 			if (dfs->pri_std >= dfs->pri_std_idle_th) {
2050*4882a593Smuzhiyun 				if (max_pw_idx == 3 &&
2051*4882a593Smuzhiyun 				    pri_sum_g1g2g3g4 <= dfs->pri_sum_type4_th){
2052*4882a593Smuzhiyun 		/*To distinguish between type 4 radar and false detection*/
2053*4882a593Smuzhiyun 					dfs->pri_cond5 = 1;
2054*4882a593Smuzhiyun 				} else if (max_pw_idx == 1 &&
2055*4882a593Smuzhiyun 					   pri_sum_g1g2g3g4 >=
2056*4882a593Smuzhiyun 					   dfs->pri_sum_type6_th) {
2057*4882a593Smuzhiyun 		/*To distinguish between type 6 radar and false detection*/
2058*4882a593Smuzhiyun 					dfs->pri_cond5 = 1;
2059*4882a593Smuzhiyun 				} else {
2060*4882a593Smuzhiyun 		/*pri variation of short radar should be large (idle mode)*/
2061*4882a593Smuzhiyun 					dfs->pri_cond5 = 1;
2062*4882a593Smuzhiyun 				}
2063*4882a593Smuzhiyun 			}
2064*4882a593Smuzhiyun 		} else {
2065*4882a593Smuzhiyun 		/*pri variation of short radar should be large (TP mode)*/
2066*4882a593Smuzhiyun 			if (dfs->pri_std >= dfs->pri_std_th)
2067*4882a593Smuzhiyun 				dfs->pri_cond5 = 1;
2068*4882a593Smuzhiyun 		}
2069*4882a593Smuzhiyun 
2070*4882a593Smuzhiyun 		if (dfs->pri_cond1 && dfs->pri_cond2 && dfs->pri_cond3 &&
2071*4882a593Smuzhiyun 		    dfs->pri_cond4 && dfs->pri_cond5)
2072*4882a593Smuzhiyun 			dfs->pri_flag = 1;
2073*4882a593Smuzhiyun 
2074*4882a593Smuzhiyun 		/* PW judgment conditions for short radar type */
2075*4882a593Smuzhiyun 		if (((pw_sum_g0g5 + pw_sum_g1g2g3g4) / pw_sum_g0g5 > 2) &&
2076*4882a593Smuzhiyun 		    (dfs->pw_hold_sum[5] <= 1))
2077*4882a593Smuzhiyun 		/*ratio of reasonable and illegal group && g5 should be zero*/
2078*4882a593Smuzhiyun 			dfs->pw_cond1 = 1;
2079*4882a593Smuzhiyun 
2080*4882a593Smuzhiyun 		if ((c_channel >= 52) && (c_channel <= 64))
2081*4882a593Smuzhiyun 			dfs->pw_cond2 = 1;
2082*4882a593Smuzhiyun 		/*unreasonable group shouldn't too large*/
2083*4882a593Smuzhiyun 		else if (dfs->pw_hold_sum[0] <= dfs->pw_g0_th)
2084*4882a593Smuzhiyun 			dfs->pw_cond2 = 1;
2085*4882a593Smuzhiyun 
2086*4882a593Smuzhiyun 		if (dfs->idle_mode == 1) {
2087*4882a593Smuzhiyun 		/*pw variation of short radar should be large (idle mode)*/
2088*4882a593Smuzhiyun 			if (dfs->pw_std >= dfs->pw_std_idle_th)
2089*4882a593Smuzhiyun 				dfs->pw_cond3 = 1;
2090*4882a593Smuzhiyun 		} else {
2091*4882a593Smuzhiyun 		/*pw variation of short radar should be large (TP mode)*/
2092*4882a593Smuzhiyun 			if (dfs->pw_std >= dfs->pw_std_th)
2093*4882a593Smuzhiyun 				dfs->pw_cond3 = 1;
2094*4882a593Smuzhiyun 		}
2095*4882a593Smuzhiyun 		if (dfs->pw_cond1 && dfs->pw_cond2 && dfs->pw_cond3)
2096*4882a593Smuzhiyun 			dfs->pw_flag = 1;
2097*4882a593Smuzhiyun 
2098*4882a593Smuzhiyun 		/* @Judgment conditions of long radar type */
2099*4882a593Smuzhiyun 		if (band_width == CHANNEL_WIDTH_20) {
2100*4882a593Smuzhiyun 			if (dfs->pw_long_hold_sum[4] >=
2101*4882a593Smuzhiyun 			    dfs->pw_long_lower_20m_th)
2102*4882a593Smuzhiyun 				dfs->pw_long_cond1 = 1;
2103*4882a593Smuzhiyun 		} else{
2104*4882a593Smuzhiyun 			if (dfs->pw_long_hold_sum[4] >= dfs->pw_long_lower_th)
2105*4882a593Smuzhiyun 				dfs->pw_long_cond1 = 1;
2106*4882a593Smuzhiyun 		}
2107*4882a593Smuzhiyun 		if (dfs->pw_long_hold_sum[1] + dfs->pw_long_hold_sum[2] +
2108*4882a593Smuzhiyun 		    dfs->pw_long_hold_sum[3] + dfs->pw_long_hold_sum[4]
2109*4882a593Smuzhiyun 		    <= dfs->pw_long_sum_upper_th)
2110*4882a593Smuzhiyun 			dfs->pw_long_cond2 = 1;
2111*4882a593Smuzhiyun 		/*@g4 should be large for long radar*/
2112*4882a593Smuzhiyun 		if (dfs->pri_long_hold_sum[4] <= dfs->pri_long_upper_th)
2113*4882a593Smuzhiyun 			dfs->pri_long_cond1 = 1;
2114*4882a593Smuzhiyun 		if (dfs->pw_long_cond1 &&
2115*4882a593Smuzhiyun 		    dfs->pw_long_cond2 && dfs->pri_long_cond1)
2116*4882a593Smuzhiyun 			dfs->long_radar_flag = 1;
2117*4882a593Smuzhiyun 	} else if (region_domain == 3) {
2118*4882a593Smuzhiyun 		/*ratio of reasonable group and illegal group */
2119*4882a593Smuzhiyun 		if ((pri_sum_g0g5 + pri_sum_g1g2g3g4) / pri_sum_g0g5 > 2)
2120*4882a593Smuzhiyun 			dfs->pri_cond2 = 1;
2121*4882a593Smuzhiyun 
2122*4882a593Smuzhiyun 		if (pri_sum_g1g2g3g4 <= dfs->pri_sum_safe_th)
2123*4882a593Smuzhiyun 			dfs->pri_cond3 = 1;
2124*4882a593Smuzhiyun 
2125*4882a593Smuzhiyun 		/*@Cancel the condition that the abs between pri and pw*/
2126*4882a593Smuzhiyun 			dfs->pri_cond4 = 1;
2127*4882a593Smuzhiyun 
2128*4882a593Smuzhiyun 		if (dfs->pri_hold_sum[5] <= dfs->pri_sum_g5_th)
2129*4882a593Smuzhiyun 			dfs->pri_cond5 = 1;
2130*4882a593Smuzhiyun 
2131*4882a593Smuzhiyun 		if (band_width == CHANNEL_WIDTH_40) {
2132*4882a593Smuzhiyun 			if (max_pw_idx == 4) {
2133*4882a593Smuzhiyun 				if (max_pw_cnt >= dfs->type4_pw_max_cnt &&
2134*4882a593Smuzhiyun 				    pri_sum_g1g2g3g4 >=
2135*4882a593Smuzhiyun 				    dfs->type4_safe_pri_sum_th) {
2136*4882a593Smuzhiyun 					dfs->pri_cond1 = 1;
2137*4882a593Smuzhiyun 					dfs->pri_cond4 = 1;
2138*4882a593Smuzhiyun 					dfs->pri_type3_4_cond1 = 1;
2139*4882a593Smuzhiyun 				}
2140*4882a593Smuzhiyun 			}
2141*4882a593Smuzhiyun 		}
2142*4882a593Smuzhiyun 
2143*4882a593Smuzhiyun 		if (dfs->pri_cond1 && dfs->pri_cond2 &&
2144*4882a593Smuzhiyun 		    dfs->pri_cond3 && dfs->pri_cond4 && dfs->pri_cond5)
2145*4882a593Smuzhiyun 			dfs->pri_flag = 1;
2146*4882a593Smuzhiyun 
2147*4882a593Smuzhiyun 		if (((pw_sum_g0g5 + pw_sum_g1g2g3g4) / pw_sum_g0g5 > 2))
2148*4882a593Smuzhiyun 			dfs->pw_flag = 1;
2149*4882a593Smuzhiyun 
2150*4882a593Smuzhiyun 		/*@max num pri group is g1 means radar type3 or type4*/
2151*4882a593Smuzhiyun 		if (max_pri_idx == 1) {
2152*4882a593Smuzhiyun 			if (max_pri_cnt >= max_pri_cnt_th)
2153*4882a593Smuzhiyun 				dfs->pri_type3_4_cond1 = 1;
2154*4882a593Smuzhiyun 			if (dfs->pri_hold_sum[4] <=
2155*4882a593Smuzhiyun 			    dfs->pri_sum_g5_under_g1_th &&
2156*4882a593Smuzhiyun 			    dfs->pri_hold_sum[5] <= dfs->pri_sum_g5_under_g1_th)
2157*4882a593Smuzhiyun 				dfs->pri_type3_4_cond2 = 1;
2158*4882a593Smuzhiyun 		} else {
2159*4882a593Smuzhiyun 			dfs->pri_type3_4_cond1 = 1;
2160*4882a593Smuzhiyun 			dfs->pri_type3_4_cond2 = 1;
2161*4882a593Smuzhiyun 		}
2162*4882a593Smuzhiyun 		if (dfs->pri_type3_4_cond1 && dfs->pri_type3_4_cond2)
2163*4882a593Smuzhiyun 			dfs->pri_type3_4_flag = 1;
2164*4882a593Smuzhiyun 	} else {
2165*4882a593Smuzhiyun 	}
2166*4882a593Smuzhiyun 
2167*4882a593Smuzhiyun 	if (dfs->print_hist_rpt) {
2168*4882a593Smuzhiyun 		dfs_pw_thd1 = (u8)odm_get_bb_reg(dm, 0x19e4, 0xff000000);
2169*4882a593Smuzhiyun 		dfs_pw_thd2 = (u8)odm_get_bb_reg(dm, 0x19e8, 0x000000ff);
2170*4882a593Smuzhiyun 		dfs_pw_thd3 = (u8)odm_get_bb_reg(dm, 0x19e8, 0x0000ff00);
2171*4882a593Smuzhiyun 		dfs_pw_thd4 = (u8)odm_get_bb_reg(dm, 0x19e8, 0x00ff0000);
2172*4882a593Smuzhiyun 		dfs_pw_thd5 = (u8)odm_get_bb_reg(dm, 0x19e8, 0xff000000);
2173*4882a593Smuzhiyun 
2174*4882a593Smuzhiyun 		dfs_pri_thd1 = (u8)odm_get_bb_reg(dm, 0x19b8, 0x7F80);
2175*4882a593Smuzhiyun 		dfs_pri_thd2 = (u8)odm_get_bb_reg(dm, 0x19ec, 0x000000ff);
2176*4882a593Smuzhiyun 		dfs_pri_thd3 = (u8)odm_get_bb_reg(dm, 0x19ec, 0x0000ff00);
2177*4882a593Smuzhiyun 		dfs_pri_thd4 = (u8)odm_get_bb_reg(dm, 0x19ec, 0x00ff0000);
2178*4882a593Smuzhiyun 		dfs_pri_thd5 = (u8)odm_get_bb_reg(dm, 0x19ec, 0xff000000);
2179*4882a593Smuzhiyun 
2180*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "\ndfs_pw_thd=%d %d %d %d %d\n",
2181*4882a593Smuzhiyun 			  dfs_pw_thd1, dfs_pw_thd2, dfs_pw_thd3,
2182*4882a593Smuzhiyun 			  dfs_pw_thd4, dfs_pw_thd5);
2183*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "-----pulse width hist-----\n");
2184*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "dfs_hist_pw=%x %x\n",
2185*4882a593Smuzhiyun 			  dfs_hist1_pw, dfs_hist2_pw);
2186*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "g_pw_hist = %x %x %x %x %x %x\n",
2187*4882a593Smuzhiyun 			  g_pw[0], g_pw[1], g_pw[2], g_pw[3],
2188*4882a593Smuzhiyun 			  g_pw[4], g_pw[5]);
2189*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "dfs_pri_thd=%d %d %d %d %d\n",
2190*4882a593Smuzhiyun 			  dfs_pri_thd1, dfs_pri_thd2, dfs_pri_thd3,
2191*4882a593Smuzhiyun 			  dfs_pri_thd4, dfs_pri_thd5);
2192*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "-----pulse interval hist-----\n");
2193*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "dfs_hist_pri=%x %x\n",
2194*4882a593Smuzhiyun 			  dfs_hist1_pri, dfs_hist2_pri);
2195*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS,
2196*4882a593Smuzhiyun 			  "g_pri_hist = %x %x %x %x %x %x, pw_flag = %d, pri_flag = %d\n",
2197*4882a593Smuzhiyun 			  g_pri[0], g_pri[1], g_pri[2], g_pri[3], g_pri[4],
2198*4882a593Smuzhiyun 			  g_pri[5], dfs->pw_flag, dfs->pri_flag);
2199*4882a593Smuzhiyun 		if (region_domain == 1 || region_domain == 3) {
2200*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "hist_idx= %d\n",
2201*4882a593Smuzhiyun 				  (dfs->hist_idx + 2) % 3);
2202*4882a593Smuzhiyun 		} else {
2203*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "hist_idx= %d\n",
2204*4882a593Smuzhiyun 				  (dfs->hist_idx + 3) % 4);
2205*4882a593Smuzhiyun 		}
2206*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "hist_long_idx= %d\n",
2207*4882a593Smuzhiyun 			  (dfs->hist_long_idx + 299) % 300);
2208*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS,
2209*4882a593Smuzhiyun 			  "pw_sum_g0g5 = %d, pw_sum_g1g2g3g4 = %d\n",
2210*4882a593Smuzhiyun 			  pw_sum_g0g5, pw_sum_g1g2g3g4);
2211*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS,
2212*4882a593Smuzhiyun 			  "pri_sum_g0g5 = %d, pri_sum_g1g2g3g4 = %d\n",
2213*4882a593Smuzhiyun 			  pri_sum_g0g5, pri_sum_g1g2g3g4);
2214*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "pw_hold_sum = %d %d %d %d %d %d\n",
2215*4882a593Smuzhiyun 			  dfs->pw_hold_sum[0], dfs->pw_hold_sum[1],
2216*4882a593Smuzhiyun 			  dfs->pw_hold_sum[2], dfs->pw_hold_sum[3],
2217*4882a593Smuzhiyun 			  dfs->pw_hold_sum[4], dfs->pw_hold_sum[5]);
2218*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "pri_hold_sum = %d %d %d %d %d %d\n",
2219*4882a593Smuzhiyun 			  dfs->pri_hold_sum[0], dfs->pri_hold_sum[1],
2220*4882a593Smuzhiyun 			  dfs->pri_hold_sum[2], dfs->pri_hold_sum[3],
2221*4882a593Smuzhiyun 			  dfs->pri_hold_sum[4], dfs->pri_hold_sum[5]);
2222*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "pw_long_hold_sum = %d %d %d %d %d %d\n",
2223*4882a593Smuzhiyun 			  dfs->pw_long_hold_sum[0], dfs->pw_long_hold_sum[1],
2224*4882a593Smuzhiyun 			  dfs->pw_long_hold_sum[2], dfs->pw_long_hold_sum[3],
2225*4882a593Smuzhiyun 			  dfs->pw_long_hold_sum[4], dfs->pw_long_hold_sum[5]);
2226*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS,
2227*4882a593Smuzhiyun 			  "pri_long_hold_sum = %d %d %d %d %d %d\n",
2228*4882a593Smuzhiyun 			  dfs->pri_long_hold_sum[0], dfs->pri_long_hold_sum[1],
2229*4882a593Smuzhiyun 			  dfs->pri_long_hold_sum[2], dfs->pri_long_hold_sum[3],
2230*4882a593Smuzhiyun 			  dfs->pri_long_hold_sum[4], dfs->pri_long_hold_sum[5]);
2231*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "idle_mode = %d\n", dfs->idle_mode);
2232*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "pw_standard = %d\n", dfs->pw_std);
2233*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "pri_standard = %d\n", dfs->pri_std);
2234*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS, "\n");
2235*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS,
2236*4882a593Smuzhiyun 			  "pri_cond1 = %d, pri_cond2 = %d, pri_cond3 = %d, pri_cond4 = %d, pri_cond5 = %d\n",
2237*4882a593Smuzhiyun 			  dfs->pri_cond1, dfs->pri_cond2, dfs->pri_cond3,
2238*4882a593Smuzhiyun 			  dfs->pri_cond4, dfs->pri_cond5);
2239*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS,
2240*4882a593Smuzhiyun 			  "bandwidth = %d, pri_th = %d, max_pri_cnt_th = %d, safe_pri_pw_diff_th = %d\n",
2241*4882a593Smuzhiyun 			  band_width, pri_th, max_pri_cnt_th,
2242*4882a593Smuzhiyun 			  safe_pri_pw_diff_th);
2243*4882a593Smuzhiyun 	}
2244*4882a593Smuzhiyun }
2245*4882a593Smuzhiyun #endif
phydm_dfs_hist_log(void * dm_void,u8 index)2246*4882a593Smuzhiyun boolean phydm_dfs_hist_log(void *dm_void, u8 index)
2247*4882a593Smuzhiyun {
2248*4882a593Smuzhiyun 	struct dm_struct *dm = (struct dm_struct *)dm_void;
2249*4882a593Smuzhiyun 	struct _DFS_STATISTICS *dfs = &dm->dfs;
2250*4882a593Smuzhiyun 	u8 i = 0, j = 0;
2251*4882a593Smuzhiyun 	boolean hist_radar_detected = 0;
2252*4882a593Smuzhiyun 
2253*4882a593Smuzhiyun 	if (dfs->pulse_type_hist[index] == 0) {
2254*4882a593Smuzhiyun 		dfs->radar_type = 0;
2255*4882a593Smuzhiyun 		if (dfs->pw_flag && dfs->pri_flag &&
2256*4882a593Smuzhiyun 		    dfs->pri_type3_4_flag) {
2257*4882a593Smuzhiyun 			hist_radar_detected = 1;
2258*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS,
2259*4882a593Smuzhiyun 				  "Detected type %d radar signal!\n",
2260*4882a593Smuzhiyun 				  dfs->radar_type);
2261*4882a593Smuzhiyun 			if (dfs->det_print2) {
2262*4882a593Smuzhiyun 				PHYDM_DBG(dm, DBG_DFS,
2263*4882a593Smuzhiyun 					  "hist_idx= %d\n",
2264*4882a593Smuzhiyun 					  (dfs->hist_idx + 3) % 4);
2265*4882a593Smuzhiyun 				for (j = 0; j < 4; j++) {
2266*4882a593Smuzhiyun 				for (i = 0; i < 6; i++) {
2267*4882a593Smuzhiyun 					PHYDM_DBG(dm, DBG_DFS,
2268*4882a593Smuzhiyun 						  "pri_hold = %d ",
2269*4882a593Smuzhiyun 						  dfs->pri_hold[j][i]);
2270*4882a593Smuzhiyun 				}
2271*4882a593Smuzhiyun 				PHYDM_DBG(dm, DBG_DFS, "\n");
2272*4882a593Smuzhiyun 				}
2273*4882a593Smuzhiyun 				PHYDM_DBG(dm, DBG_DFS, "\n");
2274*4882a593Smuzhiyun 				for (j = 0; j < 4; j++) {
2275*4882a593Smuzhiyun 				for (i = 0; i < 6; i++) {
2276*4882a593Smuzhiyun 					PHYDM_DBG(dm, DBG_DFS, "pw_hold = %d ",
2277*4882a593Smuzhiyun 						  dfs->pw_hold[j][i]);
2278*4882a593Smuzhiyun 				}
2279*4882a593Smuzhiyun 					PHYDM_DBG(dm, DBG_DFS, "\n");
2280*4882a593Smuzhiyun 				}
2281*4882a593Smuzhiyun 				PHYDM_DBG(dm, DBG_DFS, "\n");
2282*4882a593Smuzhiyun 				PHYDM_DBG(dm, DBG_DFS, "idle_mode = %d\n",
2283*4882a593Smuzhiyun 					  dfs->idle_mode);
2284*4882a593Smuzhiyun 				PHYDM_DBG(dm, DBG_DFS,
2285*4882a593Smuzhiyun 					  "pw_hold_sum = %d %d %d %d %d %d\n",
2286*4882a593Smuzhiyun 					  dfs->pw_hold_sum[0],
2287*4882a593Smuzhiyun 					  dfs->pw_hold_sum[1],
2288*4882a593Smuzhiyun 					  dfs->pw_hold_sum[2],
2289*4882a593Smuzhiyun 					  dfs->pw_hold_sum[3],
2290*4882a593Smuzhiyun 					  dfs->pw_hold_sum[4],
2291*4882a593Smuzhiyun 					  dfs->pw_hold_sum[5]);
2292*4882a593Smuzhiyun 				PHYDM_DBG(dm, DBG_DFS,
2293*4882a593Smuzhiyun 					  "pri_hold_sum = %d %d %d %d %d %d\n",
2294*4882a593Smuzhiyun 					  dfs->pri_hold_sum[0],
2295*4882a593Smuzhiyun 					  dfs->pri_hold_sum[1],
2296*4882a593Smuzhiyun 					  dfs->pri_hold_sum[2],
2297*4882a593Smuzhiyun 					  dfs->pri_hold_sum[3],
2298*4882a593Smuzhiyun 					  dfs->pri_hold_sum[4],
2299*4882a593Smuzhiyun 					  dfs->pri_hold_sum[5]);
2300*4882a593Smuzhiyun 			}
2301*4882a593Smuzhiyun 		} else {
2302*4882a593Smuzhiyun 		if (dfs->det_print2) {
2303*4882a593Smuzhiyun 			if (dfs->pulse_flag_hist[index] &&
2304*4882a593Smuzhiyun 			    dfs->pri_flag == 0) {
2305*4882a593Smuzhiyun 				PHYDM_DBG(dm, DBG_DFS, "pri_variation = %d\n",
2306*4882a593Smuzhiyun 					  dfs->pri_std);
2307*4882a593Smuzhiyun 				PHYDM_DBG(dm, DBG_DFS,
2308*4882a593Smuzhiyun 					  "PRI criterion is not satisfied!\n");
2309*4882a593Smuzhiyun 				if (dfs->pri_cond1 == 0)
2310*4882a593Smuzhiyun 					PHYDM_DBG(dm, DBG_DFS,
2311*4882a593Smuzhiyun 						  "pri_cond1 is not satisfied!\n");
2312*4882a593Smuzhiyun 				if (dfs->pri_cond2 == 0)
2313*4882a593Smuzhiyun 					PHYDM_DBG(dm, DBG_DFS,
2314*4882a593Smuzhiyun 						  "pri_cond2 is not satisfied!\n");
2315*4882a593Smuzhiyun 				if (dfs->pri_cond3 == 0)
2316*4882a593Smuzhiyun 					PHYDM_DBG(dm, DBG_DFS,
2317*4882a593Smuzhiyun 						  "pri_cond3 is not satisfied!\n");
2318*4882a593Smuzhiyun 				if (dfs->pri_cond4 == 0)
2319*4882a593Smuzhiyun 					PHYDM_DBG(dm, DBG_DFS,
2320*4882a593Smuzhiyun 						  "pri_cond4 is not satisfied!\n");
2321*4882a593Smuzhiyun 				if (dfs->pri_cond5 == 0)
2322*4882a593Smuzhiyun 					PHYDM_DBG(dm, DBG_DFS,
2323*4882a593Smuzhiyun 						  "pri_cond5 is not satisfied!\n");
2324*4882a593Smuzhiyun 			}
2325*4882a593Smuzhiyun 			if (dfs->pulse_flag_hist[index] &&
2326*4882a593Smuzhiyun 			    dfs->pw_flag == 0) {
2327*4882a593Smuzhiyun 				PHYDM_DBG(dm, DBG_DFS, "pw_variation = %d\n",
2328*4882a593Smuzhiyun 					  dfs->pw_std);
2329*4882a593Smuzhiyun 				PHYDM_DBG(dm, DBG_DFS,
2330*4882a593Smuzhiyun 					  "PW criterion is not satisfied!\n");
2331*4882a593Smuzhiyun 				if (dfs->pw_cond1 == 0)
2332*4882a593Smuzhiyun 					PHYDM_DBG(dm, DBG_DFS,
2333*4882a593Smuzhiyun 						  "pw_cond1 is not satisfied!\n");
2334*4882a593Smuzhiyun 				if (dfs->pw_cond2 == 0)
2335*4882a593Smuzhiyun 					PHYDM_DBG(dm, DBG_DFS,
2336*4882a593Smuzhiyun 						  "pw_cond2 is not satisfied!\n");
2337*4882a593Smuzhiyun 				if (dfs->pw_cond3 == 0)
2338*4882a593Smuzhiyun 					PHYDM_DBG(dm, DBG_DFS,
2339*4882a593Smuzhiyun 						  "pw_cond3 is not satisfied!\n");
2340*4882a593Smuzhiyun 			}
2341*4882a593Smuzhiyun 			if (dfs->pulse_flag_hist[index] &&
2342*4882a593Smuzhiyun 			    (dfs->pri_type3_4_flag == 0)) {
2343*4882a593Smuzhiyun 				PHYDM_DBG(dm, DBG_DFS,
2344*4882a593Smuzhiyun 					  "pri_type3_4 criterion is not satisfied!\n");
2345*4882a593Smuzhiyun 				if (dfs->pri_type3_4_cond1 == 0)
2346*4882a593Smuzhiyun 					PHYDM_DBG(dm, DBG_DFS,
2347*4882a593Smuzhiyun 						  "pri_type3_4_cond1 is not satisfied!\n");
2348*4882a593Smuzhiyun 				if (dfs->pri_type3_4_cond2 == 0)
2349*4882a593Smuzhiyun 					PHYDM_DBG(dm, DBG_DFS,
2350*4882a593Smuzhiyun 						  "pri_type3_4_cond2 is not satisfied!\n");
2351*4882a593Smuzhiyun 			}
2352*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "hist_idx= %d\n",
2353*4882a593Smuzhiyun 				  (dfs->hist_idx + 3) % 4);
2354*4882a593Smuzhiyun 			for (j = 0; j < 4; j++) {
2355*4882a593Smuzhiyun 				for (i = 0; i < 6; i++) {
2356*4882a593Smuzhiyun 					PHYDM_DBG(dm, DBG_DFS,
2357*4882a593Smuzhiyun 						  "pri_hold = %d ",
2358*4882a593Smuzhiyun 						  dfs->pri_hold[j][i]);
2359*4882a593Smuzhiyun 				}
2360*4882a593Smuzhiyun 				PHYDM_DBG(dm, DBG_DFS, "\n");
2361*4882a593Smuzhiyun 			}
2362*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "\n");
2363*4882a593Smuzhiyun 			for (j = 0; j < 4; j++) {
2364*4882a593Smuzhiyun 				for (i = 0; i < 6; i++)
2365*4882a593Smuzhiyun 					PHYDM_DBG(dm, DBG_DFS,
2366*4882a593Smuzhiyun 						  "pw_hold = %d ",
2367*4882a593Smuzhiyun 						  dfs->pw_hold[j][i]);
2368*4882a593Smuzhiyun 				PHYDM_DBG(dm, DBG_DFS, "\n");
2369*4882a593Smuzhiyun 			}
2370*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "\n");
2371*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "idle_mode = %d\n",
2372*4882a593Smuzhiyun 				  dfs->idle_mode);
2373*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS,
2374*4882a593Smuzhiyun 				  "pw_hold_sum = %d %d %d %d %d %d\n",
2375*4882a593Smuzhiyun 				  dfs->pw_hold_sum[0], dfs->pw_hold_sum[1],
2376*4882a593Smuzhiyun 				  dfs->pw_hold_sum[2], dfs->pw_hold_sum[3],
2377*4882a593Smuzhiyun 				  dfs->pw_hold_sum[4], dfs->pw_hold_sum[5]);
2378*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS,
2379*4882a593Smuzhiyun 				  "pri_hold_sum = %d %d %d %d %d %d\n",
2380*4882a593Smuzhiyun 				  dfs->pri_hold_sum[0], dfs->pri_hold_sum[1],
2381*4882a593Smuzhiyun 				  dfs->pri_hold_sum[2], dfs->pri_hold_sum[3],
2382*4882a593Smuzhiyun 				  dfs->pri_hold_sum[4], dfs->pri_hold_sum[5]);
2383*4882a593Smuzhiyun 		}
2384*4882a593Smuzhiyun 		}
2385*4882a593Smuzhiyun 	} else {
2386*4882a593Smuzhiyun 		dfs->radar_type = 1;
2387*4882a593Smuzhiyun 		if (dfs->det_print2) {
2388*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "\n");
2389*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS, "idle_mode = %d\n",
2390*4882a593Smuzhiyun 				  dfs->idle_mode);
2391*4882a593Smuzhiyun 		}
2392*4882a593Smuzhiyun 		/* @Long radar should satisfy three conditions */
2393*4882a593Smuzhiyun 		if (dfs->long_radar_flag == 1) {
2394*4882a593Smuzhiyun 			hist_radar_detected = 1;
2395*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS,
2396*4882a593Smuzhiyun 				  "Detected type %d radar signal!\n",
2397*4882a593Smuzhiyun 				  dfs->radar_type);
2398*4882a593Smuzhiyun 		} else {
2399*4882a593Smuzhiyun 			if (dfs->det_print2) {
2400*4882a593Smuzhiyun 				if (dfs->pw_long_cond1 == 0)
2401*4882a593Smuzhiyun 					PHYDM_DBG(dm, DBG_DFS,
2402*4882a593Smuzhiyun 						  "--pw_long_cond1 is not satisfied!--\n");
2403*4882a593Smuzhiyun 				if (dfs->pw_long_cond2 == 0)
2404*4882a593Smuzhiyun 					PHYDM_DBG(dm, DBG_DFS,
2405*4882a593Smuzhiyun 						  "--pw_long_cond2 is not satisfied!--\n");
2406*4882a593Smuzhiyun 				if (dfs->pri_long_cond1 == 0)
2407*4882a593Smuzhiyun 					PHYDM_DBG(dm, DBG_DFS,
2408*4882a593Smuzhiyun 						  "--pri_long_cond1 is not satisfied!--\n");
2409*4882a593Smuzhiyun 			}
2410*4882a593Smuzhiyun 		}
2411*4882a593Smuzhiyun 	}
2412*4882a593Smuzhiyun 	return hist_radar_detected;
2413*4882a593Smuzhiyun }
2414*4882a593Smuzhiyun 
phydm_radar_detect(void * dm_void)2415*4882a593Smuzhiyun boolean phydm_radar_detect(void *dm_void)
2416*4882a593Smuzhiyun {
2417*4882a593Smuzhiyun 	struct dm_struct *dm = (struct dm_struct *)dm_void;
2418*4882a593Smuzhiyun 	struct _DFS_STATISTICS *dfs = &dm->dfs;
2419*4882a593Smuzhiyun 	boolean radar_detected = false;
2420*4882a593Smuzhiyun 
2421*4882a593Smuzhiyun 	if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
2422*4882a593Smuzhiyun 		dfs->igi_cur = (u8)odm_get_bb_reg(dm, R_0x1d70, 0x0000007f);
2423*4882a593Smuzhiyun 		dfs->st_l2h_cur = (u8)odm_get_bb_reg(dm, R_0xa40, 0x00007f00);
2424*4882a593Smuzhiyun 	#if (RTL8721D_SUPPORT)
2425*4882a593Smuzhiyun 	} else if (dm->support_ic_type & (ODM_RTL8721D)) {
2426*4882a593Smuzhiyun 		dfs->st_l2h_cur = (u8)(odm_get_bb_reg(dm, R_0xf54,
2427*4882a593Smuzhiyun 						      0x0000001f) << 2);
2428*4882a593Smuzhiyun 		dfs->st_l2h_cur += (u8)odm_get_bb_reg(dm, R_0xf58, 0xc0000000);
2429*4882a593Smuzhiyun 	#endif
2430*4882a593Smuzhiyun 	} else {
2431*4882a593Smuzhiyun 		dfs->igi_cur = (u8)odm_get_bb_reg(dm, R_0xc50, 0x0000007f);
2432*4882a593Smuzhiyun 		dfs->st_l2h_cur = (u8)odm_get_bb_reg(dm, R_0x91c, 0x000000ff);
2433*4882a593Smuzhiyun 	}
2434*4882a593Smuzhiyun 
2435*4882a593Smuzhiyun 	/* @dynamic pwdb calibration */
2436*4882a593Smuzhiyun 	if (dfs->igi_pre != dfs->igi_cur) {
2437*4882a593Smuzhiyun 		dfs->pwdb_th_cur = ((int)dfs->st_l2h_cur - (int)dfs->igi_cur)
2438*4882a593Smuzhiyun 				    / 2 + dfs->pwdb_scalar_factor;
2439*4882a593Smuzhiyun 
2440*4882a593Smuzhiyun 		/* @limit the pwdb value to absolute lower bound 0xa */
2441*4882a593Smuzhiyun 		dfs->pwdb_th_cur = MAX_2(dfs->pwdb_th_cur, (int)dfs->pwdb_th);
2442*4882a593Smuzhiyun 		/* @limit the pwdb value to absolute upper bound 0x1f */
2443*4882a593Smuzhiyun 		dfs->pwdb_th_cur = MIN_2(dfs->pwdb_th_cur, 0x1f);
2444*4882a593Smuzhiyun 
2445*4882a593Smuzhiyun 		if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
2446*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xa50, 0x000000f0,
2447*4882a593Smuzhiyun 				       dfs->pwdb_th_cur);
2448*4882a593Smuzhiyun 		#if (RTL8721D_SUPPORT)
2449*4882a593Smuzhiyun 		else if (dm->support_ic_type & (ODM_RTL8721D))
2450*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0xf70, 0x03c00000,
2451*4882a593Smuzhiyun 				       dfs->pwdb_th_cur);
2452*4882a593Smuzhiyun 		#endif
2453*4882a593Smuzhiyun 		else
2454*4882a593Smuzhiyun 			odm_set_bb_reg(dm, R_0x918, 0x00001f00,
2455*4882a593Smuzhiyun 				       dfs->pwdb_th_cur);
2456*4882a593Smuzhiyun 	}
2457*4882a593Smuzhiyun 	dfs->igi_pre = dfs->igi_cur;
2458*4882a593Smuzhiyun 
2459*4882a593Smuzhiyun 	phydm_dfs_dynamic_setting(dm);
2460*4882a593Smuzhiyun 	#if (RTL8814A_SUPPORT || RTL8822B_SUPPORT || RTL8821C_SUPPORT)
2461*4882a593Smuzhiyun 	if (dm->support_ic_type & (ODM_RTL8814A | ODM_RTL8822B | ODM_RTL8821C))
2462*4882a593Smuzhiyun 		phydm_dfs_histogram_radar_distinguish(dm);
2463*4882a593Smuzhiyun 	#endif
2464*4882a593Smuzhiyun 	radar_detected = phydm_radar_detect_dm_check(dm);
2465*4882a593Smuzhiyun 
2466*4882a593Smuzhiyun 	if (radar_detected) {
2467*4882a593Smuzhiyun 		/*
2468*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS,
2469*4882a593Smuzhiyun 			  "Radar detect: %d\n", radar_detected);
2470*4882a593Smuzhiyun 		*/
2471*4882a593Smuzhiyun 		phydm_radar_detect_reset(dm);
2472*4882a593Smuzhiyun 		if (dfs->dbg_mode == 1) {
2473*4882a593Smuzhiyun 			PHYDM_DBG(dm, DBG_DFS,
2474*4882a593Smuzhiyun 				  "Radar is detected in DFS dbg mode!!!!!!!!!!!\n");
2475*4882a593Smuzhiyun 			radar_detected = 0;
2476*4882a593Smuzhiyun 		}
2477*4882a593Smuzhiyun 	}
2478*4882a593Smuzhiyun 
2479*4882a593Smuzhiyun 	if (dfs->sw_trigger_mode) {
2480*4882a593Smuzhiyun 		radar_detected = 1;
2481*4882a593Smuzhiyun 		PHYDM_DBG(dm, DBG_DFS,
2482*4882a593Smuzhiyun 			  "Radar is detected in DFS SW trigger mode.\n");
2483*4882a593Smuzhiyun 	}
2484*4882a593Smuzhiyun 
2485*4882a593Smuzhiyun 	return radar_detected;
2486*4882a593Smuzhiyun }
2487*4882a593Smuzhiyun 
phydm_dfs_hist_dbg(void * dm_void,char input[][16],u32 * _used,char * output,u32 * _out_len)2488*4882a593Smuzhiyun void phydm_dfs_hist_dbg(void *dm_void, char input[][16], u32 *_used,
2489*4882a593Smuzhiyun 			char *output, u32 *_out_len)
2490*4882a593Smuzhiyun {
2491*4882a593Smuzhiyun 	struct dm_struct *dm = (struct dm_struct *)dm_void;
2492*4882a593Smuzhiyun 	struct _DFS_STATISTICS *dfs = &dm->dfs;
2493*4882a593Smuzhiyun 	char help[] = "-h";
2494*4882a593Smuzhiyun 	u32 argv[5] = {0};
2495*4882a593Smuzhiyun 	u32 used = *_used;
2496*4882a593Smuzhiyun 	u32 out_len = *_out_len;
2497*4882a593Smuzhiyun 	u8 i;
2498*4882a593Smuzhiyun 
2499*4882a593Smuzhiyun 	if ((strcmp(input[1], help) == 0)) {
2500*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2501*4882a593Smuzhiyun 			 "{0} pri_hist_th = %d\n", dfs->pri_hist_th);
2502*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2503*4882a593Smuzhiyun 			 "{1} pri_sum_g1_th = %d\n", dfs->pri_sum_g1_th);
2504*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2505*4882a593Smuzhiyun 			 "{2} pri_sum_g5_th = %d\n", dfs->pri_sum_g5_th);
2506*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2507*4882a593Smuzhiyun 			 "{3} pri_sum_g1_fcc_th = %d\n",
2508*4882a593Smuzhiyun 			 dfs->pri_sum_g1_fcc_th);
2509*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2510*4882a593Smuzhiyun 			 "{4} pri_sum_g3_fcc_th = %d\n",
2511*4882a593Smuzhiyun 			 dfs->pri_sum_g3_fcc_th);
2512*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2513*4882a593Smuzhiyun 			 "{5} pri_sum_safe_fcc_th = %d\n",
2514*4882a593Smuzhiyun 			 dfs->pri_sum_safe_fcc_th);
2515*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2516*4882a593Smuzhiyun 			 "{6} pri_sum_type4_th = %d\n", dfs->pri_sum_type4_th);
2517*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2518*4882a593Smuzhiyun 			 "{7} pri_sum_type6_th = %d\n", dfs->pri_sum_type6_th);
2519*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2520*4882a593Smuzhiyun 			 "{8} pri_sum_safe_th = %d\n", dfs->pri_sum_safe_th);
2521*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2522*4882a593Smuzhiyun 			 "{9} pri_sum_g5_under_g1_th = %d\n",
2523*4882a593Smuzhiyun 			 dfs->pri_sum_g5_under_g1_th);
2524*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2525*4882a593Smuzhiyun 			 "{10} pri_pw_diff_th = %d\n", dfs->pri_pw_diff_th);
2526*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2527*4882a593Smuzhiyun 			 "{11} pri_pw_diff_fcc_th = %d\n",
2528*4882a593Smuzhiyun 			 dfs->pri_pw_diff_fcc_th);
2529*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2530*4882a593Smuzhiyun 			 "{12} pri_pw_diff_fcc_idle_th = %d\n",
2531*4882a593Smuzhiyun 			 dfs->pri_pw_diff_fcc_idle_th);
2532*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2533*4882a593Smuzhiyun 			 "{13} pri_pw_diff_w53_th = %d\n",
2534*4882a593Smuzhiyun 			 dfs->pri_pw_diff_w53_th);
2535*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2536*4882a593Smuzhiyun 			 "{14} pri_type1_low_fcc_th = %d\n",
2537*4882a593Smuzhiyun 			 dfs->pri_type1_low_fcc_th);
2538*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2539*4882a593Smuzhiyun 			 "{15} pri_type1_upp_fcc_th = %d\n",
2540*4882a593Smuzhiyun 			 dfs->pri_type1_upp_fcc_th);
2541*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2542*4882a593Smuzhiyun 			 "{16} pri_type1_cen_fcc_th = %d\n",
2543*4882a593Smuzhiyun 			 dfs->pri_type1_cen_fcc_th);
2544*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2545*4882a593Smuzhiyun 			 "{17} pw_g0_th = %d\n", dfs->pw_g0_th);
2546*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2547*4882a593Smuzhiyun 			 "{18} pw_long_lower_20m_th = %d\n",
2548*4882a593Smuzhiyun 			 dfs->pw_long_lower_20m_th);
2549*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2550*4882a593Smuzhiyun 			 "{19} pw_long_lower_th = %d\n",
2551*4882a593Smuzhiyun 			 dfs->pw_long_lower_th);
2552*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2553*4882a593Smuzhiyun 			 "{20} pri_long_upper_th = %d\n",
2554*4882a593Smuzhiyun 			 dfs->pri_long_upper_th);
2555*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2556*4882a593Smuzhiyun 			 "{21} pw_long_sum_upper_th = %d\n",
2557*4882a593Smuzhiyun 			 dfs->pw_long_sum_upper_th);
2558*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2559*4882a593Smuzhiyun 			 "{22} pw_std_th = %d\n", dfs->pw_std_th);
2560*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2561*4882a593Smuzhiyun 			 "{23} pw_std_idle_th = %d\n", dfs->pw_std_idle_th);
2562*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2563*4882a593Smuzhiyun 			 "{24} pri_std_th = %d\n", dfs->pri_std_th);
2564*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2565*4882a593Smuzhiyun 			 "{25} pri_std_idle_th = %d\n", dfs->pri_std_idle_th);
2566*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2567*4882a593Smuzhiyun 			 "{26} type4_pw_max_cnt = %d\n", dfs->type4_pw_max_cnt);
2568*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2569*4882a593Smuzhiyun 			 "{27} type4_safe_pri_sum_th = %d\n",
2570*4882a593Smuzhiyun 			 dfs->type4_safe_pri_sum_th);
2571*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2572*4882a593Smuzhiyun 			"{28} fa_mask_th = %d\n",
2573*4882a593Smuzhiyun 			dfs->fa_mask_th);
2574*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2575*4882a593Smuzhiyun 			"{29} nhm_cnt_th = %d\n",
2576*4882a593Smuzhiyun 			dfs->nhm_cnt_th);
2577*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2578*4882a593Smuzhiyun 			"{30} nhm_dty_th = %d\n",
2579*4882a593Smuzhiyun 			dfs->nhm_dty_th);
2580*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2581*4882a593Smuzhiyun 			"{31} pw_flag_en = %d\n",
2582*4882a593Smuzhiyun 			dfs->pw_flag_en);
2583*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2584*4882a593Smuzhiyun 			"{32} loct_flag_en = %d\n",
2585*4882a593Smuzhiyun 			dfs->loct_flag_en);
2586*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2587*4882a593Smuzhiyun 			"{33} pri_flag_en = %d\n",
2588*4882a593Smuzhiyun 			dfs->pri_flag_en);
2589*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2590*4882a593Smuzhiyun 			"{34} pri_var_offset = %d\n",
2591*4882a593Smuzhiyun 			dfs->pri_var_offset);
2592*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2593*4882a593Smuzhiyun 			"{35} pri_var_tp_offset = %d\n",
2594*4882a593Smuzhiyun 			dfs->pri_var_tp_offset);
2595*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2596*4882a593Smuzhiyun 			"{36} pri_cnt_th = %d\n",
2597*4882a593Smuzhiyun 			dfs->pri_cnt_th);
2598*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2599*4882a593Smuzhiyun 			"{37} loct_diff_th = %d\n",
2600*4882a593Smuzhiyun 			dfs->loct_diff_th);
2601*4882a593Smuzhiyun 		PDM_SNPF(out_len, used, output + used, out_len - used,
2602*4882a593Smuzhiyun 			"{38} dc_cnt_th = %d\n",
2603*4882a593Smuzhiyun 			dfs->dc_cnt_th);
2604*4882a593Smuzhiyun 	} else {
2605*4882a593Smuzhiyun 		PHYDM_SSCANF(input[1], DCMD_DECIMAL, &argv[0]);
2606*4882a593Smuzhiyun 
2607*4882a593Smuzhiyun 		for (i = 1; i < 5; i++) {
2608*4882a593Smuzhiyun 			PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL,
2609*4882a593Smuzhiyun 				     &argv[i]);
2610*4882a593Smuzhiyun 		}
2611*4882a593Smuzhiyun 		if (argv[0] == 0) {
2612*4882a593Smuzhiyun 			dfs->pri_hist_th = (u8)argv[1];
2613*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2614*4882a593Smuzhiyun 				 "pri_hist_th = %d\n",
2615*4882a593Smuzhiyun 				 dfs->pri_hist_th);
2616*4882a593Smuzhiyun 		} else if (argv[0] == 1) {
2617*4882a593Smuzhiyun 			dfs->pri_sum_g1_th = (u8)argv[1];
2618*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2619*4882a593Smuzhiyun 				 "pri_sum_g1_th = %d\n",
2620*4882a593Smuzhiyun 				 dfs->pri_sum_g1_th);
2621*4882a593Smuzhiyun 		} else if (argv[0] == 2) {
2622*4882a593Smuzhiyun 			dfs->pri_sum_g5_th = (u8)argv[1];
2623*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2624*4882a593Smuzhiyun 				 "pri_sum_g5_th = %d\n",
2625*4882a593Smuzhiyun 				 dfs->pri_sum_g5_th);
2626*4882a593Smuzhiyun 		} else if (argv[0] == 3) {
2627*4882a593Smuzhiyun 			dfs->pri_sum_g1_fcc_th = (u8)argv[1];
2628*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2629*4882a593Smuzhiyun 				 "pri_sum_g1_fcc_th = %d\n",
2630*4882a593Smuzhiyun 				 dfs->pri_sum_g1_fcc_th);
2631*4882a593Smuzhiyun 		} else if (argv[0] == 4) {
2632*4882a593Smuzhiyun 			dfs->pri_sum_g3_fcc_th = (u8)argv[1];
2633*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2634*4882a593Smuzhiyun 				 "pri_sum_g3_fcc_th = %d\n",
2635*4882a593Smuzhiyun 				 dfs->pri_sum_g3_fcc_th);
2636*4882a593Smuzhiyun 		} else if (argv[0] == 5) {
2637*4882a593Smuzhiyun 			dfs->pri_sum_safe_fcc_th = (u8)argv[1];
2638*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2639*4882a593Smuzhiyun 				 "pri_sum_safe_fcc_th = %d\n",
2640*4882a593Smuzhiyun 				 dfs->pri_sum_safe_fcc_th);
2641*4882a593Smuzhiyun 		} else if (argv[0] == 6) {
2642*4882a593Smuzhiyun 			dfs->pri_sum_type4_th = (u8)argv[1];
2643*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2644*4882a593Smuzhiyun 				 "pri_sum_type4_th = %d\n",
2645*4882a593Smuzhiyun 				 dfs->pri_sum_type4_th);
2646*4882a593Smuzhiyun 		} else if (argv[0] == 7) {
2647*4882a593Smuzhiyun 			dfs->pri_sum_type6_th = (u8)argv[1];
2648*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2649*4882a593Smuzhiyun 				 "pri_sum_type6_th = %d\n",
2650*4882a593Smuzhiyun 				 dfs->pri_sum_type6_th);
2651*4882a593Smuzhiyun 		} else if (argv[0] == 8) {
2652*4882a593Smuzhiyun 			dfs->pri_sum_safe_th = (u8)argv[1];
2653*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2654*4882a593Smuzhiyun 				 "pri_sum_safe_th = %d\n",
2655*4882a593Smuzhiyun 				 dfs->pri_sum_safe_th);
2656*4882a593Smuzhiyun 		} else if (argv[0] == 9) {
2657*4882a593Smuzhiyun 			dfs->pri_sum_g5_under_g1_th = (u8)argv[1];
2658*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2659*4882a593Smuzhiyun 				 "pri_sum_g5_under_g1_th = %d\n",
2660*4882a593Smuzhiyun 				 dfs->pri_sum_g5_under_g1_th);
2661*4882a593Smuzhiyun 		} else if (argv[0] == 10) {
2662*4882a593Smuzhiyun 			dfs->pri_pw_diff_th = (u8)argv[1];
2663*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2664*4882a593Smuzhiyun 				 "pri_pw_diff_th = %d\n",
2665*4882a593Smuzhiyun 				 dfs->pri_pw_diff_th);
2666*4882a593Smuzhiyun 		} else if (argv[0] == 11) {
2667*4882a593Smuzhiyun 			dfs->pri_pw_diff_fcc_th = (u8)argv[1];
2668*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2669*4882a593Smuzhiyun 				 "pri_pw_diff_fcc_th = %d\n",
2670*4882a593Smuzhiyun 				 dfs->pri_pw_diff_fcc_th);
2671*4882a593Smuzhiyun 		} else if (argv[0] == 12) {
2672*4882a593Smuzhiyun 			dfs->pri_pw_diff_fcc_idle_th = (u8)argv[1];
2673*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2674*4882a593Smuzhiyun 				 "pri_pw_diff_fcc_idle_th = %d\n",
2675*4882a593Smuzhiyun 				 dfs->pri_pw_diff_fcc_idle_th);
2676*4882a593Smuzhiyun 		} else if (argv[0] == 13) {
2677*4882a593Smuzhiyun 			dfs->pri_pw_diff_w53_th = (u8)argv[1];
2678*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2679*4882a593Smuzhiyun 				 "pri_pw_diff_w53_th = %d\n",
2680*4882a593Smuzhiyun 				 dfs->pri_pw_diff_w53_th);
2681*4882a593Smuzhiyun 		} else if (argv[0] == 14) {
2682*4882a593Smuzhiyun 			dfs->pri_type1_low_fcc_th = (u8)argv[1];
2683*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2684*4882a593Smuzhiyun 				 "pri_type1_low_fcc_th = %d\n",
2685*4882a593Smuzhiyun 				 dfs->pri_type1_low_fcc_th);
2686*4882a593Smuzhiyun 		} else if (argv[0] == 15) {
2687*4882a593Smuzhiyun 			dfs->pri_type1_upp_fcc_th = (u8)argv[1];
2688*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2689*4882a593Smuzhiyun 				 "pri_type1_upp_fcc_th = %d\n",
2690*4882a593Smuzhiyun 				 dfs->pri_type1_upp_fcc_th);
2691*4882a593Smuzhiyun 		} else if (argv[0] == 16) {
2692*4882a593Smuzhiyun 			dfs->pri_type1_cen_fcc_th = (u8)argv[1];
2693*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2694*4882a593Smuzhiyun 				 "pri_type1_cen_fcc_th = %d\n",
2695*4882a593Smuzhiyun 				 dfs->pri_type1_cen_fcc_th);
2696*4882a593Smuzhiyun 		} else if (argv[0] == 17) {
2697*4882a593Smuzhiyun 			dfs->pw_g0_th = (u8)argv[1];
2698*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2699*4882a593Smuzhiyun 				 "pw_g0_th = %d\n",
2700*4882a593Smuzhiyun 				 dfs->pw_g0_th);
2701*4882a593Smuzhiyun 		} else if (argv[0] == 18) {
2702*4882a593Smuzhiyun 			dfs->pw_long_lower_20m_th = (u8)argv[1];
2703*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2704*4882a593Smuzhiyun 				 "pw_long_lower_20m_th = %d\n",
2705*4882a593Smuzhiyun 				 dfs->pw_long_lower_20m_th);
2706*4882a593Smuzhiyun 		} else if (argv[0] == 19) {
2707*4882a593Smuzhiyun 			dfs->pw_long_lower_th = (u8)argv[1];
2708*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2709*4882a593Smuzhiyun 				 "pw_long_lower_th = %d\n",
2710*4882a593Smuzhiyun 				 dfs->pw_long_lower_th);
2711*4882a593Smuzhiyun 		} else if (argv[0] == 20) {
2712*4882a593Smuzhiyun 			dfs->pri_long_upper_th = (u8)argv[1];
2713*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2714*4882a593Smuzhiyun 				 "pri_long_upper_th = %d\n",
2715*4882a593Smuzhiyun 				 dfs->pri_long_upper_th);
2716*4882a593Smuzhiyun 		} else if (argv[0] == 21) {
2717*4882a593Smuzhiyun 			dfs->pw_long_sum_upper_th = (u8)argv[1];
2718*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2719*4882a593Smuzhiyun 				 "pw_long_sum_upper_th = %d\n",
2720*4882a593Smuzhiyun 				 dfs->pw_long_sum_upper_th);
2721*4882a593Smuzhiyun 		} else if (argv[0] == 22) {
2722*4882a593Smuzhiyun 			dfs->pw_std_th = (u8)argv[1];
2723*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2724*4882a593Smuzhiyun 				 "pw_std_th = %d\n",
2725*4882a593Smuzhiyun 				 dfs->pw_std_th);
2726*4882a593Smuzhiyun 		} else if (argv[0] == 23) {
2727*4882a593Smuzhiyun 			dfs->pw_std_idle_th = (u8)argv[1];
2728*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2729*4882a593Smuzhiyun 				 "pw_std_idle_th = %d\n",
2730*4882a593Smuzhiyun 				 dfs->pw_std_idle_th);
2731*4882a593Smuzhiyun 		} else if (argv[0] == 24) {
2732*4882a593Smuzhiyun 			dfs->pri_std_th = (u8)argv[1];
2733*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2734*4882a593Smuzhiyun 				 "pri_std_th = %d\n",
2735*4882a593Smuzhiyun 				 dfs->pri_std_th);
2736*4882a593Smuzhiyun 		} else if (argv[0] == 25) {
2737*4882a593Smuzhiyun 			dfs->pri_std_idle_th = (u8)argv[1];
2738*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2739*4882a593Smuzhiyun 				 "pri_std_idle_th = %d\n",
2740*4882a593Smuzhiyun 				 dfs->pri_std_idle_th);
2741*4882a593Smuzhiyun 		} else if (argv[0] == 26) {
2742*4882a593Smuzhiyun 			dfs->type4_pw_max_cnt = (u8)argv[1];
2743*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2744*4882a593Smuzhiyun 				 "type4_pw_max_cnt = %d\n",
2745*4882a593Smuzhiyun 				 dfs->type4_pw_max_cnt);
2746*4882a593Smuzhiyun 		} else if (argv[0] == 27) {
2747*4882a593Smuzhiyun 			dfs->type4_safe_pri_sum_th = (u8)argv[1];
2748*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2749*4882a593Smuzhiyun 				 "type4_safe_pri_sum_th = %d\n",
2750*4882a593Smuzhiyun 				 dfs->type4_safe_pri_sum_th);
2751*4882a593Smuzhiyun 		} else if (argv[0] == 28) {
2752*4882a593Smuzhiyun 			dfs->fa_mask_th = (u8)argv[1];
2753*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2754*4882a593Smuzhiyun 				"fa_mask_th = %d\n",
2755*4882a593Smuzhiyun 				dfs->fa_mask_th);
2756*4882a593Smuzhiyun 		} else if (argv[0] == 29) {
2757*4882a593Smuzhiyun 			dfs->nhm_cnt_th = (u8)argv[1];
2758*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2759*4882a593Smuzhiyun 				"nhm_cnt_th = %d\n",
2760*4882a593Smuzhiyun 				dfs->nhm_cnt_th);
2761*4882a593Smuzhiyun 		} else if (argv[0] == 30) {
2762*4882a593Smuzhiyun 			dfs->nhm_dty_th = (u8)argv[1];
2763*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2764*4882a593Smuzhiyun 				"nhm_dty_th = %d\n",
2765*4882a593Smuzhiyun 				dfs->nhm_dty_th);
2766*4882a593Smuzhiyun 		} else if (argv[0] == 31) {
2767*4882a593Smuzhiyun 			dfs->pw_flag_en = (u8)argv[1];
2768*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2769*4882a593Smuzhiyun 				"pw_flag_en = %d\n",
2770*4882a593Smuzhiyun 				dfs->pw_flag_en);
2771*4882a593Smuzhiyun 		} else if (argv[0] == 32) {
2772*4882a593Smuzhiyun 			dfs->loct_flag_en = (u8)argv[1];
2773*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2774*4882a593Smuzhiyun 				"loct_flag_en = %d\n",
2775*4882a593Smuzhiyun 				dfs->loct_flag_en);
2776*4882a593Smuzhiyun 		} else if (argv[0] == 33) {
2777*4882a593Smuzhiyun 			dfs->pri_flag_en = (u8)argv[1];
2778*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2779*4882a593Smuzhiyun 				"pri_flag_en = %d\n",
2780*4882a593Smuzhiyun 				dfs->pri_flag_en);
2781*4882a593Smuzhiyun 		} else if (argv[0] == 34) {
2782*4882a593Smuzhiyun 			dfs->pri_var_offset = (u8)argv[1];
2783*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2784*4882a593Smuzhiyun 				"pri_var_offset = %d\n",
2785*4882a593Smuzhiyun 				dfs->pri_var_offset);
2786*4882a593Smuzhiyun 		} else if (argv[0] == 35) {
2787*4882a593Smuzhiyun 			dfs->pri_var_tp_offset = (u8)argv[1];
2788*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2789*4882a593Smuzhiyun 				"pri_var_tp_offset = %d\n",
2790*4882a593Smuzhiyun 				dfs->pri_var_tp_offset);
2791*4882a593Smuzhiyun 		} else if (argv[0] == 36) {
2792*4882a593Smuzhiyun 			dfs->pri_cnt_th = (u8)argv[1];
2793*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2794*4882a593Smuzhiyun 				"pri_cnt_th = %d\n",
2795*4882a593Smuzhiyun 				dfs->pri_cnt_th);
2796*4882a593Smuzhiyun 		} else if (argv[0] == 37) {
2797*4882a593Smuzhiyun 			dfs->loct_diff_th = (u8)argv[1];
2798*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2799*4882a593Smuzhiyun 				"loct_diff_th = %d\n",
2800*4882a593Smuzhiyun 				dfs->loct_diff_th);
2801*4882a593Smuzhiyun 		} else if (argv[0] == 38) {
2802*4882a593Smuzhiyun 			dfs->dc_cnt_th = (u8)argv[1];
2803*4882a593Smuzhiyun 			PDM_SNPF(out_len, used, output + used, out_len - used,
2804*4882a593Smuzhiyun 				"dc_cnt_th = %d\n",
2805*4882a593Smuzhiyun 				dfs->dc_cnt_th);
2806*4882a593Smuzhiyun 		}
2807*4882a593Smuzhiyun 	}
2808*4882a593Smuzhiyun 	*_used = used;
2809*4882a593Smuzhiyun 	*_out_len = out_len;
2810*4882a593Smuzhiyun }
2811*4882a593Smuzhiyun 
phydm_dfs_debug(void * dm_void,char input[][16],u32 * _used,char * output,u32 * _out_len)2812*4882a593Smuzhiyun void phydm_dfs_debug(void *dm_void, char input[][16], u32 *_used,
2813*4882a593Smuzhiyun 		     char *output, u32 *_out_len)
2814*4882a593Smuzhiyun {
2815*4882a593Smuzhiyun 	struct dm_struct *dm = (struct dm_struct *)dm_void;
2816*4882a593Smuzhiyun 	struct _DFS_STATISTICS *dfs = &dm->dfs;
2817*4882a593Smuzhiyun 	u32 used = *_used;
2818*4882a593Smuzhiyun 	u32 out_len = *_out_len;
2819*4882a593Smuzhiyun 	u32 argv[10] = {0};
2820*4882a593Smuzhiyun 	u8 i, input_idx = 0;
2821*4882a593Smuzhiyun 
2822*4882a593Smuzhiyun 	for (i = 0; i < 10; i++) {
2823*4882a593Smuzhiyun 		PHYDM_SSCANF(input[i + 1], DCMD_HEX, &argv[i]);
2824*4882a593Smuzhiyun 		input_idx++;
2825*4882a593Smuzhiyun 	}
2826*4882a593Smuzhiyun 
2827*4882a593Smuzhiyun 	if (input_idx == 0)
2828*4882a593Smuzhiyun 		return;
2829*4882a593Smuzhiyun 
2830*4882a593Smuzhiyun 	dfs->dbg_mode = (boolean)argv[0];
2831*4882a593Smuzhiyun 	dfs->sw_trigger_mode = (boolean)argv[1];
2832*4882a593Smuzhiyun 	dfs->force_TP_mode = (boolean)argv[2];
2833*4882a593Smuzhiyun 	dfs->det_print = (boolean)argv[3];
2834*4882a593Smuzhiyun 	dfs->det_print2 = (boolean)argv[4];
2835*4882a593Smuzhiyun 	dfs->print_hist_rpt = (boolean)argv[5];
2836*4882a593Smuzhiyun 	dfs->hist_cond_on = (boolean)argv[6];
2837*4882a593Smuzhiyun 	dfs->det_print_jar3 = (boolean)argv[7];
2838*4882a593Smuzhiyun 	dfs->nhm_dfs_en = (boolean)argv[8];
2839*4882a593Smuzhiyun 	dfs->det_jar3_en = (boolean)argv[9];
2840*4882a593Smuzhiyun 
2841*4882a593Smuzhiyun 	PDM_SNPF(out_len, used, output + used, out_len - used,
2842*4882a593Smuzhiyun 		  "dbg_mode: %d, sw_trigger_mode: %d, force_TP_mode: %d, det_print: %d, det_print2: %d, print_hist_rpt: %d, hist_cond_on: %d\n, det_print_jar3: %d, nhm_dfs_en: %d, dfs->det_jar3_en: %d\n",
2843*4882a593Smuzhiyun 		 dfs->dbg_mode, dfs->sw_trigger_mode, dfs->force_TP_mode,
2844*4882a593Smuzhiyun 		 dfs->det_print, dfs->det_print2, dfs->print_hist_rpt,
2845*4882a593Smuzhiyun 		 dfs->hist_cond_on, dfs->det_print_jar3, dfs->nhm_dfs_en,
2846*4882a593Smuzhiyun 		 dfs->det_jar3_en);
2847*4882a593Smuzhiyun }
2848*4882a593Smuzhiyun 
phydm_dfs_polling_time(void * dm_void)2849*4882a593Smuzhiyun u8 phydm_dfs_polling_time(void *dm_void)
2850*4882a593Smuzhiyun {
2851*4882a593Smuzhiyun 	struct dm_struct *dm = (struct dm_struct *)dm_void;
2852*4882a593Smuzhiyun 	struct _DFS_STATISTICS *dfs = &dm->dfs;
2853*4882a593Smuzhiyun 
2854*4882a593Smuzhiyun 	if (dm->support_ic_type & (ODM_RTL8814A | ODM_RTL8822B | ODM_RTL8821C | ODM_RTL8822C | ODM_RTL8723F))
2855*4882a593Smuzhiyun 		dfs->dfs_polling_time = 40;
2856*4882a593Smuzhiyun 	else
2857*4882a593Smuzhiyun 		dfs->dfs_polling_time = 100;
2858*4882a593Smuzhiyun 
2859*4882a593Smuzhiyun 	return dfs->dfs_polling_time;
2860*4882a593Smuzhiyun }
2861*4882a593Smuzhiyun 
2862*4882a593Smuzhiyun #endif /* @defined(CONFIG_PHYDM_DFS_MASTER) */
2863*4882a593Smuzhiyun 
2864*4882a593Smuzhiyun boolean
phydm_is_dfs_band(void * dm_void)2865*4882a593Smuzhiyun phydm_is_dfs_band(void *dm_void)
2866*4882a593Smuzhiyun {
2867*4882a593Smuzhiyun 	struct dm_struct *dm = (struct dm_struct *)dm_void;
2868*4882a593Smuzhiyun 
2869*4882a593Smuzhiyun 	if (((*dm->channel >= 52) && (*dm->channel <= 64)) ||
2870*4882a593Smuzhiyun 	    ((*dm->channel >= 100) && (*dm->channel <= 144)))
2871*4882a593Smuzhiyun 		return true;
2872*4882a593Smuzhiyun 	else
2873*4882a593Smuzhiyun 		return false;
2874*4882a593Smuzhiyun }
2875*4882a593Smuzhiyun 
2876*4882a593Smuzhiyun boolean
phydm_dfs_master_enabled(void * dm_void)2877*4882a593Smuzhiyun phydm_dfs_master_enabled(void *dm_void)
2878*4882a593Smuzhiyun {
2879*4882a593Smuzhiyun #ifdef CONFIG_PHYDM_DFS_MASTER
2880*4882a593Smuzhiyun 	struct dm_struct *dm = (struct dm_struct *)dm_void;
2881*4882a593Smuzhiyun 	boolean ret_val = false;
2882*4882a593Smuzhiyun 
2883*4882a593Smuzhiyun 	if (dm->dfs_master_enabled) /*pointer protection*/
2884*4882a593Smuzhiyun 		ret_val = *dm->dfs_master_enabled ? true : false;
2885*4882a593Smuzhiyun 
2886*4882a593Smuzhiyun 	return ret_val;
2887*4882a593Smuzhiyun #else
2888*4882a593Smuzhiyun 	return false;
2889*4882a593Smuzhiyun #endif
2890*4882a593Smuzhiyun }
2891*4882a593Smuzhiyun 
2892*4882a593Smuzhiyun #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
2893*4882a593Smuzhiyun #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
phydm_dfs_ap_reset_radar_detect_counter_and_flag(void * dm_void)2894*4882a593Smuzhiyun void phydm_dfs_ap_reset_radar_detect_counter_and_flag(void *dm_void)
2895*4882a593Smuzhiyun {
2896*4882a593Smuzhiyun 	struct dm_struct *dm = (struct dm_struct *)dm_void;
2897*4882a593Smuzhiyun 
2898*4882a593Smuzhiyun 	/* @Clear Radar Counter and Radar flag */
2899*4882a593Smuzhiyun 	odm_set_bb_reg(dm, R_0xa40, BIT(15), 0);
2900*4882a593Smuzhiyun 	odm_set_bb_reg(dm, R_0xa40, BIT(15), 1);
2901*4882a593Smuzhiyun 
2902*4882a593Smuzhiyun 	/* RT_TRACE(COMP_DFS, DBG_LOUD, ("[DFS], After reset radar counter, 0xcf8 = 0x%x, 0xcf4 = 0x%x\n", */
2903*4882a593Smuzhiyun 	/* PHY_QueryBBReg(Adapter, 0xcf8, bMaskDWord), */
2904*4882a593Smuzhiyun 	/* PHY_QueryBBReg(Adapter, 0xcf4, bMaskDWord))); */
2905*4882a593Smuzhiyun }
2906*4882a593Smuzhiyun #endif
2907*4882a593Smuzhiyun #endif
2908