1 /******************************************************************************
\r
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
\r
5 * This program is free software; you can redistribute it and/or modify it
\r
6 * under the terms of version 2 of the GNU General Public License as
\r
7 * published by the Free Software Foundation.
\r
9 * This program is distributed in the hope that it will be useful, but WITHOUT
\r
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
\r
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
\r
14 * You should have received a copy of the GNU General Public License along with
\r
15 * this program; if not, write to the Free Software Foundation, Inc.,
\r
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
\r
19 ******************************************************************************/
\r
21 //============================================================
\r
23 //============================================================
\r
25 #include "mp_precomp.h"
\r
26 #include "phydm_precomp.h"
\r
28 //#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN |ODM_CE))
\r
29 #if(defined(CONFIG_ANT_DETECTION))
\r
31 //IS_ANT_DETECT_SUPPORT_SINGLE_TONE(Adapter)
\r
32 //IS_ANT_DETECT_SUPPORT_RSSI(Adapter)
\r
33 //IS_ANT_DETECT_SUPPORT_PSD(Adapter)
\r
35 //1 [1. Single Tone Method] ===================================================
\r
39 // Set Single/Dual Antenna default setting for products that do not do detection in advance.
\r
41 // Added by Joseph, 2012.03.22
\r
44 ODM_SingleDualAntennaDefaultSetting(
\r
48 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
49 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
\r
50 PADAPTER pAdapter = pDM_Odm->Adapter;
\r
52 u1Byte btAntNum=BT_GetPgAntNum(pAdapter);
\r
53 // Set default antenna A and B status
\r
56 pDM_SWAT_Table->ANTA_ON=TRUE;
\r
57 pDM_SWAT_Table->ANTB_ON=TRUE;
\r
60 else if(btAntNum == 1)
\r
61 {// Set antenna A as default
\r
62 pDM_SWAT_Table->ANTA_ON=TRUE;
\r
63 pDM_SWAT_Table->ANTB_ON=FALSE;
\r
68 RT_ASSERT(FALSE, ("Incorrect antenna number!!\n"));
\r
73 //2 8723A ANT DETECT
\r
76 // Implement IQK single tone for RF DPK loopback and BB PSD scanning.
\r
77 // This function is cooperated with BB team Neil.
\r
79 // Added by Roger, 2011.12.15
\r
82 ODM_SingleDualAntennaDetection(
\r
87 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
88 PADAPTER pAdapter = pDM_Odm->Adapter;
\r
89 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
\r
90 u4Byte CurrentChannel,RfLoopReg;
\r
92 u4Byte Reg88c, Regc08, Reg874, Regc50, Reg948, Regb2c, Reg92c, Reg930, Reg064, AFE_rRx_Wait_CCA;
\r
93 u1Byte initial_gain = 0x5a;
\r
94 u4Byte PSD_report_tmp;
\r
95 u4Byte AntA_report = 0x0, AntB_report = 0x0, AntO_report = 0x0;
\r
96 BOOLEAN bResult = TRUE;
\r
97 u4Byte AFE_Backup[16];
\r
98 u4Byte AFE_REG_8723A[16] = {
\r
99 rRx_Wait_CCA, rTx_CCK_RFON,
\r
100 rTx_CCK_BBON, rTx_OFDM_RFON,
\r
101 rTx_OFDM_BBON, rTx_To_Rx,
\r
102 rTx_To_Tx, rRx_CCK,
\r
103 rRx_OFDM, rRx_Wait_RIFS,
\r
104 rRx_TO_Rx, rStandby,
\r
105 rSleep, rPMPD_ANAEN,
\r
106 rFPGA0_XCD_SwitchControl, rBlue_Tooth};
\r
108 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection()============>\n"));
\r
111 if (!(pDM_Odm->SupportICType & ODM_RTL8723B))
\r
114 // Retrieve antenna detection registry info, added by Roger, 2012.11.27.
\r
115 if(!IS_ANT_DETECT_SUPPORT_SINGLE_TONE(pAdapter))
\r
118 //1 Backup Current RF/BB Settings
\r
120 CurrentChannel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, ODM_CHANNEL, bRFRegOffsetMask);
\r
121 RfLoopReg = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x00, bRFRegOffsetMask);
\r
122 if (pDM_Odm->SupportICType & ODM_RTL8723B) {
\r
123 Reg92c = ODM_GetBBReg(pDM_Odm, rDPDT_control, bMaskDWord);
\r
124 Reg930 = ODM_GetBBReg(pDM_Odm, rfe_ctrl_anta_src, bMaskDWord);
\r
125 Reg948 = ODM_GetBBReg(pDM_Odm, rS0S1_PathSwitch, bMaskDWord);
\r
126 Regb2c = ODM_GetBBReg(pDM_Odm, rAGC_table_select, bMaskDWord);
\r
127 Reg064 = ODM_GetMACReg(pDM_Odm, rSYM_WLBT_PAPE_SEL, BIT29);
\r
128 ODM_SetBBReg(pDM_Odm, rDPDT_control, 0x3, 0x1);
\r
129 ODM_SetBBReg(pDM_Odm, rfe_ctrl_anta_src, 0xff, 0x77);
\r
130 ODM_SetMACReg(pDM_Odm, rSYM_WLBT_PAPE_SEL, BIT29, 0x1); //dbg 7
\r
131 ODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, 0x3c0, 0x0);//dbg 8
\r
132 ODM_SetBBReg(pDM_Odm, rAGC_table_select, BIT31, 0x0);
\r
135 ODM_StallExecution(10);
\r
137 //Store A Path Register 88c, c08, 874, c50
\r
138 Reg88c = ODM_GetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord);
\r
139 Regc08 = ODM_GetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord);
\r
140 Reg874 = ODM_GetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord);
\r
141 Regc50 = ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskDWord);
\r
143 // Store AFE Registers
\r
144 if (pDM_Odm->SupportICType & ODM_RTL8723B)
\r
145 AFE_rRx_Wait_CCA = ODM_GetBBReg(pDM_Odm, rRx_Wait_CCA,bMaskDWord);
\r
148 ODM_SetBBReg(pDM_Odm, rFPGA0_PSDFunction, BIT14|BIT15, 0x0); //128 pts
\r
150 // To SET CH1 to do
\r
151 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, ODM_CHANNEL, bRFRegOffsetMask, 0x7401); //Channel 1
\r
154 if (pDM_Odm->SupportICType & ODM_RTL8723B)
\r
155 ODM_SetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord, 0x01c00016);
\r
158 ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord, 0xCCF000C0);
\r
161 ODM_SetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord, 0x000800E4);
\r
162 ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, 0x22208000);
\r
164 //IQK setting tone@ 4.34Mhz
\r
165 ODM_SetBBReg(pDM_Odm, rTx_IQK_Tone_A, bMaskDWord, 0x10008C1C);
\r
166 ODM_SetBBReg(pDM_Odm, rTx_IQK, bMaskDWord, 0x01007c00);
\r
169 ODM_SetBBReg(pDM_Odm, rConfig_AntA, bMaskDWord, 0x00080000);
\r
170 ODM_SetBBReg(pDM_Odm, rConfig_AntA, bMaskDWord, 0x0f600000);
\r
171 ODM_SetBBReg(pDM_Odm, rRx_IQK, bMaskDWord, 0x01004800);
\r
172 ODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_A, bMaskDWord, 0x10008c1f);
\r
173 if (pDM_Odm->SupportICType & ODM_RTL8723B) {
\r
174 ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82150016);
\r
175 ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x28150016);
\r
177 ODM_SetBBReg(pDM_Odm, rIQK_AGC_Rsp, bMaskDWord, 0x001028d0);
\r
178 ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, 0x7f, initial_gain);
\r
180 //IQK Single tone start
\r
181 ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, 0xffffff00, 0x808000);
\r
182 ODM_SetBBReg(pDM_Odm, rIQK_AGC_Pts, bMaskDWord, 0xf9000000);
\r
183 ODM_SetBBReg(pDM_Odm, rIQK_AGC_Pts, bMaskDWord, 0xf8000000);
\r
185 ODM_StallExecution(10000);
\r
187 // PSD report of antenna A
\r
188 PSD_report_tmp=0x0;
\r
191 PSD_report_tmp = GetPSDData(pDM_Odm, 14, initial_gain);
\r
192 if(PSD_report_tmp >AntA_report)
\r
193 AntA_report=PSD_report_tmp;
\r
196 // change to Antenna B
\r
197 if (pDM_Odm->SupportICType & ODM_RTL8723B) {
\r
198 //ODM_SetBBReg(pDM_Odm, rDPDT_control, 0x3, 0x2);
\r
199 ODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, 0xfff, 0x280);
\r
200 ODM_SetBBReg(pDM_Odm, rAGC_table_select, BIT31, 0x1);
\r
203 ODM_StallExecution(10);
\r
205 // PSD report of antenna B
\r
206 PSD_report_tmp=0x0;
\r
209 PSD_report_tmp = GetPSDData(pDM_Odm, 14, initial_gain);
\r
210 if(PSD_report_tmp > AntB_report)
\r
211 AntB_report=PSD_report_tmp;
\r
214 //Close IQK Single Tone function
\r
215 ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, 0xffffff00, 0x000000);
\r
217 //1 Return to antanna A
\r
218 if (pDM_Odm->SupportICType & ODM_RTL8723B) {
\r
220 ODM_SetBBReg(pDM_Odm, rDPDT_control, bMaskDWord, Reg92c);
\r
223 ODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, bMaskDWord, Reg948);
\r
224 ODM_SetBBReg(pDM_Odm, rAGC_table_select, bMaskDWord, Regb2c);
\r
225 ODM_SetBBReg(pDM_Odm, rfe_ctrl_anta_src, bMaskDWord, Reg930);
\r
226 ODM_SetMACReg(pDM_Odm, rSYM_WLBT_PAPE_SEL, BIT29, Reg064);
\r
229 ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord, Reg88c);
\r
230 ODM_SetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord, Regc08);
\r
231 ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, Reg874);
\r
232 ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, 0x7F, 0x40);
\r
233 ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskDWord, Regc50);
\r
234 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask,CurrentChannel);
\r
235 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x00, bRFRegOffsetMask,RfLoopReg);
\r
237 //Reload AFE Registers
\r
238 if (pDM_Odm->SupportICType & ODM_RTL8723B)
\r
239 ODM_SetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord, AFE_rRx_Wait_CCA);
\r
241 if (pDM_Odm->SupportICType & ODM_RTL8723B) {
\r
242 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_A[%d]= %d\n", 2416, AntA_report));
\r
243 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_B[%d]= %d\n", 2416, AntB_report));
\r
245 //2 Test Ant B based on Ant A is ON
\r
246 if((AntA_report >= 100) && (AntB_report >= 100) && (AntA_report <= 135) && (AntB_report <= 135))
\r
248 u1Byte TH1=2, TH2=6;
\r
250 if((AntA_report - AntB_report < TH1) || (AntB_report - AntA_report < TH1))
\r
252 pDM_SWAT_Table->ANTA_ON=TRUE;
\r
253 pDM_SWAT_Table->ANTB_ON=TRUE;
\r
254 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SingleDualAntennaDetection(): Dual Antenna\n"));
\r
256 else if(((AntA_report - AntB_report >= TH1) && (AntA_report - AntB_report <= TH2)) ||
\r
257 ((AntB_report - AntA_report >= TH1) && (AntB_report - AntA_report <= TH2)))
\r
259 pDM_SWAT_Table->ANTA_ON=FALSE;
\r
260 pDM_SWAT_Table->ANTB_ON=FALSE;
\r
262 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Need to check again\n"));
\r
266 pDM_SWAT_Table->ANTA_ON = TRUE;
\r
267 pDM_SWAT_Table->ANTB_ON=FALSE;
\r
268 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SingleDualAntennaDetection(): Single Antenna\n"));
\r
270 pDM_Odm->AntDetectedInfo.bAntDetected= TRUE;
\r
271 pDM_Odm->AntDetectedInfo.dBForAntA = AntA_report;
\r
272 pDM_Odm->AntDetectedInfo.dBForAntB = AntB_report;
\r
273 pDM_Odm->AntDetectedInfo.dBForAntO = AntO_report;
\r
278 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("return FALSE!!\n"));
\r
288 //1 [2. Scan AP RSSI Method] ==================================================
\r
294 ODM_SwAntDivCheckBeforeLink(
\r
299 #if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM)
\r
301 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
302 PADAPTER Adapter = pDM_Odm->Adapter;
\r
303 HAL_DATA_TYPE* pHalData = GET_HAL_DATA(Adapter);
\r
304 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
\r
305 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
\r
306 pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable;
\r
308 PRT_WLAN_BSS pTmpBssDesc, pTestBssDesc;
\r
309 u1Byte power_target_L = 9, power_target_H = 16;
\r
310 u1Byte tmp_power_diff = 0,power_diff = 0,avg_power_diff = 0,max_power_diff = 0,min_power_diff = 0xff;
\r
311 u2Byte index, counter = 0;
\r
312 static u1Byte ScanChannel;
\r
313 u4Byte tmp_SWAS_NoLink_BK_Reg948;
\r
315 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ANTA_ON = (( %d )) , ANTB_ON = (( %d ))\n", pDM_Odm->DM_SWAT_Table.ANTA_ON, pDM_Odm->DM_SWAT_Table.ANTB_ON));
\r
319 if(pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult==TRUE && pDM_Odm->SupportICType == ODM_RTL8723B)
\r
321 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("8723B RSSI-based Antenna Detection is done\n"));
\r
325 if(pDM_Odm->SupportICType == ODM_RTL8723B)
\r
327 if(pDM_SWAT_Table->SWAS_NoLink_BK_Reg948 == 0xff)
\r
328 pDM_SWAT_Table->SWAS_NoLink_BK_Reg948 = ODM_Read4Byte(pDM_Odm, rS0S1_PathSwitch );
\r
332 if (pDM_Odm->Adapter == NULL) //For BSOD when plug/unplug fast. //By YJ,120413
\r
333 { // The ODM structure is not initialized.
\r
337 // Retrieve antenna detection registry info, added by Roger, 2012.11.27.
\r
338 if(!IS_ANT_DETECT_SUPPORT_RSSI(Adapter))
\r
344 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Antenna Detection: RSSI Method\n"));
\r
347 // Since driver is going to set BB register, it shall check if there is another thread controlling BB/RF.
\r
348 PlatformAcquireSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
\r
349 if(pHalData->eRFPowerState!=eRfOn || pMgntInfo->RFChangeInProgress || pMgntInfo->bMediaConnect)
\r
351 PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
\r
353 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
\r
354 ("ODM_SwAntDivCheckBeforeLink(): RFChangeInProgress(%x), eRFPowerState(%x)\n",
\r
355 pMgntInfo->RFChangeInProgress, pHalData->eRFPowerState));
\r
357 pDM_SWAT_Table->SWAS_NoLink_State = 0;
\r
363 PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);
\r
365 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("pDM_SWAT_Table->SWAS_NoLink_State = %d\n", pDM_SWAT_Table->SWAS_NoLink_State));
\r
366 //1 Run AntDiv mechanism "Before Link" part.
\r
367 if(pDM_SWAT_Table->SWAS_NoLink_State == 0)
\r
369 //1 Prepare to do Scan again to check current antenna state.
\r
371 // Set check state to next step.
\r
372 pDM_SWAT_Table->SWAS_NoLink_State = 1;
\r
374 // Copy Current Scan list.
\r
375 pMgntInfo->tmpNumBssDesc = pMgntInfo->NumBssDesc;
\r
376 PlatformMoveMemory((PVOID)Adapter->MgntInfo.tmpbssDesc, (PVOID)pMgntInfo->bssDesc, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC);
\r
378 // Go back to scan function again.
\r
379 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Scan one more time\n"));
\r
380 pMgntInfo->ScanStep=0;
\r
381 pMgntInfo->bScanAntDetect = TRUE;
\r
382 ScanChannel = odm_SwAntDivSelectScanChnl(Adapter);
\r
385 if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8821))
\r
387 if(pDM_FatTable->RxIdleAnt == MAIN_ANT)
\r
388 ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);
\r
390 ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);
\r
391 if(ScanChannel == 0)
\r
393 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
\r
394 ("ODM_SwAntDivCheckBeforeLink(): No AP List Avaiable, Using Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"AUX_ANT":"MAIN_ANT"));
\r
396 if(IS_5G_WIRELESS_MODE(pMgntInfo->dot11CurrentWirelessMode))
\r
398 pDM_SWAT_Table->Ant5G = pDM_FatTable->RxIdleAnt;
\r
399 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_SWAT_Table->Ant5G=%s\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
\r
403 pDM_SWAT_Table->Ant2G = pDM_FatTable->RxIdleAnt;
\r
404 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_SWAT_Table->Ant2G=%s\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
\r
409 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
\r
410 ("ODM_SwAntDivCheckBeforeLink: Change to %s for testing.\n", ((pDM_FatTable->RxIdleAnt == MAIN_ANT)?"MAIN_ANT":"AUX_ANT")));
\r
411 } else if (pDM_Odm->SupportICType & (ODM_RTL8723B)) {
\r
412 /*Switch Antenna to another one.*/
\r
414 tmp_SWAS_NoLink_BK_Reg948 = ODM_Read4Byte(pDM_Odm, rS0S1_PathSwitch);
\r
416 if ((pDM_SWAT_Table->CurAntenna == MAIN_ANT) && (tmp_SWAS_NoLink_BK_Reg948 == 0x200)) {
\r
417 ODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, 0xfff, 0x280);
\r
418 ODM_SetBBReg(pDM_Odm, rAGC_table_select, BIT31, 0x1);
\r
419 pDM_SWAT_Table->CurAntenna = AUX_ANT;
\r
421 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Reg[948]= (( %x )) was in wrong state\n", tmp_SWAS_NoLink_BK_Reg948));
\r
424 ODM_StallExecution(10);
\r
426 ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Change to (( %s-ant)) for testing.\n", (pDM_SWAT_Table->CurAntenna == MAIN_ANT)?"MAIN":"AUX"));
\r
429 odm_SwAntDivConstructScanChnl(Adapter, ScanChannel);
\r
430 PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);
\r
434 else //pDM_SWAT_Table->SWAS_NoLink_State == 1
\r
436 //1 ScanComple() is called after antenna swiched.
\r
437 //1 Check scan result and determine which antenna is going
\r
440 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(" tmpNumBssDesc= (( %d )) \n",pMgntInfo->tmpNumBssDesc));// debug for Dino
\r
442 for(index = 0; index < pMgntInfo->tmpNumBssDesc; index++)
\r
444 pTmpBssDesc = &(pMgntInfo->tmpbssDesc[index]); // Antenna 1
\r
445 pTestBssDesc = &(pMgntInfo->bssDesc[index]); // Antenna 2
\r
447 if(PlatformCompareMemory(pTestBssDesc->bdBssIdBuf, pTmpBssDesc->bdBssIdBuf, 6)!=0)
\r
449 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): ERROR!! This shall not happen.\n"));
\r
453 if(pDM_Odm->SupportICType != ODM_RTL8723B)
\r
455 if(pTmpBssDesc->ChannelNumber == ScanChannel)
\r
457 if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower)
\r
459 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Compare scan entry: Score++\n"));
\r
460 RT_PRINT_STR(COMP_SCAN, DBG_WARNING, "GetScanInfo(): new Bss SSID:", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen);
\r
461 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("at ch %d, Original: %d, Test: %d\n\n", pTmpBssDesc->ChannelNumber, pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
\r
464 PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));
\r
466 else if(pTmpBssDesc->RecvSignalPower < pTestBssDesc->RecvSignalPower)
\r
468 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Compare scan entry: Score--\n"));
\r
469 RT_PRINT_STR(COMP_SCAN, DBG_WARNING, "GetScanInfo(): new Bss SSID:", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen);
\r
470 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("at ch %d, Original: %d, Test: %d\n\n", pTmpBssDesc->ChannelNumber, pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
\r
475 if(pTestBssDesc->bdTstamp - pTmpBssDesc->bdTstamp < 5000)
\r
477 RT_PRINT_STR(COMP_SCAN, DBG_WARNING, "GetScanInfo(): new Bss SSID:", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen);
\r
478 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("at ch %d, Original: %d, Test: %d\n", pTmpBssDesc->ChannelNumber, pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
\r
479 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("The 2nd Antenna didn't get this AP\n\n"));
\r
486 if(pTmpBssDesc->ChannelNumber == ScanChannel)
\r
488 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ChannelNumber == ScanChannel -> (( %d )) \n", pTmpBssDesc->ChannelNumber ));
\r
490 if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower) // Pow(Ant1) > Pow(Ant2)
\r
493 tmp_power_diff=(u1Byte)(pTmpBssDesc->RecvSignalPower - pTestBssDesc->RecvSignalPower);
\r
494 power_diff = power_diff + tmp_power_diff;
\r
496 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
\r
497 ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("SSID:"), pTmpBssDesc->bdSsIdBuf);
\r
498 ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("BSSID:"), pTmpBssDesc->bdBssIdBuf);
\r
500 //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("tmp_power_diff: (( %d)),max_power_diff: (( %d)),min_power_diff: (( %d)) \n", tmp_power_diff,max_power_diff,min_power_diff));
\r
501 if(tmp_power_diff > max_power_diff)
\r
502 max_power_diff=tmp_power_diff;
\r
503 if(tmp_power_diff < min_power_diff)
\r
504 min_power_diff=tmp_power_diff;
\r
505 //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("max_power_diff: (( %d)),min_power_diff: (( %d)) \n",max_power_diff,min_power_diff));
\r
507 PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));
\r
509 else if(pTestBssDesc->RecvSignalPower > pTmpBssDesc->RecvSignalPower) // Pow(Ant1) < Pow(Ant2)
\r
512 tmp_power_diff=(u1Byte)(pTestBssDesc->RecvSignalPower - pTmpBssDesc->RecvSignalPower);
\r
513 power_diff = power_diff + tmp_power_diff;
\r
514 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
\r
515 ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("SSID:"), pTmpBssDesc->bdSsIdBuf);
\r
516 ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("BSSID:"), pTmpBssDesc->bdBssIdBuf);
\r
517 if(tmp_power_diff > max_power_diff)
\r
518 max_power_diff=tmp_power_diff;
\r
519 if(tmp_power_diff < min_power_diff)
\r
520 min_power_diff=tmp_power_diff;
\r
522 else // Pow(Ant1) = Pow(Ant2)
\r
524 if(pTestBssDesc->bdTstamp > pTmpBssDesc->bdTstamp) // Stamp(Ant1) < Stamp(Ant2)
\r
526 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("time_diff: %lld\n", (pTestBssDesc->bdTstamp-pTmpBssDesc->bdTstamp)/1000));
\r
527 if(pTestBssDesc->bdTstamp - pTmpBssDesc->bdTstamp > 5000)
\r
530 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));
\r
531 ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("SSID:"), pTmpBssDesc->bdSsIdBuf);
\r
532 ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("BSSID:"), pTmpBssDesc->bdBssIdBuf);
\r
533 min_power_diff = 0;
\r
538 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Error !!!]: Time_diff: %lld\n", (pTestBssDesc->bdTstamp-pTmpBssDesc->bdTstamp)/1000));
\r
545 if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8821))
\r
547 if(pMgntInfo->NumBssDesc!=0 && Score<0)
\r
549 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
\r
550 ("ODM_SwAntDivCheckBeforeLink(): Using Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
\r
554 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
\r
555 ("ODM_SwAntDivCheckBeforeLink(): Remain Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"AUX_ANT":"MAIN_ANT"));
\r
557 if(pDM_FatTable->RxIdleAnt == MAIN_ANT)
\r
558 ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);
\r
560 ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);
\r
563 if(IS_5G_WIRELESS_MODE(pMgntInfo->dot11CurrentWirelessMode))
\r
565 pDM_SWAT_Table->Ant5G = pDM_FatTable->RxIdleAnt;
\r
566 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_SWAT_Table->Ant5G=%s\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
\r
570 pDM_SWAT_Table->Ant2G = pDM_FatTable->RxIdleAnt;
\r
571 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_SWAT_Table->Ant2G=%s\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
\r
574 else if(pDM_Odm->SupportICType == ODM_RTL8723B)
\r
578 if(pDM_Odm->DM_SWAT_Table.Pre_Aux_FailDetec == FALSE)
\r
580 pDM_Odm->DM_SWAT_Table.Pre_Aux_FailDetec = TRUE;
\r
581 pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=FALSE;
\r
582 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Counter=(( 0 )) , [[ Cannot find any AP with Aux-ant ]] -> Scan Target-channel again \n"));
\r
585 odm_SwAntDivConstructScanChnl(Adapter, ScanChannel);
\r
586 PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);
\r
589 else// Pre_Aux_FailDetec == TRUE
\r
591 //2 [ Single Antenna ]
\r
592 pDM_Odm->DM_SWAT_Table.Pre_Aux_FailDetec = FALSE;
\r
593 pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=TRUE;
\r
594 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Counter=(( 0 )) , [[ Still cannot find any AP ]] \n"));
\r
595 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): Single antenna\n"));
\r
597 pDM_Odm->DM_SWAT_Table.Aux_FailDetec_Counter++;
\r
601 pDM_Odm->DM_SWAT_Table.Pre_Aux_FailDetec = FALSE;
\r
605 avg_power_diff = ((power_diff-max_power_diff - min_power_diff)>>1)+ ((max_power_diff + min_power_diff)>>2);
\r
606 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("counter: (( %d )) , power_diff: (( %d )) \n", counter, power_diff));
\r
607 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ counter==3 ] Modified avg_power_diff: (( %d )) , max_power_diff: (( %d )) , min_power_diff: (( %d )) \n", avg_power_diff,max_power_diff, min_power_diff));
\r
609 else if(counter>=4)
\r
611 avg_power_diff=(power_diff-max_power_diff - min_power_diff) / (counter - 2);
\r
612 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("counter: (( %d )) , power_diff: (( %d )) \n", counter, power_diff));
\r
613 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ counter>=4 ] Modified avg_power_diff: (( %d )) , max_power_diff: (( %d )) , min_power_diff: (( %d )) \n", avg_power_diff,max_power_diff, min_power_diff));
\r
618 avg_power_diff=power_diff/counter;
\r
619 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("avg_power_diff: (( %d )) , counter: (( %d )) , power_diff: (( %d )) \n", avg_power_diff,counter, power_diff));
\r
623 if( (avg_power_diff >=power_target_L) && (avg_power_diff <=power_target_H) )
\r
625 pDM_Odm->DM_SWAT_Table.Retry_Counter++;
\r
627 if(pDM_Odm->DM_SWAT_Table.Retry_Counter<=3)
\r
629 pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=FALSE;
\r
630 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[[ Low confidence result ]] avg_power_diff= (( %d )) -> Scan Target-channel again ]] \n", avg_power_diff));
\r
633 odm_SwAntDivConstructScanChnl(Adapter, ScanChannel);
\r
634 PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);
\r
639 pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=TRUE;
\r
640 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[[ Still Low confidence result ]] (( Retry_Counter > 3 )) \n"));
\r
641 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): Single antenna\n"));
\r
645 //2 [ Dual Antenna ]
\r
646 else if( (pMgntInfo->NumBssDesc != 0) && (avg_power_diff < power_target_L) )
\r
648 pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=TRUE;
\r
649 if(pDM_Odm->DM_SWAT_Table.ANTB_ON == FALSE)
\r
651 pDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;
\r
652 pDM_Odm->DM_SWAT_Table.ANTB_ON = TRUE;
\r
654 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SwAntDivCheckBeforeLink(): Dual antenna\n"));
\r
655 pDM_Odm->DM_SWAT_Table.Dual_Ant_Counter++;
\r
657 // set bt coexDM from 1ant coexDM to 2ant coexDM
\r
658 BT_SetBtCoexAntNum(Adapter, BT_COEX_ANT_TYPE_DETECTED, 2);
\r
660 //3 [ Init antenna diversity ]
\r
661 pDM_Odm->SupportAbility |= ODM_BB_ANT_DIV;
\r
662 ODM_AntDivInit(pDM_Odm);
\r
664 //2 [ Single Antenna ]
\r
665 else if(avg_power_diff > power_target_H)
\r
667 pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=TRUE;
\r
668 if(pDM_Odm->DM_SWAT_Table.ANTB_ON == TRUE)
\r
670 pDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;
\r
671 pDM_Odm->DM_SWAT_Table.ANTB_ON = FALSE;
\r
672 //BT_SetBtCoexAntNum(Adapter, BT_COEX_ANT_TYPE_DETECTED, 1);
\r
674 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): Single antenna\n"));
\r
675 pDM_Odm->DM_SWAT_Table.Single_Ant_Counter++;
\r
678 //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("bResult=(( %d ))\n",pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult));
\r
679 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Dual_Ant_Counter = (( %d )), Single_Ant_Counter = (( %d )) , Retry_Counter = (( %d )) , Aux_FailDetec_Counter = (( %d ))\n\n\n",
\r
680 pDM_Odm->DM_SWAT_Table.Dual_Ant_Counter,pDM_Odm->DM_SWAT_Table.Single_Ant_Counter,pDM_Odm->DM_SWAT_Table.Retry_Counter,pDM_Odm->DM_SWAT_Table.Aux_FailDetec_Counter));
\r
682 //2 recover the antenna setting
\r
684 if(pDM_Odm->DM_SWAT_Table.ANTB_ON == FALSE)
\r
685 ODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, 0xfff, (pDM_SWAT_Table->SWAS_NoLink_BK_Reg948));
\r
687 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("bResult=(( %d )), Recover Reg[948]= (( %x )) \n\n",pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult, pDM_SWAT_Table->SWAS_NoLink_BK_Reg948 ));
\r
692 // Check state reset to default and wait for next time.
\r
693 pDM_SWAT_Table->SWAS_NoLink_State = 0;
\r
694 pMgntInfo->bScanAntDetect = FALSE;
\r
711 //1 [3. PSD Method] ==========================================================
\r
720 IN u1Byte initial_gain)
\r
722 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
725 ODM_SetBBReg(pDM_Odm, 0x808, 0x3FF, point);
\r
726 ODM_SetBBReg(pDM_Odm, 0x808, BIT22, 1); //Start PSD calculation, Reg808[22]=0->1
\r
727 ODM_StallExecution(150);//Wait for HW PSD report
\r
728 ODM_SetBBReg(pDM_Odm, 0x808, BIT22, 0);//Stop PSD calculation, Reg808[22]=1->0
\r
729 psd_report = ODM_GetBBReg(pDM_Odm,0x8B4, bMaskDWord) & 0x0000FFFF;//Read PSD report, Reg8B4[15:0]
\r
731 psd_report = (u4Byte) (odm_ConvertTo_dB(psd_report));//+(u4Byte)(initial_gain);
\r
738 ODM_SingleDualAntennaDetection_PSD(
\r
742 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
743 u4Byte Channel_ori;
\r
744 u1Byte initial_gain = 0x36;
\r
746 u1Byte Tone_lenth_1=7, Tone_lenth_2=4;
\r
747 u2Byte Tone_idx_1[7]={88, 104, 120, 8, 24, 40, 56};
\r
748 u2Byte Tone_idx_2[4]={8, 24, 40, 56};
\r
749 u4Byte PSD_report_Main[11]={0}, PSD_report_Aux[11]={0};
\r
750 //u1Byte Tone_lenth_1=4, Tone_lenth_2=2;
\r
751 //u2Byte Tone_idx_1[4]={88, 120, 24, 56};
\r
752 //u2Byte Tone_idx_2[2]={ 24, 56};
\r
753 //u4Byte PSD_report_Main[6]={0}, PSD_report_Aux[6]={0};
\r
755 u4Byte PSD_report_temp,MAX_PSD_report_Main=0,MAX_PSD_report_Aux=0;
\r
756 u4Byte PSD_power_threshold;
\r
757 u4Byte Main_psd_result=0, Aux_psd_result=0;
\r
758 u4Byte Regc50, Reg948, Regb2c,Regc14,Reg908;
\r
759 u4Byte i=0,test_num=8;
\r
762 if(pDM_Odm->SupportICType != ODM_RTL8723B)
\r
765 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection_PSD()============> \n"));
\r
767 //2 [ Backup Current RF/BB Settings ]
\r
769 Channel_ori = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, ODM_CHANNEL, bRFRegOffsetMask);
\r
770 Reg948 = ODM_GetBBReg(pDM_Odm, rS0S1_PathSwitch, bMaskDWord);
\r
771 Regb2c = ODM_GetBBReg(pDM_Odm, rAGC_table_select, bMaskDWord);
\r
772 Regc50 = ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskDWord);
\r
773 Regc14 = ODM_GetBBReg(pDM_Odm, 0xc14, bMaskDWord);
\r
774 Reg908 = ODM_GetBBReg(pDM_Odm, 0x908, bMaskDWord);
\r
776 //2 [ Setting for doing PSD function (CH4)]
\r
777 ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 0); //disable whole CCK block
\r
778 ODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0xFF); // Turn off TX -> Pause TX Queue
\r
779 ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, 0x0); // [ Set IQK Matrix = 0 ] equivalent to [ Turn off CCA]
\r
781 // PHYTXON while loop
\r
782 ODM_SetBBReg(pDM_Odm, 0x908, bMaskDWord, 0x803);
\r
783 while (ODM_GetBBReg(pDM_Odm, 0xdf4, BIT6))
\r
788 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Wait in %s() more than %d times!\n", __FUNCTION__, i));
\r
793 ODM_SetBBReg(pDM_Odm, 0xc50, 0x7f, initial_gain);
\r
794 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, ODM_CHANNEL, 0x7ff, 0x04); // Set RF to CH4 & 40M
\r
795 ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, 0xf00000, 0xf); // 3 wire Disable 88c[23:20]=0xf
\r
796 ODM_SetBBReg(pDM_Odm, rFPGA0_PSDFunction, BIT14|BIT15, 0x0); //128 pt //Set PSD 128 ptss
\r
797 ODM_StallExecution(3000);
\r
800 //2 [ Doing PSD Function in (CH4)]
\r
803 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Switch to Main-ant (CH4)\n"));
\r
804 ODM_SetBBReg(pDM_Odm, 0x948, 0xfff, 0x200);
\r
805 ODM_StallExecution(10);
\r
806 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("dbg\n"));
\r
807 for (i=0;i<test_num;i++)
\r
809 for (tone_idx=0;tone_idx<Tone_lenth_1;tone_idx++)
\r
811 PSD_report_temp = odm_GetPSDData(pDM_Odm, Tone_idx_1[tone_idx], initial_gain);
\r
812 //if( PSD_report_temp>PSD_report_Main[tone_idx] )
\r
813 PSD_report_Main[tone_idx]+=PSD_report_temp;
\r
817 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Switch to Aux-ant (CH4)\n"));
\r
818 ODM_SetBBReg(pDM_Odm, 0x948, 0xfff, 0x280);
\r
819 ODM_StallExecution(10);
\r
820 for (i=0;i<test_num;i++)
\r
822 for (tone_idx=0;tone_idx<Tone_lenth_1;tone_idx++)
\r
824 PSD_report_temp = odm_GetPSDData(pDM_Odm, Tone_idx_1[tone_idx], initial_gain);
\r
825 //if( PSD_report_temp>PSD_report_Aux[tone_idx] )
\r
826 PSD_report_Aux[tone_idx]+=PSD_report_temp;
\r
829 //2 [ Doing PSD Function in (CH8)]
\r
831 ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, 0xf00000, 0x0); // 3 wire enable 88c[23:20]=0x0
\r
832 ODM_StallExecution(3000);
\r
834 ODM_SetBBReg(pDM_Odm, 0xc50, 0x7f, initial_gain);
\r
835 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, ODM_CHANNEL, 0x7ff, 0x04); // Set RF to CH8 & 40M
\r
837 ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, 0xf00000, 0xf); // 3 wire Disable 88c[23:20]=0xf
\r
838 ODM_StallExecution(3000);
\r
841 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Switch to Main-ant (CH8)\n"));
\r
842 ODM_SetBBReg(pDM_Odm, 0x948, 0xfff, 0x200);
\r
843 ODM_StallExecution(10);
\r
845 for (i=0;i<test_num;i++)
\r
847 for (tone_idx=0;tone_idx<Tone_lenth_2;tone_idx++)
\r
849 PSD_report_temp = odm_GetPSDData(pDM_Odm, Tone_idx_2[tone_idx], initial_gain);
\r
850 //if( PSD_report_temp>PSD_report_Main[tone_idx] )
\r
851 PSD_report_Main[Tone_lenth_1+tone_idx]+=PSD_report_temp;
\r
856 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Switch to Aux-ant (CH8)\n"));
\r
857 ODM_SetBBReg(pDM_Odm, 0x948, 0xfff, 0x280);
\r
858 ODM_StallExecution(10);
\r
860 for (i=0;i<test_num;i++)
\r
862 for (tone_idx=0;tone_idx<Tone_lenth_2;tone_idx++)
\r
864 PSD_report_temp = odm_GetPSDData(pDM_Odm, Tone_idx_2[tone_idx], initial_gain);
\r
865 //if( PSD_report_temp>PSD_report_Aux[tone_idx] )
\r
866 PSD_report_Aux[Tone_lenth_1+tone_idx]+=PSD_report_temp;
\r
870 //2 [ Calculate Result ]
\r
872 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("\nMain PSD Result: (ALL) \n"));
\r
873 for (tone_idx=0;tone_idx<(Tone_lenth_1+Tone_lenth_2);tone_idx++)
\r
875 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Tone-%d]: %d, \n",(tone_idx+1), PSD_report_Main[tone_idx] ));
\r
876 Main_psd_result+= PSD_report_Main[tone_idx];
\r
877 if(PSD_report_Main[tone_idx]>MAX_PSD_report_Main)
\r
878 MAX_PSD_report_Main=PSD_report_Main[tone_idx];
\r
880 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("--------------------------- \nTotal_Main= (( %d ))\n", Main_psd_result));
\r
881 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("MAX_Main = (( %d ))\n", MAX_PSD_report_Main));
\r
884 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("\nAux PSD Result: (ALL) \n"));
\r
885 for (tone_idx=0;tone_idx<(Tone_lenth_1+Tone_lenth_2);tone_idx++)
\r
887 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Tone-%d]: %d, \n",(tone_idx+1), PSD_report_Aux[tone_idx] ));
\r
888 Aux_psd_result+= PSD_report_Aux[tone_idx];
\r
889 if(PSD_report_Aux[tone_idx]>MAX_PSD_report_Aux)
\r
890 MAX_PSD_report_Aux=PSD_report_Aux[tone_idx];
\r
892 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("--------------------------- \nTotal_Aux= (( %d ))\n", Aux_psd_result));
\r
893 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("MAX_Aux = (( %d ))\n\n", MAX_PSD_report_Aux));
\r
895 //Main_psd_result=Main_psd_result-MAX_PSD_report_Main;
\r
896 //Aux_psd_result=Aux_psd_result-MAX_PSD_report_Aux;
\r
897 PSD_power_threshold=(Main_psd_result*7)>>3;
\r
899 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Main_result , Aux_result ] = [ %d , %d ], PSD_power_threshold=(( %d ))\n", Main_psd_result, Aux_psd_result,PSD_power_threshold));
\r
901 //3 [ Dual Antenna ]
\r
902 if(Aux_psd_result >= PSD_power_threshold )
\r
904 if(pDM_Odm->DM_SWAT_Table.ANTB_ON == FALSE)
\r
906 pDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;
\r
907 pDM_Odm->DM_SWAT_Table.ANTB_ON = TRUE;
\r
909 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SwAntDivCheckBeforeLink(): Dual antenna\n"));
\r
911 // set bt coexDM from 1ant coexDM to 2ant coexDM
\r
912 //BT_SetBtCoexAntNum(pAdapter, BT_COEX_ANT_TYPE_DETECTED, 2);
\r
914 // Init antenna diversity
\r
915 pDM_Odm->SupportAbility |= ODM_BB_ANT_DIV;
\r
916 ODM_AntDivInit(pDM_Odm);
\r
918 //3 [ Single Antenna ]
\r
921 if(pDM_Odm->DM_SWAT_Table.ANTB_ON == TRUE)
\r
923 pDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;
\r
924 pDM_Odm->DM_SWAT_Table.ANTB_ON = FALSE;
\r
926 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): Single antenna\n"));
\r
929 //2 [ Recover all parameters ]
\r
931 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask,Channel_ori);
\r
932 ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, 0xf00000, 0x0); // 3 wire enable 88c[23:20]=0x0
\r
933 ODM_SetBBReg(pDM_Odm, 0xc50, 0x7f, Regc50);
\r
935 ODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, bMaskDWord, Reg948);
\r
936 ODM_SetBBReg(pDM_Odm, rAGC_table_select, bMaskDWord, Regb2c);
\r
938 ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 1); //enable whole CCK block
\r
939 ODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0x0); //Turn on TX // Resume TX Queue
\r
940 ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, Regc14); // [ Set IQK Matrix = 0 ] equivalent to [ Turn on CCA]
\r
941 ODM_SetBBReg(pDM_Odm, 0x908, bMaskDWord, Reg908);
\r
949 odm_SwAntDetectInit(
\r
953 #if(defined(CONFIG_ANT_DETECTION))
\r
954 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
955 pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
\r
957 //pDM_SWAT_Table->PreAntenna = MAIN_ANT;
\r
958 //pDM_SWAT_Table->CurAntenna = MAIN_ANT;
\r
959 pDM_SWAT_Table->SWAS_NoLink_State = 0;
\r
960 pDM_SWAT_Table->Pre_Aux_FailDetec = FALSE;
\r
961 pDM_SWAT_Table->SWAS_NoLink_BK_Reg948 = 0xff;
\r