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