[rdkb][common][bsp][Refactor and sync kernel from openwrt]

[Description]
9627c280 [CRITICAL][kernel][mt7988][eth][Fix issue of PSE hanging when the internal 2.5G PHY connection is disconnected]
ef2c790d [openwrt][common][config][Add AN8855 dsa and gsw config in alphabetical order]
97f46542 [MAC80211][hnat][Improve ETH to ETH performace in an unbalanced PHY rate test for mt7981/7986]
ab061242 [openwrt][common][bsp][Add support to reset boot count of dual image booting]
dff562ec [openwrt][common][bsp][Refactor dual image related patches]
4041ddc5 [CRITICAL][kernel][mt7988][eth][Increase CDM2 guard band settings to 4KB]
d8bd64af [kernel][mt7981][eth][Fix issue of GMAC RX hanging when internal GPHY connect to a legacy 10M/Half hub]
f8e2de72 [CRITICAL][kernel][mt7988][eth][Fix issue of transmitting abnormal data for SGMII]
84c34a72 [openwrt][mt7988][crypto][Fix 3 PPE issue for IPSec]
2f5b874e [MAC80211][hnat][Fix issue of multiple PPEs unbind for ETH in mt7981/7986]
15456702 [openwrt][common][network][Upgrade lldpd from 1.0.17 release 2 to release 3]
3d01da2e [openwrt][common][app][Fix switch cmd netlink issue on mt7988]
8d49660c [kernel][common][dts][Fix the mt7981 with an8855 syntax error dts]
88339b3b [kernel][common][hnat][Fix HNAT BIND issue with entry index 0x3fff]
9c805693 [openwrt][common][app][Add an8855 switch command support]
4cadd12b [openwrt][common][app][Refactor switch command to support switches with different design]
ba8a98e4 [kernel][common][net][Add AN8855 dsa and gsw driver]
6adb18b9 [kernel][common][hnat][Add PPE config to compare source PSE port as hit condition]
99170889 [kernel][common][eth][Add the new firmware for Aquantia AQR113C and CUX3410]
f634629e [kernel][mt7988][eth][macsec: Remove CK_TOP_NETSYS_TOPS_400M_SEL since it's not relevant]
f868325b [kernel][common][eth][Add Aquantia CUX3410 support]
6f2ddbf0 [openwrt][mt7988][tops][fix 3 PPE feature issue]
ff49cc9f [kernel][common][Refactor network backport patch path]
2c9fda11 [kernel][mtd/spi/nmbm/phy/][Change pending-5.4 & backport-5.4 files to correct folder]

[Release-log]

Change-Id: I793a18f2f96f185687080a0fb6b55379995b0398
diff --git a/recipes-devtools/switch/files/src/Makefile b/recipes-devtools/switch/files/src/Makefile
index 81ae127..1d88a8c 100644
--- a/recipes-devtools/switch/files/src/Makefile
+++ b/recipes-devtools/switch/files/src/Makefile
@@ -1,6 +1,10 @@
 EXEC = switch
 
 SRC=switch_fun.c switch_753x.c switch_ioctl.c switch_netlink.c
+SRC+=switch_fun_an8855.c an8855_sdk/api/src/*.c
+
+CFLAGS+=-I./an8855_sdk/api/inc
+CFLAGS+=-DCOMPAT_MODE
 
 all: $(EXEC)
 
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air.h b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air.h
new file mode 100644
index 0000000..c62174f
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air.h
@@ -0,0 +1,216 @@
+/* FILE NAME:   air.h

+ * PURPOSE:

+ *      Define the initialization in AIR SDK.

+ * NOTES:

+ */

+

+#ifndef AIR_H

+#define AIR_H

+

+/* INCLUDE FILE DECLARATIONS

+ */

+#include <stdio.h>

+#include <string.h>

+#include "air_types.h"

+#include "air_error.h"

+#include "air_reg.h"

+#include "air_aml.h"

+#include "air_port.h"

+#include "air_vlan.h"

+#include "air_lag.h"

+#include "air_l2.h"

+#include "air_stp.h"

+#include "air_mirror.h"

+#include "air_mib.h"

+#include "air_diag.h"

+#include "air_led.h"

+#include "air_cmd.h"

+#include "air_qos.h"

+#include "air_switch.h"

+#include "air_ver.h"

+#include "air_sec.h"

+#include "air_acl.h"

+#include "air_sptag.h"

+

+/* NAMING CONSTANT DECLARATIONS

+ */

+

+/* MACRO FUNCTION DECLARATIONS

+ */

+#define AIR_CHECK_PTR(__ptr__) do                                          \

+{                                                                           \

+    if (NULL == (__ptr__))                                                  \

+    {                                                                       \

+        return  AIR_E_BAD_PARAMETER;                                       \

+    }                                                                       \

+} while (0)

+

+#define AIR_PARAM_CHK(expr, errCode) do                                    \

+{                                                                           \

+    if ((I32_T)(expr))                                                      \

+    {                                                                       \

+        return errCode;                                                     \

+    }                                                                       \

+} while (0)

+

+#define AIR_PRINT(fmt,...) do                                              \

+{                                                                           \

+    if (_ext_printf)                                                        \

+    {                                                                       \

+        _ext_printf(fmt, ##__VA_ARGS__);                                    \

+    }                                                                       \

+}while (0)

+

+#define AIR_UDELAY(us) do                                                  \

+{                                                                           \

+    if (_ext_udelay)                                                        \

+    {                                                                       \

+        _ext_udelay(us);                                                    \

+    }                                                                       \

+}while (0)

+

+#define AIR_MALLOC(size) (_ext_malloc ? _ext_malloc(size) : NULL)

+

+#define AIR_FREE(ptr) do                                                   \

+    {                                                                       \

+        if (ptr && _ext_free)                                               \

+        {                                                                   \

+            _ext_free(ptr);                                                 \

+        }                                                                   \

+    }while (0)

+

+#ifndef BIT

+#define BIT(nr) (1UL << (nr))

+#endif	/* End of BIT */

+

+/* bits range: for example BITS(16,23) = 0xFF0000*/

+#ifndef BITS

+#define BITS(m, n)   (~(BIT(m) - 1) & ((BIT(n) - 1) | BIT(n)))

+#endif	/* End of BITS */

+

+/* bits range: for example BITS_RANGE(16,4) = 0x0F0000*/

+#ifndef BITS_RANGE

+#define BITS_RANGE(offset, range)   BITS(offset, ((offset)+(range)-1))

+#endif	/* End of BITS_RANGE */

+

+/* bits offset right: for example BITS_OFF_R(0x1234, 8, 4) = 0x2 */

+#ifndef BITS_OFF_R

+#define BITS_OFF_R(val, offset, range)   ((val >> offset) & (BIT(range) - 1))

+#endif	/* End of BITS_OFF_R */

+

+/* bits offset left: for example BITS_OFF_L(0x1234, 8, 4) = 0x400 */

+#ifndef BITS_OFF_L

+#define BITS_OFF_L(val, offset, range)   ((val & (BIT(range) - 1)) << offset)

+#endif	/* End of BITS_OFF_L */

+

+#ifndef MAX

+#define MAX(a, b)   (((a)>(b))?(a):(b))

+#endif	/* End of MAX */

+

+#ifndef MIN

+#define MIN(a, b)   (((a)<(b))?(a):(b))

+#endif	/* End of MIN */

+

+/* DATA TYPE DECLARATIONS

+ */

+typedef AIR_ERROR_NO_T

+(*AIR_PRINTF)(

+    C8_T* fmt,

+    ...);

+

+typedef void

+(*AIR_UDELAY)(

+    UI32_T us);

+

+typedef void*

+(*AIR_MALLOC)(

+    UI32_T size);

+

+typedef void

+(*AIR_FREE)(

+    void *ptr);

+

+typedef struct

+{

+    AML_DEV_ACCESS_T    dev_access;

+    AIR_PRINTF         printf;

+    AIR_UDELAY         udelay;

+    AIR_MALLOC         malloc;

+    AIR_FREE           free;

+}AIR_INIT_PARAM_T;

+

+/* EXPORTED SUBPROGRAM SPECIFICATIONS

+ */

+extern AIR_PRINTF _ext_printf;

+extern AIR_UDELAY _ext_udelay;

+extern AIR_MALLOC _ext_malloc;

+extern AIR_FREE   _ext_free;

+

+

+/* FUNCTION NAME:   air_init

+ * PURPOSE:

+ *      This API is used to initialize the SDK.

+ *

+ * INPUT:

+ *      unit            --  The device unit

+ *      ptr_init_param  --  The sdk callback functions.

+ *

+ * OUTPUT:

+ *      None

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_OTHERS

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_init(

+    const UI32_T unit,

+    AIR_INIT_PARAM_T *ptr_init_param);

+

+/* FUNCTION NAME:   air_hw_reset

+ * PURPOSE:

+ *      This API is used to reset hardware.

+ *

+ * INPUT:

+ *      unit            --  The device unit

+ *

+ * OUTPUT:

+ *      None

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_OTHERS

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_hw_reset(

+    const UI32_T unit);

+

+/* FUNCTION NAME:   air_set_gpio_pin_mux

+ * PURPOSE:

+ *      This API is used to set gpio pin mux.

+ *

+ * INPUT:

+ *      unit            --  The device unit

+ *

+ * OUTPUT:

+ *      None

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_OTHERS

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_set_gpio_pin_mux(

+    const UI32_T unit);

+

+#endif  /* AIR_H */

+

diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_acl.h b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_acl.h
new file mode 100644
index 0000000..f4ea6c9
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_acl.h
@@ -0,0 +1,1245 @@
+/* FILE NAME: air_acl.h
+ * PURPOSE:
+ *      Define the ACL function in AIR SDK.
+ *
+ * NOTES:
+ *      None
+ */
+
+#ifndef AIR_ACL_H
+#define AIR_ACL_H
+
+/* INCLUDE FILE DECLARATIONS
+*/
+
+/* NAMING CONSTANT DECLARATIONS
+*/
+#define ACL_MAX_BUSY_TIME            (20)
+#define ACL_MAX_RULE_NUM             (128)
+#define ACL_MAX_ACTION_NUM           (128)
+#define ACL_MAX_TRTCM_NUM            (32)
+#define ACL_MAX_MIB_NUM              (64)
+#define ACL_MAX_UDF_NUM              (16)
+#define ACL_MAX_METER_NUM            (32)
+#define ACL_MAX_MIR_SESSION_NUM      (2)
+#define ACL_MAX_TOKEN_NUM            (0xffff)
+#define ACL_MAX_VLAN_NUM             (4096)
+#define ACL_MAX_DROP_PCD_NUM         (8)
+#define ACL_MAX_CLASS_SLR_NUM        (8)
+#define ACL_MAX_ATTACK_RATE_NUM      (96)
+#define ACL_MAX_WORD_OFST_NUM        (128)
+#define ACL_MAX_CMP_PAT_NUM          (0xffff)
+#define ACL_MAX_CMP_BIT_NUM          (0xffff)
+#define ACL_MAX_CBS_NUM              (0xffff)
+#define ACL_MAX_CIR_NUM              (0xffff)
+#define ACL_MAX_PBS_NUM              (0xffff)
+#define ACL_MAX_PIR_NUM              (0xffff)
+
+#define ACL_EN_MASK                  (0x1)
+#define ACL_MEM_CFG_DONE_OFFSET      (31)
+#define ACL_MEM_CFG_RULE_ID_OFFSET   (16)
+#define ACL_MEM_CFG_TCAM_CELL_OFFSET (12)
+#define ACL_MEM_CFG_DATA_BN_OFFSET   (8)
+#define ACL_MEM_CFG_MEM_SEL_OFFSET   (4)
+#define ACL_MEM_CFG_FUNC_SEL_OFFSET  (1)
+#define ACL_MEM_CFG_EN               (1)
+
+#define ACL_MIB_SEL_OFFSET           (4)
+#define ACL_MIB_CLEAR                (1)
+#define ACL_MIB_SEL_MASK             (0x3f)
+#define ACL_TRTCM_EN_OFFSET          (31)
+#define ACL_TRTCM_BUSY_OFFSET        (31)
+#define ACL_TRTCM_WRITE              (1U << 27)
+#define ACL_TRTCM_READ               (0U << 27)
+#define ACL_TRTCM_ID_OFFSET          (0)
+#define ACL_TRTCM_ID_MASK            (0x1f)
+#define ACL_TRTCM_CBS_MASK           (0xffff)
+#define ACL_TRTCM_EBS_MASK           (0xffff)
+#define ACL_TRTCM_CIR_MASK           (0xffff)
+#define ACL_TRTCM_EIR_MASK           (0xffff)
+#define ACL_RATE_BUSY_OFFSET         (31)
+#define ACL_RATE_WRITE               (1U << 30)
+#define ACL_RATE_READ                (0U << 30)
+#define ACL_RATE_ID_OFFSET           (20)
+#define ACL_RATE_ID_MASK             (0x1f)
+#define ACL_RATE_EN_OFFSET           (19)
+#define ACL_RATE_EN                  (1U << 19)
+#define ACL_RATE_DIS                 (0U << 19)
+#define ACL_RATE_TOKEN_MASK          (0xffff)
+
+/*ACL rule field offset and width*/
+#define RULE_TYPE0_OFFSET            (0)
+#define DMAC_OFFSET                  (1)
+#define SMAC_OFFSET                  (49)
+#define STAG_OFFSET                  (97)
+#define CTAG_OFFSET                  (113)
+#define ETYPE_OFFSET                 (129)
+#define DIP_OFFSET                   (145)
+#define SIP_OFFSET                   (177)
+#define DSCP_OFFSET                  (209)
+#define PROTOCOL_OFFSET              (217)
+#define DPORT_OFFSET                 (225)
+#define SPORT_OFFSET                 (241)
+#define UDF_OFFSET                   (257)
+#define FIELDMAP_OFFSET              (273)
+#define IS_IPV6_OFFSET               (286)
+#define PORTMAP_OFFSET               (287)
+
+#define RULE_TYPE1_OFFSET            (0)
+#define DIP_IPV6_OFFSET              (1)
+#define SIP_IPV6_OFFSET              (97)
+#define FLOW_LABEL_OFFSET            (193)
+
+#define RULE_TYPE0_WIDTH            (1)
+#define DMAC_WIDTH                  (8)
+#define SMAC_WIDTH                  (8)
+#define STAG_WIDTH                  (16)
+#define CTAG_WIDTH                  (16)
+#define ETYPE_WIDTH                 (16)
+#define DIP_WIDTH                   (32)
+#define SIP_WIDTH                   (32)
+#define DSCP_WIDTH                  (8)
+#define PROTOCOL_WIDTH              (8)
+#define DPORT_WIDTH                 (16)
+#define SPORT_WIDTH                 (16)
+#define UDF_WIDTH                   (16)
+#define FIELDMAP_WIDTH              (13)
+#define IS_IPV6_WIDTH               (1)
+#define PORTMAP_WIDTH               (7)
+
+#define RULE_TYPE1_WIDTH            (1)
+#define DIP_IPV6_WIDTH              (32)
+#define SIP_IPV6_WIDTH              (32)
+#define FLOW_LABEL_WIDTH            (20)
+
+/*ACL action offset and width*/
+#define ACL_VLAN_VID_OFFSET         (0)
+#define ACL_VLAN_HIT_OFFSET         (12)
+#define ACL_CLASS_IDX_OFFSET        (13)
+#define ACL_TCM_OFFSET              (18)
+#define ACL_TCM_SEL_OFFSET          (20)
+#define ACL_DROP_PCD_G_OFFSET       (21)
+#define ACL_DROP_PCD_Y_OFFSET       (24)
+#define ACL_DROP_PCD_R_OFFSET       (27)
+#define CLASS_SLR_OFFSET            (30)
+#define CLASS_SLR_SEL_OFFSET        (33)
+#define DROP_PCD_SEL_OFFSET         (34)
+#define TRTCM_EN_OFFSET             (35)
+#define ACL_MANG_OFFSET             (36)
+#define LKY_VLAN_OFFSET             (37)
+#define LKY_VLAN_EN_OFFSET          (38)
+#define EG_TAG_OFFSET               (39)
+#define EG_TAG_EN_OFFSET            (42)
+#define PRI_USER_OFFSET             (43)
+#define PRI_USER_EN_OFFSET          (46)
+#define MIRROR_OFFSET               (47)
+#define FW_PORT_OFFSET              (49)
+#define PORT_FW_EN_OFFSET           (52)
+#define RATE_INDEX_OFFSET           (53)
+#define RATE_EN_OFFSET              (58)
+#define ATTACK_RATE_ID_OFFSET       (59)
+#define ATTACK_RATE_EN_OFFSET       (66)
+#define ACL_MIB_ID_OFFSET           (67)
+#define ACL_MIB_EN_OFFSET           (73)
+#define VLAN_PORT_SWAP_OFFSET       (74)
+#define DST_PORT_SWAP_OFFSET        (75)
+#define BPDU_OFFSET                 (76)
+#define PORT_OFFSET                 (77)
+#define PORT_FORCE_OFFSET           (84)
+
+#define ACL_VLAN_VID_WIDTH          (12)
+#define ACL_VLAN_HIT_WIDTH          (1)
+#define ACL_CLASS_IDX_WIDTH         (5)
+#define ACL_TCM_WIDTH               (2)
+#define ACL_TCM_SEL_WIDTH           (1)
+#define ACL_DROP_PCD_G_WIDTH        (3)
+#define ACL_DROP_PCD_Y_WIDTH        (3)
+#define ACL_DROP_PCD_R_WIDTH        (3)
+#define CLASS_SLR_WIDTH             (3)
+#define CLASS_SLR_SEL_WIDTH         (1)
+#define DROP_PCD_SEL_WIDTH          (1)
+#define TRTCM_EN_WIDTH              (1)
+#define ACL_MANG_WIDTH              (1)
+#define LKY_VLAN_WIDTH              (1)
+#define LKY_VLAN_EN_WIDTH           (1)
+#define EG_TAG_WIDTH                (3)
+#define EG_TAG_EN_WIDTH             (1)
+#define PRI_USER_WIDTH              (3)
+#define PRI_USER_EN_WIDTH           (1)
+#define MIRROR_WIDTH                (2)
+#define FW_PORT_WIDTH               (3)
+#define PORT_FW_EN_WIDTH            (1)
+#define RATE_INDEX_WIDTH            (5)
+#define RATE_EN_WIDTH               (1)
+#define ATTACK_RATE_ID_WIDTH        (7)
+#define ATTACK_RATE_EN_WIDTH        (1)
+#define ACL_MIB_ID_WIDTH            (6)
+#define ACL_MIB_EN_WIDTH            (1)
+#define VLAN_PORT_SWAP_WIDTH        (1)
+#define DST_PORT_SWAP_WIDTH         (1)
+#define BPDU_WIDTH                  (1)
+#define PORT_WIDTH                  (7)
+#define PORT_FORCE_WIDTH            (1)
+
+/*ACL UDF table offset and width*/
+#define UDF_RULE_EN_OFFSET          (0)
+#define UDF_PKT_TYPE_OFFSET         (1)
+#define WORD_OFST_OFFSET            (4)
+#define CMP_SEL_OFFSET              (11)
+#define CMP_PAT_OFFSET              (32)
+#define CMP_MASK_OFFSET             (48)
+#define PORT_BITMAP_OFFSET          (64)
+
+#define UDF_RULE_EN_WIDTH           (1)
+#define UDF_PKT_TYPE_WIDTH          (3)
+#define WORD_OFST_WIDTH             (7)
+#define CMP_SEL_WIDTH               (1)
+#define CMP_PAT_WIDTH               (16)
+#define CMP_MASK_WIDTH              (16)
+#define PORT_BITMAP_WIDTH           (29)
+
+#define ACL_UDF_ACC_OFFSET          (31)
+#define ACL_UDF_READ_MASK           (0x0)
+#define ACL_UDF_WRITE_MASK          (0x1)
+#define ACL_UDF_CLEAR_MASK          (0x2)
+#define ACL_UDF_CMD_OFFSET          (28)
+#define ACL_UDF_READ                (ACL_UDF_READ_MASK << ACL_UDF_CMD_OFFSET)
+#define ACL_UDF_WRITE               (ACL_UDF_WRITE_MASK << ACL_UDF_CMD_OFFSET)
+#define ACL_UDF_CLEAR               (ACL_UDF_CLEAR_MASK << ACL_UDF_CMD_OFFSET)
+#define ACL_UDF_ADDR_MASK           (0xf)
+
+#define DPCR_HIGH_THRSH_OFFSET      (11)
+#define DPCR_PBB_OFFSET             (22)
+#define DPCR_LOW_THRSH_WIDTH        (11)
+#define DPCR_LOW_THRSH_MASK         (0x7ff)
+#define DPCR_HIGH_THRSH_WIDTH       (11)
+#define DPCR_HIGH_THRSH_MASK        (0x7ff)
+#define DPCR_PBB_WIDTH              (10)
+#define DPCR_PBB_MASK               (0x3ff)
+#define DP_MFRM_EX_OFFSET           (24)
+
+/* MACRO FUNCTION DECLARATIONS
+*/
+
+/* DATA TYPE DECLARATIONS
+*/
+typedef enum
+{
+    AIR_ACL_RULE_OFS_FMT_MAC_HEADER = 0,
+    AIR_ACL_RULE_OFS_FMT_L2_PAYLOAD,
+    AIR_ACL_RULE_OFS_FMT_IPV4_HEADER,
+    AIR_ACL_RULE_OFS_FMT_IPV6_HEADER,
+    AIR_ACL_RULE_OFS_FMT_L3_PAYLOAD,
+    AIR_ACL_RULE_OFS_FMT_TCP_HEADER,
+    AIR_ACL_RULE_OFS_FMT_UDP_HEADER,
+    AIR_ACL_RULE_OFS_FMT_L4_PAYLOAD,
+    AIR_ACL_RULE_OFS_FMT_LAST
+} AIR_ACL_RULE_OFS_FMT_T;
+
+typedef enum
+{
+    AIR_ACL_RULE_CMP_SEL_PATTERN,          /* Pattern hit by data pattern and bit mask */
+    AIR_ACL_RULE_CMP_SEL_THRESHOLD,        /* Pattern hit by low and high threshold */
+    AIR_ACL_RULE_CMP_SEL_LAST
+}AIR_ACL_RULE_CMP_SEL_T;
+
+typedef enum
+{
+    AIR_ACL_ACT_FWD_DIS,             /* Don't change forwarding behaviour by ACL */
+    AIR_ACL_ACT_FWD_CPU_EX = 4,      /* Forward by system default & CPU port is excluded */
+    AIR_ACL_ACT_FWD_CPU_IN,          /* Forward by system default & CPU port is included */
+    AIR_ACL_ACT_FWD_CPU,             /* Forward to CPU port only */
+    AIR_ACL_ACT_FWD_DROP,            /* Frame dropped */
+    AIR_ACL_ACT_FWD_LAST
+}AIR_ACL_ACT_FWD_T;
+
+typedef enum
+{
+    AIR_ACL_ACT_EGTAG_DIS,
+    AIR_ACL_ACT_EGTAG_CONSISTENT,
+    AIR_ACL_ACT_EGTAG_UNTAG = 4,
+    AIR_ACL_ACT_EGTAG_SWAP,
+    AIR_ACL_ACT_EGTAG_TAG,
+    AIR_ACL_ACT_EGTAG_STACK,
+    AIR_ACL_ACT_EGTAG_LAST
+}AIR_ACL_ACT_EGTAG_T;
+
+typedef enum
+{
+    AIR_ACL_ACT_USR_TCM_DEFAULT,         /* Normal packets, don't work based on color */
+    AIR_ACL_ACT_USR_TCM_GREEN,           /* Green */
+    AIR_ACL_ACT_USR_TCM_YELLOW,          /* Yellow */
+    AIR_ACL_ACT_USR_TCM_RED,             /* Red */
+    AIR_ACL_ACT_USR_TCM_LAST
+}AIR_ACL_ACT_USR_TCM_T;
+
+typedef enum
+{
+    AIR_ACL_DP_COLOR_GREEN,
+    AIR_ACL_DP_COLOR_YELLOW,
+    AIR_ACL_DP_COLOR_RED,
+    AIR_ACL_DP_COLOR_LAST
+}AIR_ACL_DP_COLOR_T;
+
+typedef enum
+{
+    AIR_ACL_RULE_TYPE_0,
+    AIR_ACL_RULE_TYPE_1,
+    AIR_ACL_RULE_TYPE_LAST
+}AIR_ACL_RULE_TYPE_T;
+
+typedef enum
+{
+    AIR_ACL_RULE_T_CELL,
+    AIR_ACL_RULE_C_CELL,
+    AIR_ACL_RULE_TCAM_LAST
+}AIR_ACL_RULE_TCAM_T;
+
+typedef enum
+{
+    AIR_ACL_MEM_SEL_RULE,
+    AIR_ACL_MEM_SEL_ACTION,
+    AIR_ACL_MEM_SEL_LAST
+}AIR_ACL_MEM_SEL_T;
+
+typedef enum
+{
+    AIR_ACL_MEM_FUNC_READ = 0,
+    AIR_ACL_MEM_FUNC_WRITE,
+    AIR_ACL_MEM_FUNC_CLEAR,
+    AIR_ACL_MEM_FUNC_CONFIG_READ = 4,
+    AIR_ACL_MEM_FUNC_CONFIG_WRITE,
+    AIR_ACL_MEM_FUNC_LAST
+}AIR_ACL_MEM_FUNC_T;
+
+typedef enum
+{
+    AIR_ACL_RULE_CONFIG_ENABLE,
+    AIR_ACL_RULE_CONFIG_END,
+    AIR_ACL_RULE_CONFIG_REVERSE,
+    AIR_ACL_RULE_CONFIG_LAST
+}AIR_ACL_RULE_CONFIG_T;
+
+typedef enum
+{
+    AIR_ACL_CHECK_ACL,
+    AIR_ACL_CHECK_UDF,
+    AIR_ACL_CHECK_TRTCM,
+    AIR_ACL_CHECK_METER,
+    AIR_ACL_CHECK_TYPE_LAST
+}AIR_ACL_CHECK_TYPE_T;
+
+typedef enum
+{
+    AIR_ACL_DMAC,
+    AIR_ACL_SMAC,
+    AIR_ACL_STAG,
+    AIR_ACL_CTAG,
+    AIR_ACL_ETYPE,
+    AIR_ACL_DIP,
+    AIR_ACL_SIP,
+    AIR_ACL_DSCP,
+    AIR_ACL_PROTOCOL,
+    AIR_ACL_DPORT,
+    AIR_ACL_SPORT,
+    AIR_ACL_UDF,
+    AIR_ACL_FLOW_LABEL,
+    AIR_ACL_FIELD_TYPE_LAST
+}AIR_ACL_FIELD_TYPE_T;
+
+typedef struct AIR_ACL_FIELD_S
+{
+    UI8_T dmac[6];
+    UI8_T smac[6];
+    UI16_T stag;
+    UI16_T ctag;
+    UI16_T etype;
+    UI32_T dip[4];
+    UI32_T sip[4];
+    UI8_T dscp;
+    UI8_T protocol;
+    UI32_T flow_label;
+    UI16_T dport;
+    UI16_T sport;
+    UI16_T udf;
+    BOOL_T isipv6;
+    UI16_T fieldmap;
+    UI32_T portmap;
+} AIR_ACL_FIELD_T;
+
+typedef struct AIR_ACL_CTRL_S
+{
+    BOOL_T rule_en;
+    BOOL_T reverse;
+    BOOL_T end;
+}AIR_ACL_CTRL_T;
+
+typedef struct AIR_ACL_RULE_S
+{
+    AIR_ACL_FIELD_T key;
+    AIR_ACL_FIELD_T mask;
+    AIR_ACL_CTRL_T ctrl;
+} AIR_ACL_RULE_T;
+
+typedef struct AIR_ACL_UDF_RULE_S
+{
+    BOOL_T valid;                           /* Valid bit */
+    AIR_ACL_RULE_OFS_FMT_T offset_format;   /* Format Type for Word Offset Range */
+    UI32_T offset;                          /* Word Offset */
+    UI32_T portmap;                         /* Physical Source Port Bit-map */
+    AIR_ACL_RULE_CMP_SEL_T cmp_sel;         /* Comparison mode selection */
+    UI16_T pattern;                         /* Comparison Pattern when cmp_sel=AIR_ACL_RULE_CMP_SEL_PATTERN */
+    UI16_T mask;                            /* Comparison Pattern Mask when cmp_sel=AIR_ACL_RULE_CMP_SEL_PATTERN */
+    UI16_T low_threshold;                   /* Low Threshold when cmp_sel=AIR_ACL_RULE_CMP_SEL_THRESHOLD */
+    UI16_T high_threshold;                  /* High Threshold when cmp_sel=AIR_ACL_RULE_CMP_SEL_THRESHOLD */
+}AIR_ACL_UDF_RULE_T;
+
+typedef struct AIR_ACL_ACT_TRTCM_S
+{
+    BOOL_T cls_slr_sel;                     /* FALSE: Select original class selector value
+                                               TRUE:  Select ACL control table defined class selector value */
+    UI8_T cls_slr;                          /* User defined class selector */
+    BOOL_T drop_pcd_sel;                    /* FALSE: Select original drop precedence value
+                                               TRUE:  Select ACL control table defined drop precedence value */
+    UI8_T drop_pcd_r;                       /* User defined drop precedence for red packets */
+    UI8_T drop_pcd_y;                       /* User defined drop precedence for yellow packets */
+    UI8_T drop_pcd_g;                       /* User defined drop precedence for green packets */
+    BOOL_T tcm_sel;                         /* FALSE: Select user defined color value
+                                               TRUE:  Select color remark by trtcm table */
+    AIR_ACL_ACT_USR_TCM_T usr_tcm;          /* User defined color remark */
+    UI8_T tcm_idx;                          /* Index for the 32-entries trtcm table */
+}AIR_ACL_ACT_TRTCM_T;
+
+typedef struct AIR_ACL_ACTION_S
+{
+    BOOL_T port_en;
+    BOOL_T dest_port_sel;               /* Swap destination port member by portmap when port_en=1 */
+    BOOL_T vlan_port_sel;               /* Swap VLAN port member by portmap when port_en=1 */
+    UI32_T portmap;
+
+    BOOL_T cnt_en;
+    UI32_T cnt_idx;                     /* Counter index */
+
+    BOOL_T attack_en;
+    UI32_T attack_idx;                  /* Attack rate index */
+
+    BOOL_T rate_en;
+    UI32_T rate_idx;                    /* Index of meter table */
+
+    BOOL_T vlan_en;
+    UI32_T vlan_idx;                    /* Vid from ACL */
+
+    UI8_T mirrormap;                    /* mirror session bitmap */
+
+    BOOL_T pri_user_en;
+    UI8_T pri_user;                     /* User Priority from ACL */
+
+    BOOL_T lyvlan_en;
+    BOOL_T lyvlan;                      /* Leaky VLAN */
+
+    BOOL_T mang;                        /* Management frame attribute */
+
+    BOOL_T bpdu;                        /* BPDU frame attribute */
+
+    BOOL_T fwd_en;
+    AIR_ACL_ACT_FWD_T fwd;              /* Frame TO_CPU Forwarding */
+
+    BOOL_T egtag_en;
+    AIR_ACL_ACT_EGTAG_T egtag;          /* Egress tag control */
+
+    BOOL_T trtcm_en;
+    AIR_ACL_ACT_TRTCM_T trtcm;          /* TRTCM control */
+
+}AIR_ACL_ACTION_T;
+
+typedef struct AIR_ACL_TRTCM_S
+{
+    UI16_T cir;                             /* Committed information rate (unit: 64Kbps) */
+    UI16_T pir;                             /* Peak information rate (unit: 64Kbps) */
+    UI16_T cbs;                             /* Committed burst size (unit: byte) */
+    UI16_T pbs;                             /* Peak burst size (unit: byte) */
+}AIR_ACL_TRTCM_T;
+
+/* EXPORTED SUBPROGRAM SPECIFICATIONS
+*/
+/* FUNCTION NAME: air_acl_setRuleCtrl
+ * PURPOSE:
+ *      Set ACL rule control.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      rule_idx        --  Index of ACL rule entry
+ *      ptr_rule        --  Structure of ACL rule control
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_setRuleCtrl(
+    const UI32_T unit,
+    const UI32_T rule_idx,
+    AIR_ACL_CTRL_T *ptr_ctrl);
+
+/* FUNCTION NAME: air_acl_getRuleCtrl
+ * PURPOSE:
+ *      Get ACL rule control.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      rule_idx        --  Index of ACL rule entry
+ *
+ * OUTPUT:
+ *      ptr_ctrl        --  Structure of ACL rule control
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_getRuleCtrl(
+    const UI32_T unit,
+    const UI32_T rule_idx,
+    AIR_ACL_CTRL_T *ptr_ctrl);
+
+/* FUNCTION NAME: air_acl_setRule
+ * PURPOSE:
+ *      Set ACL rule entry.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      rule_idx        --  Index of ACL rule entry
+ *      rule            --  Structure of ACL rule entry
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_setRule(
+    const UI32_T unit,
+    const UI32_T rule_idx,
+    AIR_ACL_RULE_T *rule);
+
+/* FUNCTION NAME: air_acl_delRule
+ * PURPOSE:
+ *      Delete an ACL rule entry.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      rule_idx        --  Index of ACL rule entry
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_delRule(
+    const UI32_T unit,
+    const UI32_T rule_idx);
+
+/* FUNCTION NAME: air_acl_clearRule
+ * PURPOSE:
+ *      Clear all ACL rule entries.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_clearRule(
+    const UI32_T unit);
+
+/* FUNCTION NAME: air_acl_getRule
+ * PURPOSE:
+ *      Get ACL rule entry.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      rule_idx        --  Index of ACL rule entry
+ *
+ * OUTPUT:
+ *      ptr_rule        --  Structure of ACL rule entry
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_getRule(
+    const UI32_T unit,
+    const UI32_T rule_idx,
+    AIR_ACL_RULE_T *ptr_rule);
+
+/* FUNCTION NAME: air_acl_setAction
+ * PURPOSE:
+ *      Set an ACL action entry.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      act_idx         --  Index of ACL action entry
+ *      act             --  Structure of ACL action entry
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_NOT_SUPPORT
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_setAction(
+    const UI32_T unit,
+    const UI32_T act_idx,
+    const AIR_ACL_ACTION_T act);
+
+/* FUNCTION NAME: air_acl_delAction
+ * PURPOSE:
+ *      Delete an ACL action entry with specific index
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      act_idx         --  Index of ACL action entry
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_ENTRY_NOT_FOUND
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_delAction(
+    const UI32_T unit,
+    const UI32_T act_idx);
+
+/* FUNCTION NAME: air_acl_clearAction
+ * PURPOSE:
+ *      Clear all ACL action entries.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_clearAction(
+    const UI32_T unit);
+
+/* FUNCTION NAME: air_acl_getAction
+ * PURPOSE:
+ *      Get an ACL action entry with speficic index.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      act_idx         --  Index of ACL action entry
+ *
+ * OUTPUT:
+ *      ptr_act         --  Structure of ACL action entry
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_ENTRY_NOT_FOUND
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_getAction(
+    const UI32_T unit,
+    const UI32_T act_idx,
+    AIR_ACL_ACTION_T *ptr_act);
+
+/* FUNCTION NAME: air_acl_setTrtcm
+ * PURPOSE:
+ *      Set a trTCM entry with the specific index.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      tcm_idx         --  Index of trTCM entry
+ *      tcm             --  Structure of trTCM entry
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      Index 0 ~ 31 can be selected in tcm_idx.
+ */
+AIR_ERROR_NO_T
+air_acl_setTrtcm(
+    const UI32_T unit,
+    const UI32_T tcm_idx,
+    const AIR_ACL_TRTCM_T tcm);
+
+/* FUNCTION NAME: air_acl_delTrtcm
+ * PURPOSE:
+ *      Delete an ACL trTCM entry.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      trtcm_idx       --  Index of ACL trTCM entry
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      Index 0 ~ 31 can be selected in tcm_idx.
+ */
+AIR_ERROR_NO_T
+air_acl_delTrtcm(
+    const UI32_T unit,
+    const UI32_T trtcm_idx);
+
+/* FUNCTION NAME: air_acl_clearTrtcm
+ * PURPOSE:
+ *      Clear all ACL trTCM entries.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_clearTrtcm(
+    const UI32_T unit);
+
+/* FUNCTION NAME: air_acl_getTrtcm
+ * PURPOSE:
+ *      Get a trTCM entry with the specific index.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      tcm_idx         --  Index of trTCM entry
+ *
+ * OUTPUT:
+ *      ptr_tcm         --  Structure of trTCM entry
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      Index 0 ~ 31 can be selected in tcm_idx.
+ */
+AIR_ERROR_NO_T
+air_acl_getTrtcm(
+    const UI32_T unit,
+    const UI32_T tcm_idx,
+    AIR_ACL_TRTCM_T *ptr_tcm);
+
+/* FUNCTION NAME: air_acl_setTrtcmEnable
+ * PURPOSE:
+ *      Set trTCM enable so the meter table will be updated based on PIR and CIR.
+ *      The color marker will also be enabled when ACL is hit.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      state           --  FALSE:Disable
+ *                          TRUE: Enable
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_setTrtcmEnable(
+    const UI32_T unit,
+    const BOOL_T state);
+
+/* FUNCTION NAME: air_acl_getTrtcm
+ * PURPOSE:
+ *      Get a trTCM enable state.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      ptr_state       --  FALSE:Disable
+ *                          TRUE: Enable
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_getTrtcmEnable(
+    const UI32_T unit,
+    BOOL_T *const ptr_state);
+
+/* FUNCTION NAME: air_acl_setPortEnable
+ * PURPOSE:
+ *      Set ACL state for a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      state           --  FALSE:Disable
+ *                          TRUE: Enable
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_setPortEnable(
+    const UI32_T unit,
+    const UI32_T port,
+    const BOOL_T state);
+
+/* FUNCTION NAME: air_acl_getPortEnable
+ * PURPOSE:
+ *      Get ACL state for a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *
+ * OUTPUT:
+ *      ptr_state       --  FALSE:Disable
+ *                          TRUE: Enable
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_getPortEnable(
+    const UI32_T unit,
+    const UI32_T port,
+    UI32_T *ptr_state);
+
+/* FUNCTION NAME: air_acl_setDropEnable
+ * PURPOSE:
+ *      Set ACL drop precedence state
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      state           --  FALSE:Disable
+ *                          TRUE: Enable
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_setDropEnable(
+    const UI32_T unit,
+    const UI32_T port,
+    const BOOL_T state);
+
+/* FUNCTION NAME: air_acl_getDropEnable
+ * PURPOSE:
+ *      Get ACL drop precedence state
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *
+ * OUTPUT:
+ *      ptr_state       --  FALSE:Disable
+ *                          TRUE: Enable
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_getDropEnable(
+    const UI32_T unit,
+    const UI32_T port,
+    BOOL_T *ptr_state);
+
+/* FUNCTION NAME: air_acl_setDropThreshold
+ * PURPOSE:
+ *      Set ACL drop threshold.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      color           --  AIR_ACL_DP_COLOR_YELLOW: Yellow
+ *                          AIR_ACL_DP_COLOR_RED   : Red
+ *      queue           --  Output queue number
+ *      high            --  High threshold
+ *      low             --  Low threshold
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      Key parameter include port, color, queue.
+ */
+AIR_ERROR_NO_T
+air_acl_setDropThreshold(
+    const UI32_T unit,
+    const UI32_T port,
+    const AIR_ACL_DP_COLOR_T color,
+    const UI8_T queue,
+    const UI32_T high,
+    const UI32_T low);
+
+/* FUNCTION NAME: air_acl_getDropThreshold
+ * PURPOSE:
+ *      Get ACL drop threshold.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      color           --  AIR_ACL_DP_COLOR_YELLOW: Yellow
+ *                          AIR_ACL_DP_COLOR_RED   : Red
+ *      queue           --  Output queue number
+ *
+ * OUTPUT:
+ *      ptr_high        --  High threshold
+ *      ptr_low         --  Low threshold
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      Key parameter include port, color, queue.
+ */
+AIR_ERROR_NO_T
+air_acl_getDropThreshold(
+    const UI32_T unit,
+    const UI32_T port,
+    const AIR_ACL_DP_COLOR_T color,
+    const UI8_T queue,
+    UI32_T *ptr_high,
+    UI32_T *ptr_low);
+
+/* FUNCTION NAME: air_acl_setDropProbability
+ * PURPOSE:
+ *      Set ACL drop probability.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      color           --  AIR_ACL_DP_COLOR_YELLOW: Yellow
+ *                          AIR_ACL_DP_COLOR_RED   : Red
+ *      queue           --  Output queue number
+ *      probability     --  Drop probability (value:0 ~ 1023, unit:1/1023; eg: value-102 = 10% )
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      Key parameter include port, color, queue.
+ */
+AIR_ERROR_NO_T
+air_acl_setDropProbability(
+    const UI32_T unit,
+    const UI32_T port,
+    const AIR_ACL_DP_COLOR_T color,
+    const UI8_T queue,
+    const UI32_T probability);
+
+/* FUNCTION NAME: air_acl_getDropProbability
+ * PURPOSE:
+ *      Get ACL drop probability.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      color           --  AIR_ACL_DP_COLOR_YELLOW: Yellow
+ *                          AIR_ACL_DP_COLOR_RED   : Red
+ *      queue           --  Output queue number
+ *
+ * OUTPUT:
+ *      ptr_probability --  Drop probability (value:0 ~ 1023, unit:1/1023; eg: value-102 = 10% )
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      Key parameter include port, color, queue.
+ */
+AIR_ERROR_NO_T
+air_acl_getDropProbability(
+    const UI32_T unit,
+    const UI32_T port,
+    const AIR_ACL_DP_COLOR_T color,
+    const UI8_T queue,
+    UI32_T *ptr_probability);
+
+/* FUNCTION NAME:
+ *      air_acl_setGlobalState
+ * PURPOSE:
+ *      Set the ACL global enable state.
+ * INPUT:
+ *      unit        -- Device ID
+ *      state       -- Enable state of ACL
+ * OUTPUT:
+ *      None
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_setGlobalState(
+    const UI32_T        unit,
+    const BOOL_T        state);
+
+/* FUNCTION NAME:
+ *      air_acl_getGlobalState
+ * PURPOSE:
+ *      Get the ACL global enable state.
+ * INPUT:
+ *      unit             -- Device ID
+ * OUTPUT:
+ *      ptr_state        -- Enable state
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_getGlobalState(
+    const UI32_T         unit,
+    BOOL_T               *ptr_state);
+
+/* FUNCTION NAME:
+ *      air_acl_setUdfRule
+ * PURPOSE:
+ *      Set ACL UDF rule of specified entry index.
+ * INPUT:
+ *      unit             -- Device ID
+ *      rule_idx         -- ACLUDF table entry index
+ *      udf_rule         -- Structure of ACL UDF rule entry
+ * OUTPUT:
+ *      None
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_setUdfRule(
+    const UI32_T                unit,
+    const UI32_T                rule_idx,
+    AIR_ACL_UDF_RULE_T          udf_rule);
+
+/* FUNCTION NAME:
+ *      air_acl_getUdfRule
+ * PURPOSE:
+ *      Get ACL UDF rule of specified entry index.
+ * INPUT:
+ *      unit             -- Device ID
+ *      rule_idx         -- ACLUDF table entry index
+ * OUTPUT:
+ *      ptr_udf_rule     -- Structure of ACL UDF rule entry
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_getUdfRule(
+    const UI32_T                unit,
+    const UI8_T                 rule_idx,
+    AIR_ACL_UDF_RULE_T          *ptr_udf_rule);
+
+/* FUNCTION NAME:
+ *      air_acl_delUdfRule
+ * PURPOSE:
+ *      Delete ACL UDF rule of specified entry index.
+ * INPUT:
+ *      unit             -- Device ID
+ *      rule_idx         -- ACLUDF table entry index
+ * OUTPUT:
+ *      None
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_delUdfRule(
+    const UI32_T      unit,
+    const UI8_T       rule_idx);
+
+/* FUNCTION NAME:
+ *      air_acl_clearUdfRule
+ * PURPOSE:
+ *      Clear acl all udf rule.
+ * INPUT:
+ *      unit             -- Device ID
+ * OUTPUT:
+ *      None
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_clearUdfRule(
+    const UI32_T    unit);
+
+/* FUNCTION NAME:
+ *      air_acl_setMeterTable
+ * PURPOSE:
+ *      Set flow ingress rate limit by meter table.
+ * INPUT:
+ *      unit                -- Device ID
+ *      meter_id            -- Meter id
+ *      enable              -- Meter enable state
+ *      rate                -- Ratelimit(unit:64kbps)
+ * OUTPUT:
+ *      None
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_setMeterTable(
+    const UI32_T            unit,
+    const UI32_T            meter_id,
+    const BOOL_T            enable,
+    const UI32_T            rate);
+
+/* FUNCTION NAME:
+ *      air_acl_getMeterTable
+ * PURPOSE:
+ *      Get meter table configuration.
+ * INPUT:
+ *      unit                -- Device ID
+ *      meter_id            -- Meter id
+ * OUTPUT:
+ *      ptr_enable          -- Meter enable state
+ *      ptr_rate            -- Ratelimit(unit:64kbps)
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_getMeterTable(
+    const UI32_T            unit,
+    const UI32_T            meter_id,
+    BOOL_T                  *ptr_enable,
+    UI32_T                  *ptr_rate);
+
+#endif /* End of AIR_ACL_H */
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_aml.h b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_aml.h
new file mode 100644
index 0000000..49a38b6
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_aml.h
@@ -0,0 +1,214 @@
+/* FILE NAME:   air_aml.h

+ * PURPOSE:

+ *      Define the access management layer function in AIR SDK.

+ * NOTES:

+ */

+

+#ifndef AIR_AML_H

+#define AIR_AML_H

+

+/* INCLUDE FILE DECLARATIONS

+ */

+

+/* NAMING CONSTANT DECLARATIONS

+ */

+

+/* MACRO FUNCTION DECLARATIONS

+ */

+

+/* DATA TYPE DECLARATIONS

+ */

+typedef AIR_ERROR_NO_T

+(*AML_DEV_READ_FUNC_T)(

+    const UI32_T    unit,

+    const UI32_T    addr_offset,

+    UI32_T          *ptr_data);

+

+typedef AIR_ERROR_NO_T

+(*AML_DEV_WRITE_FUNC_T)(

+    const UI32_T    unit,

+    const UI32_T    addr_offset,

+    const UI32_T    data);

+

+typedef AIR_ERROR_NO_T

+(*AML_DEV_PHY_READ_FUNC_T)(

+    const UI32_T    unit,

+    const UI32_T    port_id,

+    const UI32_T    addr_offset,

+    UI32_T          *ptr_data);

+

+typedef AIR_ERROR_NO_T

+(*AML_DEV_PHY_WRITE_FUNC_T)(

+    const UI32_T    unit,

+    const UI32_T    port_id,

+    const UI32_T    addr_offset,

+    const UI32_T    data);

+

+typedef AIR_ERROR_NO_T

+(*AML_DEV_PHY_READ_CL45_FUNC_T)(

+    const UI32_T    unit,

+    const UI32_T    port_id,

+    const UI32_T    dev_type,

+    const UI32_T    addr_offset,

+    UI32_T          *ptr_data);

+

+typedef AIR_ERROR_NO_T

+(*AML_DEV_PHY_WRITE_CL45_FUNC_T)(

+    const UI32_T    unit,

+    const UI32_T    port_id,

+    const UI32_T    dev_type,

+    const UI32_T    addr_offset,

+    const UI32_T    data);

+

+/* To read or write the HW-intf registers. */

+typedef struct

+{

+    AML_DEV_READ_FUNC_T             read_callback;

+    AML_DEV_WRITE_FUNC_T            write_callback;

+    AML_DEV_PHY_READ_FUNC_T         phy_read_callback;

+    AML_DEV_PHY_WRITE_FUNC_T        phy_write_callback;

+    AML_DEV_PHY_READ_CL45_FUNC_T    phy_cl45_read_callback;

+    AML_DEV_PHY_WRITE_CL45_FUNC_T   phy_cl45_write_callback;

+}AML_DEV_ACCESS_T;

+

+/* EXPORTED SUBPROGRAM SPECIFICATIONS

+ */

+extern AML_DEV_ACCESS_T _ext_dev_access;

+

+/* FUNCTION NAME:   aml_readReg

+ * PURPOSE:

+ *      To read data from the register of the specified chip unit.

+ * INPUT:

+ *      unit        -- the device unit

+ *      addr_offset -- the address of register

+ * OUTPUT:

+ *      ptr_data    -- pointer for the register data

+ * RETURN:

+ *      NPS_E_OK     -- Successfully read the data.

+ *      NPS_E_OTHERS -- Failed to read the data.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+aml_readReg(

+    const UI32_T    unit,

+    const UI32_T    addr_offset,

+    UI32_T          *ptr_data);

+

+/* FUNCTION NAME:   aml_writeReg

+ * PURPOSE:

+ *      To write data to the register of the specified chip unit.

+ * INPUT:

+ *      unit        -- the device unit

+ *      addr_offset -- the address of register

+ *      data        -- written data

+ * OUTPUT:

+ *      none

+ * RETURN:

+ *      NPS_E_OK     -- Successfully write the data.

+ *      NPS_E_OTHERS -- Failed to write the data.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+aml_writeReg(

+    const UI32_T    unit,

+    const UI32_T    addr_offset,

+    const UI32_T    data);

+

+/* FUNCTION NAME:   aml_readPhyReg

+ * PURPOSE:

+ *      To read data from the phy register of the specified chip unit in Clause22.

+ * INPUT:

+ *      unit        -- the device unit

+ *      port_id     -- physical port number

+ *      addr_offset -- the address of phy register

+ * OUTPUT:

+ *      ptr_data    -- pointer for the register data

+ * RETURN:

+ *      NPS_E_OK     -- Successfully read the data.

+ *      NPS_E_OTHERS -- Failed to read the data.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+aml_readPhyReg(

+    const UI32_T    unit,

+    const UI32_T    port_id,

+    const UI32_T    addr_offset,

+    UI32_T          *ptr_data);

+

+/* FUNCTION NAME:   aml_writePhyReg

+ * PURPOSE:

+ *      To write data to the phy register of the specified chip unit in Clause22.

+ * INPUT:

+ *      unit        -- the device unit

+ *      port_id     -- physical port number

+ *      addr_offset -- the address of phy register

+ *      data        -- written data

+ * OUTPUT:

+ *      none

+ * RETURN:

+ *      NPS_E_OK     -- Successfully write the data.

+ *      NPS_E_OTHERS -- Failed to write the data.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+aml_writePhyReg(

+    const UI32_T    unit,

+    const UI32_T    port_id,

+    const UI32_T    addr_offset,

+    const UI32_T    ptr_data);

+

+/* FUNCTION NAME:   aml_readPhyRegCL45

+ * PURPOSE:

+ *      To read data from the phy register of the specified chip unit in Clause45.

+ * INPUT:

+ *      unit        -- the device unit

+ *      port_id     -- physical port number

+ *      dev_type    -- phy register type

+ *      addr_offset -- the address of phy register

+ * OUTPUT:

+ *      ptr_data    -- pointer for the register data

+ * RETURN:

+ *      NPS_E_OK     -- Successfully read the data.

+ *      NPS_E_OTHERS -- Failed to read the data.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+aml_readPhyRegCL45(

+    const UI32_T    unit,

+    const UI32_T    port_id,

+    const UI32_T    dev_type,

+    const UI32_T    addr_offset,

+    UI32_T          *ptr_data);

+

+/* FUNCTION NAME:   aml_writePhyRegCL45

+ * PURPOSE:

+ *      To write data to the phy register of the specified chip unit in Clause45.

+ * INPUT:

+ *      unit        -- the device unit

+ *      port_id     -- physical port number

+ *      dev_type    -- phy register offset

+ *      addr_offset -- the address of phy register

+ *      data        -- written data

+ * OUTPUT:

+ *      none

+ * RETURN:

+ *      NPS_E_OK     -- Successfully write the data.

+ *      NPS_E_OTHERS -- Failed to write the data.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+aml_writePhyRegCL45(

+    const UI32_T    unit,

+    const UI32_T    port_id,

+    const UI32_T    dev_type,

+    const UI32_T    addr_offset,

+    const UI32_T    data);

+

+#endif  /* AIR_AML_H */

+

diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_cmd.h b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_cmd.h
new file mode 100644
index 0000000..071d063
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_cmd.h
@@ -0,0 +1,50 @@
+/* FILE NAME:   air_cmd.h

+ * PURPOSE:

+ *      Define the command line function in AIR SDK.

+ * NOTES:

+ */

+

+#ifndef AIR_CMD_H

+#define AIR_CMD_H

+

+/* INCLUDE FILE DECLARATIONS

+ */

+

+/* NAMING CONSTANT DECLARATIONS

+ */

+

+/* MACRO FUNCTION DECLARATIONS

+ */

+

+/* DATA TYPE DECLARATIONS

+ */

+

+/* EXPORTED SUBPROGRAM SPECIFICATIONS

+ */

+/* FUNCTION NAME:   air_parse_cmd

+ * PURPOSE:

+ *      This function is used process diagnostic cmd

+ * INPUT:

+ *      argc         -- parameter number

+ *      argv         -- parameter strings

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      NPS_E_OK     -- Successfully read the data.

+ *      NPS_E_OTHERS -- Failed to read the data.

+ * NOTES:

+ *

+ */

+AIR_ERROR_NO_T

+air_parse_cmd(

+    const UI32_T argc,

+    const C8_T **argv);

+

+UI32_T

+_strtoul(

+    const C8_T *cp,

+    C8_T **endp,

+    UI32_T base);

+

+#endif  /* AIR_CMD_H */

+

diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_diag.h b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_diag.h
new file mode 100644
index 0000000..60fe4f3
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_diag.h
@@ -0,0 +1,87 @@
+/* FILE NAME: air_diag.h
+ * PURPOSE:
+ *      Define the diagnostic function in AIR SDK.
+ *
+ * NOTES:
+ *      None
+ */
+
+#ifndef AIR_DIAG_H
+#define AIR_DIAG_H
+
+/* INCLUDE FILE DECLARATIONS
+*/
+
+/* NAMING CONSTANT DECLARATIONS
+*/
+typedef enum
+{
+    AIR_DIAG_TXCOMPLY_MODE_10M_NLP,
+    AIR_DIAG_TXCOMPLY_MODE_10M_RANDOM,
+    AIR_DIAG_TXCOMPLY_MODE_10M_SINE,
+    AIR_DIAG_TXCOMPLY_MODE_100M_PAIR_A,
+    AIR_DIAG_TXCOMPLY_MODE_100M_PAIR_B,
+    AIR_DIAG_TXCOMPLY_MODE_1000M_TM1,
+    AIR_DIAG_TXCOMPLY_MODE_1000M_TM2,
+    AIR_DIAG_TXCOMPLY_MODE_1000M_TM3,
+    AIR_DIAG_TXCOMPLY_MODE_1000M_TM4,
+    AIR_DIAG_TXCOMPLY_MODE_LAST
+}AIR_DIAG_TXCOMPLY_MODE_T;
+
+/* MACRO FUNCTION DECLARATIONS
+*/
+
+/* DATA TYPE DECLARATIONS
+*/
+
+/* EXPORTED SUBPROGRAM SPECIFICATIONS
+*/
+/* FUNCTION NAME: air_diag_setTxComplyMode
+ * PURPOSE:
+ *      Set Ethernet TX Compliance mode.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      mode            --  Testing mode of Ethernet TX Compliance
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ */
+AIR_ERROR_NO_T
+air_diag_setTxComplyMode(
+    const UI32_T unit,
+    const UI8_T port,
+    const AIR_DIAG_TXCOMPLY_MODE_T mode);
+
+/* FUNCTION NAME: air_diag_getTxComplyMode
+ * PURPOSE:
+ *      Get Ethernet TX Compliance mode.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *
+ * OUTPUT:
+ *      ptr_mode        --  Testing mode of Ethernet TX Compliance
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_OTHERS
+ *
+ * NOTES:
+ */
+AIR_ERROR_NO_T
+air_diag_getTxComplyMode(
+    const UI32_T unit,
+    const UI8_T port,
+    AIR_DIAG_TXCOMPLY_MODE_T *ptr_mode);
+
+#endif /* End of AIR_DIAG_H */
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_error.h b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_error.h
new file mode 100644
index 0000000..836d400
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_error.h
@@ -0,0 +1,56 @@
+/* FILE NAME:   air_error.h

+ * PURPOSE:

+ *      Define the error code in AIR SDK.

+ * NOTES:

+ */

+

+#ifndef AIR_ERROR_H

+#define AIR_ERROR_H

+

+/* INCLUDE FILE DECLARATIONS

+ */

+

+/* NAMING CONSTANT DECLARATIONS

+ */

+

+/* MACRO FUNCTION DECLARATIONS

+ */

+

+/* DATA TYPE DECLARATIONS

+ */

+typedef enum

+{

+    AIR_E_OK = 0,              /* Ok and no error */

+    AIR_E_OTHERS,              /* Operation is unsuccessful */

+    AIR_E_BAD_PARAMETER,       /* Parameter is wrong */

+    AIR_E_TABLE_FULL,          /* Table is full */

+    AIR_E_ENTRY_NOT_FOUND,     /* Entry is not found */

+    AIR_E_ENTRY_EXISTS,        /* Entry already exists */

+    AIR_E_NOT_SUPPORT,         /* Feature is not supported */

+    AIR_E_TIMEOUT,             /* Time out error */

+    AIR_E_LAST

+} AIR_ERROR_NO_T;

+

+/* EXPORTED SUBPROGRAM SPECIFICATIONS

+ */

+/* FUNCTION NAME:   air_error_getString

+ * PURPOSE:

+ *      To obtain the error string of the specified error code

+ *

+ * INPUT:

+ *      cause  -- The specified error code

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      Pointer to the target error string

+ *

+ * NOTES:

+ *

+ *

+ */

+C8_T *

+air_error_getString(

+    const AIR_ERROR_NO_T cause );

+

+#endif  /* AIR_ERROR_H */

+

diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_l2.h b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_l2.h
new file mode 100644
index 0000000..1e77305
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_l2.h
@@ -0,0 +1,323 @@
+/* FILE NAME: air_l2.h
+* PURPOSE:
+*       Define the layer 2 functions in AIR SDK.
+*
+* NOTES:
+*       None
+*/
+
+#ifndef AIR_L2_H
+#define AIR_L2_H
+
+/* INCLUDE FILE DECLARATIONS
+*/
+
+/* NAMING CONSTANT DECLARATIONS
+*/
+#define AIR_L2_MAC_MAX_AGE_OUT_TIME (1000000)
+
+#define AIR_L2_MAX_BUSY_TIME    (200)
+#define AIR_L2_MAX_AGE_CNT      (BITS(0, (AAC_AGE_CNT_LENGTH - 1)))
+#define AIR_L2_MAX_AGE_UNIT     (BITS(0, (AAC_AGE_UNIT_LENGTH - 1)))
+#define AIR_L2_MAC_SET_NUM      (4)
+#define AIR_L2_MAX_SIZE         (512)
+
+/* Field for MAC Address Table */
+/* Field for MAC entry forward control when hit source MAC */
+typedef enum
+{
+    AIR_L2_FWD_CTRL_DEFAULT,
+    AIR_L2_FWD_CTRL_CPU_INCLUDE,
+    AIR_L2_FWD_CTRL_CPU_EXCLUDE,
+    AIR_L2_FWD_CTRL_CPU_ONLY,
+    AIR_L2_FWD_CTRL_DROP,
+    AIR_L2_FWD_CTRL_LAST
+} AIR_L2_FWD_CTRL_T;
+/* MACRO FUNCTION DECLARATIONS
+*/
+
+/* DATA TYPE DECLARATIONS
+*/
+/* Entry structure of MAC table */
+typedef struct AIR_MAC_ENTRY_S
+{
+    /* L2 MAC entry keys */
+    /* MAC Address */
+    AIR_MAC_T mac;
+
+    /* Customer VID (12bits) */
+    UI16_T cvid;
+
+    /* Filter ID */
+    UI16_T fid;
+
+    /* l2 mac entry attributes */
+#define AIR_L2_MAC_ENTRY_FLAGS_IVL     (1U << 0)
+#define AIR_L2_MAC_ENTRY_FLAGS_STATIC  (1U << 1)
+#define AIR_L2_MAC_ENTRY_FLAGS_UNAUTH  (1U << 2)
+    UI32_T flags;
+
+    /* Destination Port Map */
+    AIR_PORT_BITMAP_T port_bitmap;
+
+    /* Source MAC address hit forward control */
+    AIR_L2_FWD_CTRL_T sa_fwd;
+
+    /* Age Timer only for getting information */
+    UI32_T timer;
+} AIR_MAC_ENTRY_T;
+
+/* FUNCTION NAME: air_l2_addMacAddr
+ * PURPOSE:
+ *      Add or set a L2 unicast MAC address entry.
+ *      If the address entry doesn't exist, it will add the entry.
+ *      If the address entry already exists, it will set the entry
+ *      with user input value.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      ptr_mac_entry   --  Structure of MAC Address table
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TABLE_FULL
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_l2_addMacAddr(
+    const UI32_T unit,
+    const AIR_MAC_ENTRY_T   *ptr_mac_entry);
+
+/* FUNCTION NAME: air_l2_delMacAddr
+ * PURPOSE:
+ *      Delete a L2 unicast MAC address entry.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      ptr_mac_entry   --  The structure of MAC Address table
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_l2_delMacAddr(
+    const UI32_T unit,
+    const AIR_MAC_ENTRY_T   *ptr_mac_entry);
+
+/* FUNCTION NAME:  air_l2_getMacAddr
+ * PURPOSE:
+ *      Get a L2 unicast MAC address entry.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      ptr_mac_entry   --  The structure of MAC Address table
+ *
+ * OUTPUT:
+ *      ptr_count                -- The number of returned MAC entries
+ *      ptr_mac_entry            -- Structure of MAC Address table for
+ *                                  searching result.
+ *                                  The size of ptr_mac_entry depends
+ *                                  on the maximun number of bank.
+ *                                  The memory size should greater than
+ *                                  ((# of Bank) * (Size of entry
+ *                                  structure))
+ *                                  AIR_MAC_ENTRY_T
+ * RETURN:
+ *      AIR_E_OK                 -- Operation success.
+ *      AIR_E_BAD_PARAMETER      -- Parameter is wrong.
+ *      AIR_E_TIMEOUT            -- Timeout error.
+ *      AIR_E_ENTRY_NOT_FOUND    -- Entry is not found.
+ * NOTES:
+ *      If the parameter:mac in input argument ptr_mac_entry[0] is
+ *      empty. It means to search the first valid MAC address entry
+ *      in MAC address table. Otherwise, to search the specific MAC
+ *      address entry in input argument ptr_mac_entry[0].
+ *      Input argument ptr_mac_entry[0] needs include mac, ivl and
+ *      (fid or cvid) depends on ivl.
+ *      If argument ivl is TRUE, cvid is necessary, or fid is.
+ */
+AIR_ERROR_NO_T
+air_l2_getMacAddr(
+    const UI32_T unit,
+    UI8_T           *ptr_count,
+    AIR_MAC_ENTRY_T *ptr_mac_entry);
+
+/* FUNCTION NAME: hal_sco_l2_getMacBucketSize
+ * PURPOSE:
+ *      Get the bucket size of one MAC address set when searching L2 table.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      ptr_size        --  The bucket size
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_l2_getMacBucketSize(
+    const UI32_T    unit,
+    UI32_T          *ptr_size);
+
+
+/* FUNCTION NAME: air_l2_getNextMacAddr
+ * PURPOSE:
+ *      Get the next L2 unicast MAC address entry.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      ptr_mac_entry   --  The structure of MAC Address table
+ *
+ * OUTPUT:
+ *      ptr_count       --  The number of returned MAC entries
+ *      ptr_mac_entry   --  Structure of MAC Address table for searching result.
+ *                          The size of ptr_mac_entry depends on the max. number of bank.
+ *                          The memory size should greater than ((# of Bank) * (Table size))
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *      AIR_E_ENTRY_NOT_FOUND
+ * NOTES:
+ *      If the parameter:mac in input argument ptr_mac_entry[0] is empty.
+ *      It means to search the next valid MAC address entries of last searching result.
+ *      Otherwise, to search the next valid MAC address entry of the specific MAC address
+ *      entry in input argument ptr_mac_entry[0].
+ *      Input argument ptr_mac_entry[0] needs include mac, ivl and (fid or cvid) depends on ivl.
+ *      If argument ivl is TRUE, cvid is necessary, or fid is.
+ */
+AIR_ERROR_NO_T
+air_l2_getNextMacAddr(
+    const UI32_T unit,
+    UI8_T           *ptr_count,
+    AIR_MAC_ENTRY_T *ptr_mac_entry);
+
+/* FUNCTION NAME: air_l2_clearMacAddr
+ * PURPOSE:
+ *      Clear all L2 unicast MAC address entry.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_l2_clearMacAddr(
+    const UI32_T unit);
+
+/* FUNCTION NAME:   air_l2_setMacAddrAgeOut
+ * PURPOSE:
+ *      Set the age out time of L2 MAC address entries.
+ * INPUT:
+ *      unit                     -- Device ID
+ *      age_time                 -- Age out time (second)
+ *                                  (1..AIR_L2_MAC_MAX_AGE_OUT_TIME)
+ * OUTPUT:
+ *      None
+ * RETURN:
+ *      AIR_E_OK                 -- Operation success.
+ *      AIR_E_BAD_PARAMETER      -- Parameter is wrong.
+ * NOTES:
+ *      None
+ */
+
+AIR_ERROR_NO_T
+air_l2_setMacAddrAgeOut(
+    const UI32_T    unit,
+    const UI32_T    age_time);
+
+/* FUNCTION NAME:   air_l2_getMacAddrAgeOut
+ * PURPOSE:
+ *      Get the age out time of unicast MAC address.
+ * INPUT:
+ *      unit                     -- Device ID
+ * OUTPUT:
+ *      ptr_age_time             -- age out time
+ * RETURN:
+ *      AIR_E_OK                 -- Operation success.
+ *      AIR_E_BAD_PARAMETER      -- Parameter is wrong.
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_l2_getMacAddrAgeOut(
+    const UI32_T    unit,
+    UI32_T          *ptr_age_time);
+
+/* FUNCTION NAME: air_l2_setAgeEnable
+ * PURPOSE:
+ *      Set aging state for a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      state           --  FALSE:Disable
+ *                          TRUE: Enable
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_l2_setAgeEnable(
+    const UI32_T unit,
+    const UI32_T port,
+    const BOOL_T state);
+
+/* FUNCTION NAME: air_l2_getAgeEnable
+ * PURPOSE:
+ *      Get age state for a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *
+ * OUTPUT:
+ *      ptr_state       --  FALSE:Disable
+ *                          TRUE: Enable
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_l2_getAgeEnable(
+    const UI32_T unit,
+    const UI32_T port,
+    UI32_T *ptr_state);
+
+#endif /* End of AIR_L2_H */
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_lag.h b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_lag.h
new file mode 100644
index 0000000..7ab0132
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_lag.h
@@ -0,0 +1,330 @@
+/* FILE NAME:  air_lag.h
+ * PURPOSE:
+ *      Define the Link Agrregation function in AIR SDK.
+ *
+ * NOTES:
+ *      None
+ */
+
+#ifndef AIR_LAG_H
+#define AIR_LAG_H
+
+/* INCLUDE FILE DECLARATIONS
+*/
+
+/* NAMING CONSTANT DECLARATIONS
+*/
+#define AIR_LAG_MAX_MEM_NUM       (4)
+#define AIR_LAG_MAX_PTG_NUM       (2)
+
+#define AIR_LAG_MAX_SA_LRN_NUM     BITS(0,12)
+#define AIR_GRP_PORT(p,n)         (((p) & BITS(0,4)) << (n * 8))
+#define AIR_LAG_MAX_BUSY_TIME      (20)
+
+
+
+/* MACRO FUNCTION DECLARATIONS
+*/
+
+/* DATA TYPE DECLARATIONS
+*/
+typedef struct AIR_LAG_PTGINFO_S
+{
+    UI32_T csr_gp_enable[4];
+    UI32_T csr_gp_port[4];
+}AIR_LAG_PTGINFO_T;
+
+
+typedef struct AIR_LAG_DISTINFO_S
+{
+    UI32_T sp:1;
+    UI32_T sa:1;
+    UI32_T da:1;
+    UI32_T sip:1;
+    UI32_T dip:1;
+    UI32_T sport:1;
+    UI32_T dport:1;
+    UI32_T reverse:25;
+}AIR_LAG_DISTINFO_T;
+
+/* EXPORTED SUBPROGRAM SPECIFICATIONS
+*/
+/* FUNCTION NAME: air_lag_setMember
+ * PURPOSE:
+ *      Set LAG member(s) for a specific LAG port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      ptg_index       --  Port trunk index
+ *      mem_index       --  Member index
+ *      mem_en          --  enable Member
+ *      port_index      --  Member port
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_lag_setMember(
+    const UI32_T        unit,
+    const UI32_T        ptg_index,
+    const UI32_T        mem_index,
+    const UI32_T        mem_en,
+    const UI32_T        port_index);
+
+
+/* FUNCTION NAME: air_lag_getMember
+ * PURPOSE:
+ *      Get LAG member count.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      ptg_index       --  Port trunk index
+ *
+ * OUTPUT:
+ *      member      --  Member ports of  one port trunk
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_lag_getMember(
+    const UI32_T unit,
+    const UI32_T ptg_index,
+    AIR_LAG_PTGINFO_T * member);
+
+/* FUNCTION NAME: air_lag_set_ptgc_state
+ * PURPOSE:
+ *     set port trunk group control state.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      ptgc_enable     --  enabble or disable port trunk function
+ *
+ * OUTPUT:
+ *      none
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_lag_set_ptgc_state(
+    const UI32_T unit,
+    const BOOL_T ptgc_enable);
+
+/* FUNCTION NAME: air_lag_get_ptgc_state
+ * PURPOSE:
+ *      Get port trunk group control state.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      ptr_state        --  port trunk fucntion is enable or disable
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_lag_get_ptgc_state(
+    const UI32_T unit,
+    UI32_T *ptr_state);
+
+
+/* FUNCTION NAME: air_lag_setDstInfo
+ * PURPOSE:
+ *      Set information for the packet distribution.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      dstInfo         --  Infomation selection of packet distribution
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_lag_setDstInfo(
+    const UI32_T unit,
+    const AIR_LAG_DISTINFO_T dstInfo);
+
+/* FUNCTION NAME: air_lag_getDstInfo
+ * PURPOSE:
+ *      Set port trunk hashtype.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      ptr_dstInfo     --  Infomation selection of packet distribution
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_lag_getDstInfo(
+    const UI32_T unit,
+    AIR_LAG_DISTINFO_T *ptr_dstInfo);
+
+
+/* FUNCTION NAME: air_lag_setState
+ * PURPOSE:
+ *      Set the enable/disable for a specific LAG port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      hashtype        --  crc32msb/crc32lsb/crc16/xor4
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_lag_sethashtype(
+    const UI32_T unit,
+    const UI32_T hashtype);
+
+/* FUNCTION NAME: air_lag_getState
+ * PURPOSE:
+ *      Get port trunk hashtype.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      hashtype        --  crc32msb/crc32lsb/crc16/xor4
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_lag_gethashtype(
+    const UI32_T unit,
+    UI32_T *hashtype);
+
+/* FUNCTION NAME: air_lag_setSpSel
+ * PURPOSE:
+ *      Set the enable/disable for selection source port composition.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      enable          --  enable or disable source port compare
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_lag_setSpSel(
+    const UI32_T unit,
+    const BOOL_T spsel_enable);
+
+/* FUNCTION NAME: air_lag_getSpSel
+ * PURPOSE:
+ *      Get selection source port composition.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      ptr_state       --  source port compare is enable or disable
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_lag_getSpSel(
+    const UI32_T unit,
+    UI32_T *ptr_state);
+
+/* FUNCTION NAME: air_lag_setPTSeed
+ * PURPOSE:
+ *      Set the enable/disable for a specific LAG port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      ptseed          --  port trunk rand seed
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_lag_setPTSeed(
+    const UI32_T unit,
+    const UI32_T ptseed);
+
+/* FUNCTION NAME: air_lag_getPTSeed
+ * PURPOSE:
+ *      Get port trunk hashtype.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      ptseed          --  port trunk rand seed
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_lag_getPTSeed(
+    const UI32_T unit,
+    UI32_T *ptseed);
+
+
+#endif /* End of AIR_LAG_H */
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_led.h b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_led.h
new file mode 100644
index 0000000..6419453
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_led.h
@@ -0,0 +1,299 @@
+/* FILE NAME: air_led.h
+ * PURPOSE:
+ * 1. Define information for air_led.c
+ * NOTES:
+ */
+
+#ifndef AIR_LED_H
+#define AIR_LED_H
+
+/* INCLUDE FILE DECLARATIONS
+*/
+
+/* NAMING CONSTANT DECLARATIONS
+*/
+
+#define MAX_NUM_LED_ENTITY          2
+#define UNIT_LED_BLINK_DURATION     1024
+
+typedef enum
+{
+    AIR_LED_MODE_DISABLE,      /* ALL LED outputs ard disabled */
+    AIR_LED_MODE_2LED_MODE0,   /* 2 LED pins are enabled. Active high.
+                                   LED 0: Link.
+                                   LED 1: Activity. */
+    AIR_LED_MODE_2LED_MODE1,   /* 2 LED pins are enabled. Active high.
+                                   LED 0: Link 1000 Activity.
+                                   LED 1: Link 100 Activity. */
+    AIR_LED_MODE_2LED_MODE2,   /* 2 LED pins are enabled. Active high.
+                                   LED 0: Link 1000 Activity.
+                                   LED 1: Link 10/100 Activity. */
+    AIR_LED_MODE_USER_DEFINE,  /* LED functions of each pin are user-defined */
+    AIR_LED_MODE_LAST
+}AIR_LED_MODE_T;
+
+typedef enum
+{
+    AIR_LED_BLK_DUR_32M,           /* Blink duration: 32 ms */
+    AIR_LED_BLK_DUR_64M,           /* Blink duration: 64 ms */
+    AIR_LED_BLK_DUR_128M,          /* Blink duration: 128 ms */
+    AIR_LED_BLK_DUR_256M,          /* Blink duration: 256 ms */
+    AIR_LED_BLK_DUR_512M,          /* Blink duration: 512 ms */
+    AIR_LED_BLK_DUR_1024M,         /* Blink duration: 1024 ms */
+    AIR_LED_BLK_DUR_LAST
+}AIR_LED_BLK_DUR_T;
+
+/* MACRO FUNCTION DECLARATIONS
+*/
+
+/* DATA TYPE DECLARATIONS
+*/
+typedef struct AIR_LED_ON_EVT_S
+{
+    BOOL_T link_1000m;     /* Link 1000M */
+    BOOL_T link_100m;      /* Link 100M */
+    BOOL_T link_10m;       /* Link 10M */
+    BOOL_T link_dn;        /* Link Down */
+    BOOL_T fdx;            /* Full Duplex */
+    BOOL_T hdx;            /* Half Duplex */
+    BOOL_T force;          /* Force on (logic 1) */
+}AIR_LED_ON_EVT_T;
+
+typedef struct AIR_LED_BLK_EVT_S
+{
+    BOOL_T tx_act_1000m;  /* 1000Mbps TX Activity */
+    BOOL_T rx_act_1000m;  /* 1000Mbps RX Activity */
+    BOOL_T tx_act_100m;   /* 100Mbps TX Activity */
+    BOOL_T rx_act_100m;   /* 100Mbps RX Activity */
+    BOOL_T tx_act_10m;    /* 10Mbps TX Activity */
+    BOOL_T rx_act_10m;    /* 10Mbps RX Activity */
+    BOOL_T cls;           /* Collision */
+    BOOL_T rx_crc;        /* Rx CRC Error */
+    BOOL_T rx_idle;       /* Rx Idle Error */
+    BOOL_T force;         /* Force blinks (logic 1) */
+}AIR_LED_BLK_EVT_T;
+
+/* EXPORTED SUBPROGRAM SPECIFICATIONS
+*/
+/* FUNCTION NAME: air_led_setMode
+ * PURPOSE:
+ *      Set the LED processing mode for a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      mode            --  Setting mode of LED
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      The LED control register is shared with all port on AN8855.
+ *      Setting LED on any one port will also set to each other ports.
+ */
+AIR_ERROR_NO_T
+air_led_setMode(
+    const UI32_T unit,
+    const UI8_T port,
+    const AIR_LED_MODE_T mode);
+
+/* FUNCTION NAME:air_led_getMode
+ * PURPOSE:
+ *      Get the LED processing mode for a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *
+ * OUTPUT:
+ *      ptr_mode        --  Setting mode of LED
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_OTHERS
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_led_getMode(
+    const UI32_T unit,
+    const UI8_T port,
+    AIR_LED_MODE_T *ptr_mode);
+
+/* FUNCTION NAME: air_led_setState
+ * PURPOSE:
+ *      Set the enable state for a specific LED.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      entity          --  Entity of LED
+ *      state           --  TRUE: Enable
+ *                          FALSE: Disable
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      The LED control register is shared with all port on AN8855.
+ *      Setting LED on any one port will also set to each other ports.
+ */
+AIR_ERROR_NO_T
+air_led_setState(
+    const UI32_T unit,
+    const UI8_T port,
+    const UI8_T entity,
+    const BOOL_T state);
+
+/* FUNCTION NAME: air_led_getState
+ * PURPOSE:
+ *      Get the enable state for a specific LED.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      entity          --  Entity of LED
+ *
+ * OUTPUT:
+ *      ptr_state       --  TRUE: Enable
+ *                          FALSE: Disable
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_led_getState(
+    const UI32_T unit,
+    const UI8_T port,
+    const UI8_T entity,
+    BOOL_T *ptr_state);
+
+/* FUNCTION NAME: air_led_setUsrDef
+ * PURPOSE:
+ *      Set the user-defined configuration of a speficic LED.
+ *      It only work when air_led_setState() set to AIR_LED_MODE_USER_DEFINE.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      entity          --  Entity of LED
+ *      polar           --  LOW: Active low
+ *                          HIGH: Active high
+ *      on_evt          --  AIR_LED_ON_EVT_T
+ *                          LED turns on if any event is detected
+ *      blk_evt         --  AIR_LED_BLK_EVT_T
+ *                          LED blinks blink if any event is detected
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      The LED control register is shared with all port on AN8855.
+ *      Setting LED on any one port will also set to each other ports.
+ */
+AIR_ERROR_NO_T
+air_led_setUsrDef(
+    const UI32_T unit,
+    const UI8_T port,
+    const UI8_T entity,
+    const BOOL_T polar,
+    const AIR_LED_ON_EVT_T on_evt,
+    const AIR_LED_BLK_EVT_T blk_evt);
+
+/* FUNCTION NAME: air_led_getUsrDef
+ * PURPOSE:
+ *      Get the user-defined configuration of a speficic LED.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      entity          --  Entity of LED
+ * OUTPUT:
+ *      ptr_polar       --  LOW: Active low
+ *                          HIGH: Active high
+ *      ptr_on_evt      --  AIR_LED_ON_EVT_T
+ *                          LED turns on if any event is detected
+ *      ptr_blk_evt     --  AIR_LED_BLK_EVT_T
+ *                          LED blinks if any event is detected
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_led_getUsrDef(
+    const UI32_T unit,
+    const UI8_T port,
+    const UI8_T entity,
+    BOOL_T *ptr_polar,
+    AIR_LED_ON_EVT_T *ptr_on_evt,
+    AIR_LED_BLK_EVT_T *ptr_blk_evt);
+
+/* FUNCTION NAME: air_led_setBlkTime
+ * PURPOSE:
+ *      Set the Blinking duration of a speficic LED.
+ *      It only work when air_led_setState() set to AIR_LED_MODE_USER_DEFINE.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      dur             --  Blink duration
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      The LED control register is shared with all port on AN8855.
+ *      Setting LED on any one port will also set to each other ports.
+ */
+AIR_ERROR_NO_T
+air_led_setBlkTime(
+    const UI32_T unit,
+    const UI8_T port,
+    const AIR_LED_BLK_DUR_T dur);
+
+/* FUNCTION NAME: air_led_getBlkTime
+ * PURPOSE:
+ *      Get the Blinking duration of a speficic LED.
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *
+ * OUTPUT:
+ *      ptr_dur         --  Blink duration
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_led_getBlkTime(
+    const UI32_T unit,
+    const UI8_T port,
+    AIR_LED_BLK_DUR_T *ptr_dur);
+
+#endif /* End of AIR_LED_H */
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_mib.h b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_mib.h
new file mode 100644
index 0000000..6ce0323
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_mib.h
@@ -0,0 +1,250 @@
+/* FILE NAME: air_mib.h
+ * PURPOSE:
+ *      Define the MIB counter function in AIR SDK.
+ *
+ * NOTES:
+ *      None
+ */
+
+#ifndef AIR_MIB_H
+#define AIR_MIB_H
+
+/* INCLUDE FILE DECLARATIONS
+*/
+#define MIB_ALL_ITEM    0xFFFFFFFF
+#define AIR_MIB_MAX_ACL_EVENT_NUM      (64)
+#define CSR_ACL_MIB_SEL_OFFSET          (4)
+
+/* NAMING CONSTANT DECLARATIONS
+*/
+typedef struct AIR_MIB_CNT_TX_S
+{
+    UI32_T TDPC;      /* TX Drop Packet */
+    UI32_T TCRC;      /* TX CRC Packet */
+    UI32_T TUPC;      /* TX Unicast Packet */
+    UI32_T TMPC;      /* TX Multicast Packet */
+    UI32_T TBPC;      /* TX Broadcast Packet */
+    UI32_T TCEC;      /* TX Collision Event Count */
+    UI32_T TSCEC;     /* TX Single Collision Event Count */
+    UI32_T TMCEC;     /* TX Multiple Conllision Event Count */
+    UI32_T TDEC;      /* TX Deferred Event Count */
+    UI32_T TLCEC;     /* TX Late Collision Event Count */
+    UI32_T TXCEC;     /* TX Excessive Collision Event Count */
+    UI32_T TPPC;      /* TX Pause Packet */
+    UI32_T TL64PC;    /* TX Packet Length 64 bytes */
+    UI32_T TL65PC;    /* TX Packet Length 65 ~ 127 bytes */
+    UI32_T TL128PC;   /* TX Packet Length 128 ~ 255 bytes */
+    UI32_T TL256PC;   /* TX Packet Length 256 ~ 511 bytes */
+    UI32_T TL512PC;   /* TX Packet Length 512 ~ 1023 bytes */
+    UI32_T TL1024PC;  /* TX Packet Length 1024 ~ 1518 bytes */
+    UI32_T TL1519PC;  /* TX Packet Length 1519 ~ max bytes */
+    UI32_T TODPC;     /* TX Oversize Drop Packet */
+    UI64_T TOC;       /* TX Octets good or bad packtes determined by TX_OCT_CNT_GOOD or TX_OCT_CNT_BAD(64 bit-width)*/
+    UI64_T TOC2;      /* TX Octets bad packets (64 bit-width)*/
+}AIR_MIB_CNT_TX_T;
+
+typedef struct AIR_MIB_CNT_RX_S
+{
+    UI32_T RDPC;      /* RX Drop Packet */
+    UI32_T RFPC;      /* RX filtering Packet */
+    UI32_T RUPC;      /* RX Unicast Packet */
+    UI32_T RMPC;      /* RX Multicast Packet */
+    UI32_T RBPC;      /* RX Broadcast Packet */
+    UI32_T RAEPC;     /* RX Alignment Error Packet */
+    UI32_T RCEPC;     /* RX CRC Packet */
+    UI32_T RUSPC;     /* RX Undersize Packet */
+    UI32_T RFEPC;     /* RX Fragment Error Packet */
+    UI32_T ROSPC;     /* RX Oversize Packet */
+    UI32_T RJEPC;     /* RX Jabber Error Packet */
+    UI32_T RPPC;      /* RX Pause Packet */
+    UI32_T RL64PC;    /* RX Packet Length 64 bytes */
+    UI32_T RL65PC;    /* RX Packet Length 65 ~ 127 bytes */
+    UI32_T RL128PC;   /* RX Packet Length 128 ~ 255 bytes */
+    UI32_T RL256PC;   /* RX Packet Length 256 ~ 511 bytes */
+    UI32_T RL512PC;   /* RX Packet Length 512 ~ 1023 bytes */
+    UI32_T RL1024PC;  /* RX Packet Length 1024 ~ 1518 bytes */
+    UI32_T RL1519PC;  /* RX Packet Length 1519 ~ max bytes */
+    UI32_T RCDPC;     /* RX_CTRL Drop Packet */
+    UI32_T RIDPC;     /* RX Ingress Drop Packet */
+    UI32_T RADPC;     /* RX ARL Drop Packet */
+    UI32_T FCDPC;     /* FLow Control Drop Packet */
+    UI32_T WRDPC;     /* WRED Drop Packtet */
+    UI32_T MRDPC;     /* Mirror Drop Packet */
+    UI32_T SFSPC;     /* RX  sFlow Sampling Packet */
+    UI32_T SFTPC;     /* Rx sFlow Total Packet */
+    UI32_T RXC_DPC;   /* Port Control Drop Packet */
+    UI64_T ROC;       /* RX Octets good or bad packtes determined by TX_OCT_CNT_GOOD or TX_OCT_CNT_BAD (64 bit-width)*/
+    UI64_T ROC2;      /* RX Octets bad packets (64 bit-width)*/
+
+}AIR_MIB_CNT_RX_T;
+
+/* MACRO FUNCTION DECLARATIONS
+*/
+
+/* DATA TYPE DECLARATIONS
+*/
+
+/* EXPORTED SUBPROGRAM SPECIFICATIONS
+*/
+/* FUNCTION NAME: air_mib_setEnable
+ * PURPOSE:
+ *      Enable or Disable mib count fucntion.
+ *
+ * INPUT:
+ *      unit           --   Device ID
+ *      mib_en         --   enable or disable mib_en
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_mib_setEnable(
+    const UI32_T unit,
+    const BOOL_T mib_en);
+/* FUNCTION NAME: air_mib_getEnable
+ * PURPOSE:
+ *      Enable or Disable mib count fucntion.
+ *
+ * INPUT:
+ *      unit           --   Device ID
+ *
+ * OUTPUT:
+ *      mib_en         --   enable or disable mib_en
+
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_mib_getEnable(
+    const UI32_T unit,
+    BOOL_T *mib_en);
+
+/* FUNCTION NAME: air_mib_clear
+ * PURPOSE:
+ *      Clear all counters of all MIB counters.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_mib_clear(
+    const UI32_T unit);
+
+/* FUNCTION NAME: air_mib_clear_by_port
+ * PURPOSE:
+ *      Clear all counters of all MIB counters.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  clear port number
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_mib_clear_by_port(
+    const UI32_T unit,
+    const UI32_T port);
+
+/* FUNCTION NAME: air_mib_clearAclEvent
+ * PURPOSE:
+ *      Clear all counters of ACL event
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+
+/* FUNCTION NAME: air_mib_get
+ * PURPOSE:
+ *      Get the structure of MIB counter for a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *
+ * OUTPUT:
+ *      ptr_rx_mib      --  MIB Counters of Rx Event
+ *      ptr_tx_mib      --  MIB Counters of Tx Event
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_mib_get(
+    const UI32_T unit,
+    const UI32_T port,
+    AIR_MIB_CNT_RX_T *ptr_rx_mib,
+    AIR_MIB_CNT_TX_T *ptr_tx_mib);
+
+AIR_ERROR_NO_T
+air_mib_clearAclEvent(
+    const UI32_T unit);
+
+/* FUNCTION NAME: air_mib_getAclEvent
+ * PURPOSE:
+ *      Get the total number of ACL event occurred.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      idx             --  Index of ACL event
+ *
+ * OUTPUT:
+ *      ptr_cnt         --  The total number of ACL event occured
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_mib_getAclEvent(
+    const UI32_T unit,
+    const UI32_T idx,
+    UI32_T *ptr_cnt);
+
+#endif /* End of AIR_MIB_H */
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_mirror.h b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_mirror.h
new file mode 100644
index 0000000..2bef998
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_mirror.h
@@ -0,0 +1,202 @@
+/* FILE NAME: air_mirror.h
+ * PURPOSE:
+ *      Define the port mirror function in AIR SDK.
+ *
+ * NOTES:
+ *      None
+ */
+
+#ifndef AIR_MIRROR_H
+#define AIR_MIRROR_H
+
+/* INCLUDE FILE DECLARATIONS
+*/
+
+/* NAMING CONSTANT DECLARATIONS
+*/
+#define AIR_MAX_MIRROR_SESSION  (2)
+/* MACRO FUNCTION DECLARATIONS
+*/
+
+/* DATA TYPE DECLARATIONS
+*/
+
+/* mirror session */
+typedef struct AIR_MIR_SESSION_S
+{
+#define AIR_MIR_SESSION_FLAGS_ENABLE            (1U << 0)
+#define AIR_MIR_SESSION_FLAGS_DIR_TX            (1U << 1)
+#define AIR_MIR_SESSION_FLAGS_DIR_RX            (1U << 2)
+#define AIR_MIR_SESSION_FLAGS_TX_TAG_OBEY_CFG   (1U << 3)
+
+    /* flags refer to AIR_MIR_SESSION_FLAGS_XXX */
+    UI32_T                              flags;
+    UI32_T                              dst_port;
+    UI32_T                              src_port;
+} AIR_MIR_SESSION_T;
+
+/* EXPORTED SUBPROGRAM SPECIFICATIONS
+*/
+/* FUNCTION NAME: air_mir_addSession
+* PURPOSE:
+*      This API is used to add or set a mirror session.
+* INPUT:
+*      unit        --   Device unit number
+*      session_id  --   The session information
+*      ptr_session --   The session information
+* OUTPUT:
+*       None
+*
+* RETURN:
+*       AIR_E_OK
+*       AIR_E_BAD_PARAMETER
+*
+* NOTES:
+*       None
+*/
+AIR_ERROR_NO_T
+air_mir_addSession(
+    const UI32_T unit,
+    const UI32_T session_id,
+    const AIR_MIR_SESSION_T *ptr_session);
+
+/* FUNCTION NAME: air_mir_delSession
+* PURPOSE:
+*      This API is used to delete a mirror session.
+* INPUT:
+*      unit        --   Device unit number
+*      session_id  --   The session information
+* OUTPUT:
+*       None
+*
+* RETURN:
+*       AIR_E_OK
+*       AIR_E_BAD_PARAMETER
+*
+* NOTES:
+*       None
+*/
+AIR_ERROR_NO_T
+air_mir_delSession(
+    const UI32_T unit,
+    const UI32_T session_id);
+
+
+/* FUNCTION NAME: air_mir_getSession
+* PURPOSE:
+*      This API is used to get mirror session information.
+* INPUT:
+*      unit         --  Device unit number
+*      session_id   --   The session information
+* OUTPUT:
+*      ptr_session  --  The information of this session to be obtained
+* RETURN:
+*       AIR_E_OK
+*       AIR_E_BAD_PARAMETER
+*
+* NOTES:
+*       None
+*/
+AIR_ERROR_NO_T
+air_mir_getSession(
+    const UI32_T unit,
+    const UI32_T session_id,
+    AIR_MIR_SESSION_T *ptr_session);
+
+
+/* FUNCTION NAME: air_mir_setSessionAdminMode
+* PURPOSE:
+*      This API is used to set mirror session state
+* INPUT:
+*      unit         --  Device unit number
+*      session_id   --  mirror session id
+*      state        --  FALSE: disable
+*                       TRUE:  enable
+* OUTPUT:
+*      None
+* RETURN:
+*       AIR_E_OK
+*       AIR_E_BAD_PARAMETER
+*
+* NOTES:
+*       None
+*/
+AIR_ERROR_NO_T
+air_mir_setSessionAdminMode(
+    const UI32_T unit,
+    const UI32_T session_id,
+    const BOOL_T state);
+
+
+/* FUNCTION NAME: air_mir_getSessionAdminMode
+* PURPOSE:
+*      This API is used to get mirror session state
+* INPUT:
+*      unit         --  Device unit number
+*      session_id   --  mirror session id
+* OUTPUT:
+*      state        --  FALSE: disable
+*                       TRUE:  enable
+* RETURN:
+*       AIR_E_OK
+*       AIR_E_BAD_PARAMETER
+*
+* NOTES:
+*       None
+*/
+AIR_ERROR_NO_T
+air_mir_getSessionAdminMode(
+    const UI32_T unit,
+    const UI32_T session_id,
+    BOOL_T *state);
+
+
+/* EXPORTED SUBPROGRAM SPECIFICATIONS
+*/
+/* FUNCTION NAME: air_mir_setMirrorPort
+* PURPOSE:
+*      This API is used to set mirror port mirroring type
+* INPUT:
+*      unit        --   Device unit number
+*      session_id  --  mirror session id
+*      ptr_session --   The session information
+* OUTPUT:
+*       None
+*
+* RETURN:
+*       AIR_E_OK
+*       AIR_E_BAD_PARAMETER
+*
+* NOTES:
+*       None
+*/
+AIR_ERROR_NO_T
+air_mir_setMirrorPort(
+    const UI32_T unit,
+    const UI32_T session_id,
+    const AIR_MIR_SESSION_T *ptr_session);
+
+
+/* FUNCTION NAME: air_mir_getMirrorPort
+* PURPOSE:
+*      This API is used to get mirror port mirroring type
+* INPUT:
+*      unit         --  Device unit number
+*      session_id   --  mirror session id
+* OUTPUT:
+*      ptr_session  --  The information of this session to be obtained
+* RETURN:
+*       AIR_E_OK
+*       AIR_E_BAD_PARAMETER
+*
+* NOTES:
+*       None
+*/
+AIR_ERROR_NO_T
+air_mir_getMirrorPort(
+    const UI32_T unit,
+    const UI32_T session_id,
+    AIR_MIR_SESSION_T *ptr_session);
+
+
+#endif /* End of AIR_MIRROR_H */
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_port.h b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_port.h
new file mode 100644
index 0000000..a8745eb
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_port.h
@@ -0,0 +1,963 @@
+/* FILE NAME:   air_port.h

+ * PURPOSE:

+ *      Define port function in AIR SDK.

+ *

+ * NOTES:

+ *      None

+ */

+

+#ifndef AIR_PORT_H

+#define AIR_PORT_H

+

+/* INCLUDE FILE DECLARATIONS

+ */

+

+/* NAMING CONSTANT DECLARATIONS

+ */

+#define AIR_MAX_NUM_OF_UNIT            (1)

+#define AIR_DST_DEFAULT_PORT           (31)

+#define AIR_PORT_TX                    (0x00)

+#define AIR_PORT_RX                    (0x01)

+#define AIR_MAX_NUM_OF_PORTS           (7)

+#define AIR_MAX_NUM_OF_GIGA_PORTS      (5)

+#define AIR_SGMII_PORT_OFFSET_BEGIN    (5)

+#define AIR_SGMII_PORT_OFFSET_END      (6)

+#define AIR_ALL_PORT_BITMAP            (0x7F)

+

+/* Definition of Power Saving mode */

+#define AIR_PORT_PS_LINKSTATUS         (0x1 << 0)

+#define AIR_PORT_PS_EEE                (0x1 << 1)

+#define AIR_PORT_PS_MASK               (0x3)

+

+/* MACRO FUNCTION DECLARATIONS

+ */

+

+/* DATA TYPE DECLARATIONS

+ */

+/* AIR_PORT_BITMAP_T is the data type for physical port bitmap. */

+#define AIR_BITMAP_SIZE(bit_num)                    ((((bit_num) - 1) / AIR_MAX_NUM_OF_PORTS) + 1)

+#define AIR_PORT_BITMAP_SIZE           AIR_BITMAP_SIZE(AIR_MAX_NUM_OF_PORTS)

+typedef UI32_T   AIR_PORT_BITMAP_T[AIR_PORT_BITMAP_SIZE];

+

+#define AIR_INVALID_ID      (0xFFFFFFFF)

+#define AIR_PORT_INVALID    (AIR_INVALID_ID)

+

+/* Definition of SGMII mode */

+typedef enum

+{

+    AIR_PORT_SGMII_MODE_AN,

+    AIR_PORT_SGMII_MODE_FORCE,

+    AIR_PORT_SGMII_MODE_LAST

+}AIR_PORT_SGMII_MODE_T;

+

+/* Definition of port speed */

+typedef enum

+{

+    AIR_PORT_SPEED_10M,

+    AIR_PORT_SPEED_100M,

+    AIR_PORT_SPEED_1000M,

+    AIR_PORT_SPEED_2500M,

+    AIR_PORT_SPEED_LAST

+}AIR_PORT_SPEED_T;

+

+typedef enum

+{

+    AIR_PORT_DUPLEX_HALF,

+    AIR_PORT_DUPLEX_FULL,

+    AIR_PORT_DUPLEX_LAST

+}AIR_PORT_DUPLEX_T;

+

+typedef enum

+{

+    AIR_PORT_LINK_DOWN,

+    AIR_PORT_LINK_UP,

+    AIR_PORT_LINK_LAST

+}AIR_PORT_LINK_T;

+

+/* Definition of Smart speed down will occur after AN failed how many times */

+typedef enum

+{

+    AIR_PORT_SSD_2T,

+    AIR_PORT_SSD_3T,

+    AIR_PORT_SSD_4T,

+    AIR_PORT_SSD_5T,

+    AIR_PORT_SSD_LAST

+}AIR_PORT_SSD_T;

+

+typedef enum

+{

+    AIR_PORT_VLAN_MODE_PORT_MATRIX = 0,    /* Port matrix mode  */

+    AIR_PORT_VLAN_MODE_FALLBACK,           /* Fallback mode  */

+    AIR_PORT_VLAN_MODE_CHECK,              /* Check mode  */

+    AIR_PORT_VLAN_MODE_SECURITY,           /* Security mode  */

+    AIR_PORT_VLAN_MODE_LAST

+} AIR_PORT_VLAN_MODE_T;

+

+/* Definition of AN Advertisement Register */

+typedef struct AIR_AN_ADV_S

+{

+    BOOL_T advCap10HDX;         /* Advertises 10 BASE-T HDX */

+    BOOL_T advCap10FDX;         /* Advertises 10 BASE-T FDX */

+    BOOL_T advCap100HDX;        /* Advertises 100 BASE-T HDX */

+    BOOL_T advCap100FDX;        /* Advertises 100 BASE-T FDX */

+    BOOL_T advCap1000FDX;       /* Advertises 1000 BASE-T FDX */

+    BOOL_T advPause;            /* Advertieses Asynchronous Pause */

+}AIR_AN_ADV_T;

+

+/* Definition of Link Status of a specific port */

+typedef struct AIR_PORT_STATUS_S

+{

+    BOOL_T link;

+    BOOL_T duplex;

+    UI32_T speed;

+}AIR_PORT_STATUS_T;

+

+/* EXPORTED SUBPROGRAM SPECIFICATIONS

+ */

+/* FUNCTION NAME: air_port_setPortMatrix

+ * PURPOSE:

+ *      Set port matrix from the specified device.

+ *

+ * INPUT:

+ *      unit            --  Unit id

+ *      port            --  Port id

+ *      port_bitmap     --  Matrix port bitmap

+ *

+ * OUTPUT:

+ *      None

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_OTHERS

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_port_setPortMatrix(

+    const UI32_T    unit,

+    const UI32_T    port,

+    const UI32_T    port_bitmap);

+

+/* FUNCTION NAME: air_port_getPortMatrix

+ * PURPOSE:

+ *      Get port matrix from the specified device.

+ *

+ * INPUT:

+ *      unit            --  Unit id

+ *      port            --  Port id

+ *

+ * OUTPUT:

+ *      p_port_bitmap   --  Matrix port bitmap

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_OTHERS

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_port_getPortMatrix(

+    const UI32_T    unit,

+    const UI32_T    port,

+    UI32_T          *p_port_bitmap);

+

+/* FUNCTION NAME: air_port_setVlanMode

+ * PURPOSE:

+ *      Set port-based vlan mechanism from the specified device.

+ *

+ * INPUT:

+ *      unit            --  Unit id

+ *      port            --  Port id

+ *      mode            --  Port vlan mode

+ *

+ * OUTPUT:

+ *      None

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_OTHERS

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_port_setVlanMode(

+    const UI32_T    unit,

+    const UI32_T    port,

+    const AIR_PORT_VLAN_MODE_T mode);

+

+/* FUNCTION NAME: air_port_getVlanMode

+ * PURPOSE:

+ *      Get port-based vlan mechanism from the specified device.

+ *

+ * INPUT:

+ *      unit            --  Unit id

+ *      port            --  Port id

+ *

+ * OUTPUT:

+ *      p_mode          --  Port vlan mode

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_OTHERS

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_port_getVlanMode(

+    const UI32_T    unit,

+    const UI32_T    port,

+    AIR_PORT_VLAN_MODE_T *p_mode);

+

+/* FUNCTION NAME: air_port_setAnMode

+ * PURPOSE:

+ *      Set the auto-negotiation mode for a specific port.(Auto or Forced)

+ *

+ * INPUT:

+ *      unit            --  Device ID

+ *      port            --  Index of port number

+ *      state           --  FALSE:Disable

+ *                          TRUE: Enable

+ * OUTPUT:

+ *      None

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_setAnMode(

+    const UI32_T unit,

+    const UI32_T port,

+    const BOOL_T state);

+

+/* FUNCTION NAME: air_port_getAnMode

+ * PURPOSE:

+ *      Get the auto-negotiation mode for a specific port.

+ *

+ * INPUT:

+ *      unit            --  Device ID

+ *      port            --  Index of port number

+ *

+ * OUTPUT:

+ *      state           --  FALSE:Disable

+ *                          TRUE: Enable

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_getAnMode(

+    const UI32_T unit,

+    const UI32_T port,

+    BOOL_T *ptr_state);

+

+/* FUNCTION NAME: air_port_setLocalAdvAbility

+ * PURPOSE:

+ *      Set the auto-negotiation advertisement for a

+ *      specific port.

+ *

+ * INPUT:

+ *      unit            --  Device ID

+ *      port            --  Index of port number

+ *      adv             --  AN advertisement setting

+ *

+ * OUTPUT:

+ *      None

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_setLocalAdvAbility(

+    const UI32_T unit,

+    const UI32_T port,

+    const AIR_AN_ADV_T adv);

+

+/* FUNCTION NAME: air_port_getLocalAdvAbility

+ * PURPOSE:

+ *      Get the auto-negotiation advertisement for a

+ *      specific port.

+ *

+ * INPUT:

+ *      unit            --  Device ID

+ *      port            --  Index of port number

+ *

+ * OUTPUT:

+ *      ptr_adv         --  AN advertisement setting

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_getLocalAdvAbility(

+    const UI32_T unit,

+    const UI32_T port,

+    AIR_AN_ADV_T *ptr_adv);

+

+/* FUNCTION NAME: air_port_getRemoteAdvAbility

+ * PURPOSE:

+ *      Get the auto-negotiation remote advertisement for a

+ *      specific port.

+ *

+ * INPUT:

+ *      unit            --  Device ID

+ *      port            --  Index of port number

+ *

+ * OUTPUT:

+ *      ptr_lp_adv      --  AN advertisement of link partner

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_getRemoteAdvAbility(

+    const UI32_T unit,

+    const UI32_T port,

+    AIR_AN_ADV_T *ptr_lp_adv);

+

+/* FUNCTION NAME: air_port_setSpeed

+ * PURPOSE:

+ *      Set the speed for a specific port.

+ *      This setting is used on force mode only.

+ *

+ * INPUT:

+ *      unit            --  Device ID

+ *      port            --  Index of port number

+ *      speed           --  AIR_PORT_SPEED_10M:  10Mbps

+ *                          AIR_PORT_SPEED_100M: 100Mbps

+ *                          AIR_PORT_SPEED_1000M:1Gbps

+ *                          AIR_PORT_SPEED_2500M:2.5Gbps (Port5, Port6)

+ * OUTPUT:

+ *      None

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_setSpeed(

+    const UI32_T unit,

+    const UI32_T port,

+    const UI32_T speed);

+

+/* FUNCTION NAME: air_port_getSpeed

+ * PURPOSE:

+ *      Get the speed for a specific port.

+ *

+ * INPUT:

+ *      unit            --  Device ID

+ *      port            --  Index of port number

+ *

+ * OUTPUT:

+ *      ptr_speed       --  AIR_PORT_SPEED_10M:  10Mbps

+ *                          AIR_PORT_SPEED_100M: 100Mbps

+ *                          AIR_PORT_SPEED_1000M:1Gbps

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_getSpeed(

+    const UI32_T unit,

+    const UI32_T port,

+    UI32_T *ptr_speed);

+

+/* FUNCTION NAME: air_port_setDuplex

+ * PURPOSE:

+ *      Get the duplex for a specific port.

+ *      This setting is used on force mode only.

+ *

+ * INPUT:

+ *      unit            --  Device ID

+ *      port            --  Index of port number

+ *      duplex          --  AIR_PORT_DUPLEX_HALF

+ *                          AIR_PORT_DUPLEX_FULL

+ * OUTPUT:

+ *      None

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_setDuplex(

+    const UI32_T unit,

+    const UI32_T port,

+    const BOOL_T duplex);

+

+/* FUNCTION NAME: air_port_getDuplex

+ * PURPOSE:

+ *      Get the duplex for a specific port.

+ *

+ * INPUT:

+ *      unit            --  Device ID

+ *      port            --  Index of port number

+ *

+ * OUTPUT:

+ *      ptr_duplex      --  AIR_PORT_DUPLEX_HALF

+ *                          AIR_PORT_DUPLEX_FULL

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_getDuplex(

+    const UI32_T unit,

+    const UI32_T port,

+    BOOL_T *ptr_duplex);

+

+/* FUNCTION NAME: air_port_getLink

+ * PURPOSE:

+ *      Get the physical link status for a specific port.

+ *

+ * INPUT:

+ *      unit            --  Device ID

+ *      port            --  Index of port number

+ *

+ * OUTPUT:

+ *      ptr_ps          --  AIR_PORT_STATUS_T

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_getLink(

+    const UI32_T unit,

+    const UI32_T port,

+    AIR_PORT_STATUS_T *ptr_ps);

+

+/* FUNCTION NAME: air_port_setBckPres

+ * PURPOSE:

+ *      Set the back pressure configuration for a specific port.

+ *

+ * INPUT:

+ *      unit            --  Device ID

+ *      port            --  Index of port number

+ *      bckPres         --  FALSE:Disable

+ *                          TRUE: Enable

+ * OUTPUT:

+ *      None

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_setBckPres(

+    const UI32_T unit,

+    const UI32_T port,

+    const BOOL_T bckPres);

+

+/* FUNCTION NAME: air_port_getBckPres

+ * PURPOSE:

+ *      Get the back pressure configuration for a specific port.

+ *

+ * INPUT:

+ *      unit            --  Device ID

+ *      port            --  Index of port number

+ *

+ * OUTPUT:

+ *      ptr_bckPres     --  FALSE:Disable

+ *                          TRUE: Enable

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_getBckPres(

+    const UI32_T unit,

+    const UI32_T port,

+    BOOL_T *ptr_bckPres);

+

+/* FUNCTION NAME: air_port_setFlowCtrl

+ * PURPOSE:

+ *      Set the flow control configuration for specific port.

+ *

+ * INPUT:

+ *      unit            --  Select device ID

+ *      port            --  Select port number (0 - 6)

+ *      dir             --  Directions of AIR_PORT_TX or AIR_PORT_RX

+ *      fc_en           --  TRUE: Enable select port flow control

+ *                          FALSE:Disable select port flow control

+ * OUTPUT:

+ *      None

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_setFlowCtrl(

+    const UI32_T unit,

+    const UI32_T port,

+    const BOOL_T dir,

+    const BOOL_T fc_en);

+

+/* FUNCTION NAME: air_port_getFlowCtrl

+ * PURPOSE:

+ *      Get the flow control configuration for specific port.

+ *

+ * INPUT:

+ *      unit            --  Select device ID

+ *      port            --  Select port number (0..6)

+ *      dir             --  AIR_PORT_TX

+ *                          AIR_PORT_RX

+ * OUTPUT:

+ *      ptr_fc_en       --  FALSE: Port flow control disable

+ *                          TRUE: Port flow control enable

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_getFlowCtrl(

+    const UI32_T unit,

+    const UI32_T port,

+    const BOOL_T dir,

+    BOOL_T *ptr_fc_en);

+

+/* FUNCTION NAME: air_port_setJumbo

+ * PURPOSE:

+ *      Set accepting jumbo frmes with specificied size.

+ *

+ * INPUT:

+ *      unit            --  Select device ID

+ *      pkt_len         --  Select max packet length

+ *                          RX_PKT_LEN_1518

+ *                          RX_PKT_LEN_1536

+ *                          RX_PKT_LEN_1552

+ *                          RX_PKT_LEN_MAX_JUMBO

+ *      frame_len       --  Select max lenght of jumbo frames

+ *                          Range : 2 - 15

+ *                          Units : K Bytes

+ * OUTPUT:

+ *      None

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_setJumbo(

+    const UI32_T unit,

+    const UI32_T pkt_len,

+    const UI32_T frame_len);

+

+/* FUNCTION NAME: air_port_getJumbo

+ * PURPOSE:

+ *      Get accepting jumbo frmes with specificied size.

+ *

+ * INPUT:

+ *      unit            --  Select device ID

+ *

+ * OUTPUT:

+ *      ptr_pkt_len     --  Select max packet length

+ *                          RX_PKT_LEN_1518

+ *                          RX_PKT_LEN_1536

+ *                          RX_PKT_LEN_1552

+ *                          RX_PKT_LEN_MAX_JUMBO

+ *      ptr_frame_len   --  Select max lenght of jumbo frames

+ *                          Range : 2 - 15

+ *                          Units : K Bytes

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_getJumbo(

+    const UI32_T unit,

+    UI32_T *ptr_pkt_len,

+    UI32_T *ptr_frame_len);

+

+

+/* FUNCTION NAME: air_port_setPsMode

+ * PURPOSE:

+ *      Set the power saving mode for a specific port.

+ *

+ * INPUT:

+ *      unit            --  Device ID

+ *      port            --  Index of port number

+ *      mode            --  Bit-map:

+ *                          AIR_PORT_PS_LINKSTATUS

+ *                          AIR_PORT_PS_EEE

+ *                          FALSE: Disable / TRUE: Enable

+ * OUTPUT:

+ *      None

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_setPsMode(

+    const UI32_T unit,

+    const UI32_T port,

+    const UI32_T mode);

+

+/* FUNCTION NAME: air_port_getPsMode

+ * PURPOSE:

+ *      Get the power saving mode for a specific port.

+ *

+ * INPUT:

+ *      unit            --  Device ID

+ *      port            --  Index of port number

+ * OUTPUT:

+ *      ptr_mode        --  Bit-map:

+ *                          AIR_PORT_PS_LINKSTATUS

+ *                          AIR_PORT_PS_EEE

+ *                          FALSE: Disable / TRUE: Enable

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_getPsMode(

+    const UI32_T unit,

+    const UI32_T port,

+    UI32_T *ptr_mode);

+

+/* FUNCTION NAME: air_port_setSmtSpdDwn

+ * PURPOSE:

+ *      Set Smart speed down feature for a specific port.

+ *

+ * INPUT:

+ *      unit            --  Device ID

+ *      port            --  Index of port number

+ *      state           --  FALSE:Disable

+ *                          TRUE: Enable

+ *      time            --  AIR_PORT_SSD_2T

+ *                          AIR_PORT_SSD_3T

+ *                          AIR_PORT_SSD_4T

+ *                          AIR_PORT_SSD_5T

+ * OUTPUT:

+ *      None

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_setSmtSpdDwn(

+    const UI32_T unit,

+    const UI32_T port,

+    const BOOL_T state,

+    const UI32_T time);

+

+/* FUNCTION NAME: air_port_getSmtSpdDwn

+ * PURPOSE:

+ *      Get Smart speed down feature for a specific port.

+ *

+ * INPUT:

+ *      unit            --  Device ID

+ *      port            --  Index of port number

+ *

+ * OUTPUT:

+ *      ptr_state       --  FALSE:Disable

+ *                          TRUE: Enable

+ *      ptr_time        --  AIR_PORT_SSD_2T

+ *                          AIR_PORT_SSD_3T

+ *                          AIR_PORT_SSD_4T

+ *                          AIR_PORT_SSD_5T

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_getSmtSpdDwn(

+    const UI32_T unit,

+    const UI32_T port,

+    UI32_T *ptr_state,

+    UI32_T *ptr_time);

+

+/* FUNCTION NAME: air_port_setEnable

+ * PURPOSE:

+ *      Set powerdown state for a specific port.

+ *

+ * INPUT:

+ *      unit            --  Device ID

+ *      port            --  Index of port number

+ *      state           --  FALSE:Disable

+ *                          TRUE: Enable

+ * OUTPUT:

+ *      None

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_setEnable(

+    const UI32_T unit,

+    const UI32_T port,

+    const BOOL_T state);

+

+/* FUNCTION NAME: air_port_getEnable

+ * PURPOSE:

+ *      Get powerdown state for a specific port.

+ *

+ * INPUT:

+ *      unit            --  Device ID

+ *      port            --  Index of port number

+ *

+ * OUTPUT:

+ *      ptr_state       --  FALSE:Disable

+ *                          TRUE: Enable

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_getEnable(

+    const UI32_T unit,

+    const UI32_T port,

+    UI32_T *ptr_state);

+

+/* FUNCTION NAME: air_port_setSpTag

+ * PURPOSE:

+ *      Set special tag state of a specific port.

+ *

+ * INPUT:

+ *      unit            --  Device ID

+ *      port            --  Index of port number

+ *      sptag_en        --  TRUE:  Enable special tag

+ *                          FALSE: Disable special tag

+ * OUTPUT:

+ *        None

+ *

+ * RETURN:

+ *        AIR_E_OK

+ *        AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_setSpTag(

+    const UI32_T unit,

+    const UI32_T port,

+    const BOOL_T sptag_en);

+

+/* FUNCTION NAME: air_port_getSpTag

+ * PURPOSE:

+ *      Get special tag state of a specific port.

+ *

+ * INPUT:

+ *      unit            --  Device ID

+ *      port            --  Index of port number

+ * OUTPUT:

+ *      ptr_sptag_en    --  TRUE:  Special tag enable

+ *                          FALSE: Special tag disable

+ *

+ * RETURN:

+ *        AIR_E_OK

+ *        AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_getSpTag(

+    const UI32_T unit,

+    const UI32_T port,

+    BOOL_T *ptr_sptag_en);

+

+/* FUNCTION NAME: air_port_set5GBaseRModeEnable

+ * PURPOSE:

+ *      Set the port5 5GBase-R mode enable

+ *

+ * INPUT:

+ *      unit            --  Device ID

+ *

+ * OUTPUT:

+ *      None

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_set5GBaseRModeEn(

+    const UI32_T unit);

+

+/* FUNCTION NAME: air_port_setHsgmiiModeEnable

+ * PURPOSE:

+ *      Set the port5 HSGMII mode enable

+ *

+ * INPUT:

+ *      unit            --  Device ID

+ *

+ * OUTPUT:

+ *      None

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_setHsgmiiModeEn(

+    const UI32_T unit);

+

+/* FUNCTION NAME: air_port_setSgmiiMode

+ * PURPOSE:

+ *      Set the port5 SGMII mode for AN or force

+ *

+ * INPUT:

+ *      unit            --  Device ID

+ *      mode            --  AIR_PORT_SGMII_MODE_AN

+ *                          AIR_PORT_SGMII_MODE_FORCE

+ *      speed           --  AIR_PORT_SPEED_10M:   10Mbps

+ *                          AIR_PORT_SPEED_100M:  100Mbps

+ *                          AIR_PORT_SPEED_1000M: 1Gbps

+ *

+ * OUTPUT:

+ *      None

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_setSgmiiMode(

+    const UI32_T unit,

+    const UI32_T mode,

+    const UI32_T speed);

+

+

+/* FUNCTION NAME: air_port_setRmiiMode

+ * PURPOSE:

+ *      Set the port5 RMII mode for 100Mbps or 10Mbps

+ *

+ * INPUT:

+ *      unit            --  Device ID

+ *      speed           --  AIR_PORT_SPEED_10M:  10Mbps

+ *                          AIR_PORT_SPEED_100M: 100Mbps

+ *

+ * OUTPUT:

+ *      None

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_setRmiiMode(

+    const UI32_T unit,

+    const UI32_T speed);

+

+/* FUNCTION NAME: air_port_setRgmiiMode

+ * PURPOSE:

+ *      Set the port5 RGMII mode for 1Gbps or 100Mbps or 10Mbps

+ *

+ * INPUT:

+ *      unit            --  Device ID

+ *      speed           --  AIR_PORT_SPEED_10M:   10Mbps

+ *                          AIR_PORT_SPEED_100M:  100Mbps

+ *                          AIR_PORT_SPEED_1000M: 1Gbps

+ *

+ * OUTPUT:

+ *      None

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_BAD_PARAMETER

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_port_setRgmiiMode(

+    const UI32_T unit,

+    const UI32_T speed);

+

+#endif  /* AIR_PORT_H */

+

diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_qos.h b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_qos.h
new file mode 100644
index 0000000..e1eaf3a
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_qos.h
@@ -0,0 +1,590 @@
+/* FILE NAME: air_qos.h
+* PURPOSE:
+ *      Define the Quailty of Service function in AIR SDK.
+*
+* NOTES:
+*       None
+*/
+
+#ifndef AIR_QOS_H
+#define AIR_QOS_H
+
+/* INCLUDE FILE DECLARATIONS
+*/
+
+/* NAMING CONSTANT DECLARATIONS
+*/
+#define AIR_QOS_MAX_TOKEN               (128)
+#define AIR_QOS_MAX_CIR                 (80001)
+#define AIR_QOS_TOKEN_PERIOD_1_4MS      (5)
+#define AIR_QOS_TOKEN_PERIOD_4MS        (9)
+#define AIR_QOS_L1_RATE_LIMIT           (0x18)
+#define AIR_QOS_L2_RATE_LIMIT           (0x04)
+#define AIR_QOS_QUEUE_PIM_WIDTH         (3)
+#define AIR_QOS_QUEUE_PIM_MASK          (7)
+#define AIR_QOS_QUEUE_DEFAULT_VAL       (0x222227)
+#define AIR_QOS_QUEUE_TRUST_HIGH_WEIGHT (6)
+#define AIR_QOS_QUEUE_TRUST_MID_WEIGHT  (5)
+#define AIR_QOS_QUEUE_TRUST_LOW_WEIGHT  (4)
+#define AIR_QOS_SHAPER_RATE_MAX_EXP     (4)
+#define AIR_QOS_SHAPER_RATE_MAX_MAN     (0x1ffff)
+#define AIR_QOS_SHAPER_RATE_MIN_WEIGHT  (1)
+#define AIR_QOS_SHAPER_RATE_MAX_WEIGHT  (128)
+#define AIR_QOS_QUEUE_0                 (0)
+#define AIR_QOS_QUEUE_1                 (1)
+#define AIR_QOS_QUEUE_2                 (2)
+#define AIR_QOS_QUEUE_3                 (3)
+#define AIR_QOS_QUEUE_4                 (4)
+#define AIR_QOS_QUEUE_5                 (5)
+#define AIR_QOS_QUEUE_6                 (6)
+#define AIR_QOS_QUEUE_7                 (7)
+#define AIR_QOS_MIN_TRAFFIC_ARBITRATION_SCHEME_SP                (1)
+#define AIR_QOS_MIN_TRAFFIC_ARBITRATION_SCHEME_WRR               (0)
+#define AIR_QOS_MAX_TRAFFIC_ARBITRATION_SCHEME_SP                (1)
+#define AIR_QOS_MAX_TRAFFIC_ARBITRATION_SCHEME_WFQ               (0)
+#define AIR_QOS_MAX_EXCESS_SP                                    (1)
+#define AIR_QOS_MAX_EXCESS_DROP                                  (0)
+#define AIR_QOS_QUEUE_MAX_NUM           (8)
+#define AIR_QOS_QUEUE_DSCP_MAX_NUM      (64)
+#define AIR_MAX_NUM_OF_QUEUE            (8) /*need to be replaced by AIR_QOS_QUEUE_MAX_NUM*/
+
+#define AIR_QOS_SHAPER_NOSETTING      (0xffffffff)
+#define AIR_QOS_SHAPER_RATE_MIN_WEIGHT  (1)
+#define AIR_QOS_SHAPER_RATE_MAX_WEIGHT  (128)
+
+/* MACRO FUNCTION DECLARATIONS
+*/
+
+/* DATA TYPE DECLARATIONS
+*/
+typedef enum
+{
+    AIR_QOS_SCH_MODE_SP,
+    AIR_QOS_SCH_MODE_WRR,
+    AIR_QOS_SCH_MODE_WFQ,
+    AIR_QOS_SCH_MODE_LAST,
+} AIR_QOS_SCH_MODE_T;
+
+typedef union AIR_QOS_SHAPER_MIN_S
+{
+    struct
+    {
+        UI32_T   min_rate_man      :17;
+        UI32_T   min_reserve       :2;
+        UI32_T   min_rate_en       :1;
+        UI32_T   min_rate_exp      :4;
+        UI32_T   min_weight        :7;
+        UI32_T   min_sp_wrr_q      :1;
+    }raw;
+    UI32_T byte;
+}AIR_QOS_SHAPER_MIN_T;
+
+typedef union AIR_QOS_SHAPER_MAX_S
+{
+    struct
+    {
+        UI32_T   max_rate_man      :17;
+        UI32_T   max_reserve       :1;
+        UI32_T   max_excess_en     :1;
+        UI32_T   max_rate_en       :1;
+        UI32_T   max_rate_exp      :4;
+        UI32_T   max_weight        :7;
+        UI32_T   max_sp_wfq_q      :1;
+    }raw;
+    UI32_T byte;
+}AIR_QOS_SHAPER_MAX_T;
+
+typedef enum
+{
+    /* The packet priority is based on port's priority. */
+    AIR_QOS_TRUST_MODE_PORT,
+
+    /*
+    * The precedence of packet priority is based on 802.1p,
+    * then port's priority.
+    */
+    AIR_QOS_TRUST_MODE_1P_PORT,
+
+    /*
+    * The precedence of packet priority is based on DSCP,
+    * then port's priority.
+    */
+    AIR_QOS_TRUST_MODE_DSCP_PORT,
+
+    /*
+    * The precedence of packet priority is based on DSCP, 802.1p,
+    * then port's priority.
+    */
+    AIR_QOS_TRUST_MODE_DSCP_1P_PORT,
+    AIR_QOS_TRUST_MODE_LAST
+} AIR_QOS_TRUST_MODE_T;
+
+typedef union AIR_QOS_QUEUE_UPW_S
+{
+    struct
+    {
+        UI32_T csr_acl_weight   :3;
+        UI32_T                  :1;
+        UI32_T csr_stag_weight  :3;/*Not use yet*/
+        UI32_T                  :1;
+        UI32_T csr_1p_weight    :3;
+        UI32_T                  :1;
+        UI32_T csr_dscp_weight  :3;
+        UI32_T                  :1;
+        UI32_T csr_port_weight  :3;
+        UI32_T                  :1;
+        UI32_T csr_arl_weight   :3;
+        UI32_T                  :9;
+    }raw;
+    UI32_T byte;
+}AIR_QOS_QUEUE_UPW_T;
+
+typedef union AIR_QOS_QUEUE_PEM_S
+{
+    struct
+    {
+        UI32_T csr_dscp_pri_l     :6;/*Not use yet*/
+        UI32_T csr_que_lan_l      :2;/*Not use yet*/
+        UI32_T csr_que_cpu_l      :3;
+        UI32_T csr_tag_pri_l      :3;/*Not use yet*/
+        UI32_T                    :2;
+        UI32_T csr_dscp_pri_h     :6;/*Not use yet*/
+        UI32_T csr_que_lan_h      :2;/*Not use yet*/
+        UI32_T csr_que_cpu_h      :3;
+        UI32_T csr_tag_pri_h      :3;/*Not use yet*/
+        UI32_T                    :2;
+    }raw;
+    UI32_T byte;
+}AIR_QOS_QUEUE_PEM_T;
+
+typedef enum
+{
+    AIR_QOS_RATE_DIR_INGRESS,
+    AIR_QOS_RATE_DIR_EGRESS,
+    AIR_QOS_RATE_DIR_LAST
+} AIR_QOS_RATE_DIR_T;
+
+typedef struct AIR_RATE_LIMIT_S
+{
+#define AIR_QOS_RATE_LIMIT_CFG_FLAGS_ENABLE_INGRESS     (1U << 0)
+#define AIR_QOS_RATE_LIMIT_CFG_FLAGS_ENABLE_EGRESS      (1U << 1)
+    UI32_T flags;
+
+    /*
+    * The limit cover up to 2.5G
+    * Rate = CIR * 32kbps
+    * Range = 0..80000
+    */
+    UI32_T ingress_cir;
+    UI32_T egress_cir;
+
+    /*
+    * Bucket = Max{(CBS * 512), (CIR * 2500)} Bytes
+    * Range: 0..127
+    */
+    UI32_T ingress_cbs;
+    UI32_T egress_cbs;
+} AIR_QOS_RATE_LIMIT_CFG_T;
+
+
+/* EXPORTED SUBPROGRAM SPECIFICATIONS
+*/
+
+/* FUNCTION NAME:   air_qos_setScheduleAlgo
+ * PURPOSE:
+ *      Set schedule mode of a port queue.
+ * INPUT:
+ *      unit                 -- Device unit number
+ *      port                 -- Port id
+ *      queue                -- Queue id
+ *      sch_mode             -- AIR_QOS_SCH_MODE_T
+ *      weight               -- weight for WRR/WFQ
+ * OUTPUT:
+ *      None
+ * RETURN:
+ *      AIR_E_OK             -- Operation success.
+ *      AIR_E_BAD_PARAMETER  -- Parameter is wrong.
+ * NOTES:
+ *      Weight default value is 1, only for WRR/WFQ mode
+ */
+AIR_ERROR_NO_T
+air_qos_setScheduleAlgo(
+    const UI32_T unit,
+    const UI32_T port,
+    const UI32_T                queue,
+    const AIR_QOS_SCH_MODE_T    sch_mode,
+    const UI32_T                weight);
+
+
+/* FUNCTION NAME: air_qos_getScheduleAlgo
+ * PURPOSE:
+ *      Get schedule mode of a port queue.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Port id
+ *      queue           --  Queue id
+ * OUTPUT:
+ *      ptr_sch_mode    --  AIR_QOS_SCH_MODE_T
+ *      ptr_weight      --  weight for WRR/WFQ
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *     None
+ */
+AIR_ERROR_NO_T
+air_qos_getScheduleAlgo(
+    const UI32_T          unit,
+    const UI32_T          port,
+    const UI32_T          queue,
+    AIR_QOS_SCH_MODE_T    *ptr_sch_mode,
+    UI32_T                *ptr_weight);
+
+/* FUNCTION NAME:   air_qos_setTrustMode
+ * PURPOSE:
+ *      Set qos trust mode value.
+ * INPUT:
+ *      unit                 -- Device unit number
+ *      port                  -.Select port number
+ *      mode                 -- Qos support mode
+ *                              AIR_QOS_TRUST_MODE_T
+ * OUTPUT:
+ *      None
+ * RETURN:
+ *      AIR_E_OK             -- Operation success.
+ *      AIR_E_BAD_PARAMETER  -- Parameter is wrong.
+ * NOTES:
+ *      None
+ */
+
+AIR_ERROR_NO_T
+air_qos_setTrustMode(
+    const UI32_T                    unit,
+    const UI32_T                    port,
+    const AIR_QOS_TRUST_MODE_T      mode);
+
+
+/* FUNCTION NAME: air_qos_getTrustMode
+ * PURPOSE:
+ *      Get qos trust mode value.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port              -.Select port number
+ * OUTPUT:
+ *      ptr_weight      --  All Qos weight value
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_qos_getTrustMode(
+    const UI32_T unit,
+    const UI32_T port,
+    AIR_QOS_TRUST_MODE_T *const ptr_mode);
+
+/* FUNCTION NAME: air_qos_setPri2Queue
+ * PURPOSE:
+ *      Set per port priority to out queue.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      pri             --  Qos pri value
+ *      queue           --  Qos Queue value
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_qos_setPri2Queue(
+    const UI32_T unit,
+    const UI32_T pri,
+    const UI32_T queue);
+
+/* FUNCTION NAME: air_qos_getPri2Queue
+ * PURPOSE:
+ *      Get per port priority to out queue.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      pri             --  Qos pri value
+ *
+ * OUTPUT:
+ *      ptr_queue       --  Select out queue (0..7)
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_qos_getPri2Queue(
+    const UI32_T unit,
+    const UI32_T pri,
+    UI32_T *const ptr_queue);
+
+/* FUNCTION NAME: air_qos_setDscp2Pri
+ * PURPOSE:
+ *      Set DSCP mapping to priority.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      dscp            --  Select DSCP value (0..63)
+ *      priority        --  Select priority (0..7)
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_qos_setDscp2Pri(
+    const UI32_T unit,
+    const UI32_T dscp,
+    const UI32_T pri);
+
+/* FUNCTION NAME: air_qos_getDscp2Pri
+ * PURPOSE:
+ *      Get DSCP mapping priority.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      dscp            --  Select DSCP value (0..63)
+ *
+ * OUTPUT:
+ *      ptr_pri         --  Priority value (0..7)
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_qos_getDscp2Pri(
+    const UI32_T unit,
+    const UI32_T dscp,
+    UI32_T * const ptr_pri);
+
+/* FUNCTION NAME: air_qos_setRateLimitEnable
+ * PURPOSE:
+ *      Enable or disable port rate limit.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Select port number (0..6)
+ *      dir             --  AIR_QOS_RATE_DIR_INGRESS
+ *                          AIR_QOS_RATE_DIR_EGRESS
+ *      rate_en         --  TRUE: eanble rate limit
+ *                          FALSE: disable rate limit
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_qos_setRateLimitEnable(
+    const UI32_T unit,
+    const UI32_T port,
+    const AIR_QOS_RATE_DIR_T dir,
+    const BOOL_T enable);
+
+/* FUNCTION NAME: air_qos_getRateLimitEnable
+ * PURPOSE:
+ *      Get port rate limit state.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Select port number (0..6)
+ *      dir              -- AIR_QOS_RATE_DIR_T
+ * OUTPUT:
+ *      ptr_enable        --  TRUE: eanble rate limit
+ *                          FALSE: disable rate limit
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_qos_getRateLimitEnable(
+    const UI32_T                unit,
+    const UI32_T                port,
+    const AIR_QOS_RATE_DIR_T    dir,
+    BOOL_T                      *ptr_enable);
+
+/* FUNCTION NAME: air_qos_setRateLimit
+ * PURPOSE:
+ *      Set per port rate limit.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Select port number
+ *      ptr_cfg         --  AIR_QOS_RATE_LIMIT_CFG_T
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_qos_setRateLimit(
+    const UI32_T unit,
+    const UI32_T port,
+    AIR_QOS_RATE_LIMIT_CFG_T    *ptr_cfg);
+
+/* FUNCTION NAME: air_qos_getRateLimit
+ * PURPOSE:
+ *      Get per port rate limit.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Select port number
+ *
+ * OUTPUT:
+ *      ptr_cfg          --  AIR_QOS_RATE_LIMIT_CFG_T
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_qos_getRateLimit(
+    const UI32_T unit,
+    const UI32_T port,
+    AIR_QOS_RATE_LIMIT_CFG_T *ptr_cfg);
+
+/* FUNCTION NAME: air_qos_setPortPriority
+ * PURPOSE:
+ *      Get poer port based priority.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Select port number
+ *      priority        --  Select port priority
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_qos_setPortPriority(
+    const UI32_T unit,
+    const UI32_T port,
+    const UI32_T priority);
+
+/* FUNCTION NAME: air_qos_getPortPriority
+ * PURPOSE:
+ *      Set per port based priority.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Select port number
+ *
+ * OUTPUT:
+ *      ptr_pri         --  Get port based priority
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_qos_getPortPriority(
+    const UI32_T unit,
+    const UI32_T port,
+    UI32_T *ptr_pri);
+
+/* FUNCTION NAME: air_qos_setRateLimitExMngFrm
+ * PURPOSE:
+ *      Set rate limit control exclude/include management frames.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      dir             --  AIR_RATE_DIR_INGRESS
+ *                          AIR_RATE_DIR_EGRESS
+ *      exclude         --  TRUE: Exclude management frame
+ *                          FALSE:Include management frame
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_qos_setRateLimitExMngFrm(
+    const UI32_T unit,
+    const AIR_QOS_RATE_DIR_T dir,
+    const BOOL_T exclude);
+
+/* FUNCTION NAME: air_qos_getRateLimitExMngFrm
+ * PURPOSE:
+ *      Get rate limit control exclude/include management frames.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      dir             --  AIR_RATE_DIR_INGRESS
+ *                          AIR_RATE_DIR_EGRESS
+ * OUTPUT:
+ *      ptr_exclude     --  TRUE: Exclude management frame
+ *                          FALSE:Include management frame
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_qos_getRateLimitExMngFrm(
+    const UI32_T unit,
+    const AIR_QOS_RATE_DIR_T dir,
+    BOOL_T *ptr_exclude);
+
+#endif /* End of AIR_QOS_H */
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_reg.h b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_reg.h
new file mode 100644
index 0000000..90fb8ac
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_reg.h
@@ -0,0 +1,1233 @@
+/* FILE NAME:   air_reg.h
+* PURPOSE:
+*      Define the chip registers in AIR SDK.
+* NOTES:
+*/
+
+#ifndef AIR_REG_H
+#define AIR_REG_H
+
+/* INCLUDE FILE DECLARATIONS
+*/
+
+/* NAMING CONSTANT DECLARATIONS
+*/
+#define PORT_CTRL_PORT_OFFSET               (0x200)
+
+/* SYS SCU */
+#define RST_CTRL1                           (0x100050c0)
+#define SYS_SW_RST_OFFT                     (31)
+
+/* ARL Register Base */
+#define REG_ARL_BASE_ADDRESS                (0x10200000)
+
+#define AGC                                 (0x000C)
+/* fields of AGC */
+#define AGC_TICK_SEL                        (0x1 << 30)
+
+#define MFC                                 (REG_ARL_BASE_ADDRESS + 0x0010)
+/* fields of MFC */
+
+
+#define VTCR_ADDR                           (0x0090)
+#define VTCR_VID_OFFT                       (0)
+#define VTCR_VID_LENG                       (12)
+#define VTCR_VID_RELMASK                    (0x00000FFF)
+#define VTCR_VID_MASK                       (VTCR_VID_RELMASK << VTCR_VID_OFFT)
+#define VTCR_FUNC_OFFT                      (12)
+#define VTCR_FUNC_LENG                      (4)
+#define VTCR_FUNC_RELMASK                   (0x0000000F)
+#define VTCR_FUNC_MASK                      (VTCR_FUNC_RELMASK << VTCR_FUNC_OFFT)
+#define VTCR_FUNC_READ_ACL_RULE             (0x4 << VTCR_FUNC_OFFT)
+#define VTCR_FUNC_WRITE_ACL_RULE            (0x5 << VTCR_FUNC_OFFT)
+#define VTCR_FUNC_READ_TRTCM                (0x6 << VTCR_FUNC_OFFT)
+#define VTCR_FUNC_WRITE_TRTCM               (0x7 << VTCR_FUNC_OFFT)
+#define VTCR_FUNC_READ_ACL_MASK             (0x8 << VTCR_FUNC_OFFT)
+#define VTCR_FUNC_WRITE_ACL_MASK            (0x9 << VTCR_FUNC_OFFT)
+#define VTCR_FUNC_READ_ACL_RULE_CTRL        (0xA << VTCR_FUNC_OFFT)
+#define VTCR_FUNC_WRITE_ACL_RULE_CTRL       (0xB << VTCR_FUNC_OFFT)
+#define VTCR_FUNC_READ_ACL_RATE_CTRL        (0xC << VTCR_FUNC_OFFT)
+#define VTCR_FUNC_WRITE_ACL_RATE_CTRL       (0xD << VTCR_FUNC_OFFT)
+#define VTCR_IDX_INVLD_OFFT                 (16)
+#define VTCR_IDX_INVLD_RELMASK              (0x00000001)
+#define VTCR_IDX_INVLD_MASK                 (VTCR_IDX_INVLD_RELMASK << VTCR_IDX_INVLD_OFFT)
+#define VTCR_BUSY_OFFT                      (31)
+#define VTCR_BUSY_LENG                      (1)
+#define VTCR_BUSY_RELMASK                   (0x00000001)
+#define VTCR_BUSY_MASK                      (VTCR_BUSY_RELMASK << VTCR_BUSY_OFFT)
+
+#define PIM_DSCP(d)                         (0x0058 + (4 * (d / 10)))
+
+#define UNUF                                (0x102000B4)
+#define UNMF                                (0x102000B8)
+#define BCF                                 (0x102000BC)
+#define QRYP                                (0x102000D8)
+
+#define VAWD1_ADDR                          (0x0094)
+#define VAWD2_ADDR                          (0x0098)
+#define VAWD3_ADDR                          (0x00E0)
+#define VAWD4_ADDR                          (0x00E4)
+#define VAWD5_ADDR                          (0x00E8)
+#define VAWD6_ADDR                          (0x00EC)
+#define VAWD7_ADDR                          (0x00F0)
+#define VAWD8_ADDR                          (0x00F4)
+#define VAWD_ADDR(n)                        ((n<2)?(VAWD1_ADDR+(0x4*n)):(VAWD3_ADDR+(0x4*(n-2))))
+
+#define SCH_CTRL_BASE                       (0x1000)
+#define SCH_CTRL_PORT_OFFSET                (0x100)
+#define MMSCR(p)                            (SCH_CTRL_BASE + (p * SCH_CTRL_PORT_OFFSET) + 0x90)
+#define MMSCR0(p, q)                        (SCH_CTRL_BASE + (p * SCH_CTRL_PORT_OFFSET) + (8 * q))
+#define MMSCR1(p, q)                        (SCH_CTRL_BASE + (p * SCH_CTRL_PORT_OFFSET) + (8 * q) + 0x04)
+#define MMSCR2(p, q)                        (SCH_CTRL_BASE + (p * SCH_CTRL_PORT_OFFSET) + (8 * q) + 0x50)
+#define MMSCR3(p, q)                        (SCH_CTRL_BASE + (p * SCH_CTRL_PORT_OFFSET) + (8 * q) + 0x54)
+
+/* fields of GERLCR */
+#define EGC_MFRM_EX_OFFSET                  (9)
+#define EGC_MFRM_EX_LENGTH                  (1)
+
+#define BMU_CTRL_BASE                       (0x1800)
+#define BMU_CTRL_PORT_OFFSET                (0x100)
+
+/* fields of MMDPR */
+#define MMDPR_BASE                          (BMU_CTRL_BASE + 0xC)
+#define MMDPR_PORT_OFFSET                   (0x100)
+#define MMDPR_COLOR_OFFSET                  (0x20)
+#define MMDPR_QUEUE_OFFSET                  (0x4)
+#define MMDPR(p,c,q)                        (MMDPR_BASE + (p * MMDPR_PORT_OFFSET) + (c * MMDPR_COLOR_OFFSET) + (q * MMDPR_QUEUE_OFFSET))
+#define MMDPR_EN                            (1 << 31)
+#define MMDPR_PR_OFFSET                     (24)
+#define MMDPR_PR_LENGTH                     (3)
+#define MMDPR_HT_OFFSET                     (12)
+#define MMDPR_HT_LENGTH                     (9)
+#define MMDPR_LT_OFFSET                     (0)
+#define MMDPR_LT_LENGTH                     (9)
+
+/* fields of GIRLCR */
+#define IGC_MFRM_EX_OFFSET                  (9)
+#define IGC_MFRM_EX_LENGTH                  (1)
+
+#define PORT_CTRL_BASE                      (0x10208000)
+#define PORT_CTRL_REG(p, r)                 (PORT_CTRL_BASE + (p) * PORT_CTRL_PORT_OFFSET + (r))
+
+#define PORTMATRIX(p)                       PORT_CTRL_REG(p, 0x44)
+
+#define PCR(p)                              PORT_CTRL_REG(p, 0x04)
+#define PCR_PORT_VLAN_OFFT                  (0)
+#define PCR_PORT_VLAN_LENG                  (2)
+#define PCR_PORT_VLAN_RELMASK               (0x00000003)
+#define PCR_PORT_VLAN_MASK                  (PCR_PORT_VLAN_RELMASK << PCR_PORT_VLAN_OFFT)
+#define PCR_PORT_RX_MIR_OFFT                (16)
+#define PCR_PORT_RX_MIR_LENG                (2)
+#define PCR_PORT_TX_MIR_OFFT                (20)
+#define PCR_PORT_TX_MIR_LENG                (2)
+#define PCR_PORT_PRI_OFFT                   (24)
+#define PCR_PORT_PRI_LENG                   (3)
+#define PCR_PORT_PRI_RELMASK                (0x00000007)
+#define PCR_PORT_PRI_MASK                   (PCR_PORT_PRI_RELMASK << PCR_PORT_PRI_OFFT)
+#define PCR_PORT_ACL_MIS_FWD_OFFT           (4)
+#define PCR_PORT_ACL_MIS_FWD_LENG           (3)
+#define PCR_PORT_ACL_MIS_FWD_RELMASK        (0x00000007)
+#define PCR_PORT_ACL_MIS_FWD_MASK           (PCR_PORT_ACL_MIS_FWD_RELMASK << PCR_PORT_ACL_MIS_FWD_OFFT)
+#define PCR_EG_TAG_OFFT                     (28)
+#define PCR_EG_TAG_LENG                     (2)
+#define PCR_EG_TAG_RELMASK                  (0x00000003)
+#define PCR_EG_TAG_MASK                     (PCR_EG_TAG_RELMASK << PCR_EG_TAG_OFFT)
+#define PCR_RMK_DSCP_EN                     (0x1000)
+#define PCR_RMK_1Q_EN                       (0x0800)
+
+#define PVC(p)                              PORT_CTRL_REG(p, 0x10)
+#define PVC_ACC_FRM_OFFT                    (0)
+#define PVC_ACC_FRM_LENG                    (2)
+#define PVC_ACC_FRM_RELMASK                 (0x00000003)
+#define PVC_ACC_FRM_MASK                    (PVC_ACC_FRM_RELMASK << PVC_ACC_FRM_OFFT)
+#define PVC_UC_LKYV_EN_OFFT                 (2)
+#define PVC_UC_LKYV_EN_LENG                 (1)
+#define PVC_UC_LKYV_EN_RELMASK              (0x00000001)
+#define PVC_UC_LKYV_EN_MASK                 (PVC_UC_LKYV_EN_RELMASK << PVC_UC_LKYV_EN_OFFT)
+#define PVC_MC_LKYV_EN_OFFT                 (3)
+#define PVC_MC_LKYV_EN_LENG                 (1)
+#define PVC_MC_LKYV_EN_RELMASK              (0x00000001)
+#define PVC_MC_LKYV_EN_MASK                 (PVC_MC_LKYV_EN_RELMASK << PVC_MC_LKYV_EN_OFFT)
+#define PVC_BC_LKYV_EN_OFFT                 (4)
+#define PVC_BC_LKYV_EN_LENG                 (1)
+#define PVC_BC_LKYV_EN_RELMASK              (0x00000001)
+#define PVC_BC_LKYV_EN_MASK                 (PVC_BC_LKYV_EN_RELMASK << PVC_BC_LKYV_EN_OFFT)
+#define PVC_SPTAG_EN_OFFT                   (5)
+#define PVC_SPTAG_EN_LENG                   (1)
+#define PVC_SPTAG_EN_RELMASK                (0x00000001)
+#define PVC_SPTAG_EN_MASK                   (PVC_SPTAG_EN_RELMASK << PVC_SPTAG_EN_OFFT)
+#define PVC_VLAN_ATTR_OFFT                  (6)
+#define PVC_VLAN_ATTR_LENG                  (2)
+#define PVC_VLAN_ATTR_RELMASK               (0x00000003)
+#define PVC_VLAN_ATTR_MASK                  (PVC_VLAN_ATTR_RELMASK << PVC_VLAN_ATTR_OFFT)
+#define PVC_EG_TAG_OFFT                     (8)
+#define PVC_EG_TAG_LENG                     (3)
+#define PVC_EG_TAG_RELMASK                  (0x00000007)
+#define PVC_EG_TAG_MASK                     (PVC_EG_TAG_RELMASK << PVC_EG_TAG_OFFT)
+#define PVC_SPTAG_MODE_OFFT                 (11)
+#define PVC_SPTAG_MODE_LENG                 (1)
+#define PVC_STAG_VPID_OFFT                  (16)
+#define PVC_STAG_VPID_LENG                  (16)
+#define PVC_STAG_VPID_RELMASK               (0x0000FFFF)
+#define PVC_STAG_VPID_MASK                  (PVC_STAG_VPID_RELMASK << PVC_STAG_VPID_OFFT)
+
+#define PPBV1(p)                            PORT_CTRL_REG(p, 0x14)
+#define PPBV1_G0_PORT_VID_OFFT              (0)
+#define PPBV1_G0_PORT_VID_LENG              (12)
+#define PPBV1_G0_PORT_VID_RELMASK           (0x00000FFF)
+#define PPBV1_G0_PORT_VID_MASK              (PPBV1_G0_PORT_VID_RELMASK << PPBV1_G0_PORT_VID_OFFT)
+
+#define PVID(p)                             PORT_CTRL_REG(p, 0x48)
+#define PVID_PCVID_OFFT                     (0)
+#define PVID_PCVID_LENG                     (12)
+#define PVID_PCVID_RELMASK                  (0x00000FFF)
+#define PVID_PCVID_MASK                     (PVID_PCVID_RELMASK << PVID_PCVID_OFFT)
+
+#define BSR(p)                              PORT_CTRL_REG(p, 0x50)
+#define BSR1(p)                             PORT_CTRL_REG(p, 0x54)
+#define BSR_EXT1(p)                         PORT_CTRL_REG(p, 0x58)
+#define BSR1_EXT1(p)                        PORT_CTRL_REG(p, 0x5C)
+#define BSR_EXT2(p)                         PORT_CTRL_REG(p, 0x60)
+#define BSR1_EXT2(p)                        PORT_CTRL_REG(p, 0x64)
+#define BSR_EXT3(p)                         PORT_CTRL_REG(p, 0x68)
+#define BSR1_EXT3(p)                        PORT_CTRL_REG(p, 0x6C)
+#define BSR_STORM_COUNT_MSK                 (0xFF)
+#define BSR_STORM_UNIT_MSK                  (7)
+#define BSR_STORM_UNIT_OFFT                 (8)
+#define BSR_STORM_RATE_BASED                (0x1)
+#define BSR_STORM_DROP_EN                   (0x10)
+#define BSR_STORM_BCST_EN                   (0x2)
+#define BSR_STORM_MCST_EN                   (0x4)
+#define BSR_STORM_UCST_EN                   (0x8)
+#define BSR1_10M_COUNT_OFFT                 (0)
+#define BSR1_100M_COUNT_OFFT                (8)
+#define BSR1_1000M_COUNT_OFFT               (16)
+#define BSR1_2500M_COUNT_OFFT               (24)
+
+#define PEM(p, q)                           (PORT_CTRL_REG(p, (0x44 + (4 * (q/2)))))
+
+#define PORT_MAC_CTRL_BASE                  (0x10210000)
+#define PORT_MAC_CTRL_PORT_OFFSET           (0x200)
+#define PORT_MAC_CTRL_REG(p, r)             (PORT_MAC_CTRL_BASE + (p) * PORT_MAC_CTRL_PORT_OFFSET + (r))
+
+#define PMCR(p)                             PORT_MAC_CTRL_REG(p, 0x00)
+
+#define ARL_CTRL_BASE                       (0x0000)
+#define CFC                                 (0x0004)
+/* fields of CFC */
+#define CFC_MIRROR_EN_OFFSET                (19)
+#define CFC_MIRROR_EN_LEN                   (1)
+#define CFC_MIRROR_PORT_OFFSET              (16)
+#define CFC_MIRROR_PORT_LEN                 (3)
+#define MFC_CPU_PORT_OFFSET                 (8)
+#define MFC_CPU_PORT_LENGTH                 (5)
+#define MFC_CPU_EN_OFFSET                   (15)
+#define MFC_CPU_EN_LENGTH                   (1)
+
+
+#define ISC                                 (0x0018)
+#define TSRA1                               (0x0084)
+#define TSRA2                               (0x0088)
+#define ATRD                                (0x008C)
+#define CPGC                                (0x00B0)
+
+#define PSC(p)                              PORT_CTRL_REG(p, 0xC)
+#define PSC_DIS_LRN_OFFSET                  (4)
+#define PSC_DIS_LRN_LENGTH                  (1)
+#define PSC_SA_CNT_EN_OFFSET                (5)
+#define PSC_SA_CNT_EN_LENGTH                (1)
+#define PSC_SA_CNT_LMT_OFFSET               (8)
+#define PSC_SA_CNT_LMT_LENGTH               (12)
+#define PSC_SA_CNT_LMT_REALMASK             (0x00000FFF)
+#define PSC_SA_CNT_LMT_MASK                 (PSC_SA_CNT_LMT_REALMASK << PSC_SA_CNT_LMT_OFFSET)
+#define PSC_SA_CNT_LMT_MAX                  (0x800)
+
+/* fields of CPGC */
+#define COL_EN                              (0x01)
+#define COL_CLK_EN                          (0x02)
+
+#define CKGCR                               (0x10213E1C)
+#define CKG_LNKDN_GLB_STOP                  (0x01)
+#define CKG_LNKDN_PORT_STOP                 (0x02)
+
+/* fields of TRTCM*/
+#define TRTCM                               (ARL_CTRL_BASE + 0x009C)
+#define TRTCM_EN                            (1 << 31)
+
+#define ARL_TRUNK_BASE                      (0x10200000)
+#define PTC                                 (ARL_TRUNK_BASE + 0x400)
+#define PTSEED                              (ARL_TRUNK_BASE + 0x404)
+#define PTGC                                (ARL_TRUNK_BASE + 0x408)
+#define PTG(g)                              (ARL_TRUNK_BASE + 0x40C + ((g) * 0x8 ))
+#define PTGRSTS                             (ARL_TRUNK_BASE + 0x44C)
+
+#define MIR                                 (REG_ARL_BASE_ADDRESS + (0xCC))
+/* fields of MIR */
+#define MIR_MIRROR_BASE_OFFSER              (8)
+#define MIR_MIRROR_EN_OFFSER(p)             ((p) * MIR_MIRROR_BASE_OFFSER + 0x07)
+#define MIR_MIRROR_EN_LEN                   (1)
+#define MIR_MIRROR_PORT_OFFSER(p)           ((p) * MIR_MIRROR_BASE_OFFSER + 0x00)
+#define MIR_MIRROR_PORT_LEN                 (5)
+#define MIR_MIRROR_TAG_TX_EN_OFFSER(p)      ((p) * MIR_MIRROR_BASE_OFFSER + 0x06)
+#define MIR_MIRROR_TAG_TX_EN_LEN            (1)
+
+/* fields of ATA1 */
+#define ATA1                                (REG_ARL_BASE_ADDRESS + 0x0304)
+#define ATA1_MAC_ADDR_MSB_OFFSET            (0)
+#define ATA1_MAC_ADDR_MSB_LENGTH            (32)
+//#define ATA1_SAT_ADDR_OFFSET                (0)
+//#define ATA1_SAT_ADDR_LENGTH                (11)
+//#define ATA1_SAT_BANK_OFFSET                (16)
+//#define ATA1_SAT_BANK_LENGTH                (4)
+
+/* fields of ATA2 */
+#define ATA2                                (REG_ARL_BASE_ADDRESS + 0x0308)
+#define ATA2_MAC_AGETIME_OFFSET             (0)
+#define ATA2_MAC_AGETIME_LENGTH             (9)
+#define ATA2_MAC_LIFETIME_OFFSET            (9)
+#define ATA2_MAC_LIFETIME_LENGTH            (1)
+#define ATA2_MAC_UNAUTH_OFFSET              (10)
+#define ATA2_MAC_UNAUTH_LENGTH              (1)
+#define ATA2_MAC_ADDR_LSB_OFFSET            (16)
+#define ATA2_MAC_ADDR_LSB_LENGTH            (16)
+
+/* fields of ATWD */
+#define ATWD                                (REG_ARL_BASE_ADDRESS + 0x0324)
+#define ATWD_MAC_LIVE_OFFSET                (0)
+#define ATWD_MAC_LIVE_LENGTH                (1)
+#define ATWD_MAC_LEAK_OFFSET                (1)
+#define ATWD_MAC_LEAK_LENGTH                (1)
+#define ATWD_MAC_UPRI_OFFSET                (2)
+#define ATWD_MAC_UPRI_LENGTH                (3)
+#define ATWD_MAC_FWD_OFFSET                 (5)
+#define ATWD_MAC_FWD_LENGTH                 (3)
+#define ATWD_MAC_MIR_OFFSET                 (8)
+#define ATWD_MAC_MIR_LENGTH                 (2)
+#define ATWD_MAC_ETAG_OFFSET                (12)
+#define ATWD_MAC_ETAG_LENGTH                (3)
+#define ATWD_MAC_IVL_OFFSET                 (15)
+#define ATWD_MAC_IVL_LENGTH                 (1)
+#define ATWD_MAC_VID_OFFSET                 (16)
+#define ATWD_MAC_VID_LENGTH                 (12)
+#define ATWD_MAC_FID_OFFSET                 (28)
+#define ATWD_MAC_FID_LENGTH                 (4)
+
+/* fields of ATWD2 */
+#define ATWD2                               (REG_ARL_BASE_ADDRESS + 0x0328)
+#define ATWD2_MAC_PORT_OFFSET               (0)
+#define ATWD2_MAC_PORT_LENGTH               (8)
+
+/* fields of ATC */
+#define ATC                                 (REG_ARL_BASE_ADDRESS + 0x0300)
+#define ATC_MAC_OFFSET                      (0)
+#define ATC_MAC_LENGTH                      (3)
+#define ATC_SAT_OFFSET                      (4)
+#define ATC_SAT_LENGTH                      (2)
+#define ATC_MAT_OFFSET                      (7)
+#define ATC_MAT_LENGTH                      (5)
+#define ATC_ENTRY_HIT_OFFSET                (12)
+#define ATC_ENTRY_HIT_LENGTH                (4)
+#define ATC_ADDR_OFFSET                     (16)
+#define ATC_ADDR_LENGTH                     (9)
+#define ATC_SINGLE_HIT_OFFSET               (30)
+#define ATC_SINGLE_HIT_LENGTH               (1)
+#define ATC_BUSY_OFFSET                     (31)
+#define ATC_BUSY_LENGTH                     (1)
+
+typedef enum {
+    _ATC_CMD_READ = 0,
+    _ATC_CMD_WRITE,
+    _ATC_CMD_CLEAN,
+    _ATC_CMD_SEARCH = 4,
+    _ATC_CMD_SEARCH_NEXT,
+    _ATC_CMD_LAST
+}_ATC_CMD_T;
+
+#define ATC_CMD_READ                        (_ATC_CMD_READ << ATC_MAC_OFFSET)
+#define ATC_CMD_WRITE                       (_ATC_CMD_WRITE << ATC_MAC_OFFSET)
+#define ATC_CMD_CLEAN                       (_ATC_CMD_CLEAN << ATC_MAC_OFFSET)
+#define ATC_CMD_SEARCH                      (_ATC_CMD_SEARCH << ATC_MAC_OFFSET)
+#define ATC_CMD_SEARCH_NEXT                 (_ATC_CMD_SEARCH_NEXT << ATC_MAC_OFFSET)
+
+typedef enum {
+    _ATC_SAT_MAC = 0,
+    _ATC_SAT_DIP,
+    _ATC_SAT_SIP,
+    _ATC_SAT_ADDR,
+    _ATC_SAT_LAST
+}_ATC_SAT_T;
+
+#define ATC_SAT_MAC                         (_ATC_SAT_MAC << ATC_SAT_OFFSET)
+#define ATC_SAT_DIP                         (_ATC_SAT_DIP << ATC_SAT_OFFSET)
+#define ATC_SAT_SIP                         (_ATC_SAT_SIP << ATC_SAT_OFFSET)
+#define ATC_SAT_ADDR                        (_ATC_SAT_ADDR << ATC_SAT_OFFSET)
+
+typedef enum {
+    _ATC_MAT_ALL = 0,
+    _ATC_MAT_MAC,
+    _ATC_MAT_DYNAMIC_MAC,
+    _ATC_MAT_STATIC_MAC,
+    _ATC_MAT_DIP,
+    _ATC_MAT_DIPV4,
+    _ATC_MAT_DIPV6,
+    _ATC_MAT_SIP,
+    _ATC_MAT_SIPV4,
+    _ATC_MAT_SIPV6,
+    _ATC_MAT_MAC_BY_VID,
+    _ATC_MAT_MAC_BY_FID,
+    _ATC_MAT_MAC_BY_PORT,
+    _ATC_MAT_SIP_BY_DIPV4,
+    _ATC_MAT_SIP_BY_SIPV4,
+    _ATC_MAT_SIP_BY_DIPV6,
+    _ATC_MAT_SIP_BY_SIPV6,
+    _ATC_MAT_LAST
+}_ATC_MAT_T;
+
+#define ATC_MAT_ALL                         (_ATC_MAT_ALL << ATC_MAT_OFFSET)
+#define ATC_MAT_MAC                         (_ATC_MAT_MAC << ATC_MAT_OFFSET)
+#define ATC_MAT_DYNAMIC_MAC                 (_ATC_MAT_DYNAMIC_MAC << ATC_MAT_OFFSET)
+#define ATC_MAT_STATIC_MAC                  (_ATC_MAT_STATIC_MAC << ATC_MAT_OFFSET)
+#define ATC_MAT_DIP                         (_ATC_MAT_DIP << ATC_MAT_OFFSET)
+#define ATC_MAT_DIPV4                       (_ATC_MAT_DIPV4 << ATC_MAT_OFFSET)
+#define ATC_MAT_DIPV6                       (_ATC_MAT_DIPV6 << ATC_MAT_OFFSET)
+#define ATC_MAT_SIP                         (_ATC_MAT_SIP << ATC_MAT_OFFSET)
+#define ATC_MAT_SIPV4                       (_ATC_MAT_SIPV4 << ATC_MAT_OFFSET)
+#define ATC_MAT_SIPV6                       (_ATC_MAT_SIPV6 << ATC_MAT_OFFSET)
+#define ATC_MAT_MAC_BY_VID                  (_ATC_MAT_MAC_BY_VID << ATC_MAT_OFFSET)
+#define ATC_MAT_MAC_BY_FID                  (_ATC_MAT_MAC_BY_FID << ATC_MAT_OFFSET)
+#define ATC_MAT_MAC_BY_PORT                 (_ATC_MAT_MAC_BY_PORT << ATC_MAT_OFFSET)
+#define ATC_MAT_SIP_BY_DIPV4                (_ATC_MAT_SIP_BY_DIPV4 << ATC_MAT_OFFSET)
+#define ATC_MAT_SIP_BY_SIPV4                (_ATC_MAT_SIP_BY_SIPV4 << ATC_MAT_OFFSET)
+#define ATC_MAT_SIP_BY_DIPV6                (_ATC_MAT_SIP_BY_DIPV6 << ATC_MAT_OFFSET)
+#define ATC_MAT_SIP_BY_SIPV6                (_ATC_MAT_SIP_BY_SIPV6 << ATC_MAT_OFFSET)
+
+#define ATC_START_BUSY                      (0x01 << ATC_BUSY_OFFSET)
+
+/* fields of AAC*/
+#define AAC                                 (REG_ARL_BASE_ADDRESS + 0x00A0)
+#define AAC_AGE_UNIT_OFFSET                 (0)
+#define AAC_AGE_UNIT_LENGTH                 (11)
+#define AAC_AGE_CNT_OFFSET                  (12)
+#define AAC_AGE_CNT_LENGTH                  (9)
+#define AAC_AUTO_FLUSH_OFFSET               (28)
+#define AAC_AUTO_FLUSH_LENGTH               (1)
+
+#define AGDIS                               (REG_ARL_BASE_ADDRESS + 0x00C0)
+
+/* fields of ATWDS */
+#define ATRDS                               (REG_ARL_BASE_ADDRESS + 0x0330)
+#define ATRD0_MAC_SEL_OFFSET                (0)
+#define ATRD0_MAC_SEL_LENGTH                (2)
+
+/* fields of ATRD0 */
+#define ATRD0                               (REG_ARL_BASE_ADDRESS + 0x0334)
+//need to verify 32'b 0
+#define ATRD0_MAC_LIVE_OFFSET               (0)
+#define ATRD0_MAC_LIVE_LENGTH               (1)
+#define ATRD0_MAC_LIFETIME_OFFSET           (1)
+#define ATRD0_MAC_LIFETIME_LENGTH           (2)
+#define ATRD0_MAC_TYPE_OFFSET               (3)
+#define ATRD0_MAC_TYPE_LENGTH               (2)
+#define ATRD0_MAC_LEAK_OFFSET               (5)
+#define ATRD0_MAC_LEAK_LENGTH               (1)
+#define ATRD0_MAC_UPRI_OFFSET               (6)
+#define ATRD0_MAC_UPRI_LENGTH               (3)
+#define ATRD0_MAC_IVL_OFFSET                (9)
+#define ATRD0_MAC_IVL_LENGTH                (1)
+#define ATRD0_MAC_VID_OFFSET                (10)
+#define ATRD0_MAC_VID_LENGTH                (12)
+#define ATRD0_MAC_ETAG_OFFSET               (22)
+#define ATRD0_MAC_ETAG_LENGTH               (3)
+#define ATRD0_MAC_FID_OFFSET                (25)
+#define ATRD0_MAC_FID_LENGTH                (4)
+#define ATRD1_MAC_UNAUTH_OFFSET             (31)
+#define ATRD1_MAC_UNAUTH_LENGTH             (1)
+
+/* fields of ATRD1 */
+#define ATRD1                               (REG_ARL_BASE_ADDRESS + 0x0338)
+//need to verify 32'b 0
+#define ATRD1_MAC_FWD_OFFSET                (0)
+#define ATRD1_MAC_FWD_LENGTH                (3)
+#define ATRD1_MAC_AGETIME_OFFSET            (3)
+#define ATRD1_MAC_AGETIME_LENGTH            (9)
+#define ATRD1_MAC_MIR_OFFSET                (12)
+#define ATRD1_MAC_MIR_LENGTH                (4)
+#define ATRD1_MAC_ADDR_LSB_OFFSET           (16)
+#define ATRD1_MAC_ADDR_LSB_LENGTH           (16)
+
+/* fields of ATRD2 */
+#define ATRD2                               (REG_ARL_BASE_ADDRESS + 0x033C)
+#define ATRD2_MAC_ADDR_MSB_OFFSET           (0)
+#define ATRD2_MAC_ADDR_MSB_LENGTH           (32)
+
+/* fields of ATRD3 */
+#define ATRD3                               (REG_ARL_BASE_ADDRESS + 0x0340)
+//need to verify 32'b 0
+#define ATRD3_MAC_PORT_OFFSET               (0)
+#define ATRD3_MAC_PORT_LENGTH               (8)
+
+#define REG_SCH_PORT_ADDRESS           (REG_ARL_BASE_ADDRESS + 0xc000)
+#define MMSCR0_Q0(p)                   (REG_SCH_PORT_ADDRESS + PORT_CTRL_PORT_OFFSET * (p))
+#define MMSCR1_Q0(p)                   (REG_SCH_PORT_ADDRESS + PORT_CTRL_PORT_OFFSET * (p) + 0x4)
+#define MMSCR0_Q1(p)                   (REG_SCH_PORT_ADDRESS + PORT_CTRL_PORT_OFFSET * (p) + 0x8)
+#define MMSCR1_Q1(p)                   (REG_SCH_PORT_ADDRESS + PORT_CTRL_PORT_OFFSET * (p) + 0xc)
+#define MMSCR0_Q2(p)                   (REG_SCH_PORT_ADDRESS + PORT_CTRL_PORT_OFFSET * (p) + 0x10)
+#define MMSCR1_Q2(p)                   (REG_SCH_PORT_ADDRESS + PORT_CTRL_PORT_OFFSET * (p) + 0x14)
+#define MMSCR0_Q3(p)                   (REG_SCH_PORT_ADDRESS + PORT_CTRL_PORT_OFFSET * (p) + 0x18)
+#define MMSCR1_Q3(p)                   (REG_SCH_PORT_ADDRESS + PORT_CTRL_PORT_OFFSET * (p) + 0x1c)
+#define MMSCR0_Q4(p)                   (REG_SCH_PORT_ADDRESS + PORT_CTRL_PORT_OFFSET * (p) + 0x20)
+#define MMSCR1_Q4(p)                   (REG_SCH_PORT_ADDRESS + PORT_CTRL_PORT_OFFSET * (p) + 0x24)
+#define MMSCR0_Q5(p)                   (REG_SCH_PORT_ADDRESS + PORT_CTRL_PORT_OFFSET * (p) + 0x28)
+#define MMSCR1_Q5(p)                   (REG_SCH_PORT_ADDRESS + PORT_CTRL_PORT_OFFSET * (p) + 0x2c)
+#define MMSCR0_Q6(p)                   (REG_SCH_PORT_ADDRESS + PORT_CTRL_PORT_OFFSET * (p) + 0x30)
+#define MMSCR1_Q6(p)                   (REG_SCH_PORT_ADDRESS + PORT_CTRL_PORT_OFFSET * (p) + 0x34)
+#define MMSCR0_Q7(p)                   (REG_SCH_PORT_ADDRESS + PORT_CTRL_PORT_OFFSET * (p) + 0x38)
+#define MMSCR1_Q7(p)                   (REG_SCH_PORT_ADDRESS + PORT_CTRL_PORT_OFFSET * (p) + 0x3c)
+
+#define PUPW(p)                             PORT_CTRL_REG(p, 0x30)
+
+#define PEM1                                (REG_ARL_BASE_ADDRESS + 0x0048)
+#define PEM2                                (REG_ARL_BASE_ADDRESS + 0x004c)
+#define PEM3                                (REG_ARL_BASE_ADDRESS + 0x0050)
+#define PEM4                                (REG_ARL_BASE_ADDRESS + 0x0054)
+
+#define PIM1                                (REG_ARL_BASE_ADDRESS + 0x0058)
+#define PIM2                                (REG_ARL_BASE_ADDRESS + 0x005c)
+#define PIM3                                (REG_ARL_BASE_ADDRESS + 0x0060)
+#define PIM4                                (REG_ARL_BASE_ADDRESS + 0x0064)
+#define PIM5                                (REG_ARL_BASE_ADDRESS + 0x0068)
+#define PIM6                                (REG_ARL_BASE_ADDRESS + 0x006c)
+#define PIM7                                (REG_ARL_BASE_ADDRESS + 0x0070)
+
+/* fields of ingress and egress rate control */
+#define IRLCR(p)                            (REG_ARL_BASE_ADDRESS + (p * PORT_CTRL_PORT_OFFSET) + 0x4000)
+#define ERLCR(p)                            (REG_ARL_BASE_ADDRESS + (p * PORT_CTRL_PORT_OFFSET) + 0xC040)
+#define REG_RATE_CIR_OFFT                   (0)
+#define REG_RATE_CIR_LENG                   (17)
+#define REG_TB_EN_OFFT                      (19)
+#define REG_RATE_TB_OFFT                    (20)
+#define REG_RATE_TB_LENG                    (4)
+#define REG_RATE_CBS_OFFT                   (24)
+#define REG_RATE_CBS_LENG                   (7)
+#define REG_RATE_EN_OFFT                    (31)
+
+/* fields of global ingress and egress rate control */
+#define GIRLCR                              (REG_ARL_BASE_ADDRESS + 0x7E24)
+#define GERLCR                              (REG_ARL_BASE_ADDRESS + 0xFE00)
+#define REG_IPG_BYTE_OFFT                   (0)
+#define REG_IPG_BYTE_LENG                   (8)
+#define REG_MFRM_EX_OFFT                    (9)
+#define REG_MFRM_EX_LENG                    (1)
+#define SFLOW_MFRM_EX_OFFT                  (25)
+#define SFLOW_MFRM_EX_LENG                  (1)
+#define L1_RATE_IPG_BYTE_CNT                (0x18)
+#define L2_RATE_IPG_BYTE_CNT                (0x04)
+
+
+/* fields of PTC */
+#define PTC_INFO_SEL_SP                     (1 << 0)
+#define PTC_INFO_SEL_SA                     (1 << 1)
+#define PTC_INFO_SEL_DA                     (1 << 2)
+#define PTC_INFO_SEL_SIP                    (1 << 3)
+#define PTC_INFO_SEL_DIP                    (1 << 4)
+#define PTC_INFO_SEL_SPORT                  (1 << 5)
+#define PTC_INFO_SEL_DPORT                  (1 << 6)
+
+#define SSC(p)                              PORT_CTRL_REG(p, 0x00)
+#define PIC(p)                              PORT_CTRL_REG(p, 0x08)
+
+/* fields of IGMP SNOOPING */
+#define IGMP_HW_GQUERY                      1
+#define IGMP_HW_SQUERY                      (1 << 2)
+#define IGMP_HW_JOIN                        (1 << 4)
+#define IGMPV3_HW_JOIN                      (1 << 6)
+#define DMAC_01005E                         (1 << 8)
+#define DMAC_3333XX                         (1 << 9)
+#define MCAST_DIP                           (1 << 10)
+#define IGMP_HW_LEAVE                       (1 << 12)
+#define IGMP_AUTO_DOWNGRADE                 (1 << 20)
+#define IGMP_AUTO_ROUTER                    (1 << 18)
+#define IGMP_ROBUSTNESS_OFFSET              16
+#define IGMP_QUERYINTERVAL_OFFSET           8
+
+/* fields of MLD SNOOPING */
+#define MLD_HW_GQUERY                       (1 << 1)
+#define MLD_HW_SQUERY                       (1 << 3)
+#define MLD_HW_JOIN                         (1 << 5)
+#define MLDV2_HW_JOIN                       (1 << 7)
+#define MLD_HW_LEAVE                        (1 << 13)
+#define MLD_AUTO_ROUTER                     (1 << 19)
+
+#define PMSR(p)                             PORT_MAC_CTRL_REG(p, 0x10)
+
+/* fields of loop detect */
+#define LPDET_CTRL                          0x30C0
+#define LPDET_OFFSET                        24
+#define LPDET_TRIGGER_OFFSET                23
+#define LPDET_TRIGGER_PERIODICAL            1
+#define LPDET_TRIGGER_BROADCAST             0
+
+/* Port debug count register */
+#define DBG_CNT_BASE                        0x3018
+#define DBG_CNT_PORT_BASE                   0x100
+#define DBG_CNT(p)                          (DBG_CNT_BASE + (p) * DBG_CNT_PORT_BASE)
+#define DIS_CLR                             (1 << 31)
+
+#define PFC_STS(p)                          PORT_MAC_CTRL_REG(p, 0x24)
+#define PFC_CTRL                            (PORT_MAC_CTRL_BASE + 0xB0)
+#define PFC_EN(p)                           (1 << p)
+#define PFC_SYN_EN(p)                       (0x80 << p)
+
+#define GMACCR                              (PORT_MAC_CTRL_BASE + 0x3e00)
+#define MTCC_LMT_S                          8
+#define MAX_RX_JUMBO_S                      4
+
+/* Values of MAX_RX_PKT_LEN */
+#define RX_PKT_LEN_1518                     (0)
+#define RX_PKT_LEN_1536                     (1)
+#define RX_PKT_LEN_1522                     (2)
+#define RX_PKT_LEN_MAX_JUMBO                (3)
+
+/* Fields of PMCR */
+#define FORCE_MODE                          (1 << 31)
+#define IPG_CFG_S                           (20)
+#define IPG_CFG_M                           (0x300000)
+#define EXT_PHY                             (1 << 19)
+#define MAC_MODE                            (1 << 18)
+#define MAC_TX_EN                           (1 << 16)
+#define MAC_RX_EN                           (1 << 15)
+#define MAC_PRE                             (1 << 14)
+#define BKOFF_EN                            (1 << 12)
+#define BACKPR_EN                           (1 << 11)
+#define FORCE_EEE1G                         (1 << 7)
+#define FORCE_EEE100                        (1 << 6)
+#define FORCE_RX_FC                         (1 << 5)
+#define FORCE_TX_FC                         (1 << 4)
+#define FORCE_SPD_S                         (28)
+#define FORCE_SPD_M                         (0x70000000)
+#define FORCE_DPX                           (1 << 25)
+#define FORCE_LINK                          (1 << 24)
+
+/* Fields of PMSR */
+#define EEE1G_STS                           (1 << 7)
+#define EEE100_STS                          (1 << 6)
+#define RX_FC_STS                           (1 << 5)
+#define TX_FC_STS                           (1 << 4)
+#define MAC_SPD_STS_S                       (28)
+#define MAC_SPD_STS_M                       (0x70000000)
+#define MAC_DPX_STS                         (1 << 25)
+#define MAC_LNK_STS                         (1 << 24)
+
+/* Values of MAC_SPD_STS */
+#define MAC_SPD_10                          0
+#define MAC_SPD_100                         1
+#define MAC_SPD_1000                        2
+#define MAC_SPD_2500                        3
+
+/* Values of IPG_CFG */
+#define IPG_96BIT                           0
+#define IPG_96BIT_WITH_SHORT_IPG            1
+#define IPG_64BIT                           2
+
+/* Register of MIB Base address */
+#define MAC_GLOBAL_REG_BASE                 0x10213E00
+#define ARL_ACL_ATK_REG_BASE                0x10200000
+
+#define MIB_BASE                            0x10214000
+#define MIB_PORT_OFFSET                     0x0200
+#define MIB_ACL_EVENT_OFFSET                0x0F00
+#define MIB_TDPC(p)                         (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x00)
+#define MIB_TCRC(p)                         (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x04)
+#define MIB_TUPC(p)                         (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x08)
+#define MIB_TMPC(p)                         (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x0C)
+#define MIB_TBPC(p)                         (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x10)
+#define MIB_TCEC(p)                         (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x14)
+#define MIB_TSCEC(p)                        (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x18)
+#define MIB_TMCEC(p)                        (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x1C)
+#define MIB_TDEC(p)                         (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x20)
+#define MIB_TLCEC(p)                        (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x24)
+#define MIB_TXCEC(p)                        (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x28)
+#define MIB_TPPC(p)                         (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x2C)
+#define MIB_TL64PC(p)                       (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x30)
+#define MIB_TL65PC(p)                       (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x34)
+#define MIB_TL128PC(p)                      (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x38)
+#define MIB_TL256PC(p)                      (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x3C)
+#define MIB_TL512PC(p)                      (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x40)
+#define MIB_TL1024PC(p)                     (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x44)
+#define MIB_TL1519PC(p)                     (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x48)
+
+#define MIB_TOCL(p)                         (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x4C)
+#define MIB_TOCH(p)                         (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x50)
+#define MIB_TODPC(p)                        (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x54)
+#define MIB_TOCL2(p)                        (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x58)
+#define MIB_TOCH2(p)                        (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x5C)
+
+
+
+#define MIB_RDPC(p)                         (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x80)
+#define MIB_RFPC(p)                         (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x84)
+#define MIB_RUPC(p)                         (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x88)
+#define MIB_RMPC(p)                         (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x8C)
+#define MIB_RBPC(p)                         (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x90)
+#define MIB_RAEPC(p)                        (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x94)
+#define MIB_RCEPC(p)                        (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x98)
+#define MIB_RUSPC(p)                        (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x9C)
+#define MIB_RFEPC(p)                        (MIB_BASE + (p) * MIB_PORT_OFFSET + 0xA0)
+#define MIB_ROSPC(p)                        (MIB_BASE + (p) * MIB_PORT_OFFSET + 0xA4)
+#define MIB_RJEPC(p)                        (MIB_BASE + (p) * MIB_PORT_OFFSET + 0xA8)
+#define MIB_RPPC(p)                         (MIB_BASE + (p) * MIB_PORT_OFFSET + 0xAC)
+#define MIB_RL64PC(p)                       (MIB_BASE + (p) * MIB_PORT_OFFSET + 0xB0)
+#define MIB_RL65PC(p)                       (MIB_BASE + (p) * MIB_PORT_OFFSET + 0xB4)
+#define MIB_RL128PC(p)                      (MIB_BASE + (p) * MIB_PORT_OFFSET + 0xB8)
+#define MIB_RL256PC(p)                      (MIB_BASE + (p) * MIB_PORT_OFFSET + 0xBC)
+#define MIB_RL512PC(p)                      (MIB_BASE + (p) * MIB_PORT_OFFSET + 0xC0)
+#define MIB_RL1024PC(p)                     (MIB_BASE + (p) * MIB_PORT_OFFSET + 0xC4)
+#define MIB_RL1519PC(p)                     (MIB_BASE + (p) * MIB_PORT_OFFSET + 0xC8)
+
+#define MIB_ROCL(p)                         (MIB_BASE + (p) * MIB_PORT_OFFSET + 0xCC)
+#define MIB_ROCH(p)                         (MIB_BASE + (p) * MIB_PORT_OFFSET + 0xD0)
+#define MIB_RCDPC(p)                        (MIB_BASE + (p) * MIB_PORT_OFFSET + 0xD4)
+#define MIB_RIDPC(p)                        (MIB_BASE + (p) * MIB_PORT_OFFSET + 0xD8)
+#define MIB_RADPC(p)                        (MIB_BASE + (p) * MIB_PORT_OFFSET + 0xDC)
+#define MIB_FCDPC(p)                        (MIB_BASE + (p) * MIB_PORT_OFFSET + 0xE0)
+#define MIB_WRDPC(p)                        (MIB_BASE + (p) * MIB_PORT_OFFSET + 0xE4)
+#define MIB_MRDPC(p)                        (MIB_BASE + (p) * MIB_PORT_OFFSET + 0xE8)
+#define MIB_ROCL2(p)                        (MIB_BASE + (p) * MIB_PORT_OFFSET + 0xEC)
+#define MIB_ROCH2(p)                        (MIB_BASE + (p) * MIB_PORT_OFFSET + 0xF0)
+#define MIB_SFSPC(p)                        (MIB_BASE + (p) * MIB_PORT_OFFSET + 0xF4)
+#define MIB_SFTPC(p)                        (MIB_BASE + (p) * MIB_PORT_OFFSET + 0xF8)
+#define MIB_RXC_DPC(p)                      (MIB_BASE + (p) * MIB_PORT_OFFSET + 0xFC)
+
+
+#define MIB_TMIB_HF_STS(p)                  (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x7C)
+#define MIB_RMIB_HF_STS(p)                  (MIB_BASE + (p) * MIB_PORT_OFFSET + 0x100)
+
+#define ACL_MIB_CNT_CFG                     (ARL_ACL_ATK_REG_BASE + 0x534)
+#define ACL_MIB_CNT                         (ARL_ACL_ATK_REG_BASE + 0x538)
+
+
+#define MIB_CCR                             (MAC_GLOBAL_REG_BASE + 0x0030)
+#define MIB_PCLR                            (MAC_GLOBAL_REG_BASE + 0x0034)
+#define MIB_CCR_MIB_ENABLE_OFFSET           (31)
+#define MIB_CCR_MIB_ENABLE_LENGTH            (1)
+#define MIB_CCR_MIB_ENABLE                  (1 << 31)
+#define MIB_CCR_RX_OCT_CNT_GOOD             (1 << 7)
+#define MIB_CCR_RX_OCT_CNT_BAD              (1 << 6)
+#define MIB_CCR_TX_OCT_CNT_GOOD             (1 << 5)
+#define MIB_CCR_TX_OCT_CNT_BAD              (1 << 4)
+
+#define CSR_ACL_MIB_CLEAR                   (1 << 0)
+
+#define SGMII_REG_BASE                      0x5000
+#define SGMII_REG_PORT_BASE                 0x1000
+#define SGMII_REG(p, r)                     (SGMII_REG_BASE + (p) * SGMII_REG_PORT_BASE + (r))
+#define PCS_CONTROL_1(p)                    SGMII_REG(p, 0x00)
+#define PCS_SPEED_ABILITY(p)                SGMII_REG(p, 0x08)
+#define SGMII_MODE(p)                       SGMII_REG(p, 0x20)
+#define QPHY_PWR_STATE_CTRL(p)              SGMII_REG(p, 0xE8)
+#define PHYA_CTRL_SIGNAL3(p)                SGMII_REG(p, 0x128)
+
+/* Fields of PCS_CONTROL_1 */
+#define SGMII_AN_ABILITY                    (1 << 19)
+#define SGMII_LINK_STATUS                   (1 << 18)
+#define SGMII_AN_ENABLE_OFFT                (12)
+#define SGMII_AN_ENABLE                     (1 << 12)
+#define SGMII_AN_RESTART                    (1 << 9)
+
+/* Fields of SGMII_MODE */
+#define SGMII_REMOTE_FAULT_DIS              (1 << 8)
+#define SGMII_IF_MODE_FORCE_DUPLEX          (1 << 4)
+#define SGMII_IF_MODE_FORCE_SPEED_OFFT      (0x2)
+#define SGMII_IF_MODE_FORCE_SPEED_R         (0x2)
+#define SGMII_IF_MODE_FORCE_SPEED_M         (0x0C)
+#define SGMII_IF_MODE_ADVERT_AN             (1 << 1)
+
+/* Config of AN Tx control information (SGMII)
+* LINK- 1:link up, 0:link down
+* DUPLEX- 1:full, 0:half
+* MODE - 1:SGMII, 0:Clause37
+*/
+#define AN_CONFIG_TX_LINK                   (1 << 15)
+#define AN_CONFIG_TX_DUPLEX                 (1 << 12)
+#define AN_CONFIG_TX_SPEED_OFFT             (10)
+#define AN_CONFIG_TX_SPEED_MSK              (3 << AN_CONFIG_TX_SPEED_OFFT)
+#define AN_CONFIG_TX_MODE_SGMII             (1)
+
+/* Config of AN Tx control information (Clause37)
+* MODE - 1:SGMII, 0:Clause37
+*/
+#define AN_CONFIG_TX_FULL_DUPLEX_CL37       (1 << 5)
+#define AN_CONFIG_TX_HALF_DUPLEX_CL37       (1 << 6)
+#define AN_CONFIG_TX_SYMMETRIC_PAUSE        (1 << 7)
+#define AN_CONFIG_TX_ASYMMETRIC_PAUSE       (1 << 8)
+
+/* Values of SGMII_IF_MODE_FORCE_SPEED */
+#define SGMII_IF_MODE_FORCE_SPEED_10        0
+#define SGMII_IF_MODE_FORCE_SPEED_100       1
+#define SGMII_IF_MODE_FORCE_SPEED_1000      2
+
+/* Fields of QPHY_PWR_STATE_CTRL */
+#define PHYA_PWD                            (1 << 4)
+
+/* Fields of PHYA_CTRL_SIGNAL3 */
+#define RG_TPHY_SPEED_S                     2
+#define RG_TPHY_SPEED_M                     0x0c
+
+/* Values of RG_TPHY_SPEED */
+#define RG_TPHY_SPEED_1000                  0
+#define RG_TPHY_SPEED_2500                  1
+
+
+#define SCU_BASE                            0x10000000
+#define RG_RGMII_TXCK_C                     (SCU_BASE + 0x1d0)
+
+#define HSGMII_AN_CSR_BASE                  0x10220000
+#define SGMII_REG_AN0                       (HSGMII_AN_CSR_BASE + 0x000)
+#define SGMII_REG_AN_13                     (HSGMII_AN_CSR_BASE + 0x034)
+#define SGMII_REG_AN_FORCE_CL37             (HSGMII_AN_CSR_BASE + 0x060)
+
+#define HSGMII_CSR_PCS_BASE                 0x10220000
+#define RG_HSGMII_PCS_CTROL_1               (HSGMII_CSR_PCS_BASE + 0xa00)
+#define RG_AN_SGMII_MODE_FORCE              (HSGMII_CSR_PCS_BASE + 0xa24)
+
+#define MULTI_SGMII_CSR_BASE                0x10224000
+#define SGMII_STS_CTRL_0                    (MULTI_SGMII_CSR_BASE + 0x018)
+#define MSG_RX_CTRL_0                       (MULTI_SGMII_CSR_BASE + 0x100)
+#define MSG_RX_LIK_STS_0                    (MULTI_SGMII_CSR_BASE + 0x514)
+#define MSG_RX_LIK_STS_2                    (MULTI_SGMII_CSR_BASE + 0x51c)
+#define PHY_RX_FORCE_CTRL_0                 (MULTI_SGMII_CSR_BASE + 0x520)
+
+#define XFI_CSR_PCS_BASE                    0x10225000
+#define RG_USXGMII_AN_CONTROL_0             (XFI_CSR_PCS_BASE + 0xbf8)
+
+#define MULTI_PHY_RA_CSR_BASE               0x10226000
+#define RG_RATE_ADAPT_CTRL_0               (MULTI_PHY_RA_CSR_BASE + 0x000)
+#define RATE_ADP_P0_CTRL_0                 (MULTI_PHY_RA_CSR_BASE + 0x100)
+#define MII_RA_AN_ENABLE                   (MULTI_PHY_RA_CSR_BASE + 0x300)
+
+#define QP_DIG_CSR_BASE                     0x1022a000
+#define QP_CK_RST_CTRL_4                    (QP_DIG_CSR_BASE + 0x310)
+#define QP_DIG_MODE_CTRL_0                  (QP_DIG_CSR_BASE + 0x324)
+#define QP_DIG_MODE_CTRL_1                  (QP_DIG_CSR_BASE + 0x330)
+
+#define SERDES_WRAPPER_BASE                 0x1022c000
+#define USGMII_CTRL_0                       (SERDES_WRAPPER_BASE + 0x000)
+
+#define QP_PMA_TOP_BASE                     0x1022e000
+#define PON_RXFEDIG_CTRL_0                  (QP_PMA_TOP_BASE + 0x100)
+#define PON_RXFEDIG_CTRL_9                  (QP_PMA_TOP_BASE + 0x124)
+
+#define SS_LCPLL_PWCTL_SETTING_2            (QP_PMA_TOP_BASE + 0x208)
+#define SS_LCPLL_TDC_FLT_2                  (QP_PMA_TOP_BASE + 0x230)
+#define SS_LCPLL_TDC_FLT_5                  (QP_PMA_TOP_BASE + 0x23c)
+#define SS_LCPLL_TDC_PCW_1                  (QP_PMA_TOP_BASE + 0x248)
+#define INTF_CTRL_8                         (QP_PMA_TOP_BASE + 0x320)
+#define INTF_CTRL_9                         (QP_PMA_TOP_BASE + 0x324)
+#define PLL_CTRL_0                          (QP_PMA_TOP_BASE + 0x400)
+#define PLL_CTRL_2                          (QP_PMA_TOP_BASE + 0x408)
+#define PLL_CTRL_3                          (QP_PMA_TOP_BASE + 0x40c)
+#define PLL_CTRL_4                          (QP_PMA_TOP_BASE + 0x410)
+#define PLL_CK_CTRL_0                       (QP_PMA_TOP_BASE + 0x414)
+#define RX_DLY_0                            (QP_PMA_TOP_BASE + 0x614)
+#define RX_CTRL_2                           (QP_PMA_TOP_BASE + 0x630)
+#define RX_CTRL_5                           (QP_PMA_TOP_BASE + 0x63c)
+#define RX_CTRL_6                           (QP_PMA_TOP_BASE + 0x640)
+#define RX_CTRL_7                           (QP_PMA_TOP_BASE + 0x644)
+#define RX_CTRL_8                           (QP_PMA_TOP_BASE + 0x648)
+#define RX_CTRL_26                          (QP_PMA_TOP_BASE + 0x690)
+#define RX_CTRL_42                          (QP_PMA_TOP_BASE + 0x6d0)
+
+#define QP_ANA_CSR_BASE                     0x1022f000
+#define RG_QP_RX_DAC_EN                     (QP_ANA_CSR_BASE + 0x00)
+#define RG_QP_RXAFE_RESERVE                 (QP_ANA_CSR_BASE + 0x04)
+#define RG_QP_CDR_LPF_MJV_LIM               (QP_ANA_CSR_BASE + 0x0c)
+#define RG_QP_CDR_LPF_SETVALUE              (QP_ANA_CSR_BASE + 0x14)
+#define RG_QP_CDR_PR_CKREF_DIV1             (QP_ANA_CSR_BASE + 0x18)
+#define RG_QP_CDR_PR_KBAND_DIV_PCIE         (QP_ANA_CSR_BASE + 0x1c)
+#define RG_QP_CDR_FORCE_IBANDLPF_R_OFF      (QP_ANA_CSR_BASE + 0x20)
+#define RG_QP_TX_MODE_16B_EN                (QP_ANA_CSR_BASE + 0x28)
+#define RG_QP_PLL_IPLL_DIG_PWR_SEL          (QP_ANA_CSR_BASE + 0x3c)
+#define RG_QP_PLL_SDM_ORD                   (QP_ANA_CSR_BASE + 0x40)
+
+#define ETHER_SYS_BASE                      0x1028c800
+#define RG_P5MUX_MODE                       (ETHER_SYS_BASE + 0x00)
+#define RG_FORCE_CKDIR_SEL                  (ETHER_SYS_BASE + 0x04)
+#define RG_SWITCH_MODE                      (ETHER_SYS_BASE + 0x08)
+#define RG_FORCE_MAC5_SB                    (ETHER_SYS_BASE + 0x2c)
+#define CSR_RMII                            (ETHER_SYS_BASE + 0x70)
+
+
+#define SYS_CTRL                            0x7000
+#define SW_PHY_RST                          (1 << 2)
+#define SW_SYS_RST                          (1 << 1)
+#define SW_REG_RST                          (1 << 0)
+
+#define PHY_IAC                             0x1000e000
+
+#define CLKGEN_CTRL                         0x7500
+#define CLK_SKEW_OUT_S                      8
+#define CLK_SKEW_OUT_M                      0x300
+#define CLK_SKEW_IN_S                       6
+#define CLK_SKEW_IN_M                       0xc0
+#define RXCLK_NO_DELAY                      (1 << 5)
+#define TXCLK_NO_REVERSE                    (1 << 4)
+#define GP_MODE_S                           1
+#define GP_MODE_M                           0x06
+#define GP_CLK_EN                           (1 << 0)
+
+/* Values of GP_MODE */
+#define GP_MODE_RGMII                       0
+#define GP_MODE_MII                         1
+#define GP_MODE_REV_MII                     2
+
+/* Values of CLK_SKEW_IN */
+#define CLK_SKEW_IN_NO_CHANGE               0
+#define CLK_SKEW_IN_DELAY_100PPS            1
+#define CLK_SKEW_IN_DELAY_200PPS            2
+#define CLK_SKEW_IN_REVERSE                 3
+
+/* Values of CLK_SKEW_OUT */
+#define CLK_SKEW_OUT_NO_CHANGE              0
+#define CLK_SKEW_OUT_DELAY_100PPS           1
+#define CLK_SKEW_OUT_DELAY_200PPS           2
+#define CLK_SKEW_OUT_REVERSE                3
+
+#define HWSTRAP                             0x7800
+#define XTAL_FSEL_S                         7
+#define XTAL_FSEL_M                         (1 << 7)
+
+#define XTAL_40MHZ                          0
+#define XTAL_25MHZ                          1
+
+#define PLLGP_EN                            0x7820
+#define EN_COREPLL                          (1 << 2)
+#define SW_CLKSW                            (1 << 1)
+#define SW_PLLGP                            (1 << 0)
+
+#define PLLGP_CR0                           0x78a8
+#define RG_COREPLL_EN                       (1 << 22)
+#define RG_COREPLL_POSDIV_S                 23
+#define RG_COREPLL_POSDIV_M                 0x3800000
+#define RG_COREPLL_SDM_PCW_S                1
+#define RG_COREPLL_SDM_PCW_M                0x3ffffe
+#define RG_COREPLL_SDM_PCW_CHG              (1 << 0)
+
+#define MHWSTRAP                            0x7804
+#define STRAP_CHG_STRAP                     (1 << 8)
+#define STRAP_PHY_EN                        (1 << 6)
+
+#define TOP_SIG_SR                          0x780c
+#define PAD_DUAL_SGMII_EN                   (1 << 1)
+
+/* RGMII and SGMII PLL clock */
+#define ANA_PLLGP_CR2                       0x78b0
+#define ANA_PLLGP_CR5                       0x78bc
+
+/* Efuse Register Define */
+#define GBE_EFUSE                           0x7bc8
+#define GBE_SEL_EFUSE_EN                    (1 << 0)
+
+/* GPIO_PAD_0 */
+#define GPIO_MODE0                          0x7c0c
+#define GPIO_MODE0_S                        0
+#define GPIO_MODE0_M                        0xf
+#define GPIO_0_INTERRUPT_MODE               0x1
+
+#define SMT0_IOLB                           0x7f04
+#define SMT_IOLB_5_SMI_MDC_EN               (1 << 5)
+
+/* PHY CL22 reg */
+#define PHY_PAGE_0                          0x0
+/* Mode Control Register */
+#define PHY_MCR                             0x00
+#define MCR_SR                              (1 << 15)
+#define MCR_LB                              (1 << 14)
+#define MCR_MR_FC_SPD_INT_0                 (1 << 13)
+#define MCR_AN_EN                           (1 << 12)
+#define MCR_PW_DN                           (1 << 11)
+#define MCR_ISO                             (1 << 10)
+#define MCR_RST_AN                          (1 << 9)
+#define MCR_MR_DUX                          (1 << 8)
+#define MCR_MR_CLS_TEST                     (1 << 7)
+#define MCR_MR_FC_SPD_INT_1                 (1 << 6)
+
+/* Mode Status Register */
+#define PHY_MSR                             0x01
+#define MSR_CAP_100T4                       (1 << 15)
+#define MSR_CAP_100X_FDX                    (1 << 14)
+#define MSR_CAP_100X_HDX                    (1 << 13)
+#define MSR_CAP_10T_FDX                     (1 << 12)
+#define MSR_CAP_10T_HDX                     (1 << 11)
+#define MSR_CAP_100T2_HDX                   (1 << 10)
+#define MSR_CAP_100T2_FDX                   (1 << 9)
+#define MSR_EXT_STA_EN                      (1 << 8)
+#define MSR_PRAM_SUP_CAP                    (1 << 6)
+#define MSR_AN_COMP                         (1 << 5)
+#define MSR_RMT_FAULT                       (1 << 4)
+#define MSR_AN_CAP                          (1 << 3)
+#define MSR_LINK_STA                        (1 << 2)
+#define MSR_JAB_DECT                        (1 << 1)
+#define MSR_EXT_CAP                         (1 << 0)
+
+/* Auto-Negotiation Advertisement Register */
+#define PHY_AN_ADV                          0x04
+#define AN_ADV_NX_PAGE_REQ                  (1 << 15)
+#define AN_ADV_RF                           (1 << 13)
+#define AN_ADV_CAP_PAUSE                    (3 << 10)
+#define AN_ADV_CAP_100_T4                   (1 << 9)
+#define AN_ADV_CAP_100_FDX                  (1 << 8)
+#define AN_ADV_CAP_100_HDX                  (1 << 7)
+#define AN_ADV_CAP_10_FDX                   (1 << 6)
+#define AN_ADV_CAP_10_HDX                   (1 << 5)
+#define AN_ADV_802_9_ISLAN_16T              (2 << 0)
+#define AN_ADV_802_3                        (1 << 0)
+
+/* Auto-Negotiation Link Partner Advertisement Register */
+#define PHY_AN_LP_ADV                       0x05
+#define AN_LP_NX_PAGE_REQ                   (1 << 15)
+#define AN_LP_ACK                           (1 << 14)
+#define AN_LP_RF                            (1 << 13)
+#define AN_LP_CAP_PAUSE                     (3 << 10)
+#define AN_LP_CAP_100_T4                    (1 << 9)
+#define AN_LP_CAP_100_FDX                   (1 << 8)
+#define AN_LP_CAP_100_HDX                   (1 << 7)
+#define AN_LP_CAP_10_FDX                    (1 << 6)
+#define AN_LP_CAP_10_HDX                    (1 << 5)
+#define AN_LP_802_9_ISLAN_16T               (2 << 0)
+#define AN_LP_802_3                         (1 << 0)
+
+/* 1000BASE-T Control Register */
+#define PHY_CR1G                            0x09
+#define CR1G_TEST_TM4                       (4 << 13)
+#define CR1G_TEST_TM3                       (3 << 13)
+#define CR1G_TEST_TM2                       (2 << 13)
+#define CR1G_TEST_TM1                       (1 << 13)
+#define CR1G_TEST_NORMAL                    (0 << 13)
+#define CR1G_MS_EN                          (1 << 12)
+#define CR1G_MS_CONF                        (1 << 11)
+#define CR1G_PORT_TYPE                      (1 << 10)
+#define CR1G_ADV_CAP1000_FDX                (1 << 9)
+#define CR1G_ADV_CAP1000_HDX                (1 << 8)
+
+/* 1000BASE-T Status Register */
+#define PHY_SR1G                            0x0A
+#define SR1G_MS_CFG_FAULT                   (1 << 15)
+#define SR1G_MS_CFG_RES                     (1 << 14)
+#define SR1G_LOC_RX                         (1 << 13)
+#define SR1G_RMT_RX                         (1 << 12)
+#define SR1G_CAP1000_FDX                    (1 << 11)
+#define SR1G_CAP1000_HDX                    (1 << 10)
+#define SR1G_IDLE_ERR_MASK                  0xFF
+
+#define PHY_PAGE_1                          0x1
+/* Ethernet Packet Generator Control Register */
+#define PHY_EPG                             0x1D
+#define EPG_EN                              (1 << 15)
+#define EPG_RUN                             (1 << 14)
+#define EPG_TX_DUR                          (1 << 13)
+#define EPG_PKT_LEN_10KB                    (3 << 11)
+#define EPG_PKT_LEN_1518B                   (2 << 11)
+#define EPG_PKT_LEN_64B                     (1 << 11)
+#define EPG_PKT_LEN_125B                    (0 << 11)
+#define EPG_PKT_GAP                         (1 << 10)
+#define EPG_DES_ADDR(a)                     ( ( (a) & 0xF ) << 6 )
+#define EPG_SUR_ADDR(a)                     ( ( (a) & 0xF ) << 2 )
+#define EPG_PL_TYP_RANDOM                   (1 << 1)
+#define EPG_BAD_FCS                         (1 << 0)
+
+/* external*/
+#define EXPHY_CMD_WRITE                     (0x10)
+#define DFETAILDC_COEFF_L                   (0x11)
+#define DFETAILDC_COEFF_M                   (0x12)
+
+/* PHY CL22 reg */
+#define PHY_PAGE                            (0x1F)
+
+/* PHY CL45 reg */
+#define PHY_DEV_07H                         (0x07)
+#define PHY_DEV_1FH                         (0x1F)
+#define PHY_DEV_1EH                         (0x1E)
+
+/* dev 07h, reg 03Ch: EEE Advertisement Register */
+#define EEE_ADV_REG                         (0x3C)
+#define EEE_ADV_1000BT                      (1 << 2)
+#define EEE_ADV_100BT                       (1 << 1)
+
+/* dev 1Eh, reg 013h: TX pair delay Register */
+#define TX_PAIR_DELAY_SEL_REG               (0x013)
+
+/* dev 1Eh, reg 03Ch: Bypass power-down Register */
+#define BYPASS_POWER_DOWN_REG0              (0x3C)
+#define BYPASS_POWER_DOWN_REG1              (0x3D)
+#define BYPASS_POWER_DOWN_REG2              (0x3E)
+
+
+/* dev 1Eh, reg 145h: T10 Test Conttrol Register */
+#define PD_DIS                              (1 << 15)
+#define FC_TDI_EN                           (1 << 14)
+#define FC_DI_ACT                           (1 << 13)
+#define FC_LITN_NO_COMP                     (1 << 12)
+#define FC_MDI_CO_MDIX                      (3 << 3)
+#define FC_MDI_CO_MDI                       (2 << 3)
+#define FC_MDI_CO_NOT                       (0 << 3)
+#define FC_10T_POLAR_SWAP                   (3 << 1)
+#define FC_10T_POLAR_NORMAL                 (2 << 1)
+#define FC_10T_POLAR_NOT                    (0 << 1)
+
+/* dev 1Eh, reg 14Ah: DSP control 1 Register */
+#define DSP_CONTROL_REG                     (0x14A)
+#define PICMD_MISER_MODE_INT(v)             (((v) & 0x7ff) << 5)
+
+/* dev 1Eh, reg 20Bh: DSP state machine PM control Register */
+#define DSP_FRE_PM_REG                      (0x20B)
+
+/* dev 1Eh, reg 20Eh: DSP state machine FRE control Register */
+#define DSP_FRE_REG                         (0x20E)
+#define DSP_FRE_RP_FSM_EN                   (1 << 4)
+#define DSP_FRE_DW_AUTO_INC                 (1 << 2)
+#define DSP_FRE_WR_EN                       (1 << 1)
+#define DSP_FRE_SW_RST                      (1 << 0)
+
+/* dev 1Eh, reg 2d1h: Register */
+#define RG_LPI_REG                          (0x2D1)
+#define RG_LPI_VCO_EEE_STGO_EN              (1 << 10)
+#define RG_LPI_TR_READY                     (1 << 9)
+#define RG_LPI_SKIP_SD_SLV_TR               (1 << 8)
+#define VCO_SLICER_THRES_H                  (0x33)
+
+/* dev 1Fh, reg 021h: LED Basic control Register */
+#define LED_BCR                             (0x021)
+#define LED_BCR_EXT_CTRL                    (1 << 15)
+#define LED_BCR_EVT_ALL                     (1 << 4)
+#define LED_BCR_CLK_EN                      (1 << 3)
+#define LED_BCR_TIME_TEST                   (1 << 2)
+#define LED_BCR_MODE_MASK                   (3)
+#define LED_BCR_MODE_DISABLE                (0)
+#define LED_BCR_MODE_2LED                   (1)
+#define LED_BCR_MODE_3LED_1                 (2)
+#define LED_BCR_MODE_3LED_2                 (3)
+
+/* dev 1Fh, reg 022h: LED On Duration Register */
+#define LED_ON_DUR                          (0x022)
+#define LED_ON_DUR_MASK                     (0xFFFF)
+
+/* dev 1Fh, reg 023h: LED Blinking Duration Register */
+#define LED_BLK_DUR                         (0x023)
+#define LED_BLK_DUR_MASK                    (0xFFFF)
+
+/* dev 1Fh, reg 024h: LED On Control Register */
+#define LED_ON_CTRL(i)                      (0x024 + ( (i) * 2 ))
+#define LED_ON_EN                           (1 << 15)
+#define LED_ON_POL                          (1 << 14)
+#define LED_ON_EVT_MASK                     (0x7F)
+#define LED_ON_EVT_FORCE                    (1 << 6)
+#define LED_ON_EVT_HDX                      (1 << 5)
+#define LED_ON_EVT_FDX                      (1 << 4)
+#define LED_ON_EVT_LINK_DN                  (1 << 3)
+#define LED_ON_EVT_LINK_10M                 (1 << 2)
+#define LED_ON_EVT_LINK_100M                (1 << 1)
+#define LED_ON_EVT_LINK_1000M               (1 << 0)
+
+/* dev 1Fh, reg 025h: LED Blinking Control Register */
+#define LED_BLK_CTRL(i)                     (0x025 + ( (i) * 2 ))
+#define LED_BLK_EVT_MASK                    (0x3FF)
+#define LED_BLK_EVT_FORCE                   (1 << 9)
+#define LED_BLK_EVT_RX_IDL                  (1 << 8)
+#define LED_BLK_EVT_RX_CRC                  (1 << 7)
+#define LED_BLK_EVT_CLS                     (1 << 6)
+#define LED_BLK_EVT_10M_RX_ACT              (1 << 5)
+#define LED_BLK_EVT_10M_TX_ACT              (1 << 4)
+#define LED_BLK_EVT_100M_RX_ACT             (1 << 3)
+#define LED_BLK_EVT_100M_TX_ACT             (1 << 2)
+#define LED_BLK_EVT_1000M_RX_ACT            (1 << 1)
+#define LED_BLK_EVT_1000M_TX_ACT            (1 << 0)
+
+/* dev 1Fh, reg 27Bh: 10M Driver Register */
+#define CR_RG_TX_CM_10M(val)                ( ( (val) & 0x3 ) << 12 )
+#define CR_RG_DELAY_TX_10M(val)             ( ( (val) & 0x3 ) << 8 )
+#define CR_DA_TX_GAIN_10M_EEE(val)          ( ( ( ( (val) / 10 ) - 3 ) & 0x7 ) << 4 )
+#define CR_DA_TX_GAIN_10M(val)              ( ( ( (val) / 10 ) - 3 ) & 0x7 )
+
+/* dev 1Fh, reg 403h: PLL_group Control Register */
+#define PLL_GROUP_CONTROL_REG               (0x403)
+#define RG_SYSPLL_DDSFBK_EN                 (1 << 12)
+#define RG_SYSPLL_DMY1                      (3 << 8)
+#define RG_SYSPLL_EEE_EN                    (1 << 7)    //1:enable/0:disable EEE mode when RG_SYSPLL_EEE_EN_PYPASS = 1
+#define RG_SYSPLL_EEE_EN_PYPASS             (1 << 6)    //EEE enable is control by 0:top/1:RG_SYSPLL_EEE_EN
+#define RG_SYSPLL_AFE_PWD                   (1 << 5)    //1:enable/0:disable analog power down when RG_SYSPLL_AFE_PWD_BYPASS = 1
+#define RG_SYSPLL_AFE_PWD_BYPASS            (1 << 4)    //Analog power down is control by 0:top/1:RG_SYSPLL_AFE_PWD
+#define RG_SYSPLL_EFUSE_DIS                 (1 << 3)    //1:efuse mode / 0:disable efuse mode, and use internal RG
+#define RG_CLKDRV_FORCEIN                   (3 << 1)    //analog test mode
+#define RG_XSQ_LPF_EN                       (1 << 0)    //analog test mode
+
+/* Register of ACL address */
+#define ARL_GLOBAL_CNTRL        (REG_ARL_BASE_ADDRESS + 0x00c)
+#define ACL_BASE                (REG_ARL_BASE_ADDRESS + 0x500)
+#define ACL_GLOBAL_CFG          (ACL_BASE + 0x00)
+#define ACL_PORT_EN             (ACL_BASE + 0x04)
+#define ACL_GROUP_CFG           (ACL_BASE + 0x08)
+#define ACL_MEM_CFG             (ACL_BASE + 0x0c)
+#define ACL_MEM_CFG_WDATA0      (ACL_BASE + 0x10)
+#define ACL_MEM_CFG_WDATA1      (ACL_BASE + 0x14)
+#define ACL_MEM_CFG_WDATA2      (ACL_BASE + 0x18)
+#define ACL_MEM_CFG_WDATA3      (ACL_BASE + 0x1c)
+#define ACL_MEM_CFG_RDATA0      (ACL_BASE + 0x20)
+#define ACL_MEM_CFG_RDATA1      (ACL_BASE + 0x24)
+#define ACL_MEM_CFG_RDATA2      (ACL_BASE + 0x28)
+#define ACL_MEM_CFG_RDATA3      (ACL_BASE + 0x2c)
+#define ACL_STATUS              (ACL_BASE + 0x30)
+#define ACL_TRTCM               (REG_ARL_BASE_ADDRESS + 0x100)
+#define ACL_TRTCMA              (REG_ARL_BASE_ADDRESS + 0x104)
+#define ACL_TRTCMW_CBS          (REG_ARL_BASE_ADDRESS + 0x108)
+#define ACL_TRTCMW_EBS          (REG_ARL_BASE_ADDRESS + 0x10C)
+#define ACL_TRTCMW_CIR          (REG_ARL_BASE_ADDRESS + 0x110)
+#define ACL_TRTCMW_EIR          (REG_ARL_BASE_ADDRESS + 0x114)
+#define ACL_TRTCMR_CBS          (REG_ARL_BASE_ADDRESS + 0x118)
+#define ACL_TRTCMR_EBS          (REG_ARL_BASE_ADDRESS + 0x11c)
+#define ACL_TRTCMR_CIR          (REG_ARL_BASE_ADDRESS + 0x120)
+#define ACL_TRTCMR_EIR          (REG_ARL_BASE_ADDRESS + 0x124)
+
+#define ACLRMC                  (REG_ARL_BASE_ADDRESS + 0x470)
+#define ACLRMD1                 (REG_ARL_BASE_ADDRESS + 0x474)
+#define ACLRMD2                 (REG_ARL_BASE_ADDRESS + 0x478)
+
+#define ACL_UDF_BASE            (REG_ARL_BASE_ADDRESS + 0x200)
+#define ACL_AUTC                (ACL_UDF_BASE + 0x00)
+#define ACL_AUTW0               (ACL_UDF_BASE + 0x08)
+#define ACL_AUTW1               (ACL_UDF_BASE + 0x0c)
+#define ACL_AUTW2               (ACL_UDF_BASE + 0x10)
+#define ACL_AUTR0               (ACL_UDF_BASE + 0x20)
+#define ACL_AUTR1               (ACL_UDF_BASE + 0x24)
+#define ACL_AUTR2               (ACL_UDF_BASE + 0x28)
+
+/* Register of DPCR */
+#define BMU_PORT_BASE               (0x10204000)
+#define DPCR_COLOR_OFFSET           (0x20)
+#define DPCR_QUEUE_OFFSET           (0x4)
+#define DPCR_EN(p)                  (BMU_PORT_BASE + (p * PORT_CTRL_PORT_OFFSET) + 0x08)
+#define DPCR_BASE                   (BMU_PORT_BASE + 0x10)
+#define DPCR(p, c, q)               (DPCR_BASE + (p * PORT_CTRL_PORT_OFFSET) + (c * DPCR_COLOR_OFFSET) + (q * DPCR_QUEUE_OFFSET))
+
+/* Register of VLAN */
+#define VTCR                    (0x10200600)
+#define VLNWDATA0               (0x10200604)
+#define VLNWDATA1               (0x10200608)
+#define VLNWDATA2               (0x1020060C)
+#define VLNWDATA3               (0x10200610)
+#define VLNWDATA4               (0x10200614)
+#define VLNRDATA0               (0x10200618)
+#define VLNRDATA1               (0x1020061C)
+#define VLNRDATA2               (0x10200620)
+#define VLNRDATA3               (0x10200624)
+#define VLNRDATA4               (0x10200628)
+
+/* MACRO FUNCTION DECLARATIONS
+*/
+
+/* DATA TYPE DECLARATIONS
+*/
+
+/* EXPORTED SUBPROGRAM SPECIFICATIONS
+*/
+
+#endif  /* AIR_REG_H */
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_sec.h b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_sec.h
new file mode 100644
index 0000000..1f56fdd
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_sec.h
@@ -0,0 +1,308 @@
+/* FILE NAME: air_sec.h
+ * PURPOSE:
+ *      Define the security function in AIR SDK.
+ *
+ * NOTES:
+ *      None
+ */
+
+#ifndef AIR_SEC_H
+#define AIR_SEC_H
+
+/* INCLUDE FILE DECLARATIONS
+*/
+
+/* NAMING CONSTANT DECLARATIONS
+*/
+
+/* Field for storm control */
+#define AIR_STORM_MAX_COUNT    (255)
+
+#define AIR_MAX_NUM_OF_MAC     (2048)
+
+typedef enum
+{
+    AIR_STORM_TYPE_BCST,
+    AIR_STORM_TYPE_MCST,
+    AIR_STORM_TYPE_UCST,
+    AIR_STORM_TYPE_LAST
+}AIR_STORM_TYPE_T;
+
+typedef enum
+{
+    AIR_STORM_UNIT_64K,
+    AIR_STORM_UNIT_256K,
+    AIR_STORM_UNIT_1M,
+    AIR_STORM_UNIT_4M,
+    AIR_STORM_UNIT_16M,
+    AIR_STORM_UNIT_32M,
+    AIR_STORM_UNIT_LAST
+}AIR_STORM_UNIT_T;
+
+/* Field for flooding port */
+typedef enum
+{
+    AIR_FLOOD_TYPE_BCST,
+    AIR_FLOOD_TYPE_MCST,
+    AIR_FLOOD_TYPE_UCST,
+    AIR_FLOOD_TYPE_QURY,
+    AIR_FLOOD_TYPE_LAST
+}AIR_FLOOD_TYPE_T;
+
+/* Port security port control configurations */
+typedef struct AIR_SEC_PORTSEC_PORT_CONFIG_S
+{
+    /* Source MAC address learning mode */
+    BOOL_T sa_lrn_en;
+
+    /* Learned source MAC address counter */
+    BOOL_T sa_lmt_en;
+
+    /* Rx SA allowable learning limit number */
+    UI32_T sa_lmt_cnt;
+
+}AIR_SEC_PORTSEC_PORT_CONFIG_T;
+
+/* MACRO FUNCTION DECLARATIONS
+*/
+
+/* DATA TYPE DECLARATIONS
+*/
+
+/* EXPORTED SUBPROGRAM SPECIFICATIONS
+*/
+/* FUNCTION NAME: air_sec_setStormEnable
+ * PURPOSE:
+ *      Enable or disable per port storm control for specific type.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Select port number
+ *      type            --  AIR_STORM_TYPE_BCST
+ *                          AIR_STORM_TYPE_MCST
+ *                          AIR_STORM_TYPE_UCST
+ *      storm_en        --  TRUE
+ *                          FALSE
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_sec_setStormEnable(
+    const UI32_T unit,
+    const UI32_T port,
+    const AIR_STORM_TYPE_T type,
+    const BOOL_T storm_en);
+
+/* FUNCTION NAME: air_sec_getStormEnable
+ * PURPOSE:
+ *      Get per port status of storm control for specific type.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Select port number
+ *      type            --  AIR_STORM_TYPE_BCST
+ *                          AIR_STORM_TYPE_MCST
+ *                          AIR_STORM_TYPE_UCST
+ * OUTPUT:
+ *      ptr_storm_en    --  TRUE
+ *                          FALSE
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_sec_getStormEnable(
+    const UI32_T unit,
+    const UI32_T port,
+    const AIR_STORM_TYPE_T type,
+    BOOL_T *ptr_storm_en);
+
+/* FUNCTION NAME: air_sec_setStormRate
+ * PURPOSE:
+ *      Set per port storm rate limit control for specific type.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Select port number
+ *      type            --  AIR_STORM_TYPE_BCST
+ *                          AIR_STORM_TYPE_MCST
+ *                          AIR_STORM_TYPE_UCST
+ *      count           --  Count of the unit
+ *                          Range 0..255
+ *                          Rate = (count * unit) bps
+ *      unit            --  AIR_STORM_UNIT_64K
+ *                          AIR_STORM_UNIT_256K
+ *                          AIR_STORM_UNIT_1M
+ *                          AIR_STORM_UNIT_4M
+ *                          AIR_STORM_UNIT_16M
+ *                          AIR_STORM_UNIT_32M
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_sec_setStormRate(
+    const UI32_T unit,
+    const UI32_T port,
+    const AIR_STORM_TYPE_T type,
+    const UI32_T count,
+    const AIR_STORM_UNIT_T storm_unit);
+
+/* FUNCTION NAME: air_sec_getStormRate
+ * PURPOSE:
+ *      Get per port storm rate limit control for specific type.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Select port number
+ *      type            --  AIR_STORM_TYPE_BCST
+ *                          AIR_STORM_TYPE_MCST
+ *                          AIR_STORM_TYPE_UCST
+ * OUTPUT:
+ *      ptr_count       --  Count of the unit
+ *                          Range 0..255
+ *                          Rate = (count * unit) bps
+ *      ptr_unit        --  AIR_STORM_UNIT_64K
+ *                          AIR_STORM_UNIT_256K
+ *                          AIR_STORM_UNIT_1M
+ *                          AIR_STORM_UNIT_4M
+ *                          AIR_STORM_UNIT_16M
+ *                          AIR_STORM_UNIT_32M
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_sec_getStormRate(
+    const UI32_T unit,
+    const UI32_T port,
+    const AIR_STORM_TYPE_T type,
+    UI32_T *ptr_count,
+    AIR_STORM_UNIT_T *ptr_unit);
+
+/* FUNCTION NAME: air_sec_setFldMode
+ * PURPOSE:
+ *      Set per port flooding status for unknown type frame.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Select port to setting
+ *      type            --  AIR_FLOOD_TYPE_BCST
+ *                          AIR_FLOOD_TYPE_MCST
+ *                          AIR_FLOOD_TYPE_UCST
+ *                          AIR_FLOOD_TYPE_QURY
+ *      fld_en          --  TRUE : flooding specific type frame for specific port
+ *                          FALSE: drop specific type frame for specific port
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_sec_setFldMode(
+    const UI32_T unit,
+    const UI32_T port,
+    const AIR_FLOOD_TYPE_T type,
+    const BOOL_T fld_en);
+
+/* FUNCTION NAME: air_sec_getFldMode
+ * PURPOSE:
+ *      Get per port flooding status for unknown type frame.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Select port to setting
+ *      type            --  AIR_FLOOD_TYPE_BCST
+ *                          AIR_FLOOD_TYPE_MCST
+ *                          AIR_FLOOD_TYPE_UCST
+ *                          AIR_FLOOD_TYPE_QURY
+ * OUTPUT:
+ *      ptr_fld_en      --  TRUE : flooding specific type frame for specific port
+ *                          FALSE: drop specific type frame for specific port
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_sec_getFldMode(
+    const UI32_T unit,
+    const UI32_T port,
+    const AIR_FLOOD_TYPE_T type,
+    BOOL_T *ptr_fld_en);
+
+/* FUNCTION NAME: air_sec_setPortSecPortCfg
+ * PURPOSE:
+ *      Set port security configurations for specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Port ID
+ *      port_config     --  Structure of port configuration.
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_sec_setPortSecPortCfg(
+    const UI32_T unit,
+    const UI32_T port,
+    const AIR_SEC_PORTSEC_PORT_CONFIG_T port_config);
+
+/* FUNCTION NAME: air_sec_getPortSecPortCfg
+ * PURPOSE:
+ *      Get port security configurations for specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Port ID
+ *
+ * OUTPUT:
+ *      ptr_port_config --  Structure of port configuration.
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_sec_getPortSecPortCfg(
+    const UI32_T unit,
+    const UI32_T port,
+    AIR_SEC_PORTSEC_PORT_CONFIG_T *ptr_port_config);
+
+#endif /* End of AIR_SEC_H */
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_sptag.h b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_sptag.h
new file mode 100644
index 0000000..99d2028
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_sptag.h
@@ -0,0 +1,277 @@
+/* FILE NAME: air_sptag.h
+ * PURPOSE:
+ *      Define the Special Tag function in AIR SDK.
+ *
+ * NOTES:
+ *      None
+ */
+
+#ifndef AIR_SPTAG_H
+#define AIR_SPTAG_H
+
+/* INCLUDE FILE DECLARATIONS
+*/
+
+/* NAMING CONSTANT DECLARATIONS
+*/
+
+#define AIR_STAG_BUF_LEN                (4)
+#define AIR_STAG_ALIGN_BIT_WIDTH        (8)
+#define AIR_STAG_REPLACE_MODE_MAX_DP    (10)
+
+/* cpu tx stag offset */
+#define AIR_STAG_TX_OPC_BIT_OFFSET      (5)
+#define AIR_STAG_TX_OPC_BIT_WIDTH       (3)
+#define AIR_STAG_TX_VPM_BIT_OFFSET      (0)
+#define AIR_STAG_TX_VPM_BIT_WIDTH       (2)
+#define AIR_STAG_TX_PCP_BIT_OFFSET      (5)
+#define AIR_STAG_TX_PCP_BIT_WIDTH       (3)
+#define AIR_STAG_TX_DEI_BIT_OFFSET      (4)
+#define AIR_STAG_TX_DEI_BIT_WIDTH       (1)
+
+/* cpu rx stag offset */
+#define AIR_STAG_RX_RSN_BIT_OFFSET      (2)
+#define AIR_STAG_RX_RSN_BIT_WIDTH       (3)
+#define AIR_STAG_RX_VPM_BIT_OFFSET      (0)
+#define AIR_STAG_RX_VPM_BIT_WIDTH       (2)
+#define AIR_STAG_RX_SP_BIT_OFFSET       (0)
+#define AIR_STAG_RX_SP_BIT_WIDTH        (5)
+#define AIR_STAG_RX_PCP_BIT_OFFSET      (5)
+#define AIR_STAG_RX_PCP_BIT_WIDTH       (3)
+#define AIR_STAG_RX_DEI_BIT_OFFSET      (4)
+#define AIR_STAG_RX_DEI_BIT_WIDTH       (1)
+#define AIR_PORT_NUM                    (6)
+
+#define AIR_PORT_FOREACH(bitmap, port)                 \
+            for(port = 0; port < AIR_PORT_NUM; port++) \
+                if(bitmap & BIT(port))
+
+
+/* MACRO FUNCTION DECLARATIONS
+*/
+
+/* DATA TYPE DECLARATIONS
+*/
+typedef enum
+{
+    AIR_STAG_MODE_INSERT,
+    AIR_STAG_MODE_REPLACE,
+    AIR_STAG_MODE_LAST
+} AIR_STAG_MODE_T;
+
+typedef enum
+{
+    /* Egress DP is port map */
+    AIR_STAG_OPC_PORTMAP,
+
+    /* Egress DP is port id */
+    AIR_STAG_OPC_PORTID,
+
+    /* Forward the packet according to lookup result */
+    AIR_STAG_OPC_LOOKUP,
+    AIR_STAG_OPC_LAST
+} AIR_STAG_OPC_T;
+
+typedef enum
+{
+    AIR_STAG_REASON_CODE_NORMAL,
+    AIR_STAG_REASON_CODE_SFLOW,
+    AIR_STAG_REASON_CODE_TTL_ERR,
+    AIR_STAG_REASON_CODE_ACL,
+    AIR_STAG_REASON_CODE_SA_FULL,
+    AIR_STAG_REASON_CODE_PORT_MOVE_ERR,
+    AIR_STAG_REASON_CODE_LAST,
+} AIR_STAG_REASON_CODE_T;
+
+typedef enum
+{
+    AIR_STAG_VPM_UNTAG,
+    AIR_STAG_VPM_TPID_8100,
+    AIR_STAG_VPM_TPID_88A8,
+    AIR_STAG_VPM_TPID_PRE_DEFINED,
+    AIR_STAG_VPM_LAST,
+} AIR_STAG_VPM_T;
+
+typedef struct AIR_STAG_TX_PARA_S
+{
+    /* destination port operation code */
+    AIR_STAG_OPC_T      opc;
+
+    /* tag attribute */
+    AIR_STAG_VPM_T      vpm;
+
+    /* destination port map */
+    UI32_T              pbm;
+
+    /* PRI in vlan tag */
+    UI32_T              pri :3;
+
+    /* CFI in vlan tag */
+    UI32_T              cfi :1;
+
+    /* VID in vlan tag */
+    UI32_T              vid :12;
+} AIR_STAG_TX_PARA_T;
+
+
+typedef struct AIR_SPTAG_RX_PARA_S
+{
+    AIR_STAG_REASON_CODE_T rsn;        /* tag attribute */
+    AIR_STAG_VPM_T         vpm;        /* tag attribute */
+    UI32_T                 spn;        /* source port */
+    UI32_T                 pri;        /* PRI in vlan tag */
+    UI32_T                 cfi;        /* CFI in vlan tag */
+    UI32_T                 vid;        /* VID in vlan tag */
+}AIR_SPTAG_RX_PARA_T;
+
+/* EXPORTED SUBPROGRAM SPECIFICATIONS
+*/
+/* FUNCTION NAME: air_sptag_setState
+ * PURPOSE:
+ *      Set special tag enable/disable for port
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Special tag Port
+ *      sp_en           --  special tag Enable or Disable
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_sptag_setState(
+    const UI32_T unit,
+    const UI32_T port,
+    const BOOL_T sp_en);
+
+/* FUNCTION NAME: air_switch_getCpuPortEn
+ * PURPOSE:
+ *      Get CPU port member
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Special tag Port
+ *
+ * OUTPUT:
+ *      sp_en           --  special tag enable or disable
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_sptag_getState(
+    const UI32_T unit,
+    const UI32_T port,
+    BOOL_T *sp_en);
+
+/* FUNCTION NAME: air_sptag_setMode
+ * PURPOSE:
+ *      Set special tag enable/disable for port
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Special tag Port
+ *      mode            --  insert mode or replace mode
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_sptag_setMode(
+    const UI32_T unit,
+    const UI32_T port,
+    const BOOL_T mode);
+
+/* FUNCTION NAME: air_sptag_getMode
+ * PURPOSE:
+ *      Get CPU port member
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Special tag Port
+ *
+ * OUTPUT:
+ *      mode            --  insert or replace mode
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_sptag_getMode(
+    const UI32_T unit,
+    const UI32_T port,
+    BOOL_T *mode);
+
+/* FUNCTION NAME: air_sptag_encodeTx
+ * PURPOSE:
+ *      Encode tx special tag into buffer.
+ * INPUT:
+ *      unit            --  Device ID
+ *      ptr_sptag_tx    --  Special tag parameters
+ *      ptr_buf         --  Buffer address
+ *      ptr_len         --  Buffer length
+ * OUTPUT:
+ *      ptr_len         --  Written buffer length
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_sptag_encodeTx(
+    const UI32_T unit,
+    const AIR_STAG_MODE_T mode,
+    AIR_STAG_TX_PARA_T *ptr_sptag_tx,
+    UI8_T *ptr_buf,
+    UI32_T *ptr_len);
+
+/* FUNCTION NAME: air_sptag_decodeRx
+ * PURPOSE:
+ *      Decode rx special tag from buffer.
+ * INPUT:
+ *      unit            --  Device ID
+ *      ptr_buf         --  Buffer address
+ *      len             --  Buffer length
+ * OUTPUT:
+ *      ptr_sptag_rx    --  Special tag parameters
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_sptag_decodeRx(
+    const UI32_T unit,
+    const UI8_T *ptr_buf,
+    const UI32_T len,
+    AIR_SPTAG_RX_PARA_T *ptr_sptag_rx);
+
+#endif  /* AIR_SPTAG_H */
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_stp.h b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_stp.h
new file mode 100644
index 0000000..2497392
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_stp.h
@@ -0,0 +1,101 @@
+/* FILE NAME: air_stp.h
+ * PURPOSE:
+ *      Define the STP function in AIR SDK.
+ *
+ * NOTES:
+ *      None
+ */
+
+#ifndef AIR_STP_H
+#define AIR_STP_H
+
+/* INCLUDE FILE DECLARATIONS
+*/
+
+/* NAMING CONSTANT DECLARATIONS
+*/
+
+/* Definition of STP state
+ * 2'b00: Disable(STP)    / Discard(RSTP)
+ * 2'b01: Listening(STP)  / Discard(RSTP)
+ * 2'b10: Learning(STP)   / Learning(RSTP)
+ * 2'b11: Forwarding(STP) / Forwarding(RSTP)
+ * */
+typedef enum
+{
+    AIR_STP_STATE_DISABLE,
+    AIR_STP_STATE_LISTEN,
+    AIR_STP_STATE_LEARN,
+    AIR_STP_STATE_FORWARD,
+    AIR_STP_STATE_LAST
+}AIR_STP_STATE_T;
+
+#define AIR_STP_FID_NUMBER    (16)
+
+/* MACRO FUNCTION DECLARATIONS
+*/
+
+/* DATA TYPE DECLARATIONS
+*/
+
+/* EXPORTED SUBPROGRAM SPECIFICATIONS
+*/
+/* FUNCTION NAME: air_stp_setPortstate
+ * PURPOSE:
+ *      Set the STP port state for a specifiec port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      fid             --  Filter ID for MSTP
+ *      state           --  AIR_STP_STATE_DISABLE
+ *                          AIR_STP_STATE_LISTEN
+ *                          AIR_STP_STATE_LEARN
+ *                          AIR_STP_STATE_FORWARD
+ * OUTPUT:
+ *        None
+ *
+ * RETURN:
+ *        AIR_E_OK
+ *        AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_stp_setPortstate(
+    const UI32_T unit,
+    const UI8_T port,
+    const UI8_T fid,
+    const AIR_STP_STATE_T state);
+
+/* FUNCTION NAME: air_stp_getPortstate
+ * PURPOSE:
+ *      Get the STP port state for a specifiec port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      fid             --  Filter ID for MSTP
+ *
+ * OUTPUT:
+ *      ptr_state       --  AIR_STP_STATE_DISABLE
+ *                          AIR_STP_STATE_LISTEN
+ *                          AIR_STP_STATE_LEARN
+ *                          AIR_STP_STATE_FORWARD
+ * RETURN:
+ *        AIR_E_OK
+ *        AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+
+AIR_ERROR_NO_T
+air_stp_getPortstate(
+    const UI32_T unit,
+    const UI32_T port,
+    const UI32_T fid,
+    AIR_STP_STATE_T *ptr_state);
+
+#endif /* End of AIR_STP_H */
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_switch.h b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_switch.h
new file mode 100644
index 0000000..0c10cc4
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_switch.h
@@ -0,0 +1,250 @@
+/* FILE NAME: air_switch.h
+ * PURPOSE:
+ *      Define the switch function in AIR SDK.
+ *
+ * NOTES:
+ *      None
+ */
+
+#ifndef AIR_SWITCH_H
+#define AIR_SWITCH_H
+
+/* INCLUDE FILE DECLARATIONS
+*/
+
+/* NAMING CONSTANT DECLARATIONS
+*/
+
+/* MACRO FUNCTION DECLARATIONS
+*/
+#define SYS_INT_EN                 0x1021C010
+#define SYS_INT_STS                0x1021C014
+
+/* DATA TYPE DECLARATIONS
+*/
+typedef enum
+{
+    AIR_SYS_INTR_TYPE_PHY0_LC = 0,
+    AIR_SYS_INTR_TYPE_PHY1_LC,
+    AIR_SYS_INTR_TYPE_PHY2_LC,
+    AIR_SYS_INTR_TYPE_PHY3_LC,
+    AIR_SYS_INTR_TYPE_PHY4_LC,
+    AIR_SYS_INTR_TYPE_PHY5_LC,
+    AIR_SYS_INTR_TYPE_PHY6_LC,
+    AIR_SYS_INTR_TYPE_PHY7_LC,
+    AIR_SYS_INTR_TYPE_MAC_PC = 16,
+    AIR_SYS_INTR_TYPE_LAST
+}AIR_SYS_INTR_TYPE_T;
+
+/* EXPORTED SUBPROGRAM SPECIFICATIONS
+*/
+
+/* FUNCTION NAME: air_switch_setCpuPort
+ * PURPOSE:
+ *      Set CPU port member
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  CPU port index
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_switch_setCpuPort(
+    const UI32_T unit,
+    const UI32_T portmap);
+
+/* FUNCTION NAME: air_switch_getCpuPort
+ * PURPOSE:
+ *      Get CPU port member
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      ptr_port        --  CPU port index
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_switch_getCpuPort(
+    const UI32_T unit,
+    UI32_T *ptr_portmap);
+
+/* FUNCTION NAME: air_switch_setCpuPortEN
+ * PURPOSE:
+ *      Set CPU port Enable
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      cpu_en          --  CPU Port Enable
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_switch_setCpuPortEn(
+    const UI32_T unit,
+    const BOOL_T cpu_en);
+
+/* FUNCTION NAME: air_switch_getCpuPortEn
+ * PURPOSE:
+ *      Get CPU port member
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      cpu_en          --  CPU Port enable
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_switch_getCpuPortEn(
+    const UI32_T unit,
+    BOOL_T *cpu_en);
+
+/* FUNCTION NAME: air_switch_setSysIntrEn
+ * PURPOSE:
+ *      Set system interrupt enable
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      intr            --  system interrupt type
+ *      enable          --  system interrupt enable/disable
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_switch_setSysIntrEn(
+    const UI32_T unit,
+    const AIR_SYS_INTR_TYPE_T intr,
+    const BOOL_T enable);
+
+/* FUNCTION NAME: air_switch_getSysIntrEn
+ * PURPOSE:
+ *      Get system interrupt enable
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      intr            --  system interrupt type
+ *
+ * OUTPUT:
+ *      ptr_enable      --  system interrupt enable/disable
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_switch_getSysIntrEn(
+    const UI32_T unit,
+    const AIR_SYS_INTR_TYPE_T intr,
+    BOOL_T *ptr_enable);
+
+/* FUNCTION NAME: air_switch_setSysIntrStatus
+ * PURPOSE:
+ *      Set system interrupt status
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      intr            --  system interrupt type
+ *      enable          --  write TRUE to clear interrupt status
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_switch_setSysIntrStatus(
+    const UI32_T unit,
+    const AIR_SYS_INTR_TYPE_T intr,
+    const BOOL_T enable);
+
+/* FUNCTION NAME: air_switch_getSysIntrStatus
+ * PURPOSE:
+ *      Get system interrupt status
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      intr            --  system interrupt type
+ *
+ * OUTPUT:
+ *      ptr_enable      --  system interrupt status
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_switch_getSysIntrStatus(
+    const UI32_T unit,
+    const AIR_SYS_INTR_TYPE_T intr,
+    BOOL_T *ptr_enable);
+
+/* FUNCTION NAME: air_switch_reset
+ * PURPOSE:
+ *      Reset whole system
+ *
+ * INPUT:
+ *      None
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_switch_reset(
+    const UI32_T unit);
+
+#endif /* End of AIR_SWITCH_H */
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_types.h b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_types.h
new file mode 100644
index 0000000..3bae3bd
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_types.h
@@ -0,0 +1,56 @@
+/* FILE NAME:   air_types.h
+ * PURPOSE:
+ *      Define the commom data type in AIR SDK.
+ * NOTES:
+ */
+
+#ifndef AIR_TYPES_H
+#define AIR_TYPES_H
+
+/* INCLUDE FILE DECLARATIONS
+ */
+
+/* NAMING CONSTANT DECLARATIONS
+ */
+#ifndef FALSE
+#define FALSE               0
+#endif
+
+#ifndef TRUE
+#define TRUE                1
+#endif
+
+#ifndef NULL
+#define NULL                (void *)0
+#endif
+
+#ifndef LOW
+#define LOW                 0
+#endif
+
+#ifndef HIGH
+#define HIGH                1
+#endif
+
+/* MACRO FUNCTION DECLARATIONS
+ */
+
+/* DATA TYPE DECLARATIONS
+ */
+typedef int                 BOOL_T;
+typedef signed char         I8_T;
+typedef unsigned char       UI8_T;
+typedef signed short        I16_T;
+typedef unsigned short      UI16_T;
+typedef signed int          I32_T;
+typedef unsigned int        UI32_T;
+typedef char                C8_T;
+typedef unsigned long long  UI64_T;
+
+typedef UI8_T   AIR_MAC_T[6];
+
+/* EXPORTED SUBPROGRAM SPECIFICATIONS
+ */
+
+#endif  /* AIR_TYPES_H */
+
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_ver.h b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_ver.h
new file mode 100644
index 0000000..0681b6c
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_ver.h
@@ -0,0 +1,29 @@
+/* FILE NAME: air_ver.h

+ * PURPOSE:

+ *      Define the version for AIR SDK.

+ *

+ * NOTES:

+ *      None

+ */

+

+#ifndef AIR_VER_H

+#define AIR_VER_H

+

+/* INCLUDE FILE DECLARATIONS

+ */

+

+/* NAMING CONSTANT DECLARATIONS

+ */

+#define AIR_VER_SDK    "v1.0.1"

+

+/* MACRO FUNCTION DECLARATIONS

+ */

+

+/* DATA TYPE DECLARATIONS

+ */

+

+/* EXPORTED SUBPROGRAM SPECIFICATIONS

+ */

+

+#endif  /* AIR_VER_H */

+

diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_vlan.h b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_vlan.h
new file mode 100644
index 0000000..1ae6237
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/inc/air_vlan.h
@@ -0,0 +1,977 @@
+/* FILE NAME:   air_vlan.h

+ * PURPOSE:

+ *      Define the vlan functions in AIR SDK.

+ * NOTES:

+ */

+

+#ifndef AIR_VLAN_H

+#define AIR_VLAN_H

+

+/* INCLUDE FILE DECLARATIONS

+ */

+

+/* NAMING CONSTANT DECLARATIONS

+ */

+#define AIR_VLAN_ID_MIN                             0

+#define AIR_VLAN_ID_MAX                             4095

+#define AIR_DEFAULT_VLAN_ID                         1

+

+#define AIR_FILTER_ID_MAX                           7

+

+/* MACRO FUNCTION DECLARATIONS

+ */

+

+/* DATA TYPE DECLARATIONS

+ */

+typedef enum

+{

+    AIR_VLAN_PORT_EGS_TAG_CTL_TYPE_UNTAGGED = 0,

+    AIR_VLAN_PORT_EGS_TAG_CTL_TYPE_TAGGED = 2,

+    AIR_VLAN_PORT_EGS_TAG_CTL_TYPE_LAST,

+} AIR_VLAN_PORT_EGS_TAG_CTL_TYPE_T;

+

+typedef enum

+{

+    AIR_PORT_EGS_TAG_ATTR_UNTAGGED = 0,

+    AIR_PORT_EGS_TAG_ATTR_SWAP,

+    AIR_PORT_EGS_TAG_ATTR_TAGGED,

+    AIR_PORT_EGS_TAG_ATTR_STACK,

+    AIR_PORT_EGS_TAG_ATTR_LAST

+} AIR_PORT_EGS_TAG_ATTR_T;

+

+typedef enum

+{

+    AIR_VLAN_ACCEPT_FRAME_TYPE_ALL = 0,            /* untagged, priority-tagged and tagged  */

+    AIR_VLAN_ACCEPT_FRAME_TYPE_TAG_ONLY,           /* tagged                                */

+    AIR_VLAN_ACCEPT_FRAME_TYPE_UNTAG_ONLY,         /* untagged and priority-tagged          */

+    AIR_VLAN_ACCEPT_FRAME_TYPE_RESERVED,           /* reserved                              */

+    AIR_VLAN_ACCEPT_FRAME_TYPE_LAST

+} AIR_VLAN_ACCEPT_FRAME_TYPE_T;

+

+typedef enum

+{

+    AIR_LEAKY_PKT_TYPE_UNICAST = 0,                /* unicast pkt      */

+    AIR_LEAKY_PKT_TYPE_MULTICAST,                  /* multicast pkt    */

+    AIR_LEAKY_PKT_TYPE_BROADCAST,                  /* broadcast pkt    */

+    AIR_LEAKY_PKT_TYPE_LAST

+} AIR_LEAKY_PKT_TYPE_T;

+

+typedef enum

+{

+    AIR_VLAN_PORT_ATTR_USER_PORT = 0,              /* user port        */

+    AIR_VLAN_PORT_ATTR_STACK_PORT,                 /* stack port       */

+    AIR_VLAN_PORT_ATTR_TRANSLATION_PORT,           /* translation port */

+    AIR_VLAN_PORT_ATTR_TRANSPARENT_PORT,           /* transparent port */

+    AIR_VLAN_PORT_ATTR_LAST

+} AIR_VLAN_PORT_ATTR_T;

+

+typedef enum

+{

+    AIR_IGR_PORT_EG_TAG_ATTR_DISABLE = 0,

+    AIR_IGR_PORT_EG_TAG_ATTR_CONSISTENT,

+    AIR_IGR_PORT_EG_TAG_ATTR_UNTAGGED = 4,

+    AIR_IGR_PORT_EG_TAG_ATTR_SWAP,

+    AIR_IGR_PORT_EG_TAG_ATTR_TAGGED,

+    AIR_IGR_PORT_EG_TAG_ATTR_STACK,

+    AIR_IGR_PORT_EG_TAG_ATTR_LAST

+} AIR_IGR_PORT_EG_TAG_ATTR_T;

+

+typedef union AIR_VLAN_ENTRY_S

+{

+    UI8_T valid : 1;

+    struct

+    {

+        UI32_T  vlan_table0;

+        UI32_T  vlan_table1;

+    } vlan_table;

+    struct

+    {

+        UI64_T   valid             : 1;

+        UI64_T   fid               : 4;

+        UI64_T   ivl               : 1;

+        UI64_T   copy_pri          : 1;

+        UI64_T   user_pri          : 3;

+        UI64_T   eg_ctrl_en        : 1;

+        UI64_T   eg_con            : 1;

+        UI64_T   eg_ctrl           : 14;

+        UI64_T   port_mem          : 7;

+        UI64_T   port_stag         : 1;

+        UI64_T   stag              : 12;

+        UI64_T   unm_vlan_drop     : 1;

+    } vlan_entry_format;

+} AIR_VLAN_ENTRY_T;

+

+typedef union AIR_VLAN_ENTRY_ATTR_S

+{

+    UI8_T valid : 1;

+    struct

+    {

+        UI32_T  vlan_table0;

+        UI32_T  vlan_table1;

+        UI32_T  vlan_table2;

+        UI32_T  vlan_table3;

+        UI32_T  vlan_table4;

+    } vlan_table;

+    struct

+    {

+        UI64_T   valid             : 1;

+        UI64_T   fid               : 4;

+        UI64_T   ivl               : 1;

+        UI64_T   copy_pri          : 1;

+        UI64_T   user_pri          : 3;

+        UI64_T   eg_ctrl_en        : 1;

+        UI64_T   eg_con            : 1;

+        UI64_T   eg_ctrl           : 14;

+        UI64_T   port_mem          : 7;

+        UI64_T   port_stag         : 1;

+        UI64_T   stag              : 12;

+        UI64_T   unm_vlan_drop     : 1;

+    } vlan_entry_format;

+#if 0

+    struct

+    {

+        UI64_T   valid             : 1;

+        UI64_T   type              : 3;

+        UI64_T   mac_addr          : 48;

+        UI64_T   mac_mask_len      : 6;

+        UI64_T   priority          : 3;

+        UI64_T   :0;

+        UI64_T   vid               : 12;

+    } mac_based_vlan_entry_format;

+    struct

+    {

+        UI64_T   valid             : 1;

+        UI64_T   type              : 3;

+        UI64_T   check_field       : 36;

+        UI64_T   :0;

+        UI64_T   check_field_mask  : 36;

+        UI64_T   untagged_packet   : 1;

+        UI64_T   vlan_priority     : 3;

+        UI64_T   svid              : 12;

+    } qinq_based_vlan_entry_format;

+    struct

+    {

+        UI64_T   valid             : 1;

+        UI64_T   type              : 3;

+        UI64_T   ipv4              : 32;

+        UI64_T   :0;

+        UI64_T   subnetmask        : 32;

+        UI64_T   priority          : 3;

+        UI64_T   cvid              : 12;

+    } ipv4_based_vlan_entry_format;

+    struct

+    {

+        UI64_T   valid             : 1;

+        UI64_T   :0;

+        UI64_T   ipv6_high         : 64;

+        UI64_T   ipv6_low          : 64;

+        UI64_T   subnetmask        : 8;

+        UI64_T   priority          : 3;

+        UI64_T   cvid              : 12;

+    } ipv6_based_vlan_entry_format;

+#endif

+} AIR_VLAN_ENTRY_ATTR_T;

+

+void

+_air_vlan_readEntry(

+    const UI32_T unit,

+    const UI16_T vid,

+    AIR_VLAN_ENTRY_T* vlan_entry);

+

+void

+_air_vlan_writeEntry(

+    const UI32_T unit,

+    const UI16_T vid,

+    AIR_VLAN_ENTRY_T* vlan_entry);

+

+void

+_air_untagged_vlan_readEntry(

+    const UI32_T unit,

+    const UI16_T vid,

+    AIR_VLAN_ENTRY_ATTR_T* vlan_entry);

+

+void

+_air_untagged_vlan_writeEntry(

+    const UI32_T unit,

+    const UI16_T vid,

+    AIR_VLAN_ENTRY_ATTR_T* vlan_entry);

+

+/* EXPORTED SUBPROGRAM SPECIFICATIONS

+ */

+/* FUNCTION NAME:   air_vlan_create

+ * PURPOSE:

+ *      Create the vlan in the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ *      p_attr      -- vlan attr

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Vlan creation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_create(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    AIR_VLAN_ENTRY_ATTR_T *p_attr);

+

+/* FUNCTION NAME:   air_vlan_destroy

+ * PURPOSE:

+ *      Destroy the vlan in the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK     -- Successfully read the data.

+ *      AIR_E_OTHERS -- Vlan destroy failed.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_destroy(

+    const UI32_T    unit,

+    const UI16_T    vid);

+

+/* FUNCTION NAME:   air_vlan_destroyAll

+ * PURPOSE:

+ *      Destroy the vlan in the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK     -- Successfully read the data.

+ *      AIR_E_OTHERS -- Vlan destroy failed.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_destroyAll(

+    const UI32_T    unit,

+    const UI32_T    keep_and_restore_default_vlan);

+

+/* FUNCTION NAME:   air_vlan_reset

+ * PURPOSE:

+ *      Destroy the vlan in the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK     -- Successfully reset the data.

+ *      AIR_E_OTHERS -- Vlan reset failed.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_reset(

+    const UI32_T    unit,

+    const UI16_T    vid);

+

+/* FUNCTION NAME:   air_vlan_setFid

+ * PURPOSE:

+ *      Set the filter id of the vlan to the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ *      fid         -- filter id

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setFid(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    const UI8_T     fid);

+

+/* FUNCTION NAME:   air_vlan_getFid

+ * PURPOSE:

+ *      Get the filter id of the vlan from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id to be created

+ * OUTPUT:

+ *      p_fid       -- filter id

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getFid(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    UI8_T           *p_fid);

+

+/* FUNCTION NAME:   air_vlan_addMemberPort

+ * PURPOSE:

+ *      Add one vlan member to the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ *      port        -- port id

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_addMemberPort(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    const UI32_T    port);

+

+/* FUNCTION NAME:   air_vlan_delMemberPort

+ * PURPOSE:

+ *      Delete one vlan member from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ *      port        -- port id

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_delMemberPort(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    const UI32_T    port);

+

+/* FUNCTION NAME:   air_vlan_setMemberPort

+ * PURPOSE:

+ *      Replace the vlan members in the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ *      port_bitmap -- member port bitmap

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setMemberPort(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    const UI32_T    port_bitmap);

+

+/* FUNCTION NAME:   air_vlan_getMemberPort

+ * PURPOSE:

+ *      Get the vlan members from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ * OUTPUT:

+ *      port_bitmap -- member port bitmap

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getMemberPort(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    UI32_T          *p_port_bitmap);

+

+/* FUNCTION NAME:   air_vlan_setIVL

+ * PURPOSE:

+ *      Set L2 lookup mode IVL/SVL for L2 traffic.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ *      enable      -- enable IVL

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setIVL(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    const BOOL_T    enable);

+

+/* FUNCTION NAME:   air_vlan_getIVL

+ * PURPOSE:

+ *      Get L2 lookup mode IVL/SVL for L2 traffic.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ * OUTPUT:

+ *      p_enable    -- enable IVL

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getIVL(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    BOOL_T          *p_enable);

+

+/* FUNCTION NAME:   air_vlan_setPortAcceptFrameType

+ * PURPOSE:

+ *      Set vlan accept frame type of the port from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ *      type        -- accept frame type

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setPortAcceptFrameType(

+    const UI32_T    unit,

+    const UI32_T    port,

+    const AIR_VLAN_ACCEPT_FRAME_TYPE_T type);

+

+/* FUNCTION NAME:   air_vlan_getPortAcceptFrameType

+ * PURPOSE:

+ *      Get vlan accept frame type of the port from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ * OUTPUT:

+ *      p_type      -- accept frame type

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getPortAcceptFrameType(

+    const UI32_T    unit,

+    const UI32_T    port,

+    AIR_VLAN_ACCEPT_FRAME_TYPE_T *p_type);

+

+/* FUNCTION NAME:   air_vlan_setPortLeakyVlanEnable

+ * PURPOSE:

+ *      Set leaky vlan enable of the port from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ *      pkt_type    -- packet type

+ *      enable      -- enable leaky

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setPortLeakyVlanEnable(

+    const UI32_T    unit,

+    const UI32_T    port,

+    AIR_LEAKY_PKT_TYPE_T   pkt_type,

+    const BOOL_T    enable);

+

+/* FUNCTION NAME:   air_vlan_getPortLeakyVlanEnable

+ * PURPOSE:

+ *      Get leaky vlan enable of the port from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ *      pkt_type    -- packet type

+ * OUTPUT:

+ *      p_enable    -- enable leaky

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getPortLeakyVlanEnable(

+    const UI32_T    unit,

+    const UI32_T    port,

+    AIR_LEAKY_PKT_TYPE_T   pkt_type,

+    BOOL_T          *p_enable);

+

+/* FUNCTION NAME:   air_vlan_setPortAttr

+ * PURPOSE:

+ *      Set vlan port attribute from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ *      attr        -- vlan port attr

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setPortAttr(

+    const UI32_T    unit,

+    const UI32_T    port,

+    const AIR_VLAN_PORT_ATTR_T attr);

+

+/* FUNCTION NAME:   air_vlan_getPortAttr

+ * PURPOSE:

+ *      Get vlan port attribute from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ * OUTPUT:

+ *      p_attr      -- vlan port attr

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getPortAttr(

+    const UI32_T    unit,

+    const UI32_T    port,

+    AIR_VLAN_PORT_ATTR_T *p_attr);

+

+/* FUNCTION NAME:   air_vlan_setIgrPortTagAttr

+ * PURPOSE:

+ *      Set vlan incoming port egress tag attribute from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ *      attr        -- egress tag attr

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setIgrPortTagAttr(

+    const UI32_T    unit,

+    const UI32_T    port,

+    const AIR_IGR_PORT_EG_TAG_ATTR_T attr);

+

+/* FUNCTION NAME:   air_vlan_getIgrPortTagAttr

+ * PURPOSE:

+ *      Get vlan incoming port egress tag attribute from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ * OUTPUT:

+ *      p_attr      -- egress tag attr

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getIgrPortTagAttr(

+    const UI32_T    unit,

+    const UI32_T    port,

+    AIR_IGR_PORT_EG_TAG_ATTR_T *p_attr);

+

+/* FUNCTION NAME:   air_vlan_setPortEgsTagAttr

+ * PURPOSE:

+ *      Set vlan port egress tag attribute from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ *      attr        -- egress tag attr

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setPortEgsTagAttr(

+    const UI32_T    unit,

+    const UI32_T    port,

+    const AIR_PORT_EGS_TAG_ATTR_T attr);

+

+/* FUNCTION NAME:   air_vlan_getPortEgsTagAttr

+ * PURPOSE:

+ *      Get vlan port egress tag attribute from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ * OUTPUT:

+ *      p_attr      -- egress tag attr

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getPortEgsTagAttr(

+    const UI32_T    unit,

+    const UI32_T    port,

+    AIR_PORT_EGS_TAG_ATTR_T *p_attr);

+

+/* FUNCTION NAME:   air_vlan_setPortOuterTPID

+ * PURPOSE:

+ *      Set stack tag TPID of the port from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ *      tpid        -- TPID

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setPortOuterTPID(

+    const UI32_T    unit,

+    const UI32_T    port,

+    const UI16_T    tpid);

+

+/* FUNCTION NAME:   air_vlan_getPortOuterTPID

+ * PURPOSE:

+ *      Get stack tag TPID of the port from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ * OUTPUT:

+ *      p_tpid        -- TPID

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getPortOuterTPID(

+    const UI32_T    unit,

+    const UI32_T    port,

+    UI16_T          *p_tpid);

+

+/* FUNCTION NAME:   air_vlan_setPortPVID

+ * PURPOSE:

+ *      Set PVID of the port from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ *      pvid        -- native vlan id

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setPortPVID(

+    const UI32_T    unit,

+    const UI32_T    port,

+    const UI16_T    pvid);

+

+/* FUNCTION NAME:   air_vlan_getPortPVID

+ * PURPOSE:

+ *      Get PVID of the port from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ * OUTPUT:

+ *      p_pvid      -- native vlan id

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getPortPVID(

+    const UI32_T    unit,

+    const UI32_T    port,

+    UI16_T          *p_pvid);

+

+/* FUNCTION NAME:   air_vlan_setServiceTag

+ * PURPOSE:

+ *      Set Vlan service tag.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ *      stag        -- service stag

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setServiceTag(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    const UI16_T    stag);

+

+/* FUNCTION NAME:   air_vlan_getServiceTag

+ * PURPOSE:

+ *      Get Vlan service tag.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ * OUTPUT:

+ *      p_stag      -- service stag

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getServiceTag(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    UI16_T          *p_stag);

+

+/* FUNCTION NAME:   air_vlan_setEgsTagCtlEnable

+ * PURPOSE:

+ *      Set per vlan egress tag control.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ *      enable      -- enable vlan egress tag control

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setEgsTagCtlEnable(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    const BOOL_T    enable);

+

+/* FUNCTION NAME:   air_vlan_getEgsTagCtlEnable

+ * PURPOSE:

+ *      Get per vlan egress tag control.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ * OUTPUT:

+ *      p_enable    -- enable vlan egress tag control

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getEgsTagCtlEnable(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    BOOL_T          *p_enable);

+

+/* FUNCTION NAME:   air_vlan_setEgsTagConsistent

+ * PURPOSE:

+ *      Set per vlan egress tag consistent.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ *      enable      -- enable vlan egress tag consistent

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setEgsTagConsistent(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    const BOOL_T    enable);

+

+/* FUNCTION NAME:   air_vlan_getEgsTagConsistent

+ * PURPOSE:

+ *      Get per vlan egress tag consistent.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ * OUTPUT:

+ *      p_enable    -- enable vlan egress tag consistent

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getEgsTagConsistent(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    BOOL_T          *p_enable);

+

+/* FUNCTION NAME:   air_vlan_setPortBasedStag

+ * PURPOSE:

+ *      Set vlan port based stag enable.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ *      enable      -- vlan port based stag enable

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setPortBasedStag(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    const BOOL_T    enable);

+

+/* FUNCTION NAME:   air_vlan_getPortBasedStag

+ * PURPOSE:

+ *      Get vlan port based stag enable.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ * OUTPUT:

+ *      p_enable    -- vlan port based stag enable

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getPortBasedStag(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    BOOL_T          *p_enable);

+

+/* FUNCTION NAME:   air_vlan_setPortEgsTagCtl

+ * PURPOSE:

+ *      Set vlan port egress tag control.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ *      port        -- port id

+ *      tag_ctl     -- egress tag control

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setPortEgsTagCtl(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    const UI32_T    port,

+    const AIR_VLAN_PORT_EGS_TAG_CTL_TYPE_T    tag_ctl);

+

+/* FUNCTION NAME:   air_vlan_getPortEgsTagCtl

+ * PURPOSE:

+ *      Get vlan port egress tag control.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ * OUTPUT:

+ *      p_tag_ctl   -- egress tag control

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getPortEgsTagCtl(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    const UI32_T    port,

+    AIR_VLAN_PORT_EGS_TAG_CTL_TYPE_T   *ptr_tag_ctl);

+

+#endif  /* AIR_VLAN_H */

+

diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_acl.c b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_acl.c
new file mode 100644
index 0000000..9be3e0f
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_acl.c
@@ -0,0 +1,2032 @@
+/* FILE NAME: air_acl.c
+ * PURPOSE:
+ *      Define the ACL function in AIR SDK.
+ *
+ * NOTES:
+ *      None
+ */
+
+/* INCLUDE FILE DECLARATIONS
+*/
+#include "air.h"
+
+/* NAMING CONSTANT DECLARATIONS
+*/
+
+/* MACRO FUNCTION DECLARATIONS
+*/
+#define ACL_DERIVE_TBL_MULTIFIELDS(data_buffer, offset, width, dst)             \
+({                                                                              \
+    UI32_T value = 0;                                                           \
+    _deriveTblMultiFields((data_buffer), (offset), (width), &value);            \
+    dst = value;                                                                \
+})
+
+/* DATA TYPE DECLARATIONS
+*/
+
+/* GLOBAL VARIABLE DECLARATIONS
+*/
+
+/* LOCAL SUBPROGRAM DECLARATIONS
+*/
+
+/* STATIC VARIABLE DECLARATIONS
+*/
+
+/* LOCAL SUBPROGRAM BODIES
+*/
+static AIR_ERROR_NO_T
+_checkDone(
+    const UI32_T unit,
+    const AIR_ACL_CHECK_TYPE_T type)
+{
+    UI32_T check_bit = 0, i = 0, reg = 0, value = 0, offset = 0;
+
+    switch(type)
+    {
+        case AIR_ACL_CHECK_ACL:
+            check_bit = 1;
+            reg = ACL_MEM_CFG;
+            offset = ACL_MEM_CFG_DONE_OFFSET;
+            break;
+        case AIR_ACL_CHECK_UDF:
+            check_bit = 0;
+            reg = ACL_AUTC;
+            offset = ACL_UDF_ACC_OFFSET;
+            break;
+        case AIR_ACL_CHECK_TRTCM:
+            check_bit = 0;
+            reg = ACL_TRTCMA;
+            offset = ACL_TRTCM_BUSY_OFFSET;
+            break;
+        case AIR_ACL_CHECK_METER:
+            check_bit = 0;
+            reg = ACLRMC;
+            offset = ACL_RATE_BUSY_OFFSET;
+            break;
+        default:
+            return AIR_E_BAD_PARAMETER;
+    }
+    for(i=0; i < ACL_MAX_BUSY_TIME; i++)
+    {
+        aml_readReg(unit, reg, &value);
+        if (check_bit == (value >> offset))
+        {
+            break;
+        }
+        AIR_UDELAY(1);
+    }
+    if(i >= ACL_MAX_BUSY_TIME)
+    {
+        return AIR_E_TIMEOUT;
+    }
+    return AIR_E_OK;
+}
+
+static void
+_convertToTCcell(
+    const UI32_T *data0,
+    const UI32_T *data1,
+    UI32_T *arr0,
+    UI32_T *arr1,
+    UI32_T size)
+{
+    UI32_T i = 0;
+
+    for(i = 0; i < size; i++)
+    {
+        arr0[i] = data0[i] | (~data1[i]);
+        arr1[i] = (~data0[i]) | (~data1[i]);
+    }
+}
+
+static void
+_parseFromTCcell(
+    const UI32_T *data0,
+    const UI32_T *data1,
+    UI32_T *arr0,
+    UI32_T *arr1,
+    UI32_T size)
+{
+    UI32_T i = 0;
+
+    for(i = 0; i < size; i++)
+    {
+        arr1[i] = ~(data0[i] & data1[i]);
+        arr0[i] = data0[i] | (~arr1[i]);
+    }
+}
+
+static int
+_fillTblMultiFields(
+    UI32_T          *data_buffer,
+    UI32_T          data_count,
+    const UI32_T    offset,
+    const UI32_T    width,
+    const UI32_T    value)
+{
+    UI32_T data_index = 0, bit_index = 0;
+    UI32_T extended_data[2] = {0};
+    UI32_T extended_mask[2] = {0};
+    UI32_T msk;
+    UI32_T val;
+
+    AIR_CHECK_PTR(data_buffer);
+
+    if((0 == data_count) || (0 == width) || (width > 32) || (offset+width > data_count*32))
+    {
+        return 0;
+    }
+
+    msk = ((1U<<(width-1U))<<1U)-1U;
+    val = value & msk;
+    data_index = offset / 32;
+    bit_index = offset % 32;
+
+    extended_data[0] = val << bit_index;
+    extended_data[1] = (val >> (31U-bit_index))>>1U;
+    extended_mask[0] = msk << bit_index;
+    extended_mask[1] = (msk >> (31U-bit_index))>>1U;
+
+    data_buffer[data_index] = (data_buffer[data_index] & ~extended_mask[0]) | extended_data[0];
+    if ((data_index+1)<data_count)
+    {
+        data_buffer[data_index+1] = (data_buffer[data_index+1] & ~extended_mask[1]) | extended_data[1];
+    }
+
+    return 0;
+}
+
+static int
+_deriveTblMultiFields(
+    UI32_T          *data_buffer,
+    const UI32_T    offset,
+    const UI32_T    width,
+    UI32_T          *ptr_value)
+{
+    UI32_T data_index = 0, bit_index = 0;
+    UI32_T extended_data[2] = {0};
+    UI32_T extended_mask[2] = {0};
+    UI32_T msk = 0;
+
+    AIR_CHECK_PTR(data_buffer);
+    AIR_CHECK_PTR(ptr_value);
+
+    if(width==0 || width>32)
+    {
+        return 0;
+    }
+    msk = ((1U<<(width-1U))<<1U)-1U;
+    data_index = offset / 32;
+    bit_index = offset % 32;
+
+    extended_mask[0] = msk << bit_index;
+    extended_mask[1] = (msk >> (31U-bit_index))>>1U;
+    extended_data[0] = (data_buffer[data_index] & extended_mask[0]) >> bit_index;
+    extended_data[1] = ((data_buffer[data_index+1] & extended_mask[1]) << (31U-bit_index))<<1U;
+
+    *ptr_value = extended_data[0] | extended_data[1];
+    return 0;
+}
+
+static void
+_air_acl_setRuleTable(
+    const AIR_ACL_RULE_TYPE_T type,
+    const BOOL_T iskey,
+    const AIR_ACL_FIELD_T *ptr_field,
+    UI32_T *data)
+{
+    UI32_T n = 0;
+
+    switch(type)
+    {
+        case AIR_ACL_RULE_TYPE_0:
+            if(TRUE == iskey)
+            {
+                _fillTblMultiFields(data, 12, RULE_TYPE0_OFFSET, RULE_TYPE0_WIDTH, 0);
+            }
+            else
+            {
+                _fillTblMultiFields(data, 12, RULE_TYPE0_OFFSET, RULE_TYPE0_WIDTH, 1);
+            }
+            for(n=0; n<6; n++)
+            {
+                _fillTblMultiFields(data, 12, DMAC_OFFSET + DMAC_WIDTH*(5-n), DMAC_WIDTH, ptr_field->dmac[n]);
+            }
+            for(n=0; n<6; n++)
+            {
+                _fillTblMultiFields(data, 12, SMAC_OFFSET + SMAC_WIDTH*(5-n), SMAC_WIDTH, ptr_field->smac[n]);
+            }
+            _fillTblMultiFields(data, 12, STAG_OFFSET, STAG_WIDTH, ptr_field->stag);
+            _fillTblMultiFields(data, 12, CTAG_OFFSET, CTAG_WIDTH, ptr_field->ctag);
+            _fillTblMultiFields(data, 12, ETYPE_OFFSET, ETYPE_WIDTH, ptr_field->etype);
+            _fillTblMultiFields(data, 12, DIP_OFFSET, DIP_WIDTH, ptr_field->dip[0]);
+            _fillTblMultiFields(data, 12, SIP_OFFSET, SIP_WIDTH, ptr_field->sip[0]);
+            _fillTblMultiFields(data, 12, DSCP_OFFSET, DSCP_WIDTH, ptr_field->dscp);
+            _fillTblMultiFields(data, 12, PROTOCOL_OFFSET, PROTOCOL_WIDTH, ptr_field->protocol);
+            _fillTblMultiFields(data, 12, DPORT_OFFSET, DPORT_WIDTH, ptr_field->dport);
+            _fillTblMultiFields(data, 12, SPORT_OFFSET, SPORT_WIDTH, ptr_field->sport);
+            _fillTblMultiFields(data, 12, UDF_OFFSET, UDF_WIDTH, ptr_field->udf);
+            _fillTblMultiFields(data, 12, FIELDMAP_OFFSET, FIELDMAP_WIDTH, ptr_field->fieldmap);
+            _fillTblMultiFields(data, 12, IS_IPV6_OFFSET, IS_IPV6_WIDTH, ptr_field->isipv6);
+            _fillTblMultiFields(data, 12, PORTMAP_OFFSET, PORTMAP_WIDTH, ptr_field->portmap);
+            break;
+         case AIR_ACL_RULE_TYPE_1:
+            _fillTblMultiFields(data, 12, RULE_TYPE1_OFFSET, RULE_TYPE1_WIDTH, 1);
+            for(n=1; n<4; n++)
+            {
+                _fillTblMultiFields(data, 12, DIP_IPV6_OFFSET + DIP_IPV6_WIDTH*(n-1), DIP_IPV6_WIDTH, ptr_field->dip[n]);
+            }
+            for(n=1; n<4; n++)
+            {
+                _fillTblMultiFields(data, 12, SIP_IPV6_OFFSET + SIP_IPV6_WIDTH*(n-1), SIP_IPV6_WIDTH, ptr_field->sip[n]);
+            }
+            _fillTblMultiFields(data, 12, FLOW_LABEL_OFFSET, FLOW_LABEL_WIDTH, ptr_field->flow_label);
+            break;
+        default:
+            return;
+    }
+}
+
+static void
+_air_acl_getRuleTable(
+    const AIR_ACL_RULE_TYPE_T type,
+    UI32_T *data,
+    AIR_ACL_FIELD_T *ptr_field)
+{
+    UI32_T n = 0;
+
+    switch(type)
+    {
+        case AIR_ACL_RULE_TYPE_0:
+            for(n=0; n<6; n++)
+            {
+                ACL_DERIVE_TBL_MULTIFIELDS(data, DMAC_OFFSET + DMAC_WIDTH*(5-n), DMAC_WIDTH, ptr_field->dmac[n]);
+            }
+            for(n=0; n<6; n++)
+            {
+                ACL_DERIVE_TBL_MULTIFIELDS(data, SMAC_OFFSET + SMAC_WIDTH*(5-n), SMAC_WIDTH, ptr_field->smac[n]);
+            }
+            ACL_DERIVE_TBL_MULTIFIELDS(data, STAG_OFFSET, STAG_WIDTH, ptr_field->stag);
+            ACL_DERIVE_TBL_MULTIFIELDS(data, CTAG_OFFSET, CTAG_WIDTH, ptr_field->ctag);
+            ACL_DERIVE_TBL_MULTIFIELDS(data, ETYPE_OFFSET, ETYPE_WIDTH, ptr_field->etype);
+            ACL_DERIVE_TBL_MULTIFIELDS(data, DIP_OFFSET, DIP_WIDTH, ptr_field->dip[0]);
+            ACL_DERIVE_TBL_MULTIFIELDS(data, SIP_OFFSET, SIP_WIDTH, ptr_field->sip[0]);
+            ACL_DERIVE_TBL_MULTIFIELDS(data, DSCP_OFFSET, DSCP_WIDTH, ptr_field->dscp);
+            ACL_DERIVE_TBL_MULTIFIELDS(data, PROTOCOL_OFFSET, PROTOCOL_WIDTH, ptr_field->protocol);
+            ACL_DERIVE_TBL_MULTIFIELDS(data, DPORT_OFFSET, DPORT_WIDTH, ptr_field->dport);
+            ACL_DERIVE_TBL_MULTIFIELDS(data, SPORT_OFFSET, SPORT_WIDTH, ptr_field->sport);
+            ACL_DERIVE_TBL_MULTIFIELDS(data, UDF_OFFSET, UDF_WIDTH, ptr_field->udf);
+            ACL_DERIVE_TBL_MULTIFIELDS(data, FIELDMAP_OFFSET, FIELDMAP_WIDTH, ptr_field->fieldmap);
+            ACL_DERIVE_TBL_MULTIFIELDS(data, IS_IPV6_OFFSET, IS_IPV6_WIDTH, ptr_field->isipv6);
+            ACL_DERIVE_TBL_MULTIFIELDS(data, PORTMAP_OFFSET, PORTMAP_WIDTH, ptr_field->portmap);
+            break;
+         case AIR_ACL_RULE_TYPE_1:
+            for(n=1; n<4; n++)
+            {
+                ACL_DERIVE_TBL_MULTIFIELDS(data, DIP_IPV6_OFFSET + DIP_IPV6_WIDTH*(n-1), DIP_IPV6_WIDTH, ptr_field->dip[n]);
+            }
+            for(n=1; n<4; n++)
+            {
+                ACL_DERIVE_TBL_MULTIFIELDS(data, SIP_IPV6_OFFSET + SIP_IPV6_WIDTH*(n-1), SIP_IPV6_WIDTH, ptr_field->sip[n]);
+            }
+            ACL_DERIVE_TBL_MULTIFIELDS(data, FLOW_LABEL_OFFSET, FLOW_LABEL_WIDTH, ptr_field->flow_label);
+            break;
+        default:
+            return;
+    }
+}
+
+static void
+_air_acl_setActionTable(
+    const AIR_ACL_ACTION_T *ptr_action,
+    UI32_T *data)
+{
+    int i = 0;
+
+    _fillTblMultiFields(data, 4, PORT_FORCE_OFFSET, PORT_FORCE_WIDTH, ptr_action->port_en);
+    _fillTblMultiFields(data, 4, VLAN_PORT_SWAP_OFFSET, VLAN_PORT_SWAP_WIDTH, ptr_action->vlan_port_sel);
+    _fillTblMultiFields(data, 4, DST_PORT_SWAP_OFFSET, DST_PORT_SWAP_WIDTH, ptr_action->dest_port_sel);
+    _fillTblMultiFields(data, 4, PORT_OFFSET, PORT_WIDTH, ptr_action->portmap);
+
+    _fillTblMultiFields(data, 4, ACL_MIB_EN_OFFSET, ACL_MIB_EN_WIDTH, ptr_action->cnt_en);
+    _fillTblMultiFields(data, 4, ACL_MIB_ID_OFFSET, ACL_MIB_ID_WIDTH, ptr_action->cnt_idx);
+
+    _fillTblMultiFields(data, 4, ATTACK_RATE_EN_OFFSET, ATTACK_RATE_EN_WIDTH, ptr_action->attack_en);
+    _fillTblMultiFields(data, 4, ATTACK_RATE_ID_OFFSET, ATTACK_RATE_ID_WIDTH, ptr_action->attack_idx);
+
+    _fillTblMultiFields(data, 4, RATE_EN_OFFSET, RATE_EN_WIDTH, ptr_action->rate_en);
+    _fillTblMultiFields(data, 4, RATE_INDEX_OFFSET, RATE_INDEX_WIDTH, ptr_action->rate_idx);
+
+    _fillTblMultiFields(data, 4, PORT_FW_EN_OFFSET, PORT_FW_EN_WIDTH, ptr_action->fwd_en);
+    _fillTblMultiFields(data, 4, FW_PORT_OFFSET, FW_PORT_WIDTH, ptr_action->fwd);
+
+    _fillTblMultiFields(data, 4, MIRROR_OFFSET, MIRROR_WIDTH, ptr_action->mirrormap);
+
+    _fillTblMultiFields(data, 4, PRI_USER_EN_OFFSET, PRI_USER_EN_WIDTH, ptr_action->pri_user_en);
+    _fillTblMultiFields(data, 4, PRI_USER_OFFSET, PRI_USER_WIDTH, ptr_action->pri_user);
+
+    _fillTblMultiFields(data, 4, EG_TAG_EN_OFFSET, EG_TAG_EN_WIDTH, ptr_action->egtag_en);
+    _fillTblMultiFields(data, 4, EG_TAG_OFFSET, EG_TAG_WIDTH, ptr_action->egtag);
+
+    _fillTblMultiFields(data, 4, LKY_VLAN_EN_OFFSET, LKY_VLAN_EN_WIDTH, ptr_action->lyvlan_en);
+    _fillTblMultiFields(data, 4, LKY_VLAN_OFFSET, LKY_VLAN_WIDTH, ptr_action->lyvlan);
+
+    _fillTblMultiFields(data, 4, BPDU_OFFSET, BPDU_WIDTH, ptr_action->bpdu);
+
+    _fillTblMultiFields(data, 4, ACL_MANG_OFFSET, ACL_MANG_WIDTH, ptr_action->mang);
+
+    _fillTblMultiFields(data, 4, TRTCM_EN_OFFSET, TRTCM_EN_WIDTH, ptr_action->trtcm_en);
+    _fillTblMultiFields(data, 4, DROP_PCD_SEL_OFFSET, DROP_PCD_SEL_WIDTH, ptr_action->trtcm.drop_pcd_sel);
+    _fillTblMultiFields(data, 4, ACL_DROP_PCD_R_OFFSET, ACL_DROP_PCD_R_WIDTH, ptr_action->trtcm.drop_pcd_r);
+    _fillTblMultiFields(data, 4, ACL_DROP_PCD_Y_OFFSET, ACL_DROP_PCD_Y_WIDTH, ptr_action->trtcm.drop_pcd_y);
+    _fillTblMultiFields(data, 4, ACL_DROP_PCD_G_OFFSET, ACL_DROP_PCD_G_WIDTH, ptr_action->trtcm.drop_pcd_g);
+    _fillTblMultiFields(data, 4, CLASS_SLR_SEL_OFFSET, CLASS_SLR_SEL_WIDTH, ptr_action->trtcm.cls_slr_sel);
+    _fillTblMultiFields(data, 4, CLASS_SLR_OFFSET, CLASS_SLR_WIDTH, ptr_action->trtcm.cls_slr);
+    _fillTblMultiFields(data, 4, ACL_TCM_SEL_OFFSET, ACL_TCM_SEL_WIDTH, ptr_action->trtcm.tcm_sel);
+    _fillTblMultiFields(data, 4, ACL_TCM_OFFSET, ACL_TCM_WIDTH, ptr_action->trtcm.usr_tcm);
+    _fillTblMultiFields(data, 4, ACL_CLASS_IDX_OFFSET, ACL_CLASS_IDX_WIDTH, ptr_action->trtcm.tcm_idx);
+
+    _fillTblMultiFields(data, 4, ACL_VLAN_HIT_OFFSET, ACL_VLAN_HIT_WIDTH, ptr_action->vlan_en);
+    _fillTblMultiFields(data, 4, ACL_VLAN_VID_OFFSET, ACL_VLAN_VID_WIDTH, ptr_action->vlan_idx);
+}
+
+static void
+_air_acl_getActionTable(
+    UI32_T *data,
+    AIR_ACL_ACTION_T *ptr_action)
+{
+    ACL_DERIVE_TBL_MULTIFIELDS(data, PORT_FORCE_OFFSET, PORT_FORCE_WIDTH, ptr_action->port_en);
+    ACL_DERIVE_TBL_MULTIFIELDS(data, VLAN_PORT_SWAP_OFFSET, VLAN_PORT_SWAP_WIDTH, ptr_action->vlan_port_sel);
+    ACL_DERIVE_TBL_MULTIFIELDS(data, DST_PORT_SWAP_OFFSET, DST_PORT_SWAP_WIDTH, ptr_action->dest_port_sel);
+    ACL_DERIVE_TBL_MULTIFIELDS(data, PORT_OFFSET, PORT_WIDTH, ptr_action->portmap);
+
+    ACL_DERIVE_TBL_MULTIFIELDS(data, ACL_MIB_EN_OFFSET, ACL_MIB_EN_WIDTH, ptr_action->cnt_en);
+    ACL_DERIVE_TBL_MULTIFIELDS(data, ACL_MIB_ID_OFFSET, ACL_MIB_ID_WIDTH, ptr_action->cnt_idx);
+
+    ACL_DERIVE_TBL_MULTIFIELDS(data, ATTACK_RATE_EN_OFFSET, ATTACK_RATE_EN_WIDTH, ptr_action->attack_en);
+    ACL_DERIVE_TBL_MULTIFIELDS(data, ATTACK_RATE_ID_OFFSET, ATTACK_RATE_ID_WIDTH, ptr_action->attack_idx);
+
+    ACL_DERIVE_TBL_MULTIFIELDS(data, RATE_EN_OFFSET, RATE_EN_WIDTH, ptr_action->rate_en);
+    ACL_DERIVE_TBL_MULTIFIELDS(data, RATE_INDEX_OFFSET, RATE_INDEX_WIDTH, ptr_action->rate_idx);
+
+    ACL_DERIVE_TBL_MULTIFIELDS(data, PORT_FW_EN_OFFSET, PORT_FW_EN_WIDTH, ptr_action->fwd_en);
+    ACL_DERIVE_TBL_MULTIFIELDS(data, FW_PORT_OFFSET, FW_PORT_WIDTH, ptr_action->fwd);
+
+    ACL_DERIVE_TBL_MULTIFIELDS(data, MIRROR_OFFSET, MIRROR_WIDTH, ptr_action->mirrormap);
+
+    ACL_DERIVE_TBL_MULTIFIELDS(data, PRI_USER_EN_OFFSET, PRI_USER_EN_WIDTH, ptr_action->pri_user_en);
+    ACL_DERIVE_TBL_MULTIFIELDS(data, PRI_USER_OFFSET, PRI_USER_WIDTH, ptr_action->pri_user);
+
+    ACL_DERIVE_TBL_MULTIFIELDS(data, EG_TAG_EN_OFFSET, EG_TAG_EN_WIDTH, ptr_action->egtag_en);
+    ACL_DERIVE_TBL_MULTIFIELDS(data, EG_TAG_OFFSET, EG_TAG_WIDTH, ptr_action->egtag);
+
+    ACL_DERIVE_TBL_MULTIFIELDS(data, LKY_VLAN_EN_OFFSET, LKY_VLAN_EN_WIDTH, ptr_action->lyvlan_en);
+    ACL_DERIVE_TBL_MULTIFIELDS(data, LKY_VLAN_OFFSET, LKY_VLAN_WIDTH, ptr_action->lyvlan);
+
+    ACL_DERIVE_TBL_MULTIFIELDS(data, BPDU_OFFSET, BPDU_WIDTH, ptr_action->bpdu);
+
+    ACL_DERIVE_TBL_MULTIFIELDS(data, ACL_MANG_OFFSET, ACL_MANG_WIDTH, ptr_action->mang);
+
+    ACL_DERIVE_TBL_MULTIFIELDS(data, TRTCM_EN_OFFSET, TRTCM_EN_WIDTH, ptr_action->trtcm_en);
+    ACL_DERIVE_TBL_MULTIFIELDS(data, DROP_PCD_SEL_OFFSET, DROP_PCD_SEL_WIDTH, ptr_action->trtcm.drop_pcd_sel);
+    ACL_DERIVE_TBL_MULTIFIELDS(data, ACL_DROP_PCD_R_OFFSET, ACL_DROP_PCD_R_WIDTH, ptr_action->trtcm.drop_pcd_r);
+    ACL_DERIVE_TBL_MULTIFIELDS(data, ACL_DROP_PCD_Y_OFFSET, ACL_DROP_PCD_Y_WIDTH, ptr_action->trtcm.drop_pcd_y);
+    ACL_DERIVE_TBL_MULTIFIELDS(data, ACL_DROP_PCD_G_OFFSET, ACL_DROP_PCD_G_WIDTH, ptr_action->trtcm.drop_pcd_g);
+    ACL_DERIVE_TBL_MULTIFIELDS(data, CLASS_SLR_SEL_OFFSET, CLASS_SLR_SEL_WIDTH, ptr_action->trtcm.cls_slr_sel);
+    ACL_DERIVE_TBL_MULTIFIELDS(data, CLASS_SLR_OFFSET, CLASS_SLR_WIDTH, ptr_action->trtcm.cls_slr);
+    ACL_DERIVE_TBL_MULTIFIELDS(data, ACL_TCM_SEL_OFFSET, ACL_TCM_SEL_WIDTH, ptr_action->trtcm.tcm_sel);
+    ACL_DERIVE_TBL_MULTIFIELDS(data, ACL_TCM_OFFSET, ACL_TCM_WIDTH, ptr_action->trtcm.usr_tcm);
+    ACL_DERIVE_TBL_MULTIFIELDS(data, ACL_CLASS_IDX_OFFSET, ACL_CLASS_IDX_WIDTH, ptr_action->trtcm.tcm_idx);
+
+    ACL_DERIVE_TBL_MULTIFIELDS(data, ACL_VLAN_HIT_OFFSET, ACL_VLAN_HIT_WIDTH, ptr_action->vlan_en);
+    ACL_DERIVE_TBL_MULTIFIELDS(data, ACL_VLAN_VID_OFFSET, ACL_VLAN_VID_WIDTH, ptr_action->vlan_idx);
+
+}
+
+static AIR_ERROR_NO_T
+_air_acl_writeReg(
+    const UI32_T unit,
+    const UI32_T rule_idx,
+    const UI32_T block_num,
+    const AIR_ACL_RULE_TCAM_T type,
+    const AIR_ACL_MEM_SEL_T sel,
+    const AIR_ACL_MEM_FUNC_T func,
+    const UI32_T *data)
+{
+    UI32_T bn = 0, value = 0;
+    AIR_ERROR_NO_T ret = AIR_E_OK;
+
+    for (bn = 0; bn < block_num; bn++)
+    {
+        if(AIR_E_TIMEOUT == _checkDone(unit, AIR_ACL_CHECK_ACL))
+        {
+            return AIR_E_TIMEOUT;
+        }
+        aml_writeReg(unit, ACL_MEM_CFG_WDATA0, data[bn*4]);
+        aml_writeReg(unit, ACL_MEM_CFG_WDATA1, data[bn*4+1]);
+        aml_writeReg(unit, ACL_MEM_CFG_WDATA2, data[bn*4+2]);
+        aml_writeReg(unit, ACL_MEM_CFG_WDATA3, data[bn*4+3]);
+
+        value = (rule_idx << ACL_MEM_CFG_RULE_ID_OFFSET) | (type << ACL_MEM_CFG_TCAM_CELL_OFFSET) |
+            (bn << ACL_MEM_CFG_DATA_BN_OFFSET) | (sel << ACL_MEM_CFG_MEM_SEL_OFFSET) |
+            (func << ACL_MEM_CFG_FUNC_SEL_OFFSET) | ACL_MEM_CFG_EN;
+        if ((ret = aml_writeReg(unit, ACL_MEM_CFG, value)) != AIR_E_OK)
+        {
+            return ret;
+        }
+    }
+    return AIR_E_OK;
+}
+
+static AIR_ERROR_NO_T
+_air_acl_readReg(
+    const UI32_T unit,
+    const UI32_T rule_idx,
+    const UI32_T block_num,
+    const AIR_ACL_RULE_TCAM_T type,
+    const AIR_ACL_MEM_SEL_T sel,
+    const AIR_ACL_MEM_FUNC_T func,
+    UI32_T *data)
+{
+    UI32_T bn = 0, value = 0;
+    AIR_ERROR_NO_T ret = AIR_E_OK;
+
+    for (bn = 0; bn < block_num; bn++)
+    {
+        value = (rule_idx << ACL_MEM_CFG_RULE_ID_OFFSET) | (type << ACL_MEM_CFG_TCAM_CELL_OFFSET) |
+            (bn << ACL_MEM_CFG_DATA_BN_OFFSET) | (sel << ACL_MEM_CFG_MEM_SEL_OFFSET) |
+            (func << ACL_MEM_CFG_FUNC_SEL_OFFSET) | ACL_MEM_CFG_EN;
+        if ((ret = aml_writeReg(unit, ACL_MEM_CFG, value)) != AIR_E_OK)
+        {
+            return ret;
+        }
+        if(AIR_E_TIMEOUT == _checkDone(unit, AIR_ACL_CHECK_ACL))
+        {
+            return AIR_E_TIMEOUT;
+        }
+        aml_readReg(unit, ACL_MEM_CFG_RDATA0, data+bn*4);
+        aml_readReg(unit, ACL_MEM_CFG_RDATA1, data+bn*4+1);
+        aml_readReg(unit, ACL_MEM_CFG_RDATA2, data+bn*4+2);
+        aml_readReg(unit, ACL_MEM_CFG_RDATA3, data+bn*4+3);
+    }
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_acl_setRuleCtrl
+ * PURPOSE:
+ *      Set ACL rule control.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      rule_idx        --  Index of ACL rule entry
+ *      ptr_rule        --  Structure of ACL rule control
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_setRuleCtrl(
+    const UI32_T unit,
+    const UI32_T rule_idx,
+    AIR_ACL_CTRL_T *ptr_ctrl)
+{
+    UI32_T data_en[4] = {0}, data_end[4] = {0}, data_rev[4] = {0};
+
+    if(TRUE == ptr_ctrl->rule_en)
+    {
+        _air_acl_readReg(unit, AIR_ACL_RULE_CONFIG_ENABLE, 1, 0, 0, AIR_ACL_MEM_FUNC_CONFIG_READ, data_en);
+        data_en[rule_idx/32] |= (1 << (rule_idx%32));
+        _air_acl_writeReg(unit, AIR_ACL_RULE_CONFIG_ENABLE, 1, 0, 0, AIR_ACL_MEM_FUNC_CONFIG_WRITE, data_en);
+    }
+    else
+    {
+        _air_acl_readReg(unit, AIR_ACL_RULE_CONFIG_ENABLE, 1, 0, 0, AIR_ACL_MEM_FUNC_CONFIG_READ, data_en);
+        data_en[rule_idx/32] &= ~(1 << (rule_idx%32));
+        _air_acl_writeReg(unit, AIR_ACL_RULE_CONFIG_ENABLE, 1, 0, 0, AIR_ACL_MEM_FUNC_CONFIG_WRITE, data_en);
+    }
+
+    if(TRUE == ptr_ctrl->end)
+    {
+        _air_acl_readReg(unit, AIR_ACL_RULE_CONFIG_END, 1, 0, 0, AIR_ACL_MEM_FUNC_CONFIG_READ, data_end);
+        data_end[rule_idx/32] |= (1 << (rule_idx%32));
+        _air_acl_writeReg(unit, AIR_ACL_RULE_CONFIG_END, 1, 0, 0, AIR_ACL_MEM_FUNC_CONFIG_WRITE, data_end);
+    }
+    else
+    {
+        _air_acl_readReg(unit, AIR_ACL_RULE_CONFIG_END, 1, 0, 0, AIR_ACL_MEM_FUNC_CONFIG_READ, data_end);
+        data_end[rule_idx/32] &= ~(1 << (rule_idx%32));
+        _air_acl_writeReg(unit, AIR_ACL_RULE_CONFIG_END, 1, 0, 0, AIR_ACL_MEM_FUNC_CONFIG_WRITE, data_end);
+
+    }
+
+    if(TRUE == ptr_ctrl->reverse)
+    {
+        _air_acl_readReg(unit, AIR_ACL_RULE_CONFIG_REVERSE, 1, 0, 0, AIR_ACL_MEM_FUNC_CONFIG_READ, data_rev);
+        data_rev[rule_idx/32] |= (1 << (rule_idx%32));
+        _air_acl_writeReg(unit, AIR_ACL_RULE_CONFIG_REVERSE, 1, 0, 0, AIR_ACL_MEM_FUNC_CONFIG_WRITE, data_rev);
+    }
+    else
+    {
+        _air_acl_readReg(unit, AIR_ACL_RULE_CONFIG_REVERSE, 1, 0, 0, AIR_ACL_MEM_FUNC_CONFIG_READ, data_rev);
+        data_rev[rule_idx/32] &= ~(1 << (rule_idx%32));
+        _air_acl_writeReg(unit, AIR_ACL_RULE_CONFIG_REVERSE, 1, 0, 0, AIR_ACL_MEM_FUNC_CONFIG_WRITE, data_rev);
+    }
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_acl_getRuleCtrl
+ * PURPOSE:
+ *      Get ACL rule control.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      rule_idx        --  Index of ACL rule entry
+ *
+ * OUTPUT:
+ *      ptr_ctrl        --  Structure of ACL rule control
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_getRuleCtrl(
+    const UI32_T unit,
+    const UI32_T rule_idx,
+    AIR_ACL_CTRL_T *ptr_ctrl)
+{
+    UI32_T data_en[4] = {0}, data_end[4] = {0}, data_rev[4] = {0};
+
+    _air_acl_readReg(unit, AIR_ACL_RULE_CONFIG_ENABLE, 1, 0, 0, AIR_ACL_MEM_FUNC_CONFIG_READ, data_en);
+    if(data_en[rule_idx/32] & (1 << (rule_idx%32)))
+    {
+        ptr_ctrl->rule_en = TRUE;
+    }
+    else
+    {
+        ptr_ctrl->rule_en = FALSE;
+    }
+
+    _air_acl_readReg(unit, AIR_ACL_RULE_CONFIG_END, 1, 0, 0, AIR_ACL_MEM_FUNC_CONFIG_READ, data_end);
+    if(data_end[rule_idx/32] & (1 << (rule_idx%32)))
+    {
+        ptr_ctrl->end = TRUE;
+    }
+    else
+    {
+        ptr_ctrl->end = FALSE;
+    }
+
+    _air_acl_readReg(unit, AIR_ACL_RULE_CONFIG_REVERSE, 1, 0, 0, AIR_ACL_MEM_FUNC_CONFIG_READ, data_rev);
+    if(data_rev[rule_idx/32] & (1 << (rule_idx%32)))
+    {
+        ptr_ctrl->reverse = TRUE;
+    }
+    else
+    {
+        ptr_ctrl->reverse = FALSE;
+    }
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_acl_setRule
+ * PURPOSE:
+ *      Set ACL rule entry.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      rule_idx        --  Index of ACL rule entry
+ *      rule            --  Structure of ACL rule entry
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_setRule(
+    const UI32_T            unit,
+    const UI32_T            rule_idx,
+    AIR_ACL_RULE_T          *rule)
+{
+    UI32_T  type0_key[12] = {0}, type0_mask[12] = {0};
+    UI32_T  type1_key[12] = {0}, type1_mask[12] = {0};
+    UI32_T  type0_t[12] = {0}, type0_c[12] = {0};
+    UI32_T  type1_t[12] = {0}, type1_c[12] = {0};
+    AIR_ACL_CTRL_T ctrl;
+
+    /* Check parameter */
+    AIR_PARAM_CHK((rule_idx >= ACL_MAX_RULE_NUM), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((rule->key.flow_label > BITS_RANGE(0, FLOW_LABEL_WIDTH)), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((rule->key.fieldmap > BITS_RANGE(0, AIR_ACL_FIELD_TYPE_LAST)), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((TRUE != rule->key.isipv6) && (FALSE != rule->key.isipv6), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((rule->key.portmap & (~AIR_ALL_PORT_BITMAP)), AIR_E_BAD_PARAMETER);
+
+    AIR_PARAM_CHK((TRUE != rule->ctrl.rule_en) && (FALSE != rule->ctrl.rule_en), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((TRUE != rule->ctrl.reverse) && (FALSE != rule->ctrl.reverse), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((TRUE != rule->ctrl.end) && (FALSE != rule->ctrl.end), AIR_E_BAD_PARAMETER);
+
+    memset(type0_key, 0, sizeof(type0_key));
+    memset(type0_mask, 0, sizeof(type0_mask));
+    memset(type1_key, 0, sizeof(type1_key));
+    memset(type1_mask, 0, sizeof(type1_mask));
+
+    memset(type0_t, 0, sizeof(type0_t));
+    memset(type0_c, 0, sizeof(type0_c));
+    memset(type1_t, 0, sizeof(type1_t));
+    memset(type1_c, 0, sizeof(type1_c));
+
+    /* Fill rule type table */
+    _air_acl_setRuleTable(AIR_ACL_RULE_TYPE_0, TRUE, &rule->key, type0_key);
+    _air_acl_setRuleTable(AIR_ACL_RULE_TYPE_0, FALSE, &rule->mask, type0_mask);
+
+    /* Calculate T/C cell */
+    _convertToTCcell(type0_key, type0_mask, type0_t, type0_c, 12);
+
+    /* Set T/C cell to reg */
+    _air_acl_writeReg(unit, rule_idx, 3, AIR_ACL_RULE_T_CELL, AIR_ACL_MEM_SEL_RULE, AIR_ACL_MEM_FUNC_WRITE, type0_t);
+    _air_acl_writeReg(unit, rule_idx, 3, AIR_ACL_RULE_C_CELL, AIR_ACL_MEM_SEL_RULE, AIR_ACL_MEM_FUNC_WRITE, type0_c);
+
+    /* If match ipv6 flow lable or dip/dip, set rule type 1 */
+    if ((1 == rule->key.isipv6) && (rule->key.fieldmap & ((1 << AIR_ACL_DIP) | (1 << AIR_ACL_SIP) | (1 << AIR_ACL_FLOW_LABEL))))
+    {
+         _air_acl_setRuleTable(AIR_ACL_RULE_TYPE_1, TRUE, &rule->key, type1_key);
+         _air_acl_setRuleTable(AIR_ACL_RULE_TYPE_1, FALSE, &rule->mask, type1_mask);
+         _convertToTCcell(type1_key, type1_mask, type1_t, type1_c, 12);
+         _air_acl_writeReg(unit, rule_idx+1, 3, AIR_ACL_RULE_T_CELL, AIR_ACL_MEM_SEL_RULE, AIR_ACL_MEM_FUNC_WRITE, type1_t);
+         _air_acl_writeReg(unit, rule_idx+1, 3, AIR_ACL_RULE_C_CELL, AIR_ACL_MEM_SEL_RULE, AIR_ACL_MEM_FUNC_WRITE, type1_c);
+    }
+
+    /* Config rule enable/end/rev */
+    memcpy(&ctrl, &rule->ctrl, sizeof(AIR_ACL_CTRL_T));
+    if ((1 == rule->key.isipv6) && (rule->key.fieldmap & ((1 << AIR_ACL_DIP) | (1 << AIR_ACL_SIP) | (1 << AIR_ACL_FLOW_LABEL))))
+    {
+        ctrl.end = 0;
+        air_acl_setRuleCtrl(unit, rule_idx, &ctrl);
+        air_acl_setRuleCtrl(unit, rule_idx+1, &rule->ctrl);
+    }
+    else
+    {
+        air_acl_setRuleCtrl(unit, rule_idx, &rule->ctrl);
+    }
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_acl_delRule
+ * PURPOSE:
+ *      Delete an ACL rule entry.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      rule_idx        --  Index of ACL rule entry
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_delRule(
+    const UI32_T unit,
+    const UI32_T rule_idx)
+{
+    UI32_T  type0_t[12]={0}, type0_c[12]={0}, type1_t[12]={0}, type1_c[12]={0};
+    AIR_ACL_CTRL_T ctrl={0};
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK((rule_idx >= ACL_MAX_RULE_NUM), AIR_E_BAD_PARAMETER);
+
+    /* Delete the entry from ACL rule table */
+    _air_acl_writeReg(unit, rule_idx, 3, AIR_ACL_RULE_T_CELL, AIR_ACL_MEM_SEL_RULE, AIR_ACL_MEM_FUNC_WRITE, type0_t);
+    _air_acl_writeReg(unit, rule_idx, 3, AIR_ACL_RULE_C_CELL, AIR_ACL_MEM_SEL_RULE, AIR_ACL_MEM_FUNC_WRITE, type0_c);
+    air_acl_setRuleCtrl(unit, rule_idx, &ctrl);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_acl_clearRule
+ * PURPOSE:
+ *      Clear all ACL rule entries.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_clearRule(
+    const UI32_T   unit)
+{
+    AIR_ERROR_NO_T ret = AIR_E_OK;
+    UI32_T  value = 0;
+    UI32_T  data[4]={0};
+
+    value = (AIR_ACL_MEM_FUNC_CLEAR << ACL_MEM_CFG_FUNC_SEL_OFFSET) | ACL_MEM_CFG_EN;
+    if ((ret = aml_writeReg(unit, ACL_MEM_CFG, value)) != AIR_E_OK)
+    {
+        return ret;
+    }
+
+    _air_acl_writeReg(unit, AIR_ACL_RULE_CONFIG_ENABLE, 1, 0, 0, AIR_ACL_MEM_FUNC_CONFIG_WRITE, data);
+    _air_acl_writeReg(unit, AIR_ACL_RULE_CONFIG_END, 1, 0, 0, AIR_ACL_MEM_FUNC_CONFIG_WRITE, data);
+    _air_acl_writeReg(unit, AIR_ACL_RULE_CONFIG_REVERSE, 1, 0, 0, AIR_ACL_MEM_FUNC_CONFIG_WRITE, data);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_acl_clearAction
+ * PURPOSE:
+ *      Clear all ACL action entries.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_clearAction(
+    const UI32_T   unit)
+{
+    AIR_ERROR_NO_T ret = AIR_E_OK;
+    UI32_T  value = 0;
+    UI32_T  data[4]={0};
+
+    value = (AIR_ACL_MEM_SEL_ACTION << ACL_MEM_CFG_MEM_SEL_OFFSET) | (AIR_ACL_MEM_FUNC_CLEAR << ACL_MEM_CFG_FUNC_SEL_OFFSET) | ACL_MEM_CFG_EN;
+    if ((ret = aml_writeReg(unit, ACL_MEM_CFG, value)) != AIR_E_OK)
+    {
+        return ret;
+    }
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_acl_getRule
+ * PURPOSE:
+ *      Get ACL rule entry.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      rule_idx        --  Index of ACL rule entry
+ *
+ * OUTPUT:
+ *      ptr_rule        --  Structure of ACL rule entry
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_getRule(
+    const UI32_T unit,
+    const UI32_T rule_idx,
+    AIR_ACL_RULE_T *ptr_rule)
+{
+    AIR_ERROR_NO_T ret = AIR_E_OK;
+    UI32_T  bn = 0;
+    UI32_T  value = 0, n = 0, idx = 0;
+    UI32_T  type0_key[12] = {0}, type0_mask[12] = {0};
+    UI32_T  type1_key[12] = {0}, type1_mask[12] = {0};
+    UI32_T  type0_t[12] = {0}, type0_c[12] = {0};
+    UI32_T  type1_t[12] = {0}, type1_c[12] = {0};
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK((rule_idx >= ACL_MAX_RULE_NUM), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_rule);
+
+    _air_acl_readReg(unit, rule_idx, 3, AIR_ACL_RULE_T_CELL, AIR_ACL_MEM_SEL_RULE, AIR_ACL_MEM_FUNC_READ, type0_t);
+    _air_acl_readReg(unit, rule_idx, 3, AIR_ACL_RULE_C_CELL, AIR_ACL_MEM_SEL_RULE, AIR_ACL_MEM_FUNC_READ, type0_c);
+    /* rule type 1 */
+    if(1 == (type0_t[0] & 0x1))
+    {
+        idx = rule_idx-1;
+        AIR_PRINT("This is the part of ipv6 rule, please get rule(%d)\n", idx);
+        return AIR_E_OK;
+    }
+
+    _parseFromTCcell(type0_t, type0_c, type0_key, type0_mask, 12);
+
+    _air_acl_getRuleTable(AIR_ACL_RULE_TYPE_0, type0_key, &ptr_rule->key);
+    _air_acl_getRuleTable(AIR_ACL_RULE_TYPE_0, type0_mask, &ptr_rule->mask);
+
+    if ((TRUE == ptr_rule->key.isipv6) && (ptr_rule->mask.fieldmap & ((1 << AIR_ACL_DIP) | (1 << AIR_ACL_SIP) | (1 << AIR_ACL_FLOW_LABEL))))
+    {
+        _air_acl_readReg(unit, rule_idx+1, 3, AIR_ACL_RULE_T_CELL, AIR_ACL_MEM_SEL_RULE, AIR_ACL_MEM_FUNC_READ, type1_t);
+        _air_acl_readReg(unit, rule_idx+1, 3, AIR_ACL_RULE_C_CELL, AIR_ACL_MEM_SEL_RULE, AIR_ACL_MEM_FUNC_READ, type1_c);
+        _parseFromTCcell(type1_t, type1_c, type1_key, type1_mask, 12);
+
+        _air_acl_getRuleTable(AIR_ACL_RULE_TYPE_1, type1_key, &ptr_rule->key);
+        _air_acl_getRuleTable(AIR_ACL_RULE_TYPE_1, type1_mask, &ptr_rule->mask);
+    }
+    if ((TRUE == ptr_rule->key.isipv6) && (ptr_rule->mask.fieldmap & ((1 << AIR_ACL_DIP) | (1 << AIR_ACL_SIP) | (1 << AIR_ACL_FLOW_LABEL))))
+    {
+        air_acl_getRuleCtrl(unit, rule_idx+1, &ptr_rule->ctrl);
+    }
+    else
+    {
+        air_acl_getRuleCtrl(unit, rule_idx, &ptr_rule->ctrl);
+    }
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_acl_setAction
+ * PURPOSE:
+ *      Set an ACL action entry.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      act_idx         --  Index of ACL action entry
+ *      act             --  Structure of ACL action entry
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_NOT_SUPPORT
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_setAction(
+    const UI32_T unit,
+    const UI32_T act_idx,
+    const AIR_ACL_ACTION_T act)
+{
+    AIR_ERROR_NO_T ret = AIR_E_OK;
+    UI32_T  data[4] = {0};
+
+    /* Check parameter */
+    AIR_PARAM_CHK((act_idx >= ACL_MAX_ACTION_NUM), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((TRUE != act.port_en) && (FALSE != act.port_en), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((TRUE != act.dest_port_sel) && (FALSE != act.dest_port_sel), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((TRUE != act.vlan_port_sel) && (FALSE != act.vlan_port_sel), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((act.portmap & (~AIR_ALL_PORT_BITMAP)), AIR_E_BAD_PARAMETER);
+
+    AIR_PARAM_CHK((TRUE != act.cnt_en) && (FALSE != act.cnt_en), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((act.cnt_idx >= ACL_MAX_MIB_NUM), AIR_E_BAD_PARAMETER);
+
+    AIR_PARAM_CHK((TRUE != act.attack_en) && (FALSE != act.attack_en), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((act.attack_idx >= ACL_MAX_ATTACK_RATE_NUM), AIR_E_BAD_PARAMETER);
+
+    AIR_PARAM_CHK((TRUE != act.rate_en) && (FALSE != act.rate_en), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((act.rate_idx >= ACL_MAX_METER_NUM), AIR_E_BAD_PARAMETER);
+
+    AIR_PARAM_CHK((TRUE != act.vlan_en) && (FALSE != act.vlan_en), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((act.vlan_idx >= ACL_MAX_VLAN_NUM), AIR_E_BAD_PARAMETER);
+
+    AIR_PARAM_CHK((act.mirrormap > BITS_RANGE(0, ACL_MAX_MIR_SESSION_NUM)), AIR_E_BAD_PARAMETER);
+
+    AIR_PARAM_CHK((TRUE != act.pri_user_en) && (FALSE != act.pri_user_en), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((act.pri_user >= AIR_MAX_NUM_OF_QUEUE), AIR_E_BAD_PARAMETER);
+
+    AIR_PARAM_CHK((TRUE != act.lyvlan_en) && (FALSE != act.lyvlan_en), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((TRUE != act.lyvlan) && (FALSE != act.lyvlan), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((TRUE != act.mang) && (FALSE != act.mang), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((TRUE != act.bpdu) && (FALSE != act.bpdu), AIR_E_BAD_PARAMETER);
+
+    AIR_PARAM_CHK((TRUE != act.fwd_en) && (FALSE != act.fwd_en), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((act.fwd >= AIR_ACL_ACT_FWD_LAST), AIR_E_BAD_PARAMETER);
+
+    AIR_PARAM_CHK((TRUE != act.egtag_en) && (FALSE != act.egtag_en), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((act.egtag >= AIR_ACL_ACT_EGTAG_LAST), AIR_E_BAD_PARAMETER);
+
+    AIR_PARAM_CHK((TRUE != act.trtcm_en) && (FALSE != act.trtcm_en), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((TRUE != act.trtcm.cls_slr_sel) && (FALSE != act.trtcm.cls_slr), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((act.trtcm.cls_slr >= ACL_MAX_CLASS_SLR_NUM), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((TRUE != act.trtcm.drop_pcd_sel) && (FALSE != act.trtcm.drop_pcd_sel), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((act.trtcm.drop_pcd_g >= ACL_MAX_DROP_PCD_NUM), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((act.trtcm.drop_pcd_y >= ACL_MAX_DROP_PCD_NUM), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((act.trtcm.drop_pcd_r >= ACL_MAX_DROP_PCD_NUM), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((TRUE != act.trtcm.tcm_sel) && (FALSE != act.trtcm.tcm_sel), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((act.trtcm.usr_tcm >= AIR_ACL_ACT_USR_TCM_LAST), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((act.trtcm.tcm_idx >= ACL_MAX_TRTCM_NUM), AIR_E_BAD_PARAMETER);
+
+    _air_acl_setActionTable(&act, data);
+    _air_acl_writeReg(unit, act_idx, 1, 0, AIR_ACL_MEM_SEL_ACTION, AIR_ACL_MEM_FUNC_WRITE, data);
+
+    return ret;
+}
+
+/* FUNCTION NAME: air_acl_getAction
+ * PURPOSE:
+ *      Get an ACL action entry with speficic index.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      act_idx         --  Index of ACL action entry
+ *
+ * OUTPUT:
+ *      ptr_act         --  Structure of ACL action entry
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_ENTRY_NOT_FOUND
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_getAction(
+    const UI32_T unit,
+    const UI32_T act_idx,
+    AIR_ACL_ACTION_T *ptr_act)
+{
+    AIR_ERROR_NO_T ret = AIR_E_OK;
+    UI32_T i = 0;
+    UI32_T data[4] = {0};
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK((act_idx >= ACL_MAX_ACTION_NUM), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_act);
+
+    _air_acl_readReg(unit, act_idx, 1, 0, AIR_ACL_MEM_SEL_ACTION, AIR_ACL_MEM_FUNC_READ, data);
+    _air_acl_getActionTable(data, ptr_act);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_acl_delAction
+ * PURPOSE:
+ *      Delete an ACL action entry with specific index
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      act_idx         --  Index of ACL action entry
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_ENTRY_NOT_FOUND
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_delAction(
+    const UI32_T unit,
+    const UI32_T act_idx)
+{
+    AIR_ERROR_NO_T ret = AIR_E_OK;
+    UI32_T  value = 0;
+    UI32_T  data[4] = {0};
+
+    /* Check parameter */
+    AIR_PARAM_CHK((act_idx >= ACL_MAX_ACTION_NUM), AIR_E_BAD_PARAMETER);
+
+    _air_acl_writeReg(unit, act_idx, 1, 0, AIR_ACL_MEM_SEL_ACTION, AIR_ACL_MEM_FUNC_WRITE, data);
+    return ret;
+}
+
+/* FUNCTION NAME: air_acl_setTrtcm
+ * PURPOSE:
+ *      Set a trTCM entry with the specific index.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      tcm_idx         --  Index of trTCM entry
+ *      tcm             --  Structure of trTCM entry
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      Index 0 ~ 31 can be selected in tcm_idx.
+ */
+AIR_ERROR_NO_T
+air_acl_setTrtcm(
+    const UI32_T unit,
+    const UI32_T tcm_idx,
+    const AIR_ACL_TRTCM_T tcm)
+{
+    AIR_ERROR_NO_T ret = AIR_E_OK;
+    UI32_T  value = 0;
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK((tcm_idx >= ACL_MAX_TRTCM_NUM), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((tcm.cbs > ACL_MAX_CBS_NUM), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((tcm.cir > ACL_MAX_CIR_NUM), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((tcm.pbs > ACL_MAX_PBS_NUM), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((tcm.pir > ACL_MAX_PIR_NUM), AIR_E_BAD_PARAMETER);
+
+    if(AIR_E_TIMEOUT == _checkDone(unit, AIR_ACL_CHECK_TRTCM))
+    {
+        return AIR_E_TIMEOUT;
+    }
+
+    aml_writeReg(unit, ACL_TRTCMW_CBS, tcm.cbs & ACL_TRTCM_CBS_MASK);
+    aml_writeReg(unit, ACL_TRTCMW_EBS, tcm.pbs & ACL_TRTCM_EBS_MASK);
+    aml_writeReg(unit, ACL_TRTCMW_CIR, tcm.cir & ACL_TRTCM_CIR_MASK);
+    aml_writeReg(unit, ACL_TRTCMW_EIR, tcm.pir & ACL_TRTCM_EIR_MASK);
+
+    value = (1 << ACL_TRTCM_BUSY_OFFSET) | ACL_TRTCM_WRITE | ((tcm_idx & ACL_TRTCM_ID_MASK) << ACL_TRTCM_ID_OFFSET);
+
+    if ((ret = aml_writeReg(unit, ACL_TRTCMA, value)) != AIR_E_OK)
+    {
+        return ret;
+    }
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_acl_delTrtcm
+ * PURPOSE:
+ *      Delete an ACL trTCM entry.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      trtcm_idx       --  Index of ACL trTCM entry
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      Index 0 ~ 31 can be selected in tcm_idx.
+ */
+AIR_ERROR_NO_T
+air_acl_delTrtcm(
+    const UI32_T unit,
+    const UI32_T tcm_idx)
+{
+    AIR_ACL_TRTCM_T tcm;
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK((tcm_idx >= ACL_MAX_TRTCM_NUM), AIR_E_BAD_PARAMETER);
+
+    /* Delete the entry from trTCM table */
+    memset(&tcm, 0, sizeof(tcm));
+    return air_acl_setTrtcm(unit, tcm_idx, tcm);
+}
+
+/* FUNCTION NAME: air_acl_clearTrtcm
+ * PURPOSE:
+ *      Clear all ACL trTCM entries.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_clearTrtcm(
+    const UI32_T unit)
+{
+    AIR_ERROR_NO_T ret = AIR_E_OK;
+    AIR_ACL_TRTCM_T tcm;
+    UI32_T i = 0;
+
+    /* Delete all entries from trTCM table */
+    memset(&tcm, 0, sizeof(tcm));
+    for(i=0; i < ACL_MAX_TRTCM_NUM; i++)
+    {
+        ret = air_acl_setTrtcm(unit, i, tcm);
+        if(AIR_E_OK != ret)
+        {
+            return ret;
+        }
+    }
+    return ret;
+}
+
+/* FUNCTION NAME: air_acl_getTrtcm
+ * PURPOSE:
+ *      Get a trTCM entry with the specific index.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      tcm_idx         --  Index of trTCM entry
+ *
+ * OUTPUT:
+ *      ptr_tcm         --  Structure of trTCM entry
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      Index 0 ~ 31 can be selected in tcm_idx.
+ */
+AIR_ERROR_NO_T
+air_acl_getTrtcm(
+    const UI32_T unit,
+    const UI32_T tcm_idx,
+    AIR_ACL_TRTCM_T *ptr_tcm)
+{
+    AIR_ERROR_NO_T ret = AIR_E_OK;
+    UI32_T  value = 0, trtcmr1 = 0, trtcmr2 = 0, trtcmr3 = 0, trtcmr4 = 0;
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK((tcm_idx >= ACL_MAX_TRTCM_NUM), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_tcm);
+
+    if(AIR_E_TIMEOUT == _checkDone(unit, AIR_ACL_CHECK_TRTCM))
+    {
+        return AIR_E_TIMEOUT;
+    }
+
+    value = (1 << ACL_TRTCM_BUSY_OFFSET) | ACL_TRTCM_READ | ((tcm_idx & ACL_TRTCM_ID_MASK) << ACL_TRTCM_ID_OFFSET);
+
+    if ((ret = aml_writeReg(unit, ACL_TRTCMA, value)) != AIR_E_OK)
+    {
+        return ret;
+    }
+
+    aml_readReg(unit, ACL_TRTCMR_CBS, &trtcmr1);
+    aml_readReg(unit, ACL_TRTCMR_EBS, &trtcmr2);
+    aml_readReg(unit, ACL_TRTCMR_CIR, &trtcmr3);
+    aml_readReg(unit, ACL_TRTCMR_EIR, &trtcmr4);
+
+    ptr_tcm->cbs = trtcmr1 & ACL_TRTCM_CBS_MASK;
+    ptr_tcm->pbs = trtcmr2 & ACL_TRTCM_EBS_MASK;
+    ptr_tcm->cir = trtcmr3 & ACL_TRTCM_CIR_MASK;
+    ptr_tcm->pir = trtcmr4 & ACL_TRTCM_EIR_MASK;
+
+    return AIR_E_OK;
+
+}
+
+/* FUNCTION NAME: air_acl_setTrtcmEnable
+ * PURPOSE:
+ *      Set trTCM enable so the meter table will be updated based on PIR and CIR.
+ *      The color marker will also be enabled when ACL is hit.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      state           --  FALSE:Disable
+ *                          TRUE: Enable
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_setTrtcmEnable(
+    const UI32_T unit,
+    const BOOL_T state)
+{
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK(((TRUE != state) && (FALSE != state)), AIR_E_BAD_PARAMETER);
+
+    /* Read data from register */
+    aml_readReg(unit, ACL_TRTCM, &u32dat);
+
+    if (TRUE == state)
+    {
+        u32dat |= (BIT(ACL_TRTCM_EN_OFFSET));
+    }
+    else
+    {
+        u32dat &= ~(BIT(ACL_TRTCM_EN_OFFSET));
+    }
+
+    /* Write data to register */
+    aml_writeReg(unit, ACL_TRTCM, u32dat);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_acl_getTrtcm
+ * PURPOSE:
+ *      Get a trTCM enable state.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      ptr_state       --  FALSE:Disable
+ *                          TRUE: Enable
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_getTrtcmEnable(
+    const UI32_T unit,
+    BOOL_T *const ptr_state)
+{
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_CHECK_PTR(ptr_state);
+
+    /* Read data from register */
+    aml_readReg(unit, ACL_TRTCM, &u32dat);
+
+    if (u32dat & BIT(ACL_TRTCM_EN_OFFSET))
+    {
+        (*ptr_state) = TRUE;
+    }
+    else
+    {
+        (*ptr_state) = FALSE;
+    }
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_acl_setPortEnable
+ * PURPOSE:
+ *      Set ACL state for a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      state           --  FALSE:Disable
+ *                          TRUE: Enable
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_setPortEnable(
+    const UI32_T unit,
+    const UI32_T port,
+    const BOOL_T state)
+{
+    UI32_T u32dat = 0, value = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK(((TRUE != state) && (FALSE != state)), AIR_E_BAD_PARAMETER);
+
+    value = state ? 1 : 0;
+    aml_readReg(unit, ACL_PORT_EN, &u32dat);
+    u32dat = (u32dat & ~(ACL_EN_MASK << port)) | (value << port);
+    aml_writeReg(unit, ACL_PORT_EN, u32dat);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_acl_getPortEnable
+ * PURPOSE:
+ *      Get ACL state for a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *
+ * OUTPUT:
+ *      ptr_state       --  FALSE:Disable
+ *                          TRUE: Enable
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_getPortEnable(
+    const UI32_T unit,
+    const UI32_T port,
+    UI32_T *ptr_state)
+{
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+
+    /* Mistake proofing for state checking */
+    AIR_CHECK_PTR(ptr_state);
+
+    /* Read data from register */
+    aml_readReg(unit, ACL_PORT_EN, &u32dat);
+
+    (*ptr_state) = BITS_OFF_R(u32dat, port, ACL_EN_MASK);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_acl_setDropEnable
+ * PURPOSE:
+ *      Set ACL drop precedence state
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      state           --  FALSE:Disable
+ *                          TRUE: Enable
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_setDropEnable(
+    const UI32_T unit,
+    const UI32_T port,
+    const BOOL_T state)
+{
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK(((TRUE != state) && (FALSE != state)), AIR_E_BAD_PARAMETER);
+
+    u32dat = state ? 1 : 0;
+    aml_writeReg(unit, DPCR_EN(port), u32dat);
+    return AIR_E_OK;
+
+}
+
+/* FUNCTION NAME: air_acl_getDropEnable
+ * PURPOSE:
+ *      Get ACL drop precedence state
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *
+ * OUTPUT:
+ *      ptr_state       --  FALSE:Disable
+ *                          TRUE: Enable
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_getDropEnable(
+    const UI32_T unit,
+    const UI32_T port,
+    BOOL_T *ptr_state)
+{
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_state);
+
+    aml_readReg(unit, DPCR_EN(port), &u32dat);
+    *ptr_state = u32dat ? TRUE : FALSE;
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_acl_setDropThreshold
+ * PURPOSE:
+ *      Set ACL drop threshold.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      color           --  AIR_ACL_DP_COLOR_YELLOW: Yellow
+ *                          AIR_ACL_DP_COLOR_RED   : Red
+ *      queue           --  Output queue number
+ *      high            --  High threshold
+ *      low             --  Low threshold
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      Key parameter include port, color, queue.
+ */
+AIR_ERROR_NO_T
+air_acl_setDropThreshold(
+    const UI32_T unit,
+    const UI32_T port,
+    const AIR_ACL_DP_COLOR_T color,
+    const UI8_T queue,
+    const UI32_T high,
+    const UI32_T low)
+{
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((color >= AIR_ACL_DP_COLOR_LAST), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((queue >= AIR_MAX_NUM_OF_QUEUE), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((high > BITS_RANGE(0, DPCR_HIGH_THRSH_WIDTH)), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((low > BITS_RANGE(0, DPCR_LOW_THRSH_WIDTH)), AIR_E_BAD_PARAMETER);
+
+    aml_readReg(unit, DPCR(port, color, queue), &u32dat);
+    u32dat = (u32dat & ~(DPCR_LOW_THRSH_MASK)) | low;
+    u32dat = (u32dat & ~(DPCR_HIGH_THRSH_MASK << DPCR_HIGH_THRSH_OFFSET)) | (high << DPCR_HIGH_THRSH_OFFSET);
+    aml_writeReg(unit, DPCR(port, color, queue), u32dat);
+    return AIR_E_OK;
+
+}
+
+/* FUNCTION NAME: air_acl_getDropThreshold
+ * PURPOSE:
+ *      Get ACL drop threshold.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      color           --  AIR_ACL_DP_COLOR_YELLOW: Yellow
+ *                          AIR_ACL_DP_COLOR_RED   : Red
+ *      queue           --  Output queue number
+ *
+ * OUTPUT:
+ *      ptr_high        --  High threshold
+ *      ptr_low         --  Low threshold
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      Key parameter include port, color, queue.
+ */
+AIR_ERROR_NO_T
+air_acl_getDropThreshold(
+    const UI32_T unit,
+    const UI32_T port,
+    const AIR_ACL_DP_COLOR_T color,
+    const UI8_T queue,
+    UI32_T *ptr_high,
+    UI32_T *ptr_low)
+{
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((color >= AIR_ACL_DP_COLOR_LAST), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((queue >= AIR_MAX_NUM_OF_QUEUE), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_high);
+    AIR_CHECK_PTR(ptr_low);
+
+    aml_readReg(unit, DPCR(port, color, queue), &u32dat);
+    *ptr_low = u32dat & DPCR_LOW_THRSH_MASK;
+    *ptr_high = (u32dat >> DPCR_HIGH_THRSH_OFFSET) & DPCR_HIGH_THRSH_MASK;
+    return AIR_E_OK;
+
+}
+
+/* FUNCTION NAME: air_acl_setDropProbability
+ * PURPOSE:
+ *      Set ACL drop probability.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      color           --  AIR_ACL_DP_COLOR_YELLOW: Yellow
+ *                          AIR_ACL_DP_COLOR_RED   : Red
+ *      queue           --  Output queue number
+ *      probability     --  Drop probability (value:0 ~ 1023, unit:1/1023; eg: value-102 = 10% )
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      Key parameter include port, color, queue.
+ */
+AIR_ERROR_NO_T
+air_acl_setDropProbability(
+    const UI32_T unit,
+    const UI32_T port,
+    const AIR_ACL_DP_COLOR_T color,
+    const UI8_T queue,
+    const UI32_T probability)
+{
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((color >= AIR_ACL_DP_COLOR_LAST), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((queue >= AIR_MAX_NUM_OF_QUEUE), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((probability > BITS_RANGE(0, DPCR_PBB_WIDTH)), AIR_E_BAD_PARAMETER);
+
+    aml_readReg(unit, DPCR(port, color, queue), &u32dat);
+    u32dat = (u32dat & ~(DPCR_PBB_MASK << DPCR_PBB_OFFSET)) | (probability << DPCR_PBB_OFFSET);
+    aml_writeReg(unit, DPCR(port, color, queue), u32dat);
+    return AIR_E_OK;
+
+}
+
+/* FUNCTION NAME: air_acl_getDropProbability
+ * PURPOSE:
+ *      Get ACL drop probability.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      color           --  AIR_ACL_DP_COLOR_YELLOW: Yellow
+ *                          AIR_ACL_DP_COLOR_RED   : Red
+ *      queue           --  Output queue number
+ *
+ * OUTPUT:
+ *      ptr_probability --  Drop probability (value:0 ~ 1023, unit:1/1023; eg: value-102 = 10% )
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      Key parameter include port, color, queue.
+ */
+AIR_ERROR_NO_T
+air_acl_getDropProbability(
+    const UI32_T unit,
+    const UI32_T port,
+    const AIR_ACL_DP_COLOR_T color,
+    const UI8_T queue,
+    UI32_T *ptr_probability)
+{
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((color >= AIR_ACL_DP_COLOR_LAST), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((queue >= AIR_MAX_NUM_OF_QUEUE), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_probability);
+
+    /* Read data from register */
+    aml_readReg(unit, DPCR(port, color, queue), &u32dat);
+
+    (*ptr_probability) = BITS_OFF_R(u32dat, DPCR_PBB_OFFSET, DPCR_PBB_WIDTH);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME:
+ *      air_acl_setGlobalState
+ * PURPOSE:
+ *      Set the ACL global enable state.
+ * INPUT:
+ *      unit        -- Device ID
+ *      state       -- Enable state of ACL
+ * OUTPUT:
+ *      None
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_setGlobalState(
+    const UI32_T        unit,
+    const BOOL_T        state)
+{
+    AIR_ERROR_NO_T ret = AIR_E_OK;
+    UI32_T  value = 0, data = 0;
+
+    AIR_PARAM_CHK((TRUE != state) && (FALSE != state), AIR_E_BAD_PARAMETER);
+
+    value = state ? 1 : 0;
+    if ((ret = aml_readReg(unit, ACL_GLOBAL_CFG, &data)) != AIR_E_OK)
+    {
+        return ret;
+    }
+    data = (data & ~ACL_EN_MASK) | value;
+    if ((ret = aml_writeReg(unit, ACL_GLOBAL_CFG, data)) != AIR_E_OK)
+    {
+        return ret;
+    }
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME:
+ *      air_acl_getGlobalState
+ * PURPOSE:
+ *      Get the ACL global enable state.
+ * INPUT:
+ *      unit             -- Device ID
+ * OUTPUT:
+ *      ptr_state        -- Enable state
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_getGlobalState(
+    const UI32_T         unit,
+    BOOL_T               *ptr_state)
+{
+    AIR_ERROR_NO_T ret = AIR_E_OK;
+    UI32_T  value = 0;
+
+    AIR_CHECK_PTR(ptr_state);
+    if ((ret = aml_readReg(unit, ACL_GLOBAL_CFG, &value)) != AIR_E_OK)
+    {
+        return ret;
+    }
+
+    value &= ACL_EN_MASK;
+    *ptr_state = value ? TRUE : FALSE;
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME:
+ *      air_acl_setUdfRule
+ * PURPOSE:
+ *      Set ACL UDF rule of specified entry index.
+ * INPUT:
+ *      unit             -- Device ID
+ *      rule_idx         -- ACLUDF table entry index
+ *      udf_rule         -- Structure of ACL UDF rule entry
+ * OUTPUT:
+ *      None
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_setUdfRule(
+    const UI32_T                unit,
+    const UI32_T                rule_idx,
+    AIR_ACL_UDF_RULE_T          udf_rule)
+{
+    AIR_ERROR_NO_T ret = AIR_E_OK;
+    UI32_T  value = 0;
+    UI32_T  data[3] = {0};
+
+    /* Check parameter */
+    AIR_PARAM_CHK((rule_idx >= ACL_MAX_UDF_NUM), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((TRUE != udf_rule.valid) && (FALSE != udf_rule.valid), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((udf_rule.offset_format >= AIR_ACL_RULE_OFS_FMT_LAST), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((udf_rule.offset >= ACL_MAX_WORD_OFST_NUM), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((udf_rule.cmp_sel >= AIR_ACL_RULE_CMP_SEL_LAST), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((udf_rule.pattern > ACL_MAX_CMP_PAT_NUM), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((udf_rule.mask > ACL_MAX_CMP_BIT_NUM), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((udf_rule.low_threshold > ACL_MAX_CMP_PAT_NUM), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((udf_rule.high_threshold > ACL_MAX_CMP_BIT_NUM), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((udf_rule.portmap & (~AIR_ALL_PORT_BITMAP)), AIR_E_BAD_PARAMETER);
+
+    _fillTblMultiFields(data, 3, PORT_BITMAP_OFFSET, PORT_BITMAP_WIDTH, udf_rule.portmap);
+    _fillTblMultiFields(data, 3, UDF_RULE_EN_OFFSET, UDF_RULE_EN_WIDTH, udf_rule.valid);
+    _fillTblMultiFields(data, 3, UDF_PKT_TYPE_OFFSET, UDF_PKT_TYPE_WIDTH, udf_rule.offset_format);
+    _fillTblMultiFields(data, 3, WORD_OFST_OFFSET, WORD_OFST_WIDTH, udf_rule.offset);
+
+    _fillTblMultiFields(data, 3, CMP_SEL_OFFSET, CMP_SEL_WIDTH, udf_rule.cmp_sel);
+    if(AIR_ACL_RULE_CMP_SEL_PATTERN == udf_rule.cmp_sel)
+    {
+        _fillTblMultiFields(data, 3, CMP_PAT_OFFSET, CMP_PAT_WIDTH, udf_rule.pattern);
+        _fillTblMultiFields(data, 3, CMP_MASK_OFFSET, CMP_MASK_WIDTH, udf_rule.mask);
+    }
+    else
+    {
+        _fillTblMultiFields(data, 3, CMP_PAT_OFFSET, CMP_PAT_WIDTH, udf_rule.low_threshold);
+        _fillTblMultiFields(data, 3, CMP_MASK_OFFSET, CMP_MASK_WIDTH, udf_rule.high_threshold);
+    }
+
+    if(AIR_E_TIMEOUT == _checkDone(unit, AIR_ACL_CHECK_UDF))
+    {
+        return AIR_E_TIMEOUT;
+    }
+    aml_writeReg(unit, ACL_AUTW0, data[0]);
+    aml_writeReg(unit, ACL_AUTW1, data[1]);
+    aml_writeReg(unit, ACL_AUTW2, data[2]);
+    value = (rule_idx & ACL_UDF_ADDR_MASK) | ACL_UDF_WRITE | (1U << ACL_UDF_ACC_OFFSET);
+    if ((ret = aml_writeReg(unit, ACL_AUTC, value)) != AIR_E_OK)
+    {
+        return ret;
+    }
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME:
+ *      air_acl_getUdfRule
+ * PURPOSE:
+ *      Get ACL UDF rule of specified entry index.
+ * INPUT:
+ *      unit             -- Device ID
+ *      rule_idx         -- ACLUDF table entry index
+ * OUTPUT:
+ *      ptr_udf_rule     -- Structure of ACL UDF rule entry
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_getUdfRule(
+    const UI32_T                unit,
+    const UI8_T                 rule_idx,
+    AIR_ACL_UDF_RULE_T          *ptr_udf_rule)
+{
+    AIR_ERROR_NO_T ret = AIR_E_OK;
+    UI32_T  value = 0;
+    UI32_T  data[3] = {0};
+
+    /* Check parameter */
+    AIR_PARAM_CHK((rule_idx >= ACL_MAX_UDF_NUM), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_udf_rule);
+
+    value = (rule_idx & ACL_UDF_ADDR_MASK) | ACL_UDF_READ | (1U << ACL_UDF_ACC_OFFSET);
+    if ((ret = aml_writeReg(unit, ACL_AUTC, value)) != AIR_E_OK)
+    {
+        return ret;
+    }
+    if(AIR_E_TIMEOUT == _checkDone(unit, AIR_ACL_CHECK_UDF))
+    {
+        return AIR_E_TIMEOUT;
+    }
+    aml_readReg(unit, ACL_AUTR0, data);
+    aml_readReg(unit, ACL_AUTR1, data+1);
+    aml_readReg(unit, ACL_AUTR2, data+2);
+
+    ACL_DERIVE_TBL_MULTIFIELDS(data, PORT_BITMAP_OFFSET, PORT_BITMAP_WIDTH, ptr_udf_rule->portmap);
+
+    ACL_DERIVE_TBL_MULTIFIELDS(data, UDF_RULE_EN_OFFSET, UDF_RULE_EN_WIDTH, ptr_udf_rule->valid);
+    ACL_DERIVE_TBL_MULTIFIELDS(data, UDF_PKT_TYPE_OFFSET, UDF_PKT_TYPE_WIDTH, ptr_udf_rule->offset_format);
+    ACL_DERIVE_TBL_MULTIFIELDS(data, WORD_OFST_OFFSET, WORD_OFST_WIDTH, ptr_udf_rule->offset);
+    ACL_DERIVE_TBL_MULTIFIELDS(data, CMP_SEL_OFFSET, CMP_SEL_WIDTH, ptr_udf_rule->cmp_sel);
+    if(AIR_ACL_RULE_CMP_SEL_PATTERN == ptr_udf_rule->cmp_sel)
+    {
+        ACL_DERIVE_TBL_MULTIFIELDS(data, CMP_PAT_OFFSET, CMP_PAT_WIDTH, ptr_udf_rule->pattern);
+        ACL_DERIVE_TBL_MULTIFIELDS(data, CMP_MASK_OFFSET, CMP_MASK_WIDTH, ptr_udf_rule->mask);
+    }
+    else
+    {
+        ACL_DERIVE_TBL_MULTIFIELDS(data, CMP_PAT_OFFSET, CMP_PAT_WIDTH, ptr_udf_rule->low_threshold);
+        ACL_DERIVE_TBL_MULTIFIELDS(data, CMP_MASK_OFFSET, CMP_MASK_WIDTH, ptr_udf_rule->high_threshold);
+    }
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME:
+ *      air_acl_delUdfRule
+ * PURPOSE:
+ *      Delete ACL UDF rule of specified entry index.
+ * INPUT:
+ *      unit             -- Device ID
+ *      rule_idx         -- ACLUDF table entry index
+ * OUTPUT:
+ *      None
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_delUdfRule(
+    const UI32_T      unit,
+    const UI8_T       rule_idx)
+{
+    AIR_ERROR_NO_T ret = AIR_E_OK;
+    UI32_T  value = 0;
+    UI32_T  data = 0;
+
+    /* Check parameter */
+    AIR_PARAM_CHK((rule_idx >= ACL_MAX_UDF_NUM), AIR_E_BAD_PARAMETER);
+
+    aml_writeReg(unit, ACL_AUTW0, data);
+    aml_writeReg(unit, ACL_AUTW1, data);
+    aml_writeReg(unit, ACL_AUTW2, data);
+
+    value = (rule_idx & ACL_UDF_ADDR_MASK) | ACL_UDF_WRITE | (1U << ACL_UDF_ACC_OFFSET);
+    if ((ret = aml_writeReg(unit, ACL_AUTC, value)) != AIR_E_OK)
+    {
+        return ret;
+    }
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME:
+ *      air_acl_clearUdfRule
+ * PURPOSE:
+ *      Clear acl all udf rule.
+ * INPUT:
+ *      unit             -- Device ID
+ * OUTPUT:
+ *      None
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_clearUdfRule(
+    const UI32_T    unit)
+{
+    AIR_ERROR_NO_T ret = AIR_E_OK;
+    UI32_T  value = 0;
+
+    value = ACL_UDF_CLEAR | (1U << ACL_UDF_ACC_OFFSET);
+    if ((ret = aml_writeReg(unit, ACL_AUTC, value)) != AIR_E_OK)
+    {
+        return ret;
+    }
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME:
+ *      air_acl_setMeterTable
+ * PURPOSE:
+ *      Set flow ingress rate limit by meter table.
+ * INPUT:
+ *      unit                -- Device ID
+ *      meter_id            -- Meter id
+ *      enable              -- Meter enable state
+ *      rate                -- Ratelimit(unit:64kbps)
+ * OUTPUT:
+ *      None
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_setMeterTable(
+    const UI32_T            unit,
+    const UI32_T            meter_id,
+    const BOOL_T            enable,
+    const UI32_T            rate)
+{
+    AIR_ERROR_NO_T ret = AIR_E_OK;
+    UI32_T  value = 0;
+
+    /* Check parameter */
+    AIR_PARAM_CHK((meter_id >= ACL_MAX_METER_NUM), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((rate > ACL_MAX_TOKEN_NUM), AIR_E_BAD_PARAMETER);
+
+    if(TRUE == enable)
+    {
+        value = (1 << ACL_RATE_BUSY_OFFSET) | ACL_RATE_WRITE | ((meter_id & ACL_RATE_ID_MASK) << ACL_RATE_ID_OFFSET) | ACL_RATE_EN |
+            (rate & ACL_RATE_TOKEN_MASK);
+    }
+    else if(FALSE == enable)
+    {
+        value = (1 << ACL_RATE_BUSY_OFFSET) | ACL_RATE_WRITE | ((meter_id & ACL_RATE_ID_MASK) << ACL_RATE_ID_OFFSET) | ACL_RATE_DIS;
+    }
+    else
+    {
+        return AIR_E_BAD_PARAMETER;
+    }
+
+    if(AIR_E_TIMEOUT == _checkDone(unit, AIR_ACL_CHECK_METER))
+    {
+        return AIR_E_TIMEOUT;
+    }
+    if ((ret = aml_writeReg(unit, ACLRMC, value)) != AIR_E_OK)
+    {
+        return ret;
+    }
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME:
+ *      air_acl_getMeterTable
+ * PURPOSE:
+ *      Get meter table configuration.
+ * INPUT:
+ *      unit                -- Device ID
+ *      meter_id            -- Meter id
+ * OUTPUT:
+ *      ptr_enable          -- Meter enable state
+ *      ptr_rate            -- Ratelimit(unit:64kbps)
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_acl_getMeterTable(
+    const UI32_T            unit,
+    const UI32_T            meter_id,
+    BOOL_T                  *ptr_enable,
+    UI32_T                  *ptr_rate)
+{
+    AIR_ERROR_NO_T ret = AIR_E_OK;
+    UI32_T  value = 0;
+
+    /* Check parameter */
+    AIR_PARAM_CHK((meter_id >= ACL_MAX_METER_NUM), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_enable);
+    AIR_CHECK_PTR(ptr_rate);
+
+    if(AIR_E_TIMEOUT == _checkDone(unit, AIR_ACL_CHECK_METER))
+    {
+        return AIR_E_TIMEOUT;
+    }
+    value = (1 << ACL_RATE_BUSY_OFFSET) | ACL_RATE_READ | ((meter_id & ACL_RATE_ID_MASK) << ACL_RATE_ID_OFFSET) | ACL_RATE_EN;
+
+    if ((ret = aml_writeReg(unit, ACLRMC, value)) != AIR_E_OK)
+    {
+        return ret;
+    }
+    aml_readReg(unit, ACLRMD1, &value);
+    *ptr_enable = ((value >> ACL_RATE_EN_OFFSET) & 0x1) ? TRUE : FALSE;
+    *ptr_rate = value & ACL_RATE_TOKEN_MASK;
+
+    return AIR_E_OK;
+}
+
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_aml.c b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_aml.c
new file mode 100644
index 0000000..38b85a4
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_aml.c
@@ -0,0 +1,218 @@
+/* FILE NAME:  air_aml.c

+ * PURPOSE:

+ *      It provides access management layer function.

+ * NOTES:

+ *

+ */

+

+/* INCLUDE FILE DECLARATIONS

+ */

+#include "air.h"

+

+/* NAMING CONSTANT DECLARATIONS

+ */

+

+/* MACRO FUNCTION DECLARATIONS

+ */

+

+/* DATA TYPE DECLARATIONS

+ */

+

+/* GLOBAL VARIABLE DECLARATIONS

+ */

+AML_DEV_ACCESS_T _ext_dev_access;

+

+/* EXPORTED SUBPROGRAM BODIES

+ */

+

+/* LOCAL SUBPROGRAM BODIES

+ */

+/* FUNCTION NAME:   aml_readReg

+ * PURPOSE:

+ *      To read data from the register of the specified chip unit.

+ * INPUT:

+ *      unit        -- the device unit

+ *      addr_offset -- the address of register

+ * OUTPUT:

+ *      ptr_data    -- pointer for the register data

+ * RETURN:

+ *      NPS_E_OK     -- Successfully read the data.

+ *      NPS_E_OTHERS -- Failed to read the data.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+aml_readReg(

+    const UI32_T    unit,

+    const UI32_T    addr_offset,

+    UI32_T          *ptr_data)

+{

+    AIR_CHECK_PTR(ptr_data);

+

+    if (!_ext_dev_access.read_callback)

+    {

+        return AIR_E_OTHERS;

+    }

+

+    return _ext_dev_access.read_callback(unit, addr_offset, ptr_data);

+}

+

+/* FUNCTION NAME:   aml_writeReg

+ * PURPOSE:

+ *      To write data to the register of the specified chip unit.

+ * INPUT:

+ *      unit        -- the device unit

+ *      addr_offset -- the address of register

+ *      data        -- written data

+ * OUTPUT:

+ *      none

+ * RETURN:

+ *      NPS_E_OK     -- Successfully write the data.

+ *      NPS_E_OTHERS -- Failed to write the data.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+aml_writeReg(

+    const UI32_T    unit,

+    const UI32_T    addr_offset,

+    const UI32_T    data)

+{

+    if (!_ext_dev_access.write_callback)

+    {

+        return AIR_E_OTHERS;

+    }

+

+    return _ext_dev_access.write_callback(unit, addr_offset, data);

+}

+

+/* FUNCTION NAME:   aml_readPhyReg

+ * PURPOSE:

+ *      To read data from the phy register of the specified chip unit in Clause22.

+ * INPUT:

+ *      unit        -- the device unit

+ *      port_id     -- physical port number

+ *      addr_offset -- the address of phy register

+ * OUTPUT:

+ *      ptr_data    -- pointer for the register data

+ * RETURN:

+ *      NPS_E_OK     -- Successfully read the data.

+ *      NPS_E_OTHERS -- Failed to read the data.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+aml_readPhyReg(

+    const UI32_T    unit,

+    const UI32_T    port_id,

+    const UI32_T    addr_offset,

+    UI32_T          *ptr_data)

+{

+    AIR_CHECK_PTR(ptr_data);

+

+    if (!_ext_dev_access.phy_read_callback)

+    {

+        return AIR_E_OTHERS;

+    }

+

+    return _ext_dev_access.phy_read_callback(unit, port_id, addr_offset, ptr_data);

+}

+

+/* FUNCTION NAME:   aml_writePhyReg

+ * PURPOSE:

+ *      To write data to the phy register of the specified chip unit in Clause22.

+ * INPUT:

+ *      unit        -- the device unit

+ *      port_id     -- physical port number

+ *      addr_offset -- the address of phy register

+ *      data        -- written data

+ * OUTPUT:

+ *      none

+ * RETURN:

+ *      NPS_E_OK     -- Successfully write the data.

+ *      NPS_E_OTHERS -- Failed to write the data.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+aml_writePhyReg(

+    const UI32_T    unit,

+    const UI32_T    port_id,

+    const UI32_T    addr_offset,

+    const UI32_T    data)

+{

+    if (!_ext_dev_access.phy_write_callback)

+    {

+        return AIR_E_OTHERS;

+    }

+

+    return _ext_dev_access.phy_write_callback(unit, port_id, addr_offset, data);

+}

+

+/* FUNCTION NAME:   aml_readPhyRegCL45

+ * PURPOSE:

+ *      To read data from the phy register of the specified chip unit in Clause45.

+ * INPUT:

+ *      unit        -- the device unit

+ *      port_id     -- physical port number

+ *      dev_type    -- phy register type

+ *      addr_offset -- the address of phy register

+ * OUTPUT:

+ *      ptr_data    -- pointer for the register data

+ * RETURN:

+ *      NPS_E_OK     -- Successfully read the data.

+ *      NPS_E_OTHERS -- Failed to read the data.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+aml_readPhyRegCL45(

+    const UI32_T    unit,

+    const UI32_T    port_id,

+    const UI32_T    dev_type,

+    const UI32_T    addr_offset,

+    UI32_T          *ptr_data)

+{

+    AIR_CHECK_PTR(ptr_data);

+

+    if (!_ext_dev_access.phy_cl45_read_callback)

+    {

+        return AIR_E_OTHERS;

+    }

+

+    return _ext_dev_access.phy_cl45_read_callback(unit, port_id, dev_type, addr_offset, ptr_data);

+}

+

+/* FUNCTION NAME:   aml_writePhyRegCL45

+ * PURPOSE:

+ *      To write data to the phy register of the specified chip unit in Clause45.

+ * INPUT:

+ *      unit        -- the device unit

+ *      port_id     -- physical port number

+ *      dev_type    -- phy register offset

+ *      addr_offset -- the address of phy register

+ *      data        -- written data

+ * OUTPUT:

+ *      none

+ * RETURN:

+ *      NPS_E_OK     -- Successfully write the data.

+ *      NPS_E_OTHERS -- Failed to write the data.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+aml_writePhyRegCL45(

+    const UI32_T    unit,

+    const UI32_T    port_id,

+    const UI32_T    dev_type,

+    const UI32_T    addr_offset,

+    const UI32_T    data)

+{

+    if (!_ext_dev_access.phy_cl45_write_callback)

+    {

+        return AIR_E_OTHERS;

+    }

+

+    return _ext_dev_access.phy_cl45_write_callback(unit, port_id, dev_type, addr_offset, data);

+}

+

diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_cmd.c b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_cmd.c
new file mode 100644
index 0000000..95c11e8
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_cmd.c
@@ -0,0 +1,8022 @@
+/* FILE NAME:   air_cmd.c

+ * PURPOSE:

+ *      Define the command line function in AIR SDK.

+ * NOTES:

+ */

+

+/* INCLUDE FILE DECLARATIONS

+*/

+#include "air.h"

+

+/* NAMING CONSTANT DECLARATIONS

+*/

+

+/* MACRO FUNCTION DECLARATIONS

+*/

+#define MAC_STR         "%02X%02X%02X%02X%02X%02X"

+#define MAC2STR(m)      (m)[0],(m)[1],(m)[2],(m)[3],(m)[4],(m)[5]

+#define AIR_MAC_LEN    (12)

+#define CMD_NO_PARA     (0xFFFFFFFF)

+#define CMD_VARIABLE_PARA (0xFFFFFFFE)

+#define L2_WDOG_KICK_NUM            (100)

+

+#define TOLOWER(x)      ((x) | 0x20)

+#define isxdigit(c)     (('0' <= (c) && (c) <= '9') || ('a' <= (c) && (c) <= 'f') || ('A' <= (c) && (c) <= 'F'))

+#define isdigit(c)      ('0' <= (c) && (c) <= '9')

+#define CMD_CHECK_PARA(__shift__, __op__, __size__) do          \

+{                                                               \

+    if ((__shift__) __op__ (__size__))                          \

+    {                                                           \

+        ;                                                       \

+    }                                                           \

+    else                                                        \

+    {                                                           \

+        return (AIR_E_BAD_PARAMETER);                           \

+    }                                                           \

+} while(0)

+

+/* DATA TYPE DECLARATIONS

+*/

+typedef struct {

+    C8_T*               name;

+    AIR_ERROR_NO_T     (*func)(UI32_T argc, C8_T *argv[]);

+    UI32_T              argc_min;

+    C8_T*               argc_errmsg;

+} AIR_CMD_T;

+

+/* GLOBAL VARIABLE DECLARATIONS

+*/

+

+/* LOCAL SUBPROGRAM DECLARATIONS

+*/

+/* String Utility */

+static BOOL_T _strcmp(const char *s1, const char *s2);

+static C8_T * _strtok_r(C8_T *s, const C8_T *delim, C8_T **last);

+static C8_T * _strtok(C8_T *s, const C8_T *delim, C8_T **last);

+UI32_T _strtoul(const C8_T *cp, C8_T **endp, UI32_T base);

+static I32_T _strtol(const C8_T *cp, C8_T **endp, UI32_T base);

+

+/* Type Converter */

+static AIR_ERROR_NO_T _str2mac(C8_T *str, C8_T *mac);

+static AIR_ERROR_NO_T _hex2bit(const UI32_T hex, UI32_T *ptr_bit);

+static AIR_ERROR_NO_T _hex2bitstr(const UI32_T hex, C8_T *ptr_bit_str, UI32_T str_len);

+static AIR_ERROR_NO_T _portListStr2Ary(const C8_T *str, UI32_T *ary, const UI32_T ary_num);

+

+/* Register Operation */

+static AIR_ERROR_NO_T doRegRead(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doRegWrite(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doReg(UI32_T argc, C8_T *argv[]);

+

+/* PHY Operation */

+static AIR_ERROR_NO_T doPhyCL22Read(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doPhyCL22Write(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doPhyCL22(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doPhyCL45Read(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doPhyCL45Write(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doPhyCL45(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doPhy(UI32_T argc, C8_T *argv[]);

+

+/* Porting setting */

+static AIR_ERROR_NO_T doPortSetMatrix(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doPortSetVlanMode(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doPortSet(UI32_T argc, C8_T *argv[]);

+

+static AIR_ERROR_NO_T doPortGetMatrix(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doPortGetVlanMode(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doPortGet(UI32_T argc, C8_T *argv[]);

+

+static AIR_ERROR_NO_T doPort(UI32_T argc, C8_T *argv[]);

+

+/* Vlan setting */

+static AIR_ERROR_NO_T doVlanInitiate(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanCreate(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanDestroy(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanDestroyAll(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanDump(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanAddPortMem(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanDelPortMem(UI32_T argc, C8_T *argv[]);

+

+static AIR_ERROR_NO_T doVlanSetFid(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanSetMemPort(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanSetIVL(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanSetPortBaseStag(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanSetStag(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanSetEgsTagCtlEn(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanSetEgsTagCtlCon(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanSetEgsTagCtl(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanSetPortActFrame(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanSetLeakyVlanEn(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanSetPortVlanAttr(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanSetIgsPortETagAttr(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanSetPortETagAttr(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanSetPortOuterTPID(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanSetPvid(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanSet(UI32_T argc, C8_T *argv[]);

+

+static AIR_ERROR_NO_T doVlanGetPortActFrame(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanGetLeakyVlanEn(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanGetPortVlanAttr(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanGetIgsPortETagAttr(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanGetPortETagAttr(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanGetPortOuterTPID(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanGetPvid(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doVlanGet(UI32_T argc, C8_T *argv[]);

+

+static AIR_ERROR_NO_T doVlan(UI32_T argc, C8_T *argv[]);

+

+static AIR_ERROR_NO_T doFlowCtrl(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doJumbo(UI32_T argc, C8_T *argv[]);

+

+static AIR_ERROR_NO_T doL2Add(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doL2Del(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doL2Clear(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doL2Get(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doL2Set(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doL2Dump(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doL2(UI32_T argc, C8_T *argv[]);

+

+static AIR_ERROR_NO_T doAnMode(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doLocalAdv(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doRemoteAdv(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doPortSpeed(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doPortDuplex(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doPortStatus(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doPortBckPres(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doPortPsMode(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doPortSmtSpdDwn(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doPortSpTag(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doPortEnable(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doPort5GBaseRMode(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doPortHsgmiiMode(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doPortSgmiiMode(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doPortRmiiMode(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doPortRgmiiMode(UI32_T argc, C8_T *argv[]);

+

+static AIR_ERROR_NO_T doSptagEn(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doSptagMode(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doSptagDecode(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doSptagEncode(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doSptag(UI32_T argc, C8_T *argv[]);

+

+static AIR_ERROR_NO_T doMacAddr(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T _printMacEntry(AIR_MAC_ENTRY_T * mt, UI32_T age_unit, UI8_T count, UI8_T title);

+static AIR_ERROR_NO_T doGetMacAddr(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doMacAddrAgeOut(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doDumpMacAddr(UI32_T argc, C8_T *argv[]);

+

+static AIR_ERROR_NO_T doLagMember(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doLagMemberCnt(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doLagPtseed(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doLagHashtype(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doLagDstInfo(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doLagState(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doLagSpsel(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doLagGet(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doLagSet(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doLag(UI32_T argc, C8_T *argv[]);

+

+static AIR_ERROR_NO_T doStpPortstate(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doStpGet(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doStpSet(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doStp(UI32_T argc, C8_T *argv[]);

+

+static AIR_ERROR_NO_T doMirrorGetSid(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doMirrorDelSid(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doMirrorAddRlist(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doMirrorAddTlist(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doMirrorSetSessionEnable(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doMirrorSetSession(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doMirrorSet(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doMirrorAdd(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doMirrorGet(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doMirrorDel(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doMirror(UI32_T argc,C8_T *argv[]);

+

+static AIR_ERROR_NO_T doMibClearPort(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doMibClearAcl(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doMibGetPort(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doMibGetAcl(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doMibClear(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doMibGet(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doMib(UI32_T argc, C8_T *argv[]);

+

+static AIR_ERROR_NO_T doQosScheduleAlgo(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doQosTrustMode(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doQosPri2Queue(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doQosDscp2Pri(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doQosRateLimitEnable(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doQosRateLimit(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doQosPortPriority(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doQosRateLimitExMngFrm(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doQosGet(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doQosSet(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doQos(UI32_T argc, C8_T *argv[]);

+

+static AIR_ERROR_NO_T doDiagTxComply(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doDiagSet(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doDiagGet(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doDiag(UI32_T argc, C8_T *argv[]);

+

+static AIR_ERROR_NO_T doLedMode(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doLedState(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doLedUsrDef(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doLedBlkTime(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doLedSet(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doLedGet(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doLed(UI32_T argc, C8_T *argv[]);

+

+static AIR_ERROR_NO_T doSwitchCpuPortEn(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doSwitchCpuPort(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doSwitchPhyLCIntrEn(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doSwitchPhyLCIntrSts(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doSwitchSet(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doSwitchGet(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doSwitch(UI32_T argc, C8_T *argv[]);

+

+static AIR_ERROR_NO_T doShowVersion(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doShow(UI32_T argc, C8_T *argv[]);

+

+static AIR_ERROR_NO_T doStormEnable(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doStormRate(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doFldMode(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doSaLearning(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doSaLimit(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doSecGet(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doSecSet(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doSec(UI32_T argc, C8_T *argv[]);

+

+static void _air_acl_printRuleMap(UI32_T *rule_map, UI32_T ary_num);

+static AIR_ERROR_NO_T doAclEn(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doAclRule(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doAclUdfRule(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doAclRmvRule(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doAclRmvUdfRule(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doAclAction(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doAclRmvAction(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doAclDumpAction(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doAclTrtcm(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doAclTrtcmEn(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doAclRmvTrtcm(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doAclPortEn(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doAclDropEn(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doAclDropThrsh(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doAclDropPbb(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doAclMeter(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doAclDump(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doAclSet(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doAclGet(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doAclDel(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doAclClear(UI32_T argc, C8_T *argv[]);

+static AIR_ERROR_NO_T doAcl(UI32_T argc, C8_T *argv[]);

+

+static AIR_ERROR_NO_T subcmd(const AIR_CMD_T tab[], UI32_T argc, C8_T *argv[]);

+

+/* STATIC VARIABLE DECLARATIONS

+*/

+const static C8_T *_sptag_vpm[] =

+{

+    "untagged",

+    "8100",

+    "predefined",

+    "unknown"

+};

+

+const static C8_T *_sptag_pt[] =

+{

+    "disable pass through",

+    "enable pass through"

+};

+

+const static C8_T *_air_mac_address_forward_control_string [] =

+{

+    "Default",

+    "CPU include",

+    "CPU exclude",

+    "CPU only",

+    "Drop"

+};

+

+static AIR_CMD_T regCmds[] =

+{

+    {"r",           doRegRead,      1,      "reg r <reg(4'hex)>"},

+    {"w",           doRegWrite,     2,      "reg w <reg(4'hex)> <value(8'hex)>"},

+

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T phyCL22Cmds[] =

+{

+    {"r",           doPhyCL22Read,  2,      "phy cl22 r <port(0..4)> <reg(2'hex)>"},

+    {"w",           doPhyCL22Write, 3,      "phy cl22 w <port(0..4)> <reg(2'hex)> <value(4'hex)>"},

+

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T phyCL45Cmds[] =

+{

+    {"r",           doPhyCL45Read,  3,      "phy cl45 r <port(0..4)> <dev(2'hex)> <reg(3'hex)>"},

+    {"w",           doPhyCL45Write, 4,      "phy cl45 w <port(0..4)> <dev(2'hex)> <reg(3'hex)> <value(4'hex)>"},

+

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T phyCmds[] =

+{

+    {"cl22",         doPhyCL22,     0,      NULL},

+    {"cl45",         doPhyCL45,     0,      NULL},

+

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T portSetCmds[] =

+{

+    {"matrix",      doPortSetMatrix,        2,                "port set matrix <port(0..6)> <matrix(6:0)>"},

+    {"vlanMode",    doPortSetVlanMode,      2,                "port set vlanMode <port(0..6)> <vlanMode(0:matrix,1:fallback,2:check,3:security)>"},

+    {"flowCtrl",    doFlowCtrl,             3,                "port set flowCtrl <port(0..6)> <dir(0:Tx,1:Rx)> <fc_en(1:En,0:Dis)>"},

+    {"jumbo",       doJumbo,                2,                "port set jumbo <pkt_len(0:1518,1:1536,2:1552,3:max)> <frame_len(2..15)>"},

+    {"anMode",      doAnMode,               2,                "port set anMode <port(0..4)> <en(0:force,1:AN)>"},

+    {"localAdv",    doLocalAdv,             7,                "port set localAdv <port(0..4)> <10H(1:En,0:Dis)> <10F(1:En,0:Dis)> <100H(1:En,0:Dis)> <100F(1:En,0:Dis)> <1000F(1:En,0:Dis)> <pause(1:En,0:Dis)>"},

+    {"speed",       doPortSpeed,            2,                "port set speed <port(0..4)> <speed(0:10M,1:100M,2:1G,3:2.5G)>"},

+    {"duplex",      doPortDuplex,           2,                "port set duplex <port(0..4)> <duplex(0:half,1:full)>"},

+    {"bckPres",     doPortBckPres,          2,                "port set bckPres <port(0..6)> <bckPres(1:En,0:Dis)>"},

+    {"psMode",      doPortPsMode,           3,                "port set psMode <port(0..4)> <ls(1:En,0:Dis)> <eee(1:En,0:Dis)>"},

+    {"smtSpdDwn",   doPortSmtSpdDwn,        3,                "port set smtSpdDwn <port(0..4)> <en(1:En,0:Dis)> <retry(2..5)>"},

+    {"spTag",       doPortSpTag,            2,                "port set spTag <port(0..6)> <en(1:En,0:Dis)>"},

+    {"enable",      doPortEnable,           2,                "port set enable <port(0..4)> <en(1:En,0:Dis)>"},

+    {"5GBaseRMode", doPort5GBaseRMode,      CMD_NO_PARA,      "port set 5GBaseRMode"},

+    {"hsgmiiMode",  doPortHsgmiiMode,       CMD_NO_PARA,      "port set hsgmiiMode"},

+    {"sgmiiMode",   doPortSgmiiMode,        2,                "port set sgmiiMode <mode(0:AN,1:Force)> <speed(0:10M,1:100M,2:1G)>"},

+    {"rmiiMode",    doPortRmiiMode,         1,                "port set rmiiMode <speed(0:10M,1:100M)>"},

+    {"rgmiiMode",   doPortRgmiiMode,        1,                "port set rgmiiMode <speed(0:10M,1:100M,2:1G)>"},

+

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T portGetCmds[] =

+{

+    {"matrix",      doPortGetMatrix,        1,                "port get matrix <port(0..6)>"},

+    {"vlanMode",    doPortGetVlanMode,      1,                "port get vlanMode <port(0..6)>"},

+    {"flowCtrl",    doFlowCtrl,             2,                "port get flowCtrl <port(0..6)> <dir(0:Tx,1:Rx)>"},

+    {"jumbo",       doJumbo,                CMD_NO_PARA,      "port get jumbo"},

+    {"anMode",      doAnMode,               1,                "port get anMode <port(0..4)>"},

+    {"localAdv",    doLocalAdv,             1,                "port get localAdv <port(0..4)>"},

+    {"remoteAdv",   doRemoteAdv,            1,                "port get remoteAdv <port(0..4)>"},

+    {"speed",       doPortSpeed,            1,                "port get speed <port(0..4)>"},

+    {"duplex",      doPortDuplex,           1,                "port get duplex <port(0..4)>"},

+    {"status",      doPortStatus,           1,                "port get status <port(0..4)>"},

+    {"bckPres",     doPortBckPres,          1,                "port get bckPres <port(0..6)>"},

+    {"psMode",      doPortPsMode,           1,                "port get psMode <port(0..4)>"},

+    {"smtSpdDwn",   doPortSmtSpdDwn,        1,                "port get smtSpdDwn <port(0..4)>"},

+    {"spTag",       doPortSpTag,            1,                "port get spTag <port(0..6)>"},

+    {"enable",      doPortEnable,           1,                "port get enable <port(0..4)>"},

+

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T portCmds[] =

+{

+    {"set",         doPortSet,      0,      NULL},

+    {"get",         doPortGet,      0,      NULL},

+

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T sptagCmds[] =

+{

+    {"setEnable",       doSptagEn,          2,      "sptag setEnable port<port(0..6)> enable<1:enable 0:disable>"},

+    {"getEnable",       doSptagEn,          1,      "sptag getEnable port<port(0..6)>"},

+    {"setmode",         doSptagMode,        2,      "sptag setmode port<port(0..6)> mode<0:inset 1:replace>"},

+    {"getmode",         doSptagMode,        1,      "sptag getmode port<port(0..6)>"},

+    {"encode",          doSptagEncode,      7,      "sptag encode mode={ insert | replace } opc={ portmap | portid | lookup } dp={bitimap hex} vpm={ untagged | 8100 | 88a8 } pri=<UINT> cfi=<UINT> vid=<UINT> "},

+    {"decode",          doSptagDecode,      4,      "sptag decode <byte(hex)> <byte(hex)> <byte(hex)> <byte(hex)>"},

+

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T vlanSetCmds[] =

+{

+    {"fid",                 doVlanSetFid,               2,      "vlan set fid <vid(0..4095)> <fid(0..7)>"},

+    {"memPort",             doVlanSetMemPort,           2,      "vlan set memPort <vid(0..4095)> <bitmap(6:0)>"},

+    {"ivl",                 doVlanSetIVL,               2,      "vlan set ivl <vid(0..4095)> <(1:En,0:Dis)>"},

+    {"portBaseStag",        doVlanSetPortBaseStag,      2,      "vlan set portBaseStag <vid(0..4095)> <(1:En,0:Dis)>"},

+    {"stag",                doVlanSetStag,              2,      "vlan set stag <vid(0..4095)> <stag(0..4095)>"},

+    {"egsTagCtlEn",         doVlanSetEgsTagCtlEn,       2,      "vlan set egsTagCtlEn <vid(0..4095)> <(1:En,0:Dis)>"},

+    {"egsTagCtlCon",        doVlanSetEgsTagCtlCon,      2,      "vlan set egsTagCtlCon <vid(0..4095)> <(1:En,0:Dis)>"},

+    {"egsTagCtl",           doVlanSetEgsTagCtl,         3,      "vlan set egsTagCtl <vid(0..4095)> <port(0..6)> <ctlType(0:untag,2:tagged)>"},

+

+    {"portActFrame",        doVlanSetPortActFrame,      2,      "vlan set portActFrame <port(0..6)> <frameType(0:all,1:tagged,2:untagged)>"},

+    {"leakyVlanEn",         doVlanSetLeakyVlanEn,       3,      "vlan set LeakyVlanEn <port(0..6)> <pktType(0:uc,1:mc,2:bc,3:ipmc)> <(1:En,0:Dis)>"},

+    {"portVlanAttr",        doVlanSetPortVlanAttr,      2,      "vlan set portVlanAttr <port(0..6)> <vlanAttr(0:user,1:stack,2:translation,3:transparent)>"},

+    {"igsPortETagAttr",     doVlanSetIgsPortETagAttr,   2,      "vlan set igsPortETagAttr <port(0..6)> <egsTagAttr(0:disable,1:consistent,4:untagged,5:swap,6:tagged,7:stack)>"},

+    {"portEgsTagAttr",      doVlanSetPortETagAttr,      2,      "vlan set portEgsTagAttr <port(0..6)> <egsTagAttr(0:untagged,1:swap,2:tagged,3:stack)>"},

+    {"portOuterTPID",       doVlanSetPortOuterTPID,     2,      "vlan set portOuterTPID <port(0..6)> <TPID(hex)>"},

+    {"pvid",                doVlanSetPvid,              2,      "vlan set pvid <port(0..6)> <vid(0..4095)>"},

+

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T vlanGetCmds[] =

+{

+    {"portActFrame",        doVlanGetPortActFrame,      1,      "vlan get portActFrame <port(0..6)>"},

+    {"leakyVlanEn",         doVlanGetLeakyVlanEn,       1,      "vlan get leakyVlanEn <port(0..6)>"},

+    {"portVlanAttr",        doVlanGetPortVlanAttr,      1,      "vlan get portVlanAttr <port(0..6)>"},

+    {"igsPortETagAttr",     doVlanGetIgsPortETagAttr,   1,      "vlan get igsPortETagAttr <port(0..6)>"},

+    {"portEgsTagAttr",      doVlanGetPortETagAttr,      1,      "vlan get portEgsTagAttr <port(0..6)>"},

+    {"portOuterTPID",       doVlanGetPortOuterTPID,     1,      "vlan get portOuterTPID <port(0..6)>"},

+    {"pvid",                doVlanGetPvid,              1,      "vlan get pvid <port(0..6)>"},

+

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T vlanCmds[] =

+{

+    {"initiate",        doVlanInitiate,         9,      "vlan initiate <vid(0..4095)> <fid(0..7)> <bitmap(6:0)> <ivl(1:En,0:Dis)> <portbasestag(1:En,0:Dis)> <stag(0..4095)> <egstagctlen(1:En,0:Dis)> <egstagcon(1:En,0:Dis)> <taggedbitmap(6:0)>"},

+    {"create",          doVlanCreate,           1,      "vlan create <vid(0..4095)>"},

+    {"destroy",         doVlanDestroy,          1,      "vlan destroy [ <vid(0..4095)> | <vidRange(vid0-vid1)> ]"},

+    {"destroyAll",      doVlanDestroyAll,       0,      "vlan destroyAll [ <restoreDefVlan(0:false,1:true)> | ]"},

+    {"dump",            doVlanDump,             0,      "vlan dump [ <vid(0..4095)> | <vidRange(vid0-vid1)> | ]"},

+    {"addPortMem",      doVlanAddPortMem,       2,      "vlan addPortMem <vid(0..4095)> <port(0..6)>"},

+    {"delPortMem",      doVlanDelPortMem,       2,      "vlan addPortMem <vid(0..4095)> <port(0..6)>"},

+    {"set",             doVlanSet,              0,      NULL},

+    {"get",             doVlanGet,              0,      NULL},

+

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T l2ClearCmds[] =

+{

+    {"mac",              doMacAddr,          CMD_NO_PARA,    "l2 clear mac"},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T l2DelCmds[] =

+{

+    {"mac",             doMacAddr,           3,    "l2 del mac <mac(12'hex)> [ vid <vid(0..4095)> | fid <fid(0..15)> ]"},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T l2AddCmds[] =

+{

+    {"mac",             doMacAddr,           7,    "l2 add mac <static(0:dynamic,1:static)> <unauth(0:auth,1:unauth)> <mac(12'hex)> <portlist(uintlist)> [ vid <vid(0..4095)> | fid <fid(0..15)> ] <src_mac_forward=(0:default,1:cpu-exclude,2:cpu-include,3:cpu-only,4:drop)>"},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T l2SetCmds[] =

+{

+    {"macAddrAgeOut",   doMacAddrAgeOut,    1,    "l2 set macAddrAgeOut <time(1, 1000000)>"},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T l2GetCmds[] =

+{

+    {"mac",             doGetMacAddr,       3,              "l2 get mac <mac(12'hex)> [ vid <vid(0..4095)> | fid <fid(0..15)> ]"},

+    {"macAddrAgeOut",   doMacAddrAgeOut,    CMD_NO_PARA,    "l2 get macAddrAgeOut"},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T l2DumpCmds[] =

+{

+    {"mac",                doDumpMacAddr,        0,    "l2 dump mac"},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T l2Cmds[] =

+{

+    {"add",         doL2Add,        0,        NULL},

+    {"del",         doL2Del,        0,        NULL},

+    {"clear",       doL2Clear,      0,        NULL},

+    {"get",         doL2Get,        0,        NULL},

+    {"set",         doL2Set,        0,        NULL},

+    {"dump",        doL2Dump,       0,        NULL},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T lagGetCmds[] =

+{

+    {"member",      doLagMember,    1,              "lag get member group_id(0 or 1)"},

+    {"dstInfo",     doLagDstInfo,   CMD_NO_PARA,    "lag get dstInfo"},

+    {"ptseed",      doLagPtseed,    CMD_NO_PARA,    "lag get ptseed"},

+    {"hashtype",    doLagHashtype,  CMD_NO_PARA,    "lag get hashtype"},

+    {"state",       doLagState,     CMD_NO_PARA,    "lag get state"},

+    {"spsel",       doLagSpsel,     CMD_NO_PARA,    "lag get spsel"},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T lagSetCmds[] =

+{

+    {"member",       doLagMember,        4,    "lag set member <group_id(0 or 1)> <member_index(0..3)> <enable(0,1)> <port index(0..6)>"},

+    {"dstInfo",      doLagDstInfo,       7,    "lag set dstInfo <sp(1:En,0:Dis)> <sa(1:En,0:Dis)> <da(1:En,0:Dis)> <sip(1:En,0:Dis)> <dip(1:En,0:Dis)> <sport(1:En,0:Dis)> <dport(1:En,0:Dis)>"},

+    {"ptseed",       doLagPtseed,        1,    "lag set ptseed <hex32>"},

+    {"hashtype",     doLagHashtype,      1,    "lag set hashtype <0-crc32lsb;1-crc32msb;2-crc16;3-xor4>"},

+    {"state",        doLagState,         1,    "lag set state <state(1:En,0:Dis)>"},

+    {"spsel",        doLagSpsel,         1,    "lag set spsel <soure port enable(1:En,0:Dis)>"},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T lagCmds[] =

+{

+    {"get",          doLagGet,        0,        NULL},

+    {"set",          doLagSet,        0,        NULL},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T stpGetCmds[] =

+{

+    {"portstate",    doStpPortstate,  2,    "stp get portstate <port(0..6)> <fid(0..15)>"},

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T stpSetCmds[] =

+{

+    {"portstate",    doStpPortstate,  3,    "stp set portstate <port(0..6)> <fid(0..15)> <state(0:disable,1:listen,2:learn,3:forward)>"},

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T stpCmds[] =

+{

+    {"get",         doStpGet,           0,      NULL},

+    {"set",         doStpSet,           0,      NULL},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T mirrorSetCmds[] =

+{

+    {"session",        doMirrorSetSession,       6,      "mirror set session <sid(0,1)> <dst_port(UINT)> <state(1:En,0:Dis)> <tag(1:on, 0:off)> <list(UINTLIST)> <dir(0:none,1:tx,2:rx,3:both)>"},

+    {"session-enable", doMirrorSetSessionEnable, 2,      "mirror set session-enable <sid(0,1)> <state(1:En,0:Dis)>"},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T mirrorAddCmds[] =

+{

+    {"session-rlist",  doMirrorAddRlist,       2,      "mirror add session-rlist <sid(0,1)> <list(UINTLIST)>"},

+    {"session-tlist",  doMirrorAddTlist,       2,      "mirror add session-tlist <sid(0,1)> <list(UINTLIST)>"},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T mirrorGetCmds[] =

+{

+    {"session",        doMirrorGetSid,       1,      "mirror get session <sid(0,1)>"},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T mirrorDelCmds[] =

+{

+    {"session",        doMirrorDelSid,       1,      "mirror del session <sid(0,1)>"},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T mirrorCmds[] =

+{

+    {"set",         doMirrorSet,        0,      NULL},

+    {"add",         doMirrorAdd,        0,      NULL},

+    {"get",         doMirrorGet,        0,      NULL},

+    {"del",         doMirrorDel,        0,      NULL},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T mibClearCmds[] =

+{

+    {"port",        doMibClearPort,     1,      "mib clear port <port(0..6)>"},

+    {"all",         doMibClearPort,     0,      "mib clear all"},

+    {"acl",         doMibClearAcl,      0,      "mib clear acl"},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T mibGetCmds[] =

+{

+    {"port",        doMibGetPort,       1,      "mib get port <port(0..6)>"},

+    {"acl",         doMibGetAcl,        1,      "mib get acl <event(0..7)>"},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T mibCmds[] =

+{

+    {"clear",       doMibClear,         0,      NULL},

+    {"get",         doMibGet,           0,      NULL},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T qosGetCmds[] =

+{

+    {"scheduleAlgo",    doQosScheduleAlgo,      2,  "qos get scheduleAlgo <portlist(UINTLIST)> <queue(UINT)>"},

+    {"trustMode",       doQosTrustMode,         1,  "qos get trustMode <portlist(UINTLIST)>"},

+    {"pri2Queue",       doQosPri2Queue,         0,  "qos get pri2Queue"},

+    {"dscp2Pri",        doQosDscp2Pri,          1,  "qos get dscp2Pri <dscp(0..63)>"},

+    {"rateLimitEnable", doQosRateLimitEnable,   1,  "qos get rateLimitEnable <portlist(UINTLIST)>"},

+    {"rateLimit",       doQosRateLimit,         1,  "qos get rateLimit <portlist(UINTLIST)>"},

+    {"portPriority",    doQosPortPriority,      1,  "qos get portPriority <portlist(UINTLIST)>"},

+    {"rateLmtExMngFrm", doQosRateLimitExMngFrm, 0,  "qos get rateLmtExMngFrm"},

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T qosSetCmds[] =

+{

+    {"scheduleAlgo",    doQosScheduleAlgo,      4,  "qos set scheduleAlgo <portlist(UINTLIST)> <queue(UINT)> <scheduler(0:SP,1:WRR,2:WFQ)> <weight(0..128)>, weight 0 is valid only on sp mode"},

+    {"trustMode",       doQosTrustMode,         2,  "qos set trustMode <portlist(UINTLIST)> <mode(0:port,1:1p-port,2:dscp-port,3:dscp-1p-port>"},

+    {"pri2Queue",       doQosPri2Queue,         2,  "qos set pri2Queue <priority(0..7)> <queue(0..7)>"},

+    {"dscp2Pri",        doQosDscp2Pri,          2,  "qos set dscp2Pri <dscp(0..63)> <priority(0..7)>"},

+    {"rateLimitEnable", doQosRateLimitEnable,   3,  "qos set rateLimitEnable <portlist(UINTLIST)> <dir(0:egress,1:ingress)> <rate_en(1:En,0:Dis)>"},

+    {"rateLimit",       doQosRateLimit,         5,  "qos set rateLimit <portlist(UINTLIST)> <I_CIR(0..80000)> <I_CBS(0..127)> <E_CIR(0..80000)> <E_CBS(0..127)>"},

+    {"portPriority",    doQosPortPriority,      2,  "qos set portPriority <portlist(UINTLIST)> <priority(0..7)>"},

+    {"rateLmtExMngFrm", doQosRateLimitExMngFrm, 2,  "qos set rateLmtExMngFrm <dir(0:egress)> <en(0:include,1:exclude)>"},

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T qosCmds[] =

+{

+    {"get",          doQosGet,        0,        NULL},

+    {"set",          doQosSet,        0,        NULL},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T diagSetCmds[] =

+{

+    {"txComply",    doDiagTxComply,     2,      "diag set txComply <phy(0..5)> <mode(0..8)>"},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T diagGetCmds[] =

+{

+    {"txComply",    doDiagTxComply,     1,      "diag get txComply <phy(0..5)>"},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T diagCmds[] =

+{

+    {"set",         doDiagSet,          0,      NULL},

+    {"get",         doDiagGet,          0,      NULL},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T ledSetCmds[] =

+{

+    {"mode",        doLedMode,          1,      "led set mode <mode(0:disable, 1..3:2 LED, 4:user-define)>"},

+    {"state",       doLedState,         2,      "led set state <led(0..1)> <state(1:En,0:Dis)>"},

+    {"usr",         doLedUsrDef,        4,      "led set usr <led(0..1)> <polarity(0:low, 1:high)> <on_evt(7'bin)> <blink_evt(10'bin)>"},

+    {"time",        doLedBlkTime,       1,      "led set time <time(0..5:32ms~1024ms)>"},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T ledGetCmds[] =

+{

+    {"mode",        doLedMode,          CMD_NO_PARA,      "led get mode"},

+    {"state",       doLedState,         1,                "led get state <led(0..1)>"},

+    {"usr",         doLedUsrDef,        1,                "led get usr <led(0..1)>"},

+    {"time",        doLedBlkTime,       CMD_NO_PARA,      "led get time"},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T ledCmds[] =

+{

+    {"set",         doLedSet,           0,      NULL},

+    {"get",         doLedGet,           0,      NULL},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T showCmds[] =

+{

+    {"version",     doShowVersion,        0,        NULL},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T secGetCmds[] =

+{

+    {"stormEnable",     doStormEnable,   2,  "sec get stormEnable <port(0..6)> <type(0:bcst,1:mcst,2:ucst)>"},

+    {"stormRate",       doStormRate,     2,  "sec get stormRate <port(0..6)> <type(0:bcst,1:mcst,2:ucst)>"},

+    {"fldMode",         doFldMode,       2,  "sec get fldMode <port(0..6)> <type(0:bcst,1:mcst,2:ucst,3:qury>"},

+    {"saLearning",      doSaLearning,    1,  "sec get saLearning <port(0..6)>"},

+    {"saLimit",         doSaLimit,       1,  "sec get saLimit <port(0..6)>"},

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T secSetCmds[] =

+{

+    {"stormEnable",     doStormEnable,   3,  "sec set stormEnable <port(0..6)> <type(0:bcst,1:mcst,2:ucst)> <en(1:En,0:Dis)>"},

+    {"stormRate",       doStormRate,     4,  "sec set stormRate <port(0..6)> <type(0:bcst,1:mcst,2:ucst)> <count(0..255)> <unit(0:64k,1:256k,2:1M,3:4M,4:16M)>"},

+    {"fldMode",         doFldMode,       3,  "sec set fldMode <port(0..6)> <type(0:bcst,1:mcst,2:ucst,3:qury> <en(1:En,0:Dis)>"},

+    {"saLearning",      doSaLearning,    2,  "sec set saLearning <port(0..6)> <learn(0:disable,1:enable)>"},

+    {"saLimit",         doSaLimit,       3,  "sec set saLimit <port(0..6)> <mode(0:disable,1:enable)> <count(0..4095)>"},

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T secCmds[] =

+{

+    {"get",          doSecGet,        0,        NULL},

+    {"set",          doSecSet,        0,        NULL},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T switchSetCmds[] =

+{

+    {"cpuPortEn",   doSwitchCpuPortEn,   1,              "switch set cpuPortEn <cpu_en(1:En,0:Dis)>"},

+    {"cpuPort",     doSwitchCpuPort,     1,              "switch set cpuPort <port_number>"},

+    {"phyLCIntrEn",     doSwitchPhyLCIntrEn,     2,      "switch set phyLCIntrEn <phy(0..6)> <(1:En,0:Dis)>"},

+    {"phyLCIntrSts",    doSwitchPhyLCIntrSts,    2,      "switch set phyLCIntrSts <phy(0..6)> <(1:Clear)>"},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T switchGetCmds[] =

+{

+    {"cpuPortEn",   doSwitchCpuPortEn,   CMD_NO_PARA,      "switch get cpuPortEn"},

+    {"cpuPort",     doSwitchCpuPort,     CMD_NO_PARA,      "switch get cpuPort"},

+    {"phyLCIntrEn",     doSwitchPhyLCIntrEn,     1,        "switch get phyLCIntrEn <phy(0..6)>"},

+    {"phyLCIntrSts",    doSwitchPhyLCIntrSts,    1,        "switch get phyLCIntrSts <phy(0..6)>"},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T switchCmds[] =

+{

+    {"set",         doSwitchSet,        0,      NULL},

+    {"get",         doSwitchGet,        0,      NULL},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T aclSetCmds[] =

+{

+    {"en",              doAclEn,            1,                     "acl set en <en(1:En,0:Dis)>"},

+    {"rule",            doAclRule,          CMD_VARIABLE_PARA,     "acl set rule <idx(0..127)>\n <state(0:Dis,1:En)> <reverse(0:Dis,1:En)> <end(0:Dis,1:En)>\n <portmap(7'bin)><ipv6(0:Dis,1:En,2:Not care)>\n[ dmac <dmac(12'hex)> <dmac_mask(12'hex)> ]\n[ smac <smac(12'hex)> <smac_mask(12'hex)> ]\n[ stag <stag(4'hex)> <stag_mask(4'hex)> ]\n[ ctag <ctag(4'hex)> <ctag_mask(4'hex)> ]\n[ etype <etype(4'hex)> <etype_mask(4'hex)> ]\n[ dip <dip(IPADDR)> <dip_mask(IPADDR)> ]\n[ sip <sip(IPADDR)> <sip_mask(IPADDR)> ]\n[ dscp <dscp(2'hex)> <dscp_mask(2'hex)> ]\n[ protocol <protocol(12'hex)> <protocol_mask(12'hex)> ]\n[ dport <dport(4'hex)> <dport_mask(4'hex)> ]\n[ sport <sport(4'hex)> <sport_mask(4'hex)> ]\n[ flow_label <flow_label(4'hex)> <flow_label_mask(4'hex)> ]\n[ udf <udf(4'hex)> <udf_mask(4'hex)> ] "},

+    {"udfRule",         doAclUdfRule,       7,                     "acl set udfRule <idx(0..15)> <mode(0:pattern, 1:threshold)> [ <pat(4'hex)> <mask(4'hex)> | <low(4'hex)> <high(4'hex)> ] <start(0:MAC header, 1:L2 payload, 2:IPv4 header, 3:IPv6 header, 4:L3 payload, 5:TCP header, 6:UDP header, 7: L4 payload)> <offset(0..127,unit:2 bytes)> <portmap(7'bin)>"},

+    {"action",          doAclAction,        CMD_VARIABLE_PARA,     "acl set action <idx(0..127)> \n[ forward <forward(0:Default,4:Exclude CPU,5:Include CPU,6:CPU only,7:Drop)> ]\n[ egtag <egtag(0:Default,1:Consistent,4:Untag,5:Swap,6:Tag,7:Stack)> ]\n[ mirrormap <mirrormap(2'bin)> ]\n[ priority <priority(0..7)> ]\n[ redirect <redirect(0:Dst,1:Vlan)> <portmap(7'bin)> ]\n[ leaky_vlan <leaky_vlan(1:En,0:Dis)> ]\n[ cnt_idx <cnt_idx(0..63)> ]\n[ rate_idx <rate_idx(0..31)> ] \n[ attack_idx <attack_idx(0..95)> ] \n[ vid <vid(0..4095)> ] \n[ manage <manage(1:En,0:Dis)> ] \n[ bpdu <bpdu(1:En,0:Dis)> ]\n[ class <class(0:Original,1:Defined)>[0..7] ]\n[ drop_pcd <drop_pcd(0:Original,1:Defined)> [red <red(0..7)>][yellow <yellow(0..7)>][green <green(0..7)>] ]\n[ color <color(0:Defined,1:Trtcm)> [ <defined_color(0:Dis,1:Green,2:Yellow,3:Red)> | <trtcm_idx(0..31)> ] ]"},

+    {"trtcm",           doAclTrtcm,         5,                     "acl set trtcm <idx(1..31)> <cir(4'hex)> <pir(4'hex)> <cbs(4'hex)> <pbs(4'hex)>"},

+    {"trtcmEn",         doAclTrtcmEn,       1,                     "acl set trtcmEn <en(1:En,0:Dis)>"},

+    {"portEn",          doAclPortEn,        2,                     "acl set portEn <port(0..6)> <en(1:En,0:Dis)>"},

+    {"dropEn",          doAclDropEn,        2,                     "acl set dropEn <port(0..6)> <en(1:En,0:Dis)>"},

+    {"dropThrsh",       doAclDropThrsh,     5,                     "acl set dropThrsh <port(0..6)> <color(0:green,1:yellow,2:red)> <queue(0..7)> <high(0..2047)> <low(0..2047)>"},

+    {"dropPbb",         doAclDropPbb,       4,                     "acl set dropPbb <port(0..6)> <color(0:green,1:yellow,2:red)> <queue(0..7)> <probability(0..1023)>"},

+    {"meter",           doAclMeter,         3,                     "acl set meter <idx(0..31)> <en(1:En,0:Dis)> <rate(0..65535)>\n Note: Limit rate = rate * 64Kbps"},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T aclGetCmds[] =

+{

+    {"en",              doAclEn,            CMD_NO_PARA,    "acl get en"},

+    {"rule",            doAclRule,          1,              "acl get rule <idx(0..127)> "},

+    {"udfRule",         doAclUdfRule,       1,              "acl get udfRule <idx(0..15)>"},

+    {"action",          doAclAction,        1,              "acl get action <idx(0..127)>"},

+    {"trtcm",           doAclTrtcm,         1,              "acl get trtcm <idx(1..31)>"},

+    {"trtcmEn",         doAclTrtcmEn,       CMD_NO_PARA,    "acl get trtcmEn"},

+    {"portEn",          doAclPortEn,        1,              "acl get portEn <port(0..6)>"},

+    {"dropEn",          doAclDropEn,        1,              "acl get dropEn <port(0..6)>"},

+    {"dropThrsh",       doAclDropThrsh,     3,              "acl get dropThrsh <port(0..6)> <color(0:green,1:yellow,2:red)> <queue(0..7)>"},

+    {"dropPbb",         doAclDropPbb,       3,              "acl get dropPbb <port(0..6)> <color(0:green,1:yellow,2:red)> <queue(0..7)>"},

+    {"meter",           doAclMeter,         1,              "acl get meter <idx(0..31)>"},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T aclDelCmds[] =

+{

+    {"rule",        doAclRmvRule,          1,         "acl del rule <idx(0..127)>"},

+    {"udfRule",     doAclRmvUdfRule,       1,         "acl del udfRule <idx(0..15)>"},

+    {"action",      doAclRmvAction,        1,         "acl del action <idx(0..127)>"},

+    {"trtcm",       doAclRmvTrtcm,         1,         "acl del trtcm <idx(0..31)>"},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T aclClearCmds[] =

+{

+    {"rule",        doAclRmvRule,          CMD_NO_PARA,       "acl clear rule"},

+    {"udfRule",     doAclRmvUdfRule,       CMD_NO_PARA,       "acl clear udfRule"},

+    {"action",      doAclRmvAction,        CMD_NO_PARA,       "acl clear action"},

+    {"trtcm",       doAclRmvTrtcm,         CMD_NO_PARA,       "acl clear trtcm"},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T aclCmds[] =

+{

+    {"set",         doAclSet,           0,      NULL},

+    {"get",         doAclGet,           0,      NULL},

+    {"del",         doAclDel,           0,      NULL},

+    {"clear",       doAclClear,         0,      NULL},

+    {"dump",        doAclDump,          0,      NULL},

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+static AIR_CMD_T Cmds[] =

+{

+    {"reg",         doReg,          0,      NULL},

+    {"phy",         doPhy,          0,      NULL},

+    {"port",        doPort,         0,      NULL},

+    {"vlan",        doVlan,         0,      NULL},

+    {"l2",          doL2,           0,      NULL},

+    {"lag",         doLag,          0,      NULL},

+    {"stp",         doStp,          0,      NULL},

+    {"mirror",      doMirror,       0,      NULL},

+    {"mib",         doMib,          0,      NULL},

+    {"qos",         doQos,          0,      NULL},

+    {"diag",        doDiag,         0,      NULL},

+    {"led",         doLed,          0,      NULL},

+    {"switch",      doSwitch,       0,      NULL},

+    {"show",        doShow,         0,      NULL},

+    {"sec",         doSec,          0,      NULL},

+    {"acl",         doAcl,          0,      NULL},

+    {"sptag",       doSptag,        0,      NULL},

+

+    /* last entry, do not modify this entry */

+    {NULL, NULL, 0, NULL},

+};

+

+/* EXPORTED SUBPROGRAM BODIES

+*/

+

+/* LOCAL SUBPROGRAM BODIES

+*/

+static BOOL_T

+_strcmp(const char *s1, const char *s2)

+{

+    while(*s1 == *s2++)

+        if (*s1++ == '\0')

+            return (0);

+    return (*(const unsigned char *)s1 - *(const unsigned char *)(s2 -1));

+}

+

+static C8_T *

+_strtok_r(

+    C8_T *s,

+    const C8_T *delim,

+    C8_T **last)

+{

+    char *spanp;

+    int c = 0, sc = 0;

+    char *tok;

+

+    if (s == NULL && (s = *last) == NULL)

+    {

+        return (NULL);

+    }

+

+    /*

+     * Skip (span) leading delimiters (s += strspn(s, delim), sort of).

+     */

+    for (;;)

+    {

+        c = *s++;

+        spanp = (char *)delim;

+        do

+        {

+            if (c == (sc = *spanp++))

+            {

+                break;

+            }

+        } while (sc != 0);

+        if (sc == 0)

+        {

+            break;

+        }

+    }

+

+    if (c == 0)

+    {   /* no non-delimiter characters */

+        *last = NULL;

+        return (NULL);

+    }

+    tok = s - 1;

+

+    /*

+     * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).

+     * Note that delim must have one NUL; we stop if we see that, too.

+     */

+    for (;;)

+    {

+        c = *s++;

+        spanp = (char *)delim;

+        do

+        {

+            if ((sc = *spanp++) == c)

+            {

+                if (c == 0)

+                {

+                    s = NULL;

+                }

+                else

+                {

+                    s[-1] = 0;

+                }

+                *last = s;

+                return (tok);

+            }

+        } while (sc != 0);

+    }

+    /* NOTREACHED */

+}

+

+static C8_T *

+_strtok(

+    C8_T *s,

+    const C8_T *delim,

+    C8_T **last)

+{

+    return _strtok_r(s, delim, last);

+}

+

+UI32_T

+_strtoul(

+    const C8_T *cp,

+    C8_T **endp,

+    UI32_T base)

+{

+    UI32_T result = 0, value = 0;

+

+    if (!base)

+    {

+        base = 10;

+        if (*cp == '0')

+        {

+            base = 8;

+            cp++;

+            if ((TOLOWER(*cp) == 'x') && isxdigit(cp[1]))

+            {

+                cp++;

+                base = 16;

+            }

+        }

+    }

+    else if (base == 16)

+    {

+        if (cp[0] == '0' && TOLOWER(cp[1]) == 'x')

+        {

+            cp += 2;

+        }

+    }

+    while (isxdigit(*cp) &&

+           (value = isdigit(*cp) ? *cp-'0' : TOLOWER(*cp)-'a'+10) < base)

+    {

+        result = result*base + value;

+        cp++;

+    }

+    if (endp)

+    {

+        *endp = (char *)cp;

+    }

+    return result;

+}

+

+static I32_T

+_strtol(

+    const C8_T *cp,

+    C8_T **endp,

+    UI32_T base)

+{

+    if(*cp=='-')

+    {

+        return -_strtoul(cp + 1, endp, base);

+    }

+    return _strtoul(cp, endp, base);

+}

+

+static AIR_ERROR_NO_T

+_str2mac(

+        C8_T *str,

+        C8_T *mac)

+{

+    UI32_T i = 0;

+    C8_T tmpstr[3];

+

+    /* check str */

+    AIR_CHECK_PTR(str);

+    AIR_PARAM_CHK(strlen(str) != AIR_MAC_LEN, AIR_E_BAD_PARAMETER);

+    AIR_CHECK_PTR(mac);

+

+    for(i=0; i<6; i++)

+    {

+        strncpy(tmpstr, str+(i*2), 2);

+        tmpstr[2] = '\0';

+        mac[i] = _strtoul(tmpstr, NULL, 16);

+    }

+

+    return AIR_E_OK;

+}

+

+static AIR_ERROR_NO_T

+_str2ipv4(

+    const C8_T *ptr_str,

+    UI32_T     *ptr_addr)

+{

+    UI32_T value = 0, idx = 0, shift = 0;

+

+    AIR_CHECK_PTR(ptr_str);

+    AIR_CHECK_PTR(ptr_addr);

+

+    /* e.g. 192.168.1.2, strlen = 11 */

+    for (idx = 0; idx < strlen(ptr_str); idx++)

+    {

+        if (('0' <= ptr_str[idx]) && ('9' >= ptr_str[idx]))

+        {

+            value = (value * 10) + (ptr_str[idx] - '0');

+        }

+        else if ('.' == ptr_str[idx])

+        {

+            CMD_CHECK_PARA(value, <, 256); /* Error: invalid value */

+            CMD_CHECK_PARA(shift, <, 4);   /* Error: mem-overwrite */

+            *ptr_addr |= value << (24 - shift * 8);

+            shift += 1;

+            value = 0;

+        }

+        else

+        {

+            return AIR_E_BAD_PARAMETER; /* Error: not a digit number or dot */

+        }

+    }

+    CMD_CHECK_PARA(value, <, 256); /* Error: invalid value */

+    CMD_CHECK_PARA(shift, ==, 3);  /* Error: not an ipv4 addr */

+    *ptr_addr |= value << (24 - shift * 8);

+

+    return AIR_E_OK;

+}

+

+AIR_ERROR_NO_T

+_str2ipv6(

+    const C8_T  *ptr_str,

+    UI8_T       *ptr_addr)

+{

+    UI32_T              hex_value = 0, dec_value = 0, idx = 0;

+    BOOL_T              double_colon = FALSE, ipv4_compatible = FALSE;

+    UI32_T              double_colon_pos = 0, last_pos = 0;

+    UI8_T               tmp_ipv6[16] = {0};

+

+    AIR_CHECK_PTR(ptr_str);

+    AIR_CHECK_PTR(ptr_addr);

+

+    /* e.g. invalid:

+     * 3ffe::c0a8:0:      last cannot be colon except double-colon

+     * 3ffe:::c0a8:0      triple-colon

+     * 3ffe::c0a8::0      two double-colons

+     */

+

+    /* e.g. valid:

+     * 3ffe::c0a8:0       strlen = 12 (double-colon in middle)

+     * 3ffe:c0a8:0::      strlen = 13 (double-colon in last)

+     * ::3ffe:c0a8:0      strlen = 13 (double-colon in first)

+     * 3ffe::192.168.0.0  strlen = 17 (IPv4-compatible address)

+     */

+    for (idx = 0; idx < strlen(ptr_str); idx++)

+    {

+        if (('0' <= ptr_str[idx]) && ('9' >= ptr_str[idx]))

+        {

+            hex_value = (hex_value << 4) + (ptr_str[idx] - '0');

+            dec_value = (dec_value * 10) + (ptr_str[idx] - '0');

+        }

+        else if (('a' <= ptr_str[idx]) && ('f' >= ptr_str[idx]))

+        {

+            hex_value = (hex_value << 4) + (ptr_str[idx] - 'a') + 10;

+        }

+        else if (('A' <= ptr_str[idx]) && ('F' >= ptr_str[idx]))

+        {

+            hex_value = (hex_value << 4) + (ptr_str[idx] - 'A') + 10;

+        }

+        else if (':' == ptr_str[idx])

+        {

+            /* must belong to double-colon, calculate from last */

+            if (0 == idx)

+            {

+                continue;

+            }

+            /* not the first ch but a double-colon */

+            else if (':' == ptr_str[idx - 1])

+            {

+                CMD_CHECK_PARA(double_colon, ==, FALSE); /* Error: triple-colon or two double-colons */

+                double_colon = TRUE;

+            }

+            /* not the first ch and a double-colon */

+            else

+            {

+                CMD_CHECK_PARA(double_colon_pos, <, 15); /* Error: only 16 units for UI8_T  */

+                CMD_CHECK_PARA(last_pos,         <, 15); /* Error: only 16 units for UI8_T  */

+                tmp_ipv6[last_pos]     = (UI8_T)((hex_value >> 8) & 0xff);

+                tmp_ipv6[last_pos + 1] = (UI8_T)((hex_value >> 0) & 0xff);

+                double_colon_pos += (FALSE == double_colon)? 2 : 0;

+                last_pos += 2;

+                hex_value = 0;

+                dec_value = 0;

+            }

+        }

+        else if ('.' == ptr_str[idx])

+        {

+            CMD_CHECK_PARA(last_pos, <, 16); /* Error: only 16 units for UI8_T  */

+            tmp_ipv6[last_pos] = dec_value;

+            last_pos += 1;

+            dec_value = 0;

+            ipv4_compatible = TRUE;

+        }

+        else

+        {

+            return AIR_E_BAD_PARAMETER; /* Error: not a hex number or colon */

+        }

+    }

+

+    /* last data */

+    if (':' != ptr_str[idx - 1])

+    {

+        if (FALSE == ipv4_compatible)

+        {

+            CMD_CHECK_PARA(last_pos, <, 15); /* Error: only 16 units for UI8_T  */

+            tmp_ipv6[last_pos]     = (UI8_T)((hex_value >> 8) & 0xff);

+            tmp_ipv6[last_pos + 1] = (UI8_T)((hex_value >> 0) & 0xff);

+            last_pos += 2;

+        }

+        else

+        {

+            CMD_CHECK_PARA(last_pos, <, 16); /* Error: only 16 units for UI8_T  */

+            tmp_ipv6[last_pos] = dec_value;

+            last_pos += 1;

+        }

+    }

+    else

+    {

+        if (':' != ptr_str[idx - 2])

+        {

+            return AIR_E_BAD_PARAMETER; /* Error: last cannot be colon except double-colon */

+        }

+    }

+

+    /* move tmp_ipv6 to ptr_value */

+    if (TRUE == double_colon)

+    {

+        /* e.g.

+         * 3ffe::c0a8:0       double_colon_pos = 2, last_pos = 4+2, tmp_ipv6 = {3f,fe,c0,a8,00,00,...}

+         * 3ffe:c0a8:0::      double_colon_pos = 6, last_pos = 6,   tmp_ipv6 = {3f,fe,c0,a8,00,00,...}

+         * ::3ffe:c0a8:0      double_colon_pos = 0, last_pos = 4+2, tmp_ipv6 = {3f,fe,c0,a8,00,00,...}

+         * 3ffe::192.168.0.0  double_colon_pos = 2, last_pos = 5+1, tmp_ipv6 = {3f,fe,c0,a8,00,00,...}

+         *

+         *                                 0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f

+         * 3ffe::c0a8:0       ptr_value = {3f,fe,--,--,--,--,--,--,--,--,--,--,--,--,--,--}

+         * 3ffe:c0a8:0::      ptr_value = {3f,fe,c0,a8,00,00,--,--,--,--,--,--,--,--,--,--}

+         * ::3ffe:c0a8:0      ptr_value = {--,--,--,--,--,--,--,--,--,--,--,--,--,--,--,--}

+         * 3ffe::192.168.0.0  ptr_value = {3f,fe,--,--,--,--,--,--,--,--,--,--,--,--,--,--}

+         */

+        for (idx = 0; idx < double_colon_pos; idx++)

+        {

+            ptr_addr[idx] = tmp_ipv6[idx];

+        }

+        /* e.g.

+         *                                 0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f

+         * 3ffe::c0a8:0       ptr_value = {3f,fe,--,--,--,--,--,--,--,--,--,--,c0,a8,00,00}

+         * 3ffe:c0a8:0::      ptr_value = {3f,fe,c0,a8,00,00,--,--,--,--,--,--,--,--,--,--}

+         * ::3ffe:c0a8:0      ptr_value = {--,--,--,--,--,--,--,--,--,--,3f,fe,c0,a8,00,00}

+         * 3ffe::192.168.0.0  ptr_value = {3f,fe,--,--,--,--,--,--,--,--,--,--,c0,a8,00,00}

+         */

+        for (idx = double_colon_pos; idx < last_pos; idx++)

+        {

+            ptr_addr[16 - (last_pos - idx)] = tmp_ipv6[idx];

+        }

+    }

+    else

+    {

+        for (idx = 0; idx < 16; idx++)

+        {

+            ptr_addr[idx] = tmp_ipv6[idx];

+        }

+    }

+

+    return AIR_E_OK;

+}

+

+void

+_showIpv6Str(

+    const UI8_T *ptr_ipv6,

+    C8_T *ptr_str)

+{

+    UI32_T idx = 0, next = 0, last = 16;

+    UI32_T cont_zero = 0;

+

+    while (idx < last)

+    {

+        if ((0 == cont_zero) && (0 == ptr_ipv6[idx]) && (0 == ptr_ipv6[idx + 1]))

+        {

+            next = idx + 2;

+

+            while (next < last)

+            {

+                if ((ptr_ipv6[next]) || (ptr_ipv6[next + 1]))

+                {

+                    AIR_PRINT(

+                            ptr_str + strlen(ptr_str),

+                            40 - strlen(ptr_str),

+                            "%s", (cont_zero) ? (":") : (":0"));

+                    break;

+                }

+

+                if (0 == cont_zero)

+                {

+                    cont_zero = 1;

+                }

+                next += 2;

+            }

+

+            if (next == last)

+            {

+

+                AIR_PRINT(

+                        ptr_str + strlen(ptr_str),

+                        40 - strlen(ptr_str),

+                        "%s", (cont_zero) ? ("::") : (":0"));

+            }

+

+            idx = next;

+        }

+        else

+        {

+            if (idx)

+            {

+                AIR_PRINT(

+                    ptr_str + strlen(ptr_str),

+                    40 - strlen(ptr_str),

+                    ":");

+            }

+

+            if (ptr_ipv6[idx])

+            {

+                AIR_PRINT(

+                    ptr_str + strlen(ptr_str),

+                    40 - strlen(ptr_str),

+                    "%0x%02x", ptr_ipv6[idx], ptr_ipv6[idx + 1]);

+            }

+            else

+            {

+                AIR_PRINT(

+                    ptr_str + strlen(ptr_str),

+                    40 - strlen(ptr_str),

+                    "%0x", ptr_ipv6[idx + 1]);

+            }

+

+            idx += 2;

+        }

+    }

+}

+

+static AIR_ERROR_NO_T

+_hex2bit(

+        const UI32_T hex,

+        UI32_T *ptr_bit)

+{

+    UI32_T i = 0;

+

+    /* Mistake proofing */

+    AIR_CHECK_PTR(ptr_bit);

+

+    (*ptr_bit) = 0;

+    for(i=0; i<AIR_MAX_NUM_OF_PORTS; i++)

+    {

+        if(hex & BIT(i))

+        {

+            (*ptr_bit) |= BITS_OFF_L(1UL, 4*(AIR_MAX_NUM_OF_PORTS - i - 1), 4);

+        }

+    }

+    return AIR_E_OK;

+}

+

+static AIR_ERROR_NO_T

+_hex2bitstr(

+        const UI32_T hex,

+        C8_T *ptr_bit_str,

+        UI32_T str_len)

+{

+    UI32_T i = 0;

+    C8_T str_bitmap[AIR_MAX_NUM_OF_PORTS+1];

+

+    /* Mistake proofing */

+    AIR_CHECK_PTR(ptr_bit_str);

+    AIR_PARAM_CHK(str_len <= AIR_MAX_NUM_OF_PORTS, AIR_E_BAD_PARAMETER);

+

+    memset(str_bitmap, 0, AIR_MAX_NUM_OF_PORTS+1);

+

+    for(i=0; i<AIR_MAX_NUM_OF_PORTS; i++)

+    {

+        if(hex & BIT(i))

+        {

+            str_bitmap[i] = '1';

+        }

+        else

+        {

+            str_bitmap[i] = '-';

+        }

+    }

+    str_bitmap[i] = '\0';

+    strncpy(ptr_bit_str, str_bitmap, i+1);

+

+    return AIR_E_OK;

+}

+

+static AIR_ERROR_NO_T

+_portListStr2Ary(

+    const C8_T *str,

+    UI32_T *ary,

+    const UI32_T ary_num)

+{

+    UI32_T i = 0;

+    UI32_T str_len = 0;

+    UI32_T val = 0;

+    C8_T *str2;

+    C8_T *pch;

+    C8_T *last;

+

+    /* Mistake proofing */

+    AIR_CHECK_PTR(str);

+    AIR_CHECK_PTR(ary);

+    AIR_PARAM_CHK(0 == ary_num, AIR_E_BAD_PARAMETER);

+

+    /* Allocate new string */

+    str_len = strlen(str);

+    str2 = AIR_MALLOC(str_len+1);

+    AIR_CHECK_PTR(str2);

+    memset(str2, 0, str_len+1);

+    strncpy(str2, str, str_len+1);

+

+    /* clear array */

+    memset(ary, 0, ary_num*4);

+

+    /* split string by ',' */

+    pch = _strtok(str2, ",", &last);

+    while(NULL != pch)

+    {

+        val = _strtoul(pch, NULL, 0);

+        ary[val/32] |= BIT(val%32);

+        pch = _strtok(NULL, ",", &last);

+    }

+

+    AIR_FREE(str2);

+    return AIR_E_OK;

+}

+

+static AIR_ERROR_NO_T

+doRegRead(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    UI32_T reg = 0, val = 0;

+

+    reg = _strtoul(argv[0], NULL, 16);

+    aml_readReg(0, reg, &val);

+    AIR_PRINT("Read reg=0x%x, value=0x%x\n", reg, val);

+

+    return AIR_E_OK;

+}

+

+static AIR_ERROR_NO_T

+doRegWrite(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    UI32_T reg = 0, val = 0;

+

+    reg = _strtoul(argv[0], NULL, 16);

+    val = _strtoul(argv[1], NULL, 16);

+    aml_writeReg(0, reg, val);

+    AIR_PRINT("Write reg=0x%x, value=0x%x\n", reg, val);

+

+    return AIR_E_OK;

+}

+

+static AIR_ERROR_NO_T

+doReg(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(regCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doPhyCL22Read(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    UI32_T port = 0, reg = 0, val = 0;

+

+    port = _strtoul(argv[0], NULL, 0);

+    reg  = _strtoul(argv[1], NULL, 16);

+    aml_readPhyReg(0, port, reg, &val);

+    AIR_PRINT("Phy read port=%d, reg=0x%x, value=0x%x\n", port, reg, val);

+

+    return AIR_E_OK;

+}

+

+static AIR_ERROR_NO_T

+doPhyCL22Write(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    UI32_T port = 0, reg = 0, val = 0;

+

+    port = _strtoul(argv[0], NULL, 0);

+    reg  = _strtoul(argv[1], NULL, 16);

+    val  = _strtoul(argv[2], NULL, 16);

+    aml_writePhyReg(0, port, reg, val);

+    AIR_PRINT("Phy write port=%d, reg=0x%x, value=0x%x\n", port, reg, val);

+

+    return AIR_E_OK;

+}

+

+static AIR_ERROR_NO_T

+doPhyCL22(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(phyCL22Cmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doPhyCL45Read(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    UI32_T port = 0, dev = 0, reg = 0, val = 0;

+

+    port = _strtoul(argv[0], NULL, 0);

+    dev  = _strtoul(argv[1], NULL, 16);

+    reg  = _strtoul(argv[2], NULL, 16);

+    aml_readPhyRegCL45(0, port, dev, reg, &val);

+    AIR_PRINT("Phy read port=%d, dev=0x%x, reg=0x%x, value=0x%x\n", port, dev, reg, val);

+

+    return AIR_E_OK;

+}

+

+static AIR_ERROR_NO_T

+doPhyCL45Write(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    UI32_T port = 0, dev = 0, reg = 0, val = 0;

+

+    port = _strtoul(argv[0], NULL, 0);

+    dev  = _strtoul(argv[1], NULL, 16);

+    reg  = _strtoul(argv[2], NULL, 16);

+    val  = _strtoul(argv[3], NULL, 16);

+    aml_writePhyRegCL45(0, port, dev, reg, val);

+    AIR_PRINT("Phy write port=%d, dev=0x%x, reg=0x%x, value=0x%x\n", port, dev, reg, val);

+

+    return AIR_E_OK;

+}

+

+static AIR_ERROR_NO_T

+doPhyCL45(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(phyCL45Cmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doPhy(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(phyCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doPortSetMatrix(UI32_T argc, C8_T *argv[])

+{

+    UI32_T port = 0;

+    UI32_T matrix = 0;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    port   = _strtoul(argv[0], NULL, 0);

+    matrix = _strtoul(argv[1], NULL, 16);

+    rc = air_port_setPortMatrix(0, port, matrix);

+    if (rc != AIR_E_OK)

+    {

+        AIR_PRINT("Error: Operation failed!\n");

+    }

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doPortSetVlanMode(UI32_T argc, C8_T *argv[])

+{

+    UI32_T port = 0;

+    AIR_PORT_VLAN_MODE_T vlan_mode;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    port      = _strtoul(argv[0], NULL, 0);

+    vlan_mode = _strtoul(argv[1], NULL, 0);

+    rc = air_port_setVlanMode(0, port, vlan_mode);

+    if (rc != AIR_E_OK)

+    {

+        AIR_PRINT("Error: Operation failed!\n");

+    }

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doPortSet(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(portSetCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doPortGetMatrix(UI32_T argc, C8_T *argv[])

+{

+    UI32_T port = 0;

+    UI32_T matrix = 0;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    port = _strtoul(argv[0], NULL, 0);

+    rc = air_port_getPortMatrix(0, port, &matrix);

+    if (rc != AIR_E_OK)

+    {

+        AIR_PRINT("Error: Operation failed!\n");

+        return rc;

+    }

+    AIR_PRINT("Port %d Matrix: %2x\n", port, matrix);

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doPortGetVlanMode(UI32_T argc, C8_T *argv[])

+{

+    UI32_T port = 0;

+    AIR_PORT_VLAN_MODE_T vlan_mode;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    port = _strtoul(argv[0], NULL, 0);

+    rc = air_port_getVlanMode(0, port, &vlan_mode);

+    if (rc != AIR_E_OK)

+    {

+        AIR_PRINT("Error: Operation failed!\n");

+        return rc;

+    }

+    AIR_PRINT("Port %d Vlan Mode: ", port);

+    switch(vlan_mode)

+    {

+        case AIR_PORT_VLAN_MODE_PORT_MATRIX:

+            AIR_PRINT("matrix(%d)\n", vlan_mode);

+            break;

+        case AIR_PORT_VLAN_MODE_FALLBACK:

+            AIR_PRINT("fallback(%d)\n", vlan_mode);

+            break;

+        case AIR_PORT_VLAN_MODE_CHECK:

+            AIR_PRINT("check(%d)\n", vlan_mode);

+            break;

+        case AIR_PORT_VLAN_MODE_SECURITY:

+            AIR_PRINT("security(%d)\n", vlan_mode);

+            break;

+        default:

+            AIR_PRINT("unknown(%d)\n", vlan_mode);

+            break;

+    };

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doPortGet(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(portGetCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doPort(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(portCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doVlanInitiate(UI32_T argc, C8_T *argv[])

+{

+    UI16_T vid = 0;

+    AIR_VLAN_ENTRY_ATTR_T vlan_entry = {0};

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    vid = _strtoul(argv[0], NULL, 0);

+    if (9 == argc)

+    {

+        vlan_entry.vlan_entry_format.fid           = _strtoul(argv[1], NULL, 0);

+        vlan_entry.vlan_entry_format.port_mem      = _strtoul(argv[2], NULL, 0);

+        vlan_entry.vlan_entry_format.ivl           = _strtoul(argv[3], NULL, 0);

+        vlan_entry.vlan_entry_format.port_stag     = _strtoul(argv[4], NULL, 0);

+        vlan_entry.vlan_entry_format.stag          = _strtoul(argv[5], NULL, 0);

+        vlan_entry.vlan_entry_format.eg_ctrl_en    = _strtoul(argv[6], NULL, 0);

+        vlan_entry.vlan_entry_format.eg_con        = _strtoul(argv[7], NULL, 0);

+        vlan_entry.vlan_entry_format.eg_ctrl       = _strtoul(argv[8], NULL, 0);

+

+        rc = air_vlan_create(0, vid, &vlan_entry);

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        rc = AIR_E_BAD_PARAMETER;

+    }

+

+    switch (rc)

+    {

+        case     AIR_E_OK:                                                            break;

+        case     AIR_E_ENTRY_EXISTS:  AIR_PRINT("VLAN already exist!\n");             break;

+        default:                      AIR_PRINT("Error %d: Operation failed!\n", rc); break;

+    }

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanCreate(UI32_T argc, C8_T *argv[])

+{

+    UI16_T vid = 0;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    vid = _strtoul(argv[0], NULL, 0);

+    rc  = air_vlan_create(0, vid, NULL);

+

+    switch (rc)

+    {

+        case     AIR_E_OK:                                                            break;

+        case     AIR_E_ENTRY_EXISTS:  AIR_PRINT("VLAN already exist!\n");             break;

+        default:                      AIR_PRINT("Error %d: Operation failed!\n", rc); break;

+    }

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanDestroy(UI32_T argc, C8_T *argv[])

+{

+    C8_T *token = NULL;

+    UI16_T vid = 0, vid_limit = AIR_VLAN_ID_MAX;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    if (argc > 0)

+    {

+        if (isdigit(argv[0][0]))

+        {

+            token = _strtok(argv[0], "-", &argv[0]);

+            vid = _strtoul(token, NULL, 0);

+            if ((token = _strtok(argv[0], "-", &argv[0])))

+                vid_limit = _strtoul(token, NULL, 0);

+            else

+                vid_limit = vid;

+            if (AIR_VLAN_ID_MAX < vid_limit)

+            {

+                AIR_PRINT("vid number should less than %d!\n", AIR_VLAN_ID_MAX);

+                return AIR_E_BAD_PARAMETER;

+            }

+            if (vid > vid_limit)

+            {

+                AIR_PRINT("vid0 should less than vid1!\n");

+                return AIR_E_BAD_PARAMETER;

+            }

+        }

+        else

+        {

+            AIR_PRINT("Bad parameter!\n");

+            return AIR_E_BAD_PARAMETER;

+        }

+    }

+

+    for (; vid <= vid_limit; vid++)

+    {

+        rc = air_vlan_destroy(0, vid);

+    }

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanDestroyAll(UI32_T argc, C8_T *argv[])

+{

+    UI32_T restore_def_vlan = 0;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    if (argc > 0)

+    {

+        restore_def_vlan = _strtoul(argv[0], NULL, 0);

+    }

+

+    rc = air_vlan_destroyAll(0, restore_def_vlan);

+    if (rc != AIR_E_OK)

+    {

+        AIR_PRINT("Error: Operation failed!\n");

+    }

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanDump(UI32_T argc, C8_T *argv[])

+{

+    C8_T *token = NULL;

+    UI16_T port = 0, valid_count = 0, vid = 0, vid_limit = AIR_VLAN_ID_MAX;

+    AIR_PORT_EGS_TAG_ATTR_T tag_ctl[AIR_MAX_NUM_OF_PORTS] = {0};

+    AIR_VLAN_ENTRY_T vlan_entry = {0};

+

+    if (argc > 0)

+    {

+        if (isdigit(argv[0][0]))

+        {

+            token = _strtok(argv[0], "-", &argv[0]);

+            vid = _strtoul(token, NULL, 0);

+            if ((token = _strtok(argv[0], "-", &argv[0])))

+                vid_limit = _strtoul(token, NULL, 0);

+            else

+                vid_limit = vid;

+            if (AIR_VLAN_ID_MAX < vid_limit)

+            {

+                AIR_PRINT("vid number should less than %d!\n", AIR_VLAN_ID_MAX);

+                return AIR_E_BAD_PARAMETER;

+            }

+            if (vid > vid_limit)

+            {

+                AIR_PRINT("vid0 should less than vid1!\n");

+                return AIR_E_BAD_PARAMETER;

+            }

+        }

+        else

+        {

+            AIR_PRINT("Bad parameter!\n");

+            return AIR_E_BAD_PARAMETER;

+        }

+    }

+

+    for (valid_count = 0; vid <= vid_limit; vid++)

+    {

+        _air_vlan_readEntry(0, vid, &vlan_entry);

+        if (vlan_entry.valid)

+        {

+            valid_count++;

+            if (1 == valid_count)

+                AIR_PRINT(" Vid Fid MemPort Ivl PortBaseStag Stag EgsTagCtlEn EgsTagCon EgsTagCtl\n======================================================================\n");

+            for (port = 0; port < AIR_MAX_NUM_OF_PORTS; port++)

+                tag_ctl[port] = (vlan_entry.vlan_entry_format.eg_ctrl >> (port * 2)) & 0x3;

+            AIR_PRINT("%4d %3d      %2x %3d %12d %4d %11d %9d   %1x%1x%1x%1x%1x%1x%1x\n",

+                vid, vlan_entry.vlan_entry_format.fid, vlan_entry.vlan_entry_format.port_mem, vlan_entry.vlan_entry_format.ivl,

+                vlan_entry.vlan_entry_format.port_stag, vlan_entry.vlan_entry_format.stag, vlan_entry.vlan_entry_format.eg_ctrl_en, vlan_entry.vlan_entry_format.eg_con,

+                tag_ctl[6], tag_ctl[5], tag_ctl[4], tag_ctl[3], tag_ctl[2], tag_ctl[1], tag_ctl[0]);

+        }

+    }

+

+    if (!valid_count)

+        AIR_PRINT("not found!\n");

+    else

+        AIR_PRINT("Found %d valid entries!\n", valid_count);

+

+    return AIR_E_OK;

+}

+

+static AIR_ERROR_NO_T

+doVlanAddPortMem(UI32_T argc, C8_T *argv[])

+{

+    UI16_T vid = 0, port = 0;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    vid  = _strtoul(argv[0], NULL, 0);

+    port = _strtoul(argv[1], NULL, 0);

+    rc = air_vlan_addMemberPort(0, vid, port);

+    switch (rc)

+    {

+        case     AIR_E_OK:                                                               break;

+        case     AIR_E_ENTRY_NOT_FOUND:  AIR_PRINT("VLAN not found!\n");                 break;

+        default:                         AIR_PRINT("Error %d: Operation failed!\n", rc); break;

+    }

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanDelPortMem(UI32_T argc, C8_T *argv[])

+{

+    UI16_T vid = 0, port = 0;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    vid  = _strtoul(argv[0], NULL, 0);

+    port = _strtoul(argv[1], NULL, 0);

+    rc = air_vlan_delMemberPort(0, vid, port);

+    switch (rc)

+    {

+        case     AIR_E_OK:                                                               break;

+        case     AIR_E_ENTRY_NOT_FOUND:  AIR_PRINT("VLAN not found!\n");                 break;

+        default:                         AIR_PRINT("Error %d: Operation failed!\n", rc); break;

+    }

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanSetFid(UI32_T argc, C8_T *argv[])

+{

+    UI16_T vid = 0;

+    UI8_T  fid = 0;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    vid = _strtoul(argv[0], NULL, 0);

+    fid = _strtoul(argv[1], NULL, 0);

+    rc = air_vlan_setFid(0, vid, fid);

+    switch (rc)

+    {

+        case     AIR_E_OK:                                                               break;

+        case     AIR_E_ENTRY_NOT_FOUND:  AIR_PRINT("VLAN not found!\n");                 break;

+        default:                         AIR_PRINT("Error %d: Operation failed!\n", rc); break;

+    }

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanSetMemPort(UI32_T argc, C8_T *argv[])

+{

+    UI16_T vid = 0, port_bitmap = 0;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    vid         = _strtoul(argv[0], NULL, 0);

+    port_bitmap = _strtoul(argv[1], NULL, 16);

+    rc = air_vlan_setMemberPort(0, vid, port_bitmap);

+    switch (rc)

+    {

+        case     AIR_E_OK:                                                               break;

+        case     AIR_E_ENTRY_NOT_FOUND:  AIR_PRINT("VLAN not found!\n");                 break;

+        default:                         AIR_PRINT("Error %d: Operation failed!\n", rc); break;

+    }

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanSetIVL(UI32_T argc, C8_T *argv[])

+{

+    UI16_T vid = 0;

+    BOOL_T enable = TRUE;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    vid    = _strtoul(argv[0], NULL, 0);

+    enable = _strtoul(argv[1], NULL, 0);

+    rc = air_vlan_setIVL(0, vid, enable);

+    switch (rc)

+    {

+        case     AIR_E_OK:                                                               break;

+        case     AIR_E_ENTRY_NOT_FOUND:  AIR_PRINT("VLAN not found!\n");                 break;

+        default:                         AIR_PRINT("Error %d: Operation failed!\n", rc); break;

+    }

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanSetPortBaseStag(UI32_T argc, C8_T *argv[])

+{

+    UI16_T vid = 0;

+    BOOL_T enable = TRUE;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    vid    = _strtoul(argv[0], NULL, 0);

+    enable = _strtoul(argv[1], NULL, 0);

+    rc = air_vlan_setPortBasedStag(0, vid, enable);

+    switch (rc)

+    {

+        case     AIR_E_OK:                                                               break;

+        case     AIR_E_ENTRY_NOT_FOUND:  AIR_PRINT("VLAN not found!\n");                 break;

+        default:                         AIR_PRINT("Error %d: Operation failed!\n", rc); break;

+    }

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanSetStag(UI32_T argc, C8_T *argv[])

+{

+    UI16_T vid = 0, stag = 0;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    vid  = _strtoul(argv[0], NULL, 0);

+    stag = _strtoul(argv[1], NULL, 0);

+    rc = air_vlan_setServiceTag(0, vid, stag);

+    switch (rc)

+    {

+        case     AIR_E_OK:                                                               break;

+        case     AIR_E_ENTRY_NOT_FOUND:  AIR_PRINT("VLAN not found!\n");                 break;

+        default:                         AIR_PRINT("Error %d: Operation failed!\n", rc); break;

+    }

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanSetEgsTagCtlEn(UI32_T argc, C8_T *argv[])

+{

+    UI16_T vid = 0;

+    BOOL_T enable = TRUE;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    vid    = _strtoul(argv[0], NULL, 0);

+    enable = _strtoul(argv[1], NULL, 0);

+    rc = air_vlan_setEgsTagCtlEnable(0, vid, enable);

+    switch (rc)

+    {

+        case     AIR_E_OK:                                                               break;

+        case     AIR_E_ENTRY_NOT_FOUND:  AIR_PRINT("VLAN not found!\n");                 break;

+        default:                         AIR_PRINT("Error %d: Operation failed!\n", rc); break;

+    }

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanSetEgsTagCtlCon(UI32_T argc, C8_T *argv[])

+{

+    UI16_T vid = 0;

+    BOOL_T enable = TRUE;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    vid    = _strtoul(argv[0], NULL, 0);

+    enable = _strtoul(argv[1], NULL, 0);

+    rc = air_vlan_setEgsTagConsistent(0, vid, enable);

+    switch (rc)

+    {

+        case     AIR_E_OK:                                                               break;

+        case     AIR_E_ENTRY_NOT_FOUND:  AIR_PRINT("VLAN not found!\n");                 break;

+        default:                         AIR_PRINT("Error %d: Operation failed!\n", rc); break;

+    }

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanSetEgsTagCtl(UI32_T argc, C8_T *argv[])

+{

+    UI16_T vid = 0, port = 0;

+    AIR_PORT_EGS_TAG_ATTR_T tag_ctl = AIR_PORT_EGS_TAG_ATTR_UNTAGGED;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    vid     = _strtoul(argv[0], NULL, 0);

+    port    = _strtoul(argv[1], NULL, 0);

+    tag_ctl = _strtoul(argv[2], NULL, 0);

+    rc = air_vlan_setPortEgsTagCtl(0, vid, port, tag_ctl);

+    switch (rc)

+    {

+        case     AIR_E_OK:                                                               break;

+        case     AIR_E_ENTRY_NOT_FOUND:  AIR_PRINT("VLAN not found!\n");                 break;

+        default:                         AIR_PRINT("Error %d: Operation failed!\n", rc); break;

+    }

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanSetPortActFrame(UI32_T argc, C8_T *argv[])

+{

+    UI16_T port = 0;

+    AIR_VLAN_ACCEPT_FRAME_TYPE_T type = AIR_VLAN_ACCEPT_FRAME_TYPE_ALL;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    port = _strtoul(argv[0], NULL, 0);

+    type = _strtoul(argv[1], NULL, 0);

+    rc = air_vlan_setPortAcceptFrameType(0, port, type);

+    if (rc != AIR_E_OK)

+    {

+        AIR_PRINT("Error: Operation failed!\n");

+    }

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanSetLeakyVlanEn(UI32_T argc, C8_T *argv[])

+{

+    UI16_T port = 0;

+    AIR_LEAKY_PKT_TYPE_T pkt_type = AIR_LEAKY_PKT_TYPE_UNICAST;

+    BOOL_T enable = TRUE;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    port     = _strtoul(argv[0], NULL, 0);

+    pkt_type = _strtoul(argv[1], NULL, 0);

+    enable   = _strtoul(argv[2], NULL, 0);

+    rc = air_vlan_setPortLeakyVlanEnable(0, port, pkt_type, enable);

+    if (rc != AIR_E_OK)

+    {

+        AIR_PRINT("Error: Operation failed!\n");

+    }

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanSetPortVlanAttr(UI32_T argc, C8_T *argv[])

+{

+    UI16_T port = 0;

+    AIR_VLAN_PORT_ATTR_T attr = AIR_VLAN_PORT_ATTR_USER_PORT;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    port = _strtoul(argv[0], NULL, 0);

+    attr = _strtoul(argv[1], NULL, 0);

+    rc = air_vlan_setPortAttr(0, port, attr);

+    if (rc != AIR_E_OK)

+    {

+        AIR_PRINT("Error: Operation failed!\n");

+    }

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanSetIgsPortETagAttr(UI32_T argc, C8_T *argv[])

+{

+    UI16_T port = 0;

+    AIR_IGR_PORT_EG_TAG_ATTR_T attr = AIR_IGR_PORT_EG_TAG_ATTR_DISABLE;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    port = _strtoul(argv[0], NULL, 0);

+    attr = _strtoul(argv[1], NULL, 0);

+    rc = air_vlan_setIgrPortTagAttr(0, port, attr);

+    if (rc != AIR_E_OK)

+    {

+        AIR_PRINT("Error: Operation failed!\n");

+    }

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanSetPortETagAttr(UI32_T argc, C8_T *argv[])

+{

+    UI16_T port = 0;

+    AIR_PORT_EGS_TAG_ATTR_T attr = AIR_PORT_EGS_TAG_ATTR_UNTAGGED;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    port = _strtoul(argv[0], NULL, 0);

+    attr = _strtoul(argv[1], NULL, 0);

+    rc = air_vlan_setPortEgsTagAttr(0, port, attr);

+    if (rc != AIR_E_OK)

+    {

+        AIR_PRINT("Error: Operation failed!\n");

+    }

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanSetPortOuterTPID(UI32_T argc, C8_T *argv[])

+{

+    UI16_T port = 0, tpid = 0;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    port = _strtoul(argv[0], NULL, 0);

+    tpid = _strtoul(argv[1], NULL, 16);

+    rc = air_vlan_setPortOuterTPID(0, port, tpid);

+    if (rc != AIR_E_OK)

+    {

+        AIR_PRINT("Error: Operation failed!\n");

+    }

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanSetPvid(UI32_T argc, C8_T *argv[])

+{

+    UI16_T port = 0, pvid = 0;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    port = _strtoul(argv[0], NULL, 0);

+    pvid = _strtoul(argv[1], NULL, 0);

+    rc = air_vlan_setPortPVID(0, port, pvid);

+    if (rc != AIR_E_OK)

+    {

+        AIR_PRINT("Error: Operation failed!\n");

+    }

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanSet(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(vlanSetCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doVlanGetPortActFrame(UI32_T argc, C8_T *argv[])

+{

+    UI32_T port = 0;

+    AIR_VLAN_ACCEPT_FRAME_TYPE_T type;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    port = _strtoul(argv[0], NULL, 0);

+    rc = air_vlan_getPortAcceptFrameType(0, port, &type);

+    if (rc != AIR_E_OK)

+    {

+        AIR_PRINT("Error: Operation failed!\n");

+        return rc;

+    }

+    AIR_PRINT("Port %d Acceptable Frame Type: ", port);

+    switch(type)

+    {

+        case AIR_VLAN_ACCEPT_FRAME_TYPE_ALL:

+            AIR_PRINT("all(%d)\n", type);

+            break;

+        case AIR_VLAN_ACCEPT_FRAME_TYPE_TAG_ONLY:

+            AIR_PRINT("tagged-only(%d)\n", type);

+            break;

+        case AIR_VLAN_ACCEPT_FRAME_TYPE_UNTAG_ONLY:

+            AIR_PRINT("untagged-only(%d)\n", type);

+            break;

+        default:

+            AIR_PRINT("unknown(%d)\n", type);

+            break;

+    };

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanGetLeakyVlanEn(UI32_T argc, C8_T *argv[])

+{

+    UI32_T port = 0;

+    BOOL_T uc = FALSE, mc = FALSE, bc = FALSE;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    port = _strtoul(argv[0], NULL, 0);

+    rc += air_vlan_getPortLeakyVlanEnable(0, port, AIR_LEAKY_PKT_TYPE_UNICAST, &uc);

+    rc += air_vlan_getPortLeakyVlanEnable(0, port, AIR_LEAKY_PKT_TYPE_MULTICAST, &mc);

+    rc += air_vlan_getPortLeakyVlanEnable(0, port, AIR_LEAKY_PKT_TYPE_BROADCAST, &bc);

+    if (rc != AIR_E_OK)

+    {

+        AIR_PRINT("Error: Operation failed!\n");

+        return rc;

+    }

+

+    AIR_PRINT("Port %d Leaky Vlan Enable\n", port);

+    AIR_PRINT("Unicast     : %s\n", uc ? "TRUE" : "FALSE");

+    AIR_PRINT("Multicast   : %s\n", mc ? "TRUE" : "FALSE");

+    AIR_PRINT("Broadcast   : %s\n", bc ? "TRUE" : "FALSE");

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanGetPortVlanAttr(UI32_T argc, C8_T *argv[])

+{

+    UI32_T port = 0;

+    AIR_VLAN_PORT_ATTR_T attr;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    port = _strtoul(argv[0], NULL, 0);

+    rc = air_vlan_getPortAttr(0, port, &attr);

+    if (rc != AIR_E_OK)

+    {

+        AIR_PRINT("Error: Operation failed!\n");

+        return rc;

+    }

+    AIR_PRINT("Port %d Vlan Attr: ", port);

+    switch(attr)

+    {

+        case AIR_VLAN_PORT_ATTR_USER_PORT:

+            AIR_PRINT("user port(%d)\n", attr);

+            break;

+        case AIR_VLAN_PORT_ATTR_STACK_PORT:

+            AIR_PRINT("stack port(%d)\n", attr);

+            break;

+        case AIR_VLAN_PORT_ATTR_TRANSLATION_PORT:

+            AIR_PRINT("translation port(%d)\n", attr);

+            break;

+        case AIR_VLAN_PORT_ATTR_TRANSPARENT_PORT:

+            AIR_PRINT("transparent port(%d)\n", attr);

+            break;

+        default:

+            AIR_PRINT("unknown(%d)\n", attr);

+            break;

+    };

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanGetIgsPortETagAttr(UI32_T argc, C8_T *argv[])

+{

+    UI32_T port = 0;

+    AIR_IGR_PORT_EG_TAG_ATTR_T attr;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    port = _strtoul(argv[0], NULL, 0);

+    rc = air_vlan_getIgrPortTagAttr(0, port, &attr);

+    if (rc != AIR_E_OK)

+    {

+        AIR_PRINT("Error: Operation failed!\n");

+        return rc;

+    }

+    AIR_PRINT("Port %d Incomming Port Egress Tag Attr: ", port);

+    switch(attr)

+    {

+        case AIR_IGR_PORT_EG_TAG_ATTR_DISABLE:

+            AIR_PRINT("disable(%d)\n", attr);

+            break;

+        case AIR_IGR_PORT_EG_TAG_ATTR_CONSISTENT:

+            AIR_PRINT("consistent(%d)\n", attr);

+            break;

+        case AIR_IGR_PORT_EG_TAG_ATTR_UNTAGGED:

+            AIR_PRINT("untagged(%d)\n", attr);

+            break;

+        case AIR_IGR_PORT_EG_TAG_ATTR_SWAP:

+            AIR_PRINT("swap(%d)\n", attr);

+            break;

+        case AIR_IGR_PORT_EG_TAG_ATTR_TAGGED:

+            AIR_PRINT("tagged(%d)\n", attr);

+            break;

+        case AIR_IGR_PORT_EG_TAG_ATTR_STACK:

+            AIR_PRINT("stack(%d)\n", attr);

+            break;

+        default:

+            AIR_PRINT("unknown(%d)\n", attr);

+            break;

+    };

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanGetPortETagAttr(UI32_T argc, C8_T *argv[])

+{

+    UI32_T port = 0;

+    AIR_PORT_EGS_TAG_ATTR_T attr;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    port = _strtoul(argv[0], NULL, 0);

+    rc = air_vlan_getPortEgsTagAttr(0, port, &attr);

+    if (rc != AIR_E_OK)

+    {

+        AIR_PRINT("Error: Operation failed!\n");

+        return rc;

+    }

+    AIR_PRINT("Port %d Egress Tag Attr: ", port);

+    switch(attr)

+    {

+        case AIR_PORT_EGS_TAG_ATTR_UNTAGGED:

+            AIR_PRINT("untagged(%d)\n", attr);

+            break;

+        case AIR_PORT_EGS_TAG_ATTR_SWAP:

+            AIR_PRINT("swap(%d)\n", attr);

+            break;

+        case AIR_PORT_EGS_TAG_ATTR_TAGGED:

+            AIR_PRINT("tagged(%d)\n", attr);

+            break;

+        case AIR_PORT_EGS_TAG_ATTR_STACK:

+            AIR_PRINT("stack(%d)\n", attr);

+            break;

+        default:

+            AIR_PRINT("unknown(%d)\n", attr);

+            break;

+    };

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanGetPortOuterTPID(UI32_T argc, C8_T *argv[])

+{

+    UI32_T port = 0;

+    UI16_T tpid = 0;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    port = _strtoul(argv[0], NULL, 0);

+    rc = air_vlan_getPortOuterTPID(0, port, &tpid);

+    if (rc != AIR_E_OK)

+    {

+        AIR_PRINT("Error: Operation failed!\n");

+        return rc;

+    }

+    AIR_PRINT("Port %d Outer TPID: %4x\n", port, tpid);

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanGetPvid(UI32_T argc, C8_T *argv[])

+{

+    UI32_T port = 0;

+    UI16_T pvid = 0;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    port = _strtoul(argv[0], NULL, 0);

+    rc = air_vlan_getPortPVID(0, port, &pvid);

+    if (rc != AIR_E_OK)

+    {

+        AIR_PRINT("Error: Operation failed!\n");

+        return rc;

+    }

+    AIR_PRINT("Port %d PVID: %d\n", port, pvid);

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doVlanGet(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(vlanGetCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doVlan(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(vlanCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doJumbo(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    I32_T pkt_len = 0, frame_len = 0;

+

+    if(0 == argc)

+    {

+        /* get command */

+        ret = air_port_getJumbo(0, &pkt_len, &frame_len);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Get ");

+            switch(pkt_len)

+            {

+                case 0:

+                    AIR_PRINT("RX_1518 ");

+                    break;

+                case 1:

+                    AIR_PRINT("RX_1536 ");

+                    break;

+                case 2:

+                    AIR_PRINT("RX_1552 ");

+                    break;

+                case 3:

+                    AIR_PRINT("RX_JUMBO ");

+                    break;

+            }

+            AIR_PRINT("frames lengths %d KBytes\n", frame_len);

+        }

+        else

+        {

+            AIR_PRINT("Get Jumbo Fail.\n");

+        }

+    }

+    else

+    {

+        /* set command */

+        pkt_len = _strtol(argv[0], NULL, 10);

+        frame_len = _strtol(argv[1], NULL, 10);

+

+        ret = air_port_setJumbo(0, pkt_len, frame_len);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Set ");

+            switch(pkt_len)

+            {

+                case 0:

+                    AIR_PRINT("RX_1518 ");

+                    break;

+                case 1:

+                    AIR_PRINT("RX_1536 ");

+                    break;

+                case 2:

+                    AIR_PRINT("RX_1552 ");

+                    break;

+                case 3:

+                    AIR_PRINT("RX_JUMBO ");

+                    break;

+            }

+            AIR_PRINT("frames lengths %d KBytes\n", frame_len);

+        }

+        else

+            AIR_PRINT("Set Jumbo Fail.\n");

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doFlowCtrl(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    BOOL_T fc_en = 0, dir = 0;

+    I32_T port = 0;

+

+    port = _strtol(argv[0], NULL, 10);

+    dir = _strtol(argv[1], NULL, 10);

+

+    if(2 == argc)

+    {

+        /* get command */

+        ret = air_port_getFlowCtrl(0, port, dir, &fc_en);

+        if(ret == AIR_E_OK)

+            AIR_PRINT("Get Port%02d %s Flow Control %s\n", port, ((dir)?"RX":"TX"), ((fc_en)?"Enable":"Disable"));

+        else

+            AIR_PRINT("Get Flow Control Fail.\n");

+    }

+    else

+    {

+        /* set command */

+        fc_en = _strtol(argv[2], NULL, 10);

+

+        ret = air_port_setFlowCtrl(0, port, dir, fc_en);

+        if(ret == AIR_E_OK)

+            AIR_PRINT("Set Port%02d %s Flow Control %s\n", port, ((dir)?"RX":"TX"), ((fc_en)?"Enable":"Disable"));

+        else

+            AIR_PRINT("Set Flow Control Fail.\n");

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doL2Set(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(l2SetCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doL2Get(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(l2GetCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doL2Clear(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(l2ClearCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doL2Del(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(l2DelCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doL2Add(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(l2AddCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doL2(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(l2Cmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doAnMode(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T port = 0;

+    BOOL_T en = 0;

+

+    port = _strtol(argv[0], NULL, 10);

+

+    if(1 == argc)

+    {

+        /* port get anCap <port> */

+        ret = air_port_getAnMode(0, port, &en);

+        if(ret == AIR_E_OK)

+            AIR_PRINT("Get Port%02d Auto-Negotiation %s\n", port, ((en)?"Enabled":"Disabled"));

+        else

+            AIR_PRINT("Get Port%02d Auto-Negotiation Fail.\n", port);

+    }

+    else if(2 == argc)

+    {

+        /* "port set anMode <port> <en> */

+        en = _strtol(argv[1], NULL, 10);

+        ret = air_port_setAnMode(0, port, en);

+        if(ret == AIR_E_OK)

+            AIR_PRINT("Set Port%02d Auto-Negotiation Mode:%s\n", port, ((en)?"Enabled":"Disabled"));

+        else

+            AIR_PRINT("Set Port%02d Auto-Negotiation Fail.\n", port);

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doLocalAdv(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T port = 0;

+    AIR_AN_ADV_T adv;

+

+    memset(&adv, 0, sizeof(AIR_AN_ADV_T));

+    port = _strtol(argv[0], NULL, 10);

+

+    if(1 == argc)

+    {

+        /* port get localAdv <port> */

+        ret = air_port_getLocalAdvAbility(0, port, &adv);

+        AIR_PRINT("Get Port%02d Local Auto-Negotiation Advertisement: ", port);

+        if(AIR_E_OK != ret)

+        {

+            AIR_PRINT("Fail!\n");

+        }

+    }

+    else if(7 == argc)

+    {

+        /* port set localAdv <port> <10H> <10F> <100H> <100F> <1000F> <pause> */

+        adv.advCap10HDX = _strtol(argv[1], NULL, 0) & BIT(0);

+        adv.advCap10FDX = _strtol(argv[2], NULL, 0) & BIT(0);

+        adv.advCap100HDX = _strtol(argv[3], NULL, 0) & BIT(0);

+        adv.advCap100FDX = _strtol(argv[4], NULL, 0) & BIT(0);

+        adv.advCap1000FDX = _strtol(argv[5], NULL, 0) & BIT(0);

+        adv.advPause = _strtol(argv[6], NULL, 0) & BIT(0);

+        ret = air_port_setLocalAdvAbility(0, port, adv);

+        AIR_PRINT("Set Port%02d Local Auto-Negotiation Advertisement: ", port);

+        if(AIR_E_OK != ret)

+        {

+            AIR_PRINT("Fail!\n");

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    if(ret == AIR_E_OK)

+    {

+        AIR_PRINT("\n");

+        AIR_PRINT("\tAdvertise 10BASE-T Half Duplex: %s\n", (adv.advCap10HDX)?"Effective":"Not Effective" );

+        AIR_PRINT("\tAdvertise 10BASE-T Full Duplex: %s\n", (adv.advCap10FDX)?"Effective":"Not Effective" );

+        AIR_PRINT("\tAdvertise 100BASE-T Half Duplex: %s\n", (adv.advCap100HDX)?"Effective":"Not Effective" );

+        AIR_PRINT("\tAdvertise 100BASE-T Full Duplex: %s\n", (adv.advCap100FDX)?"Effective":"Not Effective" );

+        AIR_PRINT("\tAdvertise 1000BASE-T Full Duplex: %s\n", (adv.advCap1000FDX)?"Effective":"Not Effective" );

+        AIR_PRINT("\tAdvertise Asynchronous Pause: %s\n", (adv.advPause)?"Effective":"Not Effective" );

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doRemoteAdv(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T port = 0;

+    AIR_AN_ADV_T lp_adv;

+

+    memset(&lp_adv, 0, sizeof(AIR_AN_ADV_T));

+    port = _strtol(argv[0], NULL, 10);

+

+    if(1 == argc)

+    {

+        /* port get remoteAdv <port> */

+        ret = air_port_getRemoteAdvAbility(0, port, &lp_adv);

+        AIR_PRINT("Get Port%02d Remote Auto-Negotiation Advertisement: ", port);

+        if(AIR_E_OK != ret)

+        {

+            AIR_PRINT("Fail!\n");

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    if(ret == AIR_E_OK)

+    {

+        AIR_PRINT("\n");

+        AIR_PRINT("\tAdvertise 10BASE-T Half Duplex: %s\n", lp_adv.advCap10HDX?"Effective":"Not Effective" );

+        AIR_PRINT("\tAdvertise 10BASE-T Full Duplex: %s\n", lp_adv.advCap10FDX?"Effective":"Not Effective" );

+        AIR_PRINT("\tAdvertise 100BASE-T Half Duplex: %s\n", lp_adv.advCap100HDX?"Effective":"Not Effective" );

+        AIR_PRINT("\tAdvertise 100BASE-T Full Duplex: %s\n", lp_adv.advCap100FDX?"Effective":"Not Effective" );

+        AIR_PRINT("\tAdvertise 1000BASE-T Full Duplex: %s\n", (lp_adv.advCap1000FDX)?"Effective":"Not Effective" );

+        AIR_PRINT("\tAdvertise Asynchronous Pause: %s\n", (lp_adv.advPause)?"Effective":"Not Effective" );

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doPortSpeed(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T port = 0;

+    UI32_T speed = 0;

+

+    port = _strtol(argv[0], NULL, 10);

+

+    if(1 == argc)

+    {

+        /* port get speed <port> */

+        ret = air_port_getSpeed(0, port, &speed);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Get Port%02d Speed:", port);

+        }

+        else

+        {

+            AIR_PRINT("Get Port%02d Speed Fail!\n", port);

+        }

+    }

+    else if(2 == argc)

+    {

+        /* port set speed <port> <speed> */

+        speed = _strtol(argv[1], NULL, 10);

+        ret = air_port_setSpeed(0, port, speed);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Set Port%02d Speed:", port);

+        }

+        else

+        {

+            AIR_PRINT("Set Port%02d Speed Fail!\n", port);

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    if(ret == AIR_E_OK)

+    {

+        switch(speed)

+        {

+            case AIR_PORT_SPEED_10M:

+                AIR_PRINT(" 10 Mbps\n");

+                break;

+            case AIR_PORT_SPEED_100M:

+                AIR_PRINT(" 100 Mbps\n");

+                break;

+            case AIR_PORT_SPEED_1000M:

+                AIR_PRINT(" 1 Gbps\n");

+                break;

+            case AIR_PORT_SPEED_2500M:

+                AIR_PRINT(" 2.5 Gbps\n");

+                break;

+            default:

+                AIR_PRINT(" Reserved\n");

+                break;

+        }

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doPortDuplex(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T port = 0;

+    UI32_T duplex = 0;

+

+    port = _strtol(argv[0], NULL, 10);

+

+    if(1 == argc)

+    {

+        /* port get duplex <port> */

+        ret = air_port_getDuplex(0, port, &duplex);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Get Port%02d Duplex:%s\n", port, duplex?"Full":"Half");

+        }

+        else

+        {

+            AIR_PRINT("Get Port%02d Duplex Fail!\n", port);

+        }

+    }

+    else if(2 == argc)

+    {

+        /* port set duplex <port> <duplex> */

+        duplex = _strtol(argv[1], NULL, 10);

+        ret = air_port_setDuplex(0, port, duplex);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Set Port%02d Duplex:%s\n", port, duplex?"Full":"Half");

+        }

+        else

+        {

+            AIR_PRINT("Set Port%02d Duplex Fail!\n", port);

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doPortStatus(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T port = 0;

+    AIR_PORT_STATUS_T ps;

+

+    memset(&ps, 0, sizeof(AIR_PORT_STATUS_T));

+    port = _strtol(argv[0], NULL, 10);

+

+    if(1 == argc)

+    {

+        /* port get status <port> */

+        ret = air_port_getLink(0, port, &ps);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Get Port%02d Link-Status\n", port);

+            AIR_PRINT("\tLink: %s\n", ps.link?"Up":"Down");

+            AIR_PRINT("\tDuplex: %s\n", ps.duplex?"Full":"Half");

+            AIR_PRINT("\tSpeed: ");

+            switch(ps.speed)

+            {

+                case AIR_PORT_SPEED_10M:

+                    AIR_PRINT("10 Mbps\n");

+                    break;

+                case AIR_PORT_SPEED_100M:

+                    AIR_PRINT("100 Mbps\n");

+                    break;

+                case AIR_PORT_SPEED_1000M:

+                    AIR_PRINT("1 Gbps\n");

+                    break;

+                case AIR_PORT_SPEED_2500M:

+                    AIR_PRINT("2.5 Gbps\n");

+                    break;

+                default:

+                    AIR_PRINT("Reserved\n");

+                    break;

+            }

+        }

+        else

+            AIR_PRINT("Get Port%02d Link-Status Fail!", port);

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doPortBckPres(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T port = 0;

+    UI32_T bckPres = 0;

+

+    port = _strtol(argv[0], NULL, 10);

+

+    if(1 == argc)

+    {

+        /* port get bckPres <port> */

+        ret = air_port_getBckPres(0, port, &bckPres);

+        if(ret == AIR_E_OK)

+            AIR_PRINT("Get Port%02d BckPres:%s\n", port, bckPres?"Enabled":"Disabled");

+        else

+            AIR_PRINT("Get Port%02d BckPres Fail!\n", port);

+    }

+    else if(2 == argc)

+    {

+        /* port set bckPres <port> <bckPres> */

+        bckPres = _strtol(argv[1], NULL, 10);

+        ret = air_port_setBckPres(0, port, bckPres);

+        if(ret == AIR_E_OK)

+            AIR_PRINT("Set Port%02d BckPres:%s\n", port, bckPres?"Enabled":"Disabled");

+        else

+            AIR_PRINT("Set Port%02d BckPres Fail!\n", port);

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doPortPsMode(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T port = 0;

+    UI32_T mode = 0;

+    BOOL_T ls_en = 0;

+    BOOL_T eee_en = 0;

+

+    port = _strtol(argv[0], NULL, 10);

+

+    if(1 == argc)

+    {

+        /* port get psMode <port> */

+        ret = air_port_getPsMode(0, port, &mode);

+        AIR_PRINT("Get Port%02d Power-Saving: ", port);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Done\n");

+        }

+        else

+        {

+            AIR_PRINT("Fail!\n");

+        }

+    }

+    else if(3 == argc)

+    {

+        /* port set psMode <port> <ls> <eee> */

+        ls_en = _strtol(argv[1], NULL, 0);

+        eee_en = _strtol(argv[2], NULL, 0);

+        if(TRUE == ls_en)

+        {

+            mode |= AIR_PORT_PS_LINKSTATUS;

+        }

+        if(TRUE == eee_en)

+        {

+            mode |= AIR_PORT_PS_EEE;

+        }

+        ret = air_port_setPsMode(0, port, mode);

+        AIR_PRINT("Set Port%02d Power-Saving: ", port);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Done\n");

+        }

+        else

+        {

+            AIR_PRINT("Fail!\n");

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+    if(ret == AIR_E_OK)

+    {

+        AIR_PRINT("\tLink status:%s\n", (mode & AIR_PORT_PS_LINKSTATUS)?"Enable":"Disable");

+        AIR_PRINT("\tEEE:%s\n", (mode & AIR_PORT_PS_EEE)?"Enable":"Disable");

+    }

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doPortSmtSpdDwn(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T port = 0;

+    UI32_T state = 0;

+    UI32_T retry = 0;

+

+    port = _strtol(argv[0], NULL, 10);

+

+    if(1 == argc)

+    {

+        /* port get smtSpdDwn <port> */

+        ret = air_port_getSmtSpdDwn(0, port, &state, &retry);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Get Port%02d Smart Speed Down: %s\n", port, state?"Enabled":"Disabled");

+            AIR_PRINT("Get Port%02d Retry Time: %d\n", port, retry + 2);

+        }

+        else

+            AIR_PRINT("Get Port%02d Smart-SpeedDown Fail!\n", port);

+    }

+    else if(3 == argc)

+    {

+        /* port set smtSpdDwn <port> <en> <retry> */

+        state = _strtol(argv[1], NULL, 10);

+        retry = _strtol(argv[2], NULL, 10);

+        if(retry >= 2)

+        {

+            ret = air_port_setSmtSpdDwn(0, port, state, retry - 2);

+            if(ret == AIR_E_OK)

+            {

+                AIR_PRINT("Set Port%02d Smart Speed Down: %s\n", port, state?"Enabled":"Disabled");

+                AIR_PRINT("Set Port%02d Retry Time: %d\n", port, retry);

+            }

+            else

+                AIR_PRINT("Set Port%02d Smart-SpeedDown Fail!\n", port);

+        }

+        else

+        {

+            ret = AIR_E_BAD_PARAMETER;

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doPortSpTag(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T port = 0;

+    BOOL_T sptag_en = FALSE;

+

+    port = _strtol(argv[0], NULL, 10);

+

+    if(1 == argc)

+    {

+        /* port get spTag <port> */

+        ret = air_port_getSpTag(0, port, &sptag_en);

+        if(AIR_E_OK == ret)

+        {

+            AIR_PRINT("Get Port%02d Special Tag %s\n", port, ((sptag_en)?"Enabled":"Disabled"));

+        }

+        else

+        {

+            AIR_PRINT("Get Port%02d Special Tag Fail.\n", port);

+        }

+    }

+    else if(2 == argc)

+    {

+        /* port set spTag <port> <en> */

+        sptag_en = _strtol(argv[1], NULL, 10);

+        ret = air_port_setSpTag(0, port, sptag_en);

+        if(AIR_E_OK == ret)

+        {

+            AIR_PRINT("Set Port%02d Special Tag:%s\n", port, ((sptag_en)?"Enabled":"Disabled"));

+        }

+        else

+        {

+            AIR_PRINT("Set Port%02d Special Tag Fail.\n", port);

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doPortEnable(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T port = 0;

+    UI32_T state = 0;

+

+    port = _strtol(argv[0], NULL, 10);

+

+    if(1 == argc)

+    {

+        /* port get enable <port> */

+        ret = air_port_getEnable(0, port, &state);

+        if(ret == AIR_E_OK)

+            AIR_PRINT("Get Port%02d State:%s\n", port, state?"Enable":"Disable");

+        else

+            AIR_PRINT("Get Port%02d State Fail!\n", port);

+    }

+    else if(2 == argc)

+    {

+        /* port set enable <port> <en> */

+        state = _strtol(argv[1], NULL, 10);

+        ret = air_port_setEnable(0, port, state);

+        if(ret == AIR_E_OK)

+            AIR_PRINT("Set Port%02d State:%s\n", port, state?"Enable":"Disable");

+        else

+            AIR_PRINT("Set Port%02d State Fail!\n", port);

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doPort5GBaseRMode(

+    UI32_T argc,

+    C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+

+    if(0 == argc)

+    {

+        /* port set 5GBaseRMode */

+        ret = air_port_set5GBaseRModeEn(0);

+        if(ret == AIR_E_OK)

+            AIR_PRINT("Set Port05 Mode: 5GBase-R\n");

+        else

+            AIR_PRINT("Set Port05 HSGMII Mode Fail.\n");

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doPortHsgmiiMode(

+    UI32_T argc,

+    C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+

+    if(0 == argc)

+    {

+        /* port set hsgmiiMode */

+        ret = air_port_setHsgmiiModeEn(0);

+        if(ret == AIR_E_OK)

+            AIR_PRINT("Set Port05 Mode: HSGMII\n");

+        else

+            AIR_PRINT("Set Port05 HSGMII Mode Fail.\n");

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doPortSgmiiMode(

+    UI32_T argc,

+    C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T mode = 0;

+    UI32_T speed = 0;

+

+    if(2 == argc)

+    {

+        /* port set sgmiiMode <mode(0:AN,1:Force)> <speed> */

+        mode = _strtol(argv[0], NULL, 10);

+        speed = _strtol(argv[1], NULL, 10);

+        ret = air_port_setSgmiiMode(0, mode, speed);

+        if(ret == AIR_E_OK)

+            AIR_PRINT("Set Port05 SGMII Mode:%s\nIf in Force Mode, speed:", mode?"Force":"AN");

+        else

+            AIR_PRINT("Set Port05 SGMII Mode Fail.\n");

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    if(ret == AIR_E_OK)

+    {

+        switch(speed)

+        {

+            case AIR_PORT_SPEED_10M:

+                AIR_PRINT(" 10 Mbps\n");

+                break;

+            case AIR_PORT_SPEED_100M:

+                AIR_PRINT(" 100 Mbps\n");

+                break;

+            case AIR_PORT_SPEED_1000M:

+                AIR_PRINT(" 1 Gbps\n");

+                break;

+            default:

+                AIR_PRINT(" Reserved\n");

+                break;

+        }

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doPortRmiiMode(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T speed = 0;

+

+    if(1 == argc)

+    {

+        /* port set rmiiMode <speed> */

+        speed = _strtol(argv[0], NULL, 10);

+        ret = air_port_setRmiiMode(0, speed);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Set Port05 RMII Mode Speed:");

+        }

+        else

+        {

+            AIR_PRINT("Set Port05 RMII Mode Fail!\n");

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    if(ret == AIR_E_OK)

+    {

+        switch(speed)

+        {

+            case AIR_PORT_SPEED_10M:

+                AIR_PRINT(" 10 Mbps\n");

+                break;

+            case AIR_PORT_SPEED_100M:

+                AIR_PRINT(" 100 Mbps\n");

+                break;

+            default:

+                AIR_PRINT(" Reserved\n");

+                break;

+        }

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doPortRgmiiMode(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T speed = 0;

+

+    if(1 == argc)

+    {

+        /* port set rgmiiMode <speed> */

+        speed = _strtol(argv[0], NULL, 10);

+        ret = air_port_setRgmiiMode(0, speed);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Set Port05 RGMII Mode Speed:");

+        }

+        else

+        {

+            AIR_PRINT("Set Port05 RGMII Mode Fail!\n");

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    if(ret == AIR_E_OK)

+    {

+        switch(speed)

+        {

+            case AIR_PORT_SPEED_10M:

+                AIR_PRINT(" 10 Mbps\n");

+                break;

+            case AIR_PORT_SPEED_100M:

+                AIR_PRINT(" 100 Mbps\n");

+                break;

+            case AIR_PORT_SPEED_1000M:

+                AIR_PRINT(" 1 Gbps\n");

+                break;

+            default:

+                AIR_PRINT(" Reserved\n");

+                break;

+        }

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doSptagEn(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T port = 0;

+    BOOL_T sp_en = FALSE;

+

+    port =  _strtol(argv[0], NULL, 10);

+    if (2 == argc)

+    {

+        sp_en =  _strtol(argv[1], NULL, 10);

+        ret = air_sptag_setState(0,port,sp_en);

+        if(AIR_E_OK == ret)

+        {

+            AIR_PRINT("set port %d SpTag state %s sucess\n", port,sp_en?"Enable":"Disable");

+        }

+        else

+        {

+            AIR_PRINT("set port %d SpTag state %s fail\n", port,sp_en?"Enable":"Disable");

+        }

+    }

+    else if(1 == argc)

+    {

+        air_sptag_getState(0,port,&sp_en);

+        AIR_PRINT("get port %d SpTag state: %s \n", port,sp_en?"Enable":"Disable");

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doSptagMode(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T port = 0;

+    BOOL_T sp_mode = FALSE;

+

+

+    port =  _strtol(argv[0], NULL, 10);

+    if (2 == argc)

+    {

+        sp_mode  =  _strtol(argv[1], NULL, 10);

+        ret = air_sptag_setMode(0,port,sp_mode);

+        if(AIR_E_OK == ret)

+        {

+            AIR_PRINT("set port %d SpTag Mode  %s sucess\n", port,sp_mode?"replace":"insert");

+        }

+        else

+        {

+            AIR_PRINT("set port %d SpTag state %s fail\n", port,sp_mode?"replace":"insert");

+        }

+    }

+    else if(1 == argc)

+    {

+        air_sptag_getMode(0,port,&sp_mode);

+        AIR_PRINT("get port %d SpTag state: %s \n", port,sp_mode?"replace":"insert");

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doSptagDecode(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    AIR_SPTAG_RX_PARA_T sptag_rx = {0};

+    UI8_T buf[AIR_STAG_BUF_LEN] = {0};

+    UI32_T len = AIR_STAG_BUF_LEN, i = 0;

+

+    if (4 == argc)

+    {

+        for(i = 0; i < len; i++)

+        {

+            buf[i] = _strtoul(argv[i], NULL, 16);

+        }

+

+        ret = air_sptag_decodeRx(0, buf, len, &sptag_rx);

+        if (AIR_E_OK != ret)

+        {

+            AIR_PRINT("SpTag decode fail\n");

+            return ret;

+        }

+

+        AIR_PRINT("SpTag decode success:\n");

+        AIR_PRINT("RSN : %s\n", _sptag_pt[sptag_rx.rsn]);

+        AIR_PRINT("VPM : %s\n", _sptag_vpm[sptag_rx.vpm]);

+        AIR_PRINT("SPN : %d\n", sptag_rx.spn);

+        AIR_PRINT("PRI : %d\n", sptag_rx.pri);

+        AIR_PRINT("CFI : %d\n", sptag_rx.cfi);

+        AIR_PRINT("VID : %d\n", sptag_rx.vid);

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doSptagEncode(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    AIR_STAG_TX_PARA_T sptag_tx = {0};

+    UI8_T buf[AIR_STAG_BUF_LEN] = {0};

+    UI32_T len = AIR_STAG_BUF_LEN;

+    char str[128] = {'\0'};

+    UI32_T data = 0;

+    AIR_STAG_MODE_T mode = AIR_STAG_MODE_LAST;

+

+    if (7 == argc)

+    {

+        if(_strcmp(argv[0],"mode=replace") == 0)

+            mode = AIR_STAG_MODE_REPLACE;

+        else if(_strcmp(argv[0],"mode=insert") == 0)

+            mode = AIR_STAG_MODE_INSERT;

+        else

+            printf("mode is wrong!!");

+

+        if(_strcmp(argv[1],"opc=portmap") == 0)

+            sptag_tx.opc = AIR_STAG_OPC_PORTMAP;

+        else if(_strcmp(argv[1],"opc=portid") == 0)

+            sptag_tx.opc = AIR_STAG_OPC_PORTID;

+        else if(_strcmp(argv[1],"opc=lookup") == 0)

+            sptag_tx.opc = AIR_STAG_OPC_LOOKUP;

+        else

+            printf("opc is wrong!!");

+

+        if(sscanf(argv[2],"dp=%x",&data) != -1)

+        {

+            sptag_tx.pbm = data;

+            AIR_PRINT("sptag_tx.pbm %x\n",sptag_tx.pbm);

+        }

+

+        if(_strcmp(argv[3],"vpm=untagged") == 0)

+            sptag_tx.vpm = AIR_STAG_VPM_UNTAG;

+        else if(_strcmp(argv[3],"vpm=8100") == 0)

+            sptag_tx.vpm = AIR_STAG_VPM_TPID_8100;

+        else if(_strcmp(argv[3],"vpm=88a8") == 0)

+            sptag_tx.vpm = AIR_STAG_VPM_TPID_88A8;

+        else

+            printf("vpm is wrong!!");

+

+        if(sscanf(argv[4],"pri=%d",&data) != -1)

+        {

+            sptag_tx.pri = data;

+            AIR_PRINT("sptag_tx.pri %d\n",sptag_tx.pri);

+        }

+

+        if(sscanf(argv[5],"cfi=%d",&data) != -1)

+        {

+            sptag_tx.cfi  = data;

+            AIR_PRINT("sptag_tx.cfi %d\n",sptag_tx.cfi);

+        }

+

+        if(sscanf(argv[6],"vid=%d",&data) != -1)

+        {

+            sptag_tx.vid = data;

+            AIR_PRINT("sptag_tx.vid %d\n",sptag_tx.vid);

+        }

+

+        ret = air_sptag_encodeTx(0,mode, &sptag_tx, (UI8_T *)&buf, &len);

+        if(AIR_E_OK == ret)

+        {

+            AIR_PRINT("SpTag encode sucess, returned len=%d\n", len);

+            AIR_PRINT("Encoded SpTag: %02x %02x %02x %02x\n", buf[0], buf[1], buf[2], buf[3]);

+        }

+        else

+        {

+            AIR_PRINT("SpTag encode fail\n");

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doSptag(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(sptagCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doL2Dump(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(l2DumpCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doMacAddr(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    AIR_MAC_ENTRY_T mt;

+    UI32_T fwd = 0;

+

+    memset(&mt, 0, sizeof(AIR_MAC_ENTRY_T));

+

+    if(0 == argc)

+    {

+        /* l2 clear mac */

+        ret = air_l2_clearMacAddr(0);

+        if(ret == AIR_E_OK)

+            AIR_PRINT("Clear MAC Address Table Done.\n");

+        else

+            AIR_PRINT("Clear MAC Address Table Fail.\n");

+    }

+    else if(3 == argc)

+    {

+        /* l2 del mac <mac(12'hex)> { vid <vid(0..4095)> | fid <fid(0..15)> } */

+        ret = _str2mac(argv[0], (C8_T *)mt.mac);

+        if(ret != AIR_E_OK)

+        {

+            AIR_PRINT("Unrecognized command.\n");

+            return ret;

+        }

+

+        /* check argument 1 */

+        if(FALSE == _strcmp(argv[1], "vid"))

+        {

+            /* get mac entry by MAC address & vid */

+            mt.cvid = _strtoul(argv[2], NULL, 0);

+            mt.flags |= AIR_L2_MAC_ENTRY_FLAGS_IVL;

+            AIR_PRINT("Get MAC Address:" MAC_STR " with vid:%u", MAC2STR(mt.mac), mt.cvid);

+        }

+        else if(FALSE == _strcmp(argv[1], "fid"))

+        {

+            /* get mac entry by MAC address & fid */

+            mt.fid = _strtoul(argv[2], NULL, 0);

+            AIR_PRINT("Get MAC Address:" MAC_STR " with fid:%u", MAC2STR(mt.mac), mt.fid);

+        }

+        else

+        {

+            AIR_PRINT("Unrecognized command.\n");

+            return AIR_E_BAD_PARAMETER;

+        }

+        ret = air_l2_delMacAddr(0, &mt);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT(" Done.\n");

+        }

+        else

+            AIR_PRINT("\n Fail!\n");

+    }

+    else if(7 == argc)

+    {

+        /* l2 add mac <static(0:dynamic,1:static)> <unauth(0:auth,1:unauth)> <mac(12'hex)> <portlist(uintlist)> [ vid <vid(0..4095)> | fid <fid(0..15)> ] <src_mac_forward=(0:default,1:cpu-include,2:cpu-exclude,3:cpu-only,4:drop)> */

+        if(argv[0])

+            mt.flags |= AIR_L2_MAC_ENTRY_FLAGS_STATIC;

+

+        if(argv[1])

+            mt.flags |= AIR_L2_MAC_ENTRY_FLAGS_UNAUTH;

+

+        ret = _str2mac(argv[2], (C8_T *)mt.mac);

+        if(ret != AIR_E_OK)

+        {

+            AIR_PRINT("Unrecognized command.\n");

+            return ret;

+        }

+

+        ret = _portListStr2Ary(argv[3], mt.port_bitmap, 1);

+        if(ret != AIR_E_OK)

+        {

+            AIR_PRINT("Unrecognized command.\n");

+            return ret;

+        }

+

+        /* check argument fid or vid */

+        if(FALSE == _strcmp(argv[4], "vid"))

+        {

+            /* get mac entry by MAC address & vid */

+            mt.cvid = _strtoul(argv[5], NULL, 0);

+            mt.flags |= AIR_L2_MAC_ENTRY_FLAGS_IVL;

+        }

+        else if(FALSE == _strcmp(argv[4], "fid"))

+        {

+            /* get mac entry by MAC address & fid */

+            mt.fid = _strtoul(argv[5], NULL, 0);

+        }

+        else

+        {

+            AIR_PRINT("Unrecognized command.\n");

+            return AIR_E_BAD_PARAMETER;

+        }

+        fwd = _strtoul(argv[6], NULL, 0);

+        if(0 == fwd)

+            mt.sa_fwd = AIR_L2_FWD_CTRL_DEFAULT;

+        else if(1 == fwd)

+            mt.sa_fwd = AIR_L2_FWD_CTRL_CPU_INCLUDE;

+        else if(2 == fwd)

+            mt.sa_fwd = AIR_L2_FWD_CTRL_CPU_EXCLUDE;

+        else if(3 == fwd)

+            mt.sa_fwd = AIR_L2_FWD_CTRL_CPU_ONLY;

+        else if(4 == fwd)

+            mt.sa_fwd = AIR_L2_FWD_CTRL_DROP;

+        else

+        {

+            AIR_PRINT("Unrecognized command.\n");

+            return AIR_E_BAD_PARAMETER;

+        }

+        ret = air_l2_addMacAddr(0, &mt);

+        AIR_PRINT("Add MAC Address:" MAC_STR, MAC2STR(mt.mac));

+        if(ret == AIR_E_OK)

+            AIR_PRINT(" Done.\n");

+        else

+            AIR_PRINT(" Fail.\n");

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+_printMacEntry(

+        AIR_MAC_ENTRY_T *mt,

+        UI32_T age_unit,

+        UI8_T count,

+        UI8_T title)

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    I32_T i = 0, j = 0;

+    UI8_T first = 0;

+    UI8_T find = 0;

+    if(title)

+    {

+        AIR_PRINT("%-6s%-15s%-5s%-5s%-5s%-10s%-10s%-6s\n",

+                "unit",

+                "mac",

+                "ivl",

+                "vid",

+                "fid",

+                "age-time",

+                "forward",

+                "port");

+        return ret;

+    }

+    for(i = 0; i < count; i++)

+    {

+        AIR_PRINT("%-6d", age_unit);

+        AIR_PRINT(MAC_STR, MAC2STR(mt[i].mac));

+        AIR_PRINT("...");

+        if(mt[i].flags & AIR_L2_MAC_ENTRY_FLAGS_IVL)

+        {

+            AIR_PRINT("%-3s..", "ivl");

+            AIR_PRINT("%-5d", mt[i].cvid);

+            AIR_PRINT("%-5s", ".....");

+        }

+        else

+        {

+            AIR_PRINT("%-3s..", "svl");

+            AIR_PRINT("%-5s", ".....");

+            AIR_PRINT("%-5d", mt[i].fid);

+        }

+        if(mt[i].flags & AIR_L2_MAC_ENTRY_FLAGS_STATIC)

+        {

+            AIR_PRINT("%-10s.", "static");

+        }

+        else

+        {

+            AIR_PRINT("%d sec..", mt[i].timer);

+        }

+        AIR_PRINT("%-10s", _air_mac_address_forward_control_string[mt[i].sa_fwd]);

+        first = 0;

+        find = 0;

+        for (j = (AIR_MAX_NUM_OF_PORTS - 1); j >= 0; j--)

+        {

+            if((mt[i].port_bitmap[0]) & (1 << j))

+            {

+                first = j;

+                find = 1;

+                break;

+            }

+        }

+        if(find)

+        {

+            for (j = 0; j < AIR_MAX_NUM_OF_PORTS; j++)

+            {

+                if((mt[i].port_bitmap[0]) & (1 << j))

+                {

+                    if(j == first)

+                        AIR_PRINT("%-2d", j);

+                    else

+                        AIR_PRINT("%-2d,", j);

+                }

+            }

+        }

+        else

+            AIR_PRINT("no dst port");

+        AIR_PRINT("\n");

+    }

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doGetMacAddr(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI8_T count = 0;

+    AIR_MAC_ENTRY_T * ptr_mt;

+

+    if(3 == argc)

+    {

+        ptr_mt = AIR_MALLOC(sizeof(AIR_MAC_ENTRY_T));

+        if (NULL == ptr_mt)

+        {

+            AIR_PRINT("***Error***, allocate memory fail\n");

+            return AIR_E_OTHERS;

+        }

+        memset(ptr_mt, 0, sizeof(AIR_MAC_ENTRY_T));

+        /* l2 get mac <mac(12'hex)> { vid <vid(0..4095)> | fid <fid(0..15)> } */

+        ret = _str2mac(argv[0], (C8_T *)ptr_mt->mac);

+        if(ret != AIR_E_OK)

+        {

+            AIR_PRINT("Unrecognized command.\n");

+            AIR_FREE(ptr_mt);

+            return ret;

+        }

+

+        /* check argument 1 */

+        if(FALSE == _strcmp(argv[1], "vid"))

+        {

+            /* get mac entry by MAC address & vid */

+            ptr_mt->cvid = _strtoul(argv[2], NULL, 0);

+            ptr_mt->flags |= AIR_L2_MAC_ENTRY_FLAGS_IVL;

+            AIR_PRINT("Get MAC Address:" MAC_STR " with vid:%u", MAC2STR(ptr_mt->mac), ptr_mt->cvid);

+        }

+        else if(FALSE == _strcmp(argv[1], "fid"))

+        {

+            /* get mac entry by MAC address & fid */

+            ptr_mt->fid = _strtoul(argv[2], NULL, 0);

+            AIR_PRINT("Get MAC Address:" MAC_STR " with fid:%u", MAC2STR(ptr_mt->mac), ptr_mt->fid);

+        }

+        else

+        {

+            AIR_PRINT("Unrecognized command.\n");

+            AIR_FREE(ptr_mt);

+            return AIR_E_BAD_PARAMETER;

+        }

+        ret = air_l2_getMacAddr(0, &count, ptr_mt);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT(" Done.\n");

+            _printMacEntry(ptr_mt, 0, 1, TRUE);

+            _printMacEntry(ptr_mt, 0, 1, FALSE);

+        }

+        else

+            AIR_PRINT("\n Not found!\n");

+        AIR_FREE(ptr_mt);

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doMacAddrAgeOut(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T time = 0;

+    if(0 == argc)

+    {

+        /* l2 get macAddrAgeOut */

+        ret = air_l2_getMacAddrAgeOut(0, &time);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Get MAC Address Age Out Time Done.\n");

+        }

+        else

+        {

+            AIR_PRINT("Get MAC Address Age Out Time Fail.\n");

+        }

+    }

+    else if(1 == argc)

+    {

+        /* l2 set macAddrAgeOut <time(1, 1000000)> */

+        time = _strtoul(argv[0], NULL, 0);

+        if(time < 1 || time > 1000000)

+        {

+            AIR_PRINT("Unrecognized command.\n");

+            return AIR_E_BAD_PARAMETER;

+        }

+        ret = air_l2_setMacAddrAgeOut(0, time);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Set MAC Address Age Out Time Done.\n");

+        }

+        else

+        {

+            AIR_PRINT("Set MAC Address Age Out Time Fail.\n");

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    if(ret == AIR_E_OK)

+    {

+        AIR_PRINT("MAC Address Age Out Time: %u seconds.\n", time);

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doDumpMacAddr(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    AIR_MAC_ENTRY_T *ptr_mt;

+    UI8_T count = 0;

+    UI32_T bucket_size = 0;

+    UI32_T total_count = 0;

+

+    if(0 != argc)

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return AIR_E_BAD_PARAMETER;

+    }

+    /* get unit of aging time */

+    ret = air_l2_getMacBucketSize(0, &bucket_size);

+    if(ret != AIR_E_OK)

+    {

+        AIR_PRINT("Get MAC Age Time Fail!\n");

+        return ret;

+    }

+    ptr_mt = AIR_MALLOC(sizeof(AIR_MAC_ENTRY_T) * bucket_size);

+    if (NULL == ptr_mt)

+    {

+        AIR_PRINT("***Error***, allocate memory fail\n");

+        return AIR_E_OTHERS;

+    }

+    memset(ptr_mt, 0, sizeof(AIR_MAC_ENTRY_T) * bucket_size);

+    _printMacEntry(ptr_mt, 0, count, TRUE);

+    /* get 1st entry of MAC table */

+    ret = air_l2_getMacAddr(0, &count, ptr_mt);

+    switch(ret)

+    {

+        case AIR_E_ENTRY_NOT_FOUND:

+            AIR_FREE(ptr_mt);

+            AIR_PRINT("Not Found!\n");

+            return ret;

+        case AIR_E_TIMEOUT:

+            AIR_FREE(ptr_mt);

+            AIR_PRINT("Time Out!\n");

+            return ret;

+        case AIR_E_BAD_PARAMETER:

+            AIR_FREE(ptr_mt);

+            AIR_PRINT("Bad Parameter!\n");

+            return ret;

+        default:

+            break;

+    }

+    total_count += count;

+    _printMacEntry(ptr_mt, 0, count, FALSE);

+

+    /* get other entries of MAC table */

+    while(1)

+    {

+        memset(ptr_mt, 0, sizeof(AIR_MAC_ENTRY_T) * bucket_size);

+        ret = air_l2_getNextMacAddr(0, &count, ptr_mt);

+        if(AIR_E_OK != ret)

+        {

+            break;

+        }

+        total_count += count;

+        _printMacEntry(ptr_mt, 0, count, FALSE);

+    }

+    switch(ret)

+    {

+        case AIR_E_TIMEOUT:

+            AIR_PRINT("Time Out!\n");

+            break;

+        case AIR_E_BAD_PARAMETER:

+            AIR_PRINT("Bad Parameter!\n");

+            break;

+        default:

+            AIR_PRINT("Found %u %s\n", total_count, (total_count>1)?"entries":"entry");

+            break;

+    }

+    AIR_FREE(ptr_mt);

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doLagMember(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T portrunk_index = 0, member_index = 0, member_enable = 0, port_index = 0, i = 0;

+    AIR_LAG_PTGINFO_T  member;

+    memset(&member,0,sizeof(AIR_LAG_PTGINFO_T));

+

+    if(4 == argc)

+    {

+        /* lag set member <port trunk index> <member index> <member enable> <port_index>*/

+        portrunk_index  = _strtol(argv[0], NULL, 10);

+        member_index    = _strtol(argv[1], NULL, 10);

+        member_enable   = _strtol(argv[2], NULL, 10);

+        port_index      = _strtol(argv[3], NULL, 10);

+        ret = air_lag_setMember(0, portrunk_index, member_index, member_enable,port_index);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Set port trunk index %d member_index:%d member_enable:%d, port_index:%d ok.\n", portrunk_index, member_index, member_enable,port_index);

+        }

+        else

+        {

+            AIR_PRINT("Set port trunk index %d member_index:%d member_enable:%d, port_index:%d fail.\n", portrunk_index, member_index, member_enable,port_index);

+        }

+        memset(&member,0,sizeof(member));

+        air_lag_getMember(0, portrunk_index, &member);

+        if(! member.csr_gp_enable[0])

+        {

+            AIR_PRINT("\r\n!!!!!!!!!Port trunk index %d member_index:0 must be set,or else have taffic issues.\n", portrunk_index);

+        }

+    }

+    else if(1 == argc)

+    {

+        portrunk_index = _strtol(argv[0], NULL, 10);

+

+        /* lag get member <port> */

+        memset(&member,0,sizeof(member));

+        ret = air_lag_getMember(0, portrunk_index, &member);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Get port trunk %u member:\n", portrunk_index);

+            for(i = 0; i < AIR_LAG_MAX_MEM_NUM; i++)

+            {

+                if(member.csr_gp_enable[i])

+                    AIR_PRINT("port %d \r\n", member.csr_gp_port[i]);

+            }

+            AIR_PRINT("\r\n");

+        }

+        else

+        {

+            AIR_PRINT("Get port trunk:%u Member Fail.\n", portrunk_index);

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+

+static AIR_ERROR_NO_T

+doLagDstInfo(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    AIR_LAG_DISTINFO_T dstInfo;

+

+    memset(&dstInfo, 0, sizeof(AIR_LAG_DISTINFO_T));

+    if(7 == argc)

+    {

+        /* lag set dstInfo <sp> <sa> <da> <sip> <dip> <sport> <dport> */

+        dstInfo.sp = _strtol(argv[0], NULL, 10) & BIT(0);

+        dstInfo.sa = _strtol(argv[1], NULL, 10) & BIT(0);

+        dstInfo.da = _strtol(argv[2], NULL, 10) & BIT(0);

+        dstInfo.sip = _strtol(argv[3], NULL, 10) & BIT(0);

+        dstInfo.dip = _strtol(argv[4], NULL, 10) & BIT(0);

+        dstInfo.sport = _strtol(argv[5], NULL, 10) & BIT(0);

+        dstInfo.dport = _strtol(argv[6], NULL, 10) & BIT(0);

+        ret = air_lag_setDstInfo(0, dstInfo);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Set LAG packet distrubution.\n");

+        }

+        else

+        {

+            AIR_PRINT("Set LAG packet distrubution Fail.\n");

+        }

+    }

+    else if(0 == argc)

+    {

+        /* lag get dstInfo */

+        ret = air_lag_getDstInfo(0, &dstInfo);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Get LAG packet distrubution:\n");

+        }

+        else

+        {

+            AIR_PRINT("Get LAG packet distrubution Fail.\n");

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+    if(ret == AIR_E_OK)

+    {

+        AIR_PRINT("%-5s|%-5s|%-5s|%-5s|%-5s|%-5s|%-5s\n",

+                "SP", "SA", "DA", "SIP", "DIP", "SPORT", "DPORT");

+        AIR_PRINT("%-5s|%-5s|%-5s|%-5s|%-5s|%-5s|%-5s\n",

+                (dstInfo.sp)?"En":"Dis",

+                (dstInfo.sa)?"En":"Dis",

+                (dstInfo.da)?"En":"Dis",

+                (dstInfo.sip)?"En":"Dis",

+                (dstInfo.dip)?"En":"Dis",

+                (dstInfo.sport)?"En":"Dis",

+                (dstInfo.dport)?"En":"Dis");

+    }

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doLagHashtype(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T hashtype = 0;

+

+    if(1 == argc)

+    {

+        hashtype = _strtol(argv[0], NULL, 10);

+        ret = air_lag_sethashtype(0, hashtype);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Set LAG hashtype Ok.\n");

+        }

+        else

+        {

+            AIR_PRINT("Set LAG hashtype Fail.\n");

+        }

+    }

+    else if(0 == argc)

+    {

+        /* lag get dstInfo */

+        ret = air_lag_gethashtype(0, &hashtype);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Get LAG hashtype:\n");

+        }

+        else

+        {

+            AIR_PRINT("Get LLAG hashtype Fail.\n");

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+    if(ret == AIR_E_OK)

+    {

+        switch (hashtype)

+        {

+            case 0:

+                AIR_PRINT("hashtype:crc32lsb.\n");

+                break;

+            case 1:

+                AIR_PRINT("hashtype:crc32msb.\n");

+                break;

+            case 2:

+                AIR_PRINT("hashtype:crc16.\n");

+                break;

+            case 3:

+                AIR_PRINT("hashtype:xor4.\n");

+                break;

+            default:

+                AIR_PRINT("wrong hashtype:%d.\n",hashtype);

+        }

+

+    }

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doLagPtseed(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T ptseed = 0;

+

+    if(1 == argc)

+    {

+        ptseed = _strtol(argv[0], NULL, 16);

+        ret = air_lag_setPTSeed(0, ptseed);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Set LAG Port Seed:%x(hex) ok\n",ptseed);

+        }

+        else

+        {

+            AIR_PRINT("Set LAG Port Seed:%x(hex) fail\n",ptseed);

+        }

+    }

+    else if(0 == argc)

+    {

+        /* lag get seed */

+        ret = air_lag_getPTSeed(0, &ptseed);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Get port trunk seed: %x(hex)\n",ptseed);

+        }

+        else

+        {

+            AIR_PRINT("Get port trunk seed Fail.\n");

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doLagSpsel(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T port = 0;

+    UI32_T state = 0;

+

+    if(1 == argc)

+    {

+        /* lag set spsel <state> */

+        state = _strtol(argv[0], NULL, 10);

+        ret = air_lag_setSpSel(0,state);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Set source port compare function:%s.\n", (state)?"Enabled":"Disabled");

+        }

+        else

+        {

+            AIR_PRINT("Set source port compare function Fail.\n");

+        }

+    }

+    else if(0 == argc)

+    {

+        /* lag get spsel*/

+        ret = air_lag_getSpSel(0, &state);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Get source port compare function:%s.\n", (state)?"Enabled":"Disabled");

+        }

+        else

+        {

+            AIR_PRINT("Get source port compare function Fail.\n");

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+

+static AIR_ERROR_NO_T

+doLagState(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T port = 0;

+    UI32_T state = 0;

+

+    if(1 == argc)

+    {

+        /* lag set state <state> */

+        state = _strtol(argv[0], NULL, 10);

+        ret = air_lag_set_ptgc_state(0,state);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Set LAG Port Trunk State:%s.\n", (state)?"Enabled":"Disabled");

+        }

+        else

+        {

+            AIR_PRINT("Set LAG Port Trunk State Fail.\n");

+        }

+    }

+    else if(0 == argc)

+    {

+        /* lag get state*/

+        ret = air_lag_get_ptgc_state(0, &state);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Get LAG Port Trunk State:%s.\n", (state)?"Enabled":"Disabled");

+        }

+        else

+        {

+            AIR_PRINT("Get LAG Port Trunk State Fail.\n");

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doLagGet(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(lagGetCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doLagSet(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(lagSetCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doLag(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(lagCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doStpPortstate(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T port = 0;

+    UI32_T fid = 0;

+    UI32_T state = 0;

+

+    port = _strtol(argv[0], NULL, 10);

+    fid = _strtol(argv[1], NULL, 10);

+    if(3 == argc)

+    {

+        /* stp set portstate <port> <fid(0..15)> <state> */

+        state = _strtol(argv[2], NULL, 10);

+        ret = air_stp_setPortstate(0, port, fid, state);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Set STP Port:%u FID:%u State:", port, fid);

+            switch(state)

+            {

+                case AIR_STP_STATE_DISABLE:

+                    AIR_PRINT("Disable(STP) / Discard(RSTP).\n");

+                    break;

+                case AIR_STP_STATE_LISTEN:

+                    AIR_PRINT("Listening(STP) / Discard(RSTP).\n");

+                    break;

+                case AIR_STP_STATE_LEARN:

+                    AIR_PRINT("Learning(STP) / Learning(RSTP).\n");

+                    break;

+                case AIR_STP_STATE_FORWARD:

+                    AIR_PRINT("Forwarding(STP) / Forwarding(RSTP).\n");

+                    break;

+                default:

+                    break;

+            }

+        }

+        else

+        {

+            AIR_PRINT("Set STP Port:%u FID:%u State Fail.", port, fid);

+        }

+    }

+    else if(2 == argc)

+    {

+        /* stp get portstate <port> <fid(0..15)> */

+        ret = air_stp_getPortstate(0, port, fid, &state);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Get STP Port:%u FID:%u State:", port, fid);

+            switch(state)

+            {

+                case AIR_STP_STATE_DISABLE:

+                    AIR_PRINT("Disable(STP) / Discard(RSTP).\n");

+                    break;

+                case AIR_STP_STATE_LISTEN:

+                    AIR_PRINT("Listening(STP) / Discard(RSTP).\n");

+                    break;

+                case AIR_STP_STATE_LEARN:

+                    AIR_PRINT("Learning(STP) / Learning(RSTP).\n");

+                    break;

+                case AIR_STP_STATE_FORWARD:

+                    AIR_PRINT("Forwarding(STP) / Forwarding(RSTP).\n");

+                    break;

+                default:

+                    break;

+            }

+        }

+        else

+        {

+            AIR_PRINT("Get STP Port:%u FID:%u State Fail.", port, fid);

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doStpGet(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(stpGetCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doStpSet(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(stpSetCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doStp(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(stpCmds, argc, argv);

+}

+

+static void

+_mir_printPortList(UI32_T * mt)

+{

+    I8_T j = 0;

+    UI8_T first = 0;

+    UI8_T find = 0;

+    for(j = (AIR_MAX_NUM_OF_PORTS - 1); j >= 0; j--)

+    {

+        if((*mt) & (1 << j))

+        {

+            first = j;

+            find = 1;

+            break;

+        }

+    }

+    if(find)

+    {

+        for(j = 0; j < AIR_MAX_NUM_OF_PORTS; j++)

+        {

+            if((*mt) & (1 << j))

+            {

+                if(j == first)

+                    AIR_PRINT("%-2d", j);

+                else

+                    AIR_PRINT("%-2d,", j);

+            }

+        }

+    }

+    else

+        AIR_PRINT("NULL");

+    AIR_PRINT("\n");

+}

+

+static void

+_mir_printSrcPortList(

+    const UI32_T         unit,

+    const UI32_T         sessionid)

+{

+

+    I8_T i = 0;

+    AIR_MIR_SESSION_T   session;

+    AIR_PORT_BITMAP_T txPbm = {0}, rxPbm = {0};

+

+    for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++)

+    {

+         memset(&session, 0, sizeof(session));

+         session.src_port = i;

+         air_mir_getMirrorPort(unit, sessionid, &session);

+

+         if(session.flags & AIR_MIR_SESSION_FLAGS_DIR_TX)

+         {

+            txPbm[0] |= (1 << i);

+         }

+         if(session.flags & AIR_MIR_SESSION_FLAGS_DIR_RX)

+         {

+            rxPbm[0] |= (1 << i);

+         }

+    }

+    AIR_PRINT("Src PortList\n");

+    AIR_PRINT(" - Rx portlist = ");

+    _mir_printPortList(rxPbm);

+    AIR_PRINT(" - Tx portlist = ");

+    _mir_printPortList(txPbm);

+}

+

+static void

+_mir_printSession(

+    const UI32_T            unit,

+    const UI32_T            session_id,

+    const AIR_MIR_SESSION_T *ptr_session)

+{

+

+    AIR_PRINT("Session id: %d\n", session_id);

+    AIR_PRINT("State: %s \n", (ptr_session->flags & AIR_MIR_SESSION_FLAGS_ENABLE)? "enable": "disable");

+    AIR_PRINT("Tx tag: %s \n", (ptr_session->flags & AIR_MIR_SESSION_FLAGS_TX_TAG_OBEY_CFG)? "On": "Off");

+    AIR_PRINT("Dst port: %d \n", ptr_session->dst_port);

+    _mir_printSrcPortList(unit,session_id);

+}

+

+static AIR_ERROR_NO_T

+doMirrorGetSid(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T      rc = AIR_E_OK;

+    UI32_T              session_id = 0;

+    AIR_MIR_SESSION_T   session = {0};

+    I8_T i = 0;

+

+    session_id = _strtoul(argv[0], NULL, 0);

+    rc = air_mir_getSession(0, session_id, &session);

+    if (AIR_E_OK != rc)

+    {

+        AIR_PRINT("***Error***, get mirror session fail\n");

+        return rc;

+    }

+    /* print session information */

+    if(session.dst_port == AIR_PORT_INVALID)

+    {

+        AIR_PRINT("Session id %d not found\n", session_id);

+    }

+    else

+    {

+        _mir_printSession(0, session_id, &session);

+    }

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doMirrorDelSid(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T      rc = AIR_E_OK;

+    UI32_T              session_id = 0;

+    AIR_MIR_SESSION_T   session = {0};

+    UI8_T i = 0;

+

+    session_id = _strtoul(argv[0], NULL, 0);

+    rc = air_mir_delSession(0, session_id);

+    if (AIR_E_OK != rc)

+    {

+        AIR_PRINT("***Error***, del mirror session fail\n");

+        return rc;

+    }

+    for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++)

+    {

+        session.src_port = i;

+        rc = air_mir_setMirrorPort(0, session_id, &session);

+        if (AIR_E_OK != rc)

+        {

+            AIR_PRINT("***Error***,port=%u error\n", i);

+            return rc;

+        }

+    }

+    if (rc != AIR_E_OK)

+    {

+        AIR_PRINT("***Error***, delete mirror session fail\n");

+    }

+    else

+        AIR_PRINT("***OK***, delete mirror session success\n");

+

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doMirrorAddRlist(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T      rc = AIR_E_OK;

+    UI32_T              session_id = 0;

+    AIR_MIR_SESSION_T   session = {0};

+    AIR_PORT_BITMAP_T rxPbm = {0};

+    UI8_T i = 0;

+

+    /*mirror add session-rlist <sid(0..3)> <list(UINTLIST)>*/

+    session_id = _strtoul(argv[0], NULL, 0);

+    rc = _portListStr2Ary(argv[1], rxPbm, 1);

+    if(rc != AIR_E_OK)

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return rc;

+    }

+    if(!rxPbm[0])

+    {

+        for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++)

+        {

+            memset(&session, 0, sizeof(AIR_MIR_SESSION_T));

+            session.src_port = i;

+            rc = air_mir_getMirrorPort(0, session_id, &session);

+            if (AIR_E_OK != rc)

+            {

+                AIR_PRINT("***Error***,get port=%u error\n", i);

+                return rc;

+            }

+

+            session.flags &= ~AIR_MIR_SESSION_FLAGS_DIR_RX;

+            session.src_port = i;

+            rc = air_mir_setMirrorPort(0, session_id, &session);

+            if (AIR_E_OK != rc)

+            {

+                AIR_PRINT("***Error***,set rx port=%u error\n", i);

+                return rc;

+            }

+        }

+    }

+    else

+    {

+        for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++)

+        {

+            if(rxPbm[0] & (1 << i))

+            {

+                memset(&session, 0, sizeof(AIR_MIR_SESSION_T));

+                session.src_port = i;

+                rc = air_mir_getMirrorPort(0, session_id, &session);

+                if (AIR_E_OK != rc)

+                {

+                    AIR_PRINT("***Error***,get port=%u error\n", i);

+                    return rc;

+                }

+

+                session.flags |= AIR_MIR_SESSION_FLAGS_DIR_RX;

+                session.src_port = i;

+                rc = air_mir_setMirrorPort(0, session_id, &session);

+                if (AIR_E_OK != rc)

+                {

+                    AIR_PRINT("***Error***,port=%u error\n", i);

+                    return rc;

+                }

+            }

+        }

+    }

+

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doMirrorAddTlist(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T      rc = AIR_E_OK;

+    UI32_T              session_id = 0;

+    AIR_MIR_SESSION_T   session = {0};

+    AIR_PORT_BITMAP_T txPbm = {0};

+    UI8_T i = 0;

+

+    /*mirror add session-tlist <sid(0..3)> <list(UINTLIST)>*/

+    session_id = _strtoul(argv[0], NULL, 0);

+    rc = _portListStr2Ary(argv[1], txPbm, 1);

+    if(rc != AIR_E_OK)

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return rc;

+    }

+    if(!txPbm[0])

+    {

+        for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++)

+        {

+            memset(&session, 0, sizeof(AIR_MIR_SESSION_T));

+            session.src_port = i;

+            rc = air_mir_getMirrorPort(0, session_id, &session);

+            if (AIR_E_OK != rc)

+            {

+                AIR_PRINT("***Error***,get port=%u error\n", i);

+                return rc;

+            }

+

+            session.flags &= ~AIR_MIR_SESSION_FLAGS_DIR_TX;

+            session.src_port = i;

+            rc = air_mir_setMirrorPort(0, session_id, &session);

+            if (AIR_E_OK != rc)

+            {

+                AIR_PRINT("***Error***,set rx port=%u error\n", i);

+                return rc;

+            }

+        }

+    }

+    else

+    {

+        for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++)

+        {

+            if(txPbm[0] & (1 << i))

+            {

+                memset(&session, 0, sizeof(AIR_MIR_SESSION_T));

+                session.src_port = i;

+                rc = air_mir_getMirrorPort(0, session_id, &session);

+                if (AIR_E_OK != rc)

+                {

+                    AIR_PRINT("***Error***,get port=%u error\n", i);

+                    return rc;

+                }

+

+                session.flags |= AIR_MIR_SESSION_FLAGS_DIR_TX;

+                session.src_port = i;

+                rc = air_mir_setMirrorPort(0, session_id, &session);

+                if (AIR_E_OK != rc)

+                {

+                    AIR_PRINT("***Error***,port=%u error\n", i);

+                    return rc;

+                }

+            }

+        }

+    }

+

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doMirrorSetSessionEnable(

+    UI32_T argc,

+    C8_T *argv[])

+

+{

+    AIR_ERROR_NO_T      rc = AIR_E_OK;

+    UI32_T              session_id = 0;

+    UI32_T              enable = 0;

+    BOOL_T              tmp_en = FALSE;

+

+    /*mirror set session-enable <sid(0..3)> <state(1:En,0:Dis)>*/

+    session_id = _strtoul(argv[0], NULL, 0);

+    enable = _strtoul(argv[1], NULL, 0);

+    if(enable)

+        tmp_en = TRUE;

+    /* set port mirror state */

+    rc = air_mir_setSessionAdminMode(0, session_id, tmp_en);

+    if(AIR_E_OK!=rc)

+    {

+        AIR_PRINT("***Error***\n");

+    }

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doMirrorSetSession(

+    UI32_T argc,

+    C8_T *argv[])

+{

+    AIR_ERROR_NO_T      rc = AIR_E_OK;

+    UI32_T              session_id = 0;

+    UI32_T              dst_port = 0;

+    UI8_T               enable = 0;

+    UI8_T               tag_en = 0;

+    UI8_T               dir = 0;

+    AIR_MIR_SESSION_T  session = {0};

+    AIR_PORT_BITMAP_T   rxPbm = {0};

+    I8_T               i = 0;

+

+    /*mirror set session <sid(0..3)> <dst_port(UINT)> <state(1:En,0:Dis)> <tag(1:on, 0:off)> <list(UINTLIST)> <dir(0:none,1:tx,2:rx,3:both)>*/

+    session_id = _strtoul(argv[0], NULL, 0);

+    dst_port = _strtoul(argv[1], NULL, 0);

+    AIR_PRINT("session id %d dst port %d.\n", session_id, dst_port);

+    session.dst_port = dst_port;

+    enable = _strtoul(argv[2], NULL, 0);

+    if(enable)

+    {

+        session.flags |= AIR_MIR_SESSION_FLAGS_ENABLE;

+    }

+    else

+    {

+        session.flags &= ~AIR_MIR_SESSION_FLAGS_ENABLE;

+    }

+    tag_en = _strtoul(argv[3], NULL, 0);

+    if(tag_en)

+    {

+        session.flags |= AIR_MIR_SESSION_FLAGS_TX_TAG_OBEY_CFG;

+    }

+    else

+    {

+        session.flags &= ~AIR_MIR_SESSION_FLAGS_TX_TAG_OBEY_CFG;

+    }

+    rc = _portListStr2Ary(argv[4], rxPbm, 1);

+    if(rc != AIR_E_OK)

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return rc;

+    }

+    AIR_PRINT("pbm %x.\n", rxPbm);

+    dir = _strtoul(argv[5], NULL, 0);

+    if(dir == 1)

+    {

+        session.flags |= AIR_MIR_SESSION_FLAGS_DIR_TX;

+    }

+    else if(dir == 2)

+    {

+        session.flags |= AIR_MIR_SESSION_FLAGS_DIR_RX;

+    }

+    else if(dir == 3)

+    {

+        session.flags |= AIR_MIR_SESSION_FLAGS_DIR_TX;

+        session.flags |= AIR_MIR_SESSION_FLAGS_DIR_RX;

+    }

+    else if (!dir)

+    {

+        session.flags &= ~AIR_MIR_SESSION_FLAGS_DIR_TX;

+        session.flags &= ~AIR_MIR_SESSION_FLAGS_DIR_RX;

+    }

+    else

+    {

+        return AIR_E_BAD_PARAMETER;

+    }

+    for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++)

+    {

+        if(rxPbm[0] & (1 << i))

+        {

+            session.src_port = i;

+            /* set port mirror session */

+            rc = air_mir_addSession(0, session_id, &session);

+

+            if(AIR_E_OK!=rc)

+            {

+                AIR_PRINT("***Error***,dst-port=%u, src-port=%u error\n", session.dst_port, session.src_port);

+                return rc;

+            }

+            else

+                AIR_PRINT("add session %d,dst-port=%u, src-port=%u\n", session_id, session.dst_port, session.src_port);

+        }

+    }

+

+    return rc;

+}

+

+

+

+static AIR_ERROR_NO_T

+doMirrorSet(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(mirrorSetCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doMirrorAdd(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(mirrorAddCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doMirrorGet(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(mirrorGetCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doMirrorDel(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(mirrorDelCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doMirror(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(mirrorCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doMibClearPort(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T port = 0;

+

+    if(1 == argc)

+    {

+        /* mib clear port */

+        port = _strtoul(argv[0], NULL, 0);

+        ret = air_mib_clear_by_port(0,port);

+        AIR_PRINT("Clear port %d mib stats",port);

+        if(AIR_E_OK == ret)

+        {

+            AIR_PRINT("Done.\n");

+        }

+        else

+        {

+            AIR_PRINT("Fail.\n");

+        }

+    }

+    else if(0 == argc)

+    {

+        /*restart mib counter*/

+        air_mib_clear(0);

+        AIR_PRINT("Clear all mib stats",port);

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doMibClearAcl(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T port = 0;

+

+    if(0 == argc)

+    {

+        /* mib clear acl */

+        ret = air_mib_clearAclEvent(0);

+        AIR_PRINT("Clear ACL Event Counter ");

+        if(AIR_E_OK == ret)

+        {

+            AIR_PRINT("Done.\n");

+        }

+        else

+        {

+            AIR_PRINT("Fail.\n");

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doMibGetPort(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T port = 0;

+    UI32_T tmp32 = 0xffffffff;

+    AIR_MIB_CNT_RX_T rx_mib = {0};

+    AIR_MIB_CNT_TX_T tx_mib = {0};

+

+    port = _strtoul(argv[0], NULL, 0);

+    if(1 == argc)

+    {

+        /* mib get <port(0..6)> */

+        ret = air_mib_get(0, port, &rx_mib, &tx_mib);

+        AIR_PRINT("Get MIB Counter of Port %u ", port);

+        if(AIR_E_OK == ret)

+        {

+            AIR_PRINT("Done.\n");

+            AIR_PRINT("RX Drop Packet                    : %u\n", rx_mib.RDPC);

+            AIR_PRINT("RX filtering Packet               : %u\n", rx_mib.RFPC);

+            AIR_PRINT("RX Unicast Packet                 : %u\n", rx_mib.RUPC);

+            AIR_PRINT("RX Multicast Packet               : %u\n", rx_mib.RMPC);

+            AIR_PRINT("RX Broadcast Packet               : %u\n", rx_mib.RBPC);

+            AIR_PRINT("RX Alignment Error Packet         : %u\n", rx_mib.RAEPC);

+            AIR_PRINT("RX CRC Packet                     : %u\n", rx_mib.RCEPC);

+            AIR_PRINT("RX Undersize Packet               : %u\n", rx_mib.RUSPC);

+            AIR_PRINT("RX Fragment Error Packet          : %u\n", rx_mib.RFEPC);

+            AIR_PRINT("RX Oversize Packet                : %u\n", rx_mib.ROSPC);

+            AIR_PRINT("RX Jabber Error Packet            : %u\n", rx_mib.RJEPC);

+            AIR_PRINT("RX Pause Packet                   : %u\n", rx_mib.RPPC);

+            AIR_PRINT("RX Packet Length 64 bytes         : %u\n", rx_mib.RL64PC);

+            AIR_PRINT("RX Packet Length 65 ~ 127 bytes   : %u\n", rx_mib.RL65PC);

+            AIR_PRINT("RX Packet Length 128 ~ 255 bytes  : %u\n", rx_mib.RL128PC);

+            AIR_PRINT("RX Packet Length 256 ~ 511 bytes  : %u\n", rx_mib.RL256PC);

+            AIR_PRINT("RX Packet Length 512 ~ 1023 bytes : %u\n", rx_mib.RL512PC);

+            AIR_PRINT("RX Packet Length 1024 ~ 1518 bytes: %u\n", rx_mib.RL1024PC);

+            AIR_PRINT("RX Packet Length 1519 ~ max bytes : %u\n", rx_mib.RL1519PC);

+            AIR_PRINT("RX_CTRL Drop Packet               : %u\n", rx_mib.RCDPC);

+            AIR_PRINT("RX Ingress Drop Packet            : %u\n", rx_mib.RIDPC);

+            AIR_PRINT("RX ARL Drop Packet                : %u\n", rx_mib.RADPC);

+            AIR_PRINT("FLow Control Drop Packet          : %u\n", rx_mib.FCDPC);

+            AIR_PRINT("WRED Drop Packtet                 : %u\n", rx_mib.WRDPC);

+            AIR_PRINT("Mirror Drop Packet                : %u\n", rx_mib.MRDPC);

+            AIR_PRINT("RX  sFlow Sampling Packet         : %u\n", rx_mib.SFSPC);

+            AIR_PRINT("Rx sFlow Total Packet             : %u\n", rx_mib.SFTPC);

+            AIR_PRINT("Port Control Drop Packet          : %u\n", rx_mib.RXC_DPC);

+            AIR_PRINT("RX Octets good or bad packtes l32 : %u\n", (UI32_T)(rx_mib.ROC & tmp32));

+            AIR_PRINT("RX Octets good or bad packtes h32 : %u\n", (UI32_T)((rx_mib.ROC >> 32) & tmp32));

+            AIR_PRINT("RX Octets bad packets l32         : %u\n", (UI32_T)(rx_mib.ROC2 & tmp32));

+            AIR_PRINT("RX Octets bad packets h32         : %u\n", (UI32_T)((rx_mib.ROC2 >> 32) & tmp32));

+            AIR_PRINT("\n");

+            AIR_PRINT("TX Drop Packet                    : %u\n", tx_mib.TDPC);

+            AIR_PRINT("TX CRC Packet                     : %u\n", tx_mib.TCRC);

+            AIR_PRINT("TX Unicast Packet                 : %u\n", tx_mib.TUPC);

+            AIR_PRINT("TX Multicast Packet               : %u\n", tx_mib.TMPC);

+            AIR_PRINT("TX Broadcast Packet               : %u\n", tx_mib.TBPC);

+            AIR_PRINT("TX Collision Event Count          : %u\n", tx_mib.TCEC);

+            AIR_PRINT("TX Single Collision Event Count   : %u\n", tx_mib.TSCEC);

+            AIR_PRINT("TX Multiple Conllision Event Count: %u\n", tx_mib.TMCEC);

+            AIR_PRINT("TX Deferred Event Count           : %u\n", tx_mib.TDEC);

+            AIR_PRINT("TX Late Collision Event Count     : %u\n", tx_mib.TLCEC);

+            AIR_PRINT("TX Excessive Collision Event Count: %u\n", tx_mib.TXCEC);

+            AIR_PRINT("TX Pause Packet                   : %u\n", tx_mib.TPPC);

+            AIR_PRINT("TX Packet Length 64 bytes         : %u\n", tx_mib.TL64PC);

+            AIR_PRINT("TX Packet Length 65 ~ 127 bytes   : %u\n", tx_mib.TL65PC);

+            AIR_PRINT("TX Packet Length 128 ~ 255 bytes  : %u\n", tx_mib.TL128PC);

+            AIR_PRINT("TX Packet Length 256 ~ 511 bytes  : %u\n", tx_mib.TL256PC);

+            AIR_PRINT("TX Packet Length 512 ~ 1023 bytes : %u\n", tx_mib.TL512PC);

+            AIR_PRINT("TX Packet Length 1024 ~ 1518 bytes: %u\n", tx_mib.TL1024PC);

+            AIR_PRINT("TX Packet Length 1519 ~ max bytes : %u\n", tx_mib.TL1519PC);

+            AIR_PRINT("TX Oversize Drop Packet           : %u\n", tx_mib.TODPC);

+            AIR_PRINT("TX Octets good or bad packtes l32 : %u\n", (UI32_T)(tx_mib.TOC & tmp32));

+            AIR_PRINT("TX Octets good or bad packtes h32 : %u\n", (UI32_T)((tx_mib.TOC >> 32) & tmp32));

+            AIR_PRINT("TX Octets bad packets l32         : %u\n", (UI32_T)(tx_mib.TOC2 & tmp32));

+            AIR_PRINT("TX Octets bad packets h32         : %u\n", (UI32_T)((tx_mib.TOC2 >> 32) & tmp32));

+        }

+        else

+        {

+            AIR_PRINT("Fail.\n");

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doMibGetAcl(

+    UI32_T argc,

+    C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T event = 0;

+    UI32_T cnt = 0;

+

+    if(1 == argc)

+    {

+        /* mib get acl <event(0..7)> */

+        event = _strtoul(argv[0], NULL, 0);

+        ret = air_mib_getAclEvent(0, event, &cnt);

+        AIR_PRINT("Get counter of ACL event %u ", event);

+        if(AIR_E_OK == ret)

+        {

+            AIR_PRINT("Done.\n");

+            AIR_PRINT("ACL Event Counter:%u\n", cnt);

+        }

+        else

+        {

+            AIR_PRINT("Fail.\n");

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doMibClear(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(mibClearCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doMibGet(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(mibGetCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doMib(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(mibCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doQosRateLimitExMngFrm(

+    UI32_T argc,

+    C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T dir = 0;

+    BOOL_T enable = FALSE;

+

+    dir = _strtoul(argv[0], NULL, 0);

+    if(2 == argc)

+    {

+        if(dir == 0)

+            dir = AIR_QOS_RATE_DIR_EGRESS;

+        else if(dir == 1)

+            dir = AIR_QOS_RATE_DIR_INGRESS;

+        else

+        {

+            AIR_PRINT("Unrecognized command.\n");

+            ret = AIR_E_BAD_PARAMETER;

+            return ret;

+        }

+        enable = _strtoul(argv[1], NULL, 0);

+        ret = air_qos_setRateLimitExMngFrm(0, dir, enable);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Success.\n");

+            AIR_PRINT("Set %s Rate Limit Control %s management frame.\n",

+                    (AIR_QOS_RATE_DIR_INGRESS == dir)?"Ingress":"Egress",

+                    (TRUE == enable)?"exclude":"include");

+        }

+        else

+        {

+            AIR_PRINT("Fail.\n");

+            return ret;

+        }

+    }

+    else if(0 == argc)

+    {

+        dir = AIR_QOS_RATE_DIR_EGRESS;

+        ret = air_qos_getRateLimitExMngFrm(0, dir, &enable);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Success.\n");

+            AIR_PRINT("Get %s Rate Limit Control %s management frame.\n",

+                    (AIR_QOS_RATE_DIR_INGRESS == dir)?"Ingress":"Egress",

+                    (TRUE == enable)?"exclude":"include");

+        }

+        else

+        {

+            AIR_PRINT("Fail.\n");

+            return ret;

+        }

+        dir = AIR_QOS_RATE_DIR_INGRESS;

+        ret = air_qos_getRateLimitExMngFrm(0, dir, &enable);

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT("Success.\n");

+            AIR_PRINT("Get %s Rate Limit Control %s management frame.\n",

+                    (AIR_QOS_RATE_DIR_INGRESS == dir)?"Ingress":"Egress",

+                    (TRUE == enable)?"exclude":"include");

+        }

+        else

+        {

+            AIR_PRINT("Fail.\n");

+            return ret;

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+

+}

+

+static AIR_ERROR_NO_T

+doQosPortPriority(

+    UI32_T argc,

+    C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    AIR_PORT_BITMAP_T portlist = {0};

+    UI32_T priority = 0;

+    UI8_T i = 0;

+

+    ret = _portListStr2Ary(argv[0], portlist, 1);

+    if(ret != AIR_E_OK)

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return ret;

+    }

+    if(2 == argc)

+    {

+        priority = _strtoul(argv[1], NULL, 0);

+        for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++)

+        {

+            if(portlist[0] & (1 << i))

+            {

+                ret = air_qos_setPortPriority(0, i, priority);

+                if(ret == AIR_E_OK)

+                {

+                    AIR_PRINT("Set Port%02d port based priority %d Success.\n", i, priority);

+                }

+                else

+                {

+                    AIR_PRINT("Set Port%02d port based priority %d Fail.\n", i, priority);

+                }

+            }

+        }

+    }

+    else if(1 == argc)

+    {

+        for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++)

+        {

+            if(portlist[0] & (1 << i))

+            {

+                ret = air_qos_getPortPriority(0, i, &priority);

+                if(ret == AIR_E_OK)

+                {

+                    AIR_PRINT("Get Port%d port based priority %d.\n", i, priority);

+                }

+                else

+                {

+                    AIR_PRINT("Get Port%d port based priority Fail.\n", i);

+                }

+            }

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doQosRateLimit(

+    UI32_T argc,

+    C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    AIR_PORT_BITMAP_T portlist = {0};

+    AIR_QOS_RATE_LIMIT_CFG_T rl = {0};

+    UI8_T i = 0;

+

+    ret = _portListStr2Ary(argv[0], portlist, 1);

+    if(ret != AIR_E_OK)

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return ret;

+    }

+    if(5 == argc)

+    {

+        rl.ingress_cir = _strtoul(argv[1], NULL, 0);

+        rl.ingress_cbs = _strtoul(argv[2], NULL, 0);

+        rl.egress_cir = _strtoul(argv[3], NULL, 0);

+        rl.egress_cbs = _strtoul(argv[4], NULL, 0);

+        rl.flags |= AIR_QOS_RATE_LIMIT_CFG_FLAGS_ENABLE_INGRESS;

+        rl.flags |= AIR_QOS_RATE_LIMIT_CFG_FLAGS_ENABLE_EGRESS;

+        for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++)

+        {

+            if(portlist[0] & (1 << i))

+            {

+                ret = air_qos_setRateLimit(0, i, &rl);

+                if(ret == AIR_E_OK)

+                {

+                    AIR_PRINT("Set Port%02d Ingress CIR %d CBS %d Egress CIR %d CBS %d Success.\n", i, rl.ingress_cir, rl.ingress_cbs, rl.egress_cir, rl.egress_cbs);

+                }

+                else

+                {

+                    AIR_PRINT("Set Port%02d Ingress CIR %d CBS %d Egress CIR %d CBS %d Fail.\n", i, rl.ingress_cir, rl.ingress_cbs, rl.egress_cir, rl.egress_cbs);

+                }

+            }

+        }

+    }

+    else if(1 == argc)

+    {

+        for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++)

+        {

+            if(portlist[0] & (1 << i))

+            {

+                ret = air_qos_getRateLimit(0, i, &rl);

+                if(ret == AIR_E_OK)

+                {

+                    AIR_PRINT("Get Port%02d Ingress CIR %d CBS %d Egress CIR %d CBS %d\n", i, rl.ingress_cir, rl.ingress_cbs, rl.egress_cir, rl.egress_cbs);

+                }

+                else

+                {

+                    AIR_PRINT("Get Port%02d Rate Info Fail.\n", i);

+                }

+            }

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doQosRateLimitEnable(

+    UI32_T argc,

+    C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    AIR_PORT_BITMAP_T portlist = {0};

+    C8_T sten[2][10] = {"Disable", "Enable"};

+    C8_T stdir[2][10] = {"Egress", "Ingress"};

+    UI32_T dir = 0, en = 0;

+    AIR_QOS_RATE_DIR_T tmp_dir = AIR_QOS_RATE_DIR_LAST;

+    BOOL_T state = FALSE;

+    UI8_T i = 0;

+

+    ret = _portListStr2Ary(argv[0], portlist, 1);

+    if(ret != AIR_E_OK)

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return ret;

+    }

+    if(3 == argc)

+    {

+        dir = _strtoul(argv[1], NULL, 0);

+        en = _strtoul(argv[2], NULL, 0);

+        if(dir == 0)

+            tmp_dir = AIR_QOS_RATE_DIR_EGRESS;

+        else if(dir == 1)

+            tmp_dir = AIR_QOS_RATE_DIR_INGRESS;

+        else

+        {

+            AIR_PRINT("Unrecognized command.\n");

+            return AIR_E_BAD_PARAMETER;

+        }

+        if(en)

+            state= TRUE;

+        else

+            state = FALSE;

+

+        for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++)

+        {

+            if(portlist[0] & (1 << i))

+            {

+                ret = air_qos_setRateLimitEnable(0, i, tmp_dir, state);

+                if(AIR_E_OK == ret)

+                {

+                    AIR_PRINT("Set Port%02d %s rate %s Success.\n", i, stdir[dir], sten[en]);

+                }

+                else

+                {

+                    AIR_PRINT("Set Port%02d %s rate %s Fail.\n", i, stdir[dir], sten[en]);

+                }

+            }

+        }

+    }

+    else if(1 == argc)

+    {

+        for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++)

+        {

+            if(portlist[0] & (1 << i))

+            {

+                tmp_dir = AIR_QOS_RATE_DIR_EGRESS;

+                dir = 0;

+                ret = air_qos_getRateLimitEnable(0, i, tmp_dir, &state);

+                if(AIR_E_OK == ret)

+                {

+                    AIR_PRINT("Get Port%02d %s rate %s Success.\n", i, stdir[dir], sten[state]);

+                }

+                else

+                {

+                    AIR_PRINT("Get Port%02d %s rate state Fail.\n", i, stdir[dir]);

+                }

+                tmp_dir = AIR_QOS_RATE_DIR_INGRESS;

+                dir = 1;

+                ret = air_qos_getRateLimitEnable(0, i, tmp_dir, &state);

+                if(AIR_E_OK == ret)

+                {

+                    AIR_PRINT("Get Port%02d %s rate %s Success.\n", i, stdir[dir], sten[state]);

+                }

+                else

+                {

+                    AIR_PRINT("Get Port%02d %s rate state Fail.\n", i, stdir[dir]);

+                }

+            }

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+

+}

+

+static AIR_ERROR_NO_T

+doQosDscp2Pri(

+    UI32_T argc,

+    C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T dscp = 0, priority = 0;

+

+    dscp = _strtoul(argv[0], NULL, 0);

+    if(2 == argc)

+    {

+        priority = _strtoul(argv[1], NULL, 0);

+        ret = air_qos_setDscp2Pri(0, dscp, priority);

+        if(AIR_E_OK == ret)

+        {

+            AIR_PRINT("Set DSCP %d to priority %d Success.\n", dscp, priority);

+        }

+        else

+        {

+            AIR_PRINT("Set DSCP %d to priority %d Fail.\n", dscp, priority);

+        }

+    }

+    else if(1 == argc)

+    {

+        ret = air_qos_getDscp2Pri(0, dscp, &priority);

+        if(AIR_E_OK == ret)

+        {

+            AIR_PRINT("Get DSCP %d to priority %d\n", dscp, priority);

+        }

+        else

+        {

+            AIR_PRINT("Get DSCP %d to priority Fail.\n", dscp);

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doQosPri2Queue(

+    UI32_T argc,

+    C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T priority = 0, queue = 0;

+

+    priority = _strtoul(argv[1], NULL, 0);

+

+    if(2 == argc)

+    {

+        priority = _strtoul(argv[0], NULL, 0);

+        queue = _strtoul(argv[1], NULL, 0);

+        ret = air_qos_setPri2Queue(0, priority, queue);

+        if(AIR_E_OK == ret)

+        {

+            AIR_PRINT("Set priority %d to queue %d Success.\n", priority, queue);

+        }

+        else

+        {

+            AIR_PRINT("Set priority %d to queue %d Fail.\n", priority, queue);

+        }

+    }

+    else

+    {

+        for(; priority < AIR_QOS_QUEUE_MAX_NUM; priority++)

+        {

+            ret = air_qos_getPri2Queue(0, priority, &queue);

+            if(AIR_E_OK == ret)

+            {

+                AIR_PRINT("Get priority %d to queue %d\n", priority, queue);

+            }

+            else

+            {

+                AIR_PRINT("Get priority %d to queue Fail.\n", priority);

+            }

+        }

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doQosTrustMode(

+    UI32_T argc,

+    C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T mode = 0;

+    C8_T bs[4][13] = {"port", "1p_port", "dscp_port", "dscp_1p_port"};

+    AIR_QOS_TRUST_MODE_T mode_t = AIR_QOS_TRUST_MODE_LAST;

+    AIR_PORT_BITMAP_T portlist = {0};

+    UI8_T i = 0;

+

+    ret = _portListStr2Ary(argv[0], portlist, 1);

+    if(ret != AIR_E_OK)

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return ret;

+    }

+    if(2 == argc)

+    {

+        mode = _strtoul(argv[1], NULL, 0);

+        if(mode == 0)

+            mode_t = AIR_QOS_TRUST_MODE_PORT;

+        else if(mode == 1)

+            mode_t = AIR_QOS_TRUST_MODE_1P_PORT;

+        else if(mode == 2)

+            mode_t = AIR_QOS_TRUST_MODE_DSCP_PORT;

+        else if(mode == 3)

+            mode_t = AIR_QOS_TRUST_MODE_DSCP_1P_PORT;

+        else

+        {

+            AIR_PRINT("Unrecognized command.\n");

+            return AIR_E_BAD_PARAMETER;

+        }

+        for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++)

+        {

+            if(portlist[0] & (1 << i))

+            {

+                ret = air_qos_setTrustMode(0, i, mode_t);

+                if(AIR_E_OK == ret)

+                {

+                    AIR_PRINT("port %d Set Trust mode %s Success.\n", i, bs[mode]);

+                }

+                else

+                {

+                    AIR_PRINT("port %d Set Trust mode %s Fail.\n", i, bs[mode]);

+                }

+            }

+        }

+    }

+    else if(1 == argc)

+    {

+        for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++)

+        {

+            if(portlist[0] & (1 << i))

+            {

+                mode_t = AIR_QOS_TRUST_MODE_LAST;

+                ret = air_qos_getTrustMode(0, i, &mode_t);

+                if(AIR_E_OK == ret)

+                {

+                    if(mode_t == AIR_QOS_TRUST_MODE_PORT)

+                        mode = 0;

+                    else if(mode_t == AIR_QOS_TRUST_MODE_1P_PORT)

+                        mode = 1;

+                    else if(mode_t == AIR_QOS_TRUST_MODE_DSCP_PORT)

+                        mode = 2;

+                    else if(mode_t == AIR_QOS_TRUST_MODE_DSCP_1P_PORT)

+                        mode = 3;

+                    else

+                    {

+                        AIR_PRINT("port %d Get Trust mode Fail.\n", i);

+                        return AIR_E_OTHERS;

+                    }

+                    AIR_PRINT("port %d Get Trust mode %s\n", i, bs[mode]);

+                }

+                else

+                {

+                    AIR_PRINT("port %d Get Trust mode Fail.\n", i);

+                }

+            }

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doQosScheduleAlgo(

+    UI32_T argc,

+    C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    AIR_PORT_BITMAP_T portlist = {0};

+    AIR_QOS_SCH_MODE_T sch_mode = AIR_QOS_SCH_MODE_LAST;

+    UI32_T scheduler = 0;

+    UI8_T queue = 0;

+    C8_T sche[3][5] = {"SP", "WRR", "WFQ"};

+    UI32_T weight = AIR_QOS_SHAPER_NOSETTING;

+    UI8_T i = 0;

+

+    ret = _portListStr2Ary(argv[0], portlist, 1);

+    if(ret != AIR_E_OK)

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return ret;

+    }

+    AIR_PRINT("port list is %d\n", portlist[0]);

+    if(4 == argc)

+    {

+        queue = _strtoul(argv[1], NULL, 0);

+        AIR_PRINT("queue is %d\n", queue);

+        scheduler = _strtoul(argv[2], NULL, 0);

+        AIR_PRINT("scheduler is %d\n", scheduler);

+        weight = _strtoul(argv[3], NULL, 0);

+        AIR_PRINT("weight is %d\n", weight);

+        if(scheduler == 0)

+        {

+            sch_mode = AIR_QOS_SCH_MODE_SP;

+            weight = AIR_QOS_SHAPER_NOSETTING;

+            if(weight != AIR_QOS_SHAPER_NOSETTING)

+                AIR_PRINT("[Warning] SP schedule mode no need weight\n");

+        }

+        else if(scheduler == 1)

+        {

+            sch_mode = AIR_QOS_SCH_MODE_WRR;

+            if(weight == AIR_QOS_SHAPER_NOSETTING)

+            {

+                AIR_PRINT("[Warning] No weight value input , plz check\n");

+                return AIR_E_BAD_PARAMETER;

+            }

+            AIR_PRINT("sch_mode is 1\n");

+        }

+        else if(scheduler == 2)

+        {

+            sch_mode = AIR_QOS_SCH_MODE_WFQ;

+            if(weight == AIR_QOS_SHAPER_NOSETTING)

+            {

+                AIR_PRINT("[Warning] No weight value input , plz check\n");

+                return AIR_E_BAD_PARAMETER;

+            }

+        }

+        else

+        {

+            AIR_PRINT("Unknown schedule mode, plz check again\n");

+            return AIR_E_BAD_PARAMETER;

+        }

+        for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++)

+        {

+            if(portlist[0] & (1 << i))

+            {

+                AIR_PRINT("port %d\n", i);

+                ret = air_qos_setScheduleAlgo(0, i, queue, sch_mode, weight);

+                if(AIR_E_OK == ret)

+                {

+                    AIR_PRINT("Set Port%02d Scheduler %s Success.\n", i, sche[scheduler]);

+                }

+                else

+                {

+                    AIR_PRINT("Set Port%02d Scheduler %s Fail.\n", i, sche[scheduler]);

+                }

+            }

+        }

+    }

+    else if(2 == argc)

+    {

+        queue = _strtoul(argv[1], NULL, 0);

+        for(i = 0; i < AIR_MAX_NUM_OF_PORTS; i++)

+        {

+            if(portlist[0] & (1 << i))

+            {

+                ret = air_qos_getScheduleAlgo(0, i, queue, &sch_mode, &weight);

+                if(AIR_E_OK == ret)

+                {

+                    if(sch_mode == AIR_QOS_SCH_MODE_SP)

+                        AIR_PRINT("Get Port%02d queue %d Scheduler %s\n", i, queue, sche[sch_mode]);

+                    else if((sch_mode == AIR_QOS_SCH_MODE_WRR) || (sch_mode == AIR_QOS_SCH_MODE_WFQ))

+                        AIR_PRINT("Get Port%02d queue %d Scheduler %s weight %d\n", i, queue, sche[sch_mode], weight);

+                    else

+                        AIR_PRINT("Get Port%02d queue %d Scheduler unknown\n", i, queue);

+                }

+                else

+                {

+                    AIR_PRINT("Get Port%02d queue %d Scheduler Fail.\n", i, queue);

+                }

+            }

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doQosGet(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(qosGetCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doQosSet(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(qosSetCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doQos(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(qosCmds, argc, argv);

+}

+static AIR_ERROR_NO_T

+doDiagTxComply(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T phy = 0;

+    UI32_T mode = 0;

+

+    phy = _strtoul(argv[0], NULL, 0);

+    if(2 == argc)

+    {

+        /* diag set txComply <phy(0~5)> <mode(0~8)> */

+        mode = _strtoul(argv[1], NULL, 0);

+        ret = air_diag_setTxComplyMode(0, phy, mode);

+        AIR_PRINT("Set diagnostic function: PHY %u Tx Compliance mode = %u ", phy, mode);

+    }

+    else if(1 == argc)

+    {

+        /* diag get txComply <phy(0~5)> */

+        ret = air_diag_getTxComplyMode(0, phy, &mode);

+        AIR_PRINT("Get diagnostic function: PHY %u Tx Compliance mode ", phy);

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return AIR_E_BAD_PARAMETER;

+    }

+

+    if(AIR_E_OK == ret)

+    {

+        AIR_PRINT("Done.\n\tMode=");

+        switch(mode)

+        {

+            case AIR_DIAG_TXCOMPLY_MODE_10M_NLP:

+                AIR_PRINT("%s\n", "10M_NLP");

+                break;

+            case AIR_DIAG_TXCOMPLY_MODE_10M_RANDOM:

+                AIR_PRINT("%s\n", "10M_Random");

+                break;

+            case AIR_DIAG_TXCOMPLY_MODE_10M_SINE:

+                AIR_PRINT("%s\n", "10M_Sine");

+                break;

+            case AIR_DIAG_TXCOMPLY_MODE_100M_PAIR_A:

+                AIR_PRINT("%s\n", "100M_Pair_a");

+                break;

+            case AIR_DIAG_TXCOMPLY_MODE_100M_PAIR_B:

+                AIR_PRINT("%s\n", "100M_Pair_b");

+                break;

+            case AIR_DIAG_TXCOMPLY_MODE_1000M_TM1:

+                AIR_PRINT("%s\n", "1000M_TM1");

+                break;

+            case AIR_DIAG_TXCOMPLY_MODE_1000M_TM2:

+                AIR_PRINT("%s\n", "1000M_TM2");

+                break;

+            case AIR_DIAG_TXCOMPLY_MODE_1000M_TM3:

+                AIR_PRINT("%s\n", "1000M_TM3");

+                break;

+            case AIR_DIAG_TXCOMPLY_MODE_1000M_TM4:

+                AIR_PRINT("%s\n", "1000M_TM4");

+                break;

+            default:

+                break;

+        }

+    }

+    else

+    if(AIR_E_OTHERS == ret)

+    {

+        AIR_PRINT("isn't setting.\n");

+    }

+    else

+    {

+        AIR_PRINT("Fail.\n");

+    }

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doDiagSet(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(diagSetCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doDiagGet(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(diagGetCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doDiag(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(diagCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doLedMode(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T mode = 0;

+

+    if(1 == argc)

+    {

+        /* led set mode <mode(0:disable, 1~3:2 LED, 4:User-Define)> */

+        mode = _strtoul(argv[0], NULL, 0);

+        ret = air_led_setMode(0, 0, mode);

+        AIR_PRINT("Set LED mode ");

+    }

+    else if(0 == argc)

+    {

+        /* led get mode */

+        ret = air_led_getMode(0, 0, &mode);

+        AIR_PRINT("Get LED mode ");

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return AIR_E_BAD_PARAMETER;

+    }

+

+    if(AIR_E_OK == ret)

+    {

+        switch(mode)

+        {

+            case AIR_LED_MODE_DISABLE:

+                AIR_PRINT(": Disabled.\n");

+                break;

+            case AIR_LED_MODE_2LED_MODE0:

+                AIR_PRINT(": LED 0:Link / LED 1:Activity.\n");

+                break;

+            case AIR_LED_MODE_2LED_MODE1:

+                AIR_PRINT(": LED 0:1000M Activity / LED 1:100M Activity.\n");

+                break;

+            case AIR_LED_MODE_2LED_MODE2:

+                AIR_PRINT(": LED 0:1000M Activity / LED 1:10&100M Activity.\n");

+                break;

+            case AIR_LED_MODE_USER_DEFINE:

+                AIR_PRINT(": User-Defined.\n");

+                break;

+            default:

+                AIR_PRINT(": Fail.\n");

+                break;

+        }

+    }

+    else

+    if(AIR_E_OTHERS == ret)

+    {

+        AIR_PRINT(": Unrecognized.\n");

+    }

+    else

+    {

+        AIR_PRINT("Fail.\n");

+    }

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doLedState(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI8_T entity = 0;

+    BOOL_T state = FALSE;

+

+    entity = _strtoul(argv[0], NULL, 0);

+    if(2 == argc)

+    {

+        /* led set state <led(0..1)> <state(1:En 0:Dis)> */

+        state = _strtoul(argv[1], NULL, 0);

+        ret = air_led_setState(0, 0, entity, state);

+        AIR_PRINT("Set LED %u state ", entity);

+    }

+    else if(1 == argc)

+    {

+        /* led get state <led(0..1)> */

+        ret = air_led_getState(0, 0, entity, &state);

+        AIR_PRINT("Get LED %u state ", entity );

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return AIR_E_BAD_PARAMETER;

+    }

+

+    if(AIR_E_OK == ret)

+    {

+        AIR_PRINT(": %s.\n", (state)?"Enable":"Disabled");

+    }

+    else

+    if(AIR_E_OTHERS == ret)

+    {

+        AIR_PRINT(": Unrecognized.\n");

+    }

+    else

+    {

+        AIR_PRINT("Fail.\n");

+    }

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doLedUsrDef(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T i = 0;

+    UI8_T entity = 0;

+    BOOL_T polarity = LOW;

+    UI32_T on_evt_map = 0;

+    UI32_T blk_evt_map = 0;

+    AIR_LED_ON_EVT_T on_evt;

+    AIR_LED_BLK_EVT_T blk_evt;

+

+    entity = _strtoul(argv[0], NULL, 0);

+    if(4 == argc)

+    {

+        /* led set usr <led(0..1)> <polarity(0:low, 1:high)> <on_evt(7'bin)> <blink_evt(10'bin)> */

+        polarity = _strtoul(argv[1], NULL, 0);

+        on_evt_map = _strtoul(argv[2], NULL, 2);

+        blk_evt_map = _strtoul(argv[3], NULL, 2);

+

+        memset(&on_evt, 0, sizeof(AIR_LED_ON_EVT_T));

+        if(on_evt_map & BIT(0))

+        {

+            on_evt.link_1000m = TRUE;

+        }

+        if(on_evt_map & BIT(1))

+        {

+            on_evt.link_100m = TRUE;

+        }

+        if(on_evt_map & BIT(2))

+        {

+            on_evt.link_10m = TRUE;

+        }

+        if(on_evt_map & BIT(3))

+        {

+            on_evt.link_dn = TRUE;

+        }

+        if(on_evt_map & BIT(4))

+        {

+            on_evt.fdx = TRUE;

+        }

+        if(on_evt_map & BIT(5))

+        {

+            on_evt.hdx = TRUE;

+        }

+        if(on_evt_map & BIT(6))

+        {

+            on_evt.force = TRUE;

+        }

+

+        memset(&blk_evt, 0, sizeof(AIR_LED_BLK_EVT_T));

+        if(blk_evt_map & BIT(0))

+        {

+            blk_evt.tx_act_1000m = TRUE;

+        }

+        if(blk_evt_map & BIT(1))

+        {

+            blk_evt.rx_act_1000m = TRUE;

+        }

+        if(blk_evt_map & BIT(2))

+        {

+            blk_evt.tx_act_100m = TRUE;

+        }

+        if(blk_evt_map & BIT(3))

+        {

+            blk_evt.rx_act_100m = TRUE;

+        }

+        if(blk_evt_map & BIT(4))

+        {

+            blk_evt.tx_act_10m = TRUE;

+        }

+        if(blk_evt_map & BIT(5))

+        {

+            blk_evt.rx_act_10m = TRUE;

+        }

+        if(blk_evt_map & BIT(6))

+        {

+            blk_evt.cls = TRUE;

+        }

+        if(blk_evt_map & BIT(7))

+        {

+            blk_evt.rx_crc = TRUE;

+        }

+        if(blk_evt_map & BIT(8))

+        {

+            blk_evt.rx_idle = TRUE;

+        }

+        if(blk_evt_map & BIT(9))

+        {

+            blk_evt.force = TRUE;

+        }

+        ret = air_led_setUsrDef(0, 0, entity, polarity, on_evt, blk_evt);

+        AIR_PRINT("Set LED %u User-define ", entity);

+    }

+    else if(1 == argc)

+    {

+        /* led get usr <led(0..1)> */

+        ret = air_led_getUsrDef(0, 0, entity, &polarity, &on_evt, &blk_evt);

+        AIR_PRINT("Get LED %u User-define ", entity );

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return AIR_E_BAD_PARAMETER;

+    }

+

+    if(AIR_E_OK == ret)

+    {

+        AIR_PRINT("Done.\n");

+        AIR_PRINT("Polarity:%u.\n", polarity);

+        AIR_PRINT("On Event:\n");

+        i = 6;

+        AIR_PRINT("\t(%u)Force on :%s\n", i--, (on_evt.force)?"On":"Off");

+        AIR_PRINT("\t(%u)Half Duplex :%s\n", i--, (on_evt.hdx)?"On":"Off");

+        AIR_PRINT("\t(%u)Full Duplex :%s\n", i--, (on_evt.fdx)?"On":"Off");

+        AIR_PRINT("\t(%u)Link Down :%s\n", i--, (on_evt.link_dn)?"On":"Off");

+        AIR_PRINT("\t(%u)Link 10M :%s\n", i--, (on_evt.link_10m)?"On":"Off");

+        AIR_PRINT("\t(%u)Link 100M :%s\n", i--, (on_evt.link_100m)?"On":"Off");

+        AIR_PRINT("\t(%u)Link 1000M :%s\n", i--, (on_evt.link_1000m)?"On":"Off");

+

+        AIR_PRINT("Blinking Event:\n");

+        i = 9;

+        AIR_PRINT("\t(%u)Force blinks :%s\n", i--, (blk_evt.force)?"On":"Off");

+        AIR_PRINT("\t(%u)Rx Idle Error :%s\n", i--, (blk_evt.rx_idle)?"On":"Off");

+        AIR_PRINT("\t(%u)Rx CRC Error :%s\n", i--, (blk_evt.rx_crc)?"On":"Off");

+        AIR_PRINT("\t(%u)Collision :%s\n", i--, (blk_evt.cls)?"On":"Off");

+        AIR_PRINT("\t(%u)10Mbps RX Activity :%s\n", i--, (blk_evt.rx_act_10m)?"On":"Off");

+        AIR_PRINT("\t(%u)10Mbps TX Activity :%s\n", i--, (blk_evt.tx_act_10m)?"On":"Off");

+        AIR_PRINT("\t(%u)100Mbps RX Activity :%s\n", i--, (blk_evt.rx_act_100m)?"On":"Off");

+        AIR_PRINT("\t(%u)100Mbps TX Activity :%s\n", i--, (blk_evt.tx_act_100m)?"On":"Off");

+        AIR_PRINT("\t(%u)1000Mbps RX Activity :%s\n", i--, (blk_evt.rx_act_1000m)?"On":"Off");

+        AIR_PRINT("\t(%u)1000Mbps TX Activity :%s\n", i--, (blk_evt.tx_act_1000m)?"On":"Off");

+    }

+    else

+    {

+        AIR_PRINT("Fail.\n");

+    }

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doLedBlkTime(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    AIR_LED_BLK_DUR_T time = 0;

+

+    if(1 == argc)

+    {

+        /* led set time <time(0~5)> */

+        time = _strtoul(argv[0], NULL, 0);

+        ret = air_led_setBlkTime(0, 0, time);

+        AIR_PRINT("Set Blinking Duration ");

+    }

+    else if(0 == argc)

+    {

+        /* led get time */

+        ret = air_led_getBlkTime(0, 0, &time);

+        AIR_PRINT("Get Blinking Duration ");

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return AIR_E_BAD_PARAMETER;

+    }

+

+    if(AIR_E_OK == ret)

+    {

+        AIR_PRINT("Done.\n");

+        AIR_PRINT("\tBlinking duration : %u (ms)\n", (32 << time) );

+    }

+    else

+    {

+        AIR_PRINT("Fail.\n");

+    }

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doLedSet(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(ledSetCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doLedGet(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(ledGetCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doLed(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(ledCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doShowVersion(

+    UI32_T argc,

+    C8_T *argv[])

+{

+    AIR_PRINT("VERSION: %s\n", AIR_VER_SDK);

+

+    return AIR_E_OK;

+}

+

+static AIR_ERROR_NO_T

+doShow(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(showCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doStormRate(

+    UI32_T argc,

+    C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T port = 0, type = 0;

+    UI32_T unit = 0, count = 0;

+    C8_T stype[3][5] = {"Bcst", "Mcst", "Ucst"};

+    UI32_T kb = 0;

+

+    port = _strtol(argv[0], NULL, 10);

+    type = _strtol(argv[1], NULL, 10);

+    if(4 == argc)

+    {

+        count = _strtol(argv[2], NULL, 10);

+        unit = _strtol(argv[3], NULL, 10);

+

+        if(0 == unit)

+            kb = 64;

+        else if(1 == unit)

+            kb = 256;

+        else if(2 == unit)

+            kb = 1024;

+        else if(3 == unit)

+            kb = 4096;

+        else

+            kb = 16384;

+        ret = air_sec_setStormRate(0, port, type, count, unit);

+        if(AIR_E_OK == ret)

+        {

+            AIR_PRINT("Set Port%02d %s storm rate (%d * %d) = %d Kbps\n", port, stype[type], count, kb, (count*kb));

+        }

+        else

+        {

+            AIR_PRINT("Set Port%02d %s storm rate Fail.\n", port, stype[type]);

+            AIR_PRINT("Note: Port(0..4) can only select unit(0..3), port(5..6) can only select unit(4)\n");

+        }

+    }

+    else if(2 == argc)

+    {

+        ret = air_sec_getStormRate(0, port, type, &count, &unit);

+        if(AIR_E_OK == ret)

+        {

+            if(0 == unit)

+                kb = 64;

+            else if(1 == unit)

+                kb = 256;

+            else if(2 == unit)

+                kb = 1024;

+            else if(3 == unit)

+                kb = 4096;

+            else

+                kb = 16384;

+            AIR_PRINT("Port%02d %s storm rate (%d * %d) = %d Kbps\n", port, stype[type], count, kb, (count*kb));

+        }

+        else

+        {

+            AIR_PRINT("Get Port%02d %s storm rate Fail\n", port, stype[type]);

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doFldMode(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T port = 0, type = 0;

+    BOOL_T fld_en = 0;

+    C8_T stype[4][5] = {"Bcst", "Mcst", "Ucst", "Qury"};

+    C8_T sen[2][10] = {"Disable", "Enable"};

+

+    port = _strtol(argv[0], NULL, 10);

+    type = _strtol(argv[1], NULL, 10);

+

+    if(2 == argc)

+    {

+        ret = air_sec_getFldMode(0, port, type, &fld_en);

+        if(AIR_E_OK == ret)

+        {

+            AIR_PRINT("Get Port%02d flooding %s frame %s\n", port, stype[type], sen[fld_en]);

+        }

+        else

+        {

+            AIR_PRINT("Get Port%02d flooding %s frame Fail\n", port, stype[type]);

+        }

+    }

+    else if(3 == argc)

+    {

+        fld_en = _strtol(argv[2], NULL, 10);

+        ret = air_sec_setFldMode(0, port, type, fld_en);

+        if(AIR_E_OK == ret)

+        {

+            AIR_PRINT("Set Port%02d flooding %s frame %s Success\n", port, stype[type], sen[fld_en]);

+        }

+        else

+        {

+            AIR_PRINT("Set Port%02d flooding %s frame %s Fail\n", port, stype[type], sen[fld_en]);

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doStormEnable(

+    UI32_T argc,

+    C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T port = 0, type = 0;

+    BOOL_T en = 0;

+    C8_T sen[2][10] = {"Disable", "Enable"};

+    C8_T stype[3][5] = {"Bcst", "Mcst", "Ucst"};

+

+    port = _strtol(argv[0], NULL, 10);

+    type = _strtol(argv[1], NULL, 10);

+    if(3 == argc)

+    {

+        en = _strtol(argv[2], NULL, 10);

+        ret = air_sec_setStormEnable(0, port, type, en);

+        if(AIR_E_OK == ret)

+        {

+            AIR_PRINT("Set Port%02d %s storm %s Success.\n", port, stype[type], sen[en]);

+        }

+        else

+        {

+            AIR_PRINT("Set Port%02d %s storm %s Fail.\n", port, stype[type], sen[en]);

+        }

+    }

+    else if(2 == argc)

+    {

+        ret = air_sec_getStormEnable(0, port, type, &en);

+        if(AIR_E_OK == ret)

+        {

+            AIR_PRINT("Port%02d %s storm %s\n", port, stype[type], sen[en]);

+        }

+        else

+        {

+            AIR_PRINT("Get Port%02d %s storm Fail\n", port, stype[type]);

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doSaLearning(UI32_T argc, C8_T *argv[])

+{

+    UI32_T port = 0;

+    AIR_SEC_PORTSEC_PORT_CONFIG_T port_config;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    port = _strtoul(argv[0], NULL, 0);

+    if(2 == argc)

+    {

+        memset(&port_config, 0, sizeof(AIR_SEC_PORTSEC_PORT_CONFIG_T));

+        rc = air_sec_getPortSecPortCfg(0, port, &port_config);

+        port_config.sa_lrn_en = _strtoul(argv[1], NULL, 0);

+        rc = air_sec_setPortSecPortCfg(0, port, port_config);

+        if(AIR_E_OK == rc)

+        {

+            AIR_PRINT("Set Port%02d sa learn %s Success.\n", port, port_config.sa_lrn_en?"Enable":"Disable");

+        }

+        else

+        {

+            AIR_PRINT("Set Port%02d sa learn %s Fail.\n", port, port_config.sa_lrn_en?"Enable":"Disable");

+        }

+    }

+    else if(1 == argc)

+    {

+        rc = air_sec_getPortSecPortCfg(0, port, &port_config);

+        if(AIR_E_OK == rc)

+        {

+            AIR_PRINT("Port%02d sa learn: %s\n", port, port_config.sa_lrn_en?"Enable":"Disable");

+        }

+        else

+        {

+            AIR_PRINT("Get Port%02d sa learn Fail\n", port);

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        rc = AIR_E_BAD_PARAMETER;

+    }

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doSaLimit(UI32_T argc, C8_T *argv[])

+{

+    UI32_T port = 0;

+    AIR_SEC_PORTSEC_PORT_CONFIG_T port_config;

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+

+    port = _strtoul(argv[0], NULL, 0);

+    if(3 == argc)

+    {

+        memset(&port_config, 0, sizeof(AIR_SEC_PORTSEC_PORT_CONFIG_T));

+        rc = air_sec_getPortSecPortCfg(0, port, &port_config);

+        port_config.sa_lmt_en = _strtoul(argv[1], NULL, 0);

+        port_config.sa_lmt_cnt = _strtoul(argv[2], NULL, 0);

+        rc = air_sec_setPortSecPortCfg(0, port, port_config);

+        if(AIR_E_OK == rc)

+        {

+            AIR_PRINT("Set Port%02d sa limit %s Success.\n", port, port_config.sa_lmt_en?"Enable":"Disable");

+        }

+        else

+        {

+            AIR_PRINT("Set Port%02d sa limit %s Fail.\n", port, port_config.sa_lmt_en?"Enable":"Disable");

+        }

+    }

+    else if(1 == argc)

+    {

+        rc = air_sec_getPortSecPortCfg(0, port, &port_config);

+        if(AIR_E_OK == rc)

+        {

+            AIR_PRINT("Port%02d ", port);

+            AIR_PRINT("sa limit: %s\n", port_config.sa_lmt_en?"Enable":"Disable");

+            if(TRUE == (port_config.sa_lmt_en && (AIR_MAX_NUM_OF_MAC ==  port_config.sa_lmt_cnt)))

+            {

+                AIR_PRINT("Sa learning without limitation\n");

+            }

+            else if(TRUE == (port_config.sa_lmt_en && (AIR_MAX_NUM_OF_MAC >  port_config.sa_lmt_cnt)))

+            {

+                AIR_PRINT("Rx sa allowable learning number: %d\n", port_config.sa_lmt_cnt);

+            }

+        }

+        else

+        {

+            AIR_PRINT("Get Port%02d sa limit Fail\n", port);

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        rc = AIR_E_BAD_PARAMETER;

+    }

+

+    return rc;

+}

+

+static AIR_ERROR_NO_T

+doSecGet(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(secGetCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doSecSet(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(secSetCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doSec(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(secCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doSwitchCpuPortEn(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    BOOL_T cpu_en = FALSE;

+

+    if(0 == argc)

+    {

+        /* switch get sysPhyEn */

+        ret = air_switch_getCpuPortEn(0, &cpu_en);

+        AIR_PRINT("Get Cpu Port State ");

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT(": %s\n", cpu_en?"Enable":"Disable");

+        }

+        else

+        {

+            AIR_PRINT("Fail!\n");

+        }

+    }

+    else if(1 == argc)

+    {

+        /* switch set sysPhyEn <phy_en> */

+        cpu_en = _strtol(argv[0], NULL, 0);

+        ret = air_switch_setCpuPortEn(0, cpu_en);

+        AIR_PRINT("Set CPU port State ");

+        if(ret == AIR_E_OK)

+        {

+            AIR_PRINT(": %s\n", cpu_en?"Enable":"Disable");

+        }

+        else

+        {

+            AIR_PRINT("Fail!\n");

+        }

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doSwitchCpuPort(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    BOOL_T cpu_en = FALSE;

+    UI32_T port = 0;

+    C8_T str_temp[AIR_MAX_NUM_OF_PORTS+1];

+

+    if(1 == argc)

+    {

+        /* switch set cpuPort <portnumber> */

+        port = _strtol(argv[0], NULL, 10);

+        ret = air_switch_setCpuPort(0, port);

+        AIR_PRINT("Set CPU Port ");

+    }

+    else if(0 == argc)

+    {

+        /* switch get cpuPort */

+        ret = air_switch_getCpuPort(0, &port);

+        AIR_PRINT("Get CPU Port ");

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    if(AIR_E_OK == ret)

+    {

+        AIR_PRINT(": %d\n", port);

+    }

+    else

+    {

+        AIR_PRINT("Fail!\n");

+    }

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doSwitchPhyLCIntrEn(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T phy = 0;

+    BOOL_T enable = FALSE;

+

+    if(2 == argc)

+    {

+        /* switch set phyLCIntrEn <phy(0..6)> <(1:En,0:Dis)> */

+        phy    = _strtol(argv[0], NULL, 10);

+        enable = _strtol(argv[1], NULL, 10);

+        ret    = air_switch_setSysIntrEn(0, (phy + AIR_SYS_INTR_TYPE_PHY0_LC), enable);

+    }

+    else if(1 == argc)

+    {

+        /* switch get phyLCIntrEn <phy(0..6)> */

+        phy = _strtol(argv[0], NULL, 10);

+        ret = air_switch_getSysIntrEn(0, (phy + AIR_SYS_INTR_TYPE_PHY0_LC), &enable);

+        AIR_PRINT("PHY(%d) LinkChange interrupt : %s\n", phy, (TRUE == enable) ? "enable" : "disable");

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doSwitchPhyLCIntrSts(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T phy = 0;

+    BOOL_T enable = FALSE;

+

+    if(2 == argc)

+    {

+        /* switch set phyLCIntrSts <phy(0..6)> <(1:En)> */

+        phy    = _strtol(argv[0], NULL, 10);

+        enable = _strtol(argv[1], NULL, 10);

+        ret    = air_switch_setSysIntrStatus(0, (phy + AIR_SYS_INTR_TYPE_PHY0_LC), enable);

+    }

+    else if(1 == argc)

+    {

+        /* switch get phyLCIntrSts <phy(0..6)> */

+        phy = _strtol(argv[0], NULL, 10);

+        ret = air_switch_getSysIntrStatus(0, (phy + AIR_SYS_INTR_TYPE_PHY0_LC), &enable);

+        AIR_PRINT("PHY(%d) LinkChange interrupt state : %s\n", phy, (TRUE == enable) ? "set" : "unset");

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        ret = AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+

+static AIR_ERROR_NO_T

+doSwitchSet(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(switchSetCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doSwitchGet(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(switchGetCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doSwitch(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(switchCmds, argc, argv);

+}

+

+static void _air_acl_printRuleMap(UI32_T *rule_map, UI32_T ary_num)

+{

+    UI32_T i;

+    BOOL_T first;

+

+    first = TRUE;

+    for(i=0; i<ary_num*32; i++)

+    {

+        if(rule_map[i/32] & BIT(i%32))

+        {

+            if(TRUE == first)

+            {

+                AIR_PRINT("%u", i);

+                first = FALSE;

+            }

+            else

+            {

+                AIR_PRINT(",%u", i);

+            }

+        }

+    }

+    AIR_PRINT("\n");

+}

+

+static AIR_ERROR_NO_T

+doAclEn(

+    UI32_T argc,

+    C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T argi=0;

+    UI32_T port = 0;

+    BOOL_T en = FALSE;

+

+    if(1 == argc)

+    {

+        /* acl set en <en(1:En,0:Dis)> */

+        en = _strtoul(argv[argi++], NULL, 2);

+        ret = air_acl_setGlobalState(0, en);

+        AIR_PRINT("Set Global ACL function ");

+    }

+    else if(0 == argc)

+    {

+        /* acl get en */

+        ret = air_acl_getGlobalState(0, &en);

+        AIR_PRINT("Get Global ACL function ");

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return AIR_E_BAD_PARAMETER;

+    }

+

+    if(ret == AIR_E_OK)

+    {

+        AIR_PRINT(": %s\n", (TRUE == en)?"Enable":"Disable");

+    }

+    else

+    {

+        AIR_PRINT("Fail!\n");

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doAclRule(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T rule_idx = 0;

+    BOOL_T state = FALSE, reverse = FALSE, end = FALSE;

+    UI32_T argi = 0, ipv6 = 0, i = 0;

+    AIR_ACL_RULE_T rule;

+    UI8_T tmp_ip[16] = {0};

+    C8_T str_temp[AIR_MAX_NUM_OF_PORTS+1];

+    C8_T str[40];

+

+    memset(&rule, 0, sizeof(AIR_ACL_RULE_T));

+    if(argc >= 6)

+    {

+        /* acl set rule <idx(0..255)> <state(0:Dis,1:En)> <reverse(0:Dis,1:En)> <end(0:Dis,1:En)> <portmap(7'bin)>

+        <ipv6(0:Dis,1:En,2:Not care)>

+        [ dmac <dmac(12'hex)> <dmac_mask(12'hex)> ]

+        [ smac <smac(12'hex)> <smac_mask(12'hex)> ]

+        [ stag <stag(4'hex)> <stag_mask(4'hex)> ]

+        [ ctag <ctag(4'hex)> <ctag_mask(4'hex)> ]

+        [ etype <etype(4'hex)> <etype_mask(4'hex)> ]

+        [ dip <dip(IPADDR)> <dip_mask(IPADDR)> ]

+        [ sip <sip(IPADDR)> <sip_mask(IPADDR)> ]

+        [ dscp <dscp(2'hex)> <dscp_mask(2'hex)> ]

+        [ protocol <protocol(2'hex)> <protocol_mask(2'hex)> ]

+        [ dport <dport(4'hex)> <dport_mask(4'hex)> ]

+        [ sport <sport(4'hex)> <sport_mask(4'hex)> ]

+        [ flow_label <flow_label(4'hex)> <flow_label_mask(4'hex)> ]

+        [ udf <udf(4'hex)> <udf_mask(4'hex)> ] */

+

+        rule_idx = _strtoul(argv[argi++], NULL, 0);

+

+        rule.ctrl.rule_en = _strtoul(argv[argi++], NULL, 0);

+        rule.ctrl.reverse = _strtoul(argv[argi++], NULL, 0);

+        rule.ctrl.end = _strtoul(argv[argi++], NULL, 0);

+

+        rule.key.portmap = _strtoul(argv[argi++], NULL, 2);

+        rule.mask.portmap = (~rule.key.portmap) & AIR_ALL_PORT_BITMAP;

+

+        ipv6 = _strtoul(argv[argi++], NULL, 0);

+        if(0 == ipv6)

+        {

+            rule.key.isipv6 = FALSE;

+            rule.mask.isipv6 = TRUE;

+        }

+        else if(1 == ipv6)

+        {

+            rule.key.isipv6 = TRUE;

+            rule.mask.isipv6 = TRUE;

+        }

+        else

+        {

+            rule.mask.isipv6 = FALSE;

+        }

+

+        if(0 == _strcmp(argv[argi], "dmac"))

+        {

+            argi++;

+            _str2mac(argv[argi++], rule.key.dmac);

+            _str2mac(argv[argi++], rule.mask.dmac);

+            rule.key.fieldmap |= 1 << AIR_ACL_DMAC;

+        }

+

+        if(0 == _strcmp(argv[argi], "smac"))

+        {

+            argi++;

+            _str2mac(argv[argi++], rule.key.smac);

+            _str2mac(argv[argi++], rule.mask.smac);

+            rule.key.fieldmap |= 1 << AIR_ACL_SMAC;

+        }

+

+        if(0 == _strcmp(argv[argi], "stag"))

+        {

+            argi++;

+            rule.key.stag = _strtoul(argv[argi++], NULL, 16);

+            rule.mask.stag = _strtoul(argv[argi++], NULL, 16);

+            rule.key.fieldmap |= 1 << AIR_ACL_STAG;

+        }

+

+        if(0 == _strcmp(argv[argi], "ctag"))

+        {

+            argi++;

+            rule.key.ctag = _strtoul(argv[argi++], NULL, 16);

+            rule.mask.ctag = _strtoul(argv[argi++], NULL, 16);

+            rule.key.fieldmap |= 1 << AIR_ACL_CTAG;

+        }

+

+        if(0 == _strcmp(argv[argi], "etype"))

+        {

+            argi++;

+            rule.key.etype= _strtoul(argv[argi++], NULL, 16);

+            rule.mask.etype = _strtoul(argv[argi++], NULL, 16);

+            rule.key.fieldmap |= 1 << AIR_ACL_ETYPE;

+        }

+

+        if(0 == _strcmp(argv[argi], "dip"))

+        {

+            argi++;

+            if(0 == ipv6)

+            {

+                _str2ipv4(argv[argi++], rule.key.dip);

+                _str2ipv4(argv[argi++], rule.mask.dip);

+            }

+            else if(1 == ipv6)

+            {

+                _str2ipv6(argv[argi++], tmp_ip);

+                rule.key.dip[3] = (tmp_ip[0]<<24) | (tmp_ip[1]<<16) | (tmp_ip[2]<<8) | tmp_ip[3];

+                rule.key.dip[2] = (tmp_ip[4]<<24) | (tmp_ip[5]<<16) | (tmp_ip[6]<<8) | tmp_ip[7];

+                rule.key.dip[1] = (tmp_ip[8]<<24) | (tmp_ip[9]<<16) | (tmp_ip[10]<<8) | tmp_ip[11];

+                rule.key.dip[0] = (tmp_ip[12]<<24) | (tmp_ip[13]<<16) | (tmp_ip[14]<<8) | tmp_ip[15];

+                _str2ipv6(argv[argi++], tmp_ip);

+                rule.mask.dip[3] = (tmp_ip[0]<<24) | (tmp_ip[1]<<16) | (tmp_ip[2]<<8) | tmp_ip[3];

+                rule.mask.dip[2] = (tmp_ip[4]<<24) | (tmp_ip[5]<<16) | (tmp_ip[6]<<8) | tmp_ip[7];

+                rule.mask.dip[1] = (tmp_ip[8]<<24) | (tmp_ip[9]<<16) | (tmp_ip[10]<<8) | tmp_ip[11];

+                rule.mask.dip[0] = (tmp_ip[12]<<24) | (tmp_ip[13]<<16) | (tmp_ip[14]<<8) | tmp_ip[15];

+            }

+            rule.key.fieldmap |= 1 << AIR_ACL_DIP;

+        }

+

+        if(0 == _strcmp(argv[argi], "sip"))

+        {

+            argi++;

+            if(0 == ipv6)

+            {

+                _str2ipv4(argv[argi++], rule.key.sip);

+                _str2ipv4(argv[argi++], rule.mask.sip);

+            }

+            else if(1 == ipv6)

+            {

+                _str2ipv6(argv[argi++], tmp_ip);

+                rule.key.sip[3] = (tmp_ip[0]<<24) | (tmp_ip[1]<<16) | (tmp_ip[2]<<8) | tmp_ip[3];

+                rule.key.sip[2] = (tmp_ip[4]<<24) | (tmp_ip[5]<<16) | (tmp_ip[6]<<8) | tmp_ip[7];

+                rule.key.sip[1] = (tmp_ip[8]<<24) | (tmp_ip[9]<<16) | (tmp_ip[10]<<8) | tmp_ip[11];

+                rule.key.sip[0] = (tmp_ip[12]<<24) | (tmp_ip[13]<<16) | (tmp_ip[14]<<8) | tmp_ip[15];

+                _str2ipv6(argv[argi++], tmp_ip);

+                rule.mask.sip[3] = (tmp_ip[0]<<24) | (tmp_ip[1]<<16) | (tmp_ip[2]<<8) | tmp_ip[3];

+                rule.mask.sip[2] = (tmp_ip[4]<<24) | (tmp_ip[5]<<16) | (tmp_ip[6]<<8) | tmp_ip[7];

+                rule.mask.sip[1] = (tmp_ip[8]<<24) | (tmp_ip[9]<<16) | (tmp_ip[10]<<8) | tmp_ip[11];

+                rule.mask.sip[0] = (tmp_ip[12]<<24) | (tmp_ip[13]<<16) | (tmp_ip[14]<<8) | tmp_ip[15];

+            }

+            rule.key.fieldmap |= 1 << AIR_ACL_SIP;

+        }

+

+        if(0 == _strcmp(argv[argi], "dscp"))

+        {

+            argi++;

+            rule.key.dscp = _strtoul(argv[argi++], NULL, 16);

+            rule.mask.dscp = _strtoul(argv[argi++], NULL, 16);

+            rule.key.fieldmap |= 1 << AIR_ACL_DSCP;

+        }

+

+        if(0 == _strcmp(argv[argi], "protocol"))

+        {

+            argi++;

+            rule.key.protocol = _strtoul(argv[argi++], NULL, 16);

+            rule.mask.protocol = _strtoul(argv[argi++], NULL, 16);

+            rule.key.fieldmap |= 1 << AIR_ACL_PROTOCOL;

+        }

+

+        if(0 == _strcmp(argv[argi], "dport"))

+        {

+            argi++;

+            rule.key.dport = _strtoul(argv[argi++], NULL, 16);

+            rule.mask.dport = _strtoul(argv[argi++], NULL, 16);

+            rule.key.fieldmap |= 1 << AIR_ACL_DPORT;

+        }

+

+        if(0 == _strcmp(argv[argi], "sport"))

+        {

+            argi++;

+            rule.key.sport = _strtoul(argv[argi++], NULL, 16);

+            rule.mask.sport = _strtoul(argv[argi++], NULL, 16);

+            rule.key.fieldmap |= 1 << AIR_ACL_SPORT;

+        }

+

+        if(0 == _strcmp(argv[argi], "flow_label"))

+        {

+            argi++;

+            rule.key.flow_label= _strtoul(argv[argi++], NULL, 16);

+            rule.mask.flow_label= _strtoul(argv[argi++], NULL, 16);

+            rule.key.fieldmap |= 1 << AIR_ACL_FLOW_LABEL;

+        }

+

+        if(0 == _strcmp(argv[argi], "udf"))

+        {

+            argi++;

+            rule.key.udf = _strtoul(argv[argi++], NULL, 16);

+            rule.mask.udf = _strtoul(argv[argi++], NULL, 16);

+            rule.key.fieldmap |= 1 << AIR_ACL_UDF;

+        }

+

+        rule.mask.fieldmap = rule.key.fieldmap;

+        ret = air_acl_setRule(0, rule_idx, &rule);

+        if(ret < AIR_E_LAST)

+            AIR_PRINT("Set ACL Rule(%u): %s\n", rule_idx, air_error_getString(ret));

+    }

+    else if(1 == argc)

+    {

+        rule_idx = _strtoul(argv[0], NULL, 0);

+        ret = air_acl_getRule(0, rule_idx, &rule);

+        if(ret < AIR_E_LAST)

+            AIR_PRINT("Get ACL Rule(%u): %s\n", rule_idx, air_error_getString(ret));

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return AIR_E_BAD_PARAMETER;

+    }

+

+    if(AIR_E_OK == ret)

+    {

+        if(TRUE == rule.ctrl.rule_en)

+        {

+            AIR_PRINT("\t Rule end          : %s\n", (TRUE == rule.ctrl.end)?"Enable":"Disable");

+            AIR_PRINT("\t Rule reverse      : %s\n", (TRUE == rule.ctrl.reverse)?"Enable":"Disable");

+            _hex2bitstr((~rule.mask.portmap) & AIR_ALL_PORT_BITMAP, str_temp, AIR_MAX_NUM_OF_PORTS+1);

+            AIR_PRINT("\t Portmap[0:6]      : %s\n", str_temp);

+            for(i = AIR_ACL_DMAC; i < AIR_ACL_FIELD_TYPE_LAST; i++)

+            {

+                if((1 << i) & rule.mask.fieldmap)

+                {

+                    switch (i)

+                    {

+                        case AIR_ACL_DMAC:

+                            AIR_PRINT("\t dmac: ");

+                            AIR_PRINT("%02x-%02x-%02x-%02x-%02x-%02x",

+                            rule.key.dmac[0], rule.key.dmac[1], rule.key.dmac[2],

+                            rule.key.dmac[3], rule.key.dmac[4], rule.key.dmac[5]);

+                            AIR_PRINT(", dmac-mask: ");

+                            AIR_PRINT("%02x-%02x-%02x-%02x-%02x-%02x\n",

+                            rule.mask.dmac[0], rule.mask.dmac[1], rule.mask.dmac[2],

+                            rule.mask.dmac[3], rule.mask.dmac[4], rule.mask.dmac[5]);

+                            break;

+                        case AIR_ACL_SMAC:

+                            AIR_PRINT("\t smac: ");

+                            AIR_PRINT("%02x-%02x-%02x-%02x-%02x-%02x",

+                            rule.key.smac[0], rule.key.smac[1], rule.key.smac[2],

+                            rule.key.smac[3], rule.key.smac[4], rule.key.smac[5]);

+                            AIR_PRINT(", smac-mask: ");

+                            AIR_PRINT("%02x-%02x-%02x-%02x-%02x-%02x\n",

+                            rule.mask.smac[0], rule.mask.smac[1], rule.mask.smac[2],

+                            rule.mask.smac[3], rule.mask.smac[4], rule.mask.smac[5]);

+                            break;

+                        case AIR_ACL_ETYPE:

+                            AIR_PRINT("\t etype: 0x%x, etype-mask: 0x%x\n", rule.key.etype, rule.mask.etype);

+                            break;

+                        case AIR_ACL_STAG:

+                            AIR_PRINT("\t stag: 0x%x, stag-mask: 0x%x\n", rule.key.stag, rule.mask.stag);

+                            break;

+                        case AIR_ACL_CTAG:

+                            AIR_PRINT("\t ctag: 0x%x, ctag-mask: 0x%x\n", rule.key.ctag, rule.mask.ctag);

+                            break;

+                        case AIR_ACL_DPORT:

+                            AIR_PRINT("\t dport: 0x%x, dport-mask: 0x%x\n", rule.key.dport, rule.mask.dport);

+                            break;

+                        case AIR_ACL_SPORT:

+                            AIR_PRINT("\t sport: 0x%x, sport-mask: 0x%x\n", rule.key.sport, rule.mask.sport);

+                            break;

+                        case AIR_ACL_UDF:

+                            AIR_PRINT("\t udf: 0x%x, udf-mask: 0x%x\n", rule.key.udf, rule.mask.udf);

+                            break;

+                        case AIR_ACL_DIP:

+                            if (0 == rule.key.isipv6)

+                            {

+                                AIR_PRINT("\t dip: ");

+                                AIR_PRINT("%d.%d.%d.%d",

+                                ((rule.key.dip[0])&0xFF000000)>>24,((rule.key.dip[0])&0x00FF0000)>>16,

+                                ((rule.key.dip[0])&0x0000FF00)>>8, ((rule.key.dip[0])&0x000000FF));

+                                AIR_PRINT(", dip-mask: ");

+                                AIR_PRINT("%d.%d.%d.%d\n ",

+                                ((rule.mask.dip[0])&0xFF000000)>>24,((rule.mask.dip[0])&0x00FF0000)>>16,

+                                ((rule.mask.dip[0])&0x0000FF00)>>8, ((rule.mask.dip[0])&0x000000FF));

+                            }

+                            else

+                            {

+                                for(i=0; i<4; i++){

+                                    tmp_ip[i] = (rule.key.dip[3] >> (8*(3-i))) & 0xff;

+                                    AIR_PRINT("get tmp_ip[%d]=0x%x\n", i, tmp_ip[i]);

+                                }

+                                for(i=4; i<8; i++){

+                                    tmp_ip[i] = (rule.key.dip[2] >> (8*(7-i))) & 0xff;

+                                }

+                                for(i=8; i<12; i++){

+                                    tmp_ip[i] = (rule.key.dip[1] >> (8*(11-i))) & 0xff;

+                                }

+                                for(i=12; i<16; i++){

+                                    tmp_ip[i] = (rule.key.dip[0] >> (8*(15-i))) & 0xff;

+                                }

+

+                                AIR_PRINT("\t dip: ");

+                                AIR_PRINT("%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x",

+                                    tmp_ip[0], tmp_ip[1],tmp_ip[2], tmp_ip[3],tmp_ip[4], tmp_ip[5],tmp_ip[6], tmp_ip[7],

+                                    tmp_ip[8], tmp_ip[9],tmp_ip[10], tmp_ip[11],tmp_ip[12], tmp_ip[13],tmp_ip[14], tmp_ip[15]);

+                                for(i=0; i<4; i++){

+                                    tmp_ip[i] = (rule.mask.dip[3] >> (8*(3-i))) & 0xff;

+                                }

+                                for(i=4; i<8; i++){

+                                    tmp_ip[i] = (rule.mask.dip[2] >> (8*(7-i))) & 0xff;

+                                }

+                                for(i=8; i<12; i++){

+                                    tmp_ip[i] = (rule.mask.dip[1] >> (8*(11-i))) & 0xff;

+                                }

+                                for(i=12; i<16; i++){

+                                    tmp_ip[i] = (rule.mask.dip[0] >> (8*(15-i))) & 0xff;

+                                }

+                                AIR_PRINT(", dip-mask: ");

+                                AIR_PRINT("%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\n",

+                                    tmp_ip[0], tmp_ip[1],tmp_ip[2], tmp_ip[3],tmp_ip[4], tmp_ip[5],tmp_ip[6], tmp_ip[7],

+                                    tmp_ip[8], tmp_ip[9],tmp_ip[10], tmp_ip[11],tmp_ip[12], tmp_ip[13],tmp_ip[14], tmp_ip[15]);

+                            }

+                            break;

+                        case AIR_ACL_SIP:

+                            if (0 == rule.key.isipv6)

+                            {

+                                AIR_PRINT("\t sip: ");

+                                AIR_PRINT("%d.%d.%d.%d ",

+                                ((rule.key.sip[0])&0xFF000000)>>24,((rule.key.sip[0])&0x00FF0000)>>16,

+                                ((rule.key.sip[0])&0x0000FF00)>>8, ((rule.key.sip[0])&0x000000FF));

+                                AIR_PRINT(", sip-mask: ");

+                                AIR_PRINT("%d.%d.%d.%d\n ",

+                                ((rule.mask.sip[0])&0xFF000000)>>24,((rule.mask.sip[0])&0x00FF0000)>>16,

+                                ((rule.mask.sip[0])&0x0000FF00)>>8, ((rule.mask.sip[0])&0x000000FF));

+                            }

+                            else

+                            {

+                                for(i=0; i<4; i++){

+                                    tmp_ip[i] = (rule.key.sip[3] >> (8*(3-i))) & 0xff;

+                                }

+                                for(i=4; i<8; i++){

+                                    tmp_ip[i] = (rule.key.sip[2] >> (8*(7-i))) & 0xff;

+                                }

+                                for(i=8; i<12; i++){

+                                    tmp_ip[i] = (rule.key.sip[1] >> (8*(11-i))) & 0xff;

+                                }

+                                for(i=12; i<16; i++){

+                                    tmp_ip[i] = (rule.key.sip[0] >> (8*(15-i))) & 0xff;

+                                }

+                                AIR_PRINT("\t sip: ");

+                                AIR_PRINT("%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x",

+                                    tmp_ip[0], tmp_ip[1],tmp_ip[2], tmp_ip[3],tmp_ip[4], tmp_ip[5],tmp_ip[6], tmp_ip[7],

+                                    tmp_ip[8], tmp_ip[9],tmp_ip[10], tmp_ip[11],tmp_ip[12], tmp_ip[13],tmp_ip[14], tmp_ip[15]);

+                                for(i=0; i<4; i++){

+                                    tmp_ip[i] = (rule.mask.sip[3] >> (8*(3-i))) & 0xff;

+                                }

+                                for(i=4; i<8; i++){

+                                    tmp_ip[i] = (rule.mask.sip[2] >> (8*(7-i))) & 0xff;

+                                }

+                                for(i=8; i<12; i++){

+                                    tmp_ip[i] = (rule.mask.sip[1] >> (8*(11-i))) & 0xff;

+                                }

+                                for(i=12; i<16; i++){

+                                    tmp_ip[i] = (rule.mask.sip[0] >> (8*(15-i))) & 0xff;

+                                }

+                                AIR_PRINT(", sip-mask: ");

+                                AIR_PRINT("%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\n",

+                                    tmp_ip[0], tmp_ip[1],tmp_ip[2], tmp_ip[3],tmp_ip[4], tmp_ip[5],tmp_ip[6], tmp_ip[7],

+                                    tmp_ip[8], tmp_ip[9],tmp_ip[10], tmp_ip[11],tmp_ip[12], tmp_ip[13],tmp_ip[14], tmp_ip[15]);

+                            }

+                            break;

+                        case AIR_ACL_DSCP:

+                            AIR_PRINT("\t dscp: 0x%x, dscp-mask: 0x%x\n", rule.key.dscp, rule.mask.dscp);

+                            break;

+                        case AIR_ACL_PROTOCOL:

+                            AIR_PRINT("\t protocol: 0x%x, protocol-mask: 0x%x\n", rule.key.protocol, rule.mask.protocol);

+                            break;

+                        case AIR_ACL_FLOW_LABEL:

+                            AIR_PRINT("\t flow-label: 0x%x, flow-label-mask: 0x%x\n", rule.key.flow_label, rule.mask.flow_label);

+                            break;

+                        default:

+                            AIR_PRINT("error\n");

+                            break;

+                    }

+                }

+            }

+        }

+        else

+        {

+            AIR_PRINT("Entry is Invalid.\n");

+        }

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doAclRmvRule(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T rule_idx = 0;

+

+    if(1 == argc)

+    {

+        /* acl del rule <idx(0..127)> */

+        rule_idx = _strtoul(argv[0], NULL, 0);

+        ret = air_acl_delRule(0, rule_idx);

+        if(ret < AIR_E_LAST)

+            AIR_PRINT("Delete ACL Rule(%u): %s\n", rule_idx, air_error_getString(ret));

+    }

+    else if(0 == argc)

+    {

+        /* acl clear rule */

+        ret = air_acl_clearRule(0);

+        if(ret < AIR_E_LAST)

+            AIR_PRINT("Clear ACL Rule: %s\n", air_error_getString(ret));

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doAclUdfRule(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T rule_idx;

+    AIR_ACL_UDF_RULE_T rule;

+    C8_T start_addr[8][12]=

+    {

+        "MAC header",

+        "L2 payload",

+        "IPv4 header",

+        "IPv6 header",

+        "L3 payload",

+        "TCP header",

+        "UDP header",

+        "L4 payload"

+    };

+    C8_T str_temp[AIR_MAX_NUM_OF_PORTS+1];

+

+    memset(&rule, 0, sizeof(AIR_ACL_UDF_RULE_T));

+    if(7 == argc)

+    {

+        /* acl set rule <idx(0..255)> <mode(0:pattern, 1:threshold)> [ <pat(4'hex)> <mask(4'hex)> | <low(4'hex)> <high(4'hex)> ] <start(0:MAC,1:ether,2:IP,3:IP_data,4:TCP/UDP,5:TCP/UDP data,6:IPv6)> <offset(0..62,unit:2 bytes)> <portmap(7'bin)> */

+        rule_idx = _strtoul(argv[0], NULL, 0);

+        rule.cmp_sel = _strtoul(argv[1], NULL, 2);

+        if(AIR_ACL_RULE_CMP_SEL_PATTERN == rule.cmp_sel)

+        {

+            rule.pattern = _strtoul(argv[2], NULL, 16);

+            rule.mask = _strtoul(argv[3], NULL, 16);

+        }

+        else

+        {

+            rule.low_threshold = _strtoul(argv[2], NULL, 16);

+            rule.high_threshold = _strtoul(argv[3], NULL, 16);

+        }

+        rule.offset_format = _strtoul(argv[4], NULL, 0);

+        rule.offset = _strtoul(argv[5], NULL, 0);

+        rule.portmap = _strtoul(argv[6], NULL, 2);

+        rule.valid = TRUE;

+        ret = air_acl_setUdfRule(0, rule_idx, rule);

+        if(ret < AIR_E_LAST)

+            AIR_PRINT("Set ACL UDF Rule(%u): %s\n", rule_idx, air_error_getString(ret));

+    }

+    else if(1 == argc)

+    {

+        rule_idx = _strtoul(argv[0], NULL, 0);

+        ret = air_acl_getUdfRule(0, rule_idx, &rule);

+        if(ret < AIR_E_LAST)

+            AIR_PRINT("Get ACL UDF Rule(%u): %s\n", rule_idx, air_error_getString(ret));

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return AIR_E_BAD_PARAMETER;

+    }

+

+    if(AIR_E_OK == ret)

+    {

+        if(TRUE == rule.valid)

+        {

+            AIR_PRINT("\tMode          : %s\n", (AIR_ACL_RULE_CMP_SEL_PATTERN == rule.cmp_sel)?"Pattern":"Threshold");

+            if(AIR_ACL_RULE_CMP_SEL_PATTERN == rule.cmp_sel)

+            {

+                AIR_PRINT("\tPattern       : 0x%04X\n", rule.pattern);

+                AIR_PRINT("\tMask          : 0x%04X\n", rule.mask);

+            }

+            else

+            {

+                AIR_PRINT("\tLow Threshold : 0x%04X\n", rule.low_threshold);

+                AIR_PRINT("\tHigh Threshold: 0x%04X\n", rule.high_threshold);

+            }

+            AIR_PRINT("\tOffset Start  : %s\n", start_addr[rule.offset_format]);

+            AIR_PRINT("\tOffset        : %u %s\n", rule.offset*2, (0==rule.offset)?"Byte":"Bytes");

+            _hex2bitstr(rule.portmap, str_temp, AIR_MAX_NUM_OF_PORTS+1);

+            AIR_PRINT("\tPortmap[0:6]  : %s\n", str_temp);

+        }

+        else

+        {

+            AIR_PRINT("Entry is Invalid.\n");

+        }

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doAclRmvUdfRule(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T rule_idx;

+

+    if(1 == argc)

+    {

+        /* acl del udfRule <idx(0..15)> */

+        rule_idx = _strtoul(argv[0], NULL, 0);

+        ret = air_acl_delUdfRule(0, rule_idx);

+        if(ret < AIR_E_LAST)

+            AIR_PRINT("Delete ACL UDF Rule(%u): %s\n", rule_idx, air_error_getString(ret));

+    }

+    else if(0 == argc)

+    {

+        /* acl clear udfRule */

+        ret = air_acl_clearUdfRule(0);

+        if(ret < AIR_E_LAST)

+            AIR_PRINT("Clear ACL UDF Rule: %s\n", air_error_getString(ret));

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doAclAction(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T argi = 0;

+    UI32_T act_idx;

+    AIR_ACL_ACTION_T act;

+    UI32_T redirect, trtcm, fwd;

+    C8_T fwding[AIR_ACL_ACT_FWD_LAST][25] =

+    {

+        "Default",

+        "Default",

+        "Default",

+        "Default",

+        "Default & CPU excluded",

+        "Default & CPU included",

+        "CPU only",

+        "Drop"

+    };

+    C8_T trtcm_usr[AIR_ACL_ACT_USR_TCM_LAST][8] =

+    {

+        "Default",

+        "Green",

+        "Yellow",

+        "Red"

+    };

+    C8_T egtag[AIR_ACL_ACT_EGTAG_LAST][11] =

+    {

+        "Default",

+        "Consistent",

+        "",

+        "",

+        "Untag",

+        "Swap",

+        "Tag",

+        "Stack"

+    };

+    C8_T str_temp[20];

+

+    memset(&act, 0, sizeof(AIR_ACL_ACTION_T));

+    if(2 < argc)

+    {

+        /* acl set action <idx(0..127)>

+        [ forward <forward(0:Default,4:Exclude CPU,5:Include CPU,6:CPU only,7:Drop)> ]

+        [ egtag <egtag(0:Default,1:Consistent,4:Untag,5:Swap,6:Tag,7:Stack)> ]

+        [ mirrormap <mirrormap(2'bin)> ]

+        [ priority <priority(0..7)> ]

+        [ redirect <redirect(0:Dst,1:Vlan)> <portmap(7'bin)> ]

+        [ leaky_vlan <leaky_vlan(1:En,0:Dis)> ]

+        [ cnt_idx <cnt_idx(0..63)> ]

+        [ rate_idx <rate_idx(0..31)> ]

+        [ attack_idx <attack_idx(0..95)> ]

+        [ vid <vid(0..4095)> ]

+        [ manage <manage(1:En,0:Dis)> ]

+        [ bpdu <bpdu(1:En,0:Dis)> ]

+        [ class <class(0:Original,1:Defined)>[0..7] ]

+        [ drop_pcd <drop_pcd(0:Original,1:Defined)> [red <red(0..7)>][yellow <yellow(0..7)>][green <green(0..7)>] ]

+        [ color <color(0:Defined,1:Trtcm)> [ <defined_color(0:Dis,1:Green,2:Yellow,3:Red)> | <trtcm_idx(0..31)> ] ]*/

+

+        act_idx = _strtoul(argv[argi++], NULL, 0);

+        if(0 == _strcmp(argv[argi], "forward"))

+        {

+            argi++;

+            fwd = _strtoul(argv[argi++], NULL, 0);

+            act.fwd_en = TRUE;

+            act.fwd = fwd;

+        }

+

+        if(0 == _strcmp(argv[argi], "egtag"))

+        {

+            argi++;

+            act.egtag_en = TRUE;

+            act.egtag = _strtoul(argv[argi++], NULL, 0);

+        }

+

+        if(0 == _strcmp(argv[argi], "mirrormap"))

+        {

+            argi++;

+            act.mirrormap = _strtoul(argv[argi++], NULL, 2);

+        }

+

+        if(0 == _strcmp(argv[argi], "priority"))

+        {

+            argi++;

+            act.pri_user_en = TRUE;

+            act.pri_user= _strtoul(argv[argi++], NULL, 0);

+        }

+

+        if(0 == _strcmp(argv[argi], "redirect"))

+        {

+            argi++;

+            redirect = _strtoul(argv[argi++], NULL, 0);

+            if(0 ==  redirect)

+            {

+                act.port_en = TRUE;

+                act.dest_port_sel = TRUE;

+                act.portmap = _strtoul(argv[argi++], NULL, 2);

+            }

+            else

+            {

+                act.port_en = TRUE;

+                act.vlan_port_sel = TRUE;

+                act.portmap = _strtoul(argv[argi++], NULL, 2);

+            }

+        }

+

+        if(0 == _strcmp(argv[argi], "leaky_vlan"))

+        {

+            argi++;

+            act.lyvlan_en = TRUE;

+            act.lyvlan = _strtoul(argv[argi++], NULL, 0);

+        }

+

+        /* ACL event counter */

+        if(0 == _strcmp(argv[argi], "cnt_idx"))

+        {

+            argi++;

+            act.cnt_en = TRUE;

+            act.cnt_idx = _strtol(argv[argi++], NULL, 0);

+        }

+

+        if(0 == _strcmp(argv[argi], "rate_idx"))

+        {

+            argi++;

+            act.rate_en = TRUE;

+            act.rate_idx = _strtol(argv[argi++], NULL, 0);

+        }

+

+        if(0 == _strcmp(argv[argi], "attack_idx"))

+        {

+            argi++;

+            act.attack_en = TRUE;

+            act.attack_idx = _strtol(argv[argi++], NULL, 0);

+        }

+

+        if(0 == _strcmp(argv[argi], "vid"))

+        {

+            argi++;

+            act.vlan_en = TRUE;

+            act.vlan_idx = _strtol(argv[argi++], NULL, 0);

+        }

+

+        /* Management frame */

+        if(0 == _strcmp(argv[argi], "manage"))

+        {

+            argi++;

+            act.mang = _strtoul(argv[argi++], NULL, 2);

+        }

+

+        if(0 == _strcmp(argv[argi], "bpdu"))

+        {

+            argi++;

+            act.bpdu = _strtoul(argv[argi++], NULL, 2);

+        }

+

+        /* DSCP class remap */

+        if(0 == _strcmp(argv[argi], "class"))

+        {

+            argi++;

+            act.trtcm_en = TRUE;

+            act.trtcm.cls_slr_sel = _strtoul(argv[argi++], NULL, 2);

+            if(TRUE == act.trtcm.cls_slr_sel)

+            {

+                act.trtcm.cls_slr = _strtoul(argv[argi++], NULL, 0);

+            }

+        }

+        if(0 == _strcmp(argv[argi], "drop_pcd"))

+        {

+            argi++;

+            act.trtcm_en = TRUE;

+            act.trtcm.drop_pcd_sel = _strtoul(argv[argi++], NULL, 2);

+            if(TRUE == act.trtcm.drop_pcd_sel)

+            {

+                if(0 == _strcmp(argv[argi], "red"))

+                {

+                    argi++;

+                    act.trtcm.drop_pcd_r= _strtoul(argv[argi++], NULL, 0);

+                }

+                if(0 == _strcmp(argv[argi], "yellow"))

+                {

+                    argi++;

+                    act.trtcm.drop_pcd_y= _strtoul(argv[argi++], NULL, 0);

+                }

+                if(0 == _strcmp(argv[argi], "green"))

+                {

+                    argi++;

+                    act.trtcm.drop_pcd_g= _strtoul(argv[argi++], NULL, 0);

+                }

+            }

+        }

+

+        /* trTCM */

+        if(0 == _strcmp(argv[argi], "color"))

+        {

+            argi++;

+            act.trtcm_en = TRUE;

+            act.trtcm.tcm_sel = _strtoul(argv[argi++], NULL, 2);

+            trtcm = _strtoul(argv[argi++], NULL, 0);

+            if(FALSE == act.trtcm.tcm_sel)

+            {

+                act.trtcm.usr_tcm = trtcm;

+            }

+            else

+            {

+                act.trtcm.tcm_idx = trtcm;

+            }

+        }

+        ret = air_acl_setAction(0, act_idx, act);

+        AIR_PRINT("Set ACL Action(%u): %s\n", act_idx, air_error_getString(ret));

+    }

+    else if(1 == argc)

+    {

+        /* acl get action <idx(0..127)> */

+        act_idx = _strtoul(argv[argi++], NULL, 0);

+        ret = air_acl_getAction(0, act_idx, &act);

+        AIR_PRINT("Get ACL Action(%u): %s\n", act_idx, air_error_getString(ret));

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return AIR_E_BAD_PARAMETER;

+    }

+

+    if(AIR_E_OK == ret)

+    {

+        if(TRUE == act.fwd_en)

+        {

+            AIR_PRINT("\t Forwarding           : %s\n", fwding[act.fwd]);

+        }

+

+        if(TRUE == act.egtag_en)

+        {

+            AIR_PRINT("\t Egress tag           : %s\n", egtag[act.egtag]);

+        }

+

+        if(act.mirrormap)

+        {

+            AIR_PRINT("\t Mirror Session Map   : %u\n", act.mirrormap);

+        }

+

+        if(TRUE == act.pri_user_en)

+        {

+            AIR_PRINT("\t User Priority        : %u\n", act.pri_user);

+        }

+

+        if(TRUE == act.port_en)

+        {

+            _hex2bitstr(act.portmap, str_temp, AIR_MAX_NUM_OF_PORTS+1);

+            if(TRUE == act.dest_port_sel)

+            {

+                AIR_PRINT("\t Destination Port[0:6]: %s\n", str_temp);

+            }

+            else

+            {

+                AIR_PRINT("\t VLAN Port[0:6]       : %s\n", str_temp);

+            }

+        }

+

+        if(TRUE == act.lyvlan_en)

+        {

+            AIR_PRINT("\t Leaky VLAN           : %s\n", (TRUE == act.lyvlan)?"Enable":"Disable");

+        }

+        AIR_PRINT("\t Management Frame     : %s\n", (TRUE == act.mang)?"Enable":"Disable");

+        AIR_PRINT("\t BPDU Frame           : %s\n", (TRUE == act.bpdu)?"Enable":"Disable");

+

+        if(TRUE == act.cnt_en)

+        {

+            AIR_PRINT("\t Event Index          : %u\n", act.cnt_idx);

+        }

+

+        /* trTCM*/

+        if(TRUE == act.trtcm_en)

+        {

+            if(TRUE == act.trtcm.cls_slr_sel)

+            {

+                AIR_PRINT("\t Class Selector Remap : %u\n", act.trtcm.cls_slr);

+            }

+            else

+            {

+                AIR_PRINT("\t Class Selector Remap : %s\n", "Disable");

+            }

+            if(TRUE == act.trtcm.drop_pcd_sel)

+            {

+                AIR_PRINT("\t Drop Precedence Remap(Red): %u\n", act.trtcm.drop_pcd_r);

+                AIR_PRINT("\t Drop Precedence Remap(Yel): %u\n", act.trtcm.drop_pcd_y);

+                AIR_PRINT("\t Drop Precedence Remap(Gre): %u\n", act.trtcm.drop_pcd_g);

+            }

+            else

+            {

+                AIR_PRINT("\t Drop Precedence Remap: %s\n", "Disable");

+            }

+

+            if(TRUE == act.trtcm.tcm_sel)

+            {

+                AIR_PRINT("\t trTCM Meter Index    : %u\n", act.trtcm.tcm_idx);

+            }

+            else

+            {

+                AIR_PRINT("\t trTCM User Defined   : %s\n", trtcm_usr[act.trtcm.usr_tcm]);

+            }

+        }

+        /* rate control */

+        if(TRUE == act.rate_en)

+        {

+            AIR_PRINT("\t Rate Control Index   : %u\n", act.rate_idx);

+        }

+

+        if(TRUE == act.attack_en)

+        {

+            AIR_PRINT("\t Attack Rate Control Index: %u\n", act.attack_idx);

+        }

+

+        if(TRUE == act.vlan_en)

+        {

+            AIR_PRINT("\t ACL VLAN Index       : %u\n", act.vlan_idx);

+        }

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doAclRmvAction(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T act_idx;

+

+    if(1 == argc)

+    {

+        /* acl del action <idx(0..127)> */

+        act_idx = _strtoul(argv[0], NULL, 0);

+        ret = air_acl_delAction(0, act_idx);

+        if(ret < AIR_E_LAST)

+            AIR_PRINT("Delete ACL Action(%u): %s\n", act_idx, air_error_getString(ret));

+    }

+    else if(0 == argc)

+    {

+        /* acl clear action */

+        ret = air_acl_clearAction(0);

+        if(ret < AIR_E_LAST)

+            AIR_PRINT("Clear ACL Action: %s\n", air_error_getString(ret));

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doAclTrtcm(

+    UI32_T argc,

+    C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T argi = 0;

+    UI32_T tcm_idx;

+    AIR_ACL_TRTCM_T tcm;

+

+    memset(&tcm, 0, sizeof(AIR_ACL_TRTCM_T));

+    if(5 == argc)

+    {

+        /* acl set trtcm <idx(0..31)> <cir(4'hex)> <pir(4'hex)> <cbs(4'hex)> <pbs(4'hex)> */

+        tcm_idx = _strtoul(argv[argi++], NULL, 0);

+        tcm.cir = _strtoul(argv[argi++], NULL, 16);

+        tcm.pir = _strtoul(argv[argi++], NULL, 16);

+        tcm.cbs = _strtoul(argv[argi++], NULL, 16);

+        tcm.pbs = _strtoul(argv[argi++], NULL, 16);

+

+        ret = air_acl_setTrtcm(0, tcm_idx, tcm);

+        if(ret < AIR_E_LAST)

+            AIR_PRINT("Set ACL trTCM(%u): %s\n", tcm_idx, air_error_getString(ret));

+    }

+    else if(1 == argc)

+    {

+        /* acl get trtcm <idx(1..31)> */

+        tcm_idx = _strtoul(argv[argi++], NULL, 0);

+        ret = air_acl_getTrtcm(0, tcm_idx, &tcm);

+        if(ret < AIR_E_LAST)

+            AIR_PRINT("Get ACL trTCM(%u): %s\n", tcm_idx, air_error_getString(ret));

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return AIR_E_BAD_PARAMETER;

+    }

+

+    if(AIR_E_OK == ret)

+    {

+        AIR_PRINT("\t CIR: 0x%04X(unit:64Kbps)\n", tcm.cir);

+        AIR_PRINT("\t PIR: 0x%04X(unit:64Kbps)\n", tcm.pir);

+        AIR_PRINT("\t CBS: 0x%04X(unit:Byte)\n", tcm.cbs);

+        AIR_PRINT("\t PBS: 0x%04X(unit:Byte)\n", tcm.pbs);

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doAclTrtcmEn(

+    UI32_T argc,

+    C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    BOOL_T state = FALSE;

+

+    if (1 == argc)

+    {

+        /* acl set trtcmEn <en(1:En,0:Dis)> */

+        state = _strtol(argv[0], NULL, 10);

+        ret = air_acl_setTrtcmEnable(0, state);

+        AIR_PRINT("Set trTCM State ");

+    }

+    else if (0 == argc)

+    {

+        /* acl get trtcmEn */

+        ret = air_acl_getTrtcmEnable(0, &state);

+        AIR_PRINT("Get trTCM State ");

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return AIR_E_BAD_PARAMETER;

+    }

+

+    if (ret == AIR_E_OK)

+    {

+        AIR_PRINT(": %s\n", (TRUE == state) ? "Enable" : "Disable");

+    }

+    else

+    {

+        AIR_PRINT("Fail!\n");

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doAclRmvTrtcm(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T tcm_idx;

+

+    if(1 == argc)

+    {

+        /* acl del trtcm <idx(1..31)> */

+        tcm_idx = _strtoul(argv[0], NULL, 0);

+        ret = air_acl_delTrtcm(0, tcm_idx);

+        if(ret < AIR_E_LAST)

+            AIR_PRINT("Delete ACL TRTCM(%u): %s\n", tcm_idx, air_error_getString(ret));

+    }

+    else if(0 == argc)

+    {

+        /* acl clear trtcm */

+        ret = air_acl_clearTrtcm(0);

+        if(ret < AIR_E_LAST)

+            AIR_PRINT("Clear ACL TRTCM: %s\n", air_error_getString(ret));

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return AIR_E_BAD_PARAMETER;

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doAclPortEn(

+    UI32_T argc,

+    C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T argi=0;

+    UI32_T port = 0;

+    BOOL_T en;

+

+    if(2 == argc)

+    {

+        /* acl set portEn <port(0..6)> <en(1:En,0:Dis)> */

+        port = _strtoul(argv[argi++], NULL, 0);

+        en = _strtoul(argv[argi++], NULL, 2);

+        ret = air_acl_setPortEnable(0, port, en);

+        AIR_PRINT("Set Port:%u ACL function ", port);

+    }

+    else if(1 == argc)

+    {

+        /* acl get portEn <port(0..6)> */

+        port = _strtoul(argv[argi++], NULL, 0);

+        ret = air_acl_getPortEnable(0, port, &en);

+        AIR_PRINT("Get Port:%u ACL function ", port);

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return AIR_E_BAD_PARAMETER;

+    }

+

+    if(ret == AIR_E_OK)

+    {

+        AIR_PRINT(": %s\n", (TRUE == en)?"Enable":"Disable");

+    }

+    else

+    {

+        AIR_PRINT("Fail!\n");

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doAclDropEn(

+    UI32_T argc,

+    C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T argi=0;

+    UI32_T port = 0;

+    BOOL_T en;

+

+    if(2 == argc)

+    {

+        /* acl set dropEn <port(0..6)> <en(1:En,0:Dis)> */

+        port = _strtoul(argv[argi++], NULL, 0);

+        en = _strtoul(argv[argi++], NULL, 2);

+        ret = air_acl_setDropEnable(0, port, en);

+        AIR_PRINT("Set ACL Drop precedence ");

+    }

+    else if(1 == argc)

+    {

+        /* acl set dropEn <port(0..6)> */

+        port = _strtoul(argv[argi++], NULL, 0);

+        ret = air_acl_getDropEnable(0, port, &en);

+        AIR_PRINT("Get ACL Drop precedence ");

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return AIR_E_BAD_PARAMETER;

+    }

+

+    if(ret == AIR_E_OK)

+    {

+        AIR_PRINT("(Port %u):%s\n",

+                port,

+                (TRUE == en)?"Enable":"Disable");

+    }

+    else

+    {

+        AIR_PRINT("Fail!\n");

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doAclDropThrsh(

+    UI32_T argc,

+    C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T argi=0;

+    UI32_T port = 0;

+    AIR_ACL_DP_COLOR_T color;

+    UI8_T queue;

+    UI32_T high, low;

+    C8_T dp_color[AIR_ACL_DP_COLOR_LAST][7] =

+    {

+        "Green",

+        "Yellow",

+        "Red"

+    };

+

+    if(5 == argc)

+    {

+        /* acl set dropThrsh <port(0..6)> <color(0:green,1:yellow,2:red)> <queue(0..7)> <high(0..2047)> <low(0..2047) */

+        port = _strtoul(argv[argi++], NULL, 0);

+        color = _strtoul(argv[argi++], NULL, 0);

+        queue = _strtoul(argv[argi++], NULL, 0);

+        high = _strtoul(argv[argi++], NULL, 0);

+        low = _strtoul(argv[argi++], NULL, 0);

+        ret = air_acl_setDropThreshold(0, port, color, queue, high, low);

+        AIR_PRINT("Set ACL Drop precedence ");

+    }

+    else if(3 == argc)

+    {

+        /* acl get dropThrsh <port(0..6)> <color(0:green,1:yellow,2:red)> <queue(0..7)> */

+        port = _strtoul(argv[argi++], NULL, 0);

+        color = _strtoul(argv[argi++], NULL, 0);

+        queue = _strtoul(argv[argi++], NULL, 0);

+        ret = air_acl_getDropThreshold(0, port, color, queue, &high, &low);

+        AIR_PRINT("Get ACL Drop precedence ");

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return AIR_E_BAD_PARAMETER;

+    }

+

+    if(ret == AIR_E_OK)

+    {

+        AIR_PRINT("(Port %u, color:%s, queue:%u):\n",

+                port,

+                dp_color[color],

+                queue);

+        AIR_PRINT("\tHigh Threshold :%u\n", high);

+        AIR_PRINT("\tLow Threshold  :%u\n", low);

+    }

+    else

+    {

+        AIR_PRINT("Fail!\n");

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doAclDropPbb(

+    UI32_T argc,

+    C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T argi=0;

+    UI32_T port = 0;

+    AIR_ACL_DP_COLOR_T color;

+    UI8_T queue;

+    UI32_T pbb;

+    C8_T dp_color[AIR_ACL_DP_COLOR_LAST][7] =

+    {

+        "Green",

+        "Yellow",

+        "Red"

+    };

+

+    if(4 == argc)

+    {

+        /* acl set dropPbb <port(0..6)> <color(0:green,1:yellow,2:red)> <queue(0..7)> <probability(0..1023) */

+        port = _strtoul(argv[argi++], NULL, 0);

+        color = _strtoul(argv[argi++], NULL, 0);

+        queue = _strtoul(argv[argi++], NULL, 0);

+        pbb = _strtoul(argv[argi++], NULL, 0);

+        ret = air_acl_setDropProbability(0, port, color, queue, pbb);

+        AIR_PRINT("Set ACL Drop precedence ");

+    }

+    else if(3 == argc)

+    {

+        /* acl get dropPbb <port(0..6)> <color(0:green,1:yellow,2:red)> <queue(0..7)> */

+        port = _strtoul(argv[argi++], NULL, 0);

+        color = _strtoul(argv[argi++], NULL, 0);

+        queue = _strtoul(argv[argi++], NULL, 0);

+        ret = air_acl_getDropProbability(0, port, color, queue, &pbb);

+        AIR_PRINT("Get ACL Drop precedence ");

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return AIR_E_BAD_PARAMETER;

+    }

+

+    if(ret == AIR_E_OK)

+    {

+        AIR_PRINT("(Port %u, color:%s, queue %u):\n",

+                port,

+                dp_color[color],

+                queue);

+        AIR_PRINT("\tDrop probability:%u(unit=1/1023)\n", pbb);

+    }

+    else

+    {

+        AIR_PRINT("Fail!\n");

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doAclMeter(

+    UI32_T argc,

+    C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T argi = 0;

+    UI32_T meter_idx, state, rate;

+

+    if(3 == argc)

+    {

+        /* acl set meter <idx(0..31)> <en(1:En,0:Dis)> <rate(0..65535)>

+           Note: Limit rate = rate * 64Kbps */

+        meter_idx = _strtoul(argv[argi++], NULL, 0);

+        state = _strtoul(argv[argi++], NULL, 2);

+        rate = _strtoul(argv[argi++], NULL, 0);

+

+        ret = air_acl_setMeterTable(0, meter_idx, state, rate);

+        if(ret < AIR_E_LAST)

+            AIR_PRINT("Set ACL Meter(%u): %s\n", meter_idx, air_error_getString(ret));

+    }

+    else if(1 == argc)

+    {

+        /* acl get meter <idx(0..31)> */

+        meter_idx = _strtoul(argv[argi++], NULL, 0);

+        ret = air_acl_getMeterTable(0, meter_idx, &state, &rate);

+        if(ret < AIR_E_LAST)

+            AIR_PRINT("Get ACL Meter(%u): %s\n", meter_idx, air_error_getString(ret));

+    }

+    else

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return AIR_E_BAD_PARAMETER;

+    }

+

+    if(AIR_E_OK == ret)

+    {

+        AIR_PRINT("\t State: %s\n", (TRUE == state)?"Enable":"Disable");

+        if(TRUE == state)

+        {

+            AIR_PRINT("\t Rate : %u(unit:64Kbps)\n", rate);

+        }

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doAclDump(

+    UI32_T argc,

+    C8_T *argv[])

+{

+    AIR_ERROR_NO_T ret = AIR_E_OK;

+    UI32_T i, cnt = 0;

+    AIR_ACL_CTRL_T ctrl;

+

+    if(0 != argc)

+    {

+        AIR_PRINT("Unrecognized command.\n");

+        return AIR_E_BAD_PARAMETER;

+    }

+

+    for(i=0; i<ACL_MAX_RULE_NUM; i++)

+    {

+        memset(&ctrl, 0, sizeof(AIR_ACL_CTRL_T));

+        ret = air_acl_getRuleCtrl(0, i, &ctrl);

+        if(AIR_E_OK == ret)

+        {

+            if(TRUE == ctrl.rule_en)

+            {

+                cnt++;

+                AIR_PRINT("\t Entry-%d vaild\n", i);

+            }

+        }

+    }

+    if(0 == cnt)

+    {

+        AIR_PRINT("\t No entry vaild\n");

+    }

+

+    return ret;

+}

+

+static AIR_ERROR_NO_T

+doAclSet(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(aclSetCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doAclGet(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(aclGetCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doAclDel(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(aclDelCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doAclClear(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(aclClearCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+doAcl(

+        UI32_T argc,

+        C8_T *argv[])

+{

+    return subcmd(aclCmds, argc, argv);

+}

+

+static AIR_ERROR_NO_T

+subcmd(

+        const AIR_CMD_T tab[],

+        UI32_T argc,

+        C8_T *argv[])

+{

+    const AIR_CMD_T *cmdp;

+    I32_T found = 0;

+    I32_T i, len;

+

+    if (argc < 1)

+    {

+        goto print_out_cmds;

+    }

+

+    for (cmdp = tab; cmdp->name != NULL; cmdp++)

+    {

+        if (strlen(argv[0]) == strlen(cmdp->name))

+        {

+            if (strncmp(argv[0], cmdp->name, strlen(argv[0])) == 0)

+            {

+                found = 1;

+                break;

+            }

+        }

+    }

+

+    if(!found)

+    {

+        C8_T buf[66];

+

+print_out_cmds:

+        AIR_PRINT("valid subcommands:\n");

+        memset(buf, ' ', sizeof(buf));

+        buf[64] = '\n';

+        buf[65] = '\0';

+

+        for (i=0, cmdp = tab; cmdp->name != NULL; cmdp++)

+        {

+            len = strlen(cmdp->name);

+            strncpy(&buf[i*16], cmdp->name, (len > 16) ? 16 : len);

+            if(3 == i)

+            {

+                AIR_PRINT("%s\n", buf);

+                memset(buf, ' ', sizeof(buf));

+                buf[64] = '\n';

+                buf[65] = '\0';

+            }

+            i = (i + 1) % 4;

+        }

+

+        if (0 != i)

+            AIR_PRINT("%s\n", buf);

+

+        return AIR_E_BAD_PARAMETER;

+    }

+

+    if (CMD_NO_PARA == cmdp->argc_min)

+    {

+        if (argc != 1)

+        {

+            if (cmdp->argc_errmsg != NULL)

+            {

+                AIR_PRINT("Usage: %s\n", cmdp->argc_errmsg);

+            }

+

+            return AIR_E_BAD_PARAMETER;

+        }

+    }

+    else if (CMD_VARIABLE_PARA == cmdp->argc_min)

+    {

+        if (argc < 3)

+        {

+            if (cmdp->argc_errmsg != NULL)

+            {

+                AIR_PRINT("Usage: %s\n", cmdp->argc_errmsg);

+            }

+

+            return AIR_E_BAD_PARAMETER;

+        }

+    }

+    else

+    {

+        if ((argc <= cmdp->argc_min) || ((cmdp->argc_min != 0) && (argc != (cmdp->argc_min + 1))))

+        {

+            if (cmdp->argc_errmsg != NULL)

+            {

+                AIR_PRINT("Usage: %s\n", cmdp->argc_errmsg);

+            }

+

+            return AIR_E_BAD_PARAMETER;

+        }

+    }

+

+    if (cmdp->func)

+    {

+        argc--;

+        argv++;

+        return (*cmdp->func)(argc, argv);

+    }

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_parse_cmd

+ * PURPOSE:

+ *      This function is used process diagnostic cmd

+ * INPUT:

+ *      argc         -- parameter number

+ *      argv         -- parameter strings

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      NPS_E_OK     -- Successfully read the data.

+ *      NPS_E_OTHERS -- Failed to read the data.

+ * NOTES:

+ *

+ */

+AIR_ERROR_NO_T

+air_parse_cmd(

+        const UI32_T argc,

+        const C8_T **argv)

+{

+    return subcmd(Cmds, argc, (C8_T **)argv);

+}

+

diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_diag.c b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_diag.c
new file mode 100644
index 0000000..2f89ddf
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_diag.c
@@ -0,0 +1,410 @@
+/* FILE NAME: air_diag.c
+ * PURPOSE:
+ *      Define the diagnostic function in AIR SDK.
+ * NOTES:
+ *      None
+ */
+
+/* INCLUDE FILE DECLARATIONS
+*/
+#include "air.h"
+
+/* NAMING CONSTANT DECLARATIONS
+*/
+
+/* MACRO FUNCTION DECLARATIONS
+*/
+
+/* DATA TYPE DECLARATIONS
+*/
+
+/* GLOBAL VARIABLE DECLARATIONS
+*/
+
+/* LOCAL SUBPROGRAM DECLARATIONS
+*/
+
+/* STATIC VARIABLE DECLARATIONS
+*/
+
+/* LOCAL SUBPROGRAM BODIES
+*/
+
+/* EXPORTED SUBPROGRAM BODIES
+*/
+
+/* FUNCTION NAME: air_diag_setTxComplyMode
+ * PURPOSE:
+ *      Set Ethernet TX Compliance mode.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      mode            --  Testing mode of Ethernet TX Compliance
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ */
+AIR_ERROR_NO_T
+air_diag_setTxComplyMode(
+    const UI32_T unit,
+    const UI8_T port,
+    const AIR_DIAG_TXCOMPLY_MODE_T mode)
+{
+    UI32_T page = 0;
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((mode >= AIR_DIAG_TXCOMPLY_MODE_LAST), AIR_E_BAD_PARAMETER);
+
+    /* Backup page of CL22 */
+    aml_readPhyReg(unit, port, PHY_PAGE, &page);
+
+    switch(mode)
+    {
+        case AIR_DIAG_TXCOMPLY_MODE_10M_NLP:
+            /* PHY 00h = 0x0100 */
+            aml_writePhyReg(unit, port, PHY_PAGE, PHY_PAGE_0);
+            aml_writePhyReg(unit, port, PHY_MCR, MCR_MR_DUX);
+            /* PHY dev 1Eh reg 145h = 0x5010 */
+            u32dat = (FC_TDI_EN | FC_LITN_NO_COMP | FC_MDI_CO_MDI);
+            aml_writePhyRegCL45(unit, port, 0x1e, 0x0145, u32dat);
+            /* PHY dev 1Fh reg 17Bh = 0x1177 */
+            u32dat = (CR_RG_TX_CM_10M(1) | CR_RG_DELAY_TX_10M(1) \
+                    | CR_DA_TX_GAIN_10M_EEE(100) | CR_DA_TX_GAIN_10M(100));
+            aml_writePhyRegCL45(unit, port, 0x1f, 0x027b, u32dat);
+            break;
+        case AIR_DIAG_TXCOMPLY_MODE_10M_RANDOM:
+            /* PHY 00h = 0x0100 */
+            aml_writePhyReg(unit, port, PHY_PAGE, PHY_PAGE_0);
+            aml_writePhyReg(unit, port, PHY_MCR, MCR_MR_DUX);
+            /* PHY dev 1Eh reg 145h = 0x5010 */
+            u32dat = (FC_TDI_EN | FC_LITN_NO_COMP | FC_MDI_CO_MDI);
+            aml_writePhyRegCL45(unit, port, 0x1e, 0x0145, u32dat);
+            /* PHY dev 1Fh reg 27Bh = 0x1177 */
+            u32dat = (CR_RG_TX_CM_10M(1) | CR_RG_DELAY_TX_10M(1) \
+                    | CR_DA_TX_GAIN_10M_EEE(100) | CR_DA_TX_GAIN_10M(100));
+            aml_writePhyRegCL45(unit, port, 0x1f, 0x027b, u32dat);
+            /* PHY 11dh = 0xf842 */
+            aml_writePhyReg(unit, port, PHY_PAGE, PHY_PAGE_1);
+            u32dat = (EPG_EN | EPG_RUN | EPG_TX_DUR | EPG_PKT_LEN_10KB \
+                    | EPG_DES_ADDR(1) | EPG_PL_TYP_RANDOM);
+            aml_writePhyReg(unit, port, PHY_EPG, u32dat);
+            break;
+        case AIR_DIAG_TXCOMPLY_MODE_10M_SINE:
+            /* PHY 00h = 0x0100 */
+            aml_writePhyReg(unit, port, PHY_PAGE, PHY_PAGE_0);
+            aml_writePhyReg(unit, port, PHY_MCR, MCR_MR_DUX);
+            /* PHY dev 1Eh reg 145h = 0x5010 */
+            u32dat = (FC_TDI_EN | FC_LITN_NO_COMP | FC_MDI_CO_MDI);
+            aml_writePhyRegCL45(unit, port, 0x1e, 0x0145, u32dat);
+            /* PHY dev 1Fh reg 27Bh = 0x1177 */
+            u32dat = (CR_RG_TX_CM_10M(1) | CR_RG_DELAY_TX_10M(1) \
+                    | CR_DA_TX_GAIN_10M_EEE(100) | CR_DA_TX_GAIN_10M(100));
+            aml_writePhyRegCL45(unit, port, 0x1f, 0x027b, u32dat);
+            /* PHY dev 1Eh reg 1A3h = 0x0000 */
+            aml_writePhyRegCL45(unit, port, 0x1e, 0x01a3, 0x0000);
+            /* PHY dev 1Eh reg 1A4h = 0x0000 */
+            aml_writePhyRegCL45(unit, port, 0x1e, 0x01a4, 0x0000);
+            /* PHY 11dh = 0xf840 */
+            aml_writePhyReg(unit, port, PHY_PAGE, PHY_PAGE_1);
+            u32dat = (EPG_EN | EPG_RUN | EPG_TX_DUR \
+                    | EPG_PKT_LEN_10KB | EPG_DES_ADDR(1));
+            aml_writePhyReg(unit, port, PHY_EPG, u32dat);
+            break;
+        case AIR_DIAG_TXCOMPLY_MODE_100M_PAIR_A:
+            /* PHY 00h = 0x2100 */
+            aml_writePhyReg(unit, port, PHY_PAGE, PHY_PAGE_0);
+            u32dat = (MCR_MR_FC_SPD_INT_0 | MCR_MR_DUX);
+            aml_writePhyReg(unit, port, PHY_MCR, u32dat);
+            /* PHY dev 1Eh reg 145h = 0x5010 */
+            u32dat = (FC_TDI_EN | FC_LITN_NO_COMP | FC_MDI_CO_MDI);
+            aml_writePhyRegCL45(unit, port, 0x1e, 0x0145, u32dat);
+            break;
+        case AIR_DIAG_TXCOMPLY_MODE_100M_PAIR_B:
+            /* PHY 00h = 0x2100 */
+            aml_writePhyReg(unit, port, PHY_PAGE, PHY_PAGE_0);
+            u32dat = (MCR_MR_FC_SPD_INT_0 | MCR_MR_DUX);
+            aml_writePhyReg(unit, port, PHY_MCR, u32dat);
+            /* PHY dev 1Eh reg 145h = 0x5018 */
+            u32dat = (FC_TDI_EN | FC_LITN_NO_COMP | FC_MDI_CO_MDIX);
+            aml_writePhyRegCL45(unit, port, 0x1e, 0x0145, u32dat);
+            break;
+        case AIR_DIAG_TXCOMPLY_MODE_1000M_TM1:
+            /* PHY 09h = 0x2700 */
+            aml_writePhyReg(unit, port, PHY_PAGE, PHY_PAGE_0);
+            u32dat = (CR1G_TEST_TM1 | CR1G_PORT_TYPE \
+                    | CR1G_ADV_CAP1000_FDX | CR1G_ADV_CAP1000_HDX);
+            aml_writePhyReg(unit, port, PHY_CR1G, u32dat);
+            break;
+        case AIR_DIAG_TXCOMPLY_MODE_1000M_TM2:
+            aml_writePhyReg(unit, port, PHY_PAGE, PHY_PAGE_0);
+            /* PHY 09h = 0x4700 */
+            u32dat = (CR1G_TEST_TM2 | CR1G_PORT_TYPE \
+                    | CR1G_ADV_CAP1000_FDX | CR1G_ADV_CAP1000_HDX);
+            aml_writePhyReg(unit, port, PHY_CR1G, u32dat);
+            break;
+        case AIR_DIAG_TXCOMPLY_MODE_1000M_TM3:
+            aml_writePhyReg(unit, port, PHY_PAGE, PHY_PAGE_0);
+            /* PHY 09h = 0x6700 */
+            u32dat = (CR1G_TEST_TM3 | CR1G_PORT_TYPE \
+                    | CR1G_ADV_CAP1000_FDX | CR1G_ADV_CAP1000_HDX);
+            aml_writePhyReg(unit, port, PHY_CR1G, u32dat);
+            break;
+        case AIR_DIAG_TXCOMPLY_MODE_1000M_TM4:
+            aml_writePhyReg(unit, port, PHY_PAGE, PHY_PAGE_0);
+            /* PHY 09h = 0x8700 */
+            u32dat = (CR1G_TEST_TM4 | CR1G_PORT_TYPE \
+                    | CR1G_ADV_CAP1000_FDX | CR1G_ADV_CAP1000_HDX);
+            aml_writePhyReg(unit, port, PHY_CR1G, u32dat);
+            break;
+        default:
+            /* Unrecognized argument */
+            return AIR_E_BAD_PARAMETER;
+    }
+    /* Restore page of CL22 */
+    aml_writePhyReg(unit, port, PHY_PAGE, page);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_diag_getTxComplyMode
+ * PURPOSE:
+ *      Get Ethernet TX Compliance mode.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *
+ * OUTPUT:
+ *      ptr_mode        --  Testing mode of Ethernet TX Compliance
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_OTHERS
+ *
+ * NOTES:
+ */
+AIR_ERROR_NO_T
+air_diag_getTxComplyMode(
+    const UI32_T unit,
+    const UI8_T port,
+    AIR_DIAG_TXCOMPLY_MODE_T *ptr_mode)
+{
+    UI32_T page = 0;
+    UI32_T curReg[4] = {0};
+    UI32_T cmpReg[4] = {0};
+    BOOL_T hit = FALSE;
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_mode);
+
+    /* Backup page of CL22 */
+    aml_readPhyReg(unit, port, PHY_PAGE, &page);
+
+    /* Test for AIR_DIAG_TXCOMPLY_MODE_1000M_TM1 */
+    if( FALSE == hit )
+    {
+        aml_writePhyReg(unit, port, PHY_PAGE, PHY_PAGE_0);
+        aml_readPhyReg(unit, port, PHY_CR1G, &curReg[0]);
+        cmpReg[0] = (CR1G_TEST_TM1 | CR1G_PORT_TYPE | CR1G_ADV_CAP1000_FDX | CR1G_ADV_CAP1000_HDX);
+
+        if( cmpReg[0] == curReg[0] )
+        {
+            (*ptr_mode) = AIR_DIAG_TXCOMPLY_MODE_1000M_TM1;
+            hit = TRUE;
+        }
+    }
+
+    /* Test for AIR_DIAG_TXCOMPLY_MODE_1000M_TM2 */
+    if( FALSE == hit )
+    {
+        aml_writePhyReg(unit, port, PHY_PAGE, PHY_PAGE_0);
+        aml_readPhyReg(unit, port, PHY_CR1G, &curReg[0]);
+        cmpReg[0] = (CR1G_TEST_TM2 | CR1G_PORT_TYPE | CR1G_ADV_CAP1000_FDX | CR1G_ADV_CAP1000_HDX);
+
+        if( cmpReg[0] == curReg[0] )
+        {
+            (*ptr_mode) = AIR_DIAG_TXCOMPLY_MODE_1000M_TM2;
+            hit = TRUE;
+        }
+    }
+
+    /* Test for AIR_DIAG_TXCOMPLY_MODE_1000M_TM3 */
+    if( FALSE == hit )
+    {
+        aml_writePhyReg(unit, port, PHY_PAGE, PHY_PAGE_0);
+        aml_readPhyReg(unit, port, PHY_CR1G, &curReg[0]);
+        cmpReg[0] = (CR1G_TEST_TM3 | CR1G_PORT_TYPE | CR1G_ADV_CAP1000_FDX | CR1G_ADV_CAP1000_HDX);
+
+        if( cmpReg[0] == curReg[0] )
+        {
+            (*ptr_mode) = AIR_DIAG_TXCOMPLY_MODE_1000M_TM3;
+            hit = TRUE;
+        }
+    }
+
+    /* Test for AIR_DIAG_TXCOMPLY_MODE_1000M_TM4 */
+    if( FALSE == hit )
+    {
+        aml_writePhyReg(unit, port, PHY_PAGE, PHY_PAGE_0);
+        aml_readPhyReg(unit, port, PHY_CR1G, &curReg[0]);
+        cmpReg[0] = (CR1G_TEST_TM4 | CR1G_PORT_TYPE | CR1G_ADV_CAP1000_FDX | CR1G_ADV_CAP1000_HDX);
+
+        if( cmpReg[0] == curReg[0] )
+        {
+            (*ptr_mode) = AIR_DIAG_TXCOMPLY_MODE_1000M_TM4;
+            hit = TRUE;
+        }
+    }
+
+    /* Test for AIR_DIAG_TXCOMPLY_MODE_100M_PAIR_A */
+    if( FALSE == hit )
+    {
+        aml_writePhyReg(unit, port, PHY_PAGE, PHY_PAGE_0);
+        aml_readPhyReg(unit, port, PHY_MCR, &curReg[0]);
+        cmpReg[0] = (MCR_MR_FC_SPD_INT_0 | MCR_MR_DUX);
+
+        aml_readPhyRegCL45(unit, port, 0x1e, 0x0145, &curReg[1]);
+        cmpReg[1] = (FC_TDI_EN | FC_LITN_NO_COMP | FC_MDI_CO_MDI);
+
+        if( (cmpReg[0] == curReg[0]) && (cmpReg[1] == curReg[1]) )
+        {
+            (*ptr_mode) = AIR_DIAG_TXCOMPLY_MODE_100M_PAIR_A;
+            hit = TRUE;
+        }
+    }
+
+    /* Test for AIR_DIAG_TXCOMPLY_MODE_100M_PAIR_B */
+    if( FALSE == hit )
+    {
+        aml_writePhyReg(unit, port, PHY_PAGE, PHY_PAGE_0);
+        aml_readPhyReg(unit, port, PHY_MCR, &curReg[0]);
+        cmpReg[0] = (MCR_MR_FC_SPD_INT_0 | MCR_MR_DUX);
+
+        aml_readPhyRegCL45(unit, port, 0x1e, 0x0145, &curReg[1]);
+        cmpReg[1] = (FC_TDI_EN | FC_LITN_NO_COMP | FC_MDI_CO_MDIX);
+
+        if( (cmpReg[0] == curReg[0]) && (cmpReg[1] == curReg[1]) )
+        {
+            (*ptr_mode) = AIR_DIAG_TXCOMPLY_MODE_100M_PAIR_B;
+            hit = TRUE;
+        }
+    }
+
+    /* Test for AIR_DIAG_TXCOMPLY_MODE_10M_SINE */
+    if( FALSE == hit )
+    {
+        aml_writePhyReg(unit, port, PHY_PAGE, PHY_PAGE_0);
+        aml_readPhyReg(unit, port, PHY_MCR, &curReg[0]);
+        cmpReg[0] = MCR_MR_DUX;
+
+        aml_readPhyRegCL45(unit, port, 0x1e, 0x0145, &curReg[1]);
+        cmpReg[1] = (FC_TDI_EN | FC_LITN_NO_COMP | FC_MDI_CO_MDI);
+
+        aml_readPhyRegCL45(unit, port, 0x1f, 0x027b, &curReg[2]);
+        cmpReg[2] = (CR_RG_TX_CM_10M(1) \
+                | CR_RG_DELAY_TX_10M(1) \
+                | CR_DA_TX_GAIN_10M_EEE(100) \
+                | CR_DA_TX_GAIN_10M(100));
+
+        aml_writePhyReg(unit, port, PHY_PAGE, PHY_PAGE_1);
+        aml_readPhyReg(unit, port, PHY_EPG, &curReg[3]);
+        cmpReg[3] = (EPG_EN \
+                | EPG_RUN \
+                | EPG_TX_DUR \
+                | EPG_PKT_LEN_10KB \
+                | EPG_DES_ADDR(1));
+
+        if( (cmpReg[0] == curReg[0])    \
+            && (cmpReg[1] == curReg[1]) \
+            && (cmpReg[2] == curReg[2]) \
+            && (cmpReg[3] == curReg[3]) )
+        {
+            (*ptr_mode) = AIR_DIAG_TXCOMPLY_MODE_10M_SINE;
+            hit = TRUE;
+        }
+    }
+
+    /* Test for AIR_DIAG_TXCOMPLY_MODE_10M_RANDOM */
+    if( FALSE == hit )
+    {
+        aml_writePhyReg(unit, port, PHY_PAGE, PHY_PAGE_0);
+        aml_readPhyReg(unit, port, PHY_MCR, &curReg[0]);
+        cmpReg[0] = MCR_MR_DUX;
+
+        aml_readPhyRegCL45(unit, port, 0x1e, 0x0145, &curReg[1]);
+        cmpReg[1] = (FC_TDI_EN | FC_LITN_NO_COMP | FC_MDI_CO_MDI);
+
+        aml_readPhyRegCL45(unit, port, 0x1f, 0x027b, &curReg[2]);
+        cmpReg[2] = (CR_RG_TX_CM_10M(1) \
+                | CR_RG_DELAY_TX_10M(1) \
+                | CR_DA_TX_GAIN_10M_EEE(100) \
+                | CR_DA_TX_GAIN_10M(100));
+
+        aml_writePhyReg(unit, port, PHY_PAGE, PHY_PAGE_1);
+        aml_readPhyReg(unit, port, PHY_EPG, &curReg[3]);
+        cmpReg[3] = (EPG_EN \
+                | EPG_RUN \
+                | EPG_TX_DUR \
+                | EPG_PKT_LEN_10KB \
+                | EPG_DES_ADDR(1) \
+                | EPG_PL_TYP_RANDOM);
+
+        if( (cmpReg[0] == curReg[0])    \
+            && (cmpReg[1] == curReg[1]) \
+            && (cmpReg[2] == curReg[2]) \
+            && (cmpReg[3] == curReg[3]) )
+        {
+            (*ptr_mode) = AIR_DIAG_TXCOMPLY_MODE_10M_RANDOM;
+            hit = TRUE;
+        }
+    }
+
+    /* Test for AIR_DIAG_TXCOMPLY_MODE_10M_NLP */
+    if( FALSE == hit )
+    {
+        aml_writePhyReg(unit, port, PHY_PAGE, PHY_PAGE_0);
+        aml_readPhyReg(unit, port, PHY_MCR, &curReg[0]);
+        cmpReg[0] = MCR_MR_DUX;
+
+        aml_readPhyRegCL45(unit, port, 0x1e, 0x0145, &curReg[1]);
+        cmpReg[1] = (FC_TDI_EN | FC_LITN_NO_COMP | FC_MDI_CO_MDI);
+
+        aml_readPhyRegCL45(unit, port, 0x1f, 0x027b, &curReg[2]);
+        cmpReg[2] = (CR_RG_TX_CM_10M(1) \
+                | CR_RG_DELAY_TX_10M(1) \
+                | CR_DA_TX_GAIN_10M_EEE(100) \
+                | CR_DA_TX_GAIN_10M(100));
+
+        if( (cmpReg[0] == curReg[0])    \
+            && (cmpReg[1] == curReg[1]) \
+            && (cmpReg[2] == curReg[2]) )
+        {
+            (*ptr_mode) = AIR_DIAG_TXCOMPLY_MODE_10M_NLP;
+            hit = TRUE;
+        }
+    }
+
+    /* Restore page of CL22 */
+    aml_writePhyReg(unit, port, PHY_PAGE, page);
+
+    if( TRUE == hit)
+    {
+        return AIR_E_OK;
+    }
+    else
+    {
+        return AIR_E_OTHERS;
+    }
+}
+
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_error.c b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_error.c
new file mode 100644
index 0000000..3323e54
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_error.c
@@ -0,0 +1,73 @@
+/* FILE NAME:   air_error.c

+ * PURPOSE:

+ *      Define the software modules in AIR SDK.

+ * NOTES:

+ */

+

+/* INCLUDE FILE DECLARATIONS

+ */

+#include "air.h"

+

+/* NAMING CONSTANT DECLARATIONS

+ */

+

+/* MACRO FUNCTION DECLARATIONS

+ */

+

+/* DATA TYPE DECLARATIONS

+ */

+

+/* GLOBAL VARIABLE DECLARATIONS

+ */

+

+/* LOCAL SUBPROGRAM DECLARATIONS

+ */

+

+/* STATIC VARIABLE DECLARATIONS

+ */

+static C8_T *_air_error_cause[AIR_E_LAST] =

+{

+    "OK",

+    "NOT_OK",

+    "BAD_PARAMETER",

+    "TABLE_FULL",

+    "ENTRY_NOT_FOUND",

+    "ENTRY_EXISTS",

+    "NOT_SUPPORT",

+    "TIMEOUT",

+};

+

+/* EXPORTED SUBPROGRAM BODIES

+ */

+

+/* LOCAL SUBPROGRAM BODIES

+ */

+/* FUNCTION NAME:   air_error_getString

+ * PURPOSE:

+ *      To obtain the error string of the specified error code

+ *

+ * INPUT:

+ *      The specified error code

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      Pointer to the target error string

+ *

+ * NOTES:

+ *

+ *

+ */

+C8_T *

+air_error_getString(

+const AIR_ERROR_NO_T cause )

+{

+    if(cause < AIR_E_LAST)

+    {

+        return _air_error_cause[cause];

+    }

+    else

+    {

+        return "";

+    }

+}

+

diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_init.c b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_init.c
new file mode 100644
index 0000000..8a4f96f
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_init.c
@@ -0,0 +1,147 @@
+/* FILE NAME:   air_init.c

+ * PURPOSE:

+ *      Define the initialization function in AIR SDK.

+ *

+ * NOTES:

+ *      None

+ */

+

+/* INCLUDE FILE DECLARATIONS

+ */

+#include "air.h"

+

+/* NAMING CONSTANT DECLARATIONS

+ */

+

+/* MACRO FUNCTION DECLARATIONS

+ */

+

+/* DATA TYPE DECLARATIONS

+ */

+

+/* GLOBAL VARIABLE DECLARATIONS

+ */

+AIR_PRINTF _ext_printf;

+AIR_UDELAY _ext_udelay;

+AIR_MALLOC _ext_malloc;

+AIR_FREE   _ext_free;

+

+/* LOCAL SUBPROGRAM DECLARATIONS

+ */

+

+/* STATIC VARIABLE DECLARATIONS

+ */

+

+/* EXPORTED SUBPROGRAM BODIES

+ */

+

+/* LOCAL SUBPROGRAM BODIES

+ */

+

+/* FUNCTION NAME:   air_init

+ * PURPOSE:

+ *      This API is used to initialize the SDK.

+ *

+ * INPUT:

+ *      unit            --  The device unit

+ *      ptr_init_param  --  The sdk callback functions.

+ *

+ * OUTPUT:

+ *      None

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_OTHERS

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_init(

+    const UI32_T unit,

+    AIR_INIT_PARAM_T *ptr_init_param)

+{

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+    UI32_T u32dat = 0;

+    UI8_T port = 0;

+    AIR_LED_ON_EVT_T on_evt;

+    AIR_LED_BLK_EVT_T blk_evt;

+

+    /* check point */

+    AIR_CHECK_PTR(ptr_init_param);

+

+    _ext_dev_access.read_callback = ptr_init_param->dev_access.read_callback;

+    _ext_dev_access.write_callback = ptr_init_param->dev_access.write_callback;

+    _ext_dev_access.phy_read_callback = ptr_init_param->dev_access.phy_read_callback;

+    _ext_dev_access.phy_write_callback = ptr_init_param->dev_access.phy_write_callback;

+    _ext_dev_access.phy_cl45_read_callback = ptr_init_param->dev_access.phy_cl45_read_callback;

+    _ext_dev_access.phy_cl45_write_callback = ptr_init_param->dev_access.phy_cl45_write_callback;

+    _ext_printf = ptr_init_param->printf;

+    _ext_udelay = ptr_init_param->udelay;

+    _ext_malloc = ptr_init_param->malloc;

+    _ext_free   = ptr_init_param->free;

+    

+    return rc;

+}

+

+/* FUNCTION NAME:   air_hw_reset

+ * PURPOSE:

+ *      This API is used to reset hardware.

+ *

+ * INPUT:

+ *      unit            --  The device unit

+ *

+ * OUTPUT:

+ *      None

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_OTHERS

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_hw_reset(

+    const UI32_T unit)

+{

+    AIR_PRINT(">>>>> enct_hw_reset\n");

+    /* Set an8855 reset pin to 0 */

+

+    /* Delay 100ms */

+

+    /* Set an8855 reset pin to 1 */

+

+    /* Delay 600ms */

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_set_gpio_pin_mux

+ * PURPOSE:

+ *      This API is used to set gpio pin mux.

+ *

+ * INPUT:

+ *      unit            --  The device unit

+ *

+ * OUTPUT:

+ *      None

+ *

+ * RETURN:

+ *      AIR_E_OK

+ *      AIR_E_OTHERS

+ *

+ * NOTES:

+ *      None

+ */

+AIR_ERROR_NO_T

+air_set_gpio_pin_mux(

+    const UI32_T unit)

+{

+    AIR_PRINT(">>>>> enct_set_gpio_pin_mux\n");

+    /* Set GPIO_MODE0 */

+    /* Implementation for SLT HW */

+    aml_writeReg(unit, GPIO_MODE0, 0x11111111);

+

+    return AIR_E_OK;

+}

diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_l2.c b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_l2.c
new file mode 100644
index 0000000..f8da749
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_l2.c
@@ -0,0 +1,1368 @@
+/* FILE NAME: air_l2.c
+ * PURPOSE:
+ *      Define the layer 2 function in AIR SDK.
+ *
+ * NOTES:
+ *      None
+ */
+
+/* INCLUDE FILE DECLARATIONS
+ */
+#include "air.h"
+
+/* NAMING CONSTANT DECLARATIONS
+ */
+#define AIR_L2_DELAY_US             (1000)
+#define AIR_L2_WDOG_KICK_NUM        (1000)
+#define AIR_L2_FORWARD_VALUE        (0xFFFFFFFF)
+#define AIR_L2_AGING_MS_CONSTANT    (1024)
+#define AIR_L2_AGING_1000MS         (1000)
+
+typedef enum
+{
+    AIR_L2_EXEC_FWD_CTRL_DEFAULT =      0x0,
+    AIR_L2_EXEC_FWD_CTRL_CPU_EXCLUDE =  0x4,
+    AIR_L2_EXEC_FWD_CTRL_CPU_INCLUDE =  0x5,
+    AIR_L2_EXEC_FWD_CTRL_CPU_ONLY =     0x6,
+    AIR_L2_EXEC_FWD_CTRL_DROP =         0x7,
+    AIR_L2_EXEC_FWD_CTRL_LAST
+}AIR_L2_EXEC_FWD_CTRL_T;
+
+typedef enum
+{
+    AIR_L2_MAC_MAT_MAC,
+    AIR_L2_MAC_MAT_DYNAMIC_MAC,
+    AIR_L2_MAC_MAT_STATIC_MAC,
+    AIR_L2_MAC_MAT_MAC_BY_VID,
+    AIR_L2_MAC_MAT_MAC_BY_FID,
+    AIR_L2_MAC_MAT_MAC_BY_PORT,
+    AIR_L2_MAC_MAT_MAC_BY_LAST
+}AIR_L2_MAC_MAT_T;
+
+/* L2 MAC table multi-searching */
+typedef enum
+{
+    AIR_L2_MAC_MS_START,   /* Start search */
+    AIR_L2_MAC_MS_NEXT,    /* Next search */
+    AIR_L2_MAC_MS_LAST
+}AIR_L2_MAC_MS_T;
+
+typedef enum
+{
+    AIR_L2_MAC_TB_TY_MAC,
+    AIR_L2_MAC_TB_TY_DIP,
+    AIR_L2_MAC_TB_TY_DIP_SIP,
+    AIR_L2_MAC_TB_TY_LAST
+}AIR_L2_MAC_TB_TY_T;
+
+/*
+typedef enum
+{
+    AIR_MAC_MAT_MAC,
+    AIR_MAC_MAT_DYNAMIC_MAC,
+    AIR_MAC_MAT_STATIC_MAC,
+    AIR_MAC_MAT_MAC_BY_VID,
+    AIR_MAC_MAT_MAC_BY_FID,
+    AIR_MAC_MAT_MAC_BY_PORT,
+    AIR_MAC_MAT_MAC_BY_LAST
+}AIR_MAC_MAT_T;
+*/
+
+/* MACRO FUNCTION DECLARATIONS
+ */
+#define AIR_L2_AGING_TIME(__cnt__, __unit__)   \
+        (((__cnt__) + 1) * ((__unit__) + 1) * AIR_L2_AGING_MS_CONSTANT / AIR_L2_AGING_1000MS)
+
+/* DATA TYPE DECLARATIONS
+ */
+
+/* GLOBAL VARIABLE DECLARATIONS
+ */
+static BOOL_T _search_end = FALSE;
+
+/* LOCAL SUBPROGRAM DECLARATIONS
+ */
+static BOOL_T
+_cmpMac(
+    const UI8_T mac1[6],
+    const UI8_T mac2[6]);
+
+static AIR_ERROR_NO_T
+_searchMacEntry(
+    const UI32_T unit,
+    const AIR_L2_MAC_MS_T ms,
+    const AIR_L2_MAC_MAT_T multi_target,
+    UI32_T *ptr_addr,
+    UI32_T *ptr_bank);
+
+static AIR_ERROR_NO_T
+_checkL2Busy(
+    const UI32_T unit);
+
+static void
+_fill_MAC_ATA(
+    const UI32_T unit,
+    const AIR_MAC_ENTRY_T *ptr_mac_entry);
+
+static void
+_fill_MAC_ATWD(
+    const UI32_T            unit,
+    const AIR_MAC_ENTRY_T   *ptr_mac_entry,
+    const BOOL_T            valid);
+
+static UI32_T
+_checkL2EntryHit(
+    const UI32_T unit);
+
+static void
+_fill_MAC_ATRDS(
+    const UI32_T unit,
+    UI8_T bank);
+
+static AIR_ERROR_NO_T
+_read_MAC_ATRD(
+    const UI32_T unit,
+    AIR_MAC_ENTRY_T *ptr_mac_entry);
+
+/* FUNCTION NAME: _cmpMac
+ * PURPOSE:
+ *      Compare MAC address to check whether those MAC is same.
+ *
+ * INPUT:
+ *      mac1            --  1st MAC address
+ *      mac2            --  2nd MAC address
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      TRUE
+ *      FALSE
+ *
+ * NOTES:
+ *      None
+ */
+static BOOL_T
+_cmpMac(
+    const UI8_T mac1[6],
+    const UI8_T mac2[6])
+{
+    UI32_T i;
+    for(i=0; i<6; i++)
+    {
+        if(mac1[i] != mac2[i])
+        {
+            return FALSE;
+        }
+    }
+    return TRUE;
+}
+/* FUNCTION NAME: _searchMacEntry
+ * PURPOSE:
+ *      Search MAC Address table.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      ms              --  _HAL_SCO_L2_MAC_MS_START:           Start search command
+ *                          _HAL_SCO_L2_MAC_MS_NEXT:            Next search command
+ *      multi_target    --  _HAL_SCO_L2_MAC_MAT_MAC:            MAC address entries
+ *                          _HAL_SCO_L2_MAC_MAT_DYNAMIC_MAC:    Dynamic MAC address entries
+ *                          _HAL_SCO_L2_MAC_MAT_STATIC_MAC:     Static MAC address entries
+ *                          _HAL_SCO_L2_MAC_MAT_MAC_BY_VID:     MAC address entries with specific CVID
+ *                          _HAL_SCO_L2_MAC_MAT_MAC_BY_FID:     MAC address entries with specific FID
+ *                          _HAL_SCO_L2_MAC_MAT_MAC_BY_PORT:    MAC address entries with specific port
+ * OUTPUT:
+ *      ptr_addr        --  MAC Table Access Index
+ *      ptr_bank        --  Searching result in which bank
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+static AIR_ERROR_NO_T
+_searchMacEntry(
+    const UI32_T unit,
+    const AIR_L2_MAC_MS_T ms,
+    const AIR_L2_MAC_MAT_T multi_target,
+    UI32_T *ptr_addr,
+    UI32_T *ptr_bank)
+{
+    UI32_T u32dat = 0;
+
+    u32dat = (ATC_SAT_MAC | ATC_START_BUSY);
+    if (AIR_L2_MAC_MS_START == ms)
+    {
+        /* Start search 1st valid entry */
+        u32dat |= ATC_CMD_SEARCH;
+    }
+    else if (AIR_L2_MAC_MS_NEXT == ms)
+    {
+        /* Search next valid entry */
+        u32dat |= ATC_CMD_SEARCH_NEXT;
+    }
+    else
+    {
+        /* Unknown commnad */
+        return AIR_E_BAD_PARAMETER;
+    }
+
+    switch(multi_target)
+    {
+        case AIR_L2_MAC_MAT_MAC:
+            u32dat |= ATC_MAT_MAC;
+            break;
+        case AIR_L2_MAC_MAT_DYNAMIC_MAC:
+            u32dat |= ATC_MAT_DYNAMIC_MAC;
+            break;
+        case AIR_L2_MAC_MAT_STATIC_MAC:
+            u32dat |= ATC_MAT_STATIC_MAC;
+            break;
+        case AIR_L2_MAC_MAT_MAC_BY_VID:
+            u32dat |= ATC_MAT_MAC_BY_VID;
+            break;
+        case AIR_L2_MAC_MAT_MAC_BY_FID:
+            u32dat |= ATC_MAT_MAC_BY_FID;
+            break;
+        case AIR_L2_MAC_MAT_MAC_BY_PORT:
+            u32dat |= ATC_MAT_MAC_BY_PORT;
+            break;
+        default:
+            /* Unknown searching mode */
+            return AIR_E_BAD_PARAMETER;
+    }
+    aml_writeReg(unit, ATC, u32dat);
+    if (AIR_E_TIMEOUT == _checkL2Busy(unit))
+    {
+        return AIR_E_TIMEOUT;
+    }
+
+    aml_readReg(unit, ATC, &u32dat);
+    /* Get address */
+    (*ptr_addr) = BITS_OFF_R(u32dat, ATC_ADDR_OFFSET, ATC_ADDR_LENGTH);
+    /* Get banks */
+    (*ptr_bank) = BITS_OFF_R(u32dat, ATC_ENTRY_HIT_OFFSET, ATC_ENTRY_HIT_LENGTH);
+    if ((AIR_L2_MAX_SIZE - 1) == (*ptr_addr))
+    {
+        _search_end = TRUE;
+    }
+    else
+    {
+        _search_end = FALSE;
+    }
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: _checkL2Busy
+ * PURPOSE:
+ *      Check BUSY bit of ATC
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+static AIR_ERROR_NO_T
+_checkL2Busy(
+    const UI32_T unit)
+{
+    UI32_T i = 0;
+    UI32_T reg_atc = 0;
+
+    /* Check BUSY bit is 0 */
+    for(i = 0; i < AIR_L2_MAX_BUSY_TIME; i++)
+    {
+        aml_readReg(unit, ATC, &reg_atc);
+        if(!BITS_OFF_R(reg_atc, ATC_BUSY_OFFSET, ATC_BUSY_LENGTH))
+        {
+            break;
+        }
+        AIR_UDELAY(AIR_L2_DELAY_US);
+    }
+    if(i >= AIR_L2_MAX_BUSY_TIME)
+    {
+        return AIR_E_TIMEOUT;
+    }
+    return AIR_E_OK;
+}
+/***************************************************************/
+/* FUNCTION NAME: _fill_MAC_ATA
+ * PURPOSE:
+ *      Fill register ATA for MAC Address table.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      ptr_mac_entry   --  Structure of MAC Address table
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      None
+ *
+ * NOTES:
+ *      None
+ */
+static void
+_fill_MAC_ATA(
+    const UI32_T unit,
+    const AIR_MAC_ENTRY_T *ptr_mac_entry)
+{
+    UI32_T u32dat = 0;
+    UI32_T i = 0;
+
+    /* Fill ATA1 */
+    for (i = 0; i < 4; i++)
+    {
+        u32dat |= ((UI32_T)(ptr_mac_entry->mac[i] & BITS(0,7))) << ( (3-i) * 8);
+    }
+    aml_writeReg(unit, ATA1, u32dat);
+    AIR_UDELAY(AIR_L2_DELAY_US);
+
+    /* Fill ATA2 */
+    u32dat=0;
+    for (i = 4; i < 6; i++)
+    {
+        u32dat |= ((UI32_T)(ptr_mac_entry->mac[i] & BITS(0,7))) << ( (7-i) * 8);
+    }
+    if (!(ptr_mac_entry->flags & AIR_L2_MAC_ENTRY_FLAGS_STATIC))
+    {
+        /* type is dynamic */
+        u32dat |= BITS_OFF_L(1UL, ATA2_MAC_LIFETIME_OFFSET, ATA2_MAC_LIFETIME_LENGTH);
+        /* set aging counter as system aging conuter */
+        u32dat |= BITS_OFF_L(ptr_mac_entry->timer, ATA2_MAC_AGETIME_OFFSET, ATA2_MAC_AGETIME_LENGTH);
+    }
+    if (ptr_mac_entry->flags & AIR_L2_MAC_ENTRY_FLAGS_UNAUTH)
+    {
+        u32dat |= BITS_OFF_L(1UL, ATA2_MAC_UNAUTH_OFFSET, ATA2_MAC_UNAUTH_LENGTH);
+    }
+
+    aml_writeReg(unit, ATA2, u32dat);
+    AIR_UDELAY(AIR_L2_DELAY_US);
+}
+
+/* FUNCTION NAME: _fill_MAC_ATWD
+ * PURPOSE:
+ *      Fill register ATWD for MAC Address table.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      ptr_mac_entry   --  Structure of MAC Address table
+ *      valid           --  TRUE
+ *                          FALSE
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      None
+ *
+ * NOTES:
+ *      None
+ */
+static void
+_fill_MAC_ATWD(
+    const UI32_T            unit,
+    const AIR_MAC_ENTRY_T   *ptr_mac_entry,
+    const BOOL_T            valid)
+{
+    UI32_T u32dat = 0;
+    UI32_T fwd_val = 0;
+
+    u32dat = 0;
+    /* Fill ATWD */
+    /* set valid bit */
+    if (TRUE == valid)
+    {
+        u32dat |= BITS_OFF_L(1UL, ATWD_MAC_LIVE_OFFSET, ATWD_MAC_LIVE_LENGTH);
+    }
+
+    /* set IVL */
+    if (ptr_mac_entry->flags & AIR_L2_MAC_ENTRY_FLAGS_IVL)
+    {
+        u32dat |= BITS_OFF_L(1UL, ATWD_MAC_IVL_OFFSET, ATWD_MAC_IVL_LENGTH);
+    }
+    /* set VID */
+    u32dat |= BITS_OFF_L(ptr_mac_entry->cvid, ATWD_MAC_VID_OFFSET, ATWD_MAC_VID_LENGTH);
+    /* set FID */
+    u32dat |= BITS_OFF_L(ptr_mac_entry->fid, ATWD_MAC_FID_OFFSET, ATWD_MAC_FID_LENGTH);
+
+    /* Set forwarding control */
+    switch (ptr_mac_entry->sa_fwd)
+    {
+        case AIR_L2_FWD_CTRL_DEFAULT:
+            fwd_val = AIR_L2_EXEC_FWD_CTRL_DEFAULT;
+            break;
+        case AIR_L2_FWD_CTRL_CPU_INCLUDE:
+            fwd_val = AIR_L2_EXEC_FWD_CTRL_CPU_INCLUDE;
+            break;
+        case AIR_L2_FWD_CTRL_CPU_EXCLUDE:
+            fwd_val = AIR_L2_EXEC_FWD_CTRL_CPU_EXCLUDE;
+            break;
+        case AIR_L2_FWD_CTRL_CPU_ONLY:
+            fwd_val = AIR_L2_EXEC_FWD_CTRL_CPU_ONLY;
+            break;
+        case AIR_L2_FWD_CTRL_DROP:
+            fwd_val = AIR_L2_EXEC_FWD_CTRL_DROP;
+            break;
+        default:
+            break;
+    }
+    u32dat |= BITS_OFF_L(fwd_val, ATWD_MAC_FWD_OFFSET, ATWD_MAC_FWD_LENGTH);
+    aml_writeReg(unit, ATWD, u32dat);
+    AIR_UDELAY(AIR_L2_DELAY_US);
+
+    /* Fill ATWD2 */
+    u32dat = BITS_OFF_L(ptr_mac_entry->port_bitmap[0], ATWD2_MAC_PORT_OFFSET, ATWD2_MAC_PORT_LENGTH);
+    aml_writeReg(unit, ATWD2, u32dat);
+    AIR_UDELAY(AIR_L2_DELAY_US);
+}
+
+/* FUNCTION NAME: _checkL2EntryHit
+ * PURPOSE:
+ *      Check entry hit of ATC
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      The entry hit bitmap
+ *
+ * NOTES:
+ *      None
+ */
+static UI32_T
+_checkL2EntryHit(
+    const UI32_T unit)
+{
+    UI32_T reg_atc = 0;
+    aml_readReg(unit, ATC, &reg_atc);
+    return BITS_OFF_R(reg_atc, ATC_ENTRY_HIT_OFFSET, ATC_ENTRY_HIT_LENGTH);
+}
+
+/* FUNCTION NAME: _fill_MAC_ATRDS
+ * PURPOSE:
+ *      Fill register ATRDS for select bank after ATC search L2 table.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      bank            --  Selected index of bank
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      None
+ *
+ * NOTES:
+ *      None
+ */
+static void
+_fill_MAC_ATRDS(
+    const UI32_T unit,
+    UI8_T bank)
+{
+    UI32_T u32dat = 0;
+
+    /* Fill ATRDS */
+    u32dat = BITS_OFF_L(bank, ATRD0_MAC_SEL_OFFSET, ATRD0_MAC_SEL_LENGTH);
+    aml_writeReg(unit, ATRDS, u32dat);
+    AIR_UDELAY(AIR_L2_DELAY_US);
+}
+
+/* FUNCTION NAME: _read_MAC_ATRD
+ * PURPOSE:
+ *      Read register ATRD for MAC Address table.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      ptr_mac_entry   --  Structure of MAC Address table
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_ENTRY_NOT_FOUND
+ *
+ * NOTES:
+ *      None
+ */
+static AIR_ERROR_NO_T
+_read_MAC_ATRD(
+    const UI32_T unit,
+    AIR_MAC_ENTRY_T *ptr_mac_entry)
+{
+    UI32_T u32dat = 0;
+    UI32_T i = 0;
+    BOOL_T live = FALSE;
+    UI32_T type = 0;
+    UI32_T age_unit = 0;
+    UI32_T age_cnt = 0;
+    UI32_T sa_fwd = 0;
+
+    /* Read ATRD0 */
+    aml_readReg(unit, ATRD0, &u32dat);
+    live = BITS_OFF_R(u32dat, ATRD0_MAC_LIVE_OFFSET, ATRD0_MAC_LIVE_LENGTH);
+    type = BITS_OFF_R(u32dat, ATRD0_MAC_TYPE_OFFSET, ATRD0_MAC_TYPE_LENGTH);
+    if (FALSE == live)
+    {
+        return AIR_E_ENTRY_NOT_FOUND;
+    }
+    if (AIR_L2_MAC_TB_TY_MAC != type)
+    {
+        return AIR_E_ENTRY_NOT_FOUND;
+    }
+    /* Clear table */
+    memset(ptr_mac_entry, 0, sizeof(AIR_MAC_ENTRY_T));
+
+    ptr_mac_entry->cvid = (UI16_T)BITS_OFF_R(u32dat, ATRD0_MAC_VID_OFFSET, ATRD0_MAC_VID_LENGTH);
+    ptr_mac_entry->fid = (UI16_T)BITS_OFF_R(u32dat, ATRD0_MAC_FID_OFFSET, ATRD0_MAC_FID_LENGTH);
+    if (!!BITS_OFF_R(u32dat, ATRD0_MAC_LIFETIME_OFFSET, ATRD0_MAC_LIFETIME_LENGTH))
+    {
+        ptr_mac_entry->flags |= AIR_L2_MAC_ENTRY_FLAGS_STATIC;
+    }
+    if (!!BITS_OFF_R(u32dat, ATRD0_MAC_IVL_OFFSET, ATRD0_MAC_IVL_LENGTH))
+    {
+        ptr_mac_entry->flags |= AIR_L2_MAC_ENTRY_FLAGS_IVL;
+    }
+    if (!!BITS_OFF_R(u32dat, ATRD1_MAC_UNAUTH_OFFSET, ATRD1_MAC_UNAUTH_LENGTH))
+    {
+        ptr_mac_entry->flags |= AIR_L2_MAC_ENTRY_FLAGS_UNAUTH;
+    }
+
+    /* Get the L2 MAC aging unit */
+    aml_readReg(unit, AAC, &u32dat);
+    age_unit = BITS_OFF_R(u32dat, AAC_AGE_UNIT_OFFSET, AAC_AGE_UNIT_LENGTH);
+
+    /* Read ATRD1 */
+    aml_readReg(unit, ATRD1, &u32dat);
+    for (i = 4; i < 6; i++)
+    {
+        ptr_mac_entry->mac[i] = BITS_OFF_R(u32dat, (7 - i)*8, 8);
+    }
+    /* Aging time */
+    age_cnt = BITS_OFF_R(u32dat, ATRD1_MAC_AGETIME_OFFSET, ATRD1_MAC_AGETIME_LENGTH);
+    ptr_mac_entry->timer = AIR_L2_AGING_TIME(age_cnt, age_unit);
+    /* SA forwarding */
+    sa_fwd = BITS_OFF_R(u32dat, ATRD1_MAC_FWD_OFFSET, ATRD1_MAC_FWD_LENGTH);
+    switch (sa_fwd)
+    {
+        case AIR_L2_EXEC_FWD_CTRL_DEFAULT:
+            ptr_mac_entry->sa_fwd = AIR_L2_FWD_CTRL_DEFAULT;
+            break;
+        case AIR_L2_EXEC_FWD_CTRL_CPU_INCLUDE:
+            ptr_mac_entry->sa_fwd = AIR_L2_FWD_CTRL_CPU_INCLUDE;
+            break;
+        case AIR_L2_EXEC_FWD_CTRL_CPU_EXCLUDE:
+            ptr_mac_entry->sa_fwd = AIR_L2_FWD_CTRL_CPU_EXCLUDE;
+            break;
+        case AIR_L2_EXEC_FWD_CTRL_CPU_ONLY:
+            ptr_mac_entry->sa_fwd = AIR_L2_FWD_CTRL_CPU_ONLY;
+            break;
+        case AIR_L2_EXEC_FWD_CTRL_DROP:
+            ptr_mac_entry->sa_fwd = AIR_L2_FWD_CTRL_DROP;
+            break;
+        default:
+            ptr_mac_entry->sa_fwd = AIR_L2_FWD_CTRL_DEFAULT;
+            break;
+    }
+
+    /* Read ATRD2 */
+    aml_readReg(unit, ATRD2, &u32dat);
+    for (i = 0; i < 4; i++)
+    {
+        ptr_mac_entry->mac[i] = BITS_OFF_R(u32dat, (3 - i)*8, 8);
+    }
+
+    /* Read ATRD3 */
+    aml_readReg(unit, ATRD3, &u32dat);
+    ptr_mac_entry->port_bitmap[0] = BITS_OFF_R(u32dat, ATRD3_MAC_PORT_OFFSET, ATRD3_MAC_PORT_LENGTH);
+
+    return AIR_E_OK;
+}
+
+static AIR_ERROR_NO_T _mac_entry_init(AIR_MAC_ENTRY_T   *ptr_mac_entry)
+{
+    AIR_CHECK_PTR(ptr_mac_entry);
+    memset(ptr_mac_entry->mac, 0, sizeof(ptr_mac_entry->mac));
+    ptr_mac_entry->cvid = 0;
+    ptr_mac_entry->fid = 0;
+    ptr_mac_entry->flags = 0;
+    ptr_mac_entry->port_bitmap[0] = 0;
+    ptr_mac_entry->sa_fwd = 0;
+    ptr_mac_entry->timer = 0;
+    return AIR_E_OK;
+}
+/* FUNCTION NAME: air_l2_addMacAddr
+ * PURPOSE:
+ *      Add or set a L2 unicast MAC address entry.
+ *      If the address entry doesn't exist, it will add the entry.
+ *      If the address entry already exists, it will set the entry
+ *      with user input value.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      ptr_mac_entry   --  Structure of MAC Address table
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TABLE_FULL
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_l2_addMacAddr(
+    const UI32_T unit,
+    const AIR_MAC_ENTRY_T   *ptr_mac_entry)
+{
+    UI32_T u32dat = 0;
+    UI32_T reg_aac = 0;
+    AIR_MAC_ENTRY_T set_mac_entry;
+
+    /* parameter sanity check */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_mac_entry);
+    AIR_PARAM_CHK(((ptr_mac_entry->port_bitmap[0] & AIR_ALL_PORT_BITMAP) == 0), AIR_E_BAD_PARAMETER);
+    if (ptr_mac_entry->flags & AIR_L2_MAC_ENTRY_FLAGS_IVL)
+    {
+        AIR_PARAM_CHK(((ptr_mac_entry->cvid < 1) || (ptr_mac_entry->cvid > 4095)), AIR_E_BAD_PARAMETER);
+    }
+    else
+    {
+        AIR_PARAM_CHK(((ptr_mac_entry->fid > (AIR_STP_FID_NUMBER - 1))), AIR_E_BAD_PARAMETER);
+    }
+    _mac_entry_init(&set_mac_entry);
+    /* Set the target MAC entry as setting entry no mater the hash addrees is existed or not */
+    memcpy(&set_mac_entry, ptr_mac_entry, sizeof(AIR_MAC_ENTRY_T));
+    /* Translate port bitmap type */
+    /* set aging counter as system aging conuter */
+    aml_readReg(unit, AAC, &reg_aac);
+    set_mac_entry.timer = BITS_OFF_R(reg_aac, AAC_AGE_CNT_OFFSET, AAC_AGE_CNT_LENGTH);
+
+    /* Fill MAC address entry */
+    _fill_MAC_ATA(unit, &set_mac_entry);
+    _fill_MAC_ATWD(unit, &set_mac_entry, TRUE);
+
+    /* Write data by ATC */
+    u32dat = (ATC_SAT_MAC | ATC_CMD_WRITE | ATC_START_BUSY);
+    aml_writeReg(unit, ATC, u32dat);
+    if (AIR_E_TIMEOUT == _checkL2Busy(unit))
+    {
+        return AIR_E_TIMEOUT;
+    }
+    if ( !_checkL2EntryHit(unit))
+    {
+        return AIR_E_TABLE_FULL;
+    }
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_l2_delMacAddr
+ * PURPOSE:
+ *      Delete a L2 unicast MAC address entry.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      ptr_mac_entry   --  The structure of MAC Address table
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_l2_delMacAddr(
+    const UI32_T unit,
+    const AIR_MAC_ENTRY_T   *ptr_mac_entry)
+{
+    UI32_T u32dat = 0;
+    AIR_MAC_ENTRY_T del_mac_entry;
+
+    /* parameter sanity check */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_mac_entry);
+    //AIR_PARAM_CHK(((ptr_mac_entry->port_bitmap[0] & AIR_ALL_PORT_BITMAP) == 0), AIR_E_BAD_PARAMETER);
+    if (ptr_mac_entry->flags & AIR_L2_MAC_ENTRY_FLAGS_IVL)
+    {
+        AIR_PARAM_CHK(((ptr_mac_entry->cvid < 1) || (ptr_mac_entry->cvid > 4095)), AIR_E_BAD_PARAMETER);
+    }
+    else
+    {
+        AIR_PARAM_CHK(((ptr_mac_entry->fid > (AIR_STP_FID_NUMBER - 1))), AIR_E_BAD_PARAMETER);
+    }
+    _mac_entry_init(&del_mac_entry);
+    memcpy(&del_mac_entry, ptr_mac_entry, sizeof(AIR_MAC_ENTRY_T));
+
+    /* Fill MAC address entry */
+    _fill_MAC_ATA(unit, &del_mac_entry);
+    _fill_MAC_ATWD(unit, &del_mac_entry, FALSE);
+
+    /* Write data by ATC to delete entry */
+    u32dat = (ATC_SAT_MAC | ATC_CMD_WRITE | ATC_START_BUSY);
+    aml_writeReg(unit, ATC, u32dat);
+    if (AIR_E_TIMEOUT == _checkL2Busy(unit))
+    {
+        return AIR_E_TIMEOUT;
+    }
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME:   air_l2_getMacBucketSize
+ * PURPOSE:
+ *      Get the bucket size of one MAC address set when searching L2
+ *      table.
+ * INPUT:
+ *      unit                     -- Device ID
+ * OUTPUT:
+ *      ptr_size                 -- The bucket size
+ * RETURN:
+ *      AIR_E_OK                 -- Operation success.
+ *      AIR_E_BAD_PARAMETER      -- Parameter is wrong.
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_l2_getMacBucketSize(
+    const UI32_T    unit,
+    UI32_T          *ptr_size)
+{
+    /* parameter sanity check */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_size);
+
+    /* Access regiser */
+    (*ptr_size) = AIR_L2_MAC_SET_NUM;
+
+    return AIR_E_OK;
+}
+
+
+/* FUNCTION NAME:  air_l2_getMacAddr
+ * PURPOSE:
+ *      Get a L2 unicast MAC address entry.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      ptr_mac_entry   --  The structure of MAC Address table
+ *
+ * OUTPUT:
+ *      ptr_count                -- The number of returned MAC entries
+ *      ptr_mac_entry            -- Structure of MAC Address table for
+ *                                  searching result.
+ *                                  The size of ptr_mac_entry depends
+ *                                  on the maximun number of bank.
+ *                                  The memory size should greater than
+ *                                  ((# of Bank) * (Size of entry
+ *                                  structure))
+ *                                  AIR_MAC_ENTRY_T
+ * RETURN:
+ *      AIR_E_OK                 -- Operation success.
+ *      AIR_E_BAD_PARAMETER      -- Parameter is wrong.
+ *      AIR_E_TIMEOUT            -- Timeout error.
+ *      AIR_E_ENTRY_NOT_FOUND    -- Entry is not found.
+ * NOTES:
+ *      If the parameter:mac in input argument ptr_mac_entry[0] is
+ *      empty. It means to search the first valid MAC address entry
+ *      in MAC address table. Otherwise, to search the specific MAC
+ *      address entry in input argument ptr_mac_entry[0].
+ *      Input argument ptr_mac_entry[0] needs include mac, ivl and
+ *      (fid or cvid) depends on ivl.
+ *      If argument ivl is TRUE, cvid is necessary, or fid is.
+ */
+AIR_ERROR_NO_T
+air_l2_getMacAddr(
+    const UI32_T unit,
+    UI8_T           *ptr_count,
+    AIR_MAC_ENTRY_T *ptr_mac_entry)
+{
+    AIR_ERROR_NO_T rc = AIR_E_OK;
+    UI32_T i = 0;
+    BOOL_T is_mac_empty = TRUE;
+    BOOL_T found_target = FALSE;
+    AIR_MAC_ENTRY_T mt_read;
+    UI32_T addr = 0;
+    UI32_T banks = 0;
+    AIR_L2_MAC_MAT_T mat = 0;
+
+    /* parameter sanity check */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_mac_entry);
+    //AIR_PARAM_CHK(((ptr_mac_entry->port_bitmap[0] & AIR_ALL_PORT_BITMAP) == 0), AIR_E_BAD_PARAMETER);
+    if (ptr_mac_entry->flags & AIR_L2_MAC_ENTRY_FLAGS_IVL)
+    {
+        AIR_PARAM_CHK(((ptr_mac_entry->cvid < 1) || (ptr_mac_entry->cvid > 4095)), AIR_E_BAD_PARAMETER);
+    }
+    else
+    {
+        AIR_PARAM_CHK(((ptr_mac_entry->fid > (AIR_STP_FID_NUMBER - 1))), AIR_E_BAD_PARAMETER);
+    }
+    _mac_entry_init(&mt_read);
+    /* Check MAC Address field of input data */
+    for (i = 0; i < 6; i++)
+    {
+        if (0 != ptr_mac_entry->mac[i])
+        {
+            is_mac_empty = FALSE;
+            break;
+        }
+    }
+
+    (*ptr_count) = 0;
+    if (FALSE == is_mac_empty)
+    {
+        /* MAC address isn't empty, means to search a specific MAC entry */
+        if (ptr_mac_entry->flags & AIR_L2_MAC_ENTRY_FLAGS_IVL)
+        {
+            mat = AIR_L2_MAC_MAT_MAC_BY_VID;
+        }
+        else
+        {
+            mat = AIR_L2_MAC_MAT_MAC_BY_FID;
+        }
+        _fill_MAC_ATA(unit, ptr_mac_entry);
+        _fill_MAC_ATWD(unit, ptr_mac_entry, TRUE);
+
+        rc = _searchMacEntry(unit, AIR_L2_MAC_MS_START, mat, &addr, &banks);
+
+        while(AIR_E_OK == rc)
+        {
+            AIR_PRINT("banks=(%d)\n", banks);
+            if (0 == banks)
+            {
+                return AIR_E_ENTRY_NOT_FOUND;
+            }
+            for (i = 0; i < AIR_L2_MAC_SET_NUM; i++)
+            {
+                if (!!BITS_OFF_R(banks, i, 1))
+                {
+                    /* Found a valid MAC entry */
+                    /* Select bank */
+                    _fill_MAC_ATRDS(unit, i);
+
+                    /* Read MAC entry */
+                    memset(&mt_read, 0, sizeof(AIR_MAC_ENTRY_T));
+                    rc = _read_MAC_ATRD(unit, &mt_read);
+                    if (AIR_E_OK != rc)
+                    {
+                        AIR_PRINT("rc=(%d)\n", rc);
+                        continue;
+                    }
+                    if (TRUE == _cmpMac(ptr_mac_entry->mac, mt_read.mac))
+                    {
+                        /* The found MAC is the target, restore data and leave */
+                        memcpy(ptr_mac_entry, &mt_read, sizeof(AIR_MAC_ENTRY_T));
+                        /* Translate port bitmap type */
+                        found_target = TRUE;
+                        (*ptr_count)++;
+                        break;
+                    }
+                }
+            }
+
+            if ( TRUE == found_target)
+            {
+                break;
+            }
+
+            /* The found MAC isn't the target, keep searching or leave
+             * when found the last entry */
+            if (TRUE == _search_end)
+            {
+                return AIR_E_ENTRY_NOT_FOUND;
+            }
+            else
+            {
+                rc = _searchMacEntry(unit, AIR_L2_MAC_MS_NEXT, mat, &addr, &banks);
+            }
+        }
+        return rc;
+    }
+    else
+    {
+        /* MAC address is empty, means to search the 1st MAC entry */
+        rc = _searchMacEntry(unit, AIR_L2_MAC_MS_START, AIR_L2_MAC_MAT_MAC, &addr, &banks);
+
+        switch(rc)
+        {
+            case AIR_E_OK:
+                /* Searching bank and read data */
+                AIR_PRINT("banks=(%d)\n", banks);
+                if (0 == banks)
+                {
+                    return AIR_E_ENTRY_NOT_FOUND;
+                }
+                for (i = 0; i < AIR_L2_MAC_SET_NUM; i++)
+                {
+                    if (!!BITS_OFF_R(banks, i, 1))
+                    {
+                        /* Found a valid MAC entry */
+                        /* Select bank */
+                        _fill_MAC_ATRDS(unit, i);
+
+                        /* Read MAC entry */
+                        memset(&mt_read, 0, sizeof(AIR_MAC_ENTRY_T));
+                        rc = _read_MAC_ATRD(unit, &mt_read);
+                        if (AIR_E_OK != rc)
+                        {
+                            AIR_PRINT("rc=(%d)\n", rc);
+                            continue;
+                        }
+                        memcpy(&ptr_mac_entry[(*ptr_count)], &mt_read, sizeof(AIR_MAC_ENTRY_T));
+                        /* Translate port bitmap type */
+                        (*ptr_count)++;
+                    }
+                }
+                return AIR_E_OK;
+            case AIR_E_TIMEOUT:
+                /* Searching over time */
+                return AIR_E_TIMEOUT;
+            default:
+                AIR_PRINT("rc=(%d)\n", rc);
+                return AIR_E_ENTRY_NOT_FOUND;
+        }
+    }
+}
+
+/* FUNCTION NAME: air_l2_getNextMacAddr
+ * PURPOSE:
+ *      Get the next L2 unicast MAC address entry.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      ptr_mac_entry   --  The structure of MAC Address table
+ *
+ * OUTPUT:
+ *      ptr_count       --  The number of returned MAC entries
+ *      ptr_mac_entry   --  Structure of MAC Address table for searching result.
+ *                          The size of ptr_mac_entry depends on the max. number of bank.
+ *                          The memory size should greater than ((# of Bank) * (Table size))
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *      AIR_E_ENTRY_NOT_FOUND
+ * NOTES:
+ *      If the parameter:mac in input argument ptr_mac_entry[0] is empty.
+ *      It means to search the next valid MAC address entries of last searching result.
+ *      Otherwise, to search the next valid MAC address entry of the specific MAC address
+ *      entry in input argument ptr_mac_entry[0].
+ *      Input argument ptr_mac_entry[0] needs include mac, ivl and (fid or cvid) depends on ivl.
+ *      If argument ivl is TRUE, cvid is necessary, or fid is.
+ */
+AIR_ERROR_NO_T
+air_l2_getNextMacAddr(
+    const UI32_T unit,
+    UI8_T           *ptr_count,
+    AIR_MAC_ENTRY_T *ptr_mac_entry)
+
+{
+    AIR_ERROR_NO_T rc = AIR_E_OK;
+    UI32_T i = 0;
+    BOOL_T is_mac_empty = TRUE;
+    BOOL_T found_target = FALSE;
+    AIR_MAC_ENTRY_T mt_read;
+    UI32_T addr = 0;
+    UI32_T banks = 0;
+
+    /* parameter sanity check */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_mac_entry);
+    //AIR_PARAM_CHK(((ptr_mac_entry->port_bitmap[0] & AIR_ALL_PORT_BITMAP) == 0), AIR_E_BAD_PARAMETER);
+    if (ptr_mac_entry->flags & AIR_L2_MAC_ENTRY_FLAGS_IVL)
+    {
+        AIR_PARAM_CHK(((ptr_mac_entry->cvid < 1) || (ptr_mac_entry->cvid > 4095)), AIR_E_BAD_PARAMETER);
+    }
+    else
+    {
+        AIR_PARAM_CHK(((ptr_mac_entry->fid > (AIR_STP_FID_NUMBER - 1))), AIR_E_BAD_PARAMETER);
+    }
+    _mac_entry_init(&mt_read);
+    /* If found the lastest entry last time, we couldn't keep to search the next entry */
+    if(TRUE == _search_end)
+    {
+        return AIR_E_ENTRY_NOT_FOUND;
+    }
+
+    /* Check MAC Address field of input data */
+    for (i = 0; i < 6; i++)
+    {
+        if (0 != ptr_mac_entry->mac[i])
+        {
+            is_mac_empty = FALSE;
+            break;
+        }
+    }
+    (*ptr_count)=0;
+
+    if (FALSE == is_mac_empty)
+    {
+        /* MAC address isn't empty, means to search the next entries of input MAC Address */
+        /* Search the target MAC entry */
+        _fill_MAC_ATA(unit, ptr_mac_entry);
+        rc = _searchMacEntry(unit, AIR_L2_MAC_MS_START, AIR_L2_MAC_MAT_MAC, &addr, &banks);
+        while(AIR_E_OK == rc)
+        {
+            AIR_PRINT("banks=(%d)\n", banks);
+            if (0 == banks)
+            {
+                return AIR_E_ENTRY_NOT_FOUND;
+            }
+            for (i = 0; i < AIR_L2_MAC_SET_NUM; i++)
+            {
+                if (!!BITS_OFF_R(banks, i, 1))
+                {
+                    /* Found a valid MAC entry */
+                    /* Select bank */
+                    _fill_MAC_ATRDS(unit, i);
+
+                    /* Read MAC entry */
+                    memset(&mt_read, 0, sizeof(AIR_MAC_ENTRY_T));
+                    rc = _read_MAC_ATRD(unit, &mt_read);
+                    if (AIR_E_OK != rc)
+                    {
+                        AIR_PRINT("rc=(%d)\n", rc);
+                        continue;
+                    }
+                    if (TRUE == _cmpMac(ptr_mac_entry->mac, mt_read.mac))
+                    {
+                        /* The found MAC is the target, restore data and leave */
+                        found_target = TRUE;
+                        break;
+                    }
+                }
+            }
+
+            if ( TRUE == found_target)
+            {
+                break;
+            }
+
+            /* The found MAC isn't the target, keep searching or leave
+             * when found the last entry */
+            if (TRUE == _search_end)
+            {
+                return AIR_E_ENTRY_NOT_FOUND;
+            }
+            else
+            {
+                rc = _searchMacEntry(unit, AIR_L2_MAC_MS_NEXT, AIR_L2_MAC_MAT_MAC, &addr, &banks);
+            }
+        }
+
+        if ( FALSE == found_target )
+        {
+            /* Entry not bank */
+            return AIR_E_ENTRY_NOT_FOUND;
+        }
+        else
+        {
+            /* Found the target MAC entry, and try to search the next address */
+            rc = _searchMacEntry(unit, AIR_L2_MAC_MS_NEXT, AIR_L2_MAC_MAT_MAC, &addr, &banks);
+            if (AIR_E_OK == rc)
+            {
+                AIR_PRINT("banks=(%d)\n", banks);
+                if (0 == banks)
+                {
+                    return AIR_E_ENTRY_NOT_FOUND;
+                }
+                for (i = 0; i < AIR_L2_MAC_SET_NUM; i++)
+                {
+                    if (!!BITS_OFF_R(banks, i, 1))
+                    {
+                        /* Found a valid MAC entry */
+                        /* Select bank */
+                        _fill_MAC_ATRDS(unit, i);
+
+                        /* Read MAC entry */
+                        memset(&mt_read, 0, sizeof(AIR_MAC_ENTRY_T));
+                        rc = _read_MAC_ATRD(unit, &mt_read);
+                        if (AIR_E_OK != rc)
+                        {
+                            AIR_PRINT("rc=(%d)\n", rc);
+                            continue;
+                        }
+                        memcpy(&ptr_mac_entry[(*ptr_count)], &mt_read, sizeof(AIR_MAC_ENTRY_T));
+                        /* Translate port bitmap type */
+                        (*ptr_count)++;
+                    }
+                }
+                return AIR_E_OK;
+            }
+            else
+            {
+                AIR_PRINT("rc=(%d)\n", rc);
+                return AIR_E_ENTRY_NOT_FOUND;
+            }
+        }
+    }
+    else
+    {
+        /* MAC address is empty, means to search next entry */
+        rc = _searchMacEntry(unit, AIR_L2_MAC_MS_NEXT, AIR_L2_MAC_MAT_MAC, &addr, &banks);
+        if (AIR_E_OK == rc)
+        {
+            AIR_PRINT("banks=(%d)\n", banks);
+            if (0 == banks)
+            {
+                return AIR_E_ENTRY_NOT_FOUND;
+            }
+            for (i = 0; i < AIR_L2_MAC_SET_NUM; i++)
+            {
+                if (!!BITS_OFF_R(banks, i, 1))
+                {
+                    /* Found a valid MAC entry */
+                    /* Select bank */
+                    _fill_MAC_ATRDS(unit, i);
+
+                    /* Read MAC entry */
+                    memset(&mt_read, 0, sizeof(AIR_MAC_ENTRY_T));
+                    rc = _read_MAC_ATRD(unit, &mt_read);
+                    if (AIR_E_OK != rc)
+                    {
+                        AIR_PRINT("rc=(%d)\n", rc);
+                        continue;
+                    }
+                    memcpy(&ptr_mac_entry[(*ptr_count)], &mt_read, sizeof(AIR_MAC_ENTRY_T));
+                    /* Translate port bitmap type */
+                    (*ptr_count)++;
+                }
+            }
+            return AIR_E_OK;
+        }
+        else
+        {
+            AIR_PRINT("rc=(%d)\n", rc);
+            return AIR_E_ENTRY_NOT_FOUND;
+        }
+    }
+}
+
+/* FUNCTION NAME: air_l2_clearMacAddr
+ * PURPOSE:
+ *      Clear all L2 unicast MAC address entry.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_l2_clearMacAddr(
+    const UI32_T unit)
+{
+    UI32_T u32dat = 0;
+
+    /* parameter sanity check */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    /* Write data by ATC to clear all MAC address entries */
+    u32dat = (ATC_SAT_MAC | ATC_CMD_CLEAN | ATC_START_BUSY);
+    aml_writeReg(unit, ATC, u32dat);
+    if (AIR_E_TIMEOUT == _checkL2Busy(unit))
+    {
+        return AIR_E_TIMEOUT;
+    }
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME:   air_l2_setMacAddrAgeOut
+ * PURPOSE:
+ *      Set the age out time of L2 MAC address entries.
+ * INPUT:
+ *      unit                     -- Device ID
+ *      age_time                 -- Age out time (second)
+ *                                  (1..AIR_L2_MAC_MAX_AGE_OUT_TIME)
+ * OUTPUT:
+ *      None
+ * RETURN:
+ *      AIR_E_OK                 -- Operation success.
+ *      AIR_E_BAD_PARAMETER      -- Parameter is wrong.
+ * NOTES:
+ *      None
+ */
+
+AIR_ERROR_NO_T
+air_l2_setMacAddrAgeOut(
+    const UI32_T    unit,
+    const UI32_T    age_time)
+{
+    
+    UI32_T u32dat = 0;
+    UI32_T age_cnt = 0, age_unit = 0, age_value = 0;
+    /* parameter sanity check */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK(((age_time > AIR_L2_MAC_MAX_AGE_OUT_TIME) || (age_time < 1)), AIR_E_BAD_PARAMETER);
+
+    /* Read the old register value */
+    aml_readReg(unit, AAC, &u32dat);
+
+    u32dat &= ~ BITS_RANGE(AAC_AGE_UNIT_OFFSET, AAC_AGE_UNIT_LENGTH);
+    u32dat &= ~ BITS_RANGE(AAC_AGE_CNT_OFFSET, AAC_AGE_CNT_LENGTH);
+
+    /* Calcuate the aging count/unit */
+    age_value = age_time * AIR_L2_AGING_1000MS / AIR_L2_AGING_MS_CONSTANT;
+    age_unit = (age_value / BIT(AAC_AGE_CNT_LENGTH) + 1);
+    age_cnt = (age_value / age_unit + 1);
+
+    /* Write the new register value */
+    u32dat |= BITS_OFF_L((age_unit - 1), AAC_AGE_UNIT_OFFSET, AAC_AGE_UNIT_LENGTH);
+    u32dat |= BITS_OFF_L((age_cnt - 1), AAC_AGE_CNT_OFFSET, AAC_AGE_CNT_LENGTH);
+
+    aml_writeReg(unit, AAC, u32dat);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME:   air_l2_getMacAddrAgeOut
+ * PURPOSE:
+ *      Get the age out time of unicast MAC address.
+ * INPUT:
+ *      unit                     -- Device ID
+ * OUTPUT:
+ *      ptr_age_time             -- age out time
+ * RETURN:
+ *      AIR_E_OK                 -- Operation success.
+ *      AIR_E_BAD_PARAMETER      -- Parameter is wrong.
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_l2_getMacAddrAgeOut(
+    const UI32_T    unit,
+    UI32_T          *ptr_age_time)
+{
+    UI32_T u32dat = 0;
+    UI32_T age_cnt = 0, age_unit = 0;
+    /* parameter sanity check */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_age_time);
+
+    /* Read data from register */
+    aml_readReg(unit, AAC, &u32dat);
+
+    age_cnt = BITS_OFF_R(u32dat, AAC_AGE_CNT_OFFSET, AAC_AGE_CNT_LENGTH);
+    age_unit = BITS_OFF_R(u32dat, AAC_AGE_UNIT_OFFSET, AAC_AGE_UNIT_LENGTH);
+    (*ptr_age_time) = AIR_L2_AGING_TIME(age_cnt, age_unit);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_l2_setAgeEnable
+ * PURPOSE:
+ *      Set aging state for a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      state           --  FALSE:Disable
+ *                          TRUE: Enable
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_l2_setAgeEnable(
+    const UI32_T unit,
+    const UI32_T port,
+    const BOOL_T state)
+{
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK(((TRUE != state) && (FALSE != state)), AIR_E_BAD_PARAMETER);
+
+    aml_readReg(unit, AGDIS, &u32dat);
+    if (state)
+    {
+        u32dat &= ~BIT(port);
+    }
+    else
+    {
+        u32dat |= BIT(port);
+    }
+    aml_writeReg(unit, AGDIS, u32dat);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_l2_getAgeEnable
+ * PURPOSE:
+ *      Get age state for a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *
+ * OUTPUT:
+ *      ptr_state       --  FALSE:Disable
+ *                          TRUE: Enable
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_l2_getAgeEnable(
+    const UI32_T unit,
+    const UI32_T port,
+    UI32_T *ptr_state)
+{
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+
+    /* Mistake proofing for state checking */
+    AIR_CHECK_PTR(ptr_state);
+
+    /* Read data from register */
+    aml_readReg(unit, AGDIS, &u32dat);
+
+    (*ptr_state) = (u32dat & BIT(port)) ? TRUE : FALSE;
+
+    return AIR_E_OK;
+}
+
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_lag.c b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_lag.c
new file mode 100644
index 0000000..d3f4e14
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_lag.c
@@ -0,0 +1,530 @@
+/* FILE NAME:  air_lag.c
+ * PURPOSE:
+ *      Define the Link Agrregation function in AIR SDK.
+ *
+ * NOTES:
+ *      None
+ */
+
+/* INCLUDE FILE DECLARATIONS
+*/
+#include "air.h"
+
+/* NAMING CONSTANT DECLARATIONS
+*/
+
+/* MACRO FUNCTION DECLARATIONS
+*/
+
+/* DATA TYPE DECLARATIONS
+*/
+
+/* GLOBAL VARIABLE DECLARATIONS
+*/
+
+/* LOCAL SUBPROGRAM DECLARATIONS
+*/
+
+/* STATIC VARIABLE DECLARATIONS
+*/
+
+/* LOCAL SUBPROGRAM BODIES
+*/
+
+/* EXPORTED SUBPROGRAM BODIES
+*/
+
+/* FUNCTION NAME: air_lag_setMember
+ * PURPOSE:
+ *      Set LAG member(s) for a specific LAG port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      ptg_index       --  Port trunk index
+ *      mem_index       --  Member index
+ *      mem_en          --  enable Member
+ *      port_index      --  Member port
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_lag_setMember(
+    const UI32_T        unit,
+    const UI32_T        ptg_index,
+    const UI32_T        mem_index,
+    const UI32_T        mem_en,
+    const UI32_T        port_index)
+{
+    UI32_T val = 0;
+    UI32_T i = 0, offset = 0;
+    UI32_T reg = 0;
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK((ptg_index >= AIR_LAG_MAX_PTG_NUM), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((mem_index > AIR_LAG_MAX_MEM_NUM), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((mem_en !=0 && mem_en !=1), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((port_index > AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+
+    offset = mem_index;
+    reg = (UI32_T)PTG(ptg_index);
+
+    AIR_PRINT("PTC REG:%x.\n", reg);
+
+    aml_readReg(unit,reg, &val);
+    AIR_PRINT("PTC REG val:%x.---1\n", val);
+    if(mem_en == 0)
+    {
+        val = val & ~(BIT(7 + 8*offset)); //port turnk group ptg_index; port port_index
+    }
+    else
+    {
+        val = val  | (BIT(7 + 8*offset)); //port turnk group ptg_index; port port_index
+    }
+    AIR_PRINT("PTC REG val:%x.----2\n", val);
+    val = val & ~( 0x1F << 8*offset);
+    val = val | AIR_GRP_PORT(port_index,offset); //port turnk group ptg_index; port port_index
+    AIR_PRINT("PTC REG val:%x. port %d----3\n", val,port_index);
+
+    aml_writeReg(unit, reg, val);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_lag_getMember
+ * PURPOSE:
+ *      Get LAG member count.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      ptg_index       --  Port trunk index
+ *
+ * OUTPUT:
+ *      member      --  Member ports of  one port trunk
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_lag_getMember(
+    const UI32_T unit,
+    const UI32_T ptg_index,
+    AIR_LAG_PTGINFO_T * member)
+{
+    UI32_T val0 = 0, val1 = 0, i = 0, offset = 0;
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK((ptg_index >= AIR_LAG_MAX_PTG_NUM), AIR_E_BAD_PARAMETER);
+
+    /* Mistake proofing */
+    AIR_CHECK_PTR(member);
+    aml_readReg(unit, (UI32_T)PTG(ptg_index), &val0);
+
+    for(i = 0; i < AIR_LAG_MAX_MEM_NUM; i++){
+        member->csr_gp_enable[i] = (UI32_T)BITS_OFF_R(val0, 7 + 8*i, 1);
+        member->csr_gp_port[i] = (UI32_T)BITS_OFF_R(val0, 8*i, 5);
+    }
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_lag_set_ptgc_state
+ * PURPOSE:
+ *     set port trunk group control state.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      ptgc_enable     --  enabble or disable port trunk function
+ *
+ * OUTPUT:
+ *      none
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_lag_set_ptgc_state(
+    const UI32_T unit,
+    const BOOL_T ptgc_enable)
+{
+    /* Mistake proofing */
+    AIR_PARAM_CHK(((TRUE != ptgc_enable) && (FALSE != ptgc_enable)), AIR_E_BAD_PARAMETER);
+
+    aml_writeReg(unit, PTGC, ptgc_enable);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_lag_get_ptgc_state
+ * PURPOSE:
+ *      Get port trunk group control state.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      ptr_state        --  port trunk fucntion is enable or disable
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_lag_get_ptgc_state(
+    const UI32_T unit,
+    UI32_T *ptr_state)
+{
+    UI32_T u32dat = 0;
+    
+    AIR_CHECK_PTR(ptr_state);
+    aml_readReg(unit, PTGC, &u32dat);
+    (*ptr_state) = BITS_OFF_R(u32dat, 0, 1);
+
+    return AIR_E_OK;
+}
+
+
+/* FUNCTION NAME: air_lag_setDstInfo
+ * PURPOSE:
+ *      Set information for the packet distribution.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      dstInfo         --  Infomation selection of packet distribution
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_lag_setDstInfo(
+    const UI32_T unit,
+    const AIR_LAG_DISTINFO_T dstInfo)
+{
+    UI32_T val = 0;
+    aml_readReg(unit, (UI32_T)PTC, &val);
+
+    /* Set infomation control bit map */
+    val = val & ~ BITS(0,6);
+    if(dstInfo.sp)
+    {
+        val |= PTC_INFO_SEL_SP;
+    }
+    if(dstInfo.sa)
+    {
+        val |= PTC_INFO_SEL_SA;
+    }
+    if(dstInfo.da)
+    {
+        val |= PTC_INFO_SEL_DA;
+    }
+    if(dstInfo.sip)
+    {
+        val |= PTC_INFO_SEL_SIP;
+    }
+    if(dstInfo.dip)
+    {
+        val |= PTC_INFO_SEL_DIP;
+    }
+    if(dstInfo.sport)
+    {
+        val |= PTC_INFO_SEL_SPORT;
+    }
+    if(dstInfo.dport)
+    {
+        val |= PTC_INFO_SEL_DPORT;
+    }
+
+    /* Write register */
+    aml_writeReg(unit, (UI32_T)PTC, val);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_lag_getDstInfo
+ * PURPOSE:
+ *      Set port trunk hashtype.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      ptr_dstInfo     --  Infomation selection of packet distribution
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_TIMEOUT
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_lag_getDstInfo(
+    const UI32_T unit,
+    AIR_LAG_DISTINFO_T *ptr_dstInfo)
+{
+    UI32_T val = 0;
+
+    /* Mistake proofing */
+    AIR_CHECK_PTR(ptr_dstInfo);
+
+    /* Get infomation control bit map */
+    aml_readReg(unit, (UI32_T)PTC, &val);
+    if(val & PTC_INFO_SEL_SP)
+    {
+        ptr_dstInfo ->sp = 1;
+    }
+    if(val & PTC_INFO_SEL_SA)
+    {
+        ptr_dstInfo ->sa = 1;
+    }
+    if(val & PTC_INFO_SEL_DA)
+    {
+        ptr_dstInfo ->da = 1;
+    }
+    if(val & PTC_INFO_SEL_SIP)
+    {
+        ptr_dstInfo ->sip = 1;
+    }
+    if(val & PTC_INFO_SEL_DIP)
+    {
+        ptr_dstInfo ->dip = 1;
+    }
+    if(val & PTC_INFO_SEL_SPORT)
+    {
+        ptr_dstInfo ->sport = 1;
+    }
+    if(val & PTC_INFO_SEL_DPORT)
+    {
+        ptr_dstInfo ->dport = 1;
+    }
+
+    return AIR_E_OK;
+}
+
+
+/* FUNCTION NAME: air_lag_setState
+ * PURPOSE:
+ *      Set the enable/disable for a specific LAG port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      hashtype        --  crc32msb/crc32lsb/crc16/xor4
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_lag_sethashtype(
+    const UI32_T unit,
+    const UI32_T hashtype)
+{
+    UI32_T val = 0;
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK((hashtype > 3), AIR_E_BAD_PARAMETER);
+
+    /* Read data from register */
+    aml_readReg(unit, (UI32_T)PTC, &val);
+    
+    val = val & ~ BITS(8,9);
+    val |= hashtype << 8;
+    
+    aml_writeReg(unit, (UI32_T)PTC, val);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_lag_getState
+ * PURPOSE:
+ *      Get port trunk hashtype.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      hashtype        --  crc32msb/crc32lsb/crc16/xor4
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_lag_gethashtype(
+    const UI32_T unit,
+    UI32_T *hashtype)
+{
+    UI32_T val = 0;
+
+    /* Mistake proofing */
+    AIR_CHECK_PTR(hashtype);
+
+    /* Read data from register */
+    aml_readReg(unit, (UI32_T)PTC, &val);
+    (*hashtype) = BITS_OFF_R(val, 8, 9);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_lag_setSpSel
+ * PURPOSE:
+ *      Set the enable/disable for selection source port composition.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      enable          --  enable or disable source port compare
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_lag_setSpSel(
+    const UI32_T unit,
+    const BOOL_T spsel_enable)
+{
+    UI32_T val = 0;
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK(((TRUE != spsel_enable) && (FALSE != spsel_enable)), AIR_E_BAD_PARAMETER);
+
+    /* Read data from register */
+    aml_readReg(unit, (UI32_T)PTC, &val);
+    val = val & ~ BIT(20);
+    val |= spsel_enable << 20;
+    aml_writeReg(unit, (UI32_T)PTC, val);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_lag_getSpSel
+ * PURPOSE:
+ *      Get selection source port composition.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      ptr_state       --  source port compare is enable or disable
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_lag_getSpSel(
+    const UI32_T unit,
+    UI32_T *ptr_state)
+{
+    UI32_T val = 0;
+
+    /* Mistake proofing */
+    AIR_CHECK_PTR(ptr_state);
+
+    /* Read data from register */
+    AIR_CHECK_PTR(ptr_state);
+    aml_readReg(unit, PTC, &val);
+    (*ptr_state) = val & BIT(20);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_lag_setPTSeed
+ * PURPOSE:
+ *      Set the enable/disable for a specific LAG port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      ptseed          --  port trunk rand seed
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_lag_setPTSeed(
+    const UI32_T unit,
+    const UI32_T ptseed)
+{
+    aml_writeReg(unit, (UI32_T)PTSEED, ptseed);
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_lag_getPTSeed
+ * PURPOSE:
+ *      Get port trunk hashtype.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      ptseed          --  port trunk rand seed
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_lag_getPTSeed(
+    const UI32_T unit,
+    UI32_T *ptseed)
+{
+    UI32_T val = 0;
+
+    /* Mistake proofing */
+    AIR_CHECK_PTR(ptseed);
+
+    /* Read data from register */
+    aml_readReg(unit, (UI32_T)PTSEED, ptseed);
+
+    return AIR_E_OK;
+}
+
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_led.c b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_led.c
new file mode 100644
index 0000000..d89caa9
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_led.c
@@ -0,0 +1,528 @@
+/* FILE NAME: air_led.c
+ * PURPOSE:
+ *      Define the LED function in AIR SDK.
+ *
+ * NOTES:
+ *      None
+ */
+
+/* INCLUDE FILE DECLARATIONS
+*/
+#include "air.h"
+
+/* NAMING CONSTANT DECLARATIONS
+*/
+
+/* MACRO FUNCTION DECLARATIONS
+*/
+#define LED_SET_EVT(evt, reg, bit)          \
+    do{                                     \
+        if( TRUE == evt)                    \
+        {                                   \
+            reg |= bit;                     \
+        }                                   \
+    }while(0)
+
+/* DATA TYPE DECLARATIONS
+*/
+
+/* GLOBAL VARIABLE DECLARATIONS
+*/
+
+/* LOCAL SUBPROGRAM DECLARATIONS
+*/
+
+/* STATIC VARIABLE DECLARATIONS
+*/
+
+/* LOCAL SUBPROGRAM BODIES
+*/
+
+/* EXPORTED SUBPROGRAM BODIES
+*/
+/* FUNCTION NAME: air_led_setMode
+ * PURPOSE:
+ *      Set the LED processing mode for a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      mode            --  Setting mode of LED
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      The LED control register is shared with all port on AN8855.
+ *      Setting LED on any one port will also set to each other ports.
+ */
+AIR_ERROR_NO_T
+air_led_setMode(
+    const UI32_T unit,
+    const UI8_T port,
+    const AIR_LED_MODE_T mode)
+{
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK( ( port >= AIR_MAX_NUM_OF_GIGA_PORTS ), AIR_E_BAD_PARAMETER );
+    AIR_PARAM_CHK( ( mode >= AIR_LED_BLK_DUR_LAST ), AIR_E_BAD_PARAMETER );
+
+    /* Read data from register */
+    aml_readPhyRegCL45( unit, port, 0x1f, LED_BCR, &u32dat );
+
+    /* Set LED mode */
+    switch( mode )
+    {
+        case AIR_LED_MODE_DISABLE:
+            u32dat &= ~LED_BCR_EXT_CTRL;
+            u32dat &= ~LED_BCR_MODE_MASK;
+            u32dat |= LED_BCR_MODE_DISABLE;
+            break;
+        case AIR_LED_MODE_2LED_MODE0:
+            u32dat &= ~LED_BCR_EXT_CTRL;
+            u32dat &= ~LED_BCR_MODE_MASK;
+            u32dat |= LED_BCR_MODE_2LED;
+            break;
+        case AIR_LED_MODE_2LED_MODE1:
+            u32dat &= ~LED_BCR_EXT_CTRL;
+            u32dat &= ~LED_BCR_MODE_MASK;
+            u32dat |= LED_BCR_MODE_3LED_1;
+            break;
+        case AIR_LED_MODE_2LED_MODE2:
+            u32dat &= ~LED_BCR_EXT_CTRL;
+            u32dat &= ~LED_BCR_MODE_MASK;
+            u32dat |= LED_BCR_MODE_3LED_2;
+            break;
+        case AIR_LED_MODE_USER_DEFINE:
+            u32dat |= LED_BCR_EXT_CTRL;
+            break;
+    }
+
+    /* Write data to register */
+    aml_writePhyRegCL45( unit, port, 0x1f, LED_BCR, u32dat );
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME:air_led_getMode
+ * PURPOSE:
+ *      Get the LED processing mode for a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *
+ * OUTPUT:
+ *      ptr_mode        --  Setting mode of LED
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_OTHERS
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_led_getMode(
+    const UI32_T unit,
+    const UI8_T port,
+    AIR_LED_MODE_T *ptr_mode)
+{
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK( ( port >= AIR_MAX_NUM_OF_GIGA_PORTS ), AIR_E_BAD_PARAMETER );
+    AIR_CHECK_PTR( ptr_mode );
+
+    /* Read data from register */
+    aml_readPhyRegCL45( unit, port, 0x1f, LED_BCR, &u32dat );
+
+    /* Get LED mode */
+    if( LED_BCR_EXT_CTRL & u32dat )
+    {
+        (*ptr_mode ) = AIR_LED_MODE_USER_DEFINE;
+    }
+    else
+    {
+        switch( u32dat & LED_BCR_MODE_MASK )
+        {
+            case LED_BCR_MODE_DISABLE:
+                (*ptr_mode ) = AIR_LED_MODE_DISABLE;
+                break;
+            case LED_BCR_MODE_2LED:
+                (*ptr_mode ) = AIR_LED_MODE_2LED_MODE0;
+                break;
+            case LED_BCR_MODE_3LED_1:
+                (*ptr_mode ) = AIR_LED_MODE_2LED_MODE1;
+                break;
+            case LED_BCR_MODE_3LED_2:
+                (*ptr_mode ) = AIR_LED_MODE_2LED_MODE2;
+                break;
+            default:
+                return AIR_E_OTHERS;
+        }
+    }
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_led_setState
+ * PURPOSE:
+ *      Set the enable state for a specific LED.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      entity          --  Entity of LED
+ *      state           --  TRUE: Enable
+ *                          FALSE: Disable
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      The LED control register is shared with all port on AN8855.
+ *      Setting LED on any one port will also set to each other ports.
+ */
+AIR_ERROR_NO_T
+air_led_setState(
+    const UI32_T unit,
+    const UI8_T port,
+    const UI8_T entity,
+    const BOOL_T state)
+{
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK( ( port >= AIR_MAX_NUM_OF_GIGA_PORTS ), AIR_E_BAD_PARAMETER );
+    AIR_PARAM_CHK( ( entity >= MAX_NUM_LED_ENTITY ), AIR_E_BAD_PARAMETER );
+    AIR_PARAM_CHK( ( ( TRUE != state ) && ( FALSE != state ) ), AIR_E_BAD_PARAMETER );
+
+    /* Read data from register */
+    aml_readPhyRegCL45( unit, port, 0x1f, LED_ON_CTRL(entity), &u32dat );
+
+    /* Set LED state */
+    if( TRUE == state)
+    {
+        u32dat |= LED_ON_EN;
+    }
+    else
+    {
+        u32dat &= ~LED_ON_EN;
+    }
+
+    /* Write data to register */
+    aml_writePhyRegCL45( unit, port, 0x1f, LED_ON_CTRL(entity), u32dat );
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_led_getState
+ * PURPOSE:
+ *      Get the enable state for a specific LED.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      entity          --  Entity of LED
+ *
+ * OUTPUT:
+ *      ptr_state       --  TRUE: Enable
+ *                          FALSE: Disable
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_led_getState(
+    const UI32_T unit,
+    const UI8_T port,
+    const UI8_T entity,
+    BOOL_T *ptr_state)
+{
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK( ( port >= AIR_MAX_NUM_OF_GIGA_PORTS ), AIR_E_BAD_PARAMETER );
+    AIR_PARAM_CHK( ( entity >= MAX_NUM_LED_ENTITY ), AIR_E_BAD_PARAMETER );
+    AIR_CHECK_PTR( ptr_state );
+
+    /* Read data from register */
+    aml_readPhyRegCL45( unit, port, 0x1f, LED_ON_CTRL(entity), &u32dat );
+
+    /* Get LED state */
+    (*ptr_state) = ( LED_ON_EN & u32dat )?TRUE:FALSE;
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_led_setUsrDef
+ * PURPOSE:
+ *      Set the user-defined configuration of a speficic LED.
+ *      It only work when air_led_setState() set to AIR_LED_MODE_USER_DEFINE.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      entity          --  Entity of LED
+ *      polar           --  LOW: Active low
+ *                          HIGH: Active high
+ *      on_evt          --  AIR_LED_ON_EVT_T
+ *                          LED turns on if any event is detected
+ *      blk_evt         --  AIR_LED_BLK_EVT_T
+ *                          LED blinks blink if any event is detected
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      The LED control register is shared with all port on AN8855.
+ *      Setting LED on any one port will also set to each other ports.
+ */
+AIR_ERROR_NO_T
+air_led_setUsrDef(
+    const UI32_T unit,
+    const UI8_T port,
+    const UI8_T entity,
+    const BOOL_T polar,
+    const AIR_LED_ON_EVT_T on_evt,
+    const AIR_LED_BLK_EVT_T blk_evt)
+{
+    UI32_T on_reg = 0;
+    UI32_T blk_reg = 0;
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK( ( port >= AIR_MAX_NUM_OF_GIGA_PORTS ), AIR_E_BAD_PARAMETER );
+    AIR_PARAM_CHK( ( entity >= MAX_NUM_LED_ENTITY ), AIR_E_BAD_PARAMETER );
+    AIR_PARAM_CHK( ( ( HIGH != polar ) && ( LOW != polar ) ), AIR_E_BAD_PARAMETER );
+
+    /* Read data from register */
+    aml_readPhyRegCL45( unit, port, 0x1f, LED_ON_CTRL(entity), &on_reg );
+    aml_readPhyRegCL45( unit, port, 0x1f, LED_BLK_CTRL(entity), &blk_reg );
+
+    /* Set LED polarity */
+    if( HIGH == polar)
+    {
+        on_reg |= LED_ON_POL;
+    }
+    else
+    {
+        on_reg &= ~LED_ON_POL;
+    }
+
+    /* Set LED On Event */
+    on_reg &= ~LED_ON_EVT_MASK;
+    LED_SET_EVT(on_evt.link_1000m, on_reg, LED_ON_EVT_LINK_1000M);
+    LED_SET_EVT(on_evt.link_100m, on_reg, LED_ON_EVT_LINK_100M);
+    LED_SET_EVT(on_evt.link_10m, on_reg, LED_ON_EVT_LINK_10M);
+    LED_SET_EVT(on_evt.link_dn, on_reg, LED_ON_EVT_LINK_DN);
+    LED_SET_EVT(on_evt.fdx, on_reg, LED_ON_EVT_FDX);
+    LED_SET_EVT(on_evt.hdx, on_reg, LED_ON_EVT_HDX);
+    LED_SET_EVT(on_evt.force, on_reg, LED_ON_EVT_FORCE);
+
+    /* Set LED Blinking Event */
+    blk_reg &= ~LED_BLK_EVT_MASK;
+    LED_SET_EVT(blk_evt.tx_act_1000m, blk_reg, LED_BLK_EVT_1000M_TX_ACT);
+    LED_SET_EVT(blk_evt.rx_act_1000m, blk_reg, LED_BLK_EVT_1000M_RX_ACT);
+    LED_SET_EVT(blk_evt.tx_act_100m, blk_reg, LED_BLK_EVT_100M_TX_ACT);
+    LED_SET_EVT(blk_evt.rx_act_100m, blk_reg, LED_BLK_EVT_100M_RX_ACT);
+    LED_SET_EVT(blk_evt.tx_act_10m, blk_reg, LED_BLK_EVT_10M_TX_ACT);
+    LED_SET_EVT(blk_evt.rx_act_10m, blk_reg, LED_BLK_EVT_10M_RX_ACT);
+    LED_SET_EVT(blk_evt.cls, blk_reg, LED_BLK_EVT_CLS);
+    LED_SET_EVT(blk_evt.rx_crc, blk_reg, LED_BLK_EVT_RX_CRC);
+    LED_SET_EVT(blk_evt.rx_idle, blk_reg, LED_BLK_EVT_RX_IDL);
+    LED_SET_EVT(blk_evt.force, blk_reg, LED_BLK_EVT_FORCE);
+
+    /* Write data to register */
+    aml_writePhyRegCL45( unit, port, 0x1f, LED_ON_CTRL(entity), on_reg );
+    aml_writePhyRegCL45( unit, port, 0x1f, LED_BLK_CTRL(entity), blk_reg );
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_led_getUsrDef
+ * PURPOSE:
+ *      Get the user-defined configuration of a speficic LED.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      entity          --  Entity of LED
+ * OUTPUT:
+ *      ptr_polar       --  LOW: Active low
+ *                          HIGH: Active high
+ *      ptr_on_evt      --  AIR_LED_ON_EVT_T
+ *                          LED turns on if any event is detected
+ *      ptr_blk_evt     --  AIR_LED_BLK_EVT_T
+ *                          LED blinks if any event is detected
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_led_getUsrDef(
+    const UI32_T unit,
+    const UI8_T port,
+    const UI8_T entity,
+    BOOL_T *ptr_polar,
+    AIR_LED_ON_EVT_T *ptr_on_evt,
+    AIR_LED_BLK_EVT_T *ptr_blk_evt)
+{
+    UI32_T on_reg = 0;
+    UI32_T blk_reg = 0;
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK( ( port >= AIR_MAX_NUM_OF_GIGA_PORTS ), AIR_E_BAD_PARAMETER );
+    AIR_PARAM_CHK( ( entity >= MAX_NUM_LED_ENTITY ), AIR_E_BAD_PARAMETER );
+    AIR_CHECK_PTR( ptr_polar );
+    AIR_CHECK_PTR( ptr_on_evt );
+    AIR_CHECK_PTR( ptr_blk_evt );
+
+    /* Read data from register */
+    aml_readPhyRegCL45( unit, port, 0x1f, LED_ON_CTRL(entity), &on_reg );
+    aml_readPhyRegCL45( unit, port, 0x1f, LED_BLK_CTRL(entity), &blk_reg );
+
+    /* Get LED polarity */
+    (*ptr_polar) = ( on_reg & LED_ON_POL)?TRUE:FALSE;
+
+    /* Get LED On Event */
+    ptr_on_evt ->link_1000m = (on_reg & LED_ON_EVT_LINK_1000M)?TRUE:FALSE;
+    ptr_on_evt ->link_100m = (on_reg & LED_ON_EVT_LINK_100M)?TRUE:FALSE;
+    ptr_on_evt ->link_10m = (on_reg & LED_ON_EVT_LINK_10M)?TRUE:FALSE;
+    ptr_on_evt ->link_dn = (on_reg & LED_ON_EVT_LINK_DN)?TRUE:FALSE;
+    ptr_on_evt ->fdx = (on_reg & LED_ON_EVT_FDX)?TRUE:FALSE;
+    ptr_on_evt ->hdx = (on_reg & LED_ON_EVT_HDX)?TRUE:FALSE;
+    ptr_on_evt ->force = (on_reg & LED_ON_EVT_FORCE)?TRUE:FALSE;
+
+    /* Set LED Blinking Event */
+    ptr_blk_evt ->tx_act_1000m = (blk_reg & LED_BLK_EVT_1000M_TX_ACT)?TRUE:FALSE;
+    ptr_blk_evt ->rx_act_1000m = (blk_reg & LED_BLK_EVT_1000M_RX_ACT)?TRUE:FALSE;
+    ptr_blk_evt ->tx_act_100m = (blk_reg & LED_BLK_EVT_100M_TX_ACT)?TRUE:FALSE;
+    ptr_blk_evt ->rx_act_100m = (blk_reg & LED_BLK_EVT_100M_RX_ACT)?TRUE:FALSE;
+    ptr_blk_evt ->tx_act_10m = (blk_reg & LED_BLK_EVT_10M_TX_ACT)?TRUE:FALSE;
+    ptr_blk_evt ->rx_act_10m = (blk_reg & LED_BLK_EVT_10M_RX_ACT)?TRUE:FALSE;
+    ptr_blk_evt ->cls = (blk_reg & LED_BLK_EVT_CLS)?TRUE:FALSE;
+    ptr_blk_evt ->rx_crc = (blk_reg & LED_BLK_EVT_RX_CRC)?TRUE:FALSE;
+    ptr_blk_evt ->rx_idle = (blk_reg & LED_BLK_EVT_RX_IDL)?TRUE:FALSE;
+    ptr_blk_evt ->force = (blk_reg & LED_BLK_EVT_FORCE)?TRUE:FALSE;
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_led_setBlkTime
+ * PURPOSE:
+ *      Set the Blinking duration of a speficic LED.
+ *      It only work when air_led_setState() set to AIR_LED_MODE_USER_DEFINE.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      dur             --  Blink duration
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      The LED control register is shared with all port on AN8855.
+ *      Setting LED on any one port will also set to each other ports.
+ */
+AIR_ERROR_NO_T
+air_led_setBlkTime(
+    const UI32_T unit,
+    const UI8_T port,
+    const AIR_LED_BLK_DUR_T dur)
+{
+    UI32_T on_dur = 0;
+    UI32_T blk_dur = 0;
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK( ( port >= AIR_MAX_NUM_OF_GIGA_PORTS ), AIR_E_BAD_PARAMETER );
+    AIR_PARAM_CHK( ( dur >= AIR_LED_BLK_DUR_LAST ), AIR_E_BAD_PARAMETER );
+
+    /* Read data from register */
+    aml_readPhyRegCL45( unit, port, 0x1f, LED_ON_DUR, &on_dur );
+    aml_readPhyRegCL45( unit, port, 0x1f, LED_BLK_DUR, &blk_dur );
+
+    /* Set LED Blinking duration */
+    /* Setting unit = 32ms, register unit = 32.768 us */
+    blk_dur = UNIT_LED_BLINK_DURATION << dur;
+    /* On duration should be half of blinking duration */
+    on_dur  = blk_dur >> 1;
+
+    /* Write data to register */
+    aml_writePhyRegCL45( unit, port, 0x1f, LED_ON_DUR, on_dur );
+    aml_writePhyRegCL45( unit, port, 0x1f, LED_BLK_DUR, blk_dur );
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_led_getBlkTime
+ * PURPOSE:
+ *      Get the Blinking duration of a speficic LED.
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *
+ * OUTPUT:
+ *      ptr_dur         --  Blink duration
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_led_getBlkTime(
+    const UI32_T unit,
+    const UI8_T port,
+    AIR_LED_BLK_DUR_T *ptr_dur)
+{
+    UI32_T blk_dur = 0;
+    UI32_T u32dat = 0;
+    I8_T i = 0;
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK( ( port >= AIR_MAX_NUM_OF_GIGA_PORTS ), AIR_E_BAD_PARAMETER );
+    AIR_CHECK_PTR( ptr_dur );
+
+    /* Read data from register */
+    aml_readPhyRegCL45( unit, port, 0x1f, LED_BLK_DUR, &blk_dur );
+
+    /* Get LED Blinking duration */
+    u32dat = blk_dur / UNIT_LED_BLINK_DURATION;
+    for(i = AIR_LED_BLK_DUR_LAST; i>=0; i--)
+    {
+        if( (u32dat >> i) & 0x1 )
+        {
+            break;
+        }
+    }
+    (*ptr_dur) = i;
+
+    return AIR_E_OK;
+}
+
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_mib.c b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_mib.c
new file mode 100644
index 0000000..67088d1
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_mib.c
@@ -0,0 +1,366 @@
+/* FILE NAME: air_mib.c
+ * PURPOSE:
+ *      Define the MIB counter function in AIR SDK.
+ *
+ * NOTES:
+ *      None
+ */
+
+/* INCLUDE FILE DECLARATIONS
+*/
+#include "air.h"
+
+/* NAMING CONSTANT DECLARATIONS
+*/
+
+/* MACRO FUNCTION DECLARATIONS
+*/
+#define MIB_READ_DATA(unit, port, mib, reg, val)    \
+    do{                                             \
+        aml_readReg(unit, MIB_##reg(port), &val );  \
+        mib -> reg = val;                           \
+    }while(0)
+
+
+
+/* DATA TYPE DECLARATIONS
+*/
+
+/* GLOBAL VARIABLE DECLARATIONS
+*/
+
+/* LOCAL SUBPROGRAM DECLARATIONS
+*/
+
+/* STATIC VARIABLE DECLARATIONS
+*/
+
+/* LOCAL SUBPROGRAM BODIES
+*/
+
+/* EXPORTED SUBPROGRAM BODIES
+*/
+/* FUNCTION NAME: air_mib_setEnable
+ * PURPOSE:
+ *      Enable or Disable mib count fucntion.
+ *
+ * INPUT:
+ *      unit           --   Device ID
+ *      mib_en         --   enable or disable mib_en
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_mib_setEnable(
+    const UI32_T unit,
+    const BOOL_T mib_en)
+{
+    UI32_T u32dat = 0;
+    AIR_PARAM_CHK(((TRUE != mib_en) && (FALSE != mib_en)), AIR_E_BAD_PARAMETER);
+
+    /* Write data to register */
+    aml_readReg(unit, MIB_CCR, &u32dat);
+    if(mib_en)
+    {
+        u32dat |= MIB_CCR_MIB_ENABLE;
+    }
+    else
+    {
+        u32dat &= ~MIB_CCR_MIB_ENABLE;
+    }
+    aml_writeReg(unit, MIB_CCR, u32dat);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_mib_getEnable
+ * PURPOSE:
+ *      Enable or Disable mib count fucntion.
+ *
+ * INPUT:
+ *      unit           --   Device ID
+ *
+ * OUTPUT:
+ *      mib_en         --   enable or disable mib_en
+
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_mib_getEnable(
+    const UI32_T unit,
+    BOOL_T *mib_en)
+{
+    UI32_T u32dat = 0;
+    /* Mistake proofing */
+    AIR_CHECK_PTR(mib_en);
+
+
+    /* Write data to register */
+    aml_readReg(unit, MIB_CCR, &u32dat);
+    (*mib_en) = BITS_OFF_R(u32dat, MIB_CCR_MIB_ENABLE_OFFSET, MIB_CCR_MIB_ENABLE_LENGTH);
+
+
+    return AIR_E_OK;
+}
+/* FUNCTION NAME: air_mib_clear
+ * PURPOSE:
+ *      Clear all counters of all MIB counters.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_mib_clear(
+    const UI32_T unit)
+{
+    UI32_T u32dat = 0;
+
+    /* Write data to register */
+    aml_readReg(unit, MIB_CCR, &u32dat);
+    /* Restart MIB counter */
+    u32dat &= ~MIB_CCR_MIB_ENABLE;
+    aml_writeReg(unit, MIB_CCR, u32dat);
+    u32dat |= MIB_CCR_MIB_ENABLE;
+    aml_writeReg(unit, MIB_CCR, u32dat);
+
+    return AIR_E_OK;
+}
+
+/* EXPORTED SUBPROGRAM BODIES
+*/
+/* FUNCTION NAME: air_mib_clear_by_port
+ * PURPOSE:
+ *      Clear all counters of all MIB counters.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  clear port number
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_mib_clear_by_port(
+    const UI32_T unit,
+    const UI32_T port)
+{
+    /* Mistake proofing */
+    AIR_PARAM_CHK(port > AIR_MAX_NUM_OF_PORTS, AIR_E_BAD_PARAMETER);
+
+    /* Write data to register */
+    aml_writeReg(unit, MIB_PCLR, 1 << port);
+    aml_writeReg(unit, MIB_PCLR, 0);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_mib_get
+ * PURPOSE:
+ *      Get the structure of MIB counter for a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *
+ * OUTPUT:
+ *      ptr_rx_mib      --  MIB Counters of Rx Event
+ *      ptr_tx_mib      --  MIB Counters of Tx Event
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_mib_get(
+    const UI32_T unit,
+    const UI32_T port,
+    AIR_MIB_CNT_RX_T *ptr_rx_mib,
+    AIR_MIB_CNT_TX_T *ptr_tx_mib)
+{
+    UI32_T u32dat = 0, u32dat_h = 0;
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_rx_mib);
+    AIR_CHECK_PTR(ptr_tx_mib);
+
+    /* Read data from register */
+
+    /* Read Tx MIB Counter */
+    MIB_READ_DATA(unit, port, ptr_tx_mib, TDPC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_tx_mib, TCRC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_tx_mib, TUPC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_tx_mib, TMPC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_tx_mib, TBPC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_tx_mib, TCEC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_tx_mib, TSCEC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_tx_mib, TMCEC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_tx_mib, TDEC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_tx_mib, TLCEC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_tx_mib, TXCEC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_tx_mib, TPPC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_tx_mib, TL64PC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_tx_mib, TL65PC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_tx_mib, TL128PC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_tx_mib, TL256PC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_tx_mib, TL512PC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_tx_mib, TL1024PC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_tx_mib, TL1519PC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_tx_mib, TODPC, u32dat);
+    aml_readReg(unit, MIB_TOCL(port), &u32dat);
+    aml_readReg(unit, MIB_TOCH(port), &u32dat_h);
+    ptr_tx_mib->TOC = u32dat | ((UI64_T)(u32dat_h) << 32);
+    u32dat = 0;
+    u32dat_h = 0;
+    aml_readReg(unit, MIB_TOCL2(port), &u32dat);
+    aml_readReg(unit, MIB_TOCH2(port), &u32dat_h);
+    ptr_tx_mib->TOC2 = u32dat | ((UI64_T)(u32dat_h) << 32);
+
+    /* Read Rx MIB Counter */
+    MIB_READ_DATA(unit, port, ptr_rx_mib, RDPC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_rx_mib, RFPC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_rx_mib, RUPC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_rx_mib, RMPC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_rx_mib, RBPC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_rx_mib, RAEPC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_rx_mib, RCEPC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_rx_mib, RUSPC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_rx_mib, RFEPC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_rx_mib, ROSPC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_rx_mib, RJEPC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_rx_mib, RPPC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_rx_mib, RL64PC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_rx_mib, RL65PC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_rx_mib, RL128PC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_rx_mib, RL256PC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_rx_mib, RL512PC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_rx_mib, RL1024PC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_rx_mib, RL1519PC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_rx_mib, RCDPC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_rx_mib, RIDPC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_rx_mib, RADPC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_rx_mib, FCDPC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_rx_mib, WRDPC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_rx_mib, MRDPC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_rx_mib, SFSPC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_rx_mib, SFTPC, u32dat);
+    MIB_READ_DATA(unit, port, ptr_rx_mib, RXC_DPC, u32dat);
+    u32dat = 0;
+    u32dat_h = 0;
+    aml_readReg(unit, MIB_ROCL(port), &u32dat);
+    aml_readReg(unit, MIB_ROCH(port), &u32dat_h);
+    ptr_rx_mib->ROC = u32dat | ((UI64_T)(u32dat_h) << 32);
+    u32dat = 0;
+    u32dat_h = 0;
+    aml_readReg(unit, MIB_ROCL2(port), &u32dat);
+    aml_readReg(unit, MIB_ROCH2(port), &u32dat_h);
+    ptr_rx_mib->ROC2 = u32dat | ((UI64_T)(u32dat_h) << 32);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_mib_clearAclEvent
+ * PURPOSE:
+ *      Clear all counters of ACL event
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_mib_clearAclEvent(
+    const UI32_T unit)
+{
+    UI32_T u32dat = 0;
+
+    aml_readReg(unit, ACL_MIB_CNT_CFG, &u32dat);
+    u32dat |= CSR_ACL_MIB_CLEAR;
+    aml_writeReg(unit, ACL_MIB_CNT_CFG, u32dat);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_mib_getAclEvent
+ * PURPOSE:
+ *      Get the total number of ACL event occurred.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      idx             --  Index of ACL event
+ *
+ * OUTPUT:
+ *      ptr_cnt         --  The total number of ACL event occured
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_mib_getAclEvent(
+    const UI32_T unit,
+    const UI32_T idx,
+    UI32_T *ptr_cnt)
+{
+    UI32_T reg = 0;
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK((idx >= AIR_MIB_MAX_ACL_EVENT_NUM), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_cnt);
+
+    aml_readReg(unit, ACL_MIB_CNT_CFG, &u32dat);
+    u32dat = u32dat | (idx << CSR_ACL_MIB_SEL_OFFSET);
+    aml_writeReg(unit, ACL_MIB_CNT_CFG, u32dat);
+
+    aml_readReg(unit, ACL_MIB_CNT, &u32dat);
+    (*ptr_cnt) = u32dat;
+
+    return AIR_E_OK;
+}
+
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_mirror.c b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_mirror.c
new file mode 100644
index 0000000..00a72e4
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_mirror.c
@@ -0,0 +1,391 @@
+/* FILE NAME: air_mirror.c
+ * PURPOSE:
+ *      Define the port mirror function in ECNT SDK.
+ *
+ * NOTES:
+ *      None
+ */
+
+/* INCLUDE FILE DECLARATIONS
+*/
+#include "air.h"
+
+/* NAMING CONSTANT DECLARATIONS
+*/
+
+/* MACRO FUNCTION DECLARATIONS
+*/
+
+/* DATA TYPE DECLARATIONS
+*/
+
+/* GLOBAL VARIABLE DECLARATIONS
+*/
+
+/* LOCAL SUBPROGRAM DECLARATIONS
+*/
+
+/* STATIC VARIABLE DECLARATIONS
+*/
+
+/* LOCAL SUBPROGRAM BODIES
+*/
+/* FUNCTION NAME:   air_mir_addSession
+ * PURPOSE:
+ *      This API is used to add or set a mirror session.
+ * INPUT:
+ *      unit                 -- Device unit number
+ *      session_id           -- Session id
+ *      ptr_session          -- Session information
+ *                              AIR_MIR_SESSION_T
+ * OUTPUT:
+ *      None
+ * RETURN:
+ *      AIR_E_OK             -- Operation success.
+ *      AIR_E_BAD_PARAMETER  -- Parameter is wrong.
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_mir_addSession(
+    const UI32_T    unit,
+    const UI32_T    session_id,
+    const AIR_MIR_SESSION_T   *ptr_session)
+{
+    UI32_T regMIR = 0, regPCR = 0;
+    UI32_T dst_mac_port = 0, src_mac_port = 0;
+    BOOL_T enable=FALSE, tx_tag_enable=FALSE;
+    
+    /* parameter sanity check */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((session_id >= AIR_MAX_MIRROR_SESSION), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_session);
+    AIR_PARAM_CHK((ptr_session->src_port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((ptr_session->dst_port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((ptr_session->dst_port == ptr_session->src_port), AIR_E_BAD_PARAMETER);
+
+    src_mac_port = ptr_session->src_port;
+    dst_mac_port = ptr_session->dst_port;
+    /* Read MIR */
+    aml_readReg(unit, MIR, &regMIR);
+
+    /* Set mirroring port */
+    regMIR &= ~ BITS_RANGE(MIR_MIRROR_PORT_OFFSER(session_id), MIR_MIRROR_PORT_LEN);
+    regMIR |= BITS_OFF_L(dst_mac_port, MIR_MIRROR_PORT_OFFSER(session_id), MIR_MIRROR_PORT_LEN);
+
+    /* Set mirroring port tx tag state */
+    if(ptr_session->flags & AIR_MIR_SESSION_FLAGS_TX_TAG_OBEY_CFG)
+    {
+        tx_tag_enable = TRUE;
+    }
+    regMIR &= ~ BITS_RANGE(MIR_MIRROR_TAG_TX_EN_OFFSER(session_id), MIR_MIRROR_TAG_TX_EN_LEN);
+    regMIR |= BITS_OFF_L(tx_tag_enable, MIR_MIRROR_TAG_TX_EN_OFFSER(session_id), MIR_MIRROR_TAG_TX_EN_LEN);
+
+    /* Set mirroring port state */
+    if(ptr_session->flags & AIR_MIR_SESSION_FLAGS_ENABLE)
+    {
+        enable = TRUE;
+    }
+    regMIR &= ~ BITS_RANGE(MIR_MIRROR_EN_OFFSER(session_id), MIR_MIRROR_EN_LEN);
+    regMIR |= BITS_OFF_L(enable, MIR_MIRROR_EN_OFFSER(session_id), MIR_MIRROR_EN_LEN);
+
+    /* Write MIR */
+    aml_writeReg(unit, MIR, regMIR);
+
+    /* Read PCR */
+    aml_readReg(unit, PCR(src_mac_port), &regPCR);
+
+    /* Set mirroring source port */
+    regPCR &= ~ BIT(PCR_PORT_TX_MIR_OFFT + session_id);
+    regPCR &= ~ BIT(PCR_PORT_RX_MIR_OFFT + session_id);
+    if(ptr_session->flags & AIR_MIR_SESSION_FLAGS_DIR_TX)
+    {
+        regPCR |= BIT(PCR_PORT_TX_MIR_OFFT + session_id);
+    }
+
+    if(ptr_session->flags & AIR_MIR_SESSION_FLAGS_DIR_RX)
+    {
+        regPCR |= BIT(PCR_PORT_RX_MIR_OFFT + session_id);
+    }
+
+    /* Write PCR */
+    aml_writeReg(unit, PCR(src_mac_port), regPCR);
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME:   air_mir_delSession
+ * PURPOSE:
+ *      This API is used to delete a mirror session.
+ * INPUT:
+ *      unit                 -- Device unit number
+ *      session_id           -- Session id
+ * OUTPUT:
+ *      None
+ * RETURN:
+ *      AIR_E_OK             -- Operation success.
+ *      AIR_E_BAD_PARAMETER  -- Parameter is wrong.
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_mir_delSession(
+    const UI32_T    unit,
+    const UI32_T    session_id)
+{
+    UI32_T regMIR = 0;
+
+    /* parameter sanity check */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((session_id >= AIR_MAX_MIRROR_SESSION), AIR_E_BAD_PARAMETER);
+
+    /* Read MIR */
+    aml_readReg(unit, MIR, &regMIR);
+
+    /* Set mirroring port */
+    regMIR &= ~ BITS_RANGE(MIR_MIRROR_PORT_OFFSER(session_id), MIR_MIRROR_PORT_LEN);
+    regMIR |= BITS_OFF_L(AIR_DST_DEFAULT_PORT, MIR_MIRROR_PORT_OFFSER(session_id), MIR_MIRROR_PORT_LEN);
+    /* Set mirroring port tx tag state */
+    regMIR &= ~ BITS_RANGE(MIR_MIRROR_TAG_TX_EN_OFFSER(session_id), MIR_MIRROR_TAG_TX_EN_LEN);
+    /* Set mirroring port state */
+    regMIR &= ~ BITS_RANGE(MIR_MIRROR_EN_OFFSER(session_id), MIR_MIRROR_EN_LEN);
+
+    /* Write MIR */
+    aml_writeReg(unit, MIR, regMIR);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME:   air_mir_getSession
+ * PURPOSE:
+ *      This API is used to get mirror session information.
+ * INPUT:
+ *      unit                 -- Device unit number
+ *      session_id           -- Session id
+ * OUTPUT:
+ *      ptr_session          -- The information of the session to be
+ *                              obtained
+ *                              AIR_MIR_SESSION_T
+ * RETURN:
+ *      AIR_E_OK             -- Operation success.
+ *      AIR_E_BAD_PARAMETER  -- Parameter is wrong.
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_mir_getSession(
+    const UI32_T        unit,
+    const UI32_T        session_id,
+    AIR_MIR_SESSION_T   *ptr_session)
+{
+    UI32_T regMIR = 0;
+    UI32_T dst_mac_port = 0;
+    BOOL_T enable = FALSE, tx_tag_enable = FALSE;
+
+    /* parameter sanity check */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((session_id >= AIR_MAX_MIRROR_SESSION), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_session);
+
+    /* Read MIR */
+    aml_readReg(unit, MIR, &regMIR);
+    /* Get mirroring port */
+    dst_mac_port = BITS_OFF_R(regMIR, MIR_MIRROR_PORT_OFFSER(session_id), MIR_MIRROR_PORT_LEN);
+    /* Get mirroring port state */
+    enable = BITS_OFF_R(regMIR, MIR_MIRROR_EN_OFFSER(session_id), MIR_MIRROR_EN_LEN);
+    /* Get mirroring tx tag state*/
+    tx_tag_enable = BITS_OFF_R(regMIR, MIR_MIRROR_TAG_TX_EN_OFFSER(session_id), MIR_MIRROR_TAG_TX_EN_LEN);
+    ptr_session->dst_port = dst_mac_port;
+    if(enable)
+    {
+        ptr_session->flags |= AIR_MIR_SESSION_FLAGS_ENABLE;
+    }
+    if(tx_tag_enable)
+    {
+        ptr_session->flags |= AIR_MIR_SESSION_FLAGS_TX_TAG_OBEY_CFG;
+    }
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME:   air_mir_setSessionAdminMode
+ * PURPOSE:
+ *      This API is used to set mirror session state.
+ * INPUT:
+ *      unit                 -- Device unit number
+ *      session_id           -- Session id
+ *      enable               -- State of session
+ * OUTPUT:
+ *      None
+ * RETURN:
+ *      AIR_E_OK             -- Operation success.
+ *      AIR_E_BAD_PARAMETER  -- Parameter is wrong.
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_mir_setSessionAdminMode(
+    const UI32_T    unit,
+    const UI32_T    session_id,
+    const BOOL_T    enable)
+{
+    UI32_T regMIR = 0;
+
+    /* parameter sanity check */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((session_id >= AIR_MAX_MIRROR_SESSION), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((enable != TRUE && enable != FALSE), AIR_E_BAD_PARAMETER);
+
+    /* Read MIR */
+    aml_readReg(unit, MIR, &regMIR);
+
+    /* Set mirroring port state */
+    regMIR &= ~ BITS_RANGE(MIR_MIRROR_EN_OFFSER(session_id), MIR_MIRROR_EN_LEN);
+    regMIR |= BITS_OFF_L(enable, MIR_MIRROR_EN_OFFSER(session_id), MIR_MIRROR_EN_LEN);
+
+    /* Write MIR */
+    aml_writeReg(unit, MIR, regMIR);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME:   air_mir_getSessionAdminMode
+ * PURPOSE:
+ *      This API is used to get mirror session state.
+ * INPUT:
+ *      unit                 -- Device unit number
+ *      session_id           -- mirror session id
+ * OUTPUT:
+ *      ptr_enable           -- State of session
+ * RETURN:
+ *      AIR_E_OK             -- Operation success.
+ *      AIR_E_BAD_PARAMETER  -- Parameter is wrong.
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_mir_getSessionAdminMode(
+    const UI32_T    unit,
+    const UI32_T    session_id,
+    BOOL_T          *ptr_enable)
+{
+    UI32_T regMIR = 0;
+    BOOL_T enable = FALSE;
+
+    /* parameter sanity check */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((session_id >= AIR_MAX_MIRROR_SESSION), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_enable);
+
+    /* Read MIR */
+    aml_readReg(unit, MIR, &regMIR);
+
+    /* Get mirroring port state */
+    enable = BITS_OFF_R(regMIR, MIR_MIRROR_EN_OFFSER(session_id), MIR_MIRROR_EN_LEN);
+
+    *ptr_enable = enable;
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME:   air_mir_setMirrorPort
+ * PURPOSE:
+ *      This API is used to set mirror port mirroring type.
+ * INPUT:
+ *      unit                 -- Device unit number
+ *      session_id           -- Session id
+ *      ptr_session          -- Session information
+ *                              AIR_MIR_SESSION_T
+ * OUTPUT:
+ *      None
+ * RETURN:
+ *      AIR_E_OK             -- Operation success.
+ *      AIR_E_BAD_PARAMETER  -- Parameter is wrong.
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_mir_setMirrorPort(
+    const UI32_T            unit,
+    const UI32_T            session_id,
+    const AIR_MIR_SESSION_T *ptr_session)
+{
+    UI32_T regPCR = 0;
+    UI32_T src_mac_port = 0;
+
+    /* parameter sanity check */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((session_id >= AIR_MAX_MIRROR_SESSION), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_session);
+    AIR_PARAM_CHK((ptr_session->src_port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+
+    src_mac_port = ptr_session->src_port;
+    /* Read data from register */
+    aml_readReg(unit, PCR(src_mac_port), &regPCR);
+
+    regPCR &= ~ BIT(PCR_PORT_TX_MIR_OFFT + session_id);
+    regPCR &= ~ BIT(PCR_PORT_RX_MIR_OFFT + session_id);
+
+    if(ptr_session->flags & AIR_MIR_SESSION_FLAGS_DIR_TX)
+    {
+        regPCR |= BIT(PCR_PORT_TX_MIR_OFFT + session_id);
+    }
+
+    if(ptr_session->flags & AIR_MIR_SESSION_FLAGS_DIR_RX)
+    {
+        regPCR |= BIT(PCR_PORT_RX_MIR_OFFT + session_id);
+    }
+    /* Write data to register */
+    aml_writeReg(unit, PCR(src_mac_port), regPCR);
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME:   air_mir_getMirrorPort
+ * PURPOSE:
+ *      This API is used to get mirror port mirroring type.
+ * INPUT:
+ *      unit                 -- Device unit number
+ *      session_id           -- Session id
+ * OUTPUT:
+ *      ptr_session          -- The information of this session to be
+ *                              obtained.
+ *                              AIR_MIR_SESSION_T
+ * RETURN:
+ *      AIR_E_OK             -- Operation success.
+ *      AIR_E_BAD_PARAMETER  -- Parameter is wrong.
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_mir_getMirrorPort(
+    const UI32_T        unit,
+    const UI32_T        session_id,
+    AIR_MIR_SESSION_T   *ptr_session)
+{
+    UI32_T regPCR = 0;
+    UI32_T src_mac_port = 0;
+
+    /* parameter sanity check */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((session_id >= AIR_MAX_MIRROR_SESSION), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_session);
+    AIR_PARAM_CHK((ptr_session->src_port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    
+    src_mac_port = ptr_session->src_port;
+    /* Read data from register */
+    aml_readReg(unit, PCR(src_mac_port), &regPCR);
+
+    if(regPCR & BIT(PCR_PORT_TX_MIR_OFFT + session_id))
+    {
+        ptr_session->flags |= AIR_MIR_SESSION_FLAGS_DIR_TX;
+    }
+
+    if(regPCR & BIT(PCR_PORT_RX_MIR_OFFT + session_id))
+    {
+        ptr_session->flags |= AIR_MIR_SESSION_FLAGS_DIR_RX;
+    }
+
+    return AIR_E_OK;
+}
+
+
+
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_port.c b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_port.c
new file mode 100644
index 0000000..09dcef1
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_port.c
@@ -0,0 +1,2456 @@
+/* FILE NAME: air_port.c
+ * PURPOSE:
+ *      Define the port function in AIR SDK.
+ *
+ * NOTES:
+ *      None
+ */
+
+/* INCLUDE FILE DECLARATIONS
+ */
+#include "air.h"
+#include "air_port.h"
+
+/* NAMING CONSTANT DECLARATIONS
+ */
+
+/* MACRO FUNCTION DECLARATIONS
+ */
+#define AIR_SET_REG_BIT(cond, reg, bit)    \
+    do{                                     \
+        if(TRUE == (cond))                  \
+        {                                   \
+            (reg) |= (bit);                 \
+        }                                   \
+        else                                \
+        {                                   \
+            (reg) &= ~(bit);                \
+        }                                   \
+    }while(0)
+
+/* DATA TYPE DECLARATIONS
+ */
+
+/* GLOBAL VARIABLE DECLARATIONS
+ */
+
+/* LOCAL SUBPROGRAM DECLARATIONS
+ */
+
+/* STATIC VARIABLE DECLARATIONS
+ */
+
+/* LOCAL SUBPROGRAM BODIES
+ */
+
+/* FUNCTION NAME: air_port_setAnMode
+ * PURPOSE:
+ *      Set the auto-negotiation mode for a specific port.(Auto or Forced)
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      state           --  FALSE:Disable
+ *                          TRUE: Enable
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_setAnMode(
+    const UI32_T unit,
+    const UI32_T port,
+    const BOOL_T state)
+{
+    UI32_T u32CtrlReg = 0;
+    UI32_T u32Pmcr = 0;
+    UI32_T i = 0;
+    UI32_T mii_port = 0;
+    AIR_ERROR_NO_T ret = AIR_E_OK;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK(((TRUE != state) && (FALSE != state)), AIR_E_BAD_PARAMETER);
+
+    /* Read data from phy register */
+    aml_readPhyReg(unit, port, 0x0, &u32CtrlReg);
+
+    if(TRUE == state)
+    {
+        /* Enable AN mode of PHY port */
+        u32CtrlReg |= BIT(12);
+    }
+    else
+    {
+        /* Disable AN mode of PHY port */
+        u32CtrlReg &= ~BIT(12);
+    }
+
+    /* Restart AN */
+    u32CtrlReg |= BIT(9);
+
+    /* Write data to register */
+    aml_writePhyReg(unit, port, 0x00, u32CtrlReg);
+
+    return ret;
+}
+
+/* FUNCTION NAME: air_port_getAnMode
+ * PURPOSE:
+ *      Get the auto-negotiation mode for a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *
+ * OUTPUT:
+ *      state           --  FALSE:Disable
+ *                          TRUE: Enable
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_getAnMode(
+    const UI32_T unit,
+    const UI32_T port,
+    BOOL_T *ptr_state)
+{
+    UI32_T u32dat = 0;
+    UI32_T i = 0, mii_port = 0;
+    AIR_ERROR_NO_T ret = AIR_E_OK;
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_state);
+
+    /* Read data from register */
+    aml_readPhyReg(unit, port, 0x0, &u32dat);
+    (*ptr_state) = BITS_OFF_R(u32dat, 12, 1);
+
+    return ret;
+}
+
+/* FUNCTION NAME: air_port_setLocalAdvAbility
+ * PURPOSE:
+ *      Set the auto-negotiation advertisement for a
+ *      specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      adv             --  AN advertisement setting
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_setLocalAdvAbility(
+    const UI32_T unit,
+    const UI32_T port,
+    const AIR_AN_ADV_T adv)
+{
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
+
+    /* Read AN Advertisement from register */
+    aml_readPhyReg(unit, port, PHY_AN_ADV, &u32dat);
+
+    /* Modify AN Advertisement */
+    AIR_SET_REG_BIT(adv.advCap10HDX, u32dat, AN_ADV_CAP_10_HDX);
+    AIR_SET_REG_BIT(adv.advCap10FDX, u32dat, AN_ADV_CAP_10_FDX);
+    AIR_SET_REG_BIT(adv.advCap100HDX, u32dat, AN_ADV_CAP_100_HDX);
+    AIR_SET_REG_BIT(adv.advCap100FDX, u32dat, AN_ADV_CAP_100_FDX);
+    AIR_SET_REG_BIT(adv.advPause, u32dat, AN_ADV_CAP_PAUSE);
+
+    /* Write AN Advertisement to register */
+    aml_writePhyReg(unit, port, PHY_AN_ADV, u32dat);
+
+    /* Write 1000BASE-T duplex capbility to  register */
+    aml_readPhyReg(unit, port, PHY_CR1G, &u32dat);
+    AIR_SET_REG_BIT(adv.advCap1000FDX, u32dat, CR1G_ADV_CAP1000_FDX);
+    aml_writePhyReg(unit, port, PHY_CR1G, u32dat);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_port_getLocalAdvAbility
+ * PURPOSE:
+ *      Get the auto-negotiation advertisement for a
+ *      specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *
+ * OUTPUT:
+ *      ptr_adv         --  AN advertisement setting
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_getLocalAdvAbility(
+    const UI32_T unit,
+    const UI32_T port,
+    AIR_AN_ADV_T *ptr_adv)
+{
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
+    /* Mistake proofing checking */
+    AIR_CHECK_PTR(ptr_adv);
+
+    /* Read AN Advertisement from register */
+    aml_readPhyReg(unit, port, PHY_AN_ADV, &u32dat);
+    ptr_adv ->advCap10HDX = (u32dat & AN_ADV_CAP_10_HDX)?TRUE:FALSE;
+    ptr_adv ->advCap10FDX = (u32dat & AN_ADV_CAP_10_FDX)?TRUE:FALSE;
+    ptr_adv ->advCap100HDX = (u32dat & AN_ADV_CAP_100_HDX)?TRUE:FALSE;
+    ptr_adv ->advCap100FDX = (u32dat & AN_ADV_CAP_100_FDX)?TRUE:FALSE;
+    ptr_adv ->advPause = (u32dat & AN_ADV_CAP_PAUSE)?TRUE:FALSE;
+
+    /* Read 1000BASE-T duplex capalibity from register */
+    aml_readPhyReg(unit, port, PHY_CR1G, &u32dat);
+    ptr_adv ->advCap1000FDX = (u32dat & CR1G_ADV_CAP1000_FDX)?TRUE:FALSE;
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_port_getRemoteAdvAbility
+ * PURPOSE:
+ *      Get the auto-negotiation remote advertisement for a
+ *      specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *
+ * OUTPUT:
+ *      ptr_lp_adv      --  AN advertisement of link partner
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_getRemoteAdvAbility(
+    const UI32_T unit,
+    const UI32_T port,
+    AIR_AN_ADV_T *ptr_lp_adv)
+{
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_lp_adv);
+
+    /* Read AN LP Advertisement from register */
+    aml_readPhyReg(unit, port, PHY_AN_LP_ADV, &u32dat);
+    ptr_lp_adv ->advCap10HDX = (u32dat & AN_LP_CAP_10_HDX)?TRUE:FALSE;
+    ptr_lp_adv ->advCap10FDX = (u32dat & AN_LP_CAP_10_FDX)?TRUE:FALSE;
+    ptr_lp_adv ->advCap100HDX = (u32dat & AN_LP_CAP_100_HDX)?TRUE:FALSE;
+    ptr_lp_adv ->advCap100FDX = (u32dat & AN_LP_CAP_100_FDX)?TRUE:FALSE;
+    ptr_lp_adv ->advPause = (u32dat & AN_LP_CAP_PAUSE)?TRUE:FALSE;
+
+    /* Read LP 1000BASE-T duplex capalibity from register */
+    aml_readPhyReg(unit, port, PHY_SR1G, &u32dat);
+    ptr_lp_adv ->advCap1000FDX = (u32dat & SR1G_CAP1000_FDX)?TRUE:FALSE;
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_port_setSpeed
+ * PURPOSE:
+ *      Set the speed for a specific port.
+ *      This setting is used on force mode only.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      speed           --  AIR_PORT_SPEED_10M:  10Mbps
+ *                          AIR_PORT_SPEED_100M: 100Mbps
+ *                          AIR_PORT_SPEED_1000M:1Gbps
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *      AIR_E_OTHERS
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_setSpeed(
+    const UI32_T unit,
+    const UI32_T port,
+    const UI32_T speed)
+{
+    UI32_T u32dat = 0;
+    UI32_T mii_port = 0;
+    BOOL_T an = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
+
+    /* Mistake proofing for speed checking */
+    AIR_PARAM_CHK((speed >= AIR_PORT_SPEED_2500M), AIR_E_BAD_PARAMETER);
+
+    /* Read data from register */
+    aml_readPhyReg(unit, port, 0x0, &u32dat);
+
+    u32dat &= ~(BIT(13) | BIT(6));
+    switch(speed)
+    {
+        case AIR_PORT_SPEED_10M:
+            /* (bit6, bit13) = 2b'00 means 10M */
+            break;
+        case AIR_PORT_SPEED_100M:
+            /* (bit6, bit13) = 2b'01 means 100M */
+            u32dat |= BIT(13);
+            break;
+        case AIR_PORT_SPEED_1000M:
+            /* (bit6, bit13) = 2b'10 means 1000M */
+            u32dat |= BIT(6);
+            break;
+        default:
+            /* (bit6, bit13) = 2b'11 means reverse,
+             * other value is invalid */
+            AIR_PRINT("argument 3: speed(%u) is invalid.\n", speed);
+            return AIR_E_BAD_PARAMETER;
+    }
+
+    /* Write data to register */
+    aml_writePhyReg(unit, port, 0x00, u32dat);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_port_getSpeed
+ * PURPOSE:
+ *      Get the speed for a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *
+ * OUTPUT:
+ *      ptr_speed       --  AIR_PORT_SPEED_10M:  10Mbps
+ *                          AIR_PORT_SPEED_100M: 100Mbps
+ *                          AIR_PORT_SPEED_1000M:1Gbps
+ *                          AIR_PORT_SPEED_2500M:2.5Gbps
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_getSpeed(
+    const UI32_T unit,
+    const UI32_T port,
+    UI32_T *ptr_speed)
+{
+    UI32_T u32dat = 0;
+    UI32_T mii_port = 0, sp = 0;
+    UI32_T ret = AIR_E_OK;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
+
+    /* Mistake proofing for speed checking */
+    AIR_CHECK_PTR(ptr_speed);
+
+    /* Read data from register */
+    aml_readPhyReg(unit, port, 0x0, &u32dat);
+    (*ptr_speed) = (BITS_OFF_R(u32dat, 6, 1) << 1) | BITS_OFF_R(u32dat, 13, 1);
+
+    return ret;
+}
+
+/* FUNCTION NAME: air_port_setDuplex
+ * PURPOSE:
+ *      Get the duplex for a specific port.
+ *      This setting is used on force mode only.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      duplex          --  AIR_PORT_DUPLEX_HALF
+ *                          AIR_PORT_DUPLEX_FULL
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_setDuplex(
+    const UI32_T unit,
+    const UI32_T port,
+    const BOOL_T duplex)
+{
+    UI32_T ret = AIR_E_OK;
+    UI32_T u32dat = 0;
+    UI32_T mii_port = 0, speed = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
+
+    /* Mistake proofing for duplex checking */
+    AIR_PARAM_CHK(((AIR_PORT_DUPLEX_HALF != duplex) && (AIR_PORT_DUPLEX_FULL != duplex)), AIR_E_BAD_PARAMETER);
+
+    /* Read data from register */
+    aml_readPhyReg(unit, port, 0x0, &u32dat);
+    speed = (BITS_OFF_R(u32dat, 6, 1) << 1) | BITS_OFF_R(u32dat, 13, 1);
+    if(AIR_PORT_SPEED_100M >= speed)
+    {
+        if(TRUE == duplex)
+        {
+            u32dat |= BIT(8);
+        }
+        else
+        {
+            u32dat &= ~BIT(8);
+        }
+    }
+    else
+    {
+        /* 1G support full duplex only */
+        u32dat |= BIT(8);
+    }
+
+    /* Write data to register */
+    aml_writePhyReg(unit, port, 0x0, u32dat);
+
+    return ret;
+}
+
+/* FUNCTION NAME: air_port_getDuplex
+ * PURPOSE:
+ *      Get the duplex for a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *
+ * OUTPUT:
+ *      ptr_duplex      --  AIR_PORT_DUPLEX_HALF
+ *                          AIR_PORT_DUPLEX_FULL
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_getDuplex(
+    const UI32_T unit,
+    const UI32_T port,
+    BOOL_T *ptr_duplex)
+{
+    UI32_T u32dat = 0;
+    UI32_T mii_port = 0, duplex = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
+    /* Mistake proofing for duplex checking */
+    AIR_CHECK_PTR(ptr_duplex);
+
+    /* Read data from register */
+    aml_readPhyReg(unit, port, 0x0, &u32dat);
+    (*ptr_duplex) = BITS_OFF_R(u32dat, 8, 1);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_port_getLink
+ * PURPOSE:
+ *      Get the physical link status for a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *
+ * OUTPUT:
+ *      ptr_ps          --  AIR_PORT_STATUS_T
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_getLink(
+    const UI32_T unit,
+    const UI32_T port,
+    AIR_PORT_STATUS_T *ptr_ps)
+{
+    UI32_T ret = AIR_E_OK;
+    UI32_T u32dat = 0;
+    UI32_T mii_port = 0;
+    BOOL_T an = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
+    /* Mistake proofing for duplex checking */
+    AIR_CHECK_PTR(ptr_ps);
+
+    /* Read data from register */
+    aml_readReg(unit, PMSR(port), &u32dat);
+    ptr_ps->link = BITS_OFF_R(u32dat, 24, 1);
+    ptr_ps->duplex = BITS_OFF_R(u32dat, 25, 1);
+    ptr_ps->speed = BITS_OFF_R(u32dat, 28, 3);
+
+    return ret;
+}
+
+/* FUNCTION NAME: air_port_setBckPres
+ * PURPOSE:
+ *      Set the back pressure configuration for a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      bckPres         --  FALSE:Disable
+ *                          TRUE: Enable
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_setBckPres(
+    const UI32_T unit,
+    const UI32_T port,
+    const BOOL_T bckPres)
+{
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    /* Mistake proofing for speed checking */
+    AIR_PARAM_CHK(((TRUE != bckPres) && (FALSE != bckPres)), AIR_E_BAD_PARAMETER);
+
+    /* Read data from register */
+    aml_readReg(unit, PMCR(port), &u32dat);
+    if(TRUE == bckPres)
+    {
+        u32dat |= BIT(11);
+    }
+    else
+    {
+        u32dat &= ~BIT(11);
+    }
+
+    /* Write data to register */
+    aml_writeReg(unit, PMCR(port), u32dat);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_port_getBckPres
+ * PURPOSE:
+ *      Get the back pressure configuration for a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *
+ * OUTPUT:
+ *      ptr_bckPres     --  FALSE:Disable
+ *                          TRUE: Enable
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_getBckPres(
+    const UI32_T unit,
+    const UI32_T port,
+    BOOL_T *ptr_bckPres)
+{
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+
+    /* Mistake proofing for speed checking */
+    AIR_CHECK_PTR(ptr_bckPres);
+
+    /* Read data from register */
+    aml_readReg(unit, PMCR(port), &u32dat);
+    (*ptr_bckPres) = BITS_OFF_R(u32dat, 11, 1);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_port_setFlowCtrl
+ * PURPOSE:
+ *      Set the flow control configuration for specific port.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Select port number (0 - 6)
+ *      dir             --  Directions of AIR_PORT_TX or AIR_PORT_RX
+ *      fc_en           --  TRUE: Enable select port flow control
+ *                          FALSE:Disable select port flow control
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_setFlowCtrl(
+    const UI32_T unit,
+    const UI32_T port,
+    const BOOL_T dir,
+    const BOOL_T fc_en)
+{
+    UI32_T u32dat = 0;
+
+    /* Check port range */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+
+    /* Check directions */
+    if(dir != AIR_PORT_TX && dir != AIR_PORT_RX)
+        return AIR_E_BAD_PARAMETER;;
+
+    /* Check fc_en */
+    AIR_PARAM_CHK(((TRUE != fc_en) && (FALSE != fc_en)), AIR_E_BAD_PARAMETER);
+
+    aml_readReg(unit, PMCR(port), &u32dat);
+    if(TRUE == fc_en)
+    {
+        /* Enable port flow control */
+        if(dir == AIR_PORT_TX)
+        {
+            u32dat |= FORCE_TX_FC;
+        }
+        else
+        {
+            u32dat |= FORCE_RX_FC;
+        }
+    }
+    else
+    {
+        /* Disable port flow control */
+        if(dir == AIR_PORT_TX)
+        {
+            u32dat &= ~(FORCE_TX_FC);
+        }
+        else
+        {
+            u32dat &= ~(FORCE_RX_FC);
+        }
+    }
+    aml_writeReg(unit, PMCR(port), u32dat);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_port_getFlowCtrl
+ * PURPOSE:
+ *      Get the flow control configuration for specific port.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Select port number (0..6)
+ *      dir             --  AIR_PORT_TX
+ *                          AIR_PORT_RX
+ * OUTPUT:
+ *      ptr_fc_en       --  FALSE: Port flow control disable
+ *                          TRUE: Port flow control enable
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_getFlowCtrl(
+    const UI32_T unit,
+    const UI32_T port,
+    const BOOL_T dir,
+    BOOL_T *ptr_fc_en)
+{
+    UI32_T u32dat = 0;
+
+    /* Check port range */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_fc_en);
+
+    /* Check directions */
+    if(dir != AIR_PORT_TX && dir != AIR_PORT_RX)
+        return AIR_E_BAD_PARAMETER;
+
+    /* Read port flow control status*/
+    aml_readReg(unit, PMCR(port), &u32dat);
+    if(dir == AIR_PORT_TX)
+    {
+        if((u32dat & FORCE_TX_FC) == FORCE_TX_FC)
+            *ptr_fc_en = TRUE;
+        else
+            *ptr_fc_en = FALSE;
+    }
+    else
+    {
+        if((u32dat & FORCE_RX_FC) == FORCE_RX_FC)
+            *ptr_fc_en = TRUE;
+        else
+            *ptr_fc_en = FALSE;
+    }
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_port_setJumbo
+ * PURPOSE:
+ *      Set accepting jumbo frmes with specificied size.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      pkt_len         --  Select max packet length
+ *                          RX_PKT_LEN_1518
+ *                          RX_PKT_LEN_1536
+ *                          RX_PKT_LEN_1552
+ *                          RX_PKT_LEN_MAX_JUMBO
+ *      frame_len       --  Select max lenght of jumbo frames
+ *                          Range : 2 - 16
+ *                          Units : K Bytes
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_setJumbo(
+    const UI32_T unit,
+    const UI32_T pkt_len,
+    const UI32_T frame_len)
+{
+    UI32_T u32dat = 0;
+
+    /* Check packet length */
+    AIR_PARAM_CHK((pkt_len > 3), AIR_E_BAD_PARAMETER);
+
+    /* Check frame length */
+    AIR_PARAM_CHK((frame_len < 2), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((frame_len > 16), AIR_E_BAD_PARAMETER);
+
+    /* Read and clear jumbo frame info */
+    aml_readReg(unit, GMACCR, &u32dat);
+    u32dat &= ~0x00F3;
+
+    /* Set max packet length */
+    u32dat |= pkt_len;
+
+    /* Set jumbo frames max length */
+    u32dat |= (frame_len << 4);
+
+    aml_writeReg(unit, GMACCR, u32dat);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_port_getJumbo
+ * PURPOSE:
+ *      Get accepting jumbo frmes with specificied size.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *
+ * OUTPUT:
+ *      ptr_pkt_len     --  Select max packet length
+ *                          RX_PKT_LEN_1518
+ *                          RX_PKT_LEN_1536
+ *                          RX_PKT_LEN_1552
+ *                          RX_PKT_LEN_MAX_JUMBO
+ *      ptr_frame_len   --  Select max lenght of jumbo frames
+ *                          Range : 2 - 16
+ *                          Units : K Bytes
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_getJumbo(
+    const UI32_T unit,
+    UI32_T *ptr_pkt_len,
+    UI32_T *ptr_frame_len)
+{
+    UI32_T u32dat = 0;
+
+    AIR_CHECK_PTR(ptr_pkt_len);
+    AIR_CHECK_PTR(ptr_frame_len);
+
+    /* Read and clear jumbo frame info */
+    aml_readReg(unit, GMACCR, &u32dat);
+
+    /* Set max packet length */
+    *ptr_pkt_len = (0x03 & u32dat);
+
+    /* Set jumbo frames max length */
+    *ptr_frame_len = (0x0F & (u32dat >> 4));
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_port_setPsMode
+ * PURPOSE:
+ *      Set the power saving mode for a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      mode            --  Bit-map:
+ *                          AIR_PORT_PS_LINKSTATUS
+ *                          AIR_PORT_PS_EEE
+ *                          FALSE: Disable / TRUE: Enable
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_setPsMode(
+    const UI32_T unit,
+    const UI32_T port,
+    const UI32_T mode)
+{
+    UI32_T u32dat = 0;
+    UI32_T u32cl45_1e_3c = 0;
+    UI32_T u32cl45_1e_3d = 0;
+    UI32_T u32cl45_1e_3e = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((mode & (~AIR_PORT_PS_MASK)), AIR_E_BAD_PARAMETER);
+
+    /* Read data from register */
+    aml_readPhyRegCL45(unit, port, PHY_DEV_1EH, BYPASS_POWER_DOWN_REG0, &u32cl45_1e_3c);
+    aml_readPhyRegCL45(unit, port, PHY_DEV_1EH, BYPASS_POWER_DOWN_REG1, &u32cl45_1e_3d);
+    aml_readPhyRegCL45(unit, port, PHY_DEV_1EH, BYPASS_POWER_DOWN_REG2, &u32cl45_1e_3e);
+
+    if(mode & AIR_PORT_PS_LINKSTATUS)
+    {
+        /* Set Link Status
+         * Disable bypass function to enable */
+        u32cl45_1e_3c &= ~BITS(12, 15);
+        aml_writePhyRegCL45(unit, port, PHY_DEV_1EH, BYPASS_POWER_DOWN_REG0, u32cl45_1e_3c);
+        u32cl45_1e_3d &= ~BITS(12, 15);
+        aml_writePhyRegCL45(unit, port, PHY_DEV_1EH, BYPASS_POWER_DOWN_REG1, u32cl45_1e_3d);
+        u32cl45_1e_3e &= ~BITS(11, 15);
+        aml_writePhyRegCL45(unit, port, PHY_DEV_1EH, BYPASS_POWER_DOWN_REG2, u32cl45_1e_3e);
+    }
+    else
+    {
+        /* Set Link Status
+         * Enable bypass function to disable */
+        u32cl45_1e_3c |= BITS(12, 15);
+        aml_writePhyRegCL45(unit, port, PHY_DEV_1EH, BYPASS_POWER_DOWN_REG0, u32cl45_1e_3c);
+        u32cl45_1e_3d |= BITS(12, 15);
+        aml_writePhyRegCL45(unit, port, PHY_DEV_1EH, BYPASS_POWER_DOWN_REG1, u32cl45_1e_3d);
+        u32cl45_1e_3e |= BITS(11, 15);
+        aml_writePhyRegCL45(unit, port, PHY_DEV_1EH, BYPASS_POWER_DOWN_REG2, u32cl45_1e_3e);
+    }
+
+    if(mode & AIR_PORT_PS_EEE)
+    {
+        /* Enable EEE */
+        u32dat = (EEE_ADV_1000BT | EEE_ADV_100BT );
+        aml_writePhyRegCL45(unit, port, PHY_DEV_07H, EEE_ADV_REG, u32dat);
+    }
+    else
+    {
+        /* Disable EEE */
+        aml_writePhyRegCL45(unit, port, PHY_DEV_07H, EEE_ADV_REG, 0);
+    }
+    return AIR_E_OK;
+
+}
+
+/* FUNCTION NAME: air_port_getPsMode
+ * PURPOSE:
+ *      Get the power saving mode for a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ * OUTPUT:
+ *      ptr_mode        --  Bit-map:
+ *                          AIR_PORT_PS_LINKSTATUS
+ *                          AIR_PORT_PS_EEE
+ *                          FALSE: Disable / TRUE: Enable
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_getPsMode(
+    const UI32_T unit,
+    const UI32_T port,
+    UI32_T *ptr_mode)
+{
+    UI32_T u32cl45_1e_3e = 0;
+    UI32_T u32cl45_07_3c = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
+
+    /* Mistake proofing for mode checking */
+    AIR_CHECK_PTR(ptr_mode);
+
+    (*ptr_mode) = 0;
+
+    /* Check link-status power saving */
+    aml_readPhyRegCL45(unit, port, PHY_DEV_1EH, BYPASS_POWER_DOWN_REG2, &u32cl45_1e_3e);
+    if(!BITS_OFF_R(u32cl45_1e_3e, 11, 5))
+    {
+        /* Read Bypass the power-down TXVLD to check link-status
+         * power saving function state */
+        (*ptr_mode) |= AIR_PORT_PS_LINKSTATUS;
+    }
+
+    /* Check EEE */
+    aml_readPhyRegCL45(unit, port, PHY_DEV_07H, EEE_ADV_REG, &u32cl45_07_3c);
+    if( (u32cl45_07_3c & EEE_ADV_1000BT) && (u32cl45_07_3c & EEE_ADV_100BT) )
+    {
+        /* Read PMCR to check EEE ability */
+        (*ptr_mode) |= AIR_PORT_PS_EEE;
+    }
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_port_setSmtSpdDwn
+ * PURPOSE:
+ *      Set Smart speed down feature for a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      state           --  FALSE:Disable
+ *                          TRUE: Enable
+ *      time            --  AIR_PORT_SSD_2T
+ *                          AIR_PORT_SSD_3T
+ *                          AIR_PORT_SSD_4T
+ *                          AIR_PORT_SSD_5T
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_setSmtSpdDwn(
+    const UI32_T unit,
+    const UI32_T port,
+    const BOOL_T state,
+    const UI32_T time)
+{
+    UI32_T u32ext14 = 0;
+    UI32_T page = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
+
+    /* Mistake proofing for state checking */
+    AIR_PARAM_CHK(((TRUE != state) && (FALSE != state)), AIR_E_BAD_PARAMETER);
+
+    /* Mistake proofing for time checking */
+    AIR_PARAM_CHK((time >= AIR_PORT_SSD_LAST), AIR_E_BAD_PARAMETER);
+
+    /* Backup page */
+    aml_readPhyReg(unit, port, 0x1F, &page);
+
+    /* Switch to page 1*/
+    aml_writePhyReg(unit, port, 0x1F, 0x1);
+    /* Read data from register */
+    aml_readPhyReg(unit, port, 0x14, &u32ext14);
+
+    /* Write data to register */
+    if(TRUE == state)
+    {
+        u32ext14 |= BIT(4);
+    }
+    else
+    {
+        u32ext14 &= ~BIT(4);
+    }
+    u32ext14 &= ~BITS(2,3);
+    u32ext14 |= time << 2;
+
+    /* Switch to page 1*/
+    aml_writePhyReg(unit, port, 0x1F, 0x1);
+    /* Read data from register */
+    aml_writePhyReg(unit, port, 0x14, u32ext14);
+
+    /* Restore page */
+    aml_writePhyReg(unit, port, 0x1F, page);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_port_getSmtSpdDwn
+ * PURPOSE:
+ *      Get Smart speed down feature for a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *
+ * OUTPUT:
+ *      ptr_state       --  FALSE:Disable
+ *                          TRUE: Enable
+ *      ptr_time        --  AIR_PORT_SSD_2T
+ *                          AIR_PORT_SSD_3T
+ *                          AIR_PORT_SSD_4T
+ *                          AIR_PORT_SSD_5T
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_getSmtSpdDwn(
+    const UI32_T unit,
+    const UI32_T port,
+    UI32_T *ptr_state,
+    UI32_T *ptr_time)
+{
+    UI32_T u32ext14 = 0;
+    UI32_T page = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
+
+    /* Mistake proofing for state checking */
+    AIR_CHECK_PTR(ptr_state);
+
+    /* Mistake proofing for time checking */
+    AIR_CHECK_PTR(ptr_time);
+
+    /* Backup page */
+    aml_readPhyReg(unit, port, 0x1F, &page);
+
+    /* Switch to page 1*/
+    aml_writePhyReg(unit, port, 0x1F, 0x1);
+    /* Read data from register */
+    aml_readPhyReg(unit, port, 0x14, &u32ext14);
+
+    (*ptr_state) = BITS_OFF_R(u32ext14, 4, 1);
+    (*ptr_time) = BITS_OFF_R(u32ext14, 2, 2);
+
+    /* Restore page */
+    aml_writePhyReg(unit, port, 0x1F, page);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_port_setEnable
+ * PURPOSE:
+ *      Set powerdown state for a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      state           --  FALSE:Disable
+ *                          TRUE: Enable
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_setEnable(
+    const UI32_T unit,
+    const UI32_T port,
+    const BOOL_T state)
+{
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK(((TRUE != state) && (FALSE != state)), AIR_E_BAD_PARAMETER);
+
+    /* Read data from register */
+    aml_readPhyReg(unit, port, 0x0, &u32dat);
+
+    if(TRUE == state)
+    {
+        /* Enable port, so disable powerdown bit */
+        u32dat &= ~BIT(11);
+    }
+    else
+    {
+        /* Disable port, so enable powerdown bit */
+        u32dat |= BIT(11);
+    }
+
+    /* Write data to register */
+    aml_writePhyReg(unit, port, 0x0, u32dat);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_port_getEnable
+ * PURPOSE:
+ *      Get powerdown state for a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *
+ * OUTPUT:
+ *      ptr_state       --  FALSE:Disable
+ *                          TRUE: Enable
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_getEnable(
+    const UI32_T unit,
+    const UI32_T port,
+    UI32_T *ptr_state)
+{
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_GIGA_PORTS), AIR_E_BAD_PARAMETER);
+
+    /* Mistake proofing for state checking */
+    AIR_CHECK_PTR(ptr_state);
+
+    /* Read data from register */
+    aml_readPhyReg(unit, port, 0x0, &u32dat);
+
+    (*ptr_state) = (~BITS_OFF_R(u32dat, 11, 1))&BIT(0);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_port_setPortMatrix
+ * PURPOSE:
+ *      Set port matrix from the specified device.
+ *
+ * INPUT:
+ *      unit            --  Unit id
+ *      port            --  Port id
+ *      port_bitmap     --  Matrix port bitmap
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_OTHERS
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      none
+ */
+AIR_ERROR_NO_T
+air_port_setPortMatrix(
+    const UI32_T    unit,
+    const UI32_T    port,
+    const UI32_T    port_bitmap)
+{
+    AIR_ERROR_NO_T rc = AIR_E_OK;
+
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((port_bitmap & (~AIR_ALL_PORT_BITMAP)), AIR_E_BAD_PARAMETER);
+
+    aml_writeReg(unit, PORTMATRIX(port), port_bitmap);
+
+    return rc;
+}
+
+/* FUNCTION NAME: air_port_getPortMatrix
+ * PURPOSE:
+ *      Get port matrix from the specified device.
+ *
+ * INPUT:
+ *      unit            --  Unit id
+ *      port            --  Port id
+ *
+ * OUTPUT:
+ *      p_port_bitmap   --  Matrix port bitmap
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_OTHERS
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      none
+ */
+AIR_ERROR_NO_T
+air_port_getPortMatrix(
+    const UI32_T    unit,
+    const UI32_T    port,
+    UI32_T          *p_port_bitmap)
+{
+    AIR_ERROR_NO_T rc = AIR_E_OK;
+    UI32_T val = 0;
+
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(p_port_bitmap);
+
+    aml_readReg(unit, PORTMATRIX(port), &val);
+    *p_port_bitmap = val;
+
+    return rc;
+}
+
+/* FUNCTION NAME: air_port_setVlanMode
+ * PURPOSE:
+ *      Set port-based vlan mechanism from the specified device.
+ *
+ * INPUT:
+ *      unit            --  Unit id
+ *      port            --  Port id
+ *      mode            --  Port vlan mode
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_OTHERS
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      none
+ */
+AIR_ERROR_NO_T
+air_port_setVlanMode(
+    const UI32_T    unit,
+    const UI32_T    port,
+    const AIR_PORT_VLAN_MODE_T mode)
+{
+    AIR_ERROR_NO_T rc = AIR_E_OK;
+    UI32_T val = 0;
+
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((mode >= AIR_PORT_VLAN_MODE_LAST), AIR_E_BAD_PARAMETER);
+
+    aml_readReg(unit, PCR(port), &val);
+    val &= ~PCR_PORT_VLAN_MASK;
+    val |= (mode & PCR_PORT_VLAN_RELMASK) << PCR_PORT_VLAN_OFFT;
+    aml_writeReg(unit, PCR(port), val);
+
+    return rc;
+}
+
+/* FUNCTION NAME: air_port_getVlanMode
+ * PURPOSE:
+ *      Get port-based vlan mechanism from the specified device.
+ *
+ * INPUT:
+ *      unit            --  Unit id
+ *      port            --  Port id
+ *
+ * OUTPUT:
+ *      p_mode          --  Port vlan mode
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_OTHERS
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      none
+ */
+AIR_ERROR_NO_T
+air_port_getVlanMode(
+    const UI32_T    unit,
+    const UI32_T    port,
+    AIR_PORT_VLAN_MODE_T *p_mode)
+{
+    AIR_ERROR_NO_T rc = AIR_E_OK;
+    UI32_T val = 0;
+
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(p_mode);
+
+    aml_readReg(unit, PCR(port), &val);
+    *p_mode = (val >> PCR_PORT_VLAN_OFFT) & PCR_PORT_VLAN_RELMASK;
+
+    return rc;
+}
+
+/* FUNCTION NAME: air_port_setSpTag
+ * PURPOSE:
+ *      Set special tag state of a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      sptag_en        --  TRUE:  Enable special tag
+ *                          FALSE: Disable special tag
+ * OUTPUT:
+ *        None
+ *
+ * RETURN:
+ *        AIR_E_OK
+ *        AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_setSpTag(
+    const UI32_T unit,
+    const UI32_T port,
+    const BOOL_T sptag_en)
+{
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK(((TRUE != sptag_en) && (FALSE != sptag_en)), AIR_E_BAD_PARAMETER);
+
+    /* Read data from register */
+    aml_readReg(unit, PVC(port), &u32dat);
+
+    /* Write data to register */
+    if(TRUE == sptag_en)
+    {
+        u32dat |= PVC_SPTAG_EN_MASK;
+    }
+    else
+    {
+        u32dat &= ~PVC_SPTAG_EN_MASK;
+    }
+    aml_writeReg(unit, PVC(port), u32dat);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_port_getSpTag
+ * PURPOSE:
+ *      Get special tag state of a specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ * OUTPUT:
+ *      ptr_sptag_en    --  TRUE:  Special tag enable
+ *                          FALSE: Special tag disable
+ *
+ * RETURN:
+ *        AIR_E_OK
+ *        AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_getSpTag(
+    const UI32_T unit,
+    const UI32_T port,
+    BOOL_T *ptr_sptag_en)
+{
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+
+    /* Mistake proofing for state checking */
+    AIR_CHECK_PTR(ptr_sptag_en);
+
+    /* Read data from register */
+    aml_readReg(unit, PVC(port), &u32dat);
+
+    *ptr_sptag_en = (u32dat & PVC_SPTAG_EN_MASK) >> PVC_SPTAG_EN_OFFT;
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_port_set5GBaseRModeEnable
+ * PURPOSE:
+ *      Set the port5 5GBase-R mode enable
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_set5GBaseRModeEn(
+    const UI32_T unit)
+{
+    AIR_ERROR_NO_T ret = AIR_E_OK;
+    UI32_T u32dat = 0;
+
+    /* PHYA Cal Enable (EFUSE) */
+    aml_readReg(unit, INTF_CTRL_8, &u32dat);
+    u32dat |= BIT(7);
+    aml_writeReg(unit, INTF_CTRL_8, u32dat);
+
+    aml_readReg(unit, INTF_CTRL_9, &u32dat);
+    u32dat |= BIT(31);
+    aml_writeReg(unit, INTF_CTRL_9, u32dat);
+
+    /* PMA Init */
+    /* PLL */
+    aml_readReg(unit, RX_CTRL_26, &u32dat);
+    u32dat |= BIT(23);
+    u32dat &= (~BIT(24));
+    u32dat |= BIT(26);
+    aml_writeReg(unit, RX_CTRL_26, u32dat);
+
+    aml_readReg(unit, QP_DIG_MODE_CTRL_1, &u32dat);
+    u32dat |= BITS(2, 3);
+    aml_writeReg(unit, QP_DIG_MODE_CTRL_1, u32dat);
+
+    aml_readReg(unit, PLL_CTRL_2, &u32dat);
+    u32dat |= BITS(0, 1);
+    u32dat &= ~(0x7 << 2);
+    u32dat |= (0x5 << 2);
+    u32dat &= ~(0x3 << 6);
+    u32dat |= (0x1 << 6);
+    u32dat &= ~(0x7 << 8);
+    u32dat |= (0x3 << 8);
+    u32dat |= BIT(29);
+    u32dat &= ~BITS(12, 13);
+    aml_writeReg(unit, PLL_CTRL_2, u32dat);
+
+    aml_readReg(unit, PLL_CTRL_4, &u32dat);
+    u32dat &= ~BIT(2);
+    aml_writeReg(unit, PLL_CTRL_4, u32dat);
+
+    aml_readReg(unit, PLL_CTRL_2, &u32dat);
+    u32dat &= ~BIT(14);
+    u32dat &= ~(0xf << 16);
+    u32dat |= (0x8 << 16);
+    u32dat &= ~BITS(20, 21);
+    u32dat &= ~(0x3 << 24);
+    u32dat |= (0x1 << 24);
+    u32dat &= ~BIT(26);
+    u32dat |= BIT(22);
+    u32dat |= BIT(27);
+    u32dat |= BIT(28);
+    aml_writeReg(unit, PLL_CTRL_2, u32dat);
+
+    aml_readReg(unit, PLL_CTRL_4, &u32dat);
+    u32dat &= ~(0x3 << 3);
+    u32dat |= (0x1 << 3);
+    aml_writeReg(unit, PLL_CTRL_4, u32dat);
+
+    aml_readReg(unit, PLL_CTRL_2, &u32dat);
+    u32dat &= ~BIT(30);
+    aml_writeReg(unit, PLL_CTRL_2, u32dat);
+
+    aml_readReg(unit, SS_LCPLL_PWCTL_SETTING_2, &u32dat);
+    u32dat |= BITS(16, 17);
+    aml_writeReg(unit, SS_LCPLL_PWCTL_SETTING_2, u32dat);
+
+    aml_writeReg(unit, SS_LCPLL_TDC_FLT_2, 0x1c800000);
+    aml_writeReg(unit, SS_LCPLL_TDC_PCW_1, 0x1c800000);
+
+    aml_readReg(unit, SS_LCPLL_TDC_FLT_5, &u32dat);
+    u32dat &= ~BIT(24);
+    aml_writeReg(unit, SS_LCPLL_TDC_FLT_5, u32dat);
+
+    aml_readReg(unit, PLL_CK_CTRL_0, &u32dat);
+    u32dat &= ~BIT(8);
+    aml_writeReg(unit, PLL_CK_CTRL_0, u32dat);
+
+    aml_readReg(unit, PLL_CTRL_3, &u32dat);
+    u32dat &= ~BITS(0, 15);
+    aml_writeReg(unit, PLL_CTRL_3, u32dat);
+
+    aml_readReg(unit, PLL_CTRL_4, &u32dat);
+    u32dat &= ~BITS(0, 1);
+    aml_writeReg(unit, PLL_CTRL_4, u32dat);
+
+    aml_readReg(unit, PLL_CTRL_3, &u32dat);
+    u32dat &= ~BITS(16, 31);
+    aml_writeReg(unit, PLL_CTRL_3, u32dat);
+
+    aml_readReg(unit, PLL_CK_CTRL_0, &u32dat);
+    u32dat &= ~BIT(9);
+    aml_writeReg(unit, PLL_CK_CTRL_0, u32dat);
+
+    aml_readReg(unit, RG_QP_PLL_IPLL_DIG_PWR_SEL, &u32dat);
+    u32dat &= ~(0x3 << 25);
+    u32dat |= (0x1 << 25);
+    aml_writeReg(unit, RG_QP_PLL_IPLL_DIG_PWR_SEL, u32dat);
+
+    aml_readReg(unit, RG_QP_PLL_SDM_ORD, &u32dat);
+    u32dat |= BIT(3);
+    u32dat |= BIT(4);
+    aml_writeReg(unit, RG_QP_PLL_SDM_ORD, u32dat);
+
+    aml_readReg(unit, RG_QP_RX_DAC_EN, &u32dat);
+    u32dat &= ~(0x3 << 16);
+    u32dat |= (0x2 << 16);
+    aml_writeReg(unit, RG_QP_RX_DAC_EN, u32dat);
+
+    aml_readReg(unit, PON_RXFEDIG_CTRL_0, &u32dat);
+    u32dat &= ~BIT(12);
+    aml_writeReg(unit, PON_RXFEDIG_CTRL_0, u32dat);
+
+    /* RX Control */
+    aml_readReg(unit, RG_QP_CDR_LPF_MJV_LIM, &u32dat);
+    u32dat &= ~BITS(4, 5);
+    aml_writeReg(unit, RG_QP_CDR_LPF_MJV_LIM, u32dat);
+
+    aml_readReg(unit, RG_QP_RXAFE_RESERVE, &u32dat);
+    u32dat |= BIT(11);
+    aml_writeReg(unit, RG_QP_RXAFE_RESERVE, u32dat);
+
+    aml_readReg(unit, RG_QP_CDR_PR_CKREF_DIV1, &u32dat);
+    u32dat &= ~(0x1f << 8);
+    u32dat |= (0xc << 8);
+    aml_writeReg(unit, RG_QP_CDR_PR_CKREF_DIV1, u32dat);
+
+    aml_readReg(unit, RG_QP_CDR_FORCE_IBANDLPF_R_OFF, &u32dat);
+    u32dat |= BIT(13);
+    aml_writeReg(unit, RG_QP_CDR_FORCE_IBANDLPF_R_OFF, u32dat);
+
+    aml_readReg(unit, RG_QP_CDR_PR_KBAND_DIV_PCIE, &u32dat);
+    u32dat |= BIT(30);
+    aml_writeReg(unit, RG_QP_CDR_PR_KBAND_DIV_PCIE, u32dat);
+
+    aml_readReg(unit, PLL_CTRL_0, &u32dat);
+    u32dat |= BIT(0);
+    aml_writeReg(unit, PLL_CTRL_0, u32dat);
+
+    aml_readReg(unit, RX_DLY_0, &u32dat);
+    u32dat &= ~(0xff << 0);
+    u32dat |= (0x6f << 0);
+    u32dat |= BITS(8, 13);
+    aml_writeReg(unit, RX_DLY_0, u32dat);
+
+    aml_readReg(unit, RX_CTRL_42, &u32dat);
+    u32dat &= ~(0x1fff << 0);
+    u32dat |= (0x150 << 0);
+    aml_writeReg(unit, RX_CTRL_42, u32dat);
+
+    aml_readReg(unit, RX_CTRL_2, &u32dat);
+    u32dat &= ~(0x1fff << 16);
+    u32dat |= (0x150 << 16);
+    aml_writeReg(unit, RX_CTRL_2, u32dat);
+
+    aml_readReg(unit, PON_RXFEDIG_CTRL_9, &u32dat);
+    u32dat |= BITS(0, 2);
+    aml_writeReg(unit, PON_RXFEDIG_CTRL_9, u32dat);
+
+    aml_readReg(unit, RX_CTRL_8, &u32dat);
+    u32dat &= ~(0xfff << 16);
+    u32dat |= (0x200 << 16);
+    aml_writeReg(unit, RX_CTRL_8, u32dat);
+
+    /* Frequency memter */
+    aml_readReg(unit, RX_CTRL_5, &u32dat);
+    u32dat &= ~(0xfffff << 10);
+    u32dat |= (0x9 << 10);
+    aml_writeReg(unit, RX_CTRL_5, u32dat);
+
+    aml_readReg(unit, RX_CTRL_6, &u32dat);
+    u32dat &= ~(0xfffff << 0);
+    u32dat |= (0x64 << 0);
+    aml_writeReg(unit, RX_CTRL_6, u32dat);
+
+    aml_readReg(unit, RX_CTRL_7, &u32dat);
+    u32dat &= ~(0xfffff << 0);
+    u32dat |= (0x2710 << 0);
+    aml_writeReg(unit, RX_CTRL_7, u32dat);
+
+    /* PCS Init */
+    aml_readReg(unit, RG_USXGMII_AN_CONTROL_0, &u32dat);
+    u32dat &= ~BIT(0);
+    aml_writeReg(unit, RG_USXGMII_AN_CONTROL_0, u32dat);
+
+    aml_readReg(unit, USGMII_CTRL_0, &u32dat);
+    u32dat |= BIT(2);
+    aml_writeReg(unit, USGMII_CTRL_0, u32dat);
+
+    aml_readReg(unit, MSG_RX_CTRL_0, &u32dat);
+    u32dat |= BIT(28);
+    aml_writeReg(unit, MSG_RX_CTRL_0, u32dat);
+
+    aml_readReg(unit, QP_CK_RST_CTRL_4, &u32dat);
+    u32dat |= BITS(14, 20);
+    aml_writeReg(unit, QP_CK_RST_CTRL_4, u32dat);
+
+    /* bypass flow control to MAC */
+    aml_writeReg(unit, MSG_RX_LIK_STS_0, 0x01010107);
+    aml_writeReg(unit, MSG_RX_LIK_STS_2, 0x00000EEF);
+
+    return ret;
+}
+
+/* FUNCTION NAME: air_port_setHsgmiiModeEnable
+ * PURPOSE:
+ *      Set the port5 HSGMII mode enable
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_setHsgmiiModeEn(
+    const UI32_T unit)
+{
+    AIR_ERROR_NO_T ret = AIR_E_OK;
+    UI32_T u32dat = 0;
+
+    /* PLL */
+    aml_readReg(unit, QP_DIG_MODE_CTRL_1, &u32dat);
+    u32dat &= ~(0x3 << 2);
+    u32dat |= (0x1 << 2);
+    aml_writeReg(unit, QP_DIG_MODE_CTRL_1, u32dat);
+
+    /* PLL - LPF */
+    aml_readReg(unit, PLL_CTRL_2, &u32dat);
+    u32dat &= ~(0x3 << 0);
+    u32dat |= (0x1 << 0);
+    u32dat &= ~(0x7 << 2);
+    u32dat |= (0x5 << 2);
+    u32dat &= ~BITS(6, 7);
+    u32dat &= ~(0x7 << 8);
+    u32dat |= (0x3 << 8);
+    u32dat |= BIT(29);
+    u32dat &= ~BITS(12, 13);
+    aml_writeReg(unit, PLL_CTRL_2, u32dat);
+
+    /* PLL - ICO */
+    aml_readReg(unit, PLL_CTRL_4, &u32dat);
+    u32dat |= BIT(2);
+    aml_writeReg(unit, PLL_CTRL_4, u32dat);
+
+    aml_readReg(unit, PLL_CTRL_2, &u32dat);
+    u32dat &= ~BIT(14);
+    aml_writeReg(unit, PLL_CTRL_2, u32dat);
+
+    /* PLL - CHP */
+    aml_readReg(unit, PLL_CTRL_2, &u32dat);
+    u32dat &= ~(0xf << 16);
+    u32dat |= (0x6 << 16);
+    aml_writeReg(unit, PLL_CTRL_2, u32dat);
+
+
+    /* PLL - PFD */
+    aml_readReg(unit, PLL_CTRL_2, &u32dat);
+    u32dat &= ~(0x3 << 20);
+    u32dat |= (0x1 << 20);
+    u32dat &= ~(0x3 << 24);
+    u32dat |= (0x1 << 24);
+    u32dat &= ~BIT(26);
+    aml_writeReg(unit, PLL_CTRL_2, u32dat);
+
+    /* PLL - POSTDIV */
+    aml_readReg(unit, PLL_CTRL_2, &u32dat);
+    u32dat |= BIT(22);
+    u32dat &= ~BIT(27);
+    u32dat &= ~BIT(28);
+    aml_writeReg(unit, PLL_CTRL_2, u32dat);
+
+    /* PLL - SDM */
+    aml_readReg(unit, PLL_CTRL_4, &u32dat);
+    u32dat &= ~BITS(3, 4);
+    aml_writeReg(unit, PLL_CTRL_4, u32dat);
+
+    aml_readReg(unit, PLL_CTRL_2, &u32dat);
+    u32dat &= ~BIT(30);
+    aml_writeReg(unit, PLL_CTRL_2, u32dat);
+
+    aml_readReg(unit, SS_LCPLL_PWCTL_SETTING_2, &u32dat);
+    u32dat &= ~(0x3 << 16);
+    u32dat |= (0x1 << 16);
+    aml_writeReg(unit, SS_LCPLL_PWCTL_SETTING_2, u32dat);
+
+    aml_writeReg(unit, SS_LCPLL_TDC_FLT_2, 0x7a000000);
+    aml_writeReg(unit, SS_LCPLL_TDC_PCW_1, 0x7a000000);
+
+    aml_readReg(unit, SS_LCPLL_TDC_FLT_5, &u32dat);
+    u32dat &= ~BIT(24);
+    aml_writeReg(unit, SS_LCPLL_TDC_FLT_5, u32dat);
+
+    aml_readReg(unit, PLL_CK_CTRL_0, &u32dat);
+    u32dat &= ~BIT(8);
+    aml_writeReg(unit, PLL_CK_CTRL_0, u32dat);
+
+    /* PLL - SS */
+    aml_readReg(unit, PLL_CTRL_3, &u32dat);
+    u32dat &= ~BITS(0, 15);
+    aml_writeReg(unit, PLL_CTRL_3, u32dat);
+
+    aml_readReg(unit, PLL_CTRL_4, &u32dat);
+    u32dat &= ~BITS(0, 1);
+    aml_writeReg(unit, PLL_CTRL_4, u32dat);
+
+    aml_readReg(unit, PLL_CTRL_3, &u32dat);
+    u32dat &= ~BITS(16, 31);
+    aml_writeReg(unit, PLL_CTRL_3, u32dat);
+
+    /* PLL - TDC */
+    aml_readReg(unit, PLL_CK_CTRL_0, &u32dat);
+    u32dat &= ~BIT(9);
+    aml_writeReg(unit, PLL_CK_CTRL_0, u32dat);
+
+    aml_readReg(unit, RG_QP_PLL_SDM_ORD, &u32dat);
+    u32dat |= BIT(3);
+    u32dat |= BIT(4);
+    aml_writeReg(unit, RG_QP_PLL_SDM_ORD, u32dat);
+
+    aml_readReg(unit, RG_QP_RX_DAC_EN, &u32dat);
+    u32dat &= ~(0x3 << 16);
+    u32dat |= (0x2 << 16);
+    aml_writeReg(unit, RG_QP_RX_DAC_EN, u32dat);
+
+    /* TCL Disable (only for Co-SIM) */
+    aml_readReg(unit, PON_RXFEDIG_CTRL_0, &u32dat);
+    u32dat &= ~BIT(12);
+    aml_writeReg(unit, PON_RXFEDIG_CTRL_0, u32dat);
+
+    /* TX Init */
+    aml_readReg(unit, RG_QP_TX_MODE_16B_EN, &u32dat);
+    u32dat &= ~BIT(0);
+    u32dat &= ~(0xffff << 16);
+    u32dat |= (0x4 << 16);
+    aml_writeReg(unit, RG_QP_TX_MODE_16B_EN, u32dat);
+
+    /* RX Control */
+    aml_readReg(unit, RG_QP_RXAFE_RESERVE, &u32dat);
+    u32dat |= BIT(11);
+    aml_writeReg(unit, RG_QP_RXAFE_RESERVE, u32dat);
+
+    aml_readReg(unit, RG_QP_CDR_LPF_MJV_LIM, &u32dat);
+    u32dat &= ~(0x3 << 4);
+    u32dat |= (0x1 << 4);
+    aml_writeReg(unit, RG_QP_CDR_LPF_MJV_LIM, u32dat);
+
+    aml_readReg(unit, RG_QP_CDR_LPF_SETVALUE, &u32dat);
+    u32dat &= ~(0xf << 25);
+    u32dat |= (0x1 << 25);
+    u32dat &= ~(0x7 << 29);
+    u32dat |= (0x3 << 29);
+    aml_writeReg(unit, RG_QP_CDR_LPF_SETVALUE, u32dat);
+
+    aml_readReg(unit, RG_QP_CDR_PR_CKREF_DIV1, &u32dat);
+    u32dat &= ~(0x1f << 8);
+    u32dat |= (0xf << 8);
+    aml_writeReg(unit, RG_QP_CDR_PR_CKREF_DIV1, u32dat);
+
+    aml_readReg(unit, RG_QP_CDR_PR_KBAND_DIV_PCIE, &u32dat);
+    u32dat &= ~(0x3f << 0);
+    u32dat |= (0x19 << 0);
+    u32dat &= ~BIT(6);
+    aml_writeReg(unit, RG_QP_CDR_PR_KBAND_DIV_PCIE, u32dat);
+
+    aml_readReg(unit, RG_QP_CDR_FORCE_IBANDLPF_R_OFF, &u32dat);
+    u32dat &= ~(0x7f << 6);
+    u32dat |= (0x21 << 6);
+    u32dat &= ~(0x3 << 16);
+    u32dat |= (0x2 << 16);
+    u32dat &= ~BIT(13);
+    aml_writeReg(unit, RG_QP_CDR_FORCE_IBANDLPF_R_OFF, u32dat);
+
+    aml_readReg(unit, RG_QP_CDR_PR_KBAND_DIV_PCIE, &u32dat);
+    u32dat &= ~BIT(30);
+    aml_writeReg(unit, RG_QP_CDR_PR_KBAND_DIV_PCIE, u32dat);
+
+    aml_readReg(unit, RG_QP_CDR_PR_CKREF_DIV1, &u32dat);
+    u32dat &= ~(0x7 << 24);
+    u32dat |= (0x4 << 24);
+    aml_writeReg(unit, RG_QP_CDR_PR_CKREF_DIV1, u32dat);
+
+    aml_readReg(unit, PLL_CTRL_0, &u32dat);
+    u32dat |= BIT(0);
+    aml_writeReg(unit, PLL_CTRL_0, u32dat);
+
+    aml_readReg(unit, RX_CTRL_26, &u32dat);
+    u32dat &= ~BIT(23);
+    u32dat |= BIT(26);
+    aml_writeReg(unit, RX_CTRL_26, u32dat);
+
+    aml_readReg(unit, RX_DLY_0, &u32dat);
+    u32dat &= ~(0xff << 0);
+    u32dat |= (0x6f << 0);
+    u32dat |= BITS(8, 13);
+    aml_writeReg(unit, RX_DLY_0, u32dat);
+
+    aml_readReg(unit, RX_CTRL_42, &u32dat);
+    u32dat &= ~(0x1fff << 0);
+    u32dat |= (0x150 << 0);
+    aml_writeReg(unit, RX_CTRL_42, u32dat);
+
+    aml_readReg(unit, RX_CTRL_2, &u32dat);
+    u32dat &= ~(0x1fff << 16);
+    u32dat |= (0x150 << 16);
+    aml_writeReg(unit, RX_CTRL_2, u32dat);
+
+    aml_readReg(unit, PON_RXFEDIG_CTRL_9, &u32dat);
+    u32dat &= ~(0x7 << 0);
+    u32dat |= (0x1 << 0);
+    aml_writeReg(unit, PON_RXFEDIG_CTRL_9, u32dat);
+
+    aml_readReg(unit, RX_CTRL_8, &u32dat);
+    u32dat &= ~(0xfff << 16);
+    u32dat |= (0x200 << 16);
+    u32dat &= ~(0x7fff << 14);
+    u32dat |= (0xfff << 14);
+    aml_writeReg(unit, RX_CTRL_8, u32dat);
+
+    /* Frequency memter */
+    aml_readReg(unit, RX_CTRL_5, &u32dat);
+    u32dat &= ~(0xfffff << 10);
+    u32dat |= (0x10 << 10);
+    aml_writeReg(unit, RX_CTRL_5, u32dat);
+
+    aml_readReg(unit, RX_CTRL_6, &u32dat);
+    u32dat &= ~(0xfffff << 0);
+    u32dat |= (0x64 << 0);
+    aml_writeReg(unit, RX_CTRL_6, u32dat);
+
+    aml_readReg(unit, RX_CTRL_7, &u32dat);
+    u32dat &= ~(0xfffff << 0);
+    u32dat |= (0x2710 << 0);
+    aml_writeReg(unit, RX_CTRL_7, u32dat);
+
+    /* PCS Init */
+    aml_readReg(unit, RG_HSGMII_PCS_CTROL_1, &u32dat);
+    u32dat &= ~BIT(30);
+    aml_writeReg(unit, RG_HSGMII_PCS_CTROL_1, u32dat);
+
+    /* Rate Adaption */
+    aml_readReg(unit, RATE_ADP_P0_CTRL_0, &u32dat);
+    u32dat &= ~BIT(31);
+    aml_writeReg(unit, RATE_ADP_P0_CTRL_0, u32dat);
+
+    aml_readReg(unit, RG_RATE_ADAPT_CTRL_0, &u32dat);
+    u32dat |= BIT(0);
+    u32dat |= BIT(4);
+    u32dat |= BITS(26, 27);
+    aml_writeReg(unit, RG_RATE_ADAPT_CTRL_0, u32dat);
+
+    /* Disable AN */
+    aml_readReg(unit, SGMII_REG_AN0, &u32dat);
+    u32dat &= ~BIT(12);
+    aml_writeReg(unit, SGMII_REG_AN0, u32dat);
+
+    /* Force Speed */
+    aml_readReg(unit, SGMII_STS_CTRL_0, &u32dat);
+    u32dat |= BIT(2);
+    u32dat |= BITS(4, 5);
+    aml_writeReg(unit, SGMII_STS_CTRL_0, u32dat);
+
+    /* bypass flow control to MAC */
+    aml_writeReg(unit, MSG_RX_LIK_STS_0, 0x01010107);
+    aml_writeReg(unit, MSG_RX_LIK_STS_2, 0x00000EEF);
+
+    return ret;
+}
+
+/* FUNCTION NAME: air_port_setSgmiiMode
+ * PURPOSE:
+ *      Set the port5 SGMII mode for AN or force
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      mode            --  AIR_PORT_SGMII_MODE_AN
+ *                          AIR_PORT_SGMII_MODE_FORCE
+ *      speed           --  AIR_PORT_SPEED_10M:   10Mbps
+ *                          AIR_PORT_SPEED_100M:  100Mbps
+ *                          AIR_PORT_SPEED_1000M: 1Gbps
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_setSgmiiMode(
+    const UI32_T unit,
+    const UI32_T mode,
+    const UI32_T speed)
+{
+    AIR_ERROR_NO_T ret = AIR_E_OK;
+    UI32_T u32dat = 0;
+
+    AIR_PARAM_CHK(((AIR_PORT_SGMII_MODE_AN != mode) && (AIR_PORT_SGMII_MODE_FORCE != mode)), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((speed >= AIR_PORT_SPEED_2500M), AIR_E_BAD_PARAMETER);
+
+    /* PMA Init */
+    /* PLL */
+    aml_readReg(unit, QP_DIG_MODE_CTRL_1, &u32dat);
+    u32dat &= ~BITS(2, 3);
+    aml_writeReg(unit, QP_DIG_MODE_CTRL_1, u32dat);
+
+    /* PLL - LPF */
+    aml_readReg(unit, PLL_CTRL_2, &u32dat);
+    u32dat &= ~(0x3 << 0);
+    u32dat |= (0x1 << 0);
+    u32dat &= ~(0x7 << 2);
+    u32dat |= (0x5 << 2);
+    u32dat &= ~BITS(6, 7);
+    u32dat &= ~(0x7 << 8);
+    u32dat |= (0x3 << 8);
+    u32dat |= BIT(29);
+    u32dat &= ~BITS(12, 13);
+    aml_writeReg(unit, PLL_CTRL_2, u32dat);
+
+    /* PLL - ICO */
+    aml_readReg(unit, PLL_CTRL_4, &u32dat);
+    u32dat |= BIT(2);
+    aml_writeReg(unit, PLL_CTRL_4, u32dat);
+
+    aml_readReg(unit, PLL_CTRL_2, &u32dat);
+    u32dat &= ~BIT(14);
+    aml_writeReg(unit, PLL_CTRL_2, u32dat);
+
+    /* PLL - CHP */
+    aml_readReg(unit, PLL_CTRL_2, &u32dat);
+    u32dat &= ~(0xf << 16);
+    u32dat |= (0x4 << 16);
+    aml_writeReg(unit, PLL_CTRL_2, u32dat);
+
+
+    /* PLL - PFD */
+    aml_readReg(unit, PLL_CTRL_2, &u32dat);
+    u32dat &= ~(0x3 << 20);
+    u32dat |= (0x1 << 20);
+    u32dat &= ~(0x3 << 24);
+    u32dat |= (0x1 << 24);
+    u32dat &= ~BIT(26);
+    aml_writeReg(unit, PLL_CTRL_2, u32dat);
+
+    /* PLL - POSTDIV */
+    aml_readReg(unit, PLL_CTRL_2, &u32dat);
+    u32dat |= BIT(22);
+    u32dat &= ~BIT(27);
+    u32dat &= ~BIT(28);
+    aml_writeReg(unit, PLL_CTRL_2, u32dat);
+
+    /* PLL - SDM */
+    aml_readReg(unit, PLL_CTRL_4, &u32dat);
+    u32dat &= ~BITS(3, 4);
+    aml_writeReg(unit, PLL_CTRL_4, u32dat);
+
+    aml_readReg(unit, PLL_CTRL_2, &u32dat);
+    u32dat &= ~BIT(30);
+    aml_writeReg(unit, PLL_CTRL_2, u32dat);
+
+    aml_readReg(unit, SS_LCPLL_PWCTL_SETTING_2, &u32dat);
+    u32dat &= ~(0x3 << 16);
+    u32dat |= (0x1 << 16);
+    aml_writeReg(unit, SS_LCPLL_PWCTL_SETTING_2, u32dat);
+
+    aml_writeReg(unit, SS_LCPLL_TDC_FLT_2, 0x48000000);
+    aml_writeReg(unit, SS_LCPLL_TDC_PCW_1, 0x48000000);
+
+    aml_readReg(unit, SS_LCPLL_TDC_FLT_5, &u32dat);
+    u32dat &= ~BIT(24);
+    aml_writeReg(unit, SS_LCPLL_TDC_FLT_5, u32dat);
+
+    aml_readReg(unit, PLL_CK_CTRL_0, &u32dat);
+    u32dat &= ~BIT(8);
+    aml_writeReg(unit, PLL_CK_CTRL_0, u32dat);
+
+    /* PLL - SS */
+    aml_readReg(unit, PLL_CTRL_3, &u32dat);
+    u32dat &= ~BITS(0, 15);
+    aml_writeReg(unit, PLL_CTRL_3, u32dat);
+
+    aml_readReg(unit, PLL_CTRL_4, &u32dat);
+    u32dat &= ~BITS(0, 1);
+    aml_writeReg(unit, PLL_CTRL_4, u32dat);
+
+    aml_readReg(unit, PLL_CTRL_3, &u32dat);
+    u32dat &= ~BITS(16, 31);
+    aml_writeReg(unit, PLL_CTRL_3, u32dat);
+
+    /* PLL - TDC */
+    aml_readReg(unit, PLL_CK_CTRL_0, &u32dat);
+    u32dat &= ~BIT(9);
+    aml_writeReg(unit, PLL_CK_CTRL_0, u32dat);
+
+    aml_readReg(unit, RG_QP_PLL_SDM_ORD, &u32dat);
+    u32dat |= BIT(3);
+    u32dat |= BIT(4);
+    aml_writeReg(unit, RG_QP_PLL_SDM_ORD, u32dat);
+
+    aml_readReg(unit, RG_QP_RX_DAC_EN, &u32dat);
+    u32dat &= ~(0x3 << 16);
+    u32dat |= (0x2 << 16);
+    aml_writeReg(unit, RG_QP_RX_DAC_EN, u32dat);
+
+    /* PLL - TCL Disable (only for Co-SIM) */
+    aml_readReg(unit, PON_RXFEDIG_CTRL_0, &u32dat);
+    u32dat &= ~BIT(12);
+    aml_writeReg(unit, PON_RXFEDIG_CTRL_0, u32dat);
+
+    /* TX Init */
+    aml_readReg(unit, RG_QP_TX_MODE_16B_EN, &u32dat);
+    u32dat &= ~BIT(0);
+    u32dat &= ~BITS(16, 31);
+    aml_writeReg(unit, RG_QP_TX_MODE_16B_EN, u32dat);
+
+    /* RX Init */
+    aml_readReg(unit, RG_QP_RXAFE_RESERVE, &u32dat);
+    u32dat |= BIT(11);
+    aml_writeReg(unit, RG_QP_RXAFE_RESERVE, u32dat);
+
+    aml_readReg(unit, RG_QP_CDR_LPF_MJV_LIM, &u32dat);
+    u32dat &= ~(0x3 << 4);
+    u32dat |= (0x2 << 4);
+    aml_writeReg(unit, RG_QP_CDR_LPF_MJV_LIM, u32dat);
+
+    aml_readReg(unit, RG_QP_CDR_LPF_SETVALUE, &u32dat);
+    u32dat &= ~(0xf << 25);
+    u32dat |= (0x1 << 25);
+    u32dat &= ~(0x7 << 29);
+    u32dat |= (0x6 << 29);
+    aml_writeReg(unit, RG_QP_CDR_LPF_SETVALUE, u32dat);
+
+    aml_readReg(unit, RG_QP_CDR_PR_CKREF_DIV1, &u32dat);
+    u32dat &= ~(0x1f << 8);
+    u32dat |= (0xc << 8);
+    aml_writeReg(unit, RG_QP_CDR_PR_CKREF_DIV1, u32dat);
+
+    aml_readReg(unit, RG_QP_CDR_PR_KBAND_DIV_PCIE, &u32dat);
+    u32dat &= ~(0x3f << 0);
+    u32dat |= (0x19 << 0);
+    u32dat &= ~BIT(6);
+    aml_writeReg(unit, RG_QP_CDR_PR_KBAND_DIV_PCIE, u32dat);
+
+    aml_readReg(unit, RG_QP_CDR_FORCE_IBANDLPF_R_OFF, &u32dat);
+    u32dat &= ~(0x7f << 6);
+    u32dat |= (0x21 << 6);
+    u32dat &= ~(0x3 << 16);
+    u32dat |= (0x2 << 16);
+    u32dat &= ~BIT(13);
+    aml_writeReg(unit, RG_QP_CDR_FORCE_IBANDLPF_R_OFF, u32dat);
+
+    aml_readReg(unit, RG_QP_CDR_PR_KBAND_DIV_PCIE, &u32dat);
+    u32dat &= ~BIT(30);
+    aml_writeReg(unit, RG_QP_CDR_PR_KBAND_DIV_PCIE, u32dat);
+
+    aml_readReg(unit, RG_QP_CDR_PR_CKREF_DIV1, &u32dat);
+    u32dat &= ~(0x7 << 24);
+    u32dat |= (0x4 << 24);
+    aml_writeReg(unit, RG_QP_CDR_PR_CKREF_DIV1, u32dat);
+
+    aml_readReg(unit, PLL_CTRL_0, &u32dat);
+    u32dat |= BIT(0);
+    aml_writeReg(unit, PLL_CTRL_0, u32dat);
+
+    aml_readReg(unit, RX_CTRL_26, &u32dat);
+    u32dat &= ~BIT(23);
+    if(AIR_PORT_SGMII_MODE_AN == mode)
+    {
+        u32dat |= BIT(26);
+    }
+    aml_writeReg(unit, RX_CTRL_26, u32dat);
+
+    aml_readReg(unit, RX_DLY_0, &u32dat);
+    u32dat &= ~(0xff << 0);
+    u32dat |= (0x6f << 0);
+    u32dat |= BITS(8, 13);
+    aml_writeReg(unit, RX_DLY_0, u32dat);
+
+    aml_readReg(unit, RX_CTRL_42, &u32dat);
+    u32dat &= ~(0x1fff << 0);
+    u32dat |= (0x150 << 0);
+    aml_writeReg(unit, RX_CTRL_42, u32dat);
+
+    aml_readReg(unit, RX_CTRL_2, &u32dat);
+    u32dat &= ~(0x1fff << 16);
+    u32dat |= (0x150 << 16);
+    aml_writeReg(unit, RX_CTRL_2, u32dat);
+
+    aml_readReg(unit, PON_RXFEDIG_CTRL_9, &u32dat);
+    u32dat &= ~(0x7 << 0);
+    u32dat |= (0x1 << 0);
+    aml_writeReg(unit, PON_RXFEDIG_CTRL_9, u32dat);
+
+    aml_readReg(unit, RX_CTRL_8, &u32dat);
+    u32dat &= ~(0xfff << 16);
+    u32dat |= (0x200 << 16);
+    u32dat &= ~(0x7fff << 0);
+    u32dat |= (0xfff << 0);
+    aml_writeReg(unit, RX_CTRL_8, u32dat);
+
+    /* Frequency memter */
+    aml_readReg(unit, RX_CTRL_5, &u32dat);
+    u32dat &= ~(0xfffff << 10);
+    u32dat |= (0x28 << 10);
+    aml_writeReg(unit, RX_CTRL_5, u32dat);
+
+    aml_readReg(unit, RX_CTRL_6, &u32dat);
+    u32dat &= ~(0xfffff << 0);
+    u32dat |= (0x64 << 0);
+    aml_writeReg(unit, RX_CTRL_6, u32dat);
+
+    aml_readReg(unit, RX_CTRL_7, &u32dat);
+    u32dat &= ~(0xfffff << 0);
+    u32dat |= (0x2710 << 0);
+    aml_writeReg(unit, RX_CTRL_7, u32dat);
+
+    if(AIR_PORT_SGMII_MODE_FORCE == mode)
+    {
+        /* PCS Init */
+        aml_readReg(unit, QP_DIG_MODE_CTRL_0, &u32dat);
+        u32dat &= ~BIT(0);
+        if(AIR_PORT_SPEED_1000M == speed)
+        {
+            u32dat &= ~BITS(4, 5);
+        }
+        else if(AIR_PORT_SPEED_100M == speed)
+        {
+            u32dat &= ~(0x3 << 4);
+            u32dat |= (0x1 << 4);
+        }
+        else
+        {
+            u32dat &= ~(0x3 << 4);
+            u32dat |= (0x2 << 4);
+        }
+        aml_writeReg(unit, QP_DIG_MODE_CTRL_0, u32dat);
+
+        aml_readReg(unit, RG_HSGMII_PCS_CTROL_1, &u32dat);
+        u32dat &= ~BIT(30);
+        aml_writeReg(unit, RG_HSGMII_PCS_CTROL_1, u32dat);
+
+        /* Rate Adaption - GMII path config. */
+        aml_readReg(unit, RG_AN_SGMII_MODE_FORCE, &u32dat);
+        u32dat |= BIT(0);
+        if(AIR_PORT_SPEED_1000M == speed)
+        {
+            u32dat &= ~BITS(4, 5);
+        }
+        else if(AIR_PORT_SPEED_100M == speed)
+        {
+            u32dat &= ~(0x3 << 4);
+            u32dat |= (0x1 << 4);
+        }
+        else
+        {
+            u32dat &= ~(0x3 << 4);
+            u32dat |= (0x2 << 4);
+        }
+        aml_writeReg(unit, RG_AN_SGMII_MODE_FORCE, u32dat);
+
+        aml_readReg(unit, SGMII_STS_CTRL_0, &u32dat);
+        u32dat |= BIT(2);
+        if(AIR_PORT_SPEED_1000M == speed)
+        {
+            u32dat &= ~(0x3 << 4);
+            u32dat |= (0x2 << 4);
+        }
+        else if(AIR_PORT_SPEED_100M == speed)
+        {
+            u32dat &= ~(0x3 << 4);
+            u32dat |= (0x1 << 4);
+        }
+        else
+        {
+            u32dat &= ~BITS(4, 5);
+        }
+        aml_writeReg(unit, SGMII_STS_CTRL_0, u32dat);
+
+        aml_readReg(unit, SGMII_REG_AN0, &u32dat);
+        u32dat &= ~BIT(12);
+        aml_writeReg(unit, SGMII_REG_AN0, u32dat);
+
+        aml_readReg(unit, PHY_RX_FORCE_CTRL_0, &u32dat);
+        u32dat |= BIT(4);
+        aml_writeReg(unit, PHY_RX_FORCE_CTRL_0, u32dat);
+
+        aml_readReg(unit, RATE_ADP_P0_CTRL_0, &u32dat);
+        if(AIR_PORT_SPEED_1000M == speed)
+        {
+            u32dat &= ~BITS(0, 3);
+        }
+        else if(AIR_PORT_SPEED_100M == speed)
+        {
+            u32dat &= ~(0xf << 0);
+            u32dat |= (0xc << 0);
+        }
+        else
+        {
+            u32dat |= BITS(0, 3);
+        }
+        u32dat |= BIT(28);
+        aml_writeReg(unit, RATE_ADP_P0_CTRL_0, u32dat);
+
+        aml_readReg(unit, RG_RATE_ADAPT_CTRL_0, &u32dat);
+        u32dat |= BIT(0);
+        u32dat |= BIT(4);
+        if(AIR_PORT_SPEED_1000M == speed)
+        {
+            u32dat |= BITS(26, 27);
+        }
+        else
+        {
+            u32dat &= ~BITS(26, 27);
+        }
+        aml_writeReg(unit, RG_RATE_ADAPT_CTRL_0, u32dat);
+
+    }
+    else
+    {
+        /* PCS Init */
+        aml_readReg(unit, RG_HSGMII_PCS_CTROL_1, &u32dat);
+        u32dat &= ~BIT(30);
+        aml_writeReg(unit, RG_HSGMII_PCS_CTROL_1, u32dat);
+
+        /* Set AN Ability - Interrupt */
+        aml_readReg(unit, SGMII_REG_AN_FORCE_CL37, &u32dat);
+        u32dat |= BIT(0);
+        aml_writeReg(unit, SGMII_REG_AN_FORCE_CL37, u32dat);
+
+        aml_readReg(unit, SGMII_REG_AN_13, &u32dat);
+        u32dat &= ~(0x3f << 0);
+        u32dat |= (0xb << 0);
+        u32dat |= BIT(8);
+        aml_writeReg(unit, SGMII_REG_AN_13, u32dat);
+
+        /* Rate Adaption - GMII path config. */
+        aml_readReg(unit, SGMII_REG_AN0, &u32dat);
+        u32dat |= BIT(12);
+        aml_writeReg(unit, SGMII_REG_AN0, u32dat);
+
+        aml_readReg(unit, MII_RA_AN_ENABLE, &u32dat);
+        u32dat |= BIT(0);
+        aml_writeReg(unit, MII_RA_AN_ENABLE, u32dat);
+
+        aml_readReg(unit, RATE_ADP_P0_CTRL_0, &u32dat);
+        u32dat |= BIT(28);
+        aml_writeReg(unit, RATE_ADP_P0_CTRL_0, u32dat);
+
+        aml_readReg(unit, RG_RATE_ADAPT_CTRL_0, &u32dat);
+        u32dat |= BIT(0);
+        u32dat |= BIT(4);
+        u32dat |= BITS(26, 27);
+        aml_writeReg(unit, RG_RATE_ADAPT_CTRL_0, u32dat);
+
+        /* Only for Co-SIM */
+
+        /* AN Speed up (Only for Co-SIM) */
+
+        /* Restart AN */
+        aml_readReg(unit, SGMII_REG_AN0, &u32dat);
+        u32dat |= BIT(9);
+        u32dat |= BIT(15);
+        aml_writeReg(unit, SGMII_REG_AN0, u32dat);
+    }
+
+    /* bypass flow control to MAC */
+    aml_writeReg(unit, MSG_RX_LIK_STS_0, 0x01010107);
+    aml_writeReg(unit, MSG_RX_LIK_STS_2, 0x00000EEF);
+
+    return ret;
+}
+
+/* FUNCTION NAME: air_port_setRmiiMode
+ * PURPOSE:
+ *      Set the port5 RMII mode for 100Mbps or 10Mbps
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      speed           --  AIR_PORT_SPEED_10M:  10Mbps
+ *                          AIR_PORT_SPEED_100M: 100Mbps
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_setRmiiMode(
+    const UI32_T unit,
+    const UI32_T speed)
+{
+    AIR_ERROR_NO_T ret = AIR_E_OK;
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing for speed checking */
+    AIR_PARAM_CHK((speed >= AIR_PORT_SPEED_1000M), AIR_E_BAD_PARAMETER);
+
+    if(AIR_PORT_SPEED_100M == speed)
+    {
+        aml_writeReg(unit, PMCR(5), 0x93159000);
+        aml_writeReg(unit, RG_P5MUX_MODE, 0x301);
+        aml_writeReg(unit, RG_FORCE_CKDIR_SEL, 0x101);
+        aml_writeReg(unit, RG_SWITCH_MODE, 0x101);
+        aml_writeReg(unit, RG_FORCE_MAC5_SB, 0x1010101);
+        aml_writeReg(unit, CSR_RMII, 0x420102);
+        aml_writeReg(unit, RG_RGMII_TXCK_C, 0x1100910);
+    }
+    else
+    {
+        aml_writeReg(unit, PMCR(5), 0x83159000);
+        aml_writeReg(unit, RG_P5MUX_MODE, 0x301);
+        aml_writeReg(unit, RG_FORCE_CKDIR_SEL, 0x101);
+        aml_writeReg(unit, RG_SWITCH_MODE, 0x101);
+        aml_writeReg(unit, RG_FORCE_MAC5_SB, 0x1000101);
+        aml_writeReg(unit, CSR_RMII, 0x420102);
+        aml_writeReg(unit, RG_RGMII_TXCK_C, 0x1100910);
+    }
+
+    return ret;
+}
+
+/* FUNCTION NAME: air_port_setRgmiiMode
+ * PURPOSE:
+ *      Set the port5 RGMII mode for 1Gbps or 100Mbps or 10Mbps
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      speed           --  AIR_PORT_SPEED_10M:   10Mbps
+ *                          AIR_PORT_SPEED_100M:  100Mbps
+ *                          AIR_PORT_SPEED_1000M: 1Gbps
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_port_setRgmiiMode(
+    const UI32_T unit,
+    const UI32_T speed)
+{
+    AIR_ERROR_NO_T ret = AIR_E_OK;
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing for speed checking */
+    AIR_PARAM_CHK((speed >= AIR_PORT_SPEED_2500M), AIR_E_BAD_PARAMETER);
+
+    if(AIR_PORT_SPEED_1000M == speed)
+    {
+        aml_writeReg(unit, PMCR(5), 0xa3159000);
+        aml_writeReg(unit, RG_FORCE_MAC5_SB, 0x20101);
+    }
+    else if(AIR_PORT_SPEED_100M == speed)
+    {
+        aml_writeReg(unit, PMCR(5), 0x93159000);
+        aml_writeReg(unit, RG_FORCE_MAC5_SB, 0x10101);
+    }
+    else
+    {
+        aml_writeReg(unit, PMCR(5), 0x83159000);
+        aml_writeReg(unit, RG_FORCE_MAC5_SB, 0x101);
+    }
+
+    return ret;
+}
+
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_qos.c b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_qos.c
new file mode 100644
index 0000000..c3829c8
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_qos.c
@@ -0,0 +1,1495 @@
+/* FILE NAME: air_qos.c
+ * PURPOSE:
+ *      Define the Quailty of Service function in AIR SDK.
+ *
+ * NOTES:
+ *      None
+ */
+
+ /* INCLUDE FILE DECLARATIONS
+ */
+#include "air.h"
+
+/* NAMING CONSTANT DECLARATIONS
+ */
+
+/* MACRO FUNCTION DECLARATIONS
+ */
+
+/* DATA TYPE DECLARATIONS
+ */
+
+/* GLOBAL VARIABLE DECLARATIONS
+ */
+
+/* LOCAL SUBPROGRAM DECLARATIONS
+ */
+
+/* STATIC VARIABLE DECLARATIONS
+ */
+
+/* LOCAL SUBPROGRAM BODIES
+ */
+
+/* EXPORTED SUBPROGRAM BODIES
+ */
+
+/* FUNCTION NAME:   air_qos_setScheduleAlgo
+ * PURPOSE:
+ *      Set schedule mode of a port queue.
+ * INPUT:
+ *      unit                 -- Device unit number
+ *      port                 -- Port id
+ *      queue                -- Queue id
+ *      sch_mode             -- AIR_QOS_SCH_MODE_T
+ *      weight               -- weight for WRR/WFQ
+ * OUTPUT:
+ *      None
+ * RETURN:
+ *      AIR_E_OK             -- Operation success.
+ *      AIR_E_BAD_PARAMETER  -- Parameter is wrong.
+ * NOTES:
+ *      Weight default value is 1, only for WRR/WFQ mode
+ */
+AIR_ERROR_NO_T
+air_qos_setScheduleAlgo(
+    const UI32_T unit,
+    const UI32_T port,
+    const UI32_T                queue,
+    const AIR_QOS_SCH_MODE_T    sch_mode,
+    const UI32_T                weight)
+{
+    UI32_T rc = AIR_E_OK;
+    UI32_T mac_port = 0;
+    AIR_QOS_SHAPER_MIN_T min_v;
+    AIR_QOS_SHAPER_MAX_T max_v;
+
+    /* Check parameter */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((queue >= AIR_QOS_QUEUE_MAX_NUM), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((sch_mode >= AIR_QOS_SCH_MODE_LAST), AIR_E_BAD_PARAMETER);
+    if (AIR_QOS_SHAPER_NOSETTING != weight)
+    {
+        AIR_PARAM_CHK(((weight >  AIR_QOS_SHAPER_RATE_MAX_WEIGHT) || 
+            (weight <  AIR_QOS_SHAPER_RATE_MIN_WEIGHT)), AIR_E_BAD_PARAMETER);
+    }
+    mac_port = port;
+    min_v.byte = 0;
+    max_v.byte = 0;
+     /*Read register data*/
+    switch(queue)
+    {
+        case AIR_QOS_QUEUE_0:
+            rc += aml_readReg(unit, MMSCR0_Q0(mac_port), &min_v.byte);
+            rc += aml_readReg(unit, MMSCR1_Q0(mac_port), &max_v.byte);
+            if(AIR_E_OK != rc)
+            {
+                AIR_PRINT("Get port %d queue %d failed, rc is %d", port, queue, rc);
+                return AIR_E_OTHERS;
+            }
+            break;
+
+        case AIR_QOS_QUEUE_1:
+            rc += aml_readReg(unit, MMSCR0_Q1(mac_port), &min_v.byte);
+            rc += aml_readReg(unit, MMSCR1_Q1(mac_port), &max_v.byte);
+            if(AIR_E_OK != rc)
+            {
+                AIR_PRINT("Get port %d queue %d failed, rc is %d", port, queue, rc);
+                return AIR_E_OTHERS;
+            }
+            break;
+
+        case AIR_QOS_QUEUE_2:
+            rc += aml_readReg(unit, MMSCR0_Q2(mac_port), &min_v.byte);
+            rc += aml_readReg(unit, MMSCR1_Q2(mac_port), &max_v.byte);
+            if(AIR_E_OK != rc)
+            {
+                AIR_PRINT("Get port %d queue %d failed, rc is %d", port, queue, rc);
+                return AIR_E_OTHERS;
+            }
+            break;
+
+        case AIR_QOS_QUEUE_3:
+            rc += aml_readReg(unit, MMSCR0_Q3(mac_port), &min_v.byte);
+            rc += aml_readReg(unit, MMSCR1_Q3(mac_port), &max_v.byte);
+            if(AIR_E_OK != rc)
+            {
+                AIR_PRINT("Get port %d queue %d failed, rc is %d", port, queue, rc);
+                return AIR_E_OTHERS;
+            }
+            break;
+
+        case AIR_QOS_QUEUE_4:
+            rc += aml_readReg(unit, MMSCR0_Q4(mac_port), &min_v.byte);
+            rc += aml_readReg(unit, MMSCR1_Q4(mac_port), &max_v.byte);
+            if(AIR_E_OK != rc)
+            {
+                AIR_PRINT("Get port %d queue %d failed, rc is %d", port, queue, rc);
+                return AIR_E_OTHERS;
+            }
+            break;
+
+        case AIR_QOS_QUEUE_5:
+            rc += aml_readReg(unit, MMSCR0_Q5(mac_port), &min_v.byte);
+            rc += aml_readReg(unit, MMSCR1_Q5(mac_port), &max_v.byte);
+            if(AIR_E_OK != rc)
+            {
+                AIR_PRINT("Get port %d queue %d failed, rc is %d", port, queue, rc);
+                return AIR_E_OTHERS;
+            }
+            break;
+
+        case AIR_QOS_QUEUE_6:
+            rc += aml_readReg(unit, MMSCR0_Q6(mac_port), &min_v.byte);
+            rc += aml_readReg(unit, MMSCR1_Q6(mac_port), &max_v.byte);
+            if(AIR_E_OK != rc)
+            {
+                AIR_PRINT("Get port %d queue %d failed, rc is %d", port, queue, rc);
+                return AIR_E_OTHERS;
+            }
+            break;
+
+        case AIR_QOS_QUEUE_7:
+            rc += aml_readReg(unit, MMSCR0_Q7(mac_port), &min_v.byte);
+            rc += aml_readReg(unit, MMSCR1_Q7(mac_port), &max_v.byte);
+            if(AIR_E_OK != rc)
+            {
+                AIR_PRINT("Get port %d queue %d failed, rc is %d", port, queue, rc);
+                return AIR_E_OTHERS;
+            }
+            break;
+
+        default:
+            AIR_PRINT("Not Support this queue %d num, please check again\n", queue);
+            return AIR_E_BAD_PARAMETER;
+    }
+
+    /*Get para*/
+    switch(sch_mode)
+    {
+        case AIR_QOS_SCH_MODE_SP:
+            min_v.raw.min_sp_wrr_q = 1;
+            min_v.raw.min_rate_en = 0;
+            break;
+
+        case AIR_QOS_SCH_MODE_WRR:
+            min_v.raw.min_sp_wrr_q = 0;
+            min_v.raw.min_rate_en = 0;
+            min_v.raw.min_weight = weight - 1;
+            break;
+
+        case AIR_QOS_SCH_MODE_WFQ:
+            min_v.raw.min_sp_wrr_q = 1;
+            min_v.raw.min_rate_en = 1;
+            min_v.raw.min_rate_man = 0;
+            min_v.raw.min_rate_exp = 0;
+
+            max_v.raw.max_rate_en = 0;
+            max_v.raw.max_sp_wfq_q = 0;
+            max_v.raw.max_weight = weight - 1;
+            break;
+        default:
+            AIR_PRINT("Not Support this mode %d num, please check again\n", sch_mode);
+            return AIR_E_BAD_PARAMETER;
+    }
+
+    /*Send to driver*/
+    switch(queue)
+    {
+        case AIR_QOS_QUEUE_0:
+            rc += aml_writeReg(unit, MMSCR0_Q0(mac_port), min_v.byte);
+            rc += aml_writeReg(unit, MMSCR1_Q0(mac_port), max_v.byte);
+            if(AIR_E_OK != rc)
+            {
+                AIR_PRINT("Set port %d queue %d failed, rc is %d", port, queue, rc);
+                return AIR_E_OTHERS;
+            }
+            break;
+
+        case AIR_QOS_QUEUE_1:
+            rc += aml_writeReg(unit, MMSCR0_Q1(mac_port), min_v.byte);
+            rc += aml_writeReg(unit, MMSCR1_Q1(mac_port), max_v.byte);
+            if(AIR_E_OK != rc)
+            {
+                AIR_PRINT("Set port %d queue %d failed, rc is %d", port, queue, rc);
+                return AIR_E_OTHERS;
+            }
+            break;
+
+        case AIR_QOS_QUEUE_2:
+            rc += aml_writeReg(unit, MMSCR0_Q2(mac_port), min_v.byte);
+            rc += aml_writeReg(unit, MMSCR1_Q2(mac_port), max_v.byte);
+            if(AIR_E_OK != rc)
+            {
+                AIR_PRINT("Set port %d queue %d failed, rc is %d", port, queue, rc);
+                return AIR_E_OTHERS;
+            }
+            break;
+
+        case AIR_QOS_QUEUE_3:
+            rc += aml_writeReg(unit, MMSCR0_Q3(mac_port), min_v.byte);
+            rc += aml_writeReg(unit, MMSCR1_Q3(mac_port), max_v.byte);
+            if(AIR_E_OK != rc)
+            {
+                AIR_PRINT("Set port %d queue %d failed, rc is %d", port, queue, rc);
+                return AIR_E_OTHERS;
+            }
+            break;
+
+        case AIR_QOS_QUEUE_4:
+            rc += aml_writeReg(unit, MMSCR0_Q4(mac_port), min_v.byte);
+            rc += aml_writeReg(unit, MMSCR1_Q4(mac_port), max_v.byte);
+            if(AIR_E_OK != rc)
+            {
+                AIR_PRINT("Set port %d queue %d failed, rc is %d", port, queue, rc);
+                return AIR_E_OTHERS;
+            }
+            break;
+
+        case AIR_QOS_QUEUE_5:
+            rc += aml_writeReg(unit, MMSCR0_Q5(mac_port), min_v.byte);
+            rc += aml_writeReg(unit, MMSCR1_Q5(mac_port), max_v.byte);
+            if(AIR_E_OK != rc)
+            {
+                AIR_PRINT("Set port %d queue %d failed, rc is %d", port, queue, rc);
+                return AIR_E_OTHERS;
+            }
+            break;
+
+        case AIR_QOS_QUEUE_6:
+            rc += aml_writeReg(unit, MMSCR0_Q6(mac_port), min_v.byte);
+            rc += aml_writeReg(unit, MMSCR1_Q6(mac_port), max_v.byte);
+            if(AIR_E_OK != rc)
+            {
+                AIR_PRINT("Set port %d queue %d failed, rc is %d", port, queue, rc);
+                return AIR_E_OTHERS;
+            }
+            break;
+
+        case AIR_QOS_QUEUE_7:
+            rc += aml_writeReg(unit, MMSCR0_Q7(mac_port), min_v.byte);
+            rc += aml_writeReg(unit, MMSCR1_Q7(mac_port), max_v.byte);
+            if(AIR_E_OK != rc)
+            {
+                AIR_PRINT("Set port %d queue %d failed, rc is %d", port, queue, rc);
+                return AIR_E_OTHERS;
+            }
+            break;
+
+        default:
+            AIR_PRINT("Not Support this queue %d num, please check again\n", queue);
+            return AIR_E_BAD_PARAMETER;
+    }
+    AIR_PRINT("Set schedule mode success,port is %d, queue is %d, min hex is %x, max hex is %x\n", port, queue, min_v.byte, max_v.byte);
+
+    return rc;
+}
+
+/* FUNCTION NAME: air_qos_getScheduleAlgo
+ * PURPOSE:
+ *      Get schedule mode of a port queue.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Port id
+ *      queue           --  Queue id
+ * OUTPUT:
+ *      ptr_sch_mode    --  AIR_QOS_SCH_MODE_T
+ *      ptr_weight      --  weight for WRR/WFQ
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *     None
+ */
+AIR_ERROR_NO_T
+air_qos_getScheduleAlgo(
+    const UI32_T          unit,
+    const UI32_T          port,
+    const UI32_T          queue,
+    AIR_QOS_SCH_MODE_T    *ptr_sch_mode,
+    UI32_T                *ptr_weight)
+{
+    UI32_T rc = AIR_E_OK;
+    UI32_T mac_port = 0;
+    AIR_QOS_SHAPER_MIN_T min_v;
+    AIR_QOS_SHAPER_MAX_T max_v;
+
+    /*Read register data*/
+    /* Check parameter */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((queue >= AIR_QOS_QUEUE_MAX_NUM), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_sch_mode);
+    AIR_CHECK_PTR(ptr_weight);
+    
+    mac_port = port;
+    min_v.byte = 0;
+    max_v.byte = 0;
+
+    switch(queue)
+    {
+        case AIR_QOS_QUEUE_0:
+            rc += aml_readReg(unit, MMSCR0_Q0(mac_port), &min_v.byte);
+            rc += aml_readReg(unit, MMSCR1_Q0(mac_port), &max_v.byte);
+            if(AIR_E_OK != rc)
+            {
+                AIR_PRINT("Get port %d queue %d failed, rc is %d", port, queue, rc);
+                return AIR_E_OTHERS;
+            }
+            break;
+
+        case AIR_QOS_QUEUE_1:
+            rc += aml_readReg(unit, MMSCR0_Q1(mac_port), &min_v.byte);
+            rc += aml_readReg(unit, MMSCR1_Q1(mac_port), &max_v.byte);
+            if(AIR_E_OK != rc)
+            {
+                AIR_PRINT("Get port %d queue %d failed, rc is %d", port, queue, rc);
+                return AIR_E_OTHERS;
+            }
+            break;
+
+        case AIR_QOS_QUEUE_2:
+            rc += aml_readReg(unit, MMSCR0_Q2(mac_port), &min_v.byte);
+            rc += aml_readReg(unit, MMSCR1_Q2(mac_port), &max_v.byte);
+            if(AIR_E_OK != rc)
+            {
+                AIR_PRINT("Get port %d queue %d failed, rc is %d", port, queue, rc);
+                return AIR_E_OTHERS;
+            }
+            break;
+
+        case AIR_QOS_QUEUE_3:
+            rc += aml_readReg(unit, MMSCR0_Q3(mac_port), &min_v.byte);
+            rc += aml_readReg(unit, MMSCR1_Q3(mac_port), &max_v.byte);
+            if(AIR_E_OK != rc)
+            {
+                AIR_PRINT("Get port %d queue %d failed, rc is %d", port, queue, rc);
+                return AIR_E_OTHERS;
+            }
+            break;
+
+        case AIR_QOS_QUEUE_4:
+            rc += aml_readReg(unit, MMSCR0_Q4(mac_port), &min_v.byte);
+            rc += aml_readReg(unit, MMSCR1_Q4(mac_port), &max_v.byte);
+            if(AIR_E_OK != rc)
+            {
+                AIR_PRINT("Get port %d queue %d failed, rc is %d", port, queue, rc);
+                return AIR_E_OTHERS;
+            }
+            break;
+
+        case AIR_QOS_QUEUE_5:
+            rc += aml_readReg(unit, MMSCR0_Q5(mac_port), &min_v.byte);
+            rc += aml_readReg(unit, MMSCR1_Q5(mac_port), &max_v.byte);
+            if(AIR_E_OK != rc)
+            {
+                AIR_PRINT("Get port %d queue %d failed, rc is %d", port, queue, rc);
+                return AIR_E_OTHERS;
+            }
+            break;
+
+        case AIR_QOS_QUEUE_6:
+            rc += aml_readReg(unit, MMSCR0_Q6(mac_port), &min_v.byte);
+            rc += aml_readReg(unit, MMSCR1_Q6(mac_port), &max_v.byte);
+            if(AIR_E_OK != rc)
+            {
+                AIR_PRINT("Get port %d queue %d failed, rc is %d", port, queue, rc);
+                return AIR_E_OTHERS;
+            }
+            break;
+
+        case AIR_QOS_QUEUE_7:
+            rc += aml_readReg(unit, MMSCR0_Q7(mac_port), &min_v.byte);
+            rc += aml_readReg(unit, MMSCR1_Q7(mac_port), &max_v.byte);
+            if(AIR_E_OK != rc)
+            {
+                AIR_PRINT("Get port %d queue %d failed, rc is %d", port, queue, rc);
+                return AIR_E_OTHERS;
+            }
+            break;
+
+        default:
+            AIR_PRINT("Not Support this queue %d num, please check again", queue);
+            return AIR_E_BAD_PARAMETER;
+    }
+
+    /*Send para*/
+    if ((min_v.raw.min_rate_en) && AIR_QOS_MAX_TRAFFIC_ARBITRATION_SCHEME_WFQ == max_v.raw.max_sp_wfq_q)
+    {
+        *ptr_sch_mode = AIR_QOS_SCH_MODE_WFQ;
+        *ptr_weight = max_v.raw.max_weight + 1;
+    }
+    else
+    {
+        if(AIR_QOS_MIN_TRAFFIC_ARBITRATION_SCHEME_WRR == min_v.raw.min_sp_wrr_q)
+        {
+            *ptr_sch_mode = AIR_QOS_SCH_MODE_WRR;
+            *ptr_weight = min_v.raw.min_weight + 1;
+        }
+        else if(AIR_QOS_MIN_TRAFFIC_ARBITRATION_SCHEME_SP == min_v.raw.min_sp_wrr_q)
+        {
+            *ptr_sch_mode = AIR_QOS_SCH_MODE_SP;
+            *ptr_weight = AIR_QOS_SHAPER_NOSETTING;
+        }
+    }
+    AIR_PRINT("Get schedule mode success,port is %d, queue is %d, min hex is %x, max hex is %x\n", port, queue, min_v.byte, max_v.byte);
+
+    return rc;
+}
+
+/* FUNCTION NAME:   air_qos_setTrustMode
+ * PURPOSE:
+ *      Set qos trust mode value.
+ * INPUT:
+ *      unit                 -- Device unit number
+ *      port                  -.Select port number
+ *      mode                 -- Qos support mode
+ *                              AIR_QOS_TRUST_MODE_T
+ * OUTPUT:
+ *      None
+ * RETURN:
+ *      AIR_E_OK             -- Operation success.
+ *      AIR_E_BAD_PARAMETER  -- Parameter is wrong.
+ * NOTES:
+ *      None
+ */
+
+AIR_ERROR_NO_T
+air_qos_setTrustMode(
+    const UI32_T                    unit,
+    const UI32_T                    port,
+    const AIR_QOS_TRUST_MODE_T      mode)
+
+{
+    UI32_T rc = AIR_E_OTHERS;
+    AIR_QOS_QUEUE_UPW_T stat;
+
+    /* Check parameter */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((mode >= AIR_QOS_TRUST_MODE_LAST), AIR_E_BAD_PARAMETER);
+
+    stat.byte = 0;
+    /*get register val*/
+    rc = aml_readReg(unit, PUPW(port), &(stat.byte));
+    AIR_PRINT("[Dbg]: get port %d rate trust weight success, UPW hex is %x\n", port, stat.byte);
+    stat.byte = AIR_QOS_QUEUE_DEFAULT_VAL;
+    if(AIR_E_OK == rc)
+    {
+        switch(mode)
+        {
+            case AIR_QOS_TRUST_MODE_PORT:
+                stat.raw.csr_port_weight = AIR_QOS_QUEUE_TRUST_HIGH_WEIGHT;
+                break;
+
+            case AIR_QOS_TRUST_MODE_1P_PORT:
+                stat.raw.csr_1p_weight = AIR_QOS_QUEUE_TRUST_HIGH_WEIGHT;
+                stat.raw.csr_port_weight = AIR_QOS_QUEUE_TRUST_MID_WEIGHT;
+                break;
+
+            case AIR_QOS_TRUST_MODE_DSCP_PORT:
+                stat.raw.csr_dscp_weight = AIR_QOS_QUEUE_TRUST_HIGH_WEIGHT;
+                stat.raw.csr_port_weight = AIR_QOS_QUEUE_TRUST_MID_WEIGHT;
+                break;
+
+            case AIR_QOS_TRUST_MODE_DSCP_1P_PORT:
+                stat.raw.csr_dscp_weight = AIR_QOS_QUEUE_TRUST_HIGH_WEIGHT;
+                stat.raw.csr_1p_weight = AIR_QOS_QUEUE_TRUST_MID_WEIGHT;
+                stat.raw.csr_port_weight = AIR_QOS_QUEUE_TRUST_LOW_WEIGHT;
+                break;
+
+            default:
+                AIR_PRINT("Not Support this mode %d yet\n", mode);
+                return AIR_E_BAD_PARAMETER;
+
+        }
+    }
+
+    /*set register val*/
+    rc = aml_writeReg(unit, PUPW(port), stat.byte);
+    if(AIR_E_OK != rc)
+    {
+        AIR_PRINT("[Dbg]: set port %d rate trust mode failed  rc is %d\n", port, rc);
+    }
+    else
+    {
+        AIR_PRINT("[Dbg]: set port %d rate trust mode %d weight success, UPW hex is %x\n", port, mode, stat.byte);
+    }
+    return rc;
+}
+
+/* FUNCTION NAME: air_qos_getTrustMode
+ * PURPOSE:
+ *      Get qos trust mode value.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port              -.Select port number
+ * OUTPUT:
+ *      ptr_weight      --  All Qos weight value
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_qos_getTrustMode(
+    const UI32_T unit,
+    const UI32_T                    port,
+    AIR_QOS_TRUST_MODE_T *const ptr_mode)
+
+{
+    UI32_T rc = AIR_E_OTHERS;
+    AIR_QOS_QUEUE_UPW_T stat;
+
+    /* Check parameter */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_mode);
+
+    /*get register val*/
+    stat.byte = 0;
+    *ptr_mode = AIR_QOS_TRUST_MODE_1P_PORT;
+    rc = aml_readReg(unit, PUPW(port), &(stat.byte));
+    if(AIR_E_OK != rc)
+    {
+        AIR_PRINT("[Dbg]: get port %d rate trust mode failed  rc is %d\n",port, rc);
+    }
+    else
+    {
+        if (AIR_QOS_QUEUE_TRUST_HIGH_WEIGHT == stat.raw.csr_1p_weight)
+        {
+            *ptr_mode = AIR_QOS_TRUST_MODE_1P_PORT;
+        }
+        else if (AIR_QOS_QUEUE_TRUST_HIGH_WEIGHT == stat.raw.csr_dscp_weight)
+        {
+            if (AIR_QOS_QUEUE_TRUST_MID_WEIGHT == stat.raw.csr_1p_weight)
+            {
+                *ptr_mode = AIR_QOS_TRUST_MODE_DSCP_1P_PORT;
+            }
+            else if (AIR_QOS_QUEUE_TRUST_MID_WEIGHT == stat.raw.csr_port_weight)
+            {
+                *ptr_mode = AIR_QOS_TRUST_MODE_DSCP_PORT;
+            }
+        }
+        else if (AIR_QOS_QUEUE_TRUST_HIGH_WEIGHT == stat.raw.csr_port_weight)
+        {
+            *ptr_mode = AIR_QOS_TRUST_MODE_PORT;
+        }
+        else
+        {
+            AIR_PRINT("[Dbg]: port %d Not support this trust mode, UPW hex is %x\n", port, stat.byte);
+        }
+    }
+    AIR_PRINT("[Dbg]: port %d get trust mode success, UPW hex is %x\n", port, stat.byte);
+    return rc;
+}
+
+/* FUNCTION NAME: air_qos_setPri2Queue
+ * PURPOSE:
+ *      Set per port priority to out queue.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      pri             --  Qos pri value
+ *      queue           --  Qos Queue value
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_qos_setPri2Queue(
+    const UI32_T unit,
+    const UI32_T pri,
+    const UI32_T queue)
+{
+    UI32_T rc = AIR_E_OTHERS;
+    AIR_QOS_QUEUE_PEM_T stat;
+
+    /* Check parameter */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((queue >= AIR_QOS_QUEUE_MAX_NUM), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((pri >= AIR_QOS_QUEUE_MAX_NUM), AIR_E_BAD_PARAMETER);
+
+    stat.byte = 0;
+    /*get register val*/
+    switch(pri / 2)
+    {
+        case 0:
+            rc = aml_readReg(unit, PEM1, &stat.byte);
+            if(AIR_E_OK == rc)
+            {
+                if (1 == pri % 2)
+                {
+                    stat.raw.csr_que_cpu_h = queue;
+                }
+                else
+                {
+                     stat.raw.csr_que_cpu_l = queue;
+                }
+            }
+            rc = aml_writeReg(unit, PEM1, stat.byte);
+            break;
+
+        case 1:
+            rc = aml_readReg(unit, PEM2, &stat.byte);
+            if(AIR_E_OK == rc)
+            {
+                if (1 == pri % 2)
+                {
+                    stat.raw.csr_que_cpu_h = queue;
+                }
+                else
+                {
+                    stat.raw.csr_que_cpu_l = queue;
+                }
+            }
+            rc = aml_writeReg(unit, PEM2, stat.byte);
+            break;
+
+        case 2:
+            rc = aml_readReg(unit, PEM3, &stat.byte);
+            if(AIR_E_OK == rc)
+            {
+                if (1 == pri % 2)
+                {
+                    stat.raw.csr_que_cpu_h = queue;
+                }
+                else
+                {
+                    stat.raw.csr_que_cpu_l = queue;
+                }
+            }
+            rc = aml_writeReg(unit, PEM3, stat.byte);
+            break;
+
+        case 3:
+            rc = aml_readReg(unit, PEM4, &stat.byte);
+            if(AIR_E_OK == rc)
+            {
+                if (1 == pri % 2)
+                {
+                    stat.raw.csr_que_cpu_h = queue;
+                }
+                else
+                {
+                    stat.raw.csr_que_cpu_l = queue;
+                }
+            }
+            rc = aml_writeReg(unit, PEM4, stat.byte);
+            break;
+
+        default:
+            AIR_PRINT("[Dbg]: Not Support this pri %d yet\n", pri);
+            return AIR_E_BAD_PARAMETER;
+    }
+    AIR_PRINT("[Dbg]: set pri %d to queue %d success, PEM hex is %x\n"
+        , pri, queue, stat.byte);
+    return rc;
+}
+
+/* FUNCTION NAME: air_qos_getPri2Queue
+ * PURPOSE:
+ *      Get per port priority to out queue.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      pri             --  Qos pri value
+ *
+ * OUTPUT:
+ *      ptr_queue       --  Select out queue (0..7)
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_qos_getPri2Queue(
+    const UI32_T unit,
+    const UI32_T pri,
+    UI32_T *const ptr_queue)
+{
+    UI32_T rc = AIR_E_OTHERS;
+    AIR_QOS_QUEUE_PEM_T stat;
+
+    /* Check parameter */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((pri >= AIR_QOS_QUEUE_MAX_NUM), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_queue);
+
+   /*get register val*/
+    stat.byte = 0;
+    switch(pri / 2)
+    {
+        case 0:
+            rc = aml_readReg(unit, PEM1, &stat.byte);
+            if(AIR_E_OK == rc)
+            {
+                if (1 == pri % 2)
+                {
+                    *ptr_queue = stat.raw.csr_que_cpu_h;
+                }
+                else
+                {
+                    *ptr_queue = stat.raw.csr_que_cpu_l;
+                }
+            }
+            break;
+
+        case 1:
+            rc = aml_readReg(unit, PEM2, &stat.byte);
+            if(AIR_E_OK == rc)
+            {
+                if (1 == pri % 2)
+                {
+                    *ptr_queue = stat.raw.csr_que_cpu_h;
+                }
+                else
+                {
+                    *ptr_queue = stat.raw.csr_que_cpu_l;
+                }
+            }
+            break;
+
+        case 2:
+            rc = aml_readReg(unit, PEM3, &stat.byte);
+            if(AIR_E_OK == rc)
+            {
+                if (1 == pri % 2)
+                {
+                    *ptr_queue = stat.raw.csr_que_cpu_h;
+                }
+                else
+                {
+                    *ptr_queue = stat.raw.csr_que_cpu_l;
+                }
+            }
+            break;
+
+        case 3:
+            rc = aml_readReg(unit, PEM4, &stat.byte);
+            if(AIR_E_OK == rc)
+            {
+                if (1 == pri % 2)
+                {
+                    *ptr_queue = stat.raw.csr_que_cpu_h;
+                }
+                else
+                {
+                    *ptr_queue = stat.raw.csr_que_cpu_l;
+                }
+            }
+            break;
+
+        default:
+            AIR_PRINT("[Dbg]: Not Support this pri %d yet\n", pri);
+            return AIR_E_BAD_PARAMETER;
+    }
+
+    if(AIR_E_OK != rc)
+    {
+        AIR_PRINT("[Dbg]: get pri to queue failed  rc is %d\n", rc);
+    }
+
+    AIR_PRINT("[Dbg]: get pri %d to queue %d mode success, PEM hex is %x\n"
+        , pri, *ptr_queue, stat.byte);
+    return rc;
+}
+
+/* FUNCTION NAME: air_qos_setDscp2Pri
+ * PURPOSE:
+ *      Set DSCP mapping to priority.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      dscp            --  Select DSCP value (0..63)
+ *      priority        --  Select priority (0..7)
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_qos_setDscp2Pri(
+    const UI32_T unit,
+    const UI32_T dscp,
+    const UI32_T pri)
+{
+    UI32_T rc = AIR_E_OTHERS;
+    UI32_T reg = 0;
+
+    /* Check parameter */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((dscp >= AIR_QOS_QUEUE_DSCP_MAX_NUM), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((pri >= AIR_QOS_QUEUE_MAX_NUM), AIR_E_BAD_PARAMETER);
+
+    /*get register val*/
+    switch (dscp/10)
+    {
+        case 0:
+            rc = aml_readReg(unit, PIM1, &reg);
+            if(AIR_E_OK == rc)
+            {
+                reg &= ~(AIR_QOS_QUEUE_PIM_MASK << AIR_QOS_QUEUE_PIM_WIDTH * (dscp % 10));
+                reg |= pri << 3 * (dscp % 10);
+                rc = aml_writeReg(unit, PIM1, reg);
+            }
+            break;
+
+        case 1:
+            rc = aml_readReg(unit, PIM2, &reg);
+            if(AIR_E_OK == rc)
+            {
+                reg &= ~(AIR_QOS_QUEUE_PIM_MASK << AIR_QOS_QUEUE_PIM_WIDTH * (dscp % 10));
+                reg |= pri << AIR_QOS_QUEUE_PIM_WIDTH * (dscp % 10);
+                rc = aml_writeReg(unit, PIM2, reg);
+            }
+            break;
+
+        case 2:
+            rc = aml_readReg(unit, PIM3, &reg);
+            if(AIR_E_OK == rc)
+            {
+                reg &= ~(AIR_QOS_QUEUE_PIM_MASK << AIR_QOS_QUEUE_PIM_WIDTH * (dscp % 10));
+                reg |= pri << AIR_QOS_QUEUE_PIM_WIDTH * (dscp % 10);
+                rc = aml_writeReg(unit, PIM3, reg);
+            }
+            break;
+
+        case 3:
+            rc = aml_readReg(unit, PIM4, &reg);
+            if(AIR_E_OK == rc)
+            {
+                reg &= ~(AIR_QOS_QUEUE_PIM_MASK << AIR_QOS_QUEUE_PIM_WIDTH * (dscp % 10));
+                reg |= pri << AIR_QOS_QUEUE_PIM_WIDTH * (dscp % 10);
+                rc = aml_writeReg(unit, PIM4, reg);
+            }
+            break;
+
+        case 4:
+            rc = aml_readReg(unit, PIM5, &reg);
+            if(AIR_E_OK == rc)
+            {
+                reg &= ~(AIR_QOS_QUEUE_PIM_MASK << AIR_QOS_QUEUE_PIM_WIDTH * (dscp % 10));
+                reg |= pri << AIR_QOS_QUEUE_PIM_WIDTH * (dscp % 10);
+                rc = aml_writeReg(unit, PIM5, reg);
+            }
+            break;
+
+        case 5:
+            rc = aml_readReg(unit, PIM6, &reg);
+            if(AIR_E_OK == rc)
+            {
+                reg &= ~(AIR_QOS_QUEUE_PIM_MASK << AIR_QOS_QUEUE_PIM_WIDTH * (dscp % 10));
+                reg |= pri << AIR_QOS_QUEUE_PIM_WIDTH * (dscp % 10);
+                rc = aml_writeReg(unit, PIM6, reg);
+            }
+            break;
+
+        case 6:
+            rc = aml_readReg(unit, PIM7, &reg);
+            if(AIR_E_OK == rc)
+            {
+                reg &= ~(AIR_QOS_QUEUE_PIM_MASK << AIR_QOS_QUEUE_PIM_WIDTH * (dscp % 10));
+                reg |= pri << AIR_QOS_QUEUE_PIM_WIDTH * (dscp % 10);
+                rc = aml_writeReg(unit, PIM7, reg);
+            }
+            break;
+
+        default:
+            AIR_PRINT("Not Support this dscp %d to pri, rc is %d\n", dscp, rc);
+            return AIR_E_BAD_PARAMETER;
+    }
+
+    if(AIR_E_OK != rc)
+    {
+        AIR_PRINT("set dscp to pri failed ,rc is %d\n", rc);
+    }
+    else
+    {
+        AIR_PRINT("set dscp  %u to pri %u success, PIM hex is %x\n", dscp, pri, reg);
+    }
+    return rc;
+}
+
+/* FUNCTION NAME: air_qos_getDscp2Pri
+ * PURPOSE:
+ *      Get DSCP mapping priority.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      dscp            --  Select DSCP value (0..63)
+ *
+ * OUTPUT:
+ *      ptr_pri         --  Priority value (0..7)
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_qos_getDscp2Pri(
+    const UI32_T unit,
+    const UI32_T dscp,
+    UI32_T * const ptr_pri)
+{
+    UI32_T rc = AIR_E_OTHERS;
+    UI32_T reg = 0;
+
+    /* Check parameter */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((dscp >= AIR_QOS_QUEUE_DSCP_MAX_NUM), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_pri);
+
+    /*get register val*/
+    switch (dscp/10)
+    {
+        case 0:
+            rc = aml_readReg(unit, PIM1, &reg);
+            if(AIR_E_OK == rc)
+            {
+                *ptr_pri = (reg & (AIR_QOS_QUEUE_PIM_MASK << AIR_QOS_QUEUE_PIM_WIDTH * (dscp % 10)))
+                    >> AIR_QOS_QUEUE_PIM_WIDTH  * (dscp % 10);
+            }
+            break;
+
+        case 1:
+            rc = aml_readReg(unit, PIM2, &reg);
+            if(AIR_E_OK == rc)
+            {
+                *ptr_pri = (reg & (AIR_QOS_QUEUE_PIM_MASK << AIR_QOS_QUEUE_PIM_WIDTH * (dscp % 10)))
+                    >> AIR_QOS_QUEUE_PIM_WIDTH * (dscp % 10);
+            }
+            break;
+
+        case 2:
+            rc = aml_readReg(unit, PIM3, &reg);
+            if(AIR_E_OK == rc)
+            {
+                *ptr_pri = (reg & (AIR_QOS_QUEUE_PIM_MASK << AIR_QOS_QUEUE_PIM_WIDTH * (dscp % 10)))
+                    >> AIR_QOS_QUEUE_PIM_WIDTH * (dscp % 10);
+            }
+            break;
+
+        case 3:
+            rc = aml_readReg(unit, PIM4, &reg);
+            if(AIR_E_OK == rc)
+            {
+                *ptr_pri = (reg & (AIR_QOS_QUEUE_PIM_MASK << AIR_QOS_QUEUE_PIM_WIDTH * (dscp % 10)))
+                    >> AIR_QOS_QUEUE_PIM_WIDTH * (dscp % 10);
+            }
+            break;
+
+        case 4:
+            rc = aml_readReg(unit, PIM5, &reg);
+            if(AIR_E_OK == rc)
+            {
+                *ptr_pri = (reg & (AIR_QOS_QUEUE_PIM_MASK << AIR_QOS_QUEUE_PIM_WIDTH * (dscp % 10)))
+                    >> AIR_QOS_QUEUE_PIM_WIDTH * (dscp % 10);
+            }
+            break;
+
+        case 5:
+            rc = aml_readReg(unit, PIM6, &reg);
+            if(AIR_E_OK == rc)
+            {
+                *ptr_pri = (reg & (AIR_QOS_QUEUE_PIM_MASK << AIR_QOS_QUEUE_PIM_WIDTH * (dscp % 10)))
+                    >> AIR_QOS_QUEUE_PIM_WIDTH * (dscp % 10);
+            }
+            break;
+
+        case 6:
+            rc = aml_readReg(unit, PIM7, &reg);
+            if(AIR_E_OK == rc)
+            {
+                *ptr_pri = (reg & (AIR_QOS_QUEUE_PIM_MASK << AIR_QOS_QUEUE_PIM_WIDTH * (dscp % 10)))
+                    >> AIR_QOS_QUEUE_PIM_WIDTH * (dscp % 10);
+            }
+            break;
+
+        default:
+            AIR_PRINT("Not Support this dscp %d to pri, rc is %d\n", dscp, rc);
+            return AIR_E_BAD_PARAMETER;
+    }
+
+    if(AIR_E_OK != rc)
+    {
+        AIR_PRINT("[Dbg]: get dscp %d to pri failed, rc is %d\n", dscp, rc);
+    }
+
+    AIR_PRINT("[Dbg]: get dscp %u to pri %d success, PIM hex is %d \n", dscp, *ptr_pri, reg);
+    return rc;
+}
+
+/* FUNCTION NAME: air_qos_setRateLimitEnable
+ * PURPOSE:
+ *      Enable or disable port rate limit.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Select port number (0..6)
+ *      dir             --  AIR_QOS_RATE_DIR_INGRESS
+ *                          AIR_QOS_RATE_DIR_EGRESS
+ *      rate_en         --  TRUE: eanble rate limit
+ *                          FALSE: disable rate limit
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_qos_setRateLimitEnable(
+    const UI32_T unit,
+    const UI32_T port,
+    const AIR_QOS_RATE_DIR_T dir,
+    const BOOL_T enable)
+{
+    UI32_T u32dat = 0, reg = 0;
+    UI32_T u32glo = 0, greg = 0;
+    UI32_T mac_port = 0;
+
+    /* Check parameter */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((dir >= AIR_QOS_RATE_DIR_LAST), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((enable != TRUE && enable != FALSE), AIR_E_BAD_PARAMETER);
+
+    mac_port = port;
+    if(AIR_QOS_RATE_DIR_EGRESS == dir)
+    {
+        reg = ERLCR(mac_port);
+        greg = GERLCR;
+    }
+    else if (AIR_QOS_RATE_DIR_INGRESS == dir)
+    {
+        reg = IRLCR(mac_port);
+        greg = GIRLCR;
+    }
+    else
+    {
+        AIR_PRINT("Not Support this dir %d yet\n", dir);
+        return AIR_E_BAD_PARAMETER;
+    }
+
+    aml_readReg(unit, reg, &u32dat);
+    if(TRUE == enable)
+    {
+        u32dat |= BIT(REG_RATE_EN_OFFT);
+        /* Enable tobke bucket mode */
+        u32dat |= BIT(REG_TB_EN_OFFT);
+    }
+    else
+    {
+        u32dat &= ~(BIT(REG_RATE_EN_OFFT));
+        /* Disable tobke bucket mode */
+        u32dat &= ~(BIT(REG_TB_EN_OFFT));
+    }
+    aml_writeReg(unit, reg, u32dat);
+
+    /* Rate include preamble/IPG/CRC */
+    aml_readReg(unit, greg, &u32glo);
+    u32glo &= ~(BITS_RANGE(REG_IPG_BYTE_OFFT, REG_IPG_BYTE_LENG));
+    u32glo |= AIR_QOS_L1_RATE_LIMIT;
+    aml_writeReg(unit, greg, u32glo);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_qos_getRateLimitEnable
+ * PURPOSE:
+ *      Get port rate limit state.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Select port number (0..6)
+ *      dir              -- AIR_QOS_RATE_DIR_T
+ * OUTPUT:
+ *      ptr_enable        --  TRUE: eanble rate limit
+ *                          FALSE: disable rate limit
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_qos_getRateLimitEnable(
+    const UI32_T                unit,
+    const UI32_T                port,
+    const AIR_QOS_RATE_DIR_T    dir,
+    BOOL_T                      *ptr_enable)
+{
+    UI32_T u32dat = 0, reg = 0, ret = 0;
+    UI32_T mac_port = 0;
+
+    /* Check parameter */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((dir >= AIR_QOS_RATE_DIR_LAST), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_enable);
+
+    mac_port = port;
+    /* Get ingress / egress register value */
+    if(AIR_QOS_RATE_DIR_EGRESS == dir)
+    {
+        reg = ERLCR(mac_port);
+    }
+    else
+    {
+        reg = IRLCR(mac_port);
+    }
+    aml_readReg(unit, reg, &u32dat);
+
+    ret = (u32dat & BIT(REG_RATE_EN_OFFT));
+    if(!ret)
+    {
+        *ptr_enable = FALSE;
+    }
+    else
+    {
+        *ptr_enable = TRUE;
+    }
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_qos_setRateLimit
+ * PURPOSE:
+ *      Set per port rate limit.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Select port number
+ *      ptr_cfg         --  AIR_QOS_RATE_LIMIT_CFG_T
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_qos_setRateLimit(
+    const UI32_T unit,
+    const UI32_T port,
+    AIR_QOS_RATE_LIMIT_CFG_T    *ptr_cfg)
+{
+    UI32_T u32dat = 0;
+    UI32_T mac_port = 0;
+
+    /* Check parameter */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_cfg);
+    AIR_PARAM_CHK((ptr_cfg->egress_cbs >= AIR_QOS_MAX_TOKEN), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((ptr_cfg->ingress_cbs >= AIR_QOS_MAX_TOKEN), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((ptr_cfg->egress_cir >= AIR_QOS_MAX_CIR), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((ptr_cfg->ingress_cir >= AIR_QOS_MAX_CIR), AIR_E_BAD_PARAMETER);
+
+    mac_port = port;
+    /* For Egress rate setting */
+    /* Set egress rate CIR */
+    aml_readReg(unit, ERLCR(mac_port), &u32dat);
+    u32dat &= ~ BITS_RANGE(REG_RATE_CIR_OFFT, REG_RATE_CIR_LENG);
+    u32dat |= ptr_cfg->egress_cir;
+    /* Set egress rate CBS */
+    u32dat &= ~ BITS_RANGE(REG_RATE_CBS_OFFT, REG_RATE_CBS_LENG);
+    u32dat |= BITS_OFF_L(ptr_cfg->egress_cbs, REG_RATE_CBS_OFFT, REG_RATE_CBS_LENG);
+    /* Enable tobke bucket mode */
+    u32dat |= BIT(REG_TB_EN_OFFT);
+    /* Set token period to 4ms */
+    u32dat &= ~ BITS_RANGE(REG_RATE_TB_OFFT, REG_RATE_TB_LENG);
+    u32dat |= BITS_OFF_L(AIR_QOS_TOKEN_PERIOD_4MS, REG_RATE_TB_OFFT, REG_RATE_TB_LENG);
+    if(ptr_cfg->flags & AIR_QOS_RATE_LIMIT_CFG_FLAGS_ENABLE_EGRESS)
+    {
+        /* Enable ratelimit mode*/
+        u32dat |= BIT(REG_RATE_EN_OFFT);
+    }
+    aml_writeReg(unit, ERLCR(mac_port), u32dat);
+
+
+    /* For Ingress rate setting */
+    /* Set ingress rate CIR */
+    aml_readReg(unit, IRLCR(mac_port), &u32dat);
+    u32dat &= ~ BITS_RANGE(REG_RATE_CIR_OFFT, REG_RATE_CIR_LENG);
+    u32dat |= ptr_cfg->ingress_cir;
+    /* Set egress rate CBS */
+    u32dat &= ~ BITS_RANGE(REG_RATE_CBS_OFFT, REG_RATE_CBS_LENG);
+    u32dat |= BITS_OFF_L(ptr_cfg->ingress_cbs, REG_RATE_CBS_OFFT, REG_RATE_CBS_LENG);
+    /* Enable tobke bucket mode */
+    u32dat |= BIT(REG_TB_EN_OFFT);
+    /* Set token period to 4ms */
+    u32dat &= ~ BITS_RANGE(REG_RATE_TB_OFFT, REG_RATE_TB_LENG);
+    u32dat |= BITS_OFF_L(AIR_QOS_TOKEN_PERIOD_4MS, REG_RATE_TB_OFFT, REG_RATE_TB_LENG);
+    if(ptr_cfg->flags & AIR_QOS_RATE_LIMIT_CFG_FLAGS_ENABLE_INGRESS)
+    {
+        /* Enable ratelimit mode*/
+        u32dat |= BIT(REG_RATE_EN_OFFT);
+    }
+    aml_writeReg(unit, IRLCR(mac_port), u32dat);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_qos_getRateLimit
+ * PURPOSE:
+ *      Get per port rate limit.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Select port number
+ *
+ * OUTPUT:
+ *      ptr_cfg          --  AIR_QOS_RATE_LIMIT_CFG_T
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_qos_getRateLimit(
+    const UI32_T unit,
+    const UI32_T port,
+    AIR_QOS_RATE_LIMIT_CFG_T *ptr_cfg)
+{
+    UI32_T u32dat = 0;
+    UI32_T mac_port = 0;
+
+    /* Check parameter */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_cfg);
+
+    mac_port = port;
+    /* For Egress rate info */
+    aml_readReg(unit, ERLCR(mac_port), &u32dat);
+    ptr_cfg->egress_cir = BITS_OFF_R(u32dat, REG_RATE_CIR_OFFT, REG_RATE_CIR_LENG);
+    ptr_cfg->egress_cbs = BITS_OFF_R(u32dat, REG_RATE_CBS_OFFT, REG_RATE_CBS_LENG);
+
+    /* For Ingress rate info */
+    aml_readReg(unit, IRLCR(mac_port), &u32dat);
+    ptr_cfg->ingress_cir = BITS_OFF_R(u32dat, REG_RATE_CIR_OFFT, REG_RATE_CIR_LENG);
+    ptr_cfg->ingress_cbs = BITS_OFF_R(u32dat, REG_RATE_CBS_OFFT, REG_RATE_CBS_LENG);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_qos_setPortPriority
+ * PURPOSE:
+ *      Get poer port based priority.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Select port number
+ *      priority        --  Select port priority
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_qos_setPortPriority(
+    const UI32_T unit,
+    const UI32_T port,
+    const UI32_T priority)
+{
+    UI32_T regPCR = 0;
+    UI32_T mac_port = 0;
+
+    /* Check parameter */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((priority >= AIR_QOS_QUEUE_MAX_NUM), AIR_E_BAD_PARAMETER);
+    mac_port = port;
+    aml_readReg(unit, PCR(mac_port), &regPCR);
+    regPCR &= ~PCR_PORT_PRI_MASK;
+    regPCR |= (priority & PCR_PORT_PRI_RELMASK) << PCR_PORT_PRI_OFFT;
+    aml_writeReg(unit, PCR(mac_port), regPCR);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_qos_getPortPriority
+ * PURPOSE:
+ *      Set per port based priority.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Select port number
+ *
+ * OUTPUT:
+ *      ptr_pri         --  Get port based priority
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_qos_getPortPriority(
+    const UI32_T unit,
+    const UI32_T port,
+    UI32_T *ptr_pri)
+{
+    UI32_T regPCR = 0;
+    UI32_T mac_port = 0;
+
+    /* Check parameter */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_pri);
+    mac_port = port;
+    aml_readReg(unit, PCR(mac_port), &regPCR);
+    *ptr_pri = (regPCR >> PCR_PORT_PRI_OFFT) & PCR_PORT_PRI_RELMASK;
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_qos_setRateLimitExMngFrm
+ * PURPOSE:
+ *      Set rate limit control exclude/include management frames.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      dir             --  AIR_RATE_DIR_INGRESS
+ *                          AIR_RATE_DIR_EGRESS
+ *      exclude         --  TRUE: Exclude management frame
+ *                          FALSE:Include management frame
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_qos_setRateLimitExMngFrm(
+    const UI32_T unit,
+    const AIR_QOS_RATE_DIR_T dir,
+    const BOOL_T exclude)
+{
+    UI32_T u32dat = 0, reg = 0;
+
+    /* Check parameter */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((dir != AIR_QOS_RATE_DIR_EGRESS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK(((TRUE != exclude) && (FALSE != exclude)), AIR_E_BAD_PARAMETER);
+
+    reg = GERLCR;
+    /* Set to register */
+    aml_readReg(unit, reg, &u32dat);
+    if(TRUE == exclude)
+    {
+        u32dat |= BIT(REG_MFRM_EX_OFFT);
+    }
+    else
+    {
+        u32dat &= ~(BIT(REG_MFRM_EX_OFFT));
+    }
+    aml_writeReg(unit, reg, u32dat);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_qos_getRateLimitExMngFrm
+ * PURPOSE:
+ *      Get rate limit control exclude/include management frames.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      dir             --  AIR_RATE_DIR_INGRESS
+ *                          AIR_RATE_DIR_EGRESS
+ * OUTPUT:
+ *      ptr_exclude     --  TRUE: Exclude management frame
+ *                          FALSE:Include management frame
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_qos_getRateLimitExMngFrm(
+    const UI32_T unit,
+    const AIR_QOS_RATE_DIR_T dir,
+    BOOL_T *ptr_exclude)
+{
+    UI32_T reg = 0, u32dat = 0;
+
+    /* Check parameter */
+    AIR_PARAM_CHK((unit >= AIR_MAX_NUM_OF_UNIT), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((dir >= AIR_QOS_RATE_DIR_LAST), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_exclude);
+    
+
+    if(AIR_QOS_RATE_DIR_EGRESS == dir)
+    {
+        reg = GERLCR;
+    }
+    else
+    {
+        reg = GIRLCR;
+    }
+
+    /* Set to register */
+    aml_readReg(unit, reg, &u32dat);
+    if(BITS_OFF_R(u32dat, REG_MFRM_EX_OFFT, REG_MFRM_EX_LENG))
+    {
+        *ptr_exclude = TRUE;
+    }
+    else
+    {
+        *ptr_exclude = FALSE;
+    }
+
+    return AIR_E_OK;
+}
+
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_sec.c b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_sec.c
new file mode 100644
index 0000000..336a14f
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_sec.c
@@ -0,0 +1,593 @@
+/* FILE NAME: air_sec.c
+ * PURPOSE:
+ *      Define the security function in AIR SDK.
+ *
+ * NOTES:
+ *      None
+ */
+
+/* INCLUDE FILE DECLARATIONS
+ */
+#include "air.h"
+
+/* NAMING CONSTANT DECLARATIONS
+ */
+
+/* MACRO FUNCTION DECLARATIONS
+ */
+
+/* DATA TYPE DECLARATIONS
+ */
+
+/* GLOBAL VARIABLE DECLARATIONS
+ */
+
+/* LOCAL SUBPROGRAM DECLARATIONS
+ */
+
+/* STATIC VARIABLE DECLARATIONS
+ */
+
+/* LOCAL SUBPROGRAM BODIES
+ */
+
+/* EXPORTED SUBPROGRAM BODIES
+ */
+
+/* FUNCTION NAME: air_sec_setStormEnable
+ * PURPOSE:
+ *      Enable or disable per port storm control for specific type.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Select port number
+ *      type            --  AIR_STORM_TYPE_BCST
+ *                          AIR_STORM_TYPE_MCST
+ *                          AIR_STORM_TYPE_UCST
+ *      storm_en        --  TRUE
+ *                          FALSE
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_sec_setStormEnable(
+    const UI32_T unit,
+    const UI32_T port,
+    const AIR_STORM_TYPE_T type,
+    const BOOL_T storm_en)
+{
+    UI32_T u32dat = 0, reg = 0, sp_en = 0;
+
+    /* Check parameter */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((type >= AIR_STORM_TYPE_LAST), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK(((storm_en != TRUE) && (storm_en != FALSE)), AIR_E_BAD_PARAMETER);
+
+    /* Find register BSR:broadcast, BSR_EXT1:multicast, BSR_EXT2:unicast */
+    switch(type)
+    {
+        case AIR_STORM_TYPE_BCST:
+            reg = BSR(port);
+            sp_en = BSR_STORM_BCST_EN;
+            break;
+        case AIR_STORM_TYPE_MCST:
+            reg = BSR_EXT1(port);
+            sp_en = BSR_STORM_MCST_EN;
+            break;
+        case AIR_STORM_TYPE_UCST:
+            reg = BSR_EXT2(port);
+            sp_en = BSR_STORM_UCST_EN;
+            break;
+        default:
+            break;
+    }
+
+    /* Enable specific type */
+    aml_readReg(unit, reg, &u32dat);
+    if(TRUE == storm_en)
+    {
+        u32dat |= (BSR_STORM_DROP_EN | BSR_STORM_RATE_BASED);
+        u32dat |= sp_en;
+    }
+    else
+    {
+        u32dat &= ~(BSR_STORM_DROP_EN | BSR_STORM_RATE_BASED);
+        u32dat &= ~sp_en;
+    }
+    aml_writeReg(unit, reg, u32dat);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_sec_getStormEnable
+ * PURPOSE:
+ *      Get per port status of storm control for specific type.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Select port number
+ *      type            --  AIR_STORM_TYPE_BCST
+ *                          AIR_STORM_TYPE_MCST
+ *                          AIR_STORM_TYPE_UCST
+ * OUTPUT:
+ *      ptr_storm_en    --  TRUE
+ *                          FALSE
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_sec_getStormEnable(
+    const UI32_T unit,
+    const UI32_T port,
+    const AIR_STORM_TYPE_T type,
+    BOOL_T *ptr_storm_en)
+{
+    UI32_T u32dat = 0, reg = 0, en = 0;
+
+    /* Check parameter */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((type >= AIR_STORM_TYPE_LAST), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_storm_en);
+
+    /* Find register BSR:broadcast, BSR_EXT1:multicast, BSR_EXT2:unicast */
+    switch(type)
+    {
+        case AIR_STORM_TYPE_BCST:
+            reg = BSR(port);
+            break;
+        case AIR_STORM_TYPE_MCST:
+            reg = BSR_EXT1(port);
+            break;
+        case AIR_STORM_TYPE_UCST:
+            reg = BSR_EXT2(port);
+            break;
+        default:
+            break;
+    }
+
+    /* Enable specific type */
+    aml_readReg(unit, reg, &u32dat);
+    en = (u32dat & BSR_STORM_DROP_EN);
+    if(FALSE == en)
+    {
+        *ptr_storm_en = FALSE;
+    }
+    else
+    {
+        *ptr_storm_en = TRUE;
+    }
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_sec_setStormRate
+ * PURPOSE:
+ *      Set per port storm rate limit control for specific type.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Select port number
+ *      type            --  AIR_STORM_TYPE_BCST
+ *                          AIR_STORM_TYPE_MCST
+ *                          AIR_STORM_TYPE_UCST
+ *      count           --  Count of the unit
+ *                          Range 0..255
+ *                          Rate = (count * unit) bps
+ *      unit            --  AIR_STORM_UNIT_64K
+ *                          AIR_STORM_UNIT_256K
+ *                          AIR_STORM_UNIT_1M
+ *                          AIR_STORM_UNIT_4M
+ *                          AIR_STORM_UNIT_16M
+                            AIR_STORM_UNIT_32M
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_sec_setStormRate(
+    const UI32_T unit,
+    const UI32_T port,
+    const AIR_STORM_TYPE_T type,
+    const UI32_T count,
+    const AIR_STORM_UNIT_T storm_unit)
+{
+    UI32_T u32dat = 0, reg = 0;
+
+    /* Check parameter */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((type >= AIR_STORM_TYPE_LAST), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((count > AIR_STORM_MAX_COUNT), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((storm_unit >= AIR_STORM_UNIT_LAST), AIR_E_BAD_PARAMETER);
+
+    /* Find register BSR:broadcast, BSR_EXT1:multicast, BSR_EXT2:unicast */
+    switch(type)
+    {
+        case AIR_STORM_TYPE_BCST:
+            reg = BSR(port);
+            break;
+        case AIR_STORM_TYPE_MCST:
+            reg = BSR_EXT1(port);
+            break;
+        case AIR_STORM_TYPE_UCST:
+            reg = BSR_EXT2(port);
+            break;
+        default:
+            break;
+    }
+    /* Set storm rate limit unit */
+    aml_readReg(unit, reg, &u32dat);
+    u32dat &= ~(BSR_STORM_UNIT_MSK << BSR_STORM_UNIT_OFFT);
+    u32dat |= (storm_unit << BSR_STORM_UNIT_OFFT);
+    aml_writeReg(unit, reg, u32dat);
+
+    /* Find register BSR1:broadcast, BSR1_EXT1:multicast, BSR1_EXT2:unicast */
+    switch(type)
+    {
+        case AIR_STORM_TYPE_BCST:
+            reg = BSR1(port);
+            break;
+        case AIR_STORM_TYPE_MCST:
+            reg = BSR1_EXT1(port);
+            break;
+        case AIR_STORM_TYPE_UCST:
+            reg = BSR1_EXT2(port);
+            break;
+        default:
+            break;
+    }
+    /* Set storm rate limit count */
+    u32dat &= ~(BSR_STORM_COUNT_MSK << BSR1_10M_COUNT_OFFT);
+    u32dat |= (count << BSR1_10M_COUNT_OFFT);
+
+    u32dat &= ~(BSR_STORM_COUNT_MSK << BSR1_100M_COUNT_OFFT);
+    u32dat |= (count << BSR1_100M_COUNT_OFFT);
+
+    u32dat &= ~(BSR_STORM_COUNT_MSK << BSR1_1000M_COUNT_OFFT);
+    u32dat |= (count << BSR1_1000M_COUNT_OFFT);
+
+    u32dat &= ~(BSR_STORM_COUNT_MSK << BSR1_2500M_COUNT_OFFT);
+    u32dat |= (count << BSR1_2500M_COUNT_OFFT);
+    aml_writeReg(unit, reg, u32dat);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_sec_getStormRate
+ * PURPOSE:
+ *      Get per port storm rate limit control for specific type.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Select port number
+ *      type            --  AIR_STORM_TYPE_BCST
+ *                          AIR_STORM_TYPE_MCST
+ *                          AIR_STORM_TYPE_UCST
+ * OUTPUT:
+ *      ptr_count       --  Count of the unit
+ *                          Range 0..255
+ *                          Rate = (count * unit) bps
+ *      ptr_unit        --  AIR_STORM_UNIT_64K
+ *                          AIR_STORM_UNIT_256K
+ *                          AIR_STORM_UNIT_1M
+ *                          AIR_STORM_UNIT_4M
+ *                          AIR_STORM_UNIT_16M
+ *                          AIR_STORM_UNIT_32M
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_sec_getStormRate(
+    const UI32_T unit,
+    const UI32_T port,
+    const AIR_STORM_TYPE_T type,
+    UI32_T *ptr_count,
+    AIR_STORM_UNIT_T *ptr_unit)
+{
+    UI32_T u32dat = 0, reg = 0;
+
+    /* Check parameter */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((type >= AIR_STORM_TYPE_LAST), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_count);
+    AIR_CHECK_PTR(ptr_unit);
+
+    /* Find register BSR:broadcast, BSR_EXT1:multicast, BSR_EXT2:unicast */
+    switch(type)
+    {
+        case AIR_STORM_TYPE_BCST:
+            reg = BSR(port);
+            break;
+        case AIR_STORM_TYPE_MCST:
+            reg = BSR_EXT1(port);
+            break;
+        case AIR_STORM_TYPE_UCST:
+            reg = BSR_EXT2(port);
+            break;
+        default:
+            break;
+    }
+    aml_readReg(unit, reg, &u32dat);
+    /* Get storm rate limit unit */
+    *ptr_unit = (BSR_STORM_UNIT_MSK & (u32dat >> BSR_STORM_UNIT_OFFT));
+
+    /* Find register BSR1:broadcast, BSR1_EXT1:multicast, BSR1_EXT2:unicast */
+    switch(type)
+    {
+        case AIR_STORM_TYPE_BCST:
+            reg = BSR1(port);
+            break;
+        case AIR_STORM_TYPE_MCST:
+            reg = BSR1_EXT1(port);
+            break;
+        case AIR_STORM_TYPE_UCST:
+            reg = BSR1_EXT2(port);
+            break;
+        default:
+            break;
+    }
+    aml_readReg(unit, reg, &u32dat);
+    /* Get storm rate limit count */
+    *ptr_count = (u32dat & BSR_STORM_COUNT_MSK);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_sec_setFldMode
+ * PURPOSE:
+ *      Set per port flooding status for unknown type frame.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Select port to setting
+ *      type            --  AIR_FLOOD_TYPE_BCST
+ *                          AIR_FLOOD_TYPE_MCST
+ *                          AIR_FLOOD_TYPE_UCST
+ *                          AIR_FLOOD_TYPE_QURY
+ *      fld_en          --  TRUE : flooding specific type frame for specific port
+ *                          FALSE: drop specific type frame for specific port
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_sec_setFldMode(
+    const UI32_T unit,
+    const UI32_T port,
+    const AIR_FLOOD_TYPE_T type,
+    const BOOL_T fld_en)
+{
+    UI32_T u32dat = 0, reg = 0;
+
+    /* Check parameter */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((type >= AIR_FLOOD_TYPE_LAST), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK(((fld_en != TRUE) && (fld_en != FALSE)), AIR_E_BAD_PARAMETER);
+
+    /* Find register */
+    switch(type)
+    {
+        case AIR_FLOOD_TYPE_BCST:
+            reg = BCF;
+            break;
+        case AIR_FLOOD_TYPE_MCST:
+            reg = UNMF;
+            break;
+        case AIR_FLOOD_TYPE_UCST:
+            reg = UNUF;
+            break;
+        case AIR_FLOOD_TYPE_QURY:
+            reg = QRYP;
+            break;
+        default:
+            break;
+    }
+
+    aml_readReg(unit, reg, &u32dat);
+    if(TRUE == fld_en)
+    {
+        u32dat |= BIT(port);
+    }
+    else
+    {
+        u32dat &= ~BIT(port);
+    }
+    aml_writeReg(unit, reg, u32dat);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_sec_getFldMode
+ * PURPOSE:
+ *      Get per port flooding status for unknown type frame.
+ *
+ * INPUT:
+ *      unit            --  Select device ID
+ *      port            --  Select port to setting
+ *      type            --  AIR_FLOOD_TYPE_BCST
+ *                          AIR_FLOOD_TYPE_MCST
+ *                          AIR_FLOOD_TYPE_UCST
+ *                          AIR_FLOOD_TYPE_QURY
+ * OUTPUT:
+ *      ptr_fld_en      --  TRUE : flooding specific type frame for specific port
+ *                          FALSE: drop specific type frame for specific port
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_sec_getFldMode(
+    const UI32_T unit,
+    const UI32_T port,
+    const AIR_FLOOD_TYPE_T type,
+    BOOL_T *ptr_fld_en)
+{
+    UI32_T u32dat = 0, reg = 0, value = 0;
+
+    /* Check parameter */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((type >= AIR_FLOOD_TYPE_LAST), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_fld_en);
+
+    /* Find register */
+    switch(type)
+    {
+        case AIR_FLOOD_TYPE_BCST:
+            reg = BCF;
+            break;
+        case AIR_FLOOD_TYPE_MCST:
+            reg = UNMF;
+            break;
+        case AIR_FLOOD_TYPE_UCST:
+            reg = UNUF;
+            break;
+        case AIR_FLOOD_TYPE_QURY:
+            reg = QRYP;
+            break;
+        default:
+            break;
+    }
+
+    aml_readReg(unit, reg, &u32dat);
+    value = u32dat & BIT(port);
+    if(FALSE == value)
+    {
+        *ptr_fld_en = FALSE;
+    }
+    else
+    {
+        *ptr_fld_en = TRUE;
+    }
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_sec_setPortSecPortCfg
+ * PURPOSE:
+ *      Set port security configurations for specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Port ID
+ *      port_config     --  Structure of port configuration.
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_sec_setPortSecPortCfg(
+    const UI32_T unit,
+    const UI32_T port,
+    const AIR_SEC_PORTSEC_PORT_CONFIG_T port_config)
+{
+    AIR_ERROR_NO_T rc = AIR_E_OK;
+    UI32_T u32dat = 0, value = 0;
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK(((TRUE != port_config.sa_lrn_en) && (FALSE != port_config.sa_lrn_en)), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK(((TRUE != port_config.sa_lmt_en) && (FALSE != port_config.sa_lmt_en)), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((port_config.sa_lmt_cnt > AIR_MAX_NUM_OF_MAC), AIR_E_BAD_PARAMETER);
+
+    aml_readReg(unit, PSC(port), &u32dat);
+
+    if(FALSE == port_config.sa_lrn_en)
+    {
+        u32dat |= BITS_RANGE(PSC_DIS_LRN_OFFSET, PSC_DIS_LRN_LENGTH);
+    }
+    else
+    {
+        u32dat &= ~BITS_RANGE(PSC_DIS_LRN_OFFSET, PSC_DIS_LRN_LENGTH);
+    }
+    if(FALSE == port_config.sa_lmt_en)
+    {
+        u32dat &= ~BITS_RANGE(PSC_SA_CNT_EN_OFFSET, PSC_SA_CNT_EN_LENGTH);
+        u32dat &= ~PSC_SA_CNT_LMT_MASK;
+        u32dat |= (PSC_SA_CNT_LMT_MAX << PSC_SA_CNT_LMT_OFFSET);
+    }
+    else
+    {
+        u32dat |= BITS_RANGE(PSC_SA_CNT_EN_OFFSET, PSC_SA_CNT_EN_LENGTH);
+        u32dat &= ~PSC_SA_CNT_LMT_MASK;
+        value = (port_config.sa_lmt_cnt & PSC_SA_CNT_LMT_REALMASK);
+        u32dat |= (((value > PSC_SA_CNT_LMT_MAX) ? PSC_SA_CNT_LMT_MAX : value) << PSC_SA_CNT_LMT_OFFSET);
+    }
+
+    aml_writeReg(unit, PSC(port), u32dat);
+
+    return rc;
+}
+
+/* FUNCTION NAME: air_sec_getPortSecPortCfg
+ * PURPOSE:
+ *      Get port security configurations for specific port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Port ID
+ *
+ * OUTPUT:
+ *      ptr_port_config --  Structure of port configuration.
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+ AIR_ERROR_NO_T
+air_sec_getPortSecPortCfg(
+    const UI32_T unit,
+    const UI32_T port,
+    AIR_SEC_PORTSEC_PORT_CONFIG_T *ptr_port_config)
+{
+    AIR_ERROR_NO_T rc = AIR_E_OK;
+    UI32_T u32dat = 0;
+
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_port_config);
+
+    aml_readReg(unit, PSC(port), &u32dat);
+
+    ptr_port_config ->sa_lrn_en = ((~BITS_OFF_R(u32dat, PSC_DIS_LRN_OFFSET, PSC_DIS_LRN_LENGTH)) & BIT(0));
+    ptr_port_config ->sa_lmt_en = BITS_OFF_R(u32dat, PSC_SA_CNT_EN_OFFSET, PSC_SA_CNT_EN_LENGTH);
+    ptr_port_config ->sa_lmt_cnt = (u32dat >> PSC_SA_CNT_LMT_OFFSET) & PSC_SA_CNT_LMT_REALMASK;
+
+    return rc;
+}
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_sptag.c b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_sptag.c
new file mode 100644
index 0000000..1f6e4ce
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_sptag.c
@@ -0,0 +1,342 @@
+/* FILE NAME: air_sptag.c
+ * PURPOSE:
+ *      Define the Special Tag function in AIR SDK.
+ * NOTES:
+ *      None
+ */
+
+/* INCLUDE FILE DECLARATIONS
+*/
+#include "air.h"
+
+/* NAMING CONSTANT DECLARATIONS
+*/
+
+/* MACRO FUNCTION DECLARATIONS
+*/
+
+/* DATA TYPE DECLARATIONS
+*/
+
+/* GLOBAL VARIABLE DECLARATIONS
+*/
+
+/* LOCAL SUBPROGRAM DECLARATIONS
+*/
+
+/* STATIC VARIABLE DECLARATIONS
+*/
+
+/* LOCAL SUBPROGRAM BODIES
+*/
+
+/* EXPORTED SUBPROGRAM BODIES
+*/
+/* FUNCTION NAME: air_sptag_setState
+ * PURPOSE:
+ *      Set special tag enable/disable for port
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Special tag Port
+ *      sp_en           --  special tag Enable or Disable
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_sptag_setState(
+    const UI32_T unit,
+    const UI32_T port,
+    const BOOL_T sp_en)
+{
+    UI32_T udat32 = 0;
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK(port > AIR_MAX_NUM_OF_PORTS, AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK(((TRUE != sp_en) && (FALSE != sp_en)), AIR_E_BAD_PARAMETER);
+
+    /* Read PVC */
+    aml_readReg(unit, PVC(port), &udat32);
+    AIR_PRINT("PVC REG:%x. val:%x\n", PVC(port),udat32);
+
+    /* Set special tag enable or disable */
+    udat32 &= ~BITS_RANGE(PVC_SPTAG_EN_OFFT, PVC_SPTAG_EN_LENG);
+    udat32 |= (sp_en << PVC_SPTAG_EN_OFFT);
+
+    /* Write PVC */
+    aml_writeReg(unit, PVC(port), udat32);
+    AIR_PRINT("PVC REG:%x. val:%x\n", PVC(port),udat32);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_switch_getCpuPortEn
+ * PURPOSE:
+ *      Get CPU port member
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Special tag Port
+ *
+ * OUTPUT:
+ *      sp_en           --  special tag enable or disable
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_sptag_getState(
+    const UI32_T unit,
+    const UI32_T port,
+    BOOL_T *sp_en)
+{
+    UI32_T udat32 = 0;
+
+    /* Mistake proofing */
+    AIR_CHECK_PTR(sp_en);
+    AIR_PARAM_CHK(port > AIR_MAX_NUM_OF_PORTS, AIR_E_BAD_PARAMETER);
+
+    /* Read PVC */
+    aml_readReg(unit, PVC(port), &udat32);
+
+    /* Get special tag state */
+    (*sp_en) = BITS_OFF_R(udat32, PVC_SPTAG_EN_OFFT, PVC_SPTAG_EN_LENG);
+
+    return AIR_E_OK;
+}
+
+
+/* FUNCTION NAME: air_sptag_setMode
+ * PURPOSE:
+ *      Set special tag enable/disable for port
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Special tag Port
+ *      mode            --  insert mode or replace mode
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_sptag_setMode(
+    const UI32_T unit,
+    const UI32_T port,
+    const BOOL_T mode)
+{
+    UI32_T udat32 = 0;
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK(port > AIR_MAX_NUM_OF_PORTS, AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK(((TRUE != mode) && (FALSE != mode)), AIR_E_BAD_PARAMETER);
+
+    /* Read PVC */
+    aml_readReg(unit, PVC(port), &udat32);
+    AIR_PRINT("PVC REG:%x. val:%x\n", PVC(port),udat32);
+
+    /* Set special tag enable or disable */
+    udat32 &= ~BITS_RANGE(PVC_SPTAG_MODE_OFFT, PVC_SPTAG_MODE_LENG);
+    udat32 |= (mode << PVC_SPTAG_MODE_OFFT);
+
+    /* Write PVC */
+    aml_writeReg(unit, PVC(port), udat32);
+    AIR_PRINT("PVC REG:%x. val:%x\n", PVC(port),udat32);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_sptag_getMode
+ * PURPOSE:
+ *      Get CPU port member
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Special tag Port
+ *
+ * OUTPUT:
+ *      mode            --  insert or replace mode
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_sptag_getMode(
+    const UI32_T unit,
+    const UI32_T port,
+    BOOL_T *mode)
+{
+    UI32_T udat32 = 0;
+
+    /* Mistake proofing */
+    AIR_CHECK_PTR(mode);
+    AIR_PARAM_CHK(port > AIR_MAX_NUM_OF_PORTS, AIR_E_BAD_PARAMETER);
+
+    /* Read PVC */
+    aml_readReg(unit, PVC(port), &udat32);
+
+    /* Get special tag mode */
+    (*mode) = BITS_OFF_R(udat32, PVC_SPTAG_MODE_OFFT, PVC_SPTAG_MODE_LENG);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_sptag_encodeTx
+ * PURPOSE:
+ *      Encode tx special tag into buffer.
+ * INPUT:
+ *      unit            --  Device ID
+ *      ptr_sptag_tx    --  Special tag parameters
+ *      ptr_buf         --  Buffer address
+ *      ptr_len         --  Buffer length
+ * OUTPUT:
+ *      ptr_len         --  Written buffer length
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_sptag_encodeTx(
+    const UI32_T unit,
+    const AIR_STAG_MODE_T mode,
+    AIR_STAG_TX_PARA_T *ptr_stag_tx,
+    UI8_T *ptr_buf,
+    UI32_T *ptr_len)
+{
+    UI32_T port = 0, byte_off = 0, bit_off = 0;
+    BOOL_T found = FALSE;
+    UI16_T mac_pbmp;
+
+    AIR_PARAM_CHK(((ptr_stag_tx->opc <  AIR_STAG_OPC_PORTMAP) ||(ptr_stag_tx->opc > AIR_STAG_OPC_LOOKUP)),AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK(((ptr_stag_tx->vpm <  AIR_STAG_VPM_UNTAG) ||(ptr_stag_tx->opc > AIR_STAG_VPM_TPID_PRE_DEFINED)),AIR_E_BAD_PARAMETER);
+
+    mac_pbmp = ptr_stag_tx->pbm;
+
+    /* insert mode only support port map */
+    if ((AIR_STAG_MODE_INSERT == mode)
+        && ((ptr_stag_tx->opc != AIR_STAG_OPC_PORTMAP) && (ptr_stag_tx->opc != AIR_STAG_OPC_LOOKUP)))
+    {
+        return AIR_E_BAD_PARAMETER;
+    }
+
+    /* clear output buffer */
+    memset(ptr_buf, 0, AIR_STAG_BUF_LEN);
+    AIR_PRINT("air_sptag_encode:mac_pbmp=%x\n", mac_pbmp);
+
+    ptr_buf[0] |= BITS_OFF_L(ptr_stag_tx->opc, AIR_STAG_TX_OPC_BIT_OFFSET, AIR_STAG_TX_OPC_BIT_WIDTH);
+    if (AIR_STAG_MODE_INSERT == mode)
+    {   /*insert only support bitmap , opc always 000*/
+        AIR_PORT_FOREACH(mac_pbmp, port)
+        {
+            ptr_buf[1] |= (0x1 << port);
+            AIR_PRINT("air_sptag_encode:port=%d,value = %x\n", port,(0x1 << port));
+        }
+    }
+    else
+    {
+        ptr_buf[0] |= BITS_OFF_L(ptr_stag_tx->vpm, AIR_STAG_TX_VPM_BIT_OFFSET, AIR_STAG_TX_VPM_BIT_WIDTH);
+        ptr_buf[0] |= BITS_OFF_L(ptr_stag_tx->opc, AIR_STAG_TX_OPC_BIT_OFFSET, AIR_STAG_TX_OPC_BIT_WIDTH);
+        if (AIR_STAG_OPC_PORTMAP == ptr_stag_tx->opc)
+        {
+            AIR_PORT_FOREACH(mac_pbmp, port)
+            {
+                ptr_buf[1] |= 0x1 << port;
+
+            }
+        }
+        else if (AIR_STAG_OPC_PORTID == ptr_stag_tx->opc)
+        {
+            AIR_PORT_FOREACH(mac_pbmp, port)
+            {
+                if (TRUE ==found)
+                {
+                    return AIR_E_BAD_PARAMETER;
+                }
+                ptr_buf[1] |= port;
+                found = TRUE;
+            }
+        }
+        AIR_PRINT("air_sptag_encode:pri = %d,cfi = %d,vid = %d\n", ptr_stag_tx->pri,ptr_stag_tx->cfi,ptr_stag_tx->vid);
+
+        ptr_buf[2] |= BITS_OFF_L(ptr_stag_tx->pri, AIR_STAG_TX_PCP_BIT_OFFSET, AIR_STAG_TX_PCP_BIT_WIDTH);
+        ptr_buf[2] |= BITS_OFF_L(ptr_stag_tx->cfi, AIR_STAG_TX_DEI_BIT_OFFSET, AIR_STAG_TX_DEI_BIT_WIDTH);
+        ptr_buf[2] |= BITS_OFF_L((ptr_stag_tx->vid >> AIR_STAG_ALIGN_BIT_WIDTH), 0,
+            (AIR_STAG_ALIGN_BIT_WIDTH - AIR_STAG_TX_PCP_BIT_WIDTH - AIR_STAG_TX_DEI_BIT_WIDTH));
+        AIR_PRINT("air_sptag_encode:pbuf[2] %02x\n", ptr_buf[2]);
+        ptr_buf[3] |= BITS_OFF_L((ptr_stag_tx->vid & 0xFF), 0, AIR_STAG_ALIGN_BIT_WIDTH);
+        AIR_PRINT("air_sptag_encode:pbuf[3] %02x\n", ptr_buf[3]);
+    }
+
+    *ptr_len = AIR_STAG_BUF_LEN;
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_sptag_decodeRx
+ * PURPOSE:
+ *      Decode rx special tag from buffer.
+ * INPUT:
+ *      unit            --  Device ID
+ *      ptr_buf         --  Buffer address
+ *      len             --  Buffer length
+ * OUTPUT:
+ *      ptr_sptag_rx    --  Special tag parameters
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_sptag_decodeRx(
+    const UI32_T unit,
+    const UI8_T *ptr_buf,
+    const UI32_T len,
+    AIR_SPTAG_RX_PARA_T *ptr_sptag_rx)
+{
+    AIR_CHECK_PTR(ptr_buf);
+    AIR_CHECK_PTR(ptr_sptag_rx);
+    AIR_PARAM_CHK((len != AIR_STAG_BUF_LEN), AIR_E_BAD_PARAMETER);
+
+    ptr_sptag_rx->vpm  = BITS_OFF_R(ptr_buf[0], 0, 2);
+    ptr_sptag_rx->rsn  = BITS_OFF_R(ptr_buf[0], 2, 3);
+    ptr_sptag_rx->spn  = BITS_OFF_R(ptr_buf[1], 0, 5);
+    ptr_sptag_rx->pri  = BITS_OFF_R(ptr_buf[2], 5, 3);
+    ptr_sptag_rx->cfi  = BITS_OFF_R(ptr_buf[2], 4, 1);
+    ptr_sptag_rx->vid  = BITS_OFF_R(ptr_buf[2], 0, 4);
+    ptr_sptag_rx->vid  = (ptr_sptag_rx->vid << 8) | ptr_buf[3];
+
+    AIR_PARAM_CHK((ptr_sptag_rx->vpm >= AIR_STAG_REASON_CODE_LAST), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((ptr_sptag_rx->rsn >= AIR_STAG_VPM_LAST), AIR_E_BAD_PARAMETER);
+
+    return AIR_E_OK;
+}
+
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_stp.c b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_stp.c
new file mode 100644
index 0000000..6f69ed5
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_stp.c
@@ -0,0 +1,133 @@
+/* FILE NAME: air_stp.c
+ * PURPOSE:
+ *      Define the STP function in AIR SDK.
+ *
+ * NOTES:
+ *      None
+ */
+
+/* INCLUDE FILE DECLARATIONS
+*/
+#include "air.h"
+
+/* NAMING CONSTANT DECLARATIONS
+*/
+
+/* MACRO FUNCTION DECLARATIONS
+*/
+
+/* DATA TYPE DECLARATIONS
+*/
+
+/* GLOBAL VARIABLE DECLARATIONS
+*/
+
+/* LOCAL SUBPROGRAM DECLARATIONS
+*/
+
+/* STATIC VARIABLE DECLARATIONS
+*/
+
+/* LOCAL SUBPROGRAM BODIES
+*/
+
+/* EXPORTED SUBPROGRAM BODIES
+*/
+/* FUNCTION NAME: air_stp_setPortstate
+ * PURPOSE:
+ *      Set the STP port state for a specifiec port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      fid             --  Filter ID for MSTP
+ *      state           --  AIR_STP_STATE_DISABLE
+ *                          AIR_STP_STATE_LISTEN
+ *                          AIR_STP_STATE_LEARN
+ *                          AIR_STP_STATE_FORWARD
+ * OUTPUT:
+ *        None
+ *
+ * RETURN:
+ *        AIR_E_OK
+ *        AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_stp_setPortstate(
+    const UI32_T unit,
+    const UI8_T port,
+    const UI8_T fid,
+    const AIR_STP_STATE_T state)
+{
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+
+    /* Mistake proofing for fid checking */
+    AIR_PARAM_CHK((fid >= AIR_STP_FID_NUMBER), AIR_E_BAD_PARAMETER);
+
+    /* Mistake proofing for state checking */
+    AIR_PARAM_CHK((state >= AIR_STP_STATE_LAST), AIR_E_BAD_PARAMETER);
+
+    /* Read data from register */
+    aml_readReg(unit, SSC(port), &u32dat);
+
+    /* Write data to register */
+    u32dat &= ~BITS(fid*2, (fid*2)+1);
+    u32dat |= BITS_OFF_L(state, (fid*2), 2);
+    aml_writeReg(unit, SSC(port), u32dat);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_stp_getPortstate
+ * PURPOSE:
+ *      Get the STP port state for a specifiec port.
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  Index of port number
+ *      fid             --  Filter ID for MSTP
+ *
+ * OUTPUT:
+ *      ptr_state       --  AIR_STP_STATE_DISABLE
+ *                          AIR_STP_STATE_LISTEN
+ *                          AIR_STP_STATE_LEARN
+ *                          AIR_STP_STATE_FORWARD
+ * RETURN:
+ *        AIR_E_OK
+ *        AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+
+AIR_ERROR_NO_T
+air_stp_getPortstate(
+    const UI32_T unit,
+    const UI32_T port,
+    const UI32_T fid,
+    AIR_STP_STATE_T *ptr_state)
+{
+    UI32_T u32dat = 0;
+
+    /* Mistake proofing for port checking */
+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);
+
+    /* Mistake proofing for fid checking */
+    AIR_PARAM_CHK((fid >= AIR_STP_FID_NUMBER), AIR_E_BAD_PARAMETER);
+
+    /* Mistake proofing for state checking */
+    AIR_CHECK_PTR(ptr_state);
+
+    /* Read data from register */
+    aml_readReg(unit, SSC(port), &u32dat);
+    (*ptr_state) = BITS_OFF_R(u32dat, fid*2, 2);
+
+    return AIR_E_OK;
+}
+
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_switch.c b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_switch.c
new file mode 100644
index 0000000..91f689e
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_switch.c
@@ -0,0 +1,369 @@
+/* FILE NAME: air_switch.c
+ * PURPOSE:
+ *      Define the switch function in AIR SDK.
+ *
+ * NOTES:
+ *      None
+ */
+
+/* INCLUDE FILE DECLARATIONS
+*/
+#include "air.h"
+
+/* NAMING CONSTANT DECLARATIONS
+*/
+#define AIR_SYS_RST_WAIT_TIME       (100000)
+
+/* MACRO FUNCTION DECLARATIONS
+*/
+
+/* DATA TYPE DECLARATIONS
+*/
+
+/* GLOBAL VARIABLE DECLARATIONS
+*/
+
+/* LOCAL SUBPROGRAM DECLARATIONS
+*/
+
+/* STATIC VARIABLE DECLARATIONS
+*/
+
+/* LOCAL SUBPROGRAM BODIES
+*/
+
+/* EXPORTED SUBPROGRAM BODIES
+*/
+
+
+/* FUNCTION NAME: air_switch_setCpuPort
+ * PURPOSE:
+ *      Set CPU port member
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      port            --  CPU port index
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_switch_setCpuPort(
+    const UI32_T unit,
+    const UI32_T port)
+{
+    UI32_T regMFC = 0;
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK(port > AIR_MAX_NUM_OF_PORTS, AIR_E_BAD_PARAMETER);
+
+    /* Read CFC */
+    aml_readReg(unit, MFC, &regMFC);
+    AIR_PRINT("PTC REG:%x. val:%x\n", MFC,regMFC);
+
+    /* Set CPU portmap */
+    regMFC &= ~BITS_RANGE(MFC_CPU_PORT_OFFSET, MFC_CPU_PORT_LENGTH);
+    regMFC |= (port << MFC_CPU_PORT_OFFSET);
+
+    /* Write CFC */
+    aml_writeReg(unit, MFC, regMFC);
+    AIR_PRINT("PTC REG:%x. val:%x\n", MFC,regMFC);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_switch_getCpuPort
+ * PURPOSE:
+ *      Get CPU port member
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      ptr_port        --  CPU port index
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_switch_getCpuPort(
+    const UI32_T unit,
+    UI32_T *ptr_port)
+{
+    UI32_T regMFC = 0;
+
+    /* Mistake proofing */
+    AIR_CHECK_PTR(ptr_port);
+
+    /* Read CFC */
+    aml_readReg(unit, MFC, &regMFC);
+
+    /* Get CPU portmap */
+    (*ptr_port) = BITS_OFF_R(regMFC, MFC_CPU_PORT_OFFSET, MFC_CPU_PORT_LENGTH);
+
+    return AIR_E_OK;
+}
+
+
+/* FUNCTION NAME: air_switch_setCpuPortEN
+ * PURPOSE:
+ *      Set CPU port Enable
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      cpu_en          --  CPU Port Enable
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_switch_setCpuPortEn(
+    const UI32_T unit,
+    const BOOL_T cpu_en)
+{
+    UI32_T regMFC = 0;
+
+    /* Mistake proofing */
+    AIR_PARAM_CHK(((TRUE != cpu_en) && (FALSE != cpu_en)), AIR_E_BAD_PARAMETER);
+
+    /* Read CFC */
+    aml_readReg(unit, MFC, &regMFC);
+
+    /* Set CPU portmap */
+    regMFC &= ~BITS_RANGE(MFC_CPU_EN_OFFSET, MFC_CPU_EN_LENGTH);
+    regMFC |= cpu_en << MFC_CPU_EN_OFFSET ;
+
+    /* Write CFC */
+    aml_writeReg(unit, MFC, regMFC);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_switch_getCpuPortEn
+ * PURPOSE:
+ *      Get CPU port member
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *
+ * OUTPUT:
+ *      cpu_en          --  CPU Port enable
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_switch_getCpuPortEn(
+    const UI32_T unit,
+    BOOL_T *cpu_en)
+{
+    UI32_T regMFC = 0;
+
+    /* Mistake proofing */
+    AIR_CHECK_PTR(cpu_en);
+
+    /* Read CFC */
+    aml_readReg(unit, MFC, &regMFC);
+
+    /* Get CPU portmap */
+    (*cpu_en) = BITS_OFF_R(regMFC, MFC_CPU_EN_OFFSET, MFC_CPU_EN_LENGTH);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_switch_setSysIntrEn
+ * PURPOSE:
+ *      Set system interrupt enable
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      intr            --  system interrupt type
+ *      enable          --  system interrupt enable/disable
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_switch_setSysIntrEn(
+    const UI32_T unit,
+    const AIR_SYS_INTR_TYPE_T intr,
+    const BOOL_T enable)
+{
+    UI32_T val = 0;
+
+    AIR_PARAM_CHK((intr >= AIR_SYS_INTR_TYPE_LAST), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK(((intr > AIR_SYS_INTR_TYPE_PHY7_LC) && (intr < AIR_SYS_INTR_TYPE_MAC_PC)), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK(((TRUE != enable) && (FALSE != enable)), AIR_E_BAD_PARAMETER);
+
+    aml_readReg(unit, SYS_INT_EN, &val);
+    val &= ~BIT(intr);
+    val |= (TRUE == enable) ? BIT(intr) : 0;
+    aml_writeReg(unit, SYS_INT_EN, val);
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_switch_getSysIntrEn
+ * PURPOSE:
+ *      Get system interrupt enable
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      intr            --  system interrupt type
+ *
+ * OUTPUT:
+ *      ptr_enable      --  system interrupt enable/disable
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_switch_getSysIntrEn(
+    const UI32_T unit,
+    const AIR_SYS_INTR_TYPE_T intr,
+    BOOL_T *ptr_enable)
+{
+    UI32_T val = 0;
+
+    AIR_PARAM_CHK((intr >= AIR_SYS_INTR_TYPE_LAST), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK(((intr > AIR_SYS_INTR_TYPE_PHY7_LC) && (intr < AIR_SYS_INTR_TYPE_MAC_PC)), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_enable);
+
+    aml_readReg(unit, SYS_INT_EN, &val);
+    *ptr_enable = (val & BIT(intr)) ? TRUE : FALSE;
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_switch_setSysIntrStatus
+ * PURPOSE:
+ *      Set system interrupt status
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      intr            --  system interrupt type
+ *      enable          --  write TRUE to clear interrupt status
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_switch_setSysIntrStatus(
+    const UI32_T unit,
+    const AIR_SYS_INTR_TYPE_T intr,
+    const BOOL_T enable)
+{
+    UI32_T val = 0;
+
+    AIR_PARAM_CHK((intr >= AIR_SYS_INTR_TYPE_LAST), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK(((intr > AIR_SYS_INTR_TYPE_PHY6_LC) && (intr < AIR_SYS_INTR_TYPE_MAC_PC)), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK((TRUE != enable), AIR_E_BAD_PARAMETER);
+
+    aml_writeReg(unit, SYS_INT_STS, BIT(intr));
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_switch_getSysIntrStatus
+ * PURPOSE:
+ *      Get system interrupt status
+ *
+ * INPUT:
+ *      unit            --  Device ID
+ *      intr            --  system interrupt type
+ *
+ * OUTPUT:
+ *      ptr_enable      --  system interrupt status
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *      AIR_E_BAD_PARAMETER
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_switch_getSysIntrStatus(
+    const UI32_T unit,
+    const AIR_SYS_INTR_TYPE_T intr,
+    BOOL_T *ptr_enable)
+{
+    UI32_T val = 0;
+
+    AIR_PARAM_CHK((intr >= AIR_SYS_INTR_TYPE_LAST), AIR_E_BAD_PARAMETER);
+    AIR_PARAM_CHK(((intr > AIR_SYS_INTR_TYPE_PHY6_LC) && (intr < AIR_SYS_INTR_TYPE_MAC_PC)), AIR_E_BAD_PARAMETER);
+    AIR_CHECK_PTR(ptr_enable);
+
+    aml_readReg(unit, SYS_INT_STS, &val);
+    *ptr_enable = (val & BIT(intr)) ? TRUE : FALSE;
+
+    return AIR_E_OK;
+}
+
+/* FUNCTION NAME: air_switch_reset
+ * PURPOSE:
+ *      Reset whole system
+ *
+ * INPUT:
+ *      None
+ *
+ * OUTPUT:
+ *      None
+ *
+ * RETURN:
+ *      AIR_E_OK
+ *
+ * NOTES:
+ *      None
+ */
+AIR_ERROR_NO_T
+air_switch_reset(
+    const UI32_T unit)
+{
+    UI32_T val = 0;
+
+    aml_writeReg(unit, RST_CTRL1, BIT(SYS_SW_RST_OFFT));
+    AIR_UDELAY(AIR_SYS_RST_WAIT_TIME);
+
+    return AIR_E_OK;
+}
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_vlan.c b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_vlan.c
new file mode 100644
index 0000000..6629165
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/api/src/air_vlan.c
@@ -0,0 +1,1448 @@
+/* FILE NAME:   air_vlan.c

+ * PURPOSE:

+ *      Define the VLAN function in AIR SDK.

+ * NOTES:

+ */

+

+/* INCLUDE FILE DECLARATIONS

+ */

+#include "air.h"

+

+/* NAMING CONSTANT DECLARATIONS

+ */

+

+/* MACRO FUNCTION DECLARATIONS

+ */

+

+/* DATA TYPE DECLARATIONS

+ */

+

+/* GLOBAL VARIABLE DECLARATIONS

+ */

+

+/* LOCAL SUBPROGRAM DECLARATIONS

+ */

+

+/* STATIC VARIABLE DECLARATIONS

+ */

+

+/* EXPORTED SUBPROGRAM BODIES

+ */

+

+/* LOCAL SUBPROGRAM BODIES

+*/

+void

+_air_vlan_readEntry(

+    const UI32_T unit,

+    const UI16_T vid,

+    AIR_VLAN_ENTRY_T* vlan_entry)

+{

+    UI32_T val = 0;

+    val = (0x80000000 + vid); //r_vid_cmd

+    aml_writeReg(unit, VTCR, val);

+

+    for (;;)

+    {

+        aml_readReg(unit, VTCR, &val);

+        if ((val & 0x80000000) == 0)

+            break;

+        AIR_UDELAY(10);

+    }

+

+    aml_readReg(unit, VLNRDATA0, &(vlan_entry->vlan_table.vlan_table0));

+    aml_readReg(unit, VLNRDATA1, &(vlan_entry->vlan_table.vlan_table1));

+}

+

+void

+_air_vlan_writeEntry(

+    const UI32_T unit,

+    const UI16_T vid,

+    AIR_VLAN_ENTRY_T* vlan_entry)

+{

+    UI32_T val = 0;

+

+    aml_writeReg(unit, VLNWDATA0, vlan_entry->vlan_table.vlan_table0);

+    aml_writeReg(unit, VLNWDATA1, vlan_entry->vlan_table.vlan_table1);

+    aml_writeReg(unit, VLNWDATA2, 0);

+    aml_writeReg(unit, VLNWDATA3, 0);

+    aml_writeReg(unit, VLNWDATA4, 0);

+

+    val = (0x80001000 + vid); //w_vid_cmd

+    aml_writeReg(unit, VTCR, val);

+

+    for (;;)

+    {

+        aml_readReg(unit, VTCR, &val);

+        if ((val & 0x80000000) == 0)

+            break;

+        AIR_UDELAY(10);

+    }

+}

+

+void

+_air_untagged_vlan_readEntry(

+    const UI32_T unit,

+    const UI16_T vid,

+    AIR_VLAN_ENTRY_ATTR_T* vlan_entry)

+{

+    UI32_T val = 0;

+    val = (0x80000000 + vid); //r_vid_cmd

+    aml_writeReg(unit, VTCR, val);

+

+    for (;;)

+    {

+        aml_readReg(unit, VTCR, &val);

+        if ((val & 0x80000000) == 0)

+            break;

+        AIR_UDELAY(10);

+    }

+

+    aml_readReg(unit, VLNRDATA0, &(vlan_entry->vlan_table.vlan_table0));

+    aml_readReg(unit, VLNRDATA1, &(vlan_entry->vlan_table.vlan_table1));

+    aml_readReg(unit, VLNRDATA2, &(vlan_entry->vlan_table.vlan_table2));

+    aml_readReg(unit, VLNRDATA3, &(vlan_entry->vlan_table.vlan_table3));

+    aml_readReg(unit, VLNRDATA4, &(vlan_entry->vlan_table.vlan_table4));

+}

+

+void

+_air_untagged_vlan_writeEntry(

+    const UI32_T unit,

+    const UI16_T vid,

+    AIR_VLAN_ENTRY_ATTR_T* vlan_entry)

+{

+    UI32_T val = 0;

+

+    aml_writeReg(unit, VLNWDATA0, vlan_entry->vlan_table.vlan_table0);

+    aml_writeReg(unit, VLNWDATA1, vlan_entry->vlan_table.vlan_table1);

+    aml_writeReg(unit, VLNWDATA2, vlan_entry->vlan_table.vlan_table2);

+    aml_writeReg(unit, VLNWDATA3, vlan_entry->vlan_table.vlan_table3);

+    aml_writeReg(unit, VLNWDATA4, vlan_entry->vlan_table.vlan_table4);

+

+    val = (0x80001000 + vid); //w_vid_cmd

+    aml_writeReg(unit, VTCR, val);

+

+    for (;;)

+    {

+        aml_readReg(unit, VTCR, &val);

+        if ((val & 0x80000000) == 0)

+            break;

+        AIR_UDELAY(10);

+    }

+}

+

+/* FUNCTION NAME:   air_vlan_create

+ * PURPOSE:

+ *      Create the vlan in the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ *      p_attr      -- vlan attr

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Vlan creation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_create(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    AIR_VLAN_ENTRY_ATTR_T *p_attr)

+{

+    AIR_VLAN_ENTRY_T vlan_entry = {0};

+

+    AIR_PARAM_CHK((vid > AIR_VLAN_ID_MAX), AIR_E_BAD_PARAMETER);

+

+    _air_vlan_readEntry(unit, vid, &vlan_entry);

+    if (vlan_entry.valid)

+        return AIR_E_ENTRY_EXISTS;

+

+    if (NULL != p_attr)

+    {

+        p_attr->valid = 1;

+        _air_untagged_vlan_writeEntry(unit, vid, p_attr);

+    }

+    else

+    {

+        memset(&vlan_entry, 0, sizeof(vlan_entry));

+        vlan_entry.valid = 1;

+        _air_untagged_vlan_writeEntry(unit, vid, &vlan_entry);

+    }

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_destroy

+ * PURPOSE:

+ *      Destroy the vlan in the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK     -- Successfully read the data.

+ *      AIR_E_OTHERS -- Vlan destroy failed.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_destroy(

+    const UI32_T    unit,

+    const UI16_T    vid)

+{

+    AIR_VLAN_ENTRY_T vlan_entry = {0};

+

+    AIR_PARAM_CHK((vid > AIR_VLAN_ID_MAX), AIR_E_BAD_PARAMETER);

+

+    _air_vlan_writeEntry(unit, vid, &vlan_entry);

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_destroyAll

+ * PURPOSE:

+ *      Destroy the vlan in the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK     -- Successfully read the data.

+ *      AIR_E_OTHERS -- Vlan destroy failed.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_destroyAll(

+    const UI32_T    unit,

+    const UI32_T    keep_and_restore_default_vlan)

+{

+    UI16_T vid = 0;

+

+    for (vid = AIR_VLAN_ID_MIN; vid <= AIR_VLAN_ID_MAX; vid++)

+    {

+        if (keep_and_restore_default_vlan)

+        {

+            air_vlan_reset(unit, vid);

+        }

+        else

+        {

+            air_vlan_destroy(unit, vid);

+        }

+    }

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_reset

+ * PURPOSE:

+ *      Destroy the vlan in the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK     -- Successfully reset the data.

+ *      AIR_E_OTHERS -- Vlan reset failed.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_reset(

+    const UI32_T    unit,

+    const UI16_T    vid)

+{

+    AIR_VLAN_ENTRY_T vlan_entry = {0};

+

+    AIR_PARAM_CHK((vid > AIR_VLAN_ID_MAX), AIR_E_BAD_PARAMETER);

+

+    vlan_entry.vlan_entry_format.port_mem = AIR_ALL_PORT_BITMAP;

+    vlan_entry.valid = TRUE;

+

+    _air_vlan_writeEntry(unit, vid, &vlan_entry);

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_setFid

+ * PURPOSE:

+ *      Set the filter id of the vlan to the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ *      fid         -- filter id

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setFid(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    const UI8_T     fid)

+{

+    AIR_VLAN_ENTRY_T vlan_entry = {0};

+

+    /* VID check */

+    AIR_PARAM_CHK((vid > AIR_VLAN_ID_MAX), AIR_E_BAD_PARAMETER);

+    AIR_PARAM_CHK((fid > AIR_FILTER_ID_MAX), AIR_E_BAD_PARAMETER);

+

+    _air_vlan_readEntry(unit, vid, &vlan_entry);

+    if (!vlan_entry.valid)

+        return AIR_E_ENTRY_NOT_FOUND;

+

+    vlan_entry.vlan_entry_format.fid = fid;

+    _air_vlan_writeEntry(unit, vid, &vlan_entry);

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_getFid

+ * PURPOSE:

+ *      Get the filter id of the vlan from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id to be created

+ * OUTPUT:

+ *      ptr_fid     -- filter id

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getFid(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    UI8_T           *ptr_fid)

+{

+    AIR_VLAN_ENTRY_T vlan_entry = {0};

+

+    AIR_PARAM_CHK((vid > AIR_VLAN_ID_MAX), AIR_E_BAD_PARAMETER);

+    AIR_CHECK_PTR(ptr_fid);

+

+    _air_vlan_readEntry(unit, vid, &vlan_entry);

+    if (!vlan_entry.valid)

+        return AIR_E_ENTRY_NOT_FOUND;

+

+    *ptr_fid = vlan_entry.vlan_entry_format.fid;

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_addMemberPort

+ * PURPOSE:

+ *      Add one vlan member to the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ *      port        -- port id

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_addMemberPort(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    const UI32_T    port)

+{

+    AIR_VLAN_ENTRY_T vlan_entry = {0};

+

+    AIR_PARAM_CHK((vid > AIR_VLAN_ID_MAX), AIR_E_BAD_PARAMETER);

+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);

+

+    _air_vlan_readEntry(unit, vid, &vlan_entry);

+    if (!vlan_entry.valid)

+        return AIR_E_ENTRY_NOT_FOUND;

+

+    vlan_entry.vlan_entry_format.port_mem |= 1 << port;

+    _air_vlan_writeEntry(unit, vid, &vlan_entry);

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_delMemberPort

+ * PURPOSE:

+ *      Delete one vlan member from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ *      port        -- port id

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_delMemberPort(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    const UI32_T    port)

+{

+    AIR_VLAN_ENTRY_T vlan_entry = {0};

+

+    AIR_PARAM_CHK((vid > AIR_VLAN_ID_MAX), AIR_E_BAD_PARAMETER);

+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);

+

+    _air_vlan_readEntry(unit, vid, &vlan_entry);

+    if (!vlan_entry.valid)

+        return AIR_E_ENTRY_NOT_FOUND;

+

+    vlan_entry.vlan_entry_format.port_mem &= ~(1 << port);

+    _air_vlan_writeEntry(unit, vid, &vlan_entry);

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_setMemberPort

+ * PURPOSE:

+ *      Replace the vlan members in the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ *      port_bitmap -- member port bitmap

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setMemberPort(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    const UI32_T    port_bitmap)

+{

+    AIR_VLAN_ENTRY_T vlan_entry = {0};

+

+    AIR_PARAM_CHK((vid > AIR_VLAN_ID_MAX), AIR_E_BAD_PARAMETER);

+    AIR_PARAM_CHK((port_bitmap & (~AIR_ALL_PORT_BITMAP)), AIR_E_BAD_PARAMETER);

+

+    _air_vlan_readEntry(unit, vid, &vlan_entry);

+    if (!vlan_entry.valid)

+        return AIR_E_ENTRY_NOT_FOUND;

+

+    vlan_entry.vlan_entry_format.port_mem = port_bitmap;

+    _air_vlan_writeEntry(unit, vid, &vlan_entry);

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_getMemberPort

+ * PURPOSE:

+ *      Get the vlan members from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ * OUTPUT:

+ *      port_bitmap -- member port bitmap

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getMemberPort(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    UI32_T          *ptr_port_bitmap)

+{

+    AIR_VLAN_ENTRY_T vlan_entry = {0};

+

+    AIR_PARAM_CHK((vid > AIR_VLAN_ID_MAX), AIR_E_BAD_PARAMETER);

+    AIR_CHECK_PTR(ptr_port_bitmap);

+

+    _air_vlan_readEntry(unit, vid, &vlan_entry);

+    if (!vlan_entry.valid)

+        return AIR_E_ENTRY_NOT_FOUND;

+

+    *ptr_port_bitmap = vlan_entry.vlan_entry_format.port_mem;

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_setIVL

+ * PURPOSE:

+ *      Set L2 lookup mode IVL/SVL for L2 traffic.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ *      enable      -- enable IVL

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setIVL(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    const BOOL_T    enable)

+{

+    AIR_VLAN_ENTRY_T vlan_entry = {0};

+

+    AIR_PARAM_CHK((vid > AIR_VLAN_ID_MAX), AIR_E_BAD_PARAMETER);

+

+    _air_vlan_readEntry(unit, vid, &vlan_entry);

+    if (!vlan_entry.valid)

+        return AIR_E_ENTRY_NOT_FOUND;

+

+    vlan_entry.vlan_entry_format.ivl = enable ? 1 : 0;

+    _air_vlan_writeEntry(unit, vid, &vlan_entry);

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_getIVL

+ * PURPOSE:

+ *      Get L2 lookup mode IVL/SVL for L2 traffic.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ * OUTPUT:

+ *      ptr_enable  -- enable IVL

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getIVL(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    BOOL_T          *ptr_enable)

+{

+    AIR_VLAN_ENTRY_T vlan_entry = {0};

+

+    AIR_PARAM_CHK((vid > AIR_VLAN_ID_MAX), AIR_E_BAD_PARAMETER);

+    AIR_CHECK_PTR(ptr_enable);

+

+    _air_vlan_readEntry(unit, vid, &vlan_entry);

+    if (!vlan_entry.valid)

+        return AIR_E_ENTRY_NOT_FOUND;

+

+    *ptr_enable = vlan_entry.vlan_entry_format.ivl;

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_setPortAcceptFrameType

+ * PURPOSE:

+ *      Set vlan accept frame type of the port from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ *      type        -- accept frame type

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setPortAcceptFrameType(

+    const UI32_T    unit,

+    const UI32_T    port,

+    const AIR_VLAN_ACCEPT_FRAME_TYPE_T type)

+{

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+    UI32_T val = 0;

+

+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);

+    AIR_PARAM_CHK((type >= AIR_VLAN_ACCEPT_FRAME_TYPE_LAST), AIR_E_BAD_PARAMETER);

+

+    aml_readReg(unit, PVC(port), &val);

+    val &= ~PVC_ACC_FRM_MASK;

+    val |= (type & PVC_ACC_FRM_RELMASK) << PVC_ACC_FRM_OFFT;

+    aml_writeReg(unit, PVC(port), val);

+

+    return rc;

+}

+

+/* FUNCTION NAME:   air_vlan_getPortAcceptFrameType

+ * PURPOSE:

+ *      Get vlan accept frame type of the port from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ * OUTPUT:

+ *      ptr_type    -- accept frame type

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getPortAcceptFrameType(

+    const UI32_T    unit,

+    const UI32_T    port,

+    AIR_VLAN_ACCEPT_FRAME_TYPE_T *ptr_type)

+{

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+    UI32_T val = 0;

+

+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);

+    AIR_CHECK_PTR(ptr_type);

+

+    aml_readReg(unit, PVC(port), &val);

+    *ptr_type = (val >> PVC_ACC_FRM_OFFT) & PVC_ACC_FRM_RELMASK;

+

+    return rc;

+}

+

+/* FUNCTION NAME:   air_vlan_setPortLeakyVlanEnable

+ * PURPOSE:

+ *      Set leaky vlan enable of the port from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ *      pkt_type    -- packet type

+ *      enable      -- enable leaky

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setPortLeakyVlanEnable(

+    const UI32_T    unit,

+    const UI32_T    port,

+    AIR_LEAKY_PKT_TYPE_T   pkt_type,

+    const BOOL_T    enable)

+{

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+    UI32_T val = 0;

+

+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);

+    AIR_PARAM_CHK((pkt_type >= AIR_LEAKY_PKT_TYPE_LAST), AIR_E_BAD_PARAMETER);

+

+    aml_readReg(unit, PVC(port), &val);

+

+    if (pkt_type == AIR_LEAKY_PKT_TYPE_UNICAST)

+    {

+        if (enable)

+        {

+            val |= PVC_UC_LKYV_EN_MASK;

+        }

+        else

+        {

+            val &= ~PVC_UC_LKYV_EN_MASK;

+        }

+    }

+    else if (pkt_type == AIR_LEAKY_PKT_TYPE_MULTICAST)

+    {

+        if (enable)

+        {

+            val |= PVC_MC_LKYV_EN_MASK;

+        }

+        else

+        {

+            val &= ~PVC_MC_LKYV_EN_MASK;

+        }

+    }

+    else

+    {

+        if (enable)

+        {

+            val |= PVC_BC_LKYV_EN_MASK;

+        }

+        else

+        {

+            val &= ~PVC_BC_LKYV_EN_MASK;

+        }

+    }

+

+    aml_writeReg(unit, PVC(port), val);

+

+    return rc;

+}

+

+/* FUNCTION NAME:   air_vlan_getPortLeakyVlanEnable

+ * PURPOSE:

+ *      Get leaky vlan enable of the port from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ *      pkt_type    -- packet type

+ * OUTPUT:

+ *      ptr_enable  -- enable leaky

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getPortLeakyVlanEnable(

+    const UI32_T    unit,

+    const UI32_T    port,

+    AIR_LEAKY_PKT_TYPE_T   pkt_type,

+    BOOL_T          *ptr_enable)

+{

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+    UI32_T val = 0;

+

+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);

+    AIR_PARAM_CHK((pkt_type >= AIR_LEAKY_PKT_TYPE_LAST), AIR_E_BAD_PARAMETER);

+    AIR_CHECK_PTR(ptr_enable);

+

+    aml_readReg(unit, PVC(port), &val);

+

+    if (pkt_type == AIR_LEAKY_PKT_TYPE_UNICAST)

+    {

+        *ptr_enable = val & PVC_UC_LKYV_EN_MASK ? TRUE : FALSE;

+    }

+    else if (pkt_type == AIR_LEAKY_PKT_TYPE_MULTICAST)

+    {

+        *ptr_enable = val & PVC_MC_LKYV_EN_MASK ? TRUE : FALSE;

+    }

+    else

+    {

+        *ptr_enable = val & PVC_BC_LKYV_EN_MASK ? TRUE : FALSE;

+    }

+

+    return rc;

+}

+

+/* FUNCTION NAME:   air_vlan_setPortAttr

+ * PURPOSE:

+ *      Set vlan port attribute from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ *      attr        -- vlan port attr

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setPortAttr(

+    const UI32_T    unit,

+    const UI32_T    port,

+    const AIR_VLAN_PORT_ATTR_T attr)

+{

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+    UI32_T val = 0;

+

+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);

+    AIR_PARAM_CHK((attr >= AIR_VLAN_PORT_ATTR_LAST), AIR_E_BAD_PARAMETER);

+

+    aml_readReg(unit, PVC(port), &val);

+    val &= ~PVC_VLAN_ATTR_MASK;

+    val |= (attr & PVC_VLAN_ATTR_RELMASK) << PVC_VLAN_ATTR_OFFT;

+    aml_writeReg(unit, PVC(port), val);

+

+    return rc;

+}

+

+/* FUNCTION NAME:   air_vlan_getPortAttr

+ * PURPOSE:

+ *      Get vlan port attribute from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ * OUTPUT:

+ *      ptr_attr    -- vlan port attr

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getPortAttr(

+    const UI32_T    unit,

+    const UI32_T    port,

+    AIR_VLAN_PORT_ATTR_T *ptr_attr)

+{

+    AIR_ERROR_NO_T rc = AIR_E_OK;

+    UI32_T val = 0;

+

+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);

+    AIR_CHECK_PTR(ptr_attr);

+

+    aml_readReg(unit, PVC(port), &val);

+    *ptr_attr = (val >> PVC_VLAN_ATTR_OFFT) & PVC_VLAN_ATTR_RELMASK;

+

+    return rc;

+}

+

+/* FUNCTION NAME:   air_vlan_setIgrPortTagAttr

+ * PURPOSE:

+ *      Set vlan incoming port egress tag attribute from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ *      attr        -- egress tag attr

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setIgrPortTagAttr(

+    const UI32_T    unit,

+    const UI32_T    port,

+    const AIR_IGR_PORT_EG_TAG_ATTR_T attr)

+{

+    UI32_T val = 0;

+

+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);

+    AIR_PARAM_CHK((attr >= AIR_IGR_PORT_EG_TAG_ATTR_LAST), AIR_E_BAD_PARAMETER);

+

+    aml_readReg(unit, PVC(port), &val);

+    val &= ~PVC_EG_TAG_MASK;

+    val |= (attr & PVC_EG_TAG_RELMASK) << PVC_EG_TAG_OFFT;

+    aml_writeReg(unit, PVC(port), val);

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_getIgrPortTagAttr

+ * PURPOSE:

+ *      Get vlan incoming port egress tag attribute from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ * OUTPUT:

+ *      ptr_attr    -- egress tag attr

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getIgrPortTagAttr(

+    const UI32_T    unit,

+    const UI32_T    port,

+    AIR_IGR_PORT_EG_TAG_ATTR_T *ptr_attr)

+{

+    UI32_T val = 0;

+

+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);

+    AIR_CHECK_PTR(ptr_attr);

+

+    aml_readReg(unit, PVC(port), &val);

+    *ptr_attr = (val >> PVC_EG_TAG_OFFT) & PVC_EG_TAG_RELMASK;

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_setPortEgsTagAttr

+ * PURPOSE:

+ *      Set vlan port egress tag attribute from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ *      attr        -- egress tag attr

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setPortEgsTagAttr(

+    const UI32_T    unit,

+    const UI32_T    port,

+    const AIR_PORT_EGS_TAG_ATTR_T attr)

+{

+    UI32_T val = 0;

+

+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);

+    AIR_PARAM_CHK((attr >= AIR_PORT_EGS_TAG_ATTR_LAST), AIR_E_BAD_PARAMETER);

+

+    aml_readReg(unit, PCR(port), &val);

+    val &= ~PCR_EG_TAG_MASK;

+    val |= (attr & PCR_EG_TAG_RELMASK) << PCR_EG_TAG_OFFT;

+    aml_writeReg(unit, PCR(port), val);

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_getPortEgsTagAttr

+ * PURPOSE:

+ *      Get vlan port egress tag attribute from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ * OUTPUT:

+ *      ptr_attr    -- egress tag attr

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getPortEgsTagAttr(

+    const UI32_T    unit,

+    const UI32_T    port,

+    AIR_PORT_EGS_TAG_ATTR_T *ptr_attr)

+{

+    UI32_T val = 0;

+

+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);

+    AIR_CHECK_PTR(ptr_attr);

+

+    aml_readReg(unit, PCR(port), &val);

+    *ptr_attr = (val >> PCR_EG_TAG_OFFT) & PCR_EG_TAG_RELMASK;

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_setPortOuterTPID

+ * PURPOSE:

+ *      Set stack tag TPID of the port from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ *      tpid        -- TPID

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setPortOuterTPID(

+    const UI32_T    unit,

+    const UI32_T    port,

+    const UI16_T    tpid)

+{

+    UI32_T val = 0;

+

+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);

+

+    aml_readReg(unit, PVC(port), &val);

+    val &= ~PVC_STAG_VPID_MASK;

+    val |= (tpid & PVC_STAG_VPID_RELMASK) << PVC_STAG_VPID_OFFT;

+    aml_writeReg(unit, PVC(port), val);

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_getPortOuterTPID

+ * PURPOSE:

+ *      Get stack tag TPID of the port from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ * OUTPUT:

+ *      ptr_tpid    -- TPID

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getPortOuterTPID(

+    const UI32_T    unit,

+    const UI32_T    port,

+    UI16_T          *ptr_tpid)

+{

+    UI32_T val = 0;

+

+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);

+    AIR_CHECK_PTR(ptr_tpid);

+

+    aml_readReg(unit, PVC(port), &val);

+    *ptr_tpid = (val >> PVC_STAG_VPID_OFFT) & PVC_STAG_VPID_RELMASK;

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_setPortPVID

+ * PURPOSE:

+ *      Set PVID of the port from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ *      pvid        -- native vlan id

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setPortPVID(

+    const UI32_T    unit,

+    const UI32_T    port,

+    const UI16_T    pvid)

+{

+    UI32_T val = 0;

+

+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);

+    AIR_PARAM_CHK((pvid > AIR_VLAN_ID_MAX), AIR_E_BAD_PARAMETER);

+

+    aml_readReg(unit, PVID(port), &val);

+    val &= ~PVID_PCVID_MASK;

+    val |= (pvid & PVID_PCVID_RELMASK) << PVID_PCVID_OFFT;

+    aml_writeReg(unit, PVID(port), val);

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_getPortPVID

+ * PURPOSE:

+ *      Get PVID of the port from the specified device.

+ * INPUT:

+ *      unit        -- unit id

+ *      port        -- port id

+ * OUTPUT:

+ *      ptr_pvid    -- native vlan id

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getPortPVID(

+    const UI32_T    unit,

+    const UI32_T    port,

+    UI16_T          *ptr_pvid)

+{

+    UI32_T val = 0;

+

+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);

+    AIR_CHECK_PTR(ptr_pvid);

+

+    aml_readReg(unit, PVID(port), &val);

+    *ptr_pvid = (val >> PVID_PCVID_OFFT) & PVID_PCVID_RELMASK;

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_setServiceTag

+ * PURPOSE:

+ *      Set Vlan service tag.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ *      stag        -- service stag

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setServiceTag(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    const UI16_T    stag)

+{

+    AIR_VLAN_ENTRY_T vlan_entry = {0};

+

+    AIR_PARAM_CHK((vid > AIR_VLAN_ID_MAX), AIR_E_BAD_PARAMETER);

+    AIR_PARAM_CHK((stag > AIR_VLAN_ID_MAX), AIR_E_BAD_PARAMETER);

+

+    _air_vlan_readEntry(unit, vid, &vlan_entry);

+    if (!vlan_entry.valid)

+        return AIR_E_ENTRY_NOT_FOUND;

+

+    vlan_entry.vlan_entry_format.stag = stag;

+    _air_vlan_writeEntry(unit, vid, &vlan_entry);

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_getServiceTag

+ * PURPOSE:

+ *      Get Vlan service tag.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ * OUTPUT:

+ *      ptr_stag    -- service stag

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getServiceTag(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    UI16_T          *ptr_stag)

+{

+    AIR_VLAN_ENTRY_T vlan_entry = {0};

+

+    AIR_PARAM_CHK((vid > AIR_VLAN_ID_MAX), AIR_E_BAD_PARAMETER);

+    AIR_CHECK_PTR(ptr_stag);

+

+    _air_vlan_readEntry(unit, vid, &vlan_entry);

+    if (!vlan_entry.valid)

+        return AIR_E_ENTRY_NOT_FOUND;

+

+    *ptr_stag = vlan_entry.vlan_entry_format.stag;

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_setEgsTagCtlEnable

+ * PURPOSE:

+ *      Set per vlan egress tag control.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ *      enable      -- enable vlan egress tag control

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setEgsTagCtlEnable(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    const BOOL_T    enable)

+{

+    AIR_VLAN_ENTRY_T vlan_entry = {0};

+

+    AIR_PARAM_CHK((vid > AIR_VLAN_ID_MAX), AIR_E_BAD_PARAMETER);

+

+    _air_vlan_readEntry(unit, vid, &vlan_entry);

+    if (!vlan_entry.valid)

+        return AIR_E_ENTRY_NOT_FOUND;

+

+    vlan_entry.vlan_entry_format.eg_ctrl_en = enable ? 1 : 0;

+    _air_vlan_writeEntry(unit, vid, &vlan_entry);

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_getEgsTagCtlEnable

+ * PURPOSE:

+ *      Get per vlan egress tag control.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ * OUTPUT:

+ *      ptr_enable  -- enable vlan egress tag control

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getEgsTagCtlEnable(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    BOOL_T          *ptr_enable)

+{

+    AIR_VLAN_ENTRY_T vlan_entry = {0};

+

+    AIR_PARAM_CHK((vid > AIR_VLAN_ID_MAX), AIR_E_BAD_PARAMETER);

+    AIR_CHECK_PTR(ptr_enable);

+

+    _air_vlan_readEntry(unit, vid, &vlan_entry);

+    if (!vlan_entry.valid)

+        return AIR_E_ENTRY_NOT_FOUND;

+

+    *ptr_enable = vlan_entry.vlan_entry_format.eg_ctrl_en;

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_setEgsTagConsistent

+ * PURPOSE:

+ *      Set per vlan egress tag consistent.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ *      enable      -- enable vlan egress tag consistent

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setEgsTagConsistent(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    const BOOL_T    enable)

+{

+    AIR_VLAN_ENTRY_T vlan_entry = {0};

+

+    AIR_PARAM_CHK((vid > AIR_VLAN_ID_MAX), AIR_E_BAD_PARAMETER);

+

+    _air_vlan_readEntry(unit, vid, &vlan_entry);

+    if (!vlan_entry.valid)

+        return AIR_E_ENTRY_NOT_FOUND;

+

+    vlan_entry.vlan_entry_format.eg_con = enable;

+    _air_vlan_writeEntry(unit, vid, &vlan_entry);

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_getEgsTagConsistent

+ * PURPOSE:

+ *      Get per vlan egress tag consistent.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ * OUTPUT:

+ *      ptr_enable  -- enable vlan egress tag consistent

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getEgsTagConsistent(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    BOOL_T          *ptr_enable)

+{

+    AIR_VLAN_ENTRY_T vlan_entry = {0};

+

+    AIR_PARAM_CHK((vid > AIR_VLAN_ID_MAX), AIR_E_BAD_PARAMETER);

+    AIR_CHECK_PTR(ptr_enable);

+

+    _air_vlan_readEntry(unit, vid, &vlan_entry);

+    if (!vlan_entry.valid)

+        return AIR_E_ENTRY_NOT_FOUND;

+

+    *ptr_enable = vlan_entry.vlan_entry_format.eg_con;

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_setPortBasedStag

+ * PURPOSE:

+ *      Set vlan port based stag enable.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ *      enable      -- vlan port based stag enable

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setPortBasedStag(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    const BOOL_T    enable)

+{

+    AIR_VLAN_ENTRY_T vlan_entry = {0};

+

+    AIR_PARAM_CHK((vid > AIR_VLAN_ID_MAX), AIR_E_BAD_PARAMETER);

+

+    _air_vlan_readEntry(unit, vid, &vlan_entry);

+    if (!vlan_entry.valid)

+        return AIR_E_ENTRY_NOT_FOUND;

+

+    vlan_entry.vlan_entry_format.port_stag = enable;

+    _air_vlan_writeEntry(unit, vid, &vlan_entry);

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_getPortBasedStag

+ * PURPOSE:

+ *      Get vlan port based stag enable.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ * OUTPUT:

+ *      ptr_enable  -- vlan port based stag enable

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getPortBasedStag(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    BOOL_T          *ptr_enable)

+{

+    AIR_VLAN_ENTRY_T vlan_entry = {0};

+

+    AIR_PARAM_CHK((vid > AIR_VLAN_ID_MAX), AIR_E_BAD_PARAMETER);

+    AIR_CHECK_PTR(ptr_enable);

+

+    _air_vlan_readEntry(unit, vid, &vlan_entry);

+    if (!vlan_entry.valid)

+        return AIR_E_ENTRY_NOT_FOUND;

+

+    *ptr_enable = vlan_entry.vlan_entry_format.port_stag;

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_setPortEgsTagCtl

+ * PURPOSE:

+ *      Set vlan port egress tag control.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ *      port        -- port id

+ *      tag_ctl     -- egress tag control

+ * OUTPUT:

+ *      None

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_setPortEgsTagCtl(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    const UI32_T    port,

+    const AIR_VLAN_PORT_EGS_TAG_CTL_TYPE_T    tag_ctl)

+{

+    AIR_VLAN_ENTRY_T vlan_entry = {0};

+

+    AIR_PARAM_CHK((vid > AIR_VLAN_ID_MAX), AIR_E_BAD_PARAMETER);

+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);

+    AIR_PARAM_CHK((tag_ctl >= AIR_PORT_EGS_TAG_ATTR_LAST), AIR_E_BAD_PARAMETER);

+

+    _air_vlan_readEntry(unit, vid, &vlan_entry);

+    if (!vlan_entry.valid)

+        return AIR_E_ENTRY_NOT_FOUND;

+

+    vlan_entry.vlan_entry_format.eg_ctrl &= ~(0x3 << (port * 2));

+    vlan_entry.vlan_entry_format.eg_ctrl |= (tag_ctl & 0x3) << (port * 2);

+    _air_vlan_writeEntry(unit, vid, &vlan_entry);

+

+    return AIR_E_OK;

+}

+

+/* FUNCTION NAME:   air_vlan_getPortEgsTagCtl

+ * PURPOSE:

+ *      Get vlan port egress tag control.

+ * INPUT:

+ *      unit        -- unit id

+ *      vid         -- vlan id

+ * OUTPUT:

+ *      ptr_tag_ctl -- egress tag control

+ * RETURN:

+ *      AIR_E_OK                -- Successfully read the data.

+ *      AIR_E_OTHERS            -- Operation failed.

+ *      AIR_E_BAD_PARAMETER     -- Invalid parameter.

+ * NOTES:

+ *      none

+ */

+AIR_ERROR_NO_T

+air_vlan_getPortEgsTagCtl(

+    const UI32_T    unit,

+    const UI16_T    vid,

+    const UI32_T    port,

+    AIR_VLAN_PORT_EGS_TAG_CTL_TYPE_T   *ptr_tag_ctl)

+{

+    AIR_VLAN_ENTRY_T vlan_entry = {0};

+

+    AIR_PARAM_CHK((vid > AIR_VLAN_ID_MAX), AIR_E_BAD_PARAMETER);

+    AIR_PARAM_CHK((port >= AIR_MAX_NUM_OF_PORTS), AIR_E_BAD_PARAMETER);

+    AIR_CHECK_PTR(ptr_tag_ctl);

+

+    _air_vlan_readEntry(unit, vid, &vlan_entry);

+    if (!vlan_entry.valid)

+        return AIR_E_ENTRY_NOT_FOUND;

+

+    *ptr_tag_ctl = (vlan_entry.vlan_entry_format.eg_ctrl >> (port * 2)) & 0x3;

+

+    return AIR_E_OK;

+}

diff --git a/recipes-devtools/switch/files/src/an8855_sdk/core/an8855_init.c b/recipes-devtools/switch/files/src/an8855_sdk/core/an8855_init.c
new file mode 100644
index 0000000..c754955
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/core/an8855_init.c
@@ -0,0 +1,138 @@
+/* FILE NAME:  an8855_init.c
+ * PURPOSE:
+ *    It provides an8855 switch intialize flow.
+ *
+ * NOTES:
+ *
+ */
+
+/* INCLUDE FILE DECLARATIONS
+ */
+#include "an8855_reg.h"
+#include "an8855_mdio.h"
+#include "an8855_phy.h"
+
+/* NAMING CONSTANT DECLARATIONS
+*/
+
+/* MACRO FUNCTION DECLARATIONS
+ */
+
+/* DATA TYPE DECLARATIONS
+*/
+
+/* GLOBAL VARIABLE DECLARATIONS
+*/
+
+/* LOCAL SUBPROGRAM DECLARATIONS
+*/
+
+/* STATIC VARIABLE DECLARATIONS
+*/
+
+/* EXPORTED SUBPROGRAM BODIES
+*/
+
+/* FUNCTION NAME:   an8855_hw_reset
+ * PURPOSE:
+ *      This API is used to reset an8855 hw.
+ * INPUT:
+ * OUTPUT:
+ * RETURN:
+ * NOTES:
+ *      Attention!! Customer should implement this func
+ */
+void
+an8855_hw_reset(void)
+{
+    //dbg_print(">>>>> an8855_hw_reset\n");
+    /* set an8855 reset pin to 0 */
+
+    /* delay 100ms */
+
+    /* set an8855 reset pin to 1 */
+
+    /* delay 600ms */
+
+}
+
+/* FUNCTION NAME:   an8855_sw_reset
+ * PURPOSE:
+ *      This API is used to reset an8855 system.
+ * INPUT:
+ * OUTPUT:
+ * RETURN:
+ * NOTES:
+ */
+void
+an8855_sw_reset(void)
+{
+    //dbg_print(">>>>> an8855_sw_reset\n");
+    an8855_reg_write(0x100050c0, 0x80000000);
+    an8855_udelay(100000);
+}
+
+/* FUNCTION NAME:   an8855_phy_calibration_setting
+ * PURPOSE:
+ *      This API is used to set an8855 phy calibration.
+ * INPUT:
+ * OUTPUT:
+ * RETURN:
+ * NOTES:
+ *      None
+ */
+void
+an8855_phy_calibration_setting(void)
+{
+    int i = 0;
+
+    //dbg_print("\nSMI IOMUX initial ...");
+    an8855_reg_write(0x10000070, 0x2);
+    an8855_udelay(10000);
+    //dbg_print("\nGPHY initial ...");
+    an8855_reg_write(0x1028C840, 0x0);
+    for(i = 0; i <= 4; i++)
+    {
+        an8855_phy_write(i, 0, 0x1040);
+    }
+    an8855_udelay(10000);
+    //dbg_print("Done");
+    //dbg_print("\nSw calibration ... ");
+    gphy_calibration(g_smi_addr);
+    //dbg_print("\nDone");
+}
+
+/* FUNCTION NAME:   an8855_init
+ * PURPOSE:
+ *      This API is used to init an8855.
+ * INPUT:
+ * OUTPUT:
+ * RETURN:
+ *      0 -- init success
+ *      -1 -- init failure
+ * NOTES:
+ *      Attention!! Customer should implement part of this func
+ */
+int
+an8855_init(void)
+{
+    u32 data = 0;
+
+    /* an8855 hw reset */
+    an8855_hw_reset();
+
+    /* an8855 system reset */
+    an8855_sw_reset();
+
+    /* Keep the clock ticking when all ports link down */
+    data = an8855_reg_read(0x10213e1c);
+    data &= ~(0x3);
+    an8855_reg_write(0x10213e1c, data);
+
+    /* internal phy calibration */
+    /* please comment out this func after calibration data loaded from ROM code */
+    an8855_phy_calibration_setting();
+
+    return 0;
+}
+
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/core/an8855_mdio.c b/recipes-devtools/switch/files/src/an8855_sdk/core/an8855_mdio.c
new file mode 100644
index 0000000..3ff7ded
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/core/an8855_mdio.c
@@ -0,0 +1,285 @@
+/* FILE NAME:  an8855_mdio.c
+ * PURPOSE:
+ *    It provides an8855 registers and PHY mdio access.
+ *
+ * NOTES:
+ *
+ */
+
+/* INCLUDE FILE DECLARATIONS
+ */
+#include "an8855_reg.h"
+#include "an8855_mdio.h"
+
+/* NAMING CONSTANT DECLARATIONS
+*/
+
+/* MACRO FUNCTION DECLARATIONS
+ */
+#define AN8855_SMI_ADDR     (1)
+
+/* DATA TYPE DECLARATIONS
+*/
+
+/* GLOBAL VARIABLE DECLARATIONS
+*/
+
+/* LOCAL SUBPROGRAM DECLARATIONS
+*/
+
+/* STATIC VARIABLE DECLARATIONS
+*/
+u32 g_smi_addr = AN8855_SMI_ADDR;
+
+static AIR_MII_READ_FUNC_T g_mii_read = NULL;
+static AIR_MII_WRITE_FUNC_T g_mii_write = NULL;
+static AIR_MII_C45_READ_FUNC_T g_mii_c45_read = NULL;
+static AIR_MII_C45_WRITE_FUNC_T g_mii_c45_write = NULL;
+
+/* EXPORTED SUBPROGRAM BODIES
+*/
+
+/* FUNCTION NAME:   an8855_set_smi_addr
+ * PURPOSE:
+ *      This API is used to set an8855 smi address.
+ * INPUT:
+ *      smi_addr -- AN8855 smi address
+ * OUTPUT:
+ * RETURN:
+ * NOTES:
+ *      None
+ */
+void
+an8855_set_smi_addr(u32 smi_addr)
+{
+    an8855_reg_write(0x1028C848, smi_addr);
+    g_smi_addr = smi_addr;
+}
+
+/* FUNCTION NAME:   an8855_set_mii_callback
+ * PURPOSE:
+ *      This API is used to set an8855 mii access callbacks.
+ * INPUT:
+ *      mii_read -- mii read api function
+ *      mii_write -- mii write api function
+ *      mii_c45_read --  mii c45 read api function
+ *      mii_c45_write -- mii c45 write api function
+ * OUTPUT:
+ * RETURN:
+ *      0     -- Successfully set callback.
+ *      -1    -- Setting callback failed.
+ * NOTES:
+ *      None
+ */
+int
+an8855_set_mii_callback(
+    AIR_MII_READ_FUNC_T mii_read,
+    AIR_MII_WRITE_FUNC_T mii_write,
+    AIR_MII_C45_READ_FUNC_T mii_c45_read,
+    AIR_MII_C45_WRITE_FUNC_T mii_c45_write)
+{
+    if (!mii_read || !mii_write || !mii_c45_read || !mii_c45_write)
+        return -1;
+
+    g_mii_read = mii_read;
+    g_mii_write = mii_write;
+    g_mii_c45_read = mii_c45_read;
+    g_mii_c45_write = mii_c45_write;
+
+    return 0;
+}
+
+/* FUNCTION NAME:   an8855_reg_read
+ * PURPOSE:
+ *      This API is used read an8855 registers.
+ * INPUT:
+ *      reg -- register offset
+ * OUTPUT:
+ * RETURN:
+ *      Register value
+ * NOTES:
+ *      Attention!! Customer should implement mdio mutex
+ *      lock in this func
+ */
+u32
+an8855_reg_read(u32 reg)
+{
+    u16 data_h = 0;
+    u16 data_l = 0;
+    int ret = 0;
+
+    g_mii_write(g_smi_addr, 0x1F, 0x4);
+    g_mii_write(g_smi_addr, 0x10, 0x0);
+
+    g_mii_write(g_smi_addr, 0x15, ((reg >> 16) & 0xFFFF));
+    g_mii_write(g_smi_addr, 0x16, (reg & 0xFFFF));
+
+    ret = g_mii_read(g_smi_addr, 0x17, &data_h);
+    if(ret != 0)
+    {
+        printf("read reg 0x%x 0x17 fail\n", reg);
+    }
+    ret = g_mii_read(g_smi_addr, 0x18, &data_l);
+    if(ret != 0)
+    {
+        printf("read reg 0x%x 0x18 fail\n", reg);
+    }
+
+    g_mii_write(g_smi_addr, 0x1F, 0x0);
+    g_mii_write(g_smi_addr, 0x10, 0x0);
+    //printf("read reg:0x%08x data:0x%08x\n", reg, ((data_h << 16) | (data_l & 0xffff)));
+
+    return ((data_h << 16) | (data_l & 0xffff));
+}
+
+/* FUNCTION NAME:   an8855_reg_write
+ * PURPOSE:
+ *      This API is used write an8855 registers.
+ * INPUT:
+ *      reg -- register offset
+ *      val -- register value
+ * OUTPUT:
+ * RETURN:
+ * NOTES:
+ *      Attention!! Customer should implement mdio mutex
+ *      lock in this func
+ */
+void
+an8855_reg_write(u32 reg, u32 val)
+{
+    g_mii_write(g_smi_addr, 0x1F, 0x4);
+    g_mii_write(g_smi_addr, 0x10, 0x0);
+
+    g_mii_write(g_smi_addr, 0x11, ((reg >> 16) & 0xFFFF));
+    g_mii_write(g_smi_addr, 0x12, (reg & 0xFFFF));
+
+    g_mii_write(g_smi_addr, 0x13, ((val >> 16) & 0xFFFF));
+    g_mii_write(g_smi_addr, 0x14, (val & 0xFFFF));
+
+    g_mii_write(g_smi_addr, 0x1F, 0x0);
+    g_mii_write(g_smi_addr, 0x10, 0x0);
+    //printf("write reg:0x%08x data:0x%08x\n", reg, val);
+}
+
+/* FUNCTION NAME:   an8855_phy_read
+ * PURPOSE:
+ *      This API is used read an8855 phy registers.
+ * INPUT:
+ *      port_num -- port number, 0~4
+ *      reg -- phy register offset
+ * OUTPUT:
+ *      p_val -- phy register value
+ * RETURN:
+ *      0 -- read success
+ *      -1 -- read failure
+ * NOTES:
+ *      Attention!! Customer should implement mii mutex
+ *      lock in this func
+ */
+int
+an8855_phy_read(u32 port_num, u32 reg, u32 *p_val)
+{
+    u32 phy = 0, data = 0;
+
+    if (port_num >= AN8855_PHY_NUM)
+        return -1;
+
+    phy = g_smi_addr + port_num;
+    g_mii_read(phy, reg, &data);
+    *p_val = data & 0x0000FFFF;
+
+    return 0;
+}
+
+/* FUNCTION NAME:   an8855_phy_write
+ * PURPOSE:
+ *      This API is used write an8855 phy registers.
+ * INPUT:
+ *      port_num -- port number, 0~4
+ *      reg -- phy register offset
+ *      val -- phy register value
+ * OUTPUT:
+ * RETURN:
+ *      0 -- write success
+ *      -1 -- write failure
+ * NOTES:
+ *      Attention!! Customer should implement mii mutex
+ *      lock in this func
+ */
+int
+an8855_phy_write(u32 port_num, u32 reg, u32 val)
+{
+    u32 phy = 0, data = 0;
+
+    if (port_num >= AN8855_PHY_NUM)
+        return -1;
+
+    phy = g_smi_addr + port_num;
+    data = val & 0x0000FFFF;
+    g_mii_write(phy, reg, data);
+
+    return 0;
+}
+
+/* FUNCTION NAME:   an8855_phy_read_cl45
+ * PURPOSE:
+ *      This API is used read an8855 phy registers.
+ * INPUT:
+ *      port_num -- port number, 0~4
+ *      dev_addr -- phy device type
+ *      reg_addr -- phy register offset
+ * OUTPUT:
+ *      p_val -- phy register value
+ * RETURN:
+ *      0 -- read success
+ *      -1 -- read failure
+ * NOTES:
+ *      Attention!! Customer should implement mii mutex
+ *      lock in this func or before/after calling this func
+ */
+u32
+an8855_phy_read_cl45(u32 port_num, u32 dev_addr, u32 reg_addr, u32 *p_val)
+{
+    u32 phy = 0, data = 0;
+
+    if (port_num >= AN8855_PHY_NUM)
+        return -1;
+
+    phy = g_smi_addr + port_num;
+    g_mii_c45_read(phy, dev_addr, reg_addr, &data);
+    *p_val = data & 0x0000FFFF;
+
+    return 0;
+}
+
+/* FUNCTION NAME:   an8855_phy_write_cl45
+ * PURPOSE:
+ *      This API is used write an8855 phy registers.
+ * INPUT:
+ *      port_num -- port number, 0~4
+ *      dev_addr -- phy device type
+ *      reg_addr -- phy register offset
+ *      val -- phy register value
+ * OUTPUT:
+ * RETURN:
+ *      0 -- write success
+ *      -1 -- write failure
+ * NOTES:
+ *      Attention!! Customer should implement mii mutex
+ *      lock in this func or before/after calling this func
+ */
+int
+an8855_phy_write_cl45(u32 port_num, u32 dev_addr, u32 reg_addr, u32 val)
+{
+    u32 phy = 0, data = 0;
+
+    if (port_num >= AN8855_PHY_NUM)
+        return -1;
+
+    phy = g_smi_addr + port_num;
+    data = val & 0x0000FFFF;
+    g_mii_c45_write(phy, dev_addr, reg_addr, data);
+
+    return 0;
+}
+
diff --git a/recipes-devtools/switch/files/src/an8855_sdk/core/an8855_mdio.h b/recipes-devtools/switch/files/src/an8855_sdk/core/an8855_mdio.h
new file mode 100644
index 0000000..c2d4bd7
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/core/an8855_mdio.h
@@ -0,0 +1,203 @@
+/* FILE NAME:  an8855_mdio.h

+ * PURPOSE:

+ *      It provides AN8855 mdio access API.

+ * NOTES:

+ *

+ */

+

+#ifndef AN8855_MDIO_H

+#define AN8855_MDIO_H

+

+/* INCLUDE FILE DECLARATIONS

+ */

+//#include "CTP_type.h"

+//#include "CTP_shell.h"

+//#include "common.h"

+//#include "eth.h"

+

+/* NAMING CONSTANT DECLARATIONS

+ */

+

+/* MACRO FUNCTION DECLARATIONS

+ */

+/* Attention!! Customer should define udelay function */

+void delayUs(int usecond);

+#define an8855_udelay(us) delayUs(us)

+

+/* Attention!! Customer should define dbg_print to get dbg output */

+#ifndef dbg_print

+#define dbg_print(...)

+#endif

+

+#define AN8855_PHY_NUM                      5

+

+/* DATA TYPE DECLARATIONS

+ */

+#ifndef NULL

+#define NULL 0L

+#endif

+

+#ifndef u32

+#define u32 unsigned int

+#endif

+

+#ifndef u16

+#define u16 unsigned short

+#endif

+

+#ifndef u8

+#define u8 unsigned char

+#endif

+

+typedef u32 (*AIR_MII_READ_FUNC_T) (u32 phy_addr, u32 reg, u32 *p_data);

+

+typedef u32 (*AIR_MII_WRITE_FUNC_T) (u32 phy_addr, u32 reg, u32 data);

+

+typedef u32 (*AIR_MII_C45_READ_FUNC_T) (u32 phy_addr, u32 dev, u32 reg, u32 *p_data);

+

+typedef u32 (*AIR_MII_C45_WRITE_FUNC_T) (u32 phy_addr, u32 dev, u32 reg, u32 data);

+

+extern u32 g_smi_addr;

+

+/* EXPORTED SUBPROGRAM SPECIFICATIONS

+ */

+

+/* FUNCTION NAME:   an8855_set_smi_addr

+ * PURPOSE:

+ *      This API is used to set an8855 smi address.

+ * INPUT:

+ *      smi_addr -- AN8855 smi address

+ * OUTPUT:

+ * RETURN:

+ * NOTES:

+ *      None

+ */

+void

+an8855_set_smi_addr(u32 smi_addr);

+

+/* FUNCTION NAME:   an8855_set_mii_callback

+ * PURPOSE:

+ *      This API is used to set an8855 mii access callbacks.

+ * INPUT:

+ *      mii_read -- mii read api function

+ *      mii_write -- mii write api function

+ * OUTPUT:

+ * RETURN:

+ *      0     -- Successfully set callback.

+ *      -1    -- Setting callback failed.

+ * NOTES:

+ *      None

+ */

+int

+an8855_set_mii_callback(

+    AIR_MII_READ_FUNC_T mii_read, 

+    AIR_MII_WRITE_FUNC_T mii_write,

+    AIR_MII_C45_READ_FUNC_T mii_c45_read, 

+    AIR_MII_C45_WRITE_FUNC_T mii_c45_write);

+

+/* FUNCTION NAME:   an8855_reg_read

+ * PURPOSE:

+ *      This API is used read an8855 registers.

+ * INPUT:

+ *      reg -- register offset

+ * OUTPUT:

+ * RETURN:

+ *      Register value

+ * NOTES:

+ *      Attention!! Customer should implement mdio mutex

+ *      lock in this func

+ */

+u32

+an8855_reg_read(u32 reg);

+

+/* FUNCTION NAME:   an8855_reg_write

+ * PURPOSE:

+ *      This API is used write an8855 registers.

+ * INPUT:

+ *      reg -- register offset

+ *      val -- register value

+ * OUTPUT:

+ * RETURN:

+ * NOTES:

+ *      Attention!! Customer should implement mdio mutex

+ *      lock in this func

+ */

+void

+an8855_reg_write(u32 reg, u32 val);

+

+/* FUNCTION NAME:   an8855_phy_read

+ * PURPOSE:

+ *      This API is used read an8855 phy registers.

+ * INPUT:

+ *      port_num -- port number, 0~4

+ *      reg -- phy register offset

+ * OUTPUT:

+ *      p_val -- phy register value

+ * RETURN:

+ *      0 -- read success

+ *      -1 -- read failure

+ * NOTES:

+ *      Attention!! Customer should implement mii mutex

+ *      lock in this func

+ */

+int

+an8855_phy_read(u32 port_num, u32 reg, u32 *p_val);

+

+/* FUNCTION NAME:   an8855_phy_write

+ * PURPOSE:

+ *      This API is used write an8855 phy registers.

+ * INPUT:

+ *      port_num -- port number, 0~4

+ *      reg -- phy register offset

+ *      val -- phy register value

+ * OUTPUT:

+ * RETURN:

+ *      0 -- write success

+ *      -1 -- write failure

+ * NOTES:

+ *      Attention!! Customer should implement mii mutex

+ *      lock in this func

+ */

+int

+an8855_phy_write(u32 port_num, u32 reg, u32 val);

+

+/* FUNCTION NAME:   an8855_phy_read_cl45

+ * PURPOSE:

+ *      This API is used read an8855 phy registers.

+ * INPUT:

+ *      port_num -- port number, 0~4

+ *      dev_addr -- phy device type

+ *      reg_addr -- phy register offset

+ * OUTPUT:

+ *      p_val -- phy register value

+ * RETURN:

+ *      0 -- read success

+ *      -1 -- read failure

+ * NOTES:

+ *      Attention!! Customer should implement mii mutex

+ *      lock in this func or before/after calling this func

+ */

+u32

+an8855_phy_read_cl45(u32 port_num, u32 dev_addr, u32 reg_addr, u32 *p_val);

+

+/* FUNCTION NAME:   an8855_phy_write_cl45

+ * PURPOSE:

+ *      This API is used write an8855 phy registers.

+ * INPUT:

+ *      port_num -- port number, 0~4

+ *      dev_addr -- phy device type

+ *      reg_addr -- phy register offset

+ *      val -- phy register value

+ * OUTPUT:

+ * RETURN:

+ *      0 -- write success

+ *      -1 -- write failure

+ * NOTES:

+ *      Attention!! Customer should implement mii mutex

+ *      lock in this func or before/after calling this func

+ */

+int

+an8855_phy_write_cl45(u32 port_num, u32 dev_addr, u32 reg_addr, u32 val);

+

+#endif  /* End of AN8855_MDIO_H */

+

diff --git a/recipes-devtools/switch/files/src/an8855_sdk/core/an8855_phy.h b/recipes-devtools/switch/files/src/an8855_sdk/core/an8855_phy.h
new file mode 100644
index 0000000..3c810e7
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/core/an8855_phy.h
@@ -0,0 +1,409 @@
+/* FILE NAME:  an8855_phy.h

+ * PURPOSE:

+ *      It provides AN8855 phy definition.

+ * NOTES:

+ *

+ */

+

+#ifndef _AN8855_PHY_H_

+#define _AN8855_PHY_H_

+

+

+/* Type Definitions */

+#define int8_t char

+#define uint8_t unsigned char

+#define int16_t short

+#define uint16_t unsigned short

+#define int32_t int

+#define uint32_t unsigned int

+/* DATA TYPE DECLARATIONS

+ */

+typedef int                 BOOL_T;

+typedef signed char         I8_T;

+typedef unsigned char       UI8_T;

+typedef signed short        I16_T;

+typedef unsigned short      UI16_T;

+typedef signed int          I32_T;

+typedef unsigned int        UI32_T;

+typedef char                C8_T;

+typedef unsigned long long  UI64_T;

+

+typedef UI8_T   AIR_MAC_T[6];

+

+/* Debug flags */

+//#define _MDIO_BOOTS_MODE     1 // Boots for preamble

+#define _DEBUG_PRINT         1 // Debug print for Arduino

+//#define _DEBUG_PRINT_eFuse     1

+#define _write_eFuse     1

+

+#define _DEBUG_SCAN_ALL      0 // Scan all Code for SerDes Calibration

+#define _WRITE_RG_DIR        1 // Write RG directly for Calibration

+#define _USER_DEFINE_MODE    0 // Replace to user-defined RG for Calibration

+#define _DEBUG_MANUAL        1 // dbg_20210604  // manual dbg_20210604

+/**************************************************************************/

+

+/* Phy Address */

+//#define phyadd_common 0x1d            // EN8801

+//#define PHY_NUM 1             // EN8801

+//#define phyadd_common 0x9         // EN7523

+//#define PHY_NUM 4             // EN7523

+//#define phyadd_common 0x0         // EN8850

+//#define PHY_NUM   5           // EN8850

+#define PHY_NUM   4             // EN8851

+#define CALIPOLARITY  1

+

+#define TXAMP_offset  0    // for 8851

+

+/* On/Off */

+//#define ENABLE  1

+//#define DISABLE 0

+#define Relay_ENABLE  1

+#define Relay_DISABLE 0

+

+/* FT Pattern */

+#define _MDIO     0x0

+#define _I2C      0x1

+#define FT_USB3_T101    0x0

+#define FT_PCIE0_T101   0x1

+#define FT_PCIE1_T101   0x2

+#define FT_PON_T101     0x3

+

+/********* Digital pin definition *************/

+#define Relay_Tx_PN         22   // relay 1

+#define Relay_R_R50         23   // relay 2

+#define Relay_Tx_Vol        24   // relay 3

+#define Relay_Rx_Vol        25   // relay 4

+#define Relay_DUT_GND       26   // relay 5

+#define Relay_I2C           27   // PIN for SCL&SDA , relay 6

+//#define Relay_I2C_SCL       27   // PIN for SCL&SDA , relay 6

+//#define Relay_I2C_SDA       28   // PIN for SCL&SDA , relay 6

+

+#define pin_MDIO           36   // PIN for MDIO

+#define pin_MDC            37   // PIN for MDC

+#define FT_PATTERN_bit0    49   // PIN for FT0

+#define FT_PATTERN_bit1    48   // PIN for FT1

+#define Relay_MDIO         35   // PIN for MDIO relay, relay 7

+

+/***********************************************/

+/* Use for I/O register PORTA control */

+#define POR_Relay_Tx_PN    D22   // use for PORTA control, relay 1

+#define POR_Relay_R_R50    D23   // use for PORTA control, relay 2

+#define POR_Relay_Tx_Vol   D24   // use for PORTA control, relay 3

+#define POR_Relay_Rx_Vol   D25   // use for PORTA control, relay 4

+#define POR_Relay_DUT_GND  D26   // use for PORTA control, relay 5

+//#define POR_Relay_I2C      D27   // use for PORTA control, relay 6

+#define POR_Relay_I2C_SCL  D27   // use for PORTA control, relay 6

+#define POR_Relay_I2C_SDA  D28   // use for PORTA control, relay 7

+

+/* Use for I/O register PORTC control */

+#define POR_MDIO               D36  // use for PORTC control

+#define POR_MDC                D37  // use for PORTC control

+#define POR_Relay_MDIO         D35  // use for PORTC control, relay 7

+

+/* Use for I/O register PORTL control */

+#define POR_FT_PATTERN_bit0    D49  // use for PORTL control

+#define POR_FT_PATTERN_bit1    D48  // use for PORTL control

+

+

+/* I/O register Port A */

+#define D22   0

+#define D23   1

+#define D24   2

+#define D25   3

+#define D26   4

+#define D27   5

+#define D28   6

+#define D29   7

+

+/* I/O register Port C */

+#define D37   0

+#define D36   1

+#define D35   2

+#define D34   3

+#define D33   4

+#define D32   5

+#define D31   6

+#define D30   7

+

+/* I/O register Port L */

+#define D49   0

+#define D48   1

+#define D47   2

+#define D46   3

+#define D45   4

+#define D44   5

+#define D43   6

+#define D42   7

+

+/* I/O register Port D */

+#define D21   0

+#define D20   1

+#define D19   2

+#define D18   3

+

+

+/***************************************************************************

+**************************************************************************

+* MDC/MDIO

+***************************************************************************

+***************************************************************************/

+#define SET_HIGH(data, nbit) ((data)|=(nbit))

+#define SET_LOW(data, nbit) ((data)&=~(nbit))

+

+#define MDIO_ONE  _BV(POR_MDIO)

+#define MDIO_ZERO 0x00

+#define MDC_ONE   _BV(POR_MDC)

+#define MDC_ZERO  0x00

+

+#define delay_us delayMicroseconds(0)

+

+#define ANACAL_INIT        0x01

+#define ANACAL_ERROR       0xFD

+#define ANACAL_SATURATION  0xFE

+#define ANACAL_FINISH      0xFF

+#define ANACAL_PAIR_A      0

+#define ANACAL_PAIR_B      1

+#define ANACAL_PAIR_C      2

+#define ANACAL_PAIR_D      3

+#define DAC_IN_0V          0x000

+#define DAC_IN_2V          0x0f0  // +/-1V

+

+#define ZCAL_MIDDLE        0x20

+#define TX_OFFSET_0mV_idx  31

+#define TX_AMP_MIDDLE      0x20

+

+#define TX_i2mpb_hbt_ofs  0x4   // 8851 fine tune 100M v1 (20220414)

+#define R50_OFFSET_VALUE  0x5

+

+//============== definition value for GbE ===================//

+#define BG_VOLTAGE_OUT     0xc0

+#define FORCE_MDI          2

+#define FORCE_MDIX         3

+#define LDO_1p15_VOSEL_1   1

+#define RX_CAL_VALUE_9       0x3

+#define RX_CAL_HVGA_BW_2     0x2

+#define RX_CAL_DCO_Normal    0x0

+#define RX_CAL_DCO_BYPASS_TX_RX  0x3

+#define RX_CAL_DCO_0xF    0xF

+

+#define TANA_MON_DCV_SEL__MASK         0xE0

+#define TANA_MON_DCV_SEL__MPX_TANA_A   0x20

+#define TANA_MON_DCV_SEL__MPX_TANA_B   0x40

+#define TANA_MON_DCV_SEL__MPX_TANA_C   0x60

+#define TANA_MON_DCV_SEL__MPX_TANA_D   0x80

+#define TANA_MON_DCV_SEL__MONVC__MASK  0x008000C8

+#define TANA_MON_DCV__TANA__VBG_MON    0x000000C0

+#define TANA_MON_DCV__TANA__MONVC      0x000000C8

+

+#define AN_disable_force_1000M 0x0140

+#define BG_voltage_output 0xc000

+#define Fix_mdi 0x1010

+#define Disable_tx_slew_control 0x0000

+#define LDO_control 0x0100

+#define Cal_control_BG 0x1110

+#define Cal_control_R50 0x1100

+#define Cal_control_TX_AMP 0x1100

+#define Cal_control_TX_OFST 0x0100

+#define Cal_control_R50_pairA_ENABLE 0x1101

+#define Disable_all 0x0

+#define Zcalen_A_ENABLE 0x0000

+#define Zcalen_B_ENABLE 0x1000

+#define Zcalen_C_ENABLE 0x0100

+#define Zcalen_D_ENABLE 0x0010

+#define MASK_MSB_8bit 0xff00

+#define MASK_LSB_8bit 0x00ff

+#define MASK_r50ohm_rsel_tx_a 0x7f00

+#define MASK_r50ohm_rsel_tx_b 0x007f

+#define MASK_r50ohm_rsel_tx_c 0x7f00

+#define MASK_r50ohm_rsel_tx_d 0x007f

+#define Rg_r50ohm_rsel_tx_a_en 0x8000

+#define Rg_r50ohm_rsel_tx_b_en 0x0080

+#define Rg_r50ohm_rsel_tx_c_en 0x8000

+#define Rg_r50ohm_rsel_tx_d_en 0x0080

+#define Rg_txvos_calen_ENABLE 0x0001

+#define Bypass_tx_offset_cal 0x8000

+#define Enable_Tx_VLD 0xf808

+#define Rg_txg_calen_a_ENABLE 0x1000

+#define Rg_txg_calen_b_ENABLE 0x0100

+#define Rg_txg_calen_c_ENABLE 0x0010

+#define Rg_txg_calen_d_ENABLE 0x0001

+#define Force_dasn_dac_in0_ENABLE 0x8000

+#define Force_dasn_dac_in1_ENABLE 0x8000

+#define MASK_cr_tx_amp_offset_MSB 0x3f00

+#define MASK_cr_tx_amp_offset_LSB 0x003f

+#define Rg_cal_refsel_ENABLE 0x0010

+#define MASK_da_tx_i2mpb_a_gbe 0xfc00

+#define MASK_da_tx_i2mpb_b_c_d_gbe 0x3f00

+

+#define LED_basic_control_en_active_low 0x800a

+#define LED_led0_en_active_high 0xc007

+#define LED_led0_force_blinking 0x0200

+

+

+

+/*phy calibration use*/

+//Type defines

+typedef unsigned char    UINT8;

+typedef unsigned short   UINT16;

+typedef unsigned long    UINT32;

+

+typedef struct

+{

+  UINT16 DATA_Lo;

+  UINT8  DATA_Hi;

+}TR_DATA_T;

+

+//CL22 Reg Support Page Select//

+#define RgAddr_Reg1Fh        0x1f

+#define CL22_Page_Reg        0x0000

+#define CL22_Page_ExtReg     0x0001

+#define CL22_Page_MiscReg    0x0002

+#define CL22_Page_LpiReg     0x0003

+#define CL22_Page_tReg       0x02A3

+#define CL22_Page_TrReg      0x52B5

+

+//CL45 Reg Support DEVID//

+#define DEVID_03             0x03

+#define DEVID_07             0x07

+#define DEVID_1E             0x1E

+#define DEVID_1F             0x1F

+

+//TokenRing Reg Access//

+#define TrReg_PKT_XMT_STA    0x8000

+#define TrReg_WR             0x8000

+#define TrReg_RD             0xA000

+

+/* ----------------- gephy_all Bit Field Definitions ------------------- */

+

+

+

+//-------------------------------------

+//0x0000

+#define RgAddr_Reg00h                               0x00

+

+//0x51e01200

+#define RgAddr_dev1Eh_reg120h                       0x0120

+//0x51e01220

+#define RgAddr_dev1Eh_reg122h                       0x0122

+//0x51e01440

+#define RgAddr_dev1Eh_reg144h                       0x0144

+//0x51e014a0

+#define RgAddr_dev1Eh_reg14Ah                       0x014a

+//0x51e019b0

+#define RgAddr_dev1Eh_reg19Bh                       0x019b

+//0x51e02340

+#define RgAddr_dev1Eh_reg234h                       0x0234

+//0x51e02380

+#define RgAddr_dev1Eh_reg238h                       0x0238

+//0x51e02390

+#define RgAddr_dev1Eh_reg239h                       0x0239

+//0x51f02680

+#define RgAddr_dev1Fh_reg268h                       0x0268

+//0x51e02d10

+#define RgAddr_dev1Eh_reg2D1h                       0x02d1

+//0x51e03230

+#define RgAddr_dev1Eh_reg323h                       0x0323

+//0x51e03240

+#define RgAddr_dev1Eh_reg324h                       0x0324

+//0x51e03260

+#define RgAddr_dev1Eh_reg326h                       0x0326

+

+//0x51f01000

+#define RgAddr_dev1Fh_reg100h                       0x0100

+//0x51e01450

+#define RgAddr_dev1Eh_reg145h                       0x0145

+//0x51f00ff0

+#define RgAddr_dev1Fh_reg0FFh                       0x00ff

+//0x51e00db0

+#define RgAddr_dev1Eh_reg0DBh                       0x00db

+//0x51e00dc0

+#define RgAddr_dev1Eh_reg0DCh                       0x00dc

+//0x51e00e00

+#define RgAddr_dev1Eh_reg0E0h                       0x00e0

+//0x51e00e10

+#define RgAddr_dev1Eh_reg0E1h                       0x00e1

+//0x51e00e00

+#define RgAddr_dev1Eh_reg0E0h                       0x00e0

+//0x51e017a0

+#define RgAddr_dev1Eh_reg17Ah                       0x017a

+//0x51f01150

+#define RgAddr_dev1Fh_reg115h                       0x0115

+//0x51f01000

+#define RgAddr_dev1Fh_reg100h                       0x0100

+//0x51e01450

+#define RgAddr_dev1Eh_reg145h                       0x0145

+//0x51e01450

+#define RgAddr_dev1Eh_reg145h                       0x0145

+//0x51e01850

+#define RgAddr_dev1Eh_reg185h                       0x0185

+//0x51e00fb0

+#define RgAddr_dev1Eh_reg0FBh                       0x00fb

+//0x51e01740

+#define RgAddr_dev1Eh_reg174h                       0x0174

+//0x51e01750

+#define RgAddr_dev1Eh_reg175h                       0x0175

+//0x51e01850

+#define RgAddr_dev1Eh_reg185h                       0x0185

+//0x51e00fb0

+#define RgAddr_dev1Eh_reg0FBh                       0x00fb

+//0x51e00960

+#define RgAddr_dev1Eh_reg096h                       0x0096

+//0x51e003e0

+#define RgAddr_dev1Eh_reg03Eh                       0x003e

+//0x51e00dd0

+#define RgAddr_dev1Eh_reg0DDh                       0x00dd

+//0x51e017d0

+#define RgAddr_dev1Eh_reg17Dh                       0x017d

+//0x51e01810

+#define RgAddr_dev1Eh_reg181h                       0x0181

+//0x51e00120

+#define RgAddr_dev1Eh_reg012h                       0x0012

+//0x51e017e0

+#define RgAddr_dev1Eh_reg17Eh                       0x017e

+//0x51e01820

+#define RgAddr_dev1Eh_reg182h                       0x0182

+//0x51e00170

+#define RgAddr_dev1Eh_reg017h                       0x0017

+//0x51e01830

+#define RgAddr_dev1Eh_reg183h                       0x0183

+//0x51e00190

+#define RgAddr_dev1Eh_reg019h                       0x0019

+//0x51e01800

+#define RgAddr_dev1Eh_reg180h                       0x0180

+//0x51e01840

+#define RgAddr_dev1Eh_reg184h                       0x0184

+//0x51e00210

+#define RgAddr_dev1Eh_reg021h                       0x0021

+//0x51e01720

+#define RgAddr_dev1Eh_reg172h                       0x0172

+//0x51e01730

+#define RgAddr_dev1Eh_reg173h                       0x0173

+//0x51e017c0

+#define RgAddr_dev1Eh_reg17Ch                       0x017c

+//0x51e017f0

+#define RgAddr_dev1Eh_reg17Fh                       0x017f

+

+//0x52b5100

+#define RgAddr_TrReg10h                             0x10

+//0x52b5110

+#define RgAddr_TrReg11h                             0x11

+//0x52b5120

+#define RgAddr_TrReg12h                             0x12

+

+//0x31c0

+#define RgAddr_LpiReg1Ch                            0x1c

+//0x31d0

+#define RgAddr_LpiReg1Dh                            0x1d

+uint8_t BG_Calibration(uint8_t phyadd, int8_t calipolarity);

+uint8_t R50_Calibration(uint8_t phyadd, uint8_t phyadd_common);

+uint8_t TX_OFS_Calibration(uint8_t phyadd, uint8_t phyadd_common);

+uint8_t TX_AMP_Calibration(uint8_t phyadd, uint8_t phyadd_common);

+//void config_gphy_port(UINT8, UINT8);

+

+void set_gphy_reg_cl22(uint8_t, uint8_t, uint16_t);

+uint16_t get_gphy_reg_cl45(uint8_t, uint8_t, uint16_t);

+void set_gphy_reg_cl45(uint8_t, uint8_t, uint16_t, uint16_t);

+void anacal_exe(uint8_t);

+

+#endif /* _AN8855_PHY_H_ */

+

diff --git a/recipes-devtools/switch/files/src/an8855_sdk/core/an8855_phy_cal.c b/recipes-devtools/switch/files/src/an8855_sdk/core/an8855_phy_cal.c
new file mode 100644
index 0000000..c2e8e5c
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/core/an8855_phy_cal.c
@@ -0,0 +1,967 @@
+/* FILE NAME:  an8855_phy_cal.c

+* PURPOSE:

+*    It provides an8855 switch phy calibration function.

+*

+* NOTES:

+*

+*/

+

+/* INCLUDE FILE DECLARATIONS

+*/

+#include "an8855_mdio.h"

+#include "an8855_phy.h"

+//#include "swk_gphy_reg.h"

+//#include "gphy_calibration.h"

+//#include "gsw_reg.h"

+

+/* NAMING CONSTANT DECLARATIONS

+ */

+#define MII_BMCR                (0)

+#define BMCR_PDOWN              (0x0800)

+/* MACRO FUNCTION DECLARATIONS

+ */

+

+#define FULL_BITS(_n_) ((1UL << (_n_)) - 1)

+

+/* DATA TYPE DECLARATIONS

+ */

+

+/* GLOBAL VARIABLE DECLARATIONS

+ */

+/* Zcal to R50 mapping table (20220404) */

+const uint8_t ZCAL_TO_R50ohm_TBL[64] =

+{

+    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,

+    127, 127, 127, 127, 127, 123, 118, 114, 110, 106, 102, 98, 96, 92, 88, 85,

+    82, 80, 76, 72, 70, 67, 64, 62, 60, 56, 54, 52, 49, 48, 45, 43,

+    40, 39, 36, 34, 32, 32, 30, 28, 25, 24, 22, 20, 18, 16, 16, 14

+};

+

+/* Tx offset table, value is from small to big */

+const uint8_t  EN753x_TX_OFS_TBL[64] =

+{

+    0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x3a, 0x39, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x30,

+    0x2f, 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28, 0x27, 0x26, 0x25, 0x24, 0x23, 0x22, 0x21, 0x20,

+    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,

+    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f

+};

+

+#define TOTAL_PATCH_C45_ITEMS   (15)

+#define TOTAL_PATCH_TR_ITEMS    (19)

+const uint16_t C45_PATCH_TABLE[TOTAL_PATCH_C45_ITEMS][3] =

+{

+    {0x1E, 0x120, 0x8014},

+    {0x1E, 0x122, 0xFFFF},

+    {0x1E, 0x122, 0xFFFF},

+    {0x1E, 0x144, 0x0200},

+    {0x1E, 0x14A, 0xEE20},

+    {0x1E, 0x189, 0x0110},

+    {0x1E, 0x19B, 0x0111},

+    {0x1E, 0x234, 0x0181},

+    {0x1E, 0x238, 0x0120},

+    {0x1E, 0x239, 0x0117},

+    {0x1F, 0x268, 0x07F4},

+    {0x1E, 0x2d1, 0x0733},

+    {0x1E, 0x323, 0x0011},

+    {0x1E, 0x324, 0x013F},

+    {0x1E, 0x326, 0x0037},

+};

+

+const uint32_t TR_PATCH_TABLE[TOTAL_PATCH_TR_ITEMS][2] =

+{

+    {0x83AA, 0x055a0 },

+    {0x83AE, 0x7FF3F },

+    {0x8F80, 0x0001e },

+    {0x8F82, 0x6FB90A},

+    {0x8FAE, 0x060671},

+    {0x8FB0, 0xE2F00 },

+    {0x8ECC, 0x444444},

+    {0x9686, 0x00000 },

+    {0x968C, 0x2EBAEF},

+    {0x9690, 0x00000b},

+    {0x9698, 0x0504D },

+    {0x969A, 0x2314f },

+    {0x969E, 0x03028 },

+    {0x96A0, 0x05010 },

+    {0x96A2, 0x40001 },

+    {0x96A6, 0x018670},

+    {0x96A8, 0x0024A },

+    {0x96B6, 0x00072 },

+    {0x96B8, 0x03210 },

+};

+

+#define TOTAL_NUMBER_OF_PATCH    (14)

+static uint16_t eee_patch_table[TOTAL_NUMBER_OF_PATCH][2] = {

+    {RgAddr_dev1Eh_reg120h, 0x8014},

+    {RgAddr_dev1Eh_reg122h, 0xFFFF},

+    {RgAddr_dev1Eh_reg122h, 0xFFFF},

+    {RgAddr_dev1Eh_reg144h, 0x0200},

+    {RgAddr_dev1Eh_reg14Ah, 0xEE20},

+    {RgAddr_dev1Eh_reg19Bh, 0x0111},

+    {RgAddr_dev1Eh_reg234h, 0x1181},

+    {RgAddr_dev1Eh_reg238h, 0x0120},

+    {RgAddr_dev1Eh_reg239h, 0x0117},

+    {RgAddr_dev1Fh_reg268h, 0x07F4},

+    {RgAddr_dev1Eh_reg2D1h, 0x0733},

+    {RgAddr_dev1Eh_reg323h, 0x0011},

+    {RgAddr_dev1Eh_reg324h, 0x013F},

+    {RgAddr_dev1Eh_reg326h, 0x0037}

+};

+

+#define TOTAL_NUMBER_OF_TR      (19)

+static uint16_t tr_reg_table[TOTAL_NUMBER_OF_TR][3] = {

+    {0x55A0, 0x0000, 0x83AA},

+    {0xFF3F, 0x0007, 0x83AE},

+    {0x001E, 0x0000, 0x8F80},

+    {0xB90A, 0x006F, 0x8F82},

+    {0x0671, 0x0006, 0x8FAE},

+    {0x2F00, 0x000E, 0x8FB0},

+    {0x4444, 0x0044, 0x8ECC},

+    {0x0004, 0x0000, 0x9686},

+    {0xBAEF, 0x002E, 0x968C},

+    {0x000B, 0x0000, 0x9690},

+    {0x504D, 0x0000, 0x9698},

+    {0x314F, 0x0002, 0x969A},

+    {0x3028, 0x0000, 0x969E},

+    {0x5010, 0x0000, 0x96A0},

+    {0x0001, 0x0004, 0x96A2},

+    {0x8670, 0x0001, 0x96A6},

+    {0x024A, 0x0000, 0x96A8},

+    {0x0072, 0x0000, 0x96B6},

+    {0x3210, 0x0000, 0x96B8}

+};

+

+void TR_RegWr(uint16_t phyadd, uint16_t tr_reg_addr, uint32_t tr_data);

+

+uint16_t get_gphy_reg_cl22(uint8_t phyad, uint8_t reg)

+{

+    uint32_t rdata = 0;

+

+    an8855_phy_read(phyad-g_smi_addr, reg, &rdata);

+

+    return ((uint16_t)rdata);

+    /*

+    gsw_top_reg_REG_PHY_IAC REG_PHY_IAC_val;

+    gsw_top_reg_REG_PHY_IAD REG_PHY_IAD_val;

+

+    // Wait until done

+    do

+    {

+      REG_PHY_IAC_val.Raw   = io_read32(RgAddr_gsw_top_reg_REG_PHY_IAC);

+    }

+    while(REG_PHY_IAC_val.Bits.csr_phy_acs_st);

+

+    // Set address

+    REG_PHY_IAC_val.Bits.csr_mdio_st = 1;

+    REG_PHY_IAC_val.Bits.csr_mdio_cmd   = 2;

+    REG_PHY_IAC_val.Bits.csr_mdio_phy_addr = phyad;

+    REG_PHY_IAC_val.Bits.csr_mdio_reg_addr = reg;

+    REG_PHY_IAC_val.Bits.csr_phy_acs_st =   1;

+    io_write32(RgAddr_gsw_top_reg_REG_PHY_IAC, REG_PHY_IAC_val.Raw);

+    // Wait until done

+    do

+    {

+        REG_PHY_IAC_val.Raw = io_read32(RgAddr_gsw_top_reg_REG_PHY_IAC);

+    }

+    while(REG_PHY_IAC_val.Bits.csr_phy_acs_st);

+

+    REG_PHY_IAD_val.Raw = io_read32(RgAddr_gsw_top_reg_REG_PHY_IAD);

+

+    return REG_PHY_IAD_val.Raw;

+    */

+}

+

+/* EXPORTED SUBPROGRAM BODIES

+ */

+void gphy_config(void)

+{

+    uint8_t port = 1;

+    uint8_t phy_base = 0, phys_in_chip = 8;

+

+    for (port = 1; port <= phys_in_chip; port++)

+    {

+        set_gphy_reg_cl45(phy_base + port, 0x7, 0x3c, 0x0006); // Enable EEE

+        set_gphy_reg_cl45(phy_base + port, 0x1e, 0x3e, 0xf000); // force on TXVLD

+    }

+}

+

+static void set_gphy_TrReg(uint8_t prtid, uint16_t parm_1, uint16_t parm_2, uint16_t parm_3)

+{

+    set_gphy_reg_cl22(prtid, RgAddr_TrReg11h, parm_1);

+    set_gphy_reg_cl22(prtid, RgAddr_TrReg12h, parm_2);

+    set_gphy_reg_cl22(prtid, RgAddr_TrReg10h, parm_3);

+}

+

+static void gphy_eee_patch(uint8_t phy_base)

+{

+    UI8_T   port = 1, index = 0, phy_addr = 1;

+    UI16_T  data = 0;

+

+    for (port = 1; port <=8; port++)

+    {

+        phy_addr = phy_base + port;

+        data = get_gphy_reg_cl22(phy_addr, MII_BMCR);

+        set_gphy_reg_cl22(phy_addr, MII_BMCR, data & ~(BMCR_PDOWN));    /* PHY power on */

+

+        /* Change EEE RG default value */

+        for (index = 0; index < TOTAL_NUMBER_OF_PATCH; index++)

+        {

+            set_gphy_reg_cl45(phy_addr, DEVID_1E, eee_patch_table[index][0], eee_patch_table[index][1]);

+        }

+

+        set_gphy_reg_cl22(phy_addr, RgAddr_Reg1Fh, CL22_Page_TrReg);   /* change CL22page to LpiReg(0x3) */

+        for (index = 0; index < TOTAL_NUMBER_OF_TR; index++)

+        {

+            set_gphy_TrReg(phy_addr, tr_reg_table[index][0], tr_reg_table[index][1], tr_reg_table[index][2]);

+        }

+

+        set_gphy_reg_cl22(phy_addr, RgAddr_Reg1Fh, CL22_Page_LpiReg);  /* change CL22page to LpiReg(0x3) */

+        set_gphy_reg_cl22(phy_addr, RgAddr_LpiReg1Ch, 0x0c92);         /* Fine turn SigDet for B2B LPI link down issue */

+        set_gphy_reg_cl22(phy_addr, RgAddr_LpiReg1Dh, 0x0001);         /* Enable "lpi_quit_waitafesigdet_en" for LPI link down issue */

+

+        set_gphy_reg_cl22(phy_addr, RgAddr_Reg1Fh, CL22_Page_Reg);     /* change CL22page to Reg(0x0) */

+    }

+}

+

+void gphy_calibration(uint8_t phy_base)

+{

+    uint8_t port = 1, phy_addr = 1 ,phy_group = 1, index = 0;

+    uint8_t phys_in_chip = 5;

+

+    BG_Calibration(phy_base, 0x1);

+    if (phys_in_chip > 4)

+    {

+        BG_Calibration(phy_base + 0x4, 0x1);

+    }

+

+    for (port = 0; port < phys_in_chip; port++)

+    {

+        if (port < 4)

+        {

+            phy_group = phy_base;     /* PHY group 1 */

+        }

+        else

+        {

+            phy_group = phy_base + 0x04;     /* PHY group 2 */

+        }

+        phy_addr = phy_base + port;

+        R50_Calibration(phy_addr, phy_group);

+        TX_OFS_Calibration(phy_addr, phy_group);

+        TX_AMP_Calibration(phy_addr, phy_group);

+    }

+

+    for (port = 0; port < phys_in_chip; port++)

+    {

+        phy_addr = phy_base + port;

+        set_gphy_reg_cl45(phy_addr, 0x1e, 0x017d, 0x0000);

+        set_gphy_reg_cl45(phy_addr, 0x1e, 0x017e, 0x0000);

+        set_gphy_reg_cl45(phy_addr, 0x1e, 0x017f, 0x0000);

+        set_gphy_reg_cl45(phy_addr, 0x1e, 0x0180, 0x0000);

+        set_gphy_reg_cl45(phy_addr, 0x1e, 0x0181, 0x0000);

+        set_gphy_reg_cl45(phy_addr, 0x1e, 0x0182, 0x0000);

+        set_gphy_reg_cl45(phy_addr, 0x1e, 0x0183, 0x0000);

+        set_gphy_reg_cl45(phy_addr, 0x1e, 0x0184, 0x0000);

+        set_gphy_reg_cl45(phy_addr, 0x1e, 0x00db, 0x0000);  // disable analog calibration circuit

+        set_gphy_reg_cl45(phy_addr, 0x1e, 0x00dc, 0x0000);  // disable Tx offset calibration circuit

+        set_gphy_reg_cl45(phy_addr, 0x1e, 0x003e, 0x0000);  // disable Tx VLD force mode

+        set_gphy_reg_cl45(phy_addr, 0x1e, 0x00dd, 0x0000);  // disable Tx offset/amplitude calibration circuit

+        set_gphy_reg_cl45(phy_addr, 0x1e, 0x0145, 0x1000);  // enable auto MDI/MDIX

+

+        set_gphy_reg_cl22(phy_addr, 0, 0x1200);

+        /* GPHY Rx low pass filter */

+        set_gphy_reg_cl45(phy_addr, 0x1e, 0xc7, 0xd000);

+        /* patch */

+        for (index = 0; index < TOTAL_PATCH_C45_ITEMS; index++)

+        {

+            set_gphy_reg_cl45(phy_addr, C45_PATCH_TABLE[index][0], C45_PATCH_TABLE[index][1], C45_PATCH_TABLE[index][2]);

+        }

+        for (index = 0; index < TOTAL_PATCH_TR_ITEMS; index++)

+        {

+            TR_RegWr(phy_addr, TR_PATCH_TABLE[index][0], TR_PATCH_TABLE[index][1]);

+        }

+        set_gphy_reg_cl22(phy_addr, 0x1f, 0x0  );

+        set_gphy_reg_cl22(phy_addr, 0x1f, 0x3  );

+        set_gphy_reg_cl22(phy_addr, 0x1c, 0xc92);

+        set_gphy_reg_cl22(phy_addr, 0x1d, 0x01 );

+        set_gphy_reg_cl22(phy_addr, 0x1f, 0x0  );

+    }

+    gphy_eee_patch(phy_base);

+}

+

+/* LOCAL SUBPROGRAM BODIES

+ */

+void TR_RegWr(uint16_t phyadd, uint16_t tr_reg_addr, uint32_t tr_data)

+{

+    set_gphy_reg_cl22(phyadd, 0x1F, 0x52b5);       /* page select */

+    set_gphy_reg_cl22(phyadd, 0x11, (uint16_t)(tr_data & 0xffff));

+    set_gphy_reg_cl22(phyadd, 0x12, (uint16_t)(tr_data >> 16));

+    set_gphy_reg_cl22(phyadd, 0x10, (uint16_t)(tr_reg_addr | TrReg_WR));

+    set_gphy_reg_cl22(phyadd, 0x1F, 0x0);          /* page resetore */

+    return;

+}

+

+uint8_t BG_Calibration(uint8_t phyadd, int8_t calipolarity)

+{

+    int8_t rg_zcal_ctrl = 0, calibration_polarity = 0;

+    uint8_t all_ana_cal_status = 1;

+    uint16_t ad_cal_comp_out_init = 0;

+

+    /* setting */

+    set_gphy_reg_cl22(phyadd, RgAddr_Reg1Fh, CL22_Page_Reg);        // g0

+    set_gphy_reg_cl22(phyadd, RgAddr_Reg00h, AN_disable_force_1000M);  // AN disable, force 1000M

+    set_gphy_reg_cl45(phyadd, DEVID_1F, RgAddr_dev1Fh_reg100h, BG_voltage_output);// BG voltage output

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg145h, Fix_mdi);// fix mdi

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Fh_reg0FFh, 0x2);

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DBh, Cal_control_BG);// 1e_db[12]:rg_cal_ckinv, [8]:rg_ana_calen, [4]:rg_rext_calen

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DCh, Disable_all);// 1e_dc[0]:rg_txvos_calen

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0E1h, Disable_all);// 1e_e1[4]:rg_cal_refsel(0:1.2V) enable BG 1.2V to REXT PAD

+

+    /* calibrate */

+    rg_zcal_ctrl = ZCAL_MIDDLE;

+

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0E0h, (uint16_t)rg_zcal_ctrl);

+

+    anacal_exe(phyadd);

+    if (all_ana_cal_status == 0)

+    {

+        all_ana_cal_status = ANACAL_ERROR;

+    }

+    ad_cal_comp_out_init = (get_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg17Ah) >> 8) & 0x1;

+

+

+    if (ad_cal_comp_out_init == 1)

+    {

+        calibration_polarity = -calipolarity;

+    }

+    else // ad_cal_comp_out_init == 0

+    {

+        calibration_polarity = calipolarity;

+    }

+

+    while (all_ana_cal_status < ANACAL_ERROR)

+    {

+        rg_zcal_ctrl += calibration_polarity;

+

+        set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0E0h, (uint16_t)rg_zcal_ctrl);

+

+

+        anacal_exe(phyadd);

+

+        if (all_ana_cal_status == 0)

+        {

+            all_ana_cal_status = ANACAL_ERROR;

+        }

+

+        else if (((get_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg17Ah) >> 8) & 0x1) != ad_cal_comp_out_init)

+        {

+            all_ana_cal_status = ANACAL_FINISH;

+        }

+        else

+        {

+            if ((rg_zcal_ctrl == 0x3F) || (rg_zcal_ctrl == 0x00))

+            {

+                all_ana_cal_status = ANACAL_SATURATION;  // need to FT

+                rg_zcal_ctrl = ZCAL_MIDDLE;  // 0 dB

+            }

+        }

+    }

+

+    if (all_ana_cal_status == ANACAL_ERROR)

+    {

+        rg_zcal_ctrl = ZCAL_MIDDLE;  // 0 dB

+

+        set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0E0h, (uint16_t)rg_zcal_ctrl);

+    }

+    else

+    {

+        // rg_zcal_ctrl[5:0] rg_rext_trim[13:8]

+        set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0E0h, (uint16_t)((rg_zcal_ctrl << 8) | rg_zcal_ctrl));

+

+        // 1f_115[2:0](rg_bg_rasel) = rg_zcal_ctrl[5:3]

+        set_gphy_reg_cl45(phyadd, DEVID_1F, RgAddr_dev1Fh_reg115h, (uint16_t)((rg_zcal_ctrl & 0x3f) >> 3));

+    }

+

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DBh, Disable_all);

+    return all_ana_cal_status;

+}

+

+uint8_t R50_Calibration(uint8_t phyadd, uint8_t phyadd_common)

+{

+    int8_t rg_zcal_ctrl = 0, rg_r50ohm_rsel_tx = 0, calibration_polarity = 0;

+    uint8_t all_ana_cal_status = 1;

+    int16_t backup_dev1e_e0 = 0, ad_cal_comp_out_init = 0, calibration_pair = 0;

+

+    /* setting */

+    set_gphy_reg_cl22(phyadd, RgAddr_Reg1Fh, CL22_Page_Reg);        // g0

+    set_gphy_reg_cl22(phyadd, RgAddr_Reg00h, AN_disable_force_1000M);  // AN disable, force 1000M

+

+    set_gphy_reg_cl45(phyadd_common, DEVID_1F, RgAddr_dev1Fh_reg100h, BG_voltage_output); // BG voltage output

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg145h, Fix_mdi); // fix mdi

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg185h, Disable_tx_slew_control); // disable tx slew control

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0FBh, LDO_control); // ldo

+    set_gphy_reg_cl45(phyadd_common, DEVID_1E, RgAddr_dev1Eh_reg0DBh, Cal_control_R50); // 1e_db[12]:rg_cal_ckinv, [8]:rg_ana_calen, [4]:rg_rext_calen

+    set_gphy_reg_cl45(phyadd_common, DEVID_1E, RgAddr_dev1Eh_reg0DCh, Disable_all); // 1e_dc[0]:rg_txvos_calen

+    set_gphy_reg_cl45(phyadd_common, DEVID_1E, RgAddr_dev1Eh_reg0E1h, Disable_all); // 1e_e1[4]:rg_cal_refsel(0:1.2V) enable BG 1.2V to REXT PAD

+

+    for (calibration_pair = ANACAL_PAIR_A; calibration_pair <= ANACAL_PAIR_D; calibration_pair++)

+    {

+        all_ana_cal_status = 1;

+

+        if (calibration_pair == ANACAL_PAIR_A)

+        {

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DBh, Cal_control_R50_pairA_ENABLE); // 1e_db[12]:rg_cal_ckinv, [8]:rg_ana_calen, [4]:rg_rext_calen, [0]:rg_zcalen_a

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DCh, Zcalen_A_ENABLE);

+        }

+        else if (calibration_pair == ANACAL_PAIR_B)

+        {

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DBh, Cal_control_R50); // 1e_db[12]:rg_cal_ckinv, [8]:rg_ana_calen, [4]:rg_rext_calen, [0]:rg_zcalen_a

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DCh, Zcalen_B_ENABLE); // 1e_dc[12]:rg_zcalen_b

+        }

+        else if (calibration_pair == ANACAL_PAIR_C)

+        {

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DBh, Cal_control_R50); // 1e_db[12]:rg_cal_ckinv, [8]:rg_ana_calen, [4]:rg_rext_calen, [0]:rg_zcalen_a

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DCh, Zcalen_C_ENABLE); // 1e_dc[8]:rg_zcalen_c

+        }

+        else // if(calibration_pair == ANACAL_PAIR_D)

+        {

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DBh, Cal_control_R50); // 1e_db[12]:rg_cal_ckinv, [8]:rg_ana_calen, [4]:rg_rext_calen, [0]:rg_zcalen_a

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DCh, Zcalen_D_ENABLE); // 1e_dc[4]:rg_zcalen_d

+        }

+

+        /* calibrate */

+        rg_zcal_ctrl = ZCAL_MIDDLE;             // start with 0 dB

+

+        backup_dev1e_e0 = (get_gphy_reg_cl45(phyadd_common, DEVID_1E, RgAddr_dev1Eh_reg0E0h)&(~0x003f));

+        set_gphy_reg_cl45(phyadd_common, DEVID_1E, RgAddr_dev1Eh_reg0E0h, (backup_dev1e_e0 | rg_zcal_ctrl));

+

+        anacal_exe(phyadd_common);

+        if (all_ana_cal_status == 0)

+        {

+            all_ana_cal_status = ANACAL_ERROR;

+        }

+

+        ad_cal_comp_out_init = (get_gphy_reg_cl45(phyadd_common, DEVID_1E, RgAddr_dev1Eh_reg17Ah) >> 8) & 0x1;  // 1e_17a[8]:ad_cal_comp_out

+

+        if (ad_cal_comp_out_init == 1)

+        {

+            calibration_polarity = -1;

+        }

+        else

+        {

+            calibration_polarity = 1;

+        }

+

+        while (all_ana_cal_status < ANACAL_ERROR)

+        {

+            rg_zcal_ctrl += calibration_polarity;

+

+            set_gphy_reg_cl45(phyadd_common, DEVID_1E, RgAddr_dev1Eh_reg0E0h, (backup_dev1e_e0 | rg_zcal_ctrl));

+

+            anacal_exe(phyadd_common);

+

+            if (all_ana_cal_status == 0)

+            {

+                all_ana_cal_status = ANACAL_ERROR;

+            }

+            else if (((get_gphy_reg_cl45(phyadd_common, DEVID_1E, RgAddr_dev1Eh_reg17Ah) >> 8) & 0x1) != ad_cal_comp_out_init)

+            {

+                all_ana_cal_status = ANACAL_FINISH;

+            }

+            else

+            {

+                if ((rg_zcal_ctrl == 0x3F) || (rg_zcal_ctrl == 0x00))

+                {

+                    all_ana_cal_status = ANACAL_SATURATION;  // need to FT

+                    rg_zcal_ctrl = ZCAL_MIDDLE;  // 0 dB

+                }

+            }

+        }

+

+        if (all_ana_cal_status == ANACAL_ERROR)

+        {

+            rg_r50ohm_rsel_tx = ZCAL_MIDDLE;  // 0 dB

+        }

+        else

+        {

+            if (rg_zcal_ctrl > (0x3F - R50_OFFSET_VALUE))

+            {

+                all_ana_cal_status = ANACAL_SATURATION;  // need to FT

+                rg_zcal_ctrl = ZCAL_MIDDLE;  // 0 dB

+            }

+            else

+            {

+                rg_zcal_ctrl += R50_OFFSET_VALUE;

+            }

+

+            rg_r50ohm_rsel_tx = ZCAL_TO_R50ohm_TBL[rg_zcal_ctrl];

+        }

+

+        if (calibration_pair == ANACAL_PAIR_A)

+        {

+            // cr_r50ohm_rsel_tx_a

+            ad_cal_comp_out_init = get_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg174h)&(~MASK_r50ohm_rsel_tx_a);

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg174h, (ad_cal_comp_out_init | (((rg_r50ohm_rsel_tx << 8) & MASK_MSB_8bit) | Rg_r50ohm_rsel_tx_a_en))); // 1e_174[15:8]

+        }

+        else if (calibration_pair == ANACAL_PAIR_B)

+        {

+            // cr_r50ohm_rsel_tx_b

+            ad_cal_comp_out_init = get_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg174h)&(~MASK_r50ohm_rsel_tx_b);

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg174h, (ad_cal_comp_out_init | (((rg_r50ohm_rsel_tx << 0) & MASK_LSB_8bit) | Rg_r50ohm_rsel_tx_b_en))); // 1e_174[7:0]

+        }

+        else if (calibration_pair == ANACAL_PAIR_C)

+        {

+            // cr_r50ohm_rsel_tx_c

+            ad_cal_comp_out_init = get_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg175h)&(~MASK_r50ohm_rsel_tx_c);

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg175h, (ad_cal_comp_out_init | (((rg_r50ohm_rsel_tx << 8) & MASK_MSB_8bit) | Rg_r50ohm_rsel_tx_c_en))); // 1e_175[15:8]

+        }

+        else // if(calibration_pair == ANACAL_PAIR_D)

+        {

+            // cr_r50ohm_rsel_tx_d

+            ad_cal_comp_out_init = get_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg175h)&(~MASK_r50ohm_rsel_tx_d);

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg175h, (ad_cal_comp_out_init | (((rg_r50ohm_rsel_tx << 0) & MASK_LSB_8bit) | Rg_r50ohm_rsel_tx_d_en))); // 1e_175[7:0]

+        }

+    }

+

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DBh, Disable_all);

+    set_gphy_reg_cl45(phyadd_common, DEVID_1E, RgAddr_dev1Eh_reg0DBh, Disable_all);

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DCh, Disable_all);

+

+    return all_ana_cal_status;

+}

+

+uint8_t TX_OFS_Calibration(uint8_t phyadd, uint8_t phyadd_common)

+{

+    int8_t tx_offset_index = 0, calibration_polarity = 0;

+    uint8_t all_ana_cal_status = 1, tx_offset_reg_shift = 0, tbl_idx = 0;

+    int16_t ad_cal_comp_out_init = 0, calibration_pair = 0, tx_offset_reg = 0, reg_temp = 0;

+

+    /* setting */

+    set_gphy_reg_cl22(phyadd, RgAddr_Reg1Fh, CL22_Page_Reg);        // g0

+    set_gphy_reg_cl22(phyadd, RgAddr_Reg00h, AN_disable_force_1000M);  // AN disable, force 1000M

+

+    set_gphy_reg_cl45(phyadd, DEVID_1F, RgAddr_dev1Fh_reg100h, BG_voltage_output); // BG voltage output

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg145h, Fix_mdi); // fix mdi

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg185h, Disable_tx_slew_control); // disable tx slew control

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0FBh, LDO_control); // ldo

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DBh, Cal_control_TX_OFST); // 1e_db[12]:rg_cal_ckinv, [8]:rg_ana_calen, [4]:rg_rext_calen

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DCh, Rg_txvos_calen_ENABLE); // 1e_dc[0]:rg_txvos_calen

+    set_gphy_reg_cl45(phyadd_common, DEVID_1E, RgAddr_dev1Eh_reg0DBh, Cal_control_TX_OFST); // 1e_db[12]:rg_cal_ckinv, [8]:rg_ana_calen, [4]:rg_rext_calen

+    set_gphy_reg_cl45(phyadd_common, DEVID_1E, RgAddr_dev1Eh_reg0DCh, Rg_txvos_calen_ENABLE); // 1e_dc[0]:rg_txvos_calen

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0E1h, Disable_all); // 1e_e1[4]:rg_cal_refsel(0:1.2V) enable BG 1.2V to REXT PAD

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg096h, Bypass_tx_offset_cal); // 1e_96[15]:bypass_tx_offset_cal, Hw bypass, Fw cal

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg03Eh, Enable_Tx_VLD); // 1e_3e:enable Tx VLD

+

+    for (calibration_pair = ANACAL_PAIR_A; calibration_pair <= ANACAL_PAIR_D; calibration_pair++)

+    {

+        all_ana_cal_status = 1;

+

+        tbl_idx = TX_OFFSET_0mV_idx;

+        tx_offset_index = EN753x_TX_OFS_TBL[tbl_idx];

+

+        if (calibration_pair == ANACAL_PAIR_A)

+        {

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DDh, Rg_txg_calen_a_ENABLE);       // 1e_dd[12]:rg_txg_calen_a

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg17Dh, (Force_dasn_dac_in0_ENABLE | DAC_IN_0V));  // 1e_17d:dac_in0_a

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg181h, (Force_dasn_dac_in1_ENABLE | DAC_IN_0V));  // 1e_181:dac_in1_a

+

+            reg_temp = (get_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg172h)&(~MASK_cr_tx_amp_offset_MSB));

+            tx_offset_reg_shift = 8;  // 1e_172[13:8]

+            tx_offset_reg = RgAddr_dev1Eh_reg172h;

+        }

+        else if (calibration_pair == ANACAL_PAIR_B)

+        {

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DDh, Rg_txg_calen_b_ENABLE);       // 1e_dd[8]:rg_txg_calen_b

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg17Eh, (Force_dasn_dac_in0_ENABLE | DAC_IN_0V));  // 1e_17e:dac_in0_b

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg182h, (Force_dasn_dac_in1_ENABLE | DAC_IN_0V));  // 1e_182:dac_in1_b

+

+            reg_temp = (get_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg172h)&(~MASK_cr_tx_amp_offset_LSB));

+            tx_offset_reg_shift = 0;  // 1e_172[5:0]

+            tx_offset_reg = RgAddr_dev1Eh_reg172h;

+        }

+        else if (calibration_pair == ANACAL_PAIR_C)

+        {

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DDh, Rg_txg_calen_c_ENABLE);       // 1e_dd[4]:rg_txg_calen_c

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg17Fh, (Force_dasn_dac_in0_ENABLE | DAC_IN_0V));  // 1e_17f:dac_in0_c

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg183h, (Force_dasn_dac_in1_ENABLE | DAC_IN_0V));  // 1e_183:dac_in1_c

+

+            reg_temp = (get_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg173h)&(~MASK_cr_tx_amp_offset_MSB));

+            tx_offset_reg_shift = 8;  // 1e_173[13:8]

+            tx_offset_reg = RgAddr_dev1Eh_reg173h;

+        }

+        else // if(calibration_pair == ANACAL_PAIR_D)

+        {

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DDh, Rg_txg_calen_d_ENABLE);       // 1e_dd[0]:rg_txg_calen_d

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg180h, (Force_dasn_dac_in0_ENABLE | DAC_IN_0V));  // 1e_180:dac_in0_d

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg184h, (Force_dasn_dac_in1_ENABLE | DAC_IN_0V));  // 1e_184:dac_in1_d

+

+            reg_temp = (get_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg173h)&(~MASK_cr_tx_amp_offset_LSB));

+            tx_offset_reg_shift = 0;  // 1e_173[5:0]

+            tx_offset_reg = RgAddr_dev1Eh_reg173h;

+        }

+

+        /* calibrate */

+        //tx_offset_index = TX_AMP_OFFSET_0mV;

+        tbl_idx = TX_OFFSET_0mV_idx;

+        tx_offset_index = EN753x_TX_OFS_TBL[tbl_idx];

+        set_gphy_reg_cl45(phyadd, DEVID_1E, tx_offset_reg, (reg_temp | (tx_offset_index << tx_offset_reg_shift)));  // 1e_172, 1e_173

+

+        anacal_exe(phyadd_common);

+        if (all_ana_cal_status == 0)

+        {

+            all_ana_cal_status = ANACAL_ERROR;

+        }

+

+        ad_cal_comp_out_init = (get_gphy_reg_cl45(phyadd_common, DEVID_1E, RgAddr_dev1Eh_reg17Ah) >> 8) & 0x1;  // 1e_17a[8]:ad_cal_comp_out

+

+        if (ad_cal_comp_out_init == 1)

+        {

+            calibration_polarity = -1;

+        }

+        else

+        {

+            calibration_polarity = 1;

+        }

+

+        while (all_ana_cal_status < ANACAL_ERROR)

+        {

+            tbl_idx += calibration_polarity;

+            tx_offset_index = EN753x_TX_OFS_TBL[tbl_idx];

+

+            set_gphy_reg_cl45(phyadd, DEVID_1E, tx_offset_reg, (reg_temp | (tx_offset_index << tx_offset_reg_shift)));  // 1e_172, 1e_173

+

+            anacal_exe(phyadd_common);

+

+            if (all_ana_cal_status == 0)

+            {

+                all_ana_cal_status = ANACAL_ERROR;

+            }

+            else if (((get_gphy_reg_cl45(phyadd_common, DEVID_1E, RgAddr_dev1Eh_reg17Ah) >> 8) & 0x1) != ad_cal_comp_out_init)

+            {

+                all_ana_cal_status = ANACAL_FINISH;

+            }

+            else

+            {

+                if ((tx_offset_index == 0x3f) || (tx_offset_index == 0x1f))

+                {

+                    all_ana_cal_status = ANACAL_SATURATION;  // need to FT

+                }

+            }

+        }

+

+        if (all_ana_cal_status == ANACAL_ERROR)

+        {

+            tbl_idx = TX_OFFSET_0mV_idx;

+            tx_offset_index = EN753x_TX_OFS_TBL[tbl_idx];

+

+            set_gphy_reg_cl45(phyadd, DEVID_1E, tx_offset_reg, (reg_temp | (tx_offset_index << tx_offset_reg_shift)));  // cr_tx_amp_offset_a/b/c/d, 1e_172, 1e_173

+        }

+    }

+

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg17Dh, Disable_all);

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg17Eh, Disable_all);

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg17Fh, Disable_all);

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg180h, Disable_all);

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg181h, Disable_all);

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg182h, Disable_all);

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg183h, Disable_all);

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg184h, Disable_all);

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DBh, Disable_all); // disable analog calibration circuit

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DCh, Disable_all); // disable Tx offset calibration circuit

+    set_gphy_reg_cl45(phyadd_common, DEVID_1E, RgAddr_dev1Eh_reg0DBh, Disable_all); // disable analog calibration circuit

+    set_gphy_reg_cl45(phyadd_common, DEVID_1E, RgAddr_dev1Eh_reg0DCh, Disable_all); // disable Tx offset calibration circuit

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg03Eh, Disable_all); // disable Tx VLD force mode

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DDh, Disable_all); // disable Tx offset/amplitude calibration circuit

+

+    return all_ana_cal_status;

+}

+

+uint8_t TX_AMP_Calibration(uint8_t phyadd, uint8_t phyadd_common)

+{

+    int8_t tx_amp_index = 0, calibration_polarity = 0;

+    uint8_t all_ana_cal_status = 1, tx_amp_reg_shift = 0;

+    uint8_t tx_amp_reg = 0, tx_amp_reg_100 = 0, tst_offset = 0, hbt_offset = 0, gbe_offset = 0, tbt_offset = 0;

+    uint16_t ad_cal_comp_out_init = 0, calibration_pair = 0, reg_temp = 0;

+

+  //phyadd_common = phyadd;

+

+    /* setting */

+    set_gphy_reg_cl22(phyadd, RgAddr_Reg1Fh, CL22_Page_Reg);        // g0

+    set_gphy_reg_cl22(phyadd, RgAddr_Reg00h, AN_disable_force_1000M);  // AN disable, force 1000M

+

+    set_gphy_reg_cl45(phyadd, DEVID_1F, RgAddr_dev1Fh_reg100h, BG_voltage_output); // BG voltage output

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg145h, Fix_mdi); // fix mdi

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg185h, Disable_tx_slew_control); // disable tx slew control

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0FBh, LDO_control); // ldo

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DBh, Cal_control_TX_AMP); // 1e_db[12]:rg_cal_ckinv, [8]:rg_ana_calen, [4]:rg_rext_calen

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DCh, Rg_txvos_calen_ENABLE); // 1e_dc[0]:rg_txvos_calen

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0E1h, Rg_cal_refsel_ENABLE); // 1e_e1[4]:rg_cal_refsel(0:1.2V) enable BG 1.2V to REXT PAD

+    set_gphy_reg_cl45(phyadd_common, DEVID_1E, RgAddr_dev1Eh_reg0DBh, Cal_control_TX_AMP); // 1e_db[12]:rg_cal_ckinv, [8]:rg_ana_calen, [4]:rg_rext_calen

+    set_gphy_reg_cl45(phyadd_common, DEVID_1E, RgAddr_dev1Eh_reg0DCh, Rg_txvos_calen_ENABLE); // 1e_dc[0]:rg_txvos_calen

+    set_gphy_reg_cl45(phyadd_common, DEVID_1E, RgAddr_dev1Eh_reg0E1h, Rg_cal_refsel_ENABLE); // 1e_e1[4]:rg_cal_refsel(0:1.2V) enable BG 1.2V to REXT PAD

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg096h, Bypass_tx_offset_cal); // 1e_96[15]:bypass_tx_offset_cal, Hw bypass, Fw cal

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg03Eh, Enable_Tx_VLD); // 1e_3e:enable Tx VLD

+

+    for (calibration_pair = ANACAL_PAIR_A; calibration_pair <= ANACAL_PAIR_D; calibration_pair++)

+    //for (calibration_pair = ANACAL_PAIR_A; calibration_pair <= ANACAL_PAIR_B; calibration_pair++) // debugging

+    {

+        all_ana_cal_status = 1;

+

+        /* calibrate */

+        tx_amp_index = TX_AMP_MIDDLE;   // start with 0 dB

+        if (calibration_pair == ANACAL_PAIR_A)

+        {

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DDh, Rg_txg_calen_a_ENABLE);       // 1e_dd[12]:rg_txg_calen_a amp calibration enable

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg17Dh, (Force_dasn_dac_in0_ENABLE | DAC_IN_2V));  // 1e_17d:dac_in0_a

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg181h, (Force_dasn_dac_in1_ENABLE | DAC_IN_2V));  // 1e_181:dac_in1_a

+

+            reg_temp = (get_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg012h)&(~MASK_da_tx_i2mpb_a_gbe));

+            tx_amp_reg_shift = 10;  // 1e_12[15:10]

+            tx_amp_reg = RgAddr_dev1Eh_reg012h;

+            tx_amp_reg_100 = 0x16;

+        }

+        else if (calibration_pair == ANACAL_PAIR_B)

+        {

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DDh, Rg_txg_calen_b_ENABLE);       // 1e_dd[8]:rg_txg_calen_b amp calibration enable

+            //Serial.println(Rg_txg_calen_b_ENABLE, HEX);

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg17Eh, (Force_dasn_dac_in0_ENABLE | DAC_IN_2V));  // 1e_17e:dac_in0_b

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg182h, (Force_dasn_dac_in1_ENABLE | DAC_IN_2V));  // 1e_182:dac_in1_b

+

+            reg_temp = (get_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg017h)&(~MASK_da_tx_i2mpb_b_c_d_gbe));

+            tx_amp_reg_shift = 8; // 1e_17[13:8]

+            tx_amp_reg = RgAddr_dev1Eh_reg017h;

+            tx_amp_reg_100 = 0x18;

+        }

+        else if (calibration_pair == ANACAL_PAIR_C)

+        {

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DDh, Rg_txg_calen_c_ENABLE);       // 1e_dd[4]:rg_txg_calen_c amp calibration enable

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg17Fh, (Force_dasn_dac_in0_ENABLE | DAC_IN_2V));  // 1e_17f:dac_in0_c

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg183h, (Force_dasn_dac_in1_ENABLE | DAC_IN_2V));  // 1e_183:dac_in1_c

+

+            reg_temp = (get_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg019h)&(~MASK_da_tx_i2mpb_b_c_d_gbe));

+            tx_amp_reg_shift = 8; // 1e_19[13:8]

+            tx_amp_reg = RgAddr_dev1Eh_reg019h;

+            tx_amp_reg_100 = 0x20;

+        }

+        else //if(calibration_pair == ANACAL_PAIR_D)

+        {

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DDh, Rg_txg_calen_d_ENABLE);       // 1e_dd[0]:rg_txg_calen_d amp calibration enable

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg180h, (Force_dasn_dac_in0_ENABLE | DAC_IN_2V));  // 1e_180:dac_in0_d

+            set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg184h, (Force_dasn_dac_in1_ENABLE | DAC_IN_2V));  // 1e_184:dac_in1_d

+

+            reg_temp = (get_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg021h)&(~MASK_da_tx_i2mpb_b_c_d_gbe));

+            tx_amp_reg_shift = 8; // 1e_21[13:8]

+            tx_amp_reg = RgAddr_dev1Eh_reg021h;

+            tx_amp_reg_100 = 0x22;

+        }

+

+        /* calibrate */

+        tx_amp_index = TX_AMP_MIDDLE; // start with 0 dB

+

+        set_gphy_reg_cl45(phyadd, DEVID_1E, tx_amp_reg, (reg_temp | (tx_amp_index << tx_amp_reg_shift))); // 1e_12/17/19/21

+

+        anacal_exe(phyadd_common);

+        if (all_ana_cal_status == 0)

+        {

+            all_ana_cal_status = ANACAL_ERROR;

+        }

+

+

+        ad_cal_comp_out_init = (get_gphy_reg_cl45(phyadd_common, DEVID_1E, RgAddr_dev1Eh_reg17Ah) >> 8) & 0x1;    // 1e_17a[8]:ad_cal_comp_out

+        //Serial.println(ad_cal_comp_out_init, HEX);

+

+        if (ad_cal_comp_out_init == 1)

+        {

+            calibration_polarity = -1;

+        }

+        else

+        {

+            calibration_polarity = 1;

+        }

+        while (all_ana_cal_status < ANACAL_ERROR)

+        {

+            tx_amp_index += calibration_polarity;

+            //Serial.println(tx_amp_index, HEX);

+

+            set_gphy_reg_cl45(phyadd, DEVID_1E, tx_amp_reg, (reg_temp | (tx_amp_index << tx_amp_reg_shift)));

+

+            anacal_exe(phyadd_common);

+

+            if (all_ana_cal_status == 0)

+            {

+                all_ana_cal_status = ANACAL_ERROR;

+            }

+            else if (((get_gphy_reg_cl45(phyadd_common, DEVID_1E, RgAddr_dev1Eh_reg17Ah) >> 8) & 0x1) != ad_cal_comp_out_init)

+            {

+                all_ana_cal_status = ANACAL_FINISH;

+                //Serial.print("    tx_amp_index: ");

+                //Serial.println(tx_amp_index, HEX);

+                //reg_temp = get_gphy_reg_cl45(phyadd, 0x1e, tx_amp_reg)&(~0xff00);

+                //set_gphy_reg_cl45(phyadd, 0x1e, tx_amp_reg, (reg_temp|((tx_amp_index + tst_offset)<<tx_amp_reg_shift)));  // for gbe(DAC)

+            }

+            else

+            {

+                if ((tx_amp_index == 0x3f) || (tx_amp_index == 0x00))

+                {

+                    all_ana_cal_status = ANACAL_SATURATION;  // need to FT

+                    tx_amp_index = TX_AMP_MIDDLE;

+                }

+            }

+        }

+

+        if (all_ana_cal_status == ANACAL_ERROR)

+        {

+            tx_amp_index = TX_AMP_MIDDLE;

+        }

+

+        // da_tx_i2mpb_a_gbe / b/c/d, only GBE for now

+        set_gphy_reg_cl45(phyadd, DEVID_1E, tx_amp_reg, ((tx_amp_index - TXAMP_offset) | ((tx_amp_index - TXAMP_offset) << tx_amp_reg_shift)));  // // temp modify

+        set_gphy_reg_cl45(phyadd, DEVID_1E, tx_amp_reg_100, ((tx_amp_index - TXAMP_offset) | ((tx_amp_index + TX_i2mpb_hbt_ofs) << tx_amp_reg_shift)));

+    }

+

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg17Dh, Disable_all);

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg17Eh, Disable_all);

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg17Fh, Disable_all);

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg180h, Disable_all);

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg181h, Disable_all);

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg182h, Disable_all);

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg183h, Disable_all);

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg184h, Disable_all);

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DBh, Disable_all); // disable analog calibration circuit

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DCh, Disable_all); // disable Tx offset calibration circuit

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg03Eh, Disable_all); // disable Tx VLD force mode

+    set_gphy_reg_cl45(phyadd, DEVID_1E, RgAddr_dev1Eh_reg0DDh, Disable_all); // disable Tx offset/amplitude calibration circuit

+

+    return all_ana_cal_status;

+}

+

+void set_gphy_reg_cl22(uint8_t phyad, uint8_t reg, uint16_t value)

+{

+    an8855_phy_write(phyad-g_smi_addr, reg, value);

+    /*

+       gsw_top_reg_REG_PHY_IAC REG_PHY_IAC_val;

+       gsw_top_reg_REG_PHY_IAD REG_PHY_IAD_val;

+

+    // Wait until done

+    do

+    {

+    REG_PHY_IAC_val.Raw = io_read32(RgAddr_gsw_top_reg_REG_PHY_IAC);

+    }

+    while(REG_PHY_IAC_val.Bits.csr_phy_acs_st);

+

+    // Set address

+    REG_PHY_IAC_val.Bits.csr_mdio_st = 1;

+    REG_PHY_IAC_val.Bits.csr_mdio_cmd = 1;

+    REG_PHY_IAC_val.Bits.csr_mdio_phy_addr = phyad;

+    REG_PHY_IAC_val.Bits.csr_mdio_reg_addr = reg;

+    REG_PHY_IAC_val.Bits.csr_mdio_wr_data = value;

+    REG_PHY_IAC_val.Bits.csr_phy_acs_st = 1;

+

+    io_write32(RgAddr_gsw_top_reg_REG_PHY_IAC, REG_PHY_IAC_val.Raw);

+    */

+}

+

+UINT16 get_gphy_reg_cl45(uint8_t prtid, uint8_t devid, uint16_t reg)

+{

+    UINT32 rdata = 0;

+

+    an8855_phy_read_cl45(prtid-g_smi_addr, devid, reg, &rdata);

+    return ((UINT16)rdata);

+    /*

+    gsw_top_reg_REG_PHY_IAC REG_PHY_IAC_val;

+    gsw_top_reg_REG_PHY_IAD REG_PHY_IAD_val;

+

+    // Wait until done

+    do

+    {

+    REG_PHY_IAC_val.Raw = io_read32(RgAddr_gsw_top_reg_REG_PHY_IAC);

+    }

+    while(REG_PHY_IAC_val.Bits.csr_phy_acs_st);

+

+    // Set address

+    REG_PHY_IAC_val.Bits.csr_mdio_st = 0;

+    REG_PHY_IAC_val.Bits.csr_mdio_cmd = 0;

+    REG_PHY_IAC_val.Bits.csr_mdio_phy_addr = prtid;

+    REG_PHY_IAC_val.Bits.csr_mdio_reg_addr = devid;

+    REG_PHY_IAC_val.Bits.csr_mdio_wr_data = reg;

+    REG_PHY_IAC_val.Bits.csr_phy_acs_st = 1;

+

+    io_write32(RgAddr_gsw_top_reg_REG_PHY_IAC, REG_PHY_IAC_val.Raw);

+

+    // Wait until done

+    do

+    {

+    REG_PHY_IAC_val.Raw = io_read32(RgAddr_gsw_top_reg_REG_PHY_IAC);

+    }

+    while(REG_PHY_IAC_val.Bits.csr_phy_acs_st);

+

+    // Read value

+    REG_PHY_IAC_val.Bits.csr_mdio_st = 0;

+    REG_PHY_IAC_val.Bits.csr_mdio_cmd = 3;

+    REG_PHY_IAC_val.Bits.csr_mdio_phy_addr = prtid;

+    REG_PHY_IAC_val.Bits.csr_mdio_reg_addr = devid;

+    REG_PHY_IAC_val.Bits.csr_mdio_wr_data = 0;

+    REG_PHY_IAC_val.Bits.csr_phy_acs_st = 1;

+    io_write32(RgAddr_gsw_top_reg_REG_PHY_IAC, REG_PHY_IAC_val.Raw);

+

+    // Wait until done

+    do

+    {

+    REG_PHY_IAC_val.Raw = io_read32(RgAddr_gsw_top_reg_REG_PHY_IAC);

+    }

+    while(REG_PHY_IAC_val.Bits.csr_phy_acs_st);

+

+    REG_PHY_IAD_val.Raw = io_read32(RgAddr_gsw_top_reg_REG_PHY_IAD);

+

+    return REG_PHY_IAD_val.Raw;

+    */

+}

+

+void set_gphy_reg_cl45(uint8_t prtid, uint8_t devid, uint16_t reg, uint16_t value)

+{

+    an8855_phy_write_cl45(prtid-g_smi_addr, devid, reg, value);

+    /*

+    gsw_top_reg_REG_PHY_IAC REG_PHY_IAC_val;

+

+    // Wait until done

+    do

+    {

+        REG_PHY_IAC_val.Raw = io_read32(RgAddr_gsw_top_reg_REG_PHY_IAC);

+    }

+    while(REG_PHY_IAC_val.Bits.csr_phy_acs_st);

+

+    // Set address

+    REG_PHY_IAC_val.Bits.csr_mdio_st = 0;

+    REG_PHY_IAC_val.Bits.csr_mdio_cmd = 0;

+    REG_PHY_IAC_val.Bits.csr_mdio_phy_addr = prtid;

+    REG_PHY_IAC_val.Bits.csr_mdio_reg_addr = devid;

+    REG_PHY_IAC_val.Bits.csr_mdio_wr_data = reg;

+    REG_PHY_IAC_val.Bits.csr_phy_acs_st = 1;

+

+    io_write32(RgAddr_gsw_top_reg_REG_PHY_IAC, REG_PHY_IAC_val.Raw);

+

+    // Wait until done

+    do

+    {

+        REG_PHY_IAC_val.Raw = io_read32(RgAddr_gsw_top_reg_REG_PHY_IAC);

+    }

+    while(REG_PHY_IAC_val.Bits.csr_phy_acs_st);

+

+    // Write value

+    REG_PHY_IAC_val.Bits.csr_mdio_st = 0;

+    REG_PHY_IAC_val.Bits.csr_mdio_cmd = 1;

+    REG_PHY_IAC_val.Bits.csr_mdio_phy_addr = prtid;

+    REG_PHY_IAC_val.Bits.csr_mdio_reg_addr = devid;

+    REG_PHY_IAC_val.Bits.csr_mdio_wr_data = value;

+    REG_PHY_IAC_val.Bits.csr_phy_acs_st = 1;

+

+    io_write32(RgAddr_gsw_top_reg_REG_PHY_IAC, REG_PHY_IAC_val.Raw);

+    */

+}

+

+void anacal_exe(uint8_t phyadd_common)

+{

+    set_gphy_reg_cl45(phyadd_common, DEVID_1E, RgAddr_dev1Eh_reg17Ch, 1);// da_calin_flag pull high

+    an8855_udelay(1000);

+    set_gphy_reg_cl45(phyadd_common, DEVID_1E, RgAddr_dev1Eh_reg17Ch, 0);// da_calin_flag pull low

+}

+

diff --git a/recipes-devtools/switch/files/src/an8855_sdk/core/an8855_reg.h b/recipes-devtools/switch/files/src/an8855_sdk/core/an8855_reg.h
new file mode 100644
index 0000000..3459cef
--- /dev/null
+++ b/recipes-devtools/switch/files/src/an8855_sdk/core/an8855_reg.h
@@ -0,0 +1,191 @@
+    /* FILE NAME:  an8855_reg.h

+ * PURPOSE:

+ *      It provides AN8855 register definition.

+ * NOTES:

+ *

+ */

+

+#ifndef AN8855_REG_H

+#define AN8855_REG_H

+

+#define PORT_CTRL_BASE                      0x10208000

+#define PORT_CTRL_PORT_OFFSET               0x200

+#define PORT_CTRL_REG(p, r)                 (PORT_CTRL_BASE + (p) * PORT_CTRL_PORT_OFFSET + (r))

+#define PCR(p)                              PORT_CTRL_REG(p, 0x04)

+

+#define PORT_MAC_CTRL_BASE                  0x10210000

+#define PORT_MAC_CTRL_PORT_OFFSET           0x200

+#define PORT_MAC_CTRL_REG(p, r)             (PORT_MAC_CTRL_BASE + (p) * PORT_MAC_CTRL_PORT_OFFSET + (r))

+#define PMCR(p)                             PORT_MAC_CTRL_REG(p, 0x00)

+

+/* Port debug count register */

+#define DBG_CNT_BASE                        0x3018

+#define DBG_CNT_PORT_BASE                   0x100

+#define DBG_CNT(p)                          (DBG_CNT_BASE + (p) * DBG_CNT_PORT_BASE)

+#define DIS_CLR                             (1 << 31)

+

+#define GMACCR                              (PORT_MAC_CTRL_BASE + 0x30e0)

+#define MTCC_LMT_S                          8

+#define MAX_RX_JUMBO_S                      4

+

+/* Values of MAX_RX_PKT_LEN */

+#define RX_PKT_LEN_1518                     0

+#define RX_PKT_LEN_1536                     1

+#define RX_PKT_LEN_1522                     2

+#define RX_PKT_LEN_MAX_JUMBO                3

+

+/* Fields of PMCR */

+#define FORCE_MODE                          (1 << 31)

+#define IPG_CFG_S                           20

+#define IPG_CFG_M                           0x300000

+#define EXT_PHY                             (1 << 19)

+#define MAC_MODE                            (1 << 18)

+#define MAC_TX_EN                           (1 << 16)

+#define MAC_RX_EN                           (1 << 15)

+#define MAC_PRE                             (1 << 14)

+#define BKOFF_EN                            (1 << 12)

+#define BACKPR_EN                           (1 << 11)

+#define FORCE_EEE1G                         (1 << 7)

+#define FORCE_EEE100                        (1 << 6)

+#define FORCE_RX_FC                         (1 << 5)

+#define FORCE_TX_FC                         (1 << 4)

+#define FORCE_SPD_S                         28

+#define FORCE_SPD_M                         0x70000000

+#define FORCE_DPX                           (1 << 25)

+#define FORCE_LINK                          (1 << 24)

+

+/* Fields of PMSR */

+#define EEE1G_STS                           (1 << 7)

+#define EEE100_STS                          (1 << 6)

+#define RX_FC_STS                           (1 << 5)

+#define TX_FC_STS                           (1 << 4)

+#define MAC_SPD_STS_S                       28

+#define MAC_SPD_STS_M                       0x70000000

+#define MAC_DPX_STS                         (1 << 25)

+#define MAC_LNK_STS                         (1 << 24)

+

+/* Values of MAC_SPD_STS */

+#define MAC_SPD_10                          0

+#define MAC_SPD_100                         1

+#define MAC_SPD_1000                        2

+#define MAC_SPD_2500                        3

+

+/* Values of IPG_CFG */

+#define IPG_96BIT                           0

+#define IPG_96BIT_WITH_SHORT_IPG            1

+#define IPG_64BIT                           2

+

+#define SGMII_REG_BASE                      0x5000

+#define SGMII_REG_PORT_BASE                 0x1000

+#define SGMII_REG(p, r)                     (SGMII_REG_BASE + (p) * SGMII_REG_PORT_BASE + (r))

+#define PCS_CONTROL_1(p)                    SGMII_REG(p, 0x00)

+#define SGMII_MODE(p)                       SGMII_REG(p, 0x20)

+#define QPHY_PWR_STATE_CTRL(p)              SGMII_REG(p, 0xe8)

+#define PHYA_CTRL_SIGNAL3(p)                SGMII_REG(p, 0x128)

+

+/* Fields of PCS_CONTROL_1 */

+#define SGMII_LINK_STATUS                   (1 << 18)

+#define SGMII_AN_ENABLE                     (1 << 12)

+#define SGMII_AN_RESTART                    (1 << 9)

+

+/* Fields of SGMII_MODE */

+#define SGMII_REMOTE_FAULT_DIS              (1 << 8)

+#define SGMII_IF_MODE_FORCE_DUPLEX          (1 << 4)

+#define SGMII_IF_MODE_FORCE_SPEED_S         0x2

+#define SGMII_IF_MODE_FORCE_SPEED_M         0x0c

+#define SGMII_IF_MODE_ADVERT_AN             (1 << 1)

+

+/* Values of SGMII_IF_MODE_FORCE_SPEED */

+#define SGMII_IF_MODE_FORCE_SPEED_10        0

+#define SGMII_IF_MODE_FORCE_SPEED_100       1

+#define SGMII_IF_MODE_FORCE_SPEED_1000      2

+

+/* Fields of QPHY_PWR_STATE_CTRL */

+#define PHYA_PWD                            (1 << 4)

+

+/* Fields of PHYA_CTRL_SIGNAL3 */

+#define RG_TPHY_SPEED_S                     2

+#define RG_TPHY_SPEED_M                     0x0c

+

+/* Values of RG_TPHY_SPEED */

+#define RG_TPHY_SPEED_1000                  0

+#define RG_TPHY_SPEED_2500                  1

+

+#define SYS_CTRL                            0x7000

+#define SW_PHY_RST                          (1 << 2)

+#define SW_SYS_RST                          (1 << 1)

+#define SW_REG_RST                          (1 << 0)

+

+#define PHY_IAC                             (0x1000e000)

+#define IAC_MAX_BUSY_TIME                   (1000)

+

+#define CLKGEN_CTRL                         0x7500

+#define CLK_SKEW_OUT_S                      8

+#define CLK_SKEW_OUT_M                      0x300

+#define CLK_SKEW_IN_S                       6

+#define CLK_SKEW_IN_M                       0xc0

+#define RXCLK_NO_DELAY                      (1 << 5)

+#define TXCLK_NO_REVERSE                    (1 << 4)

+#define GP_MODE_S                           1

+#define GP_MODE_M                           0x06

+#define GP_CLK_EN                           (1 << 0)

+

+/* Values of GP_MODE */

+#define GP_MODE_RGMII                       0

+#define GP_MODE_MII                         1

+#define GP_MODE_REV_MII                     2

+

+/* Values of CLK_SKEW_IN */

+#define CLK_SKEW_IN_NO_CHANGE               0

+#define CLK_SKEW_IN_DELAY_100PPS            1

+#define CLK_SKEW_IN_DELAY_200PPS            2

+#define CLK_SKEW_IN_REVERSE                 3

+

+/* Values of CLK_SKEW_OUT */

+#define CLK_SKEW_OUT_NO_CHANGE              0

+#define CLK_SKEW_OUT_DELAY_100PPS           1

+#define CLK_SKEW_OUT_DELAY_200PPS           2

+#define CLK_SKEW_OUT_REVERSE                3

+

+#define HWSTRAP                             0x7800

+#define XTAL_FSEL_S                         7

+#define XTAL_FSEL_M                         (1 << 7)

+

+#define XTAL_40MHZ                          0

+#define XTAL_25MHZ                          1

+

+#define PLLGP_EN                            0x7820

+#define EN_COREPLL                          (1 << 2)

+#define SW_CLKSW                            (1 << 1)

+#define SW_PLLGP                            (1 << 0)

+

+#define PLLGP_CR0                           0x78a8

+#define RG_COREPLL_EN                       (1 << 22)

+#define RG_COREPLL_POSDIV_S                 23

+#define RG_COREPLL_POSDIV_M                 0x3800000

+#define RG_COREPLL_SDM_PCW_S                1

+#define RG_COREPLL_SDM_PCW_M                0x3ffffe

+#define RG_COREPLL_SDM_PCW_CHG              (1 << 0)

+

+#define MHWSTRAP                            0x7804

+#define TOP_SIG_SR                          0x780c

+#define PAD_DUAL_SGMII_EN                   (1 << 1)

+

+/* RGMII and SGMII PLL clock */

+#define ANA_PLLGP_CR2                       0x78b0

+#define ANA_PLLGP_CR5                       0x78bc

+

+/* Efuse Register Define */

+#define GBE_EFUSE                           0x7bc8

+#define GBE_SEL_EFUSE_EN                    (1 << 0)

+

+/* GPIO_PAD_0 */

+#define GPIO_MODE0                          0x7c0c

+#define GPIO_MODE0_S                        0

+#define GPIO_MODE0_M                        0xf

+#define GPIO_0_INTERRUPT_MODE               0x1

+

+#define SMT0_IOLB                           0x7f04

+#define SMT_IOLB_5_SMI_MDC_EN               (1 << 5)

+

+#endif  /* End of AN8855_REG_H */

diff --git a/recipes-devtools/switch/files/src/switch_753x.c b/recipes-devtools/switch/files/src/switch_753x.c
index 9c7c921..6936f6a 100644
--- a/recipes-devtools/switch/files/src/switch_753x.c
+++ b/recipes-devtools/switch/files/src/switch_753x.c
@@ -12,10 +12,14 @@
 #include "switch_netlink.h"
 #include "switch_ioctl.h"
 #include "switch_fun.h"
+#include "switch_fun_an8855.h"
+
+#define SWITCH_APP_VERSION "1.0.1"
 
 struct mt753x_attr *attres;
 int chip_name;
 bool nl_init_flag;
+struct switch_func_s *p_switch_func;
 
 static void usage(char *cmd)
 {
@@ -23,16 +27,16 @@
 
 	/* 1. basic operations */
 	printf("1) mt753x switch Basic operations=================================================================================================================>>>>\n");
-	printf(" 1.1) %s devs							- list switch device id and model name  \n", cmd);
-	printf(" 1.2) %s sysctl							- show the ways to access kenerl driver: netlink or ioctl \n", cmd);
+	printf(" 1.1) %s devs							- list switch device id and model name\n", cmd);
+	printf(" 1.2) %s sysctl							- show the ways to access kenerl driver: netlink or ioctl\n", cmd);
 	printf(" 1.3) %s reset							- sw reset switch fsm and registers\n", cmd);
-	printf(" 1.4) %s reg r [offset]						- read the reg with default switch \n", cmd);
-	printf(" 1.5) %s reg w [offset] [value]					- write the reg with default switch \n", cmd);
+	printf(" 1.4) %s reg r [offset]						- read the reg with default switch\n", cmd);
+	printf(" 1.5) %s reg w [offset] [value]					- write the reg with default switch\n", cmd);
 	printf(" 1.6) %s reg d [offset]						- dump the reg with default switch\n", cmd);
-	printf(" 1.7) %s dev [devid] reg r [addr]				- read the reg with the switch devid  \n", cmd);
-	printf(" 1.8) %s dev [devid] reg w [addr] [value] 			- write the regs with the switch devid \n", cmd);
-	printf(" 1.9) %s dev [devid] reg d [addr]				- dump the regs with the switch devid \n", cmd);
-	printf("																			\n");
+	printf(" 1.7) %s dev [devid] reg r [addr]				- read the reg with the switch devid\n", cmd);
+	printf(" 1.8) %s dev [devid] reg w [addr] [value]			- write the regs with the switch devid\n", cmd);
+	printf(" 1.9) %s dev [devid] reg d [addr]				- dump the regs with the switch devid\n", cmd);
+	printf("\n");
 
 	/* 2. phy operations */
 	printf("2) mt753x switch PHY operations===================================================================================================================>>>>\n");
@@ -42,13 +46,13 @@
 	printf(" 2.4) %s phy cl22 w [port_num] [phy_reg] [value]		- write specific phy register of specific port by clause 22\n", cmd);
 	printf(" 2.5) %s phy cl45 r [port_num] [dev_num] [phy_reg]		- read specific phy register of specific port by clause 45\n", cmd);
 	printf(" 2.6) %s phy cl45 w [port_num] [dev_num] [phy_reg] [value]	- write specific phy register of specific port by clause 45\n", cmd);
-	printf(" 2.7) %s phy fc [port_num] [enable 0|1]				- set switch phy flow control, port is 0~4, enable is 1, disable is 0 \n", cmd);
-	printf(" 2.8) %s phy an [port_num] [enable 0|1]				- set switch phy auto-negotiation, port is 0~4, enable is 1, disable is 0 \n", cmd);
+	printf(" 2.7) %s phy fc [port_num] [enable 0|1]				- set switch phy flow control, port is 0~4, enable is 1, disable is 0\n", cmd);
+	printf(" 2.8) %s phy an [port_num] [enable 0|1]				- set switch phy auto-negotiation, port is 0~4, enable is 1, disable is 0\n", cmd);
 	printf(" 2.9) %s trreg r [port_num] [ch_addr] [node_addr] [data_addr]	- read phy token-ring of specific port\n", cmd);
 	printf(" 2.10) %s trreg w [port_num] [ch_addr] [node_addr] [data_addr]	- write phy token-ring of specific port\n", cmd);
-	printf("		[high_value] [low_value]									\n");
+	printf("		[high_value] [low_value]\n");
 	printf(" 2.11) %s crossover [port_num] [mode auto|mdi|mdix]		- switch auto or force mdi/mdix mode for crossover cable\n", cmd);
-	printf("																			\n");
+	printf("\n");
 
 	/* 3. mac operations */
 	printf("3) mt753x switch MAC operations====================================================================================================================>>>>\n");
@@ -65,35 +69,35 @@
 	printf(" 3.11) %s filt [mac] [portmap]					- add a SA filtering entry (with portmap)to switch mac table\n", cmd);
 	printf(" 3.12) %s filt [mac] [portmap] [vlan id				- add a SA filtering entry (with portmap, vlan id)to switch mac table\n", cmd);
 	printf(" 3.13) %s filt [mac] [portmap] [vlan id] [age]			- add a SA filtering entry (with portmap, vlan id, age out time) to switch table\n", cmd);
-	printf(" 3.14) %s arl aging [active:0|1] [time:1~65536]			- set switch arl aging timeout value \n", cmd);
-	printf(" 3.15) %s macctl fc [enable|disable]				- set switch mac global flow control,enable is 1, disable is 0 \n", cmd);
-	printf("																			\n");
+	printf(" 3.14) %s arl aging [active:0|1] [time:1~65536]			- set switch arl aging timeout value\n", cmd);
+	printf(" 3.15) %s macctl fc [enable|disable]				- set switch mac global flow control,enable is 1, disable is 0\n", cmd);
+	printf("\n");
 
 	/* 4. mib counter operations */
 	printf("4) mt753x switch mib counter operations============================================================================================================>>>>\n");
-	printf(" 4.1) %s esw_cnt get						-get switch mib counters          \n", cmd);
-	printf(" 4.2) %s esw_cnt clear						-clear switch mib counters         \n", cmd);
-	printf(" 4.3) %s output_queue_cnt get					-get switch output queue counters \n", cmd);
-	printf(" 4.4) %s free_page get						-get switch system free page counters  \n", cmd);
-	printf("																			\n");
+	printf(" 4.1) %s esw_cnt get						-get switch mib counters\n", cmd);
+	printf(" 4.2) %s esw_cnt clear						-clear switch mib counters\n", cmd);
+	printf(" 4.3) %s output_queue_cnt get					-get switch output queue counters\n", cmd);
+	printf(" 4.4) %s free_page get						-get switch system free page counters\n", cmd);
+	printf("\n");
 
 	/* 5. acl function operations */
 	printf("5) mt753x switch acl function operations============================================================================================================>>>>\n");
-	printf(" 5.1) %s acl enable [port] [port_enable:0|1]			- set switch acl function enabled, port is 0~6,enable is 1, disable is 0  \n", cmd);
-	printf(" 5.2) %s acl etype add [ethtype] [portmap]			- drop L2 ethertype packets \n", cmd);
-	printf(" 5.3) %s acl dmac add [mac] [portmap]				- drop L2 dest-Mac packets \n", cmd);
-	printf(" 5.4) %s acl dip add [dip] [portmap]				- drop dip packets \n", cmd);
+	printf(" 5.1) %s acl enable [port] [port_enable:0|1]			- set switch acl function enabled, port is 0~6,enable is 1, disable is 0\n", cmd);
+	printf(" 5.2) %s acl etype add [ethtype] [portmap]			- drop L2 ethertype packets\n", cmd);
+	printf(" 5.3) %s acl dmac add [mac] [portmap]				- drop L2 dest-Mac packets\n", cmd);
+	printf(" 5.4) %s acl dip add [dip] [portmap]				- drop dip packets\n", cmd);
 	printf(" 5.5) %s acl port add [sport] [portmap]				- drop L4 UDP/TCP source port packets\n", cmd);
 	printf(" 5.6) %s acl L4 add [2byes] [portmap]				- drop L4 packets with 2bytes payload\n", cmd);
-	printf(" 5.7) %s acl acltbl-add  [tbl_idx:0~63/255] [vawd1] [vawd2]	- set switch acl table new entry, max index-7530:63,7531:255 \n", cmd);
-	printf(" 5.8) %s acl masktbl-add [tbl_idx:0~31/127] [vawd1] [vawd2]	- set switch acl mask table new entry, max index-7530:31,7531:127   \n", cmd);
-	printf(" 5.9) %s acl ruletbl-add [tbl_idx:0~31/127] [vawd1] [vawd2]	- set switch acl rule table new entry, max index-7530:31,7531:127  \n", cmd);
-	printf(" 5.10) %s acl ratetbl-add [tbl_idx:0~31] [vawd1] [vawd2] 	- set switch acl rate table new entry  \n", cmd);
-	printf(" 5.11) %s acl dip meter [dip] [portmap][meter:kbps]		- rate limit dip packets \n", cmd);
-	printf(" 5.12) %s acl dip trtcm [dip] [portmap][CIR:kbps][CBS][PIR][PBS]- TrTCM dip packets \n", cmd);
-	printf(" 5.13) %s acl dip modup [dip] [portmap][usr_pri]		- modify usr priority from ACL \n", cmd);
-	printf(" 5.14) %s acl dip pppoe [dip] [portmap]				- pppoe header removal \n", cmd);
-	printf("																			\n");
+	printf(" 5.7) %s acl acltbl-add  [tbl_idx:0~63/255] [vawd1] [vawd2]	- set switch acl table new entry, max index-7530:63,7531:255\n", cmd);
+	printf(" 5.8) %s acl masktbl-add [tbl_idx:0~31/127] [vawd1] [vawd2]	- set switch acl mask table new entry, max index-7530:31,7531:127\n", cmd);
+	printf(" 5.9) %s acl ruletbl-add [tbl_idx:0~31/127] [vawd1] [vawd2]	- set switch acl rule table new entry, max index-7530:31,7531:127\n", cmd);
+	printf(" 5.10) %s acl ratetbl-add [tbl_idx:0~31] [vawd1] [vawd2]	- set switch acl rate table new entry\n", cmd);
+	printf(" 5.11) %s acl dip meter [dip] [portmap][meter:kbps]		- rate limit dip packets\n", cmd);
+	printf(" 5.12) %s acl dip trtcm [dip] [portmap][CIR:kbps][CBS][PIR][PBS]- TrTCM dip packets\n", cmd);
+	printf(" 5.13) %s acl dip modup [dip] [portmap][usr_pri]		- modify usr priority from ACL\n", cmd);
+	printf(" 5.14) %s acl dip pppoe [dip] [portmap]				- pppoe header removal\n", cmd);
+	printf("\n");
 
 	/* 6. dip table operations */
 	printf("6) mt753x switch dip table operations=================================================================================================================>>>>\n");
@@ -101,7 +105,7 @@
 	printf(" 6.2) %s dip clear						- clear switch dip table\n", cmd);
 	printf(" 6.3) %s dip add [dip] [portmap]				- add a dip entry to switch table\n", cmd);
 	printf(" 6.4) %s dip del [dip]						- del a dip entry to switch table\n", cmd);
-	printf("																			\n");
+	printf("\n");
 
 	/* 7. sip table operations */
 	printf("7) mt753x switch sip table operations=================================================================================================================>>>>\n");
@@ -109,36 +113,36 @@
 	printf(" 7.2) %s sip clear						- clear switch sip table\n", cmd);
 	printf(" 7.3) %s sip add [sip] [dip] [portmap]				- add a sip entry to switch table\n", cmd);
 	printf(" 7.4) %s sip del [sip] [dip]					- del a sip entry to switch table\n", cmd);
-	printf("																			\n");
+	printf("\n");
 
 	/* 8. vlan table operations */
 	printf("8) mt753x switch sip table operations====================================================================================================================>>>>\n");
 	printf(" 8.1) %s vlan dump (egtag)					- dump switch vlan table (with per port eg_tag setting)\n", cmd);
 	printf(" 8.2) %s vlan set [fid:0~7] [vid] [portmap]			- set vlan id and associated member at switch vlan table\n", cmd);
-	printf("			([stag:0~4095] [eg_con:0|1] [egtagPortMap 0:untagged 2:tagged]) \n");
+	printf("			([stag:0~4095] [eg_con:0|1] [egtagPortMap 0:untagged 2:tagged])\n");
 	printf("			Full Example: %s vlan set 0 3 10000100 0 0 20000200\n", cmd);
-	printf(" 8.3) %s vlan vid [vlan idx] [active:0|1] [vid] [portMap] 	- set switch vlan vid elements  \n", cmd);
-	printf("			[egtagPortMap] [ivl_en] [fid] [stag]							 \n");
-	printf(" 8.4) %s vlan pvid [port] [pvid]				- set switch vlan pvid  \n", cmd);
-	printf(" 8.5) %s vlan acc-frm [port] [acceptable_frame_type:0~3]	- set switch vlan acceptable_frame type : admit all frames: 0, \n", cmd);
-	printf("									admit only vlan-taged frames: 1,admit only untagged or priority-tagged frames: 2, reserved:3 \n");
-	printf(" 8.6) %s vlan port-attr [port] [attr:0~3]			- set switch vlan port attribute: user port: 0, statck port: 1, \n", cmd);
-	printf("									translation port: 2, transparent port:3        \n");
-	printf(" 8.7) %s vlan port-mode [port] [mode:0~3]			- set switch vlan port mode : port matrix mode: 0, fallback mode: 1,  \n", cmd);
-	printf("									check mode: 2, security mode:3                    \n");
-	printf(" 8.8) %s vlan eg-tag-pvc [port] [eg_tag:0~7]			- set switch vlan eg tag pvc : disable: 0, consistent: 1, reserved: 2, \n", cmd);
-	printf("									reserved:3,untagged:4,swap:5,tagged:6, stack:7                 \n");
-	printf(" 8.9) %s vlan eg-tag-pcr [port] [eg_tag:0~3]			- set switch vlan eg tag pcr : untagged: 0, swap: 1, tagged: 2, stack:3 \n", cmd);
-	printf("																			\n");
+	printf(" 8.3) %s vlan vid [vlan idx] [active:0|1] [vid] [portMap]	- set switch vlan vid elements\n", cmd);
+	printf("			[egtagPortMap] [ivl_en] [fid] [stag]\n");
+	printf(" 8.4) %s vlan pvid [port] [pvid]				- set switch vlan pvid\n", cmd);
+	printf(" 8.5) %s vlan acc-frm [port] [acceptable_frame_type:0~3]	- set switch vlan acceptable_frame type : admit all frames: 0,\n", cmd);
+	printf("									admit only vlan-taged frames: 1,admit only untagged or priority-tagged frames: 2, reserved:3\n");
+	printf(" 8.6) %s vlan port-attr [port] [attr:0~3]			- set switch vlan port attribute: user port: 0, statck port: 1,\n", cmd);
+	printf("									translation port: 2, transparent port:3\n");
+	printf(" 8.7) %s vlan port-mode [port] [mode:0~3]			- set switch vlan port mode : port matrix mode: 0, fallback mode: 1,\n", cmd);
+	printf("									check mode: 2, security mode:3\n");
+	printf(" 8.8) %s vlan eg-tag-pvc [port] [eg_tag:0~7]			- set switch vlan eg tag pvc : disable: 0, consistent: 1, reserved: 2,\n", cmd);
+	printf("									reserved:3,untagged:4,swap:5,tagged:6, stack:7\n");
+	printf(" 8.9) %s vlan eg-tag-pcr [port] [eg_tag:0~3]			- set switch vlan eg tag pcr : untagged: 0, swap: 1, tagged: 2, stack:3\n", cmd);
+	printf("\n");
 
 	/* 9. rate limit operations */
 	printf("9) mt753x switch rate limit operations=================================================================================================================>>>>\n");
-	printf(" 9.1) %s ratectl [in_ex_gress:0|1] [port] [rate]		- set switch port ingress(1) or egress(0) rate  \n", cmd);
-	printf(" 9.2) %s ingress-rate on [port] [Kbps]				- set ingress rate limit on port n (n= 0~ switch max port) \n", cmd);
-	printf(" 9.3) %s egress-rate on [port] [Kbps]				- set egress rate limit on port n (n= 0~ switch max port) \n", cmd);
-	printf(" 9.4) %s ingress-rate off [port]				- disable ingress rate limit on port n (n= 0~ switch max port) \n", cmd);
+	printf(" 9.1) %s ratectl [in_ex_gress:0|1] [port] [rate]		- set switch port ingress(1) or egress(0) rate\n", cmd);
+	printf(" 9.2) %s ingress-rate on [port] [Kbps]				- set ingress rate limit on port n (n= 0~ switch max port)\n", cmd);
+	printf(" 9.3) %s egress-rate on [port] [Kbps]				- set egress rate limit on port n (n= 0~ switch max port)\n", cmd);
+	printf(" 9.4) %s ingress-rate off [port]				- disable ingress rate limit on port n (n= 0~ switch max port)\n", cmd);
 	printf(" 9.5) %s egress-rate off [port]					- disable egress rate limit on port n (n= 0~ switch max port)\n", cmd);
-	printf("																			\n");
+	printf("\n");
 
 	/* 10. igmp operations */
 	printf("10) mt753x igmp operations===============================================================================================================================>>>>\n");
@@ -147,37 +151,37 @@
 	printf(" 10.2) %s igmpsnoop off						- turn off IGMP snoop and router port learning\n", cmd);
 	printf(" 10.3) %s igmpsnoop enable [port#]				- enable IGMP HW leave/join/Squery/Gquery\n", cmd);
 	printf(" 10.4) %s igmpsnoop disable [port#]				- disable IGMP HW leave/join/Squery/Gquery\n", cmd);
-	printf("																			\n");
+	printf("\n");
 
 	/* 11. QoS operations */
 	printf("11) mt753x QoS operations================================================================================================================================>>>>\n");
-	printf(" 11.1) %s qos sch [port:0~6] [queue:0~7] [shaper:min|max] [type:rr:0|sp:1|wfq:2]     - set switch qos sch type\n", cmd);
-	printf(" 11.2) %s qos base [port:0~6] [base]					- set switch qos base(UPW); port-based:0, tag-based:1, \n", cmd);
-	printf("									dscp-based:2, acl-based:3, arl-based:4, stag-based:5   \n");
-	printf(" 11.3) %s qos port-weight [port:0~6] [q0] [q1][q2][q3]		- set switch qos port queue weight; \n", cmd);
-	printf("				[q4][q5][q6][q7]				 [qn]: the weight of queue n, range: 1~16     \n");
-	printf(" 11.4) %s qos port-prio [port:0~6] [prio:0~7]			- set switch port qos user priority;  port is 0~6, priority is 0~7  \n", cmd);
-	printf(" 11.5) %s qos dscp-prio [dscp:0~63] [prio:0~7]			- set switch qos dscp user priority;  dscp is 0~63, priority is 0~7  \n", cmd);
-	printf(" 11.6) %s qos prio-qmap [port:0~6] [prio:0~7]  [queue:0~7]			- set switch qos priority queue map; priority is 0~7,queue is 0~7  \n", cmd);
-	printf("																			\n");
+	printf(" 11.1) %s qos sch [port:0~6] [queue:0~7] [shaper:min|max] [type:rr:0|sp:1|wfq:2]	 - set switch qos sch type\n", cmd);
+	printf(" 11.2) %s qos base [port:0~6] [base]					- set switch qos base(UPW); port-based:0, tag-based:1,\n", cmd);
+	printf("									dscp-based:2, acl-based:3, arl-based:4, stag-based:5\n");
+	printf(" 11.3) %s qos port-weight [port:0~6] [q0] [q1][q2][q3]		- set switch qos port queue weight;\n", cmd);
+	printf("				[q4][q5][q6][q7]				 [qn]: the weight of queue n, range: 1~16\n");
+	printf(" 11.4) %s qos port-prio [port:0~6] [prio:0~7]			- set switch port qos user priority;  port is 0~6, priority is 0~7\n", cmd);
+	printf(" 11.5) %s qos dscp-prio [dscp:0~63] [prio:0~7]			- set switch qos dscp user priority;  dscp is 0~63, priority is 0~7\n", cmd);
+	printf(" 11.6) %s qos prio-qmap [port:0~6] [prio:0~7]  [queue:0~7]			- set switch qos priority queue map; priority is 0~7,queue is 0~7\n", cmd);
+	printf("\n");
 
 	/*12. port mirror operations*/
 	printf(" 12) mt753x port mirror operations========================================================================================================================>>>>\n");
 	printf(" 12.1) %s mirror monitor [port]					- enable port mirror and indicate monitor port number\n", cmd);
 	printf(" 12.2) %s mirror target  [port]					- set port mirror target\n", cmd);
-	printf("			[direction| 0:off, 1:rx, 2:tx, 3:all]					\n");
-	printf(" 12.3) %s mirror enable [mirror_en:0|1] [mirror_port: 0-6]	- set switch mirror function enable(1) or disabled(0) for port 0~6  \n", cmd);
+	printf("			[direction| 0:off, 1:rx, 2:tx, 3:all]\n");
+	printf(" 12.3) %s mirror enable [mirror_en:0|1] [mirror_port: 0-6]	- set switch mirror function enable(1) or disabled(0) for port 0~6\n", cmd);
 	printf(" 12.4) %s mirror port-based [port] [port_tx_mir:0|1]		- set switch mirror port: target tx/rx/acl/vlan/igmp\n", cmd);
-	printf("				[port_rx_mir:0|1] [acl_mir:0|1]						\n");
-	printf("				[vlan_mis:0|1] [igmp_mir:0|1]						\n");
-	printf("																			\n");
+	printf("				[port_rx_mir:0|1] [acl_mir:0|1]\n");
+	printf("				[vlan_mis:0|1] [igmp_mir:0|1]\n");
+	printf("\n");
 
 	/*13. stp function*/
 	printf(" 13) mt753x stp operations===============================================================================================================================>>>>\n");
-	printf(" 13.1) %s stp [port] [fid] [state]				- set switch spanning tree state, port is 0~6, fid is 0~7,  \n", cmd);
-	printf("									state is 0~3(Disable/Discarding:0,Blocking/Listening/Discarding:1,) \n");
-	printf("									Learning:2,Forwarding:3 \n");
-	printf("																			\n");
+	printf(" 13.1) %s stp [port] [fid] [state]				- set switch spanning tree state, port is 0~6, fid is 0~7,\n", cmd);
+	printf("									state is 0~3(Disable/Discarding:0,Blocking/Listening/Discarding:1,)\n");
+	printf("									Learning:2,Forwarding:3\n");
+	printf("\n");
 
 	/*14. collision pool operations*/
 	printf("14) mt753x collision pool operations========================================================================================================================>>>>\n");
@@ -185,20 +189,235 @@
 	printf(" 14.2) %s collision-pool mac dump				- dump collision pool mac table\n", cmd);
 	printf(" 14.3) %s collision-pool dip dump				- dump collision pool dip table\n", cmd);
 	printf(" 14.4) %s collision-pool sip dump				- dump collision pool sip table\n", cmd);
-	printf("																			\n");
+	printf("\n");
 
 	/*15. pfc(priority flow control) operations*/
 	printf("15) mt753x pfc(priority flow control) operations==============================================================================================================>>>>\n");
-	printf(" 15.1) %s pfc enable [port] [enable 0|1]			- enable or disable port's pfc \n", cmd);
-	printf(" 15.2) %s pfc rx_counter [port]					- get port n pfc 8 up rx counter \n", cmd);
-	printf(" 15.3) %s pfc tx_counter [port]					- get port n pfc 8 up rx counter \n", cmd);
-	printf("																			\n");
+	printf(" 15.1) %s pfc enable [port] [enable 0|1]			- enable or disable port's pfc\n", cmd);
+	printf(" 15.2) %s pfc rx_counter [port]					- get port n pfc 8 up rx counter\n", cmd);
+	printf(" 15.3) %s pfc tx_counter [port]					- get port n pfc 8 up rx counter\n", cmd);
+	printf("\n");
 
 	/*15. pfc(priority flow control) operations*/
 	printf("16) mt753x EEE(802.3az) operations==============================================================================================================>>>>\n");
 	printf(" 16.1) %s eee enable [enable 0|1] ([portMap])			- enable or disable EEE (by portMap)\n", cmd);
 	printf(" 16.2) %s eee dump ([port])					- dump EEE capability (by port)\n", cmd);
-	printf("																			\n");
+	printf("\n");
+
+	if (chip_name == 0x8855) {
+		printf("switch an8855 <sub cmd> supported commands===================================================================================================================>>>>\n");
+		printf("\n");
+		printf("Register/GPHY access commands===============================================================================================================>>>>\n");
+		printf("reg r <reg(4'hex)>\n");
+		printf("reg w <reg(4'hex)> <value(8'hex)>\n");
+		printf("phy cl22 r <port(0..4)> <reg(2'hex)>\n");
+		printf("phy cl22 w <port(0..4)> <reg(2'hex)> <value(4'hex)>\n");
+		printf("phy cl45 r <port(0..4)> <dev(2'hex)> <reg(3'hex)>\n");
+		printf("phy cl45 w <port(0..4)> <dev(2'hex)> <reg(3'hex)> <value(4'hex)>\n");
+		printf("\n");
+		printf("Port configuration commands=================================================================================================================>>>>\n");
+		printf("port set matrix <port(0..6)> <matrix(6:0)>\n");
+		printf("port get matrix <port(0..6)>\n");
+		printf("port set vlanMode <port(0..6)> <vlanMode(0:matrix,1:fallback,2:check,3:security)>\n");
+		printf("port get vlanMode <port(0..6)>\n");
+		printf("port set flowCtrl <port(0..6)> <dir(0:Tx,1:Rx)> <fc_en(1:En,0:Dis)>\n");
+		printf("port get flowCtrl <port(0..6)> <dir(0:Tx,1:Rx)>\n");
+		printf("port set jumbo <pkt_len(0:1518,1:1536,2:1552,3:max)> <frame_len(2..15)>\n");
+		printf("port get jumbo\n");
+		printf("port set anMode <port(0..4)> <en(0:force,1:AN)>\n");
+		printf("port get anMode <port(0..4)>\n");
+		printf("port set localAdv <port(0..4)> <10H(1:En,0:Dis)> <10F(1:En,0:Dis)> <100H(1:En,0:Dis)> <100F(1:En,0:Dis)> <1000F(1:En,0:Dis)> <pause(1:En,0:Dis)>\n");
+		printf("port get localAdv <port(0..4)>\n");
+		printf("port get remoteAdv <port(0..4)>\n");
+		printf("port set speed <port(0..4)> <speed(0:10M,1:100M,2:1G,3:2.5G)>\n");
+		printf("port get speed <port(0..4)>\n");
+		printf("port set duplex <port(0..4)> <duplex(0:half,1:full)>\n");
+		printf("port get duplex <port(0..4)>\n");
+		printf("port get status <port(0..4)>\n");
+		printf("port set bckPres <port(0..6)> <bckPres(1:En,0:Dis)>\n");
+		printf("port get bckPres <port(0..6)>\n");
+		printf("port set psMode <port(0..4)> <ls(1:En,0:Dis)> <eee(1:En,0:Dis)>\n");
+		printf("port get psMode <port(0..4)>\n");
+		printf("port set smtSpdDwn <port(0..4)> <en(1:En,0:Dis)> <retry(2..5)>\n");
+		printf("port get smtSpdDwn <port(0..4)>\n");
+		printf("port set spTag <port(0..6)> <en(1:En,0:Dis)>\n");
+		printf("port get spTag <port(0..6)>\n");
+		printf("port set enable <port(0..4)> <en(1:En,0:Dis)>\n");
+		printf("port get enable <port(0..4)>\n");
+		printf("port set 5GBaseRMode\n");
+		printf("port set hsgmiiMode\n");
+		printf("port set sgmiiMode <mode(0:AN,1:Force)> <speed(0:10M,1:100M,2:1G)>\n");
+		printf("port set rmiiMode <speed(0:10M,1:100M)>\n");
+		printf("port set rgmiiMode <speed(0:10M,1:100M,2:1G)>\n");
+		printf("\n");
+		printf("Special tag commands========================================================================================================================>>>>\n");
+		printf("sptag  setEnable port<port(0..6)> enable<1:enable 0:disable>\n");
+		printf("sptag  getEnable port<port(0..6)>\n");
+		printf("sptag  setmode port<port(0..6)> mode<0:inset 1:replace>\n");
+		printf("sptag  getmode port<port(0..6)>\n");
+		printf("sptag  encode mode={ insert | replace } opc={ portmap | portid | lookup } dp={bitimap hex} vpm={ untagged | 8100 | 88a8 } pri=<UINT> cfi=<UINT> vid=<UINT>\n");
+		printf("sptag  decode <byte(hex)> <byte(hex)> <byte(hex)> <byte(hex)>\n");
+		printf("\n");
+		printf("Vlan commands===============================================================================================================================>>>>\n");
+		printf("sptag  set fid <vid(0..4095)> <fid(0..7)>\n");
+		printf("sptag  set memPort <vid(0..4095)> <bitmap(6:0)>\n");
+		printf("sptag  set ivl <vid(0..4095)> <(1:En,0:Dis)>\n");
+		printf("sptag  set portBaseStag <vid(0..4095)> <(1:En,0:Dis)>\n");
+		printf("sptag  set stag <vid(0..4095)> <stag(0..4095)>\n");
+		printf("sptag  set egsTagCtlEn <vid(0..4095)> <(1:En,0:Dis)>\n");
+		printf("sptag  set egsTagCtlCon <vid(0..4095)> <(1:En,0:Dis)>\n");
+		printf("sptag  set egsTagCtl <vid(0..4095)> <port(0..6)> <ctlType(0:untag,2:tagged)>\n");
+		printf("sptag  set portActFrame <port(0..6)> <frameType(0:all,1:tagged,2:untagged)>\n");
+		printf("sptag  get portActFrame <port(0..6)>\n");
+		printf("sptag  set LeakyVlanEn <port(0..6)> <pktType(0:uc,1:mc,2:bc,3:ipmc)> <(1:En,0:Dis)>\n");
+		printf("sptag  get leakyVlanEn <port(0..6)>\n");
+		printf("sptag  set portVlanAttr <port(0..6)> <vlanAttr(0:user,1:stack,2:translation,3:transparent)>\n");
+		printf("sptag  get portVlanAttr <port(0..6)>\n");
+		printf("sptag  set igsPortETagAttr <port(0..6)> <egsTagAttr(0:disable,1:consistent,4:untagged,5:swap,6:tagged,7:stack)>\n");
+		printf("sptag  get igsPortETagAttr <port(0..6)>\n");
+		printf("sptag  set portEgsTagAttr <port(0..6)> <egsTagAttr(0:untagged,1:swap,2:tagged,3:stack)>\n");
+		printf("sptag  get portEgsTagAttr <port(0..6)>\n");
+		printf("sptag  set portOuterTPID <port(0..6)> <TPID(hex)>\n");
+		printf("sptag  get portOuterTPID <port(0..6)>\n");
+		printf("sptag  set pvid <port(0..6)> <vid(0..4095)>\n");
+		printf("sptag  get pvid <port(0..6)>\n");
+		printf("sptag  initiate <vid(0..4095)> <fid(0..7)> <bitmap(6:0)> <ivl(1:En,0:Dis)> <portbasestag(1:En,0:Dis)> <stag(0..4095)> <egstagctlen(1:En,0:Dis)> <egstagcon(1:En,0:Dis)> <taggedbitmap(6:0)>\n");
+		printf("sptag  create <vid(0..4095)>\n");
+		printf("sptag  destroy [ <vid(0..4095)> | <vidRange(vid0-vid1)> ]\n");
+		printf("sptag  destroyAll [ <restoreDefVlan(0:false,1:true)> | ]\n");
+		printf("sptag  dump [ <vid(0..4095)> | <vidRange(vid0-vid1)> | ]\n");
+		printf("sptag  addPortMem <vid(0..4095)> <port(0..6)>\n");
+		printf("sptag  addPortMem <vid(0..4095)> <port(0..6)>\n");
+		printf("\n");
+		printf("Layer2 commands=============================================================================================================================>>>>\n");
+		printf("l2 dump mac\n");
+		printf("l2 add mac <static(0:dynamic,1:static)> <unauth(0:auth,1:unauth)> <mac(12'hex)> <portlist(uintlist)> [ vid <vid(0..4095)> | fid <fid(0..15)> ] <src_mac_forward=(0:default,1:cpu-exclude,2:cpu-include,3:cpu-only,4:drop)>\n");
+		printf("l2 del mac <mac(12'hex)> [ vid <vid(0..4095)> | fid <fid(0..15)> ]\n");
+		printf("l2 get mac <mac(12'hex)> [ vid <vid(0..4095)> | fid <fid(0..15)> ]\n");
+		printf("l2 clear mac\n");
+		printf("l2 set macAddrAgeOut <time(1, 1000000)>\n");
+		printf("l2 get macAddrAgeOut\n");
+		printf("\n");
+		printf("Link Aggregation commands===================================================================================================================>>>>\n");
+		printf("lag set member <group_id(0 or 1)> <member_index(0..3)> <enable(0,1)> <port index(0..6)>\n");
+		printf("lag get member group_id(0 or 1)\n");
+		printf("lag set dstInfo <sp(1:En,0:Dis)> <sa(1:En,0:Dis)> <da(1:En,0:Dis)> <sip(1:En,0:Dis)> <dip(1:En,0:Dis)> <sport(1:En,0:Dis)> <dport(1:En,0:Dis)>\n");
+		printf("lag get dstInfo\n");
+		printf("lag set ptseed <hex32>\n");
+		printf("lag get ptseed\n");
+		printf("lag set hashtype <0-crc32lsb;1-crc32msb;2-crc16;3-xor4>\n");
+		printf("lag get hashtype\n");
+		printf("lag set state <state(1:En,0:Dis)>\n");
+		printf("lag get state\n");
+		printf("lag set spsel <soure port enable(1:En,0:Dis)>\n");
+		printf("lag get spsel\n");
+		printf("\n");
+		printf("STP commands================================================================================================================================>>>>\n");
+		printf("stp set portstate <port(0..6)> <fid(0..15)> <state(0:disable,1:listen,2:learn,3:forward)>\n");
+		printf("stp get portstate <port(0..6)> <fid(0..15)>\n");
+		printf("\n");
+		printf("Mirror commands=============================================================================================================================>>>>\n");
+		printf("mirror set session <sid(0,1)> <dst_port(UINT)> <state(1:En,0:Dis)> <tag(1:on, 0:off)> <list(UINTLIST)> <dir(0:none,1:tx,2:rx,3:both)>\n");
+		printf("mirror set session-enable <sid(0,1)> <state(1:En,0:Dis)>\n");
+		printf("mirror add session-rlist <sid(0,1)> <list(UINTLIST)>\n");
+		printf("mirror add session-tlist <sid(0,1)> <list(UINTLIST)>\n");
+		printf("mirror get session <sid(0,1)>\n");
+		printf("mirror del session <sid(0,1)>\n");
+		printf("\n");
+		printf("MIB commands================================================================================================================================>>>>\n");
+		printf("mib get port <port(0..6)>\n");
+		printf("mib get acl <event(0..7)>\n");
+		printf("mib clear port <port(0..6)>\n");
+		printf("mib clear all\n");
+		printf("mib clear acl\n");
+		printf("\n");
+		printf("QoS commands================================================================================================================================>>>>\n");
+		printf("qos set scheduleAlgo <portlist(UINTLIST)> <queue(UINT)> <scheduler(0:SP,1:WRR,2:WFQ)> <weight(0..128)>, weight 0 is valid only on sp mode\n");
+		printf("qos get scheduleAlgo <portlist(UINTLIST)> <queue(UINT)>\n");
+		printf("qos set trustMode <portlist(UINTLIST)> <mode(0:port,1:1p-port,2:dscp-port,3:dscp-1p-port>\n");
+		printf("qos get trustMode <portlist(UINTLIST)>\n");
+		printf("qos set pri2Queue <priority(0..7)> <queue(0..7)>\n");
+		printf("qos get pri2Queue\n");
+		printf("qos set dscp2Pri <dscp(0..63)> <priority(0..7)>\n");
+		printf("qos get dscp2Pri <dscp(0..63)>\n");
+		printf("qos set rateLimitEnable <portlist(UINTLIST)> <dir(0:egress,1:ingress)> <rate_en(1:En,0:Dis)>\n");
+		printf("qos get rateLimitEnable <portlist(UINTLIST)>\n");
+		printf("qos set rateLimit <portlist(UINTLIST)> <I_CIR(0..80000)> <I_CBS(0..127)> <E_CIR(0..80000)> <E_CBS(0..127)>\n");
+		printf("qos get rateLimit <portlist(UINTLIST)>\n");
+		printf("qos set portPriority <portlist(UINTLIST)> <priority(0..7)>\n");
+		printf("qos get portPriority <portlist(UINTLIST)>\n");
+		printf("qos set rateLmtExMngFrm <dir(0:egress)> <en(0:include,1:exclude)>\n");
+		printf("qos get rateLmtExMngFrm\n");
+		printf("\n");
+		printf("Diag commands===============================================================================================================================>>>>\n");
+		printf("diag set txComply <phy(0..4)> <mode(0..8)>\n");
+		printf("diag get txComply <phy(0..4)>\n");
+		printf("\n");
+		printf("LED commands================================================================================================================================>>>>\n");
+		printf("led set mode <mode(0:disable, 1..3:2 LED, 4:user-define)>\n");
+		printf("led get mode\n");
+		printf("led set state <led(0..1)> <state(1:En,0:Dis)>\n");
+		printf("led get state <led(0..1)>\n");
+		printf("led set usr <led(0..1)> <polarity(0:low, 1:high)> <on_evt(7'bin)> <blink_evt(10'bin)>\n");
+		printf("led get usr <led(0..1)>\n");
+		printf("led set time <time(0..5:32ms~1024ms)>\n");
+		printf("led get time\n");
+		printf("\n");
+		printf("Security commands===========================================================================================================================>>>>\n");
+		printf("sec set stormEnable <port(0..6)> <type(0:bcst,1:mcst,2:ucst)> <en(1:En,0:Dis)>\n");
+		printf("sec get stormEnable <port(0..6)> <type(0:bcst,1:mcst,2:ucst)>\n");
+		printf("sec set stormRate <port(0..6)> <type(0:bcst,1:mcst,2:ucst)> <count(0..255)> <unit(0:64k,1:256k,2:1M,3:4M,4:16M)>\n");
+		printf("sec get stormRate <port(0..6)> <type(0:bcst,1:mcst,2:ucst)>\n");
+		printf("sec set fldMode <port(0..6)> <type(0:bcst,1:mcst,2:ucst,3:qury> <en(1:En,0:Dis)>\n");
+		printf("sec get fldMode <port(0..6)> <type(0:bcst,1:mcst,2:ucst,3:qury>\n");
+		printf("sec set saLearning <port(0..6)> <learn(0:disable,1:enable)>\n");
+		printf("sec get saLearning <port(0..6)>\n");
+		printf("sec set saLimit <port(0..6)> <mode(0:disable,1:enable)> <count(0..4095)>\n");
+		printf("sec get saLimit <port(0..6)>\n");
+		printf("\n");
+		printf("Switch commands=============================================================================================================================>>>>\n");
+		printf("switch set cpuPortEn <cpu_en(1:En,0:Dis)>\n");
+		printf("switch get cpuPortEn\n");
+		printf("switch set cpuPort <port_number>\n");
+		printf("switch get cpuPort\n");
+		printf("switch set phyLCIntrEn <phy(0..6)> <(1:En,0:Dis)>\n");
+		printf("switch get phyLCIntrEn <phy(0..6)>\n");
+		printf("switch set phyLCIntrSts <phy(0..6)> <(1:Clear)>\n");
+		printf("switch get phyLCIntrSts <phy(0..6)>\n");
+		printf("\n");
+		printf("ACL commands================================================================================================================================>>>>\n");
+		printf("acl set en <en(1:En,0:Dis)>\n");
+		printf("acl get en\n");
+		printf("acl set rule <idx(0..127)>\n <state(0:Dis,1:En)> <reverse(0:Dis,1:En)> <end(0:Dis,1:En)>\n <portmap(7'bin)><ipv6(0:Dis,1:En,2:Not care)>\n[ dmac <dmac(12'hex)> <dmac_mask(12'hex)> ]\n[ smac <smac(12'hex)> <smac_mask(12'hex)> ]\n[ stag <stag(4'hex)> <stag_mask(4'hex)> ]\n[ ctag <ctag(4'hex)> <ctag_mask(4'hex)> ]\n[ etype <etype(4'hex)> <etype_mask(4'hex)> ]\n[ dip <dip(IPADDR)> <dip_mask(IPADDR)> ]\n[ sip <sip(IPADDR)> <sip_mask(IPADDR)> ]\n[ dscp <dscp(2'hex)> <dscp_mask(2'hex)> ]\n[ protocol <protocol(12'hex)> <protocol_mask(12'hex)> ]\n[ dport <dport(4'hex)> <dport_mask(4'hex)> ]\n[ sport <sport(4'hex)> <sport_mask(4'hex)> ]\n[ flow_label <flow_label(4'hex)> <flow_label_mask(4'hex)> ]\n[ udf <udf(4'hex)> <udf_mask(4'hex)> ] ");
+		printf("acl get rule <idx(0..127)> ");
+		printf("acl del rule <idx(0..127)>\n");
+		printf("acl clear rule\n");
+		printf("acl set udfRule <idx(0..15)> <mode(0:pattern, 1:threshold)> [ <pat(4'hex)> <mask(4'hex)> | <low(4'hex)> <high(4'hex)> ] <start(0:MAC header, 1:L2 payload, 2:IPv4 header, 3:IPv6 header, 4:L3 payload, 5:TCP header, 6:UDP header, 7: L4 payload)> <offset(0..127,unit:2 bytes)> <portmap(7'bin)>\n");
+		printf("acl get udfRule <idx(0..15)>\n");
+		printf("acl del udfRule <idx(0..15)>\n");
+		printf("acl clear udfRule\n");
+		printf("acl set action <idx(0..127)>\n[ forward <forward(0:Default,4:Exclude CPU,5:Include CPU,6:CPU only,7:Drop)> ]\n[ egtag <egtag(0:Default,1:Consistent,4:Untag,5:Swap,6:Tag,7:Stack)> ]\n[ mirrormap <mirrormap(2'bin)> ]\n[ priority <priority(0..7)> ]\n[ redirect <redirect(0:Dst,1:Vlan)> <portmap(7'bin)> ]\n[ leaky_vlan <leaky_vlan(1:En,0:Dis)> ]\n[ cnt_idx <cnt_idx(0..63)> ]\n[ rate_idx <rate_idx(0..31)> ]\n[ attack_idx <attack_idx(0..95)> ]\n[ vid <vid(0..4095)> ]\n[ manage <manage(1:En,0:Dis)> ]\n[ bpdu <bpdu(1:En,0:Dis)> ]\n[ class <class(0:Original,1:Defined)>[0..7] ]\n[ drop_pcd <drop_pcd(0:Original,1:Defined)> [red <red(0..7)>][yellow <yellow(0..7)>][green <green(0..7)>] ]\n[ color <color(0:Defined,1:Trtcm)> [ <defined_color(0:Dis,1:Green,2:Yellow,3:Red)> | <trtcm_idx(0..31)> ] ]");
+		printf("acl get action <idx(0..127)>\n");
+		printf("acl del action <idx(0..127)>\n");
+		printf("acl clear action\n");
+		printf("acl set trtcm <idx(1..31)> <cir(4'hex)> <pir(4'hex)> <cbs(4'hex)> <pbs(4'hex)>\n");
+		printf("acl get trtcm <idx(1..31)>\n");
+		printf("acl del trtcm <idx(0..31)>\n");
+		printf("acl clear trtcm\n");
+		printf("acl set trtcmEn <en(1:En,0:Dis)>\n");
+		printf("acl get trtcmEn\n");
+		printf("acl set portEn <port(0..6)> <en(1:En,0:Dis)>\n");
+		printf("acl get portEn <port(0..6)>\n");
+		printf("acl set dropEn <port(0..6)> <en(1:En,0:Dis)>\n");
+		printf("acl get dropEn <port(0..6)>\n");
+		printf("acl set dropThrsh <port(0..6)> <color(0:green,1:yellow,2:red)> <queue(0..7)> <high(0..2047)> <low(0..2047)>\n");
+		printf("acl get dropThrsh <port(0..6)> <color(0:green,1:yellow,2:red)> <queue(0..7)>\n");
+		printf("acl set dropPbb <port(0..6)> <color(0:green,1:yellow,2:red)> <queue(0..7)> <probability(0..1023)>\n");
+		printf("acl get dropPbb <port(0..6)> <color(0:green,1:yellow,2:red)> <queue(0..7)>\n");
+		printf("acl set meter <idx(0..31)> <en(1:En,0:Dis)> <rate(0..65535)>\n Note: Limit rate = rate * 64Kbps");
+		printf("acl get meter <idx(0..31)>\n");
+		printf("\n");
+	}
 
 	exit_free();
 	exit(0);
@@ -227,7 +446,8 @@
 			for (i = 0; i < 16; i++) {
 				printf("0x%08x: ", off + 0x10 * i);
 				for (j = 0; j < 4; j++) {
-					reg_read(off + i * 0x10 + j * 0x4, &val);
+					reg_read(off + i * 0x10 + j * 0x4,
+						 &val);
 					printf(" 0x%08x", val);
 				}
 				printf("\n");
@@ -240,41 +460,48 @@
 
 static int get_chip_name()
 {
-	int temp;
+	int temp = 0, rc = 0;
 	FILE *fp = NULL;
 	char buff[255];
 
-	/*judge 7530*/
+	/*judge jaguar embedded switch */
+	fp = fopen("/proc/device-tree/compatible", "r");
+	if (fp != NULL) {
+		temp = -1;
+		if (fgets(buff, 255, (FILE *) fp) && strstr(buff, "mt7988"))
+			temp = 0x7988;
+
+		rc = fclose(fp);
+		if (rc == 0 && temp == 0x7988)
+			return temp;
+	}
+
+	/*judge 7530 */
 	reg_read((0x7ffc), &temp);
 	temp = temp >> 16;
 	if (temp == 0x7530)
 		return temp;
-	/*judge 7531*/
+
+	/*judge 7531 */
 	reg_read(0x781c, &temp);
 	temp = temp >> 16;
 	if (temp == 0x7531)
 		return temp;
 
-	/*judge jaguar embedded switch*/
-	fp = fopen("/proc/device-tree/compatible", "r");
-	if (fp != NULL) {
-		temp = -1;
-		if (fgets(buff, 255, (FILE *)fp) && strstr(buff, "mt7988"))
-			temp = 0x7988;
-
-		fclose(fp);
+	/*judge an8855 */
+	reg_read(0x10005000, &temp);
+	if (temp == 0x8855)
 		return temp;
-	}
 
 	return -1;
 }
 
 static int phy_operate(int argc, char *argv[])
 {
-	unsigned int port_num;
-	unsigned int dev_num;
-	unsigned int value, cl_value;
-	unsigned int reg;
+	unsigned int port_num = 0;
+	unsigned int dev_num = 0;
+	unsigned int value = 0, cl_value = 0;
+	unsigned int reg = 0;
 	int ret = 0, cl_ret = 0;
 	char op;
 
@@ -283,65 +510,125 @@
 
 	op = argv[3][0];
 
-	switch(op) {
-		case 'r':
-			reg = strtoul(argv[argc-1], NULL, 0);
-			if (argc == 6) {
-				port_num = strtoul(argv[argc-2], NULL, 0);
-				ret = mii_mgr_read(port_num, reg, &value);
-				if (ret < 0)
-					printf(" Phy read reg fail\n");
-				else
-					printf(" Phy read reg=0x%x, value=0x%x\n", reg, value);
-			} else if (argc == 7) {
-				dev_num = strtoul(argv[argc-2], NULL, 0);
-				port_num = strtoul(argv[argc-3], NULL, 0);
-				ret = mii_mgr_c45_read(port_num, dev_num, reg, &value);
-				if (ret < 0)
-					printf(" Phy read reg fail\n");
-				else
-					printf(" Phy read reg=0x%x, value=0x%x\n", reg, value);
-			} else
-				ret = phy_dump(32);
+	switch (op) {
+	case 'r':
+		reg = strtoul(argv[argc - 1], NULL, 16);
+		if (reg >= 0xFFFFFFFF) {
+			printf(" Phy read reg fail\n");
+			ret = -1;
 			break;
-		case 'w':
-			reg = strtoul(argv[argc-2], NULL, 0);
-			value = strtoul(argv[argc-1], NULL, 0);
-			if (argc == 7) {
-				port_num = strtoul(argv[argc-3], NULL, 0);
-				ret = mii_mgr_write(port_num, reg, value);
-				cl_ret = mii_mgr_read(port_num, reg, &cl_value);
-				if (cl_ret < 0)
-					printf(" Phy read reg fail\n");
-				else
-					printf(" Phy read reg=0x%x, value=0x%x\n", reg, cl_value);
+		}
+
+		if (argc == 6) {
+			port_num = strtoul(argv[argc - 2], NULL, 0);
+			if (port_num > MAX_PORT) {
+				printf(" Phy read reg fail\n");
+				ret = -1;
+				break;
 			}
-			else if (argc == 8) {
-				dev_num = strtoul(argv[argc-3], NULL, 0);
-				port_num = strtoul(argv[argc-4], NULL, 0);
-				ret = mii_mgr_c45_write(port_num, dev_num, reg, value);
-				cl_ret = mii_mgr_c45_read(port_num, dev_num, reg, &cl_value);
-				if (cl_ret < 0)
-					printf(" Phy read reg fail\n");
-				else
-					printf(" Phy read reg=0x%x, value=0x%x\n", reg, cl_value);
+
+			ret = mii_mgr_read(port_num, reg, &value);
+			if (ret < 0)
+				printf(" Phy read reg fail\n");
+			else
+				printf(" Phy read reg=0x%x, value=0x%x\n",
+				       reg, value);
+		} else if (argc == 7) {
+			dev_num = strtoul(argv[argc - 2], NULL, 16);
+			if (dev_num > 0xFFFFFFFF) {
+				printf(" Phy read reg fail\n");
+				ret = -1;
+				break;
 			}
+
+			port_num = strtoul(argv[argc - 3], NULL, 0);
+			if (port_num > MAX_PORT) {
+				printf(" Phy read reg fail\n");
+				ret = -1;
+				break;
+			}
+
+			ret = mii_mgr_c45_read(port_num, dev_num, reg,
+					       &value);
+			if (ret < 0)
+				printf(" Phy read reg fail\n");
 			else
-				usage(argv[0]);
+				printf(" Phy read dev_num=0x%x, reg=0x%x, value=0x%x\n",
+				       dev_num, reg, value);
+		} else
+			ret = phy_dump(32);
+		break;
+	case 'w':
+		reg = strtoul(argv[argc - 2], NULL, 16);
+		if (reg >= 0xFFFFFFFF) {
+			printf(" Phy write reg fail\n");
+			ret = -1;
 			break;
-		default:
+		}
+
+		value = strtoul(argv[argc - 1], NULL, 16);
+		if (value > 0xFFFF) {
+			printf(" Phy write reg fail\n");
+			ret = -1;
 			break;
+		}
+
+		if (argc == 7) {
+			port_num = strtoul(argv[argc - 3], NULL, 0);
+			if (port_num > MAX_PORT) {
+				printf(" Phy write reg fail\n");
+				ret = -1;
+				break;
+			}
+
+			ret = mii_mgr_write(port_num, reg, value);
+			cl_ret = mii_mgr_read(port_num, reg, &cl_value);
+			if (cl_ret < 0)
+				printf(" Phy write reg fail\n");
+			else
+				printf(" Phy write reg=0x%x, value=0x%x\n",
+				       reg, cl_value);
+		} else if (argc == 8) {
+			dev_num = strtoul(argv[argc - 3], NULL, 16);
+			if (dev_num > 0xFFFFFFFF) {
+				printf(" Phy write reg fail\n");
+				ret = -1;
+				break;
+			}
+
+			port_num = strtoul(argv[argc - 4], NULL, 0);
+			if (port_num > MAX_PORT) {
+				printf(" Phy write reg fail\n");
+				ret = -1;
+				break;
+			}
+
+			ret = mii_mgr_c45_write(port_num, dev_num, reg, value);
+			cl_ret = mii_mgr_c45_read(port_num, dev_num, reg,
+						  &cl_value);
+			if (cl_ret < 0)
+				printf(" Phy write reg fail\n");
+			else
+				printf(" Phy write dev_num=0x%x reg=0x%x, value=0x%x\n",
+				       dev_num, reg, cl_value);
+		}
+		break;
+	default:
+		break;
 	}
 
 	return ret;
 }
 
-
 int main(int argc, char *argv[])
 {
 	int err;
 
 	attres = (struct mt753x_attr *)malloc(sizeof(struct mt753x_attr));
+	if (attres == NULL) {
+		printf("Failed to allocate memory.\n");
+		exit(0);
+	}
 	attres->dev_id = -1;
 	attres->port_num = -1;
 	attres->phy_dev = -1;
@@ -357,30 +644,96 @@
 		if (!err)
 			chip_name = get_chip_name();
 	}
-	
+
+	if (err < 0) {
+		err = mt753x_netlink_init(AN8855_DSA_GENL_NAME);
+		if (!err)
+			chip_name = get_chip_name();
+	}
+
+	if (err < 0) {
+		err = mt753x_netlink_init(AN8855_GENL_NAME);
+		if (!err)
+			chip_name = get_chip_name();
+	}
+
 	if (err < 0) {
 		err = switch_ioctl_init();
 		if (!err) {
 			nl_init_flag = false;
 			chip_name = get_chip_name();
 			if (chip_name < 0) {
-				printf("no chip unsupport or chip id is invalid!\n");
+				printf
+				    ("no chip unsupport or chip id is invalid!\n");
 				exit_free();
 				exit(0);
 			}
 		}
 	}
+#ifndef COMPAT_MODE
+	if (chip_name == 0x8855) {
+		AIR_INIT_PARAM_T init_param = { 0 };
+
+		init_param.printf = printf;
+		init_param.malloc = malloc;
+		init_param.free = free;
+		init_param.udelay = usleep;
+		init_param.dev_access.read_callback = an8855_reg_read;
+		init_param.dev_access.write_callback = an8855_reg_write;
+		init_param.dev_access.phy_read_callback = an8855_phy_cl22_read;
+		init_param.dev_access.phy_write_callback =
+		    an8855_phy_cl22_write;
+		init_param.dev_access.phy_cl45_read_callback =
+		    an8855_phy_cl45_read;
+		init_param.dev_access.phy_cl45_write_callback =
+		    an8855_phy_cl45_write;
+
+		air_init(0, &init_param);
+		air_parse_cmd((argc - 1), &argv[1]);
+	}
 
+	exit_free();
+	return 0;
+#else
 	if (argc < 2)
 		usage(argv[0]);
 
+	if (chip_name == 0x8855) {
+		AIR_INIT_PARAM_T init_param = { 0 };
+
+		init_param.printf = printf;
+		init_param.malloc = malloc;
+		init_param.free = free;
+		init_param.udelay = usleep;
+		init_param.dev_access.read_callback = an8855_reg_read;
+		init_param.dev_access.write_callback = an8855_reg_write;
+		init_param.dev_access.phy_read_callback = an8855_phy_cl22_read;
+		init_param.dev_access.phy_write_callback =
+		    an8855_phy_cl22_write;
+		init_param.dev_access.phy_cl45_read_callback =
+		    an8855_phy_cl45_read;
+		init_param.dev_access.phy_cl45_write_callback =
+		    an8855_phy_cl45_write;
+		air_init(0, &init_param);
+
+		p_switch_func = &an8855_switch_func;
+	} else {
+		p_switch_func = &mt753x_switch_func;
+	}
+
+	if ((argc > 2) && !strcmp(argv[1], "an8855")
+	    && (chip_name == 0x8855)) {
+		air_parse_cmd((argc - 2), (const char **)&argv[2]);
+		exit_free();
+		return 0;
+	}
+
 	if (!strcmp(argv[1], "dev")) {
 		attres->dev_id = strtoul(argv[2], NULL, 0);
 		argv += 2;
 		argc -= 2;
 		if (argc < 2)
 			usage(argv[0]);
-
 	}
 
 	if (argc == 2) {
@@ -388,60 +741,69 @@
 			attres->type = MT753X_ATTR_TYPE_MESG;
 			mt753x_list_swdev(attres, MT753X_CMD_REQUEST);
 		} else if (!strncmp(argv[1], "dump", 5)) {
-			table_dump();
+			p_switch_func->pf_table_dump(argc, argv);
 		} else if (!strncmp(argv[1], "clear", 6)) {
-			table_clear();
+			p_switch_func->pf_table_clear(argc, argv);
 			printf("done.\n");
 		} else if (!strncmp(argv[1], "reset", 5)) {
-			switch_reset(argc, argv);
+			p_switch_func->pf_switch_reset(argc, argv);
 		} else if (!strncmp(argv[1], "phy", 4)) {
-			phy_dump(32); //dump all phy register
+			phy_dump(32);	//dump all phy register
 		} else if (!strncmp(argv[1], "sysctl", 7)) {
-			if (nl_init_flag)
-				printf("netlink(%s)\n",MT753X_GENL_NAME);
-			else
-				printf("ioctl(%s)\n",ETH_DEVNAME);
+			if (nl_init_flag) {
+				if (chip_name == 0x8855)
+					printf("netlink(%s)\n",
+					       AN8855_GENL_NAME);
+				else
+					printf("netlink(%s)\n",
+					       MT753X_GENL_NAME);
+			} else
+				printf("ioctl(%s)\n", ETH_DEVNAME);
+		} else if (!strncmp(argv[1], "ver", 4)) {
+			if (chip_name == 0x8855)
+				printf("Switch APP version: %s\r\n",
+				       SWITCH_APP_VERSION);
 		} else
 			usage(argv[0]);
 	} else if (!strncmp(argv[1], "arl", 4)) {
 		if (!strncmp(argv[2], "aging", 6))
-			doArlAging(argc, argv);
+			p_switch_func->pf_doArlAging(argc, argv);
 	} else if (!strncmp(argv[1], "esw_cnt", 8)) {
 		if (!strncmp(argv[2], "get", 4))
-			read_mib_counters();
+			p_switch_func->pf_read_mib_counters(argc, argv);
 		else if (!strncmp(argv[2], "clear", 6))
-			clear_mib_counters();
+			p_switch_func->pf_clear_mib_counters(argc, argv);
 		else
 			usage(argv[0]);
-	}else if (!strncmp(argv[1], "output_queue_cnt", 17)) {
+	} else if (!strncmp(argv[1], "output_queue_cnt", 17)) {
 		if (!strncmp(argv[2], "get", 4))
-			read_output_queue_counters();
+			p_switch_func->pf_read_output_queue_counters(argc,
+								     argv);
 		else
 			usage(argv[0]);
-	}else if (!strncmp(argv[1], "free_page", 10)) {
+	} else if (!strncmp(argv[1], "free_page", 10)) {
 		if (!strncmp(argv[2], "get", 4))
-			read_free_page_counters();
+			p_switch_func->pf_read_free_page_counters(argc, argv);
 		else
 			usage(argv[0]);
-	}
-	else if (!strncmp(argv[1], "ratectl", 8))
-		rate_control(argc, argv);
+	} else if (!strncmp(argv[1], "ratectl", 8))
+		p_switch_func->pf_rate_control(argc, argv);
 	else if (!strncmp(argv[1], "add", 4))
-		table_add(argc, argv);
+		p_switch_func->pf_table_add(argc, argv);
 	else if (!strncmp(argv[1], "filt", 5))
-		table_add(argc, argv);
+		p_switch_func->pf_table_add(argc, argv);
 	else if (!strncmp(argv[1], "del", 4)) {
 		if (!strncmp(argv[4], "fid", 4))
-			table_del_fid(argc, argv);
+			p_switch_func->pf_table_del_fid(argc, argv);
 		else if (!strncmp(argv[4], "vid", 4))
-			table_del_vid(argc, argv);
+			p_switch_func->pf_table_del_vid(argc, argv);
 		else
 			usage(argv[0]);
 	} else if (!strncmp(argv[1], "search", 7)) {
 		if (!strncmp(argv[4], "fid", 4))
-			table_search_mac_fid(argc, argv);
+			p_switch_func->pf_table_search_mac_fid(argc, argv);
 		else if (!strncmp(argv[4], "vid", 4))
-			table_search_mac_vid(argc, argv);
+			p_switch_func->pf_table_search_mac_vid(argc, argv);
 		else
 			usage(argv[0]);
 	} else if (!strncmp(argv[1], "phy", 4)) {
@@ -466,70 +828,70 @@
 		if (argc < 3)
 			usage(argv[0]);
 		if (!strncmp(argv[2], "fc", 3))
-			global_set_mac_fc(argc, argv);
+			p_switch_func->pf_global_set_mac_fc(argc, argv);
 		else if (!strncmp(argv[2], "pfc", 4))
-			set_mac_pfc(argc, argv);
+			p_switch_func->pf_set_mac_pfc(argc, argv);
 		else
 			usage(argv[0]);
 	} else if (!strncmp(argv[1], "qos", 4)) {
 		if (argc < 3)
 			usage(argv[0]);
 		if (!strncmp(argv[2], "sch", 4))
-			qos_sch_select(argc, argv);
+			p_switch_func->pf_qos_sch_select(argc, argv);
 		else if (!strncmp(argv[2], "base", 5))
-			qos_set_base(argc, argv);
+			p_switch_func->pf_qos_set_base(argc, argv);
 		else if (!strncmp(argv[2], "port-weight", 12))
-			qos_wfq_set_weight(argc, argv);
+			p_switch_func->pf_qos_wfq_set_weight(argc, argv);
 		else if (!strncmp(argv[2], "port-prio", 10))
-			qos_set_portpri(argc, argv);
+			p_switch_func->pf_qos_set_portpri(argc, argv);
 		else if (!strncmp(argv[2], "dscp-prio", 10))
-			qos_set_dscppri(argc, argv);
+			p_switch_func->pf_qos_set_dscppri(argc, argv);
 		else if (!strncmp(argv[2], "prio-qmap", 10))
-			qos_pri_mapping_queue(argc, argv);
+			p_switch_func->pf_qos_pri_mapping_queue(argc, argv);
 		else
 			usage(argv[0]);
 	} else if (!strncmp(argv[1], "stp", 3)) {
 		if (argc < 3)
 			usage(argv[0]);
 		else
-			doStp(argc, argv);
+			p_switch_func->pf_doStp(argc, argv);
 	} else if (!strncmp(argv[1], "sip", 5)) {
 		if (argc < 3)
 			usage(argv[0]);
 		if (!strncmp(argv[2], "dump", 5))
-			sip_dump();
+			p_switch_func->pf_sip_dump(argc, argv);
 		else if (!strncmp(argv[2], "add", 4))
-			sip_add(argc, argv);
+			p_switch_func->pf_sip_add(argc, argv);
 		else if (!strncmp(argv[2], "del", 4))
-			sip_del(argc, argv);
+			p_switch_func->pf_sip_del(argc, argv);
 		else if (!strncmp(argv[2], "clear", 6))
-			sip_clear();
+			p_switch_func->pf_sip_clear(argc, argv);
 		else
 			usage(argv[0]);
 	} else if (!strncmp(argv[1], "dip", 4)) {
 		if (argc < 3)
 			usage(argv[0]);
 		if (!strncmp(argv[2], "dump", 5))
-			dip_dump();
+			p_switch_func->pf_dip_dump(argc, argv);
 		else if (!strncmp(argv[2], "add", 4))
-			dip_add(argc, argv);
+			p_switch_func->pf_dip_add(argc, argv);
 		else if (!strncmp(argv[2], "del", 4))
-			dip_del(argc, argv);
+			p_switch_func->pf_dip_del(argc, argv);
 		else if (!strncmp(argv[2], "clear", 6))
-			dip_clear();
+			p_switch_func->pf_dip_clear(argc, argv);
 		else
 			usage(argv[0]);
 	} else if (!strncmp(argv[1], "mirror", 7)) {
 		if (argc < 3)
 			usage(argv[0]);
 		if (!strncmp(argv[2], "monitor", 8))
-			set_mirror_to(argc, argv);
+			p_switch_func->pf_set_mirror_to(argc, argv);
 		else if (!strncmp(argv[2], "target", 7))
-			set_mirror_from(argc, argv);
+			p_switch_func->pf_set_mirror_from(argc, argv);
 		else if (!strncmp(argv[2], "enable", 7))
-			doMirrorEn(argc, argv);
+			p_switch_func->pf_doMirrorEn(argc, argv);
 		else if (!strncmp(argv[2], "port-based", 11))
-			doMirrorPortBased(argc, argv);
+			p_switch_func->pf_doMirrorPortBased(argc, argv);
 		else
 			usage(argv[0]);
 	} else if (!strncmp(argv[1], "acl", 4)) {
@@ -537,152 +899,127 @@
 			usage(argv[0]);
 		if (!strncmp(argv[2], "dip", 4)) {
 			if (!strncmp(argv[3], "add", 4))
-				acl_dip_add(argc, argv);
+				p_switch_func->pf_acl_dip_add(argc, argv);
 			else if (!strncmp(argv[3], "modup", 6))
-				acl_dip_modify(argc, argv);
+				p_switch_func->pf_acl_dip_modify(argc, argv);
 			else if (!strncmp(argv[3], "pppoe", 6))
-				acl_dip_pppoe(argc, argv);
+				p_switch_func->pf_acl_dip_pppoe(argc, argv);
 			else if (!strncmp(argv[3], "trtcm", 4))
-				acl_dip_trtcm(argc, argv);
+				p_switch_func->pf_acl_dip_trtcm(argc, argv);
 			else if (!strncmp(argv[3], "meter", 6))
-				acl_dip_meter(argc, argv);
+				p_switch_func->pf_acl_dip_meter(argc, argv);
 			else
 				usage(argv[0]);
 		} else if (!strncmp(argv[2], "dmac", 6)) {
 			if (!strncmp(argv[3], "add", 4))
-				acl_mac_add(argc, argv);
+				p_switch_func->pf_acl_mac_add(argc, argv);
 			else
 				usage(argv[0]);
 		} else if (!strncmp(argv[2], "etype", 6)) {
 			if (!strncmp(argv[3], "add", 4))
-				acl_ethertype(argc, argv);
+				p_switch_func->pf_acl_ethertype(argc, argv);
 			else
 				usage(argv[0]);
 		} else if (!strncmp(argv[2], "port", 5)) {
 			if (!strncmp(argv[3], "add", 4))
-				acl_sp_add(argc, argv);
+				p_switch_func->pf_acl_sp_add(argc, argv);
 			else
 				usage(argv[0]);
 		} else if (!strncmp(argv[2], "L4", 5)) {
 			if (!strncmp(argv[3], "add", 4))
-				acl_l4_add(argc, argv);
+				p_switch_func->pf_acl_l4_add(argc, argv);
 			else
 				usage(argv[0]);
 		} else if (!strncmp(argv[2], "enable", 7))
-			acl_port_enable(argc, argv);
+			p_switch_func->pf_acl_port_enable(argc, argv);
 		else if (!strncmp(argv[2], "acltbl-add", 11))
-			acl_table_add(argc, argv);
+			p_switch_func->pf_acl_table_add(argc, argv);
 		else if (!strncmp(argv[2], "masktbl-add", 12))
-			acl_mask_table_add(argc, argv);
+			p_switch_func->pf_acl_mask_table_add(argc, argv);
 		else if (!strncmp(argv[2], "ruletbl-add", 12))
-			acl_rule_table_add(argc, argv);
+			p_switch_func->pf_acl_rule_table_add(argc, argv);
 		else if (!strncmp(argv[2], "ratetbl-add", 12))
-			acl_rate_table_add(argc, argv);
+			p_switch_func->pf_acl_rate_table_add(argc, argv);
 		else
 			usage(argv[0]);
 	} else if (!strncmp(argv[1], "vlan", 5)) {
 		if (argc < 3)
 			usage(argv[0]);
 		if (!strncmp(argv[2], "dump", 5))
-			vlan_dump(argc, argv);
+			p_switch_func->pf_vlan_dump(argc, argv);
 		else if (!strncmp(argv[2], "set", 4))
-			vlan_set(argc, argv);
+			p_switch_func->pf_vlan_set(argc, argv);
 		else if (!strncmp(argv[2], "clear", 6))
-			vlan_clear(argc, argv);
+			p_switch_func->pf_vlan_clear(argc, argv);
 		else if (!strncmp(argv[2], "vid", 4))
-			doVlanSetVid(argc, argv);
+			p_switch_func->pf_doVlanSetVid(argc, argv);
 		else if (!strncmp(argv[2], "pvid", 5))
-			doVlanSetPvid(argc, argv);
+			p_switch_func->pf_doVlanSetPvid(argc, argv);
 		else if (!strncmp(argv[2], "acc-frm", 8))
-			doVlanSetAccFrm(argc, argv);
+			p_switch_func->pf_doVlanSetAccFrm(argc, argv);
 		else if (!strncmp(argv[2], "port-attr", 10))
-			doVlanSetPortAttr(argc, argv);
+			p_switch_func->pf_doVlanSetPortAttr(argc, argv);
 		else if (!strncmp(argv[2], "port-mode", 10))
-			doVlanSetPortMode(argc, argv);
+			p_switch_func->pf_doVlanSetPortMode(argc, argv);
 		else if (!strncmp(argv[2], "eg-tag-pcr", 11))
-			doVlanSetEgressTagPCR(argc, argv);
+			p_switch_func->pf_doVlanSetEgressTagPCR(argc, argv);
 		else if (!strncmp(argv[2], "eg-tag-pvc", 11))
-			doVlanSetEgressTagPVC(argc, argv);
+			p_switch_func->pf_doVlanSetEgressTagPVC(argc, argv);
 		else
 			usage(argv[0]);
 	} else if (!strncmp(argv[1], "reg", 4)) {
 		parse_reg_cmd(argc, argv, 4);
 	} else if (!strncmp(argv[1], "ingress-rate", 6)) {
-		int port = 0, bw = 0;
-		if (argv[2][1] == 'n') {
-			port = strtoul(argv[3], NULL, 0);
-			bw = strtoul(argv[4], NULL, 0);
-			if (ingress_rate_set(1, port, bw) == 0)
-				printf("switch port=%d, bw=%d\n", port, bw);
-		}
-		else if (argv[2][1] == 'f') {
-			if (argc != 4)
-				usage(argv[0]);
-			port = strtoul(argv[3], NULL, 0);
-			if (ingress_rate_set(0, port, bw) == 0)
-				printf("switch port=%d ingress rate limit off\n", port);
-		} else
-			usage(argv[0]);
+		p_switch_func->pf_igress_rate_set(argc, argv);
 	} else if (!strncmp(argv[1], "egress-rate", 6)) {
-		int port = 0, bw = 0;
-		if (argv[2][1] == 'n') {
-			port = strtoul(argv[3], NULL, 0);
-			bw = strtoul(argv[4], NULL, 0);
-			if (egress_rate_set(1, port, bw) == 0)
-				printf("switch port=%d, bw=%d\n", port, bw);
-		} else if (argv[2][1] == 'f') {
-			if (argc != 4)
-				usage(argv[0]);
-			port = strtoul(argv[3], NULL, 0);
-			if (egress_rate_set(0, port, bw) == 0)
-				printf("switch port=%d egress rate limit off\n", port);
-		} else
-			usage(argv[0]);
+		p_switch_func->pf_egress_rate_set(argc, argv);
 	} else if (!strncmp(argv[1], "igmpsnoop", 10)) {
 		if (argc < 3)
 			usage(argv[0]);
 		if (!strncmp(argv[2], "on", 3))
-			igmp_on(argc, argv);
+			p_switch_func->pf_igmp_on(argc, argv);
 		else if (!strncmp(argv[2], "off", 4))
-			igmp_off();
+			p_switch_func->pf_igmp_off(argc, argv);
 		else if (!strncmp(argv[2], "enable", 7))
-			igmp_enable(argc, argv);
+			p_switch_func->pf_igmp_enable(argc, argv);
 		else if (!strncmp(argv[2], "disable", 8))
-			igmp_disable(argc, argv);
+			p_switch_func->pf_igmp_disable(argc, argv);
 		else
 			usage(argv[0]);
 	} else if (!strncmp(argv[1], "collision-pool", 15)) {
 		if (argc < 3)
 			usage(argv[0]);
 		if (!strncmp(argv[2], "enable", 7))
-			collision_pool_enable(argc, argv);
-		else if (!strncmp(argv[2], "mac", 4)){
+			p_switch_func->pf_collision_pool_enable(argc, argv);
+		else if (!strncmp(argv[2], "mac", 4)) {
 			if (!strncmp(argv[3], "dump", 5))
-				collision_pool_mac_dump();
+				p_switch_func->pf_collision_pool_mac_dump(argc,
+									  argv);
 			else
 				usage(argv[0]);
-		} else if (!strncmp(argv[2], "dip", 4)){
+		} else if (!strncmp(argv[2], "dip", 4)) {
 			if (!strncmp(argv[3], "dump", 5))
-				collision_pool_dip_dump();
+				p_switch_func->pf_collision_pool_dip_dump(argc,
+									  argv);
 			else
 				usage(argv[0]);
-		} else if (!strncmp(argv[2], "sip", 4)){
+		} else if (!strncmp(argv[2], "sip", 4)) {
 			if (!strncmp(argv[3], "dump", 5))
-				collision_pool_sip_dump();
+				p_switch_func->pf_collision_pool_sip_dump(argc,
+									  argv);
 			else
 				usage(argv[0]);
-			}
-		else
+		} else
 			usage(argv[0]);
-	}  else if (!strncmp(argv[1], "pfc", 15)) {
+	} else if (!strncmp(argv[1], "pfc", 15)) {
 		if (argc < 4 || argc > 5)
 			usage(argv[0]);
 		if (!strncmp(argv[2], "enable", 7))
-			set_mac_pfc(argc, argv);
-		else if (!strncmp(argv[2], "rx_counter", 11)){
-			pfc_get_rx_counter(argc, argv);
-		} else if (!strncmp(argv[2], "tx_counter", 11)){
-			pfc_get_tx_counter(argc, argv);
+			p_switch_func->pf_set_mac_pfc(argc, argv);
+		else if (!strncmp(argv[2], "rx_counter", 11)) {
+			p_switch_func->pf_pfc_get_rx_counter(argc, argv);
+		} else if (!strncmp(argv[2], "tx_counter", 11)) {
+			p_switch_func->pf_pfc_get_tx_counter(argc, argv);
 		} else
 			usage(argv[0]);
 	} else if (!strncmp(argv[1], "crossover", 10)) {
@@ -694,10 +1031,10 @@
 		if (argc < 3)
 			usage(argv[0]);
 		if (!strncmp(argv[2], "enable", 7) ||
-			 !strncmp(argv[2], "disable", 8))
-			eee_enable(argc, argv);
+		    !strncmp(argv[2], "disable", 8))
+			p_switch_func->pf_eee_enable(argc, argv);
 		else if (!strncmp(argv[2], "dump", 5))
-			eee_dump(argc, argv);
+			p_switch_func->pf_eee_dump(argc, argv);
 		else
 			usage(argv[0]);
 	} else
@@ -705,4 +1042,5 @@
 
 	exit_free();
 	return 0;
+#endif
 }
diff --git a/recipes-devtools/switch/files/src/switch_fun.c b/recipes-devtools/switch/files/src/switch_fun.c
index 8ee9675..9e9f4fe 100644
--- a/recipes-devtools/switch/files/src/switch_fun.c
+++ b/recipes-devtools/switch/files/src/switch_fun.c
@@ -19,6 +19,82 @@
 
 #define leaky_bucket 0
 
+struct switch_func_s mt753x_switch_func = {
+	.pf_table_dump = table_dump,
+	.pf_table_clear = table_clear,
+	.pf_switch_reset = switch_reset,
+	.pf_doArlAging = doArlAging,
+	.pf_read_mib_counters = read_mib_counters,
+	.pf_clear_mib_counters = clear_mib_counters,
+	.pf_read_output_queue_counters = read_output_queue_counters,
+	.pf_read_free_page_counters = read_free_page_counters,
+	.pf_rate_control = rate_control,
+	.pf_igress_rate_set = ingress_rate_set,
+	.pf_egress_rate_set = egress_rate_set,
+	.pf_table_add = table_add,
+	.pf_table_del_fid = table_del_fid,
+	.pf_table_del_vid = table_del_vid,
+	.pf_table_search_mac_fid = table_search_mac_fid,
+	.pf_table_search_mac_vid = table_search_mac_vid,
+	.pf_global_set_mac_fc = global_set_mac_fc,
+	.pf_set_mac_pfc = set_mac_pfc,
+	.pf_qos_sch_select = qos_sch_select,
+	.pf_qos_set_base = qos_set_base,
+	.pf_qos_wfq_set_weight = qos_wfq_set_weight,
+	.pf_qos_set_portpri = qos_set_portpri,
+	.pf_qos_set_dscppri = qos_set_dscppri,
+	.pf_qos_pri_mapping_queue = qos_pri_mapping_queue,
+	.pf_doStp = doStp,
+	.pf_sip_dump = sip_dump,
+	.pf_sip_add = sip_add,
+	.pf_sip_del = sip_del,
+	.pf_sip_clear = sip_clear,
+	.pf_dip_dump = dip_dump,
+	.pf_dip_add = dip_add,
+	.pf_dip_del = dip_del,
+	.pf_dip_clear = dip_clear,
+	.pf_set_mirror_to = set_mirror_to,
+	.pf_set_mirror_from = set_mirror_from,
+	.pf_doMirrorEn = doMirrorEn,
+	.pf_doMirrorPortBased = doMirrorPortBased,
+	.pf_acl_dip_add = acl_dip_add,
+	.pf_acl_dip_modify = acl_dip_modify,
+	.pf_acl_dip_pppoe = acl_dip_pppoe,
+	.pf_acl_dip_trtcm = acl_dip_trtcm,
+	.pf_acl_dip_meter = acl_dip_meter,
+	.pf_acl_mac_add = acl_mac_add,
+	.pf_acl_ethertype = acl_ethertype,
+	.pf_acl_sp_add = acl_sp_add,
+	.pf_acl_l4_add = acl_l4_add,
+	.pf_acl_port_enable = acl_port_enable,
+	.pf_acl_table_add = acl_table_add,
+	.pf_acl_mask_table_add = acl_mask_table_add,
+	.pf_acl_rule_table_add = acl_rule_table_add,
+	.pf_acl_rate_table_add = acl_rate_table_add,
+	.pf_vlan_dump = vlan_dump,
+	.pf_vlan_set = vlan_set,
+	.pf_vlan_clear = vlan_clear,
+	.pf_doVlanSetVid = doVlanSetVid,
+	.pf_doVlanSetPvid = doVlanSetPvid,
+	.pf_doVlanSetAccFrm = doVlanSetAccFrm,
+	.pf_doVlanSetPortAttr = doVlanSetPortAttr,
+	.pf_doVlanSetPortMode = doVlanSetPortMode,
+	.pf_doVlanSetEgressTagPCR = doVlanSetEgressTagPCR,
+	.pf_doVlanSetEgressTagPVC = doVlanSetEgressTagPVC,
+	.pf_igmp_on = igmp_on,
+	.pf_igmp_off = igmp_off,
+	.pf_igmp_enable = igmp_enable,
+	.pf_igmp_disable = igmp_disable,
+	.pf_collision_pool_enable = collision_pool_enable,
+	.pf_collision_pool_mac_dump = collision_pool_mac_dump,
+	.pf_collision_pool_dip_dump = collision_pool_dip_dump,
+	.pf_collision_pool_sip_dump = collision_pool_sip_dump,
+	.pf_pfc_get_rx_counter = pfc_get_rx_counter,
+	.pf_pfc_get_tx_counter = pfc_get_tx_counter,
+	.pf_eee_enable = eee_enable,
+	.pf_eee_dump = eee_dump,
+};
+
 static int getnext(char *src, int separator, char *dest)
 {
 	char *c;
@@ -66,7 +142,7 @@
 	c[1] = *(ptr + 1);
 	c[2] = *(ptr + 2);
 	c[3] = *(ptr + 3);
-	/*sprintf(str, "%d.%d.%d.%d", c[0], c[1], c[2], c[3]);*/
+	/*sprintf(str, "%d.%d.%d.%d", c[0], c[1], c[2], c[3]); */
 	sprintf(str, "%d.%d.%d.%d", c[3], c[2], c[1], c[0]);
 }
 
@@ -153,7 +229,8 @@
 	return 0;
 }
 
-int mii_mgr_c45_read(unsigned int port_num, unsigned int dev, unsigned int reg, unsigned int *value)
+int mii_mgr_c45_read(unsigned int port_num, unsigned int dev, unsigned int reg,
+		     unsigned int *value)
 {
 	int ret;
 
@@ -176,7 +253,8 @@
 	return 0;
 }
 
-int mii_mgr_c45_write(unsigned int port_num, unsigned int dev, unsigned int reg, unsigned int value)
+int mii_mgr_c45_write(unsigned int port_num, unsigned int dev, unsigned int reg,
+		      unsigned int value)
 {
 	int ret;
 
@@ -199,7 +277,6 @@
 	return 0;
 }
 
-
 int phy_dump(int phy_addr)
 {
 	int ret;
@@ -221,7 +298,7 @@
 void phy_crossover(int argc, char *argv[])
 {
 	unsigned int port_num = strtoul(argv[2], NULL, 10);
-	unsigned int value;
+	unsigned int value = 0;
 	int ret;
 
 	if (port_num > 4) {
@@ -230,9 +307,13 @@
 	}
 
 	if (nl_init_flag == true)
-		ret = phy_cl45_read_netlink(attres, port_num, 0x1E, MT7530_T10_TEST_CONTROL, &value);
+		ret =
+		    phy_cl45_read_netlink(attres, port_num, 0x1E,
+					  MT7530_T10_TEST_CONTROL, &value);
 	else
-		ret = mii_mgr_cl45_read_ioctl(port_num, 0x1E, MT7530_T10_TEST_CONTROL, &value);
+		ret =
+		    mii_mgr_cl45_read_ioctl(port_num, 0x1E,
+					    MT7530_T10_TEST_CONTROL, &value);
 	if (ret < 0) {
 		printf("phy_cl45 read fail\n");
 		exit_free();
@@ -240,10 +321,10 @@
 	}
 
 	printf("mii_mgr_cl45:");
-	printf("Read:  port#=%d, device=0x%x, reg=0x%x, value=0x%x\n", port_num, 0x1E, MT7530_T10_TEST_CONTROL, value);
+	printf("Read:  port#=%d, device=0x%x, reg=0x%x, value=0x%x\n", port_num,
+	       0x1E, MT7530_T10_TEST_CONTROL, value);
 
-	if (!strncmp(argv[3], "auto", 5))
-	{
+	if (!strncmp(argv[3], "auto", 5)) {
 		value &= (~(0x3 << 3));
 	} else if (!strncmp(argv[3], "mdi", 4)) {
 		value &= (~(0x3 << 3));
@@ -254,12 +335,17 @@
 		printf("invaild parameter\n");
 		return;
 	}
-	printf("Write: port#=%d, device=0x%x, reg=0x%x. value=0x%x\n", port_num, 0x1E, MT7530_T10_TEST_CONTROL, value);
+	printf("Write: port#=%d, device=0x%x, reg=0x%x. value=0x%x\n", port_num,
+	       0x1E, MT7530_T10_TEST_CONTROL, value);
 
 	if (nl_init_flag == true)
-		ret = phy_cl45_write_netlink(attres, port_num, 0x1E, MT7530_T10_TEST_CONTROL, value);
+		ret =
+		    phy_cl45_write_netlink(attres, port_num, 0x1E,
+					   MT7530_T10_TEST_CONTROL, value);
 	else
-		ret = mii_mgr_cl45_write_ioctl(port_num, 0x1E, MT7530_T10_TEST_CONTROL, value);
+		ret =
+		    mii_mgr_cl45_write_ioctl(port_num, 0x1E,
+					     MT7530_T10_TEST_CONTROL, value);
 
 	if (ret < 0) {
 		printf("phy_cl45 write fail\n");
@@ -282,7 +368,7 @@
 	if (argv[2][0] == 'r') {
 		if (argc != 7)
 			return -1;
-		mii_mgr_write(0, 0x1f, 0x52b5); // r31 = 0x52b5
+		mii_mgr_write(0, 0x1f, 0x52b5);	// r31 = 0x52b5
 		port_num = strtoul(argv[3], NULL, 0);
 		if (port_num > MAX_PORT) {
 			printf("Illegal port index and port:0~6\n");
@@ -291,16 +377,21 @@
 		ch_addr = strtoul(argv[4], NULL, 0);
 		node_addr = strtoul(argv[5], NULL, 0);
 		data_addr = strtoul(argv[6], NULL, 0);
-		printf("port = %x, ch_addr = %x, node_addr=%x, data_addr=%x\n", port_num, ch_addr, node_addr, data_addr);
-		tr_reg_control = (1 << 15) | (1 << 13) | (ch_addr << 11) | (node_addr << 7) | (data_addr << 1);
-		mii_mgr_write(port_num, 16, tr_reg_control); // r16 = tr_reg_control
+		printf("port = %x, ch_addr = %x, node_addr=%x, data_addr=%x\n",
+		       port_num, ch_addr, node_addr, data_addr);
+		tr_reg_control =
+		    (1 << 15) | (1 << 13) | (ch_addr << 11) | (node_addr << 7) |
+		    (data_addr << 1);
+		mii_mgr_write(port_num, 16, tr_reg_control);	// r16 = tr_reg_control
 		mii_mgr_read(port_num, 17, &val_l);
 		mii_mgr_read(port_num, 18, &val_h);
-		printf("switch trreg read tr_reg_control=%x, value_H=%x, value_L=%x\n", tr_reg_control, val_h, val_l);
+		printf
+		    ("switch trreg read tr_reg_control=%x, value_H=%x, value_L=%x\n",
+		     tr_reg_control, val_h, val_l);
 	} else if (argv[2][0] == 'w') {
 		if (argc != 9)
 			return -1;
-		mii_mgr_write(0, 0x1f, 0x52b5); // r31 = 0x52b5
+		mii_mgr_write(0, 0x1f, 0x52b5);	// r31 = 0x52b5
 		port_num = strtoul(argv[3], NULL, 0);
 		if (port_num > MAX_PORT) {
 			printf("\n**Illegal port index and port:0~6\n");
@@ -311,20 +402,26 @@
 		data_addr = strtoul(argv[6], NULL, 0);
 		val_h = strtoul(argv[7], NULL, 0);
 		val_l = strtoul(argv[8], NULL, 0);
-		printf("port = %x, ch_addr = %x, node_addr=%x, data_addr=%x\n", port_num, ch_addr, node_addr, data_addr);
-		tr_reg_control = (1 << 15) | (0 << 13) | (ch_addr << 11) | (node_addr << 7) | (data_addr << 1);
+		printf("port = %x, ch_addr = %x, node_addr=%x, data_addr=%x\n",
+		       port_num, ch_addr, node_addr, data_addr);
+		tr_reg_control =
+		    (1 << 15) | (0 << 13) | (ch_addr << 11) | (node_addr << 7) |
+		    (data_addr << 1);
 		mii_mgr_write(port_num, 17, val_l);
 		mii_mgr_write(port_num, 18, val_h);
-		mii_mgr_write(port_num, 16, tr_reg_control); // r16 = tr_reg_control
-		printf("switch trreg Write tr_reg_control=%x, value_H=%x, value_L=%x\n", tr_reg_control, val_h, val_l);
+		mii_mgr_write(port_num, 16, tr_reg_control);	// r16 = tr_reg_control
+		printf
+		    ("switch trreg Write tr_reg_control=%x, value_H=%x, value_L=%x\n",
+		     tr_reg_control, val_h, val_l);
 	} else
 		return -1;
 	return 0;
 }
 
-void write_acl_table(unsigned char tbl_idx, unsigned int vawd1, unsigned int vawd2)
+void write_acl_table(unsigned char tbl_idx, unsigned int vawd1,
+		     unsigned int vawd2)
 {
-	unsigned int value, reg;
+	unsigned int value = 0, reg = 0;
 	unsigned int max_index;
 
 	if (chip_name == 0x7531 || chip_name == 0x7988)
@@ -340,8 +437,7 @@
 	}
 
 	reg = REG_VTCR_ADDR;
-	while (1)
-	{ // wait until not busy
+	while (1) {		// wait until not busy
 		reg_read(reg, &value);
 		if ((value & REG_VTCR_BUSY_MASK) == 0) {
 			break;
@@ -356,8 +452,7 @@
 	reg_write(reg, value);
 	printf("write reg: %x, value: %x\n", reg, value);
 
-	while (1)
-	{ 	// wait until not busy
+	while (1) {		// wait until not busy
 		reg_read(reg, &value);
 		if ((value & REG_VTCR_BUSY_MASK) == 0)
 			break;
@@ -366,8 +461,8 @@
 
 void acl_table_add(int argc, char *argv[])
 {
-	unsigned int vawd1, vawd2;
-	unsigned char tbl_idx;
+	unsigned int vawd1 = 0, vawd2 = 0;
+	unsigned char tbl_idx = 0;
 
 	tbl_idx = atoi(argv[3]);
 	vawd1 = strtoul(argv[4], (char **)NULL, 16);
@@ -375,10 +470,11 @@
 	write_acl_table(tbl_idx, vawd1, vawd2);
 }
 
-void write_acl_mask_table(unsigned char tbl_idx, unsigned int vawd1, unsigned int vawd2)
+void write_acl_mask_table(unsigned char tbl_idx, unsigned int vawd1,
+			  unsigned int vawd2)
 {
-	unsigned int value, reg;
-	unsigned int max_index;
+	unsigned int value = 0, reg = 0;
+	unsigned int max_index = 0;
 
 	if (chip_name == 0x7531 || chip_name == 0x7988)
 		max_index = 128;
@@ -392,8 +488,7 @@
 		return;
 	}
 	reg = REG_VTCR_ADDR;
-	while (1)
-	{ // wait until not busy
+	while (1) {		// wait until not busy
 		reg_read(reg, &value);
 		if ((value & REG_VTCR_BUSY_MASK) == 0)
 			break;
@@ -406,8 +501,7 @@
 	value = REG_VTCR_BUSY_MASK | (0x09 << REG_VTCR_FUNC_OFFT) | tbl_idx;
 	reg_write(reg, value);
 	printf("write reg: %x, value: %x\n", reg, value);
-	while (1)
-	{ // wait until not busy
+	while (1) {		// wait until not busy
 		reg_read(reg, &value);
 		if ((value & REG_VTCR_BUSY_MASK) == 0)
 			break;
@@ -416,8 +510,8 @@
 
 void acl_mask_table_add(int argc, char *argv[])
 {
-	unsigned int vawd1, vawd2;
-	unsigned char tbl_idx;
+	unsigned int vawd1 = 0, vawd2 = 0;
+	unsigned char tbl_idx = 0;
 
 	tbl_idx = atoi(argv[3]);
 	vawd1 = strtoul(argv[4], (char **)NULL, 16);
@@ -425,10 +519,11 @@
 	write_acl_mask_table(tbl_idx, vawd1, vawd2);
 }
 
-void write_acl_rule_table(unsigned char tbl_idx, unsigned int vawd1, unsigned int vawd2)
+void write_acl_rule_table(unsigned char tbl_idx, unsigned int vawd1,
+			  unsigned int vawd2)
 {
-	unsigned int value, reg;
-	unsigned int max_index;
+	unsigned int value = 0, reg = 0;
+	unsigned int max_index = 0;
 
 	if (chip_name == 0x7531 || chip_name == 0x7988)
 		max_index = 128;
@@ -437,14 +532,13 @@
 
 	printf("Rule_control_tbl_idx:%d\n", tbl_idx);
 
-	if (tbl_idx >= max_index) { /*Check the input parameters is right or not.*/
+	if (tbl_idx >= max_index) {	/* Check the input parameters is right or not. */
 		printf(HELP_ACL_RULE_TBL_ADD);
 		return;
 	}
 	reg = REG_VTCR_ADDR;
 
-	while (1)
-	{ // wait until not busy
+	while (1) {		// wait until not busy
 		reg_read(reg, &value);
 		if ((value & REG_VTCR_BUSY_MASK) == 0) {
 			break;
@@ -459,8 +553,7 @@
 	reg_write(reg, value);
 	printf("write reg: %x, value: %x\n", reg, value);
 
-	while (1)
-	{ // wait until not busy
+	while (1) {		// wait until not busy
 		reg_read(reg, &value);
 		if ((value & REG_VTCR_BUSY_MASK) == 0) {
 			break;
@@ -470,8 +563,8 @@
 
 void acl_rule_table_add(int argc, char *argv[])
 {
-	unsigned int vawd1, vawd2;
-	unsigned char tbl_idx;
+	unsigned int vawd1 = 0, vawd2 = 0;
+	unsigned char tbl_idx = 0;
 
 	tbl_idx = atoi(argv[3]);
 	vawd1 = strtoul(argv[4], (char **)NULL, 16);
@@ -479,9 +572,10 @@
 	write_acl_rule_table(tbl_idx, vawd1, vawd2);
 }
 
-void write_rate_table(unsigned char tbl_idx, unsigned int vawd1, unsigned int vawd2)
+void write_rate_table(unsigned char tbl_idx, unsigned int vawd1,
+		      unsigned int vawd2)
 {
-	unsigned int value, reg;
+	unsigned int value = 0, reg = 0;
 	unsigned int max_index = 32;
 
 	printf("Rule_action_tbl_idx:%d\n", tbl_idx);
@@ -492,7 +586,7 @@
 	}
 
 	reg = REG_VTCR_ADDR;
-	while (1) { 	// wait until not busy
+	while (1) {		// wait until not busy
 		reg_read(reg, &value);
 		if ((value & REG_VTCR_BUSY_MASK) == 0)
 			break;
@@ -507,7 +601,7 @@
 	reg_write(reg, value);
 	printf("write reg: %x, value: %x\n", reg, value);
 
-	while (1) { // wait until not busy
+	while (1) {		// wait until not busy
 		reg_read(reg, &value);
 		if ((value & REG_VTCR_BUSY_MASK) == 0)
 			break;
@@ -516,8 +610,8 @@
 
 void acl_rate_table_add(int argc, char *argv[])
 {
-	unsigned int vawd1, vawd2;
-	unsigned char tbl_idx;
+	unsigned int vawd1 = 0, vawd2 = 0;
+	unsigned char tbl_idx = 0;
 
 	tbl_idx = atoi(argv[3]);
 	vawd1 = strtoul(argv[4], (char **)NULL, 16);
@@ -526,9 +620,10 @@
 	write_rate_table(tbl_idx, vawd1, vawd2);
 }
 
-void write_trTCM_table(unsigned char tbl_idx, unsigned int vawd1, unsigned int vawd2)
+void write_trTCM_table(unsigned char tbl_idx, unsigned int vawd1,
+		       unsigned int vawd2)
 {
-	unsigned int value, reg;
+	unsigned int value = 0, reg = 0;
 	unsigned int max_index = 32;
 
 	printf("trTCM_tbl_idx:%d\n", tbl_idx);
@@ -539,7 +634,7 @@
 	}
 
 	reg = REG_VTCR_ADDR;
-	while (1) { 	// wait until not busy
+	while (1) {		// wait until not busy
 		reg_read(reg, &value);
 		if ((value & REG_VTCR_BUSY_MASK) == 0)
 			break;
@@ -554,16 +649,17 @@
 	reg_write(reg, value);
 	printf("write reg: %x, value: %x\n", reg, value);
 
-	while (1) { // wait until not busy
+	while (1) {		// wait until not busy
 		reg_read(reg, &value);
 		if ((value & REG_VTCR_BUSY_MASK) == 0)
 			break;
 	}
 }
 
-int acl_parameters_pre_del(int len1, int len2, int argc, char *argv[], int *port)
+int acl_parameters_pre_del(int len1, int len2, int argc, char *argv[],
+			   int *port)
 {
-	int i;
+	int i = 0;
 
 	*port = 0;
 	if (argc < len1) {
@@ -571,10 +667,11 @@
 		return -1;
 	}
 
-	if (len2 == 12)
-	{
+	if (len2 == 12) {
 		if (!argv[4] || strlen(argv[4]) != len2) {
-			printf("The [%s] format error, should be of length %d\n",argv[4], len2);
+			printf
+			    ("The [%s] format error, should be of length %d\n",
+			     argv[4], len2);
 			return -1;
 		}
 	}
@@ -586,7 +683,8 @@
 
 	for (i = 0; i < 7; i++) {
 		if (argv[5][i] != '0' && argv[5][i] != '1') {
-			printf("portmap format error, should be of combination of 0 or 1\n");
+			printf
+			    ("portmap format error, should be of combination of 0 or 1\n");
 			return -1;
 		}
 		*port += (argv[5][i] - '0') * (1 << i);
@@ -594,31 +692,32 @@
 	return 0;
 }
 
-void acl_compare_pattern(int ports, int comparion, int base, int word, unsigned char table_index)
+void acl_compare_pattern(int ports, int comparion, int base, int word,
+			 unsigned char table_index)
 {
-	unsigned int value;
+	unsigned int value = 0;
 
-	comparion |= 0xffff0000; //compare mask
+	comparion |= 0xffff0000;	//compare mask
 
-	value = ports << 8; //w_port_map
-	value |= 0x1 << 19; //enable
-	value |= base << 16; //mac header
-	value |= word << 1;  //word offset
+	value = ports << 8;	//w_port_map
+	value |= 0x1 << 19;	//enable
+	value |= base << 16;	//mac header
+	value |= word << 1;	//word offset
 
 	write_acl_table(table_index, comparion, value);
 }
 
 void acl_mac_add(int argc, char *argv[])
 {
-	unsigned int value;
-	int ports;
+	unsigned int value = 0;
+	int ports = 0;
 	char tmpstr[5];
 	int ret;
 
 	ret = acl_parameters_pre_del(6, 12, argc, argv, &ports);
 	if (ret < 0)
 		return;
-	//set pattern
+	/* Set pattern */
 	strncpy(tmpstr, argv[4], 4);
 	tmpstr[4] = '\0';
 	value = strtoul(tmpstr, NULL, 16);
@@ -635,20 +734,20 @@
 	acl_compare_pattern(ports, value, 0x0, 2, 2);
 
 	//set mask
-	write_acl_mask_table(0,0x7,0);
+	write_acl_mask_table(0, 0x7, 0);
 
 	//set action
-	value = 0x7;      //drop
-	value |= 1 << 28; //acl intterupt enable
-	value |= 1 << 27; //acl hit count
-	value |= 2 << 24; //acl hit count group index (0~3)
-	write_acl_rule_table(0,value,0);
+	value = 0x7;		//drop
+	value |= 1 << 28;	//acl intterupt enable
+	value |= 1 << 27;	//acl hit count
+	value |= 2 << 24;	//acl hit count group index (0~3)
+	write_acl_rule_table(0, value, 0);
 }
 
 void acl_dip_meter(int argc, char *argv[])
 {
-	unsigned int value, ip_value, meter;
-	int ports;
+	unsigned int value = 0, ip_value = 0, meter = 0;
+	int ports = 0;
 	int ret;
 
 	ip_value = 0;
@@ -666,31 +765,31 @@
 	acl_compare_pattern(ports, value, 0x2, 0x9, 1);
 
 	//set mask
-	write_acl_mask_table(0,0x3,0);
+	write_acl_mask_table(0, 0x3, 0);
 
 	//set action
 	meter = strtoul(argv[6], NULL, 0);
 	if (((chip_name == 0x7530) && (meter > 1000000)) ||
-		((chip_name == 0x7531) && (meter > 2500000)) ||
-		((chip_name == 0x7988) && (meter > 4000000))) {
+	    ((chip_name == 0x7531) && (meter > 2500000)) ||
+	    ((chip_name == 0x7988) && (meter > 4000000))) {
 		printf("\n**Illegal meter input, and 7530: 0~1000000Kpbs, 7531: 0~2500000Kpbs, 7988: 0~4000000Kpbs**\n");
 		return;
 	}
 	if (((chip_name == 0x7531 || chip_name == 0x7988) && (meter > 1000000))) {
-		reg_read(0xc,&value);
+		reg_read(0xc, &value);
 		value |= 0x1 << 30;
-		reg_write(0xC,value);
-		printf("AGC: 0x%x\n",value);
-		value = meter / 1000; //uint is 1Mbps
+		reg_write(0xC, value);
+		printf("AGC: 0x%x\n", value);
+		value = meter / 1000;	//uint is 1Mbps
 	} else {
-		reg_read(0xc,&value);
+		reg_read(0xc, &value);
 		value &= ~(0x1 << 30);
-		reg_write(0xC,value);
-		printf("AGC: 0x%x\n",value);
-		value = meter >> 6; //uint is 64Kbps
+		reg_write(0xC, value);
+		printf("AGC: 0x%x\n", value);
+		value = meter >> 6;	//uint is 64Kbps
 	}
-	value |= 0x1 << 15; //enable rate control
-	printf("Acl rate control:0x%x\n",value);
+	value |= 0x1 << 15;	//enable rate control
+	printf("Acl rate control:0x%x\n", value);
 	write_rate_table(0, value, 0);
 }
 
@@ -721,30 +820,30 @@
 	PIR = strtoul(argv[8], NULL, 0);
 	PBS = strtoul(argv[9], NULL, 0);
 
-	if (CIR > 65535*64 || CBS > 65535 || PIR > 65535*64  || PBS > 65535) {
+	if (CIR > 65535 * 64 || CBS > 65535 || PIR > 65535 * 64 || PBS > 65535) {
 		printf("\n**Illegal input parameters**\n");
 		return;
 	}
 
-	value = CBS << 16; //bit16~31
-	value |= PBS;      //bit0~15
-			   //value |= 1;//valid
+	value = CBS << 16;	//bit16~31
+	value |= PBS;		//bit0~15
+	//value |= 1;//valid
 	CIR = CIR >> 6;
 	PIR = PIR >> 6;
 
-	value2 = CIR << 16; //bit16~31
-	value2 |= PIR;      //bit0~15
-	write_trTCM_table(0,value,value2);
+	value2 = CIR << 16;	//bit16~31
+	value2 |= PIR;		//bit0~15
+	write_trTCM_table(0, value, value2);
 
 	//set pattern
-	write_acl_mask_table(0,0x3,0);
+	write_acl_mask_table(0, 0x3, 0);
 
 	//set action
-	value = 0x1 << (11 + 1); //TrTCM green  meter#0 Low drop
-	value |= 0x2 << (8 + 1); //TrTCM yellow  meter#0 Med drop
-	value |= 0x3 << (5 + 1); //TrTCM red  meter#0    Hig drop
-	value |= 0x1 << 0;       //TrTCM drop pcd select
-	write_acl_rule_table(0,0,value);
+	value = 0x1 << (11 + 1);	//TrTCM green  meter#0 Low drop
+	value |= 0x2 << (8 + 1);	//TrTCM yellow  meter#0 Med drop
+	value |= 0x3 << (5 + 1);	//TrTCM red  meter#0    Hig drop
+	value |= 0x1 << 0;	//TrTCM drop pcd select
+	write_acl_rule_table(0, 0, value);
 }
 
 void acl_ethertype(int argc, char *argv[])
@@ -756,21 +855,21 @@
 	ret = acl_parameters_pre_del(6, -1, argc, argv, &ports);
 	if (ret < 0)
 		return;
-	printf("ports:0x%x\n",ports);
+	printf("ports:0x%x\n", ports);
 	ethertype = strtoul(argv[4], NULL, 16);
 	//set pattern
 	value = ethertype;
 	acl_compare_pattern(ports, value, 0x0, 0x6, 0);
 
 	//set pattern
-	write_acl_mask_table(0,0x1,0);
+	write_acl_mask_table(0, 0x1, 0);
 
 	//set action(drop)
-	value = 0x7;      //default. Nodrop
-	value |= 1 << 28; //acl intterupt enable
-	value |= 1 << 27; //acl hit count
+	value = 0x7;		//default. Nodrop
+	value |= 1 << 28;	//acl intterupt enable
+	value |= 1 << 27;	//acl hit count
 
-	write_acl_rule_table(0,value,0);
+	write_acl_rule_table(0, value, 0);
 }
 
 void acl_dip_modify(int argc, char *argv[])
@@ -801,14 +900,14 @@
 	acl_compare_pattern(ports, value, 0x2, 0x9, 1);
 
 	//set pattern
-	write_acl_mask_table(0,0x3,0);
+	write_acl_mask_table(0, 0x3, 0);
 
 	//set action
-	value = 0x0;      //default. Nodrop
-	value |= 1 << 28; //acl intterupt enable
-	value |= 1 << 27; //acl hit count
-	value |= priority << 4;  //acl UP
-	write_acl_rule_table(0,value,0);
+	value = 0x0;		//default. Nodrop
+	value |= 1 << 28;	//acl intterupt enable
+	value |= 1 << 27;	//acl hit count
+	value |= priority << 4;	//acl UP
+	write_acl_rule_table(0, value, 0);
 }
 
 void acl_dip_pppoe(int argc, char *argv[])
@@ -832,16 +931,16 @@
 	acl_compare_pattern(ports, value, 0x2, 0x9, 1);
 
 	//set pattern
-	write_acl_mask_table(0,0x3,0);
+	write_acl_mask_table(0, 0x3, 0);
 
 	//set action
-	value = 0x0;      //default. Nodrop
-	value |= 1 << 28; //acl intterupt enable
-	value |= 1 << 27; //acl hit count
-	value |= 1 << 20; //pppoe header remove
-	value |= 1 << 21; //SA MAC SWAP
-	value |= 1 << 22; //DA MAC SWAP
-	write_acl_rule_table(0,value,7);
+	value = 0x0;		//default. Nodrop
+	value |= 1 << 28;	//acl intterupt enable
+	value |= 1 << 27;	//acl hit count
+	value |= 1 << 20;	//pppoe header remove
+	value |= 1 << 21;	//SA MAC SWAP
+	value |= 1 << 22;	//DA MAC SWAP
+	write_acl_rule_table(0, value, 7);
 }
 
 void acl_dip_add(int argc, char *argv[])
@@ -865,20 +964,20 @@
 	acl_compare_pattern(ports, value, 0x2, 0x9, 1);
 
 	//set pattern
-	write_acl_mask_table(0,0x3,0);
+	write_acl_mask_table(0, 0x3, 0);
 
 	//set action
 	//value = 0x0; //default
-	value = 0x7;      //drop
-	value |= 1 << 28; //acl intterupt enable
-	value |= 1 << 27; //acl hit count
-	value |= 2 << 24; //acl hit count group index (0~3)
-	write_acl_rule_table(0,value,0);
+	value = 0x7;		//drop
+	value |= 1 << 28;	//acl intterupt enable
+	value |= 1 << 27;	//acl hit count
+	value |= 2 << 24;	//acl hit count group index (0~3)
+	write_acl_rule_table(0, value, 0);
 }
 
 void acl_l4_add(int argc, char *argv[])
 {
-	unsigned int value;
+	unsigned int value = 0;
 	int ports;
 	int ret;
 
@@ -891,16 +990,16 @@
 	acl_compare_pattern(ports, value, 0x5, 0x0, 0);
 
 	//set rue mask
-	write_acl_mask_table(0,0x1,0);
+	write_acl_mask_table(0, 0x1, 0);
 	//set action
-	value = 0x7; //drop
-		     //value |= 1;//valid
-	write_acl_rule_table(0,value,0);
+	value = 0x7;		//drop
+	//value |= 1;//valid
+	write_acl_rule_table(0, value, 0);
 }
 
 void acl_sp_add(int argc, char *argv[])
 {
-	unsigned int value;
+	unsigned int value = 0;
 	int ports;
 	int ret;
 
@@ -912,31 +1011,31 @@
 	acl_compare_pattern(ports, value, 0x4, 0x0, 0);
 
 	//set rue mask
-	write_acl_mask_table(0,0x1,0);
+	write_acl_mask_table(0, 0x1, 0);
 
 	//set action
-	value = 0x7; //drop
-		     //value |= 1;//valid
-	write_acl_rule_table(0,value,0);
+	value = 0x7;		//drop
+	//value |= 1;//valid
+	write_acl_rule_table(0, value, 0);
 }
 
 void acl_port_enable(int argc, char *argv[])
 {
-	unsigned int value, reg;
-	unsigned char acl_port, acl_en;
+	unsigned int value = 0, reg = 0;
+	unsigned char acl_port = 0, acl_en = 0;
 
 	acl_port = atoi(argv[3]);
 	acl_en = atoi(argv[4]);
 
 	printf("acl_port:%d, acl_en:%d\n", acl_port, acl_en);
 
-	/*Check the input parameters is right or not.*/
+	/*Check the input parameters is right or not. */
 	if ((acl_port > SWITCH_MAX_PORT) || (acl_en > 1)) {
 		printf(HELP_ACL_SETPORTEN);
 		return;
 	}
 
-	reg = REG_PCR_P0_ADDR + (0x100 * acl_port); // 0x2004[10]
+	reg = REG_PCR_P0_ADDR + (0x100 * acl_port);	// 0x2004[10]
 	reg_read(reg, &value);
 	value &= (~REG_PORT_ACL_EN_MASK);
 	value |= (acl_en << REG_PORT_ACL_EN_OFFT);
@@ -948,37 +1047,37 @@
 static void dip_dump_internal(int type)
 {
 	unsigned int i, j, value, mac, mac2, value2;
-	char tmpstr[16];
+	char tmpstr[16] = { 0 };
 	int table_size = 0;
 	int hit_value1 = 0;
 	int hit_value2 = 0;
 
-	if(type == GENERAL_TABLE) {
+	if (type == GENERAL_TABLE) {
 		table_size = 0x800;
-		reg_write(REG_ATC_ADDR, 0x8104); //dip search command
-		} else {
+		reg_write(REG_ATC_ADDR, 0x8104);	//dip search command
+	} else {
 		table_size = 0x40;
-		reg_write(REG_ATC_ADDR, 0x811c); //dip search command
+		reg_write(REG_ATC_ADDR, 0x811c);	//dip search command
 	}
-	printf("hash   port(0:6)   rsp_cnt  flag  timer    dip-address       ATRD\n");
+	printf
+	    ("hash   port(0:6)   rsp_cnt  flag  timer    dip-address       ATRD\n");
 	for (i = 0; i < table_size; i++) {
-		while (1)
-		{
+		while (1) {
 			reg_read(REG_ATC_ADDR, &value);
-			if(type == GENERAL_TABLE) {
+			if (type == GENERAL_TABLE) {
 				hit_value1 = value & (0x1 << 13);
 				hit_value2 = 1;
-			}else {
+			} else {
 				hit_value1 = value & (0x1 << 13);
 				hit_value2 = value & (0x1 << 28);
 			}
 
-			if (hit_value1 && hit_value2 ) { //search_rdy
+			if (hit_value1 && hit_value2) {	//search_rdy
 				reg_read(REG_ATRD_ADDR, &value2);
 				//printf("REG_ATRD_ADDR=0x%x\n\r",value2);
 
-				printf("%03x:   ", (value >> 16) & 0xfff); //hash_addr_lu
-				j = (value2 >> 4) & 0xff;		   //r_port_map
+				printf("%03x:   ", (value >> 16) & 0xfff);	//hash_addr_lu
+				j = (value2 >> 4) & 0xff;	//r_port_map
 				printf("%c", (j & 0x01) ? '1' : '-');
 				printf("%c", (j & 0x02) ? '1' : '-');
 				printf("%c", (j & 0x04) ? '1' : '-');
@@ -989,38 +1088,38 @@
 
 				reg_read(REG_TSRA2_ADDR, &mac2);
 
-				printf("     0x%4x", (mac2 & 0xffff));    //RESP_CNT
-				printf("  0x%2x", ((mac2 >> 16) & 0xff)); //RESP_FLAG
-				printf("  %3d", ((mac2 >> 24) & 0xff));   //RESP_TIMER
-									  //printf(" %4d", (value2 >> 24) & 0xff); //r_age_field
+				printf("     0x%4x", (mac2 & 0xffff));	//RESP_CNT
+				printf("  0x%2x", ((mac2 >> 16) & 0xff));	//RESP_FLAG
+				printf("  %3d", ((mac2 >> 24) & 0xff));	//RESP_TIMER
+				//printf(" %4d", (value2 >> 24) & 0xff); //r_age_field
 				reg_read(REG_TSRA1_ADDR, &mac);
 				ip_to_str(tmpstr, mac);
 				printf("     %s", tmpstr);
-				printf("  0x%8x\n", value2); //ATRD
-							     //printf("%04x", ((mac2 >> 16) & 0xffff));
-							     //printf("     %c\n", (((value2 >> 20) & 0x03)== 0x03)? 'y':'-');
+				printf("  0x%8x\n", value2);	//ATRD
+				//printf("%04x", ((mac2 >> 16) & 0xffff));
+				//printf("     %c\n", (((value2 >> 20) & 0x03)== 0x03)? 'y':'-');
 				if (value & 0x4000) {
 					printf("end of table %d\n", i);
 					return;
 				}
 				break;
-			}
-			else if (value & 0x4000) { //at_table_end
-				printf("found the last entry %d (not ready)\n", i);
+			} else if (value & 0x4000) {	//at_table_end
+				printf("found the last entry %d (not ready)\n",
+				       i);
 				return;
 			}
 			usleep(5000);
 		}
 
-		if(type == GENERAL_TABLE)
-			reg_write(REG_ATC_ADDR, 0x8105); //search for next dip address
+		if (type == GENERAL_TABLE)
+			reg_write(REG_ATC_ADDR, 0x8105);	//search for next dip address
 		else
-			reg_write(REG_ATC_ADDR, 0x811d); //search for next dip address
+			reg_write(REG_ATC_ADDR, 0x811d);	//search for next dip address
 		usleep(5000);
 	}
 }
 
-void dip_dump(void)
+void dip_dump(int argc, char *argv[])
 {
 	dip_dump_internal(GENERAL_TABLE);
 
@@ -1029,7 +1128,7 @@
 void dip_add(int argc, char *argv[])
 {
 	unsigned int value = 0;
-	unsigned int i, j;
+	unsigned int i = 0, j = 0;
 
 	value = 0;
 
@@ -1049,13 +1148,14 @@
 	j = 0;
 	for (i = 0; i < 7; i++) {
 		if (argv[4][i] != '0' && argv[4][i] != '1') {
-			printf("portmap format error, should be of combination of 0 or 1\n");
+			printf
+			    ("portmap format error, should be of combination of 0 or 1\n");
 			return;
 		}
 		j += (argv[4][i] - '0') * (1 << i);
 	}
-	value = j << 4;      //w_port_map
-	value |= (0x3 << 2); //static
+	value = j << 4;		//w_port_map
+	value |= (0x3 << 2);	//static
 
 	reg_write(REG_ATWD_ADDR, value);
 
@@ -1063,14 +1163,14 @@
 	reg_read(REG_ATWD_ADDR, &value);
 	printf("REG_ATWD_ADDR is 0x%x\n\r", value);
 
-	value = 0x8011; //single w_dip_cmd
+	value = 0x8011;		//single w_dip_cmd
 	reg_write(REG_ATC_ADDR, value);
 
 	usleep(1000);
 
 	for (i = 0; i < 20; i++) {
 		reg_read(REG_ATC_ADDR, &value);
-		if ((value & 0x8000) == 0) { //mac address busy
+		if ((value & 0x8000) == 0) {	//mac address busy
 			printf("done.\n");
 			return;
 		}
@@ -1092,15 +1192,15 @@
 	value = 0;
 	reg_write(REG_ATA2_ADDR, value);
 
-	value = 0; //STATUS=0, delete dip
+	value = 0;		//STATUS=0, delete dip
 	reg_write(REG_ATWD_ADDR, value);
 
-	value = 0x8011; //w_dip_cmd
+	value = 0x8011;		//w_dip_cmd
 	reg_write(REG_ATC_ADDR, value);
 
 	for (i = 0; i < 20; i++) {
 		reg_read(REG_ATC_ADDR, &value);
-		if ((value & 0x8000) == 0) { //mac address busy
+		if ((value & 0x8000) == 0) {	//mac address busy
 			if (argv[1] != NULL)
 				printf("done.\n");
 			return;
@@ -1111,12 +1211,12 @@
 		printf("timeout.\n");
 }
 
-void dip_clear(void)
+void dip_clear(int argc, char *argv[])
 {
 
-	unsigned int value;
+	unsigned int value = 0;
 
-	reg_write(REG_ATC_ADDR, 0x8102); //clear all dip
+	reg_write(REG_ATC_ADDR, 0x8102);	//clear all dip
 	usleep(5000);
 	reg_read(REG_ATC_ADDR, &value);
 	printf("REG_ATC_ADDR is 0x%x\n\r", value);
@@ -1124,25 +1224,24 @@
 
 static void sip_dump_internal(int type)
 {
-	unsigned int i, j, value, mac, mac2, value2;
+	unsigned int i = 0, j = 0, value = 0, mac = 0, mac2 = 0, value2 = 0;
 	int table_size = 0;
 	int hit_value1 = 0;
 	int hit_value2 = 0;
-	char tmpstr[16];
+	char tmpstr[16] = { 0 };
 
 	if (type == GENERAL_TABLE) {
 		table_size = 0x800;
-		reg_write(REG_ATC_ADDR, 0x8204); //sip search command
-		}else {
+		reg_write(REG_ATC_ADDR, 0x8204);	//sip search command
+	} else {
 		table_size = 0x40;
-		reg_write(REG_ATC_ADDR, 0x822c); //sip search command
+		reg_write(REG_ATC_ADDR, 0x822c);	//sip search command
 	}
 	printf("hash  port(0:6)   dip-address    sip-address      ATRD\n");
 	for (i = 0; i < table_size; i++) {
-		while (1)
-		{
+		while (1) {
 			reg_read(REG_ATC_ADDR, &value);
-			if(type == GENERAL_TABLE) {
+			if (type == GENERAL_TABLE) {
 				hit_value1 = value & (0x1 << 13);
 				hit_value2 = 1;
 			} else {
@@ -1150,12 +1249,12 @@
 				hit_value2 = value & (0x1 << 28);
 			}
 
-			if (hit_value1 && hit_value2) { //search_rdy
+			if (hit_value1 && hit_value2) {	//search_rdy
 				reg_read(REG_ATRD_ADDR, &value2);
 				//printf("REG_ATRD_ADDR=0x%x\n\r",value2);
 
-				printf("%03x:  ", (value >> 16) & 0xfff); //hash_addr_lu
-				j = (value2 >> 4) & 0xff;		  //r_port_map
+				printf("%03x:  ", (value >> 16) & 0xfff);	//hash_addr_lu
+				j = (value2 >> 4) & 0xff;	//r_port_map
 				printf("%c", (j & 0x01) ? '1' : '-');
 				printf("%c", (j & 0x02) ? '1' : '-');
 				printf("%c", (j & 0x04) ? '1' : '-');
@@ -1181,42 +1280,42 @@
 					return;
 				}
 				break;
-			} else if (value & 0x4000) { //at_table_end
-				printf("found the last entry %d (not ready)\n", i);
+			} else if (value & 0x4000) {	//at_table_end
+				printf("found the last entry %d (not ready)\n",
+				       i);
 				return;
 			}
 			usleep(5000);
 		}
 
-	if(type == GENERAL_TABLE)
-		reg_write(REG_ATC_ADDR, 0x8205); //search for next sip address
-	else
-		reg_write(REG_ATC_ADDR, 0x822d); //search for next sip address
-	usleep(5000);
+		if (type == GENERAL_TABLE)
+			reg_write(REG_ATC_ADDR, 0x8205);	//search for next sip address
+		else
+			reg_write(REG_ATC_ADDR, 0x822d);	//search for next sip address
+		usleep(5000);
 	}
 }
 
-void sip_dump(void)
+void sip_dump(int argc, char *argv[])
 {
 
 	sip_dump_internal(GENERAL_TABLE);
 
 }
 
-
 void sip_add(int argc, char *argv[])
 {
-	unsigned int i, j, value;
+	unsigned int i = 0, j = 0, value = 0;
 
 	value = 0;
-	str_to_ip(&value, argv[3]); //SIP
+	str_to_ip(&value, argv[3]);	//SIP
 
 	reg_write(REG_ATA2_ADDR, value);
 	printf("REG_ATA2_ADDR is 0x%x\n\r", value);
 
 	value = 0;
 
-	str_to_ip(&value, argv[4]); //DIP
+	str_to_ip(&value, argv[4]);	//DIP
 	reg_write(REG_ATA1_ADDR, value);
 	printf("REG_ATA1_ADDR is 0x%x\n\r", value);
 
@@ -1227,13 +1326,14 @@
 	j = 0;
 	for (i = 0; i < 7; i++) {
 		if (argv[5][i] != '0' && argv[5][i] != '1') {
-			printf("portmap format error, should be of combination of 0 or 1\n");
+			printf
+			    ("portmap format error, should be of combination of 0 or 1\n");
 			return;
 		}
 		j += (argv[5][i] - '0') * (1 << i);
 	}
-	value = j << 4;      //w_port_map
-	value |= (0x3 << 2); //static
+	value = j << 4;		//w_port_map
+	value |= (0x3 << 2);	//static
 
 	reg_write(REG_ATWD_ADDR, value);
 
@@ -1241,14 +1341,14 @@
 	reg_read(REG_ATWD_ADDR, &value);
 	printf("REG_ATWD_ADDR is 0x%x\n\r", value);
 
-	value = 0x8021; //single w_sip_cmd
+	value = 0x8021;		//single w_sip_cmd
 	reg_write(REG_ATC_ADDR, value);
 
 	usleep(1000);
 
 	for (i = 0; i < 20; i++) {
 		reg_read(REG_ATC_ADDR, &value);
-		if ((value & 0x8000) == 0) { //mac address busy
+		if ((value & 0x8000) == 0) {	//mac address busy
 			printf("done.\n");
 			return;
 		}
@@ -1260,25 +1360,25 @@
 
 void sip_del(int argc, char *argv[])
 {
-	unsigned int i, value;
+	unsigned int i = 0, value = 0;
 
 	value = 0;
 	str_to_ip(&value, argv[3]);
 
-	reg_write(REG_ATA2_ADDR, value); //SIP
+	reg_write(REG_ATA2_ADDR, value);	//SIP
 
 	str_to_ip(&value, argv[4]);
-	reg_write(REG_ATA1_ADDR, value); //DIP
+	reg_write(REG_ATA1_ADDR, value);	//DIP
 
-	value = 0; //STATUS=0, delete sip
+	value = 0;		//STATUS=0, delete sip
 	reg_write(REG_ATWD_ADDR, value);
 
-	value = 0x8021; //w_sip_cmd
+	value = 0x8021;		//w_sip_cmd
 	reg_write(REG_ATC_ADDR, value);
 
 	for (i = 0; i < 20; i++) {
 		reg_read(REG_ATC_ADDR, &value);
-		if ((value & 0x8000) == 0) { //mac address busy
+		if ((value & 0x8000) == 0) {	//mac address busy
 			if (argv[1] != NULL)
 				printf("done.\n");
 			return;
@@ -1289,11 +1389,11 @@
 		printf("timeout.\n");
 }
 
-void sip_clear(void)
+void sip_clear(int argc, char *argv[])
 {
-	unsigned int value;
+	unsigned int value = 0;
 
-	reg_write(REG_ATC_ADDR, 0x8202); //clear all sip
+	reg_write(REG_ATC_ADDR, 0x8202);	//clear all sip
 	usleep(5000);
 	reg_read(REG_ATC_ADDR, &value);
 	printf("REG_ATC_ADDR is 0x%x\n\r", value);
@@ -1301,13 +1401,13 @@
 
 static void table_dump_internal(int type)
 {
-	unsigned int i, j, value, mac, mac2, value2;
+	unsigned int i = 0, j = 0, value = 0, mac = 0, mac2 = 0, value2 = 0;
 	int table_size = 0;
 	int table_end = 0;
 	int hit_value1 = 0;
 	int hit_value2 = 0;
 
-	if (type == GENERAL_TABLE){
+	if (type == GENERAL_TABLE) {
 		table_size = 0x800;
 		table_end = 0x7FF;
 		reg_write(REG_ATC_ADDR, 0x8004);
@@ -1316,13 +1416,13 @@
 		table_end = 0x3F;
 		reg_write(REG_ATC_ADDR, 0x800C);
 	}
-	printf("hash  port(0:6)   fid   vid  age(s)   mac-address     filter my_mac\n");
+	printf
+	    ("hash  port(0:6)   fid   vid  age(s)   mac-address     filter my_mac\n");
 	for (i = 0; i < table_size; i++) {
-		while (1)
-		{
+		while (1) {
 			reg_read(REG_ATC_ADDR, &value);
 			//printf("ATC =  0x%x\n", value);
-			if(type == GENERAL_TABLE) {
+			if (type == GENERAL_TABLE) {
 				hit_value1 = value & (0x1 << 13);
 				hit_value2 = 1;
 			} else {
@@ -1330,10 +1430,11 @@
 				hit_value2 = value & (0x1 << 28);
 			}
 
-			if (hit_value1 && hit_value2 && (((value >> 15) & 0x1) == 0)) {
+			if (hit_value1 && hit_value2
+			    && (((value >> 15) & 0x1) == 0)) {
 				printf("%03x:   ", (value >> 16) & 0xfff);
 				reg_read(REG_ATRD_ADDR, &value2);
-				j = (value2 >> 4) & 0xff; //r_port_map
+				j = (value2 >> 4) & 0xff;	//r_port_map
 				printf("%c", (j & 0x01) ? '1' : '-');
 				printf("%c", (j & 0x02) ? '1' : '-');
 				printf("%c", (j & 0x04) ? '1' : '-');
@@ -1345,49 +1446,52 @@
 
 				reg_read(REG_TSRA2_ADDR, &mac2);
 
-				printf("   %2d", (mac2 >> 12) & 0x7); //FID
+				printf("   %2d", (mac2 >> 12) & 0x7);	//FID
 				printf("  %4d", (mac2 & 0xfff));
 				if (((value2 >> 24) & 0xff) == 0xFF)
-					printf("   --- "); //r_age_field:static
+					printf("   --- ");	//r_age_field:static
 				else
-					printf(" %5d ", (((value2 >> 24) & 0xff)+1)*2); //r_age_field
+					printf(" %5d ", (((value2 >> 24) & 0xff) + 1) * 2);	//r_age_field
 				reg_read(REG_TSRA1_ADDR, &mac);
 				printf("  %08x", mac);
 				printf("%04x", ((mac2 >> 16) & 0xffff));
-				printf("     %c", (((value2 >> 20) & 0x03) == 0x03) ? 'y' : '-');
-				printf("     %c\n", (((value2 >> 23) & 0x01) == 0x01) ? 'y' : '-');
-				if ((value & 0x4000) && (((value >> 16) & 0xfff) == table_end)) {
+				printf("     %c",
+				       (((value2 >> 20) & 0x03) ==
+					0x03) ? 'y' : '-');
+				printf("     %c\n",
+				       (((value2 >> 23) & 0x01) ==
+					0x01) ? 'y' : '-');
+				if ((value & 0x4000)
+				    && (((value >> 16) & 0xfff) == table_end)) {
 					printf("end of table %d\n", i);
 					return;
 				}
 				break;
-			}
-			else if ((value & 0x4000) && (((value >> 15) & 0x1) == 0) && (((value >> 16) & 0xfff) == table_end)) { //at_table_end
-				printf("found the last entry %d (not ready)\n", i);
+			} else if ((value & 0x4000) && (((value >> 15) & 0x1) == 0) && (((value >> 16) & 0xfff) == table_end)) {	//at_table_end
+				printf("found the last entry %d (not ready)\n",
+				       i);
 				return;
-			}
-			else
+			} else
 				usleep(5);
 		}
 
-	if(type == GENERAL_TABLE)
-		reg_write(REG_ATC_ADDR, 0x8005);//search for next address
-	else
-		reg_write(REG_ATC_ADDR, 0x800d);//search for next address
+		if (type == GENERAL_TABLE)
+			reg_write(REG_ATC_ADDR, 0x8005);	//search for next address
+		else
+			reg_write(REG_ATC_ADDR, 0x800d);	//search for next address
 		usleep(5);
 	}
 }
 
-void table_dump(void)
+void table_dump(int argc, char *argv[])
 {
 	table_dump_internal(GENERAL_TABLE);
 
 }
 
-
 void table_add(int argc, char *argv[])
 {
-	unsigned int i, j, value, is_filter, is_mymac;
+	unsigned int i = 0, j = 0, value = 0, is_filter = 0, is_mymac = 0;
 	char tmpstr[9];
 
 	is_filter = (argv[1][0] == 'f') ? 1 : 0;
@@ -1407,7 +1511,7 @@
 
 	value = strtoul(tmpstr, NULL, 16);
 	value = (value << 16);
-	value |= (1 << 15); //IVL=1
+	value |= (1 << 15);	//IVL=1
 
 	if (argc > 4) {
 		j = strtoul(argv[4], NULL, 0);
@@ -1415,7 +1519,7 @@
 			printf("wrong vid range, should be within 0~4095\n");
 			return;
 		}
-		value |= j; //vid
+		value |= j;	//vid
 	}
 
 	reg_write(REG_ATA2_ADDR, value);
@@ -1432,12 +1536,13 @@
 	j = 0;
 	for (i = 0; i < 7; i++) {
 		if (argv[3][i] != '0' && argv[3][i] != '1') {
-			printf("portmap format error, should be of combination of 0 or 1\n");
+			printf
+			    ("portmap format error, should be of combination of 0 or 1\n");
 			return;
 		}
 		j += (argv[3][i] - '0') * (1 << i);
 	}
-	value = j << 4; //w_port_map
+	value = j << 4;		//w_port_map
 
 	if (argc > 5) {
 		j = strtoul(argv[5], NULL, 0);
@@ -1445,11 +1550,11 @@
 			printf("wrong age range, should be within 1~255\n");
 			return;
 		}
-		value |= (j << 24);  //w_age_field
-		value |= (0x1 << 2); //dynamic
+		value |= (j << 24);	//w_age_field
+		value |= (0x1 << 2);	//dynamic
 	} else {
-		value |= (0xff << 24); //w_age_field
-		value |= (0x3 << 2);   //static
+		value |= (0xff << 24);	//w_age_field
+		value |= (0x3 << 2);	//static
 	}
 
 	if (argc > 6) {
@@ -1458,11 +1563,11 @@
 			printf("wrong eg-tag range, should be within 0~7\n");
 			return;
 		}
-		value |= (j << 13); //EG_TAG
+		value |= (j << 13);	//EG_TAG
 	}
 
 	if (is_filter)
-		value |= (7 << 20); //sa_filter
+		value |= (7 << 20);	//sa_filter
 
 	if (is_mymac)
 		value |= (1 << 23);
@@ -1473,14 +1578,14 @@
 	reg_read(REG_ATWD_ADDR, &value);
 	printf("REG_ATWD_ADDR is 0x%x\n\r", value);
 
-	value = 0x8001; //w_mac_cmd
+	value = 0x8001;		//w_mac_cmd
 	reg_write(REG_ATC_ADDR, value);
 
 	usleep(1000);
 
 	for (i = 0; i < 20; i++) {
 		reg_read(REG_ATC_ADDR, &value);
-		if ((value & 0x8000) == 0) { //mac address busy
+		if ((value & 0x8000) == 0) {	//mac address busy
 			printf("done.\n");
 			return;
 		}
@@ -1492,7 +1597,7 @@
 
 void table_search_mac_vid(int argc, char *argv[])
 {
-	unsigned int i, j, value, mac, mac2, value2;
+	unsigned int i = 0, j = 0, value = 0, mac = 0, mac2 = 0, value2 = 0;
 	char tmpstr[9];
 
 	if (!argv[3] || strlen(argv[3]) != 12) {
@@ -1510,26 +1615,26 @@
 
 	value = strtoul(tmpstr, NULL, 16);
 	value = (value << 16);
-	value |= (1 << 15); //IVL=1
+	value |= (1 << 15);	//IVL=1
 
 	j = strtoul(argv[5], NULL, 0);
 	if (4095 < j) {
 		printf("wrong vid range, should be within 0~4095\n");
 		return;
 	}
-	value |= j; //vid
+	value |= j;		//vid
 
 	reg_write(REG_ATA2_ADDR, value);
 	//printf("REG_ATA2_ADDR is 0x%x\n\r",value);
 
-	value = 0x8000; //w_mac_cmd
+	value = 0x8000;		//w_mac_cmd
 	reg_write(REG_ATC_ADDR, value);
 
 	usleep(1000);
 
 	for (i = 0; i < 20; i++) {
 		reg_read(REG_ATC_ADDR, &value);
-		if ((value & 0x8000) == 0) { //mac address busy
+		if ((value & 0x8000) == 0) {	//mac address busy
 			break;
 		}
 		usleep(1000);
@@ -1545,11 +1650,12 @@
 	}
 
 	printf("search done.\n");
-	printf("hash  port(0:6)   fid   vid  age   mac-address     filter my_mac\n");
+	printf
+	    ("hash  port(0:6)   fid   vid  age   mac-address     filter my_mac\n");
 
-	printf("%03x:   ", (value >> 16) & 0xfff); //hash_addr_lu
+	printf("%03x:   ", (value >> 16) & 0xfff);	//hash_addr_lu
 	reg_read(REG_ATRD_ADDR, &value2);
-	j = (value2 >> 4) & 0xff; //r_port_map
+	j = (value2 >> 4) & 0xff;	//r_port_map
 	printf("%c", (j & 0x01) ? '1' : '-');
 	printf("%c", (j & 0x02) ? '1' : '-');
 	printf("%c", (j & 0x04) ? '1' : '-');
@@ -1561,9 +1667,9 @@
 
 	reg_read(REG_TSRA2_ADDR, &mac2);
 
-	printf("   %2d", (mac2 >> 12) & 0x7); //FID
+	printf("   %2d", (mac2 >> 12) & 0x7);	//FID
 	printf("  %4d", (mac2 & 0xfff));
-	printf(" %4d", (value2 >> 24) & 0xff); //r_age_field
+	printf(" %4d", (value2 >> 24) & 0xff);	//r_age_field
 	reg_read(REG_TSRA1_ADDR, &mac);
 	printf("  %08x", mac);
 	printf("%04x", ((mac2 >> 16) & 0xffff));
@@ -1573,7 +1679,7 @@
 
 void table_search_mac_fid(int argc, char *argv[])
 {
-	unsigned int i, j, value, mac, mac2, value2;
+	unsigned int i = 0, j = 0, value = 0, mac = 0, mac2 = 0, value2 = 0;
 	char tmpstr[9];
 
 	if (!argv[3] || strlen(argv[3]) != 12) {
@@ -1591,26 +1697,26 @@
 
 	value = strtoul(tmpstr, NULL, 16);
 	value = (value << 16);
-	value &= ~(1 << 15); //IVL=0
+	value &= ~(1 << 15);	//IVL=0
 
 	j = strtoul(argv[5], NULL, 0);
 	if (7 < j) {
 		printf("wrong fid range, should be within 0~7\n");
 		return;
 	}
-	value |= (j << 12); //vid
+	value |= (j << 12);	//vid
 
 	reg_write(REG_ATA2_ADDR, value);
 	//printf("REG_ATA2_ADDR is 0x%x\n\r",value);
 
-	value = 0x8000; //w_mac_cmd
+	value = 0x8000;		//w_mac_cmd
 	reg_write(REG_ATC_ADDR, value);
 
 	usleep(1000);
 
 	for (i = 0; i < 20; i++) {
 		reg_read(REG_ATC_ADDR, &value);
-		if ((value & 0x8000) == 0) { //mac address busy
+		if ((value & 0x8000) == 0) {	//mac address busy
 			break;
 		}
 		usleep(1000);
@@ -1626,11 +1732,12 @@
 	}
 
 	printf("search done.\n");
-	printf("hash  port(0:6)   fid   vid  age   mac-address     filter my_mac\n");
+	printf
+	    ("hash  port(0:6)   fid   vid  age   mac-address     filter my_mac\n");
 
-	printf("%03x:   ", (value >> 16) & 0xfff); //hash_addr_lu
+	printf("%03x:   ", (value >> 16) & 0xfff);	//hash_addr_lu
 	reg_read(REG_ATRD_ADDR, &value2);
-	j = (value2 >> 4) & 0xff; //r_port_map
+	j = (value2 >> 4) & 0xff;	//r_port_map
 	printf("%c", (j & 0x01) ? '1' : '-');
 	printf("%c", (j & 0x02) ? '1' : '-');
 	printf("%c", (j & 0x04) ? '1' : '-');
@@ -1642,9 +1749,9 @@
 
 	reg_read(REG_TSRA2_ADDR, &mac2);
 
-	printf("   %2d", (mac2 >> 12) & 0x7); //FID
+	printf("   %2d", (mac2 >> 12) & 0x7);	//FID
 	printf("  %4d", (mac2 & 0xfff));
-	printf(" %4d", (value2 >> 24) & 0xff); //r_age_field
+	printf(" %4d", (value2 >> 24) & 0xff);	//r_age_field
 	reg_read(REG_TSRA1_ADDR, &mac);
 	printf("  %08x", mac);
 	printf("%04x", ((mac2 >> 16) & 0xffff));
@@ -1654,7 +1761,7 @@
 
 void table_del_fid(int argc, char *argv[])
 {
-	unsigned int i, j, value;
+	unsigned int i = 0, j = 0, value = 0;
 	char tmpstr[9];
 
 	if (!argv[3] || strlen(argv[3]) != 12) {
@@ -1676,20 +1783,20 @@
 			printf("wrong fid range, should be within 0~7\n");
 			return;
 		}
-		value |= (j << 12); //fid
+		value |= (j << 12);	/* fid */
 	}
 
 	reg_write(REG_ATA2_ADDR, value);
 
-	value = 0; //STATUS=0, delete mac
+	value = 0;		/* STATUS=0, delete mac */
 	reg_write(REG_ATWD_ADDR, value);
 
-	value = 0x8001; //w_mac_cmd
+	value = 0x8001;		//w_mac_cmd
 	reg_write(REG_ATC_ADDR, value);
 
 	for (i = 0; i < 20; i++) {
 		reg_read(REG_ATC_ADDR, &value);
-		if ((value & 0x8000) == 0) { //mac address busy
+		if ((value & 0x8000) == 0) {	/* mac address busy */
 			if (argv[1] != NULL)
 				printf("done.\n");
 			return;
@@ -1702,7 +1809,7 @@
 
 void table_del_vid(int argc, char *argv[])
 {
-	unsigned int i, j, value;
+	unsigned int i = 0, j = 0, value = 0;
 	char tmpstr[9];
 
 	if (!argv[3] || strlen(argv[3]) != 12) {
@@ -1724,19 +1831,19 @@
 		printf("wrong fid range, should be within 0~4095\n");
 		return;
 	}
-	value |= j; //vid
+	value |= j;		//vid
 	value |= 1 << 15;
 	reg_write(REG_ATA2_ADDR, value);
 
-	value = 0; //STATUS=0, delete mac
+	value = 0;		//STATUS=0, delete mac
 	reg_write(REG_ATWD_ADDR, value);
 
-	value = 0x8001; //w_mac_cmd
+	value = 0x8001;		//w_mac_cmd
 	reg_write(REG_ATC_ADDR, value);
 
 	for (i = 0; i < 20; i++) {
 		reg_read(REG_ATC_ADDR, &value);
-		if ((value & 0x8000) == 0) { //mac address busy
+		if ((value & 0x8000) == 0) {	//mac address busy
 			if (argv[1] != NULL)
 				printf("done.\n");
 			return;
@@ -1747,9 +1854,10 @@
 		printf("timeout.\n");
 }
 
-void table_clear(void)
+void table_clear(int argc, char *argv[])
 {
-	unsigned int value;
+	unsigned int value = 0;
+
 	reg_write(REG_ATC_ADDR, 0x8002);
 	usleep(5000);
 	reg_read(REG_ATC_ADDR, &value);
@@ -1759,8 +1867,8 @@
 
 void set_mirror_to(int argc, char *argv[])
 {
-	unsigned int value;
-	int idx;
+	unsigned int value = 0;
+	int idx = 0;
 
 	idx = strtoul(argv[3], NULL, 0);
 	if (idx < 0 || MAX_PORT < idx) {
@@ -1788,8 +1896,8 @@
 
 void set_mirror_from(int argc, char *argv[])
 {
-	unsigned int offset, value;
-	int idx, mirror;
+	unsigned int offset = 0, value = 0;
+	int idx = 0, mirror = 0;
 
 	idx = strtoul(argv[3], NULL, 0);
 	mirror = strtoul(argv[4], NULL, 0);
@@ -1815,7 +1923,7 @@
 
 void vlan_dump(int argc, char *argv[])
 {
-	unsigned int i, j, value, value2;
+	unsigned int i = 0, j = 0, value = 0, value2 = 0;
 	int eg_tag = 0;
 
 	if (argc == 4) {
@@ -1824,17 +1932,18 @@
 	}
 
 	if (eg_tag)
-		printf("  vid  fid  portmap    s-tag\teg_tag(0:untagged 2:tagged)\n");
+		printf
+		    ("  vid  fid  portmap    s-tag\teg_tag(0:untagged 2:tagged)\n");
 	else
 		printf("  vid  fid  portmap    s-tag\n");
 
 	for (i = 1; i < 4095; i++) {
-		value = (0x80000000 + i); //r_vid_cmd
+		value = (0x80000000 + i);	//r_vid_cmd
 		reg_write(REG_VTCR_ADDR, value);
 
 		for (j = 0; j < 20; j++) {
 			reg_read(REG_VTCR_ADDR, &value);
-			if ((value & 0x80000000) == 0) { //mac address busy
+			if ((value & 0x80000000) == 0) {	//mac address busy
 				break;
 			}
 			usleep(1000);
@@ -1881,7 +1990,7 @@
 			}
 			printf("\n");
 		} else {
-			/*print 16 vid for reference information*/
+			/*print 16 vid for reference information */
 			if (i <= 16) {
 				printf(" %4d  ", i);
 				printf(" %2d ", ((value & 0xe) >> 1));
@@ -1891,7 +2000,6 @@
 	}
 }
 
-
 static long timespec_diff_us(struct timespec start, struct timespec end)
 {
 	struct timespec temp;
@@ -1904,32 +2012,31 @@
 		temp.tv_sec = end.tv_sec - start.tv_sec;
 		temp.tv_nsec = end.tv_nsec - start.tv_nsec;
 	}
-	/* calculate second part*/
+	/* calculate second part */
 	duration += temp.tv_sec * 1000000;
-	/* calculate ns part*/
+	/* calculate ns part */
 	duration += temp.tv_nsec >> 10;
 
 	return duration;
 }
 
-
 void vlan_clear(int argc, char *argv[])
 {
-	unsigned int value;
-	int vid;
+	unsigned int value = 0;
+	int vid = 0;
 	unsigned long duration_us = 0;
 	struct timespec start, end;
 
 	for (vid = 0; vid < 4096; vid++) {
 		clock_gettime(CLOCK_REALTIME, &start);
-		value = 0; //invalid
+		value = 0;	//invalid
 		reg_write(REG_VAWD1_ADDR, value);
 
-		value = (0x80001000 + vid); //w_vid_cmd
+		value = (0x80001000 + vid);	//w_vid_cmd
 		reg_write(REG_VTCR_ADDR, value);
 		while (duration_us <= 1000) {
 			reg_read(REG_VTCR_ADDR, &value);
-			if ((value & 0x80000000) == 0) { //table busy
+			if ((value & 0x80000000) == 0) {	//table busy
 				break;
 			}
 			clock_gettime(CLOCK_REALTIME, &end);
@@ -1945,7 +2052,7 @@
 	unsigned int vlan_mem = 0;
 	unsigned int value = 0;
 	unsigned int value2 = 0;
-	int i, vid, fid;
+	int i = 0, vid = 0, fid = 0;
 	int stag = 0;
 	unsigned long eg_con = 0;
 	unsigned int eg_tag = 0;
@@ -1976,7 +2083,8 @@
 	vlan_mem = 0;
 	for (i = 0; i < 8; i++) {
 		if (argv[5][i] != '0' && argv[5][i] != '1') {
-			printf("portmap format error, should be of combination of 0 or 1\n");
+			printf
+			    ("portmap format error, should be of combination of 0 or 1\n");
 			return;
 		}
 		vlan_mem += (argv[5][i] - '0') * (1 << i);
@@ -1986,7 +2094,8 @@
 	if (argc > 6) {
 		stag = strtoul(argv[6], NULL, 16);
 		if (stag < 0 || 0xfff < stag) {
-			printf("wrong stag id range, should be within 0~4095\n");
+			printf
+			    ("wrong stag id range, should be within 0~4095\n");
 			return;
 		}
 		//printf("STAG is 0x%x\n", stag);
@@ -1994,33 +2103,35 @@
 
 	/* set vlan member */
 	value |= (vlan_mem << 16);
-	value |= (1 << 30);		//IVL=1
-	value |= ((stag & 0xfff) << 4); //stag
-	value |= 1;			//valid
+	value |= (1 << 30);	//IVL=1
+	value |= ((stag & 0xfff) << 4);	//stag
+	value |= 1;		//valid
 
 	if (argc > 7) {
 		eg_con = strtoul(argv[7], NULL, 2);
 		eg_con = !!eg_con;
-		value |= (eg_con << 29); //eg_con
-		value |= (1 << 28);      //eg tag control enable
+		value |= (eg_con << 29);	//eg_con
+		value |= (1 << 28);	//eg tag control enable
 	}
 
 	if (argc > 8 && !eg_con) {
 		if (strlen(argv[8]) != 8) {
-			printf("egtag portmap format error, should be of length 7\n");
+			printf
+			    ("egtag portmap format error, should be of length 7\n");
 			return;
 		}
 
 		for (i = 0; i < 8; i++) {
 			if (argv[8][i] < '0' || argv[8][i] > '3') {
-				printf("egtag portmap format error, should be of combination of 0 or 3\n");
+				printf
+				    ("egtag portmap format error, should be of combination of 0 or 3\n");
 				return;
 			}
 			//eg_tag += (argv[8][i] - '0') * (1 << i * 2);
 			eg_tag |= (argv[8][i] - '0') << (i * 2);
 		}
 
-		value |= (1 << 28);    //eg tag control enable
+		value |= (1 << 28);	//eg tag control enable
 		value2 &= ~(0xffff);
 		value2 |= eg_tag;
 	}
@@ -2028,14 +2139,14 @@
 	reg_write(REG_VAWD2_ADDR, value2);
 	//printf("VAWD1=0x%08x VAWD2=0x%08x ", value, value2);
 
-	value = (0x80001000 + vid); //w_vid_cmd
+	value = (0x80001000 + vid);	//w_vid_cmd
 	reg_write(REG_VTCR_ADDR, value);
 	//printf("VTCR=0x%08x\n", value);
 
 	for (i = 0; i < 300; i++) {
 		usleep(1000);
 		reg_read(REG_VTCR_ADDR, &value);
-		if ((value & 0x80000000) == 0) //table busy
+		if ((value & 0x80000000) == 0)	//table busy
 			break;
 	}
 
@@ -2047,7 +2158,7 @@
 {
 	unsigned int leaky_en = 0;
 	unsigned int wan_num = 4;
-	unsigned int port, offset, value;
+	unsigned int port = 0, offset = 0, value = 0;
 	char cmd[80];
 	int ret;
 
@@ -2074,8 +2185,7 @@
 			reg_write(0x2410, value & (~(1 << 3)));
 			reg_write(REG_ISC_ADDR, 0x01027d01);
 		}
-	}
-	else
+	} else
 		reg_write(REG_ISC_ADDR, 0x10027d60);
 
 	reg_write(0x1c, 0x08100810);
@@ -2086,15 +2196,15 @@
 	reg_write(0x2408, 0xb3ff);
 	reg_write(0x2608, 0xb3ff);
 	/* Enable Port ACL
-	* reg_write(0x2P04, 0xff0403);
-	*/
+	 * reg_write(0x2P04, 0xff0403);
+	 */
 	for (port = 0; port <= 6; port++) {
 		offset = 0x2004 + port * 0x100;
 		reg_read(offset, &value);
 		reg_write(offset, value | (1 << 10));
 	}
 
-	/*IGMP query only p4 -> p5*/
+	/*IGMP query only p4 -> p5 */
 	reg_write(0x94, 0x00ff0002);
 	if (wan_num == 4)
 		reg_write(0x98, 0x000a1008);
@@ -2114,7 +2224,7 @@
 	reg_write(0x98, 0x0);
 	reg_write(0x90, 0x8000b000);
 
-	/*IGMP p5 -> p4*/
+	/*IGMP p5 -> p4 */
 	reg_write(0x94, 0x00ff0002);
 	reg_write(0x98, 0x000a2008);
 	reg_write(0x90, 0x80005002);
@@ -2128,7 +2238,7 @@
 	reg_write(0x98, 0x0);
 	reg_write(0x90, 0x8000b001);
 
-	/*IGMP p0~p3 -> p6*/
+	/*IGMP p0~p3 -> p6 */
 	reg_write(0x94, 0x00ff0002);
 	if (wan_num == 4)
 		reg_write(0x98, 0x000a0f08);
@@ -2142,7 +2252,7 @@
 	reg_write(0x98, 0x0);
 	reg_write(0x90, 0x8000b002);
 
-	/*IGMP query only p6 -> p0~p3*/
+	/*IGMP query only p6 -> p0~p3 */
 	reg_write(0x94, 0x00ff0002);
 	reg_write(0x98, 0x000a4008);
 	reg_write(0x90, 0x80005004);
@@ -2159,18 +2269,21 @@
 	reg_write(0x98, 0x0);
 	reg_write(0x90, 0x8000b003);
 
-	/*Force eth2 to receive all igmp packets*/
-	snprintf(cmd, sizeof(cmd), "echo 2 > /sys/devices/virtual/net/%s/brif/%s/multicast_router", BR_DEVNAME, ETH_DEVNAME);
+	/*Force eth2 to receive all igmp packets */
+	snprintf(cmd, sizeof(cmd),
+		 "echo 2 > /sys/devices/virtual/net/%s/brif/%s/multicast_router",
+		 BR_DEVNAME, ETH_DEVNAME);
 	ret = system(cmd);
 	if (ret)
-		printf("Failed to set /sys/devices/virtual/net/%s/brif/%s/multicast_router\n",
-		       BR_DEVNAME, ETH_DEVNAME);
+		printf
+		    ("Failed to set /sys/devices/virtual/net/%s/brif/%s/multicast_router\n",
+		     BR_DEVNAME, ETH_DEVNAME);
 }
 
 void igmp_disable(int argc, char *argv[])
 {
-	unsigned int reg_offset, value;
-	int port_num;
+	unsigned int reg_offset = 0, value = 0;
+	int port_num = 0;
 
 	if (argc < 4) {
 		printf("insufficient arguments!\n");
@@ -2181,7 +2294,6 @@
 		printf("wrong port range, should be within 0~6\n");
 		return;
 	}
-
 	//set ISC: IGMP Snooping Control Register (offset: 0x0018)
 	reg_offset = 0x2008;
 	reg_offset |= (port_num << 8);
@@ -2192,7 +2304,7 @@
 
 void igmp_enable(int argc, char *argv[])
 {
-	unsigned int reg_offset, value;
+	unsigned int reg_offset = 0, value = 0;
 	int port_num;
 
 	if (argc < 4) {
@@ -2204,7 +2316,6 @@
 		printf("wrong port range, should be within 0~6\n");
 		return;
 	}
-
 	//set ISC: IGMP Snooping Control Register (offset: 0x0018)
 	reg_offset = 0x2008;
 	reg_offset |= (port_num << 8);
@@ -2212,15 +2323,15 @@
 	reg_write(reg_offset, value);
 }
 
-void igmp_off()
+void igmp_off(int argc, char *argv[])
 {
-	unsigned int value;
+	unsigned int value = 0;
 	//set ISC: IGMP Snooping Control Register (offset: 0x0018)
 	reg_read(REG_ISC_ADDR, &value);
-	value &= ~(1 << 18); //disable
+	value &= ~(1 << 18);	//disable
 	reg_write(REG_ISC_ADDR, value);
 
-	/*restore wan port multicast leaky vlan function: default disabled*/
+	/*restore wan port multicast leaky vlan function: default disabled */
 	reg_read(0x2010, &value);
 	reg_write(0x2010, value & (~(1 << 3)));
 	reg_read(0x2410, &value);
@@ -2229,10 +2340,10 @@
 	printf("config igmpsnoop off.\n");
 }
 
-int switch_reset(int argc, char *argv[])
+void switch_reset(int argc, char *argv[])
 {
 	if (chip_name == 0x7988)
-		return -1;
+		return;
 
 	unsigned int value = 0;
 	/*Software Register Reset  and Software System Reset */
@@ -2245,23 +2356,24 @@
 		printf("GPIO Mode (0x7c0c) select value =0x%x  \n", value);
 	}
 	printf("Switch Software Reset !!! \n");
-	return 0;
 }
 
-int phy_set_fc(int argc, char *argv[])
+void phy_set_fc(int argc, char *argv[])
 {
-	unsigned int port, pause_capable;
-	unsigned int phy_value;
+	unsigned int port = 0, pause_capable = 0;
+	unsigned int phy_value = 0;
 
 	port = atoi(argv[3]);
 	pause_capable = atoi(argv[4]);
 
-	/*Check the input parameters is right or not.*/
+	/*Check the input parameters is right or not. */
 	if (port > MAX_PORT - 2 || pause_capable > 1) {
-		printf("Illegal parameter (port:0~4, full_duplex_pause_capable:0|1)\n");
-		return -1;
+		printf
+		    ("Illegal parameter (port:0~4, full_duplex_pause_capable:0|1)\n");
+		return;
 	}
 	printf("port=%d, full_duplex_pause_capable:%d\n", port, pause_capable);
+
 	mii_mgr_read(port, 4, &phy_value);
 	printf("read phy_value:0x%x\r\n", phy_value);
 	phy_value &= (~(0x1 << 10));
@@ -2272,35 +2384,36 @@
 	}
 	mii_mgr_write(port, 4, phy_value);
 	printf("write phy_value:0x%x\r\n", phy_value);
-	return 0;
-} /*end phy_set_fc*/
+	return;
+}				/*end phy_set_fc */
 
-int phy_set_an(int argc, char *argv[])
+void phy_set_an(int argc, char *argv[])
 {
-	unsigned int port, auto_negotiation_en;
-	unsigned int phy_value;
+	unsigned int port = 0, auto_negotiation_en = 0;
+	unsigned int phy_value = 0;
 
 	port = atoi(argv[3]);
 	auto_negotiation_en = atoi(argv[4]);
 
-	/*Check the input parameters is right or not.*/
+	/*Check the input parameters is right or not. */
 	if (port > MAX_PORT - 2 || auto_negotiation_en > 1) {
-		printf("Illegal parameter (port:0~4, auto_negotiation_en:0|1)\n");
-		return -1;
+		printf
+		    ("Illegal parameter (port:0~4, auto_negotiation_en:0|1)\n");
+		return;
 	}
 	printf("port=%d, auto_negotiation_en:%d\n", port, auto_negotiation_en);
+
 	mii_mgr_read(port, 0, &phy_value);
 	printf("read phy_value:0x%x\r\n", phy_value);
 	phy_value &= (~(1 << 12));
 	phy_value |= (auto_negotiation_en << 12);
 	mii_mgr_write(port, 0, phy_value);
 	printf("write phy_value:0x%x\r\n", phy_value);
-	return 0;
-} /*end phy_set_an*/
+}				/*end phy_set_an */
 
-int set_mac_pfc(int argc, char *argv[])
+void set_mac_pfc(int argc, char *argv[])
 {
-	unsigned int value;
+	unsigned int value = 0;
 	int port, enable = 0;
 
 	port = atoi(argv[3]);
@@ -2308,7 +2421,7 @@
 	printf("enable: %d\n", enable);
 	if (port < 0 || port > 6 || enable < 0 || enable > 1) {
 		printf("Illegal parameter (port:0~6, enable|diable:0|1) \n");
-		return -1;
+		return;
 	}
 	if (chip_name == 0x7531 || chip_name == 0x7988) {
 		reg_read(REG_PFC_CTRL_ADDR, &value);
@@ -2316,25 +2429,23 @@
 		value |= (enable << port);
 		printf("write reg: %x, value: %x\n", REG_PFC_CTRL_ADDR, value);
 		reg_write(REG_PFC_CTRL_ADDR, value);
-	}
-	else
+	} else
 		printf("\nCommand not support by this chip.\n");
-	return 0;
 }
 
-int global_set_mac_fc(int argc, char *argv[])
+void global_set_mac_fc(int argc, char *argv[])
 {
 	unsigned char enable = 0;
-	unsigned int value, reg;
+	unsigned int value = 0, reg = 0;
 
 	if (chip_name == 0x7530) {
 		enable = atoi(argv[3]);
 		printf("enable: %d\n", enable);
 
-		/*Check the input parameters is right or not.*/
+		/*Check the input parameters is right or not. */
 		if (enable > 1) {
 			printf(HELP_MACCTL_FC);
-			return -1;
+			return;
 		}
 		reg_write(0x7000, 0x3);
 		reg = REG_GFCCR0_ADDR;
@@ -2345,17 +2456,16 @@
 		reg_write(REG_GFCCR0_ADDR, value);
 	} else
 		printf("\r\nCommand not support by this chip.\n");
-	return 0;
-} /*end mac_set_fc*/
+}				/*end mac_set_fc */
 
-int qos_sch_select(int argc, char *argv[])
+void qos_sch_select(int argc, char *argv[])
 {
-	unsigned char port, queue;
+	unsigned char port = 0, queue = 0;
 	unsigned char type = 0;
-	unsigned int value, reg;
+	unsigned int value = 0, reg = 0;
 
 	if (argc < 7)
-		return -1;
+		return;
 
 	port = atoi(argv[3]);
 	queue = atoi(argv[4]);
@@ -2363,26 +2473,26 @@
 
 	if (port > 6 || queue > 7) {
 		printf("\n Illegal input parameters\n");
-		return -1;
+		return;
 	}
 
 	if ((type != 0 && type != 1 && type != 2)) {
 		printf(HELP_QOS_TYPE);
-		return -1;
+		return;
 	}
 
-	printf("\r\nswitch qos type: %d.\n",type);
+	printf("\r\nswitch qos type: %d.\n", type);
 
 	if (!strncmp(argv[5], "min", 4)) {
 
 		if (type == 0) {
-			/*min sharper-->round roubin, disable min sharper rate limit*/
+			/*min sharper-->round roubin, disable min sharper rate limit */
 			reg = GSW_MMSCR0_Q(queue) + 0x100 * port;
 			reg_read(reg, &value);
 			value = 0x0;
 			reg_write(reg, value);
 		} else if (type == 1) {
-			/*min sharper-->sp, disable min sharper rate limit*/
+			/*min sharper-->sp, disable min sharper rate limit */
 			reg = GSW_MMSCR0_Q(queue) + 0x100 * port;
 			reg_read(reg, &value);
 			value = 0x0;
@@ -2390,75 +2500,72 @@
 			reg_write(reg, value);
 		} else {
 			printf("min sharper only support: rr or sp\n");
-			return -1;
+			return;
 		}
 	} else if (!strncmp(argv[5], "max", 4)) {
 		if (type == 1) {
-			/*max sharper-->sp, disable max sharper rate limit*/
+			/*max sharper-->sp, disable max sharper rate limit */
 			reg = GSW_MMSCR1_Q(queue) + 0x100 * port;
 			reg_read(reg, &value);
 			value = 0x0;
 			value |= (1 << 31);
 			reg_write(reg, value);
 		} else if (type == 2) {
-			/*max sharper-->wfq, disable max sharper rate limit*/
+			/*max sharper-->wfq, disable max sharper rate limit */
 			reg = GSW_MMSCR1_Q(queue) + 0x100 * port;
 			reg_read(reg, &value);
 			value = 0x0;
 			reg_write(reg, value);
 		} else {
 			printf("max sharper only support: wfq or sp\n");
-			return -1;
+			return;
 		}
 	} else {
-		printf("\r\nIllegal sharper:%s\n",argv[5]);
-		return -1;
+		printf("\r\nIllegal sharper:%s\n", argv[5]);
+		return;
 	}
-	printf("reg:0x%x--value:0x%x\n",reg,value);
-
-	return 0;
+	printf("reg:0x%x--value:0x%x\n", reg, value);
 }
 
 void get_upw(unsigned int *value, unsigned char base)
 {
 	*value &= (~((0x7 << 0) | (0x7 << 4) | (0x7 << 8) | (0x7 << 12) |
 		     (0x7 << 16) | (0x7 << 20)));
-	switch (base)
-	{
-		case 0: /* port-based 0x2x40[18:16] */
-			*value |= ((0x2 << 0) | (0x2 << 4) | (0x2 << 8) |
-				(0x2 << 12) | (0x7 << 16) | (0x2 << 20));
-			break;
-		case 1: /* tagged-based 0x2x40[10:8] */
-			*value |= ((0x2 << 0) | (0x2 << 4) | (0x7 << 8) |
-				(0x2 << 12) | (0x2 << 16) | (0x2 << 20));
-			break;
-		case 2: /* DSCP-based 0x2x40[14:12] */
-			*value |= ((0x2 << 0) | (0x2 << 4) | (0x2 << 8) |
-				(0x7 << 12) | (0x2 << 16) | (0x2 << 20));
-			break;
-		case 3: /* acl-based 0x2x40[2:0] */
-			*value |= ((0x7 << 0) | (0x2 << 4) | (0x2 << 8) |
-				(0x2 << 12) | (0x2 << 16) | (0x2 << 20));
-			break;
-		case 4: /* arl-based 0x2x40[22:20] */
-			*value |= ((0x2 << 0) | (0x2 << 4) | (0x2 << 8) |
-				(0x2 << 12) | (0x2 << 16) | (0x7 << 20));
-			break;
-		case 5: /* stag-based 0x2x40[6:4] */
-			*value |= ((0x2 << 0) | (0x7 << 4) | (0x2 << 8) |
-				(0x2 << 12) | (0x2 << 16) | (0x2 << 20));
-			break;
-		default:
-			break;
+	switch (base) {
+	case 0:		/* port-based 0x2x40[18:16] */
+		*value |= ((0x2 << 0) | (0x2 << 4) | (0x2 << 8) |
+			   (0x2 << 12) | (0x7 << 16) | (0x2 << 20));
+		break;
+	case 1:		/* tagged-based 0x2x40[10:8] */
+		*value |= ((0x2 << 0) | (0x2 << 4) | (0x7 << 8) |
+			   (0x2 << 12) | (0x2 << 16) | (0x2 << 20));
+		break;
+	case 2:		/* DSCP-based 0x2x40[14:12] */
+		*value |= ((0x2 << 0) | (0x2 << 4) | (0x2 << 8) |
+			   (0x7 << 12) | (0x2 << 16) | (0x2 << 20));
+		break;
+	case 3:		/* acl-based 0x2x40[2:0] */
+		*value |= ((0x7 << 0) | (0x2 << 4) | (0x2 << 8) |
+			   (0x2 << 12) | (0x2 << 16) | (0x2 << 20));
+		break;
+	case 4:		/* arl-based 0x2x40[22:20] */
+		*value |= ((0x2 << 0) | (0x2 << 4) | (0x2 << 8) |
+			   (0x2 << 12) | (0x2 << 16) | (0x7 << 20));
+		break;
+	case 5:		/* stag-based 0x2x40[6:4] */
+		*value |= ((0x2 << 0) | (0x7 << 4) | (0x2 << 8) |
+			   (0x2 << 12) | (0x2 << 16) | (0x2 << 20));
+		break;
+	default:
+		break;
 	}
 }
 
 void qos_set_base(int argc, char *argv[])
 {
 	unsigned char base = 0;
-	unsigned char port;
-	unsigned int value;
+	unsigned char port = 0;
+	unsigned int value = 0;
 
 	if (argc < 5)
 		return;
@@ -2472,13 +2579,12 @@
 	}
 
 	if (port > 6) {
-		printf("Illegal port index:%d\n",port);
+		printf("Illegal port index:%d\n", port);
 		return;
 	}
 
 	printf("\r\nswitch qos base : %d. (port-based:0, tag-based:1,\
-		dscp-based:2, acl-based:3, arl-based:4, stag-based:5)\n",
-	       base);
+		dscp-based:2, acl-based:3, arl-based:4, stag-based:5)\n", base);
 	if (chip_name == 0x7530) {
 
 		reg_read(0x44, &value);
@@ -2491,7 +2597,7 @@
 		reg_read(GSW_UPW(port), &value);
 		get_upw(&value, base);
 		reg_write(GSW_UPW(port), value);
-		printf("reg:0x%x, value: 0x%x\n",GSW_UPW(port),value);
+		printf("reg:0x%x, value: 0x%x\n", GSW_UPW(port), value);
 
 	} else {
 		printf("unknown switch device");
@@ -2501,9 +2607,9 @@
 
 void qos_wfq_set_weight(int argc, char *argv[])
 {
-	int port, weight[8], i;
-	unsigned char queue;
-	unsigned int reg, value;
+	int port = 0, weight[8], i = 0;
+	unsigned char queue = 0;
+	unsigned int reg = 0, value = 0;
 
 	port = atoi(argv[3]);
 
@@ -2524,14 +2630,12 @@
 		}
 	}
 	printf("port: %x, q0: %x, q1: %x, q2: %x, q3: %x, \
-		q4: %x, q5: %x, q6: %x, q7: %x\n",
-	       port, weight[0], weight[1], weight[2], weight[3], weight[4],
-	       weight[5], weight[6], weight[7]);
+		q4: %x, q5: %x, q6: %x, q7: %x\n", port, weight[0], weight[1], weight[2], weight[3], weight[4], weight[5], weight[6], weight[7]);
 
 	for (queue = 0; queue < 8; queue++) {
 		reg = GSW_MMSCR1_Q(queue) + 0x100 * port;
 		reg_read(reg, &value);
-		value &= (~(0xf << 24)); //bit24~27
+		value &= (~(0xf << 24));	//bit24~27
 		value |= (((weight[queue] - 1) & 0xf) << 24);
 		printf("reg: %x, value: %x\n", reg, value);
 		reg_write(reg, value);
@@ -2540,8 +2644,8 @@
 
 void qos_set_portpri(int argc, char *argv[])
 {
-	unsigned char port, prio;
-	unsigned int value;
+	unsigned char port = 0, prio = 0;
+	unsigned int value = 0;
 
 	port = atoi(argv[3]);
 	prio = atoi(argv[4]);
@@ -2560,8 +2664,8 @@
 
 void qos_set_dscppri(int argc, char *argv[])
 {
-	unsigned char prio, dscp, pim_n, pim_offset;
-	unsigned int reg, value;
+	unsigned char prio = 0, dscp = 0, pim_n = 0, pim_offset = 0;
+	unsigned int value = 0, reg = 0;
 
 	dscp = atoi(argv[3]);
 	prio = atoi(argv[4]);
@@ -2583,8 +2687,8 @@
 
 void qos_pri_mapping_queue(int argc, char *argv[])
 {
-	unsigned char prio, queue, pem_n, port;
-	unsigned int reg, value;
+	unsigned char prio = 0, queue = 0, pem_n = 0, port = 0;
+	unsigned int value = 0, reg = 0;
 
 	if (argc < 6)
 		return;
@@ -2597,6 +2701,7 @@
 		printf(HELP_QOS_PRIO_QMAP);
 		return;
 	}
+
 	if (chip_name == 0x7530) {
 		pem_n = prio / 2;
 		reg = pem_n * 0x4 + 0x48;
@@ -2614,34 +2719,33 @@
 		pem_n = prio / 2;
 		reg = GSW_PEM(pem_n) + 0x100 * port;
 		reg_read(reg, &value);
-		if (prio % 2) { // 1 1
+		if (prio % 2) {	// 1 1
 			value &= (~(0x7 << 25));
 			value |= ((queue & 0x7) << 25);
-		} else { // 0 0
+		} else {	// 0 0
 			value &= (~(0x7 << 9));
 			value |= ((queue & 0x7) << 9);
 		}
 		reg_write(reg, value);
 		printf("write reg: %x, value: %x\n", reg, value);
-	}
-	else {
+	} else {
 		printf("unknown switch device");
 		return;
 	}
 }
 
 static int macMT753xVlanSetVid(unsigned char index, unsigned char active,
-			       unsigned short vid, unsigned char portMap, unsigned char tagPortMap,
-			       unsigned char ivl_en, unsigned char fid, unsigned short stag)
+			       unsigned short vid, unsigned char portMap,
+			       unsigned char tagPortMap, unsigned char ivl_en,
+			       unsigned char fid, unsigned short stag)
 {
 	unsigned int value = 0;
 	unsigned int value2 = 0;
-	unsigned int reg;
-	int i;
+	unsigned int reg = 0;
+	int i = 0;
 
 	printf("index: %x, active: %x, vid: %x, portMap: %x, \
-		tagPortMap: %x, ivl_en: %x, fid: %x, stag: %x\n",
-	       index, active, vid, portMap, tagPortMap, ivl_en, fid, stag);
+		tagPortMap: %x, ivl_en: %x, fid: %x, stag: %x\n", index, active, vid, portMap, tagPortMap, ivl_en, fid, stag);
 
 	value = (portMap << 16);
 	value |= (stag << 4);
@@ -2656,22 +2760,22 @@
 	}
 
 	if (value2)
-		value |= (1 << 28); // eg_tag
+		value |= (1 << 28);	// eg_tag
 
-	reg = 0x98; // VAWD2
+	reg = 0x98;		// VAWD2
 	reg_write(reg, value2);
 
-	reg = 0x94; // VAWD1
+	reg = 0x94;		// VAWD1
 	reg_write(reg, value);
 
-	reg = 0x90; // VTCR
+	reg = 0x90;		// VTCR
 	value = (0x80001000 + vid);
 	reg_write(reg, value);
 
-	reg = 0x90; // VTCR
+	reg = 0x90;		// VTCR
 	while (1) {
 		reg_read(reg, &value);
-		if ((value & 0x80000000) == 0) //table busy
+		if ((value & 0x80000000) == 0)	//table busy
 			break;
 	}
 
@@ -2685,45 +2789,14 @@
 	       index, active, vid, portMap, tagPortMap);
 	return 0;
 
-} /*end macMT753xVlanSetVid*/
-/*
-static int macMT753xVlanGetVtbl(unsigned short index)
-{
-	unsigned int reg, value, vawd1, vawd2;
-
-	reg = 0x90; // VTCR
-	value = (0x80000000 + index);
-
-	reg_write(reg, value);
-
-	reg = 0x90; // VTCR
-	while (1) {
-		reg_read(reg, &value);
-		if ((value & 0x80000000) == 0) //table busy
-			break;
-	}
-
-	reg = 0x94; // VAWD1
-	reg_read(reg, &vawd1);
-
-	reg = 0x98; // VAWD2
-	reg_read(reg, &vawd2);
-
-	if (vawd1 & 0x1) {
-		fprintf(stderr, "%d.%s vid:%d fid:%d portMap:0x%x \
-				tagMap:0x%x stag:0x%x ivl_en:0x%x\r\n",
-			index, (vawd1 & 0x1) ? "on" : "off", index, ((vawd1 & 0xe) >> 1),
-			(vawd1 & 0xff0000) >> 16, vawd2, (vawd1 & 0xfff0) >> 0x4, (vawd1 >> 30) & 0x1);
-	}
-	return 0;
-} */ /*end macMT753xVlanGetVtbl*/
+}				/*end macMT753xVlanSetVid */
 
 static int macMT753xVlanSetPvid(unsigned char port, unsigned short pvid)
 {
-	unsigned int value;
-	unsigned int reg;
+	unsigned int value = 0;
+	unsigned int reg = 0;
 
-	/*Parameters is error*/
+	/*Parameters is error */
 	if (port > 6)
 		return -1;
 
@@ -2742,38 +2815,6 @@
 	printf("SetPVID: port:%d pvid:%d\r\n", port, pvid);
 	return 0;
 }
-/*
-static int macMT753xVlanGetPvid(unsigned char port)
-{
-	unsigned int value;
-	unsigned int reg;
-
-	if (port > 6)
-		return -1;
-	reg = 0x2014 + (port * 0x100);
-	reg_read(reg, &value);
-	return (value & 0xfff);
-} */
-/*
-static int macMT753xVlanDisp(void)
-{
-	unsigned int i = 0;
-	unsigned int reg, value;
-
-	reg = 0x2604;
-	reg_read(reg, &value);
-	value &= 0x30000000;
-
-	fprintf(stderr, "VLAN function is %s\n", value ? ETHCMD_ENABLE : ETHCMD_DISABLE);
-	fprintf(stderr, "PVID e0:%02d e1:%02d e2:%02d e3:%02d e4:%02d e5:%02d e6:%02d\n",
-		macMT753xVlanGetPvid(0), macMT753xVlanGetPvid(1), macMT753xVlanGetPvid(2),
-		macMT753xVlanGetPvid(3), macMT753xVlanGetPvid(4), macMT753xVlanGetPvid(5), macMT753xVlanGetPvid(6));
-
-	for (i = 0; i < MAX_VID_VALUE; i++)
-		macMT753xVlanGetVtbl(i);
-
-	return 0;
-}*/ /*end macMT753xVlanDisp*/
 
 void doVlanSetPvid(int argc, char *argv[])
 {
@@ -2782,7 +2823,7 @@
 
 	port = atoi(argv[3]);
 	pvid = atoi(argv[4]);
-	/*Check the input parameters is right or not.*/
+	/*Check the input parameters is right or not. */
 	if ((port >= SWITCH_MAX_PORT) || (pvid > MAX_VID_VALUE)) {
 		printf(HELP_VLAN_PVID);
 		return;
@@ -2792,7 +2833,7 @@
 
 	printf("port:%d pvid:%d,vlancap: max_port:%d maxvid:%d\r\n",
 	       port, pvid, SWITCH_MAX_PORT, MAX_VID_VALUE);
-} /*end doVlanSetPvid*/
+}				/*end doVlanSetPvid */
 
 void doVlanSetVid(int argc, char *argv[])
 {
@@ -2810,13 +2851,13 @@
 	active = atoi(argv[4]);
 	vid = atoi(argv[5]);
 
-	/*Check the input parameters is right or not.*/
+	/*Check the input parameters is right or not. */
 	if ((index >= MAX_VLAN_RULE) || (vid >= 4096) || (active > ACTIVED)) {
 		printf(HELP_VLAN_VID);
 		return;
 	}
 
-	/*CPU Port is always the membership*/
+	/*CPU Port is always the membership */
 	portMap = atoi(argv[6]);
 	tagPortMap = atoi(argv[7]);
 
@@ -2832,21 +2873,21 @@
 	macMT753xVlanSetVid(index, active, vid, portMap, tagPortMap,
 			    ivl_en, fid, stag);
 	printf("index:%d active:%d vid:%d\r\n", index, active, vid);
-} /*end doVlanSetVid*/
+}				/*end doVlanSetVid */
 
 void doVlanSetAccFrm(int argc, char *argv[])
 {
 	unsigned char port = 0;
 	unsigned char type = 0;
-	unsigned int value;
-	unsigned int reg;
+	unsigned int value = 0;
+	unsigned int reg = 0;
 
 	port = atoi(argv[3]);
 	type = atoi(argv[4]);
 
 	printf("port: %d, type: %d\n", port, type);
 
-	/*Check the input parameters is right or not.*/
+	/*Check the input parameters is right or not. */
 	if ((port > SWITCH_MAX_PORT) || (type > REG_PVC_ACC_FRM_RELMASK)) {
 		printf(HELP_VLAN_ACC_FRM);
 		return;
@@ -2859,21 +2900,21 @@
 
 	printf("write reg: %x, value: %x\n", reg, value);
 	reg_write(reg, value);
-} /*end doVlanSetAccFrm*/
+}				/*end doVlanSetAccFrm */
 
 void doVlanSetPortAttr(int argc, char *argv[])
 {
 	unsigned char port = 0;
 	unsigned char attr = 0;
-	unsigned int value;
-	unsigned int reg;
+	unsigned int value = 0;
+	unsigned int reg = 0;
 
 	port = atoi(argv[3]);
 	attr = atoi(argv[4]);
 
 	printf("port: %x, attr: %x\n", port, attr);
 
-	/*Check the input parameters is right or not.*/
+	/*Check the input parameters is right or not. */
 	if (port > SWITCH_MAX_PORT || attr > 3) {
 		printf(HELP_VLAN_PORT_ATTR);
 		return;
@@ -2892,13 +2933,14 @@
 {
 	unsigned char port = 0;
 	unsigned char mode = 0;
-	unsigned int value;
-	unsigned int reg;
+	unsigned int value = 0;
+	unsigned int reg = 0;
+
 	port = atoi(argv[3]);
 	mode = atoi(argv[4]);
 	printf("port: %x, mode: %x\n", port, mode);
 
-	/*Check the input parameters is right or not.*/
+	/*Check the input parameters is right or not. */
 	if (port > SWITCH_MAX_PORT || mode > 3) {
 		printf(HELP_VLAN_PORT_MODE);
 		return;
@@ -2916,15 +2958,15 @@
 {
 	unsigned char port = 0;
 	unsigned char eg_tag = 0;
-	unsigned int value;
-	unsigned int reg;
+	unsigned int value = 0;
+	unsigned int reg = 0;
 
 	port = atoi(argv[3]);
 	eg_tag = atoi(argv[4]);
 
 	printf("port: %d, eg_tag: %d\n", port, eg_tag);
 
-	/*Check the input parameters is right or not.*/
+	/*Check the input parameters is right or not. */
 	if ((port > SWITCH_MAX_PORT) || (eg_tag > REG_PCR_EG_TAG_RELMASK)) {
 		printf(HELP_VLAN_EGRESS_TAG_PCR);
 		return;
@@ -2938,21 +2980,21 @@
 	printf("write reg: %x, value: %x\n", reg, value);
 	reg_write(reg, value);
 
-} /*end doVlanSetEgressTagPCR*/
+}				/*end doVlanSetEgressTagPCR */
 
 void doVlanSetEgressTagPVC(int argc, char *argv[])
 {
 	unsigned char port = 0;
 	unsigned char eg_tag = 0;
-	unsigned int value;
-	unsigned int reg;
+	unsigned int value = 0;
+	unsigned int reg = 0;
 
 	port = atoi(argv[3]);
 	eg_tag = atoi(argv[4]);
 
 	printf("port: %d, eg_tag: %d\n", port, eg_tag);
 
-	/*Check the input parameters is right or not.*/
+	/*Check the input parameters is right or not. */
 	if ((port > SWITCH_MAX_PORT) || (eg_tag > REG_PVC_EG_TAG_RELMASK)) {
 		printf(HELP_VLAN_EGRESS_TAG_PVC);
 		return;
@@ -2965,19 +3007,19 @@
 
 	printf("write reg: %x, value: %x\n", reg, value);
 	reg_write(reg, value);
-} /*end doVlanSetEgressTagPVC*/
+}				/*end doVlanSetEgressTagPVC */
 
 void doArlAging(int argc, char *argv[])
 {
 	unsigned char aging_en = 0;
-	unsigned int time = 0, aging_cnt = 0, aging_unit = 0, value, reg;
-	;
+	unsigned int time = 0, aging_cnt = 0, aging_unit = 0, value = 0, reg =
+	    0;
 
 	aging_en = atoi(argv[3]);
 	time = atoi(argv[4]);
 	printf("aging_en: %x, aging time: %x\n", aging_en, time);
 
-	/*Check the input parameters is right or not.*/
+	/*Check the input parameters is right or not. */
 	if ((aging_en != 0 && aging_en != 1) || (time <= 0 || time > 65536)) {
 		printf(HELP_ARL_AGING);
 		return;
@@ -3006,16 +3048,16 @@
 
 void doMirrorEn(int argc, char *argv[])
 {
-	unsigned char mirror_en;
-	unsigned char mirror_port;
-	unsigned int value, reg;
+	unsigned char mirror_en = 0;
+	unsigned char mirror_port = 0;
+	unsigned int value = 0, reg = 0;
 
 	mirror_en = atoi(argv[3]);
 	mirror_port = atoi(argv[4]);
 
 	printf("mirror_en: %d, mirror_port: %d\n", mirror_en, mirror_port);
 
-	/*Check the input parameters is right or not.*/
+	/*Check the input parameters is right or not. */
 	if ((mirror_en > 1) || (mirror_port > REG_CFC_MIRROR_PORT_RELMASK)) {
 		printf(HELP_MIRROR_EN);
 		return;
@@ -3031,12 +3073,13 @@
 	printf("write reg: %x, value: %x\n", reg, value);
 	reg_write(reg, value);
 
-} /*end doMirrorEn*/
+}				/*end doMirrorEn */
 
 void doMirrorPortBased(int argc, char *argv[])
 {
-	unsigned char port, port_tx_mir, port_rx_mir, vlan_mis, acl_mir, igmp_mir;
-	unsigned int value, reg;
+	unsigned char port = 0, port_tx_mir = 0, port_rx_mir = 0, vlan_mis =
+	    0, acl_mir = 0, igmp_mir = 0;
+	unsigned int value = 0, reg = 0;
 
 	port = atoi(argv[3]);
 	port_tx_mir = atoi(argv[4]);
@@ -3045,20 +3088,28 @@
 	vlan_mis = atoi(argv[7]);
 	igmp_mir = atoi(argv[8]);
 
-	printf("port:%d, port_tx_mir:%d, port_rx_mir:%d, acl_mir:%d, vlan_mis:%d, igmp_mir:%d\n", port, port_tx_mir, port_rx_mir, acl_mir, vlan_mis, igmp_mir);
+	printf
+	    ("port:%d, port_tx_mir:%d, port_rx_mir:%d, acl_mir:%d, vlan_mis:%d, igmp_mir:%d\n",
+	     port, port_tx_mir, port_rx_mir, acl_mir, vlan_mis, igmp_mir);
 
-	/*Check the input parameters is right or not.*/
+	/*Check the input parameters is right or not. */
 	//if((port >= vlanCap->max_port_no) || (port_tx_mir > 1) || (port_rx_mir > 1) || (acl_mir > 1) || (vlan_mis > 1)){
-	if ((port >= 7) || (port_tx_mir > 1) || (port_rx_mir > 1) || (acl_mir > 1) || (vlan_mis > 1)) { // also allow CPU port (port6)
+	if ((port >= 7) || (port_tx_mir > 1) || (port_rx_mir > 1) || (acl_mir > 1) || (vlan_mis > 1)) {	// also allow CPU port (port6)
 		printf(HELP_MIRROR_PORTBASED);
 		return;
 	}
 
 	reg = REG_PCR_P0_ADDR + port * 0x100;
 	reg_read(reg, &value);
-	value &= ~(REG_PORT_TX_MIR_MASK | REG_PORT_RX_MIR_MASK | REG_PCR_ACL_MIR_MASK | REG_PCR_VLAN_MIS_MASK);
-	value |= (port_tx_mir << REG_PORT_TX_MIR_OFFT) + (port_rx_mir << REG_PORT_RX_MIR_OFFT);
-	value |= (acl_mir << REG_PCR_ACL_MIR_OFFT) + (vlan_mis << REG_PCR_VLAN_MIS_OFFT);
+	value &=
+	    ~(REG_PORT_TX_MIR_MASK | REG_PORT_RX_MIR_MASK | REG_PCR_ACL_MIR_MASK
+	      | REG_PCR_VLAN_MIS_MASK);
+	value |=
+	    (port_tx_mir << REG_PORT_TX_MIR_OFFT) +
+	    (port_rx_mir << REG_PORT_RX_MIR_OFFT);
+	value |=
+	    (acl_mir << REG_PCR_ACL_MIR_OFFT) +
+	    (vlan_mis << REG_PCR_VLAN_MIS_OFFT);
 
 	printf("write reg: %x, value: %x\n", reg, value);
 	reg_write(reg, value);
@@ -3071,15 +3122,15 @@
 	printf("write reg: %x, value: %x\n", reg, value);
 	reg_write(reg, value);
 
-} /*end doMirrorPortBased*/
+}				/*end doMirrorPortBased */
 
 void doStp(int argc, char *argv[])
 {
 	unsigned char port = 0;
 	unsigned char fid = 0;
 	unsigned char state = 0;
-	unsigned int value;
-	unsigned int reg;
+	unsigned int value = 0;
+	unsigned int reg = 0;
 
 	port = atoi(argv[2]);
 	fid = atoi(argv[3]);
@@ -3087,7 +3138,7 @@
 
 	printf("port: %d, fid: %d, state: %d\n", port, fid, state);
 
-	/*Check the input parameters is right or not.*/
+	/*Check the input parameters is right or not. */
 	if ((port > MAX_PORT + 1) || (fid > 7) || (state > 3)) {
 		printf(HELP_STP);
 		return;
@@ -3102,45 +3153,54 @@
 	reg_write(reg, value);
 }
 
-int ingress_rate_set(int on_off, unsigned int port, unsigned int bw)
+void _ingress_rate_set(int on_off, int port, int bw)
 {
-	unsigned int reg, value;
+	unsigned int reg = 0, value = 0;
 
 	reg = 0x1800 + (0x100 * port);
 	value = 0;
-	/*token-bucket*/
+	/*token-bucket */
 	if (on_off == 1) {
 		if (chip_name == 0x7530) {
 			if (bw > 1000000) {
-				printf("\n**Charge rate(%d) is larger than line rate(1000000kbps)**\n",bw);
-				return -1;
+				printf
+				    ("\n**Charge rate(%d) is larger than line rate(1000000kbps)**\n",
+				     bw);
+				return;
 			}
-			value = ((bw / 32) << 16) + (1 << 15) + (7 << 8) + (1 << 7) + 0x0f;
+			value =
+			    ((bw / 32) << 16) + (1 << 15) + (7 << 8) +
+			    (1 << 7) + 0x0f;
 		} else if (chip_name == 0x7531 || chip_name == 0x7988) {
 			if ((chip_name == 0x7531) && (bw > 2500000)) {
-				printf("\n**Charge rate(%d) is larger than line rate(2500000kbps)**\n",bw);
-				return -1;
+				printf
+				    ("\n**Charge rate(%d) is larger than line rate(2500000kbps)**\n",
+				     bw);
+				return;
 			}
 
 			if ((chip_name == 0x7988) && (bw > 4000000)) {
-				printf("\n**Charge rate(%d) is larger than line rate(4000000kbps)**\n",bw);
-				return -1;
+				printf
+				    ("\n**Charge rate(%d) is larger than line rate(4000000kbps)**\n",
+				     bw);
+				return;
 			}
 
-			if (bw/32 >= 65536) //supoort 2.5G case
-				value = ((bw / 32) << 16) + (1 << 15) + (1 << 14) + (1 << 12) + (7 << 8) + 0xf;
+			if (bw / 32 >= 65536)	//supoort 2.5G case
+				value =
+				    ((bw / 32) << 16) + (1 << 15) + (1 << 14) +
+				    (1 << 12) + (7 << 8) + 0xf;
 			else
-				value = ((bw / 32) << 16) + (1 << 15) + (1 << 14) + (7 << 8) + 0xf;
-		}
-		else
+				value =
+				    ((bw / 32) << 16) + (1 << 15) + (1 << 14) +
+				    (7 << 8) + 0xf;
+		} else
 			printf("unknow chip\n");
 	}
-
 #if leaky_bucket
 	reg_read(reg, &value);
 	value &= 0xffff0000;
-	if (on_off == 1)
-	{
+	if (on_off == 1) {
 		value |= on_off << 15;
 		//7530 same as 7531
 		if (bw < 100) {
@@ -3166,39 +3226,71 @@
 	reg_read(reg, &value);
 	value = 0x110104;
 	reg_write(reg, value);
-	return 0;
+
+	if (on_off)
+		printf("switch port=%d, bw=%d\n", port, bw);
+	else
+		printf("switch port=%d ingress rate limit off\n", port);
 }
 
-int egress_rate_set(int on_off, int port, int bw)
+void ingress_rate_set(int argc, char *argv[])
 {
-	unsigned int reg, value;
+	int on_off = 0, port = 0, bw = 0;
+
+	port = strtoul(argv[3], NULL, 0);
+	if (argv[2][1] == 'n') {
+		bw = strtoul(argv[4], NULL, 0);
+		on_off = 1;
+	} else if (argv[2][1] == 'f') {
+		if (argc != 4)
+			return;
+		on_off = 0;
+	}
+
+	_ingress_rate_set(on_off, port, bw);
+}
+
+void _egress_rate_set(int on_off, int port, int bw)
+{
+	unsigned int value = 0, reg = 0;
 
 	reg = 0x1040 + (0x100 * port);
 	value = 0;
-	/*token-bucket*/
+	/*token-bucket */
 	if (on_off == 1) {
 		if (chip_name == 0x7530) {
 			if (bw < 0 || bw > 1000000) {
-				printf("\n**Charge rate(%d) is larger than line rate(1000000kbps)**\n",bw);
-				return -1;
+				printf
+				    ("\n**Charge rate(%d) is larger than line rate(1000000kbps)**\n",
+				     bw);
+				return;
 			}
-			value = ((bw / 32) << 16) + (1 << 15) + (7 << 8) + (1 << 7) + 0xf;
+			value =
+			    ((bw / 32) << 16) + (1 << 15) + (7 << 8) +
+			    (1 << 7) + 0xf;
 		} else if (chip_name == 0x7531 || chip_name == 0x7988) {
 			if ((chip_name == 0x7531) && (bw < 0 || bw > 2500000)) {
-				printf("\n**Charge rate(%d) is larger than line rate(2500000kbps)**\n",bw);
-				return -1;
+				printf
+				    ("\n**Charge rate(%d) is larger than line rate(2500000kbps)**\n",
+				     bw);
+				return;
 			}
 			if ((chip_name == 0x7988) && (bw < 0 || bw > 4000000)) {
-				printf("\n**Charge rate(%d) is larger than line rate(4000000kbps)**\n",bw);
-				return -1;
+				printf
+				    ("\n**Charge rate(%d) is larger than line rate(4000000kbps)**\n",
+				     bw);
+				return;
 			}
 
-			if (bw/32 >= 65536)	//support 2.5G cases
-				value = ((bw / 32) << 16) + (1 << 15) + (1 << 14) + (1 << 12) + (7 << 8) + 0xf;
+			if (bw / 32 >= 65536)	//support 2.5G cases
+				value =
+				    ((bw / 32) << 16) + (1 << 15) + (1 << 14) +
+				    (1 << 12) + (7 << 8) + 0xf;
 			else
-				value = ((bw / 32) << 16) + (1 << 15) + (1 << 14) + (7 << 8) + 0xf;
-		}
-		else
+				value =
+				    ((bw / 32) << 16) + (1 << 15) + (1 << 14) +
+				    (7 << 8) + 0xf;
+		} else
 			printf("unknow chip\n");
 	}
 	reg_write(reg, value);
@@ -3207,7 +3299,28 @@
 	value &= 0x18;
 	reg_write(reg, value);
 
-	return 0;
+	if (on_off)
+		printf("switch port=%d, bw=%d\n", port, bw);
+	else
+		printf("switch port=%d egress rate limit off\n", port);
+}
+
+void egress_rate_set(int argc, char *argv[])
+{
+	unsigned int value = 0, reg = 0;
+	int on_off = 0, port = 0, bw = 0;
+
+	port = strtoul(argv[3], NULL, 0);
+	if (argv[2][1] == 'n') {
+		bw = strtoul(argv[4], NULL, 0);
+		on_off = 1;
+	} else if (argv[2][1] == 'f') {
+		if (argc != 4)
+			return;
+		on_off = 0;
+	}
+
+	_egress_rate_set(on_off, port, bw);
 }
 
 void rate_control(int argc, char *argv[])
@@ -3223,34 +3336,33 @@
 	if (port > 6)
 		return;
 
-	if (dir == 1) //ingress
-		ingress_rate_set(1, port, rate);
-	else if (dir == 0) //egress
-		egress_rate_set(1, port, rate);
+	if (dir == 1)		//ingress
+		_ingress_rate_set(1, port, rate);
+	else if (dir == 0)	//egress
+		_egress_rate_set(1, port, rate);
 	else
 		return;
 }
 
-int collision_pool_enable(int argc, char *argv[])
+void collision_pool_enable(int argc, char *argv[])
 {
 
-	unsigned char enable;
-	unsigned int value, reg;
+	unsigned char enable = 0;
+	unsigned int value = 0, reg = 0;
 
 	enable = atoi(argv[3]);
 
-
 	printf("collision pool enable: %d \n", enable);
 
-	/*Check the input parameters is right or not.*/
+	/*Check the input parameters is right or not. */
 	if (enable > 1) {
 		printf(HELP_COLLISION_POOL_EN);
-		return -1;
+		return;
 	}
 
 	if (chip_name == 0x7531 || chip_name == 0x7988) {
 		reg = REG_CPGC_ADDR;
-		if(enable == 1) {
+		if (enable == 1) {
 			/* active reset */
 			reg_read(reg, &value);
 			value &= (~REG_CPCG_COL_RST_N_MASK);
@@ -3276,7 +3388,7 @@
 
 			reg_read(reg, &value);
 			printf("write reg: %x, value: %x\n", reg, value);
-		}else {
+		} else {
 
 			/* disable collision pool */
 			reg_read(reg, &value);
@@ -3303,70 +3415,67 @@
 			printf("write reg: %x, value: %x\n", reg, value);
 
 		}
-	}else{
+	} else {
 		printf("\nCommand not support by this chip.\n");
-}
-
- return 0;
+	}
 }
 
-void collision_pool_mac_dump()
+void collision_pool_mac_dump(int argc, char *argv[])
 {
-	unsigned int value, reg;
+	unsigned int value = 0, reg = 0;
 
 	if (chip_name == 0x7531 || chip_name == 0x7988) {
 		reg = REG_CPGC_ADDR;
 		reg_read(reg, &value);
-		if(value & REG_CPCG_COL_EN_MASK)
+		if (value & REG_CPCG_COL_EN_MASK)
 			table_dump_internal(COLLISION_TABLE);
 		else
-			printf("\ncollision pool is disabled, please enable it before use this command.\n");
-	}else {
+			printf
+			    ("\ncollision pool is disabled, please enable it before use this command.\n");
+	} else {
 		printf("\nCommand not support by this chip.\n");
 	}
 }
 
-void collision_pool_dip_dump()
+void collision_pool_dip_dump(int argc, char *argv[])
 {
-	unsigned int value, reg;
+	unsigned int value = 0, reg = 0;
 
 	if (chip_name == 0x7531 || chip_name == 0x7988) {
 		reg = REG_CPGC_ADDR;
 		reg_read(reg, &value);
-		if(value & REG_CPCG_COL_EN_MASK)
+		if (value & REG_CPCG_COL_EN_MASK)
 			dip_dump_internal(COLLISION_TABLE);
 		else
-			printf("\ncollision pool is disabled, please enable it before use this command.\n");
-		}else {
+			printf
+			    ("\ncollision pool is disabled, please enable it before use this command.\n");
+	} else {
 		printf("\nCommand not support by this chip.\n");
 	}
-
-
 }
 
-void collision_pool_sip_dump()
+void collision_pool_sip_dump(int argc, char *argv[])
 {
-	unsigned int value, reg;
+	unsigned int value = 0, reg = 0;
 
-	if (chip_name == 0x7531 ||  chip_name == 0x7988) {
+	if (chip_name == 0x7531 || chip_name == 0x7988) {
 		reg = REG_CPGC_ADDR;
 		reg_read(reg, &value);
-		if(value & REG_CPCG_COL_EN_MASK)
+		if (value & REG_CPCG_COL_EN_MASK)
 			sip_dump_internal(COLLISION_TABLE);
 		else
-			printf("\ncollision pool is disabled, please enable it before use this command.\n");
-	}else {
+			printf
+			    ("\ncollision pool is disabled, please enable it before use this command.\n");
+	} else {
 		printf("\nCommand not support by this chip.\n");
 	}
-
-
 }
 
 void pfc_get_rx_counter(int argc, char *argv[])
 {
-	int port;
-	unsigned int value, reg;
-	unsigned int user_pri;
+	int port = 0;
+	unsigned int value = 0, reg = 0;
+	unsigned int user_pri = 0;
 
 	port = strtoul(argv[3], NULL, 0);
 	if (port < 0 || 6 < port) {
@@ -3374,33 +3483,41 @@
 		return;
 	}
 
-	if (chip_name == 0x7531 ||  chip_name == 0x7988) {
-		reg= PFC_RX_COUNTER_L(port);
+	if (chip_name == 0x7531 || chip_name == 0x7988) {
+		reg = PFC_RX_COUNTER_L(port);
 		reg_read(reg, &value);
 		user_pri = value & 0xff;
-		printf("\n port %d rx pfc (up=0)pause on counter is %d.\n", port,user_pri);
+		printf("\n port %d rx pfc (up=0)pause on counter is %d.\n",
+		       port, user_pri);
 		user_pri = (value & 0xff00) >> 8;
-		printf("\n port %d rx pfc (up=1)pause on counter is %d.\n", port,user_pri);
+		printf("\n port %d rx pfc (up=1)pause on counter is %d.\n",
+		       port, user_pri);
 		user_pri = (value & 0xff0000) >> 16;
-		printf("\n port %d rx pfc (up=2)pause on counter is %d.\n", port,user_pri);
+		printf("\n port %d rx pfc (up=2)pause on counter is %d.\n",
+		       port, user_pri);
 		user_pri = (value & 0xff000000) >> 24;
-		printf("\n port %d rx pfc (up=3)pause on counter is %d.\n", port,user_pri);
+		printf("\n port %d rx pfc (up=3)pause on counter is %d.\n",
+		       port, user_pri);
 
-		reg= PFC_RX_COUNTER_H(port);
+		reg = PFC_RX_COUNTER_H(port);
 		reg_read(reg, &value);
 		user_pri = value & 0xff;
-		printf("\n port %d rx pfc (up=4)pause on counter is %d.\n", port,user_pri);
+		printf("\n port %d rx pfc (up=4)pause on counter is %d.\n",
+		       port, user_pri);
 		user_pri = (value & 0xff00) >> 8;
-		printf("\n port %d rx pfc (up=5)pause on counter is %d.\n", port,user_pri);
+		printf("\n port %d rx pfc (up=5)pause on counter is %d.\n",
+		       port, user_pri);
 		user_pri = (value & 0xff0000) >> 16;
-		printf("\n port %d rx pfc (up=6)pause on counter is %d.\n", port,user_pri);
+		printf("\n port %d rx pfc (up=6)pause on counter is %d.\n",
+		       port, user_pri);
 		user_pri = (value & 0xff000000) >> 24;
-		printf("\n port %d rx pfc (up=7)pause on counter is %d.\n", port,user_pri);
+		printf("\n port %d rx pfc (up=7)pause on counter is %d.\n",
+		       port, user_pri);
 
 		/* for rx counter could be updated successfully */
 		reg_read(PMSR_P(port), &value);
 		reg_read(PMSR_P(port), &value);
-	}else {
+	} else {
 		printf("\nCommand not support by this chip.\n");
 	}
 
@@ -3408,9 +3525,9 @@
 
 void pfc_get_tx_counter(int argc, char *argv[])
 {
-	int port;
-	unsigned int value, reg;
-	unsigned int user_pri;
+	int port = 0;
+	unsigned int value = 0, reg = 0;
+	unsigned int user_pri = 0;
 
 	port = strtoul(argv[3], NULL, 0);
 	if (port < 0 || 6 < port) {
@@ -3419,83 +3536,99 @@
 	}
 
 	if (chip_name == 0x7531 || chip_name == 0x7988) {
-		reg= PFC_TX_COUNTER_L(port);
+		reg = PFC_TX_COUNTER_L(port);
 		reg_read(reg, &value);
 		user_pri = value & 0xff;
-		printf("\n port %d tx pfc (up=0)pause on counter is %d.\n", port,user_pri);
+		printf("\n port %d tx pfc (up=0)pause on counter is %d.\n",
+		       port, user_pri);
 		user_pri = (value & 0xff00) >> 8;
-		printf("\n port %d tx pfc (up=1)pause on counter is %d.\n", port,user_pri);
+		printf("\n port %d tx pfc (up=1)pause on counter is %d.\n",
+		       port, user_pri);
 		user_pri = (value & 0xff0000) >> 16;
-		printf("\n port %d tx pfc (up=2)pause on counter is %d.\n", port,user_pri);
+		printf("\n port %d tx pfc (up=2)pause on counter is %d.\n",
+		       port, user_pri);
 		user_pri = (value & 0xff000000) >> 24;
-		printf("\n port %d tx pfc (up=3)pause on counter is %d.\n", port,user_pri);
+		printf("\n port %d tx pfc (up=3)pause on counter is %d.\n",
+		       port, user_pri);
 
-		reg= PFC_TX_COUNTER_H(port);
+		reg = PFC_TX_COUNTER_H(port);
 		reg_read(reg, &value);
 		user_pri = value & 0xff;
-		printf("\n port %d tx pfc (up=4)pause on counter is %d.\n", port,user_pri);
+		printf("\n port %d tx pfc (up=4)pause on counter is %d.\n",
+		       port, user_pri);
 		user_pri = (value & 0xff00) >> 8;
-		printf("\n port %d tx pfc (up=5)pause on counter is %d.\n", port,user_pri);
+		printf("\n port %d tx pfc (up=5)pause on counter is %d.\n",
+		       port, user_pri);
 		user_pri = (value & 0xff0000) >> 16;
-		printf("\n port %d tx pfc (up=6)pause on counter is %d.\n", port,user_pri);
+		printf("\n port %d tx pfc (up=6)pause on counter is %d.\n",
+		       port, user_pri);
 		user_pri = (value & 0xff000000) >> 24;
-		printf("\n port %d tx pfc (up=7)pause on counter is %d.\n", port,user_pri);
+		printf("\n port %d tx pfc (up=7)pause on counter is %d.\n",
+		       port, user_pri);
 
 		/* for tx counter could be updated successfully */
 		reg_read(PMSR_P(port), &value);
 		reg_read(PMSR_P(port), &value);
-	}else {
-		 printf("\nCommand not support by this chip.\n");
+	} else {
+		printf("\nCommand not support by this chip.\n");
 	}
 }
 
-void read_output_queue_counters()
+void read_output_queue_counters(int argc, char *argv[])
 {
-	unsigned int port=0;
-	unsigned int value, output_queue;
-	unsigned int base=0x220;
+	unsigned int port = 0;
+	unsigned int value = 0, output_queue = 0;
+	unsigned int base = 0x220;
 
 	for (port = 0; port < 7; port++) {
-		reg_write(0x7038, base + (port *4));
+		reg_write(0x7038, base + (port * 4));
 		reg_read(0x7034, &value);
 		output_queue = value & 0xff;
-		printf("\n port %d  output queue 0 counter is %d.\n", port,output_queue);
+		printf("\n port %d  output queue 0 counter is %d.\n", port,
+		       output_queue);
 		output_queue = (value & 0xff00) >> 8;
-		printf("\n port %d  output queue 1 counter is %d.\n", port,output_queue);
+		printf("\n port %d  output queue 1 counter is %d.\n", port,
+		       output_queue);
 
-		reg_write(0x7038, base + (port *4) + 1);
+		reg_write(0x7038, base + (port * 4) + 1);
 		reg_read(0x7034, &value);
 		output_queue = value & 0xff;
-		printf("\n port %d  output queue 2 counter is %d.\n", port,output_queue);
+		printf("\n port %d  output queue 2 counter is %d.\n", port,
+		       output_queue);
 		output_queue = (value & 0xff00) >> 8;
-		printf("\n port %d  output queue 3 counter is %d.\n", port,output_queue);
+		printf("\n port %d  output queue 3 counter is %d.\n", port,
+		       output_queue);
 
-		reg_write(0x7038, base + (port *4) + 2);
+		reg_write(0x7038, base + (port * 4) + 2);
 		reg_read(0x7034, &value);
 		output_queue = value & 0xff;
-		printf("\n port %d  output queue 4 counter is %d.\n", port,output_queue);
+		printf("\n port %d  output queue 4 counter is %d.\n", port,
+		       output_queue);
 		output_queue = (value & 0xff00) >> 8;
-		printf("\n port %d  output queue 5 counter is %d.\n", port,output_queue);
+		printf("\n port %d  output queue 5 counter is %d.\n", port,
+		       output_queue);
 
-		reg_write(0x7038, base + (port *4) + 3);
+		reg_write(0x7038, base + (port * 4) + 3);
 		reg_read(0x7034, &value);
 		output_queue = value & 0xff;
-		printf("\n port %d  output queue 6 counter is %d.\n", port,output_queue);
+		printf("\n port %d  output queue 6 counter is %d.\n", port,
+		       output_queue);
 		output_queue = (value & 0xff00) >> 8;
-		printf("\n port %d  output queue 7 counter is %d.\n", port,output_queue);
+		printf("\n port %d  output queue 7 counter is %d.\n", port,
+		       output_queue);
 	}
 }
 
-void read_free_page_counters()
+void read_free_page_counters(int argc, char *argv[])
 {
-	unsigned int value;
-	unsigned int free_page,free_page_last_read;
-	unsigned int fc_free_blk_lothd,fc_free_blk_hithd;
-	unsigned int fc_port_blk_thd,fc_port_blk_hi_thd;
-	unsigned int queue[8]={0};
+	unsigned int value = 0;
+	unsigned int free_page = 0, free_page_last_read = 0;
+	unsigned int fc_free_blk_lothd = 0, fc_free_blk_hithd = 0;
+	unsigned int fc_port_blk_thd = 0, fc_port_blk_hi_thd = 0;
+	unsigned int queue[8] = { 0 };
 
 	if (chip_name == 0x7531 || chip_name == 0x7988) {
-		/* get system free page link counter*/
+		/* get system free page link counter */
 		reg_read(0x1fc0, &value);
 		free_page = value & 0xFFF;
 		free_page_last_read = (value & 0xFFF0000) >> 16;
@@ -3512,17 +3645,17 @@
 
 		/* get queue flow control waterwark */
 		reg_read(0x1fe8, &value);
-		queue[0]= value & 0x3F;
-		queue[1]= (value & 0x3F00) >> 8;
-		queue[2]= (value & 0x3F0000) >> 16;
-		queue[3]= (value & 0x3F000000) >> 24;
+		queue[0] = value & 0x3F;
+		queue[1] = (value & 0x3F00) >> 8;
+		queue[2] = (value & 0x3F0000) >> 16;
+		queue[3] = (value & 0x3F000000) >> 24;
 		reg_read(0x1fec, &value);
-		queue[4]= value & 0x3F;
-		queue[5]= (value & 0x3F00) >> 8;
-		queue[6]= (value & 0x3F0000) >> 16;
-		queue[7]= (value & 0x3F000000) >> 24;
+		queue[4] = value & 0x3F;
+		queue[5] = (value & 0x3F00) >> 8;
+		queue[6] = (value & 0x3F0000) >> 16;
+		queue[7] = (value & 0x3F000000) >> 24;
 	} else {
-		/* get system free page link counter*/
+		/* get system free page link counter */
 		reg_read(0x1fc0, &value);
 		free_page = value & 0x3FF;
 		free_page_last_read = (value & 0x3FF0000) >> 16;
@@ -3540,50 +3673,61 @@
 
 		/* get queue flow control waterwark */
 		reg_read(0x1fe4, &value);
-		queue[0]= value & 0xF;
-		queue[1]= (value & 0xF0) >> 4;
-		queue[2]= (value & 0xF00) >> 8;
-		queue[3]= (value & 0xF000) >>12;
-		queue[4]= (value & 0xF0000) >>16;
-		queue[5]= (value & 0xF00000) >> 20;
-		queue[6]= (value & 0xF000000) >> 24;
-		queue[7]= (value & 0xF0000000) >> 28;
+		queue[0] = value & 0xF;
+		queue[1] = (value & 0xF0) >> 4;
+		queue[2] = (value & 0xF00) >> 8;
+		queue[3] = (value & 0xF000) >> 12;
+		queue[4] = (value & 0xF0000) >> 16;
+		queue[5] = (value & 0xF00000) >> 20;
+		queue[6] = (value & 0xF000000) >> 24;
+		queue[7] = (value & 0xF0000000) >> 28;
 	}
 
-	printf("<===Free Page=======Current=======Last Read access=====> \n ");
-	printf("	                                                 \n ");
-	printf(" page counter      %u                %u               \n ",free_page,free_page_last_read);
-	printf("                                                        \n ");
-	printf("========================================================= \n ");
-	printf("<===Type=======High threshold======Low threshold=========\n ");
-	printf("                                                        \n ");
-	printf("  system:         %u                 %u               \n", fc_free_blk_hithd*2,  fc_free_blk_lothd*2);
-	printf("    port:         %u                 %u               \n", fc_port_blk_hi_thd*2, fc_port_blk_thd*2);
-	printf(" queue 0:         %u                 NA                \n", queue[0]);
-	printf(" queue 1:         %u                 NA                \n", queue[1]);
-	printf(" queue 2:         %u                 NA                 \n", queue[2]);
-	printf(" queue 3:         %u                 NA                \n", queue[3]);
-	printf(" queue 4:         %u                 NA                \n", queue[4]);
-	printf(" queue 5:         %u                 NA                \n", queue[5]);
-	printf(" queue 6:         %u                 NA                \n", queue[6]);
-	printf(" queue 7:         %u                 NA                \n", queue[7]);
-	printf("=========================================================\n ");
+	printf("<===Free Page=======Current=======Last Read access=====>\n");
+	printf("\n");
+	printf(" page counter      %u                %u\n ",
+	       free_page, free_page_last_read);
+	printf("\n ");
+	printf("=========================================================\n");
+	printf("<===Type=======High threshold======Low threshold=========\n");
+	printf("\n ");
+	printf("  system:         %u                 %u\n",
+	       fc_free_blk_hithd * 2, fc_free_blk_lothd * 2);
+	printf("    port:         %u                 %u\n",
+	       fc_port_blk_hi_thd * 2, fc_port_blk_thd * 2);
+	printf(" queue 0:         %u                 NA\n",
+	       queue[0]);
+	printf(" queue 1:         %u                 NA\n",
+	       queue[1]);
+	printf(" queue 2:         %u                 NA\n",
+	       queue[2]);
+	printf(" queue 3:         %u                 NA\n",
+	       queue[3]);
+	printf(" queue 4:         %u                 NA\n",
+	       queue[4]);
+	printf(" queue 5:         %u                 NA\n",
+	       queue[5]);
+	printf(" queue 6:         %u                 NA\n",
+	       queue[6]);
+	printf(" queue 7:         %u                 NA\n",
+	       queue[7]);
+	printf("=========================================================\n");
 }
 
 void eee_enable(int argc, char *argv[])
 {
-	unsigned long enable;
-	unsigned int value;
-	unsigned int eee_cap;
+	unsigned long enable = 0;
+	unsigned int value = 0;
+	unsigned int eee_cap = 0;
 	unsigned int eee_en_bitmap = 0;
-	unsigned long port_map;
+	unsigned long port_map = 0;
 	long port_num = -1;
-	int p;
+	int p = 0;
 
 	if (argc < 3)
 		goto error;
 
-	/*Check the input parameters is right or not.*/
+	/* Check the input parameters is right or not. */
 	if (!strncmp(argv[2], "enable", 7))
 		enable = 1;
 	else if (!strncmp(argv[2], "disable", 8))
@@ -3603,23 +3747,25 @@
 			port_map = 0;
 			for (p = 0; p < MAX_PHY_PORT; p++) {
 				if (argv[3][p] != '0' && argv[3][p] != '1') {
-					printf("portmap format error, should be combination of 0 or 1\n");
+					printf
+					    ("portmap format error, should be combination of 0 or 1\n");
 					goto error;
 				}
 				port_map |= ((argv[3][p] - '0') << p);
 			}
 		} else {
-			printf("port_no or portmap format error, should be length of 1 or 5\n");
+			printf
+			    ("port_no or portmap format error, should be length of 1 or 5\n");
 			goto error;
 		}
 	} else {
 		port_map = 0x1f;
 	}
 
-	eee_cap = (enable)? 6: 0;
+	eee_cap = (enable) ? 6 : 0;
 	for (p = 0; p < MAX_PHY_PORT; p++) {
 		/* port_map describe p0p1p2p3p4 from left to rignt */
-		if(!!(port_map & (1 << p)))
+		if (!!(port_map & (1 << p)))
 			mii_mgr_c45_write(p, 0x7, 0x3c, eee_cap);
 
 		mii_mgr_c45_read(p, 0x7, 0x3c, &value);
@@ -3642,7 +3788,7 @@
 		printf("\nCommand not support by this chip.\n");
 	}
 
-	printf("EEE(802.3az) %s", (enable)? "enable": "disable");
+	printf("EEE(802.3az) %s", (enable) ? "enable" : "disable");
 	if (argc == 4) {
 		if (port_num >= 0)
 			printf(" port%ld", port_num);
@@ -3661,9 +3807,9 @@
 
 void eee_dump(int argc, char *argv[])
 {
-	unsigned int cap, lp_cap;
+	unsigned int cap = 0, lp_cap = 0;
 	long port = -1;
-	int p;
+	int p = 0;
 
 	if (argc > 3) {
 		if (strlen(argv[3]) > 1) {
@@ -3674,7 +3820,7 @@
 		port = strtol(argv[3], (char **)NULL, 0);
 		if (port < 0 || port > MAX_PHY_PORT) {
 			printf("port# format error, should be 0 to %d\n",
-				       MAX_PHY_PORT);
+			       MAX_PHY_PORT);
 			return;
 		}
 	}
@@ -3716,7 +3862,7 @@
 	printf("\n");
 }
 
-void read_mib_counters()
+void read_mib_counters(int argc, char *argv[])
 {
 	printf("===================== %8s %8s %8s %8s %8s %8s %8s\n",
 	       "Port0", "Port1", "Port2", "Port3", "Port4", "Port5", "Port6");
@@ -3760,14 +3906,13 @@
 	dump_each_port(0x408C);
 }
 
-void clear_mib_counters()
+void clear_mib_counters(int argc, char *argv[])
 {
 	reg_write(0x4fe0, 0xf0);
-	read_mib_counters();
+	read_mib_counters(argc, argv);
 	reg_write(0x4fe0, 0x800000f0);
 }
 
-
 void exit_free()
 {
 	free(attres);
diff --git a/recipes-devtools/switch/files/src/switch_fun.h b/recipes-devtools/switch/files/src/switch_fun.h
index 70e4d18..cc16c20 100644
--- a/recipes-devtools/switch/files/src/switch_fun.h
+++ b/recipes-devtools/switch/files/src/switch_fun.h
@@ -6,6 +6,84 @@
 
 #include <stdbool.h>
 
+void (*pf_chip_func)(int argc, char *argv[]);
+
+struct switch_func_s {
+	void (*pf_table_dump)(int argc, char *argv[]);
+	void (*pf_table_clear)(int argc, char *argv[]);
+	void (*pf_switch_reset)(int argc, char *argv[]);
+	void (*pf_doArlAging)(int argc, char *argv[]);
+	void (*pf_read_mib_counters)(int argc, char *argv[]);
+	void (*pf_clear_mib_counters)(int argc, char *argv[]);
+	void (*pf_read_output_queue_counters)(int argc, char *argv[]);
+	void (*pf_read_free_page_counters)(int argc, char *argv[]);
+	void (*pf_rate_control)(int argc, char *argv[]);
+	void (*pf_igress_rate_set)(int argc, char *argv[]);
+	void (*pf_egress_rate_set)(int argc, char *argv[]);
+	void (*pf_table_add)(int argc, char *argv[]);
+	void (*pf_table_del_fid)(int argc, char *argv[]);
+	void (*pf_table_del_vid)(int argc, char *argv[]);
+	void (*pf_table_search_mac_fid)(int argc, char *argv[]);
+	void (*pf_table_search_mac_vid)(int argc, char *argv[]);
+	void (*pf_global_set_mac_fc)(int argc, char *argv[]);
+	void (*pf_set_mac_pfc)(int argc, char *argv[]);
+	void (*pf_qos_sch_select)(int argc, char *argv[]);
+	void (*pf_qos_set_base)(int argc, char *argv[]);
+	void (*pf_qos_wfq_set_weight)(int argc, char *argv[]);
+	void (*pf_qos_set_portpri)(int argc, char *argv[]);
+	void (*pf_qos_set_dscppri)(int argc, char *argv[]);
+	void (*pf_qos_pri_mapping_queue)(int argc, char *argv[]);
+	void (*pf_doStp)(int argc, char *argv[]);
+	void (*pf_sip_dump)(int argc, char *argv[]);
+	void (*pf_sip_add)(int argc, char *argv[]);
+	void (*pf_sip_del)(int argc, char *argv[]);
+	void (*pf_sip_clear)(int argc, char *argv[]);
+	void (*pf_dip_dump)(int argc, char *argv[]);
+	void (*pf_dip_add)(int argc, char *argv[]);
+	void (*pf_dip_del)(int argc, char *argv[]);
+	void (*pf_dip_clear)(int argc, char *argv[]);
+	void (*pf_set_mirror_to)(int argc, char *argv[]);
+	void (*pf_set_mirror_from)(int argc, char *argv[]);
+	void (*pf_doMirrorEn)(int argc, char *argv[]);
+	void (*pf_doMirrorPortBased)(int argc, char *argv[]);
+	void (*pf_acl_dip_add)(int argc, char *argv[]);
+	void (*pf_acl_dip_modify)(int argc, char *argv[]);
+	void (*pf_acl_dip_pppoe)(int argc, char *argv[]);
+	void (*pf_acl_dip_trtcm)(int argc, char *argv[]);
+	void (*pf_acl_dip_meter)(int argc, char *argv[]);
+	void (*pf_acl_mac_add)(int argc, char *argv[]);
+	void (*pf_acl_ethertype)(int argc, char *argv[]);
+	void (*pf_acl_sp_add)(int argc, char *argv[]);
+	void (*pf_acl_l4_add)(int argc, char *argv[]);
+	void (*pf_acl_port_enable)(int argc, char *argv[]);
+	void (*pf_acl_table_add)(int argc, char *argv[]);
+	void (*pf_acl_mask_table_add)(int argc, char *argv[]);
+	void (*pf_acl_rule_table_add)(int argc, char *argv[]);
+	void (*pf_acl_rate_table_add)(int argc, char *argv[]);
+	void (*pf_vlan_dump)(int argc, char *argv[]);
+	void (*pf_vlan_set)(int argc, char *argv[]);
+	void (*pf_vlan_clear)(int argc, char *argv[]);
+	void (*pf_doVlanSetVid)(int argc, char *argv[]);
+	void (*pf_doVlanSetPvid)(int argc, char *argv[]);
+	void (*pf_doVlanSetAccFrm)(int argc, char *argv[]);
+	void (*pf_doVlanSetPortAttr)(int argc, char *argv[]);
+	void (*pf_doVlanSetPortMode)(int argc, char *argv[]);
+	void (*pf_doVlanSetEgressTagPCR)(int argc, char *argv[]);
+	void (*pf_doVlanSetEgressTagPVC)(int argc, char *argv[]);
+	void (*pf_igmp_on)(int argc, char *argv[]);
+	void (*pf_igmp_off)(int argc, char *argv[]);
+	void (*pf_igmp_enable)(int argc, char *argv[]);
+	void (*pf_igmp_disable)(int argc, char *argv[]);
+	void (*pf_collision_pool_enable)(int argc, char *argv[]);
+	void (*pf_collision_pool_mac_dump)(int argc, char *argv[]);
+	void (*pf_collision_pool_dip_dump)(int argc, char *argv[]);
+	void (*pf_collision_pool_sip_dump)(int argc, char *argv[]);
+	void (*pf_pfc_get_rx_counter)(int argc, char *argv[]);
+	void (*pf_pfc_get_tx_counter)(int argc, char *argv[]);
+	void (*pf_eee_enable)(int argc, char *argv[]);
+	void (*pf_eee_dump)(int argc, char *argv[]);
+};
+
 #define MT7530_T10_TEST_CONTROL 0x145
 
 #define MAX_PORT 6
@@ -15,14 +93,18 @@
 extern int chip_name;
 extern struct mt753x_attr *attres;
 extern bool nl_init_flag;
+extern struct switch_func_s mt753x_switch_func;
+extern struct switch_func_s an8855_switch_func;
 
 /*basic operation*/
 int reg_read(unsigned int offset, unsigned int *value);
 int reg_write(unsigned int offset, unsigned int value);
 int mii_mgr_read(unsigned int port_num, unsigned int reg, unsigned int *value);
 int mii_mgr_write(unsigned int port_num, unsigned int reg, unsigned int value);
-int mii_mgr_c45_read(unsigned int port_num, unsigned int dev, unsigned int reg, unsigned int *value);
-int mii_mgr_c45_write(unsigned int port_num, unsigned int dev, unsigned int reg, unsigned int value);
+int mii_mgr_c45_read(unsigned int port_num, unsigned int dev, unsigned int reg,
+		     unsigned int *value);
+int mii_mgr_c45_write(unsigned int port_num, unsigned int dev, unsigned int reg,
+		      unsigned int value);
 
 /*phy setting*/
 int phy_dump(int phy_addr);
@@ -50,28 +132,28 @@
 void acl_rate_table_add(int argc, char *argv[]);
 
 /*dip table*/
-void dip_dump(void);
+void dip_dump(int argc, char *argv[]);
 void dip_add(int argc, char *argv[]);
 void dip_del(int argc, char *argv[]);
-void dip_clear(void);
+void dip_clear(int argc, char *argv[]);
 
 /*sip table*/
-void sip_dump(void);
+void sip_dump(int argc, char *argv[]);
 void sip_add(int argc, char *argv[]);
 void sip_del(int argc, char *argv[]);
-void sip_clear(void);
+void sip_clear(int argc, char *argv[]);
 
 /*stp*/
 void doStp(int argc, char *argv[]);
 
 /*mac table*/
-void table_dump(void);
+void table_dump(int argc, char *argv[]);
 void table_add(int argc, char *argv[]);
 void table_search_mac_vid(int argc, char *argv[]);
 void table_search_mac_fid(int argc, char *argv[]);
 void table_del_fid(int argc, char *argv[]);
 void table_del_vid(int argc, char *argv[]);
-void table_clear(void);
+void table_clear(int argc, char *argv[]);
 
 /*vlan table*/
 void vlan_dump(int argc, char *argv[]);
@@ -88,7 +170,7 @@
 
 /*igmp function*/
 void igmp_on(int argc, char *argv[]);
-void igmp_off();
+void igmp_off(int argc, char *argv[]);
 void igmp_disable(int argc, char *argv[]);
 void igmp_enable(int argc, char *argv[]);
 
@@ -100,11 +182,11 @@
 
 /*rate control*/
 void rate_control(int argc, char *argv[]);
-int ingress_rate_set(int on_off, unsigned int port, unsigned int bw);
-int egress_rate_set(int on_off, int port, int bw);
+void ingress_rate_set(int argc, char *argv[]);
+void egress_rate_set(int argc, char *argv[]);
 
 /*QoS*/
-int qos_sch_select(int argc, char *argv[]);
+void qos_sch_select(int argc, char *argv[]);
 void qos_set_base(int argc, char *argv[]);
 void qos_wfq_set_weight(int argc, char *argv[]);
 void qos_set_portpri(int argc, char *argv[]);
@@ -112,32 +194,32 @@
 void qos_pri_mapping_queue(int argc, char *argv[]);
 
 /*flow control*/
-int global_set_mac_fc(int argc, char *argv[]);
-int phy_set_fc(int argc, char *argv[]);
-int phy_set_an(int argc, char *argv[]);
+void global_set_mac_fc(int argc, char *argv[]);
+void phy_set_fc(int argc, char *argv[]);
+void phy_set_an(int argc, char *argv[]);
 
 /* collision pool functions */
-int collision_pool_enable(int argc, char *argv[]);
-void collision_pool_mac_dump();
-void collision_pool_dip_dump();
-void collision_pool_sip_dump();
+void collision_pool_enable(int argc, char *argv[]);
+void collision_pool_mac_dump(int argc, char *argv[]);
+void collision_pool_dip_dump(int argc, char *argv[]);
+void collision_pool_sip_dump(int argc, char *argv[]);
 
 /*pfc functions*/
-int set_mac_pfc(int argc, char *argv[]);
+void set_mac_pfc(int argc, char *argv[]);
 void pfc_get_rx_counter(int argc, char *argv[]);
 void pfc_get_tx_counter(int argc, char *argv[]);
 
 /*switch reset*/
-int switch_reset(int argc, char *argv[]);
+void switch_reset(int argc, char *argv[]);
 
 /* EEE(802.3az) function  */
 void eee_enable(int argc, char *argv[]);
 void eee_dump(int argc, char *argv[]);
 
-void read_mib_counters();
-void clear_mib_counters();
-void read_output_queue_counters();
-void read_free_page_counters();
+void read_mib_counters(int argc, char *argv[]);
+void clear_mib_counters(int argc, char *argv[]);
+void read_output_queue_counters(int argc, char *argv[]);
+void read_free_page_counters(int argc, char *argv[]);
 
 void phy_crossover(int argc, char *argv[]);
 void exit_free();
diff --git a/recipes-devtools/switch/files/src/switch_fun_an8855.c b/recipes-devtools/switch/files/src/switch_fun_an8855.c
new file mode 100644
index 0000000..e5ec490
--- /dev/null
+++ b/recipes-devtools/switch/files/src/switch_fun_an8855.c
@@ -0,0 +1,1804 @@
+/*
+* switch_fun.c: switch function sets
+*/
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdbool.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <linux/if.h>
+#include <stdbool.h>
+#include <time.h>
+
+#include "switch_extend.h"
+#include "switch_netlink.h"
+#include "switch_fun.h"
+#include "switch_fun_an8855.h"
+
+#define MAC_STR         "%02X%02X%02X%02X%02X%02X"
+#define MAC2STR(m)      (m)[0],(m)[1],(m)[2],(m)[3],(m)[4],(m)[5]
+
+const static C8_T *mac_address_forward_control_string[] = {
+	"Default",
+	"CPU include",
+	"CPU exclude",
+	"CPU only",
+	"Drop"
+};
+
+struct switch_func_s an8855_switch_func = {
+	.pf_table_dump = an8855_table_dump,
+	.pf_table_clear = an8855_table_clear,
+	.pf_switch_reset = an8855_switch_reset,
+	.pf_doArlAging = an8855_doArlAging,
+	.pf_read_mib_counters = an8855_read_mib_counters,
+	.pf_clear_mib_counters = an8855_clear_mib_counters,
+	.pf_read_output_queue_counters = an8855_read_output_queue_counters,
+	.pf_read_free_page_counters = an8855_read_free_page_counters,
+	.pf_rate_control = an8855_rate_control,
+	.pf_igress_rate_set = an8855_ingress_rate_set,
+	.pf_egress_rate_set = an8855_egress_rate_set,
+	.pf_table_add = an8855_table_add,
+	.pf_table_del_fid = an8855_table_del_fid,
+	.pf_table_del_vid = an8855_table_del_vid,
+	.pf_table_search_mac_fid = an8855_table_search_mac_fid,
+	.pf_table_search_mac_vid = an8855_table_search_mac_vid,
+	.pf_global_set_mac_fc = an8855_global_set_mac_fc,
+	.pf_set_mac_pfc = an8855_not_supported,
+	.pf_qos_sch_select = an8855_qos_sch_select,
+	.pf_qos_set_base = an8855_qos_set_base,
+	.pf_qos_wfq_set_weight = an8855_qos_wfq_set_weight,
+	.pf_qos_set_portpri = an8855_qos_set_portpri,
+	.pf_qos_set_dscppri = an8855_qos_set_dscppri,
+	.pf_qos_pri_mapping_queue = an8855_qos_pri_mapping_queue,
+	.pf_doStp = an8855_doStp,
+	.pf_sip_dump = an8855_not_supported,
+	.pf_sip_add = an8855_not_supported,
+	.pf_sip_del = an8855_not_supported,
+	.pf_sip_clear = an8855_not_supported,
+	.pf_dip_dump = an8855_not_supported,
+	.pf_dip_add = an8855_not_supported,
+	.pf_dip_del = an8855_not_supported,
+	.pf_dip_clear = an8855_not_supported,
+	.pf_set_mirror_to = an8855_set_mirror_to,
+	.pf_set_mirror_from = an8855_set_mirror_from,
+	.pf_doMirrorEn = an8855_doMirrorEn,
+	.pf_doMirrorPortBased = an8855_doMirrorPortBased,
+	.pf_acl_dip_add = an8855_not_supported,
+	.pf_acl_dip_modify = an8855_not_supported,
+	.pf_acl_dip_pppoe = an8855_not_supported,
+	.pf_acl_dip_trtcm = an8855_not_supported,
+	.pf_acl_dip_meter = an8855_not_supported,
+	.pf_acl_mac_add = an8855_not_supported,
+	.pf_acl_ethertype = an8855_not_supported,
+	.pf_acl_sp_add = an8855_not_supported,
+	.pf_acl_l4_add = an8855_not_supported,
+	.pf_acl_port_enable = an8855_not_supported,
+	.pf_acl_table_add = an8855_not_supported,
+	.pf_acl_mask_table_add = an8855_not_supported,
+	.pf_acl_rule_table_add = an8855_not_supported,
+	.pf_acl_rate_table_add = an8855_not_supported,
+	.pf_vlan_dump = an8855_vlan_dump,
+	.pf_vlan_set = an8855_vlan_set,
+	.pf_vlan_clear = an8855_vlan_clear,
+	.pf_doVlanSetVid = an8855_doVlanSetVid,
+	.pf_doVlanSetPvid = an8855_doVlanSetPvid,
+	.pf_doVlanSetAccFrm = an8855_doVlanSetAccFrm,
+	.pf_doVlanSetPortAttr = an8855_doVlanSetPortAttr,
+	.pf_doVlanSetPortMode = an8855_doVlanSetPortMode,
+	.pf_doVlanSetEgressTagPCR = an8855_doVlanSetEgressTagPCR,
+	.pf_doVlanSetEgressTagPVC = an8855_doVlanSetEgressTagPVC,
+	.pf_igmp_on = an8855_not_supported,
+	.pf_igmp_off = an8855_not_supported,
+	.pf_igmp_enable = an8855_not_supported,
+	.pf_igmp_disable = an8855_not_supported,
+	.pf_collision_pool_enable = an8855_not_supported,
+	.pf_collision_pool_mac_dump = an8855_not_supported,
+	.pf_collision_pool_dip_dump = an8855_not_supported,
+	.pf_collision_pool_sip_dump = an8855_not_supported,
+	.pf_pfc_get_rx_counter = an8855_not_supported,
+	.pf_pfc_get_tx_counter = an8855_not_supported,
+	.pf_eee_enable = an8855_eee_enable,
+	.pf_eee_dump = an8855_eee_dump,
+};
+
+AIR_ERROR_NO_T
+an8855_reg_read(const UI32_T unit, const UI32_T addr_offset, UI32_T * ptr_data)
+{
+	int ret;
+
+	ret = reg_read(addr_offset, ptr_data);
+	if (ret < 0) {
+		return AIR_E_OTHERS;
+	}
+
+	return AIR_E_OK;
+}
+
+AIR_ERROR_NO_T
+an8855_reg_write(const UI32_T unit, const UI32_T addr_offset, const UI32_T data)
+{
+	int ret;
+
+	ret = reg_write(addr_offset, data);
+	if (ret < 0) {
+		return AIR_E_OTHERS;
+	}
+
+	return AIR_E_OK;
+}
+
+AIR_ERROR_NO_T
+an8855_phy_cl22_read(const UI32_T unit,
+		     const UI32_T port_id,
+		     const UI32_T addr_offset, UI32_T * ptr_data)
+{
+	int ret;
+
+	ret = mii_mgr_read(port_id, addr_offset, ptr_data);
+	if (ret < 0) {
+		return AIR_E_OTHERS;
+	}
+
+	return AIR_E_OK;
+}
+
+AIR_ERROR_NO_T
+an8855_phy_cl22_write(const UI32_T unit,
+		      const UI32_T port_id,
+		      const UI32_T addr_offset, const UI32_T data)
+{
+	int ret;
+
+	ret = mii_mgr_write(port_id, addr_offset, data);
+	if (ret < 0) {
+		return AIR_E_OTHERS;
+	}
+
+	return AIR_E_OK;
+}
+
+AIR_ERROR_NO_T
+an8855_phy_cl45_read(const UI32_T unit,
+		     const UI32_T port_id,
+		     const UI32_T dev_type,
+		     const UI32_T addr_offset, UI32_T * ptr_data)
+{
+	int ret;
+
+	ret = mii_mgr_c45_read(port_id, dev_type, addr_offset, ptr_data);
+	if (ret < 0) {
+		return AIR_E_OTHERS;
+	}
+
+	return AIR_E_OK;
+}
+
+AIR_ERROR_NO_T
+an8855_phy_cl45_write(const UI32_T unit,
+		      const UI32_T port_id,
+		      const UI32_T dev_type,
+		      const UI32_T addr_offset, const UI32_T data)
+{
+	int ret;
+
+	ret = mii_mgr_c45_write(port_id, dev_type, addr_offset, data);
+	if (ret < 0) {
+		return AIR_E_OTHERS;
+	}
+
+	return AIR_E_OK;
+}
+
+void an8855_not_supported(int argc, char *argv[])
+{
+	printf("Cmd not supported by AN8855.\n");
+}
+
+static AIR_ERROR_NO_T
+_printMacEntry(AIR_MAC_ENTRY_T * mt, UI32_T age_unit, UI8_T count, UI8_T title)
+{
+	AIR_ERROR_NO_T ret = AIR_E_OK;
+	I32_T i = 0, j = 0;
+	UI8_T first = 0;
+	UI8_T find = 0;
+	if (title) {
+		printf("%-6s%-15s%-5s%-5s%-5s%-10s%-10s%-6s\n",
+		       "unit",
+		       "mac",
+		       "ivl", "vid", "fid", "age-time", "forward", "port");
+		return ret;
+	}
+	for (i = 0; i < count; i++) {
+		printf("%-6d", age_unit);
+		printf(MAC_STR, MAC2STR(mt[i].mac));
+		printf("...");
+		if (mt[i].flags & AIR_L2_MAC_ENTRY_FLAGS_IVL) {
+			printf("%-3s..", "ivl");
+			printf("%-5d", mt[i].cvid);
+			printf("%-5s", ".....");
+		} else {
+			printf("%-3s..", "svl");
+			printf("%-5s", ".....");
+			printf("%-5d", mt[i].fid);
+		}
+		if (mt[i].flags & AIR_L2_MAC_ENTRY_FLAGS_STATIC) {
+			printf("%-7s.", "static");
+		} else {
+			printf("%d sec..", mt[i].timer);
+		}
+		printf("%-10s",
+		       mac_address_forward_control_string[mt[i].sa_fwd]);
+		first = 0;
+		find = 0;
+		for (j = (AIR_MAX_NUM_OF_PORTS - 1); j >= 0; j--) {
+			if ((mt[i].port_bitmap[0]) & (1 << j)) {
+				first = j;
+				find = 1;
+				break;
+			}
+		}
+		if (find) {
+			for (j = 0; j < AIR_MAX_NUM_OF_PORTS; j++) {
+				if ((mt[i].port_bitmap[0]) & (1 << j)) {
+					if (j == first)
+						printf("%-2d", j);
+					else
+						printf("%-2d,", j);
+				}
+			}
+		} else
+			printf("no dst port");
+		printf("\n");
+	}
+	return ret;
+}
+
+static AIR_ERROR_NO_T _str2mac(C8_T * str, C8_T * mac)
+{
+	UI32_T i;
+	C8_T tmpstr[3];
+
+	for (i = 0; i < 6; i++) {
+		strncpy(tmpstr, str + (i * 2), 2);
+		tmpstr[2] = '\0';
+		mac[i] = strtoul(tmpstr, NULL, 16);
+	}
+
+	return AIR_E_OK;
+}
+
+static void an8855_table_dump_internal(int type)
+{
+	unsigned char count = 0;
+	unsigned int total_count = 0;
+	unsigned int bucket_size = 0;
+	AIR_ERROR_NO_T ret = 0;
+	AIR_MAC_ENTRY_T *ptr_mt;
+
+	bucket_size = AIR_L2_MAC_SET_NUM;
+	ptr_mt = malloc(sizeof(AIR_MAC_ENTRY_T) * bucket_size);
+	if (ptr_mt == NULL) {
+		printf("Error, malloc fail\n\r");
+		return;
+	}
+	memset(ptr_mt, 0, sizeof(AIR_MAC_ENTRY_T) * bucket_size);
+	_printMacEntry(ptr_mt, 0, count, TRUE);
+	/* get 1st entry of MAC table */
+	ret = air_l2_getMacAddr(0, &count, ptr_mt);
+	switch (ret) {
+	case AIR_E_ENTRY_NOT_FOUND:
+		printf("Not Found!\n");
+		goto DUMP_ERROR;
+	case AIR_E_TIMEOUT:
+		printf("Time Out!\n");
+		goto DUMP_ERROR;
+	case AIR_E_BAD_PARAMETER:
+		printf("Bad Parameter!\n");
+		goto DUMP_ERROR;
+	default:
+		break;
+	}
+	total_count += count;
+	_printMacEntry(ptr_mt, 0, count, FALSE);
+	/* get other entries of MAC table */
+	while (1) {
+		memset(ptr_mt, 0, sizeof(AIR_MAC_ENTRY_T) * bucket_size);
+		ret = air_l2_getNextMacAddr(0, &count, ptr_mt);
+		if (AIR_E_OK != ret) {
+			break;
+		}
+		total_count += count;
+		_printMacEntry(ptr_mt, 0, count, FALSE);
+	}
+	switch (ret) {
+	case AIR_E_TIMEOUT:
+		printf("Time Out!\n");
+		break;
+	case AIR_E_BAD_PARAMETER:
+		printf("Bad Parameter!\n");
+		break;
+	default:
+		printf("Found %u %s\n", total_count,
+		       (total_count > 1) ? "entries" : "entry");
+		break;
+	}
+
+DUMP_ERROR:
+	free(ptr_mt);
+	return;
+}
+
+void an8855_table_dump(int argc, char *argv[])
+{
+	an8855_table_dump_internal(GENERAL_TABLE);
+}
+
+void an8855_table_add(int argc, char *argv[])
+{
+	AIR_ERROR_NO_T ret = AIR_E_OK;
+	AIR_MAC_ENTRY_T mt;
+	unsigned int i = 0;
+	unsigned int age_time = 0;
+	memset(&mt, 0, sizeof(AIR_MAC_ENTRY_T));
+	if (!argv[2] || strlen(argv[2]) != 12) {
+		printf("MAC address format error, should be of length 12\n");
+		return;
+	}
+	ret = _str2mac(argv[2], (C8_T *) mt.mac);
+	if (ret != AIR_E_OK) {
+		printf("Unrecognized command.\n");
+		return;
+	}
+	if (argc > 4) {
+		mt.cvid = strtoul(argv[4], NULL, 0);
+		if (4095 < mt.cvid) {
+			printf("wrong vid range, should be within 0~4095\n");
+			return;
+		}
+		mt.flags |= AIR_L2_MAC_ENTRY_FLAGS_IVL;
+	}
+	if (!argv[3] || strlen(argv[3]) != 6) {
+		/*bit0~5, each map port0~port5 */
+		printf("portmap format error, should be of length 6\n");
+		return;
+	}
+	for (i = 0; i < 6; i++) {
+		if (argv[3][i] != '0' && argv[3][i] != '1') {
+			printf
+			    ("portmap format error, should be of combination of 0 or 1\n");
+			return;
+		}
+		mt.port_bitmap[0] |= ((argv[3][i] - '0') << i);
+	}
+	if (argc > 5) {
+		age_time = strtoul(argv[5], NULL, 0);
+		if (age_time < 1 || 1000000 < age_time) {
+			printf("wrong age range, should be within 1~1000000\n");
+			return;
+		}
+	} else {
+		mt.flags |= AIR_L2_MAC_ENTRY_FLAGS_STATIC;
+	}
+	mt.sa_fwd = AIR_L2_FWD_CTRL_DEFAULT;
+	ret = air_l2_addMacAddr(0, &mt);
+	if (ret == AIR_E_OK) {
+		printf("add mac address done.\n");
+		usleep(5000);
+		if (!(mt.flags & AIR_L2_MAC_ENTRY_FLAGS_STATIC)) {
+			ret = air_l2_setMacAddrAgeOut(0, age_time);
+			if (ret == AIR_E_OK) {
+				printf("set age out time done.\n");
+			} else {
+				printf("set age out time fail.\n");
+			}
+		}
+	} else {
+		printf("add mac address fail.\n");
+	}
+	return;
+}
+
+void an8855_table_search_mac_vid(int argc, char *argv[])
+{
+	AIR_ERROR_NO_T ret = AIR_E_OK;
+	unsigned char count = 0;
+	char tmpstr[9];
+	AIR_MAC_ENTRY_T *ptr_mt;
+
+	if (!argv[3] || strlen(argv[3]) != 12) {
+		printf("MAC address format error, should be of length 12\n");
+		return;
+	}
+
+	ptr_mt = malloc(sizeof(AIR_MAC_ENTRY_T));
+	if (NULL == ptr_mt) {
+		printf("Error, malloc fail\n");
+		return;
+	}
+	memset(ptr_mt, 0, sizeof(AIR_MAC_ENTRY_T));
+	ret = _str2mac(argv[3], (C8_T *) ptr_mt->mac);
+	if (ret != AIR_E_OK) {
+		printf("Unrecognized command.\n");
+		free(ptr_mt);
+		return;
+	}
+
+	/* get mac entry by MAC address & vid */
+	ptr_mt->cvid = strtoul(argv[5], NULL, 0);
+	ptr_mt->flags |= AIR_L2_MAC_ENTRY_FLAGS_IVL;
+	if (ptr_mt->cvid > 4095) {
+		printf("wrong vid range, should be within 0~4095\n");
+		free(ptr_mt);
+		return;
+	}
+
+	ret = air_l2_getMacAddr(0, &count, ptr_mt);
+	if (ret == AIR_E_OK) {
+		_printMacEntry(ptr_mt, 0, 1, TRUE);
+		_printMacEntry(ptr_mt, 0, 1, FALSE);
+	} else {
+		printf("\n Not found!\n");
+	}
+	free(ptr_mt);
+	return;
+}
+
+void an8855_table_search_mac_fid(int argc, char *argv[])
+{
+	AIR_ERROR_NO_T ret = AIR_E_OK;
+	unsigned char count = 0;
+	char tmpstr[9];
+	AIR_MAC_ENTRY_T *ptr_mt;
+
+	if (!argv[3] || strlen(argv[3]) != 12) {
+		printf("MAC address format error, should be of length 12\n");
+		return;
+	}
+
+	ptr_mt = malloc(sizeof(AIR_MAC_ENTRY_T));
+	if (NULL == ptr_mt) {
+		printf("Error, malloc fail\n");
+		return;
+	}
+	memset(ptr_mt, 0, sizeof(AIR_MAC_ENTRY_T));
+	ret = _str2mac(argv[3], (C8_T *) ptr_mt->mac);
+	if (ret != AIR_E_OK) {
+		printf("Unrecognized command.\n");
+		free(ptr_mt);
+		return;
+	}
+
+	/* get mac entry by MAC address & fid */
+	ptr_mt->fid = strtoul(argv[5], NULL, 0);
+	if (ptr_mt->fid > 7) {
+		printf("wrong fid range, should be within 0~7\n");
+		free(ptr_mt);
+		return;
+	}
+
+	ret = air_l2_getMacAddr(0, &count, ptr_mt);
+	if (ret == AIR_E_OK) {
+		_printMacEntry(ptr_mt, 0, 1, TRUE);
+		_printMacEntry(ptr_mt, 0, 1, FALSE);
+	} else {
+		printf("\n Not found!\n");
+	}
+	free(ptr_mt);
+	return;
+}
+
+void an8855_table_del_fid(int argc, char *argv[])
+{
+	AIR_ERROR_NO_T ret = AIR_E_OK;
+	char tmpstr[9];
+	AIR_MAC_ENTRY_T mt;
+
+	if (!argv[3] || strlen(argv[3]) != 12) {
+		printf("MAC address format error, should be of length 12\n");
+		return;
+	}
+
+	memset(&mt, 0, sizeof(AIR_MAC_ENTRY_T));
+	ret = _str2mac(argv[3], (C8_T *) mt.mac);
+	if (ret != AIR_E_OK) {
+		printf("Unrecognized command.\n");
+		return;
+	}
+
+	/* get mac entry by MAC address & fid */
+	mt.fid = strtoul(argv[5], NULL, 0);
+	if (mt.fid > 7) {
+		printf("wrong fid range, should be within 0~7\n");
+		return;
+	}
+
+	ret = air_l2_delMacAddr(0, &mt);
+	if (ret == AIR_E_OK) {
+		printf("Done.\n");
+	} else {
+		printf("Fail.\n");
+	}
+	return;
+}
+
+void an8855_table_del_vid(int argc, char *argv[])
+{
+	AIR_ERROR_NO_T ret = AIR_E_OK;
+	char tmpstr[9];
+	AIR_MAC_ENTRY_T mt;
+
+	if (!argv[3] || strlen(argv[3]) != 12) {
+		printf("MAC address format error, should be of length 12\n");
+		return;
+	}
+
+	memset(&mt, 0, sizeof(AIR_MAC_ENTRY_T));
+	ret = _str2mac(argv[3], (C8_T *) mt.mac);
+	if (ret != AIR_E_OK) {
+		printf("Unrecognized command.\n");
+		return;
+	}
+
+	/* get mac entry by MAC address & vid */
+	mt.cvid = strtoul(argv[5], NULL, 0);
+	mt.flags |= AIR_L2_MAC_ENTRY_FLAGS_IVL;
+	if (mt.cvid > 4095) {
+		printf("wrong vid range, should be within 0~4095\n");
+		return;
+	}
+
+	ret = air_l2_delMacAddr(0, &mt);
+	if (ret == AIR_E_OK) {
+		printf("Done.\n");
+	} else {
+		printf("Fail.\n");
+	}
+	return;
+}
+
+void an8855_table_clear(int argc, char *argv[])
+{
+	AIR_ERROR_NO_T ret = AIR_E_OK;
+
+	ret = air_l2_clearMacAddr(0);
+	if (ret == AIR_E_OK)
+		printf("Clear MAC Address Table Done.\n");
+	else
+		printf("Clear MAC Address Table Fail.\n");
+	return;
+}
+
+void an8855_set_mirror_to(int argc, char *argv[])
+{
+	int idx;
+	AIR_MIR_SESSION_T session = { 0 };
+
+	idx = strtoul(argv[3], NULL, 0);
+	if (idx < 0 || MAX_PORT < idx) {
+		printf("wrong port member, should be within 0~%d\n", MAX_PORT);
+		return;
+	}
+
+	memset(&session, 0, sizeof(AIR_MIR_SESSION_T));
+
+	air_mir_getSession(0, 0, &session);
+	session.dst_port = idx;
+	session.flags |= AIR_MIR_SESSION_FLAGS_ENABLE;
+	air_mir_addSession(0, 0, &session);
+}
+
+void an8855_set_mirror_from(int argc, char *argv[])
+{
+	int idx = 0, mirror = 0;
+	AIR_MIR_SESSION_T session = { 0 };
+
+	idx = _strtoul(argv[3], NULL, 0);
+	mirror = _strtoul(argv[4], NULL, 0);
+
+	if (idx < 0 || MAX_PORT < idx) {
+		printf("wrong port member, should be within 0~%d\n", MAX_PORT);
+		return;
+	}
+
+	if (mirror < 0 || 3 < mirror) {
+		printf("wrong mirror setting, should be within 0~3\n");
+		return;
+	}
+
+	memset(&session, 0, sizeof(AIR_MIR_SESSION_T));
+
+	if (mirror & 0x1) {	// rx enable
+		session.src_port = idx;
+		air_mir_getMirrorPort(0, 0, &session);
+
+		session.flags |= AIR_MIR_SESSION_FLAGS_DIR_RX;
+		session.src_port = idx;
+		air_mir_setMirrorPort(0, 0, &session);
+	}
+
+	if (mirror & 0x2) {	//tx enable
+		session.src_port = idx;
+		air_mir_getMirrorPort(0, 0, &session);
+
+		session.flags |= AIR_MIR_SESSION_FLAGS_DIR_TX;
+		session.src_port = idx;
+		air_mir_setMirrorPort(0, 0, &session);
+	}
+}
+
+void an8855_vlan_dump(int argc, char *argv[])
+{
+	AIR_VLAN_ENTRY_T vlan_entry = { 0 };
+	unsigned int i;
+	int eg_tag = 0;
+
+	if (argc == 4) {
+		if (!strncmp(argv[3], "egtag", 6))
+			eg_tag = 1;
+	}
+
+	if (eg_tag)
+		printf
+		    ("  vid  fid  portmap    s-tag\teg_tag(0:untagged 2:tagged)\n");
+	else
+		printf("  vid  fid  portmap    s-tag\n");
+
+	for (i = 1; i < 4096; i++) {
+		_air_vlan_readEntry(0, i, &vlan_entry);
+
+		if (vlan_entry.valid) {
+			printf(" %4d  ", i);
+			printf(" %2d ", vlan_entry.vlan_entry_format.fid);
+			printf(" %c",
+			       (vlan_entry.
+				vlan_entry_format.port_mem & 0b0000001) ? '1' :
+			       '-');
+			printf("%c",
+			       (vlan_entry.
+				vlan_entry_format.port_mem & 0b0000010) ? '1' :
+			       '-');
+			printf("%c",
+			       (vlan_entry.
+				vlan_entry_format.port_mem & 0b0000100) ? '1' :
+			       '-');
+			printf("%c",
+			       (vlan_entry.
+				vlan_entry_format.port_mem & 0b0001000) ? '1' :
+			       '-');
+			printf("%c",
+			       (vlan_entry.
+				vlan_entry_format.port_mem & 0b0010000) ? '1' :
+			       '-');
+			printf("%c",
+			       (vlan_entry.
+				vlan_entry_format.port_mem & 0b0100000) ? '1' :
+			       '-');
+			printf("%c",
+			       (vlan_entry.
+				vlan_entry_format.port_mem & 0b1000000) ? '1' :
+			       '-');
+			printf("    %4d", vlan_entry.vlan_entry_format.eg_ctrl);
+			if (eg_tag) {
+				printf("\t");
+				if (vlan_entry.vlan_entry_format.eg_con
+				    && vlan_entry.
+				    vlan_entry_format.eg_ctrl_en) {
+					/* VTAG_EN=1 and EG_CON=1 */
+					printf("CONSISTENT");
+				} else if (vlan_entry.
+					   vlan_entry_format.eg_ctrl_en) {
+					/* VTAG_EN=1 */
+					printf("%d",
+					       (vlan_entry.
+						vlan_entry_format.eg_ctrl >> 0)
+					       & 0x3);
+					printf("%d",
+					       (vlan_entry.
+						vlan_entry_format.eg_ctrl >> 2)
+					       & 0x3);
+					printf("%d",
+					       (vlan_entry.
+						vlan_entry_format.eg_ctrl >> 4)
+					       & 0x3);
+					printf("%d",
+					       (vlan_entry.
+						vlan_entry_format.eg_ctrl >> 6)
+					       & 0x3);
+					printf("%d",
+					       (vlan_entry.
+						vlan_entry_format.eg_ctrl >> 8)
+					       & 0x3);
+					printf("%d",
+					       (vlan_entry.
+						vlan_entry_format.eg_ctrl >> 10)
+					       & 0x3);
+					printf("%d",
+					       (vlan_entry.
+						vlan_entry_format.eg_ctrl >> 12)
+					       & 0x3);
+				} else {
+					/* VTAG_EN=0 */
+					printf("DISABLED");
+				}
+			}
+			printf("\n");
+		} else {
+			/*print 16 vid for reference information */
+			if (i <= 16) {
+				printf(" %4d  ", i);
+				printf(" %2d ",
+				       vlan_entry.vlan_entry_format.fid);
+				printf(" invalid\n");
+			}
+		}
+	}
+}
+
+void an8855_vlan_clear(int argc, char *argv[])
+{
+	air_vlan_destroyAll(0, 0);
+}
+
+void an8855_vlan_set(int argc, char *argv[])
+{
+	unsigned int vlan_mem = 0;
+	int i, vid, fid;
+	int stag = 0;
+	unsigned long eg_con = 0;
+	unsigned int eg_tag = 0;
+	AIR_VLAN_ENTRY_T vlan_entry = { 0 };
+
+	if (argc < 5) {
+		printf("insufficient arguments!\n");
+		return;
+	}
+
+	fid = strtoul(argv[3], NULL, 0);
+	if (fid < 0 || fid > 7) {
+		printf("wrong filtering db id range, should be within 0~7\n");
+		return;
+	}
+
+	vid = strtoul(argv[4], NULL, 0);
+	if (vid < 0 || MAX_VID_VALUE < vid) {
+		printf("wrong vlan id range, should be within 0~4095\n");
+		return;
+	}
+
+	if (strlen(argv[5]) != SWITCH_MAX_PORT) {
+		printf("portmap format error, should be of length %d\n",
+		       SWITCH_MAX_PORT);
+		return;
+	}
+
+	vlan_mem = 0;
+	for (i = 0; i < SWITCH_MAX_PORT; i++) {
+		if (argv[5][i] != '0' && argv[5][i] != '1') {
+			printf
+			    ("portmap format error, should be of combination of 0 or 1\n");
+			return;
+		}
+		vlan_mem += (argv[5][i] - '0') * (1 << i);
+	}
+
+	/* VLAN stag */
+	if (argc > 6) {
+		stag = strtoul(argv[6], NULL, 16);
+		if (stag < 0 || 0xfff < stag) {
+			printf
+			    ("wrong stag id range, should be within 0~4095\n");
+			return;
+		}
+	}
+
+	/* set vlan member */
+	vlan_entry.vlan_entry_format.port_mem = vlan_mem;
+	vlan_entry.vlan_entry_format.ivl = 1;
+	vlan_entry.vlan_entry_format.stag = stag;
+	vlan_entry.valid = 1;
+
+	if (argc > 7) {
+		eg_con = strtoul(argv[7], NULL, 2);
+		eg_con = ! !eg_con;
+		vlan_entry.vlan_entry_format.eg_con = eg_con;
+		vlan_entry.vlan_entry_format.eg_ctrl_en = 1;
+	}
+
+	if (argc > 8 && !eg_con) {
+		if (strlen(argv[8]) != SWITCH_MAX_PORT) {
+			printf
+			    ("egtag portmap format error, should be of length %d\n",
+			     SWITCH_MAX_PORT);
+			return;
+		}
+
+		for (i = 0; i < SWITCH_MAX_PORT; i++) {
+			if (argv[8][i] < '0' || argv[8][i] > '3') {
+				printf
+				    ("egtag portmap format error, should be of combination of 0 or 3\n");
+				return;
+			}
+			eg_tag |= (argv[8][i] - '0') << (i * 2);
+		}
+
+		vlan_entry.vlan_entry_format.eg_ctrl_en = 1;
+		vlan_entry.vlan_entry_format.eg_ctrl = eg_tag;
+	}
+
+	_air_vlan_writeEntry(0, vid, &vlan_entry);
+}
+
+void an8855_switch_reset(int argc, char *argv[])
+{
+	air_switch_reset(0);
+}
+
+void an8855_global_set_mac_fc(int argc, char *argv[])
+{
+	unsigned char enable = 0;
+	unsigned int reg = 0, value = 0;
+
+	enable = _strtoul(argv[3], NULL, 10);
+	printf("enable: %d\n", enable);
+
+	/* Check the input parameters is right or not. */
+	if (enable > 1) {
+		printf(HELP_MACCTL_FC);
+		return;
+	}
+	reg_read(0x10207e04, &value);
+	value &= (~(1 << 31));
+	value |= (enable << 31);
+	reg_write(0x10207e04, value);
+}				/*end mac_set_fc */
+
+void an8855_qos_sch_select(int argc, char *argv[])
+{
+	unsigned char port, queue;
+	unsigned char type = 0;
+	unsigned int value, reg;
+
+	if (argc < 7)
+		return;
+
+	port = _strtoul(argv[3], NULL, 10);
+	queue = _strtoul(argv[4], NULL, 10);
+	type = _strtoul(argv[6], NULL, 10);
+
+	if (port > 6 || queue > 7) {
+		printf("\n Illegal input parameters\n");
+		return;
+	}
+
+	if ((type != 0 && type != 1 && type != 2)) {
+		printf(HELP_QOS_TYPE);
+		return;
+	}
+
+	printf("\r\nswitch qos type: %d.\n", type);
+
+	if (type == 0) {
+		air_qos_setScheduleAlgo(0, port, queue, AIR_QOS_SCH_MODE_WRR,
+					1);
+	} else if (type == 1) {
+		air_qos_setScheduleAlgo(0, port, queue, AIR_QOS_SCH_MODE_SP, 1);
+	} else {
+		air_qos_setScheduleAlgo(0, port, queue, AIR_QOS_SCH_MODE_WFQ,
+					1);
+	}
+}
+
+void an8855_get_upw(unsigned int *value, unsigned char base)
+{
+	*value &= (~((0x7 << 0) | (0x7 << 4) | (0x7 << 8) | (0x7 << 12) |
+		     (0x7 << 16) | (0x7 << 20)));
+	switch (base) {
+	case 0:		/* port-based 0x2x40[18:16] */
+		*value |= ((0x2 << 0) | (0x2 << 4) | (0x2 << 8) |
+			   (0x2 << 12) | (0x7 << 16) | (0x2 << 20));
+		break;
+	case 1:		/* tagged-based 0x2x40[10:8] */
+		*value |= ((0x2 << 0) | (0x2 << 4) | (0x7 << 8) |
+			   (0x2 << 12) | (0x2 << 16) | (0x2 << 20));
+		break;
+	case 2:		/* DSCP-based 0x2x40[14:12] */
+		*value |= ((0x2 << 0) | (0x2 << 4) | (0x2 << 8) |
+			   (0x7 << 12) | (0x2 << 16) | (0x2 << 20));
+		break;
+	case 3:		/* acl-based 0x2x40[2:0] */
+		*value |= ((0x7 << 0) | (0x2 << 4) | (0x2 << 8) |
+			   (0x2 << 12) | (0x2 << 16) | (0x2 << 20));
+		break;
+	case 4:		/* arl-based 0x2x40[22:20] */
+		*value |= ((0x2 << 0) | (0x2 << 4) | (0x2 << 8) |
+			   (0x2 << 12) | (0x2 << 16) | (0x7 << 20));
+		break;
+	case 5:		/* stag-based 0x2x40[6:4] */
+		*value |= ((0x2 << 0) | (0x7 << 4) | (0x2 << 8) |
+			   (0x2 << 12) | (0x2 << 16) | (0x2 << 20));
+		break;
+	default:
+		break;
+	}
+}
+
+void an8855_qos_set_base(int argc, char *argv[])
+{
+	unsigned char base = 0;
+	unsigned char port;
+	unsigned int value;
+
+	if (argc < 5)
+		return;
+
+	port = _strtoul(argv[3], NULL, 10);
+	base = _strtoul(argv[4], NULL, 10);
+
+	if (base > 6) {
+		printf(HELP_QOS_BASE);
+		return;
+	}
+
+	if (port > 6) {
+		printf("Illegal port index:%d\n", port);
+		return;
+	}
+
+	printf("\r\nswitch qos base : %d. (port-based:0, tag-based:1,\
+		dscp-based:2, acl-based:3, arl-based:4, stag-based:5)\n", base);
+	reg_read(0x10208030 + 0x200 * port, &value);
+	an8855_get_upw(&value, base);
+	reg_write(0x10208030 + 0x200 * port, value);
+}
+
+void an8855_qos_wfq_set_weight(int argc, char *argv[])
+{
+	int port, weight[8], i;
+	unsigned char queue;
+	unsigned int reg = 0, value = 0;
+
+	port = _strtoul(argv[3], NULL, 10);
+
+	for (i = 0; i < 8; i++) {
+		weight[i] = _strtoul(argv[i + 4], NULL, 10);
+	}
+
+	/* MT7530 total 7 port */
+	if (port < 0 || port > 6) {
+		printf(HELP_QOS_PORT_WEIGHT);
+		return;
+	}
+
+	for (i = 0; i < 8; i++) {
+		if (weight[i] < 1 || weight[i] > 16) {
+			printf(HELP_QOS_PORT_WEIGHT);
+			return;
+		}
+	}
+	printf("port: %x, q0: %x, q1: %x, q2: %x, q3: %x, \
+		q4: %x, q5: %x, q6: %x, q7: %x\n", port, weight[0], weight[1], weight[2], weight[3], weight[4], weight[5], weight[6], weight[7]);
+
+	for (queue = 0; queue < 8; queue++) {
+		air_qos_setScheduleAlgo(0, port, queue, AIR_QOS_SCH_MODE_WFQ,
+					weight[queue]);
+	}
+}
+
+void an8855_qos_set_portpri(int argc, char *argv[])
+{
+	unsigned char port = 0, prio = 0;
+	unsigned int value = 0;
+
+	port = _strtoul(argv[3], NULL, 10);
+	prio = _strtoul(argv[4], NULL, 10);
+
+	if (port >= 7 || prio > 7) {
+		printf(HELP_QOS_PORT_PRIO);
+		return;
+	}
+
+	air_qos_setPortPriority(0, port, prio);
+}
+
+void an8855_qos_set_dscppri(int argc, char *argv[])
+{
+	unsigned char prio = 0, dscp = 0, pim_n = 0, pim_offset = 0;
+	unsigned int reg = 0, value = 0;
+
+	dscp = _strtoul(argv[3], NULL, 10);
+	prio = _strtoul(argv[4], NULL, 10);
+
+	if (dscp > 63 || prio > 7) {
+		printf(HELP_QOS_DSCP_PRIO);
+		return;
+	}
+
+	air_qos_setDscp2Pri(0, dscp, prio);
+}
+
+void an8855_qos_pri_mapping_queue(int argc, char *argv[])
+{
+	unsigned char prio = 0, queue = 0, pem_n = 0, port = 0;
+	unsigned int reg = 0, value = 0;
+
+	if (argc < 6)
+		return;
+
+	port = _strtoul(argv[3], NULL, 10);
+	prio = _strtoul(argv[4], NULL, 10);
+	queue = _strtoul(argv[5], NULL, 10);
+
+	if (prio > 7 || queue > 7) {
+		printf(HELP_QOS_PRIO_QMAP);
+		return;
+	}
+
+	air_qos_setPri2Queue(0, prio, queue);
+}
+
+void an8855_doVlanSetPvid(int argc, char *argv[])
+{
+	unsigned char port = 0;
+	unsigned short pvid = 0;
+
+	port = _strtoul(argv[3], NULL, 10);
+	pvid = _strtoul(argv[4], NULL, 10);
+	/*Check the input parameters is right or not. */
+	if ((port >= SWITCH_MAX_PORT) || (pvid > MAX_VID_VALUE)) {
+		printf(HELP_VLAN_PVID);
+		return;
+	}
+
+	air_vlan_setPortPVID(0, port, pvid);
+
+	printf("port:%d pvid:%d,vlancap: max_port:%d maxvid:%d\r\n",
+	       port, pvid, SWITCH_MAX_PORT, MAX_VID_VALUE);
+}				/*end doVlanSetPvid */
+
+void an8855_doVlanSetVid(int argc, char *argv[])
+{
+	unsigned char index = 0;
+	unsigned char active = 0;
+	unsigned char portMap = 0;
+	unsigned char tagPortMap = 0;
+	unsigned short vid = 0;
+
+	unsigned char ivl_en = 0;
+	unsigned char fid = 0;
+	unsigned short stag = 0;
+	int i = 0;
+	AIR_VLAN_ENTRY_T vlan_entry = { 0 };
+
+	index = _strtoul(argv[3], NULL, 10);
+	active = _strtoul(argv[4], NULL, 10);
+	vid = _strtoul(argv[5], NULL, 10);
+
+	/*Check the input parameters is right or not. */
+	if ((index >= MAX_VLAN_RULE) || (vid >= 4096) || (active > ACTIVED)) {
+		printf(HELP_VLAN_VID);
+		return;
+	}
+
+	/*CPU Port is always the membership */
+	portMap = _strtoul(argv[6], NULL, 10);
+	tagPortMap = _strtoul(argv[7], NULL, 10);
+
+	printf("subcmd parameter argc = %d\r\n", argc);
+	if (argc >= 9) {
+		ivl_en = _strtoul(argv[8], NULL, 10);
+		if (argc >= 10) {
+			fid = _strtoul(argv[9], NULL, 10);
+			if (argc >= 11)
+				stag = _strtoul(argv[10], NULL, 10);
+		}
+	}
+
+	printf("index: %x, active: %x, vid: %x, portMap: %x, \
+		tagPortMap: %x, ivl_en: %x, fid: %x, stag: %x\n", index, active, vid, portMap, tagPortMap, ivl_en, fid, stag);
+
+	vlan_entry.valid = ! !active;
+	vlan_entry.vlan_entry_format.port_mem = portMap;
+	/* Total 6 ports */
+	for (i = 0; i < SWITCH_MAX_PORT; i++) {
+		if (tagPortMap & (1 << i))
+			vlan_entry.vlan_entry_format.eg_ctrl |= 0x2 << (i * 2);
+	}
+	vlan_entry.vlan_entry_format.ivl = ! !ivl_en;
+	vlan_entry.vlan_entry_format.fid = fid;
+	vlan_entry.vlan_entry_format.stag = stag;
+
+	_air_vlan_writeEntry(0, vid, &vlan_entry);
+
+	printf("index:%d active:%d vid:%d\r\n", index, active, vid);
+}				/*end doVlanSetVid */
+
+void an8855_doVlanSetAccFrm(int argc, char *argv[])
+{
+	unsigned char port = 0;
+	unsigned char type = 0;
+	AIR_VLAN_ACCEPT_FRAME_TYPE_T type_t = AIR_VLAN_ACCEPT_FRAME_TYPE_ALL;
+
+	port = _strtoul(argv[3], NULL, 10);
+	type = _strtoul(argv[4], NULL, 10);
+
+	printf("port: %d, type: %d\n", port, type);
+
+	/*Check the input parameters is right or not. */
+	if ((port > SWITCH_MAX_PORT) || (type > REG_PVC_ACC_FRM_RELMASK)) {
+		printf(HELP_VLAN_ACC_FRM);
+		return;
+	}
+
+	type_t = (AIR_VLAN_ACCEPT_FRAME_TYPE_T) type;
+	air_vlan_setPortAcceptFrameType(0, port, type_t);
+}				/*end doVlanSetAccFrm */
+
+void an8855_doVlanSetPortAttr(int argc, char *argv[])
+{
+	unsigned char port = 0;
+	unsigned char attr = 0;
+	AIR_VLAN_PORT_ATTR_T attr_t = AIR_VLAN_PORT_ATTR_USER_PORT;
+
+	port = _strtoul(argv[3], NULL, 10);
+	attr = _strtoul(argv[4], NULL, 10);
+
+	printf("port: %x, attr: %x\n", port, attr);
+
+	/*Check the input parameters is right or not. */
+	if (port > SWITCH_MAX_PORT || attr > 3) {
+		printf(HELP_VLAN_PORT_ATTR);
+		return;
+	}
+
+	attr_t = (AIR_VLAN_PORT_ATTR_T) attr;
+	air_vlan_setPortAttr(0, port, attr_t);
+}
+
+void an8855_doVlanSetPortMode(int argc, char *argv[])
+{
+	unsigned char port = 0;
+	unsigned char mode = 0;
+	AIR_PORT_VLAN_MODE_T mode_t = AIR_PORT_VLAN_MODE_PORT_MATRIX;
+
+	port = _strtoul(argv[3], NULL, 10);
+	mode = _strtoul(argv[4], NULL, 10);
+	printf("port: %x, mode: %x\n", port, mode);
+
+	/*Check the input parameters is right or not. */
+	if (port > SWITCH_MAX_PORT || mode > 3) {
+		printf(HELP_VLAN_PORT_MODE);
+		return;
+	}
+
+	mode_t = (AIR_PORT_VLAN_MODE_T) mode;
+	air_port_setVlanMode(0, port, mode_t);
+}
+
+void an8855_doVlanSetEgressTagPCR(int argc, char *argv[])
+{
+	unsigned char port = 0;
+	unsigned char eg_tag = 0;
+	AIR_PORT_EGS_TAG_ATTR_T eg_tag_t = AIR_PORT_EGS_TAG_ATTR_UNTAGGED;
+
+	port = _strtoul(argv[3], NULL, 10);
+	eg_tag = _strtoul(argv[4], NULL, 10);
+
+	printf("port: %d, eg_tag: %d\n", port, eg_tag);
+
+	/*Check the input parameters is right or not. */
+	if ((port > SWITCH_MAX_PORT) || (eg_tag > REG_PCR_EG_TAG_RELMASK)) {
+		printf(HELP_VLAN_EGRESS_TAG_PCR);
+		return;
+	}
+
+	eg_tag_t = (AIR_PORT_EGS_TAG_ATTR_T) eg_tag;
+	air_vlan_setPortEgsTagAttr(0, port, eg_tag_t);
+}				/*end doVlanSetEgressTagPCR */
+
+void an8855_doVlanSetEgressTagPVC(int argc, char *argv[])
+{
+	unsigned char port = 0;
+	unsigned char eg_tag = 0;
+	AIR_IGR_PORT_EG_TAG_ATTR_T eg_tag_t = 0;
+
+	port = _strtoul(argv[3], NULL, 10);
+	eg_tag = _strtoul(argv[4], NULL, 10);
+
+	printf("port: %d, eg_tag: %d\n", port, eg_tag);
+
+	/*Check the input parameters is right or not. */
+	if ((port > SWITCH_MAX_PORT) || (eg_tag > REG_PVC_EG_TAG_RELMASK)) {
+		printf(HELP_VLAN_EGRESS_TAG_PVC);
+		return;
+	}
+
+	eg_tag_t = (AIR_IGR_PORT_EG_TAG_ATTR_T) eg_tag;
+	air_vlan_setIgrPortTagAttr(0, port, eg_tag_t);
+}				/*end doVlanSetEgressTagPVC */
+
+void an8855_doArlAging(int argc, char *argv[])
+{
+	unsigned char aging_en = 0;
+	unsigned int time = 0, port = 0;
+
+	aging_en = _strtoul(argv[3], NULL, 10);
+	time = _strtoul(argv[4], NULL, 10);
+	printf("aging_en: %x, aging time: %x\n", aging_en, time);
+
+	/*Check the input parameters is right or not. */
+	if ((aging_en != 0 && aging_en != 1) || (time <= 0 || time > 65536)) {
+		printf(HELP_ARL_AGING);
+		return;
+	}
+
+	for (port = 0; port < 6; port++) {
+		air_l2_setAgeEnable(0, port, aging_en);
+	}
+
+	air_l2_setMacAddrAgeOut(0, time);
+}
+
+void an8855_doMirrorEn(int argc, char *argv[])
+{
+	unsigned char mirror_en = 0;
+	unsigned char mirror_port = 0;
+	AIR_MIR_SESSION_T session = { 0 };
+
+	mirror_en = _strtoul(argv[3], NULL, 10);
+	mirror_port = _strtoul(argv[4], NULL, 10);
+
+	printf("mirror_en: %d, mirror_port: %d\n", mirror_en, mirror_port);
+
+	/*Check the input parameters is right or not. */
+	if ((mirror_en > 1) || (mirror_port > REG_CFC_MIRROR_PORT_RELMASK)) {
+		printf(HELP_MIRROR_EN);
+		return;
+	}
+
+	memset(&session, 0, sizeof(AIR_MIR_SESSION_T));
+
+	if (mirror_en) {
+		session.dst_port = mirror_port;
+		session.flags |= AIR_MIR_SESSION_FLAGS_ENABLE;
+		air_mir_addSession(0, 0, &session);
+	} else {
+		air_mir_delSession(0, 0);
+	}
+
+	air_mir_setSessionAdminMode(0, 0, (int)mirror_en);
+}				/*end doMirrorEn */
+
+void an8855_doMirrorPortBased(int argc, char *argv[])
+{
+	unsigned char port = 0, port_tx_mir = 0, port_rx_mir = 0, vlan_mis =
+	    0, acl_mir = 0, igmp_mir = 0;
+	unsigned int reg = 0, value = 0;
+	AIR_MIR_SESSION_T session = { 0 };
+
+	port = _strtoul(argv[3], NULL, 10);
+	port_tx_mir = _strtoul(argv[4], NULL, 10);
+	port_rx_mir = _strtoul(argv[5], NULL, 10);
+	acl_mir = _strtoul(argv[6], NULL, 10);
+	vlan_mis = _strtoul(argv[7], NULL, 10);
+	igmp_mir = _strtoul(argv[8], NULL, 10);
+
+	printf
+	    ("port:%d, port_tx_mir:%d, port_rx_mir:%d, acl_mir:%d, vlan_mis:%d, igmp_mir:%d\n",
+	     port, port_tx_mir, port_rx_mir, acl_mir, vlan_mis, igmp_mir);
+
+	/*Check the input parameters is right or not. */
+	//if((port >= vlanCap->max_port_no) || (port_tx_mir > 1) || (port_rx_mir > 1) || (acl_mir > 1) || (vlan_mis > 1)){
+	if ((port >= SWITCH_MAX_PORT) || (port_tx_mir > 1) || (port_rx_mir > 1) || (acl_mir > 1) || (vlan_mis > 1)) {	// also allow CPU port (port6)
+		printf(HELP_MIRROR_PORTBASED);
+		return;
+	}
+
+	memset(&session, 0, sizeof(AIR_MIR_SESSION_T));
+	air_mir_getSession(0, 0, &session);
+	session.src_port = port;
+
+	if (port_tx_mir)
+		session.flags |= AIR_MIR_SESSION_FLAGS_DIR_TX;
+	else
+		session.flags &= ~AIR_MIR_SESSION_FLAGS_DIR_TX;
+
+	if (port_rx_mir)
+		session.flags |= AIR_MIR_SESSION_FLAGS_DIR_RX;
+	else
+		session.flags &= ~AIR_MIR_SESSION_FLAGS_DIR_RX;
+
+	air_mir_setMirrorPort(0, 0, &session);
+
+	/*
+
+	   not support acl/vlan/igmp mismatch
+
+	 */
+}				/*end doMirrorPortBased */
+
+void an8855_doStp(int argc, char *argv[])
+{
+	unsigned char port = 0;
+	unsigned char fid = 0;
+	unsigned char state = 0;
+	unsigned int value = 0;
+	unsigned int reg = 0;
+
+	port = _strtoul(argv[2], NULL, 10);
+	fid = _strtoul(argv[3], NULL, 10);
+	state = _strtoul(argv[4], NULL, 10);
+
+	printf("port: %d, fid: %d, state: %d\n", port, fid, state);
+
+	/*Check the input parameters is right or not. */
+	if ((port > 5) || (fid > 16) || (state > 3)) {
+		printf(HELP_STP);
+		return;
+	}
+
+	air_stp_setPortstate(0, port, fid, state);
+}
+
+void _an8855_ingress_rate_set(int on_off, unsigned char port, unsigned int bw)
+{
+	AIR_ERROR_NO_T ret = AIR_E_OK;
+	AIR_QOS_RATE_LIMIT_CFG_T rl = { 0 };
+	if (on_off) {
+		ret =
+		    air_qos_setRateLimitEnable(0, port,
+					       AIR_QOS_RATE_DIR_INGRESS, TRUE);
+		if (AIR_E_OK != ret) {
+			printf("an8855 set ingress ratelimit eanble fail\n");
+			return;
+		}
+		rl.ingress_cir = bw;
+		rl.flags |= AIR_QOS_RATE_LIMIT_CFG_FLAGS_ENABLE_INGRESS;
+		ret = air_qos_setRateLimit(0, port, &rl);
+		if (AIR_E_OK != ret) {
+			printf("an8855 set ingress ratelimit value %d fail\n",
+			       bw);
+			return;
+		} else {
+			printf("an8855 set ingress ratelimit value %d ok\n",
+			       bw);
+		}
+	} else {
+		ret =
+		    air_qos_setRateLimitEnable(0, port,
+					       AIR_QOS_RATE_DIR_INGRESS, FALSE);
+		if (AIR_E_OK != ret) {
+			printf("an8855 set ingress ratelimit disable fail\n");
+			return;
+		} else {
+			printf("an8855 set ingress ratelimit disable ok\n");
+		}
+	}
+}
+
+void _an8855_egress_rate_set(int on_off, unsigned char port, unsigned int bw)
+{
+	AIR_ERROR_NO_T ret = AIR_E_OK;
+	AIR_QOS_RATE_LIMIT_CFG_T rl = { 0 };
+	if (on_off) {
+		ret =
+		    air_qos_setRateLimitEnable(0, port, AIR_QOS_RATE_DIR_EGRESS,
+					       TRUE);
+		if (AIR_E_OK != ret) {
+			printf("an8855 set egress ratelimit eanble fail\n");
+			return;
+		}
+		rl.egress_cir = bw;
+		rl.flags |= AIR_QOS_RATE_LIMIT_CFG_FLAGS_ENABLE_EGRESS;
+		ret = air_qos_setRateLimit(0, port, &rl);
+		if (AIR_E_OK != ret) {
+			printf("an8855 set egress ratelimit value %d fail\n",
+			       bw);
+			return;
+		} else {
+			printf("an8855 set egress ratelimit value %d ok\n", bw);
+		}
+	} else {
+		ret =
+		    air_qos_setRateLimitEnable(0, port, AIR_QOS_RATE_DIR_EGRESS,
+					       FALSE);
+		if (AIR_E_OK != ret) {
+			printf("an8855 set egress ratelimit disable fail\n");
+			return;
+		} else {
+			printf("an8855 set egress ratelimit disable ok\n");
+		}
+	}
+}
+
+void an8855_ingress_rate_set(int argc, char *argv[])
+{
+	int on_off = 0, port, bw = 0;
+
+	port = _strtoul(argv[3], NULL, 0);
+	if (argv[2][1] == 'n') {
+		bw = _strtoul(argv[4], NULL, 0);
+		on_off = 1;
+	} else if (argv[2][1] == 'f') {
+		if (argc != 4) {
+			return;
+		}
+		on_off = 0;
+	}
+
+	_an8855_ingress_rate_set(on_off, port, bw);
+}
+
+void an8855_egress_rate_set(int argc, char *argv[])
+{
+	unsigned int reg = 0, value = 0;
+	int on_off = 0, port = 0, bw = 0;
+
+	port = _strtoul(argv[3], NULL, 0);
+	if (argv[2][1] == 'n') {
+		bw = _strtoul(argv[4], NULL, 0);
+		on_off = 1;
+	} else if (argv[2][1] == 'f') {
+		if (argc != 4) {
+			return;
+		}
+		on_off = 0;
+	}
+
+	_an8855_egress_rate_set(on_off, port, bw);
+}
+
+void an8855_rate_control(int argc, char *argv[])
+{
+	unsigned char dir = 0;
+	unsigned char port = 0;
+	unsigned int rate_cir = 0;
+
+	dir = _strtoul(argv[2], NULL, 10);
+	port = _strtoul(argv[3], NULL, 10);
+	rate_cir = _strtoul(argv[4], NULL, 10);
+
+	if (port > 5) {
+		printf("Error, port %d is bigger than 5\n\r", port);
+		return;
+	}
+	if (rate_cir > 80000) {
+		printf("Error, rate_cir %d is bigger than 80000\n\r", rate_cir);
+		return;
+	}
+
+	if (dir == 1)		//ingress
+		_an8855_ingress_rate_set(1, port, rate_cir);
+	else if (dir == 0)	//egress
+		_an8855_egress_rate_set(1, port, rate_cir);
+	else
+		printf("Error, dir %d is not 1(ingress) and 0(egress)\n\r",
+		       dir);
+}
+
+void an8855_read_output_queue_counters(int argc, char *argv[])
+{
+	unsigned int port = 0;
+	unsigned int value = 0, output_queue = 0;
+
+	for (port = 0; port < 7; port++) {
+		reg_write(0x10207e48, 0x80000000 | (port << 8) | 0x0);
+		reg_read(0x10207e4c, &output_queue);
+		printf("\n port %d  output queue 0 counter is %d.\n", port,
+		       output_queue);
+		reg_write(0x10207e48, 0x80000000 | (port << 8) | 0x1);
+		reg_read(0x10207e4c, &output_queue);
+		printf("\n port %d  output queue 1 counter is %d.\n", port,
+		       output_queue);
+		reg_write(0x10207e48, 0x80000000 | (port << 8) | 0x2);
+		reg_read(0x10207e4c, &output_queue);
+		printf("\n port %d  output queue 2 counter is %d.\n", port,
+		       output_queue);
+		reg_write(0x10207e48, 0x80000000 | (port << 8) | 0x3);
+		reg_read(0x10207e4c, &output_queue);
+		printf("\n port %d  output queue 3 counter is %d.\n", port,
+		       output_queue);
+		reg_write(0x10207e48, 0x80000000 | (port << 8) | 0x4);
+		reg_read(0x10207e4c, &output_queue);
+		printf("\n port %d  output queue 4 counter is %d.\n", port,
+		       output_queue);
+		reg_write(0x10207e48, 0x80000000 | (port << 8) | 0x5);
+		reg_read(0x10207e4c, &output_queue);
+		printf("\n port %d  output queue 5 counter is %d.\n", port,
+		       output_queue);
+		reg_write(0x10207e48, 0x80000000 | (port << 8) | 0x6);
+		reg_read(0x10207e4c, &output_queue);
+		printf("\n port %d  output queue 6 counter is %d.\n", port,
+		       output_queue);
+		reg_write(0x10207e48, 0x80000000 | (port << 8) | 0x7);
+		reg_read(0x10207e4c, &output_queue);
+		printf("\n port %d  output queue 7 counter is %d.\n", port,
+		       output_queue);
+	}
+}
+
+void an8855_read_free_page_counters(int argc, char *argv[])
+{
+	unsigned int value = 0;
+	unsigned int free_page = 0, free_page_min = 0;
+	unsigned int fc_free_blk_lothd = 0, fc_free_blk_hithd = 0;
+	unsigned int fc_port_blk_thd = 0, fc_port_blk_hi_thd = 0;
+	unsigned int queue[8] = { 0 };
+
+	/* get system free page link counter */
+	reg_read(0x10207e00, &value);
+	free_page = value & 0xFFF;
+	free_page_min = (value & 0xFFF0000) >> 16;
+
+	/* get system flow control waterwark */
+	reg_read(0x10207e04, &value);
+	fc_free_blk_lothd = value & 0x3FF;
+	fc_free_blk_hithd = (value & 0x1FF8000) >> 15;
+
+	/* get port flow control waterwark */
+	reg_read(0x10207e08, &value);
+	fc_port_blk_thd = (value & 0xFF00) >> 8;
+	fc_port_blk_hi_thd = (value & 0xFF0000) >> 16;
+
+	/* get queue flow control waterwark */
+	reg_read(0x10207e10, &value);
+	queue[0] = value & 0x3F;
+	queue[1] = (value & 0x3F00) >> 8;
+	queue[2] = (value & 0x3F0000) >> 16;
+	queue[3] = (value & 0x3F000000) >> 24;
+	reg_read(0x10207e0c, &value);
+	queue[4] = value & 0x3F;
+	queue[5] = (value & 0x3F00) >> 8;
+	queue[6] = (value & 0x3F0000) >> 16;
+	queue[7] = (value & 0x3F000000) >> 24;
+
+	printf("<===Free Page=======Current============Minimal=========> \n ");
+	printf("	                                                 \n ");
+	printf(" page counter      %u                %u               \n ",
+	       free_page, free_page_min);
+	printf("                                                        \n ");
+	printf("========================================================= \n ");
+	printf("<===Type=======High threshold======Low threshold=========\n ");
+	printf("                                                        \n ");
+	printf("  system:         %u                 %u               \n",
+	       fc_free_blk_hithd * 2, fc_free_blk_lothd * 2);
+	printf("    port:         %u                 %u               \n",
+	       fc_port_blk_hi_thd * 2, fc_port_blk_thd * 2);
+	printf(" queue 0:         %u                 NA                \n",
+	       queue[0]);
+	printf(" queue 1:         %u                 NA                \n",
+	       queue[1]);
+	printf(" queue 2:         %u                 NA                 \n",
+	       queue[2]);
+	printf(" queue 3:         %u                 NA                \n",
+	       queue[3]);
+	printf(" queue 4:         %u                 NA                \n",
+	       queue[4]);
+	printf(" queue 5:         %u                 NA                \n",
+	       queue[5]);
+	printf(" queue 6:         %u                 NA                \n",
+	       queue[6]);
+	printf(" queue 7:         %u                 NA                \n",
+	       queue[7]);
+	printf("=========================================================\n ");
+}
+
+void an8855_eee_enable(int argc, char *argv[])
+{
+	unsigned long enable = 0;
+	unsigned int value, mode = 0;
+	unsigned int eee_cap = 0;
+	unsigned int eee_en_bitmap = 0;
+	unsigned long port_map = 0;
+	long port_num = -1;
+	int p = 0;
+
+	if (argc < 3)
+		goto error;
+
+	/* Check the input parameters is right or not. */
+	if (!strncmp(argv[2], "enable", 7))
+		enable = 1;
+	else if (!strncmp(argv[2], "disable", 8))
+		enable = 0;
+	else
+		goto error;
+
+	if (argc > 3) {
+		if (strlen(argv[3]) == 1) {
+			port_num = strtol(argv[3], (char **)NULL, 10);
+			if (port_num < 0 || port_num > MAX_PHY_PORT - 1) {
+				printf("Illegal port index and port:0~4\n");
+				goto error;
+			}
+			port_map = 1 << port_num;
+		} else if (strlen(argv[3]) == 5) {
+			port_map = 0;
+			for (p = 0; p < MAX_PHY_PORT; p++) {
+				if (argv[3][p] != '0' && argv[3][p] != '1') {
+					printf
+					    ("portmap format error, should be combination of 0 or 1\n");
+					goto error;
+				}
+				port_map |= ((argv[3][p] - '0') << p);
+			}
+		} else {
+			printf
+			    ("port_no or portmap format error, should be length of 1 or 5\n");
+			goto error;
+		}
+	} else {
+		port_map = 0x1f;
+	}
+
+	for (port_num = 0; port_num < MAX_PHY_PORT; port_num++) {
+		if (port_map & (1 << port_num)) {
+			air_port_getPsMode(0, port_num, &mode);
+			if (enable) {
+				mode |= AIR_PORT_PS_EEE;
+			} else {
+				mode &= ~AIR_PORT_PS_EEE;
+			}
+			air_port_setPsMode(0, port_num, mode);
+		}
+	}
+	return;
+
+error:
+	printf(HELP_EEE_EN);
+	return;
+}
+
+void an8855_eee_dump(int argc, char *argv[])
+{
+	unsigned int cap = 0, lp_cap = 0;
+	long port = -1;
+	int p = 0;
+
+	if (argc > 3) {
+		if (strlen(argv[3]) > 1) {
+			printf("port# format error, should be of length 1\n");
+			return;
+		}
+
+		port = strtol(argv[3], (char **)NULL, 0);
+		if (port < 0 || port > MAX_PHY_PORT) {
+			printf("port# format error, should be 0 to %d\n",
+			       MAX_PHY_PORT);
+			return;
+		}
+	}
+
+	for (p = 0; p < MAX_PHY_PORT; p++) {
+		if (port >= 0 && p != port)
+			continue;
+
+		mii_mgr_c45_read(p, 0x7, 0x3c, &cap);
+		mii_mgr_c45_read(p, 0x7, 0x3d, &lp_cap);
+		printf("port%d EEE cap=0x%02x, link partner EEE cap=0x%02x",
+		       p, cap, lp_cap);
+
+		if (port >= 0 && p == port) {
+			mii_mgr_c45_read(p, 0x3, 0x1, &cap);
+			printf(", st=0x%03x", cap);
+		}
+		printf("\n");
+	}
+}
+
+void an8855_read_mib_counters(int argc, char *argv[])
+{
+	int port = 0;
+	AIR_MIB_CNT_RX_T rx_mib[7];
+	AIR_MIB_CNT_TX_T tx_mib[7];
+
+	printf("===================== %8s %8s %8s %8s %8s %8s %8s\n",
+	       "Port0", "Port1", "Port2", "Port3", "Port4", "Port5", "Port6");
+
+	for (port = 0; port < 7; port++) {
+		air_mib_get(0, port, &rx_mib[port], &tx_mib[port]);
+	}
+
+	printf("Tx Drop Packet      :");
+	for (port = 0; port < 7; port++) {
+		printf("%8u ", tx_mib[port].TDPC);
+	}
+	printf("\n");
+	printf("Tx CRC Error        :");
+	for (port = 0; port < 7; port++) {
+		printf("%8u ", tx_mib[port].TCRC);
+	}
+	printf("\n");
+	printf("Tx Unicast Packet   :");
+	for (port = 0; port < 7; port++) {
+		printf("%8u ", tx_mib[port].TUPC);
+	}
+	printf("\n");
+	printf("Tx Multicast Packet :");
+	for (port = 0; port < 7; port++) {
+		printf("%8u ", tx_mib[port].TMPC);
+	}
+	printf("\n");
+	printf("Tx Broadcast Packet :");
+	for (port = 0; port < 7; port++) {
+		printf("%8u ", tx_mib[port].TBPC);
+	}
+	printf("\n");
+	printf("Tx Collision Event  :");
+	for (port = 0; port < 7; port++) {
+		printf("%8u ", tx_mib[port].TCEC);
+	}
+	printf("\n");
+	printf("Tx Pause Packet     :");
+	for (port = 0; port < 7; port++) {
+		printf("%8u ", tx_mib[port].TPPC);
+	}
+	printf("\n");
+	printf("Rx Drop Packet      :");
+	for (port = 0; port < 7; port++) {
+		printf("%8u ", rx_mib[port].RDPC);
+	}
+	printf("\n");
+	printf("Rx Filtering Packet :");
+	for (port = 0; port < 7; port++) {
+		printf("%8u ", rx_mib[port].RFPC);
+	}
+	printf("\n");
+	printf("Rx Unicast Packet   :");
+	for (port = 0; port < 7; port++) {
+		printf("%8u ", rx_mib[port].RUPC);
+	}
+	printf("\n");
+	printf("Rx Multicast Packet :");
+	for (port = 0; port < 7; port++) {
+		printf("%8u ", rx_mib[port].RMPC);
+	}
+	printf("\n");
+	printf("Rx Broadcast Packet :");
+	for (port = 0; port < 7; port++) {
+		printf("%8u ", rx_mib[port].RBPC);
+	}
+	printf("\n");
+	printf("Rx Alignment Error  :");
+	for (port = 0; port < 7; port++) {
+		printf("%8u ", rx_mib[port].RAEPC);
+	}
+	printf("\n");
+	printf("Rx CRC Error	    :");
+	for (port = 0; port < 7; port++) {
+		printf("%8u ", rx_mib[port].RCEPC);
+	}
+	printf("\n");
+	printf("Rx Undersize Error  :");
+	for (port = 0; port < 7; port++) {
+		printf("%8u ", rx_mib[port].RUSPC);
+	}
+	printf("\n");
+	printf("Rx Fragment Error   :");
+	for (port = 0; port < 7; port++) {
+		printf("%8u ", rx_mib[port].RFEPC);
+	}
+	printf("\n");
+	printf("Rx Oversize Error   :");
+	for (port = 0; port < 7; port++) {
+		printf("%8u ", rx_mib[port].ROSPC);
+	}
+	printf("\n");
+	printf("Rx Jabber Error     :");
+	for (port = 0; port < 7; port++) {
+		printf("%8u ", rx_mib[port].RJEPC);
+	}
+	printf("\n");
+	printf("Rx Pause Packet     :");
+	for (port = 0; port < 7; port++) {
+		printf("%8u ", rx_mib[port].RPPC);
+	}
+	printf("\n");
+}
+
+void an8855_clear_mib_counters(int argc, char *argv[])
+{
+	air_mib_clear(0);
+}
diff --git a/recipes-devtools/switch/files/src/switch_fun_an8855.h b/recipes-devtools/switch/files/src/switch_fun_an8855.h
new file mode 100644
index 0000000..1d67080
--- /dev/null
+++ b/recipes-devtools/switch/files/src/switch_fun_an8855.h
@@ -0,0 +1,134 @@
+/*
+* switch_fun.h: switch function sets
+*/
+#ifndef SWITCH_FUN_AN8855_H
+#define SWITCH_FUN_AN8855_H
+
+#include "air.h"
+
+AIR_ERROR_NO_T
+an8855_reg_read(const UI32_T unit, const UI32_T addr_offset, UI32_T * ptr_data);
+
+AIR_ERROR_NO_T
+an8855_reg_write(const UI32_T unit,
+		 const UI32_T addr_offset, const UI32_T data);
+
+AIR_ERROR_NO_T
+an8855_phy_cl22_read(const UI32_T unit,
+		     const UI32_T port_id,
+		     const UI32_T addr_offset, UI32_T * ptr_data);
+
+AIR_ERROR_NO_T
+an8855_phy_cl22_write(const UI32_T unit,
+		      const UI32_T port_id,
+		      const UI32_T addr_offset, const UI32_T data);
+
+AIR_ERROR_NO_T
+an8855_phy_cl45_read(const UI32_T unit,
+		     const UI32_T port_id,
+		     const UI32_T dev_type,
+		     const UI32_T addr_offset, UI32_T * ptr_data);
+
+AIR_ERROR_NO_T
+an8855_phy_cl45_write(const UI32_T unit,
+		      const UI32_T port_id,
+		      const UI32_T dev_type,
+		      const UI32_T addr_offset, const UI32_T data);
+
+/*arl setting*/
+void an8855_doArlAging(int argc, char *argv[]);
+
+void an8855_not_supported(int argc, char *argv[]);
+
+#if 0
+/*acl setting*/
+void an8855_acl_mac_add(int argc, char *argv[]);
+void an8855_acl_dip_meter(int argc, char *argv[]);
+void an8855_acl_dip_trtcm(int argc, char *argv[]);
+void an8855_acl_ethertype(int argc, char *argv[]);
+void an8855_acl_ethertype(int argc, char *argv[]);
+void an8855_acl_dip_modify(int argc, char *argv[]);
+void an8855_acl_dip_pppoe(int argc, char *argv[]);
+void an8855_acl_dip_add(int argc, char *argv[]);
+void an8855_acl_l4_add(int argc, char *argv[]);
+void an8855_acl_sp_add(int argc, char *argv[]);
+
+void an8855_acl_port_enable(int argc, char *argv[]);
+void an8855_acl_table_add(int argc, char *argv[]);
+void an8855_acl_mask_table_add(int argc, char *argv[]);
+void an8855_acl_rule_table_add(int argc, char *argv[]);
+void an8855_acl_rate_table_add(int argc, char *argv[]);
+
+/*dip table*/
+void an8855_dip_dump(void);
+void an8855_dip_add(int argc, char *argv[]);
+void an8855_dip_del(int argc, char *argv[]);
+void an8855_dip_clear(void);
+
+/*sip table*/
+void an8855_sip_dump(void);
+void an8855_sip_add(int argc, char *argv[]);
+void an8855_sip_del(int argc, char *argv[]);
+void an8855_sip_clear(void);
+#endif
+
+/*stp*/
+void an8855_doStp(int argc, char *argv[]);
+
+/*mac table*/
+void an8855_table_dump(int argc, char *argv[]);
+void an8855_table_add(int argc, char *argv[]);
+void an8855_table_search_mac_vid(int argc, char *argv[]);
+void an8855_table_search_mac_fid(int argc, char *argv[]);
+void an8855_table_del_fid(int argc, char *argv[]);
+void an8855_table_del_vid(int argc, char *argv[]);
+void an8855_table_clear(int argc, char *argv[]);
+
+/*vlan table*/
+void an8855_vlan_dump(int argc, char *argv[]);
+void an8855_vlan_clear(int argc, char *argv[]);
+void an8855_vlan_set(int argc, char *argv[]);
+
+void an8855_doVlanSetPvid(int argc, char *argv[]);
+void an8855_doVlanSetVid(int argc, char *argv[]);
+void an8855_doVlanSetAccFrm(int argc, char *argv[]);
+void an8855_doVlanSetPortAttr(int argc, char *argv[]);
+void an8855_doVlanSetPortMode(int argc, char *argv[]);
+void an8855_doVlanSetEgressTagPCR(int argc, char *argv[]);
+void an8855_doVlanSetEgressTagPVC(int argc, char *argv[]);
+
+/*mirror function*/
+void an8855_set_mirror_to(int argc, char *argv[]);
+void an8855_set_mirror_from(int argc, char *argv[]);
+void an8855_doMirrorPortBased(int argc, char *argv[]);
+void an8855_doMirrorEn(int argc, char *argv[]);
+
+/*rate control*/
+void an8855_rate_control(int argc, char *argv[]);
+void an8855_ingress_rate_set(int argc, char *argv[]);
+void an8855_egress_rate_set(int argc, char *argv[]);
+
+/*QoS*/
+void an8855_qos_sch_select(int argc, char *argv[]);
+void an8855_qos_set_base(int argc, char *argv[]);
+void an8855_qos_wfq_set_weight(int argc, char *argv[]);
+void an8855_qos_set_portpri(int argc, char *argv[]);
+void an8855_qos_set_dscppri(int argc, char *argv[]);
+void an8855_qos_pri_mapping_queue(int argc, char *argv[]);
+
+/*flow control*/
+void an8855_global_set_mac_fc(int argc, char *argv[]);
+
+/*switch reset*/
+void an8855_switch_reset(int argc, char *argv[]);
+
+/* EEE(802.3az) function  */
+void an8855_eee_enable(int argc, char *argv[]);
+void an8855_eee_dump(int argc, char *argv[]);
+
+void an8855_read_mib_counters(int argc, char *argv[]);
+void an8855_clear_mib_counters(int argc, char *argv[]);
+void an8855_read_output_queue_counters(int argc, char *argv[]);
+void an8855_read_free_page_counters(int argc, char *argv[]);
+
+#endif
diff --git a/recipes-devtools/switch/files/src/switch_ioctl.c b/recipes-devtools/switch/files/src/switch_ioctl.c
index 366079e..f6b97d4 100644
--- a/recipes-devtools/switch/files/src/switch_ioctl.c
+++ b/recipes-devtools/switch/files/src/switch_ioctl.c
@@ -235,24 +235,18 @@
 	mii.reg_num = 13;
 	mii.val_in = dev;
 	ret = ioctl(sk, method, &ifr);
-	if (ret < 0)
-		printf("ioctl failed with error %d\n", ret);
 
 	method = RAETH_MII_WRITE;
 	mii.phy_id = port_num;
 	mii.reg_num = 14;
 	mii.val_in = reg;
 	ret = ioctl(sk, method, &ifr);
-	if (ret < 0)
-		printf("ioctl failed with error %d\n", ret);
 
 	method = RAETH_MII_WRITE;
 	mii.phy_id = port_num;
 	mii.reg_num = 13;
 	mii.val_in = (0x6000 | dev);
 	ret = ioctl(sk, method, &ifr);
-	if (ret < 0)
-		printf("ioctl failed with error %d\n", ret);
 
 	usleep(1000);
 
@@ -260,8 +254,6 @@
 	mii.phy_id = port_num;
 	mii.reg_num = 14;
 	ret = ioctl(sk, method, &ifr);
-	if (ret < 0)
-		printf("ioctl failed with error %d\n", ret);
 
 	close(sk);
 	*value = mii.val_out;
@@ -291,24 +283,18 @@
 	mii.reg_num = 13;
 	mii.val_in = dev;
 	ret = ioctl(sk, method, &ifr);
-	if (ret < 0)
-		printf("ioctl failed with error %d\n", ret);
 
 	method = RAETH_MII_WRITE;
 	mii.phy_id = port_num;
 	mii.reg_num = 14;
 	mii.val_in = reg;
 	ret = ioctl(sk, method, &ifr);
-	if (ret < 0)
-		printf("ioctl failed with error %d\n", ret);
 
 	method = RAETH_MII_WRITE;
 	mii.phy_id = port_num;
 	mii.reg_num = 13;
 	mii.val_in = (0x6000 | dev);
 	ret = ioctl(sk, method, &ifr);
-	if (ret < 0)
-		printf("ioctl failed with error %d\n", ret);
 
 	usleep(1000);
 
@@ -317,8 +303,6 @@
 	mii.reg_num = 14;
 	mii.val_in = value;
 	ret = ioctl(sk, method, &ifr);
-	if (ret < 0)
-		printf("ioctl failed with error %d\n", ret);
 
 	close(sk);
 
diff --git a/recipes-devtools/switch/files/src/switch_netlink.c b/recipes-devtools/switch/files/src/switch_netlink.c
index 90a4a19..397ebe5 100644
--- a/recipes-devtools/switch/files/src/switch_netlink.c
+++ b/recipes-devtools/switch/files/src/switch_netlink.c
@@ -41,10 +41,9 @@
 	if (gnlh->cmd == MT753X_CMD_REPLY) {
 		if (attrs[MT753X_ATTR_TYPE_MESG]) {
 			val->dev_info =
-				nla_get_string(attrs[MT753X_ATTR_TYPE_MESG]);
+			    nla_get_string(attrs[MT753X_ATTR_TYPE_MESG]);
 			printf("register switch dev:\n%s", val->dev_info);
-		}
-		else {
+		} else {
 			fprintf(stderr, "ERROR:No switch dev now\n");
 			goto done;
 		}
@@ -65,13 +64,15 @@
 
 	if (val->op == 'r') {
 		if (val->phy_dev != -1)
-			NLA_PUT_U32(msg, MT753X_ATTR_TYPE_PHY_DEV, val->phy_dev);
+			NLA_PUT_U32(msg, MT753X_ATTR_TYPE_PHY_DEV,
+				    val->phy_dev);
 		if (val->port_num >= 0)
 			NLA_PUT_U32(msg, MT753X_ATTR_TYPE_PHY, val->port_num);
 		NLA_PUT_U32(msg, type, val->reg);
 	} else if (val->op == 'w') {
 		if (val->phy_dev != -1)
-			NLA_PUT_U32(msg, MT753X_ATTR_TYPE_PHY_DEV, val->phy_dev);
+			NLA_PUT_U32(msg, MT753X_ATTR_TYPE_PHY_DEV,
+				    val->phy_dev);
 		if (val->port_num >= 0)
 			NLA_PUT_U32(msg, MT753X_ATTR_TYPE_PHY, val->port_num);
 		NLA_PUT_U32(msg, type, val->reg);
@@ -104,15 +105,12 @@
 				goto done;
 		}
 		if (attrs[MT753X_ATTR_TYPE_REG]) {
-			val->reg =
-			    nla_get_u32(attrs[MT753X_ATTR_TYPE_REG]);
+			val->reg = nla_get_u32(attrs[MT753X_ATTR_TYPE_REG]);
 		}
 		if (attrs[MT753X_ATTR_TYPE_VAL]) {
-			val->value =
-			    nla_get_u32(attrs[MT753X_ATTR_TYPE_VAL]);
+			val->value = nla_get_u32(attrs[MT753X_ATTR_TYPE_VAL]);
 		}
-	}
-	else
+	} else
 		goto done;
 
 	return 0;
@@ -120,7 +118,8 @@
 	return NL_SKIP;
 }
 
-static int mt753x_request_callback(int cmd, int (*spilt)(struct nl_msg *, void *),
+static int mt753x_request_callback(int cmd,
+				   int (*spilt)(struct nl_msg *, void *),
 				   int (*construct)(struct nl_msg *, void *),
 				   void *arg)
 {
@@ -130,7 +129,7 @@
 	int flags = 0;
 	int err;
 
-	/*Allocate an netllink message buffer*/
+	/* Allocate an netllink message buffer */
 	msg = nlmsg_alloc();
 	if (!msg) {
 		fprintf(stderr, "Failed to allocate netlink message\n");
@@ -145,7 +144,7 @@
 	genlmsg_put(msg, NL_AUTO_PID, NL_AUTO_SEQ, genl_family_get_id(family),
 		    0, flags, cmd, 0);
 
-	/*Fill attaribute of netlink message by construct function*/
+	/* Fill attaribute of netlink message by construct function */
 	if (construct) {
 		err = construct(msg, arg);
 		if (err < 0) {
@@ -154,14 +153,14 @@
 		}
 	}
 
-	/*Allocate an new callback handler*/
+	/* Allocate an new callback handler */
 	callback = nl_cb_alloc(NL_CB_CUSTOM);
 	if (!callback) {
 		fprintf(stderr, "Failed to allocate callback handler\n");
 		exit(1);
 	}
 
-	/*Send netlink message*/
+	/* Send netlink message */
 	err = nl_send_auto_complete(user_sock, msg);
 	if (err < 0) {
 		fprintf(stderr, "nl_send_auto_complete failied:%d\n", err);
@@ -178,12 +177,12 @@
 		nl_cb_set(callback, NL_CB_FINISH, NL_CB_CUSTOM, wait_handler,
 			  &finished);
 
-	/*receive message from kernel request*/
+	/* Receive message from kernel request */
 	err = nl_recvmsgs(user_sock, callback);
 	if (err < 0)
 		goto out;
 
-	/*wait until an ACK is received for the latest not yet acknowledge*/
+	/* Wait until an ACK is received for the latest not yet acknowledge */
 	if (!finished)
 		err = nl_wait_for_ack(user_sock);
 out:
@@ -216,18 +215,18 @@
 	cache = NULL;
 	family = NULL;
 
-	/*Allocate an new netlink socket*/
+	/* Allocate an new netlink socket */
 	user_sock = nl_socket_alloc();
 	if (!user_sock) {
 		fprintf(stderr, "Failed to create user socket\n");
 		goto err;
 	}
-	/*Connetct the genl controller*/
+	/* Connetct the genl controller */
 	if (genl_connect(user_sock)) {
 		fprintf(stderr, "Failed to connetct to generic netlink\n");
 		goto err;
 	}
-	/*Allocate an new nl_cache*/
+	/* Allocate an new nl_cache */
 	ret = genl_ctrl_alloc_cache(user_sock, &cache);
 	if (ret < 0) {
 		fprintf(stderr, "Failed to allocate netlink cache\n");
@@ -237,10 +236,10 @@
 	if (name == NULL)
 		return -EINVAL;
 
-	/*Look up generic netlik family by "mt753x" in the provided cache*/
+	/* Look up generic netlik family by "mt753x" in the provided cache */
 	family = genl_ctrl_search_by_name(cache, name);
 	if (!family) {
-		//fprintf(stderr,"switch(mt753x) API not be prepared\n");
+		/* printf("switch(mt753x) API not be prepared\n"); */
 		goto err;
 	}
 	return 0;
@@ -283,20 +282,19 @@
 	attr->value = -1;
 	attr->type = MT753X_ATTR_TYPE_REG;
 
-	switch (op)
-	{
-		case 'r':
-			attr->op = 'r';
-			ret = mt753x_request(attr, MT753X_CMD_READ);
-			*value = attr->value;
-			break;
-		case 'w':
-			attr->op = 'w';
-			attr->value = *value;
-			ret = mt753x_request(attr, MT753X_CMD_WRITE);
-			break;
-		default:
-			break;
+	switch (op) {
+	case 'r':
+		attr->op = 'r';
+		ret = mt753x_request(attr, MT753X_CMD_READ);
+		*value = attr->value;
+		break;
+	case 'w':
+		attr->op = 'w';
+		attr->value = *value;
+		ret = mt753x_request(attr, MT753X_CMD_WRITE);
+		break;
+	default:
+		break;
 	}
 
 	return ret;
@@ -354,60 +352,66 @@
 {
 	int ret;
 
-	ret = phy_operate_netlink('w', arg, port_num, phy_dev, phy_addr, &value);
+	ret =
+	    phy_operate_netlink('w', arg, port_num, phy_dev, phy_addr, &value);
 	return ret;
 }
 
 void dump_extend_phy_reg(struct mt753x_attr *arg, int port_no, int from,
-			int to, int is_local, int page_no)
+			 int to, int is_local, int page_no)
 {
-        unsigned int temp = 0;
-        int r31 = 0;
-        int i = 0;
+	unsigned int temp = 0;
+	int r31 = 0;
+	int i = 0;
 
-        if (is_local == 0) {
-            printf("\n\nGlobal Register Page %d\n",page_no);
-            printf("===============");
-            r31 |= 0 << 15; //global
-            r31 |= ((page_no&0x7) << 12); //page no
-            phy_cl22_write_netlink(arg, port_no, 31, r31); //select global page x
-            for (i = 16; i < 32; i++) {
-                if(i%8 == 0)
-                    printf("\n");
-		phy_cl22_read_netlink(arg, port_no, i, &temp);
-                printf("%02d: %04X ", i, temp);
-            }
-        } else {
-            printf("\n\nLocal Register Port %d Page %d\n",port_no, page_no);
-            printf("===============");
-            r31 |= 1 << 15; //local
-            r31 |= ((page_no&0x7) << 12); //page no
-            phy_cl22_write_netlink(arg, port_no, 31, r31); //select global page x
-            for (i = 16; i < 32; i++) {
-                if (i%8 == 0) {
-                    printf("\n");
-                }
-		phy_cl22_read_netlink(arg, port_no, i, &temp);
-                printf("%02d: %04X ",i, temp);
-            }
-        }
-        printf("\n");
+	if (is_local == 0) {
+		printf("\n\nGlobal Register Page %d\n", page_no);
+		printf("===============");
+		r31 |= 0 << 15;	/* global */
+		r31 |= ((page_no & 0x7) << 12);	/* page no */
+		phy_cl22_write_netlink(arg, port_no, 31, r31);	/* select global page x */
+		for (i = 16; i < 32; i++) {
+			if (i % 8 == 0)
+				printf("\n");
+			phy_cl22_read_netlink(arg, port_no, i, &temp);
+			printf("%02d: %04X ", i, temp);
+		}
+	} else {
+		printf("\n\nLocal Register Port %d Page %d\n", port_no,
+		       page_no);
+		printf("===============");
+		r31 |= 1 << 15;	/* Local */
+		r31 |= ((page_no & 0x7) << 12);	/* Page no */
+		phy_cl22_write_netlink(arg, port_no, 31, r31);	/* Select global page x */
+		for (i = 16; i < 32; i++) {
+			if (i % 8 == 0)
+				printf("\n");
+			phy_cl22_read_netlink(arg, port_no, i, &temp);
+			printf("%02d: %04X ", i, temp);
+		}
+	}
+	printf("\n");
 }
 
 int phy_dump_netlink(struct mt753x_attr *arg, int phy_addr)
 {
 	int i;
 	int ret;
-	unsigned int offset, value;
+	unsigned int offset, value, phy_base = 0;
+
+	if (chip_name == 0x8855)
+		phy_base = 6;
 
 	if (phy_addr == 32) {
-		/*dump all phy register*/
+		/* Dump all phy register */
 		for (i = 0; i < 5; i++) {
 			printf("\n[Port %d]=============", i);
 			for (offset = 0; offset < 16; offset++) {
 				if (offset % 8 == 0)
 					printf("\n");
-				ret = phy_cl22_read_netlink(arg, i, offset, &value);
+				ret =
+				    phy_cl22_read_netlink(arg, phy_base + i,
+							  offset, &value);
 				printf("%02d: %04X ", offset, value);
 			}
 		}
@@ -416,30 +420,32 @@
 		for (offset = 0; offset < 16; offset++) {
 			if (offset % 8 == 0)
 				printf("\n");
-			ret = phy_cl22_read_netlink(arg, phy_addr, offset, &value);
+			ret =
+			    phy_cl22_read_netlink(arg, phy_addr, offset,
+						  &value);
 			printf("%02d: %04X ", offset, value);
 		}
 	}
 	printf("\n");
-	for (offset = 0; offset < 5; offset++) { //global register  page 0~4
-		if (phy_addr == 32) //dump all phy register
+	for (offset = 0; offset < 5; offset++) {	/* Global register  page 0~4 */
+		if (phy_addr == 32)	/* Dump all phy register */
 			dump_extend_phy_reg(arg, 0, 16, 31, 0, offset);
 		else
 			dump_extend_phy_reg(arg, phy_addr, 16, 31, 0, offset);
 	}
 
-	if (phy_addr == 32) {	//dump all phy register
-		for (offset = 0; offset < 5; offset++) { //local register port 0-port4
-			dump_extend_phy_reg(arg, offset, 16, 31, 1, 0); //dump local page 0
-			dump_extend_phy_reg(arg, offset, 16, 31, 1, 1); //dump local page 1
-			dump_extend_phy_reg(arg, offset, 16, 31, 1, 2); //dump local page 2
-			dump_extend_phy_reg(arg, offset, 16, 31, 1, 3); //dump local page 3
+	if (phy_addr == 32) {	/* Dump all phy register */
+		for (offset = 0; offset < 5; offset++) {	/* Local register port 0-port4 */
+			dump_extend_phy_reg(arg, phy_base + offset, 16, 31, 1, 0);	/* Dump local page 0 */
+			dump_extend_phy_reg(arg, phy_base + offset, 16, 31, 1, 1);	/* Dump local page 1 */
+			dump_extend_phy_reg(arg, phy_base + offset, 16, 31, 1, 2);	/* Dump local page 2 */
+			dump_extend_phy_reg(arg, phy_base + offset, 16, 31, 1, 3);	/* Dump local page 3 */
 		}
 	} else {
-		dump_extend_phy_reg(arg, phy_addr, 16, 31, 1, 0); //dump local page 0
-		dump_extend_phy_reg(arg, phy_addr, 16, 31, 1, 1); //dump local page 1
-		dump_extend_phy_reg(arg, phy_addr, 16, 31, 1, 2); //dump local page 2
-		dump_extend_phy_reg(arg, phy_addr, 16, 31, 1, 3); //dump local page 3
+		dump_extend_phy_reg(arg, phy_addr, 16, 31, 1, 0);	/* Dump local page 0 */
+		dump_extend_phy_reg(arg, phy_addr, 16, 31, 1, 1);	/* Dump local page 1 */
+		dump_extend_phy_reg(arg, phy_addr, 16, 31, 1, 2);	/* Dump local page 2 */
+		dump_extend_phy_reg(arg, phy_addr, 16, 31, 1, 3);	/* Dump local page 3 */
 	}
 	return ret;
 }
diff --git a/recipes-devtools/switch/files/src/switch_netlink.h b/recipes-devtools/switch/files/src/switch_netlink.h
index b3f946e..cb812d5 100644
--- a/recipes-devtools/switch/files/src/switch_netlink.h
+++ b/recipes-devtools/switch/files/src/switch_netlink.h
@@ -9,12 +9,14 @@
 #define MT753X_GENL_NAME "mt753x"
 #define MT753X_DSA_GENL_NAME "mt753x_dsa"
 #define MT753X_GENL_VERSION 0X1
+#define AN8855_GENL_NAME "an8855"
+#define AN8855_DSA_GENL_NAME "an8855_dsa"
 
 /*add your cmd to here*/
 enum {
-	MT753X_CMD_UNSPEC = 0, /*Reserved*/
-	MT753X_CMD_REQUEST,    /*user->kernelrequest/get-response*/
-	MT753X_CMD_REPLY,      /*kernel->user event*/
+	MT753X_CMD_UNSPEC = 0,	/*Reserved */
+	MT753X_CMD_REQUEST,	/*user->kernelrequest/get-response */
+	MT753X_CMD_REPLY,	/*kernel->user event */
 	MT753X_CMD_READ,
 	MT753X_CMD_WRITE,
 	__MT753X_CMD_MAX,
@@ -22,10 +24,9 @@
 #define MT753X_CMD_MAX (__MT753X_CMD_MAX - 1)
 
 /*define attar types */
-enum
-{
+enum {
 	MT753X_ATTR_TYPE_UNSPEC = 0,
-	MT753X_ATTR_TYPE_MESG, /*MT753X message*/
+	MT753X_ATTR_TYPE_MESG,	/*MT753X message */
 	MT753X_ATTR_TYPE_PHY,
 	MT753X_ATTR_TYPE_PHY_DEV,
 	MT753X_ATTR_TYPE_REG,
@@ -48,6 +49,8 @@
 	int dev_id;
 };
 
+extern int chip_name;
+
 int mt753x_netlink_init(const char *name);
 void mt753x_netlink_free(void);
 void mt753x_list_swdev(struct mt753x_attr *arg, int cmd);