/*
 * 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_unknownMulticast.h>

/*
@func ret_t | rtl8370_setAsicUnknownL2MulticastBehavior | Set behavior of L2 multicast
@parm uint32 | port | Physical port number (0~15).
@parm uint32 | behav | 0: flooding, 1: drop, 2: trap
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error. 
@rvalue RT_ERR_PORT_ID | Invalid port number.
@rvalue RT_ERR_NOT_ALLOWED | Invalid operation.
@comm
    When receives an unknown multicast packet, switch may trap, drop or flood this packet
*/
ret_t rtl8370_setAsicUnknownL2MulticastBehavior(uint32 port, uint32 behav)
{

    if(port >  RTL8370_PORTIDMAX)
        return RT_ERR_PORT_ID;

    if(behav >= L2_BEHAV_MAX)
        return RT_ERR_NOT_ALLOWED;

    return rtl8370_setAsicRegBits(RTL8370_UNKNOWN_L2_MULTICAST_REG(port), RTL8370_UNKNOWN_L2_MULTICAST_MASK(port), behav);
}

/*
@func ret_t | rtl8370_getAsicUnknownL2MulticastBehavior | Get behavior of L2 multicast
@parm uint32 | port | Physical port number (0~15).
@parm uint32* | behav | 0: flooding, 1: drop, 2: trap
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error. 
@rvalue RT_ERR_PORT_ID | Invalid port number.
@comm
    When receives an unknown multicast packet, switch may trap, drop or flood this packet
*/
ret_t rtl8370_getAsicUnknownL2MulticastBehavior(uint32 port, uint32 *behav)
{

    if(port >  RTL8370_PORTIDMAX)
        return RT_ERR_PORT_ID;

    return rtl8370_getAsicRegBits(RTL8370_UNKNOWN_L2_MULTICAST_REG(port), RTL8370_UNKNOWN_L2_MULTICAST_MASK(port), behav);
}

/*
@func ret_t | rtl8370_setAsicUnknownIPv4MulticastBehavior | Set behavior of IPv4 multicast
@parm uint32 | port | Physical port number (0~15).
@parm uint32 | behav | 0: flooding, 1: drop, 2: trap
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error. 
@rvalue RT_ERR_PORT_ID | Invalid port number.
@rvalue RT_ERR_NOT_ALLOWED | Invalid operation.
@comm
    When receives an unknown multicast packet, switch may trap, drop or flood this packet
*/

ret_t rtl8370_setAsicUnknownIPv4MulticastBehavior(uint32 port, uint32 behav)
{

    if(port >  RTL8370_PORTIDMAX)
        return RT_ERR_PORT_ID;

    if(behav >= L2_BEHAV_MAX)
        return RT_ERR_NOT_ALLOWED;

    return rtl8370_setAsicRegBits(RTL8370_UNKNOWN_IPV4_MULTICAST_REG(port), RTL8370_UNKNOWN_IPV4_MULTICAST_MASK(port), behav);
}

/*
@func ret_t | rtl8370_getAsicUnknownIPv4MulticastBehavior | Get behavior of L2 multicast
@parm uint32 | port | Physical port number (0~15).
@parm uint32* | behav | 0: flooding, 1: drop, 2: trap
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error. 
@rvalue RT_ERR_PORT_ID | Invalid port number.
@comm
    When receives an unknown multicast packet, switch may trap, drop or flood this packet
*/
ret_t rtl8370_getAsicUnknownIPv4MulticastBehavior(uint32 port, uint32 *behav)
{
    if(port >  RTL8370_PORTIDMAX)
        return RT_ERR_PORT_ID;

    return rtl8370_getAsicRegBits(RTL8370_UNKNOWN_IPV4_MULTICAST_REG(port), RTL8370_UNKNOWN_IPV4_MULTICAST_MASK(port), behav);
}

/*
@func ret_t | rtl8370_setAsicUnknownIPv6MulticastBehavior | Set behavior of IPv6 multicast
@parm uint32 | port | Physical port number (0~15).
@parm uint32 | behav | 0: flooding, 1: drop, 2: trap
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error. 
@rvalue RT_ERR_PORT_ID | Invalid port number.
@rvalue RT_ERR_NOT_ALLOWED | Invalid operation.
@comm
    When receives an unknown multicast packet, switch may trap, drop or flood this packet
*/
ret_t rtl8370_setAsicUnknownIPv6MulticastBehavior(uint32 port, uint32 behav)
{
    if(port >  RTL8370_PORTIDMAX)
        return RT_ERR_PORT_ID;

    if(behav >= L2_BEHAV_MAX)
        return RT_ERR_NOT_ALLOWED;

    return rtl8370_setAsicRegBits(RTL8370_UNKNOWN_IPV6_MULTICAST_REG(port), RTL8370_UNKNOWN_IPV6_MULTICAST_MASK(port), behav);
}

/*
@func ret_t | rtl8370_getAsicUnknownIPv6MulticastBehavior | Get behavior of L2 multicast
@parm uint32 | port | Physical port number (0~15).
@parm uint32 | behav | 0: flooding, 1: drop, 2: trap
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error. 
@rvalue RT_ERR_PORT_ID | Invalid port number.
@comm
    When receives an unknown multicast packet, switch may trap, drop or flood this packet
*/
ret_t rtl8370_getAsicUnknownIPv6MulticastBehavior(uint32 port, uint32 *behav)
{

    if(port >  RTL8370_PORTIDMAX)
        return RT_ERR_PORT_ID;

    return rtl8370_getAsicRegBits(RTL8370_UNKNOWN_IPV6_MULTICAST_REG(port), RTL8370_UNKNOWN_IPV6_MULTICAST_MASK(port), behav);
}

/*
@func ret_t | rtl8370_setAsicUnknownMulticastTrapPriority | Set trap priority of unknown multicast frame
@parm uint32 | priority | priority (0~7)
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error. 
@rvalue RT_ERR_QOS_INT_PRIORITY | Invalid priority.
@comm
*/
ret_t rtl8370_setAsicUnknownMulticastTrapPriority(uint32 priority)
{
    if(priority > RTL8370_PRIMAX)
        return RT_ERR_QOS_INT_PRIORITY;

    return rtl8370_setAsicRegBits(RTL8370SG_QOS_TRAP_PRIORITY_CTRL0_REG, RTL8370_UNKNOWN_MC_PRIORTY_MASK, priority);
}

/*
@func ret_t | rtl8370_getAsicUnknownMulticastTrapPriority | Get trap priority of unknown multicast frame
@parm uint32* | priority | priority (0~7)
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error. 
@comm
*/
ret_t rtl8370_getAsicUnknownMulticastTrapPriority(uint32 *priority)
{
    return rtl8370_getAsicRegBits(RTL8370SG_QOS_TRAP_PRIORITY_CTRL0_REG, RTL8370_UNKNOWN_MC_PRIORTY_MASK, priority);
}