Module Name: src Committed By: jmcneill Date: Fri Nov 30 14:07:30 UTC 2018
Modified Files: src/sys/dev/pci: if_ena.c if_enavar.h Log Message: Get this driver into a functional state. To generate a diff of this commit: cvs rdiff -u -r1.10 -r1.11 src/sys/dev/pci/if_ena.c cvs rdiff -u -r1.5 -r1.6 src/sys/dev/pci/if_enavar.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/if_ena.c diff -u src/sys/dev/pci/if_ena.c:1.10 src/sys/dev/pci/if_ena.c:1.11 --- src/sys/dev/pci/if_ena.c:1.10 Fri Nov 30 11:37:11 2018 +++ src/sys/dev/pci/if_ena.c Fri Nov 30 14:07:30 2018 @@ -31,7 +31,7 @@ #if 0 __FBSDID("$FreeBSD: head/sys/dev/ena/ena.c 333456 2018-05-10 09:37:54Z mw $"); #endif -__KERNEL_RCSID(0, "$NetBSD: if_ena.c,v 1.10 2018/11/30 11:37:11 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ena.c,v 1.11 2018/11/30 14:07:30 jmcneill Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -1670,9 +1670,7 @@ ena_rx_cleanup(struct ena_ring *rx_ring) uint16_t next_to_clean; uint32_t refill_required; uint32_t refill_threshold; -#ifdef LRO uint32_t do_if_input = 0; -#endif unsigned int qid; int rc, i; int budget = RX_BUDGET; @@ -1735,12 +1733,12 @@ ena_rx_cleanup(struct ena_ring *rx_ring) counter_u64_add_protected(adapter->hw_stats.rx_bytes, mbuf->m_pkthdr.len); counter_exit(); -#ifdef LRO /* * LRO is only for IP/TCP packets and TCP checksum of the packet * should be computed by hardware. */ do_if_input = 1; +#ifdef LRO if (((ifp->if_capenable & IFCAP_LRO) != 0) && ((mbuf->m_pkthdr.csum_flags & CSUM_IP_VALID) != 0) && (ena_rx_ctx.l4_proto == ENA_ETH_IO_L4_PROTO_TCP)) { @@ -1754,12 +1752,12 @@ ena_rx_cleanup(struct ena_ring *rx_ring) (tcp_lro_rx(&rx_ring->lro, mbuf, 0) == 0)) do_if_input = 0; } +#endif if (do_if_input != 0) { ena_trace(ENA_DBG | ENA_RXPTH, "calling if_input() with mbuf %p", mbuf); - (*ifp->if_input)(ifp, mbuf); + if_percpuq_enqueue(ifp->if_percpuq, mbuf); } -#endif counter_enter(); counter_u64_add_protected(rx_ring->rx_stats.cnt, 1); @@ -2500,7 +2498,7 @@ ena_setup_ifnet(device_t pdev, struct en ena_trace(ENA_ALERT, "can not allocate ifnet structure\n"); return (ENXIO); } - if_initname(ifp, device_xname(pdev), device_unit(pdev)); + if_initname(ifp, "ena", device_unit(pdev)); if_setdev(ifp, pdev); if_setsoftc(ifp, adapter); Index: src/sys/dev/pci/if_enavar.h diff -u src/sys/dev/pci/if_enavar.h:1.5 src/sys/dev/pci/if_enavar.h:1.6 --- src/sys/dev/pci/if_enavar.h:1.5 Wed Nov 28 19:06:54 2018 +++ src/sys/dev/pci/if_enavar.h Fri Nov 30 14:07:30 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: if_enavar.h,v 1.5 2018/11/28 19:06:54 jmcneill Exp $ */ +/* $NetBSD: if_enavar.h,v 1.6 2018/11/30 14:07:30 jmcneill Exp $ */ /*- * BSD LICENSE @@ -273,6 +273,7 @@ struct ena_ring { struct workqueue *cmpl_tq; }; }; + u_int task_pending; union { struct ena_stats_tx tx_stats; @@ -472,16 +473,71 @@ getsbinuptime(void) */ #define buf_ring_alloc(a, b, c, d) (void *)&a #define drbr_free(ifp, b) do { } while (0) -#define drbr_flush(ifp, b) do { } while (0) -#define drbr_advance(ifp, b) do { } while (0) +#define drbr_flush(ifp, b) IFQ_PURGE(&(ifp)->if_snd) +#define drbr_advance(ifp, b) \ + ({ \ + struct mbuf *__m; \ + IFQ_DEQUEUE(&(ifp)->if_snd, __m); \ + __m; \ + }) #define drbr_putback(ifp, b, m) do { } while (0) -#define drbr_empty(ifp, b) false -#define drbr_peek(ifp, b) NULL -#define drbr_enqueue(ifp, b, m) 0 +#define drbr_empty(ifp, b) IFQ_IS_EMPTY(&(ifp)->if_snd) +#define drbr_peek(ifp, b) \ + ({ \ + struct mbuf *__m; \ + IFQ_POLL(&(ifp)->if_snd, __m); \ + __m; \ + }) +#define drbr_enqueue(ifp, b, m) \ + ({ \ + int __err; \ + IFQ_ENQUEUE(&(ifp)->if_snd, m, __err); \ + __err; \ + }) #define m_getjcl(a, b, c, d) NULL #define MJUM16BYTES MCLBYTES -#define m_append(m, len, cp) 0 -#define m_collapse(m, how, maxfrags) NULL +#define m_append(m, len, cp) ena_m_append(m, len, cp) +#define m_collapse(m, how, maxfrags) m_defrag(m, how) /* XXX */ /* XXX XXX XXX */ +static inline int +ena_m_append(struct mbuf *m0, int len, const void *cpv) +{ + struct mbuf *m, *n; + int remainder, space; + const char *cp = cpv; + + KASSERT(len != M_COPYALL); + for (m = m0; m->m_next != NULL; m = m->m_next) + continue; + remainder = len; + space = M_TRAILINGSPACE(m); + if (space > 0) { + /* + * Copy into available space. + */ + if (space > remainder) + space = remainder; + memmove(mtod(m, char *) + m->m_len, cp, space); + m->m_len += space; + cp = cp + space, remainder -= space; + } + while (remainder > 0) { + /* + * Allocate a new mbuf; could check space + * and allocate a cluster instead. + */ + n = m_get(M_DONTWAIT, m->m_type); + if (n == NULL) + break; + n->m_len = uimin(MLEN, remainder); + memmove(mtod(n, void *), cp, n->m_len); + cp += n->m_len, remainder -= n->m_len; + m->m_next = n; + m = n; + } + if (m0->m_flags & M_PKTHDR) + m0->m_pkthdr.len += len - remainder; + return (remainder == 0); +} #endif /* !(ENA_H) */