From: Jie Liu <[email protected]>

This patch optimizes vectorized packet processing with improved buffer
management and unified buffer structure:

- Introduce unified Tx buffer structure:
  * Add union in sxe2_tx_queue for buffer_ring/buffer_ring_vec
  * Use sxe2_tx_buffer_vec for vectorized Tx path
  * Eliminate runtime type checking and branching

- Refactor Tx queue reset operations:
  * Extract desc ring reset to sxe2_tx_queue_desc_ring_reset
  * Add sxe2_tx_queue_reset_vec for vectorized queues
  * Simplify buffer initialization in vector mode

- Optimize Tx vector path mbuf release:
  * Remove conditional AVX512 branching
  * Use direct buffer_vec access without casting
  * Simplify loop logic with consistent pattern
  * Remove NULL checks after initialization validation

- Refactor Tx queue operations:
  * Export sxe2_tx_buffer_ring_free as public API
  * Add sxe2_tx_vec_ops_get() for vector operations
  * Use operation table instead of direct function calls

- Improve VSI management:
  * Initialize other_vsi_list before main VSI creation
  * Ignore -EPERM errors when destroying VSI in uninit
  * Set main_vsi to NULL after successful destroy
  * Prevent dangling pointer references

- Enhance Tx mode function selection:
  * Use rte_eth_tx_pkt_prepare_dummy for vectorized paths
  * Split NEON simple/offload mode selection logic
  * Clean up conditional compilation structure

Signed-off-by: Jie Liu <[email protected]>
---
 drivers/net/sxe2/sxe2_queue.h           |   5 +-
 drivers/net/sxe2/sxe2_rx.c              |   5 +-
 drivers/net/sxe2/sxe2_switchdev.c       |   8 +-
 drivers/net/sxe2/sxe2_tx.c              |  42 +++--
 drivers/net/sxe2/sxe2_tx.h              |   4 +
 drivers/net/sxe2/sxe2_txrx.c            |  19 ++-
 drivers/net/sxe2/sxe2_txrx_poll.h       |   2 -
 drivers/net/sxe2/sxe2_txrx_vec.c        |  77 +++------
 drivers/net/sxe2/sxe2_txrx_vec.h        |   1 +
 drivers/net/sxe2/sxe2_txrx_vec_avx2.c   |  10 +-
 drivers/net/sxe2/sxe2_txrx_vec_avx512.c | 123 +-------------
 drivers/net/sxe2/sxe2_txrx_vec_common.h |   5 +-
 drivers/net/sxe2/sxe2_txrx_vec_neon.c   | 215 ++++++++++++++++--------
 drivers/net/sxe2/sxe2_txrx_vec_sse.c    |  10 +-
 drivers/net/sxe2/sxe2_vsi.c             |   8 +-
 15 files changed, 247 insertions(+), 287 deletions(-)

diff --git a/drivers/net/sxe2/sxe2_queue.h b/drivers/net/sxe2/sxe2_queue.h
index 10bdaf5b8d..e53a1ce852 100644
--- a/drivers/net/sxe2/sxe2_queue.h
+++ b/drivers/net/sxe2/sxe2_queue.h
@@ -62,7 +62,10 @@ struct sxe2_txq_ops {
 };
 struct sxe2_tx_queue {
        volatile union sxe2_tx_data_desc *desc_ring;
-       struct sxe2_tx_buffer *buffer_ring;
+       union {
+               struct sxe2_tx_buffer *buffer_ring;
+               struct sxe2_tx_buffer_vec *buffer_ring_vec;
+       };
        volatile uint32_t *tdt_reg_addr;
 
        uint64_t offloads;
diff --git a/drivers/net/sxe2/sxe2_rx.c b/drivers/net/sxe2/sxe2_rx.c
index d700c60083..6340ed933a 100644
--- a/drivers/net/sxe2/sxe2_rx.c
+++ b/drivers/net/sxe2/sxe2_rx.c
@@ -319,7 +319,8 @@ int32_t __rte_cold sxe2_rx_queue_setup(struct rte_eth_dev 
*dev,
                rxq->mb_pool = mp;
        }
 
-       rxq->rx_free_thresh = rx_conf->rx_free_thresh;
+       rxq->rx_free_thresh = (rx_conf->rx_free_thresh == 0) ?
+               SXE2_DEFAULT_RX_FREE_THRESH : rx_conf->rx_free_thresh;
        rxq->port_id = dev->data->port_id;
        rxq->offloads = offloads;
        if (offloads & RTE_ETH_RX_OFFLOAD_KEEP_CRC)
@@ -550,7 +551,7 @@ void __rte_cold sxe2_rxqs_all_stop(struct rte_eth_dev *dev)
 static int32_t sxe2_monitor_callback(const uint64_t value,
                                 const uint64_t 
arg[RTE_POWER_MONITOR_OPAQUE_SZ] __rte_unused)
 {
-       const uint64_t dd_state = rte_cpu_to_le_64(SXE2_RX_DESC_STATUS_DD_MASK);
+       const uint64_t dd_state = 
rte_cpu_to_le_64(SXE2_RX_DESC_STATUS_DD_SHIFT);
        return (value & dd_state) == dd_state ? -1 : 0;
 }
 
diff --git a/drivers/net/sxe2/sxe2_switchdev.c 
b/drivers/net/sxe2/sxe2_switchdev.c
index efb1468b91..374cc4e223 100644
--- a/drivers/net/sxe2/sxe2_switchdev.c
+++ b/drivers/net/sxe2/sxe2_switchdev.c
@@ -316,13 +316,7 @@ int32_t sxe2_switchdev_repr_private_data_init(struct 
rte_eth_dev *dev,
                parent_adapter->repr_ctxt.repr_vf_id[repr_id].kernel_vsi_id;
        repr_priv_data->repr_vf_backup_vsi_id =
                parent_adapter->repr_ctxt.repr_vf_id[repr_id].dpdk_vsi_id;
-
-       repr_priv_data->repr_vf_vsi_id =
-               parent_adapter->repr_ctxt.repr_vf_id[repr_id].kernel_vsi_id !=
-               SXE2_INVALID_VSI_ID ?
-               parent_adapter->repr_ctxt.repr_vf_id[repr_id].kernel_vsi_id :
-               parent_adapter->repr_ctxt.repr_vf_id[repr_id].dpdk_vsi_id;
-
+       repr_priv_data->repr_vf_vsi_id = repr_priv_data->repr_vf_primary_vsi_id;
        adapter->repr_priv_data = repr_priv_data;
        goto l_end;
 l_free:
diff --git a/drivers/net/sxe2/sxe2_tx.c b/drivers/net/sxe2/sxe2_tx.c
index f49238ceef..94a6e9afc7 100644
--- a/drivers/net/sxe2/sxe2_tx.c
+++ b/drivers/net/sxe2/sxe2_tx.c
@@ -19,6 +19,17 @@ static void *sxe2_tx_doorbell_addr_get(struct sxe2_adapter 
*adapter, uint16_t qu
                                     queue_id);
 }
 
+static void sxe2_tx_queue_desc_ring_reset(struct sxe2_tx_queue *txq)
+{
+       uint16_t i;
+       static const union sxe2_tx_data_desc zeroed_desc = {{0}};
+
+       for (i = 0; i < txq->ring_depth; i++) {
+               txq->desc_ring[i] = zeroed_desc;
+               txq->desc_ring[i].wb.dd = 
rte_cpu_to_le_64(SXE2_TX_DESC_DTYPE_DESC_DONE);
+       }
+}
+
 static void sxe2_tx_tail_init(struct sxe2_adapter *adapter, struct 
sxe2_tx_queue *txq)
 {
        txq->tdt_reg_addr = sxe2_tx_doorbell_addr_get(adapter, txq->queue_id);
@@ -28,20 +39,12 @@ static void sxe2_tx_tail_init(struct sxe2_adapter *adapter, 
struct sxe2_tx_queue
 void __rte_cold sxe2_tx_queue_reset(struct sxe2_tx_queue *txq)
 {
        uint16_t prev, i;
-       volatile union sxe2_tx_data_desc *txd;
-       static const union sxe2_tx_data_desc zeroed_desc = {{0}};
        struct sxe2_tx_buffer *tx_buffer = txq->buffer_ring;
 
-       for (i = 0; i < txq->ring_depth; i++)
-               txq->desc_ring[i] = zeroed_desc;
+       sxe2_tx_queue_desc_ring_reset(txq);
 
        prev = txq->ring_depth - 1;
        for (i = 0; i < txq->ring_depth; i++) {
-               txd = &txq->desc_ring[i];
-               if (txd == NULL)
-                       continue;
-
-               txd->wb.dd = rte_cpu_to_le_64(SXE2_TX_DESC_DTYPE_DESC_DONE);
                tx_buffer[i].mbuf       = NULL;
                tx_buffer[i].last_id    = i;
                tx_buffer[prev].next_id = i;
@@ -56,6 +59,21 @@ void __rte_cold sxe2_tx_queue_reset(struct sxe2_tx_queue 
*txq)
        txq->next_rs       = txq->rs_thresh  - 1;
 }
 
+void __rte_cold sxe2_tx_queue_reset_vec(struct sxe2_tx_queue *txq)
+{
+       sxe2_tx_queue_desc_ring_reset(txq);
+
+       memset(txq->buffer_ring, 0,
+               sizeof(struct sxe2_tx_buffer) * txq->ring_depth);
+
+       txq->desc_used_num = 0;
+       txq->desc_free_num = txq->ring_depth - 1;
+       txq->next_use      = 0;
+       txq->next_clean    = txq->ring_depth - 1;
+       txq->next_dd       = txq->rs_thresh  - 1;
+       txq->next_rs       = txq->rs_thresh  - 1;
+}
+
 void __rte_cold sxe2_tx_queue_mbufs_release(struct sxe2_tx_queue *txq)
 {
        uint32_t i;
@@ -70,10 +88,12 @@ void __rte_cold sxe2_tx_queue_mbufs_release(struct 
sxe2_tx_queue *txq)
        }
 }
 
-static void sxe2_tx_buffer_ring_free(struct sxe2_tx_queue *txq)
+void __rte_cold sxe2_tx_buffer_ring_free(struct sxe2_tx_queue *txq)
 {
-       if (txq != NULL && txq->buffer_ring != NULL)
+       if (txq != NULL && txq->buffer_ring != NULL) {
                rte_free(txq->buffer_ring);
+               txq->buffer_ring = NULL;
+       }
 }
 
 const struct sxe2_txq_ops sxe2_default_txq_ops = {
diff --git a/drivers/net/sxe2/sxe2_tx.h b/drivers/net/sxe2/sxe2_tx.h
index f4823126b3..bc5ff1c2bc 100644
--- a/drivers/net/sxe2/sxe2_tx.h
+++ b/drivers/net/sxe2/sxe2_tx.h
@@ -9,6 +9,10 @@
 
 void __rte_cold sxe2_tx_queue_reset(struct sxe2_tx_queue *txq);
 
+void __rte_cold sxe2_tx_queue_reset_vec(struct sxe2_tx_queue *txq);
+
+void __rte_cold sxe2_tx_buffer_ring_free(struct sxe2_tx_queue *txq);
+
 int32_t __rte_cold sxe2_tx_queue_start(struct rte_eth_dev *dev, uint16_t 
queue_id);
 
 void sxe2_tx_queue_mbufs_release(struct sxe2_tx_queue *txq);
diff --git a/drivers/net/sxe2/sxe2_txrx.c b/drivers/net/sxe2/sxe2_txrx.c
index 79870866d1..d27d2ce630 100644
--- a/drivers/net/sxe2/sxe2_txrx.c
+++ b/drivers/net/sxe2/sxe2_txrx.c
@@ -358,7 +358,7 @@ void sxe2_tx_mode_func_set(struct rte_eth_dev *dev)
        }
 
        if (tx_mode_flags & SXE2_TX_MODE_VEC_SET_MASK) {
-               dev->tx_pkt_prepare = NULL;
+               dev->tx_pkt_prepare = rte_eth_tx_pkt_prepare_dummy;
 #ifdef RTE_ARCH_X86
                if (tx_mode_flags & SXE2_TX_MODE_VEC_AVX512) {
 #ifdef CC_AVX512_SUPPORT
@@ -386,21 +386,25 @@ void sxe2_tx_mode_func_set(struct rte_eth_dev *dev)
                }
 #elif defined(RTE_ARCH_ARM64)
                if (tx_mode_flags & SXE2_TX_MODE_VEC_NEON) {
-                       dev->tx_pkt_prepare = sxe2_tx_pkts_prepare;
-                       dev->tx_pkt_burst = sxe2_tx_pkts_vec_neon;
-               } else {
-                       dev->tx_pkt_burst = sxe2_tx_pkts_vec_neon_simple;
+                       if (tx_mode_flags & SXE2_TX_MODE_VEC_OFFLOAD) {
+                               dev->tx_pkt_prepare = sxe2_tx_pkts_prepare;
+                               dev->tx_pkt_burst = sxe2_tx_pkts_vec_neon;
+                       } else {
+                               dev->tx_pkt_burst = 
sxe2_tx_pkts_vec_neon_simple;
+                       }
                }
 #endif
        } else {
                if (tx_mode_flags & SXE2_TX_MODE_SIMPLE_BATCH) {
-                       dev->tx_pkt_prepare = NULL;
+                       dev->tx_pkt_prepare = rte_eth_tx_pkt_prepare_dummy;
                        dev->tx_pkt_burst = sxe2_tx_pkts_simple;
                } else {
                        dev->tx_pkt_prepare = sxe2_tx_pkts_prepare;
                        dev->tx_pkt_burst = sxe2_tx_pkts;
                }
        }
+       PMD_LOG_DEBUG(TX, "Tx mode flags:0x%016x port_id:%u.",
+                               tx_mode_flags, dev->data->port_id);
 }
 
 static const struct {
@@ -582,6 +586,9 @@ void sxe2_rx_mode_func_set(struct rte_eth_dev *dev)
                dev->rx_pkt_burst = sxe2_rx_pkts_scattered_split;
        else
                dev->rx_pkt_burst = sxe2_rx_pkts_scattered;
+
+       PMD_LOG_DEBUG(RX, "Rx mode flags:0x%016x port_id:%u.",
+                               rx_mode_flags, dev->data->port_id);
 }
 
 static const struct {
diff --git a/drivers/net/sxe2/sxe2_txrx_poll.h 
b/drivers/net/sxe2/sxe2_txrx_poll.h
index 708e3839d7..bfa099c097 100644
--- a/drivers/net/sxe2/sxe2_txrx_poll.h
+++ b/drivers/net/sxe2/sxe2_txrx_poll.h
@@ -13,8 +13,6 @@ uint16_t sxe2_tx_pkts_simple(void *tx_queue, struct rte_mbuf 
**tx_pkts, uint16_t
 
 uint16_t sxe2_rx_pkts_scattered(void *rx_queue, struct rte_mbuf **rx_pkts, 
uint16_t nb_pkts);
 
-uint16_t sxe2_rx_pkts_scattered(void *rx_queue, struct rte_mbuf **rx_pkts, 
uint16_t nb_pkts);
-
 uint16_t sxe2_rx_pkts_scattered_split(void *rx_queue, struct rte_mbuf 
**rx_pkts, uint16_t nb_pkts);
 
 #endif /* SXE2_TXRX_POLL_H */
diff --git a/drivers/net/sxe2/sxe2_txrx_vec.c b/drivers/net/sxe2/sxe2_txrx_vec.c
index cf004f5eb2..31ab66708c 100644
--- a/drivers/net/sxe2/sxe2_txrx_vec.c
+++ b/drivers/net/sxe2/sxe2_txrx_vec.c
@@ -8,6 +8,19 @@
 #include "sxe2_ethdev.h"
 #include "sxe2_common_log.h"
 
+static void sxe2_tx_queue_mbufs_release_vec(struct sxe2_tx_queue *txq);
+
+struct sxe2_txq_ops sxe2_tx_vec_ops_get(void)
+{
+       static const struct sxe2_txq_ops ops = {
+               .queue_reset      = sxe2_tx_queue_reset_vec,
+               .mbufs_release    = sxe2_tx_queue_mbufs_release_vec,
+               .buffer_ring_free = sxe2_tx_buffer_ring_free,
+       };
+
+       return ops;
+}
+
 int32_t __rte_cold sxe2_rx_vec_support_check(struct rte_eth_dev *dev, uint32_t 
*vec_flags)
 {
        struct sxe2_rx_queue *rxq;
@@ -157,67 +170,28 @@ int32_t __rte_cold sxe2_tx_vec_support_check(struct 
rte_eth_dev *dev, uint32_t *
 
 static void sxe2_tx_queue_mbufs_release_vec(struct sxe2_tx_queue *txq)
 {
-       struct sxe2_tx_buffer *buffer;
+       struct sxe2_tx_buffer_vec *buffer_vec;
        uint16_t i;
 
        if (unlikely(txq == NULL || txq->buffer_ring == NULL)) {
                PMD_LOG_ERR(TX, "Tx release mbufs vec, invalid params.");
                return;
        }
-       i = txq->next_dd - (txq->rs_thresh - 1);
-#ifdef CC_AVX512_SUPPORT
-       struct rte_eth_dev *dev;
-       struct sxe2_tx_buffer_vec *buffer_vec;
 
-       dev = &rte_eth_devices[txq->port_id];
-
-       if (dev->tx_pkt_burst == sxe2_tx_pkts_vec_avx512 ||
-               dev->tx_pkt_burst == sxe2_tx_pkts_vec_avx512_simple) {
-               buffer_vec = (struct sxe2_tx_buffer_vec *)txq->buffer_ring;
+       i = txq->next_dd - (txq->rs_thresh - 1);
+       buffer_vec = txq->buffer_ring_vec;
 
-               if (txq->next_use < i) {
-                       for ( ; i < txq->ring_depth; ++i) {
-                               if (buffer_vec[i].mbuf != NULL) {
-                                       
rte_pktmbuf_free_seg(buffer_vec[i].mbuf);
-                                       buffer_vec[i].mbuf = NULL;
-                               }
-                       }
-                       i = 0;
-               }
-               for ( ; i < txq->next_use; ++i) {
-                       if (buffer_vec[i].mbuf != NULL) {
-                               rte_pktmbuf_free_seg(buffer_vec[i].mbuf);
-                               buffer_vec[i].mbuf = NULL;
-                       }
+       if (txq->next_use < i) {
+               for ( ; i < txq->ring_depth; ++i) {
+                       rte_pktmbuf_free_seg(buffer_vec[i].mbuf);
+                       buffer_vec[i].mbuf = NULL;
                }
-       } else {
-#endif
-               buffer = txq->buffer_ring;
-               buffer = txq->buffer_ring;
-               if (txq->next_use < i) {
-                       for ( ; i < txq->ring_depth; ++i) {
-                               if (buffer[i].mbuf != NULL) {
-                                       rte_pktmbuf_free_seg(buffer[i].mbuf);
-                                       buffer[i].mbuf = NULL;
-                               }
-                       }
-                       i = 0;
-               }
-               for (; i < txq->next_use; ++i) {
-                       if (buffer[i].mbuf != NULL) {
-                               rte_pktmbuf_free_seg(buffer[i].mbuf);
-                               buffer[i].mbuf = NULL;
-                       }
-               }
-#ifdef CC_AVX512_SUPPORT
+               i = 0;
        }
-#endif
 
-       for (; i < txq->next_use; ++i) {
-               if (buffer[i].mbuf != NULL) {
-                       rte_pktmbuf_free_seg(buffer[i].mbuf);
-                       buffer[i].mbuf = NULL;
-               }
+       for ( ; i < txq->next_use; ++i) {
+               rte_pktmbuf_free_seg(buffer_vec[i].mbuf);
+               buffer_vec[i].mbuf = NULL;
        }
 }
 
@@ -233,7 +207,8 @@ int32_t __rte_cold sxe2_tx_queues_vec_prepare(struct 
rte_eth_dev *dev)
                        PMD_LOG_INFO(TX, "Failed to prepare tx queue, txq[%d] 
is NULL", i);
                        continue;
                }
-               txq->ops.mbufs_release = sxe2_tx_queue_mbufs_release_vec;
+               txq->ops = sxe2_tx_vec_ops_get();
+               txq->ops.queue_reset(txq);
        }
        return ret;
 }
diff --git a/drivers/net/sxe2/sxe2_txrx_vec.h b/drivers/net/sxe2/sxe2_txrx_vec.h
index c139aed776..b9bc4f9c27 100644
--- a/drivers/net/sxe2/sxe2_txrx_vec.h
+++ b/drivers/net/sxe2/sxe2_txrx_vec.h
@@ -89,6 +89,7 @@ uint16_t sxe2_rx_pkts_scattered_vec_neon_offload(void 
*rx_queue, struct rte_mbuf
 uint16_t sxe2_tx_pkts_vec_neon_simple(void *tx_queue, struct rte_mbuf 
**tx_pkts, uint16_t nb_pkts);
 uint16_t sxe2_tx_pkts_vec_neon(void *tx_queue, struct rte_mbuf **tx_pkts, 
uint16_t nb_pkts);
 #endif
+struct sxe2_txq_ops sxe2_tx_vec_ops_get(void);
 int32_t __rte_cold sxe2_tx_vec_support_check(struct rte_eth_dev *dev, uint32_t 
*vec_flags);
 int32_t __rte_cold sxe2_tx_queues_vec_prepare(struct rte_eth_dev *dev);
 int32_t __rte_cold sxe2_rx_vec_support_check(struct rte_eth_dev *dev, uint32_t 
*vec_flags);
diff --git a/drivers/net/sxe2/sxe2_txrx_vec_avx2.c 
b/drivers/net/sxe2/sxe2_txrx_vec_avx2.c
index 0618e6d988..da96ca3064 100644
--- a/drivers/net/sxe2/sxe2_txrx_vec_avx2.c
+++ b/drivers/net/sxe2/sxe2_txrx_vec_avx2.c
@@ -115,7 +115,7 @@ sxe2_tx_pkts_vec_avx2_batch(struct sxe2_tx_queue *txq, 
struct rte_mbuf **tx_pkts
                            uint16_t nb_pkts, bool with_offloads)
 {
        volatile union sxe2_tx_data_desc *desc;
-       struct sxe2_tx_buffer *buffer;
+       struct sxe2_tx_buffer_vec *buffer;
        uint16_t next_use;
        uint16_t res_num;
        uint16_t tx_num;
@@ -134,14 +134,14 @@ sxe2_tx_pkts_vec_avx2_batch(struct sxe2_tx_queue *txq, 
struct rte_mbuf **tx_pkts
 
        next_use = txq->next_use;
        desc     = &txq->desc_ring[next_use];
-       buffer   = &txq->buffer_ring[next_use];
+       buffer   = &txq->buffer_ring_vec[next_use];
 
        txq->desc_free_num -= nb_pkts;
 
        res_num = txq->ring_depth - txq->next_use;
 
        if (tx_num >= res_num) {
-               sxe2_tx_pkts_mbuf_fill(buffer, tx_pkts, res_num);
+               sxe2_tx_pkts_mbuf_fill_vec(buffer, tx_pkts, res_num);
 
                sxe2_tx_desc_fill_avx2(desc, tx_pkts, res_num,
                                SXE2_TX_DATA_DESC_CMD_EOP, with_offloads);
@@ -157,10 +157,10 @@ sxe2_tx_pkts_vec_avx2_batch(struct sxe2_tx_queue *txq, 
struct rte_mbuf **tx_pkts
                next_use     = 0;
                txq->next_rs = txq->rs_thresh - 1;
                desc         = &txq->desc_ring[next_use];
-               buffer       = &txq->buffer_ring[next_use];
+               buffer       = &txq->buffer_ring_vec[next_use];
        }
 
-       sxe2_tx_pkts_mbuf_fill(buffer, tx_pkts, tx_num);
+       sxe2_tx_pkts_mbuf_fill_vec(buffer, tx_pkts, tx_num);
 
        sxe2_tx_desc_fill_avx2(desc, tx_pkts, tx_num,
                        SXE2_TX_DATA_DESC_CMD_EOP, with_offloads);
diff --git a/drivers/net/sxe2/sxe2_txrx_vec_avx512.c 
b/drivers/net/sxe2/sxe2_txrx_vec_avx512.c
index a830c7a33b..deea4c2720 100644
--- a/drivers/net/sxe2/sxe2_txrx_vec_avx512.c
+++ b/drivers/net/sxe2/sxe2_txrx_vec_avx512.c
@@ -1,8 +1,6 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  * Copyright (C), 2025, Wuxi Stars Micro System Technologies Co., Ltd.
  */
-
-#ifndef SXE2_TEST
 #include <rte_vect.h>
 
 #include "sxe2_ethdev.h"
@@ -12,114 +10,6 @@
 #include "sxe2_txrx_vec_common.h"
 #include "sxe2_vsi.h"
 
-static __rte_always_inline int32_t sxe2_tx_bufs_free_vec_avx512(struct 
sxe2_tx_queue *txq)
-{
-       struct sxe2_tx_buffer_vec *buffer;
-       struct rte_mbuf *mbuf;
-       struct rte_mbuf *mbuf_free_arr[SXE2_TX_FREE_BUFFER_SIZE_MAX_VEC];
-       struct rte_mempool *mp;
-       struct rte_mempool_cache *cache;
-       void **cache_objs;
-       uint32_t copied;
-       uint32_t i;
-       int32_t ret;
-       uint16_t rs_thresh;
-       uint16_t free_num;
-
-       if (rte_cpu_to_le_64(SXE2_TX_DESC_DTYPE_DESC_DONE) !=
-               (txq->desc_ring[txq->next_dd].wb.dd &
-                       rte_cpu_to_le_64(SXE2_TX_DESC_DTYPE_MASK))) {
-               ret = 0;
-               goto l_end;
-       }
-
-       rs_thresh = txq->rs_thresh;
-
-       buffer = (struct sxe2_tx_buffer_vec *)txq->buffer_ring;
-       buffer += txq->next_dd - (rs_thresh - 1);
-
-       if ((txq->offloads & RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE) &&
-                       (rs_thresh & 31) == 0) {
-               mp = buffer[0].mbuf->pool;
-               cache = rte_mempool_default_cache(mp, rte_lcore_id());
-
-               if (cache == NULL || cache->len)
-                       goto normal;
-
-               if (rs_thresh > RTE_MEMPOOL_CACHE_MAX_SIZE) {
-                       (void)rte_mempool_ops_enqueue_bulk(mp, (void *)buffer, 
rs_thresh);
-                       goto done;
-               }
-               cache_objs = &cache->objs[cache->len];
-
-               copied = 0;
-               while (copied < rs_thresh) {
-                       const __m512i objs0 = 
_mm512_loadu_si512(&buffer[copied]);
-                       const __m512i objs1 = _mm512_loadu_si512(&buffer[copied 
+ 8]);
-                       const __m512i objs2 = _mm512_loadu_si512(&buffer[copied 
+ 16]);
-                       const __m512i objs3 = _mm512_loadu_si512(&buffer[copied 
+ 24]);
-
-                       _mm512_storeu_si512(&cache_objs[copied], objs0);
-                       _mm512_storeu_si512(&cache_objs[copied + 8], objs1);
-                       _mm512_storeu_si512(&cache_objs[copied + 16], objs2);
-                       _mm512_storeu_si512(&cache_objs[copied + 24], objs3);
-                       copied += 32;
-               }
-               cache->len += rs_thresh;
-
-               if (cache->len >= cache->flushthresh) {
-                       (void)rte_mempool_ops_enqueue_bulk(mp,
-                                       &cache->objs[cache->size], cache->len - 
cache->size);
-                       cache->len = cache->size;
-               }
-               goto done;
-       }
-
-normal:
-       mbuf = rte_pktmbuf_prefree_seg(buffer[0].mbuf);
-
-       if (likely(mbuf)) {
-               mbuf_free_arr[0] = mbuf;
-               free_num = 1;
-
-               for (i = 1; i < rs_thresh; ++i) {
-                       mbuf = rte_pktmbuf_prefree_seg(buffer[i].mbuf);
-
-                       if (likely(mbuf)) {
-                               if (likely(mbuf->pool == 
mbuf_free_arr[0]->pool)) {
-                                       mbuf_free_arr[free_num] = mbuf;
-                                       free_num++;
-                               } else {
-                                       
rte_mempool_put_bulk(mbuf_free_arr[0]->pool,
-                                               (void *)mbuf_free_arr, 
free_num);
-
-                               mbuf_free_arr[0] = mbuf;
-                               free_num = 1;
-                       }
-                       }
-               }
-
-               rte_mempool_put_bulk(mbuf_free_arr[0]->pool,
-                                               (void *)mbuf_free_arr, 
free_num);
-       } else {
-               for (i = 1; i < rs_thresh; ++i) {
-                       mbuf = rte_pktmbuf_prefree_seg(buffer[i].mbuf);
-                       if (mbuf != NULL)
-                               rte_mempool_put(mbuf->pool, mbuf);
-               }
-       }
-
-done:
-       txq->desc_free_num += txq->rs_thresh;
-       txq->next_dd       += txq->rs_thresh;
-       if (txq->next_dd >= txq->ring_depth)
-               txq->next_dd = txq->rs_thresh - 1;
-       ret = rs_thresh;
-
-l_end:
-       return ret;
-}
-
 static __rte_always_inline void
 sxe2_tx_desc_fill_one_avx512(volatile union sxe2_tx_data_desc *desc, struct 
rte_mbuf *pkt,
        uint64_t desc_cmd, bool with_offloads)
@@ -228,7 +118,7 @@ sxe2_tx_pkts_vec_avx512_batch(struct sxe2_tx_queue *txq, 
struct rte_mbuf **tx_pk
        uint16_t tx_num;
 
        if (txq->desc_free_num < txq->free_thresh)
-               (void)sxe2_tx_bufs_free_vec_avx512(txq);
+               (void)sxe2_tx_bufs_free_vec(txq);
 
        nb_pkts = RTE_MIN(txq->desc_free_num, nb_pkts);
        if (unlikely(nb_pkts == 0)) {
@@ -241,15 +131,14 @@ sxe2_tx_pkts_vec_avx512_batch(struct sxe2_tx_queue *txq, 
struct rte_mbuf **tx_pk
 
        next_use = txq->next_use;
        desc     = &txq->desc_ring[next_use];
-       buffer   = (struct sxe2_tx_buffer_vec *)txq->buffer_ring;
-       buffer  += next_use;
+       buffer   = &txq->buffer_ring_vec[next_use];
 
        txq->desc_free_num -= nb_pkts;
 
        res_num = txq->ring_depth - txq->next_use;
 
        if (tx_num >= res_num) {
-               sxe2_tx_pkts_mbuf_fill_avx512(buffer, tx_pkts, res_num);
+               sxe2_tx_pkts_mbuf_fill_vec(buffer, tx_pkts, res_num);
 
                sxe2_tx_desc_fill_avx512(desc, tx_pkts, res_num,
                                        SXE2_TX_DATA_DESC_CMD_EOP, 
with_offloads);
@@ -265,10 +154,10 @@ sxe2_tx_pkts_vec_avx512_batch(struct sxe2_tx_queue *txq, 
struct rte_mbuf **tx_pk
                next_use     = 0;
                txq->next_rs = txq->rs_thresh - 1;
                desc         = txq->desc_ring;
-               buffer       = (struct sxe2_tx_buffer_vec *)txq->buffer_ring;
+               buffer       = &txq->buffer_ring_vec[next_use];
        }
 
-       sxe2_tx_pkts_mbuf_fill_avx512(buffer, tx_pkts, tx_num);
+       sxe2_tx_pkts_mbuf_fill_vec(buffer, tx_pkts, tx_num);
 
        sxe2_tx_desc_fill_avx512(desc, tx_pkts, tx_num,
                        SXE2_TX_DATA_DESC_CMD_EOP, with_offloads);
@@ -863,5 +752,3 @@ uint16_t sxe2_rx_pkts_scattered_vec_avx512_offload(void 
*rx_queue,
        return sxe2_rx_pkts_scattered_common_vec_avx512(rx_queue,
                        rx_pkts, nb_pkts, true);
 }
-
-#endif
diff --git a/drivers/net/sxe2/sxe2_txrx_vec_common.h 
b/drivers/net/sxe2/sxe2_txrx_vec_common.h
index 9ac99cf0fa..d16d0a5a5a 100644
--- a/drivers/net/sxe2/sxe2_txrx_vec_common.h
+++ b/drivers/net/sxe2/sxe2_txrx_vec_common.h
@@ -25,10 +25,11 @@
 #define SXE2_TX_FREE_BUFFER_SIZE_MAX_VEC  64
 
 static __rte_always_inline void
-sxe2_tx_pkts_mbuf_fill(struct sxe2_tx_buffer *buffer,
-               struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
+sxe2_tx_pkts_mbuf_fill_vec(struct sxe2_tx_buffer_vec *buffer,
+                          struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
 {
        uint16_t i;
+
        for (i = 0; i < nb_pkts; ++i)
                buffer[i].mbuf = tx_pkts[i];
 }
diff --git a/drivers/net/sxe2/sxe2_txrx_vec_neon.c 
b/drivers/net/sxe2/sxe2_txrx_vec_neon.c
index 4e5cb87cd5..c39e4ad81c 100644
--- a/drivers/net/sxe2/sxe2_txrx_vec_neon.c
+++ b/drivers/net/sxe2/sxe2_txrx_vec_neon.c
@@ -34,6 +34,51 @@ sxe2_tx_desc_fill_one_neon(volatile union sxe2_tx_data_desc 
*desc,
        vst1q_u64(RTE_CAST_PTR(uint64_t *, desc), data_desc);
 }
 
+static __rte_always_inline void
+sxe2_tx_desc_fill_4_neon_simple(volatile union sxe2_tx_data_desc *desc,
+                               struct rte_mbuf **pkts)
+{
+       uint64x2_t d0, d1, d2, d3;
+       uint64x2x4_t v;
+       const u64 cmd_base = ((u64)SXE2_TX_DESC_DTYPE_DATA) |
+                               ((u64)SXE2_TX_DATA_DESC_CMD_EOP) << 
SXE2_TX_DATA_DESC_CMD_SHIFT;
+
+       d0 = (uint64x2_t){
+               rte_pktmbuf_iova(pkts[0]),
+               cmd_base |
+               ((u64)pkts[0]->data_len) << SXE2_TX_DATA_DESC_BUF_SZ_SHIFT |
+               ((u64)SXE2_TX_DATA_DESC_MACLEN_VAL(pkts[0]->l2_len))
+                               << SXE2_TX_DATA_DESC_OFFSET_SHIFT
+       };
+       d1 = (uint64x2_t){
+               rte_pktmbuf_iova(pkts[1]),
+               cmd_base |
+               ((u64)pkts[1]->data_len) << SXE2_TX_DATA_DESC_BUF_SZ_SHIFT |
+               ((u64)SXE2_TX_DATA_DESC_MACLEN_VAL(pkts[1]->l2_len))
+                               << SXE2_TX_DATA_DESC_OFFSET_SHIFT
+       };
+       d2 = (uint64x2_t){
+               rte_pktmbuf_iova(pkts[2]),
+               cmd_base |
+               ((u64)pkts[2]->data_len) << SXE2_TX_DATA_DESC_BUF_SZ_SHIFT |
+               ((u64)SXE2_TX_DATA_DESC_MACLEN_VAL(pkts[2]->l2_len))
+                               << SXE2_TX_DATA_DESC_OFFSET_SHIFT
+       };
+       d3 = (uint64x2_t){
+               rte_pktmbuf_iova(pkts[3]),
+               cmd_base |
+               ((u64)pkts[3]->data_len) << SXE2_TX_DATA_DESC_BUF_SZ_SHIFT |
+               ((u64)SXE2_TX_DATA_DESC_MACLEN_VAL(pkts[3]->l2_len))
+                               << SXE2_TX_DATA_DESC_OFFSET_SHIFT
+       };
+
+       v.val[0] = d0;
+       v.val[1] = d1;
+       v.val[2] = d2;
+       v.val[3] = d3;
+       vst1q_u64_x4((u64 *)desc, v);
+}
+
 static __rte_always_inline uint16_t
 sxe2_tx_pkts_vec_neon_batch(struct sxe2_tx_queue *txq, struct rte_mbuf 
**tx_pkts,
                        uint16_t nb_pkts, bool with_offloads)
@@ -66,11 +111,19 @@ sxe2_tx_pkts_vec_neon_batch(struct sxe2_tx_queue *txq, 
struct rte_mbuf **tx_pkts
        res_num = txq->ring_depth - txq->next_use;
 
        if (tx_num >= res_num) {
-               sxe2_tx_pkts_mbuf_fill(buffer, tx_pkts, res_num);
-
-               for (i = 0; i < res_num - 1; ++i, ++tx_pkts, ++desc) {
-                       sxe2_tx_desc_fill_one_neon(desc, *tx_pkts,
-                                       SXE2_TX_DATA_DESC_CMD_EOP, 
with_offloads);
+               sxe2_tx_pkts_mbuf_fill_vec(buffer, tx_pkts, res_num);
+               if (with_offloads) {
+                       for (i = 0; i < res_num - 1; ++i, ++tx_pkts, ++desc) {
+                               sxe2_tx_desc_fill_one_neon(desc, *tx_pkts,
+                                               SXE2_TX_DATA_DESC_CMD_EOP, 
with_offloads);
+                       }
+               } else {
+                       for (i = 0; i + 3 < res_num - 1; i += 4, tx_pkts += 4, 
desc += 4)
+                               sxe2_tx_desc_fill_4_neon_simple(desc, tx_pkts);
+                       for (; i < res_num - 1; ++i, ++tx_pkts, ++desc) {
+                               sxe2_tx_desc_fill_one_neon(desc, *tx_pkts,
+                                               SXE2_TX_DATA_DESC_CMD_EOP, 
false);
+                       }
                }
 
                sxe2_tx_desc_fill_one_neon(desc, *tx_pkts++,
@@ -82,14 +135,23 @@ sxe2_tx_pkts_vec_neon_batch(struct sxe2_tx_queue *txq, 
struct rte_mbuf **tx_pkts
                next_use     = 0;
                txq->next_rs = txq->rs_thresh - 1;
                desc         = &txq->desc_ring[next_use];
-               buffer       = &txq->buffer_ring[next_use];
+               buffer       = &txq->buffer_ring_vec[next_use];
        }
 
-       sxe2_tx_pkts_mbuf_fill(buffer, tx_pkts, tx_num);
+       sxe2_tx_pkts_mbuf_fill_vec(buffer, tx_pkts, tx_num);
 
-       for (i = 0; i < tx_num; ++i, ++tx_pkts, ++desc) {
-               sxe2_tx_desc_fill_one_neon(desc, *tx_pkts,
-                               SXE2_TX_DATA_DESC_CMD_EOP, with_offloads);
+       if (with_offloads) {
+               for (i = 0; i < tx_num; ++i, ++tx_pkts, ++desc) {
+                       sxe2_tx_desc_fill_one_neon(desc, *tx_pkts,
+                                       SXE2_TX_DATA_DESC_CMD_EOP, true);
+               }
+       } else {
+               for (i = 0; i + 3 < tx_num; i += 4, tx_pkts += 4, desc += 4)
+                       sxe2_tx_desc_fill_4_neon_simple(desc, tx_pkts);
+               for (; i < tx_num; ++i, ++tx_pkts, ++desc) {
+                       sxe2_tx_desc_fill_one_neon(desc, *tx_pkts,
+                                       SXE2_TX_DATA_DESC_CMD_EOP, false);
+               }
        }
 
        next_use += tx_num;
@@ -150,22 +212,24 @@ uint16_t sxe2_tx_pkts_vec_neon(void *tx_queue,
 }
 
 static __rte_always_inline void
-sxe2_rx_desc_ptype_fill_neon(uint16x8_t staterr, struct rte_mbuf 
**__rte_restrict rx_pkts)
+sxe2_rx_desc_ptype_fill_neon(uint32x4_t desc_lo,
+                                                        struct rte_mbuf 
**__rte_restrict rx_pkts,
+                                                        const u32 
*__rte_restrict ptype_tbl)
 {
-       uint16x8_t ptype_mask = {
-               0, 0x3FFULL,
-               0, 0x3FFULL,
-               0, 0x3FFULL,
-               0, 0x3FFULL,
+       const uint32x4_t ptype_mask = {
+               SXE2_RX_DESC_PTYPE_MASK_NO_SHIFT << 16,
+               SXE2_RX_DESC_PTYPE_MASK_NO_SHIFT << 16,
+               SXE2_RX_DESC_PTYPE_MASK_NO_SHIFT << 16,
+               SXE2_RX_DESC_PTYPE_MASK_NO_SHIFT << 16,
        };
        uint16x8_t ptype_all;
 
-       ptype_all = vandq_u16(staterr, ptype_mask);
+       ptype_all = vreinterpretq_u16_u32(vandq_u32(desc_lo, ptype_mask));
 
-       rx_pkts[3]->packet_type = sxe2_ptype_tbl[vgetq_lane_u16(ptype_all, 3)];
-       rx_pkts[2]->packet_type = sxe2_ptype_tbl[vgetq_lane_u16(ptype_all, 7)];
-       rx_pkts[1]->packet_type = sxe2_ptype_tbl[vgetq_lane_u16(ptype_all, 1)];
-       rx_pkts[0]->packet_type = sxe2_ptype_tbl[vgetq_lane_u16(ptype_all, 5)];
+       rx_pkts[0]->packet_type = ptype_tbl[vgetq_lane_u16(ptype_all, 1)];
+       rx_pkts[1]->packet_type = ptype_tbl[vgetq_lane_u16(ptype_all, 3)];
+       rx_pkts[2]->packet_type = ptype_tbl[vgetq_lane_u16(ptype_all, 5)];
+       rx_pkts[3]->packet_type = ptype_tbl[vgetq_lane_u16(ptype_all, 7)];
 }
 
 static __rte_always_inline uint32x4_t
@@ -208,9 +272,10 @@ sxe2_rx_desc_fnav_flags_neon(uint64x2_t descs_arr[4])
 static __rte_always_inline void
 sxe2_rx_desc_offloads_para_fill_neon(struct sxe2_rx_queue *rxq,
                        volatile union sxe2_rx_desc *desc,
-                       uint64x2_t descs[4], struct rte_mbuf **rx_pkts)
+                       uint64x2_t descs[4], uint32x4_t desc_lo, uint32x4_t 
desc_hi,
+                       struct rte_mbuf **rx_pkts)
 {
-       uint32x4_t desc_lo, desc_hi, flags, tmp_flags;
+       uint32x4_t flags, tmp_flags;
        const uint64x2_t mbuf_init = {rxq->mbuf_init_value, 0};
        uint64x2_t rearm0, rearm1, rearm2, rearm3;
 
@@ -267,23 +332,6 @@ sxe2_rx_desc_offloads_para_fill_neon(struct sxe2_rx_queue 
*rxq,
                0, 0, 0, 0, 0, 0, 0, 0
        };
 
-       {
-               uint32x4_t d0 = vreinterpretq_u32_u64(descs[0]);
-               uint32x4_t d1 = vreinterpretq_u32_u64(descs[1]);
-               uint32x4_t d2 = vreinterpretq_u32_u64(descs[2]);
-               uint32x4_t d3 = vreinterpretq_u32_u64(descs[3]);
-               uint64x2_t f64, t64;
-
-               flags = vzip2q_u32(d1, d0);
-               tmp_flags = vzip2q_u32(d3, d2);
-               f64 = vreinterpretq_u64_u32(flags);
-               t64 = vreinterpretq_u64_u32(tmp_flags);
-               desc_lo = vreinterpretq_u32_u64(vcombine_u64(vget_low_u64(f64),
-                                                            
vget_low_u64(t64)));
-               desc_hi = vreinterpretq_u32_u64(vcombine_u64(vget_high_u64(f64),
-                                                            
vget_high_u64(t64)));
-       }
-
        desc_lo = vandq_u32(desc_lo, desc_msk);
        desc_hi = vandq_u32(desc_hi, rss_msk);
 
@@ -407,6 +455,7 @@ sxe2_rx_pkts_common_vec_neon(struct sxe2_rx_queue *rxq, 
struct rte_mbuf **rx_pkt
        struct rte_mbuf **buffer;
        uint32_t i;
        uint16_t done_num = 0;
+       const u32 *ptype_tbl = rxq->vsi->adapter->ptype_tbl;
 
        uint8x16_t rvp_shuf_mask = {
                0xFF, 0xFF, 0xFF, 0xFF,
@@ -442,25 +491,39 @@ sxe2_rx_pkts_common_vec_neon(struct sxe2_rx_queue *rxq, 
struct rte_mbuf **rx_pkt
                uint64x2_t descs[SXE2_RX_NUM_PER_LOOP_NEON];
                uint8x16_t pkt_mb1, pkt_mb2, pkt_mb3, pkt_mb4;
                uint64x2_t mbp1, mbp2;
+               uint32x4_t desc_lo, desc_hi;
                uint16x8_t staterr;
                uint16x8_t tmp;
                uint16_t bit_num;
 
                descs[3] = vld1q_u64(RTE_CAST_PTR(uint64_t *, desc + 3));
-               rte_atomic_thread_fence(rte_memory_order_acquire);
                descs[2] = vld1q_u64(RTE_CAST_PTR(uint64_t *, desc + 2));
-               rte_atomic_thread_fence(rte_memory_order_acquire);
                descs[1] = vld1q_u64(RTE_CAST_PTR(uint64_t *, desc + 1));
-               rte_atomic_thread_fence(rte_memory_order_acquire);
                descs[0] = vld1q_u64(RTE_CAST_PTR(uint64_t *, desc));
 
                rte_atomic_thread_fence(rte_memory_order_acquire);
-
                descs[3] = vld1q_lane_u64(RTE_CAST_PTR(uint64_t *, desc + 3), 
descs[3], 0);
                descs[2] = vld1q_lane_u64(RTE_CAST_PTR(uint64_t *, desc + 2), 
descs[2], 0);
                descs[1] = vld1q_lane_u64(RTE_CAST_PTR(uint64_t *, desc + 1), 
descs[1], 0);
                descs[0] = vld1q_lane_u64(RTE_CAST_PTR(uint64_t *, desc), 
descs[0], 0);
 
+               {
+                       uint32x4_t d0 = vreinterpretq_u32_u64(descs[0]);
+                       uint32x4_t d1 = vreinterpretq_u32_u64(descs[1]);
+                       uint32x4_t d2 = vreinterpretq_u32_u64(descs[2]);
+                       uint32x4_t d3 = vreinterpretq_u32_u64(descs[3]);
+
+                       uint32x4_t q1_01 = vzip2q_u32(d0, d1);
+                       uint32x4_t q1_23 = vzip2q_u32(d2, d3);
+                       uint64x2_t q1_01_64 = vreinterpretq_u64_u32(q1_01);
+                       uint64x2_t q1_23_64 = vreinterpretq_u64_u32(q1_23);
+
+                       desc_lo = 
vreinterpretq_u32_u64(vcombine_u64(vget_low_u64(q1_01_64),
+                                                       
vget_low_u64(q1_23_64)));
+                       desc_hi = 
vreinterpretq_u32_u64(vcombine_u64(vget_high_u64(q1_01_64),
+                                                       
vget_high_u64(q1_23_64)));
+               }
+
                mbp1 = vld1q_u64((uint64_t *)&buffer[i]);
                mbp2 = vld1q_u64((uint64_t *)&buffer[i + 2]);
 
@@ -480,7 +543,8 @@ sxe2_rx_pkts_common_vec_neon(struct sxe2_rx_queue *rxq, 
struct rte_mbuf **rx_pkt
                pkt_mb1 = vqtbl1q_u8(vreinterpretq_u8_u64(descs[0]), 
rvp_shuf_mask);
 
                if (do_offload) {
-                       sxe2_rx_desc_offloads_para_fill_neon(rxq, desc, descs, 
&rx_pkts[i]);
+                       sxe2_rx_desc_offloads_para_fill_neon(rxq, desc, descs, 
desc_lo,
+                                                            desc_hi, 
&rx_pkts[i]);
                } else {
                        const uint64x2_t mbuf_init = {
                                rxq->mbuf_init_value,
@@ -515,55 +579,48 @@ sxe2_rx_pkts_common_vec_neon(struct sxe2_rx_queue *rxq, 
struct rte_mbuf **rx_pkt
                        rte_prefetch_non_temporal(desc + 
SXE2_RX_NUM_PER_LOOP_NEON);
 
                {
-                       uint32x4_t d0 = vreinterpretq_u32_u64(descs[0]);
-                       uint32x4_t d1 = vreinterpretq_u32_u64(descs[1]);
-                       uint32x4_t d2 = vreinterpretq_u32_u64(descs[2]);
-                       uint32x4_t d3 = vreinterpretq_u32_u64(descs[3]);
-                       uint32x4_t sterr_tmp1 = vzip2q_u32(d1, d0);
-                       uint32x4_t sterr_tmp2 = vzip2q_u32(d3, d2);
-                       uint32x4_t sterr_u32 = vzip1q_u32(sterr_tmp1, 
sterr_tmp2);
-
-                       staterr = vreinterpretq_u16_u32(sterr_u32);
+                       uint16x8_t sterr_tmp1 = 
vzip2q_u16(vreinterpretq_u16_u64(descs[0]),
+                                                          
vreinterpretq_u16_u64(descs[2]));
+                       uint16x8_t sterr_tmp2 = 
vzip2q_u16(vreinterpretq_u16_u64(descs[1]),
+                                                          
vreinterpretq_u16_u64(descs[3]));
+                       staterr = vzip1q_u16(sterr_tmp1, sterr_tmp2);
                }
 
-               sxe2_rx_desc_ptype_fill_neon(staterr, &rx_pkts[i]);
+               sxe2_rx_desc_ptype_fill_neon(desc_lo, &rx_pkts[i], ptype_tbl);
 
                if (umbcast_flags != NULL) {
-                       uint32x4_t umbcast_mask = {
-                               SXE2_RX_DESC_STATUS_UMBCAST_MASK, 
SXE2_RX_DESC_STATUS_UMBCAST_MASK,
-                               SXE2_RX_DESC_STATUS_UMBCAST_MASK, 
SXE2_RX_DESC_STATUS_UMBCAST_MASK,
-                       };
-
+                       const uint32x4_t umbcast_mask =
+                               vdupq_n_u32(SXE2_RX_DESC_STATUS_UMBCAST_MASK);
                        uint8x16_t umbcast_shuf_mask = {
-                               0x0B, 0x03, 0x0F, 0x07,
+                               3, 7, 11, 15,
                                0xFF, 0xFF, 0xFF, 0xFF,
                                0xFF, 0xFF, 0xFF, 0xFF,
                                0xFF, 0xFF, 0xFF, 0xFF,
                        };
                        uint8x16_t umbcast_bits =
-                               
vreinterpretq_u8_u32(vandq_u32(vreinterpretq_u32_u16(staterr),
-                                                              umbcast_mask));
+                               vreinterpretq_u8_u32(vandq_u32(desc_lo, 
umbcast_mask));
 
                        umbcast_bits = vqtbl1q_u8(umbcast_bits, 
umbcast_shuf_mask);
-                       vst1q_lane_u32((uint32_t *)umbcast_flags,
-                                       vreinterpretq_u32_u8(umbcast_bits), 0);
+                       *(u32 *)umbcast_flags =
+                               
vgetq_lane_u32(vreinterpretq_u32_u8(umbcast_bits), 0);
                        umbcast_flags += SXE2_RX_NUM_PER_LOOP_NEON;
                }
 
                if (split_rxe_flags) {
                        uint8x16_t eop_shuf_mask = {
-                                       0x08, 0x00, 0x0C, 0x04,
+                                       0, 2, 4, 6,
                                        0xFF, 0xFF, 0xFF, 0xFF,
                                        0xFF, 0xFF, 0xFF, 0xFF,
                                        0xFF, 0xFF, 0xFF, 0xFF};
                        uint8x16_t eop_bits;
                        uint32x4_t rxe_mask = {
-                               0x2080, 0x2080, 0x2080, 0x2080
+                               0x20802080, 0x20802080, 0x20802080, 0x20802080
                        };
                        uint32x4_t rxe_bits;
                        uint32x4_t eop_mask;
 
-                       eop_mask = vshlq_n_u32(vdupq_n_u32(1), 
SXE2_RX_DESC_STATUS_EOP_SHIFT);
+                       eop_mask = vdupq_n_u32((1U << 
SXE2_RX_DESC_STATUS_EOP_SHIFT) |
+                                       (1U << (SXE2_RX_DESC_STATUS_EOP_SHIFT + 
16)));
                        eop_bits = 
vandq_u8(vmvnq_u8(vreinterpretq_u8_u16(staterr)),
                                        vreinterpretq_u8_u32(eop_mask));
 
@@ -587,12 +644,22 @@ sxe2_rx_pkts_common_vec_neon(struct sxe2_rx_queue *rxq, 
struct rte_mbuf **rx_pkt
                }
 
                {
-                       uint32x4_t dd_mask = vdupq_n_u32(1);
-                       uint32x4_t sterr_dd = 
vandq_u32(vreinterpretq_u32_u16(staterr), dd_mask);
-                       uint16x4_t packed_lo = vmovn_u32(sterr_dd);
-                       uint64_t dd64 = 
vget_lane_u64(vreinterpret_u64_u16(packed_lo), 0);
-
-                       bit_num = (uint16_t)rte_popcount64(dd64);
+                       const uint16x8_t dd_check = {
+                               0x0001, 0x0001, 0x0001, 0x0001,
+                               0, 0, 0, 0
+                       };
+                       uint16x8_t sterr_dd;
+                       uint64_t stat;
+                       sterr_dd = vandq_u16(staterr, dd_check);
+                       sterr_dd = vshlq_n_u16(sterr_dd, 15);
+                       sterr_dd =
+                               
vreinterpretq_u16_s16(vshrq_n_s16(vreinterpretq_s16_u16(sterr_dd),
+                                                                 15));
+                       stat = ~vgetq_lane_u64(vreinterpretq_u64_u16(sterr_dd), 
0);
+                       if (likely(stat == 0))
+                               bit_num = SXE2_RX_NUM_PER_LOOP_NEON;
+                       else
+                               bit_num = (u16)(rte_ctz64(stat) / 16);
                }
                done_num += bit_num;
                if (likely(bit_num != SXE2_RX_NUM_PER_LOOP_NEON))
diff --git a/drivers/net/sxe2/sxe2_txrx_vec_sse.c 
b/drivers/net/sxe2/sxe2_txrx_vec_sse.c
index c3e8a2983b..181bb40041 100644
--- a/drivers/net/sxe2/sxe2_txrx_vec_sse.c
+++ b/drivers/net/sxe2/sxe2_txrx_vec_sse.c
@@ -40,7 +40,7 @@ sxe2_tx_pkts_vec_sse_batch(struct sxe2_tx_queue *txq,
                uint16_t nb_pkts, bool with_offloads)
 {
        volatile union sxe2_tx_data_desc *desc;
-       struct sxe2_tx_buffer *buffer;
+       struct sxe2_tx_buffer_vec *buffer;
        uint16_t next_use;
        uint16_t res_num;
        uint16_t tx_num;
@@ -57,11 +57,11 @@ sxe2_tx_pkts_vec_sse_batch(struct sxe2_tx_queue *txq,
        tx_num = nb_pkts;
        next_use = txq->next_use;
        desc     = &txq->desc_ring[next_use];
-       buffer   = &txq->buffer_ring[next_use];
+       buffer   = &txq->buffer_ring_vec[next_use];
        txq->desc_free_num -= nb_pkts;
        res_num = txq->ring_depth - txq->next_use;
        if (tx_num >= res_num) {
-               sxe2_tx_pkts_mbuf_fill(buffer, tx_pkts, res_num);
+               sxe2_tx_pkts_mbuf_fill_vec(buffer, tx_pkts, res_num);
                for (i = 0; i < res_num - 1; ++i, ++tx_pkts, ++desc) {
                        sxe2_tx_desc_fill_one_sse(desc, *tx_pkts,
                                                  SXE2_TX_DATA_DESC_CMD_EOP,
@@ -74,9 +74,9 @@ sxe2_tx_pkts_vec_sse_batch(struct sxe2_tx_queue *txq,
                next_use     = 0;
                txq->next_rs = txq->rs_thresh - 1;
                desc         = &txq->desc_ring[next_use];
-               buffer       = &txq->buffer_ring[next_use];
+               buffer       = &txq->buffer_ring_vec[next_use];
        }
-       sxe2_tx_pkts_mbuf_fill(buffer, tx_pkts, tx_num);
+       sxe2_tx_pkts_mbuf_fill_vec(buffer, tx_pkts, tx_num);
        for (i = 0; i < tx_num; ++i, ++tx_pkts, ++desc) {
                sxe2_tx_desc_fill_one_sse(desc, *tx_pkts,
                                          SXE2_TX_DATA_DESC_CMD_EOP,
diff --git a/drivers/net/sxe2/sxe2_vsi.c b/drivers/net/sxe2/sxe2_vsi.c
index d29480b931..ba4cc7414e 100644
--- a/drivers/net/sxe2/sxe2_vsi.c
+++ b/drivers/net/sxe2/sxe2_vsi.c
@@ -230,7 +230,7 @@ int32_t sxe2_vsi_init(struct rte_eth_dev *dev)
        uint16_t srcvsi_cnt;
 
        PMD_INIT_FUNC_TRACE();
-
+       TAILQ_INIT(&adapter->vsi_ctxt.other_vsi_list);
        ret = sxe2_main_vsi_create(adapter);
        if (ret) {
                PMD_LOG_ERR(DRV, "Failed to create main VSI, ret=%d", ret);
@@ -283,13 +283,14 @@ void sxe2_vsi_uninit(struct rte_eth_dev *dev)
 
 l_free:
        ret = sxe2_vsi_destroy(adapter, adapter->vsi_ctxt.main_vsi);
-       if (ret) {
+       if (ret && ret != -EPERM) {
                PMD_LOG_ERR(DRV, "Failed to del vsi from fw, ret=%d", ret);
                goto l_end;
        }
+       adapter->vsi_ctxt.main_vsi = NULL;
        RTE_TAILQ_FOREACH_SAFE(var, &adapter->vsi_ctxt.other_vsi_list, next, 
tvar) {
                ret = sxe2_vsi_destroy(adapter, var);
-               if (ret) {
+               if (ret && ret != -EPERM) {
                        PMD_LOG_ERR(DRV, "Failed to del vsi from fw, ret=%d", 
ret);
                        break;
                }
@@ -357,4 +358,5 @@ void sxe2_vsi_repr_main_vsi_destroy(struct rte_eth_dev *dev)
        struct sxe2_adapter *adapter = SXE2_DEV_PRIVATE_TO_ADAPTER(dev);
 
        sxe2_vsi_node_free(adapter->vsi_ctxt.main_vsi);
+       adapter->vsi_ctxt.main_vsi = NULL;
 }
-- 
2.52.0

Reply via email to