phydm_adaptivity.c 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140
  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. /* ************************************************************
  21. * include files
  22. * ************************************************************ */
  23. #include "mp_precomp.h"
  24. #include "phydm_precomp.h"
  25. #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  26. #if WPP_SOFTWARE_TRACE
  27. #include "PhyDM_Adaptivity.tmh"
  28. #endif
  29. #endif
  30. void
  31. phydm_check_adaptivity(
  32. void *p_dm_void
  33. )
  34. {
  35. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  36. struct _ADAPTIVITY_STATISTICS *adaptivity = (struct _ADAPTIVITY_STATISTICS *)phydm_get_structure(p_dm_odm, PHYDM_ADAPTIVITY);
  37. if (p_dm_odm->support_ability & ODM_BB_ADAPTIVITY) {
  38. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  39. if (p_dm_odm->ap_total_num > adaptivity->ap_num_th) {
  40. p_dm_odm->adaptivity_enable = false;
  41. p_dm_odm->adaptivity_flag = false;
  42. ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("AP total num > %d!!, disable adaptivity\n", adaptivity->ap_num_th));
  43. } else
  44. #endif
  45. {
  46. if (adaptivity->dynamic_link_adaptivity || adaptivity->acs_for_adaptivity) {
  47. if (p_dm_odm->is_linked && adaptivity->is_check == false) {
  48. phydm_nhm_counter_statistics(p_dm_odm);
  49. phydm_check_environment(p_dm_odm);
  50. } else if (!p_dm_odm->is_linked)
  51. adaptivity->is_check = false;
  52. } else {
  53. p_dm_odm->adaptivity_enable = true;
  54. if (p_dm_odm->support_ic_type & (ODM_IC_11AC_GAIN_IDX_EDCCA | ODM_IC_11N_GAIN_IDX_EDCCA))
  55. p_dm_odm->adaptivity_flag = false;
  56. else
  57. p_dm_odm->adaptivity_flag = true;
  58. }
  59. }
  60. } else {
  61. p_dm_odm->adaptivity_enable = false;
  62. p_dm_odm->adaptivity_flag = false;
  63. }
  64. }
  65. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  66. boolean
  67. phydm_check_channel_plan(
  68. void *p_dm_void
  69. )
  70. {
  71. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  72. struct _ADAPTER *p_adapter = p_dm_odm->adapter;
  73. PMGNT_INFO p_mgnt_info = &(p_adapter->MgntInfo);
  74. if (p_mgnt_info->RegEnableAdaptivity == 2) {
  75. if (p_dm_odm->carrier_sense_enable == false) { /*check domain Code for adaptivity or CarrierSense*/
  76. if ((*p_dm_odm->p_band_type == ODM_BAND_5G) &&
  77. !(p_dm_odm->odm_regulation_5g == REGULATION_ETSI || p_dm_odm->odm_regulation_5g == REGULATION_WW)) {
  78. ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("adaptivity skip 5G domain code : %d\n", p_dm_odm->odm_regulation_5g));
  79. p_dm_odm->adaptivity_enable = false;
  80. p_dm_odm->adaptivity_flag = false;
  81. return true;
  82. } else if ((*p_dm_odm->p_band_type == ODM_BAND_2_4G) &&
  83. !(p_dm_odm->odm_regulation_2_4g == REGULATION_ETSI || p_dm_odm->odm_regulation_2_4g == REGULATION_WW)) {
  84. ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("adaptivity skip 2.4G domain code : %d\n", p_dm_odm->odm_regulation_2_4g));
  85. p_dm_odm->adaptivity_enable = false;
  86. p_dm_odm->adaptivity_flag = false;
  87. return true;
  88. } else if ((*p_dm_odm->p_band_type != ODM_BAND_2_4G) && (*p_dm_odm->p_band_type != ODM_BAND_5G)) {
  89. ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("adaptivity neither 2G nor 5G band, return\n"));
  90. p_dm_odm->adaptivity_enable = false;
  91. p_dm_odm->adaptivity_flag = false;
  92. return true;
  93. }
  94. } else {
  95. if ((*p_dm_odm->p_band_type == ODM_BAND_5G) &&
  96. !(p_dm_odm->odm_regulation_5g == REGULATION_MKK || p_dm_odm->odm_regulation_5g == REGULATION_WW)) {
  97. ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("CarrierSense skip 5G domain code : %d\n", p_dm_odm->odm_regulation_5g));
  98. p_dm_odm->adaptivity_enable = false;
  99. p_dm_odm->adaptivity_flag = false;
  100. return true;
  101. }
  102. else if ((*p_dm_odm->p_band_type == ODM_BAND_2_4G) &&
  103. !(p_dm_odm->odm_regulation_2_4g == REGULATION_MKK || p_dm_odm->odm_regulation_2_4g == REGULATION_WW)) {
  104. ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("CarrierSense skip 2.4G domain code : %d\n", p_dm_odm->odm_regulation_2_4g));
  105. p_dm_odm->adaptivity_enable = false;
  106. p_dm_odm->adaptivity_flag = false;
  107. return true;
  108. } else if ((*p_dm_odm->p_band_type != ODM_BAND_2_4G) && (*p_dm_odm->p_band_type != ODM_BAND_5G)) {
  109. ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("CarrierSense neither 2G nor 5G band, return\n"));
  110. p_dm_odm->adaptivity_enable = false;
  111. p_dm_odm->adaptivity_flag = false;
  112. return true;
  113. }
  114. }
  115. }
  116. return false;
  117. }
  118. #endif
  119. void
  120. phydm_nhm_counter_statistics_init(
  121. void *p_dm_void
  122. )
  123. {
  124. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  125. if (p_dm_odm->support_ic_type & ODM_IC_11N_SERIES) {
  126. /*PHY parameters initialize for n series*/
  127. odm_write_2byte(p_dm_odm, ODM_REG_CCX_PERIOD_11N + 2, 0xC350); /*0x894[31:16]=0x0xC350 Time duration for NHM unit: us, 0xc350=200ms*/
  128. odm_write_2byte(p_dm_odm, ODM_REG_NHM_TH9_TH10_11N + 2, 0xffff); /*0x890[31:16]=0xffff th_9, th_10*/
  129. odm_write_4byte(p_dm_odm, ODM_REG_NHM_TH3_TO_TH0_11N, 0xffffff50); /*0x898=0xffffff52 th_3, th_2, th_1, th_0*/
  130. odm_write_4byte(p_dm_odm, ODM_REG_NHM_TH7_TO_TH4_11N, 0xffffffff); /*0x89c=0xffffffff th_7, th_6, th_5, th_4*/
  131. odm_set_bb_reg(p_dm_odm, ODM_REG_FPGA0_IQK_11N, MASKBYTE0, 0xff); /*0xe28[7:0]=0xff th_8*/
  132. odm_set_bb_reg(p_dm_odm, ODM_REG_NHM_TH9_TH10_11N, BIT(10) | BIT9 | BIT8, 0x1); /*0x890[10:8]=1 ignoreCCA ignore PHYTXON enable CCX*/
  133. odm_set_bb_reg(p_dm_odm, ODM_REG_OFDM_FA_RSTC_11N, BIT(7), 0x1); /*0xc0c[7]=1 max power among all RX ants*/
  134. }
  135. #if (RTL8195A_SUPPORT == 0)
  136. else if (p_dm_odm->support_ic_type & ODM_IC_11AC_SERIES) {
  137. /*PHY parameters initialize for ac series*/
  138. odm_write_2byte(p_dm_odm, ODM_REG_CCX_PERIOD_11AC + 2, 0xC350); /*0x990[31:16]=0xC350 Time duration for NHM unit: us, 0xc350=200ms*/
  139. odm_write_2byte(p_dm_odm, ODM_REG_NHM_TH9_TH10_11AC + 2, 0xffff); /*0x994[31:16]=0xffff th_9, th_10*/
  140. odm_write_4byte(p_dm_odm, ODM_REG_NHM_TH3_TO_TH0_11AC, 0xffffff50); /*0x998=0xffffff52 th_3, th_2, th_1, th_0*/
  141. odm_write_4byte(p_dm_odm, ODM_REG_NHM_TH7_TO_TH4_11AC, 0xffffffff); /*0x99c=0xffffffff th_7, th_6, th_5, th_4*/
  142. odm_set_bb_reg(p_dm_odm, ODM_REG_NHM_TH8_11AC, MASKBYTE0, 0xff); /*0x9a0[7:0]=0xff th_8*/
  143. odm_set_bb_reg(p_dm_odm, ODM_REG_NHM_TH9_TH10_11AC, BIT(8) | BIT9 | BIT10, 0x1); /*0x994[10:8]=1 ignoreCCA ignore PHYTXON enable CCX*/
  144. odm_set_bb_reg(p_dm_odm, ODM_REG_NHM_9E8_11AC, BIT(0), 0x1); /*0x9e8[7]=1 max power among all RX ants*/
  145. }
  146. #endif
  147. }
  148. void
  149. phydm_nhm_counter_statistics(
  150. void *p_dm_void
  151. )
  152. {
  153. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  154. if (!(p_dm_odm->support_ability & ODM_BB_NHM_CNT))
  155. return;
  156. /*Get NHM report*/
  157. phydm_get_nhm_counter_statistics(p_dm_odm);
  158. /*Reset NHM counter*/
  159. phydm_nhm_counter_statistics_reset(p_dm_odm);
  160. }
  161. void
  162. phydm_get_nhm_counter_statistics(
  163. void *p_dm_void
  164. )
  165. {
  166. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  167. u32 value32 = 0;
  168. #if (RTL8195A_SUPPORT == 0)
  169. if (p_dm_odm->support_ic_type & ODM_IC_11AC_SERIES)
  170. value32 = odm_get_bb_reg(p_dm_odm, ODM_REG_NHM_CNT_11AC, MASKDWORD);
  171. else if (p_dm_odm->support_ic_type & ODM_IC_11N_SERIES)
  172. #endif
  173. value32 = odm_get_bb_reg(p_dm_odm, ODM_REG_NHM_CNT_11N, MASKDWORD);
  174. p_dm_odm->nhm_cnt_0 = (u8)(value32 & MASKBYTE0);
  175. p_dm_odm->nhm_cnt_1 = (u8)((value32 & MASKBYTE1) >> 8);
  176. }
  177. void
  178. phydm_nhm_counter_statistics_reset(
  179. void *p_dm_void
  180. )
  181. {
  182. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  183. if (p_dm_odm->support_ic_type & ODM_IC_11N_SERIES) {
  184. odm_set_bb_reg(p_dm_odm, ODM_REG_NHM_TH9_TH10_11N, BIT(1), 0);
  185. odm_set_bb_reg(p_dm_odm, ODM_REG_NHM_TH9_TH10_11N, BIT(1), 1);
  186. }
  187. #if (RTL8195A_SUPPORT == 0)
  188. else if (p_dm_odm->support_ic_type & ODM_IC_11AC_SERIES) {
  189. odm_set_bb_reg(p_dm_odm, ODM_REG_NHM_TH9_TH10_11AC, BIT(1), 0);
  190. odm_set_bb_reg(p_dm_odm, ODM_REG_NHM_TH9_TH10_11AC, BIT(1), 1);
  191. }
  192. #endif
  193. }
  194. void
  195. phydm_set_edcca_threshold(
  196. void *p_dm_void,
  197. s8 H2L,
  198. s8 L2H
  199. )
  200. {
  201. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  202. if (p_dm_odm->support_ic_type & ODM_IC_11N_SERIES)
  203. odm_set_bb_reg(p_dm_odm, REG_OFDM_0_ECCA_THRESHOLD, MASKBYTE2 | MASKBYTE0, (u32)((u8)L2H | (u8)H2L << 16));
  204. #if (RTL8195A_SUPPORT == 0)
  205. else if (p_dm_odm->support_ic_type & ODM_IC_11AC_SERIES)
  206. odm_set_bb_reg(p_dm_odm, REG_FPGA0_XB_LSSI_READ_BACK, MASKLWORD, (u16)((u8)L2H | (u8)H2L << 8));
  207. #endif
  208. }
  209. void
  210. phydm_set_lna(
  211. void *p_dm_void,
  212. enum phydm_set_lna type
  213. )
  214. {
  215. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  216. if (p_dm_odm->support_ic_type & (ODM_RTL8188E | ODM_RTL8192E)) {
  217. if (type == phydm_disable_lna) {
  218. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x1);
  219. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x30, 0xfffff, 0x18000); /*select Rx mode*/
  220. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x31, 0xfffff, 0x0000f);
  221. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x32, 0xfffff, 0x37f82); /*disable LNA*/
  222. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x0);
  223. if (p_dm_odm->rf_type > ODM_1T1R) {
  224. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_B, 0xef, 0x80000, 0x1);
  225. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_B, 0x30, 0xfffff, 0x18000);
  226. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_B, 0x31, 0xfffff, 0x0000f);
  227. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_B, 0x32, 0xfffff, 0x37f82);
  228. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_B, 0xef, 0x80000, 0x0);
  229. }
  230. } else if (type == phydm_enable_lna) {
  231. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x1);
  232. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x30, 0xfffff, 0x18000); /*select Rx mode*/
  233. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x31, 0xfffff, 0x0000f);
  234. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x32, 0xfffff, 0x77f82); /*back to normal*/
  235. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x0);
  236. if (p_dm_odm->rf_type > ODM_1T1R) {
  237. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_B, 0xef, 0x80000, 0x1);
  238. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_B, 0x30, 0xfffff, 0x18000);
  239. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_B, 0x31, 0xfffff, 0x0000f);
  240. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_B, 0x32, 0xfffff, 0x77f82);
  241. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_B, 0xef, 0x80000, 0x0);
  242. }
  243. }
  244. } else if (p_dm_odm->support_ic_type & ODM_RTL8723B) {
  245. if (type == phydm_disable_lna) {
  246. /*S0*/
  247. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x1);
  248. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x30, 0xfffff, 0x18000); /*select Rx mode*/
  249. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x31, 0xfffff, 0x0001f);
  250. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x32, 0xfffff, 0xe6137); /*disable LNA*/
  251. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x0);
  252. /*S1*/
  253. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0xed, 0x00020, 0x1);
  254. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x43, 0xfffff, 0x3008d); /*select Rx mode and disable LNA*/
  255. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0xed, 0x00020, 0x0);
  256. } else if (type == phydm_enable_lna) {
  257. /*S0*/
  258. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x1);
  259. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x30, 0xfffff, 0x18000); /*select Rx mode*/
  260. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x31, 0xfffff, 0x0001f);
  261. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x32, 0xfffff, 0xe6177); /*disable LNA*/
  262. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x0);
  263. /*S1*/
  264. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0xed, 0x00020, 0x1);
  265. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x43, 0xfffff, 0x300bd); /*select Rx mode and disable LNA*/
  266. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0xed, 0x00020, 0x0);
  267. }
  268. } else if (p_dm_odm->support_ic_type & ODM_RTL8812) {
  269. if (type == phydm_disable_lna) {
  270. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x1);
  271. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x30, 0xfffff, 0x18000); /*select Rx mode*/
  272. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x31, 0xfffff, 0x3f7ff);
  273. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x32, 0xfffff, 0xc22bf); /*disable LNA*/
  274. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x0);
  275. if (p_dm_odm->rf_type > ODM_1T1R) {
  276. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_B, 0xef, 0x80000, 0x1);
  277. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_B, 0x30, 0xfffff, 0x18000); /*select Rx mode*/
  278. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_B, 0x31, 0xfffff, 0x3f7ff);
  279. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_B, 0x32, 0xfffff, 0xc22bf); /*disable LNA*/
  280. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_B, 0xef, 0x80000, 0x0);
  281. }
  282. } else if (type == phydm_enable_lna) {
  283. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x1);
  284. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x30, 0xfffff, 0x18000); /*select Rx mode*/
  285. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x31, 0xfffff, 0x3f7ff);
  286. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x32, 0xfffff, 0xc26bf); /*disable LNA*/
  287. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x0);
  288. if (p_dm_odm->rf_type > ODM_1T1R) {
  289. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_B, 0xef, 0x80000, 0x1);
  290. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_B, 0x30, 0xfffff, 0x18000); /*select Rx mode*/
  291. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_B, 0x31, 0xfffff, 0x3f7ff);
  292. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_B, 0x32, 0xfffff, 0xc26bf); /*disable LNA*/
  293. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_B, 0xef, 0x80000, 0x0);
  294. }
  295. }
  296. } else if (p_dm_odm->support_ic_type & (ODM_RTL8821 | ODM_RTL8881A)) {
  297. if (type == phydm_disable_lna) {
  298. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x1);
  299. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x30, 0xfffff, 0x18000); /*select Rx mode*/
  300. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x31, 0xfffff, 0x0002f);
  301. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x32, 0xfffff, 0xfb09b); /*disable LNA*/
  302. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x0);
  303. } else if (type == phydm_enable_lna) {
  304. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x1);
  305. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x30, 0xfffff, 0x18000); /*select Rx mode*/
  306. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x31, 0xfffff, 0x0002f);
  307. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x32, 0xfffff, 0xfb0bb); /*disable LNA*/
  308. odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0xef, 0x80000, 0x0);
  309. }
  310. }
  311. }
  312. void
  313. phydm_set_trx_mux(
  314. void *p_dm_void,
  315. enum phydm_trx_mux_type tx_mode,
  316. enum phydm_trx_mux_type rx_mode
  317. )
  318. {
  319. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  320. if (p_dm_odm->support_ic_type & ODM_IC_11N_SERIES) {
  321. odm_set_bb_reg(p_dm_odm, ODM_REG_CCK_RPT_FORMAT_11N, BIT(3) | BIT2 | BIT1, tx_mode); /*set TXmod to standby mode to remove outside noise affect*/
  322. odm_set_bb_reg(p_dm_odm, ODM_REG_CCK_RPT_FORMAT_11N, BIT(22) | BIT21 | BIT20, rx_mode); /*set RXmod to standby mode to remove outside noise affect*/
  323. if (p_dm_odm->rf_type > ODM_1T1R) {
  324. odm_set_bb_reg(p_dm_odm, ODM_REG_CCK_RPT_FORMAT_11N_B, BIT(3) | BIT2 | BIT1, tx_mode); /*set TXmod to standby mode to remove outside noise affect*/
  325. odm_set_bb_reg(p_dm_odm, ODM_REG_CCK_RPT_FORMAT_11N_B, BIT(22) | BIT21 | BIT20, rx_mode); /*set RXmod to standby mode to remove outside noise affect*/
  326. }
  327. }
  328. #if (RTL8195A_SUPPORT == 0)
  329. else if (p_dm_odm->support_ic_type & ODM_IC_11AC_SERIES) {
  330. odm_set_bb_reg(p_dm_odm, ODM_REG_TRMUX_11AC, BIT(11) | BIT10 | BIT9 | BIT8, tx_mode); /*set TXmod to standby mode to remove outside noise affect*/
  331. odm_set_bb_reg(p_dm_odm, ODM_REG_TRMUX_11AC, BIT(7) | BIT6 | BIT5 | BIT4, rx_mode); /*set RXmod to standby mode to remove outside noise affect*/
  332. if (p_dm_odm->rf_type > ODM_1T1R) {
  333. odm_set_bb_reg(p_dm_odm, ODM_REG_TRMUX_11AC_B, BIT(11) | BIT10 | BIT9 | BIT8, tx_mode); /*set TXmod to standby mode to remove outside noise affect*/
  334. odm_set_bb_reg(p_dm_odm, ODM_REG_TRMUX_11AC_B, BIT(7) | BIT6 | BIT5 | BIT4, rx_mode); /*set RXmod to standby mode to remove outside noise affect*/
  335. }
  336. }
  337. #endif
  338. }
  339. void
  340. phydm_mac_edcca_state(
  341. void *p_dm_void,
  342. enum phydm_mac_edcca_type state
  343. )
  344. {
  345. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  346. if (state == phydm_ignore_edcca) {
  347. odm_set_mac_reg(p_dm_odm, REG_TX_PTCL_CTRL, BIT(15), 1); /*ignore EDCCA reg520[15]=1*/
  348. /* odm_set_mac_reg(p_dm_odm, REG_RD_CTRL, BIT(11), 0); */ /*reg524[11]=0*/
  349. } else { /*don't set MAC ignore EDCCA signal*/
  350. odm_set_mac_reg(p_dm_odm, REG_TX_PTCL_CTRL, BIT(15), 0); /*don't ignore EDCCA reg520[15]=0*/
  351. /* odm_set_mac_reg(p_dm_odm, REG_RD_CTRL, BIT(11), 1); */ /*reg524[11]=1 */
  352. }
  353. ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("EDCCA enable state = %d\n", state));
  354. }
  355. boolean
  356. phydm_cal_nhm_cnt(
  357. void *p_dm_void
  358. )
  359. {
  360. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  361. u16 base = 0;
  362. base = p_dm_odm->nhm_cnt_0 + p_dm_odm->nhm_cnt_1;
  363. if (base != 0) {
  364. p_dm_odm->nhm_cnt_0 = ((p_dm_odm->nhm_cnt_0) << 8) / base;
  365. p_dm_odm->nhm_cnt_1 = ((p_dm_odm->nhm_cnt_1) << 8) / base;
  366. }
  367. if ((p_dm_odm->nhm_cnt_0 - p_dm_odm->nhm_cnt_1) >= 100)
  368. return true; /*clean environment*/
  369. else
  370. return false; /*noisy environment*/
  371. }
  372. void
  373. phydm_check_environment(
  374. void *p_dm_void
  375. )
  376. {
  377. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  378. struct _ADAPTIVITY_STATISTICS *adaptivity = (struct _ADAPTIVITY_STATISTICS *)phydm_get_structure(p_dm_odm, PHYDM_ADAPTIVITY);
  379. boolean is_clean_environment = false;
  380. #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
  381. struct rtl8192cd_priv *priv = p_dm_odm->priv;
  382. #endif
  383. if (adaptivity->is_first_link == true) {
  384. if (p_dm_odm->support_ic_type & (ODM_IC_11AC_GAIN_IDX_EDCCA | ODM_IC_11N_GAIN_IDX_EDCCA))
  385. p_dm_odm->adaptivity_flag = false;
  386. else
  387. p_dm_odm->adaptivity_flag = true;
  388. adaptivity->is_first_link = false;
  389. return;
  390. } else {
  391. if (adaptivity->nhm_wait < 3) { /*Start enter NHM after 4 nhm_wait*/
  392. adaptivity->nhm_wait++;
  393. phydm_nhm_counter_statistics(p_dm_odm);
  394. return;
  395. } else {
  396. phydm_nhm_counter_statistics(p_dm_odm);
  397. is_clean_environment = phydm_cal_nhm_cnt(p_dm_odm);
  398. if (is_clean_environment == true) {
  399. p_dm_odm->th_l2h_ini = adaptivity->th_l2h_ini_backup; /*adaptivity mode*/
  400. p_dm_odm->th_edcca_hl_diff = adaptivity->th_edcca_hl_diff_backup;
  401. p_dm_odm->adaptivity_enable = true;
  402. if (p_dm_odm->support_ic_type & (ODM_IC_11AC_GAIN_IDX_EDCCA | ODM_IC_11N_GAIN_IDX_EDCCA))
  403. p_dm_odm->adaptivity_flag = false;
  404. else
  405. p_dm_odm->adaptivity_flag = true;
  406. #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
  407. priv->pshare->rf_ft_var.is_clean_environment = true;
  408. #endif
  409. } else {
  410. if (!adaptivity->acs_for_adaptivity) {
  411. p_dm_odm->th_l2h_ini = p_dm_odm->th_l2h_ini_mode2; /*mode2*/
  412. p_dm_odm->th_edcca_hl_diff = p_dm_odm->th_edcca_hl_diff_mode2;
  413. p_dm_odm->adaptivity_flag = false;
  414. p_dm_odm->adaptivity_enable = false;
  415. }
  416. #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
  417. priv->pshare->rf_ft_var.is_clean_environment = false;
  418. #endif
  419. }
  420. adaptivity->nhm_wait = 0;
  421. adaptivity->is_first_link = true;
  422. adaptivity->is_check = true;
  423. }
  424. }
  425. }
  426. void
  427. phydm_search_pwdb_lower_bound(
  428. void *p_dm_void
  429. )
  430. {
  431. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  432. struct _ADAPTIVITY_STATISTICS *adaptivity = (struct _ADAPTIVITY_STATISTICS *)phydm_get_structure(p_dm_odm, PHYDM_ADAPTIVITY);
  433. u32 value32 = 0, reg_value32 = 0;
  434. u8 cnt, try_count = 0;
  435. u8 tx_edcca1 = 0, tx_edcca0 = 0;
  436. boolean is_adjust = true;
  437. s8 th_l2h_dmc, th_h2l_dmc, igi_target = 0x32;
  438. s8 diff;
  439. u8 IGI = adaptivity->igi_base + 30 + (u8)p_dm_odm->th_l2h_ini - (u8)p_dm_odm->th_edcca_hl_diff;
  440. if (p_dm_odm->support_ic_type & (ODM_RTL8723B | ODM_RTL8188E | ODM_RTL8192E | ODM_RTL8812 | ODM_RTL8821 | ODM_RTL8881A))
  441. phydm_set_lna(p_dm_odm, phydm_disable_lna);
  442. else {
  443. phydm_set_trx_mux(p_dm_odm, phydm_standby_mode, phydm_standby_mode);
  444. odm_pause_dig(p_dm_odm, PHYDM_PAUSE, PHYDM_PAUSE_LEVEL_0, 0x7e);
  445. }
  446. diff = igi_target - (s8)IGI;
  447. th_l2h_dmc = p_dm_odm->th_l2h_ini + diff;
  448. if (th_l2h_dmc > 10)
  449. th_l2h_dmc = 10;
  450. th_h2l_dmc = th_l2h_dmc - p_dm_odm->th_edcca_hl_diff;
  451. phydm_set_edcca_threshold(p_dm_odm, th_h2l_dmc, th_l2h_dmc);
  452. ODM_delay_ms(30);
  453. while (is_adjust) {
  454. if (phydm_set_bb_dbg_port(p_dm_odm, BB_DBGPORT_PRIORITY_1, 0x0)) {/*set debug port to 0x0*/
  455. reg_value32 = phydm_get_bb_dbg_port_value(p_dm_odm);
  456. while (reg_value32 & BIT(3) && try_count < 3) {
  457. ODM_delay_ms(3);
  458. try_count = try_count + 1;
  459. reg_value32 = phydm_get_bb_dbg_port_value(p_dm_odm);
  460. }
  461. phydm_release_bb_dbg_port(p_dm_odm);
  462. try_count = 0;
  463. }
  464. for (cnt = 0; cnt < 20; cnt++) {
  465. if (phydm_set_bb_dbg_port(p_dm_odm, BB_DBGPORT_PRIORITY_1, adaptivity->adaptivity_dbg_port)) {
  466. value32 = phydm_get_bb_dbg_port_value(p_dm_odm);
  467. phydm_release_bb_dbg_port(p_dm_odm);
  468. }
  469. if (value32 & BIT(30) && (p_dm_odm->support_ic_type & (ODM_RTL8723B | ODM_RTL8188E)))
  470. tx_edcca1 = tx_edcca1 + 1;
  471. else if (value32 & BIT(29))
  472. tx_edcca1 = tx_edcca1 + 1;
  473. else
  474. tx_edcca0 = tx_edcca0 + 1;
  475. }
  476. if (tx_edcca1 > 1) {
  477. IGI = IGI - 1;
  478. th_l2h_dmc = th_l2h_dmc + 1;
  479. if (th_l2h_dmc > 10)
  480. th_l2h_dmc = 10;
  481. th_h2l_dmc = th_l2h_dmc - p_dm_odm->th_edcca_hl_diff;
  482. phydm_set_edcca_threshold(p_dm_odm, th_h2l_dmc, th_l2h_dmc);
  483. if (th_l2h_dmc == 10) {
  484. is_adjust = false;
  485. adaptivity->h2l_lb = th_h2l_dmc;
  486. adaptivity->l2h_lb = th_l2h_dmc;
  487. p_dm_odm->adaptivity_igi_upper = IGI;
  488. }
  489. tx_edcca1 = 0;
  490. tx_edcca0 = 0;
  491. } else {
  492. is_adjust = false;
  493. adaptivity->h2l_lb = th_h2l_dmc;
  494. adaptivity->l2h_lb = th_l2h_dmc;
  495. p_dm_odm->adaptivity_igi_upper = IGI;
  496. tx_edcca1 = 0;
  497. tx_edcca0 = 0;
  498. }
  499. }
  500. p_dm_odm->adaptivity_igi_upper = p_dm_odm->adaptivity_igi_upper - p_dm_odm->dc_backoff;
  501. adaptivity->h2l_lb = adaptivity->h2l_lb + p_dm_odm->dc_backoff;
  502. adaptivity->l2h_lb = adaptivity->l2h_lb + p_dm_odm->dc_backoff;
  503. if (p_dm_odm->support_ic_type & (ODM_RTL8723B | ODM_RTL8188E | ODM_RTL8192E | ODM_RTL8812 | ODM_RTL8821 | ODM_RTL8881A))
  504. phydm_set_lna(p_dm_odm, phydm_enable_lna);
  505. else {
  506. phydm_set_trx_mux(p_dm_odm, phydm_tx_mode, phydm_rx_mode);
  507. odm_pause_dig(p_dm_odm, PHYDM_RESUME, PHYDM_PAUSE_LEVEL_0, NONE);
  508. }
  509. phydm_set_edcca_threshold(p_dm_odm, 0x7f, 0x7f); /*resume to no link state*/
  510. }
  511. boolean
  512. phydm_re_search_condition(
  513. void *p_dm_void
  514. )
  515. {
  516. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  517. /*struct _ADAPTIVITY_STATISTICS* adaptivity = (struct _ADAPTIVITY_STATISTICS*)phydm_get_structure(p_dm_odm, PHYDM_ADAPTIVITY);*/
  518. u8 adaptivity_igi_upper;
  519. u8 count = 0;
  520. /*s8 TH_L2H_dmc, IGI_target = 0x32;*/
  521. /*s8 diff;*/
  522. adaptivity_igi_upper = p_dm_odm->adaptivity_igi_upper + p_dm_odm->dc_backoff;
  523. /*TH_L2H_dmc = 10;*/
  524. /*diff = TH_L2H_dmc - p_dm_odm->TH_L2H_ini;*/
  525. /*lowest_IGI_upper = IGI_target - diff;*/
  526. /*if ((adaptivity_igi_upper - lowest_IGI_upper) <= 5)*/
  527. if (adaptivity_igi_upper <= 0x26 && count < 3) {
  528. count = count + 1;
  529. return true;
  530. }
  531. else
  532. return false;
  533. }
  534. void
  535. phydm_adaptivity_info_init(
  536. void *p_dm_void,
  537. enum phydm_adapinfo_e cmn_info,
  538. u32 value
  539. )
  540. {
  541. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  542. struct _ADAPTIVITY_STATISTICS *adaptivity = (struct _ADAPTIVITY_STATISTICS *)phydm_get_structure(p_dm_odm, PHYDM_ADAPTIVITY);
  543. switch (cmn_info) {
  544. case PHYDM_ADAPINFO_CARRIER_SENSE_ENABLE:
  545. p_dm_odm->carrier_sense_enable = (boolean)value;
  546. break;
  547. case PHYDM_ADAPINFO_DCBACKOFF:
  548. p_dm_odm->dc_backoff = (u8)value;
  549. break;
  550. case PHYDM_ADAPINFO_DYNAMICLINKADAPTIVITY:
  551. adaptivity->dynamic_link_adaptivity = (boolean)value;
  552. break;
  553. case PHYDM_ADAPINFO_TH_L2H_INI:
  554. p_dm_odm->th_l2h_ini = (s8)value;
  555. break;
  556. case PHYDM_ADAPINFO_TH_EDCCA_HL_DIFF:
  557. p_dm_odm->th_edcca_hl_diff = (s8)value;
  558. break;
  559. case PHYDM_ADAPINFO_AP_NUM_TH:
  560. adaptivity->ap_num_th = (u8)value;
  561. break;
  562. default:
  563. break;
  564. }
  565. }
  566. void
  567. phydm_adaptivity_init(
  568. void *p_dm_void
  569. )
  570. {
  571. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  572. struct _ADAPTIVITY_STATISTICS *adaptivity = (struct _ADAPTIVITY_STATISTICS *)phydm_get_structure(p_dm_odm, PHYDM_ADAPTIVITY);
  573. s8 igi_target = 0x32;
  574. /*struct _dynamic_initial_gain_threshold_* p_dm_dig_table = &p_dm_odm->dm_dig_table;*/
  575. #if (DM_ODM_SUPPORT_TYPE & (ODM_CE | ODM_WIN))
  576. if (p_dm_odm->carrier_sense_enable == false) {
  577. if (p_dm_odm->th_l2h_ini == 0)
  578. phydm_set_l2h_th_ini(p_dm_odm);
  579. } else
  580. p_dm_odm->th_l2h_ini = 0xa;
  581. if (p_dm_odm->th_edcca_hl_diff == 0)
  582. p_dm_odm->th_edcca_hl_diff = 7;
  583. #if (DM_ODM_SUPPORT_TYPE & (ODM_CE))
  584. if (p_dm_odm->wifi_test == true || p_dm_odm->mp_mode == true)
  585. #else
  586. if ((p_dm_odm->wifi_test & RT_WIFI_LOGO) == true)
  587. #endif
  588. p_dm_odm->edcca_enable = false; /*even no adaptivity, we still enable EDCCA, AP side use mib control*/
  589. else
  590. p_dm_odm->edcca_enable = true;
  591. #elif (DM_ODM_SUPPORT_TYPE & ODM_AP)
  592. struct rtl8192cd_priv *priv = p_dm_odm->priv;
  593. if (p_dm_odm->carrier_sense_enable) {
  594. p_dm_odm->th_l2h_ini = 0xa;
  595. p_dm_odm->th_edcca_hl_diff = 7;
  596. } else {
  597. p_dm_odm->th_l2h_ini = p_dm_odm->TH_L2H_default; /*set by mib*/
  598. p_dm_odm->th_edcca_hl_diff = p_dm_odm->th_edcca_hl_diff_default;
  599. }
  600. if (priv->pshare->rf_ft_var.adaptivity_enable == 3)
  601. adaptivity->acs_for_adaptivity = true;
  602. else
  603. adaptivity->acs_for_adaptivity = false;
  604. if (priv->pshare->rf_ft_var.adaptivity_enable == 2)
  605. adaptivity->dynamic_link_adaptivity = true;
  606. else
  607. adaptivity->dynamic_link_adaptivity = false;
  608. priv->pshare->rf_ft_var.is_clean_environment = false;
  609. #endif
  610. p_dm_odm->adaptivity_igi_upper = 0;
  611. p_dm_odm->adaptivity_enable = false; /*use this flag to decide enable or disable*/
  612. p_dm_odm->th_l2h_ini_mode2 = 20;
  613. p_dm_odm->th_edcca_hl_diff_mode2 = 8;
  614. adaptivity->th_l2h_ini_backup = p_dm_odm->th_l2h_ini;
  615. adaptivity->th_edcca_hl_diff_backup = p_dm_odm->th_edcca_hl_diff;
  616. adaptivity->igi_base = 0x32;
  617. adaptivity->igi_target = 0x1c;
  618. adaptivity->h2l_lb = 0;
  619. adaptivity->l2h_lb = 0;
  620. adaptivity->nhm_wait = 0;
  621. adaptivity->is_check = false;
  622. adaptivity->is_first_link = true;
  623. adaptivity->adajust_igi_level = 0;
  624. adaptivity->is_stop_edcca = false;
  625. adaptivity->backup_h2l = 0;
  626. adaptivity->backup_l2h = 0;
  627. adaptivity->adaptivity_dbg_port = (p_dm_odm->support_ic_type & ODM_IC_11N_SERIES) ? 0x208 : 0x209;
  628. phydm_mac_edcca_state(p_dm_odm, phydm_dont_ignore_edcca);
  629. if (p_dm_odm->support_ic_type & ODM_IC_11N_GAIN_IDX_EDCCA) {
  630. /*odm_set_bb_reg(p_dm_odm, ODM_REG_EDCCA_DOWN_OPT_11N, BIT(12) | BIT11 | BIT10, 0x7);*/ /*interfernce need > 2^x us, and then EDCCA will be 1*/
  631. if (p_dm_odm->support_ic_type & ODM_RTL8197F) {
  632. odm_set_bb_reg(p_dm_odm, ODM_REG_PAGE_B1_97F, BIT(30), 0x1); /*set to page B1*/
  633. odm_set_bb_reg(p_dm_odm, ODM_REG_EDCCA_DCNF_97F, BIT(27) | BIT26, 0x1); /*0:rx_dfir, 1: dcnf_out, 2 :rx_iq, 3: rx_nbi_nf_out*/
  634. odm_set_bb_reg(p_dm_odm, ODM_REG_PAGE_B1_97F, BIT(30), 0x0);
  635. #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
  636. if (priv->pshare->rf_ft_var.adaptivity_enable == 1)
  637. odm_set_bb_reg(p_dm_odm, 0xce8, BIT(13), 0x1); /*0: mean, 1:max pwdB*/
  638. #endif
  639. } else
  640. odm_set_bb_reg(p_dm_odm, ODM_REG_EDCCA_DCNF_11N, BIT(21) | BIT20, 0x1); /*0:rx_dfir, 1: dcnf_out, 2 :rx_iq, 3: rx_nbi_nf_out*/
  641. }
  642. #if (RTL8195A_SUPPORT == 0)
  643. if (p_dm_odm->support_ic_type & ODM_IC_11AC_GAIN_IDX_EDCCA) { /*8814a no need to find pwdB lower bound, maybe*/
  644. /*odm_set_bb_reg(p_dm_odm, ODM_REG_EDCCA_DOWN_OPT, BIT(30) | BIT29 | BIT28, 0x7);*/ /*interfernce need > 2^x us, and then EDCCA will be 1*/
  645. odm_set_bb_reg(p_dm_odm, ODM_REG_ACBB_EDCCA_ENHANCE, BIT(29) | BIT28, 0x1); /*0:rx_dfir, 1: dcnf_out, 2 :rx_iq, 3: rx_nbi_nf_out*/
  646. }
  647. if (!(p_dm_odm->support_ic_type & (ODM_IC_11AC_GAIN_IDX_EDCCA | ODM_IC_11N_GAIN_IDX_EDCCA))) {
  648. phydm_search_pwdb_lower_bound(p_dm_odm);
  649. if (phydm_re_search_condition(p_dm_odm))
  650. phydm_search_pwdb_lower_bound(p_dm_odm);
  651. } else
  652. phydm_set_edcca_threshold(p_dm_odm, 0x7f, 0x7f); /*resume to no link state*/
  653. #endif
  654. /*forgetting factor setting*/
  655. phydm_set_forgetting_factor(p_dm_odm);
  656. /*we need to consider PwdB upper bound for 8814 later IC*/
  657. adaptivity->adajust_igi_level = (u8)((p_dm_odm->th_l2h_ini + igi_target) - pwdb_upper_bound + dfir_loss); /*IGI = L2H - PwdB - dfir_loss*/
  658. ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("th_l2h_ini = 0x%x, th_edcca_hl_diff = 0x%x, adaptivity->adajust_igi_level = 0x%x\n", p_dm_odm->th_l2h_ini, p_dm_odm->th_edcca_hl_diff, adaptivity->adajust_igi_level));
  659. /*Check this later on Windows*/
  660. /*phydm_set_edcca_threshold_api(p_dm_odm, p_dm_dig_table->cur_ig_value);*/
  661. }
  662. void
  663. phydm_adaptivity(
  664. void *p_dm_void
  665. )
  666. {
  667. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  668. struct _dynamic_initial_gain_threshold_ *p_dm_dig_table = &p_dm_odm->dm_dig_table;
  669. u8 IGI = p_dm_dig_table->cur_ig_value;
  670. s8 th_l2h_dmc, th_h2l_dmc;
  671. s8 diff = 0, igi_target;
  672. struct _ADAPTIVITY_STATISTICS *adaptivity = (struct _ADAPTIVITY_STATISTICS *)phydm_get_structure(p_dm_odm, PHYDM_ADAPTIVITY);
  673. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  674. struct _ADAPTER *p_adapter = p_dm_odm->adapter;
  675. boolean is_fw_current_in_ps_mode = false;
  676. u8 disable_ap_adapt_setting;
  677. p_adapter->HalFunc.GetHwRegHandler(p_adapter, HW_VAR_FW_PSMODE_STATUS, (u8 *)(&is_fw_current_in_ps_mode));
  678. /*Disable EDCCA mode while under LPS mode, added by Roger, 2012.09.14.*/
  679. if (is_fw_current_in_ps_mode)
  680. return;
  681. #endif
  682. if ((p_dm_odm->edcca_enable == false) || (adaptivity->is_stop_edcca == true)) {
  683. ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("Disable EDCCA!!!\n"));
  684. return;
  685. }
  686. if (!(p_dm_odm->support_ability & ODM_BB_ADAPTIVITY)) {
  687. ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("adaptivity disable, enable EDCCA mode!!!\n"));
  688. p_dm_odm->th_l2h_ini = p_dm_odm->th_l2h_ini_mode2;
  689. p_dm_odm->th_edcca_hl_diff = p_dm_odm->th_edcca_hl_diff_mode2;
  690. }
  691. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  692. else {
  693. disable_ap_adapt_setting = false;
  694. if (p_dm_odm->p_soft_ap_mode != NULL) {
  695. if (*(p_dm_odm->p_soft_ap_mode) != 0 && (p_dm_odm->soft_ap_special_setting & BIT(0)))
  696. disable_ap_adapt_setting = true;
  697. ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("p_dm_odm->soft_ap_special_setting = %x, *(p_dm_odm->p_soft_ap_mode) = %d, disable_ap_adapt_setting = %d\n", p_dm_odm->soft_ap_special_setting, *(p_dm_odm->p_soft_ap_mode), disable_ap_adapt_setting));
  698. }
  699. if (phydm_check_channel_plan(p_dm_odm) || (p_dm_odm->ap_total_num > adaptivity->ap_num_th) || disable_ap_adapt_setting) {
  700. p_dm_odm->th_l2h_ini = p_dm_odm->th_l2h_ini_mode2;
  701. p_dm_odm->th_edcca_hl_diff = p_dm_odm->th_edcca_hl_diff_mode2;
  702. } else {
  703. p_dm_odm->th_l2h_ini = adaptivity->th_l2h_ini_backup;
  704. p_dm_odm->th_edcca_hl_diff = adaptivity->th_edcca_hl_diff_backup;
  705. }
  706. }
  707. #endif
  708. ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("odm_Adaptivity() =====>\n"));
  709. ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("igi_base=0x%x, th_l2h_ini = %d, th_edcca_hl_diff = %d\n",
  710. adaptivity->igi_base, p_dm_odm->th_l2h_ini, p_dm_odm->th_edcca_hl_diff));
  711. #if (RTL8195A_SUPPORT == 0)
  712. if (p_dm_odm->support_ic_type & ODM_IC_11AC_SERIES) {
  713. /*fix AC series when enable EDCCA hang issue*/
  714. odm_set_bb_reg(p_dm_odm, 0x800, BIT(10), 1); /*ADC_mask disable*/
  715. odm_set_bb_reg(p_dm_odm, 0x800, BIT(10), 0); /*ADC_mask enable*/
  716. }
  717. #endif
  718. igi_target = adaptivity->igi_base;
  719. adaptivity->igi_target = (u8) igi_target;
  720. ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("band_width=%s, igi_target=0x%x, dynamic_link_adaptivity = %d, acs_for_adaptivity = %d\n",
  721. (*p_dm_odm->p_band_width == ODM_BW80M) ? "80M" : ((*p_dm_odm->p_band_width == ODM_BW40M) ? "40M" : "20M"), igi_target, adaptivity->dynamic_link_adaptivity, adaptivity->acs_for_adaptivity));
  722. ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("RSSI_min = %d, adaptivity->adajust_igi_level= 0x%x, adaptivity_flag = %d, adaptivity_enable = %d\n",
  723. p_dm_odm->rssi_min, adaptivity->adajust_igi_level, p_dm_odm->adaptivity_flag, p_dm_odm->adaptivity_enable));
  724. if ((adaptivity->dynamic_link_adaptivity == true) && (!p_dm_odm->is_linked) && (p_dm_odm->adaptivity_enable == false)) {
  725. phydm_set_edcca_threshold(p_dm_odm, 0x7f, 0x7f);
  726. ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("In DynamicLink mode(noisy) and No link, Turn off EDCCA!!\n"));
  727. return;
  728. }
  729. if (p_dm_odm->support_ic_type & (ODM_IC_11AC_GAIN_IDX_EDCCA | ODM_IC_11N_GAIN_IDX_EDCCA)) {
  730. if ((adaptivity->adajust_igi_level > IGI) && (p_dm_odm->adaptivity_enable == true))
  731. diff = adaptivity->adajust_igi_level - IGI;
  732. th_l2h_dmc = p_dm_odm->th_l2h_ini - diff + igi_target;
  733. th_h2l_dmc = th_l2h_dmc - p_dm_odm->th_edcca_hl_diff;
  734. }
  735. #if (RTL8195A_SUPPORT == 0)
  736. else {
  737. diff = igi_target - (s8)IGI;
  738. th_l2h_dmc = p_dm_odm->th_l2h_ini + diff;
  739. if (th_l2h_dmc > 10 && (p_dm_odm->adaptivity_enable == true))
  740. th_l2h_dmc = 10;
  741. th_h2l_dmc = th_l2h_dmc - p_dm_odm->th_edcca_hl_diff;
  742. /*replace lower bound to prevent EDCCA always equal 1*/
  743. if (th_h2l_dmc < adaptivity->h2l_lb)
  744. th_h2l_dmc = adaptivity->h2l_lb;
  745. if (th_l2h_dmc < adaptivity->l2h_lb)
  746. th_l2h_dmc = adaptivity->l2h_lb;
  747. }
  748. #endif
  749. ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("IGI=0x%x, th_l2h_dmc = %d, th_h2l_dmc = %d\n", IGI, th_l2h_dmc, th_h2l_dmc));
  750. ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("adaptivity_igi_upper=0x%x, h2l_lb = 0x%x, l2h_lb = 0x%x\n", p_dm_odm->adaptivity_igi_upper, adaptivity->h2l_lb, adaptivity->l2h_lb));
  751. phydm_set_edcca_threshold(p_dm_odm, th_h2l_dmc, th_l2h_dmc);
  752. if (p_dm_odm->adaptivity_enable == true)
  753. odm_set_mac_reg(p_dm_odm, REG_RD_CTRL, BIT(11), 1);
  754. return;
  755. }
  756. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  757. void
  758. phydm_adaptivity_bsod(
  759. void *p_dm_void
  760. )
  761. {
  762. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  763. struct _ADAPTER *p_adapter = p_dm_odm->adapter;
  764. PMGNT_INFO p_mgnt_info = &(p_adapter->MgntInfo);
  765. u8 count = 0;
  766. u32 u4_value;
  767. /*
  768. 1. turn off RF (TRX Mux in standby mode)
  769. 2. H2C mac id drop
  770. 3. ignore EDCCA
  771. 4. wait for clear FIFO
  772. 5. don't ignore EDCCA
  773. 6. turn on RF (TRX Mux in TRx mdoe)
  774. 7. H2C mac id resume
  775. */
  776. RT_TRACE(COMP_MLME, DBG_WARNING, ("MAC id drop packet!!!!!\n"));
  777. p_adapter->dropPktByMacIdCnt++;
  778. p_mgnt_info->bDropPktInProgress = true;
  779. p_adapter->HalFunc.GetHwRegHandler(p_adapter, HW_VAR_MAX_Q_PAGE_NUM, (u8 *)(&u4_value));
  780. RT_TRACE(COMP_INIT, DBG_LOUD, ("Queue Reserved Page number = 0x%08x\n", u4_value));
  781. p_adapter->HalFunc.GetHwRegHandler(p_adapter, HW_VAR_AVBL_Q_PAGE_NUM, (u8 *)(&u4_value));
  782. RT_TRACE(COMP_INIT, DBG_LOUD, ("Available Queue Page number = 0x%08x\n", u4_value));
  783. /*Standby mode*/
  784. phydm_set_trx_mux(p_dm_odm, phydm_standby_mode, phydm_standby_mode);
  785. odm_write_dig(p_dm_odm, 0x20);
  786. /*H2C mac id drop*/
  787. MacIdIndicateDisconnect(p_adapter);
  788. /*Ignore EDCCA*/
  789. phydm_mac_edcca_state(p_dm_odm, phydm_ignore_edcca);
  790. delay_ms(50);
  791. count = 5;
  792. /*Resume EDCCA*/
  793. phydm_mac_edcca_state(p_dm_odm, phydm_dont_ignore_edcca);
  794. /*Turn on TRx mode*/
  795. phydm_set_trx_mux(p_dm_odm, phydm_tx_mode, phydm_rx_mode);
  796. odm_write_dig(p_dm_odm, 0x20);
  797. /*Resume H2C macid*/
  798. MacIdRecoverMediaStatus(p_adapter);
  799. p_adapter->HalFunc.GetHwRegHandler(p_adapter, HW_VAR_AVBL_Q_PAGE_NUM, (u8 *)(&u4_value));
  800. RT_TRACE(COMP_INIT, DBG_LOUD, ("Available Queue Page number = 0x%08x\n", u4_value));
  801. p_mgnt_info->bDropPktInProgress = false;
  802. RT_TRACE(COMP_MLME, DBG_WARNING, ("End of MAC id drop packet, spent %dms\n", count * 10));
  803. }
  804. #endif
  805. /*This API is for solving USB can't Tx problem due to USB3.0 interference in 2.4G*/
  806. void
  807. phydm_pause_edcca(
  808. void *p_dm_void,
  809. boolean is_pasue_edcca
  810. )
  811. {
  812. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  813. struct _ADAPTIVITY_STATISTICS *adaptivity = (struct _ADAPTIVITY_STATISTICS *)phydm_get_structure(p_dm_odm, PHYDM_ADAPTIVITY);
  814. struct _dynamic_initial_gain_threshold_ *p_dm_dig_table = &p_dm_odm->dm_dig_table;
  815. u8 IGI = p_dm_dig_table->cur_ig_value;
  816. s8 diff = 0;
  817. if (is_pasue_edcca) {
  818. adaptivity->is_stop_edcca = true;
  819. if (p_dm_odm->support_ic_type & (ODM_IC_11AC_GAIN_IDX_EDCCA | ODM_IC_11N_GAIN_IDX_EDCCA)) {
  820. if (adaptivity->adajust_igi_level > IGI)
  821. diff = adaptivity->adajust_igi_level - IGI;
  822. adaptivity->backup_l2h = p_dm_odm->th_l2h_ini - diff + adaptivity->igi_target;
  823. adaptivity->backup_h2l = adaptivity->backup_l2h - p_dm_odm->th_edcca_hl_diff;
  824. }
  825. #if (RTL8195A_SUPPORT == 0)
  826. else {
  827. diff = adaptivity->igi_target - (s8)IGI;
  828. adaptivity->backup_l2h = p_dm_odm->th_l2h_ini + diff;
  829. if (adaptivity->backup_l2h > 10)
  830. adaptivity->backup_l2h = 10;
  831. adaptivity->backup_h2l = adaptivity->backup_l2h - p_dm_odm->th_edcca_hl_diff;
  832. /*replace lower bound to prevent EDCCA always equal 1*/
  833. if (adaptivity->backup_h2l < adaptivity->h2l_lb)
  834. adaptivity->backup_h2l = adaptivity->h2l_lb;
  835. if (adaptivity->backup_l2h < adaptivity->l2h_lb)
  836. adaptivity->backup_l2h = adaptivity->l2h_lb;
  837. }
  838. #endif
  839. ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("pauseEDCCA : L2Hbak = 0x%x, H2Lbak = 0x%x, IGI = 0x%x\n", adaptivity->backup_l2h, adaptivity->backup_h2l, IGI));
  840. /*Disable EDCCA*/
  841. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  842. if (odm_is_work_item_scheduled(&(adaptivity->phydm_pause_edcca_work_item)) == false)
  843. odm_schedule_work_item(&(adaptivity->phydm_pause_edcca_work_item));
  844. #else
  845. phydm_pause_edcca_work_item_callback(p_dm_odm);
  846. #endif
  847. } else {
  848. adaptivity->is_stop_edcca = false;
  849. ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("resumeEDCCA : L2Hbak = 0x%x, H2Lbak = 0x%x, IGI = 0x%x\n", adaptivity->backup_l2h, adaptivity->backup_h2l, IGI));
  850. /*Resume EDCCA*/
  851. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  852. if (odm_is_work_item_scheduled(&(adaptivity->phydm_resume_edcca_work_item)) == false)
  853. odm_schedule_work_item(&(adaptivity->phydm_resume_edcca_work_item));
  854. #else
  855. phydm_resume_edcca_work_item_callback(p_dm_odm);
  856. #endif
  857. }
  858. }
  859. void
  860. phydm_pause_edcca_work_item_callback(
  861. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  862. struct _ADAPTER *adapter
  863. #else
  864. void *p_dm_void
  865. #endif
  866. )
  867. {
  868. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  869. PHAL_DATA_TYPE p_hal_data = GET_HAL_DATA(adapter);
  870. struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->DM_OutSrc;
  871. #else
  872. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  873. #endif
  874. if (p_dm_odm->support_ic_type & ODM_IC_11N_SERIES)
  875. odm_set_bb_reg(p_dm_odm, REG_OFDM_0_ECCA_THRESHOLD, MASKBYTE2 | MASKBYTE0, (u32)(0x7f | 0x7f << 16));
  876. #if (RTL8195A_SUPPORT == 0)
  877. else if (p_dm_odm->support_ic_type & ODM_IC_11AC_SERIES)
  878. odm_set_bb_reg(p_dm_odm, REG_FPGA0_XB_LSSI_READ_BACK, MASKLWORD, (u16)(0x7f | 0x7f << 8));
  879. #endif
  880. }
  881. void
  882. phydm_resume_edcca_work_item_callback(
  883. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  884. struct _ADAPTER *adapter
  885. #else
  886. void *p_dm_void
  887. #endif
  888. )
  889. {
  890. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  891. PHAL_DATA_TYPE p_hal_data = GET_HAL_DATA(adapter);
  892. struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->DM_OutSrc;
  893. #else
  894. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  895. #endif
  896. struct _ADAPTIVITY_STATISTICS *adaptivity = (struct _ADAPTIVITY_STATISTICS *)phydm_get_structure(p_dm_odm, PHYDM_ADAPTIVITY);
  897. if (p_dm_odm->support_ic_type & ODM_IC_11N_SERIES)
  898. odm_set_bb_reg(p_dm_odm, REG_OFDM_0_ECCA_THRESHOLD, MASKBYTE2 | MASKBYTE0, (u32)((u8)adaptivity->backup_l2h | (u8)adaptivity->backup_h2l << 16));
  899. #if (RTL8195A_SUPPORT == 0)
  900. else if (p_dm_odm->support_ic_type & ODM_IC_11AC_SERIES)
  901. odm_set_bb_reg(p_dm_odm, REG_FPGA0_XB_LSSI_READ_BACK, MASKLWORD, (u16)((u8)adaptivity->backup_l2h | (u8)adaptivity->backup_h2l << 8));
  902. #endif
  903. }
  904. void
  905. phydm_set_edcca_threshold_api(
  906. void *p_dm_void,
  907. u8 IGI
  908. )
  909. {
  910. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  911. struct _ADAPTIVITY_STATISTICS *adaptivity = (struct _ADAPTIVITY_STATISTICS *)phydm_get_structure(p_dm_odm, PHYDM_ADAPTIVITY);
  912. s8 th_l2h_dmc, th_h2l_dmc;
  913. s8 diff = 0, igi_target = 0x32;
  914. if (p_dm_odm->support_ability & ODM_BB_ADAPTIVITY) {
  915. if (p_dm_odm->support_ic_type & (ODM_IC_11AC_GAIN_IDX_EDCCA | ODM_IC_11N_GAIN_IDX_EDCCA)) {
  916. if (adaptivity->adajust_igi_level > IGI)
  917. diff = adaptivity->adajust_igi_level - IGI;
  918. th_l2h_dmc = p_dm_odm->th_l2h_ini - diff + igi_target;
  919. th_h2l_dmc = th_l2h_dmc - p_dm_odm->th_edcca_hl_diff;
  920. }
  921. #if (RTL8195A_SUPPORT == 0)
  922. else {
  923. diff = igi_target - (s8)IGI;
  924. th_l2h_dmc = p_dm_odm->th_l2h_ini + diff;
  925. if (th_l2h_dmc > 10)
  926. th_l2h_dmc = 10;
  927. th_h2l_dmc = th_l2h_dmc - p_dm_odm->th_edcca_hl_diff;
  928. /*replace lower bound to prevent EDCCA always equal 1*/
  929. if (th_h2l_dmc < adaptivity->h2l_lb)
  930. th_h2l_dmc = adaptivity->h2l_lb;
  931. if (th_l2h_dmc < adaptivity->l2h_lb)
  932. th_l2h_dmc = adaptivity->l2h_lb;
  933. }
  934. #endif
  935. ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("API :IGI=0x%x, th_l2h_dmc = %d, th_h2l_dmc = %d\n", IGI, th_l2h_dmc, th_h2l_dmc));
  936. ODM_RT_TRACE(p_dm_odm, PHYDM_COMP_ADAPTIVITY, ODM_DBG_LOUD, ("API :adaptivity_igi_upper=0x%x, h2l_lb = 0x%x, l2h_lb = 0x%x\n", p_dm_odm->adaptivity_igi_upper, adaptivity->h2l_lb, adaptivity->l2h_lb));
  937. phydm_set_edcca_threshold(p_dm_odm, th_h2l_dmc, th_l2h_dmc);
  938. }
  939. }
  940. void
  941. phydm_set_l2h_th_ini(
  942. void *p_dm_void
  943. )
  944. {
  945. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  946. if (p_dm_odm->support_ic_type & ODM_IC_11AC_SERIES) {
  947. if (p_dm_odm->support_ic_type & (ODM_RTL8821C | ODM_RTL8822B | ODM_RTL8814A))
  948. p_dm_odm->th_l2h_ini = 0xf2;
  949. else
  950. p_dm_odm->th_l2h_ini = 0xef;
  951. } else
  952. p_dm_odm->th_l2h_ini = 0xf5;
  953. }
  954. void
  955. phydm_set_forgetting_factor(
  956. void *p_dm_void
  957. )
  958. {
  959. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  960. if (p_dm_odm->support_ic_type & (ODM_RTL8821C | ODM_RTL8822B | ODM_RTL8814A))
  961. odm_set_bb_reg(p_dm_odm, 0x8a0, BIT(1) | BIT(0), 0);
  962. }