GNU Linux-libre 4.14.251-gnu1
[releases.git] / drivers / staging / rtlwifi / halmac / halmac_88xx / halmac_8822b / halmac_api_8822b.c
1 /******************************************************************************
2  *
3  * Copyright(c) 2016  Realtek Corporation.
4  *
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.
8  *
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
12  * more details.
13  *
14  * The full GNU General Public License is included in this distribution in the
15  * file called LICENSE.
16  *
17  * Contact Information:
18  * wlanfae <wlanfae@realtek.com>
19  * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20  * Hsinchu 300, Taiwan.
21  *
22  * Larry Finger <Larry.Finger@lwfinger.net>
23  *
24  *****************************************************************************/
25 #include "halmac_8822b_cfg.h"
26 #include "halmac_func_8822b.h"
27 #include "../halmac_func_88xx.h"
28
29 /**
30  * halmac_mount_api_8822b() - attach functions to function pointer
31  * @halmac_adapter
32  *
33  * SD1 internal use
34  *
35  * Author : KaiYuan Chang/Ivan Lin
36  * Return : enum halmac_ret_status
37  */
38 enum halmac_ret_status
39 halmac_mount_api_8822b(struct halmac_adapter *halmac_adapter)
40 {
41         struct halmac_api *halmac_api =
42                 (struct halmac_api *)halmac_adapter->halmac_api;
43
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;
60
61         halmac_adapter->txff_allocation.rsvd_drv_pg_num =
62                 HALMAC_RSVD_DRV_PGNUM_8822B;
63
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;
67
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;
95         } else {
96                 halmac_api->halmac_pcie_switch = halmac_pcie_switch_8822b_nc;
97         }
98         return HALMAC_RET_SUCCESS;
99 }
100
101 /**
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
108  */
109 enum halmac_ret_status
110 halmac_init_trx_cfg_8822b(struct halmac_adapter *halmac_adapter,
111                           enum halmac_trx_mode halmac_trx_mode)
112 {
113         u8 value8;
114         u32 value32;
115         void *driver_adapter = NULL;
116         struct halmac_api *halmac_api;
117         enum halmac_ret_status status = HALMAC_RET_SUCCESS;
118
119         if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
120                 return HALMAC_RET_ADAPTER_INVALID;
121
122         if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
123                 return HALMAC_RET_API_INVALID;
124
125         halmac_api_record_id_88xx(halmac_adapter, HALMAC_API_INIT_TRX_CFG);
126
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;
130
131         HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
132                         "halmac_init_trx_cfg ==========>halmac_trx_mode = %d\n",
133                         halmac_trx_mode);
134
135         status = halmac_txdma_queue_mapping_8822b(halmac_adapter,
136                                                   halmac_trx_mode);
137
138         if (status != HALMAC_RET_SUCCESS) {
139                 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
140                                 "halmac_txdma_queue_mapping fail!\n");
141                 return status;
142         }
143
144         value8 = 0;
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));
149
150         status = halmac_priority_queue_config_8822b(halmac_adapter,
151                                                     halmac_trx_mode);
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);
155
156         if (status != HALMAC_RET_SUCCESS) {
157                 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
158                                 "halmac_txdma_queue_mapping fail!\n");
159                 return status;
160         }
161
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);
168
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);
174
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);
182
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);
186
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);
190
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);
194
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);
198
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;
203         }
204
205         HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
206                         "halmac_init_trx_cfg <==========\n");
207
208         return HALMAC_RET_SUCCESS;
209 }
210
211 /**
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
217  */
218 enum halmac_ret_status
219 halmac_init_protocol_cfg_8822b(struct halmac_adapter *halmac_adapter)
220 {
221         u32 value32;
222         void *driver_adapter = NULL;
223         struct halmac_api *halmac_api;
224
225         if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
226                 return HALMAC_RET_ADAPTER_INVALID;
227
228         if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
229                 return HALMAC_RET_API_INVALID;
230
231         halmac_api_record_id_88xx(halmac_adapter, HALMAC_API_INIT_PROTOCOL_CFG);
232
233         driver_adapter = halmac_adapter->driver_adapter;
234         halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
235
236         HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
237                         "[TRACE]%s ==========>\n", __func__);
238
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);
242
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);
248
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);
252
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);
261
262         HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
263                         "[TRACE]%s <==========\n", __func__);
264
265         return HALMAC_RET_SUCCESS;
266 }
267
268 /**
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
274  */
275 enum halmac_ret_status
276 halmac_init_h2c_8822b(struct halmac_adapter *halmac_adapter)
277 {
278         u8 value8;
279         u32 value32;
280         void *driver_adapter = NULL;
281         struct halmac_api *halmac_api;
282
283         if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
284                 return HALMAC_RET_ADAPTER_INVALID;
285
286         if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
287                 return HALMAC_RET_API_INVALID;
288
289         driver_adapter = halmac_adapter->driver_adapter;
290         halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
291
292         value8 = 0;
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);
296
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);
302
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);
308
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);
319
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);
323
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);
327
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);
331
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;
336         }
337
338         HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_INIT, DBG_DMESG,
339                         "h2c free space : %d\n",
340                         halmac_adapter->h2c_buf_free_space);
341
342         return HALMAC_RET_SUCCESS;
343 }