aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/sfxge/sfxge_rx.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/sfxge/sfxge_rx.c')
-rw-r--r--sys/dev/sfxge/sfxge_rx.c46
1 files changed, 43 insertions, 3 deletions
diff --git a/sys/dev/sfxge/sfxge_rx.c b/sys/dev/sfxge/sfxge_rx.c
index e73dc7d474fa..b0cbb8a3f5b6 100644
--- a/sys/dev/sfxge/sfxge_rx.c
+++ b/sys/dev/sfxge/sfxge_rx.c
@@ -56,6 +56,8 @@ __FBSDID("$FreeBSD$");
#define RX_REFILL_THRESHOLD(_entries) (EFX_RXQ_LIMIT(_entries) * 9 / 10)
+#ifdef SFXGE_LRO
+
/* Size of the LRO hash table. Must be a power of 2. A larger table
* means we can accelerate a larger number of streams.
*/
@@ -107,6 +109,8 @@ static unsigned long ipv6_addr_cmp(const struct in6_addr *left,
#endif
}
+#endif /* SFXGE_LRO */
+
void
sfxge_rx_qflush_done(struct sfxge_rxq *rxq)
{
@@ -209,7 +213,7 @@ sfxge_rx_qfill(struct sfxge_rxq *rxq, unsigned int target, boolean_t retrying)
SFXGE_EVQ_LOCK_ASSERT_OWNED(evq);
- if (rxq->init_state != SFXGE_RXQ_STARTED)
+ if (__predict_false(rxq->init_state != SFXGE_RXQ_STARTED))
return;
rxfill = rxq->added - rxq->completed;
@@ -269,7 +273,7 @@ void
sfxge_rx_qrefill(struct sfxge_rxq *rxq)
{
- if (rxq->init_state != SFXGE_RXQ_STARTED)
+ if (__predict_false(rxq->init_state != SFXGE_RXQ_STARTED))
return;
/* Make sure the queue is full */
@@ -315,6 +319,8 @@ sfxge_rx_deliver(struct sfxge_softc *sc, struct sfxge_rx_sw_desc *rx_desc)
rx_desc->mbuf = NULL;
}
+#ifdef SFXGE_LRO
+
static void
sfxge_lro_deliver(struct sfxge_lro_state *st, struct sfxge_lro_conn *c)
{
@@ -734,6 +740,20 @@ static void sfxge_lro_end_of_burst(struct sfxge_rxq *rxq)
sfxge_lro_purge_idle(rxq, t);
}
+#else /* !SFXGE_LRO */
+
+static void
+sfxge_lro(struct sfxge_rxq *rxq, struct sfxge_rx_sw_desc *rx_buf)
+{
+}
+
+static void
+sfxge_lro_end_of_burst(struct sfxge_rxq *rxq)
+{
+}
+
+#endif /* SFXGE_LRO */
+
void
sfxge_rx_qcomplete(struct sfxge_rxq *rxq, boolean_t eop)
{
@@ -760,7 +780,7 @@ sfxge_rx_qcomplete(struct sfxge_rxq *rxq, boolean_t eop)
rx_desc = &rxq->queue[id];
m = rx_desc->mbuf;
- if (rxq->init_state != SFXGE_RXQ_STARTED)
+ if (__predict_false(rxq->init_state != SFXGE_RXQ_STARTED))
goto discard;
if (rx_desc->flags & (EFX_ADDR_MISMATCH | EFX_DISCARD))
@@ -1014,6 +1034,8 @@ fail:
return (rc);
}
+#ifdef SFXGE_LRO
+
static void sfxge_lro_init(struct sfxge_rxq *rxq)
{
struct sfxge_lro_state *st = &rxq->lro;
@@ -1066,6 +1088,20 @@ static void sfxge_lro_fini(struct sfxge_rxq *rxq)
st->conns = NULL;
}
+#else
+
+static void
+sfxge_lro_init(struct sfxge_rxq *rxq)
+{
+}
+
+static void
+sfxge_lro_fini(struct sfxge_rxq *rxq)
+{
+}
+
+#endif /* SFXGE_LRO */
+
static void
sfxge_rx_qfini(struct sfxge_softc *sc, unsigned int index)
{
@@ -1136,6 +1172,7 @@ static const struct {
} sfxge_rx_stats[] = {
#define SFXGE_RX_STAT(name, member) \
{ #name, offsetof(struct sfxge_rxq, member) }
+#ifdef SFXGE_LRO
SFXGE_RX_STAT(lro_merges, lro.n_merges),
SFXGE_RX_STAT(lro_bursts, lro.n_bursts),
SFXGE_RX_STAT(lro_slow_start, lro.n_slow_start),
@@ -1144,6 +1181,7 @@ static const struct {
SFXGE_RX_STAT(lro_new_stream, lro.n_new_stream),
SFXGE_RX_STAT(lro_drop_idle, lro.n_drop_idle),
SFXGE_RX_STAT(lro_drop_closed, lro.n_drop_closed)
+#endif
};
static int
@@ -1200,8 +1238,10 @@ sfxge_rx_init(struct sfxge_softc *sc)
int index;
int rc;
+#ifdef SFXGE_LRO
if (lro_idle_ticks == 0)
lro_idle_ticks = hz / 10 + 1; /* 100 ms */
+#endif
intr = &sc->intr;