1 /******************************************************************************
2 *
3 * Copyright(c) 2007 - 2017 Realtek Corporation.
4 *
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.
8 *
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
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26 /*@************************************************************
27 * include files
28 * ************************************************************
29 */
30
31 #include "mp_precomp.h"
32 #include "phydm_precomp.h"
33
halrf_basic_profile(void * dm_void,u32 * _used,char * output,u32 * _out_len)34 void halrf_basic_profile(void *dm_void, u32 *_used, char *output, u32 *_out_len)
35 {
36 #ifdef CONFIG_PHYDM_DEBUG_FUNCTION
37 struct dm_struct *dm = (struct dm_struct *)dm_void;
38 u32 used = *_used;
39 u32 out_len = *_out_len;
40 u32 rf_release_ver = 0;
41
42 switch (dm->support_ic_type) {
43 #if (RTL8814A_SUPPORT)
44 case ODM_RTL8814A:
45 rf_release_ver = RF_RELEASE_VERSION_8814A;
46 break;
47 #endif
48
49 #if (RTL8821C_SUPPORT)
50 case ODM_RTL8821C:
51 rf_release_ver = RF_RELEASE_VERSION_8821C;
52 break;
53 #endif
54
55 #if (RTL8822B_SUPPORT)
56 case ODM_RTL8822B:
57 rf_release_ver = RF_RELEASE_VERSION_8822B;
58 break;
59 #endif
60
61 #if (RTL8822C_SUPPORT)
62 case ODM_RTL8822C:
63 rf_release_ver = RF_RELEASE_VERSION_8822C;
64 break;
65 #endif
66
67 #if (RTL8814B_SUPPORT)
68 case ODM_RTL8814B:
69 rf_release_ver = RF_RELEASE_VERSION_8814B;
70 break;
71 #endif
72
73 #if (RTL8812F_SUPPORT)
74 case ODM_RTL8812F:
75 rf_release_ver = RF_RELEASE_VERSION_8812F;
76 break;
77 #endif
78
79 #if (RTL8198F_SUPPORT)
80 case ODM_RTL8198F:
81 rf_release_ver = RF_RELEASE_VERSION_8198F;
82 break;
83 #endif
84
85 #if (RTL8197F_SUPPORT)
86 case ODM_RTL8197F:
87 rf_release_ver = RF_RELEASE_VERSION_8197F;
88 break;
89 #endif
90
91 #if (RTL8192F_SUPPORT)
92 case ODM_RTL8192F:
93 rf_release_ver = RF_RELEASE_VERSION_8192F;
94 break;
95 #endif
96
97 #if (RTL8710B_SUPPORT)
98 case ODM_RTL8710B:
99 rf_release_ver = RF_RELEASE_VERSION_8710B;
100 break;
101 #endif
102
103 #if (RTL8195B_SUPPORT)
104 case ODM_RTL8195B:
105 rf_release_ver = RF_RELEASE_VERSION_8195B;
106 break;
107 #endif
108 }
109
110 PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %d\n",
111 "RF Para Release Ver", rf_release_ver);
112
113 /* HAL RF version List */
114 PDM_SNPF(out_len, used, output + used, out_len - used, "%-35s\n",
115 "% HAL RF version %");
116 PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",
117 "Power Tracking", HALRF_POWRTRACKING_VER);
118 PDM_SNPF(out_len, used, output + used, out_len - used,
119 " %-35s: %s %s\n", "IQK",
120 (dm->fw_offload_ability & PHYDM_RF_IQK_OFFLOAD) ? "FW" :
121 HALRF_IQK_VER,
122 (halrf_match_iqk_version(dm_void)) ? "(match)" : "(mismatch)");
123
124 PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",
125 "LCK", HALRF_LCK_VER);
126 PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",
127 "DPK", HALRF_DPK_VER);
128 PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",
129 "TSSI", HALRF_TSSI_VER);
130 PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",
131 "KFREE", HALRF_KFREE_VER);
132 PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",
133 "TX 2G Current Calibration", HALRF_PABIASK_VER);
134 PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",
135 "RFK Init. Parameter", HALRF_RFK_INIT_VER);
136
137 *_used = used;
138 *_out_len = out_len;
139 #endif
140 }
141
halrf_debug_trace(void * dm_void,char input[][16],u32 * _used,char * output,u32 * _out_len)142 void halrf_debug_trace(void *dm_void, char input[][16], u32 *_used,
143 char *output, u32 *_out_len)
144 {
145 struct dm_struct *dm = (struct dm_struct *)dm_void;
146 struct _hal_rf_ *rf = &dm->rf_table;
147 u32 one = 1;
148 u32 used = *_used;
149 u32 out_len = *_out_len;
150 u32 rf_var[10] = {0};
151 u8 i;
152
153 for (i = 0; i < 5; i++)
154 if (input[i + 1])
155 PHYDM_SSCANF(input[i + 2], DCMD_DECIMAL, &rf_var[i]);
156
157 if (rf_var[0] == 100) {
158 PDM_SNPF(out_len, used, output + used, out_len - used,
159 "\n[DBG MSG] RF Selection\n");
160 PDM_SNPF(out_len, used, output + used, out_len - used,
161 "00. (( %s ))TX_PWR_TRACK\n",
162 ((rf->rf_dbg_comp & DBG_RF_TX_PWR_TRACK) ? ("V") :
163 (".")));
164 PDM_SNPF(out_len, used, output + used, out_len - used,
165 "01. (( %s ))IQK\n",
166 ((rf->rf_dbg_comp & DBG_RF_IQK) ? ("V") : (".")));
167 PDM_SNPF(out_len, used, output + used, out_len - used,
168 "02. (( %s ))LCK\n",
169 ((rf->rf_dbg_comp & DBG_RF_LCK) ? ("V") : (".")));
170 PDM_SNPF(out_len, used, output + used, out_len - used,
171 "03. (( %s ))DPK\n",
172 ((rf->rf_dbg_comp & DBG_RF_DPK) ? ("V") : (".")));
173 PDM_SNPF(out_len, used, output + used, out_len - used,
174 "04. (( %s ))TXGAPK\n",
175 ((rf->rf_dbg_comp & DBG_RF_TXGAPK) ? ("V") : (".")));
176 PDM_SNPF(out_len, used, output + used, out_len - used,
177 "06. (( %s ))DPK_TRACK\n",
178 ((rf->rf_dbg_comp & DBG_RF_DPK_TRACK) ? ("V") : (".")));
179 PDM_SNPF(out_len, used, output + used, out_len - used,
180 "29. (( %s ))MP\n",
181 ((rf->rf_dbg_comp & DBG_RF_MP) ? ("V") : (".")));
182 PDM_SNPF(out_len, used, output + used, out_len - used,
183 "30. (( %s ))TMP\n",
184 ((rf->rf_dbg_comp & DBG_RF_TMP) ? ("V") : (".")));
185 PDM_SNPF(out_len, used, output + used, out_len - used,
186 "31. (( %s ))INIT\n",
187 ((rf->rf_dbg_comp & DBG_RF_INIT) ? ("V") : (".")));
188
189 } else if (rf_var[0] == 101) {
190 rf->rf_dbg_comp = 0;
191 PDM_SNPF(out_len, used, output + used, out_len - used,
192 "Disable all DBG COMP\n");
193 } else {
194 if (rf_var[1] == 1) /*enable*/
195 rf->rf_dbg_comp |= (one << rf_var[0]);
196 else if (rf_var[1] == 2) /*disable*/
197 rf->rf_dbg_comp &= ~(one << rf_var[0]);
198 }
199 PDM_SNPF(out_len, used, output + used, out_len - used,
200 "\nCurr-RF_Dbg_Comp = 0x%x\n", rf->rf_dbg_comp);
201
202 *_used = used;
203 *_out_len = out_len;
204 }
205
halrf_dack_debug_cmd(void * dm_void,char input[][16])206 void halrf_dack_debug_cmd(void *dm_void, char input[][16])
207 {
208 struct dm_struct *dm = (struct dm_struct *)dm_void;
209 struct _hal_rf_ *rf = &dm->rf_table;
210 u32 dm_value[10] = {0};
211 u8 i;
212
213 for (i = 0; i < 7; i++)
214 if (input[i + 1])
215 PHYDM_SSCANF(input[i + 2], DCMD_DECIMAL, &dm_value[i]);
216
217 if (dm_value[0] == 1)
218 halrf_dack_trigger(dm, true);
219 else
220 halrf_dack_trigger(dm, false);
221 }
222
223 struct halrf_command {
224 char name[16];
225 u8 id;
226 };
227
228 enum halrf_CMD_ID {
229 HALRF_HELP,
230 HALRF_SUPPORTABILITY,
231 HALRF_DBG_COMP,
232 HALRF_PROFILE,
233 HALRF_IQK_INFO,
234 HALRF_IQK,
235 HALRF_IQK_DEBUG,
236 HALRF_DPK,
237 HALRF_DACK,
238 HALRF_DACK_DEBUG,
239 HALRF_DUMP_RFK_REG,
240 #ifdef CONFIG_2G_BAND_SHIFT
241 HAL_BAND_SHIFT,
242 #endif
243 };
244
245 struct halrf_command halrf_cmd_ary[] = {
246 {"-h", HALRF_HELP},
247 {"ability", HALRF_SUPPORTABILITY},
248 {"dbg", HALRF_DBG_COMP},
249 {"profile", HALRF_PROFILE},
250 {"iqk_info", HALRF_IQK_INFO},
251 {"iqk", HALRF_IQK},
252 {"iqk_dbg", HALRF_IQK_DEBUG},
253 {"dpk", HALRF_DPK},
254 {"dack", HALRF_DACK},
255 {"dack_dbg", HALRF_DACK_DEBUG},
256 {"dump_rfk_reg", HALRF_DUMP_RFK_REG},
257 #ifdef CONFIG_2G_BAND_SHIFT
258 {"band_shift", HAL_BAND_SHIFT},
259 #endif
260 };
261
halrf_cmd_parser(void * dm_void,char input[][16],u32 * _used,char * output,u32 * _out_len,u32 input_num)262 void halrf_cmd_parser(void *dm_void, char input[][16], u32 *_used, char *output,
263 u32 *_out_len, u32 input_num)
264 {
265 struct dm_struct *dm = (struct dm_struct *)dm_void;
266 #ifdef CONFIG_PHYDM_DEBUG_FUNCTION
267 u8 id = 0;
268 u32 rf_var[10] = {0};
269 u32 i, input_idx = 0;
270 u32 halrf_ary_size =
271 sizeof(halrf_cmd_ary) / sizeof(struct halrf_command);
272 u32 used = *_used;
273 u32 out_len = *_out_len;
274
275 /* Parsing Cmd ID */
276 for (i = 0; i < halrf_ary_size; i++) {
277 if (strcmp(halrf_cmd_ary[i].name, input[1]) == 0) {
278 id = halrf_cmd_ary[i].id;
279 break;
280 }
281 }
282
283 if (i == halrf_ary_size) {
284 PDM_SNPF(out_len, used, output + used, out_len - used,
285 "RF Cmd not found\n");
286 return;
287 }
288
289 switch (id) {
290 case HALRF_HELP:
291 PDM_SNPF(out_len, used, output + used, out_len - used,
292 "RF cmd ==>\n");
293
294 for (i = 0; i < halrf_ary_size - 1; i++) {
295 PDM_SNPF(out_len, used, output + used, out_len - used,
296 " %-5d: %s\n", i, halrf_cmd_ary[i + 1].name);
297 }
298 break;
299 case HALRF_SUPPORTABILITY:
300 halrf_support_ability_debug(dm, &input[0], &used, output,
301 &out_len);
302 break;
303 #ifdef CONFIG_2G_BAND_SHIFT
304 case HAL_BAND_SHIFT:
305 halrf_support_band_shift_debug(dm, &input[0], &used, output,
306 &out_len);
307 break;
308 #endif
309 case HALRF_DBG_COMP:
310 halrf_debug_trace(dm, &input[0], &used, output, &out_len);
311 break;
312 case HALRF_PROFILE:
313 halrf_basic_profile(dm, &used, output, &out_len);
314 break;
315 case HALRF_IQK_INFO:
316 #if (RTL8822B_SUPPORT == 1 || RTL8821C_SUPPORT == 1)
317 halrf_iqk_info_dump(dm, &used, output, &out_len);
318 #endif
319 break;
320 case HALRF_IQK:
321 PDM_SNPF(out_len, used, output + used, out_len - used,
322 "TRX IQK Trigger\n");
323 halrf_iqk_trigger(dm, false);
324 #if (RTL8822B_SUPPORT == 1 || RTL8821C_SUPPORT == 1)
325 halrf_iqk_info_dump(dm, &used, output, &out_len);
326 #endif
327 break;
328 case HALRF_IQK_DEBUG:
329 PDM_SNPF(out_len, used, output + used, out_len - used,
330 "IQK DEBUG!!!!!\n");
331 for (i = 0; i < 5; i++) {
332 if (input[i + 1]) {
333 PHYDM_SSCANF(input[i + 2], DCMD_HEX,
334 &rf_var[i]);
335 input_idx++;
336 }
337 }
338
339 if (input_idx >= 1) {
340 #if (RTL8822B_SUPPORT == 1 || RTL8821C_SUPPORT == 1 || RTL8822C_SUPPORT == 1 || RTL8814B_SUPPORT == 1)
341 if (dm->support_ic_type & (ODM_RTL8822B | ODM_RTL8821C | ODM_RTL8822C | ODM_RTL8814B))
342 halrf_iqk_debug(dm, (u32 *)rf_var, &used,
343 output, &out_len);
344 #endif
345 }
346 break;
347 case HALRF_DPK:
348 halrf_dpk_debug_cmd(dm, input, &used, output, &out_len);
349 break;
350 case HALRF_DACK:
351 PDM_SNPF(out_len, used, output + used, out_len - used,
352 "DACK Trigger\n");
353 halrf_dack_debug_cmd(dm, &input[0]);
354 break;
355 case HALRF_DACK_DEBUG:
356 PDM_SNPF(out_len, used, output + used, out_len - used,
357 "DACK DEBUG\n");
358 halrf_dack_dbg(dm);
359 break;
360 case HALRF_DUMP_RFK_REG:
361 halrf_dump_rfk_reg(dm, input, &used, output, &out_len);
362 break;
363 default:
364 break;
365 }
366
367 *_used = used;
368 *_out_len = out_len;
369 #endif
370 }
371
halrf_init_debug_setting(void * dm_void)372 void halrf_init_debug_setting(void *dm_void)
373 {
374 struct dm_struct *dm = (struct dm_struct *)dm_void;
375 struct _hal_rf_ *rf = &dm->rf_table;
376
377 rf->rf_dbg_comp =
378
379 DBG_RF_RFK |
380 #if DBG
381 #if 1
382 /*DBG_RF_TX_PWR_TRACK | */
383 /*DBG_RF_IQK | */
384 /*DBG_RF_LCK | */
385 /*DBG_RF_DPK | */
386 /*DBG_RF_TXGAPK | */
387 /*DBG_RF_DACK | */
388 /*DBG_RF_DPK_TRACK | */
389 /*DBG_RF_MP | */
390 /*DBG_RF_TMP | */
391 /*DBG_RF_INIT | */
392 #endif
393 #endif
394 0;
395 }
396