hal_dm.c 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2014 - 2017 Realtek Corporation.
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of version 2 of the GNU General Public License as
  7. * published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. *
  14. *****************************************************************************/
  15. #include <drv_types.h>
  16. #include <hal_data.h>
  17. /* A mapping from HalData to ODM. */
  18. enum odm_board_type boardType(u8 InterfaceSel)
  19. {
  20. enum odm_board_type board = ODM_BOARD_DEFAULT;
  21. #ifdef CONFIG_PCI_HCI
  22. INTERFACE_SELECT_PCIE pcie = (INTERFACE_SELECT_PCIE)InterfaceSel;
  23. switch (pcie) {
  24. case INTF_SEL0_SOLO_MINICARD:
  25. board |= ODM_BOARD_MINICARD;
  26. break;
  27. case INTF_SEL1_BT_COMBO_MINICARD:
  28. board |= ODM_BOARD_BT;
  29. board |= ODM_BOARD_MINICARD;
  30. break;
  31. default:
  32. board = ODM_BOARD_DEFAULT;
  33. break;
  34. }
  35. #elif defined(CONFIG_USB_HCI)
  36. INTERFACE_SELECT_USB usb = (INTERFACE_SELECT_USB)InterfaceSel;
  37. switch (usb) {
  38. case INTF_SEL1_USB_High_Power:
  39. board |= ODM_BOARD_EXT_LNA;
  40. board |= ODM_BOARD_EXT_PA;
  41. break;
  42. case INTF_SEL2_MINICARD:
  43. board |= ODM_BOARD_MINICARD;
  44. break;
  45. case INTF_SEL4_USB_Combo:
  46. board |= ODM_BOARD_BT;
  47. break;
  48. case INTF_SEL5_USB_Combo_MF:
  49. board |= ODM_BOARD_BT;
  50. break;
  51. case INTF_SEL0_USB:
  52. case INTF_SEL3_USB_Solo:
  53. default:
  54. board = ODM_BOARD_DEFAULT;
  55. break;
  56. }
  57. #endif
  58. /* RTW_INFO("===> boardType(): (pHalData->InterfaceSel, pDM_Odm->BoardType) = (%d, %d)\n", InterfaceSel, board); */
  59. return board;
  60. }
  61. void rtw_hal_update_iqk_fw_offload_cap(_adapter *adapter)
  62. {
  63. PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
  64. struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);
  65. if (hal->RegIQKFWOffload) {
  66. rtw_sctx_init(&hal->iqk_sctx, 0);
  67. phydm_fwoffload_ability_init(p_dm_odm, PHYDM_RF_IQK_OFFLOAD);
  68. } else
  69. phydm_fwoffload_ability_clear(p_dm_odm, PHYDM_RF_IQK_OFFLOAD);
  70. RTW_INFO("IQK FW offload:%s\n", hal->RegIQKFWOffload ? "enable" : "disable");
  71. }
  72. #if ((RTL8822B_SUPPORT == 1) || (RTL8821C_SUPPORT == 1) || (RTL8814B_SUPPORT == 1))
  73. void rtw_phydm_iqk_trigger(_adapter *adapter)
  74. {
  75. struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);
  76. u8 clear = _TRUE;
  77. u8 segment = _FALSE;
  78. u8 rfk_forbidden = _FALSE;
  79. /*segment = _rtw_phydm_iqk_segment_chk(adapter);*/
  80. halrf_cmn_info_set(p_dm_odm, HALRF_CMNINFO_RFK_FORBIDDEN, rfk_forbidden);
  81. halrf_cmn_info_set(p_dm_odm, HALRF_CMNINFO_IQK_SEGMENT, segment);
  82. halrf_segment_iqk_trigger(p_dm_odm, clear, segment);
  83. }
  84. #endif
  85. void rtw_phydm_iqk_trigger_dbg(_adapter *adapter, bool recovery, bool clear, bool segment)
  86. {
  87. struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);
  88. #if ((RTL8822B_SUPPORT == 1) || (RTL8821C_SUPPORT == 1) || (RTL8814B_SUPPORT == 1))
  89. halrf_segment_iqk_trigger(p_dm_odm, clear, segment);
  90. #else
  91. halrf_iqk_trigger(p_dm_odm, recovery);
  92. #endif
  93. }
  94. void rtw_phydm_lck_trigger(_adapter *adapter)
  95. {
  96. struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);
  97. halrf_lck_trigger(p_dm_odm);
  98. }
  99. #ifdef CONFIG_DBG_RF_CAL
  100. void rtw_hal_iqk_test(_adapter *adapter, bool recovery, bool clear, bool segment)
  101. {
  102. struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);
  103. rtw_ps_deny(adapter, PS_DENY_IOCTL);
  104. LeaveAllPowerSaveModeDirect(adapter);
  105. rtw_phydm_ability_backup(adapter);
  106. rtw_phydm_func_disable_all(adapter);
  107. halrf_cmn_info_set(p_dm_odm, HALRF_CMNINFO_ABILITY, HAL_RF_IQK);
  108. rtw_phydm_iqk_trigger_dbg(adapter, recovery, clear, segment);
  109. rtw_phydm_ability_restore(adapter);
  110. rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);
  111. }
  112. void rtw_hal_lck_test(_adapter *adapter)
  113. {
  114. struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);
  115. rtw_ps_deny(adapter, PS_DENY_IOCTL);
  116. LeaveAllPowerSaveModeDirect(adapter);
  117. rtw_phydm_ability_backup(adapter);
  118. rtw_phydm_func_disable_all(adapter);
  119. halrf_cmn_info_set(p_dm_odm, HALRF_CMNINFO_ABILITY, HAL_RF_LCK);
  120. rtw_phydm_lck_trigger(adapter);
  121. rtw_phydm_ability_restore(adapter);
  122. rtw_ps_deny_cancel(adapter, PS_DENY_IOCTL);
  123. }
  124. #endif
  125. #ifdef CONFIG_FW_OFFLOAD_PARAM_INIT
  126. void rtw_hal_update_param_init_fw_offload_cap(_adapter *adapter)
  127. {
  128. struct dm_struct *p_dm_odm = adapter_to_phydm(adapter);
  129. if (adapter->registrypriv.fw_param_init)
  130. phydm_fwoffload_ability_init(p_dm_odm, PHYDM_PHY_PARAM_OFFLOAD);
  131. else
  132. phydm_fwoffload_ability_clear(p_dm_odm, PHYDM_PHY_PARAM_OFFLOAD);
  133. RTW_INFO("Init-Parameter FW offload:%s\n", adapter->registrypriv.fw_param_init ? "enable" : "disable");
  134. }
  135. #endif
  136. void record_ra_info(void *p_dm_void, u8 macid, struct cmn_sta_info *p_sta, u64 ra_mask)
  137. {
  138. struct dm_struct *p_dm = (struct dm_struct *)p_dm_void;
  139. _adapter *adapter = p_dm->adapter;
  140. struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
  141. struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
  142. if (p_sta) {
  143. rtw_macid_ctl_set_bw(macid_ctl, macid, p_sta->ra_info.ra_bw_mode);
  144. rtw_macid_ctl_set_vht_en(macid_ctl, macid, p_sta->ra_info.is_vht_enable);
  145. rtw_macid_ctl_set_rate_bmp0(macid_ctl, macid, ra_mask);
  146. rtw_macid_ctl_set_rate_bmp1(macid_ctl, macid, ra_mask >> 32);
  147. rtw_update_tx_rate_bmp(adapter_to_dvobj(adapter));
  148. }
  149. }
  150. #ifdef CONFIG_SUPPORT_DYNAMIC_TXPWR
  151. void rtw_phydm_fill_desc_dpt(void *dm, u8 *desc, u8 dpt_lv)
  152. {
  153. struct dm_struct *p_dm = (struct dm_struct *)dm;
  154. _adapter *adapter = p_dm->adapter;
  155. switch (rtw_get_chip_type(adapter)) {
  156. /*
  157. #ifdef CONFIG_RTL8188F
  158. case RTL8188F:
  159. break;
  160. #endif
  161. #ifdef CONFIG_RTL8723B
  162. case RTL8723B :
  163. break;
  164. #endif
  165. #ifdef CONFIG_RTL8703B
  166. case RTL8703B :
  167. break;
  168. #endif
  169. #ifdef CONFIG_RTL8812A
  170. case RTL8812 :
  171. break;
  172. #endif
  173. #ifdef CONFIG_RTL8821A
  174. case RTL8821:
  175. break;
  176. #endif
  177. #ifdef CONFIG_RTL8814A
  178. case RTL8814A :
  179. break;
  180. #endif
  181. #ifdef CONFIG_RTL8192F
  182. case RTL8192F :
  183. break;
  184. #endif
  185. */
  186. /*
  187. #ifdef CONFIG_RTL8192E
  188. case RTL8192E :
  189. SET_TX_DESC_TX_POWER_0_PSET_92E(desc, dpt_lv);
  190. break;
  191. #endif
  192. */
  193. #ifdef CONFIG_RTL8821C
  194. case RTL8821C :
  195. SET_TX_DESC_TXPWR_OFSET_8821C(desc, dpt_lv);
  196. break;
  197. #endif
  198. default :
  199. RTW_ERR("%s IC not support dynamic tx power\n", __func__);
  200. break;
  201. }
  202. }
  203. void rtw_phydm_set_dyntxpwr(_adapter *adapter, u8 *desc, u8 mac_id)
  204. {
  205. struct dm_struct *dm = adapter_to_phydm(adapter);
  206. odm_set_dyntxpwr(dm, desc, mac_id);
  207. }
  208. #endif
  209. #ifdef CONFIG_RTW_TX_2PATH_EN
  210. void rtw_phydm_tx_2path_en(_adapter *adapter)
  211. {
  212. struct dm_struct *dm = adapter_to_phydm(adapter);
  213. phydm_tx_2path(dm);
  214. }
  215. #endif
  216. void rtw_phydm_ops_func_init(struct dm_struct *p_phydm)
  217. {
  218. struct ra_table *p_ra_t = &p_phydm->dm_ra_table;
  219. p_ra_t->record_ra_info = record_ra_info;
  220. #ifdef CONFIG_SUPPORT_DYNAMIC_TXPWR
  221. p_phydm->fill_desc_dyntxpwr = rtw_phydm_fill_desc_dpt;
  222. #endif
  223. }
  224. void rtw_phydm_priv_init(_adapter *adapter)
  225. {
  226. PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
  227. struct dm_struct *phydm = &(hal->odmpriv);
  228. phydm->adapter = adapter;
  229. odm_cmn_info_init(phydm, ODM_CMNINFO_PLATFORM, ODM_CE);
  230. }
  231. void Init_ODM_ComInfo(_adapter *adapter)
  232. {
  233. struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
  234. PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter);
  235. struct dm_struct *pDM_Odm = &(pHalData->odmpriv);
  236. struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(adapter);
  237. int i;
  238. /*phydm_op_mode could be change for different scenarios: ex: SoftAP - PHYDM_BALANCE_MODE*/
  239. pHalData->phydm_op_mode = PHYDM_PERFORMANCE_MODE;/*Service one device*/
  240. rtw_odm_init_ic_type(adapter);
  241. if (rtw_get_intf_type(adapter) == RTW_GSPI)
  242. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_INTERFACE, ODM_ITRF_SDIO);
  243. else
  244. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_INTERFACE, rtw_get_intf_type(adapter));
  245. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_MP_TEST_CHIP, IS_NORMAL_CHIP(pHalData->version_id));
  246. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_PATCH_ID, pHalData->CustomerID);
  247. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_BWIFI_TEST, adapter->registrypriv.wifi_spec);
  248. #ifdef CONFIG_ADVANCE_OTA
  249. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_ADVANCE_OTA, adapter->registrypriv.adv_ota);
  250. #endif
  251. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RF_TYPE, pHalData->rf_type);
  252. {
  253. /* 1 ======= BoardType: ODM_CMNINFO_BOARD_TYPE ======= */
  254. u8 odm_board_type = ODM_BOARD_DEFAULT;
  255. if (pHalData->ExternalLNA_2G != 0) {
  256. odm_board_type |= ODM_BOARD_EXT_LNA;
  257. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_EXT_LNA, 1);
  258. }
  259. if (pHalData->external_lna_5g != 0) {
  260. odm_board_type |= ODM_BOARD_EXT_LNA_5G;
  261. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_5G_EXT_LNA, 1);
  262. }
  263. if (pHalData->ExternalPA_2G != 0) {
  264. odm_board_type |= ODM_BOARD_EXT_PA;
  265. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_EXT_PA, 1);
  266. }
  267. if (pHalData->external_pa_5g != 0) {
  268. odm_board_type |= ODM_BOARD_EXT_PA_5G;
  269. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_5G_EXT_PA, 1);
  270. }
  271. if (pHalData->EEPROMBluetoothCoexist)
  272. odm_board_type |= ODM_BOARD_BT;
  273. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_BOARD_TYPE, odm_board_type);
  274. /* 1 ============== End of BoardType ============== */
  275. }
  276. rtw_hal_set_odm_var(adapter, HAL_ODM_REGULATION, NULL, _TRUE);
  277. #ifdef CONFIG_DFS_MASTER
  278. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_DFS_REGION_DOMAIN, adapter->registrypriv.dfs_region_domain);
  279. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_DFS_MASTER_ENABLE, &(adapter_to_rfctl(adapter)->radar_detect_enabled));
  280. #endif
  281. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_GPA, pHalData->TypeGPA);
  282. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_APA, pHalData->TypeAPA);
  283. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_GLNA, pHalData->TypeGLNA);
  284. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_ALNA, pHalData->TypeALNA);
  285. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RFE_TYPE, pHalData->rfe_type);
  286. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_X_CAP_SETTING, pHalData->crystal_cap);
  287. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_EXT_TRSW, 0);
  288. /*Add by YuChen for kfree init*/
  289. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_REGRFKFREEENABLE, adapter->registrypriv.RegPwrTrimEnable);
  290. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RFKFREEENABLE, pHalData->RfKFreeEnable);
  291. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RF_ANTENNA_TYPE, pHalData->TRxAntDivType);
  292. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_BE_FIX_TX_ANT, pHalData->b_fix_tx_ant);
  293. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_WITH_EXT_ANTENNA_SWITCH, pHalData->with_extenal_ant_switch);
  294. /* (8822B) efuse 0x3D7 & 0x3D8 for TX PA bias */
  295. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_EFUSE0X3D7, pHalData->efuse0x3d7);
  296. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_EFUSE0X3D8, pHalData->efuse0x3d8);
  297. /*Add by YuChen for adaptivity init*/
  298. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_ADAPTIVITY, &(adapter->registrypriv.adaptivity_en));
  299. phydm_adaptivity_info_init(pDM_Odm, PHYDM_ADAPINFO_CARRIER_SENSE_ENABLE, (adapter->registrypriv.adaptivity_mode != 0) ? TRUE : FALSE);
  300. phydm_adaptivity_info_init(pDM_Odm, PHYDM_ADAPINFO_TH_L2H_INI, adapter->registrypriv.adaptivity_th_l2h_ini);
  301. phydm_adaptivity_info_init(pDM_Odm, PHYDM_ADAPINFO_TH_EDCCA_HL_DIFF, adapter->registrypriv.adaptivity_th_edcca_hl_diff);
  302. /*halrf info init*/
  303. halrf_cmn_info_init(pDM_Odm, HALRF_CMNINFO_EEPROM_THERMAL_VALUE, pHalData->eeprom_thermal_meter);
  304. halrf_cmn_info_init(pDM_Odm, HALRF_CMNINFO_PWT_TYPE, 0);
  305. if (rtw_odm_adaptivity_needed(adapter) == _TRUE)
  306. rtw_odm_adaptivity_config_msg(RTW_DBGDUMP, adapter);
  307. #ifdef CONFIG_IQK_PA_OFF
  308. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_IQKPAOFF, 1);
  309. #endif
  310. rtw_hal_update_iqk_fw_offload_cap(adapter);
  311. #ifdef CONFIG_FW_OFFLOAD_PARAM_INIT
  312. rtw_hal_update_param_init_fw_offload_cap(adapter);
  313. #endif
  314. /* Pointer reference */
  315. /*Antenna diversity relative parameters*/
  316. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_ANT_DIV, &(pHalData->AntDivCfg));
  317. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_MP_MODE, &(adapter->registrypriv.mp_mode));
  318. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_BB_OPERATION_MODE, &(pHalData->phydm_op_mode));
  319. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_TX_UNI, &(dvobj->traffic_stat.tx_bytes));
  320. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_RX_UNI, &(dvobj->traffic_stat.rx_bytes));
  321. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_BAND, &(pHalData->current_band_type));
  322. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_FORCED_RATE, &(pHalData->ForcedDataRate));
  323. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_SEC_CHNL_OFFSET, &(pHalData->nCur40MhzPrimeSC));
  324. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_SEC_MODE, &(adapter->securitypriv.dot11PrivacyAlgrthm));
  325. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_BW, &(pHalData->current_channel_bw));
  326. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_CHNL, &(pHalData->current_channel));
  327. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_NET_CLOSED, &(adapter->net_closed));
  328. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_SCAN, &(pHalData->bScanInProcess));
  329. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_POWER_SAVING, &(pwrctl->bpower_saving));
  330. /*Add by Yuchen for phydm beamforming*/
  331. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_TX_TP, &(dvobj->traffic_stat.cur_tx_tp));
  332. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_RX_TP, &(dvobj->traffic_stat.cur_rx_tp));
  333. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_ANT_TEST, &(pHalData->antenna_test));
  334. #ifdef CONFIG_RTL8723B
  335. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_IS1ANTENNA, &pHalData->EEPROMBluetoothAntNum);
  336. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_RFDEFAULTPATH, &pHalData->ant_path);
  337. #endif /*CONFIG_RTL8723B*/
  338. #ifdef CONFIG_USB_HCI
  339. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_HUBUSBMODE, &(dvobj->usb_speed));
  340. #endif
  341. #ifdef CONFIG_DYNAMIC_SOML
  342. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_ADAPTIVE_SOML, &(adapter->registrypriv.dyn_soml_en));
  343. #endif
  344. /*halrf info hook*/
  345. #ifdef CONFIG_MP_INCLUDED
  346. halrf_cmn_info_hook(pDM_Odm, HALRF_CMNINFO_CON_TX, &(adapter->mppriv.mpt_ctx.is_start_cont_tx));
  347. halrf_cmn_info_hook(pDM_Odm, HALRF_CMNINFO_SINGLE_TONE, &(adapter->mppriv.mpt_ctx.is_single_tone));
  348. halrf_cmn_info_hook(pDM_Odm, HALRF_CMNINFO_CARRIER_SUPPRESSION, &(adapter->mppriv.mpt_ctx.is_carrier_suppression));
  349. halrf_cmn_info_hook(pDM_Odm, HALRF_CMNINFO_MP_RATE_INDEX, &(adapter->mppriv.mpt_ctx.mpt_rate_index));
  350. #endif/*CONFIG_MP_INCLUDED*/
  351. for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
  352. odm_cmn_info_ptr_array_hook(pDM_Odm, ODM_CMNINFO_STA_STATUS, i, NULL);
  353. phydm_init_debug_setting(pDM_Odm);
  354. rtw_phydm_ops_func_init(pDM_Odm);
  355. /* TODO */
  356. /* odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_BT_OPERATION, _FALSE); */
  357. /* odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_BT_DISABLE_EDCA, _FALSE); */
  358. }
  359. static u32 edca_setting_UL[HT_IOT_PEER_MAX] =
  360. /*UNKNOWN, REALTEK_90, REALTEK_92SE, BROADCOM,*/
  361. /*RALINK, ATHEROS, CISCO, MERU, MARVELL, 92U_AP, SELF_AP(DownLink/Tx) */
  362. { 0x5e4322, 0xa44f, 0x5e4322, 0x5ea32b, 0x5ea422, 0x5ea322, 0x3ea430, 0x5ea42b, 0x5ea44f, 0x5e4322, 0x5e4322};
  363. static u32 edca_setting_DL[HT_IOT_PEER_MAX] =
  364. /*UNKNOWN, REALTEK_90, REALTEK_92SE, BROADCOM,*/
  365. /*RALINK, ATHEROS, CISCO, MERU, MARVELL, 92U_AP, SELF_AP(UpLink/Rx)*/
  366. { 0xa44f, 0x5ea44f, 0x5e4322, 0x5ea42b, 0xa44f, 0xa630, 0x5ea630, 0x5ea42b, 0xa44f, 0xa42b, 0xa42b};
  367. static u32 edca_setting_dl_g_mode[HT_IOT_PEER_MAX] =
  368. /*UNKNOWN, REALTEK_90, REALTEK_92SE, BROADCOM,*/
  369. /*RALINK, ATHEROS, CISCO, MERU, MARVELL, 92U_AP, SELF_AP */
  370. { 0x4322, 0xa44f, 0x5e4322, 0xa42b, 0x5e4322, 0x4322, 0xa42b, 0x5ea42b, 0xa44f, 0x5e4322, 0x5ea42b};
  371. void rtw_hal_turbo_edca(_adapter *adapter)
  372. {
  373. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  374. struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
  375. struct recv_priv *precvpriv = &(adapter->recvpriv);
  376. struct registry_priv *pregpriv = &adapter->registrypriv;
  377. struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv);
  378. struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  379. /* Parameter suggested by Scott */
  380. #if 0
  381. u32 EDCA_BE_UL = edca_setting_UL[p_mgnt_info->iot_peer];
  382. u32 EDCA_BE_DL = edca_setting_DL[p_mgnt_info->iot_peer];
  383. #endif
  384. u32 EDCA_BE_UL = 0x5ea42b;
  385. u32 EDCA_BE_DL = 0x00a42b;
  386. u8 ic_type = rtw_get_chip_type(adapter);
  387. u8 iot_peer = 0;
  388. u8 wireless_mode = 0xFF; /* invalid value */
  389. u8 traffic_index;
  390. u32 edca_param;
  391. u64 cur_tx_bytes = 0;
  392. u64 cur_rx_bytes = 0;
  393. u8 bbtchange = _TRUE;
  394. u8 is_bias_on_rx = _FALSE;
  395. u8 is_linked = _FALSE;
  396. u8 interface_type;
  397. if (hal_data->dis_turboedca)
  398. return;
  399. if (rtw_mi_check_status(adapter, MI_ASSOC))
  400. is_linked = _TRUE;
  401. if (is_linked != _TRUE) {
  402. precvpriv->is_any_non_be_pkts = _FALSE;
  403. return;
  404. }
  405. if ((pregpriv->wifi_spec == 1)) { /* || (pmlmeinfo->HT_enable == 0)) */
  406. precvpriv->is_any_non_be_pkts = _FALSE;
  407. return;
  408. }
  409. interface_type = rtw_get_intf_type(adapter);
  410. wireless_mode = pmlmeext->cur_wireless_mode;
  411. iot_peer = pmlmeinfo->assoc_AP_vendor;
  412. if (iot_peer >= HT_IOT_PEER_MAX) {
  413. precvpriv->is_any_non_be_pkts = _FALSE;
  414. return;
  415. }
  416. if (ic_type == RTL8188E) {
  417. if ((iot_peer == HT_IOT_PEER_RALINK) || (iot_peer == HT_IOT_PEER_ATHEROS))
  418. is_bias_on_rx = _TRUE;
  419. }
  420. /* Check if the status needs to be changed. */
  421. if ((bbtchange) || (!precvpriv->is_any_non_be_pkts)) {
  422. cur_tx_bytes = dvobj->traffic_stat.cur_tx_bytes;
  423. cur_rx_bytes = dvobj->traffic_stat.cur_rx_bytes;
  424. /* traffic, TX or RX */
  425. if (is_bias_on_rx) {
  426. if (cur_tx_bytes > (cur_rx_bytes << 2)) {
  427. /* Uplink TP is present. */
  428. traffic_index = UP_LINK;
  429. } else {
  430. /* Balance TP is present. */
  431. traffic_index = DOWN_LINK;
  432. }
  433. } else {
  434. if (cur_rx_bytes > (cur_tx_bytes << 2)) {
  435. /* Downlink TP is present. */
  436. traffic_index = DOWN_LINK;
  437. } else {
  438. /* Balance TP is present. */
  439. traffic_index = UP_LINK;
  440. }
  441. }
  442. #if 0
  443. if ((p_dm_odm->dm_edca_table.prv_traffic_idx != traffic_index)
  444. || (!p_dm_odm->dm_edca_table.is_current_turbo_edca))
  445. #endif
  446. {
  447. if (interface_type == RTW_PCIE) {
  448. EDCA_BE_UL = 0x6ea42b;
  449. EDCA_BE_DL = 0x6ea42b;
  450. }
  451. /* 92D txop can't be set to 0x3e for cisco1250 */
  452. if ((iot_peer == HT_IOT_PEER_CISCO) && (wireless_mode == ODM_WM_N24G)) {
  453. EDCA_BE_DL = edca_setting_DL[iot_peer];
  454. EDCA_BE_UL = edca_setting_UL[iot_peer];
  455. }
  456. /* merge from 92s_92c_merge temp*/
  457. else if ((iot_peer == HT_IOT_PEER_CISCO) && ((wireless_mode == ODM_WM_G) || (wireless_mode == (ODM_WM_B | ODM_WM_G)) || (wireless_mode == ODM_WM_A) || (wireless_mode == ODM_WM_B)))
  458. EDCA_BE_DL = edca_setting_dl_g_mode[iot_peer];
  459. else if ((iot_peer == HT_IOT_PEER_AIRGO) && ((wireless_mode == ODM_WM_G) || (wireless_mode == ODM_WM_A)))
  460. EDCA_BE_DL = 0xa630;
  461. else if (iot_peer == HT_IOT_PEER_MARVELL) {
  462. EDCA_BE_DL = edca_setting_DL[iot_peer];
  463. EDCA_BE_UL = edca_setting_UL[iot_peer];
  464. } else if (iot_peer == HT_IOT_PEER_ATHEROS) {
  465. /* Set DL EDCA for Atheros peer to 0x3ea42b.*/
  466. /* Suggested by SD3 Wilson for ASUS TP issue.*/
  467. EDCA_BE_DL = edca_setting_DL[iot_peer];
  468. }
  469. if ((ic_type == RTL8812) || (ic_type == RTL8821) || (ic_type == RTL8192E) || (ic_type == RTL8192F)) { /* add 8812AU/8812AE */
  470. EDCA_BE_UL = 0x5ea42b;
  471. EDCA_BE_DL = 0x5ea42b;
  472. RTW_DBG("8812A: EDCA_BE_UL=0x%x EDCA_BE_DL =0x%x\n", EDCA_BE_UL, EDCA_BE_DL);
  473. }
  474. if (interface_type == RTW_PCIE &&
  475. ((ic_type == RTL8822B)
  476. || (ic_type == RTL8814A))) {
  477. EDCA_BE_UL = 0x6ea42b;
  478. EDCA_BE_DL = 0x6ea42b;
  479. }
  480. if (traffic_index == DOWN_LINK)
  481. edca_param = EDCA_BE_DL;
  482. else
  483. edca_param = EDCA_BE_UL;
  484. #ifdef CONFIG_EXTEND_LOWRATE_TXOP
  485. #define TXOP_CCK1M 0x01A6
  486. #define TXOP_CCK2M 0x00E6
  487. #define TXOP_CCK5M 0x006B
  488. #define TXOP_OFD6M 0x0066
  489. #define TXOP_MCS6M 0x0061
  490. {
  491. struct sta_info *psta;
  492. struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
  493. u8 mac_id, role, current_rate_id;
  494. /* search all used & connect2AP macid */
  495. for (mac_id = 0; mac_id < macid_ctl->num; mac_id++) {
  496. if (rtw_macid_is_used(macid_ctl, mac_id)) {
  497. role = GET_H2CCMD_MSRRPT_PARM_ROLE(&(macid_ctl->h2c_msr[mac_id]));
  498. if (role != H2C_MSR_ROLE_AP)
  499. continue;
  500. psta = macid_ctl->sta[mac_id];
  501. current_rate_id = rtw_get_current_tx_rate(adapter, psta);
  502. /* Check init tx_rate==1M and set 0x508[31:16]==0x019B(unit 32us) if it is */
  503. switch (current_rate_id) {
  504. case DESC_RATE1M:
  505. edca_param &= 0x0000FFFF;
  506. edca_param |= (TXOP_CCK1M<<16);
  507. break;
  508. case DESC_RATE2M:
  509. edca_param &= 0x0000FFFF;
  510. edca_param |= (TXOP_CCK2M<<16);
  511. break;
  512. case DESC_RATE5_5M:
  513. edca_param &= 0x0000FFFF;
  514. edca_param |= (TXOP_CCK5M<<16);
  515. break;
  516. case DESC_RATE6M:
  517. edca_param &= 0x0000FFFF;
  518. edca_param |= (TXOP_OFD6M<<16);
  519. break;
  520. case DESC_RATEMCS0:
  521. edca_param &= 0x0000FFFF;
  522. edca_param |= (TXOP_MCS6M<<16);
  523. break;
  524. default:
  525. break;
  526. }
  527. }
  528. }
  529. }
  530. #endif
  531. #ifdef CONFIG_RTW_CUSTOMIZE_BEEDCA
  532. edca_param = CONFIG_RTW_CUSTOMIZE_BEEDCA;
  533. #endif
  534. rtw_hal_set_hwreg(adapter, HW_VAR_AC_PARAM_BE, (u8 *)(&edca_param));
  535. RTW_DBG("Turbo EDCA =0x%x\n", edca_param);
  536. hal_data->prv_traffic_idx = traffic_index;
  537. }
  538. hal_data->is_turbo_edca = _TRUE;
  539. } else {
  540. /* */
  541. /* Turn Off EDCA turbo here. */
  542. /* Restore original EDCA according to the declaration of AP. */
  543. /* */
  544. if (hal_data->is_turbo_edca) {
  545. edca_param = hal_data->ac_param_be;
  546. rtw_hal_set_hwreg(adapter, HW_VAR_AC_PARAM_BE, (u8 *)(&edca_param));
  547. hal_data->is_turbo_edca = _FALSE;
  548. }
  549. }
  550. }
  551. s8 rtw_phydm_get_min_rssi(_adapter *adapter)
  552. {
  553. struct dm_struct *phydm = adapter_to_phydm(adapter);
  554. s8 rssi_min = 0;
  555. rssi_min = phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_RSSI_MIN);
  556. return rssi_min;
  557. }
  558. u8 rtw_phydm_get_cur_igi(_adapter *adapter)
  559. {
  560. struct dm_struct *phydm = adapter_to_phydm(adapter);
  561. u8 cur_igi = 0;
  562. cur_igi = phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CURR_IGI);
  563. return cur_igi;
  564. }
  565. u32 rtw_phydm_get_phy_cnt(_adapter *adapter, enum phy_cnt cnt)
  566. {
  567. struct dm_struct *phydm = adapter_to_phydm(adapter);
  568. if (cnt == FA_OFDM)
  569. return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_FA_OFDM);
  570. else if (cnt == FA_CCK)
  571. return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_FA_CCK);
  572. else if (cnt == FA_TOTAL)
  573. return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_FA_TOTAL);
  574. else if (cnt == CCA_OFDM)
  575. return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CCA_OFDM);
  576. else if (cnt == CCA_CCK)
  577. return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CCA_CCK);
  578. else if (cnt == CCA_ALL)
  579. return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CCA_ALL);
  580. else if (cnt == CRC32_OK_VHT)
  581. return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_OK_VHT);
  582. else if (cnt == CRC32_OK_HT)
  583. return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_OK_HT);
  584. else if (cnt == CRC32_OK_LEGACY)
  585. return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_OK_LEGACY);
  586. else if (cnt == CRC32_OK_CCK)
  587. return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_OK_CCK);
  588. else if (cnt == CRC32_ERROR_VHT)
  589. return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_ERROR_VHT);
  590. else if (cnt == CRC32_ERROR_HT)
  591. return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_ERROR_HT);
  592. else if (cnt == CRC32_ERROR_LEGACY)
  593. return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_ERROR_LEGACY);
  594. else if (cnt == CRC32_ERROR_CCK)
  595. return phydm_cmn_info_query(phydm, (enum phydm_info_query) PHYDM_INFO_CRC32_ERROR_CCK);
  596. else
  597. return 0;
  598. }
  599. u8 rtw_phydm_is_iqk_in_progress(_adapter *adapter)
  600. {
  601. u8 rts = _FALSE;
  602. struct dm_struct *podmpriv = adapter_to_phydm(adapter);
  603. odm_acquire_spin_lock(podmpriv, RT_IQK_SPINLOCK);
  604. if (podmpriv->rf_calibrate_info.is_iqk_in_progress == _TRUE) {
  605. RTW_ERR("IQK InProgress\n");
  606. rts = _TRUE;
  607. }
  608. odm_release_spin_lock(podmpriv, RT_IQK_SPINLOCK);
  609. return rts;
  610. }
  611. void SetHalODMVar(
  612. PADAPTER Adapter,
  613. HAL_ODM_VARIABLE eVariable,
  614. PVOID pValue1,
  615. BOOLEAN bSet)
  616. {
  617. struct dm_struct *podmpriv = adapter_to_phydm(Adapter);
  618. /* _irqL irqL; */
  619. switch (eVariable) {
  620. case HAL_ODM_STA_INFO: {
  621. struct sta_info *psta = (struct sta_info *)pValue1;
  622. if (bSet) {
  623. RTW_INFO("### Set STA_(%d) info ###\n", psta->cmn.mac_id);
  624. odm_cmn_info_ptr_array_hook(podmpriv, ODM_CMNINFO_STA_STATUS, psta->cmn.mac_id, psta);
  625. psta->cmn.dm_ctrl = STA_DM_CTRL_ACTIVE;
  626. phydm_cmn_sta_info_hook(podmpriv, psta->cmn.mac_id, &(psta->cmn));
  627. } else {
  628. RTW_INFO("### Clean STA_(%d) info ###\n", psta->cmn.mac_id);
  629. /* _enter_critical_bh(&pHalData->odm_stainfo_lock, &irqL); */
  630. psta->cmn.dm_ctrl = 0;
  631. odm_cmn_info_ptr_array_hook(podmpriv, ODM_CMNINFO_STA_STATUS, psta->cmn.mac_id, NULL);
  632. phydm_cmn_sta_info_hook(podmpriv, psta->cmn.mac_id, NULL);
  633. /* _exit_critical_bh(&pHalData->odm_stainfo_lock, &irqL); */
  634. }
  635. }
  636. break;
  637. case HAL_ODM_P2P_STATE:
  638. odm_cmn_info_update(podmpriv, ODM_CMNINFO_WIFI_DIRECT, bSet);
  639. break;
  640. case HAL_ODM_WIFI_DISPLAY_STATE:
  641. odm_cmn_info_update(podmpriv, ODM_CMNINFO_WIFI_DISPLAY, bSet);
  642. break;
  643. case HAL_ODM_REGULATION:
  644. /* used to auto enable/disable adaptivity by SD7 */
  645. phydm_adaptivity_info_update(podmpriv, PHYDM_ADAPINFO_DOMAIN_CODE_2G, 0);
  646. phydm_adaptivity_info_update(podmpriv, PHYDM_ADAPINFO_DOMAIN_CODE_5G, 0);
  647. break;
  648. case HAL_ODM_INITIAL_GAIN: {
  649. u8 rx_gain = *((u8 *)(pValue1));
  650. /*printk("rx_gain:%x\n",rx_gain);*/
  651. if (rx_gain == 0xff) {/*restore rx gain*/
  652. /*odm_write_dig(podmpriv,pDigTable->backup_ig_value);*/
  653. odm_pause_dig(podmpriv, PHYDM_RESUME, PHYDM_PAUSE_LEVEL_0, rx_gain);
  654. } else {
  655. /*pDigTable->backup_ig_value = pDigTable->cur_ig_value;*/
  656. /*odm_write_dig(podmpriv,rx_gain);*/
  657. odm_pause_dig(podmpriv, PHYDM_PAUSE, PHYDM_PAUSE_LEVEL_0, rx_gain);
  658. }
  659. }
  660. break;
  661. case HAL_ODM_RX_INFO_DUMP: {
  662. u8 cur_igi = 0;
  663. s8 rssi_min;
  664. void *sel;
  665. sel = pValue1;
  666. cur_igi = rtw_phydm_get_cur_igi(Adapter);
  667. rssi_min = rtw_phydm_get_min_rssi(Adapter);
  668. _RTW_PRINT_SEL(sel, "============ Rx Info dump ===================\n");
  669. _RTW_PRINT_SEL(sel, "is_linked = %d, rssi_min = %d(%%), current_igi = 0x%x\n", podmpriv->is_linked, rssi_min, cur_igi);
  670. _RTW_PRINT_SEL(sel, "cnt_cck_fail = %d, cnt_ofdm_fail = %d, Total False Alarm = %d\n",
  671. rtw_phydm_get_phy_cnt(Adapter, FA_CCK),
  672. rtw_phydm_get_phy_cnt(Adapter, FA_OFDM),
  673. rtw_phydm_get_phy_cnt(Adapter, FA_TOTAL));
  674. if (podmpriv->is_linked) {
  675. _RTW_PRINT_SEL(sel, "rx_rate = %s", HDATA_RATE(podmpriv->rx_rate));
  676. if (IS_HARDWARE_TYPE_8814A(Adapter))
  677. _RTW_PRINT_SEL(sel, " rssi_a = %d(%%), rssi_b = %d(%%), rssi_c = %d(%%), rssi_d = %d(%%)\n",
  678. podmpriv->rssi_a, podmpriv->rssi_b, podmpriv->rssi_c, podmpriv->rssi_d);
  679. else
  680. _RTW_PRINT_SEL(sel, " rssi_a = %d(%%), rssi_b = %d(%%)\n", podmpriv->rssi_a, podmpriv->rssi_b);
  681. #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
  682. rtw_dump_raw_rssi_info(Adapter, sel);
  683. #endif
  684. }
  685. }
  686. break;
  687. case HAL_ODM_RX_Dframe_INFO: {
  688. void *sel;
  689. sel = pValue1;
  690. /*_RTW_PRINT_SEL(sel , "HAL_ODM_RX_Dframe_INFO\n");*/
  691. #ifdef DBG_RX_DFRAME_RAW_DATA
  692. rtw_dump_rx_dframe_info(Adapter, sel);
  693. #endif
  694. }
  695. break;
  696. #ifdef CONFIG_ANTENNA_DIVERSITY
  697. case HAL_ODM_ANTDIV_SELECT: {
  698. u8 antenna = (*(u8 *)pValue1);
  699. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  700. /*switch antenna*/
  701. odm_update_rx_idle_ant(&pHalData->odmpriv, antenna);
  702. /*RTW_INFO("==> HAL_ODM_ANTDIV_SELECT, Ant_(%s)\n", (antenna == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");*/
  703. }
  704. break;
  705. #endif
  706. default:
  707. break;
  708. }
  709. }
  710. void GetHalODMVar(
  711. PADAPTER Adapter,
  712. HAL_ODM_VARIABLE eVariable,
  713. PVOID pValue1,
  714. PVOID pValue2)
  715. {
  716. struct dm_struct *podmpriv = adapter_to_phydm(Adapter);
  717. switch (eVariable) {
  718. #ifdef CONFIG_ANTENNA_DIVERSITY
  719. case HAL_ODM_ANTDIV_SELECT: {
  720. struct phydm_fat_struct *pDM_FatTable = &podmpriv->dm_fat_table;
  721. *((u8 *)pValue1) = pDM_FatTable->rx_idle_ant;
  722. }
  723. break;
  724. #endif
  725. case HAL_ODM_INITIAL_GAIN:
  726. *((u8 *)pValue1) = rtw_phydm_get_cur_igi(Adapter);
  727. break;
  728. default:
  729. break;
  730. }
  731. }
  732. #ifdef RTW_HALMAC
  733. #include "../hal_halmac.h"
  734. #endif
  735. enum hal_status
  736. rtw_phydm_fw_iqk(
  737. struct dm_struct *p_dm_odm,
  738. u8 clear,
  739. u8 segment
  740. )
  741. {
  742. #ifdef RTW_HALMAC
  743. struct _ADAPTER *adapter = p_dm_odm->adapter;
  744. if (rtw_halmac_iqk(adapter_to_dvobj(adapter), clear, segment) == 0)
  745. return HAL_STATUS_SUCCESS;
  746. #endif
  747. return HAL_STATUS_FAILURE;
  748. }
  749. enum hal_status
  750. rtw_phydm_cfg_phy_para(
  751. struct dm_struct *p_dm_odm,
  752. enum phydm_halmac_param config_type,
  753. u32 offset,
  754. u32 data,
  755. u32 mask,
  756. enum rf_path e_rf_path,
  757. u32 delay_time)
  758. {
  759. #ifdef RTW_HALMAC
  760. struct _ADAPTER *adapter = p_dm_odm->adapter;
  761. struct rtw_phy_parameter para;
  762. switch (config_type) {
  763. case PHYDM_HALMAC_CMD_MAC_W8:
  764. para.cmd = 0; /* MAC register */
  765. para.data.mac.offset = offset;
  766. para.data.mac.value = data;
  767. para.data.mac.msk = mask;
  768. para.data.mac.msk_en = (mask) ? 1 : 0;
  769. para.data.mac.size = 1;
  770. break;
  771. case PHYDM_HALMAC_CMD_MAC_W16:
  772. para.cmd = 0; /* MAC register */
  773. para.data.mac.offset = offset;
  774. para.data.mac.value = data;
  775. para.data.mac.msk = mask;
  776. para.data.mac.msk_en = (mask) ? 1 : 0;
  777. para.data.mac.size = 2;
  778. break;
  779. case PHYDM_HALMAC_CMD_MAC_W32:
  780. para.cmd = 0; /* MAC register */
  781. para.data.mac.offset = offset;
  782. para.data.mac.value = data;
  783. para.data.mac.msk = mask;
  784. para.data.mac.msk_en = (mask) ? 1 : 0;
  785. para.data.mac.size = 4;
  786. break;
  787. case PHYDM_HALMAC_CMD_BB_W8:
  788. para.cmd = 1; /* BB register */
  789. para.data.bb.offset = offset;
  790. para.data.bb.value = data;
  791. para.data.bb.msk = mask;
  792. para.data.bb.msk_en = (mask) ? 1 : 0;
  793. para.data.bb.size = 1;
  794. break;
  795. case PHYDM_HALMAC_CMD_BB_W16:
  796. para.cmd = 1; /* BB register */
  797. para.data.bb.offset = offset;
  798. para.data.bb.value = data;
  799. para.data.bb.msk = mask;
  800. para.data.bb.msk_en = (mask) ? 1 : 0;
  801. para.data.bb.size = 2;
  802. break;
  803. case PHYDM_HALMAC_CMD_BB_W32:
  804. para.cmd = 1; /* BB register */
  805. para.data.bb.offset = offset;
  806. para.data.bb.value = data;
  807. para.data.bb.msk = mask;
  808. para.data.bb.msk_en = (mask) ? 1 : 0;
  809. para.data.bb.size = 4;
  810. break;
  811. case PHYDM_HALMAC_CMD_RF_W:
  812. para.cmd = 2; /* RF register */
  813. para.data.rf.offset = offset;
  814. para.data.rf.value = data;
  815. para.data.rf.msk = mask;
  816. para.data.rf.msk_en = (mask) ? 1 : 0;
  817. if (e_rf_path == RF_PATH_A)
  818. para.data.rf.path = 0;
  819. else if (e_rf_path == RF_PATH_B)
  820. para.data.rf.path = 1;
  821. else if (e_rf_path == RF_PATH_C)
  822. para.data.rf.path = 2;
  823. else if (e_rf_path == RF_PATH_D)
  824. para.data.rf.path = 3;
  825. else
  826. para.data.rf.path = 0;
  827. break;
  828. case PHYDM_HALMAC_CMD_DELAY_US:
  829. para.cmd = 3; /* Delay */
  830. para.data.delay.unit = 0; /* microsecond */
  831. para.data.delay.value = delay_time;
  832. break;
  833. case PHYDM_HALMAC_CMD_DELAY_MS:
  834. para.cmd = 3; /* Delay */
  835. para.data.delay.unit = 1; /* millisecond */
  836. para.data.delay.value = delay_time;
  837. break;
  838. case PHYDM_HALMAC_CMD_END:
  839. para.cmd = 0xFF; /* End command */
  840. break;
  841. default:
  842. return HAL_STATUS_FAILURE;
  843. }
  844. if (rtw_halmac_cfg_phy_para(adapter_to_dvobj(adapter), &para))
  845. return HAL_STATUS_FAILURE;
  846. #endif /*RTW_HALMAC*/
  847. return HAL_STATUS_SUCCESS;
  848. }
  849. #ifdef CONFIG_LPS_LCLK_WD_TIMER
  850. void rtw_phydm_wd_lps_lclk_hdl(_adapter *adapter)
  851. {
  852. struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  853. PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter);
  854. struct dm_struct *podmpriv = &(pHalData->odmpriv);
  855. struct sta_priv *pstapriv = &adapter->stapriv;
  856. struct sta_info *psta = NULL;
  857. u8 rssi_min = 0;
  858. u32 rssi_rpt = 0;
  859. bool is_linked = _FALSE;
  860. if (!rtw_is_hw_init_completed(adapter))
  861. return;
  862. if (rtw_mi_check_status(adapter, MI_ASSOC))
  863. is_linked = _TRUE;
  864. if (is_linked == _FALSE)
  865. return;
  866. psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
  867. if (psta == NULL)
  868. return;
  869. odm_cmn_info_update(&pHalData->odmpriv, ODM_CMNINFO_LINK, is_linked);
  870. phydm_watchdog_lps_32k(&pHalData->odmpriv);
  871. }
  872. void rtw_phydm_watchdog_in_lps_lclk(_adapter *adapter)
  873. {
  874. struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  875. struct sta_priv *pstapriv = &adapter->stapriv;
  876. struct sta_info *psta = NULL;
  877. u8 cur_igi = 0;
  878. s8 min_rssi = 0;
  879. if (!rtw_is_hw_init_completed(adapter))
  880. return;
  881. psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
  882. if (psta == NULL)
  883. return;
  884. cur_igi = rtw_phydm_get_cur_igi(adapter);
  885. min_rssi = rtw_phydm_get_min_rssi(adapter);
  886. if (min_rssi <= 0)
  887. min_rssi = psta->cmn.rssi_stat.rssi;
  888. /*RTW_INFO("%s "ADPT_FMT" cur_ig_value=%d, min_rssi = %d\n", __func__, ADPT_ARG(adapter), cur_igi, min_rssi);*/
  889. if (min_rssi <= 0)
  890. return;
  891. if ((cur_igi > min_rssi + 5) ||
  892. (cur_igi < min_rssi - 5)) {
  893. #ifdef CONFIG_LPS
  894. rtw_dm_in_lps_wk_cmd(adapter);
  895. #endif
  896. }
  897. }
  898. #endif /*CONFIG_LPS_LCLK_WD_TIMER*/
  899. void dump_sta_traffic(void *sel, _adapter *adapter, struct sta_info *psta)
  900. {
  901. struct ra_sta_info *ra_info;
  902. u8 curr_sgi = _FALSE;
  903. u32 tx_tp_mbips, rx_tp_mbips, bi_tp_mbips;
  904. if (!psta)
  905. return;
  906. RTW_PRINT_SEL(sel, "\n");
  907. RTW_PRINT_SEL(sel, "====== mac_id : %d [" MAC_FMT "] ======\n",
  908. psta->cmn.mac_id, MAC_ARG(psta->cmn.mac_addr));
  909. if (is_client_associated_to_ap(psta->padapter))
  910. RTW_PRINT_SEL(sel, "BCN counts : %d (per-%d second), DTIM Period:%d\n",
  911. rtw_get_bcn_cnt(psta->padapter) / 2, 1, adapter->mlmeextpriv.dtim);
  912. ra_info = &psta->cmn.ra_info;
  913. curr_sgi = rtw_get_current_tx_sgi(adapter, psta);
  914. RTW_PRINT_SEL(sel, "tx_rate : %s(%s) rx_rate : %s, rx_rate_bmc : %s, rssi : %d %%\n"
  915. , HDATA_RATE(rtw_get_current_tx_rate(adapter, psta)), (curr_sgi) ? "S" : "L"
  916. , HDATA_RATE((psta->curr_rx_rate & 0x7F)), HDATA_RATE((psta->curr_rx_rate_bmc & 0x7F)), psta->cmn.rssi_stat.rssi
  917. );
  918. if (0) {
  919. RTW_PRINT_SEL(sel, "tx_bytes:%llu(%llu - %llu)\n"
  920. , psta->sta_stats.tx_bytes - psta->sta_stats.last_tx_bytes
  921. , psta->sta_stats.tx_bytes, psta->sta_stats.last_tx_bytes
  922. );
  923. RTW_PRINT_SEL(sel, "rx_uc_bytes:%llu(%llu - %llu)\n"
  924. , sta_rx_uc_bytes(psta) - sta_last_rx_uc_bytes(psta)
  925. , sta_rx_uc_bytes(psta), sta_last_rx_uc_bytes(psta)
  926. );
  927. RTW_PRINT_SEL(sel, "rx_mc_bytes:%llu(%llu - %llu)\n"
  928. , psta->sta_stats.rx_mc_bytes - psta->sta_stats.last_rx_mc_bytes
  929. , psta->sta_stats.rx_mc_bytes, psta->sta_stats.last_rx_mc_bytes
  930. );
  931. RTW_PRINT_SEL(sel, "rx_bc_bytes:%llu(%llu - %llu)\n"
  932. , psta->sta_stats.rx_bc_bytes - psta->sta_stats.last_rx_bc_bytes
  933. , psta->sta_stats.rx_bc_bytes, psta->sta_stats.last_rx_bc_bytes
  934. );
  935. }
  936. _RTW_PRINT_SEL(sel, "RTW: [TP] ");
  937. tx_tp_mbips = psta->sta_stats.tx_tp_kbits >> 10;
  938. rx_tp_mbips = psta->sta_stats.rx_tp_kbits >> 10;
  939. bi_tp_mbips = tx_tp_mbips + rx_tp_mbips;
  940. if (tx_tp_mbips)
  941. _RTW_PRINT_SEL(sel, "Tx : %d(Mbps) ", tx_tp_mbips);
  942. else
  943. _RTW_PRINT_SEL(sel, "Tx : %d(Kbps) ", psta->sta_stats.tx_tp_kbits);
  944. if (rx_tp_mbips)
  945. _RTW_PRINT_SEL(sel, "Rx : %d(Mbps) ", rx_tp_mbips);
  946. else
  947. _RTW_PRINT_SEL(sel, "Rx : %d(Kbps) ", psta->sta_stats.rx_tp_kbits);
  948. if (bi_tp_mbips)
  949. _RTW_PRINT_SEL(sel, "Total : %d(Mbps)\n", bi_tp_mbips);
  950. else
  951. _RTW_PRINT_SEL(sel, "Total : %d(Kbps)\n", psta->sta_stats.tx_tp_kbits + psta->sta_stats.rx_tp_kbits);
  952. _RTW_PRINT_SEL(sel, "RTW: [Smooth TP] ");
  953. tx_tp_mbips = psta->sta_stats.smooth_tx_tp_kbits >> 10;
  954. rx_tp_mbips = psta->sta_stats.smooth_rx_tp_kbits >> 10;
  955. bi_tp_mbips = tx_tp_mbips + rx_tp_mbips;
  956. if (tx_tp_mbips)
  957. _RTW_PRINT_SEL(sel, "Tx : %d(Mbps) ", tx_tp_mbips);
  958. else
  959. _RTW_PRINT_SEL(sel, "Tx : %d(Kbps) ", psta->sta_stats.smooth_tx_tp_kbits);
  960. if (rx_tp_mbips)
  961. _RTW_PRINT_SEL(sel, "Rx : %d(Mbps) ", rx_tp_mbips);
  962. else
  963. _RTW_PRINT_SEL(sel, "Rx : %d(Kbps) ", psta->sta_stats.smooth_rx_tp_kbits);
  964. if (bi_tp_mbips)
  965. _RTW_PRINT_SEL(sel, "Total : %d(Mbps)\n", bi_tp_mbips);
  966. else
  967. _RTW_PRINT_SEL(sel, "Total : %d(Kbps)\n", psta->sta_stats.smooth_tx_tp_kbits + psta->sta_stats.rx_tp_kbits);
  968. #if 0
  969. RTW_PRINT_SEL(sel, "Moving-AVG TP {Tx,Rx,Total} = { %d , %d , %d } Mbps\n\n",
  970. (psta->cmn.tx_moving_average_tp << 3), (psta->cmn.rx_moving_average_tp << 3),
  971. (psta->cmn.tx_moving_average_tp + psta->cmn.rx_moving_average_tp) << 3);
  972. #endif
  973. }
  974. void dump_sta_info(void *sel, struct sta_info *psta)
  975. {
  976. struct ra_sta_info *ra_info;
  977. u8 curr_tx_sgi = _FALSE;
  978. u8 curr_tx_rate = 0;
  979. if (!psta)
  980. return;
  981. ra_info = &psta->cmn.ra_info;
  982. RTW_PRINT_SEL(sel, "============ STA [" MAC_FMT "] ===================\n",
  983. MAC_ARG(psta->cmn.mac_addr));
  984. RTW_PRINT_SEL(sel, "mac_id : %d\n", psta->cmn.mac_id);
  985. RTW_PRINT_SEL(sel, "wireless_mode : 0x%02x\n", psta->wireless_mode);
  986. RTW_PRINT_SEL(sel, "mimo_type : %d\n", psta->cmn.mimo_type);
  987. RTW_PRINT_SEL(sel, "bw_mode : %s, ra_bw_mode : %s\n",
  988. ch_width_str(psta->cmn.bw_mode), ch_width_str(ra_info->ra_bw_mode));
  989. RTW_PRINT_SEL(sel, "rate_id : %d\n", ra_info->rate_id);
  990. RTW_PRINT_SEL(sel, "rssi : %d (%%), rssi_level : %d\n", psta->cmn.rssi_stat.rssi, ra_info->rssi_level);
  991. RTW_PRINT_SEL(sel, "is_support_sgi : %s, is_vht_enable : %s\n",
  992. (ra_info->is_support_sgi) ? "Y" : "N", (ra_info->is_vht_enable) ? "Y" : "N");
  993. RTW_PRINT_SEL(sel, "disable_ra : %s, disable_pt : %s\n",
  994. (ra_info->disable_ra) ? "Y" : "N", (ra_info->disable_pt) ? "Y" : "N");
  995. RTW_PRINT_SEL(sel, "is_noisy : %s\n", (ra_info->is_noisy) ? "Y" : "N");
  996. RTW_PRINT_SEL(sel, "txrx_state : %d\n", ra_info->txrx_state);/*0: uplink, 1:downlink, 2:bi-direction*/
  997. curr_tx_sgi = rtw_get_current_tx_sgi(psta->padapter, psta);
  998. curr_tx_rate = rtw_get_current_tx_rate(psta->padapter, psta);
  999. RTW_PRINT_SEL(sel, "curr_tx_rate : %s (%s)\n",
  1000. HDATA_RATE(curr_tx_rate), (curr_tx_sgi) ? "S" : "L");
  1001. RTW_PRINT_SEL(sel, "curr_tx_bw : %s\n", ch_width_str(ra_info->curr_tx_bw));
  1002. RTW_PRINT_SEL(sel, "curr_retry_ratio : %d\n", ra_info->curr_retry_ratio);
  1003. RTW_PRINT_SEL(sel, "ra_mask : 0x%016llx\n\n", ra_info->ramask);
  1004. }
  1005. void rtw_phydm_ra_registed(_adapter *adapter, struct sta_info *psta)
  1006. {
  1007. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  1008. if (psta == NULL) {
  1009. RTW_ERR(FUNC_ADPT_FMT" sta is NULL\n", FUNC_ADPT_ARG(adapter));
  1010. rtw_warn_on(1);
  1011. return;
  1012. }
  1013. phydm_ra_registed(&hal_data->odmpriv, psta->cmn.mac_id, psta->cmn.rssi_stat.rssi);
  1014. dump_sta_info(RTW_DBGDUMP, psta);
  1015. }
  1016. static void init_phydm_info(_adapter *adapter)
  1017. {
  1018. PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);
  1019. struct dm_struct *phydm = &(hal_data->odmpriv);
  1020. odm_cmn_info_init(phydm, ODM_CMNINFO_FW_VER, hal_data->firmware_version);
  1021. odm_cmn_info_init(phydm, ODM_CMNINFO_FW_SUB_VER, hal_data->firmware_sub_version);
  1022. }
  1023. void rtw_phydm_init(_adapter *adapter)
  1024. {
  1025. PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);
  1026. struct dm_struct *phydm = &(hal_data->odmpriv);
  1027. init_phydm_info(adapter);
  1028. odm_dm_init(phydm);
  1029. }
  1030. #ifdef CONFIG_LPS_PG
  1031. /*
  1032. static void _lps_pg_state_update(_adapter *adapter)
  1033. {
  1034. u8 is_in_lpspg = _FALSE;
  1035. struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);
  1036. PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter);
  1037. struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  1038. struct sta_priv *pstapriv = &adapter->stapriv;
  1039. struct sta_info *psta = NULL;
  1040. if ((pwrpriv->lps_level == LPS_PG) && (pwrpriv->pwr_mode != PS_MODE_ACTIVE) && (pwrpriv->rpwm <= PS_STATE_S2))
  1041. is_in_lpspg = _TRUE;
  1042. psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
  1043. if (psta)
  1044. psta->cmn.ra_info.disable_ra = (is_in_lpspg) ? _TRUE : _FALSE;
  1045. }
  1046. */
  1047. void rtw_phydm_lps_pg_hdl(_adapter *adapter, struct sta_info *sta, bool in_lpspg)
  1048. {
  1049. struct dm_struct *phydm = adapter_to_phydm(adapter);
  1050. /*u8 rate_id;*/
  1051. if(sta == NULL) {
  1052. RTW_ERR("%s sta is null\n", __func__);
  1053. rtw_warn_on(1);
  1054. return;
  1055. }
  1056. if (in_lpspg) {
  1057. sta->cmn.ra_info.disable_ra = _TRUE;
  1058. sta->cmn.ra_info.disable_pt = _TRUE;
  1059. /*TODO : DRV fix tx rate*/
  1060. /*rate_id = phydm_get_rate_from_rssi_lv(phydm, sta->cmn.mac_id);*/
  1061. } else {
  1062. sta->cmn.ra_info.disable_ra = _FALSE;
  1063. sta->cmn.ra_info.disable_pt = _FALSE;
  1064. }
  1065. rtw_phydm_ra_registed(adapter, sta);
  1066. }
  1067. #endif
  1068. /*#define DBG_PHYDM_STATE_CHK*/
  1069. static u8 _rtw_phydm_rfk_condition_check(_adapter *adapter, u8 is_scaning, u8 ifs_linked)
  1070. {
  1071. u8 rfk_allowed = _TRUE;
  1072. #ifdef CONFIG_SKIP_RFK_IN_DM
  1073. rfk_allowed = _FALSE;
  1074. if (0)
  1075. RTW_ERR("[RFK-CHK] RF-K not allowed due to CONFIG_SKIP_RFK_IN_DM\n");
  1076. return rfk_allowed;
  1077. #endif
  1078. if (ifs_linked) {
  1079. if (is_scaning) {
  1080. rfk_allowed = _FALSE;
  1081. RTW_ERR("[RFK-CHK] RF-K not allowed due to ifaces under site-survey\n");
  1082. }
  1083. else {
  1084. rfk_allowed = rtw_mi_stayin_union_ch_chk(adapter) ? _TRUE : _FALSE;
  1085. if (rfk_allowed == _FALSE)
  1086. RTW_ERR("[RFK-CHK] RF-K not allowed due to ld_iface not stayin union ch\n");
  1087. }
  1088. }
  1089. #ifdef CONFIG_MCC_MODE
  1090. /*not in MCC State*/
  1091. if (MCC_EN(adapter)) {
  1092. if (rtw_hal_check_mcc_status(adapter, MCC_STATUS_DOING_MCC)) {
  1093. rfk_allowed = _FALSE;
  1094. if (0)
  1095. RTW_ERR("[RFK-CHK] RF-K not allowed due to doing MCC\n");
  1096. }
  1097. }
  1098. #endif
  1099. #if defined(CONFIG_TDLS) && defined(CONFIG_TDLS_CH_SW)
  1100. #endif
  1101. return rfk_allowed;
  1102. }
  1103. #if ((RTL8822B_SUPPORT == 1) || (RTL8821C_SUPPORT == 1) || (RTL8814B_SUPPORT == 1))
  1104. static u8 _rtw_phydm_iqk_segment_chk(_adapter *adapter, u8 ifs_linked)
  1105. {
  1106. u8 iqk_sgt = _FALSE;
  1107. #if 0
  1108. struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
  1109. if (is_linked && (dvobj->traffic_stat.cur_tx_tp > 2 || dvobj->traffic_stat.cur_rx_tp > 2))
  1110. rst = _TRUE;
  1111. #else
  1112. if (ifs_linked)
  1113. iqk_sgt = _TRUE;
  1114. #endif
  1115. return iqk_sgt;
  1116. }
  1117. #endif
  1118. /*check the tx low rate while unlinked to any AP;for pwr tracking */
  1119. static u8 _rtw_phydm_pwr_tracking_rate_check(_adapter *adapter)
  1120. {
  1121. int i;
  1122. _adapter *iface;
  1123. u8 if_tx_rate = 0xFF;
  1124. u8 tx_rate = 0xFF;
  1125. struct mlme_ext_priv *pmlmeext = NULL;
  1126. struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
  1127. for (i = 0; i < dvobj->iface_nums; i++) {
  1128. iface = dvobj->padapters[i];
  1129. pmlmeext = &(iface->mlmeextpriv);
  1130. if ((iface) && rtw_is_adapter_up(iface)) {
  1131. #ifdef CONFIG_P2P
  1132. if (!rtw_p2p_chk_role(&(iface)->wdinfo, P2P_ROLE_DISABLE))
  1133. if_tx_rate = IEEE80211_OFDM_RATE_6MB;
  1134. else
  1135. #endif
  1136. if_tx_rate = pmlmeext->tx_rate;
  1137. if(if_tx_rate < tx_rate)
  1138. tx_rate = if_tx_rate;
  1139. RTW_DBG("%s i=%d tx_rate =0x%x\n", __func__, i, if_tx_rate);
  1140. }
  1141. }
  1142. RTW_DBG("%s tx_low_rate (unlinked to any AP)=0x%x\n", __func__, tx_rate);
  1143. return tx_rate;
  1144. }
  1145. #ifdef CONFIG_DYNAMIC_SOML
  1146. void rtw_dyn_soml_byte_update(_adapter *adapter, u8 data_rate, u32 size)
  1147. {
  1148. struct dm_struct *phydm = adapter_to_phydm(adapter);
  1149. phydm_soml_bytes_acq(phydm, data_rate, size);
  1150. }
  1151. void rtw_dyn_soml_para_set(_adapter *adapter, u8 train_num, u8 intvl,
  1152. u8 period, u8 delay)
  1153. {
  1154. struct dm_struct *phydm = adapter_to_phydm(adapter);
  1155. phydm_adaptive_soml_para_set(phydm, train_num, intvl, period, delay);
  1156. RTW_INFO("%s.\n", __func__);
  1157. }
  1158. void rtw_dyn_soml_config(_adapter *adapter)
  1159. {
  1160. RTW_INFO("%s.\n", __func__);
  1161. if (adapter->registrypriv.dyn_soml_en == 1) {
  1162. /* Must after phydm_adaptive_soml_init() */
  1163. rtw_hal_set_hwreg(adapter , HW_VAR_SET_SOML_PARAM , NULL);
  1164. RTW_INFO("dyn_soml_en = 1\n");
  1165. } else {
  1166. if (adapter->registrypriv.dyn_soml_en == 2) {
  1167. rtw_dyn_soml_para_set(adapter,
  1168. adapter->registrypriv.dyn_soml_train_num,
  1169. adapter->registrypriv.dyn_soml_interval,
  1170. adapter->registrypriv.dyn_soml_period,
  1171. adapter->registrypriv.dyn_soml_delay);
  1172. RTW_INFO("dyn_soml_en = 2\n");
  1173. RTW_INFO("dyn_soml_en, param = %d, %d, %d, %d\n",
  1174. adapter->registrypriv.dyn_soml_train_num,
  1175. adapter->registrypriv.dyn_soml_interval,
  1176. adapter->registrypriv.dyn_soml_period,
  1177. adapter->registrypriv.dyn_soml_delay);
  1178. } else if (adapter->registrypriv.dyn_soml_en == 0) {
  1179. RTW_INFO("dyn_soml_en = 0\n");
  1180. } else
  1181. RTW_ERR("%s, wrong setting: dyn_soml_en = %d\n", __func__,
  1182. adapter->registrypriv.dyn_soml_en);
  1183. }
  1184. }
  1185. #endif
  1186. void rtw_phydm_read_efuse(_adapter *adapter)
  1187. {
  1188. PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);
  1189. struct dm_struct *phydm = &(hal_data->odmpriv);
  1190. /*PHYDM API - thermal trim*/
  1191. phydm_get_thermal_trim_offset(phydm);
  1192. /*PHYDM API - power trim*/
  1193. phydm_get_power_trim_offset(phydm);
  1194. }
  1195. void rtw_phydm_watchdog(_adapter *adapter)
  1196. {
  1197. u8 bLinked = _FALSE;
  1198. u8 bsta_state = _FALSE;
  1199. u8 bBtDisabled = _TRUE;
  1200. u8 rfk_forbidden = _FALSE;
  1201. #if ((RTL8822B_SUPPORT == 1) || (RTL8821C_SUPPORT == 1) || (RTL8814B_SUPPORT == 1))
  1202. u8 segment_iqk = _FALSE;
  1203. #endif
  1204. u8 tx_unlinked_low_rate = 0xFF;
  1205. PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter);
  1206. struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(adapter);
  1207. if (!rtw_is_hw_init_completed(adapter)) {
  1208. RTW_DBG("%s skip due to hw_init_completed == FALSE\n", __func__);
  1209. return;
  1210. }
  1211. if (rtw_mi_check_fwstate(adapter, _FW_UNDER_SURVEY))
  1212. pHalData->bScanInProcess = _TRUE;
  1213. else
  1214. pHalData->bScanInProcess = _FALSE;
  1215. if (rtw_mi_check_status(adapter, MI_ASSOC)) {
  1216. bLinked = _TRUE;
  1217. if (rtw_mi_check_status(adapter, MI_STA_LINKED))
  1218. bsta_state = _TRUE;
  1219. }
  1220. odm_cmn_info_update(&pHalData->odmpriv, ODM_CMNINFO_LINK, bLinked);
  1221. odm_cmn_info_update(&pHalData->odmpriv, ODM_CMNINFO_STATION_STATE, bsta_state);
  1222. #ifdef CONFIG_BT_COEXIST
  1223. bBtDisabled = rtw_btcoex_IsBtDisabled(adapter);
  1224. #endif /* CONFIG_BT_COEXIST */
  1225. odm_cmn_info_update(&pHalData->odmpriv, ODM_CMNINFO_BT_ENABLED,
  1226. (bBtDisabled == _TRUE) ? _FALSE : _TRUE);
  1227. rfk_forbidden = (_rtw_phydm_rfk_condition_check(adapter, pHalData->bScanInProcess, bLinked) == _TRUE) ? _FALSE : _TRUE;
  1228. halrf_cmn_info_set(&pHalData->odmpriv, HALRF_CMNINFO_RFK_FORBIDDEN, rfk_forbidden);
  1229. #if ((RTL8822B_SUPPORT == 1) || (RTL8821C_SUPPORT == 1) || (RTL8814B_SUPPORT == 1))
  1230. segment_iqk = _rtw_phydm_iqk_segment_chk(adapter, bLinked);
  1231. halrf_cmn_info_set(&pHalData->odmpriv, HALRF_CMNINFO_IQK_SEGMENT, segment_iqk);
  1232. #endif
  1233. #ifdef DBG_PHYDM_STATE_CHK
  1234. RTW_INFO("%s rfk_forbidden = %s, segment_iqk = %s\n",
  1235. __func__, (rfk_forbidden) ? "Y" : "N", (segment_iqk) ? "Y" : "N");
  1236. #endif
  1237. if (bLinked == _FALSE) {
  1238. tx_unlinked_low_rate = _rtw_phydm_pwr_tracking_rate_check(adapter);
  1239. halrf_cmn_info_set(&pHalData->odmpriv, HALRF_CMNINFO_RATE_INDEX, tx_unlinked_low_rate);
  1240. }
  1241. /*if (!rtw_mi_stayin_union_band_chk(adapter)) {
  1242. #ifdef DBG_PHYDM_STATE_CHK
  1243. RTW_ERR("Not stay in union band, skip phydm\n");
  1244. #endif
  1245. goto _exit;
  1246. }*/
  1247. if (pwrctl->bpower_saving)
  1248. phydm_watchdog_lps(&pHalData->odmpriv);
  1249. else
  1250. phydm_watchdog(&pHalData->odmpriv);
  1251. #ifdef CONFIG_RTW_ACS
  1252. rtw_acs_update_current_info(adapter);
  1253. #endif
  1254. _exit:
  1255. return;
  1256. }