hal_dm.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2014 Realtek Corporation. All rights reserved.
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of version 2 of the GNU General Public License as
  7. * published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. *
  14. * You should have received a copy of the GNU General Public License along with
  15. * this program; if not, write to the Free Software Foundation, Inc.,
  16. * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  17. *
  18. *
  19. ******************************************************************************/
  20. #include <drv_types.h>
  21. #include <hal_data.h>
  22. /* A mapping from HalData to ODM. */
  23. enum odm_board_type_e boardType(u8 InterfaceSel)
  24. {
  25. enum odm_board_type_e board = ODM_BOARD_DEFAULT;
  26. #ifdef CONFIG_PCI_HCI
  27. INTERFACE_SELECT_PCIE pcie = (INTERFACE_SELECT_PCIE)InterfaceSel;
  28. switch (pcie) {
  29. case INTF_SEL0_SOLO_MINICARD:
  30. board |= ODM_BOARD_MINICARD;
  31. break;
  32. case INTF_SEL1_BT_COMBO_MINICARD:
  33. board |= ODM_BOARD_BT;
  34. board |= ODM_BOARD_MINICARD;
  35. break;
  36. default:
  37. board = ODM_BOARD_DEFAULT;
  38. break;
  39. }
  40. #elif defined(CONFIG_USB_HCI)
  41. INTERFACE_SELECT_USB usb = (INTERFACE_SELECT_USB)InterfaceSel;
  42. switch (usb) {
  43. case INTF_SEL1_USB_High_Power:
  44. board |= ODM_BOARD_EXT_LNA;
  45. board |= ODM_BOARD_EXT_PA;
  46. break;
  47. case INTF_SEL2_MINICARD:
  48. board |= ODM_BOARD_MINICARD;
  49. break;
  50. case INTF_SEL4_USB_Combo:
  51. board |= ODM_BOARD_BT;
  52. break;
  53. case INTF_SEL5_USB_Combo_MF:
  54. board |= ODM_BOARD_BT;
  55. break;
  56. case INTF_SEL0_USB:
  57. case INTF_SEL3_USB_Solo:
  58. default:
  59. board = ODM_BOARD_DEFAULT;
  60. break;
  61. }
  62. #endif
  63. /* RTW_INFO("===> boardType(): (pHalData->InterfaceSel, pDM_Odm->BoardType) = (%d, %d)\n", InterfaceSel, board); */
  64. return board;
  65. }
  66. void Init_ODM_ComInfo(_adapter *adapter)
  67. {
  68. struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
  69. PHAL_DATA_TYPE pHalData = GET_HAL_DATA(adapter);
  70. struct PHY_DM_STRUCT *pDM_Odm = &(pHalData->odmpriv);
  71. struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
  72. struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  73. struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(adapter);
  74. int i;
  75. _rtw_memset(pDM_Odm, 0, sizeof(*pDM_Odm));
  76. pDM_Odm->adapter = adapter;
  77. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_PLATFORM, ODM_CE);
  78. rtw_odm_init_ic_type(adapter);
  79. if (rtw_get_intf_type(adapter) == RTW_GSPI)
  80. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_INTERFACE, ODM_ITRF_SDIO);
  81. else
  82. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_INTERFACE, rtw_get_intf_type(adapter));
  83. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_MP_TEST_CHIP, IS_NORMAL_CHIP(pHalData->version_id));
  84. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_PATCH_ID, pHalData->CustomerID);
  85. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_BWIFI_TEST, adapter->registrypriv.wifi_spec);
  86. if (pHalData->rf_type == RF_1T1R)
  87. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_1T1R);
  88. else if (pHalData->rf_type == RF_1T2R)
  89. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_1T2R);
  90. else if (pHalData->rf_type == RF_2T2R)
  91. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_2T2R);
  92. else if (pHalData->rf_type == RF_2T2R_GREEN)
  93. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_2T2R_GREEN);
  94. else if (pHalData->rf_type == RF_2T3R)
  95. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_2T3R);
  96. else if (pHalData->rf_type == RF_2T4R)
  97. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_2T4R);
  98. else if (pHalData->rf_type == RF_3T3R)
  99. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_3T3R);
  100. else if (pHalData->rf_type == RF_3T4R)
  101. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_3T4R);
  102. else if (pHalData->rf_type == RF_4T4R)
  103. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_4T4R);
  104. else
  105. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RF_TYPE, ODM_XTXR);
  106. {
  107. /* 1 ======= BoardType: ODM_CMNINFO_BOARD_TYPE ======= */
  108. u8 odm_board_type = ODM_BOARD_DEFAULT;
  109. if (pHalData->ExternalLNA_2G != 0) {
  110. odm_board_type |= ODM_BOARD_EXT_LNA;
  111. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_EXT_LNA, 1);
  112. }
  113. if (pHalData->external_lna_5g != 0) {
  114. odm_board_type |= ODM_BOARD_EXT_LNA_5G;
  115. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_5G_EXT_LNA, 1);
  116. }
  117. if (pHalData->ExternalPA_2G != 0) {
  118. odm_board_type |= ODM_BOARD_EXT_PA;
  119. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_EXT_PA, 1);
  120. }
  121. if (pHalData->external_pa_5g != 0) {
  122. odm_board_type |= ODM_BOARD_EXT_PA_5G;
  123. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_5G_EXT_PA, 1);
  124. }
  125. if (pHalData->EEPROMBluetoothCoexist)
  126. odm_board_type |= ODM_BOARD_BT;
  127. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_BOARD_TYPE, odm_board_type);
  128. /* 1 ============== End of BoardType ============== */
  129. }
  130. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_DOMAIN_CODE_2G, pHalData->Regulation2_4G);
  131. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_DOMAIN_CODE_5G, pHalData->Regulation5G);
  132. #ifdef CONFIG_DFS_MASTER
  133. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_DFS_REGION_DOMAIN, adapter->registrypriv.dfs_region_domain);
  134. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_DFS_MASTER_ENABLE, &(adapter_to_rfctl(adapter)->dfs_master_enabled));
  135. #endif
  136. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_GPA, pHalData->TypeGPA);
  137. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_APA, pHalData->TypeAPA);
  138. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_GLNA, pHalData->TypeGLNA);
  139. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_ALNA, pHalData->TypeALNA);
  140. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RFE_TYPE, pHalData->rfe_type);
  141. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_EXT_TRSW, 0);
  142. /*Add by YuChen for kfree init*/
  143. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_REGRFKFREEENABLE, adapter->registrypriv.RegPwrTrimEnable);
  144. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RFKFREEENABLE, pHalData->RfKFreeEnable);
  145. /*Antenna diversity relative parameters*/
  146. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_ANT_DIV, &(pHalData->AntDivCfg));
  147. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RF_ANTENNA_TYPE, pHalData->TRxAntDivType);
  148. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_BE_FIX_TX_ANT, pHalData->b_fix_tx_ant);
  149. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_WITH_EXT_ANTENNA_SWITCH, pHalData->with_extenal_ant_switch);
  150. /* (8822B) efuse 0x3D7 & 0x3D8 for TX PA bias */
  151. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_EFUSE0X3D7, pHalData->efuse0x3d7);
  152. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_EFUSE0X3D8, pHalData->efuse0x3d8);
  153. /*Add by YuChen for adaptivity init*/
  154. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_ADAPTIVITY, &(adapter->registrypriv.adaptivity_en));
  155. phydm_adaptivity_info_init(pDM_Odm, PHYDM_ADAPINFO_CARRIER_SENSE_ENABLE, (adapter->registrypriv.adaptivity_mode != 0) ? TRUE : FALSE);
  156. phydm_adaptivity_info_init(pDM_Odm, PHYDM_ADAPINFO_DCBACKOFF, adapter->registrypriv.adaptivity_dc_backoff);
  157. phydm_adaptivity_info_init(pDM_Odm, PHYDM_ADAPINFO_DYNAMICLINKADAPTIVITY, (adapter->registrypriv.adaptivity_dml != 0) ? TRUE : FALSE);
  158. phydm_adaptivity_info_init(pDM_Odm, PHYDM_ADAPINFO_TH_L2H_INI, adapter->registrypriv.adaptivity_th_l2h_ini);
  159. phydm_adaptivity_info_init(pDM_Odm, PHYDM_ADAPINFO_TH_EDCCA_HL_DIFF, adapter->registrypriv.adaptivity_th_edcca_hl_diff);
  160. #ifdef CONFIG_IQK_PA_OFF
  161. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_IQKPAOFF, 1);
  162. #endif
  163. odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_IQKFWOFFLOAD, pHalData->RegIQKFWOffload);
  164. /* Pointer reference */
  165. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_TX_UNI, &(dvobj->traffic_stat.tx_bytes));
  166. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_RX_UNI, &(dvobj->traffic_stat.rx_bytes));
  167. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_WM_MODE, &(pmlmeext->cur_wireless_mode));
  168. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_BAND, &(pHalData->current_band_type));
  169. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_FORCED_RATE, &(pHalData->ForcedDataRate));
  170. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_FORCED_IGI_LB, &(pHalData->u1ForcedIgiLb));
  171. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_SEC_CHNL_OFFSET, &(pHalData->nCur40MhzPrimeSC));
  172. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_SEC_MODE, &(adapter->securitypriv.dot11PrivacyAlgrthm));
  173. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_BW, &(pHalData->current_channel_bw));
  174. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_CHNL, &(pHalData->current_channel));
  175. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_NET_CLOSED, &(adapter->net_closed));
  176. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_FORCED_IGI_LB, &(pHalData->u1ForcedIgiLb));
  177. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_SCAN, &(pmlmepriv->bScanInProcess));
  178. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_POWER_SAVING, &(pwrctl->bpower_saving));
  179. /*Add by Yuchen for phydm beamforming*/
  180. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_TX_TP, &(dvobj->traffic_stat.cur_tx_tp));
  181. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_RX_TP, &(dvobj->traffic_stat.cur_rx_tp));
  182. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_ANT_TEST, &(pHalData->antenna_test));
  183. #ifdef CONFIG_USB_HCI
  184. odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_HUBUSBMODE, &(dvobj->usb_speed));
  185. #endif
  186. for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
  187. odm_cmn_info_ptr_array_hook(pDM_Odm, ODM_CMNINFO_STA_STATUS, i, NULL);
  188. phydm_init_debug_setting(pDM_Odm);
  189. /* TODO */
  190. /* odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_BT_OPERATION, _FALSE); */
  191. /* odm_cmn_info_hook(pDM_Odm, ODM_CMNINFO_BT_DISABLE_EDCA, _FALSE); */
  192. }
  193. static u32 edca_setting_UL[HT_IOT_PEER_MAX] =
  194. /*UNKNOWN, REALTEK_90, REALTEK_92SE, BROADCOM,*/
  195. /*RALINK, ATHEROS, CISCO, MERU, MARVELL, 92U_AP, SELF_AP(DownLink/Tx) */
  196. { 0x5e4322, 0xa44f, 0x5e4322, 0x5ea32b, 0x5ea422, 0x5ea322, 0x3ea430, 0x5ea42b, 0x5ea44f, 0x5e4322, 0x5e4322};
  197. static u32 edca_setting_DL[HT_IOT_PEER_MAX] =
  198. /*UNKNOWN, REALTEK_90, REALTEK_92SE, BROADCOM,*/
  199. /*RALINK, ATHEROS, CISCO, MERU, MARVELL, 92U_AP, SELF_AP(UpLink/Rx)*/
  200. { 0xa44f, 0x5ea44f, 0x5e4322, 0x5ea42b, 0xa44f, 0xa630, 0x5ea630, 0x5ea42b, 0xa44f, 0xa42b, 0xa42b};
  201. static u32 edca_setting_dl_g_mode[HT_IOT_PEER_MAX] =
  202. /*UNKNOWN, REALTEK_90, REALTEK_92SE, BROADCOM,*/
  203. /*RALINK, ATHEROS, CISCO, MERU, MARVELL, 92U_AP, SELF_AP */
  204. { 0x4322, 0xa44f, 0x5e4322, 0xa42b, 0x5e4322, 0x4322, 0xa42b, 0x5ea42b, 0xa44f, 0x5e4322, 0x5ea42b};
  205. void rtw_hal_turbo_edca(_adapter *adapter)
  206. {
  207. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  208. struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
  209. struct recv_priv *precvpriv = &(adapter->recvpriv);
  210. struct registry_priv *pregpriv = &adapter->registrypriv;
  211. struct mlme_ext_priv *pmlmeext = &(adapter->mlmeextpriv);
  212. struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  213. /* Parameter suggested by Scott */
  214. #if 0
  215. u32 EDCA_BE_UL = edca_setting_UL[p_mgnt_info->iot_peer];
  216. u32 EDCA_BE_DL = edca_setting_DL[p_mgnt_info->iot_peer];
  217. #endif
  218. u32 EDCA_BE_UL = 0x5ea42b;
  219. u32 EDCA_BE_DL = 0x00a42b;
  220. u8 ic_type = rtw_get_chip_type(adapter);
  221. u8 iot_peer = 0;
  222. u8 wireless_mode = 0xFF; /* invalid value */
  223. u8 traffic_index;
  224. u32 edca_param;
  225. u64 cur_tx_bytes = 0;
  226. u64 cur_rx_bytes = 0;
  227. u8 bbtchange = _TRUE;
  228. u8 is_bias_on_rx = _FALSE;
  229. u8 is_linked = _FALSE;
  230. u8 interface_type;
  231. if (hal_data->dis_turboedca)
  232. return;
  233. if (rtw_mi_check_status(adapter, MI_ASSOC))
  234. is_linked = _TRUE;
  235. if (is_linked != _TRUE) {
  236. precvpriv->is_any_non_be_pkts = _FALSE;
  237. return;
  238. }
  239. if ((pregpriv->wifi_spec == 1)) { /* || (pmlmeinfo->HT_enable == 0)) */
  240. precvpriv->is_any_non_be_pkts = _FALSE;
  241. return;
  242. }
  243. interface_type = rtw_get_intf_type(adapter);
  244. wireless_mode = pmlmeext->cur_wireless_mode;
  245. iot_peer = pmlmeinfo->assoc_AP_vendor;
  246. if (iot_peer >= HT_IOT_PEER_MAX) {
  247. precvpriv->is_any_non_be_pkts = _FALSE;
  248. return;
  249. }
  250. if (ic_type == RTL8188E) {
  251. if ((iot_peer == HT_IOT_PEER_RALINK) || (iot_peer == HT_IOT_PEER_ATHEROS))
  252. is_bias_on_rx = _TRUE;
  253. }
  254. /* Check if the status needs to be changed. */
  255. if ((bbtchange) || (!precvpriv->is_any_non_be_pkts)) {
  256. cur_tx_bytes = dvobj->traffic_stat.cur_tx_bytes;
  257. cur_rx_bytes = dvobj->traffic_stat.cur_rx_bytes;
  258. /* traffic, TX or RX */
  259. if (is_bias_on_rx) {
  260. if (cur_tx_bytes > (cur_rx_bytes << 2)) {
  261. /* Uplink TP is present. */
  262. traffic_index = UP_LINK;
  263. } else {
  264. /* Balance TP is present. */
  265. traffic_index = DOWN_LINK;
  266. }
  267. } else {
  268. if (cur_rx_bytes > (cur_tx_bytes << 2)) {
  269. /* Downlink TP is present. */
  270. traffic_index = DOWN_LINK;
  271. } else {
  272. /* Balance TP is present. */
  273. traffic_index = UP_LINK;
  274. }
  275. }
  276. #if 0
  277. if ((p_dm_odm->dm_edca_table.prv_traffic_idx != traffic_index)
  278. || (!p_dm_odm->dm_edca_table.is_current_turbo_edca))
  279. #endif
  280. {
  281. if (interface_type == RTW_PCIE) {
  282. EDCA_BE_UL = 0x6ea42b;
  283. EDCA_BE_DL = 0x6ea42b;
  284. }
  285. /* 92D txop can't be set to 0x3e for cisco1250 */
  286. if ((iot_peer == HT_IOT_PEER_CISCO) && (wireless_mode == ODM_WM_N24G)) {
  287. EDCA_BE_DL = edca_setting_DL[iot_peer];
  288. EDCA_BE_UL = edca_setting_UL[iot_peer];
  289. }
  290. /* merge from 92s_92c_merge temp*/
  291. 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)))
  292. EDCA_BE_DL = edca_setting_dl_g_mode[iot_peer];
  293. else if ((iot_peer == HT_IOT_PEER_AIRGO) && ((wireless_mode == ODM_WM_G) || (wireless_mode == ODM_WM_A)))
  294. EDCA_BE_DL = 0xa630;
  295. else if (iot_peer == HT_IOT_PEER_MARVELL) {
  296. EDCA_BE_DL = edca_setting_DL[iot_peer];
  297. EDCA_BE_UL = edca_setting_UL[iot_peer];
  298. } else if (iot_peer == HT_IOT_PEER_ATHEROS) {
  299. /* Set DL EDCA for Atheros peer to 0x3ea42b.*/
  300. /* Suggested by SD3 Wilson for ASUS TP issue.*/
  301. EDCA_BE_DL = edca_setting_DL[iot_peer];
  302. }
  303. if ((ic_type == RTL8812) || (ic_type == RTL8821) || (ic_type == RTL8192E)) { /* add 8812AU/8812AE */
  304. EDCA_BE_UL = 0x5ea42b;
  305. EDCA_BE_DL = 0x5ea42b;
  306. RTW_DBG("8812A: EDCA_BE_UL=0x%x EDCA_BE_DL =0x%x\n", EDCA_BE_UL, EDCA_BE_DL);
  307. }
  308. if (interface_type == RTW_PCIE &&
  309. (ic_type == RTL8822B)) {
  310. EDCA_BE_UL = 0x6ea42b;
  311. EDCA_BE_DL = 0x6ea42b;
  312. }
  313. if (traffic_index == DOWN_LINK)
  314. edca_param = EDCA_BE_DL;
  315. else
  316. edca_param = EDCA_BE_UL;
  317. rtw_hal_set_hwreg(adapter, HW_VAR_AC_PARAM_BE, (u8 *)(&edca_param));
  318. RTW_DBG("Turbo EDCA =0x%x\n", edca_param);
  319. hal_data->prv_traffic_idx = traffic_index;
  320. }
  321. hal_data->is_turbo_edca = _TRUE;
  322. } else {
  323. /* */
  324. /* Turn Off EDCA turbo here. */
  325. /* Restore original EDCA according to the declaration of AP. */
  326. /* */
  327. if (hal_data->is_turbo_edca) {
  328. edca_param = hal_data->ac_param_be;
  329. rtw_hal_set_hwreg(adapter, HW_VAR_AC_PARAM_BE, (u8 *)(&edca_param));
  330. hal_data->is_turbo_edca = _FALSE;
  331. }
  332. }
  333. }