From 3e77709d16ee143ba3fb10c522f320bd062926f0 Mon Sep 17 00:00:00 2001 From: Rong Qian Date: Tue, 27 May 2025 14:52:08 +0800 Subject: [PATCH] net/xsc: optimize rx (cherry picked from commit 98c9b537a8e204cbdb13eb0dfc5fcc85de4c8d63) --- 0094-net-xsc-optimize-rx.patch | 494 +++++++++++++++++++++++++++++++++ dpdk.spec | 7 +- 2 files changed, 500 insertions(+), 1 deletion(-) create mode 100644 0094-net-xsc-optimize-rx.patch diff --git a/0094-net-xsc-optimize-rx.patch b/0094-net-xsc-optimize-rx.patch new file mode 100644 index 0000000..9153329 --- /dev/null +++ b/0094-net-xsc-optimize-rx.patch @@ -0,0 +1,494 @@ +From e8e7ac0baad21557a7c3d4da2114dc1004445f32 Mon Sep 17 00:00:00 2001 +From: Rong Qian +Date: Tue, 27 May 2025 14:38:22 +0800 +Subject: [PATCH] net/xsc: optimize rx + +--- + drivers/net/xsc/xsc_compat.c | 4 +- + drivers/net/xsc/xsc_compat.h | 22 +++---- + drivers/net/xsc/xsc_dev.c | 4 +- + drivers/net/xsc/xsc_dev.h | 2 + + drivers/net/xsc/xsc_ethdev.c | 14 ++++- + drivers/net/xsc/xsc_log.h | 7 +-- + drivers/net/xsc/xsc_np.c | 1 + + drivers/net/xsc/xsc_rdma.c | 2 +- + drivers/net/xsc/xsc_rx.c | 41 ++++++++++++-- + drivers/net/xsc/xsc_rx.h | 1 + + drivers/net/xsc/xsc_vfio.c | 107 +++++++++++++++++++++++++---------- + 11 files changed, 140 insertions(+), 65 deletions(-) + +diff --git a/drivers/net/xsc/xsc_compat.c b/drivers/net/xsc/xsc_compat.c +index 4913ec9..8bee4c0 100644 +--- a/drivers/net/xsc/xsc_compat.c ++++ b/drivers/net/xsc/xsc_compat.c +@@ -4,12 +4,10 @@ + + #include "xsc_compat.h" + +-#if RTE_VERSION_NUM(22, 0, 0, 0) > RTE_VERSION + uint16_t +-rte_eth_pkt_burst_dummy(void *queue __rte_unused, ++xsc_eth_pkt_burst_dummy(void *queue __rte_unused, + struct rte_mbuf **pkts __rte_unused, + uint16_t nb_pkts __rte_unused) + { + return 0; + } +-#endif +diff --git a/drivers/net/xsc/xsc_compat.h b/drivers/net/xsc/xsc_compat.h +index a57d817..e2ac3eb 100644 +--- a/drivers/net/xsc/xsc_compat.h ++++ b/drivers/net/xsc/xsc_compat.h +@@ -24,23 +24,15 @@ + #endif + #endif + +-#if RTE_VERSION_NUM(22, 0, 0, 0) > RTE_VERSION +-/** +- * @internal +- * Dummy DPDK callback for Rx/Tx packet burst. +- * +- * @param queue +- * Pointer to Rx/Tx queue +- * @param pkts +- * Packet array +- * @param nb_pkts +- * Number of packets in packet array +- */ +-__rte_internal ++#ifndef RTE_ETH_SPEED_NUM_400G ++#define RTE_ETH_SPEED_NUM_400G 400000 /**< 400 Gbps */ ++#endif ++ + uint16_t +-rte_eth_pkt_burst_dummy(void *queue __rte_unused, ++xsc_eth_pkt_burst_dummy(void *queue __rte_unused, + struct rte_mbuf **pkts __rte_unused, + uint16_t nb_pkts __rte_unused); +-#endif ++ ++#define rte_eth_pkt_burst_dummy xsc_eth_pkt_burst_dummy + + #endif /* _XSC_COMPAT_H_ */ +diff --git a/drivers/net/xsc/xsc_dev.c b/drivers/net/xsc/xsc_dev.c +index 0562241..9c9f4f7 100644 +--- a/drivers/net/xsc/xsc_dev.c ++++ b/drivers/net/xsc/xsc_dev.c +@@ -166,7 +166,9 @@ int + xsc_dev_close(struct xsc_dev *xdev, int repr_id) + { + xsc_dev_clear_pct(xdev, repr_id); +- return xdev->dev_ops->dev_close(xdev); ++ if (repr_id == xdev->num_repr_ports - 1) ++ return xdev->dev_ops->dev_close(xdev); ++ return 0; + } + + int +diff --git a/drivers/net/xsc/xsc_dev.h b/drivers/net/xsc/xsc_dev.h +index b8651c8..e36eea9 100644 +--- a/drivers/net/xsc/xsc_dev.h ++++ b/drivers/net/xsc/xsc_dev.h +@@ -129,6 +129,8 @@ struct xsc_dev { + void *jumbo_buffer_va; + uint64_t bar_len; + int ctrl_fd; ++ rte_intr_callback_fn intr_cb; ++ void *intr_cb_arg; + }; + + enum xsc_intr_event_type { +diff --git a/drivers/net/xsc/xsc_ethdev.c b/drivers/net/xsc/xsc_ethdev.c +index c63b603..db59163 100644 +--- a/drivers/net/xsc/xsc_ethdev.c ++++ b/drivers/net/xsc/xsc_ethdev.c +@@ -376,6 +376,7 @@ xsc_ethdev_close(struct rte_eth_dev *dev) + xsc_rxq_stop(dev); + + rte_free(priv->rss_conf.rss_key); ++ xsc_dev_intr_handler_uninstall(priv->xdev); + xsc_dev_close(priv->xdev, priv->representor_id); + dev->data->mac_addrs = NULL; + return 0; +@@ -895,14 +896,21 @@ xsc_ethdev_init(struct rte_eth_dev *eth_dev) + static int + xsc_ethdev_uninit(struct rte_eth_dev *eth_dev) + { ++ int ret = 0; ++ uint16_t port_id; + struct xsc_ethdev_priv *priv = TO_XSC_ETHDEV_PRIV(eth_dev); + + PMD_INIT_FUNC_TRACE(); ++ RTE_ETH_FOREACH_DEV_OF(port_id, eth_dev->device) { ++ if (port_id != eth_dev->data->port_id) ++ ret |= rte_eth_dev_close(port_id); ++ } + +- xsc_dev_uninit(priv->xdev); +- xsc_dev_intr_handler_uninstall(priv->xdev); ++ ret |= xsc_ethdev_close(eth_dev); ++ xsc_dev_pct_uninit(); ++ rte_free(priv->xdev); + +- return 0; ++ return ret == 0 ? 0 : -EIO; + } + + static int +diff --git a/drivers/net/xsc/xsc_log.h b/drivers/net/xsc/xsc_log.h +index 7fd16e2..881f39b 100644 +--- a/drivers/net/xsc/xsc_log.h ++++ b/drivers/net/xsc/xsc_log.h +@@ -33,15 +33,10 @@ extern int xsc_logtype_driver; + #define PMD_INIT_LOG(level, ...) \ + RTE_LOG_LINE_PREFIX(level, XSC_INIT, "%s(): ", __func__, __VA_ARGS__) + +- + #define PMD_INIT_FUNC_TRACE() PMD_INIT_LOG(DEBUG, " >>") + +- +-#define PMD_DRV_LOG_RAW(level, ...) \ +- RTE_LOG_LINE_PREFIX(level, XSC_DRV, "%s(): ", __func__, __VA_ARGS__) +- + #define PMD_DRV_LOG(level, ...) \ +- PMD_DRV_LOG_RAW(level, __VA_ARGS__) ++ RTE_LOG_LINE_PREFIX(level, XSC_DRV, "%s(): ", __func__, __VA_ARGS__) + + #endif + +diff --git a/drivers/net/xsc/xsc_np.c b/drivers/net/xsc/xsc_np.c +index f96797b..543e6db 100644 +--- a/drivers/net/xsc/xsc_np.c ++++ b/drivers/net/xsc/xsc_np.c +@@ -383,6 +383,7 @@ void + xsc_dev_pct_uninit(void) + { + rte_free(xsc_pct_mgr.bmp_mem); ++ xsc_pct_mgr.bmp_mem = NULL; + } + + int +diff --git a/drivers/net/xsc/xsc_rdma.c b/drivers/net/xsc/xsc_rdma.c +index 956a01d..54a1df3 100644 +--- a/drivers/net/xsc/xsc_rdma.c ++++ b/drivers/net/xsc/xsc_rdma.c +@@ -1162,7 +1162,7 @@ xsc_get_ifindex_by_ifname(const char *ifname, int *ifindex) + if (sockfd == -1) + return -EINVAL; + +- strncpy(ifr.ifr_name, ifname, IFNAMSIZ - 1); ++ snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", ifname); + if (ioctl(sockfd, SIOCGIFINDEX, &ifr) == -1) { + close(sockfd); + return -EINVAL; +diff --git a/drivers/net/xsc/xsc_rx.c b/drivers/net/xsc/xsc_rx.c +index c63d658..c1b52c5 100644 +--- a/drivers/net/xsc/xsc_rx.c ++++ b/drivers/net/xsc/xsc_rx.c +@@ -12,6 +12,9 @@ + #include "xsc_rx.h" + + #define XSC_MAX_RECV_LEN 9800 ++#define XSC_BAR_LEN_256M 0x10000000 ++#define XSC_CQ_PID_START_256M 0x2080000 ++#define XSC_CQ_PID_START_32M 0x60000 + + static inline void + xsc_cq_to_mbuf(struct xsc_rxq_data *rxq, struct rte_mbuf *pkt, +@@ -82,6 +85,16 @@ xsc_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n) + int cqe_msg_len = 0; + volatile struct xsc_cqe_u64 *cqe_u64 = NULL; + struct rte_mbuf *rep; ++ uint16_t cq_pi; ++ uint16_t cqe_pkts_n = 0; ++ ++ if (rxq->cq_pi != NULL) { ++ cq_pi = (*(volatile uint32_t *)(rxq->cq_pi)) & 0xFFFF; ++ if (cq_pi == rxq->cq_ci) ++ return 0; ++ cqe_pkts_n = (uint16_t)((cq_pi - rxq->cq_ci) & 0xFFFF); ++ pkts_n = pkts_n < cqe_pkts_n ? pkts_n : cqe_pkts_n; ++ } + + while (pkts_n) { + uint32_t idx = rq_ci & wqe_m; +@@ -276,6 +289,7 @@ xsc_rss_qp_create(struct xsc_ethdev_priv *priv, int port_id) + struct xsc_hwinfo *hwinfo = &xdev->hwinfo; + char name[RTE_ETH_NAME_MAX_LEN] = { 0 }; + void *cmd_buf; ++ uint32_t cq_pi_start; + + rxq_data = xsc_rxq_get(priv, 0); + if (rxq_data == NULL) +@@ -308,8 +322,11 @@ xsc_rss_qp_create(struct xsc_ethdev_priv *priv, int port_id) + + for (i = 0; i < priv->num_rq; i++) { + rxq_data = xsc_rxq_get(priv, i); +- if (rxq_data == NULL) +- return -EINVAL; ++ if (rxq_data == NULL) { ++ rte_errno = EINVAL; ++ goto error; ++ } ++ + req = (struct xsc_cmd_create_qp_request *)(&in->data[0] + entry_len * i); + req->input_qpn = rte_cpu_to_be_16(0); /* useless for eth */ + req->pa_num = rte_cpu_to_be_16(pa_num); +@@ -347,17 +364,29 @@ xsc_rss_qp_create(struct xsc_ethdev_priv *priv, int port_id) + } + rqn_base = rte_be_to_cpu_32(out->qpn_base) & 0xffffff; + ++ if (xdev->bar_len == XSC_BAR_LEN_256M) ++ cq_pi_start = XSC_CQ_PID_START_256M; ++ else ++ cq_pi_start = XSC_CQ_PID_START_32M; ++ + for (i = 0; i < priv->num_rq; i++) { + rxq_data = xsc_rxq_get(priv, i); +- if (rxq_data == NULL) +- return -EINVAL; ++ if (rxq_data == NULL) { ++ rte_errno = EINVAL; ++ goto error; ++ } ++ + rxq_data->wqes = rxq_data->rq_pas->addr; +- if (!xsc_dev_is_vf(xdev)) ++ if (!xsc_dev_is_vf(xdev)) { + rxq_data->rq_db = (uint32_t *)((uint8_t *)xdev->bar_addr + + XSC_PF_RX_DB_ADDR); +- else ++ rxq_data->cq_pi = (uint32_t *)((uint8_t *)xdev->bar_addr + ++ cq_pi_start + rxq_data->cqn * 4); ++ } else { + rxq_data->rq_db = (uint32_t *)((uint8_t *)xdev->bar_addr + + XSC_VF_RX_DB_ADDR); ++ rxq_data->cq_pi = NULL; ++ } + + rxq_data->qpn = rqn_base + i; + xsc_dev_modify_qp_status(xdev, rxq_data->qpn, 1, XSC_CMD_OP_RTR2RTS_QP); +diff --git a/drivers/net/xsc/xsc_rx.h b/drivers/net/xsc/xsc_rx.h +index 90fbb89..59cbbb5 100644 +--- a/drivers/net/xsc/xsc_rx.h ++++ b/drivers/net/xsc/xsc_rx.h +@@ -31,6 +31,7 @@ struct __rte_cache_aligned xsc_rxq_data { + uint16_t rsv0:4; + volatile uint32_t *rq_db; + volatile uint32_t *cq_db; ++ volatile uint32_t *cq_pi; + uint32_t rq_ci; + uint32_t rq_pi; + uint16_t cq_ci; +diff --git a/drivers/net/xsc/xsc_vfio.c b/drivers/net/xsc/xsc_vfio.c +index d030019..6496b43 100644 +--- a/drivers/net/xsc/xsc_vfio.c ++++ b/drivers/net/xsc/xsc_vfio.c +@@ -30,9 +30,10 @@ + #define XSC_SW2HW_MTU(mtu) ((mtu) + 14 + 4) + #define XSC_SW2HW_RX_PKT_LEN(mtu) ((mtu) + 14 + 256) + +-#define MAX_INTR_VEC_ID RTE_MAX_RXTX_INTR_VEC_ID +-#define MSIX_IRQ_SET_BUF_LEN (sizeof(struct vfio_irq_set) + \ +- sizeof(int) * (MAX_INTR_VEC_ID)) ++#define XSC_MAX_INTR_VEC_ID RTE_MAX_RXTX_INTR_VEC_ID ++#define XSC_MSIX_IRQ_SET_BUF_LEN (sizeof(struct vfio_irq_set) + \ ++ sizeof(int) * (XSC_MAX_INTR_VEC_ID)) ++#define XSC_MSIX_CPU_NUM_DEFAULT 2 + + enum xsc_port_status { + XSC_PORT_DOWN = 0, +@@ -62,6 +63,20 @@ struct xsc_vfio_qp { + uint32_t qpn; + }; + ++enum xsc_speed_mode { ++ XSC_MODULE_SPEED_UNKNOWN, ++ XSC_MODULE_SPEED_10G, ++ XSC_MODULE_SPEED_25G, ++ XSC_MODULE_SPEED_40G_R4, ++ XSC_MODULE_SPEED_50G_R, ++ XSC_MODULE_SPEED_50G_R2, ++ XSC_MODULE_SPEED_100G_R2, ++ XSC_MODULE_SPEED_100G_R4, ++ XSC_MODULE_SPEED_200G_R4, ++ XSC_MODULE_SPEED_200G_R8, ++ XSC_MODULE_SPEED_400G_R8, ++}; ++ + static void + xsc_vfio_pcie_no_init(struct xsc_hwinfo *hwinfo) + { +@@ -106,7 +121,7 @@ xsc_vfio_hwinfo_init(struct xsc_dev *xdev) + memset(in, 0, cmd_len); + in->hdr.opcode = rte_cpu_to_be_16(XSC_CMD_OP_QUERY_HCA_CAP); + in->hdr.ver = rte_cpu_to_be_16(XSC_CMD_QUERY_HCA_CAP_V1); +- in->cpu_num = rte_cpu_to_be_16(2); ++ in->cpu_num = rte_cpu_to_be_16(XSC_MSIX_CPU_NUM_DEFAULT); + out = cmd_buf; + + ret = xsc_vfio_mbox_exec(xdev, in, in_len, out, out_len); +@@ -200,6 +215,7 @@ xsc_vfio_dev_close(struct xsc_dev *xdev) + struct xsc_vfio_priv *vfio_priv = (struct xsc_vfio_priv *)xdev->dev_priv; + + xsc_vfio_mbox_destroy(vfio_priv->cmdq); ++ rte_pci_unmap_device(xdev->pci_dev); + rte_free(vfio_priv); + + return 0; +@@ -237,6 +253,44 @@ xsc_vfio_set_link_down(struct xsc_dev *xdev) + return xsc_vfio_modify_link_status(xdev, XSC_PORT_DOWN); + } + ++static uint32_t ++xsc_vfio_link_speed_translate(uint32_t mode) ++{ ++ uint32_t speed = RTE_ETH_SPEED_NUM_UNKNOWN; ++ ++ switch (mode) { ++ case XSC_MODULE_SPEED_10G: ++ speed = RTE_ETH_SPEED_NUM_10G; ++ break; ++ case XSC_MODULE_SPEED_25G: ++ speed = RTE_ETH_SPEED_NUM_25G; ++ break; ++ case XSC_MODULE_SPEED_40G_R4: ++ speed = RTE_ETH_SPEED_NUM_40G; ++ break; ++ case XSC_MODULE_SPEED_50G_R: ++ case XSC_MODULE_SPEED_50G_R2: ++ speed = RTE_ETH_SPEED_NUM_50G; ++ break; ++ case XSC_MODULE_SPEED_100G_R2: ++ case XSC_MODULE_SPEED_100G_R4: ++ speed = RTE_ETH_SPEED_NUM_100G; ++ break; ++ case XSC_MODULE_SPEED_200G_R4: ++ case XSC_MODULE_SPEED_200G_R8: ++ speed = RTE_ETH_SPEED_NUM_200G; ++ break; ++ case XSC_MODULE_SPEED_400G_R8: ++ speed = RTE_ETH_SPEED_NUM_400G; ++ break; ++ default: ++ speed = RTE_ETH_SPEED_NUM_NONE; ++ break; ++ } ++ ++ return speed; ++} ++ + static int + xsc_vfio_get_link_info(struct xsc_dev *xdev, struct rte_eth_link *link) + { +@@ -244,6 +298,7 @@ xsc_vfio_get_link_info(struct xsc_dev *xdev, struct rte_eth_link *link) + struct xsc_cmd_query_linkinfo_mbox_out out = { }; + struct xsc_cmd_linkinfo linkinfo; + int ret; ++ uint32_t speed_mode; + + in.hdr.opcode = rte_cpu_to_be_16(XSC_CMD_OP_QUERY_LINK_INFO); + ret = xsc_vfio_mbox_exec(xdev, &in, sizeof(in), &out, sizeof(out)); +@@ -253,9 +308,10 @@ xsc_vfio_get_link_info(struct xsc_dev *xdev, struct rte_eth_link *link) + return -ENOEXEC; + } + +- memcpy(&linkinfo, &out.ctx, sizeof(struct xsc_cmd_linkinfo)); +- +- link->link_speed = rte_be_to_cpu_32(linkinfo.linkspeed); ++ linkinfo = out.ctx; ++ link->link_status = linkinfo.status ? XSC_PORT_UP : XSC_PORT_DOWN; ++ speed_mode = rte_be_to_cpu_32(linkinfo.linkspeed); ++ link->link_speed = xsc_vfio_link_speed_translate(speed_mode); + link->link_duplex = linkinfo.duplex; + link->link_autoneg = linkinfo.autoneg; + +@@ -266,24 +322,8 @@ static int + xsc_vfio_link_update(struct xsc_dev *xdev, __rte_unused int wait_to_complete) + { + int ret; +- uint8_t linkup; +- struct xsc_cmd_query_vport_state_in in = { }; +- struct xsc_cmd_query_vport_state_out out = { }; + struct rte_eth_link *origin_link = &xdev->pf_dev_link; +- struct rte_eth_link link; +- uint16_t vport = 0; +- +- in.hdr.opcode = rte_cpu_to_be_16(XSC_CMD_OP_QUERY_VPORT_STATE); +- in.vport_number = rte_cpu_to_be_16(vport); +- ret = xsc_vfio_mbox_exec(xdev, &in, sizeof(in), &out, sizeof(out)); +- if (ret != 0 || out.hdr.status != 0) { +- PMD_DRV_LOG(ERR, "Failed to get port state, ret=%d, status=%d", +- ret, out.hdr.status); +- return -ENOEXEC; +- } +- +- linkup = out.state; +- link.link_status = linkup ? XSC_PORT_UP : XSC_PORT_DOWN; ++ struct rte_eth_link link = { }; + + ret = xsc_vfio_get_link_info(xdev, &link); + if (ret) +@@ -841,7 +881,7 @@ xsc_vfio_irq_info_get(struct rte_intr_handle *intr_handle) + } + + PMD_DRV_LOG(INFO, "Flags=0x%x index=0x%x count=0x%x max_intr_vec_id=0x%x", +- irq.flags, irq.index, irq.count, MAX_INTR_VEC_ID); ++ irq.flags, irq.index, irq.count, XSC_MAX_INTR_VEC_ID); + + if (rte_intr_max_intr_set(intr_handle, irq.count)) + return -1; +@@ -852,16 +892,16 @@ xsc_vfio_irq_info_get(struct rte_intr_handle *intr_handle) + static int + xsc_vfio_irq_init(struct rte_intr_handle *intr_handle) + { +- char irq_set_buf[MSIX_IRQ_SET_BUF_LEN]; ++ char irq_set_buf[XSC_MSIX_IRQ_SET_BUF_LEN]; + struct vfio_irq_set *irq_set; + int len, rc, vfio_dev_fd; + int32_t *fd_ptr; + uint32_t i; + +- if (rte_intr_max_intr_get(intr_handle) > MAX_INTR_VEC_ID) { +- PMD_DRV_LOG(ERR, "Max_intr=%d greater than MAX_INTR_VEC_ID=%d", ++ if (rte_intr_max_intr_get(intr_handle) > XSC_MAX_INTR_VEC_ID) { ++ PMD_DRV_LOG(ERR, "Max_intr=%d greater than XSC_MAX_INTR_VEC_ID=%d", + rte_intr_max_intr_get(intr_handle), +- MAX_INTR_VEC_ID); ++ XSC_MAX_INTR_VEC_ID); + return -ERANGE; + } + +@@ -891,7 +931,7 @@ xsc_vfio_irq_init(struct rte_intr_handle *intr_handle) + static int + xsc_vfio_irq_config(struct rte_intr_handle *intr_handle, unsigned int vec) + { +- char irq_set_buf[MSIX_IRQ_SET_BUF_LEN]; ++ char irq_set_buf[XSC_MSIX_IRQ_SET_BUF_LEN]; + struct vfio_irq_set *irq_set; + int len, rc, vfio_dev_fd; + int32_t *fd_ptr; +@@ -1029,6 +1069,9 @@ xsc_vfio_intr_handler_install(struct xsc_dev *xdev, rte_intr_callback_fn cb, voi + return ret; + } + ++ xdev->intr_cb = cb; ++ xdev->intr_cb_arg = cb_arg; ++ + ret = xsc_vfio_msix_enable(xdev); + if (ret != 0) { + PMD_DRV_LOG(ERR, "Failed to enable vfio msix, ret=%d", ret); +@@ -1041,6 +1084,10 @@ xsc_vfio_intr_handler_install(struct xsc_dev *xdev, rte_intr_callback_fn cb, voi + static int + xsc_vfio_intr_handler_uninstall(struct xsc_dev *xdev) + { ++ if (rte_intr_fd_get(xdev->pci_dev->intr_handle) >= 0) ++ rte_intr_callback_unregister(xdev->pci_dev->intr_handle, ++ xdev->intr_cb, xdev->intr_cb_arg); ++ + rte_intr_instance_free(xdev->intr_handle); + + return 0; +-- +2.25.1 + diff --git a/dpdk.spec b/dpdk.spec index dbceaed..80e8618 100644 --- a/dpdk.spec +++ b/dpdk.spec @@ -11,7 +11,7 @@ Name: dpdk Version: 23.11 -Release: 31 +Release: 32 URL: http://dpdk.org Source: https://fast.dpdk.org/rel/dpdk-%{version}.tar.xz @@ -125,6 +125,8 @@ Patch6091: 0091-net-hns3-fix-incorrect-failed-rollback.patch Patch6092: 0092-net-hns3-fix-divide-by-zero.patch Patch6093: 0093-net-hns3-fix-unrelease-some-resources-on-reset-case.patch +Patch6094: 0094-net-xsc-optimize-rx.patch + BuildRequires: meson BuildRequires: python3-pyelftools BuildRequires: diffutils @@ -328,6 +330,9 @@ fi /usr/sbin/depmod %changelog +* Tue May 27 2025 qianrong - 23.11-32 +- optimize xsc rx + * Mon May 19 2025 huangdengdui - 23.11-31 The Patch6093 backport error caushed port stop crash. This version fixes it. -- Gitee