mtu update ops implementations.<br /> <br />Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> <br />---<br /> doc/guides/nics/features/zxdh.ini  |  1 +<br /> doc/guides/nics/zxdh.rst           |  2 +<br /> drivers/net/zxdh/zxdh_ethdev.c     |  4 ++<br /> drivers/net/zxdh/zxdh_ethdev_ops.c | 78 ++++++++++++++++++++++++++++++<br /> drivers/net/zxdh/zxdh_ethdev_ops.h |  3 ++<br /> drivers/net/zxdh/zxdh_tables.c     | 42 ++++++++++++++++<br /> drivers/net/zxdh/zxdh_tables.h     |  4 ++<br /> 7 files changed, 134 insertions(+)<br /> <br />diff --git a/doc/guides/nics/features/zxdh.ini b/doc/guides/nics/features/zxdh.ini<br />index 98c141cf95..3561e31666 100644<br />--- a/doc/guides/nics/features/zxdh.ini<br />+++ b/doc/guides/nics/features/zxdh.ini<br />@@ -24,3 +24,4 @@ RSS reta update      = Y<br /> Inner RSS            = Y<br /> Basic stats          = Y<br /> Stats per queue      = Y<br />+MTU update           = Y<br />diff --git a/doc/guides/nics/zxdh.rst b/doc/guides/nics/zxdh.rst<br />index c8a52b587c..58e0c49a2e 100644<br />--- a/doc/guides/nics/zxdh.rst<br />+++ b/doc/guides/nics/zxdh.rst<br />@@ -33,6 +33,8 @@ Features of the ZXDH PMD are:<br /> - QINQ stripping and inserting<br /> - Receive Side Scaling (RSS)<br /> - Port hardware statistics<br />+- MTU update<br />+- Jumbo frames<br />  <br />  <br /> Driver compilation and testing<br />diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c<br />index 1238bb048d..72db51973d 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev.c<br />@@ -63,6 +63,9 @@ zxdh_dev_infos_get(struct rte_eth_dev *dev,<br />  <br />     dev_info->reta_size = RTE_ETH_RSS_RETA_SIZE_256;<br />     dev_info->flow_type_rss_offloads = ZXDH_RSS_HF;<br />+    dev_info->max_mtu = ZXDH_MAX_RX_PKTLEN - RTE_ETHER_HDR_LEN -<br />+        RTE_VLAN_HLEN - ZXDH_DL_NET_HDR_SIZE;<br />+    dev_info->min_mtu = ZXDH_ETHER_MIN_MTU;<br />  <br />     dev_info->tx_offload_capa = (RTE_ETH_TX_OFFLOAD_MULTI_SEGS);<br />     dev_info->tx_offload_capa |= (RTE_ETH_TX_OFFLOAD_TCP_TSO |<br />@@ -1153,6 +1156,7 @@ static const struct eth_dev_ops zxdh_eth_dev_ops = {<br />     .rss_hash_conf_get         = zxdh_rss_hash_conf_get,<br />     .stats_get                 = zxdh_dev_stats_get,<br />     .stats_reset             = zxdh_dev_stats_reset,<br />+    .mtu_set                 = zxdh_dev_mtu_set,<br /> };<br />  <br /> static int32_t<br />diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.c b/drivers/net/zxdh/zxdh_ethdev_ops.c<br />index 9c131cc56d..bea27a2a57 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev_ops.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev_ops.c<br />@@ -13,6 +13,7 @@<br /> #include "zxdh_logs.h" <br /> #include "zxdh_rxtx.h" <br /> #include "zxdh_np.h" <br />+#include "zxdh_queue.h" <br />  <br /> #define ZXDH_VLAN_FILTER_GROUPS       64<br /> #define ZXDH_INVALID_LOGIC_QID        0xFFFFU<br />@@ -1513,3 +1514,80 @@ int zxdh_dev_stats_reset(struct rte_eth_dev *dev)<br />  <br />     return 0;<br /> }<br />+<br />+int zxdh_dev_mtu_set(struct rte_eth_dev *dev, uint16_t new_mtu)<br />+{<br />+    struct zxdh_hw *hw = dev->data->dev_private;<br />+    struct zxdh_panel_table panel = {0};<br />+    struct zxdh_port_attr_table vport_att = {0};<br />+    uint16_t vfid = zxdh_vport_to_vfid(hw->vport);<br />+    uint16_t max_mtu = 0;<br />+    int ret = 0;<br />+<br />+    max_mtu = ZXDH_MAX_RX_PKTLEN - RTE_ETHER_HDR_LEN - RTE_VLAN_HLEN - ZXDH_DL_NET_HDR_SIZE;<br />+    if (new_mtu < ZXDH_ETHER_MIN_MTU || new_mtu > max_mtu) {<br />+        PMD_DRV_LOG(ERR, "invalid mtu:%d, range[%d, %d]",<br />+                new_mtu, ZXDH_ETHER_MIN_MTU, max_mtu);<br />+        return -EINVAL;<br />+    }<br />+<br />+    if (dev->data->mtu == new_mtu)<br />+        return 0;<br />+<br />+    if (hw->is_pf) {<br />+        memset(&panel, 0, sizeof(panel));<br />+        memset(&vport_att, 0, sizeof(vport_att));<br />+        ret = zxdh_get_panel_attr(dev, &panel);<br />+        if (ret != 0) {<br />+            PMD_DRV_LOG(ERR, "get_panel_attr ret:%d", ret);<br />+            return -1;<br />+        }<br />+<br />+        ret = zxdh_get_port_attr(vfid, &vport_att);<br />+        if (ret != 0) {<br />+            PMD_DRV_LOG(ERR,<br />+                "[vfid:%d] zxdh_dev_mtu, get vport dpp_ret:%d", vfid, ret);<br />+            return -1;<br />+        }<br />+<br />+        panel.mtu = new_mtu;<br />+        panel.mtu_enable = 1;<br />+        ret = zxdh_set_panel_attr(dev, &panel);<br />+        if (ret != 0) {<br />+            PMD_DRV_LOG(ERR, "set zxdh_dev_mtu failed, ret:%u", ret);<br />+            return ret;<br />+        }<br />+<br />+        vport_att.mtu_enable = 1;<br />+        vport_att.mtu = new_mtu;<br />+        ret = zxdh_set_port_attr(vfid, &vport_att);<br />+        if (ret != 0) {<br />+            PMD_DRV_LOG(ERR,<br />+                "[vfid:%d] zxdh_dev_mtu, set vport dpp_ret:%d", vfid, ret);<br />+            return ret;<br />+        }<br />+    } else {<br />+        struct zxdh_msg_info msg_info = {0};<br />+        struct zxdh_port_attr_set_msg *attr_msg = &msg_info.data.port_attr_msg;<br />+<br />+        zxdh_msg_head_build(hw, ZXDH_PORT_ATTRS_SET, &msg_info);<br />+        attr_msg->mode = ZXDH_PORT_MTU_EN_FLAG;<br />+        attr_msg->value = 1;<br />+        ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), NULL, 0);<br />+        if (ret) {<br />+            PMD_DRV_LOG(ERR, "Failed to send msg: port 0x%x msg type %d ",<br />+                hw->vport.vport, ZXDH_PORT_MTU_EN_FLAG);<br />+            return ret;<br />+        }<br />+        attr_msg->mode = ZXDH_PORT_MTU_FLAG;<br />+        attr_msg->value = new_mtu;<br />+        ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), NULL, 0);<br />+        if (ret) {<br />+            PMD_DRV_LOG(ERR, "Failed to send msg: port 0x%x msg type %d ",<br />+                hw->vport.vport, ZXDH_PORT_MTU_FLAG);<br />+            return ret;<br />+        }<br />+    }<br />+    dev->data->mtu = new_mtu;<br />+    return 0;<br />+}<br />diff --git a/drivers/net/zxdh/zxdh_ethdev_ops.h b/drivers/net/zxdh/zxdh_ethdev_ops.h<br />index f35378e691..fac6cbd5e8 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev_ops.h<br />+++ b/drivers/net/zxdh/zxdh_ethdev_ops.h<br />@@ -26,6 +26,8 @@<br /> #define ZXDH_HF_MAC_VLAN_ETH  ZXDH_ETH_RSS_L2<br /> #define ZXDH_RSS_HF  ((ZXDH_HF_MAC_VLAN_ETH | ZXDH_HF_F3_ETH | ZXDH_HF_F5_ETH))<br />  <br />+#define ZXDH_ETHER_MIN_MTU     68<br />+<br /> struct zxdh_hw_vqm_stats {<br />     uint64_t rx_total;<br />     uint64_t tx_total;<br />@@ -73,5 +75,6 @@ int zxdh_rss_hash_conf_get(struct rte_eth_dev *dev, struct rte_eth_rss_conf *rss<br /> int zxdh_rss_configure(struct rte_eth_dev *dev);<br /> int zxdh_dev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats);<br /> int zxdh_dev_stats_reset(struct rte_eth_dev *dev);<br />+int zxdh_dev_mtu_set(struct rte_eth_dev *dev, uint16_t new_mtu);<br />  <br /> #endif /* ZXDH_ETHDEV_OPS_H */<br />diff --git a/drivers/net/zxdh/zxdh_tables.c b/drivers/net/zxdh/zxdh_tables.c<br />index 83de96b24d..bf6f9f6b2a 100644<br />--- a/drivers/net/zxdh/zxdh_tables.c<br />+++ b/drivers/net/zxdh/zxdh_tables.c<br />@@ -165,6 +165,48 @@ zxdh_panel_table_init(struct rte_eth_dev *dev)<br />     return ret;<br /> }<br />  <br />+int zxdh_get_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_attr)<br />+{<br />+    struct zxdh_hw *hw = dev->data->dev_private;<br />+    uint8_t index_phy_port = hw->phyport;<br />+<br />+    ZXDH_DTB_ERAM_ENTRY_INFO_T panel_entry = {<br />+        .index = index_phy_port,<br />+        .p_data = (uint32_t *)panel_attr<br />+    };<br />+    ZXDH_DTB_USER_ENTRY_T entry = {<br />+        .sdt_no = ZXDH_SDT_PANEL_ATT_TABLE,<br />+        .p_entry_data = (void *)&panel_entry<br />+    };<br />+    int ret = zxdh_np_dtb_table_entry_get(ZXDH_DEVICE_NO, g_dtb_data.queueid, &entry, 1);<br />+<br />+    if (ret != 0)<br />+        PMD_DRV_LOG(ERR, "get panel table failed");<br />+<br />+    return ret;<br />+}<br />+<br />+int zxdh_set_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_attr)<br />+{<br />+    struct zxdh_hw *hw = dev->data->dev_private;<br />+    uint8_t index_phy_port = hw->phyport;<br />+<br />+    ZXDH_DTB_ERAM_ENTRY_INFO_T panel_entry = {<br />+        .index = index_phy_port,<br />+        .p_data = (uint32_t *)panel_attr<br />+    };<br />+    ZXDH_DTB_USER_ENTRY_T entry = {<br />+        .sdt_no = ZXDH_SDT_PANEL_ATT_TABLE,<br />+        .p_entry_data = (void *)&panel_entry<br />+    };<br />+    int ret = zxdh_np_dtb_table_entry_write(ZXDH_DEVICE_NO, g_dtb_data.queueid, 1, &entry);<br />+<br />+    if (ret)<br />+        PMD_DRV_LOG(ERR, "Insert panel table failed");<br />+<br />+    return ret;<br />+}<br />+<br /> int<br /> zxdh_set_mac_table(uint16_t vport, struct rte_ether_addr *addr,  uint8_t hash_search_idx)<br /> {<br />diff --git a/drivers/net/zxdh/zxdh_tables.h b/drivers/net/zxdh/zxdh_tables.h<br />index e697744c23..f7591cd948 100644<br />--- a/drivers/net/zxdh/zxdh_tables.h<br />+++ b/drivers/net/zxdh/zxdh_tables.h<br />@@ -7,8 +7,10 @@<br />  <br /> #include <stdint.h> <br />  <br />+#define ZXDH_PORT_MTU_FLAG                9<br /> #define ZXDH_PORT_BASE_QID_FLAG           10<br /> #define ZXDH_PORT_ATTR_IS_UP_FLAG         35<br />+#define ZXDH_PORT_MTU_EN_FLAG             42<br />  <br /> #define ZXDH_MTU_STATS_EGRESS_BASE        0x8481<br /> #define ZXDH_MTU_STATS_INGRESS_BASE       0x8981<br />@@ -224,5 +226,7 @@ int zxdh_vlan_filter_table_init(struct rte_eth_dev *dev);<br /> int zxdh_vlan_filter_table_set(uint16_t vport, uint16_t vlan_id, uint8_t enable);<br /> int zxdh_rss_table_set(uint16_t vport, struct zxdh_rss_reta *rss_reta);<br /> int zxdh_rss_table_get(uint16_t vport, struct zxdh_rss_reta *rss_reta);<br />+int zxdh_get_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_attr);<br />+int zxdh_set_panel_attr(struct rte_eth_dev *dev, struct zxdh_panel_table *panel_attr);<br />  <br /> #endif /* ZXDH_TABLES_H */<br />--  <br />2.27.0<br />