net: wireless: rockchip: add rtl8822be pcie wifi driver
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8822be / hal / phydm / phydm_adc_sampling.c
1 #include "mp_precomp.h"\r
2 #include "phydm_precomp.h"\r
3 \r
4 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
5 #if ((RTL8197F_SUPPORT == 1)||(RTL8822B_SUPPORT == 1))\r
6 #include "rtl8197f/Hal8197FPhyReg.h"\r
7 #include "WlanHAL/HalMac88XX/halmac_reg2.h"\r
8 #else\r
9 #include "WlanHAL/HalHeader/HalComReg.h"\r
10 #endif\r
11 #endif\r
12 \r
13 #if (PHYDM_LA_MODE_SUPPORT == 1)\r
14 \r
15 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
16 \r
17 #if WPP_SOFTWARE_TRACE\r
18 #include "phydm_adc_sampling.tmh"\r
19 #endif\r
20 \r
21 \r
22 BOOLEAN\r
23 phydm_la_buffer_allocate(\r
24         IN              PVOID                   pDM_VOID\r
25         )\r
26 {\r
27         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
28         PRT_ADCSMP              AdcSmp = &(pDM_Odm->adcsmp);\r
29         PADAPTER                Adapter = pDM_Odm->Adapter;\r
30         PRT_ADCSMP_STRING       ADCSmpBuf = &(AdcSmp->ADCSmpBuf);\r
31 \r
32         DbgPrint("[LA mode BufferAllocate]\n");\r
33         \r
34         if (ADCSmpBuf->Length == 0) {\r
35                 if (PlatformAllocateMemoryWithZero(Adapter, (void **)&(ADCSmpBuf->Octet), ADCSmpBuf->buffer_size) == RT_STATUS_SUCCESS)\r
36                         ADCSmpBuf->Length = ADCSmpBuf->buffer_size;\r
37                 else\r
38                         return FALSE;\r
39         }\r
40 \r
41         return TRUE;\r
42 }\r
43 #endif\r
44 \r
45 VOID\r
46 phydm_la_get_tx_pkt_buf(\r
47         IN              PVOID                   pDM_VOID\r
48         )\r
49 {\r
50         PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
51         PRT_ADCSMP                      AdcSmp = &(pDM_Odm->adcsmp);\r
52         PRT_ADCSMP_STRING       ADCSmpBuf = &(AdcSmp->ADCSmpBuf);\r
53         u4Byte                          i = 0, value32, DataL = 0, DataH = 0;\r
54         u4Byte                          Addr, Finish_Addr;\r
55         u4Byte                          End_Addr = (ADCSmpBuf->start_pos  + ADCSmpBuf->buffer_size)-1;  /*End_Addr = 0x3ffff;*/\r
56         BOOLEAN                         bRoundUp;\r
57         static u4Byte                   page = 0xFF;\r
58         u4Byte                          smp_cnt = 0, smp_number = 0, Addr_8byte = 0;\r
59 \r
60         ODM_Memory_Set(pDM_Odm, ADCSmpBuf->Octet, 0, ADCSmpBuf->Length);\r
61         ODM_Write1Byte(pDM_Odm, 0x0106, 0x69);\r
62 \r
63         DbgPrint("GetTxPktBuf\n");\r
64 \r
65         value32 = ODM_Read4Byte(pDM_Odm, 0x7c0);\r
66         bRoundUp = (BOOLEAN)((value32 & BIT31) >> 31);\r
67         Finish_Addr = (value32 & 0x7FFF0000) >> 16;     /*Reg7C0[30:16]: finish addr (unit: 8byte)*/\r
68 \r
69         if(bRoundUp) {\r
70                 Addr = (Finish_Addr+1)<<3;\r
71                 DbgPrint("bRoundUp = ((%d)), Finish_Addr=((0x%x)), 0x7c0=((0x%x)) \n", bRoundUp, Finish_Addr, value32);\r
72                 smp_number = ((ADCSmpBuf->buffer_size)>>3);     /*Byte to 64Byte*/\r
73         } else   {\r
74                 Addr = ADCSmpBuf->start_pos;\r
75                 \r
76                 Addr_8byte = Addr>>3;\r
77                 if(Addr_8byte > Finish_Addr)\r
78                         smp_number = Addr_8byte - Finish_Addr;\r
79                 else\r
80                         smp_number = Finish_Addr - Addr_8byte;\r
81 \r
82                 DbgPrint("bRoundUp = ((%d)), Finish_Addr=((0x%x * 8Byte)), Start_Addr = ((0x%x * 8Byte)), smp_number = ((%d))\n", bRoundUp, Finish_Addr, Addr_8byte, smp_number);\r
83                 \r
84         }\r
85         /*      \r
86         DbgPrint("bRoundUp = %d, Finish_Addr=0x%x, value32=0x%x\n", bRoundUp, Finish_Addr, value32);\r
87         DbgPrint("End_Addr = %x, ADCSmpBuf->start_pos = 0x%x, ADCSmpBuf->buffer_size = 0x%x\n", End_Addr, ADCSmpBuf->start_pos, ADCSmpBuf->buffer_size);\r
88         */\r
89 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
90         watchdog_stop(pDM_Odm->priv);\r
91 #endif\r
92 \r
93         if (pDM_Odm->SupportICType & ODM_RTL8197F) {\r
94                 for (Addr = 0x0, i = 0; Addr < End_Addr; Addr += 8, i += 2) {   /*64K byte*/\r
95                         if ((Addr&0xfff) == 0)\r
96                                 ODM_SetBBReg(pDM_Odm, 0x0140, bMaskLWord, 0x780+(Addr >> 12));\r
97                         DataL = ODM_GetBBReg(pDM_Odm, 0x8000+(Addr&0xfff), bMaskDWord);\r
98                         DataH = ODM_GetBBReg(pDM_Odm, 0x8000+(Addr&0xfff)+4, bMaskDWord);\r
99 \r
100                         DbgPrint("%08x%08x\n", DataH, DataL);           \r
101                 }\r
102         } else {\r
103                 while (Addr != (Finish_Addr<<3)) {\r
104                         if (page != (Addr >> 12)) {\r
105                                 /*Reg140=0x780+(Addr>>12), Addr=0x30~0x3F, total 16 pages*/\r
106                                 page = (Addr >> 12);\r
107                         }\r
108                         ODM_SetBBReg(pDM_Odm, 0x0140, bMaskLWord, 0x780+page);\r
109 \r
110                         /*pDataL = 0x8000+(Addr&0xfff);*/\r
111                         DataL = ODM_GetBBReg(pDM_Odm, 0x8000+(Addr&0xfff), bMaskDWord);\r
112                         DataH = ODM_GetBBReg(pDM_Odm, 0x8000+(Addr&0xfff)+4, bMaskDWord);\r
113 \r
114                         #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
115                         ADCSmpBuf->Octet[i] = DataH;\r
116                         ADCSmpBuf->Octet[i+1] = DataL;\r
117                         #endif\r
118 \r
119                         #if DBG\r
120                         DbgPrint("%08x%08x\n", DataH, DataL);\r
121                         #else\r
122                                 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
123                                 RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD, ("%08x%08x\n", ADCSmpBuf->Octet[i], ADCSmpBuf->Octet[i+1]));\r
124                                 #endif\r
125                         #endif\r
126                         \r
127                         i = i + 2;\r
128                         \r
129                         if ((Addr+8) >= End_Addr)\r
130                                 Addr = ADCSmpBuf->start_pos;\r
131                         else\r
132                                 Addr = Addr + 8;\r
133 \r
134                         smp_cnt ++;\r
135                         if (smp_cnt >= (smp_number-1))\r
136                                 break;\r
137                 }\r
138                 DbgPrint("smp_cnt = ((%d))\n", smp_cnt);\r
139                 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
140                 RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD, ("smp_cnt = ((%d))\n", smp_cnt));\r
141                 #endif\r
142         }\r
143         \r
144 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
145         watchdog_resume(pDM_Odm->priv);\r
146 #endif\r
147 }       \r
148 \r
149 VOID\r
150 phydm_la_mode_set_mac_iq_dump(\r
151         IN      PVOID           pDM_VOID\r
152 )\r
153 {\r
154         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
155         PRT_ADCSMP              AdcSmp = &(pDM_Odm->adcsmp);\r
156         u4Byte                  reg_value;\r
157 \r
158         ODM_Write1Byte(pDM_Odm, 0x7c0, 0);              /*clear all 0x7c0*/\r
159         ODM_SetMACReg(pDM_Odm, 0x7c0, BIT0, 1);  /*Enable LA mode HW block*/\r
160 \r
161         if (AdcSmp->la_trig_mode == PHYDM_MAC_TRIG) {\r
162 \r
163                 AdcSmp->is_bb_trigger = 0;\r
164                 ODM_SetMACReg(pDM_Odm, 0x7c0, BIT2, 1); /*polling bit for MAC mode*/\r
165                 ODM_SetMACReg(pDM_Odm, 0x7c0, BIT4|BIT3, AdcSmp->la_trigger_edge); /*trigger mode for MAC*/\r
166                 \r
167                 DbgPrint("[MAC_trig] ref_mask = ((0x%x)), ref_value = ((0x%x)), dbg_port = ((0x%x))\n", AdcSmp->la_mac_ref_mask, AdcSmp->la_TrigSigSel, AdcSmp->la_dbg_port);\r
168                 /*[Set MAC Debug Port]*/\r
169                 ODM_SetMACReg(pDM_Odm, 0xF4, BIT16, 1);\r
170                 ODM_SetMACReg(pDM_Odm, 0x38, 0xff0000, AdcSmp->la_dbg_port);\r
171                 ODM_SetMACReg(pDM_Odm, 0x7c4, bMaskDWord, AdcSmp->la_mac_ref_mask);\r
172                 ODM_SetMACReg(pDM_Odm, 0x7c8, bMaskDWord, AdcSmp->la_TrigSigSel);\r
173                 \r
174         } else {\r
175         \r
176                 AdcSmp->is_bb_trigger = 1;\r
177                 ODM_SetMACReg(pDM_Odm, 0x7c0, BIT1, 1); /*polling bit for BB ADC mode*/\r
178 \r
179                 if (AdcSmp->la_trig_mode == PHYDM_ADC_MAC_TRIG) {\r
180 \r
181                         ODM_SetMACReg(pDM_Odm, 0x7c0, BIT3, 1); /*polling bit for MAC trigger event*/\r
182                         ODM_SetMACReg(pDM_Odm, 0x7c0, BIT7|BIT6, AdcSmp->la_TrigSigSel);\r
183                         \r
184                         if (AdcSmp->la_TrigSigSel == ADCSMP_TRIG_REG)                   \r
185                                 ODM_SetMACReg(pDM_Odm, 0x7c0, BIT5, 1); /* manual trigger 0x7C0[5] = 0 -> 1*/\r
186                 } \r
187         }\r
188 \r
189         reg_value = ODM_GetBBReg(pDM_Odm, 0x7c0, 0xff);\r
190         DbgPrint("4. [Set MAC IQ dump] 0x7c0[7:0] = ((0x%x))\n", reg_value);\r
191         #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
192         RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD, ("4. [Set MAC IQ dump] 0x7c0[7:0] = ((0x%x))\n", reg_value));\r
193         #endif  \r
194         \r
195 }\r
196 \r
197 void\r
198 phydm_la_mode_set_dma_type(\r
199         IN      PVOID           pDM_VOID,\r
200         IN      u1Byte          la_dma_type\r
201 )\r
202 {\r
203         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
204 \r
205         DbgPrint("2. [LA mode DMA setting] Dma_type = ((%d))\n", la_dma_type);\r
206         #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
207         RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD, ("2. [LA mode DMA setting] Dma_type = ((%d))\n", la_dma_type));\r
208         #endif  \r
209 \r
210         if (pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT)\r
211                 ODM_SetBBReg(pDM_Odm, 0x9a0, 0xf00, la_dma_type);       /*0x9A0[11:8]*/\r
212         else\r
213                 ODM_SetBBReg(pDM_Odm , ODM_ADC_TRIGGER_Jaguar2, 0xf00, la_dma_type);    /*0x95C[11:8]*/\r
214 }\r
215 \r
216 VOID\r
217 phydm_adc_smp_start(\r
218         IN              PVOID                   pDM_VOID\r
219         )\r
220 {\r
221         PDM_ODM_T                               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
222         PRT_ADCSMP                              AdcSmp = &(pDM_Odm->adcsmp);    \r
223         u1Byte                                  tmpU1b;\r
224         u1Byte                                  backup_DMA, while_cnt = 0;\r
225         u1Byte                                  polling_ok = FALSE, target_polling_bit;\r
226 \r
227         phydm_la_mode_bb_setting(pDM_Odm);\r
228         phydm_la_mode_set_dma_type(pDM_Odm, AdcSmp->la_dma_type);\r
229         phydm_la_mode_set_trigger_time(pDM_Odm, AdcSmp->la_TriggerTime);        \r
230 \r
231         if (pDM_Odm->SupportICType & ODM_RTL8197F)\r
232                 ODM_SetBBReg(pDM_Odm, 0xd00, BIT26, 0x1);\r
233         else {  /*for 8814A and 8822B?*/\r
234                 ODM_Write1Byte(pDM_Odm, 0x198c, 0x7);\r
235                 ODM_Write1Byte(pDM_Odm, 0x8b4, 0x80);\r
236                 //ODM_SetBBReg(pDM_Odm, 0x8b4, BIT7, 1);\r
237         }\r
238         \r
239         phydm_la_mode_set_mac_iq_dump(pDM_Odm);\r
240 //return;\r
241 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
242         watchdog_stop(pDM_Odm->priv);\r
243 #endif\r
244 \r
245         target_polling_bit = (AdcSmp->is_bb_trigger) ? BIT1 : BIT2;\r
246         do { /*Polling time always use 100ms, when it exceed 2s, break while loop*/\r
247                 tmpU1b = ODM_Read1Byte(pDM_Odm, 0x7c0);\r
248 \r
249                 if (AdcSmp->ADCSmpState != ADCSMP_STATE_SET) {\r
250                         DbgPrint("[State Error] ADCSmpState != ADCSMP_STATE_SET\n");\r
251                         break;\r
252                         \r
253                 } else if (tmpU1b & target_polling_bit) {\r
254                         ODM_delay_ms(100);\r
255                         while_cnt = while_cnt + 1;\r
256                         continue;\r
257                 } else {\r
258                         DbgPrint("[LA Query OK] polling_bit=((0x%x))\n", target_polling_bit);\r
259                         polling_ok = TRUE;\r
260                         if (pDM_Odm->SupportICType & ODM_RTL8197F)\r
261                                 ODM_SetBBReg(pDM_Odm, 0x7c0, BIT0, 0x0);\r
262                         break;\r
263                 }\r
264         } while (while_cnt < 20);\r
265         \r
266 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
267         watchdog_resume(pDM_Odm->priv);\r
268 #if (RTL8197F_SUPPORT)\r
269                 if (pDM_Odm->SupportICType & ODM_RTL8197F) {\r
270                         /*Stop DMA*/\r
271                         backup_DMA = ODM_GetMACReg(pDM_Odm, 0x300, bMaskLWord);\r
272                         ODM_SetMACReg(pDM_Odm, 0x300, 0x7fff, backup_DMA|0x7fff);\r
273                         \r
274                         /*move LA mode content from IMEM to TxPktBuffer \r
275                                 Src : OCPBASE_IMEM 0x00000000\r
276                                 Dest : OCPBASE_TXBUF 0x18780000\r
277                                 Len : 64K*/\r
278                         GET_HAL_INTERFACE(pDM_Odm->priv)->InitDDMAHandler(pDM_Odm->priv, OCPBASE_IMEM, OCPBASE_TXBUF, 0x10000);\r
279                 }\r
280 #endif\r
281 #endif\r
282 \r
283         if (AdcSmp->ADCSmpState == ADCSMP_STATE_SET) {\r
284 \r
285                 if (polling_ok)\r
286                         phydm_la_get_tx_pkt_buf(pDM_Odm);\r
287                 else {\r
288                         DbgPrint("[Polling timeout]\n");\r
289                 }       \r
290         }\r
291 \r
292 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
293         if (pDM_Odm->SupportICType & ODM_RTL8197F) \r
294                 ODM_SetMACReg(pDM_Odm, 0x300, 0x7fff, backup_DMA);      /*Resume DMA*/\r
295 #endif\r
296 \r
297 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
298         if (AdcSmp->ADCSmpState == ADCSMP_STATE_SET)\r
299                 AdcSmp->ADCSmpState = ADCSMP_STATE_QUERY;\r
300 #endif\r
301 \r
302         DbgPrint("[LA mode] LA_pattern_count = ((%d))\n", AdcSmp->la_count);\r
303         #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
304         RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD, ("[LA mode] la_count = ((%d))\n", AdcSmp->la_count));\r
305         #endif\r
306 \r
307         \r
308         ADCSmp_Stop(pDM_Odm);\r
309         \r
310         if (AdcSmp->la_count == 0) {\r
311                 DbgPrint("LA Dump finished ---------->\n\n\n");\r
312                 /**/\r
313         } else {\r
314                 AdcSmp->la_count --;\r
315                 DbgPrint("LA Dump more ---------->\n\n\n");             \r
316                 ADCSmp_Set(pDM_Odm, AdcSmp->la_trig_mode, AdcSmp->la_TrigSigSel, AdcSmp->la_dma_type, AdcSmp->la_TriggerTime, 0);\r
317         }\r
318 \r
319 }\r
320 \r
321 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
322 VOID\r
323 ADCSmpWorkItemCallback(\r
324         IN      PVOID   pContext\r
325         )\r
326 {\r
327         PADAPTER                        Adapter = (PADAPTER)pContext;\r
328         PHAL_DATA_TYPE          pHalData = GET_HAL_DATA(Adapter);\r
329         PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;\r
330         PRT_ADCSMP              AdcSmp = &(pDM_Odm->adcsmp);\r
331 \r
332         DbgPrint("[WorkItem Call back] LA_State=((%d))\n", AdcSmp->ADCSmpState);\r
333         phydm_adc_smp_start(pDM_Odm);\r
334 }\r
335 #endif\r
336 \r
337 VOID\r
338 ADCSmp_Set(\r
339         IN      PVOID   pDM_VOID,\r
340         IN      u1Byte  trig_mode,\r
341         IN      u4Byte  TrigSigSel,\r
342         IN      u1Byte  DmaDataSigSel,\r
343         IN      u4Byte  TriggerTime,\r
344         IN      u2Byte  PollingTime\r
345         )\r
346 {\r
347         PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
348         BOOLEAN                         is_set_success = TRUE;\r
349         PRT_ADCSMP                      AdcSmp = &(pDM_Odm->adcsmp);\r
350 \r
351         AdcSmp->la_trig_mode = trig_mode;\r
352         AdcSmp->la_TrigSigSel = TrigSigSel;\r
353         AdcSmp->la_dma_type = DmaDataSigSel;\r
354         AdcSmp->la_TriggerTime = TriggerTime;\r
355 \r
356 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
357         if (AdcSmp->ADCSmpState != ADCSMP_STATE_IDLE)\r
358                 is_set_success = FALSE;\r
359         else if (AdcSmp->ADCSmpBuf.Length == 0)\r
360                 is_set_success = phydm_la_buffer_allocate(pDM_Odm);\r
361 #endif\r
362 \r
363         if (is_set_success) {\r
364                 AdcSmp->ADCSmpState = ADCSMP_STATE_SET;\r
365                 \r
366                 DbgPrint("[LA Set Success] LA_State=((%d))\n", AdcSmp->ADCSmpState);\r
367                 \r
368                 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
369 \r
370                 DbgPrint("ADCSmp_work_item_index = ((%d))\n", AdcSmp->la_work_item_index);\r
371                 if (AdcSmp->la_work_item_index != 0) {\r
372                         ODM_ScheduleWorkItem(&(AdcSmp->ADCSmpWorkItem_1));\r
373                         AdcSmp->la_work_item_index = 0;\r
374                 } else {\r
375                         ODM_ScheduleWorkItem(&(AdcSmp->ADCSmpWorkItem));\r
376                         AdcSmp->la_work_item_index = 1;\r
377                 }\r
378                 #else\r
379                 phydm_adc_smp_start(pDM_Odm);\r
380                 #endif\r
381         } else {\r
382                 DbgPrint("[LA Set Fail] LA_State=((%d))\n", AdcSmp->ADCSmpState);\r
383         }       \r
384 \r
385         \r
386 }\r
387 \r
388 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
389 RT_STATUS\r
390 ADCSmp_Query(\r
391         IN      PVOID                           pDM_VOID,\r
392         IN      ULONG                           InformationBufferLength, \r
393         OUT     PVOID                           InformationBuffer, \r
394         OUT     PULONG                          BytesWritten\r
395         )\r
396 {\r
397         PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
398         PRT_ADCSMP                      AdcSmp = &(pDM_Odm->adcsmp);\r
399         RT_STATUS                       retStatus = RT_STATUS_SUCCESS;\r
400         PRT_ADCSMP_STRING       ADCSmpBuf = &(AdcSmp->ADCSmpBuf);\r
401 \r
402         DbgPrint("[%s] LA_State=((%d))", __func__, AdcSmp->ADCSmpState);\r
403 \r
404         if (InformationBufferLength != ADCSmpBuf->buffer_size)  {\r
405                 *BytesWritten = 0;\r
406                 retStatus = RT_STATUS_RESOURCE;\r
407         } else if (ADCSmpBuf->Length != ADCSmpBuf->buffer_size) {\r
408                 *BytesWritten = 0;\r
409                 retStatus = RT_STATUS_RESOURCE;\r
410         } else if (AdcSmp->ADCSmpState != ADCSMP_STATE_QUERY) {\r
411                 *BytesWritten = 0;\r
412                 retStatus = RT_STATUS_PENDING;\r
413         } else {\r
414                 ODM_MoveMemory(pDM_Odm, InformationBuffer, ADCSmpBuf->Octet, ADCSmpBuf->buffer_size);\r
415                 *BytesWritten = ADCSmpBuf->buffer_size;\r
416 \r
417                 AdcSmp->ADCSmpState = ADCSMP_STATE_IDLE;\r
418         }\r
419 \r
420         DbgPrint("Return Status %d\n", retStatus);\r
421 \r
422         return retStatus;\r
423 }\r
424 #endif\r
425 \r
426 VOID\r
427 ADCSmp_Stop(\r
428         IN              PVOID                   pDM_VOID\r
429         )\r
430 {\r
431         PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;  \r
432         PRT_ADCSMP                      AdcSmp = &(pDM_Odm->adcsmp);\r
433 \r
434         AdcSmp->ADCSmpState = ADCSMP_STATE_IDLE;\r
435         DbgPrint("[LA_Stop] LA_state = ((%d))\n", AdcSmp->ADCSmpState);\r
436 }\r
437 \r
438 VOID\r
439 ADCSmp_Init(\r
440         IN              PVOID                   pDM_VOID\r
441         )\r
442 {\r
443         PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;  \r
444         PRT_ADCSMP                      AdcSmp = &(pDM_Odm->adcsmp);\r
445         PRT_ADCSMP_STRING       ADCSmpBuf = &(AdcSmp->ADCSmpBuf);\r
446 \r
447         AdcSmp->ADCSmpState = ADCSMP_STATE_IDLE;\r
448 \r
449         if (pDM_Odm->SupportICType & ODM_RTL8814A) {\r
450                 ADCSmpBuf->start_pos = 0x30000;\r
451                 ADCSmpBuf->buffer_size = 0x10000;       \r
452         } else if (pDM_Odm->SupportICType & ODM_RTL8822B) {\r
453                 ADCSmpBuf->start_pos = 0x20000;\r
454                 ADCSmpBuf->buffer_size = 0x20000;       \r
455         } else if (pDM_Odm->SupportICType & ODM_RTL8197F) {\r
456                 ADCSmpBuf->start_pos = 0x00000;\r
457                 ADCSmpBuf->buffer_size = 0x10000;       \r
458         } else if (pDM_Odm->SupportICType & ODM_RTL8821C) {\r
459                 ADCSmpBuf->start_pos = 0x8000;\r
460                 ADCSmpBuf->buffer_size = 0x8000;        \r
461         }\r
462         \r
463 }\r
464 \r
465 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
466 VOID\r
467 ADCSmp_DeInit(\r
468         IN              PVOID                   pDM_VOID\r
469         )\r
470 {\r
471         PDM_ODM_T                       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
472         PRT_ADCSMP                      AdcSmp = &(pDM_Odm->adcsmp);\r
473         PRT_ADCSMP_STRING       ADCSmpBuf = &(AdcSmp->ADCSmpBuf);\r
474 \r
475         ADCSmp_Stop(pDM_Odm);\r
476 \r
477         if (ADCSmpBuf->Length != 0x0) {\r
478                 ODM_FreeMemory(pDM_Odm, ADCSmpBuf->Octet, ADCSmpBuf->Length);\r
479                 ADCSmpBuf->Length = 0x0;\r
480         }\r
481 }       \r
482 \r
483 #endif\r
484 \r
485 \r
486 VOID\r
487 phydm_la_mode_bb_setting(\r
488         IN      PVOID           pDM_VOID\r
489 )\r
490 {\r
491         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
492         PRT_ADCSMP              AdcSmp = &(pDM_Odm->adcsmp);\r
493 \r
494         u1Byte  trig_mode = AdcSmp->la_trig_mode;\r
495         u4Byte  TrigSigSel = AdcSmp->la_TrigSigSel;\r
496         u4Byte  DbgPort = AdcSmp->la_dbg_port;\r
497         u1Byte  bTriggerEdge = AdcSmp->la_trigger_edge;\r
498         u1Byte  sampling_rate = AdcSmp->la_smp_rate;\r
499 \r
500         DbgPrint("1. [LA mode bb_setting] trig_mode = ((%d)), DbgPort = ((0x%x)), Trig_Edge = ((%d)), smp_rate = ((%d)), Trig_Sel = ((0x%x))\n",\r
501                 trig_mode, DbgPort, bTriggerEdge, sampling_rate, TrigSigSel);\r
502 \r
503         #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
504         RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD, ("1. [LA mode bb_setting]trig_mode = ((%d)), DbgPort = ((0x%x)), Trig_Edge = ((%d)), smp_rate = ((%d)), Trig_Sel = ((0x%x))\n",\r
505                 trig_mode, DbgPort, bTriggerEdge, sampling_rate, TrigSigSel));\r
506         #endif\r
507 \r
508         if (trig_mode == PHYDM_MAC_TRIG)\r
509                 TrigSigSel = 0; /*ignore this setting*/\r
510 \r
511         if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) {\r
512 \r
513                 if (trig_mode == PHYDM_ADC_RF0_TRIG) {\r
514                         ODM_SetBBReg(pDM_Odm, 0x8f8, BIT25|BIT24|BIT23|BIT22, 9);       /*DBGOUT_RFC_a[31:0]*/\r
515                 } else if (trig_mode == PHYDM_ADC_RF1_TRIG) {\r
516                         ODM_SetBBReg(pDM_Odm, 0x8f8, BIT25|BIT24|BIT23|BIT22, 8);       /*DBGOUT_RFC_b[31:0]*/\r
517                 } else {\r
518                         ODM_SetBBReg(pDM_Odm, 0x8f8, BIT25|BIT24|BIT23|BIT22, 0);\r
519                 }\r
520                 /*\r
521                         (0:) '{ofdm_dbg[31:0]}'\r
522                         (1:) '{cca,crc32_fail,dbg_ofdm[29:0]}'\r
523                         (2:) '{vbon,crc32_fail,dbg_ofdm[29:0]}'\r
524                         (3:) '{cca,crc32_ok,dbg_ofdm[29:0]}'\r
525                         (4:) '{vbon,crc32_ok,dbg_ofdm[29:0]}'\r
526                         (5:) '{dbg_iqk_anta}'\r
527                         (6:) '{cca,ofdm_crc_ok,dbg_dp_anta[29:0]}'\r
528                         (7:) '{dbg_iqk_antb}'\r
529                         (8:) '{DBGOUT_RFC_b[31:0]}'\r
530                         (9:) '{DBGOUT_RFC_a[31:0]}'\r
531                         (a:) '{dbg_ofdm}'\r
532                         (b:) '{dbg_cck}'\r
533                 */\r
534                 \r
535                 ODM_SetBBReg(pDM_Odm, 0x198C , BIT2|BIT1|BIT0, 7); /*disable dbg clk gating*/\r
536 \r
537                 /*dword= ODM_GetBBReg(pDM_Odm, 0x8FC, bMaskDWord);*/\r
538                 /*DbgPrint("dbg_port = ((0x%x))\n", dword);*/\r
539                 ODM_SetBBReg(pDM_Odm , 0x95C, 0x1f, TrigSigSel);        /*0x95C[4:0], BB debug port bit*/\r
540                 ODM_SetBBReg(pDM_Odm, 0x8FC, bMaskDWord, DbgPort);\r
541                 ODM_SetBBReg(pDM_Odm, 0x95C , BIT31, bTriggerEdge); /*0: posedge, 1: negedge*/\r
542                 ODM_SetBBReg(pDM_Odm, 0x95c, 0xe0, sampling_rate);\r
543                 /*      (0:) '80MHz'\r
544                         (1:) '40MHz'\r
545                         (2:) '20MHz'\r
546                         (3:) '10MHz'\r
547                         (4:) '5MHz'\r
548                         (5:) '2.5MHz'\r
549                         (6:) '1.25MHz'\r
550                         (7:) '160MHz (for BW160 ic)'\r
551                 */\r
552         } else {\r
553                 ODM_SetBBReg(pDM_Odm, 0x9a0, 0x1f, TrigSigSel); /*0x9A0[4:0], BB debug port bit*/\r
554                 ODM_SetBBReg(pDM_Odm, 0x908, bMaskDWord, DbgPort);\r
555                 ODM_SetBBReg(pDM_Odm, 0x9A0 , BIT31, bTriggerEdge); /*0: posedge, 1: negedge*/\r
556                 ODM_SetBBReg(pDM_Odm, 0x9A0, 0xe0, sampling_rate);\r
557                 /*      (0:) '80MHz'\r
558                         (1:) '40MHz'\r
559                         (2:) '20MHz'\r
560                         (3:) '10MHz'\r
561                         (4:) '5MHz'\r
562                         (5:) '2.5MHz'\r
563                         (6:) '1.25MHz'\r
564                         (7:) '160MHz (for BW160 ic)'\r
565                 */\r
566         }\r
567 }\r
568 \r
569 void\r
570 phydm_la_mode_set_trigger_time(\r
571         IN      PVOID           pDM_VOID,\r
572         IN      u4Byte          TriggerTime_mu_sec\r
573 )\r
574 {\r
575         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
576         u1Byte                  TriggerTime_unit_num;\r
577         u4Byte                  time_unit = 0;\r
578 \r
579         if (TriggerTime_mu_sec < 128) {\r
580                 time_unit = 0; /*unit: 1mu sec*/\r
581         } else if (TriggerTime_mu_sec < 256) {\r
582                 time_unit = 1; /*unit: 2mu sec*/        \r
583         } else if (TriggerTime_mu_sec < 512) {\r
584                 time_unit = 2; /*unit: 4mu sec*/        \r
585         } else if (TriggerTime_mu_sec < 1024) {\r
586                 time_unit = 3; /*unit: 8mu sec*/        \r
587         } else if (TriggerTime_mu_sec < 2048) {\r
588                 time_unit = 4; /*unit: 16mu sec*/       \r
589         } else if (TriggerTime_mu_sec < 4096) {\r
590                 time_unit = 5; /*unit: 32mu sec*/       \r
591         } else if (TriggerTime_mu_sec < 8192) {\r
592                 time_unit = 6; /*unit: 64mu sec*/       \r
593         }\r
594         \r
595         TriggerTime_unit_num = (u1Byte)(TriggerTime_mu_sec>>time_unit);\r
596         \r
597         DbgPrint("3. [Set Trigger Time] Trig_Time = ((%d)) * unit = ((2^%d us))\n", TriggerTime_unit_num, time_unit);\r
598         #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
599         RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD, ("3. [Set Trigger Time] Trig_Time = ((%d)) * unit = ((2^%d us))\n", TriggerTime_unit_num, time_unit));\r
600         #endif  \r
601         \r
602         ODM_SetMACReg(pDM_Odm, 0x7cc , BIT20|BIT19|BIT18, time_unit);\r
603         ODM_SetMACReg(pDM_Odm, 0x7c0, 0x7f00, (TriggerTime_unit_num& 0x7f));\r
604         \r
605 }\r
606 \r
607 \r
608 VOID\r
609 phydm_lamode_trigger_setting(\r
610         IN              PVOID           pDM_VOID,\r
611         IN              char                    input[][16],\r
612         IN              u4Byte          *_used,\r
613         OUT             char                    *output,\r
614         IN              u4Byte          *_out_len,\r
615         IN              u4Byte          input_num\r
616         )\r
617         {\r
618                 PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
619                 PRT_ADCSMP      AdcSmp = &(pDM_Odm->adcsmp);\r
620                 u1Byte          trig_mode, DmaDataSigSel;\r
621                 u4Byte          TrigSigSel;\r
622                 BOOLEAN         bEnableLaMode, bTriggerEdge;\r
623                 u4Byte          DbgPort, TriggerTime_mu_sec;\r
624                 u4Byte          mac_ref_signal_mask;\r
625                 u1Byte          sampling_rate = 0, i;\r
626                 char            help[] = "-h";\r
627                 u4Byte                  var1[10] = {0}; \r
628                 u4Byte used = *_used;\r
629                 u4Byte out_len = *_out_len;             \r
630                 \r
631                 if (pDM_Odm->SupportICType & PHYDM_IC_SUPPORT_LA_MODE) {\r
632                         \r
633                         PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);\r
634                         bEnableLaMode = (BOOLEAN)var1[0];\r
635                         /*DbgPrint("echo cmd input_num = %d\n", input_num);*/\r
636 \r
637                         if ((strcmp(input[1], help) == 0)) {\r
638                                 PHYDM_SNPRINTF((output+used, out_len-used, "{En} {0:BB,1:BB_MAC,2:RF0,3:RF1,4:MAC} \n {BB:DbgPort[bit],BB_MAC:0-ok/1-fail/2-cca,MAC:ref} {DMA type} {TrigTime} \n {PollingTime/ref_mask} {DbgPort} {0:P_Edge, 1:N_Edge} {SpRate:0-80M,1-40M,2-20M} {Capture num}\n"));\r
639                                 /**/\r
640                         } else if ((bEnableLaMode == 1)) {\r
641                         \r
642                                 PHYDM_SSCANF(input[2], DCMD_DECIMAL, &var1[1]);\r
643                                 \r
644                                 trig_mode = (u1Byte)var1[1];\r
645                                 \r
646                                 if (trig_mode == PHYDM_MAC_TRIG) {\r
647                                         PHYDM_SSCANF(input[3], DCMD_HEX, &var1[2]);\r
648                                 } else {\r
649                                         PHYDM_SSCANF(input[3], DCMD_DECIMAL, &var1[2]);\r
650                                 }\r
651                                 TrigSigSel = var1[2];\r
652                                 \r
653                                 PHYDM_SSCANF(input[4], DCMD_DECIMAL, &var1[3]);\r
654                                 PHYDM_SSCANF(input[5], DCMD_DECIMAL, &var1[4]);\r
655                                 PHYDM_SSCANF(input[6], DCMD_HEX, &var1[5]);\r
656                                 PHYDM_SSCANF(input[7], DCMD_HEX, &var1[6]);\r
657                                 PHYDM_SSCANF(input[8], DCMD_DECIMAL, &var1[7]);\r
658                                 PHYDM_SSCANF(input[9], DCMD_DECIMAL, &var1[8]);\r
659                                 PHYDM_SSCANF(input[10], DCMD_DECIMAL, &var1[9]);\r
660 \r
661                                 DmaDataSigSel = (u1Byte)var1[3];\r
662                                 TriggerTime_mu_sec = var1[4]; /*unit: us*/\r
663 \r
664                                 AdcSmp->la_mac_ref_mask = var1[5];\r
665                                 AdcSmp->la_dbg_port = var1[6];\r
666                                 AdcSmp->la_trigger_edge = (u1Byte) var1[7];\r
667                                 AdcSmp->la_smp_rate = (u1Byte)(var1[8] & 0x7);\r
668                                 AdcSmp->la_count = var1[9];\r
669 \r
670 \r
671                                 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
672                                 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
673                                 RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD, ("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
674                                 #endif\r
675                                 \r
676                                 PHYDM_SNPRINTF((output+used, out_len-used, "a.En= ((1)),  b.mode = ((%d)), c.Trig_Sel = ((0x%x)), d.Dma_type = ((%d))\n", trig_mode, TrigSigSel, DmaDataSigSel));\r
677                                 PHYDM_SNPRINTF((output+used, out_len-used, "e.Trig_Time = ((%dus)), f.mac_ref_mask = ((0x%x)), g.dbg_port = ((0x%x))\n", TriggerTime_mu_sec, AdcSmp->la_mac_ref_mask, AdcSmp->la_dbg_port));\r
678                                 PHYDM_SNPRINTF((output+used, out_len-used, "h.Trig_edge = ((%d)), i.smp rate = ((%d MHz)), j.Cap_num = ((%d))\n", AdcSmp->la_trigger_edge, (80>>AdcSmp->la_smp_rate), AdcSmp->la_count ));\r
679 \r
680                                 ADCSmp_Set(pDM_Odm, trig_mode, TrigSigSel, DmaDataSigSel, TriggerTime_mu_sec, 0);\r
681 \r
682                         } else {\r
683                                 ADCSmp_Stop(pDM_Odm);\r
684                                 PHYDM_SNPRINTF((output+used, out_len-used, "Disable LA mode\n"));\r
685                         }\r
686                 } \r
687         }\r
688 \r
689 #endif  /*endif PHYDM_LA_MODE_SUPPORT == 1*/\r
690 \r