[PATCH v1 12/16] net/zxdh: provided csum/tso/lro config

Junlong Wang wang.junlong1 at zte.com.cn
Thu Feb 13 07:41:28 CET 2025


provided csum/tso/lro config.

Signed-off-by: Junlong Wang <wang.junlong1 at zte.com.cn>
---
 drivers/net/zxdh/zxdh_ethdev.c | 92 ++++++++++++++++++++++++++++++++++
 drivers/net/zxdh/zxdh_msg.c    | 15 ++++++
 2 files changed, 107 insertions(+)

diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c
index 0ae3ab0f81..d475f54e60 100644
--- a/drivers/net/zxdh/zxdh_ethdev.c
+++ b/drivers/net/zxdh/zxdh_ethdev.c
@@ -839,6 +839,92 @@ 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)
 {
@@ -856,6 +942,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 657527675b..0790cb2291 100644
--- a/drivers/net/zxdh/zxdh_msg.c
+++ b/drivers/net/zxdh/zxdh_msg.c
@@ -1678,6 +1678,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, "unsupport attr 0x%x set", attr_msg->mode);
 		return -1;
-- 
2.27.0
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mails.dpdk.org/archives/dev/attachments/20250213/ee4ee831/attachment.htm>


More information about the dev mailing list