1 /******************************************************************************
3 * Copyright(c) 2007 - 2011 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 ******************************************************************************/
21 #include "mp_precomp.h"
22 #include "phydm_precomp.h"
24 #define CALCULATE_SWINGTALBE_OFFSET(_offset, _direction, _size, _delta_thermal) \
26 for (_offset = 0; _offset < _size; _offset++) { \
28 if (_delta_thermal < thermal_threshold[_direction][_offset]) { \
35 if (_offset >= _size)\
39 void configure_txpower_track(
40 struct PHY_DM_STRUCT *p_dm_odm,
41 struct _TXPWRTRACK_CFG *p_config
45 if (p_dm_odm->support_ic_type == ODM_RTL8192E)
46 configure_txpower_track_8192e(p_config);
49 if (p_dm_odm->support_ic_type == ODM_RTL8821)
50 configure_txpower_track_8821a(p_config);
53 if (p_dm_odm->support_ic_type == ODM_RTL8812)
54 configure_txpower_track_8812a(p_config);
57 if (p_dm_odm->support_ic_type == ODM_RTL8188E)
58 configure_txpower_track_8188e(p_config);
62 if (p_dm_odm->support_ic_type == ODM_RTL8188F)
63 configure_txpower_track_8188f(p_config);
67 if (p_dm_odm->support_ic_type == ODM_RTL8723B)
68 configure_txpower_track_8723b(p_config);
72 if (p_dm_odm->support_ic_type == ODM_RTL8814A)
73 configure_txpower_track_8814a(p_config);
77 if (p_dm_odm->support_ic_type == ODM_RTL8703B)
78 configure_txpower_track_8703b(p_config);
82 if (p_dm_odm->support_ic_type == ODM_RTL8822B)
83 configure_txpower_track_8822b(p_config);
87 if (p_dm_odm->support_ic_type == ODM_RTL8723D)
88 configure_txpower_track_8723d(p_config);
93 if (p_dm_odm->support_ic_type == ODM_RTL8710B)
94 configure_txpower_track_8710b(p_config);
98 if (p_dm_odm->support_ic_type == ODM_RTL8821C)
99 configure_txpower_track_8821c(p_config);
104 /* **********************************************************************
105 * <20121113, Kordan> This function should be called when tx_agc changed.
106 * Otherwise the previous compensation is gone, because we record the
107 * delta of temperature between two TxPowerTracking watch dogs.
109 * NOTE: If Tx BB swing or Tx scaling is varified during run-time, still
110 * need to call this function.
111 * ********************************************************************** */
113 odm_clear_txpowertracking_state(
114 struct PHY_DM_STRUCT *p_dm_odm
117 PHAL_DATA_TYPE p_hal_data = GET_HAL_DATA(p_dm_odm->adapter);
119 struct odm_rf_calibration_structure *p_rf_calibrate_info = &(p_dm_odm->rf_calibrate_info);
121 p_rf_calibrate_info->bb_swing_idx_cck_base = p_rf_calibrate_info->default_cck_index;
122 p_rf_calibrate_info->bb_swing_idx_cck = p_rf_calibrate_info->default_cck_index;
123 p_rf_calibrate_info->CCK_index = 0;
125 for (p = ODM_RF_PATH_A; p < MAX_RF_PATH; ++p) {
126 p_rf_calibrate_info->bb_swing_idx_ofdm_base[p] = p_rf_calibrate_info->default_ofdm_index;
127 p_rf_calibrate_info->bb_swing_idx_ofdm[p] = p_rf_calibrate_info->default_ofdm_index;
128 p_rf_calibrate_info->OFDM_index[p] = p_rf_calibrate_info->default_ofdm_index;
130 p_rf_calibrate_info->power_index_offset[p] = 0;
131 p_rf_calibrate_info->delta_power_index[p] = 0;
132 p_rf_calibrate_info->delta_power_index_last[p] = 0;
134 p_rf_calibrate_info->absolute_ofdm_swing_idx[p] = 0; /* Initial Mix mode power tracking*/
135 p_rf_calibrate_info->remnant_ofdm_swing_idx[p] = 0;
136 p_rf_calibrate_info->kfree_offset[p] = 0;
139 p_rf_calibrate_info->modify_tx_agc_flag_path_a = false; /*Initial at Modify Tx Scaling mode*/
140 p_rf_calibrate_info->modify_tx_agc_flag_path_b = false; /*Initial at Modify Tx Scaling mode*/
141 p_rf_calibrate_info->modify_tx_agc_flag_path_c = false; /*Initial at Modify Tx Scaling mode*/
142 p_rf_calibrate_info->modify_tx_agc_flag_path_d = false; /*Initial at Modify Tx Scaling mode*/
143 p_rf_calibrate_info->remnant_cck_swing_idx = 0;
144 p_rf_calibrate_info->thermal_value = p_hal_data->eeprom_thermal_meter;
146 p_rf_calibrate_info->modify_tx_agc_value_cck = 0; /* modify by Mingzhi.Guo */
147 p_rf_calibrate_info->modify_tx_agc_value_ofdm = 0; /* modify by Mingzhi.Guo */
152 odm_txpowertracking_callback_thermal_meter(
153 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
154 struct PHY_DM_STRUCT *p_dm_odm
156 struct _ADAPTER *adapter
160 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
161 HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(adapter);
162 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
163 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->DM_OutSrc;
164 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
165 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->odmpriv;
169 struct odm_rf_calibration_structure *p_rf_calibrate_info = &(p_dm_odm->rf_calibrate_info);
171 u8 thermal_value = 0, delta, delta_LCK, delta_IQK, p = 0, i = 0;
172 s8 diff_DPK[4] = {0};
173 u8 thermal_value_avg_count = 0;
174 u32 thermal_value_avg = 0, regc80, regcd0, regcd4, regab4;
176 u8 OFDM_min_index = 0; /* OFDM BB Swing should be less than +3.0dB, which is required by Arthur */
177 u8 indexforchannel = 0; /* get_right_chnl_place_for_iqk(p_hal_data->current_channel) */
178 u8 power_tracking_type = p_hal_data->RfPowerTrackingType;
179 u8 xtal_offset_eanble = 0;
181 struct _TXPWRTRACK_CFG c;
183 /* 4 1. The following TWO tables decide the final index of OFDM/CCK swing table. */
184 u8 *delta_swing_table_idx_tup_a = NULL;
185 u8 *delta_swing_table_idx_tdown_a = NULL;
186 u8 *delta_swing_table_idx_tup_b = NULL;
187 u8 *delta_swing_table_idx_tdown_b = NULL;
188 /*for 8814 add by Yu Chen*/
189 u8 *delta_swing_table_idx_tup_c = NULL;
190 u8 *delta_swing_table_idx_tdown_c = NULL;
191 u8 *delta_swing_table_idx_tup_d = NULL;
192 u8 *delta_swing_table_idx_tdown_d = NULL;
193 /*for Xtal Offset by James.Tung*/
194 s8 *delta_swing_table_xtal_up = NULL;
195 s8 *delta_swing_table_xtal_down = NULL;
197 /* 4 2. Initilization ( 7 steps in total ) */
199 configure_txpower_track(p_dm_odm, &c);
201 (*c.get_delta_swing_table)(p_dm_odm, (u8 **)&delta_swing_table_idx_tup_a, (u8 **)&delta_swing_table_idx_tdown_a,
202 (u8 **)&delta_swing_table_idx_tup_b, (u8 **)&delta_swing_table_idx_tdown_b);
204 if (p_dm_odm->support_ic_type & ODM_RTL8814A) /*for 8814 path C & D*/
205 (*c.get_delta_swing_table8814only)(p_dm_odm, (u8 **)&delta_swing_table_idx_tup_c, (u8 **)&delta_swing_table_idx_tdown_c,
206 (u8 **)&delta_swing_table_idx_tup_d, (u8 **)&delta_swing_table_idx_tdown_d);
207 /* JJ ADD 20161014 */
208 if (p_dm_odm->support_ic_type & (ODM_RTL8703B | ODM_RTL8723D | ODM_RTL8710B)) /*for Xtal Offset*/
209 (*c.get_delta_swing_xtal_table)(p_dm_odm, (s8 **)&delta_swing_table_xtal_up, (s8 **)&delta_swing_table_xtal_down);
212 p_rf_calibrate_info->txpowertracking_callback_cnt++; /*cosa add for debug*/
213 p_rf_calibrate_info->is_txpowertracking_init = true;
215 /*p_rf_calibrate_info->txpowertrack_control = p_hal_data->txpowertrack_control;
216 <Kordan> We should keep updating the control variable according to HalData.
217 <Kordan> rf_calibrate_info.rega24 will be initialized when ODM HW configuring, but MP configures with para files. */
218 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
220 p_rf_calibrate_info->rega24 = 0x090e1317;
222 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
223 if (p_dm_odm->mp_mode == true)
224 p_rf_calibrate_info->rega24 = 0x090e1317;
227 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
228 ("===>odm_txpowertracking_callback_thermal_meter\n p_rf_calibrate_info->bb_swing_idx_cck_base: %d, p_rf_calibrate_info->bb_swing_idx_ofdm_base[A]: %d, p_rf_calibrate_info->default_ofdm_index: %d\n",
229 p_rf_calibrate_info->bb_swing_idx_cck_base, p_rf_calibrate_info->bb_swing_idx_ofdm_base[ODM_RF_PATH_A], p_rf_calibrate_info->default_ofdm_index));
231 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
232 ("p_rf_calibrate_info->txpowertrack_control=%d, p_hal_data->eeprom_thermal_meter %d\n", p_rf_calibrate_info->txpowertrack_control, p_hal_data->eeprom_thermal_meter));
233 thermal_value = (u8)odm_get_rf_reg(p_dm_odm, ODM_RF_PATH_A, c.thermal_reg_addr, 0xfc00); /* 0x42: RF Reg[15:10] 88E */
235 /*add log by zhao he, check c80/c94/c14/ca0 value*/
236 if (p_dm_odm->support_ic_type == ODM_RTL8723D) {
237 regc80 = odm_get_bb_reg(p_dm_odm, 0xc80, MASKDWORD);
238 regcd0 = odm_get_bb_reg(p_dm_odm, 0xcd0, MASKDWORD);
239 regcd4 = odm_get_bb_reg(p_dm_odm, 0xcd4, MASKDWORD);
240 regab4 = odm_get_bb_reg(p_dm_odm, 0xab4, 0x000007FF);
241 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xc80 = 0x%x 0xcd0 = 0x%x 0xcd4 = 0x%x 0xab4 = 0x%x\n", regc80, regcd0, regcd4, regab4));
244 /* JJ ADD 20161014 */
245 if (p_dm_odm->support_ic_type == ODM_RTL8710B) {
246 regc80 = odm_get_bb_reg(p_dm_odm, 0xc80, MASKDWORD);
247 regcd0 = odm_get_bb_reg(p_dm_odm, 0xcd0, MASKDWORD);
248 regcd4 = odm_get_bb_reg(p_dm_odm, 0xcd4, MASKDWORD);
249 regab4 = odm_get_bb_reg(p_dm_odm, 0xab4, 0x000007FF);
250 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xc80 = 0x%x 0xcd0 = 0x%x 0xcd4 = 0x%x 0xab4 = 0x%x\n", regc80, regcd0, regcd4, regab4));
253 if (!p_rf_calibrate_info->txpowertrack_control)
257 /*4 3. Initialize ThermalValues of rf_calibrate_info*/
259 if (p_rf_calibrate_info->is_reloadtxpowerindex)
260 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("reload ofdm index for band switch\n"));
262 /*4 4. Calculate average thermal meter*/
264 p_rf_calibrate_info->thermal_value_avg[p_rf_calibrate_info->thermal_value_avg_index] = thermal_value;
265 p_rf_calibrate_info->thermal_value_avg_index++;
266 if (p_rf_calibrate_info->thermal_value_avg_index == c.average_thermal_num) /*Average times = c.average_thermal_num*/
267 p_rf_calibrate_info->thermal_value_avg_index = 0;
269 for (i = 0; i < c.average_thermal_num; i++) {
270 if (p_rf_calibrate_info->thermal_value_avg[i]) {
271 thermal_value_avg += p_rf_calibrate_info->thermal_value_avg[i];
272 thermal_value_avg_count++;
276 if (thermal_value_avg_count) { /* Calculate Average thermal_value after average enough times */
277 thermal_value = (u8)(thermal_value_avg / thermal_value_avg_count);
278 p_rf_calibrate_info->thermal_value_delta = thermal_value - p_hal_data->eeprom_thermal_meter;
279 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
280 ("AVG Thermal Meter = 0x%X, EFUSE Thermal base = 0x%X\n", thermal_value, p_hal_data->eeprom_thermal_meter));
283 /* 4 5. Calculate delta, delta_LCK, delta_IQK. */
285 /* "delta" here is used to determine whether thermal value changes or not. */
286 delta = (thermal_value > p_rf_calibrate_info->thermal_value) ? (thermal_value - p_rf_calibrate_info->thermal_value) : (p_rf_calibrate_info->thermal_value - thermal_value);
287 delta_LCK = (thermal_value > p_rf_calibrate_info->thermal_value_lck) ? (thermal_value - p_rf_calibrate_info->thermal_value_lck) : (p_rf_calibrate_info->thermal_value_lck - thermal_value);
288 delta_IQK = (thermal_value > p_rf_calibrate_info->thermal_value_iqk) ? (thermal_value - p_rf_calibrate_info->thermal_value_iqk) : (p_rf_calibrate_info->thermal_value_iqk - thermal_value);
290 if (p_rf_calibrate_info->thermal_value_iqk == 0xff) { /*no PG, use thermal value for IQK*/
291 p_rf_calibrate_info->thermal_value_iqk = thermal_value;
292 delta_IQK = (thermal_value > p_rf_calibrate_info->thermal_value_iqk) ? (thermal_value - p_rf_calibrate_info->thermal_value_iqk) : (p_rf_calibrate_info->thermal_value_iqk - thermal_value);
293 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("no PG, use thermal_value for IQK\n"));
296 for (p = ODM_RF_PATH_A; p < c.rf_path_count; p++)
297 diff_DPK[p] = (s8)thermal_value - (s8)p_rf_calibrate_info->dpk_thermal[p];
299 /*4 6. If necessary, do LCK.*/
301 if (!(p_dm_odm->support_ic_type & ODM_RTL8821)) { /*no PG, do LCK at initial status*/
302 if (p_rf_calibrate_info->thermal_value_lck == 0xff) {
303 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("no PG, do LCK\n"));
304 p_rf_calibrate_info->thermal_value_lck = thermal_value;
306 /*Use RTLCK, so close power tracking driver LCK*/
307 if (!(p_dm_odm->support_ic_type & ODM_RTL8814A)) {
308 if (c.phy_lc_calibrate)
309 (*c.phy_lc_calibrate)(p_dm_odm);
312 delta_LCK = (thermal_value > p_rf_calibrate_info->thermal_value_lck) ? (thermal_value - p_rf_calibrate_info->thermal_value_lck) : (p_rf_calibrate_info->thermal_value_lck - thermal_value);
315 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("(delta, delta_LCK, delta_IQK) = (%d, %d, %d)\n", delta, delta_LCK, delta_IQK));
317 /* Delta temperature is equal to or larger than 20 centigrade.*/
318 if (delta_LCK >= c.threshold_iqk) {
319 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("delta_LCK(%d) >= threshold_iqk(%d)\n", delta_LCK, c.threshold_iqk));
320 p_rf_calibrate_info->thermal_value_lck = thermal_value;
322 /*Use RTLCK, so close power tracking driver LCK*/
323 if (!(p_dm_odm->support_ic_type & ODM_RTL8814A)) {
324 if (c.phy_lc_calibrate)
325 (*c.phy_lc_calibrate)(p_dm_odm);
330 /*3 7. If necessary, move the index of swing table to adjust Tx power.*/
332 if (delta > 0 && p_rf_calibrate_info->txpowertrack_control) {
333 /* "delta" here is used to record the absolute value of differrence. */
334 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
335 delta = thermal_value > p_hal_data->eeprom_thermal_meter ? (thermal_value - p_hal_data->eeprom_thermal_meter) : (p_hal_data->eeprom_thermal_meter - thermal_value);
337 delta = (thermal_value > p_dm_odm->priv->pmib->dot11RFEntry.ther) ? (thermal_value - p_dm_odm->priv->pmib->dot11RFEntry.ther) : (p_dm_odm->priv->pmib->dot11RFEntry.ther - thermal_value);
339 if (delta >= TXPWR_TRACK_TABLE_SIZE)
340 delta = TXPWR_TRACK_TABLE_SIZE - 1;
342 /*4 7.1 The Final Power index = BaseIndex + power_index_offset*/
344 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
345 if (thermal_value > p_hal_data->eeprom_thermal_meter) {
347 if (thermal_value > p_dm_odm->priv->pmib->dot11RFEntry.ther) {
350 for (p = ODM_RF_PATH_A; p < c.rf_path_count; p++) {
351 p_rf_calibrate_info->delta_power_index_last[p] = p_rf_calibrate_info->delta_power_index[p]; /*recording poer index offset*/
354 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
355 ("delta_swing_table_idx_tup_b[%d] = %d\n", delta, delta_swing_table_idx_tup_b[delta]));
357 p_rf_calibrate_info->delta_power_index[p] = delta_swing_table_idx_tup_b[delta];
358 p_rf_calibrate_info->absolute_ofdm_swing_idx[p] = delta_swing_table_idx_tup_b[delta]; /*Record delta swing for mix mode power tracking*/
359 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
360 ("******Temp is higher and p_rf_calibrate_info->absolute_ofdm_swing_idx[ODM_RF_PATH_B] = %d\n", p_rf_calibrate_info->absolute_ofdm_swing_idx[p]));
364 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
365 ("delta_swing_table_idx_tup_c[%d] = %d\n", delta, delta_swing_table_idx_tup_c[delta]));
367 p_rf_calibrate_info->delta_power_index[p] = delta_swing_table_idx_tup_c[delta];
368 p_rf_calibrate_info->absolute_ofdm_swing_idx[p] = delta_swing_table_idx_tup_c[delta]; /*Record delta swing for mix mode power tracking*/
369 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
370 ("******Temp is higher and p_rf_calibrate_info->absolute_ofdm_swing_idx[ODM_RF_PATH_C] = %d\n", p_rf_calibrate_info->absolute_ofdm_swing_idx[p]));
374 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
375 ("delta_swing_table_idx_tup_d[%d] = %d\n", delta, delta_swing_table_idx_tup_d[delta]));
377 p_rf_calibrate_info->delta_power_index[p] = delta_swing_table_idx_tup_d[delta];
378 p_rf_calibrate_info->absolute_ofdm_swing_idx[p] = delta_swing_table_idx_tup_d[delta]; /*Record delta swing for mix mode power tracking*/
379 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
380 ("******Temp is higher and p_rf_calibrate_info->absolute_ofdm_swing_idx[ODM_RF_PATH_D] = %d\n", p_rf_calibrate_info->absolute_ofdm_swing_idx[p]));
384 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
385 ("delta_swing_table_idx_tup_a[%d] = %d\n", delta, delta_swing_table_idx_tup_a[delta]));
387 p_rf_calibrate_info->delta_power_index[p] = delta_swing_table_idx_tup_a[delta];
388 p_rf_calibrate_info->absolute_ofdm_swing_idx[p] = delta_swing_table_idx_tup_a[delta]; /*Record delta swing for mix mode power tracking*/
389 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
390 ("******Temp is higher and p_rf_calibrate_info->absolute_ofdm_swing_idx[ODM_RF_PATH_A] = %d\n", p_rf_calibrate_info->absolute_ofdm_swing_idx[p]));
394 /* JJ ADD 20161014 */
395 if (p_dm_odm->support_ic_type & (ODM_RTL8703B | ODM_RTL8723D | ODM_RTL8710B)) {
396 /*Save xtal_offset from Xtal table*/
397 p_rf_calibrate_info->xtal_offset_last = p_rf_calibrate_info->xtal_offset; /*recording last Xtal offset*/
398 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
399 ("[Xtal] delta_swing_table_xtal_up[%d] = %d\n", delta, delta_swing_table_xtal_up[delta]));
400 p_rf_calibrate_info->xtal_offset = delta_swing_table_xtal_up[delta];
402 if (p_rf_calibrate_info->xtal_offset_last == p_rf_calibrate_info->xtal_offset)
403 xtal_offset_eanble = 0;
405 xtal_offset_eanble = 1;
409 for (p = ODM_RF_PATH_A; p < c.rf_path_count; p++) {
410 p_rf_calibrate_info->delta_power_index_last[p] = p_rf_calibrate_info->delta_power_index[p]; /*recording poer index offset*/
414 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
415 ("delta_swing_table_idx_tdown_b[%d] = %d\n", delta, delta_swing_table_idx_tdown_b[delta]));
416 p_rf_calibrate_info->delta_power_index[p] = -1 * delta_swing_table_idx_tdown_b[delta];
417 p_rf_calibrate_info->absolute_ofdm_swing_idx[p] = -1 * delta_swing_table_idx_tdown_b[delta]; /*Record delta swing for mix mode power tracking*/
418 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
419 ("******Temp is lower and p_rf_calibrate_info->absolute_ofdm_swing_idx[ODM_RF_PATH_B] = %d\n", p_rf_calibrate_info->absolute_ofdm_swing_idx[p]));
423 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
424 ("delta_swing_table_idx_tdown_c[%d] = %d\n", delta, delta_swing_table_idx_tdown_c[delta]));
425 p_rf_calibrate_info->delta_power_index[p] = -1 * delta_swing_table_idx_tdown_c[delta];
426 p_rf_calibrate_info->absolute_ofdm_swing_idx[p] = -1 * delta_swing_table_idx_tdown_c[delta]; /*Record delta swing for mix mode power tracking*/
427 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
428 ("******Temp is lower and p_rf_calibrate_info->absolute_ofdm_swing_idx[ODM_RF_PATH_C] = %d\n", p_rf_calibrate_info->absolute_ofdm_swing_idx[p]));
432 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
433 ("delta_swing_table_idx_tdown_d[%d] = %d\n", delta, delta_swing_table_idx_tdown_d[delta]));
434 p_rf_calibrate_info->delta_power_index[p] = -1 * delta_swing_table_idx_tdown_d[delta];
435 p_rf_calibrate_info->absolute_ofdm_swing_idx[p] = -1 * delta_swing_table_idx_tdown_d[delta]; /*Record delta swing for mix mode power tracking*/
436 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
437 ("******Temp is lower and p_rf_calibrate_info->absolute_ofdm_swing_idx[ODM_RF_PATH_D] = %d\n", p_rf_calibrate_info->absolute_ofdm_swing_idx[p]));
441 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
442 ("delta_swing_table_idx_tdown_a[%d] = %d\n", delta, delta_swing_table_idx_tdown_a[delta]));
443 p_rf_calibrate_info->delta_power_index[p] = -1 * delta_swing_table_idx_tdown_a[delta];
444 p_rf_calibrate_info->absolute_ofdm_swing_idx[p] = -1 * delta_swing_table_idx_tdown_a[delta]; /*Record delta swing for mix mode power tracking*/
445 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
446 ("******Temp is lower and p_rf_calibrate_info->absolute_ofdm_swing_idx[ODM_RF_PATH_A] = %d\n", p_rf_calibrate_info->absolute_ofdm_swing_idx[p]));
450 /* JJ ADD 20161014 */
451 if (p_dm_odm->support_ic_type & (ODM_RTL8703B | ODM_RTL8723D | ODM_RTL8710B)) {
452 /*Save xtal_offset from Xtal table*/
453 p_rf_calibrate_info->xtal_offset_last = p_rf_calibrate_info->xtal_offset; /*recording last Xtal offset*/
454 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
455 ("[Xtal] delta_swing_table_xtal_down[%d] = %d\n", delta, delta_swing_table_xtal_down[delta]));
456 p_rf_calibrate_info->xtal_offset = delta_swing_table_xtal_down[delta];
458 if (p_rf_calibrate_info->xtal_offset_last == p_rf_calibrate_info->xtal_offset)
459 xtal_offset_eanble = 0;
461 xtal_offset_eanble = 1;
466 for (p = ODM_RF_PATH_A; p < c.rf_path_count; p++) {
467 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
468 ("\n\n=========================== [path-%d] Calculating power_index_offset===========================\n", p));
470 if (p_rf_calibrate_info->delta_power_index[p] == p_rf_calibrate_info->delta_power_index_last[p]) /*If Thermal value changes but lookup table value still the same*/
471 p_rf_calibrate_info->power_index_offset[p] = 0;
473 p_rf_calibrate_info->power_index_offset[p] = p_rf_calibrate_info->delta_power_index[p] - p_rf_calibrate_info->delta_power_index_last[p]; /*Power index diff between 2 times Power Tracking*/
475 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
476 ("[path-%d] power_index_offset(%d) = delta_power_index(%d) - delta_power_index_last(%d)\n", p, p_rf_calibrate_info->power_index_offset[p], p_rf_calibrate_info->delta_power_index[p], p_rf_calibrate_info->delta_power_index_last[p]));
478 p_rf_calibrate_info->OFDM_index[p] = p_rf_calibrate_info->bb_swing_idx_ofdm_base[p] + p_rf_calibrate_info->power_index_offset[p];
479 p_rf_calibrate_info->CCK_index = p_rf_calibrate_info->bb_swing_idx_cck_base + p_rf_calibrate_info->power_index_offset[p];
481 p_rf_calibrate_info->bb_swing_idx_cck = p_rf_calibrate_info->CCK_index;
482 p_rf_calibrate_info->bb_swing_idx_ofdm[p] = p_rf_calibrate_info->OFDM_index[p];
484 /*************Print BB Swing base and index Offset*************/
486 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
487 ("The 'CCK' final index(%d) = BaseIndex(%d) + power_index_offset(%d)\n", p_rf_calibrate_info->bb_swing_idx_cck, p_rf_calibrate_info->bb_swing_idx_cck_base, p_rf_calibrate_info->power_index_offset[p]));
488 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
489 ("The 'OFDM' final index(%d) = BaseIndex[%d](%d) + power_index_offset(%d)\n", p_rf_calibrate_info->bb_swing_idx_ofdm[p], p, p_rf_calibrate_info->bb_swing_idx_ofdm_base[p], p_rf_calibrate_info->power_index_offset[p]));
491 /*4 7.1 Handle boundary conditions of index.*/
493 if (p_rf_calibrate_info->OFDM_index[p] > c.swing_table_size_ofdm - 1)
494 p_rf_calibrate_info->OFDM_index[p] = c.swing_table_size_ofdm - 1;
495 else if (p_rf_calibrate_info->OFDM_index[p] <= OFDM_min_index)
496 p_rf_calibrate_info->OFDM_index[p] = OFDM_min_index;
499 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
500 ("\n\n========================================================================================================\n"));
502 if (p_rf_calibrate_info->CCK_index > c.swing_table_size_cck - 1)
503 p_rf_calibrate_info->CCK_index = c.swing_table_size_cck - 1;
504 else if (p_rf_calibrate_info->CCK_index <= 0)
505 p_rf_calibrate_info->CCK_index = 0;
507 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
508 ("The thermal meter is unchanged or TxPowerTracking OFF(%d): thermal_value: %d, p_rf_calibrate_info->thermal_value: %d\n",
509 p_rf_calibrate_info->txpowertrack_control, thermal_value, p_rf_calibrate_info->thermal_value));
511 for (p = ODM_RF_PATH_A; p < c.rf_path_count; p++)
512 p_rf_calibrate_info->power_index_offset[p] = 0;
515 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
516 ("TxPowerTracking: [CCK] Swing Current index: %d, Swing base index: %d\n",
517 p_rf_calibrate_info->CCK_index, p_rf_calibrate_info->bb_swing_idx_cck_base)); /*Print Swing base & current*/
519 for (p = ODM_RF_PATH_A; p < c.rf_path_count; p++) {
520 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
521 ("TxPowerTracking: [OFDM] Swing Current index: %d, Swing base index[%d]: %d\n",
522 p_rf_calibrate_info->OFDM_index[p], p, p_rf_calibrate_info->bb_swing_idx_ofdm_base[p]));
525 if ((p_dm_odm->support_ic_type & ODM_RTL8814A)) {
526 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("power_tracking_type=%d\n", power_tracking_type));
528 if (power_tracking_type == 0) {
529 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking MIX_MODE**********\n"));
530 for (p = ODM_RF_PATH_A; p < c.rf_path_count; p++)
531 (*c.odm_tx_pwr_track_set_pwr)(p_dm_odm, MIX_MODE, p, 0);
532 } else if (power_tracking_type == 1) {
533 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking MIX(2G) TSSI(5G) MODE**********\n"));
534 for (p = ODM_RF_PATH_A; p < c.rf_path_count; p++)
535 (*c.odm_tx_pwr_track_set_pwr)(p_dm_odm, MIX_2G_TSSI_5G_MODE, p, 0);
536 } else if (power_tracking_type == 2) {
537 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking MIX(5G) TSSI(2G)MODE**********\n"));
538 for (p = ODM_RF_PATH_A; p < c.rf_path_count; p++)
539 (*c.odm_tx_pwr_track_set_pwr)(p_dm_odm, MIX_5G_TSSI_2G_MODE, p, 0);
540 } else if (power_tracking_type == 3) {
541 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking TSSI MODE**********\n"));
542 for (p = ODM_RF_PATH_A; p < c.rf_path_count; p++)
543 (*c.odm_tx_pwr_track_set_pwr)(p_dm_odm, TSSI_MODE, p, 0);
545 p_rf_calibrate_info->thermal_value = thermal_value; /*Record last Power Tracking Thermal value*/
547 } else if ((p_rf_calibrate_info->power_index_offset[ODM_RF_PATH_A] != 0 ||
548 p_rf_calibrate_info->power_index_offset[ODM_RF_PATH_B] != 0 ||
549 p_rf_calibrate_info->power_index_offset[ODM_RF_PATH_C] != 0 ||
550 p_rf_calibrate_info->power_index_offset[ODM_RF_PATH_D] != 0) &&
551 p_rf_calibrate_info->txpowertrack_control && (p_hal_data->eeprom_thermal_meter != 0xff)) {
552 /* 4 7.2 Configure the Swing Table to adjust Tx Power. */
554 p_rf_calibrate_info->is_tx_power_changed = true; /*Always true after Tx Power is adjusted by power tracking.*/
556 /* 2012/04/23 MH According to Luke's suggestion, we can not write BB digital */
557 /* to increase TX power. Otherwise, EVM will be bad. */
559 /* 2012/04/25 MH Add for tx power tracking to set tx power in tx agc for 88E. */
560 if (thermal_value > p_rf_calibrate_info->thermal_value) {
561 for (p = ODM_RF_PATH_A; p < c.rf_path_count; p++) {
562 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
563 ("Temperature Increasing(%d): delta_pi: %d, delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
564 p, p_rf_calibrate_info->power_index_offset[p], delta, thermal_value, p_hal_data->eeprom_thermal_meter, p_rf_calibrate_info->thermal_value));
566 } else if (thermal_value < p_rf_calibrate_info->thermal_value) { /*Low temperature*/
567 for (p = ODM_RF_PATH_A; p < c.rf_path_count; p++) {
568 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
569 ("Temperature Decreasing(%d): delta_pi: %d, delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
570 p, p_rf_calibrate_info->power_index_offset[p], delta, thermal_value, p_hal_data->eeprom_thermal_meter, p_rf_calibrate_info->thermal_value));
574 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
575 if (thermal_value > p_hal_data->eeprom_thermal_meter)
577 if (thermal_value > p_dm_odm->priv->pmib->dot11RFEntry.ther)
580 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
581 ("Temperature(%d) higher than PG value(%d)\n", thermal_value, p_hal_data->eeprom_thermal_meter));
583 if (p_dm_odm->support_ic_type == ODM_RTL8188E || p_dm_odm->support_ic_type == ODM_RTL8192E || p_dm_odm->support_ic_type == ODM_RTL8821 ||
584 p_dm_odm->support_ic_type == ODM_RTL8812 || p_dm_odm->support_ic_type == ODM_RTL8723B || p_dm_odm->support_ic_type == ODM_RTL8814A ||
585 p_dm_odm->support_ic_type == ODM_RTL8703B || p_dm_odm->support_ic_type == ODM_RTL8188F || p_dm_odm->support_ic_type == ODM_RTL8822B ||
586 p_dm_odm->support_ic_type == ODM_RTL8723D || p_dm_odm->support_ic_type == ODM_RTL8821C || p_dm_odm->support_ic_type == ODM_RTL8710B) {/* JJ ADD 20161014 */
588 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking MIX_MODE**********\n"));
589 for (p = ODM_RF_PATH_A; p < c.rf_path_count; p++)
590 (*c.odm_tx_pwr_track_set_pwr)(p_dm_odm, MIX_MODE, p, 0);
592 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking BBSWING_MODE**********\n"));
593 for (p = ODM_RF_PATH_A; p < c.rf_path_count; p++)
594 (*c.odm_tx_pwr_track_set_pwr)(p_dm_odm, BBSWING, p, indexforchannel);
597 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
598 ("Temperature(%d) lower than PG value(%d)\n", thermal_value, p_hal_data->eeprom_thermal_meter));
600 if (p_dm_odm->support_ic_type == ODM_RTL8188E || p_dm_odm->support_ic_type == ODM_RTL8192E || p_dm_odm->support_ic_type == ODM_RTL8821 ||
601 p_dm_odm->support_ic_type == ODM_RTL8812 || p_dm_odm->support_ic_type == ODM_RTL8723B || p_dm_odm->support_ic_type == ODM_RTL8814A ||
602 p_dm_odm->support_ic_type == ODM_RTL8703B || p_dm_odm->support_ic_type == ODM_RTL8188F || p_dm_odm->support_ic_type == ODM_RTL8822B ||
603 p_dm_odm->support_ic_type == ODM_RTL8723D || p_dm_odm->support_ic_type == ODM_RTL8821C || p_dm_odm->support_ic_type == ODM_RTL8710B) {/* JJ ADD 20161014 */
605 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking MIX_MODE**********\n"));
606 for (p = ODM_RF_PATH_A; p < c.rf_path_count; p++)
607 (*c.odm_tx_pwr_track_set_pwr)(p_dm_odm, MIX_MODE, p, indexforchannel);
609 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking BBSWING_MODE**********\n"));
610 for (p = ODM_RF_PATH_A; p < c.rf_path_count; p++)
611 (*c.odm_tx_pwr_track_set_pwr)(p_dm_odm, BBSWING, p, indexforchannel);
616 p_rf_calibrate_info->bb_swing_idx_cck_base = p_rf_calibrate_info->bb_swing_idx_cck; /*Record last time Power Tracking result as base.*/
617 for (p = ODM_RF_PATH_A; p < c.rf_path_count; p++)
618 p_rf_calibrate_info->bb_swing_idx_ofdm_base[p] = p_rf_calibrate_info->bb_swing_idx_ofdm[p];
620 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
621 ("p_rf_calibrate_info->thermal_value = %d thermal_value= %d\n", p_rf_calibrate_info->thermal_value, thermal_value));
623 p_rf_calibrate_info->thermal_value = thermal_value; /*Record last Power Tracking Thermal value*/
628 if (p_dm_odm->support_ic_type == ODM_RTL8703B || p_dm_odm->support_ic_type == ODM_RTL8723D || p_dm_odm->support_ic_type == ODM_RTL8723D) {/* JJ ADD 20161014 */
630 if (xtal_offset_eanble != 0 && p_rf_calibrate_info->txpowertrack_control && (p_hal_data->eeprom_thermal_meter != 0xff)) {
632 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter Xtal Tracking**********\n"));
634 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
635 if (thermal_value > p_hal_data->eeprom_thermal_meter) {
637 if (thermal_value > p_dm_odm->priv->pmib->dot11RFEntry.ther) {
639 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
640 ("Temperature(%d) higher than PG value(%d)\n", thermal_value, p_hal_data->eeprom_thermal_meter));
641 (*c.odm_txxtaltrack_set_xtal)(p_dm_odm);
643 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
644 ("Temperature(%d) lower than PG value(%d)\n", thermal_value, p_hal_data->eeprom_thermal_meter));
645 (*c.odm_txxtaltrack_set_xtal)(p_dm_odm);
648 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********End Xtal Tracking**********\n"));
651 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
653 if (!IS_HARDWARE_TYPE_8723B(adapter)) {
654 /*Delta temperature is equal to or larger than 20 centigrade (When threshold is 8).*/
655 if (delta_IQK >= c.threshold_iqk) {
656 p_rf_calibrate_info->thermal_value_iqk = thermal_value;
657 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("delta_IQK(%d) >= threshold_iqk(%d)\n", delta_IQK, c.threshold_iqk));
658 if (!p_rf_calibrate_info->is_iqk_in_progress)
659 (*c.do_iqk)(p_dm_odm, delta_IQK, thermal_value, 8);
662 if (p_rf_calibrate_info->dpk_thermal[ODM_RF_PATH_A] != 0) {
663 if (diff_DPK[ODM_RF_PATH_A] >= c.threshold_dpk) {
664 odm_set_bb_reg(p_dm_odm, 0x82c, BIT(31), 0x1);
665 odm_set_bb_reg(p_dm_odm, 0xcc4, BIT(14) | BIT(13) | BIT(12) | BIT(11) | BIT(10), (diff_DPK[ODM_RF_PATH_A] / c.threshold_dpk));
666 odm_set_bb_reg(p_dm_odm, 0x82c, BIT(31), 0x0);
667 } else if ((diff_DPK[ODM_RF_PATH_A] <= -1 * c.threshold_dpk)) {
668 s32 value = 0x20 + (diff_DPK[ODM_RF_PATH_A] / c.threshold_dpk);
670 odm_set_bb_reg(p_dm_odm, 0x82c, BIT(31), 0x1);
671 odm_set_bb_reg(p_dm_odm, 0xcc4, BIT(14) | BIT(13) | BIT(12) | BIT(11) | BIT(10), value);
672 odm_set_bb_reg(p_dm_odm, 0x82c, BIT(31), 0x0);
674 odm_set_bb_reg(p_dm_odm, 0x82c, BIT(31), 0x1);
675 odm_set_bb_reg(p_dm_odm, 0xcc4, BIT(14) | BIT(13) | BIT(12) | BIT(11) | BIT(10), 0);
676 odm_set_bb_reg(p_dm_odm, 0x82c, BIT(31), 0x0);
679 if (p_rf_calibrate_info->dpk_thermal[ODM_RF_PATH_B] != 0) {
680 if (diff_DPK[ODM_RF_PATH_B] >= c.threshold_dpk) {
681 odm_set_bb_reg(p_dm_odm, 0x82c, BIT(31), 0x1);
682 odm_set_bb_reg(p_dm_odm, 0xec4, BIT(14) | BIT(13) | BIT(12) | BIT(11) | BIT(10), (diff_DPK[ODM_RF_PATH_B] / c.threshold_dpk));
683 odm_set_bb_reg(p_dm_odm, 0x82c, BIT(31), 0x0);
684 } else if ((diff_DPK[ODM_RF_PATH_B] <= -1 * c.threshold_dpk)) {
685 s32 value = 0x20 + (diff_DPK[ODM_RF_PATH_B] / c.threshold_dpk);
687 odm_set_bb_reg(p_dm_odm, 0x82c, BIT(31), 0x1);
688 odm_set_bb_reg(p_dm_odm, 0xec4, BIT(14) | BIT(13) | BIT(12) | BIT(11) | BIT(10), value);
689 odm_set_bb_reg(p_dm_odm, 0x82c, BIT(31), 0x0);
691 odm_set_bb_reg(p_dm_odm, 0x82c, BIT(31), 0x1);
692 odm_set_bb_reg(p_dm_odm, 0xec4, BIT(14) | BIT(13) | BIT(12) | BIT(11) | BIT(10), 0);
693 odm_set_bb_reg(p_dm_odm, 0x82c, BIT(31), 0x0);
699 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("<===odm_txpowertracking_callback_thermal_meter\n"));
701 p_rf_calibrate_info->tx_powercount = 0;
706 /* 3============================================================
708 * 3============================================================ */
711 odm_reset_iqk_result(
712 struct PHY_DM_STRUCT *p_dm_odm
717 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
718 u8 odm_get_right_chnl_place_for_iqk(u8 chnl)
720 u8 channel_all[ODM_TARGET_CHNL_NUM_2G_5G] = {
721 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 149, 151, 153, 155, 157, 159, 161, 163, 165
727 for (place = 14; place < sizeof(channel_all); place++) {
728 if (channel_all[place] == chnl)
739 struct PHY_DM_STRUCT *p_dm_odm
742 struct _ADAPTER *adapter = p_dm_odm->adapter;
743 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(adapter);
745 RT_TRACE(COMP_SCAN, ODM_DBG_LOUD, ("=>%s\n" , __FUNCTION__));
747 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
748 if (*p_dm_odm->p_is_fcs_mode_enable)
752 if (p_dm_odm->is_linked) {
753 RT_TRACE(COMP_SCAN, ODM_DBG_LOUD, ("interval=%d ch=%d prech=%d scan=%s\n", p_dm_odm->linked_interval,
754 *p_dm_odm->p_channel, p_dm_odm->pre_channel, *p_dm_odm->p_is_scan_in_process == TRUE ? "TRUE":"FALSE"));
756 if (*p_dm_odm->p_channel != p_dm_odm->pre_channel) {
757 p_dm_odm->pre_channel = *p_dm_odm->p_channel;
758 p_dm_odm->linked_interval = 0;
761 if ((p_dm_odm->linked_interval < 3) && (!*p_dm_odm->p_is_scan_in_process))
762 p_dm_odm->linked_interval++;
764 if (p_dm_odm->linked_interval == 2)
765 PHY_IQCalibrate(adapter, false);
767 p_dm_odm->linked_interval = 0;
769 RT_TRACE(COMP_SCAN, ODM_DBG_LOUD, ("<=%s interval=%d ch=%d prech=%d scan=%s\n", __FUNCTION__, p_dm_odm->linked_interval,
770 *p_dm_odm->p_channel, p_dm_odm->pre_channel, *p_dm_odm->p_is_scan_in_process == TRUE?"TRUE":"FALSE"));
773 void phydm_rf_init(struct PHY_DM_STRUCT *p_dm_odm)
776 odm_txpowertracking_init(p_dm_odm);
778 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
779 odm_clear_txpowertracking_state(p_dm_odm);
782 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
783 #if (RTL8814A_SUPPORT == 1)
784 if (p_dm_odm->support_ic_type & ODM_RTL8814A)
785 phy_iq_calibrate_8814a_init(p_dm_odm);
791 void phydm_rf_watchdog(struct PHY_DM_STRUCT *p_dm_odm)
794 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
795 odm_txpowertracking_check(p_dm_odm);
796 if (p_dm_odm->support_ic_type & ODM_IC_11AC_SERIES)
797 odm_iq_calibrate(p_dm_odm);