• 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_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 #include "rtl8822c.h"		/* FW array */
21 
22 
rtl8822c_rcr_config(PADAPTER p,u32 rcr)23 inline u8 rtl8822c_rcr_config(PADAPTER p, u32 rcr)
24 {
25 	u32 v32;
26 	int err;
27 
28 
29 	v32 = GET_HAL_DATA(p)->ReceiveConfig;
30 	v32 ^= rcr;
31 	v32 &= BIT_APP_PHYSTS_8822C;
32 	if (v32) {
33 		v32 = rcr & BIT_APP_PHYSTS_8822C;
34 		RTW_INFO("%s: runtime %s rx phy status!\n",
35 			 __FUNCTION__, v32 ? "ENABLE" : "DISABLE");
36 		if (v32) {
37 			err = rtw_halmac_config_rx_info(adapter_to_dvobj(p), HALMAC_DRV_INFO_PHY_STATUS);
38 			if (err) {
39 				RTW_INFO("%s: Enable rx phy status FAIL!!", __FUNCTION__);
40 				rcr &= ~BIT_APP_PHYSTS_8822C;
41 			}
42 		} else {
43 			err = rtw_halmac_config_rx_info(adapter_to_dvobj(p), HALMAC_DRV_INFO_NONE);
44 			if (err) {
45 				RTW_INFO("%s: Disable rx phy status FAIL!!", __FUNCTION__);
46 				rcr |= BIT_APP_PHYSTS_8822C;
47 			}
48 		}
49 	}
50 
51 	err = rtw_write32(p, REG_RCR_8822C, rcr);
52 	if (_FAIL == err)
53 		return _FALSE;
54 
55 	GET_HAL_DATA(p)->ReceiveConfig = rcr;
56 	return _TRUE;
57 }
58 
rtl8822c_rx_ba_ssn_appended(PADAPTER p)59 inline u8 rtl8822c_rx_ba_ssn_appended(PADAPTER p)
60 {
61 	return rtw_hal_rcr_check(p, BIT_APP_BASSN_8822C);
62 }
63 
rtl8822c_rx_fcs_append_switch(PADAPTER p,u8 enable)64 inline u8 rtl8822c_rx_fcs_append_switch(PADAPTER p, u8 enable)
65 {
66 	u32 rcr_bit;
67 	u8 ret = _TRUE;
68 
69 	rcr_bit = BIT_APP_FCS_8822C;
70 	if (_TRUE == enable)
71 		ret = rtw_hal_rcr_add(p, rcr_bit);
72 	else
73 		ret = rtw_hal_rcr_clear(p, rcr_bit);
74 
75 	return ret;
76 }
77 
rtl8822c_rx_fcs_appended(PADAPTER p)78 inline u8 rtl8822c_rx_fcs_appended(PADAPTER p)
79 {
80 	return rtw_hal_rcr_check(p, BIT_APP_FCS_8822C);
81 }
82 
rtl8822c_rx_tsf_addr_filter_config(PADAPTER p,u8 config)83 inline u8 rtl8822c_rx_tsf_addr_filter_config(PADAPTER p, u8 config)
84 {
85 	u8 v8;
86 	int err;
87 
88 	v8 = GET_HAL_DATA(p)->rx_tsf_addr_filter_config;
89 
90 	if (v8 != config) {
91 
92 		err = rtw_write8(p, REG_NAN_RX_TSF_FILTER_8822C, config);
93 		if (_FAIL == err)
94 			return _FALSE;
95 	}
96 
97 	GET_HAL_DATA(p)->rx_tsf_addr_filter_config = config;
98 	return _TRUE;
99 }
100 
101 /*
102  * Return:
103  *	_SUCCESS	Download Firmware OK.
104  *	_FAIL		Download Firmware FAIL!
105  */
rtl8822c_fw_dl(PADAPTER adapter,u8 wowlan)106 s32 rtl8822c_fw_dl(PADAPTER adapter, u8 wowlan)
107 {
108 	struct dvobj_priv *d = adapter_to_dvobj(adapter);
109 	HAL_DATA_TYPE *hal = GET_HAL_DATA(adapter);
110 	struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(adapter);
111 	int err;
112 	u8 fw_bin = _TRUE;
113 
114 #ifdef CONFIG_FILE_FWIMG
115 #ifdef CONFIG_WOWLAN
116 	if (wowlan)
117 		rtw_get_phy_file_path(adapter, MAC_FILE_FW_WW_IMG);
118 	else
119 #endif /* CONFIG_WOWLAN */
120 		rtw_get_phy_file_path(adapter, MAC_FILE_FW_NIC);
121 
122 	if (rtw_is_file_readable(rtw_phy_para_file_path) == _TRUE) {
123 		RTW_INFO("%s acquire FW from file:%s\n", __FUNCTION__, rtw_phy_para_file_path);
124 		fw_bin = _TRUE;
125 	} else
126 #endif /* CONFIG_FILE_FWIMG */
127 	{
128 		RTW_INFO("%s fw source from array\n", __FUNCTION__);
129 		fw_bin = _FALSE;
130 	}
131 
132 #ifdef CONFIG_FILE_FWIMG
133 	if (_TRUE == fw_bin) {
134 		err = rtw_halmac_dlfw_from_file(d, rtw_phy_para_file_path);
135 	} else
136 #endif /* CONFIG_FILE_FWIMG */
137 	{
138 		#ifdef CONFIG_WOWLAN
139 		if (_TRUE == wowlan)
140 			err = rtw_halmac_dlfw(d, array_mp_8822c_fw_wowlan, array_length_mp_8822c_fw_wowlan);
141 		else
142 		#endif /* CONFIG_WOWLAN */
143 			err = rtw_halmac_dlfw(d, array_mp_8822c_fw_nic, array_length_mp_8822c_fw_nic);
144 	}
145 
146 	if (!err) {
147 		hal->bFWReady = _TRUE;
148 		hal->fw_ractrl = _TRUE;
149 		RTW_INFO("%s Download Firmware from %s success\n", __FUNCTION__, (fw_bin) ? "file" : "array");
150 		RTW_INFO("%s FW Version:%d SubVersion:%d FW size:%d\n", (wowlan) ? "WOW" : "NIC",
151 			hal->firmware_version, hal->firmware_sub_version, hal->firmware_size);
152 		return _SUCCESS;
153 	} else {
154 		hal->bFWReady = _FALSE;
155 		hal->fw_ractrl = _FALSE;
156 		RTW_ERR("%s Download Firmware from %s failed\n", __FUNCTION__, (fw_bin) ? "file" : "array");
157 		return _FAIL;
158 	}
159 }
160 
rtl8822c_get_rx_drv_info_size(struct _ADAPTER * a)161 u8 rtl8822c_get_rx_drv_info_size(struct _ADAPTER *a)
162 {
163 	struct dvobj_priv *d;
164 	u8 size = 80;	/* HALMAC_RX_DESC_DUMMY_SIZE_MAX_88XX */
165 	int err = 0;
166 
167 
168 	d = adapter_to_dvobj(a);
169 
170 	err = rtw_halmac_get_rx_drv_info_sz(d, &size);
171 	if (err) {
172 		RTW_WARN(FUNC_ADPT_FMT ": Fail to get DRV INFO size!!(err=%d)\n",
173 			 FUNC_ADPT_ARG(a), err);
174 		size = 80;
175 	}
176 
177 	return size;
178 }
179 
rtl8822c_get_tx_desc_size(struct _ADAPTER * a)180 u32 rtl8822c_get_tx_desc_size(struct _ADAPTER *a)
181 {
182 	struct dvobj_priv *d;
183 	u32 size = 48;	/* HALMAC_TX_DESC_SIZE_8822C */
184 	int err = 0;
185 
186 
187 	d = adapter_to_dvobj(a);
188 
189 	err = rtw_halmac_get_tx_desc_size(d, &size);
190 	if (err) {
191 		RTW_WARN(FUNC_ADPT_FMT ": Fail to get TX Descriptor size!!(err=%d)\n",
192 			 FUNC_ADPT_ARG(a), err);
193 		size = 48;
194 	}
195 
196 	return size;
197 }
198 
rtl8822c_get_rx_desc_size(struct _ADAPTER * a)199 u32 rtl8822c_get_rx_desc_size(struct _ADAPTER *a)
200 {
201 	struct dvobj_priv *d;
202 	u32 size = 24;	/* HALMAC_RX_DESC_SIZE_8822C */
203 	int err = 0;
204 
205 
206 	d = adapter_to_dvobj(a);
207 
208 	err = rtw_halmac_get_rx_desc_size(d, &size);
209 	if (err) {
210 		RTW_WARN(FUNC_ADPT_FMT ": Fail to get RX Descriptor size!!(err=%d)\n",
211 			 FUNC_ADPT_ARG(a), err);
212 		size = 24;
213 	}
214 
215 	return size;
216 }
217 
218