VOS_VOID TAF_APS_ReleaseDfs(VOS_VOID) { #if defined(INSTANCE_1) #else TAF_APS_SWITCH_DDR_RATE_INFO_STRU *pstSwitchDdrInfo; pstSwitchDdrInfo = TAF_APS_GetSwitchDdrRateInfoAddr(); if (0 != TAF_APS_GET_DFS_PROFILE_NUM()) { if (PWRCTRL_GET_SUCCESS != PWRCTRL_DfsQosUpdate(DFS_QOS_ID_DDR_MINFREQ_E, (BSP_S32)pstSwitchDdrInfo->iDfsReqId, TAF_APS_GET_DSFLOW_RELEASE_DFS())) { TAF_APS_DFS_UPDATE_FAIL_CNT(1); TAF_APS_SndOmDfsInfo(pstSwitchDdrInfo); return; } pstSwitchDdrInfo->ulReqValue = TAF_APS_GET_DSFLOW_RELEASE_DFS(); pstSwitchDdrInfo->ulSetMaxFlag = VOS_FALSE; TAF_APS_DFS_UPDATE_SUCC_CNT(1); TAF_APS_SndOmDfsInfo(pstSwitchDdrInfo); DRV_PWRCTRL_SLEEPVOTE_UNLOCK(PWRCTRL_SLEEP_DSFLOW); } #endif return; }
/***************************************************************************** Function Name : drx_msp_fid_unvote Description : msp fids vote to sleep Input :drx_msp_fid_vote_e e_drx_vote Output : None Return : None History : *****************************************************************************/ VOS_VOID drx_msp_fid_vote_unlock(drx_msp_fid_vote_e e_drx_vote) { VOS_INT32 vote_status_temp = 0; VOS_INT32 vote_status_bit_shift = 0; 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); clear_drx_status_bit(vote_status_bit_shift);/*lint !e502 */ 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_UNLOCK(PWRCTRL_SLEEP_OAM); #endif #if(VOS_OS_VER == VOS_LINUX) wake_unlock(&msp_wakelock); #endif gbl_drx_cur_vote_status.drx_msp_cur_vote_status &= (~vote_status_bit_shift);/*lint !e502 */ } VOS_SmV(g_drx_vote_sem); }
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; }