1 /******************************************************************************
3 * Copyright(c) 2013 Realtek Corporation. All rights reserved.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 ******************************************************************************/
24 const char *odm_comp_str[] = {
25 /* BIT0 */"ODM_COMP_DIG",
26 /* BIT1 */"ODM_COMP_RA_MASK",
27 /* BIT2 */"ODM_COMP_DYNAMIC_TXPWR",
28 /* BIT3 */"ODM_COMP_FA_CNT",
29 /* BIT4 */"ODM_COMP_RSSI_MONITOR",
30 /* BIT5 */"ODM_COMP_CCK_PD",
31 /* BIT6 */"ODM_COMP_ANT_DIV",
32 /* BIT7 */"ODM_COMP_PWR_SAVE",
33 /* BIT8 */"ODM_COMP_PWR_TRAIN",
34 /* BIT9 */"ODM_COMP_RATE_ADAPTIVE",
35 /* BIT10 */"ODM_COMP_PATH_DIV",
36 /* BIT11 */"ODM_COMP_PSD",
37 /* BIT12 */"ODM_COMP_DYNAMIC_PRICCA",
38 /* BIT13 */"ODM_COMP_RXHP",
39 /* BIT14 */"ODM_COMP_MP",
40 /* BIT15 */"ODM_COMP_CFO_TRACKING",
41 /* BIT16 */"ODM_COMP_ACS",
42 /* BIT17 */"PHYDM_COMP_ADAPTIVITY",
45 /* BIT20 */"ODM_COMP_EDCA_TURBO",
46 /* BIT21 */"ODM_COMP_EARLY_MODE",
49 /* BIT24 */"ODM_COMP_TX_PWR_TRACK",
50 /* BIT25 */"ODM_COMP_RX_GAIN_TRACK",
51 /* BIT26 */"ODM_COMP_CALIBRATION",
55 /* BIT30 */"ODM_COMP_COMMON",
56 /* BIT31 */"ODM_COMP_INIT",
59 #define RTW_ODM_COMP_MAX 32
61 const char *odm_ability_str[] = {
62 /* BIT0 */"ODM_BB_DIG",
63 /* BIT1 */"ODM_BB_RA_MASK",
64 /* BIT2 */"ODM_BB_DYNAMIC_TXPWR",
65 /* BIT3 */"ODM_BB_FA_CNT",
66 /* BIT4 */"ODM_BB_RSSI_MONITOR",
67 /* BIT5 */"ODM_BB_CCK_PD",
68 /* BIT6 */"ODM_BB_ANT_DIV",
69 /* BIT7 */"ODM_BB_PWR_SAVE",
70 /* BIT8 */"ODM_BB_PWR_TRAIN",
71 /* BIT9 */"ODM_BB_RATE_ADAPTIVE",
72 /* BIT10 */"ODM_BB_PATH_DIV",
73 /* BIT11 */"ODM_BB_PSD",
74 /* BIT12 */"ODM_BB_RXHP",
75 /* BIT13 */"ODM_BB_ADAPTIVITY",
76 /* BIT14 */"ODM_BB_CFO_TRACKING",
77 /* BIT15 */"ODM_BB_NHM_CNT",
78 /* BIT16 */"ODM_BB_PRIMARY_CCA",
82 /* BIT20 */"ODM_MAC_EDCA_TURBO",
83 /* BIT21 */"ODM_MAC_EARLY_MODE",
86 /* BIT24 */"ODM_RF_TX_PWR_TRACK",
87 /* BIT25 */"ODM_RF_RX_GAIN_TRACK",
88 /* BIT26 */"ODM_RF_CALIBRATION",
91 #define RTW_ODM_ABILITY_MAX 27
93 const char *odm_dbg_level_str[] = {
102 #define RTW_ODM_DBG_LEVEL_NUM 6
104 void rtw_odm_dbg_comp_msg(void *sel, _adapter *adapter)
106 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);
107 DM_ODM_T *odm = &pHalData->odmpriv;
112 rtw_hal_get_def_var(adapter, HW_DEF_ODM_DBG_FLAG, &dbg_comp);
113 DBG_871X_SEL_NL(sel, "odm.DebugComponents = 0x%016llx \n", dbg_comp);
114 for (i=0;i<RTW_ODM_COMP_MAX;i++) {
116 DBG_871X_SEL_NL(sel, "%cBIT%-2d %s\n",
117 (BIT0 << i) & dbg_comp ? '+' : ' ', i, odm_comp_str[i]);
121 inline void rtw_odm_dbg_comp_set(_adapter *adapter, u64 comps)
123 rtw_hal_set_def_var(adapter, HW_DEF_ODM_DBG_FLAG, &comps);
126 void rtw_odm_dbg_level_msg(void *sel, _adapter *adapter)
128 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);
129 DM_ODM_T *odm = &pHalData->odmpriv;
134 rtw_hal_get_def_var(adapter, HW_DEF_ODM_DBG_LEVEL, &dbg_level);
135 DBG_871X_SEL_NL(sel, "odm.DebugLevel = %u\n", dbg_level);
136 for (i=0;i<RTW_ODM_DBG_LEVEL_NUM;i++) {
137 if (odm_dbg_level_str[i])
138 DBG_871X_SEL_NL(sel, "%u %s\n", i, odm_dbg_level_str[i]);
142 inline void rtw_odm_dbg_level_set(_adapter *adapter, u32 level)
144 rtw_hal_set_def_var(adapter, HW_DEF_ODM_DBG_LEVEL, &level);
147 void rtw_odm_ability_msg(void *sel, _adapter *adapter)
149 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);
150 DM_ODM_T *odm = &pHalData->odmpriv;
155 rtw_hal_get_hwreg(adapter, HW_VAR_DM_FLAG, (u8*)&ability);
156 DBG_871X_SEL_NL(sel, "odm.SupportAbility = 0x%08x\n", ability);
157 for (i=0;i<RTW_ODM_ABILITY_MAX;i++) {
158 if (odm_ability_str[i])
159 DBG_871X_SEL_NL(sel, "%cBIT%-2d %s\n",
160 (BIT0 << i) & ability ? '+' : ' ', i, odm_ability_str[i]);
164 inline void rtw_odm_ability_set(_adapter *adapter, u32 ability)
166 rtw_hal_set_hwreg(adapter, HW_VAR_DM_FLAG, (u8*)&ability);
169 void rtw_odm_adaptivity_ver_msg(void *sel, _adapter *adapter)
171 DBG_871X_SEL_NL(sel, "ADAPTIVITY_VERSION "ADAPTIVITY_VERSION"\n");
174 #define RTW_ADAPTIVITY_EN_DISABLE 0
175 #define RTW_ADAPTIVITY_EN_ENABLE 1
176 #define RTW_ADAPTIVITY_EN_AUTO 2
178 void rtw_odm_adaptivity_en_msg(void *sel, _adapter *adapter)
180 struct registry_priv *regsty = &adapter->registrypriv;
181 struct mlme_priv *mlme = &adapter->mlmepriv;
182 HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
183 DM_ODM_T *odm = &hal_data->odmpriv;
185 DBG_871X_SEL_NL(sel, "RTW_ADAPTIVITY_EN_");
187 if (regsty->adaptivity_en == RTW_ADAPTIVITY_EN_DISABLE) {
188 DBG_871X_SEL(sel, "DISABLE\n");
189 } else if (regsty->adaptivity_en == RTW_ADAPTIVITY_EN_ENABLE) {
190 DBG_871X_SEL(sel, "ENABLE\n");
191 } else if (regsty->adaptivity_en == RTW_ADAPTIVITY_EN_AUTO) {
192 DBG_871X_SEL(sel, "AUTO, chplan:0x%02x, Regulation:%u,%u\n"
193 , mlme->ChannelPlan, odm->odm_Regulation2_4G, odm->odm_Regulation5G);
195 DBG_871X_SEL(sel, "INVALID\n");
199 #define RTW_ADAPTIVITY_MODE_NORMAL 0
200 #define RTW_ADAPTIVITY_MODE_CARRIER_SENSE 1
202 void rtw_odm_adaptivity_mode_msg(void *sel, _adapter *adapter)
204 struct registry_priv *regsty = &adapter->registrypriv;
206 DBG_871X_SEL_NL(sel, "RTW_ADAPTIVITY_MODE_");
208 if (regsty->adaptivity_mode == RTW_ADAPTIVITY_MODE_NORMAL) {
209 DBG_871X_SEL(sel, "NORMAL\n");
210 } else if (regsty->adaptivity_mode == RTW_ADAPTIVITY_MODE_CARRIER_SENSE) {
211 DBG_871X_SEL(sel, "CARRIER_SENSE\n");
213 DBG_871X_SEL(sel, "INVALID\n");
217 #define RTW_NHM_EN_DISABLE 0
218 #define RTW_NHM_EN_ENABLE 1
220 void rtw_odm_nhm_en_msg(void *sel, _adapter *adapter)
222 struct registry_priv *regsty = &adapter->registrypriv;
224 DBG_871X_SEL_NL(sel, "RTW_NHM_EN_");
226 if (regsty->nhm_en == RTW_NHM_EN_DISABLE) {
227 DBG_871X_SEL(sel, "DISABLE\n");
228 } else if (regsty->nhm_en == RTW_NHM_EN_ENABLE) {
229 DBG_871X_SEL(sel, "ENABLE\n");
231 DBG_871X_SEL(sel, "INVALID\n");
235 bool rtw_odm_adaptivity_needed(_adapter *adapter)
237 struct registry_priv *regsty = &adapter->registrypriv;
238 struct mlme_priv *mlme = &adapter->mlmepriv;
241 if (regsty->adaptivity_en == RTW_ADAPTIVITY_EN_ENABLE
242 || regsty->adaptivity_en == RTW_ADAPTIVITY_EN_AUTO)
246 rtw_odm_adaptivity_ver_msg(RTW_DBGDUMP, adapter);
247 rtw_odm_adaptivity_en_msg(RTW_DBGDUMP, adapter);
248 rtw_odm_adaptivity_mode_msg(RTW_DBGDUMP, adapter);
249 rtw_odm_nhm_en_msg(RTW_DBGDUMP, adapter);
255 void rtw_odm_adaptivity_parm_msg(void *sel, _adapter *adapter)
257 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);
258 DM_ODM_T *odm = &pHalData->odmpriv;
260 rtw_odm_adaptivity_ver_msg(sel, adapter);
261 rtw_odm_adaptivity_en_msg(sel, adapter);
262 rtw_odm_adaptivity_mode_msg(sel, adapter);
263 rtw_odm_nhm_en_msg(sel, adapter);
265 DBG_871X_SEL_NL(sel, "%10s %16s %8s %10s %11s %14s\n"
266 , "TH_L2H_ini", "TH_EDCCA_HL_diff", "IGI_Base", "ForceEDCCA", "AdapEn_RSSI", "IGI_LowerBound");
267 DBG_871X_SEL_NL(sel, "0x%-8x %-16d 0x%-6x %-10d %-11u %-14u\n"
268 , (u8)odm->TH_L2H_ini
269 , odm->TH_EDCCA_HL_diff
273 , odm->IGI_LowerBound
276 DBG_871X_SEL_NL(sel, "%8s %9s\n", "EDCCA_ES","Adap_Flag");
277 DBG_871X_SEL_NL(sel, "%-8x %-9x \n"
278 , odm->EDCCA_enable_state
279 , odm->adaptivity_flag
285 void rtw_odm_adaptivity_parm_set(_adapter *adapter, s8 TH_L2H_ini, s8 TH_EDCCA_HL_diff,
286 s8 IGI_Base, bool ForceEDCCA, u8 AdapEn_RSSI, u8 IGI_LowerBound)
288 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);
289 DM_ODM_T *odm = &pHalData->odmpriv;
291 odm->TH_L2H_ini = TH_L2H_ini;
292 odm->TH_EDCCA_HL_diff = TH_EDCCA_HL_diff;
293 odm->IGI_Base = IGI_Base;
294 odm->ForceEDCCA = ForceEDCCA;
295 odm->AdapEn_RSSI = AdapEn_RSSI;
296 odm->IGI_LowerBound = IGI_LowerBound;
299 void rtw_odm_get_perpkt_rssi(void *sel, _adapter *adapter)
301 HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
302 DM_ODM_T *odm = &(hal_data->odmpriv);
304 DBG_871X_SEL_NL(sel,"RxRate = %s, RSSI_A = %d(%%), RSSI_B = %d(%%)\n",
305 HDATA_RATE(odm->RxRate), odm->RSSI_A, odm->RSSI_B);
309 void rtw_odm_acquirespinlock(_adapter *adapter, RT_SPINLOCK_TYPE type)
311 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter);
312 struct dm_priv *pdmpriv = &pHalData->dmpriv;
317 case RT_IQK_SPINLOCK:
318 _enter_critical_bh(&pdmpriv->IQKSpinLock, &irqL);
324 void rtw_odm_releasespinlock(_adapter *adapter, RT_SPINLOCK_TYPE type)
326 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter);
327 struct dm_priv *pdmpriv = &pHalData->dmpriv;
332 case RT_IQK_SPINLOCK:
333 _exit_critical_bh(&pdmpriv->IQKSpinLock, &irqL);