provided CSUM/TSO/LRO config.<br /> <br />Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> <br />---<br /> doc/guides/nics/features/zxdh.ini |  5 ++<br /> doc/guides/nics/zxdh.rst          |  3 +<br /> drivers/net/zxdh/zxdh_ethdev.c    | 92 +++++++++++++++++++++++++++++++<br /> drivers/net/zxdh/zxdh_msg.c       | 15 +++++<br /> 4 files changed, 115 insertions(+)<br /> <br />diff --git a/doc/guides/nics/features/zxdh.ini b/doc/guides/nics/features/zxdh.ini<br />index 3561e31666..c80b6dffbb 100644<br />--- a/doc/guides/nics/features/zxdh.ini<br />+++ b/doc/guides/nics/features/zxdh.ini<br />@@ -25,3 +25,8 @@ Inner RSS            = Y<br /> Basic stats          = Y<br /> Stats per queue      = Y<br /> MTU update           = Y<br />+L3 checksum offload  = Y<br />+Inner L3 checksum    = Y<br />+Inner L4 checksum    = Y<br />+LRO                  = Y<br />+TSO                  = Y<br />diff --git a/doc/guides/nics/zxdh.rst b/doc/guides/nics/zxdh.rst<br />index 30179c4e6f..bb3ec2c293 100644<br />--- a/doc/guides/nics/zxdh.rst<br />+++ b/doc/guides/nics/zxdh.rst<br />@@ -36,6 +36,9 @@ Features of the ZXDH PMD are:<br /> - Port hardware statistics<br /> - MTU update<br /> - Jumbo frames<br />+- Inner and Outer Checksum offload<br />+- Hardware LRO<br />+- Hardware TSO for generic IP or UDP tunnel, including VXLAN<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 e170da7d07..30ddb463a2 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev.c<br />@@ -837,6 +837,92 @@ zxdh_vlan_offload_configure(struct rte_eth_dev *dev)<br />     return 0;<br /> }<br />  <br />+static int<br />+zxdh_rx_csum_lro_offload_configure(struct rte_eth_dev *dev)<br />+{<br />+    struct zxdh_hw *hw = dev->data->dev_private;<br />+    struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;<br />+    uint32_t need_accelerator = rxmode->offloads & (RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM |<br />+        RTE_ETH_RX_OFFLOAD_IPV4_CKSUM |<br />+        RTE_ETH_RX_OFFLOAD_UDP_CKSUM |<br />+        RTE_ETH_RX_OFFLOAD_TCP_CKSUM |<br />+        RTE_ETH_RX_OFFLOAD_TCP_LRO);<br />+    int ret;<br />+<br />+    if (hw->is_pf) {<br />+        struct zxdh_port_attr_table port_attr = {0};<br />+        zxdh_get_port_attr(hw, hw->vport.vport, &port_attr);<br />+        port_attr.outer_ip_checksum_offload =<br />+            (rxmode->offloads & RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM) ? true : false;<br />+        port_attr.ip_checksum_offload =<br />+            (rxmode->offloads & RTE_ETH_RX_OFFLOAD_IPV4_CKSUM) ? true : false;<br />+        port_attr.tcp_udp_checksum_offload  =<br />+        (rxmode->offloads & (RTE_ETH_RX_OFFLOAD_UDP_CKSUM | RTE_ETH_RX_OFFLOAD_TCP_CKSUM))<br />+                    ? true : false;<br />+        port_attr.lro_offload =<br />+                (rxmode->offloads & RTE_ETH_RX_OFFLOAD_TCP_LRO) ? true : false;<br />+        port_attr.accelerator_offload_flag  = need_accelerator ? true : false;<br />+        ret = zxdh_set_port_attr(hw, hw->vport.vport, &port_attr);<br />+        if (ret) {<br />+            PMD_DRV_LOG(ERR, "%s set port attr failed", __func__);<br />+            return -1;<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_IP_CHKSUM_FLAG;<br />+        attr_msg->value =<br />+            (rxmode->offloads & RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM) ? true : false;<br />+        ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), NULL, 0);<br />+        if (ret) {<br />+            PMD_DRV_LOG(ERR, "%s outer ip cksum config failed", __func__);<br />+            return -1;<br />+        }<br />+<br />+        zxdh_msg_head_build(hw, ZXDH_PORT_ATTRS_SET, &msg_info);<br />+        attr_msg->mode = ZXDH_PORT_OUTER_IP_CHECKSUM_OFFLOAD_FLAG;<br />+        attr_msg->value = (rxmode->offloads & RTE_ETH_RX_OFFLOAD_IPV4_CKSUM) ? true : false;<br />+        ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), NULL, 0);<br />+        if (ret) {<br />+            PMD_DRV_LOG(ERR, "%s ip_checksum config failed to send msg", __func__);<br />+            return -1;<br />+        }<br />+<br />+        zxdh_msg_head_build(hw, ZXDH_PORT_ATTRS_SET, &msg_info);<br />+        attr_msg->mode = ZXDH_PORT_TCP_UDP_CHKSUM_FLAG;<br />+        attr_msg->value = (rxmode->offloads & <br />+            (RTE_ETH_RX_OFFLOAD_UDP_CKSUM | RTE_ETH_RX_OFFLOAD_TCP_CKSUM)) ? true : false;<br />+        ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), NULL, 0);<br />+        if (ret) {<br />+            PMD_DRV_LOG(ERR, "%s tcp_udp_checksum config failed to send msg", __func__);<br />+            return -1;<br />+        }<br />+<br />+        zxdh_msg_head_build(hw, ZXDH_PORT_ATTRS_SET, &msg_info);<br />+        attr_msg->mode = ZXDH_PORT_LRO_OFFLOAD_FLAG;<br />+        attr_msg->value = (rxmode->offloads & RTE_ETH_RX_OFFLOAD_TCP_LRO) ? true : false;<br />+        ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), NULL, 0);<br />+        if (ret) {<br />+            PMD_DRV_LOG(ERR, "%s lro offload config failed to send msg", __func__);<br />+            return -1;<br />+        }<br />+<br />+        zxdh_msg_head_build(hw, ZXDH_PORT_ATTRS_SET, &msg_info);<br />+        attr_msg->mode = ZXDH_PORT_ACCELERATOR_OFFLOAD_FLAG_FLAG;<br />+        attr_msg->value = need_accelerator ? true : false;<br />+        ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), NULL, 0);<br />+        if (ret) {<br />+            PMD_DRV_LOG(ERR,<br />+                "%s accelerator offload config failed to send msg", __func__);<br />+            return -1;<br />+        }<br />+    }<br />+<br />+    return 0;<br />+}<br />+<br /> static int<br /> zxdh_dev_conf_offload(struct rte_eth_dev *dev)<br /> {<br />@@ -854,6 +940,12 @@ zxdh_dev_conf_offload(struct rte_eth_dev *dev)<br />         return ret;<br />     }<br />  <br />+    ret = zxdh_rx_csum_lro_offload_configure(dev);<br />+    if (ret) {<br />+        PMD_DRV_LOG(ERR, "rx csum lro configure failed");<br />+        return ret;<br />+    }<br />+<br />     return 0;<br /> }<br />  <br />diff --git a/drivers/net/zxdh/zxdh_msg.c b/drivers/net/zxdh/zxdh_msg.c<br />index 4367c25ac2..32e07d2b5d 100644<br />--- a/drivers/net/zxdh/zxdh_msg.c<br />+++ b/drivers/net/zxdh/zxdh_msg.c<br />@@ -1700,6 +1700,21 @@ zxdh_vf_port_attr_set(struct zxdh_hw *pf_hw, uint16_t vport, void *cfg_data,<br />     case ZXDH_PORT_VPORT_IS_UP_FLAG:<br />         port_attr.is_up = attr_msg->value;<br />         break;<br />+    case ZXDH_PORT_OUTER_IP_CHECKSUM_OFFLOAD_FLAG:<br />+        port_attr.outer_ip_checksum_offload = attr_msg->value;<br />+        break;<br />+    case ZXDH_PORT_IP_CHKSUM_FLAG:<br />+        port_attr.ip_checksum_offload = attr_msg->value;<br />+        break;<br />+    case ZXDH_PORT_TCP_UDP_CHKSUM_FLAG:<br />+        port_attr.tcp_udp_checksum_offload = attr_msg->value;<br />+        break;<br />+    case ZXDH_PORT_ACCELERATOR_OFFLOAD_FLAG_FLAG:<br />+        port_attr.accelerator_offload_flag = attr_msg->value;<br />+        break;<br />+    case ZXDH_PORT_LRO_OFFLOAD_FLAG:<br />+        port_attr.lro_offload = attr_msg->value;<br />+        break;<br />     default:<br />         PMD_DRV_LOG(ERR, "unsupported attr 0x%x set", attr_msg->mode);<br />         return -1;<br />--  <br />2.27.0<br />