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