phydm_hal_api8821c.c 40 KB

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