phydm_hal_api8821c.c 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249
  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. #include "mp_precomp.h"
  21. #include "../phydm_precomp.h"
  22. #if (RTL8821C_SUPPORT == 1)
  23. /* ======================================================================== */
  24. /* These following functions can be used for PHY DM only*/
  25. u32 reg82c_8821c;
  26. u32 reg838_8821c;
  27. u32 reg830_8821c;
  28. u32 rega24_8821c;
  29. u32 rega28_8821c;
  30. u32 regaac_8821c;
  31. enum odm_bw_e bw_8821c;
  32. u8 central_ch_8821c;
  33. boolean
  34. phydm_rfe_8821c(
  35. struct PHY_DM_STRUCT *p_dm_odm,
  36. u8 channel
  37. )
  38. {
  39. #if 0
  40. /* Efuse is not wrote now */
  41. /* Need to check RFE type finally */
  42. /*if (p_dm_odm->rfe_type == 1) {*/
  43. if (channel <= 14) {
  44. /* signal source */
  45. odm_set_bb_reg(p_dm_odm, 0xcb0, (MASKBYTE2 | MASKLWORD), 0x704570);
  46. odm_set_bb_reg(p_dm_odm, 0xeb0, (MASKBYTE2 | MASKLWORD), 0x704570);
  47. odm_set_bb_reg(p_dm_odm, 0xcb4, MASKBYTE1, 0x45);
  48. odm_set_bb_reg(p_dm_odm, 0xeb4, MASKBYTE1, 0x45);
  49. } else if (channel > 35) {
  50. odm_set_bb_reg(p_dm_odm, 0xcb0, (MASKBYTE2 | MASKLWORD), 0x174517);
  51. odm_set_bb_reg(p_dm_odm, 0xeb0, (MASKBYTE2 | MASKLWORD), 0x174517);
  52. odm_set_bb_reg(p_dm_odm, 0xcb4, MASKBYTE1, 0x45);
  53. odm_set_bb_reg(p_dm_odm, 0xeb4, MASKBYTE1, 0x45);
  54. } else
  55. return false;
  56. /* chip top mux */
  57. odm_set_bb_reg(p_dm_odm, 0x64, BIT(29) | BIT(28), 0x3);
  58. odm_set_bb_reg(p_dm_odm, 0x4c, BIT(26) | BIT(25), 0x0);
  59. odm_set_bb_reg(p_dm_odm, 0x40, BIT(2), 0x1);
  60. /* from s0 or s1 */
  61. odm_set_bb_reg(p_dm_odm, 0x1990, (BIT(5) | BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0)), 0x30);
  62. odm_set_bb_reg(p_dm_odm, 0x1990, (BIT(11) | BIT(10)), 0x3);
  63. /* input or output */
  64. odm_set_bb_reg(p_dm_odm, 0x974, (BIT(5) | BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0)), 0x3f);
  65. odm_set_bb_reg(p_dm_odm, 0x974, (BIT(11) | BIT(10)), 0x3);
  66. /* delay 400ns for PAPE */
  67. odm_set_bb_reg(p_dm_odm, 0x810, MASKBYTE3 | BIT(20) | BIT(21) | BIT(22) | BIT(23), 0x211);
  68. /* antenna switch table */
  69. odm_set_bb_reg(p_dm_odm, 0xca0, MASKLWORD, 0xa555);
  70. odm_set_bb_reg(p_dm_odm, 0xea0, MASKLWORD, 0xa555);
  71. /* inverse or not */
  72. odm_set_bb_reg(p_dm_odm, 0xcbc, (BIT(5) | BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0)), 0x0);
  73. odm_set_bb_reg(p_dm_odm, 0xcbc, (BIT(11) | BIT(10)), 0x0);
  74. odm_set_bb_reg(p_dm_odm, 0xebc, (BIT(5) | BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0)), 0x0);
  75. odm_set_bb_reg(p_dm_odm, 0xebc, (BIT(11) | BIT(10)), 0x0);
  76. /*}*/
  77. #endif
  78. return true;
  79. }
  80. void
  81. phydm_ccapar_8821c(
  82. struct PHY_DM_STRUCT *p_dm_odm
  83. )
  84. {
  85. #if 0
  86. u32 cca_ifem[9][4] = {
  87. /*20M*/
  88. {0x75D97010, 0x75D97010, 0x75D97010, 0x75D97010}, /*Reg82C*/
  89. {0x00000000, 0x00000000, 0x00000000, 0x00000000}, /*Reg830*/
  90. {0x00000000, 0x00000000, 0x00000000, 0x00000000}, /*Reg838*/
  91. /*40M*/
  92. {0x75D97010, 0x75D97010, 0x75D97010, 0x75D97010}, /*Reg82C*/
  93. {0x00000000, 0x79a0ea28, 0x00000000, 0x79a0ea28}, /*Reg830*/
  94. {0x87765541, 0x87766341, 0x87765541, 0x87766341}, /*Reg838*/
  95. /*80M*/
  96. {0x75D97010, 0x75D97010, 0x75D97010, 0x75D97010}, /*Reg82C*/
  97. {0x00000000, 0x00000000, 0x00000000, 0x00000000}, /*Reg830*/
  98. {0x00000000, 0x87746641, 0x00000000, 0x87746641}
  99. }; /*Reg838*/
  100. u32 cca_efem[9][4] = {
  101. /*20M*/
  102. {0x75A76010, 0x75A76010, 0x75A76010, 0x75A75010}, /*Reg82C*/
  103. {0x00000000, 0x00000000, 0x00000000, 0x00000000}, /*Reg830*/
  104. {0x87766651, 0x87766431, 0x87766451, 0x87766431}, /*Reg838*/
  105. /*40M*/
  106. {0x75A75010, 0x75A75010, 0x75A75010, 0x75A75010}, /*Reg82C*/
  107. {0x00000000, 0x00000000, 0x00000000, 0x00000000}, /*Reg830*/
  108. {0x87766431, 0x87766431, 0x87766431, 0x87766431}, /*Reg838*/
  109. /*80M*/
  110. {0x75BA7010, 0x75BA7010, 0x75BA7010, 0x75BA7010}, /*Reg82C*/
  111. {0x00000000, 0x00000000, 0x00000000, 0x00000000}, /*Reg830*/
  112. {0x87766431, 0x87766431, 0x87766431, 0x87766431}
  113. }; /*Reg838*/
  114. u8 row, col;
  115. u32 reg82c, reg830, reg838;
  116. if (p_dm_odm->cut_version != ODM_CUT_B)
  117. return;
  118. if (bw_8821c == ODM_BW20M)
  119. row = 0;
  120. else if (bw_8821c == ODM_BW40M)
  121. row = 3;
  122. else
  123. row = 6;
  124. if (central_ch_8821c <= 14) {
  125. if ((p_dm_odm->rx_ant_status == ODM_RF_A) || (p_dm_odm->rx_ant_status == ODM_RF_B))
  126. col = 0;
  127. else
  128. col = 1;
  129. } else {
  130. if ((p_dm_odm->rx_ant_status == ODM_RF_A) || (p_dm_odm->rx_ant_status == ODM_RF_B))
  131. col = 2;
  132. else
  133. col = 3;
  134. }
  135. if (p_dm_odm->rfe_type == 0) {/*iFEM*/
  136. reg82c = (cca_ifem[row][col] != 0) ? cca_ifem[row][col] : reg82c_8821c;
  137. reg830 = (cca_ifem[row + 1][col] != 0) ? cca_ifem[row + 1][col] : reg830_8821c;
  138. reg838 = (cca_ifem[row + 2][col] != 0) ? cca_ifem[row + 2][col] : reg838_8821c;
  139. } else {/*eFEM*/
  140. reg82c = (cca_efem[row][col] != 0) ? cca_efem[row][col] : reg82c_8821c;
  141. reg830 = (cca_efem[row + 1][col] != 0) ? cca_efem[row + 1][col] : reg830_8821c;
  142. reg838 = (cca_efem[row + 2][col] != 0) ? cca_efem[row + 2][col] : reg838_8821c;
  143. }
  144. odm_set_bb_reg(p_dm_odm, 0x82c, MASKDWORD, reg82c);
  145. odm_set_bb_reg(p_dm_odm, 0x830, MASKDWORD, reg830);
  146. odm_set_bb_reg(p_dm_odm, 0x838, MASKDWORD, reg838);
  147. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: Update CCA parameters for Bcut (Pkt%d, Intf%d, RFE%d), row = %d, col = %d\n",
  148. __func__, p_dm_odm->package_type, p_dm_odm->support_interface, p_dm_odm->rfe_type, row, col));
  149. #endif
  150. }
  151. void
  152. phydm_ccapar_by_bw_8821c(
  153. struct PHY_DM_STRUCT *p_dm_odm,
  154. enum odm_bw_e bandwidth
  155. )
  156. {
  157. #if 0
  158. u32 reg82c;
  159. if (p_dm_odm->cut_version != ODM_CUT_A)
  160. return;
  161. /* A-cut */
  162. reg82c = odm_get_bb_reg(p_dm_odm, 0x82c, MASKDWORD);
  163. if (bandwidth == ODM_BW20M) {
  164. /* 82c[15:12] = 4 */
  165. /* 82c[27:24] = 6 */
  166. reg82c &= (~(0x0f00f000));
  167. reg82c |= ((0x4) << 12);
  168. reg82c |= ((0x6) << 24);
  169. } else if (bandwidth == ODM_BW40M) {
  170. /* 82c[19:16] = 9 */
  171. /* 82c[27:24] = 6 */
  172. reg82c &= (~(0x0f0f0000));
  173. reg82c |= ((0x9) << 16);
  174. reg82c |= ((0x6) << 24);
  175. } else if (bandwidth == ODM_BW80M) {
  176. /* 82c[15:12] 7 */
  177. /* 82c[19:16] b */
  178. /* 82c[23:20] d */
  179. /* 82c[27:24] 3 */
  180. reg82c &= (~(0x0ffff000));
  181. reg82c |= ((0xdb7) << 12);
  182. reg82c |= ((0x3) << 24);
  183. }
  184. odm_set_bb_reg(p_dm_odm, 0x82c, MASKDWORD, reg82c);
  185. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: Update CCA parameters for Acut\n", __func__));
  186. #endif
  187. }
  188. void
  189. phydm_ccapar_by_rxpath_8821c(
  190. struct PHY_DM_STRUCT *p_dm_odm
  191. )
  192. {
  193. #if 0
  194. if (p_dm_odm->cut_version != ODM_CUT_A)
  195. return;
  196. if ((p_dm_odm->rx_ant_status == ODM_RF_A) || (p_dm_odm->rx_ant_status == ODM_RF_B)) {
  197. /* 838[7:4] = 8 */
  198. /* 838[11:8] = 7 */
  199. /* 838[15:12] = 6 */
  200. /* 838[19:16] = 7 */
  201. /* 838[23:20] = 7 */
  202. /* 838[27:24] = 7 */
  203. odm_set_bb_reg(p_dm_odm, 0x838, 0x0ffffff0, 0x777678);
  204. } else {
  205. /* 838[7:4] = 3 */
  206. /* 838[11:8] = 3 */
  207. /* 838[15:12] = 6 */
  208. /* 838[19:16] = 6 */
  209. /* 838[23:20] = 7 */
  210. /* 838[27:24] = 7 */
  211. odm_set_bb_reg(p_dm_odm, 0x838, 0x0ffffff0, 0x776633);
  212. }
  213. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: Update CCA parameters for Acut\n", __func__));
  214. #endif
  215. }
  216. void
  217. phydm_rxdfirpar_by_bw_8821c(
  218. struct PHY_DM_STRUCT *p_dm_odm,
  219. enum odm_bw_e bandwidth
  220. )
  221. {
  222. if (bandwidth == ODM_BW40M) {
  223. /* RX DFIR for BW40 */
  224. odm_set_bb_reg(p_dm_odm, 0x948, BIT(29) | BIT(28), 0x2);
  225. odm_set_bb_reg(p_dm_odm, 0x94c, BIT(29) | BIT(28), 0x2);
  226. odm_set_bb_reg(p_dm_odm, 0xc20, BIT(31), 0x0);
  227. odm_set_bb_reg(p_dm_odm, 0x8f0, BIT(31), 0x0);
  228. } else if (bandwidth == ODM_BW80M) {
  229. /* RX DFIR for BW80 */
  230. odm_set_bb_reg(p_dm_odm, 0x948, BIT(29) | BIT(28), 0x2);
  231. odm_set_bb_reg(p_dm_odm, 0x94c, BIT(29) | BIT(28), 0x1);
  232. odm_set_bb_reg(p_dm_odm, 0xc20, BIT(31), 0x0);
  233. odm_set_bb_reg(p_dm_odm, 0x8f0, BIT(31), 0x1);
  234. } else {
  235. /* RX DFIR for BW20, BW10 and BW5*/
  236. odm_set_bb_reg(p_dm_odm, 0x948, BIT(29) | BIT(28), 0x2);
  237. odm_set_bb_reg(p_dm_odm, 0x94c, BIT(29) | BIT(28), 0x2);
  238. odm_set_bb_reg(p_dm_odm, 0xc20, BIT(31), 0x1);
  239. odm_set_bb_reg(p_dm_odm, 0x8f0, BIT(31), 0x0);
  240. }
  241. }
  242. boolean
  243. phydm_write_txagc_1byte_8821c(
  244. struct PHY_DM_STRUCT *p_dm_odm,
  245. u32 power_index,
  246. enum odm_rf_radio_path_e path,
  247. u8 hw_rate
  248. )
  249. {
  250. u32 offset_txagc[2] = {0x1d00, 0x1d80};
  251. u8 rate_idx = (hw_rate & 0xfc), i;
  252. u8 rate_offset = (hw_rate & 0x3);
  253. u32 rate_mask = (0xff << (rate_offset << 3));
  254. u32 txagc_content = 0x0;
  255. /* For debug command only!!!! */
  256. /* Error handling */
  257. if ((path > ODM_RF_PATH_A) || (hw_rate > 0x53)) {
  258. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: unsupported path (%d)\n", __func__, path));
  259. return false;
  260. }
  261. #if 1
  262. /* For HW limitation, We can't write TXAGC once a byte. */
  263. for (i = 0; i < 4; i++) {
  264. if (i != rate_offset)
  265. txagc_content = txagc_content | (config_phydm_read_txagc_8821c(p_dm_odm, path, rate_idx + i) << (i << 3));
  266. else
  267. txagc_content = txagc_content | ((power_index & 0x3f) << (i << 3));
  268. }
  269. odm_set_bb_reg(p_dm_odm, (offset_txagc[path] + rate_idx), MASKDWORD, txagc_content);
  270. #else
  271. odm_write_1byte(p_dm_odm, (offset_txagc[path] + hw_rate), (power_index & 0x3f));
  272. #endif
  273. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: path-%d rate index 0x%x (0x%x) = 0x%x\n",
  274. __func__, path, hw_rate, (offset_txagc[path] + hw_rate), power_index));
  275. return true;
  276. }
  277. void
  278. phydm_init_hw_info_by_rfe_type_8821c(
  279. struct PHY_DM_STRUCT *p_dm_odm
  280. )
  281. {
  282. p_dm_odm->is_init_hw_info_by_rfe = false;
  283. /*2.4G default rf set with wlg or btg*/
  284. if (p_dm_odm->rfe_type == 2 || p_dm_odm->rfe_type == 4 || p_dm_odm->rfe_type == 7)
  285. p_dm_odm->default_rf_set_8821c = SWITCH_TO_BTG;
  286. else if (p_dm_odm->rfe_type == 0 || p_dm_odm->rfe_type == 1 || p_dm_odm->rfe_type == 3 || p_dm_odm->rfe_type == 5 || p_dm_odm->rfe_type == 6)
  287. p_dm_odm->default_rf_set_8821c = SWITCH_TO_WLG;
  288. else if (p_dm_odm->rfe_type == 0x22 || p_dm_odm->rfe_type == 0x24 || p_dm_odm->rfe_type == 0x27) {
  289. p_dm_odm->default_rf_set_8821c = SWITCH_TO_BTG;
  290. odm_cmn_info_init(p_dm_odm, ODM_CMNINFO_PACKAGE_TYPE, 1);
  291. } else if (p_dm_odm->rfe_type == 0x20 || p_dm_odm->rfe_type == 0x21 || p_dm_odm->rfe_type == 0x23 || p_dm_odm->rfe_type == 0x25 || p_dm_odm->rfe_type == 0x26) {
  292. p_dm_odm->default_rf_set_8821c = SWITCH_TO_WLG;
  293. odm_cmn_info_init(p_dm_odm, ODM_CMNINFO_PACKAGE_TYPE, 1);
  294. }
  295. if (p_dm_odm->rfe_type == 3 || p_dm_odm->rfe_type == 4 || p_dm_odm->rfe_type == 0x23 || p_dm_odm->rfe_type == 0x24)
  296. p_dm_odm->default_ant_num_8821c = SWITCH_TO_ANT2;
  297. else
  298. p_dm_odm->default_ant_num_8821c = SWITCH_TO_ANT1;
  299. p_dm_odm->is_init_hw_info_by_rfe = true;
  300. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("%s: RFE type (%d), rf set (%s)\n", __FUNCTION__, p_dm_odm->rfe_type, (p_dm_odm->default_rf_set_8821c == 0 ? "BTG" : "WLG")));
  301. }
  302. void
  303. phydm_set_gnt_state_8821c(
  304. struct PHY_DM_STRUCT *p_dm_odm,
  305. boolean gnt_wl_state,
  306. boolean gnt_bt_state
  307. )
  308. {
  309. u32 gnt_val = 0;
  310. odm_set_mac_reg(p_dm_odm, 0x70, BIT(26), 0x1);
  311. if (gnt_wl_state)
  312. gnt_val = 0x3300;
  313. else
  314. gnt_val = 0x1100;
  315. if (gnt_bt_state)
  316. gnt_val = gnt_val | 0xcc00;
  317. else
  318. gnt_val = gnt_val | 0x4400;
  319. odm_set_mac_reg(p_dm_odm, 0x1704, MASKLWORD, gnt_val);
  320. ODM_delay_us(50); /*waiting before access 0x1700 */
  321. odm_set_mac_reg(p_dm_odm, 0x1700, MASKDWORD, 0xc00f0038);
  322. }
  323. /* ======================================================================== */
  324. /* ======================================================================== */
  325. /* These following functions can be used by driver*/
  326. u32
  327. config_phydm_read_rf_reg_8821c(
  328. struct PHY_DM_STRUCT *p_dm_odm,
  329. enum odm_rf_radio_path_e rf_path,
  330. u32 reg_addr,
  331. u32 bit_mask
  332. )
  333. {
  334. u32 readback_value, direct_addr;
  335. u32 offset_read_rf[2] = {0x2800, 0x2c00};
  336. u32 power_RF[2] = {0x1c, 0xec};
  337. /* Error handling.*/
  338. if (rf_path > ODM_RF_PATH_A) {
  339. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: unsupported path (%d)\n", __func__, rf_path));
  340. return INVALID_RF_DATA;
  341. }
  342. /* Error handling. Check if RF power is enable or not */
  343. /* 0xffffffff means RF power is disable */
  344. if (odm_get_mac_reg(p_dm_odm, power_RF[rf_path], MASKBYTE3) != 0x7) {
  345. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: Read fail, RF is disabled\n", __func__));
  346. return INVALID_RF_DATA;
  347. }
  348. /* Calculate offset */
  349. reg_addr &= 0xff;
  350. direct_addr = offset_read_rf[rf_path] + (reg_addr << 2);
  351. /* RF register only has 20bits */
  352. bit_mask &= RFREGOFFSETMASK;
  353. /* Read RF register directly */
  354. readback_value = odm_get_bb_reg(p_dm_odm, direct_addr, bit_mask);
  355. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: RF-%d 0x%x = 0x%x, bit mask = 0x%x\n",
  356. __func__, rf_path, reg_addr, readback_value, bit_mask));
  357. return readback_value;
  358. }
  359. boolean
  360. config_phydm_write_rf_reg_8821c(
  361. struct PHY_DM_STRUCT *p_dm_odm,
  362. enum odm_rf_radio_path_e rf_path,
  363. u32 reg_addr,
  364. u32 bit_mask,
  365. u32 data
  366. )
  367. {
  368. u32 data_and_addr = 0, data_original = 0;
  369. u32 offset_write_rf[2] = {0xc90, 0xe90};
  370. u32 power_RF[2] = {0x1c, 0xec};
  371. u8 bit_shift;
  372. /* Error handling.*/
  373. if (rf_path > ODM_RF_PATH_A) {
  374. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: unsupported path (%d)\n", __func__, rf_path));
  375. return false;
  376. }
  377. /* Read RF register content first */
  378. reg_addr &= 0xff;
  379. bit_mask = bit_mask & RFREGOFFSETMASK;
  380. if (bit_mask != RFREGOFFSETMASK) {
  381. data_original = config_phydm_read_rf_reg_8821c(p_dm_odm, rf_path, reg_addr, RFREGOFFSETMASK);
  382. /* Error handling. RF is disabled */
  383. if (config_phydm_read_rf_check_8821c(data_original) == false) {
  384. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: Write fail, RF is disable\n", __func__));
  385. return false;
  386. }
  387. /* check bit mask */
  388. if (bit_mask != 0xfffff) {
  389. for (bit_shift = 0; bit_shift <= 19; bit_shift++) {
  390. if (((bit_mask >> bit_shift) & 0x1) == 1)
  391. break;
  392. }
  393. data = ((data_original)&(~bit_mask)) | (data << bit_shift);
  394. }
  395. } else if (odm_get_mac_reg(p_dm_odm, power_RF[rf_path], MASKBYTE3) != 0x7) {
  396. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: Write fail, RF is disabled\n", __func__));
  397. return false;
  398. }
  399. /* Put write addr in [27:20] and write data in [19:00] */
  400. data_and_addr = ((reg_addr << 20) | (data & 0x000fffff)) & 0x0fffffff;
  401. /* Write operation */
  402. odm_set_bb_reg(p_dm_odm, offset_write_rf[rf_path], MASKDWORD, data_and_addr);
  403. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: RF-%d 0x%x = 0x%x (original: 0x%x), bit mask = 0x%x\n",
  404. __func__, rf_path, reg_addr, data, data_original, bit_mask));
  405. return true;
  406. }
  407. boolean
  408. config_phydm_write_txagc_8821c(
  409. struct PHY_DM_STRUCT *p_dm_odm,
  410. u32 power_index,
  411. enum odm_rf_radio_path_e path,
  412. u8 hw_rate
  413. )
  414. {
  415. u32 offset_txagc[2] = {0x1d00, 0x1d80};
  416. u8 rate_idx = (hw_rate & 0xfc), i;
  417. u32 txagc_content = 0x0;
  418. /* Input need to be HW rate index, not driver rate index!!!! */
  419. if (p_dm_odm->is_disable_phy_api) {
  420. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: disable PHY API for debug!!\n", __func__));
  421. return true;
  422. }
  423. /* Error handling */
  424. if ((path > ODM_RF_PATH_A) || (hw_rate > 0x53)) {
  425. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: unsupported path (%d)\n", __func__, path));
  426. return false;
  427. }
  428. /* driver need to construct a 4-byte power index */
  429. odm_set_bb_reg(p_dm_odm, (offset_txagc[path] + rate_idx), MASKDWORD, power_index);
  430. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: path-%d rate index 0x%x (0x%x) = 0x%x\n",
  431. __func__, path, hw_rate, (offset_txagc[path] + hw_rate), power_index));
  432. return true;
  433. }
  434. u8
  435. config_phydm_read_txagc_8821c(
  436. struct PHY_DM_STRUCT *p_dm_odm,
  437. enum odm_rf_radio_path_e path,
  438. u8 hw_rate
  439. )
  440. {
  441. u8 read_back_data;
  442. /* Input need to be HW rate index, not driver rate index!!!! */
  443. /* Error handling */
  444. if ((path > ODM_RF_PATH_A) || (hw_rate > 0x53)) {
  445. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: unsupported path (%d)\n", __func__, path));
  446. return INVALID_TXAGC_DATA;
  447. }
  448. /* Disable TX AGC report */
  449. odm_set_bb_reg(p_dm_odm, 0x1998, BIT(16), 0x0); /* need to check */
  450. /* Set data rate index (bit0~6) and path index (bit7) */
  451. odm_set_bb_reg(p_dm_odm, 0x1998, MASKBYTE0, (hw_rate | (path << 7)));
  452. /* Enable TXAGC report */
  453. odm_set_bb_reg(p_dm_odm, 0x1998, BIT(16), 0x1);
  454. /* Read TX AGC report */
  455. read_back_data = (u8)odm_get_bb_reg(p_dm_odm, 0xd30, 0x7f0000);
  456. /* Driver have to disable TXAGC report after reading TXAGC (ref. user guide v11) */
  457. odm_set_bb_reg(p_dm_odm, 0x1998, BIT(16), 0x0);
  458. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: path-%d rate index 0x%x = 0x%x\n", __func__, path, hw_rate, read_back_data));
  459. return read_back_data;
  460. }
  461. boolean
  462. config_phydm_switch_band_8821c(
  463. struct PHY_DM_STRUCT *p_dm_odm,
  464. u8 central_ch
  465. )
  466. {
  467. u32 rf_reg18;
  468. boolean rf_reg_status = true;
  469. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]======================>\n", __func__));
  470. if (p_dm_odm->is_disable_phy_api) {
  471. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: disable PHY API for debug!!\n", __func__));
  472. return true;
  473. }
  474. rf_reg18 = config_phydm_read_rf_reg_8821c(p_dm_odm, ODM_RF_PATH_A, 0x18, RFREGOFFSETMASK);
  475. rf_reg_status = rf_reg_status & config_phydm_read_rf_check_8821c(rf_reg18);
  476. if (central_ch <= 14) {
  477. /* 2.4G */
  478. /* Enable CCK block */
  479. odm_set_bb_reg(p_dm_odm, 0x808, BIT(28), 0x1);
  480. /* Disable MAC CCK check */
  481. odm_set_bb_reg(p_dm_odm, 0x454, BIT(7), 0x0);
  482. /* Disable BB CCK check */
  483. odm_set_bb_reg(p_dm_odm, 0xa80, BIT(18), 0x0);
  484. /*CCA Mask*/
  485. odm_set_bb_reg(p_dm_odm, 0x814, 0x0000FC00, 15); /*default value*/
  486. /* RF band */
  487. rf_reg18 = (rf_reg18 & (~(BIT(16) | BIT(9) | BIT(8))));
  488. /* Switch WLG/BTG*/
  489. if (p_dm_odm->default_rf_set_8821c == SWITCH_TO_BTG)
  490. config_phydm_switch_rf_set_8821c(p_dm_odm, SWITCH_TO_BTG);
  491. else if (p_dm_odm->default_rf_set_8821c == SWITCH_TO_WLG)
  492. config_phydm_switch_rf_set_8821c(p_dm_odm, SWITCH_TO_WLG);
  493. /*RF TXA_TANK LUT mode*/
  494. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0xdf, BIT(6), 0x1);
  495. /*RF TXA_PA_TANK*/
  496. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x64, 0x0000f, 0xf);
  497. } else if (central_ch > 35) {
  498. /* 5G */
  499. /* Enable BB CCK check */
  500. odm_set_bb_reg(p_dm_odm, 0xa80, BIT(18), 0x1);
  501. /* Enable CCK check */
  502. odm_set_bb_reg(p_dm_odm, 0x454, BIT(7), 0x1);
  503. /* Disable CCK block */
  504. odm_set_bb_reg(p_dm_odm, 0x808, BIT(28), 0x0);
  505. /*CCA Mask*/
  506. odm_set_bb_reg(p_dm_odm, 0x814, 0x0000FC00, 15); /*default value*/
  507. /*odm_set_bb_reg(p_dm_odm, 0x814, 0x0000FC00, 34); CCA mask = 13.6us*/
  508. /* RF band */
  509. rf_reg18 = (rf_reg18 & (~(BIT(16) | BIT(9) | BIT(8))));
  510. rf_reg18 = (rf_reg18 | BIT(8) | BIT(16));
  511. /* Switch WLA */
  512. config_phydm_switch_rf_set_8821c(p_dm_odm, SWITCH_TO_WLA);
  513. /*RF TXA_TANK LUT mode*/
  514. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0xdf, BIT(6), 0x0);
  515. } else {
  516. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: Fail to switch band (ch: %d)\n", __func__, central_ch));
  517. return false;
  518. }
  519. rf_reg_status = rf_reg_status & config_phydm_write_rf_reg_8821c(p_dm_odm, ODM_RF_PATH_A, 0x18, RFREGOFFSETMASK, rf_reg18);
  520. if (phydm_rfe_8821c(p_dm_odm, central_ch) == false)
  521. return false;
  522. if (rf_reg_status == false) {
  523. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: Fail to switch band (ch: %d), because writing RF register is fail\n", __func__, central_ch));
  524. return false;
  525. }
  526. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: Success to switch band (ch: %d)\n", __func__, central_ch));
  527. return true;
  528. }
  529. boolean
  530. config_phydm_switch_channel_8821c(
  531. struct PHY_DM_STRUCT *p_dm_odm,
  532. u8 central_ch
  533. )
  534. {
  535. struct _dynamic_initial_gain_threshold_ *p_dm_dig_table = &p_dm_odm->dm_dig_table;
  536. u32 rf_reg18, rf_reg_b8 = 0;
  537. boolean rf_reg_status = true;
  538. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]====================>\n", __func__));
  539. if (p_dm_odm->is_disable_phy_api) {
  540. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: disable PHY API for debug!!\n", __func__));
  541. return true;
  542. }
  543. central_ch_8821c = central_ch;
  544. rf_reg18 = config_phydm_read_rf_reg_8821c(p_dm_odm, ODM_RF_PATH_A, 0x18, RFREGOFFSETMASK);
  545. rf_reg_status = rf_reg_status & config_phydm_read_rf_check_8821c(rf_reg18);
  546. if (p_dm_odm->cut_version == ODM_CUT_A) {
  547. rf_reg_b8 = config_phydm_read_rf_reg_8821c(p_dm_odm, ODM_RF_PATH_A, 0xb8, RFREGOFFSETMASK);
  548. rf_reg_status = rf_reg_status & config_phydm_read_rf_check_8821c(rf_reg_b8);
  549. }
  550. /* Switch band and channel */
  551. if (central_ch <= 14) {
  552. /* 2.4G */
  553. /* 1. RF band and channel*/
  554. rf_reg18 = (rf_reg18 & (~(BIT(18) | BIT(17) | MASKBYTE0)));
  555. rf_reg18 = (rf_reg18 | central_ch);
  556. /* 2. AGC table selection */
  557. odm_set_bb_reg(p_dm_odm, 0xc1c, 0x00000F00, 0x0);
  558. p_dm_dig_table->agc_table_idx = 0x0;
  559. /* 3. Set central frequency for clock offset tracking */
  560. odm_set_bb_reg(p_dm_odm, 0x860, 0x1ffe0000, 0x96a);
  561. /* Fix A-cut LCK fail issue @ 5285MHz~5375MHz, 0xb8[19]=0x0 */
  562. if (p_dm_odm->cut_version == ODM_CUT_A)
  563. rf_reg_b8 = rf_reg_b8 | BIT(19);
  564. /* CCK TX filter parameters */
  565. if (central_ch == 14) {
  566. odm_set_bb_reg(p_dm_odm, 0xa24, MASKDWORD, 0x0000b81c);
  567. odm_set_bb_reg(p_dm_odm, 0xa28, MASKLWORD, 0x0000);
  568. odm_set_bb_reg(p_dm_odm, 0xaac, MASKDWORD, 0x00003667);
  569. } else {
  570. odm_set_bb_reg(p_dm_odm, 0xa24, MASKDWORD, rega24_8821c);
  571. odm_set_bb_reg(p_dm_odm, 0xa28, MASKLWORD, (rega28_8821c & MASKLWORD));
  572. odm_set_bb_reg(p_dm_odm, 0xaac, MASKDWORD, regaac_8821c);
  573. }
  574. } else if (central_ch > 35) {
  575. /* 5G */
  576. /* 1. RF band and channel*/
  577. rf_reg18 = (rf_reg18 & (~(BIT(18) | BIT(17) | MASKBYTE0)));
  578. rf_reg18 = (rf_reg18 | central_ch);
  579. if (central_ch >= 36 && central_ch <= 64)
  580. ;
  581. else if ((central_ch >= 100) && (central_ch <= 140))
  582. rf_reg18 = (rf_reg18 | BIT(17));
  583. else if (central_ch > 140)
  584. rf_reg18 = (rf_reg18 | BIT(18));
  585. else {
  586. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: Fail to switch channel (RF18) (ch: %d)\n", __func__, central_ch));
  587. return false;
  588. }
  589. /* 2. AGC table selection */
  590. if ((central_ch >= 36) && (central_ch <= 64)) {
  591. odm_set_bb_reg(p_dm_odm, 0xc1c, 0x00000F00, 0x1);
  592. p_dm_dig_table->agc_table_idx = 0x1;
  593. } else if ((central_ch >= 100) && (central_ch <= 144)) {
  594. odm_set_bb_reg(p_dm_odm, 0xc1c, 0x00000F00, 0x2);
  595. p_dm_dig_table->agc_table_idx = 0x2;
  596. } else if (central_ch >= 149) {
  597. odm_set_bb_reg(p_dm_odm, 0xc1c, 0x00000F00, 0x3);
  598. p_dm_dig_table->agc_table_idx = 0x3;
  599. } else {
  600. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: Fail to switch channel (AGC) (ch: %d)\n", __func__, central_ch));
  601. return false;
  602. }
  603. /* 3. Set central frequency for clock offset tracking */
  604. if ((central_ch >= 36) && (central_ch <= 48))
  605. odm_set_bb_reg(p_dm_odm, 0x860, 0x1ffe0000, 0x494);
  606. else if ((central_ch >= 52) && (central_ch <= 64))
  607. odm_set_bb_reg(p_dm_odm, 0x860, 0x1ffe0000, 0x453);
  608. else if ((central_ch >= 100) && (central_ch <= 116))
  609. odm_set_bb_reg(p_dm_odm, 0x860, 0x1ffe0000, 0x452);
  610. else if ((central_ch >= 118) && (central_ch <= 177))
  611. odm_set_bb_reg(p_dm_odm, 0x860, 0x1ffe0000, 0x412);
  612. else {
  613. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: Fail to switch channel (fc_area) (ch: %d)\n", __func__, central_ch));
  614. return false;
  615. }
  616. /* Fix A-cut LCK fail issue @ 5285MHz~5375MHz, 0xb8[19]=0x0 */
  617. if (p_dm_odm->cut_version == ODM_CUT_A) {
  618. if ((central_ch >= 57) && (central_ch <= 75))
  619. rf_reg_b8 = rf_reg_b8 & (~BIT(19));
  620. else
  621. rf_reg_b8 = rf_reg_b8 | BIT(19);
  622. }
  623. } else {
  624. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: Fail to switch band (ch: %d)\n", __func__, central_ch));
  625. return false;
  626. }
  627. rf_reg_status = rf_reg_status & config_phydm_write_rf_reg_8821c(p_dm_odm, ODM_RF_PATH_A, 0x18, RFREGOFFSETMASK, rf_reg18);
  628. if (p_dm_odm->cut_version == ODM_CUT_A)
  629. rf_reg_status = rf_reg_status & config_phydm_write_rf_reg_8821c(p_dm_odm, ODM_RF_PATH_A, 0xb8, RFREGOFFSETMASK, rf_reg_b8);
  630. if (rf_reg_status == false) {
  631. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: Fail to switch channel (ch: %d), because writing RF register is fail\n", __func__, central_ch));
  632. return false;
  633. }
  634. phydm_ccapar_8821c(p_dm_odm);
  635. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: Success to switch channel (ch: %d)\n", __func__, central_ch));
  636. return true;
  637. }
  638. boolean
  639. config_phydm_switch_bandwidth_8821c(
  640. struct PHY_DM_STRUCT *p_dm_odm,
  641. u8 primary_ch_idx,
  642. enum odm_bw_e bandwidth
  643. )
  644. {
  645. u32 rf_reg18;
  646. boolean rf_reg_status = true;
  647. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]===================>\n", __func__));
  648. if (p_dm_odm->is_disable_phy_api) {
  649. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: disable PHY API for debug!!\n", __func__));
  650. return true;
  651. }
  652. /* Error handling */
  653. if ((bandwidth >= ODM_BW_MAX) || ((bandwidth == ODM_BW40M) && (primary_ch_idx > 2)) || ((bandwidth == ODM_BW80M) && (primary_ch_idx > 4))) {
  654. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: Fail to switch bandwidth (bw: %d, primary ch: %d)\n", __func__, bandwidth, primary_ch_idx));
  655. return false;
  656. }
  657. bw_8821c = bandwidth;
  658. rf_reg18 = config_phydm_read_rf_reg_8821c(p_dm_odm, ODM_RF_PATH_A, 0x18, RFREGOFFSETMASK);
  659. rf_reg_status = rf_reg_status & config_phydm_read_rf_check_8821c(rf_reg18);
  660. /* Switch bandwidth */
  661. switch (bandwidth) {
  662. case ODM_BW20M:
  663. {
  664. /* Small BW([7:6]) = 0, primary channel ([5:2]) = 0, rf mode([1:0]) = 20M */
  665. odm_set_bb_reg(p_dm_odm, 0x8ac, MASKBYTE0, ODM_BW20M);
  666. /* ADC clock = 160M clock for BW20 */
  667. odm_set_bb_reg(p_dm_odm, 0x8ac, (BIT(9) | BIT(8)), 0x0);
  668. odm_set_bb_reg(p_dm_odm, 0x8ac, BIT(16), 0x1);
  669. /* DAC clock = 160M clock for BW20 */
  670. odm_set_bb_reg(p_dm_odm, 0x8ac, (BIT(21) | BIT(20)), 0x0);
  671. odm_set_bb_reg(p_dm_odm, 0x8ac, BIT(28), 0x1);
  672. /* ADC buffer clock */
  673. odm_set_bb_reg(p_dm_odm, 0x8c4, BIT(30), 0x1);
  674. /* RF bandwidth */
  675. rf_reg18 = (rf_reg18 | BIT(11) | BIT(10));
  676. break;
  677. }
  678. case ODM_BW40M:
  679. {
  680. /* Small BW([7:6]) = 0, primary channel ([5:2]) = sub-channel, rf mode([1:0]) = 40M */
  681. odm_set_bb_reg(p_dm_odm, 0x8ac, MASKBYTE0, (((primary_ch_idx & 0xf) << 2) | ODM_BW40M));
  682. /* CCK primary channel */
  683. if (primary_ch_idx == 1)
  684. odm_set_bb_reg(p_dm_odm, 0xa00, BIT(4), primary_ch_idx);
  685. else
  686. odm_set_bb_reg(p_dm_odm, 0xa00, BIT(4), 0);
  687. /* ADC clock = 160M clock for BW40 */
  688. odm_set_bb_reg(p_dm_odm, 0x8ac, (BIT(11) | BIT(10)), 0x0);
  689. odm_set_bb_reg(p_dm_odm, 0x8ac, BIT(17), 0x1);
  690. /* DAC clock = 160M clock for BW20 */
  691. odm_set_bb_reg(p_dm_odm, 0x8ac, (BIT(23) | BIT(22)), 0x0);
  692. odm_set_bb_reg(p_dm_odm, 0x8ac, BIT(29), 0x1);
  693. /* ADC buffer clock */
  694. odm_set_bb_reg(p_dm_odm, 0x8c4, BIT(30), 0x1);
  695. /* RF bandwidth */
  696. rf_reg18 = (rf_reg18 & (~(BIT(11) | BIT(10))));
  697. rf_reg18 = (rf_reg18 | BIT(11));
  698. break;
  699. }
  700. case ODM_BW80M:
  701. {
  702. /* Small BW([7:6]) = 0, primary channel ([5:2]) = sub-channel, rf mode([1:0]) = 80M */
  703. odm_set_bb_reg(p_dm_odm, 0x8ac, MASKBYTE0, (((primary_ch_idx & 0xf) << 2) | ODM_BW80M));
  704. /* ADC clock = 160M clock for BW80 */
  705. odm_set_bb_reg(p_dm_odm, 0x8ac, (BIT(13) | BIT(12)), 0x0);
  706. odm_set_bb_reg(p_dm_odm, 0x8ac, BIT(18), 0x1);
  707. /* DAC clock = 160M clock for BW20 */
  708. odm_set_bb_reg(p_dm_odm, 0x8ac, (BIT(25) | BIT(24)), 0x0);
  709. odm_set_bb_reg(p_dm_odm, 0x8ac, BIT(30), 0x1);
  710. /* ADC buffer clock */
  711. odm_set_bb_reg(p_dm_odm, 0x8c4, BIT(30), 0x1);
  712. /* RF bandwidth */
  713. rf_reg18 = (rf_reg18 & (~(BIT(11) | BIT(10))));
  714. rf_reg18 = (rf_reg18 | BIT(10));
  715. break;
  716. }
  717. case ODM_BW5M:
  718. {
  719. /* Small BW([7:6]) = 1, primary channel ([5:2]) = 0, rf mode([1:0]) = 20M */
  720. odm_set_bb_reg(p_dm_odm, 0x8ac, MASKBYTE0, (BIT(6) | ODM_BW20M));
  721. /* ADC clock = 40M clock */
  722. odm_set_bb_reg(p_dm_odm, 0x8ac, (BIT(9) | BIT(8)), 0x2);
  723. odm_set_bb_reg(p_dm_odm, 0x8ac, BIT(16), 0x0);
  724. /* DAC clock = 160M clock for BW20 */
  725. odm_set_bb_reg(p_dm_odm, 0x8ac, (BIT(21) | BIT(20)), 0x2);
  726. odm_set_bb_reg(p_dm_odm, 0x8ac, BIT(28), 0x0);
  727. /* ADC buffer clock */
  728. odm_set_bb_reg(p_dm_odm, 0x8c4, BIT(30), 0x0);
  729. odm_set_bb_reg(p_dm_odm, 0x8c8, BIT(31), 0x1);
  730. /* RF bandwidth */
  731. rf_reg18 = (rf_reg18 | BIT(11) | BIT(10));
  732. break;
  733. }
  734. case ODM_BW10M:
  735. {
  736. /* Small BW([7:6]) = 1, primary channel ([5:2]) = 0, rf mode([1:0]) = 20M */
  737. odm_set_bb_reg(p_dm_odm, 0x8ac, MASKBYTE0, (BIT(7) | ODM_BW20M));
  738. /* ADC clock = 80M clock */
  739. odm_set_bb_reg(p_dm_odm, 0x8ac, (BIT(9) | BIT(8)), 0x3);
  740. odm_set_bb_reg(p_dm_odm, 0x8ac, BIT(16), 0x0);
  741. /* DAC clock = 160M clock for BW20 */
  742. odm_set_bb_reg(p_dm_odm, 0x8ac, (BIT(21) | BIT(20)), 0x3);
  743. odm_set_bb_reg(p_dm_odm, 0x8ac, BIT(28), 0x0);
  744. /* ADC buffer clock */
  745. odm_set_bb_reg(p_dm_odm, 0x8c4, BIT(30), 0x0);
  746. odm_set_bb_reg(p_dm_odm, 0x8c8, BIT(31), 0x1);
  747. /* RF bandwidth */
  748. rf_reg18 = (rf_reg18 | BIT(11) | BIT(10));
  749. break;
  750. }
  751. default:
  752. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: Fail to switch bandwidth (bw: %d, primary ch: %d)\n", __func__, bandwidth, primary_ch_idx));
  753. }
  754. /* Write RF register */
  755. rf_reg_status = rf_reg_status & config_phydm_write_rf_reg_8821c(p_dm_odm, ODM_RF_PATH_A, 0x18, RFREGOFFSETMASK, rf_reg18);
  756. if (rf_reg_status == false) {
  757. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: Fail to switch bandwidth (bw: %d, primary ch: %d), because writing RF register is fail\n", __func__, bandwidth, primary_ch_idx));
  758. return false;
  759. }
  760. /* Modify RX DFIR parameters */
  761. phydm_rxdfirpar_by_bw_8821c(p_dm_odm, bandwidth);
  762. /* Modify CCA parameters */
  763. phydm_ccapar_by_bw_8821c(p_dm_odm, bandwidth);
  764. phydm_ccapar_8821c(p_dm_odm);
  765. /* Toggle RX path to avoid RX dead zone issue */
  766. /*odm_set_bb_reg(p_dm_odm, 0x808, MASKBYTE0, 0x0);*/
  767. /*odm_set_bb_reg(p_dm_odm, 0x808, MASKBYTE0, 0x11);*/
  768. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: Success to switch bandwidth (bw: %d, primary ch: %d)\n", __func__, bandwidth, primary_ch_idx));
  769. return true;
  770. }
  771. boolean
  772. config_phydm_switch_channel_bw_8821c(
  773. struct PHY_DM_STRUCT *p_dm_odm,
  774. u8 central_ch,
  775. u8 primary_ch_idx,
  776. enum odm_bw_e bandwidth
  777. )
  778. {
  779. u8 e_rf_path = 0;
  780. u32 rf_val_to_wr, rf_tmp_val, bit_shift, bit_mask;
  781. /* Switch band */
  782. if (config_phydm_switch_band_8821c(p_dm_odm, central_ch) == false)
  783. return false;
  784. /* Switch channel */
  785. if (config_phydm_switch_channel_8821c(p_dm_odm, central_ch) == false)
  786. return false;
  787. /* Switch bandwidth */
  788. if (config_phydm_switch_bandwidth_8821c(p_dm_odm, primary_ch_idx, bandwidth) == false)
  789. return false;
  790. return true;
  791. }
  792. boolean
  793. config_phydm_trx_mode_8821c(
  794. struct PHY_DM_STRUCT *p_dm_odm,
  795. enum odm_rf_path_e tx_path,
  796. enum odm_rf_path_e rx_path,
  797. boolean is_tx2_path
  798. )
  799. {
  800. return true;
  801. }
  802. boolean
  803. config_phydm_parameter_init_8821c(
  804. struct PHY_DM_STRUCT *p_dm_odm,
  805. enum odm_parameter_init_e type
  806. )
  807. {
  808. if (type == ODM_PRE_SETTING) {
  809. odm_set_bb_reg(p_dm_odm, 0x808, (BIT(28) | BIT(29)), 0x0);
  810. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: Pre setting: disable OFDM and CCK block\n", __func__));
  811. } else if (type == ODM_POST_SETTING) {
  812. odm_set_bb_reg(p_dm_odm, 0x808, (BIT(28) | BIT(29)), 0x3);
  813. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: Post setting: enable OFDM and CCK block\n", __func__));
  814. reg82c_8821c = odm_get_bb_reg(p_dm_odm, 0x82c, MASKDWORD);
  815. reg838_8821c = odm_get_bb_reg(p_dm_odm, 0x838, MASKDWORD);
  816. reg830_8821c = odm_get_bb_reg(p_dm_odm, 0x830, MASKDWORD);
  817. rega24_8821c = odm_get_bb_reg(p_dm_odm, 0xa24, MASKDWORD);
  818. rega28_8821c = odm_get_bb_reg(p_dm_odm, 0xa28, MASKDWORD);
  819. regaac_8821c = odm_get_bb_reg(p_dm_odm, 0xaac, MASKDWORD);
  820. } else {
  821. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: Wrong type!!\n", __func__));
  822. return false;
  823. }
  824. return true;
  825. }
  826. void
  827. config_phydm_switch_rf_set_8821c(
  828. struct PHY_DM_STRUCT *p_dm_odm,
  829. u8 rf_set
  830. )
  831. {
  832. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  833. struct _ADAPTER *p_adapter = p_dm_odm->adapter;
  834. PMGNT_INFO p_mgnt_info = &(p_adapter->MgntInfo);
  835. #endif
  836. u32 bb_reg32;
  837. odm_set_mac_reg(p_dm_odm, 0x1080, BIT(16), 0x1);
  838. odm_set_mac_reg(p_dm_odm, 0x00, BIT(26), 0x1);
  839. /*odm_set_mac_reg(p_dm_odm, 0x70, BIT(26), 0x1);*/
  840. /*odm_set_mac_reg(p_dm_odm, 0x1704, MASKLWORD, 0x4000);*/
  841. /*odm_set_mac_reg(p_dm_odm, 0x1700, (BIT(31) | BIT(30)), 0x3); */
  842. bb_reg32 = odm_get_bb_reg(p_dm_odm, 0xcb8, MASKDWORD);
  843. switch (rf_set) {
  844. case SWITCH_TO_BTG:
  845. p_dm_odm->current_rf_set_8821c = SWITCH_TO_BTG;
  846. bb_reg32 = (bb_reg32 | BIT(16));
  847. bb_reg32 &= (~(BIT(18) | BIT(20) | BIT(21) | BIT(22) | BIT(23)));
  848. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  849. if (p_dm_odm->mp_mode == true && p_mgnt_info->RegPHYParaFromFolder == 0)
  850. #else
  851. if (p_dm_odm->mp_mode == true)
  852. #endif
  853. {
  854. odm_config_bb_with_header_file(p_dm_odm, CONFIG_BB_AGC_TAB_DIFF);
  855. /*Toggle initial gain twice for valid gain table*/
  856. odm_set_bb_reg(p_dm_odm, ODM_REG(IGI_A, p_dm_odm), ODM_BIT(IGI, p_dm_odm), 0x22);
  857. odm_set_bb_reg(p_dm_odm, ODM_REG(IGI_A, p_dm_odm), ODM_BIT(IGI, p_dm_odm), 0x20);
  858. }
  859. break;
  860. case SWITCH_TO_WLG:
  861. p_dm_odm->current_rf_set_8821c = SWITCH_TO_WLG;
  862. bb_reg32 = (bb_reg32 | BIT(20) | BIT(21) | BIT(22));
  863. bb_reg32 &= (~(BIT(16) | BIT(18) | BIT(23)));
  864. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  865. if (p_dm_odm->mp_mode == true && p_mgnt_info->RegPHYParaFromFolder == 0)
  866. #else
  867. if (p_dm_odm->mp_mode == true)
  868. #endif
  869. {
  870. odm_config_bb_with_header_file(p_dm_odm, CONFIG_BB_AGC_TAB_DIFF);
  871. /*Toggle initial gain twice for valid gain table*/
  872. odm_set_bb_reg(p_dm_odm, ODM_REG(IGI_A, p_dm_odm), ODM_BIT(IGI, p_dm_odm), 0x22);
  873. odm_set_bb_reg(p_dm_odm, ODM_REG(IGI_A, p_dm_odm), ODM_BIT(IGI, p_dm_odm), 0x20);
  874. }
  875. break;
  876. case SWITCH_TO_WLA:
  877. p_dm_odm->current_rf_set_8821c = SWITCH_TO_WLA;
  878. bb_reg32 = (bb_reg32 | BIT(20) | BIT(22) | BIT(23));
  879. bb_reg32 &= (~(BIT(16) | BIT(18) | BIT(21)));
  880. break;
  881. case SWITCH_TO_BT:
  882. p_dm_odm->current_rf_set_8821c = SWITCH_TO_BT;
  883. break;
  884. default:
  885. break;
  886. }
  887. odm_set_bb_reg(p_dm_odm, 0xcb8, MASKDWORD, bb_reg32);
  888. }
  889. void
  890. config_phydm_set_ant_path(
  891. struct PHY_DM_STRUCT *p_dm_odm,
  892. u8 rf_set,
  893. u8 ant_num
  894. )
  895. {
  896. boolean switch_polarity_inverse = false;
  897. u8 regval_0xcb7 = 0;
  898. p_dm_odm->current_ant_num_8821c = ant_num;
  899. config_phydm_switch_rf_set_8821c(p_dm_odm, rf_set);
  900. if (rf_set == SWITCH_TO_BT)
  901. phydm_set_gnt_state_8821c(p_dm_odm, false, true); /* GNT_WL=0, GNT_BT=1 for BT test */
  902. else
  903. phydm_set_gnt_state_8821c(p_dm_odm, true, false); /* GNT_WL=1, GNT_BT=0 for WL test */
  904. if (p_dm_odm->rfe_type == 0x5 || p_dm_odm->rfe_type == 0x6 || p_dm_odm->rfe_type == 0x25 || p_dm_odm->rfe_type == 0x26) /*switch does not exist*/
  905. return;
  906. if (p_dm_odm->current_ant_num_8821c) /*Ant1 = 0, Ant2 = 1*/
  907. switch_polarity_inverse = !switch_polarity_inverse;
  908. if (rf_set == SWITCH_TO_WLG)
  909. switch_polarity_inverse = !switch_polarity_inverse;
  910. /*set antenna control by WL 0xcb4[29:28]*/
  911. odm_set_mac_reg(p_dm_odm, 0x4c, BIT(24)|BIT(23), 0x2);
  912. /*set RFE_ctrl8 and RFE_ctrl9 as antenna control pins by software*/
  913. odm_set_bb_reg(p_dm_odm, 0xcb4, 0x000000ff, 0x77);
  914. /*0xcb4[29:28] = 2b'01 for no switch_polatiry_inverse, DPDT_SEL_N =1, DPDT_SEL_P =0*/
  915. regval_0xcb7 = (switch_polarity_inverse == false ? 0x1 : 0x2);
  916. odm_set_bb_reg(p_dm_odm, 0xcb4, 0x30000000, regval_0xcb7);
  917. }
  918. u32
  919. query_phydm_trx_capability_8821c(
  920. struct PHY_DM_STRUCT *p_dm_odm
  921. )
  922. {
  923. u32 value32 = 0x00000000;
  924. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: trx_capability = 0x%x\n", __func__, value32));
  925. return value32;
  926. }
  927. u32
  928. query_phydm_stbc_capability_8821c(
  929. struct PHY_DM_STRUCT *p_dm_odm
  930. )
  931. {
  932. u32 value32 = 0x00010001;
  933. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: stbc_capability = 0x%x\n", __func__, value32));
  934. return value32;
  935. }
  936. u32
  937. query_phydm_ldpc_capability_8821c(
  938. struct PHY_DM_STRUCT *p_dm_odm
  939. )
  940. {
  941. u32 value32 = 0x01000100;
  942. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: ldpc_capability = 0x%x\n", __func__, value32));
  943. return value32;
  944. }
  945. u32
  946. query_phydm_txbf_parameters_8821c(
  947. struct PHY_DM_STRUCT *p_dm_odm
  948. )
  949. {
  950. u32 value32 = 0x00030003;
  951. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: txbf_parameters = 0x%x\n", __func__, value32));
  952. return value32;
  953. }
  954. u32
  955. query_phydm_txbf_capability_8821c(
  956. struct PHY_DM_STRUCT *p_dm_odm
  957. )
  958. {
  959. u32 value32 = 0x01010001;
  960. ODM_RT_TRACE(p_dm_odm, ODM_PHY_CONFIG, ODM_DBG_TRACE, ("[%s]: txbf_capability = 0x%x\n", __func__, value32));
  961. return value32;
  962. }
  963. u8
  964. query_phydm_default_rf_set_8821c(
  965. struct PHY_DM_STRUCT *p_dm_odm
  966. )
  967. {
  968. return p_dm_odm->default_rf_set_8821c;
  969. }
  970. u8
  971. query_phydm_current_rf_set_8821c(
  972. struct PHY_DM_STRUCT *p_dm_odm
  973. )
  974. {
  975. return p_dm_odm->current_rf_set_8821c;
  976. }
  977. u8
  978. query_phydm_rfetype_8821c(
  979. struct PHY_DM_STRUCT *p_dm_odm
  980. )
  981. {
  982. return p_dm_odm->rfe_type;
  983. }
  984. u8
  985. query_phydm_current_ant_num_8821c(
  986. struct PHY_DM_STRUCT *p_dm_odm
  987. )
  988. {
  989. u32 regval_0xcb4 = odm_get_bb_reg(p_dm_odm, 0xcb4, BIT(29)|BIT(28));
  990. if (p_dm_odm->current_rf_set_8821c == SWITCH_TO_BTG || p_dm_odm->current_rf_set_8821c == SWITCH_TO_WLA || p_dm_odm->current_rf_set_8821c == SWITCH_TO_BT) {
  991. if (regval_0xcb4 == 1)
  992. p_dm_odm->current_ant_num_8821c = SWITCH_TO_ANT1;
  993. else if (regval_0xcb4 == 2)
  994. p_dm_odm->current_ant_num_8821c = SWITCH_TO_ANT2;
  995. else
  996. if (regval_0xcb4 == 1)
  997. p_dm_odm->current_ant_num_8821c = SWITCH_TO_ANT2;
  998. else if (regval_0xcb4 == 2)
  999. p_dm_odm->current_ant_num_8821c = SWITCH_TO_ANT1;
  1000. }
  1001. return p_dm_odm->current_ant_num_8821c;
  1002. }
  1003. u8
  1004. query_phydm_ant_num_map_8821c(
  1005. struct PHY_DM_STRUCT *p_dm_odm
  1006. )
  1007. {
  1008. u8 mapping_table = 0;
  1009. /* mapping table meaning
  1010. 1: choose ant1 or ant2
  1011. 2: only ant1
  1012. 3: only ant2
  1013. 4: cannot choose
  1014. */
  1015. if (p_dm_odm->rfe_type == 0 || p_dm_odm->rfe_type == 7 || p_dm_odm->rfe_type == 0x20 || p_dm_odm->rfe_type == 0x27)
  1016. mapping_table = 1;
  1017. else if (p_dm_odm->rfe_type == 1 || p_dm_odm->rfe_type == 2 || p_dm_odm->rfe_type == 0x21 || p_dm_odm->rfe_type == 0x22)
  1018. mapping_table = 2;
  1019. else if (p_dm_odm->rfe_type == 3 || p_dm_odm->rfe_type == 4 || p_dm_odm->rfe_type == 0x23 || p_dm_odm->rfe_type == 0x24)
  1020. mapping_table = 3;
  1021. else if (p_dm_odm->rfe_type == 5 || p_dm_odm->rfe_type == 6 || p_dm_odm->rfe_type == 0x25 || p_dm_odm->rfe_type == 0x26)
  1022. mapping_table = 4;
  1023. return mapping_table;
  1024. }
  1025. /* ======================================================================== */
  1026. #endif /* RTL8821C_SUPPORT == 1 */