1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
4 * Copyright(c) 2016 Realtek Corporation.
7 * wlanfae <wlanfae@realtek.com>
8 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
11 * Larry Finger <Larry.Finger@lwfinger.net>
13 *****************************************************************************/
14 #include "halmac_8822b_cfg.h"
15 #include "halmac_func_8822b.h"
16 #include "../halmac_func_88xx.h"
19 * halmac_mount_api_8822b() - attach functions to function pointer
24 * Author : KaiYuan Chang/Ivan Lin
25 * Return : enum halmac_ret_status
27 enum halmac_ret_status
28 halmac_mount_api_8822b(struct halmac_adapter *halmac_adapter)
30 struct halmac_api *halmac_api =
31 (struct halmac_api *)halmac_adapter->halmac_api;
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;
50 halmac_adapter->txff_allocation.rsvd_drv_pg_num =
51 HALMAC_RSVD_DRV_PGNUM_8822B;
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;
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;
85 halmac_api->halmac_pcie_switch = halmac_pcie_switch_8822b_nc;
87 return HALMAC_RET_SUCCESS;
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
98 enum halmac_ret_status
99 halmac_init_trx_cfg_8822b(struct halmac_adapter *halmac_adapter,
100 enum halmac_trx_mode halmac_trx_mode)
104 void *driver_adapter = NULL;
105 struct halmac_api *halmac_api;
106 enum halmac_ret_status status = HALMAC_RET_SUCCESS;
108 if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
109 return HALMAC_RET_ADAPTER_INVALID;
111 if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
112 return HALMAC_RET_API_INVALID;
114 halmac_api_record_id_88xx(halmac_adapter, HALMAC_API_INIT_TRX_CFG);
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;
120 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
121 "halmac_init_trx_cfg ==========>halmac_trx_mode = %d\n",
124 status = halmac_txdma_queue_mapping_8822b(halmac_adapter,
127 if (status != HALMAC_RET_SUCCESS) {
128 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
129 "halmac_txdma_queue_mapping fail!\n");
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));
139 status = halmac_priority_queue_config_8822b(halmac_adapter,
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);
145 if (status != HALMAC_RET_SUCCESS) {
146 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
147 "halmac_txdma_queue_mapping fail!\n");
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);
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);
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);
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);
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);
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);
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);
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;
194 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
195 "halmac_init_trx_cfg <==========\n");
197 return HALMAC_RET_SUCCESS;
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
207 enum halmac_ret_status
208 halmac_init_protocol_cfg_8822b(struct halmac_adapter *halmac_adapter)
211 void *driver_adapter = NULL;
212 struct halmac_api *halmac_api;
214 if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
215 return HALMAC_RET_ADAPTER_INVALID;
217 if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
218 return HALMAC_RET_API_INVALID;
220 halmac_api_record_id_88xx(halmac_adapter, HALMAC_API_INIT_PROTOCOL_CFG);
222 driver_adapter = halmac_adapter->driver_adapter;
223 halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
225 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
226 "[TRACE]%s ==========>\n", __func__);
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);
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);
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);
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);
251 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
252 "[TRACE]%s <==========\n", __func__);
254 return HALMAC_RET_SUCCESS;
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
264 enum halmac_ret_status
265 halmac_init_h2c_8822b(struct halmac_adapter *halmac_adapter)
269 void *driver_adapter = NULL;
270 struct halmac_api *halmac_api;
272 if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
273 return HALMAC_RET_ADAPTER_INVALID;
275 if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
276 return HALMAC_RET_API_INVALID;
278 driver_adapter = halmac_adapter->driver_adapter;
279 halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
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);
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);
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);
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);
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);
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);
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);
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;
327 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
328 "h2c free space : %d\n",
329 halmac_adapter->h2c_buf_free_space);
331 return HALMAC_RET_SUCCESS;