#ifndef _RTL8370_ASICDRV_SVLAN_H_
#define _RTL8370_ASICDRV_SVLAN_H_

#include <rtl8370_asicdrv.h>

#define RTL8370_C2SIDXNO                     128
#define RTL8370_C2SIDXMAX                   (RTL8370_C2SIDXNO-1)
#define RTL8370_MC2SIDXNO                  32
#define RTL8370_MC2SIDXMAX                 (RTL8370_MC2SIDXNO-1)
#define RTL8370_SP2CIDXNO                       128
#define RTL8370_SP2CMAX                      (RTL8370_SP2CIDXNO-1)


enum RTL8370_SPRISEL
{
    SPRISEL_INTERNALPRI =  0,
    SPRISEL_CTAGPRI,
    SPRISEL_VSPRI,
    SPRISEL_MAX
};

typedef struct  rtl8370_svlan_memconf_s{

    uint16 vs_relaysvid:12;
    uint16 vs_msti:4;
    
    uint16 vs_member;

    uint16 vs_fid:12;
    uint16 vs_priority:3;
    
    uint16 vs_svid:12;  
    uint16 vs_efiden:1; 
    uint16 vs_efid:3;   

}rtl8370_svlan_memconf_t;

typedef struct  rtl8370_svlan_memconf_smi_s{
#ifdef _LITTLE_ENDIAN
    uint16 vs_relaysvid:12;
    uint16 vs_msti:4;
    
    uint16 vs_member;

    uint16 vs_fid:12;
    uint16 vs_priority:3;
    uint16 reserved:1;
    
    uint16 vs_svid:12;  
    uint16 vs_efiden:1; 
    uint16 vs_efid:3;   

#else
    uint16 vs_msti:4;
    uint16 vs_relaysvid:12;
    
    uint16 vs_member;

    uint16 reserved:1;
    uint16 vs_priority:3;
    uint16 vs_fid:12;
    
    uint16 vs_efid:3;   
    uint16 vs_efiden:1; 
    uint16 vs_svid:12;  

#endif
}rtl8370_svlan_memconf_smi_t;


typedef struct  rtl8370_svlan_c2s_smi_s{

#ifdef _LITTLE_ENDIAN

    uint16 svidx:6;
    uint16 reserved:10;
    
    uint16 c2senPmsk;
    
    uint16 evid:13;
    uint16 reserved2:3;
    
#else

    uint16 reserved:10;
    uint16 svidx:6;
    
    uint16 c2senPmsk;
    
    uint16 reserved2:3;
    uint16 evid:13;

#endif
}rtl8370_svlan_c2s_smi_t;


typedef struct  rtl8370_svlan_mc2s_s{

    uint16 valid:1; 
    uint16 format:1;
    uint16 svidx:6;	
    uint32 value;
    uint32 mask;
}rtl8370_svlan_mc2s_t;

typedef struct  rtl8370_svlan_mc2s_smi_s{

#ifdef _LITTLE_ENDIAN

    uint16 svidx:6;
    uint16 format:1;
    uint16 valid:1; 
    uint16 reserved:8;

    uint16 mask0:8;
    uint16 mask1:8;
	
    uint16 mask2:8;
    uint16 mask3:8;

    uint16 data0:8;
    uint16 data1:8;
	
    uint16 data2:8;
    uint16 data3:8;	

#else
    uint16 reserved:8;
    uint16 valid:1; 
    uint16 format:1;
    uint16 svidx:6;

    uint16 mask1:8;
    uint16 mask0:8;
	
    uint16 mask3:8;
    uint16 mask2:8;

    uint16 data1:8;
    uint16 data0:8;
	
    uint16 data3:8;
    uint16 data2:8;
    
#endif
}rtl8370_svlan_mc2s_smi_t;

typedef struct  rtl8370_svlan_s2c_s{

    uint16 svid:12; 
    uint16 dstport:4;
    uint32 evid:13;
}rtl8370_svlan_s2c_t;

typedef struct  rtl8370_svlan_s2c_smi_s{

#ifdef _LITTLE_ENDIAN

    uint16 dstport:4;
    uint16 svid:12;
    uint16 evid:13; 
    uint16 reserved:3;
#else
    uint16 svid:12;
    uint16 dstport:4; 
    uint16 reserved:3;	
    uint16 evid:13;    
#endif
}rtl8370_svlan_s2c_smi_t;


extern ret_t rtl8370_setAsicSvlanIngressUntag(uint32 enabled);
extern ret_t rtl8370_getAsicSvlanIngressUntag(uint32* enabled);
extern ret_t rtl8370_setAsicSvlanIngressUnmatch(uint32 enabled);
extern ret_t rtl8370_getAsicSvlanIngressUnmatch(uint32* enabled);
extern ret_t rtl8370_setAsicSvlanTrapPriority(uint32 priority);
extern ret_t rtl8370_getAsicSvlanTrapPriority(uint32* priority);
extern ret_t rtl8370_setAsicSvlanDefaultVlan(uint32 index);
extern ret_t rtl8370_getAsicSvlanDefaultVlan(uint32* index);

extern ret_t rtl8370_setAsicSvlanMemberConfiguration(uint32 index,rtl8370_svlan_memconf_t* svlanMemConf);
extern ret_t rtl8370_getAsicSvlanMemberConfiguration(uint32 index,rtl8370_svlan_memconf_t* svlanMemConf);

extern ret_t rtl8370_setAsicSvlanPrioritySel(uint32 prisel);
extern ret_t rtl8370_getAsicSvlanPrioritySel(uint32* prisel);
extern ret_t rtl8370_setAsicSvlanTpid(uint32 protocolType);
extern ret_t rtl8370_getAsicSvlanTpid(uint32* protocolType);
extern ret_t rtl8370_setAsicSvlanUplinkPortMask(uint32 portMask);
extern ret_t rtl8370_getAsicSvlanUplinkPortMask(uint32* portMask);
extern ret_t rtl8370_setAsicSvlanEgressUnassign(uint32 enabled);
extern ret_t rtl8370_getAsicSvlanEgressUnassign(uint32* enabled);
extern ret_t rtl8370_setAsicSvlanC2SConf(uint32 index,uint32 evid, uint32 pmsk, uint32 svidx);
extern ret_t rtl8370_getAsicSvlanC2SConf(uint32 index,uint32* evid, uint32* pmsk, uint32* svidx);
extern ret_t rtl8370_setAsicSvlanMC2SConf(uint32 index,rtl8370_svlan_mc2s_t* svlanMC2SConf);
extern ret_t rtl8370_getAsicSvlanMC2SConf(uint32 index,rtl8370_svlan_mc2s_t* svlanMC2SConf);
extern ret_t rtl8370_setAsicSvlanSP2CConf(uint32 index,rtl8370_svlan_s2c_t* svlanSP2CConf);
extern ret_t rtl8370_getAsicSvlanSP2CConf(uint32 index,rtl8370_svlan_s2c_t* svlanSP2CConf);	
#endif /*#ifndef _RTL8370_ASICDRV_SVLAN_H_*/