1 /******************************************************************************
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 ******************************************************************************/
20 //============================================================
23 // This file is for 92CE/92CU dynamic mechanism only
26 //============================================================
28 //============================================================
30 //============================================================
32 #include "odm_precomp.h"
34 #define DPK_DELTA_MAPPING_NUM 13
35 #define index_mapping_HP_NUM 15
38 odm_TXPowerTrackingCallback_ThermalMeter_92C(
41 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
42 struct dm_priv *pdmpriv = &pHalData->dmpriv;
43 u8 ThermalValue = 0, delta, delta_LCK, delta_IQK, delta_HP, TimeOut = 100;
44 int ele_A, ele_D, TempCCk, X, value32;
46 s8 OFDM_index[2], CCK_index = 0, OFDM_index_old[2], CCK_index_old = 0;
48 bool is2T = IS_92C_SERIAL(pHalData->VersionID);
51 PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx);
52 u8 *TxPwrLevel = pMptCtx->TxPwrLevel;
54 u8 OFDM_min_index = 6, rf; //OFDM BB Swing should be less than +3.0dB, which is required by Arthur
55 u8 ThermalValue_HP_count = 0;
56 u32 ThermalValue_HP = 0;
57 s32 index_mapping_HP[index_mapping_HP_NUM] = {
64 pdmpriv->TXPowerTrackingCallbackCnt++; //cosa add for debug
65 pdmpriv->bTXPowerTrackingInit = true;
67 if (pHalData->CurrentChannel == 14 && !pdmpriv->bCCKinCH14)
68 pdmpriv->bCCKinCH14 = true;
69 else if (pHalData->CurrentChannel != 14 && pdmpriv->bCCKinCH14)
70 pdmpriv->bCCKinCH14 = false;
72 ThermalValue = (u8)PHY_QueryRFReg(Adapter, RF_PATH_A, RF_T_METER, 0x1f); // 0x24: RF Reg[4:0]
74 rtl8192c_PHY_APCalibrate(Adapter, (ThermalValue - pHalData->EEPROMThermalMeter));
83 //Query OFDM path A default setting
84 ele_D = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord)&bMaskOFDM_D;
85 for (i=0; i<OFDM_TABLE_SIZE_92C; i++) //find the index
87 if (ele_D == (OFDMSwingTable[i]&bMaskOFDM_D))
89 OFDM_index_old[0] = (u8)i;
94 //Query OFDM path B default setting
97 ele_D = PHY_QueryBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord)&bMaskOFDM_D;
98 for (i=0; i<OFDM_TABLE_SIZE_92C; i++) //find the index
100 if (ele_D == (OFDMSwingTable[i]&bMaskOFDM_D))
102 OFDM_index_old[1] = (u8)i;
103 //DBG_8192C("Initial pathB ele_D reg0x%x = 0x%x, OFDM_index=0x%x\n",rOFDM0_XBTxIQImbalance, ele_D, OFDM_index_old[1]);
109 //Query CCK default setting From 0xa24
110 TempCCk = PHY_QueryBBReg(Adapter, rCCK0_TxFilter2, bMaskDWord)&bMaskCCK;
111 for (i=0 ; i<CCK_TABLE_SIZE ; i++)
113 if (pdmpriv->bCCKinCH14)
115 if (_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch14[i][2], 4)==true)
117 CCK_index_old =(u8)i;
118 //DBG_8192C("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch 14 %d\n", rCCK0_TxFilter2, TempCCk, CCK_index_old, pdmpriv->bCCKinCH14);
124 if (_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch1_Ch13[i][2], 4)==true)
126 CCK_index_old =(u8)i;
127 //DBG_8192C("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch14 %d\n", rCCK0_TxFilter2, TempCCk, CCK_index_old, pdmpriv->bCCKinCH14);
133 if (!pdmpriv->ThermalValue)
135 pdmpriv->ThermalValue = pHalData->EEPROMThermalMeter;
136 pdmpriv->ThermalValue_LCK = ThermalValue;
137 pdmpriv->ThermalValue_IQK = ThermalValue;
138 pdmpriv->ThermalValue_DPK = pHalData->EEPROMThermalMeter;
140 for (i = 0; i < rf; i++)
141 pdmpriv->OFDM_index_HP[i] = pdmpriv->OFDM_index[i] = OFDM_index_old[i];
142 pdmpriv->CCK_index_HP = pdmpriv->CCK_index = CCK_index_old;
145 if (pHalData->BoardType == BOARD_USB_High_PA)
147 pdmpriv->ThermalValue_HP[pdmpriv->ThermalValue_HP_index] = ThermalValue;
148 pdmpriv->ThermalValue_HP_index++;
149 if (pdmpriv->ThermalValue_HP_index == HP_THERMAL_NUM)
150 pdmpriv->ThermalValue_HP_index = 0;
152 for (i = 0; i < HP_THERMAL_NUM; i++)
154 if (pdmpriv->ThermalValue_HP[i])
156 ThermalValue_HP += pdmpriv->ThermalValue_HP[i];
157 ThermalValue_HP_count++;
161 if (ThermalValue_HP_count)
162 ThermalValue = (u8)(ThermalValue_HP / ThermalValue_HP_count);
166 delta = (ThermalValue > pdmpriv->ThermalValue)?(ThermalValue - pdmpriv->ThermalValue):(pdmpriv->ThermalValue - ThermalValue);
167 if (pHalData->BoardType == BOARD_USB_High_PA) {
168 if (pdmpriv->bDoneTxpower)
169 delta_HP = (ThermalValue > pdmpriv->ThermalValue)?(ThermalValue - pdmpriv->ThermalValue):(pdmpriv->ThermalValue - ThermalValue);
171 delta_HP = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue);
175 delta_LCK = (ThermalValue > pdmpriv->ThermalValue_LCK)?(ThermalValue - pdmpriv->ThermalValue_LCK):(pdmpriv->ThermalValue_LCK - ThermalValue);
176 delta_IQK = (ThermalValue > pdmpriv->ThermalValue_IQK)?(ThermalValue - pdmpriv->ThermalValue_IQK):(pdmpriv->ThermalValue_IQK - ThermalValue);
179 pdmpriv->ThermalValue_LCK = ThermalValue;
180 rtl8192c_PHY_LCCalibrate(Adapter);
183 if ((delta > 0 || delta_HP > 0) && pdmpriv->TxPowerTrackControl) {
184 if (pHalData->BoardType == BOARD_USB_High_PA) {
185 pdmpriv->bDoneTxpower = true;
186 delta_HP = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue);
188 if (delta_HP > index_mapping_HP_NUM-1)
189 index_HP = index_mapping_HP[index_mapping_HP_NUM-1];
191 index_HP = index_mapping_HP[delta_HP];
193 if (ThermalValue > pHalData->EEPROMThermalMeter) //set larger Tx power
195 for (i = 0; i < rf; i++)
196 OFDM_index[i] = pdmpriv->OFDM_index_HP[i] - index_HP;
197 CCK_index = pdmpriv->CCK_index_HP -index_HP;
199 for (i = 0; i < rf; i++)
200 OFDM_index[i] = pdmpriv->OFDM_index_HP[i] + index_HP;
201 CCK_index = pdmpriv->CCK_index_HP + index_HP;
204 delta_HP = (ThermalValue > pdmpriv->ThermalValue)?(ThermalValue - pdmpriv->ThermalValue):(pdmpriv->ThermalValue - ThermalValue);
207 if (ThermalValue > pdmpriv->ThermalValue) {
208 for (i = 0; i < rf; i++)
209 pdmpriv->OFDM_index[i] -= delta;
210 pdmpriv->CCK_index -= delta;
212 for (i = 0; i < rf; i++)
213 pdmpriv->OFDM_index[i] += delta;
214 pdmpriv->CCK_index += delta;
220 if (pHalData->BoardType != BOARD_USB_High_PA) {
221 if (ThermalValue > pHalData->EEPROMThermalMeter) {
222 for (i = 0; i < rf; i++)
223 OFDM_index[i] = pdmpriv->OFDM_index[i]+1;
224 CCK_index = pdmpriv->CCK_index+1;
226 for (i = 0; i < rf; i++)
227 OFDM_index[i] = pdmpriv->OFDM_index[i];
228 CCK_index = pdmpriv->CCK_index;
232 for (i = 0; i < rf; i++)
234 if (TxPwrLevel[i] >=0 && TxPwrLevel[i] <=26)
236 if (ThermalValue > pHalData->EEPROMThermalMeter)
243 else if (delta > 5 && ThermalValue < pHalData->EEPROMThermalMeter)
248 else if (TxPwrLevel[i] >= 27 && TxPwrLevel[i] <= 32 && ThermalValue > pHalData->EEPROMThermalMeter)
255 else if (TxPwrLevel[i] >= 32 && TxPwrLevel[i] <= 38 && ThermalValue > pHalData->EEPROMThermalMeter && delta > 5)
262 if (TxPwrLevel[i] >=0 && TxPwrLevel[i] <=26)
264 if (ThermalValue > pHalData->EEPROMThermalMeter)
271 else if (delta > 5 && ThermalValue < pHalData->EEPROMThermalMeter)
276 else if (TxPwrLevel[i] >= 27 && TxPwrLevel[i] <= 32 && ThermalValue > pHalData->EEPROMThermalMeter)
283 else if (TxPwrLevel[i] >= 32 && TxPwrLevel[i] <= 38 && ThermalValue > pHalData->EEPROMThermalMeter && delta > 5)
291 for (i = 0; i < rf; i++)
293 if (OFDM_index[i] > (OFDM_TABLE_SIZE_92C-1))
294 OFDM_index[i] = (OFDM_TABLE_SIZE_92C-1);
295 else if (OFDM_index[i] < OFDM_min_index)
296 OFDM_index[i] = OFDM_min_index;
299 if (CCK_index > (CCK_TABLE_SIZE-1))
300 CCK_index = (CCK_TABLE_SIZE-1);
301 else if (CCK_index < 0)
306 DBG_8192C("new OFDM_A_index=0x%x, OFDM_B_index=0x%x, CCK_index=0x%x\n",
307 OFDM_index[0], OFDM_index[1], CCK_index);
311 DBG_8192C("new OFDM_A_index=0x%x, CCK_index=0x%x\n",
312 OFDM_index[0], CCK_index);
316 if (pdmpriv->TxPowerTrackControl && (delta != 0 || delta_HP != 0))
318 //Adujst OFDM Ant_A according to IQK result
319 ele_D = (OFDMSwingTable[OFDM_index[0]] & 0xFFC00000)>>22;
325 if ((X & 0x00000200) != 0)
327 ele_A = ((X * ele_D)>>8)&0x000003FF;
329 //new element C = element D x Y
330 if ((Y & 0x00000200) != 0)
332 ele_C = ((Y * ele_D)>>8)&0x000003FF;
334 //wirte new elements A, C, D to regC80 and regC94, element B is always 0
335 value32 = (ele_D<<22)|((ele_C&0x3F)<<16)|ele_A;
336 PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, value32);
338 value32 = (ele_C&0x000003C0)>>6;
339 PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, value32);
341 value32 = ((X * ele_D)>>7)&0x01;
342 PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT31, value32);
344 value32 = ((Y * ele_D)>>7)&0x01;
345 PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT29, value32);
350 PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, OFDMSwingTable[OFDM_index[0]]);
351 PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, 0x00);
352 PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT31|BIT29, 0x00);
355 //RTPRINT(FINIT, INIT_IQK, ("TxPwrTracking path A: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x\n", X, Y, ele_A, ele_C, ele_D));
357 //Adjust CCK according to IQK result
358 if (!pdmpriv->bCCKinCH14) {
359 rtw_write8(Adapter, 0xa22, CCKSwingTable_Ch1_Ch13[CCK_index][0]);
360 rtw_write8(Adapter, 0xa23, CCKSwingTable_Ch1_Ch13[CCK_index][1]);
361 rtw_write8(Adapter, 0xa24, CCKSwingTable_Ch1_Ch13[CCK_index][2]);
362 rtw_write8(Adapter, 0xa25, CCKSwingTable_Ch1_Ch13[CCK_index][3]);
363 rtw_write8(Adapter, 0xa26, CCKSwingTable_Ch1_Ch13[CCK_index][4]);
364 rtw_write8(Adapter, 0xa27, CCKSwingTable_Ch1_Ch13[CCK_index][5]);
365 rtw_write8(Adapter, 0xa28, CCKSwingTable_Ch1_Ch13[CCK_index][6]);
366 rtw_write8(Adapter, 0xa29, CCKSwingTable_Ch1_Ch13[CCK_index][7]);
369 rtw_write8(Adapter, 0xa22, CCKSwingTable_Ch14[CCK_index][0]);
370 rtw_write8(Adapter, 0xa23, CCKSwingTable_Ch14[CCK_index][1]);
371 rtw_write8(Adapter, 0xa24, CCKSwingTable_Ch14[CCK_index][2]);
372 rtw_write8(Adapter, 0xa25, CCKSwingTable_Ch14[CCK_index][3]);
373 rtw_write8(Adapter, 0xa26, CCKSwingTable_Ch14[CCK_index][4]);
374 rtw_write8(Adapter, 0xa27, CCKSwingTable_Ch14[CCK_index][5]);
375 rtw_write8(Adapter, 0xa28, CCKSwingTable_Ch14[CCK_index][6]);
376 rtw_write8(Adapter, 0xa29, CCKSwingTable_Ch14[CCK_index][7]);
381 ele_D = (OFDMSwingTable[(u8)OFDM_index[1]] & 0xFFC00000)>>22;
383 //new element A = element D x X
388 if ((X & 0x00000200) != 0) //consider minus
390 ele_A = ((X * ele_D)>>8)&0x000003FF;
392 //new element C = element D x Y
393 if ((Y & 0x00000200) != 0)
395 ele_C = ((Y * ele_D)>>8)&0x00003FF;
397 //wirte new elements A, C, D to regC88 and regC9C, element B is always 0
398 value32=(ele_D<<22)|((ele_C&0x3F)<<16) |ele_A;
399 PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, value32);
401 value32 = (ele_C&0x000003C0)>>6;
402 PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, value32);
404 value32 = ((X * ele_D)>>7)&0x01;
405 PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT27, value32);
407 value32 = ((Y * ele_D)>>7)&0x01;
408 PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT25, value32);
412 PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, OFDMSwingTable[OFDM_index[1]]);
413 PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, 0x00);
414 PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT27|BIT25, 0x00);
417 //DBG_8192C("TxPwrTracking path B: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x\n", X, Y, ele_A, ele_C, ele_D);
421 DBG_8192C("TxPwrTracking 0xc80 = 0x%x, 0xc94 = 0x%x RF 0x24 = 0x%x\n", \
422 PHY_QueryBBReg(Adapter, 0xc80, bMaskDWord),\
423 PHY_QueryBBReg(Adapter, 0xc94, bMaskDWord), \
424 PHY_QueryRFReg(Adapter, RF_PATH_A, 0x24, bMaskDWord));
434 pdmpriv->ThermalValue_IQK = ThermalValue;
435 rtl8192c_PHY_IQCalibrate(Adapter,false);
438 //update thermal meter value
439 if (pdmpriv->TxPowerTrackControl)
440 pdmpriv->ThermalValue = ThermalValue;
444 //DBG_8192C("<===dm_TXPowerTrackingCallback_ThermalMeter_92C\n");
446 pdmpriv->TXPowercount = 0;
452 odm_InitializeTXPowerTracking_ThermalMeter(
455 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
456 struct dm_priv *pdmpriv = &pHalData->dmpriv;
458 //pMgntInfo->bTXPowerTracking = true;
459 pdmpriv->TXPowercount = 0;
460 pdmpriv->bTXPowerTrackingInit = false;
461 pdmpriv->ThermalValue = 0;
463 #if (MP_DRIVER != 1) //for mp driver, turn off txpwrtracking as default
464 pdmpriv->TxPowerTrackControl = true;
467 MSG_8192C("pdmpriv->TxPowerTrackControl = %d\n", pdmpriv->TxPowerTrackControl);
472 ODM_InitializeTXPowerTracking(
475 odm_InitializeTXPowerTracking_ThermalMeter(Adapter);
480 // - Dispatch TxPower Tracking direct call ONLY for 92s.
481 // - We shall NOT schedule Workitem within PASSIVE LEVEL, which will cause system resource
482 // leakage under some platform.
485 // PASSIVE_LEVEL when this routine is called.
487 // Added by Roger, 2009.06.18.
490 ODM_TXPowerTracking92CDirectCall(
493 odm_TXPowerTrackingCallback_ThermalMeter_92C(Adapter);
497 odm_CheckTXPowerTracking_ThermalMeter(
500 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
501 struct dm_priv *pdmpriv = &pHalData->dmpriv;
502 DM_ODM_T *podmpriv = &pHalData->odmpriv;
503 //u1Byte TxPowerCheckCnt = 5; //10 sec
505 //if (!pMgntInfo->bTXPowerTracking /*|| (!pdmpriv->TxPowerTrackControl && pdmpriv->bAPKdone)*/)
506 if (!(podmpriv->SupportAbility & ODM_RF_TX_PWR_TRACK))
511 if (!pdmpriv->TM_Trigger) //at least delay 1 sec
513 //pHalData->TxPowerCheckCnt++; //cosa add for debug
514 PHY_SetRFReg(Adapter, RF_PATH_A, RF_T_METER, bRFRegOffsetMask, 0x60);
515 //DBG_8192C("Trigger 92C Thermal Meter!!\n");
517 pdmpriv->TM_Trigger = 1;
523 //DBG_8192C("Schedule TxPowerTracking direct call!!\n");
524 ODM_TXPowerTracking92CDirectCall(Adapter); //Using direct call is instead, added by Roger, 2009.06.18.
525 pdmpriv->TM_Trigger = 0;
532 rtl8192c_odm_CheckTXPowerTracking(
535 odm_CheckTXPowerTracking_ThermalMeter(Adapter);
540 #ifdef CONFIG_ANTENNA_DIVERSITY
541 // Add new function to reset the state of antenna diversity before link.
543 void odm_SwAntDivResetBeforeLink8192C(IN PDM_ODM_T pDM_Odm)
545 SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
547 pDM_SWAT_Table->SWAS_NoLink_State = 0;
550 // Compare RSSI for deciding antenna
551 void odm_AntDivCompare8192C(PADAPTER Adapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src)
553 //PADAPTER Adapter = pDM_Odm->Adapter ;
555 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
556 PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
557 if ((0 != pHalData->AntDivCfg) && (!IS_92C_SERIAL(pHalData->VersionID)) )
559 //DBG_8192C("update_network=> orgRSSI(%d)(%d),newRSSI(%d)(%d)\n",dst->Rssi,query_rx_pwr_percentage(dst->Rssi),
560 // src->Rssi,query_rx_pwr_percentage(src->Rssi));
561 //select optimum_antenna for before linked =>For antenna diversity
562 if (dst->Rssi >= src->Rssi )//keep org parameter
564 src->Rssi = dst->Rssi;
565 src->PhyInfo.Optimum_antenna = dst->PhyInfo.Optimum_antenna;
570 // Add new function to reset the state of antenna diversity before link.
571 u8 odm_AntDivBeforeLink8192C(PADAPTER Adapter )
574 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
575 PDM_ODM_T pDM_Odm =&pHalData->odmpriv;
576 SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
577 struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
579 // Condition that does not need to use antenna diversity.
580 if (IS_92C_SERIAL(pHalData->VersionID) ||(pHalData->AntDivCfg==0))
582 //DBG_8192C("odm_AntDivBeforeLink8192C(): No AntDiv Mechanism.\n");
586 if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
588 pDM_SWAT_Table->SWAS_NoLink_State = 0;
591 // Since driver is going to set BB register, it shall check if there is another thread controlling BB/RF.
593 if (pHalData->eRFPowerState!=eRfOn || pMgntInfo->RFChangeInProgress || pMgntInfo->bMediaConnect)
597 ODM_RT_TRACE(pDM_Odm,COMP_SWAS, DBG_LOUD,
598 ("SwAntDivCheckBeforeLink8192C(): RFChangeInProgress(%x), eRFPowerState(%x)\n",
599 pMgntInfo->RFChangeInProgress,
600 pHalData->eRFPowerState));
602 pDM_SWAT_Table->SWAS_NoLink_State = 0;
608 if (pDM_SWAT_Table->SWAS_NoLink_State == 0) {
610 pDM_SWAT_Table->SWAS_NoLink_State = 1;
611 pDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==Antenna_A)?Antenna_B:Antenna_A;
613 //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, pDM_SWAT_Table->CurAntenna);
614 rtw_antenna_select_cmd(Adapter, pDM_SWAT_Table->CurAntenna, false);
615 //DBG_8192C("%s change antenna to ANT_( %s ).....\n",__FUNCTION__, (pDM_SWAT_Table->CurAntenna==Antenna_A)?"A":"B");
620 pDM_SWAT_Table->SWAS_NoLink_State = 0;
629 //-------------------------------------------------------------------------
633 //-------------------------------------------------------------------------
634 #define MAX_TOLERANCE 5
635 #define IQK_DELAY_TIME 1 //ms
637 static u8 //bit0 = 1 => Tx OK, bit1 = 1 => Rx OK
639 IN PADAPTER pAdapter,
643 u32 regEAC, regE94, regE9C, regEA4;
645 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
647 //RTPRINT(FINIT, INIT_IQK, ("Path A IQK!\n"));
650 //RTPRINT(FINIT, INIT_IQK, ("Path-A IQK setting!\n"));
651 PHY_SetBBReg(pAdapter, rTx_IQK_Tone_A, bMaskDWord, 0x10008c1f);
652 PHY_SetBBReg(pAdapter, rRx_IQK_Tone_A, bMaskDWord, 0x10008c1f);
653 PHY_SetBBReg(pAdapter, rTx_IQK_PI_A, bMaskDWord, 0x82140102);
655 PHY_SetBBReg(pAdapter, rRx_IQK_PI_A, bMaskDWord, configPathB ? 0x28160202 :
656 IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID)?0x28160202:0x28160502);
661 PHY_SetBBReg(pAdapter, rTx_IQK_Tone_B, bMaskDWord, 0x10008c22);
662 PHY_SetBBReg(pAdapter, rRx_IQK_Tone_B, bMaskDWord, 0x10008c22);
663 PHY_SetBBReg(pAdapter, rTx_IQK_PI_B, bMaskDWord, 0x82140102);
664 PHY_SetBBReg(pAdapter, rRx_IQK_PI_B, bMaskDWord, 0x28160202);
667 //LO calibration setting
668 //RTPRINT(FINIT, INIT_IQK, ("LO calibration setting!\n"));
669 PHY_SetBBReg(pAdapter, rIQK_AGC_Rsp, bMaskDWord, 0x001028d1);
671 //One shot, path A LOK & IQK
672 //RTPRINT(FINIT, INIT_IQK, ("One shot, path A LOK & IQK!\n"));
673 PHY_SetBBReg(pAdapter, rIQK_AGC_Pts, bMaskDWord, 0xf9000000);
674 PHY_SetBBReg(pAdapter, rIQK_AGC_Pts, bMaskDWord, 0xf8000000);
677 //RTPRINT(FINIT, INIT_IQK, ("Delay %d ms for One shot, path A LOK & IQK.\n", IQK_DELAY_TIME));
678 rtw_udelay_os(IQK_DELAY_TIME*1000);//PlatformStallExecution(IQK_DELAY_TIME*1000);
681 regEAC = PHY_QueryBBReg(pAdapter, rRx_Power_After_IQK_A_2, bMaskDWord);
682 //RTPRINT(FINIT, INIT_IQK, ("0xeac = 0x%x\n", regEAC));
683 regE94 = PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_A, bMaskDWord);
684 //RTPRINT(FINIT, INIT_IQK, ("0xe94 = 0x%x\n", regE94));
685 regE9C= PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_A, bMaskDWord);
686 //RTPRINT(FINIT, INIT_IQK, ("0xe9c = 0x%x\n", regE9C));
687 regEA4= PHY_QueryBBReg(pAdapter, rRx_Power_Before_IQK_A_2, bMaskDWord);
688 //RTPRINT(FINIT, INIT_IQK, ("0xea4 = 0x%x\n", regEA4));
690 if (!(regEAC & BIT28) &&
691 (((regE94 & 0x03FF0000)>>16) != 0x142) &&
692 (((regE9C & 0x03FF0000)>>16) != 0x42) )
694 else //if Tx not OK, ignore Rx
697 if (!(regEAC & BIT27) && //if Tx is OK, check whether Rx is OK
698 (((regEA4 & 0x03FF0000)>>16) != 0x132) &&
699 (((regEAC & 0x03FF0000)>>16) != 0x36))
702 DBG_8192C("Path A Rx IQK fail!!\n");
709 static u8 //bit0 = 1 => Tx OK, bit1 = 1 => Rx OK
714 u32 regEAC, regEB4, regEBC, regEC4, regECC;
716 //RTPRINT(FINIT, INIT_IQK, ("Path B IQK!\n"));
718 //One shot, path B LOK & IQK
719 //RTPRINT(FINIT, INIT_IQK, ("One shot, path A LOK & IQK!\n"));
720 PHY_SetBBReg(pAdapter, rIQK_AGC_Cont, bMaskDWord, 0x00000002);
721 PHY_SetBBReg(pAdapter, rIQK_AGC_Cont, bMaskDWord, 0x00000000);
724 //RTPRINT(FINIT, INIT_IQK, ("Delay %d ms for One shot, path B LOK & IQK.\n", IQK_DELAY_TIME));
725 rtw_udelay_os(IQK_DELAY_TIME*1000);//PlatformStallExecution(IQK_DELAY_TIME*1000);
728 regEAC = PHY_QueryBBReg(pAdapter, rRx_Power_After_IQK_A_2, bMaskDWord);
729 //RTPRINT(FINIT, INIT_IQK, ("0xeac = 0x%x\n", regEAC));
730 regEB4 = PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_B, bMaskDWord);
731 //RTPRINT(FINIT, INIT_IQK, ("0xeb4 = 0x%x\n", regEB4));
732 regEBC= PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_B, bMaskDWord);
733 //RTPRINT(FINIT, INIT_IQK, ("0xebc = 0x%x\n", regEBC));
734 regEC4= PHY_QueryBBReg(pAdapter, rRx_Power_Before_IQK_B_2, bMaskDWord);
735 //RTPRINT(FINIT, INIT_IQK, ("0xec4 = 0x%x\n", regEC4));
736 regECC= PHY_QueryBBReg(pAdapter, rRx_Power_After_IQK_B_2, bMaskDWord);
737 //RTPRINT(FINIT, INIT_IQK, ("0xecc = 0x%x\n", regECC));
739 if (!(regEAC & BIT31) &&
740 (((regEB4 & 0x03FF0000)>>16) != 0x142) &&
741 (((regEBC & 0x03FF0000)>>16) != 0x42))
746 if (!(regEAC & BIT30) &&
747 (((regEC4 & 0x03FF0000)>>16) != 0x132) &&
748 (((regECC & 0x03FF0000)>>16) != 0x36))
751 DBG_8192C("Path B Rx IQK fail!!\n");
759 _PHY_PathAFillIQKMatrix(
760 IN PADAPTER pAdapter,
763 IN u8 final_candidate,
767 u32 Oldval_0, X, TX0_A, reg;
770 DBG_8192C("Path A IQ Calibration %s !\n",(bIQKOK)?"Success":"Failed");
772 if (final_candidate == 0xFF)
776 Oldval_0 = (PHY_QueryBBReg(pAdapter, rOFDM0_XATxIQImbalance, bMaskDWord) >> 22) & 0x3FF;
778 X = result[final_candidate][0];
779 if ((X & 0x00000200) != 0)
781 TX0_A = (X * Oldval_0) >> 8;
782 //RTPRINT(FINIT, INIT_IQK, ("X = 0x%lx, TX0_A = 0x%lx, Oldval_0 0x%lx\n", X, TX0_A, Oldval_0));
783 PHY_SetBBReg(pAdapter, rOFDM0_XATxIQImbalance, 0x3FF, TX0_A);
784 PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(31), ((X* Oldval_0>>7) & 0x1));
786 Y = result[final_candidate][1];
787 if ((Y & 0x00000200) != 0)
789 TX0_C = (Y * Oldval_0) >> 8;
790 //RTPRINT(FINIT, INIT_IQK, ("Y = 0x%lx, TX = 0x%lx\n", Y, TX0_C));
791 PHY_SetBBReg(pAdapter, rOFDM0_XCTxAFE, 0xF0000000, ((TX0_C&0x3C0)>>6));
792 PHY_SetBBReg(pAdapter, rOFDM0_XATxIQImbalance, 0x003F0000, (TX0_C&0x3F));
793 PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(29), ((Y* Oldval_0>>7) & 0x1));
797 DBG_8192C("_PHY_PathAFillIQKMatrix only Tx OK\n");
801 reg = result[final_candidate][2];
802 PHY_SetBBReg(pAdapter, rOFDM0_XARxIQImbalance, 0x3FF, reg);
804 reg = result[final_candidate][3] & 0x3F;
805 PHY_SetBBReg(pAdapter, rOFDM0_XARxIQImbalance, 0xFC00, reg);
807 reg = (result[final_candidate][3] >> 6) & 0xF;
808 PHY_SetBBReg(pAdapter, rOFDM0_RxIQExtAnta, 0xF0000000, reg);
813 _PHY_PathBFillIQKMatrix(
814 IN PADAPTER pAdapter,
817 IN u8 final_candidate,
818 IN bool bTxOnly //do Tx only
821 u32 Oldval_1, X, TX1_A, reg;
824 DBG_8192C("Path B IQ Calibration %s !\n",(bIQKOK)?"Success":"Failed");
826 if (final_candidate == 0xFF)
830 Oldval_1 = (PHY_QueryBBReg(pAdapter, rOFDM0_XBTxIQImbalance, bMaskDWord) >> 22) & 0x3FF;
832 X = result[final_candidate][4];
833 if ((X & 0x00000200) != 0)
835 TX1_A = (X * Oldval_1) >> 8;
836 //RTPRINT(FINIT, INIT_IQK, ("X = 0x%lx, TX1_A = 0x%lx\n", X, TX1_A));
837 PHY_SetBBReg(pAdapter, rOFDM0_XBTxIQImbalance, 0x3FF, TX1_A);
838 PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(27), ((X* Oldval_1>>7) & 0x1));
840 Y = result[final_candidate][5];
841 if ((Y & 0x00000200) != 0)
843 TX1_C = (Y * Oldval_1) >> 8;
844 //RTPRINT(FINIT, INIT_IQK, ("Y = 0x%lx, TX1_C = 0x%lx\n", Y, TX1_C));
845 PHY_SetBBReg(pAdapter, rOFDM0_XDTxAFE, 0xF0000000, ((TX1_C&0x3C0)>>6));
846 PHY_SetBBReg(pAdapter, rOFDM0_XBTxIQImbalance, 0x003F0000, (TX1_C&0x3F));
847 PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(25), ((Y* Oldval_1>>7) & 0x1));
852 reg = result[final_candidate][6];
853 PHY_SetBBReg(pAdapter, rOFDM0_XBRxIQImbalance, 0x3FF, reg);
855 reg = result[final_candidate][7] & 0x3F;
856 PHY_SetBBReg(pAdapter, rOFDM0_XBRxIQImbalance, 0xFC00, reg);
858 reg = (result[final_candidate][7] >> 6) & 0xF;
859 PHY_SetBBReg(pAdapter, rOFDM0_AGCRSSITable, 0x0000F000, reg);
864 _PHY_SaveADDARegisters(
865 IN PADAPTER pAdapter,
873 //RTPRINT(FINIT, INIT_IQK, ("Save ADDA parameters.\n"));
874 for ( i = 0 ; i < RegisterNum ; i++) {
875 ADDABackup[i] = PHY_QueryBBReg(pAdapter, ADDAReg[i], bMaskDWord);
880 _PHY_SaveMACRegisters(
881 IN PADAPTER pAdapter,
888 //RTPRINT(FINIT, INIT_IQK, ("Save MAC parameters.\n"));
889 for ( i = 0 ; i < (IQK_MAC_REG_NUM - 1); i++) {
890 MACBackup[i] =rtw_read8(pAdapter, MACReg[i]);
892 MACBackup[i] = rtw_read32(pAdapter, MACReg[i]);
897 _PHY_ReloadADDARegisters(
898 IN PADAPTER pAdapter,
906 //RTPRINT(FINIT, INIT_IQK, ("Reload ADDA power saving parameters !\n"));
907 for (i = 0 ; i < RegiesterNum ; i++) {
908 PHY_SetBBReg(pAdapter, ADDAReg[i], bMaskDWord, ADDABackup[i]);
913 _PHY_ReloadMACRegisters(
914 IN PADAPTER pAdapter,
921 //RTPRINT(FINIT, INIT_IQK, ("Reload MAC parameters !\n"));
922 for (i = 0 ; i < (IQK_MAC_REG_NUM - 1); i++) {
923 rtw_write8(pAdapter, MACReg[i], (u8)MACBackup[i]);
925 rtw_write32(pAdapter, MACReg[i], MACBackup[i]);
930 IN PADAPTER pAdapter,
939 //RTPRINT(FINIT, INIT_IQK, ("ADDA ON.\n"));
941 pathOn = isPathAOn ? 0x04db25a4 : 0x0b1b25a4;
944 PHY_SetBBReg(pAdapter, ADDAReg[0], bMaskDWord, 0x0b1b25a0);
947 PHY_SetBBReg(pAdapter, ADDAReg[0], bMaskDWord, pathOn);
950 for ( i = 1 ; i < IQK_ADDA_REG_NUM ; i++) {
951 PHY_SetBBReg(pAdapter, ADDAReg[i], bMaskDWord, pathOn);
957 _PHY_MACSettingCalibration(
958 IN PADAPTER pAdapter,
965 //RTPRINT(FINIT, INIT_IQK, ("MAC settings for Calibration.\n"));
967 rtw_write8(pAdapter, MACReg[i], 0x3F);
969 for (i = 1 ; i < (IQK_MAC_REG_NUM - 1); i++) {
970 rtw_write8(pAdapter, MACReg[i], (u8)(MACBackup[i]&(~BIT3)));
972 rtw_write8(pAdapter, MACReg[i], (u8)(MACBackup[i]&(~BIT5)));
981 //RTPRINT(FINIT, INIT_IQK, ("Path-A standby mode!\n"));
983 PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0x0);
984 PHY_SetBBReg(pAdapter, 0x840, bMaskDWord, 0x00010000);
985 PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0x80800000);
990 IN PADAPTER pAdapter,
996 //RTPRINT(FINIT, INIT_IQK, ("BB Switch to %s mode!\n", (PIMode ? "PI" : "SI")));
998 mode = PIMode ? 0x01000100 : 0x01000000;
999 PHY_SetBBReg(pAdapter, 0x820, bMaskDWord, mode);
1000 PHY_SetBBReg(pAdapter, 0x828, bMaskDWord, mode);
1004 return false => do IQK again
1007 _PHY_SimularityCompare(
1008 IN PADAPTER pAdapter,
1014 u32 i, j, diff, SimularityBitMap, bound = 0;
1015 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
1016 u8 final_candidate[2] = {0xFF, 0xFF}; //for path A and path B
1017 bool bResult = true, is2T = IS_92C_SERIAL( pHalData->VersionID);
1024 SimularityBitMap = 0;
1026 for ( i = 0; i < bound; i++ )
1028 diff = (result[c1][i] > result[c2][i]) ? (result[c1][i] - result[c2][i]) : (result[c2][i] - result[c1][i]);
1029 if (diff > MAX_TOLERANCE)
1031 if ((i == 2 || i == 6) && !SimularityBitMap)
1033 if (result[c1][i]+result[c1][i+1] == 0)
1034 final_candidate[(i/4)] = c2;
1035 else if (result[c2][i]+result[c2][i+1] == 0)
1036 final_candidate[(i/4)] = c1;
1038 SimularityBitMap = SimularityBitMap|(1<<i);
1041 SimularityBitMap = SimularityBitMap|(1<<i);
1045 if ( SimularityBitMap == 0)
1047 for ( i = 0; i < (bound/4); i++ )
1049 if (final_candidate[i] != 0xFF)
1051 for ( j = i*4; j < (i+1)*4-2; j++)
1052 result[3][j] = result[final_candidate[i]][j];
1058 else if (!(SimularityBitMap & 0x0F)) //path A OK
1060 for (i = 0; i < 4; i++)
1061 result[3][i] = result[c1][i];
1064 else if (!(SimularityBitMap & 0xF0) && is2T) //path B OK
1066 for (i = 4; i < 8; i++)
1067 result[3][i] = result[c1][i];
1077 IN PADAPTER pAdapter,
1083 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
1084 struct dm_priv *pdmpriv = &pHalData->dmpriv;
1086 u8 PathAOK, PathBOK;
1087 u32 ADDA_REG[IQK_ADDA_REG_NUM] = {
1088 rFPGA0_XCD_SwitchControl, rBlue_Tooth,
1089 rRx_Wait_CCA, rTx_CCK_RFON,
1090 rTx_CCK_BBON, rTx_OFDM_RFON,
1091 rTx_OFDM_BBON, rTx_To_Rx,
1093 rRx_OFDM, rRx_Wait_RIFS,
1094 rRx_TO_Rx, rStandby,
1095 rSleep, rPMPD_ANAEN };
1097 u32 IQK_MAC_REG[IQK_MAC_REG_NUM] = {
1098 REG_TXPAUSE, REG_BCN_CTRL,
1099 REG_BCN_CTRL_1, REG_GPIO_MUXCFG};
1101 u32 IQK_BB_REG_92C[IQK_BB_REG_NUM] = {
1102 rOFDM0_TRxPathEnable, rOFDM0_TRMuxPar,
1103 rFPGA0_XCD_RFInterfaceSW, rConfig_AntA, rConfig_AntB,
1104 rFPGA0_XAB_RFInterfaceSW, rFPGA0_XA_RFInterfaceOE,
1105 rFPGA0_XB_RFInterfaceOE, rFPGA0_RFMOD
1109 const u32 retryCount = 9;
1111 const u32 retryCount = 2;
1114 // Note: IQ calibration must be performed after loading
1115 // PHY_REG.txt , and radio_a, radio_b.txt
1121 bbvalue = PHY_QueryBBReg(pAdapter, rFPGA0_RFMOD, bMaskDWord);
1122 //RTPRINT(FINIT, INIT_IQK, ("PHY_IQCalibrate()==>0x%08lx\n",bbvalue));
1124 //RTPRINT(FINIT, INIT_IQK, ("IQ Calibration for %s\n", (is2T ? "2T2R" : "1T1R")));
1126 // Save ADDA parameters, turn Path A ADDA on
1127 _PHY_SaveADDARegisters(pAdapter, ADDA_REG, pdmpriv->ADDA_backup,IQK_ADDA_REG_NUM);
1128 _PHY_SaveMACRegisters(pAdapter, IQK_MAC_REG, pdmpriv->IQK_MAC_backup);
1129 _PHY_SaveADDARegisters(pAdapter, IQK_BB_REG_92C, pdmpriv->IQK_BB_backup, IQK_BB_REG_NUM);
1131 _PHY_PathADDAOn(pAdapter, ADDA_REG, true, is2T);
1135 pdmpriv->bRfPiEnable = (u8)PHY_QueryBBReg(pAdapter, rFPGA0_XA_HSSIParameter1, BIT(8));
1138 if (!pdmpriv->bRfPiEnable) {
1139 // Switch BB to PI mode to do IQ Calibration.
1140 _PHY_PIModeSwitch(pAdapter, true);
1143 PHY_SetBBReg(pAdapter, rFPGA0_RFMOD, BIT24, 0x00);
1144 PHY_SetBBReg(pAdapter, rOFDM0_TRxPathEnable, bMaskDWord, 0x03a05600);
1145 PHY_SetBBReg(pAdapter, rOFDM0_TRMuxPar, bMaskDWord, 0x000800e4);
1146 PHY_SetBBReg(pAdapter, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, 0x22204000);
1147 PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT10, 0x01);
1148 PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT26, 0x01);
1149 PHY_SetBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, BIT10, 0x00);
1150 PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT10, 0x00);
1154 PHY_SetBBReg(pAdapter, rFPGA0_XA_LSSIParameter, bMaskDWord, 0x00010000);
1155 PHY_SetBBReg(pAdapter, rFPGA0_XB_LSSIParameter, bMaskDWord, 0x00010000);
1159 _PHY_MACSettingCalibration(pAdapter, IQK_MAC_REG, pdmpriv->IQK_MAC_backup);
1162 PHY_SetBBReg(pAdapter, rConfig_AntA, bMaskDWord, 0x00080000);
1166 PHY_SetBBReg(pAdapter, rConfig_AntB, bMaskDWord, 0x00080000);
1169 // IQ calibration setting
1170 //RTPRINT(FINIT, INIT_IQK, ("IQK setting!\n"));
1171 PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0x80800000);
1172 PHY_SetBBReg(pAdapter, rTx_IQK, bMaskDWord, 0x01007c00);
1173 PHY_SetBBReg(pAdapter, rRx_IQK, bMaskDWord, 0x01004800);
1175 for (i = 0 ; i < retryCount ; i++) {
1176 PathAOK = _PHY_PathA_IQK(pAdapter, is2T);
1177 if (PathAOK == 0x03) {
1178 DBG_8192C("Path A IQK Success!!\n");
1179 result[t][0] = (PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_A, bMaskDWord)&0x3FF0000)>>16;
1180 result[t][1] = (PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_A, bMaskDWord)&0x3FF0000)>>16;
1181 result[t][2] = (PHY_QueryBBReg(pAdapter, rRx_Power_Before_IQK_A_2, bMaskDWord)&0x3FF0000)>>16;
1182 result[t][3] = (PHY_QueryBBReg(pAdapter, rRx_Power_After_IQK_A_2, bMaskDWord)&0x3FF0000)>>16;
1185 else if (i == (retryCount-1) && PathAOK == 0x01) //Tx IQK OK
1187 DBG_8192C("Path A IQK Only Tx Success!!\n");
1189 result[t][0] = (PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_A, bMaskDWord)&0x3FF0000)>>16;
1190 result[t][1] = (PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_A, bMaskDWord)&0x3FF0000)>>16;
1194 if (0x00 == PathAOK) {
1195 DBG_8192C("Path A IQK failed!!\n");
1199 _PHY_PathAStandBy(pAdapter);
1201 // Turn Path B ADDA on
1202 _PHY_PathADDAOn(pAdapter, ADDA_REG, false, is2T);
1204 for (i = 0 ; i < retryCount ; i++) {
1205 PathBOK = _PHY_PathB_IQK(pAdapter);
1206 if (PathBOK == 0x03) {
1207 DBG_8192C("Path B IQK Success!!\n");
1208 result[t][4] = (PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_B, bMaskDWord)&0x3FF0000)>>16;
1209 result[t][5] = (PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_B, bMaskDWord)&0x3FF0000)>>16;
1210 result[t][6] = (PHY_QueryBBReg(pAdapter, rRx_Power_Before_IQK_B_2, bMaskDWord)&0x3FF0000)>>16;
1211 result[t][7] = (PHY_QueryBBReg(pAdapter, rRx_Power_After_IQK_B_2, bMaskDWord)&0x3FF0000)>>16;
1214 else if (i == (retryCount - 1) && PathBOK == 0x01) //Tx IQK OK
1216 DBG_8192C("Path B Only Tx IQK Success!!\n");
1217 result[t][4] = (PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_B, bMaskDWord)&0x3FF0000)>>16;
1218 result[t][5] = (PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_B, bMaskDWord)&0x3FF0000)>>16;
1222 if (0x00 == PathBOK) {
1223 DBG_8192C("Path B IQK failed!!\n");
1227 //Back to BB mode, load original value
1228 //RTPRINT(FINIT, INIT_IQK, ("IQK:Back to BB mode, load original value!\n"));
1229 PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0);
1233 if (!pdmpriv->bRfPiEnable) {
1234 // Switch back BB to SI mode after finish IQ Calibration.
1235 _PHY_PIModeSwitch(pAdapter, false);
1238 // Reload ADDA power saving parameters
1239 _PHY_ReloadADDARegisters(pAdapter, ADDA_REG, pdmpriv->ADDA_backup, IQK_ADDA_REG_NUM);
1241 // Reload MAC parameters
1242 _PHY_ReloadMACRegisters(pAdapter, IQK_MAC_REG, pdmpriv->IQK_MAC_backup);
1244 // Reload BB parameters
1245 _PHY_ReloadADDARegisters(pAdapter, IQK_BB_REG_92C, pdmpriv->IQK_BB_backup, IQK_BB_REG_NUM);
1247 // Restore RX initial gain
1248 PHY_SetBBReg(pAdapter, rFPGA0_XA_LSSIParameter, bMaskDWord, 0x00032ed3);
1250 PHY_SetBBReg(pAdapter, rFPGA0_XB_LSSIParameter, bMaskDWord, 0x00032ed3);
1253 //load 0xe30 IQC default value
1254 PHY_SetBBReg(pAdapter, rTx_IQK_Tone_A, bMaskDWord, 0x01008c00);
1255 PHY_SetBBReg(pAdapter, rRx_IQK_Tone_A, bMaskDWord, 0x01008c00);
1258 //RTPRINT(FINIT, INIT_IQK, ("_PHY_IQCalibrate() <==\n"));
1265 IN PADAPTER pAdapter,
1270 u32 RF_Amode = 0, RF_Bmode = 0, LC_Cal;
1272 //Check continuous TX and Packet TX
1273 tmpReg = rtw_read8(pAdapter, 0xd03);
1275 if ((tmpReg&0x70) != 0) //Deal with contisuous TX case
1276 rtw_write8(pAdapter, 0xd03, tmpReg&0x8F); //disable all continuous TX
1277 else // Deal with Packet TX case
1278 rtw_write8(pAdapter, REG_TXPAUSE, 0xFF); // block all queues
1280 if ((tmpReg&0x70) != 0)
1282 //1. Read original RF mode
1284 RF_Amode = PHY_QueryRFReg(pAdapter, RF_PATH_A, RF_AC, bMask12Bits);
1288 RF_Bmode = PHY_QueryRFReg(pAdapter, RF_PATH_B, RF_AC, bMask12Bits);
1290 //2. Set RF mode = standby mode
1292 PHY_SetRFReg(pAdapter, RF_PATH_A, RF_AC, bMask12Bits, (RF_Amode&0x8FFFF)|0x10000);
1296 PHY_SetRFReg(pAdapter, RF_PATH_B, RF_AC, bMask12Bits, (RF_Bmode&0x8FFFF)|0x10000);
1300 LC_Cal = PHY_QueryRFReg(pAdapter, RF_PATH_A, RF_CHNLBW, bMask12Bits);
1302 //4. Set LC calibration begin
1303 PHY_SetRFReg(pAdapter, RF_PATH_A, RF_CHNLBW, bMask12Bits, LC_Cal|0x08000);
1305 #ifdef CONFIG_LONG_DELAY_ISSUE
1311 //Restore original situation
1312 if ((tmpReg&0x70) != 0) //Deal with contisuous TX case
1315 rtw_write8(pAdapter, 0xd03, tmpReg);
1316 PHY_SetRFReg(pAdapter, RF_PATH_A, RF_AC, bMask12Bits, RF_Amode);
1320 PHY_SetRFReg(pAdapter, RF_PATH_B, RF_AC, bMask12Bits, RF_Bmode);
1322 else // Deal with Packet TX case
1324 rtw_write8(pAdapter, REG_TXPAUSE, 0x00);
1330 //Analog Pre-distortion calibration
1331 #define APK_BB_REG_NUM 8
1332 #define APK_CURVE_REG_NUM 4
1337 IN PADAPTER pAdapter,
1342 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
1343 struct dm_priv *pdmpriv = &pHalData->dmpriv;
1346 u32 tmpReg, index, offset, i, apkbound;
1347 u8 path, pathbound = PATH_NUM;
1348 u32 BB_backup[APK_BB_REG_NUM];
1349 u32 BB_REG[APK_BB_REG_NUM] = {
1350 rFPGA1_TxBlock, rOFDM0_TRxPathEnable,
1351 rFPGA0_RFMOD, rOFDM0_TRMuxPar,
1352 rFPGA0_XCD_RFInterfaceSW, rFPGA0_XAB_RFInterfaceSW,
1353 rFPGA0_XA_RFInterfaceOE, rFPGA0_XB_RFInterfaceOE };
1354 u32 BB_AP_MODE[APK_BB_REG_NUM] = {
1355 0x00000020, 0x00a05430, 0x02040000,
1356 0x000800e4, 0x00204000 };
1357 u32 BB_normal_AP_MODE[APK_BB_REG_NUM] = {
1358 0x00000020, 0x00a05430, 0x02040000,
1359 0x000800e4, 0x22204000 };
1361 u32 AFE_backup[IQK_ADDA_REG_NUM];
1362 u32 AFE_REG[IQK_ADDA_REG_NUM] = {
1363 rFPGA0_XCD_SwitchControl, rBlue_Tooth,
1364 rRx_Wait_CCA, rTx_CCK_RFON,
1365 rTx_CCK_BBON, rTx_OFDM_RFON,
1366 rTx_OFDM_BBON, rTx_To_Rx,
1368 rRx_OFDM, rRx_Wait_RIFS,
1369 rRx_TO_Rx, rStandby,
1370 rSleep, rPMPD_ANAEN };
1372 u32 MAC_backup[IQK_MAC_REG_NUM];
1373 u32 MAC_REG[IQK_MAC_REG_NUM] = {
1374 REG_TXPAUSE, REG_BCN_CTRL,
1375 REG_BCN_CTRL_1, REG_GPIO_MUXCFG};
1377 u32 APK_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = {
1378 {0x0852c, 0x1852c, 0x5852c, 0x1852c, 0x5852c},
1379 {0x2852e, 0x0852e, 0x3852e, 0x0852e, 0x0852e}
1382 u32 APK_normal_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = {
1383 {0x0852c, 0x0a52c, 0x3a52c, 0x5a52c, 0x5a52c}, //path settings equal to path b settings
1384 {0x0852c, 0x0a52c, 0x5a52c, 0x5a52c, 0x5a52c}
1387 u32 APK_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = {
1388 {0x52019, 0x52014, 0x52013, 0x5200f, 0x5208d},
1389 {0x5201a, 0x52019, 0x52016, 0x52033, 0x52050}
1392 u32 APK_normal_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = {
1393 {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a}, //path settings equal to path b settings
1394 {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a}
1396 u32 AFE_on_off[PATH_NUM] = {
1397 0x04db25a4, 0x0b1b25a4}; //path A on path B off / path A off path B on
1399 u32 APK_offset[PATH_NUM] = {
1400 rConfig_AntA, rConfig_AntB};
1402 u32 APK_normal_offset[PATH_NUM] = {
1403 rConfig_Pmpd_AntA, rConfig_Pmpd_AntB};
1405 u32 APK_value[PATH_NUM] = {
1406 0x92fc0000, 0x12fc0000};
1408 u32 APK_normal_value[PATH_NUM] = {
1409 0x92680000, 0x12680000};
1411 char APK_delta_mapping[APK_BB_REG_NUM][13] = {
1412 {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},
1413 {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},
1414 {-6, -4, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},
1415 {-1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6},
1416 {-11, -9, -7, -5, -3, -1, 0, 0, 0, 0, 0, 0, 0}
1419 u32 APK_normal_setting_value_1[13] = {
1420 0x01017018, 0xf7ed8f84, 0x1b1a1816, 0x2522201e, 0x322e2b28,
1421 0x433f3a36, 0x5b544e49, 0x7b726a62, 0xa69a8f84, 0xdfcfc0b3,
1422 0x12680000, 0x00880000, 0x00880000
1425 u32 APK_normal_setting_value_2[16] = {
1426 0x01c7021d, 0x01670183, 0x01000123, 0x00bf00e2, 0x008d00a3,
1427 0x0068007b, 0x004d0059, 0x003a0042, 0x002b0031, 0x001f0025,
1428 0x0017001b, 0x00110014, 0x000c000f, 0x0009000b, 0x00070008,
1432 u32 APK_result[PATH_NUM][APK_BB_REG_NUM]; //val_1_1a, val_1_2a, val_2a, val_3a, val_4a
1433 //u32 AP_curve[PATH_NUM][APK_CURVE_REG_NUM];
1435 int BB_offset, delta_V, delta_offset;
1437 #if (MP_DRIVER == 1)
1438 PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx;
1440 pMptCtx->APK_bound[0] = 45;
1441 pMptCtx->APK_bound[1] = 52;
1444 //RTPRINT(FINIT, INIT_IQK, ("==>PHY_APCalibrate() delta %d\n", delta));
1446 //RTPRINT(FINIT, INIT_IQK, ("AP Calibration for %s %s\n", (is2T ? "2T2R" : "1T1R"), (isNormal ? "Normal chip" : "Test chip")));
1451 //2 FOR NORMAL CHIP SETTINGS
1453 // Temporarily do not allow normal driver to do the following settings because these offset
1454 // and value will cause RF internal PA to be unpredictably disabled by HW, such that RF Tx signal
1455 // will disappear after disable/enable card many times on 88CU. RF SD and DD have not find the
1456 // root cause, so we remove these actions temporarily. Added by tynli and SD3 Allen. 2010.05.31.
1457 #if (MP_DRIVER != 1)
1461 //settings adjust for normal chip
1462 for (index = 0; index < PATH_NUM; index ++)
1464 APK_offset[index] = APK_normal_offset[index];
1465 APK_value[index] = APK_normal_value[index];
1466 AFE_on_off[index] = 0x6fdb25a4;
1469 for (index = 0; index < APK_BB_REG_NUM; index ++)
1471 for (path = 0; path < pathbound; path++)
1473 APK_RF_init_value[path][index] = APK_normal_RF_init_value[path][index];
1474 APK_RF_value_0[path][index] = APK_normal_RF_value_0[path][index];
1476 BB_AP_MODE[index] = BB_normal_AP_MODE[index];
1481 //save BB default value
1482 for (index = 0; index < APK_BB_REG_NUM ; index++)
1484 if (index == 0) //skip
1486 BB_backup[index] = PHY_QueryBBReg(pAdapter, BB_REG[index], bMaskDWord);
1489 //save MAC default value
1490 _PHY_SaveMACRegisters(pAdapter, MAC_REG, MAC_backup);
1492 //save AFE default value
1493 _PHY_SaveADDARegisters(pAdapter, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM);
1495 for (path = 0; path < pathbound; path++)
1497 if (path == RF_PATH_A)
1503 for (index = 0; index < 11; index ++)
1505 PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]);
1506 //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord)));
1511 PHY_SetBBReg(pAdapter, rConfig_Pmpd_AntB, bMaskDWord, 0x12680000);
1513 offset = rConfig_AntA;
1514 for (; index < 13; index ++)
1516 PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]);
1517 //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord)));
1523 PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0x40000000);
1527 for (index = 0; index < 16; index++)
1529 PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_2[index]);
1530 //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord)));
1534 PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0x00000000);
1536 else if (path == RF_PATH_B)
1542 for (index = 0; index < 10; index ++)
1544 PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]);
1545 //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord)));
1549 PHY_SetBBReg(pAdapter, rConfig_Pmpd_AntA, bMaskDWord, 0x12680000);
1551 PHY_SetBBReg(pAdapter, rConfig_Pmpd_AntB, bMaskDWord, 0x12680000);
1553 offset = rConfig_AntA;
1555 for (; index < 13; index ++) //offset 0xb68, 0xb6c
1557 PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]);
1558 //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord)));
1564 PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0x40000000);
1568 for (index = 0; index < 16; index++)
1570 PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_2[index]);
1571 //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord)));
1575 PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0x00000000);
1578 //save RF default value
1579 regD[path] = PHY_QueryRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_TXBIAS_A, bRFRegOffsetMask);
1581 //Path A AFE all on, path B AFE All off or vise versa
1582 for (index = 0; index < IQK_ADDA_REG_NUM ; index++)
1583 PHY_SetBBReg(pAdapter, AFE_REG[index], bMaskDWord, AFE_on_off[path]);
1584 //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0xe70 %x\n", PHY_QueryBBReg(pAdapter, 0xe70, bMaskDWord)));
1589 for (index = 0; index < APK_BB_REG_NUM ; index++)
1591 if (index == 0) //skip
1594 PHY_SetBBReg(pAdapter, BB_REG[index], bMaskDWord, BB_AP_MODE[index]);
1595 else if (BB_REG[index] == 0x870)
1596 PHY_SetBBReg(pAdapter, BB_REG[index], bMaskDWord, BB_backup[index]|BIT10|BIT26);
1598 PHY_SetBBReg(pAdapter, BB_REG[index], BIT10, 0x0);
1600 PHY_SetBBReg(pAdapter, rTx_IQK_Tone_A, bMaskDWord, 0x01008c00);
1601 PHY_SetBBReg(pAdapter, rRx_IQK_Tone_A, bMaskDWord, 0x01008c00);
1605 PHY_SetBBReg(pAdapter, rTx_IQK_Tone_B, bMaskDWord, 0x01008c00);
1606 PHY_SetBBReg(pAdapter, rRx_IQK_Tone_B, bMaskDWord, 0x01008c00);
1609 //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x800 %x\n", PHY_QueryBBReg(pAdapter, 0x800, bMaskDWord)));
1612 _PHY_MACSettingCalibration(pAdapter, MAC_REG, MAC_backup);
1614 if (path == RF_PATH_A) //Path B to standby mode
1616 PHY_SetRFReg(pAdapter, RF_PATH_B, RF_AC, bRFRegOffsetMask, 0x10000);
1618 else //Path A to standby mode
1620 PHY_SetRFReg(pAdapter, RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x10000);
1621 PHY_SetRFReg(pAdapter, RF_PATH_A, RF_MODE1, bRFRegOffsetMask, 0x1000f);
1622 PHY_SetRFReg(pAdapter, RF_PATH_A, RF_MODE2, bRFRegOffsetMask, 0x20103);
1625 delta_offset = ((delta+14)/2);
1626 if (delta_offset < 0)
1628 else if (delta_offset > 12)
1632 for (index = 0; index < APK_BB_REG_NUM; index++)
1634 if (index != 1) //only DO PA11+PAD01001, AP RF setting
1637 tmpReg = APK_RF_init_value[path][index];
1639 if (!pdmpriv->bAPKThermalMeterIgnore)
1641 BB_offset = (tmpReg & 0xF0000) >> 16;
1643 if (!(tmpReg & BIT15)) //sign bit 0
1645 BB_offset = -BB_offset;
1648 delta_V = APK_delta_mapping[index][delta_offset];
1650 BB_offset += delta_V;
1652 //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() APK num %d delta_V %d delta_offset %d\n", index, delta_V, delta_offset));
1656 tmpReg = tmpReg & (~BIT15);
1657 BB_offset = -BB_offset;
1661 tmpReg = tmpReg | BIT15;
1663 tmpReg = (tmpReg & 0xFFF0FFFF) | (BB_offset << 16);
1667 PHY_SetRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_IPA_A, bRFRegOffsetMask, 0x8992e);
1668 PHY_SetRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_AC, bRFRegOffsetMask, APK_RF_value_0[path][index]);
1669 PHY_SetRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_TXBIAS_A, bRFRegOffsetMask, tmpReg);
1671 // PA11+PAD01111, one shot
1675 PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0x80000000);
1677 PHY_SetBBReg(pAdapter, APK_offset[path], bMaskDWord, APK_value[0]);
1679 PHY_SetBBReg(pAdapter, APK_offset[path], bMaskDWord, APK_value[1]);
1680 #ifdef CONFIG_LONG_DELAY_ISSUE
1686 PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0x00000000);
1688 if (path == RF_PATH_A)
1689 tmpReg = PHY_QueryBBReg(pAdapter, rAPK, 0x03E00000);
1691 tmpReg = PHY_QueryBBReg(pAdapter, rAPK, 0xF8000000);
1695 while (tmpReg > apkbound && i < 4);
1697 APK_result[path][index] = tmpReg;
1701 //reload MAC default value
1702 _PHY_ReloadMACRegisters(pAdapter, MAC_REG, MAC_backup);
1704 //reload BB default value
1705 for (index = 0; index < APK_BB_REG_NUM ; index++)
1707 if (index == 0) //skip
1709 PHY_SetBBReg(pAdapter, BB_REG[index], bMaskDWord, BB_backup[index]);
1712 //reload AFE default value
1713 _PHY_ReloadADDARegisters(pAdapter, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM);
1715 //reload RF path default value
1716 for (path = 0; path < pathbound; path++)
1718 PHY_SetRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_TXBIAS_A, bRFRegOffsetMask, regD[path]);
1719 if (path == RF_PATH_B)
1721 PHY_SetRFReg(pAdapter, RF_PATH_A, RF_MODE1, bRFRegOffsetMask, 0x1000f);
1722 PHY_SetRFReg(pAdapter, RF_PATH_A, RF_MODE2, bRFRegOffsetMask, 0x20101);
1725 //note no index == 0
1726 if (APK_result[path][1] > 6)
1727 APK_result[path][1] = 6;
1728 //RTPRINT(FINIT, INIT_IQK, ("apk path %d result %d 0x%x \t", path, 1, APK_result[path][1]));
1731 //RTPRINT(FINIT, INIT_IQK, ("\n"));
1734 for (path = 0; path < pathbound; path++)
1736 PHY_SetRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_BS_PA_APSET_G1_G4, bRFRegOffsetMask,
1737 ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (APK_result[path][1] << 5) | APK_result[path][1]));
1738 if (path == RF_PATH_A)
1739 PHY_SetRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_BS_PA_APSET_G5_G8, bRFRegOffsetMask,
1740 ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x00 << 5) | 0x05));
1742 PHY_SetRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_BS_PA_APSET_G5_G8, bRFRegOffsetMask,
1743 ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x02 << 5) | 0x05));
1744 PHY_SetRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_BS_PA_APSET_G9_G11, bRFRegOffsetMask,
1745 ((0x08 << 15) | (0x08 << 10) | (0x08 << 5) | 0x08));
1748 pdmpriv->bAPKdone = true;
1750 //RTPRINT(FINIT, INIT_IQK, ("<==PHY_APCalibrate()\n"));
1754 rtl8192c_PHY_IQCalibrate(
1755 IN PADAPTER pAdapter,
1759 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
1760 struct dm_priv *pdmpriv = &pHalData->dmpriv;
1761 s32 result[4][8]; //last is final result
1762 u8 i, final_candidate;
1763 bool bPathAOK, bPathBOK;
1764 s32 RegE94, RegE9C, RegEA4, RegEAC, RegEB4, RegEBC, RegEC4, RegECC, RegTmp = 0;
1765 bool is12simular, is13simular, is23simular;
1766 bool bStartContTx = false, bSingleTone = false, bCarrierSuppression = false;
1767 u32 IQK_BB_REG_92C[IQK_BB_REG_NUM] = {
1768 rOFDM0_XARxIQImbalance, rOFDM0_XBRxIQImbalance,
1769 rOFDM0_ECCAThreshold, rOFDM0_AGCRSSITable,
1770 rOFDM0_XATxIQImbalance, rOFDM0_XBTxIQImbalance,
1771 rOFDM0_XCTxAFE, rOFDM0_XDTxAFE,
1772 rOFDM0_RxIQExtAnta};
1776 bStartContTx = pAdapter->mppriv.MptCtx.bStartContTx;
1777 bSingleTone = pAdapter->mppriv.MptCtx.bSingleTone;
1778 bCarrierSuppression = pAdapter->mppriv.MptCtx.bCarrierSuppression;
1781 //ignore IQK when continuous Tx
1782 if (bStartContTx || bSingleTone || bCarrierSuppression)
1791 _PHY_ReloadADDARegisters(pAdapter, IQK_BB_REG_92C, pdmpriv->IQK_BB_backup_recover, 9);
1794 DBG_8192C("IQK:Start!!!\n");
1796 for (i = 0; i < 8; i++)
1803 final_candidate = 0xff;
1806 is12simular = false;
1807 is23simular = false;
1808 is13simular = false;
1812 if (IS_92C_SERIAL( pHalData->VersionID)) {
1813 _PHY_IQCalibrate(pAdapter, result, i, true);
1817 _PHY_IQCalibrate(pAdapter, result, i, false);
1822 is12simular = _PHY_SimularityCompare(pAdapter, result, 0, 1);
1825 final_candidate = 0;
1832 is13simular = _PHY_SimularityCompare(pAdapter, result, 0, 2);
1835 final_candidate = 0;
1839 is23simular = _PHY_SimularityCompare(pAdapter, result, 1, 2);
1841 final_candidate = 1;
1844 for (i = 0; i < 8; i++)
1845 RegTmp += result[3][i];
1848 final_candidate = 3;
1850 final_candidate = 0xFF;
1857 RegE94 = result[i][0];
1858 RegE9C = result[i][1];
1859 RegEA4 = result[i][2];
1860 RegEAC = result[i][3];
1861 RegEB4 = result[i][4];
1862 RegEBC = result[i][5];
1863 RegEC4 = result[i][6];
1864 RegECC = result[i][7];
1865 //RTPRINT(FINIT, INIT_IQK, ("IQK: RegE94=%lx RegE9C=%lx RegEA4=%lx RegEAC=%lx RegEB4=%lx RegEBC=%lx RegEC4=%lx RegECC=%lx\n ", RegE94, RegE9C, RegEA4, RegEAC, RegEB4, RegEBC, RegEC4, RegECC));
1868 if (final_candidate != 0xff)
1870 pdmpriv->RegE94 = RegE94 = result[final_candidate][0];
1871 pdmpriv->RegE9C = RegE9C = result[final_candidate][1];
1872 RegEA4 = result[final_candidate][2];
1873 RegEAC = result[final_candidate][3];
1874 pdmpriv->RegEB4 = RegEB4 = result[final_candidate][4];
1875 pdmpriv->RegEBC = RegEBC = result[final_candidate][5];
1876 RegEC4 = result[final_candidate][6];
1877 RegECC = result[final_candidate][7];
1878 DBG_8192C("IQK: final_candidate is %x\n", final_candidate);
1879 DBG_8192C("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);
1880 bPathAOK = bPathBOK = true;
1884 RegE94 = RegEB4 = pdmpriv->RegE94 = pdmpriv->RegEB4 = 0x100; //X default value
1885 RegE9C = RegEBC = pdmpriv->RegE9C = pdmpriv->RegEBC = 0x0; //Y default value
1888 if ((RegE94 != 0)/*&&(RegEA4 != 0)*/)
1889 _PHY_PathAFillIQKMatrix(pAdapter, bPathAOK, result, final_candidate, (RegEA4 == 0));
1891 if (IS_92C_SERIAL( pHalData->VersionID)) {
1892 if ((RegEB4 != 0)/*&&(RegEC4 != 0)*/)
1893 _PHY_PathBFillIQKMatrix(pAdapter, bPathBOK, result, final_candidate, (RegEC4 == 0));
1896 _PHY_SaveADDARegisters(pAdapter, IQK_BB_REG_92C, pdmpriv->IQK_BB_backup_recover, 9);
1902 rtl8192c_PHY_LCCalibrate(
1903 IN PADAPTER pAdapter
1906 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
1907 struct mlme_ext_priv *pmlmeext = &pAdapter->mlmeextpriv;
1908 bool bStartContTx = false, bSingleTone = false, bCarrierSuppression = false;
1911 bStartContTx = pAdapter->mppriv.MptCtx.bStartContTx;
1912 bSingleTone = pAdapter->mppriv.MptCtx.bSingleTone;
1913 bCarrierSuppression = pAdapter->mppriv.MptCtx.bCarrierSuppression;
1920 //ignore IQK when continuous Tx
1921 if (bStartContTx || bSingleTone || bCarrierSuppression)
1924 if (pmlmeext->sitesurvey_res.state == SCAN_PROCESS)
1927 if (IS_92C_SERIAL( pHalData->VersionID)) {
1928 _PHY_LCCalibrate(pAdapter, true);
1932 _PHY_LCCalibrate(pAdapter, false);
1936 void rtl8192c_PHY_APCalibrate(PADAPTER pAdapter, char delta)
1938 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
1939 struct dm_priv *pdmpriv = &pHalData->dmpriv;
1941 //default disable APK, because Tx NG issue, suggest by Jenyu, 2011.11.25
1948 if (pdmpriv->bAPKdone)
1951 if (IS_92C_SERIAL( pHalData->VersionID)) {
1952 _PHY_APCalibrate(pAdapter, delta, true);
1956 _PHY_APCalibrate(pAdapter, delta, false);