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