599 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			599 lines
		
	
	
		
			20 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 "phy_status.h"
 | ||
|  | #include "phy_bb.h"
 | ||
|  | #include "hw_tonemask.h"
 | ||
|  | #include "hw_reg_api.h"
 | ||
|  | #include "phy_dfe_reg.h"
 | ||
|  | #include "phy_tx_reg.h"
 | ||
|  | #include "phy_reg.h"
 | ||
|  | #include "phy_ana.h"
 | ||
|  | #include "phy_txrx_pwr.h"
 | ||
|  | #include "hw_phy_api.h"
 | ||
|  | 
 | ||
|  | #include "iot_dbglog_api.h"
 | ||
|  | #include "iot_dbglog.h"
 | ||
|  | #include "iot_io.h"
 | ||
|  | 
 | ||
|  | #if DEG_TX_ABORT
 | ||
|  | #include "mac_tmr_reg.h"
 | ||
|  | #include "mac_raw_reg.h"
 | ||
|  | #include "mac_sys_reg.h"
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | /* 30 minutes period, uint 10 mimutes */ | ||
|  | #define PHY_PERIOD_30_MIN      3
 | ||
|  | /* 60 minutes period, uint 10 mimutes */ | ||
|  | #define PHY_PERIOD_60_MIN      6
 | ||
|  | 
 | ||
|  | static uint8_t g_phy_period_30_min_cnt = 0, g_phy_period_60_min_cnt = 0; | ||
|  | 
 | ||
|  | uint32_t phy_get_rx_dc() | ||
|  | { | ||
|  | #if HW_PLATFORM >= HW_PLATFORM_FPGA
 | ||
|  |     volatile uint16_t dc_pgf = 0; | ||
|  |     volatile uint16_t dc_pga = 0; | ||
|  |     /* scan each gain */ | ||
|  |     uint8_t i; | ||
|  |     for(i = 0; i < 8; i++) | ||
|  |     { | ||
|  |         phy_pgf_pga_dc_cal_get(i+77, &dc_pgf, &dc_pga); | ||
|  |         g_phy_ctxt.dep.phy_status.gain_dc.rx_dc_pga[i] = dc_pga; | ||
|  |         g_phy_ctxt.dep.phy_status.gain_dc.rx_dc_pga[i] = dc_pga; | ||
|  |     } | ||
|  | #endif
 | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | /* dc comp */ | ||
|  | void phy_dc_comp_gain_get(volatile uint16_t *gain0, volatile uint16_t *gain1, | ||
|  |                           volatile uint16_t *gain2, volatile uint16_t *gain3) | ||
|  | { | ||
|  | #if HW_PLATFORM >= HW_PLATFORM_FPGA
 | ||
|  |     uint32_t tmp = 0; | ||
|  | 
 | ||
|  |     tmp = PHY_DFE_READ_REG(CFG_BB_DC_COMP0_ADDR); | ||
|  |     *gain0 = (uint16_t)REG_FIELD_GET(SW_DC_COMP_GAIN0, tmp); | ||
|  |     *gain1 = (uint16_t)REG_FIELD_GET(SW_DC_COMP_GAIN1, tmp); | ||
|  | 
 | ||
|  |     tmp = PHY_DFE_READ_REG(CFG_BB_DC_COMP1_ADDR); | ||
|  |     *gain2 = (uint16_t)REG_FIELD_GET(SW_DC_COMP_GAIN2, tmp); | ||
|  |     *gain3 = (uint16_t)REG_FIELD_GET(SW_DC_COMP_GAIN3, tmp); | ||
|  | #else
 | ||
|  |     (void)gain0; | ||
|  |     (void)gain1; | ||
|  |     (void)gain2; | ||
|  |     (void)gain3; | ||
|  | #endif
 | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_get_tx_dc() | ||
|  | { | ||
|  | #if HW_PLATFORM >= HW_PLATFORM_FPGA
 | ||
|  |     volatile uint16_t tx_dc_gain0 = 0; | ||
|  |     volatile uint16_t tx_dc_gain1 = 0; | ||
|  |     volatile uint16_t tx_dc_gain2 = 0; | ||
|  |     volatile uint16_t tx_dc_gain3 = 0; | ||
|  |     phy_dc_comp_gain_get(&tx_dc_gain0, &tx_dc_gain1,\ | ||
|  |                          &tx_dc_gain2, &tx_dc_gain3); | ||
|  |     g_phy_ctxt.dep.phy_status.gain_dc.tx_dc[0] = tx_dc_gain0; | ||
|  |     g_phy_ctxt.dep.phy_status.gain_dc.tx_dc[1] = tx_dc_gain1; | ||
|  |     g_phy_ctxt.dep.phy_status.gain_dc.tx_dc[2] = tx_dc_gain2; | ||
|  |     g_phy_ctxt.dep.phy_status.gain_dc.tx_dc[3] = tx_dc_gain3; | ||
|  | #endif
 | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_add_dc_cal_cnt() | ||
|  | { | ||
|  |     g_phy_ctxt.dep.phy_status.dc_cal_cnt++; | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_get_dc_cal_cnt() | ||
|  | { | ||
|  |     return g_phy_ctxt.dep.phy_status.dc_cal_cnt; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t IRAM_ATTR phy_add_overstress_cnt() | ||
|  | { | ||
|  |     g_phy_ctxt.indep.ovs_ctxt.os_cnt++; | ||
|  |     g_phy_ctxt.indep.ovs_ctxt.no_ovs_cnt = 0; | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_get_overstress_cnt() | ||
|  | { | ||
|  |     return g_phy_ctxt.indep.ovs_ctxt.os_cnt; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_get_periodic_fc_err_num() | ||
|  | { | ||
|  |     return g_phy_ctxt.dep.phy_status.phy_rx_cnt.phy_rx_fc_fail_cnt_clr; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_get_rxtd_reg_tx_pkt() | ||
|  | { | ||
|  |     iot_phy_sts_info_t pkt_sts; | ||
|  |     phy_sts_get(&pkt_sts); | ||
|  | 
 | ||
|  |     g_phy_ctxt.dep.phy_status.phy_rx_cnt.phy_rx_fc_ok_cnt = \ | ||
|  |         pkt_sts.fc_crc_ok_cnt; | ||
|  |     g_phy_ctxt.dep.phy_status.phy_rx_cnt.phy_rx_fc_fail_cnt = \ | ||
|  |         pkt_sts.fc_crc_fail_cnt; | ||
|  |     g_phy_ctxt.dep.phy_status.phy_rx_cnt.phy_rx_pld_ok_cnt = \ | ||
|  |         pkt_sts.pld_crc_ok_cnt; | ||
|  |     g_phy_ctxt.dep.phy_status.phy_rx_cnt.phy_rx_pld_fail_cnt = \ | ||
|  |         pkt_sts.pld_crc_fail_cnt; | ||
|  |     g_phy_ctxt.dep.phy_status.phy_rx_cnt.phy_rx_pkt_cnt = \ | ||
|  |         pkt_sts.sync_ok_cnt; | ||
|  | 
 | ||
|  |     g_phy_ctxt.dep.phy_status.phy_tx_pkt_cnt = pkt_sts.mac_tx_ok_cnt; | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | #if 0
 | ||
|  | uint32_t phy_get_granite_reg() | ||
|  | { | ||
|  |     uint32_t i; | ||
|  |     uint8_t rodata = 0; | ||
|  |     uint32_t rdata = 0; | ||
|  |     for(i = 0; i < 11; i++) | ||
|  |     { | ||
|  |         phy_ana_i2c_read(i, &rdata, &rodata); | ||
|  |         g_phy_ctxt.dep.phy_status.granite_reg[i] = rdata;  //需要改
 | ||
|  |     } | ||
|  |     return 0; | ||
|  | } | ||
|  | #endif
 | ||
|  | uint32_t phy_get_txfd_reg() | ||
|  | { | ||
|  | #if HW_PLATFORM >= HW_PLATFORM_FPGA
 | ||
|  |     g_phy_ctxt.dep.phy_status.phy_tx_pwr_reg.bb_rt0_bd0 = \ | ||
|  |         PHY_TX_READ_REG(CFG_BB_DB_AMP_CTRL_RATE0_BAND0_ADDR); | ||
|  |     g_phy_ctxt.dep.phy_status.phy_tx_pwr_reg.bb_rt0_bd1 = \ | ||
|  |         PHY_TX_READ_REG(CFG_BB_DB_AMP_CTRL_RATE0_BAND1_ADDR); | ||
|  |     g_phy_ctxt.dep.phy_status.phy_tx_pwr_reg.bb_rt0_bd2 = \ | ||
|  |         PHY_TX_READ_REG(CFG_BB_DB_AMP_CTRL_RATE0_BAND2_ADDR); | ||
|  |     g_phy_ctxt.dep.phy_status.phy_tx_pwr_reg.bb_rt1_bd0 = \ | ||
|  |         PHY_TX_READ_REG(CFG_BB_DB_AMP_CTRL_RATE1_BAND0_ADDR); | ||
|  |     g_phy_ctxt.dep.phy_status.phy_tx_pwr_reg.bb_rt1_bd1 = \ | ||
|  |         PHY_TX_READ_REG(CFG_BB_DB_AMP_CTRL_RATE1_BAND1_ADDR); | ||
|  |     g_phy_ctxt.dep.phy_status.phy_tx_pwr_reg.bb_rt1_bd2 = \ | ||
|  |         PHY_TX_READ_REG(CFG_BB_DB_AMP_CTRL_RATE1_BAND2_ADDR); | ||
|  |  #endif
 | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_get_dfe_reg() | ||
|  | { | ||
|  | #if HW_PLATFORM >= HW_PLATFORM_FPGA
 | ||
|  |     g_phy_ctxt.dep.phy_status.phy_gain_adjust_info = \ | ||
|  |         PHY_DFE_READ_REG(CFG_BB_SW_ADJUST_GAIN_ADDR); | ||
|  | #endif
 | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_get_version() | ||
|  | { | ||
|  | #if HW_PLATFORM >= HW_PLATFORM_FPGA
 | ||
|  |     g_phy_ctxt.dep.phy_status.phy_mode = \ | ||
|  |         PHY_READ_REG(CFG_BB_VERSION_ADDR); | ||
|  | #endif
 | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_get_band_cfg() | ||
|  | { | ||
|  | #if HW_PLATFORM >= HW_PLATFORM_FPGA
 | ||
|  |     g_phy_ctxt.dep.phy_status.phy_band.bb_r0_b0 = \ | ||
|  |         PHY_READ_REG(CFG_BB_R0_B0_TONE_ADDR); | ||
|  |     g_phy_ctxt.dep.phy_status.phy_band.bb_r0_b1 = \ | ||
|  |         PHY_READ_REG(CFG_BB_R0_B1_TONE_ADDR); | ||
|  |     g_phy_ctxt.dep.phy_status.phy_band.bb_r0_b2 = \ | ||
|  |         PHY_READ_REG(CFG_BB_R0_B2_TONE_ADDR); | ||
|  |     g_phy_ctxt.dep.phy_status.phy_band.bb_r1_b0 = \ | ||
|  |         PHY_READ_REG(CFG_BB_R1_B0_TONE_ADDR); | ||
|  |     g_phy_ctxt.dep.phy_status.phy_band.bb_r1_b1 = \ | ||
|  |         PHY_READ_REG(CFG_BB_R1_B1_TONE_ADDR); | ||
|  |     g_phy_ctxt.dep.phy_status.phy_band.bb_r1_b2 = \ | ||
|  |         PHY_READ_REG(CFG_BB_R1_B2_TONE_ADDR); | ||
|  | #endif
 | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | uint16_t phy_set_init_cnt() | ||
|  | { | ||
|  |     g_phy_ctxt.dep.phy_status.phy_init_cnt++; | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | uint16_t phy_get_init_cnt() | ||
|  | { | ||
|  |     return g_phy_ctxt.dep.phy_status.phy_init_cnt; | ||
|  | } | ||
|  | 
 | ||
|  | uint16_t phy_set_reinit_cnt() | ||
|  | { | ||
|  |     g_phy_ctxt.dep.phy_status.phy_reinit_cnt++; | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | uint16_t phy_get_reinit_cnt() | ||
|  | { | ||
|  |     return g_phy_ctxt.dep.phy_status.phy_reinit_cnt; | ||
|  | } | ||
|  | 
 | ||
|  | void phy_print_ana_dbg_info() | ||
|  | { | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_get_status() | ||
|  | { | ||
|  |     phy_get_rx_dc(); | ||
|  |     phy_get_tx_dc(); | ||
|  |     phy_get_dc_cal_cnt(); | ||
|  |     phy_get_overstress_cnt(); | ||
|  |     /* update by log print, share with flash log */ | ||
|  |     //phy_get_rxtd_reg_tx_pkt();
 | ||
|  |     //phy_get_granite_reg();
 | ||
|  |     phy_get_txfd_reg(); | ||
|  |     phy_get_dfe_reg(); | ||
|  |     phy_get_version(); | ||
|  |     phy_get_band_cfg(); | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | void phy_get_status_printf() | ||
|  | { | ||
|  |     phy_get_status(); | ||
|  | 
 | ||
|  |     if (++g_phy_period_60_min_cnt >= PHY_PERIOD_60_MIN) { | ||
|  |         iot_dbglog_input(PLC_PHY_STATUS_MID, DBGLOG_ERR, | ||
|  |             IOT_PHY_STATUS0_ID, 9,\ | ||
|  |             g_phy_ctxt.dep.phy_status.ppm_value,\ | ||
|  |             g_phy_ctxt.dep.phy_status.gain_dc.rx_dc_pga[0],\ | ||
|  |             g_phy_ctxt.dep.phy_status.gain_dc.rx_dc_pgf[0],\ | ||
|  |             g_phy_ctxt.dep.phy_status.gain_dc.rx_dc_pga[1],\ | ||
|  |             g_phy_ctxt.dep.phy_status.gain_dc.rx_dc_pgf[1],\ | ||
|  |             g_phy_ctxt.dep.phy_status.gain_dc.rx_dc_pga[2],\ | ||
|  |             g_phy_ctxt.dep.phy_status.gain_dc.rx_dc_pgf[2],\ | ||
|  |             g_phy_ctxt.dep.phy_status.gain_dc.rx_dc_pga[3],\ | ||
|  |             g_phy_ctxt.dep.phy_status.gain_dc.rx_dc_pgf[3]); | ||
|  | 
 | ||
|  |         iot_dbglog_input(PLC_PHY_STATUS_MID, DBGLOG_ERR, | ||
|  |             IOT_PHY_STATUS1_ID, 9,\ | ||
|  |             g_phy_ctxt.dep.phy_status.gain_dc.rx_dc_pga[4],\ | ||
|  |             g_phy_ctxt.dep.phy_status.gain_dc.rx_dc_pgf[4],\ | ||
|  |             g_phy_ctxt.dep.phy_status.gain_dc.rx_dc_pga[5],\ | ||
|  |             g_phy_ctxt.dep.phy_status.gain_dc.rx_dc_pgf[5],\ | ||
|  |             g_phy_ctxt.dep.phy_status.gain_dc.rx_dc_pga[6],\ | ||
|  |             g_phy_ctxt.dep.phy_status.gain_dc.rx_dc_pgf[6],\ | ||
|  |             g_phy_ctxt.dep.phy_status.gain_dc.rx_dc_pga[7],\ | ||
|  |             g_phy_ctxt.dep.phy_status.gain_dc.rx_dc_pgf[7],\ | ||
|  |             g_phy_ctxt.dep.phy_status.gain_dc.tx_dc[0]); | ||
|  |         g_phy_period_60_min_cnt = 0; | ||
|  |     } | ||
|  | 
 | ||
|  |     iot_dbglog_input(PLC_PHY_STATUS_MID, DBGLOG_ERR, | ||
|  |         IOT_PHY_STATUS2_ID, 9,\ | ||
|  |         g_phy_ctxt.dep.phy_status.gain_dc.tx_dc[1],\ | ||
|  |         g_phy_ctxt.dep.phy_status.gain_dc.tx_dc[2],\ | ||
|  |         g_phy_ctxt.dep.phy_status.gain_dc.tx_dc[3],\ | ||
|  |         g_phy_ctxt.dep.phy_status.dc_cal_cnt,\ | ||
|  |         g_phy_ctxt.indep.ovs_ctxt.os_cnt,\ | ||
|  |         g_phy_ctxt.dep.phy_status.phy_rx_cnt.phy_rx_pkt_cnt,\ | ||
|  |         g_phy_ctxt.dep.phy_status.phy_rx_cnt.phy_rx_fc_ok_cnt,\ | ||
|  |         g_phy_ctxt.dep.phy_status.phy_rx_cnt.phy_rx_fc_fail_cnt,\ | ||
|  |         g_phy_ctxt.dep.phy_status.phy_rx_cnt.phy_rx_pld_ok_cnt); | ||
|  | 
 | ||
|  |     iot_dbglog_input(PLC_PHY_STATUS_MID, DBGLOG_ERR, | ||
|  |         IOT_PHY_STATUS3_ID, 9,\ | ||
|  |         g_phy_ctxt.dep.phy_status.phy_rx_cnt.phy_rx_pld_fail_cnt,\ | ||
|  |         g_phy_ctxt.dep.phy_status.phy_tx_pkt_cnt,\ | ||
|  |         g_phy_ctxt.dep.phy_status.granite_reg[0],\ | ||
|  |         g_phy_ctxt.dep.phy_status.granite_reg[1],\ | ||
|  |         g_phy_ctxt.dep.phy_status.granite_reg[2],\ | ||
|  |         g_phy_ctxt.dep.phy_status.granite_reg[3],\ | ||
|  |         g_phy_ctxt.dep.phy_status.granite_reg[4],\ | ||
|  |         g_phy_ctxt.dep.phy_status.granite_reg[5],\ | ||
|  |         g_phy_ctxt.dep.phy_status.granite_reg[6]); | ||
|  | 
 | ||
|  |     if (++g_phy_period_30_min_cnt >= PHY_PERIOD_30_MIN) { | ||
|  |         iot_dbglog_input(PLC_PHY_STATUS_MID, DBGLOG_ERR, | ||
|  |             IOT_PHY_STATUS4_ID, 9,\ | ||
|  |             g_phy_ctxt.dep.phy_status.granite_reg[7],\ | ||
|  |             g_phy_ctxt.dep.phy_status.granite_reg[8],\ | ||
|  |             g_phy_ctxt.dep.phy_status.granite_reg[9],\ | ||
|  |             g_phy_ctxt.dep.phy_status.granite_reg[10],\ | ||
|  |             g_phy_ctxt.dep.phy_status.temp_res,\ | ||
|  |             g_phy_ctxt.dep.phy_status.phy_tx_pwr_reg.bb_rt0_bd0,\ | ||
|  |             g_phy_ctxt.dep.phy_status.phy_tx_pwr_reg.bb_rt0_bd1,\ | ||
|  |             g_phy_ctxt.dep.phy_status.phy_tx_pwr_reg.bb_rt0_bd2,\ | ||
|  |             g_phy_ctxt.dep.phy_status.phy_tx_pwr_reg.bb_rt1_bd0); | ||
|  | 
 | ||
|  |         iot_dbglog_input(PLC_PHY_STATUS_MID, DBGLOG_ERR, | ||
|  |             IOT_PHY_STATUS5_ID, 8,\ | ||
|  |             g_phy_ctxt.dep.phy_status.phy_tx_pwr_reg.bb_rt1_bd1,\ | ||
|  |             g_phy_ctxt.dep.phy_status.phy_tx_pwr_reg.bb_rt1_bd2,\ | ||
|  |             g_phy_ctxt.dep.phy_status.phy_band.bb_r0_b0,\ | ||
|  |             g_phy_ctxt.dep.phy_status.phy_band.bb_r0_b1,\ | ||
|  |             g_phy_ctxt.dep.phy_status.phy_band.bb_r0_b2,\ | ||
|  |             g_phy_ctxt.dep.phy_status.phy_band.bb_r1_b0,\ | ||
|  |             g_phy_ctxt.dep.phy_status.phy_band.bb_r1_b1,\ | ||
|  |             g_phy_ctxt.dep.phy_status.phy_band.bb_r1_b2); | ||
|  |         g_phy_period_30_min_cnt = 0; | ||
|  |     } | ||
|  | 
 | ||
|  |     iot_dbglog_input(PLC_PHY_STATUS_MID, DBGLOG_ERR, | ||
|  |         IOT_PHY_STATUS6_ID, 5,\ | ||
|  |         g_phy_ctxt.dep.phy_status.phy_gain_adjust_info,\ | ||
|  |         g_phy_ctxt.dep.phy_status.phy_mode, \ | ||
|  |         g_phy_ctxt.dep.phy_status.spur_array[9],\ | ||
|  |         phy_get_init_cnt(),\ | ||
|  |         phy_get_reinit_cnt()); | ||
|  | 
 | ||
|  |     iot_dbglog_input(PLC_PHY_STATUS_MID, DBGLOG_ERR, | ||
|  |         IOT_PHY_STATUS7_ID, 9,\ | ||
|  |         g_phy_ctxt.dep.phy_status.spur_array[0],\ | ||
|  |         g_phy_ctxt.dep.phy_status.spur_array[1],\ | ||
|  |         g_phy_ctxt.dep.phy_status.spur_array[2],\ | ||
|  |         g_phy_ctxt.dep.phy_status.spur_array[3],\ | ||
|  |         g_phy_ctxt.dep.phy_status.spur_array[4],\ | ||
|  |         g_phy_ctxt.dep.phy_status.spur_array[5],\ | ||
|  |         g_phy_ctxt.dep.phy_status.spur_array[6],\ | ||
|  |         g_phy_ctxt.dep.phy_status.spur_array[7],\ | ||
|  |         g_phy_ctxt.dep.phy_status.spur_array[8]); | ||
|  | 
 | ||
|  |     iot_dbglog_input(PLC_PHY_STATUS_MID, DBGLOG_ERR, | ||
|  |         IOT_PHY_STATUS8_ID, 7,\ | ||
|  |         g_phy_cpu_share_ctxt.nf_192p,\ | ||
|  |         g_phy_cpu_share_ctxt.nf_384p,\ | ||
|  |         g_phy_cpu_share_ctxt.nf_768p,\ | ||
|  |         g_phy_cpu_share_ctxt.nf_1536p,\ | ||
|  |         g_phy_cpu_share_ctxt.nf_3072p,\ | ||
|  |         g_phy_cpu_share_ctxt.nf_6144p,\ | ||
|  |         phy_spike_shift_en_get()); | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | void phy_tx_dbg_cnt_clr(void) | ||
|  | { | ||
|  |     uint32_t tmp = 0; | ||
|  | 
 | ||
|  |     tmp = PHY_READ_REG(CFG_BB_TX_END_FRM_CNT_ADDR); | ||
|  |     REG_FIELD_SET(PHY_TX_ABORT_CNT_CLR, tmp, 1); | ||
|  |     REG_FIELD_SET(PHY_TX_DONE_CNT_CLR, tmp, 1); | ||
|  |     PHY_WRITE_REG(CFG_BB_TX_END_FRM_CNT_ADDR, tmp); | ||
|  | 
 | ||
|  |     tmp = PHY_READ_REG(CFG_BB_TX_ST_FRM_CNT_ADDR); | ||
|  |     REG_FIELD_SET(PHY_TX_PRS_CNT_CLR, tmp, 1); | ||
|  |     REG_FIELD_SET(PHY_TX_START_CNT_CLR, tmp, 1); | ||
|  |     PHY_WRITE_REG(CFG_BB_TX_ST_FRM_CNT_ADDR, tmp); | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | uint32_t phy_get_tx_abort_info() | ||
|  | { | ||
|  | #if DEG_TX_ABORT
 | ||
|  |     uint32_t tmp; | ||
|  |     uint32_t sw_is_tx_rawdata; | ||
|  |     uint32_t sw_timeout_en; | ||
|  |     uint32_t tx_abort_cnt; | ||
|  | 
 | ||
|  |     tmp = PHY_READ_REG(CFG_BB_TX_END_FRM_CNT_ADDR); | ||
|  |     tx_abort_cnt = REG_FIELD_GET(PHY_TX_ABORT_CNT, tmp); | ||
|  | 
 | ||
|  |     if (g_phy_ctxt.dep.tx_abort_cnt != tx_abort_cnt) { | ||
|  | 
 | ||
|  |         g_phy_ctxt.dep.tx_abort_cnt = tx_abort_cnt; | ||
|  | 
 | ||
|  |         tmp = PHY_READ_REG(CFG_BB_RAW_DATA_MODE_CTRL_ADDR); | ||
|  |         sw_is_tx_rawdata = REG_FIELD_GET(SW_IS_TX_RAW_DATA_MODE, tmp); | ||
|  | 
 | ||
|  |         tmp = PHY_TX_READ_REG(CFG_BB_TX_WAROUND_CTRL_ADDR); | ||
|  |         sw_timeout_en = REG_FIELD_GET(SW_TIME_OUT_EN, tmp); | ||
|  | 
 | ||
|  |         iot_printf("HW dbg log, sw_is_tx_rawdata:0x%x, sw_timeout_en:0x%x,"\ | ||
|  |                "tx_abort_cnt = %d," | ||
|  |                "lock_vl:0x%x, phy_tx_int_raw:0x%x, mac_30:0x%x," | ||
|  |                "sts_0:0x%x, sts_1:0x%x,sts_2:0x%x,sts_3:0x%x,"\ | ||
|  |                "sts_4:0x%x, sts_5:0x%x,sts_6:0x%x,sts_7:0x%x,"\ | ||
|  |                "mtd0:0x%x, mtd1:0x%x, mtd2:0x%x, mtd3:0x%x, mtd4:0x%x,mtd5:0x%x\n"\ | ||
|  |                "timestap:0x%x, cur_ptr_lat:0x%x, tx_fc0:0x%x, tx_fc1:0x%x,"\ | ||
|  |                "tx_fc2:%x, tx_fc3:%x, pb_sumnum:0x%x\n",\ | ||
|  |                sw_is_tx_rawdata,\ | ||
|  |                sw_timeout_en,\ | ||
|  |                g_phy_ctxt.dep.tx_abort_cnt,\ | ||
|  |                g_phy_ctxt.dep.phy_dbg_bus_lock_value,\ | ||
|  |                g_phy_ctxt.dep.phy_tx_int_raw,\ | ||
|  |                g_phy_ctxt.dep.mac_reg_30,\ | ||
|  |                g_phy_ctxt.dep.dbg_sts_0,\ | ||
|  |                g_phy_ctxt.dep.dbg_sts_1,\ | ||
|  |                g_phy_ctxt.dep.dbg_sts_2,\ | ||
|  |                g_phy_ctxt.dep.dbg_sts_3,\ | ||
|  |                g_phy_ctxt.dep.dbg_sts_4,\ | ||
|  |                g_phy_ctxt.dep.dbg_sts_5,\ | ||
|  |                g_phy_ctxt.dep.dbg_sts_6,\ | ||
|  |                g_phy_ctxt.dep.dbg_sts_7,\ | ||
|  |                g_phy_ctxt.dep.mac_tx_data_0,\ | ||
|  |                g_phy_ctxt.dep.mac_tx_data_1,\ | ||
|  |                g_phy_ctxt.dep.mac_tx_data_2,\ | ||
|  |                g_phy_ctxt.dep.mac_tx_data_3,\ | ||
|  |                g_phy_ctxt.dep.mac_tx_data_4,\ | ||
|  |                g_phy_ctxt.dep.mac_tx_data_5,\ | ||
|  |                g_phy_ctxt.dep.timestap,\ | ||
|  |                g_phy_ctxt.dep.cur_ptr_lat,\ | ||
|  |                g_phy_ctxt.dep.tx_fc0,\ | ||
|  |                g_phy_ctxt.dep.tx_fc1,\ | ||
|  |                g_phy_ctxt.dep.tx_fc2,\ | ||
|  |                g_phy_ctxt.dep.tx_fc3,\ | ||
|  |                g_phy_ctxt.dep.pb_sumnum | ||
|  |                ); | ||
|  |     } | ||
|  | #endif
 | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | void phy_set_sw_time_out_en(uint8_t flag) | ||
|  | { | ||
|  | #if HW_PLATFORM >= HW_PLATFORM_FPGA
 | ||
|  |     uint32_t tmp = PHY_TX_READ_REG(CFG_BB_TX_WAROUND_CTRL_ADDR); | ||
|  |     REG_FIELD_SET(SW_TIME_OUT_EN, tmp, !!flag); | ||
|  |     PHY_TX_WRITE_REG(CFG_BB_TX_WAROUND_CTRL_ADDR, tmp); | ||
|  | #else
 | ||
|  |     (void)flag; | ||
|  | #endif
 | ||
|  | return; | ||
|  | } | ||
|  | 
 | ||
|  | void phy_dbg_set_tx_abort_reg() | ||
|  | { | ||
|  | #if HW_PLATFORM >= HW_PLATFORM_FPGA
 | ||
|  | #if DEG_TX_ABORT
 | ||
|  |     uint32_t tmp; | ||
|  | 
 | ||
|  |     tmp = PHY_READ_REG(CFG_BB_DBG_BUS_SEL_ADDR); | ||
|  |     REG_FIELD_SET(BB_DBG_BUS_SEL, tmp, 0); | ||
|  |     PHY_WRITE_REG(CFG_BB_DBG_BUS_SEL_ADDR, tmp); | ||
|  | 
 | ||
|  |     tmp = PHY_READ_REG(CFG_BB_PHY_DBG_BUS_LOCK_CTRL_ADDR); | ||
|  |     REG_FIELD_SET(SW_PHY_DBG_BUS_LOCK_CHOS, tmp, 43); | ||
|  |     REG_FIELD_SET(SW_PHY_DBG_BUS_LOCK_ENA, tmp, 1); | ||
|  |     PHY_WRITE_REG(CFG_BB_PHY_DBG_BUS_LOCK_CTRL_ADDR, tmp); | ||
|  | 
 | ||
|  |     tmp = RGF_TMR_READ_REG(CFG_PHY_TX_TIMEOUT_ADDR); | ||
|  |     REG_FIELD_SET(CFG_PHY_TX_TIMEOUT_EN, tmp, 0); | ||
|  |     RGF_TMR_WRITE_REG(CFG_PHY_TX_TIMEOUT_ADDR, tmp); | ||
|  | 
 | ||
|  |     tmp = PHY_READ_REG(CFG_BB_PHY_MPI_CTRL_ADDR); | ||
|  |     REG_FIELD_SET(SW_MAC_BAND_RATE_SEL, tmp, 1); | ||
|  |     PHY_WRITE_REG(CFG_BB_PHY_MPI_CTRL_ADDR, tmp); | ||
|  | 
 | ||
|  |     g_phy_ctxt.dep.tx_abort_cnt= 0; | ||
|  | #endif
 | ||
|  | #else
 | ||
|  |     (void); | ||
|  | #endif
 | ||
|  |     return; | ||
|  | } | ||
|  | 
 | ||
|  | void IRAM_ATTR phy_dbg_get_tx_abort_lock_value() | ||
|  | { | ||
|  | #if HW_PLATFORM >= HW_PLATFORM_FPGA
 | ||
|  | #if DEG_TX_ABORT
 | ||
|  |     uint32_t tmp; | ||
|  |     volatile uint8_t flag = 1; | ||
|  |     uint32_t cur_time = 0; | ||
|  |     int64_t time_span = 0; | ||
|  |     uint32_t start_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR); | ||
|  |     do { | ||
|  |         cur_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR); | ||
|  |         time_span = cur_time - start_time; | ||
|  |         if (time_span < 0) { // wrap around
 | ||
|  |             time_span = (0x100000000LL) - start_time + cur_time; | ||
|  |         } | ||
|  |         /* if timeout 10us , assert */ | ||
|  |         if (time_span > 25 * 10) { | ||
|  |             IOT_ASSERT(0); | ||
|  |         } | ||
|  | 
 | ||
|  |         tmp = PHY_READ_REG(CFG_BB_PHY_DBG_BUS_LOCK_CTRL_ADDR); | ||
|  |         /* wait lock enable = 0 */ | ||
|  |         if (!REG_FIELD_GET(SW_PHY_DBG_BUS_LOCK_ENA, tmp)) { | ||
|  |             flag = 0; | ||
|  |             /* record lock value */ | ||
|  |             g_phy_ctxt.dep.phy_dbg_bus_lock_value = \ | ||
|  |                 PHY_READ_REG(CFG_BB_PHY_DBG_BUS_LOCK_VALUE_ADDR); | ||
|  |             g_phy_ctxt.dep.phy_tx_int_raw = \ | ||
|  |                 PHY_TX_READ_REG(CFG_BB_TX_INT_RAW_ADDR); | ||
|  | 
 | ||
|  |             /* clr int */ | ||
|  |             PHY_TX_WRITE_REG(CFG_BB_TX_INT_CLR_ADDR, \ | ||
|  |                 g_phy_ctxt.dep.phy_tx_int_raw); | ||
|  | 
 | ||
|  |             g_phy_ctxt.dep.mac_reg_30 = \ | ||
|  |                 RGF_MAC_READ_REG(CFG_TX_DBG_CTRL_ADDR); | ||
|  |             g_phy_ctxt.dep.dbg_sts_0 =\ | ||
|  |                 PHY_TX_READ_REG(CFG_BB_TX_ABORT_DBG_STS_0_ADDR); | ||
|  |             g_phy_ctxt.dep.dbg_sts_1 =\ | ||
|  |                 PHY_TX_READ_REG(CFG_BB_TX_ABORT_DBG_STS_1_ADDR); | ||
|  |             g_phy_ctxt.dep.dbg_sts_2 =\ | ||
|  |                 PHY_TX_READ_REG(CFG_BB_TX_ABORT_DBG_STS_2_ADDR); | ||
|  |             g_phy_ctxt.dep.dbg_sts_3 =\ | ||
|  |                 PHY_TX_READ_REG(CFG_BB_TX_ABORT_DBG_STS_3_ADDR); | ||
|  |             g_phy_ctxt.dep.dbg_sts_4 =\ | ||
|  |                 PHY_TX_READ_REG(CFG_BB_TX_ABORT_DBG_STS_4_ADDR); | ||
|  |             g_phy_ctxt.dep.dbg_sts_5 =\ | ||
|  |                 PHY_TX_READ_REG(CFG_BB_TX_ABORT_DBG_STS_5_ADDR); | ||
|  |             g_phy_ctxt.dep.dbg_sts_6 =\ | ||
|  |                 PHY_TX_READ_REG(CFG_BB_TX_ABORT_DBG_STS_6_ADDR); | ||
|  |             g_phy_ctxt.dep.dbg_sts_7 =\ | ||
|  |                 PHY_TX_READ_REG(CFG_BB_TX_ABORT_DBG_STS_7_ADDR); | ||
|  | 
 | ||
|  |             /*clear all sts registers*/ | ||
|  |             tmp = PHY_TX_READ_REG(CFG_BB_TX_ABORT_DBG_CTRL_ADDR); | ||
|  |             REG_FIELD_SET(SW_TX_ABORT_DBG_CLR, tmp, 1); | ||
|  |             PHY_TX_WRITE_REG(CFG_BB_TX_ABORT_DBG_CTRL_ADDR, tmp); | ||
|  | 
 | ||
|  |             /* release for HW next lock */ | ||
|  |             tmp = PHY_TX_READ_REG(CFG_BB_TX_ABORT_DBG_CTRL_ADDR); | ||
|  |             REG_FIELD_SET(SW_TX_ABORT_DBG_LOCK_CLR, tmp, 1); | ||
|  |             PHY_TX_WRITE_REG(CFG_BB_TX_ABORT_DBG_CTRL_ADDR, tmp); | ||
|  | 
 | ||
|  |             /* set lock enable = 1 */ | ||
|  |             tmp = PHY_READ_REG(CFG_BB_PHY_DBG_BUS_LOCK_CTRL_ADDR); | ||
|  |             REG_FIELD_SET(SW_PHY_DBG_BUS_LOCK_ENA, tmp, 1); | ||
|  |             PHY_WRITE_REG(CFG_BB_PHY_DBG_BUS_LOCK_CTRL_ADDR, tmp); | ||
|  | 
 | ||
|  |             g_phy_ctxt.dep.mac_tx_data_0 = RGF_MAC_READ_REG(CFG_MAC_TX_DATA0_ADDR); | ||
|  |             g_phy_ctxt.dep.mac_tx_data_1 = RGF_MAC_READ_REG(CFG_MAC_TX_DATA1_ADDR); | ||
|  |             g_phy_ctxt.dep.mac_tx_data_2 = RGF_MAC_READ_REG(CFG_MAC_TX_DATA2_ADDR); | ||
|  |             g_phy_ctxt.dep.mac_tx_data_3 = RGF_MAC_READ_REG(CFG_MAC_TX_DATA3_ADDR); | ||
|  |             g_phy_ctxt.dep.mac_tx_data_4 = RGF_MAC_READ_REG(CFG_MAC_TX_DATA4_ADDR); | ||
|  |             g_phy_ctxt.dep.mac_tx_data_5 = RGF_MAC_READ_REG(CFG_MAC_TX_DATA5_ADDR); | ||
|  | 
 | ||
|  |             g_phy_ctxt.dep.timestap = RGF_RAW_READ_REG(CFG_TX_TIMESTAP_ADDR); | ||
|  |             g_phy_ctxt.dep.cur_ptr_lat = RGF_RAW_READ_REG(CFG_TX_CUR_PTR_LAT_ADDR); | ||
|  |             g_phy_ctxt.dep.tx_fc0 = RGF_RAW_READ_REG(CFG_DESC_SW_TX_FC0_ADDR); | ||
|  |             g_phy_ctxt.dep.tx_fc1 = RGF_RAW_READ_REG(CFG_DESC_SW_TX_FC1_ADDR); | ||
|  |             g_phy_ctxt.dep.tx_fc2 = RGF_RAW_READ_REG(CFG_DESC_SW_TX_FC2_ADDR); | ||
|  |             g_phy_ctxt.dep.tx_fc3 = RGF_RAW_READ_REG(CFG_DESC_SW_TX_FC3_ADDR); | ||
|  |             g_phy_ctxt.dep.pb_sumnum = RGF_RAW_READ_REG(CFG_DESC_PB_SYMNUM_ADDR); | ||
|  | 
 | ||
|  |         } | ||
|  |     } while(flag); | ||
|  | #endif
 | ||
|  | #else
 | ||
|  |     (void); | ||
|  | #endif
 | ||
|  |     return; | ||
|  | } | ||
|  | 
 | ||
|  | void phy_dump_busy_set(bool_t en) | ||
|  | { | ||
|  |     (void)en; | ||
|  | } | ||
|  | 
 | ||
|  | bool_t phy_busy_get(void *phy_ctxt, PHY_BUSY_ID id) | ||
|  | { | ||
|  |     (void)id; | ||
|  |     (void)phy_ctxt; | ||
|  |     return false; | ||
|  | } | ||
|  | 
 |