net: wireless: rockchip_wlan: add rtl8723ds support
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723ds / hal / phydm / phydm_debug.c
1 /******************************************************************************\r
2  *\r
3  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
4  *\r
5  * This program is free software; you can redistribute it and/or modify it\r
6  * under the terms of version 2 of the GNU General Public License as\r
7  * published by the Free Software Foundation.\r
8  *\r
9  * This program is distributed in the hope that it will be useful, but WITHOUT\r
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
12  * more details.\r
13  *\r
14  * You should have received a copy of the GNU General Public License along with\r
15  * this program; if not, write to the Free Software Foundation, Inc.,\r
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
17  *\r
18  *\r
19  ******************************************************************************/\r
20 \r
21 //============================================================\r
22 // include files\r
23 //============================================================\r
24 \r
25 #include "mp_precomp.h"\r
26 #include "phydm_precomp.h"\r
27 \r
28 VOID\r
29 PHYDM_InitDebugSetting(\r
30         IN              PDM_ODM_T               pDM_Odm\r
31 )\r
32 {\r
33         pDM_Odm->DebugLevel = ODM_DBG_TRACE;\r
34         \r
35         pDM_Odm->fw_DebugComponents = 0;\r
36         pDM_Odm->DebugComponents                        =\r
37                 \\r
38 #if DBG\r
39 /*BB Functions*/\r
40 /*                                                                      ODM_COMP_DIG                                    |*/\r
41 /*                                                                      ODM_COMP_RA_MASK                                |*/\r
42 /*                                                                      ODM_COMP_DYNAMIC_TXPWR                  |*/\r
43 /*                                                                      ODM_COMP_FA_CNT                         |*/\r
44 /*                                                                      ODM_COMP_RSSI_MONITOR                   |*/\r
45 /*                                                                      ODM_COMP_SNIFFER                                |*/\r
46 /*                                                                      ODM_COMP_ANT_DIV                                |*/\r
47 /*                                                                      ODM_COMP_NOISY_DETECT                   |*/\r
48 /*                                                                      ODM_COMP_RATE_ADAPTIVE                  |*/\r
49 /*                                                                      ODM_COMP_PATH_DIV                               |*/\r
50 /*                                                                      ODM_COMP_DYNAMIC_PRICCA         |*/\r
51 /*                                                                      ODM_COMP_MP                                     |*/\r
52 /*                                                                      ODM_COMP_CFO_TRACKING                   |*/\r
53 /*                                                                      ODM_COMP_ACS                                    |*/\r
54 /*                                                                      PHYDM_COMP_ADAPTIVITY                   |*/\r
55 /*                                                                      PHYDM_COMP_RA_DBG                               |*/\r
56 /*                                                                      PHYDM_COMP_TXBF                                 |*/\r
57 \r
58 /*MAC Functions*/\r
59 /*                                                                      ODM_COMP_EDCA_TURBO                     |*/\r
60 /*                                                                      ODM_FW_DEBUG_TRACE                              |*/\r
61 \r
62 /*RF Functions*/\r
63 /*                                                                      ODM_COMP_TX_PWR_TRACK                   |*/\r
64 /*                                                                      ODM_COMP_CALIBRATION                    |*/\r
65 \r
66 /*Common*/\r
67 /*                                                                      ODM_PHY_CONFIG                                  |*/\r
68 /*                                                                      ODM_COMP_INIT                                   |*/\r
69 /*                                                                      ODM_COMP_COMMON                         |*/\r
70 /*                                                                      ODM_COMP_API                            |*/\r
71 \r
72 \r
73 #endif\r
74                 0;\r
75 \r
76         pDM_Odm->fw_buff_is_enpty = TRUE;\r
77         pDM_Odm->pre_c2h_seq = 0;\r
78 }\r
79 \r
80 VOID\r
81 phydm_BB_RxHang_Info(\r
82         IN              PVOID                   pDM_VOID,\r
83         IN              u4Byte                  *_used,\r
84         OUT             char                            *output,\r
85         IN              u4Byte                  *_out_len\r
86 )\r
87 {\r
88         u4Byte  value32 = 0;\r
89         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
90         u4Byte used = *_used;\r
91         u4Byte out_len = *_out_len;\r
92 \r
93         if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\r
94                 return;\r
95 \r
96         value32 = ODM_GetBBReg(pDM_Odm, 0xF80 , bMaskDWord);\r
97         PHYDM_SNPRINTF((output + used, out_len - used,  "\r\n %-35s = 0x%x", "rptreg of sc/bw/ht/...", value32));\r
98 \r
99         if (pDM_Odm->SupportICType & ODM_RTL8822B)\r
100                 ODM_SetBBReg(pDM_Odm, 0x198c , BIT2|BIT1|BIT0, 7);\r
101 \r
102         /* dbg_port = basic state machine */\r
103         {\r
104                 ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0x000);\r
105                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\r
106                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "0x8fc", value32));\r
107 \r
108                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\r
109                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "basic state machine", value32));\r
110         }\r
111 \r
112         /* dbg_port = state machine */\r
113         {\r
114                 ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0x007);\r
115                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\r
116                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "0x8fc", value32));\r
117 \r
118                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\r
119                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "state machine", value32));\r
120         }\r
121 \r
122         /* dbg_port = CCA-related*/\r
123         {\r
124                 ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0x204);\r
125                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\r
126                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "0x8fc", value32));\r
127 \r
128                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\r
129                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "CCA-related", value32));\r
130         }\r
131 \r
132 \r
133         /* dbg_port = edcca/rxd*/\r
134         {\r
135                 ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0x278);\r
136                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\r
137                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "0x8fc", value32));\r
138 \r
139                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\r
140                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "edcca/rxd", value32));\r
141         }\r
142 \r
143         /* dbg_port = rx_state/mux_state/ADC_MASK_OFDM*/\r
144         {\r
145                 ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0x290);\r
146                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\r
147                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "0x8fc", value32));\r
148 \r
149                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\r
150                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "rx_state/mux_state/ADC_MASK_OFDM", value32));\r
151         }\r
152 \r
153         /* dbg_port = bf-related*/\r
154         {\r
155                 ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0x2B2);\r
156                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\r
157                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "0x8fc", value32));\r
158 \r
159                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\r
160                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "bf-related", value32));\r
161         }\r
162 \r
163         /* dbg_port = bf-related*/\r
164         {\r
165                 ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0x2B8);\r
166                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\r
167                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "0x8fc", value32));\r
168 \r
169                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\r
170                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "bf-related", value32));\r
171         }\r
172 \r
173         /* dbg_port = txon/rxd*/\r
174         {\r
175                 ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0xA03);\r
176                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\r
177                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "0x8fc", value32));\r
178 \r
179                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\r
180                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "txon/rxd", value32));\r
181         }\r
182 \r
183         /* dbg_port = l_rate/l_length*/\r
184         {\r
185                 ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0xA0B);\r
186                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\r
187                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "0x8fc", value32));\r
188 \r
189                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\r
190                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "l_rate/l_length", value32));\r
191         }\r
192 \r
193         /* dbg_port = rxd/rxd_hit*/\r
194         {\r
195                 ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0xA0D);\r
196                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\r
197                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "0x8fc", value32));\r
198 \r
199                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\r
200                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "rxd/rxd_hit", value32));\r
201         }\r
202 \r
203         /* dbg_port = dis_cca*/\r
204         {\r
205                 ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0xAA0);\r
206                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\r
207                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "0x8fc", value32));\r
208 \r
209                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\r
210                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "dis_cca", value32));\r
211         }\r
212 \r
213 \r
214         /* dbg_port = tx*/\r
215         {\r
216                 ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0xAB0);\r
217                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\r
218                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "0x8fc", value32));\r
219 \r
220                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\r
221                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "tx", value32));\r
222         }\r
223 \r
224         /* dbg_port = rx plcp*/\r
225         {\r
226                 ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0xAD0);\r
227                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\r
228                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "0x8fc", value32));\r
229 \r
230                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\r
231                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "rx plcp", value32));\r
232 \r
233                 ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0xAD1);\r
234                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\r
235                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "0x8fc", value32));\r
236 \r
237                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\r
238                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "rx plcp", value32));\r
239 \r
240                 ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0xAD2);\r
241                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\r
242                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "0x8fc", value32));\r
243 \r
244                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\r
245                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "rx plcp", value32));\r
246 \r
247                 ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord, 0xAD3);\r
248                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC , bMaskDWord);\r
249                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "0x8fc", value32));\r
250 \r
251                 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC , bMaskDWord);\r
252                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = 0x%x", "rx plcp", value32));\r
253         }\r
254 \r
255 }\r
256 \r
257 VOID\r
258 phydm_BB_Debug_Info(\r
259         IN              PVOID                   pDM_VOID,\r
260         IN              u4Byte                  *_used,\r
261         OUT             char                            *output,\r
262         IN              u4Byte                  *_out_len\r
263 )\r
264 {\r
265         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
266         u4Byte used = *_used;\r
267         u4Byte out_len = *_out_len;\r
268         \r
269         char *tmp_string = NULL;\r
270 \r
271         u1Byte  RX_HT_BW, RX_VHT_BW, RXSC, RX_HT, RX_BW;\r
272         static u1Byte vRX_BW ;\r
273         u4Byte  value32, value32_1, value32_2, value32_3;\r
274         s4Byte  SFO_A, SFO_B, SFO_C, SFO_D;\r
275         s4Byte  LFO_A, LFO_B, LFO_C, LFO_D;\r
276         static u1Byte   MCSS, Tail, Parity, rsv, vrsv, idx, smooth, htsound, agg, stbc, vstbc, fec, fecext, sgi, sgiext, htltf, vgid, vNsts, vtxops, vrsv2, vbrsv, bf, vbcrc;\r
277         static u2Byte   HLength, htcrc8, Length;\r
278         static u2Byte vpaid;\r
279         static u2Byte   vLength, vhtcrc8, vMCSS, vTail, vbTail;\r
280         static u1Byte   HMCSS, HRX_BW;\r
281 \r
282         u1Byte    pwDB;\r
283         s1Byte    RXEVM_0, RXEVM_1, RXEVM_2 ;\r
284         u1Byte    RF_gain_pathA, RF_gain_pathB, RF_gain_pathC, RF_gain_pathD;\r
285         u1Byte    RX_SNR_pathA, RX_SNR_pathB, RX_SNR_pathC, RX_SNR_pathD;\r
286         s4Byte    sig_power;\r
287 \r
288         const char *L_rate[8] = {"6M", "9M", "12M", "18M", "24M", "36M", "48M", "54M"};\r
289 \r
290         /*\r
291         const double evm_comp_20M = 0.579919469776867; //10*log10(64.0/56.0)\r
292         const double evm_comp_40M = 0.503051183113957; //10*log10(128.0/114.0)\r
293         const double evm_comp_80M = 0.244245993314183; //10*log10(256.0/242.0)\r
294         const double evm_comp_160M = 0.244245993314183; //10*log10(512.0/484.0)\r
295            */\r
296 \r
297         if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\r
298                 return;\r
299 \r
300         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s\n", "BB Report Info"));\r
301 \r
302         /*BW & Mode Detection*/\r
303         \r
304         value32 = ODM_GetBBReg(pDM_Odm, 0xf80 , bMaskDWord);\r
305         value32_2 = value32;\r
306         RX_HT_BW = (u1Byte)(value32 & 0x1);\r
307         RX_VHT_BW = (u1Byte)((value32 >> 1) & 0x3);\r
308         RXSC = (u1Byte)(value32 & 0x78);\r
309         value32_1 = (value32 & 0x180) >> 7;\r
310         RX_HT = (u1Byte)(value32_1);\r
311 \r
312         RX_BW = 0;\r
313 \r
314         if (RX_HT == 2) {\r
315                 if (RX_VHT_BW == 0) {\r
316                         tmp_string = "20M";\r
317                 } else if (RX_VHT_BW == 1) {\r
318                         tmp_string = "40M";\r
319                 } else {\r
320                         tmp_string = "80M";\r
321                 }\r
322                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s %s %s", "Mode", "VHT", tmp_string));\r
323                 RX_BW = RX_VHT_BW;\r
324         } else if (RX_HT == 1) {\r
325                 if (RX_HT_BW == 0) {\r
326                         tmp_string = "20M";\r
327                 } else if (RX_HT_BW == 1) {\r
328                         tmp_string = "40M";\r
329                 }\r
330                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s %s %s", "Mode", "HT", tmp_string));\r
331                 RX_BW = RX_HT_BW;\r
332         } else {\r
333                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s %s", "Mode", "Legacy"));\r
334         }\r
335 \r
336         if (RX_HT != 0) {\r
337                 if (RXSC == 0)\r
338                         tmp_string = "duplicate/full bw";\r
339                 else if (RXSC == 1)\r
340                         tmp_string = "usc20-1";\r
341                 else if (RXSC == 2)\r
342                         tmp_string = "lsc20-1";\r
343                 else if (RXSC == 3)\r
344                         tmp_string = "usc20-2";\r
345                 else if (RXSC == 4)\r
346                         tmp_string = "lsc20-2";\r
347                 else if (RXSC == 9)\r
348                         tmp_string = "usc40";\r
349                 else if (RXSC == 10)\r
350                         tmp_string = "lsc40";\r
351                 PHYDM_SNPRINTF((output + used, out_len - used, "  %-35s", tmp_string));\r
352         }\r
353 \r
354         /* RX signal power and AGC related info*/\r
355 \r
356         value32 = ODM_GetBBReg(pDM_Odm, 0xF90 , bMaskDWord);\r
357         pwDB = (u1Byte)((value32 & bMaskByte1) >> 8);\r
358         pwDB = pwDB >> 1;\r
359         sig_power = -110 + pwDB;\r
360         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = %d", "OFDM RX Signal Power(dB)", sig_power));\r
361 \r
362         value32 = ODM_GetBBReg(pDM_Odm, 0xd14 , bMaskDWord);\r
363         RX_SNR_pathA = (u1Byte)(value32 & 0xFF) >> 1;\r
364         RF_gain_pathA = (s1Byte)((value32 & bMaskByte1) >> 8);\r
365         RF_gain_pathA *= 2;\r
366         value32 = ODM_GetBBReg(pDM_Odm, 0xd54 , bMaskDWord);\r
367         RX_SNR_pathB = (u1Byte)(value32 & 0xFF) >> 1;\r
368         RF_gain_pathB = (s1Byte)((value32 & bMaskByte1) >> 8);\r
369         RF_gain_pathB *= 2;\r
370         value32 = ODM_GetBBReg(pDM_Odm, 0xd94 , bMaskDWord);\r
371         RX_SNR_pathC = (u1Byte)(value32 & 0xFF) >> 1;\r
372         RF_gain_pathC = (s1Byte)((value32 & bMaskByte1) >> 8);\r
373         RF_gain_pathC *= 2;\r
374         value32 = ODM_GetBBReg(pDM_Odm, 0xdd4 , bMaskDWord);\r
375         RX_SNR_pathD = (u1Byte)(value32 & 0xFF) >> 1;\r
376         RF_gain_pathD = (s1Byte)((value32 & bMaskByte1) >> 8);\r
377         RF_gain_pathD *= 2;\r
378 \r
379         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = %d / %d / %d / %d", "OFDM RX RF Gain(A/B/C/D)", RF_gain_pathA, RF_gain_pathB, RF_gain_pathC, RF_gain_pathD));\r
380 \r
381 \r
382         /* RX Counter related info*/\r
383 \r
384         value32 = ODM_GetBBReg(pDM_Odm, 0xF08, bMaskDWord);\r
385         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = %d", "OFDM CCA Counter", ((value32&0xFFFF0000)>>16)));\r
386         \r
387         value32 = ODM_GetBBReg(pDM_Odm, 0xFD0, bMaskDWord);\r
388         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = %d", "OFDM SBD Fail Counter", value32&0xFFFF));\r
389 \r
390         value32 = ODM_GetBBReg(pDM_Odm, 0xFC4, bMaskDWord);\r
391         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = %d / %d", "VHT SIGA/SIGB CRC8 Fail Counter", value32&0xFFFF, ((value32&0xFFFF0000)>>16)));\r
392 \r
393         value32 = ODM_GetBBReg(pDM_Odm, 0xFCC, bMaskDWord);\r
394         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = %d", "CCK CCA Counter", value32&0xFFFF));\r
395 \r
396         value32 = ODM_GetBBReg(pDM_Odm, 0xFBC, bMaskDWord);\r
397         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = %d / %d", "LSIG (Parity Fail/Rate Illegal) Counter", value32&0xFFFF, ((value32&0xFFFF0000)>>16)));\r
398 \r
399         value32_1 = ODM_GetBBReg(pDM_Odm, 0xFC8, bMaskDWord);\r
400         value32_2 = ODM_GetBBReg(pDM_Odm, 0xFC0, bMaskDWord);\r
401         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = %d / %d", "HT/VHT MCS NOT SUPPORT counter", ((value32_2&0xFFFF0000)>>16), value32_1&0xFFFF));\r
402 \r
403         /* PostFFT related info*/\r
404         value32 = ODM_GetBBReg(pDM_Odm, 0xF8c , bMaskDWord);\r
405         RXEVM_0 = (s1Byte)((value32 & bMaskByte2) >> 16);\r
406         RXEVM_0 /= 2;\r
407         if (RXEVM_0 < -63)\r
408                 RXEVM_0 = 0;\r
409 \r
410         RXEVM_1 = (s1Byte)((value32 & bMaskByte3) >> 24);\r
411         RXEVM_1 /= 2;\r
412         value32 = ODM_GetBBReg(pDM_Odm, 0xF88 , bMaskDWord);\r
413         RXEVM_2 = (s1Byte)((value32 & bMaskByte2) >> 16);\r
414         RXEVM_2 /= 2;\r
415 \r
416         if (RXEVM_1 < -63)\r
417                 RXEVM_1 = 0;\r
418         if (RXEVM_2 < -63)\r
419                 RXEVM_2 = 0;\r
420 \r
421         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = %d / %d / %d", "RXEVM (1ss/2ss/3ss)", RXEVM_0, RXEVM_1, RXEVM_2));\r
422         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = %d / %d / %d / %d", "RXSNR(A/B/C/D, dB)", RX_SNR_pathA, RX_SNR_pathB, RX_SNR_pathC, RX_SNR_pathD));\r
423 \r
424         value32 = ODM_GetBBReg(pDM_Odm, 0xF8C , bMaskDWord);\r
425         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = %d / %d", "CSI_1st /CSI_2nd", value32&0xFFFF, ((value32&0xFFFF0000)>>16)));\r
426 \r
427         /*BW & Mode Detection*/\r
428 \r
429         /*Reset Page F Counter*/\r
430         ODM_SetBBReg(pDM_Odm, 0xB58 , BIT0, 1);\r
431         ODM_SetBBReg(pDM_Odm, 0xB58 , BIT0, 0);\r
432 \r
433         /*CFO Report Info*/\r
434         /*Short CFO*/\r
435         value32 = ODM_GetBBReg(pDM_Odm, 0xd0c , bMaskDWord);\r
436         value32_1 = ODM_GetBBReg(pDM_Odm, 0xd4c , bMaskDWord);\r
437         value32_2 = ODM_GetBBReg(pDM_Odm, 0xd8c , bMaskDWord);\r
438         value32_3 = ODM_GetBBReg(pDM_Odm, 0xdcc , bMaskDWord);\r
439 \r
440         SFO_A = (s4Byte)(value32 & 0xfff);\r
441         SFO_B = (s4Byte)(value32_1 & 0xfff);\r
442         SFO_C = (s4Byte)(value32_2 & 0xfff);\r
443         SFO_D = (s4Byte)(value32_3 & 0xfff);\r
444 \r
445         LFO_A = (s4Byte)(value32 >> 16);\r
446         LFO_B = (s4Byte)(value32_1 >> 16);\r
447         LFO_C = (s4Byte)(value32_2 >> 16);\r
448         LFO_D = (s4Byte)(value32_3 >> 16);\r
449 \r
450         /*SFO 2's to dec*/\r
451         if (SFO_A > 2047)\r
452                 SFO_A = SFO_A - 4096;\r
453         SFO_A = (SFO_A * 312500) / 2048;\r
454         if (SFO_B > 2047)\r
455                 SFO_B = SFO_B - 4096;\r
456         SFO_B = (SFO_B * 312500) / 2048;\r
457         if (SFO_C > 2047)\r
458                 SFO_C = SFO_C - 4096;\r
459         SFO_C = (SFO_C * 312500) / 2048;\r
460         if (SFO_D > 2047)\r
461                 SFO_D = SFO_D - 4096;\r
462         SFO_D = (SFO_D * 312500) / 2048;\r
463 \r
464         /*LFO 2's to dec*/\r
465 \r
466         if (LFO_A > 4095)\r
467                 LFO_A = LFO_A - 8192;\r
468 \r
469         if (LFO_B > 4095)\r
470                 LFO_B = LFO_B - 8192;\r
471 \r
472         if (LFO_C > 4095)\r
473                 LFO_C = LFO_C - 8192;\r
474 \r
475         if (LFO_D > 4095)\r
476                 LFO_D = LFO_D - 8192;\r
477         LFO_A = LFO_A * 312500 / 4096;\r
478         LFO_B = LFO_B * 312500 / 4096;\r
479         LFO_C = LFO_C * 312500 / 4096;\r
480         LFO_D = LFO_D * 312500 / 4096;\r
481         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s", "CFO Report Info"));\r
482         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = %d / %d / %d /%d", "Short CFO(Hz) <A/B/C/D>", SFO_A, SFO_B, SFO_C, SFO_D));\r
483         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = %d / %d / %d /%d", "Long CFO(Hz) <A/B/C/D>", LFO_A, LFO_B, LFO_C, LFO_D));\r
484 \r
485         /*SCFO*/\r
486         value32 = ODM_GetBBReg(pDM_Odm, 0xd10 , bMaskDWord);\r
487         value32_1 = ODM_GetBBReg(pDM_Odm, 0xd50 , bMaskDWord);\r
488         value32_2 = ODM_GetBBReg(pDM_Odm, 0xd90 , bMaskDWord);\r
489         value32_3 = ODM_GetBBReg(pDM_Odm, 0xdd0 , bMaskDWord);\r
490 \r
491         SFO_A = (s4Byte)(value32 & 0x7ff);\r
492         SFO_B = (s4Byte)(value32_1 & 0x7ff);\r
493         SFO_C = (s4Byte)(value32_2 & 0x7ff);\r
494         SFO_D = (s4Byte)(value32_3 & 0x7ff);\r
495 \r
496         if (SFO_A > 1023)\r
497                 SFO_A = SFO_A - 2048;\r
498 \r
499         if (SFO_B > 2047)\r
500                 SFO_B = SFO_B - 4096;\r
501 \r
502         if (SFO_C > 2047)\r
503                 SFO_C = SFO_C - 4096;\r
504 \r
505         if (SFO_D > 2047)\r
506                 SFO_D = SFO_D - 4096;\r
507 \r
508         SFO_A = SFO_A * 312500 / 1024;\r
509         SFO_B = SFO_B * 312500 / 1024;\r
510         SFO_C = SFO_C * 312500 / 1024;\r
511         SFO_D = SFO_D * 312500 / 1024;\r
512 \r
513         LFO_A = (s4Byte)(value32 >> 16);\r
514         LFO_B = (s4Byte)(value32_1 >> 16);\r
515         LFO_C = (s4Byte)(value32_2 >> 16);\r
516         LFO_D = (s4Byte)(value32_3 >> 16);\r
517 \r
518         if (LFO_A > 4095)\r
519                 LFO_A = LFO_A - 8192;\r
520 \r
521         if (LFO_B > 4095)\r
522                 LFO_B = LFO_B - 8192;\r
523 \r
524         if (LFO_C > 4095)\r
525                 LFO_C = LFO_C - 8192;\r
526 \r
527         if (LFO_D > 4095)\r
528                 LFO_D = LFO_D - 8192;\r
529         LFO_A = LFO_A * 312500 / 4096;\r
530         LFO_B = LFO_B * 312500 / 4096;\r
531         LFO_C = LFO_C * 312500 / 4096;\r
532         LFO_D = LFO_D * 312500 / 4096;\r
533         \r
534         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = %d / %d / %d /%d", "Value SCFO(Hz) <A/B/C/D>", SFO_A, SFO_B, SFO_C, SFO_D));\r
535         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = %d / %d / %d /%d", "ACQ CFO(Hz) <A/B/C/D>", LFO_A, LFO_B, LFO_C, LFO_D));\r
536 \r
537         value32 = ODM_GetBBReg(pDM_Odm, 0xd14 , bMaskDWord);\r
538         value32_1 = ODM_GetBBReg(pDM_Odm, 0xd54 , bMaskDWord);\r
539         value32_2 = ODM_GetBBReg(pDM_Odm, 0xd94 , bMaskDWord);\r
540         value32_3 = ODM_GetBBReg(pDM_Odm, 0xdd4 , bMaskDWord);\r
541 \r
542         LFO_A = (s4Byte)(value32 >> 16);\r
543         LFO_B = (s4Byte)(value32_1 >> 16);\r
544         LFO_C = (s4Byte)(value32_2 >> 16);\r
545         LFO_D = (s4Byte)(value32_3 >> 16);\r
546 \r
547         if (LFO_A > 4095)\r
548                 LFO_A = LFO_A - 8192;\r
549 \r
550         if (LFO_B > 4095)\r
551                 LFO_B = LFO_B - 8192;\r
552 \r
553         if (LFO_C > 4095)\r
554                 LFO_C = LFO_C - 8192;\r
555 \r
556         if (LFO_D > 4095)\r
557                 LFO_D = LFO_D - 8192;\r
558 \r
559         LFO_A = LFO_A * 312500 / 4096;\r
560         LFO_B = LFO_B * 312500 / 4096;\r
561         LFO_C = LFO_C * 312500 / 4096;\r
562         LFO_D = LFO_D * 312500 / 4096;\r
563 \r
564         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = %d / %d / %d /%d", "End CFO(Hz) <A/B/C/D>", LFO_A, LFO_B, LFO_C, LFO_D));\r
565 \r
566         value32 = ODM_GetBBReg(pDM_Odm, 0xf20 , bMaskDWord);  /*L SIG*/\r
567 \r
568         Tail = (u1Byte)((value32 & 0xfc0000) >> 16);\r
569         Parity = (u1Byte)((value32 & 0x20000) >> 16);\r
570         Length = (u2Byte)((value32 & 0x1ffe00) >> 8);\r
571         rsv = (u1Byte)(value32 & 0x10);\r
572         MCSS = (u1Byte)(value32 & 0x0f);\r
573 \r
574         switch (MCSS) {\r
575         case 0x0b:\r
576                 idx = 0;\r
577                 break;\r
578         case 0x0f:\r
579                 idx = 1;\r
580                 break;\r
581         case 0x0a:\r
582                 idx = 2;\r
583                 break;\r
584         case 0x0e:\r
585                 idx = 3;\r
586                 break;\r
587         case 0x09:\r
588                 idx = 4;\r
589                 break;\r
590         case 0x08:\r
591                 idx = 5;\r
592                 break;\r
593         case 0x0c:\r
594                 idx = 6;\r
595                 break;\r
596         default:\r
597                 idx = 6;\r
598                 break;\r
599 \r
600         }\r
601 \r
602         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s", "L-SIG"));\r
603         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s : %s", "Rate", L_rate[idx]));\r
604         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = %x / %x / %x", "Rsv/Length/Parity", rsv, RX_BW, Length));\r
605 \r
606         value32 = ODM_GetBBReg(pDM_Odm, 0xf2c , bMaskDWord);  /*HT SIG*/\r
607         if (RX_HT == 1) {\r
608 \r
609                 HMCSS = (u1Byte)(value32 & 0x7F);\r
610                 HRX_BW = (u1Byte)(value32 & 0x80);\r
611                 HLength = (u2Byte)((value32 >> 8) & 0xffff);\r
612         }\r
613         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s", "HT-SIG1"));\r
614         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = %x / %x / %x", "MCS/BW/Length", HMCSS, HRX_BW, HLength));\r
615 \r
616         value32 = ODM_GetBBReg(pDM_Odm, 0xf30 , bMaskDWord);  /*HT SIG*/\r
617 \r
618         if (RX_HT == 1) {\r
619                 smooth = (u1Byte)(value32 & 0x01);\r
620                 htsound = (u1Byte)(value32 & 0x02);\r
621                 rsv = (u1Byte)(value32 & 0x04);\r
622                 agg = (u1Byte)(value32 & 0x08);\r
623                 stbc = (u1Byte)(value32 & 0x30);\r
624                 fec = (u1Byte)(value32 & 0x40);\r
625                 sgi = (u1Byte)(value32 & 0x80);\r
626                 htltf = (u1Byte)((value32 & 0x300) >> 8);\r
627                 htcrc8 = (u2Byte)((value32 & 0x3fc00) >> 8);\r
628                 Tail = (u1Byte)((value32 & 0xfc0000) >> 16);\r
629         }\r
630         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s", "HT-SIG2"));\r
631         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = %x / %x / %x / %x / %x / %x", "Smooth/NoSound/Rsv/Aggregate/STBC/LDPC", smooth, htsound, rsv, agg, stbc, fec));\r
632         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = %x / %x / %x / %x", "SGI/E-HT-LTFs/CRC/Tail", sgi, htltf, htcrc8, Tail));\r
633 \r
634         value32 = ODM_GetBBReg(pDM_Odm, 0xf2c , bMaskDWord);  /*VHT SIG A1*/\r
635         if (RX_HT == 2) {\r
636                 /* value32 = ODM_GetBBReg(pDM_Odm, 0xf2c ,bMaskDWord);*/\r
637                 vRX_BW = (u1Byte)(value32 & 0x03);\r
638                 vrsv = (u1Byte)(value32 & 0x04);\r
639                 vstbc = (u1Byte)(value32 & 0x08);\r
640                 vgid = (u1Byte)((value32 & 0x3f0) >> 4);\r
641                 vNsts = (u1Byte)(((value32 & 0x1c00) >> 8) + 1);\r
642                 vpaid = (u2Byte)(value32 & 0x3fe);\r
643                 vtxops = (u1Byte)((value32 & 0x400000) >> 20);\r
644                 vrsv2 = (u1Byte)((value32 & 0x800000) >> 20);\r
645         }\r
646         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s", "VHT-SIG-A1"));\r
647         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = %x / %x / %x / %x / %x / %x / %x / %x", "BW/Rsv1/STBC/GID/Nsts/PAID/TXOPPS/Rsv2", vRX_BW, vrsv, vstbc, vgid, vNsts, vpaid, vtxops, vrsv2));\r
648 \r
649         value32 = ODM_GetBBReg(pDM_Odm, 0xf30 , bMaskDWord);  /*VHT SIG*/\r
650 \r
651         if (RX_HT == 2) {\r
652                 /*value32 = ODM_GetBBReg(pDM_Odm, 0xf30 ,bMaskDWord); */  /*VHT SIG*/\r
653 \r
654                 //sgi=(u1Byte)(value32&0x01);\r
655                 sgiext = (u1Byte)(value32 & 0x03);\r
656                 //fec = (u1Byte)(value32&0x04);\r
657                 fecext = (u1Byte)(value32 & 0x0C);\r
658 \r
659                 vMCSS = (u1Byte)(value32 & 0xf0);\r
660                 bf = (u1Byte)((value32 & 0x100) >> 8);\r
661                 vrsv = (u1Byte)((value32 & 0x200) >> 8);\r
662                 vhtcrc8 = (u2Byte)((value32 & 0x3fc00) >> 8);\r
663                 vTail = (u1Byte)((value32 & 0xfc0000) >> 16);\r
664         }\r
665         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s", "VHT-SIG-A2"));\r
666         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = %x / %x / %x / %x / %x / %x / %x", "SGI/FEC/MCS/BF/Rsv/CRC/Tail", sgiext, fecext, vMCSS, bf, vrsv, vhtcrc8, vTail));\r
667         \r
668         value32 = ODM_GetBBReg(pDM_Odm, 0xf34 , bMaskDWord);  /*VHT SIG*/\r
669         {\r
670                 vLength = (u2Byte)(value32 & 0x1fffff);\r
671                 vbrsv = (u1Byte)((value32 & 0x600000) >> 20);\r
672                 vbTail = (u2Byte)((value32 & 0x1f800000) >> 20);\r
673                 vbcrc = (u1Byte)((value32 & 0x80000000) >> 28);\r
674 \r
675         }\r
676         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s", "VHT-SIG-B"));\r
677         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = %x / %x / %x / %x", "Length/Rsv/Tail/CRC", vLength, vbrsv, vbTail, vbcrc));\r
678 \r
679         /*for Condition number*/\r
680         if (pDM_Odm->SupportICType & ODM_RTL8822B) {\r
681                 s4Byte  condition_num = 0;\r
682                 char *factor = NULL;\r
683                 \r
684                 ODM_SetBBReg(pDM_Odm, 0x1988 , BIT22, 0x1);     /*enable report condition number*/\r
685 \r
686                 condition_num = ODM_GetBBReg(pDM_Odm, 0xf84, bMaskDWord);\r
687                 condition_num = (condition_num & 0x3ffff) >> 4;\r
688 \r
689                 if (*pDM_Odm->pBandWidth == ODM_BW80M)\r
690                         factor = "256/234";\r
691                 else if (*pDM_Odm->pBandWidth == ODM_BW40M)\r
692                         factor = "128/108";\r
693                 else if (*pDM_Odm->pBandWidth == ODM_BW20M) {\r
694                         if (RX_HT != 2 || RX_HT != 1)\r
695                                 factor = "64/52";       /*HT or VHT*/\r
696                         else\r
697                                 factor = "64/48";       /*legacy*/\r
698                 }\r
699 \r
700                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = %d (factor = %s)", "Condition Number", condition_num, factor));\r
701 \r
702         }\r
703 \r
704 }\r
705 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
706 void phydm_sbd_check(\r
707         IN      PDM_ODM_T                                       pDM_Odm\r
708 )\r
709 {\r
710         static u4Byte   pkt_cnt = 0;\r
711         static BOOLEAN sbd_state = 0;\r
712         u4Byte  sym_count, count, value32;\r
713 \r
714         if (sbd_state == 0) {\r
715                 pkt_cnt++;\r
716                 if (pkt_cnt % 5 == 0) { /*read SBD conter once every 5 packets*/\r
717                         ODM_SetTimer(pDM_Odm, &pDM_Odm->sbdcnt_timer, 0); /*ms*/\r
718                         sbd_state = 1;\r
719                 }\r
720         } else { /*read counter*/\r
721                 value32 = ODM_GetBBReg(pDM_Odm, 0xF98, bMaskDWord);\r
722                 sym_count = (value32 & 0x7C000000) >> 26;\r
723                 count = (value32 & 0x3F00000) >> 20;\r
724                 DbgPrint("#SBD#    sym_count   %d   count   %d\n", sym_count, count);\r
725                 sbd_state = 0;\r
726         }\r
727 }\r
728 \r
729 void phydm_sbd_callback(\r
730         PRT_TIMER               pTimer\r
731 )\r
732 {\r
733         PADAPTER                Adapter = (PADAPTER)pTimer->Adapter;\r
734         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
735         PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;\r
736 \r
737 #if USE_WORKITEM\r
738         ODM_ScheduleWorkItem(&pDM_Odm->sbdcnt_workitem);\r
739 #else\r
740         phydm_sbd_check(pDM_Odm);\r
741 #endif\r
742 }\r
743 \r
744 void phydm_sbd_workitem_callback(\r
745         IN PVOID            pContext\r
746 )\r
747 {\r
748         PADAPTER        pAdapter = (PADAPTER)pContext;\r
749         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
750         PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;\r
751 \r
752         phydm_sbd_check(pDM_Odm);\r
753 }\r
754 #endif\r
755 VOID\r
756 phydm_BasicDbgMessage\r
757 (\r
758         IN              PVOID                   pDM_VOID\r
759 )\r
760 {\r
761 #if( DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
762         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
763         PFALSE_ALARM_STATISTICS FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure(pDM_Odm , PHYDM_FALSEALMCNT);\r
764         PCFO_TRACKING                           pCfoTrack = (PCFO_TRACKING)PhyDM_Get_Structure( pDM_Odm, PHYDM_CFOTRACK);\r
765         pDIG_T  pDM_DigTable = &pDM_Odm->DM_DigTable;\r
766         pRA_T   pRA_Table = &pDM_Odm->DM_RA_Table;\r
767         u2Byte  macid, phydm_macid, client_cnt = 0;\r
768         PSTA_INFO_T     pEntry;\r
769         s4Byte  tmp_val = 0;\r
770         u1Byte  tmp_val_u1 = 0;\r
771         \r
772         ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("[PHYDM Common MSG] System up time: ((%d sec))----->\n", pDM_Odm->phydm_sys_up_time));\r
773 \r
774         if (pDM_Odm->bLinked) {\r
775                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("Curr_STA_ID =  0x%x\n", pDM_Odm->curr_station_id));\r
776                 \r
777                 /*Print RX Rate*/\r
778                 if (pDM_Odm->RxRate <= ODM_RATE11M) {\r
779                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("[CCK AGC Report] LNA_idx = 0x%x, VGA_idx = 0x%x\n",\r
780                                 pDM_Odm->cck_lna_idx, pDM_Odm->cck_vga_idx));           \r
781                 } else {\r
782                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("[OFDM AGC Report] { 0x%x, 0x%x, 0x%x, 0x%x }\n",\r
783                                 pDM_Odm->ofdm_agc_idx[0], pDM_Odm->ofdm_agc_idx[1], pDM_Odm->ofdm_agc_idx[2], pDM_Odm->ofdm_agc_idx[3]));       \r
784                 }\r
785 \r
786                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("RSSI: { %d,  %d,  %d,  %d },    RxRate:",\r
787                         (pDM_Odm->RSSI_A == 0xff) ? 0 : pDM_Odm->RSSI_A , \r
788                         (pDM_Odm->RSSI_B == 0xff) ? 0 : pDM_Odm->RSSI_B , \r
789                         (pDM_Odm->RSSI_C == 0xff) ? 0 : pDM_Odm->RSSI_C, \r
790                         (pDM_Odm->RSSI_D == 0xff) ? 0 : pDM_Odm->RSSI_D));\r
791 \r
792                 phydm_print_rate(pDM_Odm, pDM_Odm->RxRate, ODM_COMP_COMMON);\r
793                 \r
794                 /*Print TX Rate*/\r
795                 for (macid = 0; macid < ODM_ASSOCIATE_ENTRY_NUM; macid++) {\r
796                         \r
797                         pEntry = pDM_Odm->pODM_StaInfo[macid];\r
798                         if (IS_STA_VALID(pEntry)) {\r
799                                 \r
800                                 phydm_macid = (pDM_Odm->platform2phydm_macid_table[macid]);\r
801                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("TXRate [%d]:", macid));\r
802                                 phydm_print_rate(pDM_Odm, pRA_Table->link_tx_rate[macid], ODM_COMP_COMMON);\r
803                                 \r
804                                 client_cnt++;\r
805                         \r
806                                 if (client_cnt == pDM_Odm->number_linked_client)\r
807                                         break;\r
808                         }\r
809                 }\r
810                 \r
811                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("TP { TX, RX, total} = {%d, %d, %d }Mbps, TrafficLoad = (%d))\n", \r
812                         pDM_Odm->tx_tp, pDM_Odm->rx_tp, pDM_Odm->total_tp, pDM_Odm->TrafficLoad));\r
813 \r
814                 tmp_val_u1 = (pCfoTrack->CrystalCap > pCfoTrack->DefXCap) ? (pCfoTrack->CrystalCap - pCfoTrack->DefXCap) : (pCfoTrack->DefXCap - pCfoTrack->CrystalCap);\r
815                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("CFO_avg = ((%d kHz)) , CrystalCap_tracking = ((%s%d))\n", \r
816                         pCfoTrack->CFO_ave_pre, ((pCfoTrack->CrystalCap > pCfoTrack->DefXCap)?"+":"-"),tmp_val_u1));\r
817 \r
818                 /* Condition number */\r
819 #if (RTL8822B_SUPPORT == 1) \r
820                 if (pDM_Odm->SupportICType == ODM_RTL8822B) {\r
821                         tmp_val = phydm_get_condition_number_8822B(pDM_Odm);\r
822                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("Condition number = ((%d))\n", tmp_val));\r
823                 }\r
824 #endif\r
825 \r
826 #if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT == 1)\r
827                 /*STBC or LDPC pkt*/\r
828                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("LDPC = %s, STBC = %s\n", (pDM_Odm->PhyDbgInfo.bLdpcPkt)?"Y":"N", (pDM_Odm->PhyDbgInfo.bStbcPkt)?"Y":"N"));\r
829 #endif\r
830         } else {\r
831                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("No Link !!!\n"));\r
832         }\r
833 \r
834         ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("[CCA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\n",  \r
835                 FalseAlmCnt->Cnt_CCK_CCA, FalseAlmCnt->Cnt_OFDM_CCA, FalseAlmCnt->Cnt_CCA_all));\r
836 \r
837         ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("[FA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\n",   \r
838                 FalseAlmCnt->Cnt_Cck_fail, FalseAlmCnt->Cnt_Ofdm_fail, FalseAlmCnt->Cnt_all));\r
839 \r
840         #if (ODM_IC_11N_SERIES_SUPPORT == 1) \r
841         if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES) {\r
842                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("[OFDM FA Detail] Parity_Fail = (( %d )), Rate_Illegal = (( %d )), CRC8_fail = (( %d )), Mcs_fail = (( %d )), Fast_Fsync = (( %d )), SB_Search_fail = (( %d ))\n",        \r
843                         FalseAlmCnt->Cnt_Parity_Fail, FalseAlmCnt->Cnt_Rate_Illegal, FalseAlmCnt->Cnt_Crc8_fail, FalseAlmCnt->Cnt_Mcs_fail, FalseAlmCnt->Cnt_Fast_Fsync, FalseAlmCnt->Cnt_SB_Search_fail));\r
844         }\r
845         #endif\r
846         \r
847         ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("bLinked = %d, Num_client = %d, RSSI_Min = %d, CurrentIGI = 0x%x, bNoisy=%d\n\n",\r
848                 pDM_Odm->bLinked, pDM_Odm->number_linked_client, pDM_Odm->RSSI_Min, pDM_DigTable->CurIGValue, pDM_Odm->NoisyDecision));\r
849 \r
850 /*\r
851         temp_reg = ODM_GetBBReg(pDM_Odm, 0xDD0, bMaskByte0);\r
852         ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("0xDD0 = 0x%x\n",temp_reg));\r
853                 \r
854         temp_reg = ODM_GetBBReg(pDM_Odm, 0xDDc, bMaskByte1);\r
855         ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("0xDDD = 0x%x\n",temp_reg));\r
856         \r
857         temp_reg = ODM_GetBBReg(pDM_Odm, 0xc50, bMaskByte0);\r
858         ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("0xC50 = 0x%x\n",temp_reg));\r
859 \r
860         temp_reg = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x0, 0x3fe0);\r
861         ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("RF 0x0[13:5] = 0x%x\n\n",temp_reg));\r
862 */      \r
863 \r
864 #endif\r
865 }\r
866 \r
867 \r
868 VOID phydm_BasicProfile(\r
869         IN              PVOID                   pDM_VOID,\r
870         IN              u4Byte                  *_used,\r
871         OUT             char                            *output,\r
872         IN              u4Byte                  *_out_len\r
873 )\r
874 {\r
875         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
876         char  *Cut = NULL;\r
877         char *ICType = NULL;\r
878         u4Byte used = *_used;\r
879         u4Byte out_len = *_out_len;\r
880         u4Byte  commit_ver = 0;\r
881         u4Byte  date = 0;\r
882         char    *commit_by = NULL;\r
883         u4Byte  release_ver = 0;\r
884 \r
885         PHYDM_SNPRINTF((output + used, out_len - used, "%-35s\n", "% Basic Profile %"));\r
886 \r
887         if (pDM_Odm->SupportICType == ODM_RTL8188E) {\r
888                 #if (RTL8188E_SUPPORT == 1)\r
889                 ICType = "RTL8188E";\r
890                 date = RELEASE_DATE_8188E;\r
891                 commit_by = COMMIT_BY_8188E;\r
892                 release_ver = RELEASE_VERSION_8188E;\r
893                 #endif\r
894         }\r
895         #if (RTL8812A_SUPPORT == 1)\r
896         else if (pDM_Odm->SupportICType == ODM_RTL8812) {\r
897                 ICType = "RTL8812A";\r
898                 date = RELEASE_DATE_8812A;\r
899                 commit_by = COMMIT_BY_8812A;\r
900                 release_ver = RELEASE_VERSION_8812A;\r
901         }\r
902         #endif\r
903         #if (RTL8821A_SUPPORT == 1)\r
904         else if (pDM_Odm->SupportICType == ODM_RTL8821) {\r
905                 ICType = "RTL8821A";\r
906                 date = RELEASE_DATE_8821A;\r
907                 commit_by = COMMIT_BY_8821A;\r
908                 release_ver = RELEASE_VERSION_8821A;\r
909         }\r
910         #endif\r
911         #if (RTL8192E_SUPPORT == 1)\r
912         else if (pDM_Odm->SupportICType == ODM_RTL8192E) {\r
913                 ICType = "RTL8192E";\r
914                 date = RELEASE_DATE_8192E;\r
915                 commit_by = COMMIT_BY_8192E;\r
916                 release_ver = RELEASE_VERSION_8192E;\r
917         }\r
918         #endif\r
919         #if (RTL8723B_SUPPORT == 1)\r
920         else if (pDM_Odm->SupportICType == ODM_RTL8723B) {\r
921                 ICType = "RTL8723B";\r
922                 date = RELEASE_DATE_8723B;\r
923                 commit_by = COMMIT_BY_8723B;\r
924                 release_ver = RELEASE_VERSION_8723B;\r
925         }\r
926         #endif\r
927         #if (RTL8814A_SUPPORT == 1)\r
928         else if (pDM_Odm->SupportICType == ODM_RTL8814A) {\r
929                 ICType = "RTL8814A";\r
930                 date = RELEASE_DATE_8814A;\r
931                 commit_by = COMMIT_BY_8814A;\r
932                 release_ver = RELEASE_VERSION_8814A;\r
933         }\r
934         #endif\r
935         #if (RTL8881A_SUPPORT == 1)\r
936         else if (pDM_Odm->SupportICType == ODM_RTL8881A) {\r
937                 ICType = "RTL8881A";\r
938                 /**/\r
939         }\r
940         #endif\r
941         #if (RTL8822B_SUPPORT == 1)\r
942         else if (pDM_Odm->SupportICType == ODM_RTL8822B) {\r
943                 ICType = "RTL8822B";\r
944                 date = RELEASE_DATE_8822B;\r
945                 commit_by = COMMIT_BY_8822B;\r
946                 release_ver = RELEASE_VERSION_8822B;\r
947         }\r
948         #endif\r
949         #if (RTL8197F_SUPPORT == 1)\r
950         else if (pDM_Odm->SupportICType == ODM_RTL8197F) {\r
951                 ICType = "RTL8197F";\r
952                 date = RELEASE_DATE_8197F;\r
953                 commit_by = COMMIT_BY_8197F;\r
954                 release_ver = RELEASE_VERSION_8197F;\r
955         }\r
956         #endif\r
957 \r
958         #if (RTL8703B_SUPPORT == 1)\r
959         else if (pDM_Odm->SupportICType == ODM_RTL8703B) {\r
960                 \r
961                 ICType = "RTL8703B";\r
962                 date = RELEASE_DATE_8703B;\r
963                 commit_by = COMMIT_BY_8703B;\r
964                 release_ver = RELEASE_VERSION_8703B;\r
965                 \r
966         } \r
967         #endif\r
968         #if (RTL8195A_SUPPORT == 1)\r
969         else if (pDM_Odm->SupportICType == ODM_RTL8195A) {\r
970                 ICType = "RTL8195A";\r
971                 /**/            \r
972         }\r
973         #endif\r
974         #if (RTL8188F_SUPPORT == 1)\r
975         else if (pDM_Odm->SupportICType == ODM_RTL8188F) {\r
976                 ICType = "RTL8188F";\r
977                 date = RELEASE_DATE_8188F;\r
978                 commit_by = COMMIT_BY_8188F;\r
979                 release_ver = RELEASE_VERSION_8188F;\r
980         }\r
981         #endif\r
982         #if (RTL8723D_SUPPORT == 1)\r
983         else if (pDM_Odm->SupportICType == ODM_RTL8723D) {\r
984                 ICType = "RTL8723D";\r
985                 date = RELEASE_DATE_8723D;\r
986                 commit_by = COMMIT_BY_8723D;\r
987                 release_ver = RELEASE_VERSION_8723D;\r
988                 /**/    \r
989         }\r
990         #endif\r
991         #if (RTL8821C_SUPPORT == 1)\r
992         else if (pDM_Odm->SupportICType == ODM_RTL8821C) {\r
993                 ICType = "RTL8821C";\r
994                 date = RELEASE_DATE_8821C;\r
995                 commit_by = COMMIT_BY_8821C;\r
996                 release_ver = RELEASE_VERSION_8821C;\r
997         }\r
998         #endif\r
999         PHYDM_SNPRINTF((output + used, out_len - used, "  %-35s: %s (MP Chip: %s)\n", "IC Type", ICType, pDM_Odm->bIsMPChip ? "Yes" : "No"));\r
1000 \r
1001         if (pDM_Odm->CutVersion == ODM_CUT_A)                   \r
1002                 Cut = "A";\r
1003         else if (pDM_Odm->CutVersion == ODM_CUT_B)            \r
1004                 Cut = "B";\r
1005         else if (pDM_Odm->CutVersion == ODM_CUT_C)            \r
1006                 Cut = "C";\r
1007         else if (pDM_Odm->CutVersion == ODM_CUT_D)            \r
1008                 Cut = "D";\r
1009         else if (pDM_Odm->CutVersion == ODM_CUT_E)            \r
1010                 Cut = "E";\r
1011         else if (pDM_Odm->CutVersion == ODM_CUT_F)            \r
1012                 Cut = "F";\r
1013         else if (pDM_Odm->CutVersion == ODM_CUT_I)            \r
1014                 Cut = "I";\r
1015         PHYDM_SNPRINTF((output + used, out_len - used, "  %-35s: %s\n", "Cut Version", Cut));\r
1016         PHYDM_SNPRINTF((output + used, out_len - used, "  %-35s: %d\n", "PHY Parameter Version", ODM_GetHWImgVersion(pDM_Odm)));\r
1017         PHYDM_SNPRINTF((output + used, out_len - used, "  %-35s: %d\n", "PHY Parameter Commit date", date));\r
1018         PHYDM_SNPRINTF((output + used, out_len - used, "  %-35s: %s\n", "PHY Parameter Commit by", commit_by));\r
1019         PHYDM_SNPRINTF((output + used, out_len - used, "  %-35s: %d\n", "PHY Parameter Release Version", release_ver));\r
1020         \r
1021 #if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
1022         {\r
1023                 PADAPTER                       Adapter = pDM_Odm->Adapter;\r
1024                 PHYDM_SNPRINTF((output + used, out_len - used, "  %-35s: %d (Subversion: %d)\n", "FW Version", Adapter->MgntInfo.FirmwareVersion, Adapter->MgntInfo.FirmwareSubVersion));\r
1025         }\r
1026 #elif (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
1027         {\r
1028                 struct rtl8192cd_priv *priv = pDM_Odm->priv;\r
1029                 PHYDM_SNPRINTF((output + used, out_len - used, "  %-35s: %d (Subversion: %d)\n", "FW Version", priv->pshare->fw_version, priv->pshare->fw_sub_version));\r
1030         }\r
1031 #else\r
1032         {\r
1033                 PADAPTER                       Adapter = pDM_Odm->Adapter;\r
1034                 HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);\r
1035                 PHYDM_SNPRINTF((output + used, out_len - used, "  %-35s: %d (Subversion: %d)\n", "FW Version", pHalData->FirmwareVersion, pHalData->FirmwareSubVersion));\r
1036         }\r
1037 #endif\r
1038         //1 PHY DM Version List\r
1039         PHYDM_SNPRINTF((output + used, out_len - used, "%-35s\n", "% PHYDM Version %"));\r
1040         PHYDM_SNPRINTF((output + used, out_len - used, "  %-35s: %s\n", "Code Base", PHYDM_CODE_BASE));\r
1041         PHYDM_SNPRINTF((output + used, out_len - used, "  %-35s: %s\n", "Release Date", PHYDM_RELEASE_DATE));\r
1042         PHYDM_SNPRINTF((output + used, out_len - used, "  %-35s: %s\n", "Adaptivity", ADAPTIVITY_VERSION));\r
1043         PHYDM_SNPRINTF((output + used, out_len - used, "  %-35s: %s\n", "DIG", DIG_VERSION));\r
1044         PHYDM_SNPRINTF((output + used, out_len - used, "  %-35s: %s\n", "Dynamic BB PowerSaving", DYNAMIC_BBPWRSAV_VERSION));\r
1045         PHYDM_SNPRINTF((output + used, out_len - used, "  %-35s: %s\n", "CFO Tracking", CFO_TRACKING_VERSION));\r
1046         PHYDM_SNPRINTF((output + used, out_len - used, "  %-35s: %s\n", "Antenna Diversity", ANTDIV_VERSION));\r
1047         PHYDM_SNPRINTF((output + used, out_len - used, "  %-35s: %s\n", "Power Tracking", POWRTRACKING_VERSION));\r
1048         PHYDM_SNPRINTF((output + used, out_len - used, "  %-35s: %s\n", "Dynamic TxPower", DYNAMIC_TXPWR_VERSION));\r
1049         PHYDM_SNPRINTF((output + used, out_len - used, "  %-35s: %s\n", "RA Info", RAINFO_VERSION));\r
1050 #if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
1051         PHYDM_SNPRINTF((output + used, out_len - used, "  %-35s: %s\n", "Antenna Detection", ANTDECT_VERSION));\r
1052 #endif\r
1053         PHYDM_SNPRINTF((output + used, out_len - used, "  %-35s: %s\n", "Auto Channel Selection", ACS_VERSION));\r
1054         PHYDM_SNPRINTF((output + used, out_len - used, "  %-35s: %s\n", "EDCA Turbo", EDCATURBO_VERSION));\r
1055         PHYDM_SNPRINTF((output + used, out_len - used, "  %-35s: %s\n", "Path Diversity", PATHDIV_VERSION));\r
1056 \r
1057 #if (RTL8822B_SUPPORT == 1)  \r
1058         if (pDM_Odm->SupportICType & ODM_RTL8822B)\r
1059                 PHYDM_SNPRINTF((output + used, out_len - used, "  %-35s: %s\n", "PHY config 8822B", PHY_CONFIG_VERSION_8822B));\r
1060         \r
1061 #endif\r
1062 #if (RTL8197F_SUPPORT == 1)  \r
1063         if (pDM_Odm->SupportICType & ODM_RTL8197F)\r
1064                 PHYDM_SNPRINTF((output + used, out_len - used, "  %-35s: %s\n", "PHY config 8197F", PHY_CONFIG_VERSION_8197F));\r
1065 #endif\r
1066         *_used = used;\r
1067         *_out_len = out_len;\r
1068 \r
1069 }\r
1070 \r
1071 VOID\r
1072 phydm_fw_trace_en_h2c(\r
1073         IN      PVOID           pDM_VOID,\r
1074         IN      BOOLEAN         enable,\r
1075         IN      u4Byte          fw_debug_component,     \r
1076         IN      u4Byte          monitor_mode,\r
1077         IN      u4Byte          macid\r
1078 )\r
1079 {\r
1080         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1081         u1Byte                  H2C_Parameter[7] = {0};\r
1082         u1Byte                  cmd_length;\r
1083 \r
1084         if (pDM_Odm->SupportICType & PHYDM_IC_3081_SERIES){\r
1085                 \r
1086                 H2C_Parameter[0] = enable;\r
1087                 H2C_Parameter[1] = (u1Byte)(fw_debug_component & bMaskByte0);\r
1088                 H2C_Parameter[2] = (u1Byte)((fw_debug_component & bMaskByte1)>>8);\r
1089                 H2C_Parameter[3] = (u1Byte)((fw_debug_component & bMaskByte2)>>16);\r
1090                 H2C_Parameter[4] = (u1Byte)((fw_debug_component & bMaskByte3)>>24);\r
1091                 H2C_Parameter[5] = (u1Byte)monitor_mode;\r
1092                 H2C_Parameter[6] = (u1Byte)macid;\r
1093                 cmd_length = 7;\r
1094 \r
1095         } else {\r
1096         \r
1097                 H2C_Parameter[0] = enable;\r
1098                 H2C_Parameter[1] = (u1Byte)monitor_mode;\r
1099                 H2C_Parameter[2] = (u1Byte)macid;\r
1100                 cmd_length = 3;\r
1101         }\r
1102 \r
1103         \r
1104         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("---->\n"));\r
1105         if (monitor_mode == 0){\r
1106                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[H2C] FW_debug_en: (( %d ))\n", enable));\r
1107         } else {\r
1108                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[H2C] FW_debug_en: (( %d )), mode: (( %d )), macid: (( %d ))\n", enable, monitor_mode, macid));\r
1109         }\r
1110         ODM_FillH2CCmd(pDM_Odm, PHYDM_H2C_FW_TRACE_EN, cmd_length, H2C_Parameter);\r
1111 }\r
1112 \r
1113 \r
1114 #if (RTL8822B_SUPPORT == 1 || RTL8197F_SUPPORT == 1 || RTL8821C_SUPPORT == 1)\r
1115 BOOLEAN\r
1116 phydm_api_set_txagc(\r
1117         IN      PDM_ODM_T                               pDM_Odm,\r
1118         IN      u4Byte                                  PowerIndex,\r
1119         IN      ODM_RF_RADIO_PATH_E             Path,   \r
1120         IN      u1Byte                                  HwRate,\r
1121         IN      BOOLEAN                                 bSingleRate\r
1122         )\r
1123 {\r
1124         BOOLEAN         ret = FALSE;\r
1125         \r
1126 #if ((RTL8822B_SUPPORT == 1) || (RTL8821C_SUPPORT == 1))\r
1127         if (pDM_Odm->SupportICType & (ODM_RTL8822B|ODM_RTL8821C)) {\r
1128                 if (bSingleRate) {\r
1129 #if (RTL8822B_SUPPORT == 1)\r
1130                         if (pDM_Odm->SupportICType == ODM_RTL8822B)\r
1131                                 ret = phydm_write_txagc_1byte_8822b(pDM_Odm, PowerIndex, Path, HwRate);\r
1132 #endif\r
1133 #if (RTL8821C_SUPPORT == 1)\r
1134                         if (pDM_Odm->SupportICType == ODM_RTL8821C)\r
1135                                 ret = phydm_write_txagc_1byte_8821c(pDM_Odm, PowerIndex, Path, HwRate);\r
1136 #endif\r
1137 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
1138                         SetCurrentTxAGC(pDM_Odm->priv, Path, HwRate, (u1Byte)PowerIndex);\r
1139 #endif\r
1140 \r
1141                 } else {\r
1142                         u1Byte  i;\r
1143 #if (RTL8822B_SUPPORT == 1)\r
1144                         if (pDM_Odm->SupportICType == ODM_RTL8822B)\r
1145                                 ret = config_phydm_write_txagc_8822b(pDM_Odm, PowerIndex, Path, HwRate);\r
1146 #endif\r
1147 #if (RTL8821C_SUPPORT == 1)\r
1148                         if (pDM_Odm->SupportICType == ODM_RTL8821C)\r
1149                                 ret = config_phydm_write_txagc_8821c(pDM_Odm, PowerIndex, Path, HwRate);\r
1150 #endif\r
1151 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)              \r
1152                         for (i = 0; i < 4; i++)\r
1153                                 SetCurrentTxAGC(pDM_Odm->priv, Path, (HwRate + i), (u1Byte)PowerIndex);\r
1154 #endif\r
1155                 }\r
1156         }\r
1157 #endif\r
1158 \r
1159 \r
1160 #if (RTL8197F_SUPPORT == 1)\r
1161         if (pDM_Odm->SupportICType & ODM_RTL8197F)\r
1162                 ret = config_phydm_write_txagc_8197f(pDM_Odm, PowerIndex, Path, HwRate);\r
1163 #endif\r
1164 \r
1165         return ret;\r
1166 }\r
1167 \r
1168 u1Byte\r
1169 phydm_api_get_txagc(\r
1170         IN      PDM_ODM_T                               pDM_Odm,\r
1171         IN      ODM_RF_RADIO_PATH_E     Path,\r
1172         IN      u1Byte                                  HwRate\r
1173         )\r
1174 {\r
1175         u1Byte  ret = 0;\r
1176         \r
1177 #if (RTL8822B_SUPPORT == 1)\r
1178         if (pDM_Odm->SupportICType & ODM_RTL8822B)\r
1179                 ret = config_phydm_read_txagc_8822b(pDM_Odm, Path, HwRate);\r
1180 #endif\r
1181 \r
1182 #if (RTL8197F_SUPPORT == 1)\r
1183         if (pDM_Odm->SupportICType & ODM_RTL8197F)\r
1184                 ret = config_phydm_read_txagc_8197f(pDM_Odm, Path, HwRate);\r
1185 #endif\r
1186 \r
1187 #if (RTL8821C_SUPPORT == 1)\r
1188         if (pDM_Odm->SupportICType & ODM_RTL8821C)\r
1189                 ret = config_phydm_read_txagc_8821c(pDM_Odm, Path, HwRate);\r
1190 #endif\r
1191 \r
1192         return ret;\r
1193 }\r
1194 \r
1195 \r
1196 BOOLEAN\r
1197 phydm_api_switch_bw_channel(\r
1198         IN      PDM_ODM_T                               pDM_Odm,\r
1199         IN      u1Byte                                  central_ch,\r
1200         IN      u1Byte                                  primary_ch_idx,\r
1201         IN      ODM_BW_E                                bandwidth\r
1202         )\r
1203 {\r
1204         BOOLEAN         ret = FALSE;\r
1205         \r
1206 #if (RTL8822B_SUPPORT == 1)\r
1207         if (pDM_Odm->SupportICType & ODM_RTL8822B)\r
1208                 ret = config_phydm_switch_channel_bw_8822b(pDM_Odm, central_ch, primary_ch_idx, bandwidth);\r
1209 #endif\r
1210 \r
1211 #if (RTL8197F_SUPPORT == 1)\r
1212         if (pDM_Odm->SupportICType & ODM_RTL8197F)\r
1213                 ret = config_phydm_switch_channel_bw_8197f(pDM_Odm, central_ch, primary_ch_idx, bandwidth);\r
1214 #endif\r
1215 \r
1216 #if (RTL8821C_SUPPORT == 1)\r
1217         if (pDM_Odm->SupportICType & ODM_RTL8821C)\r
1218                 ret = config_phydm_switch_channel_bw_8821c(pDM_Odm, central_ch, primary_ch_idx, bandwidth);\r
1219 #endif\r
1220 \r
1221         return ret;\r
1222 }\r
1223 \r
1224 BOOLEAN\r
1225 phydm_api_trx_mode(\r
1226         IN      PDM_ODM_T                               pDM_Odm,\r
1227         IN      ODM_RF_PATH_E                   TxPath,\r
1228         IN      ODM_RF_PATH_E                   RxPath,\r
1229         IN      BOOLEAN                                 bTx2Path\r
1230         )\r
1231 {\r
1232         BOOLEAN         ret = FALSE;\r
1233         \r
1234 #if (RTL8822B_SUPPORT == 1)\r
1235         if (pDM_Odm->SupportICType & ODM_RTL8822B)\r
1236                 ret = config_phydm_trx_mode_8822b(pDM_Odm, TxPath, RxPath, bTx2Path);\r
1237 #endif\r
1238 \r
1239 #if (RTL8197F_SUPPORT == 1)\r
1240         if (pDM_Odm->SupportICType & ODM_RTL8197F)\r
1241                 ret = config_phydm_trx_mode_8197f(pDM_Odm, TxPath, RxPath, bTx2Path);\r
1242 #endif\r
1243 \r
1244         return ret;\r
1245 }\r
1246 #endif\r
1247 \r
1248 VOID\r
1249 phydm_get_per_path_txagc(\r
1250         IN              PVOID                   pDM_VOID,\r
1251         IN              u1Byte                  path,\r
1252         IN              u4Byte                  *_used,\r
1253         OUT             char                            *output,\r
1254         IN              u4Byte                  *_out_len\r
1255 )\r
1256 {\r
1257         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1258         u1Byte                  rate_idx;\r
1259         u1Byte                  txagc;\r
1260         u4Byte                  used = *_used;\r
1261         u4Byte                  out_len = *_out_len;\r
1262 \r
1263 #if ((RTL8822B_SUPPORT == 1) || (RTL8197F_SUPPORT == 1) || (RTL8821C_SUPPORT == 1))\r
1264         if (((pDM_Odm->SupportICType & (ODM_RTL8822B|ODM_RTL8197F)) && (path <= ODM_RF_PATH_B)) ||\r
1265                 ((pDM_Odm->SupportICType & (ODM_RTL8821C)) && (path <= ODM_RF_PATH_A))) {\r
1266                 for (rate_idx = 0; rate_idx <= 0x53; rate_idx++) {\r
1267                         if (rate_idx == ODM_RATE1M)\r
1268                                 PHYDM_SNPRINTF((output + used, out_len - used, "  %-35s\n", "CCK====>"));\r
1269                         else if (rate_idx == ODM_RATE6M)\r
1270                                 PHYDM_SNPRINTF((output + used, out_len - used, "\n  %-35s\n", "OFDM====>"));\r
1271                         else if (rate_idx == ODM_RATEMCS0)\r
1272                                 PHYDM_SNPRINTF((output + used, out_len - used, "\n  %-35s\n", "HT 1ss====>"));\r
1273                         else if (rate_idx == ODM_RATEMCS8)\r
1274                                 PHYDM_SNPRINTF((output + used, out_len - used, "\n  %-35s\n", "HT 2ss====>"));\r
1275                         else if (rate_idx == ODM_RATEMCS16)\r
1276                                 PHYDM_SNPRINTF((output + used, out_len - used, "\n  %-35s\n", "HT 3ss====>"));\r
1277                         else if (rate_idx == ODM_RATEMCS24)\r
1278                                 PHYDM_SNPRINTF((output + used, out_len - used, "\n  %-35s\n", "HT 4ss====>"));\r
1279                         else if (rate_idx == ODM_RATEVHTSS1MCS0)\r
1280                                 PHYDM_SNPRINTF((output + used, out_len - used, "\n  %-35s\n", "VHT 1ss====>"));\r
1281                         else if (rate_idx == ODM_RATEVHTSS2MCS0)\r
1282                                 PHYDM_SNPRINTF((output + used, out_len - used, "\n  %-35s\n", "VHT 2ss====>"));\r
1283                         else if (rate_idx == ODM_RATEVHTSS3MCS0)\r
1284                                 PHYDM_SNPRINTF((output + used, out_len - used, "\n  %-35s\n", "VHT 3ss====>"));\r
1285                         else if (rate_idx == ODM_RATEVHTSS4MCS0)\r
1286                                 PHYDM_SNPRINTF((output + used, out_len - used, "\n  %-35s\n", "VHT 4ss====>"));\r
1287                         \r
1288                         txagc = phydm_api_get_txagc(pDM_Odm, (ODM_RF_RADIO_PATH_E) path, rate_idx);\r
1289                         if (config_phydm_read_txagc_check(txagc))\r
1290                                 PHYDM_SNPRINTF((output + used, out_len - used, "  0x%02x    ", txagc));\r
1291                         else\r
1292                                 PHYDM_SNPRINTF((output + used, out_len - used, "  0x%s    ", "xx"));\r
1293                 }\r
1294         }\r
1295 #endif\r
1296 }\r
1297 \r
1298 \r
1299 VOID\r
1300 phydm_get_txagc(\r
1301         IN              PVOID                   pDM_VOID,\r
1302         IN              u4Byte                  *_used,\r
1303         OUT             char                            *output,\r
1304         IN              u4Byte                  *_out_len\r
1305 )\r
1306 {\r
1307         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1308         u4Byte                  used = *_used;\r
1309         u4Byte                  out_len = *_out_len;\r
1310         \r
1311         /* Path-A */\r
1312         PHYDM_SNPRINTF((output + used, out_len - used, "%-35s\n", "Path-A===================="));\r
1313         phydm_get_per_path_txagc(pDM_Odm, ODM_RF_PATH_A, _used, output, _out_len);\r
1314         \r
1315         /* Path-B */\r
1316         PHYDM_SNPRINTF((output + used, out_len - used, "\n%-35s\n", "Path-B===================="));\r
1317         phydm_get_per_path_txagc(pDM_Odm, ODM_RF_PATH_B, _used, output, _out_len);\r
1318 \r
1319         /* Path-C */\r
1320         PHYDM_SNPRINTF((output + used, out_len - used, "\n%-35s\n", "Path-C===================="));\r
1321         phydm_get_per_path_txagc(pDM_Odm, ODM_RF_PATH_C, _used, output, _out_len);\r
1322 \r
1323         /* Path-D */\r
1324         PHYDM_SNPRINTF((output + used, out_len - used, "\n%-35s\n", "Path-D===================="));\r
1325         phydm_get_per_path_txagc(pDM_Odm, ODM_RF_PATH_D, _used, output, _out_len);\r
1326 \r
1327 }\r
1328 \r
1329 VOID\r
1330 phydm_set_txagc(\r
1331         IN              PVOID                   pDM_VOID,\r
1332         IN              u4Byte                  *const dm_value,\r
1333         IN              u4Byte                  *_used,\r
1334         OUT             char                            *output,\r
1335         IN              u4Byte                  *_out_len\r
1336 )\r
1337 {\r
1338         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1339         u4Byte                  used = *_used;\r
1340         u4Byte                  out_len = *_out_len;\r
1341 \r
1342 /*dm_value[1] = Path*/\r
1343 /*dm_value[2] = HwRate*/\r
1344 /*dm_value[3] = PowerIndex*/\r
1345 \r
1346 #if (RTL8822B_SUPPORT == 1 || RTL8197F_SUPPORT == 1 || RTL8821C_SUPPORT == 1)\r
1347         if (pDM_Odm->SupportICType & (ODM_RTL8822B|ODM_RTL8197F|ODM_RTL8821C)) {\r
1348                 if (dm_value[1] <= 1) {\r
1349                         if ((u1Byte)dm_value[2] != 0xff) {\r
1350                                 if (phydm_api_set_txagc(pDM_Odm, dm_value[3], (ODM_RF_RADIO_PATH_E) dm_value[1], (u1Byte)dm_value[2], TRUE))\r
1351                                         PHYDM_SNPRINTF((output + used, out_len - used, "  %s%d   %s%x%s%x\n", "Write path-", dm_value[1], "rate index-0x", dm_value[2], " = 0x", dm_value[3]));\r
1352                                 else\r
1353                                         PHYDM_SNPRINTF((output + used, out_len - used, "  %s%d   %s%x%s\n", "Write path-", (dm_value[1] & 0x1), "rate index-0x", (dm_value[2] & 0x7f), " fail"));\r
1354                         } else {\r
1355                                 u1Byte  i;\r
1356                                 u4Byte  power_index;\r
1357                                 BOOLEAN status = TRUE;\r
1358 \r
1359                                 power_index = (dm_value[3] & 0x3f);\r
1360 \r
1361                                 if (pDM_Odm->SupportICType & (ODM_RTL8822B|ODM_RTL8821C)) {\r
1362                                         power_index = (power_index << 24)|(power_index << 16)|(power_index << 8)|(power_index);\r
1363 \r
1364                                         for (i = 0; i < ODM_RATEVHTSS2MCS9; i += 4)\r
1365                                                 status = (status & phydm_api_set_txagc(pDM_Odm, power_index, (ODM_RF_RADIO_PATH_E) dm_value[1], i, FALSE));\r
1366                                 } else if (pDM_Odm->SupportICType & ODM_RTL8197F) {\r
1367                                         for (i = 0; i <= ODM_RATEMCS15; i++)\r
1368                                                 status = (status & phydm_api_set_txagc(pDM_Odm, power_index, (ODM_RF_RADIO_PATH_E) dm_value[1], i, FALSE));\r
1369                                 }\r
1370 \r
1371                                 if (status)\r
1372                                         PHYDM_SNPRINTF((output + used, out_len - used, "  %s%d   %s%x\n", "Write all TXAGC of path-", dm_value[1], " = 0x", dm_value[3]));\r
1373                                 else\r
1374                                         PHYDM_SNPRINTF((output + used, out_len - used, "  %s%d   %s\n", "Write all TXAGC of path-", dm_value[1], " fail"));     \r
1375                         }\r
1376                 } else {\r
1377                         PHYDM_SNPRINTF((output + used, out_len - used, "  %s%d   %s%x%s\n", "Write path-", (dm_value[1] & 0x1), "rate index-0x", (dm_value[2] & 0x7f), " fail"));\r
1378                 }\r
1379         }\r
1380 #endif\r
1381 }\r
1382 \r
1383 VOID\r
1384 phydm_debug_trace(\r
1385         IN              PVOID           pDM_VOID,\r
1386         IN              u4Byte          *const dm_value,\r
1387         IN              u4Byte          *_used,\r
1388         OUT             char            *output,\r
1389         IN              u4Byte          *_out_len\r
1390 )\r
1391 {\r
1392         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1393         u4Byte                  pre_debug_components, one = 1;\r
1394         u4Byte                  used = *_used;\r
1395         u4Byte                  out_len = *_out_len;\r
1396 \r
1397         pre_debug_components = pDM_Odm->DebugComponents;\r
1398 \r
1399         PHYDM_SNPRINTF((output + used, out_len - used, "\n%s\n", "================================"));\r
1400         if (dm_value[0] == 100) {\r
1401                 PHYDM_SNPRINTF((output + used, out_len - used, "%s\n", "[Debug Message] PhyDM Selection"));\r
1402                 PHYDM_SNPRINTF((output + used, out_len - used, "%s\n", "================================"));\r
1403                 PHYDM_SNPRINTF((output + used, out_len - used, "00. (( %s ))DIG\n", ((pDM_Odm->DebugComponents & ODM_COMP_DIG) ? ("V") : ("."))));\r
1404                 PHYDM_SNPRINTF((output + used, out_len - used, "01. (( %s ))RA_MASK\n", ((pDM_Odm->DebugComponents & ODM_COMP_RA_MASK) ? ("V") : ("."))));\r
1405                 PHYDM_SNPRINTF((output + used, out_len - used, "02. (( %s ))DYNAMIC_TXPWR\n", ((pDM_Odm->DebugComponents & ODM_COMP_DYNAMIC_TXPWR) ? ("V") : ("."))));\r
1406                 PHYDM_SNPRINTF((output + used, out_len - used, "03. (( %s ))FA_CNT\n", ((pDM_Odm->DebugComponents & ODM_COMP_FA_CNT) ? ("V") : ("."))));\r
1407                 PHYDM_SNPRINTF((output + used, out_len - used, "04. (( %s ))RSSI_MONITOR\n", ((pDM_Odm->DebugComponents & ODM_COMP_RSSI_MONITOR) ? ("V") : ("."))));\r
1408                 PHYDM_SNPRINTF((output + used, out_len - used, "05. (( %s ))SNIFFER\n", ((pDM_Odm->DebugComponents & ODM_COMP_SNIFFER) ? ("V") : ("."))));\r
1409                 PHYDM_SNPRINTF((output + used, out_len - used, "06. (( %s ))ANT_DIV\n", ((pDM_Odm->DebugComponents & ODM_COMP_ANT_DIV) ? ("V") : ("."))));\r
1410                 PHYDM_SNPRINTF((output + used, out_len - used, "07. (( %s ))DFS\n", ((pDM_Odm->DebugComponents & ODM_COMP_DFS) ? ("V") : ("."))));\r
1411                 PHYDM_SNPRINTF((output + used, out_len - used, "08. (( %s ))NOISY_DETECT\n", ((pDM_Odm->DebugComponents & ODM_COMP_NOISY_DETECT) ? ("V") : ("."))));\r
1412                 PHYDM_SNPRINTF((output + used, out_len - used, "09. (( %s ))RATE_ADAPTIVE\n", ((pDM_Odm->DebugComponents & ODM_COMP_RATE_ADAPTIVE) ? ("V") : ("."))));\r
1413                 PHYDM_SNPRINTF((output + used, out_len - used, "10. (( %s ))PATH_DIV\n", ((pDM_Odm->DebugComponents & ODM_COMP_PATH_DIV) ? ("V") : ("."))));\r
1414                 PHYDM_SNPRINTF((output + used, out_len - used, "12. (( %s ))DYNAMIC_PRICCA\n", ((pDM_Odm->DebugComponents & ODM_COMP_DYNAMIC_PRICCA) ? ("V") : ("."))));\r
1415                 PHYDM_SNPRINTF((output + used, out_len - used, "14. (( %s ))MP\n", ((pDM_Odm->DebugComponents & ODM_COMP_MP) ? ("V") : ("."))));\r
1416                 PHYDM_SNPRINTF((output + used, out_len - used, "15. (( %s ))CFO_TRACKING\n", ((pDM_Odm->DebugComponents & ODM_COMP_CFO_TRACKING) ? ("V") : ("."))));\r
1417                 PHYDM_SNPRINTF((output + used, out_len - used, "16. (( %s ))ACS\n", ((pDM_Odm->DebugComponents & ODM_COMP_ACS) ? ("V") : ("."))));\r
1418                 PHYDM_SNPRINTF((output + used, out_len - used, "17. (( %s ))ADAPTIVITY\n", ((pDM_Odm->DebugComponents & PHYDM_COMP_ADAPTIVITY) ? ("V") : ("."))));\r
1419                 PHYDM_SNPRINTF((output + used, out_len - used, "18. (( %s ))RA_DBG\n", ((pDM_Odm->DebugComponents & PHYDM_COMP_RA_DBG) ? ("V") : ("."))));\r
1420                 PHYDM_SNPRINTF((output + used, out_len - used, "19. (( %s ))TXBF\n", ((pDM_Odm->DebugComponents & PHYDM_COMP_TXBF) ? ("V") : ("."))));\r
1421                 PHYDM_SNPRINTF((output + used, out_len - used, "20. (( %s ))EDCA_TURBO\n", ((pDM_Odm->DebugComponents & ODM_COMP_EDCA_TURBO) ? ("V") : ("."))));\r
1422                 PHYDM_SNPRINTF((output + used, out_len - used, "22. (( %s ))FW_DEBUG_TRACE\n", ((pDM_Odm->DebugComponents & ODM_FW_DEBUG_TRACE) ? ("V") : ("."))));\r
1423                 \r
1424                 PHYDM_SNPRINTF((output + used, out_len - used, "24. (( %s ))TX_PWR_TRACK\n", ((pDM_Odm->DebugComponents & ODM_COMP_TX_PWR_TRACK) ? ("V") : ("."))));\r
1425                 PHYDM_SNPRINTF((output + used, out_len - used, "26. (( %s ))CALIBRATION\n", ((pDM_Odm->DebugComponents & ODM_COMP_CALIBRATION) ? ("V") : ("."))));\r
1426                 PHYDM_SNPRINTF((output + used, out_len - used, "28. (( %s ))PHY_CONFIG\n", ((pDM_Odm->DebugComponents & ODM_PHY_CONFIG) ? ("V") : ("."))));\r
1427                 PHYDM_SNPRINTF((output + used, out_len - used, "29. (( %s ))INIT\n", ((pDM_Odm->DebugComponents & ODM_COMP_INIT) ? ("V") : ("."))));\r
1428                 PHYDM_SNPRINTF((output + used, out_len - used, "30. (( %s ))COMMON\n", ((pDM_Odm->DebugComponents & ODM_COMP_COMMON) ? ("V") : ("."))));\r
1429                 PHYDM_SNPRINTF((output + used, out_len - used, "31. (( %s ))API\n", ((pDM_Odm->DebugComponents & ODM_COMP_API) ? ("V") : ("."))));\r
1430                 PHYDM_SNPRINTF((output + used, out_len - used, "%s\n", "================================"));\r
1431 \r
1432         } else if (dm_value[0] == 101) {\r
1433                 pDM_Odm->DebugComponents = 0;\r
1434                 PHYDM_SNPRINTF((output + used, out_len - used, "%s\n", "Disable all debug components"));\r
1435         } else {\r
1436                 if (dm_value[1] == 1) { /*enable*/\r
1437                         pDM_Odm->DebugComponents |= (one << dm_value[0]);\r
1438                 } else if (dm_value[1] == 2) { /*disable*/\r
1439                         pDM_Odm->DebugComponents &= ~(one << dm_value[0]);\r
1440                 } else\r
1441                         PHYDM_SNPRINTF((output + used, out_len - used, "%s\n", "[Warning!!!]  1:enable,  2:disable"));\r
1442         }\r
1443         PHYDM_SNPRINTF((output + used, out_len - used, "pre-DbgComponents = 0x%x\n", pre_debug_components));\r
1444         PHYDM_SNPRINTF((output + used, out_len - used, "Curr-DbgComponents = 0x%x\n", pDM_Odm->DebugComponents));\r
1445         PHYDM_SNPRINTF((output + used, out_len - used, "%s\n", "================================"));\r
1446 }\r
1447 \r
1448 VOID\r
1449 phydm_fw_debug_trace(\r
1450         IN              PVOID           pDM_VOID,\r
1451         IN              u4Byte          *const dm_value,\r
1452         IN              u4Byte          *_used,\r
1453         OUT             char                    *output,\r
1454         IN              u4Byte          *_out_len\r
1455 )\r
1456 {\r
1457         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1458         u4Byte                  pre_fw_debug_components, one = 1;\r
1459         u4Byte                  used = *_used;\r
1460         u4Byte                  out_len = *_out_len;\r
1461 \r
1462         pre_fw_debug_components = pDM_Odm->fw_DebugComponents;\r
1463 \r
1464         PHYDM_SNPRINTF((output + used, out_len - used, "\n%s\n", "================================"));\r
1465         if (dm_value[0] == 100) {\r
1466                 PHYDM_SNPRINTF((output + used, out_len - used, "%s\n", "[FW Debug Component]"));\r
1467                 PHYDM_SNPRINTF((output + used, out_len - used, "%s\n", "================================"));\r
1468                 PHYDM_SNPRINTF((output + used, out_len - used, "00. (( %s ))RA\n", ((pDM_Odm->fw_DebugComponents & PHYDM_FW_COMP_RA) ? ("V") : ("."))));\r
1469                 \r
1470                 if (pDM_Odm->SupportICType & PHYDM_IC_3081_SERIES){\r
1471                         PHYDM_SNPRINTF((output + used, out_len - used, "01. (( %s ))MU\n", ((pDM_Odm->fw_DebugComponents & PHYDM_FW_COMP_MU) ? ("V") : ("."))));\r
1472                         PHYDM_SNPRINTF((output + used, out_len - used, "02. (( %s ))Path Div\n", ((pDM_Odm->fw_DebugComponents & PHYDM_FW_COMP_PHY_CONFIG) ? ("V") : ("."))));\r
1473                         PHYDM_SNPRINTF((output + used, out_len - used, "03. (( %s ))Phy Config\n", ((pDM_Odm->fw_DebugComponents & PHYDM_FW_COMP_PHY_CONFIG) ? ("V") : ("."))));\r
1474                 }\r
1475                 PHYDM_SNPRINTF((output + used, out_len - used, "%s\n", "================================"));\r
1476 \r
1477         } else {\r
1478                 if (dm_value[0] == 101) {\r
1479                         pDM_Odm->fw_DebugComponents = 0;\r
1480                         PHYDM_SNPRINTF((output + used, out_len - used, "%s\n", "Clear all fw debug components"));\r
1481                 } else {\r
1482                         if (dm_value[1] == 1) { /*enable*/\r
1483                                 pDM_Odm->fw_DebugComponents |= (one << dm_value[0]);\r
1484                         } else if (dm_value[1] == 2) { /*disable*/\r
1485                                 pDM_Odm->fw_DebugComponents &= ~(one << dm_value[0]);\r
1486                         } else\r
1487                                 PHYDM_SNPRINTF((output + used, out_len - used, "%s\n", "[Warning!!!]  1:enable,  2:disable"));\r
1488                 }\r
1489 \r
1490                 if (pDM_Odm->fw_DebugComponents == 0) {\r
1491                         pDM_Odm->DebugComponents &= ~ODM_FW_DEBUG_TRACE;\r
1492                         phydm_fw_trace_en_h2c(pDM_Odm, FALSE, pDM_Odm->fw_DebugComponents, dm_value[2], dm_value[3]); /*H2C to enable C2H Msg*/\r
1493                 } else {\r
1494                         pDM_Odm->DebugComponents |= ODM_FW_DEBUG_TRACE;\r
1495                         phydm_fw_trace_en_h2c(pDM_Odm, TRUE, pDM_Odm->fw_DebugComponents, dm_value[2], dm_value[3]); /*H2C to enable C2H Msg*/\r
1496                 }       \r
1497         }\r
1498 }\r
1499 \r
1500 VOID\r
1501 phydm_DumpBbReg(\r
1502         IN              PVOID                   pDM_VOID,\r
1503         IN              u4Byte                  *_used,\r
1504         OUT             char                            *output,\r
1505         IN              u4Byte                  *_out_len\r
1506         )\r
1507 {\r
1508         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1509         u4Byte                  Addr = 0;\r
1510         u4Byte                  used = *_used;\r
1511         u4Byte                  out_len = *_out_len;\r
1512 \r
1513         \r
1514         /* BB Reg, For Nseries IC we only need to dump page8 to pageF using 3 digits*/\r
1515         for (Addr = 0x800; Addr < 0xfff; Addr += 4) {\r
1516                 if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\r
1517                         PHYDM_VAST_INFO_SNPRINTF((output+used, out_len-used, "0x%03x 0x%08x,\n", Addr, ODM_GetBBReg(pDM_Odm, Addr, bMaskDWord)));\r
1518                 else\r
1519                         PHYDM_VAST_INFO_SNPRINTF((output+used, out_len-used, "0x%04x 0x%08x,\n", Addr, ODM_GetBBReg(pDM_Odm, Addr, bMaskDWord)));\r
1520         }\r
1521 \r
1522         if (pDM_Odm->SupportICType & (ODM_RTL8822B | ODM_RTL8814A | ODM_RTL8821C)) {\r
1523 \r
1524                 if (pDM_Odm->RFType > ODM_2T2R) {\r
1525                         for (Addr = 0x1800; Addr < 0x18ff; Addr += 4)\r
1526                                 PHYDM_VAST_INFO_SNPRINTF((output+used, out_len-used, "0x%04x 0x%08x,\n", Addr, ODM_GetBBReg(pDM_Odm, Addr, bMaskDWord)));\r
1527                 }\r
1528 \r
1529                 if (pDM_Odm->RFType > ODM_3T3R) {\r
1530                         for (Addr = 0x1a00; Addr < 0x1aff; Addr += 4)\r
1531                                 PHYDM_VAST_INFO_SNPRINTF((output+used, out_len-used, "0x%04x 0x%08x,\n", Addr, ODM_GetBBReg(pDM_Odm, Addr, bMaskDWord)));\r
1532                 }\r
1533 \r
1534                 for (Addr = 0x1900; Addr < 0x19ff; Addr += 4)\r
1535                         PHYDM_VAST_INFO_SNPRINTF((output+used, out_len-used, "0x%04x 0x%08x,\n", Addr, ODM_GetBBReg(pDM_Odm, Addr, bMaskDWord)));\r
1536 \r
1537                 for (Addr = 0x1c00; Addr < 0x1cff; Addr += 4)\r
1538                         PHYDM_VAST_INFO_SNPRINTF((output+used, out_len-used, "0x%04x 0x%08x,\n", Addr, ODM_GetBBReg(pDM_Odm, Addr, bMaskDWord)));\r
1539 \r
1540                 for (Addr = 0x1f00; Addr < 0x1fff; Addr += 4)\r
1541                         PHYDM_VAST_INFO_SNPRINTF((output+used, out_len-used, "0x%04x 0x%08x,\n", Addr, ODM_GetBBReg(pDM_Odm, Addr, bMaskDWord)));\r
1542         }\r
1543 }\r
1544 \r
1545 VOID\r
1546 phydm_DumpAllReg(\r
1547         IN              PVOID                   pDM_VOID,\r
1548         IN              u4Byte                  *_used,\r
1549         OUT             char                            *output,\r
1550         IN              u4Byte                  *_out_len\r
1551         )\r
1552 {\r
1553         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1554         u4Byte                  Addr = 0;\r
1555         u4Byte                  used = *_used;\r
1556         u4Byte                  out_len = *_out_len;\r
1557 \r
1558         /* dump MAC register */\r
1559         PHYDM_VAST_INFO_SNPRINTF((output+used, out_len-used, "MAC==========\n"));\r
1560         for (Addr = 0; Addr < 0x7ff; Addr += 4)\r
1561                 PHYDM_VAST_INFO_SNPRINTF((output+used, out_len-used, "0x%04x 0x%08x,\n", Addr, ODM_GetBBReg(pDM_Odm, Addr, bMaskDWord)));\r
1562 \r
1563         for (Addr = 0x1000; Addr < 0x17ff; Addr += 4)\r
1564                 PHYDM_VAST_INFO_SNPRINTF((output+used, out_len-used, "0x%04x 0x%08x,\n", Addr, ODM_GetBBReg(pDM_Odm, Addr, bMaskDWord)));\r
1565 \r
1566         /* dump BB register */\r
1567         PHYDM_VAST_INFO_SNPRINTF((output+used, out_len-used, "BB==========\n"));\r
1568         phydm_DumpBbReg(pDM_Odm, &used, output, &out_len);\r
1569 \r
1570         /* dump RF register */\r
1571         PHYDM_VAST_INFO_SNPRINTF((output+used, out_len-used, "RF-A==========\n"));\r
1572         for (Addr = 0; Addr < 0xFF; Addr++)\r
1573                 PHYDM_VAST_INFO_SNPRINTF((output+used, out_len-used, "0x%02x 0x%05x,\n", Addr, ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, Addr, bRFRegOffsetMask)));\r
1574 \r
1575         if (pDM_Odm->RFType > ODM_1T1R) {\r
1576                 PHYDM_VAST_INFO_SNPRINTF((output+used, out_len-used, "RF-B==========\n"));\r
1577                 for (Addr = 0; Addr < 0xFF; Addr++)\r
1578                         PHYDM_VAST_INFO_SNPRINTF((output+used, out_len-used, "0x%02x 0x%05x,\n", Addr, ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, Addr, bRFRegOffsetMask)));\r
1579         }\r
1580 \r
1581         if (pDM_Odm->RFType > ODM_2T2R) {\r
1582                 PHYDM_VAST_INFO_SNPRINTF((output+used, out_len-used, "RF-C==========\n"));\r
1583                 for (Addr = 0; Addr < 0xFF; Addr++)\r
1584                         PHYDM_VAST_INFO_SNPRINTF((output+used, out_len-used, "0x%02x 0x%05x,\n", Addr, ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_C, Addr, bRFRegOffsetMask)));\r
1585         }\r
1586 \r
1587         if (pDM_Odm->RFType > ODM_3T3R) {\r
1588                 PHYDM_VAST_INFO_SNPRINTF((output+used, out_len-used, "RF-D==========\n"));\r
1589                 for (Addr = 0; Addr < 0xFF; Addr++)\r
1590                         PHYDM_VAST_INFO_SNPRINTF((output+used, out_len-used, "0x%02x 0x%05x,\n", Addr, ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_D, Addr, bRFRegOffsetMask)));\r
1591         }\r
1592 }\r
1593 \r
1594 VOID\r
1595 phydm_EnableBigJump(\r
1596         IN      PDM_ODM_T       pDM_Odm,\r
1597         IN      BOOLEAN         state\r
1598         )\r
1599 {\r
1600 #if (RTL8822B_SUPPORT == 1)\r
1601         pDIG_T                  pDM_DigTable = &pDM_Odm->DM_DigTable;\r
1602 \r
1603         if (state == FALSE) {\r
1604                 pDM_Odm->DM_DigTable.enableAdjustBigJump = FALSE;\r
1605                 ODM_SetBBReg(pDM_Odm, 0x8c8, 0xfe, ((pDM_DigTable->bigJumpStep3<<5)|(pDM_DigTable->bigJumpStep2<<3)|pDM_DigTable->bigJumpStep1));\r
1606         } else\r
1607                 pDM_Odm->DM_DigTable.enableAdjustBigJump = TRUE;\r
1608 #endif\r
1609 }\r
1610 \r
1611 #if (RTL8822B_SUPPORT == 1)  \r
1612 \r
1613 VOID\r
1614 phydm_showRxRate(\r
1615         IN      PDM_ODM_T                       pDM_Odm,\r
1616         IN              u4Byte                  *_used,\r
1617         OUT             char                            *output,\r
1618         IN              u4Byte                  *_out_len\r
1619         )\r
1620 {\r
1621         u4Byte                  used = *_used;\r
1622         u4Byte                  out_len = *_out_len;\r
1623 \r
1624         PHYDM_SNPRINTF((output+used, out_len-used, "=====Rx SU Rate Statistics=====\n"));\r
1625         PHYDM_SNPRINTF((output+used, out_len-used, "1SS MCS0 = %d, 1SS MCS1 = %d, 1SS MCS2 = %d, 1SS MCS 3 = %d\n",\r
1626                 pDM_Odm->PhyDbgInfo.NumQryVhtPkt[0], pDM_Odm->PhyDbgInfo.NumQryVhtPkt[1], pDM_Odm->PhyDbgInfo.NumQryVhtPkt[2], pDM_Odm->PhyDbgInfo.NumQryVhtPkt[3]));\r
1627         PHYDM_SNPRINTF((output+used, out_len-used, "1SS MCS4 = %d, 1SS MCS5 = %d, 1SS MCS6 = %d, 1SS MCS 7 = %d\n",\r
1628                 pDM_Odm->PhyDbgInfo.NumQryVhtPkt[4], pDM_Odm->PhyDbgInfo.NumQryVhtPkt[5], pDM_Odm->PhyDbgInfo.NumQryVhtPkt[6], pDM_Odm->PhyDbgInfo.NumQryVhtPkt[7]));\r
1629         PHYDM_SNPRINTF((output+used, out_len-used, "1SS MCS8 = %d, 1SS MCS9 = %d\n",\r
1630                 pDM_Odm->PhyDbgInfo.NumQryVhtPkt[8], pDM_Odm->PhyDbgInfo.NumQryVhtPkt[9]));\r
1631         PHYDM_SNPRINTF((output+used, out_len-used, "2SS MCS0 = %d, 2SS MCS1 = %d, 2SS MCS2 = %d, 2SS MCS 3 = %d\n",\r
1632                 pDM_Odm->PhyDbgInfo.NumQryVhtPkt[10], pDM_Odm->PhyDbgInfo.NumQryVhtPkt[11], pDM_Odm->PhyDbgInfo.NumQryVhtPkt[12], pDM_Odm->PhyDbgInfo.NumQryVhtPkt[13]));\r
1633         PHYDM_SNPRINTF((output+used, out_len-used, "2SS MCS4 = %d, 2SS MCS5 = %d, 2SS MCS6 = %d, 2SS MCS 7 = %d\n",\r
1634                 pDM_Odm->PhyDbgInfo.NumQryVhtPkt[14], pDM_Odm->PhyDbgInfo.NumQryVhtPkt[15], pDM_Odm->PhyDbgInfo.NumQryVhtPkt[16], pDM_Odm->PhyDbgInfo.NumQryVhtPkt[17]));\r
1635         PHYDM_SNPRINTF((output+used, out_len-used, "2SS MCS8 = %d, 2SS MCS9 = %d\n",\r
1636                 pDM_Odm->PhyDbgInfo.NumQryVhtPkt[18], pDM_Odm->PhyDbgInfo.NumQryVhtPkt[19]));\r
1637                         \r
1638         PHYDM_SNPRINTF((output+used, out_len-used, "=====Rx MU Rate Statistics=====\n"));\r
1639         PHYDM_SNPRINTF((output+used, out_len-used, "1SS MCS0 = %d, 1SS MCS1 = %d, 1SS MCS2 = %d, 1SS MCS 3 = %d\n",\r
1640                 pDM_Odm->PhyDbgInfo.NumQryMuVhtPkt[0], pDM_Odm->PhyDbgInfo.NumQryMuVhtPkt[1], pDM_Odm->PhyDbgInfo.NumQryMuVhtPkt[2], pDM_Odm->PhyDbgInfo.NumQryMuVhtPkt[3]));\r
1641         PHYDM_SNPRINTF((output+used, out_len-used, "1SS MCS4 = %d, 1SS MCS5 = %d, 1SS MCS6 = %d, 1SS MCS 7 = %d\n",\r
1642                 pDM_Odm->PhyDbgInfo.NumQryMuVhtPkt[4], pDM_Odm->PhyDbgInfo.NumQryMuVhtPkt[5], pDM_Odm->PhyDbgInfo.NumQryMuVhtPkt[6], pDM_Odm->PhyDbgInfo.NumQryMuVhtPkt[7]));\r
1643         PHYDM_SNPRINTF((output+used, out_len-used, "1SS MCS8 = %d, 1SS MCS9 = %d\n",\r
1644                 pDM_Odm->PhyDbgInfo.NumQryMuVhtPkt[8], pDM_Odm->PhyDbgInfo.NumQryMuVhtPkt[9]));\r
1645         PHYDM_SNPRINTF((output+used, out_len-used, "2SS MCS0 = %d, 2SS MCS1 = %d, 2SS MCS2 = %d, 2SS MCS 3 = %d\n",\r
1646                 pDM_Odm->PhyDbgInfo.NumQryMuVhtPkt[10], pDM_Odm->PhyDbgInfo.NumQryMuVhtPkt[11], pDM_Odm->PhyDbgInfo.NumQryMuVhtPkt[12], pDM_Odm->PhyDbgInfo.NumQryMuVhtPkt[13]));\r
1647         PHYDM_SNPRINTF((output+used, out_len-used, "2SS MCS4 = %d, 2SS MCS5 = %d, 2SS MCS6 = %d, 2SS MCS 7 = %d\n",\r
1648                 pDM_Odm->PhyDbgInfo.NumQryMuVhtPkt[14], pDM_Odm->PhyDbgInfo.NumQryMuVhtPkt[15], pDM_Odm->PhyDbgInfo.NumQryMuVhtPkt[16], pDM_Odm->PhyDbgInfo.NumQryMuVhtPkt[17]));\r
1649         PHYDM_SNPRINTF((output+used, out_len-used, "2SS MCS8 = %d, 2SS MCS9 = %d\n",\r
1650                 pDM_Odm->PhyDbgInfo.NumQryMuVhtPkt[18], pDM_Odm->PhyDbgInfo.NumQryMuVhtPkt[19]));\r
1651 \r
1652 }\r
1653 \r
1654 #endif\r
1655 \r
1656 \r
1657 struct _PHYDM_COMMAND {\r
1658         char name[16];\r
1659         u1Byte id;\r
1660 };\r
1661 \r
1662 enum PHYDM_CMD_ID {\r
1663         PHYDM_HELP,\r
1664         PHYDM_DEMO,\r
1665         PHYDM_RA,\r
1666         PHYDM_PROFILE,\r
1667         PHYDM_ANTDIV,\r
1668         PHYDM_PATHDIV,\r
1669         PHYDM_DEBUG,\r
1670         PHYDM_FW_DEBUG,\r
1671         PHYDM_SUPPORT_ABILITY,\r
1672         PHYDM_GET_TXAGC,\r
1673         PHYDM_SET_TXAGC,\r
1674         PHYDM_SMART_ANT,\r
1675         PHYDM_API,\r
1676         PHYDM_TRX_PATH,\r
1677         PHYDM_LA_MODE,\r
1678         PHYDM_DUMP_REG,\r
1679         PHYDM_MU_MIMO,\r
1680         PHYDM_HANG,\r
1681         PHYDM_BIG_JUMP,\r
1682         PHYDM_SHOW_RXRATE,\r
1683         PHYDM_NBI_EN,\r
1684         PHYDM_CSI_MASK_EN,\r
1685         PHYDM_DFS,\r
1686         PHYDM_IQK,\r
1687         PHYDM_NHM,\r
1688         PHYDM_CLM,\r
1689         PHYDM_BB_INFO,\r
1690         PHYDM_TXBF,\r
1691         PHYDM_PAUSE_DIG_EN,\r
1692         PHYDM_H2C,\r
1693         PHYDM_ANT_SWITCH\r
1694 };\r
1695 \r
1696 struct _PHYDM_COMMAND phy_dm_ary[] = {\r
1697         {"-h", PHYDM_HELP},             /*do not move this element to other position*/\r
1698         {"demo", PHYDM_DEMO},   /*do not move this element to other position*/\r
1699         {"ra", PHYDM_RA},\r
1700         {"profile", PHYDM_PROFILE},\r
1701         {"antdiv", PHYDM_ANTDIV},\r
1702         {"pathdiv", PHYDM_PATHDIV},\r
1703         {"dbg", PHYDM_DEBUG},\r
1704         {"fw_dbg", PHYDM_FW_DEBUG},\r
1705         {"ability", PHYDM_SUPPORT_ABILITY},\r
1706         {"get_txagc", PHYDM_GET_TXAGC},\r
1707         {"set_txagc", PHYDM_SET_TXAGC},\r
1708         {"smtant", PHYDM_SMART_ANT},\r
1709         {"api", PHYDM_API},\r
1710         {"trxpath", PHYDM_TRX_PATH},\r
1711         {"lamode", PHYDM_LA_MODE},\r
1712         {"dumpreg", PHYDM_DUMP_REG},\r
1713         {"mu", PHYDM_MU_MIMO},\r
1714         {"hang", PHYDM_HANG},\r
1715         {"bigjump", PHYDM_BIG_JUMP},\r
1716         {"rxrate", PHYDM_SHOW_RXRATE},\r
1717         {"nbi", PHYDM_NBI_EN},\r
1718         {"csi_mask", PHYDM_CSI_MASK_EN},\r
1719         {"dfs", PHYDM_DFS},\r
1720         {"iqk", PHYDM_IQK},\r
1721         {"nhm", PHYDM_NHM},\r
1722         {"clm", PHYDM_CLM},\r
1723         {"bbinfo", PHYDM_BB_INFO},\r
1724         {"txbf", PHYDM_TXBF},\r
1725         {"pause_dig", PHYDM_PAUSE_DIG_EN},\r
1726         {"h2c", PHYDM_H2C},\r
1727         {"ant_switch", PHYDM_ANT_SWITCH}\r
1728 };\r
1729 \r
1730 VOID\r
1731 phydm_cmd_parser(\r
1732         IN PDM_ODM_T    pDM_Odm,\r
1733         IN char         input[][MAX_ARGV],\r
1734         IN u4Byte       input_num,\r
1735         IN u1Byte       flag,\r
1736         OUT char        *output,\r
1737         IN u4Byte       out_len\r
1738 )\r
1739 {\r
1740         u4Byte used = 0;\r
1741         u1Byte id = 0;\r
1742         int var1[10] = {0};\r
1743         int i, input_idx = 0, phydm_ary_size;\r
1744         char help[] = "-h";\r
1745 \r
1746         if (flag == 0) {\r
1747                 PHYDM_SNPRINTF((output + used, out_len - used, "GET, nothing to print\n"));\r
1748                 return;\r
1749         }\r
1750 \r
1751         PHYDM_SNPRINTF((output + used, out_len - used, "\n"));\r
1752 \r
1753         //Parsing Cmd ID\r
1754         if (input_num) {\r
1755 \r
1756                 phydm_ary_size = sizeof(phy_dm_ary) / sizeof(struct _PHYDM_COMMAND);\r
1757                 for (i = 0; i < phydm_ary_size; i++) {\r
1758                         if (strcmp(phy_dm_ary[i].name, input[0]) == 0) {\r
1759                                 id = phy_dm_ary[i].id;\r
1760                                 break;\r
1761                         }\r
1762                 }\r
1763                 if (i == phydm_ary_size) {\r
1764                         PHYDM_SNPRINTF((output + used, out_len - used, "SET, command not found!\n"));\r
1765                         return;\r
1766                 }\r
1767         }\r
1768 \r
1769         switch (id) {\r
1770 \r
1771         case PHYDM_HELP:\r
1772         {\r
1773                 PHYDM_SNPRINTF((output + used, out_len - used, "BB cmd ==>\n"));\r
1774                 for (i=0; i < phydm_ary_size-2; i++) {\r
1775 \r
1776                                 PHYDM_SNPRINTF((output + used, out_len - used, "  %-5d: %s\n", i, phy_dm_ary[i+2].name));\r
1777                                 /**/\r
1778                 }\r
1779         }\r
1780         break;\r
1781 \r
1782         case PHYDM_DEMO: /*echo demo 10 0x3a z abcde >cmd*/\r
1783         {\r
1784                 u4Byte directory = 0;\r
1785 \r
1786                 #if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_AP))                             \r
1787                 char char_temp;\r
1788                 #else\r
1789                 u4Byte char_temp = ' ';\r
1790                 #endif\r
1791 \r
1792                 PHYDM_SSCANF(input[1], DCMD_DECIMAL, &directory);\r
1793                 PHYDM_SNPRINTF((output + used, out_len - used, "Decimal Value = %d\n", directory));\r
1794                 PHYDM_SSCANF(input[2], DCMD_HEX, &directory);\r
1795                 PHYDM_SNPRINTF((output + used, out_len - used, "Hex Value = 0x%x\n", directory));\r
1796                 PHYDM_SSCANF(input[3], DCMD_CHAR, &char_temp);\r
1797                 PHYDM_SNPRINTF((output + used, out_len - used, "Char = %c\n", char_temp));\r
1798                 PHYDM_SNPRINTF((output + used, out_len - used, "String = %s\n", input[4]));\r
1799         }\r
1800         break;\r
1801 \r
1802         case PHYDM_RA:\r
1803 \r
1804                 for (i = 0; i < 5; i++) {\r
1805                         if (input[i + 1]) {\r
1806                                 PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);\r
1807 \r
1808                                 /*PHYDM_SNPRINTF((output + used, out_len - used, "new SET, RA_var[%d]= (( %d ))\n", i , var1[i]));*/\r
1809                                 input_idx++;\r
1810                         }\r
1811                 }\r
1812 \r
1813                 if (input_idx >= 1) {\r
1814                         /*PHYDM_SNPRINTF((output+used, out_len-used, "odm_RA_debug\n"));*/\r
1815                         #if (defined(CONFIG_RA_DBG_CMD))\r
1816                         odm_RA_debug((PVOID)pDM_Odm, (pu4Byte) var1);\r
1817                         #else\r
1818                         phydm_RA_debug_PCR(pDM_Odm, (u4Byte *)var1, &used, output, &out_len);\r
1819                         #endif\r
1820                 }\r
1821 \r
1822 \r
1823                 break;\r
1824                 \r
1825         case PHYDM_ANTDIV:\r
1826 \r
1827                 for (i = 0; i < 5; i++) {\r
1828                         if (input[i + 1]) {\r
1829                                 PHYDM_SSCANF(input[i + 1], DCMD_HEX, &var1[i]);\r
1830 \r
1831                                 /*PHYDM_SNPRINTF((output+used, out_len-used, "new SET, PATHDIV_var[%d]= (( %d ))\n", i , var1[i]));*/\r
1832                                 input_idx++;\r
1833                         }\r
1834                 }\r
1835 \r
1836                 if (input_idx >= 1) {\r
1837                         /*PHYDM_SNPRINTF((output+used, out_len-used, "odm_PATHDIV_debug\n"));*/\r
1838                         #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))\r
1839                         phydm_antdiv_debug(pDM_Odm, (u4Byte *)var1, &used, output, &out_len);\r
1840                         #endif\r
1841                 }\r
1842 \r
1843                 break;\r
1844 \r
1845         case PHYDM_PATHDIV:\r
1846 \r
1847                 for (i = 0; i < 5; i++) {\r
1848                         if (input[i + 1]) {\r
1849                                 PHYDM_SSCANF(input[i + 1], DCMD_HEX, &var1[i]);\r
1850 \r
1851                                 /*PHYDM_SNPRINTF((output+used, out_len-used, "new SET, PATHDIV_var[%d]= (( %d ))\n", i , var1[i]));*/\r
1852                                 input_idx++;\r
1853                         }\r
1854                 }\r
1855 \r
1856                 if (input_idx >= 1) {\r
1857                         /*PHYDM_SNPRINTF((output+used, out_len-used, "odm_PATHDIV_debug\n"));*/\r
1858 #if (defined(CONFIG_PATH_DIVERSITY))\r
1859                         odm_pathdiv_debug(pDM_Odm, (u4Byte *)var1, &used, output, &out_len);\r
1860 #endif\r
1861                 }\r
1862 \r
1863                 break;\r
1864 \r
1865         case PHYDM_DEBUG:\r
1866 \r
1867                 for (i = 0; i < 5; i++) {\r
1868                         if (input[i + 1]) {\r
1869                                 PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);\r
1870 \r
1871                                 /*PHYDM_SNPRINTF((output+used, out_len-used, "new SET, Debug_var[%d]= (( %d ))\n", i , var1[i]));*/\r
1872                                 input_idx++;\r
1873                         }\r
1874                 }\r
1875 \r
1876                 if (input_idx >= 1) {\r
1877                         /*PHYDM_SNPRINTF((output+used, out_len-used, "odm_debug_comp\n"));*/\r
1878                         phydm_debug_trace(pDM_Odm, (u4Byte *)var1, &used, output, &out_len);\r
1879                 }\r
1880 \r
1881 \r
1882                 break;\r
1883                 \r
1884         case PHYDM_FW_DEBUG:\r
1885 \r
1886                 for (i = 0; i < 5; i++) {\r
1887                         if (input[i + 1]) {\r
1888                                 PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);\r
1889                                 input_idx++;\r
1890                         }\r
1891                 }\r
1892 \r
1893                 if (input_idx >= 1) \r
1894                         phydm_fw_debug_trace(pDM_Odm, (u4Byte *)var1, &used, output, &out_len);\r
1895 \r
1896                 break;\r
1897                 \r
1898         case PHYDM_SUPPORT_ABILITY:\r
1899 \r
1900                 for (i = 0; i < 5; i++) {\r
1901                         if (input[i + 1]) {\r
1902                                 PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);\r
1903 \r
1904                                 /*PHYDM_SNPRINTF((output+used, out_len-used, "new SET, support ablity_var[%d]= (( %d ))\n", i , var1[i]));*/\r
1905                                 input_idx++;\r
1906                         }\r
1907                 }\r
1908 \r
1909                 if (input_idx >= 1) {\r
1910                         /*PHYDM_SNPRINTF((output+used, out_len-used, "support ablity\n"));*/\r
1911                         phydm_support_ability_debug(pDM_Odm, (u4Byte *)var1, &used, output, &out_len);\r
1912                 }\r
1913 \r
1914                 break;\r
1915                 \r
1916         case PHYDM_SMART_ANT:\r
1917 \r
1918                 for (i = 0; i < 5; i++) {\r
1919                         if (input[i + 1]) {\r
1920                                 PHYDM_SSCANF(input[i + 1], DCMD_HEX, &var1[i]);\r
1921                                 input_idx++;\r
1922                         }\r
1923                 }\r
1924 \r
1925                 if (input_idx >= 1) {\r
1926                         #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))\r
1927                         #ifdef CONFIG_HL_SMART_ANTENNA_TYPE1\r
1928                         phydm_hl_smart_ant_debug(pDM_Odm, (u4Byte *)var1, &used, output, &out_len);\r
1929                         #endif\r
1930                         #endif\r
1931                 }\r
1932 \r
1933                 break;\r
1934 \r
1935         case PHYDM_API:\r
1936 #if (RTL8822B_SUPPORT == 1 || RTL8197F_SUPPORT == 1 || RTL8821C_SUPPORT == 1)\r
1937         {\r
1938                 if (pDM_Odm->SupportICType & (ODM_RTL8822B|ODM_RTL8197F | ODM_RTL8821C)) {\r
1939                         BOOLEAN bEnableDbgMode;\r
1940                         u1Byte central_ch, primary_ch_idx, bandwidth;\r
1941                         \r
1942                         for (i = 0; i < 4; i++) {\r
1943                                 if (input[i + 1])\r
1944                                         PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);\r
1945                         }\r
1946                         \r
1947                         bEnableDbgMode = (BOOLEAN)var1[0];\r
1948                         central_ch = (u1Byte) var1[1];\r
1949                         primary_ch_idx = (u1Byte) var1[2];\r
1950                         bandwidth = (ODM_BW_E) var1[3];\r
1951 \r
1952                         if (bEnableDbgMode) {\r
1953                                 pDM_Odm->bDisablePhyApi = FALSE;\r
1954                                 phydm_api_switch_bw_channel(pDM_Odm, central_ch, primary_ch_idx, (ODM_BW_E) bandwidth);\r
1955                                 pDM_Odm->bDisablePhyApi = TRUE;\r
1956                                 PHYDM_SNPRINTF((output+used, out_len-used, "central_ch = %d, primary_ch_idx = %d, bandwidth = %d\n", central_ch, primary_ch_idx, bandwidth));\r
1957                         } else {\r
1958                                 pDM_Odm->bDisablePhyApi = FALSE;\r
1959                                 PHYDM_SNPRINTF((output+used, out_len-used, "Disable API debug mode\n"));\r
1960                         }\r
1961                 } else\r
1962                         PHYDM_SNPRINTF((output+used, out_len-used, "This IC doesn't support PHYDM API function\n"));\r
1963         }\r
1964 #else\r
1965                 PHYDM_SNPRINTF((output+used, out_len-used, "This IC doesn't support PHYDM API function\n"));\r
1966 #endif\r
1967                 break;  \r
1968                 \r
1969         case PHYDM_PROFILE: /*echo profile, >cmd*/\r
1970                 phydm_BasicProfile(pDM_Odm, &used, output, &out_len);\r
1971                 break;\r
1972 \r
1973         case PHYDM_GET_TXAGC:\r
1974                 phydm_get_txagc(pDM_Odm, &used, output, &out_len);\r
1975                 break;\r
1976                 \r
1977         case PHYDM_SET_TXAGC:\r
1978         {\r
1979                 BOOLEAN         bEnableDbgMode;\r
1980                 \r
1981                 for (i = 0; i < 5; i++) {\r
1982                         if (input[i + 1]) {\r
1983                                 PHYDM_SSCANF(input[i + 1], DCMD_HEX, &var1[i]);\r
1984                                 input_idx++;\r
1985                         }\r
1986                 }\r
1987                 \r
1988                 if ((strcmp(input[1], help) == 0)) {\r
1989                         PHYDM_SNPRINTF((output+used, out_len-used, "{En} {pathA~D(0~3)} {rate_idx(Hex), All_rate:0xff} {txagc_idx (Hex)}\n"));\r
1990                         /**/\r
1991                         \r
1992                 } else {\r
1993 \r
1994                         bEnableDbgMode = (BOOLEAN)var1[0];\r
1995                         if (bEnableDbgMode) {\r
1996                                 pDM_Odm->bDisablePhyApi = FALSE;\r
1997                                 phydm_set_txagc(pDM_Odm, (u4Byte *)var1, &used, output, &out_len);\r
1998                                 pDM_Odm->bDisablePhyApi = TRUE;\r
1999                         } else {\r
2000                                 pDM_Odm->bDisablePhyApi = FALSE;\r
2001                                 PHYDM_SNPRINTF((output+used, out_len-used, "Disable API debug mode\n"));\r
2002                         }\r
2003                 }\r
2004         }\r
2005                 break;\r
2006                 \r
2007         case PHYDM_TRX_PATH:\r
2008 \r
2009                 for (i = 0; i < 4; i++) {\r
2010                         if (input[i + 1])\r
2011                                 PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);\r
2012                 }\r
2013                 #if (RTL8822B_SUPPORT == 1 || RTL8197F_SUPPORT == 1)\r
2014                 if (pDM_Odm->SupportICType & (ODM_RTL8822B|ODM_RTL8197F)) {\r
2015                         u1Byte          TxPath, RxPath;\r
2016                         BOOLEAN         bEnableDbgMode, bTx2Path;\r
2017                         \r
2018                         bEnableDbgMode = (BOOLEAN)var1[0];\r
2019                         TxPath = (u1Byte) var1[1];\r
2020                         RxPath = (u1Byte) var1[2];\r
2021                         bTx2Path = (BOOLEAN) var1[3];\r
2022 \r
2023                         if (bEnableDbgMode) {\r
2024                                 pDM_Odm->bDisablePhyApi = FALSE;\r
2025                                 phydm_api_trx_mode(pDM_Odm, (ODM_RF_PATH_E) TxPath, (ODM_RF_PATH_E) RxPath, bTx2Path);\r
2026                                 pDM_Odm->bDisablePhyApi = TRUE;\r
2027                                 PHYDM_SNPRINTF((output+used, out_len-used, "TxPath = 0x%x, RxPath = 0x%x, bTx2Path = %d\n", TxPath, RxPath, bTx2Path));\r
2028                         } else {\r
2029                                 pDM_Odm->bDisablePhyApi = FALSE;\r
2030                                 PHYDM_SNPRINTF((output+used, out_len-used, "Disable API debug mode\n"));\r
2031                         }\r
2032                 } else\r
2033                 #endif\r
2034                         phydm_config_trx_path(pDM_Odm, (u4Byte *)var1, &used, output, &out_len);\r
2035 \r
2036                 break;\r
2037 \r
2038         case PHYDM_LA_MODE:\r
2039 #if (PHYDM_LA_MODE_SUPPORT == 1)\r
2040         \r
2041                 if (pDM_Odm->SupportICType & PHYDM_IC_SUPPORT_LA_MODE) {\r
2042                         u2Byte          PollingTime;\r
2043                         u1Byte          TrigSel, TrigSigSel, DmaDataSigSel, TriggerTime_unit_num;\r
2044                         BOOLEAN         bEnableLaMode, bTriggerEdge;\r
2045                         u4Byte          DbgPort, TriggerTime_mu_sec;\r
2046                         u1Byte          sampling_rate = 0;\r
2047 \r
2048                         for (i = 0; i < 6; i++) {\r
2049                                 if (input[i + 1])\r
2050                                         PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);\r
2051                         }\r
2052 \r
2053                         bEnableLaMode = (BOOLEAN)var1[0];\r
2054                         DbgPrint("echo cmd input_num = %d\n", input_num);\r
2055                         /* if ((strcmp(input[1], help) == 0) && (input_num == 2)) {*/\r
2056                         if ((strcmp(input[1], help) == 0)) {\r
2057                                 PHYDM_SNPRINTF((output+used, out_len-used, "{En} {0:BB,1:MAC} {BB:DbgPort[bit],MAC:0-ok/1-fail/2-cca} {RptFormat} {TrigTime} \n {PollingTime} {DbgPort} {0:P_Edge, 1:N_Edge} {SpRate:0-80M,1-40M,2-20M} {Capture num}\n"));\r
2058                                 /**/\r
2059                         /*} else if ((bEnableLaMode == 1) && (input_num == 10)) {*/\r
2060                         } else if ((bEnableLaMode == 1)) {\r
2061                                 TrigSel = (u1Byte)var1[1]; /*0: BB, 1: MAC*/\r
2062                                 TrigSigSel = (u1Byte)var1[2];\r
2063                                 DmaDataSigSel = (u1Byte)var1[3];\r
2064                                 TriggerTime_mu_sec = var1[4]; /*unit: us*/\r
2065                                 PollingTime = (((u1Byte)var1[5]) << 6); /*unit: ms*/\r
2066                                 \r
2067                                 PHYDM_SSCANF(input[7], DCMD_HEX, &var1[6]);\r
2068                                 PHYDM_SSCANF(input[8], DCMD_DECIMAL, &var1[7]);\r
2069                                 PHYDM_SSCANF(input[9], DCMD_DECIMAL, &var1[8]);\r
2070                                 PHYDM_SSCANF(input[10], DCMD_DECIMAL, &var1[9]);\r
2071 \r
2072                                 DbgPort = (u4Byte)var1[6];\r
2073                                 bTriggerEdge = (BOOLEAN) var1[7];\r
2074                                 sampling_rate = var1[8] & 0x7;\r
2075 \r
2076                                 #if 1\r
2077                                 TriggerTime_unit_num = phydm_la_mode_mac_setting(pDM_Odm, TriggerTime_mu_sec);\r
2078                                 phydm_la_mode_bb_setting(pDM_Odm, DbgPort, bTriggerEdge, sampling_rate);\r
2079                                 #else\r
2080                                 if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) {\r
2081                                         ODM_SetBBReg(pDM_Odm, 0x198C , BIT2|BIT1|BIT0, 7); /*disable dbg clk gating*/\r
2082                                         ODM_SetBBReg(pDM_Odm, 0x8FC, bMaskDWord, DbgPort);\r
2083                                         ODM_SetBBReg(pDM_Odm, 0x95C , BIT31, bTriggerEdge); /*0: posedge, 1: negedge*/\r
2084                                         ODM_SetBBReg(pDM_Odm, 0x95c, 0xe0, sampling_rate);\r
2085                                 } else {\r
2086                                         ODM_SetBBReg(pDM_Odm, 0x908, bMaskDWord, DbgPort);\r
2087                                         ODM_SetBBReg(pDM_Odm, 0x9A0 , BIT31, bTriggerEdge); /*0: posedge, 1: negedge*/\r
2088                                         ODM_SetBBReg(pDM_Odm, 0x9A0, 0xe0, sampling_rate);\r
2089                                 }\r
2090                                 #endif\r
2091 \r
2092                                 pDM_Odm->ADCSmp_dbg_port = DbgPort;\r
2093                                 pDM_Odm->ADCSmp_trigger_edge = bTriggerEdge;\r
2094                                 pDM_Odm->ADCsmp_smp_rate = sampling_rate;\r
2095                                 pDM_Odm->ADCSmp_count = var1[9];\r
2096 \r
2097                                 DbgPrint("echo lamode %d %d %d %d %d %d %x %d %d %d\n", var1[0], var1[1], var1[2], var1[3], var1[4], var1[5], var1[6], var1[7], var1[8], var1[9]);\r
2098                                 \r
2099                                 ADCSmp_Set(pDM_Odm, (RT_ADCSMP_TRIG_SEL) TrigSel, (RT_ADCSMP_TRIG_SIG_SEL) TrigSigSel, DmaDataSigSel, TriggerTime_unit_num, PollingTime);\r
2100 \r
2101                                 PHYDM_SNPRINTF((output+used, out_len-used, "TrigSel = ((%s)), TrigSigSel = ((%d)), DmaDataSigSel = ((%d))\n", ((TrigSel)?"MAC":"BB"), TrigSigSel, DmaDataSigSel));\r
2102                                 PHYDM_SNPRINTF((output+used, out_len-used, "TriggerTime = ((%d * %d us)), PollingTime = ((%d)), sampling rate = ((%d MHz))\n", \r
2103                                         TriggerTime_unit_num, ((pDM_Odm->ADCsmp_time_unit == 0) ? 1 : (2<<(pDM_Odm->ADCsmp_time_unit-1))), PollingTime, (80>>sampling_rate)));\r
2104                         } else {\r
2105                                 ADCSmp_Stop(pDM_Odm);\r
2106                                 PHYDM_SNPRINTF((output+used, out_len-used, "Disable LA mode\n"));\r
2107                         }\r
2108                 } else\r
2109                 #endif\r
2110                         PHYDM_SNPRINTF((output+used, out_len-used, "This IC doesn't support LA mode\n"));\r
2111                 break;\r
2112 \r
2113         case PHYDM_DUMP_REG:\r
2114         {\r
2115                 u1Byte  type = 0;\r
2116                 \r
2117                 if (input[1]) {\r
2118                         PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);\r
2119                         type = (u1Byte)var1[0];\r
2120                 }\r
2121 \r
2122                 if (type == 0)\r
2123                         phydm_DumpBbReg(pDM_Odm, &used, output, &out_len);\r
2124                 else if (type == 1)\r
2125                         phydm_DumpAllReg(pDM_Odm, &used, output, &out_len);\r
2126         }\r
2127                 break;\r
2128 \r
2129         case PHYDM_MU_MIMO:\r
2130 #if (RTL8822B_SUPPORT == 1)\r
2131                 \r
2132                 if (input[1])\r
2133                         PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);\r
2134                 else\r
2135                         var1[0] = 0;\r
2136                 \r
2137                 if (var1[0] == 1) {\r
2138                         int index, ptr;\r
2139                         u4Byte Dword_H, Dword_L;\r
2140 \r
2141                         PHYDM_SNPRINTF((output+used, out_len-used, "Get MU BFee CSI\n"));\r
2142                         ODM_SetBBReg(pDM_Odm, 0x9e8, BIT17|BIT16, 2); /*Read BFee*/\r
2143                         ODM_SetBBReg(pDM_Odm, 0x1910, BIT15, 1); /*Select BFee's CSI report*/\r
2144                         ODM_SetBBReg(pDM_Odm, 0x19b8, BIT6, 1); /*set as CSI report*/\r
2145                         ODM_SetBBReg(pDM_Odm, 0x19a8, 0xFFFF, 0xFFFF); /*disable gated_clk*/\r
2146 \r
2147                         for (index = 0; index < 80; index++) {\r
2148                                 ptr = index + 256;\r
2149                                 if (ptr > 311)\r
2150                                         ptr -= 312;\r
2151                                 ODM_SetBBReg(pDM_Odm, 0x1910, 0x03FF0000, ptr); /*Select Address*/\r
2152                                 Dword_H = ODM_GetBBReg(pDM_Odm, 0xF74, bMaskDWord);\r
2153                                 Dword_L = ODM_GetBBReg(pDM_Odm, 0xF5C, bMaskDWord);\r
2154                                 if (index % 2 == 0)\r
2155                                         PHYDM_SNPRINTF((output+used, out_len-used, "%02x  %02x  %02x  %02x  %02x  %02x  %02x  %02x\n", \r
2156                                         Dword_L & bMaskByte0, (Dword_L & bMaskByte1) >> 8, (Dword_L & bMaskByte2) >> 16, (Dword_L & bMaskByte3) >> 24,\r
2157                                         Dword_H & bMaskByte0, (Dword_H & bMaskByte1) >> 8, (Dword_H & bMaskByte2) >> 16, (Dword_H & bMaskByte3) >> 24));\r
2158                                 else\r
2159                                         PHYDM_SNPRINTF((output+used, out_len-used, "%02x  %02x  %02x  %02x  %02x  %02x  %02x  %02x\n", \r
2160                                         Dword_L & bMaskByte0, (Dword_L & bMaskByte1) >> 8, (Dword_L & bMaskByte2) >> 16, (Dword_L & bMaskByte3) >> 24,\r
2161                                         Dword_H & bMaskByte0, (Dword_H & bMaskByte1) >> 8, (Dword_H & bMaskByte2) >> 16, (Dword_H & bMaskByte3) >> 24));\r
2162                         }\r
2163                 } else if (var1[0] == 2) {\r
2164                         int index, ptr;\r
2165                         u4Byte Dword_H, Dword_L;\r
2166 \r
2167                         PHYDM_SSCANF(input[2], DCMD_DECIMAL, &var1[1]);\r
2168                         PHYDM_SNPRINTF((output+used, out_len-used, "Get MU BFer's STA%d CSI\n", var1[1]));\r
2169                         ODM_SetBBReg(pDM_Odm, 0x9e8, BIT24, 0); /*Read BFer*/\r
2170                         ODM_SetBBReg(pDM_Odm, 0x9e8, BIT25, 1); /*enable Read/Write RAM*/\r
2171                         ODM_SetBBReg(pDM_Odm, 0x9e8, BIT30|BIT29|BIT28, var1[1]); /*read which STA's CSI report*/\r
2172                         ODM_SetBBReg(pDM_Odm, 0x1910, BIT15, 0); /*select BFer's CSI*/\r
2173                         ODM_SetBBReg(pDM_Odm, 0x19e0, 0x00003FC0, 0xFF); /*disable gated_clk*/\r
2174 \r
2175                         for (index = 0; index < 80; index++) {\r
2176                                 ptr = index + 256;\r
2177                                 if (ptr > 311)\r
2178                                         ptr -= 312;\r
2179                                 ODM_SetBBReg(pDM_Odm, 0x1910, 0x03FF0000, ptr); /*Select Address*/\r
2180                                 Dword_H = ODM_GetBBReg(pDM_Odm, 0xF74, bMaskDWord);\r
2181                                 Dword_L = ODM_GetBBReg(pDM_Odm, 0xF5C, bMaskDWord);\r
2182                                 if (index % 2 == 0)\r
2183                                         PHYDM_SNPRINTF((output+used, out_len-used, "%02x  %02x  %02x  %02x  %02x  %02x  %02x  %02x\n", \r
2184                                         Dword_L & bMaskByte0, (Dword_L & bMaskByte1) >> 8, (Dword_L & bMaskByte2) >> 16, (Dword_L & bMaskByte3) >> 24,\r
2185                                         Dword_H & bMaskByte0, (Dword_H & bMaskByte1) >> 8, (Dword_H & bMaskByte2) >> 16, (Dword_H & bMaskByte3) >> 24));\r
2186                                 else\r
2187                                         PHYDM_SNPRINTF((output+used, out_len-used, "%02x  %02x  %02x  %02x  %02x  %02x  %02x  %02x\n", \r
2188                                         Dword_L & bMaskByte0, (Dword_L & bMaskByte1) >> 8, (Dword_L & bMaskByte2) >> 16, (Dword_L & bMaskByte3) >> 24,\r
2189                                         Dword_H & bMaskByte0, (Dword_H & bMaskByte1) >> 8, (Dword_H & bMaskByte2) >> 16, (Dword_H & bMaskByte3) >> 24));\r
2190                                 \r
2191                                 PHYDM_SNPRINTF((output+used, out_len-used, "ptr=%d : 0x%8x  %8x\n", ptr, Dword_H, Dword_L));\r
2192                         }\r
2193 \r
2194                 }\r
2195 #endif\r
2196                 break;\r
2197 \r
2198         case PHYDM_BIG_JUMP:\r
2199         {\r
2200 #if (RTL8822B_SUPPORT == 1)\r
2201                 if (input[1]) {\r
2202                         PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);\r
2203                         phydm_EnableBigJump(pDM_Odm, (BOOLEAN)(var1[0]));\r
2204                 } else\r
2205                         PHYDM_SNPRINTF((output + used, out_len - used, "unknown command!\n"));\r
2206 #else\r
2207                 PHYDM_SNPRINTF((output + used, out_len - used, "The command is only for 8822B!\n"));\r
2208 #endif\r
2209                 break;\r
2210         }\r
2211         \r
2212         case PHYDM_HANG:\r
2213                 phydm_BB_RxHang_Info(pDM_Odm, &used, output, &out_len);\r
2214                 break;\r
2215 \r
2216         case PHYDM_SHOW_RXRATE:\r
2217 #if (RTL8822B_SUPPORT == 1)\r
2218         {\r
2219                 u1Byte  rate_idx;\r
2220         \r
2221                 if (input[1])\r
2222                         PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);\r
2223 \r
2224                 if (var1[0] == 1)\r
2225                         phydm_showRxRate(pDM_Odm, &used, output, &out_len);\r
2226                 else {\r
2227                         PHYDM_SNPRINTF((output+used, out_len-used, "Reset Rx rate counter\n"));\r
2228 \r
2229                         for (rate_idx = 0; rate_idx < 40; rate_idx++) {\r
2230                                 pDM_Odm->PhyDbgInfo.NumQryVhtPkt[rate_idx] = 0;\r
2231                                 pDM_Odm->PhyDbgInfo.NumQryMuVhtPkt[rate_idx] = 0;\r
2232                         }\r
2233                 }\r
2234         }       \r
2235 #endif\r
2236         break;\r
2237 \r
2238         case PHYDM_NBI_EN:\r
2239                 \r
2240                 for (i = 0; i < 5; i++) {\r
2241                         if (input[i + 1]) {\r
2242                                 PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);\r
2243                                 input_idx++;\r
2244                         }\r
2245                 }\r
2246 \r
2247                 if (input_idx >= 1) {\r
2248                         \r
2249                         phydm_api_debug(pDM_Odm, PHYDM_API_NBI, (u4Byte *)var1, &used, output, &out_len);\r
2250                         /**/\r
2251                 }\r
2252 \r
2253 \r
2254                 break;\r
2255 \r
2256         case PHYDM_CSI_MASK_EN:\r
2257                 \r
2258                 for (i = 0; i < 5; i++) {\r
2259                         if (input[i + 1]) {\r
2260                                 PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);\r
2261                                 input_idx++;\r
2262                         }\r
2263                 }\r
2264 \r
2265                 if (input_idx >= 1) {\r
2266                         \r
2267                         phydm_api_debug(pDM_Odm, PHYDM_API_CSI_MASK, (u4Byte *)var1, &used, output, &out_len);\r
2268                         /**/\r
2269                 }\r
2270 \r
2271 \r
2272                 break;  \r
2273 \r
2274         case PHYDM_DFS:\r
2275 #if (DM_ODM_SUPPORT_TYPE & ODM_CE)\r
2276         {\r
2277                 u4Byte var[6] = {0};\r
2278 \r
2279                 for (i = 0; i < 6; i++) {\r
2280                         if (input[i + 1]) {\r
2281                                 PHYDM_SSCANF(input[i + 1], DCMD_HEX, &var[i]);\r
2282                                 input_idx++;\r
2283                         }\r
2284                 }\r
2285         \r
2286                 if (input_idx >= 1)\r
2287                         phydm_dfs_debug(pDM_Odm, var, &used, output, &out_len);\r
2288         }\r
2289 #endif\r
2290                 break;\r
2291 \r
2292         case PHYDM_IQK:\r
2293 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
2294                 PHY_IQCalibrate(pDM_Odm->priv);\r
2295                 PHYDM_SNPRINTF((output + used, out_len - used, "IQK !!\n"));\r
2296 #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
2297                 PHY_IQCalibrate(pDM_Odm->Adapter, FALSE);\r
2298                 PHYDM_SNPRINTF((output + used, out_len - used, "IQK !!\n"));\r
2299 #endif\r
2300                 break;\r
2301 \r
2302         case PHYDM_NHM:\r
2303         {       \r
2304                 u1Byte          target_rssi;\r
2305                 u4Byte          value32;\r
2306                 u2Byte          nhm_period = 0xC350;    //200ms\r
2307                 u1Byte          IGI;\r
2308                 PCCX_INFO       CCX_INFO = &pDM_Odm->DM_CCX_INFO;\r
2309 \r
2310                 PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);\r
2311 \r
2312                 if(input_num == 1) {\r
2313 \r
2314                         CCX_INFO->echo_NHM_en = FALSE;                  \r
2315                         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n Trigger NHM: echo nhm 1\n"));\r
2316                         PHYDM_SNPRINTF((output + used, out_len - used, "\r (Exclude CCA)\n"));\r
2317                         PHYDM_SNPRINTF((output + used, out_len - used, "\r Trigger NHM: echo nhm 2\n"));\r
2318                         PHYDM_SNPRINTF((output + used, out_len - used, "\r (Include CCA)\n"));\r
2319                         PHYDM_SNPRINTF((output + used, out_len - used, "\r Get NHM results: echo nhm 3\n"));\r
2320                         \r
2321                         return;\r
2322                 }\r
2323 \r
2324                 /* NMH trigger */\r
2325                 if ((var1[0] <= 2) && (var1[0] != 0)) {\r
2326 \r
2327                         CCX_INFO->echo_NHM_en = TRUE;\r
2328                         CCX_INFO->echo_IGI = (u1Byte)ODM_GetBBReg(pDM_Odm, 0xC50, bMaskByte0);\r
2329 \r
2330                         target_rssi = CCX_INFO->echo_IGI - 10;\r
2331 \r
2332                         CCX_INFO->NHM_th[0] = (target_rssi -15 + 10) * 2;\r
2333 \r
2334                         for(i = 1; i <= 10; i ++) {\r
2335                                 CCX_INFO->NHM_th[i] = CCX_INFO->NHM_th[0] + 6 * i;\r
2336                         }\r
2337 \r
2338                         //4 1. store previous NHM setting\r
2339                         phydm_NHMsetting(pDM_Odm, STORE_NHM_SETTING);\r
2340 \r
2341                         //4 2. Set NHM period, 0x990[31:16]=0xC350, Time duration for NHM unit: 4us, 0xC350=200ms\r
2342                         CCX_INFO->NHM_period = nhm_period;\r
2343 \r
2344                         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n Monitor NHM for %d us", nhm_period*4));\r
2345 \r
2346                         //4 3. Set NHM inexclude_txon, inexclude_cca, ccx_en\r
2347 \r
2348                         \r
2349                         CCX_INFO->NHM_inexclude_cca = (var1[0] == 1) ? NHM_EXCLUDE_CCA : NHM_INCLUDE_CCA;\r
2350                         CCX_INFO->NHM_inexclude_txon = NHM_EXCLUDE_TXON;\r
2351                         \r
2352                         phydm_NHMsetting(pDM_Odm, SET_NHM_SETTING);\r
2353 \r
2354                         for(i = 0; i <= 10; i ++) {\r
2355                                 \r
2356                                 if (i == 5) {\r
2357                                         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n NHM_th[%d] = 0x%x, echo_IGI = 0x%x", i, CCX_INFO->NHM_th[i], CCX_INFO->echo_IGI));\r
2358                                 }\r
2359                                 else if (i == 10)\r
2360                                         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n NHM_th[%d] = 0x%x\n", i, CCX_INFO->NHM_th[i]));\r
2361                                 else\r
2362                                         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n NHM_th[%d] = 0x%x", i, CCX_INFO->NHM_th[i]));\r
2363                         }\r
2364 \r
2365                         //4 4. Trigger NHM\r
2366                         phydm_NHMtrigger(pDM_Odm);\r
2367 \r
2368                 }\r
2369                 \r
2370                 /*Get NHM results*/\r
2371                 else if (var1[0] == 3) {\r
2372 \r
2373                         IGI = (u1Byte)ODM_GetBBReg(pDM_Odm, 0xC50, bMaskByte0);\r
2374 \r
2375                         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n Cur_IGI = 0x%x", IGI));                    \r
2376 \r
2377                         phydm_getNHMresult(pDM_Odm);\r
2378                         \r
2379                         //4 Resotre NHM setting\r
2380                         phydm_NHMsetting(pDM_Odm, RESTORE_NHM_SETTING);\r
2381                         \r
2382                         for(i = 0; i <= 11; i++) {\r
2383                                 \r
2384                                 if (i == 5)                     \r
2385                                         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n nhm_result[%d] = %d, echo_IGI = 0x%x", i, CCX_INFO->NHM_result[i], CCX_INFO->echo_IGI));\r
2386                                 else if (i == 11)\r
2387                                         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n nhm_result[%d] = %d\n", i, CCX_INFO->NHM_result[i]));\r
2388                                 else\r
2389                                         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n nhm_result[%d] = %d", i, CCX_INFO->NHM_result[i]));\r
2390                         }\r
2391                         \r
2392                         CCX_INFO->echo_NHM_en = FALSE;\r
2393                 }\r
2394                 else {\r
2395                                         \r
2396                         CCX_INFO->echo_NHM_en = FALSE;\r
2397                         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n Trigger NHM: echo nhm 1\n"));\r
2398                         PHYDM_SNPRINTF((output + used, out_len - used, "\r (Exclude CCA)\n"));\r
2399                         PHYDM_SNPRINTF((output + used, out_len - used, "\r Trigger NHM: echo nhm 2\n"));\r
2400                         PHYDM_SNPRINTF((output + used, out_len - used, "\r (Include CCA)\n"));\r
2401                         PHYDM_SNPRINTF((output + used, out_len - used, "\r Get NHM results: echo nhm 3\n"));\r
2402                         \r
2403                         return;\r
2404                 }\r
2405         }\r
2406         break;\r
2407 \r
2408         case PHYDM_CLM:\r
2409         {\r
2410                 PCCX_INFO       CCX_INFO = &pDM_Odm->DM_CCX_INFO;\r
2411                 PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);\r
2412 \r
2413                 //PHYDM_SNPRINTF((output + used, out_len - used, "\r\n input_num = %d\n", input_num));\r
2414 \r
2415                 if (input_num == 1) {\r
2416 \r
2417                         CCX_INFO->echo_CLM_en = FALSE;\r
2418                         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n Trigger CLM: echo clm 1\n"));\r
2419                         PHYDM_SNPRINTF((output + used, out_len - used, "\r Get CLM results: echo clm 2\n"));\r
2420                         return;\r
2421                 }\r
2422 \r
2423                 /* Set & trigger CLM */\r
2424                 if (var1[0] == 1) {\r
2425 \r
2426                         CCX_INFO->echo_CLM_en = TRUE;\r
2427                         CCX_INFO->CLM_period = 0xC350;          /*100ms*/\r
2428                         phydm_CLMsetting(pDM_Odm);\r
2429                         phydm_CLMtrigger(pDM_Odm);                              \r
2430                         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n Monitor CLM for 200ms\n"));\r
2431                 }\r
2432                 \r
2433                 /* Get CLM results */\r
2434                 else if (var1[0] == 2) {\r
2435 \r
2436                         CCX_INFO->echo_CLM_en = FALSE;\r
2437                         phydm_getCLMresult(pDM_Odm);\r
2438                         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n CLM_result = %d us\n", CCX_INFO->CLM_result*4));\r
2439                         \r
2440                 } else {\r
2441 \r
2442                         CCX_INFO->echo_CLM_en = FALSE;\r
2443                         PHYDM_SNPRINTF((output + used, out_len - used, "\n\r Error command !\n"));\r
2444                         PHYDM_SNPRINTF((output + used, out_len - used, "\r Trigger CLM: echo clm 1\n"));\r
2445                         PHYDM_SNPRINTF((output + used, out_len - used, "\r Get CLM results: echo clm 2\n"));\r
2446                 }\r
2447         }\r
2448                 break;\r
2449         \r
2450         case PHYDM_BB_INFO:\r
2451         {\r
2452                 s4Byte value32 = 0;\r
2453                 \r
2454                 phydm_BB_Debug_Info(pDM_Odm, &used, output, &out_len);\r
2455 \r
2456                 if (pDM_Odm->SupportICType & ODM_RTL8822B && input[1]) {\r
2457                         PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);\r
2458                         ODM_SetBBReg(pDM_Odm, 0x1988, 0x003fff00, var1[0]);\r
2459                         value32 = ODM_GetBBReg(pDM_Odm, 0xf84, bMaskDWord);\r
2460                         value32 = (value32 & 0xff000000)>>24;\r
2461                         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n %-35s = condition num = %d, subcarriers = %d\n", "Over condition num subcarrier", var1[0], value32));\r
2462                         ODM_SetBBReg(pDM_Odm, 0x1988 , BIT22, 0x0);     /*disable report condition number*/\r
2463                 }\r
2464         }\r
2465                 break;\r
2466 \r
2467         case PHYDM_TXBF:\r
2468         {\r
2469 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
2470 #if (BEAMFORMING_SUPPORT == 1)\r
2471                 PRT_BEAMFORMING_INFO    pBeamformingInfo = &pDM_Odm->BeamformingInfo;\r
2472 \r
2473                 PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);\r
2474                 if (var1[0] == 1) {\r
2475                         pBeamformingInfo->applyVmatrix = TRUE;\r
2476                         pBeamformingInfo->snding3SS = FALSE;\r
2477                         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n apply V matrix and 3SS 789 dont snding\n"));\r
2478                 } else if (var1[0] == 0) {\r
2479                         pBeamformingInfo->applyVmatrix = FALSE;\r
2480                         pBeamformingInfo->snding3SS = TRUE;\r
2481                         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n dont apply V matrix and 3SS 789 snding\n"));\r
2482                 } else\r
2483                         PHYDM_SNPRINTF((output + used, out_len - used, "\r\n unknown cmd!!\n"));\r
2484 #else\r
2485                 PHYDM_SNPRINTF((output + used, out_len - used, "\r\n no TxBF !!\n"));\r
2486 #endif\r
2487 #endif\r
2488         }\r
2489                 break;\r
2490                 \r
2491         case PHYDM_PAUSE_DIG_EN:\r
2492                 \r
2493 \r
2494                 for (i = 0; i < 5; i++) {\r
2495                         if (input[i + 1]) {\r
2496                                 PHYDM_SSCANF(input[i + 1], DCMD_HEX, &var1[i]);\r
2497                                 input_idx++;\r
2498                         }\r
2499                 }\r
2500                                 \r
2501                 if (input_idx >= 1) {\r
2502                         if (var1[0] == 0) {\r
2503                                 odm_PauseDIG(pDM_Odm, PHYDM_PAUSE, PHYDM_PAUSE_LEVEL_7, (u1Byte)var1[1]);\r
2504                                 PHYDM_SNPRINTF((output + used, out_len - used, "Set IGI_value = ((%x))\n", var1[1]));\r
2505                         } else if (var1[0] == 1) {\r
2506                                 odm_PauseDIG(pDM_Odm, PHYDM_RESUME, PHYDM_PAUSE_LEVEL_7, (u1Byte)var1[1]);\r
2507                                 PHYDM_SNPRINTF((output + used, out_len - used, "Resume IGI_value\n"));\r
2508                         } else \r
2509                                 PHYDM_SNPRINTF((output + used, out_len - used, "echo  (1:pause, 2resume)  (IGI_value)\n"));\r
2510                 }\r
2511                 \r
2512                 break;\r
2513                 \r
2514         case PHYDM_H2C:\r
2515 \r
2516                 for (i = 0; i < 8; i++) {\r
2517                         if (input[i + 1]) {\r
2518                                 PHYDM_SSCANF(input[i + 1], DCMD_HEX, &var1[i]);\r
2519                                 input_idx++;\r
2520                         }\r
2521                 }\r
2522 \r
2523                 if (input_idx >= 1)\r
2524                         phydm_h2C_debug(pDM_Odm, (u4Byte *)var1, &used, output, &out_len);\r
2525 \r
2526                 \r
2527                 break;\r
2528                 \r
2529         case PHYDM_ANT_SWITCH:\r
2530 \r
2531                 for (i = 0; i < 8; i++) {\r
2532                         if (input[i + 1]) {\r
2533                                 PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);\r
2534                                 input_idx++;\r
2535                         }\r
2536                 }\r
2537 \r
2538                 if (input_idx >= 1) {\r
2539                         \r
2540                         #if (RTL8821A_SUPPORT == 1)\r
2541                         phydm_set_ext_switch(pDM_Odm, (u4Byte *)var1, &used, output, &out_len);\r
2542                         #else\r
2543                         PHYDM_SNPRINTF((output + used, out_len - used, "Not Support IC"));\r
2544                         #endif\r
2545                 }\r
2546 \r
2547                 \r
2548                 break;          \r
2549 \r
2550         default:\r
2551                 PHYDM_SNPRINTF((output + used, out_len - used, "SET, unknown command!\n"));\r
2552                 break;\r
2553 \r
2554         }\r
2555 }\r
2556 \r
2557 \r
2558 VOID\r
2559 phydm_la_mode_bb_setting(\r
2560         IN      PVOID           pDM_VOID,\r
2561         IN      u4Byte          DbgPort,\r
2562         IN      BOOLEAN         bTriggerEdge,\r
2563         IN      u1Byte          sampling_rate\r
2564 )\r
2565 {\r
2566         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
2567         /*u4Byte                        dword;*/\r
2568 \r
2569         if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) {\r
2570                 ODM_SetBBReg(pDM_Odm, 0x198C , BIT2|BIT1|BIT0, 7); /*disable dbg clk gating*/\r
2571 \r
2572                 /*dword= ODM_GetBBReg(pDM_Odm, 0x8FC, bMaskDWord);*/\r
2573                 /*DbgPrint("dbg_port = ((0x%x))\n", dword);*/\r
2574                 ODM_SetBBReg(pDM_Odm, 0x8FC, bMaskDWord, DbgPort);\r
2575                 ODM_SetBBReg(pDM_Odm, 0x95C , BIT31, bTriggerEdge); /*0: posedge, 1: negedge*/\r
2576                 ODM_SetBBReg(pDM_Odm, 0x95c, 0xe0, sampling_rate);\r
2577                 /*      (0:) '80MHz'\r
2578                         (1:) '40MHz'\r
2579                         (2:) '20MHz'\r
2580                         (3:) '10MHz'\r
2581                         (4:) '5MHz'\r
2582                         (5:) '2.5MHz'\r
2583                         (6:) '1.25MHz'\r
2584                         (7:) '160MHz (for BW160 ic)'\r
2585                 */\r
2586         } else {\r
2587                 ODM_SetBBReg(pDM_Odm, 0x908, bMaskDWord, DbgPort);\r
2588                 ODM_SetBBReg(pDM_Odm, 0x9A0 , BIT31, bTriggerEdge); /*0: posedge, 1: negedge*/\r
2589                 ODM_SetBBReg(pDM_Odm, 0x9A0, 0xe0, sampling_rate);\r
2590                 /*      (0:) '80MHz'\r
2591                         (1:) '40MHz'\r
2592                         (2:) '20MHz'\r
2593                         (3:) '10MHz'\r
2594                         (4:) '5MHz'\r
2595                         (5:) '2.5MHz'\r
2596                         (6:) '1.25MHz'\r
2597                         (7:) '160MHz (for BW160 ic)'\r
2598                 */\r
2599         }\r
2600 }\r
2601 \r
2602 u1Byte\r
2603 phydm_la_mode_mac_setting(\r
2604         IN      PVOID           pDM_VOID,\r
2605         IN      u4Byte          TriggerTime_mu_sec\r
2606 )\r
2607 {\r
2608         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
2609         u1Byte                  TriggerTime_unit_num;\r
2610         u4Byte                  time_unit = 0;\r
2611 \r
2612         if (TriggerTime_mu_sec < 128) {\r
2613                 time_unit = 0; /*unit: 1mu sec*/\r
2614         } else if (TriggerTime_mu_sec < 256) {\r
2615                 time_unit = 1; /*unit: 2mu sec*/        \r
2616         } else if (TriggerTime_mu_sec < 512) {\r
2617                 time_unit = 2; /*unit: 4mu sec*/        \r
2618         } else if (TriggerTime_mu_sec < 1024) {\r
2619                 time_unit = 3; /*unit: 8mu sec*/        \r
2620         } else if (TriggerTime_mu_sec < 2048) {\r
2621                 time_unit = 4; /*unit: 16mu sec*/       \r
2622         } else if (TriggerTime_mu_sec < 4096) {\r
2623                 time_unit = 5; /*unit: 32mu sec*/       \r
2624         } else if (TriggerTime_mu_sec < 8192) {\r
2625                 time_unit = 6; /*unit: 64mu sec*/       \r
2626         }\r
2627         \r
2628         TriggerTime_unit_num = (u1Byte)(TriggerTime_mu_sec>>time_unit);\r
2629         pDM_Odm->ADCsmp_time_unit = time_unit;\r
2630         DbgPrint("time_unit = ((0x%x))\n", time_unit);\r
2631         \r
2632         if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) {\r
2633                 ODM_SetMACReg(pDM_Odm, 0x7cc , BIT20|BIT19|BIT18, time_unit);\r
2634         } else {\r
2635 \r
2636         }\r
2637         return (TriggerTime_unit_num & 0x7f);\r
2638         \r
2639 }\r
2640 \r
2641 #ifdef __ECOS\r
2642 char *strsep(char **s, const char *ct)\r
2643 {\r
2644         char *sbegin = *s;\r
2645         char *end;\r
2646 \r
2647         if (sbegin == NULL)\r
2648                 return NULL;\r
2649 \r
2650         end = strpbrk(sbegin, ct);\r
2651         if (end)\r
2652                 *end++ = '\0';\r
2653         *s = end;\r
2654         return sbegin;\r
2655 }\r
2656 #endif\r
2657 \r
2658 #if(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_AP))\r
2659 s4Byte\r
2660 phydm_cmd(\r
2661         IN PDM_ODM_T    pDM_Odm,\r
2662         IN char         *input,\r
2663         IN u4Byte       in_len,\r
2664         IN u1Byte       flag,\r
2665         OUT char        *output,\r
2666         IN u4Byte       out_len\r
2667 )\r
2668 {\r
2669         char *token;\r
2670         u4Byte  Argc = 0;\r
2671         char            Argv[MAX_ARGC][MAX_ARGV];\r
2672 \r
2673         do {\r
2674                 token = strsep(&input, ", ");\r
2675                 if (token) {\r
2676                         strcpy(Argv[Argc], token);\r
2677                         Argc++;\r
2678                 } else\r
2679                         break;\r
2680         } while (Argc < MAX_ARGC);\r
2681 \r
2682         if (Argc == 1)\r
2683                 Argv[0][strlen(Argv[0]) - 1] = '\0';\r
2684 \r
2685         phydm_cmd_parser(pDM_Odm, Argv, Argc, flag, output, out_len);\r
2686 \r
2687         return 0;\r
2688 }\r
2689 #endif\r
2690 \r
2691 \r
2692 VOID\r
2693 phydm_fw_trace_handler(\r
2694         IN      PVOID   pDM_VOID,\r
2695         IN      pu1Byte CmdBuf,\r
2696         IN      u1Byte  CmdLen\r
2697 )\r
2698 {\r
2699         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
2700 \r
2701         /*u1Byte        debug_trace_11byte[60];*/\r
2702         u1Byte          freg_num, c2h_seq, buf_0 = 0;\r
2703 \r
2704         if (!(pDM_Odm->SupportICType & PHYDM_IC_3081_SERIES))\r
2705                 return;\r
2706 \r
2707         if (CmdLen > 12)\r
2708                 return;\r
2709         \r
2710         buf_0 = CmdBuf[0];\r
2711         freg_num = (buf_0 & 0xf);\r
2712         c2h_seq = (buf_0 & 0xf0) >> 4;\r
2713         /*ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,("[FW debug message] freg_num = (( %d )), c2h_seq = (( %d ))\n", freg_num,c2h_seq ));*/\r
2714 \r
2715         /*strncpy(debug_trace_11byte,&CmdBuf[1],(CmdLen-1));*/\r
2716         /*debug_trace_11byte[CmdLen-1] = '\0';*/\r
2717         /*ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,("[FW debug message] %s\n", debug_trace_11byte));*/\r
2718         /*ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,("[FW debug message] CmdLen = (( %d ))\n", CmdLen));*/\r
2719         /*ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,("[FW debug message] c2h_cmd_start  = (( %d ))\n", pDM_Odm->c2h_cmd_start));*/\r
2720 \r
2721 \r
2722 \r
2723         /*ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,("pre_seq = (( %d )), current_seq = (( %d ))\n", pDM_Odm->pre_c2h_seq, c2h_seq));*/\r
2724         /*ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,("fw_buff_is_enpty = (( %d ))\n", pDM_Odm->fw_buff_is_enpty));*/\r
2725 \r
2726         if ((c2h_seq != pDM_Odm->pre_c2h_seq)  &&  pDM_Odm->fw_buff_is_enpty == FALSE) {\r
2727                 pDM_Odm->fw_debug_trace[pDM_Odm->c2h_cmd_start] = '\0';\r
2728                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW Dbg Queue Overflow] %s\n", pDM_Odm->fw_debug_trace));\r
2729                 pDM_Odm->c2h_cmd_start = 0;\r
2730         }\r
2731 \r
2732         if ((CmdLen - 1) > (60 - pDM_Odm->c2h_cmd_start)) {\r
2733                 pDM_Odm->fw_debug_trace[pDM_Odm->c2h_cmd_start] = '\0';\r
2734                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW Dbg Queue error: wrong C2H length] %s\n", pDM_Odm->fw_debug_trace));\r
2735                 pDM_Odm->c2h_cmd_start = 0;\r
2736                 return;\r
2737         }\r
2738 \r
2739         strncpy((char *)&(pDM_Odm->fw_debug_trace[pDM_Odm->c2h_cmd_start]), (char *)&CmdBuf[1], (CmdLen-1));\r
2740         pDM_Odm->c2h_cmd_start += (CmdLen - 1);\r
2741         pDM_Odm->fw_buff_is_enpty = FALSE;      \r
2742         \r
2743         if (freg_num == 0 || pDM_Odm->c2h_cmd_start >= 60) {\r
2744                 if (pDM_Odm->c2h_cmd_start < 60)\r
2745                         pDM_Odm->fw_debug_trace[pDM_Odm->c2h_cmd_start] = '\0';\r
2746                 else\r
2747                         pDM_Odm->fw_debug_trace[59] = '\0';\r
2748 \r
2749                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW DBG Msg] %s\n", pDM_Odm->fw_debug_trace));\r
2750                 /*DbgPrint("[FW DBG Msg] %s\n", pDM_Odm->fw_debug_trace);*/\r
2751                 pDM_Odm->c2h_cmd_start = 0;\r
2752                 pDM_Odm->fw_buff_is_enpty = TRUE;\r
2753         }\r
2754 \r
2755         pDM_Odm->pre_c2h_seq = c2h_seq;\r
2756 }\r
2757 \r
2758 VOID\r
2759 phydm_fw_trace_handler_code(\r
2760         IN      PVOID   pDM_VOID,\r
2761         IN      pu1Byte Buffer,\r
2762         IN      u1Byte  CmdLen\r
2763 )\r
2764 {\r
2765         PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
2766         u1Byte  function = Buffer[0];\r
2767         u1Byte  dbg_num = Buffer[1];\r
2768         u2Byte  content_0 = (((u2Byte)Buffer[3])<<8)|((u2Byte)Buffer[2]);\r
2769         u2Byte  content_1 = (((u2Byte)Buffer[5])<<8)|((u2Byte)Buffer[4]);               \r
2770         u2Byte  content_2 = (((u2Byte)Buffer[7])<<8)|((u2Byte)Buffer[6]);       \r
2771         u2Byte  content_3 = (((u2Byte)Buffer[9])<<8)|((u2Byte)Buffer[8]);\r
2772         u2Byte  content_4 = (((u2Byte)Buffer[11])<<8)|((u2Byte)Buffer[10]);\r
2773 \r
2774         if(CmdLen >12) {\r
2775                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,("[FW Msg] Invalid cmd length (( %d )) >12 \n", CmdLen));\r
2776         }\r
2777         \r
2778         //ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE,ODM_DBG_LOUD,("[FW Msg] Func=((%d)),  num=((%d)), ct_0=((%d)), ct_1=((%d)), ct_2=((%d)), ct_3=((%d)), ct_4=((%d))\n", \r
2779         //      function, dbg_num, content_0, content_1, content_2, content_3, content_4));\r
2780         \r
2781         /*--------------------------------------------*/\r
2782 #if (CONFIG_RA_FW_DBG_CODE)\r
2783         if(function == RATE_DECISION) {\r
2784                 if(dbg_num == 0) {\r
2785                         if(content_0 == 1) {\r
2786                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW] RA_CNT=((%d))  Max_device=((%d))--------------------------->\n", content_1, content_2));\r
2787                         } else if(content_0 == 2) {\r
2788                                  ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW] Check RA macid= ((%d)), MediaStatus=((%d)), Dis_RA=((%d)),  try_bit=((0x%x))\n", content_1, content_2, content_3, content_4));\r
2789                         } else if(content_0 == 3) {\r
2790                                  ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW] Check RA  total=((%d)),  drop=((0x%x)), TXRPT_TRY_bit=((%x)), bNoisy=((%x))\n", content_1, content_2, content_3, content_4));\r
2791                         }\r
2792                 } else if(dbg_num == 1) {\r
2793                         if (content_0 == 1) {\r
2794                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW] RTY[0,1,2,3]=[ %d , %d , %d , %d ]\n", content_1, content_2, content_3, content_4));\r
2795                         } else if (content_0 == 2) {\r
2796                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW] RTY[4]=[ %d ], drop=(( %d )), total=(( %d )), current_rate=((0x %x ))", content_1, content_2, content_3, content_4));\r
2797                                 phydm_print_rate(pDM_Odm, (u1Byte)content_4, ODM_FW_DEBUG_TRACE);\r
2798                         } else if (content_0 == 3) {\r
2799                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW] penality_idx=(( %d ))\n", content_1));\r
2800                         } else if (content_0 == 4) {\r
2801                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW] RSSI=(( %d )), ra_stage = (( %d ))\n", content_1, content_2));\r
2802                         }\r
2803                 }\r
2804                 \r
2805                 else if(dbg_num == 3) {\r
2806                         if (content_0 == 1)\r
2807                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW] Fast_RA (( DOWN ))  total=((%d)),  total>>1=((%d)), R4+R3+R2 = ((%d)), RateDownHold = ((%d))\n", content_1, content_2, content_3, content_4));\r
2808                         else if (content_0 == 2)\r
2809                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW] Fast_RA (( UP ))  total_acc=((%d)),  total_acc>>1=((%d)), R4+R3+R2 = ((%d)), RateDownHold = ((%d))\n", content_1, content_2, content_3, content_4));\r
2810                         else if (content_0 == 3)\r
2811                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW] Fast_RA (( UP )) ((Rate Down Hold))  RA_CNT=((%d))\n", content_1));\r
2812                         else if (content_0 == 4)\r
2813                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW] Fast_RA (( UP )) ((tota_accl<5 skip))  RA_CNT=((%d))\n", content_1));\r
2814                         else if (content_0 == 8)\r
2815                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW] Fast_RA (( Reset Tx Rpt )) RA_CNT=((%d))\n", content_1));\r
2816                 }\r
2817 \r
2818                 else if (dbg_num == 4) {\r
2819                         if (content_0 == 3) {\r
2820                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW] RER_CNT   PCR_ori =(( %d )),  ratio_ori =(( %d )), pcr_updown_bitmap =(( 0x%x )), pcr_var_diff =(( %d ))\n", content_1, content_2, content_3, content_4));\r
2821                                 /**/\r
2822                         } else if (content_0 == 4) {\r
2823                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW] pcr_shift_value =(( %s%d )), rate_down_threshold =(( %d )), rate_up_threshold =(( %d ))\n", ((content_1) ? "+" : "-"), content_2, content_3, content_4));\r
2824                                 /**/\r
2825                         } else if (content_0 == 5) {\r
2826                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW] pcr_mean =(( %d )), PCR_VAR =(( %d )), offset =(( %d )), decision_offset_p =(( %d ))\n", content_1, content_2, content_3, content_4));\r
2827                                 /**/\r
2828                         }\r
2829                 }\r
2830                 \r
2831                 else if(dbg_num == 5) {\r
2832                         if(content_0 == 1) {\r
2833                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW] (( UP))  Nsc=(( %d )), N_High=(( %d )), RateUp_Waiting=(( %d )), RateUp_Fail=(( %d ))\n", content_1, content_2, content_3, content_4));\r
2834                         } else if(content_0 == 2) {\r
2835                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW] ((DOWN))  Nsc=(( %d )), N_Low=(( %d ))\n", content_1, content_2));\r
2836                         } else if(content_0 == 3) {\r
2837                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW] ((HOLD))  Nsc=((%d)), N_High=((%d)), N_Low=((%d)), Reset_CNT=((%d))\n", content_1, content_2, content_3, content_4));\r
2838                         }\r
2839                 }\r
2840                 else if(dbg_num == 0x60) {\r
2841                         if(content_0 == 1) {\r
2842                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW] ((AP RPT))  macid=((%d)), BUPDATE[macid]=((%d))\n", content_1, content_2));\r
2843                         } else if(content_0 == 4) {\r
2844                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW] ((AP RPT))  pass=((%d)), rty_num=((%d)), drop=((%d)), total=((%d))\n", content_1, content_2, content_3, content_4));\r
2845                         } else if(content_0 == 5) {\r
2846                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW] ((AP RPT))  PASS=((%d)), RTY_NUM=((%d)), DROP=((%d)), TOTAL=((%d))\n", content_1, content_2, content_3, content_4));\r
2847                         }\r
2848                 }\r
2849         } \r
2850         /*--------------------------------------------*/\r
2851         else if (function == INIT_RA_TABLE){\r
2852                 if(dbg_num == 3) {\r
2853                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW][INIT_RA_INFO] Ra_init, RA_SKIP_CNT = (( %d ))\n", content_0));\r
2854                 }\r
2855                 \r
2856         } \r
2857         /*--------------------------------------------*/\r
2858         else if (function == RATE_UP) {\r
2859                 if(dbg_num == 2) {\r
2860                         if(content_0 == 1) {\r
2861                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW][RateUp]  ((Highest rate -> return)), macid=((%d))  Nsc=((%d))\n", content_1, content_2));\r
2862                         }\r
2863                 } else if(dbg_num == 5) {\r
2864                         if (content_0 == 0)\r
2865                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW][RateUp]  ((Rate UP)), up_rate_tmp=((0x%x)), rate_idx=((0x%x)), SGI_en=((%d)),  SGI=((%d))\n", content_1, content_2, content_3, content_4));\r
2866                         else if (content_0 == 1)\r
2867                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW][RateUp]  ((Rate UP)), rate_1=((0x%x)), rate_2=((0x%x)), BW=((%d)), Try_Bit=((%d))\n", content_1, content_2, content_3, content_4));\r
2868                 }\r
2869                 \r
2870         } \r
2871         /*--------------------------------------------*/\r
2872         else if (function == RATE_DOWN) {\r
2873                  if(dbg_num == 5) {\r
2874                         if(content_0 == 1) {\r
2875                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW][RateDownStep]  ((Rate Down)), macid=((%d)), rate1=((0x%x)),  rate2=((0x%x)), BW=((%d))\n", content_1, content_2, content_3, content_4));\r
2876                         }\r
2877                 }\r
2878         } else if (function == TRY_DONE) {\r
2879                 if (dbg_num == 1) {\r
2880                         if (content_0 == 1) {\r
2881                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW][Try Done]  ((try succsess )) macid=((%d)), Try_Done_cnt=((%d))\n", content_1, content_2));\r
2882                                 /**/\r
2883                         }\r
2884                 } else if (dbg_num == 2) {\r
2885                         if (content_0 == 1) {\r
2886                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW][Try Done]  ((try)) macid=((%d)), Try_Done_cnt=((%d)),  rate_2=((%d)),  try_succes=((%d))\n", content_1, content_2, content_3, content_4));\r
2887                                 /**/\r
2888                         }\r
2889                 }\r
2890         } \r
2891         /*--------------------------------------------*/\r
2892         else if (function == RA_H2C) {\r
2893                 if (dbg_num == 1) {\r
2894                         if (content_0 == 0) {\r
2895                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW][H2C=0x49]  fw_trace_en=((%d)), mode =((%d)),  macid=((%d))\n", content_1, content_2, content_3));\r
2896                                 /**/\r
2897                                 /*C2H_RA_Dbg_code(F_RA_H2C,1,0, SysMib.ODM.DEBUG.fw_trace_en, mode, macid , 0);    //RA MASK*/\r
2898                         }\r
2899                         #if 0\r
2900                         else if (dbg_num == 2) {\r
2901                         \r
2902                                 if (content_0 == 1) {\r
2903                                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW][H2C=0x40]  MACID=((%d)), Rate ID=((%d)),  SGI=((%d)),  BW=((%d))\n", content_1, content_2, content_3, content_4));\r
2904                                         /**/\r
2905                                 } else if (content_0 == 2) {\r
2906                                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW][H2C=0x40]   VHT_en=((%d)), Disable_PowerTraining=((%d)),  Disable_RA=((%d)),  No_Update=((%d))\n", content_1, content_2, content_3, content_4));\r
2907                                         /**/\r
2908                                 } else if (content_0 == 3) {\r
2909                                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW][H2C=0x40]   RA_MSK=[%x | %x | %x | %x ]\n", content_1, content_2, content_3, content_4));\r
2910                                         /**/\r
2911                                 }\r
2912                         }\r
2913                         #endif\r
2914                 }\r
2915         }\r
2916         /*--------------------------------------------*/\r
2917         else if (function == F_RATE_AP_RPT) {\r
2918                  if(dbg_num == 1) {\r
2919                         if(content_0 == 1) {\r
2920                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW][AP RPT]  ((1)), SPE_STATIS=((0x%x))---------->\n", content_3));                          \r
2921                         } \r
2922                 } else if(dbg_num == 2) {\r
2923                         if(content_0 == 1) {\r
2924                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW][AP RPT]  RTY_all=((%d))\n", content_1));                         \r
2925                         } \r
2926                 } else if(dbg_num == 3) {\r
2927                         if(content_0 == 1) {\r
2928                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW][AP RPT]  MACID1[%d], TOTAL=((%d)),  RTY=((%d))\n", content_3, content_1, content_2));\r
2929                         } \r
2930                 } else if(dbg_num == 4) {\r
2931                         if(content_0 == 1) {\r
2932                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW][AP RPT]  MACID2[%d], TOTAL=((%d)),  RTY=((%d))\n", content_3, content_1, content_2));\r
2933                         } \r
2934                 } else if(dbg_num == 5) {\r
2935                         if(content_0 == 1) {\r
2936                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW][AP RPT]  MACID1[%d], PASS=((%d)),  DROP=((%d))\n", content_3, content_1, content_2));\r
2937                         } \r
2938                 } else if(dbg_num == 6) {\r
2939                         if(content_0 == 1) {\r
2940                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW][AP RPT]  MACID2[%d],, PASS=((%d)),  DROP=((%d))\n", content_3, content_1, content_2));\r
2941                         } \r
2942                 }\r
2943         } else {\r
2944                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW][general][%d, %d, %d] = {%d, %d, %d, %d}\n", function, dbg_num, content_0, content_1, content_2, content_3, content_4));\r
2945                 /**/\r
2946         }\r
2947 #else\r
2948         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW][general][%d, %d, %d] = {%d, %d, %d, %d}\n", function, dbg_num, content_0, content_1, content_2, content_3, content_4));\r
2949 #endif\r
2950         /*--------------------------------------------*/\r
2951                 \r
2952 \r
2953 }\r
2954 \r
2955 VOID\r
2956 phydm_fw_trace_handler_8051(\r
2957         IN      PVOID   pDM_VOID,\r
2958         IN      pu1Byte Buffer,\r
2959         IN      u1Byte  CmdLen\r
2960 )\r
2961 {\r
2962         PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
2963 #if 0\r
2964         if (CmdLen >= 3)\r
2965                 CmdBuf[CmdLen - 1] = '\0';\r
2966         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW DBG Msg] %s\n", &(CmdBuf[3])));\r
2967 #else\r
2968 \r
2969         int i = 0;\r
2970         u1Byte  Extend_c2hSubID = 0, Extend_c2hDbgLen = 0, Extend_c2hDbgSeq = 0;\r
2971         u1Byte  fw_debug_trace[128];\r
2972         pu1Byte Extend_c2hDbgContent = 0;\r
2973 \r
2974         if (CmdLen > 127)\r
2975                 return;\r
2976 \r
2977         Extend_c2hSubID = Buffer[0];\r
2978         Extend_c2hDbgLen = Buffer[1];\r
2979         Extend_c2hDbgContent = Buffer + 2; /*DbgSeq+DbgContent  for show HEX*/\r
2980 \r
2981         #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
2982         RT_DISP(FC2H, C2H_Summary, ("[Extend C2H packet], Extend_c2hSubId=0x%x, Extend_c2hDbgLen=%d\n", \r
2983                         Extend_c2hSubID, Extend_c2hDbgLen));\r
2984         \r
2985         RT_DISP_DATA(FC2H, C2H_Summary, "[Extend C2H packet], Content Hex:", Extend_c2hDbgContent, CmdLen-2);\r
2986         #endif\r
2987 \r
2988 GoBackforAggreDbgPkt:\r
2989         i = 0;\r
2990         Extend_c2hDbgSeq = Buffer[2];\r
2991         Extend_c2hDbgContent = Buffer + 3;\r
2992         \r
2993         #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)    \r
2994         RT_DISP(FC2H, C2H_Summary, ("[RTKFW, SEQ= %d] :", Extend_c2hDbgSeq));\r
2995         #endif  \r
2996 \r
2997         for (; ; i++) {\r
2998                 fw_debug_trace[i] = Extend_c2hDbgContent[i];\r
2999                 if (Extend_c2hDbgContent[i + 1] == '\0') {\r
3000                         fw_debug_trace[i + 1] = '\0';\r
3001                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW DBG Msg] %s", &(fw_debug_trace[0])));\r
3002                         break;\r
3003                 } else if (Extend_c2hDbgContent[i] == '\n') {\r
3004                         fw_debug_trace[i + 1] = '\0';\r
3005                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("[FW DBG Msg] %s", &(fw_debug_trace[0])));\r
3006                         Buffer = Extend_c2hDbgContent + i + 3;\r
3007                         goto GoBackforAggreDbgPkt;\r
3008                 }\r
3009         }\r
3010 \r
3011 \r
3012 #endif\r
3013 }\r
3014 \r
3015 \r