ixv.c revision 248078
1/******************************************************************************
2
3  Copyright (c) 2001-2012, 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/*$FreeBSD: stable/9/sys/dev/ixgbe/ixv.c 248078 2013-03-09 00:39:54Z marius $*/
34
35#ifdef HAVE_KERNEL_OPTION_HEADERS
36#include "opt_inet.h"
37#include "opt_inet6.h"
38#endif
39
40#include "ixv.h"
41
42/*********************************************************************
43 *  Driver version
44 *********************************************************************/
45char ixv_driver_version[] = "1.1.4";
46
47/*********************************************************************
48 *  PCI Device ID Table
49 *
50 *  Used by probe to select devices to load on
51 *  Last field stores an index into ixv_strings
52 *  Last entry must be all 0s
53 *
54 *  { Vendor ID, Device ID, SubVendor ID, SubDevice ID, String Index }
55 *********************************************************************/
56
57static ixv_vendor_info_t ixv_vendor_info_array[] =
58{
59	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_VF, 0, 0, 0},
60	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X540_VF, 0, 0, 0},
61	/* required last entry */
62	{0, 0, 0, 0, 0}
63};
64
65/*********************************************************************
66 *  Table of branding strings
67 *********************************************************************/
68
69static char    *ixv_strings[] = {
70	"Intel(R) PRO/10GbE Virtual Function Network Driver"
71};
72
73/*********************************************************************
74 *  Function prototypes
75 *********************************************************************/
76static int      ixv_probe(device_t);
77static int      ixv_attach(device_t);
78static int      ixv_detach(device_t);
79static int      ixv_shutdown(device_t);
80#if __FreeBSD_version < 800000
81static void     ixv_start(struct ifnet *);
82static void     ixv_start_locked(struct tx_ring *, struct ifnet *);
83#else
84static int	ixv_mq_start(struct ifnet *, struct mbuf *);
85static int	ixv_mq_start_locked(struct ifnet *,
86		    struct tx_ring *, struct mbuf *);
87static void	ixv_qflush(struct ifnet *);
88#endif
89static int      ixv_ioctl(struct ifnet *, u_long, caddr_t);
90static void	ixv_init(void *);
91static void	ixv_init_locked(struct adapter *);
92static void     ixv_stop(void *);
93static void     ixv_media_status(struct ifnet *, struct ifmediareq *);
94static int      ixv_media_change(struct ifnet *);
95static void     ixv_identify_hardware(struct adapter *);
96static int      ixv_allocate_pci_resources(struct adapter *);
97static int      ixv_allocate_msix(struct adapter *);
98static int	ixv_allocate_queues(struct adapter *);
99static int	ixv_setup_msix(struct adapter *);
100static void	ixv_free_pci_resources(struct adapter *);
101static void     ixv_local_timer(void *);
102static void     ixv_setup_interface(device_t, struct adapter *);
103static void     ixv_config_link(struct adapter *);
104
105static int      ixv_allocate_transmit_buffers(struct tx_ring *);
106static int	ixv_setup_transmit_structures(struct adapter *);
107static void	ixv_setup_transmit_ring(struct tx_ring *);
108static void     ixv_initialize_transmit_units(struct adapter *);
109static void     ixv_free_transmit_structures(struct adapter *);
110static void     ixv_free_transmit_buffers(struct tx_ring *);
111
112static int      ixv_allocate_receive_buffers(struct rx_ring *);
113static int      ixv_setup_receive_structures(struct adapter *);
114static int	ixv_setup_receive_ring(struct rx_ring *);
115static void     ixv_initialize_receive_units(struct adapter *);
116static void     ixv_free_receive_structures(struct adapter *);
117static void     ixv_free_receive_buffers(struct rx_ring *);
118
119static void     ixv_enable_intr(struct adapter *);
120static void     ixv_disable_intr(struct adapter *);
121static bool	ixv_txeof(struct tx_ring *);
122static bool	ixv_rxeof(struct ix_queue *, int);
123static void	ixv_rx_checksum(u32, struct mbuf *, u32);
124static void     ixv_set_multi(struct adapter *);
125static void     ixv_update_link_status(struct adapter *);
126static void	ixv_refresh_mbufs(struct rx_ring *, int);
127static int      ixv_xmit(struct tx_ring *, struct mbuf **);
128static int	ixv_sysctl_stats(SYSCTL_HANDLER_ARGS);
129static int	ixv_sysctl_debug(SYSCTL_HANDLER_ARGS);
130static int	ixv_set_flowcntl(SYSCTL_HANDLER_ARGS);
131static int	ixv_dma_malloc(struct adapter *, bus_size_t,
132		    struct ixv_dma_alloc *, int);
133static void     ixv_dma_free(struct adapter *, struct ixv_dma_alloc *);
134static void	ixv_add_rx_process_limit(struct adapter *, const char *,
135		    const char *, int *, int);
136static bool	ixv_tx_ctx_setup(struct tx_ring *, struct mbuf *);
137static bool	ixv_tso_setup(struct tx_ring *, struct mbuf *, u32 *);
138static void	ixv_set_ivar(struct adapter *, u8, u8, s8);
139static void	ixv_configure_ivars(struct adapter *);
140static u8 *	ixv_mc_array_itr(struct ixgbe_hw *, u8 **, u32 *);
141
142static void	ixv_setup_vlan_support(struct adapter *);
143static void	ixv_register_vlan(void *, struct ifnet *, u16);
144static void	ixv_unregister_vlan(void *, struct ifnet *, u16);
145
146static void	ixv_save_stats(struct adapter *);
147static void	ixv_init_stats(struct adapter *);
148static void	ixv_update_stats(struct adapter *);
149
150static __inline void ixv_rx_discard(struct rx_ring *, int);
151static __inline void ixv_rx_input(struct rx_ring *, struct ifnet *,
152		    struct mbuf *, u32);
153
154/* The MSI/X Interrupt handlers */
155static void	ixv_msix_que(void *);
156static void	ixv_msix_mbx(void *);
157
158/* Deferred interrupt tasklets */
159static void	ixv_handle_que(void *, int);
160static void	ixv_handle_mbx(void *, int);
161
162/*********************************************************************
163 *  FreeBSD Device Interface Entry Points
164 *********************************************************************/
165
166static device_method_t ixv_methods[] = {
167	/* Device interface */
168	DEVMETHOD(device_probe, ixv_probe),
169	DEVMETHOD(device_attach, ixv_attach),
170	DEVMETHOD(device_detach, ixv_detach),
171	DEVMETHOD(device_shutdown, ixv_shutdown),
172	{0, 0}
173};
174
175static driver_t ixv_driver = {
176	"ix", ixv_methods, sizeof(struct adapter),
177};
178
179extern devclass_t ixgbe_devclass;
180DRIVER_MODULE(ixv, pci, ixv_driver, ixgbe_devclass, 0, 0);
181MODULE_DEPEND(ixv, pci, 1, 1, 1);
182MODULE_DEPEND(ixv, ether, 1, 1, 1);
183
184/*
185** TUNEABLE PARAMETERS:
186*/
187
188/*
189** AIM: Adaptive Interrupt Moderation
190** which means that the interrupt rate
191** is varied over time based on the
192** traffic for that interrupt vector
193*/
194static int ixv_enable_aim = FALSE;
195TUNABLE_INT("hw.ixv.enable_aim", &ixv_enable_aim);
196
197/* How many packets rxeof tries to clean at a time */
198static int ixv_rx_process_limit = 128;
199TUNABLE_INT("hw.ixv.rx_process_limit", &ixv_rx_process_limit);
200
201/* Flow control setting, default to full */
202static int ixv_flow_control = ixgbe_fc_full;
203TUNABLE_INT("hw.ixv.flow_control", &ixv_flow_control);
204
205/*
206 * Header split: this causes the hardware to DMA
207 * the header into a seperate mbuf from the payload,
208 * it can be a performance win in some workloads, but
209 * in others it actually hurts, its off by default.
210 */
211static int ixv_header_split = FALSE;
212TUNABLE_INT("hw.ixv.hdr_split", &ixv_header_split);
213
214/*
215** Number of TX descriptors per ring,
216** setting higher than RX as this seems
217** the better performing choice.
218*/
219static int ixv_txd = DEFAULT_TXD;
220TUNABLE_INT("hw.ixv.txd", &ixv_txd);
221
222/* Number of RX descriptors per ring */
223static int ixv_rxd = DEFAULT_RXD;
224TUNABLE_INT("hw.ixv.rxd", &ixv_rxd);
225
226/*
227** Shadow VFTA table, this is needed because
228** the real filter table gets cleared during
229** a soft reset and we need to repopulate it.
230*/
231static u32 ixv_shadow_vfta[VFTA_SIZE];
232
233/*********************************************************************
234 *  Device identification routine
235 *
236 *  ixv_probe determines if the driver should be loaded on
237 *  adapter based on PCI vendor/device id of the adapter.
238 *
239 *  return BUS_PROBE_DEFAULT on success, positive on failure
240 *********************************************************************/
241
242static int
243ixv_probe(device_t dev)
244{
245	ixv_vendor_info_t *ent;
246
247	u16	pci_vendor_id = 0;
248	u16	pci_device_id = 0;
249	u16	pci_subvendor_id = 0;
250	u16	pci_subdevice_id = 0;
251	char	adapter_name[256];
252
253
254	pci_vendor_id = pci_get_vendor(dev);
255	if (pci_vendor_id != IXGBE_INTEL_VENDOR_ID)
256		return (ENXIO);
257
258	pci_device_id = pci_get_device(dev);
259	pci_subvendor_id = pci_get_subvendor(dev);
260	pci_subdevice_id = pci_get_subdevice(dev);
261
262	ent = ixv_vendor_info_array;
263	while (ent->vendor_id != 0) {
264		if ((pci_vendor_id == ent->vendor_id) &&
265		    (pci_device_id == ent->device_id) &&
266
267		    ((pci_subvendor_id == ent->subvendor_id) ||
268		     (ent->subvendor_id == 0)) &&
269
270		    ((pci_subdevice_id == ent->subdevice_id) ||
271		     (ent->subdevice_id == 0))) {
272			sprintf(adapter_name, "%s, Version - %s",
273				ixv_strings[ent->index],
274				ixv_driver_version);
275			device_set_desc_copy(dev, adapter_name);
276			return (BUS_PROBE_DEFAULT);
277		}
278		ent++;
279	}
280	return (ENXIO);
281}
282
283/*********************************************************************
284 *  Device initialization routine
285 *
286 *  The attach entry point is called when the driver is being loaded.
287 *  This routine identifies the type of hardware, allocates all resources
288 *  and initializes the hardware.
289 *
290 *  return 0 on success, positive on failure
291 *********************************************************************/
292
293static int
294ixv_attach(device_t dev)
295{
296	struct adapter *adapter;
297	struct ixgbe_hw *hw;
298	int             error = 0;
299
300	INIT_DEBUGOUT("ixv_attach: begin");
301
302	/* Allocate, clear, and link in our adapter structure */
303	adapter = device_get_softc(dev);
304	adapter->dev = adapter->osdep.dev = dev;
305	hw = &adapter->hw;
306
307	/* Core Lock Init*/
308	IXV_CORE_LOCK_INIT(adapter, device_get_nameunit(dev));
309
310	/* SYSCTL APIs */
311	SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
312			SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
313			OID_AUTO, "stats", CTLTYPE_INT | CTLFLAG_RW,
314			adapter, 0, ixv_sysctl_stats, "I", "Statistics");
315
316	SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
317			SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
318			OID_AUTO, "debug", CTLTYPE_INT | CTLFLAG_RW,
319			adapter, 0, ixv_sysctl_debug, "I", "Debug Info");
320
321	SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
322			SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
323			OID_AUTO, "flow_control", CTLTYPE_INT | CTLFLAG_RW,
324			adapter, 0, ixv_set_flowcntl, "I", "Flow Control");
325
326	SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
327			SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
328			OID_AUTO, "enable_aim", CTLTYPE_INT|CTLFLAG_RW,
329			&ixv_enable_aim, 1, "Interrupt Moderation");
330
331	/* Set up the timer callout */
332	callout_init_mtx(&adapter->timer, &adapter->core_mtx, 0);
333
334	/* Determine hardware revision */
335	ixv_identify_hardware(adapter);
336
337	/* Do base PCI setup - map BAR0 */
338	if (ixv_allocate_pci_resources(adapter)) {
339		device_printf(dev, "Allocation of PCI resources failed\n");
340		error = ENXIO;
341		goto err_out;
342	}
343
344	/* Do descriptor calc and sanity checks */
345	if (((ixv_txd * sizeof(union ixgbe_adv_tx_desc)) % DBA_ALIGN) != 0 ||
346	    ixv_txd < MIN_TXD || ixv_txd > MAX_TXD) {
347		device_printf(dev, "TXD config issue, using default!\n");
348		adapter->num_tx_desc = DEFAULT_TXD;
349	} else
350		adapter->num_tx_desc = ixv_txd;
351
352	if (((ixv_rxd * sizeof(union ixgbe_adv_rx_desc)) % DBA_ALIGN) != 0 ||
353	    ixv_rxd < MIN_TXD || ixv_rxd > MAX_TXD) {
354		device_printf(dev, "RXD config issue, using default!\n");
355		adapter->num_rx_desc = DEFAULT_RXD;
356	} else
357		adapter->num_rx_desc = ixv_rxd;
358
359	/* Allocate our TX/RX Queues */
360	if (ixv_allocate_queues(adapter)) {
361		error = ENOMEM;
362		goto err_out;
363	}
364
365	/*
366	** Initialize the shared code: its
367	** at this point the mac type is set.
368	*/
369	error = ixgbe_init_shared_code(hw);
370	if (error) {
371		device_printf(dev,"Shared Code Initialization Failure\n");
372		error = EIO;
373		goto err_late;
374	}
375
376	/* Setup the mailbox */
377	ixgbe_init_mbx_params_vf(hw);
378
379	ixgbe_reset_hw(hw);
380
381	/* Get Hardware Flow Control setting */
382	hw->fc.requested_mode = ixgbe_fc_full;
383	hw->fc.pause_time = IXV_FC_PAUSE;
384	hw->fc.low_water[0] = IXV_FC_LO;
385	hw->fc.high_water[0] = IXV_FC_HI;
386	hw->fc.send_xon = TRUE;
387
388	error = ixgbe_init_hw(hw);
389	if (error) {
390		device_printf(dev,"Hardware Initialization Failure\n");
391		error = EIO;
392		goto err_late;
393	}
394
395	error = ixv_allocate_msix(adapter);
396	if (error)
397		goto err_late;
398
399	/* Setup OS specific network interface */
400	ixv_setup_interface(dev, adapter);
401
402	/* Sysctl for limiting the amount of work done in the taskqueue */
403	ixv_add_rx_process_limit(adapter, "rx_processing_limit",
404	    "max number of rx packets to process", &adapter->rx_process_limit,
405	    ixv_rx_process_limit);
406
407	/* Do the stats setup */
408	ixv_save_stats(adapter);
409	ixv_init_stats(adapter);
410
411	/* Register for VLAN events */
412	adapter->vlan_attach = EVENTHANDLER_REGISTER(vlan_config,
413	    ixv_register_vlan, adapter, EVENTHANDLER_PRI_FIRST);
414	adapter->vlan_detach = EVENTHANDLER_REGISTER(vlan_unconfig,
415	    ixv_unregister_vlan, adapter, EVENTHANDLER_PRI_FIRST);
416
417	INIT_DEBUGOUT("ixv_attach: end");
418	return (0);
419
420err_late:
421	ixv_free_transmit_structures(adapter);
422	ixv_free_receive_structures(adapter);
423err_out:
424	ixv_free_pci_resources(adapter);
425	return (error);
426
427}
428
429/*********************************************************************
430 *  Device removal routine
431 *
432 *  The detach entry point is called when the driver is being removed.
433 *  This routine stops the adapter and deallocates all the resources
434 *  that were allocated for driver operation.
435 *
436 *  return 0 on success, positive on failure
437 *********************************************************************/
438
439static int
440ixv_detach(device_t dev)
441{
442	struct adapter *adapter = device_get_softc(dev);
443	struct ix_queue *que = adapter->queues;
444
445	INIT_DEBUGOUT("ixv_detach: begin");
446
447	/* Make sure VLANS are not using driver */
448	if (adapter->ifp->if_vlantrunk != NULL) {
449		device_printf(dev,"Vlan in use, detach first\n");
450		return (EBUSY);
451	}
452
453	IXV_CORE_LOCK(adapter);
454	ixv_stop(adapter);
455	IXV_CORE_UNLOCK(adapter);
456
457	for (int i = 0; i < adapter->num_queues; i++, que++) {
458		if (que->tq) {
459			taskqueue_drain(que->tq, &que->que_task);
460			taskqueue_free(que->tq);
461		}
462	}
463
464	/* Drain the Link queue */
465	if (adapter->tq) {
466		taskqueue_drain(adapter->tq, &adapter->mbx_task);
467		taskqueue_free(adapter->tq);
468	}
469
470	/* Unregister VLAN events */
471	if (adapter->vlan_attach != NULL)
472		EVENTHANDLER_DEREGISTER(vlan_config, adapter->vlan_attach);
473	if (adapter->vlan_detach != NULL)
474		EVENTHANDLER_DEREGISTER(vlan_unconfig, adapter->vlan_detach);
475
476	ether_ifdetach(adapter->ifp);
477	callout_drain(&adapter->timer);
478	ixv_free_pci_resources(adapter);
479	bus_generic_detach(dev);
480	if_free(adapter->ifp);
481
482	ixv_free_transmit_structures(adapter);
483	ixv_free_receive_structures(adapter);
484
485	IXV_CORE_LOCK_DESTROY(adapter);
486	return (0);
487}
488
489/*********************************************************************
490 *
491 *  Shutdown entry point
492 *
493 **********************************************************************/
494static int
495ixv_shutdown(device_t dev)
496{
497	struct adapter *adapter = device_get_softc(dev);
498	IXV_CORE_LOCK(adapter);
499	ixv_stop(adapter);
500	IXV_CORE_UNLOCK(adapter);
501	return (0);
502}
503
504#if __FreeBSD_version < 800000
505/*********************************************************************
506 *  Transmit entry point
507 *
508 *  ixv_start is called by the stack to initiate a transmit.
509 *  The driver will remain in this routine as long as there are
510 *  packets to transmit and transmit resources are available.
511 *  In case resources are not available stack is notified and
512 *  the packet is requeued.
513 **********************************************************************/
514static void
515ixv_start_locked(struct tx_ring *txr, struct ifnet * ifp)
516{
517	struct mbuf    *m_head;
518	struct adapter *adapter = txr->adapter;
519
520	IXV_TX_LOCK_ASSERT(txr);
521
522	if ((ifp->if_drv_flags & (IFF_DRV_RUNNING|IFF_DRV_OACTIVE)) !=
523	    IFF_DRV_RUNNING)
524		return;
525	if (!adapter->link_active)
526		return;
527
528	while (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) {
529
530		IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head);
531		if (m_head == NULL)
532			break;
533
534		if (ixv_xmit(txr, &m_head)) {
535			if (m_head == NULL)
536				break;
537			ifp->if_drv_flags |= IFF_DRV_OACTIVE;
538			IFQ_DRV_PREPEND(&ifp->if_snd, m_head);
539			break;
540		}
541		/* Send a copy of the frame to the BPF listener */
542		ETHER_BPF_MTAP(ifp, m_head);
543
544		/* Set watchdog on */
545		txr->watchdog_check = TRUE;
546		txr->watchdog_time = ticks;
547
548	}
549	return;
550}
551
552/*
553 * Legacy TX start - called by the stack, this
554 * always uses the first tx ring, and should
555 * not be used with multiqueue tx enabled.
556 */
557static void
558ixv_start(struct ifnet *ifp)
559{
560	struct adapter *adapter = ifp->if_softc;
561	struct tx_ring	*txr = adapter->tx_rings;
562
563	if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
564		IXV_TX_LOCK(txr);
565		ixv_start_locked(txr, ifp);
566		IXV_TX_UNLOCK(txr);
567	}
568	return;
569}
570
571#else
572
573/*
574** Multiqueue Transmit driver
575**
576*/
577static int
578ixv_mq_start(struct ifnet *ifp, struct mbuf *m)
579{
580	struct adapter	*adapter = ifp->if_softc;
581	struct ix_queue	*que;
582	struct tx_ring	*txr;
583	int 		i = 0, err = 0;
584
585	/* Which queue to use */
586	if ((m->m_flags & M_FLOWID) != 0)
587		i = m->m_pkthdr.flowid % adapter->num_queues;
588
589	txr = &adapter->tx_rings[i];
590	que = &adapter->queues[i];
591
592	if (IXV_TX_TRYLOCK(txr)) {
593		err = ixv_mq_start_locked(ifp, txr, m);
594		IXV_TX_UNLOCK(txr);
595	} else {
596		err = drbr_enqueue(ifp, txr->br, m);
597		taskqueue_enqueue(que->tq, &que->que_task);
598	}
599
600	return (err);
601}
602
603static int
604ixv_mq_start_locked(struct ifnet *ifp, struct tx_ring *txr, struct mbuf *m)
605{
606	struct adapter  *adapter = txr->adapter;
607        struct mbuf     *next;
608        int             enqueued, err = 0;
609
610	if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
611	    IFF_DRV_RUNNING || adapter->link_active == 0) {
612		if (m != NULL)
613			err = drbr_enqueue(ifp, txr->br, m);
614		return (err);
615	}
616
617	/* Do a clean if descriptors are low */
618	if (txr->tx_avail <= IXV_TX_CLEANUP_THRESHOLD)
619		ixv_txeof(txr);
620
621	enqueued = 0;
622	if (m == NULL) {
623		next = drbr_dequeue(ifp, txr->br);
624	} else if (drbr_needs_enqueue(ifp, txr->br)) {
625		if ((err = drbr_enqueue(ifp, txr->br, m)) != 0)
626			return (err);
627		next = drbr_dequeue(ifp, txr->br);
628	} else
629		next = m;
630
631	/* Process the queue */
632	while (next != NULL) {
633		if ((err = ixv_xmit(txr, &next)) != 0) {
634			if (next != NULL)
635				err = drbr_enqueue(ifp, txr->br, next);
636			break;
637		}
638		enqueued++;
639		ifp->if_obytes += next->m_pkthdr.len;
640		if (next->m_flags & M_MCAST)
641			ifp->if_omcasts++;
642		/* Send a copy of the frame to the BPF listener */
643		ETHER_BPF_MTAP(ifp, next);
644		if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
645			break;
646		if (txr->tx_avail <= IXV_TX_OP_THRESHOLD) {
647			ifp->if_drv_flags |= IFF_DRV_OACTIVE;
648			break;
649		}
650		next = drbr_dequeue(ifp, txr->br);
651	}
652
653	if (enqueued > 0) {
654		/* Set watchdog on */
655		txr->watchdog_check = TRUE;
656		txr->watchdog_time = ticks;
657	}
658
659	return (err);
660}
661
662/*
663** Flush all ring buffers
664*/
665static void
666ixv_qflush(struct ifnet *ifp)
667{
668	struct adapter  *adapter = ifp->if_softc;
669	struct tx_ring  *txr = adapter->tx_rings;
670	struct mbuf     *m;
671
672	for (int i = 0; i < adapter->num_queues; i++, txr++) {
673		IXV_TX_LOCK(txr);
674		while ((m = buf_ring_dequeue_sc(txr->br)) != NULL)
675			m_freem(m);
676		IXV_TX_UNLOCK(txr);
677	}
678	if_qflush(ifp);
679}
680
681#endif
682
683/*********************************************************************
684 *  Ioctl entry point
685 *
686 *  ixv_ioctl is called when the user wants to configure the
687 *  interface.
688 *
689 *  return 0 on success, positive on failure
690 **********************************************************************/
691
692static int
693ixv_ioctl(struct ifnet * ifp, u_long command, caddr_t data)
694{
695	struct adapter	*adapter = ifp->if_softc;
696	struct ifreq	*ifr = (struct ifreq *) data;
697#if defined(INET) || defined(INET6)
698	struct ifaddr	*ifa = (struct ifaddr *) data;
699	bool		avoid_reset = FALSE;
700#endif
701	int             error = 0;
702
703	switch (command) {
704
705	case SIOCSIFADDR:
706#ifdef INET
707		if (ifa->ifa_addr->sa_family == AF_INET)
708			avoid_reset = TRUE;
709#endif
710#ifdef INET6
711		if (ifa->ifa_addr->sa_family == AF_INET6)
712			avoid_reset = TRUE;
713#endif
714#if defined(INET) || defined(INET6)
715		/*
716		** Calling init results in link renegotiation,
717		** so we avoid doing it when possible.
718		*/
719		if (avoid_reset) {
720			ifp->if_flags |= IFF_UP;
721			if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
722				ixv_init(adapter);
723			if (!(ifp->if_flags & IFF_NOARP))
724				arp_ifinit(ifp, ifa);
725		} else
726			error = ether_ioctl(ifp, command, data);
727		break;
728#endif
729	case SIOCSIFMTU:
730		IOCTL_DEBUGOUT("ioctl: SIOCSIFMTU (Set Interface MTU)");
731		if (ifr->ifr_mtu > IXV_MAX_FRAME_SIZE - ETHER_HDR_LEN) {
732			error = EINVAL;
733		} else {
734			IXV_CORE_LOCK(adapter);
735			ifp->if_mtu = ifr->ifr_mtu;
736			adapter->max_frame_size =
737				ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
738			ixv_init_locked(adapter);
739			IXV_CORE_UNLOCK(adapter);
740		}
741		break;
742	case SIOCSIFFLAGS:
743		IOCTL_DEBUGOUT("ioctl: SIOCSIFFLAGS (Set Interface Flags)");
744		IXV_CORE_LOCK(adapter);
745		if (ifp->if_flags & IFF_UP) {
746			if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
747				ixv_init_locked(adapter);
748		} else
749			if (ifp->if_drv_flags & IFF_DRV_RUNNING)
750				ixv_stop(adapter);
751		adapter->if_flags = ifp->if_flags;
752		IXV_CORE_UNLOCK(adapter);
753		break;
754	case SIOCADDMULTI:
755	case SIOCDELMULTI:
756		IOCTL_DEBUGOUT("ioctl: SIOC(ADD|DEL)MULTI");
757		if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
758			IXV_CORE_LOCK(adapter);
759			ixv_disable_intr(adapter);
760			ixv_set_multi(adapter);
761			ixv_enable_intr(adapter);
762			IXV_CORE_UNLOCK(adapter);
763		}
764		break;
765	case SIOCSIFMEDIA:
766	case SIOCGIFMEDIA:
767		IOCTL_DEBUGOUT("ioctl: SIOCxIFMEDIA (Get/Set Interface Media)");
768		error = ifmedia_ioctl(ifp, ifr, &adapter->media, command);
769		break;
770	case SIOCSIFCAP:
771	{
772		int mask = ifr->ifr_reqcap ^ ifp->if_capenable;
773		IOCTL_DEBUGOUT("ioctl: SIOCSIFCAP (Set Capabilities)");
774		if (mask & IFCAP_HWCSUM)
775			ifp->if_capenable ^= IFCAP_HWCSUM;
776		if (mask & IFCAP_TSO4)
777			ifp->if_capenable ^= IFCAP_TSO4;
778		if (mask & IFCAP_LRO)
779			ifp->if_capenable ^= IFCAP_LRO;
780		if (mask & IFCAP_VLAN_HWTAGGING)
781			ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING;
782		if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
783			IXV_CORE_LOCK(adapter);
784			ixv_init_locked(adapter);
785			IXV_CORE_UNLOCK(adapter);
786		}
787		VLAN_CAPABILITIES(ifp);
788		break;
789	}
790
791	default:
792		IOCTL_DEBUGOUT1("ioctl: UNKNOWN (0x%X)\n", (int)command);
793		error = ether_ioctl(ifp, command, data);
794		break;
795	}
796
797	return (error);
798}
799
800/*********************************************************************
801 *  Init entry point
802 *
803 *  This routine is used in two ways. It is used by the stack as
804 *  init entry point in network interface structure. It is also used
805 *  by the driver as a hw/sw initialization routine to get to a
806 *  consistent state.
807 *
808 *  return 0 on success, positive on failure
809 **********************************************************************/
810#define IXGBE_MHADD_MFS_SHIFT 16
811
812static void
813ixv_init_locked(struct adapter *adapter)
814{
815	struct ifnet	*ifp = adapter->ifp;
816	device_t 	dev = adapter->dev;
817	struct ixgbe_hw *hw = &adapter->hw;
818	u32		mhadd, gpie;
819
820	INIT_DEBUGOUT("ixv_init: begin");
821	mtx_assert(&adapter->core_mtx, MA_OWNED);
822	hw->adapter_stopped = FALSE;
823	ixgbe_stop_adapter(hw);
824        callout_stop(&adapter->timer);
825
826        /* reprogram the RAR[0] in case user changed it. */
827        ixgbe_set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV);
828
829	/* Get the latest mac address, User can use a LAA */
830	bcopy(IF_LLADDR(adapter->ifp), hw->mac.addr,
831	     IXGBE_ETH_LENGTH_OF_ADDRESS);
832        ixgbe_set_rar(hw, 0, hw->mac.addr, 0, 1);
833	hw->addr_ctrl.rar_used_count = 1;
834
835	/* Prepare transmit descriptors and buffers */
836	if (ixv_setup_transmit_structures(adapter)) {
837		device_printf(dev,"Could not setup transmit structures\n");
838		ixv_stop(adapter);
839		return;
840	}
841
842	ixgbe_reset_hw(hw);
843	ixv_initialize_transmit_units(adapter);
844
845	/* Setup Multicast table */
846	ixv_set_multi(adapter);
847
848	/*
849	** Determine the correct mbuf pool
850	** for doing jumbo/headersplit
851	*/
852	if (ifp->if_mtu > ETHERMTU)
853		adapter->rx_mbuf_sz = MJUMPAGESIZE;
854	else
855		adapter->rx_mbuf_sz = MCLBYTES;
856
857	/* Prepare receive descriptors and buffers */
858	if (ixv_setup_receive_structures(adapter)) {
859		device_printf(dev,"Could not setup receive structures\n");
860		ixv_stop(adapter);
861		return;
862	}
863
864	/* Configure RX settings */
865	ixv_initialize_receive_units(adapter);
866
867	/* Enable Enhanced MSIX mode */
868	gpie = IXGBE_READ_REG(&adapter->hw, IXGBE_GPIE);
869	gpie |= IXGBE_GPIE_MSIX_MODE | IXGBE_GPIE_EIAME;
870	gpie |= IXGBE_GPIE_PBA_SUPPORT | IXGBE_GPIE_OCD;
871        IXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie);
872
873	/* Set the various hardware offload abilities */
874	ifp->if_hwassist = 0;
875	if (ifp->if_capenable & IFCAP_TSO4)
876		ifp->if_hwassist |= CSUM_TSO;
877	if (ifp->if_capenable & IFCAP_TXCSUM) {
878		ifp->if_hwassist |= (CSUM_TCP | CSUM_UDP);
879#if __FreeBSD_version >= 800000
880		ifp->if_hwassist |= CSUM_SCTP;
881#endif
882	}
883
884	/* Set MTU size */
885	if (ifp->if_mtu > ETHERMTU) {
886		mhadd = IXGBE_READ_REG(hw, IXGBE_MHADD);
887		mhadd &= ~IXGBE_MHADD_MFS_MASK;
888		mhadd |= adapter->max_frame_size << IXGBE_MHADD_MFS_SHIFT;
889		IXGBE_WRITE_REG(hw, IXGBE_MHADD, mhadd);
890	}
891
892	/* Set up VLAN offload and filter */
893	ixv_setup_vlan_support(adapter);
894
895	callout_reset(&adapter->timer, hz, ixv_local_timer, adapter);
896
897	/* Set up MSI/X routing */
898	ixv_configure_ivars(adapter);
899
900	/* Set up auto-mask */
901	IXGBE_WRITE_REG(hw, IXGBE_VTEIAM, IXGBE_EICS_RTX_QUEUE);
902
903        /* Set moderation on the Link interrupt */
904        IXGBE_WRITE_REG(hw, IXGBE_VTEITR(adapter->mbxvec), IXV_LINK_ITR);
905
906	/* Stats init */
907	ixv_init_stats(adapter);
908
909	/* Config/Enable Link */
910	ixv_config_link(adapter);
911
912	/* And now turn on interrupts */
913	ixv_enable_intr(adapter);
914
915	/* Now inform the stack we're ready */
916	ifp->if_drv_flags |= IFF_DRV_RUNNING;
917	ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
918
919	return;
920}
921
922static void
923ixv_init(void *arg)
924{
925	struct adapter *adapter = arg;
926
927	IXV_CORE_LOCK(adapter);
928	ixv_init_locked(adapter);
929	IXV_CORE_UNLOCK(adapter);
930	return;
931}
932
933
934/*
935**
936** MSIX Interrupt Handlers and Tasklets
937**
938*/
939
940static inline void
941ixv_enable_queue(struct adapter *adapter, u32 vector)
942{
943	struct ixgbe_hw *hw = &adapter->hw;
944	u32	queue = 1 << vector;
945	u32	mask;
946
947	mask = (IXGBE_EIMS_RTX_QUEUE & queue);
948	IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, mask);
949}
950
951static inline void
952ixv_disable_queue(struct adapter *adapter, u32 vector)
953{
954	struct ixgbe_hw *hw = &adapter->hw;
955	u64	queue = (u64)(1 << vector);
956	u32	mask;
957
958	mask = (IXGBE_EIMS_RTX_QUEUE & queue);
959	IXGBE_WRITE_REG(hw, IXGBE_VTEIMC, mask);
960}
961
962static inline void
963ixv_rearm_queues(struct adapter *adapter, u64 queues)
964{
965	u32 mask = (IXGBE_EIMS_RTX_QUEUE & queues);
966	IXGBE_WRITE_REG(&adapter->hw, IXGBE_VTEICS, mask);
967}
968
969
970static void
971ixv_handle_que(void *context, int pending)
972{
973	struct ix_queue *que = context;
974	struct adapter  *adapter = que->adapter;
975	struct tx_ring  *txr = que->txr;
976	struct ifnet    *ifp = adapter->ifp;
977	bool		more;
978
979	if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
980		more = ixv_rxeof(que, adapter->rx_process_limit);
981		IXV_TX_LOCK(txr);
982		ixv_txeof(txr);
983#if __FreeBSD_version >= 800000
984		if (!drbr_empty(ifp, txr->br))
985			ixv_mq_start_locked(ifp, txr, NULL);
986#else
987		if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
988			ixv_start_locked(txr, ifp);
989#endif
990		IXV_TX_UNLOCK(txr);
991		if (more) {
992			taskqueue_enqueue(que->tq, &que->que_task);
993			return;
994		}
995	}
996
997	/* Reenable this interrupt */
998	ixv_enable_queue(adapter, que->msix);
999	return;
1000}
1001
1002/*********************************************************************
1003 *
1004 *  MSI Queue Interrupt Service routine
1005 *
1006 **********************************************************************/
1007void
1008ixv_msix_que(void *arg)
1009{
1010	struct ix_queue	*que = arg;
1011	struct adapter  *adapter = que->adapter;
1012	struct tx_ring	*txr = que->txr;
1013	struct rx_ring	*rxr = que->rxr;
1014	bool		more_tx, more_rx;
1015	u32		newitr = 0;
1016
1017	ixv_disable_queue(adapter, que->msix);
1018	++que->irqs;
1019
1020	more_rx = ixv_rxeof(que, adapter->rx_process_limit);
1021
1022	IXV_TX_LOCK(txr);
1023	more_tx = ixv_txeof(txr);
1024	/*
1025	** Make certain that if the stack
1026	** has anything queued the task gets
1027	** scheduled to handle it.
1028	*/
1029#if __FreeBSD_version < 800000
1030	if (!IFQ_DRV_IS_EMPTY(&adapter->ifp->if_snd))
1031#else
1032	if (!drbr_empty(adapter->ifp, txr->br))
1033#endif
1034                more_tx = 1;
1035	IXV_TX_UNLOCK(txr);
1036
1037	more_rx = ixv_rxeof(que, adapter->rx_process_limit);
1038
1039	/* Do AIM now? */
1040
1041	if (ixv_enable_aim == FALSE)
1042		goto no_calc;
1043	/*
1044	** Do Adaptive Interrupt Moderation:
1045        **  - Write out last calculated setting
1046	**  - Calculate based on average size over
1047	**    the last interval.
1048	*/
1049        if (que->eitr_setting)
1050                IXGBE_WRITE_REG(&adapter->hw,
1051                    IXGBE_VTEITR(que->msix),
1052		    que->eitr_setting);
1053
1054        que->eitr_setting = 0;
1055
1056        /* Idle, do nothing */
1057        if ((txr->bytes == 0) && (rxr->bytes == 0))
1058                goto no_calc;
1059
1060	if ((txr->bytes) && (txr->packets))
1061               	newitr = txr->bytes/txr->packets;
1062	if ((rxr->bytes) && (rxr->packets))
1063		newitr = max(newitr,
1064		    (rxr->bytes / rxr->packets));
1065	newitr += 24; /* account for hardware frame, crc */
1066
1067	/* set an upper boundary */
1068	newitr = min(newitr, 3000);
1069
1070	/* Be nice to the mid range */
1071	if ((newitr > 300) && (newitr < 1200))
1072		newitr = (newitr / 3);
1073	else
1074		newitr = (newitr / 2);
1075
1076	newitr |= newitr << 16;
1077
1078        /* save for next interrupt */
1079        que->eitr_setting = newitr;
1080
1081        /* Reset state */
1082        txr->bytes = 0;
1083        txr->packets = 0;
1084        rxr->bytes = 0;
1085        rxr->packets = 0;
1086
1087no_calc:
1088	if (more_tx || more_rx)
1089		taskqueue_enqueue(que->tq, &que->que_task);
1090	else /* Reenable this interrupt */
1091		ixv_enable_queue(adapter, que->msix);
1092	return;
1093}
1094
1095static void
1096ixv_msix_mbx(void *arg)
1097{
1098	struct adapter	*adapter = arg;
1099	struct ixgbe_hw *hw = &adapter->hw;
1100	u32		reg;
1101
1102	++adapter->mbx_irq;
1103
1104	/* First get the cause */
1105	reg = IXGBE_READ_REG(hw, IXGBE_VTEICS);
1106	/* Clear interrupt with write */
1107	IXGBE_WRITE_REG(hw, IXGBE_VTEICR, reg);
1108
1109	/* Link status change */
1110	if (reg & IXGBE_EICR_LSC)
1111		taskqueue_enqueue(adapter->tq, &adapter->mbx_task);
1112
1113	IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, IXGBE_EIMS_OTHER);
1114	return;
1115}
1116
1117/*********************************************************************
1118 *
1119 *  Media Ioctl callback
1120 *
1121 *  This routine is called whenever the user queries the status of
1122 *  the interface using ifconfig.
1123 *
1124 **********************************************************************/
1125static void
1126ixv_media_status(struct ifnet * ifp, struct ifmediareq * ifmr)
1127{
1128	struct adapter *adapter = ifp->if_softc;
1129
1130	INIT_DEBUGOUT("ixv_media_status: begin");
1131	IXV_CORE_LOCK(adapter);
1132	ixv_update_link_status(adapter);
1133
1134	ifmr->ifm_status = IFM_AVALID;
1135	ifmr->ifm_active = IFM_ETHER;
1136
1137	if (!adapter->link_active) {
1138		IXV_CORE_UNLOCK(adapter);
1139		return;
1140	}
1141
1142	ifmr->ifm_status |= IFM_ACTIVE;
1143
1144	switch (adapter->link_speed) {
1145		case IXGBE_LINK_SPEED_1GB_FULL:
1146			ifmr->ifm_active |= IFM_1000_T | IFM_FDX;
1147			break;
1148		case IXGBE_LINK_SPEED_10GB_FULL:
1149			ifmr->ifm_active |= IFM_FDX;
1150			break;
1151	}
1152
1153	IXV_CORE_UNLOCK(adapter);
1154
1155	return;
1156}
1157
1158/*********************************************************************
1159 *
1160 *  Media Ioctl callback
1161 *
1162 *  This routine is called when the user changes speed/duplex using
1163 *  media/mediopt option with ifconfig.
1164 *
1165 **********************************************************************/
1166static int
1167ixv_media_change(struct ifnet * ifp)
1168{
1169	struct adapter *adapter = ifp->if_softc;
1170	struct ifmedia *ifm = &adapter->media;
1171
1172	INIT_DEBUGOUT("ixv_media_change: begin");
1173
1174	if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
1175		return (EINVAL);
1176
1177        switch (IFM_SUBTYPE(ifm->ifm_media)) {
1178        case IFM_AUTO:
1179                break;
1180        default:
1181                device_printf(adapter->dev, "Only auto media type\n");
1182		return (EINVAL);
1183        }
1184
1185	return (0);
1186}
1187
1188/*********************************************************************
1189 *
1190 *  This routine maps the mbufs to tx descriptors, allowing the
1191 *  TX engine to transmit the packets.
1192 *  	- return 0 on success, positive on failure
1193 *
1194 **********************************************************************/
1195
1196static int
1197ixv_xmit(struct tx_ring *txr, struct mbuf **m_headp)
1198{
1199	struct adapter  *adapter = txr->adapter;
1200	u32		olinfo_status = 0, cmd_type_len;
1201	u32		paylen = 0;
1202	int             i, j, error, nsegs;
1203	int		first, last = 0;
1204	struct mbuf	*m_head;
1205	bus_dma_segment_t segs[32];
1206	bus_dmamap_t	map;
1207	struct ixv_tx_buf *txbuf, *txbuf_mapped;
1208	union ixgbe_adv_tx_desc *txd = NULL;
1209
1210	m_head = *m_headp;
1211
1212	/* Basic descriptor defines */
1213        cmd_type_len = (IXGBE_ADVTXD_DTYP_DATA |
1214	    IXGBE_ADVTXD_DCMD_IFCS | IXGBE_ADVTXD_DCMD_DEXT);
1215
1216	if (m_head->m_flags & M_VLANTAG)
1217        	cmd_type_len |= IXGBE_ADVTXD_DCMD_VLE;
1218
1219        /*
1220         * Important to capture the first descriptor
1221         * used because it will contain the index of
1222         * the one we tell the hardware to report back
1223         */
1224        first = txr->next_avail_desc;
1225	txbuf = &txr->tx_buffers[first];
1226	txbuf_mapped = txbuf;
1227	map = txbuf->map;
1228
1229	/*
1230	 * Map the packet for DMA.
1231	 */
1232	error = bus_dmamap_load_mbuf_sg(txr->txtag, map,
1233	    *m_headp, segs, &nsegs, BUS_DMA_NOWAIT);
1234
1235	if (error == EFBIG) {
1236		struct mbuf *m;
1237
1238		m = m_defrag(*m_headp, M_NOWAIT);
1239		if (m == NULL) {
1240			adapter->mbuf_defrag_failed++;
1241			m_freem(*m_headp);
1242			*m_headp = NULL;
1243			return (ENOBUFS);
1244		}
1245		*m_headp = m;
1246
1247		/* Try it again */
1248		error = bus_dmamap_load_mbuf_sg(txr->txtag, map,
1249		    *m_headp, segs, &nsegs, BUS_DMA_NOWAIT);
1250
1251		if (error == ENOMEM) {
1252			adapter->no_tx_dma_setup++;
1253			return (error);
1254		} else if (error != 0) {
1255			adapter->no_tx_dma_setup++;
1256			m_freem(*m_headp);
1257			*m_headp = NULL;
1258			return (error);
1259		}
1260	} else if (error == ENOMEM) {
1261		adapter->no_tx_dma_setup++;
1262		return (error);
1263	} else if (error != 0) {
1264		adapter->no_tx_dma_setup++;
1265		m_freem(*m_headp);
1266		*m_headp = NULL;
1267		return (error);
1268	}
1269
1270	/* Make certain there are enough descriptors */
1271	if (nsegs > txr->tx_avail - 2) {
1272		txr->no_desc_avail++;
1273		error = ENOBUFS;
1274		goto xmit_fail;
1275	}
1276	m_head = *m_headp;
1277
1278	/*
1279	** Set up the appropriate offload context
1280	** this becomes the first descriptor of
1281	** a packet.
1282	*/
1283	if (m_head->m_pkthdr.csum_flags & CSUM_TSO) {
1284		if (ixv_tso_setup(txr, m_head, &paylen)) {
1285			cmd_type_len |= IXGBE_ADVTXD_DCMD_TSE;
1286			olinfo_status |= IXGBE_TXD_POPTS_IXSM << 8;
1287			olinfo_status |= IXGBE_TXD_POPTS_TXSM << 8;
1288			olinfo_status |= paylen << IXGBE_ADVTXD_PAYLEN_SHIFT;
1289			++adapter->tso_tx;
1290		} else
1291			return (ENXIO);
1292	} else if (ixv_tx_ctx_setup(txr, m_head))
1293		olinfo_status |= IXGBE_TXD_POPTS_TXSM << 8;
1294
1295        /* Record payload length */
1296	if (paylen == 0)
1297        	olinfo_status |= m_head->m_pkthdr.len <<
1298		    IXGBE_ADVTXD_PAYLEN_SHIFT;
1299
1300	i = txr->next_avail_desc;
1301	for (j = 0; j < nsegs; j++) {
1302		bus_size_t seglen;
1303		bus_addr_t segaddr;
1304
1305		txbuf = &txr->tx_buffers[i];
1306		txd = &txr->tx_base[i];
1307		seglen = segs[j].ds_len;
1308		segaddr = htole64(segs[j].ds_addr);
1309
1310		txd->read.buffer_addr = segaddr;
1311		txd->read.cmd_type_len = htole32(txr->txd_cmd |
1312		    cmd_type_len |seglen);
1313		txd->read.olinfo_status = htole32(olinfo_status);
1314		last = i; /* descriptor that will get completion IRQ */
1315
1316		if (++i == adapter->num_tx_desc)
1317			i = 0;
1318
1319		txbuf->m_head = NULL;
1320		txbuf->eop_index = -1;
1321	}
1322
1323	txd->read.cmd_type_len |=
1324	    htole32(IXGBE_TXD_CMD_EOP | IXGBE_TXD_CMD_RS);
1325	txr->tx_avail -= nsegs;
1326	txr->next_avail_desc = i;
1327
1328	txbuf->m_head = m_head;
1329	txr->tx_buffers[first].map = txbuf->map;
1330	txbuf->map = map;
1331	bus_dmamap_sync(txr->txtag, map, BUS_DMASYNC_PREWRITE);
1332
1333        /* Set the index of the descriptor that will be marked done */
1334        txbuf = &txr->tx_buffers[first];
1335	txbuf->eop_index = last;
1336
1337        bus_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map,
1338            BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1339	/*
1340	 * Advance the Transmit Descriptor Tail (Tdt), this tells the
1341	 * hardware that this frame is available to transmit.
1342	 */
1343	++txr->total_packets;
1344	IXGBE_WRITE_REG(&adapter->hw, IXGBE_VFTDT(txr->me), i);
1345
1346	return (0);
1347
1348xmit_fail:
1349	bus_dmamap_unload(txr->txtag, txbuf->map);
1350	return (error);
1351
1352}
1353
1354
1355/*********************************************************************
1356 *  Multicast Update
1357 *
1358 *  This routine is called whenever multicast address list is updated.
1359 *
1360 **********************************************************************/
1361#define IXGBE_RAR_ENTRIES 16
1362
1363static void
1364ixv_set_multi(struct adapter *adapter)
1365{
1366	u8	mta[MAX_NUM_MULTICAST_ADDRESSES * IXGBE_ETH_LENGTH_OF_ADDRESS];
1367	u8	*update_ptr;
1368	struct	ifmultiaddr *ifma;
1369	int	mcnt = 0;
1370	struct ifnet   *ifp = adapter->ifp;
1371
1372	IOCTL_DEBUGOUT("ixv_set_multi: begin");
1373
1374#if __FreeBSD_version < 800000
1375	IF_ADDR_LOCK(ifp);
1376#else
1377	if_maddr_rlock(ifp);
1378#endif
1379	TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
1380		if (ifma->ifma_addr->sa_family != AF_LINK)
1381			continue;
1382		bcopy(LLADDR((struct sockaddr_dl *) ifma->ifma_addr),
1383		    &mta[mcnt * IXGBE_ETH_LENGTH_OF_ADDRESS],
1384		    IXGBE_ETH_LENGTH_OF_ADDRESS);
1385		mcnt++;
1386	}
1387#if __FreeBSD_version < 800000
1388	IF_ADDR_UNLOCK(ifp);
1389#else
1390	if_maddr_runlock(ifp);
1391#endif
1392
1393	update_ptr = mta;
1394
1395	ixgbe_update_mc_addr_list(&adapter->hw,
1396	    update_ptr, mcnt, ixv_mc_array_itr, TRUE);
1397
1398	return;
1399}
1400
1401/*
1402 * This is an iterator function now needed by the multicast
1403 * shared code. It simply feeds the shared code routine the
1404 * addresses in the array of ixv_set_multi() one by one.
1405 */
1406static u8 *
1407ixv_mc_array_itr(struct ixgbe_hw *hw, u8 **update_ptr, u32 *vmdq)
1408{
1409	u8 *addr = *update_ptr;
1410	u8 *newptr;
1411	*vmdq = 0;
1412
1413	newptr = addr + IXGBE_ETH_LENGTH_OF_ADDRESS;
1414	*update_ptr = newptr;
1415	return addr;
1416}
1417
1418/*********************************************************************
1419 *  Timer routine
1420 *
1421 *  This routine checks for link status,updates statistics,
1422 *  and runs the watchdog check.
1423 *
1424 **********************************************************************/
1425
1426static void
1427ixv_local_timer(void *arg)
1428{
1429	struct adapter	*adapter = arg;
1430	device_t	dev = adapter->dev;
1431	struct tx_ring	*txr = adapter->tx_rings;
1432	int		i;
1433
1434	mtx_assert(&adapter->core_mtx, MA_OWNED);
1435
1436	ixv_update_link_status(adapter);
1437
1438	/* Stats Update */
1439	ixv_update_stats(adapter);
1440
1441	/*
1442	 * If the interface has been paused
1443	 * then don't do the watchdog check
1444	 */
1445	if (IXGBE_READ_REG(&adapter->hw, IXGBE_TFCS) & IXGBE_TFCS_TXOFF)
1446		goto out;
1447	/*
1448	** Check for time since any descriptor was cleaned
1449	*/
1450        for (i = 0; i < adapter->num_queues; i++, txr++) {
1451		IXV_TX_LOCK(txr);
1452		if (txr->watchdog_check == FALSE) {
1453			IXV_TX_UNLOCK(txr);
1454			continue;
1455		}
1456		if ((ticks - txr->watchdog_time) > IXV_WATCHDOG)
1457			goto hung;
1458		IXV_TX_UNLOCK(txr);
1459	}
1460out:
1461       	ixv_rearm_queues(adapter, adapter->que_mask);
1462	callout_reset(&adapter->timer, hz, ixv_local_timer, adapter);
1463	return;
1464
1465hung:
1466	device_printf(adapter->dev, "Watchdog timeout -- resetting\n");
1467	device_printf(dev,"Queue(%d) tdh = %d, hw tdt = %d\n", txr->me,
1468	    IXGBE_READ_REG(&adapter->hw, IXGBE_VFTDH(i)),
1469	    IXGBE_READ_REG(&adapter->hw, IXGBE_VFTDT(i)));
1470	device_printf(dev,"TX(%d) desc avail = %d,"
1471	    "Next TX to Clean = %d\n",
1472	    txr->me, txr->tx_avail, txr->next_to_clean);
1473	adapter->ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
1474	adapter->watchdog_events++;
1475	IXV_TX_UNLOCK(txr);
1476	ixv_init_locked(adapter);
1477}
1478
1479/*
1480** Note: this routine updates the OS on the link state
1481**	the real check of the hardware only happens with
1482**	a link interrupt.
1483*/
1484static void
1485ixv_update_link_status(struct adapter *adapter)
1486{
1487	struct ifnet	*ifp = adapter->ifp;
1488	struct tx_ring *txr = adapter->tx_rings;
1489	device_t dev = adapter->dev;
1490
1491
1492	if (adapter->link_up){
1493		if (adapter->link_active == FALSE) {
1494			if (bootverbose)
1495				device_printf(dev,"Link is up %d Gbps %s \n",
1496				    ((adapter->link_speed == 128)? 10:1),
1497				    "Full Duplex");
1498			adapter->link_active = TRUE;
1499			if_link_state_change(ifp, LINK_STATE_UP);
1500		}
1501	} else { /* Link down */
1502		if (adapter->link_active == TRUE) {
1503			if (bootverbose)
1504				device_printf(dev,"Link is Down\n");
1505			if_link_state_change(ifp, LINK_STATE_DOWN);
1506			adapter->link_active = FALSE;
1507			for (int i = 0; i < adapter->num_queues;
1508			    i++, txr++)
1509				txr->watchdog_check = FALSE;
1510		}
1511	}
1512
1513	return;
1514}
1515
1516
1517/*********************************************************************
1518 *
1519 *  This routine disables all traffic on the adapter by issuing a
1520 *  global reset on the MAC and deallocates TX/RX buffers.
1521 *
1522 **********************************************************************/
1523
1524static void
1525ixv_stop(void *arg)
1526{
1527	struct ifnet   *ifp;
1528	struct adapter *adapter = arg;
1529	struct ixgbe_hw *hw = &adapter->hw;
1530	ifp = adapter->ifp;
1531
1532	mtx_assert(&adapter->core_mtx, MA_OWNED);
1533
1534	INIT_DEBUGOUT("ixv_stop: begin\n");
1535	ixv_disable_intr(adapter);
1536
1537	/* Tell the stack that the interface is no longer active */
1538	ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
1539
1540	ixgbe_reset_hw(hw);
1541	adapter->hw.adapter_stopped = FALSE;
1542	ixgbe_stop_adapter(hw);
1543	callout_stop(&adapter->timer);
1544
1545	/* reprogram the RAR[0] in case user changed it. */
1546	ixgbe_set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV);
1547
1548	return;
1549}
1550
1551
1552/*********************************************************************
1553 *
1554 *  Determine hardware revision.
1555 *
1556 **********************************************************************/
1557static void
1558ixv_identify_hardware(struct adapter *adapter)
1559{
1560	device_t        dev = adapter->dev;
1561	u16		pci_cmd_word;
1562
1563	/*
1564	** Make sure BUSMASTER is set, on a VM under
1565	** KVM it may not be and will break things.
1566	*/
1567	pci_cmd_word = pci_read_config(dev, PCIR_COMMAND, 2);
1568	if (!((pci_cmd_word & PCIM_CMD_BUSMASTEREN) &&
1569	    (pci_cmd_word & PCIM_CMD_MEMEN))) {
1570		INIT_DEBUGOUT("Memory Access and/or Bus Master "
1571		    "bits were not set!\n");
1572		pci_cmd_word |= (PCIM_CMD_BUSMASTEREN | PCIM_CMD_MEMEN);
1573		pci_write_config(dev, PCIR_COMMAND, pci_cmd_word, 2);
1574	}
1575
1576	/* Save off the information about this board */
1577	adapter->hw.vendor_id = pci_get_vendor(dev);
1578	adapter->hw.device_id = pci_get_device(dev);
1579	adapter->hw.revision_id = pci_read_config(dev, PCIR_REVID, 1);
1580	adapter->hw.subsystem_vendor_id =
1581	    pci_read_config(dev, PCIR_SUBVEND_0, 2);
1582	adapter->hw.subsystem_device_id =
1583	    pci_read_config(dev, PCIR_SUBDEV_0, 2);
1584
1585	return;
1586}
1587
1588/*********************************************************************
1589 *
1590 *  Setup MSIX Interrupt resources and handlers
1591 *
1592 **********************************************************************/
1593static int
1594ixv_allocate_msix(struct adapter *adapter)
1595{
1596	device_t        dev = adapter->dev;
1597	struct 		ix_queue *que = adapter->queues;
1598	int 		error, rid, vector = 0;
1599
1600	for (int i = 0; i < adapter->num_queues; i++, vector++, que++) {
1601		rid = vector + 1;
1602		que->res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
1603		    RF_SHAREABLE | RF_ACTIVE);
1604		if (que->res == NULL) {
1605			device_printf(dev,"Unable to allocate"
1606		    	    " bus resource: que interrupt [%d]\n", vector);
1607			return (ENXIO);
1608		}
1609		/* Set the handler function */
1610		error = bus_setup_intr(dev, que->res,
1611		    INTR_TYPE_NET | INTR_MPSAFE, NULL,
1612		    ixv_msix_que, que, &que->tag);
1613		if (error) {
1614			que->res = NULL;
1615			device_printf(dev, "Failed to register QUE handler");
1616			return (error);
1617		}
1618#if __FreeBSD_version >= 800504
1619		bus_describe_intr(dev, que->res, que->tag, "que %d", i);
1620#endif
1621		que->msix = vector;
1622        	adapter->que_mask |= (u64)(1 << que->msix);
1623		/*
1624		** Bind the msix vector, and thus the
1625		** ring to the corresponding cpu.
1626		*/
1627		if (adapter->num_queues > 1)
1628			bus_bind_intr(dev, que->res, i);
1629
1630		TASK_INIT(&que->que_task, 0, ixv_handle_que, que);
1631		que->tq = taskqueue_create_fast("ixv_que", M_NOWAIT,
1632		    taskqueue_thread_enqueue, &que->tq);
1633		taskqueue_start_threads(&que->tq, 1, PI_NET, "%s que",
1634		    device_get_nameunit(adapter->dev));
1635	}
1636
1637	/* and Mailbox */
1638	rid = vector + 1;
1639	adapter->res = bus_alloc_resource_any(dev,
1640    	    SYS_RES_IRQ, &rid, RF_SHAREABLE | RF_ACTIVE);
1641	if (!adapter->res) {
1642		device_printf(dev,"Unable to allocate"
1643    	    " bus resource: MBX interrupt [%d]\n", rid);
1644		return (ENXIO);
1645	}
1646	/* Set the mbx handler function */
1647	error = bus_setup_intr(dev, adapter->res,
1648	    INTR_TYPE_NET | INTR_MPSAFE, NULL,
1649	    ixv_msix_mbx, adapter, &adapter->tag);
1650	if (error) {
1651		adapter->res = NULL;
1652		device_printf(dev, "Failed to register LINK handler");
1653		return (error);
1654	}
1655#if __FreeBSD_version >= 800504
1656	bus_describe_intr(dev, adapter->res, adapter->tag, "mbx");
1657#endif
1658	adapter->mbxvec = vector;
1659	/* Tasklets for Mailbox */
1660	TASK_INIT(&adapter->mbx_task, 0, ixv_handle_mbx, adapter);
1661	adapter->tq = taskqueue_create_fast("ixv_mbx", M_NOWAIT,
1662	    taskqueue_thread_enqueue, &adapter->tq);
1663	taskqueue_start_threads(&adapter->tq, 1, PI_NET, "%s mbxq",
1664	    device_get_nameunit(adapter->dev));
1665	/*
1666	** Due to a broken design QEMU will fail to properly
1667	** enable the guest for MSIX unless the vectors in
1668	** the table are all set up, so we must rewrite the
1669	** ENABLE in the MSIX control register again at this
1670	** point to cause it to successfully initialize us.
1671	*/
1672	if (adapter->hw.mac.type == ixgbe_mac_82599_vf) {
1673		int msix_ctrl;
1674		pci_find_cap(dev, PCIY_MSIX, &rid);
1675		rid += PCIR_MSIX_CTRL;
1676		msix_ctrl = pci_read_config(dev, rid, 2);
1677		msix_ctrl |= PCIM_MSIXCTRL_MSIX_ENABLE;
1678		pci_write_config(dev, rid, msix_ctrl, 2);
1679	}
1680
1681	return (0);
1682}
1683
1684/*
1685 * Setup MSIX resources, note that the VF
1686 * device MUST use MSIX, there is no fallback.
1687 */
1688static int
1689ixv_setup_msix(struct adapter *adapter)
1690{
1691	device_t dev = adapter->dev;
1692	int rid, vectors, want = 2;
1693
1694
1695	/* First try MSI/X */
1696	rid = PCIR_BAR(3);
1697	adapter->msix_mem = bus_alloc_resource_any(dev,
1698	    SYS_RES_MEMORY, &rid, RF_ACTIVE);
1699       	if (!adapter->msix_mem) {
1700		device_printf(adapter->dev,
1701		    "Unable to map MSIX table \n");
1702		goto out;
1703	}
1704
1705	vectors = pci_msix_count(dev);
1706	if (vectors < 2) {
1707		bus_release_resource(dev, SYS_RES_MEMORY,
1708		    rid, adapter->msix_mem);
1709		adapter->msix_mem = NULL;
1710		goto out;
1711	}
1712
1713	/*
1714	** Want two vectors: one for a queue,
1715	** plus an additional for mailbox.
1716	*/
1717	if (pci_alloc_msix(dev, &want) == 0) {
1718               	device_printf(adapter->dev,
1719		    "Using MSIX interrupts with %d vectors\n", want);
1720		return (want);
1721	}
1722out:
1723	device_printf(adapter->dev,"MSIX config error\n");
1724	return (ENXIO);
1725}
1726
1727
1728static int
1729ixv_allocate_pci_resources(struct adapter *adapter)
1730{
1731	int             rid;
1732	device_t        dev = adapter->dev;
1733
1734	rid = PCIR_BAR(0);
1735	adapter->pci_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
1736	    &rid, RF_ACTIVE);
1737
1738	if (!(adapter->pci_mem)) {
1739		device_printf(dev,"Unable to allocate bus resource: memory\n");
1740		return (ENXIO);
1741	}
1742
1743	adapter->osdep.mem_bus_space_tag =
1744		rman_get_bustag(adapter->pci_mem);
1745	adapter->osdep.mem_bus_space_handle =
1746		rman_get_bushandle(adapter->pci_mem);
1747	adapter->hw.hw_addr = (u8 *) &adapter->osdep.mem_bus_space_handle;
1748
1749	adapter->num_queues = 1;
1750	adapter->hw.back = &adapter->osdep;
1751
1752	/*
1753	** Now setup MSI/X, should
1754	** return us the number of
1755	** configured vectors.
1756	*/
1757	adapter->msix = ixv_setup_msix(adapter);
1758	if (adapter->msix == ENXIO)
1759		return (ENXIO);
1760	else
1761		return (0);
1762}
1763
1764static void
1765ixv_free_pci_resources(struct adapter * adapter)
1766{
1767	struct 		ix_queue *que = adapter->queues;
1768	device_t	dev = adapter->dev;
1769	int		rid, memrid;
1770
1771	memrid = PCIR_BAR(MSIX_BAR);
1772
1773	/*
1774	** There is a slight possibility of a failure mode
1775	** in attach that will result in entering this function
1776	** before interrupt resources have been initialized, and
1777	** in that case we do not want to execute the loops below
1778	** We can detect this reliably by the state of the adapter
1779	** res pointer.
1780	*/
1781	if (adapter->res == NULL)
1782		goto mem;
1783
1784	/*
1785	**  Release all msix queue resources:
1786	*/
1787	for (int i = 0; i < adapter->num_queues; i++, que++) {
1788		rid = que->msix + 1;
1789		if (que->tag != NULL) {
1790			bus_teardown_intr(dev, que->res, que->tag);
1791			que->tag = NULL;
1792		}
1793		if (que->res != NULL)
1794			bus_release_resource(dev, SYS_RES_IRQ, rid, que->res);
1795	}
1796
1797
1798	/* Clean the Legacy or Link interrupt last */
1799	if (adapter->mbxvec) /* we are doing MSIX */
1800		rid = adapter->mbxvec + 1;
1801	else
1802		(adapter->msix != 0) ? (rid = 1):(rid = 0);
1803
1804	if (adapter->tag != NULL) {
1805		bus_teardown_intr(dev, adapter->res, adapter->tag);
1806		adapter->tag = NULL;
1807	}
1808	if (adapter->res != NULL)
1809		bus_release_resource(dev, SYS_RES_IRQ, rid, adapter->res);
1810
1811mem:
1812	if (adapter->msix)
1813		pci_release_msi(dev);
1814
1815	if (adapter->msix_mem != NULL)
1816		bus_release_resource(dev, SYS_RES_MEMORY,
1817		    memrid, adapter->msix_mem);
1818
1819	if (adapter->pci_mem != NULL)
1820		bus_release_resource(dev, SYS_RES_MEMORY,
1821		    PCIR_BAR(0), adapter->pci_mem);
1822
1823	return;
1824}
1825
1826/*********************************************************************
1827 *
1828 *  Setup networking device structure and register an interface.
1829 *
1830 **********************************************************************/
1831static void
1832ixv_setup_interface(device_t dev, struct adapter *adapter)
1833{
1834	struct ifnet   *ifp;
1835
1836	INIT_DEBUGOUT("ixv_setup_interface: begin");
1837
1838	ifp = adapter->ifp = if_alloc(IFT_ETHER);
1839	if (ifp == NULL)
1840		panic("%s: can not if_alloc()\n", device_get_nameunit(dev));
1841	if_initname(ifp, device_get_name(dev), device_get_unit(dev));
1842	ifp->if_baudrate = 1000000000;
1843	ifp->if_init = ixv_init;
1844	ifp->if_softc = adapter;
1845	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
1846	ifp->if_ioctl = ixv_ioctl;
1847#if __FreeBSD_version >= 800000
1848	ifp->if_transmit = ixv_mq_start;
1849	ifp->if_qflush = ixv_qflush;
1850#else
1851	ifp->if_start = ixv_start;
1852#endif
1853	ifp->if_snd.ifq_maxlen = adapter->num_tx_desc - 2;
1854
1855	ether_ifattach(ifp, adapter->hw.mac.addr);
1856
1857	adapter->max_frame_size =
1858	    ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
1859
1860	/*
1861	 * Tell the upper layer(s) we support long frames.
1862	 */
1863	ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header);
1864
1865	ifp->if_capabilities |= IFCAP_HWCSUM | IFCAP_TSO4 | IFCAP_VLAN_HWCSUM;
1866	ifp->if_capabilities |= IFCAP_JUMBO_MTU;
1867	ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING
1868			     |  IFCAP_VLAN_HWTSO
1869			     |  IFCAP_VLAN_MTU;
1870	ifp->if_capenable = ifp->if_capabilities;
1871
1872	/* Don't enable LRO by default */
1873	ifp->if_capabilities |= IFCAP_LRO;
1874
1875	/*
1876	 * Specify the media types supported by this adapter and register
1877	 * callbacks to update media and link information
1878	 */
1879	ifmedia_init(&adapter->media, IFM_IMASK, ixv_media_change,
1880		     ixv_media_status);
1881	ifmedia_add(&adapter->media, IFM_ETHER | IFM_FDX, 0, NULL);
1882	ifmedia_add(&adapter->media, IFM_ETHER | IFM_AUTO, 0, NULL);
1883	ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO);
1884
1885	return;
1886}
1887
1888static void
1889ixv_config_link(struct adapter *adapter)
1890{
1891	struct ixgbe_hw *hw = &adapter->hw;
1892	u32	autoneg, err = 0;
1893	bool	negotiate = TRUE;
1894
1895	if (hw->mac.ops.check_link)
1896		err = hw->mac.ops.check_link(hw, &autoneg,
1897		    &adapter->link_up, FALSE);
1898	if (err)
1899		goto out;
1900
1901	if (hw->mac.ops.setup_link)
1902               	err = hw->mac.ops.setup_link(hw, autoneg,
1903		    negotiate, adapter->link_up);
1904out:
1905	return;
1906}
1907
1908/********************************************************************
1909 * Manage DMA'able memory.
1910 *******************************************************************/
1911static void
1912ixv_dmamap_cb(void *arg, bus_dma_segment_t * segs, int nseg, int error)
1913{
1914	if (error)
1915		return;
1916	*(bus_addr_t *) arg = segs->ds_addr;
1917	return;
1918}
1919
1920static int
1921ixv_dma_malloc(struct adapter *adapter, bus_size_t size,
1922		struct ixv_dma_alloc *dma, int mapflags)
1923{
1924	device_t dev = adapter->dev;
1925	int             r;
1926
1927	r = bus_dma_tag_create(bus_get_dma_tag(adapter->dev),	/* parent */
1928			       DBA_ALIGN, 0,	/* alignment, bounds */
1929			       BUS_SPACE_MAXADDR,	/* lowaddr */
1930			       BUS_SPACE_MAXADDR,	/* highaddr */
1931			       NULL, NULL,	/* filter, filterarg */
1932			       size,	/* maxsize */
1933			       1,	/* nsegments */
1934			       size,	/* maxsegsize */
1935			       BUS_DMA_ALLOCNOW,	/* flags */
1936			       NULL,	/* lockfunc */
1937			       NULL,	/* lockfuncarg */
1938			       &dma->dma_tag);
1939	if (r != 0) {
1940		device_printf(dev,"ixv_dma_malloc: bus_dma_tag_create failed; "
1941		       "error %u\n", r);
1942		goto fail_0;
1943	}
1944	r = bus_dmamem_alloc(dma->dma_tag, (void **)&dma->dma_vaddr,
1945			     BUS_DMA_NOWAIT, &dma->dma_map);
1946	if (r != 0) {
1947		device_printf(dev,"ixv_dma_malloc: bus_dmamem_alloc failed; "
1948		       "error %u\n", r);
1949		goto fail_1;
1950	}
1951	r = bus_dmamap_load(dma->dma_tag, dma->dma_map, dma->dma_vaddr,
1952			    size,
1953			    ixv_dmamap_cb,
1954			    &dma->dma_paddr,
1955			    mapflags | BUS_DMA_NOWAIT);
1956	if (r != 0) {
1957		device_printf(dev,"ixv_dma_malloc: bus_dmamap_load failed; "
1958		       "error %u\n", r);
1959		goto fail_2;
1960	}
1961	dma->dma_size = size;
1962	return (0);
1963fail_2:
1964	bus_dmamem_free(dma->dma_tag, dma->dma_vaddr, dma->dma_map);
1965fail_1:
1966	bus_dma_tag_destroy(dma->dma_tag);
1967fail_0:
1968	dma->dma_map = NULL;
1969	dma->dma_tag = NULL;
1970	return (r);
1971}
1972
1973static void
1974ixv_dma_free(struct adapter *adapter, struct ixv_dma_alloc *dma)
1975{
1976	bus_dmamap_sync(dma->dma_tag, dma->dma_map,
1977	    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
1978	bus_dmamap_unload(dma->dma_tag, dma->dma_map);
1979	bus_dmamem_free(dma->dma_tag, dma->dma_vaddr, dma->dma_map);
1980	bus_dma_tag_destroy(dma->dma_tag);
1981}
1982
1983
1984/*********************************************************************
1985 *
1986 *  Allocate memory for the transmit and receive rings, and then
1987 *  the descriptors associated with each, called only once at attach.
1988 *
1989 **********************************************************************/
1990static int
1991ixv_allocate_queues(struct adapter *adapter)
1992{
1993	device_t	dev = adapter->dev;
1994	struct ix_queue	*que;
1995	struct tx_ring	*txr;
1996	struct rx_ring	*rxr;
1997	int rsize, tsize, error = 0;
1998	int txconf = 0, rxconf = 0;
1999
2000        /* First allocate the top level queue structs */
2001        if (!(adapter->queues =
2002            (struct ix_queue *) malloc(sizeof(struct ix_queue) *
2003            adapter->num_queues, M_DEVBUF, M_NOWAIT | M_ZERO))) {
2004                device_printf(dev, "Unable to allocate queue memory\n");
2005                error = ENOMEM;
2006                goto fail;
2007        }
2008
2009	/* First allocate the TX ring struct memory */
2010	if (!(adapter->tx_rings =
2011	    (struct tx_ring *) malloc(sizeof(struct tx_ring) *
2012	    adapter->num_queues, M_DEVBUF, M_NOWAIT | M_ZERO))) {
2013		device_printf(dev, "Unable to allocate TX ring memory\n");
2014		error = ENOMEM;
2015		goto tx_fail;
2016	}
2017
2018	/* Next allocate the RX */
2019	if (!(adapter->rx_rings =
2020	    (struct rx_ring *) malloc(sizeof(struct rx_ring) *
2021	    adapter->num_queues, M_DEVBUF, M_NOWAIT | M_ZERO))) {
2022		device_printf(dev, "Unable to allocate RX ring memory\n");
2023		error = ENOMEM;
2024		goto rx_fail;
2025	}
2026
2027	/* For the ring itself */
2028	tsize = roundup2(adapter->num_tx_desc *
2029	    sizeof(union ixgbe_adv_tx_desc), DBA_ALIGN);
2030
2031	/*
2032	 * Now set up the TX queues, txconf is needed to handle the
2033	 * possibility that things fail midcourse and we need to
2034	 * undo memory gracefully
2035	 */
2036	for (int i = 0; i < adapter->num_queues; i++, txconf++) {
2037		/* Set up some basics */
2038		txr = &adapter->tx_rings[i];
2039		txr->adapter = adapter;
2040		txr->me = i;
2041
2042		/* Initialize the TX side lock */
2043		snprintf(txr->mtx_name, sizeof(txr->mtx_name), "%s:tx(%d)",
2044		    device_get_nameunit(dev), txr->me);
2045		mtx_init(&txr->tx_mtx, txr->mtx_name, NULL, MTX_DEF);
2046
2047		if (ixv_dma_malloc(adapter, tsize,
2048			&txr->txdma, BUS_DMA_NOWAIT)) {
2049			device_printf(dev,
2050			    "Unable to allocate TX Descriptor memory\n");
2051			error = ENOMEM;
2052			goto err_tx_desc;
2053		}
2054		txr->tx_base = (union ixgbe_adv_tx_desc *)txr->txdma.dma_vaddr;
2055		bzero((void *)txr->tx_base, tsize);
2056
2057        	/* Now allocate transmit buffers for the ring */
2058        	if (ixv_allocate_transmit_buffers(txr)) {
2059			device_printf(dev,
2060			    "Critical Failure setting up transmit buffers\n");
2061			error = ENOMEM;
2062			goto err_tx_desc;
2063        	}
2064#if __FreeBSD_version >= 800000
2065		/* Allocate a buf ring */
2066		txr->br = buf_ring_alloc(IXV_BR_SIZE, M_DEVBUF,
2067		    M_WAITOK, &txr->tx_mtx);
2068		if (txr->br == NULL) {
2069			device_printf(dev,
2070			    "Critical Failure setting up buf ring\n");
2071			error = ENOMEM;
2072			goto err_tx_desc;
2073		}
2074#endif
2075	}
2076
2077	/*
2078	 * Next the RX queues...
2079	 */
2080	rsize = roundup2(adapter->num_rx_desc *
2081	    sizeof(union ixgbe_adv_rx_desc), DBA_ALIGN);
2082	for (int i = 0; i < adapter->num_queues; i++, rxconf++) {
2083		rxr = &adapter->rx_rings[i];
2084		/* Set up some basics */
2085		rxr->adapter = adapter;
2086		rxr->me = i;
2087
2088		/* Initialize the RX side lock */
2089		snprintf(rxr->mtx_name, sizeof(rxr->mtx_name), "%s:rx(%d)",
2090		    device_get_nameunit(dev), rxr->me);
2091		mtx_init(&rxr->rx_mtx, rxr->mtx_name, NULL, MTX_DEF);
2092
2093		if (ixv_dma_malloc(adapter, rsize,
2094			&rxr->rxdma, BUS_DMA_NOWAIT)) {
2095			device_printf(dev,
2096			    "Unable to allocate RxDescriptor memory\n");
2097			error = ENOMEM;
2098			goto err_rx_desc;
2099		}
2100		rxr->rx_base = (union ixgbe_adv_rx_desc *)rxr->rxdma.dma_vaddr;
2101		bzero((void *)rxr->rx_base, rsize);
2102
2103        	/* Allocate receive buffers for the ring*/
2104		if (ixv_allocate_receive_buffers(rxr)) {
2105			device_printf(dev,
2106			    "Critical Failure setting up receive buffers\n");
2107			error = ENOMEM;
2108			goto err_rx_desc;
2109		}
2110	}
2111
2112	/*
2113	** Finally set up the queue holding structs
2114	*/
2115	for (int i = 0; i < adapter->num_queues; i++) {
2116		que = &adapter->queues[i];
2117		que->adapter = adapter;
2118		que->txr = &adapter->tx_rings[i];
2119		que->rxr = &adapter->rx_rings[i];
2120	}
2121
2122	return (0);
2123
2124err_rx_desc:
2125	for (rxr = adapter->rx_rings; rxconf > 0; rxr++, rxconf--)
2126		ixv_dma_free(adapter, &rxr->rxdma);
2127err_tx_desc:
2128	for (txr = adapter->tx_rings; txconf > 0; txr++, txconf--)
2129		ixv_dma_free(adapter, &txr->txdma);
2130	free(adapter->rx_rings, M_DEVBUF);
2131rx_fail:
2132	free(adapter->tx_rings, M_DEVBUF);
2133tx_fail:
2134	free(adapter->queues, M_DEVBUF);
2135fail:
2136	return (error);
2137}
2138
2139
2140/*********************************************************************
2141 *
2142 *  Allocate memory for tx_buffer structures. The tx_buffer stores all
2143 *  the information needed to transmit a packet on the wire. This is
2144 *  called only once at attach, setup is done every reset.
2145 *
2146 **********************************************************************/
2147static int
2148ixv_allocate_transmit_buffers(struct tx_ring *txr)
2149{
2150	struct adapter *adapter = txr->adapter;
2151	device_t dev = adapter->dev;
2152	struct ixv_tx_buf *txbuf;
2153	int error, i;
2154
2155	/*
2156	 * Setup DMA descriptor areas.
2157	 */
2158	if ((error = bus_dma_tag_create(
2159			       bus_get_dma_tag(adapter->dev),	/* parent */
2160			       1, 0,		/* alignment, bounds */
2161			       BUS_SPACE_MAXADDR,	/* lowaddr */
2162			       BUS_SPACE_MAXADDR,	/* highaddr */
2163			       NULL, NULL,		/* filter, filterarg */
2164			       IXV_TSO_SIZE,		/* maxsize */
2165			       32,			/* nsegments */
2166			       PAGE_SIZE,		/* maxsegsize */
2167			       0,			/* flags */
2168			       NULL,			/* lockfunc */
2169			       NULL,			/* lockfuncarg */
2170			       &txr->txtag))) {
2171		device_printf(dev,"Unable to allocate TX DMA tag\n");
2172		goto fail;
2173	}
2174
2175	if (!(txr->tx_buffers =
2176	    (struct ixv_tx_buf *) malloc(sizeof(struct ixv_tx_buf) *
2177	    adapter->num_tx_desc, M_DEVBUF, M_NOWAIT | M_ZERO))) {
2178		device_printf(dev, "Unable to allocate tx_buffer memory\n");
2179		error = ENOMEM;
2180		goto fail;
2181	}
2182
2183        /* Create the descriptor buffer dma maps */
2184	txbuf = txr->tx_buffers;
2185	for (i = 0; i < adapter->num_tx_desc; i++, txbuf++) {
2186		error = bus_dmamap_create(txr->txtag, 0, &txbuf->map);
2187		if (error != 0) {
2188			device_printf(dev, "Unable to create TX DMA map\n");
2189			goto fail;
2190		}
2191	}
2192
2193	return 0;
2194fail:
2195	/* We free all, it handles case where we are in the middle */
2196	ixv_free_transmit_structures(adapter);
2197	return (error);
2198}
2199
2200/*********************************************************************
2201 *
2202 *  Initialize a transmit ring.
2203 *
2204 **********************************************************************/
2205static void
2206ixv_setup_transmit_ring(struct tx_ring *txr)
2207{
2208	struct adapter *adapter = txr->adapter;
2209	struct ixv_tx_buf *txbuf;
2210	int i;
2211
2212	/* Clear the old ring contents */
2213	IXV_TX_LOCK(txr);
2214	bzero((void *)txr->tx_base,
2215	      (sizeof(union ixgbe_adv_tx_desc)) * adapter->num_tx_desc);
2216	/* Reset indices */
2217	txr->next_avail_desc = 0;
2218	txr->next_to_clean = 0;
2219
2220	/* Free any existing tx buffers. */
2221        txbuf = txr->tx_buffers;
2222	for (i = 0; i < adapter->num_tx_desc; i++, txbuf++) {
2223		if (txbuf->m_head != NULL) {
2224			bus_dmamap_sync(txr->txtag, txbuf->map,
2225			    BUS_DMASYNC_POSTWRITE);
2226			bus_dmamap_unload(txr->txtag, txbuf->map);
2227			m_freem(txbuf->m_head);
2228			txbuf->m_head = NULL;
2229		}
2230		/* Clear the EOP index */
2231		txbuf->eop_index = -1;
2232        }
2233
2234	/* Set number of descriptors available */
2235	txr->tx_avail = adapter->num_tx_desc;
2236
2237	bus_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map,
2238	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
2239	IXV_TX_UNLOCK(txr);
2240}
2241
2242/*********************************************************************
2243 *
2244 *  Initialize all transmit rings.
2245 *
2246 **********************************************************************/
2247static int
2248ixv_setup_transmit_structures(struct adapter *adapter)
2249{
2250	struct tx_ring *txr = adapter->tx_rings;
2251
2252	for (int i = 0; i < adapter->num_queues; i++, txr++)
2253		ixv_setup_transmit_ring(txr);
2254
2255	return (0);
2256}
2257
2258/*********************************************************************
2259 *
2260 *  Enable transmit unit.
2261 *
2262 **********************************************************************/
2263static void
2264ixv_initialize_transmit_units(struct adapter *adapter)
2265{
2266	struct tx_ring	*txr = adapter->tx_rings;
2267	struct ixgbe_hw	*hw = &adapter->hw;
2268
2269
2270	for (int i = 0; i < adapter->num_queues; i++, txr++) {
2271		u64	tdba = txr->txdma.dma_paddr;
2272		u32	txctrl, txdctl;
2273
2274		/* Set WTHRESH to 8, burst writeback */
2275		txdctl = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(i));
2276		txdctl |= (8 << 16);
2277		IXGBE_WRITE_REG(hw, IXGBE_VFTXDCTL(i), txdctl);
2278		/* Now enable */
2279		txdctl = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(i));
2280		txdctl |= IXGBE_TXDCTL_ENABLE;
2281		IXGBE_WRITE_REG(hw, IXGBE_VFTXDCTL(i), txdctl);
2282
2283		/* Set the HW Tx Head and Tail indices */
2284	    	IXGBE_WRITE_REG(&adapter->hw, IXGBE_VFTDH(i), 0);
2285	    	IXGBE_WRITE_REG(&adapter->hw, IXGBE_VFTDT(i), 0);
2286
2287		/* Setup Transmit Descriptor Cmd Settings */
2288		txr->txd_cmd = IXGBE_TXD_CMD_IFCS;
2289		txr->watchdog_check = FALSE;
2290
2291		/* Set Ring parameters */
2292		IXGBE_WRITE_REG(hw, IXGBE_VFTDBAL(i),
2293		       (tdba & 0x00000000ffffffffULL));
2294		IXGBE_WRITE_REG(hw, IXGBE_VFTDBAH(i), (tdba >> 32));
2295		IXGBE_WRITE_REG(hw, IXGBE_VFTDLEN(i),
2296		    adapter->num_tx_desc *
2297		    sizeof(struct ixgbe_legacy_tx_desc));
2298		txctrl = IXGBE_READ_REG(hw, IXGBE_VFDCA_TXCTRL(i));
2299		txctrl &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
2300		IXGBE_WRITE_REG(hw, IXGBE_VFDCA_TXCTRL(i), txctrl);
2301		break;
2302	}
2303
2304	return;
2305}
2306
2307/*********************************************************************
2308 *
2309 *  Free all transmit rings.
2310 *
2311 **********************************************************************/
2312static void
2313ixv_free_transmit_structures(struct adapter *adapter)
2314{
2315	struct tx_ring *txr = adapter->tx_rings;
2316
2317	for (int i = 0; i < adapter->num_queues; i++, txr++) {
2318		IXV_TX_LOCK(txr);
2319		ixv_free_transmit_buffers(txr);
2320		ixv_dma_free(adapter, &txr->txdma);
2321		IXV_TX_UNLOCK(txr);
2322		IXV_TX_LOCK_DESTROY(txr);
2323	}
2324	free(adapter->tx_rings, M_DEVBUF);
2325}
2326
2327/*********************************************************************
2328 *
2329 *  Free transmit ring related data structures.
2330 *
2331 **********************************************************************/
2332static void
2333ixv_free_transmit_buffers(struct tx_ring *txr)
2334{
2335	struct adapter *adapter = txr->adapter;
2336	struct ixv_tx_buf *tx_buffer;
2337	int             i;
2338
2339	INIT_DEBUGOUT("free_transmit_ring: begin");
2340
2341	if (txr->tx_buffers == NULL)
2342		return;
2343
2344	tx_buffer = txr->tx_buffers;
2345	for (i = 0; i < adapter->num_tx_desc; i++, tx_buffer++) {
2346		if (tx_buffer->m_head != NULL) {
2347			bus_dmamap_sync(txr->txtag, tx_buffer->map,
2348			    BUS_DMASYNC_POSTWRITE);
2349			bus_dmamap_unload(txr->txtag,
2350			    tx_buffer->map);
2351			m_freem(tx_buffer->m_head);
2352			tx_buffer->m_head = NULL;
2353			if (tx_buffer->map != NULL) {
2354				bus_dmamap_destroy(txr->txtag,
2355				    tx_buffer->map);
2356				tx_buffer->map = NULL;
2357			}
2358		} else if (tx_buffer->map != NULL) {
2359			bus_dmamap_unload(txr->txtag,
2360			    tx_buffer->map);
2361			bus_dmamap_destroy(txr->txtag,
2362			    tx_buffer->map);
2363			tx_buffer->map = NULL;
2364		}
2365	}
2366#if __FreeBSD_version >= 800000
2367	if (txr->br != NULL)
2368		buf_ring_free(txr->br, M_DEVBUF);
2369#endif
2370	if (txr->tx_buffers != NULL) {
2371		free(txr->tx_buffers, M_DEVBUF);
2372		txr->tx_buffers = NULL;
2373	}
2374	if (txr->txtag != NULL) {
2375		bus_dma_tag_destroy(txr->txtag);
2376		txr->txtag = NULL;
2377	}
2378	return;
2379}
2380
2381/*********************************************************************
2382 *
2383 *  Advanced Context Descriptor setup for VLAN or CSUM
2384 *
2385 **********************************************************************/
2386
2387static bool
2388ixv_tx_ctx_setup(struct tx_ring *txr, struct mbuf *mp)
2389{
2390	struct adapter *adapter = txr->adapter;
2391	struct ixgbe_adv_tx_context_desc *TXD;
2392	struct ixv_tx_buf        *tx_buffer;
2393	u32 vlan_macip_lens = 0, type_tucmd_mlhl = 0;
2394	struct ether_vlan_header *eh;
2395	struct ip *ip;
2396	struct ip6_hdr *ip6;
2397	int  ehdrlen, ip_hlen = 0;
2398	u16	etype;
2399	u8	ipproto = 0;
2400	bool	offload = TRUE;
2401	int ctxd = txr->next_avail_desc;
2402	u16 vtag = 0;
2403
2404
2405	if ((mp->m_pkthdr.csum_flags & CSUM_OFFLOAD) == 0)
2406		offload = FALSE;
2407
2408
2409	tx_buffer = &txr->tx_buffers[ctxd];
2410	TXD = (struct ixgbe_adv_tx_context_desc *) &txr->tx_base[ctxd];
2411
2412	/*
2413	** In advanced descriptors the vlan tag must
2414	** be placed into the descriptor itself.
2415	*/
2416	if (mp->m_flags & M_VLANTAG) {
2417		vtag = htole16(mp->m_pkthdr.ether_vtag);
2418		vlan_macip_lens |= (vtag << IXGBE_ADVTXD_VLAN_SHIFT);
2419	} else if (offload == FALSE)
2420		return FALSE;
2421
2422	/*
2423	 * Determine where frame payload starts.
2424	 * Jump over vlan headers if already present,
2425	 * helpful for QinQ too.
2426	 */
2427	eh = mtod(mp, struct ether_vlan_header *);
2428	if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN)) {
2429		etype = ntohs(eh->evl_proto);
2430		ehdrlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
2431	} else {
2432		etype = ntohs(eh->evl_encap_proto);
2433		ehdrlen = ETHER_HDR_LEN;
2434	}
2435
2436	/* Set the ether header length */
2437	vlan_macip_lens |= ehdrlen << IXGBE_ADVTXD_MACLEN_SHIFT;
2438
2439	switch (etype) {
2440		case ETHERTYPE_IP:
2441			ip = (struct ip *)(mp->m_data + ehdrlen);
2442			ip_hlen = ip->ip_hl << 2;
2443			if (mp->m_len < ehdrlen + ip_hlen)
2444				return (FALSE);
2445			ipproto = ip->ip_p;
2446			type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV4;
2447			break;
2448		case ETHERTYPE_IPV6:
2449			ip6 = (struct ip6_hdr *)(mp->m_data + ehdrlen);
2450			ip_hlen = sizeof(struct ip6_hdr);
2451			if (mp->m_len < ehdrlen + ip_hlen)
2452				return (FALSE);
2453			ipproto = ip6->ip6_nxt;
2454			type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV6;
2455			break;
2456		default:
2457			offload = FALSE;
2458			break;
2459	}
2460
2461	vlan_macip_lens |= ip_hlen;
2462	type_tucmd_mlhl |= IXGBE_ADVTXD_DCMD_DEXT | IXGBE_ADVTXD_DTYP_CTXT;
2463
2464	switch (ipproto) {
2465		case IPPROTO_TCP:
2466			if (mp->m_pkthdr.csum_flags & CSUM_TCP)
2467				type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_TCP;
2468			break;
2469
2470		case IPPROTO_UDP:
2471			if (mp->m_pkthdr.csum_flags & CSUM_UDP)
2472				type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_UDP;
2473			break;
2474
2475#if __FreeBSD_version >= 800000
2476		case IPPROTO_SCTP:
2477			if (mp->m_pkthdr.csum_flags & CSUM_SCTP)
2478				type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_SCTP;
2479			break;
2480#endif
2481		default:
2482			offload = FALSE;
2483			break;
2484	}
2485
2486	/* Now copy bits into descriptor */
2487	TXD->vlan_macip_lens |= htole32(vlan_macip_lens);
2488	TXD->type_tucmd_mlhl |= htole32(type_tucmd_mlhl);
2489	TXD->seqnum_seed = htole32(0);
2490	TXD->mss_l4len_idx = htole32(0);
2491
2492	tx_buffer->m_head = NULL;
2493	tx_buffer->eop_index = -1;
2494
2495	/* We've consumed the first desc, adjust counters */
2496	if (++ctxd == adapter->num_tx_desc)
2497		ctxd = 0;
2498	txr->next_avail_desc = ctxd;
2499	--txr->tx_avail;
2500
2501        return (offload);
2502}
2503
2504/**********************************************************************
2505 *
2506 *  Setup work for hardware segmentation offload (TSO) on
2507 *  adapters using advanced tx descriptors
2508 *
2509 **********************************************************************/
2510static bool
2511ixv_tso_setup(struct tx_ring *txr, struct mbuf *mp, u32 *paylen)
2512{
2513	struct adapter *adapter = txr->adapter;
2514	struct ixgbe_adv_tx_context_desc *TXD;
2515	struct ixv_tx_buf        *tx_buffer;
2516	u32 vlan_macip_lens = 0, type_tucmd_mlhl = 0;
2517	u32 mss_l4len_idx = 0;
2518	u16 vtag = 0;
2519	int ctxd, ehdrlen,  hdrlen, ip_hlen, tcp_hlen;
2520	struct ether_vlan_header *eh;
2521	struct ip *ip;
2522	struct tcphdr *th;
2523
2524
2525	/*
2526	 * Determine where frame payload starts.
2527	 * Jump over vlan headers if already present
2528	 */
2529	eh = mtod(mp, struct ether_vlan_header *);
2530	if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN))
2531		ehdrlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
2532	else
2533		ehdrlen = ETHER_HDR_LEN;
2534
2535        /* Ensure we have at least the IP+TCP header in the first mbuf. */
2536        if (mp->m_len < ehdrlen + sizeof(struct ip) + sizeof(struct tcphdr))
2537		return FALSE;
2538
2539	ctxd = txr->next_avail_desc;
2540	tx_buffer = &txr->tx_buffers[ctxd];
2541	TXD = (struct ixgbe_adv_tx_context_desc *) &txr->tx_base[ctxd];
2542
2543	ip = (struct ip *)(mp->m_data + ehdrlen);
2544	if (ip->ip_p != IPPROTO_TCP)
2545		return FALSE;   /* 0 */
2546	ip->ip_sum = 0;
2547	ip_hlen = ip->ip_hl << 2;
2548	th = (struct tcphdr *)((caddr_t)ip + ip_hlen);
2549	th->th_sum = in_pseudo(ip->ip_src.s_addr,
2550	    ip->ip_dst.s_addr, htons(IPPROTO_TCP));
2551	tcp_hlen = th->th_off << 2;
2552	hdrlen = ehdrlen + ip_hlen + tcp_hlen;
2553
2554	/* This is used in the transmit desc in encap */
2555	*paylen = mp->m_pkthdr.len - hdrlen;
2556
2557	/* VLAN MACLEN IPLEN */
2558	if (mp->m_flags & M_VLANTAG) {
2559		vtag = htole16(mp->m_pkthdr.ether_vtag);
2560                vlan_macip_lens |= (vtag << IXGBE_ADVTXD_VLAN_SHIFT);
2561	}
2562
2563	vlan_macip_lens |= ehdrlen << IXGBE_ADVTXD_MACLEN_SHIFT;
2564	vlan_macip_lens |= ip_hlen;
2565	TXD->vlan_macip_lens |= htole32(vlan_macip_lens);
2566
2567	/* ADV DTYPE TUCMD */
2568	type_tucmd_mlhl |= IXGBE_ADVTXD_DCMD_DEXT | IXGBE_ADVTXD_DTYP_CTXT;
2569	type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_TCP;
2570	type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV4;
2571	TXD->type_tucmd_mlhl |= htole32(type_tucmd_mlhl);
2572
2573
2574	/* MSS L4LEN IDX */
2575	mss_l4len_idx |= (mp->m_pkthdr.tso_segsz << IXGBE_ADVTXD_MSS_SHIFT);
2576	mss_l4len_idx |= (tcp_hlen << IXGBE_ADVTXD_L4LEN_SHIFT);
2577	TXD->mss_l4len_idx = htole32(mss_l4len_idx);
2578
2579	TXD->seqnum_seed = htole32(0);
2580	tx_buffer->m_head = NULL;
2581	tx_buffer->eop_index = -1;
2582
2583	if (++ctxd == adapter->num_tx_desc)
2584		ctxd = 0;
2585
2586	txr->tx_avail--;
2587	txr->next_avail_desc = ctxd;
2588	return TRUE;
2589}
2590
2591
2592/**********************************************************************
2593 *
2594 *  Examine each tx_buffer in the used queue. If the hardware is done
2595 *  processing the packet then free associated resources. The
2596 *  tx_buffer is put back on the free queue.
2597 *
2598 **********************************************************************/
2599static bool
2600ixv_txeof(struct tx_ring *txr)
2601{
2602	struct adapter	*adapter = txr->adapter;
2603	struct ifnet	*ifp = adapter->ifp;
2604	u32	first, last, done;
2605	struct ixv_tx_buf *tx_buffer;
2606	struct ixgbe_legacy_tx_desc *tx_desc, *eop_desc;
2607
2608	mtx_assert(&txr->tx_mtx, MA_OWNED);
2609
2610	if (txr->tx_avail == adapter->num_tx_desc)
2611		return FALSE;
2612
2613	first = txr->next_to_clean;
2614	tx_buffer = &txr->tx_buffers[first];
2615	/* For cleanup we just use legacy struct */
2616	tx_desc = (struct ixgbe_legacy_tx_desc *)&txr->tx_base[first];
2617	last = tx_buffer->eop_index;
2618	if (last == -1)
2619		return FALSE;
2620	eop_desc = (struct ixgbe_legacy_tx_desc *)&txr->tx_base[last];
2621
2622	/*
2623	** Get the index of the first descriptor
2624	** BEYOND the EOP and call that 'done'.
2625	** I do this so the comparison in the
2626	** inner while loop below can be simple
2627	*/
2628	if (++last == adapter->num_tx_desc) last = 0;
2629	done = last;
2630
2631        bus_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map,
2632            BUS_DMASYNC_POSTREAD);
2633	/*
2634	** Only the EOP descriptor of a packet now has the DD
2635	** bit set, this is what we look for...
2636	*/
2637	while (eop_desc->upper.fields.status & IXGBE_TXD_STAT_DD) {
2638		/* We clean the range of the packet */
2639		while (first != done) {
2640			tx_desc->upper.data = 0;
2641			tx_desc->lower.data = 0;
2642			tx_desc->buffer_addr = 0;
2643			++txr->tx_avail;
2644
2645			if (tx_buffer->m_head) {
2646				bus_dmamap_sync(txr->txtag,
2647				    tx_buffer->map,
2648				    BUS_DMASYNC_POSTWRITE);
2649				bus_dmamap_unload(txr->txtag,
2650				    tx_buffer->map);
2651				m_freem(tx_buffer->m_head);
2652				tx_buffer->m_head = NULL;
2653				tx_buffer->map = NULL;
2654			}
2655			tx_buffer->eop_index = -1;
2656			txr->watchdog_time = ticks;
2657
2658			if (++first == adapter->num_tx_desc)
2659				first = 0;
2660
2661			tx_buffer = &txr->tx_buffers[first];
2662			tx_desc =
2663			    (struct ixgbe_legacy_tx_desc *)&txr->tx_base[first];
2664		}
2665		++ifp->if_opackets;
2666		/* See if there is more work now */
2667		last = tx_buffer->eop_index;
2668		if (last != -1) {
2669			eop_desc =
2670			    (struct ixgbe_legacy_tx_desc *)&txr->tx_base[last];
2671			/* Get next done point */
2672			if (++last == adapter->num_tx_desc) last = 0;
2673			done = last;
2674		} else
2675			break;
2676	}
2677	bus_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map,
2678	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
2679
2680	txr->next_to_clean = first;
2681
2682	/*
2683	 * If we have enough room, clear IFF_DRV_OACTIVE to tell the stack that
2684	 * it is OK to send packets. If there are no pending descriptors,
2685	 * clear the timeout. Otherwise, if some descriptors have been freed,
2686	 * restart the timeout.
2687	 */
2688	if (txr->tx_avail > IXV_TX_CLEANUP_THRESHOLD) {
2689		ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
2690		if (txr->tx_avail == adapter->num_tx_desc) {
2691			txr->watchdog_check = FALSE;
2692			return FALSE;
2693		}
2694	}
2695
2696	return TRUE;
2697}
2698
2699/*********************************************************************
2700 *
2701 *  Refresh mbuf buffers for RX descriptor rings
2702 *   - now keeps its own state so discards due to resource
2703 *     exhaustion are unnecessary, if an mbuf cannot be obtained
2704 *     it just returns, keeping its placeholder, thus it can simply
2705 *     be recalled to try again.
2706 *
2707 **********************************************************************/
2708static void
2709ixv_refresh_mbufs(struct rx_ring *rxr, int limit)
2710{
2711	struct adapter		*adapter = rxr->adapter;
2712	bus_dma_segment_t	hseg[1];
2713	bus_dma_segment_t	pseg[1];
2714	struct ixv_rx_buf	*rxbuf;
2715	struct mbuf		*mh, *mp;
2716	int			i, j, nsegs, error;
2717	bool			refreshed = FALSE;
2718
2719	i = j = rxr->next_to_refresh;
2720        /* Get the control variable, one beyond refresh point */
2721	if (++j == adapter->num_rx_desc)
2722		j = 0;
2723	while (j != limit) {
2724		rxbuf = &rxr->rx_buffers[i];
2725		if ((rxbuf->m_head == NULL) && (rxr->hdr_split)) {
2726			mh = m_gethdr(M_NOWAIT, MT_DATA);
2727			if (mh == NULL)
2728				goto update;
2729			mh->m_pkthdr.len = mh->m_len = MHLEN;
2730			mh->m_len = MHLEN;
2731			mh->m_flags |= M_PKTHDR;
2732			m_adj(mh, ETHER_ALIGN);
2733			/* Get the memory mapping */
2734			error = bus_dmamap_load_mbuf_sg(rxr->htag,
2735			    rxbuf->hmap, mh, hseg, &nsegs, BUS_DMA_NOWAIT);
2736			if (error != 0) {
2737				printf("GET BUF: dmamap load"
2738				    " failure - %d\n", error);
2739				m_free(mh);
2740				goto update;
2741			}
2742			rxbuf->m_head = mh;
2743			bus_dmamap_sync(rxr->htag, rxbuf->hmap,
2744			    BUS_DMASYNC_PREREAD);
2745			rxr->rx_base[i].read.hdr_addr =
2746			    htole64(hseg[0].ds_addr);
2747		}
2748
2749		if (rxbuf->m_pack == NULL) {
2750			mp = m_getjcl(M_NOWAIT, MT_DATA,
2751			    M_PKTHDR, adapter->rx_mbuf_sz);
2752			if (mp == NULL)
2753				goto update;
2754		} else
2755			mp = rxbuf->m_pack;
2756
2757		mp->m_pkthdr.len = mp->m_len = adapter->rx_mbuf_sz;
2758		/* Get the memory mapping */
2759		error = bus_dmamap_load_mbuf_sg(rxr->ptag,
2760		    rxbuf->pmap, mp, pseg, &nsegs, BUS_DMA_NOWAIT);
2761		if (error != 0) {
2762			printf("GET BUF: dmamap load"
2763			    " failure - %d\n", error);
2764			m_free(mp);
2765			rxbuf->m_pack = NULL;
2766			goto update;
2767		}
2768		rxbuf->m_pack = mp;
2769		bus_dmamap_sync(rxr->ptag, rxbuf->pmap,
2770		    BUS_DMASYNC_PREREAD);
2771		rxr->rx_base[i].read.pkt_addr =
2772		    htole64(pseg[0].ds_addr);
2773
2774		refreshed = TRUE;
2775		rxr->next_to_refresh = i = j;
2776		/* Calculate next index */
2777		if (++j == adapter->num_rx_desc)
2778			j = 0;
2779	}
2780update:
2781	if (refreshed) /* update tail index */
2782		IXGBE_WRITE_REG(&adapter->hw,
2783		    IXGBE_VFRDT(rxr->me), rxr->next_to_refresh);
2784	return;
2785}
2786
2787/*********************************************************************
2788 *
2789 *  Allocate memory for rx_buffer structures. Since we use one
2790 *  rx_buffer per received packet, the maximum number of rx_buffer's
2791 *  that we'll need is equal to the number of receive descriptors
2792 *  that we've allocated.
2793 *
2794 **********************************************************************/
2795static int
2796ixv_allocate_receive_buffers(struct rx_ring *rxr)
2797{
2798	struct	adapter 	*adapter = rxr->adapter;
2799	device_t 		dev = adapter->dev;
2800	struct ixv_rx_buf 	*rxbuf;
2801	int             	i, bsize, error;
2802
2803	bsize = sizeof(struct ixv_rx_buf) * adapter->num_rx_desc;
2804	if (!(rxr->rx_buffers =
2805	    (struct ixv_rx_buf *) malloc(bsize,
2806	    M_DEVBUF, M_NOWAIT | M_ZERO))) {
2807		device_printf(dev, "Unable to allocate rx_buffer memory\n");
2808		error = ENOMEM;
2809		goto fail;
2810	}
2811
2812	if ((error = bus_dma_tag_create(bus_get_dma_tag(dev),	/* parent */
2813				   1, 0,	/* alignment, bounds */
2814				   BUS_SPACE_MAXADDR,	/* lowaddr */
2815				   BUS_SPACE_MAXADDR,	/* highaddr */
2816				   NULL, NULL,		/* filter, filterarg */
2817				   MSIZE,		/* maxsize */
2818				   1,			/* nsegments */
2819				   MSIZE,		/* maxsegsize */
2820				   0,			/* flags */
2821				   NULL,		/* lockfunc */
2822				   NULL,		/* lockfuncarg */
2823				   &rxr->htag))) {
2824		device_printf(dev, "Unable to create RX DMA tag\n");
2825		goto fail;
2826	}
2827
2828	if ((error = bus_dma_tag_create(bus_get_dma_tag(dev),	/* parent */
2829				   1, 0,	/* alignment, bounds */
2830				   BUS_SPACE_MAXADDR,	/* lowaddr */
2831				   BUS_SPACE_MAXADDR,	/* highaddr */
2832				   NULL, NULL,		/* filter, filterarg */
2833				   MJUMPAGESIZE,	/* maxsize */
2834				   1,			/* nsegments */
2835				   MJUMPAGESIZE,	/* maxsegsize */
2836				   0,			/* flags */
2837				   NULL,		/* lockfunc */
2838				   NULL,		/* lockfuncarg */
2839				   &rxr->ptag))) {
2840		device_printf(dev, "Unable to create RX DMA tag\n");
2841		goto fail;
2842	}
2843
2844	for (i = 0; i < adapter->num_rx_desc; i++, rxbuf++) {
2845		rxbuf = &rxr->rx_buffers[i];
2846		error = bus_dmamap_create(rxr->htag,
2847		    BUS_DMA_NOWAIT, &rxbuf->hmap);
2848		if (error) {
2849			device_printf(dev, "Unable to create RX head map\n");
2850			goto fail;
2851		}
2852		error = bus_dmamap_create(rxr->ptag,
2853		    BUS_DMA_NOWAIT, &rxbuf->pmap);
2854		if (error) {
2855			device_printf(dev, "Unable to create RX pkt map\n");
2856			goto fail;
2857		}
2858	}
2859
2860	return (0);
2861
2862fail:
2863	/* Frees all, but can handle partial completion */
2864	ixv_free_receive_structures(adapter);
2865	return (error);
2866}
2867
2868static void
2869ixv_free_receive_ring(struct rx_ring *rxr)
2870{
2871	struct  adapter         *adapter;
2872	struct ixv_rx_buf       *rxbuf;
2873	int i;
2874
2875	adapter = rxr->adapter;
2876	for (i = 0; i < adapter->num_rx_desc; i++) {
2877		rxbuf = &rxr->rx_buffers[i];
2878		if (rxbuf->m_head != NULL) {
2879			bus_dmamap_sync(rxr->htag, rxbuf->hmap,
2880			    BUS_DMASYNC_POSTREAD);
2881			bus_dmamap_unload(rxr->htag, rxbuf->hmap);
2882			rxbuf->m_head->m_flags |= M_PKTHDR;
2883			m_freem(rxbuf->m_head);
2884		}
2885		if (rxbuf->m_pack != NULL) {
2886			bus_dmamap_sync(rxr->ptag, rxbuf->pmap,
2887			    BUS_DMASYNC_POSTREAD);
2888			bus_dmamap_unload(rxr->ptag, rxbuf->pmap);
2889			rxbuf->m_pack->m_flags |= M_PKTHDR;
2890			m_freem(rxbuf->m_pack);
2891		}
2892		rxbuf->m_head = NULL;
2893		rxbuf->m_pack = NULL;
2894	}
2895}
2896
2897
2898/*********************************************************************
2899 *
2900 *  Initialize a receive ring and its buffers.
2901 *
2902 **********************************************************************/
2903static int
2904ixv_setup_receive_ring(struct rx_ring *rxr)
2905{
2906	struct	adapter 	*adapter;
2907	struct ifnet		*ifp;
2908	device_t		dev;
2909	struct ixv_rx_buf	*rxbuf;
2910	bus_dma_segment_t	pseg[1], hseg[1];
2911	struct lro_ctrl		*lro = &rxr->lro;
2912	int			rsize, nsegs, error = 0;
2913
2914	adapter = rxr->adapter;
2915	ifp = adapter->ifp;
2916	dev = adapter->dev;
2917
2918	/* Clear the ring contents */
2919	IXV_RX_LOCK(rxr);
2920	rsize = roundup2(adapter->num_rx_desc *
2921	    sizeof(union ixgbe_adv_rx_desc), DBA_ALIGN);
2922	bzero((void *)rxr->rx_base, rsize);
2923
2924	/* Free current RX buffer structs and their mbufs */
2925	ixv_free_receive_ring(rxr);
2926
2927	/* Configure header split? */
2928	if (ixv_header_split)
2929		rxr->hdr_split = TRUE;
2930
2931	/* Now replenish the mbufs */
2932	for (int j = 0; j != adapter->num_rx_desc; ++j) {
2933		struct mbuf	*mh, *mp;
2934
2935		rxbuf = &rxr->rx_buffers[j];
2936		/*
2937		** Dont allocate mbufs if not
2938		** doing header split, its wasteful
2939		*/
2940		if (rxr->hdr_split == FALSE)
2941			goto skip_head;
2942
2943		/* First the header */
2944		rxbuf->m_head = m_gethdr(M_NOWAIT, MT_DATA);
2945		if (rxbuf->m_head == NULL) {
2946			error = ENOBUFS;
2947			goto fail;
2948		}
2949		m_adj(rxbuf->m_head, ETHER_ALIGN);
2950		mh = rxbuf->m_head;
2951		mh->m_len = mh->m_pkthdr.len = MHLEN;
2952		mh->m_flags |= M_PKTHDR;
2953		/* Get the memory mapping */
2954		error = bus_dmamap_load_mbuf_sg(rxr->htag,
2955		    rxbuf->hmap, rxbuf->m_head, hseg,
2956		    &nsegs, BUS_DMA_NOWAIT);
2957		if (error != 0) /* Nothing elegant to do here */
2958			goto fail;
2959		bus_dmamap_sync(rxr->htag,
2960		    rxbuf->hmap, BUS_DMASYNC_PREREAD);
2961		/* Update descriptor */
2962		rxr->rx_base[j].read.hdr_addr = htole64(hseg[0].ds_addr);
2963
2964skip_head:
2965		/* Now the payload cluster */
2966		rxbuf->m_pack = m_getjcl(M_NOWAIT, MT_DATA,
2967		    M_PKTHDR, adapter->rx_mbuf_sz);
2968		if (rxbuf->m_pack == NULL) {
2969			error = ENOBUFS;
2970                        goto fail;
2971		}
2972		mp = rxbuf->m_pack;
2973		mp->m_pkthdr.len = mp->m_len = adapter->rx_mbuf_sz;
2974		/* Get the memory mapping */
2975		error = bus_dmamap_load_mbuf_sg(rxr->ptag,
2976		    rxbuf->pmap, mp, pseg,
2977		    &nsegs, BUS_DMA_NOWAIT);
2978		if (error != 0)
2979                        goto fail;
2980		bus_dmamap_sync(rxr->ptag,
2981		    rxbuf->pmap, BUS_DMASYNC_PREREAD);
2982		/* Update descriptor */
2983		rxr->rx_base[j].read.pkt_addr = htole64(pseg[0].ds_addr);
2984	}
2985
2986
2987	/* Setup our descriptor indices */
2988	rxr->next_to_check = 0;
2989	rxr->next_to_refresh = 0;
2990	rxr->lro_enabled = FALSE;
2991	rxr->rx_split_packets = 0;
2992	rxr->rx_bytes = 0;
2993	rxr->discard = FALSE;
2994
2995	bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map,
2996	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
2997
2998	/*
2999	** Now set up the LRO interface:
3000	*/
3001	if (ifp->if_capenable & IFCAP_LRO) {
3002		int err = tcp_lro_init(lro);
3003		if (err) {
3004			device_printf(dev, "LRO Initialization failed!\n");
3005			goto fail;
3006		}
3007		INIT_DEBUGOUT("RX Soft LRO Initialized\n");
3008		rxr->lro_enabled = TRUE;
3009		lro->ifp = adapter->ifp;
3010	}
3011
3012	IXV_RX_UNLOCK(rxr);
3013	return (0);
3014
3015fail:
3016	ixv_free_receive_ring(rxr);
3017	IXV_RX_UNLOCK(rxr);
3018	return (error);
3019}
3020
3021/*********************************************************************
3022 *
3023 *  Initialize all receive rings.
3024 *
3025 **********************************************************************/
3026static int
3027ixv_setup_receive_structures(struct adapter *adapter)
3028{
3029	struct rx_ring *rxr = adapter->rx_rings;
3030	int j;
3031
3032	for (j = 0; j < adapter->num_queues; j++, rxr++)
3033		if (ixv_setup_receive_ring(rxr))
3034			goto fail;
3035
3036	return (0);
3037fail:
3038	/*
3039	 * Free RX buffers allocated so far, we will only handle
3040	 * the rings that completed, the failing case will have
3041	 * cleaned up for itself. 'j' failed, so its the terminus.
3042	 */
3043	for (int i = 0; i < j; ++i) {
3044		rxr = &adapter->rx_rings[i];
3045		ixv_free_receive_ring(rxr);
3046	}
3047
3048	return (ENOBUFS);
3049}
3050
3051/*********************************************************************
3052 *
3053 *  Setup receive registers and features.
3054 *
3055 **********************************************************************/
3056#define IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT 2
3057
3058static void
3059ixv_initialize_receive_units(struct adapter *adapter)
3060{
3061	struct	rx_ring	*rxr = adapter->rx_rings;
3062	struct ixgbe_hw	*hw = &adapter->hw;
3063	struct ifnet   *ifp = adapter->ifp;
3064	u32		bufsz, fctrl, rxcsum, hlreg;
3065
3066
3067	/* Enable broadcasts */
3068	fctrl = IXGBE_READ_REG(hw, IXGBE_FCTRL);
3069	fctrl |= IXGBE_FCTRL_BAM;
3070	fctrl |= IXGBE_FCTRL_DPF;
3071	fctrl |= IXGBE_FCTRL_PMCF;
3072	IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl);
3073
3074	/* Set for Jumbo Frames? */
3075	hlreg = IXGBE_READ_REG(hw, IXGBE_HLREG0);
3076	if (ifp->if_mtu > ETHERMTU) {
3077		hlreg |= IXGBE_HLREG0_JUMBOEN;
3078		bufsz = 4096 >> IXGBE_SRRCTL_BSIZEPKT_SHIFT;
3079	} else {
3080		hlreg &= ~IXGBE_HLREG0_JUMBOEN;
3081		bufsz = 2048 >> IXGBE_SRRCTL_BSIZEPKT_SHIFT;
3082	}
3083	IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg);
3084
3085	for (int i = 0; i < adapter->num_queues; i++, rxr++) {
3086		u64 rdba = rxr->rxdma.dma_paddr;
3087		u32 reg, rxdctl;
3088
3089		/* Do the queue enabling first */
3090		rxdctl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(i));
3091		rxdctl |= IXGBE_RXDCTL_ENABLE;
3092		IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(i), rxdctl);
3093		for (int k = 0; k < 10; k++) {
3094			if (IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(i)) &
3095			    IXGBE_RXDCTL_ENABLE)
3096				break;
3097			else
3098				msec_delay(1);
3099		}
3100		wmb();
3101
3102		/* Setup the Base and Length of the Rx Descriptor Ring */
3103		IXGBE_WRITE_REG(hw, IXGBE_VFRDBAL(i),
3104		    (rdba & 0x00000000ffffffffULL));
3105		IXGBE_WRITE_REG(hw, IXGBE_VFRDBAH(i),
3106		    (rdba >> 32));
3107		IXGBE_WRITE_REG(hw, IXGBE_VFRDLEN(i),
3108		    adapter->num_rx_desc * sizeof(union ixgbe_adv_rx_desc));
3109
3110		/* Set up the SRRCTL register */
3111		reg = IXGBE_READ_REG(hw, IXGBE_VFSRRCTL(i));
3112		reg &= ~IXGBE_SRRCTL_BSIZEHDR_MASK;
3113		reg &= ~IXGBE_SRRCTL_BSIZEPKT_MASK;
3114		reg |= bufsz;
3115		if (rxr->hdr_split) {
3116			/* Use a standard mbuf for the header */
3117			reg |= ((IXV_RX_HDR <<
3118			    IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT)
3119			    & IXGBE_SRRCTL_BSIZEHDR_MASK);
3120			reg |= IXGBE_SRRCTL_DESCTYPE_HDR_SPLIT_ALWAYS;
3121		} else
3122			reg |= IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF;
3123		IXGBE_WRITE_REG(hw, IXGBE_VFSRRCTL(i), reg);
3124
3125		/* Setup the HW Rx Head and Tail Descriptor Pointers */
3126		IXGBE_WRITE_REG(hw, IXGBE_VFRDH(rxr->me), 0);
3127		IXGBE_WRITE_REG(hw, IXGBE_VFRDT(rxr->me),
3128		    adapter->num_rx_desc - 1);
3129	}
3130
3131	rxcsum = IXGBE_READ_REG(hw, IXGBE_RXCSUM);
3132
3133	if (ifp->if_capenable & IFCAP_RXCSUM)
3134		rxcsum |= IXGBE_RXCSUM_PCSD;
3135
3136	if (!(rxcsum & IXGBE_RXCSUM_PCSD))
3137		rxcsum |= IXGBE_RXCSUM_IPPCSE;
3138
3139	IXGBE_WRITE_REG(hw, IXGBE_RXCSUM, rxcsum);
3140
3141	return;
3142}
3143
3144/*********************************************************************
3145 *
3146 *  Free all receive rings.
3147 *
3148 **********************************************************************/
3149static void
3150ixv_free_receive_structures(struct adapter *adapter)
3151{
3152	struct rx_ring *rxr = adapter->rx_rings;
3153
3154	for (int i = 0; i < adapter->num_queues; i++, rxr++) {
3155		struct lro_ctrl		*lro = &rxr->lro;
3156		ixv_free_receive_buffers(rxr);
3157		/* Free LRO memory */
3158		tcp_lro_free(lro);
3159		/* Free the ring memory as well */
3160		ixv_dma_free(adapter, &rxr->rxdma);
3161	}
3162
3163	free(adapter->rx_rings, M_DEVBUF);
3164}
3165
3166
3167/*********************************************************************
3168 *
3169 *  Free receive ring data structures
3170 *
3171 **********************************************************************/
3172static void
3173ixv_free_receive_buffers(struct rx_ring *rxr)
3174{
3175	struct adapter		*adapter = rxr->adapter;
3176	struct ixv_rx_buf	*rxbuf;
3177
3178	INIT_DEBUGOUT("free_receive_structures: begin");
3179
3180	/* Cleanup any existing buffers */
3181	if (rxr->rx_buffers != NULL) {
3182		for (int i = 0; i < adapter->num_rx_desc; i++) {
3183			rxbuf = &rxr->rx_buffers[i];
3184			if (rxbuf->m_head != NULL) {
3185				bus_dmamap_sync(rxr->htag, rxbuf->hmap,
3186				    BUS_DMASYNC_POSTREAD);
3187				bus_dmamap_unload(rxr->htag, rxbuf->hmap);
3188				rxbuf->m_head->m_flags |= M_PKTHDR;
3189				m_freem(rxbuf->m_head);
3190			}
3191			if (rxbuf->m_pack != NULL) {
3192				bus_dmamap_sync(rxr->ptag, rxbuf->pmap,
3193				    BUS_DMASYNC_POSTREAD);
3194				bus_dmamap_unload(rxr->ptag, rxbuf->pmap);
3195				rxbuf->m_pack->m_flags |= M_PKTHDR;
3196				m_freem(rxbuf->m_pack);
3197			}
3198			rxbuf->m_head = NULL;
3199			rxbuf->m_pack = NULL;
3200			if (rxbuf->hmap != NULL) {
3201				bus_dmamap_destroy(rxr->htag, rxbuf->hmap);
3202				rxbuf->hmap = NULL;
3203			}
3204			if (rxbuf->pmap != NULL) {
3205				bus_dmamap_destroy(rxr->ptag, rxbuf->pmap);
3206				rxbuf->pmap = NULL;
3207			}
3208		}
3209		if (rxr->rx_buffers != NULL) {
3210			free(rxr->rx_buffers, M_DEVBUF);
3211			rxr->rx_buffers = NULL;
3212		}
3213	}
3214
3215	if (rxr->htag != NULL) {
3216		bus_dma_tag_destroy(rxr->htag);
3217		rxr->htag = NULL;
3218	}
3219	if (rxr->ptag != NULL) {
3220		bus_dma_tag_destroy(rxr->ptag);
3221		rxr->ptag = NULL;
3222	}
3223
3224	return;
3225}
3226
3227static __inline void
3228ixv_rx_input(struct rx_ring *rxr, struct ifnet *ifp, struct mbuf *m, u32 ptype)
3229{
3230
3231        /*
3232         * ATM LRO is only for IPv4/TCP packets and TCP checksum of the packet
3233         * should be computed by hardware. Also it should not have VLAN tag in
3234         * ethernet header.
3235         */
3236        if (rxr->lro_enabled &&
3237            (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0 &&
3238            (ptype & IXGBE_RXDADV_PKTTYPE_ETQF) == 0 &&
3239            (ptype & (IXGBE_RXDADV_PKTTYPE_IPV4 | IXGBE_RXDADV_PKTTYPE_TCP)) ==
3240            (IXGBE_RXDADV_PKTTYPE_IPV4 | IXGBE_RXDADV_PKTTYPE_TCP) &&
3241            (m->m_pkthdr.csum_flags & (CSUM_DATA_VALID | CSUM_PSEUDO_HDR)) ==
3242            (CSUM_DATA_VALID | CSUM_PSEUDO_HDR)) {
3243                /*
3244                 * Send to the stack if:
3245                 **  - LRO not enabled, or
3246                 **  - no LRO resources, or
3247                 **  - lro enqueue fails
3248                 */
3249                if (rxr->lro.lro_cnt != 0)
3250                        if (tcp_lro_rx(&rxr->lro, m, 0) == 0)
3251                                return;
3252        }
3253	IXV_RX_UNLOCK(rxr);
3254        (*ifp->if_input)(ifp, m);
3255	IXV_RX_LOCK(rxr);
3256}
3257
3258static __inline void
3259ixv_rx_discard(struct rx_ring *rxr, int i)
3260{
3261	struct ixv_rx_buf	*rbuf;
3262
3263	rbuf = &rxr->rx_buffers[i];
3264
3265	if (rbuf->fmp != NULL) {/* Partial chain ? */
3266		rbuf->fmp->m_flags |= M_PKTHDR;
3267		m_freem(rbuf->fmp);
3268		rbuf->fmp = NULL;
3269	}
3270
3271	/*
3272	** With advanced descriptors the writeback
3273	** clobbers the buffer addrs, so its easier
3274	** to just free the existing mbufs and take
3275	** the normal refresh path to get new buffers
3276	** and mapping.
3277	*/
3278	if (rbuf->m_head) {
3279		m_free(rbuf->m_head);
3280		rbuf->m_head = NULL;
3281	}
3282
3283	if (rbuf->m_pack) {
3284		m_free(rbuf->m_pack);
3285		rbuf->m_pack = NULL;
3286	}
3287
3288	return;
3289}
3290
3291
3292/*********************************************************************
3293 *
3294 *  This routine executes in interrupt context. It replenishes
3295 *  the mbufs in the descriptor and sends data which has been
3296 *  dma'ed into host memory to upper layer.
3297 *
3298 *  We loop at most count times if count is > 0, or until done if
3299 *  count < 0.
3300 *
3301 *  Return TRUE for more work, FALSE for all clean.
3302 *********************************************************************/
3303static bool
3304ixv_rxeof(struct ix_queue *que, int count)
3305{
3306	struct adapter		*adapter = que->adapter;
3307	struct rx_ring		*rxr = que->rxr;
3308	struct ifnet		*ifp = adapter->ifp;
3309	struct lro_ctrl		*lro = &rxr->lro;
3310	struct lro_entry	*queued;
3311	int			i, nextp, processed = 0;
3312	u32			staterr = 0;
3313	union ixgbe_adv_rx_desc	*cur;
3314	struct ixv_rx_buf	*rbuf, *nbuf;
3315
3316	IXV_RX_LOCK(rxr);
3317
3318	for (i = rxr->next_to_check; count != 0;) {
3319		struct mbuf	*sendmp, *mh, *mp;
3320		u32		rsc, ptype;
3321		u16		hlen, plen, hdr, vtag;
3322		bool		eop;
3323
3324		/* Sync the ring. */
3325		bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map,
3326		    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
3327
3328		cur = &rxr->rx_base[i];
3329		staterr = le32toh(cur->wb.upper.status_error);
3330
3331		if ((staterr & IXGBE_RXD_STAT_DD) == 0)
3332			break;
3333		if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
3334			break;
3335
3336		count--;
3337		sendmp = NULL;
3338		nbuf = NULL;
3339		rsc = 0;
3340		cur->wb.upper.status_error = 0;
3341		rbuf = &rxr->rx_buffers[i];
3342		mh = rbuf->m_head;
3343		mp = rbuf->m_pack;
3344
3345		plen = le16toh(cur->wb.upper.length);
3346		ptype = le32toh(cur->wb.lower.lo_dword.data) &
3347		    IXGBE_RXDADV_PKTTYPE_MASK;
3348		hdr = le16toh(cur->wb.lower.lo_dword.hs_rss.hdr_info);
3349		vtag = le16toh(cur->wb.upper.vlan);
3350		eop = ((staterr & IXGBE_RXD_STAT_EOP) != 0);
3351
3352		/* Make sure all parts of a bad packet are discarded */
3353		if (((staterr & IXGBE_RXDADV_ERR_FRAME_ERR_MASK) != 0) ||
3354		    (rxr->discard)) {
3355			ifp->if_ierrors++;
3356			rxr->rx_discarded++;
3357			if (!eop)
3358				rxr->discard = TRUE;
3359			else
3360				rxr->discard = FALSE;
3361			ixv_rx_discard(rxr, i);
3362			goto next_desc;
3363		}
3364
3365		if (!eop) {
3366			nextp = i + 1;
3367			if (nextp == adapter->num_rx_desc)
3368				nextp = 0;
3369			nbuf = &rxr->rx_buffers[nextp];
3370			prefetch(nbuf);
3371		}
3372		/*
3373		** The header mbuf is ONLY used when header
3374		** split is enabled, otherwise we get normal
3375		** behavior, ie, both header and payload
3376		** are DMA'd into the payload buffer.
3377		**
3378		** Rather than using the fmp/lmp global pointers
3379		** we now keep the head of a packet chain in the
3380		** buffer struct and pass this along from one
3381		** descriptor to the next, until we get EOP.
3382		*/
3383		if (rxr->hdr_split && (rbuf->fmp == NULL)) {
3384			/* This must be an initial descriptor */
3385			hlen = (hdr & IXGBE_RXDADV_HDRBUFLEN_MASK) >>
3386			    IXGBE_RXDADV_HDRBUFLEN_SHIFT;
3387			if (hlen > IXV_RX_HDR)
3388				hlen = IXV_RX_HDR;
3389			mh->m_len = hlen;
3390			mh->m_flags |= M_PKTHDR;
3391			mh->m_next = NULL;
3392			mh->m_pkthdr.len = mh->m_len;
3393			/* Null buf pointer so it is refreshed */
3394			rbuf->m_head = NULL;
3395			/*
3396			** Check the payload length, this
3397			** could be zero if its a small
3398			** packet.
3399			*/
3400			if (plen > 0) {
3401				mp->m_len = plen;
3402				mp->m_next = NULL;
3403				mp->m_flags &= ~M_PKTHDR;
3404				mh->m_next = mp;
3405				mh->m_pkthdr.len += mp->m_len;
3406				/* Null buf pointer so it is refreshed */
3407				rbuf->m_pack = NULL;
3408				rxr->rx_split_packets++;
3409			}
3410			/*
3411			** Now create the forward
3412			** chain so when complete
3413			** we wont have to.
3414			*/
3415                        if (eop == 0) {
3416				/* stash the chain head */
3417                                nbuf->fmp = mh;
3418				/* Make forward chain */
3419                                if (plen)
3420                                        mp->m_next = nbuf->m_pack;
3421                                else
3422                                        mh->m_next = nbuf->m_pack;
3423                        } else {
3424				/* Singlet, prepare to send */
3425                                sendmp = mh;
3426				if ((adapter->num_vlans) &&
3427				    (staterr & IXGBE_RXD_STAT_VP)) {
3428                                        sendmp->m_pkthdr.ether_vtag = vtag;
3429                                        sendmp->m_flags |= M_VLANTAG;
3430                                }
3431                        }
3432		} else {
3433			/*
3434			** Either no header split, or a
3435			** secondary piece of a fragmented
3436			** split packet.
3437			*/
3438			mp->m_len = plen;
3439			/*
3440			** See if there is a stored head
3441			** that determines what we are
3442			*/
3443			sendmp = rbuf->fmp;
3444			rbuf->m_pack = rbuf->fmp = NULL;
3445
3446			if (sendmp != NULL) /* secondary frag */
3447				sendmp->m_pkthdr.len += mp->m_len;
3448			else {
3449				/* first desc of a non-ps chain */
3450				sendmp = mp;
3451				sendmp->m_flags |= M_PKTHDR;
3452				sendmp->m_pkthdr.len = mp->m_len;
3453				if (staterr & IXGBE_RXD_STAT_VP) {
3454					sendmp->m_pkthdr.ether_vtag = vtag;
3455					sendmp->m_flags |= M_VLANTAG;
3456				}
3457                        }
3458			/* Pass the head pointer on */
3459			if (eop == 0) {
3460				nbuf->fmp = sendmp;
3461				sendmp = NULL;
3462				mp->m_next = nbuf->m_pack;
3463			}
3464		}
3465		++processed;
3466		/* Sending this frame? */
3467		if (eop) {
3468			sendmp->m_pkthdr.rcvif = ifp;
3469			ifp->if_ipackets++;
3470			rxr->rx_packets++;
3471			/* capture data for AIM */
3472			rxr->bytes += sendmp->m_pkthdr.len;
3473			rxr->rx_bytes += sendmp->m_pkthdr.len;
3474			if ((ifp->if_capenable & IFCAP_RXCSUM) != 0)
3475				ixv_rx_checksum(staterr, sendmp, ptype);
3476#if __FreeBSD_version >= 800000
3477			sendmp->m_pkthdr.flowid = que->msix;
3478			sendmp->m_flags |= M_FLOWID;
3479#endif
3480		}
3481next_desc:
3482		bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map,
3483		    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
3484
3485		/* Advance our pointers to the next descriptor. */
3486		if (++i == adapter->num_rx_desc)
3487			i = 0;
3488
3489		/* Now send to the stack or do LRO */
3490		if (sendmp != NULL)
3491			ixv_rx_input(rxr, ifp, sendmp, ptype);
3492
3493               /* Every 8 descriptors we go to refresh mbufs */
3494		if (processed == 8) {
3495			ixv_refresh_mbufs(rxr, i);
3496			processed = 0;
3497		}
3498	}
3499
3500	/* Refresh any remaining buf structs */
3501	if (ixv_rx_unrefreshed(rxr))
3502		ixv_refresh_mbufs(rxr, i);
3503
3504	rxr->next_to_check = i;
3505
3506	/*
3507	 * Flush any outstanding LRO work
3508	 */
3509	while ((queued = SLIST_FIRST(&lro->lro_active)) != NULL) {
3510		SLIST_REMOVE_HEAD(&lro->lro_active, next);
3511		tcp_lro_flush(lro, queued);
3512	}
3513
3514	IXV_RX_UNLOCK(rxr);
3515
3516	/*
3517	** We still have cleaning to do?
3518	** Schedule another interrupt if so.
3519	*/
3520	if ((staterr & IXGBE_RXD_STAT_DD) != 0) {
3521		ixv_rearm_queues(adapter, (u64)(1 << que->msix));
3522		return (TRUE);
3523	}
3524
3525	return (FALSE);
3526}
3527
3528
3529/*********************************************************************
3530 *
3531 *  Verify that the hardware indicated that the checksum is valid.
3532 *  Inform the stack about the status of checksum so that stack
3533 *  doesn't spend time verifying the checksum.
3534 *
3535 *********************************************************************/
3536static void
3537ixv_rx_checksum(u32 staterr, struct mbuf * mp, u32 ptype)
3538{
3539	u16	status = (u16) staterr;
3540	u8	errors = (u8) (staterr >> 24);
3541	bool	sctp = FALSE;
3542
3543	if ((ptype & IXGBE_RXDADV_PKTTYPE_ETQF) == 0 &&
3544	    (ptype & IXGBE_RXDADV_PKTTYPE_SCTP) != 0)
3545		sctp = TRUE;
3546
3547	if (status & IXGBE_RXD_STAT_IPCS) {
3548		if (!(errors & IXGBE_RXD_ERR_IPE)) {
3549			/* IP Checksum Good */
3550			mp->m_pkthdr.csum_flags = CSUM_IP_CHECKED;
3551			mp->m_pkthdr.csum_flags |= CSUM_IP_VALID;
3552
3553		} else
3554			mp->m_pkthdr.csum_flags = 0;
3555	}
3556	if (status & IXGBE_RXD_STAT_L4CS) {
3557		u16 type = (CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
3558#if __FreeBSD_version >= 800000
3559		if (sctp)
3560			type = CSUM_SCTP_VALID;
3561#endif
3562		if (!(errors & IXGBE_RXD_ERR_TCPE)) {
3563			mp->m_pkthdr.csum_flags |= type;
3564			if (!sctp)
3565				mp->m_pkthdr.csum_data = htons(0xffff);
3566		}
3567	}
3568	return;
3569}
3570
3571static void
3572ixv_setup_vlan_support(struct adapter *adapter)
3573{
3574	struct ixgbe_hw *hw = &adapter->hw;
3575	u32		ctrl, vid, vfta, retry;
3576
3577
3578	/*
3579	** We get here thru init_locked, meaning
3580	** a soft reset, this has already cleared
3581	** the VFTA and other state, so if there
3582	** have been no vlan's registered do nothing.
3583	*/
3584	if (adapter->num_vlans == 0)
3585		return;
3586
3587	/* Enable the queues */
3588	for (int i = 0; i < adapter->num_queues; i++) {
3589		ctrl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(i));
3590		ctrl |= IXGBE_RXDCTL_VME;
3591		IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(i), ctrl);
3592	}
3593
3594	/*
3595	** A soft reset zero's out the VFTA, so
3596	** we need to repopulate it now.
3597	*/
3598	for (int i = 0; i < VFTA_SIZE; i++) {
3599		if (ixv_shadow_vfta[i] == 0)
3600			continue;
3601		vfta = ixv_shadow_vfta[i];
3602		/*
3603		** Reconstruct the vlan id's
3604		** based on the bits set in each
3605		** of the array ints.
3606		*/
3607		for ( int j = 0; j < 32; j++) {
3608			retry = 0;
3609			if ((vfta & (1 << j)) == 0)
3610				continue;
3611			vid = (i * 32) + j;
3612			/* Call the shared code mailbox routine */
3613			while (ixgbe_set_vfta(hw, vid, 0, TRUE)) {
3614				if (++retry > 5)
3615					break;
3616			}
3617		}
3618	}
3619}
3620
3621/*
3622** This routine is run via an vlan config EVENT,
3623** it enables us to use the HW Filter table since
3624** we can get the vlan id. This just creates the
3625** entry in the soft version of the VFTA, init will
3626** repopulate the real table.
3627*/
3628static void
3629ixv_register_vlan(void *arg, struct ifnet *ifp, u16 vtag)
3630{
3631	struct adapter	*adapter = ifp->if_softc;
3632	u16		index, bit;
3633
3634	if (ifp->if_softc !=  arg)   /* Not our event */
3635		return;
3636
3637	if ((vtag == 0) || (vtag > 4095))	/* Invalid */
3638		return;
3639
3640	IXV_CORE_LOCK(adapter);
3641	index = (vtag >> 5) & 0x7F;
3642	bit = vtag & 0x1F;
3643	ixv_shadow_vfta[index] |= (1 << bit);
3644	++adapter->num_vlans;
3645	/* Re-init to load the changes */
3646	ixv_init_locked(adapter);
3647	IXV_CORE_UNLOCK(adapter);
3648}
3649
3650/*
3651** This routine is run via an vlan
3652** unconfig EVENT, remove our entry
3653** in the soft vfta.
3654*/
3655static void
3656ixv_unregister_vlan(void *arg, struct ifnet *ifp, u16 vtag)
3657{
3658	struct adapter	*adapter = ifp->if_softc;
3659	u16		index, bit;
3660
3661	if (ifp->if_softc !=  arg)
3662		return;
3663
3664	if ((vtag == 0) || (vtag > 4095))	/* Invalid */
3665		return;
3666
3667	IXV_CORE_LOCK(adapter);
3668	index = (vtag >> 5) & 0x7F;
3669	bit = vtag & 0x1F;
3670	ixv_shadow_vfta[index] &= ~(1 << bit);
3671	--adapter->num_vlans;
3672	/* Re-init to load the changes */
3673	ixv_init_locked(adapter);
3674	IXV_CORE_UNLOCK(adapter);
3675}
3676
3677static void
3678ixv_enable_intr(struct adapter *adapter)
3679{
3680	struct ixgbe_hw *hw = &adapter->hw;
3681	struct ix_queue *que = adapter->queues;
3682	u32 mask = (IXGBE_EIMS_ENABLE_MASK & ~IXGBE_EIMS_RTX_QUEUE);
3683
3684
3685	IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, mask);
3686
3687	mask = IXGBE_EIMS_ENABLE_MASK;
3688	mask &= ~(IXGBE_EIMS_OTHER | IXGBE_EIMS_LSC);
3689	IXGBE_WRITE_REG(hw, IXGBE_VTEIAC, mask);
3690
3691        for (int i = 0; i < adapter->num_queues; i++, que++)
3692		ixv_enable_queue(adapter, que->msix);
3693
3694	IXGBE_WRITE_FLUSH(hw);
3695
3696	return;
3697}
3698
3699static void
3700ixv_disable_intr(struct adapter *adapter)
3701{
3702	IXGBE_WRITE_REG(&adapter->hw, IXGBE_VTEIAC, 0);
3703	IXGBE_WRITE_REG(&adapter->hw, IXGBE_VTEIMC, ~0);
3704	IXGBE_WRITE_FLUSH(&adapter->hw);
3705	return;
3706}
3707
3708/*
3709** Setup the correct IVAR register for a particular MSIX interrupt
3710**  - entry is the register array entry
3711**  - vector is the MSIX vector for this queue
3712**  - type is RX/TX/MISC
3713*/
3714static void
3715ixv_set_ivar(struct adapter *adapter, u8 entry, u8 vector, s8 type)
3716{
3717	struct ixgbe_hw *hw = &adapter->hw;
3718	u32 ivar, index;
3719
3720	vector |= IXGBE_IVAR_ALLOC_VAL;
3721
3722	if (type == -1) { /* MISC IVAR */
3723		ivar = IXGBE_READ_REG(hw, IXGBE_VTIVAR_MISC);
3724		ivar &= ~0xFF;
3725		ivar |= vector;
3726		IXGBE_WRITE_REG(hw, IXGBE_VTIVAR_MISC, ivar);
3727	} else {	/* RX/TX IVARS */
3728		index = (16 * (entry & 1)) + (8 * type);
3729		ivar = IXGBE_READ_REG(hw, IXGBE_VTIVAR(entry >> 1));
3730		ivar &= ~(0xFF << index);
3731		ivar |= (vector << index);
3732		IXGBE_WRITE_REG(hw, IXGBE_VTIVAR(entry >> 1), ivar);
3733	}
3734}
3735
3736static void
3737ixv_configure_ivars(struct adapter *adapter)
3738{
3739	struct  ix_queue *que = adapter->queues;
3740
3741        for (int i = 0; i < adapter->num_queues; i++, que++) {
3742		/* First the RX queue entry */
3743                ixv_set_ivar(adapter, i, que->msix, 0);
3744		/* ... and the TX */
3745		ixv_set_ivar(adapter, i, que->msix, 1);
3746		/* Set an initial value in EITR */
3747                IXGBE_WRITE_REG(&adapter->hw,
3748                    IXGBE_VTEITR(que->msix), IXV_EITR_DEFAULT);
3749	}
3750
3751	/* For the Link interrupt */
3752        ixv_set_ivar(adapter, 1, adapter->mbxvec, -1);
3753}
3754
3755
3756/*
3757** Tasklet handler for MSIX MBX interrupts
3758**  - do outside interrupt since it might sleep
3759*/
3760static void
3761ixv_handle_mbx(void *context, int pending)
3762{
3763	struct adapter  *adapter = context;
3764
3765	ixgbe_check_link(&adapter->hw,
3766	    &adapter->link_speed, &adapter->link_up, 0);
3767	ixv_update_link_status(adapter);
3768}
3769
3770/*
3771** The VF stats registers never have a truely virgin
3772** starting point, so this routine tries to make an
3773** artificial one, marking ground zero on attach as
3774** it were.
3775*/
3776static void
3777ixv_save_stats(struct adapter *adapter)
3778{
3779	if (adapter->stats.vfgprc || adapter->stats.vfgptc) {
3780		adapter->stats.saved_reset_vfgprc +=
3781		    adapter->stats.vfgprc - adapter->stats.base_vfgprc;
3782		adapter->stats.saved_reset_vfgptc +=
3783		    adapter->stats.vfgptc - adapter->stats.base_vfgptc;
3784		adapter->stats.saved_reset_vfgorc +=
3785		    adapter->stats.vfgorc - adapter->stats.base_vfgorc;
3786		adapter->stats.saved_reset_vfgotc +=
3787		    adapter->stats.vfgotc - adapter->stats.base_vfgotc;
3788		adapter->stats.saved_reset_vfmprc +=
3789		    adapter->stats.vfmprc - adapter->stats.base_vfmprc;
3790	}
3791}
3792
3793static void
3794ixv_init_stats(struct adapter *adapter)
3795{
3796	struct ixgbe_hw *hw = &adapter->hw;
3797
3798	adapter->stats.last_vfgprc = IXGBE_READ_REG(hw, IXGBE_VFGPRC);
3799	adapter->stats.last_vfgorc = IXGBE_READ_REG(hw, IXGBE_VFGORC_LSB);
3800	adapter->stats.last_vfgorc |=
3801	    (((u64)(IXGBE_READ_REG(hw, IXGBE_VFGORC_MSB))) << 32);
3802
3803	adapter->stats.last_vfgptc = IXGBE_READ_REG(hw, IXGBE_VFGPTC);
3804	adapter->stats.last_vfgotc = IXGBE_READ_REG(hw, IXGBE_VFGOTC_LSB);
3805	adapter->stats.last_vfgotc |=
3806	    (((u64)(IXGBE_READ_REG(hw, IXGBE_VFGOTC_MSB))) << 32);
3807
3808	adapter->stats.last_vfmprc = IXGBE_READ_REG(hw, IXGBE_VFMPRC);
3809
3810	adapter->stats.base_vfgprc = adapter->stats.last_vfgprc;
3811	adapter->stats.base_vfgorc = adapter->stats.last_vfgorc;
3812	adapter->stats.base_vfgptc = adapter->stats.last_vfgptc;
3813	adapter->stats.base_vfgotc = adapter->stats.last_vfgotc;
3814	adapter->stats.base_vfmprc = adapter->stats.last_vfmprc;
3815}
3816
3817#define UPDATE_STAT_32(reg, last, count)		\
3818{							\
3819	u32 current = IXGBE_READ_REG(hw, reg);		\
3820	if (current < last)				\
3821		count += 0x100000000LL;			\
3822	last = current;					\
3823	count &= 0xFFFFFFFF00000000LL;			\
3824	count |= current;				\
3825}
3826
3827#define UPDATE_STAT_36(lsb, msb, last, count) 		\
3828{							\
3829	u64 cur_lsb = IXGBE_READ_REG(hw, lsb);		\
3830	u64 cur_msb = IXGBE_READ_REG(hw, msb);		\
3831	u64 current = ((cur_msb << 32) | cur_lsb);	\
3832	if (current < last)				\
3833		count += 0x1000000000LL;		\
3834	last = current;					\
3835	count &= 0xFFFFFFF000000000LL;			\
3836	count |= current;				\
3837}
3838
3839/*
3840** ixv_update_stats - Update the board statistics counters.
3841*/
3842void
3843ixv_update_stats(struct adapter *adapter)
3844{
3845        struct ixgbe_hw *hw = &adapter->hw;
3846
3847        UPDATE_STAT_32(IXGBE_VFGPRC, adapter->stats.last_vfgprc,
3848	    adapter->stats.vfgprc);
3849        UPDATE_STAT_32(IXGBE_VFGPTC, adapter->stats.last_vfgptc,
3850	    adapter->stats.vfgptc);
3851        UPDATE_STAT_36(IXGBE_VFGORC_LSB, IXGBE_VFGORC_MSB,
3852	    adapter->stats.last_vfgorc, adapter->stats.vfgorc);
3853        UPDATE_STAT_36(IXGBE_VFGOTC_LSB, IXGBE_VFGOTC_MSB,
3854	    adapter->stats.last_vfgotc, adapter->stats.vfgotc);
3855        UPDATE_STAT_32(IXGBE_VFMPRC, adapter->stats.last_vfmprc,
3856	    adapter->stats.vfmprc);
3857}
3858
3859/**********************************************************************
3860 *
3861 *  This routine is called only when ixgbe_display_debug_stats is enabled.
3862 *  This routine provides a way to take a look at important statistics
3863 *  maintained by the driver and hardware.
3864 *
3865 **********************************************************************/
3866static void
3867ixv_print_hw_stats(struct adapter * adapter)
3868{
3869        device_t dev = adapter->dev;
3870
3871        device_printf(dev,"Std Mbuf Failed = %lu\n",
3872               adapter->mbuf_defrag_failed);
3873        device_printf(dev,"Driver dropped packets = %lu\n",
3874               adapter->dropped_pkts);
3875        device_printf(dev, "watchdog timeouts = %ld\n",
3876               adapter->watchdog_events);
3877
3878        device_printf(dev,"Good Packets Rcvd = %llu\n",
3879               (long long)adapter->stats.vfgprc);
3880        device_printf(dev,"Good Packets Xmtd = %llu\n",
3881               (long long)adapter->stats.vfgptc);
3882        device_printf(dev,"TSO Transmissions = %lu\n",
3883               adapter->tso_tx);
3884
3885}
3886
3887/**********************************************************************
3888 *
3889 *  This routine is called only when em_display_debug_stats is enabled.
3890 *  This routine provides a way to take a look at important statistics
3891 *  maintained by the driver and hardware.
3892 *
3893 **********************************************************************/
3894static void
3895ixv_print_debug_info(struct adapter *adapter)
3896{
3897        device_t dev = adapter->dev;
3898        struct ixgbe_hw         *hw = &adapter->hw;
3899        struct ix_queue         *que = adapter->queues;
3900        struct rx_ring          *rxr;
3901        struct tx_ring          *txr;
3902        struct lro_ctrl         *lro;
3903
3904        device_printf(dev,"Error Byte Count = %u \n",
3905            IXGBE_READ_REG(hw, IXGBE_ERRBC));
3906
3907        for (int i = 0; i < adapter->num_queues; i++, que++) {
3908                txr = que->txr;
3909                rxr = que->rxr;
3910                lro = &rxr->lro;
3911                device_printf(dev,"QUE(%d) IRQs Handled: %lu\n",
3912                    que->msix, (long)que->irqs);
3913                device_printf(dev,"RX(%d) Packets Received: %lld\n",
3914                    rxr->me, (long long)rxr->rx_packets);
3915                device_printf(dev,"RX(%d) Split RX Packets: %lld\n",
3916                    rxr->me, (long long)rxr->rx_split_packets);
3917                device_printf(dev,"RX(%d) Bytes Received: %lu\n",
3918                    rxr->me, (long)rxr->rx_bytes);
3919                device_printf(dev,"RX(%d) LRO Queued= %d\n",
3920                    rxr->me, lro->lro_queued);
3921                device_printf(dev,"RX(%d) LRO Flushed= %d\n",
3922                    rxr->me, lro->lro_flushed);
3923                device_printf(dev,"TX(%d) Packets Sent: %lu\n",
3924                    txr->me, (long)txr->total_packets);
3925                device_printf(dev,"TX(%d) NO Desc Avail: %lu\n",
3926                    txr->me, (long)txr->no_desc_avail);
3927        }
3928
3929        device_printf(dev,"MBX IRQ Handled: %lu\n",
3930            (long)adapter->mbx_irq);
3931        return;
3932}
3933
3934static int
3935ixv_sysctl_stats(SYSCTL_HANDLER_ARGS)
3936{
3937	int             error;
3938	int             result;
3939	struct adapter *adapter;
3940
3941	result = -1;
3942	error = sysctl_handle_int(oidp, &result, 0, req);
3943
3944	if (error || !req->newptr)
3945		return (error);
3946
3947	if (result == 1) {
3948		adapter = (struct adapter *) arg1;
3949		ixv_print_hw_stats(adapter);
3950	}
3951	return error;
3952}
3953
3954static int
3955ixv_sysctl_debug(SYSCTL_HANDLER_ARGS)
3956{
3957	int error, result;
3958	struct adapter *adapter;
3959
3960	result = -1;
3961	error = sysctl_handle_int(oidp, &result, 0, req);
3962
3963	if (error || !req->newptr)
3964		return (error);
3965
3966	if (result == 1) {
3967		adapter = (struct adapter *) arg1;
3968		ixv_print_debug_info(adapter);
3969	}
3970	return error;
3971}
3972
3973/*
3974** Set flow control using sysctl:
3975** Flow control values:
3976** 	0 - off
3977**	1 - rx pause
3978**	2 - tx pause
3979**	3 - full
3980*/
3981static int
3982ixv_set_flowcntl(SYSCTL_HANDLER_ARGS)
3983{
3984	int error;
3985	struct adapter *adapter;
3986
3987	error = sysctl_handle_int(oidp, &ixv_flow_control, 0, req);
3988
3989	if (error)
3990		return (error);
3991
3992	adapter = (struct adapter *) arg1;
3993	switch (ixv_flow_control) {
3994		case ixgbe_fc_rx_pause:
3995		case ixgbe_fc_tx_pause:
3996		case ixgbe_fc_full:
3997			adapter->hw.fc.requested_mode = ixv_flow_control;
3998			break;
3999		case ixgbe_fc_none:
4000		default:
4001			adapter->hw.fc.requested_mode = ixgbe_fc_none;
4002	}
4003
4004	ixgbe_fc_enable(&adapter->hw);
4005	return error;
4006}
4007
4008static void
4009ixv_add_rx_process_limit(struct adapter *adapter, const char *name,
4010        const char *description, int *limit, int value)
4011{
4012        *limit = value;
4013        SYSCTL_ADD_INT(device_get_sysctl_ctx(adapter->dev),
4014            SYSCTL_CHILDREN(device_get_sysctl_tree(adapter->dev)),
4015            OID_AUTO, name, CTLTYPE_INT|CTLFLAG_RW, limit, value, description);
4016}
4017
4018