• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  * Copyright(c) 2015 - 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 _RTL8822C_HALINIT_C_
16 
17 #include <drv_types.h>		/* PADAPTER, basic_types.h and etc. */
18 #include <hal_data.h>		/* GET_HAL_SPEC(), HAL_DATA_TYPE */
19 #include "../hal_halmac.h"	/* HALMAC API */
20 #include "rtl8822c.h"
21 
22 
rtl8822c_init_hal_spec(PADAPTER adapter)23 void rtl8822c_init_hal_spec(PADAPTER adapter)
24 {
25 	struct hal_spec_t *hal_spec;
26 
27 
28 	hal_spec = GET_HAL_SPEC(adapter);
29 	rtw_halmac_fill_hal_spec(adapter_to_dvobj(adapter), hal_spec);
30 
31 	hal_spec->ic_name = "rtl8822c";
32 	hal_spec->macid_num = 128;
33 	/* hal_spec->sec_cam_ent_num follow halmac setting */
34 	hal_spec->sec_cap = SEC_CAP_CHK_BMC | SEC_CAP_CHK_EXTRA_SEC;
35 	hal_spec->wow_cap = WOW_CAP_TKIP_OL;
36 	hal_spec->macid_cap = MACID_DROP;
37 
38 	hal_spec->rfpath_num_2g = 2;
39 	hal_spec->rfpath_num_5g = 2;
40 	hal_spec->rf_reg_path_num = hal_spec->rf_reg_path_avail_num = 2;
41 	hal_spec->rf_reg_trx_path_bmp = 0x33;
42 	hal_spec->max_tx_cnt = 2;
43 
44 	hal_spec->tx_nss_num = 2;
45 	hal_spec->rx_nss_num = 2;
46 	hal_spec->band_cap = BAND_CAP_2G | BAND_CAP_5G;
47 	hal_spec->bw_cap = BW_CAP_20M | BW_CAP_40M | BW_CAP_80M;
48 	hal_spec->port_num = 5;
49 	hal_spec->proto_cap = PROTO_CAP_11B | PROTO_CAP_11G | PROTO_CAP_11N | PROTO_CAP_11AC;
50 
51 	hal_spec->txgi_max = 127;
52 	hal_spec->txgi_pdbm = 4;
53 
54 	hal_spec->wl_func = 0
55 			    | WL_FUNC_P2P
56 			    | WL_FUNC_MIRACAST
57 			    | WL_FUNC_TDLS
58 			    ;
59 
60 	hal_spec->tx_aclt_unit_factor = 8;
61 
62 	hal_spec->rx_tsf_filter = 1;
63 
64 	hal_spec->pg_txpwr_saddr = 0x10;
65 	hal_spec->pg_txgi_diff_factor = 2;
66 
67 	hal_spec->hci_type = 0;
68 
69 	rtw_macid_ctl_init_sleep_reg(adapter_to_macidctl(adapter)
70 		, REG_MACID_SLEEP_8822C
71 		, REG_MACID_SLEEP1_8822C
72 		, REG_MACID_SLEEP2_8822C
73 		, REG_MACID_SLEEP3_8822C);
74 
75 	rtw_macid_ctl_init_drop_reg(adapter_to_macidctl(adapter)
76 		, REG_MACID_DROP0_8822C
77 		, REG_MACID_DROP1_8822C
78 		, REG_MACID_DROP2_8822C
79 		, REG_MACID_DROP3_8822C);
80 
81 }
82 
rtl8822c_power_on(PADAPTER adapter)83 u32 rtl8822c_power_on(PADAPTER adapter)
84 {
85 	struct dvobj_priv *d;
86 	PHAL_DATA_TYPE hal;
87 	u8 bMacPwrCtrlOn;
88 	int err = 0;
89 	u8 ret = _SUCCESS;
90 
91 
92 	d = adapter_to_dvobj(adapter);
93 
94 	bMacPwrCtrlOn = _FALSE;
95 	rtw_hal_get_hwreg(adapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
96 	if (bMacPwrCtrlOn == _TRUE)
97 		goto out;
98 
99 	err = rtw_halmac_poweron(d);
100 	if (err) {
101 		RTW_ERR("%s: Power ON Fail!!\n", __FUNCTION__);
102 		ret = _FAIL;
103 		goto out;
104 	}
105 
106 	bMacPwrCtrlOn = _TRUE;
107 	rtw_hal_set_hwreg(adapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
108 
109 out:
110 	return ret;
111 }
112 
rtl8822c_power_off(PADAPTER adapter)113 void rtl8822c_power_off(PADAPTER adapter)
114 {
115 	struct dvobj_priv *d;
116 	u8 bMacPwrCtrlOn;
117 	int err = 0;
118 
119 
120 	d = adapter_to_dvobj(adapter);
121 
122 	bMacPwrCtrlOn = _FALSE;
123 	rtw_hal_get_hwreg(adapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
124 	if (bMacPwrCtrlOn == _FALSE)
125 		goto out;
126 
127 	bMacPwrCtrlOn = _FALSE;
128 	rtw_hal_set_hwreg(adapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn);
129 
130 	GET_HAL_DATA(adapter)->bFWReady = _FALSE;
131 
132 	err = rtw_halmac_poweroff(d);
133 	if (err) {
134 		RTW_ERR("%s: Power OFF Fail!!\n", __FUNCTION__);
135 		goto out;
136 	}
137 
138 out:
139 	return;
140 }
141 
rtl8822c_hal_init(PADAPTER adapter)142 u8 rtl8822c_hal_init(PADAPTER adapter)
143 {
144 	struct dvobj_priv *d;
145 	PHAL_DATA_TYPE hal;
146 	int err;
147 	u8 fw_bin = _TRUE;
148 
149 	d = adapter_to_dvobj(adapter);
150 	hal = GET_HAL_DATA(adapter);
151 
152 	hal->bFWReady = _FALSE;
153 	hal->fw_ractrl = _FALSE;
154 
155 #ifdef CONFIG_NO_FW
156 	err = rtw_halmac_init_hal(d);
157 	if(!err) {
158 		RTW_INFO("%s@%d: no fw test successful\n", __func__, __LINE__);
159 		return _TRUE;
160 	}
161 #endif
162 
163 #ifdef CONFIG_FILE_FWIMG
164 	rtw_get_phy_file_path(adapter, MAC_FILE_FW_NIC);
165 	if (rtw_is_file_readable(rtw_phy_para_file_path) == _TRUE) {
166 		RTW_INFO("%s acquire FW from file:%s\n", __FUNCTION__, rtw_phy_para_file_path);
167 		fw_bin = _TRUE;
168 	} else
169 #endif /* CONFIG_FILE_FWIMG */
170 	{
171 		RTW_INFO("%s fw source from array\n", __FUNCTION__);
172 		fw_bin = _FALSE;
173 	}
174 
175 #ifdef CONFIG_FILE_FWIMG
176 	if (_TRUE == fw_bin)
177 		err = rtw_halmac_init_hal_fw_file(d, rtw_phy_para_file_path);
178 	else
179 #endif /* CONFIG_FILE_FWIMG */
180 		err = rtw_halmac_init_hal_fw(d, array_mp_8822c_fw_nic, array_length_mp_8822c_fw_nic);
181 
182 	if (err) {
183 		RTW_ERR("%s Download Firmware from %s failed\n", __FUNCTION__, (fw_bin) ? "file" : "array");
184 		return _FALSE;
185 	}
186 
187 
188 
189 	RTW_INFO("%s Download Firmware from %s success\n", __FUNCTION__, (fw_bin) ? "file" : "array");
190 	RTW_INFO("%s FW Version:%d SubVersion:%d FW size:%d\n", "NIC",
191 		hal->firmware_version, hal->firmware_sub_version, hal->firmware_size);
192 
193 	/* Sync driver status with hardware setting */
194 	rtw_hal_get_hwreg(adapter, HW_VAR_RCR, NULL);
195 	hal->bFWReady = _TRUE;
196 	hal->fw_ractrl = _TRUE;
197 
198 	return _TRUE;
199 }
200 
rtl8822c_mac_verify(PADAPTER adapter)201 u8 rtl8822c_mac_verify(PADAPTER adapter)
202 {
203 	struct dvobj_priv *d;
204 	int err;
205 
206 
207 	d = adapter_to_dvobj(adapter);
208 
209 	err = rtw_halmac_self_verify(d);
210 	if (err) {
211 		RTW_INFO("%s fail\n", __FUNCTION__);
212 		return _FALSE;
213 	}
214 
215 	RTW_INFO("%s successful\n", __FUNCTION__);
216 	return _TRUE;
217 }
218 
rtl8822c_init_misc(PADAPTER adapter)219 void rtl8822c_init_misc(PADAPTER adapter)
220 {
221 	PHAL_DATA_TYPE hal;
222 	u8 v8 = 0;
223 	u32 v32 = 0;
224 
225 
226 	hal = GET_HAL_DATA(adapter);
227 
228 
229 	/* initial security setting */
230 	invalidate_cam_all(adapter);
231 
232 	/* check RCR/ICV bit */
233 	rtw_hal_rcr_clear(adapter, BIT_ACRC32_8822C | BIT_AICV_8822C);
234 
235 	/* clear rx ctrl frame */
236 	rtw_write16(adapter, REG_RXFLTMAP1_8822C, 0);
237 
238 	/*Enable MAC security engine*/
239 	rtw_write16(adapter, REG_CR, (rtw_read16(adapter, REG_CR) | BIT_MAC_SEC_EN));
240 
241 #ifdef CONFIG_XMIT_ACK
242 	/* ack for xmit mgmt frames. */
243 	rtw_write32(adapter, REG_FWHW_TXQ_CTRL_8822C,
244 		rtw_read32(adapter, REG_FWHW_TXQ_CTRL_8822C) | BIT_EN_QUEUE_RPT_8822C(BIT(4)));
245 #endif /* CONFIG_XMIT_ACK */
246 
247 #ifdef CONFIG_TCP_CSUM_OFFLOAD_RX
248 	rtw_hal_rcr_add(adapter, BIT_TCPOFLD_EN_8822C);
249 #endif /* CONFIG_TCP_CSUM_OFFLOAD_RX*/
250 }
251 
rtl8822c_init(PADAPTER adapter)252 u32 rtl8822c_init(PADAPTER adapter)
253 {
254 	u8 ok = _TRUE;
255 	PHAL_DATA_TYPE hal;
256 
257 	hal = GET_HAL_DATA(adapter);
258 
259 	ok = rtl8822c_hal_init(adapter);
260 	if (_FALSE == ok)
261 		return _FAIL;
262 
263 	rtl8822c_phy_init_haldm(adapter);
264 #ifdef CONFIG_BEAMFORMING
265 	rtl8822c_phy_bf_init(adapter);
266 #endif
267 
268 #ifdef CONFIG_FW_MULTI_PORT_SUPPORT
269 	/*HW / FW init*/
270 	rtw_hal_set_default_port_id_cmd(adapter, 0);
271 #endif
272 
273 #ifdef CONFIG_BT_COEXIST
274 	/* Init BT hw config. */
275 	if (_TRUE == hal->EEPROMBluetoothCoexist) {
276 		rtw_btcoex_HAL_Initialize(adapter, _FALSE);
277 		#ifdef CONFIG_FW_MULTI_PORT_SUPPORT
278 		rtw_hal_set_wifi_btc_port_id_cmd(adapter);
279 		#endif
280 	} else
281 #endif /* CONFIG_BT_COEXIST */
282 		rtw_btcoex_wifionly_hw_config(adapter);
283 
284 	rtl8822c_init_misc(adapter);
285 
286 	return _SUCCESS;
287 }
288 
rtl8822c_deinit(PADAPTER adapter)289 u32 rtl8822c_deinit(PADAPTER adapter)
290 {
291 	struct dvobj_priv *d;
292 	PHAL_DATA_TYPE hal;
293 	int err;
294 
295 
296 	d = adapter_to_dvobj(adapter);
297 	hal = GET_HAL_DATA(adapter);
298 
299 	hal->bFWReady = _FALSE;
300 	hal->fw_ractrl = _FALSE;
301 
302 	err = rtw_halmac_deinit_hal(d);
303 	if (err)
304 		return _FAIL;
305 
306 	return _SUCCESS;
307 }
308 
rtl8822c_init_default_value(PADAPTER adapter)309 void rtl8822c_init_default_value(PADAPTER adapter)
310 {
311 	PHAL_DATA_TYPE hal;
312 	u8 i;
313 
314 
315 	hal = GET_HAL_DATA(adapter);
316 
317 	/* init default value */
318 	hal->fw_ractrl = _FALSE;
319 
320 	/* init phydm default value */
321 	hal->bIQKInitialized = _FALSE;
322 
323 	/* init Efuse variables */
324 	hal->EfuseUsedBytes = 0;
325 	hal->EfuseUsedPercentage = 0;
326 
327 	hal->EfuseHal.fakeEfuseBank = 0;
328 	hal->EfuseHal.fakeEfuseUsedBytes = 0;
329 	_rtw_memset(hal->EfuseHal.fakeEfuseContent, 0xFF, EFUSE_MAX_HW_SIZE);
330 	_rtw_memset(hal->EfuseHal.fakeEfuseInitMap, 0xFF, EFUSE_MAX_MAP_LEN);
331 	_rtw_memset(hal->EfuseHal.fakeEfuseModifiedMap, 0xFF, EFUSE_MAX_MAP_LEN);
332 	hal->EfuseHal.BTEfuseUsedBytes = 0;
333 	hal->EfuseHal.BTEfuseUsedPercentage = 0;
334 	_rtw_memset(hal->EfuseHal.BTEfuseContent, 0xFF, EFUSE_MAX_BT_BANK * EFUSE_MAX_HW_SIZE);
335 	_rtw_memset(hal->EfuseHal.BTEfuseInitMap, 0xFF, EFUSE_BT_MAX_MAP_LEN);
336 	_rtw_memset(hal->EfuseHal.BTEfuseModifiedMap, 0xFF, EFUSE_BT_MAX_MAP_LEN);
337 	hal->EfuseHal.fakeBTEfuseUsedBytes = 0;
338 	_rtw_memset(hal->EfuseHal.fakeBTEfuseContent, 0xFF, EFUSE_MAX_BT_BANK * EFUSE_MAX_HW_SIZE);
339 	_rtw_memset(hal->EfuseHal.fakeBTEfuseInitMap, 0xFF, EFUSE_BT_MAX_MAP_LEN);
340 	_rtw_memset(hal->EfuseHal.fakeBTEfuseModifiedMap, 0xFF, EFUSE_BT_MAX_MAP_LEN);
341 
342 }
343