1 /******************************************************************************
3 * Copyright(c) 2016 Realtek Corporation.
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.
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
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
22 * Larry Finger <Larry.Finger@lwfinger.net>
24 *****************************************************************************/
25 #include "halmac_8822b_cfg.h"
26 #include "halmac_func_8822b.h"
27 #include "../halmac_func_88xx.h"
30 * halmac_mount_api_8822b() - attach functions to function pointer
35 * Author : KaiYuan Chang/Ivan Lin
36 * Return : enum halmac_ret_status
38 enum halmac_ret_status
39 halmac_mount_api_8822b(struct halmac_adapter *halmac_adapter)
41 struct halmac_api *halmac_api =
42 (struct halmac_api *)halmac_adapter->halmac_api;
44 halmac_adapter->chip_id = HALMAC_CHIP_ID_8822B;
45 halmac_adapter->hw_config_info.efuse_size = HALMAC_EFUSE_SIZE_8822B;
46 halmac_adapter->hw_config_info.eeprom_size = HALMAC_EEPROM_SIZE_8822B;
47 halmac_adapter->hw_config_info.bt_efuse_size =
48 HALMAC_BT_EFUSE_SIZE_8822B;
49 halmac_adapter->hw_config_info.cam_entry_num =
50 HALMAC_SECURITY_CAM_ENTRY_NUM_8822B;
51 halmac_adapter->hw_config_info.txdesc_size = HALMAC_TX_DESC_SIZE_8822B;
52 halmac_adapter->hw_config_info.rxdesc_size = HALMAC_RX_DESC_SIZE_8822B;
53 halmac_adapter->hw_config_info.tx_fifo_size = HALMAC_TX_FIFO_SIZE_8822B;
54 halmac_adapter->hw_config_info.rx_fifo_size = HALMAC_RX_FIFO_SIZE_8822B;
55 halmac_adapter->hw_config_info.page_size = HALMAC_TX_PAGE_SIZE_8822B;
56 halmac_adapter->hw_config_info.tx_align_size =
57 HALMAC_TX_ALIGN_SIZE_8822B;
58 halmac_adapter->hw_config_info.page_size_2_power =
59 HALMAC_TX_PAGE_SIZE_2_POWER_8822B;
61 halmac_adapter->txff_allocation.rsvd_drv_pg_num =
62 HALMAC_RSVD_DRV_PGNUM_8822B;
64 halmac_api->halmac_init_trx_cfg = halmac_init_trx_cfg_8822b;
65 halmac_api->halmac_init_protocol_cfg = halmac_init_protocol_cfg_8822b;
66 halmac_api->halmac_init_h2c = halmac_init_h2c_8822b;
68 if (halmac_adapter->halmac_interface == HALMAC_INTERFACE_SDIO) {
69 halmac_api->halmac_tx_allowed_sdio =
70 halmac_tx_allowed_sdio_88xx;
71 halmac_api->halmac_cfg_tx_agg_align =
72 halmac_cfg_tx_agg_align_sdio_not_support_88xx;
73 halmac_api->halmac_mac_power_switch =
74 halmac_mac_power_switch_8822b_sdio;
75 halmac_api->halmac_phy_cfg = halmac_phy_cfg_8822b_sdio;
76 halmac_api->halmac_interface_integration_tuning =
77 halmac_interface_integration_tuning_8822b_sdio;
78 } else if (halmac_adapter->halmac_interface == HALMAC_INTERFACE_USB) {
79 halmac_api->halmac_mac_power_switch =
80 halmac_mac_power_switch_8822b_usb;
81 halmac_api->halmac_cfg_tx_agg_align =
82 halmac_cfg_tx_agg_align_usb_not_support_88xx;
83 halmac_api->halmac_phy_cfg = halmac_phy_cfg_8822b_usb;
84 halmac_api->halmac_interface_integration_tuning =
85 halmac_interface_integration_tuning_8822b_usb;
86 } else if (halmac_adapter->halmac_interface == HALMAC_INTERFACE_PCIE) {
87 halmac_api->halmac_mac_power_switch =
88 halmac_mac_power_switch_8822b_pcie;
89 halmac_api->halmac_cfg_tx_agg_align =
90 halmac_cfg_tx_agg_align_pcie_not_support_88xx;
91 halmac_api->halmac_pcie_switch = halmac_pcie_switch_8822b;
92 halmac_api->halmac_phy_cfg = halmac_phy_cfg_8822b_pcie;
93 halmac_api->halmac_interface_integration_tuning =
94 halmac_interface_integration_tuning_8822b_pcie;
96 halmac_api->halmac_pcie_switch = halmac_pcie_switch_8822b_nc;
98 return HALMAC_RET_SUCCESS;
102 * halmac_init_trx_cfg_8822b() - config trx dma register
103 * @halmac_adapter : the adapter of halmac
104 * @halmac_trx_mode : trx mode selection
105 * Author : KaiYuan Chang/Ivan Lin
106 * Return : enum halmac_ret_status
107 * More details of status code can be found in prototype document
109 enum halmac_ret_status
110 halmac_init_trx_cfg_8822b(struct halmac_adapter *halmac_adapter,
111 enum halmac_trx_mode halmac_trx_mode)
115 void *driver_adapter = NULL;
116 struct halmac_api *halmac_api;
117 enum halmac_ret_status status = HALMAC_RET_SUCCESS;
119 if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
120 return HALMAC_RET_ADAPTER_INVALID;
122 if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
123 return HALMAC_RET_API_INVALID;
125 halmac_api_record_id_88xx(halmac_adapter, HALMAC_API_INIT_TRX_CFG);
127 driver_adapter = halmac_adapter->driver_adapter;
128 halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
129 halmac_adapter->trx_mode = halmac_trx_mode;
131 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
132 "halmac_init_trx_cfg ==========>halmac_trx_mode = %d\n",
135 status = halmac_txdma_queue_mapping_8822b(halmac_adapter,
138 if (status != HALMAC_RET_SUCCESS) {
139 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
140 "halmac_txdma_queue_mapping fail!\n");
145 HALMAC_REG_WRITE_8(halmac_adapter, REG_CR, value8);
146 value8 = HALMAC_CR_TRX_ENABLE_8822B;
147 HALMAC_REG_WRITE_8(halmac_adapter, REG_CR, value8);
148 HALMAC_REG_WRITE_32(halmac_adapter, REG_H2CQ_CSR, BIT(31));
150 status = halmac_priority_queue_config_8822b(halmac_adapter,
152 if (halmac_adapter->txff_allocation.rx_fifo_expanding_mode !=
153 HALMAC_RX_FIFO_EXPANDING_MODE_DISABLE)
154 HALMAC_REG_WRITE_8(halmac_adapter, REG_RX_DRVINFO_SZ, 0xF);
156 if (status != HALMAC_RET_SUCCESS) {
157 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
158 "halmac_txdma_queue_mapping fail!\n");
162 /* Config H2C packet buffer */
163 value32 = HALMAC_REG_READ_32(halmac_adapter, REG_H2C_HEAD);
164 value32 = (value32 & 0xFFFC0000) |
165 (halmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy
166 << HALMAC_TX_PAGE_SIZE_2_POWER_8822B);
167 HALMAC_REG_WRITE_32(halmac_adapter, REG_H2C_HEAD, value32);
169 value32 = HALMAC_REG_READ_32(halmac_adapter, REG_H2C_READ_ADDR);
170 value32 = (value32 & 0xFFFC0000) |
171 (halmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy
172 << HALMAC_TX_PAGE_SIZE_2_POWER_8822B);
173 HALMAC_REG_WRITE_32(halmac_adapter, REG_H2C_READ_ADDR, value32);
175 value32 = HALMAC_REG_READ_32(halmac_adapter, REG_H2C_TAIL);
176 value32 = (value32 & 0xFFFC0000) |
177 ((halmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy
178 << HALMAC_TX_PAGE_SIZE_2_POWER_8822B) +
179 (HALMAC_RSVD_H2C_QUEUE_PGNUM_8822B
180 << HALMAC_TX_PAGE_SIZE_2_POWER_8822B));
181 HALMAC_REG_WRITE_32(halmac_adapter, REG_H2C_TAIL, value32);
183 value8 = HALMAC_REG_READ_8(halmac_adapter, REG_H2C_INFO);
184 value8 = (u8)((value8 & 0xFC) | 0x01);
185 HALMAC_REG_WRITE_8(halmac_adapter, REG_H2C_INFO, value8);
187 value8 = HALMAC_REG_READ_8(halmac_adapter, REG_H2C_INFO);
188 value8 = (u8)((value8 & 0xFB) | 0x04);
189 HALMAC_REG_WRITE_8(halmac_adapter, REG_H2C_INFO, value8);
191 value8 = HALMAC_REG_READ_8(halmac_adapter, REG_TXDMA_OFFSET_CHK + 1);
192 value8 = (u8)((value8 & 0x7f) | 0x80);
193 HALMAC_REG_WRITE_8(halmac_adapter, REG_TXDMA_OFFSET_CHK + 1, value8);
195 halmac_adapter->h2c_buff_size = HALMAC_RSVD_H2C_QUEUE_PGNUM_8822B
196 << HALMAC_TX_PAGE_SIZE_2_POWER_8822B;
197 halmac_get_h2c_buff_free_space_88xx(halmac_adapter);
199 if (halmac_adapter->h2c_buff_size !=
200 halmac_adapter->h2c_buf_free_space) {
201 pr_err("get h2c free space error!\n");
202 return HALMAC_RET_GET_H2C_SPACE_ERR;
205 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
206 "halmac_init_trx_cfg <==========\n");
208 return HALMAC_RET_SUCCESS;
212 * halmac_init_protocol_cfg_8822b() - config protocol register
213 * @halmac_adapter : the adapter of halmac
214 * Author : KaiYuan Chang/Ivan Lin
215 * Return : enum halmac_ret_status
216 * More details of status code can be found in prototype document
218 enum halmac_ret_status
219 halmac_init_protocol_cfg_8822b(struct halmac_adapter *halmac_adapter)
222 void *driver_adapter = NULL;
223 struct halmac_api *halmac_api;
225 if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
226 return HALMAC_RET_ADAPTER_INVALID;
228 if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
229 return HALMAC_RET_API_INVALID;
231 halmac_api_record_id_88xx(halmac_adapter, HALMAC_API_INIT_PROTOCOL_CFG);
233 driver_adapter = halmac_adapter->driver_adapter;
234 halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
236 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
237 "[TRACE]%s ==========>\n", __func__);
239 HALMAC_REG_WRITE_8(halmac_adapter, REG_AMPDU_MAX_TIME_V1,
240 HALMAC_AMPDU_MAX_TIME_8822B);
241 HALMAC_REG_WRITE_8(halmac_adapter, REG_TX_HANG_CTRL, BIT_EN_EOF_V1);
243 value32 = HALMAC_PROT_RTS_LEN_TH_8822B |
244 (HALMAC_PROT_RTS_TX_TIME_TH_8822B << 8) |
245 (HALMAC_PROT_MAX_AGG_PKT_LIMIT_8822B << 16) |
246 (HALMAC_PROT_RTS_MAX_AGG_PKT_LIMIT_8822B << 24);
247 HALMAC_REG_WRITE_32(halmac_adapter, REG_PROT_MODE_CTRL, value32);
249 HALMAC_REG_WRITE_16(halmac_adapter, REG_BAR_MODE_CTRL + 2,
250 HALMAC_BAR_RETRY_LIMIT_8822B |
251 HALMAC_RA_TRY_RATE_AGG_LIMIT_8822B << 8);
253 HALMAC_REG_WRITE_8(halmac_adapter, REG_FAST_EDCA_VOVI_SETTING,
254 HALMAC_FAST_EDCA_VO_TH_8822B);
255 HALMAC_REG_WRITE_8(halmac_adapter, REG_FAST_EDCA_VOVI_SETTING + 2,
256 HALMAC_FAST_EDCA_VI_TH_8822B);
257 HALMAC_REG_WRITE_8(halmac_adapter, REG_FAST_EDCA_BEBK_SETTING,
258 HALMAC_FAST_EDCA_BE_TH_8822B);
259 HALMAC_REG_WRITE_8(halmac_adapter, REG_FAST_EDCA_BEBK_SETTING + 2,
260 HALMAC_FAST_EDCA_BK_TH_8822B);
262 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
263 "[TRACE]%s <==========\n", __func__);
265 return HALMAC_RET_SUCCESS;
269 * halmac_init_h2c_8822b() - config h2c packet buffer
270 * @halmac_adapter : the adapter of halmac
271 * Author : KaiYuan Chang/Ivan Lin
272 * Return : enum halmac_ret_status
273 * More details of status code can be found in prototype document
275 enum halmac_ret_status
276 halmac_init_h2c_8822b(struct halmac_adapter *halmac_adapter)
280 void *driver_adapter = NULL;
281 struct halmac_api *halmac_api;
283 if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
284 return HALMAC_RET_ADAPTER_INVALID;
286 if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
287 return HALMAC_RET_API_INVALID;
289 driver_adapter = halmac_adapter->driver_adapter;
290 halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
293 HALMAC_REG_WRITE_8(halmac_adapter, REG_CR, value8);
294 value8 = HALMAC_CR_TRX_ENABLE_8822B;
295 HALMAC_REG_WRITE_8(halmac_adapter, REG_CR, value8);
297 value32 = HALMAC_REG_READ_32(halmac_adapter, REG_H2C_HEAD);
298 value32 = (value32 & 0xFFFC0000) |
299 (halmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy
300 << HALMAC_TX_PAGE_SIZE_2_POWER_8822B);
301 HALMAC_REG_WRITE_32(halmac_adapter, REG_H2C_HEAD, value32);
303 value32 = HALMAC_REG_READ_32(halmac_adapter, REG_H2C_READ_ADDR);
304 value32 = (value32 & 0xFFFC0000) |
305 (halmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy
306 << HALMAC_TX_PAGE_SIZE_2_POWER_8822B);
307 HALMAC_REG_WRITE_32(halmac_adapter, REG_H2C_READ_ADDR, value32);
309 value32 = HALMAC_REG_READ_32(halmac_adapter, REG_H2C_TAIL);
310 value32 = (value32 & 0xFFFC0000) |
311 ((halmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy
312 << HALMAC_TX_PAGE_SIZE_2_POWER_8822B) +
313 (HALMAC_RSVD_H2C_QUEUE_PGNUM_8822B
314 << HALMAC_TX_PAGE_SIZE_2_POWER_8822B));
315 HALMAC_REG_WRITE_32(halmac_adapter, REG_H2C_TAIL, value32);
316 value8 = HALMAC_REG_READ_8(halmac_adapter, REG_H2C_INFO);
317 value8 = (u8)((value8 & 0xFC) | 0x01);
318 HALMAC_REG_WRITE_8(halmac_adapter, REG_H2C_INFO, value8);
320 value8 = HALMAC_REG_READ_8(halmac_adapter, REG_H2C_INFO);
321 value8 = (u8)((value8 & 0xFB) | 0x04);
322 HALMAC_REG_WRITE_8(halmac_adapter, REG_H2C_INFO, value8);
324 value8 = HALMAC_REG_READ_8(halmac_adapter, REG_TXDMA_OFFSET_CHK + 1);
325 value8 = (u8)((value8 & 0x7f) | 0x80);
326 HALMAC_REG_WRITE_8(halmac_adapter, REG_TXDMA_OFFSET_CHK + 1, value8);
328 halmac_adapter->h2c_buff_size = HALMAC_RSVD_H2C_QUEUE_PGNUM_8822B
329 << HALMAC_TX_PAGE_SIZE_2_POWER_8822B;
330 halmac_get_h2c_buff_free_space_88xx(halmac_adapter);
332 if (halmac_adapter->h2c_buff_size !=
333 halmac_adapter->h2c_buf_free_space) {
334 pr_err("get h2c free space error!\n");
335 return HALMAC_RET_GET_H2C_SPACE_ERR;
338 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
339 "h2c free space : %d\n",
340 halmac_adapter->h2c_buf_free_space);
342 return HALMAC_RET_SUCCESS;