d6a1c5d86fafdd7e0345b2a954ed71502ee057bf
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723bu / hal / OUTSRC / 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 \r
30 //IS_ANT_DETECT_SUPPORT_SINGLE_TONE(Adapter)    \r
31 //IS_ANT_DETECT_SUPPORT_RSSI(Adapter)           \r
32 //IS_ANT_DETECT_SUPPORT_PSD(Adapter)\r
33 \r
34 //1 [1. Single Tone Method] ===================================================\r
35 \r
36 \r
37 VOID\r
38 odm_PHY_SaveAFERegisters(\r
39         IN      PDM_ODM_T       pDM_Odm,\r
40         IN      pu4Byte         AFEReg,\r
41         IN      pu4Byte         AFEBackup,\r
42         IN      u4Byte          RegisterNum\r
43         )\r
44 {\r
45         u4Byte  i;\r
46         \r
47         //RT_DISP(FINIT, INIT_IQK, ("Save ADDA parameters.\n"));\r
48         for( i = 0 ; i < RegisterNum ; i++){\r
49                 AFEBackup[i] = ODM_GetBBReg(pDM_Odm, AFEReg[i], bMaskDWord);\r
50         }\r
51 }\r
52 \r
53 VOID\r
54 odm_PHY_ReloadAFERegisters(\r
55         IN      PDM_ODM_T       pDM_Odm,\r
56         IN      pu4Byte         AFEReg,\r
57         IN      pu4Byte         AFEBackup,\r
58         IN      u4Byte          RegiesterNum\r
59         )\r
60 {\r
61         u4Byte  i;\r
62 \r
63         //RT_DISP(FINIT, INIT_IQK, ("Reload ADDA power saving parameters !\n"));\r
64         for(i = 0 ; i < RegiesterNum; i++)\r
65         {\r
66         \r
67                 ODM_SetBBReg(pDM_Odm, AFEReg[i], bMaskDWord, AFEBackup[i]);\r
68         }\r
69 }\r
70 \r
71 //\r
72 // Description:\r
73 //      Set Single/Dual Antenna default setting for products that do not do detection in advance.\r
74 //\r
75 // Added by Joseph, 2012.03.22\r
76 //\r
77 VOID\r
78 ODM_SingleDualAntennaDefaultSetting(\r
79         IN              PDM_ODM_T               pDM_Odm\r
80         )\r
81 {\r
82         pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\r
83         PADAPTER        pAdapter         =  pDM_Odm->Adapter;\r
84 \r
85         u1Byte btAntNum=BT_GetPgAntNum(pAdapter);\r
86         // Set default antenna A and B status\r
87         if(btAntNum == 2)\r
88         {\r
89                 pDM_SWAT_Table->ANTA_ON=TRUE;\r
90                 pDM_SWAT_Table->ANTB_ON=TRUE;\r
91         \r
92         }\r
93         else if(btAntNum == 1)\r
94         {// Set antenna A as default\r
95                 pDM_SWAT_Table->ANTA_ON=TRUE;\r
96                 pDM_SWAT_Table->ANTB_ON=FALSE;\r
97         \r
98         }\r
99         else\r
100         {\r
101                 RT_ASSERT(FALSE, ("Incorrect antenna number!!\n"));\r
102         }\r
103 }\r
104 \r
105 \r
106 //2 8723A ANT DETECT\r
107 //\r
108 // Description:\r
109 //      Implement IQK single tone for RF DPK loopback and BB PSD scanning. \r
110 //      This function is cooperated with BB team Neil. \r
111 //\r
112 // Added by Roger, 2011.12.15\r
113 //\r
114 BOOLEAN\r
115 ODM_SingleDualAntennaDetection(\r
116         IN              PDM_ODM_T               pDM_Odm,\r
117         IN              u1Byte                  mode\r
118         )\r
119 {\r
120         PADAPTER        pAdapter         =  pDM_Odm->Adapter;\r
121         pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\r
122         u4Byte          CurrentChannel,RfLoopReg;\r
123         u1Byte          n;\r
124         u4Byte          Reg88c, Regc08, Reg874, Regc50, Reg948, Regb2c, Reg92c, Reg930, Reg064, AFE_rRx_Wait_CCA;\r
125         u1Byte          initial_gain = 0x5a;\r
126         u4Byte          PSD_report_tmp;\r
127         u4Byte          AntA_report = 0x0, AntB_report = 0x0,AntO_report=0x0,temp;\r
128         BOOLEAN         bResult = TRUE;\r
129         u4Byte          AFE_Backup[16];\r
130         u4Byte          AFE_REG_8723A[16] = {\r
131                                         rRx_Wait_CCA,   rTx_CCK_RFON, \r
132                                         rTx_CCK_BBON,   rTx_OFDM_RFON,\r
133                                         rTx_OFDM_BBON,  rTx_To_Rx,\r
134                                         rTx_To_Tx,              rRx_CCK, \r
135                                         rRx_OFDM,               rRx_Wait_RIFS, \r
136                                         rRx_TO_Rx,              rStandby,\r
137                                         rSleep,                 rPMPD_ANAEN,    \r
138                                         rFPGA0_XCD_SwitchControl, rBlue_Tooth};\r
139 \r
140         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection()============> \n"));     \r
141 \r
142         \r
143         if(!(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C|ODM_RTL8723B)))\r
144                 return bResult;\r
145 \r
146         // Retrieve antenna detection registry info, added by Roger, 2012.11.27.\r
147         if(!IS_ANT_DETECT_SUPPORT_SINGLE_TONE(pAdapter))\r
148                 return bResult;\r
149 \r
150         if(pDM_Odm->SupportICType == ODM_RTL8192C)\r
151         {\r
152                 //Which path in ADC/DAC is turnned on for PSD: both I/Q\r
153                 ODM_SetBBReg(pDM_Odm, 0x808, BIT10|BIT11, 0x3);\r
154                 //Ageraged number: 8\r
155                 ODM_SetBBReg(pDM_Odm, 0x808, BIT12|BIT13, 0x1);\r
156                 //pts = 128;\r
157                 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x0);\r
158         }\r
159 \r
160         //1 Backup Current RF/BB Settings       \r
161         \r
162         CurrentChannel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, ODM_CHANNEL, bRFRegOffsetMask);\r
163         RfLoopReg = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x00, bRFRegOffsetMask);\r
164         if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))\r
165         ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, ODM_DPDT, Antenna_A);  // change to Antenna A\r
166         else if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
167         {\r
168                 Reg92c = ODM_GetBBReg(pDM_Odm, rDPDT_control, bMaskDWord);      \r
169                 Reg930 = ODM_GetBBReg(pDM_Odm, rfe_ctrl_anta_src, bMaskDWord);\r
170                 Reg948 = ODM_GetBBReg(pDM_Odm, rS0S1_PathSwitch, bMaskDWord);\r
171                 Regb2c = ODM_GetBBReg(pDM_Odm, rAGC_table_select, bMaskDWord);\r
172                 Reg064 = ODM_GetMACReg(pDM_Odm, rSYM_WLBT_PAPE_SEL, BIT29);\r
173                 ODM_SetBBReg(pDM_Odm, rDPDT_control, 0x3, 0x1);\r
174                 ODM_SetBBReg(pDM_Odm, rfe_ctrl_anta_src, 0xff, 0x77);\r
175                 ODM_SetMACReg(pDM_Odm, rSYM_WLBT_PAPE_SEL, BIT29, 0x1);  //dbg 7\r
176                 ODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, 0x3c0, 0x0);//dbg 8\r
177                 ODM_SetBBReg(pDM_Odm, rAGC_table_select, BIT31, 0x0);\r
178         }\r
179 \r
180         ODM_StallExecution(10);\r
181         \r
182         //Store A Path Register 88c, c08, 874, c50\r
183         Reg88c = ODM_GetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord);\r
184         Regc08 = ODM_GetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord);\r
185         Reg874 = ODM_GetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord);\r
186         Regc50 = ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskDWord);  \r
187         \r
188         // Store AFE Registers\r
189         if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))\r
190         odm_PHY_SaveAFERegisters(pDM_Odm, AFE_REG_8723A, AFE_Backup, 16);       \r
191         else if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
192                 AFE_rRx_Wait_CCA = ODM_GetBBReg(pDM_Odm, rRx_Wait_CCA,bMaskDWord);\r
193         \r
194         //Set PSD 128 pts\r
195         ODM_SetBBReg(pDM_Odm, rFPGA0_PSDFunction, BIT14|BIT15, 0x0);  //128 pts\r
196         \r
197         // To SET CH1 to do\r
198         ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, ODM_CHANNEL, bRFRegOffsetMask, 0x7401);     //Channel 1\r
199         \r
200         // AFE all on step\r
201         if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))\r
202         {\r
203                 ODM_SetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord, 0x6FDB25A4);\r
204                 ODM_SetBBReg(pDM_Odm, rTx_CCK_RFON, bMaskDWord, 0x6FDB25A4);\r
205                 ODM_SetBBReg(pDM_Odm, rTx_CCK_BBON, bMaskDWord, 0x6FDB25A4);\r
206                 ODM_SetBBReg(pDM_Odm, rTx_OFDM_RFON, bMaskDWord, 0x6FDB25A4);\r
207                 ODM_SetBBReg(pDM_Odm, rTx_OFDM_BBON, bMaskDWord, 0x6FDB25A4);\r
208                 ODM_SetBBReg(pDM_Odm, rTx_To_Rx, bMaskDWord, 0x6FDB25A4);\r
209                 ODM_SetBBReg(pDM_Odm, rTx_To_Tx, bMaskDWord, 0x6FDB25A4);\r
210                 ODM_SetBBReg(pDM_Odm, rRx_CCK, bMaskDWord, 0x6FDB25A4);\r
211                 ODM_SetBBReg(pDM_Odm, rRx_OFDM, bMaskDWord, 0x6FDB25A4);\r
212                 ODM_SetBBReg(pDM_Odm, rRx_Wait_RIFS, bMaskDWord, 0x6FDB25A4);\r
213                 ODM_SetBBReg(pDM_Odm, rRx_TO_Rx, bMaskDWord, 0x6FDB25A4);\r
214                 ODM_SetBBReg(pDM_Odm, rStandby, bMaskDWord, 0x6FDB25A4);\r
215                 ODM_SetBBReg(pDM_Odm, rSleep, bMaskDWord, 0x6FDB25A4);\r
216                 ODM_SetBBReg(pDM_Odm, rPMPD_ANAEN, bMaskDWord, 0x6FDB25A4);\r
217                 ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_SwitchControl, bMaskDWord, 0x6FDB25A4);\r
218                 ODM_SetBBReg(pDM_Odm, rBlue_Tooth, bMaskDWord, 0x6FDB25A4);\r
219         }\r
220         else if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
221         {\r
222                 ODM_SetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord, 0x01c00016);\r
223         }\r
224 \r
225         // 3 wire Disable\r
226         ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord, 0xCCF000C0);\r
227         \r
228         //BB IQK Setting\r
229         ODM_SetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord, 0x000800E4);\r
230         ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, 0x22208000);\r
231 \r
232         //IQK setting tone@ 4.34Mhz\r
233         ODM_SetBBReg(pDM_Odm, rTx_IQK_Tone_A, bMaskDWord, 0x10008C1C);\r
234         ODM_SetBBReg(pDM_Odm, rTx_IQK, bMaskDWord, 0x01007c00); \r
235 \r
236         //Page B init\r
237         ODM_SetBBReg(pDM_Odm, rConfig_AntA, bMaskDWord, 0x00080000);\r
238         ODM_SetBBReg(pDM_Odm, rConfig_AntA, bMaskDWord, 0x0f600000);\r
239         ODM_SetBBReg(pDM_Odm, rRx_IQK, bMaskDWord, 0x01004800);\r
240         ODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_A, bMaskDWord, 0x10008c1f);\r
241         if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))\r
242         {\r
243         ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82150008);\r
244         ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x28150008);\r
245         }\r
246         else if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
247         {\r
248                 ODM_SetBBReg(pDM_Odm, rTx_IQK_PI_A, bMaskDWord, 0x82150016);\r
249                 ODM_SetBBReg(pDM_Odm, rRx_IQK_PI_A, bMaskDWord, 0x28150016);\r
250         }\r
251         ODM_SetBBReg(pDM_Odm, rIQK_AGC_Rsp, bMaskDWord, 0x001028d0);    \r
252         ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, 0x7f, initial_gain);\r
253 \r
254         //RF loop Setting\r
255         if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))\r
256         ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x0, 0xFFFFF, 0x50008);    \r
257         \r
258         //IQK Single tone start\r
259         ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, 0xffffff00, 0x808000);\r
260         ODM_SetBBReg(pDM_Odm, rIQK_AGC_Pts, bMaskDWord, 0xf9000000);\r
261         ODM_SetBBReg(pDM_Odm, rIQK_AGC_Pts, bMaskDWord, 0xf8000000);\r
262         \r
263         ODM_StallExecution(10000);\r
264 \r
265         // PSD report of antenna A\r
266         PSD_report_tmp=0x0;\r
267         for (n=0;n<2;n++)\r
268         {\r
269                 PSD_report_tmp =  GetPSDData(pDM_Odm, 14, initial_gain);        \r
270                 if(PSD_report_tmp >AntA_report)\r
271                         AntA_report=PSD_report_tmp;\r
272         }\r
273 \r
274          // change to Antenna B\r
275         if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))\r
276                 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, ODM_DPDT, Antenna_B); \r
277         else if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
278         {\r
279                 //ODM_SetBBReg(pDM_Odm, rDPDT_control, 0x3, 0x2);\r
280                 ODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, 0xfff, 0x280);\r
281                 ODM_SetBBReg(pDM_Odm, rAGC_table_select, BIT31, 0x1);\r
282         }\r
283 \r
284         ODM_StallExecution(10); \r
285 \r
286         // PSD report of antenna B\r
287         PSD_report_tmp=0x0;\r
288         for (n=0;n<2;n++)\r
289         {\r
290                 PSD_report_tmp =  GetPSDData(pDM_Odm, 14, initial_gain);        \r
291                 if(PSD_report_tmp > AntB_report)\r
292                         AntB_report=PSD_report_tmp;\r
293         }\r
294 \r
295         // change to open case\r
296         if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))\r
297         {\r
298                 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, ODM_DPDT, 0);  // change to Antenna A\r
299 \r
300                 ODM_StallExecution(10); \r
301                 \r
302                 // PSD report of open case\r
303                 PSD_report_tmp=0x0;\r
304                 for (n=0;n<2;n++)\r
305                 {\r
306                         PSD_report_tmp =  GetPSDData(pDM_Odm, 14, initial_gain);        \r
307                         if(PSD_report_tmp > AntO_report)\r
308                                 AntO_report=PSD_report_tmp;\r
309                 }\r
310         }\r
311         //Close IQK Single Tone function\r
312         ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, 0xffffff00, 0x000000);\r
313 \r
314         //1 Return to antanna A\r
315         if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))\r
316                 ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, ODM_DPDT, Antenna_A);  // change to Antenna A\r
317         else if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
318         {\r
319                 // external DPDT\r
320                 ODM_SetBBReg(pDM_Odm, rDPDT_control, bMaskDWord, Reg92c);\r
321 \r
322                 //internal S0/S1\r
323                 ODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, bMaskDWord, Reg948);\r
324                 ODM_SetBBReg(pDM_Odm, rAGC_table_select, bMaskDWord, Regb2c);\r
325                 ODM_SetBBReg(pDM_Odm, rfe_ctrl_anta_src, bMaskDWord, Reg930);\r
326                 ODM_SetMACReg(pDM_Odm, rSYM_WLBT_PAPE_SEL, BIT29, Reg064);\r
327         }\r
328         \r
329         ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, bMaskDWord, Reg88c);\r
330         ODM_SetBBReg(pDM_Odm, rOFDM0_TRMuxPar, bMaskDWord, Regc08);\r
331         ODM_SetBBReg(pDM_Odm, rFPGA0_XCD_RFInterfaceSW, bMaskDWord, Reg874);\r
332         ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, 0x7F, 0x40);\r
333         ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskDWord, Regc50);\r
334         ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask,CurrentChannel);\r
335         ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x00, bRFRegOffsetMask,RfLoopReg);\r
336 \r
337         //Reload AFE Registers\r
338         if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8192C))\r
339                 odm_PHY_ReloadAFERegisters(pDM_Odm, AFE_REG_8723A, AFE_Backup, 16);     \r
340         else if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
341                 ODM_SetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord, AFE_rRx_Wait_CCA);\r
342 \r
343         if(pDM_Odm->SupportICType == ODM_RTL8723A)\r
344         {\r
345                 //2 Test Ant B based on Ant A is ON\r
346                 if(mode==ANTTESTB)\r
347                 {\r
348                         if(AntA_report >=       100)\r
349                         {\r
350                                 if(AntB_report > (AntA_report+1))\r
351                                 {\r
352                                         pDM_SWAT_Table->ANTB_ON=FALSE;\r
353                                                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Single Antenna A\n"));         \r
354                                 }       \r
355                                 else\r
356                                 {\r
357                                         pDM_SWAT_Table->ANTB_ON=TRUE;\r
358                                                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Dual Antenna is A and B\n"));  \r
359                                 }       \r
360                         }\r
361                         else\r
362                         {\r
363                                                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Need to check again\n"));\r
364                                 pDM_SWAT_Table->ANTB_ON=FALSE; // Set Antenna B off as default \r
365                                 bResult = FALSE;\r
366                         }\r
367                 }       \r
368                 //2 Test Ant A and B based on DPDT Open\r
369                 else if(mode==ANTTESTALL)\r
370                 {\r
371                         if((AntO_report >=100) && (AntO_report <=118))\r
372                         {\r
373                                 if(AntA_report > (AntO_report+1))\r
374                                 {\r
375                                         pDM_SWAT_Table->ANTA_ON=FALSE;\r
376                                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant A is OFF\n"));\r
377                                 }       \r
378                                 else\r
379                                 {\r
380                                         pDM_SWAT_Table->ANTA_ON=TRUE;\r
381                                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant A is ON\n"));\r
382                                 }\r
383 \r
384                                 if(AntB_report > (AntO_report+2))\r
385                                 {\r
386                                         pDM_SWAT_Table->ANTB_ON=FALSE;\r
387                                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant B is OFF\n"));\r
388                                 }       \r
389                                 else\r
390                                 {\r
391                                         pDM_SWAT_Table->ANTB_ON=TRUE;\r
392                                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("Ant B is ON\n"));\r
393                                 }\r
394                                 \r
395                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_A[%d]= %d \n", 2416, AntA_report));   \r
396                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_B[%d]= %d \n", 2416, AntB_report));   \r
397                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_O[%d]= %d \n", 2416, AntO_report));\r
398                                 \r
399                                 pDM_Odm->AntDetectedInfo.bAntDetected= TRUE;\r
400                                 pDM_Odm->AntDetectedInfo.dBForAntA = AntA_report;\r
401                                 pDM_Odm->AntDetectedInfo.dBForAntB = AntB_report;\r
402                                 pDM_Odm->AntDetectedInfo.dBForAntO = AntO_report;\r
403                                 \r
404                                 }\r
405                         else\r
406                                 {\r
407                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("return FALSE!!\n"));\r
408                                 bResult = FALSE;\r
409                         }\r
410                 }\r
411         }\r
412         else if(pDM_Odm->SupportICType == ODM_RTL8192C)\r
413         {\r
414                 if(AntA_report >=       100)\r
415                 {\r
416                         if(AntB_report > (AntA_report+2))\r
417                         {\r
418                                 pDM_SWAT_Table->ANTA_ON=FALSE;\r
419                                 pDM_SWAT_Table->ANTB_ON=TRUE;\r
420                                 ODM_SetBBReg(pDM_Odm,  rFPGA0_XA_RFInterfaceOE, 0x300, Antenna_B);\r
421                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Single Antenna B\n"));         \r
422                         }       \r
423                         else if(AntA_report > (AntB_report+2))\r
424                         {\r
425                                 pDM_SWAT_Table->ANTA_ON=TRUE;\r
426                                 pDM_SWAT_Table->ANTB_ON=FALSE;\r
427                                 ODM_SetBBReg(pDM_Odm,  rFPGA0_XA_RFInterfaceOE, 0x300, Antenna_A);\r
428                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Single Antenna A\n"));\r
429                         }       \r
430                         else\r
431                         {\r
432                                 pDM_SWAT_Table->ANTA_ON=TRUE;\r
433                                 pDM_SWAT_Table->ANTB_ON=TRUE;\r
434                         }\r
435                 }\r
436                 else\r
437                 {\r
438                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Need to check again\n"));\r
439                         pDM_SWAT_Table->ANTA_ON=TRUE; // Set Antenna A on as default \r
440                         pDM_SWAT_Table->ANTB_ON=FALSE; // Set Antenna B off as default \r
441                         bResult = FALSE;\r
442                 }\r
443         }\r
444         else if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
445         {\r
446                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_A[%d]= %d \n", 2416, AntA_report));   \r
447                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("psd_report_B[%d]= %d \n", 2416, AntB_report));   \r
448                 \r
449                 //2 Test Ant B based on Ant A is ON\r
450                 if((AntA_report >= 100) && (AntB_report >= 100) && (AntA_report <= 135) && (AntB_report <= 135))\r
451                 {\r
452                         u1Byte TH1=2, TH2=6;\r
453                 \r
454                         if((AntA_report - AntB_report < TH1) || (AntB_report - AntA_report < TH1))\r
455                         {\r
456                                 pDM_SWAT_Table->ANTA_ON=TRUE;\r
457                                 pDM_SWAT_Table->ANTB_ON=TRUE;\r
458                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SingleDualAntennaDetection(): Dual Antenna\n"));\r
459                         }\r
460                         else if(((AntA_report - AntB_report >= TH1) && (AntA_report - AntB_report <= TH2)) || \r
461                                 ((AntB_report - AntA_report >= TH1) && (AntB_report - AntA_report <= TH2)))\r
462                         {\r
463                                 pDM_SWAT_Table->ANTA_ON=FALSE;\r
464                                 pDM_SWAT_Table->ANTB_ON=FALSE;\r
465                                 bResult = FALSE;\r
466                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection(): Need to check again\n"));\r
467                         }\r
468                         else\r
469                         {\r
470                                 pDM_SWAT_Table->ANTA_ON = TRUE;\r
471                                 pDM_SWAT_Table->ANTB_ON=FALSE;\r
472                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SingleDualAntennaDetection(): Single Antenna\n"));\r
473                         }\r
474                         pDM_Odm->AntDetectedInfo.bAntDetected= TRUE;\r
475                         pDM_Odm->AntDetectedInfo.dBForAntA = AntA_report;\r
476                         pDM_Odm->AntDetectedInfo.dBForAntB = AntB_report;\r
477                         pDM_Odm->AntDetectedInfo.dBForAntO = AntO_report;\r
478                                 \r
479                 }\r
480                 else\r
481                 {\r
482                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("return FALSE!!\n"));\r
483                         bResult = FALSE;\r
484                 }\r
485         }\r
486         return bResult;\r
487 \r
488 }\r
489 \r
490 \r
491 \r
492 //1 [2. Scan AP RSSI Method] ==================================================\r
493 \r
494 \r
495 void\r
496 odm_SwAntDetectInit(\r
497         IN              PDM_ODM_T               pDM_Odm\r
498         )\r
499 {\r
500         pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\r
501         \r
502         //pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c = ODM_Read4Byte(pDM_Odm, rDPDT_control);\r
503         //pDM_SWAT_Table->PreAntenna = MAIN_ANT;\r
504         //pDM_SWAT_Table->CurAntenna = MAIN_ANT;\r
505         pDM_SWAT_Table->SWAS_NoLink_State = 0;\r
506         pDM_SWAT_Table->Pre_Aux_FailDetec = FALSE;\r
507         pDM_SWAT_Table->SWAS_NoLink_BK_Reg948 = 0xff;\r
508 }\r
509 \r
510 \r
511 BOOLEAN\r
512 ODM_SwAntDivCheckBeforeLink(\r
513         IN              PDM_ODM_T               pDM_Odm\r
514         )\r
515 {\r
516 \r
517 #if (RT_MEM_SIZE_LEVEL != RT_MEM_SIZE_MINIMUM)\r
518 \r
519         PADAPTER                Adapter = pDM_Odm->Adapter;\r
520         HAL_DATA_TYPE*  pHalData = GET_HAL_DATA(Adapter);\r
521         PMGNT_INFO              pMgntInfo = &Adapter->MgntInfo;\r
522         pSWAT_T                 pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\r
523         pFAT_T  pDM_FatTable = &pDM_Odm->DM_FatTable;\r
524         s1Byte                  Score = 0;\r
525         PRT_WLAN_BSS    pTmpBssDesc, pTestBssDesc;\r
526         u1Byte                  power_target = 10, power_target_L = 9, power_target_H = 16;\r
527         u1Byte                  tmp_power_diff = 0,power_diff = 0,avg_power_diff = 0,max_power_diff = 0,min_power_diff = 0xff;\r
528         u2Byte                  index, counter = 0;\r
529         static u1Byte           ScanChannel;\r
530         u8Byte                  tStamp_diff = 0;                \r
531         u4Byte                  tmp_SWAS_NoLink_BK_Reg948;\r
532 \r
533         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
534 \r
535         //if(HP id)\r
536         {\r
537                 if(pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult==TRUE && pDM_Odm->SupportICType == ODM_RTL8723B)\r
538                 {\r
539                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("8723B RSSI-based Antenna Detection is done\n"));\r
540                         return FALSE;\r
541                 }\r
542                 \r
543                 if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
544                 {\r
545                         if(pDM_SWAT_Table->SWAS_NoLink_BK_Reg948 == 0xff)\r
546                                 pDM_SWAT_Table->SWAS_NoLink_BK_Reg948 = ODM_Read4Byte(pDM_Odm, rS0S1_PathSwitch );\r
547                 }\r
548         }\r
549 \r
550         if (pDM_Odm->Adapter == NULL)  //For BSOD when plug/unplug fast.  //By YJ,120413\r
551         {       // The ODM structure is not initialized.\r
552                 return FALSE;\r
553         }\r
554 \r
555         // Retrieve antenna detection registry info, added by Roger, 2012.11.27.\r
556         if(!IS_ANT_DETECT_SUPPORT_RSSI(Adapter))\r
557         {\r
558                 return FALSE;\r
559         }\r
560         else\r
561         {\r
562                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Antenna Detection: RSSI Method\n"));     \r
563         }\r
564 \r
565         // Since driver is going to set BB register, it shall check if there is another thread controlling BB/RF.\r
566         PlatformAcquireSpinLock(Adapter, RT_RF_STATE_SPINLOCK);\r
567         if(pHalData->eRFPowerState!=eRfOn || pMgntInfo->RFChangeInProgress || pMgntInfo->bMediaConnect)\r
568         {\r
569                 PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);\r
570         \r
571                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, \r
572                                 ("ODM_SwAntDivCheckBeforeLink(): RFChangeInProgress(%x), eRFPowerState(%x)\n", \r
573                                 pMgntInfo->RFChangeInProgress, pHalData->eRFPowerState));\r
574         \r
575                 pDM_SWAT_Table->SWAS_NoLink_State = 0;\r
576                 \r
577                 return FALSE;\r
578         }\r
579         else\r
580         {\r
581                 PlatformReleaseSpinLock(Adapter, RT_RF_STATE_SPINLOCK);\r
582         }\r
583         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
584         //1 Run AntDiv mechanism "Before Link" part.\r
585         if(pDM_SWAT_Table->SWAS_NoLink_State == 0)\r
586         {\r
587                 //1 Prepare to do Scan again to check current antenna state.\r
588 \r
589                 // Set check state to next step.\r
590                 pDM_SWAT_Table->SWAS_NoLink_State = 1;\r
591         \r
592                 // Copy Current Scan list.\r
593                 pMgntInfo->tmpNumBssDesc = pMgntInfo->NumBssDesc;\r
594                 PlatformMoveMemory((PVOID)Adapter->MgntInfo.tmpbssDesc, (PVOID)pMgntInfo->bssDesc, sizeof(RT_WLAN_BSS)*MAX_BSS_DESC);\r
595                 \r
596                 // Go back to scan function again.\r
597                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Scan one more time\n"));\r
598                 pMgntInfo->ScanStep=0;\r
599                 pMgntInfo->bScanAntDetect = TRUE;\r
600                 ScanChannel = odm_SwAntDivSelectScanChnl(Adapter);\r
601 \r
602                 \r
603                 if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8821))\r
604                 {\r
605                         if(pDM_FatTable->RxIdleAnt == MAIN_ANT)\r
606                                 ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);\r
607                         else\r
608                                 ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);\r
609                         if(ScanChannel == 0)\r
610                         {\r
611                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, \r
612                                         ("ODM_SwAntDivCheckBeforeLink(): No AP List Avaiable, Using Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"AUX_ANT":"MAIN_ANT"));\r
613 \r
614                                 if(IS_5G_WIRELESS_MODE(pMgntInfo->dot11CurrentWirelessMode))\r
615                                 {\r
616                                         pDM_SWAT_Table->Ant5G = pDM_FatTable->RxIdleAnt;\r
617                                         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
618                                 }\r
619                                 else\r
620                                 {\r
621                                         pDM_SWAT_Table->Ant2G = pDM_FatTable->RxIdleAnt;\r
622                                         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
623                                 }\r
624                                 return FALSE;\r
625                         }\r
626 \r
627                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, \r
628                                 ("ODM_SwAntDivCheckBeforeLink: Change to %s for testing.\n", ((pDM_FatTable->RxIdleAnt == MAIN_ANT)?"MAIN_ANT":"AUX_ANT")));\r
629                 }\r
630                 else if(pDM_Odm->SupportICType & (ODM_RTL8192C|ODM_RTL8723B))\r
631                 {\r
632                         if(pDM_Odm->SupportICType == ODM_RTL8192C)\r
633                         {\r
634                         // Switch Antenna to another one.\r
635                         pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;\r
636                         pDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?AUX_ANT:MAIN_ANT;\r
637                         \r
638                                 pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));\r
639                                 ODM_SetBBReg(pDM_Odm,  rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);\r
640                         }\r
641                         else if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
642                         {\r
643                                 // Switch Antenna to another one.\r
644                                 \r
645                                 tmp_SWAS_NoLink_BK_Reg948 = ODM_Read4Byte(pDM_Odm, rS0S1_PathSwitch );\r
646                                 \r
647                                 if( (pDM_SWAT_Table->CurAntenna = MAIN_ANT) && (tmp_SWAS_NoLink_BK_Reg948==0x200))\r
648                                 {\r
649                                         ODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, 0xfff, 0x280);\r
650                                         ODM_SetBBReg(pDM_Odm, rAGC_table_select, BIT31, 0x1);\r
651                                         pDM_SWAT_Table->CurAntenna = AUX_ANT;\r
652                         }\r
653                                 else\r
654                                 {\r
655                                         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
656                                         return FALSE;\r
657                                 }\r
658                                 ODM_StallExecution(10);\r
659                 \r
660                         }\r
661                         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
662                 }\r
663                 \r
664                 odm_SwAntDivConstructScanChnl(Adapter, ScanChannel);\r
665                 PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);\r
666 \r
667                 return TRUE;\r
668         }\r
669         else //pDM_SWAT_Table->SWAS_NoLink_State == 1\r
670         {\r
671                 //1 ScanComple() is called after antenna swiched.\r
672                 //1 Check scan result and determine which antenna is going\r
673                 //1 to be used.\r
674 \r
675                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(" tmpNumBssDesc= (( %d )) \n",pMgntInfo->tmpNumBssDesc));// debug for Dino\r
676                 \r
677                 for(index = 0; index < pMgntInfo->tmpNumBssDesc; index++)\r
678                 {\r
679                         pTmpBssDesc = &(pMgntInfo->tmpbssDesc[index]); // Antenna 1\r
680                         pTestBssDesc = &(pMgntInfo->bssDesc[index]); // Antenna 2\r
681 \r
682                         if(PlatformCompareMemory(pTestBssDesc->bdBssIdBuf, pTmpBssDesc->bdBssIdBuf, 6)!=0)\r
683                         {\r
684                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): ERROR!! This shall not happen.\n"));\r
685                                 continue;\r
686                         }\r
687 \r
688                         if(pDM_Odm->SupportICType != ODM_RTL8723B)\r
689                         {\r
690                                 if(pTmpBssDesc->ChannelNumber == ScanChannel)\r
691                                 {\r
692                         if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower)\r
693                         {\r
694                                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Compare scan entry: Score++\n"));\r
695                                                 RT_PRINT_STR(COMP_SCAN, DBG_WARNING, "GetScanInfo(): new Bss SSID:", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen);\r
696                                                 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
697                         \r
698                                 Score++;\r
699                                 PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));\r
700                         }\r
701                         else if(pTmpBssDesc->RecvSignalPower < pTestBssDesc->RecvSignalPower)\r
702                         {\r
703                                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink: Compare scan entry: Score--\n"));\r
704                                                 RT_PRINT_STR(COMP_SCAN, DBG_WARNING, "GetScanInfo(): new Bss SSID:", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen);\r
705                                                 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
706                                 Score--;\r
707                         }\r
708                                         else\r
709                                         {\r
710                                                 if(pTestBssDesc->bdTstamp - pTmpBssDesc->bdTstamp < 5000)\r
711                                                 {\r
712                                                         RT_PRINT_STR(COMP_SCAN, DBG_WARNING, "GetScanInfo(): new Bss SSID:", pTmpBssDesc->bdSsIdBuf, pTmpBssDesc->bdSsIdLen);\r
713                                                         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
714                                                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("The 2nd Antenna didn't get this AP\n\n"));\r
715                                                 }\r
716                                         }\r
717                                 }\r
718                         }\r
719                         else // 8723B\r
720                         { \r
721                                 if(pTmpBssDesc->ChannelNumber == ScanChannel)\r
722                                 {\r
723                                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ChannelNumber == ScanChannel -> (( %d )) \n", pTmpBssDesc->ChannelNumber ));\r
724                                 \r
725                                         if(pTmpBssDesc->RecvSignalPower > pTestBssDesc->RecvSignalPower) // Pow(Ant1) > Pow(Ant2)\r
726                                         {\r
727                                                 counter++;\r
728                                                 tmp_power_diff=(u1Byte)(pTmpBssDesc->RecvSignalPower - pTestBssDesc->RecvSignalPower);\r
729                                                 power_diff = power_diff + tmp_power_diff;       \r
730                                                 \r
731                                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));\r
732                                                 ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("SSID:"), pTmpBssDesc->bdSsIdBuf);\r
733                                                 ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("BSSID:"), pTmpBssDesc->bdBssIdBuf);\r
734 \r
735                                                 //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
736                                                 if(tmp_power_diff > max_power_diff)\r
737                                                         max_power_diff=tmp_power_diff;\r
738                                                 if(tmp_power_diff < min_power_diff)\r
739                                                         min_power_diff=tmp_power_diff;\r
740                                                 //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
741                                                 \r
742                                                 PlatformMoveMemory(pTestBssDesc, pTmpBssDesc, sizeof(RT_WLAN_BSS));\r
743                                         }\r
744                                         else if(pTestBssDesc->RecvSignalPower > pTmpBssDesc->RecvSignalPower) // Pow(Ant1) < Pow(Ant2)\r
745                                         {\r
746                                                 counter++;\r
747                                                 tmp_power_diff=(u1Byte)(pTestBssDesc->RecvSignalPower - pTmpBssDesc->RecvSignalPower);\r
748                                                 power_diff = power_diff + tmp_power_diff;                                               \r
749                                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));\r
750                                                 ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("SSID:"), pTmpBssDesc->bdSsIdBuf);\r
751                                                 ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("BSSID:"), pTmpBssDesc->bdBssIdBuf);                                                        \r
752                                                 if(tmp_power_diff > max_power_diff)\r
753                                                         max_power_diff=tmp_power_diff;\r
754                                                 if(tmp_power_diff < min_power_diff)\r
755                                                         min_power_diff=tmp_power_diff;                                                  \r
756                                         }\r
757                                         else // Pow(Ant1) = Pow(Ant2)\r
758                                         {\r
759                                                 if(pTestBssDesc->bdTstamp > pTmpBssDesc->bdTstamp) //  Stamp(Ant1) < Stamp(Ant2) \r
760                                         {\r
761                                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("time_diff: %lld\n", (pTestBssDesc->bdTstamp-pTmpBssDesc->bdTstamp)/1000));\r
762                                                 if(pTestBssDesc->bdTstamp - pTmpBssDesc->bdTstamp > 5000)\r
763                                                 {\r
764                                                         counter++;\r
765                                                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Original: %d, Test: %d\n", pTmpBssDesc->RecvSignalPower, pTestBssDesc->RecvSignalPower));\r
766                                                         ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("SSID:"), pTmpBssDesc->bdSsIdBuf);\r
767                                                                 ODM_PRINT_ADDR(pDM_Odm,ODM_COMP_ANT_DIV, DBG_LOUD, ("BSSID:"), pTmpBssDesc->bdBssIdBuf);\r
768                                                                 min_power_diff = 0;\r
769                                                 }\r
770                                         }\r
771                                                 else\r
772                                                 {\r
773                                                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Error !!!]: Time_diff: %lld\n", (pTestBssDesc->bdTstamp-pTmpBssDesc->bdTstamp)/1000));\r
774                                                 }\r
775                                 }\r
776                         }\r
777                 }\r
778                 }\r
779 \r
780                 if(pDM_Odm->SupportICType & (ODM_RTL8188E|ODM_RTL8821))\r
781                 {\r
782                         if(pMgntInfo->NumBssDesc!=0 && Score<0)\r
783                         {\r
784                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,\r
785                                                         ("ODM_SwAntDivCheckBeforeLink(): Using Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));\r
786                         }\r
787                         else\r
788                         {\r
789                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, \r
790                                                 ("ODM_SwAntDivCheckBeforeLink(): Remain Ant(%s)\n", (pDM_FatTable->RxIdleAnt==MAIN_ANT)?"AUX_ANT":"MAIN_ANT"));\r
791 \r
792                                 if(pDM_FatTable->RxIdleAnt == MAIN_ANT)\r
793                                         ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);\r
794                                 else\r
795                                         ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);\r
796                         }\r
797                         \r
798                         if(IS_5G_WIRELESS_MODE(pMgntInfo->dot11CurrentWirelessMode))\r
799                         {\r
800                                 pDM_SWAT_Table->Ant5G = pDM_FatTable->RxIdleAnt;\r
801                                 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
802                         }\r
803                         else\r
804                         {\r
805                                 pDM_SWAT_Table->Ant2G = pDM_FatTable->RxIdleAnt;\r
806                                 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
807                         }\r
808                 }\r
809                 else if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
810                 {\r
811                         if(counter == 0)\r
812                         {       \r
813                                 if(pDM_Odm->DM_SWAT_Table.Pre_Aux_FailDetec == FALSE)\r
814                                 {\r
815                                         pDM_Odm->DM_SWAT_Table.Pre_Aux_FailDetec = TRUE;\r
816                                         pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=FALSE;\r
817                                         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
818 \r
819                                         //3 [ Scan again ]\r
820                                         odm_SwAntDivConstructScanChnl(Adapter, ScanChannel);\r
821                                         PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);\r
822                                         return TRUE;\r
823                                 }\r
824                                 else// Pre_Aux_FailDetec == TRUE\r
825                                 {\r
826                                         //2 [ Single Antenna ]\r
827                                         pDM_Odm->DM_SWAT_Table.Pre_Aux_FailDetec = FALSE;\r
828                                         pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=TRUE;\r
829                                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Counter=(( 0 )) , [[  Still cannot find any AP ]] \n"));\r
830                                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): Single antenna\n"));      \r
831                                 }\r
832                                 pDM_Odm->DM_SWAT_Table.Aux_FailDetec_Counter++;\r
833                         }\r
834                         else\r
835                         {\r
836                                 pDM_Odm->DM_SWAT_Table.Pre_Aux_FailDetec = FALSE;\r
837                                 \r
838                                 if(counter==3)\r
839                                 {\r
840                                         avg_power_diff = ((power_diff-max_power_diff - min_power_diff)>>1)+ ((max_power_diff + min_power_diff)>>2);\r
841                                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("counter: (( %d )) ,  power_diff: (( %d )) \n", counter, power_diff));\r
842                                         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
843                                 }\r
844                                 else if(counter>=4)\r
845                                 {\r
846                                         avg_power_diff=(power_diff-max_power_diff - min_power_diff) / (counter - 2);\r
847                                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("counter: (( %d )) ,  power_diff: (( %d )) \n", counter, power_diff));\r
848                                         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
849                                         \r
850                                 }\r
851                                 else//counter==1,2\r
852                                 {\r
853                                         avg_power_diff=power_diff/counter;\r
854                                         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
855                                 }\r
856 \r
857                                 //2 [ Retry ]\r
858                                 if( (avg_power_diff >=power_target_L) && (avg_power_diff <=power_target_H)  )\r
859                                 {\r
860                                         pDM_Odm->DM_SWAT_Table.Retry_Counter++;\r
861                                         \r
862                                         if(pDM_Odm->DM_SWAT_Table.Retry_Counter<=3)\r
863                                         {\r
864                                                 pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=FALSE;\r
865                                                 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
866 \r
867                                                  //3 [ Scan again ]\r
868                                                 odm_SwAntDivConstructScanChnl(Adapter, ScanChannel);\r
869                                                 PlatformSetTimer(Adapter, &pMgntInfo->ScanTimer, 5);\r
870                                                 return TRUE;                                             \r
871                                         }\r
872                                         else\r
873                         {\r
874                                                 pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=TRUE;\r
875                                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[[ Still Low confidence result ]]  (( Retry_Counter > 3 )) \n"));\r
876                                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): Single antenna\n"));\r
877                                         }\r
878                                         \r
879                                 }\r
880                                 //2 [ Dual Antenna ]\r
881                                 else if( (pMgntInfo->NumBssDesc != 0) && (avg_power_diff < power_target_L)   ) \r
882                                 {\r
883                                         pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=TRUE;\r
884                                         if(pDM_Odm->DM_SWAT_Table.ANTB_ON == FALSE)\r
885                                         {\r
886                                                 pDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;\r
887                                                 pDM_Odm->DM_SWAT_Table.ANTB_ON = TRUE;\r
888                                         }\r
889                                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SwAntDivCheckBeforeLink(): Dual antenna\n"));\r
890                                         pDM_Odm->DM_SWAT_Table.Dual_Ant_Counter++;\r
891 \r
892                                         // set bt coexDM from 1ant coexDM to 2ant coexDM\r
893                                         BT_SetBtCoexAntNum(Adapter, BT_COEX_ANT_TYPE_DETECTED, 2);\r
894                                         \r
895                                         //3 [ Init antenna diversity ]\r
896                                         pDM_Odm->SupportAbility |= ODM_BB_ANT_DIV; \r
897                                         ODM_AntDivInit(pDM_Odm);\r
898                                 }\r
899                                 //2 [ Single Antenna ]\r
900                                 else if(avg_power_diff > power_target_H)\r
901                                 {\r
902                                         pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult=TRUE;\r
903                                         if(pDM_Odm->DM_SWAT_Table.ANTB_ON == TRUE)\r
904                                         {\r
905                                                 pDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;\r
906                                                 pDM_Odm->DM_SWAT_Table.ANTB_ON = FALSE;\r
907                                                 //BT_SetBtCoexAntNum(Adapter, BT_COEX_ANT_TYPE_DETECTED, 1);\r
908                                         }\r
909                                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): Single antenna\n"));\r
910                                         pDM_Odm->DM_SWAT_Table.Single_Ant_Counter++;\r
911                                 }\r
912                         }\r
913                         //ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("bResult=(( %d ))\n",pDM_Odm->DM_SWAT_Table.RSSI_AntDect_bResult));\r
914                 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
915                         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
916 \r
917                         //2 recover the antenna setting\r
918 \r
919                         if(pDM_Odm->DM_SWAT_Table.ANTB_ON == FALSE)\r
920                                 ODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, 0xfff, (pDM_SWAT_Table->SWAS_NoLink_BK_Reg948));\r
921                         \r
922                         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
923 \r
924                         \r
925                 }\r
926                 else if(pDM_Odm->SupportICType == ODM_RTL8192C)\r
927                 {\r
928                         if(pMgntInfo->NumBssDesc!=0 && Score<=0)\r
929                         {\r
930                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,\r
931                                         ("ODM_SwAntDivCheckBeforeLink(): Using Ant(%s)\n", (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?"MAIN":"AUX"));\r
932 \r
933                                 pDM_SWAT_Table->PreAntenna = pDM_SWAT_Table->CurAntenna;\r
934                         }\r
935                         else\r
936                         {\r
937                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, \r
938                                         ("ODM_SwAntDivCheckBeforeLink(): Remain Ant(%s)\n", (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?"AUX":"MAIN"));\r
939 \r
940                                 pDM_SWAT_Table->CurAntenna = pDM_SWAT_Table->PreAntenna;\r
941 \r
942                                 //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, DM_SWAT_Table.CurAntenna);\r
943                                 pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 = ((pDM_SWAT_Table->SWAS_NoLink_BK_Reg860 & 0xfffffcff) | (pDM_SWAT_Table->CurAntenna<<8));\r
944                                 PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, bMaskDWord, pDM_SWAT_Table->SWAS_NoLink_BK_Reg860);\r
945                         }\r
946                 }\r
947                 \r
948                 // Check state reset to default and wait for next time.\r
949                 pDM_SWAT_Table->SWAS_NoLink_State = 0;\r
950                 pMgntInfo->bScanAntDetect = FALSE;\r
951 \r
952                 return FALSE;\r
953         }\r
954 \r
955 #else\r
956                 return  FALSE;\r
957 #endif\r
958 \r
959 return FALSE;\r
960 }\r
961 \r
962 \r
963 \r
964 \r
965 \r
966 \r
967 //1 [3. PSD Method] ==========================================================\r
968 \r
969 \r
970 \r
971 \r
972 u4Byte\r
973 odm_GetPSDData(\r
974         IN PDM_ODM_T    pDM_Odm,\r
975         IN u2Byte                       point,\r
976         IN u1Byte               initial_gain)\r
977 {\r
978         u4Byte                  psd_report;\r
979         \r
980         ODM_SetBBReg(pDM_Odm, 0x808, 0x3FF, point);\r
981         ODM_SetBBReg(pDM_Odm, 0x808, BIT22, 1);  //Start PSD calculation, Reg808[22]=0->1\r
982         ODM_StallExecution(150);//Wait for HW PSD report\r
983         ODM_SetBBReg(pDM_Odm, 0x808, BIT22, 0);//Stop PSD calculation,  Reg808[22]=1->0\r
984         psd_report = ODM_GetBBReg(pDM_Odm,0x8B4, bMaskDWord) & 0x0000FFFF;//Read PSD report, Reg8B4[15:0]\r
985         \r
986         psd_report = (u4Byte) (ConvertTo_dB(psd_report));//+(u4Byte)(initial_gain);\r
987         return psd_report;\r
988 }\r
989 \r
990 \r
991 \r
992 VOID\r
993 ODM_SingleDualAntennaDetection_PSD(\r
994         IN       PDM_ODM_T      pDM_Odm\r
995 )\r
996 {\r
997         PADAPTER        pAdapter         =  pDM_Odm->Adapter;\r
998         pSWAT_T         pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;\r
999         u4Byte  Channel_ori;\r
1000         u1Byte  initial_gain = 0x36;\r
1001         u1Byte  tone_idx;\r
1002         u1Byte  Tone_lenth_1=7, Tone_lenth_2=4;\r
1003         u2Byte  Tone_idx_1[7]={88, 104, 120, 8, 24, 40, 56};\r
1004         u2Byte  Tone_idx_2[4]={8, 24, 40, 56};\r
1005         u4Byte  PSD_report_Main[11]={0}, PSD_report_Aux[11]={0};\r
1006         //u1Byte        Tone_lenth_1=4, Tone_lenth_2=2;\r
1007         //u2Byte        Tone_idx_1[4]={88, 120, 24, 56};\r
1008         //u2Byte        Tone_idx_2[2]={ 24,  56};\r
1009         //u4Byte        PSD_report_Main[6]={0}, PSD_report_Aux[6]={0};\r
1010 \r
1011         u4Byte  PSD_report_temp,MAX_PSD_report_Main=0,MAX_PSD_report_Aux=0;\r
1012         u4Byte  PSD_power_threshold;\r
1013         u4Byte  Main_psd_result=0, Aux_psd_result=0;\r
1014         u4Byte  Regc50, Reg948, Regb2c,Regc14,Reg908;\r
1015         u4Byte  i=0,test_num=8;\r
1016         \r
1017 \r
1018         if(pDM_Odm->SupportICType != ODM_RTL8723B)\r
1019                 return;\r
1020         \r
1021         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SingleDualAntennaDetection_PSD()============> \n")); \r
1022         \r
1023         //2 [ Backup Current RF/BB Settings ]   \r
1024         \r
1025         Channel_ori = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, ODM_CHANNEL, bRFRegOffsetMask);\r
1026         Reg948 = ODM_GetBBReg(pDM_Odm, rS0S1_PathSwitch, bMaskDWord);\r
1027         Regb2c =  ODM_GetBBReg(pDM_Odm, rAGC_table_select, bMaskDWord);\r
1028         Regc50 = ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskDWord);\r
1029         Regc14 = ODM_GetBBReg(pDM_Odm, 0xc14, bMaskDWord);\r
1030         Reg908 = ODM_GetBBReg(pDM_Odm, 0x908, bMaskDWord);\r
1031 \r
1032         //2 [ Setting for doing PSD function (CH4)]\r
1033         ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 0); //disable whole CCK block\r
1034         ODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0xFF); // Turn off TX  ->  Pause TX Queue\r
1035         ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, 0x0); // [ Set IQK Matrix = 0 ] equivalent to [ Turn off CCA]\r
1036 \r
1037         // PHYTXON while loop\r
1038         ODM_SetBBReg(pDM_Odm, 0x908, bMaskDWord, 0x803); \r
1039         while (ODM_GetBBReg(pDM_Odm, 0xdf4, BIT6)) \r
1040         {\r
1041                 i++;\r
1042                 if (i > 1000000) \r
1043                 {\r
1044                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Wait in %s() more than %d times!\n", __FUNCTION__, i));  \r
1045                         break;\r
1046                 }\r
1047         }\r
1048         \r
1049         ODM_SetBBReg(pDM_Odm, 0xc50, 0x7f, initial_gain);  \r
1050         ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, ODM_CHANNEL, 0x7ff, 0x04);     // Set RF to CH4 & 40M\r
1051         ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, 0xf00000, 0xf);  // 3 wire Disable    88c[23:20]=0xf\r
1052         ODM_SetBBReg(pDM_Odm, rFPGA0_PSDFunction, BIT14|BIT15, 0x0);  //128 pt  //Set PSD 128 ptss\r
1053         ODM_StallExecution(3000);       \r
1054         \r
1055         \r
1056         //2 [ Doing PSD Function in (CH4)]\r
1057         \r
1058         //Antenna A\r
1059         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Switch to Main-ant   (CH4)\n"));\r
1060         ODM_SetBBReg(pDM_Odm, 0x948, 0xfff, 0x200);\r
1061         ODM_StallExecution(10);\r
1062         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("dbg\n"));\r
1063         for (i=0;i<test_num;i++)\r
1064         {       \r
1065                 for (tone_idx=0;tone_idx<Tone_lenth_1;tone_idx++)\r
1066                 {\r
1067                         PSD_report_temp = odm_GetPSDData(pDM_Odm, Tone_idx_1[tone_idx], initial_gain);\r
1068                         //if(  PSD_report_temp>PSD_report_Main[tone_idx]  )\r
1069                                 PSD_report_Main[tone_idx]+=PSD_report_temp;\r
1070                 }\r
1071         }\r
1072         //Antenna B\r
1073        ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Switch to Aux-ant   (CH4)\n"));\r
1074        ODM_SetBBReg(pDM_Odm, 0x948, 0xfff, 0x280);\r
1075        ODM_StallExecution(10);  \r
1076         for (i=0;i<test_num;i++)\r
1077         {\r
1078                 for (tone_idx=0;tone_idx<Tone_lenth_1;tone_idx++)\r
1079                 {\r
1080                         PSD_report_temp = odm_GetPSDData(pDM_Odm, Tone_idx_1[tone_idx], initial_gain);\r
1081                         //if(  PSD_report_temp>PSD_report_Aux[tone_idx]  )\r
1082                                 PSD_report_Aux[tone_idx]+=PSD_report_temp;\r
1083                 }\r
1084         }\r
1085         //2 [ Doing PSD Function in (CH8)]\r
1086 \r
1087         ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, 0xf00000, 0x0);  // 3 wire enable    88c[23:20]=0x0\r
1088         ODM_StallExecution(3000);       \r
1089         \r
1090         ODM_SetBBReg(pDM_Odm, 0xc50, 0x7f, initial_gain);  \r
1091         ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, ODM_CHANNEL, 0x7ff, 0x04);     // Set RF to CH8 & 40M\r
1092         \r
1093         ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, 0xf00000, 0xf);  // 3 wire Disable    88c[23:20]=0xf\r
1094         ODM_StallExecution(3000);\r
1095 \r
1096         //Antenna A\r
1097         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Switch to Main-ant   (CH8)\n"));\r
1098         ODM_SetBBReg(pDM_Odm, 0x948, 0xfff, 0x200);\r
1099         ODM_StallExecution(10);\r
1100 \r
1101         for (i=0;i<test_num;i++)\r
1102         {\r
1103                 for (tone_idx=0;tone_idx<Tone_lenth_2;tone_idx++)\r
1104                 {\r
1105                         PSD_report_temp = odm_GetPSDData(pDM_Odm, Tone_idx_2[tone_idx], initial_gain);\r
1106                         //if(  PSD_report_temp>PSD_report_Main[tone_idx]  )\r
1107                                 PSD_report_Main[Tone_lenth_1+tone_idx]+=PSD_report_temp;\r
1108                 }\r
1109         }\r
1110 \r
1111         //Antenna B\r
1112         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Switch to Aux-ant   (CH8)\n"));\r
1113         ODM_SetBBReg(pDM_Odm, 0x948, 0xfff, 0x280);\r
1114         ODM_StallExecution(10); \r
1115 \r
1116         for (i=0;i<test_num;i++)\r
1117         {\r
1118                 for (tone_idx=0;tone_idx<Tone_lenth_2;tone_idx++)\r
1119                 {\r
1120                         PSD_report_temp = odm_GetPSDData(pDM_Odm, Tone_idx_2[tone_idx], initial_gain);\r
1121                         //if(  PSD_report_temp>PSD_report_Aux[tone_idx]  )\r
1122                                 PSD_report_Aux[Tone_lenth_1+tone_idx]+=PSD_report_temp;\r
1123                 }\r
1124         }\r
1125 \r
1126         //2 [ Calculate Result ]\r
1127 \r
1128         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("\nMain PSD Result: (ALL) \n"));\r
1129         for (tone_idx=0;tone_idx<(Tone_lenth_1+Tone_lenth_2);tone_idx++)\r
1130         {\r
1131                 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
1132                 Main_psd_result+= PSD_report_Main[tone_idx];\r
1133                 if(PSD_report_Main[tone_idx]>MAX_PSD_report_Main)\r
1134                         MAX_PSD_report_Main=PSD_report_Main[tone_idx];\r
1135         }\r
1136         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("--------------------------- \nTotal_Main= (( %d ))\n", Main_psd_result));\r
1137         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("MAX_Main = (( %d ))\n", MAX_PSD_report_Main));\r
1138         \r
1139 \r
1140         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("\nAux PSD Result: (ALL) \n"));\r
1141         for (tone_idx=0;tone_idx<(Tone_lenth_1+Tone_lenth_2);tone_idx++)\r
1142         {\r
1143                 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
1144                 Aux_psd_result+= PSD_report_Aux[tone_idx];\r
1145                 if(PSD_report_Aux[tone_idx]>MAX_PSD_report_Aux)\r
1146                         MAX_PSD_report_Aux=PSD_report_Aux[tone_idx];\r
1147         }\r
1148         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("--------------------------- \nTotal_Aux= (( %d ))\n", Aux_psd_result));\r
1149         ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("MAX_Aux = (( %d ))\n\n", MAX_PSD_report_Aux));\r
1150                 \r
1151         //Main_psd_result=Main_psd_result-MAX_PSD_report_Main;\r
1152         //Aux_psd_result=Aux_psd_result-MAX_PSD_report_Aux;\r
1153         PSD_power_threshold=(Main_psd_result*7)>>3;\r
1154         \r
1155         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
1156         \r
1157         //3 [ Dual Antenna ]\r
1158          if(Aux_psd_result >= PSD_power_threshold   ) \r
1159         {\r
1160                 if(pDM_Odm->DM_SWAT_Table.ANTB_ON == FALSE)\r
1161                 {\r
1162                         pDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;\r
1163                         pDM_Odm->DM_SWAT_Table.ANTB_ON = TRUE;\r
1164                 }\r
1165                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("ODM_SwAntDivCheckBeforeLink(): Dual antenna\n"));\r
1166                 \r
1167                 // set bt coexDM from 1ant coexDM to 2ant coexDM\r
1168                 //BT_SetBtCoexAntNum(pAdapter, BT_COEX_ANT_TYPE_DETECTED, 2);\r
1169                                         \r
1170                 // Init antenna diversity\r
1171                 pDM_Odm->SupportAbility |= ODM_BB_ANT_DIV; \r
1172                 ODM_AntDivInit(pDM_Odm);\r
1173                 }\r
1174         //3 [ Single Antenna ]\r
1175         else\r
1176         {\r
1177                 if(pDM_Odm->DM_SWAT_Table.ANTB_ON == TRUE)\r
1178                 {\r
1179                         pDM_Odm->DM_SWAT_Table.ANTA_ON = TRUE;\r
1180                         pDM_Odm->DM_SWAT_Table.ANTB_ON = FALSE;\r
1181                 }\r
1182                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ODM_SwAntDivCheckBeforeLink(): Single antenna\n"));\r
1183         }\r
1184 \r
1185         //2 [ Recover all parameters ]\r
1186         \r
1187         ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask,Channel_ori);  \r
1188         ODM_SetBBReg(pDM_Odm, rFPGA0_AnalogParameter4, 0xf00000, 0x0);  // 3 wire enable    88c[23:20]=0x0\r
1189         ODM_SetBBReg(pDM_Odm, 0xc50, 0x7f, Regc50);     \r
1190         \r
1191         ODM_SetBBReg(pDM_Odm, rS0S1_PathSwitch, bMaskDWord, Reg948);\r
1192         ODM_SetBBReg(pDM_Odm, rAGC_table_select, bMaskDWord, Regb2c);\r
1193 \r
1194         ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 1); //enable whole CCK block\r
1195         ODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0x0); //Turn on TX         // Resume TX Queue\r
1196         ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, Regc14); // [ Set IQK Matrix = 0 ] equivalent to [ Turn on CCA]\r
1197         ODM_SetBBReg(pDM_Odm, 0x908, bMaskDWord, Reg908); \r
1198         \r
1199         return;\r
1200 \r
1201 }\r
1202 \r
1203 \r
1204 \r
1205 \r
1206 #endif\r