net: wireless: rockchip: add rtl8822be pcie wifi driver
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8822be / hal / halmac / halmac_api.c
1 #include "halmac_2_platform.h"
2 #include "halmac_type.h"
3 #if HALMAC_PLATFORM_WINDOWS == 1
4 #include "halmac_88xx/halmac_api_win8822b.h"
5 #include "halmac_88xx/halmac_win8822b_cfg.h"
6 #include "halmac_88xx/halmac_api_win8821c.h"
7 #include "halmac_88xx/halmac_win8821c_cfg.h"
8 #include "halmac_88xx/halmac_api_win8197f.h"
9 #include "halmac_88xx/halmac_win8197f_cfg.h"
10 #else
11 #include "halmac_88xx/halmac_api_88xx.h"
12 #include "halmac_88xx/halmac_88xx_cfg.h"
13 #endif
14 #include "halmac_88xx/halmac_8822b/halmac_8822b_cfg.h"
15 #include "halmac_88xx/halmac_8821c/halmac_8821c_cfg.h"
16 #include "halmac_88xx/halmac_8197f/halmac_8197f_cfg.h"
17
18
19 HALMAC_RET_STATUS
20 halmac_check_platform_api(
21         IN VOID *pDriver_adapter,
22         IN HALMAC_INTERFACE halmac_interface,
23         IN PHALMAC_PLATFORM_API pHalmac_platform_api
24 );
25
26 /**
27  * halmac_init_adapter() - init halmac_adapter
28  * @pDriver_adapter
29  * @pHalmac_platform_api : platform api for halmac used
30  * @halmac_interface : PCIE, USB, or SDIO
31  * @ppHalmac_adapter
32  * @ppHalmac_api
33  * Author : KaiYuan Chang
34  * Return : HALMAC_RET_STATUS
35  */
36 HALMAC_RET_STATUS
37 halmac_init_adapter(
38         IN VOID *pDriver_adapter,
39         IN PHALMAC_PLATFORM_API pHalmac_platform_api,
40         IN HALMAC_INTERFACE     halmac_interface,
41         OUT     PHALMAC_ADAPTER *ppHalmac_adapter,
42         OUT     PHALMAC_API *ppHalmac_api
43 )
44 {
45         PHALMAC_ADAPTER pHalmac_adapter = (PHALMAC_ADAPTER)NULL;
46         HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
47
48 #if HALMAC_PLATFORM_WINDOWS == 1
49         u8 chip_id = 0;
50         u32 polling_count;
51 #endif
52         union {
53                 u32     i;
54                 u8      x[4];
55         } ENDIAN_CHECK = { 0x01000000 };
56
57         status = halmac_check_platform_api(pDriver_adapter, halmac_interface, pHalmac_platform_api);
58         if (HALMAC_RET_SUCCESS != status)
59                 return status;
60         pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, HALMAC_SVN_VER "\n");
61         pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "HALMAC_MAJOR_VER = %x\n", HALMAC_MAJOR_VER);
62         pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "HALMAC_PROTOTYPE_VER = %x\n", HALMAC_PROTOTYPE_VER);
63         pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "HALMAC_MINOR_VER = %x\n", HALMAC_MINOR_VER);
64
65         pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_init_adapter_88xx ==========>\n");
66
67         /* Check endian setting - Little endian : 1, Big endian : 0*/
68         if (HALMAC_SYSTEM_ENDIAN == ENDIAN_CHECK.x[0]) {
69                 pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "Endian setting Err!!\n");
70                 pHalmac_adapter = (PHALMAC_ADAPTER)NULL;
71                 return HALMAC_RET_ENDIAN_ERR;
72         }
73
74         pHalmac_adapter = (PHALMAC_ADAPTER)pHalmac_platform_api->RTL_MALLOC(pDriver_adapter, sizeof(HALMAC_ADAPTER));
75         if (NULL == pHalmac_adapter) {
76                 pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "Malloc HAL Adapter Err!!\n");
77                 return HALMAC_RET_MALLOC_FAIL;
78         }
79
80         /* return halmac adapter address to caller */
81         *ppHalmac_adapter = pHalmac_adapter;
82
83         /* Record caller info */
84         pHalmac_adapter->pHalmac_platform_api = pHalmac_platform_api;
85         pHalmac_adapter->pDriver_adapter = pDriver_adapter;
86         pHalmac_adapter->halmac_interface = halmac_interface;
87
88         PLATFORM_MUTEX_INIT(pDriver_adapter, &(pHalmac_adapter->EfuseMutex));
89         PLATFORM_MUTEX_INIT(pDriver_adapter, &(pHalmac_adapter->h2c_seq_mutex));
90
91         /* Assign function pointer to halmac API */
92 #if HALMAC_PLATFORM_WINDOWS == 0
93         halmac_init_adapter_para_88xx(pHalmac_adapter);
94         status = halmac_mount_api_88xx(pHalmac_adapter);
95 #else
96         /* Get Chip_id and Chip_version */
97         if (HALMAC_INTERFACE_SDIO == pHalmac_adapter->halmac_interface) {
98                 chip_id = pHalmac_platform_api->SDIO_CMD52_READ(pDriver_adapter, REG_SYS_CFG2);
99                 if (chip_id == 0xEA)
100                         pHalmac_platform_api->SDIO_CMD52_WRITE(pDriver_adapter, REG_SDIO_HSUS_CTRL, pHalmac_platform_api->SDIO_CMD52_READ(pHalmac_adapter, REG_SDIO_HSUS_CTRL) & ~(BIT(0)));
101
102                 polling_count = HALMAC_POLLING_READY_TIMEOUT_COUNT;
103                 while (!(pHalmac_platform_api->SDIO_CMD52_READ(pDriver_adapter, REG_SDIO_HSUS_CTRL) & 0x02)) {
104                         polling_count--;
105                         if (polling_count == 0)
106                                 return HALMAC_RET_SDIO_LEAVE_SUSPEND_FAIL;
107                 }
108
109                 chip_id = pHalmac_platform_api->SDIO_CMD52_READ(pDriver_adapter, REG_SYS_CFG2);
110         } else {
111                 chip_id = pHalmac_platform_api->REG_READ_8(pDriver_adapter, REG_SYS_CFG2);
112         }
113
114 #if HALMAC_8822B_SUPPORT
115         if (HALMAC_CHIP_ID_HW_DEF_8822B == chip_id) {
116                 halmac_init_adapter_para_win8822b(pHalmac_adapter);
117                 status = halmac_mount_api_win8822b(pHalmac_adapter);
118         }
119 #endif
120 #if HALMAC_8821C_SUPPORT
121         if (HALMAC_CHIP_ID_HW_DEF_8821C == chip_id) {
122                 halmac_init_adapter_para_win8821c(pHalmac_adapter);
123                 status = halmac_mount_api_win8821c(pHalmac_adapter);
124         }
125 #endif
126 #if HALMAC_8197F_SUPPORT
127         if (HALMAC_CHIP_ID_HW_DEF_8197F == chip_id) {
128                 halmac_init_adapter_para_win8197f(pHalmac_adapter);
129                 status = halmac_mount_api_win8197f(pHalmac_adapter);
130         }
131 #endif
132
133 #endif
134
135         /* Return halmac API function pointer */
136         *ppHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
137
138         PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_init_adapter_88xx <==========\n");
139
140         return status;
141 }
142
143 /**
144  * halmac_halt_api() - halt all halmac api
145  * @pHalmac_adapter
146  * Author : Ivan Lin
147  * Return : HALMAC_RET_STATUS
148  */
149 HALMAC_RET_STATUS
150 halmac_halt_api(
151         IN PHALMAC_ADAPTER pHalmac_adapter
152 )
153 {
154         VOID *pDriver_adapter = NULL;
155         PHALMAC_PLATFORM_API pHalmac_platform_api = (PHALMAC_PLATFORM_API)NULL;
156
157         if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
158                 return HALMAC_RET_ADAPTER_INVALID;
159
160         pDriver_adapter = pHalmac_adapter->pDriver_adapter;
161         pHalmac_platform_api = pHalmac_adapter->pHalmac_platform_api;
162
163         PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_halt_api ==========>\n");
164         pHalmac_adapter->halmac_state.api_state = HALMAC_API_STATE_HALT;
165         PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_halt_api ==========>\n");
166         return HALMAC_RET_SUCCESS;
167 }
168
169 /**
170  * halmac_deinit_adapter() - deinit halmac adapter
171  * @pHalmac_adapter
172  * Author : KaiYuan Chang
173  * Return : HALMAC_RET_STATUS
174  */
175 HALMAC_RET_STATUS
176 halmac_deinit_adapter(
177         IN PHALMAC_ADAPTER pHalmac_adapter
178 )
179 {
180         VOID *pDriver_adapter = NULL;
181         PHALMAC_PLATFORM_API pHalmac_platform_api = (PHALMAC_PLATFORM_API)NULL;
182
183         if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
184                 return HALMAC_RET_ADAPTER_INVALID;
185
186         pDriver_adapter = pHalmac_adapter->pDriver_adapter;
187         pHalmac_platform_api = pHalmac_adapter->pHalmac_platform_api;
188
189         PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_deinit_adapter_88xx ==========>\n");
190
191         PLATFORM_MUTEX_DEINIT(pDriver_adapter, &(pHalmac_adapter->EfuseMutex));
192         PLATFORM_MUTEX_DEINIT(pDriver_adapter, &(pHalmac_adapter->h2c_seq_mutex));
193
194         if (NULL != pHalmac_adapter->pHalEfuse_map) {
195                 PLATFORM_RTL_FREE(pDriver_adapter, pHalmac_adapter->pHalEfuse_map, pHalmac_adapter->hw_config_info.efuse_size);
196                 pHalmac_adapter->pHalEfuse_map = (u8 *)NULL;
197         }
198
199         if (NULL != pHalmac_adapter->halmac_state.psd_set.pData) {
200                 PLATFORM_RTL_FREE(pDriver_adapter, pHalmac_adapter->halmac_state.psd_set.pData, pHalmac_adapter->halmac_state.psd_set.data_size);
201                 pHalmac_adapter->halmac_state.psd_set.pData = (u8 *)NULL;
202         }
203
204         if (NULL != pHalmac_adapter->pHalmac_api) {
205                 PLATFORM_RTL_FREE(pDriver_adapter, pHalmac_adapter->pHalmac_api, sizeof(HALMAC_API));
206                 pHalmac_adapter->pHalmac_api = NULL;
207         }
208
209         if (NULL != pHalmac_adapter) {
210                 pHalmac_adapter->pHalAdapter_backup = NULL;
211                 PLATFORM_RTL_FREE(pDriver_adapter, pHalmac_adapter, sizeof(HALMAC_ADAPTER));
212                 pHalmac_adapter = (PHALMAC_ADAPTER)NULL;
213         }
214
215         return HALMAC_RET_SUCCESS;
216 }
217
218 /**
219  * halmac_check_platform_api() - check platform api pointers
220  * @pDriver_adapter
221  * @halmac_interface : PCIE, USB or SDIO
222  * @pHalmac_platform_api
223  * Author : KaiYuan Chang
224  * Return : HALMAC_RET_STATUS
225  */
226 HALMAC_RET_STATUS
227 halmac_check_platform_api(
228         IN VOID *pDriver_adapter,
229         IN HALMAC_INTERFACE     halmac_interface,
230         IN PHALMAC_PLATFORM_API pHalmac_platform_api
231 )
232 {
233         VOID *pAdapter_Local = NULL;
234
235         pAdapter_Local = pDriver_adapter;
236
237         if (NULL == pHalmac_platform_api)
238                 return HALMAC_RET_PLATFORM_API_NULL;
239
240         if (NULL == pHalmac_platform_api->MSG_PRINT)
241                 return HALMAC_RET_PLATFORM_API_NULL;
242
243         if (HALMAC_INTERFACE_SDIO == halmac_interface) {
244                 if (NULL == pHalmac_platform_api->SDIO_CMD52_READ) {
245                         pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->SDIO_CMD52_READ)\n");
246                         return HALMAC_RET_PLATFORM_API_NULL;
247                 }
248                 if (NULL == pHalmac_platform_api->SDIO_CMD53_READ_8) {
249                         pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->SDIO_CMD53_READ_8)\n");
250                         return HALMAC_RET_PLATFORM_API_NULL;
251                 }
252                 if (NULL == pHalmac_platform_api->SDIO_CMD53_READ_16) {
253                         pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->SDIO_CMD53_READ_16)\n");
254                         return HALMAC_RET_PLATFORM_API_NULL;
255                 }
256                 if (NULL == pHalmac_platform_api->SDIO_CMD53_READ_32) {
257                         pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->SDIO_CMD53_READ_32)\n");
258                         return HALMAC_RET_PLATFORM_API_NULL;
259                 }
260                 if (NULL == pHalmac_platform_api->SDIO_CMD52_WRITE) {
261                         pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->SDIO_CMD52_WRITE)\n");
262                         return HALMAC_RET_PLATFORM_API_NULL;
263                 }
264                 if (NULL == pHalmac_platform_api->SDIO_CMD53_WRITE_8) {
265                         pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->SDIO_CMD53_WRITE_8)\n");
266                         return HALMAC_RET_PLATFORM_API_NULL;
267                 }
268                 if (NULL == pHalmac_platform_api->SDIO_CMD53_WRITE_16) {
269                         pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->SDIO_CMD53_WRITE_16)\n");
270                         return HALMAC_RET_PLATFORM_API_NULL;
271                 }
272                 if (NULL == pHalmac_platform_api->SDIO_CMD53_WRITE_32) {
273                         pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->SDIO_CMD53_WRITE_32)\n");
274                         return HALMAC_RET_PLATFORM_API_NULL;
275                 }
276         }
277
278         if ((HALMAC_INTERFACE_USB == halmac_interface) || (HALMAC_INTERFACE_PCIE == halmac_interface)) {
279                 if (NULL == pHalmac_platform_api->REG_READ_8) {
280                         pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->REG_READ_8)\n");
281                         return HALMAC_RET_PLATFORM_API_NULL;
282                 }
283                 if (NULL == pHalmac_platform_api->REG_READ_16) {
284                         pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->REG_READ_16)\n");
285                         return HALMAC_RET_PLATFORM_API_NULL;
286                 }
287                 if (NULL == pHalmac_platform_api->REG_READ_32) {
288                         pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->REG_READ_32)\n");
289                         return HALMAC_RET_PLATFORM_API_NULL;
290                 }
291                 if (NULL == pHalmac_platform_api->REG_WRITE_8) {
292                         pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->REG_WRITE_8)\n");
293                         return HALMAC_RET_PLATFORM_API_NULL;
294                 }
295                 if (NULL == pHalmac_platform_api->REG_WRITE_16) {
296                         pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->REG_WRITE_16)\n");
297                         return HALMAC_RET_PLATFORM_API_NULL;
298                 }
299                 if (NULL == pHalmac_platform_api->REG_WRITE_32) {
300                         pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->REG_WRITE_32)\n");
301                         return HALMAC_RET_PLATFORM_API_NULL;
302                 }
303         }
304
305         if (NULL == pHalmac_platform_api->RTL_FREE) {
306                 pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->RTL_FREE)\n");
307                 return HALMAC_RET_PLATFORM_API_NULL;
308         }
309
310         if (NULL == pHalmac_platform_api->RTL_MALLOC) {
311                 pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->RTL_MALLOC)\n");
312                 return HALMAC_RET_PLATFORM_API_NULL;
313         }
314         if (NULL == pHalmac_platform_api->RTL_MEMCPY) {
315                 pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->RTL_MEMCPY)\n");
316                 return HALMAC_RET_PLATFORM_API_NULL;
317         }
318         if (NULL == pHalmac_platform_api->RTL_MEMSET) {
319                 pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->RTL_MEMSET)\n");
320                 return HALMAC_RET_PLATFORM_API_NULL;
321         }
322         if (NULL == pHalmac_platform_api->RTL_DELAY_US) {
323                 pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->RTL_DELAY_US)\n");
324                 return HALMAC_RET_PLATFORM_API_NULL;
325         }
326
327         if (NULL == pHalmac_platform_api->MUTEX_INIT) {
328                 pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->MUTEX_INIT)\n");
329                 return HALMAC_RET_PLATFORM_API_NULL;
330         }
331         if (NULL == pHalmac_platform_api->MUTEX_DEINIT) {
332                 pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->MUTEX_DEINIT)\n");
333                 return HALMAC_RET_PLATFORM_API_NULL;
334         }
335         if (NULL == pHalmac_platform_api->MUTEX_LOCK) {
336                 pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->MUTEX_LOCK)\n");
337                 return HALMAC_RET_PLATFORM_API_NULL;
338         }
339         if (NULL == pHalmac_platform_api->MUTEX_UNLOCK) {
340                 pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->MUTEX_UNLOCK)\n");
341                 return HALMAC_RET_PLATFORM_API_NULL;
342         }
343         if (NULL == pHalmac_platform_api->EVENT_INDICATION) {
344                 pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "(NULL==pHalmac_platform_api->EVENT_INDICATION)\n");
345                 return HALMAC_RET_PLATFORM_API_NULL;
346         }
347
348         pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_check_platform_api ==========>\n");
349
350         return HALMAC_RET_SUCCESS;
351 }
352
353 HALMAC_RET_STATUS
354 halmac_get_version(
355         OUT     HALMAC_VER * version
356 )
357 {
358         version->major_ver = (u8)HALMAC_MAJOR_VER;
359         version->prototype_ver = (u8)HALMAC_PROTOTYPE_VER;
360         version->minor_ver = (u8)HALMAC_MINOR_VER;
361
362         return HALMAC_RET_SUCCESS;
363 }