/***************************************************************************** Function Name : drx_msp_fid_vote Description : msp fids reject vote to sleep Input :drx_msp_fid_vote_e e_drx_vote Output : None Return : None History : *****************************************************************************/ VOS_VOID drx_msp_fid_vote_lock(drx_msp_fid_vote_e e_drx_vote) { VOS_INT32 vote_status_temp = 0; VOS_INT32 vote_status_bit_shift = 0; /* create sem */ if(0 ==g_drx_vote_sem) { if ( VOS_OK != VOS_SmBCreate( "DRX", 1, VOS_SEMA4_FIFO, &g_drx_vote_sem)) { vos_printf("%s: create sem failed!\n",__FUNCTION__); return; } } if(e_drx_vote >=DRX_MSP_VOTE_BUTT) { vos_printf("%s: e_drx_vote si too larger!\n",__FUNCTION__); return ; } /* modify current status */ if(VOS_OK != VOS_SmP(g_drx_vote_sem, 0)) { vos_printf("%s: post sem failed!\n",__FUNCTION__); return ; } /* save current status */ vote_status_temp = gbl_drx_msp_vote_status; vote_status_bit_shift = 0x1<<((VOS_INT32)e_drx_vote); set_drx_status_bit(vote_status_bit_shift); if((DRX_MSP_VOTE_SLEEP_OK == vote_status_temp) && (DRX_MSP_VOTE_SLEEP_OK != gbl_drx_msp_vote_status)) { #if(VOS_OS_VER == VOS_VXWORKS) DRV_PWRCTRL_SLEEPVOTE_LOCK(PWRCTRL_SLEEP_OAM); #endif #if(VOS_OS_VER == VOS_LINUX) wake_lock(&msp_wakelock); #endif gbl_drx_cur_vote_status.drx_msp_cur_vote_status |= vote_status_bit_shift; } VOS_SmV(g_drx_vote_sem); }
VOS_VOID TAF_APS_SetDfsMax(VOS_VOID) { TAF_APS_SWITCH_DDR_RATE_INFO_STRU *pstSwitchDdrInfo; TAF_APS_TIMER_STATUS_ENUM_U8 enTimerStatus; pstSwitchDdrInfo = TAF_APS_GetSwitchDdrRateInfoAddr(); /* 调频功能不支持,则什么都不处理 */ if (0 == TAF_APS_GET_DFS_PROFILE_NUM()) { return; } /* 当前流量定时器没有启动,什么都不处理 */ enTimerStatus = TAF_APS_GetTimerStatus(TI_TAF_APS_DSFLOW_REPORT, TAF_APS_INVALID_PDPID); if (TAF_APS_TIMER_STATUS_RUNING != enTimerStatus) { return; } /* 已经是最高档位,不再调节 */ if (TAF_APS_GET_DSFLOW_MAX_DDR_BAND() == pstSwitchDdrInfo->ulReqValue) { return; } /* 直接将DDR调到最高一档 */ if (PWRCTRL_GET_SUCCESS != PWRCTRL_DfsQosUpdate(DFS_QOS_ID_DDR_MINFREQ_E, (BSP_S32)pstSwitchDdrInfo->iDfsReqId, (BSP_U32)TAF_APS_GET_DSFLOW_MAX_DDR_BAND())) { TAF_APS_DFS_UPDATE_FAIL_CNT(1); TAF_APS_SndOmDfsInfo(pstSwitchDdrInfo); return; } pstSwitchDdrInfo->ulReqValue = TAF_APS_GET_DSFLOW_MAX_DDR_BAND(); pstSwitchDdrInfo->ulSetMaxFlag = VOS_TRUE; TAF_APS_DFS_UPDATE_SUCC_CNT(1); DRV_PWRCTRL_SLEEPVOTE_LOCK(PWRCTRL_SLEEP_DSFLOW); TAF_APS_SndOmDfsInfo(pstSwitchDdrInfo); return; }
VOS_VOID TAF_APS_SwitchDdrRateByCurrentRate( VOS_UINT32 ulDlRate, VOS_UINT32 ulUlRate ) { #if defined(INSTANCE_1) #else TAF_APS_SWITCH_DDR_RATE_INFO_STRU *pstSwitchDdrInfo; VOS_UINT32 ulReqValue; VOS_UINT32 ulMinDdrFlg; ulReqValue = TAF_APS_GET_DSFLOW_MIN_DDR_BAND(); pstSwitchDdrInfo = TAF_APS_GetSwitchDdrRateInfoAddr(); ulMinDdrFlg = VOS_FALSE; /* 如果有设置过最大频率这本次的调频不再处理 */ if (VOS_TRUE == pstSwitchDdrInfo->ulSetMaxFlag) { pstSwitchDdrInfo->ulSetMaxFlag = VOS_FALSE; return; } /* 目前的DDR调频策略: 下行大于72M, DDR调到533Mhz; 下行小于72M大于36M, 或者上行大于36M, DDR调到360Mhz; 下行小于36M大于2M, 或者上行小于36M大于2M, DDR调到266Mhz; 下行小于2M大于300K, 或者上行小于2M大于300K, DDR调到150Mhz; 上下行都小于300K, DDR调到75Mhz. */ /* 根据当前的上下行速率查找DDR投票请求值 */ if (VOS_TRUE == TAF_APS_GET_MULTI_DFS_SUPPORT_FLG()) { if (VOS_OK != TAF_APS_FindDfsReqValueByRat(&ulReqValue, ulDlRate, ulUlRate)) { return; } } if (VOS_FALSE == TAF_APS_GET_MULTI_DFS_SUPPORT_FLG()) { if (VOS_OK != TAF_APS_FindDfsReqValue(&ulReqValue, ulDlRate, ulUlRate)) { return; } } /* 防止重复投票 */ if (ulReqValue == pstSwitchDdrInfo->ulReqValue) { return; } if (PWRCTRL_GET_SUCCESS != PWRCTRL_DfsQosUpdate(DFS_QOS_ID_DDR_MINFREQ_E, (BSP_S32)pstSwitchDdrInfo->iDfsReqId, (BSP_U32)ulReqValue)) { TAF_APS_DFS_UPDATE_FAIL_CNT(1); TAF_APS_SndOmDfsInfo(pstSwitchDdrInfo); return; } pstSwitchDdrInfo->ulReqValue = ulReqValue; TAF_APS_DFS_UPDATE_SUCC_CNT(1); TAF_APS_SndOmDfsInfo(pstSwitchDdrInfo); ulMinDdrFlg = TAF_APS_CheckIfMinDdrBand(ulReqValue); /* 目前流量统计的时间是1秒,当突然没有流量时,连接态立即进入到IDLE态后,CCPU 进入睡眠后,流量统计定时器不再超时时,DDR之前投票到高频后就无法降到低频, 故增加对CCPU睡眠的投票 */ /* 流速小于300K时释放CCPU睡眠投票,大于300K时阻止CCPU睡眠 */ if (VOS_TRUE == ulMinDdrFlg) { DRV_PWRCTRL_SLEEPVOTE_UNLOCK(PWRCTRL_SLEEP_DSFLOW); } else { DRV_PWRCTRL_SLEEPVOTE_LOCK(PWRCTRL_SLEEP_DSFLOW); } #endif return; }
VOS_UINT32 Aging_TestInit(VOS_VOID) { NAS_MMA_NVIM_RF_AUTO_TEST_FLAG_STRU stRfAutoTestFlg; MODEM_ID_ENUM_UINT16 enModemID; VOS_UINT32 aulReceiverPid[] = {I0_DSP_PID_GPHY, I1_DSP_PID_GPHY}; VOS_MemSet(g_apstGAgingTestMsg, VOS_NULL_PTR, sizeof(g_apstGAgingTestMsg)); g_pstOmAgingTestNV = (OM_AGING_TEST_NV_STRU*)VOS_MemAlloc( WUEPS_PID_AGING, STATIC_MEM_PT, sizeof(OM_AGING_TEST_NV_STRU)); if (VOS_NULL_PTR == g_pstOmAgingTestNV) { PS_LOG(WUEPS_PID_AGING, 0, PS_PRINT_WARNING, "Aging_TestInit: VOS_MemAlloc fail.\n"); return VOS_ERR; } /*读取老化测试需要的NV项*/ if(NV_OK != NV_Read(en_NV_Item_AGING_TEST_TABLE, g_pstOmAgingTestNV, sizeof(OM_AGING_TEST_NV_STRU))) { PS_LOG(WUEPS_PID_AGING, 0, PS_PRINT_WARNING, "Aging_TestInit: NV_Read fail.\n"); return VOS_ERR; } /*判断老化测试是否开启*/ if (VOS_NO == g_pstOmAgingTestNV->ulIsEnable) { return VOS_ERR; } /*读取自动开机使能位*/ if(NV_OK != NV_Read(en_NV_Item_RF_Auto_Test_Flag, &stRfAutoTestFlg, sizeof(NAS_MMA_NVIM_RF_AUTO_TEST_FLAG_STRU))) { PS_LOG(WUEPS_PID_AGING, 0, PS_PRINT_WARNING, "Aging_TestInit: RF NV_Read fail.\n"); return VOS_ERR; } if(VOS_YES == stRfAutoTestFlg.usRfAutoTestFlg) { PS_LOG(WUEPS_PID_AGING, 0, PS_PRINT_WARNING, "Aging_TestInit: Auto test enabled!\n"); return VOS_ERR; } /*参数检测*/ if ((0 == g_pstOmAgingTestNV->ulNumber) || (OM_AGING_TEST_NUM < g_pstOmAgingTestNV->ulNumber) || (0 == g_pstOmAgingTestNV->ulTimerLen)) { return VOS_ERR; } PS_LOG(WUEPS_PID_AGING, 0, PS_PRINT_INFO, "Aging_TestInit: Aging test is launched.\n"); DRV_PWRCTRL_SLEEPVOTE_LOCK(PWRCTRL_SLEEP_FTM); for (enModemID = MODEM_ID_0; enModemID < MODEM_ID_BUTT; enModemID++) { /*初始化发送给G物理层的配置数据包*/ g_apstGAgingTestMsg[enModemID] = (GPHY_OAM_RF_AGING_TEST_REQ_STRU*)VOS_AllocMsg( WUEPS_PID_AGING, sizeof(GPHY_OAM_RF_AGING_TEST_REQ_STRU) - VOS_MSG_HEAD_LENGTH); if (VOS_NULL_PTR == g_apstGAgingTestMsg[enModemID]) { PS_LOG(WUEPS_PID_AGING, 0, PS_PRINT_WARNING, "Aging_TestInit: VOS_AllocMsg fail.\n"); return VOS_ERR; } VOS_ReserveMsg(WUEPS_PID_AGING, (MsgBlock *)g_apstGAgingTestMsg[enModemID]); g_apstGAgingTestMsg[enModemID]->ulReceiverPid = aulReceiverPid[enModemID]; g_apstGAgingTestMsg[enModemID]->enMsgId = ID_OAM_GPHY_RF_AGING_TEST_REQ; } /*初始化发送给W物理层的配置数据包*/ g_pstWAgingTestMsg = (WPHY_OAM_RF_AGING_TEST_REQ_STRU*)VOS_AllocMsg( WUEPS_PID_AGING, sizeof(WPHY_OAM_RF_AGING_TEST_REQ_STRU) - VOS_MSG_HEAD_LENGTH); if (VOS_NULL_PTR == g_pstWAgingTestMsg) { PS_LOG(WUEPS_PID_AGING, 0, PS_PRINT_WARNING, "Aging_TestInit: VOS_AllocMsg fail.\n"); return VOS_ERR; } VOS_ReserveMsg(WUEPS_PID_AGING, (MsgBlock *)g_pstWAgingTestMsg); g_pstWAgingTestMsg->ulReceiverPid = DSP_PID_WPHY; g_pstWAgingTestMsg->enMsgID = ID_OAM_WPHY_RF_AGING_TEST_REQ; /*启动老化测试定时器*/ if (VOS_OK != VOS_StartRelTimer(&g_hAgingTestTimer, WUEPS_PID_AGING, 10000, OM_AGING_START_TIMER, 0, VOS_RELTIMER_NOLOOP, VOS_TIMER_NO_PRECISION)) { PS_LOG(WUEPS_PID_AGING, 0, PS_PRINT_ERROR, "Aging_TestInit:VOS_StartRelTimer fail!"); return VOS_ERR; } return VOS_OK; }