halphyrf_iot.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2007 - 2017 Realtek Corporation.
  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. * The full GNU General Public License is included in this distribution in the
  15. * file called LICENSE.
  16. *
  17. * Contact Information:
  18. * wlanfae <wlanfae@realtek.com>
  19. * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
  20. * Hsinchu 300, Taiwan.
  21. *
  22. * Larry Finger <Larry.Finger@lwfinger.net>
  23. *
  24. *****************************************************************************/
  25. #include "mp_precomp.h"
  26. #include "phydm_precomp.h"
  27. #define CALCULATE_SWINGTALBE_OFFSET(_offset, _direction, _size, _delta_thermal) \
  28. do {\
  29. for (_offset = 0; _offset < _size; _offset++) { \
  30. if (_delta_thermal < thermal_threshold[_direction][_offset]) { \
  31. if (_offset != 0)\
  32. _offset--;\
  33. break;\
  34. } \
  35. } \
  36. if (_offset >= _size)\
  37. _offset = _size-1;\
  38. } while (0)
  39. void configure_txpower_track(
  40. void *dm_void,
  41. struct txpwrtrack_cfg *config
  42. )
  43. {
  44. struct dm_struct *dm = (struct dm_struct *)dm_void;
  45. #if RTL8195B_SUPPORT
  46. if (dm->support_ic_type == ODM_RTL8195B)
  47. configure_txpower_track_8195b(config);
  48. #endif
  49. }
  50. /* **********************************************************************
  51. * <20121113, Kordan> This function should be called when tx_agc changed.
  52. * Otherwise the previous compensation is gone, because we record the
  53. * delta of temperature between two TxPowerTracking watch dogs.
  54. *
  55. * NOTE: If Tx BB swing or Tx scaling is varified during run-time, still
  56. * need to call this function.
  57. * ********************************************************************** */
  58. void
  59. odm_clear_txpowertracking_state(
  60. void *dm_void
  61. )
  62. {
  63. struct dm_struct *dm = (struct dm_struct *)dm_void;
  64. struct _hal_rf_ *rf = &dm->rf_table;
  65. u8 p = 0;
  66. struct dm_rf_calibration_struct *cali_info = &dm->rf_calibrate_info;
  67. cali_info->bb_swing_idx_cck_base = cali_info->default_cck_index;
  68. cali_info->bb_swing_idx_cck = cali_info->default_cck_index;
  69. dm->rf_calibrate_info.CCK_index = 0;
  70. for (p = RF_PATH_A; p < MAX_RF_PATH; ++p) {
  71. cali_info->bb_swing_idx_ofdm_base[p] = cali_info->default_ofdm_index;
  72. cali_info->bb_swing_idx_ofdm[p] = cali_info->default_ofdm_index;
  73. cali_info->OFDM_index[p] = cali_info->default_ofdm_index;
  74. cali_info->power_index_offset[p] = 0;
  75. cali_info->delta_power_index[p] = 0;
  76. cali_info->delta_power_index_last[p] = 0;
  77. cali_info->absolute_ofdm_swing_idx[p] = 0;
  78. cali_info->remnant_ofdm_swing_idx[p] = 0;
  79. cali_info->kfree_offset[p] = 0;
  80. }
  81. cali_info->modify_tx_agc_flag_path_a = false;
  82. cali_info->modify_tx_agc_flag_path_b = false;
  83. cali_info->modify_tx_agc_flag_path_c = false;
  84. cali_info->modify_tx_agc_flag_path_d = false;
  85. cali_info->remnant_cck_swing_idx = 0;
  86. cali_info->thermal_value = rf->eeprom_thermal;
  87. cali_info->modify_tx_agc_value_cck = 0;
  88. cali_info->modify_tx_agc_value_ofdm = 0;
  89. }
  90. void
  91. odm_txpowertracking_callback_thermal_meter(
  92. void *dm_void
  93. )
  94. {
  95. struct dm_struct *dm = (struct dm_struct *)dm_void;
  96. struct _hal_rf_ *rf = &dm->rf_table;
  97. struct dm_rf_calibration_struct *cali_info = &dm->rf_calibrate_info;
  98. struct dm_iqk_info *iqk_info = &dm->IQK_info;
  99. u8 thermal_value = 0, delta, delta_LCK, delta_IQK, p = 0, i = 0;
  100. u8 thermal_value_avg_count = 0;
  101. u32 thermal_value_avg = 0, regc80, regcd0, regcd4, regab4;
  102. u8 OFDM_min_index = 0; /* OFDM BB Swing should be less than +3.0dB, which is required by Arthur */
  103. u8 indexforchannel = 0; /* get_right_chnl_place_for_iqk(hal_data->current_channel) */
  104. u8 power_tracking_type = rf->pwt_type;
  105. u8 xtal_offset_eanble = 0;
  106. s8 thermal_value_temp = 0;
  107. struct txpwrtrack_cfg c = {0};
  108. /* 4 1. The following TWO tables decide the final index of OFDM/CCK swing table. */
  109. u8 *delta_swing_table_idx_tup_a = NULL;
  110. u8 *delta_swing_table_idx_tdown_a = NULL;
  111. u8 *delta_swing_table_idx_tup_b = NULL;
  112. u8 *delta_swing_table_idx_tdown_b = NULL;
  113. /*for Xtal Offset by James.Tung*/
  114. s8 *delta_swing_table_xtal_up = NULL;
  115. s8 *delta_swing_table_xtal_down = NULL;
  116. /* 4 2. Initialization ( 7 steps in total ) */
  117. configure_txpower_track(dm, &c);
  118. (*c.get_delta_swing_table)(dm, (u8 **)&delta_swing_table_idx_tup_a, (u8 **)&delta_swing_table_idx_tdown_a,
  119. (u8 **)&delta_swing_table_idx_tup_b, (u8 **)&delta_swing_table_idx_tdown_b);
  120. if (dm->support_ic_type & ODM_RTL8195B) /*for Xtal Offset*/
  121. (*c.get_delta_swing_xtal_table)(dm, (s8 **)&delta_swing_table_xtal_up, (s8 **)&delta_swing_table_xtal_down);
  122. cali_info->txpowertracking_callback_cnt++; /*cosa add for debug*/
  123. cali_info->is_txpowertracking_init = true;
  124. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  125. "===>odm_txpowertracking_callback_thermal_meter\n cali_info->bb_swing_idx_cck_base: %d, cali_info->bb_swing_idx_ofdm_base[A]: %d, cali_info->default_ofdm_index: %d\n",
  126. cali_info->bb_swing_idx_cck_base, cali_info->bb_swing_idx_ofdm_base[RF_PATH_A], cali_info->default_ofdm_index);
  127. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  128. "cali_info->txpowertrack_control = %d, hal_data->eeprom_thermal_meter %d\n", cali_info->txpowertrack_control, rf->eeprom_thermal);
  129. thermal_value = (u8)odm_get_rf_reg(dm, RF_PATH_A, c.thermal_reg_addr, 0xfc00); /* 0x42: RF Reg[15:10] 88E */
  130. thermal_value_temp = thermal_value + phydm_get_thermal_offset(dm);
  131. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  132. "thermal_value_temp(%d) = thermal_value(%d) + power_trim_thermal(%d)\n", thermal_value_temp, thermal_value, phydm_get_thermal_offset(dm));
  133. if (thermal_value_temp > 63)
  134. thermal_value = 63;
  135. else if (thermal_value_temp < 0)
  136. thermal_value = 0;
  137. else
  138. thermal_value = thermal_value_temp;
  139. if (!cali_info->txpowertrack_control)
  140. return;
  141. if (rf->eeprom_thermal == 0xff) {
  142. RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "no pg, hal_data->eeprom_thermal_meter = 0x%x\n", rf->eeprom_thermal);
  143. return;
  144. }
  145. /*4 3. Initialize ThermalValues of rf_calibrate_info*/
  146. //if (cali_info->is_reloadtxpowerindex)
  147. // RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "reload ofdm index for band switch\n");
  148. /*4 4. Calculate average thermal meter*/
  149. cali_info->thermal_value_avg[cali_info->thermal_value_avg_index] = thermal_value;
  150. cali_info->thermal_value_avg_index++;
  151. if (cali_info->thermal_value_avg_index == c.average_thermal_num) /*Average times = c.average_thermal_num*/
  152. cali_info->thermal_value_avg_index = 0;
  153. for (i = 0; i < c.average_thermal_num; i++) {
  154. if (cali_info->thermal_value_avg[i]) {
  155. thermal_value_avg += cali_info->thermal_value_avg[i];
  156. thermal_value_avg_count++;
  157. }
  158. }
  159. if (thermal_value_avg_count) { /* Calculate Average thermal_value after average enough times */
  160. thermal_value = (u8)(thermal_value_avg / thermal_value_avg_count);
  161. cali_info->thermal_value_delta = thermal_value - rf->eeprom_thermal;
  162. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  163. "AVG Thermal Meter = 0x%X, EFUSE Thermal base = 0x%X\n", thermal_value, rf->eeprom_thermal);
  164. }
  165. /* 4 5. Calculate delta, delta_LCK, delta_IQK. */
  166. /* "delta" here is used to determine whether thermal value changes or not. */
  167. delta = (thermal_value > cali_info->thermal_value) ? (thermal_value - cali_info->thermal_value) : (cali_info->thermal_value - thermal_value);
  168. delta_LCK = (thermal_value > cali_info->thermal_value_lck) ? (thermal_value - cali_info->thermal_value_lck) : (cali_info->thermal_value_lck - thermal_value);
  169. delta_IQK = (thermal_value > cali_info->thermal_value_iqk) ? (thermal_value - cali_info->thermal_value_iqk) : (cali_info->thermal_value_iqk - thermal_value);
  170. /*4 6. If necessary, do LCK.*/
  171. RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "(delta, delta_LCK, delta_IQK) = (%d, %d, %d)\n", delta, delta_LCK, delta_IQK);
  172. /* Wait sacn to do LCK by RF Jenyu*/
  173. if ((!*dm->is_scan_in_process) && (!iqk_info->rfk_forbidden)) {
  174. /* Delta temperature is equal to or larger than 20 centigrade.*/
  175. if (delta_LCK >= c.threshold_iqk) {
  176. RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "delta_LCK(%d) >= threshold_iqk(%d)\n", delta_LCK, c.threshold_iqk);
  177. cali_info->thermal_value_lck = thermal_value;
  178. /*Use RTLCK, so close power tracking driver LCK*/
  179. (*c.phy_lc_calibrate)(dm);
  180. }
  181. }
  182. /*3 7. If necessary, move the index of swing table to adjust Tx power.*/
  183. if (delta > 0 && cali_info->txpowertrack_control) {
  184. /* "delta" here is used to record the absolute value of difference. */
  185. delta = thermal_value > rf->eeprom_thermal ? (thermal_value - rf->eeprom_thermal) : (rf->eeprom_thermal - thermal_value);
  186. if (delta >= TXPWR_TRACK_TABLE_SIZE)
  187. delta = TXPWR_TRACK_TABLE_SIZE - 1;
  188. /*4 7.1 The Final Power index = BaseIndex + power_index_offset*/
  189. if (thermal_value > rf->eeprom_thermal) {
  190. for (p = RF_PATH_A; p < c.rf_path_count; p++) {
  191. cali_info->delta_power_index_last[p] = cali_info->delta_power_index[p]; /*recording poer index offset*/
  192. switch (p) {
  193. case RF_PATH_B:
  194. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  195. "delta_swing_table_idx_tup_b[%d] = %d\n", delta, delta_swing_table_idx_tup_b[delta]);
  196. cali_info->delta_power_index[p] = delta_swing_table_idx_tup_b[delta];
  197. cali_info->absolute_ofdm_swing_idx[p] = delta_swing_table_idx_tup_b[delta]; /*Record delta swing for mix mode power tracking*/
  198. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  199. "******Temp is higher and cali_info->absolute_ofdm_swing_idx[RF_PATH_B] = %d\n", cali_info->absolute_ofdm_swing_idx[p]);
  200. break;
  201. default:
  202. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  203. "delta_swing_table_idx_tup_a[%d] = %d\n", delta, delta_swing_table_idx_tup_a[delta]);
  204. cali_info->delta_power_index[p] = delta_swing_table_idx_tup_a[delta];
  205. cali_info->absolute_ofdm_swing_idx[p] = delta_swing_table_idx_tup_a[delta]; /*Record delta swing for mix mode power tracking*/
  206. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  207. "******Temp is higher and cali_info->absolute_ofdm_swing_idx[RF_PATH_A] = %d\n", cali_info->absolute_ofdm_swing_idx[p]);
  208. break;
  209. }
  210. }
  211. /* JJ ADD 20161014 */
  212. if (dm->support_ic_type & ODM_RTL8195B) {
  213. /*Save xtal_offset from Xtal table*/
  214. cali_info->xtal_offset_last = cali_info->xtal_offset; /*recording last Xtal offset*/
  215. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  216. "[Xtal] delta_swing_table_xtal_up[%d] = %d\n", delta, delta_swing_table_xtal_up[delta]);
  217. cali_info->xtal_offset = delta_swing_table_xtal_up[delta];
  218. xtal_offset_eanble = (cali_info->xtal_offset_last != cali_info->xtal_offset);
  219. }
  220. } else {
  221. for (p = RF_PATH_A; p < c.rf_path_count; p++) {
  222. cali_info->delta_power_index_last[p] = cali_info->delta_power_index[p]; /*recording poer index offset*/
  223. switch (p) {
  224. case RF_PATH_B:
  225. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  226. "delta_swing_table_idx_tdown_b[%d] = %d\n", delta, delta_swing_table_idx_tdown_b[delta]);
  227. cali_info->delta_power_index[p] = -1 * delta_swing_table_idx_tdown_b[delta];
  228. cali_info->absolute_ofdm_swing_idx[p] = -1 * delta_swing_table_idx_tdown_b[delta]; /*Record delta swing for mix mode power tracking*/
  229. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  230. "******Temp is lower and cali_info->absolute_ofdm_swing_idx[RF_PATH_B] = %d\n", cali_info->absolute_ofdm_swing_idx[p]);
  231. break;
  232. default:
  233. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  234. "delta_swing_table_idx_tdown_a[%d] = %d\n", delta, delta_swing_table_idx_tdown_a[delta]);
  235. cali_info->delta_power_index[p] = -1 * delta_swing_table_idx_tdown_a[delta];
  236. cali_info->absolute_ofdm_swing_idx[p] = -1 * delta_swing_table_idx_tdown_a[delta]; /*Record delta swing for mix mode power tracking*/
  237. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  238. "******Temp is lower and cali_info->absolute_ofdm_swing_idx[RF_PATH_A] = %d\n", cali_info->absolute_ofdm_swing_idx[p]);
  239. break;
  240. }
  241. }
  242. /* JJ ADD 20161014 */
  243. if (dm->support_ic_type & ODM_RTL8195B) {
  244. /*Save xtal_offset from Xtal table*/
  245. cali_info->xtal_offset_last = cali_info->xtal_offset; /*recording last Xtal offset*/
  246. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  247. "[Xtal] delta_swing_table_xtal_down[%d] = %d\n", delta, delta_swing_table_xtal_down[delta]);
  248. cali_info->xtal_offset = delta_swing_table_xtal_down[delta];
  249. xtal_offset_eanble = (cali_info->xtal_offset_last != cali_info->xtal_offset);
  250. }
  251. }
  252. #if 0
  253. for (p = RF_PATH_A; p < c.rf_path_count; p++) {
  254. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  255. "\n\n=========================== [path-%d] Calculating power_index_offset===========================\n", p);
  256. if (cali_info->delta_power_index[p] == cali_info->delta_power_index_last[p]) /*If Thermal value changes but lookup table value still the same*/
  257. cali_info->power_index_offset[p] = 0;
  258. else
  259. cali_info->power_index_offset[p] = cali_info->delta_power_index[p] - cali_info->delta_power_index_last[p]; /*Power index diff between 2 times Power Tracking*/
  260. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  261. "[path-%d] power_index_offset(%d) = delta_power_index(%d) - delta_power_index_last(%d)\n", p, cali_info->power_index_offset[p], cali_info->delta_power_index[p], cali_info->delta_power_index_last[p]);
  262. cali_info->OFDM_index[p] = cali_info->bb_swing_idx_ofdm_base[p] + cali_info->power_index_offset[p];
  263. cali_info->CCK_index = cali_info->bb_swing_idx_cck_base + cali_info->power_index_offset[p];
  264. cali_info->bb_swing_idx_cck = cali_info->CCK_index;
  265. cali_info->bb_swing_idx_ofdm[p] = cali_info->OFDM_index[p];
  266. /*************Print BB Swing base and index Offset*************/
  267. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  268. "The 'CCK' final index(%d) = BaseIndex(%d) + power_index_offset(%d)\n", cali_info->bb_swing_idx_cck, cali_info->bb_swing_idx_cck_base, cali_info->power_index_offset[p]);
  269. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  270. "The 'OFDM' final index(%d) = BaseIndex[%d](%d) + power_index_offset(%d)\n", cali_info->bb_swing_idx_ofdm[p], p, cali_info->bb_swing_idx_ofdm_base[p], cali_info->power_index_offset[p]);
  271. /*4 7.1 Handle boundary conditions of index.*/
  272. if (cali_info->OFDM_index[p] > c.swing_table_size_ofdm - 1)
  273. cali_info->OFDM_index[p] = c.swing_table_size_ofdm - 1;
  274. else if (cali_info->OFDM_index[p] <= OFDM_min_index)
  275. cali_info->OFDM_index[p] = OFDM_min_index;
  276. }
  277. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  278. "\n\n========================================================================================================\n");
  279. if (cali_info->CCK_index > c.swing_table_size_cck - 1)
  280. cali_info->CCK_index = c.swing_table_size_cck - 1;
  281. else if (cali_info->CCK_index <= 0)
  282. cali_info->CCK_index = 0;
  283. #endif
  284. } else {
  285. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  286. "The thermal meter is unchanged or TxPowerTracking OFF(%d): thermal_value: %d, cali_info->thermal_value: %d\n",
  287. cali_info->txpowertrack_control, thermal_value, cali_info->thermal_value);
  288. for (p = RF_PATH_A; p < c.rf_path_count; p++)
  289. cali_info->power_index_offset[p] = 0;
  290. }
  291. #if 0
  292. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  293. "TxPowerTracking: [CCK] Swing Current index: %d, Swing base index: %d\n",
  294. cali_info->CCK_index, cali_info->bb_swing_idx_cck_base); /*Print Swing base & current*/
  295. for (p = RF_PATH_A; p < c.rf_path_count; p++) {
  296. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  297. "TxPowerTracking: [OFDM] Swing Current index: %d, Swing base index[%d]: %d\n",
  298. cali_info->OFDM_index[p], p, cali_info->bb_swing_idx_ofdm_base[p]);
  299. }
  300. #endif
  301. if (thermal_value > rf->eeprom_thermal) {
  302. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  303. "Temperature(%d) higher than PG value(%d)\n", thermal_value, rf->eeprom_thermal);
  304. if (dm->support_ic_type == ODM_RTL8188E || dm->support_ic_type == ODM_RTL8192E || dm->support_ic_type == ODM_RTL8821 ||
  305. dm->support_ic_type == ODM_RTL8812 || dm->support_ic_type == ODM_RTL8723B || dm->support_ic_type == ODM_RTL8814A ||
  306. dm->support_ic_type == ODM_RTL8703B || dm->support_ic_type == ODM_RTL8188F || dm->support_ic_type == ODM_RTL8822B ||
  307. dm->support_ic_type == ODM_RTL8723D || dm->support_ic_type == ODM_RTL8821C || dm->support_ic_type == ODM_RTL8710B ||
  308. dm->support_ic_type == ODM_RTL8192F || dm->support_ic_type == ODM_RTL8195B){
  309. RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter POWER Tracking MIX_MODE**********\n");
  310. for (p = RF_PATH_A; p < c.rf_path_count; p++)
  311. (*c.odm_tx_pwr_track_set_pwr)(dm, MIX_MODE, p, 0);
  312. } else {
  313. RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter POWER Tracking BBSWING_MODE**********\n");
  314. for (p = RF_PATH_A; p < c.rf_path_count; p++)
  315. (*c.odm_tx_pwr_track_set_pwr)(dm, BBSWING, p, indexforchannel);
  316. }
  317. } else {
  318. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  319. "Temperature(%d) lower than PG value(%d)\n", thermal_value, rf->eeprom_thermal);
  320. if (dm->support_ic_type == ODM_RTL8188E || dm->support_ic_type == ODM_RTL8192E || dm->support_ic_type == ODM_RTL8821 ||
  321. dm->support_ic_type == ODM_RTL8812 || dm->support_ic_type == ODM_RTL8723B || dm->support_ic_type == ODM_RTL8814A ||
  322. dm->support_ic_type == ODM_RTL8703B || dm->support_ic_type == ODM_RTL8188F || dm->support_ic_type == ODM_RTL8822B ||
  323. dm->support_ic_type == ODM_RTL8723D || dm->support_ic_type == ODM_RTL8821C || dm->support_ic_type == ODM_RTL8710B ||
  324. dm->support_ic_type == ODM_RTL8192F || dm->support_ic_type == ODM_RTL8195B) {
  325. RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter POWER Tracking MIX_MODE**********\n");
  326. for (p = RF_PATH_A; p < c.rf_path_count; p++)
  327. (*c.odm_tx_pwr_track_set_pwr)(dm, MIX_MODE, p, indexforchannel);
  328. } else {
  329. RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter POWER Tracking BBSWING_MODE**********\n");
  330. for (p = RF_PATH_A; p < c.rf_path_count; p++)
  331. (*c.odm_tx_pwr_track_set_pwr)(dm, BBSWING, p, indexforchannel);
  332. }
  333. cali_info->bb_swing_idx_cck_base = cali_info->bb_swing_idx_cck; /*Record last time Power Tracking result as base.*/
  334. for (p = RF_PATH_A; p < c.rf_path_count; p++)
  335. cali_info->bb_swing_idx_ofdm_base[p] = cali_info->bb_swing_idx_ofdm[p];
  336. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  337. "cali_info->thermal_value = %d thermal_value= %d\n", cali_info->thermal_value, thermal_value);
  338. cali_info->thermal_value = thermal_value; /*Record last Power Tracking Thermal value*/
  339. }
  340. if (dm->support_ic_type == ODM_RTL8195B) {/* JJ ADD 20161014 */
  341. if (xtal_offset_eanble != 0 && cali_info->txpowertrack_control && (rf->eeprom_thermal != 0xff)) {
  342. RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter Xtal Tracking**********\n");
  343. if (thermal_value > rf->eeprom_thermal) {
  344. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  345. "Temperature(%d) higher than PG value(%d)\n", thermal_value, rf->eeprom_thermal);
  346. (*c.odm_txxtaltrack_set_xtal)(dm);
  347. } else {
  348. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  349. "Temperature(%d) lower than PG value(%d)\n", thermal_value, rf->eeprom_thermal);
  350. (*c.odm_txxtaltrack_set_xtal)(dm);
  351. }
  352. RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********End Xtal Tracking**********\n");
  353. }
  354. }
  355. /* Wait sacn to do IQK by RF Jenyu*/
  356. if ((!*dm->is_scan_in_process) && (!iqk_info->rfk_forbidden)) {
  357. /*Delta temperature is equal to or larger than 20 centigrade (When threshold is 8).*/
  358. if (delta_IQK >= c.threshold_iqk) {
  359. cali_info->thermal_value_iqk = thermal_value;
  360. RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "delta_IQK(%d) >= threshold_iqk(%d)\n", delta_IQK, c.threshold_iqk);
  361. if (!cali_info->is_iqk_in_progress)
  362. (*c.do_iqk)(dm, delta_IQK, thermal_value, 8);
  363. }
  364. }
  365. RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "<===odm_txpowertracking_callback_thermal_meter\n");
  366. cali_info->tx_powercount = 0;
  367. }
  368. /* 3============================================================
  369. * 3 IQ Calibration
  370. * 3============================================================
  371. */
  372. void
  373. odm_reset_iqk_result(
  374. void *dm_void
  375. )
  376. {
  377. return;
  378. }
  379. u8 odm_get_right_chnl_place_for_iqk(u8 chnl)
  380. {
  381. }
  382. void
  383. odm_iq_calibrate(
  384. struct dm_struct *dm
  385. )
  386. {
  387. }
  388. void phydm_rf_init(void *dm_void)
  389. {
  390. struct dm_struct *dm = (struct dm_struct *)dm_void;
  391. odm_txpowertracking_init(dm);
  392. odm_clear_txpowertracking_state(dm);
  393. }
  394. void phydm_rf_watchdog(void *dm_void)
  395. {
  396. struct dm_struct *dm = (struct dm_struct *)dm_void;
  397. odm_txpowertracking_check(dm);
  398. }