net: wireless: rockchip_wlan: add rtl8723ds support
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723ds / hal / phydm / phydm_antdect.c
1 /******************************************************************************\r
2  *\r
3  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
4  *                                        \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
8  *\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
12  * more details.\r
13  *\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
17  *\r
18  *\r
19  ******************************************************************************/\r
20 \r
21 //============================================================\r
22 // include files\r
23 //============================================================\r
24 \r
25 #include "mp_precomp.h"\r
26 #include "phydm_precomp.h"\r
27 \r
28 //#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN |ODM_CE))\r
29 #if(defined(CONFIG_ANT_DETECTION))\r
30 \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
34 \r
35 //1 [1. Single Tone Method] ===================================================\r
36 \r
37 //\r
38 // Description:\r
39 //      Set Single/Dual Antenna default setting for products that do not do detection in advance.\r
40 //\r
41 // Added by Joseph, 2012.03.22\r
42 //\r
43 VOID\r
44 ODM_SingleDualAntennaDefaultSetting(\r
45         IN              PVOID           pDM_VOID\r
46         )\r
47 {\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
51 \r
52         u1Byte btAntNum=BT_GetPgAntNum(pAdapter);\r
53         // Set default antenna A and B status\r
54         if(btAntNum == 2)\r
55         {\r
56                 pDM_SWAT_Table->ANTA_ON=TRUE;\r
57                 pDM_SWAT_Table->ANTB_ON=TRUE;\r
58         \r
59         }\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
64         \r
65         }\r
66         else\r
67         {\r
68                 RT_ASSERT(FALSE, ("Incorrect antenna number!!\n"));\r
69         }\r
70 }\r
71 \r
72 \r
73 //2 8723A ANT DETECT\r
74 //\r
75 // Description:\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
78 //\r
79 // Added by Roger, 2011.12.15\r
80 //\r
81 BOOLEAN\r
82 ODM_SingleDualAntennaDetection(\r
83         IN              PVOID           pDM_VOID,\r
84         IN              u1Byte                  mode\r
85         )\r
86 {\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
91         u1Byte          n;\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
107 \r
108         ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection()============>\n"));     \r
109 \r
110         \r
111         if (!(pDM_Odm->SupportICType & ODM_RTL8723B))\r
112                 return bResult;\r
113 \r
114         // Retrieve antenna detection registry info, added by Roger, 2012.11.27.\r
115         if(!IS_ANT_DETECT_SUPPORT_SINGLE_TONE(pAdapter))\r
116                 return bResult;\r
117 \r
118         //1 Backup Current RF/BB Settings       \r
119         \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
133         }\r
134 \r
135         ODM_StallExecution(10);\r
136         \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
142         \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
146         \r
147         //Set PSD 128 pts\r
148         ODM_SetBBReg(pDM_Odm, rFPGA0_PSDFunction, BIT14|BIT15, 0x0);  //128 pts\r
149         \r
150         // To SET CH1 to do\r
151         ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, ODM_CHANNEL, bRFRegOffsetMask, 0x7401);     //Channel 1\r
152         \r
153         // AFE all on step\r
154         if (pDM_Odm->SupportICType & ODM_RTL8723B)\r
155                 ODM_SetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord, 0x01c00016);\r
156 \r
157         // 3 wire Disable\r
158         ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord, 0xCCF000C0);\r
159         \r
160         //BB IQK Setting\r
161         ODM_SetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord, 0x000800E4);\r
162         ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, 0x22208000);\r
163 \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
167 \r
168         //Page B init\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
176         }\r
177         ODM_SetBBReg(pDM_Odm, rIQK_AGC_Rsp, bMaskDWord, 0x001028d0);    \r
178         ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, 0x7f, initial_gain);\r
179 \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
184         \r
185         ODM_StallExecution(10000);\r
186 \r
187         // PSD report of antenna A\r
188         PSD_report_tmp=0x0;\r
189         for (n=0;n<2;n++)\r
190         {\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
194         }\r
195 \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
201         }\r
202 \r
203         ODM_StallExecution(10); \r
204 \r
205         // PSD report of antenna B\r
206         PSD_report_tmp=0x0;\r
207         for (n=0;n<2;n++)\r
208         {\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
212         }\r
213 \r
214         //Close IQK Single Tone function\r
215         ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, 0xffffff00, 0x000000);\r
216 \r
217         //1 Return to antanna A\r
218         if (pDM_Odm->SupportICType & ODM_RTL8723B) {\r
219                 // external DPDT\r
220                 ODM_SetBBReg(pDM_Odm, rDPDT_control, bMaskDWord, Reg92c);\r
221 \r
222                 //internal S0/S1\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
227         }\r
228         \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
236 \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
240 \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
244                 \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
247                 {\r
248                         u1Byte TH1=2, TH2=6;\r
249                 \r
250                         if((AntA_report - AntB_report < TH1) || (AntB_report - AntA_report < TH1))\r
251                         {\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
255                         }\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
258                         {\r
259                                 pDM_SWAT_Table->ANTA_ON=FALSE;\r
260                                 pDM_SWAT_Table->ANTB_ON=FALSE;\r
261                                 bResult = FALSE;\r
262                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Need to check again\n"));\r
263                         }\r
264                         else\r
265                         {\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
269                         }\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
274                                 \r
275                 }\r
276                 else\r
277                 {\r
278                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("return FALSE!!\n"));\r
279                         bResult = FALSE;\r
280                 }\r
281         }\r
282         return bResult;\r
283 \r
284 }\r
285 \r
286 \r
287 \r
288 //1 [2. Scan AP RSSI Method] ==================================================\r
289 \r
290 \r
291 \r
292 \r
293 BOOLEAN\r
294 ODM_SwAntDivCheckBeforeLink(\r
295         IN              PVOID           pDM_VOID\r
296         )\r
297 {\r
298 \r
299 #if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM)\r
300 \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
307         s1Byte                  Score = 0;\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
314 \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
316 \r
317         //if(HP id)\r
318         {\r
319                 if(pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult==TRUE && pDM_Odm->SupportICType == ODM_RTL8723B)\r
320                 {\r
321                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("8723B RSSI-based Antenna Detection is done\n"));\r
322                         return FALSE;\r
323                 }\r
324                 \r
325                 if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
326                 {\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
329                 }\r
330         }\r
331 \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
334                 return FALSE;\r
335         }\r
336 \r
337         // Retrieve antenna detection registry info, added by Roger, 2012.11.27.\r
338         if(!IS_ANT_DETECT_SUPPORT_RSSI(Adapter))\r
339         {\r
340                 return FALSE;\r
341         }\r
342         else\r
343         {\r
344                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Antenna Detection: RSSI Method\n"));     \r
345         }\r
346 \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
350         {\r
351                 PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);\r
352         \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
356         \r
357                 pDM_SWAT_Table->SWAS_NoLink_State = 0;\r
358                 \r
359                 return FALSE;\r
360         }\r
361         else\r
362         {\r
363                 PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);\r
364         }\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
368         {\r
369                 //1 Prepare to do Scan again to check current antenna state.\r
370 \r
371                 // Set check state to next step.\r
372                 pDM_SWAT_Table->SWAS_NoLink_State = 1;\r
373         \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
377                 \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
383 \r
384                 \r
385                 if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8821))\r
386                 {\r
387                         if(pDM_FatTable->RxIdleAnt == MAIN_ANT)\r
388                                 ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);\r
389                         else\r
390                                 ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);\r
391                         if(ScanChannel == 0)\r
392                         {\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
395 \r
396                                 if(IS_5G_WIRELESS_MODE(pMgntInfo->dot11CurrentWirelessMode))\r
397                                 {\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
400                                 }\r
401                                 else\r
402                                 {\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
405                                 }\r
406                                 return FALSE;\r
407                         }\r
408 \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
413                                 \r
414                         tmp_SWAS_NoLink_BK_Reg948 = ODM_Read4Byte(pDM_Odm, rS0S1_PathSwitch);\r
415                         \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
420                         } else {\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
422                                 return FALSE;\r
423                         }\r
424                         ODM_StallExecution(10);\r
425 \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
427                 }\r
428                 \r
429                 odm_SwAntDivConstructScanChnl(Adapter, ScanChannel);\r
430                 PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);\r
431 \r
432                 return TRUE;\r
433         }\r
434         else //pDM_SWAT_Table->SWAS_NoLink_State == 1\r
435         {\r
436                 //1 ScanComple() is called after antenna swiched.\r
437                 //1 Check scan result and determine which antenna is going\r
438                 //1 to be used.\r
439 \r
440                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(" tmpNumBssDesc= (( %d )) \n",pMgntInfo->tmpNumBssDesc));// debug for Dino\r
441                 \r
442                 for(index = 0; index < pMgntInfo->tmpNumBssDesc; index++)\r
443                 {\r
444                         pTmpBssDesc = &(pMgntInfo->tmpbssDesc[index]); // Antenna 1\r
445                         pTestBssDesc = &(pMgntInfo->bssDesc[index]); // Antenna 2\r
446 \r
447                         if(PlatformCompareMemory(pTestBssDesc->bdBssIdBuf, pTmpBssDesc->bdBssIdBuf, 6)!=0)\r
448                         {\r
449                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): ERROR!! This shall not happen.\n"));\r
450                                 continue;\r
451                         }\r
452 \r
453                         if(pDM_Odm->SupportICType != ODM_RTL8723B)\r
454                         {\r
455                                 if(pTmpBssDesc->ChannelNumber == ScanChannel)\r
456                                 {\r
457                         if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower)\r
458                         {\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
462                         \r
463                                 Score++;\r
464                                 PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));\r
465                         }\r
466                         else if(pTmpBssDesc->RecvSignalPower < pTestBssDesc->RecvSignalPower)\r
467                         {\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
471                                 Score--;\r
472                         }\r
473                                         else\r
474                                         {\r
475                                                 if(pTestBssDesc->bdTstamp - pTmpBssDesc->bdTstamp < 5000)\r
476                                                 {\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
480                                                 }\r
481                                         }\r
482                                 }\r
483                         }\r
484                         else // 8723B\r
485                         { \r
486                                 if(pTmpBssDesc->ChannelNumber == ScanChannel)\r
487                                 {\r
488                                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ChannelNumber == ScanChannel -> (( %d )) \n", pTmpBssDesc->ChannelNumber ));\r
489                                 \r
490                                         if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower) // Pow(Ant1) > Pow(Ant2)\r
491                                         {\r
492                                                 counter++;\r
493                                                 tmp_power_diff=(u1Byte)(pTmpBssDesc->RecvSignalPower - pTestBssDesc->RecvSignalPower);\r
494                                                 power_diff = power_diff + tmp_power_diff;       \r
495                                                 \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
499 \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
506                                                 \r
507                                                 PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));\r
508                                         }\r
509                                         else if(pTestBssDesc->RecvSignalPower > pTmpBssDesc->RecvSignalPower) // Pow(Ant1) < Pow(Ant2)\r
510                                         {\r
511                                                 counter++;\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
521                                         }\r
522                                         else // Pow(Ant1) = Pow(Ant2)\r
523                                         {\r
524                                                 if(pTestBssDesc->bdTstamp > pTmpBssDesc->bdTstamp) //  Stamp(Ant1) < Stamp(Ant2) \r
525                                         {\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
528                                                 {\r
529                                                         counter++;\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
534                                                 }\r
535                                         }\r
536                                                 else\r
537                                                 {\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
539                                                 }\r
540                                 }\r
541                         }\r
542                 }\r
543                 }\r
544 \r
545                 if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8821))\r
546                 {\r
547                         if(pMgntInfo->NumBssDesc!=0 && Score<0)\r
548                         {\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
551                         }\r
552                         else\r
553                         {\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
556 \r
557                                 if(pDM_FatTable->RxIdleAnt == MAIN_ANT)\r
558                                         ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);\r
559                                 else\r
560                                         ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);\r
561                         }\r
562                         \r
563                         if(IS_5G_WIRELESS_MODE(pMgntInfo->dot11CurrentWirelessMode))\r
564                         {\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
567                         }\r
568                         else\r
569                         {\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
572                         }\r
573                 }\r
574                 else if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
575                 {\r
576                         if(counter == 0)\r
577                         {       \r
578                                 if(pDM_Odm->DM_SWAT_Table.Pre_Aux_FailDetec == FALSE)\r
579                                 {\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
583 \r
584                                         //3 [ Scan again ]\r
585                                         odm_SwAntDivConstructScanChnl(Adapter, ScanChannel);\r
586                                         PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);\r
587                                         return TRUE;\r
588                                 }\r
589                                 else// Pre_Aux_FailDetec == TRUE\r
590                                 {\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
596                                 }\r
597                                 pDM_Odm->DM_SWAT_Table.Aux_FailDetec_Counter++;\r
598                         }\r
599                         else\r
600                         {\r
601                                 pDM_Odm->DM_SWAT_Table.Pre_Aux_FailDetec = FALSE;\r
602                                 \r
603                                 if(counter==3)\r
604                                 {\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
608                                 }\r
609                                 else if(counter>=4)\r
610                                 {\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
614                                         \r
615                                 }\r
616                                 else//counter==1,2\r
617                                 {\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
620                                 }\r
621 \r
622                                 //2 [ Retry ]\r
623                                 if( (avg_power_diff >=power_target_L) && (avg_power_diff <=power_target_H)  )\r
624                                 {\r
625                                         pDM_Odm->DM_SWAT_Table.Retry_Counter++;\r
626                                         \r
627                                         if(pDM_Odm->DM_SWAT_Table.Retry_Counter<=3)\r
628                                         {\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
631 \r
632                                                  //3 [ Scan again ]\r
633                                                 odm_SwAntDivConstructScanChnl(Adapter, ScanChannel);\r
634                                                 PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);\r
635                                                 return TRUE;                                             \r
636                                         }\r
637                                         else\r
638                         {\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
642                                         }\r
643                                         \r
644                                 }\r
645                                 //2 [ Dual Antenna ]\r
646                                 else if( (pMgntInfo->NumBssDesc != 0) && (avg_power_diff < power_target_L)   ) \r
647                                 {\r
648                                         pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=TRUE;\r
649                                         if(pDM_Odm->DM_SWAT_Table.ANTB_ON == FALSE)\r
650                                         {\r
651                                                 pDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;\r
652                                                 pDM_Odm->DM_SWAT_Table.ANTB_ON = TRUE;\r
653                                         }\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
656 \r
657                                         // set bt coexDM from 1ant coexDM to 2ant coexDM\r
658                                         BT_SetBtCoexAntNum(Adapter, BT_COEX_ANT_TYPE_DETECTED, 2);\r
659                                         \r
660                                         //3 [ Init antenna diversity ]\r
661                                         pDM_Odm->SupportAbility |= ODM_BB_ANT_DIV; \r
662                                         ODM_AntDivInit(pDM_Odm);\r
663                                 }\r
664                                 //2 [ Single Antenna ]\r
665                                 else if(avg_power_diff > power_target_H)\r
666                                 {\r
667                                         pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=TRUE;\r
668                                         if(pDM_Odm->DM_SWAT_Table.ANTB_ON == TRUE)\r
669                                         {\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
673                                         }\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
676                                 }\r
677                         }\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
681 \r
682                         //2 recover the antenna setting\r
683 \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
686                         \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
688 \r
689                         \r
690                 }\r
691                 \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
695 \r
696                 return FALSE;\r
697         }\r
698 \r
699 #else\r
700                 return  FALSE;\r
701 #endif\r
702 \r
703 return FALSE;\r
704 }\r
705 \r
706 \r
707 \r
708 \r
709 \r
710 \r
711 //1 [3. PSD Method] ==========================================================\r
712 \r
713 \r
714 \r
715 \r
716 u4Byte\r
717 odm_GetPSDData(\r
718         IN      PVOID                   pDM_VOID,\r
719         IN u2Byte                       point,\r
720         IN u1Byte               initial_gain)\r
721 {\r
722         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
723         u4Byte                  psd_report;\r
724         \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
730         \r
731         psd_report = (u4Byte) (odm_ConvertTo_dB(psd_report));//+(u4Byte)(initial_gain);\r
732         return psd_report;\r
733 }\r
734 \r
735 \r
736 \r
737 VOID\r
738 ODM_SingleDualAntennaDetection_PSD(\r
739         IN       PVOID  pDM_VOID\r
740 )\r
741 {\r
742         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
743         u4Byte  Channel_ori;\r
744         u1Byte  initial_gain = 0x36;\r
745         u1Byte  tone_idx;\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
754 \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
760         \r
761 \r
762         if(pDM_Odm->SupportICType != ODM_RTL8723B)\r
763                 return;\r
764         \r
765         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection_PSD()============> \n")); \r
766         \r
767         //2 [ Backup Current RF/BB Settings ]   \r
768         \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
775 \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
780 \r
781         // PHYTXON while loop\r
782         ODM_SetBBReg(pDM_Odm, 0x908, bMaskDWord, 0x803); \r
783         while (ODM_GetBBReg(pDM_Odm, 0xdf4, BIT6)) \r
784         {\r
785                 i++;\r
786                 if (i > 1000000) \r
787                 {\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
789                         break;\r
790                 }\r
791         }\r
792         \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
798         \r
799         \r
800         //2 [ Doing PSD Function in (CH4)]\r
801         \r
802         //Antenna A\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
808         {       \r
809                 for (tone_idx=0;tone_idx<Tone_lenth_1;tone_idx++)\r
810                 {\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
814                 }\r
815         }\r
816         //Antenna B\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
821         {\r
822                 for (tone_idx=0;tone_idx<Tone_lenth_1;tone_idx++)\r
823                 {\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
827                 }\r
828         }\r
829         //2 [ Doing PSD Function in (CH8)]\r
830 \r
831         ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, 0xf00000, 0x0);  // 3 wire enable    88c[23:20]=0x0\r
832         ODM_StallExecution(3000);       \r
833         \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
836         \r
837         ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, 0xf00000, 0xf);  // 3 wire Disable    88c[23:20]=0xf\r
838         ODM_StallExecution(3000);\r
839 \r
840         //Antenna A\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
844 \r
845         for (i=0;i<test_num;i++)\r
846         {\r
847                 for (tone_idx=0;tone_idx<Tone_lenth_2;tone_idx++)\r
848                 {\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
852                 }\r
853         }\r
854 \r
855         //Antenna B\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
859 \r
860         for (i=0;i<test_num;i++)\r
861         {\r
862                 for (tone_idx=0;tone_idx<Tone_lenth_2;tone_idx++)\r
863                 {\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
867                 }\r
868         }\r
869 \r
870         //2 [ Calculate Result ]\r
871 \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
874         {\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
879         }\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
882         \r
883 \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
886         {\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
891         }\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
894                 \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
898         \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
900         \r
901         //3 [ Dual Antenna ]\r
902          if(Aux_psd_result >= PSD_power_threshold   ) \r
903         {\r
904                 if(pDM_Odm->DM_SWAT_Table.ANTB_ON == FALSE)\r
905                 {\r
906                         pDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;\r
907                         pDM_Odm->DM_SWAT_Table.ANTB_ON = TRUE;\r
908                 }\r
909                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SwAntDivCheckBeforeLink(): Dual antenna\n"));\r
910                 \r
911                 // set bt coexDM from 1ant coexDM to 2ant coexDM\r
912                 //BT_SetBtCoexAntNum(pAdapter, BT_COEX_ANT_TYPE_DETECTED, 2);\r
913                                         \r
914                 // Init antenna diversity\r
915                 pDM_Odm->SupportAbility |= ODM_BB_ANT_DIV; \r
916                 ODM_AntDivInit(pDM_Odm);\r
917                 }\r
918         //3 [ Single Antenna ]\r
919         else\r
920         {\r
921                 if(pDM_Odm->DM_SWAT_Table.ANTB_ON == TRUE)\r
922                 {\r
923                         pDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;\r
924                         pDM_Odm->DM_SWAT_Table.ANTB_ON = FALSE;\r
925                 }\r
926                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): Single antenna\n"));\r
927         }\r
928 \r
929         //2 [ Recover all parameters ]\r
930         \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
934         \r
935         ODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, bMaskDWord, Reg948);\r
936         ODM_SetBBReg(pDM_Odm, rAGC_table_select, bMaskDWord, Regb2c);\r
937 \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
942         \r
943         return;\r
944 \r
945 }\r
946 \r
947 #endif\r
948 void\r
949 odm_SwAntDetectInit(\r
950         IN              PVOID           pDM_VOID\r
951         )\r
952 {\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
956 \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
962 #endif\r
963 }\r
964 \r