1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
3  *
4  * Copyright(c) 2016  Realtek Corporation.
5  *
6  * Contact Information:
7  * wlanfae <wlanfae@realtek.com>
8  * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
9  * Hsinchu 300, Taiwan.
10  *
11  * Larry Finger <Larry.Finger@lwfinger.net>
12  *
13  *****************************************************************************/
14 #include "halmac_88xx_cfg.h"
15 
16 /**
17  * halmac_init_pcie_cfg_88xx() -  init PCIe
18  * @halmac_adapter : the adapter of halmac
19  * Author : KaiYuan Chang
20  * Return : enum halmac_ret_status
21  * More details of status code can be found in prototype document
22  */
23 enum halmac_ret_status
halmac_init_pcie_cfg_88xx(struct halmac_adapter * halmac_adapter)24 halmac_init_pcie_cfg_88xx(struct halmac_adapter *halmac_adapter)
25 {
26 	void *driver_adapter = NULL;
27 
28 	if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
29 		return HALMAC_RET_ADAPTER_INVALID;
30 
31 	if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
32 		return HALMAC_RET_API_INVALID;
33 
34 	halmac_api_record_id_88xx(halmac_adapter, HALMAC_API_INIT_PCIE_CFG);
35 
36 	driver_adapter = halmac_adapter->driver_adapter;
37 
38 	HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
39 			"%s ==========>\n", __func__);
40 
41 	HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
42 			"%s <==========\n", __func__);
43 
44 	return HALMAC_RET_SUCCESS;
45 }
46 
47 /**
48  * halmac_deinit_pcie_cfg_88xx() - deinit PCIE
49  * @halmac_adapter : the adapter of halmac
50  * Author : KaiYuan Chang
51  * Return : enum halmac_ret_status
52  * More details of status code can be found in prototype document
53  */
54 enum halmac_ret_status
halmac_deinit_pcie_cfg_88xx(struct halmac_adapter * halmac_adapter)55 halmac_deinit_pcie_cfg_88xx(struct halmac_adapter *halmac_adapter)
56 {
57 	void *driver_adapter = NULL;
58 
59 	if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
60 		return HALMAC_RET_ADAPTER_INVALID;
61 
62 	if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
63 		return HALMAC_RET_API_INVALID;
64 
65 	halmac_api_record_id_88xx(halmac_adapter, HALMAC_API_DEINIT_PCIE_CFG);
66 
67 	driver_adapter = halmac_adapter->driver_adapter;
68 
69 	HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
70 			"%s ==========>\n", __func__);
71 
72 	HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
73 			"%s <==========\n", __func__);
74 
75 	return HALMAC_RET_SUCCESS;
76 }
77 
78 /**
79  * halmac_cfg_rx_aggregation_88xx_pcie() - config rx aggregation
80  * @halmac_adapter : the adapter of halmac
81  * @halmac_rx_agg_mode
82  * Author : KaiYuan Chang/Ivan Lin
83  * Return : enum halmac_ret_status
84  * More details of status code can be found in prototype document
85  */
86 enum halmac_ret_status
halmac_cfg_rx_aggregation_88xx_pcie(struct halmac_adapter * halmac_adapter,struct halmac_rxagg_cfg * phalmac_rxagg_cfg)87 halmac_cfg_rx_aggregation_88xx_pcie(struct halmac_adapter *halmac_adapter,
88 				    struct halmac_rxagg_cfg *phalmac_rxagg_cfg)
89 {
90 	void *driver_adapter = NULL;
91 
92 	if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
93 		return HALMAC_RET_ADAPTER_INVALID;
94 
95 	if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
96 		return HALMAC_RET_API_INVALID;
97 
98 	halmac_api_record_id_88xx(halmac_adapter,
99 				  HALMAC_API_CFG_RX_AGGREGATION);
100 
101 	driver_adapter = halmac_adapter->driver_adapter;
102 
103 	HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
104 			"%s ==========>\n", __func__);
105 
106 	HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
107 			"%s <==========\n", __func__);
108 
109 	return HALMAC_RET_SUCCESS;
110 }
111 
112 /**
113  * halmac_reg_read_8_pcie_88xx() - read 1byte register
114  * @halmac_adapter : the adapter of halmac
115  * @halmac_offset : register offset
116  * Author : KaiYuan Chang/Ivan Lin
117  * Return : enum halmac_ret_status
118  * More details of status code can be found in prototype document
119  */
halmac_reg_read_8_pcie_88xx(struct halmac_adapter * halmac_adapter,u32 halmac_offset)120 u8 halmac_reg_read_8_pcie_88xx(struct halmac_adapter *halmac_adapter,
121 			       u32 halmac_offset)
122 {
123 	void *driver_adapter = NULL;
124 	struct halmac_api *halmac_api;
125 
126 	if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
127 		return HALMAC_RET_ADAPTER_INVALID;
128 
129 	if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
130 		return HALMAC_RET_API_INVALID;
131 
132 	driver_adapter = halmac_adapter->driver_adapter;
133 	halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
134 
135 	return PLATFORM_REG_READ_8(driver_adapter, halmac_offset);
136 }
137 
138 /**
139  * halmac_reg_write_8_pcie_88xx() - write 1byte register
140  * @halmac_adapter : the adapter of halmac
141  * @halmac_offset : register offset
142  * @halmac_data : register value
143  * Author : KaiYuan Chang/Ivan Lin
144  * Return : enum halmac_ret_status
145  * More details of status code can be found in prototype document
146  */
147 enum halmac_ret_status
halmac_reg_write_8_pcie_88xx(struct halmac_adapter * halmac_adapter,u32 halmac_offset,u8 halmac_data)148 halmac_reg_write_8_pcie_88xx(struct halmac_adapter *halmac_adapter,
149 			     u32 halmac_offset, u8 halmac_data)
150 {
151 	void *driver_adapter = NULL;
152 	struct halmac_api *halmac_api;
153 
154 	if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
155 		return HALMAC_RET_ADAPTER_INVALID;
156 
157 	if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
158 		return HALMAC_RET_API_INVALID;
159 
160 	driver_adapter = halmac_adapter->driver_adapter;
161 	halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
162 
163 	PLATFORM_REG_WRITE_8(driver_adapter, halmac_offset, halmac_data);
164 
165 	return HALMAC_RET_SUCCESS;
166 }
167 
168 /**
169  * halmac_reg_read_16_pcie_88xx() - read 2byte register
170  * @halmac_adapter : the adapter of halmac
171  * @halmac_offset : register offset
172  * Author : KaiYuan Chang/Ivan Lin
173  * Return : enum halmac_ret_status
174  * More details of status code can be found in prototype document
175  */
halmac_reg_read_16_pcie_88xx(struct halmac_adapter * halmac_adapter,u32 halmac_offset)176 u16 halmac_reg_read_16_pcie_88xx(struct halmac_adapter *halmac_adapter,
177 				 u32 halmac_offset)
178 {
179 	void *driver_adapter = NULL;
180 	struct halmac_api *halmac_api;
181 
182 	if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
183 		return HALMAC_RET_ADAPTER_INVALID;
184 
185 	if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
186 		return HALMAC_RET_API_INVALID;
187 
188 	driver_adapter = halmac_adapter->driver_adapter;
189 	halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
190 
191 	return PLATFORM_REG_READ_16(driver_adapter, halmac_offset);
192 }
193 
194 /**
195  * halmac_reg_write_16_pcie_88xx() - write 2byte register
196  * @halmac_adapter : the adapter of halmac
197  * @halmac_offset : register offset
198  * @halmac_data : register value
199  * Author : KaiYuan Chang/Ivan Lin
200  * Return : enum halmac_ret_status
201  * More details of status code can be found in prototype document
202  */
203 enum halmac_ret_status
halmac_reg_write_16_pcie_88xx(struct halmac_adapter * halmac_adapter,u32 halmac_offset,u16 halmac_data)204 halmac_reg_write_16_pcie_88xx(struct halmac_adapter *halmac_adapter,
205 			      u32 halmac_offset, u16 halmac_data)
206 {
207 	void *driver_adapter = NULL;
208 	struct halmac_api *halmac_api;
209 
210 	if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
211 		return HALMAC_RET_ADAPTER_INVALID;
212 
213 	if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
214 		return HALMAC_RET_API_INVALID;
215 
216 	driver_adapter = halmac_adapter->driver_adapter;
217 	halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
218 
219 	PLATFORM_REG_WRITE_16(driver_adapter, halmac_offset, halmac_data);
220 
221 	return HALMAC_RET_SUCCESS;
222 }
223 
224 /**
225  * halmac_reg_read_32_pcie_88xx() - read 4byte register
226  * @halmac_adapter : the adapter of halmac
227  * @halmac_offset : register offset
228  * Author : KaiYuan Chang/Ivan Lin
229  * Return : enum halmac_ret_status
230  * More details of status code can be found in prototype document
231  */
halmac_reg_read_32_pcie_88xx(struct halmac_adapter * halmac_adapter,u32 halmac_offset)232 u32 halmac_reg_read_32_pcie_88xx(struct halmac_adapter *halmac_adapter,
233 				 u32 halmac_offset)
234 {
235 	void *driver_adapter = NULL;
236 	struct halmac_api *halmac_api;
237 
238 	if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
239 		return HALMAC_RET_ADAPTER_INVALID;
240 
241 	if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
242 		return HALMAC_RET_API_INVALID;
243 
244 	driver_adapter = halmac_adapter->driver_adapter;
245 	halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
246 
247 	return PLATFORM_REG_READ_32(driver_adapter, halmac_offset);
248 }
249 
250 /**
251  * halmac_reg_write_32_pcie_88xx() - write 4byte register
252  * @halmac_adapter : the adapter of halmac
253  * @halmac_offset : register offset
254  * @halmac_data : register value
255  * Author : KaiYuan Chang/Ivan Lin
256  * Return : enum halmac_ret_status
257  * More details of status code can be found in prototype document
258  */
259 enum halmac_ret_status
halmac_reg_write_32_pcie_88xx(struct halmac_adapter * halmac_adapter,u32 halmac_offset,u32 halmac_data)260 halmac_reg_write_32_pcie_88xx(struct halmac_adapter *halmac_adapter,
261 			      u32 halmac_offset, u32 halmac_data)
262 {
263 	void *driver_adapter = NULL;
264 	struct halmac_api *halmac_api;
265 
266 	if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
267 		return HALMAC_RET_ADAPTER_INVALID;
268 
269 	if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
270 		return HALMAC_RET_API_INVALID;
271 
272 	driver_adapter = halmac_adapter->driver_adapter;
273 	halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
274 
275 	PLATFORM_REG_WRITE_32(driver_adapter, halmac_offset, halmac_data);
276 
277 	return HALMAC_RET_SUCCESS;
278 }
279 
280 /**
281  * halmac_cfg_tx_agg_align_pcie_88xx() -config sdio bus tx agg alignment
282  * @halmac_adapter : the adapter of halmac
283  * @enable : function enable(1)/disable(0)
284  * @align_size : sdio bus tx agg alignment size (2^n, n = 3~11)
285  * Author : Soar Tu
286  * Return : enum halmac_ret_status
287  * More details of status code can be found in prototype document
288  */
halmac_cfg_tx_agg_align_pcie_not_support_88xx(struct halmac_adapter * halmac_adapter,u8 enable,u16 align_size)289 enum halmac_ret_status halmac_cfg_tx_agg_align_pcie_not_support_88xx(
290 	struct halmac_adapter *halmac_adapter, u8 enable, u16 align_size)
291 {
292 	struct halmac_api *halmac_api;
293 	void *driver_adapter = NULL;
294 
295 	if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
296 		return HALMAC_RET_ADAPTER_INVALID;
297 
298 	if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
299 		return HALMAC_RET_API_INVALID;
300 
301 	halmac_api_record_id_88xx(halmac_adapter, HALMAC_API_CFG_TX_AGG_ALIGN);
302 
303 	driver_adapter = halmac_adapter->driver_adapter;
304 	halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
305 
306 	HALMAC_RT_TRACE(
307 		driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
308 		"%s ==========>\n", __func__);
309 
310 	HALMAC_RT_TRACE(
311 		driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
312 		"%s not support\n", __func__);
313 	HALMAC_RT_TRACE(
314 		driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
315 		"%s <==========\n", __func__);
316 
317 	return HALMAC_RET_SUCCESS;
318 }
319