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_8822b_cfg.h"
15 #include "halmac_func_8822b.h"
16 #include "../halmac_func_88xx.h"
17 
18 /**
19  * halmac_mount_api_8822b() - attach functions to function pointer
20  * @halmac_adapter
21  *
22  * SD1 internal use
23  *
24  * Author : KaiYuan Chang/Ivan Lin
25  * Return : enum halmac_ret_status
26  */
27 enum halmac_ret_status
halmac_mount_api_8822b(struct halmac_adapter * halmac_adapter)28 halmac_mount_api_8822b(struct halmac_adapter *halmac_adapter)
29 {
30 	struct halmac_api *halmac_api =
31 		(struct halmac_api *)halmac_adapter->halmac_api;
32 
33 	halmac_adapter->chip_id = HALMAC_CHIP_ID_8822B;
34 	halmac_adapter->hw_config_info.efuse_size = HALMAC_EFUSE_SIZE_8822B;
35 	halmac_adapter->hw_config_info.eeprom_size = HALMAC_EEPROM_SIZE_8822B;
36 	halmac_adapter->hw_config_info.bt_efuse_size =
37 		HALMAC_BT_EFUSE_SIZE_8822B;
38 	halmac_adapter->hw_config_info.cam_entry_num =
39 		HALMAC_SECURITY_CAM_ENTRY_NUM_8822B;
40 	halmac_adapter->hw_config_info.txdesc_size = HALMAC_TX_DESC_SIZE_8822B;
41 	halmac_adapter->hw_config_info.rxdesc_size = HALMAC_RX_DESC_SIZE_8822B;
42 	halmac_adapter->hw_config_info.tx_fifo_size = HALMAC_TX_FIFO_SIZE_8822B;
43 	halmac_adapter->hw_config_info.rx_fifo_size = HALMAC_RX_FIFO_SIZE_8822B;
44 	halmac_adapter->hw_config_info.page_size = HALMAC_TX_PAGE_SIZE_8822B;
45 	halmac_adapter->hw_config_info.tx_align_size =
46 		HALMAC_TX_ALIGN_SIZE_8822B;
47 	halmac_adapter->hw_config_info.page_size_2_power =
48 		HALMAC_TX_PAGE_SIZE_2_POWER_8822B;
49 
50 	halmac_adapter->txff_allocation.rsvd_drv_pg_num =
51 		HALMAC_RSVD_DRV_PGNUM_8822B;
52 
53 	halmac_api->halmac_init_trx_cfg = halmac_init_trx_cfg_8822b;
54 	halmac_api->halmac_init_protocol_cfg = halmac_init_protocol_cfg_8822b;
55 	halmac_api->halmac_init_h2c = halmac_init_h2c_8822b;
56 
57 	if (halmac_adapter->halmac_interface == HALMAC_INTERFACE_SDIO) {
58 		halmac_api->halmac_tx_allowed_sdio =
59 			halmac_tx_allowed_sdio_88xx;
60 		halmac_api->halmac_cfg_tx_agg_align =
61 			halmac_cfg_tx_agg_align_sdio_not_support_88xx;
62 		halmac_api->halmac_mac_power_switch =
63 			halmac_mac_power_switch_8822b_sdio;
64 		halmac_api->halmac_phy_cfg = halmac_phy_cfg_8822b_sdio;
65 		halmac_api->halmac_interface_integration_tuning =
66 			halmac_interface_integration_tuning_8822b_sdio;
67 	} else if (halmac_adapter->halmac_interface == HALMAC_INTERFACE_USB) {
68 		halmac_api->halmac_mac_power_switch =
69 			halmac_mac_power_switch_8822b_usb;
70 		halmac_api->halmac_cfg_tx_agg_align =
71 			halmac_cfg_tx_agg_align_usb_not_support_88xx;
72 		halmac_api->halmac_phy_cfg = halmac_phy_cfg_8822b_usb;
73 		halmac_api->halmac_interface_integration_tuning =
74 			halmac_interface_integration_tuning_8822b_usb;
75 	} else if (halmac_adapter->halmac_interface == HALMAC_INTERFACE_PCIE) {
76 		halmac_api->halmac_mac_power_switch =
77 			halmac_mac_power_switch_8822b_pcie;
78 		halmac_api->halmac_cfg_tx_agg_align =
79 			halmac_cfg_tx_agg_align_pcie_not_support_88xx;
80 		halmac_api->halmac_pcie_switch = halmac_pcie_switch_8822b;
81 		halmac_api->halmac_phy_cfg = halmac_phy_cfg_8822b_pcie;
82 		halmac_api->halmac_interface_integration_tuning =
83 			halmac_interface_integration_tuning_8822b_pcie;
84 	} else {
85 		halmac_api->halmac_pcie_switch = halmac_pcie_switch_8822b_nc;
86 	}
87 	return HALMAC_RET_SUCCESS;
88 }
89 
90 /**
91  * halmac_init_trx_cfg_8822b() - config trx dma register
92  * @halmac_adapter : the adapter of halmac
93  * @halmac_trx_mode : trx mode selection
94  * Author : KaiYuan Chang/Ivan Lin
95  * Return : enum halmac_ret_status
96  * More details of status code can be found in prototype document
97  */
98 enum halmac_ret_status
halmac_init_trx_cfg_8822b(struct halmac_adapter * halmac_adapter,enum halmac_trx_mode halmac_trx_mode)99 halmac_init_trx_cfg_8822b(struct halmac_adapter *halmac_adapter,
100 			  enum halmac_trx_mode halmac_trx_mode)
101 {
102 	u8 value8;
103 	u32 value32;
104 	void *driver_adapter = NULL;
105 	struct halmac_api *halmac_api;
106 	enum halmac_ret_status status = HALMAC_RET_SUCCESS;
107 
108 	if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
109 		return HALMAC_RET_ADAPTER_INVALID;
110 
111 	if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
112 		return HALMAC_RET_API_INVALID;
113 
114 	halmac_api_record_id_88xx(halmac_adapter, HALMAC_API_INIT_TRX_CFG);
115 
116 	driver_adapter = halmac_adapter->driver_adapter;
117 	halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
118 	halmac_adapter->trx_mode = halmac_trx_mode;
119 
120 	HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
121 			"halmac_init_trx_cfg ==========>halmac_trx_mode = %d\n",
122 			halmac_trx_mode);
123 
124 	status = halmac_txdma_queue_mapping_8822b(halmac_adapter,
125 						  halmac_trx_mode);
126 
127 	if (status != HALMAC_RET_SUCCESS) {
128 		HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
129 				"halmac_txdma_queue_mapping fail!\n");
130 		return status;
131 	}
132 
133 	value8 = 0;
134 	HALMAC_REG_WRITE_8(halmac_adapter, REG_CR, value8);
135 	value8 = HALMAC_CR_TRX_ENABLE_8822B;
136 	HALMAC_REG_WRITE_8(halmac_adapter, REG_CR, value8);
137 	HALMAC_REG_WRITE_32(halmac_adapter, REG_H2CQ_CSR, BIT(31));
138 
139 	status = halmac_priority_queue_config_8822b(halmac_adapter,
140 						    halmac_trx_mode);
141 	if (halmac_adapter->txff_allocation.rx_fifo_expanding_mode !=
142 	    HALMAC_RX_FIFO_EXPANDING_MODE_DISABLE)
143 		HALMAC_REG_WRITE_8(halmac_adapter, REG_RX_DRVINFO_SZ, 0xF);
144 
145 	if (status != HALMAC_RET_SUCCESS) {
146 		HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
147 				"halmac_txdma_queue_mapping fail!\n");
148 		return status;
149 	}
150 
151 	/* Config H2C packet buffer */
152 	value32 = HALMAC_REG_READ_32(halmac_adapter, REG_H2C_HEAD);
153 	value32 = (value32 & 0xFFFC0000) |
154 		  (halmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy
155 		   << HALMAC_TX_PAGE_SIZE_2_POWER_8822B);
156 	HALMAC_REG_WRITE_32(halmac_adapter, REG_H2C_HEAD, value32);
157 
158 	value32 = HALMAC_REG_READ_32(halmac_adapter, REG_H2C_READ_ADDR);
159 	value32 = (value32 & 0xFFFC0000) |
160 		  (halmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy
161 		   << HALMAC_TX_PAGE_SIZE_2_POWER_8822B);
162 	HALMAC_REG_WRITE_32(halmac_adapter, REG_H2C_READ_ADDR, value32);
163 
164 	value32 = HALMAC_REG_READ_32(halmac_adapter, REG_H2C_TAIL);
165 	value32 = (value32 & 0xFFFC0000) |
166 		  ((halmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy
167 		    << HALMAC_TX_PAGE_SIZE_2_POWER_8822B) +
168 		   (HALMAC_RSVD_H2C_QUEUE_PGNUM_8822B
169 		    << HALMAC_TX_PAGE_SIZE_2_POWER_8822B));
170 	HALMAC_REG_WRITE_32(halmac_adapter, REG_H2C_TAIL, value32);
171 
172 	value8 = HALMAC_REG_READ_8(halmac_adapter, REG_H2C_INFO);
173 	value8 = (u8)((value8 & 0xFC) | 0x01);
174 	HALMAC_REG_WRITE_8(halmac_adapter, REG_H2C_INFO, value8);
175 
176 	value8 = HALMAC_REG_READ_8(halmac_adapter, REG_H2C_INFO);
177 	value8 = (u8)((value8 & 0xFB) | 0x04);
178 	HALMAC_REG_WRITE_8(halmac_adapter, REG_H2C_INFO, value8);
179 
180 	value8 = HALMAC_REG_READ_8(halmac_adapter, REG_TXDMA_OFFSET_CHK + 1);
181 	value8 = (u8)((value8 & 0x7f) | 0x80);
182 	HALMAC_REG_WRITE_8(halmac_adapter, REG_TXDMA_OFFSET_CHK + 1, value8);
183 
184 	halmac_adapter->h2c_buff_size = HALMAC_RSVD_H2C_QUEUE_PGNUM_8822B
185 					<< HALMAC_TX_PAGE_SIZE_2_POWER_8822B;
186 	halmac_get_h2c_buff_free_space_88xx(halmac_adapter);
187 
188 	if (halmac_adapter->h2c_buff_size !=
189 	    halmac_adapter->h2c_buf_free_space) {
190 		pr_err("get h2c free space error!\n");
191 		return HALMAC_RET_GET_H2C_SPACE_ERR;
192 	}
193 
194 	HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
195 			"halmac_init_trx_cfg <==========\n");
196 
197 	return HALMAC_RET_SUCCESS;
198 }
199 
200 /**
201  * halmac_init_protocol_cfg_8822b() - config protocol register
202  * @halmac_adapter : the adapter of halmac
203  * Author : KaiYuan Chang/Ivan Lin
204  * Return : enum halmac_ret_status
205  * More details of status code can be found in prototype document
206  */
207 enum halmac_ret_status
halmac_init_protocol_cfg_8822b(struct halmac_adapter * halmac_adapter)208 halmac_init_protocol_cfg_8822b(struct halmac_adapter *halmac_adapter)
209 {
210 	u32 value32;
211 	void *driver_adapter = NULL;
212 	struct halmac_api *halmac_api;
213 
214 	if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
215 		return HALMAC_RET_ADAPTER_INVALID;
216 
217 	if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
218 		return HALMAC_RET_API_INVALID;
219 
220 	halmac_api_record_id_88xx(halmac_adapter, HALMAC_API_INIT_PROTOCOL_CFG);
221 
222 	driver_adapter = halmac_adapter->driver_adapter;
223 	halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
224 
225 	HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
226 			"[TRACE]%s ==========>\n", __func__);
227 
228 	HALMAC_REG_WRITE_8(halmac_adapter, REG_AMPDU_MAX_TIME_V1,
229 			   HALMAC_AMPDU_MAX_TIME_8822B);
230 	HALMAC_REG_WRITE_8(halmac_adapter, REG_TX_HANG_CTRL, BIT_EN_EOF_V1);
231 
232 	value32 = HALMAC_PROT_RTS_LEN_TH_8822B |
233 		  (HALMAC_PROT_RTS_TX_TIME_TH_8822B << 8) |
234 		  (HALMAC_PROT_MAX_AGG_PKT_LIMIT_8822B << 16) |
235 		  (HALMAC_PROT_RTS_MAX_AGG_PKT_LIMIT_8822B << 24);
236 	HALMAC_REG_WRITE_32(halmac_adapter, REG_PROT_MODE_CTRL, value32);
237 
238 	HALMAC_REG_WRITE_16(halmac_adapter, REG_BAR_MODE_CTRL + 2,
239 			    HALMAC_BAR_RETRY_LIMIT_8822B |
240 				    HALMAC_RA_TRY_RATE_AGG_LIMIT_8822B << 8);
241 
242 	HALMAC_REG_WRITE_8(halmac_adapter, REG_FAST_EDCA_VOVI_SETTING,
243 			   HALMAC_FAST_EDCA_VO_TH_8822B);
244 	HALMAC_REG_WRITE_8(halmac_adapter, REG_FAST_EDCA_VOVI_SETTING + 2,
245 			   HALMAC_FAST_EDCA_VI_TH_8822B);
246 	HALMAC_REG_WRITE_8(halmac_adapter, REG_FAST_EDCA_BEBK_SETTING,
247 			   HALMAC_FAST_EDCA_BE_TH_8822B);
248 	HALMAC_REG_WRITE_8(halmac_adapter, REG_FAST_EDCA_BEBK_SETTING + 2,
249 			   HALMAC_FAST_EDCA_BK_TH_8822B);
250 
251 	HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
252 			"[TRACE]%s <==========\n", __func__);
253 
254 	return HALMAC_RET_SUCCESS;
255 }
256 
257 /**
258  * halmac_init_h2c_8822b() - config h2c packet buffer
259  * @halmac_adapter : the adapter of halmac
260  * Author : KaiYuan Chang/Ivan Lin
261  * Return : enum halmac_ret_status
262  * More details of status code can be found in prototype document
263  */
264 enum halmac_ret_status
halmac_init_h2c_8822b(struct halmac_adapter * halmac_adapter)265 halmac_init_h2c_8822b(struct halmac_adapter *halmac_adapter)
266 {
267 	u8 value8;
268 	u32 value32;
269 	void *driver_adapter = NULL;
270 	struct halmac_api *halmac_api;
271 
272 	if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
273 		return HALMAC_RET_ADAPTER_INVALID;
274 
275 	if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
276 		return HALMAC_RET_API_INVALID;
277 
278 	driver_adapter = halmac_adapter->driver_adapter;
279 	halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
280 
281 	value8 = 0;
282 	HALMAC_REG_WRITE_8(halmac_adapter, REG_CR, value8);
283 	value8 = HALMAC_CR_TRX_ENABLE_8822B;
284 	HALMAC_REG_WRITE_8(halmac_adapter, REG_CR, value8);
285 
286 	value32 = HALMAC_REG_READ_32(halmac_adapter, REG_H2C_HEAD);
287 	value32 = (value32 & 0xFFFC0000) |
288 		  (halmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy
289 		   << HALMAC_TX_PAGE_SIZE_2_POWER_8822B);
290 	HALMAC_REG_WRITE_32(halmac_adapter, REG_H2C_HEAD, value32);
291 
292 	value32 = HALMAC_REG_READ_32(halmac_adapter, REG_H2C_READ_ADDR);
293 	value32 = (value32 & 0xFFFC0000) |
294 		  (halmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy
295 		   << HALMAC_TX_PAGE_SIZE_2_POWER_8822B);
296 	HALMAC_REG_WRITE_32(halmac_adapter, REG_H2C_READ_ADDR, value32);
297 
298 	value32 = HALMAC_REG_READ_32(halmac_adapter, REG_H2C_TAIL);
299 	value32 = (value32 & 0xFFFC0000) |
300 		  ((halmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy
301 		    << HALMAC_TX_PAGE_SIZE_2_POWER_8822B) +
302 		   (HALMAC_RSVD_H2C_QUEUE_PGNUM_8822B
303 		    << HALMAC_TX_PAGE_SIZE_2_POWER_8822B));
304 	HALMAC_REG_WRITE_32(halmac_adapter, REG_H2C_TAIL, value32);
305 	value8 = HALMAC_REG_READ_8(halmac_adapter, REG_H2C_INFO);
306 	value8 = (u8)((value8 & 0xFC) | 0x01);
307 	HALMAC_REG_WRITE_8(halmac_adapter, REG_H2C_INFO, value8);
308 
309 	value8 = HALMAC_REG_READ_8(halmac_adapter, REG_H2C_INFO);
310 	value8 = (u8)((value8 & 0xFB) | 0x04);
311 	HALMAC_REG_WRITE_8(halmac_adapter, REG_H2C_INFO, value8);
312 
313 	value8 = HALMAC_REG_READ_8(halmac_adapter, REG_TXDMA_OFFSET_CHK + 1);
314 	value8 = (u8)((value8 & 0x7f) | 0x80);
315 	HALMAC_REG_WRITE_8(halmac_adapter, REG_TXDMA_OFFSET_CHK + 1, value8);
316 
317 	halmac_adapter->h2c_buff_size = HALMAC_RSVD_H2C_QUEUE_PGNUM_8822B
318 					<< HALMAC_TX_PAGE_SIZE_2_POWER_8822B;
319 	halmac_get_h2c_buff_free_space_88xx(halmac_adapter);
320 
321 	if (halmac_adapter->h2c_buff_size !=
322 	    halmac_adapter->h2c_buf_free_space) {
323 		pr_err("get h2c free space error!\n");
324 		return HALMAC_RET_GET_H2C_SPACE_ERR;
325 	}
326 
327 	HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
328 			"h2c free space : %d\n",
329 			halmac_adapter->h2c_buf_free_space);
330 
331 	return HALMAC_RET_SUCCESS;
332 }
333