/*****************************************************************************
 Function Name   : diag_ReleaseLogBuf
 Description     : 释放RD缓冲区中数据和使用内存
 Input           :SOCP_CODER_SRC_ENUM_U32 ulSrcChanID
 Output          : VOS_UINT32
 Return          : VOS_UINT32

 History         :
    1.w00182550      2012-11-19  Draft Enact

*****************************************************************************/
VOS_UINT32 diag_ReleaseLogBuf(SOCP_CODER_SRC_ENUM_U32 ulSrcChanID)
{
    VOS_UINT32 ulDataLen = 0;
    VOS_UINT_PTR ulDataAddr = 0;
    VOS_UINT32 ulIndex = 0;
    VOS_UINT8  *pucVirtAddr =NULL;

    /* 清空所有已发送RD */
    if (VOS_OK != SCM_RlsSrcRDAll(ulSrcChanID, &ulDataAddr, &ulDataLen))
    {
        g_stDiagToHsoErrRecord.usRlsRdErr++;
        diag_printf("Function:%s error, ulSrcChanID = %d  \n", __FUNCTION__, ulSrcChanID);
        return ERR_MSP_FAILURE;
    }

    /* 已经没有RD */
    if ((VOS_NULL == ulDataAddr) || (0 == ulDataLen))
    {
        //diag_printf("diag_ReleaseLogBuf:ulDataAddr=0x%x,ulDataLen=%d\n",ulDataAddr,ulDataLen);
        g_stDiagToHsoErrRecord.usNoRdNum++;
        return ERR_MSP_SUCCESS;
    }

    /*根据通道类型获取要释放哪个BUF数据*/
    ulIndex = diag_GetBufIndex(ulSrcChanID);
    /*从SOCP出来的地址为实地址,需要转成虚地址操作*/
    /*lint -save -e40*/
    pucVirtAddr = diag_BuffPhyToVirt((VOS_UINT8*)ulDataAddr,(VOS_UINT8*)DIAG_MEM_ADDR_BASE,(VOS_UINT8*)g_DiagMemVirt,(VOS_UINT32)(g_stDiagBufCtrl[ulIndex].lBufSize));
    /*lint -restore*/
    if (VOS_NULL_PTR == pucVirtAddr)
    {
        g_stDiagToHsoErrRecord.usRlsAddrErr++;
        diag_printf("Function:%s error ulDataAddr = %d \n", __FUNCTION__, ulDataAddr);
        return ERR_MSP_INVALID_OP;
    }

    /* 根据已发送RD总长度释放内存 */
    if (VOS_OK != diag_ReleaseLogMem(&g_stDiagBufCtrl[ulIndex], pucVirtAddr, (VOS_INT32)ulDataLen))
    {
        g_stDiagToHsoErrRecord.usRlsMemErr++;
        diag_printf("Function:%s ulIndex = %d Error\n", __FUNCTION__, ulIndex);
        return ERR_MSP_FAILURE;
    }

    return ERR_MSP_SUCCESS;
}
VOS_UINT32 diag_CreateLogBuf(DIAG_BUF_CTRL_STRU *pstBufCtrl, VOS_INT32 lBufSize)
{
    /* 参数检测 外部保证了不为空*/

    pstBufCtrl->lAlloc   = 0;
    pstBufCtrl->lRelease = 0;
    pstBufCtrl->lPadding = 0;
    pstBufCtrl->lBufSize = lBufSize;

    /*申请uncache的动态内存区*/
    pstBufCtrl->pucBuf = diag_BuffPhyToVirt(pstBufCtrl->pucRealBuf,(VOS_UINT8*)DIAG_MEM_ADDR_BASE,(VOS_UINT8*)g_DiagMemVirt,(VOS_UINT32)(pstBufCtrl->lBufSize));

    /* 分配内存失败 */
    if (VOS_NULL_PTR == pstBufCtrl->pucBuf)
    {
        g_stDiagToHsoErrRecord.usNoMemErr++;
        return ERR_MSP_MALLOC_FAILUE;
    }

    diag_printf("diag_CreateLogBuf: real addr=%p, virt addr==%p\n", pstBufCtrl->pucRealBuf, pstBufCtrl->pucBuf);

    return ERR_MSP_SUCCESS;
}