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"
11 #include "halmac_88xx/halmac_api_88xx.h"
12 #include "halmac_88xx/halmac_88xx_cfg.h"
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"
20 halmac_check_platform_api(
21 IN VOID *pDriver_adapter,
22 IN HALMAC_INTERFACE halmac_interface,
23 IN PHALMAC_PLATFORM_API pHalmac_platform_api
27 * halmac_init_adapter() - init halmac_adapter
29 * @pHalmac_platform_api : platform api for halmac used
30 * @halmac_interface : PCIE, USB, or SDIO
33 * Author : KaiYuan Chang
34 * Return : HALMAC_RET_STATUS
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
45 PHALMAC_ADAPTER pHalmac_adapter = (PHALMAC_ADAPTER)NULL;
46 HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
48 #if HALMAC_PLATFORM_WINDOWS == 1
55 } ENDIAN_CHECK = { 0x01000000 };
57 status = halmac_check_platform_api(pDriver_adapter, halmac_interface, pHalmac_platform_api);
58 if (HALMAC_RET_SUCCESS != 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);
65 pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_init_adapter_88xx ==========>\n");
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;
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;
80 /* return halmac adapter address to caller */
81 *ppHalmac_adapter = pHalmac_adapter;
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;
88 PLATFORM_MUTEX_INIT(pDriver_adapter, &(pHalmac_adapter->EfuseMutex));
89 PLATFORM_MUTEX_INIT(pDriver_adapter, &(pHalmac_adapter->h2c_seq_mutex));
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);
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);
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)));
102 polling_count = HALMAC_POLLING_READY_TIMEOUT_COUNT;
103 while (!(pHalmac_platform_api->SDIO_CMD52_READ(pDriver_adapter, REG_SDIO_HSUS_CTRL) & 0x02)) {
105 if (polling_count == 0)
106 return HALMAC_RET_SDIO_LEAVE_SUSPEND_FAIL;
109 chip_id = pHalmac_platform_api->SDIO_CMD52_READ(pDriver_adapter, REG_SYS_CFG2);
111 chip_id = pHalmac_platform_api->REG_READ_8(pDriver_adapter, REG_SYS_CFG2);
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);
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);
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);
135 /* Return halmac API function pointer */
136 *ppHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
138 PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_init_adapter_88xx <==========\n");
144 * halmac_halt_api() - halt all halmac api
147 * Return : HALMAC_RET_STATUS
151 IN PHALMAC_ADAPTER pHalmac_adapter
154 VOID *pDriver_adapter = NULL;
155 PHALMAC_PLATFORM_API pHalmac_platform_api = (PHALMAC_PLATFORM_API)NULL;
157 if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
158 return HALMAC_RET_ADAPTER_INVALID;
160 pDriver_adapter = pHalmac_adapter->pDriver_adapter;
161 pHalmac_platform_api = pHalmac_adapter->pHalmac_platform_api;
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;
170 * halmac_deinit_adapter() - deinit halmac adapter
172 * Author : KaiYuan Chang
173 * Return : HALMAC_RET_STATUS
176 halmac_deinit_adapter(
177 IN PHALMAC_ADAPTER pHalmac_adapter
180 VOID *pDriver_adapter = NULL;
181 PHALMAC_PLATFORM_API pHalmac_platform_api = (PHALMAC_PLATFORM_API)NULL;
183 if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
184 return HALMAC_RET_ADAPTER_INVALID;
186 pDriver_adapter = pHalmac_adapter->pDriver_adapter;
187 pHalmac_platform_api = pHalmac_adapter->pHalmac_platform_api;
189 PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_deinit_adapter_88xx ==========>\n");
191 PLATFORM_MUTEX_DEINIT(pDriver_adapter, &(pHalmac_adapter->EfuseMutex));
192 PLATFORM_MUTEX_DEINIT(pDriver_adapter, &(pHalmac_adapter->h2c_seq_mutex));
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;
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;
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;
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;
215 return HALMAC_RET_SUCCESS;
219 * halmac_check_platform_api() - check platform api pointers
221 * @halmac_interface : PCIE, USB or SDIO
222 * @pHalmac_platform_api
223 * Author : KaiYuan Chang
224 * Return : 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
233 VOID *pAdapter_Local = NULL;
235 pAdapter_Local = pDriver_adapter;
237 if (NULL == pHalmac_platform_api)
238 return HALMAC_RET_PLATFORM_API_NULL;
240 if (NULL == pHalmac_platform_api->MSG_PRINT)
241 return HALMAC_RET_PLATFORM_API_NULL;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
348 pHalmac_platform_api->MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_check_platform_api ==========>\n");
350 return HALMAC_RET_SUCCESS;
355 OUT HALMAC_VER * version
358 version->major_ver = (u8)HALMAC_MAJOR_VER;
359 version->prototype_ver = (u8)HALMAC_PROTOTYPE_VER;
360 version->minor_ver = (u8)HALMAC_MINOR_VER;
362 return HALMAC_RET_SUCCESS;