Merge "[qca-ssdk] [add powersaving and fiber feature to Dakota malibu phy module]"
diff --git a/include/api/api_desc.h b/include/api/api_desc.h
index 84a307d..47e339b 100755
--- a/include/api/api_desc.h
+++ b/include/api/api_desc.h
@@ -264,7 +264,140 @@
     SW_PARAM_DEF(SW_API_PT_RING_FLOW_CTRL_THRES_GET, SW_UINT8, 1, SW_PARAM_PTR|SW_PARAM_OUT, "On Thres"), \
     SW_PARAM_DEF(SW_API_PT_RING_FLOW_CTRL_THRES_GET, SW_UINT8, 1, SW_PARAM_PTR|SW_PARAM_OUT, "Off Thres"),
 
+#define SW_API_PT_8023AZ_SET_DESC \
+    SW_PARAM_DEF(SW_API_PT_8023AZ_SET, SW_UINT32, 4, SW_PARAM_IN, "Dev ID"), \
+    SW_PARAM_DEF(SW_API_PT_8023AZ_SET, SW_UINT32, 4, SW_PARAM_IN, "Port ID"), \
+    SW_PARAM_DEF(SW_API_PT_8023AZ_SET, SW_ENABLE, 4, SW_PARAM_IN, "8023az Status"),
 
+#define SW_API_PT_8023AZ_GET_DESC \
+    SW_PARAM_DEF(SW_API_PT_8023AZ_GET, SW_UINT32, 4, SW_PARAM_IN, "Dev ID"), \
+    SW_PARAM_DEF(SW_API_PT_8023AZ_GET, SW_UINT32, 4, SW_PARAM_IN, "Port ID"), \
+    SW_PARAM_DEF(SW_API_PT_8023AZ_GET, SW_ENABLE, 4, SW_PARAM_PTR|SW_PARAM_OUT, "8023az Status"),
+
+#define SW_API_PT_MDIX_SET_DESC \
+    SW_PARAM_DEF(SW_API_PT_MDIX_SET, SW_UINT32, 4, SW_PARAM_IN, "Dev ID"), \
+    SW_PARAM_DEF(SW_API_PT_MDIX_SET, SW_UINT32, 4, SW_PARAM_IN, "Port ID"), \
+    SW_PARAM_DEF(SW_API_PT_MDIX_SET, SW_CROSSOVER_MODE, sizeof(fal_port_mdix_mode_t), SW_PARAM_IN, "Crossover Mode"),
+
+
+#define SW_API_PT_MDIX_GET_DESC \
+    SW_PARAM_DEF(SW_API_PT_MDIX_GET, SW_UINT32, 4, SW_PARAM_IN, "Dev ID"), \
+    SW_PARAM_DEF(SW_API_PT_MDIX_GET, SW_UINT32, 4, SW_PARAM_IN, "Port ID"), \
+    SW_PARAM_DEF(SW_API_PT_MDIX_GET, SW_CROSSOVER_MODE, sizeof(fal_port_mdix_mode_t), SW_PARAM_PTR|SW_PARAM_OUT, \
+              "Crossover Mode"),
+
+#define SW_API_PT_MDIX_STATUS_GET_DESC \
+    SW_PARAM_DEF(SW_API_PT_MDIX_STATUS_GET, SW_UINT32, 4, SW_PARAM_IN, "Dev ID"), \
+    SW_PARAM_DEF(SW_API_PT_MDIX_STATUS_GET, SW_UINT32, 4, SW_PARAM_IN, "Port ID"), \
+    SW_PARAM_DEF(SW_API_PT_MDIX_STATUS_GET, SW_CROSSOVER_STATUS, sizeof(fal_port_mdix_status_t), SW_PARAM_PTR|SW_PARAM_OUT, \
+              "Crossover Status"),
+
+
+#define SW_API_PT_COMBO_PREFER_MEDIUM_SET_DESC \
+    SW_PARAM_DEF(SW_API_PT_COMBO_PREFER_MEDIUM_SET, SW_UINT32, 4, SW_PARAM_IN, "Dev ID"), \
+    SW_PARAM_DEF(SW_API_PT_COMBO_PREFER_MEDIUM_SET, SW_UINT32, 4, SW_PARAM_IN, "Port ID"), \
+    SW_PARAM_DEF(SW_API_PT_COMBO_PREFER_MEDIUM_SET, SW_PREFER_MEDIUM, sizeof(fal_port_medium_t), SW_PARAM_IN, "Prefer Medium"),
+
+
+#define SW_API_PT_COMBO_PREFER_MEDIUM_GET_DESC \
+    SW_PARAM_DEF(SW_API_PT_COMBO_PREFER_MEDIUM_GET, SW_UINT32, 4, SW_PARAM_IN, "Dev ID"), \
+    SW_PARAM_DEF(SW_API_PT_COMBO_PREFER_MEDIUM_GET, SW_UINT32, 4, SW_PARAM_IN, "Port ID"), \
+    SW_PARAM_DEF(SW_API_PT_COMBO_PREFER_MEDIUM_GET, SW_PREFER_MEDIUM, sizeof(fal_port_medium_t), SW_PARAM_PTR|SW_PARAM_OUT, \
+              "Prefer Medium"),
+
+#define SW_API_PT_COMBO_MEDIUM_STATUS_GET_DESC \
+    SW_PARAM_DEF(SW_API_PT_COMBO_MEDIUM_STATUS_GET, SW_UINT32, 4, SW_PARAM_IN, "Dev ID"), \
+    SW_PARAM_DEF(SW_API_PT_COMBO_MEDIUM_STATUS_GET, SW_UINT32, 4, SW_PARAM_IN, "Port ID"), \
+    SW_PARAM_DEF(SW_API_PT_COMBO_MEDIUM_STATUS_GET, SW_PREFER_MEDIUM, sizeof(fal_port_medium_t), SW_PARAM_PTR|SW_PARAM_OUT, \
+              "Medium Type"),
+
+#define SW_API_PT_COMBO_FIBER_MODE_SET_DESC \
+    SW_PARAM_DEF(SW_API_PT_COMBO_FIBER_MODE_SET, SW_UINT32, 4, SW_PARAM_IN, "Dev ID"), \
+    SW_PARAM_DEF(SW_API_PT_COMBO_FIBER_MODE_SET, SW_UINT32, 4, SW_PARAM_IN, "Port ID"), \
+    SW_PARAM_DEF(SW_API_PT_COMBO_FIBER_MODE_SET, SW_FIBER_MODE, sizeof(fal_port_fiber_mode_t), SW_PARAM_IN, "Fbier Mode"),
+
+
+#define SW_API_PT_COMBO_FIBER_MODE_GET_DESC \
+    SW_PARAM_DEF(SW_API_PT_COMBO_FIBER_MODE_GET, SW_UINT32, 4, SW_PARAM_IN, "Dev ID"), \
+    SW_PARAM_DEF(SW_API_PT_COMBO_FIBER_MODE_GET, SW_UINT32, 4, SW_PARAM_IN, "Port ID"), \
+    SW_PARAM_DEF(SW_API_PT_COMBO_FIBER_MODE_GET, SW_FIBER_MODE, sizeof(fal_port_fiber_mode_t), SW_PARAM_PTR|SW_PARAM_OUT, \
+              "Fiber Mode"),
+
+#define SW_API_PT_LOCAL_LOOPBACK_SET_DESC \
+    SW_PARAM_DEF(SW_API_PT_LOCAL_LOOPBACK_SET, SW_UINT32, 4, SW_PARAM_IN, "Dev ID"), \
+    SW_PARAM_DEF(SW_API_PT_LOCAL_LOOPBACK_SET, SW_UINT32, 4, SW_PARAM_IN, "Port ID"), \
+    SW_PARAM_DEF(SW_API_PT_LOCAL_LOOPBACK_SET, SW_ENABLE, 4, SW_PARAM_IN, "Local Loopback Status"),
+
+#define SW_API_PT_LOCAL_LOOPBACK_GET_DESC \
+    SW_PARAM_DEF(SW_API_PT_LOCAL_LOOPBACK_GET, SW_UINT32, 4, SW_PARAM_IN, "Dev ID"), \
+    SW_PARAM_DEF(SW_API_PT_LOCAL_LOOPBACK_GET, SW_UINT32, 4, SW_PARAM_IN, "Port ID"), \
+    SW_PARAM_DEF(SW_API_PT_LOCAL_LOOPBACK_GET, SW_ENABLE, 4, SW_PARAM_PTR|SW_PARAM_OUT, "Local Loopback Status"),
+
+#define SW_API_PT_REMOTE_LOOPBACK_SET_DESC \
+    SW_PARAM_DEF(SW_API_PT_REMOTE_LOOPBACK_SET, SW_UINT32, 4, SW_PARAM_IN, "Dev ID"), \
+    SW_PARAM_DEF(SW_API_PT_REMOTE_LOOPBACK_SET, SW_UINT32, 4, SW_PARAM_IN, "Port ID"), \
+    SW_PARAM_DEF(SW_API_PT_REMOTE_LOOPBACK_SET, SW_ENABLE, 4, SW_PARAM_IN, "Remote Loopback Status"),
+
+#define SW_API_PT_REMOTE_LOOPBACK_GET_DESC \
+    SW_PARAM_DEF(SW_API_PT_REMOTE_LOOPBACK_GET, SW_UINT32, 4, SW_PARAM_IN, "Dev ID"), \
+    SW_PARAM_DEF(SW_API_PT_REMOTE_LOOPBACK_GET, SW_UINT32, 4, SW_PARAM_IN, "Port ID"), \
+    SW_PARAM_DEF(SW_API_PT_REMOTE_LOOPBACK_GET, SW_ENABLE, 4, SW_PARAM_PTR|SW_PARAM_OUT, "Remote Loopback Status"),
+
+#define SW_API_PT_RESET_DESC \
+    SW_PARAM_DEF(SW_API_PT_RESET, SW_UINT32, 4, SW_PARAM_IN, "Dev ID"), \
+    SW_PARAM_DEF(SW_API_PT_RESET, SW_UINT32, 4, SW_PARAM_IN, "Port ID"),
+
+#define SW_API_PT_POWER_OFF_DESC \
+    SW_PARAM_DEF(SW_API_PT_POWER_OFF, SW_UINT32, 4, SW_PARAM_IN, "Dev ID"), \
+    SW_PARAM_DEF(SW_API_PT_POWER_OFF, SW_UINT32, 4, SW_PARAM_IN, "Port ID"),
+
+#define SW_API_PT_POWER_ON_DESC \
+    SW_PARAM_DEF(SW_API_PT_POWER_ON, SW_UINT32, 4, SW_PARAM_IN, "Dev ID"), \
+    SW_PARAM_DEF(SW_API_PT_POWER_ON, SW_UINT32, 4, SW_PARAM_IN, "Port ID"),
+
+#define SW_API_PT_MAGIC_FRAME_MAC_SET_DESC \
+    SW_PARAM_DEF(SW_API_PT_MAGIC_FRAME_MAC_SET, SW_UINT32, 4, SW_PARAM_IN, "Dev ID"), \
+    SW_PARAM_DEF(SW_API_PT_MAGIC_FRAME_MAC_SET, SW_UINT32, 4, SW_PARAM_IN, "Port ID"), \
+    SW_PARAM_DEF(SW_API_PT_MAGIC_FRAME_MAC_SET, SW_MACADDR, sizeof(fal_mac_addr_t), SW_PARAM_PTR|SW_PARAM_IN, "Magic mac"),
+
+#define SW_API_PT_MAGIC_FRAME_MAC_GET_DESC \
+    SW_PARAM_DEF(SW_API_PT_MAGIC_FRAME_MAC_GET, SW_UINT32, 4, SW_PARAM_IN, "Dev ID"), \
+    SW_PARAM_DEF(SW_API_PT_MAGIC_FRAME_MAC_GET, SW_UINT32, 4, SW_PARAM_IN, "Port ID"), \
+    SW_PARAM_DEF(SW_API_PT_MAGIC_FRAME_MAC_GET, SW_MACADDR, sizeof(fal_mac_addr_t), SW_PARAM_PTR|SW_PARAM_OUT, "Magic mac"),
+
+#define SW_API_PT_PHY_ID_GET_DESC \
+    SW_PARAM_DEF(SW_API_PT_PHY_ID_GET, SW_UINT32, 4, SW_PARAM_IN, "Dev ID"), \
+    SW_PARAM_DEF(SW_API_PT_PHY_ID_GET, SW_UINT32, 4, SW_PARAM_IN, "Port ID"), \
+    SW_PARAM_DEF(SW_API_PT_PHY_ID_GET, SW_UINT16, 4, SW_PARAM_PTR|SW_PARAM_OUT, "Org ID"), \
+    SW_PARAM_DEF(SW_API_PT_PHY_ID_GET, SW_UINT16, 4, SW_PARAM_PTR|SW_PARAM_OUT, "Rev ID"),
+
+#define SW_API_PT_WOL_STATUS_SET_DESC \
+    SW_PARAM_DEF(SW_API_PT_WOL_STATUS_SET, SW_UINT32, 4, SW_PARAM_IN, "Dev ID"), \
+    SW_PARAM_DEF(SW_API_PT_WOL_STATUS_SET, SW_UINT32, 4, SW_PARAM_IN, "Port ID"), \
+    SW_PARAM_DEF(SW_API_PT_WOL_STATUS_SET, SW_ENABLE, 4, SW_PARAM_IN, "Wol Status"),
+
+#define SW_API_PT_WOL_STATUS_GET_DESC \
+    SW_PARAM_DEF(SW_API_PT_WOL_STATUS_GET, SW_UINT32, 4, SW_PARAM_IN, "Dev ID"), \
+    SW_PARAM_DEF(SW_API_PT_WOL_STATUS_GET, SW_UINT32, 4, SW_PARAM_IN, "Port ID"), \
+    SW_PARAM_DEF(SW_API_PT_WOL_STATUS_GET, SW_ENABLE, 4, SW_PARAM_PTR|SW_PARAM_OUT, "Wol Status"),
+
+#define SW_API_PT_INTERFACE_MODE_SET_DESC \
+    SW_PARAM_DEF(SW_API_PT_INTERFACE_MODE_SET, SW_UINT32, 4, SW_PARAM_IN, "Dev ID"), \
+    SW_PARAM_DEF(SW_API_PT_INTERFACE_MODE_SET, SW_UINT32, 4, SW_PARAM_IN, "Port ID"), \
+    SW_PARAM_DEF(SW_API_PT_INTERFACE_MODE_SET, SW_INTERFACE_MODE, sizeof(fal_port_interface_mode_t), SW_PARAM_IN, "Interface Mode"),
+
+
+#define SW_API_PT_INTERFACE_MODE_GET_DESC \
+    SW_PARAM_DEF(SW_API_PT_INTERFACE_MODE_GET, SW_UINT32, 4, SW_PARAM_IN, "Dev ID"), \
+    SW_PARAM_DEF(SW_API_PT_INTERFACE_MODE_GET, SW_UINT32, 4, SW_PARAM_IN, "Port ID"), \
+    SW_PARAM_DEF(SW_API_PT_INTERFACE_MODE_GET, SW_INTERFACE_MODE, sizeof(fal_port_interface_mode_t), SW_PARAM_PTR|SW_PARAM_OUT, \
+              "Interface Mode"),
+
+#define SW_API_PT_INTERFACE_MODE_STATUS_GET_DESC\
+    SW_PARAM_DEF(SW_API_PT_INTERFACE_MODE_STATUS_GET, SW_UINT32, 4, SW_PARAM_IN, "Dev ID"), \
+    SW_PARAM_DEF(SW_API_PT_INTERFACE_MODE_STATUS_GET, SW_UINT32, 4, SW_PARAM_IN, "Port ID"), \
+    SW_PARAM_DEF(SW_API_PT_INTERFACE_MODE_STATUS_GET, SW_INTERFACE_MODE, sizeof(fal_port_interface_mode_t), SW_PARAM_PTR|SW_PARAM_OUT, \
+              "Interface Status"),
 
 
 #define SW_API_VLAN_ADD_DESC \
diff --git a/include/api/sw_api.h b/include/api/sw_api.h
index 4861a75..3c70a67 100755
--- a/include/api/sw_api.h
+++ b/include/api/sw_api.h
@@ -117,6 +117,11 @@
 		SW_FLOWCOOKIE,
 		SW_FDB_RFS,
 		SW_FLOWRFS,
+		SW_CROSSOVER_MODE,
+		SW_CROSSOVER_STATUS,
+		SW_PREFER_MEDIUM,
+		SW_FIBER_MODE,
+		SW_INTERFACE_MODE,
     } sw_data_type_e;
 
     typedef struct
diff --git a/include/api/sw_ioctl.h b/include/api/sw_ioctl.h
index 26d94a2..5138558 100755
--- a/include/api/sw_ioctl.h
+++ b/include/api/sw_ioctl.h
@@ -75,10 +75,31 @@
 #define SW_API_PT_CONGESTION_DROP_GET   (43+ SW_API_PORT_OFFSET)
 #define SW_API_PT_RING_FLOW_CTRL_THRES_SET   (44+ SW_API_PORT_OFFSET)
 #define SW_API_PT_RING_FLOW_CTRL_THRES_GET   (45+ SW_API_PORT_OFFSET)
-
-
-
-
+#define SW_API_PT_8023AZ_SET     (46 + SW_API_PORT_OFFSET)
+#define SW_API_PT_8023AZ_GET     (47 + SW_API_PORT_OFFSET)
+#define SW_API_PT_MDIX_SET  (48 + SW_API_PORT_OFFSET)
+#define SW_API_PT_MDIX_GET  (49 + SW_API_PORT_OFFSET)
+#define SW_API_PT_MDIX_STATUS_GET  (50 + SW_API_PORT_OFFSET)
+#define SW_API_PT_COMBO_PREFER_MEDIUM_SET (51 + SW_API_PORT_OFFSET)
+#define SW_API_PT_COMBO_PREFER_MEDIUM_GET  (52 + SW_API_PORT_OFFSET)
+#define SW_API_PT_COMBO_MEDIUM_STATUS_GET  (53 + SW_API_PORT_OFFSET)
+#define SW_API_PT_COMBO_FIBER_MODE_SET  (54 + SW_API_PORT_OFFSET)
+#define SW_API_PT_COMBO_FIBER_MODE_GET  (55 + SW_API_PORT_OFFSET)
+#define SW_API_PT_LOCAL_LOOPBACK_SET  (56 + SW_API_PORT_OFFSET)
+#define SW_API_PT_LOCAL_LOOPBACK_GET  (57 + SW_API_PORT_OFFSET)
+#define SW_API_PT_REMOTE_LOOPBACK_SET  (58 + SW_API_PORT_OFFSET)
+#define SW_API_PT_REMOTE_LOOPBACK_GET  (59 + SW_API_PORT_OFFSET)
+#define SW_API_PT_RESET  (60 + SW_API_PORT_OFFSET)
+#define SW_API_PT_POWER_OFF  (61 + SW_API_PORT_OFFSET)
+#define SW_API_PT_POWER_ON  (62 + SW_API_PORT_OFFSET)
+#define SW_API_PT_MAGIC_FRAME_MAC_SET  (63 + SW_API_PORT_OFFSET)
+#define SW_API_PT_MAGIC_FRAME_MAC_GET  (64 + SW_API_PORT_OFFSET)
+#define SW_API_PT_PHY_ID_GET  (65 + SW_API_PORT_OFFSET)
+#define SW_API_PT_WOL_STATUS_SET  (66 + SW_API_PORT_OFFSET)
+#define SW_API_PT_WOL_STATUS_GET  (67 + SW_API_PORT_OFFSET)
+#define SW_API_PT_INTERFACE_MODE_SET  (68 + SW_API_PORT_OFFSET)
+#define SW_API_PT_INTERFACE_MODE_GET  (69 + SW_API_PORT_OFFSET)
+#define SW_API_PT_INTERFACE_MODE_STATUS_GET  (70 + SW_API_PORT_OFFSET)
 
     /*vlan*/
 #define SW_API_VLAN_OFFSET         110
diff --git a/include/fal/fal_api.h b/include/fal/fal_api.h
index afc4739..d8d3bbe 100755
--- a/include/fal/fal_api.h
+++ b/include/fal/fal_api.h
@@ -68,8 +68,32 @@
     SW_API_DEF(SW_API_PT_CONGESTION_DROP_SET, fal_port_congestion_drop_set), \
     SW_API_DEF(SW_API_PT_CONGESTION_DROP_GET, fal_port_congestion_drop_get), \
     SW_API_DEF(SW_API_PT_RING_FLOW_CTRL_THRES_SET, fal_ring_flow_ctrl_thres_set), \
-    SW_API_DEF(SW_API_PT_RING_FLOW_CTRL_THRES_GET, fal_ring_flow_ctrl_thres_get),
-    
+    SW_API_DEF(SW_API_PT_RING_FLOW_CTRL_THRES_GET, fal_ring_flow_ctrl_thres_get), \
+    SW_API_DEF(SW_API_PT_8023AZ_SET, fal_port_8023az_set), \
+    SW_API_DEF(SW_API_PT_8023AZ_GET, fal_port_8023az_get), \
+    SW_API_DEF(SW_API_PT_MDIX_SET, fal_port_mdix_set), \
+    SW_API_DEF(SW_API_PT_MDIX_GET, fal_port_mdix_get), \
+    SW_API_DEF(SW_API_PT_MDIX_STATUS_GET, fal_port_mdix_status_get), \
+    SW_API_DEF(SW_API_PT_COMBO_PREFER_MEDIUM_SET, fal_port_combo_prefer_medium_set), \
+    SW_API_DEF(SW_API_PT_COMBO_PREFER_MEDIUM_GET, fal_port_combo_prefer_medium_get), \
+    SW_API_DEF(SW_API_PT_COMBO_MEDIUM_STATUS_GET, fal_port_combo_medium_status_get), \
+    SW_API_DEF(SW_API_PT_COMBO_FIBER_MODE_SET, fal_port_combo_fiber_mode_set), \
+    SW_API_DEF(SW_API_PT_COMBO_FIBER_MODE_GET, fal_port_combo_fiber_mode_get), \
+    SW_API_DEF(SW_API_PT_LOCAL_LOOPBACK_SET, fal_port_local_loopback_set), \
+    SW_API_DEF(SW_API_PT_LOCAL_LOOPBACK_GET, fal_port_local_loopback_get), \
+    SW_API_DEF(SW_API_PT_REMOTE_LOOPBACK_SET, fal_port_remote_loopback_set), \
+    SW_API_DEF(SW_API_PT_REMOTE_LOOPBACK_GET, fal_port_remote_loopback_get), \
+    SW_API_DEF(SW_API_PT_RESET, fal_port_reset), \
+    SW_API_DEF(SW_API_PT_POWER_OFF, fal_port_power_off), \
+    SW_API_DEF(SW_API_PT_POWER_ON, fal_port_power_on), \
+    SW_API_DEF(SW_API_PT_MAGIC_FRAME_MAC_SET, fal_port_magic_frame_mac_set), \
+    SW_API_DEF(SW_API_PT_MAGIC_FRAME_MAC_GET, fal_port_magic_frame_mac_get), \
+    SW_API_DEF(SW_API_PT_PHY_ID_GET, fal_port_phy_id_get), \
+    SW_API_DEF(SW_API_PT_WOL_STATUS_SET, fal_port_wol_status_set), \
+    SW_API_DEF(SW_API_PT_WOL_STATUS_GET, fal_port_wol_status_get), \
+    SW_API_DEF(SW_API_PT_INTERFACE_MODE_SET, fal_port_interface_mode_set), \
+    SW_API_DEF(SW_API_PT_INTERFACE_MODE_GET, fal_port_interface_mode_get), \
+    SW_API_DEF(SW_API_PT_INTERFACE_MODE_STATUS_GET, fal_port_interface_mode_status_get),
 
 #define PORTCONTROL_API_PARAM \
     SW_API_DESC(SW_API_PT_DUPLEX_GET) \
@@ -117,7 +141,33 @@
     SW_API_DESC(SW_API_PT_CONGESTION_DROP_SET) \
     SW_API_DESC(SW_API_PT_CONGESTION_DROP_GET) \
     SW_API_DESC(SW_API_PT_RING_FLOW_CTRL_THRES_SET) \
-	SW_API_DESC(SW_API_PT_RING_FLOW_CTRL_THRES_GET)
+    SW_API_DESC(SW_API_PT_RING_FLOW_CTRL_THRES_GET) \
+    SW_API_DESC(SW_API_PT_8023AZ_SET) \
+    SW_API_DESC(SW_API_PT_8023AZ_GET) \
+    SW_API_DESC(SW_API_PT_MDIX_SET) \
+    SW_API_DESC(SW_API_PT_MDIX_GET) \
+    SW_API_DESC(SW_API_PT_MDIX_STATUS_GET) \
+    SW_API_DESC(SW_API_PT_COMBO_PREFER_MEDIUM_SET) \
+    SW_API_DESC(SW_API_PT_COMBO_PREFER_MEDIUM_GET) \
+    SW_API_DESC(SW_API_PT_COMBO_MEDIUM_STATUS_GET) \
+    SW_API_DESC(SW_API_PT_COMBO_FIBER_MODE_SET) \
+    SW_API_DESC(SW_API_PT_COMBO_FIBER_MODE_GET) \
+    SW_API_DESC(SW_API_PT_LOCAL_LOOPBACK_SET) \
+    SW_API_DESC(SW_API_PT_LOCAL_LOOPBACK_GET) \
+    SW_API_DESC(SW_API_PT_REMOTE_LOOPBACK_SET) \
+    SW_API_DESC(SW_API_PT_REMOTE_LOOPBACK_GET) \
+    SW_API_DESC(SW_API_PT_RESET) \
+    SW_API_DESC(SW_API_PT_POWER_OFF) \
+    SW_API_DESC(SW_API_PT_POWER_ON) \
+    SW_API_DESC(SW_API_PT_MAGIC_FRAME_MAC_SET) \
+    SW_API_DESC(SW_API_PT_MAGIC_FRAME_MAC_GET) \
+    SW_API_DESC(SW_API_PT_PHY_ID_GET) \
+    SW_API_DESC(SW_API_PT_WOL_STATUS_SET) \
+    SW_API_DESC(SW_API_PT_WOL_STATUS_GET) \
+    SW_API_DESC(SW_API_PT_INTERFACE_MODE_SET) \
+    SW_API_DESC(SW_API_PT_INTERFACE_MODE_GET) \
+    SW_API_DESC(SW_API_PT_INTERFACE_MODE_STATUS_GET)
+
 #else
 #define PORTCONTROL_API
 #define PORTCONTROL_API_PARAM
diff --git a/include/fal/fal_port_ctrl.h b/include/fal/fal_port_ctrl.h
index 7ff25ed..8c34bf9 100755
--- a/include/fal/fal_port_ctrl.h
+++ b/include/fal/fal_port_ctrl.h
@@ -198,6 +198,21 @@
 				    /**< Phy auto-negotiation done */
 	} fal_port_auto_neg_status_t;
 
+
+/** Phy interface mode */
+	typedef enum {
+		PHY_PSGMII_BASET = 0,
+				/**< PSGMII mode */
+		PHY_PSGMII_BX1000 = 1,
+				/**< PSGMII BX1000 mode */
+		PHY_PSGMII_FX100 = 2,
+				/**< PSGMII FX100 mode */
+		PHY_PSGMII_AMDET = 3,
+				/**< PSGMII Auto mode */
+		PHY_SGMII_BASET = 4,
+				/**< SGMII mode */
+	} fal_port_interface_mode_t;
+
 /*above is new add for malibu phy*/
 
 	 sw_error_t
@@ -438,6 +453,47 @@
 	    fal_port_remote_loopback_get(a_uint32_t dev_id, fal_port_t port_id,
 					 a_bool_t * enable);
 
+	 sw_error_t
+	    fal_port_reset(a_uint32_t dev_id, fal_port_t port_id);
+
+	 sw_error_t
+	    fal_port_power_off(a_uint32_t dev_id, fal_port_t port_id);
+
+	 sw_error_t
+	    fal_port_power_on(a_uint32_t dev_id, fal_port_t port_id);
+
+    sw_error_t
+    fal_port_magic_frame_mac_set (a_uint32_t dev_id, fal_port_t port_id,
+				   fal_mac_addr_t * mac);
+
+   sw_error_t
+   fal_port_magic_frame_mac_get (a_uint32_t dev_id, fal_port_t port_id,
+				   fal_mac_addr_t * mac);
+
+ sw_error_t
+    fal_port_phy_id_get (a_uint32_t dev_id, fal_port_t port_id,
+		      a_uint16_t * org_id, a_uint16_t * rev_id);
+
+ sw_error_t
+    fal_port_wol_status_set (a_uint32_t dev_id, fal_port_t port_id,
+			      a_bool_t enable);
+
+ sw_error_t
+    fal_port_wol_status_get (a_uint32_t dev_id, fal_port_t port_id,
+			      a_bool_t * enable);
+
+ sw_error_t
+    fal_port_interface_mode_set (a_uint32_t dev_id, fal_port_t port_id,
+			      fal_port_interface_mode_t mode);
+
+ sw_error_t
+    fal_port_interface_mode_get (a_uint32_t dev_id, fal_port_t port_id,
+			      fal_port_interface_mode_t * mode);
+
+ sw_error_t
+    fal_port_interface_mode_status_get (a_uint32_t dev_id, fal_port_t port_id,
+			      fal_port_interface_mode_t * mode);
+
 #ifdef __cplusplus
 }
 #endif				/* __cplusplus */
diff --git a/include/hsl/dess/dess_api.h b/include/hsl/dess/dess_api.h
index e8b44aa..4db5903 100755
--- a/include/hsl/dess/dess_api.h
+++ b/include/hsl/dess/dess_api.h
@@ -65,7 +65,24 @@
     SW_API_DEF(SW_API_PT_CONGESTION_DROP_SET, dess_port_congestion_drop_set), \
     SW_API_DEF(SW_API_PT_CONGESTION_DROP_GET, dess_port_congestion_drop_get), \
     SW_API_DEF(SW_API_PT_RING_FLOW_CTRL_THRES_SET, dess_ring_flow_ctrl_thres_set), \
-	SW_API_DEF(SW_API_PT_RING_FLOW_CTRL_THRES_GET, dess_ring_flow_ctrl_thres_get),
+    SW_API_DEF(SW_API_PT_RING_FLOW_CTRL_THRES_GET, dess_ring_flow_ctrl_thres_get),\
+    SW_API_DEF(SW_API_PT_8023AZ_SET, dess_port_8023az_set), \
+    SW_API_DEF(SW_API_PT_8023AZ_GET, dess_port_8023az_get), \
+    SW_API_DEF(SW_API_PT_MDIX_SET, dess_port_mdix_set), \
+    SW_API_DEF(SW_API_PT_MDIX_GET, dess_port_mdix_get), \
+    SW_API_DEF(SW_API_PT_MDIX_STATUS_GET, dess_port_mdix_status_get), \
+    SW_API_DEF(SW_API_PT_COMBO_PREFER_MEDIUM_SET, dess_port_combo_prefer_medium_set), \
+    SW_API_DEF(SW_API_PT_COMBO_PREFER_MEDIUM_GET, dess_port_combo_prefer_medium_get), \
+    SW_API_DEF(SW_API_PT_COMBO_MEDIUM_STATUS_GET, dess_port_combo_medium_status_get), \
+    SW_API_DEF(SW_API_PT_COMBO_FIBER_MODE_SET, dess_port_combo_fiber_mode_set), \
+    SW_API_DEF(SW_API_PT_COMBO_FIBER_MODE_GET, dess_port_combo_fiber_mode_get), \
+    SW_API_DEF(SW_API_PT_LOCAL_LOOPBACK_SET, dess_port_local_loopback_set), \
+    SW_API_DEF(SW_API_PT_LOCAL_LOOPBACK_GET, dess_port_local_loopback_get), \
+    SW_API_DEF(SW_API_PT_REMOTE_LOOPBACK_SET, dess_port_remote_loopback_set), \
+    SW_API_DEF(SW_API_PT_REMOTE_LOOPBACK_GET, dess_port_remote_loopback_get), \
+    SW_API_DEF(SW_API_PT_RESET, dess_port_reset), \
+    SW_API_DEF(SW_API_PT_POWER_OFF, dess_port_power_off), \
+    SW_API_DEF(SW_API_PT_POWER_ON, dess_port_power_on),
 
 #define PORTCONTROL_API_PARAM \
     SW_API_DESC(SW_API_PT_DUPLEX_GET) \
@@ -110,7 +127,25 @@
     SW_API_DESC(SW_API_PT_CONGESTION_DROP_SET) \
     SW_API_DESC(SW_API_PT_CONGESTION_DROP_GET) \
     SW_API_DESC(SW_API_PT_RING_FLOW_CTRL_THRES_SET) \
-	SW_API_DESC(SW_API_PT_RING_FLOW_CTRL_THRES_GET)
+    SW_API_DESC(SW_API_PT_RING_FLOW_CTRL_THRES_GET)\
+    SW_API_DESC(SW_API_PT_8023AZ_SET) \
+    SW_API_DESC(SW_API_PT_8023AZ_GET) \
+    SW_API_DESC(SW_API_PT_MDIX_SET) \
+    SW_API_DESC(SW_API_PT_MDIX_GET) \
+    SW_API_DESC(SW_API_PT_MDIX_STATUS_GET) \
+    SW_API_DESC(SW_API_PT_COMBO_PREFER_MEDIUM_SET) \
+    SW_API_DESC(SW_API_PT_COMBO_PREFER_MEDIUM_GET) \
+    SW_API_DESC(SW_API_PT_COMBO_MEDIUM_STATUS_GET) \
+    SW_API_DESC(SW_API_PT_COMBO_FIBER_MODE_SET) \
+    SW_API_DESC(SW_API_PT_COMBO_FIBER_MODE_GET) \
+    SW_API_DESC(SW_API_PT_LOCAL_LOOPBACK_SET) \
+    SW_API_DESC(SW_API_PT_LOCAL_LOOPBACK_GET) \
+    SW_API_DESC(SW_API_PT_REMOTE_LOOPBACK_SET) \
+    SW_API_DESC(SW_API_PT_REMOTE_LOOPBACK_GET) \
+    SW_API_DESC(SW_API_PT_RESET) \
+    SW_API_DESC(SW_API_PT_POWER_OFF) \
+    SW_API_DESC(SW_API_PT_POWER_ON)
+
 #else
 #define PORTCONTROL_API
 #define PORTCONTROL_API_PARAM
diff --git a/include/hsl/dess/dess_port_ctrl.h b/include/hsl/dess/dess_port_ctrl.h
index 540b05e..ea81dfa 100755
--- a/include/hsl/dess/dess_port_ctrl.h
+++ b/include/hsl/dess/dess_port_ctrl.h
@@ -311,7 +311,7 @@
 				   fal_mac_addr_t * mac);
 
   HSL_LOCAL sw_error_t
-    dess_port_id_get (a_uint32_t dev_id, fal_port_t port_id,
+    dess_port_phy_id_get (a_uint32_t dev_id, fal_port_t port_id,
 		      a_uint16_t * org_id, a_uint16_t * rev_id);
 
   HSL_LOCAL sw_error_t
@@ -322,6 +322,26 @@
     dess_port_wol_status_get (a_uint32_t dev_id, fal_port_t port_id,
 			      a_bool_t * enable);
 
+  HSL_LOCAL sw_error_t
+    dess_port_reset (a_uint32_t dev_id, fal_port_t port_id);
+
+  HSL_LOCAL sw_error_t
+    dess_port_power_off (a_uint32_t dev_id, fal_port_t port_id);
+
+  HSL_LOCAL sw_error_t
+    dess_port_power_on (a_uint32_t dev_id, fal_port_t port_id);
+
+  HSL_LOCAL sw_error_t
+    dess_port_interface_mode_set (a_uint32_t dev_id, fal_port_t port_id,
+			      fal_port_interface_mode_t mode);
+
+  HSL_LOCAL sw_error_t
+    dess_port_interface_mode_get (a_uint32_t dev_id, fal_port_t port_id,
+			      fal_port_interface_mode_t * mode);
+
+  HSL_LOCAL sw_error_t
+    dess_port_interface_mode_status_get (a_uint32_t dev_id, fal_port_t port_id,
+			      fal_port_interface_mode_t * mode);
 #endif
 
 #ifdef __cplusplus
diff --git a/include/hsl/hsl_api.h b/include/hsl/hsl_api.h
index 4175016..d706738 100755
--- a/include/hsl/hsl_api.h
+++ b/include/hsl/hsl_api.h
@@ -492,7 +492,41 @@
     (*hsl_port_remote_loopback_get) (a_uint32_t dev_id, fal_port_t port_id,
 				     a_bool_t * enable);
 
+  typedef sw_error_t
+    (*hsl_port_reset) (a_uint32_t dev_id, fal_port_t port_id);
 
+  typedef sw_error_t
+    (*hsl_port_power_off) (a_uint32_t dev_id, fal_port_t port_id);
+
+  typedef sw_error_t
+    (*hsl_port_power_on) (a_uint32_t dev_id, fal_port_t port_id);
+
+  typedef sw_error_t
+    (*hsl_port_phy_id_get) (a_uint32_t dev_id, fal_port_t port_id,a_uint16_t * org_id, a_uint16_t * rev_id);
+
+  typedef sw_error_t
+    (*hsl_port_wol_status_set) (a_uint32_t dev_id, fal_port_t port_id,a_bool_t enable);
+
+  typedef sw_error_t
+    (*hsl_port_wol_status_get) (a_uint32_t dev_id, fal_port_t port_id,a_bool_t *enable);
+
+  typedef sw_error_t
+    (*hsl_port_magic_frame_mac_set) (a_uint32_t dev_id, fal_port_t port_id,fal_mac_addr_t * mac);
+
+  typedef sw_error_t
+    (*hsl_port_magic_frame_mac_get) (a_uint32_t dev_id, fal_port_t port_id,fal_mac_addr_t * mac);
+
+  typedef sw_error_t
+    (*hsl_port_interface_mode_set) (a_uint32_t dev_id, fal_port_t port_id,
+			      fal_port_interface_mode_t mode);
+
+  typedef sw_error_t
+    (*hsl_port_interface_mode_get) (a_uint32_t dev_id, fal_port_t port_id,
+			      fal_port_interface_mode_t * mode);
+
+  typedef sw_error_t
+    (*hsl_port_interface_mode_status_get) (a_uint32_t dev_id, fal_port_t port_id,
+			      fal_port_interface_mode_t * mode);
   /* VLAN */
 #define VLAN_FUNC_PROTOTYPE_DEF
   typedef sw_error_t
@@ -1982,7 +2016,6 @@
     hsl_port_flowctrl_get port_flowctrl_get;
     hsl_port_flowctrl_forcemode_set port_flowctrl_forcemode_set;
     hsl_port_flowctrl_forcemode_get port_flowctrl_forcemode_get;
-
     hsl_port_powersave_set port_powersave_set;
     hsl_port_powersave_get port_powersave_get;
     hsl_port_hibernate_set port_hibernate_set;
@@ -2028,7 +2061,17 @@
     hsl_port_local_loopback_get port_local_loopback_get;
     hsl_port_remote_loopback_set port_remote_loopback_set;
     hsl_port_remote_loopback_get port_remote_loopback_get;
-
+    hsl_port_reset port_reset;
+    hsl_port_power_off port_power_off;
+    hsl_port_power_on port_power_on;
+    hsl_port_phy_id_get port_phy_id_get;
+    hsl_port_wol_status_set port_wol_status_set;
+    hsl_port_wol_status_get port_wol_status_get;
+    hsl_port_magic_frame_mac_set port_magic_frame_mac_set;
+    hsl_port_magic_frame_mac_get port_magic_frame_mac_get;
+    hsl_port_interface_mode_set port_interface_mode_set;
+    hsl_port_interface_mode_get port_interface_mode_get;
+    hsl_port_interface_mode_status_get port_interface_mode_status_get;
 
     /* VLAN */
     hsl_vlan_entry_append vlan_entry_append;
diff --git a/include/hsl/phy/hsl_phy.h b/include/hsl/phy/hsl_phy.h
index c5c70b6..312a172 100755
--- a/include/hsl/phy/hsl_phy.h
+++ b/include/hsl/phy/hsl_phy.h
@@ -125,6 +125,10 @@
 						       a_uint32_t phy_id,
 						       fal_port_reset_status_t *
 						       status);
+	typedef sw_error_t(*hsl_phy_power_off) (a_uint32_t dev_id,
+					    a_uint32_t phy_id);
+	typedef sw_error_t(*hsl_phy_power_on) (a_uint32_t dev_id,
+					    a_uint32_t phy_id);
 	typedef sw_error_t(*hsl_phy_id_get) (a_uint32_t dev_id,
 					     a_uint32_t phy_id,
 					     a_uint16_t * org_id,
@@ -166,18 +170,24 @@
 	typedef sw_error_t(*hsl_phy_magic_frame_mac_get) (a_uint32_t dev_id,
 							  a_uint32_t phy_id,
 							  fal_mac_addr_t * mac);
-
-	typedef sw_error_t(*hsl_phy_phy_id_get) (a_uint32_t dev_id,
-						 a_uint32_t phy_id,
-						 a_uint16_t * org_id,
-						 a_uint16_t * rev_id);
 	typedef sw_error_t(*hsl_phy_wol_status_set) (a_uint32_t dev_id,
 							 a_uint32_t phy_id,
 							 a_bool_t enable);
 	typedef sw_error_t(*hsl_phy_wol_status_get) (a_uint32_t dev_id,
 							 a_uint32_t phy_id,
 							 a_bool_t * enable);
-
+	typedef sw_error_t(*hsl_phy_interface_mode_set) (a_uint32_t dev_id,
+							 a_uint32_t phy_id,
+							 fal_port_interface_mode_t
+							 interface_mode);
+	typedef sw_error_t(*hsl_phy_interface_mode_get) (a_uint32_t dev_id,
+							 a_uint32_t phy_id,
+							 fal_port_interface_mode_t
+							 * interface_mode);
+	typedef sw_error_t(*hsl_phy_interface_mode_status_get) (a_uint32_t dev_id,
+							 a_uint32_t phy_id,
+							 fal_port_interface_mode_t
+							 * interface_mode);
 	typedef struct hsl_phy_ops_s {
 
 		hsl_phy_init phy_init;
@@ -191,6 +201,8 @@
 		hsl_phy_autoneg_enable_get phy_autoneg_enable_get;
 		hsl_phy_restart_autoneg phy_restart_autoneg;
 		hsl_phy_autoneg_status_get phy_autoneg_status_get;
+		hsl_phy_autoneg_adv_set phy_autoneg_adv_set;
+		hsl_phy_autoneg_adv_get phy_autoneg_adv_get;
 		hsl_phy_powersave_set phy_powersave_set;
 		hsl_phy_powersave_get phy_powersave_get;
 		hsl_phy_cdt phy_cdt;
@@ -213,10 +225,10 @@
 		hsl_phy_combo_fiber_mode_set phy_combo_fiber_mode_set;
 		hsl_phy_combo_fiber_mode_get phy_combo_fiber_mode_get;
 		hsl_phy_reset phy_reset;
+		hsl_phy_power_off phy_power_off;
+		hsl_phy_power_on phy_power_on;
 		hsl_phy_reset_status_get phy_reset_status_get;
 		hsl_phy_id_get phy_id_get;
-		hsl_phy_autoneg_adv_set phy_autoneg_adv_set;
-		hsl_phy_autoneg_adv_get phy_autoneg_adv_get;
 		hsl_phy_reg_write phy_reg_write;
 		hsl_phy_reg_read phy_reg_read;
 		hsl_phy_debug_write phy_debug_write;
@@ -225,9 +237,11 @@
 		hsl_phy_mmd_read phy_mmd_read;
 		hsl_phy_magic_frame_mac_set phy_magic_frame_mac_set;
 		hsl_phy_magic_frame_mac_get phy_magic_frame_mac_get;
-		hsl_phy_phy_id_get phy_phy_id_get;
 		hsl_phy_wol_status_set phy_wol_status_set;
 		hsl_phy_wol_status_get phy_wol_status_get;
+		hsl_phy_interface_mode_set phy_interface_mode_set;
+		hsl_phy_interface_mode_get phy_interface_mode_get;
+		hsl_phy_interface_mode_status_get phy_interface_mode_status_get;
 
 	} hsl_phy_ops_t;
 
diff --git a/include/hsl/phy/malibu_phy.h b/include/hsl/phy/malibu_phy.h
index 145dbea..4d1c02d 100755
--- a/include/hsl/phy/malibu_phy.h
+++ b/include/hsl/phy/malibu_phy.h
@@ -87,6 +87,12 @@
 #define MALIBU_SG_BX_PAGES                  0x0
 #define MALIBU_SG_COPPER_PAGES              0x1
 
+#define MALIBU_PHY_PSGMII_BASET              0x0
+#define MALIBU_PHY_PSGMII_BX1000              0x1
+#define MALIBU_PHY_PSGMII_FX100              0x2
+#define MALIBU_PHY_PSGMII_AMDET              0x3
+#define MALIBU_PHY_SGMII_BASET              0x4
+
 #define MALIBU_PHY4_PREFER_FIBER  0x400
 #define PHY4_PREFER_COPPER                0x0
 #define PHY4_PREFER_FIBER                 0x1
diff --git a/include/shell_lib/shell_io.h b/include/shell_lib/shell_io.h
index c8cadae..e316a3f 100755
--- a/include/shell_lib/shell_io.h
+++ b/include/shell_lib/shell_io.h
@@ -209,5 +209,20 @@
 cmd_data_check_fdb_rfs(char *cmd_str, void * val, a_uint32_t size);
 sw_error_t
 cmd_data_check_flow_rfs(char *cmd_str, void * val, a_uint32_t size);
+
+sw_error_t
+cmd_data_check_crossover_mode(char *cmd_str, a_uint32_t * arg_val, a_uint32_t size);
+
+sw_error_t
+cmd_data_check_crossover_status(char *cmd_str, a_uint32_t * arg_val, a_uint32_t size);
+
+sw_error_t
+cmd_data_check_prefer_medium(char *cmd_str, a_uint32_t * arg_val, a_uint32_t size);
+
+sw_error_t
+cmd_data_check_fiber_mode(char *cmd_str, a_uint32_t * arg_val, a_uint32_t size);
+
+sw_error_t
+cmd_data_check_interface_mode(char *cmd_str, a_uint32_t * arg_val, a_uint32_t size);
 #endif
 
diff --git a/src/fal/fal_port_ctrl.c b/src/fal/fal_port_ctrl.c
index e61aa32..1c5bc96 100755
--- a/src/fal/fal_port_ctrl.c
+++ b/src/fal/fal_port_ctrl.c
@@ -994,6 +994,171 @@
   return rv;
 }
 
+static sw_error_t
+_fal_port_reset (a_uint32_t dev_id, fal_port_t port_id)
+{
+  sw_error_t rv;
+  hsl_api_t *p_api;
+
+  SW_RTN_ON_NULL (p_api = hsl_api_ptr_get (dev_id));
+
+  if (NULL == p_api->port_reset)
+    return SW_NOT_SUPPORTED;
+
+  rv = p_api->port_reset (dev_id, port_id);
+  return rv;
+}
+
+static sw_error_t
+_fal_port_power_off (a_uint32_t dev_id, fal_port_t port_id)
+{
+  sw_error_t rv;
+  hsl_api_t *p_api;
+
+  SW_RTN_ON_NULL (p_api = hsl_api_ptr_get (dev_id));
+
+  if (NULL == p_api->port_power_off)
+    return SW_NOT_SUPPORTED;
+
+  rv = p_api->port_power_off (dev_id, port_id);
+  return rv;
+}
+
+static sw_error_t
+_fal_port_power_on (a_uint32_t dev_id, fal_port_t port_id)
+{
+  sw_error_t rv;
+  hsl_api_t *p_api;
+
+  SW_RTN_ON_NULL (p_api = hsl_api_ptr_get (dev_id));
+
+  if (NULL == p_api->port_power_on)
+    return SW_NOT_SUPPORTED;
+
+  rv = p_api->port_power_on (dev_id, port_id);
+  return rv;
+}
+
+static sw_error_t
+_fal_port_phy_id_get (a_uint32_t dev_id, fal_port_t port_id,a_uint16_t * org_id, a_uint16_t * rev_id)
+{
+  sw_error_t rv;
+  hsl_api_t *p_api;
+
+  SW_RTN_ON_NULL (p_api = hsl_api_ptr_get (dev_id));
+
+  if (NULL == p_api->port_phy_id_get)
+    return SW_NOT_SUPPORTED;
+
+  rv = p_api->port_phy_id_get (dev_id, port_id,org_id,rev_id);
+  return rv;
+}
+
+static sw_error_t
+_fal_port_wol_status_set (a_uint32_t dev_id, fal_port_t port_id, a_bool_t enable)
+{
+  sw_error_t rv;
+  hsl_api_t *p_api;
+
+  SW_RTN_ON_NULL (p_api = hsl_api_ptr_get (dev_id));
+
+  if (NULL == p_api->port_wol_status_set)
+    return SW_NOT_SUPPORTED;
+
+  rv = p_api->port_wol_status_set (dev_id, port_id,enable);
+  return rv;
+}
+
+static sw_error_t
+_fal_port_wol_status_get (a_uint32_t dev_id, fal_port_t port_id, a_bool_t *enable)
+{
+  sw_error_t rv;
+  hsl_api_t *p_api;
+
+  SW_RTN_ON_NULL (p_api = hsl_api_ptr_get (dev_id));
+
+  if (NULL == p_api->port_wol_status_get)
+    return SW_NOT_SUPPORTED;
+
+  rv = p_api->port_wol_status_get (dev_id, port_id,enable);
+  return rv;
+}
+
+static sw_error_t
+_fal_port_magic_frame_mac_set (a_uint32_t dev_id, fal_port_t port_id, fal_mac_addr_t * mac)
+{
+  sw_error_t rv;
+  hsl_api_t *p_api;
+
+  SW_RTN_ON_NULL (p_api = hsl_api_ptr_get (dev_id));
+
+  if (NULL == p_api->port_magic_frame_mac_set)
+    return SW_NOT_SUPPORTED;
+
+  rv = p_api->port_magic_frame_mac_set (dev_id, port_id, mac);
+  return rv;
+}
+
+static sw_error_t
+_fal_port_magic_frame_mac_get (a_uint32_t dev_id, fal_port_t port_id, fal_mac_addr_t * mac)
+{
+  sw_error_t rv;
+  hsl_api_t *p_api;
+
+  SW_RTN_ON_NULL (p_api = hsl_api_ptr_get (dev_id));
+
+  if (NULL == p_api->port_magic_frame_mac_get)
+    return SW_NOT_SUPPORTED;
+
+  rv = p_api->port_magic_frame_mac_get (dev_id, port_id, mac);
+  return rv;
+}
+
+static sw_error_t
+_fal_port_interface_mode_set (a_uint32_t dev_id, fal_port_t port_id, fal_port_interface_mode_t  mode)
+{
+  sw_error_t rv;
+  hsl_api_t *p_api;
+
+  SW_RTN_ON_NULL (p_api = hsl_api_ptr_get (dev_id));
+
+  if (NULL == p_api->port_interface_mode_set)
+    return SW_NOT_SUPPORTED;
+
+  rv = p_api->port_interface_mode_set (dev_id, port_id, mode);
+  return rv;
+}
+
+static sw_error_t
+_fal_port_interface_mode_get (a_uint32_t dev_id, fal_port_t port_id, fal_port_interface_mode_t * mode)
+{
+  sw_error_t rv;
+  hsl_api_t *p_api;
+
+  SW_RTN_ON_NULL (p_api = hsl_api_ptr_get (dev_id));
+
+  if (NULL == p_api->port_interface_mode_get)
+    return SW_NOT_SUPPORTED;
+
+  rv = p_api->port_interface_mode_get (dev_id, port_id, mode);
+  return rv;
+}
+
+static sw_error_t
+_fal_port_interface_mode_status_get (a_uint32_t dev_id, fal_port_t port_id, fal_port_interface_mode_t * mode)
+{
+  sw_error_t rv;
+  hsl_api_t *p_api;
+
+  SW_RTN_ON_NULL (p_api = hsl_api_ptr_get (dev_id));
+
+  if (NULL == p_api->port_interface_mode_status_get)
+    return SW_NOT_SUPPORTED;
+
+  rv = p_api->port_interface_mode_status_get (dev_id, port_id, mode);
+  return rv;
+}
+
 /**
  * @brief Set duplex mode on a particular port.
  * @param[in] dev_id device id
@@ -2129,5 +2294,204 @@
 }
 
 /**
+ * @brief software reset on a particular port.
+ * @param[in] dev_id device id
+ * @param[in] port_id port id
+ * @param[out]
+ * @return SW_OK or error code
+ */
+sw_error_t
+fal_port_reset (a_uint32_t dev_id, fal_port_t port_id)
+{
+  sw_error_t rv;
+
+  FAL_API_LOCK;
+  rv = _fal_port_reset (dev_id, port_id);
+  FAL_API_UNLOCK;
+  return rv;
+}
+
+/**
+ * @brief power off on a particular port.
+ * @param[in] dev_id device id
+ * @param[in] port_id port id
+ * @param[out]
+ * @return SW_OK or error code
+ */
+sw_error_t
+fal_port_power_off (a_uint32_t dev_id, fal_port_t port_id)
+{
+  sw_error_t rv;
+
+  FAL_API_LOCK;
+  rv = _fal_port_power_off (dev_id, port_id);
+  FAL_API_UNLOCK;
+  return rv;
+}
+
+/**
+ * @brief power on on a particular port.
+ * @param[in] dev_id device id
+ * @param[in] port_id port id
+ * @param[out]
+ * @return SW_OK or error code
+ */
+sw_error_t
+fal_port_power_on (a_uint32_t dev_id, fal_port_t port_id)
+{
+  sw_error_t rv;
+
+  FAL_API_LOCK;
+  rv = _fal_port_power_on (dev_id, port_id);
+  FAL_API_UNLOCK;
+  return rv;
+}
+
+/**
+ * @brief phy id on a particular port.
+ * @param[in] dev_id device id
+ * @param[in] port_id port id
+ * @param[out]
+ * @return SW_OK or error code
+ */
+sw_error_t
+fal_port_phy_id_get (a_uint32_t dev_id, fal_port_t port_id, a_uint16_t * org_id, a_uint16_t * rev_id)
+{
+  sw_error_t rv;
+
+  FAL_API_LOCK;
+  rv = _fal_port_phy_id_get (dev_id, port_id,org_id,rev_id);
+  FAL_API_UNLOCK;
+  return rv;
+}
+
+/**
+ * @brief wol status on a particular port.
+ * @param[in] dev_id device id
+ * @param[in] port_id port id
+ * @param[out]
+ * @return SW_OK or error code
+ */
+sw_error_t
+fal_port_wol_status_set (a_uint32_t dev_id, fal_port_t port_id, a_bool_t enable)
+{
+  sw_error_t rv;
+
+  FAL_API_LOCK;
+  rv = _fal_port_wol_status_set (dev_id, port_id,enable);
+  FAL_API_UNLOCK;
+  return rv;
+}
+
+/**
+ * @brief wol status on a particular port.
+ * @param[in] dev_id device id
+ * @param[in] port_id port id
+ * @param[out]
+ * @return SW_OK or error code
+ */
+sw_error_t
+fal_port_wol_status_get (a_uint32_t dev_id, fal_port_t port_id, a_bool_t *enable)
+{
+  sw_error_t rv;
+
+  FAL_API_LOCK;
+  rv = _fal_port_wol_status_get (dev_id, port_id,enable);
+  FAL_API_UNLOCK;
+  return rv;
+}
+
+/**
+ * @brief magic frame mac on a particular port.
+ * @param[in] dev_id device id
+ * @param[in] port_id port id
+ * @param[out]
+ * @return SW_OK or error code
+ */
+sw_error_t
+fal_port_magic_frame_mac_set (a_uint32_t dev_id, fal_port_t port_id, fal_mac_addr_t * mac)
+{
+  sw_error_t rv;
+
+  FAL_API_LOCK;
+  rv = _fal_port_magic_frame_mac_set (dev_id, port_id,mac);
+  FAL_API_UNLOCK;
+  return rv;
+}
+
+/**
+ * @brief magic frame mac  on a particular port.
+ * @param[in] dev_id device id
+ * @param[in] port_id port id
+ * @param[out]
+ * @return SW_OK or error code
+ */
+sw_error_t
+fal_port_magic_frame_mac_get (a_uint32_t dev_id, fal_port_t port_id, fal_mac_addr_t * mac)
+{
+  sw_error_t rv;
+
+  FAL_API_LOCK;
+  rv = _fal_port_magic_frame_mac_get (dev_id, port_id,mac);
+  FAL_API_UNLOCK;
+  return rv;
+}
+
+/**
+ * @brief interface mode  on a particular port.
+ * @param[in] dev_id device id
+ * @param[in] port_id port id
+ * @param[out]
+ * @return SW_OK or error code
+ */
+sw_error_t
+fal_port_interface_mode_set (a_uint32_t dev_id, fal_port_t port_id, fal_port_interface_mode_t  mode)
+{
+  sw_error_t rv;
+
+  FAL_API_LOCK;
+  rv = _fal_port_interface_mode_set (dev_id, port_id,mode);
+  FAL_API_UNLOCK;
+  return rv;
+}
+
+/**
+ * @brief interface mode on a particular port.
+ * @param[in] dev_id device id
+ * @param[in] port_id port id
+ * @param[out]
+ * @return SW_OK or error code
+ */
+sw_error_t
+fal_port_interface_mode_get (a_uint32_t dev_id, fal_port_t port_id, fal_port_interface_mode_t * mode)
+{
+  sw_error_t rv;
+
+  FAL_API_LOCK;
+  rv = _fal_port_interface_mode_get (dev_id, port_id,mode);
+  FAL_API_UNLOCK;
+  return rv;
+}
+
+/**
+ * @brief interface mode status on a particular port.
+ * @param[in] dev_id device id
+ * @param[in] port_id port id
+ * @param[out]
+ * @return SW_OK or error code
+ */
+sw_error_t
+fal_port_interface_mode_status_get (a_uint32_t dev_id, fal_port_t port_id, fal_port_interface_mode_t * mode)
+{
+  sw_error_t rv;
+
+  FAL_API_LOCK;
+  rv = _fal_port_interface_mode_status_get (dev_id, port_id,mode);
+  FAL_API_UNLOCK;
+  return rv;
+}
+
+
+/**
  * @}
  */
diff --git a/src/hsl/dess/dess_port_ctrl.c b/src/hsl/dess/dess_port_ctrl.c
index 0bca916..2599321 100755
--- a/src/hsl/dess/dess_port_ctrl.c
+++ b/src/hsl/dess/dess_port_ctrl.c
@@ -1423,6 +1423,49 @@
 }
 
 static sw_error_t
+_dess_ports_link_status_get(a_uint32_t dev_id, a_uint32_t * status)
+{
+    sw_error_t rv;
+    a_uint32_t port_id;
+    a_uint32_t phy_id;
+    hsl_dev_t *pdev = NULL;
+    hsl_phy_ops_t *phy_drv;
+
+    HSL_DEV_ID_CHECK(dev_id);
+    if (NULL == phy_drv->phy_link_status_get)
+    return SW_NOT_SUPPORTED;
+
+    pdev = hsl_dev_ptr_get(dev_id);
+    if (pdev == NULL)
+        return SW_NOT_INITIALIZED;
+
+    *status = 0x0;
+    for (port_id = 0; port_id < pdev->nr_ports; port_id++)
+    {
+        /* for those ports without PHY device supposed always link up */
+        if (A_FALSE == _dess_port_phy_connected(dev_id, port_id))
+        {
+            *status |= (0x1 << port_id);
+        }
+        else
+        {
+            rv = hsl_port_prop_get_phyid(dev_id, port_id, &phy_id);
+            SW_RTN_ON_ERROR(rv);
+
+            if (A_TRUE == phy_drv->phy_link_status_get (dev_id, phy_id))
+            {
+                *status |= (0x1 << port_id);
+            }
+            else
+            {
+                *status &= ~(0x1 << port_id);
+            }
+        }
+    }
+    return SW_OK;
+}
+
+static sw_error_t
 _dess_port_mac_loopback_set (a_uint32_t dev_id, fal_port_t port_id,
 			     a_bool_t enable)
 {
@@ -2002,6 +2045,299 @@
   return rv;
 }
 
+static sw_error_t
+_dess_port_reset (a_uint32_t dev_id, fal_port_t port_id)
+{
+  sw_error_t rv;
+  a_uint32_t phy_id = 0;
+  hsl_phy_ops_t *phy_drv;
+
+  HSL_DEV_ID_CHECK (dev_id);
+
+  if (A_TRUE != hsl_port_prop_check (dev_id, port_id, HSL_PP_PHY))
+    {
+      return SW_BAD_PARAM;
+    }
+
+  SW_RTN_ON_NULL (phy_drv = hsl_phy_api_ops_get (dev_id));
+  if (NULL == phy_drv->phy_reset)
+    return SW_NOT_SUPPORTED;
+
+  rv = hsl_port_prop_get_phyid (dev_id, port_id, &phy_id);
+  SW_RTN_ON_ERROR (rv);
+
+  rv = phy_drv->phy_reset(dev_id, phy_id);
+
+  return rv;
+}
+
+static sw_error_t
+_dess_port_power_off (a_uint32_t dev_id, fal_port_t port_id)
+{
+  sw_error_t rv;
+  a_uint32_t phy_id = 0;
+  hsl_phy_ops_t *phy_drv;
+
+  HSL_DEV_ID_CHECK (dev_id);
+
+  if (A_TRUE != hsl_port_prop_check (dev_id, port_id, HSL_PP_PHY))
+    {
+      return SW_BAD_PARAM;
+    }
+
+  SW_RTN_ON_NULL (phy_drv = hsl_phy_api_ops_get (dev_id));
+  if (NULL == phy_drv->phy_power_off)
+    return SW_NOT_SUPPORTED;
+
+  rv = hsl_port_prop_get_phyid (dev_id, port_id, &phy_id);
+  SW_RTN_ON_ERROR (rv);
+
+  rv = phy_drv->phy_power_off(dev_id, phy_id);
+
+  return rv;
+}
+
+static sw_error_t
+_dess_port_power_on (a_uint32_t dev_id, fal_port_t port_id)
+{
+  sw_error_t rv;
+  a_uint32_t phy_id = 0;
+  hsl_phy_ops_t *phy_drv;
+
+  HSL_DEV_ID_CHECK (dev_id);
+
+  if (A_TRUE != hsl_port_prop_check (dev_id, port_id, HSL_PP_PHY))
+    {
+      return SW_BAD_PARAM;
+    }
+
+  SW_RTN_ON_NULL (phy_drv = hsl_phy_api_ops_get (dev_id));
+  if (NULL == phy_drv->phy_power_on)
+    return SW_NOT_SUPPORTED;
+
+  rv = hsl_port_prop_get_phyid (dev_id, port_id, &phy_id);
+  SW_RTN_ON_ERROR (rv);
+
+  rv = phy_drv->phy_power_on(dev_id, phy_id);
+
+  return rv;
+}
+
+static sw_error_t
+_dess_port_wol_status_set (a_uint32_t dev_id, fal_port_t port_id,
+				a_bool_t enable)
+{
+  sw_error_t rv;
+  a_uint32_t phy_id = 0;
+  hsl_phy_ops_t *phy_drv;
+
+  HSL_DEV_ID_CHECK (dev_id);
+  if (A_TRUE != hsl_port_prop_check (dev_id, port_id, HSL_PP_PHY))
+    {
+      return SW_BAD_PARAM;
+    }
+
+  SW_RTN_ON_NULL (phy_drv = hsl_phy_api_ops_get (dev_id));
+  if (NULL == phy_drv->phy_wol_status_set)
+    return SW_NOT_SUPPORTED;
+
+  rv = hsl_port_prop_get_phyid (dev_id, port_id, &phy_id);
+  SW_RTN_ON_ERROR (rv);
+
+  rv = phy_drv->phy_wol_status_set (dev_id, phy_id, enable);
+
+  return rv;
+}
+
+static sw_error_t
+_dess_port_wol_status_get (a_uint32_t dev_id, fal_port_t port_id,
+				a_bool_t * enable)
+{
+  sw_error_t rv;
+  a_uint32_t phy_id = 0;
+  hsl_phy_ops_t *phy_drv;
+
+  HSL_DEV_ID_CHECK (dev_id);
+
+  if (A_TRUE != hsl_port_prop_check (dev_id, port_id, HSL_PP_PHY))
+    {
+      return SW_BAD_PARAM;
+    }
+
+  SW_RTN_ON_NULL (phy_drv = hsl_phy_api_ops_get (dev_id));
+  if (NULL == phy_drv->phy_wol_status_get)
+    return SW_NOT_SUPPORTED;
+
+  rv = hsl_port_prop_get_phyid (dev_id, port_id, &phy_id);
+  SW_RTN_ON_ERROR (rv);
+
+  rv = phy_drv->phy_wol_status_get (dev_id, phy_id, enable);
+
+  return rv;
+}
+
+static sw_error_t
+_dess_port_phy_id_get (a_uint32_t dev_id, fal_port_t port_id,
+				a_uint16_t * org_id, a_uint16_t * rev_id)
+{
+  sw_error_t rv;
+  a_uint32_t phy_id = 0;
+  hsl_phy_ops_t *phy_drv;
+
+  HSL_DEV_ID_CHECK (dev_id);
+
+  if (A_TRUE != hsl_port_prop_check (dev_id, port_id, HSL_PP_PHY))
+    {
+      return SW_BAD_PARAM;
+    }
+
+  SW_RTN_ON_NULL (phy_drv = hsl_phy_api_ops_get (dev_id));
+  if (NULL == phy_drv->phy_id_get)
+    return SW_NOT_SUPPORTED;
+
+  rv = hsl_port_prop_get_phyid (dev_id, port_id, &phy_id);
+  SW_RTN_ON_ERROR (rv);
+
+  rv = phy_drv->phy_id_get (dev_id, phy_id,org_id,rev_id);
+
+  return rv;
+}
+
+static sw_error_t
+_dess_port_magic_frame_mac_set (a_uint32_t dev_id, fal_port_t port_id,
+				fal_mac_addr_t * mac)
+{
+  sw_error_t rv;
+  a_uint32_t phy_id = 0;
+  hsl_phy_ops_t *phy_drv;
+
+  HSL_DEV_ID_CHECK (dev_id);
+
+  if (A_TRUE != hsl_port_prop_check (dev_id, port_id, HSL_PP_PHY))
+    {
+      return SW_BAD_PARAM;
+    }
+
+  SW_RTN_ON_NULL (phy_drv = hsl_phy_api_ops_get (dev_id));
+  if (NULL == phy_drv->phy_magic_frame_mac_set)
+    return SW_NOT_SUPPORTED;
+
+  rv = hsl_port_prop_get_phyid (dev_id, port_id, &phy_id);
+  SW_RTN_ON_ERROR (rv);
+
+  rv = phy_drv->phy_magic_frame_mac_set (dev_id, phy_id,mac);
+
+  return rv;
+}
+
+static sw_error_t
+_dess_port_magic_frame_mac_get (a_uint32_t dev_id, fal_port_t port_id,
+				fal_mac_addr_t * mac)
+{
+  sw_error_t rv;
+  a_uint32_t phy_id = 0;
+  hsl_phy_ops_t *phy_drv;
+
+  HSL_DEV_ID_CHECK (dev_id);
+
+  if (A_TRUE != hsl_port_prop_check (dev_id, port_id, HSL_PP_PHY))
+    {
+      return SW_BAD_PARAM;
+    }
+
+  SW_RTN_ON_NULL (phy_drv = hsl_phy_api_ops_get (dev_id));
+  if (NULL == phy_drv->phy_magic_frame_mac_get)
+    return SW_NOT_SUPPORTED;
+
+  rv = hsl_port_prop_get_phyid (dev_id, port_id, &phy_id);
+  SW_RTN_ON_ERROR (rv);
+
+  rv = phy_drv->phy_magic_frame_mac_get (dev_id, phy_id,mac);
+
+  return rv;
+}
+
+static sw_error_t
+_dess_port_interface_mode_set (a_uint32_t dev_id, fal_port_t port_id,
+				fal_port_interface_mode_t  mode)
+{
+  sw_error_t rv;
+  a_uint32_t phy_id = 0;
+  hsl_phy_ops_t *phy_drv;
+
+  HSL_DEV_ID_CHECK (dev_id);
+
+  if (A_TRUE != hsl_port_prop_check (dev_id, port_id, HSL_PP_PHY))
+    {
+      return SW_BAD_PARAM;
+    }
+
+  SW_RTN_ON_NULL (phy_drv = hsl_phy_api_ops_get (dev_id));
+  if (NULL == phy_drv->phy_interface_mode_set)
+    return SW_NOT_SUPPORTED;
+
+  rv = hsl_port_prop_get_phyid (dev_id, port_id, &phy_id);
+  SW_RTN_ON_ERROR (rv);
+
+  rv = phy_drv->phy_interface_mode_set (dev_id, phy_id,mode);
+
+  return rv;
+}
+
+static sw_error_t
+_dess_port_interface_mode_get (a_uint32_t dev_id, fal_port_t port_id,
+				fal_port_interface_mode_t * mode)
+{
+  sw_error_t rv;
+  a_uint32_t phy_id = 0;
+  hsl_phy_ops_t *phy_drv;
+
+  HSL_DEV_ID_CHECK (dev_id);
+
+  if (A_TRUE != hsl_port_prop_check (dev_id, port_id, HSL_PP_PHY))
+    {
+      return SW_BAD_PARAM;
+    }
+
+  SW_RTN_ON_NULL (phy_drv = hsl_phy_api_ops_get (dev_id));
+  if (NULL == phy_drv->phy_interface_mode_get)
+    return SW_NOT_SUPPORTED;
+
+  rv = hsl_port_prop_get_phyid (dev_id, port_id, &phy_id);
+  SW_RTN_ON_ERROR (rv);
+
+  rv = phy_drv->phy_interface_mode_get (dev_id, phy_id,mode);
+
+  return rv;
+}
+
+static sw_error_t
+_dess_port_interface_mode_status_get (a_uint32_t dev_id, fal_port_t port_id,
+				fal_port_interface_mode_t * mode)
+{
+  sw_error_t rv;
+  a_uint32_t phy_id = 0;
+  hsl_phy_ops_t *phy_drv;
+
+  HSL_DEV_ID_CHECK (dev_id);
+
+  if (A_TRUE != hsl_port_prop_check (dev_id, port_id, HSL_PP_PHY))
+    {
+      return SW_BAD_PARAM;
+    }
+
+  SW_RTN_ON_NULL (phy_drv = hsl_phy_api_ops_get (dev_id));
+  if (NULL == phy_drv->phy_interface_mode_status_get)
+    return SW_NOT_SUPPORTED;
+
+  rv = hsl_port_prop_get_phyid (dev_id, port_id, &phy_id);
+  SW_RTN_ON_ERROR (rv);
+
+  rv = phy_drv->phy_interface_mode_status_get (dev_id, phy_id,mode);
+
+  return rv;
+}
+
 /**
  * @brief Set duplex mode on a particular port.
  * @param[in] dev_id device id
@@ -2698,6 +3034,23 @@
 }
 
 /**
+ * @brief Get link status on all ports.
+ * @param[in] dev_id device id
+ * @param[out] status link status bitmap and bit 0 for port 0, bi 1 for port 1, ..., etc.
+ * @return SW_OK or error code
+ */
+HSL_LOCAL sw_error_t
+dess_ports_link_status_get(a_uint32_t dev_id, a_uint32_t * status)
+{
+    sw_error_t rv;
+
+    HSL_API_LOCK;
+    rv = _dess_ports_link_status_get(dev_id, status);
+    HSL_API_UNLOCK;
+    return rv;
+}
+
+/**
  * @brief Set mac loop back on a particular port.
  * @param[in] dev_id device id
  * @param[in] port_id port id
@@ -3077,6 +3430,203 @@
   return rv;
 }
 
+/**
+ * @brief software reset on a particular port.
+ * @param[in] dev_id device id
+ * @param[in] port_id port id
+ * @param[in]
+ * @return SW_OK or error code
+ */
+HSL_LOCAL sw_error_t
+dess_port_reset (a_uint32_t dev_id, fal_port_t port_id)
+{
+  sw_error_t rv;
+  HSL_API_LOCK;
+  rv = _dess_port_reset (dev_id, port_id);
+  HSL_API_UNLOCK;
+  return rv;
+}
+
+/**
+ * @brief phy power off on a particular port.
+ * @param[in] dev_id device id
+ * @param[in] port_id port id
+ * @param[in]
+ * @return SW_OK or error code
+ */
+HSL_LOCAL sw_error_t
+dess_port_power_off (a_uint32_t dev_id, fal_port_t port_id)
+{
+  sw_error_t rv;
+  HSL_API_LOCK;
+  rv = _dess_port_power_off (dev_id, port_id);
+  HSL_API_UNLOCK;
+  return rv;
+}
+
+/**
+ * @brief phy power on on a particular port.
+ * @param[in] dev_id device id
+ * @param[in] port_id port id
+ * @param[in]
+ * @return SW_OK or error code
+ */
+HSL_LOCAL sw_error_t
+dess_port_power_on (a_uint32_t dev_id, fal_port_t port_id)
+{
+  sw_error_t rv;
+  HSL_API_LOCK;
+  rv = _dess_port_power_on (dev_id, port_id);
+  HSL_API_UNLOCK;
+  return rv;
+}
+
+/**
+ * @brief Set phy wol enable on a particular port.
+ * @param[in] dev_id device id
+ * @param[in] port_id port id
+ * @param[in] enable A_TRUE or A_FALSE
+ * @return SW_OK or error code
+ */
+HSL_LOCAL sw_error_t
+dess_port_wol_status_set (a_uint32_t dev_id, fal_port_t port_id,
+			       a_bool_t enable)
+{
+  sw_error_t rv;
+  HSL_API_LOCK;
+  rv = _dess_port_wol_status_set (dev_id, port_id, enable);
+  HSL_API_UNLOCK;
+  return rv;
+}
+
+/**
+ * @brief Get phy wol status on a particular port.
+ * @param[in] dev_id device id
+ * @param[in] port_id port id
+ * @param[out] enable A_TRUE or A_FALSE
+ * @return SW_OK or error code
+ */
+HSL_LOCAL sw_error_t
+dess_port_wol_status_get (a_uint32_t dev_id, fal_port_t port_id,
+			       a_bool_t * enable)
+{
+  sw_error_t rv;
+
+  HSL_API_LOCK;
+  rv = _dess_port_wol_status_get (dev_id, port_id, enable);
+  HSL_API_UNLOCK;
+  return rv;
+}
+
+/**
+ * @brief Get phy id on a particular port.
+ * @param[in] dev_id device id
+ * @param[in] port_id port id
+ * @param[out] org_id and rev_id
+ * @return SW_OK or error code
+ */
+HSL_LOCAL sw_error_t
+dess_port_phy_id_get (a_uint32_t dev_id, fal_port_t port_id,
+			       a_uint16_t * org_id, a_uint16_t * rev_id)
+{
+  sw_error_t rv;
+
+  HSL_API_LOCK;
+  rv = _dess_port_phy_id_get (dev_id, port_id, org_id,rev_id);
+  HSL_API_UNLOCK;
+  return rv;
+}
+
+/**
+ * @brief Set phy magic frame mac on a particular port.
+ * @param[in] dev_id device id
+ * @param[in] port_id port id
+ * @param[in] mac address
+ * @return SW_OK or error code
+ */
+HSL_LOCAL sw_error_t
+dess_port_magic_frame_mac_set (a_uint32_t dev_id, fal_port_t port_id,
+			      fal_mac_addr_t * mac)
+{
+  sw_error_t rv;
+  HSL_API_LOCK;
+  rv = _dess_port_magic_frame_mac_set (dev_id, port_id, mac);
+  HSL_API_UNLOCK;
+  return rv;
+}
+
+/**
+ * @brief Get phy magic frame mac on a particular port.
+ * @param[in] dev_id device id
+ * @param[in] port_id port id
+ * @param[out] mac address
+ * @return SW_OK or error code
+ */
+HSL_LOCAL sw_error_t
+dess_port_magic_frame_mac_get (a_uint32_t dev_id, fal_port_t port_id,
+			      fal_mac_addr_t * mac)
+{
+  sw_error_t rv;
+  HSL_API_LOCK;
+  rv = _dess_port_magic_frame_mac_get (dev_id, port_id, mac);
+  HSL_API_UNLOCK;
+  return rv;
+}
+
+
+/**
+ * @brief Set phy interface mode.
+ * @param[in] dev_id device id
+ * @param[in] port_id port id
+ * @param[in] interface mode..
+ * @return SW_OK or error code
+ */
+HSL_LOCAL sw_error_t
+dess_port_interface_mode_set (a_uint32_t dev_id, fal_port_t port_id,
+			      fal_port_interface_mode_t  mode)
+{
+  sw_error_t rv;
+  HSL_API_LOCK;
+  rv = _dess_port_interface_mode_set (dev_id, port_id, mode);
+  HSL_API_UNLOCK;
+  return rv;
+}
+
+/**
+ * @brief Set phy interface mode.
+ * @param[in] dev_id device id
+ * @param[in] port_id port id
+ * @param[out] interface mode..
+ * @return SW_OK or error code
+ */
+HSL_LOCAL sw_error_t
+dess_port_interface_mode_get (a_uint32_t dev_id, fal_port_t port_id,
+			      fal_port_interface_mode_t  * mode)
+{
+  sw_error_t rv;
+  HSL_API_LOCK;
+  rv = _dess_port_interface_mode_get (dev_id, port_id, mode);
+  HSL_API_UNLOCK;
+  return rv;
+}
+
+/**
+ * @brief Set phy interface mode status.
+ * @param[in] dev_id device id
+ * @param[in] port_id port id
+ * @param[out] interface mode..
+ * @return SW_OK or error code
+ */
+HSL_LOCAL sw_error_t
+dess_port_interface_mode_status_get (a_uint32_t dev_id, fal_port_t port_id,
+			      fal_port_interface_mode_t  * mode)
+{
+  sw_error_t rv;
+  HSL_API_LOCK;
+  rv = _dess_port_interface_mode_status_get (dev_id, port_id, mode);
+  HSL_API_UNLOCK;
+  return rv;
+}
 
 sw_error_t
 dess_port_ctrl_init (a_uint32_t dev_id)
@@ -3126,6 +3676,7 @@
     p_api->port_link_forcemode_set = dess_port_link_forcemode_set;
     p_api->port_link_forcemode_get = dess_port_link_forcemode_get;
     p_api->port_link_status_get = dess_port_link_status_get;
+    p_api->ports_link_status_get = dess_ports_link_status_get;
     p_api->port_mac_loopback_set = dess_port_mac_loopback_set;
     p_api->port_mac_loopback_get = dess_port_mac_loopback_get;
     p_api->port_congestion_drop_set = dess_port_congestion_drop_set;
@@ -3146,6 +3697,17 @@
     p_api->port_local_loopback_get = dess_port_local_loopback_get;
     p_api->port_remote_loopback_set = dess_port_remote_loopback_set;
     p_api->port_remote_loopback_get = dess_port_remote_loopback_get;
+    p_api->port_reset = dess_port_reset;
+    p_api->port_power_off = dess_port_power_off;
+    p_api->port_power_on = dess_port_power_on;
+    p_api->port_phy_id_get = dess_port_phy_id_get;
+    p_api->port_wol_status_set = dess_port_wol_status_set;
+    p_api->port_wol_status_get = dess_port_wol_status_get;
+    p_api->port_magic_frame_mac_set = dess_port_magic_frame_mac_set;
+    p_api->port_magic_frame_mac_get = dess_port_magic_frame_mac_get;
+    p_api->port_interface_mode_set = dess_port_interface_mode_set;
+    p_api->port_interface_mode_get = dess_port_interface_mode_get;
+    p_api->port_interface_mode_status_get = dess_port_interface_mode_status_get;
   }
 #endif
 
diff --git a/src/hsl/phy/malibu_phy.c b/src/hsl/phy/malibu_phy.c
index 413cfca..ec7f548 100755
--- a/src/hsl/phy/malibu_phy.c
+++ b/src/hsl/phy/malibu_phy.c
@@ -47,8 +47,37 @@
 	HSL_PHY_SET(rv, dev_id, phy_addr, reg, phy_data);
 }
 
-#define malibu_phy_reg_read _phy_reg_read
-#define malibu_phy_reg_write _phy_reg_write
+/* #define malibu_phy_reg_read _phy_reg_read  */
+/* #define malibu_phy_reg_write _phy_reg_write */
+
+/******************************************************************************
+*
+* malibu_phy_mii_read - mii register read
+*
+* mii register read
+*/
+a_uint16_t
+malibu_phy_reg_read(a_uint32_t dev_id, a_uint32_t phy_id, a_uint32_t reg_id)
+{
+ 	return _phy_reg_read(dev_id, phy_id, reg_id);
+
+}
+
+/******************************************************************************
+*
+* malibu_phy_mii_write - mii register write
+*
+* mii register write
+*/
+sw_error_t
+malibu_phy_reg_write(a_uint32_t dev_id, a_uint32_t phy_id, a_uint32_t reg_id,
+		       a_uint16_t reg_val)
+{
+
+       _phy_reg_write(dev_id,phy_id, reg_id, reg_val);
+
+	return SW_OK;
+}
 
 /******************************************************************************
 *
@@ -241,6 +270,175 @@
 
 /******************************************************************************
 *
+* malibu_phy_set_powersave - set power saving status
+*
+* set power saving status
+*/
+sw_error_t
+malibu_phy_set_powersave(a_uint32_t dev_id, a_uint32_t phy_id, a_bool_t enable)
+{
+	a_uint16_t phy_data;
+
+	if (phy_id == COMBO_PHY_ID) {
+		if (MALIBU_PHY_MEDIUM_COPPER !=
+		    __phy_active_medium_get(dev_id, phy_id))
+			return SW_NOT_SUPPORTED;
+	}
+
+	malibu_phy_reg_write(dev_id, phy_id, MALIBU_DEBUG_PORT_ADDRESS,
+			     MALIBU_DEBUG_PHY_POWER_SAVING_CTRL);
+	phy_data = malibu_phy_reg_read(dev_id, phy_id, MALIBU_DEBUG_PORT_DATA);
+
+	if (enable == A_TRUE) {
+		phy_data |= 0x8000;
+	} else {
+		phy_data &= ~0x8000;
+	}
+
+	malibu_phy_reg_write(dev_id, phy_id, MALIBU_DEBUG_PORT_DATA, phy_data);
+
+	return SW_OK;
+}
+
+/******************************************************************************
+*
+* malibu_phy_get_powersave - get power saving status
+*
+* set power saving status
+*/
+sw_error_t
+malibu_phy_get_powersave(a_uint32_t dev_id, a_uint32_t phy_id,
+			 a_bool_t * enable)
+{
+	a_uint16_t phy_data;
+
+	if (phy_id == COMBO_PHY_ID) {
+		if (MALIBU_PHY_MEDIUM_COPPER !=
+		    __phy_active_medium_get(dev_id, phy_id))
+			return SW_NOT_SUPPORTED;
+	}
+
+	*enable = A_FALSE;
+	malibu_phy_reg_write(dev_id, phy_id, MALIBU_DEBUG_PORT_ADDRESS,
+			     MALIBU_DEBUG_PHY_POWER_SAVING_CTRL);
+	phy_data = malibu_phy_reg_read(dev_id, phy_id, MALIBU_DEBUG_PORT_DATA);
+
+	if (phy_data & 0x8000)
+		*enable = A_TRUE;
+
+	return SW_OK;
+}
+
+/******************************************************************************
+*
+* malibu_phy_set_802.3az
+*
+* set 802.3az status
+*/
+sw_error_t
+malibu_phy_set_8023az(a_uint32_t dev_id, a_uint32_t phy_id, a_bool_t enable)
+{
+	a_uint16_t phy_data;
+	if (phy_id == COMBO_PHY_ID) {
+		if (MALIBU_PHY_MEDIUM_COPPER !=
+		    __phy_active_medium_get(dev_id, phy_id))
+			return SW_NOT_SUPPORTED;
+	}
+
+	phy_data = malibu_phy_mmd_read(dev_id, phy_id, MALIBU_PHY_MMD7_NUM,
+				       MALIBU_PHY_MMD7_ADDR_8023AZ_EEE_CTRL);
+
+	if (enable == A_TRUE) {
+		phy_data |= 0x0006;
+	} else {
+		phy_data &= ~0x0006;
+	}
+
+	malibu_phy_mmd_write(dev_id, phy_id, MALIBU_PHY_MMD7_NUM,
+			     MALIBU_PHY_MMD7_ADDR_8023AZ_EEE_CTRL, phy_data);
+
+	return SW_OK;
+}
+
+/******************************************************************************
+*
+* malibu_phy_get_8023az status
+*
+* get 8023az status
+*/
+sw_error_t
+malibu_phy_get_8023az(a_uint32_t dev_id, a_uint32_t phy_id, a_bool_t * enable)
+{
+	a_uint16_t phy_data;
+	if (phy_id == COMBO_PHY_ID) {
+		if (MALIBU_PHY_MEDIUM_COPPER !=
+		    __phy_active_medium_get(dev_id, phy_id))
+			return SW_NOT_SUPPORTED;
+	}
+
+	*enable = A_FALSE;
+
+	phy_data = malibu_phy_mmd_read(dev_id, phy_id, MALIBU_PHY_MMD7_NUM,
+				       MALIBU_PHY_MMD7_ADDR_8023AZ_EEE_CTRL);
+
+	if ((phy_data & 0x0004) && (phy_data & 0x0002))
+		*enable = A_TRUE;
+
+	return SW_OK;
+}
+
+/******************************************************************************
+*
+* malibu_phy_set_hibernate - set hibernate status
+*
+* set hibernate status
+*/
+sw_error_t
+malibu_phy_set_hibernate(a_uint32_t dev_id, a_uint32_t phy_id, a_bool_t enable)
+{
+	a_uint16_t phy_data;
+
+	malibu_phy_reg_write(dev_id, phy_id, MALIBU_DEBUG_PORT_ADDRESS,
+			     MALIBU_DEBUG_PHY_HIBERNATION_CTRL);
+	phy_data = malibu_phy_reg_read(dev_id, phy_id, MALIBU_DEBUG_PORT_DATA);
+
+	if (enable == A_TRUE) {
+		phy_data |= 0x8000;
+	} else {
+		phy_data &= ~0x8000;
+	}
+
+	malibu_phy_reg_write(dev_id, phy_id, MALIBU_DEBUG_PORT_DATA, phy_data);
+
+	return SW_OK;
+}
+
+/******************************************************************************
+*
+* malibu_phy_get_hibernate - get hibernate status
+*
+* get hibernate status
+*/
+sw_error_t
+malibu_phy_get_hibernate(a_uint32_t dev_id, a_uint32_t phy_id,
+			 a_bool_t * enable)
+{
+	a_uint16_t phy_data;
+
+	*enable = A_FALSE;
+
+	malibu_phy_reg_write(dev_id, phy_id, MALIBU_DEBUG_PORT_ADDRESS,
+			     MALIBU_DEBUG_PHY_HIBERNATION_CTRL);
+	phy_data = malibu_phy_reg_read(dev_id, phy_id, MALIBU_DEBUG_PORT_DATA);
+
+	if (phy_data & 0x8000)
+		*enable = A_TRUE;
+
+	return SW_OK;
+}
+
+/******************************************************************************
+*
 * malibu_phy_set combo medium type
 *
 * set combo medium fiber or copper
@@ -458,6 +656,331 @@
 	return SW_OK;
 
 }
+
+/******************************************************************************
+*
+* malibu_phy_set_local_loopback
+*
+* set phy local loopback
+*/
+sw_error_t
+malibu_phy_set_local_loopback(a_uint32_t dev_id, a_uint32_t phy_id,
+			      a_bool_t enable)
+{
+	a_uint16_t phy_data;
+
+	if (phy_id == COMBO_PHY_ID) {
+
+		__phy_reg_pages_sel_by_active_medium(dev_id, phy_id);
+
+	}
+
+	phy_data = malibu_phy_reg_read(dev_id, phy_id, MALIBU_PHY_CONTROL);
+
+	if (enable == A_TRUE) {
+		phy_data |= MALIBU_LOCAL_LOOPBACK_ENABLE;
+		phy_data &= ~MALIBU_CTRL_AUTONEGOTIATION_ENABLE;
+	} else {
+		phy_data |= MALIBU_CTRL_AUTONEGOTIATION_ENABLE;
+		phy_data &= ~MALIBU_LOCAL_LOOPBACK_ENABLE;
+	}
+
+	malibu_phy_reg_write(dev_id, phy_id, MALIBU_PHY_CONTROL, phy_data);
+	return SW_OK;
+
+}
+
+/******************************************************************************
+*
+* malibu_phy_get_local_loopback
+*
+* get phy local loopback
+*/
+sw_error_t
+malibu_phy_get_local_loopback(a_uint32_t dev_id, a_uint32_t phy_id,
+			      a_bool_t * enable)
+{
+	a_uint16_t phy_data;
+
+	if (phy_id == COMBO_PHY_ID) {
+
+		__phy_reg_pages_sel_by_active_medium(dev_id, phy_id);
+
+	}
+
+	phy_data = malibu_phy_reg_read(dev_id, phy_id, MALIBU_PHY_CONTROL);
+
+	if (phy_data & MALIBU_LOCAL_LOOPBACK_ENABLE) {
+		*enable = A_TRUE;
+	} else {
+		*enable = A_FALSE;
+	}
+
+	return SW_OK;
+
+}
+
+/******************************************************************************
+*
+* malibu_phy_set_remote_loopback
+*
+* set phy remote loopback
+*/
+sw_error_t
+malibu_phy_set_remote_loopback(a_uint32_t dev_id, a_uint32_t phy_id,
+			       a_bool_t enable)
+{
+	a_uint16_t phy_data;
+
+	phy_data == malibu_phy_mmd_read(dev_id, phy_id, MALIBU_PHY_MMD3_NUM,
+					MALIBU_PHY_MMD3_ADDR_REMOTE_LOOPBACK_CTRL);
+
+	if (enable == A_TRUE) {
+		phy_data |= 0x0001;
+	} else {
+		phy_data &= ~0x0001;
+	}
+
+	malibu_phy_mmd_write(dev_id, phy_id, MALIBU_PHY_MMD3_NUM,
+			     MALIBU_PHY_MMD3_ADDR_REMOTE_LOOPBACK_CTRL,
+			     phy_data);
+	return SW_OK;
+
+}
+
+/******************************************************************************
+*
+* malibu_phy_get_remote_loopback
+*
+* get phy remote loopback
+*/
+sw_error_t
+malibu_phy_get_remote_loopback(a_uint32_t dev_id, a_uint32_t phy_id,
+			       a_bool_t * enable)
+{
+	a_uint16_t phy_data;
+
+	phy_data == malibu_phy_mmd_read(dev_id, phy_id, MALIBU_PHY_MMD3_NUM,
+					MALIBU_PHY_MMD3_ADDR_REMOTE_LOOPBACK_CTRL);
+
+	if (phy_data & 0x0001) {
+		*enable = A_TRUE;
+	} else {
+		*enable = A_FALSE;
+	}
+
+	return SW_OK;
+
+}
+
+/******************************************************************************
+*
+* malibu_phy_cdt - cable diagnostic test
+*
+* cable diagnostic test
+*/
+
+static inline fal_cable_status_t _phy_cdt_status_mapping(a_uint16_t status)
+{
+	fal_cable_status_t status_mapping = FAL_CABLE_STATUS_INVALID;
+
+	if (0 == status)
+		status_mapping = FAL_CABLE_STATUS_INVALID;
+	else if (1 == status)
+		status_mapping = FAL_CABLE_STATUS_NORMAL;
+	else if (2 == status)
+		status_mapping = FAL_CABLE_STATUS_OPENED;
+	else if (3 == status)
+		status_mapping = FAL_CABLE_STATUS_SHORT;
+
+	return status_mapping;
+}
+
+static sw_error_t malibu_phy_cdt_start(a_uint32_t dev_id, a_uint32_t phy_id)
+{
+	a_uint16_t status = 0;
+	a_uint16_t ii = 100;
+
+	if (phy_id == COMBO_PHY_ID) {
+
+		if (MALIBU_PHY_MEDIUM_COPPER !=
+		    __phy_active_medium_get(dev_id, phy_id))
+			return SW_NOT_SUPPORTED;
+
+		__phy_reg_pages_sel(dev_id, phy_id, MALIBU_PHY_COPPER_PAGES);
+	}
+
+	/* RUN CDT */
+	malibu_phy_reg_write(dev_id, phy_id, MALIBU_PHY_CDT_CONTROL,
+			     RUN_CDT | CABLE_LENGTH_UNIT);
+	do {
+		aos_mdelay(30);
+		status =
+		    malibu_phy_reg_read(dev_id, phy_id, MALIBU_PHY_CDT_CONTROL);
+	}
+	while ((status & RUN_CDT) && (--ii));
+
+	return SW_OK;
+}
+
+sw_error_t
+malibu_phy_cdt_get(a_uint32_t dev_id, a_uint32_t phy_id,
+		   fal_port_cdt_t * port_cdt)
+{
+	a_uint16_t status = 0;
+	a_uint16_t cable_delta_time = 0;
+	a_uint16_t org_debug_value = 0;
+	int ii = 100;
+	a_bool_t link_st = A_FALSE;
+	a_uint16_t reg806e = 0;
+	int i;
+
+	if ((!port_cdt) || (phy_id > 4)) {
+		return SW_FAIL;
+	}
+#if 0
+	/*disable clock gating */
+	org_debug_value = f1_phy_debug_read(dev_id, phy_id, 0x3f);
+	f1_phy_debug_write(dev_id, phy_id, 0x3f, 0);
+#endif
+
+	malibu_phy_cdt_start(dev_id, phy_id);
+
+	/* Get cable status */
+	status = malibu_phy_mmd_read(dev_id, phy_id, 3, 0x8064);
+
+#if 0
+	/* Workaround for cable lenth less than 20M  */
+	port_cdt->pair_c_status = (status >> 4) & 0x3;
+	/* Get Cable Length value */
+	cable_delta_time = f1_phy_mmd_read(dev_id, phy_id, 3, 0x8067);
+	/* the actual cable length equals to CableDeltaTime * 0.824 */
+	port_cdt->pair_c_len = (cable_delta_time * 824) / 1000;
+	if ((1 == port_cdt->pair_c_status) &&
+	    (port_cdt->pair_c_len > 0) && (port_cdt->pair_c_len <= 20)) {
+		reg806e = f1_phy_mmd_read(dev_id, phy_id, 3, 0x806e);
+		f1_phy_mmd_write(dev_id, phy_id, 3, 0x806e,
+				 reg806e & (~0x8000));
+
+		f1_phy_reset(dev_id, phy_id);
+		f1_phy_reset_done(dev_id, phy_id);
+		do {
+			link_st = f1_phy_get_link_status(dev_id, phy_id);
+			aos_mdelay(100);
+		} while ((A_FALSE == link_st) && (--ii));
+
+		f1_phy_cdt_start(dev_id, phy_id);
+		/* Get cable status */
+		status = f1_phy_mmd_read(dev_id, phy_id, 3, 0x8064);
+	}
+#endif
+
+	for (i = 0; i < 4; i++) {
+		switch (i) {
+		case 0:
+			port_cdt->pair_a_status = (status >> 12) & 0x3;
+			/* Get Cable Length value */
+			cable_delta_time =
+			    malibu_phy_mmd_read(dev_id, phy_id, 3, 0x8065);
+			/* the actual cable length equals to CableDeltaTime * 0.824 */
+			port_cdt->pair_a_len =
+			    ((cable_delta_time & 0xff) * 800) / 1000;
+
+			break;
+		case 1:
+			port_cdt->pair_b_status = (status >> 8) & 0x3;
+			/* Get Cable Length value */
+			cable_delta_time =
+			    malibu_phy_mmd_read(dev_id, phy_id, 3, 0x8066);
+			/* the actual cable length equals to CableDeltaTime * 0.824 */
+			port_cdt->pair_b_len =
+			    ((cable_delta_time & 0xff) * 800) / 1000;
+			break;
+		case 2:
+			port_cdt->pair_c_status = (status >> 4) & 0x3;
+			/* Get Cable Length value */
+			cable_delta_time =
+			    malibu_phy_mmd_read(dev_id, phy_id, 3, 0x8067);
+			/* the actual cable length equals to CableDeltaTime * 0.824 */
+			port_cdt->pair_c_len =
+			    ((cable_delta_time & 0xff) * 800) / 1000;
+			break;
+		case 3:
+			port_cdt->pair_d_status = status & 0x3;
+			/* Get Cable Length value */
+			cable_delta_time =
+			    malibu_phy_mmd_read(dev_id, phy_id, 3, 0x8068);
+			/* the actual cable length equals to CableDeltaTime * 0.824 */
+			port_cdt->pair_d_len =
+			    ((cable_delta_time & 0xff) * 800) / 1000;
+			break;
+		default:
+			break;
+		}
+	}
+
+#if 0
+	/*restore debug port value */
+	f1_phy_debug_write(dev_id, phy_id, 0x3f, org_debug_value);
+#endif
+
+	return SW_OK;
+}
+
+sw_error_t
+malibu_phy_cdt(a_uint32_t dev_id, a_uint32_t phy_id, a_uint32_t mdi_pair,
+	       fal_cable_status_t * cable_status, a_uint32_t * cable_len)
+{
+	fal_port_cdt_t malibu_port_cdt;
+
+	if (phy_id == COMBO_PHY_ID) {
+
+		if (MALIBU_PHY_MEDIUM_COPPER !=
+		    __phy_active_medium_get(dev_id, phy_id))
+			return SW_NOT_SUPPORTED;
+
+		__phy_reg_pages_sel(dev_id, phy_id, MALIBU_PHY_COPPER_PAGES);
+	}
+
+	if ((mdi_pair >= 4) || (phy_id > 4)) {
+		//There are only 4 mdi pairs in 1000BASE-T
+		return SW_BAD_PARAM;
+	}
+
+	malibu_phy_cdt_get(dev_id, phy_id, &malibu_port_cdt);
+
+	switch (mdi_pair) {
+	case 0:
+		*cable_status =
+		    _phy_cdt_status_mapping(malibu_port_cdt.pair_a_status);
+		/* Get Cable Length value */
+		*cable_len = malibu_port_cdt.pair_a_len;
+		break;
+	case 1:
+		*cable_status =
+		    _phy_cdt_status_mapping(malibu_port_cdt.pair_b_status);
+		/* Get Cable Length value */
+		*cable_len = malibu_port_cdt.pair_b_len;
+		break;
+	case 2:
+		*cable_status =
+		    _phy_cdt_status_mapping(malibu_port_cdt.pair_c_status);
+		/* Get Cable Length value */
+		*cable_len = malibu_port_cdt.pair_c_len;
+		break;
+	case 3:
+		*cable_status =
+		    _phy_cdt_status_mapping(malibu_port_cdt.pair_d_status);
+		/* Get Cable Length value */
+		*cable_len = malibu_port_cdt.pair_d_len;
+		break;
+	default:
+		break;
+	}
+
+	return SW_OK;
+}
+
 /******************************************************************************
 *
 * malibu_phy_reset_done - reset the phy
@@ -1360,18 +1883,377 @@
 
 	return SW_OK;
 }
+
+/******************************************************************************
+*
+* malibu_phy_set wol frame mac address
+*
+* set phy wol frame mac address
+*/
+sw_error_t
+malibu_phy_set_magic_frame_mac(a_uint32_t dev_id, a_uint32_t phy_id,
+			       fal_mac_addr_t * mac)
+{
+	a_uint16_t phy_data1;
+	a_uint16_t phy_data2;
+	a_uint16_t phy_data3;
+
+	phy_data1 = (mac->uc[0] << 8) | mac->uc[1];
+	phy_data2 = (mac->uc[2] << 8) | mac->uc[3];
+	phy_data3 = (mac->uc[4] << 8) | mac->uc[5];
+
+	malibu_phy_mmd_write(dev_id, phy_id, MALIBU_PHY_MMD3_NUM,
+			     MALIBU_PHY_MMD3_WOL_MAGIC_MAC_CTRL1, phy_data1);
+
+	malibu_phy_mmd_write(dev_id, phy_id, MALIBU_PHY_MMD3_NUM,
+			     MALIBU_PHY_MMD3_WOL_MAGIC_MAC_CTRL2, phy_data2);
+
+	malibu_phy_mmd_write(dev_id, phy_id, MALIBU_PHY_MMD3_NUM,
+			     MALIBU_PHY_MMD3_WOL_MAGIC_MAC_CTRL3, phy_data3);
+
+	return SW_OK;
+}
+
+/******************************************************************************
+*
+* malibu_phy_get wol frame mac address
+*
+* get phy wol frame mac address
+*/
+sw_error_t
+malibu_phy_get_magic_frame_mac(a_uint32_t dev_id, a_uint32_t phy_id,
+			       fal_mac_addr_t * mac)
+{
+	a_uint16_t phy_data1;
+	a_uint16_t phy_data2;
+	a_uint16_t phy_data3;
+
+	phy_data1 = malibu_phy_mmd_read(dev_id, phy_id, MALIBU_PHY_MMD3_NUM,
+					MALIBU_PHY_MMD3_WOL_MAGIC_MAC_CTRL1);
+
+	phy_data2 = malibu_phy_mmd_read(dev_id, phy_id, MALIBU_PHY_MMD3_NUM,
+					MALIBU_PHY_MMD3_WOL_MAGIC_MAC_CTRL2);
+
+	phy_data3 = malibu_phy_mmd_read(dev_id, phy_id, MALIBU_PHY_MMD3_NUM,
+					MALIBU_PHY_MMD3_WOL_MAGIC_MAC_CTRL3);
+
+	mac->uc[0] = (phy_data1 >> 8);
+	mac->uc[1] = (phy_data1 & 0x00ff);
+	mac->uc[2] = (phy_data2 >> 8);
+	mac->uc[3] = (phy_data2 & 0x00ff);
+	mac->uc[4] = (phy_data3 >> 8);
+	mac->uc[5] = (phy_data3 & 0x00ff);
+	phy_data2 = (mac->uc[2] << 8) | mac->uc[3];
+	phy_data3 = (mac->uc[4] << 8) | mac->uc[5];
+
+	return SW_OK;
+}
+
+/******************************************************************************
+*
+* malibu_phy_set wol enable or disable
+*
+* set phy wol enable or disable
+*/
+sw_error_t
+malibu_phy_set_wol_status(a_uint32_t dev_id, a_uint32_t phy_id, a_bool_t enable)
+{
+	a_uint16_t phy_data;
+	phy_data = malibu_phy_mmd_read(dev_id, phy_id, MALIBU_PHY_MMD3_NUM,
+				       MALIBU_PHY_MMD3_WOL_CTRL);
+
+	if (enable == A_TRUE) {
+		phy_data |= 0x0020;
+	} else {
+		phy_data &= ~0x0020;
+	}
+
+	malibu_phy_mmd_write(dev_id, phy_id, MALIBU_PHY_MMD3_NUM,
+			     MALIBU_PHY_MMD3_WOL_CTRL, phy_data);
+
+	return SW_OK;
+}
+
+/******************************************************************************
+*
+* malibu_phy_get_wol status
+*
+* get wol status
+*/
+sw_error_t
+malibu_phy_get_wol_status(a_uint32_t dev_id, a_uint32_t phy_id, a_bool_t * enable)
+{
+	a_uint16_t phy_data;
+
+	*enable = A_FALSE;
+
+	phy_data = malibu_phy_mmd_read(dev_id, phy_id, MALIBU_PHY_MMD3_NUM,
+				       MALIBU_PHY_MMD3_WOL_CTRL);
+
+	if (phy_data & 0x0020)
+		*enable = A_TRUE;
+
+	return SW_OK;
+}
+
+/******************************************************************************
+*
+* malibu_phy_interface mode set
+*
+* set malibu phy interface mode
+*/
+sw_error_t
+malibu_phy_interface_set_mode(a_uint32_t dev_id, a_uint32_t phy_id, fal_port_interface_mode_t interface_mode)
+{
+	a_uint16_t phy_data;
+       if (phy_id != COMBO_PHY_ID)
+		return SW_NOT_SUPPORTED;
+	phy_data = malibu_phy_reg_read(dev_id, phy_id, MALIBU_PHY_CHIP_CONFIG);
+	phy_data &= 0xfff0;
+
+	if (interface_mode == PHY_PSGMII_BASET) {
+		phy_data |= MALIBU_PHY_PSGMII_BASET;
+	} else if (interface_mode == PHY_PSGMII_BX1000) {
+		phy_data |= MALIBU_PHY_PSGMII_BX1000;
+	} else if (interface_mode == PHY_PSGMII_FX100) {
+		phy_data |= MALIBU_PHY_PSGMII_FX100;
+	} else if (interface_mode == PHY_PSGMII_AMDET) {
+              phy_data |= MALIBU_PHY_PSGMII_AMDET;
+	} else if (interface_mode == PHY_SGMII_BASET) {
+              phy_data |= MALIBU_PHY_SGMII_BASET;
+	} else {
+		return SW_BAD_PARAM;
+	}
+
+	malibu_phy_reg_write(dev_id, phy_id, MALIBU_PHY_CHIP_CONFIG, phy_data);
+
+	return SW_OK;
+}
+
+/******************************************************************************
+*
+* malibu_phy_interface mode get
+*
+* get malibu phy interface mode
+*/
+sw_error_t
+malibu_phy_interface_get_mode(a_uint32_t dev_id, a_uint32_t phy_id, fal_port_interface_mode_t *interface_mode)
+{
+	a_uint16_t phy_data;
+       if (phy_id != COMBO_PHY_ID)
+		return SW_NOT_SUPPORTED;
+	phy_data = malibu_phy_reg_read(dev_id, phy_id, MALIBU_PHY_CHIP_CONFIG);
+	phy_data &= 0x000f;
+       *interface_mode = phy_data;
+	return SW_OK;
+}
+
+/******************************************************************************
+*
+* malibu_phy_interface mode status get
+*
+* get malibu phy interface mode status
+*/
+sw_error_t
+malibu_phy_interface_get_mode_status(a_uint32_t dev_id, a_uint32_t phy_id, fal_port_interface_mode_t *interface_mode_status)
+{
+	a_uint16_t phy_data;
+       if (phy_id != COMBO_PHY_ID)
+		return SW_NOT_SUPPORTED;
+	phy_data = malibu_phy_reg_read(dev_id, phy_id, MALIBU_PHY_CHIP_CONFIG);
+	phy_data &= 0x00f0;
+	phy_data = (phy_data >>4);
+       *interface_mode_status = phy_data;
+	return SW_OK;
+}
+
+/******************************************************************************
+*
+* malibu_phy_intr_mask_set - Set interrupt mask with the
+* specified device.
+*/
+sw_error_t
+malibu_phy_intr_mask_set(a_uint32_t dev_id, a_uint32_t phy_id,
+			 a_uint32_t intr_mask_flag)
+{
+	a_uint16_t phy_data = 0;
+
+	phy_data = malibu_phy_reg_read(dev_id, phy_id, MALIBU_PHY_INTR_MASK);
+
+	if (FAL_PHY_INTR_STATUS_UP_CHANGE & intr_mask_flag) {
+		phy_data |= MALIBU_INTR_STATUS_UP_CHANGE;
+	} else {
+		phy_data &= (~MALIBU_INTR_STATUS_UP_CHANGE);
+	}
+
+	if (FAL_PHY_INTR_STATUS_DOWN_CHANGE & intr_mask_flag) {
+		phy_data |= MALIBU_INTR_STATUS_DOWN_CHANGE;
+	} else {
+		phy_data &= (~MALIBU_INTR_STATUS_DOWN_CHANGE);
+	}
+
+	if (FAL_PHY_INTR_SPEED_CHANGE & intr_mask_flag) {
+		phy_data |= MALIBU_INTR_SPEED_CHANGE;
+	} else {
+		phy_data &= (~MALIBU_INTR_SPEED_CHANGE);
+	}
+
+	if (FAL_PHY_INTR_DUPLEX_CHANGE & intr_mask_flag) {
+		phy_data |= MALIBU_INTR_DUPLEX_CHANGE;
+	} else {
+		phy_data &= (~MALIBU_INTR_DUPLEX_CHANGE);
+	}
+
+	if (FAL_PHY_INTR_BX_FX_STATUS_UP_CHANGE & intr_mask_flag) {
+		phy_data |= MALIBU_INTR_BX_FX_STATUS_UP_CHANGE;
+	} else {
+		phy_data &= (~MALIBU_INTR_BX_FX_STATUS_UP_CHANGE);
+	}
+
+	if (FAL_PHY_INTR_BX_FX_STATUS_DOWN_CHANGE & intr_mask_flag) {
+		phy_data |= MALIBU_INTR_BX_FX_STATUS_DOWN_CHANGE;
+	} else {
+		phy_data &= (~MALIBU_INTR_BX_FX_STATUS_DOWN_CHANGE);
+	}
+
+	malibu_phy_reg_write(dev_id, phy_id, MALIBU_PHY_INTR_MASK, phy_data);
+	return SW_OK;
+}
+
+/******************************************************************************
+*
+* malibu_phy_intr_mask_get - Get interrupt mask with the
+* specified device.
+*/
+sw_error_t
+malibu_phy_intr_mask_get(a_uint32_t dev_id, a_uint32_t phy_id,
+			 a_uint32_t * intr_mask_flag)
+{
+	a_uint16_t phy_data = 0;
+
+	phy_data = malibu_phy_reg_read(dev_id, phy_id, MALIBU_PHY_INTR_MASK);
+
+	*intr_mask_flag = 0;
+	if (MALIBU_INTR_STATUS_UP_CHANGE & phy_data) {
+		*intr_mask_flag |= FAL_PHY_INTR_STATUS_UP_CHANGE;
+	}
+
+	if (MALIBU_INTR_STATUS_DOWN_CHANGE & phy_data) {
+		*intr_mask_flag |= FAL_PHY_INTR_STATUS_DOWN_CHANGE;
+	}
+
+	if (MALIBU_INTR_SPEED_CHANGE & phy_data) {
+		*intr_mask_flag |= FAL_PHY_INTR_SPEED_CHANGE;
+	}
+
+	if (MALIBU_INTR_DUPLEX_CHANGE & phy_data) {
+		*intr_mask_flag |= FAL_PHY_INTR_DUPLEX_CHANGE;
+	}
+
+	if (MALIBU_INTR_BX_FX_STATUS_UP_CHANGE & phy_data) {
+		*intr_mask_flag |= FAL_PHY_INTR_BX_FX_STATUS_UP_CHANGE;
+	}
+
+	if (MALIBU_INTR_BX_FX_STATUS_DOWN_CHANGE & phy_data) {
+		*intr_mask_flag |= FAL_PHY_INTR_BX_FX_STATUS_DOWN_CHANGE;
+	}
+
+	return SW_OK;
+}
+
+/******************************************************************************
+*
+* malibu_phy_intr_status_get - Get interrupt status with the
+* specified device.
+*/
+sw_error_t
+malibu_phy_intr_status_get(a_uint32_t dev_id, a_uint32_t phy_id,
+			   a_uint32_t * intr_status_flag)
+{
+	a_uint16_t phy_data = 0;
+
+	phy_data = malibu_phy_reg_read(dev_id, phy_id, MALIBU_PHY_INTR_STATUS);
+
+	*intr_status_flag = 0;
+	if (MALIBU_INTR_STATUS_UP_CHANGE & phy_data) {
+		*intr_status_flag |= FAL_PHY_INTR_STATUS_UP_CHANGE;
+	}
+
+	if (MALIBU_INTR_STATUS_DOWN_CHANGE & phy_data) {
+		*intr_status_flag |= FAL_PHY_INTR_STATUS_DOWN_CHANGE;
+	}
+
+	if (MALIBU_INTR_SPEED_CHANGE & phy_data) {
+		*intr_status_flag |= FAL_PHY_INTR_SPEED_CHANGE;
+	}
+
+	if (MALIBU_INTR_DUPLEX_CHANGE & phy_data) {
+		*intr_status_flag |= FAL_PHY_INTR_DUPLEX_CHANGE;
+	}
+
+	if (MALIBU_INTR_BX_FX_STATUS_UP_CHANGE & phy_data) {
+		*intr_status_flag |= FAL_PHY_INTR_BX_FX_STATUS_UP_CHANGE;
+	}
+
+	if (MALIBU_INTR_BX_FX_STATUS_DOWN_CHANGE & phy_data) {
+		*intr_status_flag |= FAL_PHY_INTR_BX_FX_STATUS_DOWN_CHANGE;
+	}
+
+	return SW_OK;
+}
+
 static int malibu_phy_probe(struct phy_device *pdev)
 {
 	int ret;
 	hsl_phy_ops_t malibu_phy_api_ops = { 0 };
 
-#if 0
-	malibu_phy_api_ops.phy_powersave_set = malibu_phy_set_powersave;
-	malibu_phy_api_ops.phy_powersave_get = malibu_phy_get_powersave;
 	malibu_phy_api_ops.phy_hibernation_set = malibu_phy_set_hibernate;
 	malibu_phy_api_ops.phy_hibernation_get = malibu_phy_get_hibernate;
+	malibu_phy_api_ops.phy_speed_get = malibu_phy_get_speed;
+	malibu_phy_api_ops.phy_speed_set = malibu_phy_set_speed;
+	malibu_phy_api_ops.phy_duplex_get = malibu_phy_get_duplex;
+	malibu_phy_api_ops.phy_duplex_set = malibu_phy_set_duplex;
+	malibu_phy_api_ops.phy_autoneg_enable_set = malibu_phy_enable_autoneg;
+	malibu_phy_api_ops.phy_restart_autoneg = malibu_phy_restart_autoneg;
+	malibu_phy_api_ops.phy_autoneg_status_get = malibu_phy_autoneg_status;
+	malibu_phy_api_ops.phy_autoneg_adv_set = malibu_phy_set_autoneg_adv;
+	malibu_phy_api_ops.phy_autoneg_adv_get = malibu_phy_get_autoneg_adv;
+	malibu_phy_api_ops.phy_powersave_set = malibu_phy_set_powersave;
+	malibu_phy_api_ops.phy_powersave_get = malibu_phy_get_powersave;
 	malibu_phy_api_ops.phy_cdt = malibu_phy_cdt;
-#endif
+	malibu_phy_api_ops.phy_link_status_get = malibu_phy_get_link_status;
+       malibu_phy_api_ops.phy_mdix_set = malibu_phy_set_mdix;
+	malibu_phy_api_ops.phy_mdix_get = malibu_phy_get_mdix;
+	malibu_phy_api_ops.phy_mdix_status_get = malibu_phy_get_mdix_status;
+	malibu_phy_api_ops.phy_8023az_set = malibu_phy_set_8023az;
+	malibu_phy_api_ops.phy_8023az_get = malibu_phy_get_8023az;
+	malibu_phy_api_ops.phy_local_loopback_set = malibu_phy_set_local_loopback;
+	malibu_phy_api_ops.phy_local_loopback_get = malibu_phy_get_local_loopback;
+	malibu_phy_api_ops.phy_remote_loopback_set = malibu_phy_set_remote_loopback;
+	malibu_phy_api_ops.phy_remote_loopback_get = malibu_phy_get_remote_loopback;
+	malibu_phy_api_ops.phy_combo_prefer_medium_set = malibu_phy_set_combo_prefer_medium;
+	malibu_phy_api_ops.phy_combo_prefer_medium_get = malibu_phy_get_combo_prefer_medium;
+	malibu_phy_api_ops.phy_combo_medium_status_get = malibu_phy_get_combo_current_medium_type;
+	malibu_phy_api_ops.phy_combo_fiber_mode_set = malibu_phy_set_combo_fiber_mode;
+	malibu_phy_api_ops.phy_combo_fiber_mode_get = malibu_phy_get_combo_fiber_mode;
+	malibu_phy_api_ops.phy_reset = malibu_phy_reset;
+	malibu_phy_api_ops.phy_power_off = malibu_phy_poweroff;
+	malibu_phy_api_ops.phy_power_on = 	malibu_phy_poweron;
+	malibu_phy_api_ops.phy_id_get = malibu_phy_get_phy_id;
+	malibu_phy_api_ops.phy_reg_write = malibu_phy_reg_write;
+	malibu_phy_api_ops.phy_reg_read = malibu_phy_reg_read;
+	malibu_phy_api_ops.phy_debug_write = malibu_phy_debug_write;
+	malibu_phy_api_ops.phy_debug_read = malibu_phy_debug_read;
+	malibu_phy_api_ops.phy_mmd_write = malibu_phy_mmd_write;
+	malibu_phy_api_ops.phy_mmd_read = malibu_phy_mmd_read;
+	malibu_phy_api_ops.phy_magic_frame_mac_set = malibu_phy_set_magic_frame_mac;
+	malibu_phy_api_ops.phy_magic_frame_mac_get = malibu_phy_get_magic_frame_mac;
+	malibu_phy_api_ops.phy_wol_status_set = malibu_phy_set_wol_status;
+	malibu_phy_api_ops.phy_wol_status_get = malibu_phy_set_wol_status;
+	malibu_phy_api_ops.phy_interface_mode_set = malibu_phy_interface_set_mode;
+	malibu_phy_api_ops.phy_interface_mode_get = malibu_phy_interface_get_mode;
+	malibu_phy_api_ops.phy_interface_mode_status_get = malibu_phy_interface_get_mode_status;
+
 
 	ret = hsl_phy_api_ops_register(&malibu_phy_api_ops);
 	return ret;
@@ -1384,7 +2266,6 @@
 	hsl_phy_ops_t malibu_phy_api_ops;
 
 	ret = hsl_phy_api_ops_unregister(&malibu_phy_api_ops);
-	return ret;
 }
 
 /******************************************************************************
diff --git a/src/shell_lib/shell_config.c b/src/shell_lib/shell_config.c
index b9dfdbf..15584b6 100755
--- a/src/shell_lib/shell_config.c
+++ b/src/shell_lib/shell_config.c
@@ -49,8 +49,32 @@
             {"bpstatus", "set", "set back pressure status of a port", "<port_id> <enable|disable>", SW_API_BP_STATUS_SET, NULL},
             {"linkforcemode", "set", "set link force mode of a port", "<port_id> <enable|disable>", SW_API_PT_LINK_MODE_SET, NULL},
             {"macLoopback", "set", "set mac level loop back mode of port", "<port_id> <enable|disable>", SW_API_PT_MAC_LOOPBACK_SET, NULL},
-			{"congedrop", "set", "set congestion drop of port queue", "<port_id> <queue_id> <enable|disable>", SW_API_PT_CONGESTION_DROP_SET, NULL},
-			{"ringfcthresh", "set", "set flwo ctrl thres of ring", "<ring_id> <on_thres> <off_thres>", SW_API_PT_RING_FLOW_CTRL_THRES_SET, NULL},
+	    {"congedrop", "set", "set congestion drop of port queue", "<port_id> <queue_id> <enable|disable>", SW_API_PT_CONGESTION_DROP_SET, NULL},
+	    {"ringfcthresh", "set", "set flwo ctrl thres of ring", "<ring_id> <on_thres> <off_thres>", SW_API_PT_RING_FLOW_CTRL_THRES_SET, NULL},
+	    {"8023az", "set", "set 8023az status of a port", "<port_id> <enable|disable>", SW_API_PT_8023AZ_SET, NULL},
+	    {"crossover", "set", "set crossover mode of a port", "<port_id> <auto|mdi|mdix>", SW_API_PT_MDIX_SET, NULL},
+            {"crossover", "get", "get crossover mode of a port", "<port_id>", SW_API_PT_MDIX_GET, NULL},
+            {"crossover", "status", "get current crossover status of a port", "<port_id>", SW_API_PT_MDIX_STATUS_GET, NULL},
+            {"preferMedium", "set", "set prefer medium of a combo port", "<port_id> <copper|fiber>", SW_API_PT_COMBO_PREFER_MEDIUM_SET, NULL},
+            {"preferMedium", "get", "get prefer medium of a combo port", "<port_id>", SW_API_PT_COMBO_PREFER_MEDIUM_GET, NULL},
+            {"mediumType", "get", "get current medium status of a combo port", "<port_id>", SW_API_PT_COMBO_MEDIUM_STATUS_GET, NULL},
+            {"fiberMode", "set", "set fiber mode of a combo fiber port", "<port_id> <100fx|1000bx>", SW_API_PT_COMBO_FIBER_MODE_SET, NULL},
+            {"fiberMode", "get", "get fiber mode of a combo fiber port", "<port_id>", SW_API_PT_COMBO_FIBER_MODE_GET, NULL},
+            {"localLoopback", "set", "set local loopback of a port", "<port_id> <enable|disable>", SW_API_PT_LOCAL_LOOPBACK_SET, NULL},
+            {"localLoopback", "get", "get local loopback of a port", "<port_id>", SW_API_PT_LOCAL_LOOPBACK_GET, NULL},
+            {"remoteLoopback", "set", "set remote loopback of a port", "<port_id> <enable|disable>", SW_API_PT_REMOTE_LOOPBACK_SET, NULL},
+            {"remoteLoopback", "get", "get remote loopback of a port", "<port_id>", SW_API_PT_REMOTE_LOOPBACK_GET, NULL},
+            {"reset", "start", "reset phy of a port", "<port_id>", SW_API_PT_RESET, NULL},
+            {"power", "off", "power off  phy of a port", "<port_id>", SW_API_PT_POWER_OFF, NULL},
+            {"power", "on", "power on phy of a port", "<port_id>", SW_API_PT_POWER_ON, NULL},
+            {"magicFrameMac", "set", "set magic frame mac address  of a port", "<port_id> <mac_address>", SW_API_PT_MAGIC_FRAME_MAC_SET, NULL},
+            {"magicFrameMac", "get", "get magic frame mac address  of a port", "<port_id>", SW_API_PT_MAGIC_FRAME_MAC_GET, NULL},
+            {"phyId", "get", "get phy id of a port", "<port_id>", SW_API_PT_PHY_ID_GET, NULL},
+            {"wolstatus", "set", "set wol status of a port", "<port_id> <enable|disable>", SW_API_PT_WOL_STATUS_SET, NULL},
+            {"wolstatus", "get", "get wol status of a port", "<port_id>", SW_API_PT_WOL_STATUS_GET, NULL},
+            {"interfaceMode", "set", "set interface mode of phy", "<port_id> <psgmii_baset|psgmii_bx1000|psgmii_fx100|psgmii_amdet|sgmii_baset>", SW_API_PT_INTERFACE_MODE_SET, NULL},
+            {"interfaceMode", "get", "get interface mode of phy", "<port_id>", SW_API_PT_INTERFACE_MODE_GET, NULL},
+            {"interfaceMode", "status", "get current interface mode of phy", "<port_id>", SW_API_PT_INTERFACE_MODE_STATUS_GET, NULL},
             {NULL, NULL, NULL, NULL, (int)NULL, NULL},/*end of desc*/
         },
     },
diff --git a/src/shell_lib/shell_io.c b/src/shell_lib/shell_io.c
index f3ed01a..2173a8b 100755
--- a/src/shell_lib/shell_io.c
+++ b/src/shell_lib/shell_io.c
@@ -168,6 +168,11 @@
     SW_TYPE_DEF(SW_HOST_ROUTE_ENTRY, cmd_data_check_host_route_entry, NULL),
     SW_TYPE_DEF(SW_IP_RFS_IP4, cmd_data_check_ip4_rfs_entry, NULL),
 	SW_TYPE_DEF(SW_IP_RFS_IP6, cmd_data_check_ip6_rfs_entry, NULL),
+    SW_TYPE_DEF(SW_CROSSOVER_MODE, cmd_data_check_crossover_mode, NULL),
+    SW_TYPE_DEF(SW_CROSSOVER_STATUS, cmd_data_check_crossover_status, NULL),
+    SW_TYPE_DEF(SW_PREFER_MEDIUM, cmd_data_check_prefer_medium, NULL),
+    SW_TYPE_DEF(SW_FIBER_MODE, cmd_data_check_fiber_mode, NULL),
+    SW_TYPE_DEF(SW_INTERFACE_MODE, cmd_data_check_interface_mode, NULL),
 };
 
 sw_data_type_t *
@@ -434,6 +439,105 @@
     return SW_OK;
 }
 
+sw_error_t
+cmd_data_check_crossover_mode(char *cmd_str, a_uint32_t * arg_val, a_uint32_t size)
+{
+    if (cmd_str == NULL)
+        return SW_BAD_PARAM;
+
+    if (!strncasecmp(cmd_str, "auto", 5))
+        *arg_val = PHY_MDIX_AUTO;
+    else if (!strncasecmp(cmd_str, "mdi", 4))
+        *arg_val = PHY_MDIX_MDI;
+    else if (!strncasecmp(cmd_str, "mdix", 5))
+        *arg_val = PHY_MDIX_MDIX;
+    else
+    {
+        //dprintf("input error \n");
+        return SW_BAD_VALUE;
+    }
+
+    return SW_OK;
+}
+
+sw_error_t
+cmd_data_check_crossover_status(char *cmd_str, a_uint32_t * arg_val, a_uint32_t size)
+{
+    if (cmd_str == NULL)
+        return SW_BAD_PARAM;
+    if (!strncasecmp(cmd_str, "mdi", 4))
+        *arg_val = PHY_MDIX_STATUS_MDI;
+    else if (!strncasecmp(cmd_str, "mdix", 5))
+        *arg_val = PHY_MDIX_STATUS_MDIX;
+    else
+    {
+        //dprintf("input error \n");
+        return SW_BAD_VALUE;
+    }
+
+    return SW_OK;
+}
+
+sw_error_t
+cmd_data_check_prefer_medium(char *cmd_str, a_uint32_t * arg_val, a_uint32_t size)
+{
+    if (cmd_str == NULL)
+        return SW_BAD_PARAM;
+    if (!strncasecmp(cmd_str, "copper", 7))
+        *arg_val = PHY_MEDIUM_COPPER;
+    else if (!strncasecmp(cmd_str, "fiber", 6))
+        *arg_val = PHY_MEDIUM_FIBER;
+    else
+    {
+        //dprintf("input error \n");
+        return SW_BAD_VALUE;
+    }
+
+    return SW_OK;
+}
+
+sw_error_t
+cmd_data_check_fiber_mode(char *cmd_str, a_uint32_t * arg_val, a_uint32_t size)
+{
+    if (cmd_str == NULL)
+        return SW_BAD_PARAM;
+    if (!strncasecmp(cmd_str, "100fx", 6))
+        *arg_val = PHY_FIBER_100FX;
+    else if (!strncasecmp(cmd_str, "1000bx", 7))
+        *arg_val = PHY_FIBER_1000BX;
+    else
+    {
+        //dprintf("input error \n");
+        return SW_BAD_VALUE;
+    }
+
+    return SW_OK;
+}
+
+sw_error_t
+cmd_data_check_interface_mode(char *cmd_str, a_uint32_t * arg_val, a_uint32_t size)
+{
+    if (cmd_str == NULL)
+        return SW_BAD_PARAM;
+
+    if (!strncasecmp(cmd_str, "psgmii_baset", 13))
+        *arg_val = PHY_PSGMII_BASET;
+    else if (!strncasecmp(cmd_str, "psgmii_bx1000", 14))
+        *arg_val = PHY_PSGMII_BX1000;
+    else if (!strncasecmp(cmd_str, "psgmii_fx100", 13))
+        *arg_val = PHY_PSGMII_FX100;
+    else if (!strncasecmp(cmd_str, "psgmii_amdet", 13))
+        *arg_val = PHY_PSGMII_AMDET;
+    else if (!strncasecmp(cmd_str, "sgmii_baset", 13))
+        *arg_val = PHY_SGMII_BASET;
+    else
+    {
+        //dprintf("input error \n");
+        return SW_BAD_VALUE;
+    }
+
+    return SW_OK;
+}
 /*portvlan*/
 sw_error_t
 cmd_data_check_1qmode(char *cmd_str, a_uint32_t * arg_val, a_uint32_t size)