rtl8821c_halinit.c 8.7 KB

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