OSDN Git Service

Add rtl8821ce driver version 5.5.2
[android-x86/external-kernel-drivers.git] / rtl8821ce / hal / halmac / halmac_88xx / halmac_8821c / halmac_api_8821c.c
1 #include "halmac_8821c_cfg.h"
2 #include "halmac_func_8821c.h"
3 #include "../halmac_func_88xx.h"
4
5
6 /**
7  * halmac_mount_api_8821c() - attach functions to function pointer
8  * @pHalmac_adapter
9  *
10  * SD1 internal use
11  *
12  * Author : KaiYuan Chang/Ivan Lin
13  * Return : HALMAC_RET_STATUS
14  */
15 HALMAC_RET_STATUS
16 halmac_mount_api_8821c(
17         IN PHALMAC_ADAPTER pHalmac_adapter
18 )
19 {
20         PHALMAC_API pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
21
22         pHalmac_adapter->chip_id = HALMAC_CHIP_ID_8821C;
23         pHalmac_adapter->hw_config_info.efuse_size = HALMAC_EFUSE_SIZE_8821C;
24         pHalmac_adapter->hw_config_info.eeprom_size = HALMAC_EEPROM_SIZE_8821C;
25         pHalmac_adapter->hw_config_info.bt_efuse_size = HALMAC_BT_EFUSE_SIZE_8821C;
26         pHalmac_adapter->hw_config_info.cam_entry_num = HALMAC_SECURITY_CAM_ENTRY_NUM_8821C;
27         pHalmac_adapter->hw_config_info.txdesc_size = HALMAC_TX_DESC_SIZE_8821C;
28         pHalmac_adapter->hw_config_info.rxdesc_size = HALMAC_RX_DESC_SIZE_8821C;
29         pHalmac_adapter->hw_config_info.tx_fifo_size = HALMAC_TX_FIFO_SIZE_8821C;
30         pHalmac_adapter->hw_config_info.rx_fifo_size = HALMAC_RX_FIFO_SIZE_8821C;
31         pHalmac_adapter->hw_config_info.page_size = HALMAC_TX_PAGE_SIZE_8821C;
32         pHalmac_adapter->hw_config_info.tx_align_size = HALMAC_TX_ALIGN_SIZE_8821C;
33         pHalmac_adapter->hw_config_info.page_size_2_power = HALMAC_TX_PAGE_SIZE_2_POWER_8821C;
34
35         pHalmac_adapter->txff_allocation.rsvd_drv_pg_num = HALMAC_RSVD_DRV_PGNUM_8821C;
36
37 #if HALMAC_8821C_SUPPORT
38         pHalmac_api->halmac_init_trx_cfg = halmac_init_trx_cfg_8821C;
39                 pHalmac_api->halmac_init_protocol_cfg = halmac_init_protocol_cfg_8821c;
40         pHalmac_api->halmac_init_h2c = halmac_init_h2c_8821c;
41
42         if (HALMAC_INTERFACE_SDIO == pHalmac_adapter->halmac_interface) {
43                 pHalmac_api->halmac_tx_allowed_sdio = halmac_tx_allowed_sdio_88xx;
44                 pHalmac_api->halmac_cfg_tx_agg_align = halmac_cfg_tx_agg_align_sdio_88xx;
45                 pHalmac_api->halmac_mac_power_switch = halmac_mac_power_switch_8821c_sdio;
46                 pHalmac_api->halmac_phy_cfg = halmac_phy_cfg_8821c_sdio;
47                 pHalmac_api->halmac_interface_integration_tuning = halmac_interface_integration_tuning_8821c_sdio;
48         } else if (HALMAC_INTERFACE_USB == pHalmac_adapter->halmac_interface) {
49                 pHalmac_api->halmac_mac_power_switch = halmac_mac_power_switch_8821c_usb;
50                 pHalmac_api->halmac_cfg_tx_agg_align = halmac_cfg_tx_agg_align_usb_not_support_88xx;
51                 pHalmac_api->halmac_phy_cfg = halmac_phy_cfg_8821c_usb;
52                 pHalmac_api->halmac_interface_integration_tuning = halmac_interface_integration_tuning_8821c_usb;
53         } else if (HALMAC_INTERFACE_PCIE == pHalmac_adapter->halmac_interface) {
54                 pHalmac_api->halmac_mac_power_switch = halmac_mac_power_switch_8821c_pcie;
55                 pHalmac_api->halmac_cfg_tx_agg_align = halmac_cfg_tx_agg_align_pcie_not_support_88xx;
56                 pHalmac_api->halmac_pcie_switch = halmac_pcie_switch_8821c;
57                 pHalmac_api->halmac_phy_cfg = halmac_phy_cfg_8821c_pcie;
58                 pHalmac_api->halmac_interface_integration_tuning = halmac_interface_integration_tuning_8821c_pcie;
59         } else {
60                 pHalmac_api->halmac_pcie_switch = halmac_pcie_switch_8821c_nc;
61         }
62 #endif
63
64         return HALMAC_RET_SUCCESS;
65 }
66
67 /**
68  * halmac_init_trx_cfg_8821c() - config trx dma register
69  * @pHalmac_adapter : the adapter of halmac
70  * @halmac_trx_mode : trx mode selection
71  * Author : KaiYuan Chang/Ivan Lin
72  * Return : HALMAC_RET_STATUS
73  * More details of status code can be found in prototype document
74  */
75 HALMAC_RET_STATUS
76 halmac_init_trx_cfg_8821C(
77         IN PHALMAC_ADAPTER pHalmac_adapter,
78         IN HALMAC_TRX_MODE halmac_trx_mode
79 )
80 {
81         u8 value8;
82         u32 value32;
83         VOID *pDriver_adapter = NULL;
84         PHALMAC_API pHalmac_api;
85         HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
86
87         if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
88                 return HALMAC_RET_ADAPTER_INVALID;
89
90         if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
91                 return HALMAC_RET_API_INVALID;
92
93         halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_INIT_TRX_CFG);
94
95         pDriver_adapter = pHalmac_adapter->pDriver_adapter;
96         pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
97         pHalmac_adapter->trx_mode = halmac_trx_mode;
98
99         PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_init_trx_cfg ==========>halmac_trx_mode = %d\n", halmac_trx_mode);
100
101         status = halmac_txdma_queue_mapping_8821c(pHalmac_adapter, halmac_trx_mode);
102
103         if (HALMAC_RET_SUCCESS != status) {
104                 PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_txdma_queue_mapping fail!\n");
105                 return status;
106         }
107
108         value8 = 0;
109         HALMAC_REG_WRITE_8(pHalmac_adapter, REG_CR, value8);
110         value8 = HALMAC_CR_TRX_ENABLE_8821C;
111         HALMAC_REG_WRITE_8(pHalmac_adapter, REG_CR, value8);
112         HALMAC_REG_WRITE_32(pHalmac_adapter, REG_H2CQ_CSR, BIT(31));
113
114         status = halmac_priority_queue_config_8821c(pHalmac_adapter, halmac_trx_mode);
115         if (HALMAC_RX_FIFO_EXPANDING_MODE_DISABLE != pHalmac_adapter->txff_allocation.rx_fifo_expanding_mode)
116                 HALMAC_REG_WRITE_8(pHalmac_adapter, REG_RX_DRVINFO_SZ, HALMAC_RX_DESC_DUMMY_SIZE_MAX_88XX >> 3);
117
118         if (HALMAC_RET_SUCCESS != status) {
119                 PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_txdma_queue_mapping fail!\n");
120                 return status;
121         }
122
123         /* Config H2C packet buffer */
124         value32 = HALMAC_REG_READ_32(pHalmac_adapter, REG_H2C_HEAD);
125         /* value32 = (value32 & 0xFFFC0000) | HALMAC_RSVD_H2C_QUEUE_BOUNDARY_8821C; */
126         /* value32 = (value32 & 0xFFFC0000) | pHalmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy * HALMAC_TX_PAGE_SIZE_8821C; */
127         value32 = (value32 & 0xFFFC0000) | (pHalmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy << HALMAC_TX_PAGE_SIZE_2_POWER_8821C);
128         HALMAC_REG_WRITE_32(pHalmac_adapter, REG_H2C_HEAD, value32);
129
130         value32 = HALMAC_REG_READ_32(pHalmac_adapter, REG_H2C_READ_ADDR);
131         /* value32 = (value32 & 0xFFFC0000) | HALMAC_RSVD_H2C_QUEUE_BOUNDARY_8821C; */
132         value32 = (value32 & 0xFFFC0000) | (pHalmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy << HALMAC_TX_PAGE_SIZE_2_POWER_8821C);
133         HALMAC_REG_WRITE_32(pHalmac_adapter, REG_H2C_READ_ADDR, value32);
134
135         value32 = HALMAC_REG_READ_32(pHalmac_adapter, REG_H2C_TAIL);
136         /* value32 = (value32 & 0xFFFC0000) | (HALMAC_RSVD_H2C_QUEUE_BOUNDARY_8821C + HALMAC_RSVD_H2C_QUEUE_SIZE_8821C); */
137         value32 = (value32 & 0xFFFC0000) | ((pHalmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy << HALMAC_TX_PAGE_SIZE_2_POWER_8821C) + (HALMAC_RSVD_H2C_QUEUE_PGNUM_8821C << HALMAC_TX_PAGE_SIZE_2_POWER_8821C));
138         HALMAC_REG_WRITE_32(pHalmac_adapter, REG_H2C_TAIL, value32);
139
140         value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_H2C_INFO);
141         value8 = (u8)((value8 & 0xFC) | 0x01);
142         HALMAC_REG_WRITE_8(pHalmac_adapter, REG_H2C_INFO, value8);
143
144         value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_H2C_INFO);
145         value8 = (u8)((value8 & 0xFB) | 0x04);
146         HALMAC_REG_WRITE_8(pHalmac_adapter, REG_H2C_INFO, value8);
147
148         value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_TXDMA_OFFSET_CHK + 1);
149         value8 = (u8)((value8 & 0x7f) | 0x80);
150         HALMAC_REG_WRITE_8(pHalmac_adapter, REG_TXDMA_OFFSET_CHK + 1, value8);
151
152         pHalmac_adapter->h2c_buff_size = HALMAC_RSVD_H2C_QUEUE_PGNUM_8821C << HALMAC_TX_PAGE_SIZE_2_POWER_8821C;
153         halmac_get_h2c_buff_free_space_88xx(pHalmac_adapter);
154
155         if (pHalmac_adapter->h2c_buff_size != pHalmac_adapter->h2c_buf_free_space) {
156                 PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "get h2c free space error!\n");
157                 return HALMAC_RET_GET_H2C_SPACE_ERR;
158         }
159
160         PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_init_trx_cfg <==========\n");
161
162         return HALMAC_RET_SUCCESS;
163 }
164
165 /**
166  * halmac_init_protocol_cfg_8821c() - config protocol register
167  * @pHalmac_adapter : the adapter of halmac
168  * Author : KaiYuan Chang/Ivan Lin
169  * Return : HALMAC_RET_STATUS
170  * More details of status code can be found in prototype document
171  */
172 HALMAC_RET_STATUS
173 halmac_init_protocol_cfg_8821c(
174         IN PHALMAC_ADAPTER pHalmac_adapter
175 )
176 {
177         u32 max_agg_num, max_rts_agg_num;
178         u32 value32;
179         VOID *pDriver_adapter = NULL;
180         PHALMAC_API pHalmac_api;
181
182         if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
183                 return HALMAC_RET_ADAPTER_INVALID;
184
185         if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
186                 return HALMAC_RET_API_INVALID;
187
188         pDriver_adapter = pHalmac_adapter->pDriver_adapter;
189         pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
190
191         PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "[TRACE]halmac_init_protocol_cfg_8821c ==========>\n");
192
193         HALMAC_REG_WRITE_8(pHalmac_adapter, REG_AMPDU_MAX_TIME_V1, HALMAC_AMPDU_MAX_TIME_8821C);
194         HALMAC_REG_WRITE_8(pHalmac_adapter, REG_TX_HANG_CTRL, BIT_EN_EOF_V1);
195
196         max_agg_num = HALMAC_PROT_MAX_AGG_PKT_LIMIT_8821C;
197         max_rts_agg_num = HALMAC_PROT_RTS_MAX_AGG_PKT_LIMIT_8821C;
198
199         if (HALMAC_INTERFACE_SDIO == pHalmac_adapter->halmac_interface) {
200                 max_agg_num = HALMAC_PROT_MAX_AGG_PKT_LIMIT_8821C_SDIO;
201                 max_rts_agg_num = HALMAC_PROT_RTS_MAX_AGG_PKT_LIMIT_8821C_SDIO;
202         }
203
204         value32 = HALMAC_PROT_RTS_LEN_TH_8821C | (HALMAC_PROT_RTS_TX_TIME_TH_8821C << 8) | (max_agg_num << 16) | (max_rts_agg_num << 24);
205         HALMAC_REG_WRITE_32(pHalmac_adapter, REG_PROT_MODE_CTRL, value32);
206
207         HALMAC_REG_WRITE_16(pHalmac_adapter, REG_BAR_MODE_CTRL + 2, HALMAC_BAR_RETRY_LIMIT_8821C | HALMAC_RA_TRY_RATE_AGG_LIMIT_8821C << 8);
208
209         HALMAC_REG_WRITE_8(pHalmac_adapter, REG_FAST_EDCA_VOVI_SETTING, HALMAC_FAST_EDCA_VO_TH_8821C);
210         HALMAC_REG_WRITE_8(pHalmac_adapter, REG_FAST_EDCA_VOVI_SETTING + 2, HALMAC_FAST_EDCA_VI_TH_8821C);
211         HALMAC_REG_WRITE_8(pHalmac_adapter, REG_FAST_EDCA_BEBK_SETTING, HALMAC_FAST_EDCA_BE_TH_8821C);
212         HALMAC_REG_WRITE_8(pHalmac_adapter, REG_FAST_EDCA_BEBK_SETTING + 2, HALMAC_FAST_EDCA_BK_TH_8821C);
213
214         PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "[TRACE]halmac_init_protocol_cfg_8821c <==========\n");
215
216         return HALMAC_RET_SUCCESS;
217 }
218
219 /**
220  * halmac_init_h2c_8821c() - config h2c packet buffer
221  * @pHalmac_adapter : the adapter of halmac
222  * Author : KaiYuan Chang/Ivan Lin
223  * Return : HALMAC_RET_STATUS
224  * More details of status code can be found in prototype document
225  */
226 HALMAC_RET_STATUS
227 halmac_init_h2c_8821c(
228         IN PHALMAC_ADAPTER pHalmac_adapter
229 )
230 {
231         u8 value8;
232         u32 value32;
233         VOID *pDriver_adapter = NULL;
234         PHALMAC_API pHalmac_api;
235
236         if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
237                 return HALMAC_RET_ADAPTER_INVALID;
238
239         if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
240                 return HALMAC_RET_API_INVALID;
241
242         pDriver_adapter = pHalmac_adapter->pDriver_adapter;
243         pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
244
245         value8 = 0;
246         HALMAC_REG_WRITE_8(pHalmac_adapter, REG_CR, value8);
247         value8 = HALMAC_CR_TRX_ENABLE_8821C;
248         HALMAC_REG_WRITE_8(pHalmac_adapter, REG_CR, value8);
249
250         value32 = HALMAC_REG_READ_32(pHalmac_adapter, REG_H2C_HEAD);
251         /* value32 = (value32 & 0xFFFC0000) | HALMAC_RSVD_H2C_QUEUE_BOUNDARY_8821C; */
252         value32 = (value32 & 0xFFFC0000) | (pHalmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy << HALMAC_TX_PAGE_SIZE_2_POWER_8821C);
253         HALMAC_REG_WRITE_32(pHalmac_adapter, REG_H2C_HEAD, value32);
254
255         value32 = HALMAC_REG_READ_32(pHalmac_adapter, REG_H2C_READ_ADDR);
256         /* value32 = (value32 & 0xFFFC0000) | HALMAC_RSVD_H2C_QUEUE_BOUNDARY_8821C; */
257         value32 = (value32 & 0xFFFC0000) | (pHalmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy << HALMAC_TX_PAGE_SIZE_2_POWER_8821C);
258         HALMAC_REG_WRITE_32(pHalmac_adapter, REG_H2C_READ_ADDR, value32);
259
260         value32 = HALMAC_REG_READ_32(pHalmac_adapter, REG_H2C_TAIL);
261         /* value32 = (value32 & 0xFFFC0000) | (HALMAC_RSVD_H2C_QUEUE_BOUNDARY_8821C + HALMAC_RSVD_H2C_QUEUE_SIZE_8821C); */
262         value32 = (value32 & 0xFFFC0000) | ((pHalmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy << HALMAC_TX_PAGE_SIZE_2_POWER_8821C) + (HALMAC_RSVD_H2C_QUEUE_PGNUM_8821C << HALMAC_TX_PAGE_SIZE_2_POWER_8821C));
263         HALMAC_REG_WRITE_32(pHalmac_adapter, REG_H2C_TAIL, value32);
264         value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_H2C_INFO);
265         value8 = (u8)((value8 & 0xFC) | 0x01);
266         HALMAC_REG_WRITE_8(pHalmac_adapter, REG_H2C_INFO, value8);
267
268         value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_H2C_INFO);
269         value8 = (u8)((value8 & 0xFB) | 0x04);
270         HALMAC_REG_WRITE_8(pHalmac_adapter, REG_H2C_INFO, value8);
271
272         value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_TXDMA_OFFSET_CHK + 1);
273         value8 = (u8)((value8 & 0x7f) | 0x80);
274         HALMAC_REG_WRITE_8(pHalmac_adapter, REG_TXDMA_OFFSET_CHK + 1, value8);
275
276         pHalmac_adapter->h2c_buff_size = (HALMAC_RSVD_H2C_QUEUE_PGNUM_8821C << HALMAC_TX_PAGE_SIZE_2_POWER_8821C);
277         halmac_get_h2c_buff_free_space_88xx(pHalmac_adapter);
278
279         if (pHalmac_adapter->h2c_buff_size != pHalmac_adapter->h2c_buf_free_space) {
280                 PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "get h2c free space error!\n");
281                 return HALMAC_RET_GET_H2C_SPACE_ERR;
282         }
283
284         PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "h2c free space : %d\n", pHalmac_adapter->h2c_buf_free_space);
285
286         return HALMAC_RET_SUCCESS;
287 }