1 /******************************************************************************
\r
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
\r
5 * This program is free software; you can redistribute it and/or modify it
\r
6 * under the terms of version 2 of the GNU General Public License as
\r
7 * published by the Free Software Foundation.
\r
9 * This program is distributed in the hope that it will be useful, but WITHOUT
\r
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
\r
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
\r
14 * You should have received a copy of the GNU General Public License along with
\r
15 * this program; if not, write to the Free Software Foundation, Inc.,
\r
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
\r
19 ******************************************************************************/
\r
20 //============================================================
\r
22 //============================================================
\r
23 #include "mp_precomp.h"
\r
24 #include "phydm_precomp.h"
\r
26 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
28 #define AFH_PSD 1 //0:normal PSD scan, 1: only do 20 pts PSD
\r
29 #define MODE_40M 0 //0:20M, 1:40M
\r
31 #define PSD_CHMIN 20 // Minimum channel number for BT AFH
\r
32 #define SIR_STEP_SIZE 3
\r
33 #define Smooth_Size_1 5
\r
34 #define Smooth_TH_1 3
\r
35 #define Smooth_Size_2 10
\r
36 #define Smooth_TH_2 4
\r
37 #define Smooth_Size_3 20
\r
38 #define Smooth_TH_3 4
\r
39 #define Smooth_Step_Size 5
\r
40 #define Adaptive_SIR 1
\r
41 #define SCAN_INTERVAL 1500 //ms
\r
42 #define SYN_Length 5 // for 92D
\r
44 #define LNA_Low_Gain_1 0x64
\r
45 #define LNA_Low_Gain_2 0x5A
\r
46 #define LNA_Low_Gain_3 0x58
\r
48 #define pw_th_10dB 0x0
\r
49 #define pw_th_16dB 0x3
\r
51 #define FA_RXHP_TH1 5000
\r
52 #define FA_RXHP_TH2 1500
\r
53 #define FA_RXHP_TH3 800
\r
54 #define FA_RXHP_TH4 600
\r
55 #define FA_RXHP_TH5 500
\r
58 #define High_TP_Mode 1
\r
59 #define Low_TP_Mode 2
\r
67 #if (DEV_BUS_TYPE == RT_PCI_INTERFACE)|(DEV_BUS_TYPE == RT_USB_INTERFACE)
\r
68 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
70 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
71 //PSD Monitor Setting
\r
72 //Which path in ADC/DAC is turnned on for PSD: both I/Q
\r
73 ODM_SetBBReg(pDM_Odm, ODM_PSDREG, BIT10|BIT11, 0x3);
\r
74 //Ageraged number: 8
\r
75 ODM_SetBBReg(pDM_Odm, ODM_PSDREG, BIT12|BIT13, 0x1);
\r
76 pDM_Odm->bPSDinProcess = FALSE;
\r
77 pDM_Odm->bUserAssignLevel = FALSE;
\r
78 pDM_Odm->bPSDactive = FALSE;
\r
79 //pDM_Odm->bDMInitialGainEnable=TRUE; //change the initialization to DIGinit
\r
81 //PHY_SetBBReg(Adapter, 0x908, bMaskDWord, 0x803);
\r
82 //PHY_SetBBReg(Adapter, 0xB34, bMaskByte0, 0x00); // pause PSD
\r
83 //PHY_SetBBReg(Adapter, 0xB38, bMaskByte0, 10); //rescan
\r
84 //PHY_SetBBReg(Adapter, 0xB38, bMaskByte2|bMaskByte3, 100); //interval
\r
86 //PlatformSetTimer( Adapter, &pHalData->PSDTriggerTimer, 0); //ms
\r
94 u1Byte initial_gain_psd
\r
97 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
98 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
99 //PADAPTER pAdapter;
\r
103 //2 Switch to CH11 to patch CH9 and CH13 DC tone
\r
104 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, 11);
\r
106 if(pDM_Odm->SupportICType== ODM_RTL8192D)
\r
108 if((*(pDM_Odm->pMacPhyMode) == ODM_SMSP)||(*(pDM_Odm->pMacPhyMode) == ODM_DMSP))
\r
110 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, 0x3FF, 11);
\r
111 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x25, 0xfffff, 0x643BC);
\r
112 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x26, 0xfffff, 0xFC038);
\r
113 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, 0xfffff, 0x77C1A);
\r
114 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2B, 0xfffff, 0x41289);
\r
115 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2C, 0xfffff, 0x01840);
\r
119 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x25, 0xfffff, 0x643BC);
\r
120 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x26, 0xfffff, 0xFC038);
\r
121 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, 0xfffff, 0x77C1A);
\r
122 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2B, 0xfffff, 0x41289);
\r
123 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2C, 0xfffff, 0x01840);
\r
127 //Ch9 DC tone patch
\r
128 psd_report = GetPSDData(pDM_Odm, 96, initial_gain_psd);
\r
129 PSD_report[50] = psd_report;
\r
130 //Ch13 DC tone patch
\r
131 psd_report = GetPSDData(pDM_Odm, 32, initial_gain_psd);
\r
132 PSD_report[70] = psd_report;
\r
134 //2 Switch to CH3 to patch CH1 and CH5 DC tone
\r
135 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, 3);
\r
138 if(pDM_Odm->SupportICType==ODM_RTL8192D)
\r
140 if((*(pDM_Odm->pMacPhyMode) == ODM_SMSP)||(*(pDM_Odm->pMacPhyMode) == ODM_DMSP))
\r
142 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, 0x3FF, 3);
\r
143 //PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x25, 0xfffff, 0x643BC);
\r
144 //PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x26, 0xfffff, 0xFC038);
\r
145 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, 0xfffff, 0x07C1A);
\r
146 //PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x2B, 0xfffff, 0x61289);
\r
147 //PHY_SetRFReg(Adapter, ODM_RF_PATH_B, 0x2C, 0xfffff, 0x01C41);
\r
151 //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x25, 0xfffff, 0x643BC);
\r
152 //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x26, 0xfffff, 0xFC038);
\r
153 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, 0xfffff, 0x07C1A);
\r
154 //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x2B, 0xfffff, 0x61289);
\r
155 //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x2C, 0xfffff, 0x01C41);
\r
159 //Ch1 DC tone patch
\r
160 psd_report = GetPSDData(pDM_Odm, 96, initial_gain_psd);
\r
161 PSD_report[10] = psd_report;
\r
162 //Ch5 DC tone patch
\r
163 psd_report = GetPSDData(pDM_Odm, 32, initial_gain_psd);
\r
164 PSD_report[30] = psd_report;
\r
170 GoodChannelDecision(
\r
172 pu4Byte PSD_report,
\r
173 pu1Byte PSD_bitmap,
\r
175 pu1Byte PSD_bitmap_memory)
\r
177 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
178 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
\r
179 //s4Byte TH1 = SSBT-0x15; // modify TH by Neil Chen
\r
180 s4Byte TH1= RSSI_BT+0x14;
\r
181 s4Byte TH2 = RSSI_BT+85;
\r
184 u1Byte bitmap, Smooth_size[3], Smooth_TH[3];
\r
186 u4Byte i,n,j, byte_idx, bit_idx, good_cnt, good_cnt_smoothing, Smooth_Interval[3];
\r
187 int start_byte_idx,start_bit_idx,cur_byte_idx, cur_bit_idx,NOW_byte_idx ;
\r
189 // RegB34 = PHY_QueryBBReg(Adapter,0xB34, bMaskDWord)&0xFF;
\r
191 if((pDM_Odm->SupportICType == ODM_RTL8192C)||(pDM_Odm->SupportICType == ODM_RTL8192D))
\r
193 TH1 = RSSI_BT + 0x14;
\r
196 Smooth_size[0]=Smooth_Size_1;
\r
197 Smooth_size[1]=Smooth_Size_2;
\r
198 Smooth_size[2]=Smooth_Size_3;
\r
199 Smooth_TH[0]=Smooth_TH_1;
\r
200 Smooth_TH[1]=Smooth_TH_2;
\r
201 Smooth_TH[2]=Smooth_TH_3;
\r
202 Smooth_Interval[0]=16;
\r
203 Smooth_Interval[1]=15;
\r
204 Smooth_Interval[2]=13;
\r
206 if(pDM_Odm->SupportICType==ODM_RTL8723A)
\r
212 else if(RSSI_BT >=38) // >= -15dBm
\r
214 else if((RSSI_BT >=33)&(RSSI_BT <38))
\r
215 TH1 = 99+(RSSI_BT-33); //0x63
\r
216 else if((RSSI_BT >=26)&(RSSI_BT<33))
\r
217 TH1 = 99-(33-RSSI_BT)+2; //0x5e
\r
218 else if((RSSI_BT >=24)&(RSSI_BT<26))
\r
219 TH1 = 88-((RSSI_BT-24)*3); //0x58
\r
220 else if((RSSI_BT >=18)&(RSSI_BT<24))
\r
221 TH1 = 77+((RSSI_BT-18)*2);
\r
222 else if((RSSI_BT >=14)&(RSSI_BT<18))
\r
223 TH1 = 63+((RSSI_BT-14)*2);
\r
224 else if((RSSI_BT >=8)&(RSSI_BT<14))
\r
225 TH1 = 58+((RSSI_BT-8)*2);
\r
226 else if((RSSI_BT >=3)&(RSSI_BT<8))
\r
227 TH1 = 52+(RSSI_BT-3);
\r
232 for (i = 0; i< 10; i++)
\r
237 for (i=0; i<80; i++)
\r
238 pRX_HP_Table->PSD_bitmap_RXHP[i] = 0;
\r
243 if(pDM_Odm->SupportICType==ODM_RTL8723A)
\r
245 TH1 =TH1-SIR_STEP_SIZE;
\r
247 while (good_cnt < PSD_CHMIN)
\r
250 if(pDM_Odm->SupportICType==ODM_RTL8723A)
\r
254 if((TH1+SIR_STEP_SIZE) < TH2)
\r
255 TH1 += SIR_STEP_SIZE;
\r
261 if(TH1==(RSSI_BT+0x1E))
\r
263 if((TH1+2) < (RSSI_BT+0x1E))
\r
266 TH1 = RSSI_BT+0x1E;
\r
269 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD,DBG_LOUD,("PSD: decision threshold is: %d", TH1));
\r
271 for (i = 0; i< 80; i++)
\r
273 if((s4Byte)(PSD_report[i]) < TH1)
\r
276 bit_idx = i -8*byte_idx;
\r
277 bitmap = PSD_bitmap[byte_idx];
\r
278 PSD_bitmap[byte_idx] = bitmap | (u1Byte) (1 << bit_idx);
\r
283 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: before smoothing\n"));
\r
286 //DbgPrint("PSD_bitmap[%u]=%x\n", n, PSD_bitmap[n]);
\r
287 for (i = 0; i<8; i++)
\r
288 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD_bitmap[%u] = %d\n", 2402+n*8+i, (PSD_bitmap[n]&BIT(i))>>i));
\r
292 //1 Start of smoothing function
\r
298 for(n=0; n<Smooth_Interval[j]; n++)
\r
300 good_cnt_smoothing = 0;
\r
301 cur_bit_idx = start_bit_idx;
\r
302 cur_byte_idx = start_byte_idx;
\r
303 for ( i=0; i < Smooth_size[j]; i++)
\r
305 NOW_byte_idx = cur_byte_idx + (i+cur_bit_idx)/8;
\r
306 if ( (PSD_bitmap[NOW_byte_idx]& BIT( (cur_bit_idx + i)%8)) != 0)
\r
307 good_cnt_smoothing++;
\r
311 if( good_cnt_smoothing < Smooth_TH[j] )
\r
313 cur_bit_idx = start_bit_idx;
\r
314 cur_byte_idx = start_byte_idx;
\r
315 for ( i=0; i< Smooth_size[j] ; i++)
\r
317 NOW_byte_idx = cur_byte_idx + (i+cur_bit_idx)/8;
\r
318 PSD_bitmap[NOW_byte_idx] = PSD_bitmap[NOW_byte_idx] & (~BIT( (cur_bit_idx + i)%8));
\r
321 start_bit_idx = start_bit_idx + Smooth_Step_Size;
\r
322 while ( (start_bit_idx) > 7 )
\r
324 start_byte_idx= start_byte_idx+start_bit_idx/8;
\r
325 start_bit_idx = start_bit_idx%8;
\r
329 ODM_RT_TRACE( pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: after %u smoothing", j+1));
\r
332 for (i = 0; i<8; i++)
\r
334 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD_bitmap[%u] = %d\n", 2402+n*8+i, (PSD_bitmap[n]&BIT(i))>>i));
\r
336 if ( ((PSD_bitmap[n]&BIT(i))>>i) ==1) //----- Add By Gary
\r
338 pRX_HP_Table->PSD_bitmap_RXHP[8*n+i] = 1;
\r
339 } // ------end by Gary
\r
347 for ( i = 0; i < 10; i++)
\r
349 for (n = 0; n < 8; n++)
\r
350 if((PSD_bitmap[i]& BIT(n)) != 0)
\r
353 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, ODM_COMP_PSD,("PSD: good channel cnt = %u",good_cnt));
\r
356 //RT_TRACE(ODM_COMP_PSD, DBG_LOUD,("PSD: SSBT=%d, TH2=%d, TH1=%d",SSBT,TH2,TH1));
\r
357 for (i = 0; i <10; i++)
\r
358 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: PSD_bitmap[%u]=%x",i,PSD_bitmap[i]));
\r
360 //Update bitmap memory
\r
361 for(i = 0; i < 80; i++)
\r
364 bit_idx = i -8*byte_idx;
\r
365 psd_bit = (PSD_bitmap[byte_idx] & BIT(bit_idx)) >> bit_idx;
\r
366 bitmap = PSD_bitmap_memory[i];
\r
367 PSD_bitmap_memory[i] = (bitmap << 1) |psd_bit;
\r
379 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
380 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
381 //PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
383 unsigned int pts, start_point, stop_point;
\r
384 u1Byte initial_gain ;
\r
385 static u1Byte PSD_bitmap_memory[80], init_memory = 0;
\r
386 static u1Byte psd_cnt=0;
\r
387 static u4Byte PSD_report[80], PSD_report_tmp;
\r
388 static u8Byte lastTxOkCnt=0, lastRxOkCnt=0;
\r
389 u1Byte H2C_PSD_DATA[5]={0,0,0,0,0};
\r
390 static u1Byte H2C_PSD_DATA_last[5] ={0,0,0,0,0};
\r
391 u1Byte idx[20]={96,99,102,106,109,112,115,118,122,125,
\r
392 0,3,6,10,13,16,19,22,26,29};
\r
393 u1Byte n, i, channel, BBReset,tone_idx;
\r
394 u1Byte PSD_bitmap[10], SSBT=0,initial_gain_psd=0, RSSI_BT=0, initialGainUpper;
\r
395 s4Byte PSD_skip_start, PSD_skip_stop;
\r
396 u4Byte CurrentChannel, RXIQI, RxIdleLowPwr, wlan_channel;
\r
397 u4Byte ReScan, Interval, Is40MHz;
\r
398 u8Byte curTxOkCnt, curRxOkCnt;
\r
399 int cur_byte_idx, cur_bit_idx;
\r
400 PADAPTER Adapter = pDM_Odm->Adapter;
\r
401 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
\r
404 if(*pDM_Odm->pbDriverIsGoingToPnpSetPowerSleep)
\r
406 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("pbDriverIsGoingToPnpSetPowerSleep!!!!!!!!!!!!!!!\n"));
\r
411 if( (*(pDM_Odm->pbScanInProcess)) ||
\r
412 pDM_Odm->bLinkInProcess)
\r
414 if((pDM_Odm->SupportICType==ODM_RTL8723A)&(pDM_Odm->SupportInterface==ODM_ITRF_PCIE))
\r
416 ODM_SetTimer( pDM_Odm, &pDM_Odm->PSDTimer, 1500); //ms
\r
422 if(pDM_Odm->bBtHsOperation)
\r
425 Interval = SCAN_INTERVAL;
\r
429 ReScan = PSD_RESCAN;
\r
430 Interval = SCAN_INTERVAL;
\r
434 if(init_memory == 0)
\r
436 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Init memory\n"));
\r
437 for(i = 0; i < 80; i++)
\r
438 PSD_bitmap_memory[i] = 0xFF; // channel is always good
\r
443 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Enter dm_PSD_Monitor\n"));
\r
444 for(i = 0; i < 80; i++)
\r
448 //1 Backup Current Settings
\r
449 CurrentChannel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask);
\r
451 if(pDM_Odm->SupportICType==ODM_RTL8192D)
\r
453 //2 Record Current synthesizer parameters based on current channel
\r
454 if((*pDM_Odm->MacPhyMode92D == SINGLEMAC_SINGLEPHY)||(*pDM_Odm->MacPhyMode92D == DUALMAC_SINGLEPHY))
\r
456 SYN_RF25 = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x25, bMaskDWord);
\r
457 SYN_RF26 = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x26, bMaskDWord);
\r
458 SYN_RF27 = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x27, bMaskDWord);
\r
459 SYN_RF2B = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x2B, bMaskDWord);
\r
460 SYN_RF2C = ODM_GetRFReg(Adapter, ODM_RF_PATH_B, 0x2C, bMaskDWord);
\r
462 else // DualMAC_DualPHY 2G
\r
464 SYN_RF25 = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x25, bMaskDWord);
\r
465 SYN_RF26 = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x26, bMaskDWord);
\r
466 SYN_RF27 = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x27, bMaskDWord);
\r
467 SYN_RF2B = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x2B, bMaskDWord);
\r
468 SYN_RF2C = ODM_GetRFReg(Adapter, ODM_RF_PATH_A, 0x2C, bMaskDWord);
\r
472 //RXIQI = PHY_QueryBBReg(Adapter, 0xC14, bMaskDWord);
\r
473 RXIQI = ODM_GetBBReg(pDM_Odm, 0xC14, bMaskDWord);
\r
475 //RxIdleLowPwr = (PHY_QueryBBReg(Adapter, 0x818, bMaskDWord)&BIT28)>>28;
\r
476 RxIdleLowPwr = (ODM_GetBBReg(pDM_Odm, 0x818, bMaskDWord)&BIT28)>>28;
\r
479 if(CHNL_RUN_ABOVE_40MHZ(pMgntInfo))
\r
484 ODM_RT_TRACE(pDM_Odm, ODM_COMP_PSD, DBG_LOUD,("PSD Scan Start\n"));
\r
486 //PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT24, 0);
\r
487 ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 0);
\r
490 //PlatformEFIOWrite1Byte(Adapter, REG_TXPAUSE, 0xFF);
\r
491 ODM_Write1Byte(pDM_Odm,REG_TXPAUSE, 0xFF);
\r
493 //Force RX to stop TX immediately
\r
494 //PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x32E13);
\r
496 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x32E13);
\r
498 //Rx AGC off RegC70[0]=0, RegC7C[20]=0
\r
499 //PHY_SetBBReg(Adapter, 0xC70, BIT0, 0);
\r
500 //PHY_SetBBReg(Adapter, 0xC7C, BIT20, 0);
\r
502 ODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 0);
\r
503 ODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 0);
\r
507 //PHY_SetBBReg(Adapter, 0xC14, bMaskDWord, 0x0);
\r
508 ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, 0x0);
\r
511 //BBReset = PlatformEFIORead1Byte(Adapter, 0x02);
\r
512 BBReset = ODM_Read1Byte(pDM_Odm, 0x02);
\r
514 //PlatformEFIOWrite1Byte(Adapter, 0x02, BBReset&(~BIT0));
\r
515 //PlatformEFIOWrite1Byte(Adapter, 0x02, BBReset|BIT0);
\r
516 ODM_SetBBReg(pDM_Odm, 0x87C, BIT31, 1); //clock gated to prevent from AGC table mess
\r
517 ODM_Write1Byte(pDM_Odm, 0x02, BBReset&(~BIT0));
\r
518 ODM_Write1Byte(pDM_Odm, 0x02, BBReset|BIT0);
\r
519 ODM_SetBBReg(pDM_Odm, 0x87C, BIT31, 0);
\r
521 //1 Leave RX idle low power
\r
522 //PHY_SetBBReg(Adapter, 0x818, BIT28, 0x0);
\r
524 ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x0);
\r
525 //1 Fix initial gain
\r
526 //if (IS_HARDWARE_TYPE_8723AE(Adapter))
\r
527 //RSSI_BT = pHalData->RSSI_BT;
\r
528 //else if((IS_HARDWARE_TYPE_8192C(Adapter))||(IS_HARDWARE_TYPE_8192D(Adapter))) // Add by Gary
\r
529 // RSSI_BT = RSSI_BT_new;
\r
531 if((pDM_Odm->SupportICType==ODM_RTL8723A)&(pDM_Odm->SupportInterface==ODM_ITRF_PCIE))
\r
532 RSSI_BT=pDM_Odm->RSSI_BT; //need to check C2H to pDM_Odm RSSI BT
\r
537 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
\r
539 if(pDM_Odm->SupportICType==ODM_RTL8723A)
\r
541 //Neil add--2011--10--12
\r
542 //2 Initial Gain index
\r
543 if(RSSI_BT >=35) // >= -15dBm
\r
544 initial_gain_psd = RSSI_BT*2;
\r
545 else if((RSSI_BT >=33)&(RSSI_BT<35))
\r
546 initial_gain_psd = RSSI_BT*2+6;
\r
547 else if((RSSI_BT >=24)&(RSSI_BT<33))
\r
548 initial_gain_psd = 70-(33-RSSI_BT);
\r
549 else if((RSSI_BT >=19)&(RSSI_BT<24))
\r
550 initial_gain_psd = 64-((24-RSSI_BT)*4);
\r
551 else if((RSSI_BT >=14)&(RSSI_BT<19))
\r
552 initial_gain_psd = 44-((18-RSSI_BT)*2);
\r
553 else if((RSSI_BT >=8)&(RSSI_BT<14))
\r
554 initial_gain_psd = 35-(14-RSSI_BT);
\r
556 initial_gain_psd = 0x1B;
\r
562 initial_gain_psd = pDM_Odm->RSSI_Min; // PSD report based on RSSI
\r
567 //DbgPrint("PSD: RSSI_BT= %d\n", RSSI_BT);
\r
568 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
\r
570 //initialGainUpper = 0x5E; //Modify by neil chen
\r
572 if(pDM_Odm->bUserAssignLevel)
\r
574 pDM_Odm->bUserAssignLevel = FALSE;
\r
575 initialGainUpper = 0x7f;
\r
579 initialGainUpper = 0x5E;
\r
583 if (initial_gain_psd < 0x1a)
\r
584 initial_gain_psd = 0x1a;
\r
585 if (initial_gain_psd > initialGainUpper)
\r
586 initial_gain_psd = initialGainUpper;
\r
589 //if(pDM_Odm->SupportICType==ODM_RTL8723A)
\r
590 SSBT = RSSI_BT * 2 +0x3E;
\r
593 //if(IS_HARDWARE_TYPE_8723AE(Adapter))
\r
594 // SSBT = RSSI_BT * 2 +0x3E;
\r
595 //else if((IS_HARDWARE_TYPE_8192C(Adapter))||(IS_HARDWARE_TYPE_8192D(Adapter))) // Add by Gary
\r
597 // RSSI_BT = initial_gain_psd;
\r
600 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: SSBT= %d\n", SSBT));
\r
601 ODM_RT_TRACE( pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD: initial gain= 0x%x\n", initial_gain_psd));
\r
602 //DbgPrint("PSD: SSBT= %d", SSBT);
\r
604 pDM_Odm->bDMInitialGainEnable = FALSE;
\r
605 initial_gain =(u1Byte) (ODM_GetBBReg(pDM_Odm, 0xc50, bMaskDWord) & 0x7F);
\r
607 // make sure the initial gain is under the correct range.
\r
608 //initial_gain_psd &= 0x7f;
\r
609 ODM_Write_DIG(pDM_Odm, initial_gain_psd);
\r
610 //1 Turn off 3-wire
\r
611 ODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0xF);
\r
613 //pts value = 128, 256, 512, 1024
\r
618 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x0);
\r
622 else if(pts == 256)
\r
624 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x1);
\r
628 else if(pts == 512)
\r
630 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x2);
\r
636 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x3);
\r
642 //3 Skip WLAN channels if WLAN busy
\r
644 curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast) - lastTxOkCnt;
\r
645 curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast) - lastRxOkCnt;
\r
646 lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);
\r
647 lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);
\r
651 wlan_channel = CurrentChannel & 0x0f;
\r
653 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD,DBG_LOUD,("PSD: current channel: %x, BW:%d \n", wlan_channel, Is40MHz));
\r
654 if(pDM_Odm->SupportICType==ODM_RTL8723A)
\r
656 if(pDM_Odm->bBtHsOperation)
\r
658 if(pDM_Odm->bLinked)
\r
662 PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-2; // Modify by Neil to add 10 chs to mask
\r
663 PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+4;
\r
667 PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-10; // Modify by Neil to add 10 chs to mask
\r
668 PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+18;
\r
674 PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-2; // Modify by Neil to add 10 chs to mask
\r
675 PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+4;
\r
677 if(PSD_skip_start < 0)
\r
678 PSD_skip_start = 0;
\r
679 if(PSD_skip_stop >80)
\r
680 PSD_skip_stop = 80;
\r
684 if((curRxOkCnt+curTxOkCnt) > 5)
\r
688 PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-2; // Modify by Neil to add 10 chs to mask
\r
689 PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+4;
\r
693 PSD_skip_start = ((wlan_channel-1)*5 -Is40MHz*10)-10; // Modify by Neil to add 10 chs to mask
\r
694 PSD_skip_stop = (PSD_skip_start + (1+Is40MHz)*20)+18;
\r
697 if(PSD_skip_start < 0)
\r
698 PSD_skip_start = 0;
\r
699 if(PSD_skip_stop >80)
\r
700 PSD_skip_stop = 80;
\r
707 if((curRxOkCnt+curTxOkCnt) > 1000)
\r
709 PSD_skip_start = (wlan_channel-1)*5 -Is40MHz*10;
\r
710 PSD_skip_stop = PSD_skip_start + (1+Is40MHz)*20;
\r
713 #endif //Reove RXHP Issue
\r
714 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD,DBG_LOUD,("PSD: Skip tone from %d to %d \n", PSD_skip_start, PSD_skip_stop));
\r
720 channel = (n/20)*4 + 1;
\r
722 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
\r
725 if ((n>=PSD_skip_start) && (n<PSD_skip_stop))
\r
727 PSD_report[n] = SSBT;
\r
728 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD,DBG_LOUD,("PSD:Tone %d skipped \n", n));
\r
732 PSD_report_tmp = GetPSDData(pDM_Odm, idx[tone_idx], initial_gain_psd);
\r
734 if ( PSD_report_tmp > PSD_report[n])
\r
735 PSD_report[n] = PSD_report_tmp;
\r
740 PatchDCTone(pDM_Odm, PSD_report, initial_gain_psd);
\r
745 ODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 1);
\r
746 ODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 1);
\r
748 ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 1);
\r
752 ODM_Write1Byte(pDM_Odm,REG_TXPAUSE, 0x00);
\r
754 ODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0x0);
\r
755 //1 Restore Current Settings
\r
757 pDM_Odm->bDMInitialGainEnable = TRUE;
\r
759 ODM_Write_DIG(pDM_Odm, initial_gain);
\r
761 // restore originl center frequency
\r
762 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, CurrentChannel);
\r
765 ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, RXIQI);
\r
766 //Restore RX idle low power
\r
767 if(RxIdleLowPwr == TRUE)
\r
768 ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 1);
\r
771 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD:psd_cnt = %d \n",psd_cnt));
\r
772 if (psd_cnt < ReScan)
\r
773 ODM_SetTimer(pDM_Odm, &pDM_Odm->PSDTimer, Interval);
\r
778 //DbgPrint("psd_report[%d]= %d \n", 2402+i, PSD_report[i]);
\r
779 RT_TRACE( ODM_COMP_PSD, DBG_LOUD,("psd_report[%d]= %d \n", 2402+i, PSD_report[i]));
\r
782 GoodChannelDecision(pDM_Odm, PSD_report, PSD_bitmap,RSSI_BT, PSD_bitmap_memory);
\r
784 if(pDM_Odm->SupportICType==ODM_RTL8723A)
\r
789 //2 Restore H2C PSD Data to Last Data
\r
790 H2C_PSD_DATA_last[0] = H2C_PSD_DATA[0];
\r
791 H2C_PSD_DATA_last[1] = H2C_PSD_DATA[1];
\r
792 H2C_PSD_DATA_last[2] = H2C_PSD_DATA[2];
\r
793 H2C_PSD_DATA_last[3] = H2C_PSD_DATA[3];
\r
794 H2C_PSD_DATA_last[4] = H2C_PSD_DATA[4];
\r
797 //2 Translate 80bit channel map to 40bit channel
\r
802 cur_byte_idx = i*2 + n/4;
\r
803 cur_bit_idx = (n%4)*2;
\r
804 if ( ((PSD_bitmap[cur_byte_idx]& BIT(cur_bit_idx)) != 0) && ((PSD_bitmap[cur_byte_idx]& BIT(cur_bit_idx+1)) != 0))
\r
805 H2C_PSD_DATA[i] = H2C_PSD_DATA[i] | (u1Byte) (1 << n);
\r
807 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("H2C_PSD_DATA[%d]=0x%x\n" ,i, H2C_PSD_DATA[i]));
\r
810 //3 To Compare the difference
\r
813 if(H2C_PSD_DATA[i] !=H2C_PSD_DATA_last[i])
\r
815 FillH2CCmd92C(Adapter, H2C_92C_PSD_RESULT, 5, H2C_PSD_DATA);
\r
816 ODM_RT_TRACE(pDM_Odm, ODM_COMP_PSD, DBG_LOUD,("Need to Update the AFH Map \n"));
\r
822 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Not need to Update\n"));
\r
825 if(pDM_Odm->bBtHsOperation)
\r
827 ODM_SetTimer(pDM_Odm, &pDM_Odm->PSDTimer, 10000);
\r
828 ODM_RT_TRACE( pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Leave dm_PSD_Monitor\n"));
\r
832 ODM_SetTimer(pDM_Odm, &pDM_Odm->PSDTimer, 1500);
\r
833 ODM_RT_TRACE( pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("Leave dm_PSD_Monitor\n"));
\r
839 //Neil for Get BT RSSI
\r
840 // Be Triggered by BT C2H CMD
\r
856 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
857 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
859 //if(IS_HARDWARE_TYPE_8723AE(Adapter))
\r
861 if(pDM_Odm->SupportICType == ODM_RTL8723A) //may need to add other IC type
\r
863 if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE)
\r
865 if(!pDM_Odm->bBtEnabled) //need to check upper layer connection
\r
867 pDM_Odm->bPSDactive=FALSE;
\r
868 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD, ("odm_PSDMonitor, return for BT is disabled!!!\n"));
\r
872 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD, ("odm_PSDMonitor\n"));
\r
874 pDM_Odm->bPSDinProcess = TRUE;
\r
875 pDM_Odm->bPSDactive=TRUE;
\r
876 odm_PSD_Monitor(pDM_Odm);
\r
877 pDM_Odm->bPSDinProcess = FALSE;
\r
883 odm_PSDMonitorCallback(
\r
887 PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
\r
888 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
890 PlatformScheduleWorkItem(&pHalData->PSDMonitorWorkitem);
\r
894 odm_PSDMonitorWorkItemCallback(
\r
898 PADAPTER Adapter = (PADAPTER)pContext;
\r
899 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
900 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
902 ODM_PSDMonitor(pDM_Odm);
\r
906 //cosa debug tool need to modify
\r
910 IN PADAPTER Adapter,
\r
915 #if (DEV_BUS_TYPE == RT_PCI_INTERFACE)
\r
916 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
917 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
919 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD, (" Monitor mode=%d, btRssi=%d\n", mode, btRssi));
\r
922 pDM_Odm->RSSI_BT = (u1Byte)btRssi;
\r
923 pDM_Odm->bUserAssignLevel = TRUE;
\r
924 ODM_SetTimer( pDM_Odm, &pDM_Odm->PSDTimer, 0); //ms
\r
928 ODM_CancelTimer(pDM_Odm, &pDM_Odm->PSDTimer);
\r
934 //#if(DEV_BUS_TYPE == RT_PCI_INTERFACE)|(DEV_BUS_TYPE == RT_USB_INTERFACE)
\r
939 #if (DEV_BUS_TYPE == RT_PCI_INTERFACE)|(DEV_BUS_TYPE == RT_USB_INTERFACE)
\r
940 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
941 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
\r
944 pRX_HP_Table->RXHP_enable = TRUE;
\r
945 pRX_HP_Table->RXHP_flag = 0;
\r
946 pRX_HP_Table->PSD_func_trigger = 0;
\r
947 pRX_HP_Table->Pre_IGI = 0x20;
\r
948 pRX_HP_Table->Cur_IGI = 0x20;
\r
949 pRX_HP_Table->Cur_pw_th = pw_th_10dB;
\r
950 pRX_HP_Table->Pre_pw_th = pw_th_10dB;
\r
951 for(index=0; index<80; index++)
\r
952 pRX_HP_Table->PSD_bitmap_RXHP[index] = 1;
\r
954 #if(DEV_BUS_TYPE == RT_USB_INTERFACE)
\r
955 pRX_HP_Table->TP_Mode = Idle_Mode;
\r
965 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
966 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
\r
967 PADAPTER Adapter = pDM_Odm->Adapter;
\r
968 PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
\r
969 unsigned int pts, start_point, stop_point, initial_gain ;
\r
970 static u1Byte PSD_bitmap_memory[80], init_memory = 0;
\r
971 static u1Byte psd_cnt=0;
\r
972 static u4Byte PSD_report[80], PSD_report_tmp;
\r
973 static u8Byte lastTxOkCnt=0, lastRxOkCnt=0;
\r
974 u1Byte idx[20]={96,99,102,106,109,112,115,118,122,125,
\r
975 0,3,6,10,13,16,19,22,26,29};
\r
976 u1Byte n, i, channel, BBReset,tone_idx;
\r
977 u1Byte PSD_bitmap[10]/*, SSBT=0*/,initial_gain_psd=0, RSSI_BT=0, initialGainUpper;
\r
978 s4Byte PSD_skip_start, PSD_skip_stop;
\r
979 u4Byte CurrentChannel, RXIQI, RxIdleLowPwr, wlan_channel;
\r
980 u4Byte ReScan, Interval, Is40MHz;
\r
981 u8Byte curTxOkCnt, curRxOkCnt;
\r
982 //--------------2G band synthesizer for 92D switch RF channel using-----------------
\r
983 u1Byte group_idx=0;
\r
984 u4Byte SYN_RF25=0, SYN_RF26=0, SYN_RF27=0, SYN_RF2B=0, SYN_RF2C=0;
\r
985 u4Byte SYN[5] = {0x25, 0x26, 0x27, 0x2B, 0x2C}; // synthesizer RF register for 2G channel
\r
986 u4Byte SYN_group[3][5] = {{0x643BC, 0xFC038, 0x77C1A, 0x41289, 0x01840}, // For CH1,2,4,9,10.11.12 {0x643BC, 0xFC038, 0x77C1A, 0x41289, 0x01840}
\r
987 {0x643BC, 0xFC038, 0x07C1A, 0x41289, 0x01840}, // For CH3,13,14
\r
988 {0x243BC, 0xFC438, 0x07C1A, 0x4128B, 0x0FC41}}; // For Ch5,6,7,8
\r
989 //--------------------- Add by Gary for Debug setting ----------------------
\r
990 u1Byte RSSI_BT_new = (u1Byte) ODM_GetBBReg(pDM_Odm, 0xB9C, 0xFF);
\r
991 u1Byte rssi_ctrl = (u1Byte) ODM_GetBBReg(pDM_Odm, 0xB38, 0xFF);
\r
992 //---------------------------------------------------------------------
\r
994 if(pMgntInfo->bScanInProgress)
\r
999 ReScan = PSD_RESCAN;
\r
1000 Interval = SCAN_INTERVAL;
\r
1003 //1 Initialization
\r
1004 if(init_memory == 0)
\r
1006 RT_TRACE( ODM_COMP_PSD, DBG_LOUD,("Init memory\n"));
\r
1007 for(i = 0; i < 80; i++)
\r
1008 PSD_bitmap_memory[i] = 0xFF; // channel is always good
\r
1013 RT_TRACE(ODM_COMP_PSD, DBG_LOUD,("Enter dm_PSD_Monitor\n"));
\r
1014 for(i = 0; i < 80; i++)
\r
1015 PSD_report[i] = 0;
\r
1018 //1 Backup Current Settings
\r
1019 CurrentChannel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask);
\r
1020 if(pDM_Odm->SupportICType == ODM_RTL8192D)
\r
1022 //2 Record Current synthesizer parameters based on current channel
\r
1023 if((*(pDM_Odm->pMacPhyMode)==ODM_SMSP)||(*(pDM_Odm->pMacPhyMode)==ODM_DMSP))
\r
1025 SYN_RF25 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x25, bMaskDWord);
\r
1026 SYN_RF26 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x26, bMaskDWord);
\r
1027 SYN_RF27 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, bMaskDWord);
\r
1028 SYN_RF2B = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2B, bMaskDWord);
\r
1029 SYN_RF2C = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2C, bMaskDWord);
\r
1031 else // DualMAC_DualPHY 2G
\r
1033 SYN_RF25 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x25, bMaskDWord);
\r
1034 SYN_RF26 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x26, bMaskDWord);
\r
1035 SYN_RF27 = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, bMaskDWord);
\r
1036 SYN_RF2B = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2B, bMaskDWord);
\r
1037 SYN_RF2C = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2C, bMaskDWord);
\r
1040 RXIQI = ODM_GetBBReg(pDM_Odm, 0xC14, bMaskDWord);
\r
1041 RxIdleLowPwr = (ODM_GetBBReg(pDM_Odm, 0x818, bMaskDWord)&BIT28)>>28;
\r
1042 Is40MHz = *(pDM_Odm->pBandWidth);
\r
1043 ODM_RT_TRACE(pDM_Odm, ODM_COMP_PSD, DBG_LOUD,("PSD Scan Start\n"));
\r
1045 ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 0);
\r
1048 ODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0xFF);
\r
1049 //Force RX to stop TX immediately
\r
1050 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_AC, bRFRegOffsetMask, 0x32E13);
\r
1052 //Rx AGC off RegC70[0]=0, RegC7C[20]=0
\r
1053 ODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 0);
\r
1054 ODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 0);
\r
1056 ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, 0x0);
\r
1058 ODM_SetBBReg(pDM_Odm, 0x87C, BIT31, 1); //clock gated to prevent from AGC table mess
\r
1059 BBReset = ODM_Read1Byte(pDM_Odm, 0x02);
\r
1060 ODM_Write1Byte(pDM_Odm, 0x02, BBReset&(~BIT0));
\r
1061 ODM_Write1Byte(pDM_Odm, 0x02, BBReset|BIT0);
\r
1062 ODM_SetBBReg(pDM_Odm, 0x87C, BIT31, 0);
\r
1063 //1 Leave RX idle low power
\r
1064 ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x0);
\r
1065 //1 Fix initial gain
\r
1066 RSSI_BT = RSSI_BT_new;
\r
1067 RT_TRACE(ODM_COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
\r
1069 if(rssi_ctrl == 1) // just for debug!!
\r
1070 initial_gain_psd = RSSI_BT_new;
\r
1072 initial_gain_psd = pDM_Odm->RSSI_Min; // PSD report based on RSSI
\r
1074 RT_TRACE(ODM_COMP_PSD, DBG_LOUD,("PSD: RSSI_BT= %d\n", RSSI_BT));
\r
1076 initialGainUpper = 0x54;
\r
1078 RSSI_BT = initial_gain_psd;
\r
1081 //RT_TRACE( ODM_COMP_PSD, DBG_LOUD,("PSD: SSBT= %d\n", SSBT));
\r
1082 RT_TRACE( ODM_COMP_PSD, DBG_LOUD,("PSD: initial gain= 0x%x\n", initial_gain_psd));
\r
1084 pDM_Odm->bDMInitialGainEnable = FALSE;
\r
1085 initial_gain = ODM_GetBBReg(pDM_Odm, 0xc50, bMaskDWord) & 0x7F;
\r
1086 //ODM_SetBBReg(pDM_Odm, 0xc50, 0x7F, initial_gain_psd);
\r
1087 ODM_Write_DIG(pDM_Odm, initial_gain_psd);
\r
1088 //1 Turn off 3-wire
\r
1089 ODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0xF);
\r
1091 //pts value = 128, 256, 512, 1024
\r
1096 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x0);
\r
1100 else if(pts == 256)
\r
1102 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x1);
\r
1103 start_point = 128;
\r
1106 else if(pts == 512)
\r
1108 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x2);
\r
1109 start_point = 256;
\r
1114 ODM_SetBBReg(pDM_Odm, 0x808, BIT14|BIT15, 0x3);
\r
1115 start_point = 512;
\r
1116 stop_point = 1536;
\r
1120 //3 Skip WLAN channels if WLAN busy
\r
1121 curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast) - lastTxOkCnt;
\r
1122 curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast) - lastRxOkCnt;
\r
1123 lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);
\r
1124 lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);
\r
1126 PSD_skip_start=80;
\r
1127 PSD_skip_stop = 0;
\r
1128 wlan_channel = CurrentChannel & 0x0f;
\r
1130 RT_TRACE(ODM_COMP_PSD,DBG_LOUD,("PSD: current channel: %x, BW:%d \n", wlan_channel, Is40MHz));
\r
1132 if((curRxOkCnt+curTxOkCnt) > 1000)
\r
1134 PSD_skip_start = (wlan_channel-1)*5 -Is40MHz*10;
\r
1135 PSD_skip_stop = PSD_skip_start + (1+Is40MHz)*20;
\r
1138 RT_TRACE(ODM_COMP_PSD,DBG_LOUD,("PSD: Skip tone from %d to %d \n", PSD_skip_start, PSD_skip_stop));
\r
1140 for (n=0;n<80;n++)
\r
1144 channel = (n/20)*4 + 1;
\r
1145 if(pDM_Odm->SupportICType == ODM_RTL8192D)
\r
1160 if((*(pDM_Odm->pMacPhyMode)==ODM_SMSP)||(*(pDM_Odm->pMacPhyMode)==ODM_DMSP))
\r
1162 for(i = 0; i < SYN_Length; i++)
\r
1163 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, SYN[i], bMaskDWord, SYN_group[group_idx][i]);
\r
1165 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
\r
1166 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, 0x3FF, channel);
\r
1168 else // DualMAC_DualPHY 2G
\r
1170 for(i = 0; i < SYN_Length; i++)
\r
1171 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, SYN[i], bMaskDWord, SYN_group[group_idx][i]);
\r
1173 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
\r
1177 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, channel);
\r
1180 if ((n>=PSD_skip_start) && (n<PSD_skip_stop))
\r
1182 PSD_report[n] = initial_gain_psd;//SSBT;
\r
1183 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD,DBG_LOUD,("PSD:Tone %d skipped \n", n));
\r
1187 PSD_report_tmp = GetPSDData(pDM_Odm, idx[tone_idx], initial_gain_psd);
\r
1189 if ( PSD_report_tmp > PSD_report[n])
\r
1190 PSD_report[n] = PSD_report_tmp;
\r
1195 PatchDCTone(pDM_Odm, PSD_report, initial_gain_psd);
\r
1200 ODM_SetBBReg(pDM_Odm, 0xC70, BIT0, 1);
\r
1201 ODM_SetBBReg(pDM_Odm, 0xC7C, BIT20, 1);
\r
1203 ODM_SetBBReg(pDM_Odm, rFPGA0_RFMOD, BIT24, 1);
\r
1206 ODM_Write1Byte(pDM_Odm, REG_TXPAUSE, 0x00);
\r
1208 ODM_SetBBReg(pDM_Odm, 0x88c, BIT20|BIT21|BIT22|BIT23, 0x0);
\r
1209 //1 Restore Current Settings
\r
1211 pDM_Odm->bDMInitialGainEnable= TRUE;
\r
1212 //ODM_SetBBReg(pDM_Odm, 0xc50, 0x7F, initial_gain);
\r
1213 ODM_Write_DIG(pDM_Odm,(u1Byte) initial_gain);
\r
1214 // restore originl center frequency
\r
1215 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, CurrentChannel);
\r
1216 if(pDM_Odm->SupportICType == ODM_RTL8192D)
\r
1218 if((*(pDM_Odm->pMacPhyMode)==ODM_SMSP)||(*(pDM_Odm->pMacPhyMode)==ODM_DMSP))
\r
1220 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_CHNLBW, bMaskDWord, CurrentChannel);
\r
1221 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x25, bMaskDWord, SYN_RF25);
\r
1222 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x26, bMaskDWord, SYN_RF26);
\r
1223 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x27, bMaskDWord, SYN_RF27);
\r
1224 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2B, bMaskDWord, SYN_RF2B);
\r
1225 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x2C, bMaskDWord, SYN_RF2C);
\r
1227 else // DualMAC_DualPHY
\r
1229 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x25, bMaskDWord, SYN_RF25);
\r
1230 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x26, bMaskDWord, SYN_RF26);
\r
1231 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x27, bMaskDWord, SYN_RF27);
\r
1232 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2B, bMaskDWord, SYN_RF2B);
\r
1233 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x2C, bMaskDWord, SYN_RF2C);
\r
1237 ODM_SetBBReg(pDM_Odm, 0xC14, bMaskDWord, RXIQI);
\r
1238 //Restore RX idle low power
\r
1239 if(RxIdleLowPwr == TRUE)
\r
1240 ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 1);
\r
1243 //gPrint("psd cnt=%d\n", psd_cnt);
\r
1244 ODM_RT_TRACE(pDM_Odm,ODM_COMP_PSD, DBG_LOUD,("PSD:psd_cnt = %d \n",psd_cnt));
\r
1245 if (psd_cnt < ReScan)
\r
1247 ODM_SetTimer(pDM_Odm, &pRX_HP_Table->PSDTimer, Interval); //ms
\r
1253 RT_TRACE( ODM_COMP_PSD, DBG_LOUD,("psd_report[%d]= %d \n", 2402+i, PSD_report[i]));
\r
1254 //DbgPrint("psd_report[%d]= %d \n", 2402+i, PSD_report[i]);
\r
1256 GoodChannelDecision(pDM_Odm, PSD_report, PSD_bitmap,RSSI_BT, PSD_bitmap_memory);
\r
1261 void odm_Write_RXHP(
\r
1262 IN PVOID pDM_VOID)
\r
1264 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
1265 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
\r
1266 u4Byte currentIGI;
\r
1268 if(pRX_HP_Table->Cur_IGI != pRX_HP_Table->Pre_IGI)
\r
1270 ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);
\r
1271 ODM_SetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);
\r
1274 if(pRX_HP_Table->Cur_pw_th != pRX_HP_Table->Pre_pw_th)
\r
1276 ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore2, BIT8|BIT9, pRX_HP_Table->Cur_pw_th); // RegC54[9:8]=2'b11: AGC Flow 3
\r
1279 if(pRX_HP_Table->RXHP_flag == 0)
\r
1281 pRX_HP_Table->Cur_IGI = 0x20;
\r
1285 currentIGI = ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0);
\r
1286 if(currentIGI<0x50)
\r
1288 ODM_SetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);
\r
1289 ODM_SetBBReg(pDM_Odm, rOFDM0_XBAGCCore1, bMaskByte0, pRX_HP_Table->Cur_IGI);
\r
1292 pRX_HP_Table->Pre_IGI = pRX_HP_Table->Cur_IGI;
\r
1293 pRX_HP_Table->Pre_pw_th = pRX_HP_Table->Cur_pw_th;
\r
1299 IN PVOID pDM_VOID)
\r
1301 #if( DM_ODM_SUPPORT_TYPE & (ODM_WIN))
\r
1302 #if (DEV_BUS_TYPE == RT_PCI_INTERFACE) | (DEV_BUS_TYPE == RT_USB_INTERFACE)
\r
1303 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
1304 PADAPTER Adapter = pDM_Odm->Adapter;
\r
1305 PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
\r
1306 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
\r
1307 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
\r
1308 PFALSE_ALARM_STATISTICS FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_FALSEALMCNT);
\r
1312 s1Byte Intf_diff_idx, MIN_Intf_diff_idx = 16;
\r
1313 s4Byte cur_channel;
\r
1314 u1Byte ch_map_intf_5M[17] = {0};
\r
1315 static u4Byte FA_TH = 0;
\r
1316 static u1Byte psd_intf_flag = 0;
\r
1317 static s4Byte curRssi = 0;
\r
1318 static s4Byte preRssi = 0;
\r
1319 static u1Byte PSDTriggerCnt = 1;
\r
1321 u1Byte RX_HP_enable = (u1Byte)(ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore2, bMaskDWord)>>31); // for debug!!
\r
1323 #if(DEV_BUS_TYPE == RT_USB_INTERFACE)
\r
1324 static s8Byte lastTxOkCnt = 0, lastRxOkCnt = 0;
\r
1325 s8Byte curTxOkCnt, curRxOkCnt;
\r
1326 s8Byte curTPOkCnt;
\r
1327 s8Byte TP_Acc3, TP_Acc5;
\r
1328 static s8Byte TP_Buff[5] = {0};
\r
1329 static u1Byte pre_state = 0, pre_state_flag = 0;
\r
1330 static u1Byte Intf_HighTP_flag = 0, De_counter = 16;
\r
1331 static u1Byte TP_Degrade_flag = 0;
\r
1333 static u1Byte LatchCnt = 0;
\r
1335 if(pDM_Odm->SupportICType & (ODM_RTL8723A|ODM_RTL8188E))
\r
1337 //AGC RX High Power Mode is only applied on 2G band in 92D!!!
\r
1338 if(pDM_Odm->SupportICType == ODM_RTL8192D)
\r
1340 if(*(pDM_Odm->pBandType) != ODM_BAND_2_4G)
\r
1344 if(!(pDM_Odm->SupportAbility & ODM_BB_RXHP))
\r
1349 if(RX_HP_enable == 1)
\r
1350 pRX_HP_Table->RXHP_enable = FALSE;
\r
1352 pRX_HP_Table->RXHP_enable = TRUE;
\r
1354 if(pRX_HP_Table->RXHP_enable == FALSE)
\r
1356 if(pRX_HP_Table->RXHP_flag == 1)
\r
1358 pRX_HP_Table->RXHP_flag = 0;
\r
1359 psd_intf_flag = 0;
\r
1364 #if(DEV_BUS_TYPE == RT_USB_INTERFACE)
\r
1365 //2 Record current TP for USB interface
\r
1366 curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast)-lastTxOkCnt;
\r
1367 curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast)-lastRxOkCnt;
\r
1368 lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast);
\r
1369 lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast);
\r
1371 curTPOkCnt = curTxOkCnt+curRxOkCnt;
\r
1372 TP_Buff[0] = curTPOkCnt; // current TP
\r
1373 TP_Acc3 = PlatformDivision64((TP_Buff[1]+TP_Buff[2]+TP_Buff[3]), 3);
\r
1374 TP_Acc5 = PlatformDivision64((TP_Buff[0]+TP_Buff[1]+TP_Buff[2]+TP_Buff[3]+TP_Buff[4]), 5);
\r
1376 if(TP_Acc5 < 1000)
\r
1377 pRX_HP_Table->TP_Mode = Idle_Mode;
\r
1378 else if((1000 < TP_Acc5)&&(TP_Acc5 < 3750000))
\r
1379 pRX_HP_Table->TP_Mode = Low_TP_Mode;
\r
1381 pRX_HP_Table->TP_Mode = High_TP_Mode;
\r
1383 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP TP Mode = %d\n", pRX_HP_Table->TP_Mode));
\r
1384 // Since TP result would be sampled every 2 sec, it needs to delay 4sec to wait PSD processing.
\r
1385 // When LatchCnt = 0, we would Get PSD result.
\r
1386 if(TP_Degrade_flag == 1)
\r
1391 TP_Degrade_flag = 0;
\r
1394 // When PSD function triggered by TP degrade 20%, and Interference Flag = 1
\r
1395 // Set a De_counter to wait IGI = upper bound. If time is UP, the Interference flag will be pull down.
\r
1396 if(Intf_HighTP_flag == 1)
\r
1399 if(De_counter == 0)
\r
1401 Intf_HighTP_flag = 0;
\r
1402 psd_intf_flag = 0;
\r
1407 //2 AGC RX High Power Mode by PSD only applied to STA Mode
\r
1408 //3 NOT applied 1. Ad Hoc Mode.
\r
1409 //3 NOT applied 2. AP Mode
\r
1410 if ((pMgntInfo->mAssoc) && (!pMgntInfo->mIbss) && (!ACTING_AS_AP(Adapter)))
\r
1412 Is40MHz = *(pDM_Odm->pBandWidth);
\r
1413 curRssi = pDM_Odm->RSSI_Min;
\r
1414 cur_channel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x0fff) & 0x0f;
\r
1416 /* check illegal channel and bandwidth */
\r
1417 if (Is40MHz && ((cur_channel < 3) || (cur_channel > 12))) {
\r
1418 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("illegal channel setting, 40MHz channel = %d\n", cur_channel));
\r
1422 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP RX HP flag = %d\n", pRX_HP_Table->RXHP_flag));
\r
1423 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP FA = %d\n", FalseAlmCnt->Cnt_all));
\r
1424 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP cur RSSI = %d, pre RSSI=%d\n", curRssi, preRssi));
\r
1425 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP current CH = %d\n", cur_channel));
\r
1426 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RXHP Is 40MHz = %d\n", Is40MHz));
\r
1427 //2 PSD function would be triggered
\r
1428 //3 1. Every 4 sec for PCIE
\r
1429 //3 2. Before TP Mode (Idle TP<4kbps) for USB
\r
1430 //3 3. After TP Mode (High TP) for USB
\r
1431 if((curRssi > 68) && (pRX_HP_Table->RXHP_flag == 0)) // Only RSSI>TH and RX_HP_flag=0 will Do PSD process
\r
1433 #if (DEV_BUS_TYPE == RT_USB_INTERFACE)
\r
1434 //2 Before TP Mode ==> PSD would be trigger every 4 sec
\r
1435 if(pRX_HP_Table->TP_Mode == Idle_Mode) //2.1 less wlan traffic <4kbps
\r
1438 if(PSDTriggerCnt == 1)
\r
1440 odm_PSD_RXHP(pDM_Odm);
\r
1441 pRX_HP_Table->PSD_func_trigger = 1;
\r
1442 PSDTriggerCnt = 0;
\r
1448 #if(DEV_BUS_TYPE == RT_USB_INTERFACE)
\r
1450 //2 After TP Mode ==> Check if TP degrade larger than 20% would trigger PSD function
\r
1451 if(pRX_HP_Table->TP_Mode == High_TP_Mode)
\r
1453 if((pre_state_flag == 0)&&(LatchCnt == 0))
\r
1456 if((((curTPOkCnt-TP_Acc3)*20)<(TP_Acc3))&&(((curTPOkCnt-TP_Acc3)*20)>(-TP_Acc3)))
\r
1459 if(pre_state == 3) // hit pre_state condition => consecutive 3 times
\r
1461 pre_state_flag = 1;
\r
1471 //3 If pre_state_flag=1 ==> start to monitor TP degrade 20%
\r
1472 if(pre_state_flag == 1)
\r
1474 if(((TP_Acc3-curTPOkCnt)*5)>(TP_Acc3)) // degrade 20%
\r
1476 odm_PSD_RXHP(pDM_Odm);
\r
1477 pRX_HP_Table->PSD_func_trigger = 1;
\r
1478 TP_Degrade_flag = 1;
\r
1480 pre_state_flag = 0;
\r
1482 else if(((TP_Buff[2]-curTPOkCnt)*5)>TP_Buff[2])
\r
1484 odm_PSD_RXHP(pDM_Odm);
\r
1485 pRX_HP_Table->PSD_func_trigger = 1;
\r
1486 TP_Degrade_flag = 1;
\r
1488 pre_state_flag = 0;
\r
1490 else if(((TP_Buff[3]-curTPOkCnt)*5)>TP_Buff[3])
\r
1492 odm_PSD_RXHP(pDM_Odm);
\r
1493 pRX_HP_Table->PSD_func_trigger = 1;
\r
1494 TP_Degrade_flag = 1;
\r
1496 pre_state_flag = 0;
\r
1503 #if (DEV_BUS_TYPE == RT_USB_INTERFACE)
\r
1506 TP_Buff[4-i] = TP_Buff[3-i];
\r
1509 //2 Update PSD bitmap according to PSD report
\r
1510 if((pRX_HP_Table->PSD_func_trigger == 1)&&(LatchCnt == 0))
\r
1512 //2 Separate 80M bandwidth into 16 group with smaller 5M BW.
\r
1513 for (i = 0 ; i < 16 ; i++)
\r
1516 for(j = 0; j < 5 ; j++)
\r
1517 sum += pRX_HP_Table->PSD_bitmap_RXHP[5*i + j];
\r
1521 ch_map_intf_5M[i] = 1; // interference flag
\r
1524 //=============just for debug=========================
\r
1525 //for(i=0;i<16;i++)
\r
1526 //DbgPrint("RX HP: ch_map_intf_5M[%d] = %d\n", i, ch_map_intf_5M[i]);
\r
1527 //===============================================
\r
1528 //2 Mask target channel 5M index
\r
1529 for(i = 0; i < (4+4*Is40MHz) ; i++)
\r
1531 ch_map_intf_5M[cur_channel - (1+2*Is40MHz) + i] = 0;
\r
1534 psd_intf_flag = 0;
\r
1535 for(i = 0; i < 16; i++)
\r
1537 if(ch_map_intf_5M[i] == 1)
\r
1539 psd_intf_flag = 1; // interference is detected!!!
\r
1544 #if (DEV_BUS_TYPE == RT_USB_INTERFACE)
\r
1545 if(pRX_HP_Table->TP_Mode!=Idle_Mode)
\r
1547 if(psd_intf_flag == 1) // to avoid psd_intf_flag always 1
\r
1549 Intf_HighTP_flag = 1;
\r
1550 De_counter = 32; // 0x1E -> 0x3E needs 32 times by each IGI step =1
\r
1554 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP psd_intf_flag = %d\n", psd_intf_flag));
\r
1555 //2 Distance between target channel and interference
\r
1556 for(i = 0; i < 16; i++)
\r
1558 if(ch_map_intf_5M[i] == 1)
\r
1560 Intf_diff_idx = ((cur_channel+Is40MHz-(i+1))>0) ? (s1Byte)(cur_channel-2*Is40MHz-(i-2)) : (s1Byte)((i+1)-(cur_channel+2*Is40MHz));
\r
1561 if(Intf_diff_idx < MIN_Intf_diff_idx)
\r
1562 MIN_Intf_diff_idx = Intf_diff_idx; // the min difference index between interference and target
\r
1565 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP MIN_Intf_diff_idx = %d\n", MIN_Intf_diff_idx));
\r
1566 //2 Choose False Alarm Threshold
\r
1567 switch (MIN_Intf_diff_idx){
\r
1572 FA_TH = FA_RXHP_TH1;
\r
1576 FA_TH = FA_RXHP_TH2;
\r
1580 FA_TH = FA_RXHP_TH3;
\r
1584 FA_TH = FA_RXHP_TH4;
\r
1592 FA_TH = FA_RXHP_TH5;
\r
1595 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RXHP, ODM_DBG_LOUD, ("RX HP FA_TH = %d\n", FA_TH));
\r
1596 pRX_HP_Table->PSD_func_trigger = 0;
\r
1598 //1 Monitor RSSI variation to choose the suitable IGI or Exit AGC RX High Power Mode
\r
1599 if(pRX_HP_Table->RXHP_flag == 1)
\r
1601 if ((curRssi > 80)&&(preRssi < 80))
\r
1603 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_1;
\r
1605 else if ((curRssi < 80)&&(preRssi > 80))
\r
1607 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_2;
\r
1609 else if ((curRssi > 72)&&(preRssi < 72))
\r
1611 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_2;
\r
1613 else if ((curRssi < 72)&&( preRssi > 72))
\r
1615 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_3;
\r
1617 else if (curRssi < 68) //RSSI is NOT large enough!!==> Exit AGC RX High Power Mode
\r
1619 pRX_HP_Table->Cur_pw_th = pw_th_10dB;
\r
1620 pRX_HP_Table->RXHP_flag = 0; // Back to Normal DIG Mode
\r
1621 psd_intf_flag = 0;
\r
1624 else // pRX_HP_Table->RXHP_flag == 0
\r
1626 //1 Decide whether to enter AGC RX High Power Mode
\r
1627 if ((curRssi > 70) && (psd_intf_flag == 1) && (FalseAlmCnt->Cnt_all > FA_TH) &&
\r
1628 (pDM_DigTable->CurIGValue == pDM_DigTable->rx_gain_range_max))
\r
1632 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_1;
\r
1634 else if (curRssi > 72)
\r
1636 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_2;
\r
1640 pRX_HP_Table->Cur_IGI = LNA_Low_Gain_3;
\r
1642 pRX_HP_Table->Cur_pw_th = pw_th_16dB; //RegC54[9:8]=2'b11: to enter AGC Flow 3
\r
1643 pRX_HP_Table->First_time_enter = TRUE;
\r
1644 pRX_HP_Table->RXHP_flag = 1; // RXHP_flag=1: AGC RX High Power Mode, RXHP_flag=0: Normal DIG Mode
\r
1647 preRssi = curRssi;
\r
1648 odm_Write_RXHP(pDM_Odm);
\r
1650 #endif //#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN))
\r
1651 #endif //#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) | (DEV_BUS_TYPE == RT_USB_INTERFACE)
\r
1656 odm_PSD_RXHPCallback(
\r
1660 PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
\r
1661 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
1662 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
1663 pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table;
\r
1665 #if DEV_BUS_TYPE==RT_PCI_INTERFACE
\r
1667 ODM_ScheduleWorkItem(&pRX_HP_Table->PSDTimeWorkitem);
\r
1669 odm_PSD_RXHP(pDM_Odm);
\r
1672 ODM_ScheduleWorkItem(&pRX_HP_Table->PSDTimeWorkitem);
\r
1678 odm_PSD_RXHPWorkitemCallback(
\r
1682 PADAPTER pAdapter = (PADAPTER)pContext;
\r
1683 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
\r
1684 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
1686 odm_PSD_RXHP(pDM_Odm);
\r
1689 #endif //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r