Files
kunlun/plc/halmac/pdev/mac_rf_pdev.c
2024-09-28 14:24:04 +08:00

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 */