962 lines
31 KiB
C
Executable File
962 lines
31 KiB
C
Executable File
/****************************************************************************
|
|
|
|
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.
|
|
|
|
****************************************************************************/
|
|
|
|
/* os shim includes */
|
|
#include "iot_config.h"
|
|
#include "os_types.h"
|
|
#include "hw_reg_api.h"
|
|
#include "iot_mem.h"
|
|
|
|
/* plc public api includes */
|
|
#include "plc_fr.h"
|
|
#include "plc_const.h"
|
|
#include "iot_bitops.h"
|
|
|
|
/* driver includes */
|
|
#include "iot_irq.h"
|
|
#include "iot_gpio_api.h"
|
|
#include "iot_board_api.h"
|
|
#include "pin_rf.h"
|
|
|
|
#include "mpdu_header.h"
|
|
#include "mac_sys_reg.h"
|
|
#include "plc_protocol.h"
|
|
#include "mac_raw_reg.h"
|
|
#include "mac_rawdata_hw.h"
|
|
#include "phy_reg.h"
|
|
#include "phy_bb.h"
|
|
#include "phy_phase.h"
|
|
#include "phy_isr.h"
|
|
#include "ahb.h"
|
|
#include "cpl_types_api.h"
|
|
|
|
#include "phy_api_cpu1.h"
|
|
|
|
#include "hw_phy_api.h"
|
|
|
|
#if ENA_WAR_440
|
|
#include "mac_hwq_reg.h"
|
|
#include "command_list.h"
|
|
#include "mac_hwq_mgr.h"
|
|
#include "mac_rx_buf_ring.h"
|
|
#endif
|
|
|
|
#include "mac_txq_hw.h"
|
|
|
|
#if ENA_SW_SYNC_PPM_WAR
|
|
#include "phy_multi_ppm.h"
|
|
#endif
|
|
#include "mac_cmn_hw.h"
|
|
|
|
phy_cpu_share_ctxt_t g_phy_cpu_share_ctxt = {0};
|
|
|
|
void phy_get_original_fc(uint32_t *fc)
|
|
{
|
|
*(fc + 0) = RGF_RAW_READ_REG(CFG_TX_RAW_FC_0_ADDR);
|
|
*(fc + 1) = RGF_RAW_READ_REG(CFG_TX_RAW_FC_1_ADDR);
|
|
*(fc + 2) = RGF_RAW_READ_REG(CFG_TX_RAW_FC_2_ADDR);
|
|
*(fc + 3) = RGF_RAW_READ_REG(CFG_TX_RAW_FC_3_ADDR);
|
|
}
|
|
|
|
void phy_get_after_war_fc(uint32_t *fc)
|
|
{
|
|
*(fc + 0) = RGF_RAW_READ_REG(CFG_TX_FC_DATA0_ADDR);
|
|
*(fc + 1) = RGF_RAW_READ_REG(CFG_TX_FC_DATA1_ADDR);
|
|
*(fc + 2) = RGF_RAW_READ_REG(CFG_TX_FC_DATA2_ADDR);
|
|
*(fc + 3) = RGF_RAW_READ_REG(CFG_TX_FC_DATA3_ADDR);
|
|
}
|
|
|
|
void phy_rawdata_war_phy_pbsz(void)
|
|
{
|
|
#if HW_PLATFORM >= HW_PLATFORM_FPGA
|
|
uint32_t fc[4];
|
|
uint32_t delimiter_type = 0;
|
|
uint32_t proto = PHY_PROTO_TYPE_GET();
|
|
tx_fc_msg_t msg;
|
|
iot_memset(&msg, 0, sizeof(tx_fc_msg_t));
|
|
/* get original tx fc */
|
|
phy_get_original_fc(fc);
|
|
delimiter_type = mac_get_delimi_from_fc(proto, fc);
|
|
if (FC_DELIM_BEACON == delimiter_type || \
|
|
FC_DELIM_SOF == delimiter_type) {
|
|
mac_get_tx_msg_from_fc(proto, delimiter_type, fc, &msg);
|
|
phy_rawdata_bb_set_tmi(proto, msg.tmi, msg.ext_tmi);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
//TODO: this function may be in mac layer, then phy layer code callback it
|
|
#if ENA_WAR_440
|
|
static volatile uint64_t g_pre_bcn_end_ntb = 0;
|
|
void phy_war_tx_fl_overflow(void)
|
|
{
|
|
hw_sched_cmd_t *cmd;
|
|
uint32_t cur_ntb, bcn_start_ntb;
|
|
uint32_t fl = 0;
|
|
uint32_t fc[4];
|
|
uint64_t slot_end_ntb = 0, mpdu_end_ntb = 0, tmp;
|
|
#if SUPPORT_SMART_GRID
|
|
frame_control_t *sg_fc;
|
|
#endif
|
|
do {
|
|
/* first get current ntb */
|
|
cur_ntb = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
|
|
cmd = (hw_sched_cmd_t *)RGF_HWQ_READ_REG(CFG_SCH_CUR_PTR_ADDR);
|
|
bcn_start_ntb = RGF_MAC_READ_REG(CFG_BCN_START_NTB_ADDR);
|
|
fc[0] = RGF_RAW_READ_REG(CFG_TX_FC_DATA0_ADDR);
|
|
fc[1] = RGF_RAW_READ_REG(CFG_TX_FC_DATA1_ADDR);
|
|
fc[2] = RGF_RAW_READ_REG(CFG_TX_FC_DATA2_ADDR);
|
|
fc[3] = RGF_RAW_READ_REG(CFG_TX_FC_DATA3_ADDR);
|
|
|
|
//TODO: will check all sch cmd list. only endtime sch cmd now.
|
|
tmp = cmd->t_info.e.end_t;//unit: 1ms
|
|
//slot_end_ntb = bcn_start_ntb + (slot_end * 1000 * 25)
|
|
slot_end_ntb = (tmp << 14) + (tmp << 13) + (tmp << 8) \
|
|
+ (tmp << 7) + (tmp << 5) + (tmp << 3) + bcn_start_ntb;
|
|
|
|
//get frame len, unit:us
|
|
#if SUPPORT_SMART_GRID
|
|
sg_fc = (frame_control_t *)fc;
|
|
if (FC_DELIM_SOF == sg_fc->delimiter_type) {
|
|
/* TODO: this way not yet test. if start this war, need test!! */
|
|
/* get the real hw band id
|
|
* 1. get hwq id.
|
|
* 2. get desc.
|
|
*/
|
|
/* 1.get hwq id */
|
|
mac_set_debug_reg(0x50);
|
|
uint32_t reg = mac_rx_get_debug_reg();
|
|
uint32_t hwq_id = iot_bitops_ffs(reg & 0x1f) - 1;
|
|
IOT_ASSERT(hwq_id >= 0 && hwq_id <= 4)
|
|
/* 2.get desc */
|
|
uint32_t addr_step = CFG_RO_DCU1_CUR_PTR_ADDR -
|
|
CFG_RO_DCU0_CUR_PTR_ADDR;
|
|
uint32_t desc_addr = CFG_RO_DCU0_CUR_PTR_ADDR + hwq_id * addr_step;
|
|
tx_mpdu_start *desc = (tx_mpdu_start *)desc_addr;
|
|
uint32_t hw_band_id = desc->sg_bandsel;
|
|
|
|
/* sof packet frame len = preamble + fc + payload + sof.frame_len*/
|
|
/* broadcast: sof.frame_len = payload + cifs */
|
|
/* unicast: sof.frame_len = payload + rifs + sack_frame_len + cifs*/
|
|
/* for sof, the sof.frame_len has been filled in by sw/hw, */
|
|
/* and function mac_rx_get_delim() returns the */
|
|
/* (preamble + fc) len in different rate mod */
|
|
//TODO: maybe not rate0 always!
|
|
fl = (sg_fc->vf.sof.frame_len * 10) + \
|
|
mac_rx_get_delim(0, hw_band_id);
|
|
}
|
|
else {
|
|
//TODO: maybe need check beacon/nncco/sack
|
|
break;
|
|
}
|
|
#endif
|
|
#if SUPPORT_SOUTHERN_POWER_GRID
|
|
//TODO: add code
|
|
#endif
|
|
#if SUPPORT_GREEN_PHY
|
|
//TODO: add code
|
|
#endif
|
|
|
|
mpdu_end_ntb = cur_ntb;
|
|
//check bcn slot update
|
|
if (cur_ntb < bcn_start_ntb) {
|
|
/* cur ntb < bcn start reg update ntb < new bcn start ntb */
|
|
if ((cur_ntb < g_phy_cpu_share_ctxt.bcn_start_update_ntb) && \
|
|
(g_phy_cpu_share_ctxt.bcn_start_update_ntb < bcn_start_ntb)) {
|
|
/* cur ntb around */
|
|
mpdu_end_ntb <<= 32;
|
|
}
|
|
else {
|
|
/* the bcn slot has been updated, use old slot end time */
|
|
slot_end_ntb = g_pre_bcn_end_ntb;
|
|
}
|
|
}
|
|
//mpdu_end_ntb = cur_ntb + fl * 25
|
|
tmp = fl;
|
|
mpdu_end_ntb += (tmp << 4) + (tmp << 3) + tmp;
|
|
|
|
if (mpdu_end_ntb > slot_end_ntb) {
|
|
g_phy_cpu_share_ctxt.tx_underflow_cnt++;
|
|
mac_cfg_phy_tx_underflow_force();
|
|
}
|
|
} while (0);
|
|
|
|
g_pre_bcn_end_ntb = slot_end_ntb;
|
|
}
|
|
#endif
|
|
|
|
/* TODO: use macro distinguish WARID, as WAR_BUGID_244 in iot_config.h */
|
|
uint32_t phy_get_hw_interrupt_type_cpu1(void)
|
|
{
|
|
#if HW_PLATFORM >= HW_PLATFORM_FPGA
|
|
uint32_t irq_type_reg = 0;
|
|
uint32_t irq_type = 0;
|
|
|
|
/* get int 3 mask */
|
|
irq_type_reg = PHY_READ_REG(CFG_BB_INT_MASK_3_ADDR);
|
|
if (irq_type_reg & PHY_RECV_FD_FC_OK) {
|
|
irq_type |= INTR_TYPE_PHY_FD_FC_OK;
|
|
}
|
|
|
|
if (irq_type_reg & PHY_RECV_FD_FC_FAIL) {
|
|
irq_type |= INTR_TYPE_PHY_FD_FC_FAIL;
|
|
}
|
|
|
|
if (irq_type_reg & PHY_TX_FD_TX_DONE) {
|
|
irq_type |= INTR_TYPE_PHY_TX_FD_TX_DONE;;
|
|
}
|
|
|
|
if (irq_type_reg & PHY_FD_TX_ABORT) {
|
|
irq_type |= INTR_TYPE_PHY_FD_TX_ABORT;;
|
|
}
|
|
#if ENA_WAR_244
|
|
if (irq_type_reg & PHY_FD_TX_STUCK) {
|
|
irq_type |= INTR_TYPE_PHY_FD_TX_STUCK;;
|
|
}
|
|
|
|
if (irq_type_reg & PHY_TX_TD_START) {
|
|
irq_type |= INTR_TYPE_PHY_TX_TD_START;;
|
|
}
|
|
#endif
|
|
|
|
#if ENA_WAR_NSG_EXTMI || MAC_SYM_NUM_FIX
|
|
if (irq_type_reg & PHY_RECV_FD_CH_EST_DONE) {
|
|
irq_type |= INTR_TYPE_PHY_FD_CH_EST_DONE;
|
|
}
|
|
#endif/* ENA_WAR_NSG_EXTMI || MAC_SYM_NUM_FIX */
|
|
|
|
#if ENA_WAR_NSG_EXTMI
|
|
if (irq_type_reg & PHY_RECV_FD_PB_OK) {
|
|
irq_type |= INTR_TYPE_PHY_FD_PB_OK;
|
|
}
|
|
if (irq_type_reg & PHY_RECV_FD_PB_FAIL) {
|
|
irq_type |= INTR_TYPE_PHY_FD_PB_FAIL;
|
|
}
|
|
if (irq_type_reg & PHY_RECV_FC_RAW_RECEIVE) {
|
|
irq_type |= INTR_TYPE_PHY_FC_RAW_RECEIVE;
|
|
}
|
|
#endif/* ENA_WAR_NSG_EXTMI */
|
|
|
|
#if (ENA_WAR_NSG_EXTMI || ENA_SW_SYNC_PPM_WAR)
|
|
if (irq_type_reg & PHY_TX_FD_INSERT_PREAM_DONE) {
|
|
irq_type |= INTR_TYPE_PHY_INSERT_PREAM_DONE;
|
|
}
|
|
#endif
|
|
|
|
if (irq_type_reg & PHY_TX_TD_FC_DONE) {
|
|
irq_type |= INTR_TYPE_PHY_TX_TD_FC_DONE;
|
|
}
|
|
|
|
#if MAC_SYM_NUM_FIX || MAC_TIMESTAMPING || ENA_CCO_RX_THR_PHASE_CHANGE
|
|
if (irq_type_reg & PHY_RECV_FD_PLD_OK) {
|
|
irq_type |= INTR_TYPE_PHY_FD_PLD_OK;
|
|
}
|
|
|
|
if (irq_type_reg & PHY_RECV_FD_PLD_FAIL) {
|
|
irq_type |= INTR_TYPE_PHY_FD_PLD_FAIL;
|
|
}
|
|
#endif
|
|
|
|
return irq_type;
|
|
#else
|
|
return 0;
|
|
#endif
|
|
}
|
|
|
|
void phy_disable_hw_interrupt_cpu1(uint32_t irq_type)
|
|
{
|
|
#if HW_PLATFORM >= HW_PLATFORM_FPGA
|
|
uint32_t reg_int = 0;
|
|
|
|
/* disable int 3 */
|
|
reg_int = PHY_READ_REG(CFG_BB_INT_EN_3_ADDR);
|
|
if (irq_type & INTR_TYPE_PHY_FD_FC_OK) {
|
|
reg_int &= (~PHY_RECV_FD_FC_OK);
|
|
}
|
|
if (irq_type & INTR_TYPE_PHY_FD_FC_FAIL) {
|
|
reg_int &= (~PHY_RECV_FD_FC_FAIL);
|
|
}
|
|
if (irq_type & INTR_TYPE_PHY_TX_FD_TX_DONE) {
|
|
reg_int &= (~PHY_TX_FD_TX_DONE);
|
|
}
|
|
if (irq_type & INTR_TYPE_PHY_FD_TX_ABORT) {
|
|
reg_int &= (~PHY_FD_TX_ABORT);
|
|
}
|
|
#if ENA_WAR_244
|
|
if (irq_type & INTR_TYPE_PHY_FD_TX_STUCK) {
|
|
reg_int &= (~PHY_FD_TX_STUCK);
|
|
}
|
|
if (irq_type & INTR_TYPE_PHY_TX_TD_START) {
|
|
reg_int &= (~PHY_TX_TD_START);
|
|
}
|
|
#endif
|
|
|
|
#if ENA_WAR_NSG_EXTMI || MAC_SYM_NUM_FIX
|
|
if (irq_type & INTR_TYPE_PHY_FD_CH_EST_DONE) {
|
|
reg_int &= (~PHY_RECV_FD_CH_EST_DONE);
|
|
}
|
|
#endif/* ENA_WAR_NSG_EXTMI || MAC_SYM_NUM_FIX */
|
|
|
|
#if ENA_WAR_NSG_EXTMI
|
|
|
|
if (irq_type & INTR_TYPE_PHY_FD_PB_OK) {
|
|
reg_int &= (~PHY_RECV_FD_PB_OK);
|
|
}
|
|
if (irq_type & INTR_TYPE_PHY_FD_PB_FAIL) {
|
|
reg_int &= (~PHY_RECV_FD_PB_FAIL);
|
|
}
|
|
if (irq_type & INTR_TYPE_PHY_FC_RAW_RECEIVE) {
|
|
reg_int &= (~PHY_RECV_FC_RAW_RECEIVE);
|
|
}
|
|
#endif/* ENA_WAR_NSG_EXTMI */
|
|
|
|
#if (ENA_WAR_NSG_EXTMI || ENA_SW_SYNC_PPM_WAR)
|
|
if (irq_type & INTR_TYPE_PHY_INSERT_PREAM_DONE) {
|
|
reg_int &= (~PHY_TX_FD_INSERT_PREAM_DONE);
|
|
}
|
|
#endif
|
|
|
|
if (irq_type & INTR_TYPE_PHY_TX_TD_FC_DONE) {
|
|
reg_int &= (~PHY_TX_TD_FC_DONE);
|
|
}
|
|
|
|
#if MAC_SYM_NUM_FIX || MAC_TIMESTAMPING || ENA_CCO_RX_THR_PHASE_CHANGE
|
|
if (irq_type & INTR_TYPE_PHY_FD_PLD_OK) {
|
|
reg_int &= (~PHY_RECV_FD_PLD_OK);
|
|
}
|
|
if (irq_type & INTR_TYPE_PHY_FD_PLD_FAIL) {
|
|
reg_int &= (~PHY_RECV_FD_PLD_FAIL);
|
|
}
|
|
#endif
|
|
PHY_WRITE_REG(CFG_BB_INT_EN_3_ADDR, reg_int);
|
|
|
|
#else
|
|
(void)irq_type;
|
|
#endif
|
|
return;
|
|
}
|
|
|
|
void phy_clear_hw_interrupt_cpu1(uint32_t irq_type)
|
|
{
|
|
#if HW_PLATFORM >= HW_PLATFORM_FPGA
|
|
uint32_t reg_int = 0;
|
|
|
|
/* clear int 3 */
|
|
reg_int = PHY_READ_REG(CFG_BB_INT_CLR_3_ADDR);
|
|
if (irq_type & INTR_TYPE_PHY_FD_FC_OK) {
|
|
reg_int |= PHY_RECV_FD_FC_OK;
|
|
}
|
|
if (irq_type & INTR_TYPE_PHY_FD_FC_FAIL) {
|
|
reg_int |= PHY_RECV_FD_FC_FAIL;
|
|
}
|
|
if (irq_type & INTR_TYPE_PHY_TX_FD_TX_DONE) {
|
|
reg_int |= PHY_TX_FD_TX_DONE;
|
|
}
|
|
if (irq_type & INTR_TYPE_PHY_FD_TX_ABORT) {
|
|
reg_int |= PHY_FD_TX_ABORT;
|
|
}
|
|
#if ENA_WAR_244
|
|
if (irq_type & INTR_TYPE_PHY_FD_TX_STUCK) {
|
|
reg_int |= PHY_FD_TX_STUCK;
|
|
}
|
|
if (irq_type & INTR_TYPE_PHY_TX_TD_START) {
|
|
reg_int |= PHY_TX_TD_START;
|
|
}
|
|
#endif
|
|
|
|
#if ENA_WAR_NSG_EXTMI || MAC_SYM_NUM_FIX
|
|
if (irq_type & INTR_TYPE_PHY_FD_CH_EST_DONE) {
|
|
reg_int |= PHY_RECV_FD_CH_EST_DONE;
|
|
}
|
|
#endif/* ENA_WAR_NSG_EXTMI || MAC_SYM_NUM_FIX */
|
|
|
|
#if ENA_WAR_NSG_EXTMI
|
|
|
|
if (irq_type & INTR_TYPE_PHY_FD_PB_OK) {
|
|
reg_int |= PHY_RECV_FD_PB_OK;
|
|
}
|
|
if (irq_type & INTR_TYPE_PHY_FD_PB_FAIL) {
|
|
reg_int |= PHY_RECV_FD_PB_FAIL;
|
|
}
|
|
if (irq_type & INTR_TYPE_PHY_FC_RAW_RECEIVE) {
|
|
reg_int |= PHY_RECV_FC_RAW_RECEIVE;
|
|
}
|
|
#endif/* ENA_WAR_NSG_EXTMI */
|
|
|
|
#if (ENA_WAR_NSG_EXTMI || ENA_SW_SYNC_PPM_WAR)
|
|
if (irq_type & INTR_TYPE_PHY_INSERT_PREAM_DONE) {
|
|
reg_int |= PHY_TX_FD_INSERT_PREAM_DONE;
|
|
}
|
|
#endif
|
|
|
|
if (irq_type & INTR_TYPE_PHY_TX_TD_FC_DONE) {
|
|
reg_int |= PHY_TX_TD_FC_DONE;
|
|
}
|
|
|
|
#if MAC_SYM_NUM_FIX || MAC_TIMESTAMPING || ENA_CCO_RX_THR_PHASE_CHANGE
|
|
if (irq_type & INTR_TYPE_PHY_FD_PLD_OK) {
|
|
reg_int |=PHY_RECV_FD_PLD_OK;
|
|
}
|
|
if (irq_type & INTR_TYPE_PHY_FD_PLD_FAIL) {
|
|
reg_int |= PHY_RECV_FD_PLD_FAIL;
|
|
}
|
|
#endif
|
|
PHY_WRITE_REG(CFG_BB_INT_CLR_3_ADDR, reg_int);
|
|
|
|
#else
|
|
(void)irq_type;
|
|
#endif
|
|
}
|
|
|
|
void phy_enable_hw_interrupt_cpu1(uint32_t irq_type)
|
|
{
|
|
#if HW_PLATFORM >= HW_PLATFORM_FPGA
|
|
uint32_t reg_int = 0;
|
|
|
|
/* enable int 3 */
|
|
reg_int = PHY_READ_REG(CFG_BB_INT_EN_3_ADDR);
|
|
if (irq_type & INTR_TYPE_PHY_FD_FC_OK) {
|
|
reg_int |= PHY_RECV_FD_FC_OK;
|
|
}
|
|
if (irq_type & INTR_TYPE_PHY_FD_FC_FAIL) {
|
|
reg_int |= PHY_RECV_FD_FC_FAIL;
|
|
}
|
|
if (irq_type & INTR_TYPE_PHY_TX_FD_TX_DONE) {
|
|
reg_int |= PHY_TX_FD_TX_DONE;
|
|
}
|
|
if (irq_type & INTR_TYPE_PHY_FD_TX_ABORT) {
|
|
reg_int |= PHY_FD_TX_ABORT;
|
|
}
|
|
#if ENA_WAR_244
|
|
if (irq_type & INTR_TYPE_PHY_FD_TX_STUCK) {
|
|
reg_int |= PHY_FD_TX_STUCK;
|
|
}
|
|
if (irq_type & INTR_TYPE_PHY_TX_TD_START) {
|
|
reg_int |= PHY_TX_TD_START;
|
|
}
|
|
#endif
|
|
|
|
#if ENA_WAR_NSG_EXTMI || MAC_SYM_NUM_FIX
|
|
if (irq_type & INTR_TYPE_PHY_FD_CH_EST_DONE) {
|
|
reg_int |= PHY_RECV_FD_CH_EST_DONE;
|
|
}
|
|
#endif/* ENA_WAR_NSG_EXTMI || MAC_SYM_NUM_FIX */
|
|
|
|
#if ENA_WAR_NSG_EXTMI
|
|
if (irq_type & INTR_TYPE_PHY_FD_PB_OK) {
|
|
reg_int |= PHY_RECV_FD_PB_OK;
|
|
}
|
|
if (irq_type & INTR_TYPE_PHY_FD_PB_FAIL) {
|
|
reg_int |= PHY_RECV_FD_PB_FAIL;
|
|
}
|
|
if (irq_type & INTR_TYPE_PHY_FC_RAW_RECEIVE) {
|
|
reg_int |= PHY_RECV_FC_RAW_RECEIVE;
|
|
}
|
|
#endif/* ENA_WAR_NSG_EXTMI */
|
|
|
|
#if (ENA_WAR_NSG_EXTMI || ENA_SW_SYNC_PPM_WAR)
|
|
if (irq_type & INTR_TYPE_PHY_INSERT_PREAM_DONE) {
|
|
reg_int |= PHY_TX_FD_INSERT_PREAM_DONE;
|
|
}
|
|
#endif
|
|
|
|
if (irq_type & INTR_TYPE_PHY_TX_TD_FC_DONE) {
|
|
reg_int |= PHY_TX_TD_FC_DONE;
|
|
}
|
|
|
|
#if MAC_SYM_NUM_FIX || MAC_TIMESTAMPING || ENA_CCO_RX_THR_PHASE_CHANGE
|
|
if (irq_type & INTR_TYPE_PHY_FD_PLD_OK) {
|
|
reg_int |=PHY_RECV_FD_PLD_OK;
|
|
}
|
|
if (irq_type & INTR_TYPE_PHY_FD_PLD_FAIL) {
|
|
reg_int |= PHY_RECV_FD_PLD_FAIL;
|
|
}
|
|
#endif
|
|
|
|
PHY_WRITE_REG(CFG_BB_INT_EN_3_ADDR, reg_int);
|
|
|
|
#else
|
|
(void)irq_type;
|
|
#endif
|
|
return;
|
|
}
|
|
|
|
uint32_t phy_get_hw_interrupt_status_cpu1(uint32_t irq_type)
|
|
{
|
|
#if HW_PLATFORM >= HW_PLATFORM_FPGA
|
|
uint32_t irq_type_reg = 0;
|
|
|
|
/* get int 3 mask */
|
|
irq_type_reg = PHY_READ_REG(CFG_BB_INT_EN_3_ADDR);
|
|
if (irq_type_reg & CFG_BB_INT_EN_3_ADDR) {
|
|
//enable
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
//disable
|
|
return 0;
|
|
}
|
|
|
|
#else
|
|
return 0;
|
|
#endif
|
|
|
|
}
|
|
|
|
uint32_t phy_interrupt_handler_cpu1(uint32_t vector, iot_addrword_t data)
|
|
{
|
|
#if HW_PLATFORM >= HW_PLATFORM_FPGA
|
|
rx_fc_msg_t msg;
|
|
uint32_t proto = PHY_PROTO_TYPE_GET();
|
|
uint32_t bb_fc[4] = {0};
|
|
uint8_t delimeter = 0xFF;
|
|
|
|
(void)delimeter;
|
|
(void)vector;
|
|
(void)data;
|
|
|
|
#if WAR_TIMEOUT_TX_ABORT
|
|
//TODO:to make sure trigger phy isr, move to cpu0
|
|
if((g_phy_cpu_share_ctxt.timeout_tx_abort_flag == false) || \
|
|
(!phy_get_hw_interrupt_status_cpu1(INTR_TYPE_PHY_FD_TX_ABORT)))
|
|
{
|
|
phy_enable_hw_interrupt_cpu1(INTR_TYPE_PHY_FD_TX_ABORT);
|
|
}
|
|
#endif
|
|
uint32_t isr_flag = 0;
|
|
uint32_t ul_fdfc = PHY_READ_REG(CFG_BB_RX_FC_CFG_3_ADDR);
|
|
|
|
isr_flag = phy_get_hw_interrupt_type_cpu1();
|
|
|
|
/* disable interrupt mask */
|
|
//phy_disable_hw_interrupt_cpu1(isr_flag);
|
|
|
|
|
|
if (isr_flag & INTR_TYPE_PHY_INSERT_PREAM_DONE) {
|
|
/* get current tx fc */
|
|
phy_get_after_war_fc(bb_fc);
|
|
#if ENA_WAR_NSG_EXTMI
|
|
/* spg tx */
|
|
uint8_t dt, fc_tmp;
|
|
dt = (uint8_t)mac_get_delimi_from_fc(PLC_PROTO_TYPE_SPG, bb_fc);
|
|
if (FC_DELIM_SOF == dt) {
|
|
fc_tmp = (uint8_t)bb_fc[3];
|
|
bb_fc[3] = (bb_fc[3] & 0xfffffff0) |\
|
|
(((fc_tmp >> 4) & 0xf) | ((fc_tmp << 4) & 0xf0));
|
|
|
|
RGF_RAW_WRITE_REG(CFG_TX_SW_FC_0_ADDR, bb_fc[0]);
|
|
RGF_RAW_WRITE_REG(CFG_TX_SW_FC_1_ADDR, bb_fc[1]);
|
|
RGF_RAW_WRITE_REG(CFG_TX_SW_FC_2_ADDR, bb_fc[2]);
|
|
RGF_RAW_WRITE_REG(CFG_TX_SW_FC_3_ADDR, bb_fc[3]);
|
|
|
|
RGF_RAW_WRITE_REG(CFG_SW_FC_VALID_ADDR, 1);
|
|
PHY_WRITE_REG(CFG_BB_RAW_DATA_MODE_CTRL_ADDR, 1);
|
|
}
|
|
#endif
|
|
|
|
/* fix tx ppm */
|
|
#if ENA_SW_SYNC_PPM_WAR
|
|
phy_ppm_status_ctxt_t *ppm_ctxt = phy_multi_sync_get_ppm_status();
|
|
mac_get_rx_frm_msg_from_fc(proto, bb_fc, &msg);
|
|
phy_multi_sync_apply_bb_ppm(ppm_ctxt, msg.nid, BB_PPM_TX_ONLY);
|
|
#endif
|
|
}
|
|
|
|
#if ENA_WAR_NSG_EXTMI || MAC_SYM_NUM_FIX
|
|
/* spg rx */
|
|
if (isr_flag & INTR_TYPE_PHY_FD_CH_EST_DONE) {
|
|
#if MAC_SYM_NUM_FIX
|
|
if (!g_phy_cpu_share_ctxt.sym_num_fix_dis) {
|
|
uint32_t tmp = RGF_MAC_READ_REG(CFG_RD_MACPHY_INTF_0_ADDR);
|
|
g_phy_cpu_share_ctxt.multiband = REG_FIELD_GET(PHY_RX_BANDSEL, tmp);
|
|
}
|
|
#endif/* MAC_SYM_NUM_FIX */
|
|
#if ENA_WAR_NSG_EXTMI
|
|
PHY_WRITE_REG(CFG_BB_RAW_DATA_MODE_CTRL_ADDR, 1);
|
|
#endif/* ENA_WAR_NSG_EXTMI */
|
|
}
|
|
#endif/* ENA_WAR_NSG_EXTMI || MAC_SYM_NUM_FIX */
|
|
|
|
#if ENA_WAR_NSG_EXTMI
|
|
if (isr_flag & INTR_TYPE_PHY_FC_RAW_RECEIVE) {
|
|
uint8_t rx_dt, rx_fc_tmp;
|
|
uint32_t bb_rx_fc[4], tmp;
|
|
bb_rx_fc[0] = PHY_READ_REG(CFG_BB_RX_FC_RAW_0_ADDR);
|
|
rx_dt = (uint8_t)mac_get_delimi_from_fc(PLC_PROTO_TYPE_SPG, bb_rx_fc);
|
|
if (rx_dt == FC_DELIM_SOF) {
|
|
bb_rx_fc[1] = PHY_READ_REG(CFG_BB_RX_FC_RAW_1_ADDR);
|
|
bb_rx_fc[2] = PHY_READ_REG(CFG_BB_RX_FC_RAW_2_ADDR);
|
|
bb_rx_fc[3] = PHY_READ_REG(CFG_BB_RX_FC_RAW_3_ADDR);
|
|
rx_fc_tmp = (uint8_t)bb_rx_fc[3];
|
|
rx_fc_tmp = ((rx_fc_tmp >> 4) & 0xf) | ((rx_fc_tmp << 4) & 0xf0);
|
|
|
|
PHY_WRITE_REG(CFG_BB_RX_FC_CFG_0_ADDR, bb_rx_fc[0]);
|
|
PHY_WRITE_REG(CFG_BB_RX_FC_CFG_1_ADDR, bb_rx_fc[1]);
|
|
PHY_WRITE_REG(CFG_BB_RX_FC_CFG_2_ADDR, bb_rx_fc[2]);
|
|
|
|
tmp = PHY_READ_REG(CFG_BB_RX_FC_CFG_3_ADDR);
|
|
REG_FIELD_SET(SW_RX_FC_NOW_CFG_WORD3, tmp, rx_fc_tmp);
|
|
REG_FIELD_SET(SW_RX_FC_NOW_CFG_VLD, tmp, 1);
|
|
PHY_WRITE_REG(CFG_BB_RX_FC_CFG_3_ADDR, tmp);
|
|
} else {
|
|
bb_rx_fc[1] = PHY_READ_REG(CFG_BB_RX_FC_RAW_1_ADDR);
|
|
bb_rx_fc[2] = PHY_READ_REG(CFG_BB_RX_FC_RAW_2_ADDR);
|
|
bb_rx_fc[3] = PHY_READ_REG(CFG_BB_RX_FC_RAW_3_ADDR);
|
|
PHY_WRITE_REG(CFG_BB_RX_FC_CFG_0_ADDR, bb_rx_fc[0]);
|
|
PHY_WRITE_REG(CFG_BB_RX_FC_CFG_1_ADDR, bb_rx_fc[1]);
|
|
PHY_WRITE_REG(CFG_BB_RX_FC_CFG_2_ADDR, bb_rx_fc[2]);
|
|
|
|
tmp = PHY_READ_REG(CFG_BB_RX_FC_CFG_3_ADDR);
|
|
REG_FIELD_SET(SW_RX_FC_NOW_CFG_WORD3, tmp, (uint8_t)bb_rx_fc[3]);
|
|
REG_FIELD_SET(SW_RX_FC_NOW_CFG_VLD, tmp, 1);
|
|
PHY_WRITE_REG(CFG_BB_RX_FC_CFG_3_ADDR, tmp);
|
|
|
|
PHY_WRITE_REG(CFG_BB_RAW_DATA_MODE_CTRL_ADDR, 0);
|
|
}
|
|
}
|
|
|
|
if ((isr_flag & INTR_TYPE_PHY_FD_PB_OK) || (isr_flag & INTR_TYPE_PHY_FD_PB_FAIL)) {
|
|
PHY_WRITE_REG(CFG_BB_RAW_DATA_MODE_CTRL_ADDR, 0);
|
|
}
|
|
#endif/* ENA_WAR_NSG_EXTMI */
|
|
|
|
if(isr_flag & INTR_TYPE_PHY_FD_FC_OK \
|
|
|| isr_flag & INTR_TYPE_PHY_FD_FC_FAIL) {
|
|
ul_fdfc |= ((uint32_t)(1 << SW_RX_FC_NOW_CFG_VLD_OFFSET));
|
|
PHY_WRITE_REG(CFG_BB_RX_FC_CFG_3_ADDR, ul_fdfc);
|
|
|
|
/* when recv fc,if my sof,enable rawdata mode.
|
|
*/
|
|
if (isr_flag & INTR_TYPE_PHY_FD_FC_OK) {
|
|
#if MAC_SYM_NUM_FIX
|
|
if (!g_phy_cpu_share_ctxt.sym_num_fix_dis) {
|
|
bb_fc[0] = PHY_READ_REG(CFG_BB_RX_FC_RAW_0_ADDR);
|
|
bb_fc[1] = PHY_READ_REG(CFG_BB_RX_FC_RAW_1_ADDR);
|
|
bb_fc[2] = PHY_READ_REG(CFG_BB_RX_FC_RAW_2_ADDR);
|
|
bb_fc[3] = PHY_READ_REG(CFG_BB_RX_FC_RAW_3_ADDR);
|
|
|
|
mac_get_rx_frm_msg_from_fc(proto, bb_fc, &msg);
|
|
if (((msg.delimiter == FC_DELIM_SOF) ||
|
|
(msg.delimiter == FC_DELIM_BEACON))) {
|
|
uint16_t total_sym_num, sym_num;
|
|
uint16_t *p_symppb =
|
|
(uint16_t *)g_phy_cpu_share_ctxt.p_g_symppb;
|
|
|
|
uint8_t tmi = msg.tmi;
|
|
|
|
if (msg.delimiter == FC_DELIM_SOF) {
|
|
tmi += msg.tmi_ext;
|
|
}
|
|
|
|
sym_num = *(p_symppb + g_phy_cpu_share_ctxt.multiband *
|
|
SG_OFDM_MAX + tmi);
|
|
if (sym_num != msg.numsym) {
|
|
if (msg.delimiter == FC_DELIM_SOF) {
|
|
total_sym_num = sym_num * msg.pb_num;
|
|
} else {
|
|
total_sym_num = sym_num;
|
|
}
|
|
|
|
uint32_t tmp =
|
|
PHY_READ_REG(CFG_BB_CONFIG_FC_PARSE_0_ADDR);
|
|
REG_FIELD_SET(SW_CONFIG_PB_SYMB_NUM, tmp, sym_num);
|
|
REG_FIELD_SET(SW_CONFIG_PLD_SYMB_NUM, tmp,
|
|
total_sym_num);
|
|
REG_FIELD_SET(SW_CONFIG_PB_SYMB_NUM_EN, tmp, 1);
|
|
REG_FIELD_SET(SW_CONFIG_PLD_SYMB_NUM_EN, tmp, 1);
|
|
PHY_WRITE_REG(CFG_BB_CONFIG_FC_PARSE_0_ADDR, tmp);
|
|
}
|
|
}
|
|
}
|
|
#endif /* MAC_SYM_NUM_FIX */
|
|
|
|
#if MAC_WAR_244_TIMESTAMPING
|
|
g_phy_cpu_share_ctxt._3_rx_fc_ok_ts = \
|
|
RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
|
|
#endif
|
|
iot_memset(&msg, 0, sizeof(rx_fc_msg_t));
|
|
|
|
bb_fc[0] = PHY_READ_REG(CFG_BB_RX_FC_RAW_0_ADDR);
|
|
bb_fc[1] = PHY_READ_REG(CFG_BB_RX_FC_RAW_1_ADDR);
|
|
bb_fc[2] = PHY_READ_REG(CFG_BB_RX_FC_RAW_2_ADDR);
|
|
bb_fc[3] = PHY_READ_REG(CFG_BB_RX_FC_RAW_3_ADDR);
|
|
delimeter = (uint8_t)mac_get_delimi_from_fc(proto, bb_fc);
|
|
mac_get_rx_frm_msg_from_fc(proto, bb_fc, &msg);
|
|
|
|
if (FC_DELIM_SOF == delimeter || FC_DELIM_BEACON == delimeter) {
|
|
#if ENA_CCO_RX_THR_PHASE_CHANGE
|
|
phy_set_rx_abort_rx_phase_force_from_isr(true, true,
|
|
phy_get_hw_phy_rx_phase_sel());
|
|
#endif
|
|
#if ENA_SW_SYNC_PPM_WAR
|
|
#if ENA_SYNC_DIFF_CCO_PPM
|
|
if (msg.nid == 0) {
|
|
/* maybe recover init ppm */
|
|
mac_modify_dbg_pkt_tx_ppm(0);
|
|
}
|
|
#endif
|
|
phy_ppm_status_ctxt_t *ctxt = phy_multi_sync_get_ppm_status();
|
|
phy_multi_sync_apply_bb_ppm(ctxt, msg.nid, BB_PPM_RX_ONLY);
|
|
#endif
|
|
}
|
|
#if ENA_WAR_244
|
|
if((msg.dst_tei != 0 || msg.src_tei != 0) &&
|
|
(FC_DELIM_SOF == delimeter || FC_DELIM_BEACON == delimeter)) {
|
|
/* fc ok found flag */
|
|
g_phy_cpu_share_ctxt.pm_status.fc_ok_found = 1;
|
|
}
|
|
|
|
if (RGF_RAW_READ_REG(CFG_RAW_DATA_MODE_ADDR)) {
|
|
/* for some case, PHY info is not set correctly
|
|
* if RAWDATA mode
|
|
*/
|
|
phy_rawdata_bb_set_tmi(proto, 0, 0);
|
|
}
|
|
|
|
if ((FC_DELIM_SOF == delimeter)
|
|
&& (msg.dst_tei == RGF_MAC_READ_REG(CFG_MYTEI_ADDR))
|
|
&& (msg.nid == RGF_MAC_READ_REG(CFG_MYNID_ADDR))) {
|
|
#if MAC_WAR_SPLIT_TX_RX_RIFS
|
|
/* this is kunlun1 war
|
|
* make tx rx rifs separate
|
|
*/
|
|
mac_tx_rifs_tmr_set(mac_cfg_tx_rifs_get());
|
|
#endif
|
|
|
|
#if MAC_WAR_244_TIMESTAMPING
|
|
g_phy_cpu_share_ctxt._1_rx_fd_fc_ts = \
|
|
RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
|
|
#endif
|
|
/* enable raw data mode */
|
|
RGF_RAW_WRITE_REG(CFG_RAW_DATA_MODE_ADDR, 1);
|
|
if (g_phy_cpu_share_ctxt.need_record_tei) {
|
|
g_phy_cpu_share_ctxt.sof_src_tei = msg.src_tei;
|
|
g_phy_cpu_share_ctxt.need_record_tei = false;
|
|
} else {
|
|
g_phy_cpu_share_ctxt.sack_miss_cnt++;
|
|
}
|
|
|
|
if (!g_phy_cpu_share_ctxt.need_record_sof) {
|
|
g_phy_cpu_share_ctxt.need_record_sof = 1;
|
|
}
|
|
} else {
|
|
/* disable raw data mode? */
|
|
}
|
|
#endif
|
|
}
|
|
g_phy_cpu_share_ctxt.reg_phase = phy_get_mac_rx_phase();
|
|
g_phy_cpu_share_ctxt.phy_force_0 = \
|
|
RGF_MAC_READ_REG(CFG_PHY_FORCE_0_ADDR);
|
|
}
|
|
|
|
#if DEBUG_NID_ERR
|
|
if (isr_flag & INTR_TYPE_PHY_TX_TD_FC_DONE) {
|
|
uint32_t cur_nid, config_nid;
|
|
uint32_t bb_tx_fc = RGF_RAW_READ_REG(CFG_TX_FC_DATA0_ADDR);
|
|
cur_nid = mac_get_nid_from_fc(proto, &bb_tx_fc);
|
|
config_nid = mac_get_hw_nid();
|
|
/* tx nid = 0, maybe this is dbg/cert packet */
|
|
if ((config_nid != 0) && (0 != cur_nid) && (cur_nid != config_nid)) {
|
|
g_phy_cpu_share_ctxt.nid_err_cnt++;
|
|
g_phy_cpu_share_ctxt.cur_nid = cur_nid;
|
|
g_phy_cpu_share_ctxt.config_nid = config_nid;
|
|
}
|
|
}
|
|
#endif
|
|
if (isr_flag & INTR_TYPE_PHY_TX_TD_FC_DONE) {
|
|
bb_fc[0] = RGF_RAW_READ_REG(CFG_TX_SW_FC_0_ADDR);
|
|
bb_fc[1] = RGF_RAW_READ_REG(CFG_TX_SW_FC_1_ADDR);
|
|
bb_fc[2] = RGF_RAW_READ_REG(CFG_TX_SW_FC_2_ADDR);
|
|
bb_fc[3] = RGF_RAW_READ_REG(CFG_TX_SW_FC_3_ADDR);
|
|
delimeter = (uint8_t)mac_get_delimi_from_fc(proto, bb_fc);
|
|
#if ENA_WAR_SPG_TX_OK
|
|
if (FC_DELIM_SOF == delimeter) {
|
|
rx_fc_msg_t tx_msg = { 0 };
|
|
mac_get_rx_frm_msg_from_fc(PLC_PROTO_TYPE_SPG, bb_fc, &tx_msg);
|
|
if (tx_msg.dst_tei != 0xfff) {
|
|
spg_frame_control_t *spg_fc_t = (spg_frame_control_t *)bb_fc;
|
|
spg_fc_t->vf.sof.dst_tei = 0;
|
|
RGF_RAW_WRITE_REG(CFG_TX_SW_FC_0_ADDR, bb_fc[0]);
|
|
RGF_RAW_WRITE_REG(CFG_TX_SW_FC_1_ADDR, bb_fc[1]);
|
|
RGF_RAW_WRITE_REG(CFG_TX_SW_FC_2_ADDR, bb_fc[2]);
|
|
RGF_RAW_WRITE_REG(CFG_TX_SW_FC_3_ADDR, bb_fc[3]);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if ENA_CCO_RX_THR_PHASE_CHANGE
|
|
if (FC_DELIM_SACK == delimeter) {
|
|
phy_set_rx_abort_rx_phase_force_from_isr(false,
|
|
g_phy_cpu_share_ctxt.rx_phase_force_en,
|
|
g_phy_cpu_share_ctxt.rx_phase_force);
|
|
}
|
|
#endif
|
|
g_phy_cpu_share_ctxt.tx_td_fc_done_cnt++;
|
|
}
|
|
|
|
if (isr_flag & INTR_TYPE_PHY_TX_FD_TX_DONE \
|
|
|| isr_flag & INTR_TYPE_PHY_FD_TX_ABORT \
|
|
|| isr_flag & INTR_TYPE_PHY_FD_TX_STUCK) {
|
|
|
|
#if ENA_WAR_NSG_EXTMI
|
|
RGF_RAW_WRITE_REG(CFG_SW_FC_VALID_ADDR, 0);
|
|
PHY_WRITE_REG(CFG_BB_RAW_DATA_MODE_CTRL_ADDR, 0);
|
|
#endif
|
|
|
|
if(isr_flag & INTR_TYPE_PHY_TX_FD_TX_DONE)
|
|
{
|
|
#if MAC_WAR_SPLIT_TX_RX_RIFS
|
|
/* this is kunlun1 war
|
|
* make tx rx rifs separate
|
|
*/
|
|
mac_rx_rifs_tmr_set(mac_cfg_rx_rifs_get());
|
|
#endif
|
|
}
|
|
|
|
if(isr_flag & INTR_TYPE_PHY_FD_TX_ABORT)
|
|
{
|
|
g_phy_cpu_share_ctxt.phy_tx_abort_cnt++;
|
|
|
|
#if WAR_TIMEOUT_TX_ABORT
|
|
//1. clear tx abort interrupt
|
|
phy_clear_hw_interrupt_cpu1(INTR_TYPE_PHY_FD_TX_ABORT);
|
|
//2. get phy interrupte status
|
|
uint32_t isr_flag_again = 0;
|
|
isr_flag_again = phy_get_hw_interrupt_type_cpu1();
|
|
//3. if tx abort still equal 1, mask tx abort
|
|
if(isr_flag_again & INTR_TYPE_PHY_FD_TX_ABORT)
|
|
{
|
|
g_phy_cpu_share_ctxt.timeout_tx_abort_flag = true;
|
|
phy_disable_hw_interrupt_cpu1(INTR_TYPE_PHY_FD_TX_ABORT);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
if (isr_flag & INTR_TYPE_PHY_FD_TX_STUCK) {
|
|
g_phy_cpu_share_ctxt.tx_fd_stuck_cnt++;
|
|
}
|
|
#if MAC_WAR_244_TIMESTAMPING
|
|
g_phy_cpu_share_ctxt._2_tx_fd_ts = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
|
|
#endif
|
|
|
|
#if (ENA_WAR_CTL)
|
|
/* disable MAC RAW DATA MODE */
|
|
RGF_RAW_WRITE_REG(CFG_RAW_DATA_MODE_ADDR, 0);
|
|
/* clear pb size BB */
|
|
phy_rawdata_mode_bb_set_ps_tr(0,0,0);
|
|
#endif
|
|
}
|
|
|
|
if (isr_flag & INTR_TYPE_PHY_TX_TD_START) {
|
|
uint32_t dbg_value = 0;
|
|
|
|
/* bit[2:0] - 3bit*/
|
|
dbg_value |= PHY_READ_REG(CFG_BB_TX_TD_DBG_BUS_ADDR) & 0x07;
|
|
/* bit[4:0] - 5bit */
|
|
dbg_value |= (PHY_READ_REG(CFG_BB_TX_FD_FSM_DBG_BUS_ADDR) & 0x1F) << 3;
|
|
|
|
g_phy_cpu_share_ctxt.tx_td_start_status = dbg_value;
|
|
g_phy_cpu_share_ctxt.tx_td_start_cnt++;
|
|
#if ENA_WAR_440
|
|
phy_war_tx_fl_overflow();
|
|
#endif
|
|
|
|
#if (ENA_WAR_244 && MAC_WAR_244_TIMESTAMPING)
|
|
g_phy_cpu_share_ctxt._2_tx_td_st_ts = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
|
|
#endif
|
|
|
|
#if (ENA_WAR_CTL)
|
|
phy_rawdata_war_phy_pbsz();
|
|
#endif
|
|
|
|
#if DEBUG_CANNOT_SENDOUT_PKT
|
|
phy_get_after_war_fc(g_phy_cpu_share_ctxt.tx_fc);
|
|
#endif
|
|
}
|
|
|
|
#if MAC_SYM_NUM_FIX || MAC_TIMESTAMPING || ENA_CCO_RX_THR_PHASE_CHANGE
|
|
/* PLD ok or fail interrupt */
|
|
if (isr_flag & INTR_TYPE_PHY_FD_PLD_OK ||
|
|
isr_flag & INTR_TYPE_PHY_FD_PLD_FAIL) {
|
|
#if MAC_SYM_NUM_FIX
|
|
uint32_t tmp = PHY_READ_REG(CFG_BB_CONFIG_FC_PARSE_0_ADDR);
|
|
if (REG_FIELD_GET(SW_CONFIG_PB_SYMB_NUM_EN, tmp) ||
|
|
REG_FIELD_GET(SW_CONFIG_PLD_SYMB_NUM_EN, tmp)) {
|
|
REG_FIELD_SET(SW_CONFIG_PB_SYMB_NUM_EN, tmp, 0);
|
|
REG_FIELD_SET(SW_CONFIG_PLD_SYMB_NUM_EN, tmp, 0);
|
|
PHY_WRITE_REG(CFG_BB_CONFIG_FC_PARSE_0_ADDR, tmp);
|
|
}
|
|
#endif /* MAC_SYM_NUM_FIX */
|
|
#if MAC_TIMESTAMPING
|
|
g_phy_cpu_share_ctxt.phy_pld_int_ntb =
|
|
RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
|
|
#endif
|
|
#if ENA_CCO_RX_THR_PHASE_CHANGE
|
|
iot_memset(&msg, 0, sizeof(rx_fc_msg_t));
|
|
|
|
bb_fc[0] = PHY_READ_REG(CFG_BB_RX_FC_RAW_0_ADDR);
|
|
bb_fc[1] = PHY_READ_REG(CFG_BB_RX_FC_RAW_1_ADDR);
|
|
bb_fc[2] = PHY_READ_REG(CFG_BB_RX_FC_RAW_2_ADDR);
|
|
bb_fc[3] = PHY_READ_REG(CFG_BB_RX_FC_RAW_3_ADDR);
|
|
delimeter = (uint8_t)mac_get_delimi_from_fc(proto, bb_fc);
|
|
mac_get_rx_frm_msg_from_fc(proto, bb_fc, &msg);
|
|
if (FC_DELIM_BEACON == delimeter) {
|
|
phy_set_rx_abort_rx_phase_force_from_isr(false,
|
|
g_phy_cpu_share_ctxt.rx_phase_force_en,
|
|
g_phy_cpu_share_ctxt.rx_phase_force);
|
|
} else if (!((FC_DELIM_SOF == delimeter)
|
|
&& (msg.dst_tei == RGF_MAC_READ_REG(CFG_MYTEI_ADDR))
|
|
&& (msg.nid == RGF_MAC_READ_REG(CFG_MYNID_ADDR)))) {
|
|
phy_set_rx_abort_rx_phase_force_from_isr(false,
|
|
g_phy_cpu_share_ctxt.rx_phase_force_en,
|
|
g_phy_cpu_share_ctxt.rx_phase_force);
|
|
}
|
|
#endif
|
|
}
|
|
#endif
|
|
/* clear interrupt mask */
|
|
phy_clear_hw_interrupt_cpu1(isr_flag);
|
|
|
|
/* enable interrupt mask */
|
|
//phy_enable_hw_interrupt_cpu1(isr_flag);
|
|
#else
|
|
(void)vector;
|
|
(void)data;
|
|
#endif
|
|
return ERR_OK;
|
|
}
|
|
|
|
void phy_isr_init_cpu1(void)
|
|
{
|
|
#if HW_PLATFORM >= HW_PLATFORM_FPGA
|
|
iot_irq_t phy_irq_int_3;
|
|
|
|
/* move clean cpu1 phy interrupt to cpu1 phy start function */
|
|
|
|
phy_irq_int_3 = \
|
|
iot_interrupt_create(HAL_VECTOR_PHY_3, HAL_INTR_PRI_6,
|
|
0, phy_interrupt_handler_cpu1);
|
|
/* set to cpu1 */
|
|
iot_interrupt_set_cpu(phy_irq_int_3, HAL_INTR_CPU_1);
|
|
|
|
iot_interrupt_attach(phy_irq_int_3);
|
|
|
|
iot_interrupt_unmask(phy_irq_int_3);
|
|
#endif
|
|
|
|
return;
|
|
}
|