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

/*
@func ret_t | rtl8370_setAsicStormFilterBroadcastEnable | Set per-port broadcast storm filter enable/disable.
@parm uint32 | port | Physical port number (0~15).
@parm uint32 | enabled | 1: enabled, 0: disabled.
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error. 
@rvalue RT_ERR_PORT_ID | Invalid port number.
@rvalue RT_ERR_ENABLE | Invalid input
@comm
    This API set per-port broadcast stomr filter enable/disable
    Broadcast storm filters of each port point to some meters. If 
    broadcast storm filter of port n is enabled, data length of
    broadcast packet will be included in the meter pointed by port
    n to elminate broadcast packet egress rate.
*/
ret_t rtl8370_setAsicStormFilterBroadcastEnable(uint32 port, uint32 enable)
{
    if(port >= RTL8370_PORTNO)
        return RT_ERR_PORT_ID;

    if(enable > 1)
        return RT_ERR_ENABLE;

    return rtl8370_setAsicRegBit(RTL8370_STORM_BCAST_REG, port, enable);
}

/*
@func ret_t | rtl8370_getAsicStormFilterBroadcastEnable | Get per-port broadcast storm filter enable/disable.
@parm uint32 | port | Physical port number (0~15).
@parm uint32* | enabled | 1: enabled, 0: disabled.
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error. 
@rvalue RT_ERR_PORT_ID | Invalid port number.
@comm
    This API get per-port broadcast stomr filter enable/disable
    Broadcast storm filters of each port point to some meters. If 
    broadcast storm filter of port n is enabled, data length of
    broadcast packet will be included in the meter pointed by port
    n to elminate broadcast packet egress rate.
*/
ret_t rtl8370_getAsicStormFilterBroadcastEnable(uint32 port, uint32 *enable)
{
    if(port >= RTL8370_PORTNO)
        return RT_ERR_PORT_ID;

    return rtl8370_getAsicRegBit(RTL8370_STORM_BCAST_REG, port, enable);
}

/*
@func ret_t | rtl8370_setAsicStormFilterBroadcastMeter | Set per-port broadcast storm filter meter.
@parm uint32 | port | port number (0~15).
@parm uint32 | meter | meter index (0~63).
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error. 
@rvalue RT_ERR_PORT_ID | Invalid port number.
@rvalue RT_ERR_FILTER_METER_ID | Invalid meter index
@comm
    This API set per-port broadcast stomr filter meter
    Broadcast storm filters of each port point to some meters. If 
    broadcast storm filter of port n is enabled, data length of
    broadcast packet will be included in the meter pointed by port
    n to elminate broadcast packet egress rate.
*/
ret_t rtl8370_setAsicStormFilterBroadcastMeter(uint32 port, uint32 meter)
{
    if(port >= RTL8370_PORTNO)
        return RT_ERR_PORT_ID;

    if(meter > RTL8370_METERMAX)
        return RT_ERR_FILTER_METER_ID;

    return rtl8370_setAsicRegBits(RTL8370_STORM_BCAST_METER_CRTL_REG(port), RTL8370_STORM_BCAST_METER_CRTL_MASK(port), meter);
}

/*
@func ret_t | rtl8370_getAsicStormFilterBroadcastMeter | Get per-port broadcast storm filter meter.
@parm uint32 | port | Physical port number (0~15).
@parm uint32* | meter | meter index (0~63).
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error. 
@rvalue RT_ERR_PORT_ID | Invalid port number.
@comm
    This API get per-port broadcast stomr filter meter
    Broadcast storm filters of each port point to some meters. If 
    broadcast storm filter of port n is enabled, data length of
    broadcast packet will be included in the meter pointed by port
    n to elminate broadcast packet egress rate.
*/
ret_t rtl8370_getAsicStormFilterBroadcastMeter(uint32 port, uint32 *meter)
{
    if(port >= RTL8370_PORTNO)
        return RT_ERR_PORT_ID;

    return rtl8370_getAsicRegBits(RTL8370_STORM_BCAST_METER_CRTL_REG(port), RTL8370_STORM_BCAST_METER_CRTL_MASK(port), meter);
}

/*
@func ret_t | rtl8370_setAsicStormFilterMulticastEnable | Set per-port multicast storm filter enable/disable.
@parm uint32 | port | Physical port number (0~15).
@parm uint32 | enabled | 1: enabled, 0: disabled.
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error. 
@rvalue RT_ERR_PORT_ID | Invalid port number.
@rvalue RT_ERR_ENABLE | Invalid input
@comm
    This API set per-port multicast storm filter enable/disable
    Multicast storm filters of each port point to some meters. If 
    multicast storm filter of port n is enabled, data length of
    multicast packet will be included in the meter pointed by port
    n to elminate multicast packet egress rate.
*/
ret_t rtl8370_setAsicStormFilterMulticastEnable(uint32 port, uint32 enable)
{
    if(port >= RTL8370_PORTNO)
        return RT_ERR_PORT_ID;

    if(enable > 1)
        return RT_ERR_ENABLE;

    return rtl8370_setAsicRegBit(RTL8370_STORM_MCAST_REG, port, enable);
}

/*
@func ret_t | rtl8370_getAsicStormFilterMulticastEnable | Get per-port multicast storm filter enable/disable.
@parm uint32 | port | Physical port number (0~15).
@parm uint32* | enabled | 1: enabled, 0: disabled.
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error. 
@rvalue RT_ERR_PORT_ID | Invalid port number.
@comm
    This API get per-port multicast storm filter enable/disable
    Multicast storm filters of each port point to some meters. If 
    multicast storm filter of port n is enabled, data length of
    multicast packet will be included in the meter pointed by port
    n to elminate multicast packet egress rate.
*/
ret_t rtl8370_getAsicStormFilterMulticastEnable(uint32 port, uint32 *enable)
{
    if(port >= RTL8370_PORTNO)
        return RT_ERR_PORT_ID;

    return rtl8370_getAsicRegBit(RTL8370_STORM_MCAST_REG, port, enable);
}

/*
@func ret_t | rtl8370_setAsicStormFilterMulticastMeter | Set per-port multicast storm filter meter.
@parm uint32 | port | Physical port number (0~15).
@parm uint32 | meter | meter index (0~63).
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error. 
@rvalue RT_ERR_PORT_ID | Invalid port number.
@rvalue RT_ERR_FILTER_METER_ID | Invalid meter index
@comm
    This API set per-port multicast storm filter meter
    Multicast storm filters of each port point to some meters. If 
    multicast storm filter of port n is enabled, data length of
    multicast packet will be included in the meter pointed by port
    n to elminate multicast packet egress rate.
*/
ret_t rtl8370_setAsicStormFilterMulticastMeter(uint32 port, uint32 meter)
{
    if(port >= RTL8370_PORTNO)
        return RT_ERR_PORT_ID;

    if(meter > RTL8370_METERMAX)
        return RT_ERR_FILTER_METER_ID;

    return rtl8370_setAsicRegBits(RTL8370_STORM_MCAST_METER_CRTL_REG(port), RTL8370_STORM_MCAST_METER_CRTL_MASK(port), meter);
}

/*
@func ret_t | rtl8370_getAsicStormFilterMulticastMeter | Get per-port multicast storm filter meter.
@parm uint32 | port | Physical port number (0~15).
@parm uint32* | meter | meter index (0~63).
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error. 
@rvalue RT_ERR_PORT_ID | Invalid port number.
@comm
    This API get per-port multicast storm filter meter
    Multicast storm filters of each port point to some meters. If 
    multicast storm filter of port n is enabled, data length of
    multicast packet will be included in the meter pointed by port
    n to elminate multicast packet egress rate.
*/
ret_t rtl8370_getAsicStormFilterMulticastMeter(uint32 port, uint32 *meter)
{
    if(port >= RTL8370_PORTNO)
        return RT_ERR_PORT_ID;

    return rtl8370_getAsicRegBits(RTL8370_STORM_MCAST_METER_CRTL_REG(port), RTL8370_STORM_MCAST_METER_CRTL_MASK(port), meter);
}

/*
@func ret_t | rtl8370_setAsicStormFilterUnknownMulticastEnable | Set per-port unknown multicast storm filter enable/disable.
@parm uint32 | port | Physical port number (0~15).
@parm uint32 | enabled | 1: enabled, 0: disabled.
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error. 
@rvalue RT_ERR_PORT_ID | Invalid port number.
@rvalue RT_ERR_ENABLE | Invalid input
@comm
    This API set per-port unknown multicast storm filter enable/disable
    Unknown multicast storm filters of each port point to some meters. If 
    unknown multicast storm filter of port n is enabled, data length of
    unknown multicast packet will be included in the meter pointed by port
    n to elminate unknown multicast packet egress rate.
*/
ret_t rtl8370_setAsicStormFilterUnknownMulticastEnable(uint32 port, uint32 enable)
{
    if(port >= RTL8370_PORTNO)
        return RT_ERR_PORT_ID;

    if(enable > 1)
        return RT_ERR_ENABLE;

    return rtl8370_setAsicRegBit(RTL8370_STORM_UNKNOWN_MCAST_REG, port, enable);
}

/*
@func ret_t | rtl8370_getAsicStormFilterUnknownMulticastEnable | Get per-port unknown multicast storm filter enable/disable.
@parm uint32 | port | Physical port number (0~15).
@parm uint32* | enabled | 1: enabled, 0: disabled.
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error. 
@rvalue RT_ERR_PORT_ID | Invalid port number.
@comm
    This API get per-port unknown multicast storm filter enable/disable
    Unknown multicast storm filters of each port point to some meters. If 
    unknown multicast storm filter of port n is enabled, data length of
    unknown multicast packet will be included in the meter pointed by port
    n to elminate unknown multicast packet egress rate.
*/
ret_t rtl8370_getAsicStormFilterUnknownMulticastEnable(uint32 port, uint32 *enable)
{
    if(port >= RTL8370_PORTNO)
        return RT_ERR_PORT_ID;

    return rtl8370_getAsicRegBit(RTL8370_STORM_UNKNOWN_MCAST_REG, port, enable);
}

/*
@func ret_t | rtl8370_setAsicStormFilterUnknownMulticastMeter | Set per-port unknown multicast storm filter meter.
@parm uint32 | port | Physical port number (0~15).
@parm uint32 | meter | meter index (0~63).
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error. 
@rvalue RT_ERR_PORT_ID | Invalid port number.
@rvalue RT_ERR_FILTER_METER_ID | Invalid meter index
@comm
    This API set per-port unknown multicast storm filter meter
    Unknown multicast storm filters of each port point to some meters. If 
    unknown multicast storm filter of port n is enabled, data length of
    unknown multicast packet will be included in the meter pointed by port
    n to elminate unknown multicast packet egress rate.
*/
ret_t rtl8370_setAsicStormFilterUnknownMulticastMeter(uint32 port, uint32 meter)
{
    if(port >= RTL8370_PORTNO)
        return RT_ERR_PORT_ID;

    if(meter > RTL8370_METERMAX)
        return RT_ERR_FILTER_METER_ID;

    return rtl8370_setAsicRegBits(RTL8370_STORM_UNMC_METER_CRTL_REG(port), RTL8370_STORM_UNMC_METER_CRTL_MASK(port), meter);
}

/*
@func ret_t | rtl8370_getAsicStormFilterUnknownMulticastMeter | Get per-port unknown multicast storm filter meter.
@parm uint32 | port | Physical port number (0~15).
@parm uint32* | meter | meter index (0~63).
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error. 
@rvalue RT_ERR_PORT_ID | Invalid port number.
@comm
    This API get per-port unknown multicast storm filter meter
    Unknown multicast storm filters of each port point to some meters. If 
    unknown multicast storm filter of port n is enabled, data length of
    unknown multicast packet will be included in the meter pointed by port
    n to elminate unknown multicast packet egress rate.
*/
ret_t rtl8370_getAsicStormFilterUnknownMulticastMeter(uint32 port, uint32 *meter)
{
    if(port >= RTL8370_PORTNO)
        return RT_ERR_PORT_ID;

    return rtl8370_getAsicRegBits(RTL8370_STORM_UNMC_METER_CRTL_REG(port), RTL8370_STORM_UNMC_METER_CRTL_MASK(port), meter);
}

/*
@func ret_t | rtl8370_setAsicStormFilterUnknownUnicastEnable | Set per-port unknown unicast storm filter enable/disable.
@parm uint32 | port | Physical port number (0~15).
@parm uint32 | enabled | 1: enabled, 0: disabled.
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error. 
@rvalue RT_ERR_PORT_ID | Invalid port number.
@rvalue RT_ERR_ENABLE | Invalid input
@comm
    This API set per-port unknown unicast storm filter enable/disable
    Unknown unicast storm filters of each port point to some meters. If 
    unknown unicast storm filter of port n is enabled, data length of
    unknown unicast packet will be included in the meter pointed by port
    n to elminate unknown unicast packet egress rate.
*/
ret_t rtl8370_setAsicStormFilterUnknownUnicastEnable(uint32 port, uint32 enable)
{
    if(port >= RTL8370_PORTNO)
        return RT_ERR_PORT_ID;

    if(enable > 1)
        return RT_ERR_ENABLE;

    return rtl8370_setAsicRegBit(RTL8370_STORM_UNKNOWN_UCAST_REG, port, enable);
}

/*
@func ret_t | rtl8370_getAsicStormFilterUnknownUnicastEnable | Get per-port unknown unicast storm filter enable/disable.
@parm uint32 | port | Physical port number (0~15).
@parm uint32* | enabled | 1: enabled, 0: disabled.
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error. 
@rvalue RT_ERR_PORT_ID | Invalid port number.
@comm
    This API get per-port unknown unicast storm filter enable/disable
    Unknown unicast storm filters of each port point to some meters. If 
    unknown unicast storm filter of port n is enabled, data length of
    unknown unicast packet will be included in the meter pointed by port
    n to elminate unknown unicast packet egress rate.
*/
ret_t rtl8370_getAsicStormFilterUnknownUnicastEnable(uint32 port, uint32 *enable)
{
    if(port >= RTL8370_PORTNO)
        return RT_ERR_PORT_ID;

    return rtl8370_getAsicRegBit(RTL8370_STORM_UNKNOWN_UCAST_REG, port, enable);
}

/*
@func ret_t | rtl8370_setAsicStormFilterUnknownUnicastMeter | Set per-port unknown unicast storm filter meter.
@parm uint32 | port | Physical port number (0~15).
@parm uint32 | meter | meter index (0~63).
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error. 
@rvalue RT_ERR_PORT_ID | Invalid port number.
@rvalue RT_ERR_FILTER_METER_ID | Invalid meter index
@comm
    This API set per-port unknown unicast storm filter meter
    Unknown unicast storm filters of each port point to some meters. If 
    unknown unicast storm filter of port n is enabled, data length of
    unknown unicast packet will be included in the meter pointed by port
    n to elminate unknown unicast packet egress rate.
*/
ret_t rtl8370_setAsicStormFilterUnknownUnicastMeter(uint32 port, uint32 meter)
{
    if(port >= RTL8370_PORTNO)
        return RT_ERR_PORT_ID;

    if(meter > RTL8370_METERMAX)
        return RT_ERR_FILTER_METER_ID;

    return rtl8370_setAsicRegBits(RTL8370_STORM_UNDA_METER_CRTL_REG(port), RTL8370_STORM_UNDA_METER_CRTL_MASK(port), meter);
}

/*
@func ret_t | rtl8370_getAsicStormFilterUnknownUnicastMeter | Get per-port unknown unicast storm filter meter.
@parm uint32 | port | Physical port number (0~15).
@parm uint32* | meter | meter index (0~63).
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error. 
@rvalue RT_ERR_PORT_ID | Invalid port number.
@comm
    This API get per-port unknown unicast storm filter meter
    Unknown unicast storm filters of each port point to some meters. If 
    unknown unicast storm filter of port n is enabled, data length of
    unknown unicast packet will be included in the meter pointed by port
    n to elminate unknown unicast packet egress rate.
*/
ret_t rtl8370_getAsicStormFilterUnknownUnicastMeter(uint32 port, uint32 *meter)
{
    if(port >= RTL8370_PORTNO)
        return RT_ERR_PORT_ID;

    return rtl8370_getAsicRegBits(RTL8370_STORM_UNDA_METER_CRTL_REG(port), RTL8370_STORM_UNDA_METER_CRTL_MASK(port), meter);
}