xref: /freebsd/sys/dev/sfxge/sfxge_rx.c (revision 8ef24a0d4b28fe230e20637f56869cc4148cd2ca)
1 /*-
2  * Copyright (c) 2010-2015 Solarflare Communications Inc.
3  * All rights reserved.
4  *
5  * This software was developed in part by Philip Paeps under contract for
6  * Solarflare Communications, Inc.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright notice,
12  *    this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright notice,
14  *    this list of conditions and the following disclaimer in the documentation
15  *    and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
19  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
21  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
24  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
27  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  *
29  * The views and conclusions contained in the software and documentation are
30  * those of the authors and should not be interpreted as representing official
31  * policies, either expressed or implied, of the FreeBSD Project.
32  */
33 
34 #include <sys/cdefs.h>
35 __FBSDID("$FreeBSD$");
36 
37 #include <sys/param.h>
38 #include <sys/malloc.h>
39 #include <sys/mbuf.h>
40 #include <sys/smp.h>
41 #include <sys/socket.h>
42 #include <sys/sysctl.h>
43 #include <sys/syslog.h>
44 #include <sys/limits.h>
45 #include <sys/syslog.h>
46 
47 #include <net/ethernet.h>
48 #include <net/if.h>
49 #include <net/if_vlan_var.h>
50 
51 #include <netinet/in.h>
52 #include <netinet/ip.h>
53 #include <netinet/ip6.h>
54 #include <netinet/tcp.h>
55 
56 #include <machine/in_cksum.h>
57 
58 #include "common/efx.h"
59 
60 
61 #include "sfxge.h"
62 #include "sfxge_rx.h"
63 
64 #define	RX_REFILL_THRESHOLD(_entries)	(EFX_RXQ_LIMIT(_entries) * 9 / 10)
65 
66 #ifdef SFXGE_LRO
67 
68 SYSCTL_NODE(_hw_sfxge, OID_AUTO, lro, CTLFLAG_RD, NULL,
69 	    "Large receive offload (LRO) parameters");
70 
71 #define	SFXGE_LRO_PARAM(_param)	SFXGE_PARAM(lro._param)
72 
73 /* Size of the LRO hash table.  Must be a power of 2.  A larger table
74  * means we can accelerate a larger number of streams.
75  */
76 static unsigned lro_table_size = 128;
77 TUNABLE_INT(SFXGE_LRO_PARAM(table_size), &lro_table_size);
78 SYSCTL_UINT(_hw_sfxge_lro, OID_AUTO, table_size, CTLFLAG_RDTUN,
79 	    &lro_table_size, 0,
80 	    "Size of the LRO hash table (must be a power of 2)");
81 
82 /* Maximum length of a hash chain.  If chains get too long then the lookup
83  * time increases and may exceed the benefit of LRO.
84  */
85 static unsigned lro_chain_max = 20;
86 TUNABLE_INT(SFXGE_LRO_PARAM(chain_max), &lro_chain_max);
87 SYSCTL_UINT(_hw_sfxge_lro, OID_AUTO, chain_max, CTLFLAG_RDTUN,
88 	    &lro_chain_max, 0,
89 	    "The maximum length of a hash chain");
90 
91 /* Maximum time (in ticks) that a connection can be idle before it's LRO
92  * state is discarded.
93  */
94 static unsigned lro_idle_ticks; /* initialised in sfxge_rx_init() */
95 TUNABLE_INT(SFXGE_LRO_PARAM(idle_ticks), &lro_idle_ticks);
96 SYSCTL_UINT(_hw_sfxge_lro, OID_AUTO, idle_ticks, CTLFLAG_RDTUN,
97 	    &lro_idle_ticks, 0,
98 	    "The maximum time (in ticks) that a connection can be idle "
99 	    "before it's LRO state is discarded");
100 
101 /* Number of packets with payload that must arrive in-order before a
102  * connection is eligible for LRO.  The idea is we should avoid coalescing
103  * segments when the sender is in slow-start because reducing the ACK rate
104  * can damage performance.
105  */
106 static int lro_slow_start_packets = 2000;
107 TUNABLE_INT(SFXGE_LRO_PARAM(slow_start_packets), &lro_slow_start_packets);
108 SYSCTL_UINT(_hw_sfxge_lro, OID_AUTO, slow_start_packets, CTLFLAG_RDTUN,
109 	    &lro_slow_start_packets, 0,
110 	    "Number of packets with payload that must arrive in-order before "
111 	    "a connection is eligible for LRO");
112 
113 /* Number of packets with payload that must arrive in-order following loss
114  * before a connection is eligible for LRO.  The idea is we should avoid
115  * coalescing segments when the sender is recovering from loss, because
116  * reducing the ACK rate can damage performance.
117  */
118 static int lro_loss_packets = 20;
119 TUNABLE_INT(SFXGE_LRO_PARAM(loss_packets), &lro_loss_packets);
120 SYSCTL_UINT(_hw_sfxge_lro, OID_AUTO, loss_packets, CTLFLAG_RDTUN,
121 	    &lro_loss_packets, 0,
122 	    "Number of packets with payload that must arrive in-order "
123 	    "following loss before a connection is eligible for LRO");
124 
125 /* Flags for sfxge_lro_conn::l2_id; must not collide with EVL_VLID_MASK */
126 #define	SFXGE_LRO_L2_ID_VLAN 0x4000
127 #define	SFXGE_LRO_L2_ID_IPV6 0x8000
128 #define	SFXGE_LRO_CONN_IS_VLAN_ENCAP(c) ((c)->l2_id & SFXGE_LRO_L2_ID_VLAN)
129 #define	SFXGE_LRO_CONN_IS_TCPIPV4(c) (!((c)->l2_id & SFXGE_LRO_L2_ID_IPV6))
130 
131 /* Compare IPv6 addresses, avoiding conditional branches */
132 static unsigned long ipv6_addr_cmp(const struct in6_addr *left,
133 				   const struct in6_addr *right)
134 {
135 #if LONG_BIT == 64
136 	const uint64_t *left64 = (const uint64_t *)left;
137 	const uint64_t *right64 = (const uint64_t *)right;
138 	return (left64[0] - right64[0]) | (left64[1] - right64[1]);
139 #else
140 	return (left->s6_addr32[0] - right->s6_addr32[0]) |
141 	       (left->s6_addr32[1] - right->s6_addr32[1]) |
142 	       (left->s6_addr32[2] - right->s6_addr32[2]) |
143 	       (left->s6_addr32[3] - right->s6_addr32[3]);
144 #endif
145 }
146 
147 #endif	/* SFXGE_LRO */
148 
149 void
150 sfxge_rx_qflush_done(struct sfxge_rxq *rxq)
151 {
152 
153 	rxq->flush_state = SFXGE_FLUSH_DONE;
154 }
155 
156 void
157 sfxge_rx_qflush_failed(struct sfxge_rxq *rxq)
158 {
159 
160 	rxq->flush_state = SFXGE_FLUSH_FAILED;
161 }
162 
163 static uint8_t toep_key[] = {
164 	0x6d, 0x5a, 0x56, 0xda, 0x25, 0x5b, 0x0e, 0xc2,
165 	0x41, 0x67, 0x25, 0x3d, 0x43, 0xa3, 0x8f, 0xb0,
166 	0xd0, 0xca, 0x2b, 0xcb, 0xae, 0x7b, 0x30, 0xb4,
167 	0x77, 0xcb, 0x2d, 0xa3, 0x80, 0x30, 0xf2, 0x0c,
168 	0x6a, 0x42, 0xb7, 0x3b, 0xbe, 0xac, 0x01, 0xfa
169 };
170 
171 static void
172 sfxge_rx_post_refill(void *arg)
173 {
174 	struct sfxge_rxq *rxq = arg;
175 	struct sfxge_softc *sc;
176 	unsigned int index;
177 	struct sfxge_evq *evq;
178 	uint16_t magic;
179 
180 	sc = rxq->sc;
181 	index = rxq->index;
182 	evq = sc->evq[index];
183 
184 	magic = SFXGE_MAGIC_RX_QREFILL | index;
185 
186 	/* This is guaranteed due to the start/stop order of rx and ev */
187 	KASSERT(evq->init_state == SFXGE_EVQ_STARTED,
188 	    ("evq not started"));
189 	KASSERT(rxq->init_state == SFXGE_RXQ_STARTED,
190 	    ("rxq not started"));
191 	efx_ev_qpost(evq->common, magic);
192 }
193 
194 static void
195 sfxge_rx_schedule_refill(struct sfxge_rxq *rxq, boolean_t retrying)
196 {
197 	/* Initially retry after 100 ms, but back off in case of
198 	 * repeated failures as we probably have to wait for the
199 	 * administrator to raise the pool limit. */
200 	if (retrying)
201 		rxq->refill_delay = min(rxq->refill_delay * 2, 10 * hz);
202 	else
203 		rxq->refill_delay = hz / 10;
204 
205 	callout_reset_curcpu(&rxq->refill_callout, rxq->refill_delay,
206 			     sfxge_rx_post_refill, rxq);
207 }
208 
209 #define	SFXGE_REFILL_BATCH  64
210 
211 static void
212 sfxge_rx_qfill(struct sfxge_rxq *rxq, unsigned int target, boolean_t retrying)
213 {
214 	struct sfxge_softc *sc;
215 	unsigned int index;
216 	struct sfxge_evq *evq;
217 	unsigned int batch;
218 	unsigned int rxfill;
219 	unsigned int mblksize;
220 	int ntodo;
221 	efsys_dma_addr_t addr[SFXGE_REFILL_BATCH];
222 
223 	sc = rxq->sc;
224 	index = rxq->index;
225 	evq = sc->evq[index];
226 
227 	prefetch_read_many(sc->enp);
228 	prefetch_read_many(rxq->common);
229 
230 	SFXGE_EVQ_LOCK_ASSERT_OWNED(evq);
231 
232 	if (__predict_false(rxq->init_state != SFXGE_RXQ_STARTED))
233 		return;
234 
235 	rxfill = rxq->added - rxq->completed;
236 	KASSERT(rxfill <= EFX_RXQ_LIMIT(rxq->entries),
237 	    ("rxfill > EFX_RXQ_LIMIT(rxq->entries)"));
238 	ntodo = min(EFX_RXQ_LIMIT(rxq->entries) - rxfill, target);
239 	KASSERT(ntodo <= EFX_RXQ_LIMIT(rxq->entries),
240 	    ("ntodo > EFX_RQX_LIMIT(rxq->entries)"));
241 
242 	if (ntodo == 0)
243 		return;
244 
245 	batch = 0;
246 	mblksize = sc->rx_buffer_size - sc->rx_buffer_align;
247 	while (ntodo-- > 0) {
248 		unsigned int id;
249 		struct sfxge_rx_sw_desc *rx_desc;
250 		bus_dma_segment_t seg;
251 		struct mbuf *m;
252 
253 		id = (rxq->added + batch) & rxq->ptr_mask;
254 		rx_desc = &rxq->queue[id];
255 		KASSERT(rx_desc->mbuf == NULL, ("rx_desc->mbuf != NULL"));
256 
257 		rx_desc->flags = EFX_DISCARD;
258 		m = rx_desc->mbuf = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR,
259 		    sc->rx_cluster_size);
260 		if (m == NULL)
261 			break;
262 
263 		/* m_len specifies length of area to be mapped for DMA */
264 		m->m_len  = mblksize;
265 		m->m_data = (caddr_t)P2ROUNDUP((uintptr_t)m->m_data, CACHE_LINE_SIZE);
266 		m->m_data += sc->rx_buffer_align;
267 
268 		sfxge_map_mbuf_fast(rxq->mem.esm_tag, rxq->mem.esm_map, m, &seg);
269 		addr[batch++] = seg.ds_addr;
270 
271 		if (batch == SFXGE_REFILL_BATCH) {
272 			efx_rx_qpost(rxq->common, addr, mblksize, batch,
273 			    rxq->completed, rxq->added);
274 			rxq->added += batch;
275 			batch = 0;
276 		}
277 	}
278 
279 	if (ntodo != 0)
280 		sfxge_rx_schedule_refill(rxq, retrying);
281 
282 	if (batch != 0) {
283 		efx_rx_qpost(rxq->common, addr, mblksize, batch,
284 		    rxq->completed, rxq->added);
285 		rxq->added += batch;
286 	}
287 
288 	/* Make the descriptors visible to the hardware */
289 	bus_dmamap_sync(rxq->mem.esm_tag, rxq->mem.esm_map,
290 			BUS_DMASYNC_PREWRITE);
291 
292 	efx_rx_qpush(rxq->common, rxq->added, &rxq->pushed);
293 
294 	/* The queue could still be empty if no descriptors were actually
295 	 * pushed, in which case there will be no event to cause the next
296 	 * refill, so we must schedule a refill ourselves.
297 	 */
298 	if(rxq->pushed == rxq->completed) {
299 		sfxge_rx_schedule_refill(rxq, retrying);
300 	}
301 }
302 
303 void
304 sfxge_rx_qrefill(struct sfxge_rxq *rxq)
305 {
306 
307 	if (__predict_false(rxq->init_state != SFXGE_RXQ_STARTED))
308 		return;
309 
310 	/* Make sure the queue is full */
311 	sfxge_rx_qfill(rxq, EFX_RXQ_LIMIT(rxq->entries), B_TRUE);
312 }
313 
314 static void __sfxge_rx_deliver(struct sfxge_softc *sc, struct mbuf *m)
315 {
316 	struct ifnet *ifp = sc->ifnet;
317 
318 	m->m_pkthdr.rcvif = ifp;
319 	m->m_pkthdr.csum_data = 0xffff;
320 	ifp->if_input(ifp, m);
321 }
322 
323 static void
324 sfxge_rx_deliver(struct sfxge_softc *sc, struct sfxge_rx_sw_desc *rx_desc)
325 {
326 	struct mbuf *m = rx_desc->mbuf;
327 	int flags = rx_desc->flags;
328 	int csum_flags;
329 
330 	/* Convert checksum flags */
331 	csum_flags = (flags & EFX_CKSUM_IPV4) ?
332 		(CSUM_IP_CHECKED | CSUM_IP_VALID) : 0;
333 	if (flags & EFX_CKSUM_TCPUDP)
334 		csum_flags |= CSUM_DATA_VALID | CSUM_PSEUDO_HDR;
335 
336 	if (flags & (EFX_PKT_IPV4 | EFX_PKT_IPV6)) {
337 		m->m_pkthdr.flowid =
338 			efx_psuedo_hdr_hash_get(sc->enp,
339 						EFX_RX_HASHALG_TOEPLITZ,
340 						mtod(m, uint8_t *));
341 		/* The hash covers a 4-tuple for TCP only */
342 		M_HASHTYPE_SET(m,
343 		    (flags & EFX_PKT_IPV4) ?
344 			((flags & EFX_PKT_TCP) ?
345 			    M_HASHTYPE_RSS_TCP_IPV4 : M_HASHTYPE_RSS_IPV4) :
346 			((flags & EFX_PKT_TCP) ?
347 			    M_HASHTYPE_RSS_TCP_IPV6 : M_HASHTYPE_RSS_IPV6));
348 	}
349 	m->m_data += sc->rx_prefix_size;
350 	m->m_len = rx_desc->size - sc->rx_prefix_size;
351 	m->m_pkthdr.len = m->m_len;
352 	m->m_pkthdr.csum_flags = csum_flags;
353 	__sfxge_rx_deliver(sc, rx_desc->mbuf);
354 
355 	rx_desc->flags = EFX_DISCARD;
356 	rx_desc->mbuf = NULL;
357 }
358 
359 #ifdef SFXGE_LRO
360 
361 static void
362 sfxge_lro_deliver(struct sfxge_lro_state *st, struct sfxge_lro_conn *c)
363 {
364 	struct sfxge_softc *sc = st->sc;
365 	struct mbuf *m = c->mbuf;
366 	struct tcphdr *c_th;
367 	int csum_flags;
368 
369 	KASSERT(m, ("no mbuf to deliver"));
370 
371 	++st->n_bursts;
372 
373 	/* Finish off packet munging and recalculate IP header checksum. */
374 	if (SFXGE_LRO_CONN_IS_TCPIPV4(c)) {
375 		struct ip *iph = c->nh;
376 		iph->ip_len = htons(iph->ip_len);
377 		iph->ip_sum = 0;
378 		iph->ip_sum = in_cksum_hdr(iph);
379 		c_th = (struct tcphdr *)(iph + 1);
380 		csum_flags = (CSUM_DATA_VALID | CSUM_PSEUDO_HDR |
381 			      CSUM_IP_CHECKED | CSUM_IP_VALID);
382 	} else {
383 		struct ip6_hdr *iph = c->nh;
384 		iph->ip6_plen = htons(iph->ip6_plen);
385 		c_th = (struct tcphdr *)(iph + 1);
386 		csum_flags = CSUM_DATA_VALID | CSUM_PSEUDO_HDR;
387 	}
388 
389 	c_th->th_win = c->th_last->th_win;
390 	c_th->th_ack = c->th_last->th_ack;
391 	if (c_th->th_off == c->th_last->th_off) {
392 		/* Copy TCP options (take care to avoid going negative). */
393 		int optlen = ((c_th->th_off - 5) & 0xf) << 2u;
394 		memcpy(c_th + 1, c->th_last + 1, optlen);
395 	}
396 
397 	m->m_pkthdr.flowid = c->conn_hash;
398 	M_HASHTYPE_SET(m,
399 	    SFXGE_LRO_CONN_IS_TCPIPV4(c) ?
400 		M_HASHTYPE_RSS_TCP_IPV4 : M_HASHTYPE_RSS_TCP_IPV6);
401 
402 	m->m_pkthdr.csum_flags = csum_flags;
403 	__sfxge_rx_deliver(sc, m);
404 
405 	c->mbuf = NULL;
406 	c->delivered = 1;
407 }
408 
409 /* Drop the given connection, and add it to the free list. */
410 static void sfxge_lro_drop(struct sfxge_rxq *rxq, struct sfxge_lro_conn *c)
411 {
412 	unsigned bucket;
413 
414 	KASSERT(!c->mbuf, ("found orphaned mbuf"));
415 
416 	if (c->next_buf.mbuf != NULL) {
417 		sfxge_rx_deliver(rxq->sc, &c->next_buf);
418 		LIST_REMOVE(c, active_link);
419 	}
420 
421 	bucket = c->conn_hash & rxq->lro.conns_mask;
422 	KASSERT(rxq->lro.conns_n[bucket] > 0, ("LRO: bucket fill level wrong"));
423 	--rxq->lro.conns_n[bucket];
424 	TAILQ_REMOVE(&rxq->lro.conns[bucket], c, link);
425 	TAILQ_INSERT_HEAD(&rxq->lro.free_conns, c, link);
426 }
427 
428 /* Stop tracking connections that have gone idle in order to keep hash
429  * chains short.
430  */
431 static void sfxge_lro_purge_idle(struct sfxge_rxq *rxq, unsigned now)
432 {
433 	struct sfxge_lro_conn *c;
434 	unsigned i;
435 
436 	KASSERT(LIST_EMPTY(&rxq->lro.active_conns),
437 		("found active connections"));
438 
439 	rxq->lro.last_purge_ticks = now;
440 	for (i = 0; i <= rxq->lro.conns_mask; ++i) {
441 		if (TAILQ_EMPTY(&rxq->lro.conns[i]))
442 			continue;
443 
444 		c = TAILQ_LAST(&rxq->lro.conns[i], sfxge_lro_tailq);
445 		if (now - c->last_pkt_ticks > lro_idle_ticks) {
446 			++rxq->lro.n_drop_idle;
447 			sfxge_lro_drop(rxq, c);
448 		}
449 	}
450 }
451 
452 static void
453 sfxge_lro_merge(struct sfxge_lro_state *st, struct sfxge_lro_conn *c,
454 		struct mbuf *mbuf, struct tcphdr *th)
455 {
456 	struct tcphdr *c_th;
457 
458 	/* Tack the new mbuf onto the chain. */
459 	KASSERT(!mbuf->m_next, ("mbuf already chained"));
460 	c->mbuf_tail->m_next = mbuf;
461 	c->mbuf_tail = mbuf;
462 
463 	/* Increase length appropriately */
464 	c->mbuf->m_pkthdr.len += mbuf->m_len;
465 
466 	/* Update the connection state flags */
467 	if (SFXGE_LRO_CONN_IS_TCPIPV4(c)) {
468 		struct ip *iph = c->nh;
469 		iph->ip_len += mbuf->m_len;
470 		c_th = (struct tcphdr *)(iph + 1);
471 	} else {
472 		struct ip6_hdr *iph = c->nh;
473 		iph->ip6_plen += mbuf->m_len;
474 		c_th = (struct tcphdr *)(iph + 1);
475 	}
476 	c_th->th_flags |= (th->th_flags & TH_PUSH);
477 	c->th_last = th;
478 	++st->n_merges;
479 
480 	/* Pass packet up now if another segment could overflow the IP
481 	 * length.
482 	 */
483 	if (c->mbuf->m_pkthdr.len > 65536 - 9200)
484 		sfxge_lro_deliver(st, c);
485 }
486 
487 static void
488 sfxge_lro_start(struct sfxge_lro_state *st, struct sfxge_lro_conn *c,
489 		struct mbuf *mbuf, void *nh, struct tcphdr *th)
490 {
491 	/* Start the chain */
492 	c->mbuf = mbuf;
493 	c->mbuf_tail = c->mbuf;
494 	c->nh = nh;
495 	c->th_last = th;
496 
497 	mbuf->m_pkthdr.len = mbuf->m_len;
498 
499 	/* Mangle header fields for later processing */
500 	if (SFXGE_LRO_CONN_IS_TCPIPV4(c)) {
501 		struct ip *iph = nh;
502 		iph->ip_len = ntohs(iph->ip_len);
503 	} else {
504 		struct ip6_hdr *iph = nh;
505 		iph->ip6_plen = ntohs(iph->ip6_plen);
506 	}
507 }
508 
509 /* Try to merge or otherwise hold or deliver (as appropriate) the
510  * packet buffered for this connection (c->next_buf).  Return a flag
511  * indicating whether the connection is still active for LRO purposes.
512  */
513 static int
514 sfxge_lro_try_merge(struct sfxge_rxq *rxq, struct sfxge_lro_conn *c)
515 {
516 	struct sfxge_rx_sw_desc *rx_buf = &c->next_buf;
517 	char *eh = c->next_eh;
518 	int data_length, hdr_length, dont_merge;
519 	unsigned th_seq, pkt_length;
520 	struct tcphdr *th;
521 	unsigned now;
522 
523 	if (SFXGE_LRO_CONN_IS_TCPIPV4(c)) {
524 		struct ip *iph = c->next_nh;
525 		th = (struct tcphdr *)(iph + 1);
526 		pkt_length = ntohs(iph->ip_len) + (char *) iph - eh;
527 	} else {
528 		struct ip6_hdr *iph = c->next_nh;
529 		th = (struct tcphdr *)(iph + 1);
530 		pkt_length = ntohs(iph->ip6_plen) + (char *) th - eh;
531 	}
532 
533 	hdr_length = (char *) th + th->th_off * 4 - eh;
534 	data_length = (min(pkt_length, rx_buf->size - rxq->sc->rx_prefix_size) -
535 		       hdr_length);
536 	th_seq = ntohl(th->th_seq);
537 	dont_merge = ((data_length <= 0)
538 		      | (th->th_flags & (TH_URG | TH_SYN | TH_RST | TH_FIN)));
539 
540 	/* Check for options other than aligned timestamp. */
541 	if (th->th_off != 5) {
542 		const uint32_t *opt_ptr = (const uint32_t *) (th + 1);
543 		if (th->th_off == 8 &&
544 		    opt_ptr[0] == ntohl((TCPOPT_NOP << 24) |
545 					(TCPOPT_NOP << 16) |
546 					(TCPOPT_TIMESTAMP << 8) |
547 					TCPOLEN_TIMESTAMP)) {
548 			/* timestamp option -- okay */
549 		} else {
550 			dont_merge = 1;
551 		}
552 	}
553 
554 	if (__predict_false(th_seq != c->next_seq)) {
555 		/* Out-of-order, so start counting again. */
556 		if (c->mbuf != NULL)
557 			sfxge_lro_deliver(&rxq->lro, c);
558 		c->n_in_order_pkts -= lro_loss_packets;
559 		c->next_seq = th_seq + data_length;
560 		++rxq->lro.n_misorder;
561 		goto deliver_buf_out;
562 	}
563 	c->next_seq = th_seq + data_length;
564 
565 	now = ticks;
566 	if (now - c->last_pkt_ticks > lro_idle_ticks) {
567 		++rxq->lro.n_drop_idle;
568 		if (c->mbuf != NULL)
569 			sfxge_lro_deliver(&rxq->lro, c);
570 		sfxge_lro_drop(rxq, c);
571 		return (0);
572 	}
573 	c->last_pkt_ticks = ticks;
574 
575 	if (c->n_in_order_pkts < lro_slow_start_packets) {
576 		/* May be in slow-start, so don't merge. */
577 		++rxq->lro.n_slow_start;
578 		++c->n_in_order_pkts;
579 		goto deliver_buf_out;
580 	}
581 
582 	if (__predict_false(dont_merge)) {
583 		if (c->mbuf != NULL)
584 			sfxge_lro_deliver(&rxq->lro, c);
585 		if (th->th_flags & (TH_FIN | TH_RST)) {
586 			++rxq->lro.n_drop_closed;
587 			sfxge_lro_drop(rxq, c);
588 			return (0);
589 		}
590 		goto deliver_buf_out;
591 	}
592 
593 	rx_buf->mbuf->m_data += rxq->sc->rx_prefix_size;
594 
595 	if (__predict_true(c->mbuf != NULL)) {
596 		/* Remove headers and any padding */
597 		rx_buf->mbuf->m_data += hdr_length;
598 		rx_buf->mbuf->m_len = data_length;
599 
600 		sfxge_lro_merge(&rxq->lro, c, rx_buf->mbuf, th);
601 	} else {
602 		/* Remove any padding */
603 		rx_buf->mbuf->m_len = pkt_length;
604 
605 		sfxge_lro_start(&rxq->lro, c, rx_buf->mbuf, c->next_nh, th);
606 	}
607 
608 	rx_buf->mbuf = NULL;
609 	return (1);
610 
611  deliver_buf_out:
612 	sfxge_rx_deliver(rxq->sc, rx_buf);
613 	return (1);
614 }
615 
616 static void sfxge_lro_new_conn(struct sfxge_lro_state *st, uint32_t conn_hash,
617 			       uint16_t l2_id, void *nh, struct tcphdr *th)
618 {
619 	unsigned bucket = conn_hash & st->conns_mask;
620 	struct sfxge_lro_conn *c;
621 
622 	if (st->conns_n[bucket] >= lro_chain_max) {
623 		++st->n_too_many;
624 		return;
625 	}
626 
627 	if (!TAILQ_EMPTY(&st->free_conns)) {
628 		c = TAILQ_FIRST(&st->free_conns);
629 		TAILQ_REMOVE(&st->free_conns, c, link);
630 	} else {
631 		c = malloc(sizeof(*c), M_SFXGE, M_NOWAIT);
632 		if (c == NULL)
633 			return;
634 		c->mbuf = NULL;
635 		c->next_buf.mbuf = NULL;
636 	}
637 
638 	/* Create the connection tracking data */
639 	++st->conns_n[bucket];
640 	TAILQ_INSERT_HEAD(&st->conns[bucket], c, link);
641 	c->l2_id = l2_id;
642 	c->conn_hash = conn_hash;
643 	c->source = th->th_sport;
644 	c->dest = th->th_dport;
645 	c->n_in_order_pkts = 0;
646 	c->last_pkt_ticks = *(volatile int *)&ticks;
647 	c->delivered = 0;
648 	++st->n_new_stream;
649 	/* NB. We don't initialise c->next_seq, and it doesn't matter what
650 	 * value it has.  Most likely the next packet received for this
651 	 * connection will not match -- no harm done.
652 	 */
653 }
654 
655 /* Process mbuf and decide whether to dispatch it to the stack now or
656  * later.
657  */
658 static void
659 sfxge_lro(struct sfxge_rxq *rxq, struct sfxge_rx_sw_desc *rx_buf)
660 {
661 	struct sfxge_softc *sc = rxq->sc;
662 	struct mbuf *m = rx_buf->mbuf;
663 	struct ether_header *eh;
664 	struct sfxge_lro_conn *c;
665 	uint16_t l2_id;
666 	uint16_t l3_proto;
667 	void *nh;
668 	struct tcphdr *th;
669 	uint32_t conn_hash;
670 	unsigned bucket;
671 
672 	/* Get the hardware hash */
673 	conn_hash = efx_psuedo_hdr_hash_get(sc->enp,
674 					    EFX_RX_HASHALG_TOEPLITZ,
675 					    mtod(m, uint8_t *));
676 
677 	eh = (struct ether_header *)(m->m_data + sc->rx_prefix_size);
678 	if (eh->ether_type == htons(ETHERTYPE_VLAN)) {
679 		struct ether_vlan_header *veh = (struct ether_vlan_header *)eh;
680 		l2_id = EVL_VLANOFTAG(ntohs(veh->evl_tag)) |
681 			SFXGE_LRO_L2_ID_VLAN;
682 		l3_proto = veh->evl_proto;
683 		nh = veh + 1;
684 	} else {
685 		l2_id = 0;
686 		l3_proto = eh->ether_type;
687 		nh = eh + 1;
688 	}
689 
690 	/* Check whether this is a suitable packet (unfragmented
691 	 * TCP/IPv4 or TCP/IPv6).  If so, find the TCP header and
692 	 * length, and compute a hash if necessary.  If not, return.
693 	 */
694 	if (l3_proto == htons(ETHERTYPE_IP)) {
695 		struct ip *iph = nh;
696 
697 		KASSERT(iph->ip_p == IPPROTO_TCP,
698 		    ("IPv4 protocol is not TCP, but packet marker is set"));
699 		if ((iph->ip_hl - (sizeof(*iph) >> 2u)) |
700 		    (iph->ip_off & htons(IP_MF | IP_OFFMASK)))
701 			goto deliver_now;
702 		th = (struct tcphdr *)(iph + 1);
703 	} else if (l3_proto == htons(ETHERTYPE_IPV6)) {
704 		struct ip6_hdr *iph = nh;
705 
706 		KASSERT(iph->ip6_nxt == IPPROTO_TCP,
707 		    ("IPv6 next header is not TCP, but packet marker is set"));
708 		l2_id |= SFXGE_LRO_L2_ID_IPV6;
709 		th = (struct tcphdr *)(iph + 1);
710 	} else {
711 		goto deliver_now;
712 	}
713 
714 	bucket = conn_hash & rxq->lro.conns_mask;
715 
716 	TAILQ_FOREACH(c, &rxq->lro.conns[bucket], link) {
717 		if ((c->l2_id - l2_id) | (c->conn_hash - conn_hash))
718 			continue;
719 		if ((c->source - th->th_sport) | (c->dest - th->th_dport))
720 			continue;
721 		if (c->mbuf != NULL) {
722 			if (SFXGE_LRO_CONN_IS_TCPIPV4(c)) {
723 				struct ip *c_iph, *iph = nh;
724 				c_iph = c->nh;
725 				if ((c_iph->ip_src.s_addr - iph->ip_src.s_addr) |
726 				    (c_iph->ip_dst.s_addr - iph->ip_dst.s_addr))
727 					continue;
728 			} else {
729 				struct ip6_hdr *c_iph, *iph = nh;
730 				c_iph = c->nh;
731 				if (ipv6_addr_cmp(&c_iph->ip6_src, &iph->ip6_src) |
732 				    ipv6_addr_cmp(&c_iph->ip6_dst, &iph->ip6_dst))
733 					continue;
734 			}
735 		}
736 
737 		/* Re-insert at head of list to reduce lookup time. */
738 		TAILQ_REMOVE(&rxq->lro.conns[bucket], c, link);
739 		TAILQ_INSERT_HEAD(&rxq->lro.conns[bucket], c, link);
740 
741 		if (c->next_buf.mbuf != NULL) {
742 			if (!sfxge_lro_try_merge(rxq, c))
743 				goto deliver_now;
744 		} else {
745 			LIST_INSERT_HEAD(&rxq->lro.active_conns, c,
746 			    active_link);
747 		}
748 		c->next_buf = *rx_buf;
749 		c->next_eh = eh;
750 		c->next_nh = nh;
751 
752 		rx_buf->mbuf = NULL;
753 		rx_buf->flags = EFX_DISCARD;
754 		return;
755 	}
756 
757 	sfxge_lro_new_conn(&rxq->lro, conn_hash, l2_id, nh, th);
758  deliver_now:
759 	sfxge_rx_deliver(sc, rx_buf);
760 }
761 
762 static void sfxge_lro_end_of_burst(struct sfxge_rxq *rxq)
763 {
764 	struct sfxge_lro_state *st = &rxq->lro;
765 	struct sfxge_lro_conn *c;
766 	unsigned t;
767 
768 	while (!LIST_EMPTY(&st->active_conns)) {
769 		c = LIST_FIRST(&st->active_conns);
770 		if (!c->delivered && c->mbuf != NULL)
771 			sfxge_lro_deliver(st, c);
772 		if (sfxge_lro_try_merge(rxq, c)) {
773 			if (c->mbuf != NULL)
774 				sfxge_lro_deliver(st, c);
775 			LIST_REMOVE(c, active_link);
776 		}
777 		c->delivered = 0;
778 	}
779 
780 	t = *(volatile int *)&ticks;
781 	if (__predict_false(t != st->last_purge_ticks))
782 		sfxge_lro_purge_idle(rxq, t);
783 }
784 
785 #else	/* !SFXGE_LRO */
786 
787 static void
788 sfxge_lro(struct sfxge_rxq *rxq, struct sfxge_rx_sw_desc *rx_buf)
789 {
790 }
791 
792 static void
793 sfxge_lro_end_of_burst(struct sfxge_rxq *rxq)
794 {
795 }
796 
797 #endif	/* SFXGE_LRO */
798 
799 void
800 sfxge_rx_qcomplete(struct sfxge_rxq *rxq, boolean_t eop)
801 {
802 	struct sfxge_softc *sc = rxq->sc;
803 	int if_capenable = sc->ifnet->if_capenable;
804 	int lro_enabled = if_capenable & IFCAP_LRO;
805 	unsigned int index;
806 	struct sfxge_evq *evq;
807 	unsigned int completed;
808 	unsigned int level;
809 	struct mbuf *m;
810 	struct sfxge_rx_sw_desc *prev = NULL;
811 
812 	index = rxq->index;
813 	evq = sc->evq[index];
814 
815 	SFXGE_EVQ_LOCK_ASSERT_OWNED(evq);
816 
817 	completed = rxq->completed;
818 	while (completed != rxq->pending) {
819 		unsigned int id;
820 		struct sfxge_rx_sw_desc *rx_desc;
821 
822 		id = completed++ & rxq->ptr_mask;
823 		rx_desc = &rxq->queue[id];
824 		m = rx_desc->mbuf;
825 
826 		if (__predict_false(rxq->init_state != SFXGE_RXQ_STARTED))
827 			goto discard;
828 
829 		if (rx_desc->flags & (EFX_ADDR_MISMATCH | EFX_DISCARD))
830 			goto discard;
831 
832 		/* Read the length from the pseudo header if required */
833 		if (rx_desc->flags & EFX_PKT_PREFIX_LEN) {
834 			uint16_t tmp_size;
835 			int rc;
836 			rc = efx_psuedo_hdr_pkt_length_get(sc->enp,
837 							   mtod(m, uint8_t *),
838 							   &tmp_size);
839 			KASSERT(rc == 0, ("cannot get packet length: %d", rc));
840 			rx_desc->size = (int)tmp_size + sc->rx_prefix_size;
841 		}
842 
843 		prefetch_read_many(mtod(m, caddr_t));
844 
845 		switch (rx_desc->flags & (EFX_PKT_IPV4 | EFX_PKT_IPV6)) {
846 		case EFX_PKT_IPV4:
847 			if (~if_capenable & IFCAP_RXCSUM)
848 				rx_desc->flags &=
849 				    ~(EFX_CKSUM_IPV4 | EFX_CKSUM_TCPUDP);
850 			break;
851 		case EFX_PKT_IPV6:
852 			if (~if_capenable & IFCAP_RXCSUM_IPV6)
853 				rx_desc->flags &= ~EFX_CKSUM_TCPUDP;
854 			break;
855 		case 0:
856 			/* Check for loopback packets */
857 			{
858 				struct ether_header *etherhp;
859 
860 				/*LINTED*/
861 				etherhp = mtod(m, struct ether_header *);
862 
863 				if (etherhp->ether_type ==
864 				    htons(SFXGE_ETHERTYPE_LOOPBACK)) {
865 					EFSYS_PROBE(loopback);
866 
867 					rxq->loopback++;
868 					goto discard;
869 				}
870 			}
871 			break;
872 		default:
873 			KASSERT(B_FALSE,
874 			    ("Rx descriptor with both IPv4 and IPv6 flags"));
875 			goto discard;
876 		}
877 
878 		/* Pass packet up the stack or into LRO (pipelined) */
879 		if (prev != NULL) {
880 			if (lro_enabled &&
881 			    ((prev->flags & (EFX_PKT_TCP | EFX_CKSUM_TCPUDP)) ==
882 			     (EFX_PKT_TCP | EFX_CKSUM_TCPUDP)))
883 				sfxge_lro(rxq, prev);
884 			else
885 				sfxge_rx_deliver(sc, prev);
886 		}
887 		prev = rx_desc;
888 		continue;
889 
890 discard:
891 		/* Return the packet to the pool */
892 		m_free(m);
893 		rx_desc->mbuf = NULL;
894 	}
895 	rxq->completed = completed;
896 
897 	level = rxq->added - rxq->completed;
898 
899 	/* Pass last packet up the stack or into LRO */
900 	if (prev != NULL) {
901 		if (lro_enabled &&
902 		    ((prev->flags & (EFX_PKT_TCP | EFX_CKSUM_TCPUDP)) ==
903 		     (EFX_PKT_TCP | EFX_CKSUM_TCPUDP)))
904 			sfxge_lro(rxq, prev);
905 		else
906 			sfxge_rx_deliver(sc, prev);
907 	}
908 
909 	/*
910 	 * If there are any pending flows and this is the end of the
911 	 * poll then they must be completed.
912 	 */
913 	if (eop)
914 		sfxge_lro_end_of_burst(rxq);
915 
916 	/* Top up the queue if necessary */
917 	if (level < rxq->refill_threshold)
918 		sfxge_rx_qfill(rxq, EFX_RXQ_LIMIT(rxq->entries), B_FALSE);
919 }
920 
921 static void
922 sfxge_rx_qstop(struct sfxge_softc *sc, unsigned int index)
923 {
924 	struct sfxge_rxq *rxq;
925 	struct sfxge_evq *evq;
926 	unsigned int count;
927 	unsigned int retry = 3;
928 
929 	SFXGE_ADAPTER_LOCK_ASSERT_OWNED(sc);
930 
931 	rxq = sc->rxq[index];
932 	evq = sc->evq[index];
933 
934 	SFXGE_EVQ_LOCK(evq);
935 
936 	KASSERT(rxq->init_state == SFXGE_RXQ_STARTED,
937 	    ("rxq not started"));
938 
939 	rxq->init_state = SFXGE_RXQ_INITIALIZED;
940 
941 	callout_stop(&rxq->refill_callout);
942 
943 	while (rxq->flush_state != SFXGE_FLUSH_DONE && retry != 0) {
944 		rxq->flush_state = SFXGE_FLUSH_PENDING;
945 
946 		SFXGE_EVQ_UNLOCK(evq);
947 
948 		/* Flush the receive queue */
949 		if (efx_rx_qflush(rxq->common) != 0) {
950 			SFXGE_EVQ_LOCK(evq);
951 			rxq->flush_state = SFXGE_FLUSH_FAILED;
952 			break;
953 		}
954 
955 		count = 0;
956 		do {
957 			/* Spin for 100 ms */
958 			DELAY(100000);
959 
960 			if (rxq->flush_state != SFXGE_FLUSH_PENDING)
961 				break;
962 
963 		} while (++count < 20);
964 
965 		SFXGE_EVQ_LOCK(evq);
966 
967 		if (rxq->flush_state == SFXGE_FLUSH_PENDING) {
968 			/* Flush timeout - neither done nor failed */
969 			log(LOG_ERR, "%s: Cannot flush Rx queue %u\n",
970 			    device_get_nameunit(sc->dev), index);
971 			rxq->flush_state = SFXGE_FLUSH_DONE;
972 		}
973 		retry--;
974 	}
975 	if (rxq->flush_state == SFXGE_FLUSH_FAILED) {
976 		log(LOG_ERR, "%s: Flushing Rx queue %u failed\n",
977 		    device_get_nameunit(sc->dev), index);
978 		rxq->flush_state = SFXGE_FLUSH_DONE;
979 	}
980 
981 	rxq->pending = rxq->added;
982 	sfxge_rx_qcomplete(rxq, B_TRUE);
983 
984 	KASSERT(rxq->completed == rxq->pending,
985 	    ("rxq->completed != rxq->pending"));
986 
987 	rxq->added = 0;
988 	rxq->pushed = 0;
989 	rxq->pending = 0;
990 	rxq->completed = 0;
991 	rxq->loopback = 0;
992 
993 	/* Destroy the common code receive queue. */
994 	efx_rx_qdestroy(rxq->common);
995 
996 	efx_sram_buf_tbl_clear(sc->enp, rxq->buf_base_id,
997 	    EFX_RXQ_NBUFS(sc->rxq_entries));
998 
999 	SFXGE_EVQ_UNLOCK(evq);
1000 }
1001 
1002 static int
1003 sfxge_rx_qstart(struct sfxge_softc *sc, unsigned int index)
1004 {
1005 	struct sfxge_rxq *rxq;
1006 	efsys_mem_t *esmp;
1007 	struct sfxge_evq *evq;
1008 	int rc;
1009 
1010 	SFXGE_ADAPTER_LOCK_ASSERT_OWNED(sc);
1011 
1012 	rxq = sc->rxq[index];
1013 	esmp = &rxq->mem;
1014 	evq = sc->evq[index];
1015 
1016 	KASSERT(rxq->init_state == SFXGE_RXQ_INITIALIZED,
1017 	    ("rxq->init_state != SFXGE_RXQ_INITIALIZED"));
1018 	KASSERT(evq->init_state == SFXGE_EVQ_STARTED,
1019 	    ("evq->init_state != SFXGE_EVQ_STARTED"));
1020 
1021 	/* Program the buffer table. */
1022 	if ((rc = efx_sram_buf_tbl_set(sc->enp, rxq->buf_base_id, esmp,
1023 	    EFX_RXQ_NBUFS(sc->rxq_entries))) != 0)
1024 		return (rc);
1025 
1026 	/* Create the common code receive queue. */
1027 	if ((rc = efx_rx_qcreate(sc->enp, index, 0, EFX_RXQ_TYPE_DEFAULT,
1028 	    esmp, sc->rxq_entries, rxq->buf_base_id, evq->common,
1029 	    &rxq->common)) != 0)
1030 		goto fail;
1031 
1032 	SFXGE_EVQ_LOCK(evq);
1033 
1034 	/* Enable the receive queue. */
1035 	efx_rx_qenable(rxq->common);
1036 
1037 	rxq->init_state = SFXGE_RXQ_STARTED;
1038 	rxq->flush_state = SFXGE_FLUSH_REQUIRED;
1039 
1040 	/* Try to fill the queue from the pool. */
1041 	sfxge_rx_qfill(rxq, EFX_RXQ_LIMIT(sc->rxq_entries), B_FALSE);
1042 
1043 	SFXGE_EVQ_UNLOCK(evq);
1044 
1045 	return (0);
1046 
1047 fail:
1048 	efx_sram_buf_tbl_clear(sc->enp, rxq->buf_base_id,
1049 	    EFX_RXQ_NBUFS(sc->rxq_entries));
1050 	return (rc);
1051 }
1052 
1053 void
1054 sfxge_rx_stop(struct sfxge_softc *sc)
1055 {
1056 	int index;
1057 
1058 	efx_mac_filter_default_rxq_clear(sc->enp);
1059 
1060 	/* Stop the receive queue(s) */
1061 	index = sc->rxq_count;
1062 	while (--index >= 0)
1063 		sfxge_rx_qstop(sc, index);
1064 
1065 	sc->rx_prefix_size = 0;
1066 	sc->rx_buffer_size = 0;
1067 
1068 	efx_rx_fini(sc->enp);
1069 }
1070 
1071 int
1072 sfxge_rx_start(struct sfxge_softc *sc)
1073 {
1074 	struct sfxge_intr *intr;
1075 	const efx_nic_cfg_t *encp;
1076 	size_t hdrlen, align, reserved;
1077 	int index;
1078 	int rc;
1079 
1080 	intr = &sc->intr;
1081 
1082 	/* Initialize the common code receive module. */
1083 	if ((rc = efx_rx_init(sc->enp)) != 0)
1084 		return (rc);
1085 
1086 	encp = efx_nic_cfg_get(sc->enp);
1087 	sc->rx_buffer_size = EFX_MAC_PDU(sc->ifnet->if_mtu);
1088 
1089 	/* Calculate the receive packet buffer size. */
1090 	sc->rx_prefix_size = encp->enc_rx_prefix_size;
1091 
1092 	/* Ensure IP headers are 32bit aligned */
1093 	hdrlen = sc->rx_prefix_size + sizeof (struct ether_header);
1094 	sc->rx_buffer_align = P2ROUNDUP(hdrlen, 4) - hdrlen;
1095 
1096 	sc->rx_buffer_size += sc->rx_buffer_align;
1097 
1098 	/* Align end of packet buffer for RX DMA end padding */
1099 	align = MAX(1, encp->enc_rx_buf_align_end);
1100 	EFSYS_ASSERT(ISP2(align));
1101 	sc->rx_buffer_size = P2ROUNDUP(sc->rx_buffer_size, align);
1102 
1103 	/*
1104 	 * Standard mbuf zones only guarantee pointer-size alignment;
1105 	 * we need extra space to align to the cache line
1106 	 */
1107 	reserved = sc->rx_buffer_size + CACHE_LINE_SIZE;
1108 
1109 	/* Select zone for packet buffers */
1110 	if (reserved <= MCLBYTES)
1111 		sc->rx_cluster_size = MCLBYTES;
1112 	else if (reserved <= MJUMPAGESIZE)
1113 		sc->rx_cluster_size = MJUMPAGESIZE;
1114 	else if (reserved <= MJUM9BYTES)
1115 		sc->rx_cluster_size = MJUM9BYTES;
1116 	else
1117 		sc->rx_cluster_size = MJUM16BYTES;
1118 
1119 	/*
1120 	 * Set up the scale table.  Enable all hash types and hash insertion.
1121 	 */
1122 	for (index = 0; index < SFXGE_RX_SCALE_MAX; index++)
1123 		sc->rx_indir_table[index] = index % sc->rxq_count;
1124 	if ((rc = efx_rx_scale_tbl_set(sc->enp, sc->rx_indir_table,
1125 				       SFXGE_RX_SCALE_MAX)) != 0)
1126 		goto fail;
1127 	(void)efx_rx_scale_mode_set(sc->enp, EFX_RX_HASHALG_TOEPLITZ,
1128 	    (1 << EFX_RX_HASH_IPV4) | (1 << EFX_RX_HASH_TCPIPV4) |
1129 	    (1 << EFX_RX_HASH_IPV6) | (1 << EFX_RX_HASH_TCPIPV6), B_TRUE);
1130 
1131 	if ((rc = efx_rx_scale_key_set(sc->enp, toep_key,
1132 				       sizeof(toep_key))) != 0)
1133 		goto fail;
1134 
1135 	/* Start the receive queue(s). */
1136 	for (index = 0; index < sc->rxq_count; index++) {
1137 		if ((rc = sfxge_rx_qstart(sc, index)) != 0)
1138 			goto fail2;
1139 	}
1140 
1141 	rc = efx_mac_filter_default_rxq_set(sc->enp, sc->rxq[0]->common,
1142 					    sc->intr.n_alloc > 1);
1143 	if (rc != 0)
1144 		goto fail3;
1145 
1146 	return (0);
1147 
1148 fail3:
1149 fail2:
1150 	while (--index >= 0)
1151 		sfxge_rx_qstop(sc, index);
1152 
1153 fail:
1154 	efx_rx_fini(sc->enp);
1155 
1156 	return (rc);
1157 }
1158 
1159 #ifdef SFXGE_LRO
1160 
1161 static void sfxge_lro_init(struct sfxge_rxq *rxq)
1162 {
1163 	struct sfxge_lro_state *st = &rxq->lro;
1164 	unsigned i;
1165 
1166 	st->conns_mask = lro_table_size - 1;
1167 	KASSERT(!((st->conns_mask + 1) & st->conns_mask),
1168 		("lro_table_size must be a power of 2"));
1169 	st->sc = rxq->sc;
1170 	st->conns = malloc((st->conns_mask + 1) * sizeof(st->conns[0]),
1171 			   M_SFXGE, M_WAITOK);
1172 	st->conns_n = malloc((st->conns_mask + 1) * sizeof(st->conns_n[0]),
1173 			     M_SFXGE, M_WAITOK);
1174 	for (i = 0; i <= st->conns_mask; ++i) {
1175 		TAILQ_INIT(&st->conns[i]);
1176 		st->conns_n[i] = 0;
1177 	}
1178 	LIST_INIT(&st->active_conns);
1179 	TAILQ_INIT(&st->free_conns);
1180 }
1181 
1182 static void sfxge_lro_fini(struct sfxge_rxq *rxq)
1183 {
1184 	struct sfxge_lro_state *st = &rxq->lro;
1185 	struct sfxge_lro_conn *c;
1186 	unsigned i;
1187 
1188 	/* Return cleanly if sfxge_lro_init() has not been called. */
1189 	if (st->conns == NULL)
1190 		return;
1191 
1192 	KASSERT(LIST_EMPTY(&st->active_conns), ("found active connections"));
1193 
1194 	for (i = 0; i <= st->conns_mask; ++i) {
1195 		while (!TAILQ_EMPTY(&st->conns[i])) {
1196 			c = TAILQ_LAST(&st->conns[i], sfxge_lro_tailq);
1197 			sfxge_lro_drop(rxq, c);
1198 		}
1199 	}
1200 
1201 	while (!TAILQ_EMPTY(&st->free_conns)) {
1202 		c = TAILQ_FIRST(&st->free_conns);
1203 		TAILQ_REMOVE(&st->free_conns, c, link);
1204 		KASSERT(!c->mbuf, ("found orphaned mbuf"));
1205 		free(c, M_SFXGE);
1206 	}
1207 
1208 	free(st->conns_n, M_SFXGE);
1209 	free(st->conns, M_SFXGE);
1210 	st->conns = NULL;
1211 }
1212 
1213 #else
1214 
1215 static void
1216 sfxge_lro_init(struct sfxge_rxq *rxq)
1217 {
1218 }
1219 
1220 static void
1221 sfxge_lro_fini(struct sfxge_rxq *rxq)
1222 {
1223 }
1224 
1225 #endif	/* SFXGE_LRO */
1226 
1227 static void
1228 sfxge_rx_qfini(struct sfxge_softc *sc, unsigned int index)
1229 {
1230 	struct sfxge_rxq *rxq;
1231 
1232 	rxq = sc->rxq[index];
1233 
1234 	KASSERT(rxq->init_state == SFXGE_RXQ_INITIALIZED,
1235 	    ("rxq->init_state != SFXGE_RXQ_INITIALIZED"));
1236 
1237 	/* Free the context array and the flow table. */
1238 	free(rxq->queue, M_SFXGE);
1239 	sfxge_lro_fini(rxq);
1240 
1241 	/* Release DMA memory. */
1242 	sfxge_dma_free(&rxq->mem);
1243 
1244 	sc->rxq[index] = NULL;
1245 
1246 	free(rxq, M_SFXGE);
1247 }
1248 
1249 static int
1250 sfxge_rx_qinit(struct sfxge_softc *sc, unsigned int index)
1251 {
1252 	struct sfxge_rxq *rxq;
1253 	struct sfxge_evq *evq;
1254 	efsys_mem_t *esmp;
1255 	int rc;
1256 
1257 	KASSERT(index < sc->rxq_count, ("index >= %d", sc->rxq_count));
1258 
1259 	rxq = malloc(sizeof(struct sfxge_rxq), M_SFXGE, M_ZERO | M_WAITOK);
1260 	rxq->sc = sc;
1261 	rxq->index = index;
1262 	rxq->entries = sc->rxq_entries;
1263 	rxq->ptr_mask = rxq->entries - 1;
1264 	rxq->refill_threshold = RX_REFILL_THRESHOLD(rxq->entries);
1265 
1266 	sc->rxq[index] = rxq;
1267 	esmp = &rxq->mem;
1268 
1269 	evq = sc->evq[index];
1270 
1271 	/* Allocate and zero DMA space. */
1272 	if ((rc = sfxge_dma_alloc(sc, EFX_RXQ_SIZE(sc->rxq_entries), esmp)) != 0)
1273 		return (rc);
1274 
1275 	/* Allocate buffer table entries. */
1276 	sfxge_sram_buf_tbl_alloc(sc, EFX_RXQ_NBUFS(sc->rxq_entries),
1277 				 &rxq->buf_base_id);
1278 
1279 	/* Allocate the context array and the flow table. */
1280 	rxq->queue = malloc(sizeof(struct sfxge_rx_sw_desc) * sc->rxq_entries,
1281 	    M_SFXGE, M_WAITOK | M_ZERO);
1282 	sfxge_lro_init(rxq);
1283 
1284 	callout_init(&rxq->refill_callout, 1);
1285 
1286 	rxq->init_state = SFXGE_RXQ_INITIALIZED;
1287 
1288 	return (0);
1289 }
1290 
1291 static const struct {
1292 	const char *name;
1293 	size_t offset;
1294 } sfxge_rx_stats[] = {
1295 #define	SFXGE_RX_STAT(name, member) \
1296 	{ #name, offsetof(struct sfxge_rxq, member) }
1297 #ifdef SFXGE_LRO
1298 	SFXGE_RX_STAT(lro_merges, lro.n_merges),
1299 	SFXGE_RX_STAT(lro_bursts, lro.n_bursts),
1300 	SFXGE_RX_STAT(lro_slow_start, lro.n_slow_start),
1301 	SFXGE_RX_STAT(lro_misorder, lro.n_misorder),
1302 	SFXGE_RX_STAT(lro_too_many, lro.n_too_many),
1303 	SFXGE_RX_STAT(lro_new_stream, lro.n_new_stream),
1304 	SFXGE_RX_STAT(lro_drop_idle, lro.n_drop_idle),
1305 	SFXGE_RX_STAT(lro_drop_closed, lro.n_drop_closed)
1306 #endif
1307 };
1308 
1309 static int
1310 sfxge_rx_stat_handler(SYSCTL_HANDLER_ARGS)
1311 {
1312 	struct sfxge_softc *sc = arg1;
1313 	unsigned int id = arg2;
1314 	unsigned int sum, index;
1315 
1316 	/* Sum across all RX queues */
1317 	sum = 0;
1318 	for (index = 0; index < sc->rxq_count; index++)
1319 		sum += *(unsigned int *)((caddr_t)sc->rxq[index] +
1320 					 sfxge_rx_stats[id].offset);
1321 
1322 	return (SYSCTL_OUT(req, &sum, sizeof(sum)));
1323 }
1324 
1325 static void
1326 sfxge_rx_stat_init(struct sfxge_softc *sc)
1327 {
1328 	struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->dev);
1329 	struct sysctl_oid_list *stat_list;
1330 	unsigned int id;
1331 
1332 	stat_list = SYSCTL_CHILDREN(sc->stats_node);
1333 
1334 	for (id = 0; id < nitems(sfxge_rx_stats); id++) {
1335 		SYSCTL_ADD_PROC(
1336 			ctx, stat_list,
1337 			OID_AUTO, sfxge_rx_stats[id].name,
1338 			CTLTYPE_UINT|CTLFLAG_RD,
1339 			sc, id, sfxge_rx_stat_handler, "IU",
1340 			"");
1341 	}
1342 }
1343 
1344 void
1345 sfxge_rx_fini(struct sfxge_softc *sc)
1346 {
1347 	int index;
1348 
1349 	index = sc->rxq_count;
1350 	while (--index >= 0)
1351 		sfxge_rx_qfini(sc, index);
1352 
1353 	sc->rxq_count = 0;
1354 }
1355 
1356 int
1357 sfxge_rx_init(struct sfxge_softc *sc)
1358 {
1359 	struct sfxge_intr *intr;
1360 	int index;
1361 	int rc;
1362 
1363 #ifdef SFXGE_LRO
1364 	if (!ISP2(lro_table_size)) {
1365 		log(LOG_ERR, "%s=%u must be power of 2",
1366 		    SFXGE_LRO_PARAM(table_size), lro_table_size);
1367 		rc = EINVAL;
1368 		goto fail_lro_table_size;
1369 	}
1370 
1371 	if (lro_idle_ticks == 0)
1372 		lro_idle_ticks = hz / 10 + 1; /* 100 ms */
1373 #endif
1374 
1375 	intr = &sc->intr;
1376 
1377 	sc->rxq_count = intr->n_alloc;
1378 
1379 	KASSERT(intr->state == SFXGE_INTR_INITIALIZED,
1380 	    ("intr->state != SFXGE_INTR_INITIALIZED"));
1381 
1382 	/* Initialize the receive queue(s) - one per interrupt. */
1383 	for (index = 0; index < sc->rxq_count; index++) {
1384 		if ((rc = sfxge_rx_qinit(sc, index)) != 0)
1385 			goto fail;
1386 	}
1387 
1388 	sfxge_rx_stat_init(sc);
1389 
1390 	return (0);
1391 
1392 fail:
1393 	/* Tear down the receive queue(s). */
1394 	while (--index >= 0)
1395 		sfxge_rx_qfini(sc, index);
1396 
1397 	sc->rxq_count = 0;
1398 
1399 #ifdef SFXGE_LRO
1400 fail_lro_table_size:
1401 #endif
1402 	return (rc);
1403 }
1404