コード例 #1
0
s32 check_filter_restore_status(void)
{
    s32 ret;
    u32 i,j,k,filter_serial;
    IPF_MATCH_INFO_S* hard_filter_info;
    u32 *hard_filter_info_addr;
    IPF_MATCH_INFO_S* backup_filter_info;
    u32* backup_info_addr = NULL;
    hard_filter_info = (IPF_MATCH_INFO_S*)malloc(sizeof(IPF_MATCH_INFO_S));
    if(NULL == hard_filter_info)
    {
        bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_IPF, "\r pstMatchInfo malloc ERROR! \n");
        return IPF_ERROR;
    }
    hard_filter_info_addr = (u32*)hard_filter_info;

    for(i=0 ; i < IPF_MODEM_MAX; i++)
    {
        backup_info_addr = (u32 *)(IPF_PWRCTL_BASIC_FILTER_ADDR + i*sizeof(IPF_MATCH_INFO_S));
        backup_filter_info = (IPF_MATCH_INFO_S*)backup_info_addr;
        filter_serial = i;
        k = 0;
        do
        {
            if(filter_serial < IPF_BF_NUM)
            {
                ipf_writel(filter_serial, HI_IPF_REGBASE_ADDR_VIRT + HI_BFLT_INDEX_OFFSET); 
                for(j=0; j<(sizeof(IPF_MATCH_INFO_S)/4); j++)
                {
                    *hard_filter_info_addr = ipf_readl((HI_IPF_REGBASE_ADDR_VIRT+HI_FLT_LOCAL_ADDR0_OFFSET+j*4)); 
                    hard_filter_info_addr++;
                }
                k++;
                ret = CmpMatchInfo(backup_filter_info, hard_filter_info);
                if(ret != 0)
                {
                    bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_IPF, "chainNum = %d \n",i);
                    bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_IPF, "filterNum = %d \n",filter_serial);
                    bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_IPF, "========BACKUPED_FILTER_INFO=======\n");
                    PrintMatchInfo(backup_filter_info);
                    bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_IPF, "========FILTER_ACTUAL_INFO=======\n");
                    PrintMatchInfo(hard_filter_info);
                }
            hard_filter_info_addr = (u32*)hard_filter_info;
            }
            filter_serial = backup_filter_info->unFltChain.Bits.u16NextIndex;
            backup_filter_info = (IPF_MATCH_INFO_S*)(IPF_PWRCTL_BASIC_FILTER_ADDR + filter_serial*sizeof(IPF_MATCH_INFO_S));
            backup_info_addr = (u32 *)backup_filter_info;
            if(k >= IPF_BF_NUM)
            {
                bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_IPF, "Filter end error!\n");
                return IPF_ERROR;
            }
        }while(filter_serial != IPF_TAIL_INDEX);
    }
	return IPF_SUCCESS;
}
コード例 #2
0
s32 compare_reg_table(u32* reg_table, u32* backup_space, u32 reg_table_size)
{
	u32 i;
	u32* backup_info;
	u32 reg_info;
	
	backup_info = backup_space;
	for(i=0; i<reg_table_size/4; i++)
	{	
		reg_info = ipf_readl(*(reg_table+i) + HI_IPF_REGBASE_ADDR_VIRT);
		if(*backup_info != reg_info)
		{
			bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_IPF, "compare_reg_table error!\n");
			bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_IPF, "backup_info = 0x%x\n", *backup_info);
			bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_IPF, "reg_info = 0x%x\n",reg_info);
			return IPF_ERROR;
		}
		backup_info ++;

	}
	return IPF_SUCCESS;
}
コード例 #3
0
/*****************************************************************************
* 函 数 名       : ipf_drx_bak_reg
*
* 功能描述  : 提供的低功耗接口,保存IPF相关信息
*
* 输入参数  : 无
*             
* 输出参数  : 无
* 返 回 值     : IPF_SUCCESS     IPF可以下电,相关信息已经保存
*                           IPF_ERROR        IPF不可以下电
* 注意:该函数需要在锁中断的情况下调用
* 修改记录  : 2013年4月23日v1.00 chendongyue 创建
*****************************************************************************/
s32 ipf_drx_bak_reg(void)
{
    u32* u32_addr = NULL;
    u32 i = 0;
    u32 u32_total = 0;
    u32 u32_ul_state = 0;
    u32 u32_dl_state = 0;
    u32 u32ADCtrl[IPF_CHANNEL_MAX] = {0,0};

#ifdef CONFIG_BALONG_MODEM_RESET
    if(IPF_FORRESET_CONTROL_ALLOW != g_u32_ipf_ccore_reset_flag)
    {
        return IPF_SUCCESS;
    }
#endif
	
    /* 判断上行IPF是否空闲 */    
    u32_ul_state = ipf_readl(HI_IPF_REGBASE_ADDR_VIRT + HI_IPF_CH0_STATE_OFFSET);

    if(u32_ul_state != IPF_CHANNEL_STATE_IDLE)
    {
        return IPF_ERROR;
    }

    /* 判断下行IPF是否空闲 */  	    
    u32_dl_state = ipf_readl(HI_IPF_REGBASE_ADDR_VIRT + HI_IPF_CH1_STATE_OFFSET);

    if(u32_dl_state != IPF_CHANNEL_STATE_IDLE)
    {
        return IPF_ERROR;
    }
    u32ADCtrl[IPF_CHANNEL_UP] = ipf_readl(HI_IPF_REGBASE_ADDR_VIRT + HI_IPF_CH0_ADQ_CTRL_OFFSET);
    u32ADCtrl[IPF_CHANNEL_DOWN] = ipf_readl(HI_IPF_REGBASE_ADDR_VIRT + HI_IPF_CH1_ADQ_CTRL_OFFSET);
    u32ADCtrl[IPF_CHANNEL_UP] &= IPF_ADQ_EN_MASK;
    u32ADCtrl[IPF_CHANNEL_DOWN] &= IPF_ADQ_EN_MASK;
    u32ADCtrl[IPF_CHANNEL_UP] |= (IPF_NO_ADQ);
    u32ADCtrl[IPF_CHANNEL_DOWN] |= (IPF_NO_ADQ);

    /*关闭ADQ通道,用于防止产生ADQ预取*/
    ipf_writel(u32ADCtrl[IPF_CHANNEL_UP], HI_IPF_REGBASE_ADDR_VIRT + HI_IPF_CH0_ADQ_CTRL_OFFSET);
    ipf_writel(u32ADCtrl[IPF_CHANNEL_DOWN], HI_IPF_REGBASE_ADDR_VIRT + HI_IPF_CH1_ADQ_CTRL_OFFSET);

	
    /* 保存必要的寄存器 */
    u32_total = sizeof(g_ipf_setting_table)/sizeof(u32);
    u32_addr = g_u32_ipf_setting_bak_addr;
    
    for(i=0; i<u32_total; i++)
    {
        *u32_addr = ipf_readl(g_ipf_setting_table[i] + HI_IPF_REGBASE_ADDR_VIRT);
        u32_addr ++;
    }

    u32_total = sizeof(g_ipf_adq_wptr_chctrl_table)/sizeof(u32);
    u32_addr = g_u32_ipf_adq_wptr_chctrl_bak_addr;
	
    /* 单独保存ADQ_Wptr寄存器和状态寄存器,该组寄存器需要特殊处理 */
    for(i=0; i<u32_total; i++)
    {
        *u32_addr = ipf_readl(g_ipf_adq_wptr_chctrl_table[i] + HI_IPF_REGBASE_ADDR_VIRT);
        u32_addr ++;
    }
	
    /*由于上电配置顺序问题,备份剩余的寄存器*/
    u32_total = sizeof(g_ipf_adq_rptr_table)/sizeof(u32);
    u32_addr = g_u32_ipf_adq_rptr_bak_addr;


    /* 单独保存ADQ_Rptr寄存器和状态寄存器,该寄存器需要特殊处理 */
    for(i=0; i<u32_total; i++)
    {
        *u32_addr = ipf_readl(g_ipf_adq_rptr_table[i] + HI_IPF_REGBASE_ADDR_VIRT);
        u32_addr ++;
    }

    return IPF_SUCCESS;
}