1/******************************************************************************
2
3  Copyright (c) 2001-2011, Intel Corporation
4  All rights reserved.
5
6  Redistribution and use in source and binary forms, with or without
7  modification, are permitted provided that the following conditions are met:
8
9   1. Redistributions of source code must retain the above copyright notice,
10      this list of conditions and the following disclaimer.
11
12   2. Redistributions in binary form must reproduce the above copyright
13      notice, this list of conditions and the following disclaimer in the
14      documentation and/or other materials provided with the distribution.
15
16   3. Neither the name of the Intel Corporation nor the names of its
17      contributors may be used to endorse or promote products derived from
18      this software without specific prior written permission.
19
20  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30  POSSIBILITY OF SUCH DAMAGE.
31
32******************************************************************************/
33/*
34 * Copyright (c) 2011 The NetBSD Foundation, Inc.
35 * All rights reserved.
36 *
37 * This code is derived from software contributed to The NetBSD Foundation
38 * by Coyote Point Systems, Inc.
39 *
40 * Redistribution and use in source and binary forms, with or without
41 * modification, are permitted provided that the following conditions
42 * are met:
43 * 1. Redistributions of source code must retain the above copyright
44 *    notice, this list of conditions and the following disclaimer.
45 * 2. Redistributions in binary form must reproduce the above copyright
46 *    notice, this list of conditions and the following disclaimer in the
47 *    documentation and/or other materials provided with the distribution.
48 *
49 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
50 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
51 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
52 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
53 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
54 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
55 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
56 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
57 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
58 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
59 * POSSIBILITY OF SUCH DAMAGE.
60 */
61/*$FreeBSD: src/sys/dev/ixgbe/ixgbe.c,v 1.51 2011/04/25 23:34:21 jfv Exp $*/
62/*$NetBSD: ixgbe.c,v 1.1 2011/08/12 21:55:29 dyoung Exp $*/
63
64#include "opt_inet.h"
65
66#include "ixgbe.h"
67
68/*********************************************************************
69 *  Set this to one to display debug statistics
70 *********************************************************************/
71int             ixgbe_display_debug_stats = 0;
72
73/*********************************************************************
74 *  Driver version
75 *********************************************************************/
76char ixgbe_driver_version[] = "2.3.10";
77
78/*********************************************************************
79 *  PCI Device ID Table
80 *
81 *  Used by probe to select devices to load on
82 *  Last field stores an index into ixgbe_strings
83 *  Last entry must be all 0s
84 *
85 *  { Vendor ID, Device ID, SubVendor ID, SubDevice ID, String Index }
86 *********************************************************************/
87
88static ixgbe_vendor_info_t ixgbe_vendor_info_array[] =
89{
90	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AF_DUAL_PORT, 0, 0, 0},
91	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AF_SINGLE_PORT, 0, 0, 0},
92	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598EB_CX4, 0, 0, 0},
93	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AT, 0, 0, 0},
94	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AT2, 0, 0, 0},
95	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598, 0, 0, 0},
96	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598_DA_DUAL_PORT, 0, 0, 0},
97	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598_CX4_DUAL_PORT, 0, 0, 0},
98	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598EB_XF_LR, 0, 0, 0},
99	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM, 0, 0, 0},
100	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598EB_SFP_LOM, 0, 0, 0},
101	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_KX4, 0, 0, 0},
102	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_KX4_MEZZ, 0, 0, 0},
103	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP, 0, 0, 0},
104	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_XAUI_LOM, 0, 0, 0},
105	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_CX4, 0, 0, 0},
106	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_T3_LOM, 0, 0, 0},
107	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_COMBO_BACKPLANE, 0, 0, 0},
108	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_BACKPLANE_FCOE, 0, 0, 0},
109	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP_FCOE, 0, 0, 0},
110	/* required last entry */
111	{0, 0, 0, 0, 0}
112};
113
114/*********************************************************************
115 *  Table of branding strings
116 *********************************************************************/
117
118static const char    *ixgbe_strings[] = {
119	"Intel(R) PRO/10GbE PCI-Express Network Driver"
120};
121
122/*********************************************************************
123 *  Function prototypes
124 *********************************************************************/
125static int      ixgbe_probe(device_t, cfdata_t, void *);
126static void     ixgbe_attach(device_t, device_t, void *);
127static int      ixgbe_detach(device_t, int);
128#if 0
129static int      ixgbe_shutdown(device_t);
130#endif
131static void     ixgbe_start(struct ifnet *);
132static void     ixgbe_start_locked(struct tx_ring *, struct ifnet *);
133#if __FreeBSD_version >= 800000
134static int	ixgbe_mq_start(struct ifnet *, struct mbuf *);
135static int	ixgbe_mq_start_locked(struct ifnet *,
136                    struct tx_ring *, struct mbuf *);
137static void	ixgbe_qflush(struct ifnet *);
138#endif
139static int      ixgbe_ioctl(struct ifnet *, u_long, void *);
140static void	ixgbe_ifstop(struct ifnet *, int);
141static int	ixgbe_init(struct ifnet *);
142static void	ixgbe_init_locked(struct adapter *);
143static void     ixgbe_stop(void *);
144static void     ixgbe_media_status(struct ifnet *, struct ifmediareq *);
145static int      ixgbe_media_change(struct ifnet *);
146static void     ixgbe_identify_hardware(struct adapter *);
147static int      ixgbe_allocate_pci_resources(struct adapter *,
148		    const struct pci_attach_args *);
149static int      ixgbe_allocate_msix(struct adapter *,
150		    const struct pci_attach_args *);
151static int      ixgbe_allocate_legacy(struct adapter *,
152		    const struct pci_attach_args *);
153static int	ixgbe_allocate_queues(struct adapter *);
154static int	ixgbe_setup_msix(struct adapter *);
155static void	ixgbe_free_pci_resources(struct adapter *);
156static void	ixgbe_local_timer(void *);
157static int	ixgbe_setup_interface(device_t, struct adapter *);
158static void	ixgbe_config_link(struct adapter *);
159
160static int      ixgbe_allocate_transmit_buffers(struct tx_ring *);
161static int	ixgbe_setup_transmit_structures(struct adapter *);
162static void	ixgbe_setup_transmit_ring(struct tx_ring *);
163static void     ixgbe_initialize_transmit_units(struct adapter *);
164static void     ixgbe_free_transmit_structures(struct adapter *);
165static void     ixgbe_free_transmit_buffers(struct tx_ring *);
166
167static int      ixgbe_allocate_receive_buffers(struct rx_ring *);
168static int      ixgbe_setup_receive_structures(struct adapter *);
169static int	ixgbe_setup_receive_ring(struct rx_ring *);
170static void     ixgbe_initialize_receive_units(struct adapter *);
171static void     ixgbe_free_receive_structures(struct adapter *);
172static void     ixgbe_free_receive_buffers(struct rx_ring *);
173static void	ixgbe_setup_hw_rsc(struct rx_ring *);
174
175static void     ixgbe_enable_intr(struct adapter *);
176static void     ixgbe_disable_intr(struct adapter *);
177static void     ixgbe_update_stats_counters(struct adapter *);
178static bool	ixgbe_txeof(struct tx_ring *);
179static bool	ixgbe_rxeof(struct ix_queue *, int);
180static void	ixgbe_rx_checksum(u32, struct mbuf *, u32,
181		    struct ixgbe_hw_stats *);
182static void     ixgbe_set_promisc(struct adapter *);
183static void     ixgbe_set_multi(struct adapter *);
184static void     ixgbe_update_link_status(struct adapter *);
185static void	ixgbe_refresh_mbufs(struct rx_ring *, int);
186static int      ixgbe_xmit(struct tx_ring *, struct mbuf *);
187static int	ixgbe_set_flowcntl(SYSCTLFN_PROTO);
188static int	ixgbe_set_advertise(SYSCTLFN_PROTO);
189static int	ixgbe_dma_malloc(struct adapter *, bus_size_t,
190		    struct ixgbe_dma_alloc *, int);
191static void     ixgbe_dma_free(struct adapter *, struct ixgbe_dma_alloc *);
192static void	ixgbe_add_rx_process_limit(struct adapter *, const char *,
193		    const char *, int *, int);
194static u32	ixgbe_tx_ctx_setup(struct tx_ring *, struct mbuf *);
195static bool	ixgbe_tso_setup(struct tx_ring *, struct mbuf *, u32 *);
196static void	ixgbe_set_ivar(struct adapter *, u8, u8, s8);
197static void	ixgbe_configure_ivars(struct adapter *);
198static u8 *	ixgbe_mc_array_itr(struct ixgbe_hw *, u8 **, u32 *);
199
200static void	ixgbe_setup_vlan_hw_support(struct adapter *);
201#if 0
202static void	ixgbe_register_vlan(void *, struct ifnet *, u16);
203static void	ixgbe_unregister_vlan(void *, struct ifnet *, u16);
204#endif
205
206static void     ixgbe_add_hw_stats(struct adapter *adapter);
207
208static __inline void ixgbe_rx_discard(struct rx_ring *, int);
209static __inline void ixgbe_rx_input(struct rx_ring *, struct ifnet *,
210		    struct mbuf *, u32);
211
212/* Support for pluggable optic modules */
213static bool	ixgbe_sfp_probe(struct adapter *);
214static void	ixgbe_setup_optics(struct adapter *);
215
216/* Legacy (single vector interrupt handler */
217static int	ixgbe_legacy_irq(void *);
218
219#if defined(NETBSD_MSI_OR_MSIX)
220/* The MSI/X Interrupt handlers */
221static void	ixgbe_msix_que(void *);
222static void	ixgbe_msix_link(void *);
223#endif
224
225/* Software interrupts for deferred work */
226static void	ixgbe_handle_que(void *);
227static void	ixgbe_handle_link(void *);
228static void	ixgbe_handle_msf(void *);
229static void	ixgbe_handle_mod(void *);
230
231const struct sysctlnode *ixgbe_sysctl_instance(struct adapter *);
232static ixgbe_vendor_info_t *ixgbe_lookup(const struct pci_attach_args *);
233
234#ifdef IXGBE_FDIR
235static void	ixgbe_atr(struct tx_ring *, struct mbuf *);
236static void	ixgbe_reinit_fdir(void *, int);
237#endif
238
239/*********************************************************************
240 *  FreeBSD Device Interface Entry Points
241 *********************************************************************/
242
243CFATTACH_DECL3_NEW(ixg, sizeof(struct adapter),
244    ixgbe_probe, ixgbe_attach, ixgbe_detach, NULL, NULL, NULL,
245    DVF_DETACH_SHUTDOWN);
246
247#if 0
248devclass_t ixgbe_devclass;
249DRIVER_MODULE(ixgbe, pci, ixgbe_driver, ixgbe_devclass, 0, 0);
250
251MODULE_DEPEND(ixgbe, pci, 1, 1, 1);
252MODULE_DEPEND(ixgbe, ether, 1, 1, 1);
253#endif
254
255/*
256** TUNEABLE PARAMETERS:
257*/
258
259/*
260** AIM: Adaptive Interrupt Moderation
261** which means that the interrupt rate
262** is varied over time based on the
263** traffic for that interrupt vector
264*/
265static int ixgbe_enable_aim = TRUE;
266#define TUNABLE_INT(__x, __y)
267TUNABLE_INT("hw.ixgbe.enable_aim", &ixgbe_enable_aim);
268
269static int ixgbe_max_interrupt_rate = (8000000 / IXGBE_LOW_LATENCY);
270TUNABLE_INT("hw.ixgbe.max_interrupt_rate", &ixgbe_max_interrupt_rate);
271
272/* How many packets rxeof tries to clean at a time */
273static int ixgbe_rx_process_limit = 256;
274TUNABLE_INT("hw.ixgbe.rx_process_limit", &ixgbe_rx_process_limit);
275
276/* Flow control setting, default to full */
277static int ixgbe_flow_control = ixgbe_fc_full;
278TUNABLE_INT("hw.ixgbe.flow_control", &ixgbe_flow_control);
279
280/*
281** Smart speed setting, default to on
282** this only works as a compile option
283** right now as its during attach, set
284** this to 'ixgbe_smart_speed_off' to
285** disable.
286*/
287static int ixgbe_smart_speed = ixgbe_smart_speed_on;
288
289/*
290 * MSIX should be the default for best performance,
291 * but this allows it to be forced off for testing.
292 */
293static int ixgbe_enable_msix = 1;
294TUNABLE_INT("hw.ixgbe.enable_msix", &ixgbe_enable_msix);
295
296/*
297 * Header split: this causes the hardware to DMA
298 * the header into a separate mbuf from the payload,
299 * it can be a performance win in some workloads, but
300 * in others it actually hurts, its off by default.
301 */
302static bool ixgbe_header_split = FALSE;
303TUNABLE_INT("hw.ixgbe.hdr_split", &ixgbe_header_split);
304
305#if defined(NETBSD_MSI_OR_MSIX)
306/*
307 * Number of Queues, can be set to 0,
308 * it then autoconfigures based on the
309 * number of cpus with a max of 8. This
310 * can be overriden manually here.
311 */
312static int ixgbe_num_queues = 0;
313TUNABLE_INT("hw.ixgbe.num_queues", &ixgbe_num_queues);
314#endif
315
316/*
317** Number of TX descriptors per ring,
318** setting higher than RX as this seems
319** the better performing choice.
320*/
321static int ixgbe_txd = PERFORM_TXD;
322TUNABLE_INT("hw.ixgbe.txd", &ixgbe_txd);
323
324/* Number of RX descriptors per ring */
325static int ixgbe_rxd = PERFORM_RXD;
326TUNABLE_INT("hw.ixgbe.rxd", &ixgbe_rxd);
327
328/* Keep running tab on them for sanity check */
329static int ixgbe_total_ports;
330
331#ifdef IXGBE_FDIR
332/*
333** For Flow Director: this is the
334** number of TX packets we sample
335** for the filter pool, this means
336** every 20th packet will be probed.
337**
338** This feature can be disabled by
339** setting this to 0.
340*/
341static int atr_sample_rate = 20;
342/*
343** Flow Director actually 'steals'
344** part of the packet buffer as its
345** filter pool, this variable controls
346** how much it uses:
347**  0 = 64K, 1 = 128K, 2 = 256K
348*/
349static int fdir_pballoc = 1;
350#endif
351
352/*********************************************************************
353 *  Device identification routine
354 *
355 *  ixgbe_probe determines if the driver should be loaded on
356 *  adapter based on PCI vendor/device id of the adapter.
357 *
358 *  return 1 on success, 0 on failure
359 *********************************************************************/
360
361static int
362ixgbe_probe(device_t dev, cfdata_t cf, void *aux)
363{
364	const struct pci_attach_args *pa = aux;
365
366	return (ixgbe_lookup(pa) != NULL) ? 1 : 0;
367}
368
369static ixgbe_vendor_info_t *
370ixgbe_lookup(const struct pci_attach_args *pa)
371{
372	pcireg_t subid;
373	ixgbe_vendor_info_t *ent;
374
375	INIT_DEBUGOUT("ixgbe_probe: begin");
376
377	if (PCI_VENDOR(pa->pa_id) != IXGBE_INTEL_VENDOR_ID)
378		return NULL;
379
380	subid = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG);
381
382	for (ent = ixgbe_vendor_info_array; ent->vendor_id != 0; ent++) {
383		if (PCI_VENDOR(pa->pa_id) == ent->vendor_id &&
384		    PCI_PRODUCT(pa->pa_id) == ent->device_id &&
385
386		    (PCI_SUBSYS_VENDOR(subid) == ent->subvendor_id ||
387		     ent->subvendor_id == 0) &&
388
389		    (PCI_SUBSYS_ID(subid) == ent->subdevice_id ||
390		     ent->subdevice_id == 0)) {
391			++ixgbe_total_ports;
392			return ent;
393		}
394	}
395	return NULL;
396}
397
398
399static void
400ixgbe_sysctl_attach(struct adapter *adapter)
401{
402	struct sysctllog **log;
403	const struct sysctlnode *rnode, *cnode;
404	device_t dev;
405
406	dev = adapter->dev;
407	log = &adapter->sysctllog;
408
409	if ((rnode = ixgbe_sysctl_instance(adapter)) == NULL) {
410		aprint_error_dev(dev, "could not create sysctl root\n");
411		return;
412	}
413
414	if (sysctl_createv(log, 0, &rnode, &cnode,
415	    CTLFLAG_READONLY, CTLTYPE_INT,
416	    "num_rx_desc", SYSCTL_DESCR("Number of rx descriptors"),
417	    NULL, 0, &adapter->num_rx_desc, 0, CTL_CREATE, CTL_EOL) != 0)
418		aprint_error_dev(dev, "could not create sysctl\n");
419
420	if (sysctl_createv(log, 0, &rnode, &cnode,
421	    CTLFLAG_READONLY, CTLTYPE_INT,
422	    "num_queues", SYSCTL_DESCR("Number of queues"),
423	    NULL, 0, &adapter->num_queues, 0, CTL_CREATE, CTL_EOL) != 0)
424		aprint_error_dev(dev, "could not create sysctl\n");
425
426	if (sysctl_createv(log, 0, &rnode, &cnode,
427	    CTLFLAG_READWRITE, CTLTYPE_INT,
428	    "flow_control", SYSCTL_DESCR("Flow Control"),
429	    ixgbe_set_flowcntl, 0, adapter, 0, CTL_CREATE, CTL_EOL) != 0)
430		aprint_error_dev(dev, "could not create sysctl\n");
431
432	if (sysctl_createv(log, 0, &rnode, &cnode,
433	    CTLFLAG_READWRITE, CTLTYPE_INT,
434	    "advertise_gig", SYSCTL_DESCR("1G Link"),
435	    ixgbe_set_advertise, 0, adapter, 0, CTL_CREATE, CTL_EOL) != 0)
436		aprint_error_dev(dev, "could not create sysctl\n");
437
438	/* XXX This is an *instance* sysctl controlling a *global* variable.
439	 * XXX It's that way in the FreeBSD driver that this derives from.
440	 */
441	if (sysctl_createv(log, 0, &rnode, &cnode,
442	    CTLFLAG_READWRITE, CTLTYPE_INT,
443	    "enable_aim", SYSCTL_DESCR("Interrupt Moderation"),
444	    NULL, 0, &ixgbe_enable_aim, 0, CTL_CREATE, CTL_EOL) != 0)
445		aprint_error_dev(dev, "could not create sysctl\n");
446}
447
448/*********************************************************************
449 *  Device initialization routine
450 *
451 *  The attach entry point is called when the driver is being loaded.
452 *  This routine identifies the type of hardware, allocates all resources
453 *  and initializes the hardware.
454 *
455 *  return 0 on success, positive on failure
456 *********************************************************************/
457
458static void
459ixgbe_attach(device_t parent, device_t dev, void *aux)
460{
461	struct adapter *adapter;
462	struct ixgbe_hw *hw;
463	int             error = 0;
464	u16		csum;
465	u32		ctrl_ext;
466	ixgbe_vendor_info_t *ent;
467	const struct pci_attach_args *pa = aux;
468
469	INIT_DEBUGOUT("ixgbe_attach: begin");
470
471	/* Allocate, clear, and link in our adapter structure */
472	adapter = device_private(dev);
473	adapter->dev = adapter->osdep.dev = dev;
474	hw = &adapter->hw;
475	adapter->osdep.pc = pa->pa_pc;
476	adapter->osdep.tag = pa->pa_tag;
477	adapter->osdep.dmat = pa->pa_dmat;
478
479	ent = ixgbe_lookup(pa);
480
481	KASSERT(ent != NULL);
482
483	aprint_normal(": %s, Version - %s\n",
484	    ixgbe_strings[ent->index], ixgbe_driver_version);
485
486	/* Core Lock Init*/
487	IXGBE_CORE_LOCK_INIT(adapter, device_xname(dev));
488
489	/* SYSCTL APIs */
490
491	ixgbe_sysctl_attach(adapter);
492
493	/* Set up the timer callout */
494	callout_init(&adapter->timer, 0);
495
496	/* Determine hardware revision */
497	ixgbe_identify_hardware(adapter);
498
499	/* Do base PCI setup - map BAR0 */
500	if (ixgbe_allocate_pci_resources(adapter, pa)) {
501		aprint_error_dev(dev, "Allocation of PCI resources failed\n");
502		error = ENXIO;
503		goto err_out;
504	}
505
506	/* Do descriptor calc and sanity checks */
507	if (((ixgbe_txd * sizeof(union ixgbe_adv_tx_desc)) % DBA_ALIGN) != 0 ||
508	    ixgbe_txd < MIN_TXD || ixgbe_txd > MAX_TXD) {
509		aprint_error_dev(dev, "TXD config issue, using default!\n");
510		adapter->num_tx_desc = DEFAULT_TXD;
511	} else
512		adapter->num_tx_desc = ixgbe_txd;
513
514	/*
515	** With many RX rings it is easy to exceed the
516	** system mbuf allocation. Tuning nmbclusters
517	** can alleviate this.
518	*/
519	if (nmbclusters > 0 ) {
520		int s;
521		s = (ixgbe_rxd * adapter->num_queues) * ixgbe_total_ports;
522		if (s > nmbclusters) {
523			aprint_error_dev(dev, "RX Descriptors exceed "
524			    "system mbuf max, using default instead!\n");
525			ixgbe_rxd = DEFAULT_RXD;
526		}
527	}
528
529	if (((ixgbe_rxd * sizeof(union ixgbe_adv_rx_desc)) % DBA_ALIGN) != 0 ||
530	    ixgbe_rxd < MIN_TXD || ixgbe_rxd > MAX_TXD) {
531		aprint_error_dev(dev, "RXD config issue, using default!\n");
532		adapter->num_rx_desc = DEFAULT_RXD;
533	} else
534		adapter->num_rx_desc = ixgbe_rxd;
535
536	/* Allocate our TX/RX Queues */
537	if (ixgbe_allocate_queues(adapter)) {
538		error = ENOMEM;
539		goto err_out;
540	}
541
542	/* Allocate multicast array memory. */
543	adapter->mta = malloc(sizeof(u8) * IXGBE_ETH_LENGTH_OF_ADDRESS *
544	    MAX_NUM_MULTICAST_ADDRESSES, M_DEVBUF, M_NOWAIT);
545	if (adapter->mta == NULL) {
546		aprint_error_dev(dev, "Cannot allocate multicast setup array\n");
547		error = ENOMEM;
548		goto err_late;
549	}
550
551	/* Initialize the shared code */
552	error = ixgbe_init_shared_code(hw);
553	if (error == IXGBE_ERR_SFP_NOT_PRESENT) {
554		/*
555		** No optics in this port, set up
556		** so the timer routine will probe
557		** for later insertion.
558		*/
559		adapter->sfp_probe = TRUE;
560		error = 0;
561	} else if (error == IXGBE_ERR_SFP_NOT_SUPPORTED) {
562		aprint_error_dev(dev,"Unsupported SFP+ module detected!\n");
563		error = EIO;
564		goto err_late;
565	} else if (error) {
566		aprint_error_dev(dev,"Unable to initialize the shared code\n");
567		error = EIO;
568		goto err_late;
569	}
570
571	/* Make sure we have a good EEPROM before we read from it */
572	if (ixgbe_validate_eeprom_checksum(&adapter->hw, &csum) < 0) {
573		aprint_error_dev(dev,"The EEPROM Checksum Is Not Valid\n");
574		error = EIO;
575		goto err_late;
576	}
577
578	/* Get Hardware Flow Control setting */
579	hw->fc.requested_mode = ixgbe_fc_full;
580	hw->fc.pause_time = IXGBE_FC_PAUSE;
581	hw->fc.low_water = IXGBE_FC_LO;
582	hw->fc.high_water = IXGBE_FC_HI;
583	hw->fc.send_xon = TRUE;
584
585	error = ixgbe_init_hw(hw);
586	if (error == IXGBE_ERR_EEPROM_VERSION) {
587		aprint_error_dev(dev, "This device is a pre-production adapter/"
588		    "LOM.  Please be aware there may be issues associated "
589		    "with your hardware.\n If you are experiencing problems "
590		    "please contact your Intel or hardware representative "
591		    "who provided you with this hardware.\n");
592	} else if (error == IXGBE_ERR_SFP_NOT_SUPPORTED)
593		aprint_error_dev(dev,"Unsupported SFP+ Module\n");
594
595	if (error) {
596		error = EIO;
597		aprint_error_dev(dev,"Hardware Initialization Failure\n");
598		goto err_late;
599	}
600
601	/* Detect and set physical type */
602	ixgbe_setup_optics(adapter);
603
604	if ((adapter->msix > 1) && (ixgbe_enable_msix))
605		error = ixgbe_allocate_msix(adapter, pa);
606	else
607		error = ixgbe_allocate_legacy(adapter, pa);
608	if (error)
609		goto err_late;
610
611	/* Setup OS specific network interface */
612	if (ixgbe_setup_interface(dev, adapter) != 0)
613		goto err_late;
614
615	/* Sysctl for limiting the amount of work done in software interrupts */
616	ixgbe_add_rx_process_limit(adapter, "rx_processing_limit",
617	    "max number of rx packets to process", &adapter->rx_process_limit,
618	    ixgbe_rx_process_limit);
619
620	/* Initialize statistics */
621	ixgbe_update_stats_counters(adapter);
622
623        /* Print PCIE bus type/speed/width info */
624	ixgbe_get_bus_info(hw);
625	aprint_normal_dev(dev,"PCI Express Bus: Speed %s %s\n",
626	    ((hw->bus.speed == ixgbe_bus_speed_5000) ? "5.0Gb/s":
627	    (hw->bus.speed == ixgbe_bus_speed_2500) ? "2.5Gb/s":"Unknown"),
628	    (hw->bus.width == ixgbe_bus_width_pcie_x8) ? "Width x8" :
629	    (hw->bus.width == ixgbe_bus_width_pcie_x4) ? "Width x4" :
630	    (hw->bus.width == ixgbe_bus_width_pcie_x1) ? "Width x1" :
631	    ("Unknown"));
632
633	if ((hw->bus.width <= ixgbe_bus_width_pcie_x4) &&
634	    (hw->bus.speed == ixgbe_bus_speed_2500)) {
635		aprint_error_dev(dev, "PCI-Express bandwidth available"
636		    " for this card\n     is not sufficient for"
637		    " optimal performance.\n");
638		aprint_error_dev(dev, "For optimal performance a x8 "
639		    "PCIE, or x4 PCIE 2 slot is required.\n");
640        }
641
642	/* let hardware know driver is loaded */
643	ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
644	ctrl_ext |= IXGBE_CTRL_EXT_DRV_LOAD;
645	IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext);
646
647	ixgbe_add_hw_stats(adapter);
648
649	INIT_DEBUGOUT("ixgbe_attach: end");
650	return;
651err_late:
652	ixgbe_free_transmit_structures(adapter);
653	ixgbe_free_receive_structures(adapter);
654err_out:
655	if (adapter->ifp != NULL)
656		if_free(adapter->ifp);
657	ixgbe_free_pci_resources(adapter);
658	if (adapter->mta != NULL)
659		free(adapter->mta, M_DEVBUF);
660	return;
661
662}
663
664/*********************************************************************
665 *  Device removal routine
666 *
667 *  The detach entry point is called when the driver is being removed.
668 *  This routine stops the adapter and deallocates all the resources
669 *  that were allocated for driver operation.
670 *
671 *  return 0 on success, positive on failure
672 *********************************************************************/
673
674static int
675ixgbe_detach(device_t dev, int flags)
676{
677	struct adapter *adapter = device_private(dev);
678	struct tx_ring *txr = adapter->tx_rings;
679	struct rx_ring *rxr = adapter->rx_rings;
680	struct ixgbe_hw_stats *stats = &adapter->stats;
681	struct ix_queue *que = adapter->queues;
682	u32	ctrl_ext;
683
684	INIT_DEBUGOUT("ixgbe_detach: begin");
685
686	/* Make sure VLANs are not using driver */
687	if (!VLAN_ATTACHED(&adapter->osdep.ec))
688		;	/* nothing to do: no VLANs */
689	else if ((flags & (DETACH_SHUTDOWN|DETACH_FORCE)) != 0)
690		vlan_ifdetach(adapter->ifp);
691	else {
692		aprint_error_dev(dev, "VLANs in use\n");
693		return EBUSY;
694	}
695
696	IXGBE_CORE_LOCK(adapter);
697	ixgbe_stop(adapter);
698	IXGBE_CORE_UNLOCK(adapter);
699
700	for (int i = 0; i < adapter->num_queues; i++, que++) {
701		softint_disestablish(que->que_si);
702	}
703
704	/* Drain the Link queue */
705	softint_disestablish(adapter->link_si);
706	softint_disestablish(adapter->mod_si);
707	softint_disestablish(adapter->msf_si);
708#ifdef IXGBE_FDIR
709	softint_disestablish(adapter->fdir_si);
710#endif
711
712	/* let hardware know driver is unloading */
713	ctrl_ext = IXGBE_READ_REG(&adapter->hw, IXGBE_CTRL_EXT);
714	ctrl_ext &= ~IXGBE_CTRL_EXT_DRV_LOAD;
715	IXGBE_WRITE_REG(&adapter->hw, IXGBE_CTRL_EXT, ctrl_ext);
716
717	ether_ifdetach(adapter->ifp);
718	callout_halt(&adapter->timer, NULL);
719	ixgbe_free_pci_resources(adapter);
720#if 0	/* XXX the NetBSD port is probably missing something here */
721	bus_generic_detach(dev);
722#endif
723	if_detach(adapter->ifp);
724
725	sysctl_teardown(&adapter->sysctllog);
726	evcnt_detach(&adapter->handleq);
727	evcnt_detach(&adapter->req);
728	evcnt_detach(&adapter->morerx);
729	evcnt_detach(&adapter->moretx);
730	evcnt_detach(&adapter->txloops);
731	evcnt_detach(&adapter->efbig_tx_dma_setup);
732	evcnt_detach(&adapter->m_defrag_failed);
733	evcnt_detach(&adapter->efbig2_tx_dma_setup);
734	evcnt_detach(&adapter->einval_tx_dma_setup);
735	evcnt_detach(&adapter->other_tx_dma_setup);
736	evcnt_detach(&adapter->eagain_tx_dma_setup);
737	evcnt_detach(&adapter->enomem_tx_dma_setup);
738	evcnt_detach(&adapter->watchdog_events);
739	evcnt_detach(&adapter->tso_err);
740	evcnt_detach(&adapter->tso_tx);
741	evcnt_detach(&adapter->link_irq);
742	for (int i = 0; i < adapter->num_queues; i++, rxr++, txr++) {
743		evcnt_detach(&txr->no_desc_avail);
744		evcnt_detach(&txr->total_packets);
745
746		if (i < __arraycount(adapter->stats.mpc)) {
747			evcnt_detach(&adapter->stats.mpc[i]);
748		}
749		if (i < __arraycount(adapter->stats.pxontxc)) {
750			evcnt_detach(&adapter->stats.pxontxc[i]);
751			evcnt_detach(&adapter->stats.pxonrxc[i]);
752			evcnt_detach(&adapter->stats.pxofftxc[i]);
753			evcnt_detach(&adapter->stats.pxoffrxc[i]);
754			evcnt_detach(&adapter->stats.pxon2offc[i]);
755		}
756		if (i < __arraycount(adapter->stats.qprc)) {
757			evcnt_detach(&adapter->stats.qprc[i]);
758			evcnt_detach(&adapter->stats.qptc[i]);
759			evcnt_detach(&adapter->stats.qbrc[i]);
760			evcnt_detach(&adapter->stats.qbtc[i]);
761			evcnt_detach(&adapter->stats.qprdc[i]);
762		}
763
764		evcnt_detach(&rxr->rx_packets);
765		evcnt_detach(&rxr->rx_bytes);
766		evcnt_detach(&rxr->no_jmbuf);
767		evcnt_detach(&rxr->rx_discarded);
768		evcnt_detach(&rxr->rx_split_packets);
769		evcnt_detach(&rxr->rx_irq);
770	}
771	evcnt_detach(&stats->ipcs);
772	evcnt_detach(&stats->l4cs);
773	evcnt_detach(&stats->ipcs_bad);
774	evcnt_detach(&stats->l4cs_bad);
775	evcnt_detach(&stats->intzero);
776	evcnt_detach(&stats->legint);
777	evcnt_detach(&stats->crcerrs);
778	evcnt_detach(&stats->illerrc);
779	evcnt_detach(&stats->errbc);
780	evcnt_detach(&stats->mspdc);
781	evcnt_detach(&stats->mlfc);
782	evcnt_detach(&stats->mrfc);
783	evcnt_detach(&stats->rlec);
784	evcnt_detach(&stats->lxontxc);
785	evcnt_detach(&stats->lxonrxc);
786	evcnt_detach(&stats->lxofftxc);
787	evcnt_detach(&stats->lxoffrxc);
788
789	/* Packet Reception Stats */
790	evcnt_detach(&stats->tor);
791	evcnt_detach(&stats->gorc);
792	evcnt_detach(&stats->tpr);
793	evcnt_detach(&stats->gprc);
794	evcnt_detach(&stats->mprc);
795	evcnt_detach(&stats->bprc);
796	evcnt_detach(&stats->prc64);
797	evcnt_detach(&stats->prc127);
798	evcnt_detach(&stats->prc255);
799	evcnt_detach(&stats->prc511);
800	evcnt_detach(&stats->prc1023);
801	evcnt_detach(&stats->prc1522);
802	evcnt_detach(&stats->ruc);
803	evcnt_detach(&stats->rfc);
804	evcnt_detach(&stats->roc);
805	evcnt_detach(&stats->rjc);
806	evcnt_detach(&stats->mngprc);
807	evcnt_detach(&stats->mngptc);
808	evcnt_detach(&stats->xec);
809
810	/* Packet Transmission Stats */
811	evcnt_detach(&stats->gotc);
812	evcnt_detach(&stats->tpt);
813	evcnt_detach(&stats->gptc);
814	evcnt_detach(&stats->bptc);
815	evcnt_detach(&stats->mptc);
816	evcnt_detach(&stats->mngptc);
817	evcnt_detach(&stats->ptc64);
818	evcnt_detach(&stats->ptc127);
819	evcnt_detach(&stats->ptc255);
820	evcnt_detach(&stats->ptc511);
821	evcnt_detach(&stats->ptc1023);
822	evcnt_detach(&stats->ptc1522);
823
824	/* FC Stats */
825	evcnt_detach(&stats->fccrc);
826	evcnt_detach(&stats->fclast);
827	if (adapter->hw.mac.type != ixgbe_mac_82598EB) {
828		evcnt_detach(&stats->fcoerpdc);
829		evcnt_detach(&stats->fcoeprc);
830		evcnt_detach(&stats->fcoeptc);
831		evcnt_detach(&stats->fcoedwrc);
832		evcnt_detach(&stats->fcoedwtc);
833	}
834
835	ixgbe_free_transmit_structures(adapter);
836	ixgbe_free_receive_structures(adapter);
837	free(adapter->mta, M_DEVBUF);
838
839	IXGBE_CORE_LOCK_DESTROY(adapter);
840	return (0);
841}
842
843/*********************************************************************
844 *
845 *  Shutdown entry point
846 *
847 **********************************************************************/
848
849#if 0 /* XXX NetBSD ought to register something like this through pmf(9) */
850static int
851ixgbe_shutdown(device_t dev)
852{
853	struct adapter *adapter = device_private(dev);
854	IXGBE_CORE_LOCK(adapter);
855	ixgbe_stop(adapter);
856	IXGBE_CORE_UNLOCK(adapter);
857	return (0);
858}
859#endif
860
861
862/*********************************************************************
863 *  Transmit entry point
864 *
865 *  ixgbe_start is called by the stack to initiate a transmit.
866 *  The driver will remain in this routine as long as there are
867 *  packets to transmit and transmit resources are available.
868 *  In case resources are not available stack is notified and
869 *  the packet is requeued.
870 **********************************************************************/
871
872static void
873ixgbe_start_locked(struct tx_ring *txr, struct ifnet * ifp)
874{
875	int rc;
876	struct mbuf    *m_head;
877	struct adapter *adapter = txr->adapter;
878
879	IXGBE_TX_LOCK_ASSERT(txr);
880
881	if ((ifp->if_flags & (IFF_RUNNING|IFF_OACTIVE)) !=
882	    IFF_RUNNING)
883		return;
884	if (!adapter->link_active)
885		return;
886
887	while (!IFQ_IS_EMPTY(&ifp->if_snd)) {
888
889		IFQ_POLL(&ifp->if_snd, m_head);
890		if (m_head == NULL)
891			break;
892
893		if ((rc = ixgbe_xmit(txr, m_head)) == EAGAIN) {
894			ifp->if_flags |= IFF_OACTIVE;
895			break;
896		}
897		IFQ_DEQUEUE(&ifp->if_snd, m_head);
898		if (rc == EFBIG) {
899			struct mbuf *mtmp;
900
901			if ((mtmp = m_defrag(m_head, M_DONTWAIT)) != NULL) {
902				m_head = mtmp;
903				rc = ixgbe_xmit(txr, m_head);
904				if (rc != 0)
905					adapter->efbig2_tx_dma_setup.ev_count++;
906			} else
907				adapter->m_defrag_failed.ev_count++;
908		}
909		if (rc != 0) {
910			m_freem(m_head);
911			continue;
912		}
913
914		/* Send a copy of the frame to the BPF listener */
915		bpf_mtap(ifp, m_head);
916
917		/* Set watchdog on */
918		getmicrotime(&txr->watchdog_time);
919		txr->queue_status = IXGBE_QUEUE_WORKING;
920
921	}
922	return;
923}
924
925/*
926 * Legacy TX start - called by the stack, this
927 * always uses the first tx ring, and should
928 * not be used with multiqueue tx enabled.
929 */
930static void
931ixgbe_start(struct ifnet *ifp)
932{
933	struct adapter *adapter = ifp->if_softc;
934	struct tx_ring	*txr = adapter->tx_rings;
935
936	if (ifp->if_flags & IFF_RUNNING) {
937		IXGBE_TX_LOCK(txr);
938		ixgbe_start_locked(txr, ifp);
939		IXGBE_TX_UNLOCK(txr);
940	}
941	return;
942}
943
944#if __FreeBSD_version >= 800000
945/*
946** Multiqueue Transmit driver
947**
948*/
949static int
950ixgbe_mq_start(struct ifnet *ifp, struct mbuf *m)
951{
952	struct adapter	*adapter = ifp->if_softc;
953	struct ix_queue	*que;
954	struct tx_ring	*txr;
955	int 		i = 0, err = 0;
956
957	/* Which queue to use */
958	if ((m->m_flags & M_FLOWID) != 0)
959		i = m->m_pkthdr.flowid % adapter->num_queues;
960
961	txr = &adapter->tx_rings[i];
962	que = &adapter->queues[i];
963
964	if (IXGBE_TX_TRYLOCK(txr)) {
965		err = ixgbe_mq_start_locked(ifp, txr, m);
966		IXGBE_TX_UNLOCK(txr);
967	} else {
968		err = drbr_enqueue(ifp, txr->br, m);
969		softint_schedule(que->que_si);
970	}
971
972	return (err);
973}
974
975static int
976ixgbe_mq_start_locked(struct ifnet *ifp, struct tx_ring *txr, struct mbuf *m)
977{
978	struct adapter  *adapter = txr->adapter;
979        struct mbuf     *next;
980        int             enqueued, err = 0;
981
982	if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) !=
983	    IFF_RUNNING || adapter->link_active == 0) {
984		if (m != NULL)
985			err = drbr_enqueue(ifp, txr->br, m);
986		return (err);
987	}
988
989	enqueued = 0;
990	if (m == NULL) {
991		next = drbr_dequeue(ifp, txr->br);
992	} else if (drbr_needs_enqueue(ifp, txr->br)) {
993		if ((err = drbr_enqueue(ifp, txr->br, m)) != 0)
994			return (err);
995		next = drbr_dequeue(ifp, txr->br);
996	} else
997		next = m;
998
999	/* Process the queue */
1000	while (next != NULL) {
1001		if ((err = ixgbe_xmit(txr, &next)) != 0) {
1002			if (next != NULL)
1003				err = drbr_enqueue(ifp, txr->br, next);
1004			break;
1005		}
1006		enqueued++;
1007		drbr_stats_update(ifp, next->m_pkthdr.len, next->m_flags);
1008		/* Send a copy of the frame to the BPF listener */
1009		bpf_mtap(ifp, next);
1010		if ((ifp->if_flags & IFF_RUNNING) == 0)
1011			break;
1012		if (txr->tx_avail < IXGBE_TX_OP_THRESHOLD)
1013			ixgbe_txeof(txr);
1014		if (txr->tx_avail < IXGBE_TX_OP_THRESHOLD) {
1015			ifp->if_flags |= IFF_OACTIVE;
1016			break;
1017		}
1018		next = drbr_dequeue(ifp, txr->br);
1019	}
1020
1021	if (enqueued > 0) {
1022		/* Set watchdog on */
1023		txr->queue_status = IXGBE_QUEUE_WORKING;
1024		getmicrotime(&txr->watchdog_time);
1025	}
1026
1027	return (err);
1028}
1029
1030/*
1031** Flush all ring buffers
1032*/
1033static void
1034ixgbe_qflush(struct ifnet *ifp)
1035{
1036	struct adapter	*adapter = ifp->if_softc;
1037	struct tx_ring	*txr = adapter->tx_rings;
1038	struct mbuf	*m;
1039
1040	for (int i = 0; i < adapter->num_queues; i++, txr++) {
1041		IXGBE_TX_LOCK(txr);
1042		while ((m = buf_ring_dequeue_sc(txr->br)) != NULL)
1043			m_freem(m);
1044		IXGBE_TX_UNLOCK(txr);
1045	}
1046	if_qflush(ifp);
1047}
1048#endif /* __FreeBSD_version >= 800000 */
1049
1050static int
1051ixgbe_ifflags_cb(struct ethercom *ec)
1052{
1053	struct ifnet *ifp = &ec->ec_if;
1054	struct adapter *adapter = ifp->if_softc;
1055	int change = ifp->if_flags ^ adapter->if_flags, rc = 0;
1056
1057	IXGBE_CORE_LOCK(adapter);
1058
1059	if (change != 0)
1060		adapter->if_flags = ifp->if_flags;
1061
1062	if ((change & ~(IFF_CANTCHANGE|IFF_DEBUG)) != 0)
1063		rc = ENETRESET;
1064	else if ((change & (IFF_PROMISC | IFF_ALLMULTI)) != 0)
1065		ixgbe_set_promisc(adapter);
1066
1067	IXGBE_CORE_UNLOCK(adapter);
1068
1069	return rc;
1070}
1071
1072/*********************************************************************
1073 *  Ioctl entry point
1074 *
1075 *  ixgbe_ioctl is called when the user wants to configure the
1076 *  interface.
1077 *
1078 *  return 0 on success, positive on failure
1079 **********************************************************************/
1080
1081static int
1082ixgbe_ioctl(struct ifnet * ifp, u_long command, void *data)
1083{
1084	struct adapter	*adapter = ifp->if_softc;
1085	struct ifcapreq *ifcr = data;
1086	struct ifreq	*ifr = data;
1087	int             error = 0;
1088	int l4csum_en;
1089	const int l4csum = IFCAP_CSUM_TCPv4_Rx|IFCAP_CSUM_UDPv4_Rx|
1090	     IFCAP_CSUM_TCPv6_Rx|IFCAP_CSUM_UDPv6_Rx;
1091
1092	switch (command) {
1093	case SIOCSIFFLAGS:
1094		IOCTL_DEBUGOUT("ioctl: SIOCSIFFLAGS (Set Interface Flags)");
1095		break;
1096	case SIOCADDMULTI:
1097	case SIOCDELMULTI:
1098		IOCTL_DEBUGOUT("ioctl: SIOC(ADD|DEL)MULTI");
1099		break;
1100	case SIOCSIFMEDIA:
1101	case SIOCGIFMEDIA:
1102		IOCTL_DEBUGOUT("ioctl: SIOCxIFMEDIA (Get/Set Interface Media)");
1103		break;
1104	case SIOCSIFCAP:
1105		IOCTL_DEBUGOUT("ioctl: SIOCSIFCAP (Set Capabilities)");
1106		break;
1107	case SIOCSIFMTU:
1108		IOCTL_DEBUGOUT("ioctl: SIOCSIFMTU (Set Interface MTU)");
1109		break;
1110	default:
1111		IOCTL_DEBUGOUT1("ioctl: UNKNOWN (0x%X)\n", (int)command);
1112		break;
1113	}
1114
1115	switch (command) {
1116	case SIOCSIFMEDIA:
1117	case SIOCGIFMEDIA:
1118		return ifmedia_ioctl(ifp, ifr, &adapter->media, command);
1119	case SIOCSIFCAP:
1120		/* Layer-4 Rx checksum offload has to be turned on and
1121		 * off as a unit.
1122		 */
1123		l4csum_en = ifcr->ifcr_capenable & l4csum;
1124		if (l4csum_en != l4csum && l4csum_en != 0)
1125			return EINVAL;
1126		/*FALLTHROUGH*/
1127	case SIOCADDMULTI:
1128	case SIOCDELMULTI:
1129	case SIOCSIFFLAGS:
1130	case SIOCSIFMTU:
1131	default:
1132		if ((error = ether_ioctl(ifp, command, data)) != ENETRESET)
1133			return error;
1134		if ((ifp->if_flags & IFF_RUNNING) == 0)
1135			;
1136		else if (command == SIOCSIFCAP || command == SIOCSIFMTU) {
1137			IXGBE_CORE_LOCK(adapter);
1138			ixgbe_init_locked(adapter);
1139			IXGBE_CORE_UNLOCK(adapter);
1140		} else if (command == SIOCADDMULTI || command == SIOCDELMULTI) {
1141			/*
1142			 * Multicast list has changed; set the hardware filter
1143			 * accordingly.
1144			 */
1145			IXGBE_CORE_LOCK(adapter);
1146			ixgbe_disable_intr(adapter);
1147			ixgbe_set_multi(adapter);
1148			ixgbe_enable_intr(adapter);
1149			IXGBE_CORE_UNLOCK(adapter);
1150		}
1151		return 0;
1152	}
1153}
1154
1155/*********************************************************************
1156 *  Init entry point
1157 *
1158 *  This routine is used in two ways. It is used by the stack as
1159 *  init entry point in network interface structure. It is also used
1160 *  by the driver as a hw/sw initialization routine to get to a
1161 *  consistent state.
1162 *
1163 *  return 0 on success, positive on failure
1164 **********************************************************************/
1165#define IXGBE_MHADD_MFS_SHIFT 16
1166
1167static void
1168ixgbe_init_locked(struct adapter *adapter)
1169{
1170	struct ifnet   *ifp = adapter->ifp;
1171	device_t 	dev = adapter->dev;
1172	struct ixgbe_hw *hw = &adapter->hw;
1173	u32		k, txdctl, mhadd, gpie;
1174	u32		rxdctl, rxctrl;
1175
1176	/* XXX check IFF_UP and IFF_RUNNING, power-saving state! */
1177
1178	KASSERT(mutex_owned(&adapter->core_mtx));
1179	INIT_DEBUGOUT("ixgbe_init: begin");
1180	hw->adapter_stopped = FALSE;
1181	ixgbe_stop_adapter(hw);
1182        callout_stop(&adapter->timer);
1183
1184	/* XXX I moved this here from the SIOCSIFMTU case in ixgbe_ioctl(). */
1185	adapter->max_frame_size =
1186		ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
1187
1188        /* reprogram the RAR[0] in case user changed it. */
1189        ixgbe_set_rar(hw, 0, adapter->hw.mac.addr, 0, IXGBE_RAH_AV);
1190
1191	/* Get the latest mac address, User can use a LAA */
1192	memcpy(hw->mac.addr, CLLADDR(adapter->ifp->if_sadl),
1193	    IXGBE_ETH_LENGTH_OF_ADDRESS);
1194	ixgbe_set_rar(hw, 0, hw->mac.addr, 0, 1);
1195	hw->addr_ctrl.rar_used_count = 1;
1196
1197	/* Prepare transmit descriptors and buffers */
1198	if (ixgbe_setup_transmit_structures(adapter)) {
1199		device_printf(dev,"Could not setup transmit structures\n");
1200		ixgbe_stop(adapter);
1201		return;
1202	}
1203
1204	ixgbe_init_hw(hw);
1205	ixgbe_initialize_transmit_units(adapter);
1206
1207	/* Setup Multicast table */
1208	ixgbe_set_multi(adapter);
1209
1210	/*
1211	** Determine the correct mbuf pool
1212	** for doing jumbo/headersplit
1213	*/
1214	if (adapter->max_frame_size <= 2048)
1215		adapter->rx_mbuf_sz = MCLBYTES;
1216	else if (adapter->max_frame_size <= 4096)
1217		adapter->rx_mbuf_sz = MJUMPAGESIZE;
1218	else if (adapter->max_frame_size <= 9216)
1219		adapter->rx_mbuf_sz = MJUM9BYTES;
1220	else
1221		adapter->rx_mbuf_sz = MJUM16BYTES;
1222
1223	/* Prepare receive descriptors and buffers */
1224	if (ixgbe_setup_receive_structures(adapter)) {
1225		device_printf(dev,"Could not setup receive structures\n");
1226		ixgbe_stop(adapter);
1227		return;
1228	}
1229
1230	/* Configure RX settings */
1231	ixgbe_initialize_receive_units(adapter);
1232
1233	gpie = IXGBE_READ_REG(&adapter->hw, IXGBE_GPIE);
1234
1235	/* Enable Fan Failure Interrupt */
1236	gpie |= IXGBE_SDP1_GPIEN;
1237
1238	/* Add for Thermal detection */
1239	if (hw->mac.type == ixgbe_mac_82599EB)
1240		gpie |= IXGBE_SDP2_GPIEN;
1241
1242	if (adapter->msix > 1) {
1243		/* Enable Enhanced MSIX mode */
1244		gpie |= IXGBE_GPIE_MSIX_MODE;
1245		gpie |= IXGBE_GPIE_EIAME | IXGBE_GPIE_PBA_SUPPORT |
1246		    IXGBE_GPIE_OCD;
1247	}
1248	IXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie);
1249
1250	/* Set MTU size */
1251	if (ifp->if_mtu > ETHERMTU) {
1252		mhadd = IXGBE_READ_REG(hw, IXGBE_MHADD);
1253		mhadd &= ~IXGBE_MHADD_MFS_MASK;
1254		mhadd |= adapter->max_frame_size << IXGBE_MHADD_MFS_SHIFT;
1255		IXGBE_WRITE_REG(hw, IXGBE_MHADD, mhadd);
1256	}
1257
1258	/* Now enable all the queues */
1259
1260	for (int i = 0; i < adapter->num_queues; i++) {
1261		txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(i));
1262		txdctl |= IXGBE_TXDCTL_ENABLE;
1263		/* Set WTHRESH to 8, burst writeback */
1264		txdctl |= (8 << 16);
1265		IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(i), txdctl);
1266	}
1267
1268	for (int i = 0; i < adapter->num_queues; i++) {
1269		rxdctl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(i));
1270		if (hw->mac.type == ixgbe_mac_82598EB) {
1271			/*
1272			** PTHRESH = 21
1273			** HTHRESH = 4
1274			** WTHRESH = 8
1275			*/
1276			rxdctl &= ~0x3FFFFF;
1277			rxdctl |= 0x080420;
1278		}
1279		rxdctl |= IXGBE_RXDCTL_ENABLE;
1280		IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(i), rxdctl);
1281		/* XXX I don't trust this loop, and I don't trust the
1282		 * XXX memory barrier.  What is this meant to do? --dyoung
1283		 */
1284		for (k = 0; k < 10; k++) {
1285			if (IXGBE_READ_REG(hw, IXGBE_RXDCTL(i)) &
1286			    IXGBE_RXDCTL_ENABLE)
1287				break;
1288			else
1289				msec_delay(1);
1290		}
1291		wmb();
1292		IXGBE_WRITE_REG(hw, IXGBE_RDT(i), adapter->num_rx_desc - 1);
1293	}
1294
1295	/* Set up VLAN support and filter */
1296	ixgbe_setup_vlan_hw_support(adapter);
1297
1298	/* Enable Receive engine */
1299	rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
1300	if (hw->mac.type == ixgbe_mac_82598EB)
1301		rxctrl |= IXGBE_RXCTRL_DMBYPS;
1302	rxctrl |= IXGBE_RXCTRL_RXEN;
1303	ixgbe_enable_rx_dma(hw, rxctrl);
1304
1305	callout_reset(&adapter->timer, hz, ixgbe_local_timer, adapter);
1306
1307	/* Set up MSI/X routing */
1308	if (ixgbe_enable_msix)  {
1309		ixgbe_configure_ivars(adapter);
1310		/* Set up auto-mask */
1311		if (hw->mac.type == ixgbe_mac_82598EB)
1312			IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE);
1313		else {
1314			IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(0), 0xFFFFFFFF);
1315			IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(1), 0xFFFFFFFF);
1316		}
1317	} else {  /* Simple settings for Legacy/MSI */
1318                ixgbe_set_ivar(adapter, 0, 0, 0);
1319                ixgbe_set_ivar(adapter, 0, 0, 1);
1320		IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE);
1321	}
1322
1323#ifdef IXGBE_FDIR
1324	/* Init Flow director */
1325	if (hw->mac.type != ixgbe_mac_82598EB)
1326		ixgbe_init_fdir_signature_82599(&adapter->hw, fdir_pballoc);
1327#endif
1328
1329	/*
1330	** Check on any SFP devices that
1331	** need to be kick-started
1332	*/
1333	if (hw->phy.type == ixgbe_phy_none) {
1334		int err = hw->phy.ops.identify(hw);
1335		if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
1336                	device_printf(dev,
1337			    "Unsupported SFP+ module type was detected.\n");
1338			return;
1339        	}
1340	}
1341
1342	/* Set moderation on the Link interrupt */
1343	IXGBE_WRITE_REG(hw, IXGBE_EITR(adapter->linkvec), IXGBE_LINK_ITR);
1344
1345	/* Config/Enable Link */
1346	ixgbe_config_link(adapter);
1347
1348	/* And now turn on interrupts */
1349	ixgbe_enable_intr(adapter);
1350
1351	/* Now inform the stack we're ready */
1352	ifp->if_flags |= IFF_RUNNING;
1353	ifp->if_flags &= ~IFF_OACTIVE;
1354
1355	return;
1356}
1357
1358static int
1359ixgbe_init(struct ifnet *ifp)
1360{
1361	struct adapter *adapter = ifp->if_softc;
1362
1363	IXGBE_CORE_LOCK(adapter);
1364	ixgbe_init_locked(adapter);
1365	IXGBE_CORE_UNLOCK(adapter);
1366	return 0;	/* XXX ixgbe_init_locked cannot fail?  really? */
1367}
1368
1369
1370/*
1371**
1372** MSIX Interrupt Handlers and Tasklets
1373**
1374*/
1375
1376static inline void
1377ixgbe_enable_queue(struct adapter *adapter, u32 vector)
1378{
1379	struct ixgbe_hw *hw = &adapter->hw;
1380	u64	queue = (u64)(1 << vector);
1381	u32	mask;
1382
1383	if (hw->mac.type == ixgbe_mac_82598EB) {
1384                mask = (IXGBE_EIMS_RTX_QUEUE & queue);
1385                IXGBE_WRITE_REG(hw, IXGBE_EIMS, mask);
1386	} else {
1387                mask = (queue & 0xFFFFFFFF);
1388                if (mask)
1389                        IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(0), mask);
1390                mask = (queue >> 32);
1391                if (mask)
1392                        IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(1), mask);
1393	}
1394}
1395
1396static inline void
1397ixgbe_disable_queue(struct adapter *adapter, u32 vector)
1398{
1399	struct ixgbe_hw *hw = &adapter->hw;
1400	u64	queue = (u64)(1 << vector);
1401	u32	mask;
1402
1403	if (hw->mac.type == ixgbe_mac_82598EB) {
1404                mask = (IXGBE_EIMS_RTX_QUEUE & queue);
1405                IXGBE_WRITE_REG(hw, IXGBE_EIMC, mask);
1406	} else {
1407                mask = (queue & 0xFFFFFFFF);
1408                if (mask)
1409                        IXGBE_WRITE_REG(hw, IXGBE_EIMC_EX(0), mask);
1410                mask = (queue >> 32);
1411                if (mask)
1412                        IXGBE_WRITE_REG(hw, IXGBE_EIMC_EX(1), mask);
1413	}
1414}
1415
1416static inline void
1417ixgbe_rearm_queues(struct adapter *adapter, u64 queues)
1418{
1419	u32 mask;
1420
1421	if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
1422		mask = (IXGBE_EIMS_RTX_QUEUE & queues);
1423		IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS, mask);
1424	} else {
1425		mask = (queues & 0xFFFFFFFF);
1426		IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS_EX(0), mask);
1427		mask = (queues >> 32);
1428		IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS_EX(1), mask);
1429	}
1430}
1431
1432
1433static void
1434ixgbe_handle_que(void *context)
1435{
1436	struct ix_queue *que = context;
1437	struct adapter  *adapter = que->adapter;
1438	struct tx_ring  *txr = que->txr;
1439	struct ifnet    *ifp = adapter->ifp;
1440	bool		more;
1441
1442	adapter->handleq.ev_count++;
1443
1444	if (ifp->if_flags & IFF_RUNNING) {
1445		more = ixgbe_rxeof(que, adapter->rx_process_limit);
1446		IXGBE_TX_LOCK(txr);
1447		ixgbe_txeof(txr);
1448#if __FreeBSD_version >= 800000
1449		if (!drbr_empty(ifp, txr->br))
1450			ixgbe_mq_start_locked(ifp, txr, NULL);
1451#else
1452		if (!IFQ_IS_EMPTY(&ifp->if_snd))
1453			ixgbe_start_locked(txr, ifp);
1454#endif
1455		IXGBE_TX_UNLOCK(txr);
1456		if (more) {
1457			adapter->req.ev_count++;
1458			softint_schedule(que->que_si);
1459			return;
1460		}
1461	}
1462
1463	/* Reenable this interrupt */
1464	ixgbe_enable_queue(adapter, que->msix);
1465
1466	return;
1467}
1468
1469
1470/*********************************************************************
1471 *
1472 *  Legacy Interrupt Service routine
1473 *
1474 **********************************************************************/
1475
1476static int
1477ixgbe_legacy_irq(void *arg)
1478{
1479	struct ix_queue *que = arg;
1480	struct adapter	*adapter = que->adapter;
1481	struct ixgbe_hw	*hw = &adapter->hw;
1482	struct 		tx_ring *txr = adapter->tx_rings;
1483	bool		more_tx, more_rx;
1484	u32       	reg_eicr, loop = MAX_LOOP;
1485
1486
1487	reg_eicr = IXGBE_READ_REG(hw, IXGBE_EICR);
1488
1489	adapter->stats.legint.ev_count++;
1490	++que->irqs;
1491	if (reg_eicr == 0) {
1492		adapter->stats.intzero.ev_count++;
1493		ixgbe_enable_intr(adapter);
1494		return 0;
1495	}
1496
1497	more_rx = ixgbe_rxeof(que, adapter->rx_process_limit);
1498
1499	IXGBE_TX_LOCK(txr);
1500	do {
1501		adapter->txloops.ev_count++;
1502		more_tx = ixgbe_txeof(txr);
1503	} while (loop-- && more_tx);
1504	IXGBE_TX_UNLOCK(txr);
1505
1506	if (more_rx || more_tx) {
1507		if (more_rx)
1508			adapter->morerx.ev_count++;
1509		if (more_tx)
1510			adapter->moretx.ev_count++;
1511		softint_schedule(que->que_si);
1512	}
1513
1514	/* Check for fan failure */
1515	if ((hw->phy.media_type == ixgbe_media_type_copper) &&
1516	    (reg_eicr & IXGBE_EICR_GPI_SDP1)) {
1517                device_printf(adapter->dev, "\nCRITICAL: FAN FAILURE!! "
1518		    "REPLACE IMMEDIATELY!!\n");
1519		IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EICR_GPI_SDP1);
1520	}
1521
1522	/* Link status change */
1523	if (reg_eicr & IXGBE_EICR_LSC)
1524		softint_schedule(adapter->link_si);
1525
1526	ixgbe_enable_intr(adapter);
1527	return 1;
1528}
1529
1530
1531#if defined(NETBSD_MSI_OR_MSIX)
1532/*********************************************************************
1533 *
1534 *  MSI Queue Interrupt Service routine
1535 *
1536 **********************************************************************/
1537void
1538ixgbe_msix_que(void *arg)
1539{
1540	struct ix_queue	*que = arg;
1541	struct adapter  *adapter = que->adapter;
1542	struct tx_ring	*txr = que->txr;
1543	struct rx_ring	*rxr = que->rxr;
1544	bool		more_tx, more_rx;
1545	u32		newitr = 0;
1546
1547	++que->irqs;
1548
1549	more_rx = ixgbe_rxeof(que, adapter->rx_process_limit);
1550
1551	IXGBE_TX_LOCK(txr);
1552	more_tx = ixgbe_txeof(txr);
1553	IXGBE_TX_UNLOCK(txr);
1554
1555	/* Do AIM now? */
1556
1557	if (ixgbe_enable_aim == FALSE)
1558		goto no_calc;
1559	/*
1560	** Do Adaptive Interrupt Moderation:
1561        **  - Write out last calculated setting
1562	**  - Calculate based on average size over
1563	**    the last interval.
1564	*/
1565        if (que->eitr_setting)
1566                IXGBE_WRITE_REG(&adapter->hw,
1567                    IXGBE_EITR(que->msix), que->eitr_setting);
1568
1569        que->eitr_setting = 0;
1570
1571        /* Idle, do nothing */
1572        if ((txr->bytes == 0) && (rxr->bytes == 0))
1573                goto no_calc;
1574
1575	if ((txr->bytes) && (txr->packets))
1576               	newitr = txr->bytes/txr->packets;
1577	if ((rxr->bytes) && (rxr->packets))
1578		newitr = max(newitr,
1579		    (rxr->bytes / rxr->packets));
1580	newitr += 24; /* account for hardware frame, crc */
1581
1582	/* set an upper boundary */
1583	newitr = min(newitr, 3000);
1584
1585	/* Be nice to the mid range */
1586	if ((newitr > 300) && (newitr < 1200))
1587		newitr = (newitr / 3);
1588	else
1589		newitr = (newitr / 2);
1590
1591        if (adapter->hw.mac.type == ixgbe_mac_82598EB)
1592                newitr |= newitr << 16;
1593        else
1594                newitr |= IXGBE_EITR_CNT_WDIS;
1595
1596        /* save for next interrupt */
1597        que->eitr_setting = newitr;
1598
1599        /* Reset state */
1600        txr->bytes = 0;
1601        txr->packets = 0;
1602        rxr->bytes = 0;
1603        rxr->packets = 0;
1604
1605no_calc:
1606	if (more_tx || more_rx)
1607		softint_schedule(que->que_si);
1608	else /* Reenable this interrupt */
1609		ixgbe_enable_queue(adapter, que->msix);
1610	return;
1611}
1612
1613
1614static void
1615ixgbe_msix_link(void *arg)
1616{
1617	struct adapter	*adapter = arg;
1618	struct ixgbe_hw *hw = &adapter->hw;
1619	u32		reg_eicr;
1620
1621	++adapter->link_irq.ev_count;
1622
1623	/* First get the cause */
1624	reg_eicr = IXGBE_READ_REG(hw, IXGBE_EICS);
1625	/* Clear interrupt with write */
1626	IXGBE_WRITE_REG(hw, IXGBE_EICR, reg_eicr);
1627
1628	/* Link status change */
1629	if (reg_eicr & IXGBE_EICR_LSC)
1630		softint_schedule(adapter->link_si);
1631
1632	if (adapter->hw.mac.type != ixgbe_mac_82598EB) {
1633#ifdef IXGBE_FDIR
1634		if (reg_eicr & IXGBE_EICR_FLOW_DIR) {
1635			/* This is probably overkill :) */
1636			if (!atomic_cmpset_int(&adapter->fdir_reinit, 0, 1))
1637				return;
1638                	/* Clear the interrupt */
1639			IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_FLOW_DIR);
1640			/* Turn off the interface */
1641			adapter->ifp->if_flags &= ~IFF_RUNNING;
1642			softint_schedule(adapter->fdir_si);
1643		} else
1644#endif
1645		if (reg_eicr & IXGBE_EICR_ECC) {
1646                	device_printf(adapter->dev, "\nCRITICAL: ECC ERROR!! "
1647			    "Please Reboot!!\n");
1648			IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_ECC);
1649		} else
1650
1651		if (reg_eicr & IXGBE_EICR_GPI_SDP1) {
1652                	/* Clear the interrupt */
1653                	IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1);
1654			softint_schedule(adapter->msf_si);
1655        	} else if (reg_eicr & IXGBE_EICR_GPI_SDP2) {
1656                	/* Clear the interrupt */
1657                	IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP2);
1658			softint_schedule(adapter->mod_si);
1659		}
1660        }
1661
1662	/* Check for fan failure */
1663	if ((hw->device_id == IXGBE_DEV_ID_82598AT) &&
1664	    (reg_eicr & IXGBE_EICR_GPI_SDP1)) {
1665                device_printf(adapter->dev, "\nCRITICAL: FAN FAILURE!! "
1666		    "REPLACE IMMEDIATELY!!\n");
1667		IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1);
1668	}
1669
1670	IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, IXGBE_EIMS_OTHER);
1671	return;
1672}
1673#endif
1674
1675/*********************************************************************
1676 *
1677 *  Media Ioctl callback
1678 *
1679 *  This routine is called whenever the user queries the status of
1680 *  the interface using ifconfig.
1681 *
1682 **********************************************************************/
1683static void
1684ixgbe_media_status(struct ifnet * ifp, struct ifmediareq * ifmr)
1685{
1686	struct adapter *adapter = ifp->if_softc;
1687
1688	INIT_DEBUGOUT("ixgbe_media_status: begin");
1689	IXGBE_CORE_LOCK(adapter);
1690	ixgbe_update_link_status(adapter);
1691
1692	ifmr->ifm_status = IFM_AVALID;
1693	ifmr->ifm_active = IFM_ETHER;
1694
1695	if (!adapter->link_active) {
1696		IXGBE_CORE_UNLOCK(adapter);
1697		return;
1698	}
1699
1700	ifmr->ifm_status |= IFM_ACTIVE;
1701
1702	switch (adapter->link_speed) {
1703		case IXGBE_LINK_SPEED_1GB_FULL:
1704			ifmr->ifm_active |= IFM_1000_T | IFM_FDX;
1705			break;
1706		case IXGBE_LINK_SPEED_10GB_FULL:
1707			ifmr->ifm_active |= adapter->optics | IFM_FDX;
1708			break;
1709	}
1710
1711	IXGBE_CORE_UNLOCK(adapter);
1712
1713	return;
1714}
1715
1716/*********************************************************************
1717 *
1718 *  Media Ioctl callback
1719 *
1720 *  This routine is called when the user changes speed/duplex using
1721 *  media/mediopt option with ifconfig.
1722 *
1723 **********************************************************************/
1724static int
1725ixgbe_media_change(struct ifnet * ifp)
1726{
1727	struct adapter *adapter = ifp->if_softc;
1728	struct ifmedia *ifm = &adapter->media;
1729
1730	INIT_DEBUGOUT("ixgbe_media_change: begin");
1731
1732	if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
1733		return (EINVAL);
1734
1735        switch (IFM_SUBTYPE(ifm->ifm_media)) {
1736        case IFM_AUTO:
1737                adapter->hw.phy.autoneg_advertised =
1738		    IXGBE_LINK_SPEED_1GB_FULL | IXGBE_LINK_SPEED_10GB_FULL;
1739                break;
1740        default:
1741                device_printf(adapter->dev, "Only auto media type\n");
1742		return (EINVAL);
1743        }
1744
1745	return (0);
1746}
1747
1748/*********************************************************************
1749 *
1750 *  This routine maps the mbufs to tx descriptors, allowing the
1751 *  TX engine to transmit the packets.
1752 *  	- return 0 on success, positive on failure
1753 *
1754 **********************************************************************/
1755
1756static int
1757ixgbe_xmit(struct tx_ring *txr, struct mbuf *m_head)
1758{
1759	struct m_tag *mtag;
1760	struct adapter  *adapter = txr->adapter;
1761	struct ethercom *ec = &adapter->osdep.ec;
1762	u32		olinfo_status = 0, cmd_type_len;
1763	u32		paylen = 0;
1764	int             i, j, error;
1765	int		first, last = 0;
1766	bus_dmamap_t	map;
1767	struct ixgbe_tx_buf *txbuf, *txbuf_mapped;
1768	union ixgbe_adv_tx_desc *txd = NULL;
1769
1770	/* Basic descriptor defines */
1771        cmd_type_len = (IXGBE_ADVTXD_DTYP_DATA |
1772	    IXGBE_ADVTXD_DCMD_IFCS | IXGBE_ADVTXD_DCMD_DEXT);
1773
1774	if ((mtag = VLAN_OUTPUT_TAG(ec, m_head)) != NULL)
1775        	cmd_type_len |= IXGBE_ADVTXD_DCMD_VLE;
1776
1777        /*
1778         * Important to capture the first descriptor
1779         * used because it will contain the index of
1780         * the one we tell the hardware to report back
1781         */
1782        first = txr->next_avail_desc;
1783	txbuf = &txr->tx_buffers[first];
1784	txbuf_mapped = txbuf;
1785	map = txbuf->map;
1786
1787	/*
1788	 * Map the packet for DMA.
1789	 */
1790	error = bus_dmamap_load_mbuf(txr->txtag->dt_dmat, map,
1791	    m_head, BUS_DMA_NOWAIT);
1792
1793	switch (error) {
1794	case EAGAIN:
1795		adapter->eagain_tx_dma_setup.ev_count++;
1796		return EAGAIN;
1797	case ENOMEM:
1798		adapter->enomem_tx_dma_setup.ev_count++;
1799		return EAGAIN;
1800	case EFBIG:
1801		adapter->efbig_tx_dma_setup.ev_count++;
1802		return error;
1803	case EINVAL:
1804		adapter->einval_tx_dma_setup.ev_count++;
1805		return error;
1806	default:
1807		adapter->other_tx_dma_setup.ev_count++;
1808		return error;
1809	case 0:
1810		break;
1811	}
1812
1813	/* Make certain there are enough descriptors */
1814	if (map->dm_nsegs > txr->tx_avail - 2) {
1815		txr->no_desc_avail.ev_count++;
1816		ixgbe_dmamap_unload(txr->txtag, txbuf->map);
1817		return EAGAIN;
1818	}
1819
1820	/*
1821	** Set up the appropriate offload context
1822	** this becomes the first descriptor of
1823	** a packet.
1824	*/
1825	if (m_head->m_pkthdr.csum_flags & (M_CSUM_TSOv4|M_CSUM_TSOv6)) {
1826		if (ixgbe_tso_setup(txr, m_head, &paylen)) {
1827			cmd_type_len |= IXGBE_ADVTXD_DCMD_TSE;
1828			olinfo_status |= IXGBE_TXD_POPTS_IXSM << 8;
1829			olinfo_status |= IXGBE_TXD_POPTS_TXSM << 8;
1830			olinfo_status |= paylen << IXGBE_ADVTXD_PAYLEN_SHIFT;
1831			++adapter->tso_tx.ev_count;
1832		} else {
1833			++adapter->tso_err.ev_count;
1834			/* XXX unload DMA map! --dyoung */
1835			return ENXIO;
1836		}
1837	} else
1838		olinfo_status |= ixgbe_tx_ctx_setup(txr, m_head);
1839
1840#ifdef IXGBE_IEEE1588
1841        /* This is changing soon to an mtag detection */
1842        if (we detect this mbuf has a TSTAMP mtag)
1843                cmd_type_len |= IXGBE_ADVTXD_MAC_TSTAMP;
1844#endif
1845
1846#ifdef IXGBE_FDIR
1847	/* Do the flow director magic */
1848	if ((txr->atr_sample) && (!adapter->fdir_reinit)) {
1849		++txr->atr_count;
1850		if (txr->atr_count >= atr_sample_rate) {
1851			ixgbe_atr(txr, m_head);
1852			txr->atr_count = 0;
1853		}
1854	}
1855#endif
1856        /* Record payload length */
1857	if (paylen == 0)
1858        	olinfo_status |= m_head->m_pkthdr.len <<
1859		    IXGBE_ADVTXD_PAYLEN_SHIFT;
1860
1861	i = txr->next_avail_desc;
1862	for (j = 0; j < map->dm_nsegs; j++) {
1863		bus_size_t seglen;
1864		bus_addr_t segaddr;
1865
1866		txbuf = &txr->tx_buffers[i];
1867		txd = &txr->tx_base[i];
1868		seglen = map->dm_segs[j].ds_len;
1869		segaddr = htole64(map->dm_segs[j].ds_addr);
1870
1871		txd->read.buffer_addr = segaddr;
1872		txd->read.cmd_type_len = htole32(txr->txd_cmd |
1873		    cmd_type_len |seglen);
1874		txd->read.olinfo_status = htole32(olinfo_status);
1875		last = i; /* descriptor that will get completion IRQ */
1876
1877		if (++i == adapter->num_tx_desc)
1878			i = 0;
1879
1880		txbuf->m_head = NULL;
1881		txbuf->eop_index = -1;
1882	}
1883
1884	txd->read.cmd_type_len |=
1885	    htole32(IXGBE_TXD_CMD_EOP | IXGBE_TXD_CMD_RS);
1886	txr->tx_avail -= map->dm_nsegs;
1887	txr->next_avail_desc = i;
1888
1889	txbuf->m_head = m_head;
1890	/* We exchange the maps instead of copying because otherwise
1891	 * we end up with many pointers to the same map and we free
1892	 * one map twice in ixgbe_free_transmit_structures().  Who
1893	 * knows what other problems this caused.  --dyoung
1894	 */
1895	txr->tx_buffers[first].map = txbuf->map;
1896	txbuf->map = map;
1897	bus_dmamap_sync(txr->txtag->dt_dmat, map, 0, m_head->m_pkthdr.len,
1898	    BUS_DMASYNC_PREWRITE);
1899
1900        /* Set the index of the descriptor that will be marked done */
1901        txbuf = &txr->tx_buffers[first];
1902	txbuf->eop_index = last;
1903
1904        ixgbe_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map,
1905	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1906	/*
1907	 * Advance the Transmit Descriptor Tail (Tdt), this tells the
1908	 * hardware that this frame is available to transmit.
1909	 */
1910	++txr->total_packets.ev_count;
1911	IXGBE_WRITE_REG(&adapter->hw, IXGBE_TDT(txr->me), i);
1912
1913	return 0;
1914}
1915
1916static void
1917ixgbe_set_promisc(struct adapter *adapter)
1918{
1919	u_int32_t       reg_rctl;
1920	struct ifnet   *ifp = adapter->ifp;
1921
1922	reg_rctl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL);
1923	reg_rctl &= (~IXGBE_FCTRL_UPE);
1924	reg_rctl &= (~IXGBE_FCTRL_MPE);
1925	IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, reg_rctl);
1926
1927	if (ifp->if_flags & IFF_PROMISC) {
1928		reg_rctl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
1929		IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, reg_rctl);
1930	} else if (ifp->if_flags & IFF_ALLMULTI) {
1931		reg_rctl |= IXGBE_FCTRL_MPE;
1932		reg_rctl &= ~IXGBE_FCTRL_UPE;
1933		IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, reg_rctl);
1934	}
1935	return;
1936}
1937
1938
1939/*********************************************************************
1940 *  Multicast Update
1941 *
1942 *  This routine is called whenever multicast address list is updated.
1943 *
1944 **********************************************************************/
1945#define IXGBE_RAR_ENTRIES 16
1946
1947static void
1948ixgbe_set_multi(struct adapter *adapter)
1949{
1950	struct ether_multi *enm;
1951	struct ether_multistep step;
1952	u32	fctrl;
1953	u8	*mta;
1954	u8	*update_ptr;
1955	int	mcnt = 0;
1956	struct ethercom *ec = &adapter->osdep.ec;
1957	struct ifnet   *ifp = adapter->ifp;
1958
1959	IOCTL_DEBUGOUT("ixgbe_set_multi: begin");
1960
1961	mta = adapter->mta;
1962	bzero(mta, sizeof(u8) * IXGBE_ETH_LENGTH_OF_ADDRESS *
1963	    MAX_NUM_MULTICAST_ADDRESSES);
1964
1965	fctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL);
1966	fctrl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
1967	if (ifp->if_flags & IFF_PROMISC)
1968		fctrl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
1969	else if (ifp->if_flags & IFF_ALLMULTI) {
1970		fctrl |= IXGBE_FCTRL_MPE;
1971		fctrl &= ~IXGBE_FCTRL_UPE;
1972	} else
1973		fctrl &= ~(IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
1974
1975	IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, fctrl);
1976
1977	ETHER_FIRST_MULTI(step, ec, enm);
1978	while (enm != NULL) {
1979		if (memcmp(enm->enm_addrlo, enm->enm_addrhi,
1980		           ETHER_ADDR_LEN) != 0) {
1981			fctrl |= IXGBE_FCTRL_MPE;
1982			IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, fctrl);
1983			break;
1984		}
1985		bcopy(enm->enm_addrlo,
1986		    &mta[mcnt * IXGBE_ETH_LENGTH_OF_ADDRESS],
1987		    IXGBE_ETH_LENGTH_OF_ADDRESS);
1988		mcnt++;
1989		ETHER_NEXT_MULTI(step, enm);
1990	}
1991
1992	update_ptr = mta;
1993	ixgbe_update_mc_addr_list(&adapter->hw,
1994	    update_ptr, mcnt, ixgbe_mc_array_itr);
1995
1996	return;
1997}
1998
1999/*
2000 * This is an iterator function now needed by the multicast
2001 * shared code. It simply feeds the shared code routine the
2002 * addresses in the array of ixgbe_set_multi() one by one.
2003 */
2004static u8 *
2005ixgbe_mc_array_itr(struct ixgbe_hw *hw, u8 **update_ptr, u32 *vmdq)
2006{
2007	u8 *addr = *update_ptr;
2008	u8 *newptr;
2009	*vmdq = 0;
2010
2011	newptr = addr + IXGBE_ETH_LENGTH_OF_ADDRESS;
2012	*update_ptr = newptr;
2013	return addr;
2014}
2015
2016
2017/*********************************************************************
2018 *  Timer routine
2019 *
2020 *  This routine checks for link status,updates statistics,
2021 *  and runs the watchdog check.
2022 *
2023 **********************************************************************/
2024
2025static void
2026ixgbe_local_timer1(void *arg)
2027{
2028	struct adapter *adapter = arg;
2029	device_t	dev = adapter->dev;
2030	struct tx_ring *txr = adapter->tx_rings;
2031
2032	KASSERT(mutex_owned(&adapter->core_mtx));
2033
2034	/* Check for pluggable optics */
2035	if (adapter->sfp_probe)
2036		if (!ixgbe_sfp_probe(adapter))
2037			goto out; /* Nothing to do */
2038
2039	ixgbe_update_link_status(adapter);
2040	ixgbe_update_stats_counters(adapter);
2041
2042	/*
2043	 * If the interface has been paused
2044	 * then don't do the watchdog check
2045	 */
2046	if (IXGBE_READ_REG(&adapter->hw, IXGBE_TFCS) & IXGBE_TFCS_TXOFF)
2047		goto out;
2048
2049	/*
2050	** Check status on the TX queues for a hang
2051	*/
2052        for (int i = 0; i < adapter->num_queues; i++, txr++)
2053		if (txr->queue_status == IXGBE_QUEUE_HUNG)
2054			goto hung;
2055
2056out:
2057	ixgbe_rearm_queues(adapter, adapter->que_mask);
2058	callout_reset(&adapter->timer, hz, ixgbe_local_timer, adapter);
2059	return;
2060
2061hung:
2062	device_printf(adapter->dev, "Watchdog timeout -- resetting\n");
2063	device_printf(dev,"Queue(%d) tdh = %d, hw tdt = %d\n", txr->me,
2064	    IXGBE_READ_REG(&adapter->hw, IXGBE_TDH(txr->me)),
2065	    IXGBE_READ_REG(&adapter->hw, IXGBE_TDT(txr->me)));
2066	device_printf(dev,"TX(%d) desc avail = %d,"
2067	    "Next TX to Clean = %d\n",
2068	    txr->me, txr->tx_avail, txr->next_to_clean);
2069	adapter->ifp->if_flags &= ~IFF_RUNNING;
2070	adapter->watchdog_events.ev_count++;
2071	ixgbe_init_locked(adapter);
2072}
2073
2074static void
2075ixgbe_local_timer(void *arg)
2076{
2077	struct adapter *adapter = arg;
2078
2079	IXGBE_CORE_LOCK(adapter);
2080	ixgbe_local_timer1(adapter);
2081	IXGBE_CORE_UNLOCK(adapter);
2082}
2083
2084/*
2085** Note: this routine updates the OS on the link state
2086**	the real check of the hardware only happens with
2087**	a link interrupt.
2088*/
2089static void
2090ixgbe_update_link_status(struct adapter *adapter)
2091{
2092	struct ifnet	*ifp = adapter->ifp;
2093	struct tx_ring *txr = adapter->tx_rings;
2094	device_t dev = adapter->dev;
2095
2096
2097	if (adapter->link_up){
2098		if (adapter->link_active == FALSE) {
2099			if (bootverbose)
2100				device_printf(dev,"Link is up %d Gbps %s \n",
2101				    ((adapter->link_speed == 128)? 10:1),
2102				    "Full Duplex");
2103			adapter->link_active = TRUE;
2104			if_link_state_change(ifp, LINK_STATE_UP);
2105		}
2106	} else { /* Link down */
2107		if (adapter->link_active == TRUE) {
2108			if (bootverbose)
2109				device_printf(dev,"Link is Down\n");
2110			if_link_state_change(ifp, LINK_STATE_DOWN);
2111			adapter->link_active = FALSE;
2112			for (int i = 0; i < adapter->num_queues;
2113			    i++, txr++)
2114				txr->queue_status = IXGBE_QUEUE_IDLE;
2115		}
2116	}
2117
2118	return;
2119}
2120
2121
2122static void
2123ixgbe_ifstop(struct ifnet *ifp, int disable)
2124{
2125	struct adapter *adapter = ifp->if_softc;
2126
2127	IXGBE_CORE_LOCK(adapter);
2128	ixgbe_stop(adapter);
2129	IXGBE_CORE_UNLOCK(adapter);
2130}
2131
2132/*********************************************************************
2133 *
2134 *  This routine disables all traffic on the adapter by issuing a
2135 *  global reset on the MAC and deallocates TX/RX buffers.
2136 *
2137 **********************************************************************/
2138
2139static void
2140ixgbe_stop(void *arg)
2141{
2142	struct ifnet   *ifp;
2143	struct adapter *adapter = arg;
2144	struct ixgbe_hw *hw = &adapter->hw;
2145	ifp = adapter->ifp;
2146
2147	KASSERT(mutex_owned(&adapter->core_mtx));
2148
2149	INIT_DEBUGOUT("ixgbe_stop: begin\n");
2150	ixgbe_disable_intr(adapter);
2151
2152	/* Tell the stack that the interface is no longer active */
2153	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
2154
2155	ixgbe_reset_hw(hw);
2156	hw->adapter_stopped = FALSE;
2157	ixgbe_stop_adapter(hw);
2158	/* Turn off the laser */
2159	if (hw->phy.multispeed_fiber)
2160		ixgbe_disable_tx_laser(hw);
2161	callout_stop(&adapter->timer);
2162
2163	/* reprogram the RAR[0] in case user changed it. */
2164	ixgbe_set_rar(&adapter->hw, 0, adapter->hw.mac.addr, 0, IXGBE_RAH_AV);
2165
2166	return;
2167}
2168
2169
2170/*********************************************************************
2171 *
2172 *  Determine hardware revision.
2173 *
2174 **********************************************************************/
2175static void
2176ixgbe_identify_hardware(struct adapter *adapter)
2177{
2178	pcitag_t tag;
2179	pci_chipset_tag_t pc;
2180	pcireg_t subid, id;
2181	struct ixgbe_hw *hw = &adapter->hw;
2182
2183	pc = adapter->osdep.pc;
2184	tag = adapter->osdep.tag;
2185
2186	id = pci_conf_read(pc, tag, PCI_ID_REG);
2187	subid = pci_conf_read(pc, tag, PCI_SUBSYS_ID_REG);
2188
2189	/* Save off the information about this board */
2190	hw->vendor_id = PCI_VENDOR(id);
2191	hw->device_id = PCI_PRODUCT(id);
2192	hw->revision_id =
2193	    PCI_REVISION(pci_conf_read(pc, tag, PCI_CLASS_REG));
2194	hw->subsystem_vendor_id = PCI_SUBSYS_VENDOR(subid);
2195	hw->subsystem_device_id = PCI_SUBSYS_ID(subid);
2196
2197	/* We need this here to set the num_segs below */
2198	ixgbe_set_mac_type(hw);
2199
2200	/* Pick up the 82599 and VF settings */
2201	if (hw->mac.type != ixgbe_mac_82598EB) {
2202		hw->phy.smart_speed = ixgbe_smart_speed;
2203		adapter->num_segs = IXGBE_82599_SCATTER;
2204	} else
2205		adapter->num_segs = IXGBE_82598_SCATTER;
2206
2207	return;
2208}
2209
2210/*********************************************************************
2211 *
2212 *  Determine optic type
2213 *
2214 **********************************************************************/
2215static void
2216ixgbe_setup_optics(struct adapter *adapter)
2217{
2218	struct ixgbe_hw *hw = &adapter->hw;
2219	int		layer;
2220
2221	layer = ixgbe_get_supported_physical_layer(hw);
2222	switch (layer) {
2223		case IXGBE_PHYSICAL_LAYER_10GBASE_T:
2224			adapter->optics = IFM_10G_T;
2225			break;
2226		case IXGBE_PHYSICAL_LAYER_1000BASE_T:
2227			adapter->optics = IFM_1000_T;
2228			break;
2229		case IXGBE_PHYSICAL_LAYER_10GBASE_LR:
2230		case IXGBE_PHYSICAL_LAYER_10GBASE_LRM:
2231			adapter->optics = IFM_10G_LR;
2232			break;
2233		case IXGBE_PHYSICAL_LAYER_10GBASE_SR:
2234			adapter->optics = IFM_10G_SR;
2235			break;
2236		case IXGBE_PHYSICAL_LAYER_10GBASE_KX4:
2237		case IXGBE_PHYSICAL_LAYER_10GBASE_CX4:
2238			adapter->optics = IFM_10G_CX4;
2239			break;
2240		case IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU:
2241			adapter->optics = IFM_10G_TWINAX;
2242			break;
2243		case IXGBE_PHYSICAL_LAYER_1000BASE_KX:
2244		case IXGBE_PHYSICAL_LAYER_10GBASE_KR:
2245		case IXGBE_PHYSICAL_LAYER_10GBASE_XAUI:
2246		case IXGBE_PHYSICAL_LAYER_UNKNOWN:
2247		default:
2248			adapter->optics = IFM_ETHER | IFM_AUTO;
2249			break;
2250	}
2251	return;
2252}
2253
2254/*********************************************************************
2255 *
2256 *  Setup the Legacy or MSI Interrupt handler
2257 *
2258 **********************************************************************/
2259static int
2260ixgbe_allocate_legacy(struct adapter *adapter, const struct pci_attach_args *pa)
2261{
2262	device_t dev = adapter->dev;
2263	struct		ix_queue *que = adapter->queues;
2264	int rid = 0;
2265
2266	/* MSI RID at 1 */
2267	if (adapter->msix == 1)
2268		rid = 1;
2269
2270	/* We allocate a single interrupt resource */
2271 	if (pci_intr_map(pa, &adapter->osdep.ih) != 0) {
2272		aprint_error_dev(dev, "unable to map interrupt\n");
2273		return ENXIO;
2274	} else {
2275		aprint_normal_dev(dev, "interrupting at %s\n",
2276		    pci_intr_string(adapter->osdep.pc, adapter->osdep.ih));
2277	}
2278
2279	/*
2280	 * Try allocating a fast interrupt and the associated deferred
2281	 * processing contexts.
2282	 */
2283	que->que_si = softint_establish(SOFTINT_NET, ixgbe_handle_que, que);
2284
2285	/* Tasklets for Link, SFP and Multispeed Fiber */
2286	adapter->link_si =
2287	    softint_establish(SOFTINT_NET, ixgbe_handle_link, adapter);
2288	adapter->mod_si =
2289	    softint_establish(SOFTINT_NET, ixgbe_handle_mod, adapter);
2290	adapter->msf_si =
2291	    softint_establish(SOFTINT_NET, ixgbe_handle_msf, adapter);
2292
2293#ifdef IXGBE_FDIR
2294	adapter->fdir_si =
2295	    softint_establish(SOFTINT_NET, ixgbe_reinit_fdir, adapter);
2296#endif
2297	if (que->que_si == NULL ||
2298	    adapter->link_si == NULL ||
2299	    adapter->mod_si == NULL ||
2300#ifdef IXGBE_FDIR
2301	    adapter->fdir_si == NULL ||
2302#endif
2303	    adapter->msf_si == NULL) {
2304		aprint_error_dev(dev,
2305		    "could not establish software interrupts\n");
2306		return ENXIO;
2307	}
2308
2309	adapter->osdep.intr = pci_intr_establish(adapter->osdep.pc,
2310	    adapter->osdep.ih, IPL_NET, ixgbe_legacy_irq, que);
2311	if (adapter->osdep.intr == NULL) {
2312		aprint_error_dev(dev, "failed to register interrupt handler\n");
2313		softint_disestablish(que->que_si);
2314		softint_disestablish(adapter->link_si);
2315		softint_disestablish(adapter->mod_si);
2316		softint_disestablish(adapter->msf_si);
2317#ifdef IXGBE_FDIR
2318		softint_disestablish(adapter->fdir_si);
2319#endif
2320		return ENXIO;
2321	}
2322	/* For simplicity in the handlers */
2323	adapter->que_mask = IXGBE_EIMS_ENABLE_MASK;
2324
2325	return (0);
2326}
2327
2328
2329/*********************************************************************
2330 *
2331 *  Setup MSIX Interrupt resources and handlers
2332 *
2333 **********************************************************************/
2334static int
2335ixgbe_allocate_msix(struct adapter *adapter, const struct pci_attach_args *pa)
2336{
2337#if !defined(NETBSD_MSI_OR_MSIX)
2338	return 0;
2339#else
2340	device_t        dev = adapter->dev;
2341	struct 		ix_queue *que = adapter->queues;
2342	int 		error, rid, vector = 0;
2343
2344	for (int i = 0; i < adapter->num_queues; i++, vector++, que++) {
2345		rid = vector + 1;
2346		que->res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
2347		    RF_SHAREABLE | RF_ACTIVE);
2348		if (que->res == NULL) {
2349			aprint_error_dev(dev,"Unable to allocate"
2350		    	    " bus resource: que interrupt [%d]\n", vector);
2351			return (ENXIO);
2352		}
2353		/* Set the handler function */
2354		error = bus_setup_intr(dev, que->res,
2355		    INTR_TYPE_NET | INTR_MPSAFE, NULL,
2356		    ixgbe_msix_que, que, &que->tag);
2357		if (error) {
2358			que->res = NULL;
2359			aprint_error_dev(dev,
2360			    "Failed to register QUE handler\n");
2361			return error;
2362		}
2363#if __FreeBSD_version >= 800504
2364		bus_describe_intr(dev, que->res, que->tag, "que %d", i);
2365#endif
2366		que->msix = vector;
2367        	adapter->que_mask |= (u64)(1 << que->msix);
2368		/*
2369		** Bind the msix vector, and thus the
2370		** ring to the corresponding cpu.
2371		*/
2372		if (adapter->num_queues > 1)
2373			bus_bind_intr(dev, que->res, i);
2374
2375		que->que_si = softint_establish(ixgbe_handle_que, que);
2376		if (que->que_si == NULL) {
2377			aprint_error_dev(dev,
2378			    "could not establish software interrupt\n");
2379		}
2380	}
2381
2382	/* and Link */
2383	rid = vector + 1;
2384	adapter->res = bus_alloc_resource_any(dev,
2385    	    SYS_RES_IRQ, &rid, RF_SHAREABLE | RF_ACTIVE);
2386	if (!adapter->res) {
2387		aprint_error_dev(dev,"Unable to allocate bus resource: "
2388		    "Link interrupt [%d]\n", rid);
2389		return (ENXIO);
2390	}
2391	/* Set the link handler function */
2392	error = bus_setup_intr(dev, adapter->res,
2393	    INTR_TYPE_NET | INTR_MPSAFE, NULL,
2394	    ixgbe_msix_link, adapter, &adapter->tag);
2395	if (error) {
2396		adapter->res = NULL;
2397		aprint_error_dev(dev, "Failed to register LINK handler\n");
2398		return (error);
2399	}
2400#if __FreeBSD_version >= 800504
2401	bus_describe_intr(dev, adapter->res, adapter->tag, "link");
2402#endif
2403	adapter->linkvec = vector;
2404	/* Tasklets for Link, SFP and Multispeed Fiber */
2405	adapter->link_si =
2406	    softint_establish(SOFTINT_NET, ixgbe_handle_link, adapter);
2407	adapter->mod_si =
2408	    softint_establish(SOFTINT_NET, ixgbe_handle_mod, adapter);
2409	adapter->msf_si =
2410	    softint_establish(SOFTINT_NET, ixgbe_handle_msf, adapter);
2411#ifdef IXGBE_FDIR
2412	adapter->fdir_si =
2413	    softint_establish(SOFTINT_NET, ixgbe_reinit_fdir, adapter);
2414#endif
2415
2416	return (0);
2417#endif
2418}
2419
2420/*
2421 * Setup Either MSI/X or MSI
2422 */
2423static int
2424ixgbe_setup_msix(struct adapter *adapter)
2425{
2426#if !defined(NETBSD_MSI_OR_MSIX)
2427	return 0;
2428#else
2429	device_t dev = adapter->dev;
2430	int rid, want, queues, msgs;
2431
2432	/* Override by tuneable */
2433	if (ixgbe_enable_msix == 0)
2434		goto msi;
2435
2436	/* First try MSI/X */
2437	rid = PCI_BAR(MSIX_82598_BAR);
2438	adapter->msix_mem = bus_alloc_resource_any(dev,
2439	    SYS_RES_MEMORY, &rid, RF_ACTIVE);
2440       	if (!adapter->msix_mem) {
2441		rid += 4;	/* 82599 maps in higher BAR */
2442		adapter->msix_mem = bus_alloc_resource_any(dev,
2443		    SYS_RES_MEMORY, &rid, RF_ACTIVE);
2444	}
2445       	if (!adapter->msix_mem) {
2446		/* May not be enabled */
2447		device_printf(adapter->dev,
2448		    "Unable to map MSIX table \n");
2449		goto msi;
2450	}
2451
2452	msgs = pci_msix_count(dev);
2453	if (msgs == 0) { /* system has msix disabled */
2454		bus_release_resource(dev, SYS_RES_MEMORY,
2455		    rid, adapter->msix_mem);
2456		adapter->msix_mem = NULL;
2457		goto msi;
2458	}
2459
2460	/* Figure out a reasonable auto config value */
2461	queues = (mp_ncpus > (msgs-1)) ? (msgs-1) : mp_ncpus;
2462
2463	if (ixgbe_num_queues != 0)
2464		queues = ixgbe_num_queues;
2465	/* Set max queues to 8 when autoconfiguring */
2466	else if ((ixgbe_num_queues == 0) && (queues > 8))
2467		queues = 8;
2468
2469	/*
2470	** Want one vector (RX/TX pair) per queue
2471	** plus an additional for Link.
2472	*/
2473	want = queues + 1;
2474	if (msgs >= want)
2475		msgs = want;
2476	else {
2477               	device_printf(adapter->dev,
2478		    "MSIX Configuration Problem, "
2479		    "%d vectors but %d queues wanted!\n",
2480		    msgs, want);
2481		return (0); /* Will go to Legacy setup */
2482	}
2483	if ((msgs) && pci_alloc_msix(dev, &msgs) == 0) {
2484               	device_printf(adapter->dev,
2485		    "Using MSIX interrupts with %d vectors\n", msgs);
2486		adapter->num_queues = queues;
2487		return (msgs);
2488	}
2489msi:
2490       	msgs = pci_msi_count(dev);
2491       	if (msgs == 1 && pci_alloc_msi(dev, &msgs) == 0)
2492               	device_printf(adapter->dev,"Using MSI interrupt\n");
2493	return (msgs);
2494#endif
2495}
2496
2497
2498static int
2499ixgbe_allocate_pci_resources(struct adapter *adapter, const struct pci_attach_args *pa)
2500{
2501	pcireg_t	memtype;
2502	device_t        dev = adapter->dev;
2503	bus_addr_t addr;
2504	int flags;
2505
2506	memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, PCI_BAR(0));
2507	switch (memtype) {
2508	case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT:
2509	case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT:
2510		adapter->osdep.mem_bus_space_tag = pa->pa_memt;
2511		if (pci_mapreg_info(pa->pa_pc, pa->pa_tag, PCI_BAR(0),
2512	              memtype, &addr, &adapter->osdep.mem_size, &flags) != 0)
2513			goto map_err;
2514		if ((flags & BUS_SPACE_MAP_PREFETCHABLE) != 0) {
2515			aprint_normal_dev(dev, "clearing prefetchable bit\n");
2516			flags &= ~BUS_SPACE_MAP_PREFETCHABLE;
2517		}
2518		if (bus_space_map(adapter->osdep.mem_bus_space_tag, addr,
2519		     adapter->osdep.mem_size, flags,
2520		     &adapter->osdep.mem_bus_space_handle) != 0) {
2521map_err:
2522			adapter->osdep.mem_size = 0;
2523			aprint_error_dev(dev, "unable to map BAR0\n");
2524			return ENXIO;
2525		}
2526		break;
2527	default:
2528		aprint_error_dev(dev, "unexpected type on BAR0\n");
2529		return ENXIO;
2530	}
2531
2532	/* Legacy defaults */
2533	adapter->num_queues = 1;
2534	adapter->hw.back = &adapter->osdep;
2535
2536	/*
2537	** Now setup MSI or MSI/X, should
2538	** return us the number of supported
2539	** vectors. (Will be 1 for MSI)
2540	*/
2541	adapter->msix = ixgbe_setup_msix(adapter);
2542	return (0);
2543}
2544
2545static void
2546ixgbe_free_pci_resources(struct adapter * adapter)
2547{
2548#if defined(NETBSD_MSI_OR_MSIX)
2549	struct 		ix_queue *que = adapter->queues;
2550#endif
2551	device_t	dev = adapter->dev;
2552	int		rid, memrid;
2553
2554	printf("%s: enter %s\n", device_xname(dev), __func__);
2555
2556	if (adapter->hw.mac.type == ixgbe_mac_82598EB)
2557		memrid = PCI_BAR(MSIX_82598_BAR);
2558	else
2559		memrid = PCI_BAR(MSIX_82599_BAR);
2560
2561#if defined(NETBSD_MSI_OR_MSIX)
2562	/*
2563	** There is a slight possibility of a failure mode
2564	** in attach that will result in entering this function
2565	** before interrupt resources have been initialized, and
2566	** in that case we do not want to execute the loops below
2567	** We can detect this reliably by the state of the adapter
2568	** res pointer.
2569	*/
2570	if (adapter->res == NULL)
2571		goto mem;
2572
2573	/*
2574	**  Release all msix queue resources:
2575	*/
2576	for (int i = 0; i < adapter->num_queues; i++, que++) {
2577		rid = que->msix + 1;
2578		if (que->tag != NULL) {
2579			bus_teardown_intr(dev, que->res, que->tag);
2580			que->tag = NULL;
2581		}
2582		if (que->res != NULL)
2583			bus_release_resource(dev, SYS_RES_IRQ, rid, que->res);
2584	}
2585#endif
2586
2587	/* Clean the Legacy or Link interrupt last */
2588	if (adapter->linkvec) /* we are doing MSIX */
2589		rid = adapter->linkvec + 1;
2590	else
2591		(adapter->msix != 0) ? (rid = 1):(rid = 0);
2592
2593	printf("%s: disestablishing interrupt handler\n", device_xname(dev));
2594	pci_intr_disestablish(adapter->osdep.pc, adapter->osdep.intr);
2595	adapter->osdep.intr = NULL;
2596
2597#if defined(NETBSD_MSI_OR_MSIX)
2598mem:
2599	if (adapter->msix)
2600		pci_release_msi(dev);
2601
2602	if (adapter->msix_mem != NULL)
2603		bus_release_resource(dev, SYS_RES_MEMORY,
2604		    memrid, adapter->msix_mem);
2605#endif
2606
2607	if (adapter->osdep.mem_size != 0) {
2608		bus_space_unmap(adapter->osdep.mem_bus_space_tag,
2609		    adapter->osdep.mem_bus_space_handle,
2610		    adapter->osdep.mem_size);
2611	}
2612
2613	return;
2614}
2615
2616/*********************************************************************
2617 *
2618 *  Setup networking device structure and register an interface.
2619 *
2620 **********************************************************************/
2621static int
2622ixgbe_setup_interface(device_t dev, struct adapter *adapter)
2623{
2624	struct ethercom *ec = &adapter->osdep.ec;
2625	struct ixgbe_hw *hw = &adapter->hw;
2626	struct ifnet   *ifp;
2627
2628	INIT_DEBUGOUT("ixgbe_setup_interface: begin");
2629
2630	ifp = adapter->ifp = &ec->ec_if;
2631	strlcpy(ifp->if_xname, device_xname(dev), IFNAMSIZ);
2632	ifp->if_mtu = ETHERMTU;
2633	ifp->if_baudrate = 1000000000;
2634	ifp->if_init = ixgbe_init;
2635	ifp->if_stop = ixgbe_ifstop;
2636	ifp->if_softc = adapter;
2637	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
2638	ifp->if_ioctl = ixgbe_ioctl;
2639	ifp->if_start = ixgbe_start;
2640#if __FreeBSD_version >= 800000
2641	ifp->if_transmit = ixgbe_mq_start;
2642	ifp->if_qflush = ixgbe_qflush;
2643#endif
2644	ifp->if_snd.ifq_maxlen = adapter->num_tx_desc - 2;
2645
2646	if_attach(ifp);
2647	ether_ifattach(ifp, adapter->hw.mac.addr);
2648	ether_set_ifflags_cb(ec, ixgbe_ifflags_cb);
2649
2650	adapter->max_frame_size =
2651	    ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
2652
2653	/*
2654	 * Tell the upper layer(s) we support long frames.
2655	 */
2656	ifp->if_hdrlen = sizeof(struct ether_vlan_header);
2657
2658	ifp->if_capabilities |= IFCAP_HWCSUM | IFCAP_TSOv4;
2659	ifp->if_capenable = 0;
2660
2661	ec->ec_capabilities |= ETHERCAP_VLAN_HWCSUM;
2662	ec->ec_capabilities |= ETHERCAP_VLAN_HWTAGGING | ETHERCAP_VLAN_MTU;
2663	ec->ec_capabilities |= ETHERCAP_JUMBO_MTU;
2664	ec->ec_capenable = ec->ec_capabilities;
2665
2666	/* Don't enable LRO by default */
2667	ifp->if_capabilities |= IFCAP_LRO;
2668
2669	/*
2670	** Dont turn this on by default, if vlans are
2671	** created on another pseudo device (eg. lagg)
2672	** then vlan events are not passed thru, breaking
2673	** operation, but with HW FILTER off it works. If
2674	** using vlans directly on the em driver you can
2675	** enable this and get full hardware tag filtering.
2676	*/
2677	ec->ec_capabilities |= ETHERCAP_VLAN_HWFILTER;
2678
2679	/*
2680	 * Specify the media types supported by this adapter and register
2681	 * callbacks to update media and link information
2682	 */
2683	ifmedia_init(&adapter->media, IFM_IMASK, ixgbe_media_change,
2684		     ixgbe_media_status);
2685	ifmedia_add(&adapter->media, IFM_ETHER | adapter->optics, 0, NULL);
2686	ifmedia_set(&adapter->media, IFM_ETHER | adapter->optics);
2687	if (hw->device_id == IXGBE_DEV_ID_82598AT) {
2688		ifmedia_add(&adapter->media,
2689		    IFM_ETHER | IFM_1000_T | IFM_FDX, 0, NULL);
2690		ifmedia_add(&adapter->media,
2691		    IFM_ETHER | IFM_1000_T, 0, NULL);
2692	}
2693	ifmedia_add(&adapter->media, IFM_ETHER | IFM_AUTO, 0, NULL);
2694	ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO);
2695
2696	return (0);
2697}
2698
2699static void
2700ixgbe_config_link(struct adapter *adapter)
2701{
2702	struct ixgbe_hw *hw = &adapter->hw;
2703	u32	autoneg, err = 0;
2704	bool	sfp, negotiate;
2705
2706	sfp = ixgbe_is_sfp(hw);
2707
2708	if (sfp) {
2709		if (hw->phy.multispeed_fiber) {
2710			hw->mac.ops.setup_sfp(hw);
2711			ixgbe_enable_tx_laser(hw);
2712			softint_schedule(adapter->msf_si);
2713		} else {
2714			softint_schedule(adapter->mod_si);
2715		}
2716	} else {
2717		if (hw->mac.ops.check_link)
2718			err = ixgbe_check_link(hw, &autoneg,
2719			    &adapter->link_up, FALSE);
2720		if (err)
2721			goto out;
2722		autoneg = hw->phy.autoneg_advertised;
2723		if ((!autoneg) && (hw->mac.ops.get_link_capabilities))
2724                	err  = hw->mac.ops.get_link_capabilities(hw,
2725			    &autoneg, &negotiate);
2726		if (err)
2727			goto out;
2728		if (hw->mac.ops.setup_link)
2729                	err = hw->mac.ops.setup_link(hw, autoneg,
2730			    negotiate, adapter->link_up);
2731	}
2732out:
2733	return;
2734}
2735
2736/********************************************************************
2737 * Manage DMA'able memory.
2738 *******************************************************************/
2739
2740static int
2741ixgbe_dma_malloc(struct adapter *adapter, const bus_size_t size,
2742		struct ixgbe_dma_alloc *dma, const int mapflags)
2743{
2744	device_t dev = adapter->dev;
2745	int             r, rsegs;
2746
2747	r = ixgbe_dma_tag_create(adapter->osdep.dmat,	/* parent */
2748			       DBA_ALIGN, 0,	/* alignment, bounds */
2749			       size,	/* maxsize */
2750			       1,	/* nsegments */
2751			       size,	/* maxsegsize */
2752			       BUS_DMA_ALLOCNOW,	/* flags */
2753			       &dma->dma_tag);
2754	if (r != 0) {
2755		aprint_error_dev(dev,
2756		    "%s: ixgbe_dma_tag_create failed; error %d\n", __func__, r);
2757		goto fail_0;
2758	}
2759
2760	r = bus_dmamem_alloc(dma->dma_tag->dt_dmat,
2761		size,
2762		dma->dma_tag->dt_alignment,
2763		dma->dma_tag->dt_boundary,
2764		&dma->dma_seg, 1, &rsegs, BUS_DMA_NOWAIT);
2765	if (r != 0) {
2766		aprint_error_dev(dev,
2767		    "%s: bus_dmamem_alloc failed; error %d\n", __func__, r);
2768		goto fail_1;
2769	}
2770
2771	r = bus_dmamem_map(dma->dma_tag->dt_dmat, &dma->dma_seg, rsegs,
2772	    size, &dma->dma_vaddr, BUS_DMA_NOWAIT);
2773	if (r != 0) {
2774		aprint_error_dev(dev, "%s: bus_dmamem_map failed; error %d\n",
2775		    __func__, r);
2776		goto fail_2;
2777	}
2778
2779	r = ixgbe_dmamap_create(dma->dma_tag, 0, &dma->dma_map);
2780	if (r != 0) {
2781		aprint_error_dev(dev, "%s: bus_dmamem_map failed; error %d\n",
2782		    __func__, r);
2783		goto fail_3;
2784	}
2785
2786	r = bus_dmamap_load(dma->dma_tag->dt_dmat, dma->dma_map, dma->dma_vaddr,
2787			    size,
2788			    NULL,
2789			    mapflags | BUS_DMA_NOWAIT);
2790	if (r != 0) {
2791		aprint_error_dev(dev, "%s: bus_dmamap_load failed; error %d\n",
2792		    __func__, r);
2793		goto fail_4;
2794	}
2795	dma->dma_paddr = dma->dma_map->dm_segs[0].ds_addr;
2796	dma->dma_size = size;
2797	return 0;
2798fail_4:
2799	ixgbe_dmamap_destroy(dma->dma_tag, dma->dma_map);
2800fail_3:
2801	bus_dmamem_unmap(dma->dma_tag->dt_dmat, dma->dma_vaddr, size);
2802fail_2:
2803	bus_dmamem_free(dma->dma_tag->dt_dmat, &dma->dma_seg, rsegs);
2804fail_1:
2805	ixgbe_dma_tag_destroy(dma->dma_tag);
2806fail_0:
2807	return r;
2808}
2809
2810static void
2811ixgbe_dma_free(struct adapter *adapter, struct ixgbe_dma_alloc *dma)
2812{
2813	bus_dmamap_sync(dma->dma_tag->dt_dmat, dma->dma_map, 0, dma->dma_size,
2814	    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
2815	ixgbe_dmamap_unload(dma->dma_tag, dma->dma_map);
2816	bus_dmamem_free(dma->dma_tag->dt_dmat, &dma->dma_seg, 1);
2817	ixgbe_dma_tag_destroy(dma->dma_tag);
2818}
2819
2820
2821/*********************************************************************
2822 *
2823 *  Allocate memory for the transmit and receive rings, and then
2824 *  the descriptors associated with each, called only once at attach.
2825 *
2826 **********************************************************************/
2827static int
2828ixgbe_allocate_queues(struct adapter *adapter)
2829{
2830	device_t	dev = adapter->dev;
2831	struct ix_queue	*que;
2832	struct tx_ring	*txr;
2833	struct rx_ring	*rxr;
2834	int rsize, tsize, error = IXGBE_SUCCESS;
2835	int txconf = 0, rxconf = 0;
2836
2837        /* First allocate the top level queue structs */
2838        if (!(adapter->queues =
2839            (struct ix_queue *) malloc(sizeof(struct ix_queue) *
2840            adapter->num_queues, M_DEVBUF, M_NOWAIT | M_ZERO))) {
2841                aprint_error_dev(dev, "Unable to allocate queue memory\n");
2842                error = ENOMEM;
2843                goto fail;
2844        }
2845
2846	/* First allocate the TX ring struct memory */
2847	if (!(adapter->tx_rings =
2848	    (struct tx_ring *) malloc(sizeof(struct tx_ring) *
2849	    adapter->num_queues, M_DEVBUF, M_NOWAIT | M_ZERO))) {
2850		aprint_error_dev(dev, "Unable to allocate TX ring memory\n");
2851		error = ENOMEM;
2852		goto tx_fail;
2853	}
2854
2855	/* Next allocate the RX */
2856	if (!(adapter->rx_rings =
2857	    (struct rx_ring *) malloc(sizeof(struct rx_ring) *
2858	    adapter->num_queues, M_DEVBUF, M_NOWAIT | M_ZERO))) {
2859		aprint_error_dev(dev, "Unable to allocate RX ring memory\n");
2860		error = ENOMEM;
2861		goto rx_fail;
2862	}
2863
2864	/* For the ring itself */
2865	tsize = roundup2(adapter->num_tx_desc *
2866	    sizeof(union ixgbe_adv_tx_desc), DBA_ALIGN);
2867
2868	/*
2869	 * Now set up the TX queues, txconf is needed to handle the
2870	 * possibility that things fail midcourse and we need to
2871	 * undo memory gracefully
2872	 */
2873	for (int i = 0; i < adapter->num_queues; i++, txconf++) {
2874		/* Set up some basics */
2875		txr = &adapter->tx_rings[i];
2876		txr->adapter = adapter;
2877		txr->me = i;
2878
2879		/* Initialize the TX side lock */
2880		snprintf(txr->mtx_name, sizeof(txr->mtx_name), "%s:tx(%d)",
2881		    device_xname(dev), txr->me);
2882		mutex_init(&txr->tx_mtx, MUTEX_DEFAULT, IPL_NET);
2883
2884		if (ixgbe_dma_malloc(adapter, tsize,
2885			&txr->txdma, BUS_DMA_NOWAIT)) {
2886			aprint_error_dev(dev,
2887			    "Unable to allocate TX Descriptor memory\n");
2888			error = ENOMEM;
2889			goto err_tx_desc;
2890		}
2891		txr->tx_base = (union ixgbe_adv_tx_desc *)txr->txdma.dma_vaddr;
2892		bzero((void *)txr->tx_base, tsize);
2893
2894        	/* Now allocate transmit buffers for the ring */
2895        	if (ixgbe_allocate_transmit_buffers(txr)) {
2896			aprint_error_dev(dev,
2897			    "Critical Failure setting up transmit buffers\n");
2898			error = ENOMEM;
2899			goto err_tx_desc;
2900        	}
2901#if __FreeBSD_version >= 800000
2902		/* Allocate a buf ring */
2903		txr->br = buf_ring_alloc(IXGBE_BR_SIZE, M_DEVBUF,
2904		    M_WAITOK, &txr->tx_mtx);
2905		if (txr->br == NULL) {
2906			aprint_error_dev(dev,
2907			    "Critical Failure setting up buf ring\n");
2908			error = ENOMEM;
2909			goto err_tx_desc;
2910        	}
2911#endif
2912	}
2913
2914	/*
2915	 * Next the RX queues...
2916	 */
2917	rsize = roundup2(adapter->num_rx_desc *
2918	    sizeof(union ixgbe_adv_rx_desc), DBA_ALIGN);
2919	for (int i = 0; i < adapter->num_queues; i++, rxconf++) {
2920		rxr = &adapter->rx_rings[i];
2921		/* Set up some basics */
2922		rxr->adapter = adapter;
2923		rxr->me = i;
2924
2925		/* Initialize the RX side lock */
2926		snprintf(rxr->mtx_name, sizeof(rxr->mtx_name), "%s:rx(%d)",
2927		    device_xname(dev), rxr->me);
2928		mutex_init(&rxr->rx_mtx, MUTEX_DEFAULT, IPL_NET);
2929
2930		if (ixgbe_dma_malloc(adapter, rsize,
2931			&rxr->rxdma, BUS_DMA_NOWAIT)) {
2932			aprint_error_dev(dev,
2933			    "Unable to allocate RxDescriptor memory\n");
2934			error = ENOMEM;
2935			goto err_rx_desc;
2936		}
2937		rxr->rx_base = (union ixgbe_adv_rx_desc *)rxr->rxdma.dma_vaddr;
2938		bzero((void *)rxr->rx_base, rsize);
2939
2940        	/* Allocate receive buffers for the ring*/
2941		if (ixgbe_allocate_receive_buffers(rxr)) {
2942			aprint_error_dev(dev,
2943			    "Critical Failure setting up receive buffers\n");
2944			error = ENOMEM;
2945			goto err_rx_desc;
2946		}
2947	}
2948
2949	/*
2950	** Finally set up the queue holding structs
2951	*/
2952	for (int i = 0; i < adapter->num_queues; i++) {
2953		que = &adapter->queues[i];
2954		que->adapter = adapter;
2955		que->txr = &adapter->tx_rings[i];
2956		que->rxr = &adapter->rx_rings[i];
2957	}
2958
2959	return (0);
2960
2961err_rx_desc:
2962	for (rxr = adapter->rx_rings; rxconf > 0; rxr++, rxconf--)
2963		ixgbe_dma_free(adapter, &rxr->rxdma);
2964err_tx_desc:
2965	for (txr = adapter->tx_rings; txconf > 0; txr++, txconf--)
2966		ixgbe_dma_free(adapter, &txr->txdma);
2967	free(adapter->rx_rings, M_DEVBUF);
2968rx_fail:
2969	free(adapter->tx_rings, M_DEVBUF);
2970tx_fail:
2971	free(adapter->queues, M_DEVBUF);
2972fail:
2973	return (error);
2974}
2975
2976/*********************************************************************
2977 *
2978 *  Allocate memory for tx_buffer structures. The tx_buffer stores all
2979 *  the information needed to transmit a packet on the wire. This is
2980 *  called only once at attach, setup is done every reset.
2981 *
2982 **********************************************************************/
2983static int
2984ixgbe_allocate_transmit_buffers(struct tx_ring *txr)
2985{
2986	struct adapter *adapter = txr->adapter;
2987	device_t dev = adapter->dev;
2988	struct ixgbe_tx_buf *txbuf;
2989	int error, i;
2990
2991	/*
2992	 * Setup DMA descriptor areas.
2993	 */
2994	if ((error = ixgbe_dma_tag_create(adapter->osdep.dmat,	/* parent */
2995			       1, 0,		/* alignment, bounds */
2996			       IXGBE_TSO_SIZE,		/* maxsize */
2997			       adapter->num_segs,	/* nsegments */
2998			       PAGE_SIZE,		/* maxsegsize */
2999			       0,			/* flags */
3000			       &txr->txtag))) {
3001		aprint_error_dev(dev,"Unable to allocate TX DMA tag\n");
3002		goto fail;
3003	}
3004
3005	if (!(txr->tx_buffers =
3006	    (struct ixgbe_tx_buf *) malloc(sizeof(struct ixgbe_tx_buf) *
3007	    adapter->num_tx_desc, M_DEVBUF, M_NOWAIT | M_ZERO))) {
3008		aprint_error_dev(dev, "Unable to allocate tx_buffer memory\n");
3009		error = ENOMEM;
3010		goto fail;
3011	}
3012
3013        /* Create the descriptor buffer dma maps */
3014	txbuf = txr->tx_buffers;
3015	for (i = 0; i < adapter->num_tx_desc; i++, txbuf++) {
3016		error = ixgbe_dmamap_create(txr->txtag, 0, &txbuf->map);
3017		if (error != 0) {
3018			aprint_error_dev(dev, "Unable to create TX DMA map\n");
3019			goto fail;
3020		}
3021	}
3022
3023	return 0;
3024fail:
3025	/* We free all, it handles case where we are in the middle */
3026	ixgbe_free_transmit_structures(adapter);
3027	return (error);
3028}
3029
3030/*********************************************************************
3031 *
3032 *  Initialize a transmit ring.
3033 *
3034 **********************************************************************/
3035static void
3036ixgbe_setup_transmit_ring(struct tx_ring *txr)
3037{
3038	struct adapter *adapter = txr->adapter;
3039	struct ixgbe_tx_buf *txbuf;
3040	int i;
3041
3042	/* Clear the old ring contents */
3043	IXGBE_TX_LOCK(txr);
3044	bzero((void *)txr->tx_base,
3045	      (sizeof(union ixgbe_adv_tx_desc)) * adapter->num_tx_desc);
3046	/* Reset indices */
3047	txr->next_avail_desc = 0;
3048	txr->next_to_clean = 0;
3049
3050	/* Free any existing tx buffers. */
3051        txbuf = txr->tx_buffers;
3052	for (i = 0; i < adapter->num_tx_desc; i++, txbuf++) {
3053		if (txbuf->m_head != NULL) {
3054			bus_dmamap_sync(txr->txtag->dt_dmat, txbuf->map,
3055			    0, txbuf->m_head->m_pkthdr.len,
3056			    BUS_DMASYNC_POSTWRITE);
3057			ixgbe_dmamap_unload(txr->txtag, txbuf->map);
3058			m_freem(txbuf->m_head);
3059			txbuf->m_head = NULL;
3060		}
3061		/* Clear the EOP index */
3062		txbuf->eop_index = -1;
3063        }
3064
3065#ifdef IXGBE_FDIR
3066	/* Set the rate at which we sample packets */
3067	if (adapter->hw.mac.type != ixgbe_mac_82598EB)
3068		txr->atr_sample = atr_sample_rate;
3069#endif
3070
3071	/* Set number of descriptors available */
3072	txr->tx_avail = adapter->num_tx_desc;
3073
3074	ixgbe_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map,
3075	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
3076	IXGBE_TX_UNLOCK(txr);
3077}
3078
3079/*********************************************************************
3080 *
3081 *  Initialize all transmit rings.
3082 *
3083 **********************************************************************/
3084static int
3085ixgbe_setup_transmit_structures(struct adapter *adapter)
3086{
3087	struct tx_ring *txr = adapter->tx_rings;
3088
3089	for (int i = 0; i < adapter->num_queues; i++, txr++)
3090		ixgbe_setup_transmit_ring(txr);
3091
3092	return (0);
3093}
3094
3095/*********************************************************************
3096 *
3097 *  Enable transmit unit.
3098 *
3099 **********************************************************************/
3100static void
3101ixgbe_initialize_transmit_units(struct adapter *adapter)
3102{
3103	struct tx_ring	*txr = adapter->tx_rings;
3104	struct ixgbe_hw	*hw = &adapter->hw;
3105
3106	/* Setup the Base and Length of the Tx Descriptor Ring */
3107
3108	for (int i = 0; i < adapter->num_queues; i++, txr++) {
3109		u64	tdba = txr->txdma.dma_paddr;
3110		u32	txctrl;
3111
3112		IXGBE_WRITE_REG(hw, IXGBE_TDBAL(i),
3113		       (tdba & 0x00000000ffffffffULL));
3114		IXGBE_WRITE_REG(hw, IXGBE_TDBAH(i), (tdba >> 32));
3115		IXGBE_WRITE_REG(hw, IXGBE_TDLEN(i),
3116		    adapter->num_tx_desc * sizeof(struct ixgbe_legacy_tx_desc));
3117
3118		/* Setup the HW Tx Head and Tail descriptor pointers */
3119		IXGBE_WRITE_REG(hw, IXGBE_TDH(i), 0);
3120		IXGBE_WRITE_REG(hw, IXGBE_TDT(i), 0);
3121
3122		/* Setup Transmit Descriptor Cmd Settings */
3123		txr->txd_cmd = IXGBE_TXD_CMD_IFCS;
3124		txr->queue_status = IXGBE_QUEUE_IDLE;
3125
3126		/* Disable Head Writeback */
3127		switch (hw->mac.type) {
3128		case ixgbe_mac_82598EB:
3129			txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(i));
3130			break;
3131		case ixgbe_mac_82599EB:
3132		default:
3133			txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(i));
3134			break;
3135                }
3136		txctrl &= ~IXGBE_DCA_TXCTRL_TX_WB_RO_EN;
3137		switch (hw->mac.type) {
3138		case ixgbe_mac_82598EB:
3139			IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(i), txctrl);
3140			break;
3141		case ixgbe_mac_82599EB:
3142		default:
3143			IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL_82599(i), txctrl);
3144			break;
3145		}
3146
3147	}
3148
3149	if (hw->mac.type != ixgbe_mac_82598EB) {
3150		u32 dmatxctl, rttdcs;
3151		dmatxctl = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
3152		dmatxctl |= IXGBE_DMATXCTL_TE;
3153		IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, dmatxctl);
3154		/* Disable arbiter to set MTQC */
3155		rttdcs = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
3156		rttdcs |= IXGBE_RTTDCS_ARBDIS;
3157		IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs);
3158		IXGBE_WRITE_REG(hw, IXGBE_MTQC, IXGBE_MTQC_64Q_1PB);
3159		rttdcs &= ~IXGBE_RTTDCS_ARBDIS;
3160		IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs);
3161	}
3162
3163	return;
3164}
3165
3166/*********************************************************************
3167 *
3168 *  Free all transmit rings.
3169 *
3170 **********************************************************************/
3171static void
3172ixgbe_free_transmit_structures(struct adapter *adapter)
3173{
3174	struct tx_ring *txr = adapter->tx_rings;
3175
3176	for (int i = 0; i < adapter->num_queues; i++, txr++) {
3177		IXGBE_TX_LOCK(txr);
3178		ixgbe_free_transmit_buffers(txr);
3179		ixgbe_dma_free(adapter, &txr->txdma);
3180		IXGBE_TX_UNLOCK(txr);
3181		IXGBE_TX_LOCK_DESTROY(txr);
3182	}
3183	free(adapter->tx_rings, M_DEVBUF);
3184}
3185
3186/*********************************************************************
3187 *
3188 *  Free transmit ring related data structures.
3189 *
3190 **********************************************************************/
3191static void
3192ixgbe_free_transmit_buffers(struct tx_ring *txr)
3193{
3194	struct adapter *adapter = txr->adapter;
3195	struct ixgbe_tx_buf *tx_buffer;
3196	int             i;
3197
3198	INIT_DEBUGOUT("free_transmit_ring: begin");
3199
3200	if (txr->tx_buffers == NULL)
3201		return;
3202
3203	tx_buffer = txr->tx_buffers;
3204	for (i = 0; i < adapter->num_tx_desc; i++, tx_buffer++) {
3205		if (tx_buffer->m_head != NULL) {
3206			bus_dmamap_sync(txr->txtag->dt_dmat, tx_buffer->map,
3207			    0, tx_buffer->m_head->m_pkthdr.len,
3208			    BUS_DMASYNC_POSTWRITE);
3209			ixgbe_dmamap_unload(txr->txtag, tx_buffer->map);
3210			m_freem(tx_buffer->m_head);
3211			tx_buffer->m_head = NULL;
3212			if (tx_buffer->map != NULL) {
3213				ixgbe_dmamap_destroy(txr->txtag,
3214				    tx_buffer->map);
3215				tx_buffer->map = NULL;
3216			}
3217		} else if (tx_buffer->map != NULL) {
3218			ixgbe_dmamap_unload(txr->txtag, tx_buffer->map);
3219			ixgbe_dmamap_destroy(txr->txtag, tx_buffer->map);
3220			tx_buffer->map = NULL;
3221		}
3222	}
3223#if __FreeBSD_version >= 800000
3224	if (txr->br != NULL)
3225		buf_ring_free(txr->br, M_DEVBUF);
3226#endif
3227	if (txr->tx_buffers != NULL) {
3228		free(txr->tx_buffers, M_DEVBUF);
3229		txr->tx_buffers = NULL;
3230	}
3231	if (txr->txtag != NULL) {
3232		ixgbe_dma_tag_destroy(txr->txtag);
3233		txr->txtag = NULL;
3234	}
3235	return;
3236}
3237
3238/*********************************************************************
3239 *
3240 *  Advanced Context Descriptor setup for VLAN or L4 CSUM
3241 *
3242 **********************************************************************/
3243
3244static u32
3245ixgbe_tx_ctx_setup(struct tx_ring *txr, struct mbuf *mp)
3246{
3247	struct m_tag *mtag;
3248	struct adapter *adapter = txr->adapter;
3249	struct ethercom *ec = &adapter->osdep.ec;
3250	struct ixgbe_adv_tx_context_desc *TXD;
3251	struct ixgbe_tx_buf        *tx_buffer;
3252	u32 olinfo = 0, vlan_macip_lens = 0, type_tucmd_mlhl = 0;
3253	struct ether_vlan_header *eh;
3254	struct ip ip;
3255	struct ip6_hdr ip6;
3256	int  ehdrlen, ip_hlen = 0;
3257	u16	etype;
3258	u8	ipproto = 0;
3259	bool	offload;
3260	int ctxd = txr->next_avail_desc;
3261	u16 vtag = 0;
3262
3263	offload = ((mp->m_pkthdr.csum_flags & M_CSUM_OFFLOAD) != 0);
3264
3265	tx_buffer = &txr->tx_buffers[ctxd];
3266	TXD = (struct ixgbe_adv_tx_context_desc *) &txr->tx_base[ctxd];
3267
3268	/*
3269	** In advanced descriptors the vlan tag must
3270	** be placed into the descriptor itself.
3271	*/
3272	if ((mtag = VLAN_OUTPUT_TAG(ec, mp)) != NULL) {
3273		vtag = htole16(VLAN_TAG_VALUE(mtag) & 0xffff);
3274		vlan_macip_lens |= (vtag << IXGBE_ADVTXD_VLAN_SHIFT);
3275	} else if (!offload)
3276		return 0;
3277
3278	/*
3279	 * Determine where frame payload starts.
3280	 * Jump over vlan headers if already present,
3281	 * helpful for QinQ too.
3282	 */
3283	KASSERT(mp->m_len >= offsetof(struct ether_vlan_header, evl_tag));
3284	eh = mtod(mp, struct ether_vlan_header *);
3285	if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN)) {
3286		KASSERT(mp->m_len >= sizeof(struct ether_vlan_header));
3287		etype = ntohs(eh->evl_proto);
3288		ehdrlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
3289	} else {
3290		etype = ntohs(eh->evl_encap_proto);
3291		ehdrlen = ETHER_HDR_LEN;
3292	}
3293
3294	/* Set the ether header length */
3295	vlan_macip_lens |= ehdrlen << IXGBE_ADVTXD_MACLEN_SHIFT;
3296
3297	switch (etype) {
3298	case ETHERTYPE_IP:
3299		m_copydata(mp, ehdrlen, sizeof(ip), &ip);
3300		ip_hlen = ip.ip_hl << 2;
3301		ipproto = ip.ip_p;
3302#if 0
3303		ip.ip_sum = 0;
3304		m_copyback(mp, ehdrlen, sizeof(ip), &ip);
3305#else
3306		KASSERT((mp->m_pkthdr.csum_flags & M_CSUM_IPv4) == 0 ||
3307		    ip.ip_sum == 0);
3308#endif
3309		type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV4;
3310		break;
3311	case ETHERTYPE_IPV6:
3312		m_copydata(mp, ehdrlen, sizeof(ip6), &ip6);
3313		ip_hlen = sizeof(ip6);
3314		ipproto = ip6.ip6_nxt;
3315		type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV6;
3316		break;
3317	default:
3318		break;
3319	}
3320
3321	if ((mp->m_pkthdr.csum_flags & M_CSUM_IPv4) != 0)
3322		olinfo |= IXGBE_TXD_POPTS_IXSM << 8;
3323
3324	vlan_macip_lens |= ip_hlen;
3325	type_tucmd_mlhl |= IXGBE_ADVTXD_DCMD_DEXT | IXGBE_ADVTXD_DTYP_CTXT;
3326
3327	if (mp->m_pkthdr.csum_flags & (M_CSUM_TCPv4|M_CSUM_TCPv6)) {
3328		type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_TCP;
3329		olinfo |= IXGBE_TXD_POPTS_TXSM << 8;
3330		KASSERT(ipproto == IPPROTO_TCP);
3331	} else if (mp->m_pkthdr.csum_flags & (M_CSUM_UDPv4|M_CSUM_UDPv6)) {
3332		type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_UDP;
3333		olinfo |= IXGBE_TXD_POPTS_TXSM << 8;
3334		KASSERT(ipproto == IPPROTO_UDP);
3335	}
3336
3337	/* Now copy bits into descriptor */
3338	TXD->vlan_macip_lens |= htole32(vlan_macip_lens);
3339	TXD->type_tucmd_mlhl |= htole32(type_tucmd_mlhl);
3340	TXD->seqnum_seed = htole32(0);
3341	TXD->mss_l4len_idx = htole32(0);
3342
3343	tx_buffer->m_head = NULL;
3344	tx_buffer->eop_index = -1;
3345
3346	/* We've consumed the first desc, adjust counters */
3347	if (++ctxd == adapter->num_tx_desc)
3348		ctxd = 0;
3349	txr->next_avail_desc = ctxd;
3350	--txr->tx_avail;
3351
3352        return olinfo;
3353}
3354
3355/**********************************************************************
3356 *
3357 *  Setup work for hardware segmentation offload (TSO) on
3358 *  adapters using advanced tx descriptors
3359 *
3360 **********************************************************************/
3361static bool
3362ixgbe_tso_setup(struct tx_ring *txr, struct mbuf *mp, u32 *paylen)
3363{
3364	struct m_tag *mtag;
3365	struct adapter *adapter = txr->adapter;
3366	struct ethercom *ec = &adapter->osdep.ec;
3367	struct ixgbe_adv_tx_context_desc *TXD;
3368	struct ixgbe_tx_buf        *tx_buffer;
3369	u32 vlan_macip_lens = 0, type_tucmd_mlhl = 0;
3370	u32 mss_l4len_idx = 0;
3371	u16 vtag = 0;
3372	int ctxd, ehdrlen,  hdrlen, ip_hlen, tcp_hlen;
3373	struct ether_vlan_header *eh;
3374	struct ip *ip;
3375	struct tcphdr *th;
3376
3377
3378	/*
3379	 * Determine where frame payload starts.
3380	 * Jump over vlan headers if already present
3381	 */
3382	eh = mtod(mp, struct ether_vlan_header *);
3383	if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN))
3384		ehdrlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
3385	else
3386		ehdrlen = ETHER_HDR_LEN;
3387
3388        /* Ensure we have at least the IP+TCP header in the first mbuf. */
3389        if (mp->m_len < ehdrlen + sizeof(struct ip) + sizeof(struct tcphdr))
3390		return FALSE;
3391
3392	ctxd = txr->next_avail_desc;
3393	tx_buffer = &txr->tx_buffers[ctxd];
3394	TXD = (struct ixgbe_adv_tx_context_desc *) &txr->tx_base[ctxd];
3395
3396	ip = (struct ip *)(mp->m_data + ehdrlen);
3397	if (ip->ip_p != IPPROTO_TCP)
3398		return FALSE;   /* 0 */
3399	ip->ip_sum = 0;
3400	ip_hlen = ip->ip_hl << 2;
3401	th = (struct tcphdr *)((char *)ip + ip_hlen);
3402	/* XXX Educated guess: FreeBSD's in_pseudo == NetBSD's in_cksum_phdr */
3403	th->th_sum = in_cksum_phdr(ip->ip_src.s_addr,
3404	    ip->ip_dst.s_addr, htons(IPPROTO_TCP));
3405	tcp_hlen = th->th_off << 2;
3406	hdrlen = ehdrlen + ip_hlen + tcp_hlen;
3407
3408	/* This is used in the transmit desc in encap */
3409	*paylen = mp->m_pkthdr.len - hdrlen;
3410
3411	/* VLAN MACLEN IPLEN */
3412	if ((mtag = VLAN_OUTPUT_TAG(ec, mp)) != NULL) {
3413		vtag = htole16(VLAN_TAG_VALUE(mtag) & 0xffff);
3414                vlan_macip_lens |= (vtag << IXGBE_ADVTXD_VLAN_SHIFT);
3415	}
3416
3417	vlan_macip_lens |= ehdrlen << IXGBE_ADVTXD_MACLEN_SHIFT;
3418	vlan_macip_lens |= ip_hlen;
3419	TXD->vlan_macip_lens |= htole32(vlan_macip_lens);
3420
3421	/* ADV DTYPE TUCMD */
3422	type_tucmd_mlhl |= IXGBE_ADVTXD_DCMD_DEXT | IXGBE_ADVTXD_DTYP_CTXT;
3423	type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_TCP;
3424	type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV4;
3425	TXD->type_tucmd_mlhl |= htole32(type_tucmd_mlhl);
3426
3427
3428	/* MSS L4LEN IDX */
3429	mss_l4len_idx |= (mp->m_pkthdr.segsz << IXGBE_ADVTXD_MSS_SHIFT);
3430	mss_l4len_idx |= (tcp_hlen << IXGBE_ADVTXD_L4LEN_SHIFT);
3431	TXD->mss_l4len_idx = htole32(mss_l4len_idx);
3432
3433	TXD->seqnum_seed = htole32(0);
3434	tx_buffer->m_head = NULL;
3435	tx_buffer->eop_index = -1;
3436
3437	if (++ctxd == adapter->num_tx_desc)
3438		ctxd = 0;
3439
3440	txr->tx_avail--;
3441	txr->next_avail_desc = ctxd;
3442	return TRUE;
3443}
3444
3445#ifdef IXGBE_FDIR
3446/*
3447** This routine parses packet headers so that Flow
3448** Director can make a hashed filter table entry
3449** allowing traffic flows to be identified and kept
3450** on the same cpu.  This would be a performance
3451** hit, but we only do it at IXGBE_FDIR_RATE of
3452** packets.
3453*/
3454static void
3455ixgbe_atr(struct tx_ring *txr, struct mbuf *mp)
3456{
3457	struct adapter			*adapter = txr->adapter;
3458	struct ix_queue			*que;
3459	struct ip			*ip;
3460	struct tcphdr			*th;
3461	struct udphdr			*uh;
3462	struct ether_vlan_header	*eh;
3463	union ixgbe_atr_hash_dword	input = {.dword = 0};
3464	union ixgbe_atr_hash_dword	common = {.dword = 0};
3465	int  				ehdrlen, ip_hlen;
3466	u16				etype;
3467
3468	eh = mtod(mp, struct ether_vlan_header *);
3469	if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN)) {
3470		ehdrlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
3471		etype = eh->evl_proto;
3472	} else {
3473		ehdrlen = ETHER_HDR_LEN;
3474		etype = eh->evl_encap_proto;
3475	}
3476
3477	/* Only handling IPv4 */
3478	if (etype != htons(ETHERTYPE_IP))
3479		return;
3480
3481	ip = (struct ip *)(mp->m_data + ehdrlen);
3482	ip_hlen = ip->ip_hl << 2;
3483
3484	/* check if we're UDP or TCP */
3485	switch (ip->ip_p) {
3486	case IPPROTO_TCP:
3487		th = (struct tcphdr *)((char *)ip + ip_hlen);
3488		/* src and dst are inverted */
3489		common.port.dst ^= th->th_sport;
3490		common.port.src ^= th->th_dport;
3491		input.formatted.flow_type ^= IXGBE_ATR_FLOW_TYPE_TCPV4;
3492		break;
3493	case IPPROTO_UDP:
3494		uh = (struct udphdr *)((char *)ip + ip_hlen);
3495		/* src and dst are inverted */
3496		common.port.dst ^= uh->uh_sport;
3497		common.port.src ^= uh->uh_dport;
3498		input.formatted.flow_type ^= IXGBE_ATR_FLOW_TYPE_UDPV4;
3499		break;
3500	default:
3501		return;
3502	}
3503
3504	input.formatted.vlan_id = htobe16(mp->m_pkthdr.ether_vtag);
3505	if (mp->m_pkthdr.ether_vtag)
3506		common.flex_bytes ^= htons(ETHERTYPE_VLAN);
3507	else
3508		common.flex_bytes ^= etype;
3509	common.ip ^= ip->ip_src.s_addr ^ ip->ip_dst.s_addr;
3510
3511	que = &adapter->queues[txr->me];
3512	/*
3513	** This assumes the Rx queue and Tx
3514	** queue are bound to the same CPU
3515	*/
3516	ixgbe_fdir_add_signature_filter_82599(&adapter->hw,
3517	    input, common, que->msix);
3518}
3519#endif /* IXGBE_FDIR */
3520
3521/**********************************************************************
3522 *
3523 *  Examine each tx_buffer in the used queue. If the hardware is done
3524 *  processing the packet then free associated resources. The
3525 *  tx_buffer is put back on the free queue.
3526 *
3527 **********************************************************************/
3528static bool
3529ixgbe_txeof(struct tx_ring *txr)
3530{
3531	struct adapter	*adapter = txr->adapter;
3532	struct ifnet	*ifp = adapter->ifp;
3533	u32	first, last, done, processed;
3534	struct ixgbe_tx_buf *tx_buffer;
3535	struct ixgbe_legacy_tx_desc *tx_desc, *eop_desc;
3536	struct timeval now, elapsed;
3537
3538	KASSERT(mutex_owned(&txr->tx_mtx));
3539
3540	if (txr->tx_avail == adapter->num_tx_desc) {
3541		txr->queue_status = IXGBE_QUEUE_IDLE;
3542		return false;
3543	}
3544
3545	processed = 0;
3546	first = txr->next_to_clean;
3547	tx_buffer = &txr->tx_buffers[first];
3548	/* For cleanup we just use legacy struct */
3549	tx_desc = (struct ixgbe_legacy_tx_desc *)&txr->tx_base[first];
3550	last = tx_buffer->eop_index;
3551	if (last == -1)
3552		return false;
3553	eop_desc = (struct ixgbe_legacy_tx_desc *)&txr->tx_base[last];
3554
3555	/*
3556	** Get the index of the first descriptor
3557	** BEYOND the EOP and call that 'done'.
3558	** I do this so the comparison in the
3559	** inner while loop below can be simple
3560	*/
3561	if (++last == adapter->num_tx_desc) last = 0;
3562	done = last;
3563
3564        ixgbe_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map,
3565	    BUS_DMASYNC_POSTREAD);
3566	/*
3567	** Only the EOP descriptor of a packet now has the DD
3568	** bit set, this is what we look for...
3569	*/
3570	while (eop_desc->upper.fields.status & IXGBE_TXD_STAT_DD) {
3571		/* We clean the range of the packet */
3572		while (first != done) {
3573			tx_desc->upper.data = 0;
3574			tx_desc->lower.data = 0;
3575			tx_desc->buffer_addr = 0;
3576			++txr->tx_avail;
3577			++processed;
3578
3579			if (tx_buffer->m_head) {
3580				txr->bytes +=
3581				    tx_buffer->m_head->m_pkthdr.len;
3582				bus_dmamap_sync(txr->txtag->dt_dmat,
3583				    tx_buffer->map,
3584				    0, tx_buffer->m_head->m_pkthdr.len,
3585				    BUS_DMASYNC_POSTWRITE);
3586				ixgbe_dmamap_unload(txr->txtag, tx_buffer->map);
3587				m_freem(tx_buffer->m_head);
3588				tx_buffer->m_head = NULL;
3589			}
3590			tx_buffer->eop_index = -1;
3591			getmicrotime(&txr->watchdog_time);
3592
3593			if (++first == adapter->num_tx_desc)
3594				first = 0;
3595
3596			tx_buffer = &txr->tx_buffers[first];
3597			tx_desc =
3598			    (struct ixgbe_legacy_tx_desc *)&txr->tx_base[first];
3599		}
3600		++txr->packets;
3601		++ifp->if_opackets;
3602		/* See if there is more work now */
3603		last = tx_buffer->eop_index;
3604		if (last != -1) {
3605			eop_desc =
3606			    (struct ixgbe_legacy_tx_desc *)&txr->tx_base[last];
3607			/* Get next done point */
3608			if (++last == adapter->num_tx_desc) last = 0;
3609			done = last;
3610		} else
3611			break;
3612	}
3613	ixgbe_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map,
3614	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
3615
3616	txr->next_to_clean = first;
3617
3618	/*
3619	** Watchdog calculation, we know there's
3620	** work outstanding or the first return
3621	** would have been taken, so none processed
3622	** for too long indicates a hang.
3623	*/
3624	getmicrotime(&now);
3625	timersub(&now, &txr->watchdog_time, &elapsed);
3626	if (!processed && tvtohz(&elapsed) > IXGBE_WATCHDOG)
3627		txr->queue_status = IXGBE_QUEUE_HUNG;
3628
3629	/*
3630	 * If we have enough room, clear IFF_OACTIVE to tell the stack that
3631	 * it is OK to send packets. If there are no pending descriptors,
3632	 * clear the timeout. Otherwise, if some descriptors have been freed,
3633	 * restart the timeout.
3634	 */
3635	if (txr->tx_avail > IXGBE_TX_CLEANUP_THRESHOLD) {
3636		ifp->if_flags &= ~IFF_OACTIVE;
3637		if (txr->tx_avail == adapter->num_tx_desc) {
3638			txr->queue_status = IXGBE_QUEUE_IDLE;
3639			return false;
3640		}
3641	}
3642
3643	return true;
3644}
3645
3646/*********************************************************************
3647 *
3648 *  Refresh mbuf buffers for RX descriptor rings
3649 *   - now keeps its own state so discards due to resource
3650 *     exhaustion are unnecessary, if an mbuf cannot be obtained
3651 *     it just returns, keeping its placeholder, thus it can simply
3652 *     be recalled to try again.
3653 *
3654 **********************************************************************/
3655static void
3656ixgbe_refresh_mbufs(struct rx_ring *rxr, int limit)
3657{
3658	struct adapter		*adapter = rxr->adapter;
3659	struct ixgbe_rx_buf	*rxbuf;
3660	struct mbuf		*mh, *mp;
3661	int			i, j, error;
3662	bool			refreshed = false;
3663
3664	i = j = rxr->next_to_refresh;
3665	/* Control the loop with one beyond */
3666	if (++j == adapter->num_rx_desc)
3667		j = 0;
3668
3669	while (j != limit) {
3670		rxbuf = &rxr->rx_buffers[i];
3671		if (rxr->hdr_split == FALSE)
3672			goto no_split;
3673
3674		if (rxbuf->m_head == NULL) {
3675			mh = m_gethdr(M_DONTWAIT, MT_DATA);
3676			if (mh == NULL)
3677				goto update;
3678		} else
3679			mh = rxbuf->m_head;
3680
3681		mh->m_pkthdr.len = mh->m_len = MHLEN;
3682		mh->m_len = MHLEN;
3683		mh->m_flags |= M_PKTHDR;
3684		/* Get the memory mapping */
3685		error = bus_dmamap_load_mbuf(rxr->htag->dt_dmat,
3686		    rxbuf->hmap, mh, BUS_DMA_NOWAIT);
3687		if (error != 0) {
3688			printf("Refresh mbufs: hdr dmamap load"
3689			    " failure - %d\n", error);
3690			m_free(mh);
3691			rxbuf->m_head = NULL;
3692			goto update;
3693		}
3694		rxbuf->m_head = mh;
3695		ixgbe_dmamap_sync(rxr->htag, rxbuf->hmap, BUS_DMASYNC_PREREAD);
3696		rxr->rx_base[i].read.hdr_addr =
3697		    htole64(rxbuf->hmap->dm_segs[0].ds_addr);
3698
3699no_split:
3700		if (rxbuf->m_pack == NULL) {
3701			mp = ixgbe_getjcl(&adapter->jcl_head, M_DONTWAIT,
3702			    MT_DATA, M_PKTHDR, adapter->rx_mbuf_sz);
3703			if (mp == NULL) {
3704				rxr->no_jmbuf.ev_count++;
3705				goto update;
3706			}
3707		} else
3708			mp = rxbuf->m_pack;
3709
3710		mp->m_pkthdr.len = mp->m_len = adapter->rx_mbuf_sz;
3711		/* Get the memory mapping */
3712		error = bus_dmamap_load_mbuf(rxr->ptag->dt_dmat,
3713		    rxbuf->pmap, mp, BUS_DMA_NOWAIT);
3714		if (error != 0) {
3715			printf("Refresh mbufs: payload dmamap load"
3716			    " failure - %d\n", error);
3717			m_free(mp);
3718			rxbuf->m_pack = NULL;
3719			goto update;
3720		}
3721		rxbuf->m_pack = mp;
3722		bus_dmamap_sync(rxr->ptag->dt_dmat, rxbuf->pmap,
3723		    0, mp->m_pkthdr.len, BUS_DMASYNC_PREREAD);
3724		rxr->rx_base[i].read.pkt_addr =
3725		    htole64(rxbuf->pmap->dm_segs[0].ds_addr);
3726
3727		refreshed = true;
3728		/* Next is precalculated */
3729		i = j;
3730		rxr->next_to_refresh = i;
3731		if (++j == adapter->num_rx_desc)
3732			j = 0;
3733	}
3734update:
3735	if (refreshed) /* Update hardware tail index */
3736		IXGBE_WRITE_REG(&adapter->hw,
3737		    IXGBE_RDT(rxr->me), rxr->next_to_refresh);
3738	return;
3739}
3740
3741/*********************************************************************
3742 *
3743 *  Allocate memory for rx_buffer structures. Since we use one
3744 *  rx_buffer per received packet, the maximum number of rx_buffer's
3745 *  that we'll need is equal to the number of receive descriptors
3746 *  that we've allocated.
3747 *
3748 **********************************************************************/
3749static int
3750ixgbe_allocate_receive_buffers(struct rx_ring *rxr)
3751{
3752	struct	adapter 	*adapter = rxr->adapter;
3753	device_t 		dev = adapter->dev;
3754	struct ixgbe_rx_buf 	*rxbuf;
3755	int             	i, bsize, error;
3756
3757	bsize = sizeof(struct ixgbe_rx_buf) * adapter->num_rx_desc;
3758	if (!(rxr->rx_buffers =
3759	    (struct ixgbe_rx_buf *) malloc(bsize,
3760	    M_DEVBUF, M_NOWAIT | M_ZERO))) {
3761		aprint_error_dev(dev, "Unable to allocate rx_buffer memory\n");
3762		error = ENOMEM;
3763		goto fail;
3764	}
3765
3766	if ((error = ixgbe_dma_tag_create(adapter->osdep.dmat,	/* parent */
3767				   1, 0,	/* alignment, bounds */
3768				   MSIZE,		/* maxsize */
3769				   1,			/* nsegments */
3770				   MSIZE,		/* maxsegsize */
3771				   0,			/* flags */
3772				   &rxr->htag))) {
3773		aprint_error_dev(dev, "Unable to create RX DMA tag\n");
3774		goto fail;
3775	}
3776
3777	if ((error = ixgbe_dma_tag_create(adapter->osdep.dmat,	/* parent */
3778				   1, 0,	/* alignment, bounds */
3779				   MJUM16BYTES,		/* maxsize */
3780				   1,			/* nsegments */
3781				   MJUM16BYTES,		/* maxsegsize */
3782				   0,			/* flags */
3783				   &rxr->ptag))) {
3784		aprint_error_dev(dev, "Unable to create RX DMA tag\n");
3785		goto fail;
3786	}
3787
3788	for (i = 0; i < adapter->num_rx_desc; i++, rxbuf++) {
3789		rxbuf = &rxr->rx_buffers[i];
3790		error = ixgbe_dmamap_create(rxr->htag,
3791		    BUS_DMA_NOWAIT, &rxbuf->hmap);
3792		if (error) {
3793			aprint_error_dev(dev, "Unable to create RX head map\n");
3794			goto fail;
3795		}
3796		error = ixgbe_dmamap_create(rxr->ptag,
3797		    BUS_DMA_NOWAIT, &rxbuf->pmap);
3798		if (error) {
3799			aprint_error_dev(dev, "Unable to create RX pkt map\n");
3800			goto fail;
3801		}
3802	}
3803
3804	return (0);
3805
3806fail:
3807	/* Frees all, but can handle partial completion */
3808	ixgbe_free_receive_structures(adapter);
3809	return (error);
3810}
3811
3812/*
3813** Used to detect a descriptor that has
3814** been merged by Hardware RSC.
3815*/
3816static inline u32
3817ixgbe_rsc_count(union ixgbe_adv_rx_desc *rx)
3818{
3819	return (le32toh(rx->wb.lower.lo_dword.data) &
3820	    IXGBE_RXDADV_RSCCNT_MASK) >> IXGBE_RXDADV_RSCCNT_SHIFT;
3821}
3822
3823/*********************************************************************
3824 *
3825 *  Initialize Hardware RSC (LRO) feature on 82599
3826 *  for an RX ring, this is toggled by the LRO capability
3827 *  even though it is transparent to the stack.
3828 *
3829 **********************************************************************/
3830static void
3831ixgbe_setup_hw_rsc(struct rx_ring *rxr)
3832{
3833	struct	adapter 	*adapter = rxr->adapter;
3834	struct	ixgbe_hw	*hw = &adapter->hw;
3835	u32			rscctrl, rdrxctl;
3836
3837	rdrxctl = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
3838	rdrxctl &= ~IXGBE_RDRXCTL_RSCFRSTSIZE;
3839	rdrxctl |= IXGBE_RDRXCTL_CRCSTRIP;
3840	rdrxctl |= IXGBE_RDRXCTL_RSCACKC;
3841	IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, rdrxctl);
3842
3843	rscctrl = IXGBE_READ_REG(hw, IXGBE_RSCCTL(rxr->me));
3844	rscctrl |= IXGBE_RSCCTL_RSCEN;
3845	/*
3846	** Limit the total number of descriptors that
3847	** can be combined, so it does not exceed 64K
3848	*/
3849	if (adapter->rx_mbuf_sz == MCLBYTES)
3850		rscctrl |= IXGBE_RSCCTL_MAXDESC_16;
3851	else if (adapter->rx_mbuf_sz == MJUMPAGESIZE)
3852		rscctrl |= IXGBE_RSCCTL_MAXDESC_8;
3853	else if (adapter->rx_mbuf_sz == MJUM9BYTES)
3854		rscctrl |= IXGBE_RSCCTL_MAXDESC_4;
3855	else  /* Using 16K cluster */
3856		rscctrl |= IXGBE_RSCCTL_MAXDESC_1;
3857
3858	IXGBE_WRITE_REG(hw, IXGBE_RSCCTL(rxr->me), rscctrl);
3859
3860	/* Enable TCP header recognition */
3861	IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(0),
3862	    (IXGBE_READ_REG(hw, IXGBE_PSRTYPE(0)) |
3863	    IXGBE_PSRTYPE_TCPHDR));
3864
3865	/* Disable RSC for ACK packets */
3866	IXGBE_WRITE_REG(hw, IXGBE_RSCDBU,
3867	    (IXGBE_RSCDBU_RSCACKDIS | IXGBE_READ_REG(hw, IXGBE_RSCDBU)));
3868
3869	rxr->hw_rsc = TRUE;
3870}
3871
3872
3873static void
3874ixgbe_free_receive_ring(struct rx_ring *rxr)
3875{
3876	struct  adapter         *adapter;
3877	struct ixgbe_rx_buf       *rxbuf;
3878	int i;
3879
3880	adapter = rxr->adapter;
3881	for (i = 0; i < adapter->num_rx_desc; i++) {
3882		rxbuf = &rxr->rx_buffers[i];
3883		if (rxbuf->m_head != NULL) {
3884			ixgbe_dmamap_sync(rxr->htag, rxbuf->hmap,
3885			    BUS_DMASYNC_POSTREAD);
3886			ixgbe_dmamap_unload(rxr->htag, rxbuf->hmap);
3887			rxbuf->m_head->m_flags |= M_PKTHDR;
3888			m_freem(rxbuf->m_head);
3889		}
3890		if (rxbuf->m_pack != NULL) {
3891			bus_dmamap_sync(rxr->ptag->dt_dmat, rxbuf->pmap,
3892			    0, rxbuf->m_pack->m_pkthdr.len,
3893			    BUS_DMASYNC_POSTREAD);
3894			ixgbe_dmamap_unload(rxr->ptag, rxbuf->pmap);
3895			rxbuf->m_pack->m_flags |= M_PKTHDR;
3896			m_freem(rxbuf->m_pack);
3897		}
3898		rxbuf->m_head = NULL;
3899		rxbuf->m_pack = NULL;
3900	}
3901}
3902
3903
3904/*********************************************************************
3905 *
3906 *  Initialize a receive ring and its buffers.
3907 *
3908 **********************************************************************/
3909static int
3910ixgbe_setup_receive_ring(struct rx_ring *rxr)
3911{
3912	struct	adapter 	*adapter;
3913	struct ifnet		*ifp;
3914	device_t		dev;
3915	struct ixgbe_rx_buf	*rxbuf;
3916#ifdef LRO
3917	struct lro_ctrl		*lro = &rxr->lro;
3918#endif /* LRO */
3919	int			rsize, error = 0;
3920
3921	adapter = rxr->adapter;
3922	ifp = adapter->ifp;
3923	dev = adapter->dev;
3924
3925	/* Clear the ring contents */
3926	IXGBE_RX_LOCK(rxr);
3927	rsize = roundup2(adapter->num_rx_desc *
3928	    sizeof(union ixgbe_adv_rx_desc), DBA_ALIGN);
3929	bzero((void *)rxr->rx_base, rsize);
3930
3931	/* Free current RX buffer structs and their mbufs */
3932	ixgbe_free_receive_ring(rxr);
3933
3934	/* Now reinitialize our supply of jumbo mbufs.  The number
3935	 * or size of jumbo mbufs may have changed.
3936	 */
3937	ixgbe_jcl_reinit(&adapter->jcl_head, rxr->ptag->dt_dmat,
3938	    2 * adapter->num_rx_desc, adapter->rx_mbuf_sz);
3939
3940	/* Configure header split? */
3941	if (ixgbe_header_split)
3942		rxr->hdr_split = TRUE;
3943
3944	/* Now replenish the mbufs */
3945	for (int j = 0; j != adapter->num_rx_desc; ++j) {
3946		struct mbuf	*mh, *mp;
3947
3948		rxbuf = &rxr->rx_buffers[j];
3949		/*
3950		** Don't allocate mbufs if not
3951		** doing header split, its wasteful
3952		*/
3953		if (rxr->hdr_split == FALSE)
3954			goto skip_head;
3955
3956		/* First the header */
3957		rxbuf->m_head = m_gethdr(M_DONTWAIT, MT_DATA);
3958		if (rxbuf->m_head == NULL) {
3959			error = ENOBUFS;
3960			goto fail;
3961		}
3962		m_adj(rxbuf->m_head, ETHER_ALIGN);
3963		mh = rxbuf->m_head;
3964		mh->m_len = mh->m_pkthdr.len = MHLEN;
3965		mh->m_flags |= M_PKTHDR;
3966		/* Get the memory mapping */
3967		error = bus_dmamap_load_mbuf(rxr->htag->dt_dmat,
3968		    rxbuf->hmap, rxbuf->m_head, BUS_DMA_NOWAIT);
3969		if (error != 0) /* Nothing elegant to do here */
3970			goto fail;
3971		bus_dmamap_sync(rxr->htag->dt_dmat, rxbuf->hmap,
3972		    0, mh->m_pkthdr.len, BUS_DMASYNC_PREREAD);
3973		/* Update descriptor */
3974		rxr->rx_base[j].read.hdr_addr =
3975		    htole64(rxbuf->hmap->dm_segs[0].ds_addr);
3976
3977skip_head:
3978		/* Now the payload cluster */
3979		rxbuf->m_pack = ixgbe_getjcl(&adapter->jcl_head, M_DONTWAIT,
3980		    MT_DATA, M_PKTHDR, adapter->rx_mbuf_sz);
3981		if (rxbuf->m_pack == NULL) {
3982			error = ENOBUFS;
3983                        goto fail;
3984		}
3985		mp = rxbuf->m_pack;
3986		mp->m_pkthdr.len = mp->m_len = adapter->rx_mbuf_sz;
3987		/* Get the memory mapping */
3988		error = bus_dmamap_load_mbuf(rxr->ptag->dt_dmat,
3989		    rxbuf->pmap, mp, BUS_DMA_NOWAIT);
3990		if (error != 0)
3991                        goto fail;
3992		bus_dmamap_sync(rxr->ptag->dt_dmat, rxbuf->pmap,
3993		    0, adapter->rx_mbuf_sz, BUS_DMASYNC_PREREAD);
3994		/* Update descriptor */
3995		rxr->rx_base[j].read.pkt_addr =
3996		    htole64(rxbuf->pmap->dm_segs[0].ds_addr);
3997	}
3998
3999
4000	/* Setup our descriptor indices */
4001	rxr->next_to_check = 0;
4002	rxr->next_to_refresh = 0;
4003	rxr->lro_enabled = FALSE;
4004	rxr->rx_split_packets.ev_count = 0;
4005	rxr->rx_bytes.ev_count = 0;
4006	rxr->discard = FALSE;
4007
4008	ixgbe_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map,
4009	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
4010
4011	/*
4012	** Now set up the LRO interface:
4013	** 82598 uses software LRO, the
4014	** 82599 uses a hardware assist.
4015	*/
4016	if ((adapter->hw.mac.type != ixgbe_mac_82598EB) &&
4017	    (ifp->if_capenable & IFCAP_RXCSUM) &&
4018	    (ifp->if_capenable & IFCAP_LRO))
4019		ixgbe_setup_hw_rsc(rxr);
4020#ifdef LRO
4021	else if (ifp->if_capenable & IFCAP_LRO) {
4022		int err = tcp_lro_init(lro);
4023		if (err) {
4024			device_printf(dev, "LRO Initialization failed!\n");
4025			goto fail;
4026		}
4027		INIT_DEBUGOUT("RX Soft LRO Initialized\n");
4028		rxr->lro_enabled = TRUE;
4029		lro->ifp = adapter->ifp;
4030	}
4031#endif /* LRO */
4032
4033	IXGBE_RX_UNLOCK(rxr);
4034	return (0);
4035
4036fail:
4037	ixgbe_free_receive_ring(rxr);
4038	IXGBE_RX_UNLOCK(rxr);
4039	return (error);
4040}
4041
4042/*********************************************************************
4043 *
4044 *  Initialize all receive rings.
4045 *
4046 **********************************************************************/
4047static int
4048ixgbe_setup_receive_structures(struct adapter *adapter)
4049{
4050	struct rx_ring *rxr = adapter->rx_rings;
4051	int j;
4052
4053	for (j = 0; j < adapter->num_queues; j++, rxr++)
4054		if (ixgbe_setup_receive_ring(rxr))
4055			goto fail;
4056
4057	return (0);
4058fail:
4059	/*
4060	 * Free RX buffers allocated so far, we will only handle
4061	 * the rings that completed, the failing case will have
4062	 * cleaned up for itself. 'j' failed, so its the terminus.
4063	 */
4064	for (int i = 0; i < j; ++i) {
4065		rxr = &adapter->rx_rings[i];
4066		ixgbe_free_receive_ring(rxr);
4067	}
4068
4069	return (ENOBUFS);
4070}
4071
4072/*********************************************************************
4073 *
4074 *  Setup receive registers and features.
4075 *
4076 **********************************************************************/
4077#define IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT 2
4078
4079static void
4080ixgbe_initialize_receive_units(struct adapter *adapter)
4081{
4082	int i;
4083	struct	rx_ring	*rxr = adapter->rx_rings;
4084	struct ixgbe_hw	*hw = &adapter->hw;
4085	struct ifnet   *ifp = adapter->ifp;
4086	u32		bufsz, rxctrl, fctrl, srrctl, rxcsum;
4087	u32		reta, mrqc = 0, hlreg, r[10];
4088
4089
4090	/*
4091	 * Make sure receives are disabled while
4092	 * setting up the descriptor ring
4093	 */
4094	rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
4095	IXGBE_WRITE_REG(hw, IXGBE_RXCTRL,
4096	    rxctrl & ~IXGBE_RXCTRL_RXEN);
4097
4098	/* Enable broadcasts */
4099	fctrl = IXGBE_READ_REG(hw, IXGBE_FCTRL);
4100	fctrl |= IXGBE_FCTRL_BAM;
4101	fctrl |= IXGBE_FCTRL_DPF;
4102	fctrl |= IXGBE_FCTRL_PMCF;
4103	IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl);
4104
4105	/* Set for Jumbo Frames? */
4106	hlreg = IXGBE_READ_REG(hw, IXGBE_HLREG0);
4107	if (ifp->if_mtu > ETHERMTU)
4108		hlreg |= IXGBE_HLREG0_JUMBOEN;
4109	else
4110		hlreg &= ~IXGBE_HLREG0_JUMBOEN;
4111	IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg);
4112
4113	bufsz = adapter->rx_mbuf_sz  >> IXGBE_SRRCTL_BSIZEPKT_SHIFT;
4114
4115	for (i = 0; i < adapter->num_queues; i++, rxr++) {
4116		u64 rdba = rxr->rxdma.dma_paddr;
4117
4118		printf("%s: queue %d rdba %" PRIx64 "\n", __func__, i, rdba);
4119
4120		/* Setup the Base and Length of the Rx Descriptor Ring */
4121		IXGBE_WRITE_REG(hw, IXGBE_RDBAL(i),
4122			       (rdba & 0x00000000ffffffffULL));
4123		IXGBE_WRITE_REG(hw, IXGBE_RDBAH(i), (rdba >> 32));
4124		IXGBE_WRITE_REG(hw, IXGBE_RDLEN(i),
4125		    adapter->num_rx_desc * sizeof(union ixgbe_adv_rx_desc));
4126
4127		/* Set up the SRRCTL register */
4128		srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(i));
4129		srrctl &= ~IXGBE_SRRCTL_BSIZEHDR_MASK;
4130		srrctl &= ~IXGBE_SRRCTL_BSIZEPKT_MASK;
4131		srrctl |= bufsz;
4132		if (rxr->hdr_split) {
4133			/* Use a standard mbuf for the header */
4134			srrctl |= ((IXGBE_RX_HDR <<
4135			    IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT)
4136			    & IXGBE_SRRCTL_BSIZEHDR_MASK);
4137			srrctl |= IXGBE_SRRCTL_DESCTYPE_HDR_SPLIT_ALWAYS;
4138		} else
4139			srrctl |= IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF;
4140		IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(i), srrctl);
4141
4142		/* Setup the HW Rx Head and Tail Descriptor Pointers */
4143		IXGBE_WRITE_REG(hw, IXGBE_RDH(i), 0);
4144		IXGBE_WRITE_REG(hw, IXGBE_RDT(i), 0);
4145	}
4146
4147	if (adapter->hw.mac.type != ixgbe_mac_82598EB) {
4148		u32 psrtype = IXGBE_PSRTYPE_TCPHDR |
4149			      IXGBE_PSRTYPE_UDPHDR |
4150			      IXGBE_PSRTYPE_IPV4HDR |
4151			      IXGBE_PSRTYPE_IPV6HDR;
4152		IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(0), psrtype);
4153	}
4154
4155	rxcsum = IXGBE_READ_REG(hw, IXGBE_RXCSUM);
4156
4157	/* Setup RSS */
4158	if (adapter->num_queues > 1) {
4159		int j;
4160		reta = 0;
4161
4162		/* set up random bits */
4163		cprng_fast(&r, sizeof(r));
4164
4165		/* Set up the redirection table */
4166		for (i = 0, j = 0; i < 128; i++, j++) {
4167			if (j == adapter->num_queues) j = 0;
4168			reta = (reta << 8) | (j * 0x11);
4169			if ((i & 3) == 3)
4170				IXGBE_WRITE_REG(hw, IXGBE_RETA(i >> 2), reta);
4171		}
4172
4173		/* Now fill our hash function seeds */
4174		for (i = 0; i < 10; i++)
4175			IXGBE_WRITE_REG(hw, IXGBE_RSSRK(i), r[i]);
4176
4177		/* Perform hash on these packet types */
4178		mrqc = IXGBE_MRQC_RSSEN
4179		     | IXGBE_MRQC_RSS_FIELD_IPV4
4180		     | IXGBE_MRQC_RSS_FIELD_IPV4_TCP
4181		     | IXGBE_MRQC_RSS_FIELD_IPV4_UDP
4182		     | IXGBE_MRQC_RSS_FIELD_IPV6_EX_TCP
4183		     | IXGBE_MRQC_RSS_FIELD_IPV6_EX
4184		     | IXGBE_MRQC_RSS_FIELD_IPV6
4185		     | IXGBE_MRQC_RSS_FIELD_IPV6_TCP
4186		     | IXGBE_MRQC_RSS_FIELD_IPV6_UDP
4187		     | IXGBE_MRQC_RSS_FIELD_IPV6_EX_UDP;
4188		IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc);
4189
4190		/* RSS and RX IPP Checksum are mutually exclusive */
4191		rxcsum |= IXGBE_RXCSUM_PCSD;
4192	}
4193
4194	if (ifp->if_capenable & IFCAP_RXCSUM)
4195		rxcsum |= IXGBE_RXCSUM_PCSD;
4196
4197	if (!(rxcsum & IXGBE_RXCSUM_PCSD))
4198		rxcsum |= IXGBE_RXCSUM_IPPCSE;
4199
4200	IXGBE_WRITE_REG(hw, IXGBE_RXCSUM, rxcsum);
4201
4202	return;
4203}
4204
4205/*********************************************************************
4206 *
4207 *  Free all receive rings.
4208 *
4209 **********************************************************************/
4210static void
4211ixgbe_free_receive_structures(struct adapter *adapter)
4212{
4213	struct rx_ring *rxr = adapter->rx_rings;
4214
4215	for (int i = 0; i < adapter->num_queues; i++, rxr++) {
4216#ifdef LRO
4217		struct lro_ctrl		*lro = &rxr->lro;
4218#endif /* LRO */
4219		ixgbe_free_receive_buffers(rxr);
4220#ifdef LRO
4221		/* Free LRO memory */
4222		tcp_lro_free(lro);
4223#endif /* LRO */
4224		/* Free the ring memory as well */
4225		ixgbe_dma_free(adapter, &rxr->rxdma);
4226	}
4227
4228	free(adapter->rx_rings, M_DEVBUF);
4229}
4230
4231
4232/*********************************************************************
4233 *
4234 *  Free receive ring data structures
4235 *
4236 **********************************************************************/
4237static void
4238ixgbe_free_receive_buffers(struct rx_ring *rxr)
4239{
4240	struct adapter		*adapter = rxr->adapter;
4241	struct ixgbe_rx_buf	*rxbuf;
4242
4243	INIT_DEBUGOUT("free_receive_structures: begin");
4244
4245	/* Cleanup any existing buffers */
4246	if (rxr->rx_buffers != NULL) {
4247		for (int i = 0; i < adapter->num_rx_desc; i++) {
4248			rxbuf = &rxr->rx_buffers[i];
4249			if (rxbuf->m_head != NULL) {
4250				ixgbe_dmamap_sync(rxr->htag, rxbuf->hmap,
4251				    BUS_DMASYNC_POSTREAD);
4252				ixgbe_dmamap_unload(rxr->htag, rxbuf->hmap);
4253				rxbuf->m_head->m_flags |= M_PKTHDR;
4254				m_freem(rxbuf->m_head);
4255			}
4256			if (rxbuf->m_pack != NULL) {
4257				bus_dmamap_sync(rxr->ptag->dt_dmat, rxbuf->pmap,
4258				    0, rxbuf->m_pack->m_pkthdr.len,
4259				    BUS_DMASYNC_POSTREAD);
4260				ixgbe_dmamap_unload(rxr->ptag, rxbuf->pmap);
4261				rxbuf->m_pack->m_flags |= M_PKTHDR;
4262				m_freem(rxbuf->m_pack);
4263			}
4264			rxbuf->m_head = NULL;
4265			rxbuf->m_pack = NULL;
4266			if (rxbuf->hmap != NULL) {
4267				ixgbe_dmamap_destroy(rxr->htag, rxbuf->hmap);
4268				rxbuf->hmap = NULL;
4269			}
4270			if (rxbuf->pmap != NULL) {
4271				ixgbe_dmamap_destroy(rxr->ptag, rxbuf->pmap);
4272				rxbuf->pmap = NULL;
4273			}
4274		}
4275		if (rxr->rx_buffers != NULL) {
4276			free(rxr->rx_buffers, M_DEVBUF);
4277			rxr->rx_buffers = NULL;
4278		}
4279	}
4280
4281	if (rxr->htag != NULL) {
4282		ixgbe_dma_tag_destroy(rxr->htag);
4283		rxr->htag = NULL;
4284	}
4285	if (rxr->ptag != NULL) {
4286		ixgbe_dma_tag_destroy(rxr->ptag);
4287		rxr->ptag = NULL;
4288	}
4289
4290	return;
4291}
4292
4293static __inline void
4294ixgbe_rx_input(struct rx_ring *rxr, struct ifnet *ifp, struct mbuf *m, u32 ptype)
4295{
4296	struct ethercom *ec;
4297	struct adapter	*adapter = ifp->if_softc;
4298	int s;
4299
4300	ec = &adapter->osdep.ec;
4301
4302#ifdef LRO
4303        /*
4304         * ATM LRO is only for IPv4/TCP packets and TCP checksum of the packet
4305         * should be computed by hardware. Also it should not have VLAN tag in
4306         * ethernet header.
4307         */
4308        if (rxr->lro_enabled &&
4309            (ec->ec_capenable & ETHERCAP_VLAN_HWTAGGING) != 0 &&
4310            (ptype & IXGBE_RXDADV_PKTTYPE_ETQF) == 0 &&
4311            (ptype & (IXGBE_RXDADV_PKTTYPE_IPV4 | IXGBE_RXDADV_PKTTYPE_TCP)) ==
4312            (IXGBE_RXDADV_PKTTYPE_IPV4 | IXGBE_RXDADV_PKTTYPE_TCP) &&
4313            (m->m_pkthdr.csum_flags & (CSUM_DATA_VALID | CSUM_PSEUDO_HDR)) ==
4314            (CSUM_DATA_VALID | CSUM_PSEUDO_HDR)) {
4315                /*
4316                 * Send to the stack if:
4317                 **  - LRO not enabled, or
4318                 **  - no LRO resources, or
4319                 **  - lro enqueue fails
4320                 */
4321                if (rxr->lro.lro_cnt != 0)
4322                        if (tcp_lro_rx(&rxr->lro, m, 0) == 0)
4323                                return;
4324        }
4325#endif /* LRO */
4326
4327	IXGBE_RX_UNLOCK(rxr);
4328
4329	s = splnet();
4330	/* Pass this up to any BPF listeners. */
4331	bpf_mtap(ifp, m);
4332	(*ifp->if_input)(ifp, m);
4333	splx(s);
4334
4335	IXGBE_RX_LOCK(rxr);
4336}
4337
4338static __inline void
4339ixgbe_rx_discard(struct rx_ring *rxr, int i)
4340{
4341	struct ixgbe_rx_buf	*rbuf;
4342
4343	rbuf = &rxr->rx_buffers[i];
4344
4345	printf("%s: enter\n", __func__);
4346
4347        if (rbuf->fmp != NULL) {/* Partial chain ? */
4348		rbuf->fmp->m_flags |= M_PKTHDR;
4349                m_freem(rbuf->fmp);
4350                rbuf->fmp = NULL;
4351	}
4352
4353	/*
4354	** With advanced descriptors the writeback
4355	** clobbers the buffer addrs, so its easier
4356	** to just free the existing mbufs and take
4357	** the normal refresh path to get new buffers
4358	** and mapping.
4359	*/
4360	if (rbuf->m_head) {
4361		m_free(rbuf->m_head);
4362		rbuf->m_head = NULL;
4363	}
4364
4365	if (rbuf->m_pack) {
4366		m_free(rbuf->m_pack);
4367		rbuf->m_pack = NULL;
4368	}
4369
4370	return;
4371}
4372
4373
4374/*********************************************************************
4375 *
4376 *  This routine executes in interrupt context. It replenishes
4377 *  the mbufs in the descriptor and sends data which has been
4378 *  dma'ed into host memory to upper layer.
4379 *
4380 *  We loop at most count times if count is > 0, or until done if
4381 *  count < 0.
4382 *
4383 *  Return TRUE for more work, FALSE for all clean.
4384 *********************************************************************/
4385static bool
4386ixgbe_rxeof(struct ix_queue *que, int count)
4387{
4388	struct adapter		*adapter = que->adapter;
4389	struct rx_ring		*rxr = que->rxr;
4390	struct ifnet		*ifp = adapter->ifp;
4391#ifdef LRO
4392	struct lro_ctrl		*lro = &rxr->lro;
4393	struct lro_entry	*queued;
4394#endif /* LRO */
4395	int			i, nextp, processed = 0;
4396	u32			staterr = 0;
4397	union ixgbe_adv_rx_desc	*cur;
4398	struct ixgbe_rx_buf	*rbuf, *nbuf;
4399
4400	IXGBE_RX_LOCK(rxr);
4401
4402	for (i = rxr->next_to_check; count != 0;) {
4403		struct mbuf	*sendmp, *mh, *mp;
4404		u32		rsc, ptype;
4405		u16		hlen, plen, hdr, vtag;
4406		bool		eop;
4407
4408		/* Sync the ring. */
4409		ixgbe_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map,
4410		    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
4411
4412		cur = &rxr->rx_base[i];
4413		staterr = le32toh(cur->wb.upper.status_error);
4414
4415		if ((staterr & IXGBE_RXD_STAT_DD) == 0)
4416			break;
4417		if ((ifp->if_flags & IFF_RUNNING) == 0)
4418			break;
4419
4420		count--;
4421		sendmp = NULL;
4422		nbuf = NULL;
4423		rsc = 0;
4424		cur->wb.upper.status_error = 0;
4425		rbuf = &rxr->rx_buffers[i];
4426		mh = rbuf->m_head;
4427		mp = rbuf->m_pack;
4428
4429		plen = le16toh(cur->wb.upper.length);
4430		ptype = le32toh(cur->wb.lower.lo_dword.data) &
4431		    IXGBE_RXDADV_PKTTYPE_MASK;
4432		hdr = le16toh(cur->wb.lower.lo_dword.hs_rss.hdr_info);
4433		vtag = le16toh(cur->wb.upper.vlan);
4434		eop = ((staterr & IXGBE_RXD_STAT_EOP) != 0);
4435
4436		/* Make sure bad packets are discarded */
4437		if (((staterr & IXGBE_RXDADV_ERR_FRAME_ERR_MASK) != 0) ||
4438		    (rxr->discard)) {
4439			ifp->if_ierrors++;
4440			rxr->rx_discarded.ev_count++;
4441			if (eop)
4442				rxr->discard = FALSE;
4443			else
4444				rxr->discard = TRUE;
4445			ixgbe_rx_discard(rxr, i);
4446			goto next_desc;
4447		}
4448
4449		/*
4450		** On 82599 which supports a hardware
4451		** LRO (called HW RSC), packets need
4452		** not be fragmented across sequential
4453		** descriptors, rather the next descriptor
4454		** is indicated in bits of the descriptor.
4455		** This also means that we might proceses
4456		** more than one packet at a time, something
4457		** that has never been true before, it
4458		** required eliminating global chain pointers
4459		** in favor of what we are doing here.  -jfv
4460		*/
4461		if (!eop) {
4462			/*
4463			** Figure out the next descriptor
4464			** of this frame.
4465			*/
4466			if (rxr->hw_rsc == TRUE) {
4467				rsc = ixgbe_rsc_count(cur);
4468				rxr->rsc_num += (rsc - 1);
4469			}
4470			if (rsc) { /* Get hardware index */
4471				nextp = ((staterr &
4472				    IXGBE_RXDADV_NEXTP_MASK) >>
4473				    IXGBE_RXDADV_NEXTP_SHIFT);
4474			} else { /* Just sequential */
4475				nextp = i + 1;
4476				if (nextp == adapter->num_rx_desc)
4477					nextp = 0;
4478			}
4479			nbuf = &rxr->rx_buffers[nextp];
4480			prefetch(nbuf);
4481		}
4482		/*
4483		** The header mbuf is ONLY used when header
4484		** split is enabled, otherwise we get normal
4485		** behavior, ie, both header and payload
4486		** are DMA'd into the payload buffer.
4487		**
4488		** Rather than using the fmp/lmp global pointers
4489		** we now keep the head of a packet chain in the
4490		** buffer struct and pass this along from one
4491		** descriptor to the next, until we get EOP.
4492		*/
4493		if (rxr->hdr_split && (rbuf->fmp == NULL)) {
4494			/* This must be an initial descriptor */
4495			hlen = (hdr & IXGBE_RXDADV_HDRBUFLEN_MASK) >>
4496			    IXGBE_RXDADV_HDRBUFLEN_SHIFT;
4497			if (hlen > IXGBE_RX_HDR)
4498				hlen = IXGBE_RX_HDR;
4499			mh->m_len = hlen;
4500			mh->m_flags |= M_PKTHDR;
4501			mh->m_next = NULL;
4502			mh->m_pkthdr.len = mh->m_len;
4503			/* Null buf pointer so it is refreshed */
4504			rbuf->m_head = NULL;
4505			/*
4506			** Check the payload length, this
4507			** could be zero if its a small
4508			** packet.
4509			*/
4510			if (plen > 0) {
4511				mp->m_len = plen;
4512				mp->m_next = NULL;
4513				mp->m_flags &= ~M_PKTHDR;
4514				mh->m_next = mp;
4515				mh->m_pkthdr.len += mp->m_len;
4516				/* Null buf pointer so it is refreshed */
4517				rbuf->m_pack = NULL;
4518				rxr->rx_split_packets.ev_count++;
4519			}
4520			/*
4521			** Now create the forward
4522			** chain so when complete
4523			** we wont have to.
4524			*/
4525                        if (eop == 0) {
4526				/* stash the chain head */
4527                                nbuf->fmp = mh;
4528				/* Make forward chain */
4529                                if (plen)
4530                                        mp->m_next = nbuf->m_pack;
4531                                else
4532                                        mh->m_next = nbuf->m_pack;
4533                        } else {
4534				/* Singlet, prepare to send */
4535                                sendmp = mh;
4536                                if (VLAN_ATTACHED(&adapter->osdep.ec) &&
4537				  (staterr & IXGBE_RXD_STAT_VP)) {
4538					/* XXX Do something reasonable on
4539					 * error.
4540					 */
4541#if 0
4542					printf("%s.%d: VLAN_INPUT_TAG\n",
4543					    __func__, __LINE__);
4544					Debugger();
4545#endif
4546					VLAN_INPUT_TAG(ifp, sendmp, vtag,
4547					    printf("%s: could not apply VLAN "
4548					        "tag", __func__));
4549                                }
4550                        }
4551		} else {
4552			/*
4553			** Either no header split, or a
4554			** secondary piece of a fragmented
4555			** split packet.
4556			*/
4557			mp->m_len = plen;
4558			/*
4559			** See if there is a stored head
4560			** that determines what we are
4561			*/
4562			sendmp = rbuf->fmp;
4563			rbuf->m_pack = rbuf->fmp = NULL;
4564
4565			if (sendmp != NULL) /* secondary frag */
4566				sendmp->m_pkthdr.len += mp->m_len;
4567			else {
4568				/* first desc of a non-ps chain */
4569				sendmp = mp;
4570				sendmp->m_flags |= M_PKTHDR;
4571				sendmp->m_pkthdr.len = mp->m_len;
4572				if (staterr & IXGBE_RXD_STAT_VP) {
4573					/* XXX Do something reasonable on
4574					 * error.
4575					 */
4576#if 0
4577					printf("%s.%d: VLAN_INPUT_TAG\n",
4578					    __func__, __LINE__);
4579					Debugger();
4580#endif
4581					VLAN_INPUT_TAG(ifp, sendmp, vtag,
4582					    printf("%s: could not apply VLAN "
4583					        "tag", __func__));
4584				}
4585                        }
4586			/* Pass the head pointer on */
4587			if (eop == 0) {
4588				nbuf->fmp = sendmp;
4589				sendmp = NULL;
4590				mp->m_next = nbuf->m_pack;
4591			}
4592		}
4593		++processed;
4594		/* Sending this frame? */
4595		if (eop) {
4596			sendmp->m_pkthdr.rcvif = ifp;
4597			ifp->if_ipackets++;
4598			rxr->rx_packets.ev_count++;
4599			/* capture data for AIM */
4600			rxr->bytes += sendmp->m_pkthdr.len;
4601			rxr->rx_bytes.ev_count += sendmp->m_pkthdr.len;
4602			if ((ifp->if_capenable & IFCAP_RXCSUM) != 0) {
4603				ixgbe_rx_checksum(staterr, sendmp, ptype,
4604				   &adapter->stats);
4605			}
4606#if __FreeBSD_version >= 800000
4607			sendmp->m_pkthdr.flowid = que->msix;
4608			sendmp->m_flags |= M_FLOWID;
4609#endif
4610		}
4611next_desc:
4612		ixgbe_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map,
4613		    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
4614
4615		/* Advance our pointers to the next descriptor. */
4616		if (++i == adapter->num_rx_desc)
4617			i = 0;
4618
4619		/* Now send to the stack or do LRO */
4620		if (sendmp != NULL) {
4621			rxr->next_to_check = i;
4622			ixgbe_rx_input(rxr, ifp, sendmp, ptype);
4623			i = rxr->next_to_check;
4624		}
4625
4626               /* Every 8 descriptors we go to refresh mbufs */
4627		if (processed == 8) {
4628			ixgbe_refresh_mbufs(rxr, i);
4629			processed = 0;
4630		}
4631	}
4632
4633	/* Refresh any remaining buf structs */
4634	if (ixgbe_rx_unrefreshed(rxr))
4635		ixgbe_refresh_mbufs(rxr, i);
4636
4637	rxr->next_to_check = i;
4638
4639#ifdef LRO
4640	/*
4641	 * Flush any outstanding LRO work
4642	 */
4643	while ((queued = SLIST_FIRST(&lro->lro_active)) != NULL) {
4644		SLIST_REMOVE_HEAD(&lro->lro_active, next);
4645		tcp_lro_flush(lro, queued);
4646	}
4647#endif /* LRO */
4648
4649	IXGBE_RX_UNLOCK(rxr);
4650
4651	/*
4652	** We still have cleaning to do?
4653	** Schedule another interrupt if so.
4654	*/
4655	if ((staterr & IXGBE_RXD_STAT_DD) != 0) {
4656		ixgbe_rearm_queues(adapter, (u64)(1 << que->msix));
4657		return true;
4658	}
4659
4660	return false;
4661}
4662
4663
4664/*********************************************************************
4665 *
4666 *  Verify that the hardware indicated that the checksum is valid.
4667 *  Inform the stack about the status of checksum so that stack
4668 *  doesn't spend time verifying the checksum.
4669 *
4670 *********************************************************************/
4671static void
4672ixgbe_rx_checksum(u32 staterr, struct mbuf * mp, u32 ptype,
4673    struct ixgbe_hw_stats *stats)
4674{
4675	u16	status = (u16) staterr;
4676	u8	errors = (u8) (staterr >> 24);
4677	bool	sctp = FALSE;
4678
4679	if ((ptype & IXGBE_RXDADV_PKTTYPE_ETQF) == 0 &&
4680	    (ptype & IXGBE_RXDADV_PKTTYPE_SCTP) != 0)
4681		sctp = TRUE;
4682
4683	if (status & IXGBE_RXD_STAT_IPCS) {
4684		stats->ipcs.ev_count++;
4685		if (!(errors & IXGBE_RXD_ERR_IPE)) {
4686			/* IP Checksum Good */
4687			mp->m_pkthdr.csum_flags = M_CSUM_IPv4;
4688
4689		} else {
4690			stats->ipcs_bad.ev_count++;
4691			mp->m_pkthdr.csum_flags = M_CSUM_IPv4|M_CSUM_IPv4_BAD;
4692		}
4693	}
4694	if (status & IXGBE_RXD_STAT_L4CS) {
4695		stats->l4cs.ev_count++;
4696		u16 type = M_CSUM_TCPv4|M_CSUM_TCPv6|M_CSUM_UDPv4|M_CSUM_UDPv6;
4697		if (!(errors & IXGBE_RXD_ERR_TCPE)) {
4698			mp->m_pkthdr.csum_flags |= type;
4699		} else {
4700			stats->l4cs_bad.ev_count++;
4701			mp->m_pkthdr.csum_flags |= type | M_CSUM_TCP_UDP_BAD;
4702		}
4703	}
4704	return;
4705}
4706
4707
4708#if 0	/* XXX Badly need to overhaul vlan(4) on NetBSD. */
4709/*
4710** This routine is run via an vlan config EVENT,
4711** it enables us to use the HW Filter table since
4712** we can get the vlan id. This just creates the
4713** entry in the soft version of the VFTA, init will
4714** repopulate the real table.
4715*/
4716static void
4717ixgbe_register_vlan(void *arg, struct ifnet *ifp, u16 vtag)
4718{
4719	struct adapter	*adapter = ifp->if_softc;
4720	u16		index, bit;
4721
4722	if (ifp->if_softc !=  arg)   /* Not our event */
4723		return;
4724
4725	if ((vtag == 0) || (vtag > 4095))	/* Invalid */
4726		return;
4727
4728	IXGBE_CORE_LOCK(adapter);
4729	index = (vtag >> 5) & 0x7F;
4730	bit = vtag & 0x1F;
4731	adapter->shadow_vfta[index] |= (1 << bit);
4732	ixgbe_init_locked(adapter);
4733	IXGBE_CORE_UNLOCK(adapter);
4734}
4735
4736/*
4737** This routine is run via an vlan
4738** unconfig EVENT, remove our entry
4739** in the soft vfta.
4740*/
4741static void
4742ixgbe_unregister_vlan(void *arg, struct ifnet *ifp, u16 vtag)
4743{
4744	struct adapter	*adapter = ifp->if_softc;
4745	u16		index, bit;
4746
4747	if (ifp->if_softc !=  arg)
4748		return;
4749
4750	if ((vtag == 0) || (vtag > 4095))	/* Invalid */
4751		return;
4752
4753	IXGBE_CORE_LOCK(adapter);
4754	index = (vtag >> 5) & 0x7F;
4755	bit = vtag & 0x1F;
4756	adapter->shadow_vfta[index] &= ~(1 << bit);
4757	/* Re-init to load the changes */
4758	ixgbe_init_locked(adapter);
4759	IXGBE_CORE_UNLOCK(adapter);
4760}
4761#endif
4762
4763static void
4764ixgbe_setup_vlan_hw_support(struct adapter *adapter)
4765{
4766	struct ethercom *ec = &adapter->osdep.ec;
4767	struct ixgbe_hw *hw = &adapter->hw;
4768	u32		ctrl;
4769
4770	printf("%s: %s enter\n", device_xname(adapter->dev), __func__);
4771
4772	/*
4773	** We get here thru init_locked, meaning
4774	** a soft reset, this has already cleared
4775	** the VFTA and other state, so if there
4776	** have been no vlan's registered do nothing.
4777	*/
4778	if (!VLAN_ATTACHED(&adapter->osdep.ec)) {
4779		printf("%s: no VLANs attached\n", device_xname(adapter->dev));
4780		return;
4781	}
4782
4783	/*
4784	** A soft reset zero's out the VFTA, so
4785	** we need to repopulate it now.
4786	*/
4787	for (int i = 0; i < IXGBE_VFTA_SIZE; i++)
4788		if (adapter->shadow_vfta[i] != 0)
4789			IXGBE_WRITE_REG(hw, IXGBE_VFTA(i),
4790			    adapter->shadow_vfta[i]);
4791
4792	ctrl = IXGBE_READ_REG(hw, IXGBE_VLNCTRL);
4793	/* Enable the Filter Table if enabled */
4794	if (ec->ec_capenable & ETHERCAP_VLAN_HWFILTER) {
4795		ctrl &= ~IXGBE_VLNCTRL_CFIEN;
4796		ctrl |= IXGBE_VLNCTRL_VFE;
4797		printf("%s: enabled h/w VLAN filter\n",
4798		    device_xname(adapter->dev));
4799	}
4800	if (hw->mac.type == ixgbe_mac_82598EB)
4801		ctrl |= IXGBE_VLNCTRL_VME;
4802	IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, ctrl);
4803
4804	/* On 82599 the VLAN enable is per/queue in RXDCTL */
4805	if (hw->mac.type != ixgbe_mac_82598EB)
4806		for (int i = 0; i < adapter->num_queues; i++) {
4807			ctrl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(i));
4808				ctrl |= IXGBE_RXDCTL_VME;
4809			IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(i), ctrl);
4810			printf("%s: enabled VLAN queue %d\n",
4811			    device_xname(adapter->dev), i);
4812		}
4813}
4814
4815static void
4816ixgbe_enable_intr(struct adapter *adapter)
4817{
4818	struct ixgbe_hw *hw = &adapter->hw;
4819	struct ix_queue *que = adapter->queues;
4820	u32 mask = (IXGBE_EIMS_ENABLE_MASK & ~IXGBE_EIMS_RTX_QUEUE);
4821
4822
4823	/* Enable Fan Failure detection */
4824	if (hw->device_id == IXGBE_DEV_ID_82598AT)
4825		    mask |= IXGBE_EIMS_GPI_SDP1;
4826	else {
4827		    mask |= IXGBE_EIMS_ECC;
4828		    mask |= IXGBE_EIMS_GPI_SDP1;
4829		    mask |= IXGBE_EIMS_GPI_SDP2;
4830#ifdef IXGBE_FDIR
4831		    mask |= IXGBE_EIMS_FLOW_DIR;
4832#endif
4833	}
4834
4835	IXGBE_WRITE_REG(hw, IXGBE_EIMS, mask);
4836
4837	/* With RSS we use auto clear */
4838	if (adapter->msix_mem) {
4839		mask = IXGBE_EIMS_ENABLE_MASK;
4840		/* Don't autoclear Link */
4841		mask &= ~IXGBE_EIMS_OTHER;
4842		mask &= ~IXGBE_EIMS_LSC;
4843		IXGBE_WRITE_REG(hw, IXGBE_EIAC, mask);
4844	}
4845
4846	/*
4847	** Now enable all queues, this is done separately to
4848	** allow for handling the extended (beyond 32) MSIX
4849	** vectors that can be used by 82599
4850	*/
4851        for (int i = 0; i < adapter->num_queues; i++, que++)
4852                ixgbe_enable_queue(adapter, que->msix);
4853
4854	IXGBE_WRITE_FLUSH(hw);
4855
4856	return;
4857}
4858
4859static void
4860ixgbe_disable_intr(struct adapter *adapter)
4861{
4862	if (adapter->msix_mem)
4863		IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIAC, 0);
4864	if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
4865		IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~0);
4866	} else {
4867		IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, 0xFFFF0000);
4868		IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC_EX(0), ~0);
4869		IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC_EX(1), ~0);
4870	}
4871	IXGBE_WRITE_FLUSH(&adapter->hw);
4872	return;
4873}
4874
4875u16
4876ixgbe_read_pci_cfg(struct ixgbe_hw *hw, u32 reg)
4877{
4878	switch (reg % 4) {
4879	case 0:
4880		return pci_conf_read(hw->back->pc, hw->back->tag, reg) &
4881		    __BITS(15, 0);
4882	case 2:
4883		return __SHIFTOUT(pci_conf_read(hw->back->pc, hw->back->tag,
4884		    reg - 2), __BITS(31, 16));
4885	default:
4886		panic("%s: invalid register (%" PRIx32, __func__, reg);
4887		break;
4888	}
4889}
4890
4891void
4892ixgbe_write_pci_cfg(struct ixgbe_hw *hw, u32 reg, u16 value)
4893{
4894	pcireg_t old;
4895
4896	switch (reg % 4) {
4897	case 0:
4898		old = pci_conf_read(hw->back->pc, hw->back->tag, reg) &
4899		    __BITS(31, 16);
4900		pci_conf_write(hw->back->pc, hw->back->tag, reg, value | old);
4901		break;
4902	case 2:
4903		old = pci_conf_read(hw->back->pc, hw->back->tag, reg - 2) &
4904		    __BITS(15, 0);
4905		pci_conf_write(hw->back->pc, hw->back->tag, reg - 2,
4906		    __SHIFTIN(value, __BITS(31, 16)) | old);
4907		break;
4908	default:
4909		panic("%s: invalid register (%" PRIx32, __func__, reg);
4910		break;
4911	}
4912
4913	return;
4914}
4915
4916/*
4917** Setup the correct IVAR register for a particular MSIX interrupt
4918**   (yes this is all very magic and confusing :)
4919**  - entry is the register array entry
4920**  - vector is the MSIX vector for this queue
4921**  - type is RX/TX/MISC
4922*/
4923static void
4924ixgbe_set_ivar(struct adapter *adapter, u8 entry, u8 vector, s8 type)
4925{
4926	struct ixgbe_hw *hw = &adapter->hw;
4927	u32 ivar, index;
4928
4929	vector |= IXGBE_IVAR_ALLOC_VAL;
4930
4931	switch (hw->mac.type) {
4932
4933	case ixgbe_mac_82598EB:
4934		if (type == -1)
4935			entry = IXGBE_IVAR_OTHER_CAUSES_INDEX;
4936		else
4937			entry += (type * 64);
4938		index = (entry >> 2) & 0x1F;
4939		ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(index));
4940		ivar &= ~(0xFF << (8 * (entry & 0x3)));
4941		ivar |= (vector << (8 * (entry & 0x3)));
4942		IXGBE_WRITE_REG(&adapter->hw, IXGBE_IVAR(index), ivar);
4943		break;
4944
4945	case ixgbe_mac_82599EB:
4946		if (type == -1) { /* MISC IVAR */
4947			index = (entry & 1) * 8;
4948			ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
4949			ivar &= ~(0xFF << index);
4950			ivar |= (vector << index);
4951			IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, ivar);
4952		} else {	/* RX/TX IVARS */
4953			index = (16 * (entry & 1)) + (8 * type);
4954			ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(entry >> 1));
4955			ivar &= ~(0xFF << index);
4956			ivar |= (vector << index);
4957			IXGBE_WRITE_REG(hw, IXGBE_IVAR(entry >> 1), ivar);
4958		}
4959
4960	default:
4961		break;
4962	}
4963}
4964
4965static void
4966ixgbe_configure_ivars(struct adapter *adapter)
4967{
4968	struct  ix_queue *que = adapter->queues;
4969	u32 newitr;
4970
4971	if (ixgbe_max_interrupt_rate > 0)
4972		newitr = (8000000 / ixgbe_max_interrupt_rate) & 0x0FF8;
4973	else
4974		newitr = 0;
4975
4976        for (int i = 0; i < adapter->num_queues; i++, que++) {
4977		/* First the RX queue entry */
4978                ixgbe_set_ivar(adapter, i, que->msix, 0);
4979		/* ... and the TX */
4980		ixgbe_set_ivar(adapter, i, que->msix, 1);
4981		/* Set an Initial EITR value */
4982                IXGBE_WRITE_REG(&adapter->hw,
4983                    IXGBE_EITR(que->msix), newitr);
4984	}
4985
4986	/* For the Link interrupt */
4987        ixgbe_set_ivar(adapter, 1, adapter->linkvec, -1);
4988}
4989
4990/*
4991** ixgbe_sfp_probe - called in the local timer to
4992** determine if a port had optics inserted.
4993*/
4994static bool ixgbe_sfp_probe(struct adapter *adapter)
4995{
4996	struct ixgbe_hw	*hw = &adapter->hw;
4997	device_t	dev = adapter->dev;
4998	bool		result = FALSE;
4999
5000	if ((hw->phy.type == ixgbe_phy_nl) &&
5001	    (hw->phy.sfp_type == ixgbe_sfp_type_not_present)) {
5002		s32 ret = hw->phy.ops.identify_sfp(hw);
5003		if (ret)
5004                        goto out;
5005		ret = hw->phy.ops.reset(hw);
5006		if (ret == IXGBE_ERR_SFP_NOT_SUPPORTED) {
5007			device_printf(dev,"Unsupported SFP+ module detected!");
5008			device_printf(dev, "Reload driver with supported module.\n");
5009			adapter->sfp_probe = FALSE;
5010                        goto out;
5011		} else
5012			device_printf(dev,"SFP+ module detected!\n");
5013		/* We now have supported optics */
5014		adapter->sfp_probe = FALSE;
5015		/* Set the optics type so system reports correctly */
5016		ixgbe_setup_optics(adapter);
5017		result = TRUE;
5018	}
5019out:
5020	return (result);
5021}
5022
5023/*
5024** Tasklet handler for MSIX Link interrupts
5025**  - do outside interrupt since it might sleep
5026*/
5027static void
5028ixgbe_handle_link(void *context)
5029{
5030	struct adapter  *adapter = context;
5031
5032	ixgbe_check_link(&adapter->hw,
5033	    &adapter->link_speed, &adapter->link_up, 0);
5034       	ixgbe_update_link_status(adapter);
5035}
5036
5037/*
5038** Tasklet for handling SFP module interrupts
5039*/
5040static void
5041ixgbe_handle_mod(void *context)
5042{
5043	struct adapter  *adapter = context;
5044	struct ixgbe_hw *hw = &adapter->hw;
5045	device_t	dev = adapter->dev;
5046	u32 err;
5047
5048	err = hw->phy.ops.identify_sfp(hw);
5049	if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
5050		device_printf(dev,
5051		    "Unsupported SFP+ module type was detected.\n");
5052		return;
5053	}
5054	err = hw->mac.ops.setup_sfp(hw);
5055	if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
5056		device_printf(dev,
5057		    "Setup failure - unsupported SFP+ module type.\n");
5058		return;
5059	}
5060	softint_schedule(adapter->msf_si);
5061	return;
5062}
5063
5064
5065/*
5066** Tasklet for handling MSF (multispeed fiber) interrupts
5067*/
5068static void
5069ixgbe_handle_msf(void *context)
5070{
5071	struct adapter  *adapter = context;
5072	struct ixgbe_hw *hw = &adapter->hw;
5073	u32 autoneg;
5074	bool negotiate;
5075
5076	autoneg = hw->phy.autoneg_advertised;
5077	if ((!autoneg) && (hw->mac.ops.get_link_capabilities))
5078		hw->mac.ops.get_link_capabilities(hw, &autoneg, &negotiate);
5079	if (hw->mac.ops.setup_link)
5080		hw->mac.ops.setup_link(hw, autoneg, negotiate, TRUE);
5081	return;
5082}
5083
5084#ifdef IXGBE_FDIR
5085/*
5086** Tasklet for reinitializing the Flow Director filter table
5087*/
5088static void
5089ixgbe_reinit_fdir(void *context)
5090{
5091	struct adapter  *adapter = context;
5092	struct ifnet   *ifp = adapter->ifp;
5093
5094	if (adapter->fdir_reinit != 1) /* Shouldn't happen */
5095		return;
5096	ixgbe_reinit_fdir_tables_82599(&adapter->hw);
5097	adapter->fdir_reinit = 0;
5098	/* Restart the interface */
5099	ifp->if_flags |= IFF_RUNNING;
5100	return;
5101}
5102#endif
5103
5104/**********************************************************************
5105 *
5106 *  Update the board statistics counters.
5107 *
5108 **********************************************************************/
5109static void
5110ixgbe_update_stats_counters(struct adapter *adapter)
5111{
5112	struct ifnet   *ifp = adapter->ifp;
5113	struct ixgbe_hw *hw = &adapter->hw;
5114	u32  missed_rx = 0, bprc, lxon, lxoff, total;
5115	u64  total_missed_rx = 0;
5116
5117	adapter->stats.crcerrs.ev_count += IXGBE_READ_REG(hw, IXGBE_CRCERRS);
5118	adapter->stats.illerrc.ev_count += IXGBE_READ_REG(hw, IXGBE_ILLERRC);
5119	adapter->stats.errbc.ev_count += IXGBE_READ_REG(hw, IXGBE_ERRBC);
5120	adapter->stats.mspdc.ev_count += IXGBE_READ_REG(hw, IXGBE_MSPDC);
5121
5122	for (int i = 0; i < __arraycount(adapter->stats.mpc); i++) {
5123		int j = i % adapter->num_queues;
5124		u32 mp;
5125		mp = IXGBE_READ_REG(hw, IXGBE_MPC(i));
5126		/* missed_rx tallies misses for the gprc workaround */
5127		missed_rx += mp;
5128		/* global total per queue */
5129        	adapter->stats.mpc[j].ev_count += mp;
5130		/* Running comprehensive total for stats display */
5131		total_missed_rx += adapter->stats.mpc[j].ev_count;
5132		if (hw->mac.type == ixgbe_mac_82598EB)
5133			adapter->stats.rnbc[j] +=
5134			    IXGBE_READ_REG(hw, IXGBE_RNBC(i));
5135		adapter->stats.pxontxc[j].ev_count +=
5136		    IXGBE_READ_REG(hw, IXGBE_PXONTXC(i));
5137		adapter->stats.pxonrxc[j].ev_count +=
5138		    IXGBE_READ_REG(hw, IXGBE_PXONRXC(i));
5139		adapter->stats.pxofftxc[j].ev_count +=
5140		    IXGBE_READ_REG(hw, IXGBE_PXOFFTXC(i));
5141		adapter->stats.pxoffrxc[j].ev_count +=
5142		    IXGBE_READ_REG(hw, IXGBE_PXOFFRXC(i));
5143		adapter->stats.pxon2offc[j].ev_count +=
5144		    IXGBE_READ_REG(hw, IXGBE_PXON2OFFCNT(i));
5145	}
5146	for (int i = 0; i < __arraycount(adapter->stats.qprc); i++) {
5147		int j = i % adapter->num_queues;
5148		adapter->stats.qprc[j].ev_count += IXGBE_READ_REG(hw, IXGBE_QPRC(i));
5149		adapter->stats.qptc[j].ev_count += IXGBE_READ_REG(hw, IXGBE_QPTC(i));
5150		adapter->stats.qbrc[j].ev_count += IXGBE_READ_REG(hw, IXGBE_QBRC(i));
5151		adapter->stats.qbrc[j].ev_count +=
5152		    ((u64)IXGBE_READ_REG(hw, IXGBE_QBRC(i)) << 32);
5153		adapter->stats.qbtc[j].ev_count += IXGBE_READ_REG(hw, IXGBE_QBTC(i));
5154		adapter->stats.qbtc[j].ev_count +=
5155		    ((u64)IXGBE_READ_REG(hw, IXGBE_QBTC(i)) << 32);
5156		adapter->stats.qprdc[j].ev_count += IXGBE_READ_REG(hw, IXGBE_QPRDC(i));
5157	}
5158	adapter->stats.mlfc.ev_count += IXGBE_READ_REG(hw, IXGBE_MLFC);
5159	adapter->stats.mrfc.ev_count += IXGBE_READ_REG(hw, IXGBE_MRFC);
5160	adapter->stats.rlec.ev_count += IXGBE_READ_REG(hw, IXGBE_RLEC);
5161
5162	/* Hardware workaround, gprc counts missed packets */
5163	adapter->stats.gprc.ev_count += IXGBE_READ_REG(hw, IXGBE_GPRC) - missed_rx;
5164
5165	lxon = IXGBE_READ_REG(hw, IXGBE_LXONTXC);
5166	adapter->stats.lxontxc.ev_count += lxon;
5167	lxoff = IXGBE_READ_REG(hw, IXGBE_LXOFFTXC);
5168	adapter->stats.lxofftxc.ev_count += lxoff;
5169	total = lxon + lxoff;
5170
5171	if (hw->mac.type != ixgbe_mac_82598EB) {
5172		adapter->stats.gorc.ev_count += IXGBE_READ_REG(hw, IXGBE_GORCL) +
5173		    ((u64)IXGBE_READ_REG(hw, IXGBE_GORCH) << 32);
5174		adapter->stats.gotc.ev_count += IXGBE_READ_REG(hw, IXGBE_GOTCL) +
5175		    ((u64)IXGBE_READ_REG(hw, IXGBE_GOTCH) << 32) - total * ETHER_MIN_LEN;
5176		adapter->stats.tor.ev_count += IXGBE_READ_REG(hw, IXGBE_TORL) +
5177		    ((u64)IXGBE_READ_REG(hw, IXGBE_TORH) << 32);
5178		adapter->stats.lxonrxc.ev_count += IXGBE_READ_REG(hw, IXGBE_LXONRXCNT);
5179		adapter->stats.lxoffrxc.ev_count += IXGBE_READ_REG(hw, IXGBE_LXOFFRXCNT);
5180	} else {
5181		adapter->stats.lxonrxc.ev_count += IXGBE_READ_REG(hw, IXGBE_LXONRXC);
5182		adapter->stats.lxoffrxc.ev_count += IXGBE_READ_REG(hw, IXGBE_LXOFFRXC);
5183		/* 82598 only has a counter in the high register */
5184		adapter->stats.gorc.ev_count += IXGBE_READ_REG(hw, IXGBE_GORCH);
5185		adapter->stats.gotc.ev_count += IXGBE_READ_REG(hw, IXGBE_GOTCH) - total * ETHER_MIN_LEN;
5186		adapter->stats.tor.ev_count += IXGBE_READ_REG(hw, IXGBE_TORH);
5187	}
5188
5189	/*
5190	 * Workaround: mprc hardware is incorrectly counting
5191	 * broadcasts, so for now we subtract those.
5192	 */
5193	bprc = IXGBE_READ_REG(hw, IXGBE_BPRC);
5194	adapter->stats.bprc.ev_count += bprc;
5195	adapter->stats.mprc.ev_count += IXGBE_READ_REG(hw, IXGBE_MPRC) - ((hw->mac.type == ixgbe_mac_82598EB) ? bprc : 0);
5196
5197	adapter->stats.prc64.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC64);
5198	adapter->stats.prc127.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC127);
5199	adapter->stats.prc255.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC255);
5200	adapter->stats.prc511.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC511);
5201	adapter->stats.prc1023.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC1023);
5202	adapter->stats.prc1522.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC1522);
5203
5204	adapter->stats.gptc.ev_count += IXGBE_READ_REG(hw, IXGBE_GPTC) - total;
5205	adapter->stats.mptc.ev_count += IXGBE_READ_REG(hw, IXGBE_MPTC) - total;
5206	adapter->stats.ptc64.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC64) - total;
5207
5208	adapter->stats.ruc.ev_count += IXGBE_READ_REG(hw, IXGBE_RUC);
5209	adapter->stats.rfc.ev_count += IXGBE_READ_REG(hw, IXGBE_RFC);
5210	adapter->stats.roc.ev_count += IXGBE_READ_REG(hw, IXGBE_ROC);
5211	adapter->stats.rjc.ev_count += IXGBE_READ_REG(hw, IXGBE_RJC);
5212	adapter->stats.mngprc.ev_count += IXGBE_READ_REG(hw, IXGBE_MNGPRC);
5213	adapter->stats.mngpdc.ev_count += IXGBE_READ_REG(hw, IXGBE_MNGPDC);
5214	adapter->stats.mngptc.ev_count += IXGBE_READ_REG(hw, IXGBE_MNGPTC);
5215	adapter->stats.tpr.ev_count += IXGBE_READ_REG(hw, IXGBE_TPR);
5216	adapter->stats.tpt.ev_count += IXGBE_READ_REG(hw, IXGBE_TPT);
5217	adapter->stats.ptc127.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC127);
5218	adapter->stats.ptc255.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC255);
5219	adapter->stats.ptc511.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC511);
5220	adapter->stats.ptc1023.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC1023);
5221	adapter->stats.ptc1522.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC1522);
5222	adapter->stats.bptc.ev_count += IXGBE_READ_REG(hw, IXGBE_BPTC);
5223	adapter->stats.xec.ev_count += IXGBE_READ_REG(hw, IXGBE_XEC);
5224	adapter->stats.fccrc.ev_count += IXGBE_READ_REG(hw, IXGBE_FCCRC);
5225	adapter->stats.fclast.ev_count += IXGBE_READ_REG(hw, IXGBE_FCLAST);
5226
5227	/* Only read FCOE on 82599 */
5228	if (hw->mac.type != ixgbe_mac_82598EB) {
5229		adapter->stats.fcoerpdc.ev_count +=
5230		    IXGBE_READ_REG(hw, IXGBE_FCOERPDC);
5231		adapter->stats.fcoeprc.ev_count +=
5232		    IXGBE_READ_REG(hw, IXGBE_FCOEPRC);
5233		adapter->stats.fcoeptc.ev_count +=
5234		    IXGBE_READ_REG(hw, IXGBE_FCOEPTC);
5235		adapter->stats.fcoedwrc.ev_count +=
5236		    IXGBE_READ_REG(hw, IXGBE_FCOEDWRC);
5237		adapter->stats.fcoedwtc.ev_count +=
5238		    IXGBE_READ_REG(hw, IXGBE_FCOEDWTC);
5239	}
5240
5241	/* Fill out the OS statistics structure */
5242	ifp->if_ipackets = adapter->stats.gprc.ev_count;
5243	ifp->if_opackets = adapter->stats.gptc.ev_count;
5244	ifp->if_ibytes = adapter->stats.gorc.ev_count;
5245	ifp->if_obytes = adapter->stats.gotc.ev_count;
5246	ifp->if_imcasts = adapter->stats.mprc.ev_count;
5247	ifp->if_collisions = 0;
5248
5249	/* Rx Errors */
5250	ifp->if_ierrors = total_missed_rx + adapter->stats.crcerrs.ev_count +
5251		adapter->stats.rlec.ev_count;
5252}
5253
5254/** ixgbe_sysctl_tdh_handler - Handler function
5255 *  Retrieves the TDH value from the hardware
5256 */
5257static int
5258ixgbe_sysctl_tdh_handler(SYSCTLFN_ARGS)
5259{
5260	struct sysctlnode node;
5261	uint32_t val;
5262	struct tx_ring *txr;
5263
5264	node = *rnode;
5265	txr = (struct tx_ring *)node.sysctl_data;
5266	if (txr == NULL)
5267		return 0;
5268	val = IXGBE_READ_REG(&txr->adapter->hw, IXGBE_TDH(txr->me));
5269	node.sysctl_data = &val;
5270	return sysctl_lookup(SYSCTLFN_CALL(&node));
5271}
5272
5273/** ixgbe_sysctl_tdt_handler - Handler function
5274 *  Retrieves the TDT value from the hardware
5275 */
5276static int
5277ixgbe_sysctl_tdt_handler(SYSCTLFN_ARGS)
5278{
5279	struct sysctlnode node;
5280	uint32_t val;
5281	struct tx_ring *txr;
5282
5283	node = *rnode;
5284	txr = (struct tx_ring *)node.sysctl_data;
5285	if (txr == NULL)
5286		return 0;
5287	val = IXGBE_READ_REG(&txr->adapter->hw, IXGBE_TDT(txr->me));
5288	node.sysctl_data = &val;
5289	return sysctl_lookup(SYSCTLFN_CALL(&node));
5290}
5291
5292/** ixgbe_sysctl_rdh_handler - Handler function
5293 *  Retrieves the RDH value from the hardware
5294 */
5295static int
5296ixgbe_sysctl_rdh_handler(SYSCTLFN_ARGS)
5297{
5298	struct sysctlnode node;
5299	uint32_t val;
5300	struct rx_ring *rxr;
5301
5302	node = *rnode;
5303	rxr = (struct rx_ring *)node.sysctl_data;
5304	if (rxr == NULL)
5305		return 0;
5306	val = IXGBE_READ_REG(&rxr->adapter->hw, IXGBE_RDH(rxr->me));
5307	node.sysctl_data = &val;
5308	return sysctl_lookup(SYSCTLFN_CALL(&node));
5309}
5310
5311/** ixgbe_sysctl_rdt_handler - Handler function
5312 *  Retrieves the RDT value from the hardware
5313 */
5314static int
5315ixgbe_sysctl_rdt_handler(SYSCTLFN_ARGS)
5316{
5317	struct sysctlnode node;
5318	uint32_t val;
5319	struct rx_ring *rxr;
5320
5321	node = *rnode;
5322	rxr = (struct rx_ring *)node.sysctl_data;
5323	if (rxr == NULL)
5324		return 0;
5325	val = IXGBE_READ_REG(&rxr->adapter->hw, IXGBE_RDT(rxr->me));
5326	node.sysctl_data = &val;
5327	return sysctl_lookup(SYSCTLFN_CALL(&node));
5328}
5329
5330static int
5331ixgbe_sysctl_interrupt_rate_handler(SYSCTLFN_ARGS)
5332{
5333	struct sysctlnode node;
5334	struct ix_queue *que;
5335	uint32_t reg, usec, rate;
5336
5337	node = *rnode;
5338	que = (struct ix_queue *)node.sysctl_data;
5339	if (que == NULL)
5340		return 0;
5341	reg = IXGBE_READ_REG(&que->adapter->hw, IXGBE_EITR(que->msix));
5342	usec = ((reg & 0x0FF8) >> 3);
5343	if (usec > 0)
5344		rate = 1000000 / usec;
5345	else
5346		rate = 0;
5347	node.sysctl_data = &rate;
5348	return sysctl_lookup(SYSCTLFN_CALL(&node));
5349}
5350
5351const struct sysctlnode *
5352ixgbe_sysctl_instance(struct adapter *adapter)
5353{
5354	const char *dvname;
5355	struct sysctllog **log;
5356	int rc;
5357	const struct sysctlnode *rnode;
5358
5359	log = &adapter->sysctllog;
5360	dvname = device_xname(adapter->dev);
5361
5362	if ((rc = sysctl_createv(log, 0, NULL, &rnode,
5363	    0, CTLTYPE_NODE, "hw", NULL,
5364	    NULL, 0, NULL, 0, CTL_HW, CTL_EOL)) != 0)
5365		goto err;
5366
5367	if ((rc = sysctl_createv(log, 0, &rnode, &rnode,
5368	    0, CTLTYPE_NODE, dvname,
5369	    SYSCTL_DESCR("ixgbe information and settings"),
5370	    NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL)) != 0)
5371		goto err;
5372
5373	return rnode;
5374err:
5375	printf("%s: sysctl_createv failed, rc = %d\n", __func__, rc);
5376	return NULL;
5377}
5378
5379/*
5380 * Add sysctl variables, one per statistic, to the system.
5381 */
5382static void
5383ixgbe_add_hw_stats(struct adapter *adapter)
5384{
5385	device_t dev = adapter->dev;
5386	const struct sysctlnode *rnode, *cnode;
5387	struct sysctllog **log = &adapter->sysctllog;
5388	struct tx_ring *txr = adapter->tx_rings;
5389	struct rx_ring *rxr = adapter->rx_rings;
5390	struct ixgbe_hw	 *hw = &adapter->hw;
5391
5392	struct ixgbe_hw_stats *stats = &adapter->stats;
5393
5394	/* Driver Statistics */
5395#if 0
5396	/* These counters are not updated by the software */
5397	SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "dropped",
5398			CTLFLAG_RD, &adapter->dropped_pkts,
5399			"Driver dropped packets");
5400	SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "mbuf_header_failed",
5401			CTLFLAG_RD, &adapter->mbuf_header_failed,
5402			"???");
5403	SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "mbuf_packet_failed",
5404			CTLFLAG_RD, &adapter->mbuf_packet_failed,
5405			"???");
5406	SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "no_tx_map_avail",
5407			CTLFLAG_RD, &adapter->no_tx_map_avail,
5408			"???");
5409#endif
5410	evcnt_attach_dynamic(&adapter->handleq, EVCNT_TYPE_MISC,
5411	    NULL, device_xname(dev), "Handled queue in softint");
5412	evcnt_attach_dynamic(&adapter->req, EVCNT_TYPE_MISC,
5413	    NULL, device_xname(dev), "Requeued in softint");
5414	evcnt_attach_dynamic(&adapter->morerx, EVCNT_TYPE_MISC,
5415	    NULL, device_xname(dev), "Interrupt handler more rx");
5416	evcnt_attach_dynamic(&adapter->moretx, EVCNT_TYPE_MISC,
5417	    NULL, device_xname(dev), "Interrupt handler more tx");
5418	evcnt_attach_dynamic(&adapter->txloops, EVCNT_TYPE_MISC,
5419	    NULL, device_xname(dev), "Interrupt handler tx loops");
5420	evcnt_attach_dynamic(&adapter->efbig_tx_dma_setup, EVCNT_TYPE_MISC,
5421	    NULL, device_xname(dev), "Driver tx dma soft fail EFBIG");
5422	evcnt_attach_dynamic(&adapter->m_defrag_failed, EVCNT_TYPE_MISC,
5423	    NULL, device_xname(dev), "m_defrag() failed");
5424	evcnt_attach_dynamic(&adapter->efbig2_tx_dma_setup, EVCNT_TYPE_MISC,
5425	    NULL, device_xname(dev), "Driver tx dma hard fail EFBIG");
5426	evcnt_attach_dynamic(&adapter->einval_tx_dma_setup, EVCNT_TYPE_MISC,
5427	    NULL, device_xname(dev), "Driver tx dma hard fail EINVAL");
5428	evcnt_attach_dynamic(&adapter->other_tx_dma_setup, EVCNT_TYPE_MISC,
5429	    NULL, device_xname(dev), "Driver tx dma hard fail other");
5430	evcnt_attach_dynamic(&adapter->eagain_tx_dma_setup, EVCNT_TYPE_MISC,
5431	    NULL, device_xname(dev), "Driver tx dma soft fail EAGAIN");
5432	evcnt_attach_dynamic(&adapter->enomem_tx_dma_setup, EVCNT_TYPE_MISC,
5433	    NULL, device_xname(dev), "Driver tx dma soft fail ENOMEM");
5434	evcnt_attach_dynamic(&adapter->watchdog_events, EVCNT_TYPE_MISC,
5435	    NULL, device_xname(dev), "Watchdog timeouts");
5436	evcnt_attach_dynamic(&adapter->tso_err, EVCNT_TYPE_MISC,
5437	    NULL, device_xname(dev), "TSO errors");
5438	evcnt_attach_dynamic(&adapter->tso_tx, EVCNT_TYPE_MISC,
5439	    NULL, device_xname(dev), "TSO");
5440	evcnt_attach_dynamic(&adapter->link_irq, EVCNT_TYPE_MISC,
5441	    NULL, device_xname(dev), "Link MSIX IRQ Handled");
5442
5443	for (int i = 0; i < adapter->num_queues; i++, rxr++, txr++) {
5444		snprintf(adapter->queues[i].evnamebuf,
5445		    sizeof(adapter->queues[i].evnamebuf), "%s queue%d",
5446		    device_xname(dev), i);
5447		snprintf(adapter->queues[i].namebuf,
5448		    sizeof(adapter->queues[i].namebuf), "queue%d", i);
5449
5450		if ((rnode = ixgbe_sysctl_instance(adapter)) == NULL) {
5451			aprint_error_dev(dev, "could not create sysctl root\n");
5452			break;
5453		}
5454
5455		if (sysctl_createv(log, 0, &rnode, &rnode,
5456		    0, CTLTYPE_NODE,
5457		    adapter->queues[i].namebuf, SYSCTL_DESCR("Queue Name"),
5458		    NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL) != 0)
5459			break;
5460
5461		if (sysctl_createv(log, 0, &rnode, &cnode,
5462		    CTLFLAG_READONLY, CTLTYPE_INT,
5463		    "interrupt_rate", SYSCTL_DESCR("Interrupt Rate"),
5464		    ixgbe_sysctl_interrupt_rate_handler, 0, &adapter->queues[i],
5465		    0, CTL_CREATE, CTL_EOL) != 0)
5466			break;
5467
5468		if (sysctl_createv(log, 0, &rnode, &cnode,
5469		    CTLFLAG_READONLY, CTLTYPE_INT,
5470		    "txd_head", SYSCTL_DESCR("Transmit Descriptor Head"),
5471		    ixgbe_sysctl_tdh_handler, 0, txr,
5472		    0, CTL_CREATE, CTL_EOL) != 0)
5473			break;
5474
5475		if (sysctl_createv(log, 0, &rnode, &cnode,
5476		    CTLFLAG_READONLY, CTLTYPE_INT,
5477		    "txd_tail", SYSCTL_DESCR("Transmit Descriptor Tail"),
5478		    ixgbe_sysctl_tdt_handler, 0, txr,
5479		    0, CTL_CREATE, CTL_EOL) != 0)
5480			break;
5481
5482		evcnt_attach_dynamic(&txr->no_desc_avail, EVCNT_TYPE_MISC,
5483		    NULL, adapter->queues[i].evnamebuf,
5484		    "Queue No Descriptor Available");
5485		evcnt_attach_dynamic(&txr->total_packets, EVCNT_TYPE_MISC,
5486		    NULL, adapter->queues[i].evnamebuf,
5487		    "Queue Packets Transmitted");
5488
5489#ifdef LRO
5490		struct lro_ctrl *lro = &rxr->lro;
5491#endif /* LRO */
5492
5493		if (sysctl_createv(log, 0, &rnode, &cnode,
5494		    CTLFLAG_READONLY,
5495		    CTLTYPE_INT,
5496		    "rxd_head", SYSCTL_DESCR("Receive Descriptor Head"),
5497		    ixgbe_sysctl_rdh_handler, 0, rxr, 0,
5498		    CTL_CREATE, CTL_EOL) != 0)
5499			break;
5500
5501		if (sysctl_createv(log, 0, &rnode, &cnode,
5502		    CTLFLAG_READONLY,
5503		    CTLTYPE_INT,
5504		    "rxd_tail", SYSCTL_DESCR("Receive Descriptor Tail"),
5505		    ixgbe_sysctl_rdt_handler, 0, rxr, 0,
5506		    CTL_CREATE, CTL_EOL) != 0)
5507			break;
5508
5509		if (i < __arraycount(adapter->stats.mpc)) {
5510			evcnt_attach_dynamic(&adapter->stats.mpc[i],
5511			    EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
5512			    "Missed Packet Count");
5513		}
5514		if (i < __arraycount(adapter->stats.pxontxc)) {
5515			evcnt_attach_dynamic(&adapter->stats.pxontxc[i],
5516			    EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
5517			    "pxontxc");
5518			evcnt_attach_dynamic(&adapter->stats.pxonrxc[i],
5519			    EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
5520			    "pxonrxc");
5521			evcnt_attach_dynamic(&adapter->stats.pxofftxc[i],
5522			    EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
5523			    "pxofftxc");
5524			evcnt_attach_dynamic(&adapter->stats.pxoffrxc[i],
5525			    EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
5526			    "pxoffrxc");
5527			evcnt_attach_dynamic(&adapter->stats.pxon2offc[i],
5528			    EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
5529			    "pxon2offc");
5530		}
5531		if (i < __arraycount(adapter->stats.qprc)) {
5532			evcnt_attach_dynamic(&adapter->stats.qprc[i],
5533			    EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
5534			    "qprc");
5535			evcnt_attach_dynamic(&adapter->stats.qptc[i],
5536			    EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
5537			    "qptc");
5538			evcnt_attach_dynamic(&adapter->stats.qbrc[i],
5539			    EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
5540			    "qbrc");
5541			evcnt_attach_dynamic(&adapter->stats.qbtc[i],
5542			    EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
5543			    "qbtc");
5544			evcnt_attach_dynamic(&adapter->stats.qprdc[i],
5545			    EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
5546			    "qprdc");
5547		}
5548
5549		evcnt_attach_dynamic(&rxr->rx_packets, EVCNT_TYPE_MISC,
5550		    NULL, adapter->queues[i].evnamebuf, "Queue Packets Received");
5551		evcnt_attach_dynamic(&rxr->rx_bytes, EVCNT_TYPE_MISC,
5552		    NULL, adapter->queues[i].evnamebuf, "Queue Bytes Received");
5553		evcnt_attach_dynamic(&rxr->no_jmbuf, EVCNT_TYPE_MISC,
5554		    NULL, adapter->queues[i].evnamebuf, "Rx no jumbo mbuf");
5555		evcnt_attach_dynamic(&rxr->rx_discarded, EVCNT_TYPE_MISC,
5556		    NULL, adapter->queues[i].evnamebuf, "Rx discarded");
5557		evcnt_attach_dynamic(&rxr->rx_split_packets, EVCNT_TYPE_MISC,
5558		    NULL, adapter->queues[i].evnamebuf, "Rx split packets");
5559		evcnt_attach_dynamic(&rxr->rx_irq, EVCNT_TYPE_MISC,
5560		    NULL, adapter->queues[i].evnamebuf, "Rx interrupts");
5561#ifdef LRO
5562		SYSCTL_ADD_INT(ctx, queue_list, OID_AUTO, "lro_queued",
5563				CTLFLAG_RD, &lro->lro_queued, 0,
5564				"LRO Queued");
5565		SYSCTL_ADD_INT(ctx, queue_list, OID_AUTO, "lro_flushed",
5566				CTLFLAG_RD, &lro->lro_flushed, 0,
5567				"LRO Flushed");
5568#endif /* LRO */
5569	}
5570
5571	/* MAC stats get the own sub node */
5572
5573
5574	snprintf(stats->namebuf,
5575	    sizeof(stats->namebuf), "%s MAC Statistics", device_xname(dev));
5576
5577	evcnt_attach_dynamic(&stats->ipcs, EVCNT_TYPE_MISC, NULL,
5578	    stats->namebuf, "rx csum offload - IP");
5579	evcnt_attach_dynamic(&stats->l4cs, EVCNT_TYPE_MISC, NULL,
5580	    stats->namebuf, "rx csum offload - L4");
5581	evcnt_attach_dynamic(&stats->ipcs_bad, EVCNT_TYPE_MISC, NULL,
5582	    stats->namebuf, "rx csum offload - IP bad");
5583	evcnt_attach_dynamic(&stats->l4cs_bad, EVCNT_TYPE_MISC, NULL,
5584	    stats->namebuf, "rx csum offload - L4 bad");
5585	evcnt_attach_dynamic(&stats->intzero, EVCNT_TYPE_MISC, NULL,
5586	    stats->namebuf, "Interrupt conditions zero");
5587	evcnt_attach_dynamic(&stats->legint, EVCNT_TYPE_MISC, NULL,
5588	    stats->namebuf, "Legacy interrupts");
5589	evcnt_attach_dynamic(&stats->crcerrs, EVCNT_TYPE_MISC, NULL,
5590	    stats->namebuf, "CRC Errors");
5591	evcnt_attach_dynamic(&stats->illerrc, EVCNT_TYPE_MISC, NULL,
5592	    stats->namebuf, "Illegal Byte Errors");
5593	evcnt_attach_dynamic(&stats->errbc, EVCNT_TYPE_MISC, NULL,
5594	    stats->namebuf, "Byte Errors");
5595	evcnt_attach_dynamic(&stats->mspdc, EVCNT_TYPE_MISC, NULL,
5596	    stats->namebuf, "MAC Short Packets Discarded");
5597	evcnt_attach_dynamic(&stats->mlfc, EVCNT_TYPE_MISC, NULL,
5598	    stats->namebuf, "MAC Local Faults");
5599	evcnt_attach_dynamic(&stats->mrfc, EVCNT_TYPE_MISC, NULL,
5600	    stats->namebuf, "MAC Remote Faults");
5601	evcnt_attach_dynamic(&stats->rlec, EVCNT_TYPE_MISC, NULL,
5602	    stats->namebuf, "Receive Length Errors");
5603	evcnt_attach_dynamic(&stats->lxontxc, EVCNT_TYPE_MISC, NULL,
5604	    stats->namebuf, "Link XON Transmitted");
5605	evcnt_attach_dynamic(&stats->lxonrxc, EVCNT_TYPE_MISC, NULL,
5606	    stats->namebuf, "Link XON Received");
5607	evcnt_attach_dynamic(&stats->lxofftxc, EVCNT_TYPE_MISC, NULL,
5608	    stats->namebuf, "Link XOFF Transmitted");
5609	evcnt_attach_dynamic(&stats->lxoffrxc, EVCNT_TYPE_MISC, NULL,
5610	    stats->namebuf, "Link XOFF Received");
5611
5612	/* Packet Reception Stats */
5613	evcnt_attach_dynamic(&stats->tor, EVCNT_TYPE_MISC, NULL,
5614	    stats->namebuf, "Total Octets Received");
5615	evcnt_attach_dynamic(&stats->gorc, EVCNT_TYPE_MISC, NULL,
5616	    stats->namebuf, "Good Octets Received");
5617	evcnt_attach_dynamic(&stats->tpr, EVCNT_TYPE_MISC, NULL,
5618	    stats->namebuf, "Total Packets Received");
5619	evcnt_attach_dynamic(&stats->gprc, EVCNT_TYPE_MISC, NULL,
5620	    stats->namebuf, "Good Packets Received");
5621	evcnt_attach_dynamic(&stats->mprc, EVCNT_TYPE_MISC, NULL,
5622	    stats->namebuf, "Multicast Packets Received");
5623	evcnt_attach_dynamic(&stats->bprc, EVCNT_TYPE_MISC, NULL,
5624	    stats->namebuf, "Broadcast Packets Received");
5625	evcnt_attach_dynamic(&stats->prc64, EVCNT_TYPE_MISC, NULL,
5626	    stats->namebuf, "64 byte frames received ");
5627	evcnt_attach_dynamic(&stats->prc127, EVCNT_TYPE_MISC, NULL,
5628	    stats->namebuf, "65-127 byte frames received");
5629	evcnt_attach_dynamic(&stats->prc255, EVCNT_TYPE_MISC, NULL,
5630	    stats->namebuf, "128-255 byte frames received");
5631	evcnt_attach_dynamic(&stats->prc511, EVCNT_TYPE_MISC, NULL,
5632	    stats->namebuf, "256-511 byte frames received");
5633	evcnt_attach_dynamic(&stats->prc1023, EVCNT_TYPE_MISC, NULL,
5634	    stats->namebuf, "512-1023 byte frames received");
5635	evcnt_attach_dynamic(&stats->prc1522, EVCNT_TYPE_MISC, NULL,
5636	    stats->namebuf, "1023-1522 byte frames received");
5637	evcnt_attach_dynamic(&stats->ruc, EVCNT_TYPE_MISC, NULL,
5638	    stats->namebuf, "Receive Undersized");
5639	evcnt_attach_dynamic(&stats->rfc, EVCNT_TYPE_MISC, NULL,
5640	    stats->namebuf, "Fragmented Packets Received ");
5641	evcnt_attach_dynamic(&stats->roc, EVCNT_TYPE_MISC, NULL,
5642	    stats->namebuf, "Oversized Packets Received");
5643	evcnt_attach_dynamic(&stats->rjc, EVCNT_TYPE_MISC, NULL,
5644	    stats->namebuf, "Received Jabber");
5645	evcnt_attach_dynamic(&stats->mngprc, EVCNT_TYPE_MISC, NULL,
5646	    stats->namebuf, "Management Packets Received");
5647	evcnt_attach_dynamic(&stats->mngptc, EVCNT_TYPE_MISC, NULL,
5648	    stats->namebuf, "Management Packets Dropped");
5649	evcnt_attach_dynamic(&stats->xec, EVCNT_TYPE_MISC, NULL,
5650	    stats->namebuf, "Checksum Errors");
5651
5652	/* Packet Transmission Stats */
5653	evcnt_attach_dynamic(&stats->gotc, EVCNT_TYPE_MISC, NULL,
5654	    stats->namebuf, "Good Octets Transmitted");
5655	evcnt_attach_dynamic(&stats->tpt, EVCNT_TYPE_MISC, NULL,
5656	    stats->namebuf, "Total Packets Transmitted");
5657	evcnt_attach_dynamic(&stats->gptc, EVCNT_TYPE_MISC, NULL,
5658	    stats->namebuf, "Good Packets Transmitted");
5659	evcnt_attach_dynamic(&stats->bptc, EVCNT_TYPE_MISC, NULL,
5660	    stats->namebuf, "Broadcast Packets Transmitted");
5661	evcnt_attach_dynamic(&stats->mptc, EVCNT_TYPE_MISC, NULL,
5662	    stats->namebuf, "Multicast Packets Transmitted");
5663	evcnt_attach_dynamic(&stats->mngptc, EVCNT_TYPE_MISC, NULL,
5664	    stats->namebuf, "Management Packets Transmitted");
5665	evcnt_attach_dynamic(&stats->ptc64, EVCNT_TYPE_MISC, NULL,
5666	    stats->namebuf, "64 byte frames transmitted ");
5667	evcnt_attach_dynamic(&stats->ptc127, EVCNT_TYPE_MISC, NULL,
5668	    stats->namebuf, "65-127 byte frames transmitted");
5669	evcnt_attach_dynamic(&stats->ptc255, EVCNT_TYPE_MISC, NULL,
5670	    stats->namebuf, "128-255 byte frames transmitted");
5671	evcnt_attach_dynamic(&stats->ptc511, EVCNT_TYPE_MISC, NULL,
5672	    stats->namebuf, "256-511 byte frames transmitted");
5673	evcnt_attach_dynamic(&stats->ptc1023, EVCNT_TYPE_MISC, NULL,
5674	    stats->namebuf, "512-1023 byte frames transmitted");
5675	evcnt_attach_dynamic(&stats->ptc1522, EVCNT_TYPE_MISC, NULL,
5676	    stats->namebuf, "1024-1522 byte frames transmitted");
5677
5678	/* FC Stats */
5679	evcnt_attach_dynamic(&stats->fccrc, EVCNT_TYPE_MISC, NULL,
5680	    stats->namebuf, "FC CRC Errors");
5681	evcnt_attach_dynamic(&stats->fclast, EVCNT_TYPE_MISC, NULL,
5682	    stats->namebuf, "FC Last Error");
5683	if (hw->mac.type != ixgbe_mac_82598EB) {
5684		evcnt_attach_dynamic(&stats->fcoerpdc, EVCNT_TYPE_MISC, NULL,
5685		    stats->namebuf, "FCoE Packets Dropped");
5686		evcnt_attach_dynamic(&stats->fcoeprc, EVCNT_TYPE_MISC, NULL,
5687		    stats->namebuf, "FCoE Packets Received");
5688		evcnt_attach_dynamic(&stats->fcoeptc, EVCNT_TYPE_MISC, NULL,
5689		    stats->namebuf, "FCoE Packets Transmitted");
5690		evcnt_attach_dynamic(&stats->fcoedwrc, EVCNT_TYPE_MISC, NULL,
5691		    stats->namebuf, "FCoE DWords Received");
5692		evcnt_attach_dynamic(&stats->fcoedwtc, EVCNT_TYPE_MISC, NULL,
5693		    stats->namebuf, "FCoE DWords Transmitted");
5694	}
5695}
5696
5697/*
5698** Set flow control using sysctl:
5699** Flow control values:
5700** 	0 - off
5701**	1 - rx pause
5702**	2 - tx pause
5703**	3 - full
5704*/
5705static int
5706ixgbe_set_flowcntl(SYSCTLFN_ARGS)
5707{
5708	struct sysctlnode node;
5709	int error;
5710	int last = ixgbe_flow_control;
5711	struct adapter *adapter;
5712
5713	node = *rnode;
5714	adapter = (struct adapter *)node.sysctl_data;
5715	node.sysctl_data = &ixgbe_flow_control;
5716	error = sysctl_lookup(SYSCTLFN_CALL(&node));
5717	if (error != 0 || newp == NULL)
5718		return error;
5719
5720	/* Don't bother if it's not changed */
5721	if (ixgbe_flow_control == last)
5722		return (0);
5723
5724	switch (ixgbe_flow_control) {
5725		case ixgbe_fc_rx_pause:
5726		case ixgbe_fc_tx_pause:
5727		case ixgbe_fc_full:
5728			adapter->hw.fc.requested_mode = ixgbe_flow_control;
5729			break;
5730		case ixgbe_fc_none:
5731		default:
5732			adapter->hw.fc.requested_mode = ixgbe_fc_none;
5733	}
5734
5735	ixgbe_fc_enable(&adapter->hw, 0);
5736	return 0;
5737}
5738
5739static void
5740ixgbe_add_rx_process_limit(struct adapter *adapter, const char *name,
5741        const char *description, int *limit, int value)
5742{
5743	const struct sysctlnode *rnode, *cnode;
5744	struct sysctllog **log = &adapter->sysctllog;
5745
5746        *limit = value;
5747
5748	if ((rnode = ixgbe_sysctl_instance(adapter)) == NULL)
5749		aprint_error_dev(adapter->dev,
5750		    "could not create sysctl root\n");
5751	else if (sysctl_createv(log, 0, &rnode, &cnode,
5752	    CTLFLAG_READWRITE,
5753	    CTLTYPE_INT,
5754	    name, SYSCTL_DESCR(description),
5755	    NULL, 0, limit, 0,
5756	    CTL_CREATE, CTL_EOL) != 0) {
5757		aprint_error_dev(adapter->dev, "%s: could not create sysctl",
5758		    __func__);
5759	}
5760}
5761
5762/*
5763** Control link advertise speed:
5764** 	0 - normal
5765**	1 - advertise only 1G
5766*/
5767static int
5768ixgbe_set_advertise(SYSCTLFN_ARGS)
5769{
5770	struct sysctlnode	node;
5771	int			t, error;
5772	struct adapter		*adapter;
5773	struct ixgbe_hw		*hw;
5774	ixgbe_link_speed	speed, last;
5775
5776	node = *rnode;
5777	adapter = (struct adapter *)node.sysctl_data;
5778	t = adapter->advertise;
5779	node.sysctl_data = &t;
5780	error = sysctl_lookup(SYSCTLFN_CALL(&node));
5781	if (error != 0 || newp == NULL)
5782		return error;
5783
5784	if (t == -1)
5785		return 0;
5786
5787	adapter->advertise = t;
5788
5789	hw = &adapter->hw;
5790	last = hw->phy.autoneg_advertised;
5791
5792	if (!((hw->phy.media_type == ixgbe_media_type_copper) ||
5793            (hw->phy.multispeed_fiber)))
5794		return 0;
5795
5796	if (adapter->advertise == 1)
5797                speed = IXGBE_LINK_SPEED_1GB_FULL;
5798	else
5799                speed = IXGBE_LINK_SPEED_1GB_FULL |
5800			IXGBE_LINK_SPEED_10GB_FULL;
5801
5802	if (speed == last) /* no change */
5803		return 0;
5804
5805	hw->mac.autotry_restart = TRUE;
5806	hw->mac.ops.setup_link(hw, speed, TRUE, TRUE);
5807
5808	return 0;
5809}
5810