GNU Linux-libre 4.19.245-gnu1
[releases.git] / drivers / staging / rtlwifi / halmac / halmac_88xx / halmac_8822b / halmac_api_8822b.c
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
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
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
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
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 }