provided CSUM/TSO/LRO config.

Signed-off-by: Junlong Wang <wang.junlo...@zte.com.cn>
---
 doc/guides/nics/features/zxdh.ini |  5 ++
 doc/guides/nics/zxdh.rst          |  3 +
 drivers/net/zxdh/zxdh_ethdev.c    | 93 +++++++++++++++++++++++++++++++
 drivers/net/zxdh/zxdh_msg.c       | 15 +++++
 4 files changed, 116 insertions(+)

diff --git a/doc/guides/nics/features/zxdh.ini 
b/doc/guides/nics/features/zxdh.ini
index 3561e31666..c80b6dffbb 100644
--- a/doc/guides/nics/features/zxdh.ini
+++ b/doc/guides/nics/features/zxdh.ini
@@ -25,3 +25,8 @@ Inner RSS            = Y
 Basic stats          = Y
 Stats per queue      = Y
 MTU update           = Y
+L3 checksum offload  = Y
+Inner L3 checksum    = Y
+Inner L4 checksum    = Y
+LRO                  = Y
+TSO                  = Y
diff --git a/doc/guides/nics/zxdh.rst b/doc/guides/nics/zxdh.rst
index 30179c4e6f..bb3ec2c293 100644
--- a/doc/guides/nics/zxdh.rst
+++ b/doc/guides/nics/zxdh.rst
@@ -36,6 +36,9 @@ Features of the ZXDH PMD are:
 - Port hardware statistics
 - MTU update
 - Jumbo frames
+- Inner and Outer Checksum offload
+- Hardware LRO
+- Hardware TSO for generic IP or UDP tunnel, including VXLAN
 
 
 Driver compilation and testing
diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c
index 37225fb95a..e58891dc32 100644
--- a/drivers/net/zxdh/zxdh_ethdev.c
+++ b/drivers/net/zxdh/zxdh_ethdev.c
@@ -837,6 +837,93 @@ zxdh_vlan_offload_configure(struct rte_eth_dev *dev)
        return 0;
 }
 
+static int
+zxdh_rx_csum_lro_offload_configure(struct rte_eth_dev *dev)
+{
+       struct zxdh_hw *hw = dev->data->dev_private;
+       struct rte_eth_rxmode *rxmode = &dev->data->dev_conf.rxmode;
+       uint32_t need_accelerator = rxmode->offloads & 
(RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM |
+               RTE_ETH_RX_OFFLOAD_IPV4_CKSUM |
+               RTE_ETH_RX_OFFLOAD_UDP_CKSUM |
+               RTE_ETH_RX_OFFLOAD_TCP_CKSUM |
+               RTE_ETH_RX_OFFLOAD_TCP_LRO);
+       int ret;
+
+       if (hw->is_pf) {
+               struct zxdh_port_attr_table port_attr = {0};
+               zxdh_get_port_attr(hw, hw->vport.vport, &port_attr);
+               port_attr.outer_ip_checksum_offload =
+                       (rxmode->offloads & 
RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM) ? true : false;
+               port_attr.ip_checksum_offload =
+                       (rxmode->offloads & RTE_ETH_RX_OFFLOAD_IPV4_CKSUM) ? 
true : false;
+               port_attr.tcp_udp_checksum_offload  =
+               (rxmode->offloads & (RTE_ETH_RX_OFFLOAD_UDP_CKSUM | 
RTE_ETH_RX_OFFLOAD_TCP_CKSUM))
+                                       ? true : false;
+               port_attr.lro_offload =
+                               (rxmode->offloads & RTE_ETH_RX_OFFLOAD_TCP_LRO) 
? true : false;
+               port_attr.accelerator_offload_flag  = need_accelerator ? true : 
false;
+               ret = zxdh_set_port_attr(hw, hw->vport.vport, &port_attr);
+               if (ret) {
+                       PMD_DRV_LOG(ERR, "%s set port attr failed", __func__);
+                       return -1;
+               }
+       } else {
+               struct zxdh_msg_info msg_info = {0};
+               struct zxdh_port_attr_set_msg *attr_msg = 
&msg_info.data.port_attr_msg;
+
+               zxdh_msg_head_build(hw, ZXDH_PORT_ATTRS_SET, &msg_info);
+               attr_msg->mode = ZXDH_PORT_IP_CHKSUM_FLAG;
+               attr_msg->value =
+                       (rxmode->offloads & 
RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM) ? true : false;
+               ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), 
NULL, 0);
+               if (ret) {
+                       PMD_DRV_LOG(ERR, "%s outer ip cksum config failed", 
__func__);
+                       return -1;
+               }
+
+               zxdh_msg_head_build(hw, ZXDH_PORT_ATTRS_SET, &msg_info);
+               attr_msg->mode = ZXDH_PORT_OUTER_IP_CHECKSUM_OFFLOAD_FLAG;
+               attr_msg->value = (rxmode->offloads & 
RTE_ETH_RX_OFFLOAD_IPV4_CKSUM) ? true : false;
+               ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), 
NULL, 0);
+               if (ret) {
+                       PMD_DRV_LOG(ERR, "%s ip_checksum config failed to send 
msg", __func__);
+                       return -1;
+               }
+
+               zxdh_msg_head_build(hw, ZXDH_PORT_ATTRS_SET, &msg_info);
+               attr_msg->mode = ZXDH_PORT_TCP_UDP_CHKSUM_FLAG;
+               attr_msg->value = (rxmode->offloads &
+                       (RTE_ETH_RX_OFFLOAD_UDP_CKSUM | 
RTE_ETH_RX_OFFLOAD_TCP_CKSUM)) ?
+                               true : false;
+               ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), 
NULL, 0);
+               if (ret) {
+                       PMD_DRV_LOG(ERR, "%s tcp_udp_checksum config failed to 
send msg", __func__);
+                       return -1;
+               }
+
+               zxdh_msg_head_build(hw, ZXDH_PORT_ATTRS_SET, &msg_info);
+               attr_msg->mode = ZXDH_PORT_LRO_OFFLOAD_FLAG;
+               attr_msg->value = (rxmode->offloads & 
RTE_ETH_RX_OFFLOAD_TCP_LRO) ? true : false;
+               ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), 
NULL, 0);
+               if (ret) {
+                       PMD_DRV_LOG(ERR, "%s lro offload config failed to send 
msg", __func__);
+                       return -1;
+               }
+
+               zxdh_msg_head_build(hw, ZXDH_PORT_ATTRS_SET, &msg_info);
+               attr_msg->mode = ZXDH_PORT_ACCELERATOR_OFFLOAD_FLAG_FLAG;
+               attr_msg->value = need_accelerator ? true : false;
+               ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), 
NULL, 0);
+               if (ret) {
+                       PMD_DRV_LOG(ERR,
+                               "%s accelerator offload config failed to send 
msg", __func__);
+                       return -1;
+               }
+       }
+
+       return 0;
+}
+
 static int
 zxdh_dev_conf_offload(struct rte_eth_dev *dev)
 {
@@ -854,6 +941,12 @@ zxdh_dev_conf_offload(struct rte_eth_dev *dev)
                return ret;
        }
 
+       ret = zxdh_rx_csum_lro_offload_configure(dev);
+       if (ret) {
+               PMD_DRV_LOG(ERR, "rx csum lro configure failed");
+               return ret;
+       }
+
        return 0;
 }
 
diff --git a/drivers/net/zxdh/zxdh_msg.c b/drivers/net/zxdh/zxdh_msg.c
index 3f2af9d739..24894f2a42 100644
--- a/drivers/net/zxdh/zxdh_msg.c
+++ b/drivers/net/zxdh/zxdh_msg.c
@@ -1698,6 +1698,21 @@ zxdh_vf_port_attr_set(struct zxdh_hw *pf_hw, uint16_t 
vport, void *cfg_data,
        case ZXDH_PORT_VPORT_IS_UP_FLAG:
                port_attr.is_up = attr_msg->value;
                break;
+       case ZXDH_PORT_OUTER_IP_CHECKSUM_OFFLOAD_FLAG:
+               port_attr.outer_ip_checksum_offload = attr_msg->value;
+               break;
+       case ZXDH_PORT_IP_CHKSUM_FLAG:
+               port_attr.ip_checksum_offload = attr_msg->value;
+               break;
+       case ZXDH_PORT_TCP_UDP_CHKSUM_FLAG:
+               port_attr.tcp_udp_checksum_offload = attr_msg->value;
+               break;
+       case ZXDH_PORT_ACCELERATOR_OFFLOAD_FLAG_FLAG:
+               port_attr.accelerator_offload_flag = attr_msg->value;
+               break;
+       case ZXDH_PORT_LRO_OFFLOAD_FLAG:
+               port_attr.lro_offload = attr_msg->value;
+               break;
        default:
                PMD_DRV_LOG(ERR, "unsupported attr 0x%x set", attr_msg->mode);
                return -1;
-- 
2.27.0

Reply via email to