1 /******************************************************************************
\r
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
\r
5 * This program is free software; you can redistribute it and/or modify it
\r
6 * under the terms of version 2 of the GNU General Public License as
\r
7 * published by the Free Software Foundation.
\r
9 * This program is distributed in the hope that it will be useful, but WITHOUT
\r
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
\r
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
\r
14 * You should have received a copy of the GNU General Public License along with
\r
15 * this program; if not, write to the Free Software Foundation, Inc.,
\r
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
\r
19 ******************************************************************************/
\r
21 //============================================================
\r
23 //============================================================
\r
24 #include "mp_precomp.h"
\r
25 #include "phydm_precomp.h"
\r
27 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
\r
28 #if WPP_SOFTWARE_TRACE
\r
29 #include "PhyDM_Adaptivity.tmh"
\r
35 Phydm_CheckAdaptivity(
\r
39 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
40 PADAPTIVITY_STATISTICS Adaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY);
\r
42 if (pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY) {
\r
43 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
44 if (pDM_Odm->APTotalNum > Adaptivity->APNumTH) {
\r
45 pDM_Odm->Adaptivity_enable = FALSE;
\r
46 pDM_Odm->adaptivity_flag = FALSE;
\r
47 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("AP total num > %d!!, disable adaptivity\n", Adaptivity->APNumTH));
\r
51 if (Adaptivity->DynamicLinkAdaptivity || Adaptivity->AcsForAdaptivity) {
\r
52 if (pDM_Odm->bLinked && Adaptivity->bCheck == FALSE) {
\r
53 Phydm_NHMCounterStatistics(pDM_Odm);
\r
54 Phydm_CheckEnvironment(pDM_Odm);
\r
55 } else if (!pDM_Odm->bLinked)
\r
56 Adaptivity->bCheck = FALSE;
\r
58 pDM_Odm->Adaptivity_enable = TRUE;
\r
60 if (pDM_Odm->SupportICType & (ODM_IC_11AC_GAIN_IDX_EDCCA | ODM_IC_11N_GAIN_IDX_EDCCA))
\r
61 pDM_Odm->adaptivity_flag = FALSE;
\r
63 pDM_Odm->adaptivity_flag = TRUE;
\r
67 pDM_Odm->Adaptivity_enable = FALSE;
\r
68 pDM_Odm->adaptivity_flag = FALSE;
\r
75 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
77 Phydm_CheckChannelPlan(
\r
81 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
82 PADAPTER pAdapter = pDM_Odm->Adapter;
\r
83 PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo);
\r
85 if (pMgntInfo->RegEnableAdaptivity == 2) {
\r
86 if (pDM_Odm->Carrier_Sense_enable == FALSE) { /*check domain Code for Adaptivity or CarrierSense*/
\r
87 if ((*pDM_Odm->pBandType == ODM_BAND_5G) &&
\r
88 !(pDM_Odm->odm_Regulation5G == REGULATION_ETSI || pDM_Odm->odm_Regulation5G == REGULATION_WW)) {
\r
89 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("Adaptivity skip 5G domain code : %d\n", pDM_Odm->odm_Regulation5G));
\r
90 pDM_Odm->Adaptivity_enable = FALSE;
\r
91 pDM_Odm->adaptivity_flag = FALSE;
\r
93 } else if ((*pDM_Odm->pBandType == ODM_BAND_2_4G) &&
\r
94 !(pDM_Odm->odm_Regulation2_4G == REGULATION_ETSI || pDM_Odm->odm_Regulation2_4G == REGULATION_WW)) {
\r
95 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("Adaptivity skip 2.4G domain code : %d\n", pDM_Odm->odm_Regulation2_4G));
\r
96 pDM_Odm->Adaptivity_enable = FALSE;
\r
97 pDM_Odm->adaptivity_flag = FALSE;
\r
100 } else if ((*pDM_Odm->pBandType != ODM_BAND_2_4G) && (*pDM_Odm->pBandType != ODM_BAND_5G)) {
\r
101 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("Adaptivity neither 2G nor 5G band, return\n"));
\r
102 pDM_Odm->Adaptivity_enable = FALSE;
\r
103 pDM_Odm->adaptivity_flag = FALSE;
\r
107 if ((*pDM_Odm->pBandType == ODM_BAND_5G) &&
\r
108 !(pDM_Odm->odm_Regulation5G == REGULATION_MKK || pDM_Odm->odm_Regulation5G == REGULATION_WW)) {
\r
109 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("CarrierSense skip 5G domain code : %d\n", pDM_Odm->odm_Regulation5G));
\r
110 pDM_Odm->Adaptivity_enable = FALSE;
\r
111 pDM_Odm->adaptivity_flag = FALSE;
\r
115 else if ((*pDM_Odm->pBandType == ODM_BAND_2_4G) &&
\r
116 !(pDM_Odm->odm_Regulation2_4G == REGULATION_MKK || pDM_Odm->odm_Regulation2_4G == REGULATION_WW)) {
\r
117 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("CarrierSense skip 2.4G domain code : %d\n", pDM_Odm->odm_Regulation2_4G));
\r
118 pDM_Odm->Adaptivity_enable = FALSE;
\r
119 pDM_Odm->adaptivity_flag = FALSE;
\r
122 } else if ((*pDM_Odm->pBandType != ODM_BAND_2_4G) && (*pDM_Odm->pBandType != ODM_BAND_5G)) {
\r
123 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("CarrierSense neither 2G nor 5G band, return\n"));
\r
124 pDM_Odm->Adaptivity_enable = FALSE;
\r
125 pDM_Odm->adaptivity_flag = FALSE;
\r
137 Phydm_NHMCounterStatisticsInit(
\r
141 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
143 if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) {
\r
144 /*PHY parameters initialize for n series*/
\r
145 ODM_Write2Byte(pDM_Odm, ODM_REG_CCX_PERIOD_11N+ 2, 0xC350); /*0x894[31:16]=0x0xC350 Time duration for NHM unit: us, 0xc350=200ms*/
\r
146 ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N + 2, 0xffff); /*0x890[31:16]=0xffff th_9, th_10*/
\r
147 ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11N, 0xffffff50); /*0x898=0xffffff52 th_3, th_2, th_1, th_0*/
\r
148 ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11N, 0xffffffff); /*0x89c=0xffffffff th_7, th_6, th_5, th_4*/
\r
149 ODM_SetBBReg(pDM_Odm, ODM_REG_FPGA0_IQK_11N, bMaskByte0, 0xff); /*0xe28[7:0]=0xff th_8*/
\r
150 ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT10 | BIT9 | BIT8, 0x1); /*0x890[10:8]=1 ignoreCCA ignore PHYTXON enable CCX*/
\r
151 ODM_SetBBReg(pDM_Odm, ODM_REG_OFDM_FA_RSTC_11N, BIT7, 0x1); /*0xc0c[7]=1 max power among all RX ants*/
\r
153 #if (RTL8195A_SUPPORT == 0)
\r
154 else if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) {
\r
155 /*PHY parameters initialize for ac series*/
\r
156 ODM_Write2Byte(pDM_Odm, ODM_REG_CCX_PERIOD_11AC+ 2, 0xC350); /*0x990[31:16]=0xC350 Time duration for NHM unit: us, 0xc350=200ms*/
\r
157 ODM_Write2Byte(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC + 2, 0xffff); /*0x994[31:16]=0xffff th_9, th_10*/
\r
158 ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH3_TO_TH0_11AC, 0xffffff50); /*0x998=0xffffff52 th_3, th_2, th_1, th_0*/
\r
159 ODM_Write4Byte(pDM_Odm, ODM_REG_NHM_TH7_TO_TH4_11AC, 0xffffffff); /*0x99c=0xffffffff th_7, th_6, th_5, th_4*/
\r
160 ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH8_11AC, bMaskByte0, 0xff); /*0x9a0[7:0]=0xff th_8*/
\r
161 ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT8 | BIT9 | BIT10, 0x1); /*0x994[10:8]=1 ignoreCCA ignore PHYTXON enable CCX*/
\r
162 ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_9E8_11AC, BIT0, 0x1); /*0x9e8[7]=1 max power among all RX ants*/
\r
169 Phydm_NHMCounterStatistics(
\r
173 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
175 if (!(pDM_Odm->SupportAbility & ODM_BB_NHM_CNT))
\r
179 Phydm_GetNHMCounterStatistics(pDM_Odm);
\r
181 /*Reset NHM counter*/
\r
182 Phydm_NHMCounterStatisticsReset(pDM_Odm);
\r
186 Phydm_GetNHMCounterStatistics(
\r
190 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
191 u4Byte value32 = 0;
\r
192 #if (RTL8195A_SUPPORT == 0)
\r
193 if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
\r
194 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_NHM_CNT_11AC, bMaskDWord);
\r
195 else if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
\r
197 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_NHM_CNT_11N, bMaskDWord);
\r
199 pDM_Odm->NHM_cnt_0 = (u1Byte)(value32 & bMaskByte0);
\r
200 pDM_Odm->NHM_cnt_1 = (u1Byte)((value32 & bMaskByte1) >> 8);
\r
205 Phydm_NHMCounterStatisticsReset(
\r
209 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
211 if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) {
\r
212 ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT1, 0);
\r
213 ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11N, BIT1, 1);
\r
215 #if (RTL8195A_SUPPORT == 0)
\r
216 else if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) {
\r
217 ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT1, 0);
\r
218 ODM_SetBBReg(pDM_Odm, ODM_REG_NHM_TH9_TH10_11AC, BIT1, 1);
\r
226 Phydm_SetEDCCAThreshold(
\r
232 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
234 if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
\r
235 ODM_SetBBReg(pDM_Odm, rOFDM0_ECCAThreshold, bMaskByte2|bMaskByte0, (u4Byte)((u1Byte)L2H|(u1Byte)H2L<<16));
\r
236 #if (RTL8195A_SUPPORT == 0)
\r
237 else if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
\r
238 ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, bMaskLWord, (u2Byte)((u1Byte)L2H|(u1Byte)H2L<<8));
\r
246 IN PhyDM_set_LNA type
\r
249 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
251 if (pDM_Odm->SupportICType & (ODM_RTL8188E | ODM_RTL8192E)) {
\r
252 if (type == PhyDM_disable_LNA) {
\r
253 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x1);
\r
254 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x30, 0xfffff, 0x18000); /*select Rx mode*/
\r
255 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x31, 0xfffff, 0x0000f);
\r
256 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x32, 0xfffff, 0x37f82); /*disable LNA*/
\r
257 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x0);
\r
258 if (pDM_Odm->RFType > ODM_1T1R) {
\r
259 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0xef, 0x80000, 0x1);
\r
260 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x30, 0xfffff, 0x18000);
\r
261 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x31, 0xfffff, 0x0000f);
\r
262 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x32, 0xfffff, 0x37f82);
\r
263 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0xef, 0x80000, 0x0);
\r
265 } else if (type == PhyDM_enable_LNA) {
\r
266 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x1);
\r
267 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x30, 0xfffff, 0x18000); /*select Rx mode*/
\r
268 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x31, 0xfffff, 0x0000f);
\r
269 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x32, 0xfffff, 0x77f82); /*back to normal*/
\r
270 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x0);
\r
271 if (pDM_Odm->RFType > ODM_1T1R) {
\r
272 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0xef, 0x80000, 0x1);
\r
273 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x30, 0xfffff, 0x18000);
\r
274 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x31, 0xfffff, 0x0000f);
\r
275 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x32, 0xfffff, 0x77f82);
\r
276 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0xef, 0x80000, 0x0);
\r
279 } else if (pDM_Odm->SupportICType & ODM_RTL8723B) {
\r
280 if (type == PhyDM_disable_LNA) {
\r
282 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x1);
\r
283 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x30, 0xfffff, 0x18000); /*select Rx mode*/
\r
284 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x31, 0xfffff, 0x0001f);
\r
285 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x32, 0xfffff, 0xe6137); /*disable LNA*/
\r
286 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x0);
\r
288 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xed, 0x00020, 0x1);
\r
289 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x43, 0xfffff, 0x3008d); /*select Rx mode and disable LNA*/
\r
290 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xed, 0x00020, 0x0);
\r
291 } else if (type == PhyDM_enable_LNA) {
\r
293 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x1);
\r
294 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x30, 0xfffff, 0x18000); /*select Rx mode*/
\r
295 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x31, 0xfffff, 0x0001f);
\r
296 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x32, 0xfffff, 0xe6177); /*disable LNA*/
\r
297 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x0);
\r
299 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xed, 0x00020, 0x1);
\r
300 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x43, 0xfffff, 0x300bd); /*select Rx mode and disable LNA*/
\r
301 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xed, 0x00020, 0x0);
\r
304 } else if (pDM_Odm->SupportICType & ODM_RTL8812) {
\r
305 if (type == PhyDM_disable_LNA) {
\r
306 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x1);
\r
307 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x30, 0xfffff, 0x18000); /*select Rx mode*/
\r
308 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x31, 0xfffff, 0x3f7ff);
\r
309 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x32, 0xfffff, 0xc22bf); /*disable LNA*/
\r
310 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x0);
\r
311 if (pDM_Odm->RFType > ODM_1T1R) {
\r
312 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0xef, 0x80000, 0x1);
\r
313 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x30, 0xfffff, 0x18000); /*select Rx mode*/
\r
314 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x31, 0xfffff, 0x3f7ff);
\r
315 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x32, 0xfffff, 0xc22bf); /*disable LNA*/
\r
316 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0xef, 0x80000, 0x0);
\r
318 } else if (type == PhyDM_enable_LNA) {
\r
319 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x1);
\r
320 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x30, 0xfffff, 0x18000); /*select Rx mode*/
\r
321 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x31, 0xfffff, 0x3f7ff);
\r
322 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x32, 0xfffff, 0xc26bf); /*disable LNA*/
\r
323 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x0);
\r
324 if (pDM_Odm->RFType > ODM_1T1R) {
\r
325 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0xef, 0x80000, 0x1);
\r
326 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x30, 0xfffff, 0x18000); /*select Rx mode*/
\r
327 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x31, 0xfffff, 0x3f7ff);
\r
328 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x32, 0xfffff, 0xc26bf); /*disable LNA*/
\r
329 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0xef, 0x80000, 0x0);
\r
332 } else if (pDM_Odm->SupportICType & (ODM_RTL8821 | ODM_RTL8881A)) {
\r
333 if (type == PhyDM_disable_LNA) {
\r
334 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x1);
\r
335 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x30, 0xfffff, 0x18000); /*select Rx mode*/
\r
336 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x31, 0xfffff, 0x0002f);
\r
337 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x32, 0xfffff, 0xfb09b); /*disable LNA*/
\r
338 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x0);
\r
339 } else if (type == PhyDM_enable_LNA) {
\r
340 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x1);
\r
341 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x30, 0xfffff, 0x18000); /*select Rx mode*/
\r
342 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x31, 0xfffff, 0x0002f);
\r
343 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x32, 0xfffff, 0xfb0bb); /*disable LNA*/
\r
344 ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x0);
\r
354 IN PhyDM_Trx_MUX_Type txMode,
\r
355 IN PhyDM_Trx_MUX_Type rxMode
\r
358 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
360 if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES) {
\r
361 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_RPT_FORMAT_11N, BIT3 | BIT2 | BIT1, txMode); /*set TXmod to standby mode to remove outside noise affect*/
\r
362 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_RPT_FORMAT_11N, BIT22 | BIT21 | BIT20, rxMode); /*set RXmod to standby mode to remove outside noise affect*/
\r
363 if (pDM_Odm->RFType > ODM_1T1R) {
\r
364 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_RPT_FORMAT_11N_B, BIT3 | BIT2 | BIT1, txMode); /*set TXmod to standby mode to remove outside noise affect*/
\r
365 ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_RPT_FORMAT_11N_B, BIT22 | BIT21 | BIT20, rxMode); /*set RXmod to standby mode to remove outside noise affect*/
\r
368 #if (RTL8195A_SUPPORT == 0)
\r
369 else if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) {
\r
370 ODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC, BIT11 | BIT10 | BIT9 | BIT8, txMode); /*set TXmod to standby mode to remove outside noise affect*/
\r
371 ODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC, BIT7 | BIT6 | BIT5 | BIT4, rxMode); /*set RXmod to standby mode to remove outside noise affect*/
\r
372 if (pDM_Odm->RFType > ODM_1T1R) {
\r
373 ODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC_B, BIT11 | BIT10 | BIT9 | BIT8, txMode); /*set TXmod to standby mode to remove outside noise affect*/
\r
374 ODM_SetBBReg(pDM_Odm, ODM_REG_TRMUX_11AC_B, BIT7 | BIT6 | BIT5 | BIT4, rxMode); /*set RXmod to standby mode to remove outside noise affect*/
\r
382 Phydm_MACEDCCAState(
\r
384 IN PhyDM_MACEDCCA_Type State
\r
387 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
388 if (State == PhyDM_IGNORE_EDCCA) {
\r
389 ODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 1); /*ignore EDCCA reg520[15]=1*/
\r
390 /* ODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 0); *//*reg524[11]=0*/
\r
391 } else { /*don't set MAC ignore EDCCA signal*/
\r
392 ODM_SetMACReg(pDM_Odm, REG_TX_PTCL_CTRL, BIT15, 0); /*don't ignore EDCCA reg520[15]=0
\14*/
\r
393 /* ODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 1); *//*reg524[11]=1 */
\r
395 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("EDCCA enable State = %d\n", State));
\r
404 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
407 Base = pDM_Odm->NHM_cnt_0 + pDM_Odm->NHM_cnt_1;
\r
410 pDM_Odm->NHM_cnt_0 = ((pDM_Odm->NHM_cnt_0) << 8) / Base;
\r
411 pDM_Odm->NHM_cnt_1 = ((pDM_Odm->NHM_cnt_1) << 8) / Base;
\r
413 if ((pDM_Odm->NHM_cnt_0 - pDM_Odm->NHM_cnt_1) >= 100)
\r
414 return TRUE; /*clean environment*/
\r
416 return FALSE; /*noisy environment*/
\r
422 Phydm_CheckEnvironment(
\r
426 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
427 PADAPTIVITY_STATISTICS Adaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY);
\r
428 BOOLEAN isCleanEnvironment = FALSE;
\r
429 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
\r
430 prtl8192cd_priv priv = pDM_Odm->priv;
\r
433 if (Adaptivity->bFirstLink == TRUE) {
\r
434 if (pDM_Odm->SupportICType & (ODM_IC_11AC_GAIN_IDX_EDCCA | ODM_IC_11N_GAIN_IDX_EDCCA))
\r
435 pDM_Odm->adaptivity_flag = FALSE;
\r
437 pDM_Odm->adaptivity_flag = TRUE;
\r
439 Adaptivity->bFirstLink = FALSE;
\r
442 if (Adaptivity->NHMWait < 3) { /*Start enter NHM after 4 NHMWait*/
\r
443 Adaptivity->NHMWait++;
\r
444 Phydm_NHMCounterStatistics(pDM_Odm);
\r
447 Phydm_NHMCounterStatistics(pDM_Odm);
\r
448 isCleanEnvironment = Phydm_CalNHMcnt(pDM_Odm);
\r
449 if (isCleanEnvironment == TRUE) {
\r
450 pDM_Odm->TH_L2H_ini = Adaptivity->TH_L2H_ini_backup; /*adaptivity mode*/
\r
451 pDM_Odm->TH_EDCCA_HL_diff = Adaptivity->TH_EDCCA_HL_diff_backup;
\r
453 pDM_Odm->Adaptivity_enable = TRUE;
\r
455 if (pDM_Odm->SupportICType & (ODM_IC_11AC_GAIN_IDX_EDCCA | ODM_IC_11N_GAIN_IDX_EDCCA))
\r
456 pDM_Odm->adaptivity_flag = FALSE;
\r
458 pDM_Odm->adaptivity_flag = TRUE;
\r
459 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
\r
460 priv->pshare->rf_ft_var.isCleanEnvironment = TRUE;
\r
463 if (!Adaptivity->AcsForAdaptivity) {
\r
464 pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_mode2; /*mode2*/
\r
465 pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_mode2;
\r
467 pDM_Odm->adaptivity_flag = FALSE;
\r
468 pDM_Odm->Adaptivity_enable = FALSE;
\r
470 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
\r
471 priv->pshare->rf_ft_var.isCleanEnvironment = FALSE;
\r
474 Adaptivity->NHMWait = 0;
\r
475 Adaptivity->bFirstLink = TRUE;
\r
476 Adaptivity->bCheck = TRUE;
\r
485 Phydm_SearchPwdBLowerBound(
\r
489 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
490 PADAPTIVITY_STATISTICS Adaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY);
\r
491 u4Byte value32 = 0;
\r
493 u1Byte txEdcca1 = 0, txEdcca0 = 0;
\r
494 BOOLEAN bAdjust = TRUE;
\r
495 s1Byte TH_L2H_dmc, TH_H2L_dmc, IGI_target = 0x32;
\r
497 u1Byte IGI = Adaptivity->IGI_Base + 30 + (u1Byte)pDM_Odm->TH_L2H_ini - (u1Byte)pDM_Odm->TH_EDCCA_HL_diff;
\r
499 if (pDM_Odm->SupportICType & (ODM_RTL8723B | ODM_RTL8188E | ODM_RTL8192E | ODM_RTL8812 | ODM_RTL8821 | ODM_RTL8881A))
\r
500 Phydm_SetLNA(pDM_Odm, PhyDM_disable_LNA);
\r
502 Phydm_SetTRxMux(pDM_Odm, PhyDM_STANDBY_MODE, PhyDM_STANDBY_MODE);
\r
503 odm_PauseDIG(pDM_Odm, PHYDM_PAUSE, PHYDM_PAUSE_LEVEL_0, 0x7e);
\r
506 Diff = IGI_target - (s1Byte)IGI;
\r
507 TH_L2H_dmc = pDM_Odm->TH_L2H_ini + Diff;
\r
508 if (TH_L2H_dmc > 10)
\r
510 TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;
\r
512 Phydm_SetEDCCAThreshold(pDM_Odm, TH_H2L_dmc, TH_L2H_dmc);
\r
516 for (cnt = 0; cnt < 20; cnt++) {
\r
517 if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
\r
518 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11N, bMaskDWord);
\r
519 #if (RTL8195A_SUPPORT == 0)
\r
520 else if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
\r
521 value32 = ODM_GetBBReg(pDM_Odm, ODM_REG_RPT_11AC, bMaskDWord);
\r
523 if (value32 & BIT30 && (pDM_Odm->SupportICType & (ODM_RTL8723B | ODM_RTL8188E)))
\r
524 txEdcca1 = txEdcca1 + 1;
\r
525 else if (value32 & BIT29)
\r
526 txEdcca1 = txEdcca1 + 1;
\r
528 txEdcca0 = txEdcca0 + 1;
\r
531 if (txEdcca1 > 1) {
\r
533 TH_L2H_dmc = TH_L2H_dmc + 1;
\r
534 if (TH_L2H_dmc > 10)
\r
536 TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;
\r
538 Phydm_SetEDCCAThreshold(pDM_Odm, TH_H2L_dmc, TH_L2H_dmc);
\r
539 if (TH_L2H_dmc == 10) {
\r
541 Adaptivity->H2L_lb = TH_H2L_dmc;
\r
542 Adaptivity->L2H_lb = TH_L2H_dmc;
\r
543 pDM_Odm->Adaptivity_IGI_upper = IGI;
\r
551 Adaptivity->H2L_lb = TH_H2L_dmc;
\r
552 Adaptivity->L2H_lb = TH_L2H_dmc;
\r
553 pDM_Odm->Adaptivity_IGI_upper = IGI;
\r
559 pDM_Odm->Adaptivity_IGI_upper = pDM_Odm->Adaptivity_IGI_upper - pDM_Odm->DCbackoff;
\r
560 Adaptivity->H2L_lb = Adaptivity->H2L_lb + pDM_Odm->DCbackoff;
\r
561 Adaptivity->L2H_lb = Adaptivity->L2H_lb + pDM_Odm->DCbackoff;
\r
563 if (pDM_Odm->SupportICType & (ODM_RTL8723B | ODM_RTL8188E | ODM_RTL8192E | ODM_RTL8812 | ODM_RTL8821 | ODM_RTL8881A))
\r
564 Phydm_SetLNA(pDM_Odm, PhyDM_enable_LNA);
\r
566 Phydm_SetTRxMux(pDM_Odm, PhyDM_TX_MODE, PhyDM_RX_MODE);
\r
567 odm_PauseDIG(pDM_Odm, PHYDM_RESUME, PHYDM_PAUSE_LEVEL_0, NONE);
\r
570 Phydm_SetEDCCAThreshold(pDM_Odm, 0x7f, 0x7f); /*resume to no link state*/
\r
574 phydm_reSearchCondition(
\r
578 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
579 /*PADAPTIVITY_STATISTICS Adaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY);*/
\r
580 u1Byte Adaptivity_IGI_upper;
\r
581 /*s1Byte TH_L2H_dmc, IGI_target = 0x32;*/
\r
584 Adaptivity_IGI_upper = pDM_Odm->Adaptivity_IGI_upper + pDM_Odm->DCbackoff;
\r
586 /*TH_L2H_dmc = 10;*/
\r
588 /*Diff = TH_L2H_dmc - pDM_Odm->TH_L2H_ini;*/
\r
589 /*lowest_IGI_upper = IGI_target - Diff;*/
\r
591 /*if ((Adaptivity_IGI_upper - lowest_IGI_upper) <= 5)*/
\r
592 if (Adaptivity_IGI_upper <= 0x26)
\r
600 phydm_adaptivityInfoInit(
\r
602 IN PHYDM_ADAPINFO_E CmnInfo,
\r
606 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
607 PADAPTIVITY_STATISTICS Adaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY);
\r
610 case PHYDM_ADAPINFO_CARRIER_SENSE_ENABLE:
\r
611 pDM_Odm->Carrier_Sense_enable = (BOOLEAN)Value;
\r
614 case PHYDM_ADAPINFO_DCBACKOFF:
\r
615 pDM_Odm->DCbackoff = (u1Byte)Value;
\r
618 case PHYDM_ADAPINFO_DYNAMICLINKADAPTIVITY:
\r
619 Adaptivity->DynamicLinkAdaptivity = (BOOLEAN)Value;
\r
622 case PHYDM_ADAPINFO_TH_L2H_INI:
\r
623 pDM_Odm->TH_L2H_ini = (s1Byte)Value;
\r
626 case PHYDM_ADAPINFO_TH_EDCCA_HL_DIFF:
\r
627 pDM_Odm->TH_EDCCA_HL_diff = (s1Byte)Value;
\r
630 case PHYDM_ADAPINFO_AP_NUM_TH:
\r
631 Adaptivity->APNumTH = (u1Byte)Value;
\r
644 Phydm_AdaptivityInit(
\r
648 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
649 PADAPTIVITY_STATISTICS Adaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY);
\r
650 s1Byte IGItarget = 0x32;
\r
651 /*pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;*/
\r
653 #if(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))
\r
655 if (pDM_Odm->Carrier_Sense_enable == FALSE) {
\r
656 if (pDM_Odm->TH_L2H_ini == 0)
\r
657 pDM_Odm->TH_L2H_ini = 0xf5;
\r
659 pDM_Odm->TH_L2H_ini = 0xa;
\r
661 if (pDM_Odm->TH_EDCCA_HL_diff == 0)
\r
662 pDM_Odm->TH_EDCCA_HL_diff = 7;
\r
663 #if(DM_ODM_SUPPORT_TYPE & (ODM_CE))
\r
664 if (pDM_Odm->WIFITest == TRUE || pDM_Odm->mp_mode == TRUE)
\r
666 if ((pDM_Odm->WIFITest & RT_WIFI_LOGO) == TRUE)
\r
668 pDM_Odm->EDCCA_enable = FALSE; /*even no adaptivity, we still enable EDCCA, AP side use mib control*/
\r
670 pDM_Odm->EDCCA_enable = TRUE;
\r
672 #elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
\r
673 prtl8192cd_priv priv = pDM_Odm->priv;
\r
675 if (pDM_Odm->Carrier_Sense_enable) {
\r
676 pDM_Odm->TH_L2H_ini = 0xa;
\r
677 pDM_Odm->TH_EDCCA_HL_diff = 7;
\r
679 pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_default; /*set by mib*/
\r
680 pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_default;
\r
683 if (priv->pshare->rf_ft_var.adaptivity_enable == 3)
\r
684 Adaptivity->AcsForAdaptivity = TRUE;
\r
686 Adaptivity->AcsForAdaptivity = FALSE;
\r
688 if (priv->pshare->rf_ft_var.adaptivity_enable == 2)
\r
689 Adaptivity->DynamicLinkAdaptivity = TRUE;
\r
691 Adaptivity->DynamicLinkAdaptivity = FALSE;
\r
693 priv->pshare->rf_ft_var.isCleanEnvironment = FALSE;
\r
697 pDM_Odm->Adaptivity_IGI_upper = 0;
\r
698 pDM_Odm->Adaptivity_enable = FALSE; /*use this flag to decide enable or disable*/
\r
700 pDM_Odm->TH_L2H_ini_mode2 = 20;
\r
701 pDM_Odm->TH_EDCCA_HL_diff_mode2 = 8;
\r
702 Adaptivity->TH_L2H_ini_backup = pDM_Odm->TH_L2H_ini;
\r
703 Adaptivity->TH_EDCCA_HL_diff_backup = pDM_Odm->TH_EDCCA_HL_diff;
\r
705 Adaptivity->IGI_Base = 0x32;
\r
706 Adaptivity->IGI_target = 0x1c;
\r
707 Adaptivity->H2L_lb = 0;
\r
708 Adaptivity->L2H_lb = 0;
\r
709 Adaptivity->NHMWait = 0;
\r
710 Adaptivity->bCheck = FALSE;
\r
711 Adaptivity->bFirstLink = TRUE;
\r
712 Adaptivity->AdajustIGILevel = 0;
\r
713 Adaptivity->bStopEDCCA = FALSE;
\r
714 Adaptivity->backupH2L = 0;
\r
715 Adaptivity->backupL2H = 0;
\r
717 Phydm_MACEDCCAState(pDM_Odm, PhyDM_DONT_IGNORE_EDCCA);
\r
719 /*Search pwdB lower bound*/
\r
720 if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
\r
721 ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11N, bMaskDWord, 0x208);
\r
722 #if (RTL8195A_SUPPORT == 0)
\r
723 else if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
\r
724 ODM_SetBBReg(pDM_Odm, ODM_REG_DBG_RPT_11AC, bMaskDWord, 0x209);
\r
727 if (pDM_Odm->SupportICType & ODM_IC_11N_GAIN_IDX_EDCCA) {
\r
728 /*ODM_SetBBReg(pDM_Odm, ODM_REG_EDCCA_DOWN_OPT_11N, BIT12 | BIT11 | BIT10, 0x7);*/ /*interfernce need > 2^x us, and then EDCCA will be 1*/
\r
729 if (pDM_Odm->SupportICType & ODM_RTL8197F) {
\r
730 ODM_SetBBReg(pDM_Odm, ODM_REG_PAGE_B1_97F, BIT30, 0x1); /*set to page B1*/
\r
731 ODM_SetBBReg(pDM_Odm, ODM_REG_EDCCA_DCNF_97F, BIT27 | BIT26, 0x1); /*0:rx_dfir, 1: dcnf_out, 2 :rx_iq, 3: rx_nbi_nf_out*/
\r
732 ODM_SetBBReg(pDM_Odm, ODM_REG_PAGE_B1_97F, BIT30, 0x0);
\r
733 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
\r
734 if (priv->pshare->rf_ft_var.adaptivity_enable == 1)
\r
735 ODM_SetBBReg(pDM_Odm, 0xce8, BIT13, 0x1); /*0: mean, 1:max pwdB*/
\r
738 ODM_SetBBReg(pDM_Odm, ODM_REG_EDCCA_DCNF_11N, BIT21 | BIT20, 0x1); /*0:rx_dfir, 1: dcnf_out, 2 :rx_iq, 3: rx_nbi_nf_out*/
\r
740 #if (RTL8195A_SUPPORT == 0)
\r
741 if (pDM_Odm->SupportICType & ODM_IC_11AC_GAIN_IDX_EDCCA) { /*8814a no need to find pwdB lower bound, maybe*/
\r
742 /*ODM_SetBBReg(pDM_Odm, ODM_REG_EDCCA_DOWN_OPT, BIT30 | BIT29 | BIT28, 0x7);*/ /*interfernce need > 2^x us, and then EDCCA will be 1*/
\r
743 ODM_SetBBReg(pDM_Odm, ODM_REG_ACBB_EDCCA_ENHANCE, BIT29 | BIT28, 0x1); /*0:rx_dfir, 1: dcnf_out, 2 :rx_iq, 3: rx_nbi_nf_out*/
\r
746 if (!(pDM_Odm->SupportICType & (ODM_IC_11AC_GAIN_IDX_EDCCA | ODM_IC_11N_GAIN_IDX_EDCCA))) {
\r
747 Phydm_SearchPwdBLowerBound(pDM_Odm);
\r
748 if (phydm_reSearchCondition(pDM_Odm))
\r
749 Phydm_SearchPwdBLowerBound(pDM_Odm);
\r
753 /*we need to consider PwdB upper bound for 8814 later IC*/
\r
754 Adaptivity->AdajustIGILevel = (u1Byte)((pDM_Odm->TH_L2H_ini + IGItarget) - PwdBUpperBound + DFIRloss); /*IGI = L2H - PwdB - DFIRloss*/
\r
756 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("TH_L2H_ini = 0x%x, TH_EDCCA_HL_diff = 0x%x, Adaptivity->AdajustIGILevel = 0x%x\n", pDM_Odm->TH_L2H_ini, pDM_Odm->TH_EDCCA_HL_diff, Adaptivity->AdajustIGILevel));
\r
758 /*Check this later on Windows*/
\r
759 /*phydm_setEDCCAThresholdAPI(pDM_Odm, pDM_DigTable->CurIGValue);*/
\r
770 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
771 s1Byte TH_L2H_dmc, TH_H2L_dmc;
\r
772 s1Byte Diff = 0, IGI_target;
\r
773 PADAPTIVITY_STATISTICS Adaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY);
\r
774 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
775 PADAPTER pAdapter = pDM_Odm->Adapter;
\r
776 BOOLEAN bFwCurrentInPSMode = FALSE;
\r
778 pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_FW_PSMODE_STATUS, (pu1Byte)(&bFwCurrentInPSMode));
\r
780 /*Disable EDCCA mode while under LPS mode, added by Roger, 2012.09.14.*/
\r
781 if (bFwCurrentInPSMode)
\r
785 if ((pDM_Odm->EDCCA_enable == FALSE) || (Adaptivity->bStopEDCCA == TRUE)) {
\r
786 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("Disable EDCCA!!!\n"));
\r
790 if (!(pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY)) {
\r
791 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("adaptivity disable, enable EDCCA mode!!!\n"));
\r
792 pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_mode2;
\r
793 pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_mode2;
\r
795 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
797 if (Phydm_CheckChannelPlan(pDM_Odm) || (pDM_Odm->APTotalNum > Adaptivity->APNumTH)) {
\r
798 pDM_Odm->TH_L2H_ini = pDM_Odm->TH_L2H_ini_mode2;
\r
799 pDM_Odm->TH_EDCCA_HL_diff = pDM_Odm->TH_EDCCA_HL_diff_mode2;
\r
801 pDM_Odm->TH_L2H_ini = Adaptivity->TH_L2H_ini_backup;
\r
802 pDM_Odm->TH_EDCCA_HL_diff = Adaptivity->TH_EDCCA_HL_diff_backup;
\r
807 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("odm_Adaptivity() =====>\n"));
\r
808 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("IGI_Base=0x%x, TH_L2H_ini = %d, TH_EDCCA_HL_diff = %d\n",
\r
809 Adaptivity->IGI_Base, pDM_Odm->TH_L2H_ini, pDM_Odm->TH_EDCCA_HL_diff));
\r
810 #if (RTL8195A_SUPPORT == 0)
\r
811 if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) {
\r
812 /*fix AC series when enable EDCCA hang issue*/
\r
813 ODM_SetBBReg(pDM_Odm, 0x800, BIT10, 1); /*ADC_mask disable*/
\r
814 ODM_SetBBReg(pDM_Odm, 0x800, BIT10, 0); /*ADC_mask enable*/
\r
817 if (*pDM_Odm->pBandWidth == ODM_BW20M) /*CHANNEL_WIDTH_20*/
\r
818 IGI_target = Adaptivity->IGI_Base;
\r
819 else if (*pDM_Odm->pBandWidth == ODM_BW40M)
\r
820 IGI_target = Adaptivity->IGI_Base + 2;
\r
821 #if (RTL8195A_SUPPORT == 0)
\r
822 else if (*pDM_Odm->pBandWidth == ODM_BW80M)
\r
823 IGI_target = Adaptivity->IGI_Base + 2;
\r
826 IGI_target = Adaptivity->IGI_Base;
\r
827 Adaptivity->IGI_target = (u1Byte) IGI_target;
\r
829 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("BandWidth=%s, IGI_target=0x%x, DynamicLinkAdaptivity = %d, AcsForAdaptivity = %d\n",
\r
830 (*pDM_Odm->pBandWidth == ODM_BW80M) ? "80M" : ((*pDM_Odm->pBandWidth == ODM_BW40M) ? "40M" : "20M"), IGI_target, Adaptivity->DynamicLinkAdaptivity, Adaptivity->AcsForAdaptivity));
\r
831 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("RSSI_min = %d, Adaptivity->AdajustIGILevel= 0x%x, adaptivity_flag = %d, Adaptivity_enable = %d\n",
\r
832 pDM_Odm->RSSI_Min, Adaptivity->AdajustIGILevel, pDM_Odm->adaptivity_flag, pDM_Odm->Adaptivity_enable));
\r
834 if ((Adaptivity->DynamicLinkAdaptivity == TRUE) && (!pDM_Odm->bLinked) && (pDM_Odm->Adaptivity_enable == FALSE)) {
\r
835 Phydm_SetEDCCAThreshold(pDM_Odm, 0x7f, 0x7f);
\r
836 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("In DynamicLink mode(noisy) and No link, Turn off EDCCA!!\n"));
\r
840 if (pDM_Odm->SupportICType & (ODM_IC_11AC_GAIN_IDX_EDCCA | ODM_IC_11N_GAIN_IDX_EDCCA)) {
\r
841 if ((Adaptivity->AdajustIGILevel > IGI) && (pDM_Odm->Adaptivity_enable == TRUE))
\r
842 Diff = Adaptivity->AdajustIGILevel - IGI;
\r
844 TH_L2H_dmc = pDM_Odm->TH_L2H_ini - Diff + IGI_target;
\r
845 TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;
\r
847 #if (RTL8195A_SUPPORT == 0)
\r
849 Diff = IGI_target - (s1Byte)IGI;
\r
850 TH_L2H_dmc = pDM_Odm->TH_L2H_ini + Diff;
\r
851 if (TH_L2H_dmc > 10 && (pDM_Odm->Adaptivity_enable == TRUE))
\r
854 TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;
\r
856 /*replace lower bound to prevent EDCCA always equal 1*/
\r
857 if (TH_H2L_dmc < Adaptivity->H2L_lb)
\r
858 TH_H2L_dmc = Adaptivity->H2L_lb;
\r
859 if (TH_L2H_dmc < Adaptivity->L2H_lb)
\r
860 TH_L2H_dmc = Adaptivity->L2H_lb;
\r
863 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("IGI=0x%x, TH_L2H_dmc = %d, TH_H2L_dmc = %d\n", IGI, TH_L2H_dmc, TH_H2L_dmc));
\r
864 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("Adaptivity_IGI_upper=0x%x, H2L_lb = 0x%x, L2H_lb = 0x%x\n", pDM_Odm->Adaptivity_IGI_upper, Adaptivity->H2L_lb, Adaptivity->L2H_lb));
\r
866 Phydm_SetEDCCAThreshold(pDM_Odm, TH_H2L_dmc, TH_L2H_dmc);
\r
868 if (pDM_Odm->Adaptivity_enable == TRUE)
\r
869 ODM_SetMACReg(pDM_Odm, REG_RD_CTRL, BIT11, 1);
\r
875 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
878 Phydm_AdaptivityBSOD(
\r
882 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
883 PADAPTER pAdapter = pDM_Odm->Adapter;
\r
884 PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo);
\r
889 1. turn off RF (TRX Mux in standby mode)
\r
892 4. wait for clear FIFO
\r
893 5. don't ignore EDCCA
\r
894 6. turn on RF (TRX Mux in TRx mdoe)
\r
895 7. H2C mac id resume
\r
898 RT_TRACE(COMP_MLME, DBG_WARNING, ("MAC id drop packet!!!!!\n"));
\r
900 pAdapter->dropPktByMacIdCnt++;
\r
901 pMgntInfo->bDropPktInProgress = TRUE;
\r
903 pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_MAX_Q_PAGE_NUM, (pu1Byte)(&u4Value));
\r
904 RT_TRACE(COMP_INIT, DBG_LOUD, ("Queue Reserved Page Number = 0x%08x\n", u4Value));
\r
905 pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_AVBL_Q_PAGE_NUM, (pu1Byte)(&u4Value));
\r
906 RT_TRACE(COMP_INIT, DBG_LOUD, ("Available Queue Page Number = 0x%08x\n", u4Value));
\r
909 Phydm_SetTRxMux(pDM_Odm, PhyDM_STANDBY_MODE, PhyDM_STANDBY_MODE);
\r
910 ODM_Write_DIG(pDM_Odm, 0x20);
\r
912 /*H2C mac id drop*/
\r
913 MacIdIndicateDisconnect(pAdapter);
\r
916 Phydm_MACEDCCAState(pDM_Odm, PhyDM_IGNORE_EDCCA);
\r
922 Phydm_MACEDCCAState(pDM_Odm, PhyDM_DONT_IGNORE_EDCCA);
\r
924 /*Turn on TRx mode*/
\r
925 Phydm_SetTRxMux(pDM_Odm, PhyDM_TX_MODE, PhyDM_RX_MODE);
\r
926 ODM_Write_DIG(pDM_Odm, 0x20);
\r
928 /*Resume H2C macid*/
\r
929 MacIdRecoverMediaStatus(pAdapter);
\r
931 pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_AVBL_Q_PAGE_NUM, (pu1Byte)(&u4Value));
\r
932 RT_TRACE(COMP_INIT, DBG_LOUD, ("Available Queue Page Number = 0x%08x\n", u4Value));
\r
934 pMgntInfo->bDropPktInProgress = FALSE;
\r
935 RT_TRACE(COMP_MLME, DBG_WARNING, ("End of MAC id drop packet, spent %dms\n", count * 10));
\r
941 /*This API is for solving USB can't Tx problem due to USB3.0 interference in 2.4G*/
\r
945 IN BOOLEAN bPasueEDCCA
\r
948 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
949 PADAPTIVITY_STATISTICS Adaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY);
\r
950 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
\r
951 u1Byte IGI = pDM_DigTable->CurIGValue;
\r
955 Adaptivity->bStopEDCCA = TRUE;
\r
957 if (pDM_Odm->SupportICType & (ODM_IC_11AC_GAIN_IDX_EDCCA | ODM_IC_11N_GAIN_IDX_EDCCA)) {
\r
958 if (Adaptivity->AdajustIGILevel > IGI)
\r
959 Diff = Adaptivity->AdajustIGILevel - IGI;
\r
961 Adaptivity->backupL2H = pDM_Odm->TH_L2H_ini - Diff + Adaptivity->IGI_target;
\r
962 Adaptivity->backupH2L = Adaptivity->backupL2H - pDM_Odm->TH_EDCCA_HL_diff;
\r
964 #if (RTL8195A_SUPPORT == 0)
\r
966 Diff = Adaptivity->IGI_target - (s1Byte)IGI;
\r
967 Adaptivity->backupL2H = pDM_Odm->TH_L2H_ini + Diff;
\r
968 if (Adaptivity->backupL2H > 10)
\r
969 Adaptivity->backupL2H = 10;
\r
971 Adaptivity->backupH2L = Adaptivity->backupL2H - pDM_Odm->TH_EDCCA_HL_diff;
\r
973 /*replace lower bound to prevent EDCCA always equal 1*/
\r
974 if (Adaptivity->backupH2L < Adaptivity->H2L_lb)
\r
975 Adaptivity->backupH2L = Adaptivity->H2L_lb;
\r
976 if (Adaptivity->backupL2H < Adaptivity->L2H_lb)
\r
977 Adaptivity->backupL2H = Adaptivity->L2H_lb;
\r
980 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("pauseEDCCA : L2Hbak = 0x%x, H2Lbak = 0x%x, IGI = 0x%x\n", Adaptivity->backupL2H, Adaptivity->backupH2L, IGI));
\r
983 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
984 if (PlatformIsWorkItemScheduled(&(Adaptivity->phydm_pauseEDCCAWorkItem)) == FALSE)
\r
985 PlatformScheduleWorkItem(&(Adaptivity->phydm_pauseEDCCAWorkItem));
\r
987 phydm_pauseEDCCA_WorkItemCallback(pDM_Odm);
\r
992 Adaptivity->bStopEDCCA = FALSE;
\r
993 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("resumeEDCCA : L2Hbak = 0x%x, H2Lbak = 0x%x, IGI = 0x%x\n", Adaptivity->backupL2H, Adaptivity->backupH2L, IGI));
\r
995 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
996 if (PlatformIsWorkItemScheduled(&(Adaptivity->phydm_resumeEDCCAWorkItem)) == FALSE)
\r
997 PlatformScheduleWorkItem(&(Adaptivity->phydm_resumeEDCCAWorkItem));
\r
999 phydm_resumeEDCCA_WorkItemCallback(pDM_Odm);
\r
1008 phydm_pauseEDCCA_WorkItemCallback(
\r
1009 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
1010 IN PADAPTER Adapter
\r
1016 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
1017 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
1018 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
1020 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
1023 if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
\r
1024 ODM_SetBBReg(pDM_Odm, rOFDM0_ECCAThreshold, bMaskByte2|bMaskByte0, (u4Byte)(0x7f|0x7f<<16));
\r
1025 #if (RTL8195A_SUPPORT == 0)
\r
1026 else if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
\r
1027 ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, bMaskLWord, (u2Byte)(0x7f|0x7f<<8));
\r
1033 phydm_resumeEDCCA_WorkItemCallback(
\r
1034 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
1035 IN PADAPTER Adapter
\r
1041 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
1042 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
1043 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
1045 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
1047 PADAPTIVITY_STATISTICS Adaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY);
\r
1049 if (pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
\r
1050 ODM_SetBBReg(pDM_Odm, rOFDM0_ECCAThreshold, bMaskByte2|bMaskByte0, (u4Byte)((u1Byte)Adaptivity->backupL2H|(u1Byte)Adaptivity->backupH2L<<16));
\r
1051 #if (RTL8195A_SUPPORT == 0)
\r
1052 else if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
\r
1053 ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, bMaskLWord, (u2Byte)((u1Byte)Adaptivity->backupL2H|(u1Byte)Adaptivity->backupH2L<<8));
\r
1060 phydm_setEDCCAThresholdAPI(
\r
1061 IN PVOID pDM_VOID,
\r
1065 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
1066 PADAPTIVITY_STATISTICS Adaptivity = (PADAPTIVITY_STATISTICS)PhyDM_Get_Structure(pDM_Odm, PHYDM_ADAPTIVITY);
\r
1067 s1Byte TH_L2H_dmc, TH_H2L_dmc;
\r
1068 s1Byte Diff = 0, IGI_target = 0x32;
\r
1070 if (pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY) {
\r
1071 if (pDM_Odm->SupportICType & (ODM_IC_11AC_GAIN_IDX_EDCCA | ODM_IC_11N_GAIN_IDX_EDCCA)) {
\r
1072 if (Adaptivity->AdajustIGILevel > IGI)
\r
1073 Diff = Adaptivity->AdajustIGILevel - IGI;
\r
1075 TH_L2H_dmc = pDM_Odm->TH_L2H_ini - Diff + IGI_target;
\r
1076 TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;
\r
1078 #if (RTL8195A_SUPPORT == 0)
\r
1080 Diff = IGI_target - (s1Byte)IGI;
\r
1081 TH_L2H_dmc = pDM_Odm->TH_L2H_ini + Diff;
\r
1082 if (TH_L2H_dmc > 10)
\r
1085 TH_H2L_dmc = TH_L2H_dmc - pDM_Odm->TH_EDCCA_HL_diff;
\r
1087 /*replace lower bound to prevent EDCCA always equal 1*/
\r
1088 if (TH_H2L_dmc < Adaptivity->H2L_lb)
\r
1089 TH_H2L_dmc = Adaptivity->H2L_lb;
\r
1090 if (TH_L2H_dmc < Adaptivity->L2H_lb)
\r
1091 TH_L2H_dmc = Adaptivity->L2H_lb;
\r
1094 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("API :IGI=0x%x, TH_L2H_dmc = %d, TH_H2L_dmc = %d\n", IGI, TH_L2H_dmc, TH_H2L_dmc));
\r
1095 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("API :Adaptivity_IGI_upper=0x%x, H2L_lb = 0x%x, L2H_lb = 0x%x\n", pDM_Odm->Adaptivity_IGI_upper, Adaptivity->H2L_lb, Adaptivity->L2H_lb));
\r
1097 Phydm_SetEDCCAThreshold(pDM_Odm, TH_H2L_dmc, TH_L2H_dmc);
\r