bb_cfg.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727
  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 "odm_precomp.h"
  21. #include <phy.h>
  22. /* AGC_TAB_1T.TXT */
  23. static u32 array_agc_tab_1t_8188e[] = {
  24. 0xC78, 0xFB000001,
  25. 0xC78, 0xFB010001,
  26. 0xC78, 0xFB020001,
  27. 0xC78, 0xFB030001,
  28. 0xC78, 0xFB040001,
  29. 0xC78, 0xFB050001,
  30. 0xC78, 0xFA060001,
  31. 0xC78, 0xF9070001,
  32. 0xC78, 0xF8080001,
  33. 0xC78, 0xF7090001,
  34. 0xC78, 0xF60A0001,
  35. 0xC78, 0xF50B0001,
  36. 0xC78, 0xF40C0001,
  37. 0xC78, 0xF30D0001,
  38. 0xC78, 0xF20E0001,
  39. 0xC78, 0xF10F0001,
  40. 0xC78, 0xF0100001,
  41. 0xC78, 0xEF110001,
  42. 0xC78, 0xEE120001,
  43. 0xC78, 0xED130001,
  44. 0xC78, 0xEC140001,
  45. 0xC78, 0xEB150001,
  46. 0xC78, 0xEA160001,
  47. 0xC78, 0xE9170001,
  48. 0xC78, 0xE8180001,
  49. 0xC78, 0xE7190001,
  50. 0xC78, 0xE61A0001,
  51. 0xC78, 0xE51B0001,
  52. 0xC78, 0xE41C0001,
  53. 0xC78, 0xE31D0001,
  54. 0xC78, 0xE21E0001,
  55. 0xC78, 0xE11F0001,
  56. 0xC78, 0x8A200001,
  57. 0xC78, 0x89210001,
  58. 0xC78, 0x88220001,
  59. 0xC78, 0x87230001,
  60. 0xC78, 0x86240001,
  61. 0xC78, 0x85250001,
  62. 0xC78, 0x84260001,
  63. 0xC78, 0x83270001,
  64. 0xC78, 0x82280001,
  65. 0xC78, 0x6B290001,
  66. 0xC78, 0x6A2A0001,
  67. 0xC78, 0x692B0001,
  68. 0xC78, 0x682C0001,
  69. 0xC78, 0x672D0001,
  70. 0xC78, 0x662E0001,
  71. 0xC78, 0x652F0001,
  72. 0xC78, 0x64300001,
  73. 0xC78, 0x63310001,
  74. 0xC78, 0x62320001,
  75. 0xC78, 0x61330001,
  76. 0xC78, 0x46340001,
  77. 0xC78, 0x45350001,
  78. 0xC78, 0x44360001,
  79. 0xC78, 0x43370001,
  80. 0xC78, 0x42380001,
  81. 0xC78, 0x41390001,
  82. 0xC78, 0x403A0001,
  83. 0xC78, 0x403B0001,
  84. 0xC78, 0x403C0001,
  85. 0xC78, 0x403D0001,
  86. 0xC78, 0x403E0001,
  87. 0xC78, 0x403F0001,
  88. 0xC78, 0xFB400001,
  89. 0xC78, 0xFB410001,
  90. 0xC78, 0xFB420001,
  91. 0xC78, 0xFB430001,
  92. 0xC78, 0xFB440001,
  93. 0xC78, 0xFB450001,
  94. 0xC78, 0xFB460001,
  95. 0xC78, 0xFB470001,
  96. 0xC78, 0xFB480001,
  97. 0xC78, 0xFA490001,
  98. 0xC78, 0xF94A0001,
  99. 0xC78, 0xF84B0001,
  100. 0xC78, 0xF74C0001,
  101. 0xC78, 0xF64D0001,
  102. 0xC78, 0xF54E0001,
  103. 0xC78, 0xF44F0001,
  104. 0xC78, 0xF3500001,
  105. 0xC78, 0xF2510001,
  106. 0xC78, 0xF1520001,
  107. 0xC78, 0xF0530001,
  108. 0xC78, 0xEF540001,
  109. 0xC78, 0xEE550001,
  110. 0xC78, 0xED560001,
  111. 0xC78, 0xEC570001,
  112. 0xC78, 0xEB580001,
  113. 0xC78, 0xEA590001,
  114. 0xC78, 0xE95A0001,
  115. 0xC78, 0xE85B0001,
  116. 0xC78, 0xE75C0001,
  117. 0xC78, 0xE65D0001,
  118. 0xC78, 0xE55E0001,
  119. 0xC78, 0xE45F0001,
  120. 0xC78, 0xE3600001,
  121. 0xC78, 0xE2610001,
  122. 0xC78, 0xC3620001,
  123. 0xC78, 0xC2630001,
  124. 0xC78, 0xC1640001,
  125. 0xC78, 0x8B650001,
  126. 0xC78, 0x8A660001,
  127. 0xC78, 0x89670001,
  128. 0xC78, 0x88680001,
  129. 0xC78, 0x87690001,
  130. 0xC78, 0x866A0001,
  131. 0xC78, 0x856B0001,
  132. 0xC78, 0x846C0001,
  133. 0xC78, 0x676D0001,
  134. 0xC78, 0x666E0001,
  135. 0xC78, 0x656F0001,
  136. 0xC78, 0x64700001,
  137. 0xC78, 0x63710001,
  138. 0xC78, 0x62720001,
  139. 0xC78, 0x61730001,
  140. 0xC78, 0x60740001,
  141. 0xC78, 0x46750001,
  142. 0xC78, 0x45760001,
  143. 0xC78, 0x44770001,
  144. 0xC78, 0x43780001,
  145. 0xC78, 0x42790001,
  146. 0xC78, 0x417A0001,
  147. 0xC78, 0x407B0001,
  148. 0xC78, 0x407C0001,
  149. 0xC78, 0x407D0001,
  150. 0xC78, 0x407E0001,
  151. 0xC78, 0x407F0001,
  152. };
  153. static bool set_baseband_agc_config(struct adapter *adapt)
  154. {
  155. u32 i;
  156. const u32 arraylen = ARRAY_SIZE(array_agc_tab_1t_8188e);
  157. u32 *array = array_agc_tab_1t_8188e;
  158. for (i = 0; i < arraylen; i += 2) {
  159. u32 v1 = array[i];
  160. u32 v2 = array[i + 1];
  161. if (v1 < 0xCDCDCDCD) {
  162. phy_set_bb_reg(adapt, v1, bMaskDWord, v2);
  163. udelay(1);
  164. }
  165. }
  166. return true;
  167. }
  168. /* PHY_REG_1T.TXT */
  169. static u32 array_phy_reg_1t_8188e[] = {
  170. 0x800, 0x80040000,
  171. 0x804, 0x00000003,
  172. 0x808, 0x0000FC00,
  173. 0x80C, 0x0000000A,
  174. 0x810, 0x10001331,
  175. 0x814, 0x020C3D10,
  176. 0x818, 0x02200385,
  177. 0x81C, 0x00000000,
  178. 0x820, 0x01000100,
  179. 0x824, 0x00390204,
  180. 0x828, 0x00000000,
  181. 0x82C, 0x00000000,
  182. 0x830, 0x00000000,
  183. 0x834, 0x00000000,
  184. 0x838, 0x00000000,
  185. 0x83C, 0x00000000,
  186. 0x840, 0x00010000,
  187. 0x844, 0x00000000,
  188. 0x848, 0x00000000,
  189. 0x84C, 0x00000000,
  190. 0x850, 0x00000000,
  191. 0x854, 0x00000000,
  192. 0x858, 0x569A11A9,
  193. 0x85C, 0x01000014,
  194. 0x860, 0x66F60110,
  195. 0x864, 0x061F0649,
  196. 0x868, 0x00000000,
  197. 0x86C, 0x27272700,
  198. 0x870, 0x07000760,
  199. 0x874, 0x25004000,
  200. 0x878, 0x00000808,
  201. 0x87C, 0x00000000,
  202. 0x880, 0xB0000C1C,
  203. 0x884, 0x00000001,
  204. 0x888, 0x00000000,
  205. 0x88C, 0xCCC000C0,
  206. 0x890, 0x00000800,
  207. 0x894, 0xFFFFFFFE,
  208. 0x898, 0x40302010,
  209. 0x89C, 0x00706050,
  210. 0x900, 0x00000000,
  211. 0x904, 0x00000023,
  212. 0x908, 0x00000000,
  213. 0x90C, 0x81121111,
  214. 0x910, 0x00000002,
  215. 0x914, 0x00000201,
  216. 0xA00, 0x00D047C8,
  217. 0xA04, 0x80FF000C,
  218. 0xA08, 0x8C838300,
  219. 0xA0C, 0x2E7F120F,
  220. 0xA10, 0x9500BB78,
  221. 0xA14, 0x1114D028,
  222. 0xA18, 0x00881117,
  223. 0xA1C, 0x89140F00,
  224. 0xA20, 0x1A1B0000,
  225. 0xA24, 0x090E1317,
  226. 0xA28, 0x00000204,
  227. 0xA2C, 0x00D30000,
  228. 0xA70, 0x101FBF00,
  229. 0xA74, 0x00000007,
  230. 0xA78, 0x00000900,
  231. 0xA7C, 0x225B0606,
  232. 0xA80, 0x218075B1,
  233. 0xB2C, 0x80000000,
  234. 0xC00, 0x48071D40,
  235. 0xC04, 0x03A05611,
  236. 0xC08, 0x000000E4,
  237. 0xC0C, 0x6C6C6C6C,
  238. 0xC10, 0x08800000,
  239. 0xC14, 0x40000100,
  240. 0xC18, 0x08800000,
  241. 0xC1C, 0x40000100,
  242. 0xC20, 0x00000000,
  243. 0xC24, 0x00000000,
  244. 0xC28, 0x00000000,
  245. 0xC2C, 0x00000000,
  246. 0xC30, 0x69E9AC47,
  247. 0xC34, 0x469652AF,
  248. 0xC38, 0x49795994,
  249. 0xC3C, 0x0A97971C,
  250. 0xC40, 0x1F7C403F,
  251. 0xC44, 0x000100B7,
  252. 0xC48, 0xEC020107,
  253. 0xC4C, 0x007F037F,
  254. 0xC50, 0x69553420,
  255. 0xC54, 0x43BC0094,
  256. 0xC58, 0x00013169,
  257. 0xC5C, 0x00250492,
  258. 0xC60, 0x00000000,
  259. 0xC64, 0x7112848B,
  260. 0xC68, 0x47C00BFF,
  261. 0xC6C, 0x00000036,
  262. 0xC70, 0x2C7F000D,
  263. 0xC74, 0x020610DB,
  264. 0xC78, 0x0000001F,
  265. 0xC7C, 0x00B91612,
  266. 0xC80, 0x390000E4,
  267. 0xC84, 0x20F60000,
  268. 0xC88, 0x40000100,
  269. 0xC8C, 0x20200000,
  270. 0xC90, 0x00091521,
  271. 0xC94, 0x00000000,
  272. 0xC98, 0x00121820,
  273. 0xC9C, 0x00007F7F,
  274. 0xCA0, 0x00000000,
  275. 0xCA4, 0x000300A0,
  276. 0xCA8, 0x00000000,
  277. 0xCAC, 0x00000000,
  278. 0xCB0, 0x00000000,
  279. 0xCB4, 0x00000000,
  280. 0xCB8, 0x00000000,
  281. 0xCBC, 0x28000000,
  282. 0xCC0, 0x00000000,
  283. 0xCC4, 0x00000000,
  284. 0xCC8, 0x00000000,
  285. 0xCCC, 0x00000000,
  286. 0xCD0, 0x00000000,
  287. 0xCD4, 0x00000000,
  288. 0xCD8, 0x64B22427,
  289. 0xCDC, 0x00766932,
  290. 0xCE0, 0x00222222,
  291. 0xCE4, 0x00000000,
  292. 0xCE8, 0x37644302,
  293. 0xCEC, 0x2F97D40C,
  294. 0xD00, 0x00000740,
  295. 0xD04, 0x00020401,
  296. 0xD08, 0x0000907F,
  297. 0xD0C, 0x20010201,
  298. 0xD10, 0xA0633333,
  299. 0xD14, 0x3333BC43,
  300. 0xD18, 0x7A8F5B6F,
  301. 0xD2C, 0xCC979975,
  302. 0xD30, 0x00000000,
  303. 0xD34, 0x80608000,
  304. 0xD38, 0x00000000,
  305. 0xD3C, 0x00127353,
  306. 0xD40, 0x00000000,
  307. 0xD44, 0x00000000,
  308. 0xD48, 0x00000000,
  309. 0xD4C, 0x00000000,
  310. 0xD50, 0x6437140A,
  311. 0xD54, 0x00000000,
  312. 0xD58, 0x00000282,
  313. 0xD5C, 0x30032064,
  314. 0xD60, 0x4653DE68,
  315. 0xD64, 0x04518A3C,
  316. 0xD68, 0x00002101,
  317. 0xD6C, 0x2A201C16,
  318. 0xD70, 0x1812362E,
  319. 0xD74, 0x322C2220,
  320. 0xD78, 0x000E3C24,
  321. 0xE00, 0x2D2D2D2D,
  322. 0xE04, 0x2D2D2D2D,
  323. 0xE08, 0x0390272D,
  324. 0xE10, 0x2D2D2D2D,
  325. 0xE14, 0x2D2D2D2D,
  326. 0xE18, 0x2D2D2D2D,
  327. 0xE1C, 0x2D2D2D2D,
  328. 0xE28, 0x00000000,
  329. 0xE30, 0x1000DC1F,
  330. 0xE34, 0x10008C1F,
  331. 0xE38, 0x02140102,
  332. 0xE3C, 0x681604C2,
  333. 0xE40, 0x01007C00,
  334. 0xE44, 0x01004800,
  335. 0xE48, 0xFB000000,
  336. 0xE4C, 0x000028D1,
  337. 0xE50, 0x1000DC1F,
  338. 0xE54, 0x10008C1F,
  339. 0xE58, 0x02140102,
  340. 0xE5C, 0x28160D05,
  341. 0xE60, 0x00000008,
  342. 0xE68, 0x001B25A4,
  343. 0xE6C, 0x00C00014,
  344. 0xE70, 0x00C00014,
  345. 0xE74, 0x01000014,
  346. 0xE78, 0x01000014,
  347. 0xE7C, 0x01000014,
  348. 0xE80, 0x01000014,
  349. 0xE84, 0x00C00014,
  350. 0xE88, 0x01000014,
  351. 0xE8C, 0x00C00014,
  352. 0xED0, 0x00C00014,
  353. 0xED4, 0x00C00014,
  354. 0xED8, 0x00C00014,
  355. 0xEDC, 0x00000014,
  356. 0xEE0, 0x00000014,
  357. 0xEEC, 0x01C00014,
  358. 0xF14, 0x00000003,
  359. 0xF4C, 0x00000000,
  360. 0xF00, 0x00000300,
  361. };
  362. static void rtl_bb_delay(struct adapter *adapt, u32 addr, u32 data)
  363. {
  364. if (addr == 0xfe) {
  365. msleep(50);
  366. } else if (addr == 0xfd) {
  367. mdelay(5);
  368. } else if (addr == 0xfc) {
  369. mdelay(1);
  370. } else if (addr == 0xfb) {
  371. udelay(50);
  372. } else if (addr == 0xfa) {
  373. udelay(5);
  374. } else if (addr == 0xf9) {
  375. udelay(1);
  376. } else {
  377. phy_set_bb_reg(adapt, addr, bMaskDWord, data);
  378. /* Add 1us delay between BB/RF register setting. */
  379. udelay(1);
  380. }
  381. }
  382. static bool set_baseband_phy_config(struct adapter *adapt)
  383. {
  384. u32 i;
  385. const u32 arraylen = ARRAY_SIZE(array_phy_reg_1t_8188e);
  386. u32 *array = array_phy_reg_1t_8188e;
  387. for (i = 0; i < arraylen; i += 2) {
  388. u32 v1 = array[i];
  389. u32 v2 = array[i + 1];
  390. if (v1 < 0xCDCDCDCD)
  391. rtl_bb_delay(adapt, v1, v2);
  392. }
  393. return true;
  394. }
  395. /* PHY_REG_PG.TXT */
  396. static u32 array_phy_reg_pg_8188e[] = {
  397. 0xE00, 0xFFFFFFFF, 0x06070809,
  398. 0xE04, 0xFFFFFFFF, 0x02020405,
  399. 0xE08, 0x0000FF00, 0x00000006,
  400. 0x86C, 0xFFFFFF00, 0x00020400,
  401. 0xE10, 0xFFFFFFFF, 0x08090A0B,
  402. 0xE14, 0xFFFFFFFF, 0x01030607,
  403. 0xE18, 0xFFFFFFFF, 0x08090A0B,
  404. 0xE1C, 0xFFFFFFFF, 0x01030607,
  405. 0xE00, 0xFFFFFFFF, 0x00000000,
  406. 0xE04, 0xFFFFFFFF, 0x00000000,
  407. 0xE08, 0x0000FF00, 0x00000000,
  408. 0x86C, 0xFFFFFF00, 0x00000000,
  409. 0xE10, 0xFFFFFFFF, 0x00000000,
  410. 0xE14, 0xFFFFFFFF, 0x00000000,
  411. 0xE18, 0xFFFFFFFF, 0x00000000,
  412. 0xE1C, 0xFFFFFFFF, 0x00000000,
  413. 0xE00, 0xFFFFFFFF, 0x02020202,
  414. 0xE04, 0xFFFFFFFF, 0x00020202,
  415. 0xE08, 0x0000FF00, 0x00000000,
  416. 0x86C, 0xFFFFFF00, 0x00000000,
  417. 0xE10, 0xFFFFFFFF, 0x04040404,
  418. 0xE14, 0xFFFFFFFF, 0x00020404,
  419. 0xE18, 0xFFFFFFFF, 0x00000000,
  420. 0xE1C, 0xFFFFFFFF, 0x00000000,
  421. 0xE00, 0xFFFFFFFF, 0x02020202,
  422. 0xE04, 0xFFFFFFFF, 0x00020202,
  423. 0xE08, 0x0000FF00, 0x00000000,
  424. 0x86C, 0xFFFFFF00, 0x00000000,
  425. 0xE10, 0xFFFFFFFF, 0x04040404,
  426. 0xE14, 0xFFFFFFFF, 0x00020404,
  427. 0xE18, 0xFFFFFFFF, 0x00000000,
  428. 0xE1C, 0xFFFFFFFF, 0x00000000,
  429. 0xE00, 0xFFFFFFFF, 0x00000000,
  430. 0xE04, 0xFFFFFFFF, 0x00000000,
  431. 0xE08, 0x0000FF00, 0x00000000,
  432. 0x86C, 0xFFFFFF00, 0x00000000,
  433. 0xE10, 0xFFFFFFFF, 0x00000000,
  434. 0xE14, 0xFFFFFFFF, 0x00000000,
  435. 0xE18, 0xFFFFFFFF, 0x00000000,
  436. 0xE1C, 0xFFFFFFFF, 0x00000000,
  437. 0xE00, 0xFFFFFFFF, 0x02020202,
  438. 0xE04, 0xFFFFFFFF, 0x00020202,
  439. 0xE08, 0x0000FF00, 0x00000000,
  440. 0x86C, 0xFFFFFF00, 0x00000000,
  441. 0xE10, 0xFFFFFFFF, 0x04040404,
  442. 0xE14, 0xFFFFFFFF, 0x00020404,
  443. 0xE18, 0xFFFFFFFF, 0x00000000,
  444. 0xE1C, 0xFFFFFFFF, 0x00000000,
  445. 0xE00, 0xFFFFFFFF, 0x00000000,
  446. 0xE04, 0xFFFFFFFF, 0x00000000,
  447. 0xE08, 0x0000FF00, 0x00000000,
  448. 0x86C, 0xFFFFFF00, 0x00000000,
  449. 0xE10, 0xFFFFFFFF, 0x00000000,
  450. 0xE14, 0xFFFFFFFF, 0x00000000,
  451. 0xE18, 0xFFFFFFFF, 0x00000000,
  452. 0xE1C, 0xFFFFFFFF, 0x00000000,
  453. 0xE00, 0xFFFFFFFF, 0x00000000,
  454. 0xE04, 0xFFFFFFFF, 0x00000000,
  455. 0xE08, 0x0000FF00, 0x00000000,
  456. 0x86C, 0xFFFFFF00, 0x00000000,
  457. 0xE10, 0xFFFFFFFF, 0x00000000,
  458. 0xE14, 0xFFFFFFFF, 0x00000000,
  459. 0xE18, 0xFFFFFFFF, 0x00000000,
  460. 0xE1C, 0xFFFFFFFF, 0x00000000,
  461. 0xE00, 0xFFFFFFFF, 0x00000000,
  462. 0xE04, 0xFFFFFFFF, 0x00000000,
  463. 0xE08, 0x0000FF00, 0x00000000,
  464. 0x86C, 0xFFFFFF00, 0x00000000,
  465. 0xE10, 0xFFFFFFFF, 0x00000000,
  466. 0xE14, 0xFFFFFFFF, 0x00000000,
  467. 0xE18, 0xFFFFFFFF, 0x00000000,
  468. 0xE1C, 0xFFFFFFFF, 0x00000000,
  469. 0xE00, 0xFFFFFFFF, 0x00000000,
  470. 0xE04, 0xFFFFFFFF, 0x00000000,
  471. 0xE08, 0x0000FF00, 0x00000000,
  472. 0x86C, 0xFFFFFF00, 0x00000000,
  473. 0xE10, 0xFFFFFFFF, 0x00000000,
  474. 0xE14, 0xFFFFFFFF, 0x00000000,
  475. 0xE18, 0xFFFFFFFF, 0x00000000,
  476. 0xE1C, 0xFFFFFFFF, 0x00000000,
  477. 0xE00, 0xFFFFFFFF, 0x00000000,
  478. 0xE04, 0xFFFFFFFF, 0x00000000,
  479. 0xE08, 0x0000FF00, 0x00000000,
  480. 0x86C, 0xFFFFFF00, 0x00000000,
  481. 0xE10, 0xFFFFFFFF, 0x00000000,
  482. 0xE14, 0xFFFFFFFF, 0x00000000,
  483. 0xE18, 0xFFFFFFFF, 0x00000000,
  484. 0xE1C, 0xFFFFFFFF, 0x00000000,
  485. };
  486. static void store_pwrindex_offset(struct adapter *adapter,
  487. u32 regaddr, u32 bitmask, u32 data)
  488. {
  489. struct hal_data_8188e *hal_data = GET_HAL_DATA(adapter);
  490. u32 * const power_level_offset =
  491. hal_data->MCSTxPowerLevelOriginalOffset[hal_data->pwrGroupCnt];
  492. if (regaddr == rTxAGC_A_Rate18_06)
  493. power_level_offset[0] = data;
  494. if (regaddr == rTxAGC_A_Rate54_24)
  495. power_level_offset[1] = data;
  496. if (regaddr == rTxAGC_A_CCK1_Mcs32)
  497. power_level_offset[6] = data;
  498. if (regaddr == rTxAGC_B_CCK11_A_CCK2_11 && bitmask == 0xffffff00)
  499. power_level_offset[7] = data;
  500. if (regaddr == rTxAGC_A_Mcs03_Mcs00)
  501. power_level_offset[2] = data;
  502. if (regaddr == rTxAGC_A_Mcs07_Mcs04)
  503. power_level_offset[3] = data;
  504. if (regaddr == rTxAGC_A_Mcs11_Mcs08)
  505. power_level_offset[4] = data;
  506. if (regaddr == rTxAGC_A_Mcs15_Mcs12) {
  507. power_level_offset[5] = data;
  508. if (hal_data->rf_type == RF_1T1R)
  509. hal_data->pwrGroupCnt++;
  510. }
  511. if (regaddr == rTxAGC_B_Rate18_06)
  512. power_level_offset[8] = data;
  513. if (regaddr == rTxAGC_B_Rate54_24)
  514. power_level_offset[9] = data;
  515. if (regaddr == rTxAGC_B_CCK1_55_Mcs32)
  516. power_level_offset[14] = data;
  517. if (regaddr == rTxAGC_B_CCK11_A_CCK2_11 && bitmask == 0x000000ff)
  518. power_level_offset[15] = data;
  519. if (regaddr == rTxAGC_B_Mcs03_Mcs00)
  520. power_level_offset[10] = data;
  521. if (regaddr == rTxAGC_B_Mcs07_Mcs04)
  522. power_level_offset[11] = data;
  523. if (regaddr == rTxAGC_B_Mcs11_Mcs08)
  524. power_level_offset[12] = data;
  525. if (regaddr == rTxAGC_B_Mcs15_Mcs12) {
  526. power_level_offset[13] = data;
  527. if (hal_data->rf_type != RF_1T1R)
  528. hal_data->pwrGroupCnt++;
  529. }
  530. }
  531. static void rtl_addr_delay(struct adapter *adapt,
  532. u32 addr, u32 bit_mask, u32 data)
  533. {
  534. switch (addr) {
  535. case 0xfe:
  536. msleep(50);
  537. break;
  538. case 0xfd:
  539. mdelay(5);
  540. break;
  541. case 0xfc:
  542. mdelay(1);
  543. break;
  544. case 0xfb:
  545. udelay(50);
  546. break;
  547. case 0xfa:
  548. udelay(5);
  549. break;
  550. case 0xf9:
  551. udelay(1);
  552. break;
  553. default:
  554. store_pwrindex_offset(adapt, addr, bit_mask, data);
  555. }
  556. }
  557. static bool config_bb_with_pgheader(struct adapter *adapt)
  558. {
  559. u32 i;
  560. const u32 arraylen = ARRAY_SIZE(array_phy_reg_pg_8188e);
  561. u32 *array = array_phy_reg_pg_8188e;
  562. for (i = 0; i < arraylen; i += 3) {
  563. u32 v1 = array[i];
  564. u32 v2 = array[i + 1];
  565. u32 v3 = array[i + 2];
  566. if (v1 < 0xCDCDCDCD)
  567. rtl_addr_delay(adapt, v1, v2, v3);
  568. }
  569. return true;
  570. }
  571. static void rtl88e_phy_init_bb_rf_register_definition(struct adapter *adapter)
  572. {
  573. struct hal_data_8188e *hal_data = GET_HAL_DATA(adapter);
  574. struct bb_reg_def *reg[4];
  575. reg[RF_PATH_A] = &hal_data->PHYRegDef[RF_PATH_A];
  576. reg[RF_PATH_B] = &hal_data->PHYRegDef[RF_PATH_B];
  577. reg[RF_PATH_C] = &hal_data->PHYRegDef[RF_PATH_C];
  578. reg[RF_PATH_D] = &hal_data->PHYRegDef[RF_PATH_D];
  579. reg[RF_PATH_A]->rfintfs = rFPGA0_XAB_RFInterfaceSW;
  580. reg[RF_PATH_B]->rfintfs = rFPGA0_XAB_RFInterfaceSW;
  581. reg[RF_PATH_C]->rfintfs = rFPGA0_XCD_RFInterfaceSW;
  582. reg[RF_PATH_D]->rfintfs = rFPGA0_XCD_RFInterfaceSW;
  583. reg[RF_PATH_A]->rfintfi = rFPGA0_XAB_RFInterfaceRB;
  584. reg[RF_PATH_B]->rfintfi = rFPGA0_XAB_RFInterfaceRB;
  585. reg[RF_PATH_C]->rfintfi = rFPGA0_XCD_RFInterfaceRB;
  586. reg[RF_PATH_D]->rfintfi = rFPGA0_XCD_RFInterfaceRB;
  587. reg[RF_PATH_A]->rfintfo = rFPGA0_XA_RFInterfaceOE;
  588. reg[RF_PATH_B]->rfintfo = rFPGA0_XB_RFInterfaceOE;
  589. reg[RF_PATH_A]->rfintfe = rFPGA0_XA_RFInterfaceOE;
  590. reg[RF_PATH_B]->rfintfe = rFPGA0_XB_RFInterfaceOE;
  591. reg[RF_PATH_A]->rf3wireOffset = rFPGA0_XA_LSSIParameter;
  592. reg[RF_PATH_B]->rf3wireOffset = rFPGA0_XB_LSSIParameter;
  593. reg[RF_PATH_A]->rfLSSI_Select = rFPGA0_XAB_RFParameter;
  594. reg[RF_PATH_B]->rfLSSI_Select = rFPGA0_XAB_RFParameter;
  595. reg[RF_PATH_C]->rfLSSI_Select = rFPGA0_XCD_RFParameter;
  596. reg[RF_PATH_D]->rfLSSI_Select = rFPGA0_XCD_RFParameter;
  597. reg[RF_PATH_A]->rfTxGainStage = rFPGA0_TxGainStage;
  598. reg[RF_PATH_B]->rfTxGainStage = rFPGA0_TxGainStage;
  599. reg[RF_PATH_C]->rfTxGainStage = rFPGA0_TxGainStage;
  600. reg[RF_PATH_D]->rfTxGainStage = rFPGA0_TxGainStage;
  601. reg[RF_PATH_A]->rfHSSIPara1 = rFPGA0_XA_HSSIParameter1;
  602. reg[RF_PATH_B]->rfHSSIPara1 = rFPGA0_XB_HSSIParameter1;
  603. reg[RF_PATH_A]->rfHSSIPara2 = rFPGA0_XA_HSSIParameter2;
  604. reg[RF_PATH_B]->rfHSSIPara2 = rFPGA0_XB_HSSIParameter2;
  605. reg[RF_PATH_A]->rfSwitchControl = rFPGA0_XAB_SwitchControl;
  606. reg[RF_PATH_B]->rfSwitchControl = rFPGA0_XAB_SwitchControl;
  607. reg[RF_PATH_C]->rfSwitchControl = rFPGA0_XCD_SwitchControl;
  608. reg[RF_PATH_D]->rfSwitchControl = rFPGA0_XCD_SwitchControl;
  609. reg[RF_PATH_A]->rfAGCControl1 = rOFDM0_XAAGCCore1;
  610. reg[RF_PATH_B]->rfAGCControl1 = rOFDM0_XBAGCCore1;
  611. reg[RF_PATH_C]->rfAGCControl1 = rOFDM0_XCAGCCore1;
  612. reg[RF_PATH_D]->rfAGCControl1 = rOFDM0_XDAGCCore1;
  613. reg[RF_PATH_A]->rfAGCControl2 = rOFDM0_XAAGCCore2;
  614. reg[RF_PATH_B]->rfAGCControl2 = rOFDM0_XBAGCCore2;
  615. reg[RF_PATH_C]->rfAGCControl2 = rOFDM0_XCAGCCore2;
  616. reg[RF_PATH_D]->rfAGCControl2 = rOFDM0_XDAGCCore2;
  617. reg[RF_PATH_A]->rfRxIQImbalance = rOFDM0_XARxIQImbalance;
  618. reg[RF_PATH_B]->rfRxIQImbalance = rOFDM0_XBRxIQImbalance;
  619. reg[RF_PATH_C]->rfRxIQImbalance = rOFDM0_XCRxIQImbalance;
  620. reg[RF_PATH_D]->rfRxIQImbalance = rOFDM0_XDRxIQImbalance;
  621. reg[RF_PATH_A]->rfRxAFE = rOFDM0_XARxAFE;
  622. reg[RF_PATH_B]->rfRxAFE = rOFDM0_XBRxAFE;
  623. reg[RF_PATH_C]->rfRxAFE = rOFDM0_XCRxAFE;
  624. reg[RF_PATH_D]->rfRxAFE = rOFDM0_XDRxAFE;
  625. reg[RF_PATH_A]->rfTxIQImbalance = rOFDM0_XATxIQImbalance;
  626. reg[RF_PATH_B]->rfTxIQImbalance = rOFDM0_XBTxIQImbalance;
  627. reg[RF_PATH_C]->rfTxIQImbalance = rOFDM0_XCTxIQImbalance;
  628. reg[RF_PATH_D]->rfTxIQImbalance = rOFDM0_XDTxIQImbalance;
  629. reg[RF_PATH_A]->rfTxAFE = rOFDM0_XATxAFE;
  630. reg[RF_PATH_B]->rfTxAFE = rOFDM0_XBTxAFE;
  631. reg[RF_PATH_C]->rfTxAFE = rOFDM0_XCTxAFE;
  632. reg[RF_PATH_D]->rfTxAFE = rOFDM0_XDTxAFE;
  633. reg[RF_PATH_A]->rfLSSIReadBack = rFPGA0_XA_LSSIReadBack;
  634. reg[RF_PATH_B]->rfLSSIReadBack = rFPGA0_XB_LSSIReadBack;
  635. reg[RF_PATH_C]->rfLSSIReadBack = rFPGA0_XC_LSSIReadBack;
  636. reg[RF_PATH_D]->rfLSSIReadBack = rFPGA0_XD_LSSIReadBack;
  637. reg[RF_PATH_A]->rfLSSIReadBackPi = TransceiverA_HSPI_Readback;
  638. reg[RF_PATH_B]->rfLSSIReadBackPi = TransceiverB_HSPI_Readback;
  639. }
  640. static bool config_parafile(struct adapter *adapt)
  641. {
  642. struct eeprom_priv *eeprom = GET_EEPROM_EFUSE_PRIV(adapt);
  643. struct hal_data_8188e *hal_data = GET_HAL_DATA(adapt);
  644. set_baseband_phy_config(adapt);
  645. /* If EEPROM or EFUSE autoload OK, We must config by PHY_REG_PG.txt */
  646. if (!eeprom->bautoload_fail_flag) {
  647. hal_data->pwrGroupCnt = 0;
  648. config_bb_with_pgheader(adapt);
  649. }
  650. set_baseband_agc_config(adapt);
  651. return true;
  652. }
  653. bool rtl88eu_phy_bb_config(struct adapter *adapt)
  654. {
  655. int rtstatus = true;
  656. struct hal_data_8188e *hal_data = GET_HAL_DATA(adapt);
  657. u32 regval;
  658. u8 crystal_cap;
  659. rtl88e_phy_init_bb_rf_register_definition(adapt);
  660. /* Enable BB and RF */
  661. regval = usb_read16(adapt, REG_SYS_FUNC_EN);
  662. usb_write16(adapt, REG_SYS_FUNC_EN,
  663. (u16)(regval | BIT(13) | BIT(0) | BIT(1)));
  664. usb_write8(adapt, REG_RF_CTRL, RF_EN | RF_RSTB | RF_SDMRSTB);
  665. usb_write8(adapt, REG_SYS_FUNC_EN, FEN_USBA |
  666. FEN_USBD | FEN_BB_GLB_RSTn | FEN_BBRSTB);
  667. /* Config BB and AGC */
  668. rtstatus = config_parafile(adapt);
  669. /* write 0x24[16:11] = 0x24[22:17] = crystal_cap */
  670. crystal_cap = hal_data->CrystalCap & 0x3F;
  671. phy_set_bb_reg(adapt, REG_AFE_XTAL_CTRL, 0x7ff800,
  672. (crystal_cap | (crystal_cap << 6)));
  673. return rtstatus;
  674. }