halrf_8821c.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469
  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. *****************************************************************************/
  15. #include "mp_precomp.h"
  16. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  17. #if RT_PLATFORM == PLATFORM_MACOSX
  18. #include "phydm_precomp.h"
  19. #else
  20. #include "../phydm_precomp.h"
  21. #endif
  22. #else
  23. #include "../../phydm_precomp.h"
  24. #endif
  25. #if (RTL8821C_SUPPORT == 1)
  26. void halrf_rf_lna_setting_8821c(struct dm_struct *dm_void,
  27. enum halrf_lna_set type)
  28. {
  29. struct dm_struct *dm = (struct dm_struct *)dm_void;
  30. u8 path = 0x0;
  31. if (type == HALRF_LNA_DISABLE) {
  32. odm_set_rf_reg(dm, (enum rf_path)path, RF_0xef, BIT(19), 0x1);
  33. odm_set_rf_reg(dm, (enum rf_path)path, RF_0x33, RFREGOFFSETMASK, 0x00003);
  34. odm_set_rf_reg(dm, (enum rf_path)path, RF_0x3e, RFREGOFFSETMASK, 0x00064);
  35. odm_set_rf_reg(dm, (enum rf_path)path, RF_0x3f, RFREGOFFSETMASK, 0x0afce);
  36. odm_set_rf_reg(dm, (enum rf_path)path, RF_0xef, BIT(19), 0x0);
  37. odm_set_rf_reg(dm, (enum rf_path)path, RF_0xee, BIT(12), 0x1);
  38. odm_set_rf_reg(dm, (enum rf_path)path, RF_0x33, RFREGOFFSETMASK, 0x00003);
  39. odm_set_rf_reg(dm, (enum rf_path)path, RF_0x3e, RFREGOFFSETMASK, 0x00064);
  40. odm_set_rf_reg(dm, (enum rf_path)path, RF_0x3f, RFREGOFFSETMASK, 0x0280d);
  41. odm_set_rf_reg(dm, (enum rf_path)path, RF_0xee, BIT(12), 0x0);
  42. } else if (type == HALRF_LNA_ENABLE) {
  43. odm_set_rf_reg(dm, (enum rf_path)path, RF_0xef, BIT(19), 0x1);
  44. odm_set_rf_reg(dm, (enum rf_path)path, RF_0x33, RFREGOFFSETMASK, 0x00003);
  45. odm_set_rf_reg(dm, (enum rf_path)path, RF_0x3e, RFREGOFFSETMASK, 0x00064);
  46. odm_set_rf_reg(dm, (enum rf_path)path, RF_0x3f, RFREGOFFSETMASK, 0x1afce);
  47. odm_set_rf_reg(dm, (enum rf_path)path, RF_0xef, BIT(19), 0x0);
  48. odm_set_rf_reg(dm, (enum rf_path)path, RF_0xee, BIT(12), 0x1);
  49. odm_set_rf_reg(dm, (enum rf_path)path, RF_0x33, RFREGOFFSETMASK, 0x00003);
  50. odm_set_rf_reg(dm, (enum rf_path)path, RF_0x3e, RFREGOFFSETMASK, 0x00064);
  51. odm_set_rf_reg(dm, (enum rf_path)path, RF_0x3f, RFREGOFFSETMASK, 0x0281d);
  52. odm_set_rf_reg(dm, (enum rf_path)path, RF_0xee, BIT(12), 0x0);
  53. }
  54. }
  55. boolean
  56. get_mix_mode_tx_agc_bbs_wing_offset_8821c(void *dm_void,
  57. enum pwrtrack_method method,
  58. u8 rf_path,
  59. u8 tx_power_index_offest_upper_bound,
  60. s8 tx_power_index_offest_lower_bound)
  61. {
  62. struct dm_struct *dm = (struct dm_struct *)dm_void;
  63. struct dm_rf_calibration_struct *cali_info = &dm->rf_calibrate_info;
  64. u8 bb_swing_upper_bound = cali_info->default_ofdm_index + 10;
  65. u8 bb_swing_lower_bound = 0;
  66. s8 tx_agc_index = 0;
  67. u8 tx_bb_swing_index = cali_info->default_ofdm_index;
  68. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  69. "Path_%d pRF->absolute_ofdm_swing_idx[rf_path]=%d, tx_power_index_offest_upper_bound=%d, tx_power_index_offest_lower_bound=%d\n",
  70. rf_path, cali_info->absolute_ofdm_swing_idx[rf_path],
  71. tx_power_index_offest_upper_bound,
  72. tx_power_index_offest_lower_bound);
  73. if (tx_power_index_offest_upper_bound > 0XF)
  74. tx_power_index_offest_upper_bound = 0XF;
  75. if (tx_power_index_offest_lower_bound < -15)
  76. tx_power_index_offest_lower_bound = -15;
  77. if (cali_info->absolute_ofdm_swing_idx[rf_path] >= 0 && cali_info->absolute_ofdm_swing_idx[rf_path] <= tx_power_index_offest_upper_bound) {
  78. tx_agc_index = cali_info->absolute_ofdm_swing_idx[rf_path];
  79. tx_bb_swing_index = cali_info->default_ofdm_index;
  80. } else if (cali_info->absolute_ofdm_swing_idx[rf_path] >= 0 && (cali_info->absolute_ofdm_swing_idx[rf_path] > tx_power_index_offest_upper_bound)) {
  81. tx_agc_index = tx_power_index_offest_upper_bound;
  82. cali_info->remnant_ofdm_swing_idx[rf_path] = cali_info->absolute_ofdm_swing_idx[rf_path] - tx_power_index_offest_upper_bound;
  83. tx_bb_swing_index = cali_info->default_ofdm_index + cali_info->remnant_ofdm_swing_idx[rf_path];
  84. if (tx_bb_swing_index > bb_swing_upper_bound)
  85. tx_bb_swing_index = bb_swing_upper_bound;
  86. } else if (cali_info->absolute_ofdm_swing_idx[rf_path] < 0 && (cali_info->absolute_ofdm_swing_idx[rf_path] >= tx_power_index_offest_lower_bound)) {
  87. tx_agc_index = cali_info->absolute_ofdm_swing_idx[rf_path];
  88. tx_bb_swing_index = cali_info->default_ofdm_index;
  89. } else if (cali_info->absolute_ofdm_swing_idx[rf_path] < 0 && (cali_info->absolute_ofdm_swing_idx[rf_path] < tx_power_index_offest_lower_bound)) {
  90. tx_agc_index = tx_power_index_offest_lower_bound;
  91. cali_info->remnant_ofdm_swing_idx[rf_path] = cali_info->absolute_ofdm_swing_idx[rf_path] - tx_power_index_offest_lower_bound;
  92. if (cali_info->default_ofdm_index > (cali_info->remnant_ofdm_swing_idx[rf_path] * (-1)))
  93. tx_bb_swing_index = cali_info->default_ofdm_index + cali_info->remnant_ofdm_swing_idx[rf_path];
  94. else
  95. tx_bb_swing_index = bb_swing_lower_bound;
  96. }
  97. cali_info->absolute_ofdm_swing_idx[rf_path] = tx_agc_index;
  98. cali_info->bb_swing_idx_ofdm[rf_path] = tx_bb_swing_index;
  99. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  100. "MixMode Offset Path_%d pRF->absolute_ofdm_swing_idx[rf_path]=%d pRF->bb_swing_idx_ofdm[rf_path]=%d TxPwrIdxOffestUpper=%d TxPwrIdxOffestLower=%d\n",
  101. rf_path, cali_info->absolute_ofdm_swing_idx[rf_path],
  102. cali_info->bb_swing_idx_ofdm[rf_path],
  103. tx_power_index_offest_upper_bound,
  104. tx_power_index_offest_lower_bound);
  105. return true;
  106. }
  107. void odm_tx_pwr_track_set_pwr8821c(void *dm_void, enum pwrtrack_method method,
  108. u8 rf_path, u8 channel_mapped_index)
  109. {
  110. struct dm_struct *dm = (struct dm_struct *)dm_void;
  111. #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
  112. struct _ADAPTER *adapter = dm->adapter;
  113. u8 channel = *dm->channel;
  114. u8 band_width = *dm->band_width;
  115. #endif
  116. struct dm_rf_calibration_struct *cali_info = &dm->rf_calibrate_info;
  117. struct _hal_rf_ *rf = &dm->rf_table;
  118. u8 tx_power_index_offest_upper_bound = 0;
  119. s8 tx_power_index_offest_lower_bound = 0;
  120. u8 tx_power_index = 0;
  121. u8 tx_rate = 0xFF;
  122. if (*dm->mp_mode) {
  123. #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
  124. #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  125. #if (MP_DRIVER == 1)
  126. PMPT_CONTEXT p_mpt_ctx = &adapter->MptCtx;
  127. tx_rate = MptToMgntRate(p_mpt_ctx->MptRateIndex);
  128. #endif
  129. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  130. #ifdef CONFIG_MP_INCLUDED
  131. PMPT_CONTEXT p_mpt_ctx = &(adapter->mppriv.mpt_ctx);
  132. tx_rate = mpt_to_mgnt_rate(p_mpt_ctx->mpt_rate_index);
  133. #endif
  134. #endif
  135. #endif
  136. } else {
  137. u16 rate = *dm->forced_data_rate;
  138. if (!rate) { /*auto rate*/
  139. #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  140. tx_rate = ((PADAPTER)adapter)->HalFunc.GetHwRateFromMRateHandler(dm->tx_rate);
  141. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) && defined(DM_ODM_CE_MAC80211)
  142. tx_rate = dm->tx_rate;
  143. #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
  144. if (dm->number_linked_client != 0)
  145. tx_rate = hw_rate_to_m_rate(dm->tx_rate);
  146. else
  147. tx_rate = rf->p_rate_index;
  148. #endif
  149. } else { /*force rate*/
  150. tx_rate = (u8)rate;
  151. }
  152. }
  153. RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Call:%s tx_rate=0x%X\n", __func__,
  154. tx_rate);
  155. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  156. "pRF->default_ofdm_index=%d pRF->default_cck_index=%d\n",
  157. cali_info->default_ofdm_index, cali_info->default_cck_index);
  158. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  159. "pRF->absolute_ofdm_swing_idx=%d pRF->remnant_ofdm_swing_idx=%d pRF->absolute_cck_swing_idx=%d pRF->remnant_cck_swing_idx=%d rf_path=%d\n",
  160. cali_info->absolute_ofdm_swing_idx[rf_path],
  161. cali_info->remnant_ofdm_swing_idx[rf_path],
  162. cali_info->absolute_cck_swing_idx[rf_path],
  163. cali_info->remnant_cck_swing_idx, rf_path);
  164. #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
  165. tx_power_index = odm_get_tx_power_index(dm, (enum rf_path)rf_path, tx_rate, band_width, channel);
  166. #else
  167. tx_power_index = config_phydm_read_txagc_8821c(dm, rf_path, 0x04); /*0x04(TX_AGC_OFDM_6M)*/
  168. #endif
  169. if (tx_power_index >= 63)
  170. tx_power_index = 63;
  171. tx_power_index_offest_upper_bound = 63 - tx_power_index;
  172. tx_power_index_offest_lower_bound = 0 - tx_power_index;
  173. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  174. "tx_power_index=%d tx_power_index_offest_upper_bound=%d tx_power_index_offest_lower_bound=%d rf_path=%d\n",
  175. tx_power_index, tx_power_index_offest_upper_bound,
  176. tx_power_index_offest_lower_bound, rf_path);
  177. if (method == BBSWING) { /*use for mp driver clean power tracking status*/
  178. switch (rf_path) {
  179. case RF_PATH_A:
  180. odm_set_bb_reg(dm, R_0xc94, (BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2) | BIT(1)), ((cali_info->absolute_ofdm_swing_idx[rf_path]) & 0x3f));
  181. odm_set_bb_reg(dm, REG_A_TX_SCALE_JAGUAR, 0xFFE00000, tx_scaling_table_jaguar[cali_info->bb_swing_idx_ofdm[rf_path]]);
  182. break;
  183. default:
  184. break;
  185. }
  186. } else if (method == MIX_MODE) {
  187. switch (rf_path) {
  188. case RF_PATH_A:
  189. get_mix_mode_tx_agc_bbs_wing_offset_8821c(dm, method, rf_path, tx_power_index_offest_upper_bound, tx_power_index_offest_lower_bound);
  190. odm_set_bb_reg(dm, R_0xc94, (BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2) | BIT(1)), ((cali_info->absolute_ofdm_swing_idx[rf_path]) & 0x3f));
  191. odm_set_bb_reg(dm, REG_A_TX_SCALE_JAGUAR, 0xFFE00000, tx_scaling_table_jaguar[cali_info->bb_swing_idx_ofdm[rf_path]]);
  192. RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
  193. "TXAGC(0xC94)=0x%x BBSwing(0xc1c)=0x%x BBSwingIndex=%d rf_path=%d\n",
  194. odm_get_bb_reg(dm, R_0xc94,
  195. (BIT(6) | BIT(5) | BIT(4) |
  196. BIT(3) | BIT(2) | BIT(1))),
  197. odm_get_bb_reg(dm, R_0xc1c, 0xFFE00000),
  198. cali_info->bb_swing_idx_ofdm[rf_path], rf_path);
  199. break;
  200. default:
  201. break;
  202. }
  203. }
  204. }
  205. void get_delta_swing_table_8821c(void *dm_void,
  206. #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
  207. u8 **temperature_up_a, u8 **temperature_down_a,
  208. u8 **temperature_up_b, u8 **temperature_down_b,
  209. u8 **temperature_up_cck_a,
  210. u8 **temperature_down_cck_a,
  211. u8 **temperature_up_cck_b,
  212. u8 **temperature_down_cck_b
  213. #else
  214. u8 **temperature_up_a, u8 **temperature_down_a,
  215. u8 **temperature_up_b,
  216. u8 **temperature_down_b
  217. #endif
  218. )
  219. {
  220. struct dm_struct *dm = (struct dm_struct *)dm_void;
  221. struct dm_rf_calibration_struct *cali_info = &dm->rf_calibrate_info;
  222. #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
  223. u8 channel = *(dm->channel);
  224. #else
  225. u8 channel = *dm->channel;
  226. #endif
  227. #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
  228. *temperature_up_cck_a = cali_info->delta_swing_table_idx_2g_cck_a_p;
  229. *temperature_down_cck_a = cali_info->delta_swing_table_idx_2g_cck_a_n;
  230. *temperature_up_cck_b = cali_info->delta_swing_table_idx_2g_cck_b_p;
  231. *temperature_down_cck_b = cali_info->delta_swing_table_idx_2g_cck_b_n;
  232. #endif
  233. *temperature_up_a = cali_info->delta_swing_table_idx_2ga_p;
  234. *temperature_down_a = cali_info->delta_swing_table_idx_2ga_n;
  235. *temperature_up_b = cali_info->delta_swing_table_idx_2gb_p;
  236. *temperature_down_b = cali_info->delta_swing_table_idx_2gb_n;
  237. if (channel >= 36 && channel <= 64) {
  238. *temperature_up_a = cali_info->delta_swing_table_idx_5ga_p[0];
  239. *temperature_down_a = cali_info->delta_swing_table_idx_5ga_n[0];
  240. *temperature_up_b = cali_info->delta_swing_table_idx_5gb_p[0];
  241. *temperature_down_b = cali_info->delta_swing_table_idx_5gb_n[0];
  242. } else if (channel >= 100 && channel <= 144) {
  243. *temperature_up_a = cali_info->delta_swing_table_idx_5ga_p[1];
  244. *temperature_down_a = cali_info->delta_swing_table_idx_5ga_n[1];
  245. *temperature_up_b = cali_info->delta_swing_table_idx_5gb_p[1];
  246. *temperature_down_b = cali_info->delta_swing_table_idx_5gb_n[1];
  247. } else if (channel >= 149 && channel <= 177) {
  248. *temperature_up_a = cali_info->delta_swing_table_idx_5ga_p[2];
  249. *temperature_down_a = cali_info->delta_swing_table_idx_5ga_n[2];
  250. *temperature_up_b = cali_info->delta_swing_table_idx_5gb_p[2];
  251. *temperature_down_b = cali_info->delta_swing_table_idx_5gb_n[2];
  252. }
  253. }
  254. void aac_check_8821c(struct dm_struct *dm)
  255. {
  256. struct _hal_rf_ *rf = &dm->rf_table;
  257. u32 temp;
  258. if (!rf->aac_checked) {
  259. RF_DBG(dm, DBG_RF_LCK, "[LCK]AAC check for 8821c\n");
  260. temp = odm_get_rf_reg(dm, RF_PATH_A, 0xc9, 0xf8);
  261. if (temp < 4 || temp > 7) {
  262. odm_set_rf_reg(dm, RF_PATH_A, 0xca, BIT(19), 0x0);
  263. odm_set_rf_reg(dm, RF_PATH_A, 0xb2, 0x7c000, 0x6);
  264. }
  265. rf->aac_checked = true;
  266. }
  267. }
  268. void _phy_aac_calibrate_8821c(struct dm_struct *dm)
  269. {
  270. u32 cnt = 0;
  271. RF_DBG(dm, DBG_RF_IQK, "[AACK]AACK start!!!!!!!\n");
  272. odm_set_rf_reg(dm, RF_PATH_A, RF_0xb8, RFREGOFFSETMASK, 0x80a00);
  273. odm_set_rf_reg(dm, RF_PATH_A, RF_0xb0, RFREGOFFSETMASK, 0xff0fa);
  274. ODM_delay_ms(10);
  275. odm_set_rf_reg(dm, RF_PATH_A, RF_0xca, RFREGOFFSETMASK, 0x80000);
  276. odm_set_rf_reg(dm, RF_PATH_A, RF_0xc9, RFREGOFFSETMASK, 0x1c141);
  277. for (cnt = 0; cnt < 100; cnt++) {
  278. ODM_delay_ms(1);
  279. if (odm_get_rf_reg(dm, RF_PATH_A, RF_0xca, 0x1000) != 0x1)
  280. break;
  281. }
  282. odm_set_rf_reg(dm, RF_PATH_A, RF_0xb0, RFREGOFFSETMASK, 0xff0f8);
  283. RF_DBG(dm, DBG_RF_IQK, "[AACK]AACK end!!!!!!!\n");
  284. }
  285. void _phy_lc_calibrate_8821c(struct dm_struct *dm)
  286. {
  287. #if 1
  288. aac_check_8821c(dm);
  289. RF_DBG(dm, DBG_RF_IQK, "[LCK]real-time LCK!!!!!!!\n");
  290. odm_set_rf_reg(dm, RF_PATH_A, RF_0xcc, RFREGOFFSETMASK, 0x2018);
  291. odm_set_rf_reg(dm, RF_PATH_A, RF_0xc4, RFREGOFFSETMASK, 0x8f602);
  292. odm_set_rf_reg(dm, RF_PATH_A, RF_0xcc, RFREGOFFSETMASK, 0x201c);
  293. #endif
  294. #if 0
  295. u32 lc_cal = 0, cnt = 0, tmp0xc00;
  296. /*RF to standby mode*/
  297. tmp0xc00 = odm_read_4byte(dm, 0xc00);
  298. odm_write_4byte(dm, 0xc00, 0x4);
  299. odm_set_rf_reg(dm, RF_PATH_A, RF_0x0, RFREGOFFSETMASK, 0x10000);
  300. _phy_aac_calibrate_8821c(dm);
  301. /*backup RF0x18*/
  302. lc_cal = odm_get_rf_reg(dm, RF_PATH_A, RF_CHNLBW, RFREGOFFSETMASK);
  303. /*Start LCK*/
  304. odm_set_rf_reg(dm, RF_PATH_A, RF_CHNLBW, RFREGOFFSETMASK, lc_cal | 0x08000);
  305. ODM_delay_ms(50);
  306. for (cnt = 0; cnt < 100; cnt++) {
  307. if (odm_get_rf_reg(dm, RF_PATH_A, RF_CHNLBW, 0x8000) != 0x1)
  308. break;
  309. ODM_delay_ms(10);
  310. }
  311. /*Recover channel number*/
  312. odm_set_rf_reg(dm, RF_PATH_A, RF_CHNLBW, RFREGOFFSETMASK, lc_cal);
  313. /**restore*/
  314. odm_write_4byte(dm, 0xc00, tmp0xc00);
  315. odm_set_rf_reg(dm, RF_PATH_A, RF_0x0, RFREGOFFSETMASK, 0x3ffff);
  316. RF_DBG(dm, DBG_RF_IQK, "[LCK]LCK end!!!!!!!\n");
  317. #endif
  318. }
  319. /*LCK:0x2*/
  320. /*1. add AACK check*/
  321. void phy_lc_calibrate_8821c(void *dm_void)
  322. {
  323. struct dm_struct *dm = (struct dm_struct *)dm_void;
  324. _phy_lc_calibrate_8821c(dm);
  325. }
  326. void configure_txpower_track_8821c(struct txpwrtrack_cfg *config)
  327. {
  328. config->swing_table_size_cck = TXSCALE_TABLE_SIZE;
  329. config->swing_table_size_ofdm = TXSCALE_TABLE_SIZE;
  330. config->threshold_iqk = IQK_THRESHOLD;
  331. config->threshold_dpk = DPK_THRESHOLD;
  332. config->average_thermal_num = AVG_THERMAL_NUM_8821C;
  333. config->rf_path_count = MAX_PATH_NUM_8821C;
  334. config->thermal_reg_addr = RF_T_METER_8821C;
  335. config->odm_tx_pwr_track_set_pwr = odm_tx_pwr_track_set_pwr8821c;
  336. config->do_iqk = do_iqk_8821c;
  337. config->phy_lc_calibrate = phy_lc_calibrate_8821c;
  338. #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
  339. config->get_delta_all_swing_table = get_delta_swing_table_8821c;
  340. #else
  341. config->get_delta_swing_table = get_delta_swing_table_8821c;
  342. #endif
  343. }
  344. #if ((DM_ODM_SUPPORT_TYPE & ODM_AP) || (DM_ODM_SUPPORT_TYPE == ODM_CE))
  345. void phy_set_rf_path_switch_8821c(struct dm_struct *dm,
  346. #else
  347. void phy_set_rf_path_switch_8821c(void *adapter,
  348. #endif
  349. boolean is_main)
  350. {
  351. #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
  352. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  353. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));
  354. struct dm_struct *dm = &hal_data->DM_OutSrc;
  355. #endif
  356. #endif
  357. u8 ant_num = 0; /*0: ANT_1, 1: ANT_2*/
  358. if (is_main)
  359. ant_num = SWITCH_TO_ANT1; /*Main = ANT_1*/
  360. else
  361. ant_num = SWITCH_TO_ANT2; /*Aux = ANT_2*/
  362. config_phydm_set_ant_path(dm, dm->current_rf_set_8821c, ant_num);
  363. }
  364. #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
  365. boolean _phy_query_rf_path_switch_8821c(struct dm_struct *dm
  366. #else
  367. boolean _phy_query_rf_path_switch_8821c(void *adapter
  368. #endif
  369. )
  370. {
  371. #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
  372. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));
  373. #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
  374. struct dm_struct *dm = &hal_data->odmpriv;
  375. #endif
  376. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  377. struct dm_struct *dm = &hal_data->DM_OutSrc;
  378. #endif
  379. #endif
  380. u8 ant_num = 0; /*0: ANT_1, 1: ANT_2*/
  381. ODM_delay_ms(300);
  382. ant_num = query_phydm_current_ant_num_8821c(dm);
  383. if (ant_num == SWITCH_TO_ANT1)
  384. return true; /*Main = ANT_1*/
  385. else
  386. return false; /*Aux = ANT_2*/
  387. }
  388. #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
  389. boolean phy_query_rf_path_switch_8821c(struct dm_struct *dm
  390. #else
  391. boolean phy_query_rf_path_switch_8821c(void *adapter
  392. #endif
  393. )
  394. {
  395. #if DISABLE_BB_RF
  396. return true;
  397. #endif
  398. #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
  399. return _phy_query_rf_path_switch_8821c(dm);
  400. #else
  401. return _phy_query_rf_path_switch_8821c(adapter);
  402. #endif
  403. }
  404. #endif /* (RTL8821C_SUPPORT == 0)*/