* 函 数 名  : bsp_om_socp_clean_rd_buf
*
* 功能描述  :清理SOCP的RD缓存
*
* 输入参数  :chan_id :socp 的通道ID
*                       rd_stru: 入参
*
* 输出参数  :无
*
* 返 回 值  : BSP_OK 成功; 其他 失败
*****************************************************************************/

u32 bsp_om_socp_clean_rd_buf(u32 chan_id,SOCP_BUFFER_RW_STRU *rd_stru)
{
    u32             ret;
    SOCP_BUFFER_RW_STRU    rd_buf_stru = {0};

    osl_sem_down(&socp_opt_sem);

    ret = (u32)bsp_socp_get_rd_buffer(chan_id,&rd_buf_stru);

    if(BSP_OK != ret)
    {
        ret  = BSP_ERR_OMS_SOCP_GET_RD_ERR;

        goto fail;
    }

    /* 无RD需要释放*/
    if( (0 ==rd_buf_stru.u32Size)&&(0 == rd_buf_stru.u32RbSize))
    {
         ret  = BSP_OK;
         goto successful;
    }

    /* 获取到的RD数据异常*/
    if((rd_buf_stru.u32Size + rd_buf_stru.u32RbSize) > BSP_OM_CODER_SRC_RDSIZE)
    {
        ret  = BSP_ERR_OMS_SOCP_CLEAN_RD_ERR;
        goto fail;
    }

    if(0 != (rd_buf_stru.u32Size / sizeof(SOCP_RD_DATA_STRU)))
    {
        rd_stru->pBuffer = rd_buf_stru.pBuffer;
        rd_stru->u32Size = rd_buf_stru.u32Size;
        (void)cacheInvalidate(DATA_CACHE, rd_buf_stru.pBuffer, rd_buf_stru.u32Size);
    }
    else
    {
        ret  = BSP_ERR_OMS_SOCP_CLEAN_RD_ERR;

        goto fail;
    }

    ret = (u32)bsp_socp_read_rd_done(chan_id, rd_buf_stru.u32Size);  /* 释放rd缓存 */
    if( BSP_OK !=ret)
    {
        goto fail;
    }
    else
    {
        ret  = BSP_OK;
        goto successful;
    }

fail:
    osl_sem_up(&socp_opt_sem);
    return ret;
successful:
    osl_sem_up(&socp_opt_sem);
    return ret;
}
/*****************************************************************************
 函 数 名  : DRV_SOCP_GET_RD_BUFFER
 功能描述  : 该此接口用于获取RD buffer的数据指针。
 输入参数  : u32SrcChanID:源通道ID
             pBuff:  RD buffer
 输出参数  : 无。
 返 回 值  : SOCP_OK:获取RD环形缓冲区成功
             SOCP_ERROR:获取RD环形缓冲区失败
*****************************************************************************/
BSP_S32 DRV_SOCP_GET_RD_BUFFER( BSP_U32 u32SrcChanID,SOCP_BUFFER_RW_STRU *pBuff)
{
    return bsp_socp_get_rd_buffer(u32SrcChanID, pBuff);
}
u32 bsp_om_socp_clean_rd_buf(u32 chan_id,SOCP_BUFFER_RW_STRU *rd_stru)
{
    u32             ret;
    SOCP_BUFFER_RW_STRU    rd_buf_stru = {0};

    osl_sem_down(&socp_opt_sem);

    ret = (u32)bsp_socp_get_rd_buffer(chan_id,&rd_buf_stru);

    if(BSP_OK != ret)
    {
        ret  = BSP_ERR_OMS_SOCP_GET_RD_ERR;

        goto fail;
    }

    /* 无RD需要释放*/
    if( (0 ==rd_buf_stru.u32Size)&&(0 == rd_buf_stru.u32RbSize))
    {
         ret  = BSP_OK;
         goto successful;
    }

    /* 获取到的RD数据异常*/
    if((rd_buf_stru.u32Size + rd_buf_stru.u32RbSize) > BSP_OM_CODER_SRC_RDSIZE)
    {
        ret  = BSP_ERR_OMS_SOCP_CLEAN_RD_ERR;
        goto fail;
    }

    if(0 != (rd_buf_stru.u32Size / sizeof(SOCP_RD_DATA_STRU)))
    {
        /*lint -save -e713*/
        dma_map_single(NULL, (void *)bsp_om_phy_virt(((uintptr_t)rd_buf_stru.pBuffer)), rd_buf_stru.u32Size, DMA_FROM_DEVICE);
        /*lint -restore*/
        rd_stru->pBuffer = (char *)bsp_om_phy_virt(((uintptr_t)rd_buf_stru.pBuffer));
        rd_stru->u32Size = rd_buf_stru.u32Size;
    }
    else
    {
        ret  = BSP_ERR_OMS_SOCP_CLEAN_RD_ERR;

        goto fail;
    }

    ret = (u32)bsp_socp_read_rd_done(chan_id, rd_buf_stru.u32Size);  /* 释放rd缓存 */
    if( BSP_OK !=ret)
    {
        goto fail;
    }
    else
    {
        ret = BSP_OK;
        goto successful;
    }

fail:
    osl_sem_up(&socp_opt_sem);
    return ret;
successful:
    osl_sem_up(&socp_opt_sem);
    return ret;
}