mtu update ops implementations.<br /> <br />Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> <br />---<br /> doc/guides/nics/features/zxdh.ini  |  1 +<br /> doc/guides/nics/zxdh.rst           |  2 +<br /> drivers/net/zxdh/zxdh_common.c     |  4 +-<br /> drivers/net/zxdh/zxdh_ethdev.c     | 33 +++++++-----<br /> drivers/net/zxdh/zxdh_ethdev.h     | 10 ++--<br /> drivers/net/zxdh/zxdh_ethdev_ops.c | 87 ++++++++++++++++++++++++++----<br /> drivers/net/zxdh/zxdh_ethdev_ops.h | 21 ++++----<br /> drivers/net/zxdh/zxdh_msg.c        | 36 ++++++-------<br /> drivers/net/zxdh/zxdh_msg.h        | 10 ++--<br /> drivers/net/zxdh/zxdh_np.c         | 34 ++++++------<br /> drivers/net/zxdh/zxdh_pci.c        |  4 +-<br /> drivers/net/zxdh/zxdh_queue.h      | 45 ++++++++--------<br /> drivers/net/zxdh/zxdh_rxtx.c       |  8 +--<br /> drivers/net/zxdh/zxdh_tables.c     | 46 +++++++++++++++-<br /> drivers/net/zxdh/zxdh_tables.h     |  4 ++<br /> 15 files changed, 236 insertions(+), 109 deletions(-)<br /> <br />diff --git a/doc/guides/nics/features/zxdh.ini b/doc/guides/nics/features/zxdh.ini<br />index 98c141cf95..3561e31666 100644<br />--- a/doc/guides/nics/features/zxdh.ini<br />+++ b/doc/guides/nics/features/zxdh.ini<br />@@ -24,3 +24,4 @@ RSS reta update      = Y<br /> Inner RSS            = Y<br /> Basic stats          = Y<br /> Stats per queue      = Y<br />+MTU update           = Y<br />diff --git a/doc/guides/nics/zxdh.rst b/doc/guides/nics/zxdh.rst<br />index c8a52b587c..58e0c49a2e 100644<br />--- a/doc/guides/nics/zxdh.rst<br />+++ b/doc/guides/nics/zxdh.rst<br />@@ -33,6 +33,8 @@ Features of the ZXDH PMD are:<br /> - QINQ stripping and inserting<br /> - Receive Side Scaling (RSS)<br /> - Port hardware statistics<br />+- MTU update<br />+- Jumbo frames<br />  <br />  <br /> Driver compilation and testing<br />diff --git a/drivers/net/zxdh/zxdh_common.c b/drivers/net/zxdh/zxdh_common.c<br />index f70c615d2f..7158bd735d 100644<br />--- a/drivers/net/zxdh/zxdh_common.c<br />+++ b/drivers/net/zxdh/zxdh_common.c<br />@@ -216,7 +216,7 @@ zxdh_get_res_info(struct zxdh_res_para *dev, uint8_t field, uint8_t *res, uint16<br />  <br />     if (ret != ZXDH_BAR_MSG_OK) {<br />         PMD_DRV_LOG(ERR,<br />-            "send sync_msg failed. pcieid: 0x%x, ret: %d.", dev->pcie_id, ret);<br />+            "send sync_msg failed. pcieid: 0x%x, ret: %d", dev->pcie_id, ret);<br />         return ret;<br />     }<br />     struct zxdh_tbl_msg_reps_header *tbl_reps =<br />@@ -224,7 +224,7 @@ zxdh_get_res_info(struct zxdh_res_para *dev, uint8_t field, uint8_t *res, uint16<br />  <br />     if (tbl_reps->check != ZXDH_TBL_MSG_PRO_SUCCESS) {<br />         PMD_DRV_LOG(ERR,<br />-            "get resource_field failed. pcieid: 0x%x, ret: %d.", dev->pcie_id, ret);<br />+            "get resource_field failed. pcieid: 0x%x, ret: %d", dev->pcie_id, ret);<br />         return ret;<br />     }<br />     *len = tbl_reps->len;<br />diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c<br />index 636a4bb4fb..858e3c3d47 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev.c<br />@@ -64,6 +64,10 @@ zxdh_dev_infos_get(struct rte_eth_dev *dev,<br />     dev_info->reta_size = RTE_ETH_RSS_RETA_SIZE_256;<br />     dev_info->flow_type_rss_offloads = ZXDH_RSS_HF;<br />  <br />+    dev_info->max_mtu = ZXDH_MAX_RX_PKTLEN - RTE_ETHER_HDR_LEN -<br />+        RTE_VLAN_HLEN - ZXDH_DL_NET_HDR_SIZE;<br />+    dev_info->min_mtu = ZXDH_ETHER_MIN_MTU;<br />+<br />     dev_info->tx_offload_capa = (RTE_ETH_TX_OFFLOAD_MULTI_SEGS);<br />     dev_info->tx_offload_capa |= (RTE_ETH_TX_OFFLOAD_TCP_TSO |<br />                     RTE_ETH_TX_OFFLOAD_UDP_TSO);<br />@@ -256,7 +260,7 @@ zxdh_setup_risc_interrupts(struct rte_eth_dev *dev)<br />     uint8_t i;<br />  <br />     if (!hw->risc_intr) {<br />-        PMD_DRV_LOG(ERR, " to allocate risc_intr");<br />+        PMD_DRV_LOG(ERR, "to allocate risc_intr");<br />         hw->risc_intr = rte_zmalloc("risc_intr",<br />             ZXDH_MSIX_INTR_MSG_VEC_NUM * sizeof(struct rte_intr_handle), 0);<br />         if (hw->risc_intr == NULL) {<br />@@ -822,7 +826,7 @@ zxdh_rss_qid_config(struct rte_eth_dev *dev)<br />         attr_msg->value = hw->channel_context[0].ph_chno & 0xfff;<br />         ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), NULL, 0);<br />         if (ret) {<br />-            PMD_DRV_LOG(ERR, "Failed to send msg: port 0x%x msg type %d ",<br />+            PMD_DRV_LOG(ERR, "Failed to send msg: port 0x%x msg type %d",<br />                     hw->vport.vport, ZXDH_PORT_BASE_QID_FLAG);<br />             return ret;<br />         }<br />@@ -888,7 +892,7 @@ zxdh_dev_configure(struct rte_eth_dev *dev)<br />     if (nr_vq == hw->queue_num)<br />         goto end;<br />  <br />-    PMD_DRV_LOG(DEBUG, "queue changed need reset ");<br />+    PMD_DRV_LOG(DEBUG, "queue changed need reset");<br />     /* Reset the device although not necessary at startup */<br />     zxdh_pci_reset(hw);<br />  <br />@@ -1031,13 +1035,13 @@ zxdh_dev_close(struct rte_eth_dev *dev)<br />  <br />     ret = zxdh_dev_stop(dev);<br />     if (ret != 0) {<br />-        PMD_DRV_LOG(ERR, " stop port %s failed.", dev->device->name);<br />+        PMD_DRV_LOG(ERR, "stop port %s failed.", dev->device->name);<br />         return -1;<br />     }<br />  <br />     ret = zxdh_tables_uninit(dev);<br />     if (ret != 0) {<br />-        PMD_DRV_LOG(ERR, "%s :tables uninit %s failed ", __func__, dev->device->name);<br />+        PMD_DRV_LOG(ERR, "%s :tables uninit %s failed", __func__, dev->device->name);<br />         return -1;<br />     }<br />  <br />@@ -1064,11 +1068,11 @@ zxdh_set_rxtx_funcs(struct rte_eth_dev *eth_dev)<br />     struct zxdh_hw *hw = eth_dev->data->dev_private;<br />  <br />     if (!zxdh_pci_packed_queue(hw)) {<br />-        PMD_DRV_LOG(ERR, " port %u not support packed queue", eth_dev->data->port_id);<br />+        PMD_DRV_LOG(ERR, "port %u not support packed queue", eth_dev->data->port_id);<br />         return -1;<br />     }<br />     if (!zxdh_pci_with_feature(hw, ZXDH_NET_F_MRG_RXBUF)) {<br />-        PMD_DRV_LOG(ERR, " port %u not support rx mergeable", eth_dev->data->port_id);<br />+        PMD_DRV_LOG(ERR, "port %u not support rx mergeable", eth_dev->data->port_id);<br />         return -1;<br />     }<br />     eth_dev->tx_pkt_prepare = zxdh_xmit_pkts_prepare;<br />@@ -1135,7 +1139,7 @@ zxdh_dev_start(struct rte_eth_dev *dev)<br />  <br />     ret = zxdh_mac_config(hw->eth_dev);<br />     if (ret)<br />-        PMD_DRV_LOG(ERR, " mac config failed");<br />+        PMD_DRV_LOG(ERR, "mac config failed");<br />  <br />     for (i = 0; i < dev->data->nb_rx_queues; i++)<br />         dev->data->rx_queue_state[i] = RTE_ETH_QUEUE_STATE_STARTED;<br />@@ -1174,6 +1178,7 @@ static const struct eth_dev_ops zxdh_eth_dev_ops = {<br />     .rss_hash_conf_get         = zxdh_rss_hash_conf_get,<br />     .stats_get                 = zxdh_dev_stats_get,<br />     .stats_reset             = zxdh_dev_stats_reset,<br />+    .mtu_set                 = zxdh_dev_mtu_set,<br /> };<br />  <br /> static int32_t<br />@@ -1185,7 +1190,7 @@ zxdh_init_device(struct rte_eth_dev *eth_dev)<br />  <br />     ret = zxdh_read_pci_caps(pci_dev, hw);<br />     if (ret) {<br />-        PMD_DRV_LOG(ERR, "port 0x%x pci caps read failed .", hw->port_id);<br />+        PMD_DRV_LOG(ERR, "port 0x%x pci caps read failed", hw->port_id);<br />         goto err;<br />     }<br />  <br />@@ -1398,14 +1403,14 @@ zxdh_np_init(struct rte_eth_dev *eth_dev)<br />     if (hw->is_pf) {<br />         ret = zxdh_np_dtb_res_init(eth_dev);<br />         if (ret) {<br />-            PMD_DRV_LOG(ERR, "np dtb init failed, ret:%d ", ret);<br />+            PMD_DRV_LOG(ERR, "np dtb init failed, ret:%d", ret);<br />             return ret;<br />         }<br />     }<br />     if (zxdh_shared_data != NULL)<br />         zxdh_shared_data->np_init_done = 1;<br />  <br />-    PMD_DRV_LOG(DEBUG, "np init ok ");<br />+    PMD_DRV_LOG(DEBUG, "np init ok");<br />     return 0;<br /> }<br />  <br />@@ -1422,7 +1427,7 @@ zxdh_tables_init(struct rte_eth_dev *dev)<br />  <br />     ret = zxdh_panel_table_init(dev);<br />     if (ret) {<br />-        PMD_DRV_LOG(ERR, " panel table init failed");<br />+        PMD_DRV_LOG(ERR, "panel table init failed");<br />         return ret;<br />     }<br />  <br />@@ -1434,7 +1439,7 @@ zxdh_tables_init(struct rte_eth_dev *dev)<br />  <br />     ret = zxdh_vlan_filter_table_init(dev);<br />     if (ret) {<br />-        PMD_DRV_LOG(ERR, " vlan filter table init failed");<br />+        PMD_DRV_LOG(ERR, "vlan filter table init failed");<br />         return ret;<br />     }<br />  <br />@@ -1462,7 +1467,7 @@ zxdh_eth_dev_init(struct rte_eth_dev *eth_dev)<br />     memset(hw, 0, sizeof(*hw));<br />     hw->bar_addr[0] = (uint64_t)pci_dev->mem_resource[0].addr;<br />     if (hw->bar_addr[0] == 0) {<br />-        PMD_DRV_LOG(ERR, "Bad mem resource.");<br />+        PMD_DRV_LOG(ERR, "Bad mem resource");<br />         return -EIO;<br />     }<br />  <br />diff --git a/drivers/net/zxdh/zxdh_ethdev.h b/drivers/net/zxdh/zxdh_ethdev.h<br />index 2934fa264a..fd4699c34d 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev.h<br />+++ b/drivers/net/zxdh/zxdh_ethdev.h<br />@@ -65,7 +65,6 @@ struct zxdh_hw {<br />     struct rte_intr_handle *dtb_intr;<br />     struct zxdh_virtqueue **vqs;<br />     struct zxdh_chnl_context channel_context[ZXDH_QUEUES_NUM_MAX];<br />-    union zxdh_virport_num vport;<br />  <br />     uint64_t bar_addr[ZXDH_NUM_BARS];<br />     uint64_t host_features;<br />@@ -74,7 +73,7 @@ struct zxdh_hw {<br />     uint32_t speed;<br />     uint32_t speed_mode;<br />     uint32_t notify_off_multiplier;<br />-    uint16_t *notify_base;<br />+    union zxdh_virport_num vport;<br />     uint16_t pcie_id;<br />     uint16_t device_id;<br />     uint16_t port_id;<br />@@ -82,14 +81,16 @@ struct zxdh_hw {<br />     uint16_t queue_num;<br />     uint16_t mc_num;<br />     uint16_t uc_num;<br />-    uint16_t *rss_reta;<br />  <br />+    uint16_t *rss_reta;<br />+    uint16_t *notify_base;<br />     uint8_t *isr;<br />+<br />     uint8_t weak_barriers;<br />     uint8_t intr_enabled;<br />-    uint8_t use_msix;<br />     uint8_t mac_addr[RTE_ETHER_ADDR_LEN];<br />  <br />+    uint8_t use_msix;<br />     uint8_t duplex;<br />     uint8_t is_pf;<br />     uint8_t msg_chan_init;<br />@@ -103,6 +104,7 @@ struct zxdh_hw {<br />     uint8_t allmulti_status;<br />     uint8_t rss_enable;<br />     uint8_t rss_init;<br />+    uint8_t rsv[2];<br /> };<br />  <br /> struct zxdh_dtb_shared_data {<br />diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c b/drivers/net/zxdh/zxdh_ethdev_ops.c<br />index e0482d2724..1a21ded58e 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev_ops.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev_ops.c<br />@@ -13,6 +13,7 @@<br /> #include "zxdh_logs.h" <br /> #include "zxdh_rxtx.h" <br /> #include "zxdh_np.h" <br />+#include "zxdh_queue.h" <br />  <br /> #define ZXDH_VLAN_FILTER_GROUPS       64<br /> #define ZXDH_INVALID_LOGIC_QID        0xFFFFU<br />@@ -136,7 +137,7 @@ static int32_t zxdh_config_port_status(struct rte_eth_dev *dev, uint16_t link_st<br />     if (hw->is_pf) {<br />         ret = zxdh_get_port_attr(hw->vfid, &port_attr);<br />         if (ret) {<br />-            PMD_DRV_LOG(ERR, "write port_attr failed");<br />+            PMD_DRV_LOG(ERR, "get port_attr failed");<br />             return -1;<br />         }<br />         port_attr.is_up = link_status;<br />@@ -258,7 +259,7 @@ int32_t zxdh_dev_link_update(struct rte_eth_dev *dev, int32_t wait_to_complete _<br />  <br />     ret = zxdh_link_info_get(dev, &link);<br />     if (ret != 0) {<br />-        PMD_DRV_LOG(ERR, " Failed to get link status from hw");<br />+        PMD_DRV_LOG(ERR, "Failed to get link status from hw");<br />         return ret;<br />     }<br />     link.link_status &= hw->admin_status;<br />@@ -267,7 +268,7 @@ int32_t zxdh_dev_link_update(struct rte_eth_dev *dev, int32_t wait_to_complete _<br />  <br />     ret = zxdh_config_port_status(dev, link.link_status);<br />     if (ret != 0) {<br />-        PMD_DRV_LOG(ERR, "set port attr %d failed.", link.link_status);<br />+        PMD_DRV_LOG(ERR, "set port attr %d failed", link.link_status);<br />         return ret;<br />     }<br />     return rte_eth_linkstatus_set(dev, &link);<br />@@ -317,7 +318,7 @@ int zxdh_dev_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *addr)<br />         zxdh_msg_head_build(hw, ZXDH_MAC_DEL, &msg_info);<br />         ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), NULL, 0);<br />         if (ret) {<br />-            PMD_DRV_LOG(ERR, "Failed to send msg: port 0x%x msg type %d ",<br />+            PMD_DRV_LOG(ERR, "Failed to send msg: port 0x%x msg type %d",<br />                 hw->vport.vport, ZXDH_MAC_DEL);<br />             return ret;<br />         }<br />@@ -330,7 +331,7 @@ int zxdh_dev_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *addr)<br />         zxdh_msg_head_build(hw, ZXDH_MAC_ADD, &msg_info);<br />         ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), NULL, 0);<br />         if (ret) {<br />-            PMD_DRV_LOG(ERR, "Failed to send msg: port 0x%x msg type %d ",<br />+            PMD_DRV_LOG(ERR, "Failed to send msg: port 0x%x msg type %d",<br />                 hw->vport.vport, ZXDH_MAC_ADD);<br />             return ret;<br />         }<br />@@ -666,13 +667,13 @@ zxdh_dev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)<br />  <br />     if (on) {<br />         if (dev->data->vlan_filter_conf.ids[idx] & (1ULL << bit_idx)) {<br />-            PMD_DRV_LOG(ERR, "vlan:%d has already added.", vlan_id);<br />+            PMD_DRV_LOG(ERR, "vlan:%d has already added", vlan_id);<br />             return 0;<br />         }<br />         msg_type = ZXDH_VLAN_FILTER_ADD;<br />     } else {<br />         if (!(dev->data->vlan_filter_conf.ids[idx] & (1ULL << bit_idx))) {<br />-            PMD_DRV_LOG(ERR, "vlan:%d has already deleted.", vlan_id);<br />+            PMD_DRV_LOG(ERR, "vlan:%d has already deleted", vlan_id);<br />             return 0;<br />         }<br />         msg_type = ZXDH_VLAN_FILTER_DEL;<br />@@ -681,7 +682,7 @@ zxdh_dev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)<br />     if (hw->is_pf) {<br />         ret = zxdh_vlan_filter_table_set(hw->vport.vport, vlan_id, on);<br />         if (ret) {<br />-            PMD_DRV_LOG(ERR, "vlan_id:%d table set failed.", vlan_id);<br />+            PMD_DRV_LOG(ERR, "vlan_id:%d table set failed", vlan_id);<br />             return -1;<br />         }<br />     } else {<br />@@ -690,7 +691,7 @@ zxdh_dev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)<br />         msg.data.vlan_filter_msg.vlan_id = vlan_id;<br />         ret = zxdh_vf_send_msg_to_pf(dev, &msg, sizeof(struct zxdh_msg_info), NULL, 0);<br />         if (ret) {<br />-            PMD_DRV_LOG(ERR, "Failed to send msg: port 0x%x msg type %d ",<br />+            PMD_DRV_LOG(ERR, "Failed to send msg: port 0x%x msg type %d",<br />                     hw->vport.vport, msg_type);<br />             return ret;<br />         }<br />@@ -1399,8 +1400,8 @@ zxdh_hw_np_stats_get(struct rte_eth_dev *dev,  struct zxdh_hw_np_stats *np_stats<br />                     &reply_info, sizeof(struct zxdh_msg_reply_info));<br />         if (ret) {<br />             PMD_DRV_LOG(ERR,<br />-                "Failed to send msg: port 0x%x msg type ZXDH_PORT_METER_STAT_GET",<br />-                hw->vport.vport);<br />+                "%s Failed to send msg: port 0x%x msg type",<br />+                __func__, hw->vport.vport);<br />             return -1;<br />         }<br />         memcpy(np_stats, &reply_info.reply_body.np_stats, sizeof(struct zxdh_hw_np_stats));<br />@@ -1506,3 +1507,67 @@ int zxdh_dev_stats_reset(struct rte_eth_dev *dev)<br />  <br />     return 0;<br /> }<br />+<br />+int zxdh_dev_mtu_set(struct rte_eth_dev *dev, uint16_t new_mtu)<br />+{<br />+    struct zxdh_hw *hw = dev->data->dev_private;<br />+    struct zxdh_panel_table panel = {0};<br />+    struct zxdh_port_attr_table vport_att = {0};<br />+    uint16_t vfid = zxdh_vport_to_vfid(hw->vport);<br />+    int ret;<br />+<br />+    if (hw->is_pf) {<br />+        ret = zxdh_get_panel_attr(dev, &panel);<br />+        if (ret != 0) {<br />+            PMD_DRV_LOG(ERR, "get_panel_attr failed ret:%d", ret);<br />+            return ret;<br />+        }<br />+<br />+        ret = zxdh_get_port_attr(vfid, &vport_att);<br />+        if (ret != 0) {<br />+            PMD_DRV_LOG(ERR,<br />+                "[vfid:%d] zxdh_dev_mtu, get vport failed ret:%d", vfid, ret);<br />+            return ret;<br />+        }<br />+<br />+        panel.mtu = new_mtu;<br />+        panel.mtu_enable = 1;<br />+        ret = zxdh_set_panel_attr(dev, &panel);<br />+        if (ret != 0) {<br />+            PMD_DRV_LOG(ERR, "set zxdh_dev_mtu failed, ret:%u", ret);<br />+            return ret;<br />+        }<br />+<br />+        vport_att.mtu_enable = 1;<br />+        vport_att.mtu = new_mtu;<br />+        ret = zxdh_set_port_attr(vfid, &vport_att);<br />+        if (ret != 0) {<br />+            PMD_DRV_LOG(ERR,<br />+                "[vfid:%d] zxdh_dev_mtu, set vport failed ret:%d", vfid, ret);<br />+            return ret;<br />+        }<br />+    } else {<br />+        struct zxdh_msg_info msg_info = {0};<br />+        struct zxdh_port_attr_set_msg *attr_msg = &msg_info.data.port_attr_msg;<br />+<br />+        zxdh_msg_head_build(hw, ZXDH_PORT_ATTRS_SET, &msg_info);<br />+        attr_msg->mode = ZXDH_PORT_MTU_EN_FLAG;<br />+        attr_msg->value = 1;<br />+        ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), NULL, 0);<br />+        if (ret) {<br />+            PMD_DRV_LOG(ERR, "Failed to send msg: port 0x%x msg type %d",<br />+                hw->vport.vport, ZXDH_PORT_MTU_EN_FLAG);<br />+            return ret;<br />+        }<br />+        attr_msg->mode = ZXDH_PORT_MTU_FLAG;<br />+        attr_msg->value = new_mtu;<br />+        ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), NULL, 0);<br />+        if (ret) {<br />+            PMD_DRV_LOG(ERR, "Failed to send msg: port 0x%x msg type %d",<br />+                hw->vport.vport, ZXDH_PORT_MTU_FLAG);<br />+            return ret;<br />+        }<br />+    }<br />+    dev->data->mtu = new_mtu;<br />+    return 0;<br />+}<br />diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.h b/drivers/net/zxdh/zxdh_ethdev_ops.h<br />index 6de8ddd88c..8dbd73e2a5 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev_ops.h<br />+++ b/drivers/net/zxdh/zxdh_ethdev_ops.h<br />@@ -26,15 +26,7 @@<br /> #define ZXDH_HF_MAC_VLAN_ETH  ZXDH_ETH_RSS_L2<br /> #define ZXDH_RSS_HF  ((ZXDH_HF_MAC_VLAN_ETH | ZXDH_HF_F3_ETH | ZXDH_HF_F5_ETH))<br />  <br />-struct zxdh_hw_vqm_stats {<br />-    uint64_t rx_total;<br />-    uint64_t tx_total;<br />-    uint64_t rx_bytes;<br />-    uint64_t tx_bytes;<br />-    uint64_t rx_error;<br />-    uint64_t tx_error;<br />-    uint64_t rx_drop;<br />-};<br />+#define ZXDH_ETHER_MIN_MTU      68<br />  <br /> struct zxdh_hw_np_stats {<br />     uint64_t np_rx_broadcast;<br />@@ -49,6 +41,16 @@ struct zxdh_hw_np_stats {<br />     uint64_t np_tx_mtr_drop_bytes;<br /> };<br />  <br />+struct zxdh_hw_vqm_stats {<br />+    uint64_t rx_total;<br />+    uint64_t tx_total;<br />+    uint64_t rx_bytes;<br />+    uint64_t tx_bytes;<br />+    uint64_t rx_error;<br />+    uint64_t tx_error;<br />+    uint64_t rx_drop;<br />+};<br />+<br /> int zxdh_dev_set_link_up(struct rte_eth_dev *dev);<br /> int zxdh_dev_set_link_down(struct rte_eth_dev *dev);<br /> int32_t zxdh_dev_link_update(struct rte_eth_dev *dev, int32_t wait_to_complete __rte_unused);<br />@@ -73,5 +75,6 @@ int zxdh_rss_hash_conf_get(struct rte_eth_dev *dev, struct rte_eth_rss_conf *rss<br /> int zxdh_rss_configure(struct rte_eth_dev *dev);<br /> int zxdh_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats);<br /> int zxdh_dev_stats_reset(struct rte_eth_dev *dev);<br />+int zxdh_dev_mtu_set(struct rte_eth_dev *dev, uint16_t new_mtu);<br />  <br /> #endif /* ZXDH_ETHDEV_OPS_H */<br />diff --git a/drivers/net/zxdh/zxdh_msg.c b/drivers/net/zxdh/zxdh_msg.c<br />index a6e19bbdd8..9471c74fac 100644<br />--- a/drivers/net/zxdh/zxdh_msg.c<br />+++ b/drivers/net/zxdh/zxdh_msg.c<br />@@ -417,30 +417,30 @@ zxdh_bar_chan_send_para_check(struct zxdh_pci_bar_msg *in,<br />     uint8_t dst_index = 0;<br />  <br />     if (in == NULL || result == NULL) {<br />-        PMD_MSG_LOG(ERR, "send para ERR: null para.");<br />+        PMD_MSG_LOG(ERR, "send para ERR: null para");<br />         return ZXDH_BAR_MSG_ERR_NULL_PARA;<br />     }<br />     src_index = zxdh_bar_msg_src_index_trans(in->src);<br />     dst_index = zxdh_bar_msg_dst_index_trans(in->dst);<br />  <br />     if (src_index == ZXDH_BAR_MSG_SRC_ERR || dst_index == ZXDH_BAR_MSG_DST_ERR) {<br />-        PMD_MSG_LOG(ERR, "send para ERR: chan doesn't exist.");<br />+        PMD_MSG_LOG(ERR, "send para ERR: chan doesn't exist");<br />         return ZXDH_BAR_MSG_ERR_TYPE;<br />     }<br />     if (in->module_id >= ZXDH_BAR_MSG_MODULE_NUM) {<br />-        PMD_MSG_LOG(ERR, "send para ERR: invalid module_id: %d.", in->module_id);<br />+        PMD_MSG_LOG(ERR, "send para ERR: invalid module_id: %d", in->module_id);<br />         return ZXDH_BAR_MSG_ERR_MODULE;<br />     }<br />     if (in->payload_addr == NULL) {<br />-        PMD_MSG_LOG(ERR, "send para ERR: null message.");<br />+        PMD_MSG_LOG(ERR, "send para ERR: null message");<br />         return ZXDH_BAR_MSG_ERR_BODY_NULL;<br />     }<br />     if (in->payload_len > ZXDH_BAR_MSG_PAYLOAD_MAX_LEN) {<br />-        PMD_MSG_LOG(ERR, "send para ERR: len %d is too long.", in->payload_len);<br />+        PMD_MSG_LOG(ERR, "send para ERR: len %d is too long", in->payload_len);<br />         return ZXDH_BAR_MSG_ERR_LEN;<br />     }<br />     if (in->virt_addr == 0 || result->recv_buffer == NULL) {<br />-        PMD_MSG_LOG(ERR, "send para ERR: virt_addr or recv_buffer is NULL.");<br />+        PMD_MSG_LOG(ERR, "send para ERR: virt_addr or recv_buffer is NULL");<br />         return ZXDH_BAR_MSG_ERR_VIRTADDR_NULL;<br />     }<br />     if (result->buffer_len < ZXDH_REPS_HEADER_PAYLOAD_OFFSET)<br />@@ -508,13 +508,13 @@ zxdh_bar_chan_lock(uint8_t src, uint8_t dst, uint16_t src_pcieid, uint64_t virt_<br />     uint8_t dst_index = zxdh_bar_msg_dst_index_trans(dst);<br />  <br />     if (src_index == ZXDH_BAR_MSG_SRC_ERR || dst_index == ZXDH_BAR_MSG_DST_ERR) {<br />-        PMD_MSG_LOG(ERR, "lock ERR: chan doesn't exist.");<br />+        PMD_MSG_LOG(ERR, "lock ERR: chan doesn't exist");<br />         return ZXDH_BAR_MSG_ERR_TYPE;<br />     }<br />  <br />     ret = zxdh_bar_hard_lock(src_pcieid, dst, virt_addr);<br />     if (ret != 0)<br />-        PMD_MSG_LOG(ERR, "dev: 0x%x failed to lock.", src_pcieid);<br />+        PMD_MSG_LOG(ERR, "dev: 0x%x failed to lock", src_pcieid);<br />  <br />     return ret;<br /> }<br />@@ -526,7 +526,7 @@ zxdh_bar_chan_unlock(uint8_t src, uint8_t dst, uint16_t src_pcieid, uint64_t vir<br />     uint8_t dst_index = zxdh_bar_msg_dst_index_trans(dst);<br />  <br />     if (src_index == ZXDH_BAR_MSG_SRC_ERR || dst_index == ZXDH_BAR_MSG_DST_ERR) {<br />-        PMD_MSG_LOG(ERR, "unlock ERR: chan doesn't exist.");<br />+        PMD_MSG_LOG(ERR, "unlock ERR: chan doesn't exist");<br />         return ZXDH_BAR_MSG_ERR_TYPE;<br />     }<br />  <br />@@ -775,7 +775,7 @@ zxdh_bar_chan_sync_msg_send(struct zxdh_pci_bar_msg *in, struct zxdh_msg_recvive<br />     if (time_out_cnt == ZXDH_BAR_MSG_TIMEOUT_TH && valid != ZXDH_BAR_MSG_CHAN_USABLE) {<br />         zxdh_bar_chan_msg_valid_set(subchan_addr, ZXDH_BAR_MSG_CHAN_USABLE);<br />         zxdh_bar_chan_msg_poltag_set(subchan_addr, 0);<br />-        PMD_MSG_LOG(ERR, "BAR MSG ERR: chan type time out.");<br />+        PMD_MSG_LOG(ERR, "BAR MSG ERR: chan type time out");<br />         ret = ZXDH_BAR_MSG_ERR_TIME_OUT;<br />     } else {<br />         ret = zxdh_bar_chan_sync_msg_reps_get(subchan_addr,<br />@@ -843,11 +843,11 @@ zxdh_bar_chan_enable(struct zxdh_msix_para *para, uint16_t *vport)<br />     sum_res = zxdh_bar_get_sum((uint8_t *)&msix_msg, sizeof(msix_msg));<br />  <br />     if (check_token != sum_res) {<br />-        PMD_MSG_LOG(ERR, "expect token: 0x%x, get token: 0x%x.", sum_res, check_token);<br />+        PMD_MSG_LOG(ERR, "expect token: 0x%x, get token: 0x%x", sum_res, check_token);<br />         return ZXDH_BAR_MSG_ERR_REPLY;<br />     }<br />     *vport = recv_msg.msix_reps.vport;<br />-    PMD_MSG_LOG(DEBUG, "vport of pcieid: 0x%x get success.", para->pcie_id);<br />+    PMD_MSG_LOG(DEBUG, "vport of pcieid: 0x%x get success", para->pcie_id);<br />     return ZXDH_BAR_MSG_OK;<br /> }<br />  <br />@@ -967,19 +967,19 @@ zxdh_bar_chan_msg_header_check(struct zxdh_bar_msg_header *msg_header)<br />     uint8_t module_id = 0;<br />  <br />     if (msg_header->valid != ZXDH_BAR_MSG_CHAN_USED) {<br />-        PMD_MSG_LOG(ERR, "recv header ERR: valid label is not used.");<br />+        PMD_MSG_LOG(ERR, "recv header ERR: valid label is not used");<br />         return ZXDH_BAR_MSG_ERR_MODULE;<br />     }<br />     module_id = msg_header->module_id;<br />  <br />     if (module_id >= (uint8_t)ZXDH_BAR_MSG_MODULE_NUM) {<br />-        PMD_MSG_LOG(ERR, "recv header ERR: invalid module_id: %u.", module_id);<br />+        PMD_MSG_LOG(ERR, "recv header ERR: invalid module_id: %u", module_id);<br />         return ZXDH_BAR_MSG_ERR_MODULE;<br />     }<br />     len = msg_header->len;<br />  <br />     if (len > ZXDH_BAR_MSG_PAYLOAD_MAX_LEN) {<br />-        PMD_MSG_LOG(ERR, "recv header ERR: invalid mesg len: %u.", len);<br />+        PMD_MSG_LOG(ERR, "recv header ERR: invalid mesg len: %u", len);<br />         return ZXDH_BAR_MSG_ERR_LEN;<br />     }<br />     if (msg_recv_func_tbl[msg_header->module_id] == NULL) {<br />@@ -1001,7 +1001,7 @@ zxdh_bar_irq_recv(uint8_t src, uint8_t dst, uint64_t virt_addr, void *dev)<br />  <br />     recv_addr = zxdh_recv_addr_get(src, dst, virt_addr);<br />     if (recv_addr == 0) {<br />-        PMD_MSG_LOG(ERR, "invalid driver type(src:%u, dst:%u).", src, dst);<br />+        PMD_MSG_LOG(ERR, "invalid driver type(src:%u, dst:%u)", src, dst);<br />         return -1;<br />     }<br />  <br />@@ -1009,13 +1009,13 @@ zxdh_bar_irq_recv(uint8_t src, uint8_t dst, uint64_t virt_addr, void *dev)<br />     ret = zxdh_bar_chan_msg_header_check(&msg_header);<br />  <br />     if (ret != ZXDH_BAR_MSG_OK) {<br />-        PMD_MSG_LOG(ERR, "recv msg_head err, ret: %u.", ret);<br />+        PMD_MSG_LOG(ERR, "recv msg_head err, ret: %u", ret);<br />         return -1;<br />     }<br />  <br />     recved_msg = rte_malloc(NULL, msg_header.len, 0);<br />     if (recved_msg == NULL) {<br />-        PMD_MSG_LOG(ERR, "malloc temp buff failed.");<br />+        PMD_MSG_LOG(ERR, "malloc temp buff failed");<br />         return -1;<br />     }<br />     zxdh_bar_chan_msg_payload_get(recv_addr, recved_msg, msg_header.len);<br />diff --git a/drivers/net/zxdh/zxdh_msg.h b/drivers/net/zxdh/zxdh_msg.h<br />index 176073fc70..6f657da434 100644<br />--- a/drivers/net/zxdh/zxdh_msg.h<br />+++ b/drivers/net/zxdh/zxdh_msg.h<br />@@ -321,13 +321,13 @@ struct __rte_packed_begin zxdh_link_info_msg {<br />     uint32_t speed;<br /> } __rte_packed_end;<br />  <br />-struct zxdh_rss_reta {<br />+struct __rte_packed_begin zxdh_rss_reta {<br />     uint32_t reta[RTE_ETH_RSS_RETA_SIZE_256];<br />-};<br />+} __rte_packed_end;<br />  <br />-struct zxdh_rss_hf {<br />+struct __rte_packed_begin zxdh_rss_hf {<br />     uint32_t rss_hf;<br />-};<br />+} __rte_packed_end;<br />  <br /> struct __rte_packed_begin zxdh_msg_reply_body {<br />     enum zxdh_reps_flag flag;<br />@@ -335,8 +335,8 @@ struct __rte_packed_begin zxdh_msg_reply_body {<br />         uint8_t reply_data[ZXDH_MSG_REPLY_BODY_MAX_LEN - sizeof(enum zxdh_reps_flag)];<br />         struct zxdh_hw_np_stats np_stats;<br />         struct zxdh_link_info_msg link_msg;<br />-        struct zxdh_rss_hf rss_hf;<br />         struct zxdh_rss_reta rss_reta;<br />+        struct zxdh_rss_hf rss_hf;<br />         struct zxdh_hw_vqm_stats vqm_stats;<br />     } __rte_packed_end;<br /> } __rte_packed_end;<br />diff --git a/drivers/net/zxdh/zxdh_np.c b/drivers/net/zxdh/zxdh_np.c<br />index 42679635f4..1e6e8f0e75 100644<br />--- a/drivers/net/zxdh/zxdh_np.c<br />+++ b/drivers/net/zxdh/zxdh_np.c<br />@@ -188,7 +188,7 @@ static uint32_t<br /> zxdh_np_dev_init(void)<br /> {<br />     if (g_dev_mgr.is_init) {<br />-        PMD_DRV_LOG(ERR, "Dev is already initialized.");<br />+        PMD_DRV_LOG(ERR, "Dev is already initialized");<br />         return 0;<br />     }<br />  <br />@@ -209,14 +209,14 @@ zxdh_np_dev_add(uint32_t  dev_id, ZXDH_DEV_TYPE_E dev_type,<br />  <br />     p_dev_mgr = &g_dev_mgr;<br />     if (!p_dev_mgr->is_init) {<br />-        PMD_DRV_LOG(ERR, "ErrorCode[ 0x%x]: Device Manager is not init!!!",<br />+        PMD_DRV_LOG(ERR, "ErrorCode[ 0x%x]: Device Manager is not init",<br />                                  ZXDH_RC_DEV_MGR_NOT_INIT);<br />         return ZXDH_RC_DEV_MGR_NOT_INIT;<br />     }<br />  <br />     if (p_dev_mgr->p_dev_array[dev_id] != NULL) {<br />         /* device is already exist. */<br />-        PMD_DRV_LOG(ERR, "Device is added again!!!");<br />+        PMD_DRV_LOG(ERR, "Device is added again");<br />         p_dev_info = p_dev_mgr->p_dev_array[dev_id];<br />     } else {<br />         /* device is new. */<br />@@ -907,7 +907,7 @@ zxdh_np_online_uninit(uint32_t dev_id,<br />     rc = zxdh_np_dtb_queue_release(dev_id, port_name, queue_id);<br />     if (rc != 0)<br />         PMD_DRV_LOG(ERR, "%s:dtb release error," <br />-            "port name %s queue id %d. ", __func__, port_name, queue_id);<br />+            "port name %s queue id %d", __func__, port_name, queue_id);<br />  <br />     zxdh_np_dtb_mgr_destroy(dev_id);<br />     zxdh_np_tlb_mgr_destroy(dev_id);<br />@@ -1030,14 +1030,14 @@ zxdh_np_dtb_se_smmu0_ind_write(uint32_t dev_id,<br />     case ZXDH_ERAM128_OPR_128b:<br />     {<br />         if ((0xFFFFFFFF - (base_addr)) < (index)) {<br />-            PMD_DRV_LOG(ERR,  "ICM %s:%d[Error:VALUE[val0=0x%x]" <br />-                "INVALID] [val1=0x%x] ! FUNCTION :%s !", __FILE__, __LINE__,<br />+            PMD_DRV_LOG(ERR, "ICM %s:%d[Error:VALUE[val0=0x%x]" <br />+                "INVALID] [val1=0x%x] FUNCTION :%s", __FILE__, __LINE__,<br />                 base_addr, index, __func__);<br />  <br />             return ZXDH_PAR_CHK_INVALID_INDEX;<br />         }<br />         if (base_addr + index > ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) {<br />-            PMD_DRV_LOG(ERR, "dpp_se_smmu0_ind_write : index out of range !");<br />+            PMD_DRV_LOG(ERR, "dpp_se_smmu0_ind_write : index out of range");<br />             return 1;<br />         }<br />         temp_idx = index << 7;<br />@@ -1047,7 +1047,7 @@ zxdh_np_dtb_se_smmu0_ind_write(uint32_t dev_id,<br />     case ZXDH_ERAM128_OPR_64b:<br />     {<br />         if ((base_addr + (index >> 1)) > ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) {<br />-            PMD_DRV_LOG(ERR, "dpp_se_smmu0_ind_write : index out of range !");<br />+            PMD_DRV_LOG(ERR, "dpp_se_smmu0_ind_write : index out of range");<br />             return 1;<br />         }<br />         temp_idx = index << 6;<br />@@ -1057,7 +1057,7 @@ zxdh_np_dtb_se_smmu0_ind_write(uint32_t dev_id,<br />     case ZXDH_ERAM128_OPR_1b:<br />     {<br />         if ((base_addr + (index >> 7)) > ZXDH_SE_SMMU0_ERAM_ADDR_NUM_TOTAL - 1) {<br />-            PMD_DRV_LOG(ERR, "dpp_se_smmu0_ind_write : index out of range !");<br />+            PMD_DRV_LOG(ERR, "dpp_se_smmu0_ind_write : index out of range");<br />             return 1;<br />         }<br />  <br />@@ -1067,7 +1067,7 @@ zxdh_np_dtb_se_smmu0_ind_write(uint32_t dev_id,<br />  <br />     dtb_ind_addr = ((base_addr << 7) & ZXDH_ERAM128_BADDR_MASK) + temp_idx;<br />  <br />-    PMD_DRV_LOG(INFO, " dtb eram item 1bit addr: 0x%x", dtb_ind_addr);<br />+    PMD_DRV_LOG(INFO, "dtb eram item 1bit addr: 0x%x", dtb_ind_addr);<br />  <br />     rc = zxdh_np_dtb_smmu0_write_entry_data(dev_id,<br />                           wrt_mode,<br />@@ -1314,7 +1314,7 @@ zxdh_np_dtb_tab_down_info_set(uint32_t dev_id,<br />     uint32_t rc;<br />  <br />     if (ZXDH_DTB_QUEUE_INIT_FLAG_GET(dev_id, queue_id) == 0) {<br />-        PMD_DRV_LOG(ERR, "dtb queue %d is not init.", queue_id);<br />+        PMD_DRV_LOG(ERR, "dtb queue %d is not init", queue_id);<br />         return ZXDH_RC_DTB_QUEUE_IS_NOT_INIT;<br />     }<br />  <br />@@ -1447,7 +1447,7 @@ zxdh_np_dtb_table_entry_write(uint32_t dev_id,<br />         if (dtb_len > max_size) {<br />             rte_free(p_data_buff);<br />             rte_free(p_data_buff_ex);<br />-            PMD_DRV_LOG(ERR, " %s error dtb_len>%u!", __func__,<br />+            PMD_DRV_LOG(ERR, "%s error dtb_len>%u!", __func__,<br />                 max_size);<br />             return ZXDH_RC_DTB_DOWN_LEN_INVALID;<br />         }<br />@@ -1542,7 +1542,7 @@ zxdh_np_dtb_table_entry_delete(uint32_t dev_id,<br />         if (dtb_len > max_size) {<br />             rte_free(p_data_buff);<br />             rte_free(p_data_buff_ex);<br />-            PMD_DRV_LOG(ERR, " %s error dtb_len>%u!", __func__,<br />+            PMD_DRV_LOG(ERR, "%s error dtb_len>%u!", __func__,<br />                 max_size);<br />             return ZXDH_RC_DTB_DOWN_LEN_INVALID;<br />         }<br />@@ -1620,7 +1620,7 @@ zxdh_np_soft_sdt_tbl_get(uint32_t dev_id, uint32_t sdt_no, void *p_sdt_info)<br />  <br />     rc = zxdh_np_sdt_tbl_data_parser(sdt_tbl.data_high32, sdt_tbl.data_low32, p_sdt_info);<br />     if (rc != 0)<br />-        PMD_DRV_LOG(ERR, "dpp sdt [%d] tbl_data_parser error.", sdt_no);<br />+        PMD_DRV_LOG(ERR, "dpp sdt [%d] tbl_data_parser error", sdt_no);<br />  <br />     return rc;<br /> }<br />@@ -1763,7 +1763,7 @@ zxdh_np_dtb_tab_up_info_set(uint32_t dev_id,<br />     }<br />  <br />     if (ZXDH_DTB_QUEUE_INIT_FLAG_GET(dev_id, queue_id) == 0) {<br />-        PMD_DRV_LOG(ERR, "dtb queue %d is not init.", queue_id);<br />+        PMD_DRV_LOG(ERR, "dtb queue %d is not init", queue_id);<br />         return ZXDH_RC_DTB_QUEUE_IS_NOT_INIT;<br />     }<br />  <br />@@ -1829,7 +1829,7 @@ zxdh_np_dtb_tab_up_free_item_get(uint32_t dev_id,<br />     uint32_t i;<br />  <br />     if (ZXDH_DTB_QUEUE_INIT_FLAG_GET(dev_id, queue_id) == 0) {<br />-        PMD_DRV_LOG(ERR, "dtb queue %d is not init.", queue_id);<br />+        PMD_DRV_LOG(ERR, "dtb queue %d is not init", queue_id);<br />         return ZXDH_RC_DTB_QUEUE_IS_NOT_INIT;<br />     }<br />  <br />@@ -1874,7 +1874,7 @@ zxdh_np_dtb_tab_up_item_addr_get(uint32_t dev_id,<br />     uint64_t addr;<br />  <br />     if (ZXDH_DTB_QUEUE_INIT_FLAG_GET(dev_id, queue_id) == 0) {<br />-        PMD_DRV_LOG(ERR, "dtb queue %d is not init.", queue_id);<br />+        PMD_DRV_LOG(ERR, "dtb queue %d is not init", queue_id);<br />         return ZXDH_RC_DTB_QUEUE_IS_NOT_INIT;<br />     }<br />  <br />diff --git a/drivers/net/zxdh/zxdh_pci.c b/drivers/net/zxdh/zxdh_pci.c<br />index 6b2c4482b2..959b1b8cff 100644<br />--- a/drivers/net/zxdh/zxdh_pci.c<br />+++ b/drivers/net/zxdh/zxdh_pci.c<br />@@ -254,7 +254,7 @@ zxdh_pci_get_features(struct zxdh_hw *hw)<br /> void<br /> zxdh_pci_reset(struct zxdh_hw *hw)<br /> {<br />-    PMD_DRV_LOG(INFO, "port %u device start reset, just wait...", hw->port_id);<br />+    PMD_DRV_LOG(INFO, "port %u device start reset, just wait", hw->port_id);<br />     uint32_t retry = 0;<br />  <br />     ZXDH_VTPCI_OPS(hw)->set_status(hw, ZXDH_CONFIG_STATUS_RESET);<br />@@ -379,7 +379,7 @@ zxdh_read_pci_caps(struct rte_pci_device *dev, struct zxdh_hw *hw)<br />     }<br />     if (hw->common_cfg == NULL || hw->notify_base == NULL ||<br />         hw->dev_cfg == NULL || hw->isr == NULL) {<br />-        PMD_DRV_LOG(ERR, "no zxdh pci device found.");<br />+        PMD_DRV_LOG(ERR, "no zxdh pci device found");<br />         return -1;<br />     }<br />     return 0;<br />diff --git a/drivers/net/zxdh/zxdh_queue.h b/drivers/net/zxdh/zxdh_queue.h<br />index 1d89703ccb..ba946dee29 100644<br />--- a/drivers/net/zxdh/zxdh_queue.h<br />+++ b/drivers/net/zxdh/zxdh_queue.h<br />@@ -60,12 +60,12 @@ enum { ZXDH_VTNET_RQ = 0, ZXDH_VTNET_TQ = 1 };<br />  * ring descriptors: 16 bytes.<br />  * These can chain together via "next".<br />  */<br />-struct __rte_packed_begin zxdh_vring_desc {<br />+struct zxdh_vring_desc {<br />     uint64_t addr;  /*  Address (guest-physical). */<br />     uint32_t len;   /* Length. */<br />     uint16_t flags; /* The flags as indicated above. */<br />     uint16_t next;  /* We chain unused descriptors via this. */<br />-} __rte_packed_end;<br />+};<br />  <br /> struct zxdh_vring_used_elem {<br />     /* Index of start of used descriptor chain. */<br />@@ -74,46 +74,47 @@ struct zxdh_vring_used_elem {<br />     uint32_t len;<br /> };<br />  <br />-struct __rte_packed_begin zxdh_vring_used {<br />+struct zxdh_vring_used {<br />     uint16_t flags;<br />     uint16_t idx;<br />     struct zxdh_vring_used_elem ring[];<br />-} __rte_packed_end;<br />+};<br />  <br />-struct __rte_packed_begin zxdh_vring_avail {<br />+struct zxdh_vring_avail {<br />     uint16_t flags;<br />     uint16_t idx;<br />     uint16_t ring[];<br />-} __rte_packed_end;<br />+};<br />  <br />-struct __rte_packed_begin zxdh_vring_packed_desc {<br />+struct zxdh_vring_packed_desc {<br />     uint64_t addr;<br />     uint32_t len;<br />     uint16_t id;<br />     uint16_t flags;<br />-} __rte_packed_end;<br />+};<br />  <br />-struct __rte_packed_begin zxdh_vring_packed_desc_event {<br />+struct zxdh_vring_packed_desc_event {<br />     uint16_t desc_event_off_wrap;<br />     uint16_t desc_event_flags;<br />-} __rte_packed_end;<br />+};<br />  <br />-struct __rte_packed_begin zxdh_vring_packed {<br />+struct zxdh_vring_packed {<br />     uint32_t num;<br />     struct zxdh_vring_packed_desc *desc;<br />     struct zxdh_vring_packed_desc_event *driver;<br />     struct zxdh_vring_packed_desc_event *device;<br />-} __rte_packed_end;<br />+};<br />  <br />-struct __rte_packed_begin zxdh_vq_desc_extra {<br />+struct zxdh_vq_desc_extra {<br />     void *cookie;<br />     uint16_t ndescs;<br />     uint16_t next;<br />-} __rte_packed_end;<br />+};<br />  <br />-struct __rte_packed_begin zxdh_virtqueue {<br />+struct zxdh_virtqueue {<br />     struct zxdh_hw  *hw; /* < zxdh_hw structure pointer. */<br />-    struct __rte_packed_begin {<br />+<br />+    struct {<br />         /* vring keeping descs and events */<br />         struct zxdh_vring_packed ring;<br />         uint8_t used_wrap_counter;<br />@@ -121,7 +122,8 @@ struct __rte_packed_begin zxdh_virtqueue {<br />         uint16_t cached_flags; /* < cached flags for descs */<br />         uint16_t event_flags_shadow;<br />         uint16_t rsv1;<br />-    } __rte_packed_end vq_packed;<br />+    } vq_packed;<br />+<br />     uint16_t vq_used_cons_idx; /* < last consumed descriptor */<br />     uint16_t vq_nentries;  /* < vring desc numbers */<br />     uint16_t vq_free_cnt;  /* < num of desc available */<br />@@ -154,14 +156,14 @@ struct __rte_packed_begin zxdh_virtqueue {<br />     uint16_t *notify_addr;<br />     struct rte_mbuf **sw_ring;  /* < RX software ring. */<br />     struct zxdh_vq_desc_extra vq_descx[];<br />-} __rte_packed_end;<br />+};<br />  <br /> struct __rte_packed_begin zxdh_type_hdr {<br />     uint8_t port;  /* bit[0:1] 00-np 01-DRS 10-DTP */<br />     uint8_t pd_len;<br />     uint8_t num_buffers;<br />     uint8_t reserved;<br />-} __rte_packed_end; /* 4B */<br />+} __rte_packed_end;<br />  <br /> struct __rte_packed_begin zxdh_pi_hdr {<br />     uint8_t  pi_len;<br />@@ -222,12 +224,13 @@ struct __rte_packed_begin zxdh_net_hdr_ul {<br />     struct zxdh_pd_hdr_ul pd_hdr; /* 24B */<br /> } __rte_packed_end; /* 60B */<br />  <br />+<br /> struct zxdh_tx_region {<br />     struct zxdh_net_hdr_dl tx_hdr;<br />-    union __rte_packed_begin {<br />+    union {<br />         struct zxdh_vring_desc tx_indir[ZXDH_MAX_TX_INDIRECT];<br />         struct zxdh_vring_packed_desc tx_packed_indir[ZXDH_MAX_TX_INDIRECT];<br />-    } __rte_packed_end;<br />+    };<br /> };<br />  <br /> static inline size_t<br />diff --git a/drivers/net/zxdh/zxdh_rxtx.c b/drivers/net/zxdh/zxdh_rxtx.c<br />index 27a61d46dd..6353d496f2 100644<br />--- a/drivers/net/zxdh/zxdh_rxtx.c<br />+++ b/drivers/net/zxdh/zxdh_rxtx.c<br />@@ -494,7 +494,7 @@ zxdh_xmit_pkts_packed(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkt<br />             }<br />         }<br />         if (txm->nb_segs > ZXDH_TX_MAX_SEGS) {<br />-            PMD_TX_LOG(ERR, "%d segs  dropped", txm->nb_segs);<br />+            PMD_TX_LOG(ERR, "%d segs dropped", txm->nb_segs);<br />             txvq->stats.truncated_err += nb_pkts - nb_tx;<br />             break;<br />         }<br />@@ -727,7 +727,7 @@ uint16_t zxdh_recv_pkts_packed(void *rx_queue, struct rte_mbuf **rx_pkts,<br />  <br />         if (!seg_res) {<br />             if (rcvd_pkt_len != rx_pkts[nb_rx]->pkt_len) {<br />-                PMD_RX_LOG(ERR, "dropped rcvd_pkt_len %d pktlen %d.",<br />+                PMD_RX_LOG(ERR, "dropped rcvd_pkt_len %d pktlen %d",<br />                     rcvd_pkt_len, rx_pkts[nb_rx]->pkt_len);<br />                 zxdh_discard_rxbuf(vq, rx_pkts[nb_rx]);<br />                 rxvq->stats.errors++;<br />@@ -745,7 +745,7 @@ uint16_t zxdh_recv_pkts_packed(void *rx_queue, struct rte_mbuf **rx_pkts,<br />  <br />         rcv_cnt = zxdh_dequeue_burst_rx_packed(vq, rcv_pkts, len, rcv_cnt);<br />         if (unlikely(rcv_cnt == 0)) {<br />-            PMD_RX_LOG(ERR, "No enough segments for packet.");<br />+            PMD_RX_LOG(ERR, "No enough segments for packet");<br />             rte_pktmbuf_free(rx_pkts[nb_rx]);<br />             rxvq->stats.errors++;<br />             break;<br />@@ -764,7 +764,7 @@ uint16_t zxdh_recv_pkts_packed(void *rx_queue, struct rte_mbuf **rx_pkts,<br />         seg_res -= rcv_cnt;<br />         if (!seg_res) {<br />             if (rcvd_pkt_len != rx_pkts[nb_rx]->pkt_len) {<br />-                PMD_RX_LOG(ERR, "dropped rcvd_pkt_len %d pktlen %d.",<br />+                PMD_RX_LOG(ERR, "dropped rcvd_pkt_len %d pktlen %d",<br />                     rcvd_pkt_len, rx_pkts[nb_rx]->pkt_len);<br />                 zxdh_discard_rxbuf(vq, rx_pkts[nb_rx]);<br />                 rxvq->stats.errors++;<br />diff --git a/drivers/net/zxdh/zxdh_tables.c b/drivers/net/zxdh/zxdh_tables.c<br />index 2939d9ae8b..fe228e2227 100644<br />--- a/drivers/net/zxdh/zxdh_tables.c<br />+++ b/drivers/net/zxdh/zxdh_tables.c<br />@@ -150,6 +150,48 @@ int zxdh_panel_table_init(struct rte_eth_dev *dev)<br />     return ret;<br /> }<br />  <br />+int zxdh_get_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_attr)<br />+{<br />+    struct zxdh_hw *hw = dev->data->dev_private;<br />+    uint8_t index_phy_port = hw->phyport;<br />+<br />+    ZXDH_DTB_ERAM_ENTRY_INFO_T panel_entry = {<br />+        .index = index_phy_port,<br />+        .p_data = (uint32_t *)panel_attr<br />+    };<br />+    ZXDH_DTB_USER_ENTRY_T entry = {<br />+        .sdt_no = ZXDH_SDT_PANEL_ATT_TABLE,<br />+        .p_entry_data = (void *)&panel_entry<br />+    };<br />+    int ret = zxdh_np_dtb_table_entry_get(ZXDH_DEVICE_NO, g_dtb_data.queueid, &entry, 1);<br />+<br />+    if (ret != 0)<br />+        PMD_DRV_LOG(ERR, "get panel table failed");<br />+<br />+    return ret;<br />+}<br />+<br />+int zxdh_set_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_attr)<br />+{<br />+    struct zxdh_hw *hw = dev->data->dev_private;<br />+    uint8_t index_phy_port = hw->phyport;<br />+<br />+    ZXDH_DTB_ERAM_ENTRY_INFO_T panel_entry = {<br />+        .index = index_phy_port,<br />+        .p_data = (uint32_t *)panel_attr<br />+    };<br />+    ZXDH_DTB_USER_ENTRY_T entry = {<br />+        .sdt_no = ZXDH_SDT_PANEL_ATT_TABLE,<br />+        .p_entry_data = (void *)&panel_entry<br />+    };<br />+    int ret = zxdh_np_dtb_table_entry_write(ZXDH_DEVICE_NO, g_dtb_data.queueid, 1, &entry);<br />+<br />+    if (ret)<br />+        PMD_DRV_LOG(ERR, "Insert panel table failed");<br />+<br />+    return ret;<br />+}<br />+<br /> int<br /> zxdh_get_port_attr(uint16_t vfid, struct zxdh_port_attr_table *port_attr)<br /> {<br />@@ -160,7 +202,7 @@ zxdh_get_port_attr(uint16_t vfid, struct zxdh_port_attr_table *port_attr)<br />  <br />     ret = zxdh_np_dtb_table_entry_get(ZXDH_DEVICE_NO, g_dtb_data.queueid, &user_entry_get, 1);<br />     if (ret != 0)<br />-        PMD_DRV_LOG(ERR, "get port_attr vfid:%d failed, ret:%d ", vfid, ret);<br />+        PMD_DRV_LOG(ERR, "get port_attr vfid:%d failed, ret:%d", vfid, ret);<br />  <br />     return ret;<br /> }<br />@@ -529,7 +571,7 @@ zxdh_dev_unicast_table_set(struct zxdh_hw *hw, uint16_t vport, bool enable)<br />  <br />     ret = zxdh_np_dtb_table_entry_write(ZXDH_DEVICE_NO, g_dtb_data.queueid, 1, &entry);<br />     if (ret) {<br />-        PMD_DRV_LOG(ERR, "unicast_table_set_failed:%d",  hw->vfid);<br />+        PMD_DRV_LOG(ERR, "unicast_table_set_failed:%d", hw->vfid);<br />         return -ret;<br />     }<br />     return 0;<br />diff --git a/drivers/net/zxdh/zxdh_tables.h b/drivers/net/zxdh/zxdh_tables.h<br />index c7da40f294..adedf3d0d3 100644<br />--- a/drivers/net/zxdh/zxdh_tables.h<br />+++ b/drivers/net/zxdh/zxdh_tables.h<br />@@ -8,8 +8,10 @@<br /> #include <stdint.h> <br />  <br /> #define ZXDH_DEVICE_NO                    0<br />+#define ZXDH_PORT_MTU_FLAG                9<br /> #define ZXDH_PORT_BASE_QID_FLAG           10<br /> #define ZXDH_PORT_ATTR_IS_UP_FLAG         35<br />+#define ZXDH_PORT_MTU_EN_FLAG             42<br />  <br /> #define ZXDH_MTU_STATS_EGRESS_BASE        0x8481<br /> #define ZXDH_MTU_STATS_INGRESS_BASE       0x8981<br />@@ -223,5 +225,7 @@ int zxdh_vlan_filter_table_init(struct rte_eth_dev *dev);<br /> int zxdh_vlan_filter_table_set(uint16_t vport, uint16_t vlan_id, uint8_t enable);<br /> int zxdh_rss_table_set(uint16_t vport, struct zxdh_rss_reta *rss_reta);<br /> int zxdh_rss_table_get(uint16_t vport, struct zxdh_rss_reta *rss_reta);<br />+int zxdh_get_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_attr);<br />+int zxdh_set_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_attr);<br />  <br /> #endif /* ZXDH_TABLES_H */<br />--  <br />2.27.0<br />