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