MCUXpresso_MIMXRT1021xxxxx/middleware/wifi_nxp/wifidriver/mlan_shim.c
Yilin Sun 1cf36afbfa
Updated to SDK v2.14.0
Signed-off-by: Yilin Sun <imi415@imi.moe>
2023-08-31 23:30:31 +08:00

310 lines
9.3 KiB
C

/** @file mlan_shim.c
*
* @brief This file provides APIs to MOAL module
*
* Copyright 2008-2023 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*
*/
/**
* @mainpage MLAN Driver
*
* @section overview_sec Overview
*
* The MLAN is an OS independent WLAN driver for NXP 802.11
* embedded chipset.
*/
/********************************************************
Change log:
10/13/2008: initial version
********************************************************/
#include <mlan_api.h>
/* Additional WMSDK header files */
#include <wmerrno.h>
#include <wm_os.h>
/* Always keep this include at the end of all include files */
#include <mlan_remap_mem_operations.h>
/********************************************************
Local Variables
********************************************************/
/********************************************************
Global Variables
********************************************************/
static mlan_operations mlan_sta_ops = {
/* cmd handler */
wlan_ops_sta_prepare_cmd,
/* rx handler */
wlan_ops_sta_process_rx_packet,
/* BSS role: STA */
MLAN_BSS_ROLE_STA,
};
static mlan_operations mlan_uap_ops = {
/* cmd handler */
wlan_ops_uap_prepare_cmd,
/* rx handler */
/* wlan_ops_uap_process_rx_packet, */ NULL,
/* BSS role: uAP */
MLAN_BSS_ROLE_UAP,
};
/** mlan function table */
static mlan_operations *mlan_ops[] = {
&mlan_sta_ops,
&mlan_uap_ops,
MNULL,
};
/** Global moal_assert callback */
t_void (*assert_callback)(IN t_void *pmoal_handle, IN t_u32 cond) = MNULL;
#ifdef DEBUG_LEVEL1
#ifdef DEBUG_LEVEL2
#define DEFAULT_DEBUG_MASK (0xffffffffU)
#else
#define DEFAULT_DEBUG_MASK (MMSG | MFATAL | MERROR)
#endif
/** Global moal_print callback */
t_void (*print_callback)(IN t_void *pmoal_handle, IN t_u32 level, IN t_s8 *pformat, IN...) = MNULL;
/** Global moal_get_system_time callback */
mlan_status (*get_sys_time_callback)(IN t_void *pmoal_handle, OUT t_u32 *psec, OUT t_u32 *pusec) = MNULL;
/** Global driver debug mit masks */
t_u32 drvdbg = DEFAULT_DEBUG_MASK;
#endif
/********************************************************
Local Functions
*******************************************************/
/********************************************************
Global Functions
********************************************************/
/**
* @brief This function registers MOAL to MLAN module.
*
* @param pmdevice A pointer to a mlan_device structure
* allocated in MOAL
* @param ppmlan_adapter A pointer to a t_void pointer to store
* mlan_adapter structure pointer as the context
*
* @return MLAN_STATUS_SUCCESS
* The registration succeeded.
* MLAN_STATUS_FAILURE
* The registration failed.
*
* mlan_status mlan_register (
* IN pmlan_device pmdevice,
* OUT t_void **ppmlan_adapter
* );
*
* Comments
* MOAL constructs mlan_device data structure to pass moal_handle and
* mlan_callback table to MLAN. MLAN returns mlan_adapter pointer to
* the ppmlan_adapter buffer provided by MOAL.
* Headers:
* declared in mlan_decl.h
* See Also
* mlan_unregister
*/
mlan_status mlan_register(IN pmlan_device pmdevice, OUT t_void **ppmlan_adapter)
{
mlan_status ret = MLAN_STATUS_SUCCESS;
pmlan_adapter pmadapter = MNULL;
pmlan_callbacks pcb = MNULL;
t_u8 i = 0;
t_u32 j = 0;
MASSERT(pmdevice);
MASSERT(ppmlan_adapter);
/* MASSERT(pmdevice->callbacks.moal_print); */
#ifdef DEBUG_LEVEL1
print_callback = pmdevice->callbacks.moal_print;
get_sys_time_callback = pmdevice->callbacks.moal_get_system_time;
#endif
/* assert_callback = pmdevice->callbacks.moal_assert; */
ENTER();
MASSERT(pmdevice->callbacks.moal_malloc);
/* MASSERT(pmdevice->callbacks.moal_memset); */
/* MASSERT(pmdevice->callbacks.moal_memmove); */
/* Allocate memory for adapter structure */
if ((pmdevice->callbacks.moal_malloc(/* pmdevice->pmoal_handle */ NULL, sizeof(mlan_adapter), MLAN_MEM_DEF,
(t_u8 **)(void **)&pmadapter) != MLAN_STATUS_SUCCESS) ||
(pmadapter == MNULL))
{
ret = MLAN_STATUS_FAILURE;
goto exit_register;
}
(void)__memset(pmadapter, pmadapter, 0, sizeof(mlan_adapter));
pcb = &pmadapter->callbacks;
/* Save callback functions */
(void)__memmove(pmadapter->pmoal_handle, pcb, &pmdevice->callbacks, sizeof(mlan_callbacks));
pmadapter->priv_num = 0;
for (i = 0; i < MLAN_MAX_BSS_NUM; i++)
{
pmadapter->priv[i] = MNULL;
if (pmdevice->bss_attr[i].active == MTRUE)
{
/* For valid bss_attr, allocate memory for private structure */
if ((pcb->moal_malloc(pmadapter->pmoal_handle, sizeof(mlan_private), MLAN_MEM_DEF,
(t_u8 **)(void **)&pmadapter->priv[i]) != MLAN_STATUS_SUCCESS) ||
(pmadapter->priv[i] == MNULL))
{
ret = MLAN_STATUS_FAILURE;
goto error;
}
pmadapter->priv_num++;
(void)__memset(pmadapter, pmadapter->priv[i], 0, sizeof(mlan_private));
pmadapter->priv[i]->adapter = pmadapter;
/* Save bss_type, frame_type & bss_priority */
pmadapter->priv[i]->bss_type = pmdevice->bss_attr[i].bss_type;
pmadapter->priv[i]->frame_type = (t_u8)pmdevice->bss_attr[i].frame_type;
pmadapter->priv[i]->bss_priority = (t_u8)pmdevice->bss_attr[i].bss_priority;
if (pmdevice->bss_attr[i].bss_type == MLAN_BSS_TYPE_STA)
{
pmadapter->priv[i]->bss_role = MLAN_BSS_ROLE_STA;
pmadapter->priv[i]->bss_mode = MLAN_BSS_MODE_INFRA;
}
else if (pmdevice->bss_attr[i].bss_type == MLAN_BSS_TYPE_UAP)
{
pmadapter->priv[i]->bss_role = MLAN_BSS_ROLE_UAP;
pmadapter->priv[i]->bss_mode = MLAN_BSS_MODE_AUTO;
}
else
{
/*Do Nothing*/
}
/* Save bss_index and bss_num */
pmadapter->priv[i]->bss_index = i;
pmadapter->priv[i]->bss_num = (t_u8)pmdevice->bss_attr[i].bss_num;
/* init function table */
for (j = 0; mlan_ops[j] != MNULL; j++)
{
if (mlan_ops[j]->bss_role == GET_BSS_ROLE(pmadapter->priv[i]))
{
(void)__memcpy(pmadapter, &pmadapter->priv[i]->ops, mlan_ops[j], sizeof(mlan_operations));
}
}
}
}
/* Initialize lock variables */
if (wlan_init_lock_list(pmadapter) != MLAN_STATUS_SUCCESS)
{
ret = MLAN_STATUS_FAILURE;
goto error;
}
/* Allocate memory for member of adapter structure */
if (wlan_allocate_adapter(pmadapter) != MLAN_STATUS_SUCCESS)
{
ret = MLAN_STATUS_FAILURE;
goto error;
}
/* Return pointer of mlan_adapter to MOAL */
*ppmlan_adapter = pmadapter;
goto exit_register;
error:
PRINTM(MINFO, "Leave mlan_register with error\n");
(void)pcb->moal_mfree(pmadapter->pmoal_handle, (t_u8 *)pmadapter);
exit_register:
LEAVE();
return ret;
}
/**
* @brief This function unregisters MOAL from MLAN module.
*
* @param pmlan_adapter A pointer to a mlan_device structure
* allocated in MOAL
*
* @return MLAN_STATUS_SUCCESS
* The deregistration succeeded.
*/
MLAN_API mlan_status mlan_unregister(IN t_void *pmlan_adapter)
{
mlan_status ret = MLAN_STATUS_SUCCESS;
mlan_adapter *pmadapter = (mlan_adapter *)pmlan_adapter;
pmlan_callbacks pcb;
t_s32 i = 0;
MASSERT(pmlan_adapter);
ENTER();
pcb = &pmadapter->callbacks;
wlan_free_adapter(pmadapter);
/* Free private structures */
for (i = 0; i < MIN(pmadapter->priv_num, MLAN_MAX_BSS_NUM); i++)
{
if (pmadapter->priv[i] != MNULL)
{
(void)pcb->moal_mfree(pmadapter->pmoal_handle, (t_u8 *)pmadapter->priv[i]);
pmadapter->priv[i] = MNULL;
}
}
/* Free mlan_adapter */
(void)pcb->moal_mfree(pmadapter->pmoal_handle, (t_u8 *)pmadapter);
LEAVE();
return ret;
}
/**
* @brief This function initializes the firmware
*
* @param pmlan_adapter A pointer to a t_void pointer to store
* mlan_adapter structure pointer
*
* @return MLAN_STATUS_SUCCESS
* The firmware initialization succeeded.
* MLAN_STATUS_PENDING
* The firmware initialization is pending.
* MLAN_STATUS_FAILURE
* The firmware initialization failed.
*/
mlan_status mlan_init_fw(IN t_void *pmlan_adapter)
{
mlan_status ret = MLAN_STATUS_SUCCESS;
mlan_adapter *pmadapter = (mlan_adapter *)pmlan_adapter;
ENTER();
MASSERT(pmlan_adapter);
/* pmadapter->hw_status = WlanHardwareStatusInitializing; */
/* Initialize firmware, may return PENDING */
ret = wlan_init_fw(pmadapter);
PRINTM(MINFO, "wlan_init_fw returned ret=0x%x\n", ret);
LEAVE();
return ret;
}