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 #include "Mp_Precomp.h"
21 #include "phydm_precomp.h"
29 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
30 PCFO_TRACKING pCfoTrack = (PCFO_TRACKING)PhyDM_Get_Structure( pDM_Odm, PHYDM_CFOTRACK);
32 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
33 PADAPTER Adapter = pDM_Odm->Adapter;
34 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
36 bEEPROMCheck = (pHalData->EEPROMVersion >= 0x01)?TRUE:FALSE;
41 if(pCfoTrack->CrystalCap == CrystalCap)
44 pCfoTrack->CrystalCap = CrystalCap;
46 if(pDM_Odm->SupportICType & ODM_RTL8192D)
48 ODM_SetBBReg(pDM_Odm, REG_AFE_XTAL_CTRL, 0x000000F0, CrystalCap & 0x0F);
49 ODM_SetBBReg(pDM_Odm, REG_AFE_PLL_CTRL, 0xF0000000, ((CrystalCap & 0xF0) >> 4));
51 else if(pDM_Odm->SupportICType & ODM_RTL8188E)
53 // write 0x24[22:17] = 0x24[16:11] = CrystalCap
54 CrystalCap = CrystalCap & 0x3F;
55 ODM_SetBBReg(pDM_Odm, REG_AFE_XTAL_CTRL, 0x007ff800, (CrystalCap | (CrystalCap << 6)));
57 else if(pDM_Odm->SupportICType & ODM_RTL8812)
59 // write 0x2C[30:25] = 0x2C[24:19] = CrystalCap
60 CrystalCap = CrystalCap & 0x3F;
61 ODM_SetBBReg(pDM_Odm, REG_MAC_PHY_CTRL, 0x7FF80000, (CrystalCap | (CrystalCap << 6)));
63 else if (((pDM_Odm->SupportICType & ODM_RTL8723A) && bEEPROMCheck) ||
64 (pDM_Odm->SupportICType & ODM_RTL8723B) ||(pDM_Odm->SupportICType & ODM_RTL8192E) ||
65 (pDM_Odm->SupportICType & ODM_RTL8821))
67 // 0x2C[23:18] = 0x2C[17:12] = CrystalCap
68 CrystalCap = CrystalCap & 0x3F;
69 ODM_SetBBReg(pDM_Odm, REG_MAC_PHY_CTRL, 0x00FFF000, (CrystalCap | (CrystalCap << 6)));
71 else if(pDM_Odm->SupportICType & ODM_RTL8821B)
73 // write 0x28[6:1] = 0x24[30:25] = CrystalCap
74 CrystalCap = CrystalCap & 0x3F;
75 ODM_SetBBReg(pDM_Odm, REG_AFE_XTAL_CTRL, 0x7E000000, CrystalCap);
76 ODM_SetBBReg(pDM_Odm, REG_AFE_PLL_CTRL, 0x7E, CrystalCap);
78 else if(pDM_Odm->SupportICType & ODM_RTL8814A)
80 // write 0x2C[26:21] = 0x2C[20:15] = CrystalCap
81 CrystalCap = CrystalCap & 0x3F;
82 ODM_SetBBReg(pDM_Odm, REG_MAC_PHY_CTRL, 0x07FF8000, (CrystalCap | (CrystalCap << 6)));
86 ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("odm_SetCrystalCap(): Use default setting.\n"));
87 ODM_SetBBReg(pDM_Odm, REG_MAC_PHY_CTRL, 0xFFF000, (CrystalCap | (CrystalCap << 6)));
90 ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("odm_SetCrystalCap(): CrystalCap = 0x%x\n", CrystalCap));
94 odm_GetDefaultCrytaltalCap(
98 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
99 u1Byte CrystalCap = 0x20;
101 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
102 PADAPTER Adapter = pDM_Odm->Adapter;
103 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
105 CrystalCap = pHalData->CrystalCap;
107 prtl8192cd_priv priv = pDM_Odm->priv;
109 if(priv->pmib->dot11RFEntry.xcap > 0)
110 CrystalCap = priv->pmib->dot11RFEntry.xcap;
113 CrystalCap = CrystalCap & 0x3f;
124 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
125 PCFO_TRACKING pCfoTrack = (PCFO_TRACKING)PhyDM_Get_Structure( pDM_Odm, PHYDM_CFOTRACK);
127 if(pCfoTrack->bATCStatus == ATCStatus)
130 ODM_SetBBReg(pDM_Odm, ODM_REG(BB_ATC,pDM_Odm), ODM_BIT(BB_ATC,pDM_Odm), ATCStatus);
131 pCfoTrack->bATCStatus = ATCStatus;
140 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
142 ATCStatus = (BOOLEAN)ODM_GetBBReg(pDM_Odm, ODM_REG(BB_ATC,pDM_Odm), ODM_BIT(BB_ATC,pDM_Odm));
147 ODM_CfoTrackingReset(
151 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
152 PCFO_TRACKING pCfoTrack = (PCFO_TRACKING)PhyDM_Get_Structure( pDM_Odm, PHYDM_CFOTRACK);
155 pCfoTrack->DefXCap = odm_GetDefaultCrytaltalCap(pDM_Odm);
156 pCfoTrack->bAdjust = TRUE;
158 #if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
159 odm_SetCrystalCap(pDM_Odm, pCfoTrack->DefXCap);
160 odm_SetATCStatus(pDM_Odm, TRUE);
162 if(pCfoTrack->CrystalCap > pCfoTrack->DefXCap)
164 for(CrystalCap = pCfoTrack->CrystalCap; CrystalCap >= pCfoTrack->DefXCap; CrystalCap--)
165 odm_SetCrystalCap(pDM_Odm, CrystalCap);
169 for(CrystalCap = pCfoTrack->CrystalCap; CrystalCap <= pCfoTrack->DefXCap; CrystalCap++)
170 odm_SetCrystalCap(pDM_Odm, CrystalCap);
180 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
181 PCFO_TRACKING pCfoTrack = (PCFO_TRACKING)PhyDM_Get_Structure( pDM_Odm, PHYDM_CFOTRACK);
183 pCfoTrack->DefXCap = pCfoTrack->CrystalCap = odm_GetDefaultCrytaltalCap(pDM_Odm);
184 pCfoTrack->bATCStatus = odm_GetATCStatus(pDM_Odm);
185 pCfoTrack->bAdjust = TRUE;
186 ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking_init()=========> \n"));
187 ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking_init(): bATCStatus = %d, CrystalCap = 0x%x \n",pCfoTrack->bATCStatus, pCfoTrack->DefXCap));
195 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
196 PCFO_TRACKING pCfoTrack = (PCFO_TRACKING)PhyDM_Get_Structure( pDM_Odm, PHYDM_CFOTRACK);
197 int CFO_kHz_A, CFO_kHz_B, CFO_ave = 0;
199 int CrystalCap = (int)pCfoTrack->CrystalCap;
200 u1Byte Adjust_Xtal = 1;
203 if(!(pDM_Odm->SupportAbility & ODM_BB_CFO_TRACKING))
205 ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Return: SupportAbility ODM_BB_CFO_TRACKING is disabled\n"));
209 ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking()=========> \n"));
211 if(!pDM_Odm->bLinked || !pDM_Odm->bOneEntryOnly)
213 //4 No link or more than one entry
214 ODM_CfoTrackingReset(pDM_Odm);
215 ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Reset: bLinked = %d, bOneEntryOnly = %d\n",
216 pDM_Odm->bLinked, pDM_Odm->bOneEntryOnly));
221 //4 1.1 No new packet
222 if(pCfoTrack->packetCount == pCfoTrack->packetCount_pre)
224 ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): packet counter doesn't change\n"));
227 pCfoTrack->packetCount_pre = pCfoTrack->packetCount;
229 //4 1.2 Calculate CFO
230 CFO_kHz_A = (int)(pCfoTrack->CFO_tail[0] * 3125) / 1280;
231 CFO_kHz_B = (int)(pCfoTrack->CFO_tail[1] * 3125) / 1280;
233 if(pDM_Odm->RFType < ODM_2T2R)
236 CFO_ave = (int)(CFO_kHz_A + CFO_kHz_B) >> 1;
237 ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): CFO_kHz_A = %dkHz, CFO_kHz_B = %dkHz, CFO_ave = %dkHz\n",
238 CFO_kHz_A, CFO_kHz_B, CFO_ave));
240 //4 1.3 Avoid abnormal large CFO
241 CFO_ave_diff = (pCfoTrack->CFO_ave_pre >= CFO_ave)?(pCfoTrack->CFO_ave_pre - CFO_ave):(CFO_ave - pCfoTrack->CFO_ave_pre);
242 if(CFO_ave_diff > 20 && pCfoTrack->largeCFOHit == 0 && !pCfoTrack->bAdjust)
244 ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): first large CFO hit\n"));
245 pCfoTrack->largeCFOHit = 1;
249 pCfoTrack->largeCFOHit = 0;
250 pCfoTrack->CFO_ave_pre = CFO_ave;
252 //4 1.4 Dynamic Xtal threshold
253 if(pCfoTrack->bAdjust == FALSE)
255 if(CFO_ave > CFO_TH_XTAL_HIGH || CFO_ave < (-CFO_TH_XTAL_HIGH))
256 pCfoTrack->bAdjust = TRUE;
260 if(CFO_ave < CFO_TH_XTAL_LOW && CFO_ave > (-CFO_TH_XTAL_LOW))
261 pCfoTrack->bAdjust = FALSE;
264 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
265 //4 1.5 BT case: Disable CFO tracking
266 if(pDM_Odm->bBtEnabled)
268 pCfoTrack->bAdjust = FALSE;
269 odm_SetCrystalCap(pDM_Odm, pCfoTrack->DefXCap);
270 ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Disable CFO tracking for BT!!\n"));
274 if(pCfoTrack->bAdjust)
276 if(CFO_ave > CFO_TH_XTAL_LOW)
277 Adjust_Xtal = Adjust_Xtal + ((CFO_ave - CFO_TH_XTAL_LOW) >> 2);
278 else if(CFO_ave < (-CFO_TH_XTAL_LOW))
279 Adjust_Xtal = Adjust_Xtal + ((CFO_TH_XTAL_LOW - CFO_ave) >> 2);
281 ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Crystal cap offset = %d\n", Adjust_Xtal));
285 //4 1.7 Adjust Crystal Cap.
286 if(pCfoTrack->bAdjust)
288 if(CFO_ave > CFO_TH_XTAL_LOW)
289 CrystalCap = CrystalCap + Adjust_Xtal;
290 else if(CFO_ave < (-CFO_TH_XTAL_LOW))
291 CrystalCap = CrystalCap - Adjust_Xtal;
293 if(CrystalCap > 0x3f)
295 else if (CrystalCap < 0)
298 odm_SetCrystalCap(pDM_Odm, (u1Byte)CrystalCap);
300 ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Crystal cap = 0x%x, Default Crystal cap = 0x%x\n",
301 pCfoTrack->CrystalCap, pCfoTrack->DefXCap));
303 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
304 if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
307 //3 2. Dynamic ATC switch
308 if(CFO_ave < CFO_TH_ATC && CFO_ave > -CFO_TH_ATC)
310 odm_SetATCStatus(pDM_Odm, FALSE);
311 ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Disable ATC!!\n"));
315 odm_SetATCStatus(pDM_Odm, TRUE);
316 ODM_RT_TRACE(pDM_Odm, ODM_COMP_CFO_TRACKING, ODM_DBG_LOUD, ("ODM_CfoTracking(): Enable ATC!!\n"));
325 IN PVOID pPktinfo_VOID,
329 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
330 PODM_PACKET_INFO_T pPktinfo = (PODM_PACKET_INFO_T)pPktinfo_VOID;
331 PCFO_TRACKING pCfoTrack = (PCFO_TRACKING)PhyDM_Get_Structure( pDM_Odm, PHYDM_CFOTRACK);
334 if(!(pDM_Odm->SupportAbility & ODM_BB_CFO_TRACKING))
337 #if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
338 if(pPktinfo->bPacketMatchBSSID)
340 if(pPktinfo->StationID != 0)
343 //3 Update CFO report for path-A & path-B
344 // Only paht-A and path-B have CFO tail and short CFO
345 for(i = ODM_RF_PATH_A; i <= ODM_RF_PATH_B; i++)
347 pCfoTrack->CFO_tail[i] = (int)pcfotail[i];
350 //3 Update packet counter
351 if(pCfoTrack->packetCount == 0xffffffff)
352 pCfoTrack->packetCount = 0;
354 pCfoTrack->packetCount++;