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;
 | |
| }
 |