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;
}
Esempio n. 2
0
/*****************************************************************************
 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;

}