aboutsummaryrefslogtreecommitdiff
path: root/sys/net
diff options
context:
space:
mode:
Diffstat (limited to 'sys/net')
-rw-r--r--sys/net/iflib.c7
-rw-r--r--sys/net/iflib.h4
2 files changed, 10 insertions, 1 deletions
diff --git a/sys/net/iflib.c b/sys/net/iflib.c
index 01da882f0d12..ea3754a07ee6 100644
--- a/sys/net/iflib.c
+++ b/sys/net/iflib.c
@@ -2604,7 +2604,12 @@ iflib_stop(if_ctx_t ctx)
iflib_txsd_free(ctx, txq, j);
}
txq->ift_processed = txq->ift_cleaned = txq->ift_cidx_processed = 0;
- txq->ift_in_use = txq->ift_gen = txq->ift_cidx = txq->ift_pidx = txq->ift_no_desc_avail = 0;
+ txq->ift_in_use = txq->ift_gen = txq->ift_no_desc_avail = 0;
+ if (sctx->isc_flags & IFLIB_PRESERVE_TX_INDICES)
+ txq->ift_cidx = txq->ift_pidx;
+ else
+ txq->ift_cidx = txq->ift_pidx = 0;
+
txq->ift_closed = txq->ift_mbuf_defrag = txq->ift_mbuf_defrag_failed = 0;
txq->ift_no_tx_dma_setup = txq->ift_txd_encap_efbig = txq->ift_map_failed = 0;
txq->ift_pullups = 0;
diff --git a/sys/net/iflib.h b/sys/net/iflib.h
index f88294b3d01a..b6dcf6311d2b 100644
--- a/sys/net/iflib.h
+++ b/sys/net/iflib.h
@@ -402,6 +402,10 @@ typedef enum {
* Interface has an admin completion queue
*/
#define IFLIB_HAS_ADMINCQ 0x100000
+/*
+ * Interface needs to preserve TX ring indices across restarts.
+ */
+#define IFLIB_PRESERVE_TX_INDICES 0x200000
/*
* These enum values are used in iflib_needs_restart to indicate to iflib