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