rtl8821c_halinit.c 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2016 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. #define _RTL8821C_HALINIT_C_
  21. #include <drv_types.h> /* PADAPTER, basic_types.h and etc. */
  22. #include <hal_data.h> /* GET_HAL_SPEC(), HAL_DATA_TYPE */
  23. #include "../hal_halmac.h" /* HALMAC API */
  24. #include "rtl8821c.h"
  25. void init_hal_spec_rtl8821c(PADAPTER adapter)
  26. {
  27. struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
  28. rtw_halmac_fill_hal_spec(adapter_to_dvobj(adapter), hal_spec);
  29. hal_spec->ic_name = "rtl8821c";
  30. hal_spec->macid_num = 128;
  31. /* hal_spec->sec_cam_ent_num follow halmac setting */
  32. hal_spec->sec_cap = SEC_CAP_CHK_BMC;
  33. hal_spec->rfpath_num_2g = 2;
  34. hal_spec->rfpath_num_5g = 1;
  35. hal_spec->max_tx_cnt = 1;
  36. hal_spec->tx_nss_num = 1;
  37. hal_spec->rx_nss_num = 1;
  38. hal_spec->band_cap = BAND_CAP_2G | BAND_CAP_5G;
  39. hal_spec->bw_cap = BW_CAP_20M | BW_CAP_40M | BW_CAP_80M;
  40. hal_spec->port_num = 5;
  41. hal_spec->hci_type = 0;
  42. hal_spec->proto_cap = PROTO_CAP_11B | PROTO_CAP_11G | PROTO_CAP_11N | PROTO_CAP_11AC;
  43. hal_spec->wl_func = 0
  44. #ifdef CONFIG_P2P
  45. | WL_FUNC_P2P
  46. #ifdef CONFIG_WFD
  47. | WL_FUNC_MIRACAST
  48. #endif /* CONFIG_WFD */
  49. #endif /* CONFIG_P2P */
  50. #ifdef CONFIG_TDLS
  51. | WL_FUNC_TDLS
  52. #endif /* CONFIG_TDLS */
  53. ;
  54. }
  55. u32 rtl8821c_power_on(PADAPTER adapter)
  56. {
  57. struct dvobj_priv *d;
  58. PHAL_DATA_TYPE hal;
  59. u8 bMacPwrCtrlOn;
  60. int err = 0;
  61. u8 ret = _SUCCESS;
  62. d = adapter_to_dvobj(adapter);
  63. bMacPwrCtrlOn = _FALSE;
  64. rtw_hal_get_hwreg(adapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
  65. if (bMacPwrCtrlOn == _TRUE)
  66. goto out;
  67. err = rtw_halmac_poweron(d);
  68. #ifdef CONFIG_POWER_STATE_UNEXPECTED_HDL
  69. if ((-2) == err) {
  70. RTW_ERR("%s:Power ON Fail, Try to power on again !!\n", __FUNCTION__);
  71. rtw_halmac_poweroff(d);
  72. rtw_msleep_os(2);
  73. err = rtw_halmac_poweron(d);
  74. }
  75. #endif
  76. if (err) {
  77. RTW_ERR("%s: Power ON Fail!!\n", __FUNCTION__);
  78. rtw_warn_on(1);
  79. ret = _FAIL;
  80. goto out;
  81. }
  82. bMacPwrCtrlOn = _TRUE;
  83. rtw_hal_set_hwreg(adapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
  84. out:
  85. return ret;
  86. }
  87. void rtl8821c_power_off(PADAPTER adapter)
  88. {
  89. struct dvobj_priv *d;
  90. u8 bMacPwrCtrlOn;
  91. int err = 0;
  92. d = adapter_to_dvobj(adapter);
  93. bMacPwrCtrlOn = _FALSE;
  94. rtw_hal_get_hwreg(adapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
  95. if (bMacPwrCtrlOn == _FALSE)
  96. goto out;
  97. err = rtw_halmac_poweroff(d);
  98. if (err) {
  99. RTW_ERR("%s: Power OFF Fail!!\n", __FUNCTION__);
  100. rtw_warn_on(1);
  101. goto out;
  102. }
  103. bMacPwrCtrlOn = _FALSE;
  104. rtw_hal_set_hwreg(adapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
  105. adapter->bFWReady = _FALSE;
  106. out:
  107. return;
  108. }
  109. u8 rtl8821c_hal_init_main(PADAPTER adapter)
  110. {
  111. struct dvobj_priv *d = adapter_to_dvobj(adapter);
  112. PHAL_DATA_TYPE hal = GET_HAL_DATA(adapter);
  113. int err;
  114. s32 ret;
  115. adapter->bFWReady = _FALSE;
  116. hal->fw_ractrl = _FALSE;
  117. #ifdef CONFIG_NO_FW
  118. err = rtw_halmac_init_hal(d);
  119. #else
  120. #ifdef CONFIG_FILE_FWIMG
  121. rtw_get_phy_file_path(adapter, MAC_FILE_FW_NIC);
  122. err = rtw_halmac_init_hal_fw_file(d, rtw_phy_para_file_path);
  123. #else
  124. err = rtw_halmac_init_hal_fw(d, array_mp_8821c_fw_nic, array_length_mp_8821c_fw_nic);
  125. #endif
  126. if (!err) {
  127. adapter->bFWReady = _TRUE;
  128. hal->fw_ractrl = _TRUE;
  129. }
  130. RTW_INFO("FW Version:%d SubVersion:%d\n", hal->firmware_version, hal->firmware_sub_version);
  131. #endif
  132. if (err) {
  133. RTW_INFO("%s: fail\n", __FUNCTION__);
  134. return _FALSE;
  135. }
  136. RTW_INFO("%s: successful\n", __FUNCTION__);
  137. return _TRUE;
  138. }
  139. u8 rtl8821c_mac_verify(PADAPTER adapter)
  140. {
  141. struct dvobj_priv *d;
  142. int err;
  143. d = adapter_to_dvobj(adapter);
  144. err = rtw_halmac_self_verify(d);
  145. if (err) {
  146. RTW_INFO("%s fail\n", __FUNCTION__);
  147. return _FALSE;
  148. }
  149. RTW_INFO("%s successful\n", __FUNCTION__);
  150. return _TRUE;
  151. }
  152. void rtl8821c_hal_init_channel_setting(PADAPTER adapter)
  153. {
  154. PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);
  155. /* initial channel setting */
  156. hal_data->current_channel = 0;
  157. hal_data->current_channel_bw = CHANNEL_WIDTH_MAX;
  158. hal_data->current_band_type = BAND_MAX;
  159. }
  160. void rtl8821c_hal_init_misc(PADAPTER adapter)
  161. {
  162. PHAL_DATA_TYPE hal_data = GET_HAL_DATA(adapter);
  163. u8 drv_info_sz = 0;
  164. /*
  165. * Sync driver status and hardware setting
  166. */
  167. /* initial security setting */
  168. invalidate_cam_all(adapter);
  169. /* enable to rx ps-poll ,disable Control frame filter*/
  170. rtw_write16(adapter, REG_RXFLTMAP1_8821C, 0x0400);
  171. /* Accept all data frames */
  172. rtw_write16(adapter, REG_RXFLTMAP_8821C, 0xFFFF);
  173. /* Accept all management frames */
  174. rtw_write16(adapter, REG_RXFLTMAP0_8821C, 0xFFFF);
  175. /*RCR setting - Sync driver status with hardware setting */
  176. rtl8821c_rcr_get(adapter, NULL);
  177. rtl8821c_rcr_clear(adapter, BIT_AICV_8821C | BIT_ACRC32_8821C | BIT_APP_FCS_8821C | BIT_APWRMGT_8821C);
  178. rtw_halmac_get_drv_info_sz(adapter_to_dvobj(adapter), &drv_info_sz);
  179. if (drv_info_sz)
  180. rtl8821c_rcr_add(adapter, BIT_APP_PHYSTS_8821C);
  181. #ifdef CONFIG_RX_PACKET_APPEND_FCS
  182. rtl8821c_rcr_add(adapter, BIT_APP_FCS_8821C);
  183. #endif
  184. #ifdef CONFIG_RX_PACKET_APPEND_ICV_ERROR
  185. rtl8821c_rcr_add(adapter, BIT_AICV_8821C);
  186. #endif
  187. #ifdef CONFIG_XMIT_ACK
  188. rtl8821c_set_mgnt_xmit_ack(adapter);
  189. #endif /*CONFIG_XMIT_ACK*/
  190. /*Disable BAR, suggested by Scott */
  191. rtw_write32(adapter, REG_BAR_MODE_CTRL_8821C, 0x0201ffff);
  192. /*Disable secondary CCA 20M,40M?*/
  193. rtw_write8(adapter, REG_MISC_CTRL_8821C, 0x03);
  194. /*Enable MAC security engine*/
  195. rtw_write16(adapter, REG_CR, (rtw_read16(adapter, REG_CR) | BIT_MAC_SEC_EN));
  196. rtl8821c_rx_tsf_addr_filter_config(adapter, BIT_CHK_TSF_EN_8821C | BIT_CHK_TSF_CBSSID_8821C);
  197. /*for 1212 module - 5G RX issue*/
  198. if (hal_data->rfe_type == 2)
  199. rtw_write8(adapter, REG_PAD_CTRL1 + 3, 0x36);
  200. #ifdef CONFIG_CHECK_AC_LIFETIME
  201. /* Enable lifetime check for the four ACs */
  202. rtw_write8(adapter, REG_LIFETIME_EN_8821C, rtw_read8(adapter, REG_LIFETIME_EN_8821C) | 0x0f);
  203. #endif /* CONFIG_CHECK_AC_LIFETIME */
  204. #if defined(CONFIG_CONCURRENT_MODE) || defined(CONFIG_TX_MCAST2UNI)
  205. #ifdef CONFIG_TX_MCAST2UNI
  206. rtw_write16(adapter, REG_PKT_LIFE_TIME_8821C, 0x0400); /* unit: 256us. 256ms */
  207. rtw_write16(adapter, REG_PKT_LIFE_TIME_8821C+2, 0x0400); /* unit: 256us. 256ms */
  208. #else /* CONFIG_TX_MCAST2UNI */
  209. rtw_write16(adapter, REG_PKT_LIFE_TIME_8821C, 0x3000); /* unit: 256us. 3s */
  210. rtw_write16(adapter, REG_PKT_LIFE_TIME_8821C+2, 0x3000); /* unit: 256us. 3s */
  211. #endif /* CONFIG_TX_MCAST2UNI */
  212. #endif /* CONFIG_CONCURRENT_MODE || CONFIG_TX_MCAST2UNI */
  213. }
  214. u32 rtl8821c_hal_init(PADAPTER adapter)
  215. {
  216. PHAL_DATA_TYPE hal;
  217. hal = GET_HAL_DATA(adapter);
  218. if (_FALSE == rtl8821c_hal_init_main(adapter))
  219. return _FAIL;
  220. rtl8821c_hal_init_misc(adapter);
  221. rtl8821c_phy_init_haldm(adapter);
  222. #ifdef CONFIG_BT_COEXIST
  223. /* Init BT hw config. */
  224. if (_TRUE == hal->EEPROMBluetoothCoexist)
  225. rtw_btcoex_HAL_Initialize(adapter, _FALSE);
  226. else
  227. rtw_btcoex_wifionly_hw_config(adapter);
  228. #else /* CONFIG_BT_COEXIST */
  229. rtw_btcoex_wifionly_hw_config(adapter);
  230. #endif /* CONFIG_BT_COEXIST */
  231. rtl8821c_hal_init_channel_setting(adapter);
  232. return _SUCCESS;
  233. }
  234. u32 rtl8821c_hal_deinit(PADAPTER adapter)
  235. {
  236. struct dvobj_priv *d;
  237. PHAL_DATA_TYPE hal;
  238. int err;
  239. d = adapter_to_dvobj(adapter);
  240. hal = GET_HAL_DATA(adapter);
  241. adapter->bFWReady = _FALSE;
  242. hal->fw_ractrl = _FALSE;
  243. err = rtw_halmac_deinit_hal(d);
  244. if (err)
  245. return _FAIL;
  246. return _SUCCESS;
  247. }
  248. void rtl8821c_init_default_value(PADAPTER adapter)
  249. {
  250. PHAL_DATA_TYPE hal;
  251. u8 i;
  252. hal = GET_HAL_DATA(adapter);
  253. adapter->registrypriv.wireless_mode = WIRELESS_MODE_24G | WIRELESS_MODE_5G;
  254. /* init default value */
  255. hal->fw_ractrl = _FALSE;
  256. if (!adapter_to_pwrctl(adapter)->bkeepfwalive)
  257. hal->LastHMEBoxNum = 0;
  258. /* init phydm default value */
  259. hal->bIQKInitialized = _FALSE;
  260. hal->odmpriv.rf_calibrate_info.tm_trigger = 0; /* for IQK */
  261. hal->odmpriv.rf_calibrate_info.thermal_value_hp_index = 0;
  262. for (i = 0; i < HP_THERMAL_NUM; i++)
  263. hal->odmpriv.rf_calibrate_info.thermal_value_hp[i] = 0;
  264. /* init Efuse variables */
  265. hal->EfuseUsedBytes = 0;
  266. hal->EfuseUsedPercentage = 0;
  267. #ifdef HAL_EFUSE_MEMORY
  268. hal->EfuseHal.fakeEfuseBank = 0;
  269. hal->EfuseHal.fakeEfuseUsedBytes = 0;
  270. _rtw_memset(hal->EfuseHal.fakeEfuseContent, 0xFF, EFUSE_MAX_HW_SIZE);
  271. _rtw_memset(hal->EfuseHal.fakeEfuseInitMap, 0xFF, EFUSE_MAX_MAP_LEN);
  272. _rtw_memset(hal->EfuseHal.fakeEfuseModifiedMap, 0xFF, EFUSE_MAX_MAP_LEN);
  273. hal->EfuseHal.BTEfuseUsedBytes = 0;
  274. hal->EfuseHal.BTEfuseUsedPercentage = 0;
  275. _rtw_memset(hal->EfuseHal.BTEfuseContent, 0xFF, EFUSE_MAX_BT_BANK * EFUSE_MAX_HW_SIZE);
  276. _rtw_memset(hal->EfuseHal.BTEfuseInitMap, 0xFF, EFUSE_BT_MAX_MAP_LEN);
  277. _rtw_memset(hal->EfuseHal.BTEfuseModifiedMap, 0xFF, EFUSE_BT_MAX_MAP_LEN);
  278. hal->EfuseHal.fakeBTEfuseUsedBytes = 0;
  279. _rtw_memset(hal->EfuseHal.fakeBTEfuseContent, 0xFF, EFUSE_MAX_BT_BANK * EFUSE_MAX_HW_SIZE);
  280. _rtw_memset(hal->EfuseHal.fakeBTEfuseInitMap, 0xFF, EFUSE_BT_MAX_MAP_LEN);
  281. _rtw_memset(hal->EfuseHal.fakeBTEfuseModifiedMap, 0xFF, EFUSE_BT_MAX_MAP_LEN);
  282. #endif
  283. }