net: wireless: rockchip_wlan: add rtl8723cs support
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723cs / hal / phydm / halphyrf_win.c
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
4  *
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.
8  *
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
12  * more details.
13  *
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
17  *
18  *
19  ******************************************************************************/
20
21 #include "mp_precomp.h"
22 #include "phydm_precomp.h"
23
24 #define CALCULATE_SWINGTALBE_OFFSET(_offset, _direction, _size, _delta_thermal) \
25         do {\
26                 for (_offset = 0; _offset < _size; _offset++) { \
27                         \
28                         if (_delta_thermal < thermal_threshold[_direction][_offset]) { \
29                                 \
30                                 if (_offset != 0)\
31                                         _offset--;\
32                                 break;\
33                         } \
34                 }                       \
35                 if (_offset >= _size)\
36                         _offset = _size-1;\
37         } while (0)
38
39 void configure_txpower_track(
40         struct PHY_DM_STRUCT            *p_dm_odm,
41         struct _TXPWRTRACK_CFG  *p_config
42 )
43 {
44 #if RTL8192E_SUPPORT
45         if (p_dm_odm->support_ic_type == ODM_RTL8192E)
46                 configure_txpower_track_8192e(p_config);
47 #endif
48 #if RTL8821A_SUPPORT
49         if (p_dm_odm->support_ic_type == ODM_RTL8821)
50                 configure_txpower_track_8821a(p_config);
51 #endif
52 #if RTL8812A_SUPPORT
53         if (p_dm_odm->support_ic_type == ODM_RTL8812)
54                 configure_txpower_track_8812a(p_config);
55 #endif
56 #if RTL8188E_SUPPORT
57         if (p_dm_odm->support_ic_type == ODM_RTL8188E)
58                 configure_txpower_track_8188e(p_config);
59 #endif
60
61 #if RTL8188F_SUPPORT
62         if (p_dm_odm->support_ic_type == ODM_RTL8188F)
63                 configure_txpower_track_8188f(p_config);
64 #endif
65
66 #if RTL8723B_SUPPORT
67         if (p_dm_odm->support_ic_type == ODM_RTL8723B)
68                 configure_txpower_track_8723b(p_config);
69 #endif
70
71 #if RTL8814A_SUPPORT
72         if (p_dm_odm->support_ic_type == ODM_RTL8814A)
73                 configure_txpower_track_8814a(p_config);
74 #endif
75
76 #if RTL8703B_SUPPORT
77         if (p_dm_odm->support_ic_type == ODM_RTL8703B)
78                 configure_txpower_track_8703b(p_config);
79 #endif
80
81 #if RTL8822B_SUPPORT
82         if (p_dm_odm->support_ic_type == ODM_RTL8822B)
83                 configure_txpower_track_8822b(p_config);
84 #endif
85
86 #if RTL8723D_SUPPORT
87         if (p_dm_odm->support_ic_type == ODM_RTL8723D)
88                 configure_txpower_track_8723d(p_config);
89 #endif
90
91 /* JJ ADD 20161014 */
92 #if RTL8710B_SUPPORT
93         if (p_dm_odm->support_ic_type == ODM_RTL8710B)
94                 configure_txpower_track_8710b(p_config);
95 #endif
96
97 #if RTL8821C_SUPPORT
98         if (p_dm_odm->support_ic_type == ODM_RTL8821C)
99                 configure_txpower_track_8821c(p_config);
100 #endif
101
102 }
103
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.
108  *
109  * NOTE: If Tx BB swing or Tx scaling is varified during run-time, still
110  * need to call this function.
111  * ********************************************************************** */
112 void
113 odm_clear_txpowertracking_state(
114         struct PHY_DM_STRUCT            *p_dm_odm
115 )
116 {
117         PHAL_DATA_TYPE  p_hal_data = GET_HAL_DATA(p_dm_odm->adapter);
118         u8                      p = 0;
119         struct odm_rf_calibration_structure     *p_rf_calibrate_info = &(p_dm_odm->rf_calibrate_info);
120
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;
124
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;
129
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;
133
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;
137         }
138
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;
145
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 */
148
149 }
150
151 void
152 odm_txpowertracking_callback_thermal_meter(
153 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
154         struct PHY_DM_STRUCT            *p_dm_odm
155 #else
156         struct _ADAPTER *adapter
157 #endif
158 )
159 {
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;
166 #endif
167 #endif
168
169         struct odm_rf_calibration_structure     *p_rf_calibrate_info = &(p_dm_odm->rf_calibrate_info);
170
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;
175
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;
180
181         struct _TXPWRTRACK_CFG  c;
182
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;
196
197         /* 4 2. Initilization ( 7 steps in total ) */
198
199         configure_txpower_track(p_dm_odm, &c);
200
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);
203
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);
210
211
212         p_rf_calibrate_info->txpowertracking_callback_cnt++;    /*cosa add for debug*/
213         p_rf_calibrate_info->is_txpowertracking_init = true;
214
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)
219 #if (MP_DRIVER == 1)
220         p_rf_calibrate_info->rega24 = 0x090e1317;
221 #endif
222 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
223         if (p_dm_odm->mp_mode == true)
224                 p_rf_calibrate_info->rega24 = 0x090e1317;
225 #endif
226
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));
230
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 */
234
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));
242         }
243
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));
251         }
252
253         if (!p_rf_calibrate_info->txpowertrack_control)
254                 return;
255
256
257         /*4 3. Initialize ThermalValues of rf_calibrate_info*/
258
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"));
261
262         /*4 4. Calculate average thermal meter*/
263
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;
268
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++;
273                 }
274         }
275
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));
281         }
282
283         /* 4 5. Calculate delta, delta_LCK, delta_IQK. */
284
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);
289
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"));
294         }
295
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];
298
299         /*4 6. If necessary, do LCK.*/
300
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;
305
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);
310                         }
311
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);
313                 }
314
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));
316
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;
321
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);
326                         }
327                 }
328         }
329
330         /*3 7. If necessary, move the index of swing table to adjust Tx power.*/
331
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);
336 #else
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);
338 #endif
339                 if (delta >= TXPWR_TRACK_TABLE_SIZE)
340                         delta = TXPWR_TRACK_TABLE_SIZE - 1;
341
342                 /*4 7.1 The Final Power index = BaseIndex + power_index_offset*/
343
344 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
345                 if (thermal_value > p_hal_data->eeprom_thermal_meter) {
346 #else
347                 if (thermal_value > p_dm_odm->priv->pmib->dot11RFEntry.ther) {
348 #endif
349
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*/
352                                 switch (p) {
353                                 case ODM_RF_PATH_B:
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]));
356
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]));
361                                         break;
362
363                                 case ODM_RF_PATH_C:
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]));
366
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]));
371                                         break;
372
373                                 case ODM_RF_PATH_D:
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]));
376
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]));
381                                         break;
382
383                                 default:
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]));
386
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]));
391                                         break;
392                                 }
393                         }
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];
401
402                                 if (p_rf_calibrate_info->xtal_offset_last == p_rf_calibrate_info->xtal_offset)
403                                         xtal_offset_eanble = 0;
404                                 else
405                                         xtal_offset_eanble = 1;
406                         }
407
408                 } else {
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*/
411
412                                 switch (p) {
413                                 case ODM_RF_PATH_B:
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]));
420                                         break;
421
422                                 case ODM_RF_PATH_C:
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]));
429                                         break;
430
431                                 case ODM_RF_PATH_D:
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]));
438                                         break;
439
440                                 default:
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]));
447                                         break;
448                                 }
449                         }
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];
457
458                                 if (p_rf_calibrate_info->xtal_offset_last == p_rf_calibrate_info->xtal_offset)
459                                         xtal_offset_eanble = 0;
460                                 else
461                                         xtal_offset_eanble = 1;
462                         }
463
464                 }
465
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));
469
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;
472                         else
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*/
474
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]));
477
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];
480
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];
483
484                         /*************Print BB Swing base and index Offset*************/
485
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]));
490
491                         /*4 7.1 Handle boundary conditions of index.*/
492
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;
497                 }
498
499                 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
500                         ("\n\n========================================================================================================\n"));
501
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;
506         } else {
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));
510
511                 for (p = ODM_RF_PATH_A; p < c.rf_path_count; p++)
512                         p_rf_calibrate_info->power_index_offset[p] = 0;
513         }
514
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*/
518
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]));
523         }
524
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));
527
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);
544                 }
545                 p_rf_calibrate_info->thermal_value = thermal_value;         /*Record last Power Tracking Thermal value*/
546
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. */
553
554                 p_rf_calibrate_info->is_tx_power_changed = true;        /*Always true after Tx Power is adjusted by power tracking.*/
555                 /*  */
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. */
558                 /*  */
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));
565                         }
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));
571                         }
572                 }
573
574 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
575                 if (thermal_value > p_hal_data->eeprom_thermal_meter)
576 #else
577                 if (thermal_value > p_dm_odm->priv->pmib->dot11RFEntry.ther)
578 #endif
579                 {
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));
582
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 */
587
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);
591                         } else {
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);
595                         }
596                 } else {
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));
599
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 */
604
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);
608                         } else {
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);
612                         }
613
614                 }
615
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];
619
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));
622
623                 p_rf_calibrate_info->thermal_value = thermal_value;         /*Record last Power Tracking Thermal value*/
624
625         }
626
627
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 */
629
630                 if (xtal_offset_eanble != 0 && p_rf_calibrate_info->txpowertrack_control && (p_hal_data->eeprom_thermal_meter != 0xff)) {
631
632                         ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter Xtal Tracking**********\n"));
633
634 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
635                         if (thermal_value > p_hal_data->eeprom_thermal_meter) {
636 #else
637                         if (thermal_value > p_dm_odm->priv->pmib->dot11RFEntry.ther) {
638 #endif
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);
642                         } else {
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);
646                         }
647                 }
648                 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********End Xtal Tracking**********\n"));
649         }
650
651 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
652
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);
660                 }
661         }
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);
669
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);
673                 } else {
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);
677                 }
678         }
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);
686
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);
690                 } else {
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);
694                 }
695         }
696
697 #endif
698
699         ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("<===odm_txpowertracking_callback_thermal_meter\n"));
700
701         p_rf_calibrate_info->tx_powercount = 0;
702 }
703
704
705
706 /* 3============================================================
707  * 3 IQ Calibration
708  * 3============================================================ */
709
710 void
711 odm_reset_iqk_result(
712         struct PHY_DM_STRUCT    *p_dm_odm
713 )
714 {
715         return;
716 }
717 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
718 u8 odm_get_right_chnl_place_for_iqk(u8 chnl)
719 {
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
722         };
723         u8      place = chnl;
724
725
726         if (chnl > 14) {
727                 for (place = 14; place < sizeof(channel_all); place++) {
728                         if (channel_all[place] == chnl)
729                                 return place - 13;
730                 }
731         }
732         return 0;
733
734 }
735 #endif
736
737 void
738 odm_iq_calibrate(
739         struct PHY_DM_STRUCT    *p_dm_odm
740 )
741 {
742         struct _ADAPTER *adapter = p_dm_odm->adapter;
743         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(adapter);
744
745         RT_TRACE(COMP_SCAN, ODM_DBG_LOUD, ("=>%s\n" , __FUNCTION__));
746
747 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
748         if (*p_dm_odm->p_is_fcs_mode_enable)
749                 return;
750 #endif
751
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"));
755
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;
759                 }
760
761                 if ((p_dm_odm->linked_interval < 3) && (!*p_dm_odm->p_is_scan_in_process))
762                         p_dm_odm->linked_interval++;
763
764                 if (p_dm_odm->linked_interval == 2)
765                         PHY_IQCalibrate(adapter, false);
766         } else
767                 p_dm_odm->linked_interval = 0;
768
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"));
771 }
772
773 void phydm_rf_init(struct PHY_DM_STRUCT         *p_dm_odm)
774 {
775
776         odm_txpowertracking_init(p_dm_odm);
777
778 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
779         odm_clear_txpowertracking_state(p_dm_odm);
780 #endif
781
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);
786 #endif
787 #endif
788
789 }
790
791 void phydm_rf_watchdog(struct PHY_DM_STRUCT             *p_dm_odm)
792 {
793
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);
798 #endif
799 }