#ifndef _RTL8370_ASICDRV_H_
#define _RTL8370_ASICDRV_H_

#include <rtk_types.h>
#include <rtl8370_reg.h>
#include <rtl8370_base.h>
#include <rtk_error.h>

#define RTL8370_REGBITLENGTH               16
#define RTL8370_REGDATAMAX                 0xFFFF

#define RTL8370_VIDMAX                     0xFFF
#define RTL8370_EVIDMAX                    0x1FFF
#define RTL8370_CVLANMCNO                  32
#define RTL8370_CVIDXMAX                   (RTL8370_CVLANMCNO-1)

#define RTL8370_PRIMAX                     7

#define RTL8370_PRIDECMAX                  0xFF

#define RTL8370_PORTNO                     16   
#define RTL8370_PORTIDMAX                  (RTL8370_PORTNO-1)
#define RTL8370_PMSKMAX                    ((1<<(RTL8370_PORTNO))-1) 
#define RTL8370_PORTMASK                   0xFFFF

#define RTL8370_SVIDXNO                    64
#define RTL8370_SVIDXMAX                   (RTL8370_SVIDXNO-1)
#define RTL8370_MSTIMAX                    15  

#define RTL8370_METERNO                    64
#define RTL8370_METERMAX                   (RTL8370_METERNO-1)

#define RTL8370_QUEUENO                    8
#define RTL8370_QIDMAX                     (RTL8370_QUEUENO-1)       


#define RTL8370_PHY_BUSY_CHECK_COUNTER     1000    
#define RTL8370_PHYNO                      8 
#define RTL8370_PHYIDMAX                  (RTL8370_PHYNO-1)

#define RTL8370_QOS_GRANULARTY_MAX         0x1FFFF
#define RTL8370_QOS_GRANULARTY_LSB_MASK    0xFFFF
#define RTL8370_QOS_GRANULARTY_LSB_OFFSET  0
#define RTL8370_QOS_GRANULARTY_MSB_MASK    0x10000
#define RTL8370_QOS_GRANULARTY_MSB_OFFSET  16

#define RTL8370_QOS_GRANULARTY_UNIT_KBPS   8

#define RTL8370_QOS_RATE_INPUT_MAX         (0x1FFFF * 8)
#define RTL8370_QOS_RATE_INPUT_MIN         8

#define RTL8370_QUEUE_MASK                 0xFF

#define RTL8370_EFIDMAX                    0x7
#define RTL8370_FIDMAX                     0xFFF

/* the above macro is generated by genDotH */
#define RTL8370_VALID_REG_NO               3236

/*=======================================================================
 *  Enum
 *========================================================================*/
enum RTL8370_TABLE_ACCESS_OP
{
    TB_OP_READ = 0,
    TB_OP_WRITE
};

enum RTL8370_TABLE_ACCESS_TARGET
{
    TB_TARGET_ACLRULE = 1,
    TB_TARGET_ACLACT,
    TB_TARGET_CVLAN,
    TB_TARGET_L2
};

#define RTL8370_TABLE_ACCESS_REG_DATA(op, target)    ((op << 4) | target)

/*=======================================================================
 *  Structures
 *========================================================================*/


typedef struct   smi_ether_addr_s{

#ifdef _LITTLE_ENDIAN
    uint16  mac0:8;
    uint16  mac1:8;
    uint16  mac2:8;
    uint16  mac3:8;
    uint16  mac4:8;
    uint16  mac5:8;
#else
    uint16  mac1:8;
    uint16  mac0:8;
    uint16  mac3:8;
    uint16  mac2:8;
    uint16  mac5:8;
    uint16  mac4:8;
#endif

}smi_ether_addr_t;


#ifdef __cplusplus
extern "C" {
#endif

extern ret_t rtl8370_setAsicRegBit(uint32 reg, uint32 bitNum, uint32 value);
extern ret_t rtl8370_getAsicRegBit(uint32 reg, uint32 bitNum, uint32 *value);

extern ret_t rtl8370_setAsicRegBits(uint32 reg, uint32 bits, uint32 value);
extern ret_t rtl8370_getAsicRegBits(uint32 reg, uint32 bits, uint32 *value);

extern ret_t rtl8370_setAsicReg(uint32 reg, uint32 value);
extern ret_t rtl8370_getAsicReg(uint32 reg, uint32 *value);

#ifdef __cplusplus
}
#endif



#endif /*#ifndef _RTL8370_ASICDRV_H_*/