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)))
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)))
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)) {
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)) {
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))
104*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa40, BIT(15), 0);
105*4882a593Smuzhiyun else if (dm->support_ic_type & (ODM_RTL8814B)) {
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, 0xb359c5bd);
447*4882a593Smuzhiyun if (dm->support_ic_type & (ODM_RTL8814B)) {
448*4882a593Smuzhiyun if (dm->seg1_dfs_flag == 1)
449*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa6c, BIT(0), 1);
450*4882a593Smuzhiyun }
451*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa44, MASKDWORD, 0x3033bebd);
452*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa48, MASKDWORD, 0x2a521254);
453*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa4c, MASKDWORD, 0xa2533345);
454*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa50, MASKDWORD, 0x605be003);
455*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa54, MASKDWORD, 0x500089e8);
456*4882a593Smuzhiyun } else if (region_domain == PHYDM_DFS_DOMAIN_MKK) {
457*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa40, MASKDWORD, 0xb359c5bd);
458*4882a593Smuzhiyun if (dm->support_ic_type & (ODM_RTL8814B)) {
459*4882a593Smuzhiyun if (dm->seg1_dfs_flag == 1)
460*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa6c, BIT(0), 1);
461*4882a593Smuzhiyun }
462*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa44, MASKDWORD, 0x3033bebd);
463*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa48, MASKDWORD, 0x2a521254);
464*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa4c, MASKDWORD, 0xa2533345);
465*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa50, MASKDWORD, 0x605be003);
466*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa54, MASKDWORD, 0x500089e8);
467*4882a593Smuzhiyun } else if (region_domain == PHYDM_DFS_DOMAIN_FCC) {
468*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa40, MASKDWORD, 0xb359c5bd);
469*4882a593Smuzhiyun if (dm->support_ic_type & (ODM_RTL8814B)) {
470*4882a593Smuzhiyun if (dm->seg1_dfs_flag == 1)
471*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa6c, BIT(0), 1);
472*4882a593Smuzhiyun }
473*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa44, MASKDWORD, 0x3033bebd);
474*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa48, MASKDWORD, 0x2a521254);
475*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa4c, MASKDWORD, 0xa2533345);
476*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa50, MASKDWORD, 0x605be003);
477*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa54, MASKDWORD, 0x500089e8);
478*4882a593Smuzhiyun } else {
479*4882a593Smuzhiyun /* not supported */
480*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
481*4882a593Smuzhiyun "Unsupported dfs_region_domain:%d\n",
482*4882a593Smuzhiyun region_domain);
483*4882a593Smuzhiyun goto exit;
484*4882a593Smuzhiyun }
485*4882a593Smuzhiyun #if (RTL8721D_SUPPORT)
486*4882a593Smuzhiyun } else if (dm->support_ic_type & ODM_RTL8721D) {
487*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0x814, 0x3fffffff, 0x04cc4d10);
488*4882a593Smuzhiyun /*CCA MASK*/
489*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xc38, 0x07c00000, 0x06);
490*4882a593Smuzhiyun /*CCA Threshold*/
491*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xc3c, 0x00000007, 0x0);
492*4882a593Smuzhiyun
493*4882a593Smuzhiyun if (dm->radar_detect_dbg_parm_en) {
494*4882a593Smuzhiyun phydm_radar_detect_with_dbg_parm(dm);
495*4882a593Smuzhiyun enable = 1;
496*4882a593Smuzhiyun goto exit;
497*4882a593Smuzhiyun }
498*4882a593Smuzhiyun
499*4882a593Smuzhiyun if (region_domain == PHYDM_DFS_DOMAIN_ETSI) {
500*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf54, MASKDWORD, 0x230006a8);
501*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf58, MASKDWORD, 0x354cd7dd);
502*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf5c, MASKDWORD, 0x9984ab25);
503*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf70, MASKDWORD, 0xbd9fab98);
504*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf74, MASKDWORD, 0xcc45029f);
505*4882a593Smuzhiyun
506*4882a593Smuzhiyun } else if (region_domain == PHYDM_DFS_DOMAIN_MKK) {
507*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf54, MASKDWORD, 0x230006a8);
508*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf5c, MASKDWORD, 0x9984ab25);
509*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf70, MASKDWORD, 0xbd9fb398);
510*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf74, MASKDWORD, 0xcc450e9d);
511*4882a593Smuzhiyun
512*4882a593Smuzhiyun if (c_channel >= 52 && c_channel <= 64) {
513*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf58, MASKDWORD,
514*4882a593Smuzhiyun 0x354cd7fd);
515*4882a593Smuzhiyun } else {
516*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf58, MASKDWORD,
517*4882a593Smuzhiyun 0x354cd7bd);
518*4882a593Smuzhiyun }
519*4882a593Smuzhiyun } else if (region_domain == PHYDM_DFS_DOMAIN_FCC) {
520*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf54, MASKDWORD, 0x230006a8);
521*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf58, MASKDWORD, 0x3558d7bd);
522*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf5c, MASKDWORD, 0x9984ab35);
523*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf70, MASKDWORD, 0xbd9fb398);
524*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf74, MASKDWORD, 0xcc444e9d);
525*4882a593Smuzhiyun } else {
526*4882a593Smuzhiyun /* not supported */
527*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
528*4882a593Smuzhiyun "Unsupported dfs_region_domain:%d\n",
529*4882a593Smuzhiyun region_domain);
530*4882a593Smuzhiyun goto exit;
531*4882a593Smuzhiyun }
532*4882a593Smuzhiyun
533*4882a593Smuzhiyun /*if peak index -1~+1, use original NB method*/
534*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf70, 0x00070000, 0x7);
535*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf74, 0x000c0000, 0);
536*4882a593Smuzhiyun
537*4882a593Smuzhiyun /*Turn off dfs scaling factor*/
538*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf70, 0x00080000, 0x0);
539*4882a593Smuzhiyun /*NonDC peak_th = 2times DC peak_th*/
540*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf58, 0x00007800, 1);
541*4882a593Smuzhiyun
542*4882a593Smuzhiyun /*low pulse width radar pattern will cause wrong drop*/
543*4882a593Smuzhiyun /*disable peak index should the same*/
544*4882a593Smuzhiyun /*during the same short pulse (new mechan)*/
545*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf70, 0x00100000, 0x0);
546*4882a593Smuzhiyun /*if peak index diff >=2, then drop the result*/
547*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf70, 0x30000000, 0x2);
548*4882a593Smuzhiyun #endif
549*4882a593Smuzhiyun } else {
550*4882a593Smuzhiyun /*not supported IC type*/
551*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "Unsupported IC type:%d\n",
552*4882a593Smuzhiyun dm->support_ic_type);
553*4882a593Smuzhiyun goto exit;
554*4882a593Smuzhiyun }
555*4882a593Smuzhiyun
556*4882a593Smuzhiyun enable = 1;
557*4882a593Smuzhiyun
558*4882a593Smuzhiyun if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
559*4882a593Smuzhiyun dfs->st_l2h_cur = (u8)odm_get_bb_reg(dm, R_0xa40, 0x00007f00);
560*4882a593Smuzhiyun dfs->pwdb_th_cur = (u8)odm_get_bb_reg(dm, R_0xa50, 0x000000f0);
561*4882a593Smuzhiyun dfs->peak_th = (u8)odm_get_bb_reg(dm, R_0xa48, 0x00c00000);
562*4882a593Smuzhiyun dfs->short_pulse_cnt_th = (u8)odm_get_bb_reg(dm, R_0xa50,
563*4882a593Smuzhiyun 0x00f00000);
564*4882a593Smuzhiyun dfs->long_pulse_cnt_th = (u8)odm_get_bb_reg(dm, R_0xa4c,
565*4882a593Smuzhiyun 0xf0000000);
566*4882a593Smuzhiyun dfs->peak_window = (u8)odm_get_bb_reg(dm, R_0xa40, 0x00030000);
567*4882a593Smuzhiyun dfs->three_peak_opt = (u8)odm_get_bb_reg(dm, R_0xa40,
568*4882a593Smuzhiyun 0x30000000);
569*4882a593Smuzhiyun dfs->three_peak_th2 = (u8)odm_get_bb_reg(dm, R_0xa44,
570*4882a593Smuzhiyun 0x00000007);
571*4882a593Smuzhiyun #if (RTL8721D_SUPPORT)
572*4882a593Smuzhiyun } else if (dm->support_ic_type & (ODM_RTL8721D)) {
573*4882a593Smuzhiyun dfs->st_l2h_cur = (u8)odm_get_bb_reg(dm, R_0xf54,
574*4882a593Smuzhiyun 0x0000001f) << 2);
575*4882a593Smuzhiyun dfs->st_l2h_cur += (u8)odm_get_bb_reg(dm, R_0xf58, 0xc0000000);
576*4882a593Smuzhiyun dfs->pwdb_th_cur = (u8)odm_get_bb_reg(dm, R_0xf70, 0x03c00000);
577*4882a593Smuzhiyun dfs->peak_th = (u8)odm_get_bb_reg(dm, R_0xf5c, 0x00000030);
578*4882a593Smuzhiyun dfs->short_pulse_cnt_th = (u8)odm_get_bb_reg(dm, R_0xf70,
579*4882a593Smuzhiyun 0x00007800);
580*4882a593Smuzhiyun dfs->long_pulse_cnt_th = (u8)odm_get_bb_reg(dm, R_0xf74,
581*4882a593Smuzhiyun 0x0000000f);
582*4882a593Smuzhiyun dfs->peak_window = (u8)odm_get_bb_reg(dm, R_0xf58, 0x18000000);
583*4882a593Smuzhiyun dfs->three_peak_opt = (u8)odm_get_bb_reg(dm, R_0xf58,
584*4882a593Smuzhiyun 0x00030000);
585*4882a593Smuzhiyun dfs->three_peak_th2 = (u8)odm_get_bb_reg(dm,
586*4882a593Smuzhiyun R_0xf58, 0x00007c00);
587*4882a593Smuzhiyun #endif
588*4882a593Smuzhiyun } else {
589*4882a593Smuzhiyun dfs->st_l2h_cur = (u8)odm_get_bb_reg(dm, R_0x91c, 0x000000ff);
590*4882a593Smuzhiyun dfs->pwdb_th_cur = (u8)odm_get_bb_reg(dm, R_0x918, 0x00001f00);
591*4882a593Smuzhiyun dfs->peak_th = (u8)odm_get_bb_reg(dm, R_0x918, 0x00030000);
592*4882a593Smuzhiyun dfs->short_pulse_cnt_th = (u8)odm_get_bb_reg(dm, R_0x920,
593*4882a593Smuzhiyun 0x000f0000);
594*4882a593Smuzhiyun dfs->long_pulse_cnt_th = (u8)odm_get_bb_reg(dm, R_0x920,
595*4882a593Smuzhiyun 0x00f00000);
596*4882a593Smuzhiyun dfs->peak_window = (u8)odm_get_bb_reg(dm, R_0x920, 0x00000300);
597*4882a593Smuzhiyun dfs->three_peak_opt = (u8)odm_get_bb_reg(dm, 0x924, 0x00000180);
598*4882a593Smuzhiyun dfs->three_peak_th2 = (u8)odm_get_bb_reg(dm, 0x924, 0x00007000);
599*4882a593Smuzhiyun }
600*4882a593Smuzhiyun
601*4882a593Smuzhiyun phydm_dfs_parameter_init(dm);
602*4882a593Smuzhiyun
603*4882a593Smuzhiyun exit:
604*4882a593Smuzhiyun if (enable) {
605*4882a593Smuzhiyun phydm_radar_detect_reset(dm);
606*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "on cch:%u, bw:%u\n", c_channel,
607*4882a593Smuzhiyun band_width);
608*4882a593Smuzhiyun } else
609*4882a593Smuzhiyun phydm_radar_detect_disable(dm);
610*4882a593Smuzhiyun }
611*4882a593Smuzhiyun
phydm_dfs_parameter_init(void * dm_void)612*4882a593Smuzhiyun void phydm_dfs_parameter_init(void *dm_void)
613*4882a593Smuzhiyun {
614*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
615*4882a593Smuzhiyun struct _DFS_STATISTICS *dfs = &dm->dfs;
616*4882a593Smuzhiyun
617*4882a593Smuzhiyun u8 i;
618*4882a593Smuzhiyun for (i = 0; i < 5; i++) {
619*4882a593Smuzhiyun dfs->pulse_flag_hist[i] = 0;
620*4882a593Smuzhiyun dfs->pulse_type_hist[i] = 0;
621*4882a593Smuzhiyun dfs->radar_det_mask_hist[i] = 0;
622*4882a593Smuzhiyun dfs->fa_inc_hist[i] = 0;
623*4882a593Smuzhiyun }
624*4882a593Smuzhiyun
625*4882a593Smuzhiyun /*@for dfs mode*/
626*4882a593Smuzhiyun dfs->force_TP_mode = 0;
627*4882a593Smuzhiyun dfs->sw_trigger_mode = 0;
628*4882a593Smuzhiyun dfs->det_print = 0;
629*4882a593Smuzhiyun dfs->det_print2 = 0;
630*4882a593Smuzhiyun dfs->print_hist_rpt = 0;
631*4882a593Smuzhiyun if (dm->support_ic_type & (ODM_RTL8814A | ODM_RTL8822B | ODM_RTL8821C))
632*4882a593Smuzhiyun dfs->hist_cond_on = 1;
633*4882a593Smuzhiyun else
634*4882a593Smuzhiyun dfs->hist_cond_on = 0;
635*4882a593Smuzhiyun
636*4882a593Smuzhiyun /*@for dynamic dfs*/
637*4882a593Smuzhiyun dfs->pwdb_th = 8;
638*4882a593Smuzhiyun dfs->fa_mask_th = 30 * (dfs->dfs_polling_time / 100);
639*4882a593Smuzhiyun dfs->st_l2h_min = 0x20;
640*4882a593Smuzhiyun dfs->st_l2h_max = 0x4e;
641*4882a593Smuzhiyun dfs->pwdb_scalar_factor = 12;
642*4882a593Smuzhiyun
643*4882a593Smuzhiyun /*@for dfs histogram*/
644*4882a593Smuzhiyun dfs->pri_hist_th = 5;
645*4882a593Smuzhiyun dfs->pri_sum_g1_th = 9;
646*4882a593Smuzhiyun dfs->pri_sum_g5_th = 5;
647*4882a593Smuzhiyun dfs->pri_sum_g1_fcc_th = 4; /*@FCC Type6*/
648*4882a593Smuzhiyun dfs->pri_sum_g3_fcc_th = 6;
649*4882a593Smuzhiyun dfs->pri_sum_safe_th = 50;
650*4882a593Smuzhiyun dfs->pri_sum_safe_fcc_th = 110; /*@30 for AP*/
651*4882a593Smuzhiyun dfs->pri_sum_type4_th = 16;
652*4882a593Smuzhiyun dfs->pri_sum_type6_th = 12;
653*4882a593Smuzhiyun dfs->pri_sum_g5_under_g1_th = 4;
654*4882a593Smuzhiyun dfs->pri_pw_diff_th = 4;
655*4882a593Smuzhiyun dfs->pri_pw_diff_fcc_th = 8;
656*4882a593Smuzhiyun dfs->pri_pw_diff_fcc_idle_th = 2;
657*4882a593Smuzhiyun dfs->pri_pw_diff_w53_th = 10;
658*4882a593Smuzhiyun dfs->pw_std_th = 7; /*@FCC Type4*/
659*4882a593Smuzhiyun dfs->pw_std_idle_th = 10;
660*4882a593Smuzhiyun dfs->pri_std_th = 6; /*@FCC Type3,4,6*/
661*4882a593Smuzhiyun dfs->pri_std_idle_th = 10;
662*4882a593Smuzhiyun dfs->pri_type1_upp_fcc_th = 110;
663*4882a593Smuzhiyun dfs->pri_type1_low_fcc_th = 50;
664*4882a593Smuzhiyun dfs->pri_type1_cen_fcc_th = 70;
665*4882a593Smuzhiyun dfs->pw_g0_th = 8;
666*4882a593Smuzhiyun dfs->pw_long_lower_th = 6; /*@7->6*/
667*4882a593Smuzhiyun dfs->pri_long_upper_th = 30;
668*4882a593Smuzhiyun dfs->pw_long_lower_20m_th = 7; /*@7 for AP*/
669*4882a593Smuzhiyun dfs->pw_long_sum_upper_th = 60;
670*4882a593Smuzhiyun dfs->type4_pw_max_cnt = 7;
671*4882a593Smuzhiyun dfs->type4_safe_pri_sum_th = 5;
672*4882a593Smuzhiyun }
673*4882a593Smuzhiyun
phydm_dfs_dynamic_setting(void * dm_void)674*4882a593Smuzhiyun void phydm_dfs_dynamic_setting(
675*4882a593Smuzhiyun void *dm_void)
676*4882a593Smuzhiyun {
677*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
678*4882a593Smuzhiyun struct _DFS_STATISTICS *dfs = &dm->dfs;
679*4882a593Smuzhiyun
680*4882a593Smuzhiyun u8 peak_th_cur = 0, short_pulse_cnt_th_cur = 0;
681*4882a593Smuzhiyun u8 long_pulse_cnt_th_cur = 0, three_peak_opt_cur = 0;
682*4882a593Smuzhiyun u8 three_peak_th2_cur = 0;
683*4882a593Smuzhiyun u8 peak_window_cur = 0;
684*4882a593Smuzhiyun u8 region_domain = dm->dfs_region_domain;
685*4882a593Smuzhiyun u8 c_channel = *dm->channel;
686*4882a593Smuzhiyun
687*4882a593Smuzhiyun if (dm->rx_tp + dm->tx_tp <= 2) {
688*4882a593Smuzhiyun dfs->idle_mode = 1;
689*4882a593Smuzhiyun if (dfs->force_TP_mode)
690*4882a593Smuzhiyun dfs->idle_mode = 0;
691*4882a593Smuzhiyun } else {
692*4882a593Smuzhiyun dfs->idle_mode = 0;
693*4882a593Smuzhiyun }
694*4882a593Smuzhiyun
695*4882a593Smuzhiyun if (dfs->idle_mode == 1) { /*@idle (no traffic)*/
696*4882a593Smuzhiyun peak_th_cur = 3;
697*4882a593Smuzhiyun short_pulse_cnt_th_cur = 6;
698*4882a593Smuzhiyun long_pulse_cnt_th_cur = 9;
699*4882a593Smuzhiyun peak_window_cur = 2;
700*4882a593Smuzhiyun three_peak_opt_cur = 0;
701*4882a593Smuzhiyun three_peak_th2_cur = 2;
702*4882a593Smuzhiyun if (region_domain == PHYDM_DFS_DOMAIN_MKK) {
703*4882a593Smuzhiyun if (c_channel >= 52 && c_channel <= 64) {
704*4882a593Smuzhiyun short_pulse_cnt_th_cur = 14;
705*4882a593Smuzhiyun long_pulse_cnt_th_cur = 15;
706*4882a593Smuzhiyun three_peak_th2_cur = 0;
707*4882a593Smuzhiyun } else {
708*4882a593Smuzhiyun short_pulse_cnt_th_cur = 6;
709*4882a593Smuzhiyun three_peak_th2_cur = 0;
710*4882a593Smuzhiyun long_pulse_cnt_th_cur = 10;
711*4882a593Smuzhiyun }
712*4882a593Smuzhiyun } else if (region_domain == PHYDM_DFS_DOMAIN_FCC) {
713*4882a593Smuzhiyun three_peak_th2_cur = 0;
714*4882a593Smuzhiyun } else if (region_domain == PHYDM_DFS_DOMAIN_ETSI) {
715*4882a593Smuzhiyun long_pulse_cnt_th_cur = 15;
716*4882a593Smuzhiyun if (phydm_dfs_is_meteorology_channel(dm)) {
717*4882a593Smuzhiyun /*need to add check cac end condition*/
718*4882a593Smuzhiyun peak_th_cur = 2;
719*4882a593Smuzhiyun three_peak_opt_cur = 0;
720*4882a593Smuzhiyun three_peak_th2_cur = 0;
721*4882a593Smuzhiyun short_pulse_cnt_th_cur = 7;
722*4882a593Smuzhiyun } else {
723*4882a593Smuzhiyun three_peak_opt_cur = 0;
724*4882a593Smuzhiyun three_peak_th2_cur = 0;
725*4882a593Smuzhiyun short_pulse_cnt_th_cur = 7;
726*4882a593Smuzhiyun }
727*4882a593Smuzhiyun } else /*@default: FCC*/
728*4882a593Smuzhiyun three_peak_th2_cur = 0;
729*4882a593Smuzhiyun
730*4882a593Smuzhiyun } else { /*@in service (with TP)*/
731*4882a593Smuzhiyun peak_th_cur = 2;
732*4882a593Smuzhiyun short_pulse_cnt_th_cur = 6;
733*4882a593Smuzhiyun long_pulse_cnt_th_cur = 7;
734*4882a593Smuzhiyun peak_window_cur = 2;
735*4882a593Smuzhiyun three_peak_opt_cur = 0;
736*4882a593Smuzhiyun three_peak_th2_cur = 2;
737*4882a593Smuzhiyun if (region_domain == PHYDM_DFS_DOMAIN_MKK) {
738*4882a593Smuzhiyun if (c_channel >= 52 && c_channel <= 64) {
739*4882a593Smuzhiyun long_pulse_cnt_th_cur = 15;
740*4882a593Smuzhiyun /*@for high duty cycle*/
741*4882a593Smuzhiyun short_pulse_cnt_th_cur = 5;
742*4882a593Smuzhiyun three_peak_th2_cur = 0;
743*4882a593Smuzhiyun } else {
744*4882a593Smuzhiyun three_peak_opt_cur = 0;
745*4882a593Smuzhiyun three_peak_th2_cur = 0;
746*4882a593Smuzhiyun long_pulse_cnt_th_cur = 8;
747*4882a593Smuzhiyun }
748*4882a593Smuzhiyun } else if (region_domain == PHYDM_DFS_DOMAIN_FCC) {
749*4882a593Smuzhiyun long_pulse_cnt_th_cur = 5; /*for 80M FCC*/
750*4882a593Smuzhiyun short_pulse_cnt_th_cur = 5; /*for 80M FCC*/
751*4882a593Smuzhiyun } else if (region_domain == PHYDM_DFS_DOMAIN_ETSI) {
752*4882a593Smuzhiyun long_pulse_cnt_th_cur = 15;
753*4882a593Smuzhiyun short_pulse_cnt_th_cur = 5;
754*4882a593Smuzhiyun three_peak_opt_cur = 0;
755*4882a593Smuzhiyun }
756*4882a593Smuzhiyun }
757*4882a593Smuzhiyun
758*4882a593Smuzhiyun if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
759*4882a593Smuzhiyun if (dfs->peak_th != peak_th_cur)
760*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa48, 0x00c00000, peak_th_cur);
761*4882a593Smuzhiyun if (dfs->short_pulse_cnt_th != short_pulse_cnt_th_cur)
762*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa50, 0x00f00000,
763*4882a593Smuzhiyun short_pulse_cnt_th_cur);
764*4882a593Smuzhiyun if (dfs->long_pulse_cnt_th != long_pulse_cnt_th_cur)
765*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa4c, 0xf0000000,
766*4882a593Smuzhiyun long_pulse_cnt_th_cur);
767*4882a593Smuzhiyun if (dfs->peak_window != peak_window_cur)
768*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa40, 0x00030000,
769*4882a593Smuzhiyun peak_window_cur);
770*4882a593Smuzhiyun if (dfs->three_peak_opt != three_peak_opt_cur)
771*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa40, 0x30000000,
772*4882a593Smuzhiyun three_peak_opt_cur);
773*4882a593Smuzhiyun if (dfs->three_peak_th2 != three_peak_th2_cur)
774*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa44, 0x00000007,
775*4882a593Smuzhiyun three_peak_th2_cur);
776*4882a593Smuzhiyun #if (RTL8721D_SUPPORT)
777*4882a593Smuzhiyun } else if (dm->support_ic_type & (ODM_RTL8721D)) {
778*4882a593Smuzhiyun if (dfs->peak_th != peak_th_cur)
779*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf5c, 0x00000030, peak_th_cur);
780*4882a593Smuzhiyun if (dfs->short_pulse_cnt_th != short_pulse_cnt_th_cur)
781*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf70, 0x00007800,
782*4882a593Smuzhiyun short_pulse_cnt_th_cur);
783*4882a593Smuzhiyun if (dfs->long_pulse_cnt_th != long_pulse_cnt_th_cur)
784*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf74, 0x0000000f,
785*4882a593Smuzhiyun long_pulse_cnt_th_cur);
786*4882a593Smuzhiyun if (dfs->peak_window != peak_window_cur)
787*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf58, 0x18000000,
788*4882a593Smuzhiyun peak_window_cur);
789*4882a593Smuzhiyun if (dfs->three_peak_opt != three_peak_opt_cur)
790*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf58, 0x00030000,
791*4882a593Smuzhiyun three_peak_opt_cur);
792*4882a593Smuzhiyun if (dfs->three_peak_th2 != three_peak_th2_cur)
793*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf58, 0x00007c00,
794*4882a593Smuzhiyun three_peak_th2_cur);
795*4882a593Smuzhiyun #endif
796*4882a593Smuzhiyun } else {
797*4882a593Smuzhiyun if (dfs->peak_th != peak_th_cur)
798*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0x918, 0x00030000, peak_th_cur);
799*4882a593Smuzhiyun if (dfs->short_pulse_cnt_th != short_pulse_cnt_th_cur)
800*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0x920, 0x000f0000,
801*4882a593Smuzhiyun short_pulse_cnt_th_cur);
802*4882a593Smuzhiyun if (dfs->long_pulse_cnt_th != long_pulse_cnt_th_cur)
803*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0x920, 0x00f00000,
804*4882a593Smuzhiyun long_pulse_cnt_th_cur);
805*4882a593Smuzhiyun if (dfs->peak_window != peak_window_cur)
806*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0x920, 0x00000300,
807*4882a593Smuzhiyun peak_window_cur);
808*4882a593Smuzhiyun if (dfs->three_peak_opt != three_peak_opt_cur)
809*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0x924, 0x00000180,
810*4882a593Smuzhiyun three_peak_opt_cur);
811*4882a593Smuzhiyun if (dfs->three_peak_th2 != three_peak_th2_cur)
812*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0x924, 0x00007000,
813*4882a593Smuzhiyun three_peak_th2_cur);
814*4882a593Smuzhiyun }
815*4882a593Smuzhiyun
816*4882a593Smuzhiyun dfs->peak_th = peak_th_cur;
817*4882a593Smuzhiyun dfs->short_pulse_cnt_th = short_pulse_cnt_th_cur;
818*4882a593Smuzhiyun dfs->long_pulse_cnt_th = long_pulse_cnt_th_cur;
819*4882a593Smuzhiyun dfs->peak_window = peak_window_cur;
820*4882a593Smuzhiyun dfs->three_peak_opt = three_peak_opt_cur;
821*4882a593Smuzhiyun dfs->three_peak_th2 = three_peak_th2_cur;
822*4882a593Smuzhiyun }
823*4882a593Smuzhiyun
824*4882a593Smuzhiyun boolean
phydm_radar_detect_dm_check(void * dm_void)825*4882a593Smuzhiyun phydm_radar_detect_dm_check(
826*4882a593Smuzhiyun void *dm_void)
827*4882a593Smuzhiyun {
828*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
829*4882a593Smuzhiyun struct _DFS_STATISTICS *dfs = &dm->dfs;
830*4882a593Smuzhiyun u8 region_domain = dm->dfs_region_domain, index = 0;
831*4882a593Smuzhiyun
832*4882a593Smuzhiyun u16 i = 0, j = 0, fa_count_cur = 0, fa_count_inc = 0;
833*4882a593Smuzhiyun u16 total_fa_in_hist = 0, total_pulse_count_inc = 0;
834*4882a593Smuzhiyun u16 short_pulse_cnt_inc = 0, short_pulse_cnt_cur = 0;
835*4882a593Smuzhiyun u16 long_pulse_cnt_inc = 0, long_pulse_cnt_cur = 0;
836*4882a593Smuzhiyun u32 regf98_value = 0, reg918_value = 0, reg91c_value = 0;
837*4882a593Smuzhiyun u32 reg920_value = 0, reg924_value = 0, radar_rpt_reg_value = 0;
838*4882a593Smuzhiyun u32 regf54_value = 0, regf58_value = 0, regf5c_value = 0;
839*4882a593Smuzhiyun u32 regdf4_value = 0, regf70_value = 0, regf74_value = 0;
840*4882a593Smuzhiyun #if (RTL8812F_SUPPORT || RTL8822C_SUPPORT || RTL8814B_SUPPORT)
841*4882a593Smuzhiyun u32 rega40_value = 0, rega44_value = 0, rega48_value = 0;
842*4882a593Smuzhiyun u32 rega4c_value = 0, rega50_value = 0, rega54_value = 0;
843*4882a593Smuzhiyun #endif
844*4882a593Smuzhiyun #if (RTL8721D_SUPPORT)
845*4882a593Smuzhiyun u32 reg908_value = 0, regdf4_value = 0;
846*4882a593Smuzhiyun u32 regf54_value = 0, regf58_value = 0, regf5c_value = 0;
847*4882a593Smuzhiyun u32 regf70_value = 0, regf74_value = 0;
848*4882a593Smuzhiyun #endif
849*4882a593Smuzhiyun boolean tri_short_pulse = 0, tri_long_pulse = 0, radar_type = 0;
850*4882a593Smuzhiyun boolean fault_flag_det = 0, fault_flag_psd = 0, fa_flag = 0;
851*4882a593Smuzhiyun boolean radar_detected = 0;
852*4882a593Smuzhiyun u8 st_l2h_new = 0, fa_mask_th = 0, k = 0, sum = 0;
853*4882a593Smuzhiyun u8 c_channel = *dm->channel;
854*4882a593Smuzhiyun
855*4882a593Smuzhiyun /*@Get FA count during past 100ms, R_0xf48 for AC series*/
856*4882a593Smuzhiyun if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
857*4882a593Smuzhiyun fa_count_cur = (u16)odm_get_bb_reg(dm, R_0x2d00, MASKLWORD);
858*4882a593Smuzhiyun #if (RTL8721D_SUPPORT)
859*4882a593Smuzhiyun else if (dm->support_ic_type & (ODM_RTL8721D)) {
860*4882a593Smuzhiyun fa_count_cur = (u16)odm_get_bb_reg(dm,
861*4882a593Smuzhiyun ODM_REG_OFDM_FA_TYPE2_11N,
862*4882a593Smuzhiyun MASKHWORD);
863*4882a593Smuzhiyun fa_count_cur += (u16)odm_get_bb_reg(dm,
864*4882a593Smuzhiyun ODM_REG_OFDM_FA_TYPE3_11N,
865*4882a593Smuzhiyun MASKLWORD);
866*4882a593Smuzhiyun fa_count_cur += (u16)odm_get_bb_reg(dm,
867*4882a593Smuzhiyun ODM_REG_OFDM_FA_TYPE3_11N,
868*4882a593Smuzhiyun MASKHWORD);
869*4882a593Smuzhiyun fa_count_cur += (u16)odm_get_bb_reg(dm,
870*4882a593Smuzhiyun ODM_REG_OFDM_FA_TYPE4_11N,
871*4882a593Smuzhiyun MASKLWORD);
872*4882a593Smuzhiyun fa_count_cur += (u16)odm_get_bb_reg(dm,
873*4882a593Smuzhiyun ODM_REG_OFDM_FA_TYPE1_11N,
874*4882a593Smuzhiyun MASKLWORD);
875*4882a593Smuzhiyun fa_count_cur += (u16)odm_get_bb_reg(dm,
876*4882a593Smuzhiyun ODM_REG_OFDM_FA_TYPE1_11N,
877*4882a593Smuzhiyun MASKHWORD);
878*4882a593Smuzhiyun }
879*4882a593Smuzhiyun #endif
880*4882a593Smuzhiyun else
881*4882a593Smuzhiyun fa_count_cur = (u16)odm_get_bb_reg(dm, R_0xf48, 0x0000ffff);
882*4882a593Smuzhiyun
883*4882a593Smuzhiyun if (dfs->fa_count_pre == 0)
884*4882a593Smuzhiyun fa_count_inc = 0;
885*4882a593Smuzhiyun else if (fa_count_cur >= dfs->fa_count_pre)
886*4882a593Smuzhiyun fa_count_inc = fa_count_cur - dfs->fa_count_pre;
887*4882a593Smuzhiyun else
888*4882a593Smuzhiyun fa_count_inc = fa_count_cur;
889*4882a593Smuzhiyun dfs->fa_count_pre = fa_count_cur;
890*4882a593Smuzhiyun
891*4882a593Smuzhiyun dfs->fa_inc_hist[dfs->mask_idx] = fa_count_inc;
892*4882a593Smuzhiyun
893*4882a593Smuzhiyun for (i = 0; i < 5; i++)
894*4882a593Smuzhiyun total_fa_in_hist = total_fa_in_hist + dfs->fa_inc_hist[i];
895*4882a593Smuzhiyun
896*4882a593Smuzhiyun if (dfs->mask_idx >= 2)
897*4882a593Smuzhiyun index = dfs->mask_idx - 2;
898*4882a593Smuzhiyun else
899*4882a593Smuzhiyun index = 5 + dfs->mask_idx - 2;
900*4882a593Smuzhiyun
901*4882a593Smuzhiyun if (dm->support_ic_type & (ODM_RTL8198F | ODM_RTL8822C | ODM_RTL8812F |
902*4882a593Smuzhiyun ODM_RTL8197G)) {
903*4882a593Smuzhiyun radar_rpt_reg_value = odm_get_bb_reg(dm, R_0x2e00, 0xffffffff);
904*4882a593Smuzhiyun short_pulse_cnt_cur = (u16)((radar_rpt_reg_value & 0x000ff800)
905*4882a593Smuzhiyun >> 11);
906*4882a593Smuzhiyun long_pulse_cnt_cur = (u16)((radar_rpt_reg_value & 0x0fc00000)
907*4882a593Smuzhiyun >> 22);
908*4882a593Smuzhiyun #if (RTL8721D_SUPPORT)
909*4882a593Smuzhiyun } else if (dm->support_ic_type & (ODM_RTL8721D)) {
910*4882a593Smuzhiyun reg908_value = (u32)odm_get_bb_reg(dm, R_0x908, MASKDWORD);
911*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0x908, MASKDWORD, 0x254);
912*4882a593Smuzhiyun regdf4_value = odm_get_bb_reg(dm, R_0xdf4, MASKDWORD);
913*4882a593Smuzhiyun short_pulse_cnt_cur = (u16)((regdf4_value & 0x000ff000) >> 12);
914*4882a593Smuzhiyun long_pulse_cnt_cur = (u16)((regdf4_value & 0x0fc00000) >> 22);
915*4882a593Smuzhiyun
916*4882a593Smuzhiyun tri_short_pulse = (regdf4_value & BIT(20)) ? 1 : 0;
917*4882a593Smuzhiyun tri_long_pulse = (regdf4_value & BIT(28)) ? 1 : 0;
918*4882a593Smuzhiyun if (tri_short_pulse || tri_long_pulse) {
919*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf58, BIT(29), 0);
920*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf58, BIT(29), 1);
921*4882a593Smuzhiyun }
922*4882a593Smuzhiyun #endif
923*4882a593Smuzhiyun } else if (dm->support_ic_type & (ODM_RTL8814B)) {
924*4882a593Smuzhiyun if (dm->seg1_dfs_flag == 1)
925*4882a593Smuzhiyun radar_rpt_reg_value = odm_get_bb_reg(dm, R_0x2e20,
926*4882a593Smuzhiyun 0xffffffff);
927*4882a593Smuzhiyun else
928*4882a593Smuzhiyun radar_rpt_reg_value = odm_get_bb_reg(dm, R_0x2e00,
929*4882a593Smuzhiyun 0xffffffff);
930*4882a593Smuzhiyun short_pulse_cnt_cur = (u16)((radar_rpt_reg_value & 0x000ff800)
931*4882a593Smuzhiyun >> 11);
932*4882a593Smuzhiyun long_pulse_cnt_cur = (u16)((radar_rpt_reg_value & 0x0fc00000)
933*4882a593Smuzhiyun >> 22);
934*4882a593Smuzhiyun } else {
935*4882a593Smuzhiyun regf98_value = odm_get_bb_reg(dm, R_0xf98, 0xffffffff);
936*4882a593Smuzhiyun short_pulse_cnt_cur = (u16)(regf98_value & 0x000000ff);
937*4882a593Smuzhiyun long_pulse_cnt_cur = (u16)((regf98_value & 0x0000ff00) >> 8);
938*4882a593Smuzhiyun }
939*4882a593Smuzhiyun
940*4882a593Smuzhiyun /*@Get short pulse count, need carefully handle the counter overflow*/
941*4882a593Smuzhiyun if (short_pulse_cnt_cur >= dfs->short_pulse_cnt_pre) {
942*4882a593Smuzhiyun short_pulse_cnt_inc = short_pulse_cnt_cur -
943*4882a593Smuzhiyun dfs->short_pulse_cnt_pre;
944*4882a593Smuzhiyun } else {
945*4882a593Smuzhiyun short_pulse_cnt_inc = short_pulse_cnt_cur;
946*4882a593Smuzhiyun }
947*4882a593Smuzhiyun dfs->short_pulse_cnt_pre = short_pulse_cnt_cur;
948*4882a593Smuzhiyun
949*4882a593Smuzhiyun /*@Get long pulse count, need carefully handle the counter overflow*/
950*4882a593Smuzhiyun if (long_pulse_cnt_cur >= dfs->long_pulse_cnt_pre) {
951*4882a593Smuzhiyun long_pulse_cnt_inc = long_pulse_cnt_cur -
952*4882a593Smuzhiyun dfs->long_pulse_cnt_pre;
953*4882a593Smuzhiyun } else {
954*4882a593Smuzhiyun long_pulse_cnt_inc = long_pulse_cnt_cur;
955*4882a593Smuzhiyun }
956*4882a593Smuzhiyun dfs->long_pulse_cnt_pre = long_pulse_cnt_cur;
957*4882a593Smuzhiyun
958*4882a593Smuzhiyun total_pulse_count_inc = short_pulse_cnt_inc + long_pulse_cnt_inc;
959*4882a593Smuzhiyun
960*4882a593Smuzhiyun if (dfs->det_print) {
961*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
962*4882a593Smuzhiyun "===============================================\n");
963*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "FA_count_inc[%d]\n", fa_count_inc);
964*4882a593Smuzhiyun if (dm->support_ic_type & (ODM_RTL8721D)) {
965*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
966*4882a593Smuzhiyun "Init_Gain[%x] st_l2h_cur[%x] 0xdf4[%08x] short_pulse_cnt_inc[%d] long_pulse_cnt_inc[%d]\n",
967*4882a593Smuzhiyun dfs->igi_cur, dfs->st_l2h_cur, regdf4_value,
968*4882a593Smuzhiyun short_pulse_cnt_inc, long_pulse_cnt_inc);
969*4882a593Smuzhiyun regf54_value = odm_get_bb_reg(dm, R_0xf54, MASKDWORD);
970*4882a593Smuzhiyun regf58_value = odm_get_bb_reg(dm, R_0xf58, MASKDWORD);
971*4882a593Smuzhiyun regf5c_value = odm_get_bb_reg(dm, R_0xf5c, MASKDWORD);
972*4882a593Smuzhiyun regf70_value = odm_get_bb_reg(dm, R_0xf70, MASKDWORD);
973*4882a593Smuzhiyun regf74_value = odm_get_bb_reg(dm, R_0xf74, MASKDWORD);
974*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
975*4882a593Smuzhiyun "0xf54[%08x] 0xf58[%08x] 0xf5c[%08x] 0xf70[%08x] 0xf74[%08x]\n",
976*4882a593Smuzhiyun regf54_value, regf58_value, regf5c_value,
977*4882a593Smuzhiyun regf70_value, regf74_value);
978*4882a593Smuzhiyun } else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
979*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
980*4882a593Smuzhiyun "Init_Gain[%x] st_l2h_cur[%x] 0x2dbc[%08x] short_pulse_cnt_inc[%d] long_pulse_cnt_inc[%d]\n",
981*4882a593Smuzhiyun dfs->igi_cur, dfs->st_l2h_cur,
982*4882a593Smuzhiyun radar_rpt_reg_value, short_pulse_cnt_inc,
983*4882a593Smuzhiyun long_pulse_cnt_inc);
984*4882a593Smuzhiyun #if (RTL8812F_SUPPORT || RTL8822C_SUPPORT || RTL8814B_SUPPORT)
985*4882a593Smuzhiyun rega40_value = odm_get_bb_reg(dm, R_0xa40, MASKDWORD);
986*4882a593Smuzhiyun rega44_value = odm_get_bb_reg(dm, R_0xa44, MASKDWORD);
987*4882a593Smuzhiyun rega48_value = odm_get_bb_reg(dm, R_0xa48, MASKDWORD);
988*4882a593Smuzhiyun rega4c_value = odm_get_bb_reg(dm, R_0xa4c, MASKDWORD);
989*4882a593Smuzhiyun rega50_value = odm_get_bb_reg(dm, R_0xa50, MASKDWORD);
990*4882a593Smuzhiyun rega54_value = odm_get_bb_reg(dm, R_0xa54, MASKDWORD);
991*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
992*4882a593Smuzhiyun "0xa40[%08x] 0xa44[%08x] 0xa48[%08x] 0xa4c[%08x] 0xa50[%08x] 0xa54[%08x]\n",
993*4882a593Smuzhiyun rega40_value, rega44_value, rega48_value,
994*4882a593Smuzhiyun rega4c_value, rega50_value, rega54_value);
995*4882a593Smuzhiyun #endif
996*4882a593Smuzhiyun } else {
997*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
998*4882a593Smuzhiyun "Init_Gain[%x] 0x91c[%x] 0xf98[%08x] short_pulse_cnt_inc[%d] long_pulse_cnt_inc[%d]\n",
999*4882a593Smuzhiyun dfs->igi_cur, dfs->st_l2h_cur, regf98_value,
1000*4882a593Smuzhiyun short_pulse_cnt_inc, long_pulse_cnt_inc);
1001*4882a593Smuzhiyun reg918_value = odm_get_bb_reg(dm, R_0x918,
1002*4882a593Smuzhiyun 0xffffffff);
1003*4882a593Smuzhiyun reg91c_value = odm_get_bb_reg(dm, R_0x91c,
1004*4882a593Smuzhiyun 0xffffffff);
1005*4882a593Smuzhiyun reg920_value = odm_get_bb_reg(dm, R_0x920,
1006*4882a593Smuzhiyun 0xffffffff);
1007*4882a593Smuzhiyun reg924_value = odm_get_bb_reg(dm, R_0x924,
1008*4882a593Smuzhiyun 0xffffffff);
1009*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1010*4882a593Smuzhiyun "0x918[%08x] 0x91c[%08x] 0x920[%08x] 0x924[%08x]\n",
1011*4882a593Smuzhiyun reg918_value, reg91c_value,
1012*4882a593Smuzhiyun reg920_value, reg924_value);
1013*4882a593Smuzhiyun }
1014*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "Throughput: %dMbps\n",
1015*4882a593Smuzhiyun (dm->rx_tp + dm->tx_tp));
1016*4882a593Smuzhiyun
1017*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1018*4882a593Smuzhiyun "dfs_regdomain = %d, dbg_mode = %d, idle_mode = %d, print_hist_rpt = %d, hist_cond_on = %d\n",
1019*4882a593Smuzhiyun region_domain, dfs->dbg_mode,
1020*4882a593Smuzhiyun dfs->idle_mode, dfs->print_hist_rpt,
1021*4882a593Smuzhiyun dfs->hist_cond_on);
1022*4882a593Smuzhiyun }
1023*4882a593Smuzhiyun if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
1024*4882a593Smuzhiyun tri_short_pulse = (radar_rpt_reg_value & BIT(20)) ? 1 : 0;
1025*4882a593Smuzhiyun tri_long_pulse = (radar_rpt_reg_value & BIT(28)) ? 1 : 0;
1026*4882a593Smuzhiyun } else {
1027*4882a593Smuzhiyun tri_short_pulse = (regf98_value & BIT(17)) ? 1 : 0;
1028*4882a593Smuzhiyun tri_long_pulse = (regf98_value & BIT(19)) ? 1 : 0;
1029*4882a593Smuzhiyun }
1030*4882a593Smuzhiyun
1031*4882a593Smuzhiyun if (tri_short_pulse) {
1032*4882a593Smuzhiyun phydm_radar_detect_reset(dm);
1033*4882a593Smuzhiyun }
1034*4882a593Smuzhiyun if (tri_long_pulse) {
1035*4882a593Smuzhiyun phydm_radar_detect_reset(dm);
1036*4882a593Smuzhiyun if (region_domain == PHYDM_DFS_DOMAIN_MKK) {
1037*4882a593Smuzhiyun if (c_channel >= 52 && c_channel <= 64) {
1038*4882a593Smuzhiyun tri_long_pulse = 0;
1039*4882a593Smuzhiyun }
1040*4882a593Smuzhiyun }
1041*4882a593Smuzhiyun if (region_domain == PHYDM_DFS_DOMAIN_ETSI) {
1042*4882a593Smuzhiyun tri_long_pulse = 0;
1043*4882a593Smuzhiyun }
1044*4882a593Smuzhiyun }
1045*4882a593Smuzhiyun
1046*4882a593Smuzhiyun st_l2h_new = dfs->st_l2h_cur;
1047*4882a593Smuzhiyun dfs->pulse_flag_hist[dfs->mask_idx] = tri_short_pulse | tri_long_pulse;
1048*4882a593Smuzhiyun dfs->pulse_type_hist[dfs->mask_idx] = (tri_long_pulse) ? 1 : 0;
1049*4882a593Smuzhiyun
1050*4882a593Smuzhiyun /* PSD(not ready) */
1051*4882a593Smuzhiyun
1052*4882a593Smuzhiyun fault_flag_det = 0;
1053*4882a593Smuzhiyun fault_flag_psd = 0;
1054*4882a593Smuzhiyun fa_flag = 0;
1055*4882a593Smuzhiyun if (region_domain == PHYDM_DFS_DOMAIN_ETSI) {
1056*4882a593Smuzhiyun fa_mask_th = dfs->fa_mask_th + 20;
1057*4882a593Smuzhiyun } else {
1058*4882a593Smuzhiyun fa_mask_th = dfs->fa_mask_th;
1059*4882a593Smuzhiyun }
1060*4882a593Smuzhiyun if (total_fa_in_hist >= fa_mask_th || dfs->igi_cur >= 0x30) {
1061*4882a593Smuzhiyun /* st_l2h_new = dfs->st_l2h_max; */
1062*4882a593Smuzhiyun dfs->radar_det_mask_hist[index] = 1;
1063*4882a593Smuzhiyun if (dfs->pulse_flag_hist[index] == 1) {
1064*4882a593Smuzhiyun dfs->pulse_flag_hist[index] = 0;
1065*4882a593Smuzhiyun if (dfs->det_print2) {
1066*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1067*4882a593Smuzhiyun "Radar is masked : FA mask\n");
1068*4882a593Smuzhiyun }
1069*4882a593Smuzhiyun }
1070*4882a593Smuzhiyun fa_flag = 1;
1071*4882a593Smuzhiyun } else {
1072*4882a593Smuzhiyun dfs->radar_det_mask_hist[index] = 0;
1073*4882a593Smuzhiyun }
1074*4882a593Smuzhiyun
1075*4882a593Smuzhiyun if (dfs->det_print) {
1076*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "mask_idx: %d\n", dfs->mask_idx);
1077*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "radar_det_mask_hist: ");
1078*4882a593Smuzhiyun for (i = 0; i < 5; i++)
1079*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "%d ",
1080*4882a593Smuzhiyun dfs->radar_det_mask_hist[i]);
1081*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "pulse_flag_hist: ");
1082*4882a593Smuzhiyun for (i = 0; i < 5; i++)
1083*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "%d ", dfs->pulse_flag_hist[i]);
1084*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "fa_inc_hist: ");
1085*4882a593Smuzhiyun for (i = 0; i < 5; i++)
1086*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "%d ", dfs->fa_inc_hist[i]);
1087*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1088*4882a593Smuzhiyun "\nfa_mask_th: %d, total_fa_in_hist: %d ",
1089*4882a593Smuzhiyun fa_mask_th, total_fa_in_hist);
1090*4882a593Smuzhiyun }
1091*4882a593Smuzhiyun
1092*4882a593Smuzhiyun sum = 0;
1093*4882a593Smuzhiyun for (k = 0; k < 5; k++) {
1094*4882a593Smuzhiyun if (dfs->radar_det_mask_hist[k] == 1)
1095*4882a593Smuzhiyun sum++;
1096*4882a593Smuzhiyun }
1097*4882a593Smuzhiyun
1098*4882a593Smuzhiyun if (dfs->mask_hist_checked <= 5)
1099*4882a593Smuzhiyun dfs->mask_hist_checked++;
1100*4882a593Smuzhiyun
1101*4882a593Smuzhiyun if (dfs->mask_hist_checked >= 5 && dfs->pulse_flag_hist[index]) {
1102*4882a593Smuzhiyun if (sum <= 2) {
1103*4882a593Smuzhiyun if (dfs->hist_cond_on) {
1104*4882a593Smuzhiyun /*return the value from hist_radar_detected*/
1105*4882a593Smuzhiyun radar_detected = phydm_dfs_hist_log(dm, index);
1106*4882a593Smuzhiyun } else {
1107*4882a593Smuzhiyun if (dfs->pulse_type_hist[index] == 0)
1108*4882a593Smuzhiyun dfs->radar_type = 0;
1109*4882a593Smuzhiyun else if (dfs->pulse_type_hist[index] == 1)
1110*4882a593Smuzhiyun dfs->radar_type = 1;
1111*4882a593Smuzhiyun radar_detected = 1;
1112*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1113*4882a593Smuzhiyun "Detected type %d radar signal!\n",
1114*4882a593Smuzhiyun dfs->radar_type);
1115*4882a593Smuzhiyun }
1116*4882a593Smuzhiyun } else {
1117*4882a593Smuzhiyun fault_flag_det = 1;
1118*4882a593Smuzhiyun if (dfs->det_print2) {
1119*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1120*4882a593Smuzhiyun "Radar is masked : mask_hist large than thd\n");
1121*4882a593Smuzhiyun }
1122*4882a593Smuzhiyun }
1123*4882a593Smuzhiyun }
1124*4882a593Smuzhiyun
1125*4882a593Smuzhiyun dfs->mask_idx++;
1126*4882a593Smuzhiyun if (dfs->mask_idx == 5)
1127*4882a593Smuzhiyun dfs->mask_idx = 0;
1128*4882a593Smuzhiyun
1129*4882a593Smuzhiyun if (fault_flag_det == 0 && fault_flag_psd == 0 && fa_flag == 0) {
1130*4882a593Smuzhiyun if (dfs->igi_cur < 0x30) {
1131*4882a593Smuzhiyun st_l2h_new = dfs->st_l2h_min;
1132*4882a593Smuzhiyun }
1133*4882a593Smuzhiyun }
1134*4882a593Smuzhiyun
1135*4882a593Smuzhiyun if (st_l2h_new != dfs->st_l2h_cur) {
1136*4882a593Smuzhiyun if (st_l2h_new < dfs->st_l2h_min) {
1137*4882a593Smuzhiyun dfs->st_l2h_cur = dfs->st_l2h_min;
1138*4882a593Smuzhiyun } else if (st_l2h_new > dfs->st_l2h_max)
1139*4882a593Smuzhiyun dfs->st_l2h_cur = dfs->st_l2h_max;
1140*4882a593Smuzhiyun else
1141*4882a593Smuzhiyun dfs->st_l2h_cur = st_l2h_new;
1142*4882a593Smuzhiyun /*odm_set_bb_reg(dm, R_0x91c, 0xff, dfs->st_l2h_cur);*/
1143*4882a593Smuzhiyun
1144*4882a593Smuzhiyun dfs->pwdb_th_cur = ((int)dfs->st_l2h_cur - (int)dfs->igi_cur)
1145*4882a593Smuzhiyun / 2 + dfs->pwdb_scalar_factor;
1146*4882a593Smuzhiyun
1147*4882a593Smuzhiyun /*@limit the pwdb value to absolute lower bound 8*/
1148*4882a593Smuzhiyun dfs->pwdb_th_cur = MAX_2(dfs->pwdb_th_cur, (int)dfs->pwdb_th);
1149*4882a593Smuzhiyun
1150*4882a593Smuzhiyun /*@limit the pwdb value to absolute upper bound 0x1f*/
1151*4882a593Smuzhiyun dfs->pwdb_th_cur = MIN_2(dfs->pwdb_th_cur, 0x1f);
1152*4882a593Smuzhiyun
1153*4882a593Smuzhiyun if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
1154*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa50, 0x000000f0,
1155*4882a593Smuzhiyun dfs->pwdb_th_cur);
1156*4882a593Smuzhiyun #if (RTL8721D_SUPPORT)
1157*4882a593Smuzhiyun else if (dm->support_ic_type & ODM_RTL8721D) {
1158*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf54, 0x0000001f,
1159*4882a593Smuzhiyun ((dfs->st_l2h_cur & 0x0000007c) >> 2));
1160*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf58, 0xc0000000,
1161*4882a593Smuzhiyun (dfs->st_l2h_cur & 0x00000003));
1162*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf70, 0x03c00000,
1163*4882a593Smuzhiyun dfs->pwdb_th_cur);
1164*4882a593Smuzhiyun }
1165*4882a593Smuzhiyun #endif
1166*4882a593Smuzhiyun else
1167*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0x918, 0x00001f00,
1168*4882a593Smuzhiyun dfs->pwdb_th_cur);
1169*4882a593Smuzhiyun }
1170*4882a593Smuzhiyun
1171*4882a593Smuzhiyun if (dfs->det_print) {
1172*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1173*4882a593Smuzhiyun "fault_flag_det[%d], fault_flag_psd[%d], DFS_detected [%d]\n",
1174*4882a593Smuzhiyun fault_flag_det, fault_flag_psd, radar_detected);
1175*4882a593Smuzhiyun }
1176*4882a593Smuzhiyun #if (RTL8721D_SUPPORT)
1177*4882a593Smuzhiyun if (dm->support_ic_type & (ODM_RTL8721D))
1178*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0x908, MASKDWORD, reg908_value);
1179*4882a593Smuzhiyun #endif
1180*4882a593Smuzhiyun
1181*4882a593Smuzhiyun return radar_detected;
1182*4882a593Smuzhiyun }
1183*4882a593Smuzhiyun
1184*4882a593Smuzhiyun #if (RTL8814A_SUPPORT || RTL8822B_SUPPORT || RTL8821C_SUPPORT)
phydm_dfs_histogram_radar_distinguish(void * dm_void)1185*4882a593Smuzhiyun void phydm_dfs_histogram_radar_distinguish(
1186*4882a593Smuzhiyun void *dm_void)
1187*4882a593Smuzhiyun {
1188*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
1189*4882a593Smuzhiyun struct _DFS_STATISTICS *dfs = &dm->dfs;
1190*4882a593Smuzhiyun u8 region_domain = dm->dfs_region_domain;
1191*4882a593Smuzhiyun u8 c_channel = *dm->channel;
1192*4882a593Smuzhiyun u8 band_width = *dm->band_width;
1193*4882a593Smuzhiyun
1194*4882a593Smuzhiyun u8 dfs_pw_thd1 = 0, dfs_pw_thd2 = 0, dfs_pw_thd3 = 0;
1195*4882a593Smuzhiyun u8 dfs_pw_thd4 = 0, dfs_pw_thd5 = 0;
1196*4882a593Smuzhiyun u8 dfs_pri_thd1 = 0, dfs_pri_thd2 = 0, dfs_pri_thd3 = 0;
1197*4882a593Smuzhiyun u8 dfs_pri_thd4 = 0, dfs_pri_thd5 = 0;
1198*4882a593Smuzhiyun u8 pri_th = 0, i = 0;
1199*4882a593Smuzhiyun u8 max_pri_idx = 0, max_pw_idx = 0, max_pri_cnt_th = 0;
1200*4882a593Smuzhiyun u8 max_pri_cnt_fcc_g1_th = 0, max_pri_cnt_fcc_g3_th = 0;
1201*4882a593Smuzhiyun u8 safe_pri_pw_diff_th = 0, safe_pri_pw_diff_fcc_th = 0;
1202*4882a593Smuzhiyun u8 safe_pri_pw_diff_w53_th = 0, safe_pri_pw_diff_fcc_idle_th = 0;
1203*4882a593Smuzhiyun u8 j = 0;
1204*4882a593Smuzhiyun u32 dfs_hist1_pw = 0, dfs_hist2_pw = 0, g_pw[6] = {0};
1205*4882a593Smuzhiyun u32 dfs_hist1_pri = 0, dfs_hist2_pri = 0, g_pri[6] = {0};
1206*4882a593Smuzhiyun u8 pw_sum_g0g5 = 0, pw_sum_g1g2g3g4 = 0;
1207*4882a593Smuzhiyun u8 pri_sum_g0g5 = 0, pri_sum_g1g2g3g4 = 0;
1208*4882a593Smuzhiyun u16 pw_sum_ss_g1g2g3g4 = 0, pri_sum_ss_g1g2g3g4 = 0;
1209*4882a593Smuzhiyun u8 max_pri_cnt = 0, max_pw_cnt = 0;
1210*4882a593Smuzhiyun #if (RTL8721D_SUPPORT)
1211*4882a593Smuzhiyun if (dm->support_ic_type & (ODM_RTL8721D))
1212*4882a593Smuzhiyun return;
1213*4882a593Smuzhiyun #endif
1214*4882a593Smuzhiyun
1215*4882a593Smuzhiyun /*read pulse width hist report*/
1216*4882a593Smuzhiyun odm_set_bb_reg(dm, 0x19e4, BIT(22) | BIT(23), 0x1);
1217*4882a593Smuzhiyun dfs_hist1_pw = odm_get_bb_reg(dm, 0xf5c, 0xffffffff);
1218*4882a593Smuzhiyun dfs_hist2_pw = odm_get_bb_reg(dm, 0xf74, 0xffffffff);
1219*4882a593Smuzhiyun
1220*4882a593Smuzhiyun g_pw[0] = (unsigned int)((dfs_hist2_pw & 0xff000000) >> 24);
1221*4882a593Smuzhiyun g_pw[1] = (unsigned int)((dfs_hist2_pw & 0x00ff0000) >> 16);
1222*4882a593Smuzhiyun g_pw[2] = (unsigned int)((dfs_hist2_pw & 0x0000ff00) >> 8);
1223*4882a593Smuzhiyun g_pw[3] = (unsigned int)dfs_hist2_pw & 0x000000ff;
1224*4882a593Smuzhiyun g_pw[4] = (unsigned int)((dfs_hist1_pw & 0xff000000) >> 24);
1225*4882a593Smuzhiyun g_pw[5] = (unsigned int)((dfs_hist1_pw & 0x00ff0000) >> 16);
1226*4882a593Smuzhiyun
1227*4882a593Smuzhiyun /*read pulse repetition interval hist report*/
1228*4882a593Smuzhiyun odm_set_bb_reg(dm, 0x19e4, BIT(22) | BIT(23), 0x3);
1229*4882a593Smuzhiyun dfs_hist1_pri = odm_get_bb_reg(dm, 0xf5c, 0xffffffff);
1230*4882a593Smuzhiyun dfs_hist2_pri = odm_get_bb_reg(dm, 0xf74, 0xffffffff);
1231*4882a593Smuzhiyun odm_set_bb_reg(dm, 0x19b4, 0x10000000, 1); /*reset histo report*/
1232*4882a593Smuzhiyun odm_set_bb_reg(dm, 0x19b4, 0x10000000, 0); /*@continue histo report*/
1233*4882a593Smuzhiyun
1234*4882a593Smuzhiyun g_pri[0] = (unsigned int)((dfs_hist2_pri & 0xff000000) >> 24);
1235*4882a593Smuzhiyun g_pri[1] = (unsigned int)((dfs_hist2_pri & 0x00ff0000) >> 16);
1236*4882a593Smuzhiyun g_pri[2] = (unsigned int)((dfs_hist2_pri & 0x0000ff00) >> 8);
1237*4882a593Smuzhiyun g_pri[3] = (unsigned int)dfs_hist2_pri & 0x000000ff;
1238*4882a593Smuzhiyun g_pri[4] = (unsigned int)((dfs_hist1_pri & 0xff000000) >> 24);
1239*4882a593Smuzhiyun g_pri[5] = (unsigned int)((dfs_hist1_pri & 0x00ff0000) >> 16);
1240*4882a593Smuzhiyun
1241*4882a593Smuzhiyun dfs->pri_cond1 = 0;
1242*4882a593Smuzhiyun dfs->pri_cond2 = 0;
1243*4882a593Smuzhiyun dfs->pri_cond3 = 0;
1244*4882a593Smuzhiyun dfs->pri_cond4 = 0;
1245*4882a593Smuzhiyun dfs->pri_cond5 = 0;
1246*4882a593Smuzhiyun dfs->pw_cond1 = 0;
1247*4882a593Smuzhiyun dfs->pw_cond2 = 0;
1248*4882a593Smuzhiyun dfs->pw_cond3 = 0;
1249*4882a593Smuzhiyun dfs->pri_type3_4_cond1 = 0; /*@for ETSI*/
1250*4882a593Smuzhiyun dfs->pri_type3_4_cond2 = 0; /*@for ETSI*/
1251*4882a593Smuzhiyun dfs->pw_long_cond1 = 0; /*@for long radar*/
1252*4882a593Smuzhiyun dfs->pw_long_cond2 = 0; /*@for long radar*/
1253*4882a593Smuzhiyun dfs->pri_long_cond1 = 0; /*@for long radar*/
1254*4882a593Smuzhiyun dfs->pw_flag = 0;
1255*4882a593Smuzhiyun dfs->pri_flag = 0;
1256*4882a593Smuzhiyun dfs->pri_type3_4_flag = 0; /*@for ETSI*/
1257*4882a593Smuzhiyun dfs->long_radar_flag = 0;
1258*4882a593Smuzhiyun dfs->pw_std = 0; /*The std(var) of reasonable num of pw group*/
1259*4882a593Smuzhiyun dfs->pri_std = 0; /*The std(var) of reasonable num of pri group*/
1260*4882a593Smuzhiyun
1261*4882a593Smuzhiyun for (i = 0; i < 6; i++) {
1262*4882a593Smuzhiyun dfs->pw_hold_sum[i] = 0;
1263*4882a593Smuzhiyun dfs->pri_hold_sum[i] = 0;
1264*4882a593Smuzhiyun }
1265*4882a593Smuzhiyun
1266*4882a593Smuzhiyun if (dfs->idle_mode == 1)
1267*4882a593Smuzhiyun pri_th = dfs->pri_hist_th;
1268*4882a593Smuzhiyun else
1269*4882a593Smuzhiyun pri_th = dfs->pri_hist_th - 1;
1270*4882a593Smuzhiyun
1271*4882a593Smuzhiyun for (i = 0; i < 6; i++) {
1272*4882a593Smuzhiyun dfs->pw_hold[dfs->hist_idx][i] = (u8)g_pw[i];
1273*4882a593Smuzhiyun dfs->pri_hold[dfs->hist_idx][i] = (u8)g_pri[i];
1274*4882a593Smuzhiyun /*@collect whole histogram report may take some time
1275*4882a593Smuzhiyun *so we add the counter of 2 time slots in FCC and ETSI
1276*4882a593Smuzhiyun */
1277*4882a593Smuzhiyun dfs->pw_hold_sum[i] = dfs->pw_hold_sum[i] +
1278*4882a593Smuzhiyun dfs->pw_hold[(dfs->hist_idx + 1) % 3][i] +
1279*4882a593Smuzhiyun dfs->pw_hold[(dfs->hist_idx + 2) % 3][i];
1280*4882a593Smuzhiyun dfs->pri_hold_sum[i] = dfs->pri_hold_sum[i] +
1281*4882a593Smuzhiyun dfs->pri_hold[(dfs->hist_idx + 1) % 3][i] +
1282*4882a593Smuzhiyun dfs->pri_hold[(dfs->hist_idx + 2) % 3][i];
1283*4882a593Smuzhiyun }
1284*4882a593Smuzhiyun /*@For long radar type*/
1285*4882a593Smuzhiyun for (j = 1; j < 4; j++) {
1286*4882a593Smuzhiyun dfs->pw_long_hold_sum[i] = dfs->pw_long_hold_sum[i] +
1287*4882a593Smuzhiyun dfs->pw_hold[(dfs->hist_long_idx + j) % 4][i];
1288*4882a593Smuzhiyun dfs->pri_long_hold_sum[i] = dfs->pri_long_hold_sum[i] +
1289*4882a593Smuzhiyun dfs->pri_hold[(dfs->hist_long_idx + j) % 4][i];
1290*4882a593Smuzhiyun }
1291*4882a593Smuzhiyun
1292*4882a593Smuzhiyun dfs->hist_idx++;
1293*4882a593Smuzhiyun if (dfs->hist_idx == 3)
1294*4882a593Smuzhiyun dfs->hist_idx = 0;
1295*4882a593Smuzhiyun dfs->hist_long_idx++;
1296*4882a593Smuzhiyun if (dfs->hist_long_idx == 4)
1297*4882a593Smuzhiyun dfs->hist_long_idx = 0;
1298*4882a593Smuzhiyun
1299*4882a593Smuzhiyun max_pri_cnt = 0;
1300*4882a593Smuzhiyun max_pri_idx = 0;
1301*4882a593Smuzhiyun max_pw_cnt = 0;
1302*4882a593Smuzhiyun max_pw_idx = 0;
1303*4882a593Smuzhiyun max_pri_cnt_th = dfs->pri_sum_g1_th;
1304*4882a593Smuzhiyun max_pri_cnt_fcc_g1_th = dfs->pri_sum_g1_fcc_th;
1305*4882a593Smuzhiyun max_pri_cnt_fcc_g3_th = dfs->pri_sum_g3_fcc_th;
1306*4882a593Smuzhiyun safe_pri_pw_diff_th = dfs->pri_pw_diff_th;
1307*4882a593Smuzhiyun safe_pri_pw_diff_fcc_th = dfs->pri_pw_diff_fcc_th;
1308*4882a593Smuzhiyun safe_pri_pw_diff_fcc_idle_th = dfs->pri_pw_diff_fcc_idle_th;
1309*4882a593Smuzhiyun safe_pri_pw_diff_w53_th = dfs->pri_pw_diff_w53_th;
1310*4882a593Smuzhiyun
1311*4882a593Smuzhiyun /*@g1 to g4 is the reseasonable range of pri and pw*/
1312*4882a593Smuzhiyun for (i = 1; i <= 4; i++) {
1313*4882a593Smuzhiyun if (dfs->pri_hold_sum[i] > max_pri_cnt) {
1314*4882a593Smuzhiyun max_pri_cnt = dfs->pri_hold_sum[i];
1315*4882a593Smuzhiyun max_pri_idx = i;
1316*4882a593Smuzhiyun }
1317*4882a593Smuzhiyun if (dfs->pw_hold_sum[i] > max_pw_cnt) {
1318*4882a593Smuzhiyun max_pw_cnt = dfs->pw_hold_sum[i];
1319*4882a593Smuzhiyun max_pw_idx = i;
1320*4882a593Smuzhiyun }
1321*4882a593Smuzhiyun if (dfs->pri_hold_sum[i] >= pri_th)
1322*4882a593Smuzhiyun dfs->pri_cond1 = 1;
1323*4882a593Smuzhiyun }
1324*4882a593Smuzhiyun
1325*4882a593Smuzhiyun pri_sum_g0g5 = dfs->pri_hold_sum[0];
1326*4882a593Smuzhiyun if (pri_sum_g0g5 == 0)
1327*4882a593Smuzhiyun pri_sum_g0g5 = 1;
1328*4882a593Smuzhiyun pri_sum_g1g2g3g4 = dfs->pri_hold_sum[1] + dfs->pri_hold_sum[2]
1329*4882a593Smuzhiyun + dfs->pri_hold_sum[3] + dfs->pri_hold_sum[4];
1330*4882a593Smuzhiyun
1331*4882a593Smuzhiyun /*pw will reduce because of dc, so we do not treat g0 as illegal group*/
1332*4882a593Smuzhiyun pw_sum_g0g5 = dfs->pw_hold_sum[5];
1333*4882a593Smuzhiyun if (pw_sum_g0g5 == 0)
1334*4882a593Smuzhiyun pw_sum_g0g5 = 1;
1335*4882a593Smuzhiyun pw_sum_g1g2g3g4 = dfs->pw_hold_sum[1] + dfs->pw_hold_sum[2] +
1336*4882a593Smuzhiyun dfs->pw_hold_sum[3] + dfs->pw_hold_sum[4];
1337*4882a593Smuzhiyun
1338*4882a593Smuzhiyun /*@Calculate the variation from g1 to g4*/
1339*4882a593Smuzhiyun for (i = 1; i < 5; i++) {
1340*4882a593Smuzhiyun /*Sum of square*/
1341*4882a593Smuzhiyun pw_sum_ss_g1g2g3g4 = pw_sum_ss_g1g2g3g4 +
1342*4882a593Smuzhiyun (dfs->pw_hold_sum[i] - (pw_sum_g1g2g3g4 / 4)) *
1343*4882a593Smuzhiyun (dfs->pw_hold_sum[i] - (pw_sum_g1g2g3g4 / 4));
1344*4882a593Smuzhiyun pri_sum_ss_g1g2g3g4 = pri_sum_ss_g1g2g3g4 +
1345*4882a593Smuzhiyun (dfs->pri_hold_sum[i] - (pri_sum_g1g2g3g4 / 4)) *
1346*4882a593Smuzhiyun (dfs->pri_hold_sum[i] - (pri_sum_g1g2g3g4 / 4));
1347*4882a593Smuzhiyun }
1348*4882a593Smuzhiyun /*The value may less than the normal variance,
1349*4882a593Smuzhiyun *since the variable type is int (not float)
1350*4882a593Smuzhiyun */
1351*4882a593Smuzhiyun dfs->pw_std = (u8)(pw_sum_ss_g1g2g3g4 / 4);
1352*4882a593Smuzhiyun dfs->pri_std = (u8)(pri_sum_ss_g1g2g3g4 / 4);
1353*4882a593Smuzhiyun
1354*4882a593Smuzhiyun if (region_domain == 1) {
1355*4882a593Smuzhiyun dfs->pri_type3_4_flag = 1; /*@ETSI flag*/
1356*4882a593Smuzhiyun
1357*4882a593Smuzhiyun /*(OTA) Cancel long PRI case*/
1358*4882a593Smuzhiyun dfs->pri_cond2 = 1;
1359*4882a593Smuzhiyun
1360*4882a593Smuzhiyun /*reasonable group shouldn't large*/
1361*4882a593Smuzhiyun if ((pri_sum_g0g5 + pri_sum_g1g2g3g4) / pri_sum_g0g5 > 2 &&
1362*4882a593Smuzhiyun pri_sum_g1g2g3g4 <= dfs->pri_sum_safe_fcc_th)
1363*4882a593Smuzhiyun dfs->pri_cond3 = 1;
1364*4882a593Smuzhiyun
1365*4882a593Smuzhiyun /*@Cancel the condition that the abs between pri and pw*/
1366*4882a593Smuzhiyun if (dfs->pri_std >= dfs->pri_std_th)
1367*4882a593Smuzhiyun dfs->pri_cond4 = 1;
1368*4882a593Smuzhiyun else if (max_pri_idx == 1 &&
1369*4882a593Smuzhiyun max_pri_cnt >= max_pri_cnt_fcc_g1_th)
1370*4882a593Smuzhiyun dfs->pri_cond4 = 1;
1371*4882a593Smuzhiyun
1372*4882a593Smuzhiyun /*(OTA) Cancel the condition (type 3,4 distinction)*/
1373*4882a593Smuzhiyun dfs->pri_cond5 = 1;
1374*4882a593Smuzhiyun
1375*4882a593Smuzhiyun if (dfs->pri_cond1 && dfs->pri_cond2 && dfs->pri_cond3 &&
1376*4882a593Smuzhiyun dfs->pri_cond4 && dfs->pri_cond5)
1377*4882a593Smuzhiyun dfs->pri_flag = 1;
1378*4882a593Smuzhiyun
1379*4882a593Smuzhiyun /* PW judgment conditions for short radar type */
1380*4882a593Smuzhiyun /*ratio of reasonable and illegal group && g5 should be zero*/
1381*4882a593Smuzhiyun if (((pw_sum_g0g5 + pw_sum_g1g2g3g4) / pw_sum_g0g5 > 2) &&
1382*4882a593Smuzhiyun (dfs->pw_hold_sum[5] <= 1))
1383*4882a593Smuzhiyun dfs->pw_cond1 = 1;
1384*4882a593Smuzhiyun /*unreasonable group*/
1385*4882a593Smuzhiyun if (dfs->pw_hold_sum[4] == 0 && dfs->pw_hold_sum[5] == 0)
1386*4882a593Smuzhiyun dfs->pw_cond2 = 1;
1387*4882a593Smuzhiyun /*pw's std (short radar) should be large(=7)*/
1388*4882a593Smuzhiyun if (dfs->pw_std >= dfs->pw_std_th)
1389*4882a593Smuzhiyun dfs->pw_cond3 = 1;
1390*4882a593Smuzhiyun if (dfs->pw_cond1 && dfs->pw_cond2 && dfs->pw_cond3)
1391*4882a593Smuzhiyun dfs->pw_flag = 1;
1392*4882a593Smuzhiyun
1393*4882a593Smuzhiyun /* @Judgment conditions of long radar type */
1394*4882a593Smuzhiyun if (band_width == CHANNEL_WIDTH_20) {
1395*4882a593Smuzhiyun if (dfs->pw_long_hold_sum[4] >=
1396*4882a593Smuzhiyun dfs->pw_long_lower_20m_th)
1397*4882a593Smuzhiyun dfs->pw_long_cond1 = 1;
1398*4882a593Smuzhiyun } else{
1399*4882a593Smuzhiyun if (dfs->pw_long_hold_sum[4] >= dfs->pw_long_lower_th)
1400*4882a593Smuzhiyun dfs->pw_long_cond1 = 1;
1401*4882a593Smuzhiyun }
1402*4882a593Smuzhiyun /* @Disable the condition that dfs->pw_long_hold_sum[1] */
1403*4882a593Smuzhiyun if (dfs->pw_long_hold_sum[2] + dfs->pw_long_hold_sum[3] +
1404*4882a593Smuzhiyun dfs->pw_long_hold_sum[4] <= dfs->pw_long_sum_upper_th &&
1405*4882a593Smuzhiyun dfs->pw_long_hold_sum[2] <= dfs->pw_long_hold_sum[4] &&
1406*4882a593Smuzhiyun dfs->pw_long_hold_sum[3] <= dfs->pw_long_hold_sum[4])
1407*4882a593Smuzhiyun dfs->pw_long_cond2 = 1;
1408*4882a593Smuzhiyun /*@g4 should be large for long radar*/
1409*4882a593Smuzhiyun if (dfs->pri_long_hold_sum[4] <= dfs->pri_long_upper_th)
1410*4882a593Smuzhiyun dfs->pri_long_cond1 = 1;
1411*4882a593Smuzhiyun if (dfs->pw_long_cond1 && dfs->pw_long_cond2 &&
1412*4882a593Smuzhiyun dfs->pri_long_cond1)
1413*4882a593Smuzhiyun dfs->long_radar_flag = 1;
1414*4882a593Smuzhiyun } else if (region_domain == 2) {
1415*4882a593Smuzhiyun dfs->pri_type3_4_flag = 1; /*@ETSI flag*/
1416*4882a593Smuzhiyun
1417*4882a593Smuzhiyun /*PRI judgment conditions for short radar type*/
1418*4882a593Smuzhiyun if ((pri_sum_g0g5 + pri_sum_g1g2g3g4) / pri_sum_g0g5 > 2)
1419*4882a593Smuzhiyun dfs->pri_cond2 = 1;
1420*4882a593Smuzhiyun
1421*4882a593Smuzhiyun /*reasonable group shouldn't too large*/
1422*4882a593Smuzhiyun if (pri_sum_g1g2g3g4 <= dfs->pri_sum_safe_fcc_th)
1423*4882a593Smuzhiyun dfs->pri_cond3 = 1;
1424*4882a593Smuzhiyun
1425*4882a593Smuzhiyun /*Cancel the abs diff between pri and pw for idle mode (thr=2)*/
1426*4882a593Smuzhiyun dfs->pri_cond4 = 1;
1427*4882a593Smuzhiyun
1428*4882a593Smuzhiyun if (dfs->idle_mode == 1) {
1429*4882a593Smuzhiyun if (dfs->pri_std >= dfs->pri_std_idle_th) {
1430*4882a593Smuzhiyun if (max_pw_idx == 3 &&
1431*4882a593Smuzhiyun pri_sum_g1g2g3g4 <= dfs->pri_sum_type4_th){
1432*4882a593Smuzhiyun /*To distinguish between type 4 radar and false detection*/
1433*4882a593Smuzhiyun dfs->pri_cond5 = 1;
1434*4882a593Smuzhiyun } else if (max_pw_idx == 1 &&
1435*4882a593Smuzhiyun pri_sum_g1g2g3g4 >=
1436*4882a593Smuzhiyun dfs->pri_sum_type6_th) {
1437*4882a593Smuzhiyun /*To distinguish between type 6 radar and false detection*/
1438*4882a593Smuzhiyun dfs->pri_cond5 = 1;
1439*4882a593Smuzhiyun } else {
1440*4882a593Smuzhiyun /*pri variation of short radar should be large (idle mode)*/
1441*4882a593Smuzhiyun dfs->pri_cond5 = 1;
1442*4882a593Smuzhiyun }
1443*4882a593Smuzhiyun }
1444*4882a593Smuzhiyun } else {
1445*4882a593Smuzhiyun /*pri variation of short radar should be large (TP mode)*/
1446*4882a593Smuzhiyun if (dfs->pri_std >= dfs->pri_std_th)
1447*4882a593Smuzhiyun dfs->pri_cond5 = 1;
1448*4882a593Smuzhiyun }
1449*4882a593Smuzhiyun
1450*4882a593Smuzhiyun if (dfs->pri_cond1 && dfs->pri_cond2 && dfs->pri_cond3 &&
1451*4882a593Smuzhiyun dfs->pri_cond4 && dfs->pri_cond5)
1452*4882a593Smuzhiyun dfs->pri_flag = 1;
1453*4882a593Smuzhiyun
1454*4882a593Smuzhiyun /* PW judgment conditions for short radar type */
1455*4882a593Smuzhiyun if (((pw_sum_g0g5 + pw_sum_g1g2g3g4) / pw_sum_g0g5 > 2) &&
1456*4882a593Smuzhiyun (dfs->pw_hold_sum[5] <= 1))
1457*4882a593Smuzhiyun /*ratio of reasonable and illegal group && g5 should be zero*/
1458*4882a593Smuzhiyun dfs->pw_cond1 = 1;
1459*4882a593Smuzhiyun
1460*4882a593Smuzhiyun if ((c_channel >= 52) && (c_channel <= 64))
1461*4882a593Smuzhiyun dfs->pw_cond2 = 1;
1462*4882a593Smuzhiyun /*unreasonable group shouldn't too large*/
1463*4882a593Smuzhiyun else if (dfs->pw_hold_sum[0] <= dfs->pw_g0_th)
1464*4882a593Smuzhiyun dfs->pw_cond2 = 1;
1465*4882a593Smuzhiyun
1466*4882a593Smuzhiyun if (dfs->idle_mode == 1) {
1467*4882a593Smuzhiyun /*pw variation of short radar should be large (idle mode)*/
1468*4882a593Smuzhiyun if (dfs->pw_std >= dfs->pw_std_idle_th)
1469*4882a593Smuzhiyun dfs->pw_cond3 = 1;
1470*4882a593Smuzhiyun } else {
1471*4882a593Smuzhiyun /*pw variation of short radar should be large (TP mode)*/
1472*4882a593Smuzhiyun if (dfs->pw_std >= dfs->pw_std_th)
1473*4882a593Smuzhiyun dfs->pw_cond3 = 1;
1474*4882a593Smuzhiyun }
1475*4882a593Smuzhiyun if (dfs->pw_cond1 && dfs->pw_cond2 && dfs->pw_cond3)
1476*4882a593Smuzhiyun dfs->pw_flag = 1;
1477*4882a593Smuzhiyun
1478*4882a593Smuzhiyun /* @Judgment conditions of long radar type */
1479*4882a593Smuzhiyun if (band_width == CHANNEL_WIDTH_20) {
1480*4882a593Smuzhiyun if (dfs->pw_long_hold_sum[4] >=
1481*4882a593Smuzhiyun dfs->pw_long_lower_20m_th)
1482*4882a593Smuzhiyun dfs->pw_long_cond1 = 1;
1483*4882a593Smuzhiyun } else{
1484*4882a593Smuzhiyun if (dfs->pw_long_hold_sum[4] >= dfs->pw_long_lower_th)
1485*4882a593Smuzhiyun dfs->pw_long_cond1 = 1;
1486*4882a593Smuzhiyun }
1487*4882a593Smuzhiyun if (dfs->pw_long_hold_sum[1] + dfs->pw_long_hold_sum[2] +
1488*4882a593Smuzhiyun dfs->pw_long_hold_sum[3] + dfs->pw_long_hold_sum[4]
1489*4882a593Smuzhiyun <= dfs->pw_long_sum_upper_th)
1490*4882a593Smuzhiyun dfs->pw_long_cond2 = 1;
1491*4882a593Smuzhiyun /*@g4 should be large for long radar*/
1492*4882a593Smuzhiyun if (dfs->pri_long_hold_sum[4] <= dfs->pri_long_upper_th)
1493*4882a593Smuzhiyun dfs->pri_long_cond1 = 1;
1494*4882a593Smuzhiyun if (dfs->pw_long_cond1 &&
1495*4882a593Smuzhiyun dfs->pw_long_cond2 && dfs->pri_long_cond1)
1496*4882a593Smuzhiyun dfs->long_radar_flag = 1;
1497*4882a593Smuzhiyun } else if (region_domain == 3) {
1498*4882a593Smuzhiyun /*ratio of reasonable group and illegal group */
1499*4882a593Smuzhiyun if ((pri_sum_g0g5 + pri_sum_g1g2g3g4) / pri_sum_g0g5 > 2)
1500*4882a593Smuzhiyun dfs->pri_cond2 = 1;
1501*4882a593Smuzhiyun
1502*4882a593Smuzhiyun if (pri_sum_g1g2g3g4 <= dfs->pri_sum_safe_th)
1503*4882a593Smuzhiyun dfs->pri_cond3 = 1;
1504*4882a593Smuzhiyun
1505*4882a593Smuzhiyun /*@Cancel the condition that the abs between pri and pw*/
1506*4882a593Smuzhiyun dfs->pri_cond4 = 1;
1507*4882a593Smuzhiyun
1508*4882a593Smuzhiyun if (dfs->pri_hold_sum[5] <= dfs->pri_sum_g5_th)
1509*4882a593Smuzhiyun dfs->pri_cond5 = 1;
1510*4882a593Smuzhiyun
1511*4882a593Smuzhiyun if (band_width == CHANNEL_WIDTH_40) {
1512*4882a593Smuzhiyun if (max_pw_idx == 4) {
1513*4882a593Smuzhiyun if (max_pw_cnt >= dfs->type4_pw_max_cnt &&
1514*4882a593Smuzhiyun pri_sum_g1g2g3g4 >=
1515*4882a593Smuzhiyun dfs->type4_safe_pri_sum_th) {
1516*4882a593Smuzhiyun dfs->pri_cond1 = 1;
1517*4882a593Smuzhiyun dfs->pri_cond4 = 1;
1518*4882a593Smuzhiyun dfs->pri_type3_4_cond1 = 1;
1519*4882a593Smuzhiyun }
1520*4882a593Smuzhiyun }
1521*4882a593Smuzhiyun }
1522*4882a593Smuzhiyun
1523*4882a593Smuzhiyun if (dfs->pri_cond1 && dfs->pri_cond2 &&
1524*4882a593Smuzhiyun dfs->pri_cond3 && dfs->pri_cond4 && dfs->pri_cond5)
1525*4882a593Smuzhiyun dfs->pri_flag = 1;
1526*4882a593Smuzhiyun
1527*4882a593Smuzhiyun if (((pw_sum_g0g5 + pw_sum_g1g2g3g4) / pw_sum_g0g5 > 2))
1528*4882a593Smuzhiyun dfs->pw_flag = 1;
1529*4882a593Smuzhiyun
1530*4882a593Smuzhiyun /*@max num pri group is g1 means radar type3 or type4*/
1531*4882a593Smuzhiyun if (max_pri_idx == 1) {
1532*4882a593Smuzhiyun if (max_pri_cnt >= max_pri_cnt_th)
1533*4882a593Smuzhiyun dfs->pri_type3_4_cond1 = 1;
1534*4882a593Smuzhiyun if (dfs->pri_hold_sum[4] <=
1535*4882a593Smuzhiyun dfs->pri_sum_g5_under_g1_th &&
1536*4882a593Smuzhiyun dfs->pri_hold_sum[5] <= dfs->pri_sum_g5_under_g1_th)
1537*4882a593Smuzhiyun dfs->pri_type3_4_cond2 = 1;
1538*4882a593Smuzhiyun } else {
1539*4882a593Smuzhiyun dfs->pri_type3_4_cond1 = 1;
1540*4882a593Smuzhiyun dfs->pri_type3_4_cond2 = 1;
1541*4882a593Smuzhiyun }
1542*4882a593Smuzhiyun if (dfs->pri_type3_4_cond1 && dfs->pri_type3_4_cond2)
1543*4882a593Smuzhiyun dfs->pri_type3_4_flag = 1;
1544*4882a593Smuzhiyun } else {
1545*4882a593Smuzhiyun }
1546*4882a593Smuzhiyun
1547*4882a593Smuzhiyun if (dfs->print_hist_rpt) {
1548*4882a593Smuzhiyun dfs_pw_thd1 = (u8)odm_get_bb_reg(dm, 0x19e4, 0xff000000);
1549*4882a593Smuzhiyun dfs_pw_thd2 = (u8)odm_get_bb_reg(dm, 0x19e8, 0x000000ff);
1550*4882a593Smuzhiyun dfs_pw_thd3 = (u8)odm_get_bb_reg(dm, 0x19e8, 0x0000ff00);
1551*4882a593Smuzhiyun dfs_pw_thd4 = (u8)odm_get_bb_reg(dm, 0x19e8, 0x00ff0000);
1552*4882a593Smuzhiyun dfs_pw_thd5 = (u8)odm_get_bb_reg(dm, 0x19e8, 0xff000000);
1553*4882a593Smuzhiyun
1554*4882a593Smuzhiyun dfs_pri_thd1 = (u8)odm_get_bb_reg(dm, 0x19b8, 0x7F80);
1555*4882a593Smuzhiyun dfs_pri_thd2 = (u8)odm_get_bb_reg(dm, 0x19ec, 0x000000ff);
1556*4882a593Smuzhiyun dfs_pri_thd3 = (u8)odm_get_bb_reg(dm, 0x19ec, 0x0000ff00);
1557*4882a593Smuzhiyun dfs_pri_thd4 = (u8)odm_get_bb_reg(dm, 0x19ec, 0x00ff0000);
1558*4882a593Smuzhiyun dfs_pri_thd5 = (u8)odm_get_bb_reg(dm, 0x19ec, 0xff000000);
1559*4882a593Smuzhiyun
1560*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "\ndfs_pw_thd=%d %d %d %d %d\n",
1561*4882a593Smuzhiyun dfs_pw_thd1, dfs_pw_thd2, dfs_pw_thd3,
1562*4882a593Smuzhiyun dfs_pw_thd4, dfs_pw_thd5);
1563*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "-----pulse width hist-----\n");
1564*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "dfs_hist_pw=%x %x\n",
1565*4882a593Smuzhiyun dfs_hist1_pw, dfs_hist2_pw);
1566*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "g_pw_hist = %x %x %x %x %x %x\n",
1567*4882a593Smuzhiyun g_pw[0], g_pw[1], g_pw[2], g_pw[3],
1568*4882a593Smuzhiyun g_pw[4], g_pw[5]);
1569*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "dfs_pri_thd=%d %d %d %d %d\n",
1570*4882a593Smuzhiyun dfs_pri_thd1, dfs_pri_thd2, dfs_pri_thd3,
1571*4882a593Smuzhiyun dfs_pri_thd4, dfs_pri_thd5);
1572*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "-----pulse interval hist-----\n");
1573*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "dfs_hist_pri=%x %x\n",
1574*4882a593Smuzhiyun dfs_hist1_pri, dfs_hist2_pri);
1575*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1576*4882a593Smuzhiyun "g_pri_hist = %x %x %x %x %x %x, pw_flag = %d, pri_flag = %d\n",
1577*4882a593Smuzhiyun g_pri[0], g_pri[1], g_pri[2], g_pri[3], g_pri[4],
1578*4882a593Smuzhiyun g_pri[5], dfs->pw_flag, dfs->pri_flag);
1579*4882a593Smuzhiyun if (region_domain == 1 || region_domain == 3) {
1580*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "hist_idx= %d\n",
1581*4882a593Smuzhiyun (dfs->hist_idx + 2) % 3);
1582*4882a593Smuzhiyun } else {
1583*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "hist_idx= %d\n",
1584*4882a593Smuzhiyun (dfs->hist_idx + 3) % 4);
1585*4882a593Smuzhiyun }
1586*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "hist_long_idx= %d\n",
1587*4882a593Smuzhiyun (dfs->hist_long_idx + 299) % 300);
1588*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1589*4882a593Smuzhiyun "pw_sum_g0g5 = %d, pw_sum_g1g2g3g4 = %d\n",
1590*4882a593Smuzhiyun pw_sum_g0g5, pw_sum_g1g2g3g4);
1591*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1592*4882a593Smuzhiyun "pri_sum_g0g5 = %d, pri_sum_g1g2g3g4 = %d\n",
1593*4882a593Smuzhiyun pri_sum_g0g5, pri_sum_g1g2g3g4);
1594*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "pw_hold_sum = %d %d %d %d %d %d\n",
1595*4882a593Smuzhiyun dfs->pw_hold_sum[0], dfs->pw_hold_sum[1],
1596*4882a593Smuzhiyun dfs->pw_hold_sum[2], dfs->pw_hold_sum[3],
1597*4882a593Smuzhiyun dfs->pw_hold_sum[4], dfs->pw_hold_sum[5]);
1598*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "pri_hold_sum = %d %d %d %d %d %d\n",
1599*4882a593Smuzhiyun dfs->pri_hold_sum[0], dfs->pri_hold_sum[1],
1600*4882a593Smuzhiyun dfs->pri_hold_sum[2], dfs->pri_hold_sum[3],
1601*4882a593Smuzhiyun dfs->pri_hold_sum[4], dfs->pri_hold_sum[5]);
1602*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "pw_long_hold_sum = %d %d %d %d %d %d\n",
1603*4882a593Smuzhiyun dfs->pw_long_hold_sum[0], dfs->pw_long_hold_sum[1],
1604*4882a593Smuzhiyun dfs->pw_long_hold_sum[2], dfs->pw_long_hold_sum[3],
1605*4882a593Smuzhiyun dfs->pw_long_hold_sum[4], dfs->pw_long_hold_sum[5]);
1606*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1607*4882a593Smuzhiyun "pri_long_hold_sum = %d %d %d %d %d %d\n",
1608*4882a593Smuzhiyun dfs->pri_long_hold_sum[0], dfs->pri_long_hold_sum[1],
1609*4882a593Smuzhiyun dfs->pri_long_hold_sum[2], dfs->pri_long_hold_sum[3],
1610*4882a593Smuzhiyun dfs->pri_long_hold_sum[4], dfs->pri_long_hold_sum[5]);
1611*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "idle_mode = %d\n", dfs->idle_mode);
1612*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "pw_standard = %d\n", dfs->pw_std);
1613*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "pri_standard = %d\n", dfs->pri_std);
1614*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "\n");
1615*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1616*4882a593Smuzhiyun "pri_cond1 = %d, pri_cond2 = %d, pri_cond3 = %d, pri_cond4 = %d, pri_cond5 = %d\n",
1617*4882a593Smuzhiyun dfs->pri_cond1, dfs->pri_cond2, dfs->pri_cond3,
1618*4882a593Smuzhiyun dfs->pri_cond4, dfs->pri_cond5);
1619*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1620*4882a593Smuzhiyun "bandwidth = %d, pri_th = %d, max_pri_cnt_th = %d, safe_pri_pw_diff_th = %d\n",
1621*4882a593Smuzhiyun band_width, pri_th, max_pri_cnt_th,
1622*4882a593Smuzhiyun safe_pri_pw_diff_th);
1623*4882a593Smuzhiyun }
1624*4882a593Smuzhiyun }
1625*4882a593Smuzhiyun #endif
phydm_dfs_hist_log(void * dm_void,u8 index)1626*4882a593Smuzhiyun boolean phydm_dfs_hist_log(void *dm_void, u8 index)
1627*4882a593Smuzhiyun {
1628*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
1629*4882a593Smuzhiyun struct _DFS_STATISTICS *dfs = &dm->dfs;
1630*4882a593Smuzhiyun u8 i = 0, j = 0;
1631*4882a593Smuzhiyun boolean hist_radar_detected = 0;
1632*4882a593Smuzhiyun
1633*4882a593Smuzhiyun if (dfs->pulse_type_hist[index] == 0) {
1634*4882a593Smuzhiyun dfs->radar_type = 0;
1635*4882a593Smuzhiyun if (dfs->pw_flag && dfs->pri_flag &&
1636*4882a593Smuzhiyun dfs->pri_type3_4_flag) {
1637*4882a593Smuzhiyun hist_radar_detected = 1;
1638*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1639*4882a593Smuzhiyun "Detected type %d radar signal!\n",
1640*4882a593Smuzhiyun dfs->radar_type);
1641*4882a593Smuzhiyun if (dfs->det_print2) {
1642*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1643*4882a593Smuzhiyun "hist_idx= %d\n",
1644*4882a593Smuzhiyun (dfs->hist_idx + 3) % 4);
1645*4882a593Smuzhiyun for (j = 0; j < 4; j++) {
1646*4882a593Smuzhiyun for (i = 0; i < 6; i++) {
1647*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1648*4882a593Smuzhiyun "pri_hold = %d ",
1649*4882a593Smuzhiyun dfs->pri_hold[j][i]);
1650*4882a593Smuzhiyun }
1651*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "\n");
1652*4882a593Smuzhiyun }
1653*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "\n");
1654*4882a593Smuzhiyun for (j = 0; j < 4; j++) {
1655*4882a593Smuzhiyun for (i = 0; i < 6; i++) {
1656*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "pw_hold = %d ",
1657*4882a593Smuzhiyun dfs->pw_hold[j][i]);
1658*4882a593Smuzhiyun }
1659*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "\n");
1660*4882a593Smuzhiyun }
1661*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "\n");
1662*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "idle_mode = %d\n",
1663*4882a593Smuzhiyun dfs->idle_mode);
1664*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1665*4882a593Smuzhiyun "pw_hold_sum = %d %d %d %d %d %d\n",
1666*4882a593Smuzhiyun dfs->pw_hold_sum[0],
1667*4882a593Smuzhiyun dfs->pw_hold_sum[1],
1668*4882a593Smuzhiyun dfs->pw_hold_sum[2],
1669*4882a593Smuzhiyun dfs->pw_hold_sum[3],
1670*4882a593Smuzhiyun dfs->pw_hold_sum[4],
1671*4882a593Smuzhiyun dfs->pw_hold_sum[5]);
1672*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1673*4882a593Smuzhiyun "pri_hold_sum = %d %d %d %d %d %d\n",
1674*4882a593Smuzhiyun dfs->pri_hold_sum[0],
1675*4882a593Smuzhiyun dfs->pri_hold_sum[1],
1676*4882a593Smuzhiyun dfs->pri_hold_sum[2],
1677*4882a593Smuzhiyun dfs->pri_hold_sum[3],
1678*4882a593Smuzhiyun dfs->pri_hold_sum[4],
1679*4882a593Smuzhiyun dfs->pri_hold_sum[5]);
1680*4882a593Smuzhiyun }
1681*4882a593Smuzhiyun } else {
1682*4882a593Smuzhiyun if (dfs->det_print2) {
1683*4882a593Smuzhiyun if (dfs->pulse_flag_hist[index] &&
1684*4882a593Smuzhiyun dfs->pri_flag == 0) {
1685*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "pri_variation = %d\n",
1686*4882a593Smuzhiyun dfs->pri_std);
1687*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1688*4882a593Smuzhiyun "PRI criterion is not satisfied!\n");
1689*4882a593Smuzhiyun if (dfs->pri_cond1 == 0)
1690*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1691*4882a593Smuzhiyun "pri_cond1 is not satisfied!\n");
1692*4882a593Smuzhiyun if (dfs->pri_cond2 == 0)
1693*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1694*4882a593Smuzhiyun "pri_cond2 is not satisfied!\n");
1695*4882a593Smuzhiyun if (dfs->pri_cond3 == 0)
1696*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1697*4882a593Smuzhiyun "pri_cond3 is not satisfied!\n");
1698*4882a593Smuzhiyun if (dfs->pri_cond4 == 0)
1699*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1700*4882a593Smuzhiyun "pri_cond4 is not satisfied!\n");
1701*4882a593Smuzhiyun if (dfs->pri_cond5 == 0)
1702*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1703*4882a593Smuzhiyun "pri_cond5 is not satisfied!\n");
1704*4882a593Smuzhiyun }
1705*4882a593Smuzhiyun if (dfs->pulse_flag_hist[index] &&
1706*4882a593Smuzhiyun dfs->pw_flag == 0) {
1707*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "pw_variation = %d\n",
1708*4882a593Smuzhiyun dfs->pw_std);
1709*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1710*4882a593Smuzhiyun "PW criterion is not satisfied!\n");
1711*4882a593Smuzhiyun if (dfs->pw_cond1 == 0)
1712*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1713*4882a593Smuzhiyun "pw_cond1 is not satisfied!\n");
1714*4882a593Smuzhiyun if (dfs->pw_cond2 == 0)
1715*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1716*4882a593Smuzhiyun "pw_cond2 is not satisfied!\n");
1717*4882a593Smuzhiyun if (dfs->pw_cond3 == 0)
1718*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1719*4882a593Smuzhiyun "pw_cond3 is not satisfied!\n");
1720*4882a593Smuzhiyun }
1721*4882a593Smuzhiyun if (dfs->pulse_flag_hist[index] &&
1722*4882a593Smuzhiyun (dfs->pri_type3_4_flag == 0)) {
1723*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1724*4882a593Smuzhiyun "pri_type3_4 criterion is not satisfied!\n");
1725*4882a593Smuzhiyun if (dfs->pri_type3_4_cond1 == 0)
1726*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1727*4882a593Smuzhiyun "pri_type3_4_cond1 is not satisfied!\n");
1728*4882a593Smuzhiyun if (dfs->pri_type3_4_cond2 == 0)
1729*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1730*4882a593Smuzhiyun "pri_type3_4_cond2 is not satisfied!\n");
1731*4882a593Smuzhiyun }
1732*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "hist_idx= %d\n",
1733*4882a593Smuzhiyun (dfs->hist_idx + 3) % 4);
1734*4882a593Smuzhiyun for (j = 0; j < 4; j++) {
1735*4882a593Smuzhiyun for (i = 0; i < 6; i++) {
1736*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1737*4882a593Smuzhiyun "pri_hold = %d ",
1738*4882a593Smuzhiyun dfs->pri_hold[j][i]);
1739*4882a593Smuzhiyun }
1740*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "\n");
1741*4882a593Smuzhiyun }
1742*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "\n");
1743*4882a593Smuzhiyun for (j = 0; j < 4; j++) {
1744*4882a593Smuzhiyun for (i = 0; i < 6; i++)
1745*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1746*4882a593Smuzhiyun "pw_hold = %d ",
1747*4882a593Smuzhiyun dfs->pw_hold[j][i]);
1748*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "\n");
1749*4882a593Smuzhiyun }
1750*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "\n");
1751*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "idle_mode = %d\n",
1752*4882a593Smuzhiyun dfs->idle_mode);
1753*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1754*4882a593Smuzhiyun "pw_hold_sum = %d %d %d %d %d %d\n",
1755*4882a593Smuzhiyun dfs->pw_hold_sum[0], dfs->pw_hold_sum[1],
1756*4882a593Smuzhiyun dfs->pw_hold_sum[2], dfs->pw_hold_sum[3],
1757*4882a593Smuzhiyun dfs->pw_hold_sum[4], dfs->pw_hold_sum[5]);
1758*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1759*4882a593Smuzhiyun "pri_hold_sum = %d %d %d %d %d %d\n",
1760*4882a593Smuzhiyun dfs->pri_hold_sum[0], dfs->pri_hold_sum[1],
1761*4882a593Smuzhiyun dfs->pri_hold_sum[2], dfs->pri_hold_sum[3],
1762*4882a593Smuzhiyun dfs->pri_hold_sum[4], dfs->pri_hold_sum[5]);
1763*4882a593Smuzhiyun }
1764*4882a593Smuzhiyun }
1765*4882a593Smuzhiyun } else {
1766*4882a593Smuzhiyun dfs->radar_type = 1;
1767*4882a593Smuzhiyun if (dfs->det_print2) {
1768*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "\n");
1769*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS, "idle_mode = %d\n",
1770*4882a593Smuzhiyun dfs->idle_mode);
1771*4882a593Smuzhiyun }
1772*4882a593Smuzhiyun /* @Long radar should satisfy three conditions */
1773*4882a593Smuzhiyun if (dfs->long_radar_flag == 1) {
1774*4882a593Smuzhiyun hist_radar_detected = 1;
1775*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1776*4882a593Smuzhiyun "Detected type %d radar signal!\n",
1777*4882a593Smuzhiyun dfs->radar_type);
1778*4882a593Smuzhiyun } else {
1779*4882a593Smuzhiyun if (dfs->det_print2) {
1780*4882a593Smuzhiyun if (dfs->pw_long_cond1 == 0)
1781*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1782*4882a593Smuzhiyun "--pw_long_cond1 is not satisfied!--\n");
1783*4882a593Smuzhiyun if (dfs->pw_long_cond2 == 0)
1784*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1785*4882a593Smuzhiyun "--pw_long_cond2 is not satisfied!--\n");
1786*4882a593Smuzhiyun if (dfs->pri_long_cond1 == 0)
1787*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1788*4882a593Smuzhiyun "--pri_long_cond1 is not satisfied!--\n");
1789*4882a593Smuzhiyun }
1790*4882a593Smuzhiyun }
1791*4882a593Smuzhiyun }
1792*4882a593Smuzhiyun return hist_radar_detected;
1793*4882a593Smuzhiyun }
1794*4882a593Smuzhiyun
phydm_radar_detect(void * dm_void)1795*4882a593Smuzhiyun boolean phydm_radar_detect(void *dm_void)
1796*4882a593Smuzhiyun {
1797*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
1798*4882a593Smuzhiyun struct _DFS_STATISTICS *dfs = &dm->dfs;
1799*4882a593Smuzhiyun boolean radar_detected = false;
1800*4882a593Smuzhiyun
1801*4882a593Smuzhiyun if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
1802*4882a593Smuzhiyun dfs->igi_cur = (u8)odm_get_bb_reg(dm, R_0x1d70, 0x0000007f);
1803*4882a593Smuzhiyun dfs->st_l2h_cur = (u8)odm_get_bb_reg(dm, R_0xa40, 0x00007f00);
1804*4882a593Smuzhiyun #if (RTL8721D_SUPPORT)
1805*4882a593Smuzhiyun } else if (dm->support_ic_type & (ODM_RTL8721D)) {
1806*4882a593Smuzhiyun dfs->st_l2h_cur = (u8)(odm_get_bb_reg(dm, R_0xf54,
1807*4882a593Smuzhiyun 0x0000001f) << 2);
1808*4882a593Smuzhiyun dfs->st_l2h_cur += (u8)odm_get_bb_reg(dm, R_0xf58, 0xc0000000);
1809*4882a593Smuzhiyun #endif
1810*4882a593Smuzhiyun } else {
1811*4882a593Smuzhiyun dfs->igi_cur = (u8)odm_get_bb_reg(dm, R_0xc50, 0x0000007f);
1812*4882a593Smuzhiyun dfs->st_l2h_cur = (u8)odm_get_bb_reg(dm, R_0x91c, 0x000000ff);
1813*4882a593Smuzhiyun }
1814*4882a593Smuzhiyun
1815*4882a593Smuzhiyun /* @dynamic pwdb calibration */
1816*4882a593Smuzhiyun if (dfs->igi_pre != dfs->igi_cur) {
1817*4882a593Smuzhiyun dfs->pwdb_th_cur = ((int)dfs->st_l2h_cur - (int)dfs->igi_cur)
1818*4882a593Smuzhiyun / 2 + dfs->pwdb_scalar_factor;
1819*4882a593Smuzhiyun
1820*4882a593Smuzhiyun /* @limit the pwdb value to absolute lower bound 0xa */
1821*4882a593Smuzhiyun dfs->pwdb_th_cur = MAX_2(dfs->pwdb_th_cur, (int)dfs->pwdb_th);
1822*4882a593Smuzhiyun /* @limit the pwdb value to absolute upper bound 0x1f */
1823*4882a593Smuzhiyun dfs->pwdb_th_cur = MIN_2(dfs->pwdb_th_cur, 0x1f);
1824*4882a593Smuzhiyun
1825*4882a593Smuzhiyun if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
1826*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa50, 0x000000f0,
1827*4882a593Smuzhiyun dfs->pwdb_th_cur);
1828*4882a593Smuzhiyun #if (RTL8721D_SUPPORT)
1829*4882a593Smuzhiyun else if (dm->support_ic_type & (ODM_RTL8721D))
1830*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xf70, 0x03c00000,
1831*4882a593Smuzhiyun dfs->pwdb_th_cur);
1832*4882a593Smuzhiyun #endif
1833*4882a593Smuzhiyun else
1834*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0x918, 0x00001f00,
1835*4882a593Smuzhiyun dfs->pwdb_th_cur);
1836*4882a593Smuzhiyun }
1837*4882a593Smuzhiyun dfs->igi_pre = dfs->igi_cur;
1838*4882a593Smuzhiyun
1839*4882a593Smuzhiyun phydm_dfs_dynamic_setting(dm);
1840*4882a593Smuzhiyun #if (RTL8814A_SUPPORT || RTL8822B_SUPPORT || RTL8821C_SUPPORT)
1841*4882a593Smuzhiyun if (dm->support_ic_type & (ODM_RTL8814A | ODM_RTL8822B | ODM_RTL8821C))
1842*4882a593Smuzhiyun phydm_dfs_histogram_radar_distinguish(dm);
1843*4882a593Smuzhiyun #endif
1844*4882a593Smuzhiyun radar_detected = phydm_radar_detect_dm_check(dm);
1845*4882a593Smuzhiyun
1846*4882a593Smuzhiyun if (radar_detected) {
1847*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1848*4882a593Smuzhiyun "Radar detect: %d\n", radar_detected);
1849*4882a593Smuzhiyun phydm_radar_detect_reset(dm);
1850*4882a593Smuzhiyun if (dfs->dbg_mode == 1) {
1851*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1852*4882a593Smuzhiyun "Radar is detected in DFS dbg mode.\n");
1853*4882a593Smuzhiyun radar_detected = 0;
1854*4882a593Smuzhiyun }
1855*4882a593Smuzhiyun }
1856*4882a593Smuzhiyun
1857*4882a593Smuzhiyun if (dfs->sw_trigger_mode) {
1858*4882a593Smuzhiyun radar_detected = 1;
1859*4882a593Smuzhiyun PHYDM_DBG(dm, DBG_DFS,
1860*4882a593Smuzhiyun "Radar is detected in DFS SW trigger mode.\n");
1861*4882a593Smuzhiyun }
1862*4882a593Smuzhiyun
1863*4882a593Smuzhiyun return radar_detected;
1864*4882a593Smuzhiyun }
1865*4882a593Smuzhiyun
phydm_dfs_hist_dbg(void * dm_void,char input[][16],u32 * _used,char * output,u32 * _out_len)1866*4882a593Smuzhiyun void phydm_dfs_hist_dbg(void *dm_void, char input[][16], u32 *_used,
1867*4882a593Smuzhiyun char *output, u32 *_out_len)
1868*4882a593Smuzhiyun {
1869*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
1870*4882a593Smuzhiyun struct _DFS_STATISTICS *dfs = &dm->dfs;
1871*4882a593Smuzhiyun char help[] = "-h";
1872*4882a593Smuzhiyun u32 argv[5] = {0};
1873*4882a593Smuzhiyun u32 used = *_used;
1874*4882a593Smuzhiyun u32 out_len = *_out_len;
1875*4882a593Smuzhiyun u8 i;
1876*4882a593Smuzhiyun
1877*4882a593Smuzhiyun if ((strcmp(input[1], help) == 0)) {
1878*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1879*4882a593Smuzhiyun "{0} pri_hist_th = %d\n", dfs->pri_hist_th);
1880*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1881*4882a593Smuzhiyun "{1} pri_sum_g1_th = %d\n", dfs->pri_sum_g1_th);
1882*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1883*4882a593Smuzhiyun "{2} pri_sum_g5_th = %d\n", dfs->pri_sum_g5_th);
1884*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1885*4882a593Smuzhiyun "{3} pri_sum_g1_fcc_th = %d\n",
1886*4882a593Smuzhiyun dfs->pri_sum_g1_fcc_th);
1887*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1888*4882a593Smuzhiyun "{4} pri_sum_g3_fcc_th = %d\n",
1889*4882a593Smuzhiyun dfs->pri_sum_g3_fcc_th);
1890*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1891*4882a593Smuzhiyun "{5} pri_sum_safe_fcc_th = %d\n",
1892*4882a593Smuzhiyun dfs->pri_sum_safe_fcc_th);
1893*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1894*4882a593Smuzhiyun "{6} pri_sum_type4_th = %d\n", dfs->pri_sum_type4_th);
1895*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1896*4882a593Smuzhiyun "{7} pri_sum_type6_th = %d\n", dfs->pri_sum_type6_th);
1897*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1898*4882a593Smuzhiyun "{8} pri_sum_safe_th = %d\n", dfs->pri_sum_safe_th);
1899*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1900*4882a593Smuzhiyun "{9} pri_sum_g5_under_g1_th = %d\n",
1901*4882a593Smuzhiyun dfs->pri_sum_g5_under_g1_th);
1902*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1903*4882a593Smuzhiyun "{10} pri_pw_diff_th = %d\n", dfs->pri_pw_diff_th);
1904*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1905*4882a593Smuzhiyun "{11} pri_pw_diff_fcc_th = %d\n",
1906*4882a593Smuzhiyun dfs->pri_pw_diff_fcc_th);
1907*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1908*4882a593Smuzhiyun "{12} pri_pw_diff_fcc_idle_th = %d\n",
1909*4882a593Smuzhiyun dfs->pri_pw_diff_fcc_idle_th);
1910*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1911*4882a593Smuzhiyun "{13} pri_pw_diff_w53_th = %d\n",
1912*4882a593Smuzhiyun dfs->pri_pw_diff_w53_th);
1913*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1914*4882a593Smuzhiyun "{14} pri_type1_low_fcc_th = %d\n",
1915*4882a593Smuzhiyun dfs->pri_type1_low_fcc_th);
1916*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1917*4882a593Smuzhiyun "{15} pri_type1_upp_fcc_th = %d\n",
1918*4882a593Smuzhiyun dfs->pri_type1_upp_fcc_th);
1919*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1920*4882a593Smuzhiyun "{16} pri_type1_cen_fcc_th = %d\n",
1921*4882a593Smuzhiyun dfs->pri_type1_cen_fcc_th);
1922*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1923*4882a593Smuzhiyun "{17} pw_g0_th = %d\n", dfs->pw_g0_th);
1924*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1925*4882a593Smuzhiyun "{18} pw_long_lower_20m_th = %d\n",
1926*4882a593Smuzhiyun dfs->pw_long_lower_20m_th);
1927*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1928*4882a593Smuzhiyun "{19} pw_long_lower_th = %d\n",
1929*4882a593Smuzhiyun dfs->pw_long_lower_th);
1930*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1931*4882a593Smuzhiyun "{20} pri_long_upper_th = %d\n",
1932*4882a593Smuzhiyun dfs->pri_long_upper_th);
1933*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1934*4882a593Smuzhiyun "{21} pw_long_sum_upper_th = %d\n",
1935*4882a593Smuzhiyun dfs->pw_long_sum_upper_th);
1936*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1937*4882a593Smuzhiyun "{22} pw_std_th = %d\n", dfs->pw_std_th);
1938*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1939*4882a593Smuzhiyun "{23} pw_std_idle_th = %d\n", dfs->pw_std_idle_th);
1940*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1941*4882a593Smuzhiyun "{24} pri_std_th = %d\n", dfs->pri_std_th);
1942*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1943*4882a593Smuzhiyun "{25} pri_std_idle_th = %d\n", dfs->pri_std_idle_th);
1944*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1945*4882a593Smuzhiyun "{26} type4_pw_max_cnt = %d\n", dfs->type4_pw_max_cnt);
1946*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1947*4882a593Smuzhiyun "{27} type4_safe_pri_sum_th = %d\n",
1948*4882a593Smuzhiyun dfs->type4_safe_pri_sum_th);
1949*4882a593Smuzhiyun } else {
1950*4882a593Smuzhiyun PHYDM_SSCANF(input[1], DCMD_DECIMAL, &argv[0]);
1951*4882a593Smuzhiyun
1952*4882a593Smuzhiyun for (i = 1; i < 5; i++) {
1953*4882a593Smuzhiyun if (input[i + 1])
1954*4882a593Smuzhiyun PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL,
1955*4882a593Smuzhiyun &argv[i]);
1956*4882a593Smuzhiyun }
1957*4882a593Smuzhiyun if (argv[0] == 0) {
1958*4882a593Smuzhiyun dfs->pri_hist_th = (u8)argv[1];
1959*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1960*4882a593Smuzhiyun "pri_hist_th = %d\n",
1961*4882a593Smuzhiyun dfs->pri_hist_th);
1962*4882a593Smuzhiyun } else if (argv[0] == 1) {
1963*4882a593Smuzhiyun dfs->pri_sum_g1_th = (u8)argv[1];
1964*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1965*4882a593Smuzhiyun "pri_sum_g1_th = %d\n",
1966*4882a593Smuzhiyun dfs->pri_sum_g1_th);
1967*4882a593Smuzhiyun } else if (argv[0] == 2) {
1968*4882a593Smuzhiyun dfs->pri_sum_g5_th = (u8)argv[1];
1969*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1970*4882a593Smuzhiyun "pri_sum_g5_th = %d\n",
1971*4882a593Smuzhiyun dfs->pri_sum_g5_th);
1972*4882a593Smuzhiyun } else if (argv[0] == 3) {
1973*4882a593Smuzhiyun dfs->pri_sum_g1_fcc_th = (u8)argv[1];
1974*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1975*4882a593Smuzhiyun "pri_sum_g1_fcc_th = %d\n",
1976*4882a593Smuzhiyun dfs->pri_sum_g1_fcc_th);
1977*4882a593Smuzhiyun } else if (argv[0] == 4) {
1978*4882a593Smuzhiyun dfs->pri_sum_g3_fcc_th = (u8)argv[1];
1979*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1980*4882a593Smuzhiyun "pri_sum_g3_fcc_th = %d\n",
1981*4882a593Smuzhiyun dfs->pri_sum_g3_fcc_th);
1982*4882a593Smuzhiyun } else if (argv[0] == 5) {
1983*4882a593Smuzhiyun dfs->pri_sum_safe_fcc_th = (u8)argv[1];
1984*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1985*4882a593Smuzhiyun "pri_sum_safe_fcc_th = %d\n",
1986*4882a593Smuzhiyun dfs->pri_sum_safe_fcc_th);
1987*4882a593Smuzhiyun } else if (argv[0] == 6) {
1988*4882a593Smuzhiyun dfs->pri_sum_type4_th = (u8)argv[1];
1989*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1990*4882a593Smuzhiyun "pri_sum_type4_th = %d\n",
1991*4882a593Smuzhiyun dfs->pri_sum_type4_th);
1992*4882a593Smuzhiyun } else if (argv[0] == 7) {
1993*4882a593Smuzhiyun dfs->pri_sum_type6_th = (u8)argv[1];
1994*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
1995*4882a593Smuzhiyun "pri_sum_type6_th = %d\n",
1996*4882a593Smuzhiyun dfs->pri_sum_type6_th);
1997*4882a593Smuzhiyun } else if (argv[0] == 8) {
1998*4882a593Smuzhiyun dfs->pri_sum_safe_th = (u8)argv[1];
1999*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
2000*4882a593Smuzhiyun "pri_sum_safe_th = %d\n",
2001*4882a593Smuzhiyun dfs->pri_sum_safe_th);
2002*4882a593Smuzhiyun } else if (argv[0] == 9) {
2003*4882a593Smuzhiyun dfs->pri_sum_g5_under_g1_th = (u8)argv[1];
2004*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
2005*4882a593Smuzhiyun "pri_sum_g5_under_g1_th = %d\n",
2006*4882a593Smuzhiyun dfs->pri_sum_g5_under_g1_th);
2007*4882a593Smuzhiyun } else if (argv[0] == 10) {
2008*4882a593Smuzhiyun dfs->pri_pw_diff_th = (u8)argv[1];
2009*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
2010*4882a593Smuzhiyun "pri_pw_diff_th = %d\n",
2011*4882a593Smuzhiyun dfs->pri_pw_diff_th);
2012*4882a593Smuzhiyun } else if (argv[0] == 11) {
2013*4882a593Smuzhiyun dfs->pri_pw_diff_fcc_th = (u8)argv[1];
2014*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
2015*4882a593Smuzhiyun "pri_pw_diff_fcc_th = %d\n",
2016*4882a593Smuzhiyun dfs->pri_pw_diff_fcc_th);
2017*4882a593Smuzhiyun } else if (argv[0] == 12) {
2018*4882a593Smuzhiyun dfs->pri_pw_diff_fcc_idle_th = (u8)argv[1];
2019*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
2020*4882a593Smuzhiyun "pri_pw_diff_fcc_idle_th = %d\n",
2021*4882a593Smuzhiyun dfs->pri_pw_diff_fcc_idle_th);
2022*4882a593Smuzhiyun } else if (argv[0] == 13) {
2023*4882a593Smuzhiyun dfs->pri_pw_diff_w53_th = (u8)argv[1];
2024*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
2025*4882a593Smuzhiyun "pri_pw_diff_w53_th = %d\n",
2026*4882a593Smuzhiyun dfs->pri_pw_diff_w53_th);
2027*4882a593Smuzhiyun } else if (argv[0] == 14) {
2028*4882a593Smuzhiyun dfs->pri_type1_low_fcc_th = (u8)argv[1];
2029*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
2030*4882a593Smuzhiyun "pri_type1_low_fcc_th = %d\n",
2031*4882a593Smuzhiyun dfs->pri_type1_low_fcc_th);
2032*4882a593Smuzhiyun } else if (argv[0] == 15) {
2033*4882a593Smuzhiyun dfs->pri_type1_upp_fcc_th = (u8)argv[1];
2034*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
2035*4882a593Smuzhiyun "pri_type1_upp_fcc_th = %d\n",
2036*4882a593Smuzhiyun dfs->pri_type1_upp_fcc_th);
2037*4882a593Smuzhiyun } else if (argv[0] == 16) {
2038*4882a593Smuzhiyun dfs->pri_type1_cen_fcc_th = (u8)argv[1];
2039*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
2040*4882a593Smuzhiyun "pri_type1_cen_fcc_th = %d\n",
2041*4882a593Smuzhiyun dfs->pri_type1_cen_fcc_th);
2042*4882a593Smuzhiyun } else if (argv[0] == 17) {
2043*4882a593Smuzhiyun dfs->pw_g0_th = (u8)argv[1];
2044*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
2045*4882a593Smuzhiyun "pw_g0_th = %d\n",
2046*4882a593Smuzhiyun dfs->pw_g0_th);
2047*4882a593Smuzhiyun } else if (argv[0] == 18) {
2048*4882a593Smuzhiyun dfs->pw_long_lower_20m_th = (u8)argv[1];
2049*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
2050*4882a593Smuzhiyun "pw_long_lower_20m_th = %d\n",
2051*4882a593Smuzhiyun dfs->pw_long_lower_20m_th);
2052*4882a593Smuzhiyun } else if (argv[0] == 19) {
2053*4882a593Smuzhiyun dfs->pw_long_lower_th = (u8)argv[1];
2054*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
2055*4882a593Smuzhiyun "pw_long_lower_th = %d\n",
2056*4882a593Smuzhiyun dfs->pw_long_lower_th);
2057*4882a593Smuzhiyun } else if (argv[0] == 20) {
2058*4882a593Smuzhiyun dfs->pri_long_upper_th = (u8)argv[1];
2059*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
2060*4882a593Smuzhiyun "pri_long_upper_th = %d\n",
2061*4882a593Smuzhiyun dfs->pri_long_upper_th);
2062*4882a593Smuzhiyun } else if (argv[0] == 21) {
2063*4882a593Smuzhiyun dfs->pw_long_sum_upper_th = (u8)argv[1];
2064*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
2065*4882a593Smuzhiyun "pw_long_sum_upper_th = %d\n",
2066*4882a593Smuzhiyun dfs->pw_long_sum_upper_th);
2067*4882a593Smuzhiyun } else if (argv[0] == 22) {
2068*4882a593Smuzhiyun dfs->pw_std_th = (u8)argv[1];
2069*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
2070*4882a593Smuzhiyun "pw_std_th = %d\n",
2071*4882a593Smuzhiyun dfs->pw_std_th);
2072*4882a593Smuzhiyun } else if (argv[0] == 23) {
2073*4882a593Smuzhiyun dfs->pw_std_idle_th = (u8)argv[1];
2074*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
2075*4882a593Smuzhiyun "pw_std_idle_th = %d\n",
2076*4882a593Smuzhiyun dfs->pw_std_idle_th);
2077*4882a593Smuzhiyun } else if (argv[0] == 24) {
2078*4882a593Smuzhiyun dfs->pri_std_th = (u8)argv[1];
2079*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
2080*4882a593Smuzhiyun "pri_std_th = %d\n",
2081*4882a593Smuzhiyun dfs->pri_std_th);
2082*4882a593Smuzhiyun } else if (argv[0] == 25) {
2083*4882a593Smuzhiyun dfs->pri_std_idle_th = (u8)argv[1];
2084*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
2085*4882a593Smuzhiyun "pri_std_idle_th = %d\n",
2086*4882a593Smuzhiyun dfs->pri_std_idle_th);
2087*4882a593Smuzhiyun } else if (argv[0] == 26) {
2088*4882a593Smuzhiyun dfs->type4_pw_max_cnt = (u8)argv[1];
2089*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
2090*4882a593Smuzhiyun "type4_pw_max_cnt = %d\n",
2091*4882a593Smuzhiyun dfs->type4_pw_max_cnt);
2092*4882a593Smuzhiyun } else if (argv[0] == 27) {
2093*4882a593Smuzhiyun dfs->type4_safe_pri_sum_th = (u8)argv[1];
2094*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
2095*4882a593Smuzhiyun "type4_safe_pri_sum_th = %d\n",
2096*4882a593Smuzhiyun dfs->type4_safe_pri_sum_th);
2097*4882a593Smuzhiyun }
2098*4882a593Smuzhiyun }
2099*4882a593Smuzhiyun *_used = used;
2100*4882a593Smuzhiyun *_out_len = out_len;
2101*4882a593Smuzhiyun }
2102*4882a593Smuzhiyun
phydm_dfs_debug(void * dm_void,char input[][16],u32 * _used,char * output,u32 * _out_len)2103*4882a593Smuzhiyun void phydm_dfs_debug(void *dm_void, char input[][16], u32 *_used,
2104*4882a593Smuzhiyun char *output, u32 *_out_len)
2105*4882a593Smuzhiyun {
2106*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
2107*4882a593Smuzhiyun struct _DFS_STATISTICS *dfs = &dm->dfs;
2108*4882a593Smuzhiyun u32 used = *_used;
2109*4882a593Smuzhiyun u32 out_len = *_out_len;
2110*4882a593Smuzhiyun u32 argv[10] = {0};
2111*4882a593Smuzhiyun u8 i, input_idx = 0;
2112*4882a593Smuzhiyun
2113*4882a593Smuzhiyun for (i = 0; i < 7; i++) {
2114*4882a593Smuzhiyun if (input[i + 1]) {
2115*4882a593Smuzhiyun PHYDM_SSCANF(input[i + 1], DCMD_HEX, &argv[i]);
2116*4882a593Smuzhiyun input_idx++;
2117*4882a593Smuzhiyun }
2118*4882a593Smuzhiyun }
2119*4882a593Smuzhiyun
2120*4882a593Smuzhiyun if (input_idx == 0)
2121*4882a593Smuzhiyun return;
2122*4882a593Smuzhiyun
2123*4882a593Smuzhiyun dfs->dbg_mode = (boolean)argv[0];
2124*4882a593Smuzhiyun dfs->sw_trigger_mode = (boolean)argv[1];
2125*4882a593Smuzhiyun dfs->force_TP_mode = (boolean)argv[2];
2126*4882a593Smuzhiyun dfs->det_print = (boolean)argv[3];
2127*4882a593Smuzhiyun dfs->det_print2 = (boolean)argv[4];
2128*4882a593Smuzhiyun dfs->print_hist_rpt = (boolean)argv[5];
2129*4882a593Smuzhiyun dfs->hist_cond_on = (boolean)argv[6];
2130*4882a593Smuzhiyun
2131*4882a593Smuzhiyun PDM_SNPF(out_len, used, output + used, out_len - used,
2132*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",
2133*4882a593Smuzhiyun dfs->dbg_mode, dfs->sw_trigger_mode, dfs->force_TP_mode,
2134*4882a593Smuzhiyun dfs->det_print, dfs->det_print2, dfs->print_hist_rpt,
2135*4882a593Smuzhiyun dfs->hist_cond_on);
2136*4882a593Smuzhiyun }
2137*4882a593Smuzhiyun
phydm_dfs_polling_time(void * dm_void)2138*4882a593Smuzhiyun u8 phydm_dfs_polling_time(void *dm_void)
2139*4882a593Smuzhiyun {
2140*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
2141*4882a593Smuzhiyun struct _DFS_STATISTICS *dfs = &dm->dfs;
2142*4882a593Smuzhiyun
2143*4882a593Smuzhiyun if (dm->support_ic_type & (ODM_RTL8814A | ODM_RTL8822B | ODM_RTL8821C))
2144*4882a593Smuzhiyun dfs->dfs_polling_time = 40;
2145*4882a593Smuzhiyun else
2146*4882a593Smuzhiyun dfs->dfs_polling_time = 100;
2147*4882a593Smuzhiyun
2148*4882a593Smuzhiyun return dfs->dfs_polling_time;
2149*4882a593Smuzhiyun }
2150*4882a593Smuzhiyun
2151*4882a593Smuzhiyun #endif /* @defined(CONFIG_PHYDM_DFS_MASTER) */
2152*4882a593Smuzhiyun
2153*4882a593Smuzhiyun boolean
phydm_is_dfs_band(void * dm_void)2154*4882a593Smuzhiyun phydm_is_dfs_band(void *dm_void)
2155*4882a593Smuzhiyun {
2156*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
2157*4882a593Smuzhiyun
2158*4882a593Smuzhiyun if (((*dm->channel >= 52) && (*dm->channel <= 64)) ||
2159*4882a593Smuzhiyun ((*dm->channel >= 100) && (*dm->channel <= 144)))
2160*4882a593Smuzhiyun return true;
2161*4882a593Smuzhiyun else
2162*4882a593Smuzhiyun return false;
2163*4882a593Smuzhiyun }
2164*4882a593Smuzhiyun
2165*4882a593Smuzhiyun boolean
phydm_dfs_master_enabled(void * dm_void)2166*4882a593Smuzhiyun phydm_dfs_master_enabled(void *dm_void)
2167*4882a593Smuzhiyun {
2168*4882a593Smuzhiyun #ifdef CONFIG_PHYDM_DFS_MASTER
2169*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
2170*4882a593Smuzhiyun boolean ret_val = false;
2171*4882a593Smuzhiyun
2172*4882a593Smuzhiyun if (dm->dfs_master_enabled) /*pointer protection*/
2173*4882a593Smuzhiyun ret_val = *dm->dfs_master_enabled ? true : false;
2174*4882a593Smuzhiyun
2175*4882a593Smuzhiyun return ret_val;
2176*4882a593Smuzhiyun #else
2177*4882a593Smuzhiyun return false;
2178*4882a593Smuzhiyun #endif
2179*4882a593Smuzhiyun }
2180*4882a593Smuzhiyun
2181*4882a593Smuzhiyun #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
2182*4882a593Smuzhiyun #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
phydm_dfs_ap_reset_radar_detect_counter_and_flag(void * dm_void)2183*4882a593Smuzhiyun void phydm_dfs_ap_reset_radar_detect_counter_and_flag(void *dm_void)
2184*4882a593Smuzhiyun {
2185*4882a593Smuzhiyun struct dm_struct *dm = (struct dm_struct *)dm_void;
2186*4882a593Smuzhiyun
2187*4882a593Smuzhiyun /* @Clear Radar Counter and Radar flag */
2188*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa40, BIT(15), 0);
2189*4882a593Smuzhiyun odm_set_bb_reg(dm, R_0xa40, BIT(15), 1);
2190*4882a593Smuzhiyun
2191*4882a593Smuzhiyun /* RT_TRACE(COMP_DFS, DBG_LOUD, ("[DFS], After reset radar counter, 0xcf8 = 0x%x, 0xcf4 = 0x%x\n", */
2192*4882a593Smuzhiyun /* PHY_QueryBBReg(Adapter, 0xcf8, bMaskDWord), */
2193*4882a593Smuzhiyun /* PHY_QueryBBReg(Adapter, 0xcf4, bMaskDWord))); */
2194*4882a593Smuzhiyun }
2195*4882a593Smuzhiyun #endif
2196*4882a593Smuzhiyun #endif
2197