In order to accommodate previous firmware versions,<br />this patch has optimized the message processing ops,<br />and modify some issues.<br /> <br />Signed-off-by: Bingbin Chen <chen.bingbin@zte.com.cn> <br />---<br /> drivers/net/zxdh/zxdh_common.h     | 100 ++++++++<br /> drivers/net/zxdh/zxdh_ethdev.c     |  18 +-<br /> drivers/net/zxdh/zxdh_ethdev_ops.c | 109 +++++----<br /> drivers/net/zxdh/zxdh_ethdev_ops.h |  35 +++<br /> drivers/net/zxdh/zxdh_msg.c        | 378 +++++++++++++++++------------<br /> drivers/net/zxdh/zxdh_msg.h        |  99 +++++---<br /> drivers/net/zxdh/zxdh_mtr.c        |  42 ++--<br /> drivers/net/zxdh/zxdh_mtr.h        |   5 +<br /> drivers/net/zxdh/zxdh_pci.c        |  24 +-<br /> drivers/net/zxdh/zxdh_pci.h        |   2 +-<br /> drivers/net/zxdh/zxdh_rxtx.c       |  12 +-<br /> drivers/net/zxdh/zxdh_tables.c     |  67 ++---<br /> drivers/net/zxdh/zxdh_tables.h     |  68 ++++--<br /> 13 files changed, 649 insertions(+), 310 deletions(-)<br /> <br />diff --git a/drivers/net/zxdh/zxdh_common.h b/drivers/net/zxdh/zxdh_common.h<br />index d78a822ebf..aaf4e0bedb 100644<br />--- a/drivers/net/zxdh/zxdh_common.h<br />+++ b/drivers/net/zxdh/zxdh_common.h<br />@@ -9,6 +9,7 @@<br /> #include <rte_ethdev.h> <br />  <br /> #include "zxdh_ethdev.h" <br />+#include "zxdh_logs.h" <br />  <br /> #define ZXDH_VF_LOCK_REG               0x90<br /> #define ZXDH_VF_LOCK_ENABLE_MASK       0x1<br />@@ -20,6 +21,105 @@ struct zxdh_res_para {<br />     uint16_t src_type; /* refer to BAR_DRIVER_TYPE */<br /> };<br />  <br />+static inline size_t<br />+zxdh_get_value(uint32_t fld_sz, uint8_t *addr) {<br />+    size_t result = 0;<br />+    switch (fld_sz) {<br />+    case 1:<br />+        result = *((uint8_t *)addr);<br />+        break;<br />+    case 2:<br />+        result = *((uint16_t *)addr);<br />+        break;<br />+    case 4:<br />+        result = *((uint32_t *)addr);<br />+        break;<br />+    case 8:<br />+        result = *((uint64_t *)addr);<br />+        break;<br />+    default:<br />+        PMD_MSG_LOG(ERR, "unreachable field size %u", fld_sz);<br />+        break;<br />+    }<br />+    return result;<br />+}<br />+<br />+static inline void<br />+zxdh_set_value(uint32_t fld_sz, uint8_t *addr, size_t value) {<br />+    switch (fld_sz) {<br />+    case 1:<br />+        *(uint8_t *)addr = (uint8_t)value;<br />+        break;<br />+    case 2:<br />+        *(uint16_t *)addr = (uint16_t)value;<br />+        break;<br />+    case 4:<br />+        *(uint32_t *)addr = (uint32_t)value;<br />+        break;<br />+    case 8:<br />+        *(uint64_t *)addr = (uint64_t)value;<br />+        break;<br />+    default:<br />+        PMD_MSG_LOG(ERR, "unreachable field size %u", fld_sz);<br />+        break;<br />+    }<br />+}<br />+<br />+#define __zxdh_nullp(typ) ((struct zxdh_ifc_##typ##_bits *)0)<br />+#define __zxdh_bit_sz(typ, fld) sizeof(__zxdh_nullp(typ)->fld)<br />+#define __zxdh_bit_off(typ, fld) ((unsigned int)(uintptr_t) \<br />+                  (&(__zxdh_nullp(typ)->fld)))<br />+#define __zxdh_dw_bit_off(typ, fld) (32 - __zxdh_bit_sz(typ, fld) - \<br />+                    (__zxdh_bit_off(typ, fld) & 0x1f))<br />+#define __zxdh_dw_off(typ, fld) (__zxdh_bit_off(typ, fld) / 32)<br />+#define __zxdh_64_off(typ, fld) (__zxdh_bit_off(typ, fld) / 64)<br />+#define __zxdh_dw_mask(typ, fld) (__zxdh_mask(typ, fld) << \<br />+                  __zxdh_dw_bit_off(typ, fld))<br />+#define __zxdh_mask(typ, fld) ((uint32_t)((1ull << __zxdh_bit_sz(typ, fld)) - 1))<br />+#define __zxdh_16_off(typ, fld) (__zxdh_bit_off(typ, fld) / 16)<br />+#define __zxdh_16_bit_off(typ, fld) (16 - __zxdh_bit_sz(typ, fld) - \<br />+                    (__zxdh_bit_off(typ, fld) & 0xf))<br />+#define __zxdh_mask16(typ, fld) ((uint16_t)((1ull << __zxdh_bit_sz(typ, fld)) - 1))<br />+#define __zxdh_16_mask(typ, fld) (__zxdh_mask16(typ, fld) << \<br />+                  __zxdh_16_bit_off(typ, fld))<br />+#define ZXDH_ST_SZ_BYTES(typ) (sizeof(struct zxdh_ifc_##typ##_bits) / 8)<br />+#define ZXDH_ST_SZ_DW(typ) (sizeof(struct zxdh_ifc_##typ##_bits) / 32)<br />+#define ZXDH_BYTE_OFF(typ, fld) (__zxdh_bit_off(typ, fld) / 8)<br />+#define ZXDH_ADDR_OF(typ, p, fld) ((uint8_t *)(p) + ZXDH_BYTE_OFF(typ, fld))<br />+<br />+#define BUILD_BUG_ON(condition) do { \<br />+    if (condition) \<br />+        __builtin_unreachable(); \<br />+    } while (0)<br />+<br />+#define ZXDH_SET(typ, p, fld, v) do { \<br />+    BUILD_BUG_ON(__zxdh_bit_sz(typ, fld) % 8); \<br />+    uint32_t fld_sz = __zxdh_bit_sz(typ, fld) / 8; \<br />+    uint8_t *addr = ZXDH_ADDR_OF(typ, p, fld); \<br />+    zxdh_set_value(fld_sz, addr, v); \<br />+} while (0)<br />+<br />+#define ZXDH_GET(typ, p, fld) ({ \<br />+    BUILD_BUG_ON(__zxdh_bit_sz(typ, fld) % 8); \<br />+    uint32_t fld_sz = __zxdh_bit_sz(typ, fld) / 8; \<br />+    uint8_t *addr = ZXDH_ADDR_OF(typ, p, fld); \<br />+    zxdh_get_value(fld_sz, addr); \<br />+})<br />+<br />+#define ZXDH_SET_ARRAY(typ, p, fld, index, value, type) \<br />+    do { \<br />+        type *addr = (type *)((uint8_t *)ZXDH_ADDR_OF(typ, p, fld) + \<br />+        (index) * sizeof(type)); \<br />+        *addr = (type)(value); \<br />+    } while (0)<br />+<br />+#define ZXDH_GET_ARRAY(typ, p, fld, index, type) \<br />+    ({ \<br />+        type *addr = (type *)((uint8_t *)ZXDH_ADDR_OF(typ, p, fld) + \<br />+        (index) * sizeof(type)); \<br />+        *addr; \<br />+    })<br />+<br /> int32_t zxdh_phyport_get(struct rte_eth_dev *dev, uint8_t *phyport);<br /> int32_t zxdh_panelid_get(struct rte_eth_dev *dev, uint8_t *pannelid);<br /> int32_t zxdh_hashidx_get(struct rte_eth_dev *dev, uint8_t *hash_idx);<br />diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c<br />index ea8b18e5e1..a0cea32b87 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev.c<br />@@ -1250,10 +1250,6 @@ zxdh_set_rxtx_funcs(struct rte_eth_dev *eth_dev)<br /> {<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 />-        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 />         return -1;<br />@@ -1498,6 +1494,8 @@ zxdh_dtb_dump_res_init(struct zxdh_hw *hw, ZXDH_DEV_INIT_CTRL_T *dpp_ctrl)<br />  <br />     struct zxdh_dtb_bulk_dump_info dtb_dump_baseres[] = {<br />         {"sdt_vport_att_table", 4 * 1024 * 1024, ZXDH_SDT_VPORT_ATT_TABLE, NULL},<br />+        {"sdt_vlan_att_table", 4 * 1024 * 1024, ZXDH_SDT_VLAN_ATT_TABLE, NULL},<br />+        {"sdt_rss_table", 4 * 1024 * 1024, ZXDH_SDT_RSS_ATT_TABLE, NULL},<br />         {"sdt_l2_entry_table0", 5 * 1024 * 1024, ZXDH_SDT_L2_ENTRY_TABLE0, NULL},<br />         {"sdt_l2_entry_table1", 5 * 1024 * 1024, ZXDH_SDT_L2_ENTRY_TABLE1, NULL},<br />         {"sdt_l2_entry_table2", 5 * 1024 * 1024, ZXDH_SDT_L2_ENTRY_TABLE2, NULL},<br />@@ -1514,7 +1512,7 @@ zxdh_dtb_dump_res_init(struct zxdh_hw *hw, ZXDH_DEV_INIT_CTRL_T *dpp_ctrl)<br />     for (i = 0; i < (int)RTE_DIM(dtb_dump_baseres); i++) {<br />         struct zxdh_dtb_bulk_dump_info *p = dtb_dump_baseres + i;<br />         char buf[ZXDH_MAX_NAME_LEN] = {0};<br />-<br />+        snprintf(buf, sizeof(buf), "%s_%x", p->mz_name, hw->dev_id);<br />         p->mz_name = buf;<br />  <br />         const struct rte_memzone *generic_dump_mz =<br />@@ -1544,6 +1542,7 @@ zxdh_np_dtb_res_init(struct rte_eth_dev *dev)<br />     struct zxdh_hw *hw = dev->data->dev_private;<br />     struct zxdh_bar_offset_params param = {0};<br />     struct zxdh_bar_offset_res res = {0};<br />+    char buf[ZXDH_MAX_NAME_LEN] = {0};<br />     struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd;<br />     int ret = 0;<br />  <br />@@ -1569,7 +1568,7 @@ zxdh_np_dtb_res_init(struct rte_eth_dev *dev)<br />     dpp_ctrl->vport = hw->vport.vport;<br />     dpp_ctrl->vector = ZXDH_MSIX_INTR_DTB_VEC;<br />     strlcpy(dpp_ctrl->port_name, dev->device->name, sizeof(dpp_ctrl->port_name));<br />-    dpp_ctrl->pcie_vir_addr = (uint32_t)hw->bar_addr[0];<br />+    dpp_ctrl->pcie_vir_addr = hw->bar_addr[0];<br />  <br />     param.pcie_id = hw->pcie_id;<br />     param.virt_addr = hw->bar_addr[0] + ZXDH_CTRLCH_OFFSET;<br />@@ -1584,7 +1583,8 @@ zxdh_np_dtb_res_init(struct rte_eth_dev *dev)<br />     dpp_ctrl->np_bar_offset = res.bar_offset;<br />  <br />     if (!dtb_data->dtb_table_conf_mz) {<br />-        const struct rte_memzone *conf_mz = rte_memzone_reserve_aligned("zxdh_dtb_table_conf_mz",<br />+        snprintf(buf, sizeof(buf), "%s_%x", "zxdh_dtb_table_conf_mz", hw->dev_id);<br />+        const struct rte_memzone *conf_mz = rte_memzone_reserve_aligned(buf,<br />                 ZXDH_DTB_TABLE_CONF_SIZE, SOCKET_ID_ANY, 0, RTE_CACHE_LINE_SIZE);<br />  <br />         if (conf_mz == NULL) {<br />@@ -1600,7 +1600,9 @@ zxdh_np_dtb_res_init(struct rte_eth_dev *dev)<br />     }<br />  <br />     if (!dtb_data->dtb_table_dump_mz) {<br />-        const struct rte_memzone *dump_mz = rte_memzone_reserve_aligned("zxdh_dtb_table_dump_mz",<br />+        memset(buf, '\0', sizeof(buf));<br />+        snprintf(buf, sizeof(buf), "%s_%x", "zxdh_dtb_table_dump_mz", hw->dev_id);<br />+        const struct rte_memzone *dump_mz = rte_memzone_reserve_aligned(buf,<br />                 ZXDH_DTB_TABLE_DUMP_SIZE, SOCKET_ID_ANY, 0, RTE_CACHE_LINE_SIZE);<br />  <br />         if (dump_mz == NULL) {<br />diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c b/drivers/net/zxdh/zxdh_ethdev_ops.c<br />index 2b02734c62..f8e8d26c50 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev_ops.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev_ops.c<br />@@ -15,6 +15,7 @@<br /> #include "zxdh_np.h" <br /> #include "zxdh_queue.h" <br /> #include "zxdh_mtr.h" <br />+#include "zxdh_common.h" <br />  <br /> #define ZXDH_VLAN_FILTER_GROUPS       64<br /> #define ZXDH_INVALID_LOGIC_QID        0xFFFFU<br />@@ -278,9 +279,11 @@ zxdh_link_info_get(struct rte_eth_dev *dev, struct rte_eth_link *link)<br /> {<br />     struct zxdh_hw *hw = dev->data->dev_private;<br />     struct zxdh_msg_info msg_info = {0};<br />-    struct zxdh_msg_reply_info reply_info = {0};<br />+    uint8_t zxdh_msg_reply_info[ZXDH_ST_SZ_BYTES(msg_reply_info)] = {0};<br />     uint16_t status = 0;<br />     int32_t ret = 0;<br />+    void *reply_body_addr = ZXDH_ADDR_OF(msg_reply_info, zxdh_msg_reply_info, reply_body);<br />+    void *link_msg_addr = ZXDH_ADDR_OF(msg_reply_body, reply_body_addr, link_msg);<br />  <br />     if (zxdh_pci_with_feature(hw, ZXDH_NET_F_STATUS))<br />         zxdh_pci_read_dev_config(hw, offsetof(struct zxdh_net_config, status),<br />@@ -295,17 +298,18 @@ zxdh_link_info_get(struct rte_eth_dev *dev, struct rte_eth_link *link)<br />         zxdh_agent_msg_build(hw, ZXDH_MAC_LINK_GET, &msg_info);<br />  <br />         ret = zxdh_send_msg_to_riscv(dev, &msg_info, sizeof(struct zxdh_msg_info),<br />-                &reply_info, sizeof(struct zxdh_msg_reply_info),<br />+                zxdh_msg_reply_info, ZXDH_ST_SZ_BYTES(msg_reply_info),<br />                 ZXDH_BAR_MODULE_MAC);<br />         if (ret) {<br />             PMD_DRV_LOG(ERR, "Failed to send msg: port 0x%x msg type %d",<br />                     hw->vport.vport, ZXDH_MAC_LINK_GET);<br />             return -1;<br />         }<br />-        link->link_speed = reply_info.reply_body.link_msg.speed;<br />-        link->link_autoneg = reply_info.reply_body.link_msg.autoneg;<br />-        hw->speed_mode = reply_info.reply_body.link_msg.speed_modes;<br />-        if ((reply_info.reply_body.link_msg.duplex & RTE_ETH_LINK_FULL_DUPLEX) ==<br />+<br />+        link->link_speed = ZXDH_GET(link_info_msg, link_msg_addr, speed);<br />+        link->link_autoneg = ZXDH_GET(link_info_msg, link_msg_addr, autoneg);<br />+        hw->speed_mode = ZXDH_GET(link_info_msg, link_msg_addr, speed_modes);<br />+        if ((ZXDH_GET(link_info_msg, link_msg_addr, duplex) & RTE_ETH_LINK_FULL_DUPLEX) ==<br />                 RTE_ETH_LINK_FULL_DUPLEX)<br />             link->link_duplex = RTE_ETH_LINK_FULL_DUPLEX;<br />         else<br />@@ -433,7 +437,7 @@ zxdh_dev_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *addr)<br />         ret = zxdh_del_mac_table(hw, hw->vport.vport, old_addr,<br />             hw->hash_search_index, 0, 0);<br />         if (ret) {<br />-            PMD_DRV_LOG(ERR, "mac_addr_add failed, code:%d", ret);<br />+            PMD_DRV_LOG(ERR, "mac_addr_del failed, code:%d", ret);<br />             return ret;<br />         }<br />         hw->uc_num--;<br />@@ -467,6 +471,8 @@ zxdh_dev_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *addr)<br />         hw->uc_num--;<br />     }<br />     rte_ether_addr_copy(addr, (struct rte_ether_addr *)hw->mac_addr);<br />+    zxdh_pci_write_dev_config(hw, offsetof(struct zxdh_net_config, mac),<br />+                                &hw->mac_addr, RTE_ETHER_ADDR_LEN);<br />     return ret;<br /> }<br />  <br />@@ -566,7 +572,7 @@ zxdh_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr,<br />  <br /> void zxdh_dev_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index)<br /> {<br />-    struct zxdh_hw *hw    = dev->data->dev_private;<br />+    struct zxdh_hw *hw = dev->data->dev_private;<br />     struct zxdh_msg_info msg_info = {0};<br />     struct rte_ether_addr *mac_addr = &dev->data->mac_addrs[index];<br />     uint16_t ret = 0;<br />@@ -1072,7 +1078,9 @@ zxdh_dev_rss_reta_query(struct rte_eth_dev *dev,<br /> {<br />     struct zxdh_hw *hw = (struct zxdh_hw *)dev->data->dev_private;<br />     struct zxdh_msg_info msg = {0};<br />-    struct zxdh_msg_reply_info reply_msg = {0};<br />+    uint8_t zxdh_msg_reply_info[ZXDH_ST_SZ_BYTES(msg_reply_info)] = {0};<br />+    void *reply_body_addr = ZXDH_ADDR_OF(msg_reply_info, zxdh_msg_reply_info, reply_body);<br />+    void *rss_reta_msg_addr = ZXDH_ADDR_OF(msg_reply_body, reply_body_addr, rss_reta_msg);<br />     uint16_t idx;<br />     uint16_t i;<br />     int ret = 0;<br />@@ -1094,21 +1102,21 @@ zxdh_dev_rss_reta_query(struct rte_eth_dev *dev,<br />     zxdh_msg_head_build(hw, ZXDH_RSS_RETA_GET, &msg);<br />  <br />     if (hw->is_pf) {<br />-        ret = zxdh_rss_table_get(hw, hw->vport.vport, &reply_msg.reply_body.rss_reta);<br />+        ret = zxdh_rss_table_get(hw, hw->vport.vport, rss_reta_msg_addr);<br />         if (ret) {<br />             PMD_DRV_LOG(ERR, "rss reta table set failed");<br />             return -EINVAL;<br />         }<br />     } else {<br />         ret = zxdh_vf_send_msg_to_pf(dev, &msg, sizeof(struct zxdh_msg_info),<br />-                    &reply_msg, sizeof(struct zxdh_msg_reply_info));<br />+                    zxdh_msg_reply_info, ZXDH_ST_SZ_BYTES(msg_reply_info));<br />         if (ret) {<br />             PMD_DRV_LOG(ERR, "vf rss reta table get failed");<br />             return -EINVAL;<br />         }<br />     }<br />  <br />-    struct zxdh_rss_reta *reta_table = &reply_msg.reply_body.rss_reta;<br />+    struct zxdh_rss_reta *reta_table = rss_reta_msg_addr;<br />  <br />     for (idx = 0, i = 0; i < reta_size; ++i) {<br />         idx = i / RTE_ETH_RETA_GROUP_SIZE;<br />@@ -1232,10 +1240,13 @@ zxdh_rss_hash_conf_get(struct rte_eth_dev *dev, struct rte_eth_rss_conf *rss_con<br />     struct zxdh_hw *hw = (struct zxdh_hw *)dev->data->dev_private;<br />     struct rte_eth_rss_conf *old_rss_conf = &dev->data->dev_conf.rx_adv_conf.rss_conf;<br />     struct zxdh_msg_info msg = {0};<br />-    struct zxdh_msg_reply_info reply_msg = {0};<br />+    uint8_t zxdh_msg_reply_info[ZXDH_ST_SZ_BYTES(msg_reply_info)] = {0};<br />+    void *reply_body_addr = ZXDH_ADDR_OF(msg_reply_info, zxdh_msg_reply_info, reply_body);<br />+    void *rss_hf_msg_addr = ZXDH_ADDR_OF(msg_reply_body, reply_body_addr, rss_hf_msg);<br />     struct zxdh_port_attr_table port_attr = {0};<br />-    int ret;<br />+    uint32_t rss_hf;<br />     uint32_t hw_hf;<br />+    int ret;<br />  <br />     if (rss_conf == NULL) {<br />         PMD_DRV_LOG(ERR, "rss conf is NULL");<br />@@ -1252,16 +1263,17 @@ zxdh_rss_hash_conf_get(struct rte_eth_dev *dev, struct rte_eth_rss_conf *rss_con<br />             PMD_DRV_LOG(ERR, "rss hash factor set failed");<br />             return -EINVAL;<br />         }<br />-        reply_msg.reply_body.rss_hf.rss_hf = port_attr.rss_hash_factor;<br />+        ZXDH_SET(rss_hf, rss_hf_msg_addr, rss_hf, port_attr.rss_hash_factor);<br />     } else {<br />         ret = zxdh_vf_send_msg_to_pf(dev, &msg, sizeof(struct zxdh_msg_info),<br />-                &reply_msg, sizeof(struct zxdh_msg_reply_info));<br />+                zxdh_msg_reply_info, ZXDH_ST_SZ_BYTES(msg_reply_info));<br />         if (ret) {<br />             PMD_DRV_LOG(ERR, "rss hash factor set failed");<br />             return -EINVAL;<br />         }<br />     }<br />-    rss_conf->rss_hf = zxdh_rss_hf_to_eth(reply_msg.reply_body.rss_hf.rss_hf);<br />+    rss_hf = ZXDH_GET(rss_hf, rss_hf_msg_addr, rss_hf);<br />+    rss_conf->rss_hf = zxdh_rss_hf_to_eth(rss_hf);<br />  <br />     return 0;<br /> }<br />@@ -1382,7 +1394,8 @@ zxdh_hw_vqm_stats_get(struct rte_eth_dev *dev, enum zxdh_agent_msg_type opcode,<br /> {<br />     struct zxdh_hw *hw = dev->data->dev_private;<br />     struct zxdh_msg_info msg_info = {0};<br />-    struct zxdh_msg_reply_info reply_info = {0};<br />+    uint8_t zxdh_msg_reply_info[ZXDH_ST_SZ_BYTES(msg_reply_info)] = {0};<br />+    void *reply_body_addr = ZXDH_ADDR_OF(msg_reply_info, zxdh_msg_reply_info, reply_body);<br />     enum ZXDH_BAR_MODULE_ID module_id;<br />     int ret = 0;<br />  <br />@@ -1404,14 +1417,15 @@ zxdh_hw_vqm_stats_get(struct rte_eth_dev *dev, enum zxdh_agent_msg_type opcode,<br />     zxdh_agent_msg_build(hw, opcode, &msg_info);<br />  <br />     ret = zxdh_send_msg_to_riscv(dev, &msg_info, sizeof(struct zxdh_msg_info),<br />-                &reply_info, sizeof(struct zxdh_msg_reply_info), module_id);<br />+                zxdh_msg_reply_info, ZXDH_ST_SZ_BYTES(msg_reply_info), module_id);<br />     if (ret) {<br />         PMD_DRV_LOG(ERR, "Failed to get hw stats");<br />         return -1;<br />     }<br />-    struct zxdh_msg_reply_body *reply_body = &reply_info.reply_body;<br />  <br />-    memcpy(hw_stats, &reply_body->vqm_stats, sizeof(struct zxdh_hw_vqm_stats));<br />+    void *hw_vqm_stats = ZXDH_ADDR_OF(msg_reply_body, reply_body_addr, vqm_stats);<br />+    memcpy(hw_stats, hw_vqm_stats, sizeof(struct zxdh_hw_vqm_stats));<br />+<br />     return 0;<br /> }<br />  <br />@@ -1578,7 +1592,9 @@ zxdh_hw_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)<br /> {<br />     struct zxdh_hw *hw = dev->data->dev_private;<br />     struct zxdh_msg_info msg_info = {0};<br />-    struct zxdh_msg_reply_info reply_info = {0};<br />+    uint8_t zxdh_msg_reply_info[ZXDH_ST_SZ_BYTES(msg_reply_info)] = {0};<br />+    void *reply_body_addr = ZXDH_ADDR_OF(msg_reply_info, zxdh_msg_reply_info, reply_body);<br />+    void *hw_stas_addr = ZXDH_ADDR_OF(msg_reply_body, reply_body_addr, hw_stats);<br />     int ret = 0;<br />  <br />     if (hw->is_pf) {<br />@@ -1590,13 +1606,13 @@ zxdh_hw_np_stats_get(struct rte_eth_dev *dev, struct zxdh_hw_np_stats *np_stats)<br />     } else {<br />         zxdh_msg_head_build(hw, ZXDH_GET_NP_STATS, &msg_info);<br />         ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(struct zxdh_msg_info),<br />-                    &reply_info, sizeof(struct zxdh_msg_reply_info));<br />+                    zxdh_msg_reply_info, ZXDH_ST_SZ_BYTES(msg_reply_info));<br />         if (ret) {<br />             PMD_DRV_LOG(ERR,<br />                 "Failed to send msg: port 0x%x msg type", hw->vport.vport);<br />             return -1;<br />         }<br />-        memcpy(np_stats, &reply_info.reply_body.np_stats, sizeof(struct zxdh_hw_np_stats));<br />+        memcpy(np_stats, hw_stas_addr, sizeof(struct zxdh_hw_np_stats));<br />     }<br />     return ret;<br /> }<br />@@ -1666,7 +1682,7 @@ zxdh_hw_stats_reset(struct rte_eth_dev *dev, enum zxdh_agent_msg_type opcode)<br /> {<br />     struct zxdh_hw *hw = dev->data->dev_private;<br />     struct zxdh_msg_info msg_info = {0};<br />-    struct zxdh_msg_reply_info reply_info = {0};<br />+    uint8_t zxdh_msg_reply_info[ZXDH_ST_SZ_BYTES(msg_reply_info)] = {0};<br />     enum ZXDH_BAR_MODULE_ID module_id;<br />     int ret = 0;<br />  <br />@@ -1685,7 +1701,7 @@ zxdh_hw_stats_reset(struct rte_eth_dev *dev, enum zxdh_agent_msg_type opcode)<br />     zxdh_agent_msg_build(hw, opcode, &msg_info);<br />  <br />     ret = zxdh_send_msg_to_riscv(dev, &msg_info, sizeof(struct zxdh_msg_info),<br />-                &reply_info, sizeof(struct zxdh_msg_reply_info), module_id);<br />+                zxdh_msg_reply_info, ZXDH_ST_SZ_BYTES(msg_reply_info), module_id);<br />     if (ret) {<br />         PMD_DRV_LOG(ERR, "Failed to reset hw stats");<br />         return -1;<br />@@ -1767,13 +1783,13 @@ zxdh_hw_np_stats_vf_reset(struct rte_eth_dev *dev)<br /> {<br />     struct zxdh_hw *hw = dev->data->dev_private;<br />     struct zxdh_msg_info msg_info = {0};<br />-    struct zxdh_msg_reply_info reply_info = {0};<br />+    uint8_t zxdh_msg_reply_info[ZXDH_ST_SZ_BYTES(msg_reply_info)] = {0};<br />     int ret = 0;<br />  <br />     msg_info.data.np_stats_query.clear_mode = 1;<br />     zxdh_msg_head_build(hw, ZXDH_GET_NP_STATS, &msg_info);<br />     ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(struct zxdh_msg_info),<br />-            &reply_info, sizeof(reply_info));<br />+            zxdh_msg_reply_info, ZXDH_ST_SZ_BYTES(msg_reply_info));<br />     if (ret)<br />         PMD_DRV_LOG(ERR, "Failed to send ZXDH_PORT_METER_STAT_GET msg. code:%d", ret);<br />  <br />@@ -2034,29 +2050,24 @@ zxdh_dev_fw_version_get(struct rte_eth_dev *dev,<br /> {<br />     struct zxdh_hw *hw = dev->data->dev_private;<br />     struct zxdh_msg_info msg_info = {0};<br />-    struct zxdh_msg_reply_info reply_info = {0};<br />+    uint8_t zxdh_msg_reply_info[ZXDH_ST_SZ_BYTES(msg_reply_info)] = {0};<br />+    void *reply_body_addr = ZXDH_ADDR_OF(msg_reply_info, zxdh_msg_reply_info, reply_body);<br />+    void *flash_msg_addr = ZXDH_ADDR_OF(msg_reply_body, reply_body_addr, flash_msg);<br />     char fw_ver[ZXDH_FWVERS_LEN] = {0};<br />     uint32_t ret = 0;<br />  <br />     zxdh_agent_msg_build(hw, ZXDH_FLASH_FIR_VERSION_GET, &msg_info);<br />  <br />-    struct zxdh_msg_recviver_mem rsp_data = {<br />-            .recv_buffer = (void *)&reply_info,<br />-            .buffer_len = sizeof(struct zxdh_msg_reply_info),<br />-    };<br />-<br />     ret = zxdh_send_msg_to_riscv(dev, &msg_info, sizeof(struct zxdh_msg_info),<br />-                &reply_info, sizeof(struct zxdh_msg_reply_info),<br />+                zxdh_msg_reply_info, ZXDH_ST_SZ_BYTES(msg_reply_info),<br />                 ZXDH_MODULE_FLASH);<br />     if (ret) {<br />         PMD_DRV_LOG(ERR, "Failed to send msg: port 0x%x msg type %d",<br />                 hw->vport.vport, ZXDH_FLASH_FIR_VERSION_GET);<br />         return -1;<br />     }<br />-    struct zxdh_msg_reply_body *ack_msg =<br />-             &(((struct zxdh_msg_reply_info *)rsp_data.recv_buffer)->reply_body);<br />  <br />-    memcpy(fw_ver, ack_msg->flash_msg.firmware_version, ZXDH_FWVERS_LEN);<br />+    memcpy(fw_ver, flash_msg_addr, ZXDH_FWVERS_LEN);<br />     snprintf(fw_version, ZXDH_FWVERS_LEN - 1, "%s", fw_ver);<br />  <br />     return 0;<br />@@ -2068,7 +2079,7 @@ zxdh_en_module_eeprom_read(struct rte_eth_dev *dev,<br /> {<br />     struct zxdh_hw *hw = dev->data->dev_private;<br />     struct zxdh_msg_info msg_info = {0};<br />-    struct zxdh_msg_reply_info reply_info = {0};<br />+    uint8_t zxdh_msg_reply_info[ZXDH_ST_SZ_BYTES(msg_reply_info)] = {0};<br />     uint8_t ret = 0;<br />  <br />     zxdh_agent_msg_build(hw, ZXDH_MAC_MODULE_EEPROM_READ, &msg_info);<br />@@ -2079,26 +2090,24 @@ zxdh_en_module_eeprom_read(struct rte_eth_dev *dev,<br />     msg_info.data.module_eeprom_msg.offset = query->offset;<br />     msg_info.data.module_eeprom_msg.length = query->length;<br />  <br />-    struct zxdh_msg_recviver_mem rsp_data = {<br />-            .recv_buffer = (void *)&reply_info,<br />-            .buffer_len = sizeof(struct zxdh_msg_reply_info),<br />-    };<br />-<br />     ret = zxdh_send_msg_to_riscv(dev, &msg_info, sizeof(struct zxdh_msg_info),<br />-                &reply_info, sizeof(struct zxdh_msg_reply_info),<br />+                zxdh_msg_reply_info, ZXDH_ST_SZ_BYTES(msg_reply_info),<br />                 ZXDH_BAR_MODULE_MAC);<br />     if (ret) {<br />         PMD_DRV_LOG(ERR, "Failed to send msg: port 0x%x msg type %d",<br />                 hw->vport.vport, ZXDH_MAC_MODULE_EEPROM_READ);<br />         return -1;<br />     }<br />-    struct zxdh_msg_reply_body *ack_msg =<br />-             &(((struct zxdh_msg_reply_info *)rsp_data.recv_buffer)->reply_body);<br />-<br />+    void *reply_body_addr = ZXDH_ADDR_OF(msg_reply_info, zxdh_msg_reply_info, reply_body);<br />+    void *module_eeprom_msg_addr =<br />+            ZXDH_ADDR_OF(msg_reply_body, reply_body_addr, module_eeprom_msg);<br />+    void *agent_mac_module_eeprom_msg_data_addr =<br />+            ZXDH_ADDR_OF(agent_mac_module_eeprom_msg, module_eeprom_msg_addr, data);<br />+    uint8_t length = ZXDH_GET(agent_mac_module_eeprom_msg, module_eeprom_msg_addr, length);<br />     if (data)<br />-        memcpy(data, ack_msg->module_eeprom_msg.data, ack_msg->module_eeprom_msg.length);<br />+        memcpy(data, agent_mac_module_eeprom_msg_data_addr, length);<br />  <br />-    return ack_msg->module_eeprom_msg.length;<br />+    return length;<br /> }<br />  <br /> int<br />diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.h b/drivers/net/zxdh/zxdh_ethdev_ops.h<br />index a5162a6d6b..97a1eb4532 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev_ops.h<br />+++ b/drivers/net/zxdh/zxdh_ethdev_ops.h<br />@@ -62,6 +62,30 @@ struct zxdh_hw_np_stats {<br />     uint64_t tx_ssvpc_pkts;<br /> };<br />  <br />+struct zxdh_ifc_hw_np_stats_bits {<br />+    uint8_t rx_unicast_pkts[0x40];<br />+    uint8_t tx_unicast_pkts[0x40];<br />+    uint8_t rx_unicast_bytes[0x40];<br />+    uint8_t tx_unicast_bytes[0x40];<br />+    uint8_t rx_multicast_pkts[0x40];<br />+    uint8_t tx_multicast_pkts[0x40];<br />+    uint8_t rx_multicast_bytes[0x40];<br />+    uint8_t tx_multicast_bytes[0x40];<br />+    uint8_t rx_broadcast_pkts[0x40];<br />+    uint8_t tx_broadcast_pkts[0x40];<br />+    uint8_t rx_broadcast_bytes[0x40];<br />+    uint8_t tx_broadcast_bytes[0x40];<br />+    uint8_t rx_mtu_drop_pkts[0x40];<br />+    uint8_t tx_mtu_drop_pkts[0x40];<br />+    uint8_t rx_mtu_drop_bytes[0x40];<br />+    uint8_t tx_mtu_drop_bytes[0x40];<br />+    uint8_t rx_mtr_drop_pkts[0x40];<br />+    uint8_t tx_mtr_drop_pkts[0x40];<br />+    uint8_t rx_mtr_drop_bytes[0x40];<br />+    uint8_t tx_mtr_drop_bytes[0x40];<br />+    uint8_t tx_ssvpc_pkts[0x40];<br />+};<br />+<br /> struct zxdh_hw_vqm_stats {<br />     uint64_t rx_total;<br />     uint64_t tx_total;<br />@@ -72,6 +96,17 @@ struct zxdh_hw_vqm_stats {<br />     uint64_t rx_drop;<br /> };<br />  <br />+struct zxdh_ifc_hw_vqm_stats_bits {<br />+    uint8_t rx_total[0x40];<br />+    uint8_t tx_total[0x40];<br />+    uint8_t rx_bytes[0x40];<br />+    uint8_t tx_bytes[0x40];<br />+    uint8_t rx_error[0x40];<br />+    uint8_t tx_error[0x40];<br />+    uint8_t rx_drop[0x40];<br />+};<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);<br />diff --git a/drivers/net/zxdh/zxdh_msg.c b/drivers/net/zxdh/zxdh_msg.c<br />index f43f272cff..02ecd93b12 100644<br />--- a/drivers/net/zxdh/zxdh_msg.c<br />+++ b/drivers/net/zxdh/zxdh_msg.c<br />@@ -18,6 +18,7 @@<br /> #include "zxdh_pci.h" <br /> #include "zxdh_tables.h" <br /> #include "zxdh_np.h" <br />+#include "zxdh_common.h" <br />  <br /> #define ZXDH_REPS_INFO_FLAG_USABLE  0x00<br /> #define ZXDH_BAR_SEQID_NUM_MAX      256<br />@@ -695,7 +696,7 @@ static uint16_t<br /> zxdh_bar_chan_sync_msg_reps_get(uint64_t subchan_addr,<br />         uint64_t recv_buffer, uint16_t buffer_len)<br /> {<br />-    struct zxdh_bar_msg_header msg_header = {0};<br />+    struct zxdh_bar_msg_header msg_header;<br />     uint16_t msg_id = 0;<br />     uint16_t msg_len = 0;<br />  <br />@@ -987,7 +988,7 @@ zxdh_bar_chan_msg_header_check(struct zxdh_bar_msg_header *msg_header)<br /> int<br /> zxdh_bar_irq_recv(uint8_t src, uint8_t dst, uint64_t virt_addr, void *dev)<br /> {<br />-    struct zxdh_bar_msg_header msg_header = {0};<br />+    struct zxdh_bar_msg_header msg_header;<br />     uint64_t recv_addr = 0;<br />     uint64_t reps_addr = 0;<br />     uint16_t ret = 0;<br />@@ -1083,22 +1084,20 @@ zxdh_vf_send_msg_to_pf(struct rte_eth_dev *dev,  void *msg_req,<br /> {<br />     struct zxdh_hw *hw  = dev->data->dev_private;<br />     struct zxdh_msg_recviver_mem result = {0};<br />-    struct zxdh_msg_reply_info reply_info = {0};<br />+    uint8_t zxdh_msg_reply_info[ZXDH_ST_SZ_BYTES(msg_reply_info)] = {0};<br />     int ret = 0;<br />  <br />     if (reply) {<br />-        RTE_ASSERT(reply_len < sizeof(struct zxdh_msg_reply_info));<br />+        RTE_ASSERT(reply_len < ZXDH_ST_SZ_BYTES(msg_reply_info));<br />         result.recv_buffer  = reply;<br />         result.buffer_len = reply_len;<br />     } else {<br />-        result.recv_buffer = &reply_info;<br />-        result.buffer_len = sizeof(reply_info);<br />+        result.recv_buffer = zxdh_msg_reply_info;<br />+        result.buffer_len = ZXDH_ST_SZ_BYTES(msg_reply_info);<br />     }<br />  <br />-    struct zxdh_msg_reply_head *reply_head =<br />-                &(((struct zxdh_msg_reply_info *)result.recv_buffer)->reply_head);<br />-    struct zxdh_msg_reply_body *reply_body =<br />-                &(((struct zxdh_msg_reply_info *)result.recv_buffer)->reply_body);<br />+    void *reply_head_addr = ZXDH_ADDR_OF(msg_reply_info, result.recv_buffer, reply_head);<br />+    void *reply_body_addr = ZXDH_ADDR_OF(msg_reply_info, result.recv_buffer, reply_body);<br />  <br />     struct zxdh_pci_bar_msg in = {<br />         .virt_addr = (uint64_t)(hw->bar_addr[ZXDH_BAR0_INDEX] +<br />@@ -1118,12 +1117,16 @@ zxdh_vf_send_msg_to_pf(struct rte_eth_dev *dev,  void *msg_req,<br />             "vf[%d] send bar msg to pf failed.ret %d", hw->vport.vfid, ret);<br />         return -1;<br />     }<br />-    if (reply_head->flag != ZXDH_MSG_REPS_OK) {<br />+<br />+    uint8_t flag = ZXDH_GET(msg_reply_head, reply_head_addr, flag);<br />+    uint16_t reps_len = ZXDH_GET(msg_reply_head, reply_head_addr, reps_len);<br />+    if (flag != ZXDH_MSG_REPS_OK) {<br />         PMD_MSG_LOG(ERR, "vf[%d] get pf reply failed: reply_head flag : 0x%x(0xff is OK).replylen %d",<br />-                hw->vport.vfid, reply_head->flag, reply_head->reps_len);<br />+                hw->vport.vfid, flag, reps_len);<br />         return -1;<br />     }<br />-    if (reply_body->flag != ZXDH_REPS_SUCC) {<br />+    uint8_t reply_body_flag = ZXDH_GET(msg_reply_body, reply_body_addr, flag);<br />+    if (reply_body_flag != ZXDH_REPS_SUCC) {<br />         PMD_MSG_LOG(ERR, "vf[%d] msg processing failed", hw->vfid);<br />         return -1;<br />     }<br />@@ -1137,23 +1140,19 @@ zxdh_send_msg_to_riscv(struct rte_eth_dev *dev, void *msg_req,<br /> {<br />     struct zxdh_hw *hw = dev->data->dev_private;<br />     struct zxdh_msg_recviver_mem result = {0};<br />-    struct zxdh_msg_reply_info reply_info = {0};<br />+    uint8_t zxdh_msg_reply_info[ZXDH_ST_SZ_BYTES(msg_reply_info)] = {0};<br />  <br />     if (reply) {<br />-        RTE_ASSERT(reply_len < sizeof(struct zxdh_msg_reply_info));<br />+        RTE_ASSERT(reply_len < ZXDH_ST_SZ_BYTES(msg_reply_info));<br />         result.recv_buffer  = reply;<br />         result.buffer_len = reply_len;<br />     } else {<br />-        result.recv_buffer = &reply_info;<br />-        result.buffer_len = sizeof(reply_info);<br />+        result.recv_buffer = zxdh_msg_reply_info;<br />+        result.buffer_len = ZXDH_ST_SZ_BYTES(msg_reply_info);<br />     }<br />-    struct zxdh_msg_reply_head *reply_head =<br />-                &(((struct zxdh_msg_reply_info *)result.recv_buffer)->reply_head);<br />-    struct zxdh_msg_reply_body *reply_body =<br />-                &(((struct zxdh_msg_reply_info *)result.recv_buffer)->reply_body);<br />  <br />     struct zxdh_pci_bar_msg in = {<br />-        .payload_addr = &msg_req,<br />+        .payload_addr = msg_req,<br />         .payload_len = msg_req_len,<br />         .virt_addr = (uint64_t)(hw->bar_addr[ZXDH_BAR0_INDEX] + ZXDH_CTRLCH_OFFSET),<br />         .src = hw->is_pf ? ZXDH_MSG_CHAN_END_PF : ZXDH_MSG_CHAN_END_VF,<br />@@ -1166,15 +1165,6 @@ zxdh_send_msg_to_riscv(struct rte_eth_dev *dev, void *msg_req,<br />         PMD_MSG_LOG(ERR, "Failed to send sync messages or receive response");<br />         return -1;<br />     }<br />-    if (reply_head->flag != ZXDH_MSG_REPS_OK) {<br />-        PMD_MSG_LOG(ERR, "vf[%d] get pf reply failed: reply_head flag : 0x%x(0xff is OK).replylen %d",<br />-                hw->vport.vfid, reply_head->flag, reply_head->reps_len);<br />-        return -1;<br />-    }<br />-    if (reply_body->flag != ZXDH_REPS_SUCC) {<br />-        PMD_MSG_LOG(ERR, "vf[%d] msg processing failed", hw->vfid);<br />-        return -1;<br />-    }<br />  <br />     return 0;<br /> }<br />@@ -1245,7 +1235,7 @@ zxdh_vf_promisc_uninit(struct zxdh_hw *hw, union zxdh_virport_num vport)<br />  <br /> static int<br /> zxdh_vf_port_init(struct zxdh_hw *pf_hw, uint16_t vport, void *cfg_data,<br />-        struct zxdh_msg_reply_body *res_info, uint16_t *res_len)<br />+        void *res_info, uint16_t *res_len)<br /> {<br />     struct zxdh_port_attr_table port_attr = {0};<br />     union zxdh_virport_num port = {.vport = vport};<br />@@ -1275,14 +1265,13 @@ zxdh_vf_port_init(struct zxdh_hw *pf_hw, uint16_t vport, void *cfg_data,<br />         PMD_DRV_LOG(ERR, "vf_promisc_table_init failed, code:%d", ret);<br />         goto proc_end;<br />     }<br />-<br />-    res_info->flag = ZXDH_REPS_SUCC;<br />-    *res_len = sizeof(res_info->flag);<br />+    ZXDH_SET(msg_reply_body, res_info, flag, ZXDH_REPS_SUCC);<br />+    *res_len = sizeof(uint8_t);<br />  <br />     return ret;<br /> proc_end:<br />-    *res_len = sizeof(res_info->flag);<br />-    res_info->flag = ZXDH_REPS_FAIL;<br />+    *res_len = sizeof(uint8_t);<br />+    ZXDH_SET(msg_reply_body, res_info, flag, ZXDH_REPS_FAIL);<br />     return ret;<br /> }<br />  <br />@@ -1311,11 +1300,12 @@ zxdh_mac_clear(struct zxdh_hw *hw, union zxdh_virport_num vport)<br /> static int<br /> zxdh_vf_port_uninit(struct zxdh_hw *pf_hw,<br />         uint16_t vport, void *cfg_data __rte_unused,<br />-        struct zxdh_msg_reply_body *res_info, uint16_t *res_len)<br />+        void *res_info, uint16_t *res_len)<br /> {<br />     char str[ZXDH_MSG_REPLY_BODY_MAX_LEN] = "uninit";<br />     struct zxdh_port_attr_table port_attr = {0};<br />     union zxdh_virport_num vport_num = {.vport = vport};<br />+    void *reply_data_addr = ZXDH_ADDR_OF(msg_reply_body, res_info, reply_data);<br />     int ret = 0;<br />  <br />     *res_len =  ZXDH_MSG_REPLYBODY_HEAD;<br />@@ -1340,20 +1330,20 @@ zxdh_vf_port_uninit(struct zxdh_hw *pf_hw,<br />     }<br />  <br />     *res_len += strlen(str);<br />-    rte_memcpy(&res_info->reply_data, str, strlen(str) + 1);<br />-    res_info->flag = ZXDH_REPS_SUCC;<br />+    rte_memcpy(reply_data_addr, str, strlen(str) + 1);<br />+    ZXDH_SET(msg_reply_body, res_info, flag, ZXDH_REPS_SUCC);<br />     return ret;<br />  <br /> proc_end:<br />     *res_len += strlen(str);<br />-    rte_memcpy(&res_info->reply_data, str, strlen(str) + 1);<br />-    res_info->flag = ZXDH_REPS_FAIL;<br />+    rte_memcpy(reply_data_addr, str, strlen(str) + 1);<br />+    ZXDH_SET(msg_reply_body, res_info, flag, ZXDH_REPS_FAIL);<br />     return ret;<br /> }<br />  <br /> static int<br /> zxdh_add_vf_mac_table(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />-        struct zxdh_msg_reply_body *reply_body, uint16_t *reply_len)<br />+        void *reply_body, uint16_t *reply_len)<br /> {<br />     char str[ZXDH_MSG_REPLY_BODY_MAX_LEN] = "add mac";<br />     union zxdh_virport_num port = {0};<br />@@ -1362,6 +1352,8 @@ zxdh_add_vf_mac_table(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />     int i = 0, ret = 0;<br />     uint16_t vf_id = port.vfid;<br />     port.vport = vport;<br />+    void *reply_data_addr = ZXDH_ADDR_OF(msg_reply_body, reply_body, reply_data);<br />+    void *mac_reply_msg_addr = ZXDH_ADDR_OF(msg_reply_body, reply_body, mac_reply_msg);<br />  <br />     for (i = 0; i < ZXDH_MAX_MAC_ADDRS; i++)<br />         if (rte_is_same_ether_addr(&hw->vfinfo[vf_id].vf_mac[i], addr))<br />@@ -1369,7 +1361,7 @@ zxdh_add_vf_mac_table(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />  <br />     ret = zxdh_add_mac_table(hw, vport, addr, hw->hash_search_index, 0, 0);<br />     if (ret == -EADDRINUSE) {<br />-        reply_body->mac_reply_msg.mac_flag = ZXDH_EEXIST_MAC_FLAG;<br />+        ZXDH_SET(mac_reply_msg, mac_reply_msg_addr, mac_flag, ZXDH_EEXIST_MAC_FLAG);<br />         PMD_DRV_LOG(ERR, "vf vport 0x%x set mac ret 0x%x failed. mac is in used.",<br />                 port.vport, ret);<br />         goto failure;<br />@@ -1389,26 +1381,27 @@ zxdh_add_vf_mac_table(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br /> success:<br />     sprintf(str, " vport 0x%x set mac ret 0x%x\n", port.vport, ret);<br />     *reply_len =  strlen(str) + ZXDH_MSG_REPLYBODY_HEAD;<br />-    rte_memcpy(&reply_body->reply_data, str, strlen(str) + 1);<br />-    reply_body->flag = ZXDH_REPS_SUCC;<br />+    rte_memcpy(reply_data_addr, str, strlen(str) + 1);<br />+    ZXDH_SET(msg_reply_body, reply_body, flag, ZXDH_REPS_SUCC);<br />     PMD_DRV_LOG(DEBUG, " reply len %d", *reply_len);<br />     return ret;<br />  <br /> failure:<br />     *reply_len = strlen(str) + ZXDH_MSG_REPLYBODY_HEAD;<br />-    reply_body->flag = ZXDH_REPS_FAIL;<br />+    ZXDH_SET(msg_reply_body, reply_body, flag, ZXDH_REPS_FAIL);<br />     return ret;<br /> }<br />  <br /> static int<br /> zxdh_del_vf_mac_table(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />-    struct zxdh_msg_reply_body *res_info, uint16_t *res_len)<br />+    void *res_info, uint16_t *res_len)<br /> {<br />     int ret, i = 0;<br />     struct zxdh_mac_filter *mac_filter = (struct zxdh_mac_filter *)cfg_data;<br />     union zxdh_virport_num  port = (union zxdh_virport_num)vport;<br />     char str[ZXDH_MSG_REPLY_BODY_MAX_LEN] = "del mac";<br />     uint16_t  vf_id = port.vfid;<br />+    void *reply_data_addr = ZXDH_ADDR_OF(msg_reply_body, res_info, reply_data);<br />  <br />     PMD_DRV_LOG(DEBUG, "[PF GET MSG FROM VF]--vf mac to del.");<br />     ret = zxdh_del_mac_table(hw, vport, &mac_filter->mac, hw->hash_search_index, 0, 0);<br />@@ -1428,19 +1421,19 @@ zxdh_del_vf_mac_table(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />  <br />     sprintf(str, "vport 0x%x del mac ret 0x%x\n", port.vport, ret);<br />     *res_len =  strlen(str) + ZXDH_MSG_REPLYBODY_HEAD;<br />-    rte_memcpy(&res_info->reply_data, str, strlen(str) + 1);<br />-    res_info->flag = ZXDH_REPS_SUCC;<br />+    rte_memcpy(reply_data_addr, str, strlen(str) + 1);<br />+    ZXDH_SET(msg_reply_body, res_info, flag, ZXDH_REPS_SUCC);<br />     return ret;<br />  <br /> proc_end:<br />     *res_len = strlen(str) + ZXDH_MSG_REPLYBODY_HEAD;<br />-    res_info->flag = ZXDH_REPS_FAIL;<br />+    ZXDH_SET(msg_reply_body, res_info, flag, ZXDH_REPS_FAIL);<br />     return ret;<br /> }<br />  <br /> static int<br /> zxdh_vf_promisc_set(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />-        struct zxdh_msg_reply_body *reply, uint16_t *res_len)<br />+        void *reply, uint16_t *res_len)<br /> {<br />     struct zxdh_port_promisc_msg *promisc_msg = (struct zxdh_port_promisc_msg *)cfg_data;<br />     int ret = 0;<br />@@ -1458,24 +1451,25 @@ zxdh_vf_promisc_set(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />         goto proc_end;<br />     }<br />  <br />-    *res_len = sizeof(struct zxdh_port_attr_set_msg) + sizeof(enum zxdh_reps_flag);<br />-    reply->flag = ZXDH_REPS_SUCC;<br />+    *res_len = sizeof(struct zxdh_port_attr_set_msg) + sizeof(uint8_t);<br />+    ZXDH_SET(msg_reply_body, reply, flag, ZXDH_REPS_SUCC);<br />  <br />     return ret;<br />  <br /> proc_end:<br />-    *res_len = sizeof(struct zxdh_port_attr_set_msg) + sizeof(enum zxdh_reps_flag);<br />-    reply->flag = ZXDH_REPS_FAIL;<br />+    *res_len = sizeof(struct zxdh_port_attr_set_msg) + sizeof(uint8_t);<br />+    ZXDH_SET(msg_reply_body, reply, flag, ZXDH_REPS_FAIL);<br />     return ret;<br /> }<br />  <br /> static int<br /> zxdh_vf_vlan_filter_table_process(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />-        struct zxdh_msg_reply_body *res_info, uint16_t *res_len, uint8_t enable)<br />+        void *res_info, uint16_t *res_len, uint8_t enable)<br /> {<br />     struct zxdh_vlan_filter *vlan_filter = cfg_data;<br />     uint16_t vlan_id =  vlan_filter->vlan_id;<br />     char str[ZXDH_MSG_REPLY_BODY_MAX_LEN] = "vlan filter table";<br />+    void *reply_data_addr = ZXDH_ADDR_OF(msg_reply_body, res_info, reply_data);<br />     int ret = 0;<br />  <br />     ret = zxdh_vlan_filter_table_set(hw, vport, vlan_id, enable);<br />@@ -1483,33 +1477,38 @@ zxdh_vf_vlan_filter_table_process(struct zxdh_hw *hw, uint16_t vport, void *cfg_<br />         sprintf(str, "vlan filter op-code[%d] vlan id:%d failed, code:%d\n",<br />             enable, vlan_id, ret);<br />  <br />-    *res_len = strlen(str) + sizeof(enum zxdh_reps_flag);<br />-    memcpy(&res_info->reply_data, str, strlen(str) + 1);<br />-    res_info->flag = (ret == 0) ? ZXDH_REPS_SUCC : ZXDH_REPS_FAIL;<br />+    *res_len = strlen(str) + sizeof(uint8_t);<br />+<br />+    memcpy(reply_data_addr, str, strlen(str) + 1);<br />+    if (ret == 0)<br />+        ZXDH_SET(msg_reply_body, res_info, flag, ZXDH_REPS_SUCC);<br />+    else<br />+        ZXDH_SET(msg_reply_body, res_info, flag, ZXDH_REPS_FAIL);<br />     return ret;<br /> }<br />  <br /> static int<br /> zxdh_vf_vlan_filter_table_add(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />-        struct zxdh_msg_reply_body *res_info, uint16_t *res_len)<br />+        void *res_info, uint16_t *res_len)<br /> {<br />     return zxdh_vf_vlan_filter_table_process(hw, vport, cfg_data, res_info, res_len, 1);<br /> }<br />  <br /> static int<br /> zxdh_vf_vlan_filter_table_del(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />-        struct zxdh_msg_reply_body *res_info, uint16_t *res_len)<br />+        void *res_info, uint16_t *res_len)<br /> {<br />     return zxdh_vf_vlan_filter_table_process(hw, vport, cfg_data, res_info, res_len, 0);<br /> }<br />  <br /> static int<br /> zxdh_vf_set_vlan_filter(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />-        struct zxdh_msg_reply_body *reply, uint16_t *res_len)<br />+        void *reply, uint16_t *res_len)<br /> {<br />     struct zxdh_vlan_filter_set *vlan_filter = cfg_data;<br />     union zxdh_virport_num port = (union zxdh_virport_num)vport;<br />     char str[ZXDH_MSG_REPLY_BODY_MAX_LEN] = "vlan filter";<br />+    void *reply_data_addr = ZXDH_ADDR_OF(msg_reply_body, reply, reply_data);<br />     int ret = 0;<br />     uint16_t vfid = port.vfid;<br />  <br />@@ -1517,19 +1516,23 @@ zxdh_vf_set_vlan_filter(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />     if (ret)<br />         sprintf(str, "[vfid:%d] vlan filter. set failed, ret:%d\n", vfid, ret);<br />  <br />-    *res_len = strlen(str) + sizeof(enum zxdh_reps_flag);<br />-    reply->flag = (ret == 0) ? ZXDH_REPS_SUCC : ZXDH_REPS_FAIL;<br />-    memcpy(&reply->reply_data, str, strlen(str) + 1);<br />+    *res_len = strlen(str) + sizeof(uint8_t);<br />+    if (ret == 0)<br />+        ZXDH_SET(msg_reply_body, reply, flag, ZXDH_REPS_SUCC);<br />+    else<br />+        ZXDH_SET(msg_reply_body, reply, flag, ZXDH_REPS_FAIL);<br />+    memcpy(reply_data_addr, str, strlen(str) + 1);<br />     return ret;<br /> }<br />  <br /> static int<br /> zxdh_vf_set_vlan_offload(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />-        struct zxdh_msg_reply_body *reply, uint16_t *res_len)<br />+        void *reply, uint16_t *res_len)<br /> {<br />     struct zxdh_vlan_offload *vlan_offload = cfg_data;<br />     union zxdh_virport_num port = (union zxdh_virport_num)vport;<br />     char str[ZXDH_MSG_REPLY_BODY_MAX_LEN] = "vlan offload";<br />+    void *reply_data_addr = ZXDH_ADDR_OF(msg_reply_body, reply, reply_data);<br />     int ret = 0;<br />     uint16_t vfid = port.vfid;<br />  <br />@@ -1540,18 +1543,23 @@ zxdh_vf_set_vlan_offload(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />     if (ret)<br />         sprintf(str, "[vfid:%d] vlan offload set failed, ret:%d\n", vfid, ret);<br />  <br />-    *res_len = strlen(str) + sizeof(enum zxdh_reps_flag);<br />-    reply->flag = (ret == 0) ? ZXDH_REPS_SUCC : ZXDH_REPS_FAIL;<br />-    memcpy(&reply->reply_data, str, strlen(str) + 1);<br />+    *res_len = strlen(str) + sizeof(uint8_t);<br />+    if (ret == 0)<br />+        ZXDH_SET(msg_reply_body, reply, flag, ZXDH_REPS_SUCC);<br />+    else<br />+        ZXDH_SET(msg_reply_body, reply, flag, ZXDH_REPS_FAIL);<br />+    memcpy(reply_data_addr, str, strlen(str) + 1);<br />     return ret;<br /> }<br />  <br /> static int<br /> zxdh_vf_rss_hf_get(struct zxdh_hw *hw, uint16_t vport, void *cfg_data __rte_unused,<br />-            struct zxdh_msg_reply_body *reply, uint16_t *res_len)<br />+            void *reply, uint16_t *res_len)<br /> {<br />     char str[ZXDH_MSG_REPLY_BODY_MAX_LEN] = "rss_hf";<br />     struct zxdh_port_attr_table vport_att = {0};<br />+    void *reply_data_addr = ZXDH_ADDR_OF(msg_reply_body, reply, reply_data);<br />+    void *rss_hf_msg_addr = ZXDH_ADDR_OF(msg_reply_body, reply, rss_hf_msg);<br />     int ret = 0;<br />  <br />     ret = zxdh_get_port_attr(hw, vport, &vport_att);<br />@@ -1561,22 +1569,26 @@ zxdh_vf_rss_hf_get(struct zxdh_hw *hw, uint16_t vport, void *cfg_data __rte_unus<br />         goto proc_end;<br />     }<br />  <br />-    reply->rss_hf.rss_hf = vport_att.rss_hash_factor;<br />+    ZXDH_SET(rss_hf, rss_hf_msg_addr, rss_hf, vport_att.rss_hash_factor);<br />  <br /> proc_end:<br />-    *res_len = strlen(str) + sizeof(enum zxdh_reps_flag);<br />-    reply->flag = (ret == 0) ? ZXDH_REPS_SUCC : ZXDH_REPS_FAIL;<br />-    memcpy(&reply->reply_data, str, strlen(str) + 1);<br />+    *res_len = strlen(str) + sizeof(uint8_t);<br />+    if (ret == 0)<br />+        ZXDH_SET(msg_reply_body, reply, flag, ZXDH_REPS_SUCC);<br />+    else<br />+        ZXDH_SET(msg_reply_body, reply, flag, ZXDH_REPS_FAIL);<br />+    memcpy(reply_data_addr, str, strlen(str) + 1);<br />     return ret;<br /> }<br />  <br /> static int<br /> zxdh_vf_rss_hf_set(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />-            struct zxdh_msg_reply_body *reply, uint16_t *res_len)<br />+            void *reply, uint16_t *res_len)<br /> {<br />     char str[ZXDH_MSG_REPLY_BODY_MAX_LEN] = "rss_hf";<br />     struct zxdh_rss_hf *rss_hf = cfg_data;<br />     struct zxdh_port_attr_table vport_att = {0};<br />+    void *reply_data_addr = ZXDH_ADDR_OF(msg_reply_body, reply, reply_data);<br />     int ret = 0;<br />  <br />     ret = zxdh_get_port_attr(hw, vport, &vport_att);<br />@@ -1596,19 +1608,23 @@ zxdh_vf_rss_hf_set(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />     }<br />  <br /> proc_end:<br />-    *res_len = strlen(str) + sizeof(enum zxdh_reps_flag);<br />-    reply->flag = (ret == 0) ? ZXDH_REPS_SUCC : ZXDH_REPS_FAIL;<br />-    memcpy(&reply->reply_data, str, strlen(str) + 1);<br />+    *res_len = strlen(str) + sizeof(uint8_t);<br />+    if (ret == 0)<br />+        ZXDH_SET(msg_reply_body, reply, flag, ZXDH_REPS_SUCC);<br />+    else<br />+        ZXDH_SET(msg_reply_body, reply, flag, ZXDH_REPS_FAIL);<br />+    memcpy(reply_data_addr, str, strlen(str) + 1);<br />     return ret;<br /> }<br />  <br /> static int<br /> zxdh_vf_rss_enable(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />-            struct zxdh_msg_reply_body *reply, uint16_t *res_len)<br />+            void *reply, uint16_t *res_len)<br /> {<br />     char str[ZXDH_MSG_REPLY_BODY_MAX_LEN] = "rss_enable";<br />     struct zxdh_rss_enable *rss_enable = cfg_data;<br />     struct zxdh_port_attr_table vport_att = {0};<br />+    void *reply_data_addr = ZXDH_ADDR_OF(msg_reply_body, reply, reply_data);<br />     int ret = 0;<br />  <br />     ret = zxdh_get_port_attr(hw, vport, &vport_att);<br />@@ -1628,51 +1644,63 @@ zxdh_vf_rss_enable(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />     }<br />  <br /> proc_end:<br />-    *res_len = strlen(str) + sizeof(enum zxdh_reps_flag);<br />-    reply->flag = (ret == 0) ? ZXDH_REPS_SUCC : ZXDH_REPS_FAIL;<br />-    memcpy(&reply->reply_data, str, strlen(str) + 1);<br />+    *res_len = strlen(str) + sizeof(uint8_t);<br />+    if (ret == 0)<br />+        ZXDH_SET(msg_reply_body, reply, flag, ZXDH_REPS_SUCC);<br />+    else<br />+        ZXDH_SET(msg_reply_body, reply, flag, ZXDH_REPS_FAIL);<br />+    memcpy(reply_data_addr, str, strlen(str) + 1);<br />     return ret;<br /> }<br />  <br /> static int<br /> zxdh_vf_rss_table_set(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />-        struct zxdh_msg_reply_body *reply, uint16_t *res_len)<br />+        void *reply, uint16_t *res_len)<br /> {<br />     char str[ZXDH_MSG_REPLY_BODY_MAX_LEN] = "rss_table";<br />     struct zxdh_rss_reta *rss_reta = cfg_data;<br />+    void *reply_data_addr = ZXDH_ADDR_OF(msg_reply_body, reply, reply_data);<br />     int32_t ret = 0;<br />  <br />     ret = zxdh_rss_table_set(hw, vport, rss_reta);<br />     if (ret)<br />         sprintf(str, "set rss reta tbl failed, code:%d", ret);<br />  <br />-    *res_len = strlen(str) + sizeof(enum zxdh_reps_flag);<br />-    reply->flag = (ret == 0) ? ZXDH_REPS_SUCC : ZXDH_REPS_FAIL;<br />-    memcpy(&reply->reply_data, str, strlen(str) + 1);<br />+    *res_len = strlen(str) + sizeof(uint8_t);<br />+    if (ret == 0)<br />+        ZXDH_SET(msg_reply_body, reply, flag, ZXDH_REPS_SUCC);<br />+    else<br />+        ZXDH_SET(msg_reply_body, reply, flag, ZXDH_REPS_FAIL);<br />+    memcpy(reply_data_addr, str, strlen(str) + 1);<br />     return ret;<br /> }<br />  <br /> static int<br /> zxdh_vf_rss_table_get(struct zxdh_hw *hw, uint16_t vport, void *cfg_data __rte_unused,<br />-        struct zxdh_msg_reply_body *reply, uint16_t *res_len)<br />+        void *reply, uint16_t *res_len)<br /> {<br />     char str[ZXDH_MSG_REPLY_BODY_MAX_LEN] = "rss_table";<br />-    struct zxdh_rss_reta *rss_reta = &reply->rss_reta;<br />+    void *rss_reta_msg_addr = ZXDH_ADDR_OF(msg_reply_body, reply, rss_reta_msg);<br />+    struct zxdh_rss_reta *rss_reta = (struct zxdh_rss_reta *)rss_reta_msg_addr;<br />+    void *reply_data_addr = ZXDH_ADDR_OF(msg_reply_body, reply, reply_data);<br />     int ret = 0;<br />  <br />     ret = zxdh_rss_table_get(hw, vport, rss_reta);<br />     if (ret)<br />         sprintf(str, "set rss reta tbl failed, code:%d", ret);<br />  <br />-    *res_len = strlen(str) + sizeof(enum zxdh_reps_flag);<br />-    reply->flag = (ret == 0) ? ZXDH_REPS_SUCC : ZXDH_REPS_FAIL;<br />-    memcpy(&reply->reply_data, str, strlen(str) + 1);<br />+    *res_len = strlen(str) + sizeof(uint8_t);<br />+    if (ret == 0)<br />+        ZXDH_SET(msg_reply_body, reply, flag, ZXDH_REPS_SUCC);<br />+    else<br />+        ZXDH_SET(msg_reply_body, reply, flag, ZXDH_REPS_FAIL);<br />+    memcpy(reply_data_addr, str, strlen(str) + 1);<br />     return ret;<br /> }<br />  <br /> static int<br /> zxdh_vf_port_attr_set(struct zxdh_hw *pf_hw, uint16_t vport, void *cfg_data,<br />-    struct zxdh_msg_reply_body *res_info, uint16_t *res_len)<br />+    void *res_info, uint16_t *res_len)<br /> {<br />     RTE_ASSERT(!cfg_data || !pf_hw);<br />     if (res_info)<br />@@ -1734,7 +1762,7 @@ zxdh_vf_port_attr_set(struct zxdh_hw *pf_hw, uint16_t vport, void *cfg_data,<br />  <br /> static int<br /> zxdh_vf_np_stats_update(struct zxdh_hw *pf_hw, uint16_t vport,<br />-        void *cfg_data, struct zxdh_msg_reply_body *res_info,<br />+        void *cfg_data, void *res_info,<br />         uint16_t *res_len)<br /> {<br />     struct zxdh_np_stats_updata_msg *np_stats_query =<br />@@ -1745,6 +1773,47 @@ zxdh_vf_np_stats_update(struct zxdh_hw *pf_hw, uint16_t vport,<br />     uint32_t idx = 0;<br />     int ret = 0;<br />  <br />+    void *hw_stats_addr = ZXDH_ADDR_OF(msg_reply_body, res_info, hw_stats);<br />+    void *tx_unicast_pkts_addr =<br />+        ZXDH_ADDR_OF(hw_np_stats, hw_stats_addr, tx_unicast_pkts);<br />+    void *rx_unicast_pkts_addr =<br />+        ZXDH_ADDR_OF(hw_np_stats, hw_stats_addr, rx_unicast_pkts);<br />+    void *tx_unicast_bytes_addr =<br />+        ZXDH_ADDR_OF(hw_np_stats, hw_stats_addr, tx_unicast_bytes);<br />+    void *rx_unicast_bytes_addr =<br />+        ZXDH_ADDR_OF(hw_np_stats, hw_stats_addr, rx_unicast_bytes);<br />+    void *tx_multicast_pkts_addr =<br />+        ZXDH_ADDR_OF(hw_np_stats, hw_stats_addr, tx_multicast_pkts);<br />+    void *rx_multicast_pkts_addr =<br />+        ZXDH_ADDR_OF(hw_np_stats, hw_stats_addr, rx_multicast_pkts);<br />+    void *tx_multicast_bytes_addr =<br />+        ZXDH_ADDR_OF(hw_np_stats, hw_stats_addr, tx_multicast_bytes);<br />+    void *rx_multicast_bytes_addr =<br />+        ZXDH_ADDR_OF(hw_np_stats, hw_stats_addr, rx_multicast_bytes);<br />+    void *tx_broadcast_pkts_addr =<br />+        ZXDH_ADDR_OF(hw_np_stats, hw_stats_addr, tx_broadcast_pkts);<br />+    void *tx_broadcast_bytes_addr =<br />+        ZXDH_ADDR_OF(hw_np_stats, hw_stats_addr, tx_broadcast_bytes);<br />+    void *rx_broadcast_pkts_addr =<br />+        ZXDH_ADDR_OF(hw_np_stats, hw_stats_addr, rx_broadcast_pkts);<br />+    void *rx_broadcast_bytes_addr =<br />+        ZXDH_ADDR_OF(hw_np_stats, hw_stats_addr, rx_broadcast_bytes);<br />+    void *tx_mtu_drop_pkts_addr =<br />+        ZXDH_ADDR_OF(hw_np_stats, hw_stats_addr, tx_mtu_drop_pkts);<br />+    void *tx_mtu_drop_bytes_addr =<br />+        ZXDH_ADDR_OF(hw_np_stats, hw_stats_addr, tx_mtu_drop_bytes);<br />+    void *rx_mtu_drop_pkts_addr =<br />+        ZXDH_ADDR_OF(hw_np_stats, hw_stats_addr, rx_mtu_drop_pkts);<br />+    void *rx_mtu_drop_bytes_addr =<br />+        ZXDH_ADDR_OF(hw_np_stats, hw_stats_addr, rx_mtu_drop_bytes);<br />+    void *tx_mtr_drop_pkts_addr =<br />+        ZXDH_ADDR_OF(hw_np_stats, hw_stats_addr, tx_mtr_drop_pkts);<br />+    void *tx_mtr_drop_bytes_addr =<br />+        ZXDH_ADDR_OF(hw_np_stats, hw_stats_addr, tx_mtr_drop_bytes);<br />+    void *rx_mtr_drop_pkts_addr =<br />+        ZXDH_ADDR_OF(hw_np_stats, hw_stats_addr, rx_mtr_drop_pkts);<br />+    void *rx_mtr_drop_bytes_addr =<br />+        ZXDH_ADDR_OF(hw_np_stats, hw_stats_addr, rx_mtr_drop_bytes);<br />     if (!res_len || !res_info) {<br />         PMD_DRV_LOG(ERR, "get stat invalid inparams");<br />         return -1;<br />@@ -1760,8 +1829,8 @@ zxdh_vf_np_stats_update(struct zxdh_hw *pf_hw, uint16_t vport,<br />         PMD_DRV_LOG(ERR, "get stats failed. code:%d", ret);<br />         return ret;<br />     }<br />-    zxdh_data_hi_to_lo(&res_info->np_stats.tx_unicast_pkts);<br />-    zxdh_data_hi_to_lo(&res_info->np_stats.tx_unicast_bytes);<br />+    zxdh_data_hi_to_lo(tx_unicast_pkts_addr);<br />+    zxdh_data_hi_to_lo(tx_unicast_bytes_addr);<br />  <br />     idx = zxdh_vport_to_vfid(vport_num) + ZXDH_UNICAST_STATS_INGRESS_BASE;<br />     memset(&stats_data, 0, sizeof(stats_data));<br />@@ -1771,8 +1840,8 @@ zxdh_vf_np_stats_update(struct zxdh_hw *pf_hw, uint16_t vport,<br />         PMD_DRV_LOG(ERR, "get stats failed. code:%d", ret);<br />         return ret;<br />     }<br />-    zxdh_data_hi_to_lo(&res_info->np_stats.rx_unicast_pkts);<br />-    zxdh_data_hi_to_lo(&res_info->np_stats.rx_unicast_bytes);<br />+    zxdh_data_hi_to_lo(rx_unicast_pkts_addr);<br />+    zxdh_data_hi_to_lo(rx_unicast_bytes_addr);<br />  <br />     idx = zxdh_vport_to_vfid(vport_num) + ZXDH_MULTICAST_STATS_EGRESS_BASE;<br />     ret = zxdh_np_dtb_stats_get(pf_hw->dev_id, pf_hw->dev_sd->dtb_sd.queueid,<br />@@ -1781,8 +1850,8 @@ zxdh_vf_np_stats_update(struct zxdh_hw *pf_hw, uint16_t vport,<br />         PMD_DRV_LOG(ERR, "get stats failed. code:%d", ret);<br />         return ret;<br />     }<br />-    zxdh_data_hi_to_lo(&res_info->np_stats.tx_multicast_pkts);<br />-    zxdh_data_hi_to_lo(&res_info->np_stats.tx_multicast_bytes);<br />+    zxdh_data_hi_to_lo(tx_multicast_pkts_addr);<br />+    zxdh_data_hi_to_lo(tx_multicast_bytes_addr);<br />  <br />     idx = zxdh_vport_to_vfid(vport_num) + ZXDH_MULTICAST_STATS_INGRESS_BASE;<br />     memset(&stats_data, 0, sizeof(stats_data));<br />@@ -1792,8 +1861,8 @@ zxdh_vf_np_stats_update(struct zxdh_hw *pf_hw, uint16_t vport,<br />         PMD_DRV_LOG(ERR, "get stats failed. code:%d", ret);<br />         return ret;<br />     }<br />-    zxdh_data_hi_to_lo(&res_info->np_stats.rx_multicast_pkts);<br />-    zxdh_data_hi_to_lo(&res_info->np_stats.rx_multicast_bytes);<br />+    zxdh_data_hi_to_lo(rx_multicast_pkts_addr);<br />+    zxdh_data_hi_to_lo(rx_multicast_bytes_addr);<br />  <br />     idx = zxdh_vport_to_vfid(vport_num) + ZXDH_BROAD_STATS_EGRESS_BASE;<br />     ret = zxdh_np_dtb_stats_get(pf_hw->dev_id, pf_hw->dev_sd->dtb_sd.queueid,<br />@@ -1802,8 +1871,8 @@ zxdh_vf_np_stats_update(struct zxdh_hw *pf_hw, uint16_t vport,<br />         PMD_DRV_LOG(ERR, "get stats failed. code:%d", ret);<br />         return ret;<br />     }<br />-    zxdh_data_hi_to_lo(&res_info->np_stats.tx_broadcast_pkts);<br />-    zxdh_data_hi_to_lo(&res_info->np_stats.tx_broadcast_bytes);<br />+    zxdh_data_hi_to_lo(tx_broadcast_pkts_addr);<br />+    zxdh_data_hi_to_lo(tx_broadcast_bytes_addr);<br />  <br />     idx = zxdh_vport_to_vfid(vport_num) + ZXDH_BROAD_STATS_INGRESS_BASE;<br />     memset(&stats_data, 0, sizeof(stats_data));<br />@@ -1813,8 +1882,8 @@ zxdh_vf_np_stats_update(struct zxdh_hw *pf_hw, uint16_t vport,<br />         PMD_DRV_LOG(ERR, "get stats failed. code:%d", ret);<br />         return ret;<br />     }<br />-    zxdh_data_hi_to_lo(&res_info->np_stats.rx_broadcast_pkts);<br />-    zxdh_data_hi_to_lo(&res_info->np_stats.rx_broadcast_bytes);<br />+    zxdh_data_hi_to_lo(rx_broadcast_pkts_addr);<br />+    zxdh_data_hi_to_lo(rx_broadcast_bytes_addr);<br />  <br />     idx = zxdh_vport_to_vfid(vport_num) + ZXDH_MTU_STATS_EGRESS_BASE;<br />     memset(&stats_data, 0, sizeof(stats_data));<br />@@ -1824,10 +1893,10 @@ zxdh_vf_np_stats_update(struct zxdh_hw *pf_hw, uint16_t vport,<br />         PMD_DRV_LOG(ERR, "get stats failed. code:%d", ret);<br />         return ret;<br />     }<br />-    res_info->np_stats.tx_mtu_drop_pkts = stats_data.n_pkts_dropped;<br />-    res_info->np_stats.tx_mtu_drop_bytes = stats_data.n_bytes_dropped;<br />-    zxdh_data_hi_to_lo(&res_info->np_stats.tx_mtu_drop_pkts);<br />-    zxdh_data_hi_to_lo(&res_info->np_stats.tx_mtu_drop_bytes);<br />+    ZXDH_SET(hw_np_stats, hw_stats_addr, tx_mtu_drop_pkts, stats_data.n_pkts_dropped);<br />+    ZXDH_SET(hw_np_stats, hw_stats_addr, tx_mtu_drop_bytes, stats_data.n_bytes_dropped);<br />+    zxdh_data_hi_to_lo(tx_mtu_drop_pkts_addr);<br />+    zxdh_data_hi_to_lo(tx_mtu_drop_bytes_addr);<br />  <br />     idx = zxdh_vport_to_vfid(vport_num) + ZXDH_MTU_STATS_INGRESS_BASE;<br />     memset(&stats_data, 0, sizeof(stats_data));<br />@@ -1837,10 +1906,10 @@ zxdh_vf_np_stats_update(struct zxdh_hw *pf_hw, uint16_t vport,<br />         PMD_DRV_LOG(ERR, "get stats failed. code:%d", ret);<br />         return ret;<br />     }<br />-    res_info->np_stats.rx_mtu_drop_pkts = stats_data.n_pkts_dropped;<br />-    res_info->np_stats.rx_mtu_drop_bytes = stats_data.n_bytes_dropped;<br />-    zxdh_data_hi_to_lo(&res_info->np_stats.rx_mtu_drop_pkts);<br />-    zxdh_data_hi_to_lo(&res_info->np_stats.rx_mtu_drop_bytes);<br />+    ZXDH_SET(hw_np_stats, hw_stats_addr, rx_mtu_drop_pkts, stats_data.n_pkts_dropped);<br />+    ZXDH_SET(hw_np_stats, hw_stats_addr, rx_mtu_drop_bytes, stats_data.n_bytes_dropped);<br />+    zxdh_data_hi_to_lo(rx_mtu_drop_pkts_addr);<br />+    zxdh_data_hi_to_lo(rx_mtu_drop_bytes_addr);<br />  <br />     idx = zxdh_vport_to_vfid(vport_num) + ZXDH_MTR_STATS_EGRESS_BASE;<br />     memset(&stats_data, 0, sizeof(stats_data));<br />@@ -1850,10 +1919,11 @@ zxdh_vf_np_stats_update(struct zxdh_hw *pf_hw, uint16_t vport,<br />         PMD_DRV_LOG(ERR, "get stats failed. code:%d", ret);<br />         return ret;<br />     }<br />-    res_info->np_stats.tx_mtr_drop_pkts = stats_data.n_pkts_dropped;<br />-    res_info->np_stats.tx_mtr_drop_bytes = stats_data.n_bytes_dropped;<br />-    zxdh_data_hi_to_lo(&res_info->np_stats.tx_mtr_drop_pkts);<br />-    zxdh_data_hi_to_lo(&res_info->np_stats.tx_mtr_drop_bytes);<br />+    ZXDH_SET(hw_np_stats, hw_stats_addr, tx_mtr_drop_pkts, stats_data.n_pkts_dropped);<br />+    ZXDH_SET(hw_np_stats, hw_stats_addr, tx_mtr_drop_bytes, stats_data.n_bytes_dropped);<br />+<br />+    zxdh_data_hi_to_lo(tx_mtr_drop_pkts_addr);<br />+    zxdh_data_hi_to_lo(tx_mtr_drop_bytes_addr);<br />  <br />     idx = zxdh_vport_to_vfid(vport_num) + ZXDH_MTR_STATS_INGRESS_BASE;<br />     memset(&stats_data, 0, sizeof(stats_data));<br />@@ -1863,10 +1933,11 @@ zxdh_vf_np_stats_update(struct zxdh_hw *pf_hw, uint16_t vport,<br />         PMD_DRV_LOG(ERR, "get stats failed. code:%d", ret);<br />         return ret;<br />     }<br />-    res_info->np_stats.rx_mtr_drop_pkts = stats_data.n_pkts_dropped;<br />-    res_info->np_stats.rx_mtr_drop_bytes = stats_data.n_bytes_dropped;<br />-    zxdh_data_hi_to_lo(&res_info->np_stats.rx_mtr_drop_pkts);<br />-    zxdh_data_hi_to_lo(&res_info->np_stats.rx_mtr_drop_bytes);<br />+    ZXDH_SET(hw_np_stats, hw_stats_addr, rx_mtr_drop_pkts, stats_data.n_pkts_dropped);<br />+    ZXDH_SET(hw_np_stats, hw_stats_addr, rx_mtr_drop_bytes, stats_data.n_bytes_dropped);<br />+<br />+    zxdh_data_hi_to_lo(rx_mtr_drop_pkts_addr);<br />+    zxdh_data_hi_to_lo(rx_mtr_drop_bytes_addr);<br />     *res_len = sizeof(struct zxdh_hw_np_stats);<br />  <br />     return 0;<br />@@ -1875,12 +1946,13 @@ zxdh_vf_np_stats_update(struct zxdh_hw *pf_hw, uint16_t vport,<br /> static int<br /> zxdh_vf_mtr_hw_stats_get(struct zxdh_hw *pf_hw,<br />     uint16_t vport, void *cfg_data,<br />-    struct zxdh_msg_reply_body *res_info,<br />+    void *res_info,<br />     uint16_t *res_len)<br /> {<br />     struct zxdh_mtr_stats_query  *zxdh_mtr_stats_query =<br />             (struct zxdh_mtr_stats_query  *)cfg_data;<br />     union zxdh_virport_num v_port = {.vport = vport};<br />+    uint8_t *hw_mtr_stats_addr = ZXDH_ADDR_OF(msg_reply_body, res_info, hw_mtr_stats);<br />     int ret = 0;<br />  <br />     uint32_t stat_baseaddr = zxdh_mtr_stats_query->direction ==<br />@@ -1892,14 +1964,14 @@ zxdh_vf_mtr_hw_stats_get(struct zxdh_hw *pf_hw,<br />         PMD_DRV_LOG(ERR, "get stat invalid in params");<br />         return -1;<br />     }<br />-    res_info->flag = ZXDH_REPS_FAIL;<br />+    ZXDH_SET(msg_reply_body, res_info, flag, ZXDH_REPS_FAIL);<br />     ret = zxdh_np_dtb_stats_get(pf_hw->dev_id, pf_hw->dev_sd->dtb_sd.queueid,<br />-                1, idx, (uint32_t *)&res_info->hw_mtr_stats);<br />+                1, idx, (uint32_t *)hw_mtr_stats_addr);<br />     if (ret) {<br />         PMD_DRV_LOG(ERR, "get dir %d stats  failed", zxdh_mtr_stats_query->direction);<br />         return ret;<br />     }<br />-    res_info->flag = ZXDH_REPS_SUCC;<br />+    ZXDH_SET(msg_reply_body, res_info, flag, ZXDH_REPS_SUCC);<br />     *res_len = sizeof(struct zxdh_hw_mtr_stats);<br />     return 0;<br /> }<br />@@ -1908,7 +1980,7 @@ static int<br /> zxdh_vf_mtr_hw_profile_add(struct zxdh_hw *pf_hw,<br />     uint16_t vport,<br />     void *cfg_data,<br />-    struct zxdh_msg_reply_body *res_info,<br />+    void *res_info,<br />     uint16_t *res_len)<br /> {<br />     if (!cfg_data || !res_len || !res_info) {<br />@@ -1917,16 +1989,18 @@ zxdh_vf_mtr_hw_profile_add(struct zxdh_hw *pf_hw,<br />     }<br />     struct rte_mtr_error error = {0};<br />     int ret = 0;<br />-    uint64_t profile_id = HW_PROFILE_MAX;<br />+    uint64_t hw_profile_id = HW_PROFILE_MAX;<br />+    void *mtr_profile_info_addr = ZXDH_ADDR_OF(msg_reply_body, res_info, mtr_profile_info);<br />  <br />     struct zxdh_plcr_profile_add  *zxdh_plcr_profile_add =<br />         (struct zxdh_plcr_profile_add *)cfg_data;<br />  <br />-    res_info->flag = ZXDH_REPS_FAIL;<br />+    ZXDH_SET(msg_reply_body, res_info, flag, ZXDH_REPS_FAIL);<br />+<br />     *res_len = sizeof(struct zxdh_mtr_profile_info);<br />     ret = zxdh_hw_profile_alloc_direct(pf_hw->eth_dev,<br />         zxdh_plcr_profile_add->car_type,<br />-        &profile_id, &error);<br />+        &hw_profile_id, &error);<br />  <br />     if (ret) {<br />         PMD_DRV_LOG(ERR, "pf 0x%x for vf 0x%x alloc hw profile failed",<br />@@ -1935,9 +2009,9 @@ zxdh_vf_mtr_hw_profile_add(struct zxdh_hw *pf_hw,<br />         );<br />         return -1;<br />     }<br />-    zxdh_hw_profile_ref(profile_id);<br />-    res_info->mtr_profile_info.profile_id = profile_id;<br />-    res_info->flag = ZXDH_REPS_SUCC;<br />+    zxdh_hw_profile_ref(hw_profile_id);<br />+    ZXDH_SET(mtr_profile_info, mtr_profile_info_addr, profile_id, hw_profile_id);<br />+    ZXDH_SET(msg_reply_body, res_info, flag, ZXDH_REPS_SUCC);<br />  <br />     return 0;<br /> }<br />@@ -1946,7 +2020,7 @@ static int<br /> zxdh_vf_mtr_hw_profile_del(struct zxdh_hw *pf_hw,<br />     uint16_t vport,<br />     void *cfg_data,<br />-    struct zxdh_msg_reply_body *res_info,<br />+    void *res_info,<br />     uint16_t *res_len)<br /> {<br />     if (!cfg_data || !res_len || !res_info) {<br />@@ -1954,7 +2028,7 @@ zxdh_vf_mtr_hw_profile_del(struct zxdh_hw *pf_hw,<br />         return -1;<br />     }<br />  <br />-    res_info->flag = ZXDH_REPS_FAIL;<br />+    ZXDH_SET(msg_reply_body, res_info, flag, ZXDH_REPS_FAIL);<br />     *res_len = 0;<br />     struct zxdh_plcr_profile_free *mtr_profile_free = (struct zxdh_plcr_profile_free *)cfg_data;<br />     uint64_t profile_id = mtr_profile_free->profile_id;<br />@@ -1980,7 +2054,7 @@ zxdh_vf_mtr_hw_profile_del(struct zxdh_hw *pf_hw,<br />                 RTE_MTR_ERROR_TYPE_METER_PROFILE_ID, NULL,<br />                 "Meter offload del profile failed ");<br />     }<br />-    res_info->flag = ZXDH_REPS_SUCC;<br />+    ZXDH_SET(msg_reply_body, res_info, flag, ZXDH_REPS_SUCC);<br />     return 0;<br /> }<br />  <br />@@ -1988,7 +2062,7 @@ static int<br /> zxdh_vf_mtr_hw_plcrflow_cfg(struct zxdh_hw *pf_hw,<br />     uint16_t vport,<br />     void *cfg_data,<br />-    struct zxdh_msg_reply_body *res_info,<br />+    void *res_info,<br />     uint16_t *res_len)<br /> {<br />     int ret = 0;<br />@@ -2000,7 +2074,7 @@ zxdh_vf_mtr_hw_plcrflow_cfg(struct zxdh_hw *pf_hw,<br />     struct rte_mtr_error error = {0};<br />     struct zxdh_plcr_flow_cfg *zxdh_plcr_flow_cfg = (struct zxdh_plcr_flow_cfg *)cfg_data;<br />  <br />-    res_info->flag = ZXDH_REPS_FAIL;<br />+    ZXDH_SET(msg_reply_body, res_info, flag, ZXDH_REPS_FAIL);<br />     *res_len = 0;<br />     ret = zxdh_np_stat_car_queue_cfg_set(pf_hw->dev_id,<br />         zxdh_plcr_flow_cfg->car_type,<br />@@ -2019,7 +2093,7 @@ zxdh_vf_mtr_hw_plcrflow_cfg(struct zxdh_hw *pf_hw,<br />                 RTE_MTR_ERROR_TYPE_MTR_PARAMS,<br />                 NULL, "Failed to bind plcr flow.");<br />     }<br />-    res_info->flag = ZXDH_REPS_SUCC;<br />+    ZXDH_SET(msg_reply_body, res_info, flag, ZXDH_REPS_SUCC);<br />     return 0;<br /> }<br />  <br />@@ -2027,7 +2101,7 @@ static int<br /> zxdh_vf_mtr_hw_profile_cfg(struct zxdh_hw *pf_hw __rte_unused,<br />     uint16_t vport,<br />     void *cfg_data,<br />-    struct zxdh_msg_reply_body *res_info,<br />+    void *res_info,<br />     uint16_t *res_len)<br /> {<br />     int ret = 0;<br />@@ -2036,7 +2110,7 @@ zxdh_vf_mtr_hw_profile_cfg(struct zxdh_hw *pf_hw __rte_unused,<br />         PMD_DRV_LOG(ERR, " cfg profile invalid inparams");<br />         return -1;<br />     }<br />-    res_info->flag = ZXDH_REPS_FAIL;<br />+    ZXDH_SET(msg_reply_body, res_info, flag, ZXDH_REPS_FAIL);<br />     *res_len = 0;<br />     struct rte_mtr_error error = {0};<br />     struct zxdh_plcr_profile_cfg *zxdh_plcr_profile_cfg =<br />@@ -2053,7 +2127,7 @@ zxdh_vf_mtr_hw_profile_cfg(struct zxdh_hw *pf_hw __rte_unused,<br />         PMD_DRV_LOG(ERR, "(vport %d)config hw profilefailed", vport);<br />         return -rte_mtr_error_set(&error, ENOTSUP, RTE_MTR_ERROR_TYPE_METER_PROFILE, NULL, "Meter offload cfg profile failed");<br />     }<br />-    res_info->flag = ZXDH_REPS_SUCC;<br />+    ZXDH_SET(msg_reply_body, res_info, flag, ZXDH_REPS_SUCC);<br />     return 0;<br /> }<br />  <br />@@ -2084,7 +2158,7 @@ static const zxdh_msg_process_callback zxdh_proc_cb[] = {<br />  <br /> static inline int<br /> zxdh_config_process_callback(struct zxdh_hw *hw, struct zxdh_msg_info *msg_info,<br />-    struct zxdh_msg_reply_body *res, uint16_t *res_len)<br />+    void *res, uint16_t *res_len)<br /> {<br />     struct zxdh_msg_head *msghead = &msg_info->msg_head;<br />     int ret = -1;<br />@@ -2097,13 +2171,13 @@ zxdh_config_process_callback(struct zxdh_hw *hw, struct zxdh_msg_info *msg_info,<br />         ret = zxdh_proc_cb[msghead->msg_type](hw, msghead->vport,<br />                     (void *)&msg_info->data, res, res_len);<br />         if (!ret)<br />-            res->flag = ZXDH_REPS_SUCC;<br />+            ZXDH_SET(msg_reply_body, res, flag, ZXDH_REPS_SUCC);<br />         else<br />-            res->flag = ZXDH_REPS_FAIL;<br />+            ZXDH_SET(msg_reply_body, res, flag, ZXDH_REPS_FAIL);<br />     } else {<br />-        res->flag = ZXDH_REPS_INVALID;<br />+        ZXDH_SET(msg_reply_body, res, flag, ZXDH_REPS_INVALID);<br />     }<br />-    *res_len += sizeof(res->flag);<br />+    *res_len += sizeof(uint8_t);<br />     return ret;<br /> }<br />  <br />@@ -2112,7 +2186,7 @@ pf_recv_bar_msg(void *pay_load, uint16_t len, void *reps_buffer,<br />     uint16_t *reps_len, void *eth_dev)<br /> {<br />     struct zxdh_msg_info *msg_info = (struct zxdh_msg_info *)pay_load;<br />-    struct zxdh_msg_reply_body *reply_body = reps_buffer;<br />+    void *reply_data_addr = ZXDH_ADDR_OF(msg_reply_body, reps_buffer, reply_data);<br />     struct rte_eth_dev *dev = (struct rte_eth_dev *)eth_dev;<br />     int32_t ret = 0;<br />     struct zxdh_hw *hw;<br />@@ -2132,14 +2206,14 @@ pf_recv_bar_msg(void *pay_load, uint16_t len, void *reps_buffer,<br />         goto msg_proc_end;<br />     }<br />  <br />-    ret = zxdh_config_process_callback(hw, msg_info, reply_body, &reply_len);<br />-    *reps_len = reply_len + sizeof(struct zxdh_msg_reply_head);<br />+    ret = zxdh_config_process_callback(hw, msg_info, reps_buffer, &reply_len);<br />+    *reps_len = reply_len + ZXDH_ST_SZ_BYTES(msg_reply_head);<br />     return ret;<br />  <br /> msg_proc_end:<br />-    memcpy(reply_body->reply_data, &ret, sizeof(ret));<br />+    memcpy(reply_data_addr, &ret, sizeof(ret));<br />     reply_len = sizeof(ret);<br />-    *reps_len = sizeof(struct zxdh_msg_reply_head) + reply_len;<br />+    *reps_len = ZXDH_ST_SZ_BYTES(msg_reply_head) + reply_len;<br />     return ret;<br /> }<br />  <br />diff --git a/drivers/net/zxdh/zxdh_msg.h b/drivers/net/zxdh/zxdh_msg.h<br />index 58836bb4b7..7dad6f7335 100644<br />--- a/drivers/net/zxdh/zxdh_msg.h<br />+++ b/drivers/net/zxdh/zxdh_msg.h<br />@@ -11,6 +11,7 @@<br />  <br /> #include "zxdh_ethdev_ops.h" <br /> #include "zxdh_mtr.h" <br />+#include "zxdh_common.h" <br />  <br /> #define ZXDH_BAR0_INDEX                 0<br /> #define ZXDH_CTRLCH_OFFSET              (0x2000)<br />@@ -46,8 +47,10 @@<br />  <br /> #define ZXDH_MSG_REPLYBODY_HEAD    sizeof(enum zxdh_reps_flag)<br /> #define ZXDH_MSG_HEADER_SIZE       4<br />-#define ZXDH_MSG_REPLY_BODY_MAX_LEN  \<br />-        (ZXDH_MSG_PAYLOAD_MAX_LEN - sizeof(struct zxdh_msg_reply_head))<br />+#define ZXDH_MSG_REPLY_BODY_MAX_LEN \<br />+        (ZXDH_MSG_PAYLOAD_MAX_LEN - ZXDH_MSG_HEADER_SIZE)<br />+#define ZXDH_MSG_REPLY_DATA \<br />+        (ZXDH_MSG_REPLY_BODY_MAX_LEN - ZXDH_MSG_REPLYBODY_HEAD)<br />  <br /> #define ZXDH_MSG_HEAD_LEN            8<br /> #define ZXDH_MSG_REQ_BODY_MAX_LEN  \<br />@@ -329,12 +332,6 @@ struct zxdh_offset_get_msg {<br />     uint16_t type;<br /> };<br />  <br />-struct zxdh_msg_reply_head {<br />-    uint8_t flag;<br />-    uint16_t reps_len;<br />-    uint8_t resvd;<br />-};<br />-<br /> enum zxdh_reps_flag {<br />     ZXDH_REPS_FAIL,<br />     ZXDH_REPS_SUCC = 0xaa,<br />@@ -354,18 +351,39 @@ struct zxdh_link_info_msg {<br />     uint32_t speed;<br /> };<br />  <br />+struct zxdh_ifc_link_info_msg_bits {<br />+    uint8_t autoneg[0x8];<br />+    uint8_t link_state[0x8];<br />+    uint8_t blink_enable[0x8];<br />+    uint8_t duplex[0x8];<br />+    uint8_t speed_modes[0x20];<br />+    uint8_t speed[0x20];<br />+};<br />+<br /> struct zxdh_rss_reta {<br />     uint32_t reta[RTE_ETH_RSS_RETA_SIZE_256];<br /> };<br />  <br />+struct zxdh_ifc_rss_reta_bits {<br />+    uint32_t reta[RTE_ETH_RSS_RETA_SIZE_256 * 8];<br />+};<br />+<br /> struct zxdh_rss_hf {<br />     uint32_t rss_hf;<br /> };<br />  <br />+struct zxdh_ifc_rss_hf_bits {<br />+    uint8_t rss_hf[0x20];<br />+};<br />+<br /> struct zxdh_mac_reply_msg {<br />     uint8_t mac_flag;<br /> };<br />  <br />+struct zxdh_ifc_mac_reply_msg_bits {<br />+    uint8_t mac_flag[0x8];<br />+};<br />+<br /> struct zxdh_mac_module_eeprom_msg {<br />     uint8_t i2c_addr;<br />     uint8_t bank;<br />@@ -375,34 +393,57 @@ struct zxdh_mac_module_eeprom_msg {<br />     uint8_t data[ZXDH_MODULE_EEPROM_DATA_LEN];<br /> };<br />  <br />+struct zxdh_ifc_agent_mac_module_eeprom_msg_bits {<br />+    uint8_t i2c_addr[0x8];<br />+    uint8_t bank[0x8];<br />+    uint8_t page[0x8];<br />+    uint8_t offset[0x8];<br />+    uint8_t length[0x8];<br />+    uint8_t data[ZXDH_MODULE_EEPROM_DATA_LEN * 8];<br />+};<br />+<br /> struct zxdh_flash_msg {<br />     uint8_t firmware_version[ZXDH_FWVERS_LEN];<br /> };<br />  <br />+struct zxdh_ifc_agent_flash_msg_bits {<br />+    uint8_t firmware_version[0x100];<br />+};<br />+<br /> struct zxdh_mtr_profile_info {<br />     uint64_t profile_id;<br /> };<br />  <br />-struct zxdh_msg_reply_body {<br />-    enum zxdh_reps_flag flag;<br />+struct zxdh_ifc_mtr_profile_info_bits {<br />+    uint8_t profile_id[0x40];<br />+};<br />+<br />+struct zxdh_ifc_msg_reply_body_bits {<br />+    uint8_t flag[0x8];<br />     union {<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_reta rss_reta;<br />-        struct zxdh_rss_hf rss_hf;<br />-        struct zxdh_hw_vqm_stats vqm_stats;<br />-        struct zxdh_mac_reply_msg mac_reply_msg;<br />-        struct zxdh_flash_msg flash_msg;<br />-        struct zxdh_mac_module_eeprom_msg module_eeprom_msg;<br />-        struct zxdh_mtr_profile_info mtr_profile_info;<br />-        struct zxdh_mtr_stats hw_mtr_stats;<br />+        uint8_t reply_data[ZXDH_MSG_REPLY_DATA * 8];<br />+        struct zxdh_ifc_hw_np_stats_bits hw_stats;<br />+        struct zxdh_ifc_link_info_msg_bits link_msg;<br />+        struct zxdh_ifc_rss_reta_bits rss_reta_msg;<br />+        struct zxdh_ifc_rss_hf_bits rss_hf_msg;<br />+        struct zxdh_ifc_hw_vqm_stats_bits vqm_stats;<br />+        struct zxdh_ifc_mac_reply_msg_bits mac_reply_msg;<br />+        struct zxdh_ifc_agent_flash_msg_bits flash_msg;<br />+        struct zxdh_ifc_agent_mac_module_eeprom_msg_bits module_eeprom_msg;<br />+        struct zxdh_ifc_mtr_profile_info_bits  mtr_profile_info;<br />+        struct zxdh_ifc_mtr_stats_bits hw_mtr_stats;<br />     };<br /> };<br />  <br />-struct zxdh_msg_reply_info {<br />-    struct zxdh_msg_reply_head reply_head;<br />-    struct zxdh_msg_reply_body reply_body;<br />+struct zxdh_ifc_msg_reply_head_bits {<br />+    uint8_t flag[0x8];<br />+    uint8_t reps_len[0x10];<br />+    uint8_t resvd[0x8];<br />+};<br />+<br />+struct zxdh_ifc_msg_reply_info_bits {<br />+    struct zxdh_ifc_msg_reply_head_bits reply_head;<br />+    struct zxdh_ifc_msg_reply_body_bits reply_body;<br /> };<br />  <br /> struct zxdh_vf_init_msg {<br />@@ -412,12 +453,12 @@ struct zxdh_vf_init_msg {<br />     uint8_t rss_enable;<br /> };<br />  <br />-struct zxdh_msg_head {<br />-    enum zxdh_msg_type msg_type;<br />+struct __rte_packed_begin zxdh_msg_head {<br />+    uint8_t msg_type;<br />     uint16_t  vport;<br />     uint16_t  vf_id;<br />     uint16_t pcieid;<br />-};<br />+} __rte_packed_end;<br />  <br /> struct zxdh_port_attr_set_msg {<br />     uint32_t mode;<br />@@ -455,7 +496,7 @@ struct zxdh_rss_enable {<br /> };<br />  <br /> struct zxdh_agent_msg_head {<br />-    enum zxdh_agent_msg_type msg_type;<br />+    uint8_t msg_type;<br />     uint8_t panel_id;<br />     uint8_t phyport;<br />     uint8_t rsv;<br />@@ -526,7 +567,7 @@ struct zxdh_msg_info {<br /> typedef int (*zxdh_bar_chan_msg_recv_callback)(void *pay_load, uint16_t len,<br />         void *reps_buffer, uint16_t *reps_len, void *dev);<br /> typedef int (*zxdh_msg_process_callback)(struct zxdh_hw *hw, uint16_t vport, void *cfg_data,<br />-    struct zxdh_msg_reply_body *res_info, uint16_t *res_len);<br />+    void *res_info, uint16_t *res_len);<br />  <br /> typedef int (*zxdh_bar_chan_msg_recv_callback)(void *pay_load, uint16_t len,<br />             void *reps_buffer, uint16_t *reps_len, void *dev);<br />diff --git a/drivers/net/zxdh/zxdh_mtr.c b/drivers/net/zxdh/zxdh_mtr.c<br />index 809456d73f..b23f6535a8 100644<br />--- a/drivers/net/zxdh/zxdh_mtr.c<br />+++ b/drivers/net/zxdh/zxdh_mtr.c<br />@@ -326,7 +326,7 @@ zxdh_hw_profile_free(struct rte_eth_dev *dev, uint8_t car_type,<br />         ret = zxdh_hw_profile_free_direct(dev, car_type, (uint64_t)hw_profile_id, error);<br />     } else {<br />         struct zxdh_msg_info msg_info = {0};<br />-        struct zxdh_msg_reply_info reply_info = {0};<br />+        uint8_t zxdh_msg_reply_info[ZXDH_ST_SZ_BYTES(msg_reply_info)] = {0};<br />         struct zxdh_plcr_profile_free *zxdh_plcr_profile_free =<br />             &msg_info.data.zxdh_plcr_profile_free;<br />  <br />@@ -335,7 +335,7 @@ zxdh_hw_profile_free(struct rte_eth_dev *dev, uint8_t car_type,<br />         zxdh_msg_head_build(hw, ZXDH_PLCR_CAR_PROFILE_ID_DELETE, &msg_info);<br />         ret = zxdh_vf_send_msg_to_pf(dev, &msg_info,<br />             ZXDH_MSG_HEAD_LEN + sizeof(struct zxdh_plcr_profile_free),<br />-            &reply_info, sizeof(struct zxdh_msg_reply_info));<br />+            zxdh_msg_reply_info, ZXDH_ST_SZ_BYTES(msg_reply_info));<br />  <br />         if (ret)<br />             return -rte_mtr_error_set(error, ENOTSUP,<br />@@ -357,15 +357,19 @@ zxdh_hw_profile_alloc(struct rte_eth_dev *dev, uint64_t *hw_profile_id,<br />         ret = zxdh_hw_profile_alloc_direct(dev, CAR_A, hw_profile_id, error);<br />     } else {<br />         struct zxdh_msg_info msg_info = {0};<br />-        struct zxdh_msg_reply_info reply_info = {0};<br />+        uint8_t zxdh_msg_reply_info[ZXDH_ST_SZ_BYTES(msg_reply_info)] = {0};<br />         struct zxdh_plcr_profile_add  *zxdh_plcr_profile_add =<br />             &msg_info.data.zxdh_plcr_profile_add;<br />+        void *reply_body_addr =<br />+            ZXDH_ADDR_OF(msg_reply_info, zxdh_msg_reply_info, reply_body);<br />+        void *mtr_profile_info_addr =<br />+            ZXDH_ADDR_OF(msg_reply_body, reply_body_addr, mtr_profile_info);<br />  <br />         zxdh_plcr_profile_add->car_type = CAR_A;<br />         zxdh_msg_head_build(hw, ZXDH_PLCR_CAR_PROFILE_ID_ADD, &msg_info);<br />         ret = zxdh_vf_send_msg_to_pf(dev, &msg_info,<br />             ZXDH_MSG_HEAD_LEN + sizeof(struct zxdh_plcr_profile_add),<br />-            &reply_info, sizeof(struct zxdh_msg_reply_info));<br />+            zxdh_msg_reply_info, ZXDH_ST_SZ_BYTES(msg_reply_info));<br />  <br />         if (ret) {<br />             PMD_DRV_LOG(ERR,<br />@@ -376,7 +380,7 @@ zxdh_hw_profile_alloc(struct rte_eth_dev *dev, uint64_t *hw_profile_id,<br />                     RTE_MTR_ERROR_TYPE_METER_PROFILE_ID, NULL,<br />                     "Meter offload alloc profile  id msg failed ");<br />         }<br />-        *hw_profile_id = reply_info.reply_body.mtr_profile_info.profile_id;<br />+        *hw_profile_id = ZXDH_GET(mtr_profile_info, mtr_profile_info_addr, profile_id);<br />         if (*hw_profile_id == ZXDH_HW_PROFILE_MAX) {<br />             return -rte_mtr_error_set(error, ENOTSUP,<br />                     RTE_MTR_ERROR_TYPE_METER_PROFILE_ID, NULL,<br />@@ -432,7 +436,7 @@ zxdh_mtr_hw_counter_query(struct rte_eth_dev *dev,<br />         }<br />     } else { /* send msg to pf */<br />         struct zxdh_msg_info msg_info = {0};<br />-        struct zxdh_msg_reply_info reply_info = {0};<br />+        uint8_t zxdh_msg_reply_info[ZXDH_ST_SZ_BYTES(msg_reply_info)] = {0};<br />         struct zxdh_mtr_stats_query *zxdh_mtr_stats_query =<br />                 &msg_info.data.zxdh_mtr_stats_query;<br />  <br />@@ -442,8 +446,8 @@ zxdh_mtr_hw_counter_query(struct rte_eth_dev *dev,<br />         ret = zxdh_vf_send_msg_to_pf(dev,<br />             &msg_info,<br />             sizeof(msg_info),<br />-            &reply_info,<br />-            sizeof(struct zxdh_msg_reply_info));<br />+            zxdh_msg_reply_info,<br />+            ZXDH_ST_SZ_BYTES(msg_reply_info));<br />  <br />         if (ret) {<br />             PMD_DRV_LOG(ERR,<br />@@ -451,7 +455,11 @@ zxdh_mtr_hw_counter_query(struct rte_eth_dev *dev,<br />                 hw->vport.vport);<br />             return -rte_mtr_error_set(error, ENOTSUP, RTE_MTR_ERROR_TYPE_STATS, NULL, "Meter offload alloc profile failed");<br />         }<br />-        struct zxdh_mtr_stats *hw_mtr_stats = &reply_info.reply_body.hw_mtr_stats;<br />+        void *reply_body_addr =<br />+            ZXDH_ADDR_OF(msg_reply_info, zxdh_msg_reply_info, reply_body);<br />+        void *hw_mtr_stats_addr =<br />+            ZXDH_ADDR_OF(msg_reply_body, reply_body_addr, hw_mtr_stats);<br />+        struct zxdh_mtr_stats *hw_mtr_stats = (struct zxdh_mtr_stats *)hw_mtr_stats_addr;<br />  <br />         mtr_stats->n_bytes_dropped = hw_mtr_stats->n_bytes_dropped;<br />         mtr_stats->n_pkts_dropped = hw_mtr_stats->n_pkts_dropped;<br />@@ -575,7 +583,7 @@ static int zxdh_hw_profile_config(struct rte_eth_dev *dev, uint16_t hw_profile_i<br />         ret = zxdh_hw_profile_config_direct(dev, CAR_A, hw_profile_id, mp, error);<br />     } else {<br />         struct zxdh_msg_info msg_info = {0};<br />-        struct zxdh_msg_reply_info reply_info = {0};<br />+        uint8_t zxdh_msg_reply_info[ZXDH_ST_SZ_BYTES(msg_reply_info)] = {0};<br />         struct zxdh_plcr_profile_cfg *zxdh_plcr_profile_cfg =<br />             &msg_info.data.zxdh_plcr_profile_cfg;<br />  <br />@@ -590,9 +598,9 @@ static int zxdh_hw_profile_config(struct rte_eth_dev *dev, uint16_t hw_profile_i<br />         ret = zxdh_vf_send_msg_to_pf(dev,<br />             &msg_info,<br />             ZXDH_MSG_HEAD_LEN + sizeof(struct zxdh_plcr_profile_cfg),<br />-            &reply_info,<br />-            sizeof(struct zxdh_msg_reply_info));<br />-<br />+            zxdh_msg_reply_info,<br />+            ZXDH_ST_SZ_BYTES(msg_reply_info)<br />+        );<br />         if (ret) {<br />             PMD_DRV_LOG(ERR,<br />                 "Failed msg: port 0x%x msg type ZXDH_PLCR_CAR_PROFILE_CFG_SET ",<br />@@ -876,7 +884,7 @@ zxdh_set_mtr_enable(struct rte_eth_dev *dev, uint8_t dir, bool enable, struct rt<br />  <br />     if (priv->is_pf) {<br />         ret = zxdh_get_port_attr(priv, priv->vport.vport, &port_attr);<br />-        port_attr.ingress_meter_enable = enable;<br />+        port_attr.egress_meter_enable = enable;<br />         ret = zxdh_set_port_attr(priv, priv->vport.vport, &port_attr);<br />         if (ret) {<br />             PMD_DRV_LOG(ERR, "%s set port attr failed", __func__);<br />@@ -938,7 +946,7 @@ zxdh_hw_plcrflow_config(struct rte_eth_dev *dev, uint16_t hw_flow_id,<br />         }<br />     } else {<br />         struct zxdh_msg_info msg_info = {0};<br />-        struct zxdh_msg_reply_info reply_info = {0};<br />+        uint8_t zxdh_msg_reply_info[ZXDH_ST_SZ_BYTES(msg_reply_info)] = {0};<br />         struct zxdh_plcr_flow_cfg *zxdh_plcr_flow_cfg = &msg_info.data.zxdh_plcr_flow_cfg;<br />  <br />         zxdh_plcr_flow_cfg->car_type = CAR_A;<br />@@ -949,8 +957,8 @@ zxdh_hw_plcrflow_config(struct rte_eth_dev *dev, uint16_t hw_flow_id,<br />         zxdh_msg_head_build(hw, ZXDH_PLCR_CAR_QUEUE_CFG_SET, &msg_info);<br />         ret = zxdh_vf_send_msg_to_pf(dev, &msg_info,<br />             ZXDH_MSG_HEAD_LEN + sizeof(struct zxdh_plcr_flow_cfg),<br />-            &reply_info,<br />-            sizeof(struct zxdh_msg_reply_info));<br />+            zxdh_msg_reply_info,<br />+            ZXDH_ST_SZ_BYTES(msg_reply_info));<br />         if (ret) {<br />             PMD_DRV_LOG(ERR,<br />                 "Failed msg: port 0x%x msg type ZXDH_PLCR_CAR_QUEUE_CFG_SET ",<br />diff --git a/drivers/net/zxdh/zxdh_mtr.h b/drivers/net/zxdh/zxdh_mtr.h<br />index 749ceb7479..3efcb6b591 100644<br />--- a/drivers/net/zxdh/zxdh_mtr.h<br />+++ b/drivers/net/zxdh/zxdh_mtr.h<br />@@ -93,6 +93,11 @@ struct zxdh_mtr_stats {<br />     uint64_t n_bytes_dropped;<br /> };<br />  <br />+struct zxdh_ifc_mtr_stats_bits {<br />+    uint8_t n_pkts_dropped[0x40];<br />+    uint8_t n_bytes_dropped[0x40];<br />+};<br />+<br /> struct zxdh_hw_mtr_stats {<br />     uint32_t n_pkts_dropped_hi;<br />     uint32_t n_pkts_dropped_lo;<br />diff --git a/drivers/net/zxdh/zxdh_pci.c b/drivers/net/zxdh/zxdh_pci.c<br />index 3d1a3ff0dd..4ff0f065df 100644<br />--- a/drivers/net/zxdh/zxdh_pci.c<br />+++ b/drivers/net/zxdh/zxdh_pci.c<br />@@ -27,6 +27,23 @@<br />         1ULL << ZXDH_F_NOTIFICATION_DATA | \<br />         1ULL << ZXDH_NET_F_MAC)<br />  <br />+#define ZXDH_PMD_DEFAULT_HOST_FEATURES   \<br />+    (1ULL << ZXDH_NET_F_MRG_RXBUF | \<br />+     1ULL << ZXDH_NET_F_STATUS    | \<br />+     1ULL << ZXDH_NET_F_MQ        | \<br />+     1ULL << ZXDH_F_ANY_LAYOUT    | \<br />+     1ULL << ZXDH_F_VERSION_1   | \<br />+     1ULL << ZXDH_F_RING_PACKED | \<br />+     1ULL << ZXDH_F_IN_ORDER    | \<br />+     1ULL << ZXDH_F_NOTIFICATION_DATA |\<br />+     1ULL << ZXDH_NET_F_MAC | \<br />+     1ULL << ZXDH_NET_F_CSUM |\<br />+     1ULL << ZXDH_NET_F_GUEST_CSUM |\<br />+     1ULL << ZXDH_NET_F_GUEST_TSO4 |\<br />+     1ULL << ZXDH_NET_F_GUEST_TSO6 |\<br />+     1ULL << ZXDH_NET_F_HOST_TSO4 |\<br />+     1ULL << ZXDH_NET_F_HOST_TSO6)<br />+<br /> static void<br /> zxdh_read_dev_config(struct zxdh_hw *hw, size_t offset,<br />         void *dst, int32_t length)<br />@@ -391,13 +408,18 @@ zxdh_pci_read_dev_config(struct zxdh_hw *hw, size_t offset, void *dst, int32_t l<br />     ZXDH_VTPCI_OPS(hw)->read_dev_cfg(hw, offset, dst, length);<br /> }<br />  <br />+void zxdh_pci_write_dev_config(struct zxdh_hw *hw, size_t offset, const void *src, int32_t length)<br />+{<br />+    ZXDH_VTPCI_OPS(hw)->write_dev_cfg(hw, offset, src, length);<br />+}<br />+<br /> void<br /> zxdh_get_pci_dev_config(struct zxdh_hw *hw)<br /> {<br />     uint64_t guest_features = 0;<br />     uint64_t nego_features = 0;<br />  <br />-    hw->host_features = zxdh_pci_get_features(hw);<br />+    hw->host_features = ZXDH_PMD_DEFAULT_HOST_FEATURES;<br />  <br />     guest_features = (uint64_t)ZXDH_PMD_DEFAULT_GUEST_FEATURES;<br />     nego_features = guest_features & hw->host_features;<br />diff --git a/drivers/net/zxdh/zxdh_pci.h b/drivers/net/zxdh/zxdh_pci.h<br />index 9b8bef6c09..a1834f6615 100644<br />--- a/drivers/net/zxdh/zxdh_pci.h<br />+++ b/drivers/net/zxdh/zxdh_pci.h<br />@@ -162,7 +162,7 @@ void zxdh_pci_read_dev_config(struct zxdh_hw *hw, size_t offset,<br />  <br /> int32_t zxdh_read_pci_caps(struct rte_pci_device *dev, struct zxdh_hw *hw);<br /> void zxdh_get_pci_dev_config(struct zxdh_hw *hw);<br />-<br />+void zxdh_pci_write_dev_config(struct zxdh_hw *hw, size_t offset, const void *src, int32_t length);<br /> uint16_t zxdh_pci_get_features(struct zxdh_hw *hw);<br /> enum zxdh_msix_status zxdh_pci_msix_detect(struct rte_pci_device *dev);<br /> uint8_t zxdh_pci_isr(struct zxdh_hw *hw);<br />diff --git a/drivers/net/zxdh/zxdh_rxtx.c b/drivers/net/zxdh/zxdh_rxtx.c<br />index 1921a23f25..9bb57d4f84 100644<br />--- a/drivers/net/zxdh/zxdh_rxtx.c<br />+++ b/drivers/net/zxdh/zxdh_rxtx.c<br />@@ -760,7 +760,6 @@ zxdh_rx_update_mbuf(struct rte_mbuf *m, struct zxdh_net_hdr_ul *hdr)<br />         idx = (pkt_type_inner >> 4)  & 0xF;<br />         m->packet_type |= zxdh_inner_l4_type[idx];<br />     }<br />-<br /> }<br />  <br /> static void zxdh_discard_rxbuf(struct zxdh_virtqueue *vq, struct rte_mbuf *m)<br />@@ -818,9 +817,14 @@ zxdh_recv_pkts_packed(void *rx_queue, struct rte_mbuf **rx_pkts,<br />         seg_num  = header->type_hdr.num_buffers;<br />  <br />         /* Private queue only handle type hdr */<br />-        hdr_size = ZXDH_TYPE_HDR_SIZE;<br />-        rxm->pkt_len = ((header->type_hdr.port & 0x7f) << 8) +<br />-                            header->type_hdr.pd_len;<br />+        hdr_size = header->type_hdr.pd_len << 1;<br />+        if (unlikely(hdr_size > lens[i] || hdr_size < ZXDH_TYPE_HDR_SIZE)) {<br />+            PMD_RX_LOG(ERR, "hdr_size:%u is invalid", hdr_size);<br />+            rte_pktmbuf_free(rxm);<br />+            rxvq->stats.errors++;<br />+            rxvq->stats.invalid_hdr_len_err++;<br />+            continue;<br />+        }<br />         rxm->data_off += hdr_size;<br />         rxm->nb_segs = seg_num;<br />         rxm->ol_flags = 0;<br />diff --git a/drivers/net/zxdh/zxdh_tables.c b/drivers/net/zxdh/zxdh_tables.c<br />index 253d9ce438..29741e53ed 100644<br />--- a/drivers/net/zxdh/zxdh_tables.c<br />+++ b/drivers/net/zxdh/zxdh_tables.c<br />@@ -8,17 +8,8 @@<br /> #include "zxdh_tables.h" <br /> #include "zxdh_logs.h" <br />  <br />-#define ZXDH_SDT_VPORT_ATT_TABLE          1<br />-#define ZXDH_SDT_PANEL_ATT_TABLE          2<br />-#define ZXDH_SDT_RSS_ATT_TABLE            3<br />-#define ZXDH_SDT_VLAN_ATT_TABLE           4<br />-#define ZXDH_SDT_BROCAST_ATT_TABLE        6<br />-#define ZXDH_SDT_UNICAST_ATT_TABLE        10<br />-#define ZXDH_SDT_MULTICAST_ATT_TABLE      11<br />-#define ZXDH_SDT_PORT_VLAN_ATT_TABLE      16<br />-<br />-#define ZXDH_MAC_HASH_INDEX_BASE          64<br />-#define ZXDH_MAC_HASH_INDEX(index)        (ZXDH_MAC_HASH_INDEX_BASE + (index))<br />+#define ZXDH_UNIMAC_HASH_INDEX(index)        (ZXDH_SDT_L2_ENTRY_TABLE0 + (index))<br />+#define ZXDH_MULTIMAC_HASH_INDEX(index)      (ZXDH_SDT_MC_TABLE0 + (index))<br /> #define ZXDH_MC_GROUP_NUM                 4<br /> #define ZXDH_BASE_VFID                    1152<br /> #define ZXDH_TABLE_HIT_FLAG               128<br />@@ -40,15 +31,16 @@ zxdh_set_port_attr(struct zxdh_hw *hw, uint16_t vport, struct zxdh_port_attr_tab<br /> {<br />     struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd;<br />     union zxdh_virport_num vport_num = (union zxdh_virport_num)vport;<br />+    uint16_t vfid = zxdh_vport_to_vfid(vport_num);<br />     int ret = 0;<br />  <br />-    ZXDH_DTB_ERAM_ENTRY_INFO_T entry = {vport_num.vfid, (uint32_t *)port_attr};<br />+    ZXDH_DTB_ERAM_ENTRY_INFO_T entry = {vfid, (uint32_t *)port_attr};<br />     ZXDH_DTB_USER_ENTRY_T user_entry_write = {ZXDH_SDT_VPORT_ATT_TABLE, (void *)&entry};<br />  <br />     ret = zxdh_np_dtb_table_entry_write(hw->slot_id,<br />                 dtb_data->queueid, 1, &user_entry_write);<br />     if (ret != 0)<br />-        PMD_DRV_LOG(ERR, "write vport_att failed vfid:%d failed", vport_num.vfid);<br />+        PMD_DRV_LOG(ERR, "write vport_att failed vfid:%d failed", vfid);<br />  <br />     return ret;<br /> }<br />@@ -72,6 +64,7 @@ zxdh_port_attr_init(struct rte_eth_dev *dev)<br />         port_attr.mtu = dev->data->mtu;<br />         port_attr.mtu_enable = 1;<br />         port_attr.is_up = 0;<br />+        port_attr.hash_search_index = hw->hash_search_index;<br />         if (!port_attr.rss_enable)<br />             port_attr.port_base_qid = 0;<br />  <br />@@ -144,6 +137,7 @@ int zxdh_panel_table_init(struct rte_eth_dev *dev)<br />     panel.pf_vfid = zxdh_vport_to_vfid(hw->vport);<br />     panel.mtu_enable = 1;<br />     panel.mtu = dev->data->mtu;<br />+    panel.port_vfid_1588 = panel.pf_vfid;<br />  <br />     ZXDH_DTB_ERAM_ENTRY_INFO_T panel_entry = {<br />         .index = hw->phyport,<br />@@ -212,13 +206,14 @@ zxdh_get_port_attr(struct zxdh_hw *hw, uint16_t vport, struct zxdh_port_attr_tab<br /> {<br />     struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd;<br />     union zxdh_virport_num vport_num = (union zxdh_virport_num)vport;<br />-    ZXDH_DTB_ERAM_ENTRY_INFO_T entry = {vport_num.vfid, (uint32_t *)port_attr};<br />+    uint16_t vfid = zxdh_vport_to_vfid(vport_num);<br />+    ZXDH_DTB_ERAM_ENTRY_INFO_T entry = {vfid, (uint32_t *)port_attr};<br />     ZXDH_DTB_USER_ENTRY_T user_entry_get = {ZXDH_SDT_VPORT_ATT_TABLE, &entry};<br />     int ret;<br />  <br />     ret = zxdh_np_dtb_table_entry_get(hw->slot_id, dtb_data->queueid, &user_entry_get, 1);<br />     if (ret != 0)<br />-        PMD_DRV_LOG(ERR, "get port_attr vfid:%d failed, ret:%d", vport_num.vfid, ret);<br />+        PMD_DRV_LOG(ERR, "get port_attr vfid:%d failed, ret:%d", vfid, ret);<br />  <br />     return ret;<br /> }<br />@@ -229,7 +224,8 @@ zxdh_delete_port_attr(struct zxdh_hw *hw, uint16_t vport,<br /> {<br />     struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd;<br />     union zxdh_virport_num vport_num = (union zxdh_virport_num)vport;<br />-    ZXDH_DTB_ERAM_ENTRY_INFO_T entry = {vport_num.vfid, (uint32_t *)port_attr};<br />+    uint16_t vfid = zxdh_vport_to_vfid(vport_num);<br />+    ZXDH_DTB_ERAM_ENTRY_INFO_T entry = {vfid, (uint32_t *)port_attr};<br />     ZXDH_DTB_USER_ENTRY_T user_entry = {<br />         .sdt_no = ZXDH_SDT_VPORT_ATT_TABLE,<br />         .p_entry_data = (void *)&entry<br />@@ -247,9 +243,9 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad<br />     struct zxdh_mac_unicast_table unicast_table = {0};<br />     struct zxdh_mac_multicast_table multicast_table = {0};<br />     union zxdh_virport_num vport_num = (union zxdh_virport_num)vport;<br />+    uint16_t vfid = zxdh_vport_to_vfid(vport_num);<br />     uint32_t ret;<br />     uint16_t group_id = 0;<br />-    uint16_t vfid = vport_num.vfid;<br />  <br />     if (rte_is_unicast_ether_addr(addr)) {<br />         rte_memcpy(unicast_table.key.dmac_addr, addr, sizeof(struct rte_ether_addr));<br />@@ -261,7 +257,7 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad<br />             .p_rst = (uint8_t *)&unicast_table.entry<br />         };<br />         ZXDH_DTB_USER_ENTRY_T entry_get = {<br />-            .sdt_no = ZXDH_MAC_HASH_INDEX(hash_search_idx),<br />+            .sdt_no = ZXDH_UNIMAC_HASH_INDEX(hash_search_idx),<br />             .p_entry_data = (void *)&dtb_hash_entry<br />         };<br />  <br />@@ -298,7 +294,7 @@ zxdh_add_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad<br />             };<br />  <br />             ZXDH_DTB_USER_ENTRY_T entry_get = {<br />-                .sdt_no = ZXDH_MAC_HASH_INDEX(hash_search_idx),<br />+                .sdt_no = ZXDH_MULTIMAC_HASH_INDEX(hash_search_idx),<br />                 .p_entry_data = (void *)&dtb_hash_entry<br />             };<br />  <br />@@ -351,15 +347,17 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad<br />     struct zxdh_mac_unicast_table unicast_table = {0};<br />     struct zxdh_mac_multicast_table multicast_table = {0};<br />     union zxdh_virport_num vport_num = (union zxdh_virport_num)vport;<br />-    uint32_t ret, del_flag = 0;<br />-    uint16_t group_id = 0;<br />     union zxdh_virport_num port = (union zxdh_virport_num)vport;<br />     uint16_t vfid = zxdh_vport_to_vfid(port);<br />+    uint32_t ret, del_flag = 0;<br />+    uint16_t group_id = 0;<br />  <br />     if (rte_is_unicast_ether_addr(addr)) {<br />         rte_memcpy(unicast_table.key.dmac_addr, addr, sizeof(struct rte_ether_addr));<br />         unicast_table.key.sriov_vlan_id = srv_vlanid;<br />         unicast_table.key.sriov_vlan_tpid = srv_tpid;<br />+        unicast_table.entry.hit_flag = 0;<br />+        unicast_table.entry.vfid = rte_cpu_to_be_16(vfid & 0x7ff);<br />  <br />         ZXDH_DTB_HASH_ENTRY_INFO_T dtb_hash_entry = {<br />             .p_actu_key = (uint8_t *)&unicast_table.key,<br />@@ -367,7 +365,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad<br />         };<br />  <br />         ZXDH_DTB_USER_ENTRY_T entry_get = {<br />-            .sdt_no = ZXDH_MAC_HASH_INDEX(hash_search_idx),<br />+            .sdt_no = ZXDH_UNIMAC_HASH_INDEX(hash_search_idx),<br />             .p_entry_data = (void *)&dtb_hash_entry<br />         };<br />         ret = zxdh_np_dtb_table_entry_get(hw->slot_id, hw->dev_sd->dtb_sd.queueid,<br />@@ -395,7 +393,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad<br />         };<br />  <br />         ZXDH_DTB_USER_ENTRY_T entry_get = {<br />-            .sdt_no = ZXDH_MAC_HASH_INDEX(hash_search_idx),<br />+            .sdt_no = ZXDH_MULTIMAC_HASH_INDEX(hash_search_idx),<br />             .p_entry_data = (void *)&dtb_hash_entry<br />         };<br />  <br />@@ -424,7 +422,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad<br />                 .p_rst = (uint8_t *)&multicast_table.entry<br />             };<br />             ZXDH_DTB_USER_ENTRY_T entry_get = {<br />-                .sdt_no = ZXDH_MAC_HASH_INDEX(hash_search_idx),<br />+                .sdt_no = ZXDH_MULTIMAC_HASH_INDEX(hash_search_idx),<br />                 .p_entry_data = (void *)&dtb_hash_entry<br />             };<br />  <br />@@ -449,7 +447,7 @@ zxdh_del_mac_table(struct zxdh_hw *hw, uint16_t vport, struct rte_ether_addr *ad<br />                     .p_rst = (uint8_t *)&multicast_table.entry<br />                 };<br />                 ZXDH_DTB_USER_ENTRY_T entry_get = {<br />-                    .sdt_no  = ZXDH_MAC_HASH_INDEX(hash_search_idx),<br />+                    .sdt_no  = ZXDH_MULTIMAC_HASH_INDEX(hash_search_idx),<br />                     .p_entry_data = (void *)&dtb_hash_entry<br />                 };<br />  <br />@@ -743,11 +741,12 @@ zxdh_vlan_filter_table_set(struct zxdh_hw *hw, uint16_t vport, uint16_t vlan_id,<br />     struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd;<br />     struct zxdh_vlan_filter_table vlan_table = {0};<br />     union zxdh_virport_num vport_num = (union zxdh_virport_num)vport;<br />+    uint16_t vfid = zxdh_vport_to_vfid(vport_num);<br />     int ret = 0;<br />  <br />     memset(&vlan_table, 0, sizeof(struct zxdh_vlan_filter_table));<br />     int table_num = vlan_id / ZXDH_VLAN_FILTER_VLANID_STEP;<br />-    uint32_t index = (table_num << 11) | vport_num.vfid;<br />+    uint32_t index = (table_num << 11) | vfid;<br />     uint16_t group = (vlan_id - table_num * ZXDH_VLAN_FILTER_VLANID_STEP) / 8 + 1;<br />  <br />     uint8_t val = sizeof(struct zxdh_vlan_filter_table) / sizeof(uint32_t);<br />@@ -800,6 +799,7 @@ zxdh_rss_table_set(struct zxdh_hw *hw, uint16_t vport, struct zxdh_rss_reta *rss<br />     struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd;<br />     struct zxdh_rss_to_vqid_table rss_vqid = {0};<br />     union zxdh_virport_num vport_num = (union zxdh_virport_num)vport;<br />+    uint16_t vfid = zxdh_vport_to_vfid(vport_num);<br />     int ret = 0;<br />  <br />     for (uint16_t i = 0; i < RTE_ETH_RSS_RETA_SIZE_256 / 8; i++) {<br />@@ -820,7 +820,7 @@ zxdh_rss_table_set(struct zxdh_hw *hw, uint16_t vport, struct zxdh_rss_reta *rss<br />             rss_vqid.vqm_qid[0] |= 0x8000;<br /> #endif<br />         ZXDH_DTB_ERAM_ENTRY_INFO_T entry = {<br />-            .index = vport_num.vfid * 32 + i,<br />+            .index = vfid * 32 + i,<br />             .p_data = (uint32_t *)&rss_vqid<br />         };<br />         ZXDH_DTB_USER_ENTRY_T user_entry_write = {<br />@@ -830,7 +830,7 @@ zxdh_rss_table_set(struct zxdh_hw *hw, uint16_t vport, struct zxdh_rss_reta *rss<br />         ret = zxdh_np_dtb_table_entry_write(hw->slot_id,<br />                     dtb_data->queueid, 1, &user_entry_write);<br />         if (ret != 0) {<br />-            PMD_DRV_LOG(ERR, "write rss base qid failed vfid:%d", vport_num.vfid);<br />+            PMD_DRV_LOG(ERR, "write rss base qid failed vfid:%d", vfid);<br />             return ret;<br />         }<br />     }<br />@@ -843,16 +843,17 @@ zxdh_rss_table_get(struct zxdh_hw *hw, uint16_t vport, struct zxdh_rss_reta *rss<br />     struct zxdh_dtb_shared_data *dtb_data = &hw->dev_sd->dtb_sd;<br />     struct zxdh_rss_to_vqid_table rss_vqid = {0};<br />     union zxdh_virport_num vport_num = (union zxdh_virport_num)vport;<br />+    uint16_t vfid = zxdh_vport_to_vfid(vport_num);<br />     int ret = 0;<br />  <br />     for (uint16_t i = 0; i < RTE_ETH_RSS_RETA_SIZE_256 / 8; i++) {<br />-        ZXDH_DTB_ERAM_ENTRY_INFO_T entry = {vport_num.vfid * 32 + i, (uint32_t *)&rss_vqid};<br />+        ZXDH_DTB_ERAM_ENTRY_INFO_T entry = {vfid * 32 + i, (uint32_t *)&rss_vqid};<br />         ZXDH_DTB_USER_ENTRY_T user_entry = {ZXDH_SDT_RSS_ATT_TABLE, &entry};<br />  <br />         ret = zxdh_np_dtb_table_entry_get(hw->slot_id,<br />                     dtb_data->queueid, &user_entry, 1);<br />         if (ret != 0) {<br />-            PMD_DRV_LOG(ERR, "get rss tbl failed, vfid:%d", vport_num.vfid);<br />+            PMD_DRV_LOG(ERR, "get rss tbl failed, vfid:%d", vfid);<br />             return -1;<br />         }<br />  <br />@@ -952,10 +953,11 @@ zxdh_set_port_vlan_attr(struct zxdh_hw *hw, uint16_t vport,<br />         struct zxdh_port_vlan_table *port_vlan)<br /> {<br />     union zxdh_virport_num vport_num = (union zxdh_virport_num)vport;<br />+    uint16_t vfid = zxdh_vport_to_vfid(vport_num);<br />     int ret = 0;<br />  <br />     ZXDH_DTB_ERAM_ENTRY_INFO_T port_entry = {<br />-        .index = vport_num.vfid,<br />+        .index = vfid,<br />         .p_data = (uint32_t *)port_vlan<br />     };<br />     ZXDH_DTB_USER_ENTRY_T entry = {<br />@@ -974,10 +976,11 @@ zxdh_get_port_vlan_attr(struct zxdh_hw *hw, uint16_t vport,<br />         struct zxdh_port_vlan_table *port_vlan)<br /> {<br />     union zxdh_virport_num vport_num = (union zxdh_virport_num)vport;<br />+    uint16_t vfid = zxdh_vport_to_vfid(vport_num);<br />     int ret = 0;<br />  <br />     ZXDH_DTB_ERAM_ENTRY_INFO_T port_entry = {<br />-        .index = vport_num.vfid,<br />+        .index = vfid,<br />         .p_data = (uint32_t *)port_vlan<br />     };<br />     ZXDH_DTB_USER_ENTRY_T entry = {<br />diff --git a/drivers/net/zxdh/zxdh_tables.h b/drivers/net/zxdh/zxdh_tables.h<br />index 2f2ada3a9f..cb34e38be8 100644<br />--- a/drivers/net/zxdh/zxdh_tables.h<br />+++ b/drivers/net/zxdh/zxdh_tables.h<br />@@ -9,7 +9,13 @@<br />  <br /> /* eram */<br /> #define ZXDH_SDT_VPORT_ATT_TABLE          1<br />-<br />+#define ZXDH_SDT_PANEL_ATT_TABLE          2<br />+#define ZXDH_SDT_RSS_ATT_TABLE            3<br />+#define ZXDH_SDT_VLAN_ATT_TABLE           4<br />+#define ZXDH_SDT_BROCAST_ATT_TABLE        6<br />+#define ZXDH_SDT_UNICAST_ATT_TABLE        10<br />+#define ZXDH_SDT_MULTICAST_ATT_TABLE      11<br />+#define ZXDH_SDT_PORT_VLAN_ATT_TABLE      16<br /> /* hash */<br /> #define ZXDH_SDT_L2_ENTRY_TABLE0          64<br /> #define ZXDH_SDT_L2_ENTRY_TABLE1          65<br />@@ -80,8 +86,6 @@<br /> #define ZXDH_MTR_STATS_EGRESS_BASE           0x7481<br /> #define ZXDH_MTR_STATS_INGRESS_BASE          0x7C81<br />  <br />-extern struct zxdh_dtb_shared_data g_dtb_data;<br />-<br /> struct zxdh_port_vlan_table {<br /> #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN<br />     uint16_t business_vlan_tpid:16;<br />@@ -233,19 +237,51 @@ struct zxdh_port_attr_table {<br /> };<br />  <br /> struct zxdh_panel_table {<br />-    uint16_t port_vfid_1588 : 11,<br />-             rsv2           : 5;<br />-    uint16_t pf_vfid        : 11,<br />-             rsv1           : 1,<br />-             enable_1588_tc : 2,<br />-             trust_mode     : 1,<br />-             hit_flag       : 1;<br />-    uint32_t mtu            : 16,<br />-             mtu_enable     : 1,<br />-             rsv            : 3,<br />-             tm_base_queue  : 12;<br />-    uint32_t rsv_1;<br />-    uint32_t rsv_2;<br />+#if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN<br />+    uint16_t port_vfid_1588   : 11,<br />+                rsv2             : 5;<br />+    uint16_t rsv1             : 11,<br />+             tm_shape_enable  : 1,<br />+             enable_1588_tc   : 2,<br />+             trust_mode       : 1,<br />+             hit_flag         : 1;<br />+    uint16_t mtu              : 16;<br />+    uint16_t mtu_enable       : 1,<br />+             rsv              : 3,<br />+             tm_base_queue    : 12;<br />+    uint16_t lacp_pf_qid      : 12,<br />+                rsv5             : 4;<br />+    uint16_t lacp_pf_vfid     : 11,<br />+                rsv6             : 2,<br />+                member_port_up   : 1,<br />+                bond_link_up     : 1,<br />+                hw_bond_enable   : 1;<br />+    uint16_t rsv3             : 16;<br />+    uint16_t pf_vfid          : 11,<br />+                rsv4             : 5;<br />+#else<br />+    uint16_t rsv1             : 11,<br />+                tm_shape_enable  : 1,<br />+                enable_1588_tc   : 2,<br />+                trust_mode       : 1,<br />+                hit_flag         : 1;<br />+    uint16_t port_vfid_1588   : 11,<br />+                rsv2             : 5;<br />+    uint16_t mtu_enable       : 1,<br />+                rsv              : 3,<br />+                tm_base_queue    : 12;<br />+    uint16_t mtu              : 16;<br />+    uint16_t lacp_pf_vfid     : 11,<br />+                rsv6             : 2,<br />+                member_port_up   : 1,<br />+                bond_link_up     : 1,<br />+                hw_bond_enable   : 1;<br />+    uint16_t lacp_pf_qid      : 12,<br />+                rsv5             : 4;<br />+    uint16_t pf_vfid          : 11,<br />+                rsv4             : 5;<br />+    uint16_t rsv3             : 16;<br />+#endif<br /> }; /* 16B */<br />  <br /> struct zxdh_mac_unicast_key {<br />--  <br />2.27.0<br />