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