xref: /OK3568_Linux_fs/kernel/drivers/net/wireless/rockchip_wlan/rtl8822be/hal/phydm/rtl8822b/halphyrf_8822b.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17  *
18  *
19  ******************************************************************************/
20 
21 #include "mp_precomp.h"
22 #include "../phydm_precomp.h"
23 
24 #if (RTL8822B_SUPPORT == 1)
25 
26 BOOLEAN
GetMixModeTXAGCBBSWingOffset_8822b(PVOID pDM_VOID,PWRTRACK_METHOD Method,u1Byte RFPath,u1Byte TxPowerIndexOffest)27 GetMixModeTXAGCBBSWingOffset_8822b(
28 	PVOID				pDM_VOID,
29 	PWRTRACK_METHOD	Method,
30 	u1Byte				RFPath,
31 	u1Byte				TxPowerIndexOffest
32 	)
33 {
34 	PDM_ODM_T		pDM_Odm	=	(PDM_ODM_T)pDM_VOID;
35 	PODM_RF_CAL_T	pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);
36 
37 	u1Byte	BBSwingUpperBound = pRFCalibrateInfo->DefaultOfdmIndex + 10;
38 	u1Byte	BBSwingLowerBound = 0;
39 
40 	s1Byte	TX_AGC_Index = 0;
41 	u1Byte	TX_BBSwing_Index = pRFCalibrateInfo->DefaultOfdmIndex;
42 
43 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
44 				  ("Path_%d pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]=%d, TxPowerIndexOffest=%d\n",
45 				   RFPath, pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath], TxPowerIndexOffest));
46 
47 	if (TxPowerIndexOffest > 0XF)
48 		TxPowerIndexOffest = 0XF;
49 
50 	if (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] >= 0 && pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] <= TxPowerIndexOffest) {
51 		TX_AGC_Index = pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath];
52 		TX_BBSwing_Index = pRFCalibrateInfo->DefaultOfdmIndex;
53 	} else if (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] > TxPowerIndexOffest) {
54 		TX_AGC_Index = TxPowerIndexOffest;
55 		pRFCalibrateInfo->Remnant_OFDMSwingIdx[RFPath] = pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] - TxPowerIndexOffest;
56 		TX_BBSwing_Index = pRFCalibrateInfo->DefaultOfdmIndex + pRFCalibrateInfo->Remnant_OFDMSwingIdx[RFPath];
57 
58 		if (TX_BBSwing_Index > BBSwingUpperBound)
59 			TX_BBSwing_Index = BBSwingUpperBound;
60 	} else {
61 		TX_AGC_Index = 0;
62 
63 		if (pRFCalibrateInfo->DefaultOfdmIndex > (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] * (-1)))
64 			TX_BBSwing_Index = pRFCalibrateInfo->DefaultOfdmIndex + pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath];
65 		else
66 			TX_BBSwing_Index = BBSwingLowerBound;
67 
68 		if (TX_BBSwing_Index <  BBSwingLowerBound)
69 			TX_BBSwing_Index = BBSwingLowerBound;
70 	}
71 
72 	pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] = TX_AGC_Index;
73 	pRFCalibrateInfo->BbSwingIdxOfdm[RFPath] = TX_BBSwing_Index;
74 
75 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
76 				  ("MixMode Offset Path_%d   pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]=%d   pRFCalibrateInfo->BbSwingIdxOfdm[RFPath]=%d   TxPowerIndexOffest=%d\n",
77 				   RFPath, pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath], pRFCalibrateInfo->BbSwingIdxOfdm[RFPath] , TxPowerIndexOffest));
78 
79 	return TRUE;
80 }
81 
82 
83 VOID
ODM_TxPwrTrackSetPwr8822B(PVOID pDM_VOID,PWRTRACK_METHOD Method,u1Byte RFPath,u1Byte ChannelMappedIndex)84 ODM_TxPwrTrackSetPwr8822B(
85 	PVOID				pDM_VOID,
86 	PWRTRACK_METHOD	Method,
87 	u1Byte				RFPath,
88 	u1Byte				ChannelMappedIndex
89 	)
90 {
91 
92 #if 0
93 	PDM_ODM_T	pDM_Odm = (PDM_ODM_T)pDM_VOID;
94 	PADAPTER	Adapter = pDM_Odm->Adapter;
95 	HAL_DATA_TYPE	*pHalData = GET_HAL_DATA(Adapter);
96 	PODM_RF_CAL_T	pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);
97 	u1Byte			Channel  = pHalData->CurrentChannel;
98 	u1Byte			BandWidth  = pHalData->CurrentChannelBW;
99 	u1Byte			TxPowerIndex = 0;
100 	u1Byte			TxRate = 0xFF;
101 	RT_STATUS		status = RT_STATUS_SUCCESS;
102 
103 	PHALMAC_PWR_TRACKING_OPTION pPwr_tracking_opt = &(pRFCalibrateInfo->HALMAC_PWR_TRACKING_INFO);
104 
105 	if (pDM_Odm->mp_mode == TRUE) {
106 		#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
107 			#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
108 				#if (MP_DRIVER == 1)
109 					PMPT_CONTEXT pMptCtx = &(Adapter->MptCtx);
110 
111 					TxRate = MptToMgntRate(pMptCtx->MptRateIndex);
112 				#endif
113 			#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
114 				PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx);
115 
116 				TxRate = MptToMgntRate(pMptCtx->MptRateIndex);
117 			#endif
118 		#endif
119 	} else {
120 		u2Byte	rate	 = *(pDM_Odm->pForcedDataRate);
121 
122 		if (!rate) { /*auto rate*/
123 			#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
124 				TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate);
125 			#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
126 				if (pDM_Odm->number_linked_client != 0)
127 					TxRate = HwRateToMRate(pDM_Odm->TxRate);
128 			#endif
129 		} else { /*force rate*/
130 			TxRate = (u1Byte) rate;
131 		}
132 	}
133 
134 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Call:%s TxRate=0x%X\n", __func__, TxRate));
135 
136 	TxPowerIndex = PHY_GetTxPowerIndex(Adapter, (ODM_RF_RADIO_PATH_E) RFPath, TxRate, BandWidth, Channel);
137 
138 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
139 	   ("type=%d   TxPowerIndex=%d	 pRFCalibrateInfo->Absolute_OFDMSwingIdx=%d   pRFCalibrateInfo->DefaultOfdmIndex=%d   RFPath=%d\n", Method, TxPowerIndex, pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath], pRFCalibrateInfo->DefaultOfdmIndex, RFPath));
140 
141 	pPwr_tracking_opt->type = Method;
142 	pPwr_tracking_opt->bbswing_index = pRFCalibrateInfo->DefaultOfdmIndex;
143 	pPwr_tracking_opt->pwr_tracking_para[RFPath].enable = 1;
144 	pPwr_tracking_opt->pwr_tracking_para[RFPath].tx_pwr_index = TxPowerIndex;
145 	pPwr_tracking_opt->pwr_tracking_para[RFPath].pwr_tracking_offset_value = pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath];
146 	pPwr_tracking_opt->pwr_tracking_para[RFPath].tssi_value = 0;
147 
148 
149 	if (RFPath == (MAX_PATH_NUM_8822B - 1)) {
150 		status = HAL_MAC_Send_PowerTracking_Info(&GET_HAL_MAC_INFO(Adapter), pPwr_tracking_opt);
151 
152 		if (status == RT_STATUS_SUCCESS) {
153 			ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
154 				("Path A  0xC94=0x%X   0xC1C=0x%X\n",
155 				ODM_GetBBReg(pDM_Odm, 0xC94, BIT29 | BIT28 | BIT27 | BIT26 | BIT25),
156 				ODM_GetBBReg(pDM_Odm, 0xC1C, 0xFFE00000)
157 				));
158 			ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
159 				("Path B  0xE94=0x%X   0xE1C=0x%X\n",
160 				ODM_GetBBReg(pDM_Odm, 0xE94, BIT29 | BIT28 | BIT27 | BIT26 | BIT25),
161 				ODM_GetBBReg(pDM_Odm, 0xE1C, 0xFFE00000)
162 				));
163 		} else {
164 			ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
165 				("Power Tracking to FW Fail ret code = %d\n", status));
166 		}
167 	}
168 
169 #endif
170 
171 	PDM_ODM_T		pDM_Odm		= (PDM_ODM_T)pDM_VOID;
172 	PODM_RF_CAL_T	pRFCalibrateInfo	= &(pDM_Odm->RFCalibrateInfo);
173 	u1Byte			TxPowerIndexOffest = 0;
174 	u1Byte			TxPowerIndex = 0;
175 
176 
177 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
178 	PADAPTER		Adapter = pDM_Odm->Adapter;
179 	HAL_DATA_TYPE	*pHalData = GET_HAL_DATA(Adapter);
180 	u1Byte			Channel  = pHalData->CurrentChannel;
181 	u1Byte			BandWidth  = pHalData->CurrentChannelBW;
182 	u1Byte			TxRate = 0xFF;
183 
184 	if (pDM_Odm->mp_mode == TRUE) {
185 	#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
186 		#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
187 			#if (MP_DRIVER == 1)
188 					PMPT_CONTEXT pMptCtx = &(Adapter->MptCtx);
189 
190 					TxRate = MptToMgntRate(pMptCtx->MptRateIndex);
191 			#endif
192 		#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
193 				PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx);
194 
195 				TxRate = MptToMgntRate(pMptCtx->MptRateIndex);
196 		#endif
197 	#endif
198 	} else {
199 		u2Byte	rate	 = *(pDM_Odm->pForcedDataRate);
200 
201 		if (!rate) { /*auto rate*/
202 		#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
203 				TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate);
204 		#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
205 				if (pDM_Odm->number_linked_client != 0)
206 					TxRate = HwRateToMRate(pDM_Odm->TxRate);
207 		#endif
208 		} else { /*force rate*/
209 			TxRate = (u1Byte) rate;
210 		}
211 	}
212 
213 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Call:%s TxRate=0x%X\n", __func__, TxRate));
214 
215 #endif
216 
217 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
218 		("pRF->DefaultOfdmIndex=%d   pRF->DefaultCckIndex=%d\n", pRFCalibrateInfo->DefaultOfdmIndex, pRFCalibrateInfo->DefaultCckIndex));
219 
220 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
221 		("pRF->Absolute_OFDMSwingIdx=%d   pRF->Remnant_OFDMSwingIdx=%d   pRF->Absolute_CCKSwingIdx=%d   pRF->Remnant_CCKSwingIdx=%d   RFPath=%d\n",
222 		pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath], pRFCalibrateInfo->Remnant_OFDMSwingIdx[RFPath], pRFCalibrateInfo->Absolute_CCKSwingIdx[RFPath], pRFCalibrateInfo->Remnant_CCKSwingIdx, RFPath));
223 
224 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
225 	TxPowerIndex = PHY_GetTxPowerIndex(Adapter, (ODM_RF_RADIO_PATH_E) RFPath, TxRate, BandWidth, Channel);
226 #else
227 	TxPowerIndex = config_phydm_read_txagc_8822b(pDM_Odm, RFPath, 0x04); /*0x04(TX_AGC_OFDM_6M)*/
228 #endif
229 
230 	if (TxPowerIndex >= 63)
231 		TxPowerIndex = 63;
232 
233 	TxPowerIndexOffest = 63 - TxPowerIndex;
234 
235 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
236 		("TxPowerIndex=%d TxPowerIndexOffest=%d RFPath=%d\n", TxPowerIndex, TxPowerIndexOffest, RFPath));
237 
238 
239 	if (Method == MIX_MODE) {
240 		switch (RFPath) {
241 		case ODM_RF_PATH_A:
242 			GetMixModeTXAGCBBSWingOffset_8822b(pDM_Odm, Method, RFPath, TxPowerIndexOffest);
243 			ODM_SetBBReg(pDM_Odm, 0xC94, (BIT29 | BIT28 | BIT27 | BIT26 | BIT25), pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]);
244 			ODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[pRFCalibrateInfo->BbSwingIdxOfdm[RFPath]]);
245 
246 			ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
247 						("TXAGC(0xC94)=0x%x BBSwing(0xc1c)=0x%x BBSwingIndex=%d RFPath=%d\n",
248 						ODM_GetBBReg(pDM_Odm, 0xC94, (BIT29 | BIT28 | BIT27 | BIT26 | BIT25)),
249 						ODM_GetBBReg(pDM_Odm, 0xc1c, 0xFFE00000),
250 						pRFCalibrateInfo->BbSwingIdxOfdm[RFPath], RFPath));
251 		break;
252 
253 		case ODM_RF_PATH_B:
254 			GetMixModeTXAGCBBSWingOffset_8822b(pDM_Odm, Method, RFPath, TxPowerIndexOffest);
255 			ODM_SetBBReg(pDM_Odm, 0xE94, (BIT29 | BIT28 | BIT27 | BIT26 | BIT25), pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]);
256 			ODM_SetBBReg(pDM_Odm, rB_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[pRFCalibrateInfo->BbSwingIdxOfdm[RFPath]]);
257 
258 			ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
259 						("TXAGC(0xE94)=0x%x BBSwing(0xe1c)=0x%x BBSwingIndex=%d RFPath=%d\n",
260 						ODM_GetBBReg(pDM_Odm, 0xE94, (BIT29 | BIT28 | BIT27 | BIT26 | BIT25)),
261 						ODM_GetBBReg(pDM_Odm, 0xe1c, 0xFFE00000),
262 						pRFCalibrateInfo->BbSwingIdxOfdm[RFPath], RFPath));
263 		break;
264 
265 		default:
266 			break;
267 		}
268 	}
269 }
270 
271 
272 VOID
GetDeltaSwingTable_8822B(PVOID pDM_VOID,pu1Byte * TemperatureUP_A,pu1Byte * TemperatureDOWN_A,pu1Byte * TemperatureUP_B,pu1Byte * TemperatureDOWN_B,pu1Byte * TemperatureUP_CCK_A,pu1Byte * TemperatureDOWN_CCK_A,pu1Byte * TemperatureUP_CCK_B,pu1Byte * TemperatureDOWN_CCK_B)273 GetDeltaSwingTable_8822B(
274 	PVOID		pDM_VOID,
275 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
276 	pu1Byte		*TemperatureUP_A,
277 	pu1Byte		*TemperatureDOWN_A,
278 	pu1Byte		*TemperatureUP_B,
279 	pu1Byte		*TemperatureDOWN_B,
280 	pu1Byte		*TemperatureUP_CCK_A,
281 	pu1Byte		*TemperatureDOWN_CCK_A,
282 	pu1Byte		*TemperatureUP_CCK_B,
283 	pu1Byte		*TemperatureDOWN_CCK_B
284 #else
285 	pu1Byte		*TemperatureUP_A,
286 	pu1Byte		*TemperatureDOWN_A,
287 	pu1Byte		*TemperatureUP_B,
288 	pu1Byte		*TemperatureDOWN_B
289 #endif
290 	)
291 {
292 	PDM_ODM_T		pDM_Odm		= (PDM_ODM_T)pDM_VOID;
293 	PODM_RF_CAL_T	pRFCalibrateInfo	= &(pDM_Odm->RFCalibrateInfo);
294 
295 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
296 	u1Byte			channel			= *(pDM_Odm->pChannel);
297 #else
298 	PADAPTER		Adapter			= pDM_Odm->Adapter;
299 	HAL_DATA_TYPE	*pHalData		= GET_HAL_DATA(Adapter);
300 	u1Byte			channel			= pHalData->CurrentChannel;
301 #endif
302 
303 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
304 	*TemperatureUP_CCK_A   = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P;
305 	*TemperatureDOWN_CCK_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N;
306 	*TemperatureUP_CCK_B   = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P;
307 	*TemperatureDOWN_CCK_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N;
308 #endif
309 
310 	*TemperatureUP_A   = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P;
311 	*TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N;
312 	*TemperatureUP_B   = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P;
313 	*TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N;
314 
315 	if (36 <= channel && channel <= 64) {
316 		*TemperatureUP_A   = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[0];
317 		*TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[0];
318 		*TemperatureUP_B   = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[0];
319 		*TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[0];
320 	} else if (100 <= channel && channel <= 144)	{
321 		*TemperatureUP_A   = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[1];
322 		*TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[1];
323 		*TemperatureUP_B   = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[1];
324 		*TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[1];
325 	} else if (149 <= channel && channel <= 177)	{
326 		*TemperatureUP_A   = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[2];
327 		*TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[2];
328 		*TemperatureUP_B   = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[2];
329 		*TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[2];
330 	}
331 }
332 
333 
334 VOID
phy_LCCalibrate_8822B(PDM_ODM_T pDM_Odm)335 phy_LCCalibrate_8822B(
336 	PDM_ODM_T	pDM_Odm
337 	)
338 {
339 	u4Byte LC_Cal = 0, cnt = 0;
340 
341 	/*backup RF0x18*/
342 	LC_Cal = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask);
343 
344 	/*Start LCK*/
345 	ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, LC_Cal | 0x08000);
346 
347 	ODM_delay_ms(100);
348 
349 	for (cnt = 0; cnt < 100; cnt++) {
350 		if (ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x8000) != 0x1)
351 			break;
352 		ODM_delay_ms(10);
353 	}
354 
355 	/*Recover channel number*/
356 	ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, LC_Cal);
357 }
358 
359 
360 
361 VOID
PHY_LCCalibrate_8822B(PVOID pDM_VOID)362 PHY_LCCalibrate_8822B(
363 	PVOID	pDM_VOID
364 	)
365 {
366 	PDM_ODM_T	pDM_Odm = (PDM_ODM_T)pDM_VOID;
367 	BOOLEAN	bStartContTx = FALSE, bSingleTone = FALSE, bCarrierSuppression = FALSE;
368 	u8Byte		StartTime;
369 	u8Byte		ProgressingTime;
370 
371 
372 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
373 	PADAPTER		pAdapter = pDM_Odm->Adapter;
374 
375 #if (MP_DRIVER == 1)
376 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
377 	PMPT_CONTEXT	pMptCtx = &(pAdapter->MptCtx);
378 #else
379 	PMPT_CONTEXT	pMptCtx = &(pAdapter->mppriv.MptCtx);
380 #endif
381 	bStartContTx = pMptCtx->bStartContTx;
382 	bSingleTone = pMptCtx->bSingleTone;
383 	bCarrierSuppression = pMptCtx->bCarrierSuppression;
384 #endif
385 #endif
386 
387 	if (bStartContTx || bSingleTone || bCarrierSuppression) {
388 		ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[LCK]continues TX ing !!! LCK return\n"));
389 		return;
390 	}
391 
392 	StartTime = ODM_GetCurrentTime(pDM_Odm);
393 	phy_LCCalibrate_8822B(pDM_Odm);
394 	ProgressingTime = ODM_GetProgressingTime(pDM_Odm, StartTime);
395 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("[LCK]LCK ProgressingTime = %lld\n", ProgressingTime));
396 }
397 
398 
399 
ConfigureTxpowerTrack_8822B(PTXPWRTRACK_CFG pConfig)400 void ConfigureTxpowerTrack_8822B(
401 	PTXPWRTRACK_CFG	pConfig
402 	)
403 {
404 	pConfig->SwingTableSize_CCK = TXSCALE_TABLE_SIZE;
405 	pConfig->SwingTableSize_OFDM = TXSCALE_TABLE_SIZE;
406 	pConfig->Threshold_IQK = IQK_THRESHOLD;
407 	pConfig->Threshold_DPK = DPK_THRESHOLD;
408 	pConfig->AverageThermalNum = AVG_THERMAL_NUM_8822B;
409 	pConfig->RfPathCount = MAX_PATH_NUM_8822B;
410 	pConfig->ThermalRegAddr = RF_T_METER_8822B;
411 
412 	pConfig->ODM_TxPwrTrackSetPwr = ODM_TxPwrTrackSetPwr8822B;
413 	pConfig->DoIQK = DoIQK_8822B;
414 	pConfig->PHY_LCCalibrate = PHY_LCCalibrate_8822B;
415 
416 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
417 	pConfig->GetDeltaAllSwingTable = GetDeltaSwingTable_8822B;
418 #else
419 	pConfig->GetDeltaSwingTable = GetDeltaSwingTable_8822B;
420 #endif
421 }
422 
423 
PHY_SetRFPathSwitch_8822B(IN PDM_ODM_T pDM_Odm,IN BOOLEAN bMain)424 VOID PHY_SetRFPathSwitch_8822B(
425 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
426 	IN PDM_ODM_T		pDM_Odm,
427 #else
428 	IN	PADAPTER	pAdapter,
429 #endif
430 	IN	BOOLEAN		bMain
431 	)
432 {
433 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
434 	HAL_DATA_TYPE	*pHalData = GET_HAL_DATA(pAdapter);
435 	#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
436 		PDM_ODM_T		pDM_Odm = &pHalData->odmpriv;
437 	#endif
438 	#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
439 		PDM_ODM_T		pDM_Odm = &pHalData->DM_OutSrc;
440 	#endif
441 #endif
442 
443 #if 0
444 	ODM_SetBBReg(pDM_Odm, 0xCB4, bMaskDWord, 0x00004577);
445 	ODM_SetBBReg(pDM_Odm, 0x1900, bMaskDWord, 0x00001000);
446 	ODM_SetBBReg(pDM_Odm, 0x4C, bMaskDWord, 0x01628202);
447 
448 	if (bMain)
449 		ODM_SetBBReg(pDM_Odm, 0xCBC, bMaskDWord, 0x00000200);	/*WiFi */
450 	else
451 		ODM_SetBBReg(pDM_Odm, 0xCBC, bMaskDWord, 0x00000100);	/* BT*/
452 #else
453 	/*BY SY Request */
454 	ODM_SetBBReg(pDM_Odm, 0x4C, (BIT24 | BIT23), 0x2);
455 	ODM_SetBBReg(pDM_Odm, 0x974, 0xff, 0xff);
456 
457 	/*ODM_SetBBReg(pDM_Odm, 0x1991, 0x3, 0x0);*/
458 	ODM_SetBBReg(pDM_Odm, 0x1990, (BIT9 | BIT8), 0x0);
459 
460 	/*ODM_SetBBReg(pDM_Odm, 0xCBE, 0x8, 0x0);*/
461 	ODM_SetBBReg(pDM_Odm, 0xCBC, BIT19, 0x0);
462 
463 	ODM_SetBBReg(pDM_Odm, 0xCB4, 0xff, 0x77);
464 
465 	if (bMain) {
466 		/*ODM_SetBBReg(pDM_Odm, 0xCBD, 0x3, 0x2);		WiFi */
467 		ODM_SetBBReg(pDM_Odm, 0xCBC, (BIT9 | BIT8), 0x2);		/*WiFi */
468 	} else {
469 		/*ODM_SetBBReg(pDM_Odm, 0xCBD, 0x3, 0x1);	 BT*/
470 		ODM_SetBBReg(pDM_Odm, 0xCBC, (BIT9 | BIT8), 0x1);	 /*BT*/
471 	}
472 
473 #endif
474 }
475 
476 BOOLEAN
phy_QueryRFPathSwitch_8822B(PDM_ODM_T pDM_Odm)477 phy_QueryRFPathSwitch_8822B(
478 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
479 	PDM_ODM_T	pDM_Odm
480 #else
481 	PADAPTER	pAdapter
482 #endif
483 	)
484 {
485 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
486 	HAL_DATA_TYPE	*pHalData = GET_HAL_DATA(pAdapter);
487 	#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
488 		PDM_ODM_T		pDM_Odm = &pHalData->odmpriv;
489 	#endif
490 	#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
491 		PDM_ODM_T		pDM_Odm = &pHalData->DM_OutSrc;
492 	#endif
493 #endif
494 
495 	if (ODM_GetBBReg(pDM_Odm, 0xCBC, (BIT9 | BIT8)) == 0x2)	/*WiFi */
496 		return TRUE;
497 	else
498 		return FALSE;
499 }
500 
501 
PHY_QueryRFPathSwitch_8822B(PDM_ODM_T pDM_Odm)502 BOOLEAN PHY_QueryRFPathSwitch_8822B(
503 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
504 	PDM_ODM_T		pDM_Odm
505 #else
506 	PADAPTER	pAdapter
507 #endif
508 	)
509 {
510 
511 #if DISABLE_BB_RF
512 	return TRUE;
513 #endif
514 
515 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
516 	return phy_QueryRFPathSwitch_8822B(pDM_Odm);
517 #else
518 	return phy_QueryRFPathSwitch_8822B(pAdapter);
519 #endif
520 }
521 
522 
523 #endif	/* (RTL8822B_SUPPORT == 0)*/
524