1
0
Fork 0
mirror of https://github.com/Ysurac/openmptcprouter.git synced 2025-03-09 15:40:20 +00:00

Add 5.14 support for mediatek

This commit is contained in:
Ycarus (Yannick Chabanois) 2021-10-13 14:19:17 +02:00
parent 9f6def27da
commit 444a3d544a
187 changed files with 105445 additions and 1 deletions

View file

@ -0,0 +1,66 @@
obj-$(CONFIG_RTL8367S_GSW) += rtl8367s_gsw.o
rtl8367s_gsw-objs := rtl8367s_mdio.o rtl8367s_dbg.o
ifeq ($(CONFIG_SWCONFIG),y)
rtl8367s_gsw-objs += rtl8367s.o
endif
rtl8367s_gsw-objs += rtl8367c/acl.o
rtl8367s_gsw-objs += rtl8367c/cpu.o
rtl8367s_gsw-objs += rtl8367c/dot1x.o
rtl8367s_gsw-objs += rtl8367c/eee.o
rtl8367s_gsw-objs += rtl8367c/igmp.o
rtl8367s_gsw-objs += rtl8367c/interrupt.o
rtl8367s_gsw-objs += rtl8367c/l2.o
rtl8367s_gsw-objs += rtl8367c/leaky.o
rtl8367s_gsw-objs += rtl8367c/led.o
rtl8367s_gsw-objs += rtl8367c/mirror.o
rtl8367s_gsw-objs += rtl8367c/oam.o
rtl8367s_gsw-objs += rtl8367c/port.o
rtl8367s_gsw-objs += rtl8367c/ptp.o
rtl8367s_gsw-objs += rtl8367c/qos.o
rtl8367s_gsw-objs += rtl8367c/rate.o
rtl8367s_gsw-objs += rtl8367c/rldp.o
rtl8367s_gsw-objs += rtl8367c/rtk_switch.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_acl.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_cputag.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_dot1x.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_eav.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_eee.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_fc.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_green.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_hsb.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_igmp.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_inbwctrl.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_interrupt.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_led.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_lut.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_meter.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_mib.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_mirror.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_misc.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_oam.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_phy.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_port.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_portIsolation.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_qos.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_rldp.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_rma.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_scheduling.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_storm.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_svlan.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_trunking.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_unknownMulticast.o
rtl8367s_gsw-objs += rtl8367c/rtl8367c_asicdrv_vlan.o
rtl8367s_gsw-objs += rtl8367c/smi.o
rtl8367s_gsw-objs += rtl8367c/stat.o
rtl8367s_gsw-objs += rtl8367c/storm.o
rtl8367s_gsw-objs += rtl8367c/svlan.o
rtl8367s_gsw-objs += rtl8367c/trap.o
rtl8367s_gsw-objs += rtl8367c/trunk.o
rtl8367s_gsw-objs += rtl8367c/vlan.o
ccflags-y += -Werror -D_LITTLE_ENDIAN -DMDC_MDIO_OPERATION
ccflags-y += -Idrivers/net/phy/rtk/rtl8367c/include
ccflags-y += -Iinclude/linux/

View file

@ -0,0 +1 @@
kernel/drivers/net/phy/rtk/rtl8367s_gsw.ko

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,537 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (, 08 2017) $
*
* Purpose : RTK switch high-level API for RTL8367/RTL8367C
* Feature : Here is a list of all functions and variables in CPU module.
*
*/
#include <rtk_switch.h>
#include <rtk_error.h>
#include <cpu.h>
#include <string.h>
#include <rtl8367c_asicdrv.h>
#include <rtl8367c_asicdrv_cputag.h>
/* Function Name:
* rtk_cpu_enable_set
* Description:
* Set CPU port function enable/disable.
* Input:
* enable - CPU port function enable
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameter.
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* The API can set CPU port function enable/disable.
*/
rtk_api_ret_t rtk_cpu_enable_set(rtk_enable_t enable)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (enable >= RTK_ENABLE_END)
return RT_ERR_ENABLE;
if ((retVal = rtl8367c_setAsicCputagEnable(enable)) != RT_ERR_OK)
return retVal;
if (DISABLED == enable)
{
if ((retVal = rtl8367c_setAsicCputagPortmask(0)) != RT_ERR_OK)
return retVal;
}
return RT_ERR_OK;
}
/* Function Name:
* rtk_cpu_enable_get
* Description:
* Get CPU port and its setting.
* Input:
* None
* Output:
* pEnable - CPU port function enable
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_L2_NO_CPU_PORT - CPU port is not exist
* Note:
* The API can get CPU port function enable/disable.
*/
rtk_api_ret_t rtk_cpu_enable_get(rtk_enable_t *pEnable)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(NULL == pEnable)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicCputagEnable(pEnable)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_cpu_tagPort_set
* Description:
* Set CPU port and CPU tag insert mode.
* Input:
* port - Port id.
* mode - CPU tag insert for packets egress from CPU port.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameter.
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* The API can set CPU port and inserting proprietary CPU tag mode (Length/Type 0x8899)
* to the frame that transmitting to CPU port.
* The inset cpu tag mode is as following:
* - CPU_INSERT_TO_ALL
* - CPU_INSERT_TO_TRAPPING
* - CPU_INSERT_TO_NONE
*/
rtk_api_ret_t rtk_cpu_tagPort_set(rtk_port_t port, rtk_cpu_insert_t mode)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check port Valid */
RTK_CHK_PORT_VALID(port);
if (mode >= CPU_INSERT_END)
return RT_ERR_INPUT;
if ((retVal = rtl8367c_setAsicCputagPortmask(1<<rtk_switch_port_L2P_get(port))) != RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_setAsicCputagTrapPort(rtk_switch_port_L2P_get(port))) != RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_setAsicCputagInsertMode(mode)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_cpu_tagPort_get
* Description:
* Get CPU port and CPU tag insert mode.
* Input:
* None
* Output:
* pPort - Port id.
* pMode - CPU tag insert for packets egress from CPU port, 0:all insert 1:Only for trapped packets 2:no insert.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_L2_NO_CPU_PORT - CPU port is not exist
* Note:
* The API can get configured CPU port and its setting.
* The inset cpu tag mode is as following:
* - CPU_INSERT_TO_ALL
* - CPU_INSERT_TO_TRAPPING
* - CPU_INSERT_TO_NONE
*/
rtk_api_ret_t rtk_cpu_tagPort_get(rtk_port_t *pPort, rtk_cpu_insert_t *pMode)
{
rtk_api_ret_t retVal;
rtk_uint32 pmsk, port;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(NULL == pPort)
return RT_ERR_NULL_POINTER;
if(NULL == pMode)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicCputagPortmask(&pmsk)) != RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_getAsicCputagTrapPort(&port)) != RT_ERR_OK)
return retVal;
*pPort = rtk_switch_port_P2L_get(port);
if ((retVal = rtl8367c_getAsicCputagInsertMode(pMode)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_cpu_awarePort_set
* Description:
* Set CPU aware port mask.
* Input:
* portmask - Port mask.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_MASK - Invalid port mask.
* Note:
* The API can set configured CPU aware port mask.
*/
rtk_api_ret_t rtk_cpu_awarePort_set(rtk_portmask_t *pPortmask)
{
rtk_api_ret_t retVal;
rtk_uint32 phyMbrPmask;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check Valid port mask */
if(NULL == pPortmask)
return RT_ERR_NULL_POINTER;
/* Check port mask valid */
RTK_CHK_PORTMASK_VALID(pPortmask);
if(rtk_switch_portmask_L2P_get(pPortmask, &phyMbrPmask) != RT_ERR_OK)
return RT_ERR_FAILED;
if ((retVal = rtl8367c_setAsicCputagPortmask(phyMbrPmask)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_cpu_awarePort_get
* Description:
* Get CPU aware port mask.
* Input:
* None
* Output:
* pPortmask - Port mask.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* The API can get configured CPU aware port mask.
*/
rtk_api_ret_t rtk_cpu_awarePort_get(rtk_portmask_t *pPortmask)
{
rtk_api_ret_t retVal;
rtk_uint32 pmsk;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(NULL == pPortmask)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicCputagPortmask(&pmsk)) != RT_ERR_OK)
return retVal;
if(rtk_switch_portmask_P2L_get(pmsk, pPortmask) != RT_ERR_OK)
return RT_ERR_FAILED;
return RT_ERR_OK;
}
/* Function Name:
* rtk_cpu_tagPosition_set
* Description:
* Set CPU tag position.
* Input:
* position - CPU tag position.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input.
* Note:
* The API can set CPU tag position.
*/
rtk_api_ret_t rtk_cpu_tagPosition_set(rtk_cpu_position_t position)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (position >= CPU_POS_END)
return RT_ERR_INPUT;
if ((retVal = rtl8367c_setAsicCputagPosition(position)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_cpu_tagPosition_get
* Description:
* Get CPU tag position.
* Input:
* None
* Output:
* pPosition - CPU tag position.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input.
* Note:
* The API can get CPU tag position.
*/
rtk_api_ret_t rtk_cpu_tagPosition_get(rtk_cpu_position_t *pPosition)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(NULL == pPosition)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicCputagPosition(pPosition)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_cpu_tagLength_set
* Description:
* Set CPU tag length.
* Input:
* length - CPU tag length.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input.
* Note:
* The API can set CPU tag length.
*/
rtk_api_ret_t rtk_cpu_tagLength_set(rtk_cpu_tag_length_t length)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (length >= CPU_LEN_END)
return RT_ERR_INPUT;
if ((retVal = rtl8367c_setAsicCputagMode(length)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_cpu_tagLength_get
* Description:
* Get CPU tag length.
* Input:
* None
* Output:
* pLength - CPU tag length.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input.
* Note:
* The API can get CPU tag length.
*/
rtk_api_ret_t rtk_cpu_tagLength_get(rtk_cpu_tag_length_t *pLength)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(NULL == pLength)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicCputagMode(pLength)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_cpu_priRemap_set
* Description:
* Configure CPU priorities mapping to internal absolute priority.
* Input:
* int_pri - internal priority value.
* new_pri - new internal priority value.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_VLAN_PRIORITY - Invalid 1p priority.
* RT_ERR_QOS_INT_PRIORITY - Invalid priority.
* Note:
* Priority of CPU tag assignment for internal asic priority, and it is used for queue usage and packet scheduling.
*/
rtk_api_ret_t rtk_cpu_priRemap_set(rtk_pri_t int_pri, rtk_pri_t new_pri)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (new_pri > RTL8367C_PRIMAX || int_pri > RTL8367C_PRIMAX)
return RT_ERR_VLAN_PRIORITY;
if ((retVal = rtl8367c_setAsicCputagPriorityRemapping(int_pri, new_pri)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_cpu_priRemap_get
* Description:
* Configure CPU priorities mapping to internal absolute priority.
* Input:
* int_pri - internal priority value.
* Output:
* pNew_pri - new internal priority value.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_VLAN_PRIORITY - Invalid 1p priority.
* RT_ERR_QOS_INT_PRIORITY - Invalid priority.
* Note:
* Priority of CPU tag assignment for internal asic priority, and it is used for queue usage and packet scheduling.
*/
rtk_api_ret_t rtk_cpu_priRemap_get(rtk_pri_t int_pri, rtk_pri_t *pNew_pri)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(NULL == pNew_pri)
return RT_ERR_NULL_POINTER;
if (int_pri > RTL8367C_PRIMAX)
return RT_ERR_QOS_INT_PRIORITY;
if ((retVal = rtl8367c_getAsicCputagPriorityRemapping(int_pri, pNew_pri)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_cpu_acceptLength_set
* Description:
* Set CPU accept length.
* Input:
* length - CPU tag length.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input.
* Note:
* The API can set CPU accept length.
*/
rtk_api_ret_t rtk_cpu_acceptLength_set(rtk_cpu_rx_length_t length)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (length >= CPU_RX_END)
return RT_ERR_INPUT;
if ((retVal = rtl8367c_setAsicCputagRxMinLength(length)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_cpu_acceptLength_get
* Description:
* Get CPU accept length.
* Input:
* None
* Output:
* pLength - CPU tag length.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input.
* Note:
* The API can get CPU accept length.
*/
rtk_api_ret_t rtk_cpu_acceptLength_get(rtk_cpu_rx_length_t *pLength)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(NULL == pLength)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicCputagRxMinLength(pLength)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}

View file

@ -0,0 +1,843 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 75783 $
* $Date: 2017-02-13 14:54:53 +0800 (, 13 2017) $
*
* Purpose : RTK switch high-level API for RTL8367/RTL8367C
* Feature : Here is a list of all functions and variables in 1X module.
*
*/
#include <rtk_switch.h>
#include <rtk_error.h>
#include <dot1x.h>
#include <string.h>
#include <vlan.h>
#include <rtl8367c_asicdrv.h>
#include <rtl8367c_asicdrv_dot1x.h>
#include <rtl8367c_asicdrv_rma.h>
#include <rtl8367c_asicdrv_lut.h>
#include <rtl8367c_asicdrv_vlan.h>
/* Function Name:
* rtk_dot1x_unauthPacketOper_set
* Description:
* Set 802.1x unauth action configuration.
* Input:
* port - Port id.
* unauth_action - 802.1X unauth action.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_INPUT - Invalid input parameter.
* Note:
* This API can set 802.1x unauth action configuration.
* The unauth action is as following:
* - DOT1X_ACTION_DROP
* - DOT1X_ACTION_TRAP2CPU
* - DOT1X_ACTION_GUESTVLAN
*/
rtk_api_ret_t rtk_dot1x_unauthPacketOper_set(rtk_port_t port, rtk_dot1x_unauth_action_t unauth_action)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check port Valid */
RTK_CHK_PORT_VALID(port);
if (unauth_action >= DOT1X_ACTION_END)
return RT_ERR_DOT1X_PROC;
if ((retVal = rtl8367c_setAsic1xProcConfig(rtk_switch_port_L2P_get(port), unauth_action)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_dot1x_unauthPacketOper_get
* Description:
* Get 802.1x unauth action configuration.
* Input:
* port - Port id.
* Output:
* pUnauth_action - 802.1X unauth action.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* This API can get 802.1x unauth action configuration.
* The unauth action is as following:
* - DOT1X_ACTION_DROP
* - DOT1X_ACTION_TRAP2CPU
* - DOT1X_ACTION_GUESTVLAN
*/
rtk_api_ret_t rtk_dot1x_unauthPacketOper_get(rtk_port_t port, rtk_dot1x_unauth_action_t *pUnauth_action)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check port Valid */
RTK_CHK_PORT_VALID(port);
if(NULL == pUnauth_action)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsic1xProcConfig(rtk_switch_port_L2P_get(port), pUnauth_action)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_dot1x_eapolFrame2CpuEnable_set
* Description:
* Set 802.1x EAPOL packet trap to CPU configuration
* Input:
* enable - The status of 802.1x EAPOL packet.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_ENABLE - Invalid enable input.
* Note:
* To support 802.1x authentication functionality, EAPOL frame (ether type = 0x888E) has to
* be trapped to CPU.
* The status of EAPOL frame trap to CPU is as following:
* - DISABLED
* - ENABLED
*/
rtk_api_ret_t rtk_dot1x_eapolFrame2CpuEnable_set(rtk_enable_t enable)
{
rtk_api_ret_t retVal;
rtl8367c_rma_t rmacfg;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (enable >= RTK_ENABLE_END)
return RT_ERR_ENABLE;
if ((retVal = rtl8367c_getAsicRma(3, &rmacfg)) != RT_ERR_OK)
return retVal;
if (ENABLED == enable)
rmacfg.operation = RMAOP_TRAP_TO_CPU;
else if (DISABLED == enable)
rmacfg.operation = RMAOP_FORWARD;
if ((retVal = rtl8367c_setAsicRma(3, &rmacfg)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_dot1x_eapolFrame2CpuEnable_get
* Description:
* Get 802.1x EAPOL packet trap to CPU configuration
* Input:
* None
* Output:
* pEnable - The status of 802.1x EAPOL packet.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* To support 802.1x authentication functionality, EAPOL frame (ether type = 0x888E) has to
* be trapped to CPU.
* The status of EAPOL frame trap to CPU is as following:
* - DISABLED
* - ENABLED
*/
rtk_api_ret_t rtk_dot1x_eapolFrame2CpuEnable_get(rtk_enable_t *pEnable)
{
rtk_api_ret_t retVal;
rtl8367c_rma_t rmacfg;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(NULL == pEnable)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicRma(3, &rmacfg)) != RT_ERR_OK)
return retVal;
if (RMAOP_TRAP_TO_CPU == rmacfg.operation)
*pEnable = ENABLED;
else
*pEnable = DISABLED;
return RT_ERR_OK;
}
/* Function Name:
* rtk_dot1x_portBasedEnable_set
* Description:
* Set 802.1x port-based enable configuration
* Input:
* port - Port id.
* enable - The status of 802.1x port.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_ENABLE - Invalid enable input.
* RT_ERR_DOT1X_PORTBASEDPNEN - 802.1X port-based enable error
* Note:
* The API can update the port-based port enable register content. If a port is 802.1x
* port based network access control "enabled", it should be authenticated so packets
* from that port won't be dropped or trapped to CPU.
* The status of 802.1x port-based network access control is as following:
* - DISABLED
* - ENABLED
*/
rtk_api_ret_t rtk_dot1x_portBasedEnable_set(rtk_port_t port, rtk_enable_t enable)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check port Valid */
RTK_CHK_PORT_VALID(port);
if (enable >= RTK_ENABLE_END)
return RT_ERR_ENABLE;
if ((retVal = rtl8367c_setAsic1xPBEnConfig(rtk_switch_port_L2P_get(port),enable)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_dot1x_portBasedEnable_get
* Description:
* Get 802.1x port-based enable configuration
* Input:
* port - Port id.
* Output:
* pEnable - The status of 802.1x port.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* The API can get the 802.1x port-based port status.
*/
rtk_api_ret_t rtk_dot1x_portBasedEnable_get(rtk_port_t port, rtk_enable_t *pEnable)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check port Valid */
RTK_CHK_PORT_VALID(port);
if(NULL == pEnable)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsic1xPBEnConfig(rtk_switch_port_L2P_get(port), pEnable)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_dot1x_portBasedAuthStatus_set
* Description:
* Set 802.1x port-based auth. port configuration
* Input:
* port - Port id.
* port_auth - The status of 802.1x port.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_DOT1X_PORTBASEDAUTH - 802.1X port-based auth error
* Note:
* The authenticated status of 802.1x port-based network access control is as following:
* - UNAUTH
* - AUTH
*/
rtk_api_ret_t rtk_dot1x_portBasedAuthStatus_set(rtk_port_t port, rtk_dot1x_auth_status_t port_auth)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check port Valid */
RTK_CHK_PORT_VALID(port);
if (port_auth >= AUTH_STATUS_END)
return RT_ERR_DOT1X_PORTBASEDAUTH;
if ((retVal = rtl8367c_setAsic1xPBAuthConfig(rtk_switch_port_L2P_get(port), port_auth)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_dot1x_portBasedAuthStatus_get
* Description:
* Get 802.1x port-based auth. port configuration
* Input:
* port - Port id.
* Output:
* pPort_auth - The status of 802.1x port.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* The API can get 802.1x port-based port auth.information.
*/
rtk_api_ret_t rtk_dot1x_portBasedAuthStatus_get(rtk_port_t port, rtk_dot1x_auth_status_t *pPort_auth)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(NULL == pPort_auth)
return RT_ERR_NULL_POINTER;
/* Check port Valid */
RTK_CHK_PORT_VALID(port);
if ((retVal = rtl8367c_getAsic1xPBAuthConfig(rtk_switch_port_L2P_get(port), pPort_auth)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_dot1x_portBasedDirection_set
* Description:
* Set 802.1x port-based operational direction configuration
* Input:
* port - Port id.
* port_direction - Operation direction
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_DOT1X_PORTBASEDOPDIR - 802.1X port-based operation direction error
* Note:
* The operate controlled direction of 802.1x port-based network access control is as following:
* - BOTH
* - IN
*/
rtk_api_ret_t rtk_dot1x_portBasedDirection_set(rtk_port_t port, rtk_dot1x_direction_t port_direction)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check port Valid */
RTK_CHK_PORT_VALID(port);
if (port_direction >= DIRECTION_END)
return RT_ERR_DOT1X_PORTBASEDOPDIR;
if ((retVal = rtl8367c_setAsic1xPBOpdirConfig(rtk_switch_port_L2P_get(port), port_direction)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_dot1x_portBasedDirection_get
* Description:
* Get 802.1X port-based operational direction configuration
* Input:
* port - Port id.
* Output:
* pPort_direction - Operation direction
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* The API can get 802.1x port-based operational direction information.
*/
rtk_api_ret_t rtk_dot1x_portBasedDirection_get(rtk_port_t port, rtk_dot1x_direction_t *pPort_direction)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(NULL == pPort_direction)
return RT_ERR_NULL_POINTER;
/* Check port Valid */
RTK_CHK_PORT_VALID(port);
if ((retVal = rtl8367c_getAsic1xPBOpdirConfig(rtk_switch_port_L2P_get(port), pPort_direction)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_dot1x_macBasedEnable_set
* Description:
* Set 802.1x mac-based port enable configuration
* Input:
* port - Port id.
* enable - The status of 802.1x port.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_ENABLE - Invalid enable input.
* RT_ERR_DOT1X_MACBASEDPNEN - 802.1X mac-based enable error
* Note:
* If a port is 802.1x MAC based network access control "enabled", the incoming packets should
* be authenticated so packets from that port won't be dropped or trapped to CPU.
* The status of 802.1x MAC-based network access control is as following:
* - DISABLED
* - ENABLED
*/
rtk_api_ret_t rtk_dot1x_macBasedEnable_set(rtk_port_t port, rtk_enable_t enable)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check port Valid */
RTK_CHK_PORT_VALID(port);
if (enable >= RTK_ENABLE_END)
return RT_ERR_ENABLE;
if ((retVal = rtl8367c_setAsic1xMBEnConfig(rtk_switch_port_L2P_get(port),enable)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_dot1x_macBasedEnable_get
* Description:
* Get 802.1x mac-based port enable configuration
* Input:
* port - Port id.
* Output:
* pEnable - The status of 802.1x port.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* If a port is 802.1x MAC based network access control "enabled", the incoming packets should
* be authenticated so packets from that port wont be dropped or trapped to CPU.
* The status of 802.1x MAC-based network access control is as following:
* - DISABLED
* - ENABLED
*/
rtk_api_ret_t rtk_dot1x_macBasedEnable_get(rtk_port_t port, rtk_enable_t *pEnable)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(NULL == pEnable)
return RT_ERR_NULL_POINTER;
/* Check port Valid */
RTK_CHK_PORT_VALID(port);
if ((retVal = rtl8367c_getAsic1xMBEnConfig(rtk_switch_port_L2P_get(port), pEnable)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_dot1x_macBasedAuthMac_add
* Description:
* Add an authenticated MAC to ASIC
* Input:
* port - Port id.
* pAuth_mac - The authenticated MAC.
* fid - filtering database.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_ENABLE - Invalid enable input.
* RT_ERR_DOT1X_MACBASEDPNEN - 802.1X mac-based enable error
* Note:
* The API can add a 802.1x authenticated MAC address to port. If the MAC does not exist in LUT,
* user can't add this MAC to auth status.
*/
rtk_api_ret_t rtk_dot1x_macBasedAuthMac_add(rtk_port_t port, rtk_mac_t *pAuth_mac, rtk_fid_t fid)
{
rtk_api_ret_t retVal;
rtk_uint32 method;
rtl8367c_luttb l2Table;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* must be unicast address */
if ((pAuth_mac == NULL) || (pAuth_mac->octet[0] & 0x1))
return RT_ERR_MAC;
/* Check port Valid */
RTK_CHK_PORT_VALID(port);
if (fid > RTL8367C_FIDMAX)
return RT_ERR_L2_FID;
memset(&l2Table, 0, sizeof(rtl8367c_luttb));
/* fill key (MAC,FID) to get L2 entry */
memcpy(l2Table.mac.octet, pAuth_mac->octet, ETHER_ADDR_LEN);
l2Table.fid = fid;
method = LUTREADMETHOD_MAC;
retVal = rtl8367c_getAsicL2LookupTb(method, &l2Table);
if ( RT_ERR_OK == retVal)
{
if (l2Table.spa != rtk_switch_port_L2P_get(port))
return RT_ERR_DOT1X_MAC_PORT_MISMATCH;
memcpy(l2Table.mac.octet, pAuth_mac->octet, ETHER_ADDR_LEN);
l2Table.fid = fid;
l2Table.efid = 0;
l2Table.auth = 1;
retVal = rtl8367c_setAsicL2LookupTb(&l2Table);
return retVal;
}
else
return retVal;
}
/* Function Name:
* rtk_dot1x_macBasedAuthMac_del
* Description:
* Delete an authenticated MAC to ASIC
* Input:
* port - Port id.
* pAuth_mac - The authenticated MAC.
* fid - filtering database.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_MAC - Invalid MAC address.
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* The API can delete a 802.1x authenticated MAC address to port. It only change the auth status of
* the MAC and won't delete it from LUT.
*/
rtk_api_ret_t rtk_dot1x_macBasedAuthMac_del(rtk_port_t port, rtk_mac_t *pAuth_mac, rtk_fid_t fid)
{
rtk_api_ret_t retVal;
rtk_uint32 method;
rtl8367c_luttb l2Table;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* must be unicast address */
if ((pAuth_mac == NULL) || (pAuth_mac->octet[0] & 0x1))
return RT_ERR_MAC;
/* Check port Valid */
RTK_CHK_PORT_VALID(port);
if (fid > RTL8367C_FIDMAX)
return RT_ERR_L2_FID;
memset(&l2Table, 0, sizeof(rtl8367c_luttb));
/* fill key (MAC,FID) to get L2 entry */
memcpy(l2Table.mac.octet, pAuth_mac->octet, ETHER_ADDR_LEN);
l2Table.fid = fid;
method = LUTREADMETHOD_MAC;
retVal = rtl8367c_getAsicL2LookupTb(method, &l2Table);
if (RT_ERR_OK == retVal)
{
if (l2Table.spa != rtk_switch_port_L2P_get(port))
return RT_ERR_DOT1X_MAC_PORT_MISMATCH;
memcpy(l2Table.mac.octet, pAuth_mac->octet, ETHER_ADDR_LEN);
l2Table.fid = fid;
l2Table.auth = 0;
retVal = rtl8367c_setAsicL2LookupTb(&l2Table);
return retVal;
}
else
return retVal;
}
/* Function Name:
* rtk_dot1x_macBasedDirection_set
* Description:
* Set 802.1x mac-based operational direction configuration
* Input:
* mac_direction - Operation direction
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameter.
* RT_ERR_DOT1X_MACBASEDOPDIR - 802.1X mac-based operation direction error
* Note:
* The operate controlled direction of 802.1x mac-based network access control is as following:
* - BOTH
* - IN
*/
rtk_api_ret_t rtk_dot1x_macBasedDirection_set(rtk_dot1x_direction_t mac_direction)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (mac_direction >= DIRECTION_END)
return RT_ERR_DOT1X_MACBASEDOPDIR;
if ((retVal = rtl8367c_setAsic1xMBOpdirConfig(mac_direction)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_dot1x_macBasedDirection_get
* Description:
* Get 802.1x mac-based operational direction configuration
* Input:
* port - Port id.
* Output:
* pMac_direction - Operation direction
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can get 802.1x mac-based operational direction information.
*/
rtk_api_ret_t rtk_dot1x_macBasedDirection_get(rtk_dot1x_direction_t *pMac_direction)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(NULL == pMac_direction)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsic1xMBOpdirConfig(pMac_direction)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* Set 802.1x guest VLAN configuration
* Description:
* Set 802.1x mac-based operational direction configuration
* Input:
* vid - 802.1x guest VLAN ID
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameter.
* Note:
* The operate controlled 802.1x guest VLAN
*/
rtk_api_ret_t rtk_dot1x_guestVlan_set(rtk_vlan_t vid)
{
rtk_api_ret_t retVal;
rtk_uint32 index;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* vid must be 0~4095 */
if (vid > RTL8367C_VIDMAX)
return RT_ERR_VLAN_VID;
if((retVal = rtk_vlan_checkAndCreateMbr(vid, &index)) != RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_setAsic1xGuestVidx(index)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_dot1x_guestVlan_get
* Description:
* Get 802.1x guest VLAN configuration
* Input:
* None
* Output:
* pVid - 802.1x guest VLAN ID
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can get 802.1x guest VLAN information.
*/
rtk_api_ret_t rtk_dot1x_guestVlan_get(rtk_vlan_t *pVid)
{
rtk_api_ret_t retVal;
rtk_uint32 gvidx;
rtl8367c_vlanconfiguser vlanMC;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(NULL == pVid)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsic1xGuestVidx(&gvidx)) != RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_getAsicVlanMemberConfig(gvidx, &vlanMC)) != RT_ERR_OK)
return retVal;
*pVid = vlanMC.evid;
return RT_ERR_OK;
}
/* Function Name:
* rtk_dot1x_guestVlan2Auth_set
* Description:
* Set 802.1x guest VLAN to auth host configuration
* Input:
* enable - The status of guest VLAN to auth host.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameter.
* Note:
* The operational direction of 802.1x guest VLAN to auth host control is as following:
* - ENABLED
* - DISABLED
*/
rtk_api_ret_t rtk_dot1x_guestVlan2Auth_set(rtk_enable_t enable)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (enable >= RTK_ENABLE_END)
return RT_ERR_ENABLE;
if ((retVal = rtl8367c_setAsic1xGVOpdir(enable)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_dot1x_guestVlan2Auth_get
* Description:
* Get 802.1x guest VLAN to auth host configuration
* Input:
* None
* Output:
* pEnable - The status of guest VLAN to auth host.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can get 802.1x guest VLAN to auth host information.
*/
rtk_api_ret_t rtk_dot1x_guestVlan2Auth_get(rtk_enable_t *pEnable)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(NULL == pEnable)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsic1xGVOpdir(pEnable)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}

View file

@ -0,0 +1,162 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 48156 $
* $Date: 2014-05-29 16:39:06 +0800 (, 29 2014) $
*
* Purpose : RTK switch high-level API for RTL8367/RTL8367C
* Feature : Here is a list of all functions and variables in EEE module.
*
*/
#include <rtk_switch.h>
#include <rtk_error.h>
#include <eee.h>
#include <string.h>
#include <rtl8367c_asicdrv.h>
#include <rtl8367c_asicdrv_eee.h>
#include <rtl8367c_asicdrv_phy.h>
/* Function Name:
* rtk_eee_init
* Description:
* EEE function initialization.
* Input:
* None
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* This API is used to initialize EEE status.
*/
rtk_api_ret_t rtk_eee_init(void)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if((retVal = rtl8367c_setAsicRegBit(0x0018, 10, 1)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_setAsicRegBit(0x0018, 11, 1)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_eee_portEnable_set
* Description:
* Set enable status of EEE function.
* Input:
* port - port id.
* enable - enable EEE status.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_ENABLE - Invalid enable input.
* Note:
* This API can set EEE function to the specific port.
* The configuration of the port is as following:
* - DISABLE
* - ENABLE
*/
rtk_api_ret_t rtk_eee_portEnable_set(rtk_port_t port, rtk_enable_t enable)
{
rtk_api_ret_t retVal;
rtk_uint32 regData;
rtk_uint32 phy_port;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check port is UTP port */
RTK_CHK_PORT_IS_UTP(port);
if (enable>=RTK_ENABLE_END)
return RT_ERR_INPUT;
phy_port = rtk_switch_port_L2P_get(port);
if ((retVal = rtl8367c_setAsicEee100M(phy_port,enable))!=RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_setAsicEeeGiga(phy_port,enable))!=RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_setAsicPHYReg(phy_port, RTL8367C_PHY_PAGE_ADDRESS, 0))!=RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_getAsicPHYReg(phy_port, 0, &regData))!=RT_ERR_OK)
return retVal;
regData |= 0x0200;
if ((retVal = rtl8367c_setAsicPHYReg(phy_port, 0, regData))!=RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_eee_portEnable_get
* Description:
* Get enable status of EEE function
* Input:
* port - Port id.
* Output:
* pEnable - Back pressure status.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* This API can get EEE function to the specific port.
* The configuration of the port is as following:
* - DISABLE
* - ENABLE
*/
rtk_api_ret_t rtk_eee_portEnable_get(rtk_port_t port, rtk_enable_t *pEnable)
{
rtk_api_ret_t retVal;
rtk_uint32 regData1, regData2;
rtk_uint32 phy_port;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check port is UTP port */
RTK_CHK_PORT_IS_UTP(port);
if(NULL == pEnable)
return RT_ERR_NULL_POINTER;
phy_port = rtk_switch_port_L2P_get(port);
if ((retVal = rtl8367c_getAsicEee100M(phy_port,&regData1))!=RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_getAsicEeeGiga(phy_port,&regData2))!=RT_ERR_OK)
return retVal;
if (regData1==1&&regData2==1)
*pEnable = ENABLED;
else
*pEnable = DISABLED;
return RT_ERR_OK;
}

View file

@ -0,0 +1,436 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 63932 $
* $Date: 2015-12-08 14:06:29 +0800 (, 08 2015) $
*
* Purpose : RTK switch high-level API for RTL8367/RTL8367C
* Feature : Here is a list of all functions and variables in i2c module.
*
*/
#include <rtk_switch.h>
#include <rtk_error.h>
#include <port.h>
#include <string.h>
#include <rtl8367c_reg.h>
#include <rtl8367c_asicdrv_i2c.h>
#include <rtk_switch.h>
#include <rtl8367c_asicdrv.h>
#include <rtk_types.h>
#include <i2c.h>
static rtk_I2C_16bit_mode_t rtk_i2c_mode = I2C_LSB_16BIT_MODE;
/* Function Name:
* rtk_i2c_init
* Description:
* I2C smart function initialization.
* Input:
* None
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* Note:
* This API is used to initialize EEE status.
* need used GPIO pins
* OpenDrain and clock
*/
rtk_api_ret_t rtk_i2c_init(void)
{
rtk_uint32 retVal;
switch_chip_t ChipID;
/* probe switch */
if((retVal = rtk_switch_probe(&ChipID)) != RT_ERR_OK)
return retVal;
if( ChipID == CHIP_RTL8370B )
{
/*set GPIO8, GPIO9, OpenDrain as I2C, clock = 252KHZ */
if((retVal = rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_SYS_CTL, 0x5c3f)) != RT_ERR_OK)
return retVal;
}
else
return RT_ERR_FAILED;
return RT_ERR_OK;
}
/* Function Name:
* rtk_i2c_mode_set
* Description:
* Set I2C data byte-order.
* Input:
* i2cmode - byte-order mode
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_INPUT - Invalid input parameter.
* Note:
* This API can set I2c traffic's byte-order .
*/
rtk_api_ret_t rtk_i2c_mode_set( rtk_I2C_16bit_mode_t i2cmode )
{
if(i2cmode >= I2C_Mode_END)
{
return RT_ERR_INPUT;
}
else if(i2cmode == I2C_70B_LSB_16BIT_MODE)
{
rtk_i2c_mode = I2C_70B_LSB_16BIT_MODE;
return RT_ERR_OK;
}
else if( i2cmode == I2C_LSB_16BIT_MODE)
{
rtk_i2c_mode = I2C_LSB_16BIT_MODE;
return RT_ERR_OK;
}
else
return RT_ERR_FAILED;
return RT_ERR_OK;
}
/* Function Name:
* rtk_i2c_mode_get
* Description:
* Get i2c traffic byte-order setting.
* Input:
* None
* Output:
* pI2cMode - i2c byte-order
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_NULL_POINTER - input parameter is null pointer
* Note:
* The API can get i2c traffic byte-order setting.
*/
rtk_api_ret_t rtk_i2c_mode_get( rtk_I2C_16bit_mode_t * pI2cMode)
{
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(NULL == pI2cMode)
return RT_ERR_NULL_POINTER;
if(rtk_i2c_mode == I2C_70B_LSB_16BIT_MODE)
*pI2cMode = 1;
else if ((rtk_i2c_mode == I2C_LSB_16BIT_MODE))
*pI2cMode = 0;
else
return RT_ERR_FAILED;
return RT_ERR_OK;
}
/* Function Name:
* rtk_i2c_gpioPinGroup_set
* Description:
* Set i2c SDA & SCL used GPIO pins group.
* Input:
* pins_group - GPIO pins group
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_INPUT - Invalid input parameter.
* Note:
* The API can set i2c used gpio pins group.
* There are three group pins could be used
*/
rtk_api_ret_t rtk_i2c_gpioPinGroup_set( rtk_I2C_gpio_pin_t pins_group )
{
rtk_uint32 retVal;
if( ( pins_group > I2C_GPIO_PIN_END )|| ( pins_group < I2C_GPIO_PIN_8_9) )
return RT_ERR_INPUT;
if( (retVal = rtl8367c_setAsicI2CGpioPinGroup(pins_group) ) != RT_ERR_OK )
return retVal ;
return RT_ERR_OK;
}
/* Function Name:
* rtk_i2c_gpioPinGroup_get
* Description:
* Get i2c SDA & SCL used GPIO pins group.
* Input:
* None
* Output:
* pPins_group - GPIO pins group
* Return:
* RT_ERR_OK - OK
* RT_ERR_NULL_POINTER - input parameter is null pointer
* Note:
* The API can get i2c used gpio pins group.
* There are three group pins could be used
*/
rtk_api_ret_t rtk_i2c_gpioPinGroup_get( rtk_I2C_gpio_pin_t * pPins_group )
{
rtk_uint32 retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(NULL == pPins_group)
return RT_ERR_NULL_POINTER;
if( (retVal = rtl8367c_getAsicI2CGpioPinGroup(pPins_group) ) != RT_ERR_OK )
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_i2c_data_read
* Description:
* read i2c slave device register.
* Input:
* deviceAddr - access Slave device address
* slaveRegAddr - access Slave register address
* Output:
* pRegData - read data
* Return:
* RT_ERR_OK - OK
* RT_ERR_NULL_POINTER - input parameter is null pointer
* Note:
* The API can access i2c slave and read i2c slave device register.
*/
rtk_api_ret_t rtk_i2c_data_read(rtk_uint8 deviceAddr, rtk_uint32 slaveRegAddr, rtk_uint32 *pRegData)
{
rtk_uint32 retVal, counter=0;
rtk_uint8 controlByte_W, controlByte_R;
rtk_uint8 slaveRegAddr_L, slaveRegAddr_H = 0x0, temp;
rtk_uint8 regData_L, regData_H;
/* control byte :deviceAddress + W, deviceAddress + R */
controlByte_W = (rtk_uint8)(deviceAddr << 1) ;
controlByte_R = (rtk_uint8)(controlByte_W | 0x1);
slaveRegAddr_L = (rtk_uint8) (slaveRegAddr & 0x00FF) ;
slaveRegAddr_H = (rtk_uint8) (slaveRegAddr >>8) ;
if( rtk_i2c_mode == I2C_70B_LSB_16BIT_MODE)
{
temp = slaveRegAddr_L ;
slaveRegAddr_L = slaveRegAddr_H;
slaveRegAddr_H = temp;
}
/*check bus state: idle*/
for(counter = 3000; counter>0; counter--)
{
if ( (retVal = rtl8367c_setAsicI2C_checkBusIdle() ) == RT_ERR_OK)
break;
}
if( counter ==0 )
return retVal; /*i2c is busy*/
/*tx Start cmd*/
if( (retVal = rtl8367c_setAsicI2CStartCmd() ) != RT_ERR_OK )
return retVal ;
/*tx control _W*/
if( (retVal = rtl8367c_setAsicI2CTxOneCharCmd(controlByte_W))!= RT_ERR_OK )
return retVal ;
/*check if RX ack from slave*/
if( (retVal = rtl8367c_setAsicI2CcheckRxAck()) != RT_ERR_OK )
return retVal;
/* tx slave buffer address low 8 bits */
if( (retVal = rtl8367c_setAsicI2CTxOneCharCmd(slaveRegAddr_L))!= RT_ERR_OK )
return retVal ;
/*check if RX ack from slave*/
if( (retVal = rtl8367c_setAsicI2CcheckRxAck()) != RT_ERR_OK )
return retVal;
/* tx slave buffer address high 8 bits */
if( (retVal = rtl8367c_setAsicI2CTxOneCharCmd(slaveRegAddr_H))!= RT_ERR_OK )
return retVal ;
/*check if RX ack from slave*/
if( (retVal = rtl8367c_setAsicI2CcheckRxAck()) != RT_ERR_OK )
return retVal;
/*tx Start cmd*/
if( (retVal = rtl8367c_setAsicI2CStartCmd() ) != RT_ERR_OK )
return retVal ;
/*tx control _R*/
if( (retVal = rtl8367c_setAsicI2CTxOneCharCmd(controlByte_R))!= RT_ERR_OK )
return retVal ;
/*check if RX ack from slave*/
if( (retVal = rtl8367c_setAsicI2CcheckRxAck()) != RT_ERR_OK )
return retVal;
/* rx low 8bit data*/
if( ( retVal = rtl8367c_setAsicI2CRxOneCharCmd( &regData_L) ) != RT_ERR_OK )
return retVal;
/* tx ack to slave, keep receive */
if( (retVal = rtl8367c_setAsicI2CTxAckCmd()) != RT_ERR_OK )
return retVal;
/* rx high 8bit data*/
if( ( retVal = rtl8367c_setAsicI2CRxOneCharCmd( &regData_H) ) != RT_ERR_OK )
return retVal;
/* tx Noack to slave, Stop receive */
if( (retVal = rtl8367c_setAsicI2CTxNoAckCmd()) != RT_ERR_OK )
return retVal;
/*tx Stop cmd */
if( (retVal = rtl8367c_setAsicI2CStopCmd()) != RT_ERR_OK )
return retVal;
*pRegData = (regData_H << 8) | regData_L;
return RT_ERR_OK;
}
/* Function Name:
* rtk_i2c_data_write
* Description:
* write data to i2c slave device register
* Input:
* deviceAddr - access Slave device address
* slaveRegAddr - access Slave register address
* regData - data to set
* Output:
* None
* Return:
* RT_ERR_OK - OK
* Note:
* The API can access i2c slave and setting i2c slave device register.
*/
rtk_api_ret_t rtk_i2c_data_write(rtk_uint8 deviceAddr, rtk_uint32 slaveRegAddr, rtk_uint32 regData)
{
rtk_uint32 retVal,counter;
rtk_uint8 controlByte_W;
rtk_uint8 slaveRegAddr_L, slaveRegAddr_H = 0x0, temp;
rtk_uint8 regData_L, regData_H;
/* control byte :deviceAddress + W */
controlByte_W = (rtk_uint8)(deviceAddr<< 1) ;
slaveRegAddr_L = (rtk_uint8) (slaveRegAddr & 0x00FF) ;
slaveRegAddr_H = (rtk_uint8) (slaveRegAddr >>8) ;
regData_H = (rtk_uint8) (regData>> 8);
regData_L = (rtk_uint8) (regData & 0x00FF);
if( rtk_i2c_mode == I2C_70B_LSB_16BIT_MODE)
{
temp = slaveRegAddr_L ;
slaveRegAddr_L = slaveRegAddr_H;
slaveRegAddr_H = temp;
}
/*check bus state: idle*/
for(counter = 3000; counter>0; counter--)
{
if ( (retVal = rtl8367c_setAsicI2C_checkBusIdle() ) == RT_ERR_OK)
break;
}
if( counter ==0 )
return retVal; /*i2c is busy*/
/*tx Start cmd*/
if( (retVal = rtl8367c_setAsicI2CStartCmd() ) != RT_ERR_OK )
return retVal ;
/*tx control _W*/
if( (retVal = rtl8367c_setAsicI2CTxOneCharCmd(controlByte_W))!= RT_ERR_OK )
return retVal ;
/*check if RX ack from slave*/
if( (retVal = rtl8367c_setAsicI2CcheckRxAck()) != RT_ERR_OK )
return retVal;
/* tx slave buffer address low 8 bits */
if( (retVal = rtl8367c_setAsicI2CTxOneCharCmd(slaveRegAddr_L))!= RT_ERR_OK )
return retVal;
/*check if RX ack from slave*/
if( (retVal = rtl8367c_setAsicI2CcheckRxAck()) != RT_ERR_OK )
return retVal;
/* tx slave buffer address high 8 bits */
if( (retVal = rtl8367c_setAsicI2CTxOneCharCmd(slaveRegAddr_H))!= RT_ERR_OK )
return retVal;
/*check if RX ack from slave*/
if( (retVal = rtl8367c_setAsicI2CcheckRxAck()) != RT_ERR_OK )
return retVal;
/*tx Datavlue LSB*/
if( (retVal = rtl8367c_setAsicI2CTxOneCharCmd(regData_L))!= RT_ERR_OK )
return retVal;
/*check if RX ack from slave*/
if( (retVal = rtl8367c_setAsicI2CcheckRxAck()) != RT_ERR_OK )
return retVal;
/*tx Datavlue MSB*/
if( (retVal = rtl8367c_setAsicI2CTxOneCharCmd(regData_H))!= RT_ERR_OK )
return retVal;
/*check if RX ack from slave*/
if( (retVal = rtl8367c_setAsicI2CcheckRxAck()) != RT_ERR_OK )
return retVal;
/*tx Stop cmd */
if( (retVal = rtl8367c_setAsicI2CStopCmd()) != RT_ERR_OK )
return retVal;
return RT_ERR_OK;
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,990 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* Purpose : RTL8367/RTL8367C switch high-level API
*
* Feature : The file includes ACL module high-layer API defination
*
*/
#ifndef __RTK_API_ACL_H__
#define __RTK_API_ACL_H__
/*
* Data Type Declaration
*/
#define RTK_FILTER_RAW_FIELD_NUMBER 8
#define ACL_DEFAULT_ABILITY 0
#define ACL_DEFAULT_UNMATCH_PERMIT 1
#define ACL_RULE_FREE 0
#define ACL_RULE_INAVAILABLE 1
#define ACL_RULE_CARETAG_MASK 0x1F
#define FILTER_POLICING_MAX 4
#define FILTER_LOGGING_MAX 8
#define FILTER_PATTERN_MAX 4
#define FILTER_ENACT_CVLAN_MASK 0x01
#define FILTER_ENACT_SVLAN_MASK 0x02
#define FILTER_ENACT_PRIORITY_MASK 0x04
#define FILTER_ENACT_POLICING_MASK 0x08
#define FILTER_ENACT_FWD_MASK 0x10
#define FILTER_ENACT_INTGPIO_MASK 0x20
#define FILTER_ENACT_INIT_MASK 0x3F
typedef enum rtk_filter_act_cactext_e
{
FILTER_ENACT_CACTEXT_VLANONLY=0,
FILTER_ENACT_CACTEXT_BOTHVLANTAG,
FILTER_ENACT_CACTEXT_TAGONLY,
FILTER_ENACT_CACTEXT_END,
}rtk_filter_act_cactext_t;
typedef enum rtk_filter_act_ctagfmt_e
{
FILTER_CTAGFMT_UNTAG=0,
FILTER_CTAGFMT_TAG,
FILTER_CTAGFMT_KEEP,
FILTER_CTAGFMT_KEEP1PRMK,
}rtk_filter_act_ctag_t;
#define RTK_MAX_NUM_OF_FILTER_TYPE 5
#define RTK_MAX_NUM_OF_FILTER_FIELD 8
#define RTK_DOT_1AS_TIMESTAMP_UNIT_IN_WORD_LENGTH 3UL
#define RTK_IPV6_ADDR_WORD_LENGTH 4UL
#define FILTER_ENACT_CVLAN_TYPE(type) (type - FILTER_ENACT_CVLAN_INGRESS)
#define FILTER_ENACT_SVLAN_TYPE(type) (type - FILTER_ENACT_SVLAN_INGRESS)
#define FILTER_ENACT_FWD_TYPE(type) (type - FILTER_ENACT_ADD_DSTPORT)
#define FILTER_ENACT_PRI_TYPE(type) (type - FILTER_ENACT_PRIORITY)
#define RTK_FILTER_FIELD_USED_MAX 8
#define RTK_FILTER_FIELD_INDEX(template, index) ((template << 4) + index)
typedef enum rtk_filter_act_enable_e
{
/* CVLAN */
FILTER_ENACT_CVLAN_INGRESS = 0,
FILTER_ENACT_CVLAN_EGRESS,
FILTER_ENACT_CVLAN_SVID,
FILTER_ENACT_POLICING_1,
/* SVLAN */
FILTER_ENACT_SVLAN_INGRESS,
FILTER_ENACT_SVLAN_EGRESS,
FILTER_ENACT_SVLAN_CVID,
FILTER_ENACT_POLICING_2,
/* Policing and Logging */
FILTER_ENACT_POLICING_0,
/* Forward */
FILTER_ENACT_COPY_CPU,
FILTER_ENACT_DROP,
FILTER_ENACT_ADD_DSTPORT,
FILTER_ENACT_REDIRECT,
FILTER_ENACT_MIRROR,
FILTER_ENACT_TRAP_CPU,
FILTER_ENACT_ISOLATION,
/* QoS */
FILTER_ENACT_PRIORITY,
FILTER_ENACT_DSCP_REMARK,
FILTER_ENACT_1P_REMARK,
FILTER_ENACT_POLICING_3,
/* Interrutp and GPO */
FILTER_ENACT_INTERRUPT,
FILTER_ENACT_GPO,
/*VLAN tag*/
FILTER_ENACT_EGRESSCTAG_UNTAG,
FILTER_ENACT_EGRESSCTAG_TAG,
FILTER_ENACT_EGRESSCTAG_KEEP,
FILTER_ENACT_EGRESSCTAG_KEEPAND1PRMK,
FILTER_ENACT_END,
} rtk_filter_act_enable_t;
typedef struct
{
rtk_filter_act_enable_t actEnable[FILTER_ENACT_END];
/* CVLAN acton */
rtk_uint32 filterCvlanVid;
rtk_uint32 filterCvlanIdx;
/* SVLAN action */
rtk_uint32 filterSvlanVid;
rtk_uint32 filterSvlanIdx;
/* Policing action */
rtk_uint32 filterPolicingIdx[FILTER_POLICING_MAX];
/* Forwarding action */
rtk_portmask_t filterPortmask;
/* QOS action */
rtk_uint32 filterPriority;
/*GPO*/
rtk_uint32 filterPin;
} rtk_filter_action_t;
typedef struct rtk_filter_flag_s
{
rtk_uint32 value;
rtk_uint32 mask;
} rtk_filter_flag_t;
typedef enum rtk_filter_care_tag_index_e
{
CARE_TAG_CTAG = 0,
CARE_TAG_STAG,
CARE_TAG_PPPOE,
CARE_TAG_IPV4,
CARE_TAG_IPV6,
CARE_TAG_TCP,
CARE_TAG_UDP,
CARE_TAG_ARP,
CARE_TAG_RSV1,
CARE_TAG_RSV2,
CARE_TAG_ICMP,
CARE_TAG_IGMP,
CARE_TAG_LLC,
CARE_TAG_RSV3,
CARE_TAG_HTTP,
CARE_TAG_RSV4,
CARE_TAG_RSV5,
CARE_TAG_DHCP,
CARE_TAG_DHCPV6,
CARE_TAG_SNMP,
CARE_TAG_OAM,
CARE_TAG_END,
} rtk_filter_care_tag_index_t;
typedef struct rtk_filter_care_tag_s
{
rtk_filter_flag_t tagType[CARE_TAG_END];
} rtk_filter_care_tag_t;
typedef struct rtk_filter_field rtk_filter_field_t;
typedef struct
{
rtk_uint32 value[RTK_DOT_1AS_TIMESTAMP_UNIT_IN_WORD_LENGTH];
} rtk_filter_dot1as_timestamp_t;
typedef enum rtk_filter_field_data_type_e
{
FILTER_FIELD_DATA_MASK = 0,
FILTER_FIELD_DATA_RANGE,
FILTER_FIELD_DATA_END ,
} rtk_filter_field_data_type_t;
typedef struct rtk_filter_ip_s
{
rtk_uint32 dataType;
rtk_uint32 rangeStart;
rtk_uint32 rangeEnd;
rtk_uint32 value;
rtk_uint32 mask;
} rtk_filter_ip_t;
typedef struct rtk_filter_mac_s
{
rtk_uint32 dataType;
rtk_mac_t value;
rtk_mac_t mask;
rtk_mac_t rangeStart;
rtk_mac_t rangeEnd;
} rtk_filter_mac_t;
typedef rtk_uint32 rtk_filter_op_t;
typedef struct rtk_filter_value_s
{
rtk_uint32 dataType;
rtk_uint32 value;
rtk_uint32 mask;
rtk_uint32 rangeStart;
rtk_uint32 rangeEnd;
} rtk_filter_value_t;
typedef struct rtk_filter_activeport_s
{
rtk_portmask_t value;
rtk_portmask_t mask;
} rtk_filter_activeport_t;
typedef struct rtk_filter_tag_s
{
rtk_filter_value_t pri;
rtk_filter_flag_t cfi;
rtk_filter_value_t vid;
} rtk_filter_tag_t;
typedef struct rtk_filter_ipFlag_s
{
rtk_filter_flag_t xf;
rtk_filter_flag_t mf;
rtk_filter_flag_t df;
} rtk_filter_ipFlag_t;
typedef struct
{
rtk_uint32 addr[RTK_IPV6_ADDR_WORD_LENGTH];
} rtk_filter_ip6_addr_t;
typedef struct
{
rtk_uint32 dataType;
rtk_filter_ip6_addr_t value;
rtk_filter_ip6_addr_t mask;
rtk_filter_ip6_addr_t rangeStart;
rtk_filter_ip6_addr_t rangeEnd;
} rtk_filter_ip6_t;
typedef rtk_uint32 rtk_filter_number_t;
typedef struct rtk_filter_pattern_s
{
rtk_uint32 value[FILTER_PATTERN_MAX];
rtk_uint32 mask[FILTER_PATTERN_MAX];
} rtk_filter_pattern_t;
typedef struct rtk_filter_tcpFlag_s
{
rtk_filter_flag_t urg;
rtk_filter_flag_t ack;
rtk_filter_flag_t psh;
rtk_filter_flag_t rst;
rtk_filter_flag_t syn;
rtk_filter_flag_t fin;
rtk_filter_flag_t ns;
rtk_filter_flag_t cwr;
rtk_filter_flag_t ece;
} rtk_filter_tcpFlag_t;
typedef rtk_uint32 rtk_filter_field_raw_t;
typedef enum rtk_filter_field_temple_input_e
{
FILTER_FIELD_TEMPLE_INPUT_TYPE = 0,
FILTER_FIELD_TEMPLE_INPUT_INDEX,
FILTER_FIELD_TEMPLE_INPUT_MAX ,
} rtk_filter_field_temple_input_t;
struct rtk_filter_field
{
rtk_uint32 fieldType;
union
{
/* L2 struct */
rtk_filter_mac_t dmac;
rtk_filter_mac_t smac;
rtk_filter_value_t etherType;
rtk_filter_tag_t ctag;
rtk_filter_tag_t relayCtag;
rtk_filter_tag_t stag;
rtk_filter_tag_t l2tag;
rtk_filter_dot1as_timestamp_t dot1asTimeStamp;
rtk_filter_mac_t mac;
/* L3 struct */
rtk_filter_ip_t sip;
rtk_filter_ip_t dip;
rtk_filter_ip_t ip;
rtk_filter_value_t protocol;
rtk_filter_value_t ipTos;
rtk_filter_ipFlag_t ipFlag;
rtk_filter_value_t ipOffset;
rtk_filter_ip6_t sipv6;
rtk_filter_ip6_t dipv6;
rtk_filter_ip6_t ipv6;
rtk_filter_value_t ipv6TrafficClass;
rtk_filter_value_t ipv6NextHeader;
rtk_filter_value_t flowLabel;
/* L4 struct */
rtk_filter_value_t tcpSrcPort;
rtk_filter_value_t tcpDstPort;
rtk_filter_tcpFlag_t tcpFlag;
rtk_filter_value_t tcpSeqNumber;
rtk_filter_value_t tcpAckNumber;
rtk_filter_value_t udpSrcPort;
rtk_filter_value_t udpDstPort;
rtk_filter_value_t icmpCode;
rtk_filter_value_t icmpType;
rtk_filter_value_t igmpType;
/* pattern match */
rtk_filter_pattern_t pattern;
rtk_filter_value_t inData;
} filter_pattern_union;
rtk_uint32 fieldTemplateNo;
rtk_uint32 fieldTemplateIdx[RTK_FILTER_FIELD_USED_MAX];
struct rtk_filter_field *next;
};
typedef enum rtk_filter_field_type_e
{
FILTER_FIELD_DMAC = 0,
FILTER_FIELD_SMAC,
FILTER_FIELD_ETHERTYPE,
FILTER_FIELD_CTAG,
FILTER_FIELD_STAG,
FILTER_FIELD_IPV4_SIP,
FILTER_FIELD_IPV4_DIP,
FILTER_FIELD_IPV4_TOS,
FILTER_FIELD_IPV4_PROTOCOL,
FILTER_FIELD_IPV4_FLAG,
FILTER_FIELD_IPV4_OFFSET,
FILTER_FIELD_IPV6_SIPV6,
FILTER_FIELD_IPV6_DIPV6,
FILTER_FIELD_IPV6_TRAFFIC_CLASS,
FILTER_FIELD_IPV6_NEXT_HEADER,
FILTER_FIELD_TCP_SPORT,
FILTER_FIELD_TCP_DPORT,
FILTER_FIELD_TCP_FLAG,
FILTER_FIELD_UDP_SPORT,
FILTER_FIELD_UDP_DPORT,
FILTER_FIELD_ICMP_CODE,
FILTER_FIELD_ICMP_TYPE,
FILTER_FIELD_IGMP_TYPE,
FILTER_FIELD_VID_RANGE,
FILTER_FIELD_IP_RANGE,
FILTER_FIELD_PORT_RANGE,
FILTER_FIELD_USER_DEFINED00,
FILTER_FIELD_USER_DEFINED01,
FILTER_FIELD_USER_DEFINED02,
FILTER_FIELD_USER_DEFINED03,
FILTER_FIELD_USER_DEFINED04,
FILTER_FIELD_USER_DEFINED05,
FILTER_FIELD_USER_DEFINED06,
FILTER_FIELD_USER_DEFINED07,
FILTER_FIELD_USER_DEFINED08,
FILTER_FIELD_USER_DEFINED09,
FILTER_FIELD_USER_DEFINED10,
FILTER_FIELD_USER_DEFINED11,
FILTER_FIELD_USER_DEFINED12,
FILTER_FIELD_USER_DEFINED13,
FILTER_FIELD_USER_DEFINED14,
FILTER_FIELD_USER_DEFINED15,
FILTER_FIELD_PATTERN_MATCH,
FILTER_FIELD_END,
} rtk_filter_field_type_t;
typedef enum rtk_filter_field_type_raw_e
{
FILTER_FIELD_RAW_UNUSED = 0,
FILTER_FIELD_RAW_DMAC_15_0,
FILTER_FIELD_RAW_DMAC_31_16,
FILTER_FIELD_RAW_DMAC_47_32,
FILTER_FIELD_RAW_SMAC_15_0,
FILTER_FIELD_RAW_SMAC_31_16,
FILTER_FIELD_RAW_SMAC_47_32,
FILTER_FIELD_RAW_ETHERTYPE,
FILTER_FIELD_RAW_STAG,
FILTER_FIELD_RAW_CTAG,
FILTER_FIELD_RAW_IPV4_SIP_15_0 = 0x10,
FILTER_FIELD_RAW_IPV4_SIP_31_16,
FILTER_FIELD_RAW_IPV4_DIP_15_0,
FILTER_FIELD_RAW_IPV4_DIP_31_16,
FILTER_FIELD_RAW_IPV6_SIP_15_0 = 0x20,
FILTER_FIELD_RAW_IPV6_SIP_31_16,
FILTER_FIELD_RAW_IPV6_DIP_15_0 = 0x28,
FILTER_FIELD_RAW_IPV6_DIP_31_16,
FILTER_FIELD_RAW_VIDRANGE = 0x30,
FILTER_FIELD_RAW_IPRANGE,
FILTER_FIELD_RAW_PORTRANGE,
FILTER_FIELD_RAW_FIELD_VALID,
FILTER_FIELD_RAW_FIELD_SELECT00 = 0x40,
FILTER_FIELD_RAW_FIELD_SELECT01,
FILTER_FIELD_RAW_FIELD_SELECT02,
FILTER_FIELD_RAW_FIELD_SELECT03,
FILTER_FIELD_RAW_FIELD_SELECT04,
FILTER_FIELD_RAW_FIELD_SELECT05,
FILTER_FIELD_RAW_FIELD_SELECT06,
FILTER_FIELD_RAW_FIELD_SELECT07,
FILTER_FIELD_RAW_FIELD_SELECT08,
FILTER_FIELD_RAW_FIELD_SELECT09,
FILTER_FIELD_RAW_FIELD_SELECT10,
FILTER_FIELD_RAW_FIELD_SELECT11,
FILTER_FIELD_RAW_FIELD_SELECT12,
FILTER_FIELD_RAW_FIELD_SELECT13,
FILTER_FIELD_RAW_FIELD_SELECT14,
FILTER_FIELD_RAW_FIELD_SELECT15,
FILTER_FIELD_RAW_END,
} rtk_filter_field_type_raw_t;
typedef enum rtk_filter_flag_care_type_e
{
FILTER_FLAG_CARE_DONT_CARE = 0,
FILTER_FLAG_CARE_1,
FILTER_FLAG_CARE_0,
FILTER_FLAG_END
} rtk_filter_flag_care_type_t;
typedef rtk_uint32 rtk_filter_id_t; /* filter id type */
typedef enum rtk_filter_invert_e
{
FILTER_INVERT_DISABLE = 0,
FILTER_INVERT_ENABLE,
FILTER_INVERT_END,
} rtk_filter_invert_t;
typedef rtk_uint32 rtk_filter_state_t;
typedef rtk_uint32 rtk_filter_unmatch_action_t;
typedef enum rtk_filter_unmatch_action_e
{
FILTER_UNMATCH_DROP = 0,
FILTER_UNMATCH_PERMIT,
FILTER_UNMATCH_END,
} rtk_filter_unmatch_action_type_t;
typedef struct
{
rtk_filter_field_t *fieldHead;
rtk_filter_care_tag_t careTag;
rtk_filter_activeport_t activeport;
rtk_filter_invert_t invert;
} rtk_filter_cfg_t;
typedef struct
{
rtk_filter_field_raw_t dataFieldRaw[RTK_FILTER_RAW_FIELD_NUMBER];
rtk_filter_field_raw_t careFieldRaw[RTK_FILTER_RAW_FIELD_NUMBER];
rtk_filter_field_type_raw_t fieldRawType[RTK_FILTER_RAW_FIELD_NUMBER];
rtk_filter_care_tag_t careTag;
rtk_filter_activeport_t activeport;
rtk_filter_invert_t invert;
rtk_enable_t valid;
} rtk_filter_cfg_raw_t;
typedef struct
{
rtk_uint32 index;
rtk_filter_field_type_raw_t fieldType[RTK_FILTER_RAW_FIELD_NUMBER];
} rtk_filter_template_t;
typedef enum rtk_field_sel_e
{
FORMAT_DEFAULT = 0,
FORMAT_RAW,
FORMAT_LLC,
FORMAT_IPV4,
FORMAT_ARP,
FORMAT_IPV6,
FORMAT_IPPAYLOAD,
FORMAT_L4PAYLOAD,
FORMAT_END
}rtk_field_sel_t;
typedef enum rtk_filter_iprange_e
{
IPRANGE_UNUSED = 0,
IPRANGE_IPV4_SIP,
IPRANGE_IPV4_DIP,
IPRANGE_IPV6_SIP,
IPRANGE_IPV6_DIP,
IPRANGE_END
}rtk_filter_iprange_t;
typedef enum rtk_filter_vidrange_e
{
VIDRANGE_UNUSED = 0,
VIDRANGE_CVID,
VIDRANGE_SVID,
VIDRANGE_END
}rtk_filter_vidrange_t;
typedef enum rtk_filter_portrange_e
{
PORTRANGE_UNUSED = 0,
PORTRANGE_SPORT,
PORTRANGE_DPORT,
PORTRANGE_END
}rtk_filter_portrange_t;
/* Function Name:
* rtk_filter_igrAcl_init
* Description:
* ACL initialization function
* Input:
* None
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_NULL_POINTER - Pointer pFilter_field or pFilter_cfg point to NULL.
* Note:
* This function enable and intialize ACL function
*/
extern rtk_api_ret_t rtk_filter_igrAcl_init(void);
/* Function Name:
* rtk_filter_igrAcl_field_add
* Description:
* Add comparison rule to an ACL configuration
* Input:
* pFilter_cfg - The ACL configuration that this function will add comparison rule
* pFilter_field - The comparison rule that will be added.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_NULL_POINTER - Pointer pFilter_field or pFilter_cfg point to NULL.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* This function add a comparison rule (*pFilter_field) to an ACL configuration (*pFilter_cfg).
* Pointer pFilter_cfg points to an ACL configuration structure, this structure keeps multiple ACL
* comparison rules by means of linked list. Pointer pFilter_field will be added to linked
* list keeped by structure that pFilter_cfg points to.
*/
extern rtk_api_ret_t rtk_filter_igrAcl_field_add(rtk_filter_cfg_t *pFilter_cfg, rtk_filter_field_t *pFilter_field);
/* Function Name:
* rtk_filter_igrAcl_cfg_add
* Description:
* Add an ACL configuration to ASIC
* Input:
* filter_id - Start index of ACL configuration.
* pFilter_cfg - The ACL configuration that this function will add comparison rule
* pFilter_action - Action(s) of ACL configuration.
* Output:
* ruleNum - number of rules written in acl table
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_NULL_POINTER - Pointer pFilter_field or pFilter_cfg point to NULL.
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_ENTRY_INDEX - Invalid filter_id .
* RT_ERR_NULL_POINTER - Pointer pFilter_action or pFilter_cfg point to NULL.
* RT_ERR_FILTER_INACL_ACT_NOT_SUPPORT - Action is not supported in this chip.
* RT_ERR_FILTER_INACL_RULE_NOT_SUPPORT - Rule is not supported.
* Note:
* This function store pFilter_cfg, pFilter_action into ASIC. The starting
* index(es) is filter_id.
*/
extern rtk_api_ret_t rtk_filter_igrAcl_cfg_add(rtk_filter_id_t filter_id, rtk_filter_cfg_t *pFilter_cfg, rtk_filter_action_t *pAction, rtk_filter_number_t *ruleNum);
/* Function Name:
* rtk_filter_igrAcl_cfg_del
* Description:
* Delete an ACL configuration from ASIC
* Input:
* filter_id - Start index of ACL configuration.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_FILTER_ENTRYIDX - Invalid filter_id.
* Note:
* This function delete a group of ACL rules starting from filter_id.
*/
extern rtk_api_ret_t rtk_filter_igrAcl_cfg_del(rtk_filter_id_t filter_id);
/* Function Name:
* rtk_filter_igrAcl_cfg_delAll
* Description:
* Delete all ACL entries from ASIC
* Input:
* None
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* This function delete all ACL configuration from ASIC.
*/
extern rtk_api_ret_t rtk_filter_igrAcl_cfg_delAll(void);
/* Function Name:
* rtk_filter_igrAcl_cfg_get
* Description:
* Get one ingress acl configuration from ASIC.
* Input:
* filter_id - Start index of ACL configuration.
* Output:
* pFilter_cfg - buffer pointer of ingress acl data
* pFilter_action - buffer pointer of ingress acl action
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_NULL_POINTER - Pointer pFilter_action or pFilter_cfg point to NULL.
* RT_ERR_FILTER_ENTRYIDX - Invalid entry index.
* Note:
* This function delete all ACL configuration from ASIC.
*/
extern rtk_api_ret_t rtk_filter_igrAcl_cfg_get(rtk_filter_id_t filter_id, rtk_filter_cfg_raw_t *pFilter_cfg, rtk_filter_action_t *pAction);
/* Function Name:
* rtk_filter_igrAcl_unmatchAction_set
* Description:
* Set action to packets when no ACL configuration match
* Input:
* port - Port id.
* action - Action.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port id.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* This function sets action of packets when no ACL configruation matches.
*/
extern rtk_api_ret_t rtk_filter_igrAcl_unmatchAction_set(rtk_port_t port, rtk_filter_unmatch_action_t action);
/* Function Name:
* rtk_filter_igrAcl_unmatchAction_get
* Description:
* Get action to packets when no ACL configuration match
* Input:
* port - Port id.
* Output:
* pAction - Action.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port id.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* This function gets action of packets when no ACL configruation matches.
*/
extern rtk_api_ret_t rtk_filter_igrAcl_unmatchAction_get(rtk_port_t port, rtk_filter_unmatch_action_t* action);
/* Function Name:
* rtk_filter_igrAcl_state_set
* Description:
* Set state of ingress ACL.
* Input:
* port - Port id.
* state - Ingress ACL state.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port id.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* This function gets action of packets when no ACL configruation matches.
*/
extern rtk_api_ret_t rtk_filter_igrAcl_state_set(rtk_port_t port, rtk_filter_state_t state);
/* Function Name:
* rtk_filter_igrAcl_state_get
* Description:
* Get state of ingress ACL.
* Input:
* port - Port id.
* Output:
* pState - Ingress ACL state.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port id.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* This function gets action of packets when no ACL configruation matches.
*/
extern rtk_api_ret_t rtk_filter_igrAcl_state_get(rtk_port_t port, rtk_filter_state_t* state);
/* Function Name:
* rtk_filter_igrAcl_template_set
* Description:
* Set template of ingress ACL.
* Input:
* template - Ingress ACL template
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* This function set ACL template.
*/
extern rtk_api_ret_t rtk_filter_igrAcl_template_set(rtk_filter_template_t *aclTemplate);
/* Function Name:
* rtk_filter_igrAcl_template_get
* Description:
* Get template of ingress ACL.
* Input:
* template - Ingress ACL template
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* This function gets template of ACL.
*/
extern rtk_api_ret_t rtk_filter_igrAcl_template_get(rtk_filter_template_t *aclTemplate);
/* Function Name:
* rtk_filter_igrAcl_field_sel_set
* Description:
* Set user defined field selectors in HSB
* Input:
* index - index of field selector 0-15
* format - Format of field selector
* offset - Retrieving data offset
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* System support 16 user defined field selctors.
* Each selector can be enabled or disable.
* User can defined retrieving 16-bits in many predefiend
* standard l2/l3/l4 payload.
*/
extern rtk_api_ret_t rtk_filter_igrAcl_field_sel_set(rtk_uint32 index, rtk_field_sel_t format, rtk_uint32 offset);
/* Function Name:
* rtk_filter_igrAcl_field_sel_get
* Description:
* Get user defined field selectors in HSB
* Input:
* index - index of field selector 0-15
* Output:
* pFormat - Format of field selector
* pOffset - Retrieving data offset
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* None.
*/
extern rtk_api_ret_t rtk_filter_igrAcl_field_sel_get(rtk_uint32 index, rtk_field_sel_t *pFormat, rtk_uint32 *pOffset);
/* Function Name:
* rtk_filter_iprange_set
* Description:
* Set IP Range check
* Input:
* index - index of IP Range 0-15
* type - IP Range check type, 0:Delete a entry, 1: IPv4_SIP, 2: IPv4_DIP, 3:IPv6_SIP, 4:IPv6_DIP
* upperIp - The upper bound of IP range
* lowerIp - The lower Bound of IP range
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_OUT_OF_RANGE - The parameter is out of range
* RT_ERR_INPUT - Input error
* Note:
* upperIp must be larger or equal than lowerIp.
*/
extern rtk_api_ret_t rtk_filter_iprange_set(rtk_uint32 index, rtk_filter_iprange_t type, ipaddr_t upperIp, ipaddr_t lowerIp);
/* Function Name:
* rtk_filter_iprange_get
* Description:
* Set IP Range check
* Input:
* index - index of IP Range 0-15
* Output:
* pType - IP Range check type, 0:Delete a entry, 1: IPv4_SIP, 2: IPv4_DIP, 3:IPv6_SIP, 4:IPv6_DIP
* pUpperIp - The upper bound of IP range
* pLowerIp - The lower Bound of IP range
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_OUT_OF_RANGE - The parameter is out of range
* Note:
* upperIp must be larger or equal than lowerIp.
*/
extern rtk_api_ret_t rtk_filter_iprange_get(rtk_uint32 index, rtk_filter_iprange_t *pType, ipaddr_t *pUpperIp, ipaddr_t *pLowerIp);
/* Function Name:
* rtk_filter_vidrange_set
* Description:
* Set VID Range check
* Input:
* index - index of VID Range 0-15
* type - IP Range check type, 0:Delete a entry, 1: CVID, 2: SVID
* upperVid - The upper bound of VID range
* lowerVid - The lower Bound of VID range
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_OUT_OF_RANGE - The parameter is out of range
* RT_ERR_INPUT - Input error
* Note:
* upperVid must be larger or equal than lowerVid.
*/
extern rtk_api_ret_t rtk_filter_vidrange_set(rtk_uint32 index, rtk_filter_vidrange_t type, rtk_uint32 upperVid, rtk_uint32 lowerVid);
/* Function Name:
* rtk_filter_vidrange_get
* Description:
* Get VID Range check
* Input:
* index - index of VID Range 0-15
* Output:
* pType - IP Range check type, 0:Unused, 1: CVID, 2: SVID
* pUpperVid - The upper bound of VID range
* pLowerVid - The lower Bound of VID range
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_OUT_OF_RANGE - The parameter is out of range
* Note:
* None.
*/
extern rtk_api_ret_t rtk_filter_vidrange_get(rtk_uint32 index, rtk_filter_vidrange_t *pType, rtk_uint32 *pUpperVid, rtk_uint32 *pLowerVid);
/* Function Name:
* rtk_filter_portrange_set
* Description:
* Set Port Range check
* Input:
* index - index of Port Range 0-15
* type - IP Range check type, 0:Delete a entry, 1: Source Port, 2: Destnation Port
* upperPort - The upper bound of Port range
* lowerPort - The lower Bound of Port range
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_OUT_OF_RANGE - The parameter is out of range
* RT_ERR_INPUT - Input error
* Note:
* upperPort must be larger or equal than lowerPort.
*/
extern rtk_api_ret_t rtk_filter_portrange_set(rtk_uint32 index, rtk_filter_portrange_t type, rtk_uint32 upperPort, rtk_uint32 lowerPort);
/* Function Name:
* rtk_filter_portrange_get
* Description:
* Set Port Range check
* Input:
* index - index of Port Range 0-15
* Output:
* pType - IP Range check type, 0:Delete a entry, 1: Source Port, 2: Destnation Port
* pUpperPort - The upper bound of Port range
* pLowerPort - The lower Bound of Port range
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_OUT_OF_RANGE - The parameter is out of range
* RT_ERR_INPUT - Input error
* Note:
* None.
*/
extern rtk_api_ret_t rtk_filter_portrange_get(rtk_uint32 index, rtk_filter_portrange_t *pType, rtk_uint32 *pUpperPort, rtk_uint32 *pLowerPort);
/* Function Name:
* rtk_filter_igrAclPolarity_set
* Description:
* Set ACL Goip control palarity
* Input:
* polarity - 1: High, 0: Low
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* none
*/
extern rtk_api_ret_t rtk_filter_igrAclPolarity_set(rtk_uint32 polarity);
/* Function Name:
* rtk_filter_igrAclPolarity_get
* Description:
* Get ACL Goip control palarity
* Input:
* pPolarity - 1: High, 0: Low
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* none
*/
extern rtk_api_ret_t rtk_filter_igrAclPolarity_get(rtk_uint32* pPolarity);
#endif /* __RTK_API_ACL_H__ */

View file

@ -0,0 +1,327 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* Purpose : RTL8367/RTL8367C switch high-level API
*
* Feature : The file includes CPU module high-layer API defination
*
*/
#ifndef __RTK_API_CPU_H__
#define __RTK_API_CPU_H__
/*
* Data Type Declaration
*/
typedef enum rtk_cpu_insert_e
{
CPU_INSERT_TO_ALL = 0,
CPU_INSERT_TO_TRAPPING,
CPU_INSERT_TO_NONE,
CPU_INSERT_END
}rtk_cpu_insert_t;
typedef enum rtk_cpu_position_e
{
CPU_POS_AFTER_SA = 0,
CPU_POS_BEFORE_CRC,
CPU_POS_END
}rtk_cpu_position_t;
typedef enum rtk_cpu_tag_length_e
{
CPU_LEN_8BYTES = 0,
CPU_LEN_4BYTES,
CPU_LEN_END
}rtk_cpu_tag_length_t;
typedef enum rtk_cpu_rx_length_e
{
CPU_RX_72BYTES = 0,
CPU_RX_64BYTES,
CPU_RX_END
}rtk_cpu_rx_length_t;
/* Function Name:
* rtk_cpu_enable_set
* Description:
* Set CPU port function enable/disable.
* Input:
* enable - CPU port function enable
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameter.
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* The API can set CPU port function enable/disable.
*/
extern rtk_api_ret_t rtk_cpu_enable_set(rtk_enable_t enable);
/* Function Name:
* rtk_cpu_enable_get
* Description:
* Get CPU port and its setting.
* Input:
* None
* Output:
* pEnable - CPU port function enable
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_L2_NO_CPU_PORT - CPU port is not exist
* Note:
* The API can get CPU port function enable/disable.
*/
extern rtk_api_ret_t rtk_cpu_enable_get(rtk_enable_t *pEnable);
/* Function Name:
* rtk_cpu_tagPort_set
* Description:
* Set CPU port and CPU tag insert mode.
* Input:
* port - Port id.
* mode - CPU tag insert for packets egress from CPU port.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameter.
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* The API can set CPU port and inserting proprietary CPU tag mode (Length/Type 0x8899)
* to the frame that transmitting to CPU port.
* The inset cpu tag mode is as following:
* - CPU_INSERT_TO_ALL
* - CPU_INSERT_TO_TRAPPING
* - CPU_INSERT_TO_NONE
*/
extern rtk_api_ret_t rtk_cpu_tagPort_set(rtk_port_t port, rtk_cpu_insert_t mode);
/* Function Name:
* rtk_cpu_tagPort_get
* Description:
* Get CPU port and CPU tag insert mode.
* Input:
* None
* Output:
* pPort - Port id.
* pMode - CPU tag insert for packets egress from CPU port, 0:all insert 1:Only for trapped packets 2:no insert.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_L2_NO_CPU_PORT - CPU port is not exist
* Note:
* The API can get configured CPU port and its setting.
* The inset cpu tag mode is as following:
* - CPU_INSERT_TO_ALL
* - CPU_INSERT_TO_TRAPPING
* - CPU_INSERT_TO_NONE
*/
extern rtk_api_ret_t rtk_cpu_tagPort_get(rtk_port_t *pPort, rtk_cpu_insert_t *pMode);
/* Function Name:
* rtk_cpu_awarePort_set
* Description:
* Set CPU aware port mask.
* Input:
* portmask - Port mask.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_MASK - Invalid port mask.
* Note:
* The API can set configured CPU aware port mask.
*/
extern rtk_api_ret_t rtk_cpu_awarePort_set(rtk_portmask_t *pPortmask);
/* Function Name:
* rtk_cpu_awarePort_get
* Description:
* Get CPU aware port mask.
* Input:
* None
* Output:
* pPortmask - Port mask.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* The API can get configured CPU aware port mask.
*/
extern rtk_api_ret_t rtk_cpu_awarePort_get(rtk_portmask_t *pPortmask);
/* Function Name:
* rtk_cpu_tagPosition_set
* Description:
* Set CPU tag position.
* Input:
* position - CPU tag position.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input.
* Note:
* The API can set CPU tag position.
*/
extern rtk_api_ret_t rtk_cpu_tagPosition_set(rtk_cpu_position_t position);
/* Function Name:
* rtk_cpu_tagPosition_get
* Description:
* Get CPU tag position.
* Input:
* None
* Output:
* pPosition - CPU tag position.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input.
* Note:
* The API can get CPU tag position.
*/
extern rtk_api_ret_t rtk_cpu_tagPosition_get(rtk_cpu_position_t *pPosition);
/* Function Name:
* rtk_cpu_tagLength_set
* Description:
* Set CPU tag length.
* Input:
* length - CPU tag length.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input.
* Note:
* The API can set CPU tag length.
*/
extern rtk_api_ret_t rtk_cpu_tagLength_set(rtk_cpu_tag_length_t length);
/* Function Name:
* rtk_cpu_tagLength_get
* Description:
* Get CPU tag length.
* Input:
* None
* Output:
* pLength - CPU tag length.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input.
* Note:
* The API can get CPU tag length.
*/
extern rtk_api_ret_t rtk_cpu_tagLength_get(rtk_cpu_tag_length_t *pLength);
/* Function Name:
* rtk_cpu_acceptLength_set
* Description:
* Set CPU accept length.
* Input:
* length - CPU tag length.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input.
* Note:
* The API can set CPU accept length.
*/
extern rtk_api_ret_t rtk_cpu_acceptLength_set(rtk_cpu_rx_length_t length);
/* Function Name:
* rtk_cpu_acceptLength_get
* Description:
* Get CPU accept length.
* Input:
* None
* Output:
* pLength - CPU tag length.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input.
* Note:
* The API can get CPU accept length.
*/
extern rtk_api_ret_t rtk_cpu_acceptLength_get(rtk_cpu_rx_length_t *pLength);
/* Function Name:
* rtk_cpu_priRemap_set
* Description:
* Configure CPU priorities mapping to internal absolute priority.
* Input:
* int_pri - internal priority value.
* new_pri - new internal priority value.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_VLAN_PRIORITY - Invalid 1p priority.
* RT_ERR_QOS_INT_PRIORITY - Invalid priority.
* Note:
* Priority of CPU tag assignment for internal asic priority, and it is used for queue usage and packet scheduling.
*/
extern rtk_api_ret_t rtk_cpu_priRemap_set(rtk_pri_t int_pri, rtk_pri_t new_pri);
/* Function Name:
* rtk_cpu_priRemap_get
* Description:
* Configure CPU priorities mapping to internal absolute priority.
* Input:
* int_pri - internal priority value.
* Output:
* pNew_pri - new internal priority value.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_VLAN_PRIORITY - Invalid 1p priority.
* RT_ERR_QOS_INT_PRIORITY - Invalid priority.
* Note:
* Priority of CPU tag assignment for internal asic priority, and it is used for queue usage and packet scheduling.
*/
extern rtk_api_ret_t rtk_cpu_priRemap_get(rtk_pri_t int_pri, rtk_pri_t *pNew_pri);
#endif /* __RTK_API_CPU_H__ */

View file

@ -0,0 +1,470 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* Purpose : RTL8367/RTL8367C switch high-level API
*
* Feature : The file includes 1X module high-layer API defination
*
*/
#ifndef __RTK_API_DOT1X_H__
#define __RTK_API_DOT1X_H__
/* Type of port-based dot1x auth/unauth*/
typedef enum rtk_dot1x_auth_status_e
{
UNAUTH = 0,
AUTH,
AUTH_STATUS_END
} rtk_dot1x_auth_status_t;
typedef enum rtk_dot1x_direction_e
{
DIR_BOTH = 0,
DIR_IN,
DIRECTION_END
} rtk_dot1x_direction_t;
/* unauth pkt action */
typedef enum rtk_dot1x_unauth_action_e
{
DOT1X_ACTION_DROP = 0,
DOT1X_ACTION_TRAP2CPU,
DOT1X_ACTION_GUESTVLAN,
DOT1X_ACTION_END
} rtk_dot1x_unauth_action_t;
/* Function Name:
* rtk_dot1x_unauthPacketOper_set
* Description:
* Set 802.1x unauth action configuration.
* Input:
* port - Port id.
* unauth_action - 802.1X unauth action.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_INPUT - Invalid input parameter.
* Note:
* This API can set 802.1x unauth action configuration.
* The unauth action is as following:
* - DOT1X_ACTION_DROP
* - DOT1X_ACTION_TRAP2CPU
* - DOT1X_ACTION_GUESTVLAN
*/
extern rtk_api_ret_t rtk_dot1x_unauthPacketOper_set(rtk_port_t port, rtk_dot1x_unauth_action_t unauth_action);
/* Function Name:
* rtk_dot1x_unauthPacketOper_get
* Description:
* Get 802.1x unauth action configuration.
* Input:
* port - Port id.
* Output:
* pUnauth_action - 802.1X unauth action.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* This API can get 802.1x unauth action configuration.
* The unauth action is as following:
* - DOT1X_ACTION_DROP
* - DOT1X_ACTION_TRAP2CPU
* - DOT1X_ACTION_GUESTVLAN
*/
extern rtk_api_ret_t rtk_dot1x_unauthPacketOper_get(rtk_port_t port, rtk_dot1x_unauth_action_t *pUnauth_action);
/* Function Name:
* rtk_dot1x_eapolFrame2CpuEnable_set
* Description:
* Set 802.1x EAPOL packet trap to CPU configuration
* Input:
* enable - The status of 802.1x EAPOL packet.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_ENABLE - Invalid enable input.
* Note:
* To support 802.1x authentication functionality, EAPOL frame (ether type = 0x888E) has to
* be trapped to CPU.
* The status of EAPOL frame trap to CPU is as following:
* - DISABLED
* - ENABLED
*/
extern rtk_api_ret_t rtk_dot1x_eapolFrame2CpuEnable_set(rtk_enable_t enable);
/* Function Name:
* rtk_dot1x_eapolFrame2CpuEnable_get
* Description:
* Get 802.1x EAPOL packet trap to CPU configuration
* Input:
* None
* Output:
* pEnable - The status of 802.1x EAPOL packet.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* To support 802.1x authentication functionality, EAPOL frame (ether type = 0x888E) has to
* be trapped to CPU.
* The status of EAPOL frame trap to CPU is as following:
* - DISABLED
* - ENABLED
*/
extern rtk_api_ret_t rtk_dot1x_eapolFrame2CpuEnable_get(rtk_enable_t *pEnable);
/* Function Name:
* rtk_dot1x_portBasedEnable_set
* Description:
* Set 802.1x port-based enable configuration
* Input:
* port - Port id.
* enable - The status of 802.1x port.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_ENABLE - Invalid enable input.
* RT_ERR_DOT1X_PORTBASEDPNEN - 802.1X port-based enable error
* Note:
* The API can update the port-based port enable register content. If a port is 802.1x
* port based network access control "enabled", it should be authenticated so packets
* from that port won't be dropped or trapped to CPU.
* The status of 802.1x port-based network access control is as following:
* - DISABLED
* - ENABLED
*/
extern rtk_api_ret_t rtk_dot1x_portBasedEnable_set(rtk_port_t port, rtk_enable_t enable);
/* Function Name:
* rtk_dot1x_portBasedEnable_get
* Description:
* Get 802.1x port-based enable configuration
* Input:
* port - Port id.
* Output:
* pEnable - The status of 802.1x port.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* The API can get the 802.1x port-based port status.
*/
extern rtk_api_ret_t rtk_dot1x_portBasedEnable_get(rtk_port_t port, rtk_enable_t *pEnable);
/* Function Name:
* rtk_dot1x_portBasedAuthStatus_set
* Description:
* Set 802.1x port-based auth. port configuration
* Input:
* port - Port id.
* port_auth - The status of 802.1x port.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_DOT1X_PORTBASEDAUTH - 802.1X port-based auth error
* Note:
* The authenticated status of 802.1x port-based network access control is as following:
* - UNAUTH
* - AUTH
*/
extern rtk_api_ret_t rtk_dot1x_portBasedAuthStatus_set(rtk_port_t port, rtk_dot1x_auth_status_t port_auth);
/* Function Name:
* rtk_dot1x_portBasedAuthStatus_get
* Description:
* Get 802.1x port-based auth. port configuration
* Input:
* port - Port id.
* Output:
* pPort_auth - The status of 802.1x port.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* The API can get 802.1x port-based port auth.information.
*/
extern rtk_api_ret_t rtk_dot1x_portBasedAuthStatus_get(rtk_port_t port, rtk_dot1x_auth_status_t *pPort_auth);
/* Function Name:
* rtk_dot1x_portBasedDirection_set
* Description:
* Set 802.1x port-based operational direction configuration
* Input:
* port - Port id.
* port_direction - Operation direction
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_DOT1X_PORTBASEDOPDIR - 802.1X port-based operation direction error
* Note:
* The operate controlled direction of 802.1x port-based network access control is as following:
* - BOTH
* - IN
*/
extern rtk_api_ret_t rtk_dot1x_portBasedDirection_set(rtk_port_t port, rtk_dot1x_direction_t port_direction);
/* Function Name:
* rtk_dot1x_portBasedDirection_get
* Description:
* Get 802.1X port-based operational direction configuration
* Input:
* port - Port id.
* Output:
* pPort_direction - Operation direction
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* The API can get 802.1x port-based operational direction information.
*/
extern rtk_api_ret_t rtk_dot1x_portBasedDirection_get(rtk_port_t port, rtk_dot1x_direction_t *pPort_direction);
/* Function Name:
* rtk_dot1x_macBasedEnable_set
* Description:
* Set 802.1x mac-based port enable configuration
* Input:
* port - Port id.
* enable - The status of 802.1x port.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_ENABLE - Invalid enable input.
* RT_ERR_DOT1X_MACBASEDPNEN - 802.1X mac-based enable error
* Note:
* If a port is 802.1x MAC based network access control "enabled", the incoming packets should
* be authenticated so packets from that port won't be dropped or trapped to CPU.
* The status of 802.1x MAC-based network access control is as following:
* - DISABLED
* - ENABLED
*/
extern rtk_api_ret_t rtk_dot1x_macBasedEnable_set(rtk_port_t port, rtk_enable_t enable);
/* Function Name:
* rtk_dot1x_macBasedEnable_get
* Description:
* Get 802.1x mac-based port enable configuration
* Input:
* port - Port id.
* Output:
* pEnable - The status of 802.1x port.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* If a port is 802.1x MAC based network access control "enabled", the incoming packets should
* be authenticated so packets from that port wont be dropped or trapped to CPU.
* The status of 802.1x MAC-based network access control is as following:
* - DISABLED
* - ENABLED
*/
extern rtk_api_ret_t rtk_dot1x_macBasedEnable_get(rtk_port_t port, rtk_enable_t *pEnable);
/* Function Name:
* rtk_dot1x_macBasedAuthMac_add
* Description:
* Add an authenticated MAC to ASIC
* Input:
* port - Port id.
* pAuth_mac - The authenticated MAC.
* fid - filtering database.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_ENABLE - Invalid enable input.
* RT_ERR_DOT1X_MACBASEDPNEN - 802.1X mac-based enable error
* Note:
* The API can add a 802.1x authenticated MAC address to port. If the MAC does not exist in LUT,
* user can't add this MAC to auth status.
*/
extern rtk_api_ret_t rtk_dot1x_macBasedAuthMac_add(rtk_port_t port, rtk_mac_t *pAuth_mac, rtk_fid_t fid);
/* Function Name:
* rtk_dot1x_macBasedAuthMac_del
* Description:
* Delete an authenticated MAC to ASIC
* Input:
* port - Port id.
* pAuth_mac - The authenticated MAC.
* fid - filtering database.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_MAC - Invalid MAC address.
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* The API can delete a 802.1x authenticated MAC address to port. It only change the auth status of
* the MAC and won't delete it from LUT.
*/
extern rtk_api_ret_t rtk_dot1x_macBasedAuthMac_del(rtk_port_t port, rtk_mac_t *pAuth_mac, rtk_fid_t fid);
/* Function Name:
* rtk_dot1x_macBasedDirection_set
* Description:
* Set 802.1x mac-based operational direction configuration
* Input:
* mac_direction - Operation direction
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameter.
* RT_ERR_DOT1X_MACBASEDOPDIR - 802.1X mac-based operation direction error
* Note:
* The operate controlled direction of 802.1x mac-based network access control is as following:
* - BOTH
* - IN
*/
extern rtk_api_ret_t rtk_dot1x_macBasedDirection_set(rtk_dot1x_direction_t mac_direction);
/* Function Name:
* rtk_dot1x_macBasedDirection_get
* Description:
* Get 802.1x mac-based operational direction configuration
* Input:
* port - Port id.
* Output:
* pMac_direction - Operation direction
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can get 802.1x mac-based operational direction information.
*/
extern rtk_api_ret_t rtk_dot1x_macBasedDirection_get(rtk_dot1x_direction_t *pMac_direction);
/* Function Name:
* Set 802.1x guest VLAN configuration
* Description:
* Set 802.1x mac-based operational direction configuration
* Input:
* vid - 802.1x guest VLAN ID
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameter.
* Note:
* The operate controlled 802.1x guest VLAN
*/
extern rtk_api_ret_t rtk_dot1x_guestVlan_set(rtk_vlan_t vid);
/* Function Name:
* rtk_dot1x_guestVlan_get
* Description:
* Get 802.1x guest VLAN configuration
* Input:
* None
* Output:
* pVid - 802.1x guest VLAN ID
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can get 802.1x guest VLAN information.
*/
extern rtk_api_ret_t rtk_dot1x_guestVlan_get(rtk_vlan_t *pVid);
/* Function Name:
* rtk_dot1x_guestVlan2Auth_set
* Description:
* Set 802.1x guest VLAN to auth host configuration
* Input:
* enable - The status of guest VLAN to auth host.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameter.
* Note:
* The operational direction of 802.1x guest VLAN to auth host control is as following:
* - ENABLED
* - DISABLED
*/
extern rtk_api_ret_t rtk_dot1x_guestVlan2Auth_set(rtk_enable_t enable);
/* Function Name:
* rtk_dot1x_guestVlan2Auth_get
* Description:
* Get 802.1x guest VLAN to auth host configuration
* Input:
* None
* Output:
* pEnable - The status of guest VLAN to auth host.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can get 802.1x guest VLAN to auth host information.
*/
extern rtk_api_ret_t rtk_dot1x_guestVlan2Auth_get(rtk_enable_t *pEnable);
#endif /* __RTK_API_DOT1X_H__ */

View file

@ -0,0 +1,82 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* Purpose : RTL8367/RTL8367C switch high-level API
*
* Feature : The file includes EEE module high-layer API defination
*
*/
#ifndef __RTK_API_EEE_H__
#define __RTK_API_EEE_H__
/* Function Name:
* rtk_eee_init
* Description:
* EEE function initialization.
* Input:
* None
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* This API is used to initialize EEE status.
*/
extern rtk_api_ret_t rtk_eee_init(void);
/* Function Name:
* rtk_eee_portEnable_set
* Description:
* Set enable status of EEE function.
* Input:
* port - port id.
* enable - enable EEE status.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_ENABLE - Invalid enable input.
* Note:
* This API can set EEE function to the specific port.
* The configuration of the port is as following:
* - DISABLE
* - ENABLE
*/
extern rtk_api_ret_t rtk_eee_portEnable_set(rtk_port_t port, rtk_enable_t enable);
/* Function Name:
* rtk_eee_portEnable_get
* Description:
* Get port admin configuration of the specific port.
* Input:
* port - Port id.
* Output:
* pEnable - Back pressure status.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* This API can set EEE function to the specific port.
* The configuration of the port is as following:
* - DISABLE
* - ENABLE
*/
extern rtk_api_ret_t rtk_eee_portEnable_get(rtk_port_t port, rtk_enable_t *pEnable);
#endif /* __RTK_API_EEE_H__ */

View file

@ -0,0 +1,168 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* Purpose : RTL8367/RTL8367C switch high-level API
*
* Feature : The file includes I2C module high-layer API defination
*
*/
#ifndef __RTK_API_I2C_H__
#define __RTK_API_I2C_H__
#include <rtk_types.h>
#define I2C_GPIO_MAX_GROUP (3)
typedef enum rtk_I2C_16bit_mode_e{
I2C_LSB_16BIT_MODE = 0,
I2C_70B_LSB_16BIT_MODE,
I2C_Mode_END
}rtk_I2C_16bit_mode_t;
typedef enum rtk_I2C_gpio_pin_e{
I2C_GPIO_PIN_8_9 = 0,
I2C_GPIO_PIN_15_16 ,
I2C_GPIO_PIN_35_36 ,
I2C_GPIO_PIN_END
}rtk_I2C_gpio_pin_t;
/* Function Name:
* rtk_i2c_data_read
* Description:
* read i2c slave device register.
* Input:
* deviceAddr - access Slave device address
* slaveRegAddr - access Slave register address
* Output:
* pRegData - read data
* Return:
* RT_ERR_OK - OK
* RT_ERR_NULL_POINTER - input parameter is null pointer
* Note:
* The API can access i2c slave and read i2c slave device register.
*/
extern rtk_api_ret_t rtk_i2c_data_read(rtk_uint8 deviceAddr, rtk_uint32 slaveRegAddr, rtk_uint32 *pRegData);
/* Function Name:
* rtk_i2c_data_write
* Description:
* write data to i2c slave device register
* Input:
* deviceAddr - access Slave device address
* slaveRegAddr - access Slave register address
* regData - data to set
* Output:
* None
* Return:
* RT_ERR_OK - OK
* Note:
* The API can access i2c slave and setting i2c slave device register.
*/
extern rtk_api_ret_t rtk_i2c_data_write(rtk_uint8 deviceAddr, rtk_uint32 slaveRegAddr, rtk_uint32 regData);
/* Function Name:
* rtk_i2c_init
* Description:
* I2C smart function initialization.
* Input:
* None
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* Note:
* This API is used to initialize EEE status.
* need used GPIO pins
* OpenDrain and clock
*/
extern rtk_api_ret_t rtk_i2c_init(void);
/* Function Name:
* rtk_i2c_mode_set
* Description:
* Set I2C data byte-order.
* Input:
* i2cmode - byte-order mode
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_INPUT - Invalid input parameter.
* Note:
* This API can set I2c traffic's byte-order .
*/
extern rtk_api_ret_t rtk_i2c_mode_set( rtk_I2C_16bit_mode_t i2cmode);
/* Function Name:
* rtk_i2c_mode_get
* Description:
* Get i2c traffic byte-order setting.
* Input:
* None
* Output:
* pI2cMode - i2c byte-order
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_NULL_POINTER - input parameter is null pointer
* Note:
* The API can get i2c traffic byte-order setting.
*/
extern rtk_api_ret_t rtk_i2c_mode_get( rtk_I2C_16bit_mode_t * pI2cMode);
/* Function Name:
* rtk_i2c_gpioPinGroup_set
* Description:
* Set i2c SDA & SCL used GPIO pins group.
* Input:
* pins_group - GPIO pins group
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_INPUT - Invalid input parameter.
* Note:
* The API can set i2c used gpio pins group.
* There are three group pins could be used
*/
extern rtk_api_ret_t rtk_i2c_gpioPinGroup_set( rtk_I2C_gpio_pin_t pins_group);
/* Function Name:
* rtk_i2c_gpioPinGroup_get
* Description:
* Get i2c SDA & SCL used GPIO pins group.
* Input:
* None
* Output:
* pPins_group - GPIO pins group
* Return:
* RT_ERR_OK - OK
* RT_ERR_NULL_POINTER - input parameter is null pointer
* Note:
* The API can get i2c used gpio pins group.
* There are three group pins could be used
*/
extern rtk_api_ret_t rtk_i2c_gpioPinGroup_get(rtk_I2C_gpio_pin_t * pPins_group);
#endif

View file

@ -0,0 +1,769 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* Purpose : RTL8367/RTL8367C switch high-level API
*
* Feature : The file includes IGMP module high-layer API defination
*
*/
#ifndef __RTK_API_IGMP_H__
#define __RTK_API_IGMP_H__
/*
* Data Type Declaration
*/
typedef enum rtk_igmp_type_e
{
IGMP_IPV4 = 0,
IGMP_PPPOE_IPV4,
IGMP_MLD,
IGMP_PPPOE_MLD,
IGMP_TYPE_END
} rtk_igmp_type_t;
typedef enum rtk_trap_igmp_action_e
{
IGMP_ACTION_FORWARD = 0,
IGMP_ACTION_TRAP2CPU,
IGMP_ACTION_DROP,
IGMP_ACTION_ASIC,
IGMP_ACTION_END
} rtk_igmp_action_t;
typedef enum rtk_igmp_protocol_e
{
PROTOCOL_IGMPv1 = 0,
PROTOCOL_IGMPv2,
PROTOCOL_IGMPv3,
PROTOCOL_MLDv1,
PROTOCOL_MLDv2,
PROTOCOL_END
} rtk_igmp_protocol_t;
typedef enum rtk_igmp_tableFullAction_e
{
IGMP_TABLE_FULL_FORWARD = 0,
IGMP_TABLE_FULL_DROP,
IGMP_TABLE_FULL_TRAP,
IGMP_TABLE_FULL_OP_END
}rtk_igmp_tableFullAction_t;
typedef enum rtk_igmp_checksumErrorAction_e
{
IGMP_CRC_ERR_DROP = 0,
IGMP_CRC_ERR_TRAP,
IGMP_CRC_ERR_FORWARD,
IGMP_CRC_ERR_OP_END
}rtk_igmp_checksumErrorAction_t;
typedef enum rtk_igmp_bypassGroup_e
{
IGMP_BYPASS_224_0_0_X = 0,
IGMP_BYPASS_224_0_1_X,
IGMP_BYPASS_239_255_255_X,
IGMP_BYPASS_IPV6_00XX,
IGMP_BYPASS_GROUP_END
}rtk_igmp_bypassGroup_t;
typedef struct rtk_igmp_dynamicRouterPort_s
{
rtk_enable_t dynamicRouterPort0Valid;
rtk_port_t dynamicRouterPort0;
rtk_uint32 dynamicRouterPort0Timer;
rtk_enable_t dynamicRouterPort1Valid;
rtk_port_t dynamicRouterPort1;
rtk_uint32 dynamicRouterPort1Timer;
}rtk_igmp_dynamicRouterPort_t;
typedef struct rtk_igmp_rxPktEnable_s
{
rtk_enable_t rxQuery;
rtk_enable_t rxReport;
rtk_enable_t rxLeave;
rtk_enable_t rxMRP;
rtk_enable_t rxMcast;
}rtk_igmp_rxPktEnable_t;
typedef struct rtk_igmp_groupInfo_s
{
rtk_enable_t valid;
rtk_portmask_t member;
rtk_uint32 timer[RTK_PORT_MAX];
rtk_uint32 reportSuppFlag;
}rtk_igmp_groupInfo_t;
typedef enum rtk_igmp_ReportLeaveFwdAct_e
{
IGMP_REPORT_LEAVE_TO_ROUTER = 0,
IGMP_REPORT_LEAVE_TO_ALLPORT,
IGMP_REPORT_LEAVE_TO_ROUTER_PORT_ADV,
IGMP_REPORT_LEAVE_ACT_END
}rtk_igmp_ReportLeaveFwdAct_t;
/* Function Name:
* rtk_igmp_init
* Description:
* This API enables H/W IGMP and set a default initial configuration.
* Input:
* None.
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* This API enables H/W IGMP and set a default initial configuration.
*/
extern rtk_api_ret_t rtk_igmp_init(void);
/* Function Name:
* rtk_igmp_state_set
* Description:
* This API set H/W IGMP state.
* Input:
* enabled - H/W IGMP state
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error parameter
* Note:
* This API set H/W IGMP state.
*/
extern rtk_api_ret_t rtk_igmp_state_set(rtk_enable_t enabled);
/* Function Name:
* rtk_igmp_state_get
* Description:
* This API get H/W IGMP state.
* Input:
* None.
* Output:
* pEnabled - H/W IGMP state
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error parameter
* Note:
* This API set current H/W IGMP state.
*/
extern rtk_api_ret_t rtk_igmp_state_get(rtk_enable_t *pEnabled);
/* Function Name:
* rtk_igmp_static_router_port_set
* Description:
* Configure static router port
* Input:
* pPortmask - Static Port mask
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_MASK - Error parameter
* Note:
* This API set static router port
*/
extern rtk_api_ret_t rtk_igmp_static_router_port_set(rtk_portmask_t *pPortmask);
/* Function Name:
* rtk_igmp_static_router_port_get
* Description:
* Get static router port
* Input:
* None.
* Output:
* pPortmask - Static port mask
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_MASK - Error parameter
* Note:
* This API get static router port
*/
extern rtk_api_ret_t rtk_igmp_static_router_port_get(rtk_portmask_t *pPortmask);
/* Function Name:
* rtk_igmp_protocol_set
* Description:
* set IGMP/MLD protocol action
* Input:
* port - Port ID
* protocol - IGMP/MLD protocol
* action - Per-port and per-protocol IGMP action seeting
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_MASK - Error parameter
* Note:
* This API set IGMP/MLD protocol action
*/
extern rtk_api_ret_t rtk_igmp_protocol_set(rtk_port_t port, rtk_igmp_protocol_t protocol, rtk_igmp_action_t action);
/* Function Name:
* rtk_igmp_protocol_get
* Description:
* set IGMP/MLD protocol action
* Input:
* port - Port ID
* protocol - IGMP/MLD protocol
* action - Per-port and per-protocol IGMP action seeting
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_MASK - Error parameter
* Note:
* This API set IGMP/MLD protocol action
*/
extern rtk_api_ret_t rtk_igmp_protocol_get(rtk_port_t port, rtk_igmp_protocol_t protocol, rtk_igmp_action_t *pAction);
/* Function Name:
* rtk_igmp_fastLeave_set
* Description:
* set IGMP/MLD FastLeave state
* Input:
* state - ENABLED: Enable FastLeave, DISABLED: disable FastLeave
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_INPUT - Error Input
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* This API set IGMP/MLD FastLeave state
*/
extern rtk_api_ret_t rtk_igmp_fastLeave_set(rtk_enable_t state);
/* Function Name:
* rtk_igmp_fastLeave_get
* Description:
* get IGMP/MLD FastLeave state
* Input:
* None
* Output:
* pState - ENABLED: Enable FastLeave, DISABLED: disable FastLeave
* Return:
* RT_ERR_OK - OK
* RT_ERR_NULL_POINTER - NULL pointer
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* This API get IGMP/MLD FastLeave state
*/
extern rtk_api_ret_t rtk_igmp_fastLeave_get(rtk_enable_t *pState);
/* Function Name:
* rtk_igmp_maxGroup_set
* Description:
* Set per port multicast group learning limit.
* Input:
* port - Port ID
* group - The number of multicast group learning limit.
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_PORT_ID - Error Port ID
* RT_ERR_OUT_OF_RANGE - parameter out of range
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* This API set per port multicast group learning limit.
*/
extern rtk_api_ret_t rtk_igmp_maxGroup_set(rtk_port_t port, rtk_uint32 group);
/* Function Name:
* rtk_igmp_maxGroup_get
* Description:
* Get per port multicast group learning limit.
* Input:
* port - Port ID
* Output:
* pGroup - The number of multicast group learning limit.
* Return:
* RT_ERR_OK - OK
* RT_ERR_PORT_ID - Error Port ID
* RT_ERR_NULL_POINTER - Null pointer
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* This API get per port multicast group learning limit.
*/
extern rtk_api_ret_t rtk_igmp_maxGroup_get(rtk_port_t port, rtk_uint32 *pGroup);
/* Function Name:
* rtk_igmp_currentGroup_get
* Description:
* Get per port multicast group learning count.
* Input:
* port - Port ID
* Output:
* pGroup - The number of multicast group learning count.
* Return:
* RT_ERR_OK - OK
* RT_ERR_PORT_ID - Error Port ID
* RT_ERR_NULL_POINTER - Null pointer
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* This API get per port multicast group learning count.
*/
extern rtk_api_ret_t rtk_igmp_currentGroup_get(rtk_port_t port, rtk_uint32 *pGroup);
/* Function Name:
* rtk_igmp_tableFullAction_set
* Description:
* set IGMP/MLD Table Full Action
* Input:
* action - Table Full Action
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_INPUT - Error Input
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
*/
extern rtk_api_ret_t rtk_igmp_tableFullAction_set(rtk_igmp_tableFullAction_t action);
/* Function Name:
* rtk_igmp_tableFullAction_get
* Description:
* get IGMP/MLD Table Full Action
* Input:
* None
* Output:
* pAction - Table Full Action
* Return:
* RT_ERR_OK - OK
* RT_ERR_NULL_POINTER - Null pointer
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
*/
extern rtk_api_ret_t rtk_igmp_tableFullAction_get(rtk_igmp_tableFullAction_t *pAction);
/* Function Name:
* rtk_igmp_checksumErrorAction_set
* Description:
* set IGMP/MLD Checksum Error Action
* Input:
* action - Checksum error Action
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_INPUT - Error Input
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
*/
extern rtk_api_ret_t rtk_igmp_checksumErrorAction_set(rtk_igmp_checksumErrorAction_t action);
/* Function Name:
* rtk_igmp_checksumErrorAction_get
* Description:
* get IGMP/MLD Checksum Error Action
* Input:
* None
* Output:
* pAction - Checksum error Action
* Return:
* RT_ERR_OK - OK
* RT_ERR_NULL_POINTER - Null pointer
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
*/
extern rtk_api_ret_t rtk_igmp_checksumErrorAction_get(rtk_igmp_checksumErrorAction_t *pAction);
/* Function Name:
* rtk_igmp_leaveTimer_set
* Description:
* set IGMP/MLD Leave timer
* Input:
* timer - Leave timer
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_INPUT - Error Input
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
*/
extern rtk_api_ret_t rtk_igmp_leaveTimer_set(rtk_uint32 timer);
/* Function Name:
* rtk_igmp_leaveTimer_get
* Description:
* get IGMP/MLD Leave timer
* Input:
* None
* Output:
* pTimer - Leave Timer.
* Return:
* RT_ERR_OK - OK
* RT_ERR_NULL_POINTER - Null pointer
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
*/
extern rtk_api_ret_t rtk_igmp_leaveTimer_get(rtk_uint32 *pTimer);
/* Function Name:
* rtk_igmp_queryInterval_set
* Description:
* set IGMP/MLD Query Interval
* Input:
* interval - Query Interval
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_INPUT - Error Input
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
*/
extern rtk_api_ret_t rtk_igmp_queryInterval_set(rtk_uint32 interval);
/* Function Name:
* rtk_igmp_queryInterval_get
* Description:
* get IGMP/MLD Query Interval
* Input:
* None.
* Output:
* pInterval - Query Interval
* Return:
* RT_ERR_OK - OK
* RT_ERR_NULL_POINTER - Null pointer
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
*/
extern rtk_api_ret_t rtk_igmp_queryInterval_get(rtk_uint32 *pInterval);
/* Function Name:
* rtk_igmp_robustness_set
* Description:
* set IGMP/MLD Robustness value
* Input:
* robustness - Robustness value
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_INPUT - Error Input
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
*/
extern rtk_api_ret_t rtk_igmp_robustness_set(rtk_uint32 robustness);
/* Function Name:
* rtk_igmp_robustness_get
* Description:
* get IGMP/MLD Robustness value
* Input:
* None
* Output:
* pRobustness - Robustness value.
* Return:
* RT_ERR_OK - OK
* RT_ERR_NULL_POINTER - Null pointer
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
*/
extern rtk_api_ret_t rtk_igmp_robustness_get(rtk_uint32 *pRobustness);
/* Function Name:
* rtk_igmp_dynamicRouterRortAllow_set
* Description:
* Configure dynamic router port allow option
* Input:
* pPortmask - Dynamic Port allow mask
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_MASK - Error parameter
* Note:
*
*/
extern rtk_api_ret_t rtk_igmp_dynamicRouterPortAllow_set(rtk_portmask_t *pPortmask);
/* Function Name:
* rtk_igmp_dynamicRouterRortAllow_get
* Description:
* Get dynamic router port allow option
* Input:
* None.
* Output:
* pPortmask - Dynamic Port allow mask
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_MASK - Error parameter
* Note:
*
*/
extern rtk_api_ret_t rtk_igmp_dynamicRouterPortAllow_get(rtk_portmask_t *pPortmask);
/* Function Name:
* rtk_igmp_dynamicRouterPort_get
* Description:
* Get dynamic router port
* Input:
* None.
* Output:
* pDynamicRouterPort - Dynamic Router Port
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_NULL_POINTER - Null pointer
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_MASK - Error parameter
* Note:
*
*/
extern rtk_api_ret_t rtk_igmp_dynamicRouterPort_get(rtk_igmp_dynamicRouterPort_t *pDynamicRouterPort);
/* Function Name:
* rtk_igmp_suppressionEnable_set
* Description:
* Configure IGMPv1/v2 & MLDv1 Report/Leave/Done suppression
* Input:
* reportSuppression - Report suppression
* leaveSuppression - Leave suppression
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error Input
* Note:
*
*/
extern rtk_api_ret_t rtk_igmp_suppressionEnable_set(rtk_enable_t reportSuppression, rtk_enable_t leaveSuppression);
/* Function Name:
* rtk_igmp_suppressionEnable_get
* Description:
* Get IGMPv1/v2 & MLDv1 Report/Leave/Done suppression
* Input:
* None
* Output:
* pReportSuppression - Report suppression
* pLeaveSuppression - Leave suppression
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_NULL_POINTER - Null pointer
* Note:
*
*/
extern rtk_api_ret_t rtk_igmp_suppressionEnable_get(rtk_enable_t *pReportSuppression, rtk_enable_t *pLeaveSuppression);
/* Function Name:
* rtk_igmp_portRxPktEnable_set
* Description:
* Configure IGMP/MLD RX Packet configuration
* Input:
* port - Port ID
* pRxCfg - RX Packet Configuration
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error Input
* RT_ERR_NULL_POINTER - Null pointer
* Note:
*
*/
extern rtk_api_ret_t rtk_igmp_portRxPktEnable_set(rtk_port_t port, rtk_igmp_rxPktEnable_t *pRxCfg);
/* Function Name:
* rtk_igmp_portRxPktEnable_get
* Description:
* Get IGMP/MLD RX Packet configuration
* Input:
* port - Port ID
* pRxCfg - RX Packet Configuration
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error Input
* RT_ERR_NULL_POINTER - Null pointer
* Note:
*
*/
extern rtk_api_ret_t rtk_igmp_portRxPktEnable_get(rtk_port_t port, rtk_igmp_rxPktEnable_t *pRxCfg);
/* Function Name:
* rtk_igmp_groupInfo_get
* Description:
* Get IGMP/MLD Group database
* Input:
* indes - Index (0~255)
* Output:
* pGroup - Group database information.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error Input
* RT_ERR_NULL_POINTER - Null pointer
* Note:
*
*/
extern rtk_api_ret_t rtk_igmp_groupInfo_get(rtk_uint32 index, rtk_igmp_groupInfo_t *pGroup);
/* Function Name:
* rtk_igmp_ReportLeaveFwdAction_set
* Description:
* Set Report Leave packet forwarding action
* Input:
* action - Action
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error Input
* Note:
*
*/
extern rtk_api_ret_t rtk_igmp_ReportLeaveFwdAction_set(rtk_igmp_ReportLeaveFwdAct_t action);
/* Function Name:
* rtk_igmp_ReportLeaveFwdAction_get
* Description:
* Get Report Leave packet forwarding action
* Input:
* action - Action
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error Input
* RT_ERR_NULL_POINTER - Null Pointer
* Note:
*
*/
extern rtk_api_ret_t rtk_igmp_ReportLeaveFwdAction_get(rtk_igmp_ReportLeaveFwdAct_t *pAction);
/* Function Name:
* rtk_igmp_dropLeaveZeroEnable_set
* Description:
* Set the function of droppping Leave packet with group IP = 0.0.0.0
* Input:
* enabled - Action 1: drop, 0:pass
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error Input
* Note:
*
*/
extern rtk_api_ret_t rtk_igmp_dropLeaveZeroEnable_set(rtk_enable_t enabled);
/* Function Name:
* rtk_igmp_dropLeaveZeroEnable_get
* Description:
* Get the function of droppping Leave packet with group IP = 0.0.0.0
* Input:
* None
* Output:
* pEnabled. - Action 1: drop, 0:pass
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error Input
* RT_ERR_NULL_POINTER - Null Pointer
* Note:
*
*/
extern rtk_api_ret_t rtk_igmp_dropLeaveZeroEnable_get(rtk_enable_t *pEnabled);
/* Function Name:
* rtk_igmp_bypassGroupRange_set
* Description:
* Set Bypass group
* Input:
* group - bypassed group
* enabled - enabled 1: Bypassed, 0: not bypass
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error Input
* Note:
*
*/
extern rtk_api_ret_t rtk_igmp_bypassGroupRange_set(rtk_igmp_bypassGroup_t group, rtk_enable_t enabled);
/* Function Name:
* rtk_igmp_bypassGroupRange_get
* Description:
* get Bypass group
* Input:
* group - bypassed group
* Output:
* pEnable - enabled 1: Bypassed, 0: not bypass
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error Input
* RT_ERR_NULL_POINTER - Null Pointer
* Note:
*
*/
extern rtk_api_ret_t rtk_igmp_bypassGroupRange_get(rtk_igmp_bypassGroup_t group, rtk_enable_t *pEnable);
#endif /* __RTK_API_IGMP_H__ */

View file

@ -0,0 +1,254 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* Purpose : RTL8367/RTL8367C switch high-level API
*
* Feature : The file includes Interrupt module high-layer API defination
*
*/
#ifndef __RTK_API_INTERRUPT_H__
#define __RTK_API_INTERRUPT_H__
/*
* Data Type Declaration
*/
#define RTK_MAX_NUM_OF_INTERRUPT_TYPE 1
typedef struct rtk_int_status_s
{
rtk_uint16 value[RTK_MAX_NUM_OF_INTERRUPT_TYPE];
} rtk_int_status_t;
typedef struct rtk_int_info_s
{
rtk_portmask_t portMask;
rtk_uint32 meterMask;
rtk_uint32 systemLearnOver;
}rtk_int_info_t;
typedef enum rtk_int_type_e
{
INT_TYPE_LINK_STATUS = 0,
INT_TYPE_METER_EXCEED,
INT_TYPE_LEARN_LIMIT,
INT_TYPE_LINK_SPEED,
INT_TYPE_CONGEST,
INT_TYPE_GREEN_FEATURE,
INT_TYPE_LOOP_DETECT,
INT_TYPE_8051,
INT_TYPE_CABLE_DIAG,
INT_TYPE_ACL,
INT_TYPE_RESERVED, /* Unused */
INT_TYPE_SLIENT,
INT_TYPE_END
}rtk_int_type_t;
typedef enum rtk_int_advType_e
{
ADV_L2_LEARN_PORT_MASK = 0,
ADV_SPEED_CHANGE_PORT_MASK,
ADV_SPECIAL_CONGESTION_PORT_MASK,
ADV_PORT_LINKDOWN_PORT_MASK,
ADV_PORT_LINKUP_PORT_MASK,
ADV_METER_EXCEED_MASK,
ADV_RLDP_LOOPED,
ADV_RLDP_RELEASED,
ADV_END,
} rtk_int_advType_t;
typedef enum rtk_int_polarity_e
{
INT_POLAR_HIGH = 0,
INT_POLAR_LOW,
INT_POLAR_END
} rtk_int_polarity_t;
/* Function Name:
* rtk_int_polarity_set
* Description:
* Set interrupt polarity configuration.
* Input:
* type - Interruptpolarity type.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can set interrupt polarity configuration.
*/
extern rtk_api_ret_t rtk_int_polarity_set(rtk_int_polarity_t type);
/* Function Name:
* rtk_int_polarity_get
* Description:
* Get interrupt polarity configuration.
* Input:
* None
* Output:
* pType - Interruptpolarity type.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* The API can get interrupt polarity configuration.
*/
extern rtk_api_ret_t rtk_int_polarity_get(rtk_int_polarity_t *pType);
/* Function Name:
* rtk_int_control_set
* Description:
* Set interrupt trigger status configuration.
* Input:
* type - Interrupt type.
* enable - Interrupt status.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_ENABLE - Invalid enable input.
* Note:
* The API can set interrupt status configuration.
* The interrupt trigger status is shown in the following:
* - INT_TYPE_LINK_STATUS
* - INT_TYPE_METER_EXCEED
* - INT_TYPE_LEARN_LIMIT
* - INT_TYPE_LINK_SPEED
* - INT_TYPE_CONGEST
* - INT_TYPE_GREEN_FEATURE
* - INT_TYPE_LOOP_DETECT
* - INT_TYPE_8051,
* - INT_TYPE_CABLE_DIAG,
* - INT_TYPE_ACL,
* - INT_TYPE_SLIENT
*/
extern rtk_api_ret_t rtk_int_control_set(rtk_int_type_t type, rtk_enable_t enable);
/* Function Name:
* rtk_int_control_get
* Description:
* Get interrupt trigger status configuration.
* Input:
* type - Interrupt type.
* Output:
* pEnable - Interrupt status.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can get interrupt status configuration.
* The interrupt trigger status is shown in the following:
* - INT_TYPE_LINK_STATUS
* - INT_TYPE_METER_EXCEED
* - INT_TYPE_LEARN_LIMIT
* - INT_TYPE_LINK_SPEED
* - INT_TYPE_CONGEST
* - INT_TYPE_GREEN_FEATURE
* - INT_TYPE_LOOP_DETECT
* - INT_TYPE_8051,
* - INT_TYPE_CABLE_DIAG,
* - INT_TYPE_ACL,
* - INT_TYPE_SLIENT
*/
extern rtk_api_ret_t rtk_int_control_get(rtk_int_type_t type, rtk_enable_t* pEnable);
/* Function Name:
* rtk_int_status_set
* Description:
* Set interrupt trigger status to clean.
* Input:
* None
* Output:
* pStatusMask - Interrupt status bit mask.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can clean interrupt trigger status when interrupt happened.
* The interrupt trigger status is shown in the following:
* - INT_TYPE_LINK_STATUS (value[0] (Bit0))
* - INT_TYPE_METER_EXCEED (value[0] (Bit1))
* - INT_TYPE_LEARN_LIMIT (value[0] (Bit2))
* - INT_TYPE_LINK_SPEED (value[0] (Bit3))
* - INT_TYPE_CONGEST (value[0] (Bit4))
* - INT_TYPE_GREEN_FEATURE (value[0] (Bit5))
* - INT_TYPE_LOOP_DETECT (value[0] (Bit6))
* - INT_TYPE_8051 (value[0] (Bit7))
* - INT_TYPE_CABLE_DIAG (value[0] (Bit8))
* - INT_TYPE_ACL (value[0] (Bit9))
* - INT_TYPE_SLIENT (value[0] (Bit11))
* The status will be cleared after execute this API.
*/
extern rtk_api_ret_t rtk_int_status_set(rtk_int_status_t *pStatusMask);
/* Function Name:
* rtk_int_status_get
* Description:
* Get interrupt trigger status.
* Input:
* None
* Output:
* pStatusMask - Interrupt status bit mask.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can get interrupt trigger status when interrupt happened.
* The interrupt trigger status is shown in the following:
* - INT_TYPE_LINK_STATUS (value[0] (Bit0))
* - INT_TYPE_METER_EXCEED (value[0] (Bit1))
* - INT_TYPE_LEARN_LIMIT (value[0] (Bit2))
* - INT_TYPE_LINK_SPEED (value[0] (Bit3))
* - INT_TYPE_CONGEST (value[0] (Bit4))
* - INT_TYPE_GREEN_FEATURE (value[0] (Bit5))
* - INT_TYPE_LOOP_DETECT (value[0] (Bit6))
* - INT_TYPE_8051 (value[0] (Bit7))
* - INT_TYPE_CABLE_DIAG (value[0] (Bit8))
* - INT_TYPE_ACL (value[0] (Bit9))
* - INT_TYPE_SLIENT (value[0] (Bit11))
*
*/
extern rtk_api_ret_t rtk_int_status_get(rtk_int_status_t* pStatusMask);
/* Function Name:
* rtk_int_advanceInfo_get
* Description:
* Get interrupt advanced information.
* Input:
* adv_type - Advanced interrupt type.
* Output:
* info - Information per type.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* This API can get advanced information when interrupt happened.
* The status will be cleared after execute this API.
*/
extern rtk_api_ret_t rtk_int_advanceInfo_get(rtk_int_advType_t adv_type, rtk_int_info_t* info);
#endif /* __RTK_API_INTERRUPT_H__ */

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,371 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* Purpose : RTL8367/RTL8367C switch high-level API
*
* Feature : The file includes Leaky module high-layer API defination
*
*/
#ifndef __RTK_API_LEAKY_H__
#define __RTK_API_LEAKY_H__
typedef enum rtk_leaky_type_e
{
LEAKY_BRG_GROUP = 0,
LEAKY_FD_PAUSE,
LEAKY_SP_MCAST,
LEAKY_1X_PAE,
LEAKY_UNDEF_BRG_04,
LEAKY_UNDEF_BRG_05,
LEAKY_UNDEF_BRG_06,
LEAKY_UNDEF_BRG_07,
LEAKY_PROVIDER_BRIDGE_GROUP_ADDRESS,
LEAKY_UNDEF_BRG_09,
LEAKY_UNDEF_BRG_0A,
LEAKY_UNDEF_BRG_0B,
LEAKY_UNDEF_BRG_0C,
LEAKY_PROVIDER_BRIDGE_GVRP_ADDRESS,
LEAKY_8021AB,
LEAKY_UNDEF_BRG_0F,
LEAKY_BRG_MNGEMENT,
LEAKY_UNDEFINED_11,
LEAKY_UNDEFINED_12,
LEAKY_UNDEFINED_13,
LEAKY_UNDEFINED_14,
LEAKY_UNDEFINED_15,
LEAKY_UNDEFINED_16,
LEAKY_UNDEFINED_17,
LEAKY_UNDEFINED_18,
LEAKY_UNDEFINED_19,
LEAKY_UNDEFINED_1A,
LEAKY_UNDEFINED_1B,
LEAKY_UNDEFINED_1C,
LEAKY_UNDEFINED_1D,
LEAKY_UNDEFINED_1E,
LEAKY_UNDEFINED_1F,
LEAKY_GMRP,
LEAKY_GVRP,
LEAKY_UNDEF_GARP_22,
LEAKY_UNDEF_GARP_23,
LEAKY_UNDEF_GARP_24,
LEAKY_UNDEF_GARP_25,
LEAKY_UNDEF_GARP_26,
LEAKY_UNDEF_GARP_27,
LEAKY_UNDEF_GARP_28,
LEAKY_UNDEF_GARP_29,
LEAKY_UNDEF_GARP_2A,
LEAKY_UNDEF_GARP_2B,
LEAKY_UNDEF_GARP_2C,
LEAKY_UNDEF_GARP_2D,
LEAKY_UNDEF_GARP_2E,
LEAKY_UNDEF_GARP_2F,
LEAKY_IGMP,
LEAKY_IPMULTICAST,
LEAKY_CDP,
LEAKY_CSSTP,
LEAKY_LLDP,
LEAKY_END,
}rtk_leaky_type_t;
/* Function Name:
* rtk_leaky_vlan_set
* Description:
* Set VLAN leaky.
* Input:
* type - Packet type for VLAN leaky.
* enable - Leaky status.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_ENABLE - Invalid enable input
* Note:
* This API can set VLAN leaky for RMA ,IGMP/MLD, CDP, CSSTP, and LLDP packets.
* The leaky frame types are as following:
* - LEAKY_BRG_GROUP,
* - LEAKY_FD_PAUSE,
* - LEAKY_SP_MCAST,
* - LEAKY_1X_PAE,
* - LEAKY_UNDEF_BRG_04,
* - LEAKY_UNDEF_BRG_05,
* - LEAKY_UNDEF_BRG_06,
* - LEAKY_UNDEF_BRG_07,
* - LEAKY_PROVIDER_BRIDGE_GROUP_ADDRESS,
* - LEAKY_UNDEF_BRG_09,
* - LEAKY_UNDEF_BRG_0A,
* - LEAKY_UNDEF_BRG_0B,
* - LEAKY_UNDEF_BRG_0C,
* - LEAKY_PROVIDER_BRIDGE_GVRP_ADDRESS,
* - LEAKY_8021AB,
* - LEAKY_UNDEF_BRG_0F,
* - LEAKY_BRG_MNGEMENT,
* - LEAKY_UNDEFINED_11,
* - LEAKY_UNDEFINED_12,
* - LEAKY_UNDEFINED_13,
* - LEAKY_UNDEFINED_14,
* - LEAKY_UNDEFINED_15,
* - LEAKY_UNDEFINED_16,
* - LEAKY_UNDEFINED_17,
* - LEAKY_UNDEFINED_18,
* - LEAKY_UNDEFINED_19,
* - LEAKY_UNDEFINED_1A,
* - LEAKY_UNDEFINED_1B,
* - LEAKY_UNDEFINED_1C,
* - LEAKY_UNDEFINED_1D,
* - LEAKY_UNDEFINED_1E,
* - LEAKY_UNDEFINED_1F,
* - LEAKY_GMRP,
* - LEAKY_GVRP,
* - LEAKY_UNDEF_GARP_22,
* - LEAKY_UNDEF_GARP_23,
* - LEAKY_UNDEF_GARP_24,
* - LEAKY_UNDEF_GARP_25,
* - LEAKY_UNDEF_GARP_26,
* - LEAKY_UNDEF_GARP_27,
* - LEAKY_UNDEF_GARP_28,
* - LEAKY_UNDEF_GARP_29,
* - LEAKY_UNDEF_GARP_2A,
* - LEAKY_UNDEF_GARP_2B,
* - LEAKY_UNDEF_GARP_2C,
* - LEAKY_UNDEF_GARP_2D,
* - LEAKY_UNDEF_GARP_2E,
* - LEAKY_UNDEF_GARP_2F,
* - LEAKY_IGMP,
* - LEAKY_IPMULTICAST.
* - LEAKY_CDP,
* - LEAKY_CSSTP,
* - LEAKY_LLDP.
*/
extern rtk_api_ret_t rtk_leaky_vlan_set(rtk_leaky_type_t type, rtk_enable_t enable);
/* Function Name:
* rtk_leaky_vlan_get
* Description:
* Get VLAN leaky.
* Input:
* type - Packet type for VLAN leaky.
* Output:
* pEnable - Leaky status.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* This API can get VLAN leaky status for RMA ,IGMP/MLD, CDP, CSSTP, and LLDP packets.
* The leaky frame types are as following:
* - LEAKY_BRG_GROUP,
* - LEAKY_FD_PAUSE,
* - LEAKY_SP_MCAST,
* - LEAKY_1X_PAE,
* - LEAKY_UNDEF_BRG_04,
* - LEAKY_UNDEF_BRG_05,
* - LEAKY_UNDEF_BRG_06,
* - LEAKY_UNDEF_BRG_07,
* - LEAKY_PROVIDER_BRIDGE_GROUP_ADDRESS,
* - LEAKY_UNDEF_BRG_09,
* - LEAKY_UNDEF_BRG_0A,
* - LEAKY_UNDEF_BRG_0B,
* - LEAKY_UNDEF_BRG_0C,
* - LEAKY_PROVIDER_BRIDGE_GVRP_ADDRESS,
* - LEAKY_8021AB,
* - LEAKY_UNDEF_BRG_0F,
* - LEAKY_BRG_MNGEMENT,
* - LEAKY_UNDEFINED_11,
* - LEAKY_UNDEFINED_12,
* - LEAKY_UNDEFINED_13,
* - LEAKY_UNDEFINED_14,
* - LEAKY_UNDEFINED_15,
* - LEAKY_UNDEFINED_16,
* - LEAKY_UNDEFINED_17,
* - LEAKY_UNDEFINED_18,
* - LEAKY_UNDEFINED_19,
* - LEAKY_UNDEFINED_1A,
* - LEAKY_UNDEFINED_1B,
* - LEAKY_UNDEFINED_1C,
* - LEAKY_UNDEFINED_1D,
* - LEAKY_UNDEFINED_1E,
* - LEAKY_UNDEFINED_1F,
* - LEAKY_GMRP,
* - LEAKY_GVRP,
* - LEAKY_UNDEF_GARP_22,
* - LEAKY_UNDEF_GARP_23,
* - LEAKY_UNDEF_GARP_24,
* - LEAKY_UNDEF_GARP_25,
* - LEAKY_UNDEF_GARP_26,
* - LEAKY_UNDEF_GARP_27,
* - LEAKY_UNDEF_GARP_28,
* - LEAKY_UNDEF_GARP_29,
* - LEAKY_UNDEF_GARP_2A,
* - LEAKY_UNDEF_GARP_2B,
* - LEAKY_UNDEF_GARP_2C,
* - LEAKY_UNDEF_GARP_2D,
* - LEAKY_UNDEF_GARP_2E,
* - LEAKY_UNDEF_GARP_2F,
* - LEAKY_IGMP,
* - LEAKY_IPMULTICAST.
* - LEAKY_CDP,
* - LEAKY_CSSTP,
* - LEAKY_LLDP.
*/
extern rtk_api_ret_t rtk_leaky_vlan_get(rtk_leaky_type_t type, rtk_enable_t *pEnable);
/* Function Name:
* rtk_leaky_portIsolation_set
* Description:
* Set port isolation leaky.
* Input:
* type - Packet type for port isolation leaky.
* enable - Leaky status.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_ENABLE - Invalid enable input
* Note:
* This API can set port isolation leaky for RMA ,IGMP/MLD, CDP, CSSTP, and LLDP packets.
* The leaky frame types are as following:
* - LEAKY_BRG_GROUP,
* - LEAKY_FD_PAUSE,
* - LEAKY_SP_MCAST,
* - LEAKY_1X_PAE,
* - LEAKY_UNDEF_BRG_04,
* - LEAKY_UNDEF_BRG_05,
* - LEAKY_UNDEF_BRG_06,
* - LEAKY_UNDEF_BRG_07,
* - LEAKY_PROVIDER_BRIDGE_GROUP_ADDRESS,
* - LEAKY_UNDEF_BRG_09,
* - LEAKY_UNDEF_BRG_0A,
* - LEAKY_UNDEF_BRG_0B,
* - LEAKY_UNDEF_BRG_0C,
* - LEAKY_PROVIDER_BRIDGE_GVRP_ADDRESS,
* - LEAKY_8021AB,
* - LEAKY_UNDEF_BRG_0F,
* - LEAKY_BRG_MNGEMENT,
* - LEAKY_UNDEFINED_11,
* - LEAKY_UNDEFINED_12,
* - LEAKY_UNDEFINED_13,
* - LEAKY_UNDEFINED_14,
* - LEAKY_UNDEFINED_15,
* - LEAKY_UNDEFINED_16,
* - LEAKY_UNDEFINED_17,
* - LEAKY_UNDEFINED_18,
* - LEAKY_UNDEFINED_19,
* - LEAKY_UNDEFINED_1A,
* - LEAKY_UNDEFINED_1B,
* - LEAKY_UNDEFINED_1C,
* - LEAKY_UNDEFINED_1D,
* - LEAKY_UNDEFINED_1E,
* - LEAKY_UNDEFINED_1F,
* - LEAKY_GMRP,
* - LEAKY_GVRP,
* - LEAKY_UNDEF_GARP_22,
* - LEAKY_UNDEF_GARP_23,
* - LEAKY_UNDEF_GARP_24,
* - LEAKY_UNDEF_GARP_25,
* - LEAKY_UNDEF_GARP_26,
* - LEAKY_UNDEF_GARP_27,
* - LEAKY_UNDEF_GARP_28,
* - LEAKY_UNDEF_GARP_29,
* - LEAKY_UNDEF_GARP_2A,
* - LEAKY_UNDEF_GARP_2B,
* - LEAKY_UNDEF_GARP_2C,
* - LEAKY_UNDEF_GARP_2D,
* - LEAKY_UNDEF_GARP_2E,
* - LEAKY_UNDEF_GARP_2F,
* - LEAKY_IGMP,
* - LEAKY_IPMULTICAST.
* - LEAKY_CDP,
* - LEAKY_CSSTP,
* - LEAKY_LLDP.
*/
extern rtk_api_ret_t rtk_leaky_portIsolation_set(rtk_leaky_type_t type, rtk_enable_t enable);
/* Function Name:
* rtk_leaky_portIsolation_get
* Description:
* Get port isolation leaky.
* Input:
* type - Packet type for port isolation leaky.
* Output:
* pEnable - Leaky status.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* This API can get port isolation leaky status for RMA ,IGMP/MLD, CDP, CSSTP, and LLDP packets.
* The leaky frame types are as following:
* - LEAKY_BRG_GROUP,
* - LEAKY_FD_PAUSE,
* - LEAKY_SP_MCAST,
* - LEAKY_1X_PAE,
* - LEAKY_UNDEF_BRG_04,
* - LEAKY_UNDEF_BRG_05,
* - LEAKY_UNDEF_BRG_06,
* - LEAKY_UNDEF_BRG_07,
* - LEAKY_PROVIDER_BRIDGE_GROUP_ADDRESS,
* - LEAKY_UNDEF_BRG_09,
* - LEAKY_UNDEF_BRG_0A,
* - LEAKY_UNDEF_BRG_0B,
* - LEAKY_UNDEF_BRG_0C,
* - LEAKY_PROVIDER_BRIDGE_GVRP_ADDRESS,
* - LEAKY_8021AB,
* - LEAKY_UNDEF_BRG_0F,
* - LEAKY_BRG_MNGEMENT,
* - LEAKY_UNDEFINED_11,
* - LEAKY_UNDEFINED_12,
* - LEAKY_UNDEFINED_13,
* - LEAKY_UNDEFINED_14,
* - LEAKY_UNDEFINED_15,
* - LEAKY_UNDEFINED_16,
* - LEAKY_UNDEFINED_17,
* - LEAKY_UNDEFINED_18,
* - LEAKY_UNDEFINED_19,
* - LEAKY_UNDEFINED_1A,
* - LEAKY_UNDEFINED_1B,
* - LEAKY_UNDEFINED_1C,
* - LEAKY_UNDEFINED_1D,
* - LEAKY_UNDEFINED_1E,
* - LEAKY_UNDEFINED_1F,
* - LEAKY_GMRP,
* - LEAKY_GVRP,
* - LEAKY_UNDEF_GARP_22,
* - LEAKY_UNDEF_GARP_23,
* - LEAKY_UNDEF_GARP_24,
* - LEAKY_UNDEF_GARP_25,
* - LEAKY_UNDEF_GARP_26,
* - LEAKY_UNDEF_GARP_27,
* - LEAKY_UNDEF_GARP_28,
* - LEAKY_UNDEF_GARP_29,
* - LEAKY_UNDEF_GARP_2A,
* - LEAKY_UNDEF_GARP_2B,
* - LEAKY_UNDEF_GARP_2C,
* - LEAKY_UNDEF_GARP_2D,
* - LEAKY_UNDEF_GARP_2E,
* - LEAKY_UNDEF_GARP_2F,
* - LEAKY_IGMP,
* - LEAKY_IPMULTICAST.
* - LEAKY_CDP,
* - LEAKY_CSSTP,
* - LEAKY_LLDP.
*/
extern rtk_api_ret_t rtk_leaky_portIsolation_get(rtk_leaky_type_t type, rtk_enable_t *pEnable);
#endif /* __RTK_API_LEAKY_H__ */

View file

@ -0,0 +1,481 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* Purpose : RTL8367/RTL8367C switch high-level API
*
* Feature : The file includes LED module high-layer API defination
*
*/
#ifndef __RTK_API_LED_H__
#define __RTK_API_LED_H__
typedef enum rtk_led_operation_e
{
LED_OP_SCAN=0,
LED_OP_PARALLEL,
LED_OP_SERIAL,
LED_OP_END,
}rtk_led_operation_t;
typedef enum rtk_led_active_e
{
LED_ACTIVE_HIGH=0,
LED_ACTIVE_LOW,
LED_ACTIVE_END,
}rtk_led_active_t;
typedef enum rtk_led_config_e
{
LED_CONFIG_LEDOFF=0,
LED_CONFIG_DUPCOL,
LED_CONFIG_LINK_ACT,
LED_CONFIG_SPD1000,
LED_CONFIG_SPD100,
LED_CONFIG_SPD10,
LED_CONFIG_SPD1000ACT,
LED_CONFIG_SPD100ACT,
LED_CONFIG_SPD10ACT,
LED_CONFIG_SPD10010ACT,
LED_CONFIG_LOOPDETECT,
LED_CONFIG_EEE,
LED_CONFIG_LINKRX,
LED_CONFIG_LINKTX,
LED_CONFIG_MASTER,
LED_CONFIG_ACT,
LED_CONFIG_END,
}rtk_led_congig_t;
typedef struct rtk_led_ability_s
{
rtk_enable_t link_10m;
rtk_enable_t link_100m;
rtk_enable_t link_500m;
rtk_enable_t link_1000m;
rtk_enable_t act_rx;
rtk_enable_t act_tx;
}rtk_led_ability_t;
typedef enum rtk_led_blink_rate_e
{
LED_BLINKRATE_32MS=0,
LED_BLINKRATE_64MS,
LED_BLINKRATE_128MS,
LED_BLINKRATE_256MS,
LED_BLINKRATE_512MS,
LED_BLINKRATE_1024MS,
LED_BLINKRATE_48MS,
LED_BLINKRATE_96MS,
LED_BLINKRATE_END,
}rtk_led_blink_rate_t;
typedef enum rtk_led_group_e
{
LED_GROUP_0 = 0,
LED_GROUP_1,
LED_GROUP_2,
LED_GROUP_END
}rtk_led_group_t;
typedef enum rtk_led_force_mode_e
{
LED_FORCE_NORMAL=0,
LED_FORCE_BLINK,
LED_FORCE_OFF,
LED_FORCE_ON,
LED_FORCE_END
}rtk_led_force_mode_t;
typedef enum rtk_led_serialOutput_e
{
SERIAL_LED_NONE = 0,
SERIAL_LED_0,
SERIAL_LED_0_1,
SERIAL_LED_0_2,
SERIAL_LED_END,
}rtk_led_serialOutput_t;
/* Function Name:
* rtk_led_enable_set
* Description:
* Set Led enable congiuration
* Input:
* group - LED group id.
* pPortmask - LED enable port mask.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can be used to enable LED per port per group.
*/
extern rtk_api_ret_t rtk_led_enable_set(rtk_led_group_t group, rtk_portmask_t *pPortmask);
/* Function Name:
* rtk_led_enable_get
* Description:
* Get Led enable congiuration
* Input:
* group - LED group id.
* Output:
* pPortmask - LED enable port mask.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can be used to get LED enable status.
*/
extern rtk_api_ret_t rtk_led_enable_get(rtk_led_group_t group, rtk_portmask_t *pPortmask);
/* Function Name:
* rtk_led_operation_set
* Description:
* Set Led operation mode
* Input:
* mode - LED operation mode.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can set Led operation mode.
* The modes that can be set are as following:
* - LED_OP_SCAN,
* - LED_OP_PARALLEL,
* - LED_OP_SERIAL,
*/
extern rtk_api_ret_t rtk_led_operation_set(rtk_led_operation_t mode);
/* Function Name:
* rtk_led_operation_get
* Description:
* Get Led operation mode
* Input:
* None
* Output:
* pMode - Support LED operation mode.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can get Led operation mode.
* The modes that can be set are as following:
* - LED_OP_SCAN,
* - LED_OP_PARALLEL,
* - LED_OP_SERIAL,
*/
extern rtk_api_ret_t rtk_led_operation_get(rtk_led_operation_t *pMode);
/* Function Name:
* rtk_led_modeForce_set
* Description:
* Set Led group to congiuration force mode
* Input:
* port - port ID
* group - Support LED group id.
* mode - Support LED force mode.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Error Port ID
* Note:
* The API can force to one force mode.
* The force modes that can be set are as following:
* - LED_FORCE_NORMAL,
* - LED_FORCE_BLINK,
* - LED_FORCE_OFF,
* - LED_FORCE_ON.
*/
extern rtk_api_ret_t rtk_led_modeForce_set(rtk_port_t port, rtk_led_group_t group, rtk_led_force_mode_t mode);
/* Function Name:
* rtk_led_modeForce_get
* Description:
* Get Led group to congiuration force mode
* Input:
* port - port ID
* group - Support LED group id.
* pMode - Support LED force mode.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Error Port ID
* Note:
* The API can get forced Led group mode.
* The force modes that can be set are as following:
* - LED_FORCE_NORMAL,
* - LED_FORCE_BLINK,
* - LED_FORCE_OFF,
* - LED_FORCE_ON.
*/
extern rtk_api_ret_t rtk_led_modeForce_get(rtk_port_t port, rtk_led_group_t group, rtk_led_force_mode_t *pMode);
/* Function Name:
* rtk_led_blinkRate_set
* Description:
* Set LED blinking rate
* Input:
* blinkRate - blinking rate.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* ASIC support 6 types of LED blinking rates at 43ms, 84ms, 120ms, 170ms, 340ms and 670ms.
*/
extern rtk_api_ret_t rtk_led_blinkRate_set(rtk_led_blink_rate_t blinkRate);
/* Function Name:
* rtk_led_blinkRate_get
* Description:
* Get LED blinking rate at mode 0 to mode 3
* Input:
* None
* Output:
* pBlinkRate - blinking rate.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* There are 6 types of LED blinking rates at 43ms, 84ms, 120ms, 170ms, 340ms and 670ms.
*/
extern rtk_api_ret_t rtk_led_blinkRate_get(rtk_led_blink_rate_t *pBlinkRate);
/* Function Name:
* rtk_led_groupConfig_set
* Description:
* Set per group Led to congiuration mode
* Input:
* group - LED group.
* config - LED configuration
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can set LED indicated information configuration for each LED group with 1 to 1 led mapping to each port.
* - Definition LED Statuses Description
* - 0000 LED_Off LED pin Tri-State.
* - 0001 Dup/Col Collision, Full duplex Indicator.
* - 0010 Link/Act Link, Activity Indicator.
* - 0011 Spd1000 1000Mb/s Speed Indicator.
* - 0100 Spd100 100Mb/s Speed Indicator.
* - 0101 Spd10 10Mb/s Speed Indicator.
* - 0110 Spd1000/Act 1000Mb/s Speed/Activity Indicator.
* - 0111 Spd100/Act 100Mb/s Speed/Activity Indicator.
* - 1000 Spd10/Act 10Mb/s Speed/Activity Indicator.
* - 1001 Spd100 (10)/Act 10/100Mb/s Speed/Activity Indicator.
* - 1010 LoopDetect LoopDetect Indicator.
* - 1011 EEE EEE Indicator.
* - 1100 Link/Rx Link, Activity Indicator.
* - 1101 Link/Tx Link, Activity Indicator.
* - 1110 Master Link on Master Indicator.
* - 1111 Act Activity Indicator. Low for link established.
*/
extern rtk_api_ret_t rtk_led_groupConfig_set(rtk_led_group_t group, rtk_led_congig_t config);
/* Function Name:
* rtk_led_groupConfig_get
* Description:
* Get Led group congiuration mode
* Input:
* group - LED group.
* Output:
* pConfig - LED configuration.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can get LED indicated information configuration for each LED group.
*/
extern rtk_api_ret_t rtk_led_groupConfig_get(rtk_led_group_t group, rtk_led_congig_t *pConfig);
/* Function Name:
* rtk_led_groupAbility_set
* Description:
* Configure per group Led ability
* Input:
* group - LED group.
* pAbility - LED ability
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* None.
*/
extern rtk_api_ret_t rtk_led_groupAbility_set(rtk_led_group_t group, rtk_led_ability_t *pAbility);
/* Function Name:
* rtk_led_groupAbility_get
* Description:
* Get per group Led ability
* Input:
* group - LED group.
* pAbility - LED ability
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* None.
*/
extern rtk_api_ret_t rtk_led_groupAbility_get(rtk_led_group_t group, rtk_led_ability_t *pAbility);
/* Function Name:
* rtk_led_serialMode_set
* Description:
* Set Led serial mode active congiuration
* Input:
* active - LED group.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can set LED serial mode active congiuration.
*/
extern rtk_api_ret_t rtk_led_serialMode_set(rtk_led_active_t active);
/* Function Name:
* rtk_led_serialMode_get
* Description:
* Get Led group congiuration mode
* Input:
* group - LED group.
* Output:
* pConfig - LED configuration.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can get LED serial mode active configuration.
*/
extern rtk_api_ret_t rtk_led_serialMode_get(rtk_led_active_t *pActive);
/* Function Name:
* rtk_led_OutputEnable_set
* Description:
* This API set LED I/O state.
* Input:
* enabled - LED I/O state
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error parameter
* Note:
* This API set LED I/O state.
*/
extern rtk_api_ret_t rtk_led_OutputEnable_set(rtk_enable_t state);
/* Function Name:
* rtk_led_OutputEnable_get
* Description:
* This API get LED I/O state.
* Input:
* None.
* Output:
* pEnabled - LED I/O state
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error parameter
* Note:
* This API set current LED I/O state.
*/
extern rtk_api_ret_t rtk_led_OutputEnable_get(rtk_enable_t *pState);
/* Function Name:
* rtk_led_serialModePortmask_set
* Description:
* This API configure Serial LED output Group and portmask
* Input:
* output - output group
* pPortmask - output portmask
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error parameter
* Note:
* None.
*/
extern rtk_api_ret_t rtk_led_serialModePortmask_set(rtk_led_serialOutput_t output, rtk_portmask_t *pPortmask);
/* Function Name:
* rtk_led_serialModePortmask_get
* Description:
* This API get Serial LED output Group and portmask
* Input:
* None.
* Output:
* pOutput - output group
* pPortmask - output portmask
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error parameter
* Note:
* None.
*/
extern rtk_api_ret_t rtk_led_serialModePortmask_get(rtk_led_serialOutput_t *pOutput, rtk_portmask_t *pPortmask);
#endif /* __RTK_API_LED_H__ */

View file

@ -0,0 +1,272 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* Purpose : RTL8367/RTL8367C switch high-level API
*
* Feature : The file includes Mirror module high-layer API defination
*
*/
#ifndef __RTK_API_MIRROR_H__
#define __RTK_API_MIRROR_H__
typedef enum rtk_mirror_keep_e
{
MIRROR_FOLLOW_VLAN = 0,
MIRROR_KEEP_ORIGINAL,
MIRROR_KEEP_END
}rtk_mirror_keep_t;
/* Function Name:
* rtk_mirror_portBased_set
* Description:
* Set port mirror function.
* Input:
* mirroring_port - Monitor port.
* pMirrored_rx_portmask - Rx mirror port mask.
* pMirrored_tx_portmask - Tx mirror port mask.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* RT_ERR_PORT_MASK - Invalid portmask.
* Note:
* The API is to set mirror function of source port and mirror port.
* The mirror port can only be set to one port and the TX and RX mirror ports
* should be identical.
*/
extern rtk_api_ret_t rtk_mirror_portBased_set(rtk_port_t mirroring_port, rtk_portmask_t *pMirrored_rx_portmask, rtk_portmask_t *pMirrored_tx_portmask);
/* Function Name:
* rtk_mirror_portBased_get
* Description:
* Get port mirror function.
* Input:
* None
* Output:
* pMirroring_port - Monitor port.
* pMirrored_rx_portmask - Rx mirror port mask.
* pMirrored_tx_portmask - Tx mirror port mask.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API is to get mirror function of source port and mirror port.
*/
extern rtk_api_ret_t rtk_mirror_portBased_get(rtk_port_t* pMirroring_port, rtk_portmask_t *pMirrored_rx_portmask, rtk_portmask_t *pMirrored_tx_portmask);
/* Function Name:
* rtk_mirror_portIso_set
* Description:
* Set mirror port isolation.
* Input:
* enable |Mirror isolation status.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_ENABLE - Invalid enable input
* Note:
* The API is to set mirror isolation function that prevent normal forwarding packets to miror port.
*/
extern rtk_api_ret_t rtk_mirror_portIso_set(rtk_enable_t enable);
/* Function Name:
* rtk_mirror_portIso_get
* Description:
* Get mirror port isolation.
* Input:
* None
* Output:
* pEnable |Mirror isolation status.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API is to get mirror isolation status.
*/
extern rtk_api_ret_t rtk_mirror_portIso_get(rtk_enable_t *pEnable);
/* Function Name:
* rtk_mirror_vlanLeaky_set
* Description:
* Set mirror VLAN leaky.
* Input:
* txenable -TX leaky enable.
* rxenable - RX leaky enable.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_ENABLE - Invalid enable input
* Note:
* The API is to set mirror VLAN leaky function forwarding packets to miror port.
*/
extern rtk_api_ret_t rtk_mirror_vlanLeaky_set(rtk_enable_t txenable, rtk_enable_t rxenable);
/* Function Name:
* rtk_mirror_vlanLeaky_get
* Description:
* Get mirror VLAN leaky.
* Input:
* None
* Output:
* pTxenable - TX leaky enable.
* pRxenable - RX leaky enable.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API is to get mirror VLAN leaky status.
*/
extern rtk_api_ret_t rtk_mirror_vlanLeaky_get(rtk_enable_t *pTxenable, rtk_enable_t *pRxenable);
/* Function Name:
* rtk_mirror_isolationLeaky_set
* Description:
* Set mirror Isolation leaky.
* Input:
* txenable -TX leaky enable.
* rxenable - RX leaky enable.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_ENABLE - Invalid enable input
* Note:
* The API is to set mirror VLAN leaky function forwarding packets to miror port.
*/
extern rtk_api_ret_t rtk_mirror_isolationLeaky_set(rtk_enable_t txenable, rtk_enable_t rxenable);
/* Function Name:
* rtk_mirror_isolationLeaky_get
* Description:
* Get mirror isolation leaky.
* Input:
* None
* Output:
* pTxenable - TX leaky enable.
* pRxenable - RX leaky enable.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API is to get mirror isolation leaky status.
*/
extern rtk_api_ret_t rtk_mirror_isolationLeaky_get(rtk_enable_t *pTxenable, rtk_enable_t *pRxenable);
/* Function Name:
* rtk_mirror_keep_set
* Description:
* Set mirror packet format keep.
* Input:
* mode - -mirror keep mode.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_ENABLE - Invalid enable input
* Note:
* The API is to set -mirror keep mode.
* The mirror keep mode is as following:
* - MIRROR_FOLLOW_VLAN
* - MIRROR_KEEP_ORIGINAL
* - MIRROR_KEEP_END
*/
extern rtk_api_ret_t rtk_mirror_keep_set(rtk_mirror_keep_t mode);
/* Function Name:
* rtk_mirror_keep_get
* Description:
* Get mirror packet format keep.
* Input:
* None
* Output:
* pMode -mirror keep mode.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API is to get mirror keep mode.
* The mirror keep mode is as following:
* - MIRROR_FOLLOW_VLAN
* - MIRROR_KEEP_ORIGINAL
* - MIRROR_KEEP_END
*/
extern rtk_api_ret_t rtk_mirror_keep_get(rtk_mirror_keep_t *pMode);
/* Function Name:
* rtk_mirror_override_set
* Description:
* Set port mirror override function.
* Input:
* rxMirror - 1: output mirrored packet, 0: output normal forward packet
* txMirror - 1: output mirrored packet, 0: output normal forward packet
* aclMirror - 1: output mirrored packet, 0: output normal forward packet
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* The API is to set mirror override function.
* This function control the output format when a port output
* normal forward & mirrored packet at the same time.
*/
extern rtk_api_ret_t rtk_mirror_override_set(rtk_enable_t rxMirror, rtk_enable_t txMirror, rtk_enable_t aclMirror);
/* Function Name:
* rtk_mirror_override_get
* Description:
* Get port mirror override function.
* Input:
* None
* Output:
* pRxMirror - 1: output mirrored packet, 0: output normal forward packet
* pTxMirror - 1: output mirrored packet, 0: output normal forward packet
* pAclMirror - 1: output mirrored packet, 0: output normal forward packet
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_NULL_POINTER - Null Pointer
* Note:
* The API is to Get mirror override function.
* This function control the output format when a port output
* normal forward & mirrored packet at the same time.
*/
extern rtk_api_ret_t rtk_mirror_override_get(rtk_enable_t *pRxMirror, rtk_enable_t *pTxMirror, rtk_enable_t *pAclMirror);
#endif /* __RTK_API_MIRROR_H__ */

View file

@ -0,0 +1,188 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (, 08 2017) $
*
* Purpose : RTL8367/RTL8367C switch high-level API
*
* Feature : The file includes the following modules and sub-modules
* (1) OAM (802.3ah) configuration
*
*/
#ifndef __RTK_OAM_H__
#define __RTK_OAM_H__
/*
* Symbol Definition
*/
/*
* Data Declaration
*/
/*
* Macro Declaration
*/
typedef enum rtk_oam_parser_act_e
{
OAM_PARSER_ACTION_FORWARD = 0,
OAM_PARSER_ACTION_LOOPBACK,
OAM_PARSER_ACTION_DISCARD,
OAM_PARSER_ACTION_END,
} rtk_oam_parser_act_t;
typedef enum rtk_oam_multiplexer_act_e
{
OAM_MULTIPLEXER_ACTION_FORWARD = 0,
OAM_MULTIPLEXER_ACTION_DISCARD,
OAM_MULTIPLEXER_ACTION_CPUONLY,
OAM_MULTIPLEXER_ACTION_END,
} rtk_oam_multiplexer_act_t;
/*
* Function Declaration
*/
/* Function Name:
* rtk_oam_init
* Description:
* Initialize oam module.
* Input:
* None
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* Note:
* Must initialize oam module before calling any oam APIs.
*/
extern rtk_api_ret_t rtk_oam_init(void);
/* Function Name:
* rtk_oam_state_set
* Description:
* This API set OAM state.
* Input:
* enabled -OAMstate
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error parameter
* Note:
* This API set OAM state.
*/
extern rtk_api_ret_t rtk_oam_state_set(rtk_enable_t enabled);
/* Function Name:
* rtk_oam_state_get
* Description:
* This API get OAM state.
* Input:
* None.
* Output:
* pEnabled - H/W IGMP state
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error parameter
* Note:
* This API set current OAM state.
*/
extern rtk_api_ret_t rtk_oam_state_get(rtk_enable_t *pEnabled);
/* Module Name : OAM */
/* Function Name:
* rtk_oam_parserAction_set
* Description:
* Set OAM parser action
* Input:
* port - port id
* action - parser action
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT_ID - invalid port id
* Note:
* None
*/
extern rtk_api_ret_t rtk_oam_parserAction_set(rtk_port_t port, rtk_oam_parser_act_t action);
/* Function Name:
* rtk_oam_parserAction_set
* Description:
* Get OAM parser action
* Input:
* port - port id
* Output:
* pAction - parser action
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT_ID - invalid port id
* Note:
* None
*/
extern rtk_api_ret_t rtk_oam_parserAction_get(rtk_port_t port, rtk_oam_parser_act_t *pAction);
/* Function Name:
* rtk_oam_multiplexerAction_set
* Description:
* Set OAM multiplexer action
* Input:
* port - port id
* action - parser action
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT_ID - invalid port id
* Note:
* None
*/
extern rtk_api_ret_t rtk_oam_multiplexerAction_set(rtk_port_t port, rtk_oam_multiplexer_act_t action);
/* Function Name:
* rtk_oam_multiplexerAction_set
* Description:
* Get OAM multiplexer action
* Input:
* port - port id
* Output:
* pAction - parser action
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT_ID - invalid port id
* Note:
* None
*/
extern rtk_api_ret_t rtk_oam_multiplexerAction_get(rtk_port_t port, rtk_oam_multiplexer_act_t *pAction);
#endif /* __RTK_OAM_H__ */

View file

@ -0,0 +1,959 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* Purpose : RTL8367/RTL8367C switch high-level API
*
* Feature : The file includes port module high-layer API defination
*
*/
#ifndef __RTK_API_PORT_H__
#define __RTK_API_PORT_H__
/*
* Data Type Declaration
*/
#define PHY_CONTROL_REG 0
#define PHY_STATUS_REG 1
#define PHY_AN_ADVERTISEMENT_REG 4
#define PHY_AN_LINKPARTNER_REG 5
#define PHY_1000_BASET_CONTROL_REG 9
#define PHY_1000_BASET_STATUS_REG 10
#define PHY_RESOLVED_REG 26
#define RTK_EFID_MAX 0x7
#define RTK_FIBER_FORCE_1000M 3
#define RTK_FIBER_FORCE_100M 5
#define RTK_FIBER_FORCE_100M1000M 7
#define RTK_INDRECT_ACCESS_CRTL 0x1f00
#define RTK_INDRECT_ACCESS_STATUS 0x1f01
#define RTK_INDRECT_ACCESS_ADDRESS 0x1f02
#define RTK_INDRECT_ACCESS_WRITE_DATA 0x1f03
#define RTK_INDRECT_ACCESS_READ_DATA 0x1f04
#define RTK_INDRECT_ACCESS_DELAY 0x1f80
#define RTK_INDRECT_ACCESS_BURST 0x1f81
#define RTK_RW_MASK 0x2
#define RTK_CMD_MASK 0x1
#define RTK_PHY_BUSY_OFFSET 2
typedef enum rtk_mode_ext_e
{
MODE_EXT_DISABLE = 0,
MODE_EXT_RGMII,
MODE_EXT_MII_MAC,
MODE_EXT_MII_PHY,
MODE_EXT_TMII_MAC,
MODE_EXT_TMII_PHY,
MODE_EXT_GMII,
MODE_EXT_RMII_MAC,
MODE_EXT_RMII_PHY,
MODE_EXT_SGMII,
MODE_EXT_HSGMII,
MODE_EXT_1000X_100FX,
MODE_EXT_1000X,
MODE_EXT_100FX,
MODE_EXT_RGMII_2,
MODE_EXT_MII_MAC_2,
MODE_EXT_MII_PHY_2,
MODE_EXT_TMII_MAC_2,
MODE_EXT_TMII_PHY_2,
MODE_EXT_RMII_MAC_2,
MODE_EXT_RMII_PHY_2,
MODE_EXT_END
} rtk_mode_ext_t;
typedef enum rtk_port_duplex_e
{
PORT_HALF_DUPLEX = 0,
PORT_FULL_DUPLEX,
PORT_DUPLEX_END
} rtk_port_duplex_t;
typedef enum rtk_port_linkStatus_e
{
PORT_LINKDOWN = 0,
PORT_LINKUP,
PORT_LINKSTATUS_END
} rtk_port_linkStatus_t;
typedef struct rtk_port_mac_ability_s
{
rtk_uint32 forcemode;
rtk_uint32 speed;
rtk_uint32 duplex;
rtk_uint32 link;
rtk_uint32 nway;
rtk_uint32 txpause;
rtk_uint32 rxpause;
}rtk_port_mac_ability_t;
typedef struct rtk_port_phy_ability_s
{
rtk_uint32 AutoNegotiation; /*PHY register 0.12 setting for auto-negotiation process*/
rtk_uint32 Half_10; /*PHY register 4.5 setting for 10BASE-TX half duplex capable*/
rtk_uint32 Full_10; /*PHY register 4.6 setting for 10BASE-TX full duplex capable*/
rtk_uint32 Half_100; /*PHY register 4.7 setting for 100BASE-TX half duplex capable*/
rtk_uint32 Full_100; /*PHY register 4.8 setting for 100BASE-TX full duplex capable*/
rtk_uint32 Full_1000; /*PHY register 9.9 setting for 1000BASE-T full duplex capable*/
rtk_uint32 FC; /*PHY register 4.10 setting for flow control capability*/
rtk_uint32 AsyFC; /*PHY register 4.11 setting for asymmetric flow control capability*/
} rtk_port_phy_ability_t;
typedef rtk_uint32 rtk_port_phy_data_t; /* phy page */
typedef enum rtk_port_phy_mdix_mode_e
{
PHY_AUTO_CROSSOVER_MODE= 0,
PHY_FORCE_MDI_MODE,
PHY_FORCE_MDIX_MODE,
PHY_FORCE_MODE_END
} rtk_port_phy_mdix_mode_t;
typedef enum rtk_port_phy_mdix_status_e
{
PHY_STATUS_AUTO_MDI_MODE= 0,
PHY_STATUS_AUTO_MDIX_MODE,
PHY_STATUS_FORCE_MDI_MODE,
PHY_STATUS_FORCE_MDIX_MODE,
PHY_STATUS_FORCE_MODE_END
} rtk_port_phy_mdix_status_t;
typedef rtk_uint32 rtk_port_phy_page_t; /* phy page */
typedef enum rtk_port_phy_reg_e
{
PHY_REG_CONTROL = 0,
PHY_REG_STATUS,
PHY_REG_IDENTIFIER_1,
PHY_REG_IDENTIFIER_2,
PHY_REG_AN_ADVERTISEMENT,
PHY_REG_AN_LINKPARTNER,
PHY_REG_1000_BASET_CONTROL = 9,
PHY_REG_1000_BASET_STATUS,
PHY_REG_END = 32
} rtk_port_phy_reg_t;
typedef enum rtk_port_phy_test_mode_e
{
PHY_TEST_MODE_NORMAL= 0,
PHY_TEST_MODE_1,
PHY_TEST_MODE_2,
PHY_TEST_MODE_3,
PHY_TEST_MODE_4,
PHY_TEST_MODE_END
} rtk_port_phy_test_mode_t;
typedef enum rtk_port_speed_e
{
PORT_SPEED_10M = 0,
PORT_SPEED_100M,
PORT_SPEED_1000M,
PORT_SPEED_500M,
PORT_SPEED_2500M,
PORT_SPEED_END
} rtk_port_speed_t;
typedef enum rtk_port_media_e
{
PORT_MEDIA_COPPER = 0,
PORT_MEDIA_FIBER,
PORT_MEDIA_END
}rtk_port_media_t;
typedef struct rtk_rtctResult_s
{
rtk_port_speed_t linkType;
union
{
struct fe_result_s
{
rtk_uint32 isRxShort;
rtk_uint32 isTxShort;
rtk_uint32 isRxOpen;
rtk_uint32 isTxOpen;
rtk_uint32 isRxMismatch;
rtk_uint32 isTxMismatch;
rtk_uint32 isRxLinedriver;
rtk_uint32 isTxLinedriver;
rtk_uint32 rxLen;
rtk_uint32 txLen;
} fe_result;
struct ge_result_s
{
rtk_uint32 channelAShort;
rtk_uint32 channelBShort;
rtk_uint32 channelCShort;
rtk_uint32 channelDShort;
rtk_uint32 channelAOpen;
rtk_uint32 channelBOpen;
rtk_uint32 channelCOpen;
rtk_uint32 channelDOpen;
rtk_uint32 channelAMismatch;
rtk_uint32 channelBMismatch;
rtk_uint32 channelCMismatch;
rtk_uint32 channelDMismatch;
rtk_uint32 channelALinedriver;
rtk_uint32 channelBLinedriver;
rtk_uint32 channelCLinedriver;
rtk_uint32 channelDLinedriver;
rtk_uint32 channelALen;
rtk_uint32 channelBLen;
rtk_uint32 channelCLen;
rtk_uint32 channelDLen;
} ge_result;
}result;
} rtk_rtctResult_t;
/* Function Name:
* rtk_port_phyAutoNegoAbility_set
* Description:
* Set ethernet PHY auto-negotiation desired ability.
* Input:
* port - port id.
* pAbility - Ability structure
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_PHY_REG_ID - Invalid PHY address
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_BUSYWAIT_TIMEOUT - PHY access busy
* Note:
* If Full_1000 bit is set to 1, the AutoNegotiation will be automatic set to 1. While both AutoNegotiation and Full_1000 are set to 0, the PHY speed and duplex selection will
* be set as following 100F > 100H > 10F > 10H priority sequence.
*/
extern rtk_api_ret_t rtk_port_phyAutoNegoAbility_set(rtk_port_t port, rtk_port_phy_ability_t *pAbility);
/* Function Name:
* rtk_port_phyAutoNegoAbility_get
* Description:
* Get PHY ability through PHY registers.
* Input:
* port - Port id.
* Output:
* pAbility - Ability structure
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_PHY_REG_ID - Invalid PHY address
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_BUSYWAIT_TIMEOUT - PHY access busy
* Note:
* Get the capablity of specified PHY.
*/
extern rtk_api_ret_t rtk_port_phyAutoNegoAbility_get(rtk_port_t port, rtk_port_phy_ability_t *pAbility);
/* Function Name:
* rtk_port_phyForceModeAbility_set
* Description:
* Set the port speed/duplex mode/pause/asy_pause in the PHY force mode.
* Input:
* port - port id.
* pAbility - Ability structure
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_PHY_REG_ID - Invalid PHY address
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_BUSYWAIT_TIMEOUT - PHY access busy
* Note:
* While both AutoNegotiation and Full_1000 are set to 0, the PHY speed and duplex selection will
* be set as following 100F > 100H > 10F > 10H priority sequence.
*/
extern rtk_api_ret_t rtk_port_phyForceModeAbility_set(rtk_port_t port, rtk_port_phy_ability_t *pAbility);
/* Function Name:
* rtk_port_phyForceModeAbility_get
* Description:
* Get PHY ability through PHY registers.
* Input:
* port - Port id.
* Output:
* pAbility - Ability structure
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_PHY_REG_ID - Invalid PHY address
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_BUSYWAIT_TIMEOUT - PHY access busy
* Note:
* Get the capablity of specified PHY.
*/
extern rtk_api_ret_t rtk_port_phyForceModeAbility_get(rtk_port_t port, rtk_port_phy_ability_t *pAbility);
/* Function Name:
* rtk_port_phyStatus_get
* Description:
* Get ethernet PHY linking status
* Input:
* port - Port id.
* Output:
* linkStatus - PHY link status
* speed - PHY link speed
* duplex - PHY duplex mode
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_PHY_REG_ID - Invalid PHY address
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_BUSYWAIT_TIMEOUT - PHY access busy
* Note:
* API will return auto negotiation status of phy.
*/
extern rtk_api_ret_t rtk_port_phyStatus_get(rtk_port_t port, rtk_port_linkStatus_t *pLinkStatus, rtk_port_speed_t *pSpeed, rtk_port_duplex_t *pDuplex);
/* Function Name:
* rtk_port_macForceLink_set
* Description:
* Set port force linking configuration.
* Input:
* port - port id.
* pPortability - port ability configuration
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* This API can set Port/MAC force mode properties.
*/
extern rtk_api_ret_t rtk_port_macForceLink_set(rtk_port_t port, rtk_port_mac_ability_t *pPortability);
/* Function Name:
* rtk_port_macForceLink_get
* Description:
* Get port force linking configuration.
* Input:
* port - Port id.
* Output:
* pPortability - port ability configuration
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* This API can get Port/MAC force mode properties.
*/
extern rtk_api_ret_t rtk_port_macForceLink_get(rtk_port_t port, rtk_port_mac_ability_t *pPortability);
/* Function Name:
* rtk_port_macForceLinkExt_set
* Description:
* Set external interface force linking configuration.
* Input:
* port - external port ID
* mode - external interface mode
* pPortability - port ability configuration
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* This API can set external interface force mode properties.
* The external interface can be set to:
* - MODE_EXT_DISABLE,
* - MODE_EXT_RGMII,
* - MODE_EXT_MII_MAC,
* - MODE_EXT_MII_PHY,
* - MODE_EXT_TMII_MAC,
* - MODE_EXT_TMII_PHY,
* - MODE_EXT_GMII,
* - MODE_EXT_RMII_MAC,
* - MODE_EXT_RMII_PHY,
* - MODE_EXT_SGMII,
* - MODE_EXT_HSGMII,
* - MODE_EXT_1000X_100FX,
* - MODE_EXT_1000X,
* - MODE_EXT_100FX,
*/
extern rtk_api_ret_t rtk_port_macForceLinkExt_set(rtk_port_t port, rtk_mode_ext_t mode, rtk_port_mac_ability_t *pPortability);
/* Function Name:
* rtk_port_macForceLinkExt_get
* Description:
* Set external interface force linking configuration.
* Input:
* port - external port ID
* Output:
* pMode - external interface mode
* pPortability - port ability configuration
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* This API can get external interface force mode properties.
*/
extern rtk_api_ret_t rtk_port_macForceLinkExt_get(rtk_port_t port, rtk_mode_ext_t *pMode, rtk_port_mac_ability_t *pPortability);
/* Function Name:
* rtk_port_macStatus_get
* Description:
* Get port link status.
* Input:
* port - Port id.
* Output:
* pPortstatus - port ability configuration
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* This API can get Port/PHY properties.
*/
extern rtk_api_ret_t rtk_port_macStatus_get(rtk_port_t port, rtk_port_mac_ability_t *pPortstatus);
/* Function Name:
* rtk_port_macLocalLoopbackEnable_set
* Description:
* Set Port Local Loopback. (Redirect TX to RX.)
* Input:
* port - Port id.
* enable - Loopback state, 0:disable, 1:enable
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* This API can enable/disable Local loopback in MAC.
* For UTP port, This API will also enable the digital
* loopback bit in PHY register for sync of speed between
* PHY and MAC. For EXT port, users need to force the
* link state by themself.
*/
extern rtk_api_ret_t rtk_port_macLocalLoopbackEnable_set(rtk_port_t port, rtk_enable_t enable);
/* Function Name:
* rtk_port_macLocalLoopbackEnable_get
* Description:
* Get Port Local Loopback. (Redirect TX to RX.)
* Input:
* port - Port id.
* Output:
* pEnable - Loopback state, 0:disable, 1:enable
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* None.
*/
extern rtk_api_ret_t rtk_port_macLocalLoopbackEnable_get(rtk_port_t port, rtk_enable_t *pEnable);
/* Function Name:
* rtk_port_phyReg_set
* Description:
* Set PHY register data of the specific port.
* Input:
* port - port id.
* reg - Register id
* regData - Register data
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_PHY_REG_ID - Invalid PHY address
* RT_ERR_BUSYWAIT_TIMEOUT - PHY access busy
* Note:
* This API can set PHY register data of the specific port.
*/
extern rtk_api_ret_t rtk_port_phyReg_set(rtk_port_t port, rtk_port_phy_reg_t reg, rtk_port_phy_data_t value);
/* Function Name:
* rtk_port_phyReg_get
* Description:
* Get PHY register data of the specific port.
* Input:
* port - Port id.
* reg - Register id
* Output:
* pData - Register data
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_PHY_REG_ID - Invalid PHY address
* RT_ERR_BUSYWAIT_TIMEOUT - PHY access busy
* Note:
* This API can get PHY register data of the specific port.
*/
extern rtk_api_ret_t rtk_port_phyReg_get(rtk_port_t port, rtk_port_phy_reg_t reg, rtk_port_phy_data_t *pData);
/* Function Name:
* rtk_port_backpressureEnable_set
* Description:
* Set the half duplex backpressure enable status of the specific port.
* Input:
* port - port id.
* enable - Back pressure status.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_ENABLE - Invalid enable input.
* Note:
* This API can set the half duplex backpressure enable status of the specific port.
* The half duplex backpressure enable status of the port is as following:
* - DISABLE
* - ENABLE
*/
extern rtk_api_ret_t rtk_port_backpressureEnable_set(rtk_port_t port, rtk_enable_t enable);
/* Function Name:
* rtk_port_backpressureEnable_get
* Description:
* Get the half duplex backpressure enable status of the specific port.
* Input:
* port - Port id.
* Output:
* pEnable - Back pressure status.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* This API can get the half duplex backpressure enable status of the specific port.
* The half duplex backpressure enable status of the port is as following:
* - DISABLE
* - ENABLE
*/
extern rtk_api_ret_t rtk_port_backpressureEnable_get(rtk_port_t port, rtk_enable_t *pEnable);
/* Function Name:
* rtk_port_adminEnable_set
* Description:
* Set port admin configuration of the specific port.
* Input:
* port - port id.
* enable - Back pressure status.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_ENABLE - Invalid enable input.
* Note:
* This API can set port admin configuration of the specific port.
* The port admin configuration of the port is as following:
* - DISABLE
* - ENABLE
*/
extern rtk_api_ret_t rtk_port_adminEnable_set(rtk_port_t port, rtk_enable_t enable);
/* Function Name:
* rtk_port_adminEnable_get
* Description:
* Get port admin configurationof the specific port.
* Input:
* port - Port id.
* Output:
* pEnable - Back pressure status.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* This API can get port admin configuration of the specific port.
* The port admin configuration of the port is as following:
* - DISABLE
* - ENABLE
*/
extern rtk_api_ret_t rtk_port_adminEnable_get(rtk_port_t port, rtk_enable_t *pEnable);
/* Function Name:
* rtk_port_isolation_set
* Description:
* Set permitted port isolation portmask
* Input:
* port - port id.
* pPortmask - Permit port mask
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_PORT_MASK - Invalid portmask.
* Note:
* This API set the port mask that a port can trasmit packet to of each port
* A port can only transmit packet to ports included in permitted portmask
*/
extern rtk_api_ret_t rtk_port_isolation_set(rtk_port_t port, rtk_portmask_t *pPortmask);
/* Function Name:
* rtk_port_isolation_get
* Description:
* Get permitted port isolation portmask
* Input:
* port - Port id.
* Output:
* pPortmask - Permit port mask
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* This API get the port mask that a port can trasmit packet to of each port
* A port can only transmit packet to ports included in permitted portmask
*/
extern rtk_api_ret_t rtk_port_isolation_get(rtk_port_t port, rtk_portmask_t *pPortmask);
/* Function Name:
* rtk_port_rgmiiDelayExt_set
* Description:
* Set RGMII interface delay value for TX and RX.
* Input:
* txDelay - TX delay value, 1 for delay 2ns and 0 for no-delay
* rxDelay - RX delay value, 0~7 for delay setup.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* This API can set external interface 2 RGMII delay.
* In TX delay, there are 2 selection: no-delay and 2ns delay.
* In RX dekay, there are 8 steps for delay tunning. 0 for no-delay, and 7 for maximum delay.
*/
extern rtk_api_ret_t rtk_port_rgmiiDelayExt_set(rtk_port_t port, rtk_data_t txDelay, rtk_data_t rxDelay);
/* Function Name:
* rtk_port_rgmiiDelayExt_get
* Description:
* Get RGMII interface delay value for TX and RX.
* Input:
* None
* Output:
* pTxDelay - TX delay value
* pRxDelay - RX delay value
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* This API can set external interface 2 RGMII delay.
* In TX delay, there are 2 selection: no-delay and 2ns delay.
* In RX dekay, there are 8 steps for delay tunning. 0 for n0-delay, and 7 for maximum delay.
*/
extern rtk_api_ret_t rtk_port_rgmiiDelayExt_get(rtk_port_t port, rtk_data_t *pTxDelay, rtk_data_t *pRxDelay);
/* Function Name:
* rtk_port_phyEnableAll_set
* Description:
* Set all PHY enable status.
* Input:
* enable - PHY Enable State.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_ENABLE - Invalid enable input.
* Note:
* This API can set all PHY status.
* The configuration of all PHY is as following:
* - DISABLE
* - ENABLE
*/
extern rtk_api_ret_t rtk_port_phyEnableAll_set(rtk_enable_t enable);
/* Function Name:
* rtk_port_phyEnableAll_get
* Description:
* Get all PHY enable status.
* Input:
* None
* Output:
* pEnable - PHY Enable State.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* This API can set all PHY status.
* The configuration of all PHY is as following:
* - DISABLE
* - ENABLE
*/
extern rtk_api_ret_t rtk_port_phyEnableAll_get(rtk_enable_t *pEnable);
/* Function Name:
* rtk_port_efid_set
* Description:
* Set port-based enhanced filtering database
* Input:
* port - Port id.
* efid - Specified enhanced filtering database.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_L2_FID - Invalid fid.
* RT_ERR_INPUT - Invalid input parameter.
* RT_ERR_PORT_ID - Invalid port ID.
* Note:
* The API can set port-based enhanced filtering database.
*/
extern rtk_api_ret_t rtk_port_efid_set(rtk_port_t port, rtk_data_t efid);
/* Function Name:
* rtk_port_efid_get
* Description:
* Get port-based enhanced filtering database
* Input:
* port - Port id.
* Output:
* pEfid - Specified enhanced filtering database.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Invalid port ID.
* Note:
* The API can get port-based enhanced filtering database status.
*/
extern rtk_api_ret_t rtk_port_efid_get(rtk_port_t port, rtk_data_t *pEfid);
/* Function Name:
* rtk_port_phyComboPortMedia_set
* Description:
* Set Combo port media type
* Input:
* port - Port id. (Should be Port 4)
* media - Media (COPPER or FIBER)
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Invalid port ID.
* Note:
* The API can Set Combo port media type.
*/
extern rtk_api_ret_t rtk_port_phyComboPortMedia_set(rtk_port_t port, rtk_port_media_t media);
/* Function Name:
* rtk_port_phyComboPortMedia_get
* Description:
* Get Combo port media type
* Input:
* port - Port id. (Should be Port 4)
* Output:
* pMedia - Media (COPPER or FIBER)
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Invalid port ID.
* Note:
* The API can Set Combo port media type.
*/
extern rtk_api_ret_t rtk_port_phyComboPortMedia_get(rtk_port_t port, rtk_port_media_t *pMedia);
/* Function Name:
* rtk_port_rtctEnable_set
* Description:
* Enable RTCT test
* Input:
* pPortmask - Port mask of RTCT enabled port
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_MASK - Invalid port mask.
* Note:
* The API can enable RTCT Test
*/
extern rtk_api_ret_t rtk_port_rtctEnable_set(rtk_portmask_t *pPortmask);
/* Function Name:
* rtk_port_rtctDisable_set
* Description:
* Disable RTCT test
* Input:
* pPortmask - Port mask of RTCT disabled port
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_MASK - Invalid port mask.
* Note:
* The API can disable RTCT Test
*/
rtk_api_ret_t rtk_port_rtctDisable_set(rtk_portmask_t *pPortmask);
/* Function Name:
* rtk_port_rtctResult_get
* Description:
* Get the result of RTCT test
* Input:
* port - Port ID
* Output:
* pRtctResult - The result of RTCT result
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port ID.
* RT_ERR_PHY_RTCT_NOT_FINISH - Testing does not finish.
* Note:
* The API can get RTCT test result.
* RTCT test may takes 4.8 seconds to finish its test at most.
* Thus, if this API return RT_ERR_PHY_RTCT_NOT_FINISH or
* other error code, the result can not be referenced and
* user should call this API again until this API returns
* a RT_ERR_OK.
* The result is stored at pRtctResult->ge_result
* pRtctResult->linkType is unused.
* The unit of channel length is 2.5cm. Ex. 300 means 300 * 2.5 = 750cm = 7.5M
*/
extern rtk_api_ret_t rtk_port_rtctResult_get(rtk_port_t port, rtk_rtctResult_t *pRtctResult);
/* Function Name:
* rtk_port_sds_reset
* Description:
* Reset Serdes
* Input:
* port - Port ID
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port ID.
* Note:
* The API can reset Serdes
*/
extern rtk_api_ret_t rtk_port_sds_reset(rtk_port_t port);
/* Function Name:
* rtk_port_sgmiiLinkStatus_get
* Description:
* Get SGMII status
* Input:
* port - Port ID
* Output:
* pSignalDetect - Signal detect
* pSync - Sync
* pLink - Link
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port ID.
* Note:
* The API can reset Serdes
*/
extern rtk_api_ret_t rtk_port_sgmiiLinkStatus_get(rtk_port_t port, rtk_data_t *pSignalDetect, rtk_data_t *pSync, rtk_port_linkStatus_t *pLink);
/* Function Name:
* rtk_port_sgmiiNway_set
* Description:
* Configure SGMII/HSGMII port Nway state
* Input:
* port - Port ID
* state - Nway state
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port ID.
* Note:
* The API configure SGMII/HSGMII port Nway state
*/
extern rtk_api_ret_t rtk_port_sgmiiNway_set(rtk_port_t port, rtk_enable_t state);
/* Function Name:
* rtk_port_sgmiiNway_get
* Description:
* Get SGMII/HSGMII port Nway state
* Input:
* port - Port ID
* Output:
* pState - Nway state
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port ID.
* Note:
* The API can get SGMII/HSGMII port Nway state
*/
extern rtk_api_ret_t rtk_port_sgmiiNway_get(rtk_port_t port, rtk_enable_t *pState);
#endif /* __RTK_API_PORT_H__ */

View file

@ -0,0 +1,511 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* Purpose : RTL8367/RTL8367C switch high-level API
*
* Feature : The file includes time module high-layer API defination
*
*/
#ifndef __RTK_API_PTP_H__
#define __RTK_API_PTP_H__
/*
* Symbol Definition
*/
#define RTK_MAX_NUM_OF_NANO_SECOND 0x3B9AC9FF
#define RTK_PTP_INTR_MASK 0xFF
#define RTK_MAX_NUM_OF_TPID 0xFFFF
/* Message Type */
typedef enum rtk_ptp_msgType_e
{
PTP_MSG_TYPE_TX_SYNC = 0,
PTP_MSG_TYPE_TX_DELAY_REQ,
PTP_MSG_TYPE_TX_PDELAY_REQ,
PTP_MSG_TYPE_TX_PDELAY_RESP,
PTP_MSG_TYPE_RX_SYNC,
PTP_MSG_TYPE_RX_DELAY_REQ,
PTP_MSG_TYPE_RX_PDELAY_REQ,
PTP_MSG_TYPE_RX_PDELAY_RESP,
PTP_MSG_TYPE_END
} rtk_ptp_msgType_t;
typedef enum rtk_ptp_intType_e
{
PTP_INT_TYPE_TX_SYNC = 0,
PTP_INT_TYPE_TX_DELAY_REQ,
PTP_INT_TYPE_TX_PDELAY_REQ,
PTP_INT_TYPE_TX_PDELAY_RESP,
PTP_INT_TYPE_RX_SYNC,
PTP_INT_TYPE_RX_DELAY_REQ,
PTP_INT_TYPE_RX_PDELAY_REQ,
PTP_INT_TYPE_RX_PDELAY_RESP,
PTP_INT_TYPE_ALL,
PTP_INT_TYPE_END
}rtk_ptp_intType_t;
typedef enum rtk_ptp_sys_adjust_e
{
SYS_ADJUST_PLUS = 0,
SYS_ADJUST_MINUS,
SYS_ADJUST_END
} rtk_ptp_sys_adjust_t;
/* Reference Time */
typedef struct rtk_ptp_timeStamp_s
{
rtk_uint32 sec;
rtk_uint32 nsec;
} rtk_ptp_timeStamp_t;
typedef struct rtk_ptp_info_s
{
rtk_uint32 sequenceId;
rtk_ptp_timeStamp_t timeStamp;
} rtk_ptp_info_t;
typedef rtk_uint32 rtk_ptp_tpid_t;
typedef rtk_uint32 rtk_ptp_intStatus_t; /* interrupt status mask */
/*
* Data Declaration
*/
/*
* Function Declaration
*/
/* Function Name:
* rtk_time_init
* Description:
* PTP function initialization.
* Input:
* None
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* This API is used to initialize EEE status.
*/
extern rtk_api_ret_t rtk_ptp_init(void);
/* Function Name:
* rtk_ptp_mac_set
* Description:
* Configure PTP mac address.
* Input:
* mac - mac address to parser PTP packets.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameter.
* Note:
* None
*/
extern rtk_api_ret_t rtk_ptp_mac_set(rtk_mac_t mac);
/* Function Name:
* rtk_ptp_mac_get
* Description:
* Get PTP mac address.
* Input:
* None
* Output:
* pMac - mac address to parser PTP packets.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameter.
* Note:
* None
*/
extern rtk_api_ret_t rtk_ptp_mac_get(rtk_mac_t *pMac);
/* Function Name:
* rtk_ptp_tpid_set
* Description:
* Configure PTP accepted outer & inner tag TPID.
* Input:
* outerId - Ether type of S-tag frame parsing in PTP ports.
* innerId - Ether type of C-tag frame parsing in PTP ports.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameter.
* Note:
* None
*/
extern rtk_api_ret_t rtk_ptp_tpid_set(rtk_ptp_tpid_t outerId, rtk_ptp_tpid_t innerId);
/* Function Name:
* rtk_ptp_tpid_get
* Description:
* Get PTP accepted outer & inner tag TPID.
* Input:
* None
* Output:
* pOuterId - Ether type of S-tag frame parsing in PTP ports.
* pInnerId - Ether type of C-tag frame parsing in PTP ports.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
extern rtk_api_ret_t rtk_ptp_tpid_get(rtk_ptp_tpid_t *pOuterId, rtk_ptp_tpid_t *pInnerId);
/* Function Name:
* rtk_ptp_refTime_set
* Description:
* Set the reference time of the specified device.
* Input:
* timeStamp - reference timestamp value
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_INPUT - invalid input parameter
* Applicable:
* 8390, 8380
* Note:
* None
*/
extern rtk_api_ret_t rtk_ptp_refTime_set(rtk_ptp_timeStamp_t timeStamp);
/* Function Name:
* rtk_ptp_refTime_get
* Description:
* Get the reference time of the specified device.
* Input:
* Output:
* pTimeStamp - pointer buffer of the reference time
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_UNIT_ID - invalid unit id
* RT_ERR_NOT_INIT - The module is not initial
* RT_ERR_NULL_POINTER - input parameter may be null pointer
* Applicable:
* 8390, 8380
* Note:
* None
*/
extern rtk_api_ret_t rtk_ptp_refTime_get(rtk_ptp_timeStamp_t *pTimeStamp);
/* Function Name:
* rtk_ptp_refTimeAdjust_set
* Description:
* Adjust the reference time.
* Input:
* unit - unit id
* sign - significant
* timeStamp - reference timestamp value
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_UNIT_ID - invalid unit id
* RT_ERR_NOT_INIT - The module is not initial
* RT_ERR_INPUT - invalid input parameter
* Note:
* sign=0 for positive adjustment, sign=1 for negative adjustment.
*/
extern rtk_api_ret_t rtk_ptp_refTimeAdjust_set(rtk_ptp_sys_adjust_t sign, rtk_ptp_timeStamp_t timeStamp);
/* Function Name:
* rtk_ptp_refTimeEnable_set
* Description:
* Set the enable state of reference time of the specified device.
* Input:
* enable - status
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_INPUT - invalid input parameter
* Note:
* None
*/
extern rtk_api_ret_t rtk_ptp_refTimeEnable_set(rtk_enable_t enable);
/* Function Name:
* rtk_ptp_refTimeEnable_get
* Description:
* Get the enable state of reference time of the specified device.
* Input:
* Output:
* pEnable - status
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_UNIT_ID - invalid unit id
* RT_ERR_NOT_INIT - The module is not initial
* RT_ERR_NULL_POINTER - input parameter may be null pointer
* Applicable:
* 8390, 8380
* Note:
* None
*/
extern rtk_api_ret_t rtk_ptp_refTimeEnable_get(rtk_enable_t *pEnable);
/* Function Name:
* rtk_ptp_portEnable_set
* Description:
* Set PTP status of the specified port.
* Input:
* port - port id
* enable - status
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT - invalid port id
* RT_ERR_INPUT - invalid input parameter
* Note:
* None
*/
extern rtk_api_ret_t rtk_ptp_portEnable_set(rtk_port_t port, rtk_enable_t enable);
/* Function Name:
* rtk_ptp_portEnable_get
* Description:
* Get PTP status of the specified port.
* Input:
* port - port id
* Output:
* pEnable - status
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT - invalid port id
* RT_ERR_NULL_POINTER - input parameter may be null pointer
* Note:
* None
*/
extern rtk_api_ret_t rtk_ptp_portEnable_get(rtk_port_t port, rtk_enable_t *pEnable);
/* Function Name:
* rtk_ptp_portTimestamp_get
* Description:
* Get PTP timstamp according to the PTP identifier on the dedicated port from the specified device.
* Input:
* unit - unit id
* port - port id
* type - PTP message type
* Output:
* pInfo - pointer buffer of sequence ID and timestamp
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT_ID - invalid port id
* RT_ERR_INPUT - invalid input parameter
* RT_ERR_NULL_POINTER - input parameter may be null pointer
* Applicable:
* 8390, 8380
* Note:
* None
*/
extern rtk_api_ret_t rtk_ptp_portTimestamp_get( rtk_port_t port, rtk_ptp_msgType_t type, rtk_ptp_info_t *pInfo);
/* Function Name:
* rtk_ptp_intControl_set
* Description:
* Set PTP interrupt trigger status configuration.
* Input:
* type - Interrupt type.
* enable - Interrupt status.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_ENABLE - Invalid enable input.
* Note:
* The API can set PTP interrupt status configuration.
* The interrupt trigger status is shown in the following:
* PTP_INT_TYPE_TX_SYNC = 0,
* PTP_INT_TYPE_TX_DELAY_REQ,
* PTP_INT_TYPE_TX_PDELAY_REQ,
* PTP_INT_TYPE_TX_PDELAY_RESP,
* PTP_INT_TYPE_RX_SYNC,
* PTP_INT_TYPE_RX_DELAY_REQ,
* PTP_INT_TYPE_RX_PDELAY_REQ,
* PTP_INT_TYPE_RX_PDELAY_RESP,
* PTP_INT_TYPE_ALL,
*/
extern rtk_api_ret_t rtk_ptp_intControl_set(rtk_ptp_intType_t type, rtk_enable_t enable);
/* Function Name:
* rtk_ptp_intControl_get
* Description:
* Get PTP interrupt trigger status configuration.
* Input:
* type - Interrupt type.
* Output:
* pEnable - Interrupt status.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can get interrupt status configuration.
* The interrupt trigger status is shown in the following:
* PTP_INT_TYPE_TX_SYNC = 0,
* PTP_INT_TYPE_TX_DELAY_REQ,
* PTP_INT_TYPE_TX_PDELAY_REQ,
* PTP_INT_TYPE_TX_PDELAY_RESP,
* PTP_INT_TYPE_RX_SYNC,
* PTP_INT_TYPE_RX_DELAY_REQ,
* PTP_INT_TYPE_RX_PDELAY_REQ,
* PTP_INT_TYPE_RX_PDELAY_RESP,
*/
extern rtk_api_ret_t rtk_ptp_intControl_get(rtk_ptp_intType_t type, rtk_enable_t *pEnable);
/* Function Name:
* rtk_ptp_intStatus_get
* Description:
* Get PTP port interrupt trigger status.
* Input:
* port - physical port
* Output:
* pStatusMask - Interrupt status bit mask.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can get interrupt trigger status when interrupt happened.
* The interrupt trigger status is shown in the following:
* - PORT 0 INT (value[0] (Bit0))
* - PORT 1 INT (value[0] (Bit1))
* - PORT 2 INT (value[0] (Bit2))
* - PORT 3 INT (value[0] (Bit3))
* - PORT 4 INT (value[0] (Bit4))
*
*/
extern rtk_api_ret_t rtk_ptp_intStatus_get(rtk_ptp_intStatus_t *pStatusMask);
/* Function Name:
* rtk_ptp_portIntStatus_set
* Description:
* Set PTP port interrupt trigger status to clean.
* Input:
* port - physical port
* statusMask - Interrupt status bit mask.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can clean interrupt trigger status when interrupt happened.
* The interrupt trigger status is shown in the following:
* - PTP_INT_TYPE_TX_SYNC (value[0] (Bit0))
* - PTP_INT_TYPE_TX_DELAY_REQ (value[0] (Bit1))
* - PTP_INT_TYPE_TX_PDELAY_REQ (value[0] (Bit2))
* - PTP_INT_TYPE_TX_PDELAY_RESP (value[0] (Bit3))
* - PTP_INT_TYPE_RX_SYNC (value[0] (Bit4))
* - PTP_INT_TYPE_RX_DELAY_REQ (value[0] (Bit5))
* - PTP_INT_TYPE_RX_PDELAY_REQ (value[0] (Bit6))
* - PTP_INT_TYPE_RX_PDELAY_RESP (value[0] (Bit7))
* The status will be cleared after execute this API.
*/
extern rtk_api_ret_t rtk_ptp_portIntStatus_set(rtk_port_t port, rtk_ptp_intStatus_t statusMask);
/* Function Name:
* rtk_ptp_portIntStatus_get
* Description:
* Get PTP port interrupt trigger status.
* Input:
* port - physical port
* Output:
* pStatusMask - Interrupt status bit mask.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can get interrupt trigger status when interrupt happened.
* The interrupt trigger status is shown in the following:
* - PTP_INT_TYPE_TX_SYNC (value[0] (Bit0))
* - PTP_INT_TYPE_TX_DELAY_REQ (value[0] (Bit1))
* - PTP_INT_TYPE_TX_PDELAY_REQ (value[0] (Bit2))
* - PTP_INT_TYPE_TX_PDELAY_RESP (value[0] (Bit3))
* - PTP_INT_TYPE_RX_SYNC (value[0] (Bit4))
* - PTP_INT_TYPE_RX_DELAY_REQ (value[0] (Bit5))
* - PTP_INT_TYPE_RX_PDELAY_REQ (value[0] (Bit6))
* - PTP_INT_TYPE_RX_PDELAY_RESP (value[0] (Bit7))
*
*/
extern rtk_api_ret_t rtk_ptp_portIntStatus_get(rtk_port_t port, rtk_ptp_intStatus_t *pStatusMask);
/* Function Name:
* rtk_ptp_portPtpTrap_set
* Description:
* Set PTP packet trap of the specified port.
* Input:
* port - port id
* enable - status
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT - invalid port id
* RT_ERR_INPUT - invalid input parameter
* Note:
* None
*/
extern rtk_api_ret_t rtk_ptp_portTrap_set(rtk_port_t port, rtk_enable_t enable);
/* Function Name:
* rtk_ptp_portPtpEnable_get
* Description:
* Get PTP packet trap of the specified port.
* Input:
* port - port id
* Output:
* pEnable - status
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT - invalid port id
* RT_ERR_NULL_POINTER - input parameter may be null pointer
* Note:
* None
*/
extern rtk_api_ret_t rtk_ptp_portTrap_get(rtk_port_t port, rtk_enable_t *pEnable);
#endif /* __RTK_API_PTP_H__ */

View file

@ -0,0 +1,781 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* Purpose : RTL8367/RTL8367C switch high-level API
*
* Feature : The file includes QoS module high-layer API defination
*
*/
#ifndef __RTK_API_QOS_H__
#define __RTK_API_QOS_H__
/*
* Data Type Declaration
*/
#define QOS_DEFAULT_TICK_PERIOD (19-1)
#define QOS_DEFAULT_BYTE_PER_TOKEN 34
#define QOS_DEFAULT_LK_THRESHOLD (34*3) /* Why use 0x400? */
#define QOS_DEFAULT_INGRESS_BANDWIDTH 0x3FFF /* 0x3FFF => unlimit */
#define QOS_DEFAULT_EGRESS_BANDWIDTH 0x3D08 /*( 0x3D08 + 1) * 64Kbps => 1Gbps*/
#define QOS_DEFAULT_PREIFP 1
#define QOS_DEFAULT_PACKET_USED_PAGES_FC 0x60
#define QOS_DEFAULT_PACKET_USED_FC_EN 0
#define QOS_DEFAULT_QUEUE_BASED_FC_EN 1
#define QOS_DEFAULT_PRIORITY_SELECT_PORT 8
#define QOS_DEFAULT_PRIORITY_SELECT_1Q 0
#define QOS_DEFAULT_PRIORITY_SELECT_ACL 0
#define QOS_DEFAULT_PRIORITY_SELECT_DSCP 0
#define QOS_DEFAULT_DSCP_MAPPING_PRIORITY 0
#define QOS_DEFAULT_1Q_REMARKING_ABILITY 0
#define QOS_DEFAULT_DSCP_REMARKING_ABILITY 0
#define QOS_DEFAULT_QUEUE_GAP 20
#define QOS_DEFAULT_QUEUE_NO_MAX 6
#define QOS_DEFAULT_AVERAGE_PACKET_RATE 0x3FFF
#define QOS_DEFAULT_BURST_SIZE_IN_APR 0x3F
#define QOS_DEFAULT_PEAK_PACKET_RATE 2
#define QOS_DEFAULT_SCHEDULER_ABILITY_APR 1 /*disable*/
#define QOS_DEFAULT_SCHEDULER_ABILITY_PPR 1 /*disable*/
#define QOS_DEFAULT_SCHEDULER_ABILITY_WFQ 1 /*disable*/
#define QOS_WEIGHT_MAX 127
#define RTK_MAX_NUM_OF_PRIORITY 8
#define RTK_MAX_NUM_OF_QUEUE 8
#define RTK_PRIMAX 7
#define RTK_QIDMAX 7
#define RTK_DSCPMAX 63
/* enum Priority Selection Index */
typedef enum rtk_qos_priDecTbl_e
{
PRIDECTBL_IDX0 = 0,
PRIDECTBL_IDX1,
PRIDECTBL_END,
}rtk_qos_priDecTbl_t;
/* Types of 802.1p remarking source */
typedef enum rtk_qos_1pRmkSrc_e
{
DOT1P_RMK_SRC_USER_PRI,
DOT1P_RMK_SRC_TAG_PRI,
DOT1P_RMK_SRC_END
} rtk_qos_1pRmkSrc_t;
/* Types of DSCP remarking source */
typedef enum rtk_qos_dscpRmkSrc_e
{
DSCP_RMK_SRC_INT_PRI,
DSCP_RMK_SRC_DSCP,
DSCP_RMK_SRC_USER_PRI,
DSCP_RMK_SRC_END
} rtk_qos_dscpRmkSrc_t;
typedef struct rtk_priority_select_s
{
rtk_uint32 port_pri;
rtk_uint32 dot1q_pri;
rtk_uint32 acl_pri;
rtk_uint32 dscp_pri;
rtk_uint32 cvlan_pri;
rtk_uint32 svlan_pri;
rtk_uint32 dmac_pri;
rtk_uint32 smac_pri;
} rtk_priority_select_t;
typedef struct rtk_qos_pri2queue_s
{
rtk_uint32 pri2queue[RTK_MAX_NUM_OF_PRIORITY];
} rtk_qos_pri2queue_t;
typedef struct rtk_qos_queue_weights_s
{
rtk_uint32 weights[RTK_MAX_NUM_OF_QUEUE];
} rtk_qos_queue_weights_t;
typedef enum rtk_qos_scheduling_type_e
{
WFQ = 0, /* Weighted-Fair-Queue */
WRR, /* Weighted-Round-Robin */
SCHEDULING_TYPE_END
} rtk_qos_scheduling_type_t;
typedef rtk_uint32 rtk_queue_num_t; /* queue number*/
/* Function Name:
* rtk_qos_init
* Description:
* Configure Qos default settings with queue number assigment to each port.
* Input:
* queueNum - Queue number of each port.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_QUEUE_NUM - Invalid queue number.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* This API will initialize related Qos setting with queue number assigment.
* The queue number is from 1 to 8.
*/
extern rtk_api_ret_t rtk_qos_init(rtk_queue_num_t queueNum);
/* Function Name:
* rtk_qos_priSel_set
* Description:
* Configure the priority order among different priority mechanism.
* Input:
* index - Priority decision table index (0~1)
* pPriDec - Priority assign for port, dscp, 802.1p, cvlan, svlan, acl based priority decision.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_QOS_SEL_PRI_SOURCE - Invalid priority decision source parameter.
* Note:
* ASIC will follow user priority setting of mechanisms to select mapped queue priority for receiving frame.
* If two priority mechanisms are the same, the ASIC will chose the highest priority from mechanisms to
* assign queue priority to receiving frame.
* The priority sources are:
* - PRIDEC_PORT
* - PRIDEC_ACL
* - PRIDEC_DSCP
* - PRIDEC_1Q
* - PRIDEC_1AD
* - PRIDEC_CVLAN
* - PRIDEC_DA
* - PRIDEC_SA
*/
extern rtk_api_ret_t rtk_qos_priSel_set(rtk_qos_priDecTbl_t index, rtk_priority_select_t *pPriDec);
/* Function Name:
* rtk_qos_priSel_get
* Description:
* Get the priority order configuration among different priority mechanism.
* Input:
* index - Priority decision table index (0~1)
* Output:
* pPriDec - Priority assign for port, dscp, 802.1p, cvlan, svlan, acl based priority decision .
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* ASIC will follow user priority setting of mechanisms to select mapped queue priority for receiving frame.
* If two priority mechanisms are the same, the ASIC will chose the highest priority from mechanisms to
* assign queue priority to receiving frame.
* The priority sources are:
* - PRIDEC_PORT,
* - PRIDEC_ACL,
* - PRIDEC_DSCP,
* - PRIDEC_1Q,
* - PRIDEC_1AD,
* - PRIDEC_CVLAN,
* - PRIDEC_DA,
* - PRIDEC_SA,
*/
extern rtk_api_ret_t rtk_qos_priSel_get(rtk_qos_priDecTbl_t index, rtk_priority_select_t *pPriDec);
/* Function Name:
* rtk_qos_1pPriRemap_set
* Description:
* Configure 1Q priorities mapping to internal absolute priority.
* Input:
* dot1p_pri - 802.1p priority value.
* int_pri - internal priority value.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_VLAN_PRIORITY - Invalid 1p priority.
* RT_ERR_QOS_INT_PRIORITY - Invalid priority.
* Note:
* Priority of 802.1Q assignment for internal asic priority, and it is used for queue usage and packet scheduling.
*/
extern rtk_api_ret_t rtk_qos_1pPriRemap_set(rtk_pri_t dot1p_pri, rtk_pri_t int_pri);
/* Function Name:
* rtk_qos_1pPriRemap_get
* Description:
* Get 1Q priorities mapping to internal absolute priority.
* Input:
* dot1p_pri - 802.1p priority value .
* Output:
* pInt_pri - internal priority value.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_VLAN_PRIORITY - Invalid priority.
* RT_ERR_QOS_INT_PRIORITY - Invalid priority.
* Note:
* Priority of 802.1Q assigment for internal asic priority, and it is uesed for queue usage and packet scheduling.
*/
extern rtk_api_ret_t rtk_qos_1pPriRemap_get(rtk_pri_t dot1p_pri, rtk_pri_t *pInt_pri);
/* Function Name:
* rtk_qos_1pRemarkSrcSel_set
* Description:
* Set remarking source of 802.1p remarking.
* Input:
* type - remarking source
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_NOT_INIT - The module is not initial
* RT_ERR_PORT_ID - invalid port id
* RT_ERR_INPUT - invalid input parameter
* Note:
* The API can configure 802.1p remark functionality to map original 802.1p value or internal
* priority to TX DSCP value.
*/
extern rtk_api_ret_t rtk_qos_1pRemarkSrcSel_set(rtk_qos_1pRmkSrc_t type);
/* Function Name:
* rtk_qos_1pRemarkSrcSel_get
* Description:
* Get remarking source of 802.1p remarking.
* Input:
* none
* Output:
* pType - remarking source
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_NOT_INIT - The module is not initial
* RT_ERR_PORT_ID - invalid port id
* RT_ERR_INPUT - invalid input parameter
* RT_ERR_NULL_POINTER - input parameter may be null pointer
* Note:
* None
*/
extern rtk_api_ret_t rtk_qos_1pRemarkSrcSel_get(rtk_qos_1pRmkSrc_t *pType);
/* Function Name:
* rtk_qos_dscpPriRemap_set
* Description:
* Map dscp value to internal priority.
* Input:
* dscp - Dscp value of receiving frame
* int_pri - internal priority value .
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_QOS_DSCP_VALUE - Invalid DSCP value.
* RT_ERR_QOS_INT_PRIORITY - Invalid priority.
* Note:
* The Differentiated Service Code Point is a selector for router's per-hop behaviors. As a selector, there is no implication that a numerically
* greater DSCP implies a better network service. As can be seen, the DSCP totally overlaps the old precedence field of TOS. So if values of
* DSCP are carefully chosen then backward compatibility can be achieved.
*/
extern rtk_api_ret_t rtk_qos_dscpPriRemap_set(rtk_dscp_t dscp, rtk_pri_t int_pri);
/* Function Name:
* rtk_qos_dscpPriRemap_get
* Description:
* Get dscp value to internal priority.
* Input:
* dscp - Dscp value of receiving frame
* Output:
* pInt_pri - internal priority value.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_QOS_DSCP_VALUE - Invalid DSCP value.
* Note:
* The Differentiated Service Code Point is a selector for router's per-hop behaviors. As a selector, there is no implication that a numerically
* greater DSCP implies a better network service. As can be seen, the DSCP totally overlaps the old precedence field of TOS. So if values of
* DSCP are carefully chosen then backward compatibility can be achieved.
*/
extern rtk_api_ret_t rtk_qos_dscpPriRemap_get(rtk_dscp_t dscp, rtk_pri_t *pInt_pri);
/* Function Name:
* rtk_qos_portPri_set
* Description:
* Configure priority usage to each port.
* Input:
* port - Port id.
* int_pri - internal priority value.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_QOS_SEL_PORT_PRI - Invalid port priority.
* RT_ERR_QOS_INT_PRIORITY - Invalid priority.
* Note:
* The API can set priority of port assignments for queue usage and packet scheduling.
*/
extern rtk_api_ret_t rtk_qos_portPri_set(rtk_port_t port, rtk_pri_t int_pri) ;
/* Function Name:
* rtk_qos_portPri_get
* Description:
* Get priority usage to each port.
* Input:
* port - Port id.
* Output:
* pInt_pri - internal priority value.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can get priority of port assignments for queue usage and packet scheduling.
*/
extern rtk_api_ret_t rtk_qos_portPri_get(rtk_port_t port, rtk_pri_t *pInt_pri) ;
/* Function Name:
* rtk_qos_queueNum_set
* Description:
* Set output queue number for each port.
* Input:
* port - Port id.
* index - Mapping queue number (1~8)
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_QUEUE_NUM - Invalid queue number.
* Note:
* The API can set the output queue number of the specified port. The queue number is from 1 to 8.
*/
extern rtk_api_ret_t rtk_qos_queueNum_set(rtk_port_t port, rtk_queue_num_t queue_num);
/* Function Name:
* rtk_qos_queueNum_get
* Description:
* Get output queue number.
* Input:
* port - Port id.
* Output:
* pQueue_num - Mapping queue number
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* The API will return the output queue number of the specified port. The queue number is from 1 to 8.
*/
extern rtk_api_ret_t rtk_qos_queueNum_get(rtk_port_t port, rtk_queue_num_t *pQueue_num);
/* Function Name:
* rtk_qos_priMap_set
* Description:
* Set output queue number for each port.
* Input:
* queue_num - Queue number usage.
* pPri2qid - Priority mapping to queue ID.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_QUEUE_NUM - Invalid queue number.
* RT_ERR_QUEUE_ID - Invalid queue id.
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_QOS_INT_PRIORITY - Invalid priority.
* Note:
* ASIC supports priority mapping to queue with different queue number from 1 to 8.
* For different queue numbers usage, ASIC supports different internal available queue IDs.
*/
extern rtk_api_ret_t rtk_qos_priMap_set(rtk_queue_num_t queue_num, rtk_qos_pri2queue_t *pPri2qid);
/* Function Name:
* rtk_qos_priMap_get
* Description:
* Get priority to queue ID mapping table parameters.
* Input:
* queue_num - Queue number usage.
* Output:
* pPri2qid - Priority mapping to queue ID.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_QUEUE_NUM - Invalid queue number.
* Note:
* The API can return the mapping queue id of the specified priority and queue number.
* The queue number is from 1 to 8.
*/
extern rtk_api_ret_t rtk_qos_priMap_get(rtk_queue_num_t queue_num, rtk_qos_pri2queue_t *pPri2qid);
/* Function Name:
* rtk_qos_schedulingQueue_set
* Description:
* Set weight and type of queues in dedicated port.
* Input:
* port - Port id.
* pQweights - The array of weights for WRR/WFQ queue (0 for STRICT_PRIORITY queue).
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_QOS_QUEUE_WEIGHT - Invalid queue weight.
* Note:
* The API can set weight and type, strict priority or weight fair queue (WFQ) for
* dedicated port for using queues. If queue id is not included in queue usage,
* then its type and weight setting in dummy for setting. There are priorities
* as queue id in strict queues. It means strict queue id 5 carrying higher priority
* than strict queue id 4. The WFQ queue weight is from 1 to 128, and weight 0 is
* for strict priority queue type.
*/
extern rtk_api_ret_t rtk_qos_schedulingQueue_set(rtk_port_t port, rtk_qos_queue_weights_t *pQweights);
/* Function Name:
* rtk_qos_schedulingQueue_get
* Description:
* Get weight and type of queues in dedicated port.
* Input:
* port - Port id.
* Output:
* pQweights - The array of weights for WRR/WFQ queue (0 for STRICT_PRIORITY queue).
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* The API can get weight and type, strict priority or weight fair queue (WFQ) for dedicated port for using queues.
* The WFQ queue weight is from 1 to 128, and weight 0 is for strict priority queue type.
*/
extern rtk_api_ret_t rtk_qos_schedulingQueue_get(rtk_port_t port, rtk_qos_queue_weights_t *pQweights);
/* Function Name:
* rtk_qos_1pRemarkEnable_set
* Description:
* Set 1p Remarking state
* Input:
* port - Port id.
* enable - State of per-port 1p Remarking
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_ENABLE - Invalid enable parameter.
* Note:
* The API can enable or disable 802.1p remarking ability for whole system.
* The status of 802.1p remark:
* - DISABLED
* - ENABLED
*/
extern rtk_api_ret_t rtk_qos_1pRemarkEnable_set(rtk_port_t port, rtk_enable_t enable);
/* Function Name:
* rtk_qos_1pRemarkEnable_get
* Description:
* Get 802.1p remarking ability.
* Input:
* port - Port id.
* Output:
* pEnable - Status of 802.1p remark.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* The API can get 802.1p remarking ability.
* The status of 802.1p remark:
* - DISABLED
* - ENABLED
*/
extern rtk_api_ret_t rtk_qos_1pRemarkEnable_get(rtk_port_t port, rtk_enable_t *pEnable);
/* Function Name:
* rtk_qos_1pRemark_set
* Description:
* Set 802.1p remarking parameter.
* Input:
* int_pri - Internal priority value.
* dot1p_pri - 802.1p priority value.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_VLAN_PRIORITY - Invalid 1p priority.
* RT_ERR_QOS_INT_PRIORITY - Invalid priority.
* Note:
* The API can set 802.1p parameters source priority and new priority.
*/
extern rtk_api_ret_t rtk_qos_1pRemark_set(rtk_pri_t int_pri, rtk_pri_t dot1p_pri);
/* Function Name:
* rtk_qos_1pRemark_get
* Description:
* Get 802.1p remarking parameter.
* Input:
* int_pri - Internal priority value.
* Output:
* pDot1p_pri - 802.1p priority value.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_QOS_INT_PRIORITY - Invalid priority.
* Note:
* The API can get 802.1p remarking parameters. It would return new priority of ingress priority.
*/
extern rtk_api_ret_t rtk_qos_1pRemark_get(rtk_pri_t int_pri, rtk_pri_t *pDot1p_pri);
/* Function Name:
* rtk_qos_dscpRemarkEnable_set
* Description:
* Set DSCP remarking ability.
* Input:
* port - Port id.
* enable - status of DSCP remark.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_QOS_INT_PRIORITY - Invalid priority.
* RT_ERR_ENABLE - Invalid enable parameter.
* Note:
* The API can enable or disable DSCP remarking ability for whole system.
* The status of DSCP remark:
* - DISABLED
* - ENABLED
*/
extern rtk_api_ret_t rtk_qos_dscpRemarkEnable_set(rtk_port_t port, rtk_enable_t enable);
/* Function Name:
* rtk_qos_dscpRemarkEnable_get
* Description:
* Get DSCP remarking ability.
* Input:
* port - Port id.
* Output:
* pEnable - status of DSCP remarking.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* The API can get DSCP remarking ability.
* The status of DSCP remark:
* - DISABLED
* - ENABLED
*/
extern rtk_api_ret_t rtk_qos_dscpRemarkEnable_get(rtk_port_t port, rtk_enable_t *pEnable);
/* Function Name:
* rtk_qos_dscpRemark_set
* Description:
* Set DSCP remarking parameter.
* Input:
* int_pri - Internal priority value.
* dscp - DSCP value.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_QOS_INT_PRIORITY - Invalid priority.
* RT_ERR_QOS_DSCP_VALUE - Invalid DSCP value.
* Note:
* The API can set DSCP value and mapping priority.
*/
extern rtk_api_ret_t rtk_qos_dscpRemark_set(rtk_pri_t int_pri, rtk_dscp_t dscp);
/* Function Name:
* rtk_qos_dscpRemark_get
* Description:
* Get DSCP remarking parameter.
* Input:
* int_pri - Internal priority value.
* Output:
* Dscp - DSCP value.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_QOS_INT_PRIORITY - Invalid priority.
* Note:
* The API can get DSCP parameters. It would return DSCP value for mapping priority.
*/
extern rtk_api_ret_t rtk_qos_dscpRemark_get(rtk_pri_t int_pri, rtk_dscp_t *pDscp);
/* Function Name:
* rtk_qos_dscpRemarkSrcSel_set
* Description:
* Set remarking source of DSCP remarking.
* Input:
* type - remarking source
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_NOT_INIT - The module is not initial
* RT_ERR_PORT_ID - invalid port id
* RT_ERR_INPUT - invalid input parameter
* Note:
* The API can configure DSCP remark functionality to map original DSCP value or internal
* priority to TX DSCP value.
*/
extern rtk_api_ret_t rtk_qos_dscpRemarkSrcSel_set(rtk_qos_dscpRmkSrc_t type);
/* Function Name:
* rtk_qos_dcpRemarkSrcSel_get
* Description:
* Get remarking source of DSCP remarking.
* Input:
* none
* Output:
* pType - remarking source
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_NOT_INIT - The module is not initial
* RT_ERR_PORT_ID - invalid port id
* RT_ERR_INPUT - invalid input parameter
* RT_ERR_NULL_POINTER - input parameter may be null pointer
* Note:
* None
*/
extern rtk_api_ret_t rtk_qos_dscpRemarkSrcSel_get(rtk_qos_dscpRmkSrc_t *pType);
/* Function Name:
* rtk_qos_dscpRemark2Dscp_set
* Description:
* Set DSCP to remarked DSCP mapping.
* Input:
* dscp - DSCP value
* rmkDscp - remarked DSCP value
* Output:
* None.
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_QOS_DSCP_VALUE - Invalid dscp value
* Note:
* dscp parameter can be DSCP value or internal priority according to configuration of API
* dal_apollomp_qos_dscpRemarkSrcSel_set(), because DSCP remark functionality can map original DSCP
* value or internal priority to TX DSCP value.
*/
extern rtk_api_ret_t rtk_qos_dscpRemark2Dscp_set(rtk_dscp_t dscp, rtk_dscp_t rmkDscp);
/* Function Name:
* rtk_qos_dscpRemark2Dscp_get
* Description:
* Get DSCP to remarked DSCP mapping.
* Input:
* dscp - DSCP value
* Output:
* pDscp - remarked DSCP value
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_QOS_DSCP_VALUE - Invalid dscp value
* RT_ERR_NULL_POINTER - NULL pointer
* Note:
* None.
*/
extern rtk_api_ret_t rtk_qos_dscpRemark2Dscp_get(rtk_dscp_t dscp, rtk_dscp_t *pDscp);
/* Function Name:
* rtk_qos_portPriSelIndex_set
* Description:
* Configure priority decision index to each port.
* Input:
* port - Port id.
* index - priority decision index.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_ENTRY_INDEX - Invalid entry index.
* Note:
* The API can set priority of port assignments for queue usage and packet scheduling.
*/
extern rtk_api_ret_t rtk_qos_portPriSelIndex_set(rtk_port_t port, rtk_qos_priDecTbl_t index);
/* Function Name:
* rtk_qos_portPriSelIndex_get
* Description:
* Get priority decision index from each port.
* Input:
* port - Port id.
* Output:
* pIndex - priority decision index.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* The API can get priority of port assignments for queue usage and packet scheduling.
*/
extern rtk_api_ret_t rtk_qos_portPriSelIndex_get(rtk_port_t port, rtk_qos_priDecTbl_t *pIndex);
#endif /* __RTK_API_QOS_H__ */

View file

@ -0,0 +1,305 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* Purpose : RTL8367/RTL8367C switch high-level API
*
* Feature : The file includes rate module high-layer API defination
*
*/
#ifndef __RTK_API_RATE_H__
#define __RTK_API_RATE_H__
/*
* Include Files
*/
//#include <rtk_types.h>
/*
* Data Type Declaration
*/
#define RTK_MAX_METER_ID (rtk_switch_maxMeterId_get())
#define RTK_METER_NUM (RTK_MAX_METER_ID + 1)
typedef enum rtk_meter_type_e{
METER_TYPE_KBPS = 0, /* Kbps */
METER_TYPE_PPS, /* Packet per second */
METER_TYPE_END
}rtk_meter_type_t;
/*
* Function Declaration
*/
/* Rate */
/* Function Name:
* rtk_rate_shareMeter_set
* Description:
* Set meter configuration
* Input:
* index - shared meter index
* type - shared meter type
* rate - rate of share meter
* ifg_include - include IFG or not, ENABLE:include DISABLE:exclude
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_FILTER_METER_ID - Invalid meter
* RT_ERR_RATE - Invalid rate
* RT_ERR_INPUT - Invalid input parameters
* Note:
* The API can set shared meter rate and ifg include for each meter.
* The rate unit is 1 kbps and the range is from 8k to 1048568k if type is METER_TYPE_KBPS and
* the granularity of rate is 8 kbps.
* The rate unit is packets per second and the range is 1 ~ 0x1FFF if type is METER_TYPE_PPS.
* The ifg_include parameter is used
* for rate calculation with/without inter-frame-gap and preamble.
*/
rtk_api_ret_t rtk_rate_shareMeter_set(rtk_meter_id_t index, rtk_meter_type_t type, rtk_rate_t rate, rtk_enable_t ifg_include);
/* Function Name:
* rtk_rate_shareMeter_get
* Description:
* Get meter configuration
* Input:
* index - shared meter index
* Output:
* pType - Meter Type
* pRate - pointer of rate of share meter
* pIfg_include - include IFG or not, ENABLE:include DISABLE:exclude
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_FILTER_METER_ID - Invalid meter
* Note:
*
*/
rtk_api_ret_t rtk_rate_shareMeter_get(rtk_meter_id_t index, rtk_meter_type_t *pType, rtk_rate_t *pRate, rtk_enable_t *pIfg_include);
/* Function Name:
* rtk_rate_shareMeterBucket_set
* Description:
* Set meter Bucket Size
* Input:
* index - shared meter index
* bucket_size - Bucket Size
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_INPUT - Error Input
* RT_ERR_SMI - SMI access error
* RT_ERR_FILTER_METER_ID - Invalid meter
* Note:
* The API can set shared meter bucket size.
*/
extern rtk_api_ret_t rtk_rate_shareMeterBucket_set(rtk_meter_id_t index, rtk_uint32 bucket_size);
/* Function Name:
* rtk_rate_shareMeterBucket_get
* Description:
* Get meter Bucket Size
* Input:
* index - shared meter index
* Output:
* pBucket_size - Bucket Size
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_FILTER_METER_ID - Invalid meter
* Note:
* The API can get shared meter bucket size.
*/
extern rtk_api_ret_t rtk_rate_shareMeterBucket_get(rtk_meter_id_t index, rtk_uint32 *pBucket_size);
/* Function Name:
* rtk_rate_igrBandwidthCtrlRate_set
* Description:
* Set port ingress bandwidth control
* Input:
* port - Port id
* rate - Rate of share meter
* ifg_include - include IFG or not, ENABLE:include DISABLE:exclude
* fc_enable - enable flow control or not, ENABLE:use flow control DISABLE:drop
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_ENABLE - Invalid IFG parameter.
* RT_ERR_INBW_RATE - Invalid ingress rate parameter.
* Note:
* The rate unit is 1 kbps and the range is from 8k to 1048568k. The granularity of rate is 8 kbps.
* The ifg_include parameter is used for rate calculation with/without inter-frame-gap and preamble.
*/
extern rtk_api_ret_t rtk_rate_igrBandwidthCtrlRate_set( rtk_port_t port, rtk_rate_t rate, rtk_enable_t ifg_include, rtk_enable_t fc_enable);
/* Function Name:
* rtk_rate_igrBandwidthCtrlRate_get
* Description:
* Get port ingress bandwidth control
* Input:
* port - Port id
* Output:
* pRate - Rate of share meter
* pIfg_include - Rate's calculation including IFG, ENABLE:include DISABLE:exclude
* pFc_enable - enable flow control or not, ENABLE:use flow control DISABLE:drop
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The rate unit is 1 kbps and the range is from 8k to 1048568k. The granularity of rate is 8 kbps.
* The ifg_include parameter is used for rate calculation with/without inter-frame-gap and preamble.
*/
extern rtk_api_ret_t rtk_rate_igrBandwidthCtrlRate_get(rtk_port_t port, rtk_rate_t *pRate, rtk_enable_t *pIfg_include, rtk_enable_t *pFc_enable);
/* Function Name:
* rtk_rate_egrBandwidthCtrlRate_set
* Description:
* Set port egress bandwidth control
* Input:
* port - Port id
* rate - Rate of egress bandwidth
* ifg_include - include IFG or not, ENABLE:include DISABLE:exclude
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_QOS_EBW_RATE - Invalid egress bandwidth/rate
* Note:
* The rate unit is 1 kbps and the range is from 8k to 1048568k. The granularity of rate is 8 kbps.
* The ifg_include parameter is used for rate calculation with/without inter-frame-gap and preamble.
*/
extern rtk_api_ret_t rtk_rate_egrBandwidthCtrlRate_set(rtk_port_t port, rtk_rate_t rate, rtk_enable_t ifg_includ);
/* Function Name:
* rtk_rate_egrBandwidthCtrlRate_get
* Description:
* Get port egress bandwidth control
* Input:
* port - Port id
* Output:
* pRate - Rate of egress bandwidth
* pIfg_include - Rate's calculation including IFG, ENABLE:include DISABLE:exclude
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The rate unit is 1 kbps and the range is from 8k to 1048568k. The granularity of rate is 8 kbps.
* The ifg_include parameter is used for rate calculation with/without inter-frame-gap and preamble.
*/
extern rtk_api_ret_t rtk_rate_egrBandwidthCtrlRate_get(rtk_port_t port, rtk_rate_t *pRate, rtk_enable_t *pIfg_include);
/* Function Name:
* rtk_rate_egrQueueBwCtrlEnable_set
* Description:
* Set enable status of egress bandwidth control on specified queue.
* Input:
* port - port id
* queue - queue id
* enable - enable status of egress queue bandwidth control
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT_ID - invalid port id
* RT_ERR_QUEUE_ID - invalid queue id
* RT_ERR_INPUT - invalid input parameter
* Note:
* None
*/
extern rtk_api_ret_t rtk_rate_egrQueueBwCtrlEnable_set(rtk_port_t port, rtk_qid_t queue, rtk_enable_t enable);
/* Function Name:
* rtk_rate_egrQueueBwCtrlRate_get
* Description:
* Get rate of egress bandwidth control on specified queue.
* Input:
* port - port id
* queue - queue id
* pIndex - shared meter index
* Output:
* pRate - pointer to rate of egress queue bandwidth control
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT_ID - invalid port id
* RT_ERR_QUEUE_ID - invalid queue id
* RT_ERR_FILTER_METER_ID - Invalid meter id
* Note:
* None.
*/
extern rtk_api_ret_t rtk_rate_egrQueueBwCtrlEnable_get(rtk_port_t port, rtk_qid_t queue, rtk_enable_t *pEnable);
/* Function Name:
* rtk_rate_egrQueueBwCtrlRate_set
* Description:
* Set rate of egress bandwidth control on specified queue.
* Input:
* port - port id
* queue - queue id
* index - shared meter index
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT_ID - invalid port id
* RT_ERR_QUEUE_ID - invalid queue id
* RT_ERR_FILTER_METER_ID - Invalid meter id
* Note:
* The actual rate control is set in shared meters.
* The unit of granularity is 8Kbps.
*/
extern rtk_api_ret_t rtk_rate_egrQueueBwCtrlRate_set(rtk_port_t port, rtk_qid_t queue, rtk_meter_id_t index);
/* Function Name:
* rtk_rate_egrQueueBwCtrlRate_get
* Description:
* Get rate of egress bandwidth control on specified queue.
* Input:
* port - port id
* queue - queue id
* pIndex - shared meter index
* Output:
* pRate - pointer to rate of egress queue bandwidth control
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT_ID - invalid port id
* RT_ERR_QUEUE_ID - invalid queue id
* RT_ERR_FILTER_METER_ID - Invalid meter id
* Note:
* The actual rate control is set in shared meters.
* The unit of granularity is 8Kbps.
*/
extern rtk_api_ret_t rtk_rate_egrQueueBwCtrlRate_get(rtk_port_t port, rtk_qid_t queue, rtk_meter_id_t *pIndex);
#endif /* __RTK_API_RATE_H__ */

View file

@ -0,0 +1,264 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : Declaration of RLDP and RLPP API
*
* Feature : The file have include the following module and sub-modules
* 1) RLDP and RLPP configuration and status
*
*/
#ifndef __RTK_RLDP_H__
#define __RTK_RLDP_H__
/*
* Include Files
*/
/*
* Symbol Definition
*/
typedef enum rtk_rldp_trigger_e
{
RTK_RLDP_TRIGGER_SAMOVING = 0,
RTK_RLDP_TRIGGER_PERIOD,
RTK_RLDP_TRIGGER_END
} rtk_rldp_trigger_t;
typedef enum rtk_rldp_cmpType_e
{
RTK_RLDP_CMPTYPE_MAGIC = 0, /* Compare the RLDP with magic only */
RTK_RLDP_CMPTYPE_MAGIC_ID, /* Compare the RLDP with both magic + ID */
RTK_RLDP_CMPTYPE_END
} rtk_rldp_cmpType_t;
typedef enum rtk_rldp_loopStatus_e
{
RTK_RLDP_LOOPSTS_NONE = 0,
RTK_RLDP_LOOPSTS_LOOPING,
RTK_RLDP_LOOPSTS_END
} rtk_rldp_loopStatus_t;
typedef enum rtk_rlpp_trapType_e
{
RTK_RLPP_TRAPTYPE_NONE = 0,
RTK_RLPP_TRAPTYPE_CPU,
RTK_RLPP_TRAPTYPE_END
} rtk_rlpp_trapType_t;
typedef struct rtk_rldp_config_s
{
rtk_enable_t rldp_enable;
rtk_rldp_trigger_t trigger_mode;
rtk_mac_t magic;
rtk_rldp_cmpType_t compare_type;
rtk_uint32 interval_check; /* Checking interval for check state */
rtk_uint32 num_check; /* Checking number for check state */
rtk_uint32 interval_loop; /* Checking interval for loop state */
rtk_uint32 num_loop; /* Checking number for loop state */
} rtk_rldp_config_t;
typedef struct rtk_rldp_portConfig_s
{
rtk_enable_t tx_enable;
} rtk_rldp_portConfig_t;
typedef struct rtk_rldp_status_s
{
rtk_mac_t id;
} rtk_rldp_status_t;
typedef struct rtk_rldp_portStatus_s
{
rtk_rldp_loopStatus_t loop_status;
rtk_rldp_loopStatus_t loop_enter;
rtk_rldp_loopStatus_t loop_leave;
} rtk_rldp_portStatus_t;
/*
* Data Declaration
*/
/*
* Macro Declaration
*/
#define RTK_RLDP_INTERVAL_MAX 0xffff
#define RTK_RLDP_NUM_MAX 0xff
/*
* Function Declaration
*/
/* Module Name : RLDP */
/* Function Name:
* rtk_rldp_config_set
* Description:
* Set RLDP module configuration
* Input:
* pConfig - configuration structure of RLDP
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_INPUT
* RT_ERR_NULL_POINTER
* Note:
* None
*/
extern rtk_api_ret_t rtk_rldp_config_set(rtk_rldp_config_t *pConfig);
/* Function Name:
* rtk_rldp_config_get
* Description:
* Get RLDP module configuration
* Input:
* None
* Output:
* pConfig - configuration structure of RLDP
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_INPUT
* RT_ERR_NULL_POINTER
* Note:
* None
*/
extern rtk_api_ret_t rtk_rldp_config_get(rtk_rldp_config_t *pConfig);
/* Function Name:
* rtk_rldp_portConfig_set
* Description:
* Set per port RLDP module configuration
* Input:
* port - port number to be configured
* pPortConfig - per port configuration structure of RLDP
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_INPUT
* RT_ERR_NULL_POINTER
* Note:
* None
*/
extern rtk_api_ret_t rtk_rldp_portConfig_set(rtk_port_t port, rtk_rldp_portConfig_t *pPortConfig);
/* Function Name:
* rtk_rldp_portConfig_get
* Description:
* Get per port RLDP module configuration
* Input:
* port - port number to be get
* Output:
* pPortConfig - per port configuration structure of RLDP
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_INPUT
* RT_ERR_NULL_POINTER
* Note:
* None
*/
extern rtk_api_ret_t rtk_rldp_portConfig_get(rtk_port_t port, rtk_rldp_portConfig_t *pPortConfig);
/* Function Name:
* rtk_rldp_status_get
* Description:
* Get RLDP module status
* Input:
* None
* Output:
* pStatus - status structure of RLDP
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_NULL_POINTER
* Note:
* None
*/
extern rtk_api_ret_t rtk_rldp_status_get(rtk_rldp_status_t *pStatus);
/* Function Name:
* rtk_rldp_portStatus_get
* Description:
* Get RLDP module status
* Input:
* port - port number to be get
* Output:
* pPortStatus - per port status structure of RLDP
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_INPUT
* RT_ERR_NULL_POINTER
* Note:
* None
*/
extern rtk_api_ret_t rtk_rldp_portStatus_get(rtk_port_t port, rtk_rldp_portStatus_t *pPortStatus);
/* Function Name:
* rtk_rldp_portStatus_clear
* Description:
* Clear RLDP module status
* Input:
* port - port number to be clear
* pPortStatus - per port status structure of RLDP
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_INPUT
* RT_ERR_NULL_POINTER
* Note:
* Clear operation effect loop_enter and loop_leave only, other field in
* the structure are don't care
*/
extern rtk_api_ret_t rtk_rldp_portStatus_set(rtk_port_t port, rtk_rldp_portStatus_t *pPortStatus);
/* Function Name:
* rtk_rldp_portLoopPair_get
* Description:
* Get RLDP port loop pairs
* Input:
* port - port number to be get
* Output:
* pPortmask - per port related loop ports
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_INPUT
* RT_ERR_NULL_POINTER
* Note:
* None
*/
extern rtk_api_ret_t rtk_rldp_portLoopPair_get(rtk_port_t port, rtk_portmask_t *pPortmask);
#endif /* __RTK_RLDP_H__ */

View file

@ -0,0 +1,229 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (, 08 2017) $
*
* Purpose : Definition the error number in the SDK.
* Feature : error definition
*
*/
#ifndef __COMMON_RT_ERROR_H__
#define __COMMON_RT_ERROR_H__
/*
* Include Files
*/
/*
* Data Type Declaration
*/
typedef enum rt_error_code_e
{
RT_ERR_FAILED = -1, /* General Error */
/* 0x0000xxxx for common error code */
RT_ERR_OK = 0, /* 0x00000000, OK */
RT_ERR_INPUT, /* 0x00000001, invalid input parameter */
RT_ERR_UNIT_ID, /* 0x00000002, invalid unit id */
RT_ERR_PORT_ID, /* 0x00000003, invalid port id */
RT_ERR_PORT_MASK, /* 0x00000004, invalid port mask */
RT_ERR_PORT_LINKDOWN, /* 0x00000005, link down port status */
RT_ERR_ENTRY_INDEX, /* 0x00000006, invalid entry index */
RT_ERR_NULL_POINTER, /* 0x00000007, input parameter is null pointer */
RT_ERR_QUEUE_ID, /* 0x00000008, invalid queue id */
RT_ERR_QUEUE_NUM, /* 0x00000009, invalid queue number */
RT_ERR_BUSYWAIT_TIMEOUT, /* 0x0000000a, busy watting time out */
RT_ERR_MAC, /* 0x0000000b, invalid mac address */
RT_ERR_OUT_OF_RANGE, /* 0x0000000c, input parameter out of range */
RT_ERR_CHIP_NOT_SUPPORTED, /* 0x0000000d, functions not supported by this chip model */
RT_ERR_SMI, /* 0x0000000e, SMI error */
RT_ERR_NOT_INIT, /* 0x0000000f, The module is not initial */
RT_ERR_CHIP_NOT_FOUND, /* 0x00000010, The chip can not found */
RT_ERR_NOT_ALLOWED, /* 0x00000011, actions not allowed by the function */
RT_ERR_DRIVER_NOT_FOUND, /* 0x00000012, The driver can not found */
RT_ERR_SEM_LOCK_FAILED, /* 0x00000013, Failed to lock semaphore */
RT_ERR_SEM_UNLOCK_FAILED, /* 0x00000014, Failed to unlock semaphore */
RT_ERR_ENABLE, /* 0x00000015, invalid enable parameter */
RT_ERR_TBL_FULL, /* 0x00000016, input table full */
/* 0x0001xxxx for vlan */
RT_ERR_VLAN_VID = 0x00010000, /* 0x00010000, invalid vid */
RT_ERR_VLAN_PRIORITY, /* 0x00010001, invalid 1p priority */
RT_ERR_VLAN_EMPTY_ENTRY, /* 0x00010002, emtpy entry of vlan table */
RT_ERR_VLAN_ACCEPT_FRAME_TYPE, /* 0x00010003, invalid accept frame type */
RT_ERR_VLAN_EXIST, /* 0x00010004, vlan is exist */
RT_ERR_VLAN_ENTRY_NOT_FOUND, /* 0x00010005, specified vlan entry not found */
RT_ERR_VLAN_PORT_MBR_EXIST, /* 0x00010006, member port exist in the specified vlan */
RT_ERR_VLAN_PROTO_AND_PORT, /* 0x00010008, invalid protocol and port based vlan */
/* 0x0002xxxx for svlan */
RT_ERR_SVLAN_ENTRY_INDEX = 0x00020000, /* 0x00020000, invalid svid entry no */
RT_ERR_SVLAN_ETHER_TYPE, /* 0x00020001, invalid SVLAN ether type */
RT_ERR_SVLAN_TABLE_FULL, /* 0x00020002, no empty entry in SVLAN table */
RT_ERR_SVLAN_ENTRY_NOT_FOUND, /* 0x00020003, specified svlan entry not found */
RT_ERR_SVLAN_EXIST, /* 0x00020004, SVLAN entry is exist */
RT_ERR_SVLAN_VID, /* 0x00020005, invalid svid */
/* 0x0003xxxx for MSTP */
RT_ERR_MSTI = 0x00030000, /* 0x00030000, invalid msti */
RT_ERR_MSTP_STATE, /* 0x00030001, invalid spanning tree status */
RT_ERR_MSTI_EXIST, /* 0x00030002, MSTI exist */
RT_ERR_MSTI_NOT_EXIST, /* 0x00030003, MSTI not exist */
/* 0x0004xxxx for BUCKET */
RT_ERR_TIMESLOT = 0x00040000, /* 0x00040000, invalid time slot */
RT_ERR_TOKEN, /* 0x00040001, invalid token amount */
RT_ERR_RATE, /* 0x00040002, invalid rate */
RT_ERR_TICK, /* 0x00040003, invalid tick */
/* 0x0005xxxx for RMA */
RT_ERR_RMA_ADDR = 0x00050000, /* 0x00050000, invalid rma mac address */
RT_ERR_RMA_ACTION, /* 0x00050001, invalid rma action */
/* 0x0006xxxx for L2 */
RT_ERR_L2_HASH_KEY = 0x00060000, /* 0x00060000, invalid L2 Hash key */
RT_ERR_L2_HASH_INDEX, /* 0x00060001, invalid L2 Hash index */
RT_ERR_L2_CAM_INDEX, /* 0x00060002, invalid L2 CAM index */
RT_ERR_L2_ENRTYSEL, /* 0x00060003, invalid EntrySel */
RT_ERR_L2_INDEXTABLE_INDEX, /* 0x00060004, invalid L2 index table(=portMask table) index */
RT_ERR_LIMITED_L2ENTRY_NUM, /* 0x00060005, invalid limited L2 entry number */
RT_ERR_L2_AGGREG_PORT, /* 0x00060006, this aggregated port is not the lowest physical
port of its aggregation group */
RT_ERR_L2_FID, /* 0x00060007, invalid fid */
RT_ERR_L2_VID, /* 0x00060008, invalid cvid */
RT_ERR_L2_NO_EMPTY_ENTRY, /* 0x00060009, no empty entry in L2 table */
RT_ERR_L2_ENTRY_NOTFOUND, /* 0x0006000a, specified entry not found */
RT_ERR_L2_INDEXTBL_FULL, /* 0x0006000b, the L2 index table is full */
RT_ERR_L2_INVALID_FLOWTYPE, /* 0x0006000c, invalid L2 flow type */
RT_ERR_L2_L2UNI_PARAM, /* 0x0006000d, invalid L2 unicast parameter */
RT_ERR_L2_L2MULTI_PARAM, /* 0x0006000e, invalid L2 multicast parameter */
RT_ERR_L2_IPMULTI_PARAM, /* 0x0006000f, invalid L2 ip multicast parameter */
RT_ERR_L2_PARTIAL_HASH_KEY, /* 0x00060010, invalid L2 partial Hash key */
RT_ERR_L2_EMPTY_ENTRY, /* 0x00060011, the entry is empty(invalid) */
RT_ERR_L2_FLUSH_TYPE, /* 0x00060012, the flush type is invalid */
RT_ERR_L2_NO_CPU_PORT, /* 0x00060013, CPU port not exist */
/* 0x0007xxxx for FILTER (PIE) */
RT_ERR_FILTER_BLOCKNUM = 0x00070000, /* 0x00070000, invalid block number */
RT_ERR_FILTER_ENTRYIDX, /* 0x00070001, invalid entry index */
RT_ERR_FILTER_CUTLINE, /* 0x00070002, invalid cutline value */
RT_ERR_FILTER_FLOWTBLBLOCK, /* 0x00070003, block belongs to flow table */
RT_ERR_FILTER_INACLBLOCK, /* 0x00070004, block belongs to ingress ACL */
RT_ERR_FILTER_ACTION, /* 0x00070005, action doesn't consist to entry type */
RT_ERR_FILTER_INACL_RULENUM, /* 0x00070006, invalid ACL rulenum */
RT_ERR_FILTER_INACL_TYPE, /* 0x00070007, entry type isn't an ingress ACL rule */
RT_ERR_FILTER_INACL_EXIST, /* 0x00070008, ACL entry is already exit */
RT_ERR_FILTER_INACL_EMPTY, /* 0x00070009, ACL entry is empty */
RT_ERR_FILTER_FLOWTBL_TYPE, /* 0x0007000a, entry type isn't an flow table rule */
RT_ERR_FILTER_FLOWTBL_RULENUM, /* 0x0007000b, invalid flow table rulenum */
RT_ERR_FILTER_FLOWTBL_EMPTY, /* 0x0007000c, flow table entry is empty */
RT_ERR_FILTER_FLOWTBL_EXIST, /* 0x0007000d, flow table entry is already exist */
RT_ERR_FILTER_METER_ID, /* 0x0007000e, invalid metering id */
RT_ERR_FILTER_LOG_ID, /* 0x0007000f, invalid log id */
RT_ERR_FILTER_INACL_NONE_BEGIN_IDX, /* 0x00070010, entry index is not starting index of a group of rules */
RT_ERR_FILTER_INACL_ACT_NOT_SUPPORT, /* 0x00070011, action not support */
RT_ERR_FILTER_INACL_RULE_NOT_SUPPORT, /* 0x00070012, rule not support */
/* 0x0008xxxx for ACL Rate Limit */
RT_ERR_ACLRL_HTHR = 0x00080000, /* 0x00080000, invalid high threshold */
RT_ERR_ACLRL_TIMESLOT, /* 0x00080001, invalid time slot */
RT_ERR_ACLRL_TOKEN, /* 0x00080002, invalid token amount */
RT_ERR_ACLRL_RATE, /* 0x00080003, invalid rate */
/* 0x0009xxxx for Link aggregation */
RT_ERR_LA_CPUPORT = 0x00090000, /* 0x00090000, CPU port can not be aggregated port */
RT_ERR_LA_TRUNK_ID, /* 0x00090001, invalid trunk id */
RT_ERR_LA_PORTMASK, /* 0x00090002, invalid port mask */
RT_ERR_LA_HASHMASK, /* 0x00090003, invalid hash mask */
RT_ERR_LA_DUMB, /* 0x00090004, this API should be used in 802.1ad dumb mode */
RT_ERR_LA_PORTNUM_DUMB, /* 0x00090005, it can only aggregate at most four ports when 802.1ad dumb mode */
RT_ERR_LA_PORTNUM_NORMAL, /* 0x00090006, it can only aggregate at most eight ports when 802.1ad normal mode */
RT_ERR_LA_MEMBER_OVERLAP, /* 0x00090007, the specified port mask is overlapped with other group */
RT_ERR_LA_NOT_MEMBER_PORT, /* 0x00090008, the port is not a member port of the trunk */
RT_ERR_LA_TRUNK_NOT_EXIST, /* 0x00090009, the trunk doesn't exist */
/* 0x000axxxx for storm filter */
RT_ERR_SFC_TICK_PERIOD = 0x000a0000, /* 0x000a0000, invalid SFC tick period */
RT_ERR_SFC_UNKNOWN_GROUP, /* 0x000a0001, Unknown Storm filter group */
/* 0x000bxxxx for pattern match */
RT_ERR_PM_MASK = 0x000b0000, /* 0x000b0000, invalid pattern length. Pattern length should be 8 */
RT_ERR_PM_LENGTH, /* 0x000b0001, invalid pattern match mask, first byte must care */
RT_ERR_PM_MODE, /* 0x000b0002, invalid pattern match mode */
/* 0x000cxxxx for input bandwidth control */
RT_ERR_INBW_TICK_PERIOD = 0x000c0000, /* 0x000c0000, invalid tick period for input bandwidth control */
RT_ERR_INBW_TOKEN_AMOUNT, /* 0x000c0001, invalid amount of token for input bandwidth control */
RT_ERR_INBW_FCON_VALUE, /* 0x000c0002, invalid flow control ON threshold value for input bandwidth control */
RT_ERR_INBW_FCOFF_VALUE, /* 0x000c0003, invalid flow control OFF threshold value for input bandwidth control */
RT_ERR_INBW_FC_ALLOWANCE, /* 0x000c0004, invalid allowance of incomming packet for input bandwidth control */
RT_ERR_INBW_RATE, /* 0x000c0005, invalid input bandwidth */
/* 0x000dxxxx for QoS */
RT_ERR_QOS_1P_PRIORITY = 0x000d0000, /* 0x000d0000, invalid 802.1P priority */
RT_ERR_QOS_DSCP_VALUE, /* 0x000d0001, invalid DSCP value */
RT_ERR_QOS_INT_PRIORITY, /* 0x000d0002, invalid internal priority */
RT_ERR_QOS_SEL_DSCP_PRI, /* 0x000d0003, invalid DSCP selection priority */
RT_ERR_QOS_SEL_PORT_PRI, /* 0x000d0004, invalid port selection priority */
RT_ERR_QOS_SEL_IN_ACL_PRI, /* 0x000d0005, invalid ingress ACL selection priority */
RT_ERR_QOS_SEL_CLASS_PRI, /* 0x000d0006, invalid classifier selection priority */
RT_ERR_QOS_EBW_RATE, /* 0x000d0007, invalid egress bandwidth rate */
RT_ERR_QOS_SCHE_TYPE, /* 0x000d0008, invalid QoS scheduling type */
RT_ERR_QOS_QUEUE_WEIGHT, /* 0x000d0009, invalid Queue weight */
RT_ERR_QOS_SEL_PRI_SOURCE, /* 0x000d000a, invalid selection of priority source */
/* 0x000exxxx for port ability */
RT_ERR_PHY_PAGE_ID = 0x000e0000, /* 0x000e0000, invalid PHY page id */
RT_ERR_PHY_REG_ID, /* 0x000e0001, invalid PHY reg id */
RT_ERR_PHY_DATAMASK, /* 0x000e0002, invalid PHY data mask */
RT_ERR_PHY_AUTO_NEGO_MODE, /* 0x000e0003, invalid PHY auto-negotiation mode*/
RT_ERR_PHY_SPEED, /* 0x000e0004, invalid PHY speed setting */
RT_ERR_PHY_DUPLEX, /* 0x000e0005, invalid PHY duplex setting */
RT_ERR_PHY_FORCE_ABILITY, /* 0x000e0006, invalid PHY force mode ability parameter */
RT_ERR_PHY_FORCE_1000, /* 0x000e0007, invalid PHY force mode 1G speed setting */
RT_ERR_PHY_TXRX, /* 0x000e0008, invalid PHY tx/rx */
RT_ERR_PHY_ID, /* 0x000e0009, invalid PHY id */
RT_ERR_PHY_RTCT_NOT_FINISH, /* 0x000e000a, PHY RTCT in progress */
/* 0x000fxxxx for mirror */
RT_ERR_MIRROR_DIRECTION = 0x000f0000, /* 0x000f0000, invalid error mirror direction */
RT_ERR_MIRROR_SESSION_FULL, /* 0x000f0001, mirroring session is full */
RT_ERR_MIRROR_SESSION_NOEXIST, /* 0x000f0002, mirroring session not exist */
RT_ERR_MIRROR_PORT_EXIST, /* 0x000f0003, mirroring port already exists */
RT_ERR_MIRROR_PORT_NOT_EXIST, /* 0x000f0004, mirroring port does not exists */
RT_ERR_MIRROR_PORT_FULL, /* 0x000f0005, Exceeds maximum number of supported mirroring port */
/* 0x0010xxxx for stat */
RT_ERR_STAT_INVALID_GLOBAL_CNTR = 0x00100000, /* 0x00100000, Invalid Global Counter */
RT_ERR_STAT_INVALID_PORT_CNTR, /* 0x00100001, Invalid Port Counter */
RT_ERR_STAT_GLOBAL_CNTR_FAIL, /* 0x00100002, Could not retrieve/reset Global Counter */
RT_ERR_STAT_PORT_CNTR_FAIL, /* 0x00100003, Could not retrieve/reset Port Counter */
RT_ERR_STAT_INVALID_CNTR, /* 0x00100004, Invalid Counter */
RT_ERR_STAT_CNTR_FAIL, /* 0x00100005, Could not retrieve/reset Counter */
/* 0x0011xxxx for dot1x */
RT_ERR_DOT1X_INVALID_DIRECTION = 0x00110000, /* 0x00110000, Invalid Authentication Direction */
RT_ERR_DOT1X_PORTBASEDPNEN, /* 0x00110001, Port-based enable port error */
RT_ERR_DOT1X_PORTBASEDAUTH, /* 0x00110002, Port-based auth port error */
RT_ERR_DOT1X_PORTBASEDOPDIR, /* 0x00110003, Port-based opdir error */
RT_ERR_DOT1X_MACBASEDPNEN, /* 0x00110004, MAC-based enable port error */
RT_ERR_DOT1X_MACBASEDOPDIR, /* 0x00110005, MAC-based opdir error */
RT_ERR_DOT1X_PROC, /* 0x00110006, unauthorized behavior error */
RT_ERR_DOT1X_GVLANIDX, /* 0x00110007, guest vlan index error */
RT_ERR_DOT1X_GVLANTALK, /* 0x00110008, guest vlan OPDIR error */
RT_ERR_DOT1X_MAC_PORT_MISMATCH, /* 0x00110009, Auth MAC and port mismatch eror */
RT_ERR_END /* The symbol is the latest symbol */
} rt_error_code_t;
#endif /* __COMMON_RT_ERROR_H__ */

View file

@ -0,0 +1,44 @@
#ifndef __RTK_HAL_H__
#define __RTK_HAL_H__
#include "ra_ioctl.h"
#define RTK_SW_VID_RANGE 16
void rtk_hal_switch_init(void);
void rtk_hal_dump_mib(void);
void rtk_hal_dump_full_mib(void);
int rtk_hal_dump_vlan(void);
void rtk_hal_clear_vlan(void);
int rtk_hal_set_vlan(struct ra_switch_ioctl_data *data);
int rtk_hal_set_ingress_rate(struct ra_switch_ioctl_data *data);
int rtk_hal_set_egress_rate(struct ra_switch_ioctl_data *data);
void rtk_hal_dump_table(void);
void rtk_hal_clear_table(void);
void rtk_hal_get_phy_status(struct ra_switch_ioctl_data *data);
void rtk_hal_set_port_mirror(struct ra_switch_ioctl_data *data);
void rtk_hal_read_reg(struct ra_switch_ioctl_data *data);
void rtk_hal_write_reg(struct ra_switch_ioctl_data *data);
void rtk_hal_qos_en(struct ra_switch_ioctl_data *data);
void rtk_hal_qos_set_table2type(struct ra_switch_ioctl_data *data);
void rtk_hal_qos_get_table2type(struct ra_switch_ioctl_data *data);
void rtk_hal_qos_set_port2table(struct ra_switch_ioctl_data *data);
void rtk_hal_qos_get_port2table(struct ra_switch_ioctl_data *data);
void rtk_hal_qos_set_port2pri(struct ra_switch_ioctl_data *data);
void rtk_hal_qos_get_port2pri(struct ra_switch_ioctl_data *data);
void rtk_hal_qos_set_dscp2pri(struct ra_switch_ioctl_data *data);
void rtk_hal_qos_get_dscp2pri(struct ra_switch_ioctl_data *data);
void rtk_hal_qos_set_pri2queue(struct ra_switch_ioctl_data *data);
void rtk_hal_qos_get_pri2queue(struct ra_switch_ioctl_data *data);
void rtk_hal_qos_set_queue_weight(struct ra_switch_ioctl_data *data);
void rtk_hal_qos_get_queue_weight(struct ra_switch_ioctl_data *data);
void rtk_hal_enable_igmpsnoop(struct ra_switch_ioctl_data *data);
void rtk_hal_disable_igmpsnoop(void);
void rtk_hal_set_phy_test_mode(struct ra_switch_ioctl_data *data);
void rtk_hal_get_phy_reg(struct ra_switch_ioctl_data *data);
void rtk_hal_set_phy_reg(struct ra_switch_ioctl_data *data);
void rtk_hal_vlan_tag(struct ra_switch_ioctl_data *data);
void rtk_hal_vlan_portpvid_set(rtk_port_t port, rtk_vlan_t pvid, rtk_pri_t priority);
void rtk_hal_add_table(struct ra_switch_ioctl_data *data);
void rtk_hal_del_table(struct ra_switch_ioctl_data *data);
void rtk_hal_vlan_mode(struct ra_switch_ioctl_data *data);
void rtk_hal_set_port_trunk(struct ra_switch_ioctl_data *data);
#endif

View file

@ -0,0 +1,737 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76336 $
* $Date: 2017-03-09 10:41:21 +0800 (, 09 2017) $
*
* Purpose : RTK switch high-level API
* Feature : Here is a list of all functions and variables in this module.
*
*/
#ifndef __RTK_SWITCH_H__
#define __RTK_SWITCH_H__
#include <rtk_types.h>
#define UNDEFINE_PHY_PORT (0xFF)
#define RTK_SWITCH_PORT_NUM (32)
#define MAXPKTLEN_CFG_ID_MAX (1)
#define RTK_SWITCH_MAX_PKTLEN (0x3FFF)
typedef enum init_state_e
{
INIT_NOT_COMPLETED = 0,
INIT_COMPLETED,
INIT_STATE_END
} init_state_t;
typedef enum switch_chip_e
{
CHIP_RTL8367C = 0,
CHIP_RTL8370B,
CHIP_RTL8364B,
CHIP_RTL8363SC_VB,
CHIP_END
}switch_chip_t;
typedef enum port_type_e
{
UTP_PORT = 0,
EXT_PORT,
UNKNOWN_PORT = 0xFF,
PORT_TYPE_END
}port_type_t;
typedef struct rtk_switch_halCtrl_s
{
switch_chip_t switch_type;
rtk_uint32 l2p_port[RTK_SWITCH_PORT_NUM];
rtk_uint32 p2l_port[RTK_SWITCH_PORT_NUM];
port_type_t log_port_type[RTK_SWITCH_PORT_NUM];
rtk_uint32 ptp_port[RTK_SWITCH_PORT_NUM];
rtk_uint32 valid_portmask;
rtk_uint32 valid_utp_portmask;
rtk_uint32 valid_ext_portmask;
rtk_uint32 valid_cpu_portmask;
rtk_uint32 min_phy_port;
rtk_uint32 max_phy_port;
rtk_uint32 phy_portmask;
rtk_uint32 combo_logical_port;
rtk_uint32 hsg_logical_port;
rtk_uint32 sg_logical_portmask;
rtk_uint32 max_meter_id;
rtk_uint32 max_lut_addr_num;
rtk_uint32 trunk_group_mask;
}rtk_switch_halCtrl_t;
typedef enum rtk_switch_maxPktLen_linkSpeed_e {
MAXPKTLEN_LINK_SPEED_FE = 0,
MAXPKTLEN_LINK_SPEED_GE,
MAXPKTLEN_LINK_SPEED_END,
} rtk_switch_maxPktLen_linkSpeed_t;
/* UTIL MACRO */
#define RTK_CHK_INIT_STATE() \
do \
{ \
if(rtk_switch_initialState_get() != INIT_COMPLETED) \
{ \
return RT_ERR_NOT_INIT; \
} \
}while(0)
#define RTK_CHK_PORT_VALID(__port__) \
do \
{ \
if(rtk_switch_logicalPortCheck(__port__) != RT_ERR_OK) \
{ \
return RT_ERR_PORT_ID; \
} \
}while(0)
#define RTK_CHK_PORT_IS_UTP(__port__) \
do \
{ \
if(rtk_switch_isUtpPort(__port__) != RT_ERR_OK) \
{ \
return RT_ERR_PORT_ID; \
} \
}while(0)
#define RTK_CHK_PORT_IS_EXT(__port__) \
do \
{ \
if(rtk_switch_isExtPort(__port__) != RT_ERR_OK) \
{ \
return RT_ERR_PORT_ID; \
} \
}while(0)
#define RTK_CHK_PORT_IS_COMBO(__port__) \
do \
{ \
if(rtk_switch_isComboPort(__port__) != RT_ERR_OK) \
{ \
return RT_ERR_PORT_ID; \
} \
}while(0)
#define RTK_CHK_PORT_IS_PTP(__port__) \
do \
{ \
if(rtk_switch_isPtpPort(__port__) != RT_ERR_OK) \
{ \
return RT_ERR_PORT_ID; \
} \
}while(0)
#define RTK_CHK_PORTMASK_VALID(__portmask__) \
do \
{ \
if(rtk_switch_isPortMaskValid(__portmask__) != RT_ERR_OK) \
{ \
return RT_ERR_PORT_MASK; \
} \
}while(0)
#define RTK_CHK_PORTMASK_VALID_ONLY_UTP(__portmask__) \
do \
{ \
if(rtk_switch_isPortMaskUtp(__portmask__) != RT_ERR_OK) \
{ \
return RT_ERR_PORT_MASK; \
} \
}while(0)
#define RTK_CHK_PORTMASK_VALID_ONLY_EXT(__portmask__) \
do \
{ \
if(rtk_switch_isPortMaskExt(__portmask__) != RT_ERR_OK) \
{ \
return RT_ERR_PORT_MASK; \
} \
}while(0)
#define RTK_CHK_TRUNK_GROUP_VALID(__grpId__) \
do \
{ \
if(rtk_switch_isValidTrunkGrpId(__grpId__) != RT_ERR_OK) \
{ \
return RT_ERR_LA_TRUNK_ID; \
} \
}while(0)
#define RTK_PORTMASK_IS_PORT_SET(__portmask__, __port__) (((__portmask__).bits[0] & (0x00000001 << __port__)) ? 1 : 0)
#define RTK_PORTMASK_IS_EMPTY(__portmask__) (((__portmask__).bits[0] == 0) ? 1 : 0)
#define RTK_PORTMASK_CLEAR(__portmask__) ((__portmask__).bits[0] = 0)
#define RTK_PORTMASK_PORT_SET(__portmask__, __port__) ((__portmask__).bits[0] |= (0x00000001 << __port__))
#define RTK_PORTMASK_PORT_CLEAR(__portmask__, __port__) ((__portmask__).bits[0] &= ~(0x00000001 << __port__))
#define RTK_PORTMASK_ALLPORT_SET(__portmask__) (rtk_switch_logPortMask_get(&__portmask__))
#define RTK_PORTMASK_SCAN(__portmask__, __port__) for(__port__ = 0; __port__ < RTK_SWITCH_PORT_NUM; __port__++) if(RTK_PORTMASK_IS_PORT_SET(__portmask__, __port__))
#define RTK_PORTMASK_COMPARE(__portmask_A__, __portmask_B__) ((__portmask_A__).bits[0] - (__portmask_B__).bits[0])
#define RTK_SCAN_ALL_PHY_PORTMASK(__port__) for(__port__ = 0; __port__ < RTK_SWITCH_PORT_NUM; __port__++) if( (rtk_switch_phyPortMask_get() & (0x00000001 << __port__)))
#define RTK_SCAN_ALL_LOG_PORT(__port__) for(__port__ = 0; __port__ < RTK_SWITCH_PORT_NUM; __port__++) if( rtk_switch_logicalPortCheck(__port__) == RT_ERR_OK)
#define RTK_SCAN_ALL_LOG_PORTMASK(__portmask__) for((__portmask__).bits[0] = 0; (__portmask__).bits[0] < 0x7FFFF; (__portmask__).bits[0]++) if( rtk_switch_isPortMaskValid(&__portmask__) == RT_ERR_OK)
/* Port mask defination */
#define RTK_PHY_PORTMASK_ALL (rtk_switch_phyPortMask_get())
/* Port defination*/
#define RTK_MAX_LOGICAL_PORT_ID (rtk_switch_maxLogicalPort_get())
/* Function Name:
* rtk_switch_probe
* Description:
* Probe switch
* Input:
* None
* Output:
* None
* Return:
* RT_ERR_OK - Switch probed
* RT_ERR_FAILED - Switch Unprobed.
* Note:
*
*/
extern rtk_api_ret_t rtk_switch_probe(switch_chip_t *pSwitchChip);
/* Function Name:
* rtk_switch_initialState_set
* Description:
* Set initial status
* Input:
* state - Initial state;
* Output:
* None
* Return:
* RT_ERR_OK - Initialized
* RT_ERR_FAILED - Uninitialized
* Note:
*
*/
extern rtk_api_ret_t rtk_switch_initialState_set(init_state_t state);
/* Function Name:
* rtk_switch_initialState_get
* Description:
* Get initial status
* Input:
* None
* Output:
* None
* Return:
* INIT_COMPLETED - Initialized
* INIT_NOT_COMPLETED - Uninitialized
* Note:
*
*/
extern init_state_t rtk_switch_initialState_get(void);
/* Function Name:
* rtk_switch_logicalPortCheck
* Description:
* Check logical port ID.
* Input:
* logicalPort - logical port ID
* Output:
* None
* Return:
* RT_ERR_OK - Port ID is correct
* RT_ERR_FAILED - Port ID is not correct
* RT_ERR_NOT_INIT - Not Initialize
* Note:
*
*/
extern rtk_api_ret_t rtk_switch_logicalPortCheck(rtk_port_t logicalPort);
/* Function Name:
* rtk_switch_isUtpPort
* Description:
* Check is logical port a UTP port
* Input:
* logicalPort - logical port ID
* Output:
* None
* Return:
* RT_ERR_OK - Port ID is a UTP port
* RT_ERR_FAILED - Port ID is not a UTP port
* RT_ERR_NOT_INIT - Not Initialize
* Note:
*
*/
extern rtk_api_ret_t rtk_switch_isUtpPort(rtk_port_t logicalPort);
/* Function Name:
* rtk_switch_isExtPort
* Description:
* Check is logical port a Extension port
* Input:
* logicalPort - logical port ID
* Output:
* None
* Return:
* RT_ERR_OK - Port ID is a EXT port
* RT_ERR_FAILED - Port ID is not a EXT port
* RT_ERR_NOT_INIT - Not Initialize
* Note:
*
*/
extern rtk_api_ret_t rtk_switch_isExtPort(rtk_port_t logicalPort);
/* Function Name:
* rtk_switch_isHsgPort
* Description:
* Check is logical port a HSG port
* Input:
* logicalPort - logical port ID
* Output:
* None
* Return:
* RT_ERR_OK - Port ID is a HSG port
* RT_ERR_FAILED - Port ID is not a HSG port
* RT_ERR_NOT_INIT - Not Initialize
* Note:
*
*/
extern rtk_api_ret_t rtk_switch_isHsgPort(rtk_port_t logicalPort);
/* Function Name:
* rtk_switch_isSgmiiPort
* Description:
* Check is logical port a SGMII port
* Input:
* logicalPort - logical port ID
* Output:
* None
* Return:
* RT_ERR_OK - Port ID is a SGMII port
* RT_ERR_FAILED - Port ID is not a SGMII port
* RT_ERR_NOT_INIT - Not Initialize
* Note:
*
*/
extern rtk_api_ret_t rtk_switch_isSgmiiPort(rtk_port_t logicalPort);
/* Function Name:
* rtk_switch_isCPUPort
* Description:
* Check is logical port a CPU port
* Input:
* logicalPort - logical port ID
* Output:
* None
* Return:
* RT_ERR_OK - Port ID is a CPU port
* RT_ERR_FAILED - Port ID is not a CPU port
* RT_ERR_NOT_INIT - Not Initialize
* Note:
*
*/
extern rtk_api_ret_t rtk_switch_isCPUPort(rtk_port_t logicalPort);
/* Function Name:
* rtk_switch_isComboPort
* Description:
* Check is logical port a Combo port
* Input:
* logicalPort - logical port ID
* Output:
* None
* Return:
* RT_ERR_OK - Port ID is a combo port
* RT_ERR_FAILED - Port ID is not a combo port
* RT_ERR_NOT_INIT - Not Initialize
* Note:
*
*/
extern rtk_api_ret_t rtk_switch_isComboPort(rtk_port_t logicalPort);
/* Function Name:
* rtk_switch_ComboPort_get
* Description:
* Get Combo port ID
* Input:
* None
* Output:
* None
* Return:
* Port ID of combo port
* Note:
*
*/
extern rtk_uint32 rtk_switch_ComboPort_get(void);
/* Function Name:
* rtk_switch_isPtpPort
* Description:
* Check is logical port a PTP port
* Input:
* logicalPort - logical port ID
* Output:
* None
* Return:
* RT_ERR_OK - Port ID is a PTP port
* RT_ERR_FAILED - Port ID is not a PTP port
* RT_ERR_NOT_INIT - Not Initialize
* Note:
*
*/
extern rtk_api_ret_t rtk_switch_isPtpPort(rtk_port_t logicalPort);
/* Function Name:
* rtk_switch_port_L2P_get
* Description:
* Get physical port ID
* Input:
* logicalPort - logical port ID
* Output:
* None
* Return:
* Physical port ID
* Note:
*
*/
extern rtk_uint32 rtk_switch_port_L2P_get(rtk_port_t logicalPort);
/* Function Name:
* rtk_switch_port_P2L_get
* Description:
* Get logical port ID
* Input:
* physicalPort - physical port ID
* Output:
* None
* Return:
* logical port ID
* Note:
*
*/
extern rtk_port_t rtk_switch_port_P2L_get(rtk_uint32 physicalPort);
/* Function Name:
* rtk_switch_isPortMaskValid
* Description:
* Check portmask is valid or not
* Input:
* pPmask - logical port mask
* Output:
* None
* Return:
* RT_ERR_OK - port mask is valid
* RT_ERR_FAILED - port mask is not valid
* RT_ERR_NOT_INIT - Not Initialize
* RT_ERR_NULL_POINTER - Null pointer
* Note:
*
*/
extern rtk_api_ret_t rtk_switch_isPortMaskValid(rtk_portmask_t *pPmask);
/* Function Name:
* rtk_switch_isPortMaskUtp
* Description:
* Check all ports in portmask are only UTP port
* Input:
* pPmask - logical port mask
* Output:
* None
* Return:
* RT_ERR_OK - Only UTP port in port mask
* RT_ERR_FAILED - Not only UTP port in port mask
* RT_ERR_NOT_INIT - Not Initialize
* RT_ERR_NULL_POINTER - Null pointer
* Note:
*
*/
extern rtk_api_ret_t rtk_switch_isPortMaskUtp(rtk_portmask_t *pPmask);
/* Function Name:
* rtk_switch_isPortMaskExt
* Description:
* Check all ports in portmask are only EXT port
* Input:
* pPmask - logical port mask
* Output:
* None
* Return:
* RT_ERR_OK - Only EXT port in port mask
* RT_ERR_FAILED - Not only EXT port in port mask
* RT_ERR_NOT_INIT - Not Initialize
* RT_ERR_NULL_POINTER - Null pointer
* Note:
*
*/
extern rtk_api_ret_t rtk_switch_isPortMaskExt(rtk_portmask_t *pPmask);
/* Function Name:
* rtk_switch_portmask_L2P_get
* Description:
* Get physicl portmask from logical portmask
* Input:
* pLogicalPmask - logical port mask
* Output:
* pPhysicalPortmask - physical port mask
* Return:
* RT_ERR_OK - OK
* RT_ERR_NOT_INIT - Not Initialize
* RT_ERR_NULL_POINTER - Null pointer
* RT_ERR_PORT_MASK - Error port mask
* Note:
*
*/
extern rtk_api_ret_t rtk_switch_portmask_L2P_get(rtk_portmask_t *pLogicalPmask, rtk_uint32 *pPhysicalPortmask);
/* Function Name:
* rtk_switch_portmask_P2L_get
* Description:
* Get logical portmask from physical portmask
* Input:
* physicalPortmask - physical port mask
* Output:
* pLogicalPmask - logical port mask
* Return:
* RT_ERR_OK - OK
* RT_ERR_NOT_INIT - Not Initialize
* RT_ERR_NULL_POINTER - Null pointer
* RT_ERR_PORT_MASK - Error port mask
* Note:
*
*/
extern rtk_api_ret_t rtk_switch_portmask_P2L_get(rtk_uint32 physicalPortmask, rtk_portmask_t *pLogicalPmask);
/* Function Name:
* rtk_switch_phyPortMask_get
* Description:
* Get physical portmask
* Input:
* None
* Output:
* None
* Return:
* 0x00 - Not Initialize
* Other value - Physical port mask
* Note:
*
*/
rtk_uint32 rtk_switch_phyPortMask_get(void);
/* Function Name:
* rtk_switch_logPortMask_get
* Description:
* Get Logical portmask
* Input:
* None
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_NOT_INIT - Not Initialize
* RT_ERR_NULL_POINTER - Null pointer
* Note:
*
*/
rtk_api_ret_t rtk_switch_logPortMask_get(rtk_portmask_t *pPortmask);
/* Function Name:
* rtk_switch_init
* Description:
* Set chip to default configuration enviroment
* Input:
* None
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* The API can set chip registers to default configuration for different release chip model.
*/
extern rtk_api_ret_t rtk_switch_init(void);
/* Function Name:
* rtk_switch_portMaxPktLen_set
* Description:
* Set Max packet length
* Input:
* port - Port ID
* speed - Speed
* cfgId - Configuration ID
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error Input
* Note:
*/
extern rtk_api_ret_t rtk_switch_portMaxPktLen_set(rtk_port_t port, rtk_switch_maxPktLen_linkSpeed_t speed, rtk_uint32 cfgId);
/* Function Name:
* rtk_switch_portMaxPktLen_get
* Description:
* Get Max packet length
* Input:
* port - Port ID
* speed - Speed
* Output:
* pCfgId - Configuration ID
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error Input
* Note:
*/
extern rtk_api_ret_t rtk_switch_portMaxPktLen_get(rtk_port_t port, rtk_switch_maxPktLen_linkSpeed_t speed, rtk_uint32 *pCfgId);
/* Function Name:
* rtk_switch_maxPktLenCfg_set
* Description:
* Set Max packet length configuration
* Input:
* cfgId - Configuration ID
* pktLen - Max packet length
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error Input
* Note:
*/
extern rtk_api_ret_t rtk_switch_maxPktLenCfg_set(rtk_uint32 cfgId, rtk_uint32 pktLen);
/* Function Name:
* rtk_switch_maxPktLenCfg_get
* Description:
* Get Max packet length configuration
* Input:
* cfgId - Configuration ID
* pPktLen - Max packet length
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error Input
* Note:
*/
extern rtk_api_ret_t rtk_switch_maxPktLenCfg_get(rtk_uint32 cfgId, rtk_uint32 *pPktLen);
/* Function Name:
* rtk_switch_greenEthernet_set
* Description:
* Set all Ports Green Ethernet state.
* Input:
* enable - Green Ethernet state.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_ENABLE - Invalid enable input.
* Note:
* This API can set all Ports Green Ethernet state.
* The configuration is as following:
* - DISABLE
* - ENABLE
*/
extern rtk_api_ret_t rtk_switch_greenEthernet_set(rtk_enable_t enable);
/* Function Name:
* rtk_switch_greenEthernet_get
* Description:
* Get all Ports Green Ethernet state.
* Input:
* None
* Output:
* pEnable - Green Ethernet state.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* This API can get Green Ethernet state.
*/
extern rtk_api_ret_t rtk_switch_greenEthernet_get(rtk_enable_t *pEnable);
/* Function Name:
* rtk_switch_maxLogicalPort_get
* Description:
* Get Max logical port ID
* Input:
* None
* Output:
* None
* Return:
* Max logical port
* Note:
* This API can get max logical port
*/
extern rtk_port_t rtk_switch_maxLogicalPort_get(void);
/* Function Name:
* rtk_switch_maxMeterId_get
* Description:
* Get Max Meter ID
* Input:
* None
* Output:
* None
* Return:
* 0x00 - Not Initialize
* Other value - Max Meter ID
* Note:
*
*/
extern rtk_uint32 rtk_switch_maxMeterId_get(void);
/* Function Name:
* rtk_switch_maxLutAddrNumber_get
* Description:
* Get Max LUT Address number
* Input:
* None
* Output:
* None
* Return:
* 0x00 - Not Initialize
* Other value - Max LUT Address number
* Note:
*
*/
extern rtk_uint32 rtk_switch_maxLutAddrNumber_get(void);
/* Function Name:
* rtk_switch_isValidTrunkGrpId
* Description:
* Check if trunk group is valid or not
* Input:
* grpId - Group ID
* Output:
* None
* Return:
* RT_ERR_OK - Trunk Group ID is valid
* RT_ERR_LA_TRUNK_ID - Trunk Group ID is not valid
* Note:
*
*/
rtk_uint32 rtk_switch_isValidTrunkGrpId(rtk_uint32 grpId);
#endif

View file

@ -0,0 +1,155 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level type enum definition.
* Feature :
*
*/
#ifndef _RTL8367C_TYPES_H_
#define _RTL8367C_TYPES_H_
//#include <stdio.h>
typedef unsigned long long rtk_uint64;
typedef long long rtk_int64;
typedef unsigned int rtk_uint32;
typedef int rtk_int32;
typedef unsigned short rtk_uint16;
typedef short rtk_int16;
typedef unsigned char rtk_uint8;
typedef char rtk_int8;
#define CONST_T const
#define RTK_TOTAL_NUM_OF_WORD_FOR_1BIT_PORT_LIST 1
#define RTK_MAX_NUM_OF_PORT 8
#define RTK_PORT_ID_MAX (RTK_MAX_NUM_OF_PORT-1)
#define RTK_PHY_ID_MAX (RTK_MAX_NUM_OF_PORT-4)
#define RTK_MAX_PORT_MASK 0xFF
#define RTK_WHOLE_SYSTEM 0xFF
typedef struct rtk_portmask_s
{
rtk_uint32 bits[RTK_TOTAL_NUM_OF_WORD_FOR_1BIT_PORT_LIST];
} rtk_portmask_t;
typedef enum rtk_enable_e
{
DISABLED = 0,
ENABLED,
RTK_ENABLE_END
} rtk_enable_t;
#ifndef ETHER_ADDR_LEN
#define ETHER_ADDR_LEN 6
#endif
/* ethernet address type */
typedef struct rtk_mac_s
{
rtk_uint8 octet[ETHER_ADDR_LEN];
} rtk_mac_t;
typedef rtk_uint32 rtk_pri_t; /* priority vlaue */
typedef rtk_uint32 rtk_qid_t; /* queue id type */
typedef rtk_uint32 rtk_data_t;
typedef rtk_uint32 rtk_dscp_t; /* dscp vlaue */
typedef rtk_uint32 rtk_fid_t; /* filter id type */
typedef rtk_uint32 rtk_vlan_t; /* vlan id type */
typedef rtk_uint32 rtk_mac_cnt_t; /* MAC count type */
typedef rtk_uint32 rtk_meter_id_t; /* meter id type */
typedef rtk_uint32 rtk_rate_t; /* rate type */
typedef enum rtk_port_e
{
UTP_PORT0 = 0,
UTP_PORT1,
UTP_PORT2,
UTP_PORT3,
UTP_PORT4,
UTP_PORT5,
UTP_PORT6,
UTP_PORT7,
EXT_PORT0 = 16,
EXT_PORT1,
EXT_PORT2,
UNDEFINE_PORT = 30,
RTK_PORT_MAX = 31
} rtk_port_t;
#ifndef _RTL_TYPES_H
#if 0
typedef unsigned long long uint64;
typedef long long int64;
typedef unsigned int uint32;
typedef int int32;
typedef unsigned short uint16;
typedef short int16;
typedef unsigned char uint8;
typedef char int8;
#endif
typedef rtk_uint32 ipaddr_t;
typedef rtk_uint32 memaddr;
#ifndef ETHER_ADDR_LEN
#define ETHER_ADDR_LEN 6
#endif
typedef struct ether_addr_s {
rtk_uint8 octet[ETHER_ADDR_LEN];
} ether_addr_t;
#ifdef __KERNEL__
#define rtlglue_printf printk
#else
#define rtlglue_printf printf
#endif
#define PRINT rtlglue_printf
#endif /*_RTL_TYPES_H*/
/* type abstraction */
#ifdef EMBEDDED_SUPPORT
typedef rtk_int16 rtk_api_ret_t;
typedef rtk_int16 ret_t;
typedef rtk_uint32 rtk_u_long;
#else
typedef rtk_int32 rtk_api_ret_t;
typedef rtk_int32 ret_t;
typedef rtk_uint64 rtk_u_long_t;
#endif
#ifndef NULL
#define NULL 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#define CONST const
#endif /* _RTL8367C_TYPES_H_ */

View file

@ -0,0 +1,129 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature :
*
*/
#ifndef _RTL8367C_ASICDRV_H_
#define _RTL8367C_ASICDRV_H_
#include <rtk_types.h>
#include <rtk_error.h>
#include <rtl8367c_reg.h>
#include <rtl8367c_base.h>
#define RTL8367C_REGBITLENGTH 16
#define RTL8367C_REGDATAMAX 0xFFFF
#define RTL8367C_VIDMAX 0xFFF
#define RTL8367C_EVIDMAX 0x1FFF
#define RTL8367C_CVIDXNO 32
#define RTL8367C_CVIDXMAX (RTL8367C_CVIDXNO-1)
#define RTL8367C_PRIMAX 7
#define RTL8367C_DSCPMAX 63
#define RTL8367C_PORTNO 11
#define RTL8367C_PORTIDMAX (RTL8367C_PORTNO-1)
#define RTL8367C_PMSKMAX ((1<<(RTL8367C_PORTNO))-1)
#define RTL8367C_PORTMASK 0x7FF
#define RTL8367C_PHYNO 5
#define RTL8367C_PHYIDMAX (RTL8367C_PHYNO-1)
#define RTL8367C_SVIDXNO 64
#define RTL8367C_SVIDXMAX (RTL8367C_SVIDXNO-1)
#define RTL8367C_MSTIMAX 15
#define RTL8367C_METERNO 64
#define RTL8367C_METERMAX (RTL8367C_METERNO-1)
#define RTL8367C_METERBUCKETSIZEMAX 0xFFFF
#define RTL8367C_QUEUENO 8
#define RTL8367C_QIDMAX (RTL8367C_QUEUENO-1)
#define RTL8367C_PHY_BUSY_CHECK_COUNTER 1000
#define RTL8367C_QOS_GRANULARTY_MAX 0x7FFFF
#define RTL8367C_QOS_GRANULARTY_LSB_MASK 0xFFFF
#define RTL8367C_QOS_GRANULARTY_LSB_OFFSET 0
#define RTL8367C_QOS_GRANULARTY_MSB_MASK 0x70000
#define RTL8367C_QOS_GRANULARTY_MSB_OFFSET 16
#define RTL8367C_QOS_GRANULARTY_UNIT_KBPS 8
#define RTL8367C_QOS_RATE_INPUT_MAX (0x1FFFF * 8)
#define RTL8367C_QOS_RATE_INPUT_MAX_HSG (0x7FFFF * 8)
#define RTL8367C_QOS_RATE_INPUT_MIN 8
#define RTL8367C_QOS_PPS_INPUT_MAX (0x7FFFF)
#define RTL8367C_QOS_PPS_INPUT_MIN 1
#define RTL8367C_QUEUE_MASK 0xFF
#define RTL8367C_EFIDMAX 0x7
#define RTL8367C_FIDMAX 0xF
#define RTL8367C_EAV_SECONDMAX 0xFFFFFFFF
#define RTL8367C_EAV_NANOSECONDMAX 0x3B9AC9FF
/* the above macro is generated by genDotH */
#define RTL8367C_VALID_REG_NO 3869
/*=======================================================================
* Enum
*========================================================================*/
enum RTL8367C_TABLE_ACCESS_OP
{
TB_OP_READ = 0,
TB_OP_WRITE
};
enum RTL8367C_TABLE_ACCESS_TARGET
{
TB_TARGET_ACLRULE = 1,
TB_TARGET_ACLACT,
TB_TARGET_CVLAN,
TB_TARGET_L2,
TB_TARGET_IGMP_GROUP
};
#define RTL8367C_TABLE_ACCESS_REG_DATA(op, target) ((op << 3) | target)
/*=======================================================================
* Structures
*========================================================================*/
#ifdef __cplusplus
extern "C" {
#endif
extern ret_t rtl8367c_setAsicRegBit(rtk_uint32 reg, rtk_uint32 bit, rtk_uint32 value);
extern ret_t rtl8367c_getAsicRegBit(rtk_uint32 reg, rtk_uint32 bit, rtk_uint32 *pValue);
extern ret_t rtl8367c_setAsicRegBits(rtk_uint32 reg, rtk_uint32 bits, rtk_uint32 value);
extern ret_t rtl8367c_getAsicRegBits(rtk_uint32 reg, rtk_uint32 bits, rtk_uint32 *pValue);
extern ret_t rtl8367c_setAsicReg(rtk_uint32 reg, rtk_uint32 value);
extern ret_t rtl8367c_getAsicReg(rtk_uint32 reg, rtk_uint32 *pValue);
#ifdef __cplusplus
}
#endif
#endif /*#ifndef _RTL8367C_ASICDRV_H_*/

View file

@ -0,0 +1,231 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (śg¤T, 08 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : ACL related function drivers
*
*/
#ifndef _RTL8367C_ASICDRV_ACL_H_
#define _RTL8367C_ASICDRV_ACL_H_
#include <rtl8367c_asicdrv.h>
#define RTL8367C_ACLRULENO 96
#define RTL8367C_ACLRULEMAX (RTL8367C_ACLRULENO-1)
#define RTL8367C_ACLRULEFIELDNO 8
#define RTL8367C_ACLTEMPLATENO 5
#define RTL8367C_ACLTYPEMAX (RTL8367C_ACLTEMPLATENO-1)
#define RTL8367C_ACLRULETBLEN 9
#define RTL8367C_ACLACTTBLEN 4
#define RTL8367C_ACLRULETBADDR(type, rule) ((type << 6) | rule)
#define RTL8367C_ACLRULETBADDR2(type, rule) ((type << 5) | (rule + 64))
#define ACL_ACT_CVLAN_ENABLE_MASK 0x1
#define ACL_ACT_SVLAN_ENABLE_MASK 0x2
#define ACL_ACT_PRIORITY_ENABLE_MASK 0x4
#define ACL_ACT_POLICING_ENABLE_MASK 0x8
#define ACL_ACT_FWD_ENABLE_MASK 0x10
#define ACL_ACT_INTGPIO_ENABLE_MASK 0x20
#define RTL8367C_ACLRULETAGBITS 5
#define RTL8367C_ACLRANGENO 16
#define RTL8367C_ACLRANGEMAX (RTL8367C_ACLRANGENO-1)
#define RTL8367C_ACL_PORTRANGEMAX (0xFFFF)
#define RTL8367C_ACL_ACT_TABLE_LEN (4)
enum ACLTCAMTYPES
{
CAREBITS= 0,
DATABITS
};
typedef enum aclFwdAct
{
RTL8367C_ACL_FWD_MIRROR = 0,
RTL8367C_ACL_FWD_REDIRECT,
RTL8367C_ACL_FWD_MIRRORFUNTION,
RTL8367C_ACL_FWD_TRAP,
} rtl8367c_aclFwd_t;
enum ACLFIELDTYPES
{
ACL_UNUSED,
ACL_DMAC0,
ACL_DMAC1,
ACL_DMAC2,
ACL_SMAC0,
ACL_SMAC1,
ACL_SMAC2,
ACL_ETHERTYPE,
ACL_STAG,
ACL_CTAG,
ACL_IP4SIP0 = 0x10,
ACL_IP4SIP1,
ACL_IP4DIP0,
ACL_IP4DIP1,
ACL_IP6SIP0WITHIPV4 = 0x20,
ACL_IP6SIP1WITHIPV4,
ACL_IP6DIP0WITHIPV4 = 0x28,
ACL_IP6DIP1WITHIPV4,
ACL_VIDRANGE = 0x30,
ACL_IPRANGE,
ACL_PORTRANGE,
ACL_FIELD_VALID,
ACL_FIELD_SELECT00 = 0x40,
ACL_FIELD_SELECT01,
ACL_FIELD_SELECT02,
ACL_FIELD_SELECT03,
ACL_FIELD_SELECT04,
ACL_FIELD_SELECT05,
ACL_FIELD_SELECT06,
ACL_FIELD_SELECT07,
ACL_FIELD_SELECT08,
ACL_FIELD_SELECT09,
ACL_FIELD_SELECT10,
ACL_FIELD_SELECT11,
ACL_FIELD_SELECT12,
ACL_FIELD_SELECT13,
ACL_FIELD_SELECT14,
ACL_FIELD_SELECT15,
ACL_TCPSPORT = 0x80,
ACL_TCPDPORT,
ACL_TCPFLAG,
ACL_UDPSPORT,
ACL_UDPDPORT,
ACL_ICMPCODETYPE,
ACL_IGMPTYPE,
ACL_SPORT,
ACL_DPORT,
ACL_IP4TOSPROTO,
ACL_IP4FLAGOFF,
ACL_TCNH,
ACL_CPUTAG,
ACL_L2PAYLOAD,
ACL_IP6SIP0,
ACL_IP6SIP1,
ACL_IP6SIP2,
ACL_IP6SIP3,
ACL_IP6SIP4,
ACL_IP6SIP5,
ACL_IP6SIP6,
ACL_IP6SIP7,
ACL_IP6DIP0,
ACL_IP6DIP1,
ACL_IP6DIP2,
ACL_IP6DIP3,
ACL_IP6DIP4,
ACL_IP6DIP5,
ACL_IP6DIP6,
ACL_IP6DIP7,
ACL_TYPE_END
};
struct acl_rule_smi_st{
rtk_uint16 rule_info;
rtk_uint16 field[RTL8367C_ACLRULEFIELDNO];
};
struct acl_rule_smi_ext_st{
rtk_uint16 rule_info;
};
typedef struct ACLRULESMI{
struct acl_rule_smi_st care_bits;
rtk_uint16 valid:1;
struct acl_rule_smi_st data_bits;
struct acl_rule_smi_ext_st care_bits_ext;
struct acl_rule_smi_ext_st data_bits_ext;
}rtl8367c_aclrulesmi;
struct acl_rule_st{
rtk_uint16 active_portmsk:11;
rtk_uint16 type:3;
rtk_uint16 tag_exist:5;
rtk_uint16 field[RTL8367C_ACLRULEFIELDNO];
};
typedef struct ACLRULE{
struct acl_rule_st data_bits;
rtk_uint16 valid:1;
struct acl_rule_st care_bits;
}rtl8367c_aclrule;
typedef struct rtl8367c_acltemplate_s{
rtk_uint8 field[8];
}rtl8367c_acltemplate_t;
typedef struct acl_act_s{
rtk_uint16 cvidx_cact:7;
rtk_uint16 cact:2;
rtk_uint16 svidx_sact:7;
rtk_uint16 sact:2;
rtk_uint16 aclmeteridx:7;
rtk_uint16 fwdpmask:11;
rtk_uint16 fwdact:2;
rtk_uint16 pridx:7;
rtk_uint16 priact:2;
rtk_uint16 gpio_pin:4;
rtk_uint16 gpio_en:1;
rtk_uint16 aclint:1;
rtk_uint16 cact_ext:2;
rtk_uint16 fwdact_ext:1;
rtk_uint16 tag_fmt:2;
}rtl8367c_acl_act_t;
typedef struct acl_rule_union_s
{
rtl8367c_aclrule aclRule;
rtl8367c_acl_act_t aclAct;
rtk_uint32 aclActCtrl;
rtk_uint32 aclNot;
}rtl8367c_acl_rule_union_t;
extern ret_t rtl8367c_setAsicAcl(rtk_uint32 port, rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicAcl(rtk_uint32 port, rtk_uint32* pEnabled);
extern ret_t rtl8367c_setAsicAclUnmatchedPermit(rtk_uint32 port, rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicAclUnmatchedPermit(rtk_uint32 port, rtk_uint32* pEnabled);
extern ret_t rtl8367c_setAsicAclRule(rtk_uint32 index, rtl8367c_aclrule *pAclRule);
extern ret_t rtl8367c_getAsicAclRule(rtk_uint32 index, rtl8367c_aclrule *pAclRule);
extern ret_t rtl8367c_setAsicAclNot(rtk_uint32 index, rtk_uint32 not);
extern ret_t rtl8367c_getAsicAclNot(rtk_uint32 index, rtk_uint32* pNot);
extern ret_t rtl8367c_setAsicAclTemplate(rtk_uint32 index, rtl8367c_acltemplate_t* pAclType);
extern ret_t rtl8367c_getAsicAclTemplate(rtk_uint32 index, rtl8367c_acltemplate_t *pAclType);
extern ret_t rtl8367c_setAsicAclAct(rtk_uint32 index, rtl8367c_acl_act_t* pAclAct);
extern ret_t rtl8367c_getAsicAclAct(rtk_uint32 index, rtl8367c_acl_act_t *pAclAct);
extern ret_t rtl8367c_setAsicAclActCtrl(rtk_uint32 index, rtk_uint32 aclActCtrl);
extern ret_t rtl8367c_getAsicAclActCtrl(rtk_uint32 index, rtk_uint32 *aclActCtrl);
extern ret_t rtl8367c_setAsicAclPortRange(rtk_uint32 index, rtk_uint32 type, rtk_uint32 upperPort, rtk_uint32 lowerPort);
extern ret_t rtl8367c_getAsicAclPortRange(rtk_uint32 index, rtk_uint32* pType, rtk_uint32* pUpperPort, rtk_uint32* pLowerPort);
extern ret_t rtl8367c_setAsicAclVidRange(rtk_uint32 index, rtk_uint32 type, rtk_uint32 upperVid, rtk_uint32 lowerVid);
extern ret_t rtl8367c_getAsicAclVidRange(rtk_uint32 index, rtk_uint32* pType, rtk_uint32* pUpperVid, rtk_uint32* pLowerVid);
extern ret_t rtl8367c_setAsicAclIpRange(rtk_uint32 index, rtk_uint32 type, ipaddr_t upperIp, ipaddr_t lowerIp);
extern ret_t rtl8367c_getAsicAclIpRange(rtk_uint32 index, rtk_uint32* pType, ipaddr_t* pUpperIp, ipaddr_t* pLowerIp);
extern ret_t rtl8367c_setAsicAclGpioPolarity(rtk_uint32 polarity);
extern ret_t rtl8367c_getAsicAclGpioPolarity(rtk_uint32* pPolarity);
#endif /*_RTL8367C_ASICDRV_ACL_H_*/

View file

@ -0,0 +1,49 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : Proprietary CPU-tag related function drivers
*
*/
#ifndef _RTL8367C_ASICDRV_CPUTAG_H_
#define _RTL8367C_ASICDRV_CPUTAG_H_
#include <rtl8367c_asicdrv.h>
enum CPUTAG_INSERT_MODE
{
CPUTAG_INSERT_TO_ALL = 0,
CPUTAG_INSERT_TO_TRAPPING,
CPUTAG_INSERT_TO_NO,
CPUTAG_INSERT_END
};
extern ret_t rtl8367c_setAsicCputagEnable(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicCputagEnable(rtk_uint32 *pEnabled);
extern ret_t rtl8367c_setAsicCputagTrapPort(rtk_uint32 port);
extern ret_t rtl8367c_getAsicCputagTrapPort(rtk_uint32 *pPort);
extern ret_t rtl8367c_setAsicCputagPortmask(rtk_uint32 portmask);
extern ret_t rtl8367c_getAsicCputagPortmask(rtk_uint32 *pPmsk);
extern ret_t rtl8367c_setAsicCputagInsertMode(rtk_uint32 mode);
extern ret_t rtl8367c_getAsicCputagInsertMode(rtk_uint32 *pMode);
extern ret_t rtl8367c_setAsicCputagPriorityRemapping(rtk_uint32 srcPri, rtk_uint32 newPri);
extern ret_t rtl8367c_getAsicCputagPriorityRemapping(rtk_uint32 srcPri, rtk_uint32 *pNewPri);
extern ret_t rtl8367c_setAsicCputagPosition(rtk_uint32 postion);
extern ret_t rtl8367c_getAsicCputagPosition(rtk_uint32* pPostion);
extern ret_t rtl8367c_setAsicCputagMode(rtk_uint32 mode);
extern ret_t rtl8367c_getAsicCputagMode(rtk_uint32 *pMode);
extern ret_t rtl8367c_setAsicCputagRxMinLength(rtk_uint32 mode);
extern ret_t rtl8367c_getAsicCputagRxMinLength(rtk_uint32 *pMode);
#endif /*#ifndef _RTL8367C_ASICDRV_CPUTAG_H_*/

View file

@ -0,0 +1,52 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : 802.1X related functions
*
*/
#ifndef _RTL8367C_ASICDRV_DOT1X_H_
#define _RTL8367C_ASICDRV_DOT1X_H_
#include <rtl8367c_asicdrv.h>
enum DOT1X_UNAUTH_BEHAV
{
DOT1X_UNAUTH_DROP = 0,
DOT1X_UNAUTH_TRAP,
DOT1X_UNAUTH_GVLAN,
DOT1X_UNAUTH_END
};
extern ret_t rtl8367c_setAsic1xPBEnConfig(rtk_uint32 port, rtk_uint32 enabled);
extern ret_t rtl8367c_getAsic1xPBEnConfig(rtk_uint32 port, rtk_uint32 *pEnabled);
extern ret_t rtl8367c_setAsic1xPBAuthConfig(rtk_uint32 port, rtk_uint32 auth);
extern ret_t rtl8367c_getAsic1xPBAuthConfig(rtk_uint32 port, rtk_uint32 *pAuth);
extern ret_t rtl8367c_setAsic1xPBOpdirConfig(rtk_uint32 port, rtk_uint32 opdir);
extern ret_t rtl8367c_getAsic1xPBOpdirConfig(rtk_uint32 port, rtk_uint32 *pOpdir);
extern ret_t rtl8367c_setAsic1xMBEnConfig(rtk_uint32 port, rtk_uint32 enabled);
extern ret_t rtl8367c_getAsic1xMBEnConfig(rtk_uint32 port, rtk_uint32 *pEnabled);
extern ret_t rtl8367c_setAsic1xMBOpdirConfig(rtk_uint32 opdir);
extern ret_t rtl8367c_getAsic1xMBOpdirConfig(rtk_uint32 *pOpdir);
extern ret_t rtl8367c_setAsic1xProcConfig(rtk_uint32 port, rtk_uint32 proc);
extern ret_t rtl8367c_getAsic1xProcConfig(rtk_uint32 port, rtk_uint32 *pProc);
extern ret_t rtl8367c_setAsic1xGuestVidx(rtk_uint32 index);
extern ret_t rtl8367c_getAsic1xGuestVidx(rtk_uint32 *pIndex);
extern ret_t rtl8367c_setAsic1xGVOpdir(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsic1xGVOpdir(rtk_uint32 *pEnabled);
extern ret_t rtl8367c_setAsic1xTrapPriority(rtk_uint32 priority);
extern ret_t rtl8367c_getAsic1xTrapPriority(rtk_uint32 *pPriority);
#endif /*_RTL8367C_ASICDRV_DOT1X_H_*/

View file

@ -0,0 +1,109 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : Ethernet AV related functions
*
*/
#ifndef _RTL8367C_ASICDRV_EAV_H_
#define _RTL8367C_ASICDRV_EAV_H_
#include <rtl8367c_asicdrv.h>
typedef enum RTL8367C_PTP_TIME_CMD_E
{
PTP_TIME_READ = 0,
PTP_TIME_WRITE,
PTP_TIME_INC,
PTP_TIME_DEC,
PTP_TIME_CMD_END
}RTL8367C_PTP_TIME_CMD;
typedef enum RTL8367C_PTP_TIME_ADJ_E
{
PTP_TIME_ADJ_INC = 0,
PTP_TIME_ADJ_DEC,
PTP_TIME_ADJ_END
}RTL8367C_PTP_TIME_ADJ;
typedef enum RTL8367C_PTP_TIME_CTRL_E
{
PTP_TIME_CTRL_STOP = 0,
PTP_TIME_CTRL_START,
PTP_TIME_CTRL_END
}RTL8367C_PTP_TIME_CTRL;
typedef enum RTL8367C_PTP_INTR_IMRS_E
{
PTP_IMRS_TX_SYNC,
PTP_IMRS_TX_DELAY_REQ,
PTP_IMRS_TX_PDELAY_REQ,
PTP_IMRS_TX_PDELAY_RESP,
PTP_IMRS_RX_SYNC,
PTP_IMRS_RX_DELAY_REQ,
PTP_IMRS_RX_PDELAY_REQ,
PTP_IMRS_RX_PDELAY_RESP,
PTP_IMRS_END,
}RTL8367C_PTP_INTR_IMRS;
typedef enum RTL8367C_PTP_PKT_TYPE_E
{
PTP_PKT_TYPE_TX_SYNC,
PTP_PKT_TYPE_TX_DELAY_REQ,
PTP_PKT_TYPE_TX_PDELAY_REQ,
PTP_PKT_TYPE_TX_PDELAY_RESP,
PTP_PKT_TYPE_RX_SYNC,
PTP_PKT_TYPE_RX_DELAY_REQ,
PTP_PKT_TYPE_RX_PDELAY_REQ,
PTP_PKT_TYPE_RX_PDELAY_RESP,
PTP_PKT_TYPE_END,
}RTL8367C_PTP_PKT_TYPE;
typedef struct rtl8367c_ptp_time_stamp_s{
rtk_uint32 sequence_id;
rtk_uint32 second;
rtk_uint32 nano_second;
}rtl8367c_ptp_time_stamp_t;
#define RTL8367C_PTP_INTR_MASK 0xFF
#define RTL8367C_PTP_PORT_MASK 0x3FF
extern ret_t rtl8367c_setAsicEavMacAddress(ether_addr_t mac);
extern ret_t rtl8367c_getAsicEavMacAddress(ether_addr_t *pMac);
extern ret_t rtl8367c_setAsicEavTpid(rtk_uint32 outerTag, rtk_uint32 innerTag);
extern ret_t rtl8367c_getAsicEavTpid(rtk_uint32* pOuterTag, rtk_uint32* pInnerTag);
extern ret_t rtl8367c_setAsicEavSysTime(rtk_uint32 second, rtk_uint32 nanoSecond);
extern ret_t rtl8367c_getAsicEavSysTime(rtk_uint32* pSecond, rtk_uint32* pNanoSecond);
extern ret_t rtl8367c_setAsicEavSysTimeAdjust(rtk_uint32 type, rtk_uint32 second, rtk_uint32 nanoSecond);
extern ret_t rtl8367c_setAsicEavSysTimeCtrl(rtk_uint32 control);
extern ret_t rtl8367c_getAsicEavSysTimeCtrl(rtk_uint32* pControl);
extern ret_t rtl8367c_setAsicEavInterruptMask(rtk_uint32 imr);
extern ret_t rtl8367c_getAsicEavInterruptMask(rtk_uint32* pImr);
extern ret_t rtl8367c_getAsicEavInterruptStatus(rtk_uint32* pIms);
extern ret_t rtl8367c_setAsicEavPortInterruptStatus(rtk_uint32 port, rtk_uint32 ims);
extern ret_t rtl8367c_getAsicEavPortInterruptStatus(rtk_uint32 port, rtk_uint32* pIms);
extern ret_t rtl8367c_setAsicEavPortEnable(rtk_uint32 port, rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicEavPortEnable(rtk_uint32 port, rtk_uint32 *pEnabled);
extern ret_t rtl8367c_getAsicEavPortTimeStamp(rtk_uint32 port, rtk_uint32 type, rtl8367c_ptp_time_stamp_t* timeStamp);
extern ret_t rtl8367c_setAsicEavTrap(rtk_uint32 port, rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicEavTrap(rtk_uint32 port, rtk_uint32 *pEnabled);
extern ret_t rtl8367c_setAsicEavEnable(rtk_uint32 port, rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicEavEnable(rtk_uint32 port, rtk_uint32 *pEnabled);
extern ret_t rtl8367c_setAsicEavPriRemapping(rtk_uint32 srcpriority, rtk_uint32 priority);
extern ret_t rtl8367c_getAsicEavPriRemapping(rtk_uint32 srcpriority, rtk_uint32 *pPriority);
#endif /*#ifndef _RTL8367C_ASICDRV_EAV_H_*/

View file

@ -0,0 +1,31 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 48989 $
* $Date: 2014-07-01 15:45:24 +0800 (g¤G, 01 ¤C¤ë 2014) $
*
* Purpose : RTL8370 switch high-level API for RTL8367C
* Feature :
*
*/
#ifndef _RTL8367C_ASICDRV_EEE_H_
#define _RTL8367C_ASICDRV_EEE_H_
#include <rtl8367c_asicdrv.h>
#define EEE_OCP_PHY_ADDR (0xA5D0)
extern ret_t rtl8367c_setAsicEee100M(rtk_uint32 port, rtk_uint32 enable);
extern ret_t rtl8367c_getAsicEee100M(rtk_uint32 port, rtk_uint32 *enable);
extern ret_t rtl8367c_setAsicEeeGiga(rtk_uint32 port, rtk_uint32 enable);
extern ret_t rtl8367c_getAsicEeeGiga(rtk_uint32 port, rtk_uint32 *enable);
#endif /*_RTL8367C_ASICDRV_EEE_H_*/

View file

@ -0,0 +1,99 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : Flow control related functions
*
*/
#ifndef _RTL8367C_ASICDRV_FC_H_
#define _RTL8367C_ASICDRV_FC_H_
#include <rtl8367c_asicdrv.h>
#define RTL8367C_PAGE_NUMBER 0x600
enum FLOW_CONTROL_TYPE
{
FC_EGRESS = 0,
FC_INGRESS,
};
enum FC_JUMBO_SIZE
{
FC_JUMBO_SIZE_3K = 0,
FC_JUMBO_SIZE_4K,
FC_JUMBO_SIZE_6K,
FC_JUMBO_SIZE_9K,
FC_JUMBO_SIZE_END,
};
extern ret_t rtl8367c_setAsicFlowControlSelect(rtk_uint32 select);
extern ret_t rtl8367c_getAsicFlowControlSelect(rtk_uint32 *pSelect);
extern ret_t rtl8367c_setAsicFlowControlJumboMode(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicFlowControlJumboMode(rtk_uint32* pEnabled);
extern ret_t rtl8367c_setAsicFlowControlJumboModeSize(rtk_uint32 size);
extern ret_t rtl8367c_getAsicFlowControlJumboModeSize(rtk_uint32* pSize);
extern ret_t rtl8367c_setAsicFlowControlQueueEgressEnable(rtk_uint32 port, rtk_uint32 qid, rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicFlowControlQueueEgressEnable(rtk_uint32 port, rtk_uint32 qid, rtk_uint32* pEnabled);
extern ret_t rtl8367c_setAsicFlowControlDropAll(rtk_uint32 dropall);
extern ret_t rtl8367c_getAsicFlowControlDropAll(rtk_uint32* pDropall);
extern ret_t rtl8367c_setAsicFlowControlPauseAllThreshold(rtk_uint32 threshold);
extern ret_t rtl8367c_getAsicFlowControlPauseAllThreshold(rtk_uint32 *pThreshold);
extern ret_t rtl8367c_setAsicFlowControlSystemThreshold(rtk_uint32 onThreshold, rtk_uint32 offThreshold);
extern ret_t rtl8367c_getAsicFlowControlSystemThreshold(rtk_uint32 *pOnThreshold, rtk_uint32 *pOffThreshold);
extern ret_t rtl8367c_setAsicFlowControlSharedThreshold(rtk_uint32 onThreshold, rtk_uint32 offThreshold);
extern ret_t rtl8367c_getAsicFlowControlSharedThreshold(rtk_uint32 *pOnThreshold, rtk_uint32 *pOffThreshold);
extern ret_t rtl8367c_setAsicFlowControlPortThreshold(rtk_uint32 onThreshold, rtk_uint32 offThreshold);
extern ret_t rtl8367c_getAsicFlowControlPortThreshold(rtk_uint32 *pOnThreshold, rtk_uint32 *pOffThreshold);
extern ret_t rtl8367c_setAsicFlowControlPortPrivateThreshold(rtk_uint32 onThreshold, rtk_uint32 offThreshold);
extern ret_t rtl8367c_getAsicFlowControlPortPrivateThreshold(rtk_uint32 *pOnThreshold, rtk_uint32 *pOffThreshold);
extern ret_t rtl8367c_setAsicFlowControlSystemDropThreshold(rtk_uint32 onThreshold, rtk_uint32 offThreshold);
extern ret_t rtl8367c_getAsicFlowControlSystemDropThreshold(rtk_uint32 *pOnThreshold, rtk_uint32 *pOffThreshold);
extern ret_t rtl8367c_setAsicFlowControlSharedDropThreshold(rtk_uint32 onThreshold, rtk_uint32 offThreshold);
extern ret_t rtl8367c_getAsicFlowControlSharedDropThreshold(rtk_uint32 *pOnThreshold, rtk_uint32 *pOffThreshold);
extern ret_t rtl8367c_setAsicFlowControlPortDropThreshold(rtk_uint32 onThreshold, rtk_uint32 offThreshold);
extern ret_t rtl8367c_getAsicFlowControlPortDropThreshold(rtk_uint32 *pOnThreshold, rtk_uint32 *pOffThreshold);
extern ret_t rtl8367c_setAsicFlowControlPortPrivateDropThreshold(rtk_uint32 onThreshold, rtk_uint32 offThreshold);
extern ret_t rtl8367c_getAsicFlowControlPortPrivateDropThreshold(rtk_uint32 *pOnThreshold, rtk_uint32 *pOffThreshold);
extern ret_t rtl8367c_setAsicFlowControlSystemJumboThreshold(rtk_uint32 onThreshold, rtk_uint32 offThreshold);
extern ret_t rtl8367c_getAsicFlowControlSystemJumboThreshold(rtk_uint32 *pOnThreshold, rtk_uint32 *pOffThreshold);
extern ret_t rtl8367c_setAsicFlowControlSharedJumboThreshold(rtk_uint32 onThreshold, rtk_uint32 offThreshold);
extern ret_t rtl8367c_getAsicFlowControlSharedJumboThreshold(rtk_uint32 *pOnThreshold, rtk_uint32 *pOffThreshold);
extern ret_t rtl8367c_setAsicFlowControlPortJumboThreshold(rtk_uint32 onThreshold, rtk_uint32 offThreshold);
extern ret_t rtl8367c_getAsicFlowControlPortJumboThreshold(rtk_uint32 *pOnThreshold, rtk_uint32 *pOffThreshold);
extern ret_t rtl8367c_setAsicFlowControlPortPrivateJumboThreshold(rtk_uint32 onThreshold, rtk_uint32 offThreshold);
extern ret_t rtl8367c_getAsicFlowControlPortPrivateJumboThreshold(rtk_uint32 *pOnThreshold, rtk_uint32 *pOffThreshold);
extern ret_t rtl8367c_setAsicEgressFlowControlPortDropGap(rtk_uint32 gap);
extern ret_t rtl8367c_getAsicEgressFlowControlPortDropGap(rtk_uint32 *pGap);
extern ret_t rtl8367c_setAsicEgressFlowControlQueueDropGap(rtk_uint32 gap);
extern ret_t rtl8367c_getAsicEgressFlowControlQueueDropGap(rtk_uint32 *pGap);
extern ret_t rtl8367c_setAsicEgressFlowControlPortDropThreshold(rtk_uint32 port, rtk_uint32 threshold);
extern ret_t rtl8367c_getAsicEgressFlowControlPortDropThreshold(rtk_uint32 port, rtk_uint32 *pThreshold);
extern ret_t rtl8367c_setAsicEgressFlowControlQueueDropThreshold(rtk_uint32 qid, rtk_uint32 threshold);
extern ret_t rtl8367c_getAsicEgressFlowControlQueueDropThreshold(rtk_uint32 qid, rtk_uint32 *pThreshold);
extern ret_t rtl8367c_getAsicEgressQueueEmptyPortMask(rtk_uint32 *pPortmask);
extern ret_t rtl8367c_getAsicTotalPage(rtk_uint32 *pPageCount);
extern ret_t rtl8367c_getAsicPulbicPage(rtk_uint32 *pPageCount);
extern ret_t rtl8367c_getAsicMaxTotalPage(rtk_uint32 *pPageCount);
extern ret_t rtl8367c_getAsicMaxPulbicPage(rtk_uint32 *pPageCount);
extern ret_t rtl8367c_getAsicPortPage(rtk_uint32 port, rtk_uint32 *pPageCount);
extern ret_t rtl8367c_getAsicPortPageMax(rtk_uint32 port, rtk_uint32 *pPageCount);
extern ret_t rtl8367c_setAsicFlowControlEgressPortIndep(rtk_uint32 port, rtk_uint32 enable);
extern ret_t rtl8367c_getAsicFlowControlEgressPortIndep(rtk_uint32 port, rtk_uint32 *pEnable);
#endif /*_RTL8367C_ASICDRV_FC_H_*/

View file

@ -0,0 +1,36 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : Green ethernet related functions
*
*/
#ifndef _RTL8367C_ASICDRV_GREEN_H_
#define _RTL8367C_ASICDRV_GREEN_H_
#include <rtl8367c_asicdrv.h>
#include <rtl8367c_asicdrv_phy.h>
#define PHY_POWERSAVING_REG 24
extern ret_t rtl8367c_setAsicGreenTrafficType(rtk_uint32 priority, rtk_uint32 traffictype);
extern ret_t rtl8367c_getAsicGreenTrafficType(rtk_uint32 priority, rtk_uint32* pTraffictype);
extern ret_t rtl8367c_getAsicGreenPortPage(rtk_uint32 port, rtk_uint32* pPage);
extern ret_t rtl8367c_getAsicGreenHighPriorityTraffic(rtk_uint32 port, rtk_uint32* pIndicator);
extern ret_t rtl8367c_setAsicGreenHighPriorityTraffic(rtk_uint32 port);
extern ret_t rtl8367c_setAsicGreenEthernet(rtk_uint32 port, rtk_uint32 green);
extern ret_t rtl8367c_getAsicGreenEthernet(rtk_uint32 port, rtk_uint32* green);
extern ret_t rtl8367c_setAsicPowerSaving(rtk_uint32 phy, rtk_uint32 enable);
extern ret_t rtl8367c_getAsicPowerSaving(rtk_uint32 phy, rtk_uint32* enable);
#endif /*#ifndef _RTL8367C_ASICDRV_GREEN_H_*/

View file

@ -0,0 +1,43 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : Field selector related functions
*
*/
#ifndef _RTL8367C_ASICDRV__HSB_H_
#define _RTL8367C_ASICDRV__HSB_H_
#include <rtl8367c_asicdrv.h>
#define RTL8367C_FIELDSEL_FORMAT_NUMBER (16)
#define RTL8367C_FIELDSEL_MAX_OFFSET (255)
enum FIELDSEL_FORMAT_FORMAT
{
FIELDSEL_FORMAT_DEFAULT = 0,
FIELDSEL_FORMAT_RAW,
FIELDSEL_FORMAT_LLC,
FIELDSEL_FORMAT_IPV4,
FIELDSEL_FORMAT_ARP,
FIELDSEL_FORMAT_IPV6,
FIELDSEL_FORMAT_IPPAYLOAD,
FIELDSEL_FORMAT_L4PAYLOAD,
FIELDSEL_FORMAT_END
};
extern ret_t rtl8367c_setAsicFieldSelector(rtk_uint32 index, rtk_uint32 format, rtk_uint32 offset);
extern ret_t rtl8367c_getAsicFieldSelector(rtk_uint32 index, rtk_uint32* pFormat, rtk_uint32* pOffset);
#endif /*_RTL8367C_ASICDRV__HSB_H_*/

View file

@ -0,0 +1,47 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 38651 $
* $Date: 2016-02-27 14:32:56 +0800 (©P¤T, 17 ¥|¤ë 2016) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : I2C related functions
*
*/
#ifndef _RTL8367C_ASICDRV_I2C_H_
#define _RTL8367C_ASICDRV_I2C_H_
#include <rtk_types.h>
#include <rtl8367c_asicdrv.h>
#define TIMEROUT_FOR_MICROSEMI (0x400)
#define GPIO_INPUT 1
#define GPIO_OUTPUT 2
extern ret_t rtl8367c_setAsicI2C_checkBusIdle(void);
extern ret_t rtl8367c_setAsicI2CStartCmd(void);
extern ret_t rtl8367c_setAsicI2CStopCmd(void);
extern ret_t rtl8367c_setAsicI2CTxOneCharCmd(rtk_uint8 oneChar);
extern ret_t rtl8367c_setAsicI2CcheckRxAck(void);
extern ret_t rtl8367c_setAsicI2CRxOneCharCmd(rtk_uint8 *pValue);
extern ret_t rtl8367c_setAsicI2CTxAckCmd(void);
extern ret_t rtl8367c_setAsicI2CTxNoAckCmd(void);
extern ret_t rtl8367c_setAsicI2CSoftRSTseqCmd(void);
extern ret_t rtl8367c_setAsicI2CGpioPinGroup(rtk_uint32 pinGroup_ID);
extern ret_t rtl8367c_getAsicI2CGpioPinGroup(rtk_uint32 * pPinGroup_ID);
#endif /*#ifndef _RTL8367C_ASICDRV_I2C_H_*/

View file

@ -0,0 +1,169 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (, 08 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : IGMP related functions
*
*/
#ifndef _RTL8367C_ASICDRV_IGMP_H_
#define _RTL8367C_ASICDRV_IGMP_H_
/****************************************************************/
/* Header File inclusion */
/****************************************************************/
#include <rtl8367c_asicdrv.h>
#define RTL8367C_MAX_LEAVE_TIMER (7)
#define RTL8367C_MAX_QUERY_INT (0xFFFF)
#define RTL8367C_MAX_ROB_VAR (7)
#define RTL8367C_IGMP_GOUP_NO (256)
#define RTL8367C_IGMP_MAX_GOUP (0xFF)
#define RTL8367C_IGMP_GRP_BLEN (3)
#define RTL8367C_ROUTER_PORT_INVALID (0xF)
enum RTL8367C_IGMPTABLE_FULL_OP
{
TABLE_FULL_FORWARD = 0,
TABLE_FULL_DROP,
TABLE_FULL_TRAP,
TABLE_FULL_OP_END
};
enum RTL8367C_CRC_ERR_OP
{
CRC_ERR_DROP = 0,
CRC_ERR_TRAP,
CRC_ERR_FORWARD,
CRC_ERR_OP_END
};
enum RTL8367C_IGMP_MLD_PROTOCOL_OP
{
PROTOCOL_OP_ASIC = 0,
PROTOCOL_OP_FLOOD,
PROTOCOL_OP_TRAP,
PROTOCOL_OP_DROP,
PROTOCOL_OP_END
};
enum RTL8367C_IGMP_MLD_BYPASS_GROUP
{
BYPASS_224_0_0_X = 0,
BYPASS_224_0_1_X,
BYPASS_239_255_255_X,
BYPASS_IPV6_00XX,
BYPASS_GROUP_END
};
typedef struct
{
rtk_uint32 p0_timer;
rtk_uint32 p1_timer;
rtk_uint32 p2_timer;
rtk_uint32 p3_timer;
rtk_uint32 p4_timer;
rtk_uint32 p5_timer;
rtk_uint32 p6_timer;
rtk_uint32 p7_timer;
rtk_uint32 p8_timer;
rtk_uint32 p9_timer;
rtk_uint32 p10_timer;
rtk_uint32 report_supp_flag;
}rtl8367c_igmpgroup;
/*
* Copyright (C) 2013 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: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (, 08 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : IGMP related functions
*
*/
#include <rtl8367c_asicdrv_igmp.h>
ret_t rtl8367c_setAsicIgmp(rtk_uint32 enabled);
ret_t rtl8367c_getAsicIgmp(rtk_uint32 *pEnabled);
ret_t rtl8367c_setAsicIpMulticastVlanLeaky(rtk_uint32 port, rtk_uint32 enabled );
ret_t rtl8367c_getAsicIpMulticastVlanLeaky(rtk_uint32 port, rtk_uint32 *pEnabled );
ret_t rtl8367c_setAsicIGMPTableFullOP(rtk_uint32 operation);
ret_t rtl8367c_getAsicIGMPTableFullOP(rtk_uint32 *pOperation);
ret_t rtl8367c_setAsicIGMPCRCErrOP(rtk_uint32 operation);
ret_t rtl8367c_getAsicIGMPCRCErrOP(rtk_uint32 *pOperation);
ret_t rtl8367c_setAsicIGMPFastLeaveEn(rtk_uint32 enabled);
ret_t rtl8367c_getAsicIGMPFastLeaveEn(rtk_uint32 *pEnabled);
ret_t rtl8367c_setAsicIGMPLeaveTimer(rtk_uint32 leave_timer);
ret_t rtl8367c_getAsicIGMPLeaveTimer(rtk_uint32 *pLeave_timer);
ret_t rtl8367c_setAsicIGMPQueryInterval(rtk_uint32 interval);
ret_t rtl8367c_getAsicIGMPQueryInterval(rtk_uint32 *pInterval);
ret_t rtl8367c_setAsicIGMPRobVar(rtk_uint32 rob_var);
ret_t rtl8367c_getAsicIGMPRobVar(rtk_uint32 *pRob_var);
ret_t rtl8367c_setAsicIGMPStaticRouterPort(rtk_uint32 pmsk);
ret_t rtl8367c_getAsicIGMPStaticRouterPort(rtk_uint32 *pMsk);
ret_t rtl8367c_setAsicIGMPAllowDynamicRouterPort(rtk_uint32 pmsk);
ret_t rtl8367c_getAsicIGMPAllowDynamicRouterPort(rtk_uint32 *pPmsk);
ret_t rtl8367c_getAsicIGMPdynamicRouterPort1(rtk_uint32 *pPort, rtk_uint32 *pTimer);
ret_t rtl8367c_getAsicIGMPdynamicRouterPort2(rtk_uint32 *pPort, rtk_uint32 *pTimer);
ret_t rtl8367c_setAsicIGMPSuppression(rtk_uint32 report_supp_enabled, rtk_uint32 leave_supp_enabled);
ret_t rtl8367c_getAsicIGMPSuppression(rtk_uint32 *pReport_supp_enabled, rtk_uint32 *pLeave_supp_enabled);
ret_t rtl8367c_setAsicIGMPQueryRX(rtk_uint32 port, rtk_uint32 allow_query);
ret_t rtl8367c_getAsicIGMPQueryRX(rtk_uint32 port, rtk_uint32 *pAllow_query);
ret_t rtl8367c_setAsicIGMPReportRX(rtk_uint32 port, rtk_uint32 allow_report);
ret_t rtl8367c_getAsicIGMPReportRX(rtk_uint32 port, rtk_uint32 *pAllow_report);
ret_t rtl8367c_setAsicIGMPLeaveRX(rtk_uint32 port, rtk_uint32 allow_leave);
ret_t rtl8367c_getAsicIGMPLeaveRX(rtk_uint32 port, rtk_uint32 *pAllow_leave);
ret_t rtl8367c_setAsicIGMPMRPRX(rtk_uint32 port, rtk_uint32 allow_mrp);
ret_t rtl8367c_getAsicIGMPMRPRX(rtk_uint32 port, rtk_uint32 *pAllow_mrp);
ret_t rtl8367c_setAsicIGMPMcDataRX(rtk_uint32 port, rtk_uint32 allow_mcdata);
ret_t rtl8367c_getAsicIGMPMcDataRX(rtk_uint32 port, rtk_uint32 *pAllow_mcdata);
ret_t rtl8367c_setAsicIGMPv1Opeartion(rtk_uint32 port, rtk_uint32 igmpv1_op);
ret_t rtl8367c_getAsicIGMPv1Opeartion(rtk_uint32 port, rtk_uint32 *pIgmpv1_op);
ret_t rtl8367c_setAsicIGMPv2Opeartion(rtk_uint32 port, rtk_uint32 igmpv2_op);
ret_t rtl8367c_getAsicIGMPv2Opeartion(rtk_uint32 port, rtk_uint32 *pIgmpv2_op);
ret_t rtl8367c_setAsicIGMPv3Opeartion(rtk_uint32 port, rtk_uint32 igmpv3_op);
ret_t rtl8367c_getAsicIGMPv3Opeartion(rtk_uint32 port, rtk_uint32 *pIgmpv3_op);
ret_t rtl8367c_setAsicMLDv1Opeartion(rtk_uint32 port, rtk_uint32 mldv1_op);
ret_t rtl8367c_getAsicMLDv1Opeartion(rtk_uint32 port, rtk_uint32 *pMldv1_op);
ret_t rtl8367c_setAsicMLDv2Opeartion(rtk_uint32 port, rtk_uint32 mldv2_op);
ret_t rtl8367c_getAsicMLDv2Opeartion(rtk_uint32 port, rtk_uint32 *pMldv2_op);
ret_t rtl8367c_setAsicIGMPPortMAXGroup(rtk_uint32 port, rtk_uint32 max_group);
ret_t rtl8367c_getAsicIGMPPortMAXGroup(rtk_uint32 port, rtk_uint32 *pMax_group);
ret_t rtl8367c_getAsicIGMPPortCurrentGroup(rtk_uint32 port, rtk_uint32 *pCurrent_group);
ret_t rtl8367c_getAsicIGMPGroup(rtk_uint32 idx, rtk_uint32 *pValid, rtl8367c_igmpgroup *pGrp);
ret_t rtl8367c_setAsicIpMulticastPortIsoLeaky(rtk_uint32 port, rtk_uint32 enabled);
ret_t rtl8367c_getAsicIpMulticastPortIsoLeaky(rtk_uint32 port, rtk_uint32 *pEnabled);
ret_t rtl8367c_setAsicIGMPReportLeaveFlood(rtk_uint32 flood);
ret_t rtl8367c_getAsicIGMPReportLeaveFlood(rtk_uint32 *pFlood);
ret_t rtl8367c_setAsicIGMPDropLeaveZero(rtk_uint32 drop);
ret_t rtl8367c_getAsicIGMPDropLeaveZero(rtk_uint32 *pDrop);
ret_t rtl8367c_setAsicIGMPBypassStormCTRL(rtk_uint32 bypass);
ret_t rtl8367c_getAsicIGMPBypassStormCTRL(rtk_uint32 *pBypass);
ret_t rtl8367c_setAsicIGMPIsoLeaky(rtk_uint32 leaky);
ret_t rtl8367c_getAsicIGMPIsoLeaky(rtk_uint32 *pLeaky);
ret_t rtl8367c_setAsicIGMPVLANLeaky(rtk_uint32 leaky);
ret_t rtl8367c_getAsicIGMPVLANLeaky(rtk_uint32 *pLeaky);
ret_t rtl8367c_setAsicIGMPBypassGroup(rtk_uint32 bypassType, rtk_uint32 enabled);
ret_t rtl8367c_getAsicIGMPBypassGroup(rtk_uint32 bypassType, rtk_uint32 *pEnabled);
#endif /*#ifndef _RTL8367C_ASICDRV_IGMP_H_*/

View file

@ -0,0 +1,30 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : Ingress bandwidth control related functions
*
*/
#ifndef _RTL8367C_ASICDRV_INBWCTRL_H_
#define _RTL8367C_ASICDRV_INBWCTRL_H_
#include <rtl8367c_asicdrv.h>
extern ret_t rtl8367c_setAsicPortIngressBandwidth(rtk_uint32 port, rtk_uint32 bandwidth, rtk_uint32 preifg, rtk_uint32 enableFC);
extern ret_t rtl8367c_getAsicPortIngressBandwidth(rtk_uint32 port, rtk_uint32* pBandwidth, rtk_uint32* pPreifg, rtk_uint32* pEnableFC );
extern ret_t rtl8367c_setAsicPortIngressBandwidthBypass(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicPortIngressBandwidthBypass(rtk_uint32* pEnabled);
#endif /*_RTL8367C_ASICDRV_INBWCTRL_H_*/

View file

@ -0,0 +1,66 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : Interrupt related functions
*
*/
#ifndef _RTL8367C_ASICDRV_INTERRUPT_H_
#define _RTL8367C_ASICDRV_INTERRUPT_H_
#include <rtl8367c_asicdrv.h>
typedef enum RTL8367C_INTR_IMRS_E
{
IMRS_LINK_CHANGE,
IMRS_METER_EXCEED,
IMRS_L2_LEARN,
IMRS_SPEED_CHANGE,
IMRS_SPECIAL_CONGESTION,
IMRS_GREEN_FEATURE,
IMRS_LOOP_DETECTION,
IMRS_8051,
IMRS_CABLE_DIAG,
IMRS_ACL,
IMRS_RESERVED, /* Unused */
IMRS_SLIENT,
IMRS_END,
}RTL8367C_INTR_IMRS;
typedef enum RTL8367C_INTR_INDICATOR_E
{
INTRST_L2_LEARN = 0,
INTRST_SPEED_CHANGE,
INTRST_SPECIAL_CONGESTION,
INTRST_PORT_LINKDOWN,
INTRST_PORT_LINKUP,
INTRST_METER0_15,
INTRST_METER16_31,
INTRST_RLDP_LOOPED,
INTRST_RLDP_RELEASED,
INTRST_SYS_LEARN,
INTRST_END,
}RTL8367C_INTR_INDICATOR;
extern ret_t rtl8367c_setAsicInterruptPolarity(rtk_uint32 polarity);
extern ret_t rtl8367c_getAsicInterruptPolarity(rtk_uint32* pPolarity);
extern ret_t rtl8367c_setAsicInterruptMask(rtk_uint32 imr);
extern ret_t rtl8367c_getAsicInterruptMask(rtk_uint32* pImr);
extern ret_t rtl8367c_setAsicInterruptStatus(rtk_uint32 ims);
extern ret_t rtl8367c_getAsicInterruptStatus(rtk_uint32* pIms);
extern ret_t rtl8367c_setAsicInterruptRelatedStatus(rtk_uint32 type, rtk_uint32 status);
extern ret_t rtl8367c_getAsicInterruptRelatedStatus(rtk_uint32 type, rtk_uint32* pStatus);
#endif /*#ifndef _RTL8367C_ASICDRV_INTERRUPT_H_*/

View file

@ -0,0 +1,138 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : LED related functions
*
*/
#ifndef _RTL8367C_ASICDRV_LED_H_
#define _RTL8367C_ASICDRV_LED_H_
#include <rtl8367c_asicdrv.h>
#define RTL8367C_LEDGROUPNO 3
#define RTL8367C_LEDGROUPMASK 0x7
#define RTL8367C_LED_FORCE_MODE_BASE RTL8367C_REG_CPU_FORCE_LED0_CFG0
#define RTL8367C_LED_FORCE_CTRL RTL8367C_REG_CPU_FORCE_LED_CFG
enum RTL8367C_LEDOP{
LEDOP_SCAN0=0,
LEDOP_SCAN1,
LEDOP_PARALLEL,
LEDOP_SERIAL,
LEDOP_END,
};
enum RTL8367C_LEDSERACT{
LEDSERACT_HIGH=0,
LEDSERACT_LOW,
LEDSERACT_MAX,
};
enum RTL8367C_LEDSER{
LEDSER_16G=0,
LEDSER_8G,
LEDSER_MAX,
};
enum RTL8367C_LEDCONF{
LEDCONF_LEDOFF=0,
LEDCONF_DUPCOL,
LEDCONF_LINK_ACT,
LEDCONF_SPD1000,
LEDCONF_SPD100,
LEDCONF_SPD10,
LEDCONF_SPD1000ACT,
LEDCONF_SPD100ACT,
LEDCONF_SPD10ACT,
LEDCONF_SPD10010ACT,
LEDCONF_LOOPDETECT,
LEDCONF_EEE,
LEDCONF_LINKRX,
LEDCONF_LINKTX,
LEDCONF_MASTER,
LEDCONF_ACT,
LEDCONF_END
};
enum RTL8367C_LEDBLINKRATE{
LEDBLINKRATE_32MS=0,
LEDBLINKRATE_64MS,
LEDBLINKRATE_128MS,
LEDBLINKRATE_256MS,
LEDBLINKRATE_512MS,
LEDBLINKRATE_1024MS,
LEDBLINKRATE_48MS,
LEDBLINKRATE_96MS,
LEDBLINKRATE_END,
};
enum RTL8367C_LEDFORCEMODE{
LEDFORCEMODE_NORMAL=0,
LEDFORCEMODE_BLINK,
LEDFORCEMODE_OFF,
LEDFORCEMODE_ON,
LEDFORCEMODE_END,
};
enum RTL8367C_LEDFORCERATE{
LEDFORCERATE_512MS=0,
LEDFORCERATE_1024MS,
LEDFORCERATE_2048MS,
LEDFORCERATE_NORMAL,
LEDFORCERATE_END,
};
enum RTL8367C_LEDMODE
{
RTL8367C_LED_MODE_0 = 0,
RTL8367C_LED_MODE_1,
RTL8367C_LED_MODE_2,
RTL8367C_LED_MODE_3,
RTL8367C_LED_MODE_END
};
extern ret_t rtl8367c_setAsicLedIndicateInfoConfig(rtk_uint32 ledno, rtk_uint32 config);
extern ret_t rtl8367c_getAsicLedIndicateInfoConfig(rtk_uint32 ledno, rtk_uint32* pConfig);
extern ret_t rtl8367c_setAsicForceLed(rtk_uint32 port, rtk_uint32 group, rtk_uint32 mode);
extern ret_t rtl8367c_getAsicForceLed(rtk_uint32 port, rtk_uint32 group, rtk_uint32* pMode);
extern ret_t rtl8367c_setAsicForceGroupLed(rtk_uint32 groupmask, rtk_uint32 mode);
extern ret_t rtl8367c_getAsicForceGroupLed(rtk_uint32* groupmask, rtk_uint32* pMode);
extern ret_t rtl8367c_setAsicLedBlinkRate(rtk_uint32 blinkRate);
extern ret_t rtl8367c_getAsicLedBlinkRate(rtk_uint32* pBlinkRate);
extern ret_t rtl8367c_setAsicLedForceBlinkRate(rtk_uint32 blinkRate);
extern ret_t rtl8367c_getAsicLedForceBlinkRate(rtk_uint32* pBlinkRate);
extern ret_t rtl8367c_setAsicLedGroupMode(rtk_uint32 mode);
extern ret_t rtl8367c_getAsicLedGroupMode(rtk_uint32* pMode);
extern ret_t rtl8367c_setAsicLedGroupEnable(rtk_uint32 group, rtk_uint32 portmask);
extern ret_t rtl8367c_getAsicLedGroupEnable(rtk_uint32 group, rtk_uint32 *portmask);
extern ret_t rtl8367c_setAsicLedOperationMode(rtk_uint32 mode);
extern ret_t rtl8367c_getAsicLedOperationMode(rtk_uint32 *mode);
extern ret_t rtl8367c_setAsicLedSerialModeConfig(rtk_uint32 active, rtk_uint32 serimode);
extern ret_t rtl8367c_getAsicLedSerialModeConfig(rtk_uint32 *active, rtk_uint32 *serimode);
extern ret_t rtl8367c_setAsicLedOutputEnable(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicLedOutputEnable(rtk_uint32 *ptr_enabled);
extern ret_t rtl8367c_setAsicLedSerialOutput(rtk_uint32 output, rtk_uint32 pmask);
extern ret_t rtl8367c_getAsicLedSerialOutput(rtk_uint32 *pOutput, rtk_uint32 *pPmask);
#endif /*#ifndef _RTL8367C_ASICDRV_LED_H_*/

View file

@ -0,0 +1,159 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : LUT related functions
*
*/
#ifndef _RTL8367C_ASICDRV_LUT_H_
#define _RTL8367C_ASICDRV_LUT_H_
#include <rtl8367c_asicdrv.h>
#define RTL8367C_LUT_AGETIMERMAX (7)
#define RTL8367C_LUT_AGESPEEDMAX (3)
#define RTL8367C_LUT_LEARNLIMITMAX (0x1040)
#define RTL8367C_LUT_ADDRMAX (0x103F)
#define RTL8367C_LUT_IPMCGRP_TABLE_MAX (0x3F)
#define RTL8367C_LUT_ENTRY_SIZE (6)
#define RTL8367C_LUT_BUSY_CHECK_NO (10)
#define RTL8367C_LUT_TABLE_SIZE (6)
enum RTL8367C_LUTHASHMETHOD{
LUTHASHMETHOD_SVL=0,
LUTHASHMETHOD_IVL,
LUTHASHMETHOD_END,
};
enum RTL8367C_LRNOVERACT{
LRNOVERACT_FORWARD=0,
LRNOVERACT_DROP,
LRNOVERACT_TRAP,
LRNOVERACT_END,
};
enum RTL8367C_LUTREADMETHOD{
LUTREADMETHOD_MAC =0,
LUTREADMETHOD_ADDRESS,
LUTREADMETHOD_NEXT_ADDRESS,
LUTREADMETHOD_NEXT_L2UC,
LUTREADMETHOD_NEXT_L2MC,
LUTREADMETHOD_NEXT_L3MC,
LUTREADMETHOD_NEXT_L2L3MC,
LUTREADMETHOD_NEXT_L2UCSPA,
};
enum RTL8367C_FLUSHMODE
{
FLUSHMDOE_PORT = 0,
FLUSHMDOE_VID,
FLUSHMDOE_FID,
FLUSHMDOE_END,
};
enum RTL8367C_FLUSHTYPE
{
FLUSHTYPE_DYNAMIC = 0,
FLUSHTYPE_BOTH,
FLUSHTYPE_END,
};
typedef struct LUTTABLE{
ipaddr_t sip;
ipaddr_t dip;
ether_addr_t mac;
rtk_uint16 ivl_svl:1;
rtk_uint16 cvid_fid:12;
rtk_uint16 fid:4;
rtk_uint16 efid:3;
rtk_uint16 nosalearn:1;
rtk_uint16 da_block:1;
rtk_uint16 sa_block:1;
rtk_uint16 auth:1;
rtk_uint16 lut_pri:3;
rtk_uint16 sa_en:1;
rtk_uint16 fwd_en:1;
rtk_uint16 mbr:11;
rtk_uint16 spa:4;
rtk_uint16 age:3;
rtk_uint16 l3lookup:1;
rtk_uint16 igmp_asic:1;
rtk_uint16 igmpidx:8;
rtk_uint16 lookup_hit:1;
rtk_uint16 lookup_busy:1;
rtk_uint16 address:13;
rtk_uint16 l3vidlookup:1;
rtk_uint16 l3_vid:12;
rtk_uint16 wait_time;
}rtl8367c_luttb;
extern ret_t rtl8367c_setAsicLutIpMulticastLookup(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicLutIpMulticastLookup(rtk_uint32* pEnabled);
extern ret_t rtl8367c_setAsicLutIpMulticastVidLookup(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicLutIpMulticastVidLookup(rtk_uint32* pEnabled);
extern ret_t rtl8367c_setAsicLutAgeTimerSpeed(rtk_uint32 timer, rtk_uint32 speed);
extern ret_t rtl8367c_getAsicLutAgeTimerSpeed(rtk_uint32* pTimer, rtk_uint32* pSpeed);
extern ret_t rtl8367c_setAsicLutCamTbUsage(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicLutCamTbUsage(rtk_uint32* pEnabled);
extern ret_t rtl8367c_getAsicLutCamType(rtk_uint32* pType);
extern ret_t rtl8367c_setAsicLutLearnLimitNo(rtk_uint32 port, rtk_uint32 number);
extern ret_t rtl8367c_getAsicLutLearnLimitNo(rtk_uint32 port, rtk_uint32* pNumber);
extern ret_t rtl8367c_setAsicSystemLutLearnLimitNo(rtk_uint32 number);
extern ret_t rtl8367c_getAsicSystemLutLearnLimitNo(rtk_uint32 *pNumber);
extern ret_t rtl8367c_setAsicLutLearnOverAct(rtk_uint32 action);
extern ret_t rtl8367c_getAsicLutLearnOverAct(rtk_uint32* pAction);
extern ret_t rtl8367c_setAsicSystemLutLearnOverAct(rtk_uint32 action);
extern ret_t rtl8367c_getAsicSystemLutLearnOverAct(rtk_uint32 *pAction);
extern ret_t rtl8367c_setAsicSystemLutLearnPortMask(rtk_uint32 portmask);
extern ret_t rtl8367c_getAsicSystemLutLearnPortMask(rtk_uint32 *pPortmask);
extern ret_t rtl8367c_setAsicL2LookupTb(rtl8367c_luttb *pL2Table);
extern ret_t rtl8367c_getAsicL2LookupTb(rtk_uint32 method, rtl8367c_luttb *pL2Table);
extern ret_t rtl8367c_getAsicLutLearnNo(rtk_uint32 port, rtk_uint32* pNumber);
extern ret_t rtl8367c_setAsicLutIpLookupMethod(rtk_uint32 type);
extern ret_t rtl8367c_getAsicLutIpLookupMethod(rtk_uint32* pType);
extern ret_t rtl8367c_setAsicLutForceFlush(rtk_uint32 portmask);
extern ret_t rtl8367c_getAsicLutForceFlushStatus(rtk_uint32 *pPortmask);
extern ret_t rtl8367c_setAsicLutFlushMode(rtk_uint32 mode);
extern ret_t rtl8367c_getAsicLutFlushMode(rtk_uint32* pMode);
extern ret_t rtl8367c_setAsicLutFlushType(rtk_uint32 type);
extern ret_t rtl8367c_getAsicLutFlushType(rtk_uint32* pType);
extern ret_t rtl8367c_setAsicLutFlushVid(rtk_uint32 vid);
extern ret_t rtl8367c_getAsicLutFlushVid(rtk_uint32* pVid);
extern ret_t rtl8367c_setAsicLutFlushFid(rtk_uint32 fid);
extern ret_t rtl8367c_getAsicLutFlushFid(rtk_uint32* pFid);
extern ret_t rtl8367c_setAsicLutDisableAging(rtk_uint32 port, rtk_uint32 disabled);
extern ret_t rtl8367c_getAsicLutDisableAging(rtk_uint32 port, rtk_uint32 *pDisabled);
extern ret_t rtl8367c_setAsicLutIPMCGroup(rtk_uint32 index, ipaddr_t group_addr, rtk_uint32 vid, rtk_uint32 pmask, rtk_uint32 valid);
extern ret_t rtl8367c_getAsicLutIPMCGroup(rtk_uint32 index, ipaddr_t *pGroup_addr, rtk_uint32 *pVid, rtk_uint32 *pPmask, rtk_uint32 *pValid);
extern ret_t rtl8367c_setAsicLutLinkDownForceAging(rtk_uint32 enable);
extern ret_t rtl8367c_getAsicLutLinkDownForceAging(rtk_uint32 *pEnable);
extern ret_t rtl8367c_setAsicLutFlushAll(void);
extern ret_t rtl8367c_getAsicLutFlushAllStatus(rtk_uint32 *pBusyStatus);
extern ret_t rtl8367c_setAsicLutIpmcFwdRouterPort(rtk_uint32 enable);
extern ret_t rtl8367c_getAsicLutIpmcFwdRouterPort(rtk_uint32 *pEnable);
#endif /*_RTL8367C_ASICDRV_LUT_H_*/

View file

@ -0,0 +1,34 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : Shared meter related functions
*
*/
#ifndef _RTL8367C_ASICDRV_METER_H_
#define _RTL8367C_ASICDRV_METER_H_
#include <rtl8367c_asicdrv.h>
extern ret_t rtl8367c_setAsicShareMeter(rtk_uint32 index, rtk_uint32 rate, rtk_uint32 ifg);
extern ret_t rtl8367c_getAsicShareMeter(rtk_uint32 index, rtk_uint32 *pRate, rtk_uint32 *pIfg);
extern ret_t rtl8367c_setAsicShareMeterBucketSize(rtk_uint32 index, rtk_uint32 lbThreshold);
extern ret_t rtl8367c_getAsicShareMeterBucketSize(rtk_uint32 index, rtk_uint32 *pLbThreshold);
extern ret_t rtl8367c_setAsicShareMeterType(rtk_uint32 index, rtk_uint32 type);
extern ret_t rtl8367c_getAsicShareMeterType(rtk_uint32 index, rtk_uint32 *pType);
extern ret_t rtl8367c_setAsicMeterExceedStatus(rtk_uint32 index);
extern ret_t rtl8367c_getAsicMeterExceedStatus(rtk_uint32 index, rtk_uint32* pStatus);
#endif /*_RTL8367C_ASICDRV_FC_H_*/

View file

@ -0,0 +1,133 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : MIB related functions
*
*/
#ifndef _RTL8367C_ASICDRV_MIB_H_
#define _RTL8367C_ASICDRV_MIB_H_
#include <rtl8367c_asicdrv.h>
#define RTL8367C_MIB_PORT_OFFSET (0x7C)
#define RTL8367C_MIB_LEARNENTRYDISCARD_OFFSET (0x420)
#define RTL8367C_MAX_LOG_CNT_NUM (32)
#define RTL8367C_MIB_MAX_LOG_CNT_IDX (RTL8367C_MAX_LOG_CNT_NUM - 1)
#define RTL8367C_MIB_LOG_CNT_OFFSET (0x3E0)
#define RTL8367C_MIB_MAX_LOG_MODE_IDX (16-1)
typedef enum RTL8367C_MIBCOUNTER_E{
/* RX */
ifInOctets = 0,
dot3StatsFCSErrors,
dot3StatsSymbolErrors,
dot3InPauseFrames,
dot3ControlInUnknownOpcodes,
etherStatsFragments,
etherStatsJabbers,
ifInUcastPkts,
etherStatsDropEvents,
ifInMulticastPkts,
ifInBroadcastPkts,
inMldChecksumError,
inIgmpChecksumError,
inMldSpecificQuery,
inMldGeneralQuery,
inIgmpSpecificQuery,
inIgmpGeneralQuery,
inMldLeaves,
inIgmpLeaves,
/* TX/RX */
etherStatsOctets,
etherStatsUnderSizePkts,
etherOversizeStats,
etherStatsPkts64Octets,
etherStatsPkts65to127Octets,
etherStatsPkts128to255Octets,
etherStatsPkts256to511Octets,
etherStatsPkts512to1023Octets,
etherStatsPkts1024to1518Octets,
/* TX */
ifOutOctets,
dot3StatsSingleCollisionFrames,
dot3StatMultipleCollisionFrames,
dot3sDeferredTransmissions,
dot3StatsLateCollisions,
etherStatsCollisions,
dot3StatsExcessiveCollisions,
dot3OutPauseFrames,
ifOutDiscards,
/* ALE */
dot1dTpPortInDiscards,
ifOutUcastPkts,
ifOutMulticastPkts,
ifOutBroadcastPkts,
outOampduPkts,
inOampduPkts,
inIgmpJoinsSuccess,
inIgmpJoinsFail,
inMldJoinsSuccess,
inMldJoinsFail,
inReportSuppressionDrop,
inLeaveSuppressionDrop,
outIgmpReports,
outIgmpLeaves,
outIgmpGeneralQuery,
outIgmpSpecificQuery,
outMldReports,
outMldLeaves,
outMldGeneralQuery,
outMldSpecificQuery,
inKnownMulticastPkts,
/*Device only */
dot1dTpLearnedEntryDiscards,
RTL8367C_MIBS_NUMBER,
}RTL8367C_MIBCOUNTER;
extern ret_t rtl8367c_setAsicMIBsCounterReset(rtk_uint32 greset, rtk_uint32 qmreset, rtk_uint32 pmask);
extern ret_t rtl8367c_getAsicMIBsCounter(rtk_uint32 port,RTL8367C_MIBCOUNTER mibIdx, rtk_uint64* pCounter);
extern ret_t rtl8367c_getAsicMIBsLogCounter(rtk_uint32 index, rtk_uint32 *pCounter);
extern ret_t rtl8367c_getAsicMIBsControl(rtk_uint32* pMask);
extern ret_t rtl8367c_setAsicMIBsResetValue(rtk_uint32 value);
extern ret_t rtl8367c_getAsicMIBsResetValue(rtk_uint32* value);
extern ret_t rtl8367c_setAsicMIBsUsageMode(rtk_uint32 mode);
extern ret_t rtl8367c_getAsicMIBsUsageMode(rtk_uint32* pMode);
extern ret_t rtl8367c_setAsicMIBsTimer(rtk_uint32 timer);
extern ret_t rtl8367c_getAsicMIBsTimer(rtk_uint32* pTimer);
extern ret_t rtl8367c_setAsicMIBsLoggingMode(rtk_uint32 index, rtk_uint32 mode);
extern ret_t rtl8367c_getAsicMIBsLoggingMode(rtk_uint32 index, rtk_uint32* pMode);
extern ret_t rtl8367c_setAsicMIBsLoggingType(rtk_uint32 index, rtk_uint32 type);
extern ret_t rtl8367c_getAsicMIBsLoggingType(rtk_uint32 index, rtk_uint32* pType);
extern ret_t rtl8367c_setAsicMIBsResetLoggingCounter(rtk_uint32 index);
extern ret_t rtl8367c_setAsicMIBsLength(rtk_uint32 txLengthMode, rtk_uint32 rxLengthMode);
extern ret_t rtl8367c_getAsicMIBsLength(rtk_uint32 *pTxLengthMode, rtk_uint32 *pRxLengthMode);
#endif /*#ifndef _RTL8367C_ASICDRV_MIB_H_*/

View file

@ -0,0 +1,49 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : Port mirror related functions
*
*/
#ifndef _RTL8367C_ASICDRV_MIRROR_H_
#define _RTL8367C_ASICDRV_MIRROR_H_
#include <rtl8367c_asicdrv.h>
extern ret_t rtl8367c_setAsicPortMirror(rtk_uint32 source, rtk_uint32 monitor);
extern ret_t rtl8367c_getAsicPortMirror(rtk_uint32 *pSource, rtk_uint32 *pMonitor);
extern ret_t rtl8367c_setAsicPortMirrorRxFunction(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicPortMirrorRxFunction(rtk_uint32* pEnabled);
extern ret_t rtl8367c_setAsicPortMirrorTxFunction(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicPortMirrorTxFunction(rtk_uint32* pEnabled);
extern ret_t rtl8367c_setAsicPortMirrorIsolation(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicPortMirrorIsolation(rtk_uint32* pEnabled);
extern ret_t rtl8367c_setAsicPortMirrorPriority(rtk_uint32 priority);
extern ret_t rtl8367c_getAsicPortMirrorPriority(rtk_uint32* pPriority);
extern ret_t rtl8367c_setAsicPortMirrorMask(rtk_uint32 SourcePortmask);
extern ret_t rtl8367c_getAsicPortMirrorMask(rtk_uint32 *pSourcePortmask);
extern ret_t rtl8367c_setAsicPortMirrorVlanRxLeaky(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicPortMirrorVlanRxLeaky(rtk_uint32* pEnabled);
extern ret_t rtl8367c_setAsicPortMirrorVlanTxLeaky(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicPortMirrorVlanTxLeaky(rtk_uint32* pEnabled);
extern ret_t rtl8367c_setAsicPortMirrorIsolationRxLeaky(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicPortMirrorIsolationRxLeaky(rtk_uint32* pEnabled);
extern ret_t rtl8367c_setAsicPortMirrorIsolationTxLeaky(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicPortMirrorIsolationTxLeaky(rtk_uint32* pEnabled);
extern ret_t rtl8367c_setAsicPortMirrorRealKeep(rtk_uint32 mode);
extern ret_t rtl8367c_getAsicPortMirrorRealKeep(rtk_uint32* pMode);
extern ret_t rtl8367c_setAsicPortMirrorOverride(rtk_uint32 rxMirror, rtk_uint32 txMirror, rtk_uint32 aclMirror);
extern ret_t rtl8367c_getAsicPortMirrorOverride(rtk_uint32 *pRxMirror, rtk_uint32 *pTxMirror, rtk_uint32 *pAclMirror);
#endif /*#ifndef _RTL8367C_ASICDRV_MIRROR_H_*/

View file

@ -0,0 +1,34 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : Miscellaneous functions
*
*/
#ifndef _RTL8367C_ASICDRV_MISC_H_
#define _RTL8367C_ASICDRV_MISC_H_
#include <rtl8367c_asicdrv.h>
extern ret_t rtl8367c_setAsicMacAddress(ether_addr_t mac);
extern ret_t rtl8367c_getAsicMacAddress(ether_addr_t *pMac);
extern ret_t rtl8367c_getAsicDebugInfo(rtk_uint32 port, rtk_uint32 *pDebugifo);
extern ret_t rtl8367c_setAsicPortJamMode(rtk_uint32 mode);
extern ret_t rtl8367c_getAsicPortJamMode(rtk_uint32* pMode);
extern ret_t rtl8367c_setAsicMaxLengthCfg(rtk_uint32 cfgId, rtk_uint32 maxLength);
extern ret_t rtl8367c_getAsicMaxLengthCfg(rtk_uint32 cfgId, rtk_uint32 *pMaxLength);
extern ret_t rtl8367c_setAsicMaxLength(rtk_uint32 port, rtk_uint32 type, rtk_uint32 cfgId);
extern ret_t rtl8367c_getAsicMaxLength(rtk_uint32 port, rtk_uint32 type, rtk_uint32 *pCfgId);
#endif /*_RTL8367C_ASICDRV_MISC_H_*/

View file

@ -0,0 +1,47 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 42321 $
* $Date: 2013-08-26 13:51:29 +0800 (g¤@, 26 ¤K¤ë 2013) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : OAM related functions
*
*/
#ifndef _RTL8367C_ASICDRV_OAM_H_
#define _RTL8367C_ASICDRV_OAM_H_
#include <rtl8367c_asicdrv.h>
enum OAMPARACT
{
OAM_PARFWD = 0,
OAM_PARLB,
OAM_PARDISCARD,
OAM_PARFWDCPU
};
enum OAMMULACT
{
OAM_MULFWD = 0,
OAM_MULDISCARD,
OAM_MULCPU
};
extern ret_t rtl8367c_setAsicOamParser(rtk_uint32 port, rtk_uint32 parser);
extern ret_t rtl8367c_getAsicOamParser(rtk_uint32 port, rtk_uint32* pParser);
extern ret_t rtl8367c_setAsicOamMultiplexer(rtk_uint32 port, rtk_uint32 multiplexer);
extern ret_t rtl8367c_getAsicOamMultiplexer(rtk_uint32 port, rtk_uint32* pMultiplexer);
extern ret_t rtl8367c_setAsicOamCpuPri(rtk_uint32 priority);
extern ret_t rtl8367c_getAsicOamCpuPri(rtk_uint32 *pPriority);
extern ret_t rtl8367c_setAsicOamEnable(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicOamEnable(rtk_uint32 *pEnabled);
#endif /*_RTL8367C_ASICDRV_OAM_H_*/

View file

@ -0,0 +1,43 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : PHY related functions
*
*/
#ifndef _RTL8367C_ASICDRV_PHY_H_
#define _RTL8367C_ASICDRV_PHY_H_
#include <rtl8367c_asicdrv.h>
#define RTL8367C_PHY_REGNOMAX 0x1F
#define RTL8367C_PHY_EXTERNALMAX 0x7
#define RTL8367C_PHY_BASE 0x2000
#define RTL8367C_PHY_EXT_BASE 0xA000
#define RTL8367C_PHY_OFFSET 5
#define RTL8367C_PHY_EXT_OFFSET 9
#define RTL8367C_PHY_PAGE_ADDRESS 31
extern ret_t rtl8367c_setAsicPHYReg(rtk_uint32 phyNo, rtk_uint32 phyAddr, rtk_uint32 regData );
extern ret_t rtl8367c_getAsicPHYReg(rtk_uint32 phyNo, rtk_uint32 phyAddr, rtk_uint32* pRegData );
extern ret_t rtl8367c_setAsicPHYOCPReg(rtk_uint32 phyNo, rtk_uint32 ocpAddr, rtk_uint32 ocpData );
extern ret_t rtl8367c_getAsicPHYOCPReg(rtk_uint32 phyNo, rtk_uint32 ocpAddr, rtk_uint32 *pRegData );
extern ret_t rtl8367c_setAsicSdsReg(rtk_uint32 sdsId, rtk_uint32 sdsReg, rtk_uint32 sdsPage, rtk_uint32 value);
extern ret_t rtl8367c_getAsicSdsReg(rtk_uint32 sdsId, rtk_uint32 sdsReg, rtk_uint32 sdsPage, rtk_uint32 *value);
#endif /*#ifndef _RTL8367C_ASICDRV_PHY_H_*/

View file

@ -0,0 +1,237 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76333 $
* $Date: 2017-03-09 09:33:15 +0800 (g¥|, 09 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : Port security related functions
*
*/
#ifndef _RTL8367C_ASICDRV_PORTSECURITY_H_
#define _RTL8367C_ASICDRV_PORTSECURITY_H_
#include <rtl8367c_asicdrv.h>
#include <rtl8367c_asicdrv_unknownMulticast.h>
#include <rtl8367c_asicdrv_phy.h>
/****************************************************************/
/* Type Definition */
/****************************************************************/
#define RTL8367C_MAC7 7
#define RTL8367C_EXTNO 3
#define RTL8367C_RTCT_PAGE (11)
#define RTL8367C_RTCT_RESULT_A_REG (27)
#define RTL8367C_RTCT_RESULT_B_REG (28)
#define RTL8367C_RTCT_RESULT_C_REG (29)
#define RTL8367C_RTCT_RESULT_D_REG (30)
#define RTL8367C_RTCT_STATUS_REG (26)
enum L2_SECURITY_BEHAVE
{
L2_BEHAVE_FLOODING = 0,
L2_BEHAVE_DROP,
L2_BEHAVE_TRAP,
L2_BEHAVE_END
};
enum L2_UNDA_BEHAVE
{
L2_UNDA_BEHAVE_FLOODING_PMASK = 0,
L2_UNDA_BEHAVE_DROP,
L2_UNDA_BEHAVE_TRAP,
L2_UNDA_BEHAVE_FLOODING,
L2_UNDA_BEHAVE_END
};
enum L2_SECURITY_SA_BEHAVE
{
L2_BEHAVE_SA_FLOODING = 0,
L2_BEHAVE_SA_DROP,
L2_BEHAVE_SA_TRAP,
L2_BEHAVE_SA_COPY28051,
L2_BEHAVE_SA_END
};
/* enum for port current link speed */
enum SPEEDMODE
{
SPD_10M = 0,
SPD_100M,
SPD_1000M,
SPD_2500M
};
/* enum for mac link mode */
enum LINKMODE
{
MAC_NORMAL = 0,
MAC_FORCE,
};
/* enum for port current link duplex mode */
enum DUPLEXMODE
{
HALF_DUPLEX = 0,
FULL_DUPLEX
};
/* enum for port current MST mode */
enum MSTMODE
{
SLAVE_MODE= 0,
MASTER_MODE
};
enum EXTMODE
{
EXT_DISABLE = 0,
EXT_RGMII,
EXT_MII_MAC,
EXT_MII_PHY,
EXT_TMII_MAC,
EXT_TMII_PHY,
EXT_GMII,
EXT_RMII_MAC,
EXT_RMII_PHY,
EXT_SGMII,
EXT_HSGMII,
EXT_1000X_100FX,
EXT_1000X,
EXT_100FX,
EXT_RGMII_2,
EXT_MII_MAC_2,
EXT_MII_PHY_2,
EXT_TMII_MAC_2,
EXT_TMII_PHY_2,
EXT_RMII_MAC_2,
EXT_RMII_PHY_2,
EXT_END
};
enum DOSTYPE
{
DOS_DAEQSA = 0,
DOS_LANDATTACKS,
DOS_BLATATTACKS,
DOS_SYNFINSCAN,
DOS_XMASCAN,
DOS_NULLSCAN,
DOS_SYN1024,
DOS_TCPSHORTHDR,
DOS_TCPFRAGERROR,
DOS_ICMPFRAGMENT,
DOS_END,
};
typedef struct rtl8367c_port_ability_s{
rtk_uint16 forcemode;
rtk_uint16 mstfault;
rtk_uint16 mstmode;
rtk_uint16 nway;
rtk_uint16 txpause;
rtk_uint16 rxpause;
rtk_uint16 link;
rtk_uint16 duplex;
rtk_uint16 speed;
}rtl8367c_port_ability_t;
typedef struct rtl8367c_port_status_s{
rtk_uint16 lpi1000;
rtk_uint16 lpi100;
rtk_uint16 mstfault;
rtk_uint16 mstmode;
rtk_uint16 nway;
rtk_uint16 txpause;
rtk_uint16 rxpause;
rtk_uint16 link;
rtk_uint16 duplex;
rtk_uint16 speed;
}rtl8367c_port_status_t;
typedef struct rtct_result_s
{
rtk_uint32 channelAShort;
rtk_uint32 channelBShort;
rtk_uint32 channelCShort;
rtk_uint32 channelDShort;
rtk_uint32 channelAOpen;
rtk_uint32 channelBOpen;
rtk_uint32 channelCOpen;
rtk_uint32 channelDOpen;
rtk_uint32 channelAMismatch;
rtk_uint32 channelBMismatch;
rtk_uint32 channelCMismatch;
rtk_uint32 channelDMismatch;
rtk_uint32 channelALinedriver;
rtk_uint32 channelBLinedriver;
rtk_uint32 channelCLinedriver;
rtk_uint32 channelDLinedriver;
rtk_uint32 channelALen;
rtk_uint32 channelBLen;
rtk_uint32 channelCLen;
rtk_uint32 channelDLen;
} rtl8367c_port_rtct_result_t;
/****************************************************************/
/* Driver Proto Type Definition */
/****************************************************************/
extern ret_t rtl8367c_setAsicPortUnknownDaBehavior(rtk_uint32 port, rtk_uint32 behavior);
extern ret_t rtl8367c_getAsicPortUnknownDaBehavior(rtk_uint32 port, rtk_uint32 *pBehavior);
extern ret_t rtl8367c_setAsicPortUnknownSaBehavior(rtk_uint32 behavior);
extern ret_t rtl8367c_getAsicPortUnknownSaBehavior(rtk_uint32 *pBehavior);
extern ret_t rtl8367c_setAsicPortUnmatchedSaBehavior(rtk_uint32 behavior);
extern ret_t rtl8367c_getAsicPortUnmatchedSaBehavior(rtk_uint32 *pBehavior);
extern ret_t rtl8367c_setAsicPortUnmatchedSaMoving(rtk_uint32 port, rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicPortUnmatchedSaMoving(rtk_uint32 port, rtk_uint32 *pEnabled);
extern ret_t rtl8367c_setAsicPortUnknownDaFloodingPortmask(rtk_uint32 portmask);
extern ret_t rtl8367c_getAsicPortUnknownDaFloodingPortmask(rtk_uint32 *pPortmask);
extern ret_t rtl8367c_setAsicPortUnknownMulticastFloodingPortmask(rtk_uint32 portmask);
extern ret_t rtl8367c_getAsicPortUnknownMulticastFloodingPortmask(rtk_uint32 *pPortmask);
extern ret_t rtl8367c_setAsicPortBcastFloodingPortmask(rtk_uint32 portmask);
extern ret_t rtl8367c_getAsicPortBcastFloodingPortmask(rtk_uint32 *pPortmask);
extern ret_t rtl8367c_setAsicPortBlockSpa(rtk_uint32 port, rtk_uint32 block);
extern ret_t rtl8367c_getAsicPortBlockSpa(rtk_uint32 port, rtk_uint32 *pBlock);
extern ret_t rtl8367c_setAsicPortForceLink(rtk_uint32 port, rtl8367c_port_ability_t *pPortAbility);
extern ret_t rtl8367c_getAsicPortForceLink(rtk_uint32 port, rtl8367c_port_ability_t *pPortAbility);
extern ret_t rtl8367c_getAsicPortStatus(rtk_uint32 port, rtl8367c_port_status_t *pPortStatus);
extern ret_t rtl8367c_setAsicPortForceLinkExt(rtk_uint32 id, rtl8367c_port_ability_t *pPortAbility);
extern ret_t rtl8367c_getAsicPortForceLinkExt(rtk_uint32 id, rtl8367c_port_ability_t *pPortAbility);
extern ret_t rtl8367c_setAsicPortExtMode(rtk_uint32 id, rtk_uint32 mode);
extern ret_t rtl8367c_getAsicPortExtMode(rtk_uint32 id, rtk_uint32 *pMode);
extern ret_t rtl8367c_setAsicPortDos(rtk_uint32 type, rtk_uint32 drop);
extern ret_t rtl8367c_getAsicPortDos(rtk_uint32 type, rtk_uint32* pDrop);
extern ret_t rtl8367c_setAsicPortEnableAll(rtk_uint32 enable);
extern ret_t rtl8367c_getAsicPortEnableAll(rtk_uint32 *pEnable);
extern ret_t rtl8367c_setAsicPortSmallIpg(rtk_uint32 port, rtk_uint32 enable);
extern ret_t rtl8367c_getAsicPortSmallIpg(rtk_uint32 port, rtk_uint32* pEnable);
extern ret_t rtl8367c_setAsicPortLoopback(rtk_uint32 port, rtk_uint32 enable);
extern ret_t rtl8367c_getAsicPortLoopback(rtk_uint32 port, rtk_uint32 *pEnable);
extern ret_t rtl8367c_setAsicPortRTCTEnable(rtk_uint32 portmask);
extern ret_t rtl8367c_setAsicPortRTCTDisable(rtk_uint32 portmask);
extern ret_t rtl8367c_getAsicPortRTCTResult(rtk_uint32 port, rtl8367c_port_rtct_result_t *pResult);
extern ret_t rtl8367c_sdsReset(rtk_uint32 id);
extern ret_t rtl8367c_getSdsLinkStatus(rtk_uint32 ext_id, rtk_uint32 *pSignalDetect, rtk_uint32 *pSync, rtk_uint32 *pLink);
extern ret_t rtl8367c_setSgmiiNway(rtk_uint32 ext_id, rtk_uint32 state);
extern ret_t rtl8367c_getSgmiiNway(rtk_uint32 ext_id, rtk_uint32 *pState);
#endif /*_RTL8367C_ASICDRV_PORTSECURITY_H_*/

View file

@ -0,0 +1,28 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : Port isolation related functions
*
*/
#ifndef _RTL8367C_ASICDRV_PORTISOLATION_H_
#define _RTL8367C_ASICDRV_PORTISOLATION_H_
#include <rtl8367c_asicdrv.h>
extern ret_t rtl8367c_setAsicPortIsolationPermittedPortmask(rtk_uint32 port, rtk_uint32 permitPortmask);
extern ret_t rtl8367c_getAsicPortIsolationPermittedPortmask(rtk_uint32 port, rtk_uint32 *pPermitPortmask);
extern ret_t rtl8367c_setAsicPortIsolationEfid(rtk_uint32 port, rtk_uint32 efid);
extern ret_t rtl8367c_getAsicPortIsolationEfid(rtk_uint32 port, rtk_uint32 *pEfid);
#endif /*_RTL8367C_ASICDRV_PORTISOLATION_H_*/

View file

@ -0,0 +1,96 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : Qos related functions
*
*/
#ifndef _RTL8367C_ASICDRV_QOS_H_
#define _RTL8367C_ASICDRV_QOS_H_
#include <rtl8367c_asicdrv.h>
#define RTL8367C_DECISIONPRIMAX 0xFF
/* enum Priority Selection Types */
enum PRIDECISION
{
PRIDEC_PORT = 0,
PRIDEC_ACL,
PRIDEC_DSCP,
PRIDEC_1Q,
PRIDEC_1AD,
PRIDEC_CVLAN,
PRIDEC_DA,
PRIDEC_SA,
PRIDEC_END,
};
/* enum Priority Selection Index */
enum RTL8367C_PRIDEC_TABLE
{
PRIDEC_IDX0 = 0,
PRIDEC_IDX1,
PRIDEC_IDX_END,
};
enum RTL8367C_DOT1P_PRISEL
{
DOT1P_PRISEL_USER = 0,
DOT1P_PRISEL_TAG,
DOT1P_PRISEL_END
};
enum RTL8367C_DSCP_PRISEL
{
DSCP_PRISEL_INTERNAL = 0,
DSCP_PRISEL_DSCP,
DSCP_PRISEL_USER ,
DSCP_PRISEL_END
};
extern ret_t rtl8367c_setAsicRemarkingDot1pAbility(rtk_uint32 port, rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicRemarkingDot1pAbility(rtk_uint32 port, rtk_uint32* pEnabled);
extern ret_t rtl8367c_setAsicRemarkingDot1pParameter(rtk_uint32 priority, rtk_uint32 newPriority );
extern ret_t rtl8367c_getAsicRemarkingDot1pParameter(rtk_uint32 priority, rtk_uint32 *pNewPriority );
extern ret_t rtl8367c_setAsicRemarkingDot1pSrc(rtk_uint32 type);
extern ret_t rtl8367c_getAsicRemarkingDot1pSrc(rtk_uint32 *pType);
extern ret_t rtl8367c_setAsicRemarkingDscpAbility(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicRemarkingDscpAbility(rtk_uint32* pEnabled);
extern ret_t rtl8367c_setAsicRemarkingDscpParameter(rtk_uint32 priority, rtk_uint32 newDscp );
extern ret_t rtl8367c_getAsicRemarkingDscpParameter(rtk_uint32 priority, rtk_uint32* pNewDscp );
extern ret_t rtl8367c_setAsicPriorityDot1qRemapping(rtk_uint32 srcpriority, rtk_uint32 priority );
extern ret_t rtl8367c_getAsicPriorityDot1qRemapping(rtk_uint32 srcpriority, rtk_uint32 *pPriority );
extern ret_t rtl8367c_setAsicPriorityDscpBased(rtk_uint32 dscp, rtk_uint32 priority );
extern ret_t rtl8367c_getAsicPriorityDscpBased(rtk_uint32 dscp, rtk_uint32 *pPriority );
extern ret_t rtl8367c_setAsicPriorityPortBased(rtk_uint32 port, rtk_uint32 priority );
extern ret_t rtl8367c_getAsicPriorityPortBased(rtk_uint32 port, rtk_uint32 *pPriority );
extern ret_t rtl8367c_setAsicPriorityDecision(rtk_uint32 index, rtk_uint32 prisrc, rtk_uint32 decisionPri);
extern ret_t rtl8367c_getAsicPriorityDecision(rtk_uint32 index, rtk_uint32 prisrc, rtk_uint32* pDecisionPri);
extern ret_t rtl8367c_setAsicPriorityToQIDMappingTable(rtk_uint32 qnum, rtk_uint32 priority, rtk_uint32 qid );
extern ret_t rtl8367c_getAsicPriorityToQIDMappingTable(rtk_uint32 qnum, rtk_uint32 priority, rtk_uint32* pQid);
extern ret_t rtl8367c_setAsicOutputQueueMappingIndex(rtk_uint32 port, rtk_uint32 qnum );
extern ret_t rtl8367c_getAsicOutputQueueMappingIndex(rtk_uint32 port, rtk_uint32 *pQnum );
extern ret_t rtl8367c_setAsicRemarkingDscpSrc(rtk_uint32 type);
extern ret_t rtl8367c_getAsicRemarkingDscpSrc(rtk_uint32 *pType);
extern ret_t rtl8367c_setAsicRemarkingDscp2Dscp(rtk_uint32 dscp, rtk_uint32 rmkDscp);
extern ret_t rtl8367c_getAsicRemarkingDscp2Dscp(rtk_uint32 dscp, rtk_uint32 *pRmkDscp);
extern ret_t rtl8367c_setAsicPortPriorityDecisionIndex(rtk_uint32 port, rtk_uint32 index );
extern ret_t rtl8367c_getAsicPortPriorityDecisionIndex(rtk_uint32 port, rtk_uint32 *pIndex );
#endif /*#ifndef _RTL8367C_ASICDRV_QOS_H_*/

View file

@ -0,0 +1,60 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 42321 $
* $Date: 2013-08-26 13:51:29 +0800 (g¤@, 26 ¤K¤ë 2013) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : RLDP related functions
*
*/
#ifndef _RTL8367C_ASICDRV_RLDP_H_
#define _RTL8367C_ASICDRV_RLDP_H_
#include <rtl8367c_asicdrv.h>
#include <string.h>
extern ret_t rtl8367c_setAsicRldp(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicRldp(rtk_uint32 *pEnabled);
extern ret_t rtl8367c_setAsicRldpEnable8051(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicRldpEnable8051(rtk_uint32 *pEnabled);
extern ret_t rtl8367c_setAsicRldpCompareRandomNumber(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicRldpCompareRandomNumber(rtk_uint32 *pEnabled);
extern ret_t rtl8367c_setAsicRldpIndicatorSource(rtk_uint32 src);
extern ret_t rtl8367c_getAsicRldpIndicatorSource(rtk_uint32 *pSrc);
extern ret_t rtl8367c_setAsicRldpCheckingStatePara(rtk_uint32 retryCount, rtk_uint32 retryPeriod);
extern ret_t rtl8367c_getAsicRldpCheckingStatePara(rtk_uint32 *pRetryCount, rtk_uint32 *pRetryPeriod);
extern ret_t rtl8367c_setAsicRldpLoopStatePara(rtk_uint32 retryCount, rtk_uint32 retryPeriod);
extern ret_t rtl8367c_getAsicRldpLoopStatePara(rtk_uint32 *pRetryCount, rtk_uint32 *pRetryPeriod);
extern ret_t rtl8367c_setAsicRldpTxPortmask(rtk_uint32 portmask);
extern ret_t rtl8367c_getAsicRldpTxPortmask(rtk_uint32 *pPortmask);
extern ret_t rtl8367c_setAsicRldpMagicNum(ether_addr_t seed);
extern ret_t rtl8367c_getAsicRldpMagicNum(ether_addr_t *pSeed);
extern ret_t rtl8367c_getAsicRldpLoopedPortmask(rtk_uint32 *pPortmask);
extern ret_t rtl8367c_setAsicRldp8051Portmask(rtk_uint32 portmask);
extern ret_t rtl8367c_getAsicRldp8051Portmask(rtk_uint32 *pPortmask);
extern ret_t rtl8367c_getAsicRldpRandomNumber(ether_addr_t *pRandNumber);
extern ret_t rtl8367c_getAsicRldpLoopedPortPair(rtk_uint32 port, rtk_uint32 *pLoopedPair);
extern ret_t rtl8367c_setAsicRlppTrap8051(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicRlppTrap8051(rtk_uint32 *pEnabled);
extern ret_t rtl8367c_setAsicRldpLeaveLoopedPortmask(rtk_uint32 portmask);
extern ret_t rtl8367c_getAsicRldpLeaveLoopedPortmask(rtk_uint32 *pPortmask);
extern ret_t rtl8367c_setAsicRldpEnterLoopedPortmask(rtk_uint32 portmask);
extern ret_t rtl8367c_getAsicRldpEnterLoopedPortmask(rtk_uint32 *pPortmask);
extern ret_t rtl8367c_setAsicRldpTriggerMode(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicRldpTriggerMode(rtk_uint32 *pEnabled);
#endif /*_RTL8367C_ASICDRV_RLDP_H_*/

View file

@ -0,0 +1,57 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 64716 $
* $Date: 2015-12-31 16:31:55 +0800 (g¥|, 31 ¤Q¤G¤ë 2015) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : RMA related functions
*
*/
#ifndef _RTL8367C_ASICDRV_RMA_H_
#define _RTL8367C_ASICDRV_RMA_H_
#include <rtl8367c_asicdrv.h>
#define RTL8367C_RMAMAX 0x2F
enum RTL8367C_RMAOP
{
RMAOP_FORWARD = 0,
RMAOP_TRAP_TO_CPU,
RMAOP_DROP,
RMAOP_FORWARD_EXCLUDE_CPU,
RMAOP_END
};
typedef struct rtl8367c_rma_s{
rtk_uint16 operation;
rtk_uint16 discard_storm_filter;
rtk_uint16 trap_priority;
rtk_uint16 keep_format;
rtk_uint16 vlan_leaky;
rtk_uint16 portiso_leaky;
}rtl8367c_rma_t;
extern ret_t rtl8367c_setAsicRma(rtk_uint32 index, rtl8367c_rma_t* pRmacfg);
extern ret_t rtl8367c_getAsicRma(rtk_uint32 index, rtl8367c_rma_t* pRmacfg);
extern ret_t rtl8367c_setAsicRmaCdp(rtl8367c_rma_t* pRmacfg);
extern ret_t rtl8367c_getAsicRmaCdp(rtl8367c_rma_t* pRmacfg);
extern ret_t rtl8367c_setAsicRmaCsstp(rtl8367c_rma_t* pRmacfg);
extern ret_t rtl8367c_getAsicRmaCsstp(rtl8367c_rma_t* pRmacfg);
extern ret_t rtl8367c_setAsicRmaLldp(rtk_uint32 enabled, rtl8367c_rma_t* pRmacfg);
extern ret_t rtl8367c_getAsicRmaLldp(rtk_uint32 *pEnabled, rtl8367c_rma_t* pRmacfg);
#endif /*#ifndef _RTL8367C_ASICDRV_RMA_H_*/

View file

@ -0,0 +1,58 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : Packet Scheduling related functions
*
*/
#ifndef _RTL8367C_ASICDRV_SCHEDULING_H_
#define _RTL8367C_ASICDRV_SCHEDULING_H_
#include <rtl8367c_asicdrv.h>
#define RTL8367C_QWEIGHTMAX 0x7F
#define RTL8367C_PORT_QUEUE_METER_INDEX_MAX 7
/* enum for queue type */
enum QUEUETYPE
{
QTYPE_STRICT = 0,
QTYPE_WFQ,
};
extern ret_t rtl8367c_setAsicLeakyBucketParameter(rtk_uint32 tick, rtk_uint32 token);
extern ret_t rtl8367c_getAsicLeakyBucketParameter(rtk_uint32 *tick, rtk_uint32 *token);
extern ret_t rtl8367c_setAsicAprMeter(rtk_uint32 port, rtk_uint32 qid, rtk_uint32 apridx);
extern ret_t rtl8367c_getAsicAprMeter(rtk_uint32 port, rtk_uint32 qid, rtk_uint32 *apridx);
extern ret_t rtl8367c_setAsicPprMeter(rtk_uint32 port, rtk_uint32 qid, rtk_uint32 ppridx);
extern ret_t rtl8367c_getAsicPprMeter(rtk_uint32 port, rtk_uint32 qid, rtk_uint32 *ppridx);
extern ret_t rtl8367c_setAsicAprEnable(rtk_uint32 port, rtk_uint32 aprEnable);
extern ret_t rtl8367c_getAsicAprEnable(rtk_uint32 port, rtk_uint32 *aprEnable);
extern ret_t rtl8367c_setAsicPprEnable(rtk_uint32 port, rtk_uint32 pprEnable);
extern ret_t rtl8367c_getAsicPprEnable(rtk_uint32 port, rtk_uint32 *pprEnable);
extern ret_t rtl8367c_setAsicWFQWeight(rtk_uint32, rtk_uint32 queueid, rtk_uint32 weight );
extern ret_t rtl8367c_getAsicWFQWeight(rtk_uint32, rtk_uint32 queueid, rtk_uint32 *weight );
extern ret_t rtl8367c_setAsicWFQBurstSize(rtk_uint32 burstsize);
extern ret_t rtl8367c_getAsicWFQBurstSize(rtk_uint32 *burstsize);
extern ret_t rtl8367c_setAsicQueueType(rtk_uint32 port, rtk_uint32 qid, rtk_uint32 queueType);
extern ret_t rtl8367c_getAsicQueueType(rtk_uint32 port, rtk_uint32 qid, rtk_uint32 *queueType);
extern ret_t rtl8367c_setAsicQueueRate(rtk_uint32 port, rtk_uint32 qid, rtk_uint32 ppridx, rtk_uint32 apridx );
extern ret_t rtl8367c_getAsicQueueRate(rtk_uint32 port, rtk_uint32 qid, rtk_uint32* ppridx, rtk_uint32* apridx );
extern ret_t rtl8367c_setAsicPortEgressRate(rtk_uint32 port, rtk_uint32 rate);
extern ret_t rtl8367c_getAsicPortEgressRate(rtk_uint32 port, rtk_uint32 *rate);
extern ret_t rtl8367c_setAsicPortEgressRateIfg(rtk_uint32 ifg);
extern ret_t rtl8367c_getAsicPortEgressRateIfg(rtk_uint32 *ifg);
#endif /*_RTL8367C_ASICDRV_SCHEDULING_H_*/

View file

@ -0,0 +1,61 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : Storm control filtering related functions
*
*/
#ifndef _RTL8367C_ASICDRV_STORM_H_
#define _RTL8367C_ASICDRV_STORM_H_
#include <rtl8367c_asicdrv.h>
extern ret_t rtl8367c_setAsicStormFilterBroadcastEnable(rtk_uint32 port, rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicStormFilterBroadcastEnable(rtk_uint32 port, rtk_uint32 *pEnabled);
extern ret_t rtl8367c_setAsicStormFilterBroadcastMeter(rtk_uint32 port, rtk_uint32 meter);
extern ret_t rtl8367c_getAsicStormFilterBroadcastMeter(rtk_uint32 port, rtk_uint32 *pMeter);
extern ret_t rtl8367c_setAsicStormFilterMulticastEnable(rtk_uint32 port, rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicStormFilterMulticastEnable(rtk_uint32 port, rtk_uint32 *pEnabled);
extern ret_t rtl8367c_setAsicStormFilterMulticastMeter(rtk_uint32 port, rtk_uint32 meter);
extern ret_t rtl8367c_getAsicStormFilterMulticastMeter(rtk_uint32 port, rtk_uint32 *pMeter);
extern ret_t rtl8367c_setAsicStormFilterUnknownMulticastEnable(rtk_uint32 port, rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicStormFilterUnknownMulticastEnable(rtk_uint32 port, rtk_uint32 *pEnabled);
extern ret_t rtl8367c_setAsicStormFilterUnknownMulticastMeter(rtk_uint32 port, rtk_uint32 meter);
extern ret_t rtl8367c_getAsicStormFilterUnknownMulticastMeter(rtk_uint32 port, rtk_uint32 *pMeter);
extern ret_t rtl8367c_setAsicStormFilterUnknownUnicastEnable(rtk_uint32 port, rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicStormFilterUnknownUnicastEnable(rtk_uint32 port, rtk_uint32 *pEnabled);
extern ret_t rtl8367c_setAsicStormFilterUnknownUnicastMeter(rtk_uint32 port, rtk_uint32 meter);
extern ret_t rtl8367c_getAsicStormFilterUnknownUnicastMeter(rtk_uint32 port, rtk_uint32 *pMeter);
extern ret_t rtl8367c_setAsicStormFilterExtBroadcastMeter(rtk_uint32 meter);
extern ret_t rtl8367c_getAsicStormFilterExtBroadcastMeter(rtk_uint32 *pMeter);
extern ret_t rtl8367c_setAsicStormFilterExtMulticastMeter(rtk_uint32 meter);
extern ret_t rtl8367c_getAsicStormFilterExtMulticastMeter(rtk_uint32 *pMeter);
extern ret_t rtl8367c_setAsicStormFilterExtUnknownMulticastMeter(rtk_uint32 meter);
extern ret_t rtl8367c_getAsicStormFilterExtUnknownMulticastMeter(rtk_uint32 *pMeter);
extern ret_t rtl8367c_setAsicStormFilterExtUnknownUnicastMeter(rtk_uint32 meter);
extern ret_t rtl8367c_getAsicStormFilterExtUnknownUnicastMeter(rtk_uint32 *pMeter);
extern ret_t rtl8367c_setAsicStormFilterExtBroadcastEnable(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicStormFilterExtBroadcastEnable(rtk_uint32 *pEnabled);
extern ret_t rtl8367c_setAsicStormFilterExtMulticastEnable(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicStormFilterExtMulticastEnable(rtk_uint32 *pEnabled);
extern ret_t rtl8367c_setAsicStormFilterExtUnknownMulticastEnable(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicStormFilterExtUnknownMulticastEnable(rtk_uint32 *pEnabled);
extern ret_t rtl8367c_setAsicStormFilterExtUnknownUnicastEnable(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicStormFilterExtUnknownUnicastEnable(rtk_uint32 *pEnabled);
extern ret_t rtl8367c_setAsicStormFilterExtEnablePortMask(rtk_uint32 portmask);
extern ret_t rtl8367c_getAsicStormFilterExtEnablePortMask(rtk_uint32 *pPortmask);
#endif /*_RTL8367C_ASICDRV_STORM_H_*/

View file

@ -0,0 +1,132 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : SVLAN related functions
*
*/
#ifndef _RTL8367C_ASICDRV_SVLAN_H_
#define _RTL8367C_ASICDRV_SVLAN_H_
#include <rtl8367c_asicdrv.h>
#define RTL8367C_C2SIDXNO 128
#define RTL8367C_C2SIDXMAX (RTL8367C_C2SIDXNO-1)
#define RTL8367C_MC2SIDXNO 32
#define RTL8367C_MC2SIDXMAX (RTL8367C_MC2SIDXNO-1)
#define RTL8367C_SP2CIDXNO 128
#define RTL8367C_SP2CMAX (RTL8367C_SP2CIDXNO-1)
#define RTL8367C_SVLAN_MEMCONF_LEN 4
#define RTL8367C_SVLAN_MC2S_LEN 5
#define RTL8367C_SVLAN_SP2C_LEN 2
enum RTL8367C_SPRISEL
{
SPRISEL_INTERNALPRI = 0,
SPRISEL_CTAGPRI,
SPRISEL_VSPRI,
SPRISEL_PBPRI,
SPRISEL_END
};
enum RTL8367C_SUNACCEPT
{
SUNACCEPT_DROP = 0,
SUNACCEPT_TRAP,
SUNACCEPT_SVLAN,
SUNACCEPT_END
};
enum RTL8367C_SVLAN_MC2S_MODE
{
SVLAN_MC2S_MODE_MAC = 0,
SVLAN_MC2S_MODE_IP,
SVLAN_MC2S_MODE_END
};
typedef struct rtl8367c_svlan_memconf_s{
rtk_uint16 vs_member:11;
rtk_uint16 vs_untag:11;
rtk_uint16 vs_fid_msti:4;
rtk_uint16 vs_priority:3;
rtk_uint16 vs_force_fid:1;
rtk_uint16 reserved:8;
rtk_uint16 vs_svid:12;
rtk_uint16 vs_efiden:1;
rtk_uint16 vs_efid:3;
}rtl8367c_svlan_memconf_t;
typedef struct rtl8367c_svlan_mc2s_s{
rtk_uint16 valid:1;
rtk_uint16 format:1;
rtk_uint16 svidx:6;
rtk_uint32 sdata;
rtk_uint32 smask;
}rtl8367c_svlan_mc2s_t;
typedef struct rtl8367c_svlan_s2c_s{
rtk_uint16 valid:1;
rtk_uint16 svidx:6;
rtk_uint16 dstport:4;
rtk_uint32 vid:12;
}rtl8367c_svlan_s2c_t;
extern ret_t rtl8367c_setAsicSvlanIngressUntag(rtk_uint32 mode);
extern ret_t rtl8367c_getAsicSvlanIngressUntag(rtk_uint32* pMode);
extern ret_t rtl8367c_setAsicSvlanIngressUnmatch(rtk_uint32 mode);
extern ret_t rtl8367c_getAsicSvlanIngressUnmatch(rtk_uint32* pMode);
extern ret_t rtl8367c_setAsicSvlanTrapPriority(rtk_uint32 priority);
extern ret_t rtl8367c_getAsicSvlanTrapPriority(rtk_uint32* pPriority);
extern ret_t rtl8367c_setAsicSvlanDefaultVlan(rtk_uint32 port, rtk_uint32 index);
extern ret_t rtl8367c_getAsicSvlanDefaultVlan(rtk_uint32 port, rtk_uint32* pIndex);
extern ret_t rtl8367c_setAsicSvlanMemberConfiguration(rtk_uint32 index,rtl8367c_svlan_memconf_t* pSvlanMemCfg);
extern ret_t rtl8367c_getAsicSvlanMemberConfiguration(rtk_uint32 index,rtl8367c_svlan_memconf_t* pSvlanMemCfg);
extern ret_t rtl8367c_setAsicSvlanPrioritySel(rtk_uint32 priSel);
extern ret_t rtl8367c_getAsicSvlanPrioritySel(rtk_uint32* pPriSel);
extern ret_t rtl8367c_setAsicSvlanTpid(rtk_uint32 protocolType);
extern ret_t rtl8367c_getAsicSvlanTpid(rtk_uint32* pProtocolType);
extern ret_t rtl8367c_setAsicSvlanUplinkPortMask(rtk_uint32 portMask);
extern ret_t rtl8367c_getAsicSvlanUplinkPortMask(rtk_uint32* pPortmask);
extern ret_t rtl8367c_setAsicSvlanEgressUnassign(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicSvlanEgressUnassign(rtk_uint32* pEnabled);
extern ret_t rtl8367c_setAsicSvlanC2SConf(rtk_uint32 index, rtk_uint32 evid, rtk_uint32 portmask, rtk_uint32 svidx);
extern ret_t rtl8367c_getAsicSvlanC2SConf(rtk_uint32 index, rtk_uint32* pEvid, rtk_uint32* pPortmask, rtk_uint32* pSvidx);
extern ret_t rtl8367c_setAsicSvlanMC2SConf(rtk_uint32 index,rtl8367c_svlan_mc2s_t* pSvlanMc2sCfg);
extern ret_t rtl8367c_getAsicSvlanMC2SConf(rtk_uint32 index,rtl8367c_svlan_mc2s_t* pSvlanMc2sCfg);
extern ret_t rtl8367c_setAsicSvlanSP2CConf(rtk_uint32 index,rtl8367c_svlan_s2c_t* pSvlanSp2cCfg);
extern ret_t rtl8367c_getAsicSvlanSP2CConf(rtk_uint32 index,rtl8367c_svlan_s2c_t* pSvlanSp2cCfg);
extern ret_t rtl8367c_setAsicSvlanDmacCvidSel(rtk_uint32 port, rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicSvlanDmacCvidSel(rtk_uint32 port, rtk_uint32* pEnabled);
extern ret_t rtl8367c_setAsicSvlanUntagVlan(rtk_uint32 index);
extern ret_t rtl8367c_getAsicSvlanUntagVlan(rtk_uint32* pIndex);
extern ret_t rtl8367c_setAsicSvlanUnmatchVlan(rtk_uint32 index);
extern ret_t rtl8367c_getAsicSvlanUnmatchVlan(rtk_uint32* pIndex);
extern ret_t rtl8367c_setAsicSvlanLookupType(rtk_uint32 type);
extern ret_t rtl8367c_getAsicSvlanLookupType(rtk_uint32* pType);
#endif /*#ifndef _RTL8367C_ASICDRV_SVLAN_H_*/

View file

@ -0,0 +1,48 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : Port trunking related functions
*
*/
#ifndef _RTL8367C_ASICDRV_TRUNKING_H_
#define _RTL8367C_ASICDRV_TRUNKING_H_
#include <rtl8367c_asicdrv.h>
#define RTL8367C_MAX_TRUNK_GID (2)
#define RTL8367C_TRUNKING_PORTNO (4)
#define RTL8367C_TRUNKING1_PORTN0 (2)
#define RTL8367C_TRUNKING_HASHVALUE_MAX (15)
extern ret_t rtl8367c_setAsicTrunkingGroup(rtk_uint32 group, rtk_uint32 portmask);
extern ret_t rtl8367c_getAsicTrunkingGroup(rtk_uint32 group, rtk_uint32* pPortmask);
extern ret_t rtl8367c_setAsicTrunkingFlood(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicTrunkingFlood(rtk_uint32* pEnabled);
extern ret_t rtl8367c_setAsicTrunkingHashSelect(rtk_uint32 hashsel);
extern ret_t rtl8367c_getAsicTrunkingHashSelect(rtk_uint32* pHashsel);
extern ret_t rtl8367c_getAsicQeueuEmptyStatus(rtk_uint32* pPortmask);
extern ret_t rtl8367c_setAsicTrunkingMode(rtk_uint32 mode);
extern ret_t rtl8367c_getAsicTrunkingMode(rtk_uint32* pMode);
extern ret_t rtl8367c_setAsicTrunkingFc(rtk_uint32 group, rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicTrunkingFc(rtk_uint32 group, rtk_uint32* pEnabled);
extern ret_t rtl8367c_setAsicTrunkingHashTable(rtk_uint32 hashval, rtk_uint32 portId);
extern ret_t rtl8367c_getAsicTrunkingHashTable(rtk_uint32 hashval, rtk_uint32* pPortId);
extern ret_t rtl8367c_setAsicTrunkingHashTable1(rtk_uint32 hashval, rtk_uint32 portId);
extern ret_t rtl8367c_getAsicTrunkingHashTable1(rtk_uint32 hashval, rtk_uint32* pPortId);
#endif /*_RTL8367C_ASICDRV_TRUNKING_H_*/

View file

@ -0,0 +1,59 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : Unkown multicast related functions
*
*/
#ifndef _RTL8367C_ASICDRV_UNKNOWNMULTICAST_H_
#define _RTL8367C_ASICDRV_UNKNOWNMULTICAST_H_
#include <rtl8367c_asicdrv.h>
enum L2_UNKOWN_MULTICAST_BEHAVE
{
L2_UNKOWN_MULTICAST_FLOODING = 0,
L2_UNKOWN_MULTICAST_DROP,
L2_UNKOWN_MULTICAST_TRAP,
L2_UNKOWN_MULTICAST_DROP_EXCLUDE_RMA,
L2_UNKOWN_MULTICAST_END
};
enum L3_UNKOWN_MULTICAST_BEHAVE
{
L3_UNKOWN_MULTICAST_FLOODING = 0,
L3_UNKOWN_MULTICAST_DROP,
L3_UNKOWN_MULTICAST_TRAP,
L3_UNKOWN_MULTICAST_ROUTER,
L3_UNKOWN_MULTICAST_END
};
enum MULTICASTTYPE{
MULTICAST_TYPE_IPV4 = 0,
MULTICAST_TYPE_IPV6,
MULTICAST_TYPE_L2,
MULTICAST_TYPE_END
};
extern ret_t rtl8367c_setAsicUnknownL2MulticastBehavior(rtk_uint32 port, rtk_uint32 behave);
extern ret_t rtl8367c_getAsicUnknownL2MulticastBehavior(rtk_uint32 port, rtk_uint32 *pBehave);
extern ret_t rtl8367c_setAsicUnknownIPv4MulticastBehavior(rtk_uint32 port, rtk_uint32 behave);
extern ret_t rtl8367c_getAsicUnknownIPv4MulticastBehavior(rtk_uint32 port, rtk_uint32 *pBehave);
extern ret_t rtl8367c_setAsicUnknownIPv6MulticastBehavior(rtk_uint32 port, rtk_uint32 behave);
extern ret_t rtl8367c_getAsicUnknownIPv6MulticastBehavior(rtk_uint32 port, rtk_uint32 *pBehave);
extern ret_t rtl8367c_setAsicUnknownMulticastTrapPriority(rtk_uint32 priority);
extern ret_t rtl8367c_getAsicUnknownMulticastTrapPriority(rtk_uint32 *pPriority);
#endif /*_RTL8367C_ASICDRV_UNKNOWNMULTICAST_H_*/

View file

@ -0,0 +1,157 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : VLAN related functions
*
*/
#ifndef _RTL8367C_ASICDRV_VLAN_H_
#define _RTL8367C_ASICDRV_VLAN_H_
/****************************************************************/
/* Header File inclusion */
/****************************************************************/
#include <rtl8367c_asicdrv.h>
/****************************************************************/
/* Constant Definition */
/****************************************************************/
#define RTL8367C_PROTOVLAN_GIDX_MAX 3
#define RTL8367C_PROTOVLAN_GROUPNO 4
#define RTL8367C_VLAN_BUSY_CHECK_NO (10)
#define RTL8367C_VLAN_MBRCFG_LEN (4)
#define RTL8367C_VLAN_4KTABLE_LEN (3)
/****************************************************************/
/* Type Definition */
/****************************************************************/
typedef struct VLANCONFIGUSER
{
rtk_uint16 evid;
rtk_uint16 mbr;
rtk_uint16 fid_msti;
rtk_uint16 envlanpol;
rtk_uint16 meteridx;
rtk_uint16 vbpen;
rtk_uint16 vbpri;
}rtl8367c_vlanconfiguser;
typedef struct USER_VLANTABLE{
rtk_uint16 vid;
rtk_uint16 mbr;
rtk_uint16 untag;
rtk_uint16 fid_msti;
rtk_uint16 envlanpol;
rtk_uint16 meteridx;
rtk_uint16 vbpen;
rtk_uint16 vbpri;
rtk_uint16 ivl_svl;
}rtl8367c_user_vlan4kentry;
typedef enum
{
FRAME_TYPE_BOTH = 0,
FRAME_TYPE_TAGGED_ONLY,
FRAME_TYPE_UNTAGGED_ONLY,
FRAME_TYPE_MAX_BOUND
} rtl8367c_accframetype;
typedef enum
{
EG_TAG_MODE_ORI = 0,
EG_TAG_MODE_KEEP,
EG_TAG_MODE_PRI_TAG,
EG_TAG_MODE_REAL_KEEP,
EG_TAG_MODE_END
} rtl8367c_egtagmode;
typedef enum
{
PPVLAN_FRAME_TYPE_ETHERNET = 0,
PPVLAN_FRAME_TYPE_LLC,
PPVLAN_FRAME_TYPE_RFC1042,
PPVLAN_FRAME_TYPE_END
} rtl8367c_provlan_frametype;
enum RTL8367C_STPST
{
STPST_DISABLED = 0,
STPST_BLOCKING,
STPST_LEARNING,
STPST_FORWARDING
};
enum RTL8367C_RESVIDACT
{
RES_VID_ACT_UNTAG = 0,
RES_VID_ACT_TAG,
RES_VID_ACT_END
};
typedef struct
{
rtl8367c_provlan_frametype frameType;
rtk_uint32 etherType;
} rtl8367c_protocolgdatacfg;
typedef struct
{
rtk_uint32 valid;
rtk_uint32 vlan_idx;
rtk_uint32 priority;
} rtl8367c_protocolvlancfg;
extern ret_t rtl8367c_setAsicVlanMemberConfig(rtk_uint32 index, rtl8367c_vlanconfiguser *pVlanCg);
extern ret_t rtl8367c_getAsicVlanMemberConfig(rtk_uint32 index, rtl8367c_vlanconfiguser *pVlanCg);
extern ret_t rtl8367c_setAsicVlan4kEntry(rtl8367c_user_vlan4kentry *pVlan4kEntry );
extern ret_t rtl8367c_getAsicVlan4kEntry(rtl8367c_user_vlan4kentry *pVlan4kEntry );
extern ret_t rtl8367c_setAsicVlanAccpetFrameType(rtk_uint32 port, rtl8367c_accframetype frameType);
extern ret_t rtl8367c_getAsicVlanAccpetFrameType(rtk_uint32 port, rtl8367c_accframetype *pFrameType);
extern ret_t rtl8367c_setAsicVlanIngressFilter(rtk_uint32 port, rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicVlanIngressFilter(rtk_uint32 port, rtk_uint32 *pEnable);
extern ret_t rtl8367c_setAsicVlanEgressTagMode(rtk_uint32 port, rtl8367c_egtagmode tagMode);
extern ret_t rtl8367c_getAsicVlanEgressTagMode(rtk_uint32 port, rtl8367c_egtagmode *pTagMode);
extern ret_t rtl8367c_setAsicVlanPortBasedVID(rtk_uint32 port, rtk_uint32 index, rtk_uint32 pri);
extern ret_t rtl8367c_getAsicVlanPortBasedVID(rtk_uint32 port, rtk_uint32 *pIndex, rtk_uint32 *pPri);
extern ret_t rtl8367c_setAsicVlanProtocolBasedGroupData(rtk_uint32 index, rtl8367c_protocolgdatacfg *pPbCfg);
extern ret_t rtl8367c_getAsicVlanProtocolBasedGroupData(rtk_uint32 index, rtl8367c_protocolgdatacfg *pPbCfg);
extern ret_t rtl8367c_setAsicVlanPortAndProtocolBased(rtk_uint32 port, rtk_uint32 index, rtl8367c_protocolvlancfg *pPpbCfg);
extern ret_t rtl8367c_getAsicVlanPortAndProtocolBased(rtk_uint32 port, rtk_uint32 index, rtl8367c_protocolvlancfg *pPpbCfg);
extern ret_t rtl8367c_setAsicVlanFilter(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicVlanFilter(rtk_uint32* pEnabled);
extern ret_t rtl8367c_setAsicPortBasedFid(rtk_uint32 port, rtk_uint32 fid);
extern ret_t rtl8367c_getAsicPortBasedFid(rtk_uint32 port, rtk_uint32* pFid);
extern ret_t rtl8367c_setAsicPortBasedFidEn(rtk_uint32 port, rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicPortBasedFidEn(rtk_uint32 port, rtk_uint32* pEnabled);
extern ret_t rtl8367c_setAsicSpanningTreeStatus(rtk_uint32 port, rtk_uint32 msti, rtk_uint32 state);
extern ret_t rtl8367c_getAsicSpanningTreeStatus(rtk_uint32 port, rtk_uint32 msti, rtk_uint32* pState);
extern ret_t rtl8367c_setAsicVlanUntagDscpPriorityEn(rtk_uint32 enabled);
extern ret_t rtl8367c_getAsicVlanUntagDscpPriorityEn(rtk_uint32* enabled);
extern ret_t rtl8367c_setAsicVlanTransparent(rtk_uint32 port, rtk_uint32 portmask);
extern ret_t rtl8367c_getAsicVlanTransparent(rtk_uint32 port, rtk_uint32 *pPortmask);
extern ret_t rtl8367c_setAsicVlanEgressKeep(rtk_uint32 port, rtk_uint32 portmask);
extern ret_t rtl8367c_getAsicVlanEgressKeep(rtk_uint32 port, rtk_uint32* pPortmask);
extern ret_t rtl8367c_setReservedVidAction(rtk_uint32 vid0Action, rtk_uint32 vid4095Action);
extern ret_t rtl8367c_getReservedVidAction(rtk_uint32 *pVid0Action, rtk_uint32 *pVid4095Action);
extern ret_t rtl8367c_setRealKeepRemarkEn(rtk_uint32 enabled);
extern ret_t rtl8367c_getRealKeepRemarkEn(rtk_uint32 *pEnabled);
extern ret_t rtl8367c_resetVlan(void);
#endif /*#ifndef _RTL8367C_ASICDRV_VLAN_H_*/

View file

@ -0,0 +1,596 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : Regsiter MACRO related definition
*
*/
#ifndef _RTL8367C_BASE_H_
#define _RTL8367C_BASE_H_
#include <rtl8367c_reg.h>
/* (16'h0000) port_reg */
#define RTL8367C_PORT_SPECIAL_CONGEST_MODE_TIMER_BASE RTL8367C_REG_PKTGEN_PORT0_TIMER
#define RTL8367C_PORT_SPECIAL_CONGEST_MODE_TIMER_REG(port) (RTL8367C_PORT_SPECIAL_CONGEST_MODE_TIMER_BASE + (port << 5))
#define RTL8367C_PORT_MISC_CFG_BASE RTL8367C_REG_PORT0_MISC_CFG
#define RTL8367C_PORT_MISC_CFG_REG(port) (RTL8367C_PORT_MISC_CFG_BASE + (port << 5))
#define RTL8367C_1QREMARK_ENABLE_OFFSET RTL8367C_PORT0_MISC_CFG_DOT1Q_REMARK_ENABLE_OFFSET
#define RTL8367C_1QREMARK_ENABLE_MASK RTL8367C_PORT0_MISC_CFG_DOT1Q_REMARK_ENABLE_MASK
#define RTL8367C_INGRESSBW_PORT_IFG_MASK RTL8367C_PORT0_MISC_CFG_INGRESSBW_IFG_MASK
#define RTL8367C_VLAN_EGRESS_MDOE_MASK RTL8367C_PORT0_MISC_CFG_VLAN_EGRESS_MODE_MASK
#define RTL8367C_SPECIALCONGEST_SUSTAIN_TIMER_MASK RTL8367C_PORT0_MISC_CFG_CONGESTION_SUSTAIN_TIME_MASK
#define RTL8367C_INGRESSBW_PORT_RATE_LSB_BASE RTL8367C_REG_INGRESSBW_PORT0_RATE_CTRL0
#define RTL8367C_INGRESSBW_PORT_RATE_LSB_REG(port) (RTL8367C_INGRESSBW_PORT_RATE_LSB_BASE + (port << 5))
#define RTL8367C_PORT_SMALL_IPG_REG(port) (RTL8367C_REG_PORT0_MISC_CFG + (port*0x20))
#define RTL8367C_PORT_EEE_CFG_BASE RTL8367C_REG_PORT0_EEECFG
#define RTL8367C_PORT_EEE_CFG_REG(port) (RTL8367C_REG_PORT0_EEECFG + (port << 5))
#define RTL8367C_PORT_EEE_100M_OFFSET RTL8367C_PORT0_EEECFG_EEE_100M_OFFSET
#define RTL8367C_PORT_EEE_100M_MASK RTL8367C_PORT0_EEECFG_EEE_100M_MASK
#define RTL8367C_PORT_EEE_GIGA_OFFSET RTL8367C_PORT0_EEECFG_EEE_GIGA_500M_OFFSET
#define RTL8367C_PORT_EEE_GIGA_MASK RTL8367C_PORT0_EEECFG_EEE_GIGA_500M_MASK
/* (16'h0200) outq_reg */
#define RTL8367C_FLOWCTRL_QUEUE_DROP_ON_BASE RTL8367C_REG_FLOWCTRL_QUEUE0_DROP_ON
#define RTL8367C_FLOWCTRL_QUEUE_DROP_ON_REG(queue) (RTL8367C_FLOWCTRL_QUEUE_DROP_ON_BASE + queue)
#define RTL8367C_FLOWCTRL_QUEUE_DROP_ON_MASK RTL8367C_FLOWCTRL_QUEUE0_DROP_ON_MASK
#define RTL8367C_FLOWCTRL_PORT_DROP_ON_BASE RTL8367C_REG_FLOWCTRL_PORT0_DROP_ON
#define RTL8367C_FLOWCTRL_PORT_DROP_ON_REG(PORT) (RTL8367C_FLOWCTRL_PORT_DROP_ON_BASE + PORT)
#define RTL8367C_FLOWCTRL_PORT_DROP_ON_MASK RTL8367C_FLOWCTRL_PORT0_DROP_ON_MASK
#define RTL8367C_FLOWCTRL_PORT_GAP_REG RTL8367C_REG_FLOWCTRL_PORT_GAP
#define RTL8367C_FLOWCTRL_QUEUE_GAP_REG RTL8367C_REG_FLOWCTRL_QUEUE_GAP
#define RTL8367C_FLOWCTRL_PORT_QEMPTY_REG RTL8367C_REG_PORT_QEMPTY
/* (16'h0300) sch_reg */
#define RTL8367C_SCHEDULE_WFQ_BURST_SIZE_REG RTL8367C_REG_SCHEDULE_WFQ_BURST_SIZE
#define RTL8367C_SCHEDULE_QUEUE_TYPE_BASE RTL8367C_REG_SCHEDULE_QUEUE_TYPE_CTRL0
#define RTL8367C_SCHEDULE_QUEUE_TYPE_REG(port) (RTL8367C_SCHEDULE_QUEUE_TYPE_BASE + (port >> 1))
#define RTL8367C_SCHEDULE_QUEUE_TYPE_OFFSET(port, queue) (((port & 0x1) << 3) + queue)
#define RTL8367C_SCHEDULE_QUEUE_TYPE_MASK(port, queue) RTL8367C_SCHEDULE_QUEUE_TYPE_OFFSET(port, queue)
#define RTL8367C_SCHEDULE_PORT_QUEUE_WFQ_WEIGHT_BASE RTL8367C_REG_SCHEDULE_PORT0_QUEUE0_WFQ_WEIGHT
#define RTL8367C_SCHEDULE_PORT_QUEUE_WFQ_WEIGHT_REG(port, queue) (RTL8367C_SCHEDULE_PORT_QUEUE_WFQ_WEIGHT_BASE + (port << 3) + queue)
#define RTL8367C_SCHEDULE_APR_CTRL_REG RTL8367C_REG_SCHEDULE_APR_CTRL0
#define RTL8367C_SCHEDULE_APR_CTRL_OFFSET(port) (port)
#define RTL8367C_SCHEDULE_APR_CTRL_MASK(port) (1 << RTL8367C_SCHEDULE_APR_CTRL_OFFSET(port))
#define RTL8367C_SCHEDULE_PORT_APR_METER_BASE RTL8367C_REG_SCHEDULE_PORT0_APR_METER_CTRL0
#define RTL8367C_SCHEDULE_PORT_APR_METER_REG(port, queue) (RTL8367C_SCHEDULE_PORT_APR_METER_BASE + (port << 2) + (queue / 5))
#define RTL8367C_SCHEDULE_PORT_APR_METER_OFFSET(queue) (3 * (queue % 5))
#define RTL8367C_SCHEDULE_PORT_APR_METER_MASK(queue) (RTL8367C_SCHEDULE_PORT0_APR_METER_CTRL0_QUEUE0_APR_METER_MASK << RTL8367C_SCHEDULE_PORT_APR_METER_OFFSET(queue))
#define RTL8367C_PORT_EGRESSBW_LSB_BASE RTL8367C_REG_PORT0_EGRESSBW_CTRL0
#define RTL8367C_PORT_EGRESSBW_LSB_REG(port) (RTL8367C_PORT_EGRESSBW_LSB_BASE + (port << 1))
#define RTL8367C_PORT_EGRESSBW_MSB_BASE RTL8367C_REG_PORT0_EGRESSBW_CTRL1
#define RTL8367C_PORT_EGRESSBW_MSB_REG(port) (RTL8367C_PORT_EGRESSBW_MSB_BASE + (port << 1))
/* (16'h0500) table_reg */
#define RTL8367C_TABLE_ACCESS_CTRL_REG RTL8367C_REG_TABLE_ACCESS_CTRL
#define RTL8367C_TABLE_ACCESS_ADDR_REG RTL8367C_REG_TABLE_ACCESS_ADDR
#define RTL8367C_TABLE_ACCESS_STATUS_REG RTL8367C_REG_TABLE_LUT_ADDR
#define RTL8367C_TABLE_ACCESS_WRDATA_BASE RTL8367C_REG_TABLE_WRITE_DATA0
#define RTL8367C_TABLE_ACCESS_WRDATA_REG(index) (RTL8367C_TABLE_ACCESS_WRDATA_BASE + index)
#define RTL8367C_TABLE_ACCESS_RDDATA_BASE RTL8367C_REG_TABLE_READ_DATA0
#define RTL8367C_TABLE_ACCESS_RDDATA_REG(index) (RTL8367C_TABLE_ACCESS_RDDATA_BASE + index)
/* (16'h0600) acl_reg */
#define RTL8367C_ACL_RULE_TEMPLATE_CTRL_BASE RTL8367C_REG_ACL_RULE_TEMPLATE0_CTRL0
#define RTL8367C_ACL_RULE_TEMPLATE_CTRL_REG(template) (RTL8367C_ACL_RULE_TEMPLATE_CTRL_BASE + template * 0x4)
#define RTL8367C_ACL_TEMPLATE_FIELD_OFFSET(field) ((field & 0x01) <<3)
#define RTL8367C_ACL_TEMPLATE_FIELD_MASK(field) (0x3F << RTL8367C_ACL_TEMPLATE_FIELD_OFFSET(field))
#define RTL8367C_ACL_ACTION_CTRL_BASE RTL8367C_REG_ACL_ACTION_CTRL0
#define RTL8367C_ACL_ACTION_CTRL_REG(rule) (RTL8367C_ACL_ACTION_CTRL_BASE + (rule >> 1))
#define RTL8367C_ACL_ACTION_CTRL2_BASE RTL8367C_REG_ACL_ACTION_CTRL32
#define RTL8367C_ACL_ACTION_CTRL2_REG(rule) (RTL8367C_ACL_ACTION_CTRL2_BASE + ((rule-64) >> 1))
#define RTL8367C_ACL_OP_NOT_OFFSET(rule) (6 + ((rule & 0x1) << 3))
#define RTL8367C_ACL_OP_NOT_MASK(rule) (1 << RTL8367C_ACL_OP_NOT_OFFSET(rule))
#define RTL8367C_ACL_OP_ACTION_OFFSET(rule) ((rule & 0x1) << 3)
#define RTL8367C_ACL_OP_ACTION_MASK(rule) (0x3F << RTL8367C_ACL_OP_ACTION_OFFSET(rule))
#define RTL8367C_ACL_ENABLE_REG RTL8367C_REG_ACL_ENABLE
#define RTL8367C_ACL_UNMATCH_PERMIT_REG RTL8367C_REG_ACL_UNMATCH_PERMIT
/* (16'h0700) cvlan_reg */
#define RTL8367C_VLAN_PVID_CTRL_BASE RTL8367C_REG_VLAN_PVID_CTRL0
#define RTL8367C_VLAN_PVID_CTRL_REG(port) (RTL8367C_VLAN_PVID_CTRL_BASE + (port >> 1))
#define RTL8367C_PORT_VIDX_OFFSET(port) ((port &1)<<3)
#define RTL8367C_PORT_VIDX_MASK(port) (RTL8367C_PORT0_VIDX_MASK << RTL8367C_PORT_VIDX_OFFSET(port))
#define RTL8367C_VLAN_PPB_VALID_BASE RTL8367C_REG_VLAN_PPB0_VALID
#define RTL8367C_VLAN_PPB_VALID_REG(item) (RTL8367C_VLAN_PPB_VALID_BASE + (item << 3))
#define RTL8367C_VLAN_PPB_CTRL_BASE RTL8367C_REG_VLAN_PPB0_CTRL0
#define RTL8367C_VLAN_PPB_CTRL_REG(item, port) (RTL8367C_VLAN_PPB_CTRL_BASE + (item << 3) + (port / 3) )
#define RTL8367C_VLAN_PPB_CTRL_OFFSET(port) ((port % 3) * 5)
#define RTL8367C_VLAN_PPB_CTRL_MASK(port) (RTL8367C_VLAN_PPB0_CTRL0_PORT0_INDEX_MASK << RTL8367C_VLAN_PPB_CTRL_OFFSET(port))
#define RTL8367C_VLAN_PPB_FRAMETYPE_BASE RTL8367C_REG_VLAN_PPB0_CTRL2
#define RTL8367C_VLAN_PPB_FRAMETYPE_REG(item) (RTL8367C_VLAN_PPB_FRAMETYPE_BASE + (item << 3))
#define RTL8367C_VLAN_PPB_FRAMETYPE_MASK RTL8367C_VLAN_PPB0_CTRL2_FRAME_TYPE_MASK
#define RTL8367C_VLAN_PPB_ETHERTYPR_BASE RTL8367C_REG_VLAN_PPB0_CTRL3
#define RTL8367C_VLAN_PPB_ETHERTYPR_REG(item) (RTL8367C_VLAN_PPB_ETHERTYPR_BASE + (item << 3))
#define RTL8367C_VLAN_MEMBER_CONFIGURATION_BASE RTL8367C_REG_VLAN_MEMBER_CONFIGURATION0_CTRL0
#define RTL8367C_VLAN_CTRL_REG RTL8367C_REG_VLAN_CTRL
#define RTL8367C_VLAN_INGRESS_REG RTL8367C_REG_VLAN_INGRESS
#define RTL8367C_VLAN_ACCEPT_FRAME_TYPE_BASE RTL8367C_REG_VLAN_ACCEPT_FRAME_TYPE_CTRL0
#define RTL8367C_VLAN_ACCEPT_FRAME_TYPE_REG(port) (RTL8367C_VLAN_ACCEPT_FRAME_TYPE_BASE + (port >> 3))
#define RTL8367C_VLAN_ACCEPT_FRAME_TYPE_MASK(port) (RTL8367C_PORT0_FRAME_TYPE_MASK << ((port & 0x7) << 1))
#define RTL8367C_PORT_EFID_BASE RTL8367C_REG_PORT_EFID_CTRL0
#define RTL8367C_PORT_EFID_REG(port) (RTL8367C_PORT_EFID_BASE + (port >> 2))
#define RTL8367C_PORT_EFID_OFFSET(port) ((port & 0x3) << 2)
#define RTL8367C_PORT_EFID_MASK(port) (RTL8367C_PORT0_EFID_MASK << RTL8367C_PORT_EFID_OFFSET(port))
#define RTL8367C_PORT_PBFIDEN_REG RTL8367C_REG_PORT_PBFIDEN
#define RTL8367C_PORT_PBFID_BASE RTL8367C_REG_PORT0_PBFID
#define RTL8367C_PORT_PBFID_REG(port) (RTL8367C_PORT_PBFID_BASE + port)
/* (16'h0800) dpm_reg */
#define RTL8367C_RMA_CTRL_BASE RTL8367C_REG_RMA_CTRL00
#define RTL8367C_VLAN_PORTBASED_PRIORITY_BASE RTL8367C_REG_VLAN_PORTBASED_PRIORITY_CTRL0
#define RTL8367C_VLAN_PORTBASED_PRIORITY_REG(port) (RTL8367C_VLAN_PORTBASED_PRIORITY_BASE + (port >> 2))
#define RTL8367C_VLAN_PORTBASED_PRIORITY_OFFSET(port) ((port & 0x3) << 2)
#define RTL8367C_VLAN_PORTBASED_PRIORITY_MASK(port) (0x7 << RTL8367C_VLAN_PORTBASED_PRIORITY_OFFSET(port))
#define RTL8367C_VLAN_PPB_PRIORITY_ITEM_BASE RTL8367C_REG_VLAN_PPB_PRIORITY_ITEM0_CTRL0
#define RTL8367C_VLAN_PPB_PRIORITY_ITEM_REG(port, item) (RTL8367C_VLAN_PPB_PRIORITY_ITEM_BASE + (item << 2)+ (port>>2))
#define RTL8367C_VLAN_PPB_PRIORITY_ITEM_OFFSET(port) ((port & 0x3) <<2)
#define RTL8367C_VLAN_PPB_PRIORITY_ITEM_MASK(port) (RTL8367C_VLAN_PPB_PRIORITY_ITEM0_CTRL0_PORT0_PRIORITY_MASK << RTL8367C_VLAN_PPB_PRIORITY_ITEM_OFFSET(port))
#define RTL8367C_QOS_1Q_PRIORITY_REMAPPING_BASE RTL8367C_REG_QOS_1Q_PRIORITY_REMAPPING_CTRL0
#define RTL8367C_QOS_1Q_PRIORITY_REMAPPING_REG(pri) (RTL8367C_QOS_1Q_PRIORITY_REMAPPING_BASE + (pri >> 2))
#define RTL8367C_QOS_1Q_PRIORITY_REMAPPING_OFFSET(pri) ((pri & 0x3) << 2)
#define RTL8367C_QOS_1Q_PRIORITY_REMAPPING_MASK(pri) (0x7 << RTL8367C_QOS_1Q_PRIORITY_REMAPPING_OFFSET(pri))
#define RTL8367C_QOS_DSCP_TO_PRIORITY_BASE RTL8367C_REG_QOS_DSCP_TO_PRIORITY_CTRL0
#define RTL8367C_QOS_DSCP_TO_PRIORITY_REG(dscp) (RTL8367C_QOS_DSCP_TO_PRIORITY_BASE + (dscp >> 2))
#define RTL8367C_QOS_DSCP_TO_PRIORITY_OFFSET(dscp) ((dscp & 0x3) << 2)
#define RTL8367C_QOS_DSCP_TO_PRIORITY_MASK(dscp) (0x7 << RTL8367C_QOS_DSCP_TO_PRIORITY_OFFSET(dscp))
#define RTL8367C_QOS_PORTBASED_PRIORITY_BASE RTL8367C_REG_QOS_PORTBASED_PRIORITY_CTRL0
#define RTL8367C_QOS_PORTBASED_PRIORITY_REG(port) (RTL8367C_QOS_PORTBASED_PRIORITY_BASE + (port >> 2))
#define RTL8367C_QOS_PORTBASED_PRIORITY_OFFSET(port) ((port & 0x3) << 2)
#define RTL8367C_QOS_PORTBASED_PRIORITY_MASK(port) (0x7 << RTL8367C_QOS_PORTBASED_PRIORITY_OFFSET(port))
#define RTL8367C_QOS_INTERNAL_PRIORITY_DECISION_BASE RTL8367C_REG_QOS_INTERNAL_PRIORITY_DECISION_CTRL0
#define RTL8367C_QOS_INTERNAL_PRIORITY_DECISION_REG(src) (RTL8367C_QOS_INTERNAL_PRIORITY_DECISION_BASE + (src >> 1))
#define RTL8367C_QOS_INTERNAL_PRIORITY_DECISION_OFFSET(src) ((src & 1) << 3)
#define RTL8367C_QOS_INTERNAL_PRIORITY_DECISION_MASK(src) (RTL8367C_QOS_INTERNAL_PRIORITY_DECISION_CTRL0_QOS_PORT_WEIGHT_MASK << RTL8367C_QOS_INTERNAL_PRIORITY_DECISION2_OFFSET(src))
#define RTL8367C_QOS_INTERNAL_PRIORITY_DECISION2_BASE RTL8367C_REG_QOS_INTERNAL_PRIORITY_DECISION2_CTRL0
#define RTL8367C_QOS_INTERNAL_PRIORITY_DECISION2_REG(src) (RTL8367C_QOS_INTERNAL_PRIORITY_DECISION2_BASE + (src >> 1))
#define RTL8367C_QOS_INTERNAL_PRIORITY_DECISION2_OFFSET(src) ((src & 1) << 3)
#define RTL8367C_QOS_INTERNAL_PRIORITY_DECISION2_MASK(src) (RTL8367C_QOS_INTERNAL_PRIORITY_DECISION2_CTRL0_QOS_PORT_WEIGHT_MASK << RTL8367C_QOS_INTERNAL_PRIORITY_DECISION2_OFFSET(src))
#define RTL8367C_QOS_INTERNAL_PRIORITY_DECISION_IDX_CTRL RTL8367C_REG_QOS_INTERNAL_PRIORITY_DECISION_IDX
#define RTL8367C_QOS_INTERNAL_PRIORITY_DECISION_IDX(port) (1 << port)
#define RTL8367C_QOS_PRIPORITY_REMAPPING_IN_CPU_BASE RTL8367C_REG_QOS_PRIORITY_REMAPPING_IN_CPU_CTRL0
#define RTL8367C_QOS_PRIPORITY_REMAPPING_IN_CPU_REG(pri) (RTL8367C_QOS_PRIPORITY_REMAPPING_IN_CPU_BASE + (pri >> 2))
#define RTL8367C_QOS_PRIPORITY_REMAPPING_IN_CPU_OFFSET(pri) ((pri & 0x3) << 2)
#define RTL8367C_QOS_PRIPORITY_REMAPPING_IN_CPU_MASK(pri) (RTL8367C_QOS_PRIORITY_REMAPPING_IN_CPU_CTRL0_PRIORITY0_MASK << RTL8367C_QOS_PRIPORITY_REMAPPING_IN_CPU_OFFSET(pri))
#define RTL8367C_QOS_TRAP_PRIORITY_CTRL0_REG RTL8367C_REG_QOS_TRAP_PRIORITY0
#define RTL8367C_QOS_TRAP_PRIORITY_CTRL1_REG RTL8367C_REG_QOS_TRAP_PRIORITY1
#define RTL8367C_QOS_DSCP_TO_DSCP_BASE RTL8367C_REG_QOS_DSCP_REMARK_DSCP_CTRL0
#define RTL8367C_QOS_DSCP_TO_DSCP_REG(dscp) (RTL8367C_REG_QOS_DSCP_REMARK_DSCP_CTRL0 + (dscp >> 1))
#define RTL8367C_QOS_DSCP_TO_DSCP_OFFSET(dscp) ((dscp & 0x1) << 8)
#define RTL8367C_QOS_DSCP_TO_DSCP_MASK(dscp) (0x3F << RTL8367C_QOS_DSCP_TO_DSCP_OFFSET(dscp))
#define RTL8367C_UNUCAST_FLOADING_PMSK_REG RTL8367C_REG_UNDA_FLOODING_PMSK
#define RTL8367C_UNMCAST_FLOADING_PMSK_REG RTL8367C_REG_UNMCAST_FLOADING_PMSK
#define RTL8367C_BCAST_FLOADING_PMSK_REG RTL8367C_REG_BCAST_FLOADING_PMSK
#define RTL8367C_PORT_ISOLATION_PORT_MASK_BASE RTL8367C_REG_PORT_ISOLATION_PORT0_MASK
#define RTL8367C_PORT_ISOLATION_PORT_MASK_REG(port) (RTL8367C_PORT_ISOLATION_PORT_MASK_BASE + port)
#define RTL8367C_FORCE_CTRL_REG RTL8367C_REG_FORCE_CTRL
#define RTL8367C_SOURCE_PORT_BLOCK_REG RTL8367C_REG_SOURCE_PORT_PERMIT
#define RTL8367C_IPMCAST_VLAN_LEAKY_REG RTL8367C_REG_IPMCAST_VLAN_LEAKY
#define RTL8367C_IPMCAST_PORTISO_LEAKY_REG RTL8367C_REG_IPMCAST_PORTISO_LEAKY
#define RTL8367C_PORT_SECURIT_CTRL_REG RTL8367C_REG_PORT_SECURITY_CTRL
#define RTL8367C_UNKNOWN_IPV4_MULTICAST_BASE RTL8367C_REG_UNKNOWN_IPV4_MULTICAST_CTRL0
#define RTL8367C_UNKNOWN_IPV4_MULTICAST_REG(port) (RTL8367C_UNKNOWN_IPV4_MULTICAST_BASE + (port >> 3))
#define RTL8367C_UNKNOWN_IPV4_MULTICAST_OFFSET(port) ((port & 0x7) << 1)
#define RTL8367C_UNKNOWN_IPV4_MULTICAST_MASK(port) (RTL8367C_PORT0_UNKNOWN_IP4_MCAST_MASK << RTL8367C_UNKNOWN_IPV4_MULTICAST_OFFSET(port))
#define RTL8367C_UNKNOWN_IPV6_MULTICAST_BASE RTL8367C_REG_UNKNOWN_IPV6_MULTICAST_CTRL0
#define RTL8367C_UNKNOWN_IPV6_MULTICAST_REG(port) (RTL8367C_UNKNOWN_IPV6_MULTICAST_BASE + (port >> 3))
#define RTL8367C_UNKNOWN_IPV6_MULTICAST_OFFSET(port) ((port & 0x7) << 1)
#define RTL8367C_UNKNOWN_IPV6_MULTICAST_MASK(port) (RTL8367C_PORT0_UNKNOWN_IP4_MCAST_MASK << RTL8367C_UNKNOWN_IPV6_MULTICAST_OFFSET(port))
#define RTL8367C_UNKNOWN_L2_MULTICAST_BASE RTL8367C_REG_UNKNOWN_L2_MULTICAST_CTRL0
#define RTL8367C_UNKNOWN_L2_MULTICAST_REG(port) (RTL8367C_UNKNOWN_L2_MULTICAST_BASE + (port >> 3))
#define RTL8367C_UNKNOWN_L2_MULTICAST_OFFSET(port) ((port & 0x7) << 1)
#define RTL8367C_UNKNOWN_L2_MULTICAST_MASK(port) (RTL8367C_PORT0_UNKNOWN_L2_MCAST_MASK << RTL8367C_UNKNOWN_L2_MULTICAST_OFFSET(port))
#define RTL8367C_PORT_TRUNK_CTRL_REG RTL8367C_REG_PORT_TRUNK_CTRL
#define RTL8367C_PORT_TRUNK_HASH_MASK 0x007F
#define RTL8367C_PORT_TRUNK_GROUP_MASK_REG RTL8367C_REG_PORT_TRUNK_GROUP_MASK
#define RTL8367C_PORT_TRUNK_GROUP_MASK_OFFSET(group) (group << 2)
#define RTL8367C_PORT_TRUNK_GROUP_MASK_MASK(group) (RTL8367C_PORT_TRUNK_GROUP0_MASK_MASK << RTL8367C_PORT_TRUNK_GROUP_MASK_OFFSET(group))
#define RTL8367C_PORT_TRUNK_FLOWCTRL_REG RTL8367C_REG_PORT_TRUNK_FLOWCTRL
#define RTL8367C_QOS_PORT_QUEUE_NUMBER_BASE RTL8367C_REG_QOS_PORT_QUEUE_NUMBER_CTRL0
#define RTL8367C_QOS_PORT_QUEUE_NUMBER_REG(port) (RTL8367C_QOS_PORT_QUEUE_NUMBER_BASE + (port >> 2))
#define RTL8367C_QOS_PORT_QUEUE_NUMBER_OFFSET(port) ((port & 0x3) << 2)
#define RTL8367C_QOS_PORT_QUEUE_NUMBER_MASK(port) (0x7 << RTL8367C_QOS_PORT_QUEUE_NUMBER_OFFSET(port))
#define RTL8367C_QOS_1Q_PRIORITY_TO_QID_BASE RTL8367C_REG_QOS_1Q_PRIORITY_TO_QID_CTRL0
#define RTL8367C_QOS_1Q_PRIORITY_TO_QID_REG(index, pri) (RTL8367C_QOS_1Q_PRIORITY_TO_QID_BASE + (index << 1) + (pri >> 2))
#define RTL8367C_QOS_1Q_PRIORITY_TO_QID_OFFSET(pri) ((pri & 0x3) << 2)
#define RTL8367C_QOS_1Q_PRIORITY_TO_QID_MASK(pri) (RTL8367C_QOS_1Q_PRIORITY_TO_QID_CTRL0_PRIORITY0_TO_QID_MASK << RTL8367C_QOS_1Q_PRIORITY_TO_QID_OFFSET(pri))
#define RTL8367C_DEBUG_INFO_BASE RTL8367C_REG_PORT_DEBUG_INFO_CTRL0
#define RTL8367C_DEBUG_INFO_REG(port) (RTL8367C_DEBUG_INFO_BASE + (port >>1))
#define RTL8367C_DEBUG_INFO_OFFSET(port) ((port&1)<<3)
#define RTL8367C_DEBUG_INFO_MASK(port) (RTL8367C_PORT0_DEBUG_INFO_MASK << RTL8367C_DEBUG_INFO_OFFSET(port))
/* (16'h0a00) l2_reg */
#define RTL8367C_VLAN_MSTI_BASE RTL8367C_REG_VLAN_MSTI0_CTRL0
#define RTL8367C_VLAN_MSTI_REG(tree, port) (RTL8367C_VLAN_MSTI_BASE + (tree << 1) + (port >> 3))
#define RTL8367C_VLAN_MSTI_OFFSET(port) ((port & 0x7) << 1)
#define RTL8367C_VLAN_MSTI_MASK(port) (RTL8367C_VLAN_MSTI0_CTRL0_PORT0_STATE_MASK << RTL8367C_VLAN_MSTI_OFFSET(port))
#define RTL8367C_LUT_PORT_LEARN_LIMITNO_BASE RTL8367C_REG_LUT_PORT0_LEARN_LIMITNO
#define RTL8367C_LUT_PORT_LEARN_LIMITNO_REG(port) (RTL8367C_LUT_PORT_LEARN_LIMITNO_BASE + port)
#define RTL8367C_LUT_CFG_REG RTL8367C_REG_LUT_CFG
#define RTL8367C_LUT_AGEOUT_CTRL_REG RTL8367C_REG_LUT_AGEOUT_CTRL
#define RTL8367C_FORCE_FLUSH_REG RTL8367C_REG_FORCE_FLUSH
#define RTL8367C_STORM_BCAST_REG RTL8367C_REG_STORM_BCAST
#define RTL8367C_STORM_MCAST_REG RTL8367C_REG_STORM_MCAST
#define RTL8367C_STORM_UNKNOWN_UCAST_REG RTL8367C_REG_STORM_UNKOWN_UCAST
#define RTL8367C_STORM_UNKNOWN_MCAST_REG RTL8367C_REG_STORM_UNKOWN_MCAST
#define RTL8367C_STORM_BCAST_METER_CTRL_BASE RTL8367C_REG_STORM_BCAST_METER_CTRL0
#define RTL8367C_STORM_BCAST_METER_CTRL_REG(port) (RTL8367C_STORM_BCAST_METER_CTRL_BASE + (port >> 1))
#define RTL8367C_STORM_BCAST_METER_CTRL_OFFSET(port) ((port & 0x1) << 3)
#define RTL8367C_STORM_BCAST_METER_CTRL_MASK(port) (0xFF << RTL8367C_STORM_BCAST_METER_CTRL_OFFSET(port))
#define RTL8367C_STORM_MCAST_METER_CTRL_BASE RTL8367C_REG_STORM_MCAST_METER_CTRL0
#define RTL8367C_STORM_MCAST_METER_CTRL_REG(port) (RTL8367C_STORM_MCAST_METER_CTRL_BASE + (port >> 1))
#define RTL8367C_STORM_MCAST_METER_CTRL_OFFSET(port) ((port & 0x1) << 3)
#define RTL8367C_STORM_MCAST_METER_CTRL_MASK(port) (0xFF << RTL8367C_STORM_MCAST_METER_CTRL_OFFSET(port))
#define RTL8367C_STORM_UNDA_METER_CTRL_BASE RTL8367C_REG_STORM_UNDA_METER_CTRL0
#define RTL8367C_STORM_UNDA_METER_CTRL_REG(port) (RTL8367C_STORM_UNDA_METER_CTRL_BASE + (port >> 1))
#define RTL8367C_STORM_UNDA_METER_CTRL_OFFSET(port) ((port & 0x1) << 3)
#define RTL8367C_STORM_UNDA_METER_CTRL_MASK(port) (0xFF << RTL8367C_STORM_UNDA_METER_CTRL_OFFSET(port))
#define RTL8367C_STORM_UNMC_METER_CTRL_BASE RTL8367C_REG_STORM_UNMC_METER_CTRL0
#define RTL8367C_STORM_UNMC_METER_CTRL_REG(port) (RTL8367C_STORM_UNMC_METER_CTRL_BASE + (port >> 1))
#define RTL8367C_STORM_UNMC_METER_CTRL_OFFSET(port) ((port & 0x1) << 3)
#define RTL8367C_STORM_UNMC_METER_CTRL_MASK(port) (0xFF << RTL8367C_STORM_UNMC_METER_CTRL_OFFSET(port))
#define RTL8367C_OAM_PARSER_OFFSET(port) (port*2)
#define RTL8367C_OAM_PARSER_MASK(port) (RTL8367C_PORT0_PARACT_MASK << RTL8367C_OAM_PARSER_OFFSET(port))
#define RTL8367C_OAM_MULTIPLEXER_OFFSET(port) (port*2)
#define RTL8367C_OAM_MULTIPLEXER_MASK(port) (RTL8367C_PORT0_PARACT_MASK << RTL8367C_OAM_MULTIPLEXER_OFFSET(port))
#define RTL8367C_OAM_CTRL_REG RTL8367C_REG_OAM_CTRL
#define RTL8367C_DOT1X_PORT_ENABLE_REG RTL8367C_REG_DOT1X_PORT_ENABLE
#define RTL8367C_DOT1X_MAC_ENABLE_REG RTL8367C_REG_DOT1X_MAC_ENABLE
#define RTL8367C_DOT1X_PORT_AUTH_REG RTL8367C_REG_DOT1X_PORT_AUTH
#define RTL8367C_DOT1X_PORT_OPDIR_REG RTL8367C_REG_DOT1X_PORT_OPDIR
#define RTL8367C_DOT1X_UNAUTH_ACT_BASE RTL8367C_REG_DOT1X_UNAUTH_ACT_W0
#define RTL8367C_DOT1X_UNAUTH_ACT_OFFSET(port) ((port & 0x7) << 1)
#define RTL8367C_DOT1X_UNAUTH_ACT_MASK(port) (RTL8367C_DOT1X_PORT0_UNAUTHBH_MASK << RTL8367C_DOT1X_UNAUTH_ACT_OFFSET(port))
#define RTL8367C_DOT1X_CFG_REG RTL8367C_REG_DOT1X_CFG
#define RTL8367C_REG_L2_LRN_CNT_BASE RTL8367C_REG_L2_LRN_CNT_CTRL0
#define RTL8367C_REG_L2_LRN_CNT_REG(port) (RTL8367C_REG_L2_LRN_CNT_BASE + port)
/* (16'h0b00) mltvlan_reg */
#define RTL8367C_SVLAN_MCAST2S_ENTRY_BASE_REG(index) (RTL8367C_REG_SVLAN_MCAST2S_ENTRY0_CTRL0 + index*5)
/* (16'h0c00) svlan_reg */
#define RTL8367C_SVLAN_MEMBERCFG_BASE_REG(index) (RTL8367C_REG_SVLAN_MEMBERCFG0_CTRL1 + index*3)
#define RTL8367C_SVLAN_C2SCFG_BASE_REG(index) (RTL8367C_REG_SVLAN_C2SCFG0_CTRL0+ index*3)
#define RTL8367C_SVLAN_CFG_REG RTL8367C_REG_SVLAN_CFG
/* (16'h0f00) hsactrl_reg */
#define RTL8367C_SVLAN_S2C_ENTRY_BASE_REG(index) (RTL8367C_REG_SVLAN_SP2C_ENTRY0_CTRL0 + index*2)
/* (16'h1000) mib_reg */
#define RTL8367C_MIB_COUNTER_BASE_REG RTL8367C_REG_MIB_COUNTER0
#define RTL8367C_MIB_ADDRESS_REG RTL8367C_REG_MIB_ADDRESS
#define RTL8367C_MIB_CTRL_REG RTL8367C_REG_MIB_CTRL0
#define RTL8367C_MIB_PORT07_MASK (0xFF<<RTL8367C_PORT0_RESET_OFFSET)
/* (16'h1100) intrpt_reg */
#define RTL8367C_INTR_CTRL_REG RTL8367C_REG_INTR_CTRL
#define RTL8367C_INTR_IMR_REG RTL8367C_REG_INTR_IMR
#define RTL8367C_INTR_IMS_REG RTL8367C_REG_INTR_IMS
#define RTL8367C_INTR_INDICATOR_BASED RTL8367C_REG_LEARN_OVER_INDICATOR
#define RTL8367C_LEARN_OVER_INDICATOR_REG RTL8367C_REG_LEARN_OVER_INDICATOR
#define RTL8367C_SPEED_CHANGE_INDICATOR_REG RTL8367C_REG_SPEED_CHANGE_INDICATOR
#define RTL8367C_PORT_LINKDOWN_INDICATOR_REG RTL8367C_REG_PORT_LINKDOWN_INDICATOR
#define RTL8367C_PORT_LINKUP_INDICATOR_REG RTL8367C_REG_PORT_LINKUP_INDICATOR
#define RTL8367C_REG_METER_EXCEED_INDICATOR_BASE RTL8367C_REG_METER_EXCEED_INDICATOR0
#define RTL8367C_REG_METER_EXCEED_INDICATOR_REG(meter) (RTL8367C_REG_METER_EXCEED_INDICATOR_BASE + (meter >> 4))
#define RTL8367C_REG_METER_EXCEED_INDICATOR_OFFSET(meter) (meter & 0xF)
/* (16'h1200) swcore_reg */
#define RTL8367C_VS_TPID_REG RTL8367C_REG_VS_TPID
#define RTL8367C_SWITCH_MAC_BASE RTL8367C_REG_SWITCH_MAC0
#define RTL8367C_REMARKING_CTRL_REG RTL8367C_REG_SWITCH_CTRL0
#define RTL8367C_QOS_DSCP_REMARK_BASE RTL8367C_REG_QOS_DSCP_REMARK_CTRL0
#define RTL8367C_QOS_DSCP_REMARK_REG(pri) (RTL8367C_QOS_DSCP_REMARK_BASE + (pri >> 1))
#define RTL8367C_QOS_DSCP_REMARK_OFFSET(pri) (((pri) & 0x1) << 3)
#define RTL8367C_QOS_DSCP_REMARK_MASK(pri) (0x3F << RTL8367C_QOS_DSCP_REMARK_OFFSET(pri))
#define RTL8367C_QOS_1Q_REMARK_BASE RTL8367C_REG_QOS_1Q_REMARK_CTRL0
#define RTL8367C_QOS_1Q_REMARK_REG(pri) (RTL8367C_QOS_1Q_REMARK_BASE + (pri >> 2))
#define RTL8367C_QOS_1Q_REMARK_OFFSET(pri) ((pri & 0x3) << 2)
#define RTL8367C_QOS_1Q_REMARK_MASK(pri) (0x7 << RTL8367C_QOS_1Q_REMARK_OFFSET(pri))
#define RTL8367C_PTKGEN_PAYLOAD_CTRL0_REG RTL8367C_REG_PTKGEN_PAYLOAD_CTRL0
#define RTL8367C_PTKGEN_PAYLOAD_CTRL1_REG RTL8367C_REG_PTKGEN_PAYLOAD_CTRL1
#define RTL8367C_SVLAN_UPLINK_PORTMASK_REG RTL8367C_REG_SVLAN_UPLINK_PORTMASK
#define RTL8367C_CPU_PORT_MASK_REG RTL8367C_REG_CPU_PORT_MASK
#define RTL8367C_CPU_CTRL_REG RTL8367C_REG_CPU_CTRL
#define RTL8367C_MIRROR_CTRL_REG RTL8367C_REG_MIRROR_CTRL
#define RTL8367C_FLOWCRTL_EGRESS_QUEUE_ENABLE_BASE RTL8367C_REG_FLOWCRTL_EGRESS_QUEUE_ENABLE_CTRL0
#define RTL8367C_FLOWCRTL_EGRESS_QUEUE_ENABLE_REG(port) (RTL8367C_FLOWCRTL_EGRESS_QUEUE_ENABLE_BASE + (port >> 1))
#define RTL8367C_FLOWCRTL_EGRESS_QUEUE_ENABLE_REG_OFFSET(port) ((port & 0x1) << 3)
#define RTL8367C_FLOWCRTL_EGRESS_QUEUE_ENABLE_REG_MASK(port) (RTL8367C_PORT0_QUEUE_MASK_MASK << RTL8367C_FLOWCRTL_EGRESS_QUEUE_ENABLE_REG_OFFSET(port))
#define RTL8367C_FLOWCTRL_PORT_PAGE_COUNTER_BASE RTL8367C_REG_FLOWCTRL_PORT0_PAGE_COUNTER
#define RTL8367C_FLOWCTRL_PORT_PAGE_COUNTER_REG(port) (RTL8367C_FLOWCTRL_PORT_PAGE_COUNTER_BASE + port)
#define RTL8367C_FLOWCTRL_PORT_PAGE_COUNTER_MASK RTL8367C_FLOWCTRL_PORT0_PAGE_COUNTER_MASK
#define RTL8367C_FLOWCTRL_PORT_PAGE_MAX_BASE RTL8367C_REG_FLOWCTRL_PORT0_PAGE_MAX
#define RTL8367C_FLOWCTRL_PORT_PAGE_MAX_REG(port) (RTL8367C_FLOWCTRL_PORT_PAGE_MAX_BASE + port)
#define RTL8367C_FLOWCTRL_PORT_PAGE_MAX_MASK RTL8367C_FLOWCTRL_PORT0_PAGE_MAX_MASK
#define RTL8367C_FIELD_SELECTOR_REG(index) (RTL8367C_REG_FIELD_SELECTOR0 + index)
#define RTL8367C_FIELD_SELECTOR_ENABLE_OFFSET RTL8367C_FIELD_SELECTOR0_ENABLE_OFFSET
#define RTL8367C_FIELD_SELECTOR_ENABLE_MASK RTL8367C_FIELD_SELECTOR0_ENABLE_MASK
#define RTL8367C_FIELD_SELECTOR_FORMAT_OFFSET RTL8367C_FIELD_SELECTOR0_FORMAT_OFFSET
#define RTL8367C_FIELD_SELECTOR_FORMAT_MASK RTL8367C_FIELD_SELECTOR0_FORMAT_MASK
#define RTL8367C_FIELD_SELECTOR_OFFSET_OFFSET RTL8367C_FIELD_SELECTOR0_OFFSET_OFFSET
#define RTL8367C_FIELD_SELECTOR_OFFSET_MASK RTL8367C_FIELD_SELECTOR0_OFFSET_MASK
/* (16'h1300) chip_reg*/
/* (16'h1400) mtrpool_reg */
#define RTL8367C_METER_RATE_BASE RTL8367C_REG_METER0_RATE_CTRL0
#define RTL8367C_METER_RATE_REG(meter) ((meter << 1) + RTL8367C_METER_RATE_BASE)
#define RTL8367C_METER_BUCKET_SIZE_BASE RTL8367C_REG_METER0_BUCKET_SIZE
#define RTL8367C_METER_BUCKET_SIZE_REG(meter) (RTL8367C_METER_BUCKET_SIZE_BASE + meter)
#define RTL8367C_LEAKY_BUCKET_TICK_REG RTL8367C_REG_METER_CTRL0
#define RTL8367C_LEAKY_BUCKET_TICK_OFFSET RTL8367C_METER_TICK_OFFSET
#define RTL8367C_LEAKY_BUCKET_TICK_MASK RTL8367C_METER_TICK_MASK
#define RTL8367C_LEAKY_BUCKET_TOKEN_REG RTL8367C_REG_METER_CTRL1
#define RTL8367C_LEAKY_BUCKET_TOKEN_OFFSET RTL8367C_METER_CTRL1_OFFSET
#define RTL8367C_LEAKY_BUCKET_TOKEN_MASK RTL8367C_METER_CTRL1_MASK
#define RTL8367C_METER_OVERRATE_INDICATOR_BASE RTL8367C_REG_METER_OVERRATE_INDICATOR0
#define RTL8367C_METER_OVERRATE_INDICATOR_REG(meter) (RTL8367C_METER_OVERRATE_INDICATOR_BASE + (meter >> 4))
#define RTL8367C_METER_EXCEED_OFFSET(meter) (meter & 0xF)
#define RTL8367C_METER_EXCEED_MASK(meter) (1 << RTL8367C_METER_EXCEED_OFFSET(meter))
#define RTL8367C_METER_IFG_CTRL_BASE RTL8367C_REG_METER_IFG_CTRL0
#define RTL8367C_METER_IFG_CTRL_REG(meter) (RTL8367C_METER_IFG_CTRL_BASE + (meter >> 4))
#define RTL8367C_METER_IFG_OFFSET(meter) (meter & 0xF)
#define RTL8367C_METER_IFG_MASK(meter) (1 << RTL8367C_METER_IFG_OFFSET(meter))
#define RTL8367C_FLOWCTRL_CTRL_REG RTL8367C_REG_FLOWCTRL_CTRL0
/* (16'h1800)8051_RLDP_EEE_reg */
#define RTL8367C_EEELLDP_CTRL0_REG RTL8367C_REG_EEELLDP_CTRL0
#define RTL8367C_EEELLDP_CTRL1_REG RTL8367C_REG_EEELLDP_CTRL1
#define RTL8367C_EEELLDP_PMSK_REG RTL8367C_REG_EEELLDP_PMSK
#define RTL8367C_EEELLDP_TX_FRAMEU_REG_BASE RTL8367C_REG_EEELLDP_FRAMEU00
#define RTL8367C_EEELLDP_TX_CAP_FRAMEL_REG_BASE RTL8367C_REG_EEELLDP_CAP_FRAMEL00
#define RTL8367C_EEELLDP_RX_VALUE_PORT_BASE RTL8367C_REG_EEELLDP_RX_VALUE_P00_00
#define RTL8367C_EEELLDP_RX_VALUE_PORT_REG(port) (RTL8367C_EEELLDP_RX_VALUE_PORT_BASE + (port * 9))
#define RTL8367C_RLDP_CTRL0_REG RTL8367C_REG_RLDP_CTRL0
#define RTL8367C_RLDP_MODE_OFFSET 14
#define RTL8367C_RLDP_RETRY_COUNT_REG RTL8367C_REG_RLDP_CTRL1
#define RTL8367C_RLDP_RETRY_PERIOD_LOOPSTATE_REG RTL8367C_REG_RLDP_CTRL2
#define RTL8367C_RLDP_RETRY_PERIOD_CHKSTATE_REG RTL8367C_REG_RLDP_CTRL3
#define RTL8367C_RLDP_TX_PMSK_REG RTL8367C_REG_RLDP_CTRL4
#define RTL8367C_RLDP_RAND_NUM_REG_BASE RTL8367C_REG_RLDP_RAND_NUM0
#define RTL8367C_RLDP_MAGIC_NUM_REG_BASE RTL8367C_REG_RLDP_MAGIC_NUM0
#define RTL8367C_RLDP_LOOP_PMSK_REG RTL8367C_REG_RLDP_LOOPSTATUS_INDICATOR
#define RTL8367C_RLDP_LOOP_PORT_BASE RTL8367C_REG_RLDP_LOOP_PORT_REG0
#define RTL8367C_RLDP_LOOP_PORT_REG(port) (RTL8367C_RLDP_LOOP_PORT_BASE + (port >> 1))
#define RTL8367C_RLDP_LOOP_PORT_OFFSET(port) ((port & 0x1) << 3)
#define RTL8367C_RLDP_LOOP_PORT_MASK(port) (RTL8367C_RLDP_LOOP_PORT_00_MASK << RTL8367C_RLDP_LOOP_PORT_OFFSET(port))
#define RTL8367C_PAGEMETER_PORT_BASE RTL8367C_REG_PAGEMETER_PORT0_CTRL0
#define RTL8367C_PAGEMETER_PORT_REG(port) (RTL8367C_PAGEMETER_PORT_BASE + 0x20*port)
#define RTL8367C_HIGHPRI_INDICATOR_REG RTL8367C_REG_HIGHPRI_INDICATOR
#define RTL8367C_PORT_INDICATOR_OFFSET(port) (port)
#define RTL8367C_PORT_INDICATOR_MASK(port) (RTL8367C_PORT0_INDICATOR_MASK << RTL8367C_PORT_INDICATOR_OFFSET(port))
#define RTL8367C_HIGHPRI_CFG_REG RTL8367C_REG_HIGHPRI_CFG
#define RTL8367C_EAV_PRIORITY_REMAPPING_BASE RTL8367C_REG_EAV_CTRL1
#define RTL8367C_EAV_PRIORITY_REMAPPING_REG(pri) (RTL8367C_EAV_PRIORITY_REMAPPING_BASE + (pri >> 2))
#define RTL8367C_EAV_PRIORITY_REMAPPING_OFFSET(pri) ((pri & 0x3) * RTL8367C_REMAP_EAV_PRI1_REGEN_OFFSET)
#define RTL8367C_EAV_PRIORITY_REMAPPING_MASK(pri) (RTL8367C_REMAP_EAV_PRI0_REGEN_MASK << RTL8367C_EAV_PRIORITY_REMAPPING_OFFSET(pri))
#define RTL8367C_EEEP_CFG_BASE RTL8367C_REG_PORT0_EEECFG
#define RTL8367C_EEEP_CFG_REG(port) (RTL8367C_EEEP_CFG_BASE + (port*0x20))
#define RTL8367C_PKG_CFG_BASE RTL8367C_REG_PKTGEN_PORT0_CTRL
#define RTL8367C_PKG_CFG_REG(port) (RTL8367C_PKG_CFG_BASE + (port*0x20))
#define RTL8367C_PKG_DA_BASE RTL8367C_REG_PKTGEN_PORT0_DA0
#define RTL8367C_PKG_DA_REG(port) (RTL8367C_PKG_DA_BASE + (port*0x20))
#define RTL8367C_PKG_SA_BASE RTL8367C_REG_PKTGEN_PORT0_SA0
#define RTL8367C_PKG_SA_REG(port) (RTL8367C_PKG_SA_BASE + (port*0x20))
#define RTL8367C_PKG_NUM_BASE RTL8367C_REG_PKTGEN_PORT0_COUNTER0
#define RTL8367C_PKG_NUM_REG(port) (RTL8367C_PKG_NUM_BASE + (port*0x20))
#define RTL8367C_PKG_LENGTH_BASE RTL8367C_REG_PKTGEN_PORT0_TX_LENGTH
#define RTL8367C_PKG_LENGTH_REG(port) (RTL8367C_PKG_LENGTH_BASE + (port*0x20))
/* (16'h1c00)IGMP_MLD_reg */
#define RTL8367C_IGMP_GROUP_USAGE_BASE RTL8367C_REG_IGMP_GROUP_USAGE_LIST0
#define RTL8367C_IGMP_GROUP_USAGE_REG(idx) (RTL8367C_IGMP_GROUP_USAGE_BASE + (idx / 16))
#define RTL8367C_FALLBACK_BASE RTL8367C_REG_FALLBACK_PORT0_CFG0
#define RTL8367C_FALLBACK_PORT_CFG_REG(port) (RTL8367C_FALLBACK_BASE + (port * 4))
#define RTL8367C_FALLBACK_PORT_MON_CNT_REG(port) (RTL8367C_FALLBACK_BASE + 1 + (port * 4))
#define RTL8367C_FALLBACK_PORT_ERR_CNT_REG(port) (RTL8367C_FALLBACK_BASE + 3 + (port * 4))
/* (16'h6400)timer_1588 */
#define RTL8367C_EAV_CFG_BASE RTL8367C_REG_P0_EAV_CFG
#define RTL8367C_EAV_PORT_CFG_REG(port) (RTL8367C_EAV_CFG_BASE + (port *0x10))
#define RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET RTL8367C_P0_EAV_CFG_PTP_PHY_EN_EN_OFFSET
#define RTL8367C_EAV_CFG_RX_PDELAY_RESP_OFFSET RTL8367C_P0_EAV_CFG_RX_PDELAY_RESP_OFFSET
#define RTL8367C_EAV_CFG_RX_PDELAY_REQ_OFFSET RTL8367C_P0_EAV_CFG_RX_PDELAY_REQ_OFFSET
#define RTL8367C_EAV_CFG_RX_DELAY_REQ_OFFSET RTL8367C_P0_EAV_CFG_RX_DELAY_REQ_OFFSET
#define RTL8367C_EAV_CFG_RX_SYNC_OFFSET RTL8367C_P0_EAV_CFG_RX_SYNC_OFFSET
#define RTL8367C_EAV_CFG_TX_PDELAY_RESP_OFFSET RTL8367C_P0_EAV_CFG_TX_PDELAY_RESP_OFFSET
#define RTL8367C_EAV_CFG_TX_PDELAY_REQ_OFFSET RTL8367C_P0_EAV_CFG_TX_PDELAY_REQ_OFFSET
#define RTL8367C_EAV_CFG_TX_DELAY_REQ_OFFSET RTL8367C_P0_EAV_CFG_TX_DELAY_REQ_OFFSET
#define RTL8367C_EAV_CFG_TX_SYNC_OFFSET RTL8367C_P0_EAV_CFG_TX_SYNC_OFFSET
#define RTL8367C_REG_TX_SYNC_SEQ_ID_BASE RTL8367C_REG_P0_TX_SYNC_SEQ_ID
#define RTL8367C_REG_TX_SYNC_SEQ_ID(port) (RTL8367C_REG_TX_SYNC_SEQ_ID_BASE + (port *0x10))
#define RTL8367C_REG_SEQ_ID(port, type) (RTL8367C_REG_TX_SYNC_SEQ_ID_BASE + type + (port *0x10))
#define RTL8367C_REG_TX_DELAY_REQ_SEQ_ID_BASE RTL8367C_REG_P0_TX_DELAY_REQ_SEQ_ID
#define RTL8367C_REG_TX_PDELAY_REQ_SEQ_ID_BASE RTL8367C_REG_P0_TX_PDELAY_REQ_SEQ_ID
#define RTL8367C_REG_TX_PDELAY_RESP_SEQ_ID_BASE RTL8367C_REG_P0_TX_PDELAY_RESP_SEQ_ID
#define RTL8367C_REG_RX_SYNC_SEQ_ID_BASE RTL8367C_REG_P0_RX_SYNC_SEQ_ID
#define RTL8367C_REG_RX_DELAY_REQ_SEQ_ID_BASE RTL8367C_REG_P0_RX_DELAY_REQ_SEQ_ID
#define RTL8367C_REG_RX_PDELAY_REQ_SEQ_ID_BASE RTL8367C_REG_P0_RX_PDELAY_REQ_SEQ_ID
#define RTL8367C_REG_RX_PDELAY_RESP_SEQ_ID_BASE RTL8367C_REG_P0_RX_PDELAY_RESP_SEQ_ID
#define RTL8367C_REG_PORT_NSEC_L_BASE RTL8367C_REG_P0_PORT_NSEC_15_0
#define RTL8367C_REG_PORT_NSEC_L(port) (RTL8367C_REG_PORT_NSEC_L_BASE + (port *0x10))
#define RTL8367C_REG_PORT_NSEC_H_BASE RTL8367C_REG_P0_PORT_NSEC_26_16
#define RTL8367C_REG_PORT_NSEC_H(port) (RTL8367C_REG_PORT_NSEC_H_BASE + (port *0x10))
#define RTL8367C_PORT_NSEC_H_OFFSET RTL8367C_P0_PORT_NSEC_26_16_OFFSET
#define RTL8367C_PORT_NSEC_H_MASK RTL8367C_P0_PORT_NSEC_26_16_MASK
#define RTL8367C_REG_PORT_SEC_L_BASE RTL8367C_REG_P0_PORT_SEC_15_0
#define RTL8367C_REG_PORT_SEC_L(port) (RTL8367C_REG_PORT_SEC_L_BASE + (port *0x10))
#define RTL8367C_REG_PORT_SEC_H_BASE RTL8367C_REG_P0_PORT_SEC_31_16
#define RTL8367C_REG_PORT_SEC_H(port) (RTL8367C_REG_PORT_SEC_H_BASE + (port *0x10))
#endif /*#ifndef _RTL8367C_BASE_H_*/

View file

@ -0,0 +1,54 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* Purpose : RTL8367C switch low-level function for access register
* Feature : SMI related functions
*
*/
#ifndef __SMI_H__
#define __SMI_H__
#include <rtk_types.h>
#include "rtk_error.h"
#define MDC_MDIO_CTRL0_REG 31
#define MDC_MDIO_START_REG 29
#define MDC_MDIO_CTRL1_REG 21
#define MDC_MDIO_ADDRESS_REG 23
#define MDC_MDIO_DATA_WRITE_REG 24
#define MDC_MDIO_DATA_READ_REG 25
#define MDC_MDIO_PREAMBLE_LEN 32
#define MDC_MDIO_START_OP 0xFFFF
#define MDC_MDIO_ADDR_OP 0x000E
#define MDC_MDIO_READ_OP 0x0001
#define MDC_MDIO_WRITE_OP 0x0003
#define SPI_READ_OP 0x3
#define SPI_WRITE_OP 0x2
#define SPI_READ_OP_LEN 0x8
#define SPI_WRITE_OP_LEN 0x8
#define SPI_REG_LEN 16
#define SPI_DATA_LEN 16
#define GPIO_DIR_IN 1
#define GPIO_DIR_OUT 0
#define ack_timer 5
#define DELAY 10000
#define CLK_DURATION(clk) { int i; for(i=0; i<clk; i++); }
rtk_int32 smi_read(rtk_uint32 mAddrs, rtk_uint32 *rData);
rtk_int32 smi_write(rtk_uint32 mAddrs, rtk_uint32 rData);
#endif /* __SMI_H__ */

View file

@ -0,0 +1,433 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* Purpose : RTL8367/RTL8367C switch high-level API
*
* Feature : The file includes MIB module high-layer API defination
*
*/
#ifndef __RTK_API_STAT_H__
#define __RTK_API_STAT_H__
/*
* Data Type Declaration
*/
typedef rtk_u_long_t rtk_stat_counter_t;
/* global statistic counter structure */
typedef struct rtk_stat_global_cntr_s
{
rtk_uint64 dot1dTpLearnedEntryDiscards;
}rtk_stat_global_cntr_t;
typedef enum rtk_stat_global_type_e
{
DOT1D_TP_LEARNED_ENTRY_DISCARDS_INDEX = 58,
MIB_GLOBAL_CNTR_END
}rtk_stat_global_type_t;
/* port statistic counter structure */
typedef struct rtk_stat_port_cntr_s
{
rtk_uint64 ifInOctets;
rtk_uint32 dot3StatsFCSErrors;
rtk_uint32 dot3StatsSymbolErrors;
rtk_uint32 dot3InPauseFrames;
rtk_uint32 dot3ControlInUnknownOpcodes;
rtk_uint32 etherStatsFragments;
rtk_uint32 etherStatsJabbers;
rtk_uint32 ifInUcastPkts;
rtk_uint32 etherStatsDropEvents;
rtk_uint64 etherStatsOctets;
rtk_uint32 etherStatsUndersizePkts;
rtk_uint32 etherStatsOversizePkts;
rtk_uint32 etherStatsPkts64Octets;
rtk_uint32 etherStatsPkts65to127Octets;
rtk_uint32 etherStatsPkts128to255Octets;
rtk_uint32 etherStatsPkts256to511Octets;
rtk_uint32 etherStatsPkts512to1023Octets;
rtk_uint32 etherStatsPkts1024toMaxOctets;
rtk_uint32 etherStatsMcastPkts;
rtk_uint32 etherStatsBcastPkts;
rtk_uint64 ifOutOctets;
rtk_uint32 dot3StatsSingleCollisionFrames;
rtk_uint32 dot3StatsMultipleCollisionFrames;
rtk_uint32 dot3StatsDeferredTransmissions;
rtk_uint32 dot3StatsLateCollisions;
rtk_uint32 etherStatsCollisions;
rtk_uint32 dot3StatsExcessiveCollisions;
rtk_uint32 dot3OutPauseFrames;
rtk_uint32 dot1dBasePortDelayExceededDiscards;
rtk_uint32 dot1dTpPortInDiscards;
rtk_uint32 ifOutUcastPkts;
rtk_uint32 ifOutMulticastPkts;
rtk_uint32 ifOutBrocastPkts;
rtk_uint32 outOampduPkts;
rtk_uint32 inOampduPkts;
rtk_uint32 pktgenPkts;
rtk_uint32 inMldChecksumError;
rtk_uint32 inIgmpChecksumError;
rtk_uint32 inMldSpecificQuery;
rtk_uint32 inMldGeneralQuery;
rtk_uint32 inIgmpSpecificQuery;
rtk_uint32 inIgmpGeneralQuery;
rtk_uint32 inMldLeaves;
rtk_uint32 inIgmpLeaves;
rtk_uint32 inIgmpJoinsSuccess;
rtk_uint32 inIgmpJoinsFail;
rtk_uint32 inMldJoinsSuccess;
rtk_uint32 inMldJoinsFail;
rtk_uint32 inReportSuppressionDrop;
rtk_uint32 inLeaveSuppressionDrop;
rtk_uint32 outIgmpReports;
rtk_uint32 outIgmpLeaves;
rtk_uint32 outIgmpGeneralQuery;
rtk_uint32 outIgmpSpecificQuery;
rtk_uint32 outMldReports;
rtk_uint32 outMldLeaves;
rtk_uint32 outMldGeneralQuery;
rtk_uint32 outMldSpecificQuery;
rtk_uint32 inKnownMulticastPkts;
rtk_uint32 ifInMulticastPkts;
rtk_uint32 ifInBroadcastPkts;
rtk_uint32 ifOutDiscards;
}rtk_stat_port_cntr_t;
/* port statistic counter index */
typedef enum rtk_stat_port_type_e
{
STAT_IfInOctets = 0,
STAT_Dot3StatsFCSErrors,
STAT_Dot3StatsSymbolErrors,
STAT_Dot3InPauseFrames,
STAT_Dot3ControlInUnknownOpcodes,
STAT_EtherStatsFragments,
STAT_EtherStatsJabbers,
STAT_IfInUcastPkts,
STAT_EtherStatsDropEvents,
STAT_EtherStatsOctets,
STAT_EtherStatsUnderSizePkts,
STAT_EtherOversizeStats,
STAT_EtherStatsPkts64Octets,
STAT_EtherStatsPkts65to127Octets,
STAT_EtherStatsPkts128to255Octets,
STAT_EtherStatsPkts256to511Octets,
STAT_EtherStatsPkts512to1023Octets,
STAT_EtherStatsPkts1024to1518Octets,
STAT_EtherStatsMulticastPkts,
STAT_EtherStatsBroadcastPkts,
STAT_IfOutOctets,
STAT_Dot3StatsSingleCollisionFrames,
STAT_Dot3StatsMultipleCollisionFrames,
STAT_Dot3StatsDeferredTransmissions,
STAT_Dot3StatsLateCollisions,
STAT_EtherStatsCollisions,
STAT_Dot3StatsExcessiveCollisions,
STAT_Dot3OutPauseFrames,
STAT_Dot1dBasePortDelayExceededDiscards,
STAT_Dot1dTpPortInDiscards,
STAT_IfOutUcastPkts,
STAT_IfOutMulticastPkts,
STAT_IfOutBroadcastPkts,
STAT_OutOampduPkts,
STAT_InOampduPkts,
STAT_PktgenPkts,
STAT_InMldChecksumError,
STAT_InIgmpChecksumError,
STAT_InMldSpecificQuery,
STAT_InMldGeneralQuery,
STAT_InIgmpSpecificQuery,
STAT_InIgmpGeneralQuery,
STAT_InMldLeaves,
STAT_InIgmpInterfaceLeaves,
STAT_InIgmpJoinsSuccess,
STAT_InIgmpJoinsFail,
STAT_InMldJoinsSuccess,
STAT_InMldJoinsFail,
STAT_InReportSuppressionDrop,
STAT_InLeaveSuppressionDrop,
STAT_OutIgmpReports,
STAT_OutIgmpLeaves,
STAT_OutIgmpGeneralQuery,
STAT_OutIgmpSpecificQuery,
STAT_OutMldReports,
STAT_OutMldLeaves,
STAT_OutMldGeneralQuery,
STAT_OutMldSpecificQuery,
STAT_InKnownMulticastPkts,
STAT_IfInMulticastPkts,
STAT_IfInBroadcastPkts,
STAT_IfOutDiscards,
STAT_PORT_CNTR_END
}rtk_stat_port_type_t;
typedef enum rtk_logging_counter_mode_e
{
LOGGING_MODE_32BIT = 0,
LOGGING_MODE_64BIT,
LOGGING_MODE_END
}rtk_logging_counter_mode_t;
typedef enum rtk_logging_counter_type_e
{
LOGGING_TYPE_PACKET = 0,
LOGGING_TYPE_BYTE,
LOGGING_TYPE_END
}rtk_logging_counter_type_t;
typedef enum rtk_stat_lengthMode_e
{
LENGTH_MODE_EXC_TAG = 0,
LENGTH_MODE_INC_TAG,
LENGTH_MODE_END
}rtk_stat_lengthMode_t;
/* Function Name:
* rtk_stat_global_reset
* Description:
* Reset global MIB counter.
* Input:
* None
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* Reset MIB counter of ports. API will use global reset while port mask is all-ports.
*/
extern rtk_api_ret_t rtk_stat_global_reset(void);
/* Function Name:
* rtk_stat_port_reset
* Description:
* Reset per port MIB counter by port.
* Input:
* port - port id.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
*
*/
extern rtk_api_ret_t rtk_stat_port_reset(rtk_port_t port);
/* Function Name:
* rtk_stat_queueManage_reset
* Description:
* Reset queue manage MIB counter.
* Input:
* None
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
*
*/
extern rtk_api_ret_t rtk_stat_queueManage_reset(void);
/* Function Name:
* rtk_stat_global_get
* Description:
* Get global MIB counter
* Input:
* cntr_idx - global counter index.
* Output:
* pCntr - global counter value.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* Get global MIB counter by index definition.
*/
extern rtk_api_ret_t rtk_stat_global_get(rtk_stat_global_type_t cntr_idx, rtk_stat_counter_t *pCntr);
/* Function Name:
* rtk_stat_global_getAll
* Description:
* Get all global MIB counter
* Input:
* None
* Output:
* pGlobal_cntrs - global counter structure.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* Get all global MIB counter by index definition.
*/
extern rtk_api_ret_t rtk_stat_global_getAll(rtk_stat_global_cntr_t *pGlobal_cntrs);
/* Function Name:
* rtk_stat_port_get
* Description:
* Get per port MIB counter by index
* Input:
* port - port id.
* cntr_idx - port counter index.
* Output:
* pCntr - MIB retrived counter.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* Get per port MIB counter by index definition.
*/
extern rtk_api_ret_t rtk_stat_port_get(rtk_port_t port, rtk_stat_port_type_t cntr_idx, rtk_stat_counter_t *pCntr);
/* Function Name:
* rtk_stat_port_getAll
* Description:
* Get all counters of one specified port in the specified device.
* Input:
* port - port id.
* Output:
* pPort_cntrs - buffer pointer of counter value.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* Get all MIB counters of one port.
*/
extern rtk_api_ret_t rtk_stat_port_getAll(rtk_port_t port, rtk_stat_port_cntr_t *pPort_cntrs);
/* Function Name:
* rtk_stat_logging_counterCfg_set
* Description:
* Set the type and mode of Logging Counter
* Input:
* idx - The index of Logging Counter. Should be even number only.(0,2,4,6,8.....30)
* mode - 32 bits or 64 bits mode
* type - Packet counter or byte counter
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_OUT_OF_RANGE - Out of range.
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* Set the type and mode of Logging Counter.
*/
extern rtk_api_ret_t rtk_stat_logging_counterCfg_set(rtk_uint32 idx, rtk_logging_counter_mode_t mode, rtk_logging_counter_type_t type);
/* Function Name:
* rtk_stat_logging_counterCfg_get
* Description:
* Get the type and mode of Logging Counter
* Input:
* idx - The index of Logging Counter. Should be even number only.(0,2,4,6,8.....30)
* Output:
* pMode - 32 bits or 64 bits mode
* pType - Packet counter or byte counter
* Return:
* RT_ERR_OK - OK
* RT_ERR_OUT_OF_RANGE - Out of range.
* RT_ERR_FAILED - Failed
* RT_ERR_NULL_POINTER - NULL Pointer
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* Get the type and mode of Logging Counter.
*/
extern rtk_api_ret_t rtk_stat_logging_counterCfg_get(rtk_uint32 idx, rtk_logging_counter_mode_t *pMode, rtk_logging_counter_type_t *pType);
/* Function Name:
* rtk_stat_logging_counter_reset
* Description:
* Reset Logging Counter
* Input:
* idx - The index of Logging Counter. (0~31)
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_OUT_OF_RANGE - Out of range.
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* Reset Logging Counter.
*/
extern rtk_api_ret_t rtk_stat_logging_counter_reset(rtk_uint32 idx);
/* Function Name:
* rtk_stat_logging_counter_get
* Description:
* Get Logging Counter
* Input:
* idx - The index of Logging Counter. (0~31)
* Output:
* pCnt - Logging counter value
* Return:
* RT_ERR_OK - OK
* RT_ERR_OUT_OF_RANGE - Out of range.
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* Get Logging Counter.
*/
extern rtk_api_ret_t rtk_stat_logging_counter_get(rtk_uint32 idx, rtk_uint32 *pCnt);
/* Function Name:
* rtk_stat_lengthMode_set
* Description:
* Set Legnth mode.
* Input:
* txMode - The length counting mode
* rxMode - The length counting mode
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_INPUT - Out of range.
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
*
*/
extern rtk_api_ret_t rtk_stat_lengthMode_set(rtk_stat_lengthMode_t txMode, rtk_stat_lengthMode_t rxMode);
/* Function Name:
* rtk_stat_lengthMode_get
* Description:
* Get Legnth mode.
* Input:
* None.
* Output:
* pTxMode - The length counting mode
* pRxMode - The length counting mode
* Return:
* RT_ERR_OK - OK
* RT_ERR_INPUT - Out of range.
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
*/
extern rtk_api_ret_t rtk_stat_lengthMode_get(rtk_stat_lengthMode_t *pTxMode, rtk_stat_lengthMode_t *pRxMode);
#endif /* __RTK_API_STAT_H__ */

View file

@ -0,0 +1,422 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* Purpose : RTL8367/RTL8367C switch high-level API
*
* Feature : The file includes Storm module high-layer API defination
*
*/
#ifndef __RTK_API_STORM_H__
#define __RTK_API_STORM_H__
#define STORM_UNUC_INDEX 28
#define STORM_UNMC_INDEX 29
#define STORM_MC_INDEX 30
#define STORM_BC_INDEX 31
typedef enum rtk_rate_storm_group_e
{
STORM_GROUP_UNKNOWN_UNICAST = 0,
STORM_GROUP_UNKNOWN_MULTICAST,
STORM_GROUP_MULTICAST,
STORM_GROUP_BROADCAST,
STORM_GROUP_END
} rtk_rate_storm_group_t;
typedef enum rtk_storm_bypass_e
{
BYPASS_BRG_GROUP = 0,
BYPASS_FD_PAUSE,
BYPASS_SP_MCAST,
BYPASS_1X_PAE,
BYPASS_UNDEF_BRG_04,
BYPASS_UNDEF_BRG_05,
BYPASS_UNDEF_BRG_06,
BYPASS_UNDEF_BRG_07,
BYPASS_PROVIDER_BRIDGE_GROUP_ADDRESS,
BYPASS_UNDEF_BRG_09,
BYPASS_UNDEF_BRG_0A,
BYPASS_UNDEF_BRG_0B,
BYPASS_UNDEF_BRG_0C,
BYPASS_PROVIDER_BRIDGE_GVRP_ADDRESS,
BYPASS_8021AB,
BYPASS_UNDEF_BRG_0F,
BYPASS_BRG_MNGEMENT,
BYPASS_UNDEFINED_11,
BYPASS_UNDEFINED_12,
BYPASS_UNDEFINED_13,
BYPASS_UNDEFINED_14,
BYPASS_UNDEFINED_15,
BYPASS_UNDEFINED_16,
BYPASS_UNDEFINED_17,
BYPASS_UNDEFINED_18,
BYPASS_UNDEFINED_19,
BYPASS_UNDEFINED_1A,
BYPASS_UNDEFINED_1B,
BYPASS_UNDEFINED_1C,
BYPASS_UNDEFINED_1D,
BYPASS_UNDEFINED_1E,
BYPASS_UNDEFINED_1F,
BYPASS_GMRP,
BYPASS_GVRP,
BYPASS_UNDEF_GARP_22,
BYPASS_UNDEF_GARP_23,
BYPASS_UNDEF_GARP_24,
BYPASS_UNDEF_GARP_25,
BYPASS_UNDEF_GARP_26,
BYPASS_UNDEF_GARP_27,
BYPASS_UNDEF_GARP_28,
BYPASS_UNDEF_GARP_29,
BYPASS_UNDEF_GARP_2A,
BYPASS_UNDEF_GARP_2B,
BYPASS_UNDEF_GARP_2C,
BYPASS_UNDEF_GARP_2D,
BYPASS_UNDEF_GARP_2E,
BYPASS_UNDEF_GARP_2F,
BYPASS_IGMP,
BYPASS_CDP,
BYPASS_CSSTP,
BYPASS_LLDP,
BYPASS_END,
}rtk_storm_bypass_t;
/* Function Name:
* rtk_rate_stormControlMeterIdx_set
* Description:
* Set the storm control meter index.
* Input:
* port - port id
* storm_type - storm group type
* index - storm control meter index.
* Output:
* None.
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT_ID - Invalid port id
* RT_ERR_FILTER_METER_ID - Invalid meter
* Note:
*
*/
extern rtk_api_ret_t rtk_rate_stormControlMeterIdx_set(rtk_port_t port, rtk_rate_storm_group_t stormType, rtk_uint32 index);
/* Function Name:
* rtk_rate_stormControlMeterIdx_get
* Description:
* Get the storm control meter index.
* Input:
* port - port id
* storm_type - storm group type
* Output:
* pIndex - storm control meter index.
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT_ID - Invalid port id
* RT_ERR_FILTER_METER_ID - Invalid meter
* Note:
*
*/
extern rtk_api_ret_t rtk_rate_stormControlMeterIdx_get(rtk_port_t port, rtk_rate_storm_group_t stormType, rtk_uint32 *pIndex);
/* Function Name:
* rtk_rate_stormControlPortEnable_set
* Description:
* Set enable status of storm control on specified port.
* Input:
* port - port id
* stormType - storm group type
* enable - enable status of storm control
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_NOT_INIT - The module is not initial
* RT_ERR_PORT_ID - invalid port id
* RT_ERR_INPUT - invalid input parameter
* Note:
*
*/
extern rtk_api_ret_t rtk_rate_stormControlPortEnable_set(rtk_port_t port, rtk_rate_storm_group_t stormType, rtk_enable_t enable);
/* Function Name:
* rtk_rate_stormControlPortEnable_set
* Description:
* Set enable status of storm control on specified port.
* Input:
* port - port id
* stormType - storm group type
* Output:
* pEnable - enable status of storm control
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_NOT_INIT - The module is not initial
* RT_ERR_PORT_ID - invalid port id
* RT_ERR_INPUT - invalid input parameter
* Note:
*
*/
extern rtk_api_ret_t rtk_rate_stormControlPortEnable_get(rtk_port_t port, rtk_rate_storm_group_t stormType, rtk_enable_t *pEnable);
/* Function Name:
* rtk_storm_bypass_set
* Description:
* Set bypass storm filter control configuration.
* Input:
* type - Bypass storm filter control type.
* enable - Bypass status.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_ENABLE - Invalid IFG parameter
* Note:
*
* This API can set per-port bypass stomr filter control frame type including RMA and igmp.
* The bypass frame type is as following:
* - BYPASS_BRG_GROUP,
* - BYPASS_FD_PAUSE,
* - BYPASS_SP_MCAST,
* - BYPASS_1X_PAE,
* - BYPASS_UNDEF_BRG_04,
* - BYPASS_UNDEF_BRG_05,
* - BYPASS_UNDEF_BRG_06,
* - BYPASS_UNDEF_BRG_07,
* - BYPASS_PROVIDER_BRIDGE_GROUP_ADDRESS,
* - BYPASS_UNDEF_BRG_09,
* - BYPASS_UNDEF_BRG_0A,
* - BYPASS_UNDEF_BRG_0B,
* - BYPASS_UNDEF_BRG_0C,
* - BYPASS_PROVIDER_BRIDGE_GVRP_ADDRESS,
* - BYPASS_8021AB,
* - BYPASS_UNDEF_BRG_0F,
* - BYPASS_BRG_MNGEMENT,
* - BYPASS_UNDEFINED_11,
* - BYPASS_UNDEFINED_12,
* - BYPASS_UNDEFINED_13,
* - BYPASS_UNDEFINED_14,
* - BYPASS_UNDEFINED_15,
* - BYPASS_UNDEFINED_16,
* - BYPASS_UNDEFINED_17,
* - BYPASS_UNDEFINED_18,
* - BYPASS_UNDEFINED_19,
* - BYPASS_UNDEFINED_1A,
* - BYPASS_UNDEFINED_1B,
* - BYPASS_UNDEFINED_1C,
* - BYPASS_UNDEFINED_1D,
* - BYPASS_UNDEFINED_1E,
* - BYPASS_UNDEFINED_1F,
* - BYPASS_GMRP,
* - BYPASS_GVRP,
* - BYPASS_UNDEF_GARP_22,
* - BYPASS_UNDEF_GARP_23,
* - BYPASS_UNDEF_GARP_24,
* - BYPASS_UNDEF_GARP_25,
* - BYPASS_UNDEF_GARP_26,
* - BYPASS_UNDEF_GARP_27,
* - BYPASS_UNDEF_GARP_28,
* - BYPASS_UNDEF_GARP_29,
* - BYPASS_UNDEF_GARP_2A,
* - BYPASS_UNDEF_GARP_2B,
* - BYPASS_UNDEF_GARP_2C,
* - BYPASS_UNDEF_GARP_2D,
* - BYPASS_UNDEF_GARP_2E,
* - BYPASS_UNDEF_GARP_2F,
* - BYPASS_IGMP.
*/
extern rtk_api_ret_t rtk_storm_bypass_set(rtk_storm_bypass_t type, rtk_enable_t enable);
/* Function Name:
* rtk_storm_bypass_get
* Description:
* Get bypass storm filter control configuration.
* Input:
* type - Bypass storm filter control type.
* Output:
* pEnable - Bypass status.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* This API can get per-port bypass stomr filter control frame type including RMA and igmp.
* The bypass frame type is as following:
* - BYPASS_BRG_GROUP,
* - BYPASS_FD_PAUSE,
* - BYPASS_SP_MCAST,
* - BYPASS_1X_PAE,
* - BYPASS_UNDEF_BRG_04,
* - BYPASS_UNDEF_BRG_05,
* - BYPASS_UNDEF_BRG_06,
* - BYPASS_UNDEF_BRG_07,
* - BYPASS_PROVIDER_BRIDGE_GROUP_ADDRESS,
* - BYPASS_UNDEF_BRG_09,
* - BYPASS_UNDEF_BRG_0A,
* - BYPASS_UNDEF_BRG_0B,
* - BYPASS_UNDEF_BRG_0C,
* - BYPASS_PROVIDER_BRIDGE_GVRP_ADDRESS,
* - BYPASS_8021AB,
* - BYPASS_UNDEF_BRG_0F,
* - BYPASS_BRG_MNGEMENT,
* - BYPASS_UNDEFINED_11,
* - BYPASS_UNDEFINED_12,
* - BYPASS_UNDEFINED_13,
* - BYPASS_UNDEFINED_14,
* - BYPASS_UNDEFINED_15,
* - BYPASS_UNDEFINED_16,
* - BYPASS_UNDEFINED_17,
* - BYPASS_UNDEFINED_18,
* - BYPASS_UNDEFINED_19,
* - BYPASS_UNDEFINED_1A,
* - BYPASS_UNDEFINED_1B,
* - BYPASS_UNDEFINED_1C,
* - BYPASS_UNDEFINED_1D,
* - BYPASS_UNDEFINED_1E,
* - BYPASS_UNDEFINED_1F,
* - BYPASS_GMRP,
* - BYPASS_GVRP,
* - BYPASS_UNDEF_GARP_22,
* - BYPASS_UNDEF_GARP_23,
* - BYPASS_UNDEF_GARP_24,
* - BYPASS_UNDEF_GARP_25,
* - BYPASS_UNDEF_GARP_26,
* - BYPASS_UNDEF_GARP_27,
* - BYPASS_UNDEF_GARP_28,
* - BYPASS_UNDEF_GARP_29,
* - BYPASS_UNDEF_GARP_2A,
* - BYPASS_UNDEF_GARP_2B,
* - BYPASS_UNDEF_GARP_2C,
* - BYPASS_UNDEF_GARP_2D,
* - BYPASS_UNDEF_GARP_2E,
* - BYPASS_UNDEF_GARP_2F,
* - BYPASS_IGMP.
*/
extern rtk_api_ret_t rtk_storm_bypass_get(rtk_storm_bypass_t type, rtk_enable_t *pEnable);
/* Function Name:
* rtk_rate_stormControlExtPortmask_set
* Description:
* Set externsion storm control port mask
* Input:
* pPortmask - port mask
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_NOT_INIT - The module is not initial
* RT_ERR_INPUT - invalid input parameter
* Note:
*
*/
extern rtk_api_ret_t rtk_rate_stormControlExtPortmask_set(rtk_portmask_t *pPortmask);
/* Function Name:
* rtk_rate_stormControlExtPortmask_get
* Description:
* Set externsion storm control port mask
* Input:
* None
* Output:
* pPortmask - port mask
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_NOT_INIT - The module is not initial
* RT_ERR_INPUT - invalid input parameter
* Note:
*
*/
extern rtk_api_ret_t rtk_rate_stormControlExtPortmask_get(rtk_portmask_t *pPortmask);
/* Function Name:
* rtk_rate_stormControlExtEnable_set
* Description:
* Set externsion storm control state
* Input:
* stormType - storm group type
* enable - externsion storm control state
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_NOT_INIT - The module is not initial
* RT_ERR_INPUT - invalid input parameter
* Note:
*
*/
extern rtk_api_ret_t rtk_rate_stormControlExtEnable_set(rtk_rate_storm_group_t stormType, rtk_enable_t enable);
/* Function Name:
* rtk_rate_stormControlExtEnable_get
* Description:
* Get externsion storm control state
* Input:
* stormType - storm group type
* Output:
* pEnable - externsion storm control state
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_NOT_INIT - The module is not initial
* RT_ERR_INPUT - invalid input parameter
* Note:
*
*/
extern rtk_api_ret_t rtk_rate_stormControlExtEnable_get(rtk_rate_storm_group_t stormType, rtk_enable_t *pEnable);
/* Function Name:
* rtk_rate_stormControlExtMeterIdx_set
* Description:
* Set externsion storm control meter index
* Input:
* stormType - storm group type
* index - externsion storm control state
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_NOT_INIT - The module is not initial
* RT_ERR_INPUT - invalid input parameter
* Note:
*
*/
extern rtk_api_ret_t rtk_rate_stormControlExtMeterIdx_set(rtk_rate_storm_group_t stormType, rtk_uint32 index);
/* Function Name:
* rtk_rate_stormControlExtMeterIdx_get
* Description:
* Get externsion storm control meter index
* Input:
* stormType - storm group type
* pIndex - externsion storm control state
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_NOT_INIT - The module is not initial
* RT_ERR_INPUT - invalid input parameter
* Note:
*
*/
extern rtk_api_ret_t rtk_rate_stormControlExtMeterIdx_get(rtk_rate_storm_group_t stormType, rtk_uint32 *pIndex);
#endif /* __RTK_API_STORM_H__ */

View file

@ -0,0 +1,896 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* Purpose : RTL8367/RTL8367C switch high-level API
*
* Feature : The file includes SVLAN module high-layer API defination
*
*/
#ifndef __RTK_API_SVLAN_H__
#define __RTK_API_SVLAN_H__
typedef rtk_uint32 rtk_svlan_index_t;
typedef struct rtk_svlan_memberCfg_s{
rtk_uint32 svid;
rtk_portmask_t memberport;
rtk_portmask_t untagport;
rtk_uint32 fiden;
rtk_uint32 fid;
rtk_uint32 priority;
rtk_uint32 efiden;
rtk_uint32 efid;
}rtk_svlan_memberCfg_t;
typedef enum rtk_svlan_pri_ref_e
{
REF_INTERNAL_PRI = 0,
REF_CTAG_PRI,
REF_SVLAN_PRI,
REF_PB_PRI,
REF_PRI_END
} rtk_svlan_pri_ref_t;
typedef rtk_uint32 rtk_svlan_tpid_t;
typedef enum rtk_svlan_untag_action_e
{
UNTAG_DROP = 0,
UNTAG_TRAP,
UNTAG_ASSIGN,
UNTAG_END
} rtk_svlan_untag_action_t;
typedef enum rtk_svlan_unmatch_action_e
{
UNMATCH_DROP = 0,
UNMATCH_TRAP,
UNMATCH_ASSIGN,
UNMATCH_END
} rtk_svlan_unmatch_action_t;
typedef enum rtk_svlan_unassign_action_e
{
UNASSIGN_PBSVID = 0,
UNASSIGN_TRAP,
UNASSIGN_END
} rtk_svlan_unassign_action_t;
typedef enum rtk_svlan_lookupType_e
{
SVLAN_LOOKUP_S64MBRCGF = 0,
SVLAN_LOOKUP_C4KVLAN,
SVLAN_LOOKUP_END,
} rtk_svlan_lookupType_t;
/* Function Name:
* rtk_svlan_init
* Description:
* Initialize SVLAN Configuration
* Input:
* None
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* Ether type of S-tag in 802.1ad is 0x88a8 and there are existed ether type 0x9100 and 0x9200 for Q-in-Q SLAN design.
* User can set mathced ether type as service provider supported protocol.
*/
extern rtk_api_ret_t rtk_svlan_init(void);
/* Function Name:
* rtk_svlan_servicePort_add
* Description:
* Add one service port in the specified device
* Input:
* port - Port id.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* This API is setting which port is connected to provider switch. All frames receiving from this port must
* contain accept SVID in S-tag field.
*/
extern rtk_api_ret_t rtk_svlan_servicePort_add(rtk_port_t port);
/* Function Name:
* rtk_svlan_servicePort_get
* Description:
* Get service ports in the specified device.
* Input:
* None
* Output:
* pSvlan_portmask - pointer buffer of svlan ports.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* This API is setting which port is connected to provider switch. All frames receiving from this port must
* contain accept SVID in S-tag field.
*/
extern rtk_api_ret_t rtk_svlan_servicePort_get(rtk_portmask_t *pSvlan_portmask);
/* Function Name:
* rtk_svlan_servicePort_del
* Description:
* Delete one service port in the specified device
* Input:
* port - Port id.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* This API is removing SVLAN service port in the specified device.
*/
extern rtk_api_ret_t rtk_svlan_servicePort_del(rtk_port_t port);
/* Function Name:
* rtk_svlan_tpidEntry_set
* Description:
* Configure accepted S-VLAN ether type.
* Input:
* svlan_tag_id - Ether type of S-tag frame parsing in uplink ports.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameter.
* Note:
* Ether type of S-tag in 802.1ad is 0x88a8 and there are existed ether type 0x9100 and 0x9200 for Q-in-Q SLAN design.
* User can set mathced ether type as service provider supported protocol.
*/
extern rtk_api_ret_t rtk_svlan_tpidEntry_set(rtk_uint32 svlan_tag_id);
/* Function Name:
* rtk_svlan_tpidEntry_get
* Description:
* Get accepted S-VLAN ether type setting.
* Input:
* None
* Output:
* pSvlan_tag_id - Ether type of S-tag frame parsing in uplink ports.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* This API is setting which port is connected to provider switch. All frames receiving from this port must
* contain accept SVID in S-tag field.
*/
extern rtk_api_ret_t rtk_svlan_tpidEntry_get(rtk_uint32 *pSvlan_tag_id);
/* Function Name:
* rtk_svlan_priorityRef_set
* Description:
* Set S-VLAN upstream priority reference setting.
* Input:
* ref - reference selection parameter.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameter.
* Note:
* The API can set the upstream SVLAN tag priority reference source. The related priority
* sources are as following:
* - REF_INTERNAL_PRI,
* - REF_CTAG_PRI,
* - REF_SVLAN_PRI,
* - REF_PB_PRI.
*/
extern rtk_api_ret_t rtk_svlan_priorityRef_set(rtk_svlan_pri_ref_t ref);
/* Function Name:
* rtk_svlan_priorityRef_get
* Description:
* Get S-VLAN upstream priority reference setting.
* Input:
* None
* Output:
* pRef - reference selection parameter.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* The API can get the upstream SVLAN tag priority reference source. The related priority
* sources are as following:
* - REF_INTERNAL_PRI,
* - REF_CTAG_PRI,
* - REF_SVLAN_PRI,
* - REF_PB_PRI
*/
extern rtk_api_ret_t rtk_svlan_priorityRef_get(rtk_svlan_pri_ref_t *pRef);
/* Function Name:
* rtk_svlan_memberPortEntry_set
* Description:
* Configure system SVLAN member content
* Input:
* svid - SVLAN id
* psvlan_cfg - SVLAN member configuration
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameter.
* RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
* RT_ERR_PORT_MASK - Invalid portmask.
* RT_ERR_SVLAN_TABLE_FULL - SVLAN configuration is full.
* Note:
* The API can set system 64 accepted s-tag frame format. Only 64 SVID S-tag frame will be accpeted
* to receiving from uplink ports. Other SVID S-tag frame or S-untagged frame will be droped by default setup.
* - rtk_svlan_memberCfg_t->svid is SVID of SVLAN member configuration.
* - rtk_svlan_memberCfg_t->memberport is member port mask of SVLAN member configuration.
* - rtk_svlan_memberCfg_t->fid is filtering database of SVLAN member configuration.
* - rtk_svlan_memberCfg_t->priority is priority of SVLAN member configuration.
*/
extern rtk_api_ret_t rtk_svlan_memberPortEntry_set(rtk_uint32 svid_idx, rtk_svlan_memberCfg_t *psvlan_cfg);
/* Function Name:
* rtk_svlan_memberPortEntry_get
* Description:
* Get SVLAN member Configure.
* Input:
* svid - SVLAN id
* Output:
* pSvlan_cfg - SVLAN member configuration
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_SVLAN_ENTRY_NOT_FOUND - specified svlan entry not found.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can get system 64 accepted s-tag frame format. Only 64 SVID S-tag frame will be accpeted
* to receiving from uplink ports. Other SVID S-tag frame or S-untagged frame will be droped.
*/
extern rtk_api_ret_t rtk_svlan_memberPortEntry_get(rtk_uint32 svid_idx, rtk_svlan_memberCfg_t *pSvlan_cfg);
/* Function Name:
* rtk_svlan_memberPortEntry_adv_set
* Description:
* Configure system SVLAN member by index
* Input:
* idx - Index (0 ~ 63)
* psvlan_cfg - SVLAN member configuration
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameter.
* RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
* RT_ERR_PORT_MASK - Invalid portmask.
* RT_ERR_SVLAN_TABLE_FULL - SVLAN configuration is full.
* Note:
* The API can set system 64 accepted s-tag frame format by index.
* - rtk_svlan_memberCfg_t->svid is SVID of SVLAN member configuration.
* - rtk_svlan_memberCfg_t->memberport is member port mask of SVLAN member configuration.
* - rtk_svlan_memberCfg_t->fid is filtering database of SVLAN member configuration.
* - rtk_svlan_memberCfg_t->priority is priority of SVLAN member configuration.
*/
extern rtk_api_ret_t rtk_svlan_memberPortEntry_adv_set(rtk_uint32 idx, rtk_svlan_memberCfg_t *pSvlan_cfg);
/* Function Name:
* rtk_svlan_memberPortEntry_adv_get
* Description:
* Get SVLAN member Configure by index.
* Input:
* idx - Index (0 ~ 63)
* Output:
* pSvlan_cfg - SVLAN member configuration
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_SVLAN_ENTRY_NOT_FOUND - specified svlan entry not found.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can get system 64 accepted s-tag frame format. Only 64 SVID S-tag frame will be accpeted
* to receiving from uplink ports. Other SVID S-tag frame or S-untagged frame will be droped.
*/
extern rtk_api_ret_t rtk_svlan_memberPortEntry_adv_get(rtk_uint32 idx, rtk_svlan_memberCfg_t *pSvlan_cfg);
/* Function Name:
* rtk_svlan_defaultSvlan_set
* Description:
* Configure default egress SVLAN.
* Input:
* port - Source port
* svid - SVLAN id
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameter.
* RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
* RT_ERR_SVLAN_ENTRY_NOT_FOUND - specified svlan entry not found.
* Note:
* The API can set port n S-tag format index while receiving frame from port n
* is transmit through uplink port with s-tag field
*/
extern rtk_api_ret_t rtk_svlan_defaultSvlan_set(rtk_port_t port, rtk_vlan_t svid);
/* Function Name:
* rtk_svlan_defaultSvlan_get
* Description:
* Get the configure default egress SVLAN.
* Input:
* port - Source port
* Output:
* pSvid - SVLAN VID
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can get port n S-tag format index while receiving frame from port n
* is transmit through uplink port with s-tag field
*/
extern rtk_api_ret_t rtk_svlan_defaultSvlan_get(rtk_port_t port, rtk_vlan_t *pSvid);
/* Function Name:
* rtk_svlan_c2s_add
* Description:
* Configure SVLAN C2S table
* Input:
* vid - VLAN ID
* src_port - Ingress Port
* svid - SVLAN VID
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port ID.
* RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
* RT_ERR_VLAN_VID - Invalid VID parameter.
* RT_ERR_OUT_OF_RANGE - input out of range.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can set system C2S configuration. ASIC will check upstream's VID and assign related
* SVID to mathed packet. There are 128 SVLAN C2S configurations.
*/
extern rtk_api_ret_t rtk_svlan_c2s_add(rtk_vlan_t vid, rtk_port_t src_port, rtk_vlan_t svid);
/* Function Name:
* rtk_svlan_c2s_del
* Description:
* Delete one C2S entry
* Input:
* vid - VLAN ID
* src_port - Ingress Port
* svid - SVLAN VID
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_VLAN_VID - Invalid VID parameter.
* RT_ERR_PORT_ID - Invalid port ID.
* RT_ERR_OUT_OF_RANGE - input out of range.
* Note:
* The API can delete system C2S configuration. There are 128 SVLAN C2S configurations.
*/
extern rtk_api_ret_t rtk_svlan_c2s_del(rtk_vlan_t vid, rtk_port_t src_port);
/* Function Name:
* rtk_svlan_c2s_get
* Description:
* Get configure SVLAN C2S table
* Input:
* vid - VLAN ID
* src_port - Ingress Port
* Output:
* pSvid - SVLAN ID
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Invalid port ID.
* RT_ERR_OUT_OF_RANGE - input out of range.
* Note:
* The API can get system C2S configuration. There are 128 SVLAN C2S configurations.
*/
extern rtk_api_ret_t rtk_svlan_c2s_get(rtk_vlan_t vid, rtk_port_t src_port, rtk_vlan_t *pSvid);
/* Function Name:
* rtk_svlan_untag_action_set
* Description:
* Configure Action of downstream Un-Stag packet
* Input:
* action - Action for UnStag
* svid - The SVID assigned to UnStag packet
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
* RT_ERR_SVLAN_ENTRY_NOT_FOUND - specified svlan entry not found.
* RT_ERR_OUT_OF_RANGE - input out of range.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can configure action of downstream Un-Stag packet. A SVID assigned
* to the un-stag is also supported by this API. The parameter of svid is
* only referenced when the action is set to UNTAG_ASSIGN
*/
extern rtk_api_ret_t rtk_svlan_untag_action_set(rtk_svlan_untag_action_t action, rtk_vlan_t svid);
/* Function Name:
* rtk_svlan_untag_action_get
* Description:
* Get Action of downstream Un-Stag packet
* Input:
* None
* Output:
* pAction - Action for UnStag
* pSvid - The SVID assigned to UnStag packet
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
* RT_ERR_SVLAN_ENTRY_NOT_FOUND - specified svlan entry not found.
* RT_ERR_OUT_OF_RANGE - input out of range.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can Get action of downstream Un-Stag packet. A SVID assigned
* to the un-stag is also retrieved by this API. The parameter pSvid is
* only refernced when the action is UNTAG_ASSIGN
*/
extern rtk_api_ret_t rtk_svlan_untag_action_get(rtk_svlan_untag_action_t *pAction, rtk_vlan_t *pSvid);
/* Function Name:
* rtk_svlan_unmatch_action_set
* Description:
* Configure Action of downstream Unmatch packet
* Input:
* action - Action for Unmatch
* svid - The SVID assigned to Unmatch packet
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
* RT_ERR_SVLAN_ENTRY_NOT_FOUND - specified svlan entry not found.
* RT_ERR_OUT_OF_RANGE - input out of range.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can configure action of downstream Un-match packet. A SVID assigned
* to the un-match is also supported by this API. The parameter od svid is
* only refernced when the action is set to UNMATCH_ASSIGN
*/
extern rtk_api_ret_t rtk_svlan_unmatch_action_set(rtk_svlan_unmatch_action_t action, rtk_vlan_t svid);
/* Function Name:
* rtk_svlan_unmatch_action_get
* Description:
* Get Action of downstream Unmatch packet
* Input:
* None
* Output:
* pAction - Action for Unmatch
* pSvid - The SVID assigned to Unmatch packet
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
* RT_ERR_SVLAN_ENTRY_NOT_FOUND - specified svlan entry not found.
* RT_ERR_OUT_OF_RANGE - input out of range.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can Get action of downstream Un-match packet. A SVID assigned
* to the un-match is also retrieved by this API. The parameter pSvid is
* only refernced when the action is UNMATCH_ASSIGN
*/
extern rtk_api_ret_t rtk_svlan_unmatch_action_get(rtk_svlan_unmatch_action_t *pAction, rtk_vlan_t *pSvid);
/* Function Name:
* rtk_svlan_dmac_vidsel_set
* Description:
* Set DMAC CVID selection
* Input:
* port - Port
* enable - state of DMAC CVID Selection
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
* RT_ERR_SVLAN_ENTRY_NOT_FOUND - specified svlan entry not found.
* RT_ERR_OUT_OF_RANGE - input out of range.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* This API can set DMAC CVID Selection state
*/
extern rtk_api_ret_t rtk_svlan_dmac_vidsel_set(rtk_port_t port, rtk_enable_t enable);
/* Function Name:
* rtk_svlan_dmac_vidsel_get
* Description:
* Get DMAC CVID selection
* Input:
* port - Port
* Output:
* pEnable - state of DMAC CVID Selection
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
* RT_ERR_SVLAN_ENTRY_NOT_FOUND - specified svlan entry not found.
* RT_ERR_OUT_OF_RANGE - input out of range.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* This API can get DMAC CVID Selection state
*/
extern rtk_api_ret_t rtk_svlan_dmac_vidsel_get(rtk_port_t port, rtk_enable_t *pEnable);
/* Function Name:
* rtk_svlan_ipmc2s_add
* Description:
* add ip multicast address to SVLAN
* Input:
* svid - SVLAN VID
* ipmc - ip multicast address
* ipmcMsk - ip multicast mask
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
* RT_ERR_SVLAN_ENTRY_NOT_FOUND - specified svlan entry not found.
* RT_ERR_OUT_OF_RANGE - input out of range.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can set IP mutlicast to SVID configuration. If upstream packet is IPv4 multicast
* packet and DIP is matched MC2S configuration, ASIC will assign egress SVID to the packet.
* There are 32 SVLAN multicast configurations for IP and L2 multicast.
*/
extern rtk_api_ret_t rtk_svlan_ipmc2s_add(ipaddr_t ipmc, ipaddr_t ipmcMsk, rtk_vlan_t svid);
/* Function Name:
* rtk_svlan_ipmc2s_del
* Description:
* delete ip multicast address to SVLAN
* Input:
* ipmc - ip multicast address
* ipmcMsk - ip multicast mask
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
* RT_ERR_OUT_OF_RANGE - input out of range.
* Note:
* The API can delete IP mutlicast to SVID configuration. There are 32 SVLAN multicast configurations for IP and L2 multicast.
*/
extern rtk_api_ret_t rtk_svlan_ipmc2s_del(ipaddr_t ipmc, ipaddr_t ipmcMsk);
/* Function Name:
* rtk_svlan_ipmc2s_get
* Description:
* Get ip multicast address to SVLAN
* Input:
* ipmc - ip multicast address
* ipmcMsk - ip multicast mask
* Output:
* pSvid - SVLAN VID
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_OUT_OF_RANGE - input out of range.
* Note:
* The API can get IP mutlicast to SVID configuration. There are 32 SVLAN multicast configurations for IP and L2 multicast.
*/
extern rtk_api_ret_t rtk_svlan_ipmc2s_get(ipaddr_t ipmc, ipaddr_t ipmcMsk, rtk_vlan_t *pSvid);
/* Function Name:
* rtk_svlan_l2mc2s_add
* Description:
* Add L2 multicast address to SVLAN
* Input:
* mac - L2 multicast address
* macMsk - L2 multicast address mask
* svid - SVLAN VID
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
* RT_ERR_SVLAN_ENTRY_NOT_FOUND - specified svlan entry not found.
* RT_ERR_OUT_OF_RANGE - input out of range.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can set L2 Mutlicast to SVID configuration. If upstream packet is L2 multicast
* packet and DMAC is matched, ASIC will assign egress SVID to the packet. There are 32
* SVLAN multicast configurations for IP and L2 multicast.
*/
extern rtk_api_ret_t rtk_svlan_l2mc2s_add(rtk_mac_t mac, rtk_mac_t macMsk, rtk_vlan_t svid);
/* Function Name:
* rtk_svlan_l2mc2s_del
* Description:
* delete L2 multicast address to SVLAN
* Input:
* mac - L2 multicast address
* macMsk - L2 multicast address mask
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
* RT_ERR_OUT_OF_RANGE - input out of range.
* Note:
* The API can delete Mutlicast to SVID configuration. There are 32 SVLAN multicast configurations for IP and L2 multicast.
*/
extern rtk_api_ret_t rtk_svlan_l2mc2s_del(rtk_mac_t mac, rtk_mac_t macMsk);
/* Function Name:
* rtk_svlan_l2mc2s_get
* Description:
* Get L2 multicast address to SVLAN
* Input:
* mac - L2 multicast address
* macMsk - L2 multicast address mask
* Output:
* pSvid - SVLAN VID
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_OUT_OF_RANGE - input out of range.
* Note:
* The API can get L2 mutlicast to SVID configuration. There are 32 SVLAN multicast configurations for IP and L2 multicast.
*/
extern rtk_api_ret_t rtk_svlan_l2mc2s_get(rtk_mac_t mac, rtk_mac_t macMsk, rtk_vlan_t *pSvid);
/* Function Name:
* rtk_svlan_sp2c_add
* Description:
* Add system SP2C configuration
* Input:
* cvid - VLAN ID
* dst_port - Destination port of SVLAN to CVLAN configuration
* svid - SVLAN VID
*
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
* RT_ERR_VLAN_VID - Invalid VID parameter.
* RT_ERR_OUT_OF_RANGE - input out of range.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can add SVID & Destination Port to CVLAN configuration. The downstream frames with assigned
* SVID will be add C-tag with assigned CVID if the output port is the assigned destination port.
* There are 128 SP2C configurations.
*/
extern rtk_api_ret_t rtk_svlan_sp2c_add(rtk_vlan_t svid, rtk_port_t dst_port, rtk_vlan_t cvid);
/* Function Name:
* rtk_svlan_sp2c_get
* Description:
* Get configure system SP2C content
* Input:
* svid - SVLAN VID
* dst_port - Destination port of SVLAN to CVLAN configuration
* Output:
* pCvid - VLAN ID
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_OUT_OF_RANGE - input out of range.
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
* Note:
* The API can get SVID & Destination Port to CVLAN configuration. There are 128 SP2C configurations.
*/
extern rtk_api_ret_t rtk_svlan_sp2c_get(rtk_vlan_t svid, rtk_port_t dst_port, rtk_vlan_t *pCvid);
/* Function Name:
* rtk_svlan_sp2c_del
* Description:
* Delete system SP2C configuration
* Input:
* svid - SVLAN VID
* dst_port - Destination port of SVLAN to CVLAN configuration
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_SVLAN_VID - Invalid SVLAN VID parameter.
* RT_ERR_OUT_OF_RANGE - input out of range.
* Note:
* The API can delete SVID & Destination Port to CVLAN configuration. There are 128 SP2C configurations.
*/
extern rtk_api_ret_t rtk_svlan_sp2c_del(rtk_vlan_t svid, rtk_port_t dst_port);
/* Function Name:
* rtk_svlan_lookupType_set
* Description:
* Set lookup type of SVLAN
* Input:
* type - lookup type
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* Note:
* none
*/
extern rtk_api_ret_t rtk_svlan_lookupType_set(rtk_svlan_lookupType_t type);
/* Function Name:
* rtk_svlan_lookupType_get
* Description:
* Get lookup type of SVLAN
* Input:
* pType - lookup type
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* Note:
* none
*/
extern rtk_api_ret_t rtk_svlan_lookupType_get(rtk_svlan_lookupType_t *pType);
/* Function Name:
* rtk_svlan_trapPri_set
* Description:
* Set svlan trap priority
* Input:
* priority - priority for trap packets
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_QOS_INT_PRIORITY
* Note:
* None
*/
extern rtk_api_ret_t rtk_svlan_trapPri_set(rtk_pri_t priority);
/* Function Name:
* rtk_svlan_trapPri_get
* Description:
* Get svlan trap priority
* Input:
* None
* Output:
* pPriority - priority for trap packets
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_NULL_POINTER - input parameter may be null pointer
* Note:
* None
*/
extern rtk_api_ret_t rtk_svlan_trapPri_get(rtk_pri_t *pPriority);
/* Function Name:
* rtk_svlan_unassign_action_set
* Description:
* Configure Action of upstream without svid assign action
* Input:
* action - Action for Un-assign
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_OUT_OF_RANGE - input out of range.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can configure action of upstream Un-assign svid packet. If action is not
* trap to CPU, the port-based SVID sure be assign as system need
*/
extern rtk_api_ret_t rtk_svlan_unassign_action_set(rtk_svlan_unassign_action_t action);
/* Function Name:
* rtk_svlan_unassign_action_get
* Description:
* Get action of upstream without svid assignment
* Input:
* None
* Output:
* pAction - Action for Un-assign
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* Note:
* None
*/
extern rtk_api_ret_t rtk_svlan_unassign_action_get(rtk_svlan_unassign_action_t *pAction);
/* Function Name:
* rtk_svlan_checkAndCreateMbr
* Description:
* Check and create Member configuration and return index
* Input:
* vid - VLAN id.
* Output:
* pIndex - Member configuration index
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_VLAN_VID - Invalid VLAN ID.
* RT_ERR_TBL_FULL - Member Configuration table full
* Note:
*
*/
extern rtk_api_ret_t rtk_svlan_checkAndCreateMbr(rtk_vlan_t vid, rtk_uint32 *pIndex);
#endif /* __RTK_API_SVLAN_H__ */

View file

@ -0,0 +1,757 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* Purpose : RTL8367/RTL8367C switch high-level API
*
* Feature : The file includes Trap module high-layer API defination
*
*/
#ifndef __RTK_API_TRAP_H__
#define __RTK_API_TRAP_H__
typedef enum rtk_trap_type_e
{
TRAP_BRG_GROUP = 0,
TRAP_FD_PAUSE,
TRAP_SP_MCAST,
TRAP_1X_PAE,
TRAP_UNDEF_BRG_04,
TRAP_UNDEF_BRG_05,
TRAP_UNDEF_BRG_06,
TRAP_UNDEF_BRG_07,
TRAP_PROVIDER_BRIDGE_GROUP_ADDRESS,
TRAP_UNDEF_BRG_09,
TRAP_UNDEF_BRG_0A,
TRAP_UNDEF_BRG_0B,
TRAP_UNDEF_BRG_0C,
TRAP_PROVIDER_BRIDGE_GVRP_ADDRESS,
TRAP_8021AB,
TRAP_UNDEF_BRG_0F,
TRAP_BRG_MNGEMENT,
TRAP_UNDEFINED_11,
TRAP_UNDEFINED_12,
TRAP_UNDEFINED_13,
TRAP_UNDEFINED_14,
TRAP_UNDEFINED_15,
TRAP_UNDEFINED_16,
TRAP_UNDEFINED_17,
TRAP_UNDEFINED_18,
TRAP_UNDEFINED_19,
TRAP_UNDEFINED_1A,
TRAP_UNDEFINED_1B,
TRAP_UNDEFINED_1C,
TRAP_UNDEFINED_1D,
TRAP_UNDEFINED_1E,
TRAP_UNDEFINED_1F,
TRAP_GMRP,
TRAP_GVRP,
TRAP_UNDEF_GARP_22,
TRAP_UNDEF_GARP_23,
TRAP_UNDEF_GARP_24,
TRAP_UNDEF_GARP_25,
TRAP_UNDEF_GARP_26,
TRAP_UNDEF_GARP_27,
TRAP_UNDEF_GARP_28,
TRAP_UNDEF_GARP_29,
TRAP_UNDEF_GARP_2A,
TRAP_UNDEF_GARP_2B,
TRAP_UNDEF_GARP_2C,
TRAP_UNDEF_GARP_2D,
TRAP_UNDEF_GARP_2E,
TRAP_UNDEF_GARP_2F,
TRAP_CDP,
TRAP_CSSTP,
TRAP_LLDP,
TRAP_END,
}rtk_trap_type_t;
typedef enum rtk_mcast_type_e
{
MCAST_L2 = 0,
MCAST_IPV4,
MCAST_IPV6,
MCAST_END
} rtk_mcast_type_t;
typedef enum rtk_trap_mcast_action_e
{
MCAST_ACTION_FORWARD = 0,
MCAST_ACTION_DROP,
MCAST_ACTION_TRAP2CPU,
MCAST_ACTION_ROUTER_PORT,
MCAST_ACTION_DROP_EX_RMA,
MCAST_ACTION_END
} rtk_trap_mcast_action_t;
typedef enum rtk_trap_rma_action_e
{
RMA_ACTION_FORWARD = 0,
RMA_ACTION_TRAP2CPU,
RMA_ACTION_DROP,
RMA_ACTION_FORWARD_EXCLUDE_CPU,
RMA_ACTION_END
} rtk_trap_rma_action_t;
typedef enum rtk_trap_ucast_action_e
{
UCAST_ACTION_FORWARD_PMASK = 0,
UCAST_ACTION_DROP,
UCAST_ACTION_TRAP2CPU,
UCAST_ACTION_FLOODING,
UCAST_ACTION_END
} rtk_trap_ucast_action_t;
typedef enum rtk_trap_ucast_type_e
{
UCAST_UNKNOWNDA = 0,
UCAST_UNKNOWNSA,
UCAST_UNMATCHSA,
UCAST_END
} rtk_trap_ucast_type_t;
typedef enum rtk_trap_reason_type_e
{
TRAP_REASON_RMA = 0,
TRAP_REASON_OAM,
TRAP_REASON_1XUNAUTH,
TRAP_REASON_VLANSTACK,
TRAP_REASON_UNKNOWNMC,
TRAP_REASON_END,
} rtk_trap_reason_type_t;
/* Function Name:
* rtk_trap_unknownUnicastPktAction_set
* Description:
* Set unknown unicast packet action configuration.
* Input:
* port - ingress port ID for unknown unicast packet
* ucast_action - Unknown unicast action.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_NOT_ALLOWED - Invalid action.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* This API can set unknown unicast packet action configuration.
* The unknown unicast action is as following:
* - UCAST_ACTION_FORWARD_PMASK
* - UCAST_ACTION_DROP
* - UCAST_ACTION_TRAP2CPU
* - UCAST_ACTION_FLOODING
*/
rtk_api_ret_t rtk_trap_unknownUnicastPktAction_set(rtk_port_t port, rtk_trap_ucast_action_t ucast_action);
/* Function Name:
* rtk_trap_unknownUnicastPktAction_get
* Description:
* Get unknown unicast packet action configuration.
* Input:
* port - ingress port ID for unknown unicast packet
* Output:
* pUcast_action - Unknown unicast action.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_NOT_ALLOWED - Invalid action.
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_NULL_POINTER - Null pointer
* Note:
* This API can get unknown unicast packet action configuration.
* The unknown unicast action is as following:
* - UCAST_ACTION_FORWARD_PMASK
* - UCAST_ACTION_DROP
* - UCAST_ACTION_TRAP2CPU
* - UCAST_ACTION_FLOODING
*/
rtk_api_ret_t rtk_trap_unknownUnicastPktAction_get(rtk_port_t port, rtk_trap_ucast_action_t *pUcast_action);
/* Function Name:
* rtk_trap_unknownMacPktAction_set
* Description:
* Set unknown source MAC packet action configuration.
* Input:
* ucast_action - Unknown source MAC action.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_NOT_ALLOWED - Invalid action.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* This API can set unknown unicast packet action configuration.
* The unknown unicast action is as following:
* - UCAST_ACTION_FORWARD_PMASK
* - UCAST_ACTION_DROP
* - UCAST_ACTION_TRAP2CPU
*/
extern rtk_api_ret_t rtk_trap_unknownMacPktAction_set(rtk_trap_ucast_action_t ucast_action);
/* Function Name:
* rtk_trap_unknownMacPktAction_get
* Description:
* Get unknown source MAC packet action configuration.
* Input:
* None.
* Output:
* pUcast_action - Unknown source MAC action.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_NULL_POINTER - Null Pointer.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
*
*/
extern rtk_api_ret_t rtk_trap_unknownMacPktAction_get(rtk_trap_ucast_action_t *pUcast_action);
/* Function Name:
* rtk_trap_unmatchMacPktAction_set
* Description:
* Set unmatch source MAC packet action configuration.
* Input:
* ucast_action - Unknown source MAC action.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_NOT_ALLOWED - Invalid action.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* This API can set unknown unicast packet action configuration.
* The unknown unicast action is as following:
* - UCAST_ACTION_FORWARD_PMASK
* - UCAST_ACTION_DROP
* - UCAST_ACTION_TRAP2CPU
*/
extern rtk_api_ret_t rtk_trap_unmatchMacPktAction_set(rtk_trap_ucast_action_t ucast_action);
/* Function Name:
* rtk_trap_unmatchMacPktAction_get
* Description:
* Get unmatch source MAC packet action configuration.
* Input:
* None.
* Output:
* pUcast_action - Unknown source MAC action.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_NOT_ALLOWED - Invalid action.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* This API can set unknown unicast packet action configuration.
* The unknown unicast action is as following:
* - UCAST_ACTION_FORWARD_PMASK
* - UCAST_ACTION_DROP
* - UCAST_ACTION_TRAP2CPU
*/
extern rtk_api_ret_t rtk_trap_unmatchMacPktAction_get(rtk_trap_ucast_action_t *pUcast_action);
/* Function Name:
* rtk_trap_unmatchMacMoving_set
* Description:
* Set unmatch source MAC packet moving state.
* Input:
* port - Port ID.
* enable - ENABLED: allow SA moving, DISABLE: don't allow SA moving.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_NOT_ALLOWED - Invalid action.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
*/
extern rtk_api_ret_t rtk_trap_unmatchMacMoving_set(rtk_port_t port, rtk_enable_t enable);
/* Function Name:
* rtk_trap_unmatchMacMoving_get
* Description:
* Set unmatch source MAC packet moving state.
* Input:
* port - Port ID.
* Output:
* pEnable - ENABLED: allow SA moving, DISABLE: don't allow SA moving.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_NOT_ALLOWED - Invalid action.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
*/
extern rtk_api_ret_t rtk_trap_unmatchMacMoving_get(rtk_port_t port, rtk_enable_t *pEnable);
/* Function Name:
* rtk_trap_unknownMcastPktAction_set
* Description:
* Set behavior of unknown multicast
* Input:
* port - Port id.
* type - unknown multicast packet type.
* mcast_action - unknown multicast action.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_NOT_ALLOWED - Invalid action.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* When receives an unknown multicast packet, switch may trap, drop or flood this packet
* (1) The unknown multicast packet type is as following:
* - MCAST_L2
* - MCAST_IPV4
* - MCAST_IPV6
* (2) The unknown multicast action is as following:
* - MCAST_ACTION_FORWARD
* - MCAST_ACTION_DROP
* - MCAST_ACTION_TRAP2CPU
*/
extern rtk_api_ret_t rtk_trap_unknownMcastPktAction_set(rtk_port_t port, rtk_mcast_type_t type, rtk_trap_mcast_action_t mcast_action);
/* Function Name:
* rtk_trap_unknownMcastPktAction_get
* Description:
* Get behavior of unknown multicast
* Input:
* type - unknown multicast packet type.
* Output:
* pMcast_action - unknown multicast action.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_NOT_ALLOWED - Invalid operation.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* When receives an unknown multicast packet, switch may trap, drop or flood this packet
* (1) The unknown multicast packet type is as following:
* - MCAST_L2
* - MCAST_IPV4
* - MCAST_IPV6
* (2) The unknown multicast action is as following:
* - MCAST_ACTION_FORWARD
* - MCAST_ACTION_DROP
* - MCAST_ACTION_TRAP2CPU
*/
extern rtk_api_ret_t rtk_trap_unknownMcastPktAction_get(rtk_port_t port, rtk_mcast_type_t type, rtk_trap_mcast_action_t *pMcast_action);
/* Function Name:
* rtk_trap_lldpEnable_set
* Description:
* Set LLDP enable.
* Input:
* enabled - LLDP enable, 0: follow RMA, 1: use LLDP action.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_NOT_ALLOWED - Invalid action.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* - DMAC Assignment
* - 01:80:c2:00:00:0e ethertype = 0x88CC LLDP
* - 01:80:c2:00:00:03 ethertype = 0x88CC
* - 01:80:c2:00:00:00 ethertype = 0x88CC
*/
extern rtk_api_ret_t rtk_trap_lldpEnable_set(rtk_enable_t enabled);
/* Function Name:
* rtk_trap_lldpEnable_get
* Description:
* Get LLDP status.
* Input:
* None
* Output:
* pEnabled - LLDP enable, 0: follow RMA, 1: use LLDP action.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* LLDP is as following definition.
* - DMAC Assignment
* - 01:80:c2:00:00:0e ethertype = 0x88CC LLDP
* - 01:80:c2:00:00:03 ethertype = 0x88CC
* - 01:80:c2:00:00:00 ethertype = 0x88CC
*/
extern rtk_api_ret_t rtk_trap_lldpEnable_get(rtk_enable_t *pEnabled);
/* Function Name:
* rtk_trap_reasonTrapToCpuPriority_set
* Description:
* Set priority value of a packet that trapped to CPU port according to specific reason.
* Input:
* type - reason that trap to CPU port.
* priority - internal priority that is going to be set for specific trap reason.
* Output:
* None.
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_NOT_INIT - The module is not initial
* RT_ERR_INPUT - Invalid input parameter
* Note:
* Currently the trap reason that supported are listed as follows:
* - TRAP_REASON_RMA
* - TRAP_REASON_OAM
* - TRAP_REASON_1XUNAUTH
* - TRAP_REASON_VLANSTACK
* - TRAP_REASON_UNKNOWNMC
*/
extern rtk_api_ret_t rtk_trap_reasonTrapToCpuPriority_set(rtk_trap_reason_type_t type, rtk_pri_t priority);
/* Function Name:
* rtk_trap_reasonTrapToCpuPriority_get
* Description:
* Get priority value of a packet that trapped to CPU port according to specific reason.
* Input:
* type - reason that trap to CPU port.
* Output:
* pPriority - configured internal priority for such reason.
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_NOT_INIT - The module is not initial
* RT_ERR_INPUT - Invalid input parameter
* RT_ERR_NULL_POINTER - NULL pointer
* Note:
* Currently the trap reason that supported are listed as follows:
* - TRAP_REASON_RMA
* - TRAP_REASON_OAM
* - TRAP_REASON_1XUNAUTH
* - TRAP_REASON_VLANSTACK
* - TRAP_REASON_UNKNOWNMC
*/
extern rtk_api_ret_t rtk_trap_reasonTrapToCpuPriority_get(rtk_trap_reason_type_t type, rtk_pri_t *pPriority);
/* Function Name:
* rtk_trap_rmaAction_set
* Description:
* Set Reserved multicast address action configuration.
* Input:
* type - rma type.
* rma_action - RMA action.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_ENABLE - Invalid IFG parameter
* Note:
*
* There are 48 types of Reserved Multicast Address frame for application usage.
* (1)They are as following definition.
* - TRAP_BRG_GROUP,
* - TRAP_FD_PAUSE,
* - TRAP_SP_MCAST,
* - TRAP_1X_PAE,
* - TRAP_UNDEF_BRG_04,
* - TRAP_UNDEF_BRG_05,
* - TRAP_UNDEF_BRG_06,
* - TRAP_UNDEF_BRG_07,
* - TRAP_PROVIDER_BRIDGE_GROUP_ADDRESS,
* - TRAP_UNDEF_BRG_09,
* - TRAP_UNDEF_BRG_0A,
* - TRAP_UNDEF_BRG_0B,
* - TRAP_UNDEF_BRG_0C,
* - TRAP_PROVIDER_BRIDGE_GVRP_ADDRESS,
* - TRAP_8021AB,
* - TRAP_UNDEF_BRG_0F,
* - TRAP_BRG_MNGEMENT,
* - TRAP_UNDEFINED_11,
* - TRAP_UNDEFINED_12,
* - TRAP_UNDEFINED_13,
* - TRAP_UNDEFINED_14,
* - TRAP_UNDEFINED_15,
* - TRAP_UNDEFINED_16,
* - TRAP_UNDEFINED_17,
* - TRAP_UNDEFINED_18,
* - TRAP_UNDEFINED_19,
* - TRAP_UNDEFINED_1A,
* - TRAP_UNDEFINED_1B,
* - TRAP_UNDEFINED_1C,
* - TRAP_UNDEFINED_1D,
* - TRAP_UNDEFINED_1E,
* - TRAP_UNDEFINED_1F,
* - TRAP_GMRP,
* - TRAP_GVRP,
* - TRAP_UNDEF_GARP_22,
* - TRAP_UNDEF_GARP_23,
* - TRAP_UNDEF_GARP_24,
* - TRAP_UNDEF_GARP_25,
* - TRAP_UNDEF_GARP_26,
* - TRAP_UNDEF_GARP_27,
* - TRAP_UNDEF_GARP_28,
* - TRAP_UNDEF_GARP_29,
* - TRAP_UNDEF_GARP_2A,
* - TRAP_UNDEF_GARP_2B,
* - TRAP_UNDEF_GARP_2C,
* - TRAP_UNDEF_GARP_2D,
* - TRAP_UNDEF_GARP_2E,
* - TRAP_UNDEF_GARP_2F,
* - TRAP_CDP.
* - TRAP_CSSTP.
* - TRAP_LLDP.
* (2) The RMA action is as following:
* - RMA_ACTION_FORWARD
* - RMA_ACTION_TRAP2CPU
* - RMA_ACTION_DROP
* - RMA_ACTION_FORWARD_EXCLUDE_CPU
*/
extern rtk_api_ret_t rtk_trap_rmaAction_set(rtk_trap_type_t type, rtk_trap_rma_action_t rma_action);
/* Function Name:
* rtk_trap_rmaAction_get
* Description:
* Get Reserved multicast address action configuration.
* Input:
* type - rma type.
* Output:
* pRma_action - RMA action.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* There are 48 types of Reserved Multicast Address frame for application usage.
* (1)They are as following definition.
* - TRAP_BRG_GROUP,
* - TRAP_FD_PAUSE,
* - TRAP_SP_MCAST,
* - TRAP_1X_PAE,
* - TRAP_UNDEF_BRG_04,
* - TRAP_UNDEF_BRG_05,
* - TRAP_UNDEF_BRG_06,
* - TRAP_UNDEF_BRG_07,
* - TRAP_PROVIDER_BRIDGE_GROUP_ADDRESS,
* - TRAP_UNDEF_BRG_09,
* - TRAP_UNDEF_BRG_0A,
* - TRAP_UNDEF_BRG_0B,
* - TRAP_UNDEF_BRG_0C,
* - TRAP_PROVIDER_BRIDGE_GVRP_ADDRESS,
* - TRAP_8021AB,
* - TRAP_UNDEF_BRG_0F,
* - TRAP_BRG_MNGEMENT,
* - TRAP_UNDEFINED_11,
* - TRAP_UNDEFINED_12,
* - TRAP_UNDEFINED_13,
* - TRAP_UNDEFINED_14,
* - TRAP_UNDEFINED_15,
* - TRAP_UNDEFINED_16,
* - TRAP_UNDEFINED_17,
* - TRAP_UNDEFINED_18,
* - TRAP_UNDEFINED_19,
* - TRAP_UNDEFINED_1A,
* - TRAP_UNDEFINED_1B,
* - TRAP_UNDEFINED_1C,
* - TRAP_UNDEFINED_1D,
* - TRAP_UNDEFINED_1E,
* - TRAP_UNDEFINED_1F,
* - TRAP_GMRP,
* - TRAP_GVRP,
* - TRAP_UNDEF_GARP_22,
* - TRAP_UNDEF_GARP_23,
* - TRAP_UNDEF_GARP_24,
* - TRAP_UNDEF_GARP_25,
* - TRAP_UNDEF_GARP_26,
* - TRAP_UNDEF_GARP_27,
* - TRAP_UNDEF_GARP_28,
* - TRAP_UNDEF_GARP_29,
* - TRAP_UNDEF_GARP_2A,
* - TRAP_UNDEF_GARP_2B,
* - TRAP_UNDEF_GARP_2C,
* - TRAP_UNDEF_GARP_2D,
* - TRAP_UNDEF_GARP_2E,
* - TRAP_UNDEF_GARP_2F,
* - TRAP_CDP.
* - TRAP_CSSTP.
* - TRAP_LLDP.
* (2) The RMA action is as following:
* - RMA_ACTION_FORWARD
* - RMA_ACTION_TRAP2CPU
* - RMA_ACTION_DROP
* - RMA_ACTION_FORWARD_EXCLUDE_CPU
*/
extern rtk_api_ret_t rtk_trap_rmaAction_get(rtk_trap_type_t type, rtk_trap_rma_action_t *pRma_action);
/* Function Name:
* rtk_trap_rmaKeepFormat_set
* Description:
* Set Reserved multicast address keep format configuration.
* Input:
* type - rma type.
* enable - enable keep format.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_ENABLE - Invalid IFG parameter
* Note:
*
* There are 48 types of Reserved Multicast Address frame for application usage.
* They are as following definition.
* - TRAP_BRG_GROUP,
* - TRAP_FD_PAUSE,
* - TRAP_SP_MCAST,
* - TRAP_1X_PAE,
* - TRAP_UNDEF_BRG_04,
* - TRAP_UNDEF_BRG_05,
* - TRAP_UNDEF_BRG_06,
* - TRAP_UNDEF_BRG_07,
* - TRAP_PROVIDER_BRIDGE_GROUP_ADDRESS,
* - TRAP_UNDEF_BRG_09,
* - TRAP_UNDEF_BRG_0A,
* - TRAP_UNDEF_BRG_0B,
* - TRAP_UNDEF_BRG_0C,
* - TRAP_PROVIDER_BRIDGE_GVRP_ADDRESS,
* - TRAP_8021AB,
* - TRAP_UNDEF_BRG_0F,
* - TRAP_BRG_MNGEMENT,
* - TRAP_UNDEFINED_11,
* - TRAP_UNDEFINED_12,
* - TRAP_UNDEFINED_13,
* - TRAP_UNDEFINED_14,
* - TRAP_UNDEFINED_15,
* - TRAP_UNDEFINED_16,
* - TRAP_UNDEFINED_17,
* - TRAP_UNDEFINED_18,
* - TRAP_UNDEFINED_19,
* - TRAP_UNDEFINED_1A,
* - TRAP_UNDEFINED_1B,
* - TRAP_UNDEFINED_1C,
* - TRAP_UNDEFINED_1D,
* - TRAP_UNDEFINED_1E,
* - TRAP_UNDEFINED_1F,
* - TRAP_GMRP,
* - TRAP_GVRP,
* - TRAP_UNDEF_GARP_22,
* - TRAP_UNDEF_GARP_23,
* - TRAP_UNDEF_GARP_24,
* - TRAP_UNDEF_GARP_25,
* - TRAP_UNDEF_GARP_26,
* - TRAP_UNDEF_GARP_27,
* - TRAP_UNDEF_GARP_28,
* - TRAP_UNDEF_GARP_29,
* - TRAP_UNDEF_GARP_2A,
* - TRAP_UNDEF_GARP_2B,
* - TRAP_UNDEF_GARP_2C,
* - TRAP_UNDEF_GARP_2D,
* - TRAP_UNDEF_GARP_2E,
* - TRAP_UNDEF_GARP_2F,
* - TRAP_CDP.
* - TRAP_CSSTP.
* - TRAP_LLDP.
*/
extern rtk_api_ret_t rtk_trap_rmaKeepFormat_set(rtk_trap_type_t type, rtk_enable_t enable);
/* Function Name:
* rtk_trap_rmaKeepFormat_get
* Description:
* Get Reserved multicast address action configuration.
* Input:
* type - rma type.
* Output:
* pEnable - keep format status.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* There are 48 types of Reserved Multicast Address frame for application usage.
* They are as following definition.
* - TRAP_BRG_GROUP,
* - TRAP_FD_PAUSE,
* - TRAP_SP_MCAST,
* - TRAP_1X_PAE,
* - TRAP_UNDEF_BRG_04,
* - TRAP_UNDEF_BRG_05,
* - TRAP_UNDEF_BRG_06,
* - TRAP_UNDEF_BRG_07,
* - TRAP_PROVIDER_BRIDGE_GROUP_ADDRESS,
* - TRAP_UNDEF_BRG_09,
* - TRAP_UNDEF_BRG_0A,
* - TRAP_UNDEF_BRG_0B,
* - TRAP_UNDEF_BRG_0C,
* - TRAP_PROVIDER_BRIDGE_GVRP_ADDRESS,
* - TRAP_8021AB,
* - TRAP_UNDEF_BRG_0F,
* - TRAP_BRG_MNGEMENT,
* - TRAP_UNDEFINED_11,
* - TRAP_UNDEFINED_12,
* - TRAP_UNDEFINED_13,
* - TRAP_UNDEFINED_14,
* - TRAP_UNDEFINED_15,
* - TRAP_UNDEFINED_16,
* - TRAP_UNDEFINED_17,
* - TRAP_UNDEFINED_18,
* - TRAP_UNDEFINED_19,
* - TRAP_UNDEFINED_1A,
* - TRAP_UNDEFINED_1B,
* - TRAP_UNDEFINED_1C,
* - TRAP_UNDEFINED_1D,
* - TRAP_UNDEFINED_1E,
* - TRAP_UNDEFINED_1F,
* - TRAP_GMRP,
* - TRAP_GVRP,
* - TRAP_UNDEF_GARP_22,
* - TRAP_UNDEF_GARP_23,
* - TRAP_UNDEF_GARP_24,
* - TRAP_UNDEF_GARP_25,
* - TRAP_UNDEF_GARP_26,
* - TRAP_UNDEF_GARP_27,
* - TRAP_UNDEF_GARP_28,
* - TRAP_UNDEF_GARP_29,
* - TRAP_UNDEF_GARP_2A,
* - TRAP_UNDEF_GARP_2B,
* - TRAP_UNDEF_GARP_2C,
* - TRAP_UNDEF_GARP_2D,
* - TRAP_UNDEF_GARP_2E,
* - TRAP_UNDEF_GARP_2F,
* - TRAP_CDP.
* - TRAP_CSSTP.
* - TRAP_LLDP.
*/
extern rtk_api_ret_t rtk_trap_rmaKeepFormat_get(rtk_trap_type_t type, rtk_enable_t *pEnable);
#endif /* __RTK_API_TRAP_H__ */

View file

@ -0,0 +1,328 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* Purpose : RTL8367/RTL8367C switch high-level API
*
* Feature : The file includes Trunk module high-layer TRUNK defination
*
*/
#ifndef __RTK_API_TRUNK_H__
#define __RTK_API_TRUNK_H__
/*
* Data Type Declaration
*/
#define RTK_TRUNK_DPORT_HASH_MASK 0x40
#define RTK_TRUNK_SPORT_HASH_MASK 0x20
#define RTK_TRUNK_DIP_HASH_MASK 0x10
#define RTK_TRUNK_SIP_HASH_MASK 0x8
#define RTK_TRUNK_DMAC_HASH_MASK 0x4
#define RTK_TRUNK_SMAC_HASH_MASK 0x2
#define RTK_TRUNK_SPA_HASH_MASK 0x1
#define RTK_MAX_NUM_OF_TRUNK_HASH_VAL 16
typedef struct rtk_trunk_hashVal2Port_s
{
rtk_uint8 value[RTK_MAX_NUM_OF_TRUNK_HASH_VAL];
} rtk_trunk_hashVal2Port_t;
typedef enum rtk_trunk_group_e
{
TRUNK_GROUP0 = 0,
TRUNK_GROUP1,
TRUNK_GROUP2,
TRUNK_GROUP3,
TRUNK_GROUP_END
} rtk_trunk_group_t;
typedef enum rtk_trunk_separateType_e
{
SEPARATE_NONE = 0,
SEPARATE_FLOOD,
SEPARATE_END
} rtk_trunk_separateType_t;
typedef enum rtk_trunk_mode_e
{
TRUNK_MODE_NORMAL = 0,
TRUNK_MODE_DUMB,
TRUNK_MODE_END
} rtk_trunk_mode_t;
/* Function Name:
* rtk_trunk_port_set
* Description:
* Set trunking group available port mask
* Input:
* trk_gid - trunk group id
* pTrunk_member_portmask - Logic trunking member port mask
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_LA_TRUNK_ID - Invalid trunking group
* RT_ERR_PORT_MASK - Invalid portmask.
* Note:
* The API can set port trunking group port mask. Each port trunking group has max 4 ports.
* If enabled port mask has less than 2 ports available setting, then this trunking group function is disabled.
*/
extern rtk_api_ret_t rtk_trunk_port_set(rtk_trunk_group_t trk_gid, rtk_portmask_t *pTrunk_member_portmask);
/* Function Name:
* rtk_trunk_port_get
* Description:
* Get trunking group available port mask
* Input:
* trk_gid - trunk group id
* Output:
* pTrunk_member_portmask - Logic trunking member port mask
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_LA_TRUNK_ID - Invalid trunking group
* Note:
* The API can get 2 port trunking group.
*/
extern rtk_api_ret_t rtk_trunk_port_get(rtk_trunk_group_t trk_gid, rtk_portmask_t *pTrunk_member_portmask);
/* Function Name:
* rtk_trunk_distributionAlgorithm_set
* Description:
* Set port trunking hash select sources
* Input:
* trk_gid - trunk group id
* algo_bitmask - Bitmask of the distribution algorithm
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_LA_TRUNK_ID - Invalid trunking group
* RT_ERR_LA_HASHMASK - Hash algorithm selection error.
* RT_ERR_PORT_MASK - Invalid portmask.
* Note:
* The API can set port trunking hash algorithm sources.
* 7 bits mask for link aggregation group0 hash parameter selection {DIP, SIP, DMAC, SMAC, SPA}
* - 0b0000001: SPA
* - 0b0000010: SMAC
* - 0b0000100: DMAC
* - 0b0001000: SIP
* - 0b0010000: DIP
* - 0b0100000: TCP/UDP Source Port
* - 0b1000000: TCP/UDP Destination Port
* Example:
* - 0b0000011: SMAC & SPA
* - Note that it could be an arbitrary combination or independent set
*/
extern rtk_api_ret_t rtk_trunk_distributionAlgorithm_set(rtk_trunk_group_t trk_gid, rtk_uint32 algo_bitmask);
/* Function Name:
* rtk_trunk_distributionAlgorithm_get
* Description:
* Get port trunking hash select sources
* Input:
* trk_gid - trunk group id
* Output:
* pAlgo_bitmask - Bitmask of the distribution algorithm
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_LA_TRUNK_ID - Invalid trunking group
* Note:
* The API can get port trunking hash algorithm sources.
*/
extern rtk_api_ret_t rtk_trunk_distributionAlgorithm_get(rtk_trunk_group_t trk_gid, rtk_uint32 *pAlgo_bitmask);
/* Function Name:
* rtk_trunk_trafficSeparate_set
* Description:
* Set the traffic separation setting of a trunk group from the specified device.
* Input:
* trk_gid - trunk group id
* separateType - traffic separation setting
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_UNIT_ID - invalid unit id
* RT_ERR_LA_TRUNK_ID - invalid trunk ID
* RT_ERR_LA_HASHMASK - invalid hash mask
* Note:
* SEPARATE_NONE: disable traffic separation
* SEPARATE_FLOOD: trunk MSB link up port is dedicated to TX flooding (L2 lookup miss) traffic
*/
extern rtk_api_ret_t rtk_trunk_trafficSeparate_set(rtk_trunk_group_t trk_gid, rtk_trunk_separateType_t separateType);
/* Function Name:
* rtk_trunk_trafficSeparate_get
* Description:
* Get the traffic separation setting of a trunk group from the specified device.
* Input:
* trk_gid - trunk group id
* Output:
* pSeparateType - pointer separated traffic type
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_UNIT_ID - invalid unit id
* RT_ERR_LA_TRUNK_ID - invalid trunk ID
* RT_ERR_NULL_POINTER - input parameter may be null pointer
* Note:
* SEPARATE_NONE: disable traffic separation
* SEPARATE_FLOOD: trunk MSB link up port is dedicated to TX flooding (L2 lookup miss) traffic
*/
extern rtk_api_ret_t rtk_trunk_trafficSeparate_get(rtk_trunk_group_t trk_gid, rtk_trunk_separateType_t *pSeparateType);
/* Function Name:
* rtk_trunk_mode_set
* Description:
* Set the trunk mode to the specified device.
* Input:
* mode - trunk mode
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_INPUT - invalid input parameter
* Note:
* The enum of the trunk mode as following
* - TRUNK_MODE_NORMAL
* - TRUNK_MODE_DUMB
*/
extern rtk_api_ret_t rtk_trunk_mode_set(rtk_trunk_mode_t mode);
/* Function Name:
* rtk_trunk_mode_get
* Description:
* Get the trunk mode from the specified device.
* Input:
* None
* Output:
* pMode - pointer buffer of trunk mode
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_NULL_POINTER - input parameter may be null pointer
* Note:
* The enum of the trunk mode as following
* - TRUNK_MODE_NORMAL
* - TRUNK_MODE_DUMB
*/
extern rtk_api_ret_t rtk_trunk_mode_get(rtk_trunk_mode_t *pMode);
/* Function Name:
* rtk_trunk_trafficPause_set
* Description:
* Set the traffic pause setting of a trunk group.
* Input:
* trk_gid - trunk group id
* enable - traffic pause state
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_LA_TRUNK_ID - invalid trunk ID
* Note:
* None.
*/
extern rtk_api_ret_t rtk_trunk_trafficPause_set(rtk_trunk_group_t trk_gid, rtk_enable_t enable);
/* Function Name:
* rtk_trunk_trafficPause_get
* Description:
* Get the traffic pause setting of a trunk group.
* Input:
* trk_gid - trunk group id
* Output:
* pEnable - pointer of traffic pause state.
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_LA_TRUNK_ID - invalid trunk ID
* RT_ERR_NULL_POINTER - input parameter may be null pointer
* Note:
* None.
*/
extern rtk_api_ret_t rtk_trunk_trafficPause_get(rtk_trunk_group_t trk_gid, rtk_enable_t *pEnable);
/* Function Name:
* rtk_trunk_hashMappingTable_set
* Description:
* Set hash value to port array in the trunk group id from the specified device.
* Input:
* trk_gid - trunk group id
* pHash2Port_array - ports associate with the hash value
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_UNIT_ID - invalid unit id
* RT_ERR_LA_TRUNK_ID - invalid trunk ID
* RT_ERR_NULL_POINTER - input parameter may be null pointer
* RT_ERR_LA_TRUNK_NOT_EXIST - the trunk doesn't exist
* RT_ERR_LA_NOT_MEMBER_PORT - the port is not a member port of the trunk
* RT_ERR_LA_CPUPORT - CPU port can not be aggregated port
* Note:
* Trunk group 0 & 1 shares the same hash mapping table.
* Trunk group 2 uses a independent table.
*/
extern rtk_api_ret_t rtk_trunk_hashMappingTable_set(rtk_trunk_group_t trk_gid, rtk_trunk_hashVal2Port_t *pHash2Port_array);
/* Function Name:
* rtk_trunk_hashMappingTable_get
* Description:
* Get hash value to port array in the trunk group id from the specified device.
* Input:
* trk_gid - trunk group id
* Output:
* pHash2Port_array - pointer buffer of ports associate with the hash value
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_UNIT_ID - invalid unit id
* RT_ERR_LA_TRUNK_ID - invalid trunk ID
* RT_ERR_NULL_POINTER - input parameter may be null pointer
* Note:
* Trunk group 0 & 1 shares the same hash mapping table.
* Trunk group 2 uses a independent table.
*/
extern rtk_api_ret_t rtk_trunk_hashMappingTable_get(rtk_trunk_group_t trk_gid, rtk_trunk_hashVal2Port_t *pHash2Port_array);
/* Function Name:
* rtk_trunk_portQueueEmpty_get
* Description:
* Get the port mask which all queues are empty.
* Input:
* None.
* Output:
* pEmpty_portmask - pointer empty port mask
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_NULL_POINTER - input parameter may be null pointer
* Note:
* None.
*/
extern rtk_api_ret_t rtk_trunk_portQueueEmpty_get(rtk_portmask_t *pEmpty_portmask);
#endif /* __RTK_API_TRUNK_H__ */

View file

@ -0,0 +1,892 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* Purpose : RTL8367/RTL8367C switch high-level API
*
* Feature : The file includes Trap module high-layer VLAN defination
*
*/
#ifndef __RTK_API_VLAN_H__
#define __RTK_API_VLAN_H__
/*
* Data Type Declaration
*/
#define RTK_MAX_NUM_OF_PROTO_TYPE 0xFFFF
#define RTK_MAX_NUM_OF_MSTI 0xF
#define RTK_FID_MAX 0xF
typedef struct rtk_vlan_cfg_s
{
rtk_portmask_t mbr;
rtk_portmask_t untag;
rtk_uint16 ivl_en;
rtk_uint16 fid_msti;
rtk_uint16 envlanpol;
rtk_uint16 meteridx;
rtk_uint16 vbpen;
rtk_uint16 vbpri;
}rtk_vlan_cfg_t;
typedef struct rtk_vlan_mbrcfg_s
{
rtk_uint16 evid;
rtk_portmask_t mbr;
rtk_uint16 fid_msti;
rtk_uint16 envlanpol;
rtk_uint16 meteridx;
rtk_uint16 vbpen;
rtk_uint16 vbpri;
}rtk_vlan_mbrcfg_t;
typedef rtk_uint32 rtk_stp_msti_id_t; /* MSTI ID */
typedef enum rtk_stp_state_e
{
STP_STATE_DISABLED = 0,
STP_STATE_BLOCKING,
STP_STATE_LEARNING,
STP_STATE_FORWARDING,
STP_STATE_END
} rtk_stp_state_t;
typedef rtk_uint32 rtk_vlan_proto_type_t; /* protocol and port based VLAN protocol type */
typedef enum rtk_vlan_acceptFrameType_e
{
ACCEPT_FRAME_TYPE_ALL = 0, /* untagged, priority-tagged and tagged */
ACCEPT_FRAME_TYPE_TAG_ONLY, /* tagged */
ACCEPT_FRAME_TYPE_UNTAG_ONLY, /* untagged and priority-tagged */
ACCEPT_FRAME_TYPE_END
} rtk_vlan_acceptFrameType_t;
/* frame type of protocol vlan - reference 802.1v standard */
typedef enum rtk_vlan_protoVlan_frameType_e
{
FRAME_TYPE_ETHERNET = 0,
FRAME_TYPE_LLCOTHER,
FRAME_TYPE_RFC1042,
FRAME_TYPE_END
} rtk_vlan_protoVlan_frameType_t;
/* Protocol-and-port-based Vlan structure */
typedef struct rtk_vlan_protoAndPortInfo_s
{
rtk_uint32 proto_type;
rtk_vlan_protoVlan_frameType_t frame_type;
rtk_vlan_t cvid;
rtk_pri_t cpri;
}rtk_vlan_protoAndPortInfo_t;
/* tagged mode of VLAN - reference realtek private specification */
typedef enum rtk_vlan_tagMode_e
{
VLAN_TAG_MODE_ORIGINAL = 0,
VLAN_TAG_MODE_KEEP_FORMAT,
VLAN_TAG_MODE_PRI,
VLAN_TAG_MODE_REAL_KEEP_FORMAT,
VLAN_TAG_MODE_END
} rtk_vlan_tagMode_t;
typedef enum rtk_vlan_resVidAction_e
{
RESVID_ACTION_UNTAG = 0,
RESVID_ACTION_TAG,
RESVID_ACTION_END
}
rtk_vlan_resVidAction_t;
/* Function Name:
* rtk_vlan_init
* Description:
* Initialize VLAN.
* Input:
* None
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* VLAN is disabled by default. User has to call this API to enable VLAN before
* using it. And It will set a default VLAN(vid 1) including all ports and set
* all ports PVID to the default VLAN.
*/
extern rtk_api_ret_t rtk_vlan_init(void);
/* Function Name:
* rtk_vlan_set
* Description:
* Set a VLAN entry.
* Input:
* vid - VLAN ID to configure.
* pVlanCfg - VLAN Configuration
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_L2_FID - Invalid FID.
* RT_ERR_VLAN_PORT_MBR_EXIST - Invalid member port mask.
* RT_ERR_VLAN_VID - Invalid VID parameter.
* Note:
*
*/
extern rtk_api_ret_t rtk_vlan_set(rtk_vlan_t vid, rtk_vlan_cfg_t *pVlanCfg);
/* Function Name:
* rtk_vlan_get
* Description:
* Get a VLAN entry.
* Input:
* vid - VLAN ID to configure.
* Output:
* pVlanCfg - VLAN Configuration
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_VLAN_VID - Invalid VID parameter.
* Note:
*
*/
extern rtk_api_ret_t rtk_vlan_get(rtk_vlan_t vid, rtk_vlan_cfg_t *pVlanCfg);
/* Function Name:
* rtk_vlan_egrFilterEnable_set
* Description:
* Set VLAN egress filter.
* Input:
* egrFilter - Egress filtering
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_ENABLE - Invalid input parameters.
* Note:
*
*/
extern rtk_api_ret_t rtk_vlan_egrFilterEnable_set(rtk_enable_t egrFilter);
/* Function Name:
* rtk_vlan_egrFilterEnable_get
* Description:
* Get VLAN egress filter.
* Input:
* pEgrFilter - Egress filtering
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_NULL_POINTER - NULL Pointer.
* Note:
*
*/
extern rtk_api_ret_t rtk_vlan_egrFilterEnable_get(rtk_enable_t *pEgrFilter);
/* Function Name:
* rtk_vlan_mbrCfg_set
* Description:
* Set a VLAN Member Configuration entry by index.
* Input:
* idx - Index of VLAN Member Configuration.
* pMbrcfg - VLAN member Configuration.
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_VLAN_VID - Invalid VID parameter.
* Note:
* Set a VLAN Member Configuration entry by index.
*/
extern rtk_api_ret_t rtk_vlan_mbrCfg_set(rtk_uint32 idx, rtk_vlan_mbrcfg_t *pMbrcfg);
/* Function Name:
* rtk_vlan_mbrCfg_get
* Description:
* Get a VLAN Member Configuration entry by index.
* Input:
* idx - Index of VLAN Member Configuration.
* Output:
* pMbrcfg - VLAN member Configuration.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_VLAN_VID - Invalid VID parameter.
* Note:
* Get a VLAN Member Configuration entry by index.
*/
extern rtk_api_ret_t rtk_vlan_mbrCfg_get(rtk_uint32 idx, rtk_vlan_mbrcfg_t *pMbrcfg);
/* Function Name:
* rtk_vlan_portPvid_set
* Description:
* Set port to specified VLAN ID(PVID).
* Input:
* port - Port id.
* pvid - Specified VLAN ID.
* priority - 802.1p priority for the PVID.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_VLAN_PRIORITY - Invalid priority.
* RT_ERR_VLAN_ENTRY_NOT_FOUND - VLAN entry not found.
* RT_ERR_VLAN_VID - Invalid VID parameter.
* Note:
* The API is used for Port-based VLAN. The untagged frame received from the
* port will be classified to the specified VLAN and assigned to the specified priority.
*/
extern rtk_api_ret_t rtk_vlan_portPvid_set(rtk_port_t port, rtk_vlan_t pvid, rtk_pri_t priority);
/* Function Name:
* rtk_vlan_portPvid_get
* Description:
* Get VLAN ID(PVID) on specified port.
* Input:
* port - Port id.
* Output:
* pPvid - Specified VLAN ID.
* pPriority - 802.1p priority for the PVID.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* The API can get the PVID and 802.1p priority for the PVID of Port-based VLAN.
*/
extern rtk_api_ret_t rtk_vlan_portPvid_get(rtk_port_t port, rtk_vlan_t *pPvid, rtk_pri_t *pPriority);
/* Function Name:
* rtk_vlan_portIgrFilterEnable_set
* Description:
* Set VLAN ingress for each port.
* Input:
* port - Port id.
* igr_filter - VLAN ingress function enable status.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* RT_ERR_ENABLE - Invalid enable input
* Note:
* The status of vlan ingress filter is as following:
* - DISABLED
* - ENABLED
* While VLAN function is enabled, ASIC will decide VLAN ID for each received frame and get belonged member
* ports from VLAN table. If received port is not belonged to VLAN member ports, ASIC will drop received frame if VLAN ingress function is enabled.
*/
extern rtk_api_ret_t rtk_vlan_portIgrFilterEnable_set(rtk_port_t port, rtk_enable_t igr_filter);
/* Function Name:
* rtk_vlan_portIgrFilterEnable_get
* Description:
* Get VLAN Ingress Filter
* Input:
* port - Port id.
* Output:
* pIgr_filter - VLAN ingress function enable status.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* The API can Get the VLAN ingress filter status.
* The status of vlan ingress filter is as following:
* - DISABLED
* - ENABLED
*/
extern rtk_api_ret_t rtk_vlan_portIgrFilterEnable_get(rtk_port_t port, rtk_enable_t *pIgr_filter);
/* Function Name:
* rtk_vlan_portAcceptFrameType_set
* Description:
* Set VLAN accept_frame_type
* Input:
* port - Port id.
* accept_frame_type - accept frame type
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_VLAN_ACCEPT_FRAME_TYPE - Invalid frame type.
* Note:
* The API is used for checking 802.1Q tagged frames.
* The accept frame type as following:
* - ACCEPT_FRAME_TYPE_ALL
* - ACCEPT_FRAME_TYPE_TAG_ONLY
* - ACCEPT_FRAME_TYPE_UNTAG_ONLY
*/
extern rtk_api_ret_t rtk_vlan_portAcceptFrameType_set(rtk_port_t port, rtk_vlan_acceptFrameType_t accept_frame_type);
/* Function Name:
* rtk_vlan_portAcceptFrameType_get
* Description:
* Get VLAN accept_frame_type
* Input:
* port - Port id.
* Output:
* pAccept_frame_type - accept frame type
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* The API can Get the VLAN ingress filter.
* The accept frame type as following:
* - ACCEPT_FRAME_TYPE_ALL
* - ACCEPT_FRAME_TYPE_TAG_ONLY
* - ACCEPT_FRAME_TYPE_UNTAG_ONLY
*/
extern rtk_api_ret_t rtk_vlan_portAcceptFrameType_get(rtk_port_t port, rtk_vlan_acceptFrameType_t *pAccept_frame_type);
/* Function Name:
* rtk_vlan_tagMode_set
* Description:
* Set CVLAN egress tag mode
* Input:
* port - Port id.
* tag_mode - The egress tag mode.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_INPUT - Invalid input parameter.
* RT_ERR_ENABLE - Invalid enable input.
* Note:
* The API can set Egress tag mode. There are 4 mode for egress tag:
* - VLAN_TAG_MODE_ORIGINAL,
* - VLAN_TAG_MODE_KEEP_FORMAT,
* - VLAN_TAG_MODE_PRI.
* - VLAN_TAG_MODE_REAL_KEEP_FORMAT,
*/
extern rtk_api_ret_t rtk_vlan_tagMode_set(rtk_port_t port, rtk_vlan_tagMode_t tag_mode);
/* Function Name:
* rtk_vlan_tagMode_get
* Description:
* Get CVLAN egress tag mode
* Input:
* port - Port id.
* Output:
* pTag_mode - The egress tag mode.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* The API can get Egress tag mode. There are 4 mode for egress tag:
* - VLAN_TAG_MODE_ORIGINAL,
* - VLAN_TAG_MODE_KEEP_FORMAT,
* - VLAN_TAG_MODE_PRI.
* - VLAN_TAG_MODE_REAL_KEEP_FORMAT,
*/
extern rtk_api_ret_t rtk_vlan_tagMode_get(rtk_port_t port, rtk_vlan_tagMode_t *pTag_mode);
/* Function Name:
* rtk_vlan_transparent_set
* Description:
* Set VLAN transparent mode
* Input:
* egr_port - Egress Port id.
* pIgr_pmask - Ingress Port Mask.
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* None.
*/
extern rtk_api_ret_t rtk_vlan_transparent_set(rtk_port_t egr_port, rtk_portmask_t *pIgr_pmask);
/* Function Name:
* rtk_vlan_transparent_get
* Description:
* Get VLAN transparent mode
* Input:
* egr_port - Egress Port id.
* Output:
* pIgr_pmask - Ingress Port Mask
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* None.
*/
extern rtk_api_ret_t rtk_vlan_transparent_get(rtk_port_t egr_port, rtk_portmask_t *pIgr_pmask);
/* Function Name:
* rtk_vlan_keep_set
* Description:
* Set VLAN egress keep mode
* Input:
* egr_port - Egress Port id.
* pIgr_pmask - Ingress Port Mask.
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* None.
*/
extern rtk_api_ret_t rtk_vlan_keep_set(rtk_port_t egr_port, rtk_portmask_t *pIgr_pmask);
/* Function Name:
* rtk_vlan_keep_get
* Description:
* Get VLAN egress keep mode
* Input:
* egr_port - Egress Port id.
* Output:
* pIgr_pmask - Ingress Port Mask
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Invalid port number.
* Note:
* None.
*/
extern rtk_api_ret_t rtk_vlan_keep_get(rtk_port_t egr_port, rtk_portmask_t *pIgr_pmask);
/* Function Name:
* rtk_vlan_stg_set
* Description:
* Set spanning tree group instance of the vlan to the specified device
* Input:
* vid - Specified VLAN ID.
* stg - spanning tree group instance.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_MSTI - Invalid msti parameter
* RT_ERR_INPUT - Invalid input parameter.
* RT_ERR_VLAN_VID - Invalid VID parameter.
* Note:
* The API can set spanning tree group instance of the vlan to the specified device.
*/
extern rtk_api_ret_t rtk_vlan_stg_set(rtk_vlan_t vid, rtk_stp_msti_id_t stg);
/* Function Name:
* rtk_vlan_stg_get
* Description:
* Get spanning tree group instance of the vlan to the specified device
* Input:
* vid - Specified VLAN ID.
* Output:
* pStg - spanning tree group instance.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_VLAN_VID - Invalid VID parameter.
* Note:
* The API can get spanning tree group instance of the vlan to the specified device.
*/
extern rtk_api_ret_t rtk_vlan_stg_get(rtk_vlan_t vid, rtk_stp_msti_id_t *pStg);
/* Function Name:
* rtk_vlan_protoAndPortBasedVlan_add
* Description:
* Add the protocol-and-port-based vlan to the specified port of device.
* Input:
* port - Port id.
* pInfo - Protocol and port based VLAN configuration information.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_VLAN_VID - Invalid VID parameter.
* RT_ERR_VLAN_PRIORITY - Invalid priority.
* RT_ERR_TBL_FULL - Table is full.
* RT_ERR_OUT_OF_RANGE - input out of range.
* Note:
* The incoming packet which match the protocol-and-port-based vlan will use the configure vid for ingress pipeline
* The frame type is shown in the following:
* - FRAME_TYPE_ETHERNET
* - FRAME_TYPE_RFC1042
* - FRAME_TYPE_LLCOTHER
*/
extern rtk_api_ret_t rtk_vlan_protoAndPortBasedVlan_add(rtk_port_t port, rtk_vlan_protoAndPortInfo_t *pInfo);
/* Function Name:
* rtk_vlan_protoAndPortBasedVlan_get
* Description:
* Get the protocol-and-port-based vlan to the specified port of device.
* Input:
* port - Port id.
* proto_type - protocol-and-port-based vlan protocol type.
* frame_type - protocol-and-port-based vlan frame type.
* Output:
* pInfo - Protocol and port based VLAN configuration information.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_OUT_OF_RANGE - input out of range.
* RT_ERR_TBL_FULL - Table is full.
* Note:
* The incoming packet which match the protocol-and-port-based vlan will use the configure vid for ingress pipeline
* The frame type is shown in the following:
* - FRAME_TYPE_ETHERNET
* - FRAME_TYPE_RFC1042
* - FRAME_TYPE_LLCOTHER
*/
extern rtk_api_ret_t rtk_vlan_protoAndPortBasedVlan_get(rtk_port_t port, rtk_vlan_proto_type_t proto_type, rtk_vlan_protoVlan_frameType_t frame_type, rtk_vlan_protoAndPortInfo_t *pInfo);
/* Function Name:
* rtk_vlan_protoAndPortBasedVlan_del
* Description:
* Delete the protocol-and-port-based vlan from the specified port of device.
* Input:
* port - Port id.
* proto_type - protocol-and-port-based vlan protocol type.
* frame_type - protocol-and-port-based vlan frame type.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_OUT_OF_RANGE - input out of range.
* RT_ERR_TBL_FULL - Table is full.
* Note:
* The incoming packet which match the protocol-and-port-based vlan will use the configure vid for ingress pipeline
* The frame type is shown in the following:
* - FRAME_TYPE_ETHERNET
* - FRAME_TYPE_RFC1042
* - FRAME_TYPE_LLCOTHER
*/
extern rtk_api_ret_t rtk_vlan_protoAndPortBasedVlan_del(rtk_port_t port, rtk_vlan_proto_type_t proto_type, rtk_vlan_protoVlan_frameType_t frame_type);
/* Function Name:
* rtk_vlan_protoAndPortBasedVlan_delAll
* Description:
* Delete all protocol-and-port-based vlans from the specified port of device.
* Input:
* port - Port id.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_OUT_OF_RANGE - input out of range.
* Note:
* The incoming packet which match the protocol-and-port-based vlan will use the configure vid for ingress pipeline
* Delete all flow table protocol-and-port-based vlan entries.
*/
extern rtk_api_ret_t rtk_vlan_protoAndPortBasedVlan_delAll(rtk_port_t port);
/* Function Name:
* rtk_vlan_portFid_set
* Description:
* Set port-based filtering database
* Input:
* port - Port id.
* enable - ebable port-based FID
* fid - Specified filtering database.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_L2_FID - Invalid fid.
* RT_ERR_INPUT - Invalid input parameter.
* RT_ERR_PORT_ID - Invalid port ID.
* Note:
* The API can set port-based filtering database. If the function is enabled, all input
* packets will be assigned to the port-based fid regardless vlan tag.
*/
extern rtk_api_ret_t rtk_vlan_portFid_set(rtk_port_t port, rtk_enable_t enable, rtk_fid_t fid);
/* Function Name:
* rtk_vlan_portFid_get
* Description:
* Get port-based filtering database
* Input:
* port - Port id.
* Output:
* pEnable - ebable port-based FID
* pFid - Specified filtering database.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Invalid port ID.
* Note:
* The API can get port-based filtering database status. If the function is enabled, all input
* packets will be assigned to the port-based fid regardless vlan tag.
*/
extern rtk_api_ret_t rtk_vlan_portFid_get(rtk_port_t port, rtk_enable_t *pEnable, rtk_fid_t *pFid);
/* Function Name:
* rtk_vlan_UntagDscpPriorityEnable_set
* Description:
* Set Untag DSCP priority assign
* Input:
* enable - state of Untag DSCP priority assign
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_ENABLE - Invalid input parameters.
* Note:
*
*/
extern rtk_api_ret_t rtk_vlan_UntagDscpPriorityEnable_set(rtk_enable_t enable);
/* Function Name:
* rtk_vlan_UntagDscpPriorityEnable_get
* Description:
* Get Untag DSCP priority assign
* Input:
* None
* Output:
* pEnable - state of Untag DSCP priority assign
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_NULL_POINTER - Null pointer
* Note:
*
*/
extern rtk_api_ret_t rtk_vlan_UntagDscpPriorityEnable_get(rtk_enable_t *pEnable);
/*Spanning Tree*/
/* Function Name:
* rtk_stp_mstpState_set
* Description:
* Configure spanning tree state per each port.
* Input:
* port - Port id
* msti - Multiple spanning tree instance.
* stp_state - Spanning tree state for msti
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_MSTI - Invalid msti parameter.
* RT_ERR_MSTP_STATE - Invalid STP state.
* Note:
* System supports per-port multiple spanning tree state for each msti.
* There are four states supported by ASIC.
* - STP_STATE_DISABLED
* - STP_STATE_BLOCKING
* - STP_STATE_LEARNING
* - STP_STATE_FORWARDING
*/
extern rtk_api_ret_t rtk_stp_mstpState_set(rtk_stp_msti_id_t msti, rtk_port_t port, rtk_stp_state_t stp_state);
/* Function Name:
* rtk_stp_mstpState_get
* Description:
* Get spanning tree state per each port.
* Input:
* port - Port id.
* msti - Multiple spanning tree instance.
* Output:
* pStp_state - Spanning tree state for msti
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_MSTI - Invalid msti parameter.
* Note:
* System supports per-port multiple spanning tree state for each msti.
* There are four states supported by ASIC.
* - STP_STATE_DISABLED
* - STP_STATE_BLOCKING
* - STP_STATE_LEARNING
* - STP_STATE_FORWARDING
*/
extern rtk_api_ret_t rtk_stp_mstpState_get(rtk_stp_msti_id_t msti, rtk_port_t port, rtk_stp_state_t *pStp_state);
/* Function Name:
* rtk_vlan_checkAndCreateMbr
* Description:
* Check and create Member configuration and return index
* Input:
* vid - VLAN id.
* Output:
* pIndex - Member configuration index
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_VLAN_VID - Invalid VLAN ID.
* RT_ERR_VLAN_ENTRY_NOT_FOUND - VLAN not found
* RT_ERR_TBL_FULL - Member Configuration table full
* Note:
*
*/
extern rtk_api_ret_t rtk_vlan_checkAndCreateMbr(rtk_vlan_t vid, rtk_uint32 *pIndex);
/* Function Name:
* rtk_vlan_reservedVidAction_set
* Description:
* Set Action of VLAN ID = 0 & 4095 tagged packet
* Input:
* action_vid0 - Action for VID 0.
* action_vid4095 - Action for VID 4095.
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error Input
* Note:
*
*/
extern rtk_api_ret_t rtk_vlan_reservedVidAction_set(rtk_vlan_resVidAction_t action_vid0, rtk_vlan_resVidAction_t action_vid4095);
/* Function Name:
* rtk_vlan_reservedVidAction_get
* Description:
* Get Action of VLAN ID = 0 & 4095 tagged packet
* Input:
* pAction_vid0 - Action for VID 0.
* pAction_vid4095 - Action for VID 4095.
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_NULL_POINTER - NULL Pointer
* Note:
*
*/
extern rtk_api_ret_t rtk_vlan_reservedVidAction_get(rtk_vlan_resVidAction_t *pAction_vid0, rtk_vlan_resVidAction_t *pAction_vid4095);
/* Function Name:
* rtk_vlan_realKeepRemarkEnable_set
* Description:
* Set Real keep 1p remarking feature
* Input:
* enabled - State of 1p remarking at real keep packet
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error Input
* Note:
*
*/
extern rtk_api_ret_t rtk_vlan_realKeepRemarkEnable_set(rtk_enable_t enabled);
/* Function Name:
* rtk_vlan_realKeepRemarkEnable_get
* Description:
* Get Real keep 1p remarking feature
* Input:
* None.
* Output:
* pEnabled - State of 1p remarking at real keep packet
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error Input
* Note:
*
*/
extern rtk_api_ret_t rtk_vlan_realKeepRemarkEnable_get(rtk_enable_t *pEnabled);
/* Function Name:
* rtk_vlan_reset
* Description:
* Reset VLAN
* Input:
* None.
* Output:
* pEnabled - State of 1p remarking at real keep packet
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error Input
* Note:
*
*/
rtk_api_ret_t rtk_vlan_reset(void);
#endif /* __RTK_API_VLAN_H__ */

View file

@ -0,0 +1,434 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (, 08 2017) $
*
* Purpose : RTK switch high-level API for RTL8367/RTL8367C
* Feature : Here is a list of all functions and variables in Interrupt module.
*
*/
#include <rtk_switch.h>
#include <rtk_error.h>
#include <interrupt.h>
#include <string.h>
#include <rtl8367c_asicdrv.h>
#include <rtl8367c_asicdrv_interrupt.h>
/* Function Name:
* rtk_int_polarity_set
* Description:
* Set interrupt polarity configuration.
* Input:
* type - Interruptpolarity type.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can set interrupt polarity configuration.
*/
rtk_api_ret_t rtk_int_polarity_set(rtk_int_polarity_t type)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(type >= INT_POLAR_END)
return RT_ERR_INPUT;
if ((retVal = rtl8367c_setAsicInterruptPolarity(type)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_int_polarity_get
* Description:
* Get interrupt polarity configuration.
* Input:
* None
* Output:
* pType - Interruptpolarity type.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* The API can get interrupt polarity configuration.
*/
rtk_api_ret_t rtk_int_polarity_get(rtk_int_polarity_t *pType)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(NULL == pType)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicInterruptPolarity(pType)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_int_control_set
* Description:
* Set interrupt trigger status configuration.
* Input:
* type - Interrupt type.
* enable - Interrupt status.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_ENABLE - Invalid enable input.
* Note:
* The API can set interrupt status configuration.
* The interrupt trigger status is shown in the following:
* - INT_TYPE_LINK_STATUS
* - INT_TYPE_METER_EXCEED
* - INT_TYPE_LEARN_LIMIT
* - INT_TYPE_LINK_SPEED
* - INT_TYPE_CONGEST
* - INT_TYPE_GREEN_FEATURE
* - INT_TYPE_LOOP_DETECT
* - INT_TYPE_8051,
* - INT_TYPE_CABLE_DIAG,
* - INT_TYPE_ACL,
* - INT_TYPE_SLIENT
*/
rtk_api_ret_t rtk_int_control_set(rtk_int_type_t type, rtk_enable_t enable)
{
rtk_api_ret_t retVal;
rtk_uint32 mask;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (type >= INT_TYPE_END)
return RT_ERR_INPUT;
if (type == INT_TYPE_RESERVED)
return RT_ERR_INPUT;
if ((retVal = rtl8367c_getAsicInterruptMask(&mask)) != RT_ERR_OK)
return retVal;
if (ENABLED == enable)
mask = mask | (1<<type);
else if (DISABLED == enable)
mask = mask & ~(1<<type);
else
return RT_ERR_INPUT;
if ((retVal = rtl8367c_setAsicInterruptMask(mask)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_int_control_get
* Description:
* Get interrupt trigger status configuration.
* Input:
* type - Interrupt type.
* Output:
* pEnable - Interrupt status.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can get interrupt status configuration.
* The interrupt trigger status is shown in the following:
* - INT_TYPE_LINK_STATUS
* - INT_TYPE_METER_EXCEED
* - INT_TYPE_LEARN_LIMIT
* - INT_TYPE_LINK_SPEED
* - INT_TYPE_CONGEST
* - INT_TYPE_GREEN_FEATURE
* - INT_TYPE_LOOP_DETECT
* - INT_TYPE_8051,
* - INT_TYPE_CABLE_DIAG,
* - INT_TYPE_ACL,
* - INT_TYPE_UPS,
* - INT_TYPE_SLIENT
*/
rtk_api_ret_t rtk_int_control_get(rtk_int_type_t type, rtk_enable_t *pEnable)
{
rtk_api_ret_t retVal;
rtk_uint32 mask;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(NULL == pEnable)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicInterruptMask(&mask)) != RT_ERR_OK)
return retVal;
if (0 == (mask&(1<<type)))
*pEnable=DISABLED;
else
*pEnable=ENABLED;
return RT_ERR_OK;
}
/* Function Name:
* rtk_int_status_set
* Description:
* Set interrupt trigger status to clean.
* Input:
* None
* Output:
* pStatusMask - Interrupt status bit mask.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can clean interrupt trigger status when interrupt happened.
* The interrupt trigger status is shown in the following:
* - INT_TYPE_LINK_STATUS (value[0] (Bit0))
* - INT_TYPE_METER_EXCEED (value[0] (Bit1))
* - INT_TYPE_LEARN_LIMIT (value[0] (Bit2))
* - INT_TYPE_LINK_SPEED (value[0] (Bit3))
* - INT_TYPE_CONGEST (value[0] (Bit4))
* - INT_TYPE_GREEN_FEATURE (value[0] (Bit5))
* - INT_TYPE_LOOP_DETECT (value[0] (Bit6))
* - INT_TYPE_8051 (value[0] (Bit7))
* - INT_TYPE_CABLE_DIAG (value[0] (Bit8))
* - INT_TYPE_ACL (value[0] (Bit9))
* - INT_TYPE_SLIENT (value[0] (Bit11))
* The status will be cleared after execute this API.
*/
rtk_api_ret_t rtk_int_status_set(rtk_int_status_t *pStatusMask)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(NULL == pStatusMask)
return RT_ERR_NULL_POINTER;
if(pStatusMask->value[0] & (0x0001 << INT_TYPE_RESERVED))
return RT_ERR_INPUT;
if(pStatusMask->value[0] >= (0x0001 << INT_TYPE_END))
return RT_ERR_INPUT;
if ((retVal = rtl8367c_setAsicInterruptStatus((rtk_uint32)pStatusMask->value[0]))!=RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_int_status_get
* Description:
* Get interrupt trigger status.
* Input:
* None
* Output:
* pStatusMask - Interrupt status bit mask.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can get interrupt trigger status when interrupt happened.
* The interrupt trigger status is shown in the following:
* - INT_TYPE_LINK_STATUS (value[0] (Bit0))
* - INT_TYPE_METER_EXCEED (value[0] (Bit1))
* - INT_TYPE_LEARN_LIMIT (value[0] (Bit2))
* - INT_TYPE_LINK_SPEED (value[0] (Bit3))
* - INT_TYPE_CONGEST (value[0] (Bit4))
* - INT_TYPE_GREEN_FEATURE (value[0] (Bit5))
* - INT_TYPE_LOOP_DETECT (value[0] (Bit6))
* - INT_TYPE_8051 (value[0] (Bit7))
* - INT_TYPE_CABLE_DIAG (value[0] (Bit8))
* - INT_TYPE_ACL (value[0] (Bit9))
* - INT_TYPE_SLIENT (value[0] (Bit11))
*
*/
rtk_api_ret_t rtk_int_status_get(rtk_int_status_t* pStatusMask)
{
rtk_api_ret_t retVal;
rtk_uint32 ims_mask;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(NULL == pStatusMask)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicInterruptStatus(&ims_mask)) != RT_ERR_OK)
return retVal;
pStatusMask->value[0] = (ims_mask & 0x00000FFF);
return RT_ERR_OK;
}
#define ADV_NOT_SUPPORT (0xFFFF)
static rtk_api_ret_t _rtk_int_Advidx_get(rtk_int_advType_t adv_type, rtk_uint32 *pAsic_idx)
{
rtk_uint32 asic_idx[ADV_END] =
{
INTRST_L2_LEARN,
INTRST_SPEED_CHANGE,
INTRST_SPECIAL_CONGESTION,
INTRST_PORT_LINKDOWN,
INTRST_PORT_LINKUP,
ADV_NOT_SUPPORT,
INTRST_RLDP_LOOPED,
INTRST_RLDP_RELEASED,
};
if(adv_type >= ADV_END)
return RT_ERR_INPUT;
if(asic_idx[adv_type] == ADV_NOT_SUPPORT)
return RT_ERR_CHIP_NOT_SUPPORTED;
*pAsic_idx = asic_idx[adv_type];
return RT_ERR_OK;
}
/* Function Name:
* rtk_int_advanceInfo_get
* Description:
* Get interrupt advanced information.
* Input:
* adv_type - Advanced interrupt type.
* Output:
* info - Information per type.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* This API can get advanced information when interrupt happened.
* The status will be cleared after execute this API.
*/
rtk_api_ret_t rtk_int_advanceInfo_get(rtk_int_advType_t adv_type, rtk_int_info_t *pInfo)
{
rtk_api_ret_t retVal;
rtk_uint32 data;
rtk_uint32 intAdvType;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(adv_type >= ADV_END)
return RT_ERR_INPUT;
if(NULL == pInfo)
return RT_ERR_NULL_POINTER;
if(adv_type != ADV_METER_EXCEED_MASK)
{
if((retVal = _rtk_int_Advidx_get(adv_type, &intAdvType)) != RT_ERR_OK)
return retVal;
}
switch(adv_type)
{
case ADV_L2_LEARN_PORT_MASK:
/* Get physical portmask */
if((retVal = rtl8367c_getAsicInterruptRelatedStatus(intAdvType, &data)) != RT_ERR_OK)
return retVal;
/* Clear Advanced Info */
if((retVal = rtl8367c_setAsicInterruptRelatedStatus(intAdvType, 0xFFFF)) != RT_ERR_OK)
return retVal;
/* Translate to logical portmask */
if((retVal = rtk_switch_portmask_P2L_get(data, &(pInfo->portMask))) != RT_ERR_OK)
return retVal;
/* Get system learn */
if((retVal = rtl8367c_getAsicInterruptRelatedStatus(INTRST_SYS_LEARN, &data)) != RT_ERR_OK)
return retVal;
/* Clear system learn */
if((retVal = rtl8367c_setAsicInterruptRelatedStatus(INTRST_SYS_LEARN, 0x0001)) != RT_ERR_OK)
return retVal;
pInfo->systemLearnOver = data;
break;
case ADV_SPEED_CHANGE_PORT_MASK:
case ADV_SPECIAL_CONGESTION_PORT_MASK:
case ADV_PORT_LINKDOWN_PORT_MASK:
case ADV_PORT_LINKUP_PORT_MASK:
case ADV_RLDP_LOOPED:
case ADV_RLDP_RELEASED:
/* Get physical portmask */
if((retVal = rtl8367c_getAsicInterruptRelatedStatus(intAdvType, &data)) != RT_ERR_OK)
return retVal;
/* Clear Advanced Info */
if((retVal = rtl8367c_setAsicInterruptRelatedStatus(intAdvType, 0xFFFF)) != RT_ERR_OK)
return retVal;
/* Translate to logical portmask */
if((retVal = rtk_switch_portmask_P2L_get(data, &(pInfo->portMask))) != RT_ERR_OK)
return retVal;
break;
case ADV_METER_EXCEED_MASK:
/* Get Meter Mask */
if((retVal = rtl8367c_getAsicInterruptRelatedStatus(INTRST_METER0_15, &data)) != RT_ERR_OK)
return retVal;
/* Clear Advanced Info */
if((retVal = rtl8367c_setAsicInterruptRelatedStatus(INTRST_METER0_15, 0xFFFF)) != RT_ERR_OK)
return retVal;
pInfo->meterMask = data & 0xFFFF;
/* Get Meter Mask */
if((retVal = rtl8367c_getAsicInterruptRelatedStatus(INTRST_METER16_31, &data)) != RT_ERR_OK)
return retVal;
/* Clear Advanced Info */
if((retVal = rtl8367c_setAsicInterruptRelatedStatus(INTRST_METER16_31, 0xFFFF)) != RT_ERR_OK)
return retVal;
pInfo->meterMask = pInfo->meterMask | ((data << 16) & 0xFFFF0000);
break;
default:
return RT_ERR_INPUT;
}
return RT_ERR_OK;
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,590 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (, 08 2017) $
*
* Purpose : RTK switch high-level API for RTL8367/RTL8367C
* Feature : Here is a list of all functions and variables in Leaky module.
*
*/
#include <rtk_switch.h>
#include <rtk_error.h>
#include <leaky.h>
#include <string.h>
#include <rtl8367c_asicdrv.h>
#include <rtl8367c_asicdrv_portIsolation.h>
#include <rtl8367c_asicdrv_rma.h>
#include <rtl8367c_asicdrv_igmp.h>
/* Function Name:
* rtk_leaky_vlan_set
* Description:
* Set VLAN leaky.
* Input:
* type - Packet type for VLAN leaky.
* enable - Leaky status.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_ENABLE - Invalid enable input
* Note:
* This API can set VLAN leaky for RMA ,IGMP/MLD, CDP, CSSTP, and LLDP packets.
* The leaky frame types are as following:
* - LEAKY_BRG_GROUP,
* - LEAKY_FD_PAUSE,
* - LEAKY_SP_MCAST,
* - LEAKY_1X_PAE,
* - LEAKY_UNDEF_BRG_04,
* - LEAKY_UNDEF_BRG_05,
* - LEAKY_UNDEF_BRG_06,
* - LEAKY_UNDEF_BRG_07,
* - LEAKY_PROVIDER_BRIDGE_GROUP_ADDRESS,
* - LEAKY_UNDEF_BRG_09,
* - LEAKY_UNDEF_BRG_0A,
* - LEAKY_UNDEF_BRG_0B,
* - LEAKY_UNDEF_BRG_0C,
* - LEAKY_PROVIDER_BRIDGE_GVRP_ADDRESS,
* - LEAKY_8021AB,
* - LEAKY_UNDEF_BRG_0F,
* - LEAKY_BRG_MNGEMENT,
* - LEAKY_UNDEFINED_11,
* - LEAKY_UNDEFINED_12,
* - LEAKY_UNDEFINED_13,
* - LEAKY_UNDEFINED_14,
* - LEAKY_UNDEFINED_15,
* - LEAKY_UNDEFINED_16,
* - LEAKY_UNDEFINED_17,
* - LEAKY_UNDEFINED_18,
* - LEAKY_UNDEFINED_19,
* - LEAKY_UNDEFINED_1A,
* - LEAKY_UNDEFINED_1B,
* - LEAKY_UNDEFINED_1C,
* - LEAKY_UNDEFINED_1D,
* - LEAKY_UNDEFINED_1E,
* - LEAKY_UNDEFINED_1F,
* - LEAKY_GMRP,
* - LEAKY_GVRP,
* - LEAKY_UNDEF_GARP_22,
* - LEAKY_UNDEF_GARP_23,
* - LEAKY_UNDEF_GARP_24,
* - LEAKY_UNDEF_GARP_25,
* - LEAKY_UNDEF_GARP_26,
* - LEAKY_UNDEF_GARP_27,
* - LEAKY_UNDEF_GARP_28,
* - LEAKY_UNDEF_GARP_29,
* - LEAKY_UNDEF_GARP_2A,
* - LEAKY_UNDEF_GARP_2B,
* - LEAKY_UNDEF_GARP_2C,
* - LEAKY_UNDEF_GARP_2D,
* - LEAKY_UNDEF_GARP_2E,
* - LEAKY_UNDEF_GARP_2F,
* - LEAKY_IGMP,
* - LEAKY_IPMULTICAST.
* - LEAKY_CDP,
* - LEAKY_CSSTP,
* - LEAKY_LLDP.
*/
rtk_api_ret_t rtk_leaky_vlan_set(rtk_leaky_type_t type, rtk_enable_t enable)
{
rtk_api_ret_t retVal;
rtk_uint32 port;
rtl8367c_rma_t rmacfg;
rtk_uint32 tmp;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (type >= LEAKY_END)
return RT_ERR_INPUT;
if (enable >= RTK_ENABLE_END)
return RT_ERR_INPUT;
if (type >= 0 && type <= LEAKY_UNDEF_GARP_2F)
{
if ((retVal = rtl8367c_getAsicRma(type, &rmacfg)) != RT_ERR_OK)
return retVal;
rmacfg.vlan_leaky = enable;
if ((retVal = rtl8367c_setAsicRma(type, &rmacfg)) != RT_ERR_OK)
return retVal;
}
else if (LEAKY_IPMULTICAST == type)
{
for (port = 0; port <= RTK_PORT_ID_MAX; port++)
{
if ((retVal = rtl8367c_setAsicIpMulticastVlanLeaky(port,enable)) != RT_ERR_OK)
return retVal;
}
}
else if (LEAKY_IGMP == type)
{
if ((retVal = rtl8367c_setAsicIGMPVLANLeaky(enable)) != RT_ERR_OK)
return retVal;
}
else if (LEAKY_CDP == type)
{
if ((retVal = rtl8367c_getAsicRmaCdp(&rmacfg)) != RT_ERR_OK)
return retVal;
rmacfg.vlan_leaky = enable;
if ((retVal = rtl8367c_setAsicRmaCdp(&rmacfg)) != RT_ERR_OK)
return retVal;
}
else if (LEAKY_CSSTP == type)
{
if ((retVal = rtl8367c_getAsicRmaCsstp(&rmacfg)) != RT_ERR_OK)
return retVal;
rmacfg.vlan_leaky = enable;
if ((retVal = rtl8367c_setAsicRmaCsstp(&rmacfg)) != RT_ERR_OK)
return retVal;
}
else if (LEAKY_LLDP == type)
{
if ((retVal = rtl8367c_getAsicRmaLldp(&tmp,&rmacfg)) != RT_ERR_OK)
return retVal;
rmacfg.vlan_leaky = enable;
if ((retVal = rtl8367c_setAsicRmaLldp(tmp, &rmacfg)) != RT_ERR_OK)
return retVal;
}
return RT_ERR_OK;
}
/* Function Name:
* rtk_leaky_vlan_get
* Description:
* Get VLAN leaky.
* Input:
* type - Packet type for VLAN leaky.
* Output:
* pEnable - Leaky status.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* This API can get VLAN leaky status for RMA ,IGMP/MLD, CDP, CSSTP, and LLDP packets.
* The leaky frame types are as following:
* - LEAKY_BRG_GROUP,
* - LEAKY_FD_PAUSE,
* - LEAKY_SP_MCAST,
* - LEAKY_1X_PAE,
* - LEAKY_UNDEF_BRG_04,
* - LEAKY_UNDEF_BRG_05,
* - LEAKY_UNDEF_BRG_06,
* - LEAKY_UNDEF_BRG_07,
* - LEAKY_PROVIDER_BRIDGE_GROUP_ADDRESS,
* - LEAKY_UNDEF_BRG_09,
* - LEAKY_UNDEF_BRG_0A,
* - LEAKY_UNDEF_BRG_0B,
* - LEAKY_UNDEF_BRG_0C,
* - LEAKY_PROVIDER_BRIDGE_GVRP_ADDRESS,
* - LEAKY_8021AB,
* - LEAKY_UNDEF_BRG_0F,
* - LEAKY_BRG_MNGEMENT,
* - LEAKY_UNDEFINED_11,
* - LEAKY_UNDEFINED_12,
* - LEAKY_UNDEFINED_13,
* - LEAKY_UNDEFINED_14,
* - LEAKY_UNDEFINED_15,
* - LEAKY_UNDEFINED_16,
* - LEAKY_UNDEFINED_17,
* - LEAKY_UNDEFINED_18,
* - LEAKY_UNDEFINED_19,
* - LEAKY_UNDEFINED_1A,
* - LEAKY_UNDEFINED_1B,
* - LEAKY_UNDEFINED_1C,
* - LEAKY_UNDEFINED_1D,
* - LEAKY_UNDEFINED_1E,
* - LEAKY_UNDEFINED_1F,
* - LEAKY_GMRP,
* - LEAKY_GVRP,
* - LEAKY_UNDEF_GARP_22,
* - LEAKY_UNDEF_GARP_23,
* - LEAKY_UNDEF_GARP_24,
* - LEAKY_UNDEF_GARP_25,
* - LEAKY_UNDEF_GARP_26,
* - LEAKY_UNDEF_GARP_27,
* - LEAKY_UNDEF_GARP_28,
* - LEAKY_UNDEF_GARP_29,
* - LEAKY_UNDEF_GARP_2A,
* - LEAKY_UNDEF_GARP_2B,
* - LEAKY_UNDEF_GARP_2C,
* - LEAKY_UNDEF_GARP_2D,
* - LEAKY_UNDEF_GARP_2E,
* - LEAKY_UNDEF_GARP_2F,
* - LEAKY_IGMP,
* - LEAKY_IPMULTICAST.
* - LEAKY_CDP,
* - LEAKY_CSSTP,
* - LEAKY_LLDP.
*/
rtk_api_ret_t rtk_leaky_vlan_get(rtk_leaky_type_t type, rtk_enable_t *pEnable)
{
rtk_api_ret_t retVal;
rtk_uint32 port,tmp;
rtl8367c_rma_t rmacfg;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (type >= LEAKY_END)
return RT_ERR_INPUT;
if(NULL == pEnable)
return RT_ERR_NULL_POINTER;
if (type >= 0 && type <= LEAKY_UNDEF_GARP_2F)
{
if ((retVal = rtl8367c_getAsicRma(type, &rmacfg)) != RT_ERR_OK)
return retVal;
*pEnable = rmacfg.vlan_leaky;
}
else if (LEAKY_IPMULTICAST == type)
{
for (port = 0; port <= RTK_PORT_ID_MAX; port++)
{
if ((retVal = rtl8367c_getAsicIpMulticastVlanLeaky(port, &tmp)) != RT_ERR_OK)
return retVal;
if (port>0&&(tmp!=*pEnable))
return RT_ERR_FAILED;
*pEnable = tmp;
}
}
else if (LEAKY_IGMP == type)
{
if ((retVal = rtl8367c_getAsicIGMPVLANLeaky(&tmp)) != RT_ERR_OK)
return retVal;
*pEnable = tmp;
}
else if (LEAKY_CDP == type)
{
if ((retVal = rtl8367c_getAsicRmaCdp(&rmacfg)) != RT_ERR_OK)
return retVal;
*pEnable = rmacfg.vlan_leaky;
}
else if (LEAKY_CSSTP == type)
{
if ((retVal = rtl8367c_getAsicRmaCsstp(&rmacfg)) != RT_ERR_OK)
return retVal;
*pEnable = rmacfg.vlan_leaky;
}
else if (LEAKY_LLDP == type)
{
if ((retVal = rtl8367c_getAsicRmaLldp(&tmp, &rmacfg)) != RT_ERR_OK)
return retVal;
*pEnable = rmacfg.vlan_leaky;
}
return RT_ERR_OK;
}
/* Function Name:
* rtk_leaky_portIsolation_set
* Description:
* Set port isolation leaky.
* Input:
* type - Packet type for port isolation leaky.
* enable - Leaky status.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_ENABLE - Invalid enable input
* Note:
* This API can set port isolation leaky for RMA ,IGMP/MLD, CDP, CSSTP, and LLDP packets.
* The leaky frame types are as following:
* - LEAKY_BRG_GROUP,
* - LEAKY_FD_PAUSE,
* - LEAKY_SP_MCAST,
* - LEAKY_1X_PAE,
* - LEAKY_UNDEF_BRG_04,
* - LEAKY_UNDEF_BRG_05,
* - LEAKY_UNDEF_BRG_06,
* - LEAKY_UNDEF_BRG_07,
* - LEAKY_PROVIDER_BRIDGE_GROUP_ADDRESS,
* - LEAKY_UNDEF_BRG_09,
* - LEAKY_UNDEF_BRG_0A,
* - LEAKY_UNDEF_BRG_0B,
* - LEAKY_UNDEF_BRG_0C,
* - LEAKY_PROVIDER_BRIDGE_GVRP_ADDRESS,
* - LEAKY_8021AB,
* - LEAKY_UNDEF_BRG_0F,
* - LEAKY_BRG_MNGEMENT,
* - LEAKY_UNDEFINED_11,
* - LEAKY_UNDEFINED_12,
* - LEAKY_UNDEFINED_13,
* - LEAKY_UNDEFINED_14,
* - LEAKY_UNDEFINED_15,
* - LEAKY_UNDEFINED_16,
* - LEAKY_UNDEFINED_17,
* - LEAKY_UNDEFINED_18,
* - LEAKY_UNDEFINED_19,
* - LEAKY_UNDEFINED_1A,
* - LEAKY_UNDEFINED_1B,
* - LEAKY_UNDEFINED_1C,
* - LEAKY_UNDEFINED_1D,
* - LEAKY_UNDEFINED_1E,
* - LEAKY_UNDEFINED_1F,
* - LEAKY_GMRP,
* - LEAKY_GVRP,
* - LEAKY_UNDEF_GARP_22,
* - LEAKY_UNDEF_GARP_23,
* - LEAKY_UNDEF_GARP_24,
* - LEAKY_UNDEF_GARP_25,
* - LEAKY_UNDEF_GARP_26,
* - LEAKY_UNDEF_GARP_27,
* - LEAKY_UNDEF_GARP_28,
* - LEAKY_UNDEF_GARP_29,
* - LEAKY_UNDEF_GARP_2A,
* - LEAKY_UNDEF_GARP_2B,
* - LEAKY_UNDEF_GARP_2C,
* - LEAKY_UNDEF_GARP_2D,
* - LEAKY_UNDEF_GARP_2E,
* - LEAKY_UNDEF_GARP_2F,
* - LEAKY_IGMP,
* - LEAKY_IPMULTICAST.
* - LEAKY_CDP,
* - LEAKY_CSSTP,
* - LEAKY_LLDP.
*/
rtk_api_ret_t rtk_leaky_portIsolation_set(rtk_leaky_type_t type, rtk_enable_t enable)
{
rtk_api_ret_t retVal;
rtk_uint32 port;
rtl8367c_rma_t rmacfg;
rtk_uint32 tmp;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (type >= LEAKY_END)
return RT_ERR_INPUT;
if (enable >= RTK_ENABLE_END)
return RT_ERR_INPUT;
if (type >= 0 && type <= LEAKY_UNDEF_GARP_2F)
{
if ((retVal = rtl8367c_getAsicRma(type, &rmacfg)) != RT_ERR_OK)
return retVal;
rmacfg.portiso_leaky = enable;
if ((retVal = rtl8367c_setAsicRma(type, &rmacfg)) != RT_ERR_OK)
return retVal;
}
else if (LEAKY_IPMULTICAST == type)
{
for (port = 0; port < RTK_MAX_NUM_OF_PORT; port++)
{
if ((retVal = rtl8367c_setAsicIpMulticastPortIsoLeaky(port,enable)) != RT_ERR_OK)
return retVal;
}
}
else if (LEAKY_IGMP == type)
{
if ((retVal = rtl8367c_setAsicIGMPIsoLeaky(enable)) != RT_ERR_OK)
return retVal;
}
else if (LEAKY_CDP == type)
{
if ((retVal = rtl8367c_getAsicRmaCdp(&rmacfg)) != RT_ERR_OK)
return retVal;
rmacfg.portiso_leaky = enable;
if ((retVal = rtl8367c_setAsicRmaCdp(&rmacfg)) != RT_ERR_OK)
return retVal;
}
else if (LEAKY_CSSTP == type)
{
if ((retVal = rtl8367c_getAsicRmaCsstp(&rmacfg)) != RT_ERR_OK)
return retVal;
rmacfg.portiso_leaky = enable;
if ((retVal = rtl8367c_setAsicRmaCsstp(&rmacfg)) != RT_ERR_OK)
return retVal;
}
else if (LEAKY_LLDP == type)
{
if ((retVal = rtl8367c_getAsicRmaLldp(&tmp, &rmacfg)) != RT_ERR_OK)
return retVal;
rmacfg.portiso_leaky = enable;
if ((retVal = rtl8367c_setAsicRmaLldp(tmp, &rmacfg)) != RT_ERR_OK)
return retVal;
}
return RT_ERR_OK;
}
/* Function Name:
* rtk_leaky_portIsolation_get
* Description:
* Get port isolation leaky.
* Input:
* type - Packet type for port isolation leaky.
* Output:
* pEnable - Leaky status.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* This API can get port isolation leaky status for RMA ,IGMP/MLD, CDP, CSSTP, and LLDP packets.
* The leaky frame types are as following:
* - LEAKY_BRG_GROUP,
* - LEAKY_FD_PAUSE,
* - LEAKY_SP_MCAST,
* - LEAKY_1X_PAE,
* - LEAKY_UNDEF_BRG_04,
* - LEAKY_UNDEF_BRG_05,
* - LEAKY_UNDEF_BRG_06,
* - LEAKY_UNDEF_BRG_07,
* - LEAKY_PROVIDER_BRIDGE_GROUP_ADDRESS,
* - LEAKY_UNDEF_BRG_09,
* - LEAKY_UNDEF_BRG_0A,
* - LEAKY_UNDEF_BRG_0B,
* - LEAKY_UNDEF_BRG_0C,
* - LEAKY_PROVIDER_BRIDGE_GVRP_ADDRESS,
* - LEAKY_8021AB,
* - LEAKY_UNDEF_BRG_0F,
* - LEAKY_BRG_MNGEMENT,
* - LEAKY_UNDEFINED_11,
* - LEAKY_UNDEFINED_12,
* - LEAKY_UNDEFINED_13,
* - LEAKY_UNDEFINED_14,
* - LEAKY_UNDEFINED_15,
* - LEAKY_UNDEFINED_16,
* - LEAKY_UNDEFINED_17,
* - LEAKY_UNDEFINED_18,
* - LEAKY_UNDEFINED_19,
* - LEAKY_UNDEFINED_1A,
* - LEAKY_UNDEFINED_1B,
* - LEAKY_UNDEFINED_1C,
* - LEAKY_UNDEFINED_1D,
* - LEAKY_UNDEFINED_1E,
* - LEAKY_UNDEFINED_1F,
* - LEAKY_GMRP,
* - LEAKY_GVRP,
* - LEAKY_UNDEF_GARP_22,
* - LEAKY_UNDEF_GARP_23,
* - LEAKY_UNDEF_GARP_24,
* - LEAKY_UNDEF_GARP_25,
* - LEAKY_UNDEF_GARP_26,
* - LEAKY_UNDEF_GARP_27,
* - LEAKY_UNDEF_GARP_28,
* - LEAKY_UNDEF_GARP_29,
* - LEAKY_UNDEF_GARP_2A,
* - LEAKY_UNDEF_GARP_2B,
* - LEAKY_UNDEF_GARP_2C,
* - LEAKY_UNDEF_GARP_2D,
* - LEAKY_UNDEF_GARP_2E,
* - LEAKY_UNDEF_GARP_2F,
* - LEAKY_IGMP,
* - LEAKY_IPMULTICAST.
* - LEAKY_CDP,
* - LEAKY_CSSTP,
* - LEAKY_LLDP.
*/
rtk_api_ret_t rtk_leaky_portIsolation_get(rtk_leaky_type_t type, rtk_enable_t *pEnable)
{
rtk_api_ret_t retVal;
rtk_uint32 port, tmp;
rtl8367c_rma_t rmacfg;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (type >= LEAKY_END)
return RT_ERR_INPUT;
if(NULL == pEnable)
return RT_ERR_NULL_POINTER;
if (type >= 0 && type <= LEAKY_UNDEF_GARP_2F)
{
if ((retVal = rtl8367c_getAsicRma(type, &rmacfg)) != RT_ERR_OK)
return retVal;
*pEnable = rmacfg.portiso_leaky;
}
else if (LEAKY_IPMULTICAST == type)
{
for (port = 0; port < RTK_MAX_NUM_OF_PORT; port++)
{
if ((retVal = rtl8367c_getAsicIpMulticastPortIsoLeaky(port, &tmp)) != RT_ERR_OK)
return retVal;
if (port > 0 &&(tmp != *pEnable))
return RT_ERR_FAILED;
*pEnable = tmp;
}
}
else if (LEAKY_IGMP == type)
{
if ((retVal = rtl8367c_getAsicIGMPIsoLeaky(&tmp)) != RT_ERR_OK)
return retVal;
*pEnable = tmp;
}
else if (LEAKY_CDP == type)
{
if ((retVal = rtl8367c_getAsicRmaCdp(&rmacfg)) != RT_ERR_OK)
return retVal;
*pEnable = rmacfg.portiso_leaky;
}
else if (LEAKY_CSSTP == type)
{
if ((retVal = rtl8367c_getAsicRmaCsstp(&rmacfg)) != RT_ERR_OK)
return retVal;
*pEnable = rmacfg.portiso_leaky;
}
else if (LEAKY_LLDP == type)
{
if ((retVal = rtl8367c_getAsicRmaLldp(&tmp, &rmacfg)) != RT_ERR_OK)
return retVal;
*pEnable = rmacfg.portiso_leaky;
}
return RT_ERR_OK;
}

View file

@ -0,0 +1,792 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (, 08 2017) $
*
* Purpose : RTK switch high-level API for RTL8367/RTL8367C
* Feature : Here is a list of all functions and variables in LED module.
*
*/
#include <rtk_switch.h>
#include <rtk_error.h>
#include <led.h>
#include <string.h>
#include <rtl8367c_asicdrv.h>
#include <rtl8367c_asicdrv_led.h>
/* Function Name:
* rtk_led_enable_set
* Description:
* Set Led enable congiuration
* Input:
* group - LED group id.
* pPortmask - LED enable port mask.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_MASK - Error portmask
* Note:
* The API can be used to enable LED per port per group.
*/
rtk_api_ret_t rtk_led_enable_set(rtk_led_group_t group, rtk_portmask_t *pPortmask)
{
rtk_api_ret_t retVal;
rtk_uint32 pmask;
rtk_port_t port;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (group >= LED_GROUP_END)
return RT_ERR_INPUT;
RTK_CHK_PORTMASK_VALID(pPortmask);
RTK_PORTMASK_SCAN((*pPortmask), port)
{
if(rtk_switch_isCPUPort(port) == RT_ERR_OK)
return RT_ERR_PORT_MASK;
}
if((retVal = rtk_switch_portmask_L2P_get(pPortmask, &pmask)) != RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_setAsicLedGroupEnable(group, pmask)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_led_enable_get
* Description:
* Get Led enable congiuration
* Input:
* group - LED group id.
* Output:
* pPortmask - LED enable port mask.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can be used to get LED enable status.
*/
rtk_api_ret_t rtk_led_enable_get(rtk_led_group_t group, rtk_portmask_t *pPortmask)
{
rtk_api_ret_t retVal;
rtk_uint32 pmask;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (group >= LED_GROUP_END)
return RT_ERR_INPUT;
if ((retVal = rtl8367c_getAsicLedGroupEnable(group, &pmask)) != RT_ERR_OK)
return retVal;
if((retVal = rtk_switch_portmask_P2L_get(pmask, pPortmask)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_led_operation_set
* Description:
* Set Led operation mode
* Input:
* mode - LED operation mode.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can set Led operation mode.
* The modes that can be set are as following:
* - LED_OP_SCAN,
* - LED_OP_PARALLEL,
* - LED_OP_SERIAL,
*/
rtk_api_ret_t rtk_led_operation_set(rtk_led_operation_t mode)
{
rtk_api_ret_t retVal;
rtk_uint32 regData;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if ( mode >= LED_OP_END)
return RT_ERR_INPUT;
switch (mode)
{
case LED_OP_PARALLEL:
regData = LEDOP_PARALLEL;
break;
case LED_OP_SERIAL:
regData = LEDOP_SERIAL;
break;
default:
return RT_ERR_CHIP_NOT_SUPPORTED;
break;
}
if ((retVal = rtl8367c_setAsicLedOperationMode(regData)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_led_operation_get
* Description:
* Get Led operation mode
* Input:
* None
* Output:
* pMode - Support LED operation mode.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can get Led operation mode.
* The modes that can be set are as following:
* - LED_OP_SCAN,
* - LED_OP_PARALLEL,
* - LED_OP_SERIAL,
*/
rtk_api_ret_t rtk_led_operation_get(rtk_led_operation_t *pMode)
{
rtk_api_ret_t retVal;
rtk_uint32 regData;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(NULL == pMode)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicLedOperationMode(&regData)) != RT_ERR_OK)
return retVal;
if (regData == LEDOP_SERIAL)
*pMode = LED_OP_SERIAL;
else if (regData ==LEDOP_PARALLEL)
*pMode = LED_OP_PARALLEL;
else
return RT_ERR_FAILED;
return RT_ERR_OK;
}
/* Function Name:
* rtk_led_modeForce_set
* Description:
* Set Led group to congiuration force mode
* Input:
* port - port ID
* group - Support LED group id.
* mode - Support LED force mode.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Error Port ID
* Note:
* The API can force to one force mode.
* The force modes that can be set are as following:
* - LED_FORCE_NORMAL,
* - LED_FORCE_BLINK,
* - LED_FORCE_OFF,
* - LED_FORCE_ON.
*/
rtk_api_ret_t rtk_led_modeForce_set(rtk_port_t port, rtk_led_group_t group, rtk_led_force_mode_t mode)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check Port Valid */
RTK_CHK_PORT_VALID(port);
/* No LED for CPU port */
if(rtk_switch_isCPUPort(port) == RT_ERR_OK)
return RT_ERR_PORT_ID;
if (group >= LED_GROUP_END)
return RT_ERR_INPUT;
if (mode >= LED_FORCE_END)
return RT_ERR_NOT_ALLOWED;
if ((retVal = rtl8367c_setAsicForceLed(rtk_switch_port_L2P_get(port), group, mode)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_led_modeForce_get
* Description:
* Get Led group to congiuration force mode
* Input:
* port - port ID
* group - Support LED group id.
* pMode - Support LED force mode.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_PORT_ID - Error Port ID
* Note:
* The API can get forced Led group mode.
* The force modes that can be set are as following:
* - LED_FORCE_NORMAL,
* - LED_FORCE_BLINK,
* - LED_FORCE_OFF,
* - LED_FORCE_ON.
*/
rtk_api_ret_t rtk_led_modeForce_get(rtk_port_t port, rtk_led_group_t group, rtk_led_force_mode_t *pMode)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check Port Valid */
RTK_CHK_PORT_VALID(port);
/* No LED for CPU port */
if(rtk_switch_isCPUPort(port) == RT_ERR_OK)
return RT_ERR_PORT_ID;
if (group >= LED_GROUP_END)
return RT_ERR_INPUT;
if (NULL == pMode)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicForceLed(rtk_switch_port_L2P_get(port), group, pMode)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_led_blinkRate_set
* Description:
* Set LED blinking rate
* Input:
* blinkRate - blinking rate.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* ASIC support 6 types of LED blinking rates at 43ms, 84ms, 120ms, 170ms, 340ms and 670ms.
*/
rtk_api_ret_t rtk_led_blinkRate_set(rtk_led_blink_rate_t blinkRate)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (blinkRate >= LED_BLINKRATE_END)
return RT_ERR_FAILED;
if ((retVal = rtl8367c_setAsicLedBlinkRate(blinkRate)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_led_blinkRate_get
* Description:
* Get LED blinking rate at mode 0 to mode 3
* Input:
* None
* Output:
* pBlinkRate - blinking rate.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* There are 6 types of LED blinking rates at 43ms, 84ms, 120ms, 170ms, 340ms and 670ms.
*/
rtk_api_ret_t rtk_led_blinkRate_get(rtk_led_blink_rate_t *pBlinkRate)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(NULL == pBlinkRate)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicLedBlinkRate(pBlinkRate)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_led_groupConfig_set
* Description:
* Set per group Led to congiuration mode
* Input:
* group - LED group.
* config - LED configuration
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can set LED indicated information configuration for each LED group with 1 to 1 led mapping to each port.
* - Definition LED Statuses Description
* - 0000 LED_Off LED pin Tri-State.
* - 0001 Dup/Col Collision, Full duplex Indicator.
* - 0010 Link/Act Link, Activity Indicator.
* - 0011 Spd1000 1000Mb/s Speed Indicator.
* - 0100 Spd100 100Mb/s Speed Indicator.
* - 0101 Spd10 10Mb/s Speed Indicator.
* - 0110 Spd1000/Act 1000Mb/s Speed/Activity Indicator.
* - 0111 Spd100/Act 100Mb/s Speed/Activity Indicator.
* - 1000 Spd10/Act 10Mb/s Speed/Activity Indicator.
* - 1001 Spd100 (10)/Act 10/100Mb/s Speed/Activity Indicator.
* - 1010 LoopDetect LoopDetect Indicator.
* - 1011 EEE EEE Indicator.
* - 1100 Link/Rx Link, Activity Indicator.
* - 1101 Link/Tx Link, Activity Indicator.
* - 1110 Master Link on Master Indicator.
* - 1111 Act Activity Indicator. Low for link established.
*/
rtk_api_ret_t rtk_led_groupConfig_set(rtk_led_group_t group, rtk_led_congig_t config)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (LED_GROUP_END <= group)
return RT_ERR_FAILED;
if (LED_CONFIG_END <= config)
return RT_ERR_FAILED;
if ((retVal = rtl8367c_setAsicLedIndicateInfoConfig(group, config)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_led_groupConfig_get
* Description:
* Get Led group congiuration mode
* Input:
* group - LED group.
* Output:
* pConfig - LED configuration.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can get LED indicated information configuration for each LED group.
*/
rtk_api_ret_t rtk_led_groupConfig_get(rtk_led_group_t group, rtk_led_congig_t *pConfig)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (LED_GROUP_END <= group)
return RT_ERR_FAILED;
if(NULL == pConfig)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicLedIndicateInfoConfig(group, pConfig)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_led_groupAbility_set
* Description:
* Configure per group Led ability
* Input:
* group - LED group.
* pAbility - LED ability
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* None.
*/
rtk_api_ret_t rtk_led_groupAbility_set(rtk_led_group_t group, rtk_led_ability_t *pAbility)
{
rtk_api_ret_t retVal;
rtk_uint32 regData;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (LED_GROUP_END <= group)
return RT_ERR_FAILED;
if(pAbility == NULL)
return RT_ERR_NULL_POINTER;
if( (pAbility->link_10m >= RTK_ENABLE_END) || (pAbility->link_100m >= RTK_ENABLE_END)||
(pAbility->link_500m >= RTK_ENABLE_END) || (pAbility->link_1000m >= RTK_ENABLE_END)||
(pAbility->act_rx >= RTK_ENABLE_END) || (pAbility->act_tx >= RTK_ENABLE_END) )
{
return RT_ERR_INPUT;
}
if ((retVal = rtl8367c_getAsicReg(RTL8367C_REG_LED0_DATA_CTRL + (rtk_uint32)group, &regData)) != RT_ERR_OK)
return retVal;
if(pAbility->link_10m == ENABLED)
regData |= 0x0001;
else
regData &= ~0x0001;
if(pAbility->link_100m == ENABLED)
regData |= 0x0002;
else
regData &= ~0x0002;
if(pAbility->link_500m == ENABLED)
regData |= 0x0004;
else
regData &= ~0x0004;
if(pAbility->link_1000m == ENABLED)
regData |= 0x0008;
else
regData &= ~0x0008;
if(pAbility->act_rx == ENABLED)
regData |= 0x0010;
else
regData &= ~0x0010;
if(pAbility->act_tx == ENABLED)
regData |= 0x0020;
else
regData &= ~0x0020;
regData |= (0x0001 << 6);
if ((retVal = rtl8367c_setAsicReg(RTL8367C_REG_LED0_DATA_CTRL + (rtk_uint32)group, regData)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_led_groupAbility_get
* Description:
* Get per group Led ability
* Input:
* group - LED group.
* pAbility - LED ability
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* None.
*/
rtk_api_ret_t rtk_led_groupAbility_get(rtk_led_group_t group, rtk_led_ability_t *pAbility)
{
rtk_api_ret_t retVal;
rtk_uint32 regData;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (LED_GROUP_END <= group)
return RT_ERR_FAILED;
if(pAbility == NULL)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicReg(RTL8367C_REG_LED0_DATA_CTRL + (rtk_uint32)group, &regData)) != RT_ERR_OK)
return retVal;
pAbility->link_10m = (regData & 0x0001) ? ENABLED : DISABLED;
pAbility->link_100m = (regData & 0x0002) ? ENABLED : DISABLED;
pAbility->link_500m = (regData & 0x0004) ? ENABLED : DISABLED;
pAbility->link_1000m = (regData & 0x0008) ? ENABLED : DISABLED;
pAbility->act_rx = (regData & 0x0010) ? ENABLED : DISABLED;
pAbility->act_tx = (regData & 0x0020) ? ENABLED : DISABLED;
return RT_ERR_OK;
}
/* Function Name:
* rtk_led_serialMode_set
* Description:
* Set Led serial mode active congiuration
* Input:
* active - LED group.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can set LED serial mode active congiuration.
*/
rtk_api_ret_t rtk_led_serialMode_set(rtk_led_active_t active)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if ( active >= LED_ACTIVE_END)
return RT_ERR_INPUT;
if ((retVal = rtl8367c_setAsicLedSerialModeConfig(active,1))!=RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_led_serialMode_get
* Description:
* Get Led group congiuration mode
* Input:
* group - LED group.
* Output:
* pConfig - LED configuration.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can get LED serial mode active configuration.
*/
rtk_api_ret_t rtk_led_serialMode_get(rtk_led_active_t *pActive)
{
rtk_api_ret_t retVal;
rtk_uint32 regData;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(NULL == pActive)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicLedSerialModeConfig(pActive,&regData))!=RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_led_OutputEnable_set
* Description:
* This API set LED I/O state.
* Input:
* enabled - LED I/O state
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error parameter
* Note:
* This API set LED I/O state.
*/
rtk_api_ret_t rtk_led_OutputEnable_set(rtk_enable_t state)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (state >= RTK_ENABLE_END)
return RT_ERR_INPUT;
if ((retVal = rtl8367c_setAsicLedOutputEnable(state))!=RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_led_OutputEnable_get
* Description:
* This API get LED I/O state.
* Input:
* None.
* Output:
* pEnabled - LED I/O state
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error parameter
* Note:
* This API set current LED I/O state.
*/
rtk_api_ret_t rtk_led_OutputEnable_get(rtk_enable_t *pState)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(pState == NULL)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicLedOutputEnable(pState))!=RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_led_serialModePortmask_set
* Description:
* This API configure Serial LED output Group and portmask
* Input:
* output - output group
* pPortmask - output portmask
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error parameter
* Note:
* None.
*/
rtk_api_ret_t rtk_led_serialModePortmask_set(rtk_led_serialOutput_t output, rtk_portmask_t *pPortmask)
{
rtk_api_ret_t retVal;
rtk_uint32 pmask;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(output >= SERIAL_LED_END)
return RT_ERR_INPUT;
if(pPortmask == NULL)
return RT_ERR_NULL_POINTER;
if ((retVal = rtk_switch_portmask_L2P_get(pPortmask, &pmask)) != RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_setAsicLedSerialOutput((rtk_uint32)output, pmask))!=RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_led_serialModePortmask_get
* Description:
* This API get Serial LED output Group and portmask
* Input:
* None.
* Output:
* pOutput - output group
* pPortmask - output portmask
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error parameter
* Note:
* None.
*/
rtk_api_ret_t rtk_led_serialModePortmask_get(rtk_led_serialOutput_t *pOutput, rtk_portmask_t *pPortmask)
{
rtk_api_ret_t retVal;
rtk_uint32 pmask;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(pOutput == NULL)
return RT_ERR_NULL_POINTER;
if(pPortmask == NULL)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicLedSerialOutput((rtk_uint32 *)pOutput, &pmask))!=RT_ERR_OK)
return retVal;
if((retVal = rtk_switch_portmask_P2L_get(pmask, pPortmask)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}

View file

@ -0,0 +1,548 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (, 08 2017) $
*
* Purpose : RTK switch high-level API for RTL8367/RTL8367C
* Feature : Here is a list of all functions and variables in Mirror module.
*
*/
#include <rtk_switch.h>
#include <rtk_error.h>
#include <mirror.h>
#include <string.h>
#include <rtl8367c_asicdrv.h>
#include <rtl8367c_asicdrv_mirror.h>
/* Function Name:
* rtk_mirror_portBased_set
* Description:
* Set port mirror function.
* Input:
* mirroring_port - Monitor port.
* pMirrored_rx_portmask - Rx mirror port mask.
* pMirrored_tx_portmask - Tx mirror port mask.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* RT_ERR_PORT_MASK - Invalid portmask.
* Note:
* The API is to set mirror function of source port and mirror port.
* The mirror port can only be set to one port and the TX and RX mirror ports
* should be identical.
*/
rtk_api_ret_t rtk_mirror_portBased_set(rtk_port_t mirroring_port, rtk_portmask_t *pMirrored_rx_portmask, rtk_portmask_t *pMirrored_tx_portmask)
{
rtk_api_ret_t retVal;
rtk_enable_t mirRx, mirTx;
rtk_uint32 i, pmask;
rtk_port_t source_port;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check port valid */
RTK_CHK_PORT_VALID(mirroring_port);
if(NULL == pMirrored_rx_portmask)
return RT_ERR_NULL_POINTER;
if(NULL == pMirrored_tx_portmask)
return RT_ERR_NULL_POINTER;
RTK_CHK_PORTMASK_VALID(pMirrored_rx_portmask);
RTK_CHK_PORTMASK_VALID(pMirrored_tx_portmask);
/*Mirror Sorce Port Mask Check*/
if (pMirrored_tx_portmask->bits[0]!=pMirrored_rx_portmask->bits[0]&&pMirrored_tx_portmask->bits[0]!=0&&pMirrored_rx_portmask->bits[0]!=0)
return RT_ERR_PORT_MASK;
/*mirror port != source port*/
if(RTK_PORTMASK_IS_PORT_SET((*pMirrored_tx_portmask), mirroring_port) || RTK_PORTMASK_IS_PORT_SET((*pMirrored_rx_portmask), mirroring_port))
return RT_ERR_PORT_MASK;
source_port = rtk_switch_maxLogicalPort_get();
RTK_SCAN_ALL_LOG_PORT(i)
{
if (pMirrored_tx_portmask->bits[0]&(1<<i))
{
source_port = i;
break;
}
if (pMirrored_rx_portmask->bits[0]&(1<<i))
{
source_port = i;
break;
}
}
if ((retVal = rtl8367c_setAsicPortMirror(rtk_switch_port_L2P_get(source_port), rtk_switch_port_L2P_get(mirroring_port))) != RT_ERR_OK)
return retVal;
if(pMirrored_rx_portmask->bits[0] != 0)
{
if ((retVal = rtk_switch_portmask_L2P_get(pMirrored_rx_portmask, &pmask)) != RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_setAsicPortMirrorMask(pmask)) != RT_ERR_OK)
return retVal;
}
else
{
if ((retVal = rtk_switch_portmask_L2P_get(pMirrored_tx_portmask, &pmask)) != RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_setAsicPortMirrorMask(pmask)) != RT_ERR_OK)
return retVal;
}
if (pMirrored_rx_portmask->bits[0])
mirRx = ENABLED;
else
mirRx = DISABLED;
if ((retVal = rtl8367c_setAsicPortMirrorRxFunction(mirRx)) != RT_ERR_OK)
return retVal;
if (pMirrored_tx_portmask->bits[0])
mirTx = ENABLED;
else
mirTx = DISABLED;
if ((retVal = rtl8367c_setAsicPortMirrorTxFunction(mirTx)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_mirror_portBased_get
* Description:
* Get port mirror function.
* Input:
* None
* Output:
* pMirroring_port - Monitor port.
* pMirrored_rx_portmask - Rx mirror port mask.
* pMirrored_tx_portmask - Tx mirror port mask.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API is to get mirror function of source port and mirror port.
*/
rtk_api_ret_t rtk_mirror_portBased_get(rtk_port_t *pMirroring_port, rtk_portmask_t *pMirrored_rx_portmask, rtk_portmask_t *pMirrored_tx_portmask)
{
rtk_api_ret_t retVal;
rtk_port_t source_port;
rtk_enable_t mirRx, mirTx;
rtk_uint32 sport, mport, pmask;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(NULL == pMirrored_rx_portmask)
return RT_ERR_NULL_POINTER;
if(NULL == pMirrored_tx_portmask)
return RT_ERR_NULL_POINTER;
if(NULL == pMirroring_port)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicPortMirror(&sport, &mport)) != RT_ERR_OK)
return retVal;
source_port = rtk_switch_port_P2L_get(sport);
*pMirroring_port = rtk_switch_port_P2L_get(mport);
if ((retVal = rtl8367c_getAsicPortMirrorRxFunction((rtk_uint32*)&mirRx)) != RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_getAsicPortMirrorTxFunction((rtk_uint32*)&mirTx)) != RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_getAsicPortMirrorMask(&pmask)) != RT_ERR_OK)
return retVal;
if (DISABLED == mirRx)
pMirrored_rx_portmask->bits[0]=0;
else
{
if ((retVal = rtk_switch_portmask_P2L_get(pmask, pMirrored_rx_portmask)) != RT_ERR_OK)
return retVal;
pMirrored_rx_portmask->bits[0] |= 1<<source_port;
}
if (DISABLED == mirTx)
pMirrored_tx_portmask->bits[0]=0;
else
{
if ((retVal = rtk_switch_portmask_P2L_get(pmask, pMirrored_tx_portmask)) != RT_ERR_OK)
return retVal;
pMirrored_tx_portmask->bits[0] |= 1<<source_port;
}
return RT_ERR_OK;
}
/* Function Name:
* rtk_mirror_portIso_set
* Description:
* Set mirror port isolation.
* Input:
* enable |Mirror isolation status.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_ENABLE - Invalid enable input
* Note:
* The API is to set mirror isolation function that prevent normal forwarding packets to miror port.
*/
rtk_api_ret_t rtk_mirror_portIso_set(rtk_enable_t enable)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (enable >= RTK_ENABLE_END)
return RT_ERR_ENABLE;
if ((retVal = rtl8367c_setAsicPortMirrorIsolation(enable)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_mirror_portIso_get
* Description:
* Get mirror port isolation.
* Input:
* None
* Output:
* pEnable |Mirror isolation status.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API is to get mirror isolation status.
*/
rtk_api_ret_t rtk_mirror_portIso_get(rtk_enable_t *pEnable)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(NULL == pEnable)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicPortMirrorIsolation(pEnable)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_mirror_vlanLeaky_set
* Description:
* Set mirror VLAN leaky.
* Input:
* txenable -TX leaky enable.
* rxenable - RX leaky enable.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_ENABLE - Invalid enable input
* Note:
* The API is to set mirror VLAN leaky function forwarding packets to miror port.
*/
rtk_api_ret_t rtk_mirror_vlanLeaky_set(rtk_enable_t txenable, rtk_enable_t rxenable)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if ((txenable >= RTK_ENABLE_END) ||(rxenable >= RTK_ENABLE_END))
return RT_ERR_ENABLE;
if ((retVal = rtl8367c_setAsicPortMirrorVlanTxLeaky(txenable)) != RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_setAsicPortMirrorVlanRxLeaky(rxenable)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_mirror_vlanLeaky_get
* Description:
* Get mirror VLAN leaky.
* Input:
* None
* Output:
* pTxenable - TX leaky enable.
* pRxenable - RX leaky enable.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API is to get mirror VLAN leaky status.
*/
rtk_api_ret_t rtk_mirror_vlanLeaky_get(rtk_enable_t *pTxenable, rtk_enable_t *pRxenable)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if( (NULL == pTxenable) || (NULL == pRxenable) )
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicPortMirrorVlanTxLeaky(pTxenable)) != RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_getAsicPortMirrorVlanRxLeaky(pRxenable)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_mirror_isolationLeaky_set
* Description:
* Set mirror Isolation leaky.
* Input:
* txenable -TX leaky enable.
* rxenable - RX leaky enable.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_ENABLE - Invalid enable input
* Note:
* The API is to set mirror VLAN leaky function forwarding packets to miror port.
*/
rtk_api_ret_t rtk_mirror_isolationLeaky_set(rtk_enable_t txenable, rtk_enable_t rxenable)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if ((txenable >= RTK_ENABLE_END) ||(rxenable >= RTK_ENABLE_END))
return RT_ERR_ENABLE;
if ((retVal = rtl8367c_setAsicPortMirrorIsolationTxLeaky(txenable)) != RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_setAsicPortMirrorIsolationRxLeaky(rxenable)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_mirror_isolationLeaky_get
* Description:
* Get mirror isolation leaky.
* Input:
* None
* Output:
* pTxenable - TX leaky enable.
* pRxenable - RX leaky enable.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API is to get mirror isolation leaky status.
*/
rtk_api_ret_t rtk_mirror_isolationLeaky_get(rtk_enable_t *pTxenable, rtk_enable_t *pRxenable)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if( (NULL == pTxenable) || (NULL == pRxenable) )
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicPortMirrorIsolationTxLeaky(pTxenable)) != RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_getAsicPortMirrorIsolationRxLeaky(pRxenable)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_mirror_keep_set
* Description:
* Set mirror packet format keep.
* Input:
* mode - -mirror keep mode.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_ENABLE - Invalid enable input
* Note:
* The API is to set -mirror keep mode.
* The mirror keep mode is as following:
* - MIRROR_FOLLOW_VLAN
* - MIRROR_KEEP_ORIGINAL
* - MIRROR_KEEP_END
*/
rtk_api_ret_t rtk_mirror_keep_set(rtk_mirror_keep_t mode)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (mode >= MIRROR_KEEP_END)
return RT_ERR_ENABLE;
if ((retVal = rtl8367c_setAsicPortMirrorRealKeep(mode)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_mirror_keep_get
* Description:
* Get mirror packet format keep.
* Input:
* None
* Output:
* pMode -mirror keep mode.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API is to get mirror keep mode.
* The mirror keep mode is as following:
* - MIRROR_FOLLOW_VLAN
* - MIRROR_KEEP_ORIGINAL
* - MIRROR_KEEP_END
*/
rtk_api_ret_t rtk_mirror_keep_get(rtk_mirror_keep_t *pMode)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(NULL == pMode)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicPortMirrorRealKeep(pMode)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_mirror_override_set
* Description:
* Set port mirror override function.
* Input:
* rxMirror - 1: output mirrored packet, 0: output normal forward packet
* txMirror - 1: output mirrored packet, 0: output normal forward packet
* aclMirror - 1: output mirrored packet, 0: output normal forward packet
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* The API is to set mirror override function.
* This function control the output format when a port output
* normal forward & mirrored packet at the same time.
*/
rtk_api_ret_t rtk_mirror_override_set(rtk_enable_t rxMirror, rtk_enable_t txMirror, rtk_enable_t aclMirror)
{
rtk_api_ret_t retVal;
if( (rxMirror >= RTK_ENABLE_END) || (txMirror >= RTK_ENABLE_END) || (aclMirror >= RTK_ENABLE_END))
return RT_ERR_ENABLE;
if ((retVal = rtl8367c_setAsicPortMirrorOverride((rtk_uint32)rxMirror, (rtk_uint32)txMirror, (rtk_uint32)aclMirror)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_mirror_override_get
* Description:
* Get port mirror override function.
* Input:
* None
* Output:
* pRxMirror - 1: output mirrored packet, 0: output normal forward packet
* pTxMirror - 1: output mirrored packet, 0: output normal forward packet
* pAclMirror - 1: output mirrored packet, 0: output normal forward packet
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_NULL_POINTER - Null Pointer
* Note:
* The API is to Get mirror override function.
* This function control the output format when a port output
* normal forward & mirrored packet at the same time.
*/
rtk_api_ret_t rtk_mirror_override_get(rtk_enable_t *pRxMirror, rtk_enable_t *pTxMirror, rtk_enable_t *pAclMirror)
{
rtk_api_ret_t retVal;
if( (pRxMirror == NULL) || (pTxMirror == NULL) || (pAclMirror == NULL))
return RT_ERR_ENABLE;
if ((retVal = rtl8367c_getAsicPortMirrorOverride((rtk_uint32 *)pRxMirror, (rtk_uint32 *)pTxMirror, (rtk_uint32 *)pAclMirror)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}

View file

@ -0,0 +1,245 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (, 08 2017) $
*
* Purpose : RTK switch high-level API for RTL8367/RTL8367C
* Feature : Here is a list of all functions and variables in OAM(802.3ah) module.
*
*/
#include <rtk_switch.h>
#include <rtk_error.h>
#include <oam.h>
#include <string.h>
#include <rtl8367c_asicdrv.h>
#include <rtl8367c_asicdrv_oam.h>
/* Module Name : OAM */
/* Function Name:
* rtk_oam_init
* Description:
* Initialize oam module.
* Input:
* None
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* Note:
* Must initialize oam module before calling any oam APIs.
*/
rtk_api_ret_t rtk_oam_init(void)
{
return RT_ERR_OK;
} /* end of rtk_oam_init */
/* Function Name:
* rtk_oam_state_set
* Description:
* This API set OAM state.
* Input:
* enabled -OAMstate
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error parameter
* Note:
* This API set OAM state.
*/
rtk_api_ret_t rtk_oam_state_set(rtk_enable_t enabled)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (enabled >= RTK_ENABLE_END)
return RT_ERR_INPUT;
if ((retVal = rtl8367c_setAsicOamEnable(enabled))!=RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_oam_state_get
* Description:
* This API get OAM state.
* Input:
* None.
* Output:
* pEnabled - H/W IGMP state
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Error parameter
* Note:
* This API set current OAM state.
*/
rtk_api_ret_t rtk_oam_state_get(rtk_enable_t *pEnabled)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if ((retVal = rtl8367c_getAsicOamEnable(pEnabled))!=RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_oam_parserAction_set
* Description:
* Set OAM parser action
* Input:
* port - port id
* action - parser action
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT_ID - invalid port id
* Note:
* None
*/
rtk_api_ret_t rtk_oam_parserAction_set(rtk_port_t port, rtk_oam_parser_act_t action)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check Port Valid */
RTK_CHK_PORT_VALID(port);
if (action >= OAM_PARSER_ACTION_END)
return RT_ERR_INPUT;
if ((retVal = rtl8367c_setAsicOamParser(rtk_switch_port_L2P_get(port), action))!=RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_oam_parserAction_set
* Description:
* Get OAM parser action
* Input:
* port - port id
* Output:
* pAction - parser action
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT_ID - invalid port id
* Note:
* None
*/
rtk_api_ret_t rtk_oam_parserAction_get(rtk_port_t port, rtk_oam_parser_act_t *pAction)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check Port Valid */
RTK_CHK_PORT_VALID(port);
if ((retVal = rtl8367c_getAsicOamParser(rtk_switch_port_L2P_get(port), pAction))!=RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_oam_multiplexerAction_set
* Description:
* Set OAM multiplexer action
* Input:
* port - port id
* action - parser action
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT_ID - invalid port id
* Note:
* None
*/
rtk_api_ret_t rtk_oam_multiplexerAction_set(rtk_port_t port, rtk_oam_multiplexer_act_t action)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check Port Valid */
RTK_CHK_PORT_VALID(port);
if (action >= OAM_MULTIPLEXER_ACTION_END)
return RT_ERR_INPUT;
if ((retVal = rtl8367c_setAsicOamMultiplexer(rtk_switch_port_L2P_get(port), action))!=RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_oam_parserAction_set
* Description:
* Get OAM multiplexer action
* Input:
* port - port id
* Output:
* pAction - parser action
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT_ID - invalid port id
* Note:
* None
*/
rtk_api_ret_t rtk_oam_multiplexerAction_get(rtk_port_t port, rtk_oam_multiplexer_act_t *pAction)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check Port Valid */
RTK_CHK_PORT_VALID(port);
if ((retVal = rtl8367c_getAsicOamMultiplexer(rtk_switch_port_L2P_get(port), pAction))!=RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,759 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 39583 $
* $Date: 2013-05-20 16:59:23 +0800 (, 20 2013) $
*
* Purpose : RTK switch high-level API for RTL8367/RTL8367C
* Feature : Here is a list of all functions and variables in time module.
*
*/
#include <rtk_switch.h>
#include <rtk_error.h>
#include <ptp.h>
#include <string.h>
#include <rtl8367c_asicdrv.h>
#include <rtl8367c_asicdrv_eav.h>
/* Function Name:
* rtk_ptp_init
* Description:
* PTP function initialization.
* Input:
* None
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* This API is used to initialize PTP status.
*/
rtk_api_ret_t rtk_ptp_init(void)
{
/* Check initialization state */
RTK_CHK_INIT_STATE();
return RT_ERR_OK;
}
/* Function Name:
* rtk_ptp_mac_set
* Description:
* Configure PTP mac address.
* Input:
* mac - mac address to parser PTP packets.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameter.
* Note:
* None
*/
rtk_api_ret_t rtk_ptp_mac_set(rtk_mac_t mac)
{
rtk_api_ret_t retVal;
ether_addr_t sw_mac;
memcpy(sw_mac.octet, mac.octet, ETHER_ADDR_LEN);
if((retVal=rtl8367c_setAsicEavMacAddress(sw_mac))!=RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_ptp_mac_get
* Description:
* Get PTP mac address.
* Input:
* None
* Output:
* pMac - mac address to parser PTP packets.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameter.
* Note:
* None
*/
rtk_api_ret_t rtk_ptp_mac_get(rtk_mac_t *pMac)
{
rtk_api_ret_t retVal;
ether_addr_t sw_mac;
if((retVal=rtl8367c_getAsicEavMacAddress(&sw_mac))!=RT_ERR_OK)
return retVal;
memcpy(pMac->octet, sw_mac.octet, ETHER_ADDR_LEN);
return RT_ERR_OK;
}
/* Function Name:
* rtk_ptp_tpid_set
* Description:
* Configure PTP accepted outer & inner tag TPID.
* Input:
* outerId - Ether type of S-tag frame parsing in PTP ports.
* innerId - Ether type of C-tag frame parsing in PTP ports.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameter.
* Note:
* None
*/
rtk_api_ret_t rtk_ptp_tpid_set(rtk_ptp_tpid_t outerId, rtk_ptp_tpid_t innerId)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if ((outerId>RTK_MAX_NUM_OF_TPID) ||(innerId>RTK_MAX_NUM_OF_TPID))
return RT_ERR_INPUT;
if ((retVal = rtl8367c_setAsicEavTpid(outerId, innerId)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_ptp_tpid_get
* Description:
* Get PTP accepted outer & inner tag TPID.
* Input:
* None
* Output:
* pOuterId - Ether type of S-tag frame parsing in PTP ports.
* pInnerId - Ether type of C-tag frame parsing in PTP ports.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
rtk_api_ret_t rtk_ptp_tpid_get(rtk_ptp_tpid_t *pOuterId, rtk_ptp_tpid_t *pInnerId)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if ((retVal = rtl8367c_getAsicEavTpid(pOuterId, pInnerId)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_ptp_refTime_set
* Description:
* Set the reference time of the specified device.
* Input:
* timeStamp - reference timestamp value
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_INPUT - invalid input parameter
* Applicable:
* 8390, 8380
* Note:
* None
*/
rtk_api_ret_t rtk_ptp_refTime_set(rtk_ptp_timeStamp_t timeStamp)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (timeStamp.nsec > RTK_MAX_NUM_OF_NANO_SECOND)
return RT_ERR_INPUT;
if ((retVal = rtl8367c_setAsicEavSysTime(timeStamp.sec, timeStamp.nsec))!=RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_ptp_refTime_get
* Description:
* Get the reference time of the specified device.
* Input:
* Output:
* pTimeStamp - pointer buffer of the reference time
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_UNIT_ID - invalid unit id
* RT_ERR_NOT_INIT - The module is not initial
* RT_ERR_NULL_POINTER - input parameter may be null pointer
* Applicable:
* 8390, 8380
* Note:
* None
*/
rtk_api_ret_t rtk_ptp_refTime_get(rtk_ptp_timeStamp_t *pTimeStamp)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if ((retVal = rtl8367c_getAsicEavSysTime(&pTimeStamp->sec, &pTimeStamp->nsec))!=RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_ptp_refTimeAdjust_set
* Description:
* Adjust the reference time.
* Input:
* unit - unit id
* sign - significant
* timeStamp - reference timestamp value
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_UNIT_ID - invalid unit id
* RT_ERR_NOT_INIT - The module is not initial
* RT_ERR_INPUT - invalid input parameter
* Note:
* sign=0 for positive adjustment, sign=1 for negative adjustment.
*/
rtk_api_ret_t rtk_ptp_refTimeAdjust_set(rtk_ptp_sys_adjust_t sign, rtk_ptp_timeStamp_t timeStamp)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (timeStamp.nsec > RTK_MAX_NUM_OF_NANO_SECOND)
return RT_ERR_INPUT;
if ((retVal = rtl8367c_setAsicEavSysTimeAdjust(sign, timeStamp.sec, timeStamp.nsec))!=RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_ptp_refTimeEnable_set
* Description:
* Set the enable state of reference time of the specified device.
* Input:
* enable - status
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_INPUT - invalid input parameter
* Note:
* None
*/
rtk_api_ret_t rtk_ptp_refTimeEnable_set(rtk_enable_t enable)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (enable >= RTK_ENABLE_END)
return RT_ERR_ENABLE;
if ((retVal = rtl8367c_setAsicEavSysTimeCtrl(enable))!=RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_ptp_refTimeEnable_get
* Description:
* Get the enable state of reference time of the specified device.
* Input:
* Output:
* pEnable - status
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_UNIT_ID - invalid unit id
* RT_ERR_NOT_INIT - The module is not initial
* RT_ERR_NULL_POINTER - input parameter may be null pointer
* Applicable:
* 8390, 8380
* Note:
* None
*/
rtk_api_ret_t rtk_ptp_refTimeEnable_get(rtk_enable_t *pEnable)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if ((retVal = rtl8367c_getAsicEavSysTimeCtrl(pEnable))!=RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_ptp_portEnable_set
* Description:
* Set PTP status of the specified port.
* Input:
* port - port id
* enable - status
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT - invalid port id
* RT_ERR_INPUT - invalid input parameter
* Note:
* None
*/
rtk_api_ret_t rtk_ptp_portEnable_set(rtk_port_t port, rtk_enable_t enable)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check port is PTP port */
RTK_CHK_PORT_IS_PTP(port);
if (enable>=RTK_ENABLE_END)
return RT_ERR_INPUT;
if ((retVal = rtl8367c_setAsicEavPortEnable(rtk_switch_port_L2P_get(port), enable)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_ptp_portEnable_get
* Description:
* Get PTP status of the specified port.
* Input:
* port - port id
* Output:
* pEnable - status
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT - invalid port id
* RT_ERR_NULL_POINTER - input parameter may be null pointer
* Note:
* None
*/
rtk_api_ret_t rtk_ptp_portEnable_get(rtk_port_t port, rtk_enable_t *pEnable)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check port is PTP port */
RTK_CHK_PORT_IS_PTP(port);
if ((retVal = rtl8367c_getAsicEavPortEnable(rtk_switch_port_L2P_get(port), pEnable)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_ptp_portTimestamp_get
* Description:
* Get PTP timstamp according to the PTP identifier on the dedicated port from the specified device.
* Input:
* unit - unit id
* port - port id
* type - PTP message type
* Output:
* pInfo - pointer buffer of sequence ID and timestamp
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT_ID - invalid port id
* RT_ERR_INPUT - invalid input parameter
* RT_ERR_NULL_POINTER - input parameter may be null pointer
* Applicable:
* 8390, 8380
* Note:
* None
*/
rtk_api_ret_t rtk_ptp_portTimestamp_get( rtk_port_t port, rtk_ptp_msgType_t type, rtk_ptp_info_t *pInfo)
{
rtk_api_ret_t retVal;
rtl8367c_ptp_time_stamp_t time;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check port is PTP port */
RTK_CHK_PORT_IS_PTP(port);
if ((retVal = rtl8367c_getAsicEavPortTimeStamp(rtk_switch_port_L2P_get(port), type, &time)) != RT_ERR_OK)
return retVal;
pInfo->sequenceId = time.sequence_id;
pInfo->timeStamp.sec = time.second;
pInfo->timeStamp.nsec = time.nano_second;
return RT_ERR_OK;
}
/* Function Name:
* rtk_ptp_intControl_set
* Description:
* Set PTP interrupt trigger status configuration.
* Input:
* type - Interrupt type.
* enable - Interrupt status.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_ENABLE - Invalid enable input.
* Note:
* The API can set PTP interrupt status configuration.
* The interrupt trigger status is shown in the following:
* PTP_INT_TYPE_TX_SYNC = 0,
* PTP_INT_TYPE_TX_DELAY_REQ,
* PTP_INT_TYPE_TX_PDELAY_REQ,
* PTP_INT_TYPE_TX_PDELAY_RESP,
* PTP_INT_TYPE_RX_SYNC,
* PTP_INT_TYPE_RX_DELAY_REQ,
* PTP_INT_TYPE_RX_PDELAY_REQ,
* PTP_INT_TYPE_RX_PDELAY_RESP,
* PTP_INT_TYPE_ALL,
*/
rtk_api_ret_t rtk_ptp_intControl_set(rtk_ptp_intType_t type, rtk_enable_t enable)
{
rtk_api_ret_t retVal;
rtk_uint32 mask;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (type>=PTP_INT_TYPE_END)
return RT_ERR_INPUT;
if (PTP_INT_TYPE_ALL!=type)
{
if ((retVal = rtl8367c_getAsicEavInterruptMask(&mask)) != RT_ERR_OK)
return retVal;
if (ENABLED == enable)
mask = mask | (1<<type);
else if (DISABLED == enable)
mask = mask & ~(1<<type);
else
return RT_ERR_INPUT;
if ((retVal = rtl8367c_setAsicEavInterruptMask(mask)) != RT_ERR_OK)
return retVal;
}
else
{
if (ENABLED == enable)
mask = RTK_PTP_INTR_MASK;
else if (DISABLED == enable)
mask = 0;
else
return RT_ERR_INPUT;
if ((retVal = rtl8367c_setAsicEavInterruptMask(mask)) != RT_ERR_OK)
return retVal;
}
return RT_ERR_OK;
}
/* Function Name:
* rtk_ptp_intControl_get
* Description:
* Get PTP interrupt trigger status configuration.
* Input:
* type - Interrupt type.
* Output:
* pEnable - Interrupt status.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can get interrupt status configuration.
* The interrupt trigger status is shown in the following:
* PTP_INT_TYPE_TX_SYNC = 0,
* PTP_INT_TYPE_TX_DELAY_REQ,
* PTP_INT_TYPE_TX_PDELAY_REQ,
* PTP_INT_TYPE_TX_PDELAY_RESP,
* PTP_INT_TYPE_RX_SYNC,
* PTP_INT_TYPE_RX_DELAY_REQ,
* PTP_INT_TYPE_RX_PDELAY_REQ,
* PTP_INT_TYPE_RX_PDELAY_RESP,
*/
rtk_api_ret_t rtk_ptp_intControl_get(rtk_ptp_intType_t type, rtk_enable_t *pEnable)
{
rtk_api_ret_t retVal;
rtk_uint32 mask;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (type>=PTP_INT_TYPE_ALL)
return RT_ERR_INPUT;
if ((retVal = rtl8367c_getAsicEavInterruptMask(&mask)) != RT_ERR_OK)
return retVal;
if (0 == (mask&(1<<type)))
*pEnable=DISABLED;
else
*pEnable=ENABLED;
return RT_ERR_OK;
}
/* Function Name:
* rtk_ptp_intStatus_get
* Description:
* Get PTP port interrupt trigger status.
* Input:
* port - physical port
* Output:
* pStatusMask - Interrupt status bit mask.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can get interrupt trigger status when interrupt happened.
* The interrupt trigger status is shown in the following:
* - PORT 0 INT (value[0] (Bit0))
* - PORT 1 INT (value[0] (Bit1))
* - PORT 2 INT (value[0] (Bit2))
* - PORT 3 INT (value[0] (Bit3))
* - PORT 4 INT (value[0] (Bit4))
*
*/
rtk_api_ret_t rtk_ptp_intStatus_get(rtk_ptp_intStatus_t *pStatusMask)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if(NULL == pStatusMask)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicEavInterruptStatus(pStatusMask)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_ptp_portIntStatus_set
* Description:
* Set PTP port interrupt trigger status to clean.
* Input:
* port - physical port
* statusMask - Interrupt status bit mask.
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can clean interrupt trigger status when interrupt happened.
* The interrupt trigger status is shown in the following:
* - PTP_INT_TYPE_TX_SYNC (value[0] (Bit0))
* - PTP_INT_TYPE_TX_DELAY_REQ (value[0] (Bit1))
* - PTP_INT_TYPE_TX_PDELAY_REQ (value[0] (Bit2))
* - PTP_INT_TYPE_TX_PDELAY_RESP (value[0] (Bit3))
* - PTP_INT_TYPE_RX_SYNC (value[0] (Bit4))
* - PTP_INT_TYPE_RX_DELAY_REQ (value[0] (Bit5))
* - PTP_INT_TYPE_RX_PDELAY_REQ (value[0] (Bit6))
* - PTP_INT_TYPE_RX_PDELAY_RESP (value[0] (Bit7))
* The status will be cleared after execute this API.
*/
rtk_api_ret_t rtk_ptp_portIntStatus_set(rtk_port_t port, rtk_ptp_intStatus_t statusMask)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check port is PTP port */
RTK_CHK_PORT_IS_PTP(port);
if ((retVal = rtl8367c_setAsicEavPortInterruptStatus(rtk_switch_port_L2P_get(port), statusMask))!=RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_ptp_portIntStatus_get
* Description:
* Get PTP port interrupt trigger status.
* Input:
* port - physical port
* Output:
* pStatusMask - Interrupt status bit mask.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The API can get interrupt trigger status when interrupt happened.
* The interrupt trigger status is shown in the following:
* - PTP_INT_TYPE_TX_SYNC (value[0] (Bit0))
* - PTP_INT_TYPE_TX_DELAY_REQ (value[0] (Bit1))
* - PTP_INT_TYPE_TX_PDELAY_REQ (value[0] (Bit2))
* - PTP_INT_TYPE_TX_PDELAY_RESP (value[0] (Bit3))
* - PTP_INT_TYPE_RX_SYNC (value[0] (Bit4))
* - PTP_INT_TYPE_RX_DELAY_REQ (value[0] (Bit5))
* - PTP_INT_TYPE_RX_PDELAY_REQ (value[0] (Bit6))
* - PTP_INT_TYPE_RX_PDELAY_RESP (value[0] (Bit7))
*
*/
rtk_api_ret_t rtk_ptp_portIntStatus_get(rtk_port_t port, rtk_ptp_intStatus_t *pStatusMask)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check port is PTP port */
RTK_CHK_PORT_IS_PTP(port);
if(NULL == pStatusMask)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicEavPortInterruptStatus(rtk_switch_port_L2P_get(port), pStatusMask)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_ptp_portPtpTrap_set
* Description:
* Set PTP packet trap of the specified port.
* Input:
* port - port id
* enable - status
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT - invalid port id
* RT_ERR_INPUT - invalid input parameter
* Note:
* None
*/
rtk_api_ret_t rtk_ptp_portTrap_set(rtk_port_t port, rtk_enable_t enable)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check Port Valid */
RTK_CHK_PORT_VALID(port);
if (enable>=RTK_ENABLE_END)
return RT_ERR_INPUT;
if ((retVal = rtl8367c_setAsicEavTrap(rtk_switch_port_L2P_get(port), enable)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_ptp_portPtpEnable_get
* Description:
* Get PTP packet trap of the specified port.
* Input:
* port - port id
* Output:
* pEnable - status
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT - invalid port id
* RT_ERR_NULL_POINTER - input parameter may be null pointer
* Note:
* None
*/
rtk_api_ret_t rtk_ptp_portTrap_get(rtk_port_t port, rtk_enable_t *pEnable)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check Port Valid */
RTK_CHK_PORT_VALID(port);
if ((retVal = rtl8367c_getAsicEavTrap(rtk_switch_port_L2P_get(port), pEnable)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,607 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (, 08 2017) $
*
* Purpose : RTK switch high-level API for RTL8367/RTL8367C
* Feature : Here is a list of all functions and variables in rate module.
*
*/
#include <rtk_switch.h>
#include <rtk_error.h>
#include <rate.h>
#include <qos.h>
#include <string.h>
#include <rtl8367c_asicdrv.h>
#include <rtl8367c_asicdrv_meter.h>
#include <rtl8367c_asicdrv_inbwctrl.h>
#include <rtl8367c_asicdrv_scheduling.h>
/* Function Name:
* rtk_rate_shareMeter_set
* Description:
* Set meter configuration
* Input:
* index - shared meter index
* type - shared meter type
* rate - rate of share meter
* ifg_include - include IFG or not, ENABLE:include DISABLE:exclude
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_FILTER_METER_ID - Invalid meter
* RT_ERR_RATE - Invalid rate
* RT_ERR_INPUT - Invalid input parameters
* Note:
* The API can set shared meter rate and ifg include for each meter.
* The rate unit is 1 kbps and the range is from 8k to 1048568k if type is METER_TYPE_KBPS and
* the granularity of rate is 8 kbps.
* The rate unit is packets per second and the range is 1 ~ 0x1FFF if type is METER_TYPE_PPS.
* The ifg_include parameter is used
* for rate calculation with/without inter-frame-gap and preamble.
*/
rtk_api_ret_t rtk_rate_shareMeter_set(rtk_meter_id_t index, rtk_meter_type_t type, rtk_rate_t rate, rtk_enable_t ifg_include)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (index > RTK_MAX_METER_ID)
return RT_ERR_FILTER_METER_ID;
if (type >= METER_TYPE_END)
return RT_ERR_INPUT;
if (ifg_include >= RTK_ENABLE_END)
return RT_ERR_INPUT;
switch (type)
{
case METER_TYPE_KBPS:
if (rate > RTL8367C_QOS_RATE_INPUT_MAX_HSG || rate < RTL8367C_QOS_RATE_INPUT_MIN)
return RT_ERR_RATE ;
if ((retVal = rtl8367c_setAsicShareMeter(index, rate >> 3, ifg_include)) != RT_ERR_OK)
return retVal;
break;
case METER_TYPE_PPS:
if (rate > RTL8367C_QOS_PPS_INPUT_MAX || rate < RTL8367C_QOS_PPS_INPUT_MIN)
return RT_ERR_RATE ;
if ((retVal = rtl8367c_setAsicShareMeter(index, rate, ifg_include)) != RT_ERR_OK)
return retVal;
break;
default:
return RT_ERR_INPUT;
}
/* Set Type */
if ((retVal = rtl8367c_setAsicShareMeterType(index, (rtk_uint32)type)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_rate_shareMeter_get
* Description:
* Get meter configuration
* Input:
* index - shared meter index
* Output:
* pType - Meter Type
* pRate - pointer of rate of share meter
* pIfg_include - include IFG or not, ENABLE:include DISABLE:exclude
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_FILTER_METER_ID - Invalid meter
* Note:
*
*/
rtk_api_ret_t rtk_rate_shareMeter_get(rtk_meter_id_t index, rtk_meter_type_t *pType, rtk_rate_t *pRate, rtk_enable_t *pIfg_include)
{
rtk_api_ret_t retVal;
rtk_uint32 regData;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (index > RTK_MAX_METER_ID)
return RT_ERR_FILTER_METER_ID;
if(NULL == pType)
return RT_ERR_NULL_POINTER;
if(NULL == pRate)
return RT_ERR_NULL_POINTER;
if(NULL == pIfg_include)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicShareMeter(index, &regData, pIfg_include)) != RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_getAsicShareMeterType(index, (rtk_uint32 *)pType)) != RT_ERR_OK)
return retVal;
if(*pType == METER_TYPE_KBPS)
*pRate = regData<<3;
else
*pRate = regData;
return RT_ERR_OK;
}
/* Function Name:
* rtk_rate_shareMeterBucket_set
* Description:
* Set meter Bucket Size
* Input:
* index - shared meter index
* bucket_size - Bucket Size
* Output:
* None.
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_INPUT - Error Input
* RT_ERR_SMI - SMI access error
* RT_ERR_FILTER_METER_ID - Invalid meter
* Note:
* The API can set shared meter bucket size.
*/
rtk_api_ret_t rtk_rate_shareMeterBucket_set(rtk_meter_id_t index, rtk_uint32 bucket_size)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (index > RTK_MAX_METER_ID)
return RT_ERR_FILTER_METER_ID;
if(bucket_size > RTL8367C_METERBUCKETSIZEMAX)
return RT_ERR_INPUT;
if ((retVal = rtl8367c_setAsicShareMeterBucketSize(index, bucket_size)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_rate_shareMeterBucket_get
* Description:
* Get meter Bucket Size
* Input:
* index - shared meter index
* Output:
* pBucket_size - Bucket Size
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_FILTER_METER_ID - Invalid meter
* Note:
* The API can get shared meter bucket size.
*/
rtk_api_ret_t rtk_rate_shareMeterBucket_get(rtk_meter_id_t index, rtk_uint32 *pBucket_size)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (index > RTK_MAX_METER_ID)
return RT_ERR_FILTER_METER_ID;
if(NULL == pBucket_size)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicShareMeterBucketSize(index, pBucket_size)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_rate_igrBandwidthCtrlRate_set
* Description:
* Set port ingress bandwidth control
* Input:
* port - Port id
* rate - Rate of share meter
* ifg_include - include IFG or not, ENABLE:include DISABLE:exclude
* fc_enable - enable flow control or not, ENABLE:use flow control DISABLE:drop
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_ENABLE - Invalid IFG parameter.
* RT_ERR_INBW_RATE - Invalid ingress rate parameter.
* Note:
* The rate unit is 1 kbps and the range is from 8k to 1048568k. The granularity of rate is 8 kbps.
* The ifg_include parameter is used for rate calculation with/without inter-frame-gap and preamble.
*/
rtk_api_ret_t rtk_rate_igrBandwidthCtrlRate_set(rtk_port_t port, rtk_rate_t rate, rtk_enable_t ifg_include, rtk_enable_t fc_enable)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check Port Valid */
RTK_CHK_PORT_VALID(port);
if(ifg_include >= RTK_ENABLE_END)
return RT_ERR_INPUT;
if(fc_enable >= RTK_ENABLE_END)
return RT_ERR_INPUT;
if(rtk_switch_isHsgPort(port) == RT_ERR_OK)
{
if ((rate > RTL8367C_QOS_RATE_INPUT_MAX_HSG) || (rate < RTL8367C_QOS_RATE_INPUT_MIN))
return RT_ERR_QOS_EBW_RATE ;
}
else
{
if ((rate > RTL8367C_QOS_RATE_INPUT_MAX) || (rate < RTL8367C_QOS_RATE_INPUT_MIN))
return RT_ERR_QOS_EBW_RATE ;
}
if ((retVal = rtl8367c_setAsicPortIngressBandwidth(rtk_switch_port_L2P_get(port), rate>>3, ifg_include,fc_enable)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_rate_igrBandwidthCtrlRate_get
* Description:
* Get port ingress bandwidth control
* Input:
* port - Port id
* Output:
* pRate - Rate of share meter
* pIfg_include - Rate's calculation including IFG, ENABLE:include DISABLE:exclude
* pFc_enable - enable flow control or not, ENABLE:use flow control DISABLE:drop
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The rate unit is 1 kbps and the range is from 8k to 1048568k. The granularity of rate is 8 kbps.
* The ifg_include parameter is used for rate calculation with/without inter-frame-gap and preamble.
*/
rtk_api_ret_t rtk_rate_igrBandwidthCtrlRate_get(rtk_port_t port, rtk_rate_t *pRate, rtk_enable_t *pIfg_include, rtk_enable_t *pFc_enable)
{
rtk_api_ret_t retVal;
rtk_uint32 regData;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check Port Valid */
RTK_CHK_PORT_VALID(port);
if(NULL == pIfg_include)
return RT_ERR_NULL_POINTER;
if(NULL == pFc_enable)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicPortIngressBandwidth(rtk_switch_port_L2P_get(port), &regData, pIfg_include, pFc_enable)) != RT_ERR_OK)
return retVal;
*pRate = regData<<3;
return RT_ERR_OK;
}
/* Function Name:
* rtk_rate_egrBandwidthCtrlRate_set
* Description:
* Set port egress bandwidth control
* Input:
* port - Port id
* rate - Rate of egress bandwidth
* ifg_include - include IFG or not, ENABLE:include DISABLE:exclude
* Output:
* None
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_INPUT - Invalid input parameters.
* RT_ERR_QOS_EBW_RATE - Invalid egress bandwidth/rate
* Note:
* The rate unit is 1 kbps and the range is from 8k to 1048568k. The granularity of rate is 8 kbps.
* The ifg_include parameter is used for rate calculation with/without inter-frame-gap and preamble.
*/
rtk_api_ret_t rtk_rate_egrBandwidthCtrlRate_set( rtk_port_t port, rtk_rate_t rate, rtk_enable_t ifg_include)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check Port Valid */
RTK_CHK_PORT_VALID(port);
if(rtk_switch_isHsgPort(port) == RT_ERR_OK)
{
if ((rate > RTL8367C_QOS_RATE_INPUT_MAX_HSG) || (rate < RTL8367C_QOS_RATE_INPUT_MIN))
return RT_ERR_QOS_EBW_RATE ;
}
else
{
if ((rate > RTL8367C_QOS_RATE_INPUT_MAX) || (rate < RTL8367C_QOS_RATE_INPUT_MIN))
return RT_ERR_QOS_EBW_RATE ;
}
if (ifg_include >= RTK_ENABLE_END)
return RT_ERR_ENABLE;
if ((retVal = rtl8367c_setAsicPortEgressRate(rtk_switch_port_L2P_get(port), rate>>3)) != RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_setAsicPortEgressRateIfg(ifg_include)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_rate_egrBandwidthCtrlRate_get
* Description:
* Get port egress bandwidth control
* Input:
* port - Port id
* Output:
* pRate - Rate of egress bandwidth
* pIfg_include - Rate's calculation including IFG, ENABLE:include DISABLE:exclude
* Return:
* RT_ERR_OK - OK
* RT_ERR_FAILED - Failed
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number.
* RT_ERR_INPUT - Invalid input parameters.
* Note:
* The rate unit is 1 kbps and the range is from 8k to 1048568k. The granularity of rate is 8 kbps.
* The ifg_include parameter is used for rate calculation with/without inter-frame-gap and preamble.
*/
rtk_api_ret_t rtk_rate_egrBandwidthCtrlRate_get(rtk_port_t port, rtk_rate_t *pRate, rtk_enable_t *pIfg_include)
{
rtk_api_ret_t retVal;
rtk_uint32 regData;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check Port Valid */
RTK_CHK_PORT_VALID(port);
if(NULL == pRate)
return RT_ERR_NULL_POINTER;
if(NULL == pIfg_include)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicPortEgressRate(rtk_switch_port_L2P_get(port), &regData)) != RT_ERR_OK)
return retVal;
*pRate = regData << 3;
if ((retVal = rtl8367c_getAsicPortEgressRateIfg((rtk_uint32*)pIfg_include)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_rate_egrQueueBwCtrlEnable_get
* Description:
* Get enable status of egress bandwidth control on specified queue.
* Input:
* unit - unit id
* port - port id
* queue - queue id
* Output:
* pEnable - Pointer to enable status of egress queue bandwidth control
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT_ID - invalid port id
* RT_ERR_QUEUE_ID - invalid queue id
* RT_ERR_NULL_POINTER - input parameter may be null pointer
* Note:
* None
*/
rtk_api_ret_t rtk_rate_egrQueueBwCtrlEnable_get(rtk_port_t port, rtk_qid_t queue, rtk_enable_t *pEnable)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check Port Valid */
RTK_CHK_PORT_VALID(port);
/*for whole port function, the queue value should be 0xFF*/
if (queue != RTK_WHOLE_SYSTEM)
return RT_ERR_QUEUE_ID;
if(NULL == pEnable)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicAprEnable(rtk_switch_port_L2P_get(port),pEnable))!=RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_rate_egrQueueBwCtrlEnable_set
* Description:
* Set enable status of egress bandwidth control on specified queue.
* Input:
* port - port id
* queue - queue id
* enable - enable status of egress queue bandwidth control
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT_ID - invalid port id
* RT_ERR_QUEUE_ID - invalid queue id
* RT_ERR_INPUT - invalid input parameter
* Note:
* None
*/
rtk_api_ret_t rtk_rate_egrQueueBwCtrlEnable_set(rtk_port_t port, rtk_qid_t queue, rtk_enable_t enable)
{
rtk_api_ret_t retVal;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check Port Valid */
RTK_CHK_PORT_VALID(port);
/*for whole port function, the queue value should be 0xFF*/
if (queue != RTK_WHOLE_SYSTEM)
return RT_ERR_QUEUE_ID;
if (enable>=RTK_ENABLE_END)
return RT_ERR_INPUT;
if ((retVal = rtl8367c_setAsicAprEnable(rtk_switch_port_L2P_get(port), enable))!=RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_rate_egrQueueBwCtrlRate_get
* Description:
* Get rate of egress bandwidth control on specified queue.
* Input:
* port - port id
* queue - queue id
* pIndex - shared meter index
* Output:
* pRate - pointer to rate of egress queue bandwidth control
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT_ID - invalid port id
* RT_ERR_QUEUE_ID - invalid queue id
* RT_ERR_FILTER_METER_ID - Invalid meter id
* Note:
* The actual rate control is set in shared meters.
* The unit of granularity is 8Kbps.
*/
rtk_api_ret_t rtk_rate_egrQueueBwCtrlRate_get(rtk_port_t port, rtk_qid_t queue, rtk_meter_id_t *pIndex)
{
rtk_api_ret_t retVal;
rtk_uint32 offset_idx;
rtk_uint32 phy_port;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check Port Valid */
RTK_CHK_PORT_VALID(port);
if (queue >= RTK_MAX_NUM_OF_QUEUE)
return RT_ERR_QUEUE_ID;
if(NULL == pIndex)
return RT_ERR_NULL_POINTER;
phy_port = rtk_switch_port_L2P_get(port);
if ((retVal=rtl8367c_getAsicAprMeter(phy_port, queue,&offset_idx))!=RT_ERR_OK)
return retVal;
*pIndex = offset_idx + ((phy_port%4)*8);
return RT_ERR_OK;
}
/* Function Name:
* rtk_rate_egrQueueBwCtrlRate_set
* Description:
* Set rate of egress bandwidth control on specified queue.
* Input:
* port - port id
* queue - queue id
* index - shared meter index
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_PORT_ID - invalid port id
* RT_ERR_QUEUE_ID - invalid queue id
* RT_ERR_FILTER_METER_ID - Invalid meter id
* Note:
* The actual rate control is set in shared meters.
* The unit of granularity is 8Kbps.
*/
rtk_api_ret_t rtk_rate_egrQueueBwCtrlRate_set(rtk_port_t port, rtk_qid_t queue, rtk_meter_id_t index)
{
rtk_api_ret_t retVal;
rtk_uint32 offset_idx;
rtk_uint32 phy_port;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check Port Valid */
RTK_CHK_PORT_VALID(port);
if (queue >= RTK_MAX_NUM_OF_QUEUE)
return RT_ERR_QUEUE_ID;
if (index > RTK_MAX_METER_ID)
return RT_ERR_FILTER_METER_ID;
phy_port = rtk_switch_port_L2P_get(port);
if (index < ((phy_port%4)*8) || index > (7 + (phy_port%4)*8))
return RT_ERR_FILTER_METER_ID;
offset_idx = index - ((phy_port%4)*8);
if ((retVal=rtl8367c_setAsicAprMeter(phy_port,queue,offset_idx))!=RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}

View file

@ -0,0 +1,468 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (g¤T, 08 ¤T¤ë 2017) $
*
* Purpose : Declaration of RLDP and RLPP API
*
* Feature : The file have include the following module and sub-modules
* 1) RLDP and RLPP configuration and status
*
*/
/*
* Include Files
*/
#include <rtk_switch.h>
#include <rtk_error.h>
//#include <rtk_types.h>
#include <rldp.h>
#include <rtl8367c_asicdrv.h>
#include <rtl8367c_asicdrv_rldp.h>
/*
* Symbol Definition
*/
/*
* Data Declaration
*/
/*
* Macro Declaration
*/
/*
* Function Declaration
*/
/* Module Name : RLDP */
/* Function Name:
* rtk_rldp_config_set
* Description:
* Set RLDP module configuration
* Input:
* pConfig - configuration structure of RLDP
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_INPUT
* RT_ERR_NULL_POINTER
* Note:
* None
*/
rtk_api_ret_t rtk_rldp_config_set(rtk_rldp_config_t *pConfig)
{
rtk_api_ret_t retVal;
ether_addr_t magic;
rtk_uint32 pmsk;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if (pConfig->rldp_enable >= RTK_ENABLE_END)
return RT_ERR_INPUT;
if (pConfig->trigger_mode >= RTK_RLDP_TRIGGER_END)
return RT_ERR_INPUT;
if (pConfig->compare_type >= RTK_RLDP_CMPTYPE_END)
return RT_ERR_INPUT;
if (pConfig->num_check >= RTK_RLDP_NUM_MAX)
return RT_ERR_INPUT;
if (pConfig->interval_check >= RTK_RLDP_INTERVAL_MAX)
return RT_ERR_INPUT;
if (pConfig->num_loop >= RTK_RLDP_NUM_MAX)
return RT_ERR_INPUT;
if (pConfig->interval_loop >= RTK_RLDP_INTERVAL_MAX)
return RT_ERR_INPUT;
if ((retVal = rtl8367c_getAsicRldpTxPortmask(&pmsk))!=RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_setAsicRldpTxPortmask(0x00))!=RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_setAsicRldpTxPortmask(pmsk))!=RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_setAsicRldp(pConfig->rldp_enable))!=RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_setAsicRldpTriggerMode(pConfig->trigger_mode))!=RT_ERR_OK)
return retVal;
memcpy(&magic, &pConfig->magic, sizeof(ether_addr_t));
if ((retVal = rtl8367c_setAsicRldpMagicNum(magic))!=RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_setAsicRldpCompareRandomNumber(pConfig->compare_type))!=RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_setAsicRldpCompareRandomNumber(pConfig->compare_type))!=RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_setAsicRldpCheckingStatePara(pConfig->num_check, pConfig->interval_check))!=RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_setAsicRldpLoopStatePara(pConfig->num_loop, pConfig->interval_loop))!=RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_rldp_config_get
* Description:
* Get RLDP module configuration
* Input:
* None
* Output:
* pConfig - configuration structure of RLDP
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_INPUT
* RT_ERR_NULL_POINTER
* Note:
* None
*/
rtk_api_ret_t rtk_rldp_config_get(rtk_rldp_config_t *pConfig)
{
rtk_api_ret_t retVal;
ether_addr_t magic;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if ((retVal = rtl8367c_getAsicRldp(&pConfig->rldp_enable))!=RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_getAsicRldpTriggerMode(&pConfig->trigger_mode))!=RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_getAsicRldpMagicNum(&magic))!=RT_ERR_OK)
return retVal;
memcpy(&pConfig->magic, &magic, sizeof(ether_addr_t));
if ((retVal = rtl8367c_getAsicRldpCompareRandomNumber(&pConfig->compare_type))!=RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_getAsicRldpCompareRandomNumber(&pConfig->compare_type))!=RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_getAsicRldpCheckingStatePara(&pConfig->num_check, &pConfig->interval_check))!=RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_getAsicRldpLoopStatePara(&pConfig->num_loop, &pConfig->interval_loop))!=RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_rldp_portConfig_set
* Description:
* Set per port RLDP module configuration
* Input:
* port - port number to be configured
* pPortConfig - per port configuration structure of RLDP
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_INPUT
* RT_ERR_NULL_POINTER
* Note:
* None
*/
rtk_api_ret_t rtk_rldp_portConfig_set(rtk_port_t port, rtk_rldp_portConfig_t *pPortConfig)
{
rtk_api_ret_t retVal;
rtk_uint32 pmsk;
rtk_uint32 phy_port;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check Port Valid */
RTK_CHK_PORT_VALID(port);
if (pPortConfig->tx_enable>= RTK_ENABLE_END)
return RT_ERR_INPUT;
phy_port = rtk_switch_port_L2P_get(port);
if ((retVal = rtl8367c_getAsicRldpTxPortmask(&pmsk))!=RT_ERR_OK)
return retVal;
if (pPortConfig->tx_enable)
{
pmsk |=(1<<phy_port);
}
else
{
pmsk &= ~(1<<phy_port);
}
if ((retVal = rtl8367c_setAsicRldpTxPortmask(pmsk))!=RT_ERR_OK)
return retVal;
return RT_ERR_OK;
} /* end of rtk_rldp_portConfig_set */
/* Function Name:
* rtk_rldp_portConfig_get
* Description:
* Get per port RLDP module configuration
* Input:
* port - port number to be get
* Output:
* pPortConfig - per port configuration structure of RLDP
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_INPUT
* RT_ERR_NULL_POINTER
* Note:
* None
*/
rtk_api_ret_t rtk_rldp_portConfig_get(rtk_port_t port, rtk_rldp_portConfig_t *pPortConfig)
{
rtk_api_ret_t retVal;
rtk_uint32 pmsk;
rtk_portmask_t logicalPmask;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check Port Valid */
RTK_CHK_PORT_VALID(port);
if ((retVal = rtl8367c_getAsicRldpTxPortmask(&pmsk))!=RT_ERR_OK)
return retVal;
if ((retVal = rtk_switch_portmask_P2L_get(pmsk, &logicalPmask)) != RT_ERR_OK)
return retVal;
if (logicalPmask.bits[0] & (1<<port))
{
pPortConfig->tx_enable = ENABLED;
}
else
{
pPortConfig->tx_enable = DISABLED;
}
return RT_ERR_OK;
} /* end of rtk_rldp_portConfig_get */
/* Function Name:
* rtk_rldp_status_get
* Description:
* Get RLDP module status
* Input:
* None
* Output:
* pStatus - status structure of RLDP
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_NULL_POINTER
* Note:
* None
*/
rtk_api_ret_t rtk_rldp_status_get(rtk_rldp_status_t *pStatus)
{
rtk_api_ret_t retVal;
ether_addr_t seed;
/* Check initialization state */
RTK_CHK_INIT_STATE();
if ((retVal = rtl8367c_getAsicRldpRandomNumber(&seed))!=RT_ERR_OK)
return retVal;
memcpy(&pStatus->id, &seed, sizeof(ether_addr_t));
return RT_ERR_OK;
} /* end of rtk_rldp_status_get */
/* Function Name:
* rtk_rldp_portStatus_get
* Description:
* Get RLDP module status
* Input:
* port - port number to be get
* Output:
* pPortStatus - per port status structure of RLDP
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_INPUT
* RT_ERR_NULL_POINTER
* Note:
* None
*/
rtk_api_ret_t rtk_rldp_portStatus_get(rtk_port_t port, rtk_rldp_portStatus_t *pPortStatus)
{
rtk_api_ret_t retVal;
rtk_uint32 pmsk;
rtk_portmask_t logicalPmask;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check Port Valid */
RTK_CHK_PORT_VALID(port);
if ((retVal = rtl8367c_getAsicRldpLoopedPortmask(&pmsk))!=RT_ERR_OK)
return retVal;
if ((retVal = rtk_switch_portmask_P2L_get(pmsk, &logicalPmask)) != RT_ERR_OK)
return retVal;
if (logicalPmask.bits[0] & (1<<port))
{
pPortStatus->loop_status = RTK_RLDP_LOOPSTS_LOOPING;
}
else
{
pPortStatus->loop_status = RTK_RLDP_LOOPSTS_NONE;
}
if ((retVal = rtl8367c_getAsicRldpEnterLoopedPortmask(&pmsk))!=RT_ERR_OK)
return retVal;
if ((retVal = rtk_switch_portmask_P2L_get(pmsk, &logicalPmask)) != RT_ERR_OK)
return retVal;
if (logicalPmask.bits[0] & (1<<port))
{
pPortStatus->loop_enter = RTK_RLDP_LOOPSTS_LOOPING;
}
else
{
pPortStatus->loop_enter = RTK_RLDP_LOOPSTS_NONE;
}
if ((retVal = rtl8367c_getAsicRldpLeaveLoopedPortmask(&pmsk))!=RT_ERR_OK)
return retVal;
if ((retVal = rtk_switch_portmask_P2L_get(pmsk, &logicalPmask)) != RT_ERR_OK)
return retVal;
if (logicalPmask.bits[0] & (1<<port))
{
pPortStatus->loop_leave = RTK_RLDP_LOOPSTS_LOOPING;
}
else
{
pPortStatus->loop_leave = RTK_RLDP_LOOPSTS_NONE;
}
return RT_ERR_OK;
}
/* Function Name:
* rtk_rldp_portStatus_clear
* Description:
* Clear RLDP module status
* Input:
* port - port number to be clear
* pPortStatus - per port status structure of RLDP
* Output:
* None
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_INPUT
* RT_ERR_NULL_POINTER
* Note:
* Clear operation effect loop_enter and loop_leave only, other field in
* the structure are don't care. Loop status cab't be clean.
*/
rtk_api_ret_t rtk_rldp_portStatus_set(rtk_port_t port, rtk_rldp_portStatus_t *pPortStatus)
{
rtk_api_ret_t retVal;
rtk_uint32 pmsk;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check Port Valid */
RTK_CHK_PORT_VALID(port);
pmsk = (pPortStatus->loop_enter)<<rtk_switch_port_L2P_get(port);
if ((retVal = rtl8367c_setAsicRldpEnterLoopedPortmask(pmsk))!=RT_ERR_OK)
return retVal;
pmsk = (pPortStatus->loop_leave)<<rtk_switch_port_L2P_get(port);
if ((retVal = rtl8367c_setAsicRldpLeaveLoopedPortmask(pmsk))!=RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtk_rldp_portLoopPair_get
* Description:
* Get RLDP port loop pairs
* Input:
* port - port number to be get
* Output:
* pPortmask - per port related loop ports
* Return:
* RT_ERR_OK
* RT_ERR_FAILED
* RT_ERR_INPUT
* RT_ERR_NULL_POINTER
* Note:
* None
*/
rtk_api_ret_t rtk_rldp_portLoopPair_get(rtk_port_t port, rtk_portmask_t *pPortmask)
{
rtk_api_ret_t retVal;
rtk_uint32 pmsk;
/* Check initialization state */
RTK_CHK_INIT_STATE();
/* Check Port Valid */
RTK_CHK_PORT_VALID(port);
if ((retVal = rtl8367c_getAsicRldpLoopedPortPair(rtk_switch_port_L2P_get(port), &pmsk))!=RT_ERR_OK)
return retVal;
if ((retVal = rtk_switch_portmask_P2L_get(pmsk, pPortmask)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}

View file

@ -0,0 +1,839 @@
#include <linux/kernel.h>
#include <linux/delay.h>
#include "./include/rtk_switch.h"
#include "./include/vlan.h"
#include "./include/port.h"
#include "./include/rate.h"
#include "./include/rtk_hal.h"
#include "./include/l2.h"
#include "./include/stat.h"
#include "./include/igmp.h"
#include "./include/trap.h"
#include "./include/leaky.h"
#include "./include/mirror.h"
#include "./include/rtl8367c_asicdrv_port.h"
#include "./include/rtl8367c_asicdrv_mib.h"
#include "./include/smi.h"
#include "./include/qos.h"
#include "./include/trunk.h"
void rtk_hal_switch_init(void)
{
if(rtk_switch_init() != 0)
printk("rtk_switch_init failed\n");
mdelay(500);
/*vlan init */
if (rtk_vlan_init() != 0)
printk("rtk_vlan_init failed\n");
}
void rtk_hal_dump_full_mib(void)
{
rtk_port_t port;
rtk_stat_counter_t Cntr;
rtk_stat_port_type_t cntr_idx;
for (port = UTP_PORT0; port < (UTP_PORT0 + 5); port++) {
printk("\nPort%d\n", port);
for (cntr_idx = STAT_IfInOctets; cntr_idx < STAT_PORT_CNTR_END; cntr_idx ++) {
rtk_stat_port_get(port, cntr_idx, &Cntr);
printk("%8llu ", Cntr);
if (((cntr_idx%10) == 9))
printk("\n");
}
}
for (port = EXT_PORT0; port < (EXT_PORT0 + 2); port++) {
printk("\nPort%d\n", port);
for (cntr_idx = STAT_IfInOctets; cntr_idx < STAT_PORT_CNTR_END; cntr_idx ++) {
rtk_stat_port_get(port, cntr_idx, &Cntr);
printk("%8llu ", Cntr);
if (((cntr_idx%10) == 9))
printk("\n");
}
}
rtk_stat_global_reset();
}
void rtk_dump_mib_type(rtk_stat_port_type_t cntr_idx)
{
rtk_port_t port;
rtk_stat_counter_t Cntr;
for (port = UTP_PORT0; port < (UTP_PORT0 + 5); port++) {
rtk_stat_port_get(port, cntr_idx, &Cntr);
printk("%8llu", Cntr);
}
for (port = EXT_PORT0; port < (EXT_PORT0 + 2); port++) {
rtk_stat_port_get(port, cntr_idx, &Cntr);
printk("%8llu", Cntr);
}
printk("\n");
}
void rtk_hal_dump_mib(void)
{
printk("==================%8s%8s%8s%8s%8s%8s%8s\n", "Port0", "Port1",
"Port2", "Port3", "Port4", "Port16", "Port17");
/* Get TX Unicast Pkts */
printk("TX Unicast Pkts :");
rtk_dump_mib_type(STAT_IfOutUcastPkts);
/* Get TX Multicast Pkts */
printk("TX Multicast Pkts:");
rtk_dump_mib_type(STAT_IfOutMulticastPkts);
/* Get TX BroadCast Pkts */
printk("TX BroadCast Pkts:");
rtk_dump_mib_type(STAT_IfOutBroadcastPkts);
/* Get TX Collisions */
/* Get TX Puase Frames */
printk("TX Pause Frames :");
rtk_dump_mib_type(STAT_Dot3OutPauseFrames);
/* Get TX Drop Events */
/* Get RX Unicast Pkts */
printk("RX Unicast Pkts :");
rtk_dump_mib_type(STAT_IfInUcastPkts);
/* Get RX Multicast Pkts */
printk("RX Multicast Pkts:");
rtk_dump_mib_type(STAT_IfInMulticastPkts);
/* Get RX Broadcast Pkts */
printk("RX Broadcast Pkts:");
rtk_dump_mib_type(STAT_IfInBroadcastPkts);
/* Get RX FCS Erros */
printk("RX FCS Errors :");
rtk_dump_mib_type(STAT_Dot3StatsFCSErrors);
/* Get RX Undersize Pkts */
printk("RX Undersize Pkts:");
rtk_dump_mib_type(STAT_EtherStatsUnderSizePkts);
/* Get RX Discard Pkts */
printk("RX Discard Pkts :");
rtk_dump_mib_type(STAT_Dot1dTpPortInDiscards);
/* Get RX Fragments */
printk("RX Fragments :");
rtk_dump_mib_type(STAT_EtherStatsFragments);
/* Get RX Oversize Pkts */
printk("RX Oversize Pkts :");
rtk_dump_mib_type(STAT_EtherOversizeStats);
/* Get RX Jabbers */
printk("RX Jabbers :");
rtk_dump_mib_type(STAT_EtherStatsJabbers);
/* Get RX Pause Frames */
printk("RX Pause Frames :");
rtk_dump_mib_type(STAT_Dot3InPauseFrames);
/* clear MIB */
rtk_stat_global_reset();
}
EXPORT_SYMBOL(rtk_hal_dump_mib);
int rtk_hal_dump_vlan(void)
{
rtk_vlan_cfg_t vlan;
int i;
printk("vid portmap\n");
for (i = 0; i < RTK_SW_VID_RANGE; i++) {
rtk_vlan_get(i, &vlan);
printk("%3d ", i);
printk("%c",
RTK_PORTMASK_IS_PORT_SET(vlan.mbr,
UTP_PORT0) ? '1' : '-');
printk("%c",
RTK_PORTMASK_IS_PORT_SET(vlan.mbr,
UTP_PORT1) ? '1' : '-');
printk("%c",
RTK_PORTMASK_IS_PORT_SET(vlan.mbr,
UTP_PORT2) ? '1' : '-');
printk("%c",
RTK_PORTMASK_IS_PORT_SET(vlan.mbr,
UTP_PORT3) ? '1' : '-');
printk("%c",
RTK_PORTMASK_IS_PORT_SET(vlan.mbr,
UTP_PORT4) ? '1' : '-');
printk("%c",
RTK_PORTMASK_IS_PORT_SET(vlan.mbr,
EXT_PORT0) ? '1' : '-');
printk("%c",
RTK_PORTMASK_IS_PORT_SET(vlan.mbr,
EXT_PORT1) ? '1' : '-');
printk("\n");
}
return 0;
}
void rtk_hal_clear_vlan(void)
{
rtk_api_ret_t ret;
ret = rtk_vlan_reset();
if (ret != RT_ERR_OK)
printk("rtk_vlan_reset failed\n");
}
int rtk_hal_set_vlan(struct ra_switch_ioctl_data *data)
{
rtk_vlan_cfg_t vlan;
rtk_api_ret_t ret;
int i;
/* clear vlan entry first */
memset(&vlan, 0x00, sizeof(rtk_vlan_cfg_t));
RTK_PORTMASK_CLEAR(vlan.mbr);
RTK_PORTMASK_CLEAR(vlan.untag);
rtk_vlan_set(data->vid, &vlan);
memset(&vlan, 0x00, sizeof(rtk_vlan_cfg_t));
for (i = 0; i < 5; i++) {
if (data->port_map & (1 << i)) {
RTK_PORTMASK_PORT_SET(vlan.mbr, i);
RTK_PORTMASK_PORT_SET(vlan.untag, i);
rtk_vlan_portPvid_set(i, data->vid, 0);
}
}
for (i = 0; i < 2; i++) {
if (data->port_map & (1 << (i + 5))) {
RTK_PORTMASK_PORT_SET(vlan.mbr, (i + EXT_PORT0));
RTK_PORTMASK_PORT_SET(vlan.untag, (i + EXT_PORT0));
rtk_vlan_portPvid_set((i + EXT_PORT0), data->vid, 0);
}
}
vlan.ivl_en = 1;
ret = rtk_vlan_set(data->vid, &vlan);
return 0;
}
void rtk_hal_vlan_portpvid_set(rtk_port_t port, rtk_vlan_t pvid, rtk_pri_t priority)
{
rtk_vlan_portPvid_set(port, pvid, priority);
}
int rtk_hal_set_ingress_rate(struct ra_switch_ioctl_data *data)
{
rtk_api_ret_t ret;
if (data->on_off == 1)
ret =
rtk_rate_igrBandwidthCtrlRate_set(data->port, data->bw, 0,
1);
else
ret =
rtk_rate_igrBandwidthCtrlRate_set(data->port, 1048568, 0,
1);
return ret;
}
int rtk_hal_set_egress_rate(struct ra_switch_ioctl_data *data)
{
rtk_api_ret_t ret;
if (data->on_off == 1)
ret =
rtk_rate_egrBandwidthCtrlRate_set(data->port, data->bw, 1);
else
ret = rtk_rate_egrBandwidthCtrlRate_set(data->port, 1048568, 1);
return ret;
}
void rtk_hal_dump_table(void)
{
rtk_uint32 i;
rtk_uint32 address = 0;
rtk_l2_ucastAddr_t l2_data;
rtk_l2_ipMcastAddr_t ipMcastAddr;
printk("hash port(0:17) fid vid mac-address\n");
while (1) {
if (rtk_l2_addr_next_get(READMETHOD_NEXT_L2UC, UTP_PORT0, &address, &l2_data) != RT_ERR_OK) {
break;
} else {
printk("%03x ", l2_data.address);
for (i = 0; i < 5; i++)
if ( l2_data.port == i)
printk("1");
else
printk("-");
for (i = 16; i < 18; i++)
if ( l2_data.port == i)
printk("1");
else
printk("-");
printk(" %2d", l2_data.fid);
printk(" %4d", l2_data.cvid);
printk(" %02x%02x%02x%02x%02x%02x\n", l2_data.mac.octet[0],
l2_data.mac.octet[1], l2_data.mac.octet[2], l2_data.mac.octet[3],
l2_data.mac.octet[4], l2_data.mac.octet[5]);
address ++;
}
}
address = 0;
while (1) {
if (rtk_l2_ipMcastAddr_next_get(&address, &ipMcastAddr) != RT_ERR_OK) {
break;
} else {
printk("%03x ", ipMcastAddr.address);
for (i = 0; i < 5; i++)
printk("%c", RTK_PORTMASK_IS_PORT_SET(ipMcastAddr.portmask, i) ? '1' : '-');
for (i = 16; i < 18; i++)
printk("%c", RTK_PORTMASK_IS_PORT_SET(ipMcastAddr.portmask, i) ? '1' : '-');
printk(" ");
printk("01005E%06x\n", (ipMcastAddr.dip & 0xefffff));
address ++;
}
}
}
void rtk_hal_clear_table(void)
{
rtk_api_ret_t ret;
ret = rtk_l2_table_clear();
if (ret != RT_ERR_OK)
printk("rtk_l2_table_clear failed\n");
}
void rtk_hal_add_table(struct ra_switch_ioctl_data *data)
{
rtk_api_ret_t ret;
rtk_l2_ucastAddr_t l2_entry;
rtk_mac_t mac;
mac.octet[0] =data->mac[0];
mac.octet[1] =data->mac[1];
mac.octet[2] =data->mac[2];
mac.octet[3] =data->mac[3];
mac.octet[4] =data->mac[4];
mac.octet[5] =data->mac[5];
memset(&l2_entry, 0x00, sizeof(rtk_l2_ucastAddr_t));
l2_entry.port = data->port;
l2_entry.ivl = 1;
l2_entry.cvid = data->vid;
l2_entry.fid = 0;
l2_entry.efid = 0;
l2_entry.is_static = 1;
ret = rtk_l2_addr_add(&mac, &l2_entry);
if (ret != RT_ERR_OK)
printk("rtk_hal_add_table failed\n");
}
void rtk_hal_del_table(struct ra_switch_ioctl_data *data)
{
rtk_api_ret_t ret;
rtk_l2_ucastAddr_t l2_entry;
rtk_mac_t mac;
mac.octet[0] =data->mac[0];
mac.octet[1] =data->mac[1];
mac.octet[2] =data->mac[2];
mac.octet[3] =data->mac[3];
mac.octet[4] =data->mac[4];
mac.octet[5] =data->mac[5];
memset(&l2_entry, 0x00, sizeof(rtk_l2_ucastAddr_t));
l2_entry.port = data->port;
l2_entry.ivl = 1;
l2_entry.cvid = data->vid;
l2_entry.fid = 0;
l2_entry.efid = 0;
ret = rtk_l2_addr_del(&mac, &l2_entry);
if (ret != RT_ERR_OK)
printk("rtk_hal_add_table failed\n");
}
void rtk_hal_get_phy_status(struct ra_switch_ioctl_data *data)
{
rtk_port_linkStatus_t linkStatus;
rtk_port_speed_t speed;
rtk_port_duplex_t duplex;
rtk_port_phyStatus_get(data->port, &linkStatus, &speed, &duplex);
printk("Port%d Status:\n", data->port);
if (linkStatus == 1) {
printk("Link Up");
if (speed == 0)
printk(" 10M");
else if (speed == 1)
printk(" 100M");
else if (speed == 2)
printk(" 1000M");
if (duplex == 0)
printk(" Half Duplex\n");
else
printk(" Full Duplex\n");
} else
printk("Link Down\n");
}
void rtk_hal_set_port_mirror(struct ra_switch_ioctl_data *data)
{
rtk_portmask_t rx_portmask;
rtk_portmask_t tx_portmask;
rtk_api_ret_t ret;
int i;
rtk_mirror_portIso_set(ENABLED);
RTK_PORTMASK_CLEAR(rx_portmask);
RTK_PORTMASK_CLEAR(tx_portmask);
for (i = 0; i < 5; i++)
if (data->rx_port_map & (1 << i))
RTK_PORTMASK_PORT_SET(rx_portmask, i);
for (i = 0; i < 2; i++)
if (data->rx_port_map & (1 << (i + 5)))
RTK_PORTMASK_PORT_SET(rx_portmask, (i + EXT_PORT0));
RTK_PORTMASK_CLEAR(tx_portmask);
for (i = 0; i < 5; i++)
if (data->tx_port_map & (1 << i))
RTK_PORTMASK_PORT_SET(tx_portmask, i);
for (i = 0; i < 2; i++)
if (data->tx_port_map & (1 << (i + 5)))
RTK_PORTMASK_PORT_SET(tx_portmask, (i + EXT_PORT0));
ret = rtk_mirror_portBased_set(data->port, &rx_portmask, &tx_portmask);
if (!ret)
printk("rtk_mirror_portBased_set success\n");
}
void rtk_hal_read_reg(struct ra_switch_ioctl_data *data)
{
ret_t retVal;
retVal = smi_read(data->reg_addr, &data->reg_val);
if(retVal != RT_ERR_OK)
printk("switch reg read failed\n");
else
printk("reg0x%x = 0x%x\n", data->reg_addr, data->reg_val);
}
void rtk_hal_write_reg(struct ra_switch_ioctl_data *data)
{
ret_t retVal;
retVal = smi_write(data->reg_addr, data->reg_val);
if(retVal != RT_ERR_OK)
printk("switch reg write failed\n");
else
printk("write switch reg0x%x 0x%x success\n", data->reg_addr, data->reg_val);
}
void rtk_hal_get_phy_reg(struct ra_switch_ioctl_data *data)
{
ret_t retVal;
rtk_port_phy_data_t Data;
retVal = rtk_port_phyReg_get(data->port, data->reg_addr, &Data);
if (retVal == RT_ERR_OK)
printk("Get: phy[%d].reg[%d] = 0x%04x\n", data->port, data->reg_addr, Data);
else
printk("read phy reg failed\n");
}
void rtk_hal_set_phy_reg(struct ra_switch_ioctl_data *data)
{
ret_t retVal;
retVal = rtk_port_phyReg_set(data->port, data->reg_addr, data->reg_val);
if (retVal == RT_ERR_OK)
printk("Set: phy[%d].reg[%d] = 0x%04x\n", data->port, data->reg_addr, data->reg_val);
else
printk("write phy reg failed\n");
}
void rtk_hal_qos_en(struct ra_switch_ioctl_data *data)
{
if (data->on_off == 1) {
if (rtk_qos_init(8) != 0)
printk("rtk_qos_init(8) failed\n");
}
else {
if (rtk_qos_init(1) != 0)
printk("rtk_qos_init(1) failed\n");
}
}
void rtk_hal_qos_set_table2type(struct ra_switch_ioctl_data *data)
{
rtk_api_ret_t ret;
rtk_priority_select_t PriDec;
/* write all pri to 0 */
PriDec.port_pri = 0;
PriDec.dot1q_pri = 0;
PriDec.acl_pri = 0;
PriDec.cvlan_pri = 0;
PriDec.svlan_pri = 0;
PriDec.dscp_pri = 0;
PriDec.dmac_pri = 0;
PriDec.smac_pri = 0;
if (data->qos_type == 0)
PriDec.port_pri = 1;
else if (data->qos_type == 1)
PriDec.dot1q_pri = 1;
else if (data->qos_type == 2)
PriDec.acl_pri = 1;
else if (data->qos_type == 3)
PriDec.dscp_pri = 1;
else if (data->qos_type == 4)
PriDec.cvlan_pri = 1;
else if (data->qos_type == 5)
PriDec.svlan_pri = 1;
else if (data->qos_type == 6)
PriDec.dmac_pri = 1;
else if (data->qos_type == 7)
PriDec.smac_pri = 1;
if (data->qos_table_idx == 0)
ret = rtk_qos_priSel_set(PRIDECTBL_IDX0, &PriDec);
else
ret = rtk_qos_priSel_set(PRIDECTBL_IDX1, &PriDec);
if (ret != 0)
printk("rtk_qos_priSel_set failed\n");
}
void rtk_hal_qos_get_table2type(struct ra_switch_ioctl_data *data)
{
rtk_api_ret_t ret;
rtk_priority_select_t PriDec;
if (data->qos_table_idx == 0)
ret = rtk_qos_priSel_get(PRIDECTBL_IDX0, &PriDec);
else
ret = rtk_qos_priSel_get(PRIDECTBL_IDX1, &PriDec);
if (ret != 0)
printk("rtk_qos_priSel_set failed\n");
else {
printk("port_pri = %d\n", PriDec.port_pri);
printk("dot1q_pri = %d\n", PriDec.dot1q_pri);
printk("acl_pri = %d\n", PriDec.acl_pri);
printk("dscp_pri = %d\n", PriDec.dscp_pri);
printk("cvlan_pri = %d\n", PriDec.cvlan_pri);
printk("svlan_pri = %d\n", PriDec.svlan_pri);
printk("dmac_pri = %d\n", PriDec.dmac_pri);
printk("smac_pri = %d\n", PriDec.smac_pri);
}
}
void rtk_hal_qos_set_port2table(struct ra_switch_ioctl_data *data)
{
rtk_api_ret_t ret;
ret = rtk_qos_portPriSelIndex_set(data->port, data->qos_table_idx);
if (ret != 0)
printk("rtk_qos_portPriSelIndex_set failed\n");
}
void rtk_hal_qos_get_port2table(struct ra_switch_ioctl_data *data)
{
rtk_api_ret_t ret;
rtk_qos_priDecTbl_t Index;
ret = rtk_qos_portPriSelIndex_get(data->port, &Index);
if (ret != 0)
printk("rtk_qos_portPriSelIndex_set failed\n");
else
printk("port%d belongs to table%d\n", data->port, Index);
}
void rtk_hal_qos_set_port2pri(struct ra_switch_ioctl_data *data)
{
rtk_api_ret_t ret;
ret = rtk_qos_portPri_set(data->port, data->qos_pri);
if (ret != 0)
printk("rtk_qos_portPri_set failed\n");
}
void rtk_hal_qos_get_port2pri(struct ra_switch_ioctl_data *data)
{
rtk_api_ret_t ret;
rtk_pri_t Int_pri;
ret = rtk_qos_portPri_get(data->port, &Int_pri);
if (ret != 0)
printk("rtk_qos_portPri_set failed\n");
else
printk("port%d priority = %d\n", data->port, Int_pri);
}
void rtk_hal_qos_set_dscp2pri(struct ra_switch_ioctl_data *data)
{
rtk_api_ret_t ret;
ret = rtk_qos_dscpPriRemap_set(data->qos_dscp, data->qos_pri);
if (ret != 0)
printk("rtk_qos_dscpPriRemap_set failed\n");
}
void rtk_hal_qos_get_dscp2pri(struct ra_switch_ioctl_data *data)
{
rtk_api_ret_t ret;
rtk_pri_t Int_pri;
ret = rtk_qos_dscpPriRemap_get(data->qos_dscp, &Int_pri);
if (ret != 0)
printk("rtk_qos_dscpPriRemap_set failed\n");
else
printk("dscp%d priority is %d\n", data->qos_dscp, Int_pri);
}
void rtk_hal_qos_set_pri2queue(struct ra_switch_ioctl_data *data)
{
rtk_api_ret_t ret;
rtk_qos_pri2queue_t pri2qid;
ret = rtk_qos_priMap_get(8, &pri2qid);
pri2qid.pri2queue[data->qos_queue_num] = data->qos_pri;
ret = rtk_qos_priMap_set(8, &pri2qid);
if (ret != 0)
printk("rtk_qos_priMap_set failed\n");
}
void rtk_hal_qos_get_pri2queue(struct ra_switch_ioctl_data *data)
{
int i;
rtk_api_ret_t ret;
rtk_qos_pri2queue_t pri2qid;
ret = rtk_qos_priMap_get(8, &pri2qid);
if (ret != 0)
printk("rtk_qos_priMap_get failed\n");
else {
for (i = 0; i < 8; i++)
printk("pri2qid.pri2queue[%d] = %d\n", i, pri2qid.pri2queue[i]);
}
}
void rtk_hal_qos_set_queue_weight(struct ra_switch_ioctl_data *data)
{
rtk_api_ret_t ret;
rtk_qos_queue_weights_t qweights;
ret = rtk_qos_schedulingQueue_get(data->port, &qweights);
qweights.weights[data->qos_queue_num] = data->qos_weight;
ret = rtk_qos_schedulingQueue_set(data->port, &qweights);
if (ret != 0)
printk("rtk_qos_schedulingQueue_set failed\n");
}
void rtk_hal_qos_get_queue_weight(struct ra_switch_ioctl_data *data)
{
int i;
rtk_api_ret_t ret;
rtk_qos_queue_weights_t qweights;
ret = rtk_qos_schedulingQueue_get(data->port, &qweights);
if (ret != 0)
printk("rtk_qos_schedulingQueue_get failed\n");
else {
printk("=== Port%d queue weight ===\n", data->port);
for (i = 0; i < 8; i++)
printk("qweights.weights[%d] = %d\n",i ,qweights.weights[i]);
}
}
void rtk_hal_enable_igmpsnoop(struct ra_switch_ioctl_data *data)
{
rtk_api_ret_t ret;
rtk_portmask_t pmask;
ret = rtk_igmp_init();
if (data->on_off == 1) {
RTK_PORTMASK_CLEAR(pmask);
RTK_PORTMASK_PORT_SET(pmask, EXT_PORT0);
ret |= rtk_igmp_static_router_port_set(&pmask);
ret |= rtk_igmp_protocol_set(UTP_PORT4, PROTOCOL_IGMPv1, IGMP_ACTION_FORWARD);
ret |= rtk_igmp_protocol_set(UTP_PORT4, PROTOCOL_IGMPv2, IGMP_ACTION_FORWARD);
ret |= rtk_igmp_protocol_set(UTP_PORT4, PROTOCOL_MLDv1, IGMP_ACTION_FORWARD);
ret |= rtk_igmp_protocol_set(EXT_PORT1, PROTOCOL_IGMPv1, IGMP_ACTION_FORWARD);
ret |= rtk_igmp_protocol_set(EXT_PORT1, PROTOCOL_IGMPv2, IGMP_ACTION_FORWARD);
ret |= rtk_igmp_protocol_set(EXT_PORT1, PROTOCOL_MLDv1, IGMP_ACTION_FORWARD);
ret |= rtk_igmp_protocol_set(UTP_PORT0, PROTOCOL_IGMPv3, IGMP_ACTION_ASIC);
ret |= rtk_igmp_protocol_set(UTP_PORT1, PROTOCOL_IGMPv3, IGMP_ACTION_ASIC);
ret |= rtk_igmp_protocol_set(UTP_PORT2, PROTOCOL_IGMPv3, IGMP_ACTION_ASIC);
ret |= rtk_igmp_protocol_set(UTP_PORT3, PROTOCOL_IGMPv3, IGMP_ACTION_ASIC);
ret |= rtk_igmp_protocol_set(EXT_PORT0, PROTOCOL_IGMPv3, IGMP_ACTION_ASIC);
ret |= rtk_leaky_vlan_set(LEAKY_IPMULTICAST, ENABLED);
ret |= rtk_l2_ipMcastForwardRouterPort_set(DISABLED);
/* drop unknown multicast packets*/
/* ret |= rtk_trap_unknownMcastPktAction_set(UTP_PORT4, MCAST_IPV4, MCAST_ACTION_DROP);*/
} else {
RTK_PORTMASK_CLEAR(pmask);
RTK_PORTMASK_PORT_SET(pmask, EXT_PORT0);
RTK_PORTMASK_PORT_SET(pmask, EXT_PORT1);
ret |= rtk_igmp_protocol_set(UTP_PORT0, PROTOCOL_IGMPv3, IGMP_ACTION_ASIC);
ret |= rtk_igmp_protocol_set(UTP_PORT1, PROTOCOL_IGMPv3, IGMP_ACTION_ASIC);
ret |= rtk_igmp_protocol_set(UTP_PORT2, PROTOCOL_IGMPv3, IGMP_ACTION_ASIC);
ret |= rtk_igmp_protocol_set(UTP_PORT3, PROTOCOL_IGMPv3, IGMP_ACTION_ASIC);
ret |= rtk_igmp_protocol_set(EXT_PORT0, PROTOCOL_IGMPv3, IGMP_ACTION_ASIC);
ret |= rtk_igmp_static_router_port_set(&pmask);
}
if(ret != RT_ERR_OK)
printk("enable switch igmpsnoop failed\n");
}
void rtk_hal_disable_igmpsnoop(void)
{
if (rtk_igmp_state_set(DISABLED) != RT_ERR_OK)
printk("Disable IGMP SNOOPING failed\n");
}
rtk_api_ret_t rtk_port_phyTestMode_set(rtk_port_t port, rtk_port_phy_test_mode_t mode)
{
rtk_uint32 data, regData, i;
rtk_api_ret_t retVal;
RTK_CHK_PORT_IS_UTP(port);
if(mode >= PHY_TEST_MODE_END)
return RT_ERR_INPUT;
if( (mode == PHY_TEST_MODE_2) || (mode == PHY_TEST_MODE_3) )
return RT_ERR_INPUT;
if (PHY_TEST_MODE_NORMAL != mode)
{
/* Other port should be Normal mode */
RTK_SCAN_ALL_LOG_PORT(i)
{
if(rtk_switch_isUtpPort(i) == RT_ERR_OK)
{
if(i != port)
{
if ((retVal = rtl8367c_getAsicPHYReg(rtk_switch_port_L2P_get(i), 9, &data)) != RT_ERR_OK)
return retVal;
if((data & 0xE000) != 0)
return RT_ERR_NOT_ALLOWED;
}
}
}
}
if ((retVal = rtl8367c_getAsicPHYReg(rtk_switch_port_L2P_get(port), 9, &data)) != RT_ERR_OK)
return retVal;
data &= ~0xE000;
data |= (mode << 13);
if ((retVal = rtl8367c_setAsicPHYReg(rtk_switch_port_L2P_get(port), 9, data)) != RT_ERR_OK)
return retVal;
if (PHY_TEST_MODE_4 == mode)
{
if((retVal = rtl8367c_setAsicReg(0x13C2, 0x0249)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicReg(0x1300, &regData)) != RT_ERR_OK)
return retVal;
if( (regData == 0x0276) || (regData == 0x0597) )
{
if ((retVal = rtl8367c_setAsicPHYOCPReg(rtk_switch_port_L2P_get(port), 0xbcc2, 0xF4F4)) != RT_ERR_OK)
return retVal;
}
if( (regData == 0x6367) )
{
if ((retVal = rtl8367c_setAsicPHYOCPReg(rtk_switch_port_L2P_get(port), 0xa436, 0x80c1)) != RT_ERR_OK)
return retVal;
if ((retVal = rtl8367c_setAsicPHYOCPReg(rtk_switch_port_L2P_get(port), 0xa438, 0xfe00)) != RT_ERR_OK)
return retVal;
}
}
return RT_ERR_OK;
}
void rtk_hal_set_phy_test_mode(struct ra_switch_ioctl_data *data)
{
rtk_api_ret_t ret;
ret = rtk_port_phyTestMode_set(data->port, data->mode);
if (ret != RT_ERR_OK)
printk("rtk_port_phyTestMode_set failed\n");
else
printk("set port%d in test mode %d.\n", data->port, data->mode);
}
void rtk_hal_set_port_trunk(struct ra_switch_ioctl_data *data)
{
rtk_api_ret_t ret;
rtk_portmask_t member;
int i;
RTK_PORTMASK_CLEAR(member);
for (i = 0; i < 4; i++) {
if (data->port_map & (1 << i))
RTK_PORTMASK_PORT_SET(member, i);
}
ret = rtk_trunk_port_set(TRUNK_GROUP0, &member);
if (ret != RT_ERR_OK)
printk("rtk_trunk_port_set failed\n");
ret = rtk_trunk_distributionAlgorithm_set(RTK_WHOLE_SYSTEM, 0x7F);
if (ret != RT_ERR_OK)
printk("rtk_trunk_distributionAlgorithm_set failed\n");
}
void rtk_hal_vlan_tag(struct ra_switch_ioctl_data *data)
{
rtk_api_ret_t ret;
rtk_vlan_cfg_t vlan;
ret = rtk_vlan_get(data->vid, &vlan);
if (ret != RT_ERR_OK)
printk("rtk_vlan_get failed\n");
else {
if (data->on_off == 0)
RTK_PORTMASK_PORT_SET(vlan.untag, data->port);
else
RTK_PORTMASK_PORT_CLEAR(vlan.untag, data->port);
ret = rtk_vlan_set(data->vid, &vlan);
if (ret != RT_ERR_OK)
printk("rtk_vlan_set failed\n");
}
}
void rtk_hal_vlan_mode(struct ra_switch_ioctl_data *data)
{
rtk_vlan_cfg_t vlan1, vlan2;
rtk_api_ret_t ret;
ret = rtk_vlan_get(1, &vlan1);
if (ret != RT_ERR_OK)
printk("rtk_vlan_get failed\n");
ret = rtk_vlan_get(2, &vlan2);
if (ret != RT_ERR_OK)
printk("rtk_vlan_get failed\n");
if (data->mode == 0) { //ivl
vlan1.ivl_en = 1;
vlan1.fid_msti = 0;
rtk_vlan_set(1, &vlan1);
vlan2.ivl_en = 1;
vlan2.fid_msti = 0;
rtk_vlan_set(2, &vlan2);
} else if(data->mode == 1) {//svl
vlan1.ivl_en = 0;
vlan1.fid_msti = 0;
rtk_vlan_set(1, &vlan1);
vlan2.ivl_en = 0;
vlan2.fid_msti = 1;
rtk_vlan_set(2, &vlan2);
} else
printk("mode not supported\n");
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,639 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (, 08 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature :
*
*/
#include <rtl8367c_asicdrv.h>
#if defined(RTK_X86_ASICDRV)
#include <I2Clib.h>
#else
#include <smi.h>
#endif
/*for driver verify testing only*/
#ifdef CONFIG_RTL8367C_ASICDRV_TEST
#define CLE_VIRTUAL_REG_SIZE 0x10000
rtk_uint16 CleVirtualReg[CLE_VIRTUAL_REG_SIZE];
#endif
#if defined(CONFIG_RTL865X_CLE) || defined (RTK_X86_CLE)
rtk_uint32 cleDebuggingDisplay;
#endif
#ifdef EMBEDDED_SUPPORT
extern void setReg(rtk_uint16, rtk_uint16);
extern rtk_uint16 getReg(rtk_uint16);
#endif
/* Function Name:
* rtl8367c_setAsicRegBit
* Description:
* Set a bit value of a specified register
* Input:
* reg - register's address
* bit - bit location
* value - value to set. It can be value 0 or 1.
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameter
* Note:
* Set a bit of a specified register to 1 or 0.
*/
ret_t rtl8367c_setAsicRegBit(rtk_uint32 reg, rtk_uint32 bit, rtk_uint32 value)
{
#if defined(RTK_X86_ASICDRV)
rtk_uint32 regData;
ret_t retVal;
if(bit >= RTL8367C_REGBITLENGTH)
return RT_ERR_INPUT;
retVal = Access_Read(reg, 2, &regData);
if(TRUE != retVal)
return RT_ERR_SMI;
if(0x8367B == cleDebuggingDisplay)
PRINT("R[0x%4.4x]=0x%4.4x\n", reg, regData);
if(value)
regData = regData | (1 << bit);
else
regData = regData & (~(1 << bit));
retVal = Access_Write(reg,2, regData);
if(TRUE != retVal)
return RT_ERR_SMI;
if(0x8367B == cleDebuggingDisplay)
PRINT("W[0x%4.4x]=0x%4.4x\n", reg, regData);
#elif defined(CONFIG_RTL8367C_ASICDRV_TEST)
if(bit >= RTL8367C_REGBITLENGTH)
return RT_ERR_INPUT;
else if(reg >= CLE_VIRTUAL_REG_SIZE)
return RT_ERR_OUT_OF_RANGE;
if(value)
{
CleVirtualReg[reg] = CleVirtualReg[reg] | (1 << bit);
}
else
{
CleVirtualReg[reg] = CleVirtualReg[reg] & (~(1 << bit));
}
if(0x8367B == cleDebuggingDisplay)
PRINT("W[0x%4.4x]=0x%4.4x\n", reg, CleVirtualReg[reg]);
#elif defined(EMBEDDED_SUPPORT)
rtk_uint16 tmp;
if(reg > RTL8367C_REGDATAMAX || value > 1)
return RT_ERR_INPUT;
tmp = getReg(reg);
tmp &= (1 << bitIdx);
tmp |= (value << bitIdx);
setReg(reg, tmp);
#else
rtk_uint32 regData;
ret_t retVal;
if(bit >= RTL8367C_REGBITLENGTH)
return RT_ERR_INPUT;
retVal = smi_read(reg, &regData);
if(retVal != RT_ERR_OK)
return RT_ERR_SMI;
#ifdef CONFIG_RTL865X_CLE
if(0x8367B == cleDebuggingDisplay)
PRINT("R[0x%4.4x]=0x%4.4x\n", reg, regData);
#endif
if(value)
regData = regData | (1 << bit);
else
regData = regData & (~(1 << bit));
retVal = smi_write(reg, regData);
if(retVal != RT_ERR_OK)
return RT_ERR_SMI;
#ifdef CONFIG_RTL865X_CLE
if(0x8367B == cleDebuggingDisplay)
PRINT("W[0x%4.4x]=0x%4.4x\n", reg, regData);
#endif
#endif
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_getAsicRegBit
* Description:
* Get a bit value of a specified register
* Input:
* reg - register's address
* bit - bit location
* value - value to get.
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameter
* Note:
* None
*/
ret_t rtl8367c_getAsicRegBit(rtk_uint32 reg, rtk_uint32 bit, rtk_uint32 *pValue)
{
#if defined(RTK_X86_ASICDRV)
rtk_uint32 regData;
ret_t retVal;
if(bit >= RTL8367C_REGBITLENGTH)
return RT_ERR_INPUT;
retVal = Access_Read(reg, 2, &regData);
if(TRUE != retVal)
return RT_ERR_SMI;
*pValue = (regData & (0x1 << bit)) >> bit;
if(0x8367B == cleDebuggingDisplay)
PRINT("R[0x%4.4x]=0x%4.4x\n", reg, regData);
#elif defined(CONFIG_RTL8367C_ASICDRV_TEST)
if(bit >= RTL8367C_REGBITLENGTH)
return RT_ERR_INPUT;
if(reg >= CLE_VIRTUAL_REG_SIZE)
return RT_ERR_OUT_OF_RANGE;
*pValue = (CleVirtualReg[reg] & (0x1 << bit)) >> bit;
if(0x8367B == cleDebuggingDisplay)
PRINT("R[0x%4.4x]=0x%4.4x\n", reg, CleVirtualReg[reg]);
#elif defined(EMBEDDED_SUPPORT)
rtk_uint16 tmp;
if(reg > RTL8367C_REGDATAMAX )
return RT_ERR_INPUT;
tmp = getReg(reg);
tmp = tmp >> bitIdx;
tmp &= 1;
*value = tmp;
#else
rtk_uint32 regData;
ret_t retVal;
retVal = smi_read(reg, &regData);
if(retVal != RT_ERR_OK)
return RT_ERR_SMI;
#ifdef CONFIG_RTL865X_CLE
if(0x8367B == cleDebuggingDisplay)
PRINT("R[0x%4.4x]=0x%4.4x\n", reg, regData);
#endif
*pValue = (regData & (0x1 << bit)) >> bit;
#endif
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_setAsicRegBits
* Description:
* Set bits value of a specified register
* Input:
* reg - register's address
* bits - bits mask for setting
* value - bits value for setting
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameter
* Note:
* Set bits of a specified register to value. Both bits and value are be treated as bit-mask
*/
ret_t rtl8367c_setAsicRegBits(rtk_uint32 reg, rtk_uint32 bits, rtk_uint32 value)
{
#if defined(RTK_X86_ASICDRV)
rtk_uint32 regData;
ret_t retVal;
rtk_uint32 bitsShift;
rtk_uint32 valueShifted;
if(bits >= (1 << RTL8367C_REGBITLENGTH) )
return RT_ERR_INPUT;
bitsShift = 0;
while(!(bits & (1 << bitsShift)))
{
bitsShift++;
if(bitsShift >= RTL8367C_REGBITLENGTH)
return RT_ERR_INPUT;
}
valueShifted = value << bitsShift;
if(valueShifted > RTL8367C_REGDATAMAX)
return RT_ERR_INPUT;
retVal = Access_Read(reg, 2, &regData);
if(TRUE != retVal)
return RT_ERR_SMI;
if(0x8367B == cleDebuggingDisplay)
PRINT("R[0x%4.4x]=0x%4.4x\n", reg, regData);
regData = regData & (~bits);
regData = regData | (valueShifted & bits);
retVal = Access_Write(reg,2, regData);
if(TRUE != retVal)
return RT_ERR_SMI;
if(0x8367B == cleDebuggingDisplay)
PRINT("W[0x%4.4x]=0x%4.4x\n", reg, regData);
#elif defined(CONFIG_RTL8367C_ASICDRV_TEST)
rtk_uint32 regData;
rtk_uint32 bitsShift;
rtk_uint32 valueShifted;
if(bits >= (1 << RTL8367C_REGBITLENGTH) )
return RT_ERR_INPUT;
bitsShift = 0;
while(!(bits & (1 << bitsShift)))
{
bitsShift++;
if(bitsShift >= RTL8367C_REGBITLENGTH)
return RT_ERR_INPUT;
}
valueShifted = value << bitsShift;
if(valueShifted > RTL8367C_REGDATAMAX)
return RT_ERR_INPUT;
if(reg >= CLE_VIRTUAL_REG_SIZE)
return RT_ERR_OUT_OF_RANGE;
regData = CleVirtualReg[reg] & (~bits);
regData = regData | (valueShifted & bits);
CleVirtualReg[reg] = regData;
if(0x8367B == cleDebuggingDisplay)
PRINT("W[0x%4.4x]=0x%4.4x\n", reg, regData);
#elif defined(EMBEDDED_SUPPORT)
rtk_uint32 regData;
rtk_uint32 bitsShift;
rtk_uint32 valueShifted;
if(reg > RTL8367C_REGDATAMAX )
return RT_ERR_INPUT;
if(bits >= (1 << RTL8367C_REGBITLENGTH) )
return RT_ERR_INPUT;
bitsShift = 0;
while(!(bits & (1 << bitsShift)))
{
bitsShift++;
if(bitsShift >= RTL8367C_REGBITLENGTH)
return RT_ERR_INPUT;
}
valueShifted = value << bitsShift;
if(valueShifted > RTL8367C_REGDATAMAX)
return RT_ERR_INPUT;
regData = getReg(reg);
regData = regData & (~bits);
regData = regData | (valueShifted & bits);
setReg(reg, regData);
#else
rtk_uint32 regData;
ret_t retVal;
rtk_uint32 bitsShift;
rtk_uint32 valueShifted;
if(bits >= (1 << RTL8367C_REGBITLENGTH) )
return RT_ERR_INPUT;
bitsShift = 0;
while(!(bits & (1 << bitsShift)))
{
bitsShift++;
if(bitsShift >= RTL8367C_REGBITLENGTH)
return RT_ERR_INPUT;
}
valueShifted = value << bitsShift;
if(valueShifted > RTL8367C_REGDATAMAX)
return RT_ERR_INPUT;
retVal = smi_read(reg, &regData);
if(retVal != RT_ERR_OK)
return RT_ERR_SMI;
#ifdef CONFIG_RTL865X_CLE
if(0x8367B == cleDebuggingDisplay)
PRINT("R[0x%4.4x]=0x%4.4x\n", reg, regData);
#endif
regData = regData & (~bits);
regData = regData | (valueShifted & bits);
retVal = smi_write(reg, regData);
if(retVal != RT_ERR_OK)
return RT_ERR_SMI;
#ifdef CONFIG_RTL865X_CLE
if(0x8367B == cleDebuggingDisplay)
PRINT("W[0x%4.4x]=0x%4.4x\n", reg, regData);
#endif
#endif
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_getAsicRegBits
* Description:
* Get bits value of a specified register
* Input:
* reg - register's address
* bits - bits mask for setting
* value - bits value for setting
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameter
* Note:
* None
*/
ret_t rtl8367c_getAsicRegBits(rtk_uint32 reg, rtk_uint32 bits, rtk_uint32 *pValue)
{
#if defined(RTK_X86_ASICDRV)
rtk_uint32 regData;
ret_t retVal;
rtk_uint32 bitsShift;
if(bits >= (1 << RTL8367C_REGBITLENGTH) )
return RT_ERR_INPUT;
bitsShift = 0;
while(!(bits & (1 << bitsShift)))
{
bitsShift++;
if(bitsShift >= RTL8367C_REGBITLENGTH)
return RT_ERR_INPUT;
}
retVal = Access_Read(reg, 2, &regData);
if(TRUE != retVal)
return RT_ERR_SMI;
*pValue = (regData & bits) >> bitsShift;
if(0x8367B == cleDebuggingDisplay)
PRINT("R[0x%4.4x]=0x%4.4x\n", reg, regData);
#elif defined(CONFIG_RTL8367C_ASICDRV_TEST)
rtk_uint32 bitsShift;
if(bits >= (1 << RTL8367C_REGBITLENGTH) )
return RT_ERR_INPUT;
bitsShift = 0;
while(!(bits & (1 << bitsShift)))
{
bitsShift++;
if(bitsShift >= RTL8367C_REGBITLENGTH)
return RT_ERR_INPUT;
}
if(reg >= CLE_VIRTUAL_REG_SIZE)
return RT_ERR_OUT_OF_RANGE;
*pValue = (CleVirtualReg[reg] & bits) >> bitsShift;
if(0x8367B == cleDebuggingDisplay)
PRINT("R[0x%4.4x]=0x%4.4x\n", reg, CleVirtualReg[reg]);
#elif defined(EMBEDDED_SUPPORT)
rtk_uint32 regData;
rtk_uint32 bitsShift;
if(reg > RTL8367C_REGDATAMAX )
return RT_ERR_INPUT;
if(bits >= (1UL << RTL8367C_REGBITLENGTH) )
return RT_ERR_INPUT;
bitsShift = 0;
while(!(bits & (1UL << bitsShift)))
{
bitsShift++;
if(bitsShift >= RTL8367C_REGBITLENGTH)
return RT_ERR_INPUT;
}
regData = getReg(reg);
*value = (regData & bits) >> bitsShift;
#else
rtk_uint32 regData;
ret_t retVal;
rtk_uint32 bitsShift;
if(bits>= (1<<RTL8367C_REGBITLENGTH) )
return RT_ERR_INPUT;
bitsShift = 0;
while(!(bits & (1 << bitsShift)))
{
bitsShift++;
if(bitsShift >= RTL8367C_REGBITLENGTH)
return RT_ERR_INPUT;
}
retVal = smi_read(reg, &regData);
if(retVal != RT_ERR_OK) return RT_ERR_SMI;
*pValue = (regData & bits) >> bitsShift;
#ifdef CONFIG_RTL865X_CLE
if(0x8367B == cleDebuggingDisplay)
PRINT("R[0x%4.4x]=0x%4.4x\n",reg, regData);
#endif
#endif
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_setAsicReg
* Description:
* Set content of asic register
* Input:
* reg - register's address
* value - Value setting to register
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* The value will be set to ASIC mapping address only and it is always return RT_ERR_OK while setting un-mapping address registers
*/
ret_t rtl8367c_setAsicReg(rtk_uint32 reg, rtk_uint32 value)
{
#if defined(RTK_X86_ASICDRV)/*RTK-CNSD2-NickWu-20061222: for x86 compile*/
ret_t retVal;
retVal = Access_Write(reg,2,value);
if(TRUE != retVal) return RT_ERR_SMI;
if(0x8367B == cleDebuggingDisplay)
PRINT("W[0x%4.4x]=0x%4.4x\n",reg,value);
#elif defined(CONFIG_RTL8367C_ASICDRV_TEST)
/*MIBs emulating*/
if(reg == RTL8367C_REG_MIB_ADDRESS)
{
CleVirtualReg[RTL8367C_MIB_COUNTER_BASE_REG] = 0x1;
CleVirtualReg[RTL8367C_MIB_COUNTER_BASE_REG+1] = 0x2;
CleVirtualReg[RTL8367C_MIB_COUNTER_BASE_REG+2] = 0x3;
CleVirtualReg[RTL8367C_MIB_COUNTER_BASE_REG+3] = 0x4;
}
if(reg >= CLE_VIRTUAL_REG_SIZE)
return RT_ERR_OUT_OF_RANGE;
CleVirtualReg[reg] = value;
if(0x8367B == cleDebuggingDisplay)
PRINT("W[0x%4.4x]=0x%4.4x\n",reg,CleVirtualReg[reg]);
#elif defined(EMBEDDED_SUPPORT)
if(reg > RTL8367C_REGDATAMAX || value > RTL8367C_REGDATAMAX )
return RT_ERR_INPUT;
setReg(reg, value);
#else
ret_t retVal;
retVal = smi_write(reg, value);
if(retVal != RT_ERR_OK)
return RT_ERR_SMI;
#ifdef CONFIG_RTL865X_CLE
if(0x8367B == cleDebuggingDisplay)
PRINT("W[0x%4.4x]=0x%4.4x\n",reg,value);
#endif
#endif
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_getAsicReg
* Description:
* Get content of asic register
* Input:
* reg - register's address
* value - Value setting to register
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* Value 0x0000 will be returned for ASIC un-mapping address
*/
ret_t rtl8367c_getAsicReg(rtk_uint32 reg, rtk_uint32 *pValue)
{
#if defined(RTK_X86_ASICDRV)
rtk_uint32 regData;
ret_t retVal;
retVal = Access_Read(reg, 2, &regData);
if(TRUE != retVal)
return RT_ERR_SMI;
*pValue = regData;
if(0x8367B == cleDebuggingDisplay)
PRINT("R[0x%4.4x]=0x%4.4x\n", reg, regData);
#elif defined(CONFIG_RTL8367C_ASICDRV_TEST)
if(reg >= CLE_VIRTUAL_REG_SIZE)
return RT_ERR_OUT_OF_RANGE;
*pValue = CleVirtualReg[reg];
if(0x8367B == cleDebuggingDisplay)
PRINT("R[0x%4.4x]=0x%4.4x\n", reg, CleVirtualReg[reg]);
#elif defined(EMBEDDED_SUPPORT)
if(reg > RTL8367C_REGDATAMAX )
return RT_ERR_INPUT;
*value = getReg(reg);
#else
rtk_uint32 regData;
ret_t retVal;
retVal = smi_read(reg, &regData);
if(retVal != RT_ERR_OK)
return RT_ERR_SMI;
*pValue = regData;
#ifdef CONFIG_RTL865X_CLE
if(0x8367B == cleDebuggingDisplay)
PRINT("R[0x%4.4x]=0x%4.4x\n", reg, regData);
#endif
#endif
return RT_ERR_OK;
}

View file

@ -0,0 +1,369 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (, 08 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : Proprietary CPU-tag related function drivers
*
*/
#include <rtl8367c_asicdrv_cputag.h>
/* Function Name:
* rtl8367c_setAsicCputagEnable
* Description:
* Set cpu tag function enable/disable
* Input:
* enabled - 1: enabled, 0: disabled
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_ENABLE - Invalid enable/disable input
* Note:
* If CPU tag function is disabled, CPU tag will not be added to frame
* forwarded to CPU port, and all ports cannot parse CPU tag.
*/
ret_t rtl8367c_setAsicCputagEnable(rtk_uint32 enabled)
{
if(enabled > 1)
return RT_ERR_ENABLE;
return rtl8367c_setAsicRegBit(RTL8367C_REG_CPU_CTRL, RTL8367C_CPU_EN_OFFSET, enabled);
}
/* Function Name:
* rtl8367c_getAsicCputagEnable
* Description:
* Get cpu tag function enable/disable
* Input:
* pEnabled - 1: enabled, 0: disabled
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_getAsicCputagEnable(rtk_uint32 *pEnabled)
{
return rtl8367c_getAsicRegBit(RTL8367C_REG_CPU_CTRL, RTL8367C_CPU_EN_OFFSET, pEnabled);
}
/* Function Name:
* rtl8367c_setAsicCputagTrapPort
* Description:
* Set cpu tag trap port
* Input:
* port - port number
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* Note:
* API can set destination port of trapping frame
*/
ret_t rtl8367c_setAsicCputagTrapPort(rtk_uint32 port)
{
ret_t retVal;
if(port >= RTL8367C_PORTNO)
return RT_ERR_PORT_ID;
retVal = rtl8367c_setAsicRegBits(RTL8367C_REG_CPU_CTRL, RTL8367C_CPU_TRAP_PORT_MASK, port & 7);
if(retVal != RT_ERR_OK)
return retVal;
retVal = rtl8367c_setAsicRegBits(RTL8367C_REG_CPU_CTRL, RTL8367C_CPU_TRAP_PORT_EXT_MASK, (port>>3) & 1);
if(retVal != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_getAsicCputagTrapPort
* Description:
* Get cpu tag trap port
* Input:
* pPort - port number
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_getAsicCputagTrapPort(rtk_uint32 *pPort)
{
ret_t retVal;
rtk_uint32 tmpPort;
retVal = rtl8367c_getAsicRegBits(RTL8367C_REG_CPU_CTRL, RTL8367C_CPU_TRAP_PORT_MASK, &tmpPort);
if(retVal != RT_ERR_OK)
return retVal;
*pPort = tmpPort;
retVal = rtl8367c_getAsicRegBits(RTL8367C_REG_CPU_CTRL, RTL8367C_CPU_TRAP_PORT_EXT_MASK, &tmpPort);
if(retVal != RT_ERR_OK)
return retVal;
*pPort |= (tmpPort & 1) << 3;
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_setAsicCputagPortmask
* Description:
* Set ports that can parse CPU tag
* Input:
* portmask - port mask
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_MASK - Invalid portmask
* Note:
* None
*/
ret_t rtl8367c_setAsicCputagPortmask(rtk_uint32 portmask)
{
if(portmask > RTL8367C_PORTMASK)
return RT_ERR_PORT_MASK;
return rtl8367c_setAsicReg(RTL8367C_CPU_PORT_MASK_REG, portmask);
}
/* Function Name:
* rtl8367c_getAsicCputagPortmask
* Description:
* Get ports that can parse CPU tag
* Input:
* pPortmask - port mask
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_getAsicCputagPortmask(rtk_uint32 *pPortmask)
{
return rtl8367c_getAsicReg(RTL8367C_CPU_PORT_MASK_REG, pPortmask);
}
/* Function Name:
* rtl8367c_setAsicCputagInsertMode
* Description:
* Set CPU-tag insert mode
* Input:
* mode - 0: insert to all packets; 1: insert to trapped packets; 2: don't insert
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_NOT_ALLOWED - Actions not allowed by the function
* Note:
* None
*/
ret_t rtl8367c_setAsicCputagInsertMode(rtk_uint32 mode)
{
if(mode >= CPUTAG_INSERT_END)
return RT_ERR_NOT_ALLOWED;
return rtl8367c_setAsicRegBits(RTL8367C_REG_CPU_CTRL, RTL8367C_CPU_INSERTMODE_MASK, mode);
}
/* Function Name:
* rtl8367c_getAsicCputagInsertMode
* Description:
* Get CPU-tag insert mode
* Input:
* pMode - 0: insert to all packets; 1: insert to trapped packets; 2: don't insert
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_getAsicCputagInsertMode(rtk_uint32 *pMode)
{
return rtl8367c_getAsicRegBits(RTL8367C_REG_CPU_CTRL, RTL8367C_CPU_INSERTMODE_MASK, pMode);
}
/* Function Name:
* rtl8367c_setAsicCputagPriorityRemapping
* Description:
* Set queue assignment of CPU port
* Input:
* srcPri - internal priority (0~7)
* newPri - internal priority after remapping (0~7)
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_QOS_INT_PRIORITY - Invalid priority
* Note:
* None
*/
ret_t rtl8367c_setAsicCputagPriorityRemapping(rtk_uint32 srcPri, rtk_uint32 newPri)
{
if((srcPri > RTL8367C_PRIMAX) || (newPri > RTL8367C_PRIMAX))
return RT_ERR_QOS_INT_PRIORITY;
return rtl8367c_setAsicRegBits(RTL8367C_QOS_PRIPORITY_REMAPPING_IN_CPU_REG(srcPri), RTL8367C_QOS_PRIPORITY_REMAPPING_IN_CPU_MASK(srcPri), newPri);
}
/* Function Name:
* rtl8367c_getAsicCputagPriorityRemapping
* Description:
* Get queue assignment of CPU port
* Input:
* srcPri - internal priority (0~7)
* pNewPri - internal priority after remapping (0~7)
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_QOS_INT_PRIORITY - Invalid priority
* Note:
* None
*/
ret_t rtl8367c_getAsicCputagPriorityRemapping(rtk_uint32 srcPri, rtk_uint32 *pNewPri)
{
if(srcPri > RTL8367C_PRIMAX)
return RT_ERR_QOS_INT_PRIORITY;
return rtl8367c_getAsicRegBits(RTL8367C_QOS_PRIPORITY_REMAPPING_IN_CPU_REG(srcPri), RTL8367C_QOS_PRIPORITY_REMAPPING_IN_CPU_MASK(srcPri), pNewPri);
}
/* Function Name:
* rtl8367c_setAsicCputagPosition
* Description:
* Set cpu tag insert position
* Input:
* postion - 1: After entire packet(before CRC field), 0: After MAC_SA (Default)
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_setAsicCputagPosition(rtk_uint32 postion)
{
return rtl8367c_setAsicRegBit(RTL8367C_REG_CPU_CTRL, RTL8367C_CPU_TAG_POSITION_OFFSET, postion);
}
/* Function Name:
* rtl8367c_getAsicCputagPosition
* Description:
* Get cpu tag insert position
* Input:
* pPostion - 1: After entire packet(before CRC field), 0: After MAC_SA (Default)
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_getAsicCputagPosition(rtk_uint32* pPostion)
{
return rtl8367c_getAsicRegBit(RTL8367C_REG_CPU_CTRL, RTL8367C_CPU_TAG_POSITION_OFFSET, pPostion);
}
/* Function Name:
* rtl8367c_setAsicCputagMode
* Description:
* Set cpu tag mode
* Input:
* mode - 1: 4bytes mode, 0: 8bytes mode
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters
* Note:
* If CPU tag function is disabled, CPU tag will not be added to frame
* forwarded to CPU port, and all ports cannot parse CPU tag.
*/
ret_t rtl8367c_setAsicCputagMode(rtk_uint32 mode)
{
if(mode > 1)
return RT_ERR_INPUT;
return rtl8367c_setAsicRegBit(RTL8367C_REG_CPU_CTRL, RTL8367C_CPU_TAG_FORMAT_OFFSET, mode);
}
/* Function Name:
* rtl8367c_getAsicCputagMode
* Description:
* Get cpu tag mode
* Input:
* pMode - 1: 4bytes mode, 0: 8bytes mode
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_getAsicCputagMode(rtk_uint32 *pMode)
{
return rtl8367c_getAsicRegBit(RTL8367C_REG_CPU_CTRL, RTL8367C_CPU_TAG_FORMAT_OFFSET, pMode);
}
/* Function Name:
* rtl8367c_setAsicCputagRxMinLength
* Description:
* Set cpu tag mode
* Input:
* mode - 1: 64bytes, 0: 72bytes
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_INPUT - Invalid input parameters
* Note:
* If CPU tag function is disabled, CPU tag will not be added to frame
* forwarded to CPU port, and all ports cannot parse CPU tag.
*/
ret_t rtl8367c_setAsicCputagRxMinLength(rtk_uint32 mode)
{
if(mode > 1)
return RT_ERR_INPUT;
return rtl8367c_setAsicRegBit(RTL8367C_REG_CPU_CTRL, RTL8367C_CPU_TAG_RXBYTECOUNT_OFFSET, mode);
}
/* Function Name:
* rtl8367c_getAsicCputagRxMinLength
* Description:
* Get cpu tag mode
* Input:
* pMode - 1: 64bytes, 0: 72bytes
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_getAsicCputagRxMinLength(rtk_uint32 *pMode)
{
return rtl8367c_getAsicRegBit(RTL8367C_REG_CPU_CTRL, RTL8367C_CPU_TAG_RXBYTECOUNT_OFFSET, pMode);
}

View file

@ -0,0 +1,415 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (, 08 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : 802.1X related functions
*
*/
#include <rtl8367c_asicdrv_dot1x.h>
/* Function Name:
* rtl8367c_setAsic1xPBEnConfig
* Description:
* Set 802.1x port-based port enable configuration
* Input:
* port - Physical port number (0~7)
* enabled - 1: enabled, 0: disabled
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* Note:
* None
*/
ret_t rtl8367c_setAsic1xPBEnConfig(rtk_uint32 port, rtk_uint32 enabled)
{
if(port >= RTL8367C_PORTNO)
return RT_ERR_PORT_ID;
return rtl8367c_setAsicRegBit(RTL8367C_DOT1X_PORT_ENABLE_REG, port, enabled);
}
/* Function Name:
* rtl8367c_getAsic1xPBEnConfig
* Description:
* Get 802.1x port-based port enable configuration
* Input:
* port - Physical port number (0~7)
* pEnabled - 1: enabled, 0: disabled
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* Note:
* None
*/
ret_t rtl8367c_getAsic1xPBEnConfig(rtk_uint32 port, rtk_uint32 *pEnabled)
{
if(port >= RTL8367C_PORTNO)
return RT_ERR_PORT_ID;
return rtl8367c_getAsicRegBit(RTL8367C_DOT1X_PORT_ENABLE_REG, port, pEnabled);
}
/* Function Name:
* rtl8367c_setAsic1xPBAuthConfig
* Description:
* Set 802.1x port-based authorised port configuration
* Input:
* port - Physical port number (0~7)
* auth - 1: authorised, 0: non-authorised
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* Note:
* None
*/
ret_t rtl8367c_setAsic1xPBAuthConfig(rtk_uint32 port, rtk_uint32 auth)
{
if(port >= RTL8367C_PORTNO)
return RT_ERR_PORT_ID;
return rtl8367c_setAsicRegBit(RTL8367C_DOT1X_PORT_AUTH_REG, port, auth);
}
/* Function Name:
* rtl8367c_getAsic1xPBAuthConfig
* Description:
* Get 802.1x port-based authorised port configuration
* Input:
* port - Physical port number (0~7)
* pAuth - 1: authorised, 0: non-authorised
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* Note:
* None
*/
ret_t rtl8367c_getAsic1xPBAuthConfig(rtk_uint32 port, rtk_uint32 *pAuth)
{
if(port >= RTL8367C_PORTNO)
return RT_ERR_PORT_ID;
return rtl8367c_getAsicRegBit(RTL8367C_DOT1X_PORT_AUTH_REG, port, pAuth);
}
/* Function Name:
* rtl8367c_setAsic1xPBOpdirConfig
* Description:
* Set 802.1x port-based operational direction
* Input:
* port - Physical port number (0~7)
* opdir - Operation direction 1: IN, 0:BOTH
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* Note:
* None
*/
ret_t rtl8367c_setAsic1xPBOpdirConfig(rtk_uint32 port, rtk_uint32 opdir)
{
if(port >= RTL8367C_PORTNO)
return RT_ERR_PORT_ID;
return rtl8367c_setAsicRegBit(RTL8367C_DOT1X_PORT_OPDIR_REG, port, opdir);
}
/* Function Name:
* rtl8367c_getAsic1xPBOpdirConfig
* Description:
* Get 802.1x port-based operational direction
* Input:
* port - Physical port number (0~7)
* pOpdir - Operation direction 1: IN, 0:BOTH
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* Note:
* None
*/
ret_t rtl8367c_getAsic1xPBOpdirConfig(rtk_uint32 port, rtk_uint32* pOpdir)
{
if(port >= RTL8367C_PORTNO)
return RT_ERR_PORT_ID;
return rtl8367c_getAsicRegBit(RTL8367C_DOT1X_PORT_OPDIR_REG, port, pOpdir);
}
/* Function Name:
* rtl8367c_setAsic1xMBEnConfig
* Description:
* Set 802.1x mac-based port enable configuration
* Input:
* port - Physical port number (0~7)
* enabled - 1: enabled, 0: disabled
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* Note:
* None
*/
ret_t rtl8367c_setAsic1xMBEnConfig(rtk_uint32 port, rtk_uint32 enabled)
{
if(port >= RTL8367C_PORTNO)
return RT_ERR_PORT_ID;
return rtl8367c_setAsicRegBit(RTL8367C_DOT1X_MAC_ENABLE_REG, port, enabled);
}
/* Function Name:
* rtl8367c_getAsic1xMBEnConfig
* Description:
* Get 802.1x mac-based port enable configuration
* Input:
* port - Physical port number (0~7)
* pEnabled - 1: enabled, 0: disabled
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* Note:
* None
*/
ret_t rtl8367c_getAsic1xMBEnConfig(rtk_uint32 port, rtk_uint32 *pEnabled)
{
if(port >= RTL8367C_PORTNO)
return RT_ERR_PORT_ID;
return rtl8367c_getAsicRegBit(RTL8367C_DOT1X_MAC_ENABLE_REG, port, pEnabled);
}
/* Function Name:
* rtl8367c_setAsic1xMBOpdirConfig
* Description:
* Set 802.1x mac-based operational direction
* Input:
* opdir - Operation direction 1: IN, 0:BOTH
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_setAsic1xMBOpdirConfig(rtk_uint32 opdir)
{
return rtl8367c_setAsicRegBit(RTL8367C_DOT1X_CFG_REG, RTL8367C_DOT1X_MAC_OPDIR_OFFSET, opdir);
}
/* Function Name:
* rtl8367c_getAsic1xMBOpdirConfig
* Description:
* Get 802.1x mac-based operational direction
* Input:
* pOpdir - Operation direction 1: IN, 0:BOTH
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_getAsic1xMBOpdirConfig(rtk_uint32 *pOpdir)
{
return rtl8367c_getAsicRegBit(RTL8367C_DOT1X_CFG_REG, RTL8367C_DOT1X_MAC_OPDIR_OFFSET, pOpdir);
}
/* Function Name:
* rtl8367c_setAsic1xProcConfig
* Description:
* Set 802.1x unauth. behavior configuration
* Input:
* port - Physical port number (0~7)
* proc - 802.1x unauth. behavior configuration 0:drop 1:trap to CPU 2:Guest VLAN
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* RT_ERR_DOT1X_PROC - Unauthorized behavior error
* Note:
* None
*/
ret_t rtl8367c_setAsic1xProcConfig(rtk_uint32 port, rtk_uint32 proc)
{
if(port >= RTL8367C_PORTNO)
return RT_ERR_PORT_ID;
if(proc >= DOT1X_UNAUTH_END)
return RT_ERR_DOT1X_PROC;
if(port < 8)
{
return rtl8367c_setAsicRegBits(RTL8367C_DOT1X_UNAUTH_ACT_BASE, RTL8367C_DOT1X_UNAUTH_ACT_MASK(port),proc);
}
else
{
return rtl8367c_setAsicRegBits(RTL8367C_REG_DOT1X_UNAUTH_ACT_W1, RTL8367C_DOT1X_UNAUTH_ACT_MASK(port),proc);
}
}
/* Function Name:
* rtl8367c_getAsic1xProcConfig
* Description:
* Get 802.1x unauth. behavior configuration
* Input:
* port - Physical port number (0~7)
* pProc - 802.1x unauth. behavior configuration 0:drop 1:trap to CPU 2:Guest VLAN
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* Note:
* None
*/
ret_t rtl8367c_getAsic1xProcConfig(rtk_uint32 port, rtk_uint32* pProc)
{
if(port >= RTL8367C_PORTNO)
return RT_ERR_PORT_ID;
if(port < 8)
return rtl8367c_getAsicRegBits(RTL8367C_DOT1X_UNAUTH_ACT_BASE, RTL8367C_DOT1X_UNAUTH_ACT_MASK(port),pProc);
else
return rtl8367c_getAsicRegBits(RTL8367C_REG_DOT1X_UNAUTH_ACT_W1, RTL8367C_DOT1X_UNAUTH_ACT_MASK(port),pProc);
}
/* Function Name:
* rtl8367c_setAsic1xGuestVidx
* Description:
* Set 802.1x guest vlan index
* Input:
* index - 802.1x guest vlan index (0~31)
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_DOT1X_GVLANIDX - Invalid cvid index
* Note:
* None
*/
ret_t rtl8367c_setAsic1xGuestVidx(rtk_uint32 index)
{
if(index >= RTL8367C_CVIDXNO)
return RT_ERR_DOT1X_GVLANIDX;
return rtl8367c_setAsicRegBits(RTL8367C_DOT1X_CFG_REG, RTL8367C_DOT1X_GVIDX_MASK, index);
}
/* Function Name:
* rtl8367c_getAsic1xGuestVidx
* Description:
* Get 802.1x guest vlan index
* Input:
* pIndex - 802.1x guest vlan index (0~31)
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_getAsic1xGuestVidx(rtk_uint32 *pIndex)
{
return rtl8367c_getAsicRegBits(RTL8367C_DOT1X_CFG_REG, RTL8367C_DOT1X_GVIDX_MASK, pIndex);
}
/* Function Name:
* rtl8367c_setAsic1xGVOpdir
* Description:
* Set 802.1x guest vlan talk to auth. DA
* Input:
* enabled - 0:disable 1:enable
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_setAsic1xGVOpdir(rtk_uint32 enabled)
{
return rtl8367c_setAsicRegBit(RTL8367C_DOT1X_CFG_REG, RTL8367C_DOT1X_GVOPDIR_OFFSET, enabled);
}
/* Function Name:
* rtl8367c_getAsic1xGVOpdir
* Description:
* Get 802.1x guest vlan talk to auth. DA
* Input:
* pEnabled - 0:disable 1:enable
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_getAsic1xGVOpdir(rtk_uint32 *pEnabled)
{
return rtl8367c_getAsicRegBit(RTL8367C_DOT1X_CFG_REG, RTL8367C_DOT1X_GVOPDIR_OFFSET, pEnabled);
}
/* Function Name:
* rtl8367c_setAsic1xTrapPriority
* Description:
* Set 802.1x Trap priority
* Input:
* priority - priority (0~7)
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_QOS_INT_PRIORITY - Invalid priority
* Note:
* None
*/
ret_t rtl8367c_setAsic1xTrapPriority(rtk_uint32 priority)
{
if(priority > RTL8367C_PRIMAX)
return RT_ERR_QOS_INT_PRIORITY;
return rtl8367c_setAsicRegBits(RTL8367C_REG_QOS_TRAP_PRIORITY0, RTL8367C_DOT1X_PRIORTY_MASK,priority);
}
/* Function Name:
* rtl8367c_getAsic1xTrapPriority
* Description:
* Get 802.1x Trap priority
* Input:
* pPriority - priority (0~7)
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_getAsic1xTrapPriority(rtk_uint32 *pPriority)
{
return rtl8367c_getAsicRegBits(RTL8367C_REG_QOS_TRAP_PRIORITY0, RTL8367C_DOT1X_PRIORTY_MASK, pPriority);
}

View file

@ -0,0 +1,877 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (, 08 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : Ethernet AV related functions
*
*/
#include <rtl8367c_asicdrv_eav.h>
/* Function Name:
* rtl8367c_setAsicEavMacAddress
* Description:
* Set PTP MAC address
* Input:
* mac - PTP mac
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_setAsicEavMacAddress(ether_addr_t mac)
{
ret_t retVal;
rtk_uint32 regData;
rtk_uint8 *accessPtr;
rtk_uint32 i;
accessPtr = (rtk_uint8*)&mac;
regData = *accessPtr;
accessPtr ++;
regData = (regData << 8) | *accessPtr;
accessPtr ++;
for(i = 0; i <=2; i++)
{
retVal = rtl8367c_setAsicReg(RTL8367C_REG_MAC_ADDR_H - i, regData);
if(retVal != RT_ERR_OK)
return retVal;
regData = *accessPtr;
accessPtr ++;
regData = (regData << 8) | *accessPtr;
accessPtr ++;
}
return retVal;
}
/* Function Name:
* rtl8367c_getAsicEavMacAddress
* Description:
* Get PTP MAC address
* Input:
* None
* Output:
* pMac - PTP mac
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_getAsicEavMacAddress(ether_addr_t *pMac)
{
ret_t retVal;
rtk_uint32 regData;
rtk_uint8 *accessPtr;
rtk_uint32 i;
accessPtr = (rtk_uint8*)pMac;
for(i = 0; i <= 2; i++)
{
retVal = rtl8367c_getAsicReg(RTL8367C_REG_MAC_ADDR_H - i, &regData);
if(retVal != RT_ERR_OK)
return retVal;
*accessPtr = (regData & 0xFF00) >> 8;
accessPtr ++;
*accessPtr = regData & 0xFF;
accessPtr ++;
}
return retVal;
}
/* Function Name:
* rtl8367c_setAsicEavTpid
* Description:
* Set PTP parser tag TPID.
* Input:
* outerTag - outter tag TPID
* innerTag - inner tag TPID
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_setAsicEavTpid(rtk_uint32 outerTag, rtk_uint32 innerTag)
{
ret_t retVal;
if((retVal = rtl8367c_setAsicReg(RTL8367C_REG_OTAG_TPID, outerTag)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_setAsicReg(RTL8367C_REG_ITAG_TPID, innerTag)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_getAsicEavTpid
* Description:
* Get PTP parser tag TPID.
* Input:
* None
* Output:
* pOuterTag - outter tag TPID
* pInnerTag - inner tag TPID
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_getAsicEavTpid(rtk_uint32* pOuterTag, rtk_uint32* pInnerTag)
{
ret_t retVal;
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_OTAG_TPID, pOuterTag)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_ITAG_TPID, pInnerTag)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_setAsicEavSysTime
* Description:
* Set PTP system time
* Input:
* second - seconds
* nanoSecond - nano seconds
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* The time granuality is 8 nano seconds.
*/
ret_t rtl8367c_setAsicEavSysTime(rtk_uint32 second, rtk_uint32 nanoSecond)
{
ret_t retVal;
rtk_uint32 sec_h, sec_l, nsec8_h, nsec8_l;
rtk_uint32 nano_second_8;
rtk_uint32 regData, busyFlag, count;
if(nanoSecond > RTL8367C_EAV_NANOSECONDMAX)
return RT_ERR_INPUT;
regData = 0;
sec_h = second >>16;
sec_l = second & 0xFFFF;
nano_second_8 = nanoSecond >> 3;
nsec8_h = (nano_second_8 >>16) & RTL8367C_PTP_TIME_NSEC_H_NSEC_MASK;
nsec8_l = nano_second_8 &0xFFFF;
if((retVal = rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_SEC_H_SEC, sec_h)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_SEC_L_SEC, sec_l)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_NSEC_L_NSEC, nsec8_l)) != RT_ERR_OK)
return retVal;
regData = nsec8_h | (PTP_TIME_WRITE<<RTL8367C_PTP_TIME_NSEC_H_CMD_OFFSET) | RTL8367C_PTP_TIME_NSEC_H_EXEC_MASK;
if((retVal = rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_NSEC_H_NSEC, regData)) != RT_ERR_OK)
return retVal;
count = 0;
do {
if((retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_PTP_TIME_NSEC_H_NSEC, RTL8367C_PTP_TIME_NSEC_H_EXEC_OFFSET, &busyFlag)) != RT_ERR_OK)
return retVal;
count++;
} while ((busyFlag != 0)&&(count<5));
if (busyFlag != 0)
return RT_ERR_BUSYWAIT_TIMEOUT;
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_getAsicEavSysTime
* Description:
* Get PTP system time
* Input:
* None
* Output:
* second - seconds
* nanoSecond - nano seconds
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* The time granuality is 8 nano seconds.
*/
ret_t rtl8367c_getAsicEavSysTime(rtk_uint32* pSecond, rtk_uint32* pNanoSecond)
{
ret_t retVal;
rtk_uint32 sec_h, sec_l, nsec8_h, nsec8_l;
rtk_uint32 nano_second_8;
rtk_uint32 regData, busyFlag, count;
regData = 0;
regData = (PTP_TIME_READ<<RTL8367C_PTP_TIME_NSEC_H_CMD_OFFSET) | RTL8367C_PTP_TIME_NSEC_H_EXEC_MASK;
if((retVal = rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_NSEC_H_NSEC, regData)) != RT_ERR_OK)
return retVal;
count = 0;
do {
if((retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_PTP_TIME_NSEC_H_NSEC, RTL8367C_PTP_TIME_NSEC_H_EXEC_OFFSET, &busyFlag)) != RT_ERR_OK)
return retVal;
count++;
} while ((busyFlag != 0)&&(count<5));
if (busyFlag != 0)
return RT_ERR_BUSYWAIT_TIMEOUT;
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_PTP_TIME_SEC_H_SEC_RD, &sec_h)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_PTP_TIME_SEC_L_SEC_RD, &sec_l)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicRegBits(RTL8367C_REG_PTP_TIME_NSEC_H_NSEC_RD, RTL8367C_PTP_TIME_NSEC_H_NSEC_RD_MASK,&nsec8_h)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_PTP_TIME_NSEC_L_NSEC_RD, &nsec8_l)) != RT_ERR_OK)
return retVal;
*pSecond = (sec_h<<16) | sec_l;
nano_second_8 = (nsec8_h<<16) | nsec8_l;
*pNanoSecond = nano_second_8<<3;
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_setAsicEavSysTimeAdjust
* Description:
* Set PTP system time adjust
* Input:
* type - incresae or decrease
* second - seconds
* nanoSecond - nano seconds
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* Ethernet AV second offset of timer for tuning
*/
ret_t rtl8367c_setAsicEavSysTimeAdjust(rtk_uint32 type, rtk_uint32 second, rtk_uint32 nanoSecond)
{
ret_t retVal;
rtk_uint32 sec_h, sec_l, nsec8_h, nsec8_l;
rtk_uint32 nano_second_8;
rtk_uint32 regData, busyFlag, count;
if (type >= PTP_TIME_ADJ_END)
return RT_ERR_INPUT;
if(nanoSecond > RTL8367C_EAV_NANOSECONDMAX)
return RT_ERR_INPUT;
regData = 0;
sec_h = second >>16;
sec_l = second & 0xFFFF;
nano_second_8 = nanoSecond >> 3;
nsec8_h = (nano_second_8 >>16) & RTL8367C_PTP_TIME_NSEC_H_NSEC_MASK;
nsec8_l = nano_second_8 &0xFFFF;
if((retVal = rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_SEC_H_SEC, sec_h)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_SEC_L_SEC, sec_l)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_NSEC_L_NSEC, nsec8_l)) != RT_ERR_OK)
return retVal;
if (PTP_TIME_ADJ_INC == type)
regData = nsec8_h | (PTP_TIME_INC<<RTL8367C_PTP_TIME_NSEC_H_CMD_OFFSET) | RTL8367C_PTP_TIME_NSEC_H_EXEC_MASK;
else
regData = nsec8_h | (PTP_TIME_DEC<<RTL8367C_PTP_TIME_NSEC_H_CMD_OFFSET) | RTL8367C_PTP_TIME_NSEC_H_EXEC_MASK;
if((retVal = rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_NSEC_H_NSEC, regData)) != RT_ERR_OK)
return retVal;
count = 0;
do {
if((retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_PTP_TIME_NSEC_H_NSEC, RTL8367C_PTP_TIME_NSEC_H_EXEC_OFFSET, &busyFlag)) != RT_ERR_OK)
return retVal;
count++;
} while ((busyFlag != 0)&&(count<5));
if (busyFlag != 0)
return RT_ERR_BUSYWAIT_TIMEOUT;
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_setAsicEavSysTimeCtrl
* Description:
* Set PTP system time control
* Input:
* command - start or stop
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_setAsicEavSysTimeCtrl(rtk_uint32 control)
{
ret_t retVal;
rtk_uint32 regData;
if (control>=PTP_TIME_CTRL_END)
return RT_ERR_INPUT;
regData = 0;
if (PTP_TIME_CTRL_START == control)
regData = RTL8367C_CFG_TIMER_EN_FRC_MASK | RTL8367C_CFG_TIMER_1588_EN_MASK;
else
regData = 0;
if((retVal = rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_CFG, regData)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_getAsicEavSysTimeCtrl
* Description:
* Get PTP system time control
* Input:
* None
* Output:
* pControl - start or stop
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_getAsicEavSysTimeCtrl(rtk_uint32* pControl)
{
ret_t retVal;
rtk_uint32 regData;
rtk_uint32 mask;
mask = RTL8367C_CFG_TIMER_EN_FRC_MASK | RTL8367C_CFG_TIMER_1588_EN_MASK;
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_PTP_TIME_CFG, &regData)) != RT_ERR_OK)
return retVal;
if( (regData & mask) == mask)
*pControl = PTP_TIME_CTRL_START;
else if( (regData & mask) == 0)
*pControl = PTP_TIME_CTRL_STOP;
else
return RT_ERR_NOT_ALLOWED;
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_setAsicEavInterruptMask
* Description:
* Set PTP interrupt enable mask
* Input:
* imr - Interrupt mask
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* [0]:TX_SYNC,
* [1]:TX_DELAY,
* [2]:TX_PDELAY_REQ,
* [3]:TX_PDELAY_RESP,
* [4]:RX_SYNC,
* [5]:RX_DELAY,
* [6]:RX_PDELAY_REQ,
* [7]:RX_PDELAY_RESP,
*/
ret_t rtl8367c_setAsicEavInterruptMask(rtk_uint32 imr)
{
if ((imr&(RTL8367C_PTP_INTR_MASK<<8))>0)
return RT_ERR_INPUT;
return rtl8367c_setAsicRegBits(RTL8367C_REG_PTP_TIME_CFG2, RTL8367C_PTP_INTR_MASK, imr);
}
/* Function Name:
* rtl8367c_getAsicEavInterruptMask
* Description:
* Get PTP interrupt enable mask
* Input:
* pImr - Interrupt mask
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* [0]:TX_SYNC,
* [1]:TX_DELAY,
* [2]:TX_PDELAY_REQ,
* [3]:TX_PDELAY_RESP,
* [4]:RX_SYNC,
* [5]:RX_DELAY,
* [6]:RX_PDELAY_REQ,
* [7]:RX_PDELAY_RESP,
*/
ret_t rtl8367c_getAsicEavInterruptMask(rtk_uint32* pImr)
{
return rtl8367c_getAsicRegBits(RTL8367C_REG_PTP_TIME_CFG2, RTL8367C_PTP_INTR_MASK, pImr);
}
/* Function Name:
* rtl8367c_getAsicEavInterruptStatus
* Description:
* Get PTP interrupt port status mask
* Input:
* pIms - Interrupt mask
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* [0]:p0 interrupt,
* [1]:p1 interrupt,
* [2]:p2 interrupt,
* [3]:p3 interrupt,
* [4]:p4 interrupt,
*/
ret_t rtl8367c_getAsicEavInterruptStatus(rtk_uint32* pIms)
{
return rtl8367c_getAsicRegBits(RTL8367C_REG_PTP_INTERRUPT_CFG, RTL8367C_PTP_PORT_MASK, pIms);
}
/* Function Name:
* rtl8367c_setAsicInterruptMask
* Description:
* Clear interrupt enable mask
* Input:
* ims - Interrupt status mask
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* This API can be used to clear ASIC interrupt status and register will be cleared by writting 1.
* [0]:TX_SYNC,
* [1]:TX_DELAY,
* [2]:TX_PDELAY_REQ,
* [3]:TX_PDELAY_RESP,
* [4]:RX_SYNC,
* [5]:RX_DELAY,
* [6]:RX_PDELAY_REQ,
* [7]:RX_PDELAY_RESP,
*/
ret_t rtl8367c_setAsicEavPortInterruptStatus(rtk_uint32 port, rtk_uint32 ims)
{
if(port > RTL8367C_PORTNO)
return RT_ERR_PORT_ID;
if(port < 5)
return rtl8367c_setAsicRegBits(RTL8367C_EAV_PORT_CFG_REG(port), RTL8367C_PTP_INTR_MASK,ims);
else if(port == 5)
return rtl8367c_setAsicRegBits(RTL8367C_REG_P5_EAV_CFG, RTL8367C_PTP_INTR_MASK,ims);
else if(port == 6)
return rtl8367c_setAsicRegBits(RTL8367C_REG_P6_EAV_CFG, RTL8367C_PTP_INTR_MASK,ims);
else if(port == 7)
return rtl8367c_setAsicRegBits(RTL8367C_REG_P7_EAV_CFG, RTL8367C_PTP_INTR_MASK,ims);
else if(port == 8)
return rtl8367c_setAsicRegBits(RTL8367C_REG_P8_EAV_CFG, RTL8367C_PTP_INTR_MASK,ims);
else if(port == 9)
return rtl8367c_setAsicRegBits(RTL8367C_REG_P9_EAV_CFG, RTL8367C_PTP_INTR_MASK,ims);
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_getAsicInterruptStatus
* Description:
* Get interrupt enable mask
* Input:
* pIms - Interrupt status mask
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* [0]:TX_SYNC,
* [1]:TX_DELAY,
* [2]:TX_PDELAY_REQ,
* [3]:TX_PDELAY_RESP,
* [4]:RX_SYNC,
* [5]:RX_DELAY,
* [6]:RX_PDELAY_REQ,
* [7]:RX_PDELAY_RESP,
*/
ret_t rtl8367c_getAsicEavPortInterruptStatus(rtk_uint32 port, rtk_uint32* pIms)
{
if(port > RTL8367C_PORTNO)
return RT_ERR_PORT_ID;
if(port < 5)
return rtl8367c_getAsicRegBits(RTL8367C_EAV_PORT_CFG_REG(port), RTL8367C_PTP_INTR_MASK, pIms);
else if(port == 5)
return rtl8367c_getAsicRegBits(RTL8367C_REG_P5_EAV_CFG, RTL8367C_PTP_INTR_MASK, pIms);
else if(port == 6)
return rtl8367c_getAsicRegBits(RTL8367C_REG_P6_EAV_CFG, RTL8367C_PTP_INTR_MASK,pIms);
else if(port == 7)
return rtl8367c_getAsicRegBits(RTL8367C_REG_P7_EAV_CFG, RTL8367C_PTP_INTR_MASK,pIms);
else if(port == 8)
return rtl8367c_getAsicRegBits(RTL8367C_REG_P8_EAV_CFG, RTL8367C_PTP_INTR_MASK,pIms);
else if(port == 9)
return rtl8367c_getAsicRegBits(RTL8367C_REG_P9_EAV_CFG, RTL8367C_PTP_INTR_MASK,pIms);
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_setAsicEavPortEnable
* Description:
* Set per-port EAV function enable/disable
* Input:
* port - Physical port number (0~9)
* enabled - 1: enabled, 0: disabled
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* Note:
* If EAV function is enabled, PTP event messgae packet will be attached PTP timestamp for trapping
*/
ret_t rtl8367c_setAsicEavPortEnable(rtk_uint32 port, rtk_uint32 enabled)
{
if(port > RTL8367C_PORTNO)
return RT_ERR_PORT_ID;
if(port < 5)
return rtl8367c_setAsicRegBit(RTL8367C_EAV_PORT_CFG_REG(port), RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET, enabled);
else if(port == 5)
return rtl8367c_setAsicRegBit(RTL8367C_REG_P5_EAV_CFG, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET, enabled);
else if(port == 6)
return rtl8367c_setAsicRegBit(RTL8367C_REG_P6_EAV_CFG, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET, enabled);
else if(port == 7)
return rtl8367c_setAsicRegBit(RTL8367C_REG_P7_EAV_CFG, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET, enabled);
else if(port == 8)
return rtl8367c_setAsicRegBit(RTL8367C_REG_P8_EAV_CFG, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET, enabled);
else if(port == 9)
return rtl8367c_setAsicRegBit(RTL8367C_REG_P9_EAV_CFG, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET, enabled);
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_getAsicEavPortEnable
* Description:
* Get per-port EAV function enable/disable
* Input:
* port - Physical port number (0~9)
* pEnabled - 1: enabled, 0: disabled
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* Note:
* None
*/
ret_t rtl8367c_getAsicEavPortEnable(rtk_uint32 port, rtk_uint32 *pEnabled)
{
if(port > RTL8367C_PORTNO)
return RT_ERR_PORT_ID;
if(port < 5)
return rtl8367c_getAsicRegBit(RTL8367C_EAV_PORT_CFG_REG(port), RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET, pEnabled);
else if(port == 5)
return rtl8367c_getAsicRegBit(RTL8367C_REG_P5_EAV_CFG, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET, pEnabled);
else if(port == 6)
return rtl8367c_getAsicRegBit(RTL8367C_REG_P6_EAV_CFG, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET, pEnabled);
else if(port == 7)
return rtl8367c_getAsicRegBit(RTL8367C_REG_P7_EAV_CFG, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET, pEnabled);
else if(port == 8)
return rtl8367c_getAsicRegBit(RTL8367C_REG_P8_EAV_CFG, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET, pEnabled);
else if(port == 9)
return rtl8367c_getAsicRegBit(RTL8367C_REG_P9_EAV_CFG, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET, pEnabled);
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_getAsicEavPortTimeStamp
* Description:
* Get PTP port time stamp
* Input:
* port - Physical port number (0~9)
* type - PTP packet type
* Output:
* timeStamp - seconds
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* The time granuality is 8 nano seconds.
*/
ret_t rtl8367c_getAsicEavPortTimeStamp(rtk_uint32 port, rtk_uint32 type, rtl8367c_ptp_time_stamp_t* timeStamp)
{
ret_t retVal;
rtk_uint32 sec_h, sec_l, nsec8_h, nsec8_l;
rtk_uint32 nano_second_8;
if(port > 9)
return RT_ERR_PORT_ID;
if(type >= PTP_PKT_TYPE_END)
return RT_ERR_INPUT;
if(port < 5){
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_SEQ_ID(port, type), &timeStamp->sequence_id))!= RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_PORT_SEC_H(port) , &sec_h)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_PORT_SEC_L(port), &sec_l)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicRegBits(RTL8367C_REG_PORT_NSEC_H(port) , RTL8367C_PORT_NSEC_H_MASK,&nsec8_h)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_PORT_NSEC_L(port) , &nsec8_l)) != RT_ERR_OK)
return retVal;
}else if(port == 5){
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P5_TX_SYNC_SEQ_ID+type, &timeStamp->sequence_id))!= RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P5_PORT_SEC_31_16, &sec_h)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P5_PORT_SEC_15_0, &sec_l)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicRegBits(RTL8367C_REG_P5_PORT_NSEC_26_16 , RTL8367C_PORT_NSEC_H_MASK,&nsec8_h)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P5_PORT_NSEC_15_0, &nsec8_l)) != RT_ERR_OK)
return retVal;
}else if(port == 6){
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P6_TX_SYNC_SEQ_ID+type, &timeStamp->sequence_id))!= RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P6_PORT_SEC_31_16, &sec_h)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P6_PORT_SEC_15_0, &sec_l)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicRegBits(RTL8367C_REG_P6_PORT_NSEC_26_16 , RTL8367C_PORT_NSEC_H_MASK,&nsec8_h)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P6_PORT_NSEC_15_0, &nsec8_l)) != RT_ERR_OK)
return retVal;
}else if(port == 7){
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P7_TX_SYNC_SEQ_ID+type, &timeStamp->sequence_id))!= RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P7_PORT_SEC_31_16, &sec_h)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P7_PORT_SEC_15_0, &sec_l)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicRegBits(RTL8367C_REG_P7_PORT_NSEC_26_16 , RTL8367C_PORT_NSEC_H_MASK,&nsec8_h)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P7_PORT_NSEC_15_0, &nsec8_l)) != RT_ERR_OK)
return retVal;
}else if(port == 8){
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P8_TX_SYNC_SEQ_ID+type, &timeStamp->sequence_id))!= RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P8_PORT_SEC_31_16, &sec_h)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P8_PORT_SEC_15_0, &sec_l)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicRegBits(RTL8367C_REG_P8_PORT_NSEC_26_16 , RTL8367C_PORT_NSEC_H_MASK,&nsec8_h)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P8_PORT_NSEC_15_0, &nsec8_l)) != RT_ERR_OK)
return retVal;
}else if(port == 9){
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P9_TX_SYNC_SEQ_ID+type, &timeStamp->sequence_id))!= RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P9_PORT_SEC_31_16, &sec_h)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P9_PORT_SEC_15_0, &sec_l)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicRegBits(RTL8367C_REG_P9_PORT_NSEC_26_16 , RTL8367C_PORT_NSEC_H_MASK,&nsec8_h)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P9_PORT_NSEC_15_0, &nsec8_l)) != RT_ERR_OK)
return retVal;
}
timeStamp->second = (sec_h<<16) | sec_l;
nano_second_8 = (nsec8_h<<16) | nsec8_l;
timeStamp->nano_second = nano_second_8<<3;
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_setAsicEavTrap
* Description:
* Set per-port PTP packet trap to CPU
* Input:
* port - Physical port number (0~5)
* enabled - 1: enabled, 0: disabled
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* Note:
* If EAV trap enabled, switch will trap PTP packet to CPU
*/
ret_t rtl8367c_setAsicEavTrap(rtk_uint32 port, rtk_uint32 enabled)
{
if(port > RTL8367C_PORTNO)
return RT_ERR_PORT_ID;
return rtl8367c_setAsicRegBit(RTL8367C_REG_PTP_PORT0_CFG1 + (port * 0x20), RTL8367C_PTP_PORT0_CFG1_OFFSET, enabled);
}
/* Function Name:
* rtl8367c_getAsicEavTimeSyncEn
* Description:
* Get per-port EPTP packet trap to CPU
* Input:
* port - Physical port number (0~5)
* pEnabled - 1: enabled, 0: disabled
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* Note:
* None
*/
ret_t rtl8367c_getAsicEavTrap(rtk_uint32 port, rtk_uint32 *pEnabled)
{
if(port > RTL8367C_PORTNO)
return RT_ERR_PORT_ID;
return rtl8367c_getAsicRegBit(RTL8367C_REG_PTP_PORT0_CFG1 + (port * 0x20), RTL8367C_PTP_PORT0_CFG1_OFFSET, pEnabled);
}
/* Function Name:
* rtl8367c_setAsicEavEnable
* Description:
* Set per-port EAV function enable/disable
* Input:
* port - Physical port number (0~5)
* enabled - 1: enabled, 0: disabled
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* Note:
* If EAV function is enabled, PTP event messgae packet will be attached PTP timestamp for trapping
*/
ret_t rtl8367c_setAsicEavEnable(rtk_uint32 port, rtk_uint32 enabled)
{
if(port > RTL8367C_PORTNO)
return RT_ERR_PORT_ID;
return rtl8367c_setAsicRegBit(RTL8367C_REG_EAV_CTRL0, port, enabled);
}
/* Function Name:
* rtl8367c_getAsicEavEnable
* Description:
* Get per-port EAV function enable/disable
* Input:
* port - Physical port number (0~5)
* pEnabled - 1: enabled, 0: disabled
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* Note:
* None
*/
ret_t rtl8367c_getAsicEavEnable(rtk_uint32 port, rtk_uint32 *pEnabled)
{
if(port > RTL8367C_PORTNO)
return RT_ERR_PORT_ID;
return rtl8367c_getAsicRegBit(RTL8367C_REG_EAV_CTRL0, port, pEnabled);
}
/* Function Name:
* rtl8367c_setAsicEavPriRemapping
* Description:
* Set non-EAV streaming priority remapping
* Input:
* srcpriority - Priority value
* priority - Absolute priority value
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_QOS_INT_PRIORITY - Invalid priority
* Note:
* None
*/
ret_t rtl8367c_setAsicEavPriRemapping(rtk_uint32 srcpriority, rtk_uint32 priority)
{
if(srcpriority > RTL8367C_PRIMAX || priority > RTL8367C_PRIMAX)
return RT_ERR_QOS_INT_PRIORITY;
return rtl8367c_setAsicRegBits(RTL8367C_EAV_PRIORITY_REMAPPING_REG(srcpriority), RTL8367C_EAV_PRIORITY_REMAPPING_MASK(srcpriority),priority);
}
/* Function Name:
* rtl8367c_getAsicEavPriRemapping
* Description:
* Get non-EAV streaming priority remapping
* Input:
* srcpriority - Priority value
* pPriority - Absolute priority value
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_QOS_INT_PRIORITY - Invalid priority
* Note:
* None
*/
ret_t rtl8367c_getAsicEavPriRemapping(rtk_uint32 srcpriority, rtk_uint32 *pPriority)
{
if(srcpriority > RTL8367C_PRIMAX )
return RT_ERR_QOS_INT_PRIORITY;
return rtl8367c_getAsicRegBits(RTL8367C_EAV_PRIORITY_REMAPPING_REG(srcpriority), RTL8367C_EAV_PRIORITY_REMAPPING_MASK(srcpriority),pPriority);
}

View file

@ -0,0 +1,141 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 48989 $
* $Date: 2014-07-01 15:45:24 +0800 (, 01 2014) $
*
* Purpose : RTL8370 switch high-level API for RTL8367C
* Feature :
*
*/
#include <rtl8367c_asicdrv_eee.h>
#include <rtl8367c_asicdrv_phy.h>
/*
@func ret_t | rtl8367c_setAsicEee100M | Set eee force mode function enable/disable.
@parm rtk_uint32 | port | The port number.
@parm rtk_uint32 | enabled | 1: enabled, 0: disabled.
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error.
@rvalue RT_ERR_INPUT | Invalid input parameter.
@comm
This API set the 100M EEE enable function.
*/
ret_t rtl8367c_setAsicEee100M(rtk_uint32 port, rtk_uint32 enable)
{
rtk_api_ret_t retVal;
rtk_uint32 regData;
if(port >= RTL8367C_PORTNO)
return RT_ERR_PORT_ID;
if (enable > 1)
return RT_ERR_INPUT;
if((retVal = rtl8367c_getAsicPHYOCPReg(port, EEE_OCP_PHY_ADDR, &regData)) != RT_ERR_OK)
return retVal;
if(enable)
regData |= (0x0001 << 1);
else
regData &= ~(0x0001 << 1);
if((retVal = rtl8367c_setAsicPHYOCPReg(port, EEE_OCP_PHY_ADDR, regData)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/*
@func ret_t | rtl8367c_getAsicEee100M | Get 100M eee enable/disable.
@parm rtk_uint32 | port | The port number.
@parm rtk_uint32* | enabled | 1: enabled, 0: disabled.
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error.
@rvalue RT_ERR_INPUT | Invalid input parameter.
@comm
This API get the 100M EEE function.
*/
ret_t rtl8367c_getAsicEee100M(rtk_uint32 port, rtk_uint32 *enable)
{
rtk_api_ret_t retVal;
rtk_uint32 regData;
if(port >= RTL8367C_PORTNO)
return RT_ERR_PORT_ID;
if((retVal = rtl8367c_getAsicPHYOCPReg(port, EEE_OCP_PHY_ADDR, &regData)) != RT_ERR_OK)
return retVal;
*enable = (regData & (0x0001 << 1)) ? ENABLED : DISABLED;
return RT_ERR_OK;
}
/*
@func ret_t | rtl8367c_setAsicEeeGiga | Set eee force mode function enable/disable.
@parm rtk_uint32 | port | The port number.
@parm rtk_uint32 | enabled | 1: enabled, 0: disabled.
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error.
@rvalue RT_ERR_INPUT | Invalid input parameter.
@comm
This API set the 100M EEE enable function.
*/
ret_t rtl8367c_setAsicEeeGiga(rtk_uint32 port, rtk_uint32 enable)
{
rtk_api_ret_t retVal;
rtk_uint32 regData;
if(port >= RTL8367C_PORTNO)
return RT_ERR_PORT_ID;
if (enable > 1)
return RT_ERR_INPUT;
if((retVal = rtl8367c_getAsicPHYOCPReg(port, EEE_OCP_PHY_ADDR, &regData)) != RT_ERR_OK)
return retVal;
if(enable)
regData |= (0x0001 << 2);
else
regData &= ~(0x0001 << 2);
if((retVal = rtl8367c_setAsicPHYOCPReg(port, EEE_OCP_PHY_ADDR, regData)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/*
@func ret_t | rtl8367c_getAsicEeeGiga | Get 100M eee enable/disable.
@parm rtk_uint32 | port | The port number.
@parm rtk_uint32* | enabled | 1: enabled, 0: disabled.
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error.
@rvalue RT_ERR_INPUT | Invalid input parameter.
@comm
This API get the 100M EEE function.
*/
ret_t rtl8367c_getAsicEeeGiga(rtk_uint32 port, rtk_uint32 *enable)
{
rtk_api_ret_t retVal;
rtk_uint32 regData;
if(port >= RTL8367C_PORTNO)
return RT_ERR_PORT_ID;
if((retVal = rtl8367c_getAsicPHYOCPReg(port, EEE_OCP_PHY_ADDR, &regData)) != RT_ERR_OK)
return retVal;
*enable = (regData & (0x0001 << 2)) ? ENABLED : DISABLED;
return RT_ERR_OK;
}

View file

@ -0,0 +1,445 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (, 08 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : Green ethernet related functions
*
*/
#include <rtl8367c_asicdrv_green.h>
/* Function Name:
* rtl8367c_getAsicGreenPortPage
* Description:
* Get per-Port ingress page usage per second
* Input:
* port - Physical port number (0~7)
* pPage - page number of ingress packet occuping per second
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* Note:
* Ingress traffic occuping page number per second for high layer green feature usage
*/
ret_t rtl8367c_getAsicGreenPortPage(rtk_uint32 port, rtk_uint32* pPage)
{
ret_t retVal;
rtk_uint32 regData;
rtk_uint32 pageMeter;
if(port > RTL8367C_PORTIDMAX)
return RT_ERR_PORT_ID;
retVal = rtl8367c_getAsicReg(RTL8367C_PAGEMETER_PORT_REG(port), &regData);
if(retVal != RT_ERR_OK)
return retVal;
pageMeter = regData;
retVal = rtl8367c_getAsicReg(RTL8367C_PAGEMETER_PORT_REG(port) + 1, &regData);
if(retVal != RT_ERR_OK)
return retVal;
pageMeter = pageMeter + (regData << 16);
*pPage = pageMeter;
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_setAsicGreenTrafficType
* Description:
* Set traffic type for each priority
* Input:
* priority - internal priority (0~7)
* traffictype - high/low traffic type, 1:high priority traffic type, 0:low priority traffic type
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_QOS_INT_PRIORITY - Invalid priority
* Note:
* None
*/
ret_t rtl8367c_setAsicGreenTrafficType(rtk_uint32 priority, rtk_uint32 traffictype)
{
if(priority > RTL8367C_PRIMAX)
return RT_ERR_QOS_INT_PRIORITY;
return rtl8367c_setAsicRegBit(RTL8367C_REG_HIGHPRI_CFG, priority, (traffictype?1:0));
}
/* Function Name:
* rtl8367c_getAsicGreenTrafficType
* Description:
* Get traffic type for each priority
* Input:
* priority - internal priority (0~7)
* pTraffictype - high/low traffic type, 1:high priority traffic type, 0:low priority traffic type
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_QOS_INT_PRIORITY - Invalid priority
* Note:
* None
*/
ret_t rtl8367c_getAsicGreenTrafficType(rtk_uint32 priority, rtk_uint32* pTraffictype)
{
if(priority > RTL8367C_PRIMAX)
return RT_ERR_QOS_INT_PRIORITY;
return rtl8367c_getAsicRegBit(RTL8367C_REG_HIGHPRI_CFG, priority, pTraffictype);
}
/* Function Name:
* rtl8367c_setAsicGreenHighPriorityTraffic
* Description:
* Set indicator which ASIC had received high priority traffic
* Input:
* port - Physical port number (0~7)
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* Note:
* None
*/
ret_t rtl8367c_setAsicGreenHighPriorityTraffic(rtk_uint32 port)
{
if(port > RTL8367C_PORTIDMAX)
return RT_ERR_PORT_ID;
return rtl8367c_setAsicRegBit(RTL8367C_REG_HIGHPRI_INDICATOR, port, 1);
}
/* Function Name:
* rtl8367c_getAsicGreenHighPriorityTraffic
* Description:
* Get indicator which ASIC had received high priority traffic or not
* Input:
* port - Physical port number (0~7)
* pIndicator - Have received high priority traffic indicator. If 1 means ASCI had received high priority in 1second checking priod
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* Note:
* None
*/
ret_t rtl8367c_getAsicGreenHighPriorityTraffic(rtk_uint32 port, rtk_uint32* pIndicator)
{
if(port > RTL8367C_PORTIDMAX)
return RT_ERR_PORT_ID;
return rtl8367c_getAsicRegBit(RTL8367C_REG_HIGHPRI_INDICATOR, port, pIndicator);
}
/*
@func rtk_int32 | rtl8367c_setAsicGreenEthernet | Set green ethernet function.
@parm rtk_uint32 | green | Green feature function usage 1:enable 0:disable.
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error.
@comm
The API can set Green Ethernet function to reduce power consumption. While green feature is enabled, ASIC will automatic
detect the cable length and then select different power mode for best performance with minimums power consumption. Link down
ports will enter power savining mode in 10 seconds after the cable disconnected if power saving function is enabled.
*/
ret_t rtl8367c_setAsicGreenEthernet(rtk_uint32 port, rtk_uint32 green)
{
ret_t retVal;
rtk_uint32 checkCounter;
rtk_uint32 regData;
rtk_uint32 phy_status;
rtk_uint32 patchData[6][2] = { {0x809A, 0x8911}, {0x80A3, 0x9233}, {0x80AC, 0xA444}, {0x809F, 0x6B20}, {0x80A8, 0x6B22}, {0x80B1, 0x6B23} };
rtk_uint32 idx;
rtk_uint32 data;
if (green > 1)
return RT_ERR_INPUT;
/* 0xa420[2:0] */
if((retVal = rtl8367c_getAsicPHYOCPReg(port, 0xA420, &regData)) != RT_ERR_OK)
return retVal;
phy_status = (regData & 0x0007);
if(phy_status == 3)
{
/* 0xb820[4] = 1 */
if((retVal = rtl8367c_getAsicPHYOCPReg(port, 0xB820, &regData)) != RT_ERR_OK)
return retVal;
regData |= (0x0001 << 4);
if((retVal = rtl8367c_setAsicPHYOCPReg(port, 0xB820, regData)) != RT_ERR_OK)
return retVal;
/* wait 0xb800[6] = 1 */
checkCounter = 100;
while(checkCounter)
{
retVal = rtl8367c_getAsicPHYOCPReg(port, 0xB800, &regData);
if( (retVal != RT_ERR_OK) || ((regData & 0x0040) != 0x0040) )
{
checkCounter --;
if(0 == checkCounter)
return RT_ERR_BUSYWAIT_TIMEOUT;
}
else
checkCounter = 0;
}
}
if((retVal = rtl8367c_setAsicReg(0x13C2, 0x0249)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_getAsicReg(0x1300, &data)) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_setAsicReg(0x13C2, 0x0000)) != RT_ERR_OK)
return retVal;
switch (data)
{
case 0x0276:
case 0x0597:
case 0x6367:
if(green)
{
for(idx = 0; idx < 6; idx++ )
{
if((retVal = rtl8367c_setAsicPHYOCPReg(port, 0xA436, patchData[idx][0])) != RT_ERR_OK)
return retVal;
if((retVal = rtl8367c_setAsicPHYOCPReg(port, 0xA438, patchData[idx][1])) != RT_ERR_OK)
return retVal;
}
}
break;
default:
break;;
}
/* 0xa436 = 0x8011 */
if((retVal = rtl8367c_setAsicPHYOCPReg(port, 0xA436, 0x8011)) != RT_ERR_OK)
return retVal;
/* wr 0xa438[15] = 0: disable, 1: enable */
if((retVal = rtl8367c_getAsicPHYOCPReg(port, 0xA438, &regData)) != RT_ERR_OK)
return retVal;
if(green)
regData |= 0x8000;
else
regData &= 0x7FFF;
if((retVal = rtl8367c_setAsicPHYOCPReg(port, 0xA438, regData)) != RT_ERR_OK)
return retVal;
if(phy_status == 3)
{
/* 0xb820[4] = 0 */
if((retVal = rtl8367c_getAsicPHYOCPReg(port, 0xB820, &regData)) != RT_ERR_OK)
return retVal;
regData &= ~(0x0001 << 4);
if((retVal = rtl8367c_setAsicPHYOCPReg(port, 0xB820, regData)) != RT_ERR_OK)
return retVal;
/* wait 0xb800[6] = 0 */
checkCounter = 100;
while(checkCounter)
{
retVal = rtl8367c_getAsicPHYOCPReg(port, 0xB800, &regData);
if( (retVal != RT_ERR_OK) || ((regData & 0x0040) != 0x0000) )
{
checkCounter --;
if(0 == checkCounter)
return RT_ERR_BUSYWAIT_TIMEOUT;
}
else
checkCounter = 0;
}
}
return RT_ERR_OK;
}
/*
@func rtk_int32 | rtl8367c_getAsicGreenEthernet | Get green ethernet function.
@parm rtk_uint32 | *green | Green feature function usage 1:enable 0:disable.
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error.
@comm
The API can set Green Ethernet function to reduce power consumption. While green feature is enabled, ASIC will automatic
detect the cable length and then select different power mode for best performance with minimums power consumption. Link down
ports will enter power savining mode in 10 seconds after the cable disconnected if power saving function is enabled.
*/
ret_t rtl8367c_getAsicGreenEthernet(rtk_uint32 port, rtk_uint32* green)
{
ret_t retVal;
rtk_uint32 regData;
/* 0xa436 = 0x8011 */
if((retVal = rtl8367c_setAsicPHYOCPReg(port, 0xA436, 0x8011)) != RT_ERR_OK)
return retVal;
/* wr 0xa438[15] = 0: disable, 1: enable */
if((retVal = rtl8367c_getAsicPHYOCPReg(port, 0xA438, &regData)) != RT_ERR_OK)
return retVal;
if(regData & 0x8000)
*green = ENABLED;
else
*green = DISABLED;
return RT_ERR_OK;
}
/*
@func ret_t | rtl8367c_setAsicPowerSaving | Set power saving mode
@parm rtk_uint32 | phy | phy number
@parm rtk_uint32 | enable | enable power saving mode.
@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 power saving mode per phy.
*/
ret_t rtl8367c_setAsicPowerSaving(rtk_uint32 phy, rtk_uint32 enable)
{
rtk_api_ret_t retVal;
rtk_uint32 phyData;
rtk_uint32 regData;
rtk_uint32 phy_status;
rtk_uint32 checkCounter;
if (enable > 1)
return RT_ERR_INPUT;
/* 0xa420[2:0] */
if((retVal = rtl8367c_getAsicPHYOCPReg(phy, 0xA420, &regData)) != RT_ERR_OK)
return retVal;
phy_status = (regData & 0x0007);
if(phy_status == 3)
{
/* 0xb820[4] = 1 */
if((retVal = rtl8367c_getAsicPHYOCPReg(phy, 0xB820, &regData)) != RT_ERR_OK)
return retVal;
regData |= (0x0001 << 4);
if((retVal = rtl8367c_setAsicPHYOCPReg(phy, 0xB820, regData)) != RT_ERR_OK)
return retVal;
/* wait 0xb800[6] = 1 */
checkCounter = 100;
while(checkCounter)
{
retVal = rtl8367c_getAsicPHYOCPReg(phy, 0xB800, &regData);
if( (retVal != RT_ERR_OK) || ((regData & 0x0040) != 0x0040) )
{
checkCounter --;
if(0 == checkCounter)
{
return RT_ERR_BUSYWAIT_TIMEOUT;
}
}
else
checkCounter = 0;
}
}
if ((retVal = rtl8367c_getAsicPHYReg(phy,PHY_POWERSAVING_REG,&phyData))!=RT_ERR_OK)
return retVal;
phyData = phyData & ~(0x0001 << 2);
phyData = phyData | (enable << 2);
if ((retVal = rtl8367c_setAsicPHYReg(phy,PHY_POWERSAVING_REG,phyData))!=RT_ERR_OK)
return retVal;
if(phy_status == 3)
{
/* 0xb820[4] = 0 */
if((retVal = rtl8367c_getAsicPHYOCPReg(phy, 0xB820, &regData)) != RT_ERR_OK)
return retVal;
regData &= ~(0x0001 << 4);
if((retVal = rtl8367c_setAsicPHYOCPReg(phy, 0xB820, regData)) != RT_ERR_OK)
return retVal;
/* wait 0xb800[6] = 0 */
checkCounter = 100;
while(checkCounter)
{
retVal = rtl8367c_getAsicPHYOCPReg(phy, 0xB800, &regData);
if( (retVal != RT_ERR_OK) || ((regData & 0x0040) != 0x0000) )
{
checkCounter --;
if(0 == checkCounter)
{
return RT_ERR_BUSYWAIT_TIMEOUT;
}
}
else
checkCounter = 0;
}
}
return RT_ERR_OK;
}
/*
@func ret_t | rtl8367c_getAsicPowerSaving | Get power saving mode
@parm rtk_uint32 | port | The port number
@parm rtk_uint32* | enable | enable power saving mode.
@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 power saving mode per phy.
*/
ret_t rtl8367c_getAsicPowerSaving(rtk_uint32 phy, rtk_uint32* enable)
{
rtk_api_ret_t retVal;
rtk_uint32 phyData;
if(NULL == enable)
return RT_ERR_NULL_POINTER;
if ((retVal = rtl8367c_getAsicPHYReg(phy,PHY_POWERSAVING_REG,&phyData))!=RT_ERR_OK)
return retVal;
if ((phyData & 0x0004) > 0)
*enable = 1;
else
*enable = 0;
return RT_ERR_OK;
}

View file

@ -0,0 +1,81 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (, 08 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : Field selector related functions
*
*/
#include <rtl8367c_asicdrv_hsb.h>
/* Function Name:
* rtl8367c_setAsicFieldSelector
* Description:
* Set user defined field selectors in HSB
* Input:
* index - index of field selector 0-15
* format - Format of field selector
* offset - Retrieving data offset
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_OUT_OF_RANGE - input parameter out of range
* Note:
* System support 16 user defined field selctors.
* Each selector can be enabled or disable. User can defined retrieving 16-bits in many predefiend
* standard l2/l3/l4 payload.
*/
ret_t rtl8367c_setAsicFieldSelector(rtk_uint32 index, rtk_uint32 format, rtk_uint32 offset)
{
rtk_uint32 regData;
if(index > RTL8367C_FIELDSEL_FORMAT_NUMBER)
return RT_ERR_OUT_OF_RANGE;
if(format >= FIELDSEL_FORMAT_END)
return RT_ERR_OUT_OF_RANGE;
regData = (((format << RTL8367C_FIELD_SELECTOR_FORMAT_OFFSET) & RTL8367C_FIELD_SELECTOR_FORMAT_MASK ) |
((offset << RTL8367C_FIELD_SELECTOR_OFFSET_OFFSET) & RTL8367C_FIELD_SELECTOR_OFFSET_MASK ));
return rtl8367c_setAsicReg(RTL8367C_FIELD_SELECTOR_REG(index), regData);
}
/* Function Name:
* rtl8367c_getAsicFieldSelector
* Description:
* Get user defined field selectors in HSB
* Input:
* index - index of field selector 0-15
* pFormat - Format of field selector
* pOffset - Retrieving data offset
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_getAsicFieldSelector(rtk_uint32 index, rtk_uint32* pFormat, rtk_uint32* pOffset)
{
ret_t retVal;
rtk_uint32 regData;
retVal = rtl8367c_getAsicReg(RTL8367C_FIELD_SELECTOR_REG(index), &regData);
if(retVal != RT_ERR_OK)
return retVal;
*pFormat = ((regData & RTL8367C_FIELD_SELECTOR_FORMAT_MASK) >> RTL8367C_FIELD_SELECTOR_FORMAT_OFFSET);
*pOffset = ((regData & RTL8367C_FIELD_SELECTOR_OFFSET_MASK) >> RTL8367C_FIELD_SELECTOR_OFFSET_OFFSET);
return RT_ERR_OK;
}

View file

@ -0,0 +1,474 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 38651 $
* $Date: 2016-02-27 14:32:56 +0800 (, 17 2016) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : I2C related functions
*
*/
#include <rtl8367c_asicdrv_i2c.h>
#include <rtk_error.h>
#include <rtk_types.h>
/* Function Name:
* rtl8367c_setAsicI2C_checkBusIdle
* Description:
* Check i2c bus status idle or not
* Input:
* None
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_BUSYWAIT_TIMEOUT - i2c bus is busy
* Note:
* This API can check i2c bus status.
*/
ret_t rtl8367c_setAsicI2C_checkBusIdle(void)
{
rtk_uint32 regData;
ret_t retVal;
if ((retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_M_I2C_CTL_STA_REG, RTL8367C_M_I2C_BUS_IDLE_OFFSET, &regData)) != RT_ERR_OK)
return retVal;
if(regData == 0x0001)
return RT_ERR_OK; /*i2c is idle*/
else
return RT_ERR_BUSYWAIT_TIMEOUT; /*i2c is busy*/
}
/* Function Name:
* rtl8367c_setAsicI2CStartCmd
* Description:
* Set I2C start command
* Input:
* None
* Output:
* None
* Return:
* RT_ERR_OK - Success
* Note:
* This API can set i2c start command ,start a i2c traffic .
*/
ret_t rtl8367c_setAsicI2CStartCmd(void)
{
rtk_uint32 regData;
ret_t retVal;
/* Bits [4-1] = 0b0000, Start Command; Bit [0] = 1, Trigger the Command */
if ((retVal = rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, &regData)) != RT_ERR_OK)
return retVal;
regData &= 0xFFE0;
regData |= 0x0001;
if ((retVal = rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, regData)) != RT_ERR_OK)
return retVal;
/* wait for command finished */
do{
if ((retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_M_I2C_CTL_STA_REG, RTL8367C_I2C_CMD_EXEC_OFFSET, &regData)) != RT_ERR_OK)
return retVal;
}while( regData != 0x0);
return RT_ERR_OK ;
}
/* Function Name:
* rtl8367c_setAsicI2CStopCmd
* Description:
* Set I2C stop command
* Input:
* None
* Output:
* None
* Return:
* RT_ERR_OK - Success
* Note:
* This API can set i2c stop command ,stop a i2c traffic.
*/
ret_t rtl8367c_setAsicI2CStopCmd(void)
{
rtk_uint32 regData;
ret_t retVal;
/* Bits [4-1] = 0b0001, Stop Command; Bit [0] = 1, Trigger the Command */
if ((retVal = rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, &regData)) != RT_ERR_OK)
return retVal;
regData &= 0xFFE0;
regData |= 0x0003;
if ((retVal = rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, regData)) != RT_ERR_OK)
return retVal;
/* wait for command finished */
do{
if ((retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_M_I2C_CTL_STA_REG, RTL8367C_I2C_CMD_EXEC_OFFSET, &regData)) != RT_ERR_OK)
return retVal;
}while( regData != 0x0);
return RT_ERR_OK ;
}
/* Function Name:
* rtl8367c_setAsicI2CTxOneCharCmd
* Description:
* Set I2C Tx a char command, with a 8-bit data
* Input:
* oneChar - 8-bit data
* Output:
* None
* Return:
* RT_ERR_OK - Success
* Note:
* This API can set i2c Tx command and with a 8-bit data.
*/
ret_t rtl8367c_setAsicI2CTxOneCharCmd(rtk_uint8 oneChar)
{
rtk_uint32 regData;
ret_t retVal;
/* Bits [4-1] = 0b0010, tx one char; Bit [0] = 1, Trigger the Command */
if ((retVal = rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, &regData)) != RT_ERR_OK)
return retVal;
regData &= 0xFFE0;
regData |= 0x0005;
regData &= 0x00FF;
regData |= (rtk_uint16) (oneChar << 8);
if ((retVal = rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, regData)) != RT_ERR_OK)
return retVal;
/* wait for command finished */
do{
if ((retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_M_I2C_CTL_STA_REG, RTL8367C_I2C_CMD_EXEC_OFFSET, &regData)) != RT_ERR_OK)
return retVal;
}while( regData != 0x0);
return RT_ERR_OK ;
}
/* Function Name:
* rtl8367c_setAsicI2CcheckRxAck
* Description:
* Check if rx an Ack
* Input:
* None
* Output:
* None
* Return:
* RT_ERR_OK - Success
* Note:
* This API can check if rx an ack from i2c slave.
*/
ret_t rtl8367c_setAsicI2CcheckRxAck(void)
{
rtk_uint32 regData;
ret_t retVal;
rtk_uint32 count = 0;
do{
count++;
if ((retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_M_I2C_CTL_STA_REG, RTL8367C_SLV_ACK_FLAG_OFFSET, &regData)) != RT_ERR_OK)
return retVal;
}while( (regData != 0x1) && (count < TIMEROUT_FOR_MICROSEMI) );
if(regData != 0x1)
return RT_ERR_FAILED;
else
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_setAsicI2CRxOneCharCmd
* Description:
* Set I2C Rx command and get 8-bit data
* Input:
* None
* Output:
* pValue - 8bit-data
* Return:
* RT_ERR_OK - Success
* Note:
* This API can set I2C Rx command and get 8-bit data.
*/
ret_t rtl8367c_setAsicI2CRxOneCharCmd(rtk_uint8 *pValue)
{
rtk_uint32 regData;
ret_t retVal;
/* Bits [4-1] = 0b0011, Rx one char; Bit [0] = 1, Trigger the Command */
if ((retVal = rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, &regData)) != RT_ERR_OK)
return retVal;
regData &= 0xFFE0;
regData |= 0x0007;
if ((retVal = rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, regData)) != RT_ERR_OK)
return retVal;
/* wait for command finished */
do{
if ((retVal = rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, &regData)) != RT_ERR_OK)
return retVal;
}while( (regData & 0x1) != 0x0);
*pValue = (rtk_uint8)(regData >> 8);
return RT_ERR_OK ;
}
/* Function Name:
* rtl8367c_setAsicI2CTxAckCmd
* Description:
* Set I2C Tx ACK command
* Input:
* None
* Output:
* None
* Return:
* RT_ERR_OK - Success
* Note:
* This API can set I2C Tx ack command.
*/
ret_t rtl8367c_setAsicI2CTxAckCmd(void)
{
rtk_uint32 regData;
ret_t retVal;
/* Bits [4-1] = 0b0100, tx ACK Command; Bit [0] = 1, Trigger the Command */
if ((retVal = rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, &regData)) != RT_ERR_OK)
return retVal;
regData &= 0xFFE0;
regData |= 0x0009;
if ((retVal = rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, regData)) != RT_ERR_OK)
return retVal;
/* wait for command finished */
do{
if ((retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_M_I2C_CTL_STA_REG, RTL8367C_I2C_CMD_EXEC_OFFSET, &regData)) != RT_ERR_OK)
return retVal;
}while( regData != 0x0);
return RT_ERR_OK ;
}
/* Function Name:
* rtl8367c_setAsicI2CTxNoAckCmd
* Description:
* Set I2C master Tx noACK command
* Input:
* None
* Output:
* None
* Return:
* RT_ERR_OK - Success
* Note:
* This API can set I2C master Tx noACK command.
*/
ret_t rtl8367c_setAsicI2CTxNoAckCmd(void)
{
rtk_uint32 regData;
ret_t retVal;
/* Bits [4-1] = 0b0101, tx noACK Command; Bit [0] = 1, Trigger the Command */
if ((retVal = rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, &regData)) != RT_ERR_OK)
return retVal;
regData &= 0xFFE0;
regData |= 0x000b;
if ((retVal = rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, regData)) != RT_ERR_OK)
return retVal;
/* wait for command finished */
do{
if ((retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_M_I2C_CTL_STA_REG, RTL8367C_I2C_CMD_EXEC_OFFSET, &regData)) != RT_ERR_OK)
return retVal;
}while( regData != 0x0);
return RT_ERR_OK ;
}
/* Function Name:
* rtl8367c_setAsicI2CSoftRSTseqCmd
* Description:
* set I2C master tx soft reset command
* Input:
* None
* Output:
* None
* Return:
* RT_ERR_OK - Success
* Note:
* This API can set I2C master tx soft reset command.
*/
ret_t rtl8367c_setAsicI2CSoftRSTseqCmd(void)
{
rtk_uint32 regData;
ret_t retVal;
/*Bits [4-1] = 0b0110, tx soft reset Command; Bit [0] = 1, Trigger the Command */
if ((retVal = rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, &regData)) != RT_ERR_OK)
return retVal;
regData &= 0xFFE0;
regData |= 0x000d;
if ((retVal = rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG, regData)) != RT_ERR_OK)
return retVal;
/* wait for command finished */
do{
if ((retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_M_I2C_CTL_STA_REG, RTL8367C_I2C_CMD_EXEC_OFFSET, &regData)) != RT_ERR_OK)
return retVal;
}while( regData != 0x0);
return RT_ERR_OK ;
}
/* Function Name:
* rtl8367c_setAsicI2CGpioPinGroup
* Description:
* set I2C function used gpio pins
* Input:
* pinGroup_ID - gpio pins group
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_INPUT _ Invalid input parameter
* Note:
* This API can set I2C function used gpio pins.
* There are three group gpio pins
*/
ret_t rtl8367c_setAsicI2CGpioPinGroup(rtk_uint32 pinGroup_ID)
{
rtk_uint32 regData;
ret_t retVal;
if ((retVal = rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_SYS_CTL, &regData)) != RT_ERR_OK)
return retVal;
if( pinGroup_ID==0 )
{
regData &= 0x0FFF;
regData |= 0x5000;
if ((retVal = rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_SYS_CTL, regData)) != RT_ERR_OK)
return retVal;
}
else if( pinGroup_ID==1 )
{
regData &= 0x0FFF;
regData |= 0xA000;
if ((retVal = rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_SYS_CTL, regData)) != RT_ERR_OK)
return retVal;
}
else if( pinGroup_ID==2 )
{
regData &= 0x0FFF;
regData |= 0xF000;
if ((retVal = rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_SYS_CTL, regData)) != RT_ERR_OK)
return retVal;
}
else
return RT_ERR_INPUT;
return RT_ERR_OK ;
}
/* Function Name:
* rtl8367c_setAsicI2CGpioPinGroup
* Description:
* set I2C function used gpio pins
* Input:
* pinGroup_ID - gpio pins group
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_INPUT _ Invalid input parameter
* Note:
* This API can set I2C function used gpio pins.
* There are three group gpio pins
*/
ret_t rtl8367c_getAsicI2CGpioPinGroup(rtk_uint32 * pPinGroup_ID)
{
rtk_uint32 regData;
ret_t retVal;
if( (retVal = rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_SYS_CTL, &regData)) != RT_ERR_OK)
return retVal;
regData &= 0xF000 ;
regData = (regData >> 12);
if( regData == 0x5 )
*pPinGroup_ID = 0;
else if(regData == 0xA)
*pPinGroup_ID = 1;
else if(regData == 0xF)
*pPinGroup_ID = 2;
else
return RT_ERR_FAILED;
return RT_ERR_OK ;
}

View file

@ -0,0 +1,164 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (, 08 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : Ingress bandwidth control related functions
*
*/
#include <rtl8367c_asicdrv_inbwctrl.h>
/* Function Name:
* rtl8367c_setAsicPortIngressBandwidth
* Description:
* Set per-port total ingress bandwidth
* Input:
* port - Physical port number (0~7)
* bandwidth - The total ingress bandwidth (unit: 8Kbps), 0x1FFFF:disable
* preifg - Include preamble and IFG, 0:Exclude, 1:Include
* enableFC - Action when input rate exceeds. 0: Drop 1: Flow Control
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* RT_ERR_OUT_OF_RANGE - input parameter out of range
* Note:
* None
*/
ret_t rtl8367c_setAsicPortIngressBandwidth(rtk_uint32 port, rtk_uint32 bandwidth, rtk_uint32 preifg, rtk_uint32 enableFC)
{
ret_t retVal;
rtk_uint32 regData;
rtk_uint32 regAddr;
/* Invalid input parameter */
if(port >= RTL8367C_PORTNO)
return RT_ERR_PORT_ID;
if(bandwidth > RTL8367C_QOS_GRANULARTY_MAX)
return RT_ERR_OUT_OF_RANGE;
regAddr = RTL8367C_INGRESSBW_PORT_RATE_LSB_REG(port);
regData = bandwidth & RTL8367C_QOS_GRANULARTY_LSB_MASK;
retVal = rtl8367c_setAsicReg(regAddr, regData);
if(retVal != RT_ERR_OK)
return retVal;
regAddr += 1;
regData = (bandwidth & RTL8367C_QOS_GRANULARTY_MSB_MASK) >> RTL8367C_QOS_GRANULARTY_MSB_OFFSET;
retVal = rtl8367c_setAsicRegBits(regAddr, RTL8367C_INGRESSBW_PORT0_RATE_CTRL1_INGRESSBW_RATE16_MASK, regData);
if(retVal != RT_ERR_OK)
return retVal;
regAddr = RTL8367C_PORT_MISC_CFG_REG(port);
retVal = rtl8367c_setAsicRegBit(regAddr, RTL8367C_PORT0_MISC_CFG_INGRESSBW_IFG_OFFSET, preifg);
if(retVal != RT_ERR_OK)
return retVal;
regAddr = RTL8367C_PORT_MISC_CFG_REG(port);
retVal = rtl8367c_setAsicRegBit(regAddr, RTL8367C_PORT0_MISC_CFG_INGRESSBW_FLOWCTRL_OFFSET, enableFC);
if(retVal != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_getAsicPortIngressBandwidth
* Description:
* Get per-port total ingress bandwidth
* Input:
* port - Physical port number (0~7)
* pBandwidth - The total ingress bandwidth (unit: 8Kbps), 0x1FFFF:disable
* pPreifg - Include preamble and IFG, 0:Exclude, 1:Include
* pEnableFC - Action when input rate exceeds. 0: Drop 1: Flow Control
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* Note:
* None
*/
ret_t rtl8367c_getAsicPortIngressBandwidth(rtk_uint32 port, rtk_uint32* pBandwidth, rtk_uint32* pPreifg, rtk_uint32* pEnableFC)
{
ret_t retVal;
rtk_uint32 regData;
rtk_uint32 regAddr;
/* Invalid input parameter */
if(port >= RTL8367C_PORTNO)
return RT_ERR_PORT_ID;
regAddr = RTL8367C_INGRESSBW_PORT_RATE_LSB_REG(port);
retVal = rtl8367c_getAsicReg(regAddr, &regData);
if(retVal != RT_ERR_OK)
return retVal;
*pBandwidth = regData;
regAddr += 1;
retVal = rtl8367c_getAsicRegBits(regAddr, RTL8367C_INGRESSBW_PORT0_RATE_CTRL1_INGRESSBW_RATE16_MASK, &regData);
if(retVal != RT_ERR_OK)
return retVal;
*pBandwidth |= (regData << RTL8367C_QOS_GRANULARTY_MSB_OFFSET);
regAddr = RTL8367C_PORT_MISC_CFG_REG(port);
retVal = rtl8367c_getAsicRegBit(regAddr, RTL8367C_PORT0_MISC_CFG_INGRESSBW_IFG_OFFSET, pPreifg);
if(retVal != RT_ERR_OK)
return retVal;
regAddr = RTL8367C_PORT_MISC_CFG_REG(port);
retVal = rtl8367c_getAsicRegBit(regAddr, RTL8367C_PORT0_MISC_CFG_INGRESSBW_FLOWCTRL_OFFSET, pEnableFC);
if(retVal != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_setAsicPortIngressBandwidthBypass
* Description:
* Set ingress bandwidth control bypasss 8899, RMA 01-80-C2-00-00-xx and IGMP
* Input:
* enabled - 1: enabled, 0: disabled
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_setAsicPortIngressBandwidthBypass(rtk_uint32 enabled)
{
return rtl8367c_setAsicRegBit(RTL8367C_REG_SW_DUMMY0, RTL8367C_INGRESSBW_BYPASS_EN_OFFSET, enabled);
}
/* Function Name:
* rtl8367c_getAsicPortIngressBandwidthBypass
* Description:
* Set ingress bandwidth control bypasss 8899, RMA 01-80-C2-00-00-xx and IGMP
* Input:
* pEnabled - 1: enabled, 0: disabled
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_getAsicPortIngressBandwidthBypass(rtk_uint32* pEnabled)
{
return rtl8367c_getAsicRegBit(RTL8367C_REG_SW_DUMMY0, RTL8367C_INGRESSBW_BYPASS_EN_OFFSET, pEnabled);
}

View file

@ -0,0 +1,205 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (, 08 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : Interrupt related functions
*
*/
#include <rtl8367c_asicdrv_interrupt.h>
/* Function Name:
* rtl8367c_setAsicInterruptPolarity
* Description:
* Set interrupt trigger polarity
* Input:
* polarity - 0:pull high 1: pull low
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_setAsicInterruptPolarity(rtk_uint32 polarity)
{
return rtl8367c_setAsicRegBit(RTL8367C_REG_INTR_CTRL, RTL8367C_INTR_CTRL_OFFSET, polarity);
}
/* Function Name:
* rtl8367c_getAsicInterruptPolarity
* Description:
* Get interrupt trigger polarity
* Input:
* pPolarity - 0:pull high 1: pull low
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_getAsicInterruptPolarity(rtk_uint32* pPolarity)
{
return rtl8367c_getAsicRegBit(RTL8367C_REG_INTR_CTRL, RTL8367C_INTR_CTRL_OFFSET, pPolarity);
}
/* Function Name:
* rtl8367c_setAsicInterruptMask
* Description:
* Set interrupt enable mask
* Input:
* imr - Interrupt mask
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_setAsicInterruptMask(rtk_uint32 imr)
{
return rtl8367c_setAsicReg(RTL8367C_REG_INTR_IMR, imr);
}
/* Function Name:
* rtl8367c_getAsicInterruptMask
* Description:
* Get interrupt enable mask
* Input:
* pImr - Interrupt mask
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_getAsicInterruptMask(rtk_uint32* pImr)
{
return rtl8367c_getAsicReg(RTL8367C_REG_INTR_IMR, pImr);
}
/* Function Name:
* rtl8367c_setAsicInterruptMask
* Description:
* Clear interrupt enable mask
* Input:
* ims - Interrupt status mask
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* This API can be used to clear ASIC interrupt status and register will be cleared by writting 1.
* [0]:Link change,
* [1]:Share meter exceed,
* [2]:Learn number overed,
* [3]:Speed Change,
* [4]:Tx special congestion
* [5]:1 second green feature
* [6]:loop detection
* [7]:interrupt from 8051
* [8]:Cable diagnostic finish
* [9]:ACL action interrupt trigger
* [11]: Silent Start
*/
ret_t rtl8367c_setAsicInterruptStatus(rtk_uint32 ims)
{
return rtl8367c_setAsicReg(RTL8367C_REG_INTR_IMS, ims);
}
/* Function Name:
* rtl8367c_getAsicInterruptStatus
* Description:
* Get interrupt enable mask
* Input:
* pIms - Interrupt status mask
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_getAsicInterruptStatus(rtk_uint32* pIms)
{
return rtl8367c_getAsicReg(RTL8367C_REG_INTR_IMS, pIms);
}
/* Function Name:
* rtl8367c_setAsicInterruptRelatedStatus
* Description:
* Clear interrupt status
* Input:
* type - per port Learn over, per-port speed change, per-port special congest, share meter exceed status
* status - exceed status, write 1 to clear
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_OUT_OF_RANGE - input parameter out of range
* Note:
* None
*/
ret_t rtl8367c_setAsicInterruptRelatedStatus(rtk_uint32 type, rtk_uint32 status)
{
CONST rtk_uint32 indicatorAddress[INTRST_END] = {RTL8367C_REG_LEARN_OVER_INDICATOR,
RTL8367C_REG_SPEED_CHANGE_INDICATOR,
RTL8367C_REG_SPECIAL_CONGEST_INDICATOR,
RTL8367C_REG_PORT_LINKDOWN_INDICATOR,
RTL8367C_REG_PORT_LINKUP_INDICATOR,
RTL8367C_REG_METER_OVERRATE_INDICATOR0,
RTL8367C_REG_METER_OVERRATE_INDICATOR1,
RTL8367C_REG_RLDP_LOOPED_INDICATOR,
RTL8367C_REG_RLDP_RELEASED_INDICATOR,
RTL8367C_REG_SYSTEM_LEARN_OVER_INDICATOR};
if(type >= INTRST_END )
return RT_ERR_OUT_OF_RANGE;
return rtl8367c_setAsicReg(indicatorAddress[type], status);
}
/* Function Name:
* rtl8367c_getAsicInterruptRelatedStatus
* Description:
* Get interrupt status
* Input:
* type - per port Learn over, per-port speed change, per-port special congest, share meter exceed status
* pStatus - exceed status, write 1 to clear
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_OUT_OF_RANGE - input parameter out of range
* Note:
* None
*/
ret_t rtl8367c_getAsicInterruptRelatedStatus(rtk_uint32 type, rtk_uint32* pStatus)
{
CONST rtk_uint32 indicatorAddress[INTRST_END] = {RTL8367C_REG_LEARN_OVER_INDICATOR,
RTL8367C_REG_SPEED_CHANGE_INDICATOR,
RTL8367C_REG_SPECIAL_CONGEST_INDICATOR,
RTL8367C_REG_PORT_LINKDOWN_INDICATOR,
RTL8367C_REG_PORT_LINKUP_INDICATOR,
RTL8367C_REG_METER_OVERRATE_INDICATOR0,
RTL8367C_REG_METER_OVERRATE_INDICATOR1,
RTL8367C_REG_RLDP_LOOPED_INDICATOR,
RTL8367C_REG_RLDP_RELEASED_INDICATOR,
RTL8367C_REG_SYSTEM_LEARN_OVER_INDICATOR};
if(type >= INTRST_END )
return RT_ERR_OUT_OF_RANGE;
return rtl8367c_getAsicReg(indicatorAddress[type], pStatus);
}

View file

@ -0,0 +1,727 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (, 08 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : LED related functions
*
*/
#include <rtl8367c_asicdrv_led.h>
/* Function Name:
* rtl8367c_setAsicLedIndicateInfoConfig
* Description:
* Set Leds indicated information mode
* Input:
* ledno - LED group number. There are 1 to 1 led mapping to each port in each led group
* config - Support 16 types configuration
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_OUT_OF_RANGE - input parameter out of range
* Note:
* The API can set LED indicated information configuration for each LED group with 1 to 1 led mapping to each port.
* Definition LED Statuses Description
* 0000 LED_Off LED pin Tri-State.
* 0001 Dup/Col Collision, Full duplex Indicator. Blinking every 43ms when collision happens. Low for full duplex, and high for half duplex mode.
* 0010 Link/Act Link, Activity Indicator. Low for link established. Link/Act Blinks every 43ms when the corresponding port is transmitting or receiving.
* 0011 Spd1000 1000Mb/s Speed Indicator. Low for 1000Mb/s.
* 0100 Spd100 100Mb/s Speed Indicator. Low for 100Mb/s.
* 0101 Spd10 10Mb/s Speed Indicator. Low for 10Mb/s.
* 0110 Spd1000/Act 1000Mb/s Speed/Activity Indicator. Low for 1000Mb/s. Blinks every 43ms when the corresponding port is transmitting or receiving.
* 0111 Spd100/Act 100Mb/s Speed/Activity Indicator. Low for 100Mb/s. Blinks every 43ms when the corresponding port is transmitting or receiving.
* 1000 Spd10/Act 10Mb/s Speed/Activity Indicator. Low for 10Mb/s. Blinks every 43ms when the corresponding port is transmitting or receiving.
* 1001 Spd100 (10)/Act 10/100Mb/s Speed/Activity Indicator. Low for 10/100Mb/s. Blinks every 43ms when the corresponding port is transmitting or receiving.
* 1010 Fiber Fiber link Indicator. Low for Fiber.
* 1011 Fault Auto-negotiation Fault Indicator. Low for Fault.
* 1100 Link/Rx Link, Activity Indicator. Low for link established. Link/Rx Blinks every 43ms when the corresponding port is transmitting.
* 1101 Link/Tx Link, Activity Indicator. Low for link established. Link/Tx Blinks every 43ms when the corresponding port is receiving.
* 1110 Master Link on Master Indicator. Low for link Master established.
* 1111 LED_Force Force LED output, LED output value reference
*/
ret_t rtl8367c_setAsicLedIndicateInfoConfig(rtk_uint32 ledno, rtk_uint32 config)
{
ret_t retVal;
CONST rtk_uint16 bits[RTL8367C_LEDGROUPNO] = {RTL8367C_LED0_CFG_MASK, RTL8367C_LED1_CFG_MASK, RTL8367C_LED2_CFG_MASK};
if(ledno >= RTL8367C_LEDGROUPNO)
return RT_ERR_OUT_OF_RANGE;
if(config >= LEDCONF_END)
return RT_ERR_OUT_OF_RANGE;
retVal = rtl8367c_setAsicRegBit(RTL8367C_REG_LED_CONFIGURATION, RTL8367C_LED_CONFIG_SEL_OFFSET, 0);
if(retVal != RT_ERR_OK)
return retVal;
return rtl8367c_setAsicRegBits(RTL8367C_REG_LED_CONFIGURATION, bits[ledno], config);
}
/* Function Name:
* rtl8367c_getAsicLedIndicateInfoConfig
* Description:
* Get Leds indicated information mode
* Input:
* ledno - LED group number. There are 1 to 1 led mapping to each port in each led group
* pConfig - Support 16 types configuration
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_OUT_OF_RANGE - input parameter out of range
* Note:
* None
*/
ret_t rtl8367c_getAsicLedIndicateInfoConfig(rtk_uint32 ledno, rtk_uint32* pConfig)
{
CONST rtk_uint16 bits[RTL8367C_LEDGROUPNO]= {RTL8367C_LED0_CFG_MASK, RTL8367C_LED1_CFG_MASK, RTL8367C_LED2_CFG_MASK};
if(ledno >= RTL8367C_LEDGROUPNO)
return RT_ERR_OUT_OF_RANGE;
/* Get register value */
return rtl8367c_getAsicRegBits(RTL8367C_REG_LED_CONFIGURATION, bits[ledno], pConfig);
}
/* Function Name:
* rtl8367c_setAsicLedGroupMode
* Description:
* Set Led Group mode
* Input:
* mode - LED mode
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_OUT_OF_RANGE - input parameter out of range
* Note:
* None
*/
ret_t rtl8367c_setAsicLedGroupMode(rtk_uint32 mode)
{
ret_t retVal;
/* Invalid input parameter */
if(mode >= RTL8367C_LED_MODE_END)
return RT_ERR_OUT_OF_RANGE;
retVal = rtl8367c_setAsicRegBit(RTL8367C_REG_LED_CONFIGURATION, RTL8367C_LED_CONFIG_SEL_OFFSET, 1);
if(retVal != RT_ERR_OK)
return retVal;
return rtl8367c_setAsicRegBits(RTL8367C_REG_LED_CONFIGURATION, RTL8367C_DATA_LED_MASK, mode);
}
/* Function Name:
* rtl8367c_getAsicLedGroupMode
* Description:
* Get Led Group mode
* Input:
* pMode - LED mode
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_getAsicLedGroupMode(rtk_uint32* pMode)
{
ret_t retVal;
rtk_uint32 regData;
retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_LED_CONFIGURATION, RTL8367C_LED_CONFIG_SEL_OFFSET, &regData);
if(retVal != RT_ERR_OK)
return retVal;
if(regData!=1)
return RT_ERR_FAILED;
return rtl8367c_getAsicRegBits(RTL8367C_REG_LED_CONFIGURATION, RTL8367C_DATA_LED_MASK, pMode);
}
/* Function Name:
* rtl8367c_setAsicForceLeds
* Description:
* Set group LED mode
* Input:
* port - Physical port number (0~7)
* group - LED group number
* mode - LED mode
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* RT_ERR_OUT_OF_RANGE - input parameter out of range
* Note:
* None
*/
ret_t rtl8367c_setAsicForceLed(rtk_uint32 port, rtk_uint32 group, rtk_uint32 mode)
{
rtk_uint16 regAddr;
ret_t retVal;
/* Invalid input parameter */
if(port > RTL8367C_PORTIDMAX)
return RT_ERR_PORT_ID;
if(group >= RTL8367C_LEDGROUPNO)
return RT_ERR_OUT_OF_RANGE;
if(mode >= LEDFORCEMODE_END)
return RT_ERR_OUT_OF_RANGE;
/* Set Related Registers */
if(port < 8){
regAddr = RTL8367C_LED_FORCE_MODE_BASE + (group << 1);
if((retVal = rtl8367c_setAsicRegBits(regAddr, 0x3 << (port * 2), mode)) != RT_ERR_OK)
return retVal;
}else if(port >= 8){
regAddr = RTL8367C_REG_CPU_FORCE_LED0_CFG1 + (group << 1);
if((retVal = rtl8367c_setAsicRegBits(regAddr, 0x3 << ((port-8) * 2), mode)) != RT_ERR_OK)
return retVal;
}
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_getAsicForceLed
* Description:
* Get group LED mode
* Input:
* port - Physical port number (0~7)
* group - LED group number
* pMode - LED mode
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* RT_ERR_OUT_OF_RANGE - input parameter out of range
* Note:
* None
*/
ret_t rtl8367c_getAsicForceLed(rtk_uint32 port, rtk_uint32 group, rtk_uint32* pMode)
{
rtk_uint16 regAddr;
ret_t retVal;
/* Invalid input parameter */
if(port > RTL8367C_PORTIDMAX)
return RT_ERR_PORT_ID;
if(group >= RTL8367C_LEDGROUPNO)
return RT_ERR_INPUT;
/* Get Related Registers */
if(port < 8){
regAddr = RTL8367C_LED_FORCE_MODE_BASE + (group << 1);
if((retVal = rtl8367c_getAsicRegBits(regAddr, 0x3 << (port * 2), pMode)) != RT_ERR_OK)
return retVal;
}else if(port >= 8){
regAddr = RTL8367C_REG_CPU_FORCE_LED0_CFG1 + (group << 1);
if((retVal = rtl8367c_getAsicRegBits(regAddr, 0x3 << ((port-8) * 2), pMode)) != RT_ERR_OK)
return retVal;
}
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_setAsicForceGroupLed
* Description:
* Turn on/off Led of all ports
* Input:
* group - LED group number
* mode - 0b00:normal mode, 0b01:force blink, 0b10:force off, 0b11:force on
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_OUT_OF_RANGE - input parameter out of range
* Note:
* None
*/
ret_t rtl8367c_setAsicForceGroupLed(rtk_uint32 groupmask, rtk_uint32 mode)
{
ret_t retVal;
rtk_uint32 i,bitmask;
CONST rtk_uint16 bits[3]= {0x0004,0x0010,0x0040};
/* Invalid input parameter */
if(groupmask > RTL8367C_LEDGROUPMASK)
return RT_ERR_OUT_OF_RANGE;
if(mode >= LEDFORCEMODE_END)
return RT_ERR_OUT_OF_RANGE;
bitmask = 0;
for(i = 0; i < RTL8367C_LEDGROUPNO; i++)
{
if(groupmask & (1 << i))
{
bitmask = bitmask | bits[i];
}
}
retVal = rtl8367c_setAsicRegBits(RTL8367C_LED_FORCE_CTRL, RTL8367C_LED_FORCE_MODE_MASK, bitmask);
retVal = rtl8367c_setAsicRegBits(RTL8367C_LED_FORCE_CTRL, RTL8367C_FORCE_MODE_MASK, mode);
if(LEDFORCEMODE_NORMAL == mode)
retVal = rtl8367c_setAsicRegBits(RTL8367C_LED_FORCE_CTRL, RTL8367C_LED_FORCE_MODE_MASK, 0);
return retVal;
}
/* Function Name:
* rtl8367c_getAsicForceGroupLed
* Description:
* Turn on/off Led of all ports
* Input:
* group - LED group number
* pMode - 0b00:normal mode, 0b01:force blink, 0b10:force off, 0b11:force on
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_getAsicForceGroupLed(rtk_uint32* groupmask, rtk_uint32* pMode)
{
ret_t retVal;
rtk_uint32 i,regData;
CONST rtk_uint16 bits[3] = {0x0004,0x0010,0x0040};
/* Get Related Registers */
if((retVal = rtl8367c_getAsicRegBits(RTL8367C_LED_FORCE_CTRL, RTL8367C_LED_FORCE_MODE_MASK, &regData)) != RT_ERR_OK)
return retVal;
for(i = 0; i< RTL8367C_LEDGROUPNO; i++)
{
if((regData & bits[i]) == bits[i])
{
*groupmask = *groupmask | (1 << i);
}
}
return rtl8367c_getAsicRegBits(RTL8367C_LED_FORCE_CTRL, RTL8367C_FORCE_MODE_MASK, pMode);
}
/* Function Name:
* rtl8367c_setAsicLedBlinkRate
* Description:
* Set led blinking rate at mode 0 to mode 3
* Input:
* blinkRate - Support 6 blink rates
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_OUT_OF_RANGE - input parameter out of range
* Note:
* LED blink rate can be at 43ms, 84ms, 120ms, 170ms, 340ms and 670ms
*/
ret_t rtl8367c_setAsicLedBlinkRate(rtk_uint32 blinkRate)
{
if(blinkRate >= LEDBLINKRATE_END)
return RT_ERR_OUT_OF_RANGE;
return rtl8367c_setAsicRegBits(RTL8367C_REG_LED_MODE, RTL8367C_SEL_LEDRATE_MASK, blinkRate);
}
/* Function Name:
* rtl8367c_getAsicLedBlinkRate
* Description:
* Get led blinking rate at mode 0 to mode 3
* Input:
* pBlinkRate - Support 6 blink rates
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_getAsicLedBlinkRate(rtk_uint32* pBlinkRate)
{
return rtl8367c_getAsicRegBits(RTL8367C_REG_LED_MODE, RTL8367C_SEL_LEDRATE_MASK, pBlinkRate);
}
/* Function Name:
* rtl8367c_setAsicLedForceBlinkRate
* Description:
* Set LEd blinking rate for force mode led
* Input:
* blinkRate - Support 6 blink rates
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_OUT_OF_RANGE - input parameter out of range
* Note:
* None
*/
ret_t rtl8367c_setAsicLedForceBlinkRate(rtk_uint32 blinkRate)
{
if(blinkRate >= LEDFORCERATE_END)
return RT_ERR_OUT_OF_RANGE;
return rtl8367c_setAsicRegBits(RTL8367C_REG_LED_MODE, RTL8367C_FORCE_RATE_MASK, blinkRate);
}
/* Function Name:
* rtl8367c_getAsicLedForceBlinkRate
* Description:
* Get LED blinking rate for force mode led
* Input:
* pBlinkRate - Support 6 blink rates
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_getAsicLedForceBlinkRate(rtk_uint32* pBlinkRate)
{
return rtl8367c_getAsicRegBits(RTL8367C_REG_LED_MODE, RTL8367C_FORCE_RATE_MASK, pBlinkRate);
}
/*
@func ret_t | rtl8367c_setAsicLedGroupEnable | Turn on/off Led of all system ports
@parm rtk_uint32 | group | LED group id.
@parm rtk_uint32 | portmask | LED port mask.
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error.
@rvalue RT_ERR_PORT_ID | Invalid port number.
@rvalue RT_ERR_INPUT | Invalid input value.
@comm
The API can turn on/off leds of dedicated port while indicated information configuration of LED group is set to force mode.
*/
ret_t rtl8367c_setAsicLedGroupEnable(rtk_uint32 group, rtk_uint32 portmask)
{
ret_t retVal;
rtk_uint32 regAddr;
rtk_uint32 regDataMask;
if ( group >= RTL8367C_LEDGROUPNO )
return RT_ERR_INPUT;
regAddr = RTL8367C_REG_PARA_LED_IO_EN1 + group/2;
regDataMask = 0xFF << ((group%2)*8);
retVal = rtl8367c_setAsicRegBits(regAddr, regDataMask, portmask&0xff);
if(retVal != RT_ERR_OK)
return retVal;
regAddr = RTL8367C_REG_PARA_LED_IO_EN3;
regDataMask = 0x3 << (group*2);
retVal = rtl8367c_setAsicRegBits(regAddr, regDataMask, (portmask>>8)&0x7);
if(retVal != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/*
@func ret_t | rtl8367c_getAsicLedGroupEnable | Get on/off status of Led of all system ports
@parm rtk_uint32 | group | LED group id.
@parm rtk_uint32 | *portmask | LED port mask.
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error.
@rvalue RT_ERR_PORT_ID | Invalid port number.
@rvalue RT_ERR_INPUT | Invalid input value.
@comm
The API can turn on/off leds of dedicated port while indicated information configuration of LED group is set to force mode.
*/
ret_t rtl8367c_getAsicLedGroupEnable(rtk_uint32 group, rtk_uint32 *portmask)
{
ret_t retVal;
rtk_uint32 regAddr;
rtk_uint32 regDataMask,regData;
if ( group >= RTL8367C_LEDGROUPNO )
return RT_ERR_INPUT;
regAddr = RTL8367C_REG_PARA_LED_IO_EN1 + group/2;
regDataMask = 0xFF << ((group%2)*8);
retVal = rtl8367c_getAsicRegBits(regAddr, regDataMask, portmask);
if(retVal != RT_ERR_OK)
return retVal;
regAddr = RTL8367C_REG_PARA_LED_IO_EN3;
regDataMask = 0x3 << (group*2);
retVal = rtl8367c_getAsicRegBits(regAddr, regDataMask, &regData);
if(retVal != RT_ERR_OK)
return retVal;
*portmask = (regData << 8) | *portmask;
return RT_ERR_OK;
}
/*
@func ret_t | rtl8367c_setAsicLedOperationMode | Set LED operation mode
@parm rtk_uint32 | mode | LED mode. 1:scan mode 1, 2:parallel mode, 3:mdx mode (serial mode)
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error.
@rvalue RT_ERR_INPUT | Invalid input value.
@comm
The API can turn on/off led serial mode and set signal to active high/low.
*/
ret_t rtl8367c_setAsicLedOperationMode(rtk_uint32 mode)
{
ret_t retVal;
/* Invalid input parameter */
if( mode >= LEDOP_END)
return RT_ERR_INPUT;
switch(mode)
{
case LEDOP_PARALLEL:
if((retVal = rtl8367c_setAsicRegBit(RTL8367C_REG_LED_SYS_CONFIG, RTL8367C_LED_SELECT_OFFSET, 0))!= RT_ERR_OK)
return retVal;
/*Disable serial CLK mode*/
if((retVal = rtl8367c_setAsicRegBit(RTL8367C_REG_SCAN0_LED_IO_EN1,RTL8367C_LED_SERI_CLK_EN_OFFSET, 0))!= RT_ERR_OK)
return retVal;
/*Disable serial DATA mode*/
if((retVal = rtl8367c_setAsicRegBit(RTL8367C_REG_SCAN0_LED_IO_EN1,RTL8367C_LED_SERI_DATA_EN_OFFSET, 0))!= RT_ERR_OK)
return retVal;
break;
case LEDOP_SERIAL:
if((retVal = rtl8367c_setAsicRegBit(RTL8367C_REG_LED_SYS_CONFIG, RTL8367C_LED_SELECT_OFFSET, 1))!= RT_ERR_OK)
return retVal;
/*Enable serial CLK mode*/
if((retVal = rtl8367c_setAsicRegBit(RTL8367C_REG_SCAN0_LED_IO_EN1,RTL8367C_LED_SERI_CLK_EN_OFFSET, 1))!= RT_ERR_OK)
return retVal;
/*Enable serial DATA mode*/
if((retVal = rtl8367c_setAsicRegBit(RTL8367C_REG_SCAN0_LED_IO_EN1,RTL8367C_LED_SERI_DATA_EN_OFFSET, 1))!= RT_ERR_OK)
return retVal;
break;
default:
return RT_ERR_INPUT;
break;
}
return RT_ERR_OK;
}
/*
@func ret_t | rtl8367c_getAsicLedOperationMode | Get LED OP mode setup
@parm rtk_uint32*| mode | LED mode. 1:scan mode 1, 2:parallel mode, 3:mdx mode (serial mode)
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error.
@rvalue RT_ERR_INPUT | Invalid input value.
@comm
The API can get LED serial mode setup and get signal active high/low.
*/
ret_t rtl8367c_getAsicLedOperationMode(rtk_uint32 *mode)
{
ret_t retVal;
rtk_uint32 regData;
if((retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_LED_SYS_CONFIG, RTL8367C_LED_SELECT_OFFSET, &regData))!= RT_ERR_OK)
return retVal;
if (regData == 1)
*mode = LEDOP_SERIAL;
else if (regData == 0)
*mode = LEDOP_PARALLEL;
else
return RT_ERR_FAILED;
return RT_ERR_OK;
}
/*
@func ret_t | rtl8367c_setAsicLedSerialModeConfig | Set LED serial mode
@parm rtk_uint32 | active | Active High or Low.
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error.
@rvalue RT_ERR_INPUT | Invalid input value.
@comm
The API can turn on/off led serial mode and set signal to active high/low.
*/
ret_t rtl8367c_setAsicLedSerialModeConfig(rtk_uint32 active, rtk_uint32 serimode)
{
ret_t retVal;
/* Invalid input parameter */
if( active >= LEDSERACT_MAX)
return RT_ERR_INPUT;
if( serimode >= LEDSER_MAX)
return RT_ERR_INPUT;
/* Set Active High or Low */
if((retVal = rtl8367c_setAsicRegBit(RTL8367C_REG_LED_SYS_CONFIG, RTL8367C_SERI_LED_ACT_LOW_OFFSET, active)) != RT_ERR_OK)
return retVal;
/*set to 8G mode (not 16G mode)*/
if((retVal = rtl8367c_setAsicRegBit(RTL8367C_REG_LED_MODE, RTL8367C_DLINK_TIME_OFFSET, serimode))!= RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/*
@func ret_t | rtl8367c_getAsicLedSerialModeConfig | Get LED serial mode setup
@parm rtk_uint32*| active | Active High or Low.
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error.
@rvalue RT_ERR_INPUT | Invalid input value.
@comm
The API can get LED serial mode setup and get signal active high/low.
*/
ret_t rtl8367c_getAsicLedSerialModeConfig(rtk_uint32 *active, rtk_uint32 *serimode)
{
ret_t retVal;
if((retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_LED_SYS_CONFIG, RTL8367C_SERI_LED_ACT_LOW_OFFSET, active))!= RT_ERR_OK)
return retVal;
/*get to 8G mode (not 16G mode)*/
if((retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_LED_MODE, RTL8367C_DLINK_TIME_OFFSET, serimode))!= RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/*
@func ret_t | rtl8367c_setAsicLedOutputEnable | Set LED output enable
@parm rtk_uint32 | enabled | enable or disalbe.
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error.
@rvalue RT_ERR_INPUT | Invalid input value.
@comm
The API can turn on/off LED output Enable
*/
ret_t rtl8367c_setAsicLedOutputEnable(rtk_uint32 enabled)
{
ret_t retVal;
rtk_uint32 regdata;
if (enabled == 1)
regdata = 0;
else
regdata = 1;
/* Enable/Disable H/W IGMP/MLD */
retVal = rtl8367c_setAsicRegBit(RTL8367C_REG_LED_SYS_CONFIG, RTL8367C_LED_IO_DISABLE_OFFSET, regdata);
return retVal;
}
/*
@func ret_t | rtl8367c_getAsicLedOutputEnable | Get LED serial mode setup
@parm rtk_uint32*| active | Active High or Low.
@rvalue RT_ERR_OK | Success.
@rvalue RT_ERR_SMI | SMI access error.
@rvalue RT_ERR_INPUT | Invalid input value.
@comm
The API can get LED serial mode setup and get signal active high/low.
*/
ret_t rtl8367c_getAsicLedOutputEnable(rtk_uint32 *ptr_enabled)
{
ret_t retVal;
rtk_uint32 regdata;
retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_LED_SYS_CONFIG, RTL8367C_LED_IO_DISABLE_OFFSET, &regdata);
if (retVal != RT_ERR_OK)
return retVal;
if (regdata == 1)
*ptr_enabled = 0;
else
*ptr_enabled = 1;
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_setAsicLedSerialOutput
* Description:
* Set serial LED output group and portmask.
* Input:
* output - Serial LED output group
* pmask - Serial LED output portmask
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_OUT_OF_RANGE - input parameter out of range
* Note:
* None
*/
ret_t rtl8367c_setAsicLedSerialOutput(rtk_uint32 output, rtk_uint32 pmask)
{
ret_t retVal;
retVal = rtl8367c_setAsicRegBits(RTL8367C_REG_SERIAL_LED_CTRL, RTL8367C_SERIAL_LED_GROUP_NUM_MASK, output);
if (retVal != RT_ERR_OK)
return retVal;
retVal = rtl8367c_setAsicRegBits(RTL8367C_REG_SERIAL_LED_CTRL, RTL8367C_SERIAL_LED_PORT_EN_MASK, pmask);
if (retVal != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_getAsicLedSerialOutput
* Description:
* Get serial LED output group and portmask.
* Input:
* None
* Output:
* pOutput - Serial LED output group
* pPmask - Serial LED output portmask
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_OUT_OF_RANGE - input parameter out of range
* Note:
* None
*/
ret_t rtl8367c_getAsicLedSerialOutput(rtk_uint32 *pOutput, rtk_uint32 *pPmask)
{
ret_t retVal;
if(pOutput == NULL)
return RT_ERR_NULL_POINTER;
if(pPmask == NULL)
return RT_ERR_NULL_POINTER;
retVal = rtl8367c_getAsicRegBits(RTL8367C_REG_SERIAL_LED_CTRL, RTL8367C_SERIAL_LED_GROUP_NUM_MASK, pOutput);
if (retVal != RT_ERR_OK)
return retVal;
retVal = rtl8367c_getAsicRegBits(RTL8367C_REG_SERIAL_LED_CTRL, RTL8367C_SERIAL_LED_PORT_EN_MASK, pPmask);
if (retVal != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}

View file

@ -0,0 +1,305 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (, 08 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : Shared meter related functions
*
*/
#include <rtl8367c_asicdrv_meter.h>
/* Function Name:
* rtl8367c_setAsicShareMeter
* Description:
* Set meter configuration
* Input:
* index - hared meter index (0-31)
* rate - 17-bits rate of share meter, unit is 8Kpbs
* ifg - Including IFG in rate calculation, 1:include 0:exclude
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_FILTER_METER_ID - Invalid meter
* Note:
* None
*/
ret_t rtl8367c_setAsicShareMeter(rtk_uint32 index, rtk_uint32 rate, rtk_uint32 ifg)
{
ret_t retVal;
if(index > RTL8367C_METERMAX)
return RT_ERR_FILTER_METER_ID;
if(index < 32)
{
/*19-bits Rate*/
retVal = rtl8367c_setAsicReg(RTL8367C_METER_RATE_REG(index), rate&0xFFFF);
if(retVal != RT_ERR_OK)
return retVal;
retVal = rtl8367c_setAsicReg(RTL8367C_METER_RATE_REG(index) + 1, (rate &0x70000) >> 16);
if(retVal != RT_ERR_OK)
return retVal;
retVal = rtl8367c_setAsicRegBit(RTL8367C_METER_IFG_CTRL_REG(index), RTL8367C_METER_IFG_OFFSET(index), ifg);
if(retVal != RT_ERR_OK)
return retVal;
}
else
{
/*19-bits Rate*/
retVal = rtl8367c_setAsicReg(RTL8367C_REG_METER32_RATE_CTRL0 + ((index-32) << 1), rate&0xFFFF);
if(retVal != RT_ERR_OK)
return retVal;
retVal = rtl8367c_setAsicReg(RTL8367C_REG_METER32_RATE_CTRL0 + ((index-32) << 1) + 1, (rate &0x70000) >> 16);
if(retVal != RT_ERR_OK)
return retVal;
retVal = rtl8367c_setAsicRegBit(RTL8367C_REG_METER_IFG_CTRL2 + ((index-32) >> 4), RTL8367C_METER_IFG_OFFSET(index), ifg);
if(retVal != RT_ERR_OK)
return retVal;
}
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_getAsicShareMeter
* Description:
* Get meter configuration
* Input:
* index - hared meter index (0-31)
* pRate - 17-bits rate of share meter, unit is 8Kpbs
* pIfg - Including IFG in rate calculation, 1:include 0:exclude
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_FILTER_METER_ID - Invalid meter
* Note:
* None
*/
ret_t rtl8367c_getAsicShareMeter(rtk_uint32 index, rtk_uint32 *pRate, rtk_uint32 *pIfg)
{
rtk_uint32 regData;
rtk_uint32 regData2;
ret_t retVal;
if(index > RTL8367C_METERMAX)
return RT_ERR_FILTER_METER_ID;
if(index < 32)
{
/*17-bits Rate*/
retVal = rtl8367c_getAsicReg(RTL8367C_METER_RATE_REG(index), &regData);
if(retVal != RT_ERR_OK)
return retVal;
retVal = rtl8367c_getAsicReg(RTL8367C_METER_RATE_REG(index) + 1, &regData2);
if(retVal != RT_ERR_OK)
return retVal;
*pRate = ((regData2 << 16) & 0x70000) | regData;
/*IFG*/
retVal = rtl8367c_getAsicRegBit(RTL8367C_METER_IFG_CTRL_REG(index), RTL8367C_METER_IFG_OFFSET(index), pIfg);
return retVal;
}
else
{
/*17-bits Rate*/
retVal = rtl8367c_getAsicReg(RTL8367C_REG_METER32_RATE_CTRL0 + ((index-32) << 1), &regData);
if(retVal != RT_ERR_OK)
return retVal;
retVal = rtl8367c_getAsicReg(RTL8367C_REG_METER32_RATE_CTRL0 + ((index-32) << 1) + 1, &regData2);
if(retVal != RT_ERR_OK)
return retVal;
*pRate = ((regData2 << 16) & 0x70000) | regData;
/*IFG*/
retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_METER_IFG_CTRL2 + ((index-32) >> 4), RTL8367C_METER_IFG_OFFSET(index), pIfg);
return retVal;
}
}
/* Function Name:
* rtl8367c_setAsicShareMeterBucketSize
* Description:
* Set meter related leaky bucket threshold
* Input:
* index - hared meter index (0-31)
* lbthreshold - Leaky bucket threshold of meter
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_FILTER_METER_ID - Invalid meter
* Note:
* None
*/
ret_t rtl8367c_setAsicShareMeterBucketSize(rtk_uint32 index, rtk_uint32 lbthreshold)
{
if(index > RTL8367C_METERMAX)
return RT_ERR_FILTER_METER_ID;
if(index < 32)
return rtl8367c_setAsicReg(RTL8367C_METER_BUCKET_SIZE_REG(index), lbthreshold);
else
return rtl8367c_setAsicReg(RTL8367C_REG_METER32_BUCKET_SIZE + index - 32, lbthreshold);
}
/* Function Name:
* rtl8367c_getAsicShareMeterBucketSize
* Description:
* Get meter related leaky bucket threshold
* Input:
* index - hared meter index (0-31)
* pLbthreshold - Leaky bucket threshold of meter
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_FILTER_METER_ID - Invalid meter
* Note:
* None
*/
ret_t rtl8367c_getAsicShareMeterBucketSize(rtk_uint32 index, rtk_uint32 *pLbthreshold)
{
if(index > RTL8367C_METERMAX)
return RT_ERR_FILTER_METER_ID;
if(index < 32)
return rtl8367c_getAsicReg(RTL8367C_METER_BUCKET_SIZE_REG(index), pLbthreshold);
else
return rtl8367c_getAsicReg(RTL8367C_REG_METER32_BUCKET_SIZE + index - 32, pLbthreshold);
}
/* Function Name:
* rtl8367c_setAsicShareMeterType
* Description:
* Set meter Type
* Input:
* index - shared meter index (0-31)
* Type - 0: kbps, 1: pps
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_FILTER_METER_ID - Invalid meter
* Note:
* None
*/
ret_t rtl8367c_setAsicShareMeterType(rtk_uint32 index, rtk_uint32 type)
{
rtk_uint32 reg;
if(index > RTL8367C_METERMAX)
return RT_ERR_FILTER_METER_ID;
if(index < 32)
reg = RTL8367C_REG_METER_MODE_SETTING0 + (index / 16);
else
reg = RTL8367C_REG_METER_MODE_SETTING2 + ((index - 32) / 16);
return rtl8367c_setAsicRegBit(reg, index % 16, type);
}
/* Function Name:
* rtl8367c_getAsicShareMeterType
* Description:
* Get meter Type
* Input:
* index - shared meter index (0-31)
* Output:
* pType - 0: kbps, 1: pps
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_FILTER_METER_ID - Invalid meter
* Note:
* None
*/
ret_t rtl8367c_getAsicShareMeterType(rtk_uint32 index, rtk_uint32 *pType)
{
rtk_uint32 reg;
if(index > RTL8367C_METERMAX)
return RT_ERR_FILTER_METER_ID;
if(NULL == pType)
return RT_ERR_NULL_POINTER;
if(index < 32)
reg = RTL8367C_REG_METER_MODE_SETTING0 + (index / 16);
else
reg = RTL8367C_REG_METER_MODE_SETTING2 + ((index - 32) / 16);
return rtl8367c_getAsicRegBit(reg, index % 16, pType);
}
/* Function Name:
* rtl8367c_setAsicMeterExceedStatus
* Description:
* Clear shared meter status
* Input:
* index - hared meter index (0-31)
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_FILTER_METER_ID - Invalid meter
* Note:
* None
*/
ret_t rtl8367c_setAsicMeterExceedStatus(rtk_uint32 index)
{
if(index > RTL8367C_METERMAX)
return RT_ERR_FILTER_METER_ID;
if(index < 32)
return rtl8367c_setAsicRegBit(RTL8367C_METER_OVERRATE_INDICATOR_REG(index), RTL8367C_METER_EXCEED_OFFSET(index), 1);
else
return rtl8367c_setAsicRegBit(RTL8367C_REG_METER_OVERRATE_INDICATOR2 + ((index - 32) >> 4), RTL8367C_METER_EXCEED_OFFSET(index), 1);
}
/* Function Name:
* rtl8367c_getAsicMeterExceedStatus
* Description:
* Get shared meter status
* Input:
* index - hared meter index (0-31)
* pStatus - 0: rate doesn't exceed 1: rate exceeds
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_FILTER_METER_ID - Invalid meter
* Note:
* If rate is over rate*8Kbps of a meter, the state bit of this meter is set to 1.
*/
ret_t rtl8367c_getAsicMeterExceedStatus(rtk_uint32 index, rtk_uint32* pStatus)
{
if(index > RTL8367C_METERMAX)
return RT_ERR_FILTER_METER_ID;
if(index < 32)
return rtl8367c_getAsicRegBit(RTL8367C_METER_OVERRATE_INDICATOR_REG(index), RTL8367C_METER_EXCEED_OFFSET(index), pStatus);
else
return rtl8367c_getAsicRegBit(RTL8367C_REG_METER_OVERRATE_INDICATOR2 + ((index - 32) >> 4), RTL8367C_METER_EXCEED_OFFSET(index), pStatus);
}

View file

@ -0,0 +1,570 @@
/*
* Copyright (C) 2013 Realtek Semiconductor Corp.
* All Rights Reserved.
*
* Unless you and Realtek execute a separate written software license
* agreement governing use of this software, this software is licensed
* to you under the terms of the GNU General Public License version 2,
* available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*
* $Revision: 76306 $
* $Date: 2017-03-08 15:13:58 +0800 (, 08 2017) $
*
* Purpose : RTL8367C switch high-level API for RTL8367C
* Feature : MIB related functions
*
*/
#include <rtl8367c_asicdrv_mib.h>
/* Function Name:
* rtl8367c_setAsicMIBsCounterReset
* Description:
* Reset global/queue manage or per-port MIB counter
* Input:
* greset - Global reset
* qmreset - Queue maganement reset
* portmask - Port reset mask
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_setAsicMIBsCounterReset(rtk_uint32 greset, rtk_uint32 qmreset, rtk_uint32 portmask)
{
ret_t retVal;
rtk_uint32 regData;
rtk_uint32 regBits;
regBits = RTL8367C_GLOBAL_RESET_MASK |
RTL8367C_QM_RESET_MASK |
RTL8367C_MIB_PORT07_MASK |
((rtk_uint32)0x7 << 13);
regData = ((greset << RTL8367C_GLOBAL_RESET_OFFSET) & RTL8367C_GLOBAL_RESET_MASK) |
((qmreset << RTL8367C_QM_RESET_OFFSET) & RTL8367C_QM_RESET_MASK) |
(((portmask & 0xFF) << RTL8367C_PORT0_RESET_OFFSET) & RTL8367C_MIB_PORT07_MASK) |
(((portmask >> 8)&0x7) << 13);
retVal = rtl8367c_setAsicRegBits(RTL8367C_REG_MIB_CTRL0, regBits, (regData >> RTL8367C_PORT0_RESET_OFFSET));
return retVal;
}
/* Function Name:
* rtl8367c_getAsicMIBsCounter
* Description:
* Get MIBs counter
* Input:
* port - Physical port number (0~7)
* mibIdx - MIB counter index
* pCounter - MIB retrived counter
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_PORT_ID - Invalid port number
* RT_ERR_BUSYWAIT_TIMEOUT - MIB is busy at retrieving
* RT_ERR_STAT_CNTR_FAIL - MIB is resetting
* Note:
* Before MIBs counter retrieving, writting accessing address to ASIC at first and check the MIB
* control register status. If busy bit of MIB control is set, that means MIB counter have been
* waiting for preparing, then software must wait atfer this busy flag reset by ASIC. This driver
* did not recycle reading user desired counter. Software must use driver again to get MIB counter
* if return value is not RT_ERR_OK.
*/
ret_t rtl8367c_getAsicMIBsCounter(rtk_uint32 port, RTL8367C_MIBCOUNTER mibIdx, rtk_uint64* pCounter)
{
ret_t retVal;
rtk_uint32 regAddr;
rtk_uint32 regData;
rtk_uint32 mibAddr;
rtk_uint32 mibOff=0;
/* address offset to MIBs counter */
CONST rtk_uint16 mibLength[RTL8367C_MIBS_NUMBER]= {
4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
4,2,2,2,2,2,2,2,2,
4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};
rtk_uint16 i;
rtk_uint64 mibCounter;
if(port > RTL8367C_PORTIDMAX)
return RT_ERR_PORT_ID;
if(mibIdx >= RTL8367C_MIBS_NUMBER)
return RT_ERR_STAT_INVALID_CNTR;
if(dot1dTpLearnedEntryDiscards == mibIdx)
{
mibAddr = RTL8367C_MIB_LEARNENTRYDISCARD_OFFSET;
}
else
{
i = 0;
mibOff = RTL8367C_MIB_PORT_OFFSET * port;
if(port > 7)
mibOff = mibOff + 68;
while(i < mibIdx)
{
mibOff += mibLength[i];
i++;
}
mibAddr = mibOff;
}
/*writing access counter address first*/
/*This address is SRAM address, and SRAM address = MIB register address >> 2*/
/*then ASIC will prepare 64bits counter wait for being retrived*/
/*Write Mib related address to access control register*/
retVal = rtl8367c_setAsicReg(RTL8367C_REG_MIB_ADDRESS, (mibAddr >> 2));
if(retVal != RT_ERR_OK)
return retVal;
/* polling busy flag */
i = 100;
while(i > 0)
{
/*read MIB control register*/
retVal = rtl8367c_getAsicReg(RTL8367C_MIB_CTRL_REG,&regData);
if(retVal != RT_ERR_OK)
return retVal;
if((regData & RTL8367C_MIB_CTRL0_BUSY_FLAG_MASK) == 0)
{
break;
}
i--;
}
if(regData & RTL8367C_MIB_CTRL0_BUSY_FLAG_MASK)
return RT_ERR_BUSYWAIT_TIMEOUT;
if(regData & RTL8367C_RESET_FLAG_MASK)
return RT_ERR_STAT_CNTR_FAIL;
mibCounter = 0;
i = mibLength[mibIdx];
if(4 == i)
regAddr = RTL8367C_MIB_COUNTER_BASE_REG + 3;
else
regAddr = RTL8367C_MIB_COUNTER_BASE_REG + ((mibOff + 1) % 4);
while(i)
{
retVal = rtl8367c_getAsicReg(regAddr, &regData);
if(retVal != RT_ERR_OK)
return retVal;
mibCounter = (mibCounter << 16) | (regData & 0xFFFF);
regAddr --;
i --;
}
*pCounter = mibCounter;
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_getAsicMIBsLogCounter
* Description:
* Get MIBs Loggin counter
* Input:
* index - The index of 32 logging counter (0 ~ 31)
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_ENTRY_INDEX - Wrong index
* RT_ERR_BUSYWAIT_TIMEOUT - MIB is busy at retrieving
* RT_ERR_STAT_CNTR_FAIL - MIB is resetting
* Note:
* This API get 32 logging counter
*/
ret_t rtl8367c_getAsicMIBsLogCounter(rtk_uint32 index, rtk_uint32 *pCounter)
{
ret_t retVal;
rtk_uint32 regAddr;
rtk_uint32 regData;
rtk_uint32 mibAddr;
rtk_uint16 i;
rtk_uint64 mibCounter;
if(index > RTL8367C_MIB_MAX_LOG_CNT_IDX)
return RT_ERR_ENTRY_INDEX;
mibAddr = RTL8367C_MIB_LOG_CNT_OFFSET + ((index / 2) * 4);
retVal = rtl8367c_setAsicReg(RTL8367C_REG_MIB_ADDRESS, (mibAddr >> 2));
if(retVal != RT_ERR_OK)
return retVal;
/*read MIB control register*/
retVal = rtl8367c_getAsicReg(RTL8367C_MIB_CTRL_REG, &regData);
if(retVal != RT_ERR_OK)
return retVal;
if(regData & RTL8367C_MIB_CTRL0_BUSY_FLAG_MASK)
return RT_ERR_BUSYWAIT_TIMEOUT;
if(regData & RTL8367C_RESET_FLAG_MASK)
return RT_ERR_STAT_CNTR_FAIL;
mibCounter = 0;
if((index % 2) == 1)
regAddr = RTL8367C_MIB_COUNTER_BASE_REG + 3;
else
regAddr = RTL8367C_MIB_COUNTER_BASE_REG + 1;
for(i = 0; i <= 1; i++)
{
retVal = rtl8367c_getAsicReg(regAddr, &regData);
if(retVal != RT_ERR_OK)
return retVal;
mibCounter = (mibCounter << 16) | (regData & 0xFFFF);
regAddr --;
}
*pCounter = mibCounter;
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_getAsicMIBsControl
* Description:
* Get MIB control register
* Input:
* pMask - MIB control status mask bit[0]-busy bit[1]
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* Software need to check this control register atfer doing port resetting or global resetting
*/
ret_t rtl8367c_getAsicMIBsControl(rtk_uint32* pMask)
{
ret_t retVal;
rtk_uint32 regData;
retVal = rtl8367c_getAsicReg(RTL8367C_MIB_CTRL_REG, &regData);
if(retVal != RT_ERR_OK)
return retVal;
*pMask = regData & (RTL8367C_MIB_CTRL0_BUSY_FLAG_MASK | RTL8367C_RESET_FLAG_MASK);
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_setAsicMIBsResetValue
* Description:
* Reset all counter to 0 or 1
* Input:
* value - Reset to value 0 or 1
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_setAsicMIBsResetValue(rtk_uint32 value)
{
return rtl8367c_setAsicRegBit(RTL8367C_REG_MIB_CTRL0, RTL8367C_RESET_VALUE_OFFSET, value);
}
/* Function Name:
* rtl8367c_getAsicMIBsResetValue
* Description:
* Reset all counter to 0 or 1
* Input:
* value - Reset to value 0 or 1
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_getAsicMIBsResetValue(rtk_uint32* value)
{
return rtl8367c_getAsicRegBit(RTL8367C_REG_MIB_CTRL0, RTL8367C_RESET_VALUE_OFFSET, value);
}
/* Function Name:
* rtl8367c_setAsicMIBsUsageMode
* Description:
* MIB update mode
* Input:
* mode - 1: latch all MIBs by timer 0:normal free run counting
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_setAsicMIBsUsageMode(rtk_uint32 mode)
{
return rtl8367c_setAsicRegBit(RTL8367C_REG_MIB_CTRL4, RTL8367C_MIB_USAGE_MODE_OFFSET, mode);
}
/* Function Name:
* rtl8367c_getAsicMIBsUsageMode
* Description:
* MIB update mode
* Input:
* pMode - 1: latch all MIBs by timer 0:normal free run counting
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_getAsicMIBsUsageMode(rtk_uint32* pMode)
{
return rtl8367c_getAsicRegBit(RTL8367C_REG_MIB_CTRL4, RTL8367C_MIB_USAGE_MODE_OFFSET, pMode);
}
/* Function Name:
* rtl8367c_setAsicMIBsTimer
* Description:
* MIB latching timer
* Input:
* timer - latch timer, unit 1 second
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_setAsicMIBsTimer(rtk_uint32 timer)
{
return rtl8367c_setAsicRegBits(RTL8367C_REG_MIB_CTRL4, RTL8367C_MIB_TIMER_MASK, timer);
}
/* Function Name:
* rtl8367c_getAsicMIBsTimer
* Description:
* MIB latching timer
* Input:
* pTimer - latch timer, unit 1 second
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* Note:
* None
*/
ret_t rtl8367c_getAsicMIBsTimer(rtk_uint32* pTimer)
{
return rtl8367c_getAsicRegBits(RTL8367C_REG_MIB_CTRL4, RTL8367C_MIB_TIMER_MASK, pTimer);
}
/* Function Name:
* rtl8367c_setAsicMIBsLoggingMode
* Description:
* MIB logging counter mode
* Input:
* index - logging counter mode index (0~15)
* mode - 0:32-bits mode 1:64-bits mode
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_OUT_OF_RANGE - input parameter out of range
* Note:
* None
*/
ret_t rtl8367c_setAsicMIBsLoggingMode(rtk_uint32 index, rtk_uint32 mode)
{
if(index > RTL8367C_MIB_MAX_LOG_MODE_IDX)
return RT_ERR_OUT_OF_RANGE;
return rtl8367c_setAsicRegBit(RTL8367C_REG_MIB_CTRL3, index,mode);
}
/* Function Name:
* rtl8367c_getAsicMIBsLoggingMode
* Description:
* MIB logging counter mode
* Input:
* index - logging counter mode index (0~15)
* pMode - 0:32-bits mode 1:64-bits mode
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_OUT_OF_RANGE - input parameter out of range
* Note:
* None
*/
ret_t rtl8367c_getAsicMIBsLoggingMode(rtk_uint32 index, rtk_uint32* pMode)
{
if(index > RTL8367C_MIB_MAX_LOG_MODE_IDX)
return RT_ERR_OUT_OF_RANGE;
return rtl8367c_getAsicRegBit(RTL8367C_REG_MIB_CTRL3, index,pMode);
}
/* Function Name:
* rtl8367c_setAsicMIBsLoggingType
* Description:
* MIB logging counter type
* Input:
* index - logging counter mode index (0~15)
* type - 0:Packet count 1:Byte count
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_OUT_OF_RANGE - input parameter out of range
* Note:
* None
*/
ret_t rtl8367c_setAsicMIBsLoggingType(rtk_uint32 index, rtk_uint32 type)
{
if(index > RTL8367C_MIB_MAX_LOG_MODE_IDX)
return RT_ERR_OUT_OF_RANGE;
return rtl8367c_setAsicRegBit(RTL8367C_REG_MIB_CTRL5, index,type);
}
/* Function Name:
* rtl8367c_getAsicMIBsLoggingType
* Description:
* MIB logging counter type
* Input:
* index - logging counter mode index (0~15)
* pType - 0:Packet count 1:Byte count
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_OUT_OF_RANGE - input parameter out of range
* Note:
* None
*/
ret_t rtl8367c_getAsicMIBsLoggingType(rtk_uint32 index, rtk_uint32* pType)
{
if(index > RTL8367C_MIB_MAX_LOG_MODE_IDX)
return RT_ERR_OUT_OF_RANGE;
return rtl8367c_getAsicRegBit(RTL8367C_REG_MIB_CTRL5, index,pType);
}
/* Function Name:
* rtl8367c_setAsicMIBsResetLoggingCounter
* Description:
* MIB logging counter type
* Input:
* index - logging counter index (0~31)
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_OUT_OF_RANGE - input parameter out of range
* Note:
* None
*/
ret_t rtl8367c_setAsicMIBsResetLoggingCounter(rtk_uint32 index)
{
ret_t retVal;
if(index > RTL8367C_MIB_MAX_LOG_CNT_IDX)
return RT_ERR_OUT_OF_RANGE;
if(index < 16)
retVal = rtl8367c_setAsicReg(RTL8367C_REG_MIB_CTRL1, 1<<index);
else
retVal = rtl8367c_setAsicReg(RTL8367C_REG_MIB_CTRL2, 1<<(index-16));
return retVal;
}
/* Function Name:
* rtl8367c_setAsicMIBsLength
* Description:
* Set MIB length couting mode
* Input:
* txLengthMode - 0: tag length doesn't be counted. 1: tag length is counted.
* rxLengthMode - 0: tag length doesn't be counted. 1: tag length is counted.
* Output:
* None
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_OUT_OF_RANGE - input parameter out of range
* Note:
* None
*/
ret_t rtl8367c_setAsicMIBsLength(rtk_uint32 txLengthMode, rtk_uint32 rxLengthMode)
{
ret_t retVal;
if( (retVal = rtl8367c_setAsicRegBit(RTL8367C_REG_MIB_RMON_LEN_CTRL, RTL8367C_TX_LENGTH_CTRL_OFFSET, txLengthMode)) != RT_ERR_OK)
return retVal;
if( (retVal = rtl8367c_setAsicRegBit(RTL8367C_REG_MIB_RMON_LEN_CTRL, RTL8367C_RX_LENGTH_CTRL_OFFSET, rxLengthMode)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}
/* Function Name:
* rtl8367c_setAsicMIBsLength
* Description:
* Set MIB length couting mode
* Input:
* None.
* Output:
* pTxLengthMode - 0: tag length doesn't be counted. 1: tag length is counted.
* pRxLengthMode - 0: tag length doesn't be counted. 1: tag length is counted.
* Return:
* RT_ERR_OK - Success
* RT_ERR_SMI - SMI access error
* RT_ERR_OUT_OF_RANGE - input parameter out of range
* Note:
* None
*/
ret_t rtl8367c_getAsicMIBsLength(rtk_uint32 *pTxLengthMode, rtk_uint32 *pRxLengthMode)
{
ret_t retVal;
if( (retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_MIB_RMON_LEN_CTRL, RTL8367C_TX_LENGTH_CTRL_OFFSET, pTxLengthMode)) != RT_ERR_OK)
return retVal;
if( (retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_MIB_RMON_LEN_CTRL, RTL8367C_RX_LENGTH_CTRL_OFFSET, pRxLengthMode)) != RT_ERR_OK)
return retVal;
return RT_ERR_OK;
}

Some files were not shown because too many files have changed in this diff Show more