phydm_regconfig8821c.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2016 - 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. #include "../phydm_precomp.h"
  17. #if (RTL8821C_SUPPORT == 1)
  18. void odm_config_rf_reg_8821c(struct dm_struct *dm, u32 addr, u32 data,
  19. enum rf_path rf_path, u32 reg_addr)
  20. {
  21. if (dm->fw_offload_ability & PHYDM_PHY_PARAM_OFFLOAD) {
  22. if (addr == 0xffe) {
  23. phydm_set_reg_by_fw(dm,
  24. PHYDM_HALMAC_CMD_DELAY_MS,
  25. reg_addr,
  26. data,
  27. RFREGOFFSETMASK,
  28. rf_path,
  29. 50);
  30. } else if (addr == 0xfe) {
  31. phydm_set_reg_by_fw(dm,
  32. PHYDM_HALMAC_CMD_DELAY_US,
  33. reg_addr,
  34. data,
  35. RFREGOFFSETMASK,
  36. rf_path,
  37. 100);
  38. } else {
  39. phydm_set_reg_by_fw(dm,
  40. PHYDM_HALMAC_CMD_RF_W,
  41. reg_addr,
  42. data,
  43. RFREGOFFSETMASK,
  44. rf_path,
  45. 0);
  46. phydm_set_reg_by_fw(dm,
  47. PHYDM_HALMAC_CMD_DELAY_US,
  48. reg_addr,
  49. data,
  50. RFREGOFFSETMASK,
  51. rf_path,
  52. 1);
  53. }
  54. } else {
  55. if (addr == 0xffe) {
  56. #ifdef CONFIG_LONG_DELAY_ISSUE
  57. ODM_sleep_ms(50);
  58. #else
  59. ODM_delay_ms(50);
  60. #endif
  61. } else if (addr == 0xfe) {
  62. #ifdef CONFIG_LONG_DELAY_ISSUE
  63. ODM_sleep_us(100);
  64. #else
  65. ODM_delay_us(100);
  66. #endif
  67. } else {
  68. odm_set_rf_reg(dm, rf_path, reg_addr, RFREGOFFSETMASK, data);
  69. /* Add 1us delay between BB/RF register setting. */
  70. ODM_delay_us(1);
  71. }
  72. }
  73. }
  74. void odm_config_rf_radio_a_8821c(struct dm_struct *dm, u32 addr, u32 data)
  75. {
  76. u32 content = 0x1000; /* RF_Content: radioa_txt */
  77. u32 maskfor_phy_set = (u32)(content & 0xE000);
  78. odm_config_rf_reg_8821c(dm, addr, data, RF_PATH_A, addr | maskfor_phy_set);
  79. PHYDM_DBG(dm, ODM_COMP_INIT,
  80. "===> odm_config_rf_with_header_file: [RadioA] %08X %08X\n",
  81. addr, data);
  82. }
  83. void odm_config_mac_8821c(struct dm_struct *dm, u32 addr, u8 data)
  84. {
  85. if (dm->fw_offload_ability & PHYDM_PHY_PARAM_OFFLOAD)
  86. phydm_set_reg_by_fw(dm,
  87. PHYDM_HALMAC_CMD_MAC_W8,
  88. addr,
  89. data,
  90. 0,
  91. (enum rf_path)0,
  92. 0);
  93. else
  94. odm_write_1byte(dm, addr, data);
  95. PHYDM_DBG(dm, ODM_COMP_INIT, "===> config_mac: [MAC_REG] %08X %08X\n",
  96. addr, data);
  97. }
  98. void odm_update_agc_big_jump_lmt_8821c(struct dm_struct *dm, u32 addr, u32 data)
  99. {
  100. struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
  101. u8 rf_gain_idx = (u8)((data & 0xFF000000) >> 24);
  102. u8 bb_gain_idx = (u8)((data & 0x00ff0000) >> 16);
  103. u8 agc_table_idx = (u8)((data & 0x00000f00) >> 8);
  104. static boolean is_limit;
  105. if (addr != 0x81c)
  106. return;
  107. /*dbg_print("data = 0x%x, rf_gain_idx = 0x%x, bb_gain_idx = 0x%x, agc_table_idx = 0x%x\n", data, rf_gain_idx, bb_gain_idx, agc_table_idx);*/
  108. /*dbg_print("rf_gain_idx = 0x%x, dig_t->rf_gain_idx = 0x%x\n", rf_gain_idx, dig_t->rf_gain_idx);*/
  109. if (bb_gain_idx > 0x3c) {
  110. if (rf_gain_idx == dig_t->rf_gain_idx && is_limit == false) {
  111. is_limit = true;
  112. dig_t->big_jump_lmt[agc_table_idx] = bb_gain_idx - 2;
  113. PHYDM_DBG(dm, DBG_DIG,
  114. "===> [AGC_TAB] big_jump_lmt [%d] = 0x%x\n",
  115. agc_table_idx,
  116. dig_t->big_jump_lmt[agc_table_idx]);
  117. }
  118. } else {
  119. is_limit = false;
  120. }
  121. dig_t->rf_gain_idx = rf_gain_idx;
  122. }
  123. void odm_config_bb_agc_8821c(struct dm_struct *dm, u32 addr, u32 bitmask,
  124. u32 data)
  125. {
  126. odm_update_agc_big_jump_lmt_8821c(dm, addr, data);
  127. if (dm->fw_offload_ability & PHYDM_PHY_PARAM_OFFLOAD)
  128. phydm_set_reg_by_fw(dm,
  129. PHYDM_HALMAC_CMD_BB_W32,
  130. addr,
  131. data,
  132. bitmask,
  133. (enum rf_path)0,
  134. 0);
  135. else
  136. odm_set_bb_reg(dm, addr, bitmask, data);
  137. PHYDM_DBG(dm, ODM_COMP_INIT, "===> config_bb: [AGC_TAB] %08X %08X\n",
  138. addr, data);
  139. }
  140. void odm_config_bb_phy_reg_pg_8821c(struct dm_struct *dm, u32 band, u32 rf_path,
  141. u32 tx_num, u32 addr, u32 bitmask, u32 data)
  142. {
  143. #if (DM_ODM_SUPPORT_TYPE & ODM_CE)
  144. phy_store_tx_power_by_rate(dm->adapter, band, rf_path, tx_num, addr, bitmask, data);
  145. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  146. PHY_StoreTxPowerByRate(dm->adapter, band, rf_path, tx_num, addr, bitmask, data);
  147. #endif
  148. PHYDM_DBG(dm, ODM_COMP_INIT,
  149. "===> odm_config_bb_with_header_file: [PHY_REG] %08X %08X %08X\n",
  150. addr, bitmask, data);
  151. }
  152. void odm_config_bb_phy_8821c(struct dm_struct *dm, u32 addr, u32 bitmask,
  153. u32 data)
  154. {
  155. if (dm->fw_offload_ability & PHYDM_PHY_PARAM_OFFLOAD) {
  156. u32 delay_time = 0;
  157. if (addr >= 0xf9 && addr <= 0xfe) {
  158. if (addr == 0xfe || addr == 0xfb)
  159. delay_time = 50;
  160. else if (addr == 0xfd || addr == 0xfa)
  161. delay_time = 5;
  162. else
  163. delay_time = 1;
  164. if (addr >= 0xfc && addr <= 0xfe)
  165. phydm_set_reg_by_fw(dm,
  166. PHYDM_HALMAC_CMD_DELAY_MS,
  167. addr,
  168. data,
  169. bitmask,
  170. (enum rf_path)0,
  171. delay_time);
  172. else
  173. phydm_set_reg_by_fw(dm,
  174. PHYDM_HALMAC_CMD_DELAY_US,
  175. addr,
  176. data,
  177. bitmask,
  178. (enum rf_path)0,
  179. delay_time);
  180. } else {
  181. phydm_set_reg_by_fw(dm,
  182. PHYDM_HALMAC_CMD_BB_W32,
  183. addr,
  184. data,
  185. bitmask,
  186. (enum rf_path)0,
  187. 0);
  188. }
  189. } else {
  190. if (addr == 0xfe)
  191. #ifdef CONFIG_LONG_DELAY_ISSUE
  192. ODM_sleep_ms(50);
  193. #else
  194. ODM_delay_ms(50);
  195. #endif
  196. else if (addr == 0xfd)
  197. ODM_delay_ms(5);
  198. else if (addr == 0xfc)
  199. ODM_delay_ms(1);
  200. else if (addr == 0xfb)
  201. ODM_delay_us(50);
  202. else if (addr == 0xfa)
  203. ODM_delay_us(5);
  204. else if (addr == 0xf9)
  205. ODM_delay_us(1);
  206. else
  207. odm_set_bb_reg(dm, addr, bitmask, data);
  208. }
  209. PHYDM_DBG(dm, ODM_COMP_INIT, "===> config_bb: [PHY_REG] %08X %08X\n",
  210. addr, data);
  211. }
  212. void odm_config_bb_txpwr_lmt_8821c(struct dm_struct *dm, u8 *regulation,
  213. u8 *band, u8 *bandwidth, u8 *rate_section,
  214. u8 *rf_path, u8 *channel, u8 *power_limit)
  215. {
  216. #if (DM_ODM_SUPPORT_TYPE & ODM_CE)
  217. phy_set_tx_power_limit(dm, regulation, band,
  218. bandwidth, rate_section, rf_path, channel, power_limit);
  219. #elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  220. PHY_SetTxPowerLimit(dm, regulation, band,
  221. bandwidth, rate_section, rf_path, channel, power_limit);
  222. #endif
  223. }
  224. #endif