1 /******************************************************************************
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 ******************************************************************************/
22 ============================================================
24 ============================================================
27 #include "mp_precomp.h"
28 #include "phydm_precomp.h"
30 #if defined(CONFIG_PHYDM_DFS_MASTER)
31 void phydm_radar_detect_reset(void *p_dm_void)
33 struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
35 odm_set_bb_reg(p_dm_odm, 0x924, BIT(15), 0);
36 odm_set_bb_reg(p_dm_odm, 0x924, BIT(15), 1);
39 void phydm_radar_detect_disable(void *p_dm_void)
41 struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
43 odm_set_bb_reg(p_dm_odm, 0x924, BIT(15), 0);
44 ODM_RT_TRACE(p_dm_odm, ODM_COMP_DFS, ODM_DBG_LOUD, ("\n"));
47 static void phydm_radar_detect_with_dbg_parm(void *p_dm_void)
49 struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
51 odm_set_bb_reg(p_dm_odm, 0x918, MASKDWORD, p_dm_odm->radar_detect_reg_918);
52 odm_set_bb_reg(p_dm_odm, 0x91c, MASKDWORD, p_dm_odm->radar_detect_reg_91c);
53 odm_set_bb_reg(p_dm_odm, 0x920, MASKDWORD, p_dm_odm->radar_detect_reg_920);
54 odm_set_bb_reg(p_dm_odm, 0x924, MASKDWORD, p_dm_odm->radar_detect_reg_924);
57 /* Init radar detection parameters, called after ch, bw is set */
58 void phydm_radar_detect_enable(void *p_dm_void)
60 struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
61 u8 region_domain = p_dm_odm->dfs_region_domain;
62 u8 c_channel = *(p_dm_odm->p_channel);
63 u8 band_width = *(p_dm_odm->p_band_width);
66 if (region_domain == PHYDM_DFS_DOMAIN_UNKNOWN) {
67 ODM_RT_TRACE(p_dm_odm, ODM_COMP_DFS, ODM_DBG_LOUD, ("PHYDM_DFS_DOMAIN_UNKNOWN\n"));
71 if (p_dm_odm->support_ic_type & (ODM_RTL8821 | ODM_RTL8812 | ODM_RTL8881A)) {
73 odm_set_bb_reg(p_dm_odm, 0x814, 0x3fffffff, 0x04cc4d10);
74 odm_set_bb_reg(p_dm_odm, 0x834, MASKBYTE0, 0x06);
76 if (p_dm_odm->radar_detect_dbg_parm_en) {
77 phydm_radar_detect_with_dbg_parm(p_dm_odm);
82 if (region_domain == PHYDM_DFS_DOMAIN_ETSI) {
83 odm_set_bb_reg(p_dm_odm, 0x918, MASKDWORD, 0x1c17ecdf);
84 odm_set_bb_reg(p_dm_odm, 0x924, MASKDWORD, 0x01528500);
85 odm_set_bb_reg(p_dm_odm, 0x91c, MASKDWORD, 0x0fa21a20);
86 odm_set_bb_reg(p_dm_odm, 0x920, MASKDWORD, 0xe0f69204);
88 } else if (region_domain == PHYDM_DFS_DOMAIN_MKK) {
89 odm_set_bb_reg(p_dm_odm, 0x924, MASKDWORD, 0x01528500);
90 odm_set_bb_reg(p_dm_odm, 0x920, MASKDWORD, 0xe0d67234);
92 if (c_channel >= 52 && c_channel <= 64) {
93 odm_set_bb_reg(p_dm_odm, 0x918, MASKDWORD, 0x1c16ecdf);
94 odm_set_bb_reg(p_dm_odm, 0x91c, MASKDWORD, 0x0f141a20);
96 odm_set_bb_reg(p_dm_odm, 0x918, MASKDWORD, 0x1c16acdf);
97 if (band_width == ODM_BW20M)
98 odm_set_bb_reg(p_dm_odm, 0x91c, MASKDWORD, 0x64721a20);
100 odm_set_bb_reg(p_dm_odm, 0x91c, MASKDWORD, 0x68721a20);
103 } else if (region_domain == PHYDM_DFS_DOMAIN_FCC) {
104 odm_set_bb_reg(p_dm_odm, 0x918, MASKDWORD, 0x1c16acdf);
105 odm_set_bb_reg(p_dm_odm, 0x924, MASKDWORD, 0x01528500);
106 odm_set_bb_reg(p_dm_odm, 0x920, MASKDWORD, 0xe0d67231);
107 if (band_width == ODM_BW20M)
108 odm_set_bb_reg(p_dm_odm, 0x91c, MASKDWORD, 0x64741a20);
110 odm_set_bb_reg(p_dm_odm, 0x91c, MASKDWORD, 0x68741a20);
114 ODM_RT_TRACE(p_dm_odm, ODM_COMP_DFS, ODM_DBG_LOUD, ("Unsupported dfs_region_domain:%d\n", region_domain));
118 } else if (p_dm_odm->support_ic_type & (ODM_RTL8814A | ODM_RTL8822B)) {
120 odm_set_bb_reg(p_dm_odm, 0x814, 0x3fffffff, 0x04cc4d10);
121 odm_set_bb_reg(p_dm_odm, 0x834, MASKBYTE0, 0x06);
123 /* 8822B only, when BW = 20M, DFIR output is 40Mhz, but DFS input is 80MMHz, so it need to upgrade to 80MHz */
124 if (p_dm_odm->support_ic_type & ODM_RTL8822B) {
125 if (band_width == ODM_BW20M)
126 odm_set_bb_reg(p_dm_odm, 0x1984, BIT(26), 1);
128 odm_set_bb_reg(p_dm_odm, 0x1984, BIT(26), 0);
131 if (p_dm_odm->radar_detect_dbg_parm_en) {
132 phydm_radar_detect_with_dbg_parm(p_dm_odm);
137 if (region_domain == PHYDM_DFS_DOMAIN_ETSI) {
138 odm_set_bb_reg(p_dm_odm, 0x918, MASKDWORD, 0x1c16acdf);
139 odm_set_bb_reg(p_dm_odm, 0x924, MASKDWORD, 0x095a8500);
140 odm_set_bb_reg(p_dm_odm, 0x91c, MASKDWORD, 0x0fa21a20);
141 odm_set_bb_reg(p_dm_odm, 0x920, MASKDWORD, 0xe0f57204);
143 } else if (region_domain == PHYDM_DFS_DOMAIN_MKK) {
144 odm_set_bb_reg(p_dm_odm, 0x924, MASKDWORD, 0x095a8500);
145 odm_set_bb_reg(p_dm_odm, 0x920, MASKDWORD, 0xe0d67234);
147 if (c_channel >= 52 && c_channel <= 64) {
148 odm_set_bb_reg(p_dm_odm, 0x918, MASKDWORD, 0x1c16ecdf);
149 odm_set_bb_reg(p_dm_odm, 0x91c, MASKDWORD, 0x0f141a20);
151 odm_set_bb_reg(p_dm_odm, 0x918, MASKDWORD, 0x1c166cdf);
152 if (band_width == ODM_BW20M)
153 odm_set_bb_reg(p_dm_odm, 0x91c, MASKDWORD, 0x64721a20);
155 odm_set_bb_reg(p_dm_odm, 0x91c, MASKDWORD, 0x68721a20);
158 } else if (region_domain == PHYDM_DFS_DOMAIN_FCC) {
159 odm_set_bb_reg(p_dm_odm, 0x918, MASKDWORD, 0x1c166cdf);
160 odm_set_bb_reg(p_dm_odm, 0x924, MASKDWORD, 0x095a8500);
161 odm_set_bb_reg(p_dm_odm, 0x920, MASKDWORD, 0xe0d67231);
162 if (band_width == ODM_BW20M)
163 odm_set_bb_reg(p_dm_odm, 0x91c, MASKDWORD, 0x64741a20);
165 odm_set_bb_reg(p_dm_odm, 0x91c, MASKDWORD, 0x68741a20);
169 ODM_RT_TRACE(p_dm_odm, ODM_COMP_DFS, ODM_DBG_LOUD, ("Unsupported dfs_region_domain:%d\n", region_domain));
173 /* not supported IC type*/
174 ODM_RT_TRACE(p_dm_odm, ODM_COMP_DFS, ODM_DBG_LOUD, ("Unsupported IC type:%d\n", p_dm_odm->support_ic_type));
182 phydm_radar_detect_reset(p_dm_odm);
183 ODM_RT_TRACE(p_dm_odm, ODM_COMP_DFS, ODM_DBG_LOUD, ("on cch:%u, bw:%u\n", c_channel, band_width));
185 phydm_radar_detect_disable(p_dm_odm);
188 boolean phydm_radar_detect(void *p_dm_void)
190 struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
191 boolean enable_DFS = false;
192 boolean radar_detected = false;
193 u8 region_domain = p_dm_odm->dfs_region_domain;
195 if (region_domain == PHYDM_DFS_DOMAIN_UNKNOWN) {
196 ODM_RT_TRACE(p_dm_odm, ODM_COMP_DFS, ODM_DBG_LOUD, ("PHYDM_DFS_DOMAIN_UNKNOWN\n"));
200 if (odm_get_bb_reg(p_dm_odm, 0x924, BIT(15)))
203 if ((odm_get_bb_reg(p_dm_odm, 0xf98, BIT(17)))
204 || (!(region_domain == PHYDM_DFS_DOMAIN_ETSI) && (odm_get_bb_reg(p_dm_odm, 0xf98, BIT(19)))))
205 radar_detected = true;
207 if (enable_DFS && radar_detected) {
208 ODM_RT_TRACE(p_dm_odm, ODM_COMP_DFS, ODM_DBG_LOUD
209 , ("Radar detect: enable_DFS:%d, radar_detected:%d\n"
210 , enable_DFS, radar_detected));
212 phydm_radar_detect_reset(p_dm_odm);
216 return enable_DFS && radar_detected;
218 #endif /* defined(CONFIG_PHYDM_DFS_MASTER) */
221 phydm_dfs_master_enabled(
225 #ifdef CONFIG_PHYDM_DFS_MASTER
226 struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
228 return *p_dm_odm->dfs_master_enabled ? true : false;
243 struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
245 u32 out_len = *_out_len;
249 #if defined(CONFIG_PHYDM_DFS_MASTER)
250 /* set dbg parameters for radar detection instead of the default value */
252 p_dm_odm->radar_detect_reg_918 = argv[2];
253 p_dm_odm->radar_detect_reg_91c = argv[3];
254 p_dm_odm->radar_detect_reg_920 = argv[4];
255 p_dm_odm->radar_detect_reg_924 = argv[5];
256 p_dm_odm->radar_detect_dbg_parm_en = 1;
258 PHYDM_SNPRINTF((output + used, out_len - used, "Radar detection with dbg parameter\n"));
259 PHYDM_SNPRINTF((output + used, out_len - used, "reg918:0x%08X\n", p_dm_odm->radar_detect_reg_918));
260 PHYDM_SNPRINTF((output + used, out_len - used, "reg91c:0x%08X\n", p_dm_odm->radar_detect_reg_91c));
261 PHYDM_SNPRINTF((output + used, out_len - used, "reg920:0x%08X\n", p_dm_odm->radar_detect_reg_920));
262 PHYDM_SNPRINTF((output + used, out_len - used, "reg924:0x%08X\n", p_dm_odm->radar_detect_reg_924));
264 p_dm_odm->radar_detect_dbg_parm_en = 0;
265 PHYDM_SNPRINTF((output + used, out_len - used, "Radar detection with default parameter\n"));
267 phydm_radar_detect_enable(p_dm_odm);
268 #endif /* defined(CONFIG_PHYDM_DFS_MASTER) */