1 /******************************************************************************
\r
3 * Copyright(c) 2007 - 2013 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 #include <drv_conf.h>
\r
22 #include <osdep_service.h>
\r
23 #include <drv_types.h>
\r
25 #ifdef CONFIG_RTL8192C
\r
26 #include <rtl8192c_hal.h>
\r
29 #ifdef CONFIG_RTL8192D
\r
30 #include <rtl8192d_hal.h>
\r
33 bool rtw_adapter_linked(_adapter *adapter)
\r
35 bool linked = _FALSE;
\r
36 struct mlme_priv *mlmepriv = &adapter->mlmepriv;
\r
38 if( (check_fwstate(mlmepriv, WIFI_AP_STATE) == _TRUE) ||
\r
39 (check_fwstate(mlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE))
\r
41 if(adapter->stapriv.asoc_sta_count > 2)
\r
45 if(check_fwstate(mlmepriv, _FW_LINKED)== _TRUE)
\r
52 bool dm_linked(_adapter *adapter)
\r
56 if ((linked = rtw_adapter_linked(adapter)))
\r
59 #ifdef CONFIG_CONCURRENT_MODE
\r
60 if ((adapter = adapter->pbuddy_adapter) == NULL)
\r
62 linked = rtw_adapter_linked(adapter);
\r
70 void dm_enable_EDCCA(_adapter *adapter)
\r
72 // Enable EDCCA. The value is suggested by SD3 Wilson.
\r
75 // Revised for ASUS 11b/g performance issues, suggested by BB Neil, 2012.04.13.
\r
77 /*if((pDM_Odm->SupportICType == ODM_RTL8723A)&&(IS_WIRELESS_MODE_G(pAdapter)))
\r
79 rtw_write8(adapter,rOFDM0_ECCAThreshold,0x00);
\r
80 rtw_write8(adapter,rOFDM0_ECCAThreshold+2,0xFD);
\r
85 rtw_write8(adapter,rOFDM0_ECCAThreshold,0x03);
\r
86 rtw_write8(adapter,rOFDM0_ECCAThreshold+2,0x00);
\r
90 void dm_disable_EDCCA(_adapter *adapter)
\r
93 rtw_write8(adapter, rOFDM0_ECCAThreshold, 0x7f);
\r
94 rtw_write8(adapter, rOFDM0_ECCAThreshold+2, 0x7f);
\r
98 // Description: According to initial gain value to determine to enable or disable EDCCA.
\r
100 // Suggested by SD3 Wilson. Added by tynli. 2011.11.25.
\r
102 void dm_dynamic_EDCCA(_adapter *pAdapter)
\r
104 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
\r
105 struct dm_priv *dmpriv = &pHalData->dmpriv;
\r
108 RegC50 = (u8)PHY_QueryBBReg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0);
\r
109 RegC58 = (u8)PHY_QueryBBReg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0);
\r
112 if((RegC50 > 0x28 && RegC58 > 0x28)
\r
113 /*|| ((pDM_Odm->SupportICType == ODM_RTL8723A && IS_WIRELESS_MODE_G(pAdapter) && RegC50>0x26))
\r
114 || (pDM_Odm->SupportICType == ODM_RTL8188E && RegC50 > 0x28)*/
\r
117 if(!dmpriv->bPreEdccaEnable)
\r
119 dm_enable_EDCCA(pAdapter);
\r
120 dmpriv->bPreEdccaEnable = _TRUE;
\r
124 else if((RegC50 < 0x25 && RegC58 < 0x25)
\r
125 /*|| (pDM_Odm->SupportICType == ODM_RTL8188E && RegC50 < 0x25)*/
\r
128 if(dmpriv->bPreEdccaEnable)
\r
130 dm_disable_EDCCA(pAdapter);
\r
131 dmpriv->bPreEdccaEnable = _FALSE;
\r
137 #define DM_ADAPTIVITY_VER "ADAPTIVITY_V001"
\r
139 int dm_adaptivity_get_parm_str(_adapter *pAdapter, char *buf, int len)
\r
141 #ifdef CONFIG_DM_ADAPTIVITY
\r
142 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
\r
143 struct dm_priv *dmpriv = &pHalData->dmpriv;
\r
145 return snprintf(buf, len, DM_ADAPTIVITY_VER"\n"
\r
146 "TH_L2H_ini\tTH_EDCCA_HL_diff\tIGI_Base\tForceEDCCA\tAdapEn_RSSI\tIGI_LowerBound\n"
\r
147 "0x%02x\t%d\t0x%02x\t%d\t%u\t%u\n",
\r
148 (u8)dmpriv->TH_L2H_ini,
\r
149 dmpriv->TH_EDCCA_HL_diff,
\r
151 dmpriv->ForceEDCCA,
\r
152 dmpriv->AdapEn_RSSI,
\r
153 dmpriv->IGI_LowerBound
\r
155 #endif /* CONFIG_DM_ADAPTIVITY */
\r
159 void dm_adaptivity_set_parm(_adapter *pAdapter, s8 TH_L2H_ini, s8 TH_EDCCA_HL_diff,
\r
160 s8 IGI_Base, bool ForceEDCCA, u8 AdapEn_RSSI, u8 IGI_LowerBound)
\r
162 #ifdef CONFIG_DM_ADAPTIVITY
\r
163 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
\r
164 struct dm_priv *dmpriv = &pHalData->dmpriv;
\r
166 dmpriv->TH_L2H_ini = TH_L2H_ini;
\r
167 dmpriv->TH_EDCCA_HL_diff = TH_EDCCA_HL_diff;
\r
168 dmpriv->IGI_Base = IGI_Base;
\r
169 dmpriv->ForceEDCCA = ForceEDCCA;
\r
170 dmpriv->AdapEn_RSSI = AdapEn_RSSI;
\r
171 dmpriv->IGI_LowerBound = IGI_LowerBound;
\r
173 #endif /* CONFIG_DM_ADAPTIVITY */
\r
176 void dm_adaptivity_init(_adapter *pAdapter)
\r
178 #ifdef CONFIG_DM_ADAPTIVITY
\r
179 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
\r
180 struct dm_priv *dmpriv = &pHalData->dmpriv;
\r
183 if(pDM_Odm->SupportICType == ODM_RTL8723B)
\r
185 pDM_Odm->TH_L2H_ini = 0xf8; // -8
\r
187 if((pDM_Odm->SupportICType == ODM_RTL8192E)&&(pDM_Odm->SupportInterface == ODM_ITRF_PCIE))
\r
189 pDM_Odm->TH_L2H_ini = 0xf0; // -16
\r
193 dmpriv->TH_L2H_ini = 0xf9; // -7
\r
196 dmpriv->TH_EDCCA_HL_diff = 7;
\r
197 dmpriv->IGI_Base = 0x32;
\r
198 dmpriv->IGI_target = 0x1c;
\r
199 dmpriv->ForceEDCCA = 0;
\r
200 dmpriv->AdapEn_RSSI = 20;
\r
201 dmpriv->IGI_LowerBound = 0;
\r
203 //Reg524[11]=0 is easily to transmit packets during adaptivity test
\r
204 PHY_SetBBReg(pAdapter, 0x524, BIT11, 1); // stop counting if EDCCA is asserted
\r
206 #endif /* CONFIG_DM_ADAPTIVITY */
\r
209 void dm_adaptivity(_adapter *pAdapter)
\r
211 #ifdef CONFIG_DM_ADAPTIVITY
\r
212 s8 TH_L2H_dmc, TH_H2L_dmc;
\r
213 s8 TH_L2H, TH_H2L, Diff, IGI_target;
\r
215 BOOLEAN EDCCA_State;
\r
217 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
\r
218 struct dm_priv *dmpriv = &pHalData->dmpriv;
\r
219 DIG_T *pDigTable = &dmpriv->DM_DigTable;
\r
220 u8 IGI = pDigTable->CurIGValue;
\r
221 u8 RSSI_Min = pDigTable->Rssi_val_min;
\r
222 HT_CHANNEL_WIDTH BandWidth = pHalData->CurrentChannelBW;
\r
224 if (!(dmpriv->DMFlag & DYNAMIC_FUNC_ADAPTIVITY))
\r
226 LOG_LEVEL(_drv_info_, "Go to odm_DynamicEDCCA() \n");
\r
227 // Add by Neil Chen to enable edcca to MP Platform
\r
229 /*if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)
\r
230 dm_dynamic_EDCCA(pAdapter);
\r
234 LOG_LEVEL(_drv_info_, "odm_Adaptivity() =====> \n");
\r
236 LOG_LEVEL(_drv_info_, "ForceEDCCA=%d, IGI_Base=0x%x, TH_L2H_ini = %d, TH_EDCCA_HL_diff = %d, AdapEn_RSSI = %d\n",
\r
237 dmpriv->ForceEDCCA, dmpriv->IGI_Base, dmpriv->TH_L2H_ini, dmpriv->TH_EDCCA_HL_diff, dmpriv->AdapEn_RSSI);
\r
239 /*if(pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)
\r
240 PHY_SetBBReg(0x800, BIT10, 0); //ADC_mask enable
\r
243 if(!dm_linked(pAdapter) || pHalData->CurrentChannel > 149) /* Band4 doesn't need adaptivity */
\r
245 /*if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)*/
\r
247 PHY_SetBBReg(pAdapter,rOFDM0_ECCAThreshold, bMaskByte0, 0x7f);
\r
248 PHY_SetBBReg(pAdapter,rOFDM0_ECCAThreshold, bMaskByte2, 0x7f);
\r
252 ODM_SetBBReg(pDM_Odm, rFPGA0_XB_LSSIReadBack, 0xFFFF, (0x7f<<8) | 0x7f);
\r
257 if(!dmpriv->ForceEDCCA)
\r
259 if(RSSI_Min > dmpriv->AdapEn_RSSI)
\r
261 else if(RSSI_Min < (dmpriv->AdapEn_RSSI - 5))
\r
266 //if((pDM_Odm->SupportICType & ODM_IC_11AC_SERIES) && (*pDM_Odm->pBandType == BAND_ON_5G))
\r
267 //IGI_target = pDM_Odm->IGI_Base;
\r
271 if(BandWidth == HT_CHANNEL_WIDTH_20) //CHANNEL_WIDTH_20
\r
272 IGI_target = dmpriv->IGI_Base;
\r
273 else if(BandWidth == HT_CHANNEL_WIDTH_40)
\r
274 IGI_target = dmpriv->IGI_Base + 2;
\r
275 /*else if(*pDM_Odm->pBandWidth == ODM_BW80M)
\r
276 IGI_target = pDM_Odm->IGI_Base + 6;*/
\r
278 IGI_target = dmpriv->IGI_Base;
\r
281 dmpriv->IGI_target = (u8)IGI_target;
\r
283 LOG_LEVEL(_drv_info_, "BandWidth=%s, IGI_target=0x%x, EDCCA_State=%d\n",
\r
284 (BandWidth==HT_CHANNEL_WIDTH_40)?"40M":"20M", IGI_target, EDCCA_State);
\r
286 if(EDCCA_State == 1)
\r
288 Diff = IGI_target -(s8)IGI;
\r
289 TH_L2H_dmc = dmpriv->TH_L2H_ini + Diff;
\r
290 if(TH_L2H_dmc > 10) TH_L2H_dmc = 10;
\r
291 TH_H2L_dmc = TH_L2H_dmc - dmpriv->TH_EDCCA_HL_diff;
\r
299 LOG_LEVEL(_drv_info_, "IGI=0x%x, TH_L2H_dmc = %d, TH_H2L_dmc = %d\n",
\r
300 IGI, TH_L2H_dmc, TH_H2L_dmc);
\r
302 /*if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)*/
\r
304 PHY_SetBBReg(pAdapter,rOFDM0_ECCAThreshold, bMaskByte0, (u8)TH_L2H_dmc);
\r
305 PHY_SetBBReg(pAdapter,rOFDM0_ECCAThreshold, bMaskByte2, (u8)TH_H2L_dmc);
\r
308 PHY_SetBBReg(pAdapter, rFPGA0_XB_LSSIReadBack, 0xFFFF, ((u8)TH_H2L_dmc<<8) | (u8)TH_L2H_dmc);*/
\r
312 #endif /* CONFIG_DM_ADAPTIVITY */
\r