phydm_api.c 63 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2007 - 2017 Realtek Corporation.
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of version 2 of the GNU General Public License as
  7. * published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. *
  14. * The full GNU General Public License is included in this distribution in the
  15. * file called LICENSE.
  16. *
  17. * Contact Information:
  18. * wlanfae <wlanfae@realtek.com>
  19. * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
  20. * Hsinchu 300, Taiwan.
  21. *
  22. * Larry Finger <Larry.Finger@lwfinger.net>
  23. *
  24. *****************************************************************************/
  25. /*@************************************************************
  26. * include files
  27. * ************************************************************
  28. */
  29. #include "mp_precomp.h"
  30. #include "phydm_precomp.h"
  31. #if (ODM_IC_11AC_SERIES_SUPPORT)
  32. void phydm_reset_bb_hw_cnt_ac(void *dm_void)
  33. {
  34. struct dm_struct *dm = (struct dm_struct *)dm_void;
  35. /*@ Reset all counter when 1 (including PMAC and PHY)*/
  36. /* Reset Page F counter*/
  37. odm_set_bb_reg(dm, R_0xb58, BIT(0), 1);
  38. odm_set_bb_reg(dm, R_0xb58, BIT(0), 0);
  39. }
  40. #endif
  41. void phydm_dynamic_ant_weighting(void *dm_void)
  42. {
  43. struct dm_struct *dm = (struct dm_struct *)dm_void;
  44. #ifdef DYN_ANT_WEIGHTING_SUPPORT
  45. #if (RTL8197F_SUPPORT)
  46. if (dm->support_ic_type & (ODM_RTL8197F))
  47. phydm_dynamic_ant_weighting_8197f(dm);
  48. #endif
  49. #if (RTL8812A_SUPPORT)
  50. if (dm->support_ic_type & (ODM_RTL8812)) {
  51. phydm_dynamic_ant_weighting_8812a(dm);
  52. }
  53. #endif
  54. #if (RTL8822B_SUPPORT)
  55. if (dm->support_ic_type & (ODM_RTL8822B))
  56. phydm_dynamic_ant_weighting_8822b(dm);
  57. #endif
  58. #endif
  59. }
  60. #ifdef DYN_ANT_WEIGHTING_SUPPORT
  61. void phydm_ant_weight_dbg(void *dm_void, char input[][16], u32 *_used,
  62. char *output, u32 *_out_len)
  63. {
  64. struct dm_struct *dm = (struct dm_struct *)dm_void;
  65. char help[] = "-h";
  66. u32 var1[10] = {0};
  67. u32 used = *_used;
  68. u32 out_len = *_out_len;
  69. if ((strcmp(input[1], help) == 0)) {
  70. PDM_SNPF(out_len, used, output + used, out_len - used,
  71. "echo dis_dym_ant_weighting {0/1}\n");
  72. } else {
  73. PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);
  74. if (var1[0] == 1) {
  75. dm->is_disable_dym_ant_weighting = 1;
  76. PDM_SNPF(out_len, used, output + used, out_len - used,
  77. "Disable dyn-ant-weighting\n");
  78. } else {
  79. dm->is_disable_dym_ant_weighting = 0;
  80. PDM_SNPF(out_len, used, output + used, out_len - used,
  81. "Enable dyn-ant-weighting\n");
  82. }
  83. }
  84. *_used = used;
  85. *_out_len = out_len;
  86. }
  87. #endif
  88. void phydm_iq_gen_en(void *dm_void)
  89. {
  90. #ifdef PHYDM_COMPILE_IC_2SS
  91. struct dm_struct *dm = (struct dm_struct *)dm_void;
  92. u8 i = 0;
  93. enum rf_path path = RF_PATH_A;
  94. #if (ODM_IC_11AC_SERIES_SUPPORT)
  95. if (!(dm->support_ic_type & ODM_IC_11AC_SERIES))
  96. return;
  97. for (i = RF_PATH_A; i <= RF_PATH_B; i++) {
  98. path = (enum rf_path)i;
  99. /*RF mode table write enable*/
  100. odm_set_rf_reg(dm, path, RF_0xef, BIT(19), 0x1);
  101. /*Select RX mode*/
  102. odm_set_rf_reg(dm, path, RF_0x33, 0xF, 3);
  103. /*Set Table data*/
  104. odm_set_rf_reg(dm, path, RF_0x3e, 0xfffff, 0x00036);
  105. /*Set Table data*/
  106. odm_set_rf_reg(dm, path, RF_0x3f, 0xfffff, 0x5AFCE);
  107. /*RF mode table write disable*/
  108. odm_set_rf_reg(dm, path, RF_0xef, BIT(19), 0x0);
  109. }
  110. #endif
  111. #if (ODM_IC_11N_SERIES_SUPPORT)
  112. if (!(dm->support_ic_type & ODM_IC_11N_SERIES))
  113. return;
  114. if (dm->support_ic_type & ODM_RTL8192F) {
  115. /*RF mode table write enable*/
  116. odm_set_rf_reg(dm, RF_PATH_A, RF_0xef, 0x80000, 0x1);
  117. odm_set_rf_reg(dm, RF_PATH_B, RF_0xef, 0x80000, 0x1);
  118. /* Path A */
  119. odm_set_rf_reg(dm, RF_PATH_A, RF_0x30, 0xfffff, 0x08000);
  120. odm_set_rf_reg(dm, RF_PATH_A, RF_0x31, 0xfffff, 0x0005f);
  121. odm_set_rf_reg(dm, RF_PATH_A, RF_0x32, 0xfffff, 0x01042);
  122. odm_set_rf_reg(dm, RF_PATH_A, RF_0x30, 0xfffff, 0x18000);
  123. odm_set_rf_reg(dm, RF_PATH_A, RF_0x31, 0xfffff, 0x0004f);
  124. odm_set_rf_reg(dm, RF_PATH_A, RF_0x32, 0xfffff, 0x71fc2);
  125. /* Path B */
  126. odm_set_rf_reg(dm, RF_PATH_B, RF_0x30, 0xfffff, 0x08000);
  127. odm_set_rf_reg(dm, RF_PATH_B, RF_0x31, 0xfffff, 0x00050);
  128. odm_set_rf_reg(dm, RF_PATH_B, RF_0x32, 0xfffff, 0x01042);
  129. odm_set_rf_reg(dm, RF_PATH_B, RF_0x30, 0xfffff, 0x18000);
  130. odm_set_rf_reg(dm, RF_PATH_B, RF_0x31, 0xfffff, 0x00040);
  131. odm_set_rf_reg(dm, RF_PATH_B, RF_0x32, 0xfffff, 0x71fc2);
  132. /*RF mode table write disable*/
  133. odm_set_rf_reg(dm, RF_PATH_A, RF_0xef, 0x80000, 0x0);
  134. odm_set_rf_reg(dm, RF_PATH_B, RF_0xef, 0x80000, 0x0);
  135. }
  136. #endif
  137. #endif
  138. }
  139. void phydm_dis_cdd(void *dm_void)
  140. {
  141. #ifdef PHYDM_COMPILE_IC_2SS
  142. struct dm_struct *dm = (struct dm_struct *)dm_void;
  143. #if (ODM_IC_11AC_SERIES_SUPPORT)
  144. if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
  145. odm_set_bb_reg(dm, R_0x808, 0x3ffff00, 0);
  146. odm_set_bb_reg(dm, R_0x9ac, 0x1fff, 0);
  147. odm_set_bb_reg(dm, R_0x9ac, BIT(13), 1);
  148. }
  149. #endif
  150. #if (ODM_IC_11N_SERIES_SUPPORT)
  151. if (dm->support_ic_type & ODM_IC_11N_SERIES) {
  152. odm_set_bb_reg(dm, R_0x90c, 0xffffffff, 0x83321333);
  153. /* Set Tx delay setting for CCK pathA,B*/
  154. odm_set_bb_reg(dm, R_0xa2c, 0xf0000000, 0);
  155. //Enable Tx CDD for HT-portion when spatial expansion is applied
  156. odm_set_bb_reg(dm, R_0xd00, BIT(8), 0);
  157. /* Tx CDD for Legacy*/
  158. odm_set_bb_reg(dm, R_0xd04, 0xf0000, 0);
  159. /* Tx CDD for non-HT*/
  160. odm_set_bb_reg(dm, R_0xd0c, 0x3c0, 0);
  161. /* Tx CDD for HT SS1*/
  162. odm_set_bb_reg(dm, R_0xd0c, 0xf8000, 0);
  163. }
  164. #endif
  165. #endif
  166. }
  167. void phydm_pathb_q_matrix_rotate_en(void *dm_void)
  168. {
  169. #ifdef PHYDM_COMPILE_IC_2SS
  170. struct dm_struct *dm = (struct dm_struct *)dm_void;
  171. #if (ODM_IC_11AC_SERIES_SUPPORT)
  172. if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
  173. phydm_iq_gen_en(dm);
  174. #ifdef PHYDM_COMMON_API_SUPPORT
  175. if (!phydm_api_trx_mode(dm, BB_PATH_AB, BB_PATH_AB, true))
  176. return;
  177. #endif
  178. phydm_dis_cdd(dm);
  179. /*Set Q matrix r_v11 =1*/
  180. odm_set_bb_reg(dm, R_0x195c, MASKDWORD, 0x40000);
  181. phydm_pathb_q_matrix_rotate(dm, 0);
  182. /*Set Q matrix enable*/
  183. odm_set_bb_reg(dm, R_0x191c, BIT(7), 1);
  184. }
  185. #endif
  186. #if (ODM_IC_11N_SERIES_SUPPORT)
  187. if (dm->support_ic_type & ODM_IC_11N_SERIES) {
  188. phydm_iq_gen_en(dm);
  189. #ifdef PHYDM_COMMON_API_SUPPORT
  190. if (!phydm_api_trx_mode(dm, BB_PATH_AB, BB_PATH_AB, true))
  191. return;
  192. #endif
  193. phydm_dis_cdd(dm);
  194. phydm_pathb_q_matrix_rotate(dm, 0);
  195. }
  196. #endif
  197. #endif
  198. }
  199. void phydm_pathb_q_matrix_rotate(void *dm_void, u16 idx)
  200. {
  201. #ifdef PHYDM_COMPILE_IC_2SS
  202. struct dm_struct *dm = (struct dm_struct *)dm_void;
  203. #if (ODM_IC_11AC_SERIES_SUPPORT)
  204. u32 phase_table_0[12] = {0x40000, 0x376CF, 0x20000, 0x00000,
  205. 0xFE0000, 0xFC8930, 0xFC0000, 0xFC8930,
  206. 0xFDFFFF, 0x000000, 0x020000, 0x0376CF};
  207. u32 phase_table_1[12] = {0x00000, 0x1FFFF, 0x376CF, 0x40000,
  208. 0x0376CF, 0x01FFFF, 0x000000, 0xFDFFFF,
  209. 0xFC8930, 0xFC0000, 0xFC8930, 0xFDFFFF};
  210. #endif
  211. #if (ODM_IC_11N_SERIES_SUPPORT)
  212. u32 phase_table_N_0[12] = {0x00, 0x0B, 0x02, 0x00, 0x02, 0x02, 0x04,
  213. 0x02, 0x0D, 0x09, 0x04, 0x0B};
  214. u32 phase_table_N_1[12] = {0x40000100, 0x377F00DD, 0x201D8880,
  215. 0x00000000, 0xE01D8B80, 0xC8BF0322,
  216. 0xC000FF00, 0xC8BF0322, 0xDFE2777F,
  217. 0xFFC003FF, 0x20227480, 0x377F00DD};
  218. u32 phase_table_N_2[12] = {0x00, 0x1E, 0x3C, 0x4C, 0x3C, 0x1E, 0x0F,
  219. 0xD2, 0xC3, 0xC4, 0xC3, 0xD2};
  220. #endif
  221. if (idx >= 12) {
  222. PHYDM_DBG(dm, ODM_COMP_API, "Phase Set Error: %d\n", idx);
  223. return;
  224. }
  225. #if (ODM_IC_11AC_SERIES_SUPPORT)
  226. if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
  227. /*Set Q matrix r_v21*/
  228. odm_set_bb_reg(dm, R_0x1954, 0xffffff, phase_table_0[idx]);
  229. odm_set_bb_reg(dm, R_0x1950, 0xffffff, phase_table_1[idx]);
  230. }
  231. #endif
  232. #if (ODM_IC_11N_SERIES_SUPPORT)
  233. if (dm->support_ic_type & ODM_IC_11N_SERIES) {
  234. /*Set Q matrix r_v21*/
  235. odm_set_bb_reg(dm, R_0xc4c, 0xff000000, phase_table_N_0[idx]);
  236. odm_set_bb_reg(dm, R_0xc88, 0xffffffff, phase_table_N_1[idx]);
  237. odm_set_bb_reg(dm, R_0xc9c, 0xff000000, phase_table_N_2[idx]);
  238. }
  239. #endif
  240. #endif
  241. }
  242. void phydm_trx_antenna_setting_init(void *dm_void, u8 num_rf_path)
  243. {
  244. struct dm_struct *dm = (struct dm_struct *)dm_void;
  245. u8 rx_ant = 0, tx_ant = 0;
  246. u8 path_bitmap = 1;
  247. path_bitmap = (u8)phydm_gen_bitmask(num_rf_path);
  248. #if 0
  249. /*PHYDM_DBG(dm, ODM_COMP_INIT, "path_bitmap=0x%x\n", path_bitmap);*/
  250. #endif
  251. dm->tx_ant_status = path_bitmap;
  252. dm->rx_ant_status = path_bitmap;
  253. if (num_rf_path == PDM_1SS)
  254. return;
  255. #if (defined(PHYDM_COMPILE_ABOVE_2SS))
  256. if (dm->support_ic_type &
  257. (ODM_RTL8192F | ODM_RTL8192E | ODM_RTL8197F)) {
  258. dm->rx_ant_status = (u8)odm_get_bb_reg(dm, R_0xc04, 0x3);
  259. dm->tx_ant_status = (u8)odm_get_bb_reg(dm, R_0x90c, 0x3);
  260. } else if (dm->support_ic_type & (ODM_RTL8812 | ODM_RTL8814A)) {
  261. dm->rx_ant_status = (u8)odm_get_bb_reg(dm, R_0x808, 0xf);
  262. dm->tx_ant_status = (u8)odm_get_bb_reg(dm, R_0x80c, 0xf);
  263. }
  264. #endif
  265. PHYDM_DBG(dm, ODM_COMP_INIT, "[%s]ant_status{tx,rx}={0x%x, 0x%x}\n",
  266. __func__, dm->tx_ant_status, dm->rx_ant_status);
  267. }
  268. void phydm_config_ofdm_tx_path(void *dm_void, u32 path)
  269. {
  270. #if (RTL8192E_SUPPORT || RTL8812A_SUPPORT)
  271. struct dm_struct *dm = (struct dm_struct *)dm_void;
  272. u8 ofdm_tx_path = 0x33;
  273. if (dm->num_rf_path == PDM_1SS)
  274. return;
  275. switch (dm->support_ic_type) {
  276. #if (RTL8192E_SUPPORT)
  277. case ODM_RTL8192E:
  278. if (path == BB_PATH_A)
  279. odm_set_bb_reg(dm, R_0x90c, MASKDWORD, 0x81121111);
  280. else if (path == BB_PATH_B)
  281. odm_set_bb_reg(dm, R_0x90c, MASKDWORD, 0x82221222);
  282. else if (path == BB_PATH_AB)
  283. odm_set_bb_reg(dm, R_0x90c, MASKDWORD, 0x83321333);
  284. break;
  285. #endif
  286. #if (RTL8812A_SUPPORT)
  287. case ODM_RTL8812:
  288. if (path == BB_PATH_A)
  289. ofdm_tx_path = 0x11;
  290. else if (path == BB_PATH_B)
  291. ofdm_tx_path = 0x22;
  292. else if (path == BB_PATH_AB)
  293. ofdm_tx_path = 0x33;
  294. odm_set_bb_reg(dm, R_0x80c, 0xff00, ofdm_tx_path);
  295. break;
  296. #endif
  297. default:
  298. break;
  299. }
  300. #endif
  301. }
  302. void phydm_config_ofdm_rx_path(void *dm_void, u32 path)
  303. {
  304. struct dm_struct *dm = (struct dm_struct *)dm_void;
  305. u8 val = 0;
  306. if (dm->support_ic_type & (ODM_RTL8192E)) {
  307. #if (RTL8192E_SUPPORT)
  308. if (path == BB_PATH_A)
  309. val = 1;
  310. else if (path == BB_PATH_B)
  311. val = 2;
  312. else if (path == BB_PATH_AB)
  313. val = 3;
  314. odm_set_bb_reg(dm, R_0xc04, 0xff, ((val << 4) | val));
  315. odm_set_bb_reg(dm, R_0xd04, 0xf, val);
  316. #endif
  317. }
  318. #if (RTL8812A_SUPPORT || RTL8822B_SUPPORT)
  319. else if (dm->support_ic_type & (ODM_RTL8812 | ODM_RTL8822B)) {
  320. if (path == BB_PATH_A)
  321. val = 1;
  322. else if (path == BB_PATH_B)
  323. val = 2;
  324. else if (path == BB_PATH_AB)
  325. val = 3;
  326. odm_set_bb_reg(dm, R_0x808, MASKBYTE0, ((val << 4) | val));
  327. }
  328. #endif
  329. }
  330. void phydm_config_cck_rx_antenna_init(void *dm_void)
  331. {
  332. struct dm_struct *dm = (struct dm_struct *)dm_void;
  333. #if (defined(PHYDM_COMPILE_ABOVE_2SS))
  334. if (dm->support_ic_type & ODM_IC_1SS)
  335. return;
  336. /*@CCK 2R CCA parameters*/
  337. odm_set_bb_reg(dm, R_0xa00, BIT(15), 0x0); /*@Disable Ant diversity*/
  338. odm_set_bb_reg(dm, R_0xa70, BIT(7), 0); /*@Concurrent CCA at LSB & USB*/
  339. odm_set_bb_reg(dm, R_0xa74, BIT(8), 0); /*RX path diversity enable*/
  340. odm_set_bb_reg(dm, R_0xa14, BIT(7), 0); /*r_en_mrc_antsel*/
  341. odm_set_bb_reg(dm, R_0xa20, (BIT(5) | BIT(4)), 1); /*@MBC weighting*/
  342. if (dm->support_ic_type & (ODM_RTL8192E | ODM_RTL8197F | ODM_RTL8192F))
  343. odm_set_bb_reg(dm, R_0xa08, BIT(28), 1); /*r_cck_2nd_sel_eco*/
  344. else if (dm->support_ic_type & ODM_RTL8814A)
  345. odm_set_bb_reg(dm, R_0xa84, BIT(28), 1); /*@2R CCA only*/
  346. #endif
  347. }
  348. void phydm_config_cck_rx_path(void *dm_void, enum bb_path path)
  349. {
  350. #if (defined(PHYDM_COMPILE_ABOVE_2SS))
  351. struct dm_struct *dm = (struct dm_struct *)dm_void;
  352. u8 path_div_select = 0;
  353. u8 cck_path[2] = {0};
  354. u8 en_2R_path = 0;
  355. u8 en_2R_mrc = 0;
  356. u8 i = 0, j = 0;
  357. u8 num_enable_path = 0;
  358. u8 cck_mrc_max_path = 2;
  359. if (dm->support_ic_type & ODM_IC_1SS)
  360. return;
  361. for (i = 0; i < 4; i++) {
  362. if (path & BIT(i)) { /*@ex: PHYDM_ABCD*/
  363. num_enable_path++;
  364. cck_path[j] = i;
  365. j++;
  366. }
  367. if (num_enable_path >= cck_mrc_max_path)
  368. break;
  369. }
  370. if (num_enable_path > 1) {
  371. path_div_select = 1;
  372. en_2R_path = 1;
  373. en_2R_mrc = 1;
  374. } else {
  375. path_div_select = 0;
  376. en_2R_path = 0;
  377. en_2R_mrc = 0;
  378. }
  379. /*@CCK_1 input signal path*/
  380. odm_set_bb_reg(dm, R_0xa04, (BIT(27) | BIT(26)), cck_path[0]);
  381. /*@CCK_2 input signal path*/
  382. odm_set_bb_reg(dm, R_0xa04, (BIT(25) | BIT(24)), cck_path[1]);
  383. /*@enable Rx path diversity*/
  384. odm_set_bb_reg(dm, R_0xa74, BIT(8), path_div_select);
  385. /*@enable 2R Rx path*/
  386. odm_set_bb_reg(dm, R_0xa2c, BIT(18), en_2R_path);
  387. /*@enable 2R MRC*/
  388. odm_set_bb_reg(dm, R_0xa2c, BIT(22), en_2R_mrc);
  389. if (dm->support_ic_type & ODM_RTL8192F) {
  390. if (path == BB_PATH_A) {
  391. odm_set_bb_reg(dm, R_0xa04, (BIT(27) | BIT(26)), 0);
  392. odm_set_bb_reg(dm, R_0xa04, (BIT(25) | BIT(24)), 0);
  393. odm_set_bb_reg(dm, R_0xa74, BIT(8), 0);
  394. odm_set_bb_reg(dm, R_0xa2c, (BIT(18) | BIT(17)), 0);
  395. odm_set_bb_reg(dm, R_0xa2c, (BIT(22) | BIT(21)), 0);
  396. } else if (path == BB_PATH_B) {/*@for DC cancellation*/
  397. odm_set_bb_reg(dm, R_0xa04, (BIT(27) | BIT(26)), 1);
  398. odm_set_bb_reg(dm, R_0xa04, (BIT(25) | BIT(24)), 1);
  399. odm_set_bb_reg(dm, R_0xa74, BIT(8), 0);
  400. odm_set_bb_reg(dm, R_0xa2c, (BIT(18) | BIT(17)), 0);
  401. odm_set_bb_reg(dm, R_0xa2c, (BIT(22) | BIT(21)), 0);
  402. } else if (path == BB_PATH_AB) {
  403. odm_set_bb_reg(dm, R_0xa04, (BIT(27) | BIT(26)), 0);
  404. odm_set_bb_reg(dm, R_0xa04, (BIT(25) | BIT(24)), 1);
  405. odm_set_bb_reg(dm, R_0xa74, BIT(8), 1);
  406. odm_set_bb_reg(dm, R_0xa2c, (BIT(18) | BIT(17)), 1);
  407. odm_set_bb_reg(dm, R_0xa2c, (BIT(22) | BIT(21)), 1);
  408. }
  409. }
  410. #endif
  411. }
  412. void phydm_config_cck_tx_path(void *dm_void, enum bb_path path)
  413. {
  414. #if (defined(PHYDM_COMPILE_ABOVE_2SS))
  415. struct dm_struct *dm = (struct dm_struct *)dm_void;
  416. if (path == BB_PATH_A)
  417. odm_set_bb_reg(dm, R_0xa04, 0xf0000000, 0x8);
  418. else if (path == BB_PATH_B)
  419. odm_set_bb_reg(dm, R_0xa04, 0xf0000000, 0x4);
  420. else if (path == BB_PATH_AB)
  421. odm_set_bb_reg(dm, R_0xa04, 0xf0000000, 0xc);
  422. #endif
  423. }
  424. void phydm_config_trx_path_v2(void *dm_void, char input[][16], u32 *_used,
  425. char *output, u32 *_out_len)
  426. {
  427. #if (RTL8822B_SUPPORT || RTL8197F_SUPPORT || RTL8192F_SUPPORT)
  428. struct dm_struct *dm = (struct dm_struct *)dm_void;
  429. u32 used = *_used;
  430. u32 out_len = *_out_len;
  431. u32 val[10] = {0};
  432. char help[] = "-h";
  433. u8 i = 0, input_idx = 0;
  434. enum bb_path tx_path, rx_path;
  435. boolean dbg_mode_en, tx2_path_en;
  436. if (!(dm->support_ic_type &
  437. (ODM_RTL8822B | ODM_RTL8197F | ODM_RTL8192F)))
  438. return;
  439. for (i = 0; i < 5; i++) {
  440. if (input[i + 1]) {
  441. PHYDM_SSCANF(input[i + 1], DCMD_HEX, &val[i]);
  442. input_idx++;
  443. }
  444. }
  445. if (input_idx == 0)
  446. return;
  447. dbg_mode_en = (boolean)val[0];
  448. tx_path = (enum bb_path)val[1];
  449. rx_path = (enum bb_path)val[2];
  450. tx2_path_en = (boolean)val[3];
  451. if ((strcmp(input[1], help) == 0)) {
  452. PDM_SNPF(out_len, used, output + used, out_len - used,
  453. "{en} {tx_path} {rx_path} {1ss_tx_2_path_en}\n");
  454. } else if (dbg_mode_en) {
  455. dm->is_disable_phy_api = false;
  456. phydm_api_trx_mode(dm, tx_path, rx_path, tx2_path_en);
  457. dm->is_disable_phy_api = true;
  458. PDM_SNPF(out_len, used, output + used, out_len - used,
  459. "tx_path = 0x%x, rx_path = 0x%x, tx2_path_en = %d\n",
  460. tx_path, rx_path, tx2_path_en);
  461. } else {
  462. dm->is_disable_phy_api = false;
  463. PDM_SNPF(out_len, used, output + used, out_len - used,
  464. "Disable API debug mode\n");
  465. }
  466. #endif
  467. }
  468. void phydm_config_trx_path_v1(void *dm_void, char input[][16], u32 *_used,
  469. char *output, u32 *_out_len)
  470. {
  471. #if (RTL8192E_SUPPORT || RTL8812A_SUPPORT)
  472. struct dm_struct *dm = (struct dm_struct *)dm_void;
  473. u32 used = *_used;
  474. u32 out_len = *_out_len;
  475. u32 val[10] = {0};
  476. char help[] = "-h";
  477. u8 i = 0, input_idx = 0;
  478. if (!(dm->support_ic_type & (ODM_RTL8192E | ODM_RTL8812)))
  479. return;
  480. for (i = 0; i < 5; i++) {
  481. if (input[i + 1]) {
  482. PHYDM_SSCANF(input[i + 1], DCMD_HEX, &val[i]);
  483. input_idx++;
  484. }
  485. }
  486. if (input_idx == 0)
  487. return;
  488. if ((strcmp(input[1], help) == 0)) {
  489. PDM_SNPF(out_len, used, output + used, out_len - used,
  490. "{0:CCK, 1:OFDM} {1:TX, 2:RX} {1:path_A, 2:path_B, 3:path_AB}\n");
  491. *_used = used;
  492. *_out_len = out_len;
  493. return;
  494. } else if (val[0] == 0) {
  495. /* @CCK */
  496. if (val[1] == 1) { /*TX*/
  497. if (val[2] == 1)
  498. phydm_config_cck_tx_path(dm, BB_PATH_A);
  499. else if (val[2] == 2)
  500. phydm_config_cck_tx_path(dm, BB_PATH_B);
  501. else if (val[2] == 3)
  502. phydm_config_cck_tx_path(dm, BB_PATH_AB);
  503. } else if (val[1] == 2) { /*RX*/
  504. phydm_config_cck_rx_antenna_init(dm);
  505. if (val[2] == 1)
  506. phydm_config_cck_rx_path(dm, BB_PATH_A);
  507. else if (val[2] == 2)
  508. phydm_config_cck_rx_path(dm, BB_PATH_B);
  509. else if (val[2] == 3)
  510. phydm_config_cck_rx_path(dm, BB_PATH_AB);
  511. }
  512. }
  513. /* OFDM */
  514. else if (val[0] == 1) {
  515. if (val[1] == 1) /*TX*/
  516. phydm_config_ofdm_tx_path(dm, val[2]);
  517. else if (val[1] == 2) /*RX*/
  518. phydm_config_ofdm_rx_path(dm, val[2]);
  519. }
  520. PDM_SNPF(out_len, used, output + used, out_len - used,
  521. "PHYDM Set path [%s] [%s] = [%s%s%s%s]\n",
  522. (val[0] == 1) ? "OFDM" : "CCK",
  523. (val[1] == 1) ? "TX" : "RX",
  524. (val[2] & 0x1) ? "A" : "", (val[2] & 0x2) ? "B" : "",
  525. (val[2] & 0x4) ? "C" : "",
  526. (val[2] & 0x8) ? "D" : "");
  527. *_used = used;
  528. *_out_len = out_len;
  529. #endif
  530. }
  531. void phydm_config_trx_path(void *dm_void, char input[][16], u32 *_used,
  532. char *output, u32 *_out_len)
  533. {
  534. struct dm_struct *dm = (struct dm_struct *)dm_void;
  535. if (dm->support_ic_type & (ODM_RTL8192E | ODM_RTL8812)) {
  536. #if (RTL8192E_SUPPORT || RTL8812A_SUPPORT)
  537. phydm_config_trx_path_v1(dm, input, _used, output, _out_len);
  538. #endif
  539. } else if (dm->support_ic_type &
  540. (ODM_RTL8822B | ODM_RTL8197F | ODM_RTL8192F)) {
  541. #if (RTL8822B_SUPPORT || RTL8197F_SUPPORT || RTL8192F_SUPPORT)
  542. phydm_config_trx_path_v2(dm, input, _used, output, _out_len);
  543. #endif
  544. }
  545. }
  546. void phydm_tx_2path(void *dm_void)
  547. {
  548. #if (defined(PHYDM_COMPILE_IC_2SS))
  549. struct dm_struct *dm = (struct dm_struct *)dm_void;
  550. enum bb_path rx_path = (enum bb_path)dm->rx_ant_status;
  551. PHYDM_DBG(dm, ODM_COMP_API, "%s ======>\n", __func__);
  552. if (!(dm->support_ic_type & ODM_IC_2SS))
  553. return;
  554. #if (RTL8822B_SUPPORT || RTL8192F_SUPPORT || RTL8197F_SUPPORT)
  555. if (dm->support_ic_type & (ODM_RTL8822B | ODM_RTL8197F | ODM_RTL8192F))
  556. phydm_api_trx_mode(dm, BB_PATH_AB, rx_path, true);
  557. #endif
  558. #if (RTL8812A_SUPPORT || RTL8192E_SUPPORT)
  559. if (dm->support_ic_type & (ODM_RTL8812 | ODM_RTL8192E)) {
  560. phydm_config_cck_tx_path(dm, BB_PATH_AB);
  561. phydm_config_ofdm_tx_path(dm, BB_PATH_AB);
  562. }
  563. #endif
  564. #endif
  565. }
  566. void phydm_stop_3_wire(void *dm_void, u8 set_type)
  567. {
  568. struct dm_struct *dm = (struct dm_struct *)dm_void;
  569. if (set_type == PHYDM_SET) {
  570. /*@[Stop 3-wires]*/
  571. if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
  572. odm_set_bb_reg(dm, R_0xc00, 0xf, 0x4);
  573. odm_set_bb_reg(dm, R_0xe00, 0xf, 0x4);
  574. } else {
  575. odm_set_bb_reg(dm, R_0x88c, 0xf00000, 0xf);
  576. }
  577. } else { /*@if (set_type == PHYDM_REVERT)*/
  578. /*@[Start 3-wires]*/
  579. if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
  580. odm_set_bb_reg(dm, R_0xc00, 0xf, 0x7);
  581. odm_set_bb_reg(dm, R_0xe00, 0xf, 0x7);
  582. } else {
  583. odm_set_bb_reg(dm, R_0x88c, 0xf00000, 0x0);
  584. }
  585. }
  586. }
  587. u8 phydm_stop_ic_trx(void *dm_void, u8 set_type)
  588. {
  589. struct dm_struct *dm = (struct dm_struct *)dm_void;
  590. struct phydm_api_stuc *api = &dm->api_table;
  591. u32 i;
  592. u8 trx_idle_success = false;
  593. u32 dbg_port_value = 0;
  594. if (set_type == PHYDM_SET) {
  595. /*@[Stop TRX]---------------------------------------------------------*/
  596. /*set debug port to 0x0*/
  597. if (!phydm_set_bb_dbg_port(dm, DBGPORT_PRI_3, 0x0))
  598. return PHYDM_SET_FAIL;
  599. for (i = 0; i < 10000; i++) {
  600. dbg_port_value = phydm_get_bb_dbg_port_val(dm);
  601. /* PHYTXON && CCA_all */
  602. if ((dbg_port_value & (BIT(17) | BIT(3))) == 0) {
  603. PHYDM_DBG(dm, ODM_COMP_API,
  604. "Stop trx wait for (%d) times\n", i);
  605. trx_idle_success = true;
  606. break;
  607. }
  608. }
  609. phydm_release_bb_dbg_port(dm);
  610. if (trx_idle_success) {
  611. api->tx_queue_bitmap = odm_read_1byte(dm, R_0x522);
  612. /*pause all TX queue*/
  613. odm_set_bb_reg(dm, R_0x520, 0xff0000, 0xff);
  614. if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
  615. /*@disable CCK block*/
  616. odm_set_bb_reg(dm, R_0x808, BIT(28), 0);
  617. /*@disable OFDM RX CCA*/
  618. odm_set_bb_reg(dm, R_0x838, BIT(1), 1);
  619. } else {
  620. /* @disable whole CCK block */
  621. odm_set_bb_reg(dm, R_0x800, BIT(24), 0);
  622. api->rxiqc_reg1 = odm_read_4byte(dm, R_0xc14);
  623. api->rxiqc_reg2 = odm_read_4byte(dm, R_0xc1c);
  624. /* @[ Set IQK Matrix = 0 ]
  625. * equivalent to [ Turn off CCA]
  626. */
  627. odm_set_bb_reg(dm, R_0xc14, MASKDWORD, 0x0);
  628. odm_set_bb_reg(dm, R_0xc1c, MASKDWORD, 0x0);
  629. }
  630. } else {
  631. return PHYDM_SET_FAIL;
  632. }
  633. return PHYDM_SET_SUCCESS;
  634. } else { /*@if (set_type == PHYDM_REVERT)*/
  635. /*Release all TX queue*/
  636. odm_write_1byte(dm, R_0x522, api->tx_queue_bitmap);
  637. if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
  638. /*@enable CCK block*/
  639. odm_set_bb_reg(dm, R_0x808, BIT(28), 1);
  640. /*@enable OFDM RX CCA*/
  641. odm_set_bb_reg(dm, R_0x838, BIT(1), 0);
  642. } else {
  643. /* @enable whole CCK block */
  644. odm_set_bb_reg(dm, R_0x800, BIT(24), 1);
  645. /* @[Set IQK Matrix = 0] equivalent to [ Turn off CCA]*/
  646. odm_write_4byte(dm, R_0xc14, api->rxiqc_reg1);
  647. odm_write_4byte(dm, R_0xc1c, api->rxiqc_reg2);
  648. }
  649. return PHYDM_SET_SUCCESS;
  650. }
  651. }
  652. void phydm_set_ext_switch(void *dm_void, u32 ext_ant_switch)
  653. {
  654. #if (RTL8821A_SUPPORT || RTL8881A_SUPPORT)
  655. struct dm_struct *dm = (struct dm_struct *)dm_void;
  656. if (!(dm->support_ic_type & (ODM_RTL8821 | ODM_RTL8881A)))
  657. return;
  658. /*Output Pin Settings*/
  659. /*select DPDT_P and DPDT_N as output pin*/
  660. odm_set_mac_reg(dm, R_0x4c, BIT(23), 0);
  661. /*@by WLAN control*/
  662. odm_set_mac_reg(dm, R_0x4c, BIT(24), 1);
  663. /*@DPDT_N = 1b'0*/ /*@DPDT_P = 1b'0*/
  664. odm_set_bb_reg(dm, R_0xcb4, 0xFF, 77);
  665. if (ext_ant_switch == 1) { /*@2b'01*/
  666. odm_set_bb_reg(dm, R_0xcb4, (BIT(29) | BIT(28)), 1);
  667. PHYDM_DBG(dm, ODM_COMP_API, "8821A ant swh=2b'01\n");
  668. } else if (ext_ant_switch == 2) { /*@2b'10*/
  669. odm_set_bb_reg(dm, R_0xcb4, BIT(29) | BIT(28), 2);
  670. PHYDM_DBG(dm, ODM_COMP_API, "*8821A ant swh=2b'10\n");
  671. }
  672. #endif
  673. }
  674. void phydm_csi_mask_enable(void *dm_void, u32 enable)
  675. {
  676. struct dm_struct *dm = (struct dm_struct *)dm_void;
  677. boolean en = false;
  678. en = (enable == FUNC_ENABLE) ? true : false;
  679. if (dm->support_ic_type & ODM_IC_11N_SERIES) {
  680. odm_set_bb_reg(dm, R_0xd2c, BIT(28), en);
  681. PHYDM_DBG(dm, ODM_COMP_API,
  682. "Enable CSI Mask: Reg 0xD2C[28] = ((0x%x))\n", en);
  683. #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
  684. } else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
  685. if (en)
  686. odm_set_bb_reg(dm, R_0x1ee8, 0x3, 0x3);
  687. odm_set_bb_reg(dm, R_0xc0c, BIT(3), en);
  688. #endif
  689. } else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
  690. odm_set_bb_reg(dm, R_0x874, BIT(0), en);
  691. PHYDM_DBG(dm, ODM_COMP_API,
  692. "Enable CSI Mask: Reg 0x874[0] = ((0x%x))\n", en);
  693. }
  694. }
  695. void phydm_clean_all_csi_mask(void *dm_void)
  696. {
  697. struct dm_struct *dm = (struct dm_struct *)dm_void;
  698. if (dm->support_ic_type & ODM_IC_11N_SERIES) {
  699. odm_set_bb_reg(dm, R_0xd40, MASKDWORD, 0);
  700. odm_set_bb_reg(dm, R_0xd44, MASKDWORD, 0);
  701. odm_set_bb_reg(dm, R_0xd48, MASKDWORD, 0);
  702. odm_set_bb_reg(dm, R_0xd4c, MASKDWORD, 0);
  703. #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
  704. } else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
  705. u8 i = 0, idx_lmt = 0;
  706. if (dm->support_ic_type & ODM_RTL8822C)
  707. idx_lmt = 127;
  708. else/*@for IC supporting 80 + 80*/
  709. idx_lmt = 255;
  710. odm_set_bb_reg(dm, R_0x1d94, BIT(31) | BIT(30), 0x1);
  711. for (i = 0; i < idx_lmt; i++) {
  712. odm_set_bb_reg(dm, R_0x1d94, MASKBYTE2, i);
  713. odm_set_bb_reg(dm, R_0x1d94, MASKBYTE0, 0x0);
  714. }
  715. odm_set_bb_reg(dm, R_0x1ee8, 0x3, 0x0);
  716. #endif
  717. } else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
  718. odm_set_bb_reg(dm, R_0x880, MASKDWORD, 0);
  719. odm_set_bb_reg(dm, R_0x884, MASKDWORD, 0);
  720. odm_set_bb_reg(dm, R_0x888, MASKDWORD, 0);
  721. odm_set_bb_reg(dm, R_0x88c, MASKDWORD, 0);
  722. odm_set_bb_reg(dm, R_0x890, MASKDWORD, 0);
  723. odm_set_bb_reg(dm, R_0x894, MASKDWORD, 0);
  724. odm_set_bb_reg(dm, R_0x898, MASKDWORD, 0);
  725. odm_set_bb_reg(dm, R_0x89c, MASKDWORD, 0);
  726. }
  727. }
  728. void phydm_set_csi_mask(void *dm_void, u32 tone_idx_tmp, u8 tone_direction)
  729. {
  730. struct dm_struct *dm = (struct dm_struct *)dm_void;
  731. u8 byte_offset = 0, bit_offset = 0;
  732. u32 target_reg = 0;
  733. u8 reg_tmp_value = 0;
  734. u32 tone_num = 64;
  735. u32 tone_num_shift = 0;
  736. u32 csi_mask_reg_p = 0, csi_mask_reg_n = 0;
  737. /* @calculate real tone idx*/
  738. if ((tone_idx_tmp % 10) >= 5)
  739. tone_idx_tmp += 10;
  740. tone_idx_tmp = (tone_idx_tmp / 10);
  741. if (dm->support_ic_type & ODM_IC_11N_SERIES) {
  742. tone_num = 64;
  743. csi_mask_reg_p = 0xD40;
  744. csi_mask_reg_n = 0xD48;
  745. } else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
  746. tone_num = 128;
  747. csi_mask_reg_p = 0x880;
  748. csi_mask_reg_n = 0x890;
  749. }
  750. if (tone_direction == FREQ_POSITIVE) {
  751. if (tone_idx_tmp >= (tone_num - 1))
  752. tone_idx_tmp = (tone_num - 1);
  753. byte_offset = (u8)(tone_idx_tmp >> 3);
  754. bit_offset = (u8)(tone_idx_tmp & 0x7);
  755. target_reg = csi_mask_reg_p + byte_offset;
  756. } else {
  757. tone_num_shift = tone_num;
  758. if (tone_idx_tmp >= tone_num)
  759. tone_idx_tmp = tone_num;
  760. tone_idx_tmp = tone_num - tone_idx_tmp;
  761. byte_offset = (u8)(tone_idx_tmp >> 3);
  762. bit_offset = (u8)(tone_idx_tmp & 0x7);
  763. target_reg = csi_mask_reg_n + byte_offset;
  764. }
  765. reg_tmp_value = odm_read_1byte(dm, target_reg);
  766. PHYDM_DBG(dm, ODM_COMP_API,
  767. "Pre Mask tone idx[%d]: Reg0x%x = ((0x%x))\n",
  768. (tone_idx_tmp + tone_num_shift), target_reg, reg_tmp_value);
  769. reg_tmp_value |= BIT(bit_offset);
  770. odm_write_1byte(dm, target_reg, reg_tmp_value);
  771. PHYDM_DBG(dm, ODM_COMP_API,
  772. "New Mask tone idx[%d]: Reg0x%x = ((0x%x))\n",
  773. (tone_idx_tmp + tone_num_shift), target_reg, reg_tmp_value);
  774. }
  775. void phydm_set_nbi_reg(void *dm_void, u32 tone_idx_tmp, u32 bw)
  776. {
  777. struct dm_struct *dm = (struct dm_struct *)dm_void;
  778. /*tone_idx X 10*/
  779. u32 nbi_128[NBI_128TONE] = {25, 55, 85, 115, 135,
  780. 155, 185, 205, 225, 245,
  781. 265, 285, 305, 335, 355,
  782. 375, 395, 415, 435, 455,
  783. 485, 505, 525, 555, 585, 615, 635};
  784. /*tone_idx X 10*/
  785. u32 nbi_256[NBI_256TONE] = {25, 55, 85, 115, 135,
  786. 155, 175, 195, 225, 245,
  787. 265, 285, 305, 325, 345,
  788. 365, 385, 405, 425, 445,
  789. 465, 485, 505, 525, 545,
  790. 565, 585, 605, 625, 645,
  791. 665, 695, 715, 735, 755,
  792. 775, 795, 815, 835, 855,
  793. 875, 895, 915, 935, 955,
  794. 975, 995, 1015, 1035, 1055,
  795. 1085, 1105, 1125, 1145, 1175,
  796. 1195, 1225, 1255, 1275};
  797. u32 reg_idx = 0;
  798. u32 i;
  799. u8 nbi_table_idx = FFT_128_TYPE;
  800. if (dm->support_ic_type & ODM_IC_11N_SERIES) {
  801. nbi_table_idx = FFT_128_TYPE;
  802. } else if (dm->support_ic_type & ODM_IC_11AC_1_SERIES) {
  803. nbi_table_idx = FFT_256_TYPE;
  804. } else if (dm->support_ic_type & ODM_IC_11AC_2_SERIES) {
  805. if (bw == 80)
  806. nbi_table_idx = FFT_256_TYPE;
  807. else /*@20M, 40M*/
  808. nbi_table_idx = FFT_128_TYPE;
  809. }
  810. if (nbi_table_idx == FFT_128_TYPE) {
  811. for (i = 0; i < NBI_128TONE; i++) {
  812. if (tone_idx_tmp < nbi_128[i]) {
  813. reg_idx = i + 1;
  814. break;
  815. }
  816. }
  817. } else if (nbi_table_idx == FFT_256_TYPE) {
  818. for (i = 0; i < NBI_256TONE; i++) {
  819. if (tone_idx_tmp < nbi_256[i]) {
  820. reg_idx = i + 1;
  821. break;
  822. }
  823. }
  824. }
  825. if (dm->support_ic_type & ODM_IC_11N_SERIES) {
  826. odm_set_bb_reg(dm, R_0xc40, 0x1f000000, reg_idx);
  827. PHYDM_DBG(dm, ODM_COMP_API,
  828. "Set tone idx: Reg0xC40[28:24] = ((0x%x))\n",
  829. reg_idx);
  830. } else {
  831. odm_set_bb_reg(dm, R_0x87c, 0xfc000, reg_idx);
  832. PHYDM_DBG(dm, ODM_COMP_API,
  833. "Set tone idx: Reg0x87C[19:14] = ((0x%x))\n",
  834. reg_idx);
  835. }
  836. }
  837. void phydm_nbi_enable(void *dm_void, u32 enable)
  838. {
  839. struct dm_struct *dm = (struct dm_struct *)dm_void;
  840. u32 val = 0;
  841. val = (enable == FUNC_ENABLE) ? 1 : 0;
  842. PHYDM_DBG(dm, ODM_COMP_API, "Enable NBI=%d\n", val);
  843. if (dm->support_ic_type & ODM_IC_11N_SERIES) {
  844. if (dm->support_ic_type & (ODM_RTL8192F | ODM_RTL8197F)) {
  845. val = (enable == FUNC_ENABLE) ? 0xf : 0;
  846. odm_set_bb_reg(dm, R_0xc50, 0xf000000, val);
  847. } else {
  848. odm_set_bb_reg(dm, R_0xc40, BIT(9), val);
  849. }
  850. } else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
  851. if (dm->support_ic_type & (ODM_RTL8822B | ODM_RTL8821C)) {
  852. odm_set_bb_reg(dm, R_0x87c, BIT(13), val);
  853. odm_set_bb_reg(dm, R_0xc20, BIT(28), val);
  854. if (dm->rf_type > RF_1T1R)
  855. odm_set_bb_reg(dm, R_0xe20, BIT(28), val);
  856. } else {
  857. odm_set_bb_reg(dm, R_0x87c, BIT(13), val);
  858. }
  859. }
  860. }
  861. u8 phydm_find_fc(void *dm_void, u32 channel, u32 bw, u32 second_ch, u32 *fc_in)
  862. {
  863. struct dm_struct *dm = (struct dm_struct *)dm_void;
  864. u32 fc = *fc_in;
  865. u32 start_ch_per_40m[NUM_START_CH_40M] = {36, 44, 52, 60, 100,
  866. 108, 116, 124, 132, 140,
  867. 149, 157, 165, 173};
  868. u32 start_ch_per_80m[NUM_START_CH_80M] = {36, 52, 100, 116, 132,
  869. 149, 165};
  870. u32 *start_ch = &start_ch_per_40m[0];
  871. u32 num_start_channel = NUM_START_CH_40M;
  872. u32 channel_offset = 0;
  873. u32 i;
  874. /*@2.4G*/
  875. if (channel <= 14 && channel > 0) {
  876. if (bw == 80)
  877. return PHYDM_SET_FAIL;
  878. fc = 2412 + (channel - 1) * 5;
  879. if (bw == 40 && second_ch == PHYDM_ABOVE) {
  880. if (channel >= 10) {
  881. PHYDM_DBG(dm, ODM_COMP_API,
  882. "CH = ((%d)), Scnd_CH = ((%d)) Error setting\n",
  883. channel, second_ch);
  884. return PHYDM_SET_FAIL;
  885. }
  886. fc += 10;
  887. } else if (bw == 40 && (second_ch == PHYDM_BELOW)) {
  888. if (channel <= 2) {
  889. PHYDM_DBG(dm, ODM_COMP_API,
  890. "CH = ((%d)), Scnd_CH = ((%d)) Error setting\n",
  891. channel, second_ch);
  892. return PHYDM_SET_FAIL;
  893. }
  894. fc -= 10;
  895. }
  896. }
  897. /*@5G*/
  898. else if (channel >= 36 && channel <= 177) {
  899. if (bw != 20) {
  900. if (bw == 40) {
  901. num_start_channel = NUM_START_CH_40M;
  902. start_ch = &start_ch_per_40m[0];
  903. channel_offset = CH_OFFSET_40M;
  904. } else if (bw == 80) {
  905. num_start_channel = NUM_START_CH_80M;
  906. start_ch = &start_ch_per_80m[0];
  907. channel_offset = CH_OFFSET_80M;
  908. }
  909. for (i = 0; i < (num_start_channel - 1); i++) {
  910. if (channel < start_ch[i + 1]) {
  911. channel = start_ch[i] + channel_offset;
  912. break;
  913. }
  914. }
  915. PHYDM_DBG(dm, ODM_COMP_API, "Mod_CH = ((%d))\n",
  916. channel);
  917. }
  918. fc = 5180 + (channel - 36) * 5;
  919. } else {
  920. PHYDM_DBG(dm, ODM_COMP_API, "CH = ((%d)) Error setting\n",
  921. channel);
  922. return PHYDM_SET_FAIL;
  923. }
  924. *fc_in = fc;
  925. return PHYDM_SET_SUCCESS;
  926. }
  927. u8 phydm_find_intf_distance(void *dm_void, u32 bw, u32 fc, u32 f_interference,
  928. u32 *tone_idx_tmp_in)
  929. {
  930. struct dm_struct *dm = (struct dm_struct *)dm_void;
  931. u32 bw_up = 0, bw_low = 0;
  932. u32 int_distance = 0;
  933. u32 tone_idx_tmp = 0;
  934. u8 set_result = PHYDM_SET_NO_NEED;
  935. bw_up = fc + bw / 2;
  936. bw_low = fc - bw / 2;
  937. PHYDM_DBG(dm, ODM_COMP_API,
  938. "[f_l, fc, fh] = [ %d, %d, %d ], f_int = ((%d))\n", bw_low,
  939. fc, bw_up, f_interference);
  940. if (f_interference >= bw_low && f_interference <= bw_up) {
  941. int_distance = DIFF_2(fc, f_interference);
  942. /*@10*(int_distance /0.3125)*/
  943. tone_idx_tmp = (int_distance << 5);
  944. PHYDM_DBG(dm, ODM_COMP_API,
  945. "int_distance = ((%d MHz)) Mhz, tone_idx_tmp = ((%d.%d))\n",
  946. int_distance, tone_idx_tmp / 10,
  947. tone_idx_tmp % 10);
  948. *tone_idx_tmp_in = tone_idx_tmp;
  949. set_result = PHYDM_SET_SUCCESS;
  950. }
  951. return set_result;
  952. }
  953. u8 phydm_csi_mask_setting(void *dm_void, u32 enable, u32 ch, u32 bw,
  954. u32 f_intf, u32 sec_ch)
  955. {
  956. struct dm_struct *dm = (struct dm_struct *)dm_void;
  957. u32 fc = 2412;
  958. u8 direction = FREQ_POSITIVE;
  959. u32 tone_idx = 0;
  960. u8 set_result = PHYDM_SET_SUCCESS;
  961. u8 rpt = 0;
  962. if (enable == FUNC_DISABLE) {
  963. set_result = PHYDM_SET_SUCCESS;
  964. phydm_clean_all_csi_mask(dm);
  965. } else {
  966. PHYDM_DBG(dm, ODM_COMP_API,
  967. "[Set CSI MASK_] CH = ((%d)), BW = ((%d)), f_intf = ((%d)), Scnd_CH = ((%s))\n",
  968. ch, bw, f_intf,
  969. (((bw == 20) || (ch > 14)) ? "Don't care" :
  970. (sec_ch == PHYDM_ABOVE) ? "H" : "L"));
  971. /*@calculate fc*/
  972. if (phydm_find_fc(dm, ch, bw, sec_ch, &fc) == PHYDM_SET_FAIL) {
  973. set_result = PHYDM_SET_FAIL;
  974. } else {
  975. /*@calculate interference distance*/
  976. rpt = phydm_find_intf_distance(dm, bw, fc, f_intf,
  977. &tone_idx);
  978. if (rpt == PHYDM_SET_SUCCESS) {
  979. if (f_intf >= fc)
  980. direction = FREQ_POSITIVE;
  981. else
  982. direction = FREQ_NEGATIVE;
  983. phydm_set_csi_mask(dm, tone_idx, direction);
  984. set_result = PHYDM_SET_SUCCESS;
  985. } else {
  986. set_result = PHYDM_SET_NO_NEED;
  987. }
  988. }
  989. }
  990. if (set_result == PHYDM_SET_SUCCESS)
  991. phydm_csi_mask_enable(dm, enable);
  992. else
  993. phydm_csi_mask_enable(dm, FUNC_DISABLE);
  994. return set_result;
  995. }
  996. #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
  997. u8 phydm_csi_mask_setting_jgr3(void *dm_void, u32 enable, u32 ch, u32 bw,
  998. u32 f_intf, u32 sec_ch, u8 wgt)
  999. {
  1000. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1001. u32 fc = 2412;
  1002. u8 direction = FREQ_POSITIVE;
  1003. u32 tone_idx = 0;
  1004. u8 set_result = PHYDM_SET_SUCCESS;
  1005. u8 rpt = 0;
  1006. if (enable == FUNC_DISABLE) {
  1007. phydm_csi_mask_enable(dm, FUNC_ENABLE);
  1008. phydm_clean_all_csi_mask(dm);
  1009. phydm_csi_mask_enable(dm, FUNC_DISABLE);
  1010. set_result = PHYDM_SET_SUCCESS;
  1011. } else {
  1012. PHYDM_DBG(dm, ODM_COMP_API,
  1013. "[Set CSI MASK] CH = ((%d)), BW = ((%d)), f_intf = ((%d)), Scnd_CH = ((%s)), wgt = ((%d))\n",
  1014. ch, bw, f_intf,
  1015. (((bw == 20) || (ch > 14)) ? "Don't care" :
  1016. (sec_ch == PHYDM_ABOVE) ? "H" : "L"), wgt);
  1017. /*@calculate fc*/
  1018. if (phydm_find_fc(dm, ch, bw, sec_ch, &fc) == PHYDM_SET_FAIL) {
  1019. set_result = PHYDM_SET_FAIL;
  1020. } else {
  1021. /*@calculate interference distance*/
  1022. rpt = phydm_find_intf_distance(dm, bw, fc, f_intf,
  1023. &tone_idx);
  1024. if (rpt == PHYDM_SET_SUCCESS) {
  1025. if (f_intf >= fc)
  1026. direction = FREQ_POSITIVE;
  1027. else
  1028. direction = FREQ_NEGATIVE;
  1029. phydm_csi_mask_enable(dm, FUNC_ENABLE);
  1030. phydm_set_csi_mask_jgr3(dm, tone_idx, direction,
  1031. wgt);
  1032. set_result = PHYDM_SET_SUCCESS;
  1033. } else {
  1034. set_result = PHYDM_SET_NO_NEED;
  1035. }
  1036. }
  1037. if (!(set_result == PHYDM_SET_SUCCESS))
  1038. phydm_csi_mask_enable(dm, FUNC_DISABLE);
  1039. }
  1040. return set_result;
  1041. }
  1042. void phydm_set_csi_mask_jgr3(void *dm_void, u32 tone_idx_tmp, u8 tone_direction,
  1043. u8 wgt)
  1044. {
  1045. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1046. u32 reg_tmp_value = 0;
  1047. u32 tone_num = 64;
  1048. u32 tone_num_shift = 0;
  1049. u32 table_addr = 0;
  1050. u32 addr = 0;
  1051. u8 rf_bw = 0;
  1052. /* @calculate real tone idx*/
  1053. if ((tone_idx_tmp % 10) >= 5)
  1054. tone_idx_tmp += 10;
  1055. tone_idx_tmp = (tone_idx_tmp / 10);
  1056. rf_bw = odm_read_1byte(dm, R_0x9b0);
  1057. if (((rf_bw & 0xc) >> 2) == 0x2)
  1058. tone_num = 128; /* RF80 : tone-1 at tone_idx=255 */
  1059. else
  1060. tone_num = 64; /* RF20/40 : tone-1 at tone_idx=127 */
  1061. if (tone_direction == FREQ_POSITIVE) {
  1062. if (tone_idx_tmp >= (tone_num - 1))
  1063. tone_idx_tmp = (tone_num - 1);
  1064. } else {
  1065. tone_num_shift = tone_num;
  1066. if (tone_idx_tmp >= tone_num)
  1067. tone_idx_tmp = tone_num;
  1068. tone_idx_tmp = (tone_num << 1) - tone_idx_tmp;
  1069. }
  1070. table_addr = tone_idx_tmp >> 1;
  1071. reg_tmp_value = odm_read_4byte(dm, R_0x1d94);
  1072. PHYDM_DBG(dm, ODM_COMP_API,
  1073. "Pre Mask tone idx[%d]: Reg0x1d94 = ((0x%x))\n",
  1074. (tone_idx_tmp + tone_num_shift), reg_tmp_value);
  1075. odm_set_bb_reg(dm, R_0x1d94, MASKBYTE2, (table_addr & 0xff));
  1076. if (tone_idx_tmp % 2)
  1077. addr = 0xf;
  1078. else
  1079. addr = 0xf0;
  1080. odm_set_bb_reg(dm, R_0x1d94, addr, (BIT(3) | (wgt & 0x7)));
  1081. reg_tmp_value = odm_read_4byte(dm, R_0x1d94);
  1082. PHYDM_DBG(dm, ODM_COMP_API,
  1083. "New Mask tone idx[%d]: Reg0x1d94 = ((0x%x))\n",
  1084. (tone_idx_tmp + tone_num_shift), reg_tmp_value);
  1085. odm_set_bb_reg(dm, R_0x1ee8, 0x3, 0x0);
  1086. }
  1087. u8 phydm_nbi_setting_jgr3(void *dm_void, u32 enable, u32 ch, u32 bw, u32 f_intf,
  1088. u32 sec_ch, u8 path)
  1089. {
  1090. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1091. u32 fc = 2412;
  1092. u8 direction = FREQ_POSITIVE;
  1093. u32 tone_idx = 0;
  1094. u8 set_result = PHYDM_SET_SUCCESS;
  1095. u8 rpt = 0;
  1096. if (enable == FUNC_DISABLE) {
  1097. set_result = PHYDM_SET_SUCCESS;
  1098. } else {
  1099. PHYDM_DBG(dm, ODM_COMP_API,
  1100. "[Set NBI] CH = ((%d)), BW = ((%d)), f_intf = ((%d)), Scnd_CH = ((%s))\n",
  1101. ch, bw, f_intf,
  1102. (((sec_ch == PHYDM_DONT_CARE) || (bw == 20) ||
  1103. (ch > 14)) ? "Don't care" :
  1104. (sec_ch == PHYDM_ABOVE) ? "H" : "L"));
  1105. /*@calculate fc*/
  1106. if (phydm_find_fc(dm, ch, bw, sec_ch, &fc) == PHYDM_SET_FAIL) {
  1107. set_result = PHYDM_SET_FAIL;
  1108. } else {
  1109. /*@calculate interference distance*/
  1110. rpt = phydm_find_intf_distance(dm, bw, fc, f_intf,
  1111. &tone_idx);
  1112. if (rpt == PHYDM_SET_SUCCESS) {
  1113. if (f_intf >= fc)
  1114. direction = FREQ_POSITIVE;
  1115. else
  1116. direction = FREQ_NEGATIVE;
  1117. phydm_set_nbi_reg_jgr3(dm, tone_idx, direction,
  1118. path);
  1119. set_result = PHYDM_SET_SUCCESS;
  1120. } else {
  1121. set_result = PHYDM_SET_NO_NEED;
  1122. }
  1123. }
  1124. }
  1125. if (set_result == PHYDM_SET_SUCCESS)
  1126. phydm_nbi_enable_jgr3(dm, enable, path);
  1127. else
  1128. phydm_nbi_enable_jgr3(dm, FUNC_DISABLE, path);
  1129. return set_result;
  1130. }
  1131. void phydm_set_nbi_reg_jgr3(void *dm_void, u32 tone_idx_tmp, u8 tone_direction,
  1132. u8 path)
  1133. {
  1134. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1135. u32 reg_tmp_value = 0;
  1136. u32 tone_num = 64;
  1137. u32 tone_num_shift = 0;
  1138. u32 addr = 0;
  1139. u8 rf_bw = 0;
  1140. /* @calculate real tone idx*/
  1141. if ((tone_idx_tmp % 10) >= 5)
  1142. tone_idx_tmp += 10;
  1143. tone_idx_tmp = (tone_idx_tmp / 10);
  1144. rf_bw = odm_read_1byte(dm, R_0x9b0);
  1145. if (((rf_bw & 0xc) >> 2) == 0x2)
  1146. tone_num = 128; /* RF80 : tone-1 at tone_idx=255 */
  1147. else
  1148. tone_num = 64; /* RF20/40 : tone-1 at tone_idx=127 */
  1149. if (tone_direction == FREQ_POSITIVE) {
  1150. if (tone_idx_tmp >= (tone_num - 1))
  1151. tone_idx_tmp = (tone_num - 1);
  1152. } else {
  1153. tone_num_shift = tone_num;
  1154. if (tone_idx_tmp >= tone_num)
  1155. tone_idx_tmp = tone_num;
  1156. tone_idx_tmp = (tone_num << 1) - tone_idx_tmp;
  1157. }
  1158. switch (path) {
  1159. case RF_PATH_A:
  1160. odm_set_bb_reg(dm, R_0x1944, 0x001FF000, tone_idx_tmp);
  1161. PHYDM_DBG(dm, ODM_COMP_API,
  1162. "Set tone idx[%d]:PATH-A = ((0x%x))\n",
  1163. (tone_idx_tmp + tone_num_shift), tone_idx_tmp);
  1164. break;
  1165. #if (defined(PHYDM_COMPILE_ABOVE_2SS))
  1166. case RF_PATH_B:
  1167. odm_set_bb_reg(dm, R_0x4044, 0x001FF000, tone_idx_tmp);
  1168. PHYDM_DBG(dm, ODM_COMP_API,
  1169. "Set tone idx[%d]:PATH-B = ((0x%x))\n",
  1170. (tone_idx_tmp + tone_num_shift), tone_idx_tmp);
  1171. break;
  1172. #endif
  1173. #if (defined(PHYDM_COMPILE_ABOVE_3SS))
  1174. case RF_PATH_C:
  1175. odm_set_bb_reg(dm, R_0x5044, 0x001FF000, tone_idx_tmp);
  1176. PHYDM_DBG(dm, ODM_COMP_API,
  1177. "Set tone idx[%d]:PATH-C = ((0x%x))\n",
  1178. (tone_idx_tmp + tone_num_shift), tone_idx_tmp);
  1179. break;
  1180. #endif
  1181. #if (defined(PHYDM_COMPILE_ABOVE_4SS))
  1182. case RF_PATH_D:
  1183. odm_set_bb_reg(dm, R_0x5144, 0x001FF000, tone_idx_tmp);
  1184. PHYDM_DBG(dm, ODM_COMP_API,
  1185. "Set tone idx[%d]:PATH-D = ((0x%x))\n",
  1186. (tone_idx_tmp + tone_num_shift), tone_idx_tmp);
  1187. break;
  1188. #endif
  1189. default:
  1190. break;
  1191. }
  1192. }
  1193. void phydm_nbi_enable_jgr3(void *dm_void, u32 enable, u8 path)
  1194. {
  1195. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1196. u32 val = 0;
  1197. val = (enable == FUNC_ENABLE) ? 1 : 0;
  1198. PHYDM_DBG(dm, ODM_COMP_API, "Enable NBI=%d\n", val);
  1199. odm_set_bb_reg(dm, R_0x818, BIT(11), val);
  1200. if (enable == FUNC_ENABLE) {
  1201. switch (path) {
  1202. case RF_PATH_A:
  1203. odm_set_bb_reg(dm, R_0x1940, BIT(31), val);
  1204. break;
  1205. #if (defined(PHYDM_COMPILE_ABOVE_2SS))
  1206. case RF_PATH_B:
  1207. odm_set_bb_reg(dm, R_0x4040, BIT(31), val);
  1208. break;
  1209. #endif
  1210. #if (defined(PHYDM_COMPILE_ABOVE_3SS))
  1211. case RF_PATH_C:
  1212. odm_set_bb_reg(dm, R_0x5040, BIT(31), val);
  1213. break;
  1214. #endif
  1215. #if (defined(PHYDM_COMPILE_ABOVE_4SS))
  1216. case RF_PATH_D:
  1217. odm_set_bb_reg(dm, R_0x5140, BIT(31), val);
  1218. break;
  1219. #endif
  1220. default:
  1221. break;
  1222. }
  1223. } else {
  1224. odm_set_bb_reg(dm, R_0x1940, BIT(31), val);
  1225. #if (defined(PHYDM_COMPILE_ABOVE_2SS))
  1226. odm_set_bb_reg(dm, R_0x4040, BIT(31), val);
  1227. #endif
  1228. #if (defined(PHYDM_COMPILE_ABOVE_3SS))
  1229. odm_set_bb_reg(dm, R_0x5040, BIT(31), val);
  1230. #endif
  1231. #if (defined(PHYDM_COMPILE_ABOVE_4SS))
  1232. odm_set_bb_reg(dm, R_0x5140, BIT(31), val);
  1233. #endif
  1234. }
  1235. }
  1236. #endif
  1237. u8 phydm_nbi_setting(void *dm_void, u32 enable, u32 ch, u32 bw, u32 f_intf,
  1238. u32 sec_ch)
  1239. {
  1240. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1241. u32 fc = 2412;
  1242. u8 direction = FREQ_POSITIVE;
  1243. u32 tone_idx = 0;
  1244. u8 set_result = PHYDM_SET_SUCCESS;
  1245. u8 rpt = 0;
  1246. if (enable == FUNC_DISABLE) {
  1247. set_result = PHYDM_SET_SUCCESS;
  1248. } else {
  1249. PHYDM_DBG(dm, ODM_COMP_API,
  1250. "[Set NBI] CH = ((%d)), BW = ((%d)), f_intf = ((%d)), Scnd_CH = ((%s))\n",
  1251. ch, bw, f_intf,
  1252. (((sec_ch == PHYDM_DONT_CARE) || (bw == 20) ||
  1253. (ch > 14)) ? "Don't care" :
  1254. (sec_ch == PHYDM_ABOVE) ? "H" : "L"));
  1255. /*@calculate fc*/
  1256. if (phydm_find_fc(dm, ch, bw, sec_ch, &fc) == PHYDM_SET_FAIL) {
  1257. set_result = PHYDM_SET_FAIL;
  1258. } else {
  1259. /*@calculate interference distance*/
  1260. rpt = phydm_find_intf_distance(dm, bw, fc, f_intf,
  1261. &tone_idx);
  1262. if (rpt == PHYDM_SET_SUCCESS) {
  1263. if (f_intf >= fc)
  1264. direction = FREQ_POSITIVE;
  1265. else
  1266. direction = FREQ_NEGATIVE;
  1267. phydm_set_nbi_reg(dm, tone_idx, bw);
  1268. set_result = PHYDM_SET_SUCCESS;
  1269. } else {
  1270. set_result = PHYDM_SET_NO_NEED;
  1271. }
  1272. }
  1273. }
  1274. if (set_result == PHYDM_SET_SUCCESS)
  1275. phydm_nbi_enable(dm, enable);
  1276. else
  1277. phydm_nbi_enable(dm, FUNC_DISABLE);
  1278. return set_result;
  1279. }
  1280. void phydm_nbi_debug(void *dm_void, char input[][16], u32 *_used, char *output,
  1281. u32 *_out_len)
  1282. {
  1283. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1284. u32 used = *_used;
  1285. u32 out_len = *_out_len;
  1286. u32 val[10] = {0};
  1287. char help[] = "-h";
  1288. u8 i = 0, input_idx = 0, idx_lmt = 0;
  1289. u32 enable = 0; /*@function enable*/
  1290. u32 ch = 0;
  1291. u32 bw = 0;
  1292. u32 f_int = 0; /*@interference frequency*/
  1293. u32 sec_ch = 0; /*secondary channel*/
  1294. u8 rpt = 0;
  1295. u8 path = 0;
  1296. if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
  1297. idx_lmt = 6;
  1298. else
  1299. idx_lmt = 5;
  1300. for (i = 0; i < idx_lmt; i++) {
  1301. if (input[i + 1]) {
  1302. PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &val[i]);
  1303. input_idx++;
  1304. }
  1305. }
  1306. if (input_idx == 0)
  1307. return;
  1308. enable = val[0];
  1309. ch = val[1];
  1310. bw = val[2];
  1311. f_int = val[3];
  1312. sec_ch = val[4];
  1313. #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
  1314. path = (u8)val[5];
  1315. #endif
  1316. if ((strcmp(input[1], help) == 0)) {
  1317. #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
  1318. if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
  1319. PDM_SNPF(out_len, used, output + used, out_len - used,
  1320. "{en:1 Dis all path:2} {ch} {BW:20/40/80} {f_intf(Mhz)} {Scnd_CH(L=1, H=2)} {Path:A~D(0~3)}\n");
  1321. else
  1322. #endif
  1323. PDM_SNPF(out_len, used, output + used, out_len - used,
  1324. "{en:1 Dis:2} {ch} {BW:20/40/80} {f_intf(Mhz)} {Scnd_CH(L=1, H=2)}\n");
  1325. *_used = used;
  1326. *_out_len = out_len;
  1327. return;
  1328. } else if (val[0] == FUNC_ENABLE) {
  1329. PDM_SNPF(out_len, used, output + used, out_len - used,
  1330. "[Enable NBI] CH = ((%d)), BW = ((%d)), f_intf = ((%d)), Scnd_CH = ((%s))\n",
  1331. ch, bw, f_int,
  1332. ((sec_ch == PHYDM_DONT_CARE) ||
  1333. (bw == 20) || (ch > 14)) ? "Don't care" :
  1334. ((sec_ch == PHYDM_ABOVE) ? "H" : "L"));
  1335. #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
  1336. if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
  1337. rpt = phydm_nbi_setting_jgr3(dm, enable, ch, bw, f_int,
  1338. sec_ch, path);
  1339. else
  1340. #endif
  1341. rpt = phydm_nbi_setting(dm, enable, ch, bw, f_int,
  1342. sec_ch);
  1343. } else if (val[0] == FUNC_DISABLE) {
  1344. PDM_SNPF(out_len, used, output + used, out_len - used,
  1345. "[Disable NBI]\n");
  1346. #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
  1347. if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
  1348. rpt = phydm_nbi_setting_jgr3(dm, enable, ch, bw, f_int,
  1349. sec_ch, path);
  1350. else
  1351. #endif
  1352. rpt = phydm_nbi_setting(dm, enable, ch, bw, f_int,
  1353. sec_ch);
  1354. } else {
  1355. rpt = PHYDM_SET_FAIL;
  1356. }
  1357. PDM_SNPF(out_len, used, output + used, out_len - used,
  1358. "[NBI set result: %s]\n",
  1359. (rpt == PHYDM_SET_SUCCESS) ? "Success" :
  1360. ((rpt == PHYDM_SET_NO_NEED) ? "No need" : "Error"));
  1361. *_used = used;
  1362. *_out_len = out_len;
  1363. }
  1364. void phydm_csi_debug(void *dm_void, char input[][16], u32 *_used, char *output,
  1365. u32 *_out_len)
  1366. {
  1367. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1368. u32 used = *_used;
  1369. u32 out_len = *_out_len;
  1370. u32 val[10] = {0};
  1371. char help[] = "-h";
  1372. u8 i = 0, input_idx = 0, idx_lmt = 0;
  1373. u32 enable = 0; /*@function enable*/
  1374. u32 ch = 0;
  1375. u32 bw = 0;
  1376. u32 f_int = 0; /*@interference frequency*/
  1377. u32 sec_ch = 0; /*secondary channel*/
  1378. u8 rpt = 0;
  1379. u8 wgt = 0;
  1380. if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
  1381. idx_lmt = 6;
  1382. else
  1383. idx_lmt = 5;
  1384. for (i = 0; i < idx_lmt; i++) {
  1385. if (input[i + 1]) {
  1386. PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &val[i]);
  1387. input_idx++;
  1388. }
  1389. }
  1390. if (input_idx == 0)
  1391. return;
  1392. enable = val[0];
  1393. ch = val[1];
  1394. bw = val[2];
  1395. f_int = val[3];
  1396. sec_ch = val[4];
  1397. #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
  1398. wgt = (u8)val[5];
  1399. #endif
  1400. if ((strcmp(input[1], help) == 0)) {
  1401. #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
  1402. if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
  1403. PDM_SNPF(out_len, used, output + used, out_len - used,
  1404. "{en:1 Dis:2} {ch} {BW:20/40/80} {f_intf(Mhz)} {Scnd_CH(L=1, H=2)}\n{wgt:7:3/4,6:2/1,5:1/4,4:1/8,3:1/16,2:1/32,1:1/64,0:0}\n");
  1405. else
  1406. #endif
  1407. PDM_SNPF(out_len, used, output + used, out_len - used,
  1408. "{en:1 Dis:2} {ch} {BW:20/40/80} {f_intf(Mhz)} {Scnd_CH(L=1, H=2)}\n");
  1409. *_used = used;
  1410. *_out_len = out_len;
  1411. return;
  1412. } else if (val[0] == FUNC_ENABLE) {
  1413. PDM_SNPF(out_len, used, output + used, out_len - used,
  1414. "[Enable CSI MASK] CH = ((%d)), BW = ((%d)), f_intf = ((%d)), Scnd_CH = ((%s))\n",
  1415. ch, bw, f_int,
  1416. (ch > 14) ? "Don't care" :
  1417. (((sec_ch == PHYDM_DONT_CARE) ||
  1418. (bw == 20) || (ch > 14)) ? "H" : "L"));
  1419. #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
  1420. if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
  1421. rpt = phydm_csi_mask_setting_jgr3(dm, enable, ch, bw,
  1422. f_int, sec_ch, wgt);
  1423. else
  1424. #endif
  1425. rpt = phydm_csi_mask_setting(dm, enable, ch, bw, f_int,
  1426. sec_ch);
  1427. } else if (val[0] == FUNC_DISABLE) {
  1428. PDM_SNPF(out_len, used, output + used, out_len - used,
  1429. "[Disable CSI MASK]\n");
  1430. #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
  1431. if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
  1432. rpt = phydm_csi_mask_setting_jgr3(dm, enable, ch, bw,
  1433. f_int, sec_ch, wgt);
  1434. else
  1435. #endif
  1436. rpt = phydm_csi_mask_setting(dm, enable, ch, bw, f_int,
  1437. sec_ch);
  1438. } else {
  1439. rpt = PHYDM_SET_FAIL;
  1440. }
  1441. PDM_SNPF(out_len, used, output + used, out_len - used,
  1442. "[CSI MASK set result: %s]\n",
  1443. (rpt == PHYDM_SET_SUCCESS) ? "Success" :
  1444. ((rpt == PHYDM_SET_NO_NEED) ? "No need" : "Error"));
  1445. *_used = used;
  1446. *_out_len = out_len;
  1447. }
  1448. void phydm_stop_ck320(void *dm_void, u8 enable)
  1449. {
  1450. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1451. u32 val = enable ? 1 : 0;
  1452. if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
  1453. odm_set_bb_reg(dm, R_0x8b4, BIT(6), val);
  1454. } else {
  1455. if (dm->support_ic_type & ODM_IC_N_2SS) /*N-2SS*/
  1456. odm_set_bb_reg(dm, R_0x87c, BIT(29), val);
  1457. else /*N-1SS*/
  1458. odm_set_bb_reg(dm, R_0x87c, BIT(31), val);
  1459. }
  1460. }
  1461. boolean
  1462. phydm_set_bb_txagc_offset(void *dm_void, s8 power_offset, /*@(unit: dB)*/
  1463. u8 add_half_db /*@(+0.5 dB)*/)
  1464. {
  1465. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1466. s8 power_idx = power_offset * 2;
  1467. boolean set_success = false;
  1468. PHYDM_DBG(dm, ODM_COMP_API, "power_offset=%d, add_half_db =%d\n",
  1469. power_offset, add_half_db);
  1470. #if ODM_IC_11AC_SERIES_SUPPORT
  1471. if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
  1472. if (power_offset > -16 || power_offset < 15) {
  1473. if (add_half_db)
  1474. power_idx += 1;
  1475. power_idx &= 0x3f;
  1476. PHYDM_DBG(dm, ODM_COMP_API, "Reg_idx =0x%x\n",
  1477. power_idx);
  1478. odm_set_bb_reg(dm, R_0x8b4, 0x3f, power_idx);
  1479. set_success = true;
  1480. } else {
  1481. pr_debug("[Warning] TX AGC Offset Setting error!");
  1482. }
  1483. }
  1484. #endif
  1485. #if ODM_IC_11N_SERIES_SUPPORT
  1486. if (dm->support_ic_type & ODM_IC_11N_SERIES) {
  1487. if (power_offset > -8 || power_offset < 7) {
  1488. if (add_half_db)
  1489. power_idx += 1;
  1490. power_idx &= 0x1f;
  1491. PHYDM_DBG(dm, ODM_COMP_API, "Reg_idx =0x%x\n",
  1492. power_idx);
  1493. /*r_txagc_offset_a*/
  1494. odm_set_bb_reg(dm, R_0x80c, 0x1f00, power_idx);
  1495. /*r_txagc_offset_b*/
  1496. odm_set_bb_reg(dm, R_0x80c, 0x3e000, power_idx);
  1497. set_success = true;
  1498. } else {
  1499. pr_debug("[Warning] TX AGC Offset Setting error!");
  1500. }
  1501. }
  1502. #endif
  1503. return set_success;
  1504. }
  1505. #ifdef PHYDM_COMMON_API_SUPPORT
  1506. boolean
  1507. phydm_api_shift_txagc(void *dm_void, u32 pwr_offset, enum rf_path path,
  1508. boolean is_positive) {
  1509. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1510. boolean ret = false;
  1511. u32 txagc_cck = 0;
  1512. u32 txagc_ofdm = 0;
  1513. u32 r_txagc_ofdm[4] = {0x18e8, 0x41e8, 0x52e8, 0x53e8};
  1514. u32 r_txagc_cck[4] = {0x18a0, 0x41a0, 0x52a0, 0x53a0};
  1515. #if (RTL8822C_SUPPORT)
  1516. if (dm->support_ic_type & ODM_RTL8822C) {
  1517. if (path > RF_PATH_B) {
  1518. PHYDM_DBG(dm, ODM_PHY_CONFIG, "Unsupported path (%d)\n",
  1519. path);
  1520. return false;
  1521. }
  1522. txagc_cck = (u8)odm_get_bb_reg(dm, r_txagc_cck[path],
  1523. 0x7F0000);
  1524. txagc_ofdm = (u8)odm_get_bb_reg(dm, r_txagc_ofdm[path],
  1525. 0x1FC00);
  1526. if (is_positive) {
  1527. if (((txagc_cck + pwr_offset) > 127) ||
  1528. ((txagc_ofdm + pwr_offset) > 127))
  1529. return false;
  1530. txagc_cck += pwr_offset;
  1531. txagc_ofdm += pwr_offset;
  1532. } else {
  1533. if (pwr_offset > txagc_cck || pwr_offset > txagc_ofdm)
  1534. return false;
  1535. txagc_cck -= pwr_offset;
  1536. txagc_ofdm -= pwr_offset;
  1537. }
  1538. ret = config_phydm_write_txagc_ref_8822c(dm, (u8)txagc_cck,
  1539. path, PDM_CCK);
  1540. ret &= config_phydm_write_txagc_ref_8822c(dm, (u8)txagc_ofdm,
  1541. path, PDM_OFDM);
  1542. PHYDM_DBG(dm, ODM_PHY_CONFIG,
  1543. "%s: path-%d txagc_cck_ref=%x txagc_ofdm_ref=0x%x\n",
  1544. __func__, path, txagc_cck, txagc_ofdm);
  1545. }
  1546. #endif
  1547. return ret;
  1548. }
  1549. boolean
  1550. phydm_api_set_txagc(void *dm_void, u32 pwr_idx, enum rf_path path,
  1551. u8 rate, boolean is_single_rate)
  1552. {
  1553. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1554. boolean ret = false;
  1555. #if (RTL8198F_SUPPORT || RTL8822C_SUPPORT)
  1556. u8 base = 0;
  1557. u8 txagc_tmp = 0;
  1558. s8 pw_by_rate_tmp = 0;
  1559. s8 pw_by_rate_new = 0;
  1560. #endif
  1561. #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
  1562. u8 i = 0;
  1563. #endif
  1564. #if (RTL8822B_SUPPORT || RTL8821C_SUPPORT || RTL8195B_SUPPORT)
  1565. if (dm->support_ic_type &
  1566. (ODM_RTL8822B | ODM_RTL8821C | ODM_RTL8195B)) {
  1567. if (is_single_rate) {
  1568. #if (RTL8822B_SUPPORT)
  1569. if (dm->support_ic_type == ODM_RTL8822B)
  1570. ret = phydm_write_txagc_1byte_8822b(dm, pwr_idx,
  1571. path, rate);
  1572. #endif
  1573. #if (RTL8821C_SUPPORT)
  1574. if (dm->support_ic_type == ODM_RTL8821C)
  1575. ret = phydm_write_txagc_1byte_8821c(dm, pwr_idx,
  1576. path, rate);
  1577. #endif
  1578. #if (RTL8195B_SUPPORT)
  1579. if (dm->support_ic_type == ODM_RTL8195B)
  1580. ret = phydm_write_txagc_1byte_8195b(dm, pwr_idx,
  1581. path, rate);
  1582. #endif
  1583. #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
  1584. set_current_tx_agc(dm->priv, path, rate, (u8)pwr_idx);
  1585. #endif
  1586. } else {
  1587. #if (RTL8822B_SUPPORT)
  1588. if (dm->support_ic_type == ODM_RTL8822B)
  1589. ret = config_phydm_write_txagc_8822b(dm,
  1590. pwr_idx,
  1591. path,
  1592. rate);
  1593. #endif
  1594. #if (RTL8821C_SUPPORT)
  1595. if (dm->support_ic_type == ODM_RTL8821C)
  1596. ret = config_phydm_write_txagc_8821c(dm,
  1597. pwr_idx,
  1598. path,
  1599. rate);
  1600. #endif
  1601. #if (RTL8195B_SUPPORT)
  1602. if (dm->support_ic_type == ODM_RTL8195B)
  1603. ret = config_phydm_write_txagc_8195b(dm,
  1604. pwr_idx,
  1605. path,
  1606. rate);
  1607. #endif
  1608. #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
  1609. for (i = 0; i < 4; i++)
  1610. set_current_tx_agc(dm->priv, path, (rate + i),
  1611. (u8)pwr_idx);
  1612. #endif
  1613. }
  1614. }
  1615. #endif
  1616. #if (RTL8198F_SUPPORT)
  1617. if (dm->support_ic_type & ODM_RTL8198F) {
  1618. if (rate < 0x4)
  1619. txagc_tmp = config_phydm_read_txagc_8198f(dm, path,
  1620. rate,
  1621. PDM_CCK);
  1622. else
  1623. txagc_tmp = config_phydm_read_txagc_8198f(dm, path,
  1624. rate,
  1625. PDM_OFDM);
  1626. pw_by_rate_tmp = config_phydm_read_txagc_diff_8198f(dm, rate);
  1627. base = txagc_tmp - pw_by_rate_tmp;
  1628. if (DIFF_2(pwr_idx, base) > 63)
  1629. return false;
  1630. pw_by_rate_new = (s8)(pwr_idx - base);
  1631. ret = phydm_write_txagc_1byte_8198f(dm, pw_by_rate_new, rate);
  1632. PHYDM_DBG(dm, ODM_PHY_CONFIG,
  1633. "%s: path-%d rate_idx=%x base=0x%x new_diff=0x%x\n",
  1634. __func__, path, rate, base, pw_by_rate_new);
  1635. }
  1636. #endif
  1637. #if (RTL8822C_SUPPORT)
  1638. if (dm->support_ic_type & ODM_RTL8822C) {
  1639. if (rate < 0x4)
  1640. txagc_tmp = config_phydm_read_txagc_8822c(dm, path,
  1641. rate,
  1642. PDM_CCK);
  1643. else
  1644. txagc_tmp = config_phydm_read_txagc_8822c(dm, path,
  1645. rate,
  1646. PDM_OFDM);
  1647. pw_by_rate_tmp = config_phydm_read_txagc_diff_8822c(dm, rate);
  1648. base = txagc_tmp - pw_by_rate_tmp;
  1649. if (DIFF_2(pwr_idx, base) > 63)
  1650. return false;
  1651. pw_by_rate_new = (s8)(pwr_idx - base);
  1652. ret = phydm_write_txagc_1byte_8822c(dm, pw_by_rate_new, rate);
  1653. PHYDM_DBG(dm, ODM_PHY_CONFIG,
  1654. "%s: path-%d rate_idx=%x base=0x%x new_diff=0x%x\n",
  1655. __func__, path, rate, base, pw_by_rate_new);
  1656. }
  1657. #endif
  1658. #if (RTL8197F_SUPPORT)
  1659. if (dm->support_ic_type & ODM_RTL8197F)
  1660. ret = config_phydm_write_txagc_8197f(dm, pwr_idx, path, rate);
  1661. #endif
  1662. #if (RTL8192F_SUPPORT)
  1663. if (dm->support_ic_type & ODM_RTL8192F)
  1664. ret = config_phydm_write_txagc_8192f(dm, pwr_idx, path, rate);
  1665. #endif
  1666. return ret;
  1667. }
  1668. u8 phydm_api_get_txagc(void *dm_void, enum rf_path path, u8 hw_rate)
  1669. {
  1670. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1671. u8 ret = 0;
  1672. #if (RTL8822B_SUPPORT)
  1673. if (dm->support_ic_type & ODM_RTL8822B)
  1674. ret = config_phydm_read_txagc_8822b(dm, path, hw_rate);
  1675. #endif
  1676. #if (RTL8197F_SUPPORT)
  1677. if (dm->support_ic_type & ODM_RTL8197F)
  1678. ret = config_phydm_read_txagc_8197f(dm, path, hw_rate);
  1679. #endif
  1680. #if (RTL8821C_SUPPORT)
  1681. if (dm->support_ic_type & ODM_RTL8821C)
  1682. ret = config_phydm_read_txagc_8821c(dm, path, hw_rate);
  1683. #endif
  1684. #if (RTL8195B_SUPPORT)
  1685. if (dm->support_ic_type & ODM_RTL8195B)
  1686. ret = config_phydm_read_txagc_8195b(dm, path, hw_rate);
  1687. #endif
  1688. /*@jj add 20170822*/
  1689. #if (RTL8192F_SUPPORT)
  1690. if (dm->support_ic_type & ODM_RTL8192F)
  1691. ret = config_phydm_read_txagc_8192f(dm, path, hw_rate);
  1692. #endif
  1693. #if (RTL8198F_SUPPORT)
  1694. if (dm->support_ic_type & ODM_RTL8198F) {
  1695. if (hw_rate < 0x4) {
  1696. ret = config_phydm_read_txagc_8198f(dm, path, hw_rate,
  1697. PDM_CCK);
  1698. } else {
  1699. ret = config_phydm_read_txagc_8198f(dm, path, hw_rate,
  1700. PDM_OFDM);
  1701. }
  1702. }
  1703. #endif
  1704. #if (RTL8822C_SUPPORT)
  1705. if (dm->support_ic_type & ODM_RTL8822C) {
  1706. if (hw_rate < 0x4) {
  1707. ret = config_phydm_read_txagc_8822c(dm, path, hw_rate,
  1708. PDM_CCK);
  1709. } else {
  1710. ret = config_phydm_read_txagc_8822c(dm, path, hw_rate,
  1711. PDM_OFDM);
  1712. }
  1713. }
  1714. #endif
  1715. return ret;
  1716. }
  1717. boolean
  1718. phydm_api_switch_bw_channel(void *dm_void, u8 ch, u8 pri_ch,
  1719. enum channel_width bw)
  1720. {
  1721. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1722. boolean ret = false;
  1723. #if (RTL8822B_SUPPORT)
  1724. if (dm->support_ic_type & ODM_RTL8822B)
  1725. ret = config_phydm_switch_channel_bw_8822b(dm, ch, pri_ch, bw);
  1726. #endif
  1727. #if (RTL8197F_SUPPORT)
  1728. if (dm->support_ic_type & ODM_RTL8197F)
  1729. ret = config_phydm_switch_channel_bw_8197f(dm, ch, pri_ch, bw);
  1730. #endif
  1731. #if (RTL8821C_SUPPORT)
  1732. if (dm->support_ic_type & ODM_RTL8821C)
  1733. ret = config_phydm_switch_channel_bw_8821c(dm, ch, pri_ch, bw);
  1734. #endif
  1735. /*@jj add 20170822*/
  1736. #if (RTL8192F_SUPPORT)
  1737. if (dm->support_ic_type & ODM_RTL8192F)
  1738. ret = config_phydm_switch_channel_bw_8192f(dm, ch, pri_ch, bw);
  1739. #endif
  1740. #if (RTL8198F_SUPPORT)
  1741. if (dm->support_ic_type & ODM_RTL8198F)
  1742. ret = config_phydm_switch_channel_bw_8198f(dm, ch, pri_ch, bw);
  1743. #endif
  1744. #if (RTL8822C_SUPPORT)
  1745. if (dm->support_ic_type & ODM_RTL8822C)
  1746. ret = config_phydm_switch_channel_bw_8822c(dm, ch, pri_ch, bw);
  1747. #endif
  1748. return ret;
  1749. }
  1750. boolean
  1751. phydm_api_trx_mode(void *dm_void, enum bb_path tx_path, enum bb_path rx_path,
  1752. boolean is_2tx)
  1753. {
  1754. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1755. boolean ret = false;
  1756. #if (RTL8822B_SUPPORT)
  1757. if (dm->support_ic_type & ODM_RTL8822B)
  1758. ret = config_phydm_trx_mode_8822b(dm, tx_path, rx_path, is_2tx);
  1759. #endif
  1760. #if (RTL8197F_SUPPORT)
  1761. if (dm->support_ic_type & ODM_RTL8197F)
  1762. ret = config_phydm_trx_mode_8197f(dm, tx_path, rx_path, is_2tx);
  1763. #endif
  1764. #if (RTL8192F_SUPPORT)
  1765. if (dm->support_ic_type & ODM_RTL8192F)
  1766. ret = config_phydm_trx_mode_8192f(dm, tx_path, rx_path, is_2tx);
  1767. #endif
  1768. #if (RTL8198F_SUPPORT)
  1769. if (dm->support_ic_type & ODM_RTL8198F)
  1770. ret = config_phydm_trx_mode_8198f(dm, tx_path, rx_path, is_2tx);
  1771. #endif
  1772. #if (RTL8822C_SUPPORT)
  1773. if (dm->support_ic_type & ODM_RTL8822C)
  1774. ret = config_phydm_trx_mode_8822c(dm, tx_path, rx_path, is_2tx);
  1775. #endif
  1776. return ret;
  1777. }
  1778. #else
  1779. u8 config_phydm_read_txagc_n(void *dm_void, enum rf_path path, u8 hw_rate)
  1780. {
  1781. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1782. u8 read_back_data = INVALID_TXAGC_DATA;
  1783. u32 reg_txagc;
  1784. u32 reg_mask;
  1785. /* This function is for 92E/88E etc... */
  1786. /* @Input need to be HW rate index, not driver rate index!!!! */
  1787. /* @Error handling */
  1788. if (path > RF_PATH_B || hw_rate > ODM_RATEMCS15) {
  1789. PHYDM_DBG(dm, ODM_PHY_CONFIG, "%s: unsupported path (%d)\n",
  1790. __func__, path);
  1791. return INVALID_TXAGC_DATA;
  1792. }
  1793. if (path == RF_PATH_A) {
  1794. switch (hw_rate) {
  1795. case ODM_RATE1M:
  1796. reg_txagc = R_0xe08;
  1797. reg_mask = 0x00007f00;
  1798. break;
  1799. case ODM_RATE2M:
  1800. reg_txagc = R_0x86c;
  1801. reg_mask = 0x00007f00;
  1802. break;
  1803. case ODM_RATE5_5M:
  1804. reg_txagc = R_0x86c;
  1805. reg_mask = 0x007f0000;
  1806. break;
  1807. case ODM_RATE11M:
  1808. reg_txagc = R_0x86c;
  1809. reg_mask = 0x7f000000;
  1810. break;
  1811. case ODM_RATE6M:
  1812. reg_txagc = R_0xe00;
  1813. reg_mask = 0x0000007f;
  1814. break;
  1815. case ODM_RATE9M:
  1816. reg_txagc = R_0xe00;
  1817. reg_mask = 0x00007f00;
  1818. break;
  1819. case ODM_RATE12M:
  1820. reg_txagc = R_0xe00;
  1821. reg_mask = 0x007f0000;
  1822. break;
  1823. case ODM_RATE18M:
  1824. reg_txagc = R_0xe00;
  1825. reg_mask = 0x7f000000;
  1826. break;
  1827. case ODM_RATE24M:
  1828. reg_txagc = R_0xe04;
  1829. reg_mask = 0x0000007f;
  1830. break;
  1831. case ODM_RATE36M:
  1832. reg_txagc = R_0xe04;
  1833. reg_mask = 0x00007f00;
  1834. break;
  1835. case ODM_RATE48M:
  1836. reg_txagc = R_0xe04;
  1837. reg_mask = 0x007f0000;
  1838. break;
  1839. case ODM_RATE54M:
  1840. reg_txagc = R_0xe04;
  1841. reg_mask = 0x7f000000;
  1842. break;
  1843. case ODM_RATEMCS0:
  1844. reg_txagc = R_0xe10;
  1845. reg_mask = 0x0000007f;
  1846. break;
  1847. case ODM_RATEMCS1:
  1848. reg_txagc = R_0xe10;
  1849. reg_mask = 0x00007f00;
  1850. break;
  1851. case ODM_RATEMCS2:
  1852. reg_txagc = R_0xe10;
  1853. reg_mask = 0x007f0000;
  1854. break;
  1855. case ODM_RATEMCS3:
  1856. reg_txagc = R_0xe10;
  1857. reg_mask = 0x7f000000;
  1858. break;
  1859. case ODM_RATEMCS4:
  1860. reg_txagc = R_0xe14;
  1861. reg_mask = 0x0000007f;
  1862. break;
  1863. case ODM_RATEMCS5:
  1864. reg_txagc = R_0xe14;
  1865. reg_mask = 0x00007f00;
  1866. break;
  1867. case ODM_RATEMCS6:
  1868. reg_txagc = R_0xe14;
  1869. reg_mask = 0x007f0000;
  1870. break;
  1871. case ODM_RATEMCS7:
  1872. reg_txagc = R_0xe14;
  1873. reg_mask = 0x7f000000;
  1874. break;
  1875. case ODM_RATEMCS8:
  1876. reg_txagc = R_0xe18;
  1877. reg_mask = 0x0000007f;
  1878. break;
  1879. case ODM_RATEMCS9:
  1880. reg_txagc = R_0xe18;
  1881. reg_mask = 0x00007f00;
  1882. break;
  1883. case ODM_RATEMCS10:
  1884. reg_txagc = R_0xe18;
  1885. reg_mask = 0x007f0000;
  1886. break;
  1887. case ODM_RATEMCS11:
  1888. reg_txagc = R_0xe18;
  1889. reg_mask = 0x7f000000;
  1890. break;
  1891. case ODM_RATEMCS12:
  1892. reg_txagc = R_0xe1c;
  1893. reg_mask = 0x0000007f;
  1894. break;
  1895. case ODM_RATEMCS13:
  1896. reg_txagc = R_0xe1c;
  1897. reg_mask = 0x00007f00;
  1898. break;
  1899. case ODM_RATEMCS14:
  1900. reg_txagc = R_0xe1c;
  1901. reg_mask = 0x007f0000;
  1902. break;
  1903. case ODM_RATEMCS15:
  1904. reg_txagc = R_0xe1c;
  1905. reg_mask = 0x7f000000;
  1906. break;
  1907. default:
  1908. PHYDM_DBG(dm, ODM_PHY_CONFIG, "Invalid HWrate!\n");
  1909. break;
  1910. }
  1911. } else if (path == RF_PATH_B) {
  1912. switch (hw_rate) {
  1913. case ODM_RATE1M:
  1914. reg_txagc = R_0x838;
  1915. reg_mask = 0x00007f00;
  1916. break;
  1917. case ODM_RATE2M:
  1918. reg_txagc = R_0x838;
  1919. reg_mask = 0x007f0000;
  1920. break;
  1921. case ODM_RATE5_5M:
  1922. reg_txagc = R_0x838;
  1923. reg_mask = 0x7f000000;
  1924. break;
  1925. case ODM_RATE11M:
  1926. reg_txagc = R_0x86c;
  1927. reg_mask = 0x0000007f;
  1928. break;
  1929. case ODM_RATE6M:
  1930. reg_txagc = R_0x830;
  1931. reg_mask = 0x0000007f;
  1932. break;
  1933. case ODM_RATE9M:
  1934. reg_txagc = R_0x830;
  1935. reg_mask = 0x00007f00;
  1936. break;
  1937. case ODM_RATE12M:
  1938. reg_txagc = R_0x830;
  1939. reg_mask = 0x007f0000;
  1940. break;
  1941. case ODM_RATE18M:
  1942. reg_txagc = R_0x830;
  1943. reg_mask = 0x7f000000;
  1944. break;
  1945. case ODM_RATE24M:
  1946. reg_txagc = R_0x834;
  1947. reg_mask = 0x0000007f;
  1948. break;
  1949. case ODM_RATE36M:
  1950. reg_txagc = R_0x834;
  1951. reg_mask = 0x00007f00;
  1952. break;
  1953. case ODM_RATE48M:
  1954. reg_txagc = R_0x834;
  1955. reg_mask = 0x007f0000;
  1956. break;
  1957. case ODM_RATE54M:
  1958. reg_txagc = R_0x834;
  1959. reg_mask = 0x7f000000;
  1960. break;
  1961. case ODM_RATEMCS0:
  1962. reg_txagc = R_0x83c;
  1963. reg_mask = 0x0000007f;
  1964. break;
  1965. case ODM_RATEMCS1:
  1966. reg_txagc = R_0x83c;
  1967. reg_mask = 0x00007f00;
  1968. break;
  1969. case ODM_RATEMCS2:
  1970. reg_txagc = R_0x83c;
  1971. reg_mask = 0x007f0000;
  1972. break;
  1973. case ODM_RATEMCS3:
  1974. reg_txagc = R_0x83c;
  1975. reg_mask = 0x7f000000;
  1976. break;
  1977. case ODM_RATEMCS4:
  1978. reg_txagc = R_0x848;
  1979. reg_mask = 0x0000007f;
  1980. break;
  1981. case ODM_RATEMCS5:
  1982. reg_txagc = R_0x848;
  1983. reg_mask = 0x00007f00;
  1984. break;
  1985. case ODM_RATEMCS6:
  1986. reg_txagc = R_0x848;
  1987. reg_mask = 0x007f0000;
  1988. break;
  1989. case ODM_RATEMCS7:
  1990. reg_txagc = R_0x848;
  1991. reg_mask = 0x7f000000;
  1992. break;
  1993. case ODM_RATEMCS8:
  1994. reg_txagc = R_0x84c;
  1995. reg_mask = 0x0000007f;
  1996. break;
  1997. case ODM_RATEMCS9:
  1998. reg_txagc = R_0x84c;
  1999. reg_mask = 0x00007f00;
  2000. break;
  2001. case ODM_RATEMCS10:
  2002. reg_txagc = R_0x84c;
  2003. reg_mask = 0x007f0000;
  2004. break;
  2005. case ODM_RATEMCS11:
  2006. reg_txagc = R_0x84c;
  2007. reg_mask = 0x7f000000;
  2008. break;
  2009. case ODM_RATEMCS12:
  2010. reg_txagc = R_0x868;
  2011. reg_mask = 0x0000007f;
  2012. break;
  2013. case ODM_RATEMCS13:
  2014. reg_txagc = R_0x868;
  2015. reg_mask = 0x00007f00;
  2016. break;
  2017. case ODM_RATEMCS14:
  2018. reg_txagc = R_0x868;
  2019. reg_mask = 0x007f0000;
  2020. break;
  2021. case ODM_RATEMCS15:
  2022. reg_txagc = R_0x868;
  2023. reg_mask = 0x7f000000;
  2024. break;
  2025. default:
  2026. PHYDM_DBG(dm, ODM_PHY_CONFIG, "Invalid HWrate!\n");
  2027. break;
  2028. }
  2029. } else {
  2030. PHYDM_DBG(dm, ODM_PHY_CONFIG, "Invalid RF path!!\n");
  2031. }
  2032. read_back_data = (u8)odm_get_bb_reg(dm, reg_txagc, reg_mask);
  2033. PHYDM_DBG(dm, ODM_PHY_CONFIG, "%s: path-%d rate index 0x%x = 0x%x\n",
  2034. __func__, path, hw_rate, read_back_data);
  2035. return read_back_data;
  2036. }
  2037. #endif
  2038. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  2039. void phydm_normal_driver_rx_sniffer(
  2040. struct dm_struct *dm,
  2041. u8 *desc,
  2042. PRT_RFD_STATUS rt_rfd_status,
  2043. u8 *drv_info,
  2044. u8 phy_status)
  2045. {
  2046. #if (defined(CONFIG_PHYDM_RX_SNIFFER_PARSING))
  2047. u32 *msg;
  2048. u16 seq_num;
  2049. if (rt_rfd_status->packet_report_type != NORMAL_RX)
  2050. return;
  2051. if (!dm->is_linked) {
  2052. if (rt_rfd_status->is_hw_error)
  2053. return;
  2054. }
  2055. if (phy_status == true) {
  2056. if (dm->rx_pkt_type == type_block_ack ||
  2057. dm->rx_pkt_type == type_rts || dm->rx_pkt_type == type_cts)
  2058. seq_num = 0;
  2059. else
  2060. seq_num = rt_rfd_status->seq_num;
  2061. PHYDM_DBG_F(dm, ODM_COMP_SNIFFER,
  2062. "%04d , %01s, rate=0x%02x, L=%04d , %s , %s",
  2063. seq_num,
  2064. /*rt_rfd_status->mac_id,*/
  2065. (rt_rfd_status->is_crc ? "C" :
  2066. rt_rfd_status->is_ampdu ? "A" : "_"),
  2067. rt_rfd_status->data_rate,
  2068. rt_rfd_status->length,
  2069. ((rt_rfd_status->band_width == 0) ? "20M" :
  2070. ((rt_rfd_status->band_width == 1) ? "40M" : "80M")),
  2071. (rt_rfd_status->is_ldpc ? "LDP" : "BCC"));
  2072. if (dm->rx_pkt_type == type_asoc_req)
  2073. PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "AS_REQ");
  2074. else if (dm->rx_pkt_type == type_asoc_rsp)
  2075. PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "AS_RSP");
  2076. else if (dm->rx_pkt_type == type_probe_req)
  2077. PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "PR_REQ");
  2078. else if (dm->rx_pkt_type == type_probe_rsp)
  2079. PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "PR_RSP");
  2080. else if (dm->rx_pkt_type == type_deauth)
  2081. PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "DEAUTH");
  2082. else if (dm->rx_pkt_type == type_beacon)
  2083. PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "BEACON");
  2084. else if (dm->rx_pkt_type == type_block_ack_req)
  2085. PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "BA_REQ");
  2086. else if (dm->rx_pkt_type == type_rts)
  2087. PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "__RTS_");
  2088. else if (dm->rx_pkt_type == type_cts)
  2089. PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "__CTS_");
  2090. else if (dm->rx_pkt_type == type_ack)
  2091. PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "__ACK_");
  2092. else if (dm->rx_pkt_type == type_block_ack)
  2093. PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "__BA__");
  2094. else if (dm->rx_pkt_type == type_data)
  2095. PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "_DATA_");
  2096. else if (dm->rx_pkt_type == type_data_ack)
  2097. PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "Data_Ack");
  2098. else if (dm->rx_pkt_type == type_qos_data)
  2099. PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "QoS_Data");
  2100. else
  2101. PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [0x%x]",
  2102. dm->rx_pkt_type);
  2103. PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [RSSI=%d,%d,%d,%d ]",
  2104. dm->rssi_a,
  2105. dm->rssi_b,
  2106. dm->rssi_c,
  2107. dm->rssi_d);
  2108. msg = (u32 *)drv_info;
  2109. PHYDM_DBG_F(dm, ODM_COMP_SNIFFER,
  2110. " , P-STS[28:0]=%08x-%08x-%08x-%08x-%08x-%08x-%08x\n",
  2111. msg[6], msg[5], msg[4], msg[3],
  2112. msg[2], msg[1], msg[1]);
  2113. } else {
  2114. PHYDM_DBG_F(dm, ODM_COMP_SNIFFER,
  2115. "%04d , %01s, rate=0x%02x, L=%04d , %s , %s\n",
  2116. rt_rfd_status->seq_num,
  2117. /*rt_rfd_status->mac_id,*/
  2118. (rt_rfd_status->is_crc ? "C" :
  2119. (rt_rfd_status->is_ampdu) ? "A" : "_"),
  2120. rt_rfd_status->data_rate,
  2121. rt_rfd_status->length,
  2122. ((rt_rfd_status->band_width == 0) ? "20M" :
  2123. ((rt_rfd_status->band_width == 1) ? "40M" : "80M")),
  2124. (rt_rfd_status->is_ldpc ? "LDP" : "BCC"));
  2125. }
  2126. #endif
  2127. }
  2128. #endif