phydm_mp.c 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  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. /*@************************************************************
  26. * include files
  27. ************************************************************/
  28. #include "mp_precomp.h"
  29. #include "phydm_precomp.h"
  30. #ifdef PHYDM_MP_SUPPORT
  31. #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
  32. void phydm_mp_set_single_tone_jgr3(void *dm_void, boolean is_single_tone,
  33. u8 path)
  34. {
  35. struct dm_struct *dm = (struct dm_struct *)dm_void;
  36. struct phydm_mp *mp = &dm->dm_mp_table;
  37. u8 start = RF_PATH_A, end = RF_PATH_A;
  38. switch (path) {
  39. case RF_PATH_A:
  40. case RF_PATH_B:
  41. case RF_PATH_C:
  42. case RF_PATH_D:
  43. start = path;
  44. end = path;
  45. break;
  46. case RF_PATH_AB:
  47. start = RF_PATH_A;
  48. end = RF_PATH_B;
  49. break;
  50. case RF_PATH_BC:
  51. start = RF_PATH_B;
  52. end = RF_PATH_C;
  53. break;
  54. case RF_PATH_ABC:
  55. start = RF_PATH_A;
  56. end = RF_PATH_C;
  57. break;
  58. case RF_PATH_BCD:
  59. start = RF_PATH_B;
  60. end = RF_PATH_D;
  61. break;
  62. case RF_PATH_ABCD:
  63. start = RF_PATH_A;
  64. end = RF_PATH_D;
  65. break;
  66. }
  67. if (is_single_tone) {
  68. mp->rf_reg0 = odm_get_rf_reg(dm, RF_PATH_A, RF_0x00, 0xfffff);
  69. #if 0
  70. mp->rfe_sel_a_0 = odm_get_bb_reg(dm, R_0x1840, MASKDWORD);
  71. mp->rfe_sel_b_0 = odm_get_bb_reg(dm, R_0x4140, MASKDWORD);
  72. mp->rfe_sel_c_0 = odm_get_bb_reg(dm, R_0x5240, MASKDWORD);
  73. mp->rfe_sel_d_0 = odm_get_bb_reg(dm, R_0x5340, MASKDWORD);
  74. mp->rfe_sel_a_1 = odm_get_bb_reg(dm, R_0x1844, MASKDWORD);
  75. mp->rfe_sel_b_1 = odm_get_bb_reg(dm, R_0x4144, MASKDWORD);
  76. mp->rfe_sel_c_1 = odm_get_bb_reg(dm, R_0x5244, MASKDWORD);
  77. mp->rfe_sel_d_1 = odm_get_bb_reg(dm, R_0x5344, MASKDWORD);
  78. #endif
  79. /* Disable CCK and OFDM */
  80. odm_set_bb_reg(dm, R_0x1c3c, 0x3, 0x0);
  81. if (!(dm->support_ic_type & ODM_RTL8814B)) {
  82. for (start; start <= end; start++) {
  83. /* Tx mode: RF0x00[19:16]=4'b0010 */
  84. odm_set_rf_reg(dm, start, RF_0x00, 0xF0000,
  85. 0x2);
  86. /* Lowest RF gain idx: RF_0x0[4:0] = 0 */
  87. odm_set_rf_reg(dm, start, RF_0x00, 0x1F, 0x0);
  88. /* RF LO enabled */
  89. odm_set_rf_reg(dm, start, RF_0x58, BIT(1),
  90. 0x1);
  91. }
  92. }
  93. } else {
  94. /* Eable CCK and OFDM */
  95. odm_set_bb_reg(dm, R_0x1c3c, 0x3, 0x3);
  96. if (!(dm->support_ic_type & ODM_RTL8814B)) {
  97. for (start; start <= end; start++) {
  98. odm_set_rf_reg(dm, start, RF_0x00, 0xfffff,
  99. mp->rf_reg0);
  100. /* RF LO disabled */
  101. odm_set_rf_reg(dm, start, RF_0x58, BIT(1),
  102. 0x0);
  103. }
  104. }
  105. #if 0
  106. odm_set_bb_reg(dm, R_0x1840, MASKDWORD, mp->rfe_sel_a_0);
  107. odm_set_bb_reg(dm, R_0x4140, MASKDWORD, mp->rfe_sel_b_0);
  108. odm_set_bb_reg(dm, R_0x5240, MASKDWORD, mp->rfe_sel_c_0);
  109. odm_set_bb_reg(dm, R_0x5340, MASKDWORD, mp->rfe_sel_d_0);
  110. odm_set_bb_reg(dm, R_0x1844, MASKDWORD, mp->rfe_sel_a_1);
  111. odm_set_bb_reg(dm, R_0x4144, MASKDWORD, mp->rfe_sel_b_1);
  112. odm_set_bb_reg(dm, R_0x5244, MASKDWORD, mp->rfe_sel_c_1);
  113. odm_set_bb_reg(dm, R_0x5344, MASKDWORD, mp->rfe_sel_d_1);
  114. #endif
  115. }
  116. }
  117. void phydm_mp_set_carrier_supp_jgr3(void *dm_void, boolean is_carrier_supp,
  118. u32 rate_index)
  119. {
  120. struct dm_struct *dm = (struct dm_struct *)dm_void;
  121. struct phydm_mp *mp = &dm->dm_mp_table;
  122. if (is_carrier_supp) {
  123. if (phydm_is_cck_rate(dm, (u8)rate_index)) {
  124. /* @if CCK block on? */
  125. if (!odm_get_bb_reg(dm, R_0x1c3c, BIT(1)))
  126. odm_set_bb_reg(dm, R_0x1c3c, BIT(1), 1);
  127. /* @Turn Off All Test mode */
  128. odm_set_bb_reg(dm, R_0x1ca4, 0x7, 0x0);
  129. /* @transmit mode */
  130. odm_set_bb_reg(dm, R_0x1a00, 0x3, 0x2);
  131. /* @turn off scramble setting */
  132. odm_set_bb_reg(dm, R_0x1a00, 0x8, 0x0);
  133. /* @Set CCK Tx Test Rate, set FTxRate to 1Mbps */
  134. odm_set_bb_reg(dm, R_0x1a00, 0x3000, 0x0);
  135. }
  136. } else { /* @Stop Carrier Suppression. */
  137. if (phydm_is_cck_rate(dm, (u8)rate_index)) {
  138. /* @normal mode */
  139. odm_set_bb_reg(dm, R_0x1a00, 0x3, 0x0);
  140. /* @turn on scramble setting */
  141. odm_set_bb_reg(dm, R_0x1a00, 0x8, 0x1);
  142. /* @BB Reset */
  143. odm_set_bb_reg(dm, R_0x1d0c, 0x10000, 0x0);
  144. odm_set_bb_reg(dm, R_0x1d0c, 0x10000, 0x1);
  145. }
  146. }
  147. }
  148. #endif
  149. void phydm_mp_set_crystal_cap(void *dm_void, u8 crystal_cap)
  150. {
  151. struct dm_struct *dm = (struct dm_struct *)dm_void;
  152. phydm_set_crystal_cap(dm, crystal_cap);
  153. }
  154. void phydm_mp_set_single_tone(void *dm_void, boolean is_single_tone, u8 path)
  155. {
  156. struct dm_struct *dm = (struct dm_struct *)dm_void;
  157. if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
  158. phydm_mp_set_single_tone_jgr3(dm, is_single_tone, path);
  159. }
  160. void phydm_mp_set_carrier_supp(void *dm_void, boolean is_carrier_supp,
  161. u32 rate_index)
  162. {
  163. struct dm_struct *dm = (struct dm_struct *)dm_void;
  164. if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
  165. phydm_mp_set_carrier_supp_jgr3(dm, is_carrier_supp, rate_index);
  166. }
  167. void phydm_mp_set_single_carrier(void *dm_void, boolean is_single_carrier)
  168. {
  169. struct dm_struct *dm = (struct dm_struct *)dm_void;
  170. struct phydm_mp *mp = &dm->dm_mp_table;
  171. if (is_single_carrier) {
  172. if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
  173. /* @1. if OFDM block on? */
  174. if (!odm_get_bb_reg(dm, R_0x1c3c, BIT(0)))
  175. odm_set_bb_reg(dm, R_0x1c3c, BIT(0), 1);
  176. /* @2. set CCK test mode off, set to CCK normal mode */
  177. odm_set_bb_reg(dm, R_0x1a00, 0x3, 0);
  178. /* @3. turn on scramble setting */
  179. odm_set_bb_reg(dm, R_0x1a00, 0x8, 1);
  180. /* @4. Turn On single carrier. */
  181. odm_set_bb_reg(dm, R_0x1ca4, 0x7, OFDM_SINGLE_CARRIER);
  182. } else {
  183. /* @1. if OFDM block on? */
  184. if (!odm_get_bb_reg(dm, R_0x800, 0x2000000))
  185. odm_set_bb_reg(dm, R_0x800, 0x2000000, 1);
  186. /* @2. set CCK test mode off, set to CCK normal mode */
  187. odm_set_bb_reg(dm, R_0xa00, 0x3, 0);
  188. /* @3. turn on scramble setting */
  189. odm_set_bb_reg(dm, R_0xa00, 0x8, 1);
  190. /* @4. Turn On single carrier. */
  191. if (dm->support_ic_type & ODM_IC_11AC_SERIES)
  192. odm_set_bb_reg(dm, R_0x914, 0x70000,
  193. OFDM_SINGLE_CARRIER);
  194. else if (dm->support_ic_type & ODM_IC_11N_SERIES)
  195. odm_set_bb_reg(dm, R_0xd00, 0x70000000,
  196. OFDM_SINGLE_CARRIER);
  197. }
  198. } else { /* @Stop Single Carrier. */
  199. /* @Turn off all test modes. */
  200. if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
  201. odm_set_bb_reg(dm, R_0x1ca4, 0x7, OFDM_OFF);
  202. else if (dm->support_ic_type & ODM_IC_11AC_SERIES)
  203. odm_set_bb_reg(dm, R_0x914, 0x70000, OFDM_OFF);
  204. else if (dm->support_ic_type & ODM_IC_11N_SERIES)
  205. odm_set_bb_reg(dm, R_0xd00, 0x70000000, OFDM_OFF);
  206. /* @Delay 10 ms */
  207. ODM_delay_ms(10);
  208. /* @BB Reset */
  209. if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
  210. odm_set_bb_reg(dm, R_0x1d0c, 0x10000, 0x0);
  211. odm_set_bb_reg(dm, R_0x1d0c, 0x10000, 0x1);
  212. } else {
  213. odm_set_bb_reg(dm, R_0x100, 0x100, 0x0);
  214. odm_set_bb_reg(dm, R_0x100, 0x100, 0x1);
  215. }
  216. }
  217. }
  218. void phydm_mp_reset_rx_counters_phy(void *dm_void)
  219. {
  220. struct dm_struct *dm = (struct dm_struct *)dm_void;
  221. if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
  222. odm_set_bb_reg(dm, R_0x1eb4, BIT(25), 0x1);
  223. odm_set_bb_reg(dm, R_0x1eb4, BIT(25), 0x0);
  224. } else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
  225. odm_set_bb_reg(dm, R_0xb58, BIT(0), 0x1);
  226. odm_set_bb_reg(dm, R_0xb58, BIT(0), 0x0);
  227. } else if (dm->support_ic_type & ODM_IC_11N_SERIES){
  228. odm_set_bb_reg(dm, R_0xf14, BIT(16), 0x1);
  229. odm_set_bb_reg(dm, R_0xf14, BIT(16), 0x0);
  230. }
  231. }
  232. void phydm_mp_get_tx_ok(void *dm_void, u32 rate_index)
  233. {
  234. struct dm_struct *dm = (struct dm_struct *)dm_void;
  235. struct phydm_mp *mp = &dm->dm_mp_table;
  236. u32 reg = 0;
  237. if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
  238. reg = R_0x2de4;
  239. else
  240. reg = R_0xf50;
  241. if (phydm_is_cck_rate(dm, (u8)rate_index))
  242. mp->tx_phy_ok_cnt = odm_get_bb_reg(dm, reg, 0xffff);
  243. else
  244. mp->tx_phy_ok_cnt = odm_get_bb_reg(dm, reg, 0xffff0000);
  245. }
  246. void phydm_mp_get_rx_ok(void *dm_void)
  247. {
  248. struct dm_struct *dm = (struct dm_struct *)dm_void;
  249. struct phydm_mp *mp = &dm->dm_mp_table;
  250. u32 cck_ok = 0, ofdm_ok = 0, ht_ok = 0, vht_ok = 0;
  251. u32 cck_err = 0, ofdm_err = 0, ht_err = 0, vht_err = 0;
  252. if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
  253. cck_ok = odm_get_bb_reg(dm, R_0x2c04, 0xffff);
  254. ofdm_ok = odm_get_bb_reg(dm, R_0x2c14, 0xffff);
  255. ht_ok = odm_get_bb_reg(dm, R_0x2c10, 0xffff);
  256. vht_ok = odm_get_bb_reg(dm, R_0x2c0c, 0xffff);
  257. cck_err = odm_get_bb_reg(dm, R_0x2c04, 0xffff0000);
  258. ofdm_err = odm_get_bb_reg(dm, R_0x2c14, 0xffff0000);
  259. ht_err = odm_get_bb_reg(dm, R_0x2c10, 0xffff0000);
  260. vht_err = odm_get_bb_reg(dm, R_0x2c0c, 0xffff0000);
  261. } else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
  262. cck_ok = odm_get_bb_reg(dm, R_0xf04, 0x3FFF);
  263. ofdm_ok = odm_get_bb_reg(dm, R_0xf14, 0x3FFF);
  264. ht_ok = odm_get_bb_reg(dm, R_0xf10, 0x3FFF);
  265. vht_ok = odm_get_bb_reg(dm, R_0xf0c, 0x3FFF);
  266. cck_err = odm_get_bb_reg(dm, R_0xf04, 0x3FFF0000);
  267. ofdm_err = odm_get_bb_reg(dm, R_0xf14, 0x3FFF0000);
  268. ht_err = odm_get_bb_reg(dm, R_0xf10, 0x3FFF0000);
  269. vht_err = odm_get_bb_reg(dm, R_0xf0c, 0x3FFF0000);
  270. } else if (dm->support_ic_type & ODM_IC_11N_SERIES) {
  271. cck_ok = odm_get_bb_reg(dm, R_0xf88, MASKDWORD);
  272. ofdm_ok = odm_get_bb_reg(dm, R_0xf94, 0xffff);
  273. ht_ok = odm_get_bb_reg(dm, R_0xf90, 0xffff);
  274. cck_err = odm_get_bb_reg(dm, R_0xf84, MASKDWORD);
  275. ofdm_err = odm_get_bb_reg(dm, R_0xf94, 0xffff0000);
  276. ht_err = odm_get_bb_reg(dm, R_0xf90, 0xffff0000);
  277. }
  278. mp->rx_phy_ok_cnt = cck_ok + ofdm_ok + ht_ok + vht_ok;
  279. mp->rx_phy_crc_err_cnt = cck_err + ofdm_err + ht_err + vht_err;
  280. mp->io_value = (u32)mp->rx_phy_ok_cnt;
  281. }
  282. #endif