provided CSUM/TSO/LRO config. Signed-off-by: Junlong Wang --- 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