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; }
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; }
/***************************************************************************** * 函 数 名 : 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; }