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] = {
65 pdmpriv->TXPowerTrackingCallbackCnt++; //cosa add for debug
66 pdmpriv->bTXPowerTrackingInit = _TRUE;
68 if(pHalData->CurrentChannel == 14 && !pdmpriv->bCCKinCH14)
69 pdmpriv->bCCKinCH14 = _TRUE;
70 else if(pHalData->CurrentChannel != 14 && pdmpriv->bCCKinCH14)
71 pdmpriv->bCCKinCH14 = _FALSE;
73 //DBG_8723A("===>dm_TXPowerTrackingCallback_ThermalMeter_92C\n");
75 ThermalValue = (u8)PHY_QueryRFReg(Adapter, RF_PATH_A, RF_T_METER, 0x1f); // 0x24: RF Reg[4:0]
77 //DBG_8723A("\n\nReadback Thermal Meter = 0x%x pre thermal meter 0x%x EEPROMthermalmeter 0x%x\n",ThermalValue,pdmpriv->ThermalValue, pHalData->EEPROMThermalMeter);
79 rtl8192c_PHY_APCalibrate(Adapter, (ThermalValue - pHalData->EEPROMThermalMeter));
88 // if(!pHalData->ThermalValue)
90 //Query OFDM path A default setting
91 ele_D = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord)&bMaskOFDM_D;
92 for(i=0; i<OFDM_TABLE_SIZE_92C; i++) //find the index
94 if(ele_D == (OFDMSwingTable[i]&bMaskOFDM_D))
96 OFDM_index_old[0] = (u8)i;
97 //DBG_8723A("Initial pathA ele_D reg0x%x = 0x%x, OFDM_index=0x%x\n", rOFDM0_XATxIQImbalance, ele_D, OFDM_index_old[0]);
102 //Query OFDM path B default setting
105 ele_D = PHY_QueryBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord)&bMaskOFDM_D;
106 for(i=0; i<OFDM_TABLE_SIZE_92C; i++) //find the index
108 if(ele_D == (OFDMSwingTable[i]&bMaskOFDM_D))
110 OFDM_index_old[1] = (u8)i;
111 //DBG_8723A("Initial pathB ele_D reg0x%x = 0x%x, OFDM_index=0x%x\n",rOFDM0_XBTxIQImbalance, ele_D, OFDM_index_old[1]);
117 //Query CCK default setting From 0xa24
118 TempCCk = PHY_QueryBBReg(Adapter, rCCK0_TxFilter2, bMaskDWord)&bMaskCCK;
119 for(i=0 ; i<CCK_TABLE_SIZE ; i++)
121 if(pdmpriv->bCCKinCH14)
123 if(_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch14[i][2], 4)==_TRUE)
125 CCK_index_old =(u8)i;
126 //DBG_8723A("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch 14 %d\n", rCCK0_TxFilter2, TempCCk, CCK_index_old, pdmpriv->bCCKinCH14);
132 if(_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch1_Ch13[i][2], 4)==_TRUE)
134 CCK_index_old =(u8)i;
135 //DBG_8723A("Initial reg0x%x = 0x%x, CCK_index=0x%x, ch14 %d\n", rCCK0_TxFilter2, TempCCk, CCK_index_old, pdmpriv->bCCKinCH14);
141 if(!pdmpriv->ThermalValue)
143 pdmpriv->ThermalValue = pHalData->EEPROMThermalMeter;
144 pdmpriv->ThermalValue_LCK = ThermalValue;
145 pdmpriv->ThermalValue_IQK = ThermalValue;
146 pdmpriv->ThermalValue_DPK = pHalData->EEPROMThermalMeter;
148 #ifdef CONFIG_USB_HCI
149 for(i = 0; i < rf; i++)
150 pdmpriv->OFDM_index_HP[i] = pdmpriv->OFDM_index[i] = OFDM_index_old[i];
151 pdmpriv->CCK_index_HP = pdmpriv->CCK_index = CCK_index_old;
153 for(i = 0; i < rf; i++)
154 pdmpriv->OFDM_index[i] = OFDM_index_old[i];
155 pdmpriv->CCK_index = CCK_index_old;
159 #ifdef CONFIG_USB_HCI
160 if(pHalData->BoardType == BOARD_USB_High_PA)
162 pdmpriv->ThermalValue_HP[pdmpriv->ThermalValue_HP_index] = ThermalValue;
163 pdmpriv->ThermalValue_HP_index++;
164 if(pdmpriv->ThermalValue_HP_index == HP_THERMAL_NUM)
165 pdmpriv->ThermalValue_HP_index = 0;
167 for(i = 0; i < HP_THERMAL_NUM; i++)
169 if(pdmpriv->ThermalValue_HP[i])
171 ThermalValue_HP += pdmpriv->ThermalValue_HP[i];
172 ThermalValue_HP_count++;
176 if(ThermalValue_HP_count)
177 ThermalValue = (u8)(ThermalValue_HP / ThermalValue_HP_count);
182 delta = (ThermalValue > pdmpriv->ThermalValue)?(ThermalValue - pdmpriv->ThermalValue):(pdmpriv->ThermalValue - ThermalValue);
183 #ifdef CONFIG_USB_HCI
184 if(pHalData->BoardType == BOARD_USB_High_PA)
186 if(pdmpriv->bDoneTxpower)
187 delta_HP = (ThermalValue > pdmpriv->ThermalValue)?(ThermalValue - pdmpriv->ThermalValue):(pdmpriv->ThermalValue - ThermalValue);
189 delta_HP = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue);
196 delta_LCK = (ThermalValue > pdmpriv->ThermalValue_LCK)?(ThermalValue - pdmpriv->ThermalValue_LCK):(pdmpriv->ThermalValue_LCK - ThermalValue);
197 delta_IQK = (ThermalValue > pdmpriv->ThermalValue_IQK)?(ThermalValue - pdmpriv->ThermalValue_IQK):(pdmpriv->ThermalValue_IQK - ThermalValue);
199 //DBG_8723A("Readback Thermal Meter = 0x%lx pre thermal meter 0x%lx EEPROMthermalmeter 0x%lx delta 0x%lx delta_LCK 0x%lx delta_IQK 0x%lx\n", ThermalValue, pHalData->ThermalValue, pHalData->EEPROMThermalMeter, delta, delta_LCK, delta_IQK);
203 pdmpriv->ThermalValue_LCK = ThermalValue;
204 rtl8192c_PHY_LCCalibrate(Adapter);
207 if((delta > 0 || delta_HP > 0) && pdmpriv->TxPowerTrackControl)
209 #ifdef CONFIG_USB_HCI
210 if(pHalData->BoardType == BOARD_USB_High_PA)
212 pdmpriv->bDoneTxpower = _TRUE;
213 delta_HP = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue);
215 if(delta_HP > index_mapping_HP_NUM-1)
216 index_HP = index_mapping_HP[index_mapping_HP_NUM-1];
218 index_HP = index_mapping_HP[delta_HP];
220 if(ThermalValue > pHalData->EEPROMThermalMeter) //set larger Tx power
222 for(i = 0; i < rf; i++)
223 OFDM_index[i] = pdmpriv->OFDM_index_HP[i] - index_HP;
224 CCK_index = pdmpriv->CCK_index_HP -index_HP;
228 for(i = 0; i < rf; i++)
229 OFDM_index[i] = pdmpriv->OFDM_index_HP[i] + index_HP;
230 CCK_index = pdmpriv->CCK_index_HP + index_HP;
233 delta_HP = (ThermalValue > pdmpriv->ThermalValue)?(ThermalValue - pdmpriv->ThermalValue):(pdmpriv->ThermalValue - ThermalValue);
239 if(ThermalValue > pdmpriv->ThermalValue)
241 for(i = 0; i < rf; i++)
242 pdmpriv->OFDM_index[i] -= delta;
243 pdmpriv->CCK_index -= delta;
247 for(i = 0; i < rf; i++)
248 pdmpriv->OFDM_index[i] += delta;
249 pdmpriv->CCK_index += delta;
255 DBG_8723A("temp OFDM_A_index=0x%x, OFDM_B_index=0x%x, CCK_index=0x%x\n",
256 pdmpriv->OFDM_index[0], pdmpriv->OFDM_index[1], pdmpriv->CCK_index);
260 DBG_8723A("temp OFDM_A_index=0x%x, CCK_index=0x%x\n",
261 pdmpriv->OFDM_index[0], pdmpriv->CCK_index);
265 #ifdef CONFIG_USB_HCI
266 if(pHalData->BoardType != BOARD_USB_High_PA)
269 if(ThermalValue > pHalData->EEPROMThermalMeter)
271 for(i = 0; i < rf; i++)
272 OFDM_index[i] = pdmpriv->OFDM_index[i]+1;
273 CCK_index = pdmpriv->CCK_index+1;
277 for(i = 0; i < rf; i++)
278 OFDM_index[i] = pdmpriv->OFDM_index[i];
279 CCK_index = pdmpriv->CCK_index;
283 for(i = 0; i < rf; i++)
285 if(TxPwrLevel[i] >=0 && TxPwrLevel[i] <=26)
287 if(ThermalValue > pHalData->EEPROMThermalMeter)
294 else if(delta > 5 && ThermalValue < pHalData->EEPROMThermalMeter)
299 else if (TxPwrLevel[i] >= 27 && TxPwrLevel[i] <= 32 && ThermalValue > pHalData->EEPROMThermalMeter)
306 else if (TxPwrLevel[i] >= 32 && TxPwrLevel[i] <= 38 && ThermalValue > pHalData->EEPROMThermalMeter && delta > 5)
313 if(TxPwrLevel[i] >=0 && TxPwrLevel[i] <=26)
315 if(ThermalValue > pHalData->EEPROMThermalMeter)
322 else if(delta > 5 && ThermalValue < pHalData->EEPROMThermalMeter)
327 else if (TxPwrLevel[i] >= 27 && TxPwrLevel[i] <= 32 && ThermalValue > pHalData->EEPROMThermalMeter)
334 else if (TxPwrLevel[i] >= 32 && TxPwrLevel[i] <= 38 && ThermalValue > pHalData->EEPROMThermalMeter && delta > 5)
342 for(i = 0; i < rf; i++)
344 if(OFDM_index[i] > (OFDM_TABLE_SIZE_92C-1))
345 OFDM_index[i] = (OFDM_TABLE_SIZE_92C-1);
346 else if (OFDM_index[i] < OFDM_min_index)
347 OFDM_index[i] = OFDM_min_index;
350 if(CCK_index > (CCK_TABLE_SIZE-1))
351 CCK_index = (CCK_TABLE_SIZE-1);
352 else if (CCK_index < 0)
357 DBG_8723A("new OFDM_A_index=0x%x, OFDM_B_index=0x%x, CCK_index=0x%x\n",
358 OFDM_index[0], OFDM_index[1], CCK_index);
362 DBG_8723A("new OFDM_A_index=0x%x, CCK_index=0x%x\n",
363 OFDM_index[0], CCK_index);
367 if(pdmpriv->TxPowerTrackControl && (delta != 0 || delta_HP != 0))
369 //Adujst OFDM Ant_A according to IQK result
370 ele_D = (OFDMSwingTable[OFDM_index[0]] & 0xFFC00000)>>22;
376 if ((X & 0x00000200) != 0)
378 ele_A = ((X * ele_D)>>8)&0x000003FF;
380 //new element C = element D x Y
381 if ((Y & 0x00000200) != 0)
383 ele_C = ((Y * ele_D)>>8)&0x000003FF;
385 //wirte new elements A, C, D to regC80 and regC94, element B is always 0
386 value32 = (ele_D<<22)|((ele_C&0x3F)<<16)|ele_A;
387 PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, value32);
389 value32 = (ele_C&0x000003C0)>>6;
390 PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, value32);
392 value32 = ((X * ele_D)>>7)&0x01;
393 PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT31, value32);
395 value32 = ((Y * ele_D)>>7)&0x01;
396 PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT29, value32);
401 PHY_SetBBReg(Adapter, rOFDM0_XATxIQImbalance, bMaskDWord, OFDMSwingTable[OFDM_index[0]]);
402 PHY_SetBBReg(Adapter, rOFDM0_XCTxAFE, bMaskH4Bits, 0x00);
403 PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT31|BIT29, 0x00);
406 //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));
408 //Adjust CCK according to IQK result
409 if(!pdmpriv->bCCKinCH14){
410 rtw_write8(Adapter, 0xa22, CCKSwingTable_Ch1_Ch13[CCK_index][0]);
411 rtw_write8(Adapter, 0xa23, CCKSwingTable_Ch1_Ch13[CCK_index][1]);
412 rtw_write8(Adapter, 0xa24, CCKSwingTable_Ch1_Ch13[CCK_index][2]);
413 rtw_write8(Adapter, 0xa25, CCKSwingTable_Ch1_Ch13[CCK_index][3]);
414 rtw_write8(Adapter, 0xa26, CCKSwingTable_Ch1_Ch13[CCK_index][4]);
415 rtw_write8(Adapter, 0xa27, CCKSwingTable_Ch1_Ch13[CCK_index][5]);
416 rtw_write8(Adapter, 0xa28, CCKSwingTable_Ch1_Ch13[CCK_index][6]);
417 rtw_write8(Adapter, 0xa29, CCKSwingTable_Ch1_Ch13[CCK_index][7]);
420 rtw_write8(Adapter, 0xa22, CCKSwingTable_Ch14[CCK_index][0]);
421 rtw_write8(Adapter, 0xa23, CCKSwingTable_Ch14[CCK_index][1]);
422 rtw_write8(Adapter, 0xa24, CCKSwingTable_Ch14[CCK_index][2]);
423 rtw_write8(Adapter, 0xa25, CCKSwingTable_Ch14[CCK_index][3]);
424 rtw_write8(Adapter, 0xa26, CCKSwingTable_Ch14[CCK_index][4]);
425 rtw_write8(Adapter, 0xa27, CCKSwingTable_Ch14[CCK_index][5]);
426 rtw_write8(Adapter, 0xa28, CCKSwingTable_Ch14[CCK_index][6]);
427 rtw_write8(Adapter, 0xa29, CCKSwingTable_Ch14[CCK_index][7]);
432 ele_D = (OFDMSwingTable[(u8)OFDM_index[1]] & 0xFFC00000)>>22;
434 //new element A = element D x X
439 if ((X & 0x00000200) != 0) //consider minus
441 ele_A = ((X * ele_D)>>8)&0x000003FF;
443 //new element C = element D x Y
444 if ((Y & 0x00000200) != 0)
446 ele_C = ((Y * ele_D)>>8)&0x00003FF;
448 //wirte new elements A, C, D to regC88 and regC9C, element B is always 0
449 value32=(ele_D<<22)|((ele_C&0x3F)<<16) |ele_A;
450 PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, value32);
452 value32 = (ele_C&0x000003C0)>>6;
453 PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, value32);
455 value32 = ((X * ele_D)>>7)&0x01;
456 PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT27, value32);
458 value32 = ((Y * ele_D)>>7)&0x01;
459 PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT25, value32);
463 PHY_SetBBReg(Adapter, rOFDM0_XBTxIQImbalance, bMaskDWord, OFDMSwingTable[OFDM_index[1]]);
464 PHY_SetBBReg(Adapter, rOFDM0_XDTxAFE, bMaskH4Bits, 0x00);
465 PHY_SetBBReg(Adapter, rOFDM0_ECCAThreshold, BIT27|BIT25, 0x00);
468 //DBG_8723A("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);
472 DBG_8723A("TxPwrTracking 0xc80 = 0x%x, 0xc94 = 0x%x RF 0x24 = 0x%x\n", \
473 PHY_QueryBBReg(Adapter, 0xc80, bMaskDWord),\
474 PHY_QueryBBReg(Adapter, 0xc94, bMaskDWord), \
475 PHY_QueryRFReg(Adapter, RF_PATH_A, 0x24, bMaskDWord));
485 pdmpriv->ThermalValue_IQK = ThermalValue;
486 rtl8192c_PHY_IQCalibrate(Adapter,_FALSE);
489 //update thermal meter value
490 if(pdmpriv->TxPowerTrackControl)
491 pdmpriv->ThermalValue = ThermalValue;
495 //DBG_8723A("<===dm_TXPowerTrackingCallback_ThermalMeter_92C\n");
497 pdmpriv->TXPowercount = 0;
503 odm_InitializeTXPowerTracking_ThermalMeter(
506 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
507 struct dm_priv *pdmpriv = &pHalData->dmpriv;
509 //pMgntInfo->bTXPowerTracking = _TRUE;
510 pdmpriv->TXPowercount = 0;
511 pdmpriv->bTXPowerTrackingInit = _FALSE;
512 pdmpriv->ThermalValue = 0;
514 #if (MP_DRIVER != 1) //for mp driver, turn off txpwrtracking as default
515 pdmpriv->TxPowerTrackControl = _TRUE;
518 MSG_8723A("pdmpriv->TxPowerTrackControl = %d\n", pdmpriv->TxPowerTrackControl);
523 ODM_InitializeTXPowerTracking(
526 odm_InitializeTXPowerTracking_ThermalMeter(Adapter);
531 // - Dispatch TxPower Tracking direct call ONLY for 92s.
532 // - We shall NOT schedule Workitem within PASSIVE LEVEL, which will cause system resource
533 // leakage under some platform.
536 // PASSIVE_LEVEL when this routine is called.
538 // Added by Roger, 2009.06.18.
541 ODM_TXPowerTracking92CDirectCall(
544 odm_TXPowerTrackingCallback_ThermalMeter_92C(Adapter);
548 odm_CheckTXPowerTracking_ThermalMeter(
551 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
552 struct dm_priv *pdmpriv = &pHalData->dmpriv;
553 DM_ODM_T *podmpriv = &pHalData->odmpriv;
554 //u1Byte TxPowerCheckCnt = 5; //10 sec
556 //if(!pMgntInfo->bTXPowerTracking /*|| (!pdmpriv->TxPowerTrackControl && pdmpriv->bAPKdone)*/)
557 if(!(podmpriv->SupportAbility & ODM_RF_TX_PWR_TRACK))
562 if(!pdmpriv->TM_Trigger) //at least delay 1 sec
564 //pHalData->TxPowerCheckCnt++; //cosa add for debug
565 PHY_SetRFReg(Adapter, RF_PATH_A, RF_T_METER, bRFRegOffsetMask, 0x60);
566 //DBG_8723A("Trigger 92C Thermal Meter!!\n");
568 pdmpriv->TM_Trigger = 1;
574 //DBG_8723A("Schedule TxPowerTracking direct call!!\n");
575 ODM_TXPowerTracking92CDirectCall(Adapter); //Using direct call is instead, added by Roger, 2009.06.18.
576 pdmpriv->TM_Trigger = 0;
583 rtl8192c_odm_CheckTXPowerTracking(
586 odm_CheckTXPowerTracking_ThermalMeter(Adapter);
591 #ifdef CONFIG_ANTENNA_DIVERSITY
592 // Add new function to reset the state of antenna diversity before link.
594 void odm_SwAntDivResetBeforeLink8192C(IN PDM_ODM_T pDM_Odm)
596 SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
598 pDM_SWAT_Table->SWAS_NoLink_State = 0;
601 // Compare RSSI for deciding antenna
602 void odm_AntDivCompare8192C(PADAPTER Adapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src)
604 //PADAPTER Adapter = pDM_Odm->Adapter ;
606 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
607 PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
608 if((0 != pHalData->AntDivCfg) && (!IS_92C_SERIAL(pHalData->VersionID)) )
610 //DBG_8723A("update_network=> orgRSSI(%d)(%d),newRSSI(%d)(%d)\n",dst->Rssi,query_rx_pwr_percentage(dst->Rssi),
611 // src->Rssi,query_rx_pwr_percentage(src->Rssi));
612 //select optimum_antenna for before linked =>For antenna diversity
613 if(dst->Rssi >= src->Rssi )//keep org parameter
615 src->Rssi = dst->Rssi;
616 src->PhyInfo.Optimum_antenna = dst->PhyInfo.Optimum_antenna;
621 // Add new function to reset the state of antenna diversity before link.
622 u8 odm_AntDivBeforeLink8192C(PADAPTER Adapter )
625 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
626 PDM_ODM_T pDM_Odm =&pHalData->odmpriv;
627 SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
628 struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
630 // Condition that does not need to use antenna diversity.
631 if(IS_92C_SERIAL(pHalData->VersionID) ||(pHalData->AntDivCfg==0))
633 //DBG_8723A("odm_AntDivBeforeLink8192C(): No AntDiv Mechanism.\n");
637 if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
639 pDM_SWAT_Table->SWAS_NoLink_State = 0;
642 // Since driver is going to set BB register, it shall check if there is another thread controlling BB/RF.
644 if(pHalData->eRFPowerState!=eRfOn || pMgntInfo->RFChangeInProgress || pMgntInfo->bMediaConnect)
648 ODM_RT_TRACE(pDM_Odm,COMP_SWAS, DBG_LOUD,
649 ("SwAntDivCheckBeforeLink8192C(): RFChangeInProgress(%x), eRFPowerState(%x)\n",
650 pMgntInfo->RFChangeInProgress,
651 pHalData->eRFPowerState));
653 pDM_SWAT_Table->SWAS_NoLink_State = 0;
659 if(pDM_SWAT_Table->SWAS_NoLink_State == 0){
661 pDM_SWAT_Table->SWAS_NoLink_State = 1;
662 pDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==Antenna_A)?Antenna_B:Antenna_A;
664 //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, pDM_SWAT_Table->CurAntenna);
665 rtw_antenna_select_cmd(Adapter, pDM_SWAT_Table->CurAntenna, _FALSE);
666 //DBG_8723A("%s change antenna to ANT_( %s ).....\n",__FUNCTION__, (pDM_SWAT_Table->CurAntenna==Antenna_A)?"A":"B");
671 pDM_SWAT_Table->SWAS_NoLink_State = 0;
680 //-------------------------------------------------------------------------
684 //-------------------------------------------------------------------------
685 #define MAX_TOLERANCE 5
686 #define IQK_DELAY_TIME 1 //ms
688 static u8 //bit0 = 1 => Tx OK, bit1 = 1 => Rx OK
690 IN PADAPTER pAdapter,
694 u32 regEAC, regE94, regE9C, regEA4;
696 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
698 //RTPRINT(FINIT, INIT_IQK, ("Path A IQK!\n"));
701 //RTPRINT(FINIT, INIT_IQK, ("Path-A IQK setting!\n"));
702 PHY_SetBBReg(pAdapter, rTx_IQK_Tone_A, bMaskDWord, 0x10008c1f);
703 PHY_SetBBReg(pAdapter, rRx_IQK_Tone_A, bMaskDWord, 0x10008c1f);
704 PHY_SetBBReg(pAdapter, rTx_IQK_PI_A, bMaskDWord, 0x82140102);
706 PHY_SetBBReg(pAdapter, rRx_IQK_PI_A, bMaskDWord, configPathB ? 0x28160202 :
707 IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID)?0x28160202:0x28160502);
712 PHY_SetBBReg(pAdapter, rTx_IQK_Tone_B, bMaskDWord, 0x10008c22);
713 PHY_SetBBReg(pAdapter, rRx_IQK_Tone_B, bMaskDWord, 0x10008c22);
714 PHY_SetBBReg(pAdapter, rTx_IQK_PI_B, bMaskDWord, 0x82140102);
715 PHY_SetBBReg(pAdapter, rRx_IQK_PI_B, bMaskDWord, 0x28160202);
718 //LO calibration setting
719 //RTPRINT(FINIT, INIT_IQK, ("LO calibration setting!\n"));
720 PHY_SetBBReg(pAdapter, rIQK_AGC_Rsp, bMaskDWord, 0x001028d1);
722 //One shot, path A LOK & IQK
723 //RTPRINT(FINIT, INIT_IQK, ("One shot, path A LOK & IQK!\n"));
724 PHY_SetBBReg(pAdapter, rIQK_AGC_Pts, bMaskDWord, 0xf9000000);
725 PHY_SetBBReg(pAdapter, rIQK_AGC_Pts, bMaskDWord, 0xf8000000);
728 //RTPRINT(FINIT, INIT_IQK, ("Delay %d ms for One shot, path A LOK & IQK.\n", IQK_DELAY_TIME));
729 rtw_udelay_os(IQK_DELAY_TIME*1000);//PlatformStallExecution(IQK_DELAY_TIME*1000);
732 regEAC = PHY_QueryBBReg(pAdapter, rRx_Power_After_IQK_A_2, bMaskDWord);
733 //RTPRINT(FINIT, INIT_IQK, ("0xeac = 0x%x\n", regEAC));
734 regE94 = PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_A, bMaskDWord);
735 //RTPRINT(FINIT, INIT_IQK, ("0xe94 = 0x%x\n", regE94));
736 regE9C= PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_A, bMaskDWord);
737 //RTPRINT(FINIT, INIT_IQK, ("0xe9c = 0x%x\n", regE9C));
738 regEA4= PHY_QueryBBReg(pAdapter, rRx_Power_Before_IQK_A_2, bMaskDWord);
739 //RTPRINT(FINIT, INIT_IQK, ("0xea4 = 0x%x\n", regEA4));
741 if(!(regEAC & BIT28) &&
742 (((regE94 & 0x03FF0000)>>16) != 0x142) &&
743 (((regE9C & 0x03FF0000)>>16) != 0x42) )
745 else //if Tx not OK, ignore Rx
748 if(!(regEAC & BIT27) && //if Tx is OK, check whether Rx is OK
749 (((regEA4 & 0x03FF0000)>>16) != 0x132) &&
750 (((regEAC & 0x03FF0000)>>16) != 0x36))
753 DBG_8723A("Path A Rx IQK fail!!\n");
760 static u8 //bit0 = 1 => Tx OK, bit1 = 1 => Rx OK
765 u32 regEAC, regEB4, regEBC, regEC4, regECC;
767 //RTPRINT(FINIT, INIT_IQK, ("Path B IQK!\n"));
769 //One shot, path B LOK & IQK
770 //RTPRINT(FINIT, INIT_IQK, ("One shot, path A LOK & IQK!\n"));
771 PHY_SetBBReg(pAdapter, rIQK_AGC_Cont, bMaskDWord, 0x00000002);
772 PHY_SetBBReg(pAdapter, rIQK_AGC_Cont, bMaskDWord, 0x00000000);
775 //RTPRINT(FINIT, INIT_IQK, ("Delay %d ms for One shot, path B LOK & IQK.\n", IQK_DELAY_TIME));
776 rtw_udelay_os(IQK_DELAY_TIME*1000);//PlatformStallExecution(IQK_DELAY_TIME*1000);
779 regEAC = PHY_QueryBBReg(pAdapter, rRx_Power_After_IQK_A_2, bMaskDWord);
780 //RTPRINT(FINIT, INIT_IQK, ("0xeac = 0x%x\n", regEAC));
781 regEB4 = PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_B, bMaskDWord);
782 //RTPRINT(FINIT, INIT_IQK, ("0xeb4 = 0x%x\n", regEB4));
783 regEBC= PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_B, bMaskDWord);
784 //RTPRINT(FINIT, INIT_IQK, ("0xebc = 0x%x\n", regEBC));
785 regEC4= PHY_QueryBBReg(pAdapter, rRx_Power_Before_IQK_B_2, bMaskDWord);
786 //RTPRINT(FINIT, INIT_IQK, ("0xec4 = 0x%x\n", regEC4));
787 regECC= PHY_QueryBBReg(pAdapter, rRx_Power_After_IQK_B_2, bMaskDWord);
788 //RTPRINT(FINIT, INIT_IQK, ("0xecc = 0x%x\n", regECC));
790 if(!(regEAC & BIT31) &&
791 (((regEB4 & 0x03FF0000)>>16) != 0x142) &&
792 (((regEBC & 0x03FF0000)>>16) != 0x42))
797 if(!(regEAC & BIT30) &&
798 (((regEC4 & 0x03FF0000)>>16) != 0x132) &&
799 (((regECC & 0x03FF0000)>>16) != 0x36))
802 DBG_8723A("Path B Rx IQK fail!!\n");
810 _PHY_PathAFillIQKMatrix(
811 IN PADAPTER pAdapter,
814 IN u8 final_candidate,
818 u32 Oldval_0, X, TX0_A, reg;
821 DBG_8723A("Path A IQ Calibration %s !\n",(bIQKOK)?"Success":"Failed");
823 if(final_candidate == 0xFF)
827 Oldval_0 = (PHY_QueryBBReg(pAdapter, rOFDM0_XATxIQImbalance, bMaskDWord) >> 22) & 0x3FF;
829 X = result[final_candidate][0];
830 if ((X & 0x00000200) != 0)
832 TX0_A = (X * Oldval_0) >> 8;
833 //RTPRINT(FINIT, INIT_IQK, ("X = 0x%lx, TX0_A = 0x%lx, Oldval_0 0x%lx\n", X, TX0_A, Oldval_0));
834 PHY_SetBBReg(pAdapter, rOFDM0_XATxIQImbalance, 0x3FF, TX0_A);
835 PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(31), ((X* Oldval_0>>7) & 0x1));
837 Y = result[final_candidate][1];
838 if ((Y & 0x00000200) != 0)
840 TX0_C = (Y * Oldval_0) >> 8;
841 //RTPRINT(FINIT, INIT_IQK, ("Y = 0x%lx, TX = 0x%lx\n", Y, TX0_C));
842 PHY_SetBBReg(pAdapter, rOFDM0_XCTxAFE, 0xF0000000, ((TX0_C&0x3C0)>>6));
843 PHY_SetBBReg(pAdapter, rOFDM0_XATxIQImbalance, 0x003F0000, (TX0_C&0x3F));
844 PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(29), ((Y* Oldval_0>>7) & 0x1));
848 DBG_8723A("_PHY_PathAFillIQKMatrix only Tx OK\n");
852 reg = result[final_candidate][2];
853 PHY_SetBBReg(pAdapter, rOFDM0_XARxIQImbalance, 0x3FF, reg);
855 reg = result[final_candidate][3] & 0x3F;
856 PHY_SetBBReg(pAdapter, rOFDM0_XARxIQImbalance, 0xFC00, reg);
858 reg = (result[final_candidate][3] >> 6) & 0xF;
859 PHY_SetBBReg(pAdapter, rOFDM0_RxIQExtAnta, 0xF0000000, reg);
864 _PHY_PathBFillIQKMatrix(
865 IN PADAPTER pAdapter,
868 IN u8 final_candidate,
869 IN bool bTxOnly //do Tx only
872 u32 Oldval_1, X, TX1_A, reg;
875 DBG_8723A("Path B IQ Calibration %s !\n",(bIQKOK)?"Success":"Failed");
877 if(final_candidate == 0xFF)
881 Oldval_1 = (PHY_QueryBBReg(pAdapter, rOFDM0_XBTxIQImbalance, bMaskDWord) >> 22) & 0x3FF;
883 X = result[final_candidate][4];
884 if ((X & 0x00000200) != 0)
886 TX1_A = (X * Oldval_1) >> 8;
887 //RTPRINT(FINIT, INIT_IQK, ("X = 0x%lx, TX1_A = 0x%lx\n", X, TX1_A));
888 PHY_SetBBReg(pAdapter, rOFDM0_XBTxIQImbalance, 0x3FF, TX1_A);
889 PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(27), ((X* Oldval_1>>7) & 0x1));
891 Y = result[final_candidate][5];
892 if ((Y & 0x00000200) != 0)
894 TX1_C = (Y * Oldval_1) >> 8;
895 //RTPRINT(FINIT, INIT_IQK, ("Y = 0x%lx, TX1_C = 0x%lx\n", Y, TX1_C));
896 PHY_SetBBReg(pAdapter, rOFDM0_XDTxAFE, 0xF0000000, ((TX1_C&0x3C0)>>6));
897 PHY_SetBBReg(pAdapter, rOFDM0_XBTxIQImbalance, 0x003F0000, (TX1_C&0x3F));
898 PHY_SetBBReg(pAdapter, rOFDM0_ECCAThreshold, BIT(25), ((Y* Oldval_1>>7) & 0x1));
903 reg = result[final_candidate][6];
904 PHY_SetBBReg(pAdapter, rOFDM0_XBRxIQImbalance, 0x3FF, reg);
906 reg = result[final_candidate][7] & 0x3F;
907 PHY_SetBBReg(pAdapter, rOFDM0_XBRxIQImbalance, 0xFC00, reg);
909 reg = (result[final_candidate][7] >> 6) & 0xF;
910 PHY_SetBBReg(pAdapter, rOFDM0_AGCRSSITable, 0x0000F000, reg);
915 _PHY_SaveADDARegisters(
916 IN PADAPTER pAdapter,
924 //RTPRINT(FINIT, INIT_IQK, ("Save ADDA parameters.\n"));
925 for( i = 0 ; i < RegisterNum ; i++){
926 ADDABackup[i] = PHY_QueryBBReg(pAdapter, ADDAReg[i], bMaskDWord);
931 _PHY_SaveMACRegisters(
932 IN PADAPTER pAdapter,
939 //RTPRINT(FINIT, INIT_IQK, ("Save MAC parameters.\n"));
940 for( i = 0 ; i < (IQK_MAC_REG_NUM - 1); i++){
941 MACBackup[i] =rtw_read8(pAdapter, MACReg[i]);
943 MACBackup[i] = rtw_read32(pAdapter, MACReg[i]);
948 _PHY_ReloadADDARegisters(
949 IN PADAPTER pAdapter,
957 //RTPRINT(FINIT, INIT_IQK, ("Reload ADDA power saving parameters !\n"));
958 for(i = 0 ; i < RegiesterNum ; i++){
959 PHY_SetBBReg(pAdapter, ADDAReg[i], bMaskDWord, ADDABackup[i]);
964 _PHY_ReloadMACRegisters(
965 IN PADAPTER pAdapter,
972 //RTPRINT(FINIT, INIT_IQK, ("Reload MAC parameters !\n"));
973 for(i = 0 ; i < (IQK_MAC_REG_NUM - 1); i++){
974 rtw_write8(pAdapter, MACReg[i], (u8)MACBackup[i]);
976 rtw_write32(pAdapter, MACReg[i], MACBackup[i]);
981 IN PADAPTER pAdapter,
990 //RTPRINT(FINIT, INIT_IQK, ("ADDA ON.\n"));
992 pathOn = isPathAOn ? 0x04db25a4 : 0x0b1b25a4;
995 PHY_SetBBReg(pAdapter, ADDAReg[0], bMaskDWord, 0x0b1b25a0);
998 PHY_SetBBReg(pAdapter, ADDAReg[0], bMaskDWord, pathOn);
1001 for( i = 1 ; i < IQK_ADDA_REG_NUM ; i++){
1002 PHY_SetBBReg(pAdapter, ADDAReg[i], bMaskDWord, pathOn);
1008 _PHY_MACSettingCalibration(
1009 IN PADAPTER pAdapter,
1016 //RTPRINT(FINIT, INIT_IQK, ("MAC settings for Calibration.\n"));
1018 rtw_write8(pAdapter, MACReg[i], 0x3F);
1020 for(i = 1 ; i < (IQK_MAC_REG_NUM - 1); i++){
1021 rtw_write8(pAdapter, MACReg[i], (u8)(MACBackup[i]&(~BIT3)));
1023 rtw_write8(pAdapter, MACReg[i], (u8)(MACBackup[i]&(~BIT5)));
1029 IN PADAPTER pAdapter
1032 //RTPRINT(FINIT, INIT_IQK, ("Path-A standby mode!\n"));
1034 PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0x0);
1035 PHY_SetBBReg(pAdapter, 0x840, bMaskDWord, 0x00010000);
1036 PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0x80800000);
1041 IN PADAPTER pAdapter,
1047 //RTPRINT(FINIT, INIT_IQK, ("BB Switch to %s mode!\n", (PIMode ? "PI" : "SI")));
1049 mode = PIMode ? 0x01000100 : 0x01000000;
1050 PHY_SetBBReg(pAdapter, 0x820, bMaskDWord, mode);
1051 PHY_SetBBReg(pAdapter, 0x828, bMaskDWord, mode);
1055 return _FALSE => do IQK again
1058 _PHY_SimularityCompare(
1059 IN PADAPTER pAdapter,
1065 u32 i, j, diff, SimularityBitMap, bound = 0;
1066 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
1067 u8 final_candidate[2] = {0xFF, 0xFF}; //for path A and path B
1068 bool bResult = _TRUE, is2T = IS_92C_SERIAL( pHalData->VersionID);
1075 SimularityBitMap = 0;
1077 for( i = 0; i < bound; i++ )
1079 diff = (result[c1][i] > result[c2][i]) ? (result[c1][i] - result[c2][i]) : (result[c2][i] - result[c1][i]);
1080 if (diff > MAX_TOLERANCE)
1082 if((i == 2 || i == 6) && !SimularityBitMap)
1084 if(result[c1][i]+result[c1][i+1] == 0)
1085 final_candidate[(i/4)] = c2;
1086 else if (result[c2][i]+result[c2][i+1] == 0)
1087 final_candidate[(i/4)] = c1;
1089 SimularityBitMap = SimularityBitMap|(1<<i);
1092 SimularityBitMap = SimularityBitMap|(1<<i);
1096 if ( SimularityBitMap == 0)
1098 for( i = 0; i < (bound/4); i++ )
1100 if(final_candidate[i] != 0xFF)
1102 for( j = i*4; j < (i+1)*4-2; j++)
1103 result[3][j] = result[final_candidate[i]][j];
1109 else if (!(SimularityBitMap & 0x0F)) //path A OK
1111 for(i = 0; i < 4; i++)
1112 result[3][i] = result[c1][i];
1115 else if (!(SimularityBitMap & 0xF0) && is2T) //path B OK
1117 for(i = 4; i < 8; i++)
1118 result[3][i] = result[c1][i];
1128 IN PADAPTER pAdapter,
1134 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
1135 struct dm_priv *pdmpriv = &pHalData->dmpriv;
1137 u8 PathAOK, PathBOK;
1138 u32 ADDA_REG[IQK_ADDA_REG_NUM] = {
1139 rFPGA0_XCD_SwitchControl, rBlue_Tooth,
1140 rRx_Wait_CCA, rTx_CCK_RFON,
1141 rTx_CCK_BBON, rTx_OFDM_RFON,
1142 rTx_OFDM_BBON, rTx_To_Rx,
1144 rRx_OFDM, rRx_Wait_RIFS,
1145 rRx_TO_Rx, rStandby,
1146 rSleep, rPMPD_ANAEN };
1148 u32 IQK_MAC_REG[IQK_MAC_REG_NUM] = {
1149 REG_TXPAUSE, REG_BCN_CTRL,
1150 REG_BCN_CTRL_1, REG_GPIO_MUXCFG};
1152 u32 IQK_BB_REG_92C[IQK_BB_REG_NUM] = {
1153 rOFDM0_TRxPathEnable, rOFDM0_TRMuxPar,
1154 rFPGA0_XCD_RFInterfaceSW, rConfig_AntA, rConfig_AntB,
1155 rFPGA0_XAB_RFInterfaceSW, rFPGA0_XA_RFInterfaceOE,
1156 rFPGA0_XB_RFInterfaceOE, rFPGA0_RFMOD
1160 const u32 retryCount = 9;
1162 const u32 retryCount = 2;
1165 // Note: IQ calibration must be performed after loading
1166 // PHY_REG.txt , and radio_a, radio_b.txt
1172 bbvalue = PHY_QueryBBReg(pAdapter, rFPGA0_RFMOD, bMaskDWord);
1173 //RTPRINT(FINIT, INIT_IQK, ("PHY_IQCalibrate()==>0x%08lx\n",bbvalue));
1175 //RTPRINT(FINIT, INIT_IQK, ("IQ Calibration for %s\n", (is2T ? "2T2R" : "1T1R")));
1177 // Save ADDA parameters, turn Path A ADDA on
1178 _PHY_SaveADDARegisters(pAdapter, ADDA_REG, pdmpriv->ADDA_backup,IQK_ADDA_REG_NUM);
1179 _PHY_SaveMACRegisters(pAdapter, IQK_MAC_REG, pdmpriv->IQK_MAC_backup);
1180 _PHY_SaveADDARegisters(pAdapter, IQK_BB_REG_92C, pdmpriv->IQK_BB_backup, IQK_BB_REG_NUM);
1182 _PHY_PathADDAOn(pAdapter, ADDA_REG, _TRUE, is2T);
1186 pdmpriv->bRfPiEnable = (u8)PHY_QueryBBReg(pAdapter, rFPGA0_XA_HSSIParameter1, BIT(8));
1189 if(!pdmpriv->bRfPiEnable){
1190 // Switch BB to PI mode to do IQ Calibration.
1191 _PHY_PIModeSwitch(pAdapter, _TRUE);
1194 PHY_SetBBReg(pAdapter, rFPGA0_RFMOD, BIT24, 0x00);
1195 PHY_SetBBReg(pAdapter, rOFDM0_TRxPathEnable, bMaskDWord, 0x03a05600);
1196 PHY_SetBBReg(pAdapter, rOFDM0_TRMuxPar, bMaskDWord, 0x000800e4);
1197 PHY_SetBBReg(pAdapter, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, 0x22204000);
1198 PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT10, 0x01);
1199 PHY_SetBBReg(pAdapter, rFPGA0_XAB_RFInterfaceSW, BIT26, 0x01);
1200 PHY_SetBBReg(pAdapter, rFPGA0_XA_RFInterfaceOE, BIT10, 0x00);
1201 PHY_SetBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT10, 0x00);
1205 PHY_SetBBReg(pAdapter, rFPGA0_XA_LSSIParameter, bMaskDWord, 0x00010000);
1206 PHY_SetBBReg(pAdapter, rFPGA0_XB_LSSIParameter, bMaskDWord, 0x00010000);
1210 _PHY_MACSettingCalibration(pAdapter, IQK_MAC_REG, pdmpriv->IQK_MAC_backup);
1213 PHY_SetBBReg(pAdapter, rConfig_AntA, bMaskDWord, 0x00080000);
1217 PHY_SetBBReg(pAdapter, rConfig_AntB, bMaskDWord, 0x00080000);
1220 // IQ calibration setting
1221 //RTPRINT(FINIT, INIT_IQK, ("IQK setting!\n"));
1222 PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0x80800000);
1223 PHY_SetBBReg(pAdapter, rTx_IQK, bMaskDWord, 0x01007c00);
1224 PHY_SetBBReg(pAdapter, rRx_IQK, bMaskDWord, 0x01004800);
1226 for(i = 0 ; i < retryCount ; i++){
1227 PathAOK = _PHY_PathA_IQK(pAdapter, is2T);
1228 if(PathAOK == 0x03){
1229 DBG_8723A("Path A IQK Success!!\n");
1230 result[t][0] = (PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_A, bMaskDWord)&0x3FF0000)>>16;
1231 result[t][1] = (PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_A, bMaskDWord)&0x3FF0000)>>16;
1232 result[t][2] = (PHY_QueryBBReg(pAdapter, rRx_Power_Before_IQK_A_2, bMaskDWord)&0x3FF0000)>>16;
1233 result[t][3] = (PHY_QueryBBReg(pAdapter, rRx_Power_After_IQK_A_2, bMaskDWord)&0x3FF0000)>>16;
1236 else if (i == (retryCount-1) && PathAOK == 0x01) //Tx IQK OK
1238 DBG_8723A("Path A IQK Only Tx Success!!\n");
1240 result[t][0] = (PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_A, bMaskDWord)&0x3FF0000)>>16;
1241 result[t][1] = (PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_A, bMaskDWord)&0x3FF0000)>>16;
1245 if(0x00 == PathAOK){
1246 DBG_8723A("Path A IQK failed!!\n");
1250 _PHY_PathAStandBy(pAdapter);
1252 // Turn Path B ADDA on
1253 _PHY_PathADDAOn(pAdapter, ADDA_REG, _FALSE, is2T);
1255 for(i = 0 ; i < retryCount ; i++){
1256 PathBOK = _PHY_PathB_IQK(pAdapter);
1257 if(PathBOK == 0x03){
1258 DBG_8723A("Path B IQK Success!!\n");
1259 result[t][4] = (PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_B, bMaskDWord)&0x3FF0000)>>16;
1260 result[t][5] = (PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_B, bMaskDWord)&0x3FF0000)>>16;
1261 result[t][6] = (PHY_QueryBBReg(pAdapter, rRx_Power_Before_IQK_B_2, bMaskDWord)&0x3FF0000)>>16;
1262 result[t][7] = (PHY_QueryBBReg(pAdapter, rRx_Power_After_IQK_B_2, bMaskDWord)&0x3FF0000)>>16;
1265 else if (i == (retryCount - 1) && PathBOK == 0x01) //Tx IQK OK
1267 DBG_8723A("Path B Only Tx IQK Success!!\n");
1268 result[t][4] = (PHY_QueryBBReg(pAdapter, rTx_Power_Before_IQK_B, bMaskDWord)&0x3FF0000)>>16;
1269 result[t][5] = (PHY_QueryBBReg(pAdapter, rTx_Power_After_IQK_B, bMaskDWord)&0x3FF0000)>>16;
1273 if(0x00 == PathBOK){
1274 DBG_8723A("Path B IQK failed!!\n");
1278 //Back to BB mode, load original value
1279 //RTPRINT(FINIT, INIT_IQK, ("IQK:Back to BB mode, load original value!\n"));
1280 PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0);
1284 if(!pdmpriv->bRfPiEnable){
1285 // Switch back BB to SI mode after finish IQ Calibration.
1286 _PHY_PIModeSwitch(pAdapter, _FALSE);
1289 // Reload ADDA power saving parameters
1290 _PHY_ReloadADDARegisters(pAdapter, ADDA_REG, pdmpriv->ADDA_backup, IQK_ADDA_REG_NUM);
1292 // Reload MAC parameters
1293 _PHY_ReloadMACRegisters(pAdapter, IQK_MAC_REG, pdmpriv->IQK_MAC_backup);
1295 // Reload BB parameters
1296 _PHY_ReloadADDARegisters(pAdapter, IQK_BB_REG_92C, pdmpriv->IQK_BB_backup, IQK_BB_REG_NUM);
1298 // Restore RX initial gain
1299 PHY_SetBBReg(pAdapter, rFPGA0_XA_LSSIParameter, bMaskDWord, 0x00032ed3);
1301 PHY_SetBBReg(pAdapter, rFPGA0_XB_LSSIParameter, bMaskDWord, 0x00032ed3);
1304 //load 0xe30 IQC default value
1305 PHY_SetBBReg(pAdapter, rTx_IQK_Tone_A, bMaskDWord, 0x01008c00);
1306 PHY_SetBBReg(pAdapter, rRx_IQK_Tone_A, bMaskDWord, 0x01008c00);
1309 //RTPRINT(FINIT, INIT_IQK, ("_PHY_IQCalibrate() <==\n"));
1316 IN PADAPTER pAdapter,
1321 u32 RF_Amode = 0, RF_Bmode = 0, LC_Cal;
1323 //Check continuous TX and Packet TX
1324 tmpReg = rtw_read8(pAdapter, 0xd03);
1326 if((tmpReg&0x70) != 0) //Deal with contisuous TX case
1327 rtw_write8(pAdapter, 0xd03, tmpReg&0x8F); //disable all continuous TX
1328 else // Deal with Packet TX case
1329 rtw_write8(pAdapter, REG_TXPAUSE, 0xFF); // block all queues
1331 if((tmpReg&0x70) != 0)
1333 //1. Read original RF mode
1335 RF_Amode = PHY_QueryRFReg(pAdapter, RF_PATH_A, RF_AC, bMask12Bits);
1339 RF_Bmode = PHY_QueryRFReg(pAdapter, RF_PATH_B, RF_AC, bMask12Bits);
1341 //2. Set RF mode = standby mode
1343 PHY_SetRFReg(pAdapter, RF_PATH_A, RF_AC, bMask12Bits, (RF_Amode&0x8FFFF)|0x10000);
1347 PHY_SetRFReg(pAdapter, RF_PATH_B, RF_AC, bMask12Bits, (RF_Bmode&0x8FFFF)|0x10000);
1351 LC_Cal = PHY_QueryRFReg(pAdapter, RF_PATH_A, RF_CHNLBW, bMask12Bits);
1353 //4. Set LC calibration begin
1354 PHY_SetRFReg(pAdapter, RF_PATH_A, RF_CHNLBW, bMask12Bits, LC_Cal|0x08000);
1356 #ifdef CONFIG_LONG_DELAY_ISSUE
1362 //Restore original situation
1363 if((tmpReg&0x70) != 0) //Deal with contisuous TX case
1366 rtw_write8(pAdapter, 0xd03, tmpReg);
1367 PHY_SetRFReg(pAdapter, RF_PATH_A, RF_AC, bMask12Bits, RF_Amode);
1371 PHY_SetRFReg(pAdapter, RF_PATH_B, RF_AC, bMask12Bits, RF_Bmode);
1373 else // Deal with Packet TX case
1375 rtw_write8(pAdapter, REG_TXPAUSE, 0x00);
1381 //Analog Pre-distortion calibration
1382 #define APK_BB_REG_NUM 8
1383 #define APK_CURVE_REG_NUM 4
1388 IN PADAPTER pAdapter,
1393 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
1394 struct dm_priv *pdmpriv = &pHalData->dmpriv;
1397 u32 tmpReg, index, offset, i, apkbound;
1398 u8 path, pathbound = PATH_NUM;
1399 u32 BB_backup[APK_BB_REG_NUM];
1400 u32 BB_REG[APK_BB_REG_NUM] = {
1401 rFPGA1_TxBlock, rOFDM0_TRxPathEnable,
1402 rFPGA0_RFMOD, rOFDM0_TRMuxPar,
1403 rFPGA0_XCD_RFInterfaceSW, rFPGA0_XAB_RFInterfaceSW,
1404 rFPGA0_XA_RFInterfaceOE, rFPGA0_XB_RFInterfaceOE };
1405 u32 BB_AP_MODE[APK_BB_REG_NUM] = {
1406 0x00000020, 0x00a05430, 0x02040000,
1407 0x000800e4, 0x00204000 };
1408 u32 BB_normal_AP_MODE[APK_BB_REG_NUM] = {
1409 0x00000020, 0x00a05430, 0x02040000,
1410 0x000800e4, 0x22204000 };
1412 u32 AFE_backup[IQK_ADDA_REG_NUM];
1413 u32 AFE_REG[IQK_ADDA_REG_NUM] = {
1414 rFPGA0_XCD_SwitchControl, rBlue_Tooth,
1415 rRx_Wait_CCA, rTx_CCK_RFON,
1416 rTx_CCK_BBON, rTx_OFDM_RFON,
1417 rTx_OFDM_BBON, rTx_To_Rx,
1419 rRx_OFDM, rRx_Wait_RIFS,
1420 rRx_TO_Rx, rStandby,
1421 rSleep, rPMPD_ANAEN };
1423 u32 MAC_backup[IQK_MAC_REG_NUM];
1424 u32 MAC_REG[IQK_MAC_REG_NUM] = {
1425 REG_TXPAUSE, REG_BCN_CTRL,
1426 REG_BCN_CTRL_1, REG_GPIO_MUXCFG};
1428 u32 APK_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = {
1429 {0x0852c, 0x1852c, 0x5852c, 0x1852c, 0x5852c},
1430 {0x2852e, 0x0852e, 0x3852e, 0x0852e, 0x0852e}
1433 u32 APK_normal_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = {
1434 {0x0852c, 0x0a52c, 0x3a52c, 0x5a52c, 0x5a52c}, //path settings equal to path b settings
1435 {0x0852c, 0x0a52c, 0x5a52c, 0x5a52c, 0x5a52c}
1438 u32 APK_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = {
1439 {0x52019, 0x52014, 0x52013, 0x5200f, 0x5208d},
1440 {0x5201a, 0x52019, 0x52016, 0x52033, 0x52050}
1443 u32 APK_normal_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = {
1444 {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a}, //path settings equal to path b settings
1445 {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a}
1447 u32 AFE_on_off[PATH_NUM] = {
1448 0x04db25a4, 0x0b1b25a4}; //path A on path B off / path A off path B on
1450 u32 APK_offset[PATH_NUM] = {
1451 rConfig_AntA, rConfig_AntB};
1453 u32 APK_normal_offset[PATH_NUM] = {
1454 rConfig_Pmpd_AntA, rConfig_Pmpd_AntB};
1456 u32 APK_value[PATH_NUM] = {
1457 0x92fc0000, 0x12fc0000};
1459 u32 APK_normal_value[PATH_NUM] = {
1460 0x92680000, 0x12680000};
1462 char APK_delta_mapping[APK_BB_REG_NUM][13] = {
1463 {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},
1464 {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},
1465 {-6, -4, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},
1466 {-1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6},
1467 {-11, -9, -7, -5, -3, -1, 0, 0, 0, 0, 0, 0, 0}
1470 u32 APK_normal_setting_value_1[13] = {
1471 0x01017018, 0xf7ed8f84, 0x1b1a1816, 0x2522201e, 0x322e2b28,
1472 0x433f3a36, 0x5b544e49, 0x7b726a62, 0xa69a8f84, 0xdfcfc0b3,
1473 0x12680000, 0x00880000, 0x00880000
1476 u32 APK_normal_setting_value_2[16] = {
1477 0x01c7021d, 0x01670183, 0x01000123, 0x00bf00e2, 0x008d00a3,
1478 0x0068007b, 0x004d0059, 0x003a0042, 0x002b0031, 0x001f0025,
1479 0x0017001b, 0x00110014, 0x000c000f, 0x0009000b, 0x00070008,
1483 u32 APK_result[PATH_NUM][APK_BB_REG_NUM]; //val_1_1a, val_1_2a, val_2a, val_3a, val_4a
1484 //u32 AP_curve[PATH_NUM][APK_CURVE_REG_NUM];
1486 int BB_offset, delta_V, delta_offset;
1488 #if (MP_DRIVER == 1)
1489 PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx;
1491 pMptCtx->APK_bound[0] = 45;
1492 pMptCtx->APK_bound[1] = 52;
1495 //RTPRINT(FINIT, INIT_IQK, ("==>PHY_APCalibrate() delta %d\n", delta));
1497 //RTPRINT(FINIT, INIT_IQK, ("AP Calibration for %s %s\n", (is2T ? "2T2R" : "1T1R"), (isNormal ? "Normal chip" : "Test chip")));
1502 //2 FOR NORMAL CHIP SETTINGS
1504 // Temporarily do not allow normal driver to do the following settings because these offset
1505 // and value will cause RF internal PA to be unpredictably disabled by HW, such that RF Tx signal
1506 // will disappear after disable/enable card many times on 88CU. RF SD and DD have not find the
1507 // root cause, so we remove these actions temporarily. Added by tynli and SD3 Allen. 2010.05.31.
1508 #if (MP_DRIVER != 1)
1512 //settings adjust for normal chip
1513 for(index = 0; index < PATH_NUM; index ++)
1515 APK_offset[index] = APK_normal_offset[index];
1516 APK_value[index] = APK_normal_value[index];
1517 AFE_on_off[index] = 0x6fdb25a4;
1520 for(index = 0; index < APK_BB_REG_NUM; index ++)
1522 for(path = 0; path < pathbound; path++)
1524 APK_RF_init_value[path][index] = APK_normal_RF_init_value[path][index];
1525 APK_RF_value_0[path][index] = APK_normal_RF_value_0[path][index];
1527 BB_AP_MODE[index] = BB_normal_AP_MODE[index];
1532 //save BB default value
1533 for(index = 0; index < APK_BB_REG_NUM ; index++)
1535 if(index == 0) //skip
1537 BB_backup[index] = PHY_QueryBBReg(pAdapter, BB_REG[index], bMaskDWord);
1540 //save MAC default value
1541 _PHY_SaveMACRegisters(pAdapter, MAC_REG, MAC_backup);
1543 //save AFE default value
1544 _PHY_SaveADDARegisters(pAdapter, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM);
1546 for(path = 0; path < pathbound; path++)
1548 if(path == RF_PATH_A)
1554 for(index = 0; index < 11; index ++)
1556 PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]);
1557 //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord)));
1562 PHY_SetBBReg(pAdapter, rConfig_Pmpd_AntB, bMaskDWord, 0x12680000);
1564 offset = rConfig_AntA;
1565 for(; index < 13; index ++)
1567 PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]);
1568 //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord)));
1574 PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0x40000000);
1578 for(index = 0; index < 16; index++)
1580 PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_2[index]);
1581 //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord)));
1585 PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0x00000000);
1587 else if(path == RF_PATH_B)
1593 for(index = 0; index < 10; index ++)
1595 PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]);
1596 //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord)));
1600 PHY_SetBBReg(pAdapter, rConfig_Pmpd_AntA, bMaskDWord, 0x12680000);
1602 PHY_SetBBReg(pAdapter, rConfig_Pmpd_AntB, bMaskDWord, 0x12680000);
1604 offset = rConfig_AntA;
1606 for(; index < 13; index ++) //offset 0xb68, 0xb6c
1608 PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_1[index]);
1609 //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord)));
1615 PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0x40000000);
1619 for(index = 0; index < 16; index++)
1621 PHY_SetBBReg(pAdapter, offset, bMaskDWord, APK_normal_setting_value_2[index]);
1622 //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", offset, PHY_QueryBBReg(pAdapter, offset, bMaskDWord)));
1626 PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0x00000000);
1629 //save RF default value
1630 regD[path] = PHY_QueryRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_TXBIAS_A, bRFRegOffsetMask);
1632 //Path A AFE all on, path B AFE All off or vise versa
1633 for(index = 0; index < IQK_ADDA_REG_NUM ; index++)
1634 PHY_SetBBReg(pAdapter, AFE_REG[index], bMaskDWord, AFE_on_off[path]);
1635 //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0xe70 %x\n", PHY_QueryBBReg(pAdapter, 0xe70, bMaskDWord)));
1640 for(index = 0; index < APK_BB_REG_NUM ; index++)
1642 if(index == 0) //skip
1645 PHY_SetBBReg(pAdapter, BB_REG[index], bMaskDWord, BB_AP_MODE[index]);
1646 else if (BB_REG[index] == 0x870)
1647 PHY_SetBBReg(pAdapter, BB_REG[index], bMaskDWord, BB_backup[index]|BIT10|BIT26);
1649 PHY_SetBBReg(pAdapter, BB_REG[index], BIT10, 0x0);
1651 PHY_SetBBReg(pAdapter, rTx_IQK_Tone_A, bMaskDWord, 0x01008c00);
1652 PHY_SetBBReg(pAdapter, rRx_IQK_Tone_A, bMaskDWord, 0x01008c00);
1656 PHY_SetBBReg(pAdapter, rTx_IQK_Tone_B, bMaskDWord, 0x01008c00);
1657 PHY_SetBBReg(pAdapter, rRx_IQK_Tone_B, bMaskDWord, 0x01008c00);
1660 //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x800 %x\n", PHY_QueryBBReg(pAdapter, 0x800, bMaskDWord)));
1663 _PHY_MACSettingCalibration(pAdapter, MAC_REG, MAC_backup);
1665 if(path == RF_PATH_A) //Path B to standby mode
1667 PHY_SetRFReg(pAdapter, RF_PATH_B, RF_AC, bRFRegOffsetMask, 0x10000);
1669 else //Path A to standby mode
1671 PHY_SetRFReg(pAdapter, RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x10000);
1672 PHY_SetRFReg(pAdapter, RF_PATH_A, RF_MODE1, bRFRegOffsetMask, 0x1000f);
1673 PHY_SetRFReg(pAdapter, RF_PATH_A, RF_MODE2, bRFRegOffsetMask, 0x20103);
1676 delta_offset = ((delta+14)/2);
1677 if(delta_offset < 0)
1679 else if (delta_offset > 12)
1683 for(index = 0; index < APK_BB_REG_NUM; index++)
1685 if(index != 1) //only DO PA11+PAD01001, AP RF setting
1688 tmpReg = APK_RF_init_value[path][index];
1690 if(!pdmpriv->bAPKThermalMeterIgnore)
1692 BB_offset = (tmpReg & 0xF0000) >> 16;
1694 if(!(tmpReg & BIT15)) //sign bit 0
1696 BB_offset = -BB_offset;
1699 delta_V = APK_delta_mapping[index][delta_offset];
1701 BB_offset += delta_V;
1703 //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() APK num %d delta_V %d delta_offset %d\n", index, delta_V, delta_offset));
1707 tmpReg = tmpReg & (~BIT15);
1708 BB_offset = -BB_offset;
1712 tmpReg = tmpReg | BIT15;
1714 tmpReg = (tmpReg & 0xFFF0FFFF) | (BB_offset << 16);
1718 #ifdef CONFIG_PCI_HCI
1719 if(IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID))
1720 PHY_SetRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_IPA_A, bRFRegOffsetMask, 0x894ae);
1723 PHY_SetRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_IPA_A, bRFRegOffsetMask, 0x8992e);
1724 //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0xc %x\n", PHY_QueryRFReg(pAdapter, (RF_RADIO_PATH_E)path, 0xc, bMaskDWord)));
1725 PHY_SetRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_AC, bRFRegOffsetMask, APK_RF_value_0[path][index]);
1726 //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x0 %x\n", PHY_QueryRFReg(pAdapter, (RF_RADIO_PATH_E)path, 0x0, bMaskDWord)));
1727 PHY_SetRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_TXBIAS_A, bRFRegOffsetMask, tmpReg);
1728 //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0xd %x\n", PHY_QueryRFReg(pAdapter, (RF_RADIO_PATH_E)path, 0xd, bMaskDWord)));
1730 // PA11+PAD01111, one shot
1734 PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0x80000000);
1736 PHY_SetBBReg(pAdapter, APK_offset[path], bMaskDWord, APK_value[0]);
1737 //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", APK_offset[path], PHY_QueryBBReg(pAdapter, APK_offset[path], bMaskDWord)));
1739 PHY_SetBBReg(pAdapter, APK_offset[path], bMaskDWord, APK_value[1]);
1740 //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0x%x value 0x%x\n", APK_offset[path], PHY_QueryBBReg(pAdapter, APK_offset[path], bMaskDWord)));
1741 #ifdef CONFIG_LONG_DELAY_ISSUE
1747 PHY_SetBBReg(pAdapter, rFPGA0_IQK, bMaskDWord, 0x00000000);
1749 if(path == RF_PATH_A)
1750 tmpReg = PHY_QueryBBReg(pAdapter, rAPK, 0x03E00000);
1752 tmpReg = PHY_QueryBBReg(pAdapter, rAPK, 0xF8000000);
1753 //RTPRINT(FINIT, INIT_IQK, ("PHY_APCalibrate() offset 0xbd8[25:21] %x\n", tmpReg));
1757 while(tmpReg > apkbound && i < 4);
1759 APK_result[path][index] = tmpReg;
1763 //reload MAC default value
1764 _PHY_ReloadMACRegisters(pAdapter, MAC_REG, MAC_backup);
1766 //reload BB default value
1767 for(index = 0; index < APK_BB_REG_NUM ; index++)
1769 if(index == 0) //skip
1771 PHY_SetBBReg(pAdapter, BB_REG[index], bMaskDWord, BB_backup[index]);
1774 //reload AFE default value
1775 _PHY_ReloadADDARegisters(pAdapter, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM);
1777 //reload RF path default value
1778 for(path = 0; path < pathbound; path++)
1780 PHY_SetRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_TXBIAS_A, bRFRegOffsetMask, regD[path]);
1781 if(path == RF_PATH_B)
1783 PHY_SetRFReg(pAdapter, RF_PATH_A, RF_MODE1, bRFRegOffsetMask, 0x1000f);
1784 PHY_SetRFReg(pAdapter, RF_PATH_A, RF_MODE2, bRFRegOffsetMask, 0x20101);
1787 //note no index == 0
1788 if (APK_result[path][1] > 6)
1789 APK_result[path][1] = 6;
1790 //RTPRINT(FINIT, INIT_IQK, ("apk path %d result %d 0x%x \t", path, 1, APK_result[path][1]));
1793 //RTPRINT(FINIT, INIT_IQK, ("\n"));
1796 for(path = 0; path < pathbound; path++)
1798 PHY_SetRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_BS_PA_APSET_G1_G4, bRFRegOffsetMask,
1799 ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (APK_result[path][1] << 5) | APK_result[path][1]));
1800 if(path == RF_PATH_A)
1801 PHY_SetRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_BS_PA_APSET_G5_G8, bRFRegOffsetMask,
1802 ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x00 << 5) | 0x05));
1804 PHY_SetRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_BS_PA_APSET_G5_G8, bRFRegOffsetMask,
1805 ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x02 << 5) | 0x05));
1806 PHY_SetRFReg(pAdapter, (RF_RADIO_PATH_E)path, RF_BS_PA_APSET_G9_G11, bRFRegOffsetMask,
1807 ((0x08 << 15) | (0x08 << 10) | (0x08 << 5) | 0x08));
1810 pdmpriv->bAPKdone = _TRUE;
1812 //RTPRINT(FINIT, INIT_IQK, ("<==PHY_APCalibrate()\n"));
1816 rtl8192c_PHY_IQCalibrate(
1817 IN PADAPTER pAdapter,
1821 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
1822 struct dm_priv *pdmpriv = &pHalData->dmpriv;
1823 s32 result[4][8]; //last is final result
1824 u8 i, final_candidate;
1825 bool bPathAOK, bPathBOK;
1826 s32 RegE94, RegE9C, RegEA4, RegEAC, RegEB4, RegEBC, RegEC4, RegECC, RegTmp = 0;
1827 bool is12simular, is13simular, is23simular;
1828 bool bStartContTx = _FALSE, bSingleTone = _FALSE, bCarrierSuppression = _FALSE;
1829 u32 IQK_BB_REG_92C[IQK_BB_REG_NUM] = {
1830 rOFDM0_XARxIQImbalance, rOFDM0_XBRxIQImbalance,
1831 rOFDM0_ECCAThreshold, rOFDM0_AGCRSSITable,
1832 rOFDM0_XATxIQImbalance, rOFDM0_XBTxIQImbalance,
1833 rOFDM0_XCTxAFE, rOFDM0_XDTxAFE,
1834 rOFDM0_RxIQExtAnta};
1838 bStartContTx = pAdapter->mppriv.MptCtx.bStartContTx;
1839 bSingleTone = pAdapter->mppriv.MptCtx.bSingleTone;
1840 bCarrierSuppression = pAdapter->mppriv.MptCtx.bCarrierSuppression;
1843 //ignore IQK when continuous Tx
1844 if(bStartContTx || bSingleTone || bCarrierSuppression)
1853 _PHY_ReloadADDARegisters(pAdapter, IQK_BB_REG_92C, pdmpriv->IQK_BB_backup_recover, 9);
1856 DBG_8723A("IQK:Start!!!\n");
1858 for(i = 0; i < 8; i++)
1865 final_candidate = 0xff;
1868 is12simular = _FALSE;
1869 is23simular = _FALSE;
1870 is13simular = _FALSE;
1874 if(IS_92C_SERIAL( pHalData->VersionID)){
1875 _PHY_IQCalibrate(pAdapter, result, i, _TRUE);
1879 _PHY_IQCalibrate(pAdapter, result, i, _FALSE);
1884 is12simular = _PHY_SimularityCompare(pAdapter, result, 0, 1);
1887 final_candidate = 0;
1894 is13simular = _PHY_SimularityCompare(pAdapter, result, 0, 2);
1897 final_candidate = 0;
1901 is23simular = _PHY_SimularityCompare(pAdapter, result, 1, 2);
1903 final_candidate = 1;
1906 for(i = 0; i < 8; i++)
1907 RegTmp += result[3][i];
1910 final_candidate = 3;
1912 final_candidate = 0xFF;
1919 RegE94 = result[i][0];
1920 RegE9C = result[i][1];
1921 RegEA4 = result[i][2];
1922 RegEAC = result[i][3];
1923 RegEB4 = result[i][4];
1924 RegEBC = result[i][5];
1925 RegEC4 = result[i][6];
1926 RegECC = result[i][7];
1927 //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));
1930 if(final_candidate != 0xff)
1932 pdmpriv->RegE94 = RegE94 = result[final_candidate][0];
1933 pdmpriv->RegE9C = RegE9C = result[final_candidate][1];
1934 RegEA4 = result[final_candidate][2];
1935 RegEAC = result[final_candidate][3];
1936 pdmpriv->RegEB4 = RegEB4 = result[final_candidate][4];
1937 pdmpriv->RegEBC = RegEBC = result[final_candidate][5];
1938 RegEC4 = result[final_candidate][6];
1939 RegECC = result[final_candidate][7];
1940 DBG_8723A("IQK: final_candidate is %x\n", final_candidate);
1941 DBG_8723A("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);
1942 bPathAOK = bPathBOK = _TRUE;
1946 RegE94 = RegEB4 = pdmpriv->RegE94 = pdmpriv->RegEB4 = 0x100; //X default value
1947 RegE9C = RegEBC = pdmpriv->RegE9C = pdmpriv->RegEBC = 0x0; //Y default value
1950 if((RegE94 != 0)/*&&(RegEA4 != 0)*/)
1951 _PHY_PathAFillIQKMatrix(pAdapter, bPathAOK, result, final_candidate, (RegEA4 == 0));
1953 if(IS_92C_SERIAL( pHalData->VersionID)){
1954 if((RegEB4 != 0)/*&&(RegEC4 != 0)*/)
1955 _PHY_PathBFillIQKMatrix(pAdapter, bPathBOK, result, final_candidate, (RegEC4 == 0));
1958 _PHY_SaveADDARegisters(pAdapter, IQK_BB_REG_92C, pdmpriv->IQK_BB_backup_recover, 9);
1964 rtl8192c_PHY_LCCalibrate(
1965 IN PADAPTER pAdapter
1968 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
1969 struct mlme_ext_priv *pmlmeext = &pAdapter->mlmeextpriv;
1970 bool bStartContTx = _FALSE, bSingleTone = _FALSE, bCarrierSuppression = _FALSE;
1973 bStartContTx = pAdapter->mppriv.MptCtx.bStartContTx;
1974 bSingleTone = pAdapter->mppriv.MptCtx.bSingleTone;
1975 bCarrierSuppression = pAdapter->mppriv.MptCtx.bCarrierSuppression;
1982 //ignore IQK when continuous Tx
1983 if(bStartContTx || bSingleTone || bCarrierSuppression)
1986 if(pmlmeext->sitesurvey_res.state == SCAN_PROCESS)
1989 if(IS_92C_SERIAL( pHalData->VersionID)){
1990 _PHY_LCCalibrate(pAdapter, _TRUE);
1994 _PHY_LCCalibrate(pAdapter, _FALSE);
1999 rtl8192c_PHY_APCalibrate(
2000 IN PADAPTER pAdapter,