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