Annotation of src/sys/dev/pci/ixgbe/ix_txrx.c, Revision 1.41
1.41 ! msaitoh 1: /* $NetBSD: ix_txrx.c,v 1.40 2018/04/17 08:38:05 msaitoh Exp $ */
1.28 msaitoh 2:
1.1 msaitoh 3: /******************************************************************************
4:
1.28 msaitoh 5: Copyright (c) 2001-2017, Intel Corporation
1.1 msaitoh 6: All rights reserved.
1.28 msaitoh 7:
8: Redistribution and use in source and binary forms, with or without
1.1 msaitoh 9: modification, are permitted provided that the following conditions are met:
1.28 msaitoh 10:
11: 1. Redistributions of source code must retain the above copyright notice,
1.1 msaitoh 12: this list of conditions and the following disclaimer.
1.28 msaitoh 13:
14: 2. Redistributions in binary form must reproduce the above copyright
15: notice, this list of conditions and the following disclaimer in the
1.1 msaitoh 16: documentation and/or other materials provided with the distribution.
1.28 msaitoh 17:
18: 3. Neither the name of the Intel Corporation nor the names of its
19: contributors may be used to endorse or promote products derived from
1.1 msaitoh 20: this software without specific prior written permission.
1.28 msaitoh 21:
1.1 msaitoh 22: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1.28 msaitoh 23: AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25: ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26: LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27: CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28: SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29: INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30: CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
1.1 msaitoh 31: ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32: POSSIBILITY OF SUCH DAMAGE.
33:
34: ******************************************************************************/
1.39 msaitoh 35: /*$FreeBSD: head/sys/dev/ixgbe/ix_txrx.c 327031 2017-12-20 18:15:06Z erj $*/
1.28 msaitoh 36:
1.1 msaitoh 37: /*
38: * Copyright (c) 2011 The NetBSD Foundation, Inc.
39: * All rights reserved.
40: *
41: * This code is derived from software contributed to The NetBSD Foundation
42: * by Coyote Point Systems, Inc.
43: *
44: * Redistribution and use in source and binary forms, with or without
45: * modification, are permitted provided that the following conditions
46: * are met:
47: * 1. Redistributions of source code must retain the above copyright
48: * notice, this list of conditions and the following disclaimer.
49: * 2. Redistributions in binary form must reproduce the above copyright
50: * notice, this list of conditions and the following disclaimer in the
51: * documentation and/or other materials provided with the distribution.
52: *
53: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
54: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
55: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
56: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
57: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
58: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
59: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
60: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
61: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
62: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
63: * POSSIBILITY OF SUCH DAMAGE.
64: */
65:
1.8 msaitoh 66: #include "opt_inet.h"
67: #include "opt_inet6.h"
68:
1.1 msaitoh 69: #include "ixgbe.h"
70:
71: /*
1.28 msaitoh 72: * HW RSC control:
73: * this feature only works with
74: * IPv4, and only on 82599 and later.
75: * Also this will cause IP forwarding to
76: * fail and that can't be controlled by
77: * the stack as LRO can. For all these
78: * reasons I've deemed it best to leave
79: * this off and not bother with a tuneable
80: * interface, this would need to be compiled
81: * to enable.
82: */
1.1 msaitoh 83: static bool ixgbe_rsc_enable = FALSE;
84:
1.3 msaitoh 85: /*
1.28 msaitoh 86: * For Flow Director: this is the
87: * number of TX packets we sample
88: * for the filter pool, this means
89: * every 20th packet will be probed.
90: *
91: * This feature can be disabled by
92: * setting this to 0.
93: */
1.3 msaitoh 94: static int atr_sample_rate = 20;
95:
1.28 msaitoh 96: /************************************************************************
1.3 msaitoh 97: * Local Function prototypes
1.28 msaitoh 98: ************************************************************************/
99: static void ixgbe_setup_transmit_ring(struct tx_ring *);
100: static void ixgbe_free_transmit_buffers(struct tx_ring *);
101: static int ixgbe_setup_receive_ring(struct rx_ring *);
102: static void ixgbe_free_receive_buffers(struct rx_ring *);
103: static void ixgbe_rx_checksum(u32, struct mbuf *, u32,
104: struct ixgbe_hw_stats *);
105: static void ixgbe_refresh_mbufs(struct rx_ring *, int);
1.38 knakahar 106: static void ixgbe_drain(struct ifnet *, struct tx_ring *);
1.28 msaitoh 107: static int ixgbe_xmit(struct tx_ring *, struct mbuf *);
108: static int ixgbe_tx_ctx_setup(struct tx_ring *,
109: struct mbuf *, u32 *, u32 *);
110: static int ixgbe_tso_setup(struct tx_ring *,
111: struct mbuf *, u32 *, u32 *);
1.1 msaitoh 112: static __inline void ixgbe_rx_discard(struct rx_ring *, int);
113: static __inline void ixgbe_rx_input(struct rx_ring *, struct ifnet *,
1.28 msaitoh 114: struct mbuf *, u32);
115: static int ixgbe_dma_malloc(struct adapter *, bus_size_t,
116: struct ixgbe_dma_alloc *, int);
117: static void ixgbe_dma_free(struct adapter *, struct ixgbe_dma_alloc *);
1.1 msaitoh 118:
119: static void ixgbe_setup_hw_rsc(struct rx_ring *);
120:
1.28 msaitoh 121: /************************************************************************
122: * ixgbe_legacy_start_locked - Transmit entry point
1.1 msaitoh 123: *
1.28 msaitoh 124: * Called by the stack to initiate a transmit.
125: * The driver will remain in this routine as long as there are
126: * packets to transmit and transmit resources are available.
127: * In case resources are not available, the stack is notified
128: * and the packet is requeued.
129: ************************************************************************/
130: int
131: ixgbe_legacy_start_locked(struct ifnet *ifp, struct tx_ring *txr)
1.1 msaitoh 132: {
133: int rc;
134: struct mbuf *m_head;
135: struct adapter *adapter = txr->adapter;
136:
137: IXGBE_TX_LOCK_ASSERT(txr);
138:
1.38 knakahar 139: if (!adapter->link_active) {
140: /*
141: * discard all packets buffered in IFQ to avoid
142: * sending old packets at next link up timing.
143: */
144: ixgbe_drain(ifp, txr);
145: return (ENETDOWN);
146: }
1.1 msaitoh 147: if ((ifp->if_flags & IFF_RUNNING) == 0)
1.28 msaitoh 148: return (ENETDOWN);
1.1 msaitoh 149:
150: while (!IFQ_IS_EMPTY(&ifp->if_snd)) {
151: if (txr->tx_avail <= IXGBE_QUEUE_MIN_FREE)
152: break;
153:
154: IFQ_POLL(&ifp->if_snd, m_head);
155: if (m_head == NULL)
156: break;
157:
158: if ((rc = ixgbe_xmit(txr, m_head)) == EAGAIN) {
159: break;
160: }
161: IFQ_DEQUEUE(&ifp->if_snd, m_head);
162: if (rc != 0) {
163: m_freem(m_head);
164: continue;
165: }
166:
167: /* Send a copy of the frame to the BPF listener */
168: bpf_mtap(ifp, m_head);
169: }
170:
1.28 msaitoh 171: return IXGBE_SUCCESS;
172: } /* ixgbe_legacy_start_locked */
173:
174: /************************************************************************
175: * ixgbe_legacy_start
176: *
177: * Called by the stack, this always uses the first tx ring,
178: * and should not be used with multiqueue tx enabled.
179: ************************************************************************/
1.1 msaitoh 180: void
1.28 msaitoh 181: ixgbe_legacy_start(struct ifnet *ifp)
1.1 msaitoh 182: {
183: struct adapter *adapter = ifp->if_softc;
1.28 msaitoh 184: struct tx_ring *txr = adapter->tx_rings;
1.1 msaitoh 185:
186: if (ifp->if_flags & IFF_RUNNING) {
187: IXGBE_TX_LOCK(txr);
1.28 msaitoh 188: ixgbe_legacy_start_locked(ifp, txr);
1.1 msaitoh 189: IXGBE_TX_UNLOCK(txr);
190: }
1.28 msaitoh 191: } /* ixgbe_legacy_start */
1.1 msaitoh 192:
1.28 msaitoh 193: /************************************************************************
194: * ixgbe_mq_start - Multiqueue Transmit Entry Point
195: *
196: * (if_transmit function)
197: ************************************************************************/
1.1 msaitoh 198: int
199: ixgbe_mq_start(struct ifnet *ifp, struct mbuf *m)
200: {
201: struct adapter *adapter = ifp->if_softc;
202: struct tx_ring *txr;
203: int i, err = 0;
1.28 msaitoh 204: #ifdef RSS
1.1 msaitoh 205: uint32_t bucket_id;
206: #endif
207:
208: /*
209: * When doing RSS, map it to the same outbound queue
210: * as the incoming flow would be mapped to.
211: *
212: * If everything is setup correctly, it should be the
213: * same bucket that the current CPU we're on is.
214: */
1.28 msaitoh 215: #ifdef RSS
1.1 msaitoh 216: if (M_HASHTYPE_GET(m) != M_HASHTYPE_NONE) {
1.28 msaitoh 217: if ((adapter->feat_en & IXGBE_FEATURE_RSS) &&
218: (rss_hash2bucket(m->m_pkthdr.flowid, M_HASHTYPE_GET(m),
219: &bucket_id) == 0)) {
1.1 msaitoh 220: i = bucket_id % adapter->num_queues;
1.8 msaitoh 221: #ifdef IXGBE_DEBUG
222: if (bucket_id > adapter->num_queues)
1.28 msaitoh 223: if_printf(ifp,
224: "bucket_id (%d) > num_queues (%d)\n",
225: bucket_id, adapter->num_queues);
1.8 msaitoh 226: #endif
227: } else
1.1 msaitoh 228: i = m->m_pkthdr.flowid % adapter->num_queues;
1.3 msaitoh 229: } else
1.28 msaitoh 230: #endif /* 0 */
1.18 msaitoh 231: i = cpu_index(curcpu()) % adapter->num_queues;
1.3 msaitoh 232:
233: /* Check for a hung queue and pick alternative */
234: if (((1 << i) & adapter->active_queues) == 0)
1.18 msaitoh 235: i = ffs64(adapter->active_queues);
1.1 msaitoh 236:
237: txr = &adapter->tx_rings[i];
238:
1.18 msaitoh 239: err = pcq_put(txr->txr_interq, m);
240: if (err == false) {
241: m_freem(m);
242: txr->pcq_drops.ev_count++;
1.1 msaitoh 243: return (err);
1.18 msaitoh 244: }
1.1 msaitoh 245: if (IXGBE_TX_TRYLOCK(txr)) {
246: ixgbe_mq_start_locked(ifp, txr);
247: IXGBE_TX_UNLOCK(txr);
1.34 knakahar 248: } else {
249: if (adapter->txrx_use_workqueue) {
250: /*
251: * This function itself is not called in interrupt
252: * context, however it can be called in fast softint
253: * context right after receiving forwarding packets.
254: * So, it is required to protect workqueue from twice
255: * enqueuing when the machine uses both spontaneous
256: * packets and forwarding packets.
257: */
258: u_int *enqueued = percpu_getref(adapter->txr_wq_enqueued);
259: if (*enqueued == 0) {
260: *enqueued = 1;
261: percpu_putref(adapter->txr_wq_enqueued);
262: workqueue_enqueue(adapter->txr_wq, &txr->wq_cookie, curcpu());
263: } else
264: percpu_putref(adapter->txr_wq_enqueued);
265: } else
266: softint_schedule(txr->txr_si);
267: }
1.1 msaitoh 268:
269: return (0);
1.28 msaitoh 270: } /* ixgbe_mq_start */
1.1 msaitoh 271:
1.28 msaitoh 272: /************************************************************************
273: * ixgbe_mq_start_locked
274: ************************************************************************/
1.1 msaitoh 275: int
276: ixgbe_mq_start_locked(struct ifnet *ifp, struct tx_ring *txr)
277: {
1.28 msaitoh 278: struct mbuf *next;
279: int enqueued = 0, err = 0;
1.1 msaitoh 280:
1.38 knakahar 281: if (!txr->adapter->link_active) {
282: /*
283: * discard all packets buffered in txr_interq to avoid
284: * sending old packets at next link up timing.
285: */
286: ixgbe_drain(ifp, txr);
287: return (ENETDOWN);
288: }
1.28 msaitoh 289: if ((ifp->if_flags & IFF_RUNNING) == 0)
290: return (ENETDOWN);
1.1 msaitoh 291:
292: /* Process the queue */
1.18 msaitoh 293: while ((next = pcq_get(txr->txr_interq)) != NULL) {
294: if ((err = ixgbe_xmit(txr, next)) != 0) {
295: m_freem(next);
296: /* All errors are counted in ixgbe_xmit() */
1.1 msaitoh 297: break;
298: }
299: enqueued++;
1.3 msaitoh 300: #if __FreeBSD_version >= 1100036
1.4 msaitoh 301: /*
302: * Since we're looking at the tx ring, we can check
303: * to see if we're a VF by examing our tail register
304: * address.
305: */
1.28 msaitoh 306: if ((txr->adapter->feat_en & IXGBE_FEATURE_VF) &&
307: (next->m_flags & M_MCAST))
1.3 msaitoh 308: if_inc_counter(ifp, IFCOUNTER_OMCASTS, 1);
309: #endif
1.1 msaitoh 310: /* Send a copy of the frame to the BPF listener */
311: bpf_mtap(ifp, next);
312: if ((ifp->if_flags & IFF_RUNNING) == 0)
313: break;
314: }
315:
1.28 msaitoh 316: if (txr->tx_avail < IXGBE_TX_CLEANUP_THRESHOLD(txr->adapter))
1.1 msaitoh 317: ixgbe_txeof(txr);
318:
319: return (err);
1.28 msaitoh 320: } /* ixgbe_mq_start_locked */
1.1 msaitoh 321:
1.28 msaitoh 322: /************************************************************************
323: * ixgbe_deferred_mq_start
324: *
1.34 knakahar 325: * Called from a softint and workqueue (indirectly) to drain queued
326: * transmit packets.
1.28 msaitoh 327: ************************************************************************/
1.1 msaitoh 328: void
1.18 msaitoh 329: ixgbe_deferred_mq_start(void *arg)
1.1 msaitoh 330: {
331: struct tx_ring *txr = arg;
332: struct adapter *adapter = txr->adapter;
1.28 msaitoh 333: struct ifnet *ifp = adapter->ifp;
1.1 msaitoh 334:
335: IXGBE_TX_LOCK(txr);
1.18 msaitoh 336: if (pcq_peek(txr->txr_interq) != NULL)
1.1 msaitoh 337: ixgbe_mq_start_locked(ifp, txr);
338: IXGBE_TX_UNLOCK(txr);
1.28 msaitoh 339: } /* ixgbe_deferred_mq_start */
1.3 msaitoh 340:
1.28 msaitoh 341: /************************************************************************
1.34 knakahar 342: * ixgbe_deferred_mq_start_work
343: *
344: * Called from a workqueue to drain queued transmit packets.
345: ************************************************************************/
346: void
347: ixgbe_deferred_mq_start_work(struct work *wk, void *arg)
348: {
349: struct tx_ring *txr = container_of(wk, struct tx_ring, wq_cookie);
350: struct adapter *adapter = txr->adapter;
351: u_int *enqueued = percpu_getref(adapter->txr_wq_enqueued);
352: *enqueued = 0;
353: percpu_putref(adapter->txr_wq_enqueued);
354:
355: ixgbe_deferred_mq_start(txr);
356: } /* ixgbe_deferred_mq_start */
357:
1.38 knakahar 358: /************************************************************************
359: * ixgbe_drain_all
360: ************************************************************************/
361: void
362: ixgbe_drain_all(struct adapter *adapter)
363: {
364: struct ifnet *ifp = adapter->ifp;
365: struct ix_queue *que = adapter->queues;
366:
367: for (int i = 0; i < adapter->num_queues; i++, que++) {
368: struct tx_ring *txr = que->txr;
369:
370: IXGBE_TX_LOCK(txr);
371: ixgbe_drain(ifp, txr);
372: IXGBE_TX_UNLOCK(txr);
373: }
374: }
1.34 knakahar 375:
376: /************************************************************************
1.28 msaitoh 377: * ixgbe_xmit
1.1 msaitoh 378: *
1.28 msaitoh 379: * Maps the mbufs to tx descriptors, allowing the
380: * TX engine to transmit the packets.
1.1 msaitoh 381: *
1.28 msaitoh 382: * Return 0 on success, positive on failure
383: ************************************************************************/
1.1 msaitoh 384: static int
385: ixgbe_xmit(struct tx_ring *txr, struct mbuf *m_head)
386: {
1.28 msaitoh 387: struct adapter *adapter = txr->adapter;
388: struct ixgbe_tx_buf *txbuf;
1.1 msaitoh 389: union ixgbe_adv_tx_desc *txd = NULL;
1.28 msaitoh 390: struct ifnet *ifp = adapter->ifp;
391: int i, j, error;
392: int first;
393: u32 olinfo_status = 0, cmd_type_len;
394: bool remap = TRUE;
395: bus_dmamap_t map;
1.1 msaitoh 396:
397: /* Basic descriptor defines */
1.28 msaitoh 398: cmd_type_len = (IXGBE_ADVTXD_DTYP_DATA |
1.1 msaitoh 399: IXGBE_ADVTXD_DCMD_IFCS | IXGBE_ADVTXD_DCMD_DEXT);
400:
1.29 knakahar 401: if (vlan_has_tag(m_head))
1.28 msaitoh 402: cmd_type_len |= IXGBE_ADVTXD_DCMD_VLE;
1.1 msaitoh 403:
1.28 msaitoh 404: /*
405: * Important to capture the first descriptor
406: * used because it will contain the index of
407: * the one we tell the hardware to report back
408: */
409: first = txr->next_avail_desc;
1.1 msaitoh 410: txbuf = &txr->tx_buffers[first];
411: map = txbuf->map;
412:
413: /*
414: * Map the packet for DMA.
415: */
1.22 msaitoh 416: retry:
1.28 msaitoh 417: error = bus_dmamap_load_mbuf(txr->txtag->dt_dmat, map, m_head,
418: BUS_DMA_NOWAIT);
1.1 msaitoh 419:
420: if (__predict_false(error)) {
1.22 msaitoh 421: struct mbuf *m;
1.1 msaitoh 422:
423: switch (error) {
424: case EAGAIN:
1.35 msaitoh 425: txr->q_eagain_tx_dma_setup++;
1.1 msaitoh 426: return EAGAIN;
427: case ENOMEM:
1.35 msaitoh 428: txr->q_enomem_tx_dma_setup++;
1.1 msaitoh 429: return EAGAIN;
430: case EFBIG:
1.22 msaitoh 431: /* Try it again? - one try */
432: if (remap == TRUE) {
433: remap = FALSE;
434: /*
435: * XXX: m_defrag will choke on
436: * non-MCLBYTES-sized clusters
437: */
1.35 msaitoh 438: txr->q_efbig_tx_dma_setup++;
1.22 msaitoh 439: m = m_defrag(m_head, M_NOWAIT);
440: if (m == NULL) {
1.35 msaitoh 441: txr->q_mbuf_defrag_failed++;
1.22 msaitoh 442: return ENOBUFS;
443: }
444: m_head = m;
445: goto retry;
446: } else {
1.35 msaitoh 447: txr->q_efbig2_tx_dma_setup++;
1.22 msaitoh 448: return error;
449: }
1.1 msaitoh 450: case EINVAL:
1.35 msaitoh 451: txr->q_einval_tx_dma_setup++;
1.1 msaitoh 452: return error;
453: default:
1.35 msaitoh 454: txr->q_other_tx_dma_setup++;
1.1 msaitoh 455: return error;
456: }
457: }
458:
459: /* Make certain there are enough descriptors */
1.10 msaitoh 460: if (txr->tx_avail < (map->dm_nsegs + 2)) {
1.1 msaitoh 461: txr->no_desc_avail.ev_count++;
462: ixgbe_dmamap_unload(txr->txtag, txbuf->map);
463: return EAGAIN;
464: }
465:
466: /*
1.4 msaitoh 467: * Set up the appropriate offload context
468: * this will consume the first descriptor
469: */
1.1 msaitoh 470: error = ixgbe_tx_ctx_setup(txr, m_head, &cmd_type_len, &olinfo_status);
471: if (__predict_false(error)) {
472: return (error);
473: }
474:
475: /* Do the flow director magic */
1.28 msaitoh 476: if ((adapter->feat_en & IXGBE_FEATURE_FDIR) &&
477: (txr->atr_sample) && (!adapter->fdir_reinit)) {
1.1 msaitoh 478: ++txr->atr_count;
479: if (txr->atr_count >= atr_sample_rate) {
480: ixgbe_atr(txr, m_head);
481: txr->atr_count = 0;
482: }
483: }
484:
1.8 msaitoh 485: olinfo_status |= IXGBE_ADVTXD_CC;
1.1 msaitoh 486: i = txr->next_avail_desc;
487: for (j = 0; j < map->dm_nsegs; j++) {
488: bus_size_t seglen;
489: bus_addr_t segaddr;
490:
491: txbuf = &txr->tx_buffers[i];
492: txd = &txr->tx_base[i];
493: seglen = map->dm_segs[j].ds_len;
494: segaddr = htole64(map->dm_segs[j].ds_addr);
495:
496: txd->read.buffer_addr = segaddr;
1.40 msaitoh 497: txd->read.cmd_type_len = htole32(cmd_type_len | seglen);
1.1 msaitoh 498: txd->read.olinfo_status = htole32(olinfo_status);
499:
500: if (++i == txr->num_desc)
501: i = 0;
502: }
503:
1.28 msaitoh 504: txd->read.cmd_type_len |= htole32(IXGBE_TXD_CMD_EOP | IXGBE_TXD_CMD_RS);
1.1 msaitoh 505: txr->tx_avail -= map->dm_nsegs;
506: txr->next_avail_desc = i;
507:
508: txbuf->m_head = m_head;
509: /*
1.4 msaitoh 510: * Here we swap the map so the last descriptor,
511: * which gets the completion interrupt has the
512: * real map, and the first descriptor gets the
513: * unused map from this descriptor.
514: */
1.1 msaitoh 515: txr->tx_buffers[first].map = txbuf->map;
516: txbuf->map = map;
517: bus_dmamap_sync(txr->txtag->dt_dmat, map, 0, m_head->m_pkthdr.len,
518: BUS_DMASYNC_PREWRITE);
519:
1.28 msaitoh 520: /* Set the EOP descriptor that will be marked done */
521: txbuf = &txr->tx_buffers[first];
1.1 msaitoh 522: txbuf->eop = txd;
523:
1.28 msaitoh 524: ixgbe_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map,
1.1 msaitoh 525: BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
526: /*
527: * Advance the Transmit Descriptor Tail (Tdt), this tells the
528: * hardware that this frame is available to transmit.
529: */
530: ++txr->total_packets.ev_count;
1.3 msaitoh 531: IXGBE_WRITE_REG(&adapter->hw, txr->tail, i);
532:
1.23 msaitoh 533: /*
534: * XXXX NOMPSAFE: ifp->if_data should be percpu.
535: */
536: ifp->if_obytes += m_head->m_pkthdr.len;
537: if (m_head->m_flags & M_MCAST)
538: ifp->if_omcasts++;
539:
1.3 msaitoh 540: /* Mark queue as having work */
541: if (txr->busy == 0)
542: txr->busy = 1;
1.1 msaitoh 543:
1.28 msaitoh 544: return (0);
545: } /* ixgbe_xmit */
1.1 msaitoh 546:
1.38 knakahar 547: /************************************************************************
548: * ixgbe_drain
549: ************************************************************************/
550: static void
551: ixgbe_drain(struct ifnet *ifp, struct tx_ring *txr)
552: {
553: struct mbuf *m;
554:
555: IXGBE_TX_LOCK_ASSERT(txr);
556:
557: if (txr->me == 0) {
558: while (!IFQ_IS_EMPTY(&ifp->if_snd)) {
559: IFQ_DEQUEUE(&ifp->if_snd, m);
560: m_freem(m);
561: IF_DROP(&ifp->if_snd);
562: }
563: }
564:
565: while ((m = pcq_get(txr->txr_interq)) != NULL) {
566: m_freem(m);
567: txr->pcq_drops.ev_count++;
568: }
569: }
1.16 msaitoh 570:
1.28 msaitoh 571: /************************************************************************
572: * ixgbe_allocate_transmit_buffers
1.1 msaitoh 573: *
1.28 msaitoh 574: * Allocate memory for tx_buffer structures. The tx_buffer stores all
575: * the information needed to transmit a packet on the wire. This is
576: * called only once at attach, setup is done every reset.
577: ************************************************************************/
578: static int
1.1 msaitoh 579: ixgbe_allocate_transmit_buffers(struct tx_ring *txr)
580: {
1.28 msaitoh 581: struct adapter *adapter = txr->adapter;
582: device_t dev = adapter->dev;
1.1 msaitoh 583: struct ixgbe_tx_buf *txbuf;
1.28 msaitoh 584: int error, i;
1.1 msaitoh 585:
586: /*
587: * Setup DMA descriptor areas.
588: */
1.28 msaitoh 589: error = ixgbe_dma_tag_create(
590: /* parent */ adapter->osdep.dmat,
591: /* alignment */ 1,
592: /* bounds */ 0,
593: /* maxsize */ IXGBE_TSO_SIZE,
594: /* nsegments */ adapter->num_segs,
595: /* maxsegsize */ PAGE_SIZE,
596: /* flags */ 0,
597: &txr->txtag);
598: if (error != 0) {
1.1 msaitoh 599: aprint_error_dev(dev,"Unable to allocate TX DMA tag\n");
600: goto fail;
601: }
602:
1.28 msaitoh 603: txr->tx_buffers =
1.1 msaitoh 604: (struct ixgbe_tx_buf *) malloc(sizeof(struct ixgbe_tx_buf) *
1.28 msaitoh 605: adapter->num_tx_desc, M_DEVBUF, M_NOWAIT | M_ZERO);
606: if (txr->tx_buffers == NULL) {
1.1 msaitoh 607: aprint_error_dev(dev, "Unable to allocate tx_buffer memory\n");
608: error = ENOMEM;
609: goto fail;
610: }
611:
1.28 msaitoh 612: /* Create the descriptor buffer dma maps */
1.1 msaitoh 613: txbuf = txr->tx_buffers;
614: for (i = 0; i < adapter->num_tx_desc; i++, txbuf++) {
615: error = ixgbe_dmamap_create(txr->txtag, 0, &txbuf->map);
616: if (error != 0) {
617: aprint_error_dev(dev,
618: "Unable to create TX DMA map (%d)\n", error);
619: goto fail;
620: }
621: }
622:
623: return 0;
624: fail:
625: /* We free all, it handles case where we are in the middle */
1.15 msaitoh 626: #if 0 /* XXX was FreeBSD */
1.1 msaitoh 627: ixgbe_free_transmit_structures(adapter);
1.15 msaitoh 628: #else
629: ixgbe_free_transmit_buffers(txr);
630: #endif
1.1 msaitoh 631: return (error);
1.28 msaitoh 632: } /* ixgbe_allocate_transmit_buffers */
1.1 msaitoh 633:
1.28 msaitoh 634: /************************************************************************
635: * ixgbe_setup_transmit_ring - Initialize a transmit ring.
636: ************************************************************************/
1.1 msaitoh 637: static void
638: ixgbe_setup_transmit_ring(struct tx_ring *txr)
639: {
1.28 msaitoh 640: struct adapter *adapter = txr->adapter;
641: struct ixgbe_tx_buf *txbuf;
1.1 msaitoh 642: #ifdef DEV_NETMAP
643: struct netmap_adapter *na = NA(adapter->ifp);
1.28 msaitoh 644: struct netmap_slot *slot;
1.1 msaitoh 645: #endif /* DEV_NETMAP */
646:
647: /* Clear the old ring contents */
648: IXGBE_TX_LOCK(txr);
1.28 msaitoh 649:
1.1 msaitoh 650: #ifdef DEV_NETMAP
1.28 msaitoh 651: if (adapter->feat_en & IXGBE_FEATURE_NETMAP) {
652: /*
653: * (under lock): if in netmap mode, do some consistency
654: * checks and set slot to entry 0 of the netmap ring.
655: */
656: slot = netmap_reset(na, NR_TX, txr->me, 0);
657: }
1.1 msaitoh 658: #endif /* DEV_NETMAP */
1.28 msaitoh 659:
1.1 msaitoh 660: bzero((void *)txr->tx_base,
1.28 msaitoh 661: (sizeof(union ixgbe_adv_tx_desc)) * adapter->num_tx_desc);
1.1 msaitoh 662: /* Reset indices */
663: txr->next_avail_desc = 0;
664: txr->next_to_clean = 0;
665:
666: /* Free any existing tx buffers. */
1.28 msaitoh 667: txbuf = txr->tx_buffers;
1.5 msaitoh 668: for (int i = 0; i < txr->num_desc; i++, txbuf++) {
1.1 msaitoh 669: if (txbuf->m_head != NULL) {
670: bus_dmamap_sync(txr->txtag->dt_dmat, txbuf->map,
671: 0, txbuf->m_head->m_pkthdr.len,
672: BUS_DMASYNC_POSTWRITE);
673: ixgbe_dmamap_unload(txr->txtag, txbuf->map);
674: m_freem(txbuf->m_head);
675: txbuf->m_head = NULL;
676: }
1.28 msaitoh 677:
1.1 msaitoh 678: #ifdef DEV_NETMAP
679: /*
680: * In netmap mode, set the map for the packet buffer.
681: * NOTE: Some drivers (not this one) also need to set
682: * the physical buffer address in the NIC ring.
683: * Slots in the netmap ring (indexed by "si") are
684: * kring->nkr_hwofs positions "ahead" wrt the
685: * corresponding slot in the NIC ring. In some drivers
686: * (not here) nkr_hwofs can be negative. Function
687: * netmap_idx_n2k() handles wraparounds properly.
688: */
1.28 msaitoh 689: if ((adapter->feat_en & IXGBE_FEATURE_NETMAP) && slot) {
1.1 msaitoh 690: int si = netmap_idx_n2k(&na->tx_rings[txr->me], i);
1.5 msaitoh 691: netmap_load_map(na, txr->txtag,
692: txbuf->map, NMB(na, slot + si));
1.1 msaitoh 693: }
694: #endif /* DEV_NETMAP */
1.28 msaitoh 695:
1.1 msaitoh 696: /* Clear the EOP descriptor pointer */
697: txbuf->eop = NULL;
1.28 msaitoh 698: }
1.1 msaitoh 699:
700: /* Set the rate at which we sample packets */
1.28 msaitoh 701: if (adapter->feat_en & IXGBE_FEATURE_FDIR)
1.1 msaitoh 702: txr->atr_sample = atr_sample_rate;
703:
704: /* Set number of descriptors available */
705: txr->tx_avail = adapter->num_tx_desc;
706:
707: ixgbe_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map,
708: BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
709: IXGBE_TX_UNLOCK(txr);
1.28 msaitoh 710: } /* ixgbe_setup_transmit_ring */
1.1 msaitoh 711:
1.28 msaitoh 712: /************************************************************************
713: * ixgbe_setup_transmit_structures - Initialize all transmit rings.
714: ************************************************************************/
1.1 msaitoh 715: int
716: ixgbe_setup_transmit_structures(struct adapter *adapter)
717: {
718: struct tx_ring *txr = adapter->tx_rings;
719:
720: for (int i = 0; i < adapter->num_queues; i++, txr++)
721: ixgbe_setup_transmit_ring(txr);
722:
723: return (0);
1.28 msaitoh 724: } /* ixgbe_setup_transmit_structures */
1.1 msaitoh 725:
1.28 msaitoh 726: /************************************************************************
727: * ixgbe_free_transmit_structures - Free all transmit rings.
728: ************************************************************************/
1.1 msaitoh 729: void
730: ixgbe_free_transmit_structures(struct adapter *adapter)
731: {
732: struct tx_ring *txr = adapter->tx_rings;
733:
734: for (int i = 0; i < adapter->num_queues; i++, txr++) {
735: ixgbe_free_transmit_buffers(txr);
736: ixgbe_dma_free(adapter, &txr->txdma);
737: IXGBE_TX_LOCK_DESTROY(txr);
738: }
739: free(adapter->tx_rings, M_DEVBUF);
1.28 msaitoh 740: } /* ixgbe_free_transmit_structures */
1.1 msaitoh 741:
1.28 msaitoh 742: /************************************************************************
743: * ixgbe_free_transmit_buffers
1.1 msaitoh 744: *
1.28 msaitoh 745: * Free transmit ring related data structures.
746: ************************************************************************/
1.1 msaitoh 747: static void
748: ixgbe_free_transmit_buffers(struct tx_ring *txr)
749: {
1.28 msaitoh 750: struct adapter *adapter = txr->adapter;
1.1 msaitoh 751: struct ixgbe_tx_buf *tx_buffer;
1.28 msaitoh 752: int i;
1.1 msaitoh 753:
1.14 msaitoh 754: INIT_DEBUGOUT("ixgbe_free_transmit_buffers: begin");
1.1 msaitoh 755:
756: if (txr->tx_buffers == NULL)
757: return;
758:
759: tx_buffer = txr->tx_buffers;
760: for (i = 0; i < adapter->num_tx_desc; i++, tx_buffer++) {
761: if (tx_buffer->m_head != NULL) {
762: bus_dmamap_sync(txr->txtag->dt_dmat, tx_buffer->map,
763: 0, tx_buffer->m_head->m_pkthdr.len,
764: BUS_DMASYNC_POSTWRITE);
765: ixgbe_dmamap_unload(txr->txtag, tx_buffer->map);
766: m_freem(tx_buffer->m_head);
767: tx_buffer->m_head = NULL;
768: if (tx_buffer->map != NULL) {
769: ixgbe_dmamap_destroy(txr->txtag,
770: tx_buffer->map);
771: tx_buffer->map = NULL;
772: }
773: } else if (tx_buffer->map != NULL) {
774: ixgbe_dmamap_unload(txr->txtag, tx_buffer->map);
775: ixgbe_dmamap_destroy(txr->txtag, tx_buffer->map);
776: tx_buffer->map = NULL;
777: }
778: }
1.18 msaitoh 779: if (txr->txr_interq != NULL) {
780: struct mbuf *m;
781:
782: while ((m = pcq_get(txr->txr_interq)) != NULL)
783: m_freem(m);
784: pcq_destroy(txr->txr_interq);
785: }
1.1 msaitoh 786: if (txr->tx_buffers != NULL) {
787: free(txr->tx_buffers, M_DEVBUF);
788: txr->tx_buffers = NULL;
789: }
790: if (txr->txtag != NULL) {
791: ixgbe_dma_tag_destroy(txr->txtag);
792: txr->txtag = NULL;
793: }
1.28 msaitoh 794: } /* ixgbe_free_transmit_buffers */
1.1 msaitoh 795:
1.28 msaitoh 796: /************************************************************************
797: * ixgbe_tx_ctx_setup
1.1 msaitoh 798: *
1.28 msaitoh 799: * Advanced Context Descriptor setup for VLAN, CSUM or TSO
800: ************************************************************************/
1.1 msaitoh 801: static int
802: ixgbe_tx_ctx_setup(struct tx_ring *txr, struct mbuf *mp,
803: u32 *cmd_type_len, u32 *olinfo_status)
804: {
1.28 msaitoh 805: struct adapter *adapter = txr->adapter;
1.1 msaitoh 806: struct ixgbe_adv_tx_context_desc *TXD;
1.28 msaitoh 807: struct ether_vlan_header *eh;
1.8 msaitoh 808: #ifdef INET
1.28 msaitoh 809: struct ip *ip;
1.8 msaitoh 810: #endif
811: #ifdef INET6
1.28 msaitoh 812: struct ip6_hdr *ip6;
1.8 msaitoh 813: #endif
1.28 msaitoh 814: int ehdrlen, ip_hlen = 0;
815: int offload = TRUE;
816: int ctxd = txr->next_avail_desc;
817: u32 vlan_macip_lens = 0;
818: u32 type_tucmd_mlhl = 0;
819: u16 vtag = 0;
820: u16 etype;
821: u8 ipproto = 0;
822: char *l3d;
1.8 msaitoh 823:
1.1 msaitoh 824:
825: /* First check if TSO is to be used */
1.28 msaitoh 826: if (mp->m_pkthdr.csum_flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6)) {
1.17 msaitoh 827: int rv = ixgbe_tso_setup(txr, mp, cmd_type_len, olinfo_status);
828:
1.21 msaitoh 829: if (rv != 0)
1.17 msaitoh 830: ++adapter->tso_err.ev_count;
1.21 msaitoh 831: return rv;
1.17 msaitoh 832: }
1.1 msaitoh 833:
834: if ((mp->m_pkthdr.csum_flags & M_CSUM_OFFLOAD) == 0)
835: offload = FALSE;
836:
837: /* Indicate the whole packet as payload when not doing TSO */
1.28 msaitoh 838: *olinfo_status |= mp->m_pkthdr.len << IXGBE_ADVTXD_PAYLEN_SHIFT;
1.1 msaitoh 839:
840: /* Now ready a context descriptor */
1.28 msaitoh 841: TXD = (struct ixgbe_adv_tx_context_desc *)&txr->tx_base[ctxd];
1.1 msaitoh 842:
843: /*
1.28 msaitoh 844: * In advanced descriptors the vlan tag must
845: * be placed into the context descriptor. Hence
846: * we need to make one even if not doing offloads.
847: */
1.29 knakahar 848: if (vlan_has_tag(mp)) {
849: vtag = htole16(vlan_get_tag(mp));
1.1 msaitoh 850: vlan_macip_lens |= (vtag << IXGBE_ADVTXD_VLAN_SHIFT);
1.28 msaitoh 851: } else if (!(txr->adapter->feat_en & IXGBE_FEATURE_NEEDS_CTXD) &&
852: (offload == FALSE))
1.4 msaitoh 853: return (0);
1.1 msaitoh 854:
855: /*
856: * Determine where frame payload starts.
857: * Jump over vlan headers if already present,
858: * helpful for QinQ too.
859: */
860: KASSERT(mp->m_len >= offsetof(struct ether_vlan_header, evl_tag));
861: eh = mtod(mp, struct ether_vlan_header *);
862: if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN)) {
863: KASSERT(mp->m_len >= sizeof(struct ether_vlan_header));
864: etype = ntohs(eh->evl_proto);
865: ehdrlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
866: } else {
867: etype = ntohs(eh->evl_encap_proto);
868: ehdrlen = ETHER_HDR_LEN;
869: }
870:
871: /* Set the ether header length */
872: vlan_macip_lens |= ehdrlen << IXGBE_ADVTXD_MACLEN_SHIFT;
873:
1.3 msaitoh 874: if (offload == FALSE)
875: goto no_offloads;
876:
1.8 msaitoh 877: /*
1.28 msaitoh 878: * If the first mbuf only includes the ethernet header,
879: * jump to the next one
880: * XXX: This assumes the stack splits mbufs containing headers
881: * on header boundaries
1.8 msaitoh 882: * XXX: And assumes the entire IP header is contained in one mbuf
883: */
884: if (mp->m_len == ehdrlen && mp->m_next)
885: l3d = mtod(mp->m_next, char *);
886: else
887: l3d = mtod(mp, char *) + ehdrlen;
888:
1.1 msaitoh 889: switch (etype) {
1.9 msaitoh 890: #ifdef INET
1.1 msaitoh 891: case ETHERTYPE_IP:
1.8 msaitoh 892: ip = (struct ip *)(l3d);
893: ip_hlen = ip->ip_hl << 2;
894: ipproto = ip->ip_p;
895: type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV4;
1.1 msaitoh 896: KASSERT((mp->m_pkthdr.csum_flags & M_CSUM_IPv4) == 0 ||
1.8 msaitoh 897: ip->ip_sum == 0);
1.1 msaitoh 898: break;
1.9 msaitoh 899: #endif
900: #ifdef INET6
1.1 msaitoh 901: case ETHERTYPE_IPV6:
1.8 msaitoh 902: ip6 = (struct ip6_hdr *)(l3d);
903: ip_hlen = sizeof(struct ip6_hdr);
904: ipproto = ip6->ip6_nxt;
1.1 msaitoh 905: type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV6;
906: break;
1.9 msaitoh 907: #endif
1.1 msaitoh 908: default:
1.11 msaitoh 909: offload = false;
1.1 msaitoh 910: break;
911: }
912:
913: if ((mp->m_pkthdr.csum_flags & M_CSUM_IPv4) != 0)
914: *olinfo_status |= IXGBE_TXD_POPTS_IXSM << 8;
915:
916: vlan_macip_lens |= ip_hlen;
917:
1.8 msaitoh 918: /* No support for offloads for non-L4 next headers */
919: switch (ipproto) {
1.36 msaitoh 920: case IPPROTO_TCP:
921: if (mp->m_pkthdr.csum_flags &
922: (M_CSUM_TCPv4 | M_CSUM_TCPv6))
923: type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_TCP;
924: else
925: offload = false;
926: break;
927: case IPPROTO_UDP:
928: if (mp->m_pkthdr.csum_flags &
929: (M_CSUM_UDPv4 | M_CSUM_UDPv6))
930: type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_UDP;
931: else
1.11 msaitoh 932: offload = false;
1.36 msaitoh 933: break;
934: default:
935: offload = false;
936: break;
1.8 msaitoh 937: }
938:
939: if (offload) /* Insert L4 checksum into data descriptors */
1.1 msaitoh 940: *olinfo_status |= IXGBE_TXD_POPTS_TXSM << 8;
941:
1.3 msaitoh 942: no_offloads:
943: type_tucmd_mlhl |= IXGBE_ADVTXD_DCMD_DEXT | IXGBE_ADVTXD_DTYP_CTXT;
944:
1.1 msaitoh 945: /* Now copy bits into descriptor */
946: TXD->vlan_macip_lens = htole32(vlan_macip_lens);
947: TXD->type_tucmd_mlhl = htole32(type_tucmd_mlhl);
948: TXD->seqnum_seed = htole32(0);
949: TXD->mss_l4len_idx = htole32(0);
950:
951: /* We've consumed the first desc, adjust counters */
952: if (++ctxd == txr->num_desc)
953: ctxd = 0;
954: txr->next_avail_desc = ctxd;
955: --txr->tx_avail;
956:
1.28 msaitoh 957: return (0);
958: } /* ixgbe_tx_ctx_setup */
1.1 msaitoh 959:
1.28 msaitoh 960: /************************************************************************
961: * ixgbe_tso_setup
1.1 msaitoh 962: *
1.28 msaitoh 963: * Setup work for hardware segmentation offload (TSO) on
964: * adapters using advanced tx descriptors
965: ************************************************************************/
1.1 msaitoh 966: static int
1.28 msaitoh 967: ixgbe_tso_setup(struct tx_ring *txr, struct mbuf *mp, u32 *cmd_type_len,
968: u32 *olinfo_status)
1.1 msaitoh 969: {
970: struct ixgbe_adv_tx_context_desc *TXD;
1.28 msaitoh 971: struct ether_vlan_header *eh;
1.1 msaitoh 972: #ifdef INET6
1.28 msaitoh 973: struct ip6_hdr *ip6;
1.1 msaitoh 974: #endif
975: #ifdef INET
1.28 msaitoh 976: struct ip *ip;
1.1 msaitoh 977: #endif
1.28 msaitoh 978: struct tcphdr *th;
979: int ctxd, ehdrlen, ip_hlen, tcp_hlen;
980: u32 vlan_macip_lens = 0;
981: u32 type_tucmd_mlhl = 0;
982: u32 mss_l4len_idx = 0, paylen;
983: u16 vtag = 0, eh_type;
1.1 msaitoh 984:
985: /*
986: * Determine where frame payload starts.
987: * Jump over vlan headers if already present
988: */
989: eh = mtod(mp, struct ether_vlan_header *);
990: if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN)) {
991: ehdrlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
992: eh_type = eh->evl_proto;
993: } else {
994: ehdrlen = ETHER_HDR_LEN;
995: eh_type = eh->evl_encap_proto;
996: }
997:
998: switch (ntohs(eh_type)) {
999: #ifdef INET
1000: case ETHERTYPE_IP:
1001: ip = (struct ip *)(mp->m_data + ehdrlen);
1002: if (ip->ip_p != IPPROTO_TCP)
1003: return (ENXIO);
1004: ip->ip_sum = 0;
1005: ip_hlen = ip->ip_hl << 2;
1006: th = (struct tcphdr *)((char *)ip + ip_hlen);
1007: th->th_sum = in_cksum_phdr(ip->ip_src.s_addr,
1008: ip->ip_dst.s_addr, htons(IPPROTO_TCP));
1009: type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV4;
1010: /* Tell transmit desc to also do IPv4 checksum. */
1011: *olinfo_status |= IXGBE_TXD_POPTS_IXSM << 8;
1012: break;
1013: #endif
1.28 msaitoh 1014: #ifdef INET6
1015: case ETHERTYPE_IPV6:
1016: ip6 = (struct ip6_hdr *)(mp->m_data + ehdrlen);
1017: /* XXX-BZ For now we do not pretend to support ext. hdrs. */
1018: if (ip6->ip6_nxt != IPPROTO_TCP)
1019: return (ENXIO);
1020: ip_hlen = sizeof(struct ip6_hdr);
1021: ip6 = (struct ip6_hdr *)(mp->m_data + ehdrlen);
1022: th = (struct tcphdr *)((char *)ip6 + ip_hlen);
1023: th->th_sum = in6_cksum_phdr(&ip6->ip6_src,
1024: &ip6->ip6_dst, 0, htonl(IPPROTO_TCP));
1025: type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV6;
1026: break;
1027: #endif
1.1 msaitoh 1028: default:
1029: panic("%s: CSUM_TSO but no supported IP version (0x%04x)",
1030: __func__, ntohs(eh_type));
1031: break;
1032: }
1033:
1034: ctxd = txr->next_avail_desc;
1.28 msaitoh 1035: TXD = (struct ixgbe_adv_tx_context_desc *)&txr->tx_base[ctxd];
1.1 msaitoh 1036:
1037: tcp_hlen = th->th_off << 2;
1038:
1039: /* This is used in the transmit desc in encap */
1040: paylen = mp->m_pkthdr.len - ehdrlen - ip_hlen - tcp_hlen;
1041:
1042: /* VLAN MACLEN IPLEN */
1.29 knakahar 1043: if (vlan_has_tag(mp)) {
1044: vtag = htole16(vlan_get_tag(mp));
1.28 msaitoh 1045: vlan_macip_lens |= (vtag << IXGBE_ADVTXD_VLAN_SHIFT);
1.1 msaitoh 1046: }
1047:
1048: vlan_macip_lens |= ehdrlen << IXGBE_ADVTXD_MACLEN_SHIFT;
1049: vlan_macip_lens |= ip_hlen;
1050: TXD->vlan_macip_lens = htole32(vlan_macip_lens);
1051:
1052: /* ADV DTYPE TUCMD */
1053: type_tucmd_mlhl |= IXGBE_ADVTXD_DCMD_DEXT | IXGBE_ADVTXD_DTYP_CTXT;
1054: type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_TCP;
1055: TXD->type_tucmd_mlhl = htole32(type_tucmd_mlhl);
1056:
1057: /* MSS L4LEN IDX */
1058: mss_l4len_idx |= (mp->m_pkthdr.segsz << IXGBE_ADVTXD_MSS_SHIFT);
1059: mss_l4len_idx |= (tcp_hlen << IXGBE_ADVTXD_L4LEN_SHIFT);
1060: TXD->mss_l4len_idx = htole32(mss_l4len_idx);
1061:
1062: TXD->seqnum_seed = htole32(0);
1063:
1064: if (++ctxd == txr->num_desc)
1065: ctxd = 0;
1066:
1067: txr->tx_avail--;
1068: txr->next_avail_desc = ctxd;
1069: *cmd_type_len |= IXGBE_ADVTXD_DCMD_TSE;
1070: *olinfo_status |= IXGBE_TXD_POPTS_TXSM << 8;
1071: *olinfo_status |= paylen << IXGBE_ADVTXD_PAYLEN_SHIFT;
1072: ++txr->tso_tx.ev_count;
1.28 msaitoh 1073:
1.1 msaitoh 1074: return (0);
1.28 msaitoh 1075: } /* ixgbe_tso_setup */
1.1 msaitoh 1076:
1.3 msaitoh 1077:
1.28 msaitoh 1078: /************************************************************************
1079: * ixgbe_txeof
1.1 msaitoh 1080: *
1.28 msaitoh 1081: * Examine each tx_buffer in the used queue. If the hardware is done
1082: * processing the packet then free associated resources. The
1083: * tx_buffer is put back on the free queue.
1084: ************************************************************************/
1.32 msaitoh 1085: bool
1.1 msaitoh 1086: ixgbe_txeof(struct tx_ring *txr)
1087: {
1088: struct adapter *adapter = txr->adapter;
1089: struct ifnet *ifp = adapter->ifp;
1.28 msaitoh 1090: struct ixgbe_tx_buf *buf;
1091: union ixgbe_adv_tx_desc *txd;
1.1 msaitoh 1092: u32 work, processed = 0;
1.7 msaitoh 1093: u32 limit = adapter->tx_process_limit;
1.1 msaitoh 1094:
1095: KASSERT(mutex_owned(&txr->tx_mtx));
1096:
1097: #ifdef DEV_NETMAP
1.28 msaitoh 1098: if ((adapter->feat_en & IXGBE_FEATURE_NETMAP) &&
1099: (adapter->ifp->if_capenable & IFCAP_NETMAP)) {
1100: struct netmap_adapter *na = NA(adapter->ifp);
1.1 msaitoh 1101: struct netmap_kring *kring = &na->tx_rings[txr->me];
1102: txd = txr->tx_base;
1103: bus_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map,
1104: BUS_DMASYNC_POSTREAD);
1105: /*
1106: * In netmap mode, all the work is done in the context
1107: * of the client thread. Interrupt handlers only wake up
1108: * clients, which may be sleeping on individual rings
1109: * or on a global resource for all rings.
1110: * To implement tx interrupt mitigation, we wake up the client
1111: * thread roughly every half ring, even if the NIC interrupts
1112: * more frequently. This is implemented as follows:
1113: * - ixgbe_txsync() sets kring->nr_kflags with the index of
1114: * the slot that should wake up the thread (nkr_num_slots
1115: * means the user thread should not be woken up);
1116: * - the driver ignores tx interrupts unless netmap_mitigate=0
1117: * or the slot has the DD bit set.
1118: */
1119: if (!netmap_mitigate ||
1120: (kring->nr_kflags < kring->nkr_num_slots &&
1.28 msaitoh 1121: txd[kring->nr_kflags].wb.status & IXGBE_TXD_STAT_DD)) {
1.1 msaitoh 1122: netmap_tx_irq(ifp, txr->me);
1123: }
1.32 msaitoh 1124: return false;
1.1 msaitoh 1125: }
1126: #endif /* DEV_NETMAP */
1127:
1128: if (txr->tx_avail == txr->num_desc) {
1.3 msaitoh 1129: txr->busy = 0;
1.32 msaitoh 1130: return false;
1.1 msaitoh 1131: }
1132:
1133: /* Get work starting point */
1134: work = txr->next_to_clean;
1135: buf = &txr->tx_buffers[work];
1136: txd = &txr->tx_base[work];
1137: work -= txr->num_desc; /* The distance to ring end */
1.28 msaitoh 1138: ixgbe_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map,
1.1 msaitoh 1139: BUS_DMASYNC_POSTREAD);
1.8 msaitoh 1140:
1.1 msaitoh 1141: do {
1.8 msaitoh 1142: union ixgbe_adv_tx_desc *eop = buf->eop;
1.1 msaitoh 1143: if (eop == NULL) /* No work */
1144: break;
1145:
1146: if ((eop->wb.status & IXGBE_TXD_STAT_DD) == 0)
1147: break; /* I/O not complete */
1148:
1149: if (buf->m_head) {
1.28 msaitoh 1150: txr->bytes += buf->m_head->m_pkthdr.len;
1151: bus_dmamap_sync(txr->txtag->dt_dmat, buf->map,
1.1 msaitoh 1152: 0, buf->m_head->m_pkthdr.len,
1153: BUS_DMASYNC_POSTWRITE);
1.28 msaitoh 1154: ixgbe_dmamap_unload(txr->txtag, buf->map);
1.1 msaitoh 1155: m_freem(buf->m_head);
1156: buf->m_head = NULL;
1157: }
1158: buf->eop = NULL;
1159: ++txr->tx_avail;
1160:
1161: /* We clean the range if multi segment */
1162: while (txd != eop) {
1163: ++txd;
1164: ++buf;
1165: ++work;
1166: /* wrap the ring? */
1167: if (__predict_false(!work)) {
1168: work -= txr->num_desc;
1169: buf = txr->tx_buffers;
1170: txd = txr->tx_base;
1171: }
1172: if (buf->m_head) {
1173: txr->bytes +=
1174: buf->m_head->m_pkthdr.len;
1175: bus_dmamap_sync(txr->txtag->dt_dmat,
1176: buf->map,
1177: 0, buf->m_head->m_pkthdr.len,
1178: BUS_DMASYNC_POSTWRITE);
1179: ixgbe_dmamap_unload(txr->txtag,
1180: buf->map);
1181: m_freem(buf->m_head);
1182: buf->m_head = NULL;
1183: }
1184: ++txr->tx_avail;
1185: buf->eop = NULL;
1186:
1187: }
1188: ++txr->packets;
1189: ++processed;
1190: ++ifp->if_opackets;
1191:
1192: /* Try the next packet */
1193: ++txd;
1194: ++buf;
1195: ++work;
1196: /* reset with a wrap */
1197: if (__predict_false(!work)) {
1198: work -= txr->num_desc;
1199: buf = txr->tx_buffers;
1200: txd = txr->tx_base;
1201: }
1202: prefetch(txd);
1203: } while (__predict_true(--limit));
1204:
1205: ixgbe_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map,
1206: BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1207:
1208: work += txr->num_desc;
1209: txr->next_to_clean = work;
1210:
1211: /*
1.28 msaitoh 1212: * Queue Hang detection, we know there's
1213: * work outstanding or the first return
1214: * would have been taken, so increment busy
1215: * if nothing managed to get cleaned, then
1216: * in local_timer it will be checked and
1217: * marked as HUNG if it exceeds a MAX attempt.
1218: */
1.3 msaitoh 1219: if ((processed == 0) && (txr->busy != IXGBE_QUEUE_HUNG))
1220: ++txr->busy;
1221: /*
1.28 msaitoh 1222: * If anything gets cleaned we reset state to 1,
1223: * note this will turn off HUNG if its set.
1224: */
1.3 msaitoh 1225: if (processed)
1226: txr->busy = 1;
1.1 msaitoh 1227:
1228: if (txr->tx_avail == txr->num_desc)
1.3 msaitoh 1229: txr->busy = 0;
1.1 msaitoh 1230:
1.32 msaitoh 1231: return ((limit > 0) ? false : true);
1.28 msaitoh 1232: } /* ixgbe_txeof */
1.1 msaitoh 1233:
1.28 msaitoh 1234: /************************************************************************
1235: * ixgbe_rsc_count
1236: *
1237: * Used to detect a descriptor that has been merged by Hardware RSC.
1238: ************************************************************************/
1.1 msaitoh 1239: static inline u32
1240: ixgbe_rsc_count(union ixgbe_adv_rx_desc *rx)
1241: {
1242: return (le32toh(rx->wb.lower.lo_dword.data) &
1243: IXGBE_RXDADV_RSCCNT_MASK) >> IXGBE_RXDADV_RSCCNT_SHIFT;
1.28 msaitoh 1244: } /* ixgbe_rsc_count */
1.1 msaitoh 1245:
1.28 msaitoh 1246: /************************************************************************
1247: * ixgbe_setup_hw_rsc
1.1 msaitoh 1248: *
1.28 msaitoh 1249: * Initialize Hardware RSC (LRO) feature on 82599
1250: * for an RX ring, this is toggled by the LRO capability
1251: * even though it is transparent to the stack.
1252: *
1253: * NOTE: Since this HW feature only works with IPv4 and
1254: * testing has shown soft LRO to be as effective,
1255: * this feature will be disabled by default.
1256: ************************************************************************/
1.1 msaitoh 1257: static void
1258: ixgbe_setup_hw_rsc(struct rx_ring *rxr)
1259: {
1.28 msaitoh 1260: struct adapter *adapter = rxr->adapter;
1261: struct ixgbe_hw *hw = &adapter->hw;
1262: u32 rscctrl, rdrxctl;
1.1 msaitoh 1263:
1264: /* If turning LRO/RSC off we need to disable it */
1265: if ((adapter->ifp->if_capenable & IFCAP_LRO) == 0) {
1266: rscctrl = IXGBE_READ_REG(hw, IXGBE_RSCCTL(rxr->me));
1267: rscctrl &= ~IXGBE_RSCCTL_RSCEN;
1268: return;
1269: }
1270:
1271: rdrxctl = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
1272: rdrxctl &= ~IXGBE_RDRXCTL_RSCFRSTSIZE;
1.28 msaitoh 1273: #ifdef DEV_NETMAP
1274: /* Always strip CRC unless Netmap disabled it */
1275: if (!(adapter->feat_en & IXGBE_FEATURE_NETMAP) ||
1276: !(adapter->ifp->if_capenable & IFCAP_NETMAP) ||
1277: ix_crcstrip)
1.1 msaitoh 1278: #endif /* DEV_NETMAP */
1.28 msaitoh 1279: rdrxctl |= IXGBE_RDRXCTL_CRCSTRIP;
1.1 msaitoh 1280: rdrxctl |= IXGBE_RDRXCTL_RSCACKC;
1281: IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, rdrxctl);
1282:
1283: rscctrl = IXGBE_READ_REG(hw, IXGBE_RSCCTL(rxr->me));
1284: rscctrl |= IXGBE_RSCCTL_RSCEN;
1285: /*
1.28 msaitoh 1286: * Limit the total number of descriptors that
1287: * can be combined, so it does not exceed 64K
1288: */
1.1 msaitoh 1289: if (rxr->mbuf_sz == MCLBYTES)
1290: rscctrl |= IXGBE_RSCCTL_MAXDESC_16;
1291: else if (rxr->mbuf_sz == MJUMPAGESIZE)
1292: rscctrl |= IXGBE_RSCCTL_MAXDESC_8;
1293: else if (rxr->mbuf_sz == MJUM9BYTES)
1294: rscctrl |= IXGBE_RSCCTL_MAXDESC_4;
1295: else /* Using 16K cluster */
1296: rscctrl |= IXGBE_RSCCTL_MAXDESC_1;
1297:
1298: IXGBE_WRITE_REG(hw, IXGBE_RSCCTL(rxr->me), rscctrl);
1299:
1300: /* Enable TCP header recognition */
1301: IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(0),
1.28 msaitoh 1302: (IXGBE_READ_REG(hw, IXGBE_PSRTYPE(0)) | IXGBE_PSRTYPE_TCPHDR));
1.1 msaitoh 1303:
1304: /* Disable RSC for ACK packets */
1305: IXGBE_WRITE_REG(hw, IXGBE_RSCDBU,
1306: (IXGBE_RSCDBU_RSCACKDIS | IXGBE_READ_REG(hw, IXGBE_RSCDBU)));
1307:
1308: rxr->hw_rsc = TRUE;
1.28 msaitoh 1309: } /* ixgbe_setup_hw_rsc */
1.8 msaitoh 1310:
1.28 msaitoh 1311: /************************************************************************
1312: * ixgbe_refresh_mbufs
1.1 msaitoh 1313: *
1.28 msaitoh 1314: * Refresh mbuf buffers for RX descriptor rings
1315: * - now keeps its own state so discards due to resource
1316: * exhaustion are unnecessary, if an mbuf cannot be obtained
1317: * it just returns, keeping its placeholder, thus it can simply
1318: * be recalled to try again.
1319: ************************************************************************/
1.1 msaitoh 1320: static void
1321: ixgbe_refresh_mbufs(struct rx_ring *rxr, int limit)
1322: {
1.28 msaitoh 1323: struct adapter *adapter = rxr->adapter;
1324: struct ixgbe_rx_buf *rxbuf;
1325: struct mbuf *mp;
1326: int i, j, error;
1327: bool refreshed = false;
1.1 msaitoh 1328:
1329: i = j = rxr->next_to_refresh;
1330: /* Control the loop with one beyond */
1331: if (++j == rxr->num_desc)
1332: j = 0;
1333:
1334: while (j != limit) {
1335: rxbuf = &rxr->rx_buffers[i];
1336: if (rxbuf->buf == NULL) {
1337: mp = ixgbe_getjcl(&adapter->jcl_head, M_NOWAIT,
1338: MT_DATA, M_PKTHDR, rxr->mbuf_sz);
1339: if (mp == NULL) {
1340: rxr->no_jmbuf.ev_count++;
1341: goto update;
1342: }
1343: if (adapter->max_frame_size <= (MCLBYTES - ETHER_ALIGN))
1344: m_adj(mp, ETHER_ALIGN);
1345: } else
1346: mp = rxbuf->buf;
1347:
1348: mp->m_pkthdr.len = mp->m_len = rxr->mbuf_sz;
1349:
1350: /* If we're dealing with an mbuf that was copied rather
1351: * than replaced, there's no need to go through busdma.
1352: */
1353: if ((rxbuf->flags & IXGBE_RX_COPY) == 0) {
1354: /* Get the memory mapping */
1.4 msaitoh 1355: ixgbe_dmamap_unload(rxr->ptag, rxbuf->pmap);
1.1 msaitoh 1356: error = bus_dmamap_load_mbuf(rxr->ptag->dt_dmat,
1357: rxbuf->pmap, mp, BUS_DMA_NOWAIT);
1358: if (error != 0) {
1.28 msaitoh 1359: printf("Refresh mbufs: payload dmamap load failure - %d\n", error);
1.1 msaitoh 1360: m_free(mp);
1361: rxbuf->buf = NULL;
1362: goto update;
1363: }
1364: rxbuf->buf = mp;
1365: bus_dmamap_sync(rxr->ptag->dt_dmat, rxbuf->pmap,
1366: 0, mp->m_pkthdr.len, BUS_DMASYNC_PREREAD);
1367: rxbuf->addr = rxr->rx_base[i].read.pkt_addr =
1368: htole64(rxbuf->pmap->dm_segs[0].ds_addr);
1369: } else {
1370: rxr->rx_base[i].read.pkt_addr = rxbuf->addr;
1371: rxbuf->flags &= ~IXGBE_RX_COPY;
1372: }
1373:
1374: refreshed = true;
1375: /* Next is precalculated */
1376: i = j;
1377: rxr->next_to_refresh = i;
1378: if (++j == rxr->num_desc)
1379: j = 0;
1380: }
1.28 msaitoh 1381:
1.1 msaitoh 1382: update:
1383: if (refreshed) /* Update hardware tail index */
1.28 msaitoh 1384: IXGBE_WRITE_REG(&adapter->hw, rxr->tail, rxr->next_to_refresh);
1385:
1.1 msaitoh 1386: return;
1.28 msaitoh 1387: } /* ixgbe_refresh_mbufs */
1.1 msaitoh 1388:
1.28 msaitoh 1389: /************************************************************************
1390: * ixgbe_allocate_receive_buffers
1.1 msaitoh 1391: *
1.28 msaitoh 1392: * Allocate memory for rx_buffer structures. Since we use one
1393: * rx_buffer per received packet, the maximum number of rx_buffer's
1394: * that we'll need is equal to the number of receive descriptors
1395: * that we've allocated.
1396: ************************************************************************/
1397: static int
1.1 msaitoh 1398: ixgbe_allocate_receive_buffers(struct rx_ring *rxr)
1399: {
1.28 msaitoh 1400: struct adapter *adapter = rxr->adapter;
1401: device_t dev = adapter->dev;
1402: struct ixgbe_rx_buf *rxbuf;
1403: int bsize, error;
1.1 msaitoh 1404:
1405: bsize = sizeof(struct ixgbe_rx_buf) * rxr->num_desc;
1.28 msaitoh 1406: rxr->rx_buffers = (struct ixgbe_rx_buf *)malloc(bsize, M_DEVBUF,
1407: M_NOWAIT | M_ZERO);
1408: if (rxr->rx_buffers == NULL) {
1.1 msaitoh 1409: aprint_error_dev(dev, "Unable to allocate rx_buffer memory\n");
1410: error = ENOMEM;
1411: goto fail;
1412: }
1413:
1.28 msaitoh 1414: error = ixgbe_dma_tag_create(
1415: /* parent */ adapter->osdep.dmat,
1416: /* alignment */ 1,
1417: /* bounds */ 0,
1418: /* maxsize */ MJUM16BYTES,
1419: /* nsegments */ 1,
1420: /* maxsegsize */ MJUM16BYTES,
1421: /* flags */ 0,
1422: &rxr->ptag);
1423: if (error != 0) {
1.1 msaitoh 1424: aprint_error_dev(dev, "Unable to create RX DMA tag\n");
1425: goto fail;
1426: }
1427:
1.5 msaitoh 1428: for (int i = 0; i < rxr->num_desc; i++, rxbuf++) {
1.1 msaitoh 1429: rxbuf = &rxr->rx_buffers[i];
1.4 msaitoh 1430: error = ixgbe_dmamap_create(rxr->ptag, 0, &rxbuf->pmap);
1.1 msaitoh 1431: if (error) {
1432: aprint_error_dev(dev, "Unable to create RX dma map\n");
1433: goto fail;
1434: }
1435: }
1436:
1437: return (0);
1438:
1439: fail:
1440: /* Frees all, but can handle partial completion */
1441: ixgbe_free_receive_structures(adapter);
1.28 msaitoh 1442:
1.1 msaitoh 1443: return (error);
1.28 msaitoh 1444: } /* ixgbe_allocate_receive_buffers */
1.1 msaitoh 1445:
1.28 msaitoh 1446: /************************************************************************
1.30 msaitoh 1447: * ixgbe_free_receive_ring
1.28 msaitoh 1448: ************************************************************************/
1449: static void
1.1 msaitoh 1450: ixgbe_free_receive_ring(struct rx_ring *rxr)
1.27 msaitoh 1451: {
1.5 msaitoh 1452: for (int i = 0; i < rxr->num_desc; i++) {
1.27 msaitoh 1453: ixgbe_rx_discard(rxr, i);
1.1 msaitoh 1454: }
1.28 msaitoh 1455: } /* ixgbe_free_receive_ring */
1.1 msaitoh 1456:
1.28 msaitoh 1457: /************************************************************************
1458: * ixgbe_setup_receive_ring
1.1 msaitoh 1459: *
1.28 msaitoh 1460: * Initialize a receive ring and its buffers.
1461: ************************************************************************/
1.1 msaitoh 1462: static int
1463: ixgbe_setup_receive_ring(struct rx_ring *rxr)
1464: {
1.28 msaitoh 1465: struct adapter *adapter;
1466: struct ixgbe_rx_buf *rxbuf;
1.1 msaitoh 1467: #ifdef LRO
1.28 msaitoh 1468: struct ifnet *ifp;
1469: struct lro_ctrl *lro = &rxr->lro;
1.1 msaitoh 1470: #endif /* LRO */
1471: #ifdef DEV_NETMAP
1472: struct netmap_adapter *na = NA(rxr->adapter->ifp);
1.28 msaitoh 1473: struct netmap_slot *slot;
1.1 msaitoh 1474: #endif /* DEV_NETMAP */
1.28 msaitoh 1475: int rsize, error = 0;
1.1 msaitoh 1476:
1477: adapter = rxr->adapter;
1478: #ifdef LRO
1479: ifp = adapter->ifp;
1480: #endif /* LRO */
1481:
1482: /* Clear the ring contents */
1483: IXGBE_RX_LOCK(rxr);
1.28 msaitoh 1484:
1.1 msaitoh 1485: #ifdef DEV_NETMAP
1.28 msaitoh 1486: if (adapter->feat_en & IXGBE_FEATURE_NETMAP)
1487: slot = netmap_reset(na, NR_RX, rxr->me, 0);
1.1 msaitoh 1488: #endif /* DEV_NETMAP */
1.28 msaitoh 1489:
1.1 msaitoh 1490: rsize = roundup2(adapter->num_rx_desc *
1491: sizeof(union ixgbe_adv_rx_desc), DBA_ALIGN);
1492: bzero((void *)rxr->rx_base, rsize);
1493: /* Cache the size */
1494: rxr->mbuf_sz = adapter->rx_mbuf_sz;
1495:
1496: /* Free current RX buffer structs and their mbufs */
1497: ixgbe_free_receive_ring(rxr);
1498:
1499: /* Now replenish the mbufs */
1500: for (int j = 0; j != rxr->num_desc; ++j) {
1.28 msaitoh 1501: struct mbuf *mp;
1.1 msaitoh 1502:
1503: rxbuf = &rxr->rx_buffers[j];
1.28 msaitoh 1504:
1.1 msaitoh 1505: #ifdef DEV_NETMAP
1506: /*
1507: * In netmap mode, fill the map and set the buffer
1508: * address in the NIC ring, considering the offset
1509: * between the netmap and NIC rings (see comment in
1510: * ixgbe_setup_transmit_ring() ). No need to allocate
1511: * an mbuf, so end the block with a continue;
1512: */
1.28 msaitoh 1513: if ((adapter->feat_en & IXGBE_FEATURE_NETMAP) && slot) {
1.1 msaitoh 1514: int sj = netmap_idx_n2k(&na->rx_rings[rxr->me], j);
1515: uint64_t paddr;
1516: void *addr;
1517:
1518: addr = PNMB(na, slot + sj, &paddr);
1519: netmap_load_map(na, rxr->ptag, rxbuf->pmap, addr);
1520: /* Update descriptor and the cached value */
1521: rxr->rx_base[j].read.pkt_addr = htole64(paddr);
1522: rxbuf->addr = htole64(paddr);
1523: continue;
1524: }
1525: #endif /* DEV_NETMAP */
1.28 msaitoh 1526:
1527: rxbuf->flags = 0;
1.1 msaitoh 1528: rxbuf->buf = ixgbe_getjcl(&adapter->jcl_head, M_NOWAIT,
1529: MT_DATA, M_PKTHDR, adapter->rx_mbuf_sz);
1530: if (rxbuf->buf == NULL) {
1531: error = ENOBUFS;
1.28 msaitoh 1532: goto fail;
1.1 msaitoh 1533: }
1534: mp = rxbuf->buf;
1535: mp->m_pkthdr.len = mp->m_len = rxr->mbuf_sz;
1536: /* Get the memory mapping */
1.28 msaitoh 1537: error = bus_dmamap_load_mbuf(rxr->ptag->dt_dmat, rxbuf->pmap,
1538: mp, BUS_DMA_NOWAIT);
1.1 msaitoh 1539: if (error != 0)
1540: goto fail;
1541: bus_dmamap_sync(rxr->ptag->dt_dmat, rxbuf->pmap,
1542: 0, adapter->rx_mbuf_sz, BUS_DMASYNC_PREREAD);
1543: /* Update the descriptor and the cached value */
1544: rxr->rx_base[j].read.pkt_addr =
1545: htole64(rxbuf->pmap->dm_segs[0].ds_addr);
1546: rxbuf->addr = htole64(rxbuf->pmap->dm_segs[0].ds_addr);
1547: }
1548:
1549:
1550: /* Setup our descriptor indices */
1551: rxr->next_to_check = 0;
1552: rxr->next_to_refresh = 0;
1553: rxr->lro_enabled = FALSE;
1554: rxr->rx_copies.ev_count = 0;
1.13 msaitoh 1555: #if 0 /* NetBSD */
1.1 msaitoh 1556: rxr->rx_bytes.ev_count = 0;
1.13 msaitoh 1557: #if 1 /* Fix inconsistency */
1558: rxr->rx_packets.ev_count = 0;
1559: #endif
1560: #endif
1.1 msaitoh 1561: rxr->vtag_strip = FALSE;
1562:
1563: ixgbe_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map,
1564: BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1565:
1566: /*
1.28 msaitoh 1567: * Now set up the LRO interface
1568: */
1.1 msaitoh 1569: if (ixgbe_rsc_enable)
1570: ixgbe_setup_hw_rsc(rxr);
1571: #ifdef LRO
1572: else if (ifp->if_capenable & IFCAP_LRO) {
1573: device_t dev = adapter->dev;
1574: int err = tcp_lro_init(lro);
1575: if (err) {
1576: device_printf(dev, "LRO Initialization failed!\n");
1577: goto fail;
1578: }
1579: INIT_DEBUGOUT("RX Soft LRO Initialized\n");
1580: rxr->lro_enabled = TRUE;
1581: lro->ifp = adapter->ifp;
1582: }
1583: #endif /* LRO */
1584:
1585: IXGBE_RX_UNLOCK(rxr);
1.28 msaitoh 1586:
1.1 msaitoh 1587: return (0);
1588:
1589: fail:
1590: ixgbe_free_receive_ring(rxr);
1591: IXGBE_RX_UNLOCK(rxr);
1.28 msaitoh 1592:
1.1 msaitoh 1593: return (error);
1.28 msaitoh 1594: } /* ixgbe_setup_receive_ring */
1.1 msaitoh 1595:
1.28 msaitoh 1596: /************************************************************************
1597: * ixgbe_setup_receive_structures - Initialize all receive rings.
1598: ************************************************************************/
1.1 msaitoh 1599: int
1600: ixgbe_setup_receive_structures(struct adapter *adapter)
1601: {
1602: struct rx_ring *rxr = adapter->rx_rings;
1.28 msaitoh 1603: int j;
1.1 msaitoh 1604:
1.30 msaitoh 1605: /*
1606: * Now reinitialize our supply of jumbo mbufs. The number
1607: * or size of jumbo mbufs may have changed.
1608: * Assume all of rxr->ptag are the same.
1609: */
1.41 ! msaitoh 1610: ixgbe_jcl_reinit(adapter, rxr->ptag->dt_dmat,
1.30 msaitoh 1611: (2 * adapter->num_rx_desc) * adapter->num_queues,
1612: adapter->rx_mbuf_sz);
1613:
1.1 msaitoh 1614: for (j = 0; j < adapter->num_queues; j++, rxr++)
1615: if (ixgbe_setup_receive_ring(rxr))
1616: goto fail;
1617:
1618: return (0);
1619: fail:
1620: /*
1621: * Free RX buffers allocated so far, we will only handle
1622: * the rings that completed, the failing case will have
1623: * cleaned up for itself. 'j' failed, so its the terminus.
1624: */
1625: for (int i = 0; i < j; ++i) {
1626: rxr = &adapter->rx_rings[i];
1.27 msaitoh 1627: IXGBE_RX_LOCK(rxr);
1.1 msaitoh 1628: ixgbe_free_receive_ring(rxr);
1.27 msaitoh 1629: IXGBE_RX_UNLOCK(rxr);
1.1 msaitoh 1630: }
1631:
1632: return (ENOBUFS);
1.28 msaitoh 1633: } /* ixgbe_setup_receive_structures */
1.1 msaitoh 1634:
1.3 msaitoh 1635:
1.28 msaitoh 1636: /************************************************************************
1637: * ixgbe_free_receive_structures - Free all receive rings.
1638: ************************************************************************/
1.1 msaitoh 1639: void
1640: ixgbe_free_receive_structures(struct adapter *adapter)
1641: {
1642: struct rx_ring *rxr = adapter->rx_rings;
1643:
1644: INIT_DEBUGOUT("ixgbe_free_receive_structures: begin");
1645:
1646: for (int i = 0; i < adapter->num_queues; i++, rxr++) {
1647: ixgbe_free_receive_buffers(rxr);
1648: #ifdef LRO
1649: /* Free LRO memory */
1.28 msaitoh 1650: tcp_lro_free(&rxr->lro);
1.1 msaitoh 1651: #endif /* LRO */
1652: /* Free the ring memory as well */
1653: ixgbe_dma_free(adapter, &rxr->rxdma);
1654: IXGBE_RX_LOCK_DESTROY(rxr);
1655: }
1656:
1657: free(adapter->rx_rings, M_DEVBUF);
1.28 msaitoh 1658: } /* ixgbe_free_receive_structures */
1.1 msaitoh 1659:
1660:
1.28 msaitoh 1661: /************************************************************************
1662: * ixgbe_free_receive_buffers - Free receive ring data structures
1663: ************************************************************************/
1.1 msaitoh 1664: static void
1665: ixgbe_free_receive_buffers(struct rx_ring *rxr)
1666: {
1.28 msaitoh 1667: struct adapter *adapter = rxr->adapter;
1668: struct ixgbe_rx_buf *rxbuf;
1.1 msaitoh 1669:
1670: INIT_DEBUGOUT("ixgbe_free_receive_buffers: begin");
1671:
1672: /* Cleanup any existing buffers */
1673: if (rxr->rx_buffers != NULL) {
1674: for (int i = 0; i < adapter->num_rx_desc; i++) {
1675: rxbuf = &rxr->rx_buffers[i];
1.27 msaitoh 1676: ixgbe_rx_discard(rxr, i);
1.1 msaitoh 1677: if (rxbuf->pmap != NULL) {
1678: ixgbe_dmamap_destroy(rxr->ptag, rxbuf->pmap);
1679: rxbuf->pmap = NULL;
1680: }
1681: }
1682: if (rxr->rx_buffers != NULL) {
1683: free(rxr->rx_buffers, M_DEVBUF);
1684: rxr->rx_buffers = NULL;
1685: }
1686: }
1687:
1688: if (rxr->ptag != NULL) {
1689: ixgbe_dma_tag_destroy(rxr->ptag);
1690: rxr->ptag = NULL;
1691: }
1692:
1693: return;
1.28 msaitoh 1694: } /* ixgbe_free_receive_buffers */
1.1 msaitoh 1695:
1.28 msaitoh 1696: /************************************************************************
1697: * ixgbe_rx_input
1698: ************************************************************************/
1.1 msaitoh 1699: static __inline void
1.28 msaitoh 1700: ixgbe_rx_input(struct rx_ring *rxr, struct ifnet *ifp, struct mbuf *m,
1701: u32 ptype)
1.1 msaitoh 1702: {
1.20 msaitoh 1703: struct adapter *adapter = ifp->if_softc;
1.1 msaitoh 1704:
1705: #ifdef LRO
1706: struct ethercom *ec = &adapter->osdep.ec;
1707:
1.28 msaitoh 1708: /*
1709: * ATM LRO is only for IP/TCP packets and TCP checksum of the packet
1710: * should be computed by hardware. Also it should not have VLAN tag in
1711: * ethernet header. In case of IPv6 we do not yet support ext. hdrs.
1712: */
1.1 msaitoh 1713: if (rxr->lro_enabled &&
1714: (ec->ec_capenable & ETHERCAP_VLAN_HWTAGGING) != 0 &&
1715: (ptype & IXGBE_RXDADV_PKTTYPE_ETQF) == 0 &&
1716: ((ptype & (IXGBE_RXDADV_PKTTYPE_IPV4 | IXGBE_RXDADV_PKTTYPE_TCP)) ==
1717: (IXGBE_RXDADV_PKTTYPE_IPV4 | IXGBE_RXDADV_PKTTYPE_TCP) ||
1718: (ptype & (IXGBE_RXDADV_PKTTYPE_IPV6 | IXGBE_RXDADV_PKTTYPE_TCP)) ==
1719: (IXGBE_RXDADV_PKTTYPE_IPV6 | IXGBE_RXDADV_PKTTYPE_TCP)) &&
1720: (m->m_pkthdr.csum_flags & (CSUM_DATA_VALID | CSUM_PSEUDO_HDR)) ==
1721: (CSUM_DATA_VALID | CSUM_PSEUDO_HDR)) {
1722: /*
1723: * Send to the stack if:
1724: ** - LRO not enabled, or
1725: ** - no LRO resources, or
1726: ** - lro enqueue fails
1727: */
1728: if (rxr->lro.lro_cnt != 0)
1729: if (tcp_lro_rx(&rxr->lro, m, 0) == 0)
1730: return;
1731: }
1732: #endif /* LRO */
1733:
1.20 msaitoh 1734: if_percpuq_enqueue(adapter->ipq, m);
1.28 msaitoh 1735: } /* ixgbe_rx_input */
1.1 msaitoh 1736:
1.28 msaitoh 1737: /************************************************************************
1738: * ixgbe_rx_discard
1739: ************************************************************************/
1.1 msaitoh 1740: static __inline void
1741: ixgbe_rx_discard(struct rx_ring *rxr, int i)
1742: {
1.28 msaitoh 1743: struct ixgbe_rx_buf *rbuf;
1.1 msaitoh 1744:
1745: rbuf = &rxr->rx_buffers[i];
1746:
1747: /*
1.28 msaitoh 1748: * With advanced descriptors the writeback
1749: * clobbers the buffer addrs, so its easier
1750: * to just free the existing mbufs and take
1751: * the normal refresh path to get new buffers
1752: * and mapping.
1753: */
1.1 msaitoh 1754:
1.26 msaitoh 1755: if (rbuf->fmp != NULL) {/* Partial chain ? */
1.27 msaitoh 1756: bus_dmamap_sync(rxr->ptag->dt_dmat, rbuf->pmap, 0,
1757: rbuf->buf->m_pkthdr.len, BUS_DMASYNC_POSTREAD);
1.1 msaitoh 1758: m_freem(rbuf->fmp);
1759: rbuf->fmp = NULL;
1760: rbuf->buf = NULL; /* rbuf->buf is part of fmp's chain */
1761: } else if (rbuf->buf) {
1.27 msaitoh 1762: bus_dmamap_sync(rxr->ptag->dt_dmat, rbuf->pmap, 0,
1763: rbuf->buf->m_pkthdr.len, BUS_DMASYNC_POSTREAD);
1.1 msaitoh 1764: m_free(rbuf->buf);
1765: rbuf->buf = NULL;
1766: }
1.4 msaitoh 1767: ixgbe_dmamap_unload(rxr->ptag, rbuf->pmap);
1.1 msaitoh 1768:
1769: rbuf->flags = 0;
1770:
1771: return;
1.28 msaitoh 1772: } /* ixgbe_rx_discard */
1.1 msaitoh 1773:
1774:
1.28 msaitoh 1775: /************************************************************************
1776: * ixgbe_rxeof
1.1 msaitoh 1777: *
1.28 msaitoh 1778: * Executes in interrupt context. It replenishes the
1779: * mbufs in the descriptor and sends data which has
1780: * been dma'ed into host memory to upper layer.
1.1 msaitoh 1781: *
1.28 msaitoh 1782: * Return TRUE for more work, FALSE for all clean.
1783: ************************************************************************/
1.1 msaitoh 1784: bool
1785: ixgbe_rxeof(struct ix_queue *que)
1786: {
1787: struct adapter *adapter = que->adapter;
1788: struct rx_ring *rxr = que->rxr;
1789: struct ifnet *ifp = adapter->ifp;
1790: #ifdef LRO
1791: struct lro_ctrl *lro = &rxr->lro;
1792: #endif /* LRO */
1.28 msaitoh 1793: union ixgbe_adv_rx_desc *cur;
1794: struct ixgbe_rx_buf *rbuf, *nbuf;
1.1 msaitoh 1795: int i, nextp, processed = 0;
1796: u32 staterr = 0;
1.7 msaitoh 1797: u32 count = adapter->rx_process_limit;
1.1 msaitoh 1798: #ifdef RSS
1799: u16 pkt_info;
1800: #endif
1801:
1802: IXGBE_RX_LOCK(rxr);
1803:
1804: #ifdef DEV_NETMAP
1.28 msaitoh 1805: if (adapter->feat_en & IXGBE_FEATURE_NETMAP) {
1806: /* Same as the txeof routine: wakeup clients on intr. */
1807: if (netmap_rx_irq(ifp, rxr->me, &processed)) {
1808: IXGBE_RX_UNLOCK(rxr);
1809: return (FALSE);
1810: }
1.1 msaitoh 1811: }
1812: #endif /* DEV_NETMAP */
1813:
1814: for (i = rxr->next_to_check; count != 0;) {
1.28 msaitoh 1815: struct mbuf *sendmp, *mp;
1816: u32 rsc, ptype;
1817: u16 len;
1818: u16 vtag = 0;
1819: bool eop;
1.1 msaitoh 1820:
1821: /* Sync the ring. */
1822: ixgbe_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map,
1823: BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
1824:
1825: cur = &rxr->rx_base[i];
1826: staterr = le32toh(cur->wb.upper.status_error);
1827: #ifdef RSS
1828: pkt_info = le16toh(cur->wb.lower.lo_dword.hs_rss.pkt_info);
1829: #endif
1830:
1831: if ((staterr & IXGBE_RXD_STAT_DD) == 0)
1832: break;
1833: if ((ifp->if_flags & IFF_RUNNING) == 0)
1834: break;
1835:
1836: count--;
1837: sendmp = NULL;
1838: nbuf = NULL;
1839: rsc = 0;
1840: cur->wb.upper.status_error = 0;
1841: rbuf = &rxr->rx_buffers[i];
1842: mp = rbuf->buf;
1843:
1844: len = le16toh(cur->wb.upper.length);
1845: ptype = le32toh(cur->wb.lower.lo_dword.data) &
1846: IXGBE_RXDADV_PKTTYPE_MASK;
1847: eop = ((staterr & IXGBE_RXD_STAT_EOP) != 0);
1848:
1849: /* Make sure bad packets are discarded */
1850: if (eop && (staterr & IXGBE_RXDADV_ERR_FRAME_ERR_MASK) != 0) {
1.3 msaitoh 1851: #if __FreeBSD_version >= 1100036
1.28 msaitoh 1852: if (adapter->feat_en & IXGBE_FEATURE_VF)
1.4 msaitoh 1853: if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
1.3 msaitoh 1854: #endif
1.1 msaitoh 1855: rxr->rx_discarded.ev_count++;
1856: ixgbe_rx_discard(rxr, i);
1857: goto next_desc;
1858: }
1859:
1.27 msaitoh 1860: bus_dmamap_sync(rxr->ptag->dt_dmat, rbuf->pmap, 0,
1861: rbuf->buf->m_pkthdr.len, BUS_DMASYNC_POSTREAD);
1862:
1.1 msaitoh 1863: /*
1.28 msaitoh 1864: * On 82599 which supports a hardware
1865: * LRO (called HW RSC), packets need
1866: * not be fragmented across sequential
1867: * descriptors, rather the next descriptor
1868: * is indicated in bits of the descriptor.
1869: * This also means that we might proceses
1870: * more than one packet at a time, something
1871: * that has never been true before, it
1872: * required eliminating global chain pointers
1873: * in favor of what we are doing here. -jfv
1874: */
1.1 msaitoh 1875: if (!eop) {
1876: /*
1.28 msaitoh 1877: * Figure out the next descriptor
1878: * of this frame.
1879: */
1.1 msaitoh 1880: if (rxr->hw_rsc == TRUE) {
1881: rsc = ixgbe_rsc_count(cur);
1882: rxr->rsc_num += (rsc - 1);
1883: }
1884: if (rsc) { /* Get hardware index */
1.28 msaitoh 1885: nextp = ((staterr & IXGBE_RXDADV_NEXTP_MASK) >>
1.1 msaitoh 1886: IXGBE_RXDADV_NEXTP_SHIFT);
1887: } else { /* Just sequential */
1888: nextp = i + 1;
1889: if (nextp == adapter->num_rx_desc)
1890: nextp = 0;
1891: }
1892: nbuf = &rxr->rx_buffers[nextp];
1893: prefetch(nbuf);
1894: }
1895: /*
1.28 msaitoh 1896: * Rather than using the fmp/lmp global pointers
1897: * we now keep the head of a packet chain in the
1898: * buffer struct and pass this along from one
1899: * descriptor to the next, until we get EOP.
1900: */
1.1 msaitoh 1901: mp->m_len = len;
1902: /*
1.28 msaitoh 1903: * See if there is a stored head
1904: * that determines what we are
1905: */
1.1 msaitoh 1906: sendmp = rbuf->fmp;
1907: if (sendmp != NULL) { /* secondary frag */
1908: rbuf->buf = rbuf->fmp = NULL;
1909: mp->m_flags &= ~M_PKTHDR;
1910: sendmp->m_pkthdr.len += mp->m_len;
1911: } else {
1912: /*
1913: * Optimize. This might be a small packet,
1914: * maybe just a TCP ACK. Do a fast copy that
1915: * is cache aligned into a new mbuf, and
1916: * leave the old mbuf+cluster for re-use.
1917: */
1918: if (eop && len <= IXGBE_RX_COPY_LEN) {
1919: sendmp = m_gethdr(M_NOWAIT, MT_DATA);
1920: if (sendmp != NULL) {
1.28 msaitoh 1921: sendmp->m_data += IXGBE_RX_COPY_ALIGN;
1922: ixgbe_bcopy(mp->m_data, sendmp->m_data,
1923: len);
1.1 msaitoh 1924: sendmp->m_len = len;
1925: rxr->rx_copies.ev_count++;
1926: rbuf->flags |= IXGBE_RX_COPY;
1927: }
1928: }
1929: if (sendmp == NULL) {
1930: rbuf->buf = rbuf->fmp = NULL;
1931: sendmp = mp;
1932: }
1933:
1934: /* first desc of a non-ps chain */
1935: sendmp->m_flags |= M_PKTHDR;
1936: sendmp->m_pkthdr.len = mp->m_len;
1937: }
1938: ++processed;
1939:
1940: /* Pass the head pointer on */
1941: if (eop == 0) {
1942: nbuf->fmp = sendmp;
1943: sendmp = NULL;
1944: mp->m_next = nbuf->buf;
1945: } else { /* Sending this frame */
1946: m_set_rcvif(sendmp, ifp);
1.31 msaitoh 1947: ++rxr->packets;
1.1 msaitoh 1948: rxr->rx_packets.ev_count++;
1949: /* capture data for AIM */
1950: rxr->bytes += sendmp->m_pkthdr.len;
1951: rxr->rx_bytes.ev_count += sendmp->m_pkthdr.len;
1952: /* Process vlan info */
1.28 msaitoh 1953: if ((rxr->vtag_strip) && (staterr & IXGBE_RXD_STAT_VP))
1.1 msaitoh 1954: vtag = le16toh(cur->wb.upper.vlan);
1955: if (vtag) {
1.29 knakahar 1956: vlan_set_tag(sendmp, vtag);
1.1 msaitoh 1957: }
1958: if ((ifp->if_capenable & IFCAP_RXCSUM) != 0) {
1959: ixgbe_rx_checksum(staterr, sendmp, ptype,
1.3 msaitoh 1960: &adapter->stats.pf);
1.1 msaitoh 1961: }
1.8 msaitoh 1962:
1.6 msaitoh 1963: #if 0 /* FreeBSD */
1.28 msaitoh 1964: /*
1965: * In case of multiqueue, we have RXCSUM.PCSD bit set
1966: * and never cleared. This means we have RSS hash
1967: * available to be used.
1968: */
1969: if (adapter->num_queues > 1) {
1970: sendmp->m_pkthdr.flowid =
1971: le32toh(cur->wb.lower.hi_dword.rss);
1972: switch (pkt_info & IXGBE_RXDADV_RSSTYPE_MASK) {
1973: case IXGBE_RXDADV_RSSTYPE_IPV4:
1974: M_HASHTYPE_SET(sendmp,
1975: M_HASHTYPE_RSS_IPV4);
1976: break;
1977: case IXGBE_RXDADV_RSSTYPE_IPV4_TCP:
1978: M_HASHTYPE_SET(sendmp,
1979: M_HASHTYPE_RSS_TCP_IPV4);
1980: break;
1981: case IXGBE_RXDADV_RSSTYPE_IPV6:
1982: M_HASHTYPE_SET(sendmp,
1983: M_HASHTYPE_RSS_IPV6);
1984: break;
1985: case IXGBE_RXDADV_RSSTYPE_IPV6_TCP:
1986: M_HASHTYPE_SET(sendmp,
1987: M_HASHTYPE_RSS_TCP_IPV6);
1988: break;
1989: case IXGBE_RXDADV_RSSTYPE_IPV6_EX:
1990: M_HASHTYPE_SET(sendmp,
1991: M_HASHTYPE_RSS_IPV6_EX);
1992: break;
1993: case IXGBE_RXDADV_RSSTYPE_IPV6_TCP_EX:
1994: M_HASHTYPE_SET(sendmp,
1995: M_HASHTYPE_RSS_TCP_IPV6_EX);
1996: break;
1.6 msaitoh 1997: #if __FreeBSD_version > 1100000
1.28 msaitoh 1998: case IXGBE_RXDADV_RSSTYPE_IPV4_UDP:
1999: M_HASHTYPE_SET(sendmp,
2000: M_HASHTYPE_RSS_UDP_IPV4);
2001: break;
2002: case IXGBE_RXDADV_RSSTYPE_IPV6_UDP:
2003: M_HASHTYPE_SET(sendmp,
2004: M_HASHTYPE_RSS_UDP_IPV6);
2005: break;
2006: case IXGBE_RXDADV_RSSTYPE_IPV6_UDP_EX:
2007: M_HASHTYPE_SET(sendmp,
2008: M_HASHTYPE_RSS_UDP_IPV6_EX);
2009: break;
2010: #endif
2011: default:
2012: M_HASHTYPE_SET(sendmp,
2013: M_HASHTYPE_OPAQUE_HASH);
2014: }
2015: } else {
2016: sendmp->m_pkthdr.flowid = que->msix;
1.1 msaitoh 2017: M_HASHTYPE_SET(sendmp, M_HASHTYPE_OPAQUE);
2018: }
1.8 msaitoh 2019: #endif
1.1 msaitoh 2020: }
2021: next_desc:
2022: ixgbe_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map,
2023: BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
2024:
2025: /* Advance our pointers to the next descriptor. */
2026: if (++i == rxr->num_desc)
2027: i = 0;
2028:
2029: /* Now send to the stack or do LRO */
2030: if (sendmp != NULL) {
2031: rxr->next_to_check = i;
1.28 msaitoh 2032: IXGBE_RX_UNLOCK(rxr);
1.1 msaitoh 2033: ixgbe_rx_input(rxr, ifp, sendmp, ptype);
1.28 msaitoh 2034: IXGBE_RX_LOCK(rxr);
1.1 msaitoh 2035: i = rxr->next_to_check;
2036: }
2037:
1.28 msaitoh 2038: /* Every 8 descriptors we go to refresh mbufs */
1.1 msaitoh 2039: if (processed == 8) {
2040: ixgbe_refresh_mbufs(rxr, i);
2041: processed = 0;
2042: }
2043: }
2044:
2045: /* Refresh any remaining buf structs */
2046: if (ixgbe_rx_unrefreshed(rxr))
2047: ixgbe_refresh_mbufs(rxr, i);
2048:
2049: rxr->next_to_check = i;
2050:
1.28 msaitoh 2051: IXGBE_RX_UNLOCK(rxr);
2052:
1.1 msaitoh 2053: #ifdef LRO
2054: /*
2055: * Flush any outstanding LRO work
2056: */
1.10 msaitoh 2057: tcp_lro_flush_all(lro);
1.1 msaitoh 2058: #endif /* LRO */
2059:
2060: /*
1.28 msaitoh 2061: * Still have cleaning to do?
2062: */
1.1 msaitoh 2063: if ((staterr & IXGBE_RXD_STAT_DD) != 0)
1.28 msaitoh 2064: return (TRUE);
2065:
2066: return (FALSE);
2067: } /* ixgbe_rxeof */
1.1 msaitoh 2068:
2069:
1.28 msaitoh 2070: /************************************************************************
2071: * ixgbe_rx_checksum
1.1 msaitoh 2072: *
1.28 msaitoh 2073: * Verify that the hardware indicated that the checksum is valid.
2074: * Inform the stack about the status of checksum so that stack
2075: * doesn't spend time verifying the checksum.
2076: ************************************************************************/
1.1 msaitoh 2077: static void
2078: ixgbe_rx_checksum(u32 staterr, struct mbuf * mp, u32 ptype,
2079: struct ixgbe_hw_stats *stats)
2080: {
1.28 msaitoh 2081: u16 status = (u16)staterr;
2082: u8 errors = (u8)(staterr >> 24);
1.1 msaitoh 2083: #if 0
1.28 msaitoh 2084: bool sctp = false;
1.1 msaitoh 2085:
2086: if ((ptype & IXGBE_RXDADV_PKTTYPE_ETQF) == 0 &&
2087: (ptype & IXGBE_RXDADV_PKTTYPE_SCTP) != 0)
1.8 msaitoh 2088: sctp = true;
1.1 msaitoh 2089: #endif
2090:
1.8 msaitoh 2091: /* IPv4 checksum */
1.1 msaitoh 2092: if (status & IXGBE_RXD_STAT_IPCS) {
2093: stats->ipcs.ev_count++;
2094: if (!(errors & IXGBE_RXD_ERR_IPE)) {
2095: /* IP Checksum Good */
2096: mp->m_pkthdr.csum_flags = M_CSUM_IPv4;
2097: } else {
2098: stats->ipcs_bad.ev_count++;
2099: mp->m_pkthdr.csum_flags = M_CSUM_IPv4|M_CSUM_IPv4_BAD;
2100: }
2101: }
1.8 msaitoh 2102: /* TCP/UDP/SCTP checksum */
1.1 msaitoh 2103: if (status & IXGBE_RXD_STAT_L4CS) {
2104: stats->l4cs.ev_count++;
2105: int type = M_CSUM_TCPv4|M_CSUM_TCPv6|M_CSUM_UDPv4|M_CSUM_UDPv6;
2106: if (!(errors & IXGBE_RXD_ERR_TCPE)) {
2107: mp->m_pkthdr.csum_flags |= type;
2108: } else {
2109: stats->l4cs_bad.ev_count++;
2110: mp->m_pkthdr.csum_flags |= type | M_CSUM_TCP_UDP_BAD;
2111: }
2112: }
1.28 msaitoh 2113: } /* ixgbe_rx_checksum */
1.1 msaitoh 2114:
1.28 msaitoh 2115: /************************************************************************
2116: * ixgbe_dma_malloc
2117: ************************************************************************/
1.1 msaitoh 2118: int
2119: ixgbe_dma_malloc(struct adapter *adapter, const bus_size_t size,
2120: struct ixgbe_dma_alloc *dma, const int mapflags)
2121: {
2122: device_t dev = adapter->dev;
1.28 msaitoh 2123: int r, rsegs;
1.1 msaitoh 2124:
1.28 msaitoh 2125: r = ixgbe_dma_tag_create(
2126: /* parent */ adapter->osdep.dmat,
2127: /* alignment */ DBA_ALIGN,
2128: /* bounds */ 0,
2129: /* maxsize */ size,
2130: /* nsegments */ 1,
2131: /* maxsegsize */ size,
2132: /* flags */ BUS_DMA_ALLOCNOW,
1.1 msaitoh 2133: &dma->dma_tag);
2134: if (r != 0) {
2135: aprint_error_dev(dev,
2136: "%s: ixgbe_dma_tag_create failed; error %d\n", __func__, r);
2137: goto fail_0;
2138: }
2139:
1.28 msaitoh 2140: r = bus_dmamem_alloc(dma->dma_tag->dt_dmat, size,
2141: dma->dma_tag->dt_alignment, dma->dma_tag->dt_boundary,
2142: &dma->dma_seg, 1, &rsegs, BUS_DMA_NOWAIT);
1.1 msaitoh 2143: if (r != 0) {
2144: aprint_error_dev(dev,
2145: "%s: bus_dmamem_alloc failed; error %d\n", __func__, r);
2146: goto fail_1;
2147: }
2148:
2149: r = bus_dmamem_map(dma->dma_tag->dt_dmat, &dma->dma_seg, rsegs,
2150: size, &dma->dma_vaddr, BUS_DMA_NOWAIT);
2151: if (r != 0) {
2152: aprint_error_dev(dev, "%s: bus_dmamem_map failed; error %d\n",
2153: __func__, r);
2154: goto fail_2;
2155: }
2156:
2157: r = ixgbe_dmamap_create(dma->dma_tag, 0, &dma->dma_map);
2158: if (r != 0) {
2159: aprint_error_dev(dev, "%s: bus_dmamem_map failed; error %d\n",
2160: __func__, r);
2161: goto fail_3;
2162: }
2163:
1.28 msaitoh 2164: r = bus_dmamap_load(dma->dma_tag->dt_dmat, dma->dma_map,
2165: dma->dma_vaddr, size, NULL, mapflags | BUS_DMA_NOWAIT);
1.1 msaitoh 2166: if (r != 0) {
2167: aprint_error_dev(dev, "%s: bus_dmamap_load failed; error %d\n",
2168: __func__, r);
2169: goto fail_4;
2170: }
2171: dma->dma_paddr = dma->dma_map->dm_segs[0].ds_addr;
2172: dma->dma_size = size;
2173: return 0;
2174: fail_4:
2175: ixgbe_dmamap_destroy(dma->dma_tag, dma->dma_map);
2176: fail_3:
2177: bus_dmamem_unmap(dma->dma_tag->dt_dmat, dma->dma_vaddr, size);
2178: fail_2:
2179: bus_dmamem_free(dma->dma_tag->dt_dmat, &dma->dma_seg, rsegs);
2180: fail_1:
2181: ixgbe_dma_tag_destroy(dma->dma_tag);
2182: fail_0:
2183:
1.28 msaitoh 2184: return (r);
2185: } /* ixgbe_dma_malloc */
2186:
2187: /************************************************************************
2188: * ixgbe_dma_free
2189: ************************************************************************/
1.3 msaitoh 2190: void
1.1 msaitoh 2191: ixgbe_dma_free(struct adapter *adapter, struct ixgbe_dma_alloc *dma)
2192: {
2193: bus_dmamap_sync(dma->dma_tag->dt_dmat, dma->dma_map, 0, dma->dma_size,
2194: BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
2195: ixgbe_dmamap_unload(dma->dma_tag, dma->dma_map);
2196: bus_dmamem_free(dma->dma_tag->dt_dmat, &dma->dma_seg, 1);
2197: ixgbe_dma_tag_destroy(dma->dma_tag);
1.28 msaitoh 2198: } /* ixgbe_dma_free */
1.1 msaitoh 2199:
2200:
1.28 msaitoh 2201: /************************************************************************
2202: * ixgbe_allocate_queues
1.1 msaitoh 2203: *
1.28 msaitoh 2204: * Allocate memory for the transmit and receive rings, and then
2205: * the descriptors associated with each, called only once at attach.
2206: ************************************************************************/
1.1 msaitoh 2207: int
2208: ixgbe_allocate_queues(struct adapter *adapter)
2209: {
2210: device_t dev = adapter->dev;
2211: struct ix_queue *que;
2212: struct tx_ring *txr;
2213: struct rx_ring *rxr;
1.28 msaitoh 2214: int rsize, tsize, error = IXGBE_SUCCESS;
2215: int txconf = 0, rxconf = 0;
1.1 msaitoh 2216:
1.28 msaitoh 2217: /* First, allocate the top level queue structs */
2218: adapter->queues = (struct ix_queue *)malloc(sizeof(struct ix_queue) *
2219: adapter->num_queues, M_DEVBUF, M_NOWAIT | M_ZERO);
2220: if (adapter->queues == NULL) {
2221: aprint_error_dev(dev, "Unable to allocate queue memory\n");
1.1 msaitoh 2222: error = ENOMEM;
2223: goto fail;
2224: }
2225:
1.28 msaitoh 2226: /* Second, allocate the TX ring struct memory */
2227: adapter->tx_rings = (struct tx_ring *)malloc(sizeof(struct tx_ring) *
2228: adapter->num_queues, M_DEVBUF, M_NOWAIT | M_ZERO);
2229: if (adapter->tx_rings == NULL) {
1.1 msaitoh 2230: aprint_error_dev(dev, "Unable to allocate TX ring memory\n");
2231: error = ENOMEM;
2232: goto tx_fail;
2233: }
2234:
1.28 msaitoh 2235: /* Third, allocate the RX ring */
2236: adapter->rx_rings = (struct rx_ring *)malloc(sizeof(struct rx_ring) *
2237: adapter->num_queues, M_DEVBUF, M_NOWAIT | M_ZERO);
2238: if (adapter->rx_rings == NULL) {
1.1 msaitoh 2239: aprint_error_dev(dev, "Unable to allocate RX ring memory\n");
2240: error = ENOMEM;
2241: goto rx_fail;
2242: }
2243:
2244: /* For the ring itself */
1.28 msaitoh 2245: tsize = roundup2(adapter->num_tx_desc * sizeof(union ixgbe_adv_tx_desc),
2246: DBA_ALIGN);
1.1 msaitoh 2247:
2248: /*
2249: * Now set up the TX queues, txconf is needed to handle the
2250: * possibility that things fail midcourse and we need to
2251: * undo memory gracefully
1.28 msaitoh 2252: */
1.1 msaitoh 2253: for (int i = 0; i < adapter->num_queues; i++, txconf++) {
2254: /* Set up some basics */
2255: txr = &adapter->tx_rings[i];
2256: txr->adapter = adapter;
1.28 msaitoh 2257: txr->txr_interq = NULL;
2258: /* In case SR-IOV is enabled, align the index properly */
1.5 msaitoh 2259: #ifdef PCI_IOV
1.28 msaitoh 2260: txr->me = ixgbe_vf_que_index(adapter->iov_mode, adapter->pool,
2261: i);
1.5 msaitoh 2262: #else
1.1 msaitoh 2263: txr->me = i;
1.5 msaitoh 2264: #endif
1.1 msaitoh 2265: txr->num_desc = adapter->num_tx_desc;
2266:
2267: /* Initialize the TX side lock */
2268: mutex_init(&txr->tx_mtx, MUTEX_DEFAULT, IPL_NET);
2269:
1.28 msaitoh 2270: if (ixgbe_dma_malloc(adapter, tsize, &txr->txdma,
2271: BUS_DMA_NOWAIT)) {
1.1 msaitoh 2272: aprint_error_dev(dev,
2273: "Unable to allocate TX Descriptor memory\n");
2274: error = ENOMEM;
2275: goto err_tx_desc;
2276: }
2277: txr->tx_base = (union ixgbe_adv_tx_desc *)txr->txdma.dma_vaddr;
2278: bzero((void *)txr->tx_base, tsize);
2279:
1.28 msaitoh 2280: /* Now allocate transmit buffers for the ring */
2281: if (ixgbe_allocate_transmit_buffers(txr)) {
1.1 msaitoh 2282: aprint_error_dev(dev,
2283: "Critical Failure setting up transmit buffers\n");
2284: error = ENOMEM;
2285: goto err_tx_desc;
2286: }
1.28 msaitoh 2287: if (!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX)) {
2288: /* Allocate a buf ring */
2289: txr->txr_interq = pcq_create(IXGBE_BR_SIZE, KM_SLEEP);
2290: if (txr->txr_interq == NULL) {
2291: aprint_error_dev(dev,
2292: "Critical Failure setting up buf ring\n");
2293: error = ENOMEM;
2294: goto err_tx_desc;
2295: }
2296: }
1.1 msaitoh 2297: }
2298:
2299: /*
2300: * Next the RX queues...
2301: */
1.28 msaitoh 2302: rsize = roundup2(adapter->num_rx_desc * sizeof(union ixgbe_adv_rx_desc),
2303: DBA_ALIGN);
1.1 msaitoh 2304: for (int i = 0; i < adapter->num_queues; i++, rxconf++) {
2305: rxr = &adapter->rx_rings[i];
2306: /* Set up some basics */
2307: rxr->adapter = adapter;
1.5 msaitoh 2308: #ifdef PCI_IOV
1.28 msaitoh 2309: /* In case SR-IOV is enabled, align the index properly */
2310: rxr->me = ixgbe_vf_que_index(adapter->iov_mode, adapter->pool,
2311: i);
1.5 msaitoh 2312: #else
1.1 msaitoh 2313: rxr->me = i;
1.5 msaitoh 2314: #endif
1.1 msaitoh 2315: rxr->num_desc = adapter->num_rx_desc;
2316:
2317: /* Initialize the RX side lock */
2318: mutex_init(&rxr->rx_mtx, MUTEX_DEFAULT, IPL_NET);
2319:
1.28 msaitoh 2320: if (ixgbe_dma_malloc(adapter, rsize, &rxr->rxdma,
2321: BUS_DMA_NOWAIT)) {
1.1 msaitoh 2322: aprint_error_dev(dev,
2323: "Unable to allocate RxDescriptor memory\n");
2324: error = ENOMEM;
2325: goto err_rx_desc;
2326: }
2327: rxr->rx_base = (union ixgbe_adv_rx_desc *)rxr->rxdma.dma_vaddr;
2328: bzero((void *)rxr->rx_base, rsize);
2329:
1.28 msaitoh 2330: /* Allocate receive buffers for the ring */
1.1 msaitoh 2331: if (ixgbe_allocate_receive_buffers(rxr)) {
2332: aprint_error_dev(dev,
2333: "Critical Failure setting up receive buffers\n");
2334: error = ENOMEM;
2335: goto err_rx_desc;
2336: }
2337: }
2338:
2339: /*
1.28 msaitoh 2340: * Finally set up the queue holding structs
2341: */
1.1 msaitoh 2342: for (int i = 0; i < adapter->num_queues; i++) {
2343: que = &adapter->queues[i];
2344: que->adapter = adapter;
1.3 msaitoh 2345: que->me = i;
1.1 msaitoh 2346: que->txr = &adapter->tx_rings[i];
2347: que->rxr = &adapter->rx_rings[i];
1.33 knakahar 2348:
1.37 knakahar 2349: mutex_init(&que->dc_mtx, MUTEX_DEFAULT, IPL_NET);
2350: que->disabled_count = 0;
1.1 msaitoh 2351: }
2352:
2353: return (0);
2354:
2355: err_rx_desc:
2356: for (rxr = adapter->rx_rings; rxconf > 0; rxr++, rxconf--)
2357: ixgbe_dma_free(adapter, &rxr->rxdma);
2358: err_tx_desc:
2359: for (txr = adapter->tx_rings; txconf > 0; txr++, txconf--)
2360: ixgbe_dma_free(adapter, &txr->txdma);
2361: free(adapter->rx_rings, M_DEVBUF);
2362: rx_fail:
2363: free(adapter->tx_rings, M_DEVBUF);
2364: tx_fail:
2365: free(adapter->queues, M_DEVBUF);
2366: fail:
2367: return (error);
1.28 msaitoh 2368: } /* ixgbe_allocate_queues */
CVSweb <webmaster@jp.NetBSD.org>