xref: /OK3568_Linux_fs/kernel/drivers/net/wireless/rockchip_wlan/rtl8822be/hal/phydm/phydm_adc_sampling.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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