156 lines
4.7 KiB
C
156 lines
4.7 KiB
C
/****************************************************************************
|
|
|
|
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
|
|
|
|
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
|
|
be copied by any method or incorporated into another program without
|
|
the express written consent of Aerospace C.Power. This Information or any portion
|
|
thereof remains the property of Aerospace C.Power. The Information contained herein
|
|
is believed to be accurate and Aerospace C.Power assumes no responsibility or
|
|
liability for its use in any way and conveys no license or title under
|
|
any patent or copyright and makes no representation or warranty that this
|
|
Information is free from patent or copyright infringement.
|
|
|
|
****************************************************************************/
|
|
|
|
#include "mac_rf_pdev.h"
|
|
#include "iot_errno.h"
|
|
#include "iot_config.h"
|
|
#if HW_PLATFORM == HW_PLATFORM_SIMU
|
|
#include "simulator_txrx.h"
|
|
#endif
|
|
#include "mac_pdev.h"
|
|
#include "mac_rf_rx_hw.h"
|
|
#include "mac_rf_tx_hw.h"
|
|
#include "plc_const.h"
|
|
#include "mac_msg.h"
|
|
#include "mac.h"
|
|
#include "iot_io.h"
|
|
#include "mac_rf_vdev.h"
|
|
#include "iot_system.h"
|
|
|
|
#if HPLC_RF_DEV_SUPPORT
|
|
#include "mac_rf_rx_buf_ring.h"
|
|
|
|
extern uint32_t g_fw_mode;
|
|
static iot_mem_pool_t* g_mac_rf_pdev_pool;
|
|
|
|
void mac_set_rf_pdev_tx_comp(mac_rf_pdev_t *rf_pdev, \
|
|
mac_rf_tx_hw_comp_t tx_comp_cb)
|
|
{
|
|
IOT_ASSERT(rf_pdev);
|
|
rf_pdev->tx_comp = tx_comp_cb;
|
|
}
|
|
|
|
void mac_set_rf_pdev_rx_cb(mac_rf_pdev_t *rf_pdev, \
|
|
mac_rf_rx_t rx_cb)
|
|
{
|
|
IOT_ASSERT(rf_pdev);
|
|
rf_pdev->rx = rx_cb;
|
|
}
|
|
|
|
uint32_t mac_rf_pdev_init(pdevid_t pdev_id)
|
|
{
|
|
mac_rf_pdev_t *rf_pdev = NULL;
|
|
|
|
if (pdev_id >= MAX_PDEV_NUM) {
|
|
return ERR_INVAL;
|
|
}
|
|
mac_pdev_t *pdev = get_pdev_ptr(pdev_id);
|
|
if (!pdev) {
|
|
return ERR_INVAL;
|
|
}
|
|
|
|
if(!pdev->mac_rf_pdev) {
|
|
/* create global pdev pool */
|
|
iot_mem_pool_new(PLC_MAC_RF_MID, MAX_RF_PDEV_NUM, \
|
|
sizeof(mac_rf_pdev_t), \
|
|
&g_mac_rf_pdev_pool, 0);
|
|
}
|
|
|
|
if(!pdev->mac_rf_pdev) {
|
|
/* alloc a pdev */
|
|
rf_pdev = iot_mem_pool_alloc(g_mac_rf_pdev_pool);
|
|
rf_pdev->rf_pdev_id = RF_PDEV_ID;
|
|
rf_pdev->parent_pdev_id = pdev_id;
|
|
|
|
/* init vdev pool in the pdev */
|
|
if (iot_mem_pool_init(PLC_MAC_RF_MID, MAX_RF_VDEV_NUM,
|
|
sizeof(mac_rf_vdev_t), &rf_pdev->rf_vdev_pool, 0) != 0) {
|
|
return ERR_NOMEM;
|
|
}
|
|
rf_pdev->cur_rf_vdev_num = 0;
|
|
|
|
pdev->mac_rf_pdev = rf_pdev;
|
|
}
|
|
rf_pdev = pdev->mac_rf_pdev;
|
|
|
|
/* register tx callback */
|
|
mac_set_rf_pdev_tx_comp(pdev->mac_rf_pdev, mac_rf_tx_hw_mpdu_comp);
|
|
|
|
if (g_fw_mode != FTM_MODE) {
|
|
/* register rx callback */
|
|
mac_set_rf_pdev_rx_cb(pdev->mac_rf_pdev, mac_rf_rx_hw_mpdu);
|
|
} else {
|
|
/* register rx callback */
|
|
mac_set_rf_pdev_rx_cb(pdev->mac_rf_pdev, mac_rf_rx_hw_mpdu_internal);
|
|
}
|
|
|
|
#if HW_PLATFORM == HW_PLATFORM_SIMU
|
|
/* init simulator layer */
|
|
simulator_init_ex(&rf_pdev->simu, rf_pdev,
|
|
NULL, NULL, mac_rf_tx_hw_mpdu_comp,
|
|
NULL, NULL, mac_rf_rx_hw_mpdu, WORKMODE_RF);
|
|
#else
|
|
/* init chip tx rx */
|
|
mac_rf_tx_hw_init(pdev->mac_rf_pdev);
|
|
mac_rf_rx_hw_init();
|
|
#endif
|
|
|
|
if (g_fw_mode != FTM_MODE) {
|
|
/* init hwq & ring for each pdev */
|
|
mac_rf_rx_ring_ctxt_init(&rf_pdev->ring_hdl);
|
|
#if HW_PLATFORM == HW_PLATFORM_SIMU
|
|
simu_set_rx_ring_ptr(&rf_pdev->simu, &rf_pdev->ring_hdl.ring[0]);
|
|
#endif
|
|
|
|
mac_rf_q_init(&rf_pdev->hwq_hdl);
|
|
|
|
/* BCN */
|
|
mac_rf_q_alloc_hwq(&rf_pdev->hwq_hdl,
|
|
mac_rf_q_get_swq_type(PLC_BCN_REGION_BCN, (lid_t)0, 0));
|
|
|
|
/* CSMA */
|
|
mac_rf_q_alloc_hwq(&rf_pdev->hwq_hdl,
|
|
mac_rf_q_get_swq_type(PLC_BCN_REGION_CSMA, (lid_t)0, 0));
|
|
#if !ENA_RF_ONLY_ONE_CSMA_HWQ
|
|
mac_rf_q_alloc_hwq(&rf_pdev->hwq_hdl,
|
|
mac_rf_q_get_swq_type(PLC_BCN_REGION_CSMA, (lid_t)1, 0));
|
|
mac_rf_q_alloc_hwq(&rf_pdev->hwq_hdl,
|
|
mac_rf_q_get_swq_type(PLC_BCN_REGION_CSMA, (lid_t)2, 0));
|
|
mac_rf_q_alloc_hwq(&rf_pdev->hwq_hdl,
|
|
mac_rf_q_get_swq_type(PLC_BCN_REGION_CSMA, (lid_t)3, 0));
|
|
mac_rf_q_alloc_hwq(&rf_pdev->hwq_hdl,
|
|
mac_rf_q_get_swq_type(PLC_BCN_REGION_CSMA, (lid_t)3, 1));
|
|
#endif
|
|
/* BCSMA */
|
|
mac_rf_q_alloc_hwq(&rf_pdev->hwq_hdl,
|
|
mac_rf_q_get_swq_type(PLC_BCN_REGION_BCSMA, (lid_t)4, 0));
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
mac_rf_pdev_t * IRAM_ATTR get_rf_pdev_ptr(uint32_t plc_pdev_id,
|
|
uint32_t rf_pdev_id)
|
|
{
|
|
if (rf_pdev_id >= MAX_RF_PDEV_NUM) {
|
|
IOT_ASSERT(0);
|
|
return NULL;
|
|
}
|
|
mac_pdev_t *plc_pdev = get_pdev_ptr(plc_pdev_id);
|
|
return plc_pdev->mac_rf_pdev;
|
|
}
|
|
|
|
#endif /* HPLC_RF_DEV_SUPPORT */
|