/*
 * Copyright (C) 2009 Realtek Semiconductor Corp. 
 * All Rights Reserved.
 *
 * This program is the proprietary software of Realtek Semiconductor
 * Corporation and/or its licensors, and only be used, duplicated, 
 * modified or distributed under the authorized license from Realtek. 
 *
 * ANY USE OF THE SOFTWARE OTHER THAN AS AUTHORIZED UNDER 
 * THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. 
 *
 * $Revision: 1.1 $
 * $Date: 2011/04/11 13:34:56 $
 *
 * Purpose : RTL8370 switch high-level API for RTL8367B
 * Feature : 
 *
 */

#include <rtl8370_asicdrv_oam.h>

/*
@func ret_t | rtl8370_setAsicOamParser | Set OAM parser state
@parm uint32 | port | Physical port number (0~7).
@parm uint32 | parser | Per-Port OAM parser state
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error.
@rvalue RT_ERR_PORT_ID | Invalid port number.
@comm
    The API can set per-port OAM parser state. Using OAM parser and multiplex configuration to implement 
    OAM loopback testing.
 */
 ret_t rtl8370_setAsicOamParser(uint32 port, uint32 parser)
{
    uint32 regBits;
    uint32 regAddr;

    if(port >= RTL8370_PORTNO)
        return RT_ERR_PORT_ID;

    if(parser > OAM_PARFWDCPU)
        return RT_ERR_NOT_ALLOWED;

    regAddr = RTL8370_OAM_PARSER_REG(port);
    regBits = RTL8370_OAM_PARSER_MASK(port);

    return rtl8370_setAsicRegBits(regAddr, regBits, parser);
}

/*
@func ret_t | rtl8370_getAsicOamParser | Set OAM parser state
@parm uint32 | port | Physical port number (0~7).
@parm uint32* | parser | Per-Port OAM parser state
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error.
@rvalue RT_ERR_PORT_ID | Invalid port number.
@comm
    The API can get per-port OAM parser state. Using OAM parser and multiplex configuration to implement 
    OAM loopback testing.
 */
ret_t rtl8370_getAsicOamParser(uint32 port, uint32* parser)
{
    uint32 regAddr;
    uint32 regBits;

    if(port >= RTL8370_PORTNO)
        return RT_ERR_PORT_ID;

    regAddr = RTL8370_OAM_PARSER_REG(port);
    regBits = RTL8370_OAM_PARSER_MASK(port);

    return rtl8370_getAsicRegBits(regAddr,regBits, &(*parser));
}

/*
@func ret_t | rtl8370_setAsicOamMultiplexer | Set OAM multiplexer state
@parm uint32 | port | Physical port number (0~7).
@parm uint32 | multiplexer | Per-Port OAM multiplexer state
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error.
@rvalue RT_ERR_PORT_ID | Invalid port number.
@comm
    The API can set per-port OAM multiplexer state. Using OAM parser and multiplex configuration to implement 
    OAM loopback testing.
 */
ret_t rtl8370_setAsicOamMultiplexer(uint32 port, uint32 multiplexer)
{
    uint32 regBits;
    uint32 regAddr;

    if(port >= RTL8370_PORTNO)
        return RT_ERR_PORT_ID;

    if(multiplexer > OAM_MULCPU)
        return RT_ERR_NOT_ALLOWED;

    regAddr = RTL8370_OAM_MULTIPLEXER_REG(port);
    regBits = RTL8370_OAM_MULTIPLEXER_MASK(port);

    return rtl8370_setAsicRegBits(regAddr, regBits, multiplexer);
}

/*
@func ret_t | rtl8370_getAsicOamMultiplexer | Get OAM multiplexer state
@parm uint32 | port | Physical port number (0~7).
@parm uint32* | multiplexer | Per-Port OAM multiplexer state
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error.
@rvalue RT_ERR_PORT_ID | Invalid port number.
@comm
    The API can get per-port OAM multiplexer state. Using OAM parser and multiplex configuration to implement 
    OAM loopback testing.
 */
ret_t rtl8370_getAsicOamMultiplexer(uint32 port, uint32* multiplexer)
{
    uint32 regAddr;
    uint32 regBits;

    if(port >= RTL8370_PORTNO)
        return RT_ERR_PORT_ID;

    regAddr = RTL8370_OAM_MULTIPLEXER_REG(port);
    regBits = RTL8370_OAM_MULTIPLEXER_MASK(port);

    return rtl8370_getAsicRegBits(regAddr,regBits, &(*multiplexer));
}
/*
@func ret_t | rtl8370_setAsicOamCpuPri | Set trap priority for OAM packet
@parm uint32 | priority | Mirrored priority (0~7). 
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error.
@rvalue RT_ERR_QOS_INT_PRIORITY | Invalid priority. 
@comm
    The API can set trapped priority for OAM packet
 */

ret_t rtl8370_setAsicOamCpuPri(uint32 priority)
{
    if(priority > RTL8370_PRIMAX)
        return RT_ERR_QOS_INT_PRIORITY;

    return rtl8370_setAsicRegBits(RTL8370_REG_QOS_TRAP_PRIORITY0, RTL8370_OAM_PRIOIRTY_MASK, priority);
}
/*
@func ret_t | rtl8370_getAsicOamCpuPri | Get trap priority for OAM packet
@parm uint32* | priority | Mirrored priority (0~7). 
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error.
@comm
    The API can get trapped priority for OAM packet
 */
ret_t rtl8370_getAsicOamCpuPri(uint32 *priority)
{
    return rtl8370_getAsicRegBits(RTL8370_REG_QOS_TRAP_PRIORITY0, RTL8370_OAM_PRIOIRTY_MASK, priority);
}

/*
@func ret_t | rtl8370_setAsicOamEnable | Set OAM function
@parm uint32 | enabled | OAM function usage 1:enable, 0:disabled.
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error.
@comm
    The API can set OAM function enabled or not
 */
ret_t rtl8370_setAsicOamEnable(uint32 enabled)
{
    return rtl8370_setAsicRegBit(RTL8370_REG_OAM_CTRL, RTL8370_OAM_CTRL_OFFSET, enabled);
}
/*
@func ret_t | rtl8370_getAsicOamEnable | Get OAM function
@parm uint32* | enabled | OAM function usage 1:enable, 0:disabled.
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error.
@comm
    The API can get OAM function enabled or not
 */
ret_t rtl8370_getAsicOamEnable(uint32 *enabled)
{
    return rtl8370_getAsicRegBit(RTL8370_REG_OAM_CTRL, RTL8370_OAM_CTRL_OFFSET, enabled);
}