303 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			303 lines
		
	
	
		
			9.8 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 "hw_reg_api.h"
							 | 
						||
| 
								 | 
							
								#include "phy_data.h"
							 | 
						||
| 
								 | 
							
								#include "iot_config.h"
							 | 
						||
| 
								 | 
							
								#include "phy_bb.h"
							 | 
						||
| 
								 | 
							
								#include "phy_dfe_reg.h"
							 | 
						||
| 
								 | 
							
								#include "phy_rxtd_reg.h"
							 | 
						||
| 
								 | 
							
								#include "hw_tonemask.h"
							 | 
						||
| 
								 | 
							
								#include "iot_io.h"
							 | 
						||
| 
								 | 
							
								#include "iot_errno_api.h"
							 | 
						||
| 
								 | 
							
								#include "mac_sys_reg.h"
							 | 
						||
| 
								 | 
							
								#include "os_mem.h"
							 | 
						||
| 
								 | 
							
								#include "hw_phy_api.h"
							 | 
						||
| 
								 | 
							
								#include "phy_ana.h"
							 | 
						||
| 
								 | 
							
								#include "phy_phase.h"
							 | 
						||
| 
								 | 
							
								#include "iot_share_task.h"
							 | 
						||
| 
								 | 
							
								#include "phy_dump.h"
							 | 
						||
| 
								 | 
							
								#include "clk.h"
							 | 
						||
| 
								 | 
							
								#include "phy_reg.h"
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM >= HW_PLATFORM_FPGA
							 | 
						||
| 
								 | 
							
								#include "phy_perf.h"
							 | 
						||
| 
								 | 
							
								#include "mac_status.h"
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_fft_dump_recover()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM >= HW_PLATFORM_FPGA
							 | 
						||
| 
								 | 
							
								    uint32_t tmp = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* tone disbale */
							 | 
						||
| 
								 | 
							
								    phy_dfe_tone_cfg(0,0,0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* disable force */
							 | 
						||
| 
								 | 
							
								    phy_txrx_ovr_set(0,0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* enable packet detect timeout */
							 | 
						||
| 
								 | 
							
								    phy_pkt_time_out_disable(false);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* bypass dc blocker */
							 | 
						||
| 
								 | 
							
								    tmp = PHY_DFE_READ_REG(CFG_BB_DC_BLK_STAGE_DLY_ADDR);
							 | 
						||
| 
								 | 
							
								    REG_FIELD_SET(SW_DC_BLK_BYPASS, tmp, 0);
							 | 
						||
| 
								 | 
							
								    PHY_DFE_WRITE_REG(CFG_BB_DC_BLK_STAGE_DLY_ADDR, tmp);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* fix gain and disable agc */
							 | 
						||
| 
								 | 
							
								    phy_agc_gain_lvl_set(0,60,-24,0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* enable adj and disable sat */
							 | 
						||
| 
								 | 
							
								    phy_agc_sat_adj_set(0,0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* disable auto-adjust gain */
							 | 
						||
| 
								 | 
							
								    phy_agc_gain_adj_dis(0xE7FFC0FF);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    tmp = PHY_DFE_READ_REG(CFG_BB_LOOPBACK_TEST_CFG_ADDR);
							 | 
						||
| 
								 | 
							
								    REG_FIELD_SET(SW_LOOPBACK_EN, tmp, 0);
							 | 
						||
| 
								 | 
							
								    PHY_DFE_WRITE_REG(CFG_BB_LOOPBACK_TEST_CFG_ADDR, tmp);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* config det tone */
							 | 
						||
| 
								 | 
							
								    phy_update_tone_det_range();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int phy_rx_fft_done(int reg_addr)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    int ret = ERR_OK;
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM >= HW_PLATFORM_FPGA
							 | 
						||
| 
								 | 
							
								    uint32_t tmp;
							 | 
						||
| 
								 | 
							
								    tmp = PHY_DFE_READ_REG(CFG_BB_LOOPBACK_TEST_CFG_ADDR);
							 | 
						||
| 
								 | 
							
								    ret = REG_FIELD_GET(LOOP_FFT_DONE, tmp);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    (void)reg_addr;
							 | 
						||
| 
								 | 
							
								    return ret;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint32_t phy_rx_fft_dump( \
							 | 
						||
| 
								 | 
							
								    uint32_t *buf_ptr, \
							 | 
						||
| 
								 | 
							
								    int8_t gain, \
							 | 
						||
| 
								 | 
							
								    uint8_t pkt_idx, \
							 | 
						||
| 
								 | 
							
								    uint8_t pkt_max)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint32_t ret = ERR_OK;
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM >= HW_PLATFORM_FPGA
							 | 
						||
| 
								 | 
							
								    uint32_t tmp = 0;
							 | 
						||
| 
								 | 
							
								    uint8_t timeout = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t core_freq = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t *csi_buf = (uint32_t *)BB_CSI_BASEADDR;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* check pkt idx and max valid */
							 | 
						||
| 
								 | 
							
								    IOT_ASSERT(pkt_idx < pkt_max && pkt_max <= FFT_DUMP_PKT_MAX);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* first dump pkt */
							 | 
						||
| 
								 | 
							
								    if(pkt_idx == 0) {
							 | 
						||
| 
								 | 
							
								        /* save force value */
							 | 
						||
| 
								 | 
							
								        tmp = RGF_MAC_READ_REG(CFG_PHY_FORCE_0_ADDR);
							 | 
						||
| 
								 | 
							
								        g_phy_ctxt.dep.rx_phase_force_en = \
							 | 
						||
| 
								 | 
							
								            REG_FIELD_GET(CFG_PHY_RX_PHASE_SEL_FORCE_EN, tmp);
							 | 
						||
| 
								 | 
							
								        g_phy_ctxt.dep.rx_phase_force = \
							 | 
						||
| 
								 | 
							
								            REG_FIELD_GET(CFG_PHY_RX_PHASE_SEL, tmp);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /* fix gain and disable agc */
							 | 
						||
| 
								 | 
							
								        phy_agc_gain_lvl_set(1,gain,-24,0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /* enable rx all phase */
							 | 
						||
| 
								 | 
							
								        phy_rx_phase_force_set_on_dump(true, PLC_PHASE_ALL);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /* record core freq before fft trigger */
							 | 
						||
| 
								 | 
							
								        core_freq = clk_core_freq_get();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /* fft dump prepare */
							 | 
						||
| 
								 | 
							
								        phy_fft_dump_prepare();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /* wait fft done */
							 | 
						||
| 
								 | 
							
								        timeout = iot_wait_timeout_fun(phy_rx_fft_done, \
							 | 
						||
| 
								 | 
							
								            CFG_BB_LOOPBACK_TEST_CFG_ADDR, 1, IOT_FFT_DONE_WAIT_MS);
							 | 
						||
| 
								 | 
							
								        if (timeout == ERR_TIMEOVER) {
							 | 
						||
| 
								 | 
							
								            phy_force_0_access_require();
							 | 
						||
| 
								 | 
							
								            /* check force rx abort */
							 | 
						||
| 
								 | 
							
								            tmp = RGF_MAC_READ_REG(CFG_PHY_FORCE_0_ADDR);
							 | 
						||
| 
								 | 
							
								            if (REG_FIELD_GET(CFG_PHY_RX_ABORT, tmp) != 0) {
							 | 
						||
| 
								 | 
							
								                /* clr force */
							 | 
						||
| 
								 | 
							
								                REG_FIELD_SET(CFG_PHY_RX_ABORT, tmp, 0);
							 | 
						||
| 
								 | 
							
								                REG_FIELD_SET(CFG_PHY_RX_ABORT_FORCE_EN, tmp, 0);
							 | 
						||
| 
								 | 
							
								                RGF_MAC_WRITE_REG(CFG_PHY_FORCE_0_ADDR, tmp);
							 | 
						||
| 
								 | 
							
								                phy_force_0_access_release();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                /* try again */
							 | 
						||
| 
								 | 
							
								                timeout = iot_wait_timeout_fun(phy_rx_fft_done, \
							 | 
						||
| 
								 | 
							
								                    CFG_BB_LOOPBACK_TEST_CFG_ADDR, 1, IOT_FFT_DONE_WAIT_MS);
							 | 
						||
| 
								 | 
							
								                if (timeout == ERR_TIMEOVER) {
							 | 
						||
| 
								 | 
							
								                    IOT_ASSERT(0);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            } else {
							 | 
						||
| 
								 | 
							
								                phy_force_0_access_release();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                /* judge is rx status or not */
							 | 
						||
| 
								 | 
							
								                extern uint32_t mac_get_phy_txrx_sts();
							 | 
						||
| 
								 | 
							
								                /* MAC_PHY_RX_STS : 1 */
							 | 
						||
| 
								 | 
							
								                if (mac_get_phy_txrx_sts() != 1) {
							 | 
						||
| 
								 | 
							
								                    /* is not rx status, return */
							 | 
						||
| 
								 | 
							
								                    return ERR_FAIL;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								                /* enable sw csi buf access */
							 | 
						||
| 
								 | 
							
								                enable_sw_access_csi_buf(0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                /* fft dump revert */
							 | 
						||
| 
								 | 
							
								                phy_fft_dump_recover();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                /* fft dump prepare */
							 | 
						||
| 
								 | 
							
								                phy_fft_dump_prepare();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                /* try again */
							 | 
						||
| 
								 | 
							
								                timeout = iot_wait_timeout_fun(phy_rx_fft_done, \
							 | 
						||
| 
								 | 
							
								                    CFG_BB_LOOPBACK_TEST_CFG_ADDR, 1, IOT_FFT_DONE_WAIT_MS);
							 | 
						||
| 
								 | 
							
								                if (timeout == ERR_TIMEOVER) {
							 | 
						||
| 
								 | 
							
								#if (IOT_FLASH_SIZE >=2 )
							 | 
						||
| 
								 | 
							
								                    iot_printf("fft dump timeout FORCE_0:%x,"
							 | 
						||
| 
								 | 
							
								                        "FORCE_1:%x,FORCE_2:%x,RD_MACPHY:%x\n", \
							 | 
						||
| 
								 | 
							
								                        RGF_MAC_READ_REG(CFG_PHY_FORCE_0_ADDR), \
							 | 
						||
| 
								 | 
							
								                        RGF_MAC_READ_REG(CFG_PHY_FORCE_1_ADDR), \
							 | 
						||
| 
								 | 
							
								                        RGF_MAC_READ_REG(CFG_PHY_FORCE_2_ADDR), \
							 | 
						||
| 
								 | 
							
								                        RGF_MAC_READ_REG(CFG_RD_MACPHY_INTF_0_ADDR));
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								                    uint32_t dbg_dump_buf[14] = {0};
							 | 
						||
| 
								 | 
							
								                    dbg_dump_buf[0] = RGF_MAC_READ_REG(CFG_PHY_FORCE_0_ADDR);
							 | 
						||
| 
								 | 
							
								                    dbg_dump_buf[1] = RGF_MAC_READ_REG(CFG_PHY_FORCE_1_ADDR);
							 | 
						||
| 
								 | 
							
								                    dbg_dump_buf[2] = RGF_MAC_READ_REG(CFG_PHY_FORCE_2_ADDR);
							 | 
						||
| 
								 | 
							
								                    dbg_dump_buf[3] = RGF_MAC_READ_REG(CFG_RD_MACPHY_INTF_0_ADDR);
							 | 
						||
| 
								 | 
							
								                    dbg_dump_buf[4] = PHY_RXTD_READ_REG(CFG_BB_AGC_DROP_TH_ADDR);
							 | 
						||
| 
								 | 
							
								                    dbg_dump_buf[5] = PHY_RXTD_READ_REG(CFG_BB_AGC_RAMUP_TH_ADDR);
							 | 
						||
| 
								 | 
							
								                    dbg_dump_buf[6] = core_freq;
							 | 
						||
| 
								 | 
							
								                    dbg_dump_buf[7] = clk_core_freq_get();
							 | 
						||
| 
								 | 
							
								                    dbg_dump_buf[8] = PHY_RXTD_READ_REG(CFG_RX_TD_DBG_BUS0_ADDR);
							 | 
						||
| 
								 | 
							
								                    dbg_dump_buf[9] = PHY_RXTD_READ_REG(CFG_RX_TD_DBG_BUS1_ADDR);
							 | 
						||
| 
								 | 
							
								                    dbg_dump_buf[10] = PHY_RXTD_READ_REG(CFG_RX_TD_DBG_BUS2_ADDR);
							 | 
						||
| 
								 | 
							
								                    dbg_dump_buf[11] = PHY_RXTD_READ_REG(CFG_RX_TD_DBG_BUS3_ADDR);
							 | 
						||
| 
								 | 
							
								                    dbg_dump_buf[12] = PHY_READ_REG(CFG_BB_TX_TD_DBG_BUS_ADDR);
							 | 
						||
| 
								 | 
							
								                    dbg_dump_buf[13] = PHY_READ_REG(CFG_BB_TX_FD_FSM_DBG_BUS_ADDR);
							 | 
						||
| 
								 | 
							
								                    mac_dump_buf(MAC_DUMP_TYPE_8, dbg_dump_buf, 14,
							 | 
						||
| 
								 | 
							
								                        NULL, 0, NULL, 0, true);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /* enable sw csi buf access */
							 | 
						||
| 
								 | 
							
								        enable_sw_access_csi_buf(1);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* memcpy data from csi buf to buf */
							 | 
						||
| 
								 | 
							
								    os_mem_cpy(buf_ptr, \
							 | 
						||
| 
								 | 
							
								        csi_buf + pkt_idx * (IOT_PHY_CSI_BUF_LEN >> 2), \
							 | 
						||
| 
								 | 
							
								        IOT_PHY_CSI_BUF_LEN);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* last dump pkt */
							 | 
						||
| 
								 | 
							
								    if(pkt_idx == (pkt_max - 1)) {
							 | 
						||
| 
								 | 
							
								        /* enable sw csi buf access */
							 | 
						||
| 
								 | 
							
								        enable_sw_access_csi_buf(0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /* fft dump revert */
							 | 
						||
| 
								 | 
							
								        phy_fft_dump_recover();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /* recover force */
							 | 
						||
| 
								 | 
							
								        phy_rx_phase_force_set_on_dump( \
							 | 
						||
| 
								 | 
							
								            g_phy_ctxt.dep.rx_phase_force_en, \
							 | 
						||
| 
								 | 
							
								            g_phy_ctxt.dep.rx_phase_force);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    (void)buf_ptr;
							 | 
						||
| 
								 | 
							
								    (void)gain;
							 | 
						||
| 
								 | 
							
								    (void)pkt_idx;
							 | 
						||
| 
								 | 
							
								    (void)pkt_max;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return ret;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint32_t phy_rx_full_fft_dump(uint32_t *buf_ptr)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint32_t ret = ERR_OK;
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM >= HW_PLATFORM_FPGA
							 | 
						||
| 
								 | 
							
								    uint32_t tmp = 0;
							 | 
						||
| 
								 | 
							
								    uint8_t timeout = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t *csi_buf = (uint32_t *)BB_CSI_BASEADDR;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* fft dump prepare */
							 | 
						||
| 
								 | 
							
								    phy_fft_dump_prepare();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* wait fft done */
							 | 
						||
| 
								 | 
							
								    timeout = iot_wait_timeout_fun(phy_rx_fft_done, \
							 | 
						||
| 
								 | 
							
								        CFG_BB_LOOPBACK_TEST_CFG_ADDR, 1, IOT_FFT_DONE_WAIT_MS);
							 | 
						||
| 
								 | 
							
								    if (timeout == ERR_TIMEOVER) {
							 | 
						||
| 
								 | 
							
								        phy_force_0_access_require();
							 | 
						||
| 
								 | 
							
								        /* check force rx abort */
							 | 
						||
| 
								 | 
							
								        tmp = RGF_MAC_READ_REG(CFG_PHY_FORCE_0_ADDR);
							 | 
						||
| 
								 | 
							
								        if (REG_FIELD_GET(CFG_PHY_RX_ABORT, tmp) != 0) {
							 | 
						||
| 
								 | 
							
								            /* clr force */
							 | 
						||
| 
								 | 
							
								            REG_FIELD_SET(CFG_PHY_RX_ABORT, tmp, 0);
							 | 
						||
| 
								 | 
							
								            REG_FIELD_SET(CFG_PHY_RX_ABORT_FORCE_EN, tmp, 0);
							 | 
						||
| 
								 | 
							
								            RGF_MAC_WRITE_REG(CFG_PHY_FORCE_0_ADDR, tmp);
							 | 
						||
| 
								 | 
							
								            phy_force_0_access_release();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            /* try again */
							 | 
						||
| 
								 | 
							
								            timeout = iot_wait_timeout_fun(phy_rx_fft_done, \
							 | 
						||
| 
								 | 
							
								                CFG_BB_LOOPBACK_TEST_CFG_ADDR, 1, IOT_FFT_DONE_WAIT_MS);
							 | 
						||
| 
								 | 
							
								            if (timeout == ERR_TIMEOVER) {
							 | 
						||
| 
								 | 
							
								                IOT_ASSERT(0);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            phy_force_0_access_release();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            /* judge is rx status or not */
							 | 
						||
| 
								 | 
							
								            extern uint32_t mac_get_phy_txrx_sts();
							 | 
						||
| 
								 | 
							
								            /* MAC_PHY_RX_STS : 1 */
							 | 
						||
| 
								 | 
							
								            if (mac_get_phy_txrx_sts() != 1) {
							 | 
						||
| 
								 | 
							
								                /* is not rx status, return */
							 | 
						||
| 
								 | 
							
								                return ERR_FAIL;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            /* enable sw csi buf access */
							 | 
						||
| 
								 | 
							
								            enable_sw_access_csi_buf(0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            /* fft dump prepare */
							 | 
						||
| 
								 | 
							
								            phy_fft_dump_prepare();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            /* try again */
							 | 
						||
| 
								 | 
							
								            timeout = iot_wait_timeout_fun(phy_rx_fft_done, \
							 | 
						||
| 
								 | 
							
								                CFG_BB_LOOPBACK_TEST_CFG_ADDR, 1, IOT_FFT_DONE_WAIT_MS);
							 | 
						||
| 
								 | 
							
								            if (timeout == ERR_TIMEOVER) {
							 | 
						||
| 
								 | 
							
								                IOT_ASSERT(0);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* enable sw csi buf access */
							 | 
						||
| 
								 | 
							
								    enable_sw_access_csi_buf(1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* memcpy data from csi buf to buf */
							 | 
						||
| 
								 | 
							
								    os_mem_cpy(buf_ptr, csi_buf, (TOTAL_TONE_MASK_NUM - 4) * 4);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* enable sw csi buf access */
							 | 
						||
| 
								 | 
							
								    enable_sw_access_csi_buf(0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    (void)buf_ptr;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return ret;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 |