1 // SPDX-License-Identifier: GPL-2.0
2 /*****************************************************************************
3  *
4  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
5  *
6  ******************************************************************************/
7 
8 #include <drv_types.h>
9 #include <rtw_debug.h>
10 #include "odm_precomp.h"
11 
12 
13 
14 /*---------------------------Define Local Constant---------------------------*/
15 /*  2010/04/25 MH Define the max tx power tracking tx agc power. */
16 #define		ODM_TXPWRTRACK_MAX_IDX8723B	6
17 
18 /*  MACRO definition for pRFCalibrateInfo->TxIQC_8723B[0] */
19 #define		PATH_S0							1 /*  RF_PATH_B */
20 #define		IDX_0xC94						0
21 #define		IDX_0xC80						1
22 #define		IDX_0xC4C						2
23 #define		IDX_0xC14						0
24 #define		IDX_0xCA0						1
25 #define		KEY							0
26 #define		VAL							1
27 
28 /*  MACRO definition for pRFCalibrateInfo->TxIQC_8723B[1] */
29 #define		PATH_S1							0 /*  RF_PATH_A */
30 #define		IDX_0xC9C						0
31 #define		IDX_0xC88						1
32 #define		IDX_0xC4C						2
33 #define		IDX_0xC1C						0
34 #define		IDX_0xC78						1
35 
36 
37 /*---------------------------Define Local Constant---------------------------*/
38 
39 /* In the case that we fail to read TxPowerTrack.txt, we use the table for
40  * 88E as the default table.
41  */
42 static u8 DeltaSwingTableIdx_2GA_N_8188E[] = {
43 	0, 0, 0, 2, 2, 3, 3, 4,  4,  4,  4,  5,  5,  6,  6,
44 	7, 7, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 11
45 };
46 static u8 DeltaSwingTableIdx_2GA_P_8188E[] = {
47 	0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 4,
48 	4, 4, 4, 5, 5, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9
49 };
50 
51 /* 3 ============================================================ */
52 /* 3 Tx Power Tracking */
53 /* 3 ============================================================ */
54 
55 
56 static void setIqkMatrix_8723B(
57 	PDM_ODM_T pDM_Odm,
58 	u8 OFDM_index,
59 	u8 RFPath,
60 	s32 IqkResult_X,
61 	s32 IqkResult_Y
62 )
63 {
64 	s32 ele_A = 0, ele_D, ele_C = 0, value32;
65 
66 	if (OFDM_index >= OFDM_TABLE_SIZE)
67 		OFDM_index = OFDM_TABLE_SIZE-1;
68 
69 	ele_D = (OFDMSwingTable_New[OFDM_index] & 0xFFC00000)>>22;
70 
71 	/* new element A = element D x X */
72 	if ((IqkResult_X != 0) && (*(pDM_Odm->pBandType) == ODM_BAND_2_4G)) {
73 		if ((IqkResult_X & 0x00000200) != 0)	/* consider minus */
74 			IqkResult_X = IqkResult_X | 0xFFFFFC00;
75 		ele_A = ((IqkResult_X * ele_D)>>8)&0x000003FF;
76 
77 		/* new element C = element D x Y */
78 		if ((IqkResult_Y & 0x00000200) != 0)
79 			IqkResult_Y = IqkResult_Y | 0xFFFFFC00;
80 		ele_C = ((IqkResult_Y * ele_D)>>8)&0x000003FF;
81 
82 		/* if (RFPath == ODM_RF_PATH_A) */
83 		switch (RFPath) {
84 		case ODM_RF_PATH_A:
85 			/* write new elements A, C, D to regC80 and regC94,
86 			 * element B is always 0
87 			 */
88 			value32 = (ele_D<<22)|((ele_C&0x3F)<<16)|ele_A;
89 			PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, value32);
90 
91 			value32 = (ele_C&0x000003C0)>>6;
92 			PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, value32);
93 
94 			value32 = ((IqkResult_X * ele_D)>>7)&0x01;
95 			PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_ECCAThreshold, BIT24, value32);
96 			break;
97 		case ODM_RF_PATH_B:
98 			/* write new elements A, C, D to regC88 and regC9C,
99 			 * element B is always 0
100 			 */
101 			value32 = (ele_D<<22)|((ele_C&0x3F)<<16)|ele_A;
102 			PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, value32);
103 
104 			value32 = (ele_C&0x000003C0)>>6;
105 			PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, value32);
106 
107 			value32 = ((IqkResult_X * ele_D)>>7)&0x01;
108 			PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_ECCAThreshold, BIT28, value32);
109 
110 			break;
111 		default:
112 			break;
113 		}
114 	} else {
115 		switch (RFPath) {
116 		case ODM_RF_PATH_A:
117 			PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, OFDMSwingTable_New[OFDM_index]);
118 			PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, 0x00);
119 			PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_ECCAThreshold, BIT24, 0x00);
120 			break;
121 
122 		case ODM_RF_PATH_B:
123 			PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, OFDMSwingTable_New[OFDM_index]);
124 			PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, 0x00);
125 			PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_ECCAThreshold, BIT28, 0x00);
126 			break;
127 
128 		default:
129 			break;
130 		}
131 	}
132 
133 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("TxPwrTracking path B: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x 0xeb4 = 0x%x 0xebc = 0x%x\n",
134 	(u32)IqkResult_X, (u32)IqkResult_Y, (u32)ele_A, (u32)ele_C, (u32)ele_D, (u32)IqkResult_X, (u32)IqkResult_Y));
135 }
136 
137 
138 static void setCCKFilterCoefficient(PDM_ODM_T pDM_Odm, u8 CCKSwingIndex)
139 {
140 	if (!pDM_Odm->RFCalibrateInfo.bCCKinCH14) {
141 		rtw_write8(pDM_Odm->Adapter, 0xa22, CCKSwingTable_Ch1_Ch13_New[CCKSwingIndex][0]);
142 		rtw_write8(pDM_Odm->Adapter, 0xa23, CCKSwingTable_Ch1_Ch13_New[CCKSwingIndex][1]);
143 		rtw_write8(pDM_Odm->Adapter, 0xa24, CCKSwingTable_Ch1_Ch13_New[CCKSwingIndex][2]);
144 		rtw_write8(pDM_Odm->Adapter, 0xa25, CCKSwingTable_Ch1_Ch13_New[CCKSwingIndex][3]);
145 		rtw_write8(pDM_Odm->Adapter, 0xa26, CCKSwingTable_Ch1_Ch13_New[CCKSwingIndex][4]);
146 		rtw_write8(pDM_Odm->Adapter, 0xa27, CCKSwingTable_Ch1_Ch13_New[CCKSwingIndex][5]);
147 		rtw_write8(pDM_Odm->Adapter, 0xa28, CCKSwingTable_Ch1_Ch13_New[CCKSwingIndex][6]);
148 		rtw_write8(pDM_Odm->Adapter, 0xa29, CCKSwingTable_Ch1_Ch13_New[CCKSwingIndex][7]);
149 	} else {
150 		rtw_write8(pDM_Odm->Adapter, 0xa22, CCKSwingTable_Ch14_New[CCKSwingIndex][0]);
151 		rtw_write8(pDM_Odm->Adapter, 0xa23, CCKSwingTable_Ch14_New[CCKSwingIndex][1]);
152 		rtw_write8(pDM_Odm->Adapter, 0xa24, CCKSwingTable_Ch14_New[CCKSwingIndex][2]);
153 		rtw_write8(pDM_Odm->Adapter, 0xa25, CCKSwingTable_Ch14_New[CCKSwingIndex][3]);
154 		rtw_write8(pDM_Odm->Adapter, 0xa26, CCKSwingTable_Ch14_New[CCKSwingIndex][4]);
155 		rtw_write8(pDM_Odm->Adapter, 0xa27, CCKSwingTable_Ch14_New[CCKSwingIndex][5]);
156 		rtw_write8(pDM_Odm->Adapter, 0xa28, CCKSwingTable_Ch14_New[CCKSwingIndex][6]);
157 		rtw_write8(pDM_Odm->Adapter, 0xa29, CCKSwingTable_Ch14_New[CCKSwingIndex][7]);
158 	}
159 }
160 
161 void DoIQK_8723B(
162 	PDM_ODM_T pDM_Odm,
163 	u8 DeltaThermalIndex,
164 	u8 ThermalValue,
165 	u8 Threshold
166 )
167 {
168 }
169 
170 /*-----------------------------------------------------------------------------
171  * Function:	odm_TxPwrTrackSetPwr88E()
172  *
173  * Overview:	88E change all channel tx power according to flag.
174  *			OFDM & CCK are all different.
175  *
176  * Input:		NONE
177  *
178  * Output:		NONE
179  *
180  * Return:		NONE
181  *
182  * Revised History:
183  *When		Who	Remark
184  *04/23/2012	MHC	Create Version 0.
185  *
186  *---------------------------------------------------------------------------*/
187 void ODM_TxPwrTrackSetPwr_8723B(
188 	PDM_ODM_T pDM_Odm,
189 	enum PWRTRACK_METHOD Method,
190 	u8 RFPath,
191 	u8 ChannelMappedIndex
192 )
193 {
194 	struct adapter *Adapter = pDM_Odm->Adapter;
195 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
196 	u8 PwrTrackingLimit_OFDM = 34; /* 0dB */
197 	u8 PwrTrackingLimit_CCK = 28; /* 2dB */
198 	u8 TxRate = 0xFF;
199 	u8 Final_OFDM_Swing_Index = 0;
200 	u8 Final_CCK_Swing_Index = 0;
201 
202 	{
203 		u16 rate = *(pDM_Odm->pForcedDataRate);
204 
205 		if (!rate) { /* auto rate */
206 			if (pDM_Odm->TxRate != 0xFF)
207 				TxRate = HwRateToMRate(pDM_Odm->TxRate);
208 		} else /* force rate */
209 			TxRate = (u8)rate;
210 
211 	}
212 
213 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("===>ODM_TxPwrTrackSetPwr8723B\n"));
214 
215 	if (TxRate != 0xFF) {
216 		/* 2 CCK */
217 		if ((TxRate >= MGN_1M) && (TxRate <= MGN_11M))
218 			PwrTrackingLimit_CCK = 28;	/* 2dB */
219 		/* 2 OFDM */
220 		else if ((TxRate >= MGN_6M) && (TxRate <= MGN_48M))
221 			PwrTrackingLimit_OFDM = 36; /* 3dB */
222 		else if (TxRate == MGN_54M)
223 			PwrTrackingLimit_OFDM = 34; /* 2dB */
224 
225 		/* 2 HT */
226 		else if ((TxRate >= MGN_MCS0) && (TxRate <= MGN_MCS2)) /* QPSK/BPSK */
227 			PwrTrackingLimit_OFDM = 38; /* 4dB */
228 		else if ((TxRate >= MGN_MCS3) && (TxRate <= MGN_MCS4)) /* 16QAM */
229 			PwrTrackingLimit_OFDM = 36; /* 3dB */
230 		else if ((TxRate >= MGN_MCS5) && (TxRate <= MGN_MCS7)) /* 64QAM */
231 			PwrTrackingLimit_OFDM = 34; /* 2dB */
232 
233 		else
234 			PwrTrackingLimit_OFDM =  pDM_Odm->DefaultOfdmIndex;   /* Default OFDM index = 30 */
235 	}
236 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("TxRate = 0x%x, PwrTrackingLimit =%d\n", TxRate, PwrTrackingLimit_OFDM));
237 
238 	if (Method == TXAGC) {
239 		struct adapter *Adapter = pDM_Odm->Adapter;
240 
241 		ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("odm_TxPwrTrackSetPwr8723B CH =%d\n", *(pDM_Odm->pChannel)));
242 
243 		pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = pDM_Odm->Absolute_OFDMSwingIdx[RFPath];
244 
245 		pDM_Odm->Modify_TxAGC_Flag_PathA = true;
246 		pDM_Odm->Modify_TxAGC_Flag_PathA_CCK = true;
247 
248 		PHY_SetTxPowerIndexByRateSection(Adapter, RFPath, pHalData->CurrentChannel, CCK);
249 		PHY_SetTxPowerIndexByRateSection(Adapter, RFPath, pHalData->CurrentChannel, OFDM);
250 		PHY_SetTxPowerIndexByRateSection(Adapter, RFPath, pHalData->CurrentChannel, HT_MCS0_MCS7);
251 	} else if (Method == BBSWING) {
252 		Final_OFDM_Swing_Index = pDM_Odm->DefaultOfdmIndex + pDM_Odm->Absolute_OFDMSwingIdx[RFPath];
253 		Final_CCK_Swing_Index = pDM_Odm->DefaultCckIndex + pDM_Odm->Absolute_OFDMSwingIdx[RFPath];
254 
255 		/*  Adjust BB swing by OFDM IQ matrix */
256 		if (Final_OFDM_Swing_Index >= PwrTrackingLimit_OFDM)
257 			Final_OFDM_Swing_Index = PwrTrackingLimit_OFDM;
258 		else if (Final_OFDM_Swing_Index <= 0)
259 			Final_OFDM_Swing_Index = 0;
260 
261 		if (Final_CCK_Swing_Index >= CCK_TABLE_SIZE)
262 			Final_CCK_Swing_Index = CCK_TABLE_SIZE-1;
263 		else if (pDM_Odm->BbSwingIdxCck <= 0)
264 			Final_CCK_Swing_Index = 0;
265 
266 		setIqkMatrix_8723B(pDM_Odm, Final_OFDM_Swing_Index, RFPath,
267 			pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[ChannelMappedIndex].Value[0][0],
268 			pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[ChannelMappedIndex].Value[0][1]);
269 
270 		setCCKFilterCoefficient(pDM_Odm, Final_CCK_Swing_Index);
271 
272 	} else if (Method == MIX_MODE) {
273 		ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
274 			("pDM_Odm->DefaultOfdmIndex =%d,  pDM_Odm->DefaultCCKIndex =%d, pDM_Odm->Absolute_OFDMSwingIdx[RFPath]=%d, RF_Path = %d\n",
275 			pDM_Odm->DefaultOfdmIndex, pDM_Odm->DefaultCckIndex, pDM_Odm->Absolute_OFDMSwingIdx[RFPath], RFPath));
276 
277 		Final_OFDM_Swing_Index = pDM_Odm->DefaultOfdmIndex + pDM_Odm->Absolute_OFDMSwingIdx[RFPath];
278 		Final_CCK_Swing_Index = pDM_Odm->DefaultCckIndex + pDM_Odm->Absolute_OFDMSwingIdx[RFPath];
279 
280 		if (Final_OFDM_Swing_Index > PwrTrackingLimit_OFDM) { /* BBSwing higher then Limit */
281 			pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = Final_OFDM_Swing_Index - PwrTrackingLimit_OFDM;
282 
283 			setIqkMatrix_8723B(pDM_Odm, PwrTrackingLimit_OFDM, RFPath,
284 				pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[ChannelMappedIndex].Value[0][0],
285 				pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[ChannelMappedIndex].Value[0][1]);
286 
287 			pDM_Odm->Modify_TxAGC_Flag_PathA = true;
288 			PHY_SetTxPowerIndexByRateSection(Adapter, RFPath, pHalData->CurrentChannel, OFDM);
289 			PHY_SetTxPowerIndexByRateSection(Adapter, RFPath, pHalData->CurrentChannel, HT_MCS0_MCS7);
290 
291 			ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
292 				("******Path_A Over BBSwing Limit , PwrTrackingLimit = %d , Remnant TxAGC Value = %d\n",
293 				PwrTrackingLimit_OFDM, pDM_Odm->Remnant_OFDMSwingIdx[RFPath]));
294 		} else if (Final_OFDM_Swing_Index <= 0) {
295 			pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = Final_OFDM_Swing_Index;
296 
297 			setIqkMatrix_8723B(pDM_Odm, 0, RFPath,
298 				pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[ChannelMappedIndex].Value[0][0],
299 				pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[ChannelMappedIndex].Value[0][1]);
300 
301 			pDM_Odm->Modify_TxAGC_Flag_PathA = true;
302 			PHY_SetTxPowerIndexByRateSection(Adapter, RFPath, pHalData->CurrentChannel, OFDM);
303 			PHY_SetTxPowerIndexByRateSection(Adapter, RFPath, pHalData->CurrentChannel, HT_MCS0_MCS7);
304 
305 			ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
306 				("******Path_A Lower then BBSwing lower bound  0 , Remnant TxAGC Value = %d\n",
307 				pDM_Odm->Remnant_OFDMSwingIdx[RFPath]));
308 		} else {
309 			setIqkMatrix_8723B(pDM_Odm, Final_OFDM_Swing_Index, RFPath,
310 				pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[ChannelMappedIndex].Value[0][0],
311 				pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[ChannelMappedIndex].Value[0][1]);
312 
313 			ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
314 				("******Path_A Compensate with BBSwing , Final_OFDM_Swing_Index = %d\n", Final_OFDM_Swing_Index));
315 
316 			if (pDM_Odm->Modify_TxAGC_Flag_PathA) { /* If TxAGC has changed, reset TxAGC again */
317 				pDM_Odm->Remnant_OFDMSwingIdx[RFPath] = 0;
318 				PHY_SetTxPowerIndexByRateSection(Adapter, RFPath, pHalData->CurrentChannel, OFDM);
319 				PHY_SetTxPowerIndexByRateSection(Adapter, RFPath, pHalData->CurrentChannel, HT_MCS0_MCS7);
320 				pDM_Odm->Modify_TxAGC_Flag_PathA = false;
321 
322 				ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
323 					("******Path_A pDM_Odm->Modify_TxAGC_Flag = false\n"));
324 			}
325 		}
326 
327 		if (Final_CCK_Swing_Index > PwrTrackingLimit_CCK) {
328 			pDM_Odm->Remnant_CCKSwingIdx = Final_CCK_Swing_Index - PwrTrackingLimit_CCK;
329 			setCCKFilterCoefficient(pDM_Odm, PwrTrackingLimit_CCK);
330 			pDM_Odm->Modify_TxAGC_Flag_PathA_CCK = true;
331 			PHY_SetTxPowerIndexByRateSection(Adapter, RFPath, pHalData->CurrentChannel, CCK);
332 
333 			ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
334 				("******Path_A CCK Over Limit , PwrTrackingLimit_CCK = %d , pDM_Odm->Remnant_CCKSwingIdx  = %d\n", PwrTrackingLimit_CCK, pDM_Odm->Remnant_CCKSwingIdx));
335 		} else if (Final_CCK_Swing_Index <= 0) { /*  Lowest CCK Index = 0 */
336 			pDM_Odm->Remnant_CCKSwingIdx = Final_CCK_Swing_Index;
337 			setCCKFilterCoefficient(pDM_Odm, 0);
338 			pDM_Odm->Modify_TxAGC_Flag_PathA_CCK = true;
339 			PHY_SetTxPowerIndexByRateSection(Adapter, RFPath, pHalData->CurrentChannel, CCK);
340 
341 			ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
342 				("******Path_A CCK Under Limit , PwrTrackingLimit_CCK = %d , pDM_Odm->Remnant_CCKSwingIdx  = %d\n", 0, pDM_Odm->Remnant_CCKSwingIdx));
343 		} else {
344 			setCCKFilterCoefficient(pDM_Odm, Final_CCK_Swing_Index);
345 
346 			ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
347 				("******Path_A CCK Compensate with BBSwing , Final_CCK_Swing_Index = %d\n", Final_CCK_Swing_Index));
348 
349 			if (pDM_Odm->Modify_TxAGC_Flag_PathA_CCK) { /* If TxAGC has changed, reset TxAGC again */
350 				pDM_Odm->Remnant_CCKSwingIdx = 0;
351 				PHY_SetTxPowerIndexByRateSection(Adapter, RFPath, pHalData->CurrentChannel, CCK);
352 				pDM_Odm->Modify_TxAGC_Flag_PathA_CCK = false;
353 
354 				ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
355 					("******Path_A pDM_Odm->Modify_TxAGC_Flag_CCK = false\n"));
356 			}
357 		}
358 	} else
359 		return; /*  This method is not supported. */
360 }
361 
362 static void GetDeltaSwingTable_8723B(
363 	PDM_ODM_T pDM_Odm,
364 	u8 **TemperatureUP_A,
365 	u8 **TemperatureDOWN_A,
366 	u8 **TemperatureUP_B,
367 	u8 **TemperatureDOWN_B
368 )
369 {
370 	struct adapter *Adapter = pDM_Odm->Adapter;
371 	PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);
372 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
373 	u16 rate = *(pDM_Odm->pForcedDataRate);
374 	u8 channel = pHalData->CurrentChannel;
375 
376 	if (1 <= channel && channel <= 14) {
377 		if (IS_CCK_RATE(rate)) {
378 			*TemperatureUP_A   = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P;
379 			*TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N;
380 			*TemperatureUP_B   = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P;
381 			*TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N;
382 		} else {
383 			*TemperatureUP_A   = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P;
384 			*TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N;
385 			*TemperatureUP_B   = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P;
386 			*TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N;
387 		}
388 	} /*else if (36 <= channel && channel <= 64) {
389 		*TemperatureUP_A   = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[0];
390 		*TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[0];
391 		*TemperatureUP_B   = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[0];
392 		*TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[0];
393 	} else if (100 <= channel && channel <= 140) {
394 		*TemperatureUP_A   = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[1];
395 		*TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[1];
396 		*TemperatureUP_B   = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[1];
397 		*TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[1];
398 	} else if (149 <= channel && channel <= 173) {
399 		*TemperatureUP_A   = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[2];
400 		*TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[2];
401 		*TemperatureUP_B   = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[2];
402 		*TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[2];
403 	}*/else {
404 		*TemperatureUP_A   = (u8 *)DeltaSwingTableIdx_2GA_P_8188E;
405 		*TemperatureDOWN_A = (u8 *)DeltaSwingTableIdx_2GA_N_8188E;
406 		*TemperatureUP_B   = (u8 *)DeltaSwingTableIdx_2GA_P_8188E;
407 		*TemperatureDOWN_B = (u8 *)DeltaSwingTableIdx_2GA_N_8188E;
408 	}
409 }
410 
411 
412 void ConfigureTxpowerTrack_8723B(struct TXPWRTRACK_CFG * pConfig)
413 {
414 	pConfig->SwingTableSize_CCK = CCK_TABLE_SIZE;
415 	pConfig->SwingTableSize_OFDM = OFDM_TABLE_SIZE;
416 	pConfig->Threshold_IQK = IQK_THRESHOLD;
417 	pConfig->AverageThermalNum = AVG_THERMAL_NUM_8723B;
418 	pConfig->RfPathCount = MAX_PATH_NUM_8723B;
419 	pConfig->ThermalRegAddr = RF_T_METER_8723B;
420 
421 	pConfig->ODM_TxPwrTrackSetPwr = ODM_TxPwrTrackSetPwr_8723B;
422 	pConfig->DoIQK = DoIQK_8723B;
423 	pConfig->PHY_LCCalibrate = PHY_LCCalibrate_8723B;
424 	pConfig->GetDeltaSwingTable = GetDeltaSwingTable_8723B;
425 }
426 
427 /* 1 7. IQK */
428 #define MAX_TOLERANCE		5
429 #define IQK_DELAY_TIME		1		/* ms */
430 
431 /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
432 static u8 phy_PathA_IQK_8723B(
433 	struct adapter *padapter, bool configPathB, u8 RF_Path
434 )
435 {
436 	u32 regEAC, regE94, regE9C, tmp, Path_SEL_BB /*, regEA4*/;
437 	u8 result = 0x00;
438 
439 	struct hal_com_data	*pHalData = GET_HAL_DATA(padapter);
440 	PDM_ODM_T		pDM_Odm = &pHalData->odmpriv;
441 
442 	/*  Save RF Path */
443 	Path_SEL_BB = PHY_QueryBBReg(pDM_Odm->Adapter, 0x948, bMaskDWord);
444 
445 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path A IQK!\n"));
446 
447 	/* leave IQK mode */
448 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
449 
450 	/* 	enable path A PA in TXIQK mode */
451 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x1);
452 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x18000);
453 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_TXPA_G1, bRFRegOffsetMask, 0x0003f);
454 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_TXPA_G2, bRFRegOffsetMask, 0xc7f87);
455 	/* 	disable path B PA in TXIQK mode */
456 /* 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, 0xed, bRFRegOffsetMask, 0x00020); */
457 /* 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, 0x43, bRFRegOffsetMask, 0x40ec1); */
458 
459 	/* 1 Tx IQK */
460 	/* IQK setting */
461 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK, bMaskDWord, 0x01007c00);
462 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK, bMaskDWord, 0x01004800);
463 	/* path-A IQK setting */
464 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path-A IQK setting!\n")); */
465 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_Tone_A, bMaskDWord, 0x18008c1c);
466 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK_Tone_A, bMaskDWord, 0x38008c1c);
467 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_Tone_B, bMaskDWord, 0x38008c1c);
468 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK_Tone_B, bMaskDWord, 0x38008c1c);
469 /* 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_PI_A, bMaskDWord, 0x8214010a); */
470 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_PI_A, bMaskDWord, 0x821303ea);
471 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK_PI_A, bMaskDWord, 0x28110000);
472 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_PI_B, bMaskDWord, 0x82110000);
473 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK_PI_B, bMaskDWord, 0x28110000);
474 
475 	/* LO calibration setting */
476 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("LO calibration setting!\n")); */
477 	PHY_SetBBReg(pDM_Odm->Adapter, rIQK_AGC_Rsp, bMaskDWord, 0x00462911);
478 
479 	/* enter IQK mode */
480 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_IQK, bMaskH3Bytes, 0x808000);
481 
482 	/* Ant switch */
483 	if (configPathB || (RF_Path == 0))
484 		/*  wifi switch to S1 */
485 		PHY_SetBBReg(pDM_Odm->Adapter, 0x948, bMaskDWord, 0x00000000);
486 	else
487 		/*  wifi switch to S0 */
488 		PHY_SetBBReg(pDM_Odm->Adapter, 0x948, bMaskDWord, 0x00000280);
489 
490 	/* GNT_BT = 0 */
491 	PHY_SetBBReg(pDM_Odm->Adapter, 0x764, bMaskDWord, 0x00000800);
492 
493 	/* One shot, path A LOK & IQK */
494 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("One shot, path A LOK & IQK!\n")); */
495 	PHY_SetBBReg(pDM_Odm->Adapter, rIQK_AGC_Pts, bMaskDWord, 0xf9000000);
496 	PHY_SetBBReg(pDM_Odm->Adapter, rIQK_AGC_Pts, bMaskDWord, 0xf8000000);
497 
498 	/*  delay x ms */
499 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Delay %d ms for One shot, path A LOK & IQK.\n", IQK_DELAY_TIME_8723B)); */
500 	/* PlatformStallExecution(IQK_DELAY_TIME_8723B*1000); */
501 	mdelay(IQK_DELAY_TIME_8723B);
502 
503 	/* restore Ant Path */
504 	PHY_SetBBReg(pDM_Odm->Adapter, 0x948, bMaskDWord, Path_SEL_BB);
505 	/* GNT_BT = 1 */
506 	PHY_SetBBReg(pDM_Odm->Adapter, 0x764, bMaskDWord, 0x00001800);
507 
508 	/* leave IQK mode */
509 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
510 
511 
512 	/*  Check failed */
513 	regEAC = PHY_QueryBBReg(pDM_Odm->Adapter, rRx_Power_After_IQK_A_2, bMaskDWord);
514 	regE94 = PHY_QueryBBReg(pDM_Odm->Adapter, rTx_Power_Before_IQK_A, bMaskDWord);
515 	regE9C = PHY_QueryBBReg(pDM_Odm->Adapter, rTx_Power_After_IQK_A, bMaskDWord);
516 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xeac = 0x%x\n", regEAC));
517 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xe94 = 0x%x, 0xe9c = 0x%x\n", regE94, regE9C));
518 	/* monitor image power before & after IQK */
519 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xe90(before IQK) = 0x%x, 0xe98(afer IQK) = 0x%x\n",
520 	PHY_QueryBBReg(pDM_Odm->Adapter, 0xe90, bMaskDWord), PHY_QueryBBReg(pDM_Odm->Adapter, 0xe98, bMaskDWord)));
521 
522 
523 	/* Allen 20131125 */
524 	tmp = (regE9C & 0x03FF0000)>>16;
525 	if ((tmp & 0x200) > 0)
526 		tmp = 0x400 - tmp;
527 
528 	if (
529 		!(regEAC & BIT28) &&
530 		(((regE94 & 0x03FF0000)>>16) != 0x142) &&
531 		(((regE9C & 0x03FF0000)>>16) != 0x42) &&
532 		(((regE94 & 0x03FF0000)>>16) < 0x110) &&
533 		(((regE94 & 0x03FF0000)>>16) > 0xf0) &&
534 		(tmp < 0xf)
535 	)
536 		result |= 0x01;
537 	else					/* if Tx not OK, ignore Rx */
538 		return result;
539 
540 	return result;
541 }
542 
543 /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
544 static u8 phy_PathA_RxIQK8723B(
545 	struct adapter *padapter, bool configPathB, u8 RF_Path
546 )
547 {
548 	u32 regEAC, regE94, regE9C, regEA4, u4tmp, tmp, Path_SEL_BB;
549 	u8 result = 0x00;
550 	struct hal_com_data *pHalData = GET_HAL_DATA(padapter);
551 	PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
552 
553 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path A Rx IQK!\n")); */
554 
555 	/*  Save RF Path */
556 	Path_SEL_BB = PHY_QueryBBReg(pDM_Odm->Adapter, 0x948, bMaskDWord);
557 
558 	/* leave IQK mode */
559 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
560 
561 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path A RX IQK:Get TXIMR setting\n"));
562 	/* 1 Get TXIMR setting */
563 	/* modify RXIQK mode table */
564 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path-A Rx IQK modify RXIQK mode table!\n")); */
565 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x1);
566 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x18000);
567 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_TXPA_G1, bRFRegOffsetMask, 0x0001f);
568 	/* LNA2 off, PA on for Dcut */
569 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_TXPA_G2, bRFRegOffsetMask, 0xf7fb7);
570 /* 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x0); */
571 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_IQK, bMaskH3Bytes, 0x808000);
572 
573 	/* IQK setting */
574 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK, bMaskDWord, 0x01007c00);
575 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK, bMaskDWord, 0x01004800);
576 
577 	/* path-A IQK setting */
578 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_Tone_A, bMaskDWord, 0x18008c1c);
579 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK_Tone_A, bMaskDWord, 0x38008c1c);
580 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_Tone_B, bMaskDWord, 0x38008c1c);
581 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK_Tone_B, bMaskDWord, 0x38008c1c);
582 
583 /* 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_PI_A, bMaskDWord, 0x82160c1f); */
584 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_PI_A, bMaskDWord, 0x82130ff0);
585 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK_PI_A, bMaskDWord, 0x28110000);
586 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_PI_B, bMaskDWord, 0x82110000);
587 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK_PI_B, bMaskDWord, 0x28110000);
588 
589 	/* LO calibration setting */
590 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("LO calibration setting!\n")); */
591 	PHY_SetBBReg(pDM_Odm->Adapter, rIQK_AGC_Rsp, bMaskDWord, 0x0046a911);
592 
593 	/* enter IQK mode */
594 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_IQK, bMaskH3Bytes, 0x808000);
595 
596 	/* Ant switch */
597 	if (configPathB || (RF_Path == 0))
598 		/*  wifi switch to S1 */
599 		PHY_SetBBReg(pDM_Odm->Adapter, 0x948, bMaskDWord, 0x00000000);
600 	else
601 		/*  wifi switch to S0 */
602 		PHY_SetBBReg(pDM_Odm->Adapter, 0x948, bMaskDWord, 0x00000280);
603 
604 	/* GNT_BT = 0 */
605 	PHY_SetBBReg(pDM_Odm->Adapter, 0x764, bMaskDWord, 0x00000800);
606 
607 	/* One shot, path A LOK & IQK */
608 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("One shot, path A LOK & IQK!\n")); */
609 	PHY_SetBBReg(pDM_Odm->Adapter, rIQK_AGC_Pts, bMaskDWord, 0xf9000000);
610 	PHY_SetBBReg(pDM_Odm->Adapter, rIQK_AGC_Pts, bMaskDWord, 0xf8000000);
611 
612 	/*  delay x ms */
613 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Delay %d ms for One shot, path A LOK & IQK.\n", IQK_DELAY_TIME_8723B)); */
614 	/* PlatformStallExecution(IQK_DELAY_TIME_8723B*1000); */
615 	mdelay(IQK_DELAY_TIME_8723B);
616 
617 	/* restore Ant Path */
618 	PHY_SetBBReg(pDM_Odm->Adapter, 0x948, bMaskDWord, Path_SEL_BB);
619 	/* GNT_BT = 1 */
620 	PHY_SetBBReg(pDM_Odm->Adapter, 0x764, bMaskDWord, 0x00001800);
621 
622 	/* leave IQK mode */
623 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
624 
625 	/*  Check failed */
626 	regEAC = PHY_QueryBBReg(pDM_Odm->Adapter, rRx_Power_After_IQK_A_2, bMaskDWord);
627 	regE94 = PHY_QueryBBReg(pDM_Odm->Adapter, rTx_Power_Before_IQK_A, bMaskDWord);
628 	regE9C = PHY_QueryBBReg(pDM_Odm->Adapter, rTx_Power_After_IQK_A, bMaskDWord);
629 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xeac = 0x%x\n", regEAC));
630 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xe94 = 0x%x, 0xe9c = 0x%x\n", regE94, regE9C));
631 	/* monitor image power before & after IQK */
632 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xe90(before IQK) = 0x%x, 0xe98(afer IQK) = 0x%x\n",
633 	PHY_QueryBBReg(pDM_Odm->Adapter, 0xe90, bMaskDWord), PHY_QueryBBReg(pDM_Odm->Adapter, 0xe98, bMaskDWord)));
634 
635 	/* Allen 20131125 */
636 	tmp = (regE9C & 0x03FF0000)>>16;
637 	if ((tmp & 0x200) > 0)
638 		tmp = 0x400 - tmp;
639 
640 	if (
641 		!(regEAC & BIT28) &&
642 		(((regE94 & 0x03FF0000)>>16) != 0x142) &&
643 		(((regE9C & 0x03FF0000)>>16) != 0x42) &&
644 		(((regE94 & 0x03FF0000)>>16) < 0x110) &&
645 		(((regE94 & 0x03FF0000)>>16) > 0xf0) &&
646 		(tmp < 0xf)
647 	)
648 		result |= 0x01;
649 	else				/* if Tx not OK, ignore Rx */
650 		return result;
651 
652 	u4tmp = 0x80007C00 | (regE94&0x3FF0000) | ((regE9C&0x3FF0000) >> 16);
653 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK, bMaskDWord, u4tmp);
654 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xe40 = 0x%x u4tmp = 0x%x\n", PHY_QueryBBReg(pDM_Odm->Adapter, rTx_IQK, bMaskDWord), u4tmp));
655 
656 
657 	/* 1 RX IQK */
658 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path A RX IQK\n"));
659 
660 	/* modify RXIQK mode table */
661 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path-A Rx IQK modify RXIQK mode table 2!\n")); */
662 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
663 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x1);
664 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x18000);
665 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_TXPA_G1, bRFRegOffsetMask, 0x0001f);
666 	/* LAN2 on, PA off for Dcut */
667 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_TXPA_G2, bRFRegOffsetMask, 0xf7d77);
668 /* 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x0); */
669 
670 	/* PA, PAD setting */
671 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, 0xdf, bRFRegOffsetMask, 0xf80);
672 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, 0x55, bRFRegOffsetMask, 0x4021f);
673 
674 
675 	/* IQK setting */
676 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK, bMaskDWord, 0x01004800);
677 
678 	/* path-A IQK setting */
679 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_Tone_A, bMaskDWord, 0x38008c1c);
680 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK_Tone_A, bMaskDWord, 0x18008c1c);
681 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_Tone_B, bMaskDWord, 0x38008c1c);
682 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK_Tone_B, bMaskDWord, 0x38008c1c);
683 
684 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_PI_A, bMaskDWord, 0x82110000);
685 /* 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK_PI_A, bMaskDWord, 0x281604c2); */
686 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK_PI_A, bMaskDWord, 0x2813001f);
687 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_PI_B, bMaskDWord, 0x82110000);
688 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK_PI_B, bMaskDWord, 0x28110000);
689 
690 	/* LO calibration setting */
691 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("LO calibration setting!\n")); */
692 	PHY_SetBBReg(pDM_Odm->Adapter, rIQK_AGC_Rsp, bMaskDWord, 0x0046a8d1);
693 
694 	/* enter IQK mode */
695 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_IQK, bMaskH3Bytes, 0x808000);
696 
697 	/* Ant switch */
698 	if (configPathB || (RF_Path == 0))
699 		/*  wifi switch to S1 */
700 		PHY_SetBBReg(pDM_Odm->Adapter, 0x948, bMaskDWord, 0x00000000);
701 	else
702 		/*  wifi switch to S0 */
703 		PHY_SetBBReg(pDM_Odm->Adapter, 0x948, bMaskDWord, 0x00000280);
704 
705 	/* GNT_BT = 0 */
706 	PHY_SetBBReg(pDM_Odm->Adapter, 0x764, bMaskDWord, 0x00000800);
707 
708 	/* One shot, path A LOK & IQK */
709 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("One shot, path A LOK & IQK!\n")); */
710 	PHY_SetBBReg(pDM_Odm->Adapter, rIQK_AGC_Pts, bMaskDWord, 0xf9000000);
711 	PHY_SetBBReg(pDM_Odm->Adapter, rIQK_AGC_Pts, bMaskDWord, 0xf8000000);
712 
713 	/*  delay x ms */
714 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Delay %d ms for One shot, path A LOK & IQK.\n", IQK_DELAY_TIME_88E)); */
715 	/* PlatformStallExecution(IQK_DELAY_TIME_8723B*1000); */
716 	mdelay(IQK_DELAY_TIME_8723B);
717 
718 	/* restore Ant Path */
719 	PHY_SetBBReg(pDM_Odm->Adapter, 0x948, bMaskDWord, Path_SEL_BB);
720 	/* GNT_BT = 1 */
721 	PHY_SetBBReg(pDM_Odm->Adapter, 0x764, bMaskDWord, 0x00001800);
722 
723     /* leave IQK mode */
724 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
725 
726 	/*  Check failed */
727 	regEAC = PHY_QueryBBReg(pDM_Odm->Adapter, rRx_Power_After_IQK_A_2, bMaskDWord);
728 	regEA4 = PHY_QueryBBReg(pDM_Odm->Adapter, rRx_Power_Before_IQK_A_2, bMaskDWord);
729 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("0xeac = 0x%x\n", regEAC));
730 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xea4 = 0x%x, 0xeac = 0x%x\n", regEA4, regEAC));
731 	/* monitor image power before & after IQK */
732 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xea0(before IQK) = 0x%x, 0xea8(afer IQK) = 0x%x\n",
733 	PHY_QueryBBReg(pDM_Odm->Adapter, 0xea0, bMaskDWord), PHY_QueryBBReg(pDM_Odm->Adapter, 0xea8, bMaskDWord)));
734 
735 	/* 	PA/PAD controlled by 0x0 */
736 	/* leave IQK mode */
737 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
738 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, 0xdf, bRFRegOffsetMask, 0x780);
739 
740 	/* Allen 20131125 */
741 	tmp = (regEAC & 0x03FF0000)>>16;
742 	if ((tmp & 0x200) > 0)
743 		tmp = 0x400 - tmp;
744 
745 	if (
746 		!(regEAC & BIT27) && /* if Tx is OK, check whether Rx is OK */
747 		(((regEA4 & 0x03FF0000)>>16) != 0x132) &&
748 		(((regEAC & 0x03FF0000)>>16) != 0x36) &&
749 		(((regEA4 & 0x03FF0000)>>16) < 0x110) &&
750 		(((regEA4 & 0x03FF0000)>>16) > 0xf0) &&
751 		(tmp < 0xf)
752 	)
753 		result |= 0x02;
754 	else							/* if Tx not OK, ignore Rx */
755 		ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("Path A Rx IQK fail!!\n"));
756 	return result;
757 }
758 
759 /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
760 static u8 phy_PathB_IQK_8723B(struct adapter *padapter)
761 {
762 	u32 regEAC, regE94, regE9C, tmp, Path_SEL_BB/*, regEC4, regECC, Path_SEL_BB*/;
763 	u8 result = 0x00;
764 	struct hal_com_data	*pHalData = GET_HAL_DATA(padapter);
765 	PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
766 
767 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("Path B IQK!\n"));
768 
769 	/*  Save RF Path */
770 	Path_SEL_BB = PHY_QueryBBReg(pDM_Odm->Adapter, 0x948, bMaskDWord);
771 
772     /* leave IQK mode */
773 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
774 
775 	/* 	in TXIQK mode */
776 /* 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x1); */
777 /* 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x20000); */
778 /* 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_TXPA_G1, bRFRegOffsetMask, 0x0003f); */
779 /* 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_TXPA_G2, bRFRegOffsetMask, 0xc7f87); */
780 	/* 	enable path B PA in TXIQK mode */
781 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, 0xed, 0x20, 0x1);
782 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, 0x43, bRFRegOffsetMask, 0x30fc1);
783 
784 
785 
786 	/* 1 Tx IQK */
787 	/* IQK setting */
788 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK, bMaskDWord, 0x01007c00);
789 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK, bMaskDWord, 0x01004800);
790 	/* path-A IQK setting */
791 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path-B IQK setting!\n")); */
792 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_Tone_A, bMaskDWord, 0x18008c1c);
793 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK_Tone_A, bMaskDWord, 0x38008c1c);
794 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_Tone_B, bMaskDWord, 0x38008c1c);
795 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK_Tone_B, bMaskDWord, 0x38008c1c);
796 
797 /* 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_PI_A, bMaskDWord, 0x82140114); */
798 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_PI_A, bMaskDWord, 0x821303ea);
799 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK_PI_A, bMaskDWord, 0x28110000);
800 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_PI_B, bMaskDWord, 0x82110000);
801 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK_PI_B, bMaskDWord, 0x28110000);
802 
803 	/* LO calibration setting */
804 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("LO calibration setting!\n")); */
805 	PHY_SetBBReg(pDM_Odm->Adapter, rIQK_AGC_Rsp, bMaskDWord, 0x00462911);
806 
807 	/* enter IQK mode */
808 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_IQK, bMaskH3Bytes, 0x808000);
809 
810 	/* switch to path B */
811 	PHY_SetBBReg(pDM_Odm->Adapter, 0x948, bMaskDWord, 0x00000280);
812 /* 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, 0xb0, bRFRegOffsetMask, 0xeffe0); */
813 
814 	/* GNT_BT = 0 */
815 	PHY_SetBBReg(pDM_Odm->Adapter, 0x764, bMaskDWord, 0x00000800);
816 
817 	/* One shot, path B LOK & IQK */
818 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("One shot, path B LOK & IQK!\n")); */
819 	PHY_SetBBReg(pDM_Odm->Adapter, rIQK_AGC_Pts, bMaskDWord, 0xf9000000);
820 	PHY_SetBBReg(pDM_Odm->Adapter, rIQK_AGC_Pts, bMaskDWord, 0xf8000000);
821 
822 	/*  delay x ms */
823 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Delay %d ms for One shot, path B LOK & IQK.\n", IQK_DELAY_TIME_88E)); */
824 	/* PlatformStallExecution(IQK_DELAY_TIME_88E*1000); */
825 	mdelay(IQK_DELAY_TIME_8723B);
826 
827 	/* restore Ant Path */
828 	PHY_SetBBReg(pDM_Odm->Adapter, 0x948, bMaskDWord, Path_SEL_BB);
829 	/* GNT_BT = 1 */
830 	PHY_SetBBReg(pDM_Odm->Adapter, 0x764, bMaskDWord, 0x00001800);
831 
832     /* leave IQK mode */
833 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
834 
835 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0x948 = 0x%x\n", PHY_QueryBBReg(pDM_Odm->Adapter, 0x948, bMaskDWord))); */
836 
837 
838 	/*  Check failed */
839 	regEAC = PHY_QueryBBReg(pDM_Odm->Adapter, rRx_Power_After_IQK_A_2, bMaskDWord);
840 	regE94 = PHY_QueryBBReg(pDM_Odm->Adapter, rTx_Power_Before_IQK_A, bMaskDWord);
841 	regE9C = PHY_QueryBBReg(pDM_Odm->Adapter, rTx_Power_After_IQK_A, bMaskDWord);
842 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("0xeac = 0x%x\n", regEAC));
843 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xe94 = 0x%x, 0xe9c = 0x%x\n", regE94, regE9C));
844 	/* monitor image power before & after IQK */
845 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xe90(before IQK) = 0x%x, 0xe98(afer IQK) = 0x%x\n",
846 	PHY_QueryBBReg(pDM_Odm->Adapter, 0xe90, bMaskDWord), PHY_QueryBBReg(pDM_Odm->Adapter, 0xe98, bMaskDWord)));
847 
848 	/* Allen 20131125 */
849 	tmp = (regE9C & 0x03FF0000)>>16;
850 	if ((tmp & 0x200) > 0)
851 		tmp = 0x400 - tmp;
852 
853 	if (
854 		!(regEAC & BIT28) &&
855 		(((regE94 & 0x03FF0000)>>16) != 0x142) &&
856 		(((regE9C & 0x03FF0000)>>16) != 0x42) &&
857 		(((regE94 & 0x03FF0000)>>16) < 0x110) &&
858 		(((regE94 & 0x03FF0000)>>16) > 0xf0) &&
859 		(tmp < 0xf)
860 	)
861 		result |= 0x01;
862 
863 	return result;
864 }
865 
866 /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
867 static u8 phy_PathB_RxIQK8723B(struct adapter *padapter, bool configPathB)
868 {
869 	u32 regE94, regE9C, regEA4, regEAC, u4tmp, tmp, Path_SEL_BB;
870 	u8 result = 0x00;
871 	struct hal_com_data *pHalData = GET_HAL_DATA(padapter);
872 	PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
873 
874 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path B Rx IQK!\n")); */
875 
876 	/*  Save RF Path */
877 	Path_SEL_BB = PHY_QueryBBReg(pDM_Odm->Adapter, 0x948, bMaskDWord);
878     /* leave IQK mode */
879 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
880 
881 	/* switch to path B */
882 	PHY_SetBBReg(pDM_Odm->Adapter, 0x948, bMaskDWord, 0x00000280);
883 
884 	/* 1 Get TXIMR setting */
885 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path B RX IQK:Get TXIMR setting!\n"));
886 	/* modify RXIQK mode table */
887 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path-A Rx IQK modify RXIQK mode table!\n")); */
888 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x1);
889 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x18000);
890 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_TXPA_G1, bRFRegOffsetMask, 0x0001f);
891 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_TXPA_G2, bRFRegOffsetMask, 0xf7fb7);
892 	/* open PA S1 & SMIXER */
893 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, 0xed, 0x20, 0x1);
894 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, 0x43, bRFRegOffsetMask, 0x30fcd);
895 
896 
897 	/* IQK setting */
898 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK, bMaskDWord, 0x01007c00);
899 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK, bMaskDWord, 0x01004800);
900 
901 
902 	/* path-B IQK setting */
903 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_Tone_A, bMaskDWord, 0x18008c1c);
904 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK_Tone_A, bMaskDWord, 0x38008c1c);
905 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_Tone_B, bMaskDWord, 0x38008c1c);
906 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK_Tone_B, bMaskDWord, 0x38008c1c);
907 
908 /* 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_PI_A, bMaskDWord, 0x82160c1f); */
909 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_PI_A, bMaskDWord, 0x82130ff0);
910 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK_PI_A, bMaskDWord, 0x28110000);
911 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_PI_B, bMaskDWord, 0x82110000);
912 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK_PI_B, bMaskDWord, 0x28110000);
913 
914 	/* LO calibration setting */
915 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("LO calibration setting!\n")); */
916 	PHY_SetBBReg(pDM_Odm->Adapter, rIQK_AGC_Rsp, bMaskDWord, 0x0046a911);
917 
918     /* enter IQK mode */
919 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_IQK, bMaskH3Bytes, 0x808000);
920 
921 	/* switch to path B */
922 	PHY_SetBBReg(pDM_Odm->Adapter, 0x948, bMaskDWord, 0x00000280);
923 /* 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, 0xb0, bRFRegOffsetMask, 0xeffe0); */
924 
925 	/* GNT_BT = 0 */
926 	PHY_SetBBReg(pDM_Odm->Adapter, 0x764, bMaskDWord, 0x00000800);
927 
928 	/* One shot, path B TXIQK @ RXIQK */
929 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("One shot, path B LOK & IQK!\n")); */
930 	PHY_SetBBReg(pDM_Odm->Adapter, rIQK_AGC_Pts, bMaskDWord, 0xf9000000);
931 	PHY_SetBBReg(pDM_Odm->Adapter, rIQK_AGC_Pts, bMaskDWord, 0xf8000000);
932 
933 
934 	/*  delay x ms */
935 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Delay %d ms for One shot, path A LOK & IQK.\n", IQK_DELAY_TIME_88E)); */
936 	/* PlatformStallExecution(IQK_DELAY_TIME_88E*1000); */
937 	mdelay(IQK_DELAY_TIME_8723B);
938 
939 	/* restore Ant Path */
940 	PHY_SetBBReg(pDM_Odm->Adapter, 0x948, bMaskDWord, Path_SEL_BB);
941 	/* GNT_BT = 1 */
942 	PHY_SetBBReg(pDM_Odm->Adapter, 0x764, bMaskDWord, 0x00001800);
943 
944     /* leave IQK mode */
945 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
946 
947 	/*  Check failed */
948 	regEAC = PHY_QueryBBReg(pDM_Odm->Adapter, rRx_Power_After_IQK_A_2, bMaskDWord);
949 	regE94 = PHY_QueryBBReg(pDM_Odm->Adapter, rTx_Power_Before_IQK_A, bMaskDWord);
950 	regE9C = PHY_QueryBBReg(pDM_Odm->Adapter, rTx_Power_After_IQK_A, bMaskDWord);
951 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("0xeac = 0x%x\n", regEAC));
952 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xe94 = 0x%x, 0xe9c = 0x%x\n", regE94, regE9C));
953 	/* monitor image power before & after IQK */
954 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xe90(before IQK) = 0x%x, 0xe98(afer IQK) = 0x%x\n",
955 		PHY_QueryBBReg(pDM_Odm->Adapter, 0xe90, bMaskDWord), PHY_QueryBBReg(pDM_Odm->Adapter, 0xe98, bMaskDWord)));
956 
957 	/* Allen 20131125 */
958 	tmp = (regE9C & 0x03FF0000)>>16;
959 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("tmp1 = 0x%x\n", tmp)); */
960 	if ((tmp & 0x200) > 0)
961 		tmp = 0x400 - tmp;
962 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("tmp2 = 0x%x\n", tmp)); */
963 
964 	if (
965 		!(regEAC & BIT28) &&
966 		(((regE94 & 0x03FF0000)>>16) != 0x142) &&
967 		(((regE9C & 0x03FF0000)>>16) != 0x42)  &&
968 		(((regE94 & 0x03FF0000)>>16) < 0x110) &&
969 		(((regE94 & 0x03FF0000)>>16) > 0xf0) &&
970 		(tmp < 0xf)
971 	)
972 			result |= 0x01;
973 	else	/* if Tx not OK, ignore Rx */
974 		return result;
975 
976 	u4tmp = 0x80007C00 | (regE94&0x3FF0000)  | ((regE9C&0x3FF0000) >> 16);
977 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK, bMaskDWord, u4tmp);
978 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xe40 = 0x%x u4tmp = 0x%x\n", PHY_QueryBBReg(pDM_Odm->Adapter, rTx_IQK, bMaskDWord), u4tmp));
979 
980 	/* 1 RX IQK */
981 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path B RX IQK\n"));
982 
983 	/* modify RXIQK mode table */
984 	/* 20121009, Kordan> RF Mode = 3 */
985 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
986 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x1);
987 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x18000);
988 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_TXPA_G1, bRFRegOffsetMask, 0x0001f);
989 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_TXPA_G2, bRFRegOffsetMask, 0xf7d77);
990 /* 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x0); */
991 
992 	/* open PA S1 & close SMIXER */
993 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, 0xed, 0x20, 0x1);
994 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, 0x43, bRFRegOffsetMask, 0x30ebd);
995 
996 	/* PA, PAD setting */
997 /* 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, 0xdf, bRFRegOffsetMask, 0xf80); */
998 /* 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, 0x56, bRFRegOffsetMask, 0x51000); */
999 
1000 	/* IQK setting */
1001 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK, bMaskDWord, 0x01004800);
1002 
1003 	/* path-B IQK setting */
1004 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_Tone_A, bMaskDWord, 0x38008c1c);
1005 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK_Tone_A, bMaskDWord, 0x18008c1c);
1006 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_Tone_B, bMaskDWord, 0x38008c1c);
1007 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK_Tone_B, bMaskDWord, 0x38008c1c);
1008 
1009 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_PI_A, bMaskDWord, 0x82110000);
1010 /* 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK_PI_A, bMaskDWord, 0x281604c2); */
1011 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK_PI_A, bMaskDWord, 0x2813001f);
1012 	PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_PI_B, bMaskDWord, 0x82110000);
1013 	PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK_PI_B, bMaskDWord, 0x28110000);
1014 
1015 	/* LO calibration setting */
1016 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("LO calibration setting!\n")); */
1017 	PHY_SetBBReg(pDM_Odm->Adapter, rIQK_AGC_Rsp, bMaskDWord, 0x0046a8d1);
1018 
1019     /* enter IQK mode */
1020 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_IQK, bMaskH3Bytes, 0x808000);
1021 
1022 	/* switch to path B */
1023 	PHY_SetBBReg(pDM_Odm->Adapter, 0x948, bMaskDWord, 0x00000280);
1024 /* 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, 0xb0, bRFRegOffsetMask, 0xeffe0); */
1025 
1026 	/* GNT_BT = 0 */
1027 	PHY_SetBBReg(pDM_Odm->Adapter, 0x764, bMaskDWord, 0x00000800);
1028 
1029 	/* One shot, path B LOK & IQK */
1030 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("One shot, path B LOK & IQK!\n")); */
1031 	PHY_SetBBReg(pDM_Odm->Adapter, rIQK_AGC_Pts, bMaskDWord, 0xf9000000);
1032 	PHY_SetBBReg(pDM_Odm->Adapter, rIQK_AGC_Pts, bMaskDWord, 0xf8000000);
1033 
1034 	/*  delay x ms */
1035 /* 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Delay %d ms for One shot, path A LOK & IQK.\n", IQK_DELAY_TIME_88E)); */
1036 	/* PlatformStallExecution(IQK_DELAY_TIME_88E*1000); */
1037 	mdelay(IQK_DELAY_TIME_8723B);
1038 
1039 	/* restore Ant Path */
1040 	PHY_SetBBReg(pDM_Odm->Adapter, 0x948, bMaskDWord, Path_SEL_BB);
1041 	/* GNT_BT = 1 */
1042 	PHY_SetBBReg(pDM_Odm->Adapter, 0x764, bMaskDWord, 0x00001800);
1043 
1044     /* leave IQK mode */
1045 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
1046 
1047 	/*  Check failed */
1048 	regEAC = PHY_QueryBBReg(pDM_Odm->Adapter, rRx_Power_After_IQK_A_2, bMaskDWord);
1049 	regEA4 = PHY_QueryBBReg(pDM_Odm->Adapter, rRx_Power_Before_IQK_A_2, bMaskDWord);
1050 
1051 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("0xeac = 0x%x\n", regEAC));
1052 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xea4 = 0x%x, 0xeac = 0x%x\n", regEA4, regEAC));
1053 	/* monitor image power before & after IQK */
1054 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xea0(before IQK) = 0x%x, 0xea8(afer IQK) = 0x%x\n",
1055 		PHY_QueryBBReg(pDM_Odm->Adapter, 0xea0, bMaskDWord), PHY_QueryBBReg(pDM_Odm->Adapter, 0xea8, bMaskDWord)));
1056 
1057 	/* 	PA/PAD controlled by 0x0 */
1058 	/* leave IQK mode */
1059 /* 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_IQK, 0xffffff00, 0x00000000); */
1060 /* 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_B, 0xdf, bRFRegOffsetMask, 0x180); */
1061 
1062 
1063 
1064 	/* Allen 20131125 */
1065 	tmp = (regEAC & 0x03FF0000)>>16;
1066 	if ((tmp & 0x200) > 0)
1067 		tmp = 0x400 - tmp;
1068 
1069 	if (
1070 		!(regEAC & BIT27) && /* if Tx is OK, check whether Rx is OK */
1071 		(((regEA4 & 0x03FF0000)>>16) != 0x132) &&
1072 		(((regEAC & 0x03FF0000)>>16) != 0x36) &&
1073 		(((regEA4 & 0x03FF0000)>>16) < 0x110) &&
1074 		(((regEA4 & 0x03FF0000)>>16) > 0xf0) &&
1075 		(tmp < 0xf)
1076 	)
1077 		result |= 0x02;
1078 	else
1079 		ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("Path B Rx IQK fail!!\n"));
1080 
1081 	return result;
1082 }
1083 
1084 static void _PHY_PathAFillIQKMatrix8723B(
1085 	struct adapter *padapter,
1086 	bool bIQKOK,
1087 	s32 result[][8],
1088 	u8 final_candidate,
1089 	bool bTxOnly
1090 )
1091 {
1092 	u32 Oldval_0, X, TX0_A, reg;
1093 	s32 Y, TX0_C;
1094 	struct hal_com_data	*pHalData = GET_HAL_DATA(padapter);
1095 	PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
1096 
1097 	PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);
1098 
1099 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("Path A IQ Calibration %s !\n", (bIQKOK)?"Success":"Failed"));
1100 
1101 	if (final_candidate == 0xFF)
1102 		return;
1103 
1104 	else if (bIQKOK) {
1105 		Oldval_0 = (PHY_QueryBBReg(pDM_Odm->Adapter, rOFDM0_XATxIQImbalance, bMaskDWord) >> 22) & 0x3FF;
1106 
1107 		X = result[final_candidate][0];
1108 		if ((X & 0x00000200) != 0)
1109 			X = X | 0xFFFFFC00;
1110 		TX0_A = (X * Oldval_0) >> 8;
1111 		ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("X = 0x%x, TX0_A = 0x%x, Oldval_0 0x%x\n", X, TX0_A, Oldval_0));
1112 		PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_XATxIQImbalance, 0x3FF, TX0_A);
1113 
1114 		PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_ECCAThreshold, BIT(31), ((X*Oldval_0>>7) & 0x1));
1115 
1116 		Y = result[final_candidate][1];
1117 		if ((Y & 0x00000200) != 0)
1118 			Y = Y | 0xFFFFFC00;
1119 
1120 		/* 2 Tx IQC */
1121 		TX0_C = (Y * Oldval_0) >> 8;
1122 		ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("Y = 0x%x, TX = 0x%x\n", Y, TX0_C));
1123 		PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_XCTxAFE, 0xF0000000, ((TX0_C&0x3C0)>>6));
1124 		pRFCalibrateInfo->TxIQC_8723B[PATH_S1][IDX_0xC94][KEY] = rOFDM0_XCTxAFE;
1125 		pRFCalibrateInfo->TxIQC_8723B[PATH_S1][IDX_0xC94][VAL] = PHY_QueryBBReg(pDM_Odm->Adapter, rOFDM0_XCTxAFE, bMaskDWord);
1126 
1127 		PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_XATxIQImbalance, 0x003F0000, (TX0_C&0x3F));
1128 		pRFCalibrateInfo->TxIQC_8723B[PATH_S1][IDX_0xC80][KEY] = rOFDM0_XATxIQImbalance;
1129 		pRFCalibrateInfo->TxIQC_8723B[PATH_S1][IDX_0xC80][VAL] = PHY_QueryBBReg(pDM_Odm->Adapter, rOFDM0_XATxIQImbalance, bMaskDWord);
1130 
1131 		PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_ECCAThreshold, BIT(29), ((Y*Oldval_0>>7) & 0x1));
1132 		pRFCalibrateInfo->TxIQC_8723B[PATH_S1][IDX_0xC4C][KEY] = rOFDM0_ECCAThreshold;
1133 		pRFCalibrateInfo->TxIQC_8723B[PATH_S1][IDX_0xC4C][VAL] = PHY_QueryBBReg(pDM_Odm->Adapter, rOFDM0_ECCAThreshold, bMaskDWord);
1134 
1135 		if (bTxOnly) {
1136 			ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("_PHY_PathAFillIQKMatrix8723B only Tx OK\n"));
1137 
1138 			/*  <20130226, Kordan> Saving RxIQC, otherwise not initialized. */
1139 			pRFCalibrateInfo->RxIQC_8723B[PATH_S1][IDX_0xCA0][KEY] = rOFDM0_RxIQExtAnta;
1140 			pRFCalibrateInfo->RxIQC_8723B[PATH_S1][IDX_0xCA0][VAL] = 0xfffffff & PHY_QueryBBReg(pDM_Odm->Adapter, rOFDM0_RxIQExtAnta, bMaskDWord);
1141 			pRFCalibrateInfo->RxIQC_8723B[PATH_S1][IDX_0xC14][KEY] = rOFDM0_XARxIQImbalance;
1142 /* 			pRFCalibrateInfo->RxIQC_8723B[PATH_S1][IDX_0xC14][VAL] = PHY_QueryBBReg(pDM_Odm->Adapter, rOFDM0_XARxIQImbalance, bMaskDWord); */
1143 			pRFCalibrateInfo->RxIQC_8723B[PATH_S1][IDX_0xC14][VAL] = 0x40000100;
1144 			return;
1145 		}
1146 
1147 		reg = result[final_candidate][2];
1148 
1149 		/* 2 Rx IQC */
1150 		PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_XARxIQImbalance, 0x3FF, reg);
1151 		reg = result[final_candidate][3] & 0x3F;
1152 		PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_XARxIQImbalance, 0xFC00, reg);
1153 		pRFCalibrateInfo->RxIQC_8723B[PATH_S1][IDX_0xC14][KEY] = rOFDM0_XARxIQImbalance;
1154 		pRFCalibrateInfo->RxIQC_8723B[PATH_S1][IDX_0xC14][VAL] = PHY_QueryBBReg(pDM_Odm->Adapter, rOFDM0_XARxIQImbalance, bMaskDWord);
1155 
1156 		reg = (result[final_candidate][3] >> 6) & 0xF;
1157 		PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_RxIQExtAnta, 0xF0000000, reg);
1158 		pRFCalibrateInfo->RxIQC_8723B[PATH_S1][IDX_0xCA0][KEY] = rOFDM0_RxIQExtAnta;
1159 		pRFCalibrateInfo->RxIQC_8723B[PATH_S1][IDX_0xCA0][VAL] = PHY_QueryBBReg(pDM_Odm->Adapter, rOFDM0_RxIQExtAnta, bMaskDWord);
1160 
1161 	}
1162 }
1163 
1164 static void _PHY_PathBFillIQKMatrix8723B(
1165 	struct adapter *padapter,
1166 	bool bIQKOK,
1167 	s32 result[][8],
1168 	u8 final_candidate,
1169 	bool bTxOnly /* do Tx only */
1170 )
1171 {
1172 	u32 Oldval_1, X, TX1_A, reg;
1173 	s32	Y, TX1_C;
1174 	struct hal_com_data	*pHalData = GET_HAL_DATA(padapter);
1175 	PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
1176 
1177 	PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);
1178 
1179 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path B IQ Calibration %s !\n", (bIQKOK)?"Success":"Failed"));
1180 
1181 	if (final_candidate == 0xFF)
1182 		return;
1183 
1184 	else if (bIQKOK) {
1185 		Oldval_1 = (PHY_QueryBBReg(pDM_Odm->Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord) >> 22) & 0x3FF;
1186 
1187 		X = result[final_candidate][4];
1188 		if ((X & 0x00000200) != 0)
1189 			X = X | 0xFFFFFC00;
1190 		TX1_A = (X * Oldval_1) >> 8;
1191 		ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("X = 0x%x, TX1_A = 0x%x\n", X, TX1_A));
1192 
1193 		PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_XBTxIQImbalance, 0x3FF, TX1_A);
1194 
1195 		PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_ECCAThreshold, BIT(27), ((X*Oldval_1>>7) & 0x1));
1196 
1197 		Y = result[final_candidate][5];
1198 		if ((Y & 0x00000200) != 0)
1199 			Y = Y | 0xFFFFFC00;
1200 
1201 		TX1_C = (Y * Oldval_1) >> 8;
1202 		ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("Y = 0x%x, TX1_C = 0x%x\n", Y, TX1_C));
1203 
1204 		/* 2 Tx IQC */
1205 		PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_XDTxAFE, 0xF0000000, ((TX1_C&0x3C0)>>6));
1206 /* 		pRFCalibrateInfo->TxIQC_8723B[PATH_S0][IDX_0xC9C][KEY] = rOFDM0_XDTxAFE; */
1207 /* 		pRFCalibrateInfo->TxIQC_8723B[PATH_S0][IDX_0xC9C][VAL] = PHY_QueryBBReg(pDM_Odm->Adapter, rOFDM0_XDTxAFE, bMaskDWord); */
1208 		pRFCalibrateInfo->TxIQC_8723B[PATH_S0][IDX_0xC94][KEY] = rOFDM0_XCTxAFE;
1209 		pRFCalibrateInfo->TxIQC_8723B[PATH_S0][IDX_0xC94][VAL] = PHY_QueryBBReg(pDM_Odm->Adapter, rOFDM0_XDTxAFE, bMaskDWord);
1210 
1211 		PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_XBTxIQImbalance, 0x003F0000, (TX1_C&0x3F));
1212 		pRFCalibrateInfo->TxIQC_8723B[PATH_S0][IDX_0xC80][KEY] = rOFDM0_XATxIQImbalance;
1213 		pRFCalibrateInfo->TxIQC_8723B[PATH_S0][IDX_0xC80][VAL] = PHY_QueryBBReg(pDM_Odm->Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord);
1214 
1215 		PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_ECCAThreshold, BIT(25), ((Y*Oldval_1>>7) & 0x1));
1216 		pRFCalibrateInfo->TxIQC_8723B[PATH_S0][IDX_0xC4C][KEY] = rOFDM0_ECCAThreshold;
1217 		pRFCalibrateInfo->TxIQC_8723B[PATH_S0][IDX_0xC4C][VAL] = PHY_QueryBBReg(pDM_Odm->Adapter, rOFDM0_ECCAThreshold, bMaskDWord);
1218 
1219 		if (bTxOnly) {
1220 			ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("_PHY_PathBFillIQKMatrix8723B only Tx OK\n"));
1221 
1222 			pRFCalibrateInfo->RxIQC_8723B[PATH_S0][IDX_0xC14][KEY] = rOFDM0_XARxIQImbalance;
1223 /* 			pRFCalibrateInfo->RxIQC_8723B[PATH_S0][IDX_0xC14][VAL] = PHY_QueryBBReg(pDM_Odm->Adapter, rOFDM0_XARxIQImbalance, bMaskDWord); */
1224 			pRFCalibrateInfo->RxIQC_8723B[PATH_S0][IDX_0xC14][VAL] = 0x40000100;
1225 			pRFCalibrateInfo->RxIQC_8723B[PATH_S0][IDX_0xCA0][KEY] = rOFDM0_RxIQExtAnta;
1226 			pRFCalibrateInfo->RxIQC_8723B[PATH_S0][IDX_0xCA0][VAL] = 0x0fffffff & PHY_QueryBBReg(pDM_Odm->Adapter, rOFDM0_RxIQExtAnta, bMaskDWord);
1227 			return;
1228 		}
1229 
1230 		/* 2 Rx IQC */
1231 		reg = result[final_candidate][6];
1232 		PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_XBRxIQImbalance, 0x3FF, reg);
1233 		reg = result[final_candidate][7] & 0x3F;
1234 		PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_XBRxIQImbalance, 0xFC00, reg);
1235 		pRFCalibrateInfo->RxIQC_8723B[PATH_S0][IDX_0xC14][KEY] = rOFDM0_XARxIQImbalance;
1236 		pRFCalibrateInfo->RxIQC_8723B[PATH_S0][IDX_0xC14][VAL] = PHY_QueryBBReg(pDM_Odm->Adapter, rOFDM0_XBRxIQImbalance, bMaskDWord);
1237 
1238 		reg = (result[final_candidate][7] >> 6) & 0xF;
1239 /* 		PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_AGCRSSITable, 0x0000F000, reg); */
1240 		pRFCalibrateInfo->RxIQC_8723B[PATH_S0][IDX_0xCA0][KEY] = rOFDM0_RxIQExtAnta;
1241 		pRFCalibrateInfo->RxIQC_8723B[PATH_S0][IDX_0xCA0][VAL] = (reg << 28)|(PHY_QueryBBReg(pDM_Odm->Adapter, rOFDM0_RxIQExtAnta, bMaskDWord)&0x0fffffff);
1242 	}
1243 }
1244 
1245 /*  */
1246 /*  2011/07/26 MH Add an API for testing IQK fail case. */
1247 /*  */
1248 /*  MP Already declare in odm.c */
1249 
1250 void ODM_SetIQCbyRFpath(PDM_ODM_T pDM_Odm, u32 RFpath)
1251 {
1252 
1253 	PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);
1254 
1255 	if (
1256 		(pRFCalibrateInfo->TxIQC_8723B[PATH_S0][IDX_0xC80][VAL] != 0x0) &&
1257 		(pRFCalibrateInfo->RxIQC_8723B[PATH_S0][IDX_0xC14][VAL] != 0x0) &&
1258 		(pRFCalibrateInfo->TxIQC_8723B[PATH_S1][IDX_0xC80][VAL] != 0x0) &&
1259 		(pRFCalibrateInfo->RxIQC_8723B[PATH_S1][IDX_0xC14][VAL] != 0x0)
1260 	) {
1261 		if (RFpath) { /* S1: RFpath = 0, S0:RFpath = 1 */
1262 			/* S0 TX IQC */
1263 			PHY_SetBBReg(pDM_Odm->Adapter, pRFCalibrateInfo->TxIQC_8723B[PATH_S0][IDX_0xC94][KEY], bMaskDWord, pRFCalibrateInfo->TxIQC_8723B[PATH_S0][IDX_0xC94][VAL]);
1264 			PHY_SetBBReg(pDM_Odm->Adapter, pRFCalibrateInfo->TxIQC_8723B[PATH_S0][IDX_0xC80][KEY], bMaskDWord, pRFCalibrateInfo->TxIQC_8723B[PATH_S0][IDX_0xC80][VAL]);
1265 			PHY_SetBBReg(pDM_Odm->Adapter, pRFCalibrateInfo->TxIQC_8723B[PATH_S0][IDX_0xC4C][KEY], bMaskDWord, pRFCalibrateInfo->TxIQC_8723B[PATH_S0][IDX_0xC4C][VAL]);
1266 			/* S0 RX IQC */
1267 			PHY_SetBBReg(pDM_Odm->Adapter, pRFCalibrateInfo->RxIQC_8723B[PATH_S0][IDX_0xC14][KEY], bMaskDWord, pRFCalibrateInfo->RxIQC_8723B[PATH_S0][IDX_0xC14][VAL]);
1268 			PHY_SetBBReg(pDM_Odm->Adapter, pRFCalibrateInfo->RxIQC_8723B[PATH_S0][IDX_0xCA0][KEY], bMaskDWord, pRFCalibrateInfo->RxIQC_8723B[PATH_S0][IDX_0xCA0][VAL]);
1269 		} else {
1270 			/* S1 TX IQC */
1271 			PHY_SetBBReg(pDM_Odm->Adapter, pRFCalibrateInfo->TxIQC_8723B[PATH_S1][IDX_0xC94][KEY], bMaskDWord, pRFCalibrateInfo->TxIQC_8723B[PATH_S1][IDX_0xC94][VAL]);
1272 			PHY_SetBBReg(pDM_Odm->Adapter, pRFCalibrateInfo->TxIQC_8723B[PATH_S1][IDX_0xC80][KEY], bMaskDWord, pRFCalibrateInfo->TxIQC_8723B[PATH_S1][IDX_0xC80][VAL]);
1273 			PHY_SetBBReg(pDM_Odm->Adapter, pRFCalibrateInfo->TxIQC_8723B[PATH_S1][IDX_0xC4C][KEY], bMaskDWord, pRFCalibrateInfo->TxIQC_8723B[PATH_S1][IDX_0xC4C][VAL]);
1274 			/* S1 RX IQC */
1275 			PHY_SetBBReg(pDM_Odm->Adapter, pRFCalibrateInfo->RxIQC_8723B[PATH_S1][IDX_0xC14][KEY], bMaskDWord, pRFCalibrateInfo->RxIQC_8723B[PATH_S1][IDX_0xC14][VAL]);
1276 			PHY_SetBBReg(pDM_Odm->Adapter, pRFCalibrateInfo->RxIQC_8723B[PATH_S1][IDX_0xCA0][KEY], bMaskDWord, pRFCalibrateInfo->RxIQC_8723B[PATH_S1][IDX_0xCA0][VAL]);
1277 		}
1278 	}
1279 }
1280 
1281 static bool ODM_CheckPowerStatus(struct adapter *Adapter)
1282 {
1283 	return true;
1284 }
1285 
1286 static void _PHY_SaveADDARegisters8723B(
1287 	struct adapter *padapter,
1288 	u32 *ADDAReg,
1289 	u32 *ADDABackup,
1290 	u32 RegisterNum
1291 )
1292 {
1293 	u32 i;
1294 	struct hal_com_data *pHalData = GET_HAL_DATA(padapter);
1295 	PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
1296 
1297 	if (!ODM_CheckPowerStatus(padapter))
1298 		return;
1299 
1300 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Save ADDA parameters.\n"));
1301 	for (i = 0 ; i < RegisterNum ; i++) {
1302 		ADDABackup[i] = PHY_QueryBBReg(pDM_Odm->Adapter, ADDAReg[i], bMaskDWord);
1303 	}
1304 }
1305 
1306 
1307 static void _PHY_SaveMACRegisters8723B(
1308 	struct adapter *padapter, u32 *MACReg, u32 *MACBackup
1309 )
1310 {
1311 	u32 i;
1312 	struct hal_com_data	*pHalData = GET_HAL_DATA(padapter);
1313 	PDM_ODM_T		pDM_Odm = &pHalData->odmpriv;
1314 
1315 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Save MAC parameters.\n"));
1316 	for (i = 0 ; i < (IQK_MAC_REG_NUM - 1); i++) {
1317 		MACBackup[i] = rtw_read8(pDM_Odm->Adapter, MACReg[i]);
1318 	}
1319 	MACBackup[i] = rtw_read32(pDM_Odm->Adapter, MACReg[i]);
1320 
1321 }
1322 
1323 
1324 static void _PHY_ReloadADDARegisters8723B(
1325 	struct adapter *padapter,
1326 	u32 *ADDAReg,
1327 	u32 *ADDABackup,
1328 	u32 RegiesterNum
1329 )
1330 {
1331 	u32 i;
1332 	struct hal_com_data	*pHalData = GET_HAL_DATA(padapter);
1333 	PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
1334 
1335 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Reload ADDA power saving parameters !\n"));
1336 	for (i = 0 ; i < RegiesterNum; i++) {
1337 		PHY_SetBBReg(pDM_Odm->Adapter, ADDAReg[i], bMaskDWord, ADDABackup[i]);
1338 	}
1339 }
1340 
1341 static void _PHY_ReloadMACRegisters8723B(
1342 	struct adapter *padapter, u32 *MACReg, u32 *MACBackup
1343 )
1344 {
1345 	u32 i;
1346 
1347 	for (i = 0 ; i < (IQK_MAC_REG_NUM - 1); i++) {
1348 		rtw_write8(padapter, MACReg[i], (u8)MACBackup[i]);
1349 	}
1350 	rtw_write32(padapter, MACReg[i], MACBackup[i]);
1351 }
1352 
1353 
1354 static void _PHY_PathADDAOn8723B(
1355 	struct adapter *padapter,
1356 	u32 *ADDAReg,
1357 	bool is2T
1358 )
1359 {
1360 	u32 pathOn;
1361 	u32 i;
1362 	struct hal_com_data *pHalData = GET_HAL_DATA(padapter);
1363 	PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
1364 
1365 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("ADDA ON.\n"));
1366 
1367 	pathOn = 0x01c00014;
1368 	if (!is2T) {
1369 		pathOn = 0x01c00014;
1370 		PHY_SetBBReg(pDM_Odm->Adapter, ADDAReg[0], bMaskDWord, 0x01c00014);
1371 	} else {
1372 		PHY_SetBBReg(pDM_Odm->Adapter, ADDAReg[0], bMaskDWord, pathOn);
1373 	}
1374 
1375 	for (i = 1 ; i < IQK_ADDA_REG_NUM ; i++) {
1376 		PHY_SetBBReg(pDM_Odm->Adapter, ADDAReg[i], bMaskDWord, pathOn);
1377 	}
1378 
1379 }
1380 
1381 static void _PHY_MACSettingCalibration8723B(
1382 	struct adapter *padapter, u32 *MACReg, u32 *MACBackup
1383 )
1384 {
1385 	u32 i = 0;
1386 	struct hal_com_data	*pHalData = GET_HAL_DATA(padapter);
1387 	PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
1388 
1389 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("MAC settings for Calibration.\n"));
1390 
1391 	rtw_write8(pDM_Odm->Adapter, MACReg[i], 0x3F);
1392 
1393 	for (i = 1 ; i < (IQK_MAC_REG_NUM - 1); i++) {
1394 		rtw_write8(pDM_Odm->Adapter, MACReg[i], (u8)(MACBackup[i]&(~BIT3)));
1395 	}
1396 	rtw_write8(pDM_Odm->Adapter, MACReg[i], (u8)(MACBackup[i]&(~BIT5)));
1397 
1398 }
1399 
1400 static bool phy_SimularityCompare_8723B(
1401 	struct adapter *padapter,
1402 	s32 result[][8],
1403 	u8  c1,
1404 	u8  c2
1405 )
1406 {
1407 	u32 i, j, diff, SimularityBitMap, bound = 0;
1408 	u8 final_candidate[2] = {0xFF, 0xFF}; /* for path A and path B */
1409 	bool bResult = true;
1410 	s32 tmp1 = 0, tmp2 = 0;
1411 
1412 	bound = 8;
1413 	SimularityBitMap = 0;
1414 
1415 	for (i = 0; i < bound; i++) {
1416 
1417 		if ((i == 1) || (i == 3) || (i == 5) || (i == 7)) {
1418 			if ((result[c1][i] & 0x00000200) != 0)
1419 				tmp1 = result[c1][i] | 0xFFFFFC00;
1420 			else
1421 				tmp1 = result[c1][i];
1422 
1423 			if ((result[c2][i] & 0x00000200) != 0)
1424 				tmp2 = result[c2][i] | 0xFFFFFC00;
1425 			else
1426 				tmp2 = result[c2][i];
1427 		} else {
1428 			tmp1 = result[c1][i];
1429 			tmp2 = result[c2][i];
1430 		}
1431 
1432 		diff = (tmp1 > tmp2) ? (tmp1 - tmp2) : (tmp2 - tmp1);
1433 
1434 		if (diff > MAX_TOLERANCE) {
1435 			if ((i == 2 || i == 6) && !SimularityBitMap) {
1436 				if (result[c1][i]+result[c1][i+1] == 0)
1437 					final_candidate[(i/4)] = c2;
1438 				else if (result[c2][i]+result[c2][i+1] == 0)
1439 					final_candidate[(i/4)] = c1;
1440 				else
1441 					SimularityBitMap = SimularityBitMap|(1<<i);
1442 			} else
1443 				SimularityBitMap = SimularityBitMap|(1<<i);
1444 		}
1445 	}
1446 
1447 	if (SimularityBitMap == 0) {
1448 		for (i = 0; i < (bound/4); i++) {
1449 			if (final_candidate[i] != 0xFF) {
1450 				for (j = i*4; j < (i+1)*4-2; j++)
1451 					result[3][j] = result[final_candidate[i]][j];
1452 				bResult = false;
1453 			}
1454 		}
1455 		return bResult;
1456 	} else {
1457 
1458 		if (!(SimularityBitMap & 0x03)) { /* path A TX OK */
1459 			for (i = 0; i < 2; i++)
1460 				result[3][i] = result[c1][i];
1461 		}
1462 
1463 		if (!(SimularityBitMap & 0x0c)) { /* path A RX OK */
1464 			for (i = 2; i < 4; i++)
1465 				result[3][i] = result[c1][i];
1466 		}
1467 
1468 		if (!(SimularityBitMap & 0x30)) { /* path B TX OK */
1469 			for (i = 4; i < 6; i++)
1470 				result[3][i] = result[c1][i];
1471 		}
1472 
1473 		if (!(SimularityBitMap & 0xc0)) { /* path B RX OK */
1474 			for (i = 6; i < 8; i++)
1475 				result[3][i] = result[c1][i];
1476 		}
1477 		return false;
1478 	}
1479 }
1480 
1481 
1482 
1483 static void phy_IQCalibrate_8723B(
1484 	struct adapter *padapter,
1485 	s32 result[][8],
1486 	u8 t,
1487 	bool is2T,
1488 	u8 RF_Path
1489 )
1490 {
1491 	struct hal_com_data	*pHalData = GET_HAL_DATA(padapter);
1492 	PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
1493 
1494 	u32 i;
1495 	u8 PathAOK, PathBOK;
1496 	u8 tmp0xc50 = (u8)PHY_QueryBBReg(pDM_Odm->Adapter, 0xC50, bMaskByte0);
1497 	u8 tmp0xc58 = (u8)PHY_QueryBBReg(pDM_Odm->Adapter, 0xC58, bMaskByte0);
1498 	u32 ADDA_REG[IQK_ADDA_REG_NUM] = {
1499 		rFPGA0_XCD_SwitchControl,
1500 		rBlue_Tooth,
1501 		rRx_Wait_CCA,
1502 		rTx_CCK_RFON,
1503 		rTx_CCK_BBON,
1504 		rTx_OFDM_RFON,
1505 		rTx_OFDM_BBON,
1506 		rTx_To_Rx,
1507 		rTx_To_Tx,
1508 		rRx_CCK,
1509 		rRx_OFDM,
1510 		rRx_Wait_RIFS,
1511 		rRx_TO_Rx,
1512 		rStandby,
1513 		rSleep,
1514 		rPMPD_ANAEN
1515 	};
1516 	u32 IQK_MAC_REG[IQK_MAC_REG_NUM] = {
1517 		REG_TXPAUSE,
1518 		REG_BCN_CTRL,
1519 		REG_BCN_CTRL_1,
1520 		REG_GPIO_MUXCFG
1521 	};
1522 
1523 	/* since 92C & 92D have the different define in IQK_BB_REG */
1524 	u32 IQK_BB_REG_92C[IQK_BB_REG_NUM] = {
1525 		rOFDM0_TRxPathEnable,
1526 		rOFDM0_TRMuxPar,
1527 		rFPGA0_XCD_RFInterfaceSW,
1528 		rConfig_AntA,
1529 		rConfig_AntB,
1530 		rFPGA0_XAB_RFInterfaceSW,
1531 		rFPGA0_XA_RFInterfaceOE,
1532 		rFPGA0_XB_RFInterfaceOE,
1533 		rCCK0_AFESetting
1534 	};
1535 	const u32 retryCount = 2;
1536 
1537 	/*  Note: IQ calibration must be performed after loading */
1538 	/* 		PHY_REG.txt , and radio_a, radio_b.txt */
1539 
1540 	/* u32 bbvalue; */
1541 
1542 	if (t == 0) {
1543 /* 		 bbvalue = PHY_QueryBBReg(pDM_Odm->Adapter, rFPGA0_RFMOD, bMaskDWord); */
1544 /* 			RT_DISP(FINIT, INIT_IQK, ("phy_IQCalibrate_8188E() ==>0x%08x\n", bbvalue)); */
1545 
1546 			ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("IQ Calibration for %s for %d times\n", (is2T ? "2T2R" : "1T1R"), t));
1547 
1548 		/*  Save ADDA parameters, turn Path A ADDA on */
1549 		_PHY_SaveADDARegisters8723B(padapter, ADDA_REG, pDM_Odm->RFCalibrateInfo.ADDA_backup, IQK_ADDA_REG_NUM);
1550 		_PHY_SaveMACRegisters8723B(padapter, IQK_MAC_REG, pDM_Odm->RFCalibrateInfo.IQK_MAC_backup);
1551 		_PHY_SaveADDARegisters8723B(padapter, IQK_BB_REG_92C, pDM_Odm->RFCalibrateInfo.IQK_BB_backup, IQK_BB_REG_NUM);
1552 	}
1553 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("IQ Calibration for %s for %d times\n", (is2T ? "2T2R" : "1T1R"), t));
1554 
1555 	_PHY_PathADDAOn8723B(padapter, ADDA_REG, is2T);
1556 
1557 /* no serial mode */
1558 
1559 	/* save RF path for 8723B */
1560 /* 	Path_SEL_BB = PHY_QueryBBReg(pDM_Odm->Adapter, 0x948, bMaskDWord); */
1561 /* 	Path_SEL_RF = PHY_QueryRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, 0xb0, 0xfffff); */
1562 
1563 	/* MAC settings */
1564 	_PHY_MACSettingCalibration8723B(padapter, IQK_MAC_REG, pDM_Odm->RFCalibrateInfo.IQK_MAC_backup);
1565 
1566 	/* BB setting */
1567 	/* PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_RFMOD, BIT24, 0x00); */
1568 	PHY_SetBBReg(pDM_Odm->Adapter, rCCK0_AFESetting, 0x0f000000, 0xf);
1569 	PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_TRxPathEnable, bMaskDWord, 0x03a05600);
1570 	PHY_SetBBReg(pDM_Odm->Adapter, rOFDM0_TRMuxPar, bMaskDWord, 0x000800e4);
1571 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, 0x22204000);
1572 
1573 
1574 /* 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_XAB_RFInterfaceSW, BIT10, 0x01); */
1575 /* 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_XAB_RFInterfaceSW, BIT26, 0x01); */
1576 /* 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_XA_RFInterfaceOE, BIT10, 0x00); */
1577 /* 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_XB_RFInterfaceOE, BIT10, 0x00); */
1578 
1579 
1580 /* RX IQ calibration setting for 8723B D cut large current issue when leaving IPS */
1581 
1582 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
1583 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x1);
1584 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x30000);
1585 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_TXPA_G1, bRFRegOffsetMask, 0x0001f);
1586 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_TXPA_G2, bRFRegOffsetMask, 0xf7fb7);
1587 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, 0xed, 0x20, 0x1);
1588 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, 0x43, bRFRegOffsetMask, 0x60fbd);
1589 
1590 /* path A TX IQK */
1591 	for (i = 0 ; i < retryCount ; i++) {
1592 		PathAOK = phy_PathA_IQK_8723B(padapter, is2T, RF_Path);
1593 /* 		if (PathAOK == 0x03) { */
1594 		if (PathAOK == 0x01) {
1595 			/*  Path A Tx IQK Success */
1596 			PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
1597 			pDM_Odm->RFCalibrateInfo.TxLOK[ODM_RF_PATH_A] = PHY_QueryRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, 0x8, bRFRegOffsetMask);
1598 
1599 			ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path A Tx IQK Success!!\n"));
1600 				result[t][0] = (PHY_QueryBBReg(pDM_Odm->Adapter, rTx_Power_Before_IQK_A, bMaskDWord)&0x3FF0000)>>16;
1601 				result[t][1] = (PHY_QueryBBReg(pDM_Odm->Adapter, rTx_Power_After_IQK_A, bMaskDWord)&0x3FF0000)>>16;
1602 			break;
1603 		}
1604 	}
1605 
1606 /* path A RXIQK */
1607 	for (i = 0 ; i < retryCount ; i++) {
1608 		PathAOK = phy_PathA_RxIQK8723B(padapter, is2T, RF_Path);
1609 		if (PathAOK == 0x03) {
1610 			ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("Path A Rx IQK Success!!\n"));
1611 /* 				result[t][0] = (PHY_QueryBBReg(pDM_Odm->Adapter, rTx_Power_Before_IQK_A, bMaskDWord)&0x3FF0000)>>16; */
1612 /* 				result[t][1] = (PHY_QueryBBReg(pDM_Odm->Adapter, rTx_Power_After_IQK_A, bMaskDWord)&0x3FF0000)>>16; */
1613 				result[t][2] = (PHY_QueryBBReg(pDM_Odm->Adapter, rRx_Power_Before_IQK_A_2, bMaskDWord)&0x3FF0000)>>16;
1614 				result[t][3] = (PHY_QueryBBReg(pDM_Odm->Adapter, rRx_Power_After_IQK_A_2, bMaskDWord)&0x3FF0000)>>16;
1615 			break;
1616 		} else {
1617 			ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path A Rx IQK Fail!!\n"));
1618 		}
1619 	}
1620 
1621 	if (0x00 == PathAOK) {
1622 		ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path A IQK failed!!\n"));
1623 	}
1624 
1625 /* path B IQK */
1626 	if (is2T) {
1627 
1628 		/* path B TX IQK */
1629 		for (i = 0 ; i < retryCount ; i++) {
1630 			PathBOK = phy_PathB_IQK_8723B(padapter);
1631 			if (PathBOK == 0x01) {
1632 				/*  Path B Tx IQK Success */
1633 				PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_IQK, bMaskH3Bytes, 0x000000);
1634 				pDM_Odm->RFCalibrateInfo.TxLOK[ODM_RF_PATH_B] = PHY_QueryRFReg(pDM_Odm->Adapter, ODM_RF_PATH_B, 0x8, bRFRegOffsetMask);
1635 
1636 				ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path B Tx IQK Success!!\n"));
1637 				result[t][4] = (PHY_QueryBBReg(pDM_Odm->Adapter, rTx_Power_Before_IQK_A, bMaskDWord)&0x3FF0000)>>16;
1638 				result[t][5] = (PHY_QueryBBReg(pDM_Odm->Adapter, rTx_Power_After_IQK_A, bMaskDWord)&0x3FF0000)>>16;
1639 				break;
1640 			}
1641 		}
1642 
1643 /* path B RX IQK */
1644 		for (i = 0 ; i < retryCount ; i++) {
1645 			PathBOK = phy_PathB_RxIQK8723B(padapter, is2T);
1646 			if (PathBOK == 0x03) {
1647 				ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("Path B Rx IQK Success!!\n"));
1648 /* 				result[t][0] = (PHY_QueryBBReg(pDM_Odm->Adapter, rTx_Power_Before_IQK_A, bMaskDWord)&0x3FF0000)>>16; */
1649 /* 				result[t][1] = (PHY_QueryBBReg(pDM_Odm->Adapter, rTx_Power_After_IQK_A, bMaskDWord)&0x3FF0000)>>16; */
1650 				result[t][6] = (PHY_QueryBBReg(pDM_Odm->Adapter, rRx_Power_Before_IQK_A_2, bMaskDWord)&0x3FF0000)>>16;
1651 				result[t][7] = (PHY_QueryBBReg(pDM_Odm->Adapter, rRx_Power_After_IQK_A_2, bMaskDWord)&0x3FF0000)>>16;
1652 				break;
1653 			} else {
1654 				ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path B Rx IQK Fail!!\n"));
1655 			}
1656 		}
1657 
1658 /* Allen end */
1659 		if (0x00 == PathBOK) {
1660 			ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Path B IQK failed!!\n"));
1661 		}
1662 	}
1663 
1664 	/* Back to BB mode, load original value */
1665 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("IQK:Back to BB mode, load original value!\n"));
1666 	PHY_SetBBReg(pDM_Odm->Adapter, rFPGA0_IQK, bMaskH3Bytes, 0);
1667 
1668 	if (t != 0) {
1669 		/*  Reload ADDA power saving parameters */
1670 		_PHY_ReloadADDARegisters8723B(padapter, ADDA_REG, pDM_Odm->RFCalibrateInfo.ADDA_backup, IQK_ADDA_REG_NUM);
1671 
1672 		/*  Reload MAC parameters */
1673 		_PHY_ReloadMACRegisters8723B(padapter, IQK_MAC_REG, pDM_Odm->RFCalibrateInfo.IQK_MAC_backup);
1674 
1675 		_PHY_ReloadADDARegisters8723B(padapter, IQK_BB_REG_92C, pDM_Odm->RFCalibrateInfo.IQK_BB_backup, IQK_BB_REG_NUM);
1676 
1677 		/* Reload RF path */
1678 /* 		PHY_SetBBReg(pDM_Odm->Adapter, 0x948, bMaskDWord, Path_SEL_BB); */
1679 /* 		PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, 0xb0, 0xfffff, Path_SEL_RF); */
1680 
1681 		/* Allen initial gain 0xc50 */
1682 		/*  Restore RX initial gain */
1683 		PHY_SetBBReg(pDM_Odm->Adapter, 0xc50, bMaskByte0, 0x50);
1684 		PHY_SetBBReg(pDM_Odm->Adapter, 0xc50, bMaskByte0, tmp0xc50);
1685 		if (is2T) {
1686 			PHY_SetBBReg(pDM_Odm->Adapter, 0xc58, bMaskByte0, 0x50);
1687 			PHY_SetBBReg(pDM_Odm->Adapter, 0xc58, bMaskByte0, tmp0xc58);
1688 		}
1689 
1690 		/* load 0xe30 IQC default value */
1691 		PHY_SetBBReg(pDM_Odm->Adapter, rTx_IQK_Tone_A, bMaskDWord, 0x01008c00);
1692 		PHY_SetBBReg(pDM_Odm->Adapter, rRx_IQK_Tone_A, bMaskDWord, 0x01008c00);
1693 
1694 	}
1695 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_IQCalibrate_8723B() <==\n"));
1696 
1697 }
1698 
1699 
1700 static void phy_LCCalibrate_8723B(PDM_ODM_T pDM_Odm, bool is2T)
1701 {
1702 	u8 tmpReg;
1703 	u32 RF_Amode = 0, RF_Bmode = 0, LC_Cal;
1704 	struct adapter *padapter = pDM_Odm->Adapter;
1705 
1706 	/* Check continuous TX and Packet TX */
1707 	tmpReg = rtw_read8(pDM_Odm->Adapter, 0xd03);
1708 
1709 	if ((tmpReg&0x70) != 0)			/* Deal with contisuous TX case */
1710 		rtw_write8(pDM_Odm->Adapter, 0xd03, tmpReg&0x8F);	/* disable all continuous TX */
1711 	else							/*  Deal with Packet TX case */
1712 		rtw_write8(pDM_Odm->Adapter, REG_TXPAUSE, 0xFF);		/*  block all queues */
1713 
1714 	if ((tmpReg&0x70) != 0) {
1715 		/* 1. Read original RF mode */
1716 		/* Path-A */
1717 		RF_Amode = PHY_QueryRFReg(padapter, ODM_RF_PATH_A, RF_AC, bMask12Bits);
1718 
1719 		/* Path-B */
1720 		if (is2T)
1721 			RF_Bmode = PHY_QueryRFReg(padapter, ODM_RF_PATH_B, RF_AC, bMask12Bits);
1722 
1723 		/* 2. Set RF mode = standby mode */
1724 		/* Path-A */
1725 		PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_AC, bMask12Bits, (RF_Amode&0x8FFFF)|0x10000);
1726 
1727 		/* Path-B */
1728 		if (is2T)
1729 			PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_B, RF_AC, bMask12Bits, (RF_Bmode&0x8FFFF)|0x10000);
1730 	}
1731 
1732 	/* 3. Read RF reg18 */
1733 	LC_Cal = PHY_QueryRFReg(padapter, ODM_RF_PATH_A, RF_CHNLBW, bMask12Bits);
1734 
1735 	/* 4. Set LC calibration begin	bit15 */
1736 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, 0xB0, bRFRegOffsetMask, 0xDFBE0); /*  LDO ON */
1737 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_CHNLBW, bMask12Bits, LC_Cal|0x08000);
1738 
1739 	mdelay(100);
1740 
1741 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, 0xB0, bRFRegOffsetMask, 0xDFFE0); /*  LDO OFF */
1742 
1743 	/*  Channel 10 LC calibration issue for 8723bs with 26M xtal */
1744 	if (pDM_Odm->SupportInterface == ODM_ITRF_SDIO && pDM_Odm->PackageType >= 0x2) {
1745 		PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_CHNLBW, bMask12Bits, LC_Cal);
1746 	}
1747 
1748 	/* Restore original situation */
1749 	if ((tmpReg&0x70) != 0) { /* Deal with contisuous TX case */
1750 		/* Path-A */
1751 		rtw_write8(pDM_Odm->Adapter, 0xd03, tmpReg);
1752 		PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_AC, bMask12Bits, RF_Amode);
1753 
1754 		/* Path-B */
1755 		if (is2T)
1756 			PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_B, RF_AC, bMask12Bits, RF_Bmode);
1757 	} else /*  Deal with Packet TX case */
1758 		rtw_write8(pDM_Odm->Adapter, REG_TXPAUSE, 0x00);
1759 }
1760 
1761 /* Analog Pre-distortion calibration */
1762 #define		APK_BB_REG_NUM	8
1763 #define		APK_CURVE_REG_NUM 4
1764 #define		PATH_NUM		2
1765 
1766 #define		DP_BB_REG_NUM		7
1767 #define		DP_RF_REG_NUM		1
1768 #define		DP_RETRY_LIMIT		10
1769 #define		DP_PATH_NUM	2
1770 #define		DP_DPK_NUM			3
1771 #define		DP_DPK_VALUE_NUM	2
1772 
1773 
1774 
1775 /* IQK version:V2.5    20140123 */
1776 /* IQK is controlled by Is2ant, RF path */
1777 void PHY_IQCalibrate_8723B(
1778 	struct adapter *padapter,
1779 	bool bReCovery,
1780 	bool bRestore,
1781 	bool Is2ant,	/* false:1ant, true:2-ant */
1782 	u8 RF_Path	/* 0:S1, 1:S0 */
1783 )
1784 {
1785 	struct hal_com_data	*pHalData = GET_HAL_DATA(padapter);
1786 
1787 	PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
1788 
1789 	s32 result[4][8];	/* last is final result */
1790 	u8 i, final_candidate;
1791 	bool bPathAOK, bPathBOK;
1792 	s32 RegE94, RegE9C, RegEA4, RegEAC, RegEB4, RegEBC, RegEC4, RegECC, RegTmp = 0;
1793 	bool is12simular, is13simular, is23simular;
1794 	bool bSingleTone = false, bCarrierSuppression = false;
1795 	u32 IQK_BB_REG_92C[IQK_BB_REG_NUM] = {
1796 		rOFDM0_XARxIQImbalance,
1797 		rOFDM0_XBRxIQImbalance,
1798 		rOFDM0_ECCAThreshold,
1799 		rOFDM0_AGCRSSITable,
1800 		rOFDM0_XATxIQImbalance,
1801 		rOFDM0_XBTxIQImbalance,
1802 		rOFDM0_XCTxAFE,
1803 		rOFDM0_XDTxAFE,
1804 		rOFDM0_RxIQExtAnta
1805 	};
1806 /* 	u32 		Path_SEL_BB = 0; */
1807 	u32 		GNT_BT_default;
1808 	u32 		StartTime;
1809 	s32			ProgressingTime;
1810 
1811 	if (!ODM_CheckPowerStatus(padapter))
1812 		return;
1813 
1814 	if (!(pDM_Odm->SupportAbility & ODM_RF_CALIBRATION))
1815 		return;
1816 
1817 	/*  20120213<Kordan> Turn on when continuous Tx to pass lab testing. (required by Edlu) */
1818 	if (bSingleTone || bCarrierSuppression)
1819 		return;
1820 
1821 #if DISABLE_BB_RF
1822 	return;
1823 #endif
1824 	if (pDM_Odm->RFCalibrateInfo.bIQKInProgress)
1825 		return;
1826 
1827 
1828 	pDM_Odm->RFCalibrateInfo.bIQKInProgress = true;
1829 
1830 	if (bRestore) {
1831 		u32 offset, data;
1832 		u8 path, bResult = SUCCESS;
1833 		PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);
1834 
1835 		path = (PHY_QueryBBReg(pDM_Odm->Adapter, rS0S1_PathSwitch, bMaskByte0) == 0x00) ? ODM_RF_PATH_A : ODM_RF_PATH_B;
1836 
1837 		/*  Restore TX IQK */
1838 		for (i = 0; i < 3; ++i) {
1839 			offset = pRFCalibrateInfo->TxIQC_8723B[path][i][0];
1840 			data = pRFCalibrateInfo->TxIQC_8723B[path][i][1];
1841 			if ((offset == 0) || (data == 0)) {
1842 				DBG_871X(
1843 					"%s =>path:%s Restore TX IQK result failed\n",
1844 					__func__,
1845 					(path == ODM_RF_PATH_A)?"A":"B"
1846 				);
1847 				bResult = FAIL;
1848 				break;
1849 			}
1850 			/* RT_TRACE(_module_mp_, _drv_notice_, ("Switch to S1 TxIQC(offset, data) = (0x%X, 0x%X)\n", offset, data)); */
1851 			PHY_SetBBReg(pDM_Odm->Adapter, offset, bMaskDWord, data);
1852 		}
1853 
1854 		/*  Restore RX IQK */
1855 		for (i = 0; i < 2; ++i) {
1856 			offset = pRFCalibrateInfo->RxIQC_8723B[path][i][0];
1857 			data = pRFCalibrateInfo->RxIQC_8723B[path][i][1];
1858 			if ((offset == 0) || (data == 0)) {
1859 				DBG_871X(
1860 					"%s =>path:%s  Restore RX IQK result failed\n",
1861 					__func__,
1862 					(path == ODM_RF_PATH_A)?"A":"B"
1863 				);
1864 				bResult = FAIL;
1865 				break;
1866 			}
1867 			/* RT_TRACE(_module_mp_, _drv_notice_, ("Switch to S1 RxIQC (offset, data) = (0x%X, 0x%X)\n", offset, data)); */
1868 			PHY_SetBBReg(pDM_Odm->Adapter, offset, bMaskDWord, data);
1869 		}
1870 
1871 		if (pDM_Odm->RFCalibrateInfo.TxLOK[ODM_RF_PATH_A] == 0) {
1872 			DBG_871X("%s => Restore Path-A TxLOK result failed\n", __func__);
1873 			bResult = FAIL;
1874 		} else {
1875 			PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_TXM_IDAC, bRFRegOffsetMask, pDM_Odm->RFCalibrateInfo.TxLOK[ODM_RF_PATH_A]);
1876 			PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_B, RF_TXM_IDAC, bRFRegOffsetMask, pDM_Odm->RFCalibrateInfo.TxLOK[ODM_RF_PATH_B]);
1877 		}
1878 
1879 		if (bResult == SUCCESS)
1880 			return;
1881 	}
1882 
1883 	if (bReCovery) {
1884 		ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("PHY_IQCalibrate_8723B: Return due to bReCovery!\n"));
1885 		_PHY_ReloadADDARegisters8723B(padapter, IQK_BB_REG_92C, pDM_Odm->RFCalibrateInfo.IQK_BB_backup_recover, 9);
1886 		return;
1887 	}
1888 	StartTime = jiffies;
1889 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("IQK:Start!!!\n"));
1890 
1891 	/* save default GNT_BT */
1892 	GNT_BT_default = PHY_QueryBBReg(pDM_Odm->Adapter, 0x764, bMaskDWord);
1893 	/*  Save RF Path */
1894 /* 	Path_SEL_BB = PHY_QueryBBReg(pDM_Odm->Adapter, 0x948, bMaskDWord); */
1895 /* 	Path_SEL_RF = PHY_QueryRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, 0xb0, 0xfffff); */
1896 
1897     /* set GNT_BT = 0, pause BT traffic */
1898 /* 	PHY_SetBBReg(pDM_Odm->Adapter, 0x764, BIT12, 0x0); */
1899 /* 	PHY_SetBBReg(pDM_Odm->Adapter, 0x764, BIT11, 0x1); */
1900 
1901 
1902 	for (i = 0; i < 8; i++) {
1903 		result[0][i] = 0;
1904 		result[1][i] = 0;
1905 		result[2][i] = 0;
1906 		result[3][i] = 0;
1907 	}
1908 
1909 	final_candidate = 0xff;
1910 	bPathAOK = false;
1911 	bPathBOK = false;
1912 	is12simular = false;
1913 	is23simular = false;
1914 	is13simular = false;
1915 
1916 
1917 	for (i = 0; i < 3; i++) {
1918 		phy_IQCalibrate_8723B(padapter, result, i, Is2ant, RF_Path);
1919 
1920 		if (i == 1) {
1921 			is12simular = phy_SimularityCompare_8723B(padapter, result, 0, 1);
1922 			if (is12simular) {
1923 				final_candidate = 0;
1924 				ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("IQK: is12simular final_candidate is %x\n", final_candidate));
1925 				break;
1926 			}
1927 		}
1928 
1929 		if (i == 2) {
1930 			is13simular = phy_SimularityCompare_8723B(padapter, result, 0, 2);
1931 			if (is13simular) {
1932 				final_candidate = 0;
1933 				ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("IQK: is13simular final_candidate is %x\n", final_candidate));
1934 
1935 				break;
1936 			}
1937 
1938 			is23simular = phy_SimularityCompare_8723B(padapter, result, 1, 2);
1939 			if (is23simular) {
1940 				final_candidate = 1;
1941 				ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("IQK: is23simular final_candidate is %x\n", final_candidate));
1942 			} else {
1943 				for (i = 0; i < 8; i++)
1944 					RegTmp += result[3][i];
1945 
1946 				if (RegTmp != 0)
1947 					final_candidate = 3;
1948 				else
1949 					final_candidate = 0xFF;
1950 			}
1951 		}
1952 	}
1953 /* 	RT_TRACE(COMP_INIT, DBG_LOUD, ("Release Mutex in IQCalibrate\n")); */
1954 
1955 	for (i = 0; i < 4; i++) {
1956 		RegE94 = result[i][0];
1957 		RegE9C = result[i][1];
1958 		RegEA4 = result[i][2];
1959 		RegEAC = result[i][3];
1960 		RegEB4 = result[i][4];
1961 		RegEBC = result[i][5];
1962 		RegEC4 = result[i][6];
1963 		RegECC = result[i][7];
1964 		ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("IQK: RegE94 =%x RegE9C =%x RegEA4 =%x RegEAC =%x RegEB4 =%x RegEBC =%x RegEC4 =%x RegECC =%x\n ", RegE94, RegE9C, RegEA4, RegEAC, RegEB4, RegEBC, RegEC4, RegECC));
1965 	}
1966 
1967 	if (final_candidate != 0xff) {
1968 		pDM_Odm->RFCalibrateInfo.RegE94 = RegE94 = result[final_candidate][0];
1969 		pDM_Odm->RFCalibrateInfo.RegE9C = RegE9C = result[final_candidate][1];
1970 		RegEA4 = result[final_candidate][2];
1971 		RegEAC = result[final_candidate][3];
1972 		pDM_Odm->RFCalibrateInfo.RegEB4 = RegEB4 = result[final_candidate][4];
1973 		pDM_Odm->RFCalibrateInfo.RegEBC = RegEBC = result[final_candidate][5];
1974 		RegEC4 = result[final_candidate][6];
1975 		RegECC = result[final_candidate][7];
1976 		ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("IQK: final_candidate is %x\n", final_candidate));
1977 		ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("IQK: RegE94 =%x RegE9C =%x RegEA4 =%x RegEAC =%x RegEB4 =%x RegEBC =%x RegEC4 =%x RegECC =%x\n ", RegE94, RegE9C, RegEA4, RegEAC, RegEB4, RegEBC, RegEC4, RegECC));
1978 		bPathAOK = bPathBOK = true;
1979 	} else {
1980 		ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("IQK: FAIL use default value\n"));
1981 
1982 		pDM_Odm->RFCalibrateInfo.RegE94 = pDM_Odm->RFCalibrateInfo.RegEB4 = 0x100;	/* X default value */
1983 		pDM_Odm->RFCalibrateInfo.RegE9C = pDM_Odm->RFCalibrateInfo.RegEBC = 0x0;		/* Y default value */
1984 	}
1985 
1986 	{
1987 		if (RegE94 != 0)
1988 			_PHY_PathAFillIQKMatrix8723B(padapter, bPathAOK, result, final_candidate, (RegEA4 == 0));
1989 	}
1990 	{
1991 		if (RegEB4 != 0)
1992 			_PHY_PathBFillIQKMatrix8723B(padapter, bPathBOK, result, final_candidate, (RegEC4 == 0));
1993 	}
1994 
1995 /* To Fix BSOD when final_candidate is 0xff */
1996 /* by sherry 20120321 */
1997 	if (final_candidate < 4) {
1998 		for (i = 0; i < IQK_Matrix_REG_NUM; i++)
1999 			pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[0].Value[0][i] = result[final_candidate][i];
2000 		pDM_Odm->RFCalibrateInfo.IQKMatrixRegSetting[0].bIQKDone = true;
2001 	}
2002 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("\nIQK OK Indexforchannel %d.\n", 0));
2003 
2004 	_PHY_SaveADDARegisters8723B(padapter, IQK_BB_REG_92C, pDM_Odm->RFCalibrateInfo.IQK_BB_backup_recover, 9);
2005 
2006 	/* restore GNT_BT */
2007 	PHY_SetBBReg(pDM_Odm->Adapter, 0x764, bMaskDWord, GNT_BT_default);
2008 	/*  Restore RF Path */
2009 /* 	PHY_SetBBReg(pDM_Odm->Adapter, 0x948, bMaskDWord, Path_SEL_BB); */
2010 /* 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, 0xb0, 0xfffff, Path_SEL_RF); */
2011 
2012 	/* Resotr RX mode table parameter */
2013 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x1);
2014 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_RCK_OS, bRFRegOffsetMask, 0x18000);
2015 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_TXPA_G1, bRFRegOffsetMask, 0x0001f);
2016 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_TXPA_G2, bRFRegOffsetMask, 0xe6177);
2017 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, 0xed, 0x20, 0x1);
2018 	PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, 0x43, bRFRegOffsetMask, 0x300bd);
2019 
2020 	/* set GNT_BT = HW control */
2021 /* 	PHY_SetBBReg(pDM_Odm->Adapter, 0x764, BIT12, 0x0); */
2022 /* 	PHY_SetBBReg(pDM_Odm->Adapter, 0x764, BIT11, 0x0); */
2023 
2024 	if (Is2ant) {
2025 		if (RF_Path == 0x0)	/* S1 */
2026 			ODM_SetIQCbyRFpath(pDM_Odm, 0);
2027 		else	/* S0 */
2028 			ODM_SetIQCbyRFpath(pDM_Odm, 1);
2029 	}
2030 
2031 	pDM_Odm->RFCalibrateInfo.bIQKInProgress = false;
2032 
2033 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("IQK finished\n"));
2034 	ProgressingTime = jiffies_to_msecs(jiffies - StartTime);
2035 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("IQK ProgressingTime = %d\n", ProgressingTime));
2036 
2037 
2038 }
2039 
2040 
2041 void PHY_LCCalibrate_8723B(PDM_ODM_T pDM_Odm)
2042 {
2043 	bool		bSingleTone = false, bCarrierSuppression = false;
2044 	u32 		timeout = 2000, timecount = 0;
2045 	u32 		StartTime;
2046 	s32			ProgressingTime;
2047 
2048 #if DISABLE_BB_RF
2049 	return;
2050 #endif
2051 
2052 	if (!(pDM_Odm->SupportAbility & ODM_RF_CALIBRATION))
2053 		return;
2054 
2055 	/*  20120213<Kordan> Turn on when continuous Tx to pass lab testing. (required by Edlu) */
2056 	if (bSingleTone || bCarrierSuppression)
2057 		return;
2058 
2059 	StartTime = jiffies;
2060 	while (*(pDM_Odm->pbScanInProcess) && timecount < timeout) {
2061 		mdelay(50);
2062 		timecount += 50;
2063 	}
2064 
2065 	pDM_Odm->RFCalibrateInfo.bLCKInProgress = true;
2066 
2067 
2068 	phy_LCCalibrate_8723B(pDM_Odm, false);
2069 
2070 
2071 	pDM_Odm->RFCalibrateInfo.bLCKInProgress = false;
2072 
2073 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("LCK:Finish!!!interface %d\n", pDM_Odm->InterfaceIndex));
2074 	ProgressingTime = jiffies_to_msecs(jiffies - StartTime);
2075 	ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD,  ("LCK ProgressingTime = %d\n", ProgressingTime));
2076 }
2077