xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8821cs/hal/rtl8821c/rtl8821c_mac.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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_MAC_C_
16 
17 #include <drv_types.h>		/* PADAPTER, basic_types.h and etc. */
18 #include <hal_data.h>		/* HAL_DATA_TYPE */
19 #include "../hal_halmac.h"	/* Register Definition and etc. */
20 
21 #ifdef CONFIG_XMIT_ACK
rtl8821c_set_mgnt_xmit_ack(_adapter * adapter)22 inline u8 rtl8821c_set_mgnt_xmit_ack(_adapter *adapter)
23 {
24 	int err;
25 
26 	/*ack for xmit mgmt frames.*/
27 	err = rtw_write32(adapter, REG_FWHW_TXQ_CTRL_8821C, rtw_read32(adapter, REG_FWHW_TXQ_CTRL_8821C) | BIT(12));
28 	if (err == _FAIL)
29 		return _FAIL;
30 
31 	return _SUCCESS;
32 }
33 #endif
34 
rtl8821c_rx_ba_ssn_appended(PADAPTER p)35 inline u8 rtl8821c_rx_ba_ssn_appended(PADAPTER p)
36 {
37 	return rtw_hal_rcr_check(p, BIT_APP_BASSN_8821C);
38 }
39 
rtl8821c_rx_fcs_append_switch(PADAPTER p,u8 enable)40 inline u8 rtl8821c_rx_fcs_append_switch(PADAPTER p, u8 enable)
41 {
42 	u32 rcr_bit;
43 	u8 ret = _TRUE;
44 
45 	rcr_bit = BIT_APP_FCS_8821C;
46 	if (_TRUE == enable)
47 		ret = rtw_hal_rcr_add(p, rcr_bit);
48 	else
49 		ret = rtw_hal_rcr_clear(p, rcr_bit);
50 
51 	return ret;
52 }
53 
rtl8821c_rx_fcs_appended(PADAPTER p)54 inline u8 rtl8821c_rx_fcs_appended(PADAPTER p)
55 {
56 	return rtw_hal_rcr_check(p, BIT_APP_FCS_8821C);
57 }
58 
rtl8821c_rx_tsf_addr_filter_config(_adapter * adapter,u8 config)59 u8 rtl8821c_rx_tsf_addr_filter_config(_adapter *adapter, u8 config)
60 {
61 	u8 v8;
62 	int err;
63 
64 	v8 = GET_HAL_DATA(adapter)->rx_tsf_addr_filter_config;
65 
66 	if (v8 != config) {
67 
68 		err = rtw_write8(adapter, REG_NAN_RX_TSF_FILTER_8821C, config);
69 		if (_FAIL == err)
70 			return _FALSE;
71 	}
72 
73 	GET_HAL_DATA(adapter)->rx_tsf_addr_filter_config = config;
74 	return _TRUE;
75 }
76 
77 /*
78  * Return:
79  *	_SUCCESS	Download Firmware OK.
80  *	_FAIL		Download Firmware FAIL!
81  */
rtl8821c_fw_dl(PADAPTER adapter,u8 wowlan)82 s32 rtl8821c_fw_dl(PADAPTER adapter, u8 wowlan)
83 {
84 	struct dvobj_priv *d = adapter_to_dvobj(adapter);
85 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
86 	int err;
87 	u8 fw_bin = _TRUE;
88 
89 #ifdef CONFIG_FILE_FWIMG
90 	fw_bin = _TRUE;
91 	if (_TRUE == wowlan) {
92 		rtw_get_phy_file_path(adapter, MAC_FILE_FW_WW_IMG);
93 		err = rtw_halmac_dlfw_from_file(d, rtw_phy_para_file_path);
94 	} else {
95 		rtw_get_phy_file_path(adapter, MAC_FILE_FW_NIC);
96 		err = rtw_halmac_dlfw_from_file(d, rtw_phy_para_file_path);
97 	}
98 #else
99 	fw_bin = _FALSE;
100 	#ifdef CONFIG_WOWLAN
101 	if (_TRUE == wowlan)
102 		err = rtw_halmac_dlfw(d, array_mp_8821c_fw_wowlan, array_length_mp_8821c_fw_wowlan);
103 	else
104 	#endif
105 		err = rtw_halmac_dlfw(d, array_mp_8821c_fw_nic, array_length_mp_8821c_fw_nic);
106 #endif
107 
108 	if (!err) {
109 		hal_data->bFWReady = _TRUE;
110 		hal_data->fw_ractrl = _TRUE;
111 		RTW_INFO("%s Download Firmware from %s success\n", __func__, (fw_bin) ? "file" : "array");
112 		RTW_INFO("%s FW Version:%d SubVersion:%d\n", (wowlan) ? "WOW" : "NIC", hal_data->firmware_version, hal_data->firmware_sub_version);
113 
114 		return _SUCCESS;
115 	} else {
116 		RTW_ERR("%s Download Firmware from %s failed\n", __func__, (fw_bin) ? "file" : "array");
117 		return _FAIL;
118 	}
119 }
120 /*
121  * Return:
122  *	_SUCCESS	Download Firmware MEM OK.
123  *	_FAIL		Download Firmware MEM FAIL!
124  */
rtl8821c_fw_mem_dl(PADAPTER adapter,enum fw_mem mem)125 s32 rtl8821c_fw_mem_dl(PADAPTER adapter, enum fw_mem mem)
126 {
127 	struct dvobj_priv *d = adapter_to_dvobj(adapter);
128 	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
129 	int err = 0;
130 	u8 fw_bin = _TRUE;
131 
132 #ifdef CONFIG_FILE_FWIMG
133 	fw_bin = _TRUE;
134 	rtw_get_phy_file_path(adapter, MAC_FILE_FW_NIC);
135 	err = rtw_halmac_dlfw_mem_from_file(d, rtw_phy_para_file_path, mem);
136 #else
137 	fw_bin = _FALSE;
138 	err = rtw_halmac_dlfw_mem(d, array_mp_8821c_fw_nic, array_length_mp_8821c_fw_nic, mem);
139 #endif
140 
141 	if (err) {
142 		RTW_ERR("%s Download Firmware MEM from %s failed\n", __func__, (fw_bin) ? "file" : "array");
143 		return _FAIL;
144 	}
145 
146 	RTW_INFO("%s Download Firmware MEM from %s success\n", __func__, (fw_bin) ? "file" : "array");
147 	return _SUCCESS;
148 
149 }
150 #ifdef CONFIG_AMPDU_PRETX_CD
151 #include "rtl8821c.h"
152 #define AMPDU_NUMBER				0x3F3F /*MAX AMPDU Number = 63*/
153 #define REG_PRECNT_CTRL_8821C		0x04E5
154 #define BIT_EN_PRECNT_8821C			BIT(11)
155 #define PRECNT_TH					0x1E4 /*6.05us*/
156 
157 /* pre-tx count-down mechanism */
rtl8821c_pretx_cd_config(_adapter * adapter)158 void rtl8821c_pretx_cd_config(_adapter *adapter)
159 {
160 	u8 burst_mode;
161 	u16 pre_cnt = PRECNT_TH | BIT_EN_PRECNT_8821C;
162 
163 	/*Enable AMPDU PRE-TX, Reg0x4BC[6] = 1*/
164 	burst_mode = rtw_read8(adapter, REG_SW_AMPDU_BURST_MODE_CTRL_8821C);
165 	if (!(burst_mode & BIT_PRE_TX_CMD_8821C)) {
166 		burst_mode |= BIT_PRE_TX_CMD_8821C;
167 		rtw_write8(adapter, REG_SW_AMPDU_BURST_MODE_CTRL_8821C, burst_mode);
168 	}
169 
170 	/*MAX AMPDU Number = 63, Reg0x4C8[21:16] = 0x3F*/
171 	rtw_write16(adapter, REG_PROT_MODE_CTRL_8821C + 2, AMPDU_NUMBER);
172 
173 	/*Reg0x4E5[11] = 1, Reg0x4E5[10:0] = 0x1E4 */
174 	rtw_write8(adapter, REG_PRECNT_CTRL_8821C, (u8)(pre_cnt & 0xFF));
175 	rtw_write8(adapter, (REG_PRECNT_CTRL_8821C + 1), (u8)(pre_cnt >> 8));
176 
177 	#if (defined(DBG_PRE_TX_HANG) && (defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)))
178 	rtw_write32(adapter, REG_HIMR1_8821C ,
179 		(rtw_read32(adapter, REG_HIMR1_8821C) | BIT_PRETXERR_HANDLE_IMR));
180 	#endif
181 }
182 #endif /*CONFIG_AMPDU_PRETX_CD*/
183