if_igc.c revision 1.21
1/*	$OpenBSD: if_igc.c,v 1.21 2024/05/04 13:35:26 mbuhl Exp $	*/
2/*-
3 * SPDX-License-Identifier: BSD-2-Clause
4 *
5 * Copyright (c) 2016 Nicole Graziano <nicole@nextbsd.org>
6 * All rights reserved.
7 * Copyright (c) 2021 Rubicon Communications, LLC (Netgate)
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 *    notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 *    notice, this list of conditions and the following disclaimer in the
16 *    documentation and/or other materials provided with the distribution.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 * SUCH DAMAGE.
29 */
30
31#include "bpfilter.h"
32#include "vlan.h"
33
34#include <sys/param.h>
35#include <sys/systm.h>
36#include <sys/sockio.h>
37#include <sys/mbuf.h>
38#include <sys/malloc.h>
39#include <sys/kernel.h>
40#include <sys/socket.h>
41#include <sys/device.h>
42#include <sys/endian.h>
43#include <sys/intrmap.h>
44
45#include <net/if.h>
46#include <net/if_media.h>
47#include <net/route.h>
48#include <net/toeplitz.h>
49
50#include <netinet/in.h>
51#include <netinet/if_ether.h>
52#include <netinet/tcp.h>
53#include <netinet/tcp_timer.h>
54#include <netinet/tcp_var.h>
55
56#if NBPFILTER > 0
57#include <net/bpf.h>
58#endif
59
60#include <machine/bus.h>
61#include <machine/intr.h>
62
63#include <dev/pci/pcivar.h>
64#include <dev/pci/pcireg.h>
65#include <dev/pci/pcidevs.h>
66#include <dev/pci/if_igc.h>
67#include <dev/pci/igc_hw.h>
68
69const struct pci_matchid igc_devices[] = {
70	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I220_V },
71	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I221_V },
72	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I225_BLANK_NVM },
73	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I225_I },
74	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I225_IT },
75	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I225_K },
76	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I225_K2 },
77	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I225_LM },
78	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I225_LMVP },
79	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I225_V },
80	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I226_BLANK_NVM },
81	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I226_IT },
82	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I226_LM },
83	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I226_K },
84	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I226_V }
85};
86
87/*********************************************************************
88 *  Function Prototypes
89 *********************************************************************/
90int	igc_match(struct device *, void *, void *);
91void	igc_attach(struct device *, struct device *, void *);
92int	igc_detach(struct device *, int);
93
94void	igc_identify_hardware(struct igc_softc *);
95int	igc_allocate_pci_resources(struct igc_softc *);
96int	igc_allocate_queues(struct igc_softc *);
97void	igc_free_pci_resources(struct igc_softc *);
98void	igc_reset(struct igc_softc *);
99void	igc_init_dmac(struct igc_softc *, uint32_t);
100int	igc_allocate_msix(struct igc_softc *);
101void	igc_setup_msix(struct igc_softc *);
102int	igc_dma_malloc(struct igc_softc *, bus_size_t, struct igc_dma_alloc *);
103void	igc_dma_free(struct igc_softc *, struct igc_dma_alloc *);
104void	igc_setup_interface(struct igc_softc *);
105
106void	igc_init(void *);
107void	igc_start(struct ifqueue *);
108int	igc_txeof(struct tx_ring *);
109void	igc_stop(struct igc_softc *);
110int	igc_ioctl(struct ifnet *, u_long, caddr_t);
111int	igc_rxrinfo(struct igc_softc *, struct if_rxrinfo *);
112int	igc_rxfill(struct rx_ring *);
113void	igc_rxrefill(void *);
114int	igc_rxeof(struct rx_ring *);
115void	igc_rx_checksum(uint32_t, struct mbuf *, uint32_t);
116void	igc_watchdog(struct ifnet *);
117void	igc_media_status(struct ifnet *, struct ifmediareq *);
118int	igc_media_change(struct ifnet *);
119void	igc_iff(struct igc_softc *);
120void	igc_update_link_status(struct igc_softc *);
121int	igc_get_buf(struct rx_ring *, int);
122int	igc_tx_ctx_setup(struct tx_ring *, struct mbuf *, int, uint32_t *,
123	    uint32_t *);
124
125void	igc_configure_queues(struct igc_softc *);
126void	igc_set_queues(struct igc_softc *, uint32_t, uint32_t, int);
127void	igc_enable_queue(struct igc_softc *, uint32_t);
128void	igc_enable_intr(struct igc_softc *);
129void	igc_disable_intr(struct igc_softc *);
130int	igc_intr_link(void *);
131int	igc_intr_queue(void *);
132
133int	igc_allocate_transmit_buffers(struct tx_ring *);
134int	igc_setup_transmit_structures(struct igc_softc *);
135int	igc_setup_transmit_ring(struct tx_ring *);
136void	igc_initialize_transmit_unit(struct igc_softc *);
137void	igc_free_transmit_structures(struct igc_softc *);
138void	igc_free_transmit_buffers(struct tx_ring *);
139int	igc_allocate_receive_buffers(struct rx_ring *);
140int	igc_setup_receive_structures(struct igc_softc *);
141int	igc_setup_receive_ring(struct rx_ring *);
142void	igc_initialize_receive_unit(struct igc_softc *);
143void	igc_free_receive_structures(struct igc_softc *);
144void	igc_free_receive_buffers(struct rx_ring *);
145void	igc_initialize_rss_mapping(struct igc_softc *);
146
147void	igc_get_hw_control(struct igc_softc *);
148void	igc_release_hw_control(struct igc_softc *);
149int	igc_is_valid_ether_addr(uint8_t *);
150
151/*********************************************************************
152 *  OpenBSD Device Interface Entry Points
153 *********************************************************************/
154
155struct cfdriver igc_cd = {
156	NULL, "igc", DV_IFNET
157};
158
159const struct cfattach igc_ca = {
160	sizeof(struct igc_softc), igc_match, igc_attach, igc_detach
161};
162
163/*********************************************************************
164 *  Device identification routine
165 *
166 *  igc_match determines if the driver should be loaded on
167 *  adapter based on PCI vendor/device id of the adapter.
168 *
169 *  return 0 on success, positive on failure
170 *********************************************************************/
171int
172igc_match(struct device *parent, void *match, void *aux)
173{
174	return pci_matchbyid((struct pci_attach_args *)aux, igc_devices,
175	    nitems(igc_devices));
176}
177
178/*********************************************************************
179 *  Device initialization routine
180 *
181 *  The attach entry point is called when the driver is being loaded.
182 *  This routine identifies the type of hardware, allocates all resources
183 *  and initializes the hardware.
184 *
185 *  return 0 on success, positive on failure
186 *********************************************************************/
187void
188igc_attach(struct device *parent, struct device *self, void *aux)
189{
190	struct pci_attach_args *pa = (struct pci_attach_args *)aux;
191	struct igc_softc *sc = (struct igc_softc *)self;
192	struct igc_hw *hw = &sc->hw;
193
194	sc->osdep.os_sc = sc;
195	sc->osdep.os_pa = *pa;
196
197	/* Determine hardware and mac info */
198	igc_identify_hardware(sc);
199
200	sc->num_tx_desc = IGC_DEFAULT_TXD;
201	sc->num_rx_desc = IGC_DEFAULT_RXD;
202
203	 /* Setup PCI resources */
204	if (igc_allocate_pci_resources(sc))
205		 goto err_pci;
206
207	/* Allocate TX/RX queues */
208	if (igc_allocate_queues(sc))
209		 goto err_pci;
210
211	/* Do shared code initialization */
212	if (igc_setup_init_funcs(hw, true)) {
213		printf(": Setup of shared code failed\n");
214		goto err_pci;
215	}
216
217	hw->mac.autoneg = DO_AUTO_NEG;
218	hw->phy.autoneg_wait_to_complete = false;
219	hw->phy.autoneg_advertised = AUTONEG_ADV_DEFAULT;
220
221	/* Copper options. */
222	if (hw->phy.media_type == igc_media_type_copper)
223		hw->phy.mdix = AUTO_ALL_MODES;
224
225	/* Set the max frame size. */
226	sc->hw.mac.max_frame_size = 9234;
227
228	/* Allocate multicast array memory. */
229	sc->mta = mallocarray(ETHER_ADDR_LEN, MAX_NUM_MULTICAST_ADDRESSES,
230	    M_DEVBUF, M_NOWAIT);
231	if (sc->mta == NULL) {
232		printf(": Can not allocate multicast setup array\n");
233		goto err_late;
234	}
235
236	/* Check SOL/IDER usage. */
237	if (igc_check_reset_block(hw))
238		printf(": PHY reset is blocked due to SOL/IDER session\n");
239
240	/* Disable Energy Efficient Ethernet. */
241	sc->hw.dev_spec._i225.eee_disable = true;
242
243	igc_reset_hw(hw);
244
245	/* Make sure we have a good EEPROM before we read from it. */
246	if (igc_validate_nvm_checksum(hw) < 0) {
247		/*
248		 * Some PCI-E parts fail the first check due to
249		 * the link being in sleep state, call it again,
250		 * if it fails a second time its a real issue.
251		 */
252		if (igc_validate_nvm_checksum(hw) < 0) {
253			printf(": The EEPROM checksum is not valid\n");
254			goto err_late;
255		}
256	}
257
258	/* Copy the permanent MAC address out of the EEPROM. */
259	if (igc_read_mac_addr(hw) < 0) {
260		printf(": EEPROM read error while reading MAC address\n");
261		goto err_late;
262	}
263
264	if (!igc_is_valid_ether_addr(hw->mac.addr)) {
265		printf(": Invalid MAC address\n");
266		goto err_late;
267	}
268
269	memcpy(sc->sc_ac.ac_enaddr, sc->hw.mac.addr, ETHER_ADDR_LEN);
270
271	if (igc_allocate_msix(sc))
272		goto err_late;
273
274	/* Setup OS specific network interface. */
275	igc_setup_interface(sc);
276
277	igc_reset(sc);
278	hw->mac.get_link_status = true;
279	igc_update_link_status(sc);
280
281	/* The driver can now take control from firmware. */
282	igc_get_hw_control(sc);
283
284	printf(", address %s\n", ether_sprintf(sc->hw.mac.addr));
285	return;
286
287err_late:
288	igc_release_hw_control(sc);
289err_pci:
290	igc_free_pci_resources(sc);
291	free(sc->mta, M_DEVBUF, ETHER_ADDR_LEN * MAX_NUM_MULTICAST_ADDRESSES);
292}
293
294/*********************************************************************
295 *  Device removal routine
296 *
297 *  The detach entry point is called when the driver is being removed.
298 *  This routine stops the adapter and deallocates all the resources
299 *  that were allocated for driver operation.
300 *
301 *  return 0 on success, positive on failure
302 *********************************************************************/
303int
304igc_detach(struct device *self, int flags)
305{
306	struct igc_softc *sc = (struct igc_softc *)self;
307	struct ifnet *ifp = &sc->sc_ac.ac_if;
308
309	igc_stop(sc);
310
311	igc_phy_hw_reset(&sc->hw);
312	igc_release_hw_control(sc);
313
314	ether_ifdetach(ifp);
315	if_detach(ifp);
316
317	igc_free_pci_resources(sc);
318
319	igc_free_transmit_structures(sc);
320	igc_free_receive_structures(sc);
321	free(sc->mta, M_DEVBUF, ETHER_ADDR_LEN * MAX_NUM_MULTICAST_ADDRESSES);
322
323	return 0;
324}
325
326void
327igc_identify_hardware(struct igc_softc *sc)
328{
329	struct igc_osdep *os = &sc->osdep;
330	struct pci_attach_args *pa = &os->os_pa;
331
332	/* Save off the information about this board. */
333	sc->hw.device_id = PCI_PRODUCT(pa->pa_id);
334
335	/* Do shared code init and setup. */
336	if (igc_set_mac_type(&sc->hw)) {
337		printf(": Setup init failure\n");
338		return;
339        }
340}
341
342int
343igc_allocate_pci_resources(struct igc_softc *sc)
344{
345	struct igc_osdep *os = &sc->osdep;
346	struct pci_attach_args *pa = &os->os_pa;
347	pcireg_t memtype;
348
349	memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, IGC_PCIREG);
350	if (pci_mapreg_map(pa, IGC_PCIREG, memtype, 0, &os->os_memt,
351	    &os->os_memh, &os->os_membase, &os->os_memsize, 0)) {
352		printf(": unable to map registers\n");
353		return ENXIO;
354	}
355	sc->hw.hw_addr = (uint8_t *)os->os_membase;
356	sc->hw.back = os;
357
358	igc_setup_msix(sc);
359
360	return 0;
361}
362
363int
364igc_allocate_queues(struct igc_softc *sc)
365{
366	struct igc_queue *iq;
367	struct tx_ring *txr;
368	struct rx_ring *rxr;
369	int i, rsize, rxconf, tsize, txconf;
370
371	/* Allocate the top level queue structs. */
372	sc->queues = mallocarray(sc->sc_nqueues, sizeof(struct igc_queue),
373	    M_DEVBUF, M_NOWAIT | M_ZERO);
374	if (sc->queues == NULL) {
375		printf("%s: unable to allocate queue\n", DEVNAME(sc));
376		goto fail;
377	}
378
379	/* Allocate the TX ring. */
380	sc->tx_rings = mallocarray(sc->sc_nqueues, sizeof(struct tx_ring),
381	    M_DEVBUF, M_NOWAIT | M_ZERO);
382	if (sc->tx_rings == NULL) {
383		printf("%s: unable to allocate TX ring\n", DEVNAME(sc));
384		goto fail;
385	}
386
387	/* Allocate the RX ring. */
388	sc->rx_rings = mallocarray(sc->sc_nqueues, sizeof(struct rx_ring),
389	    M_DEVBUF, M_NOWAIT | M_ZERO);
390	if (sc->rx_rings == NULL) {
391		printf("%s: unable to allocate RX ring\n", DEVNAME(sc));
392		goto rx_fail;
393	}
394
395	txconf = rxconf = 0;
396
397	/* Set up the TX queues. */
398	tsize = roundup2(sc->num_tx_desc * sizeof(union igc_adv_tx_desc),
399	    IGC_DBA_ALIGN);
400	for (i = 0; i < sc->sc_nqueues; i++, txconf++) {
401		txr = &sc->tx_rings[i];
402		txr->sc = sc;
403		txr->me = i;
404
405		if (igc_dma_malloc(sc, tsize, &txr->txdma)) {
406			printf("%s: unable to allocate TX descriptor\n",
407			    DEVNAME(sc));
408			goto err_tx_desc;
409		}
410		txr->tx_base = (union igc_adv_tx_desc *)txr->txdma.dma_vaddr;
411		bzero((void *)txr->tx_base, tsize);
412	}
413
414	/* Set up the RX queues. */
415	rsize = roundup2(sc->num_rx_desc * sizeof(union igc_adv_rx_desc),
416	    IGC_DBA_ALIGN);
417	for (i = 0; i < sc->sc_nqueues; i++, rxconf++) {
418		rxr = &sc->rx_rings[i];
419		rxr->sc = sc;
420		rxr->me = i;
421		timeout_set(&rxr->rx_refill, igc_rxrefill, rxr);
422
423		if (igc_dma_malloc(sc, rsize, &rxr->rxdma)) {
424			printf("%s: unable to allocate RX descriptor\n",
425			    DEVNAME(sc));
426			goto err_rx_desc;
427		}
428		rxr->rx_base = (union igc_adv_rx_desc *)rxr->rxdma.dma_vaddr;
429		bzero((void *)rxr->rx_base, rsize);
430	}
431
432	/* Set up the queue holding structs. */
433	for (i = 0; i < sc->sc_nqueues; i++) {
434		iq = &sc->queues[i];
435		iq->sc = sc;
436		iq->txr = &sc->tx_rings[i];
437		iq->rxr = &sc->rx_rings[i];
438		snprintf(iq->name, sizeof(iq->name), "%s:%d", DEVNAME(sc), i);
439	}
440
441	return 0;
442
443err_rx_desc:
444	for (rxr = sc->rx_rings; rxconf > 0; rxr++, rxconf--)
445		igc_dma_free(sc, &rxr->rxdma);
446err_tx_desc:
447	for (txr = sc->tx_rings; txconf > 0; txr++, txconf--)
448		igc_dma_free(sc, &txr->txdma);
449	free(sc->rx_rings, M_DEVBUF, sc->sc_nqueues * sizeof(struct rx_ring));
450	sc->rx_rings = NULL;
451rx_fail:
452	free(sc->tx_rings, M_DEVBUF, sc->sc_nqueues * sizeof(struct tx_ring));
453	sc->tx_rings = NULL;
454fail:
455	return ENOMEM;
456}
457
458void
459igc_free_pci_resources(struct igc_softc *sc)
460{
461	struct igc_osdep *os = &sc->osdep;
462	struct pci_attach_args *pa = &os->os_pa;
463	struct igc_queue *iq = sc->queues;
464	int i;
465
466	/* Release all msix queue resources. */
467	for (i = 0; i < sc->sc_nqueues; i++, iq++) {
468		if (iq->tag)
469			pci_intr_disestablish(pa->pa_pc, iq->tag);
470		iq->tag = NULL;
471	}
472
473	if (sc->tag)
474		pci_intr_disestablish(pa->pa_pc, sc->tag);
475	sc->tag = NULL;
476	if (os->os_membase != 0)
477		bus_space_unmap(os->os_memt, os->os_memh, os->os_memsize);
478	os->os_membase = 0;
479}
480
481/*********************************************************************
482 *
483 *  Initialize the hardware to a configuration as specified by the
484 *  adapter structure.
485 *
486 **********************************************************************/
487void
488igc_reset(struct igc_softc *sc)
489{
490	struct igc_hw *hw = &sc->hw;
491	uint32_t pba;
492	uint16_t rx_buffer_size;
493
494	/* Let the firmware know the OS is in control */
495	igc_get_hw_control(sc);
496
497	/*
498	 * Packet Buffer Allocation (PBA)
499	 * Writing PBA sets the receive portion of the buffer
500	 * the remainder is used for the transmit buffer.
501	 */
502	pba = IGC_PBA_34K;
503
504	/*
505	 * These parameters control the automatic generation (Tx) and
506	 * response (Rx) to Ethernet PAUSE frames.
507	 * - High water mark should allow for at least two frames to be
508	 *   received after sending an XOFF.
509	 * - Low water mark works best when it is very near the high water mark.
510	 *   This allows the receiver to restart by sending XON when it has
511	 *   drained a bit. Here we use an arbitrary value of 1500 which will
512	 *   restart after one full frame is pulled from the buffer. There
513	 *   could be several smaller frames in the buffer and if so they will
514	 *   not trigger the XON until their total number reduces the buffer
515	 *   by 1500.
516	 * - The pause time is fairly large at 1000 x 512ns = 512 usec.
517	 */
518	rx_buffer_size = (pba & 0xffff) << 10;
519	hw->fc.high_water = rx_buffer_size -
520	    roundup2(sc->hw.mac.max_frame_size, 1024);
521	/* 16-byte granularity */
522	hw->fc.low_water = hw->fc.high_water - 16;
523
524	if (sc->fc) /* locally set flow control value? */
525		hw->fc.requested_mode = sc->fc;
526	else
527		hw->fc.requested_mode = igc_fc_full;
528
529	hw->fc.pause_time = IGC_FC_PAUSE_TIME;
530
531	hw->fc.send_xon = true;
532
533	/* Issue a global reset */
534	igc_reset_hw(hw);
535	IGC_WRITE_REG(hw, IGC_WUC, 0);
536
537	/* and a re-init */
538	if (igc_init_hw(hw) < 0) {
539		printf(": Hardware Initialization Failed\n");
540		return;
541	}
542
543	/* Setup DMA Coalescing */
544	igc_init_dmac(sc, pba);
545
546	IGC_WRITE_REG(hw, IGC_VET, ETHERTYPE_VLAN);
547	igc_get_phy_info(hw);
548	igc_check_for_link(hw);
549}
550
551/*********************************************************************
552 *
553 *  Initialize the DMA Coalescing feature
554 *
555 **********************************************************************/
556void
557igc_init_dmac(struct igc_softc *sc, uint32_t pba)
558{
559	struct igc_hw *hw = &sc->hw;
560	uint32_t dmac, reg = ~IGC_DMACR_DMAC_EN;
561	uint16_t hwm, max_frame_size;
562	int status;
563
564	max_frame_size = sc->hw.mac.max_frame_size;
565
566	if (sc->dmac == 0) { /* Disabling it */
567		IGC_WRITE_REG(hw, IGC_DMACR, reg);
568		return;
569	} else
570		printf(": DMA Coalescing enabled\n");
571
572	/* Set starting threshold */
573	IGC_WRITE_REG(hw, IGC_DMCTXTH, 0);
574
575	hwm = 64 * pba - max_frame_size / 16;
576	if (hwm < 64 * (pba - 6))
577		hwm = 64 * (pba - 6);
578	reg = IGC_READ_REG(hw, IGC_FCRTC);
579	reg &= ~IGC_FCRTC_RTH_COAL_MASK;
580	reg |= ((hwm << IGC_FCRTC_RTH_COAL_SHIFT)
581		& IGC_FCRTC_RTH_COAL_MASK);
582	IGC_WRITE_REG(hw, IGC_FCRTC, reg);
583
584	dmac = pba - max_frame_size / 512;
585	if (dmac < pba - 10)
586		dmac = pba - 10;
587	reg = IGC_READ_REG(hw, IGC_DMACR);
588	reg &= ~IGC_DMACR_DMACTHR_MASK;
589	reg |= ((dmac << IGC_DMACR_DMACTHR_SHIFT)
590		& IGC_DMACR_DMACTHR_MASK);
591
592	/* transition to L0x or L1 if available..*/
593	reg |= (IGC_DMACR_DMAC_EN | IGC_DMACR_DMAC_LX_MASK);
594
595	/* Check if status is 2.5Gb backplane connection
596	 * before configuration of watchdog timer, which is
597	 * in msec values in 12.8usec intervals
598	 * watchdog timer= msec values in 32usec intervals
599	 * for non 2.5Gb connection
600	 */
601	status = IGC_READ_REG(hw, IGC_STATUS);
602	if ((status & IGC_STATUS_2P5_SKU) &&
603	    (!(status & IGC_STATUS_2P5_SKU_OVER)))
604		reg |= ((sc->dmac * 5) >> 6);
605	else
606		reg |= (sc->dmac >> 5);
607
608	IGC_WRITE_REG(hw, IGC_DMACR, reg);
609
610	IGC_WRITE_REG(hw, IGC_DMCRTRH, 0);
611
612	/* Set the interval before transition */
613	reg = IGC_READ_REG(hw, IGC_DMCTLX);
614	reg |= IGC_DMCTLX_DCFLUSH_DIS;
615
616	/*
617	** in 2.5Gb connection, TTLX unit is 0.4 usec
618	** which is 0x4*2 = 0xA. But delay is still 4 usec
619	*/
620	status = IGC_READ_REG(hw, IGC_STATUS);
621	if ((status & IGC_STATUS_2P5_SKU) &&
622	    (!(status & IGC_STATUS_2P5_SKU_OVER)))
623		reg |= 0xA;
624	else
625		reg |= 0x4;
626
627	IGC_WRITE_REG(hw, IGC_DMCTLX, reg);
628
629	/* free space in tx packet buffer to wake from DMA coal */
630	IGC_WRITE_REG(hw, IGC_DMCTXTH, (IGC_TXPBSIZE -
631	    (2 * max_frame_size)) >> 6);
632
633	/* make low power state decision controlled by DMA coal */
634	reg = IGC_READ_REG(hw, IGC_PCIEMISC);
635	reg &= ~IGC_PCIEMISC_LX_DECISION;
636	IGC_WRITE_REG(hw, IGC_PCIEMISC, reg);
637}
638
639int
640igc_allocate_msix(struct igc_softc *sc)
641{
642	struct igc_osdep *os = &sc->osdep;
643	struct pci_attach_args *pa = &os->os_pa;
644	struct igc_queue *iq;
645	pci_intr_handle_t ih;
646	int i, error = 0;
647
648	for (i = 0, iq = sc->queues; i < sc->sc_nqueues; i++, iq++) {
649		if (pci_intr_map_msix(pa, i, &ih)) {
650			printf("%s: unable to map msi-x vector %d\n",
651			    DEVNAME(sc), i);
652			error = ENOMEM;
653			goto fail;
654		}
655
656		iq->tag = pci_intr_establish_cpu(pa->pa_pc, ih,
657		    IPL_NET | IPL_MPSAFE, intrmap_cpu(sc->sc_intrmap, i),
658		    igc_intr_queue, iq, iq->name);
659		if (iq->tag == NULL) {
660			printf("%s: unable to establish interrupt %d\n",
661			    DEVNAME(sc), i);
662			error = ENOMEM;
663			goto fail;
664		}
665
666		iq->msix = i;
667		iq->eims = 1 << i;
668	}
669
670	/* Now the link status/control last MSI-X vector. */
671	if (pci_intr_map_msix(pa, i, &ih)) {
672		printf("%s: unable to map link vector\n", DEVNAME(sc));
673		error = ENOMEM;
674		goto fail;
675	}
676
677	sc->tag = pci_intr_establish(pa->pa_pc, ih, IPL_NET | IPL_MPSAFE,
678	    igc_intr_link, sc, sc->sc_dev.dv_xname);
679	if (sc->tag == NULL) {
680		printf("%s: unable to establish link interrupt\n", DEVNAME(sc));
681		error = ENOMEM;
682		goto fail;
683	}
684
685	sc->linkvec = i;
686	printf(", %s, %d queue%s", pci_intr_string(pa->pa_pc, ih),
687	    i, (i > 1) ? "s" : "");
688
689	return 0;
690fail:
691	for (iq = sc->queues; i > 0; i--, iq++) {
692		if (iq->tag == NULL)
693			continue;
694		pci_intr_disestablish(pa->pa_pc, iq->tag);
695		iq->tag = NULL;
696	}
697
698	return error;
699}
700
701void
702igc_setup_msix(struct igc_softc *sc)
703{
704	struct igc_osdep *os = &sc->osdep;
705	struct pci_attach_args *pa = &os->os_pa;
706	int nmsix;
707
708	nmsix = pci_intr_msix_count(pa);
709	if (nmsix <= 1)
710		printf(": not enough msi-x vectors\n");
711
712	/* Give one vector to events. */
713	nmsix--;
714
715	sc->sc_intrmap = intrmap_create(&sc->sc_dev, nmsix, IGC_MAX_VECTORS,
716	    INTRMAP_POWEROF2);
717	sc->sc_nqueues = intrmap_count(sc->sc_intrmap);
718}
719
720int
721igc_dma_malloc(struct igc_softc *sc, bus_size_t size, struct igc_dma_alloc *dma)
722{
723	struct igc_osdep *os = &sc->osdep;
724
725	dma->dma_tag = os->os_pa.pa_dmat;
726
727	if (bus_dmamap_create(dma->dma_tag, size, 1, size, 0, BUS_DMA_NOWAIT,
728	    &dma->dma_map))
729		return 1;
730	if (bus_dmamem_alloc(dma->dma_tag, size, PAGE_SIZE, 0, &dma->dma_seg,
731	    1, &dma->dma_nseg, BUS_DMA_NOWAIT))
732		goto destroy;
733	if (bus_dmamem_map(dma->dma_tag, &dma->dma_seg, dma->dma_nseg, size,
734	    &dma->dma_vaddr, BUS_DMA_NOWAIT | BUS_DMA_COHERENT))
735		goto free;
736	if (bus_dmamap_load(dma->dma_tag, dma->dma_map, dma->dma_vaddr, size,
737	    NULL, BUS_DMA_NOWAIT))
738		goto unmap;
739
740	dma->dma_size = size;
741
742	return 0;
743unmap:
744	bus_dmamem_unmap(dma->dma_tag, dma->dma_vaddr, size);
745free:
746	bus_dmamem_free(dma->dma_tag, &dma->dma_seg, dma->dma_nseg);
747destroy:
748	bus_dmamap_destroy(dma->dma_tag, dma->dma_map);
749	dma->dma_map = NULL;
750	dma->dma_tag = NULL;
751	return 1;
752}
753
754void
755igc_dma_free(struct igc_softc *sc, struct igc_dma_alloc *dma)
756{
757	if (dma->dma_tag == NULL)
758		return;
759
760	if (dma->dma_map != NULL) {
761		bus_dmamap_sync(dma->dma_tag, dma->dma_map, 0,
762		    dma->dma_map->dm_mapsize,
763		    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
764		bus_dmamap_unload(dma->dma_tag, dma->dma_map);
765		bus_dmamem_unmap(dma->dma_tag, dma->dma_vaddr, dma->dma_size);
766		bus_dmamem_free(dma->dma_tag, &dma->dma_seg, dma->dma_nseg);
767		bus_dmamap_destroy(dma->dma_tag, dma->dma_map);
768		dma->dma_map = NULL;
769	}
770}
771
772/*********************************************************************
773 *
774 *  Setup networking device structure and register an interface.
775 *
776 **********************************************************************/
777void
778igc_setup_interface(struct igc_softc *sc)
779{
780	struct ifnet *ifp = &sc->sc_ac.ac_if;
781	int i;
782
783	ifp->if_softc = sc;
784	strlcpy(ifp->if_xname, DEVNAME(sc), IFNAMSIZ);
785	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
786	ifp->if_xflags = IFXF_MPSAFE;
787	ifp->if_ioctl = igc_ioctl;
788	ifp->if_qstart = igc_start;
789	ifp->if_watchdog = igc_watchdog;
790	ifp->if_hardmtu = sc->hw.mac.max_frame_size - ETHER_HDR_LEN -
791	    ETHER_CRC_LEN;
792	ifq_init_maxlen(&ifp->if_snd, sc->num_tx_desc - 1);
793
794	ifp->if_capabilities = IFCAP_VLAN_MTU;
795
796#if NVLAN > 0
797	ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING;
798#endif
799
800	ifp->if_capabilities |= IFCAP_CSUM_IPv4;
801	ifp->if_capabilities |= IFCAP_CSUM_TCPv4 | IFCAP_CSUM_UDPv4;
802	ifp->if_capabilities |= IFCAP_CSUM_TCPv6 | IFCAP_CSUM_UDPv6;
803	ifp->if_capabilities |= IFCAP_TSOv4 | IFCAP_TSOv6;
804
805	/* Initialize ifmedia structures. */
806	ifmedia_init(&sc->media, IFM_IMASK, igc_media_change, igc_media_status);
807	ifmedia_add(&sc->media, IFM_ETHER | IFM_10_T, 0, NULL);
808	ifmedia_add(&sc->media, IFM_ETHER | IFM_10_T | IFM_FDX, 0, NULL);
809	ifmedia_add(&sc->media, IFM_ETHER | IFM_100_TX, 0, NULL);
810	ifmedia_add(&sc->media, IFM_ETHER | IFM_100_TX | IFM_FDX, 0, NULL);
811	ifmedia_add(&sc->media, IFM_ETHER | IFM_1000_T | IFM_FDX, 0, NULL);
812	ifmedia_add(&sc->media, IFM_ETHER | IFM_1000_T, 0, NULL);
813	ifmedia_add(&sc->media, IFM_ETHER | IFM_2500_T, 0, NULL);
814
815	ifmedia_add(&sc->media, IFM_ETHER | IFM_AUTO, 0, NULL);
816	ifmedia_set(&sc->media, IFM_ETHER | IFM_AUTO);
817
818	if_attach(ifp);
819	ether_ifattach(ifp);
820
821	if_attach_queues(ifp, sc->sc_nqueues);
822	if_attach_iqueues(ifp, sc->sc_nqueues);
823	for (i = 0; i < sc->sc_nqueues; i++) {
824		struct ifqueue *ifq = ifp->if_ifqs[i];
825		struct ifiqueue *ifiq = ifp->if_iqs[i];
826		struct tx_ring *txr = &sc->tx_rings[i];
827		struct rx_ring *rxr = &sc->rx_rings[i];
828
829		ifq->ifq_softc = txr;
830		txr->ifq = ifq;
831
832		ifiq->ifiq_softc = rxr;
833		rxr->ifiq = ifiq;
834	}
835}
836
837void
838igc_init(void *arg)
839{
840	struct igc_softc *sc = (struct igc_softc *)arg;
841	struct ifnet *ifp = &sc->sc_ac.ac_if;
842	struct rx_ring *rxr;
843	uint32_t ctrl = 0;
844	int i, s;
845
846	s = splnet();
847
848	igc_stop(sc);
849
850	/* Get the latest mac address, user can use a LAA. */
851	bcopy(sc->sc_ac.ac_enaddr, sc->hw.mac.addr, ETHER_ADDR_LEN);
852
853	/* Put the address into the receive address array. */
854	igc_rar_set(&sc->hw, sc->hw.mac.addr, 0);
855
856	/* Initialize the hardware. */
857	igc_reset(sc);
858	igc_update_link_status(sc);
859
860	/* Setup VLAN support, basic and offload if available. */
861	IGC_WRITE_REG(&sc->hw, IGC_VET, ETHERTYPE_VLAN);
862
863	/* Prepare transmit descriptors and buffers. */
864	if (igc_setup_transmit_structures(sc)) {
865		printf("%s: Could not setup transmit structures\n",
866		    DEVNAME(sc));
867		igc_stop(sc);
868		splx(s);
869		return;
870	}
871	igc_initialize_transmit_unit(sc);
872
873	sc->rx_mbuf_sz = MCLBYTES + ETHER_ALIGN;
874	/* Prepare receive descriptors and buffers. */
875	if (igc_setup_receive_structures(sc)) {
876		printf("%s: Could not setup receive structures\n",
877		    DEVNAME(sc));
878		igc_stop(sc);
879		splx(s);
880		return;
881        }
882	igc_initialize_receive_unit(sc);
883
884	if (ifp->if_capabilities & IFCAP_VLAN_HWTAGGING) {
885		ctrl = IGC_READ_REG(&sc->hw, IGC_CTRL);
886		ctrl |= IGC_CTRL_VME;
887		IGC_WRITE_REG(&sc->hw, IGC_CTRL, ctrl);
888	}
889
890	/* Setup multicast table. */
891	igc_iff(sc);
892
893	igc_clear_hw_cntrs_base_generic(&sc->hw);
894
895	igc_configure_queues(sc);
896
897	/* This clears any pending interrupts */
898	IGC_READ_REG(&sc->hw, IGC_ICR);
899	IGC_WRITE_REG(&sc->hw, IGC_ICS, IGC_ICS_LSC);
900
901	/* The driver can now take control from firmware. */
902	igc_get_hw_control(sc);
903
904	/* Set Energy Efficient Ethernet. */
905	igc_set_eee_i225(&sc->hw, true, true, true);
906
907	for (i = 0; i < sc->sc_nqueues; i++) {
908		rxr = &sc->rx_rings[i];
909		igc_rxfill(rxr);
910		if (if_rxr_inuse(&rxr->rx_ring) == 0) {
911			printf("%s: Unable to fill any rx descriptors\n",
912			    DEVNAME(sc));
913			igc_stop(sc);
914			splx(s);
915		}
916		IGC_WRITE_REG(&sc->hw, IGC_RDT(i),
917		    (rxr->last_desc_filled + 1) % sc->num_rx_desc);
918	}
919
920	igc_enable_intr(sc);
921
922	ifp->if_flags |= IFF_RUNNING;
923	for (i = 0; i < sc->sc_nqueues; i++)
924		ifq_clr_oactive(ifp->if_ifqs[i]);
925
926	splx(s);
927}
928
929static inline int
930igc_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map, struct mbuf *m)
931{
932	int error;
933
934	error = bus_dmamap_load_mbuf(dmat, map, m,
935	    BUS_DMA_STREAMING | BUS_DMA_NOWAIT);
936	if (error != EFBIG)
937		return (error);
938
939	error = m_defrag(m, M_DONTWAIT);
940	if (error != 0)
941		return (error);
942
943	return (bus_dmamap_load_mbuf(dmat, map, m,
944	    BUS_DMA_STREAMING | BUS_DMA_NOWAIT));
945}
946
947void
948igc_start(struct ifqueue *ifq)
949{
950	struct ifnet *ifp = ifq->ifq_if;
951	struct igc_softc *sc = ifp->if_softc;
952	struct tx_ring *txr = ifq->ifq_softc;
953	union igc_adv_tx_desc *txdesc;
954	struct igc_tx_buf *txbuf;
955	bus_dmamap_t map;
956	struct mbuf *m;
957	unsigned int prod, free, last, i;
958	unsigned int mask;
959	uint32_t cmd_type_len;
960	uint32_t olinfo_status;
961	int post = 0;
962#if NBPFILTER > 0
963	caddr_t if_bpf;
964#endif
965
966	if (!sc->link_active) {
967		ifq_purge(ifq);
968		return;
969	}
970
971	prod = txr->next_avail_desc;
972	free = txr->next_to_clean;
973	if (free <= prod)
974		free += sc->num_tx_desc;
975	free -= prod;
976
977	bus_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map, 0,
978	    txr->txdma.dma_map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
979
980	mask = sc->num_tx_desc - 1;
981
982	for (;;) {
983		if (free <= IGC_MAX_SCATTER + 1) {
984			ifq_set_oactive(ifq);
985			break;
986		}
987
988		m = ifq_dequeue(ifq);
989		if (m == NULL)
990			break;
991
992		txbuf = &txr->tx_buffers[prod];
993		map = txbuf->map;
994
995		if (igc_load_mbuf(txr->txdma.dma_tag, map, m) != 0) {
996			ifq->ifq_errors++;
997			m_freem(m);
998			continue;
999		}
1000
1001		olinfo_status = m->m_pkthdr.len << IGC_ADVTXD_PAYLEN_SHIFT;
1002
1003		bus_dmamap_sync(txr->txdma.dma_tag, map, 0,
1004		    map->dm_mapsize, BUS_DMASYNC_PREWRITE);
1005
1006		cmd_type_len = IGC_ADVTXD_DCMD_IFCS | IGC_ADVTXD_DTYP_DATA |
1007		    IGC_ADVTXD_DCMD_DEXT;
1008
1009		if (igc_tx_ctx_setup(txr, m, prod, &cmd_type_len,
1010		    &olinfo_status)) {
1011			/* Consume the first descriptor */
1012			prod++;
1013			prod &= mask;
1014			free--;
1015		}
1016
1017		for (i = 0; i < map->dm_nsegs; i++) {
1018			txdesc = &txr->tx_base[prod];
1019
1020			CLR(cmd_type_len, IGC_ADVTXD_DTALEN_MASK);
1021			cmd_type_len |= map->dm_segs[i].ds_len;
1022			if (i == map->dm_nsegs - 1)
1023				cmd_type_len |= IGC_ADVTXD_DCMD_EOP |
1024				    IGC_ADVTXD_DCMD_RS;
1025
1026			htolem64(&txdesc->read.buffer_addr,
1027			    map->dm_segs[i].ds_addr);
1028			htolem32(&txdesc->read.cmd_type_len, cmd_type_len);
1029			htolem32(&txdesc->read.olinfo_status, olinfo_status);
1030
1031			last = prod;
1032
1033			prod++;
1034			prod &= mask;
1035		}
1036
1037		txbuf->m_head = m;
1038		txbuf->eop_index = last;
1039
1040#if NBPFILTER > 0
1041		if_bpf = ifp->if_bpf;
1042		if (if_bpf)
1043			bpf_mtap_ether(if_bpf, m, BPF_DIRECTION_OUT);
1044#endif
1045
1046		free -= i;
1047		post = 1;
1048	}
1049
1050	bus_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map, 0,
1051	    txr->txdma.dma_map->dm_mapsize, BUS_DMASYNC_PREWRITE);
1052
1053	if (post) {
1054		txr->next_avail_desc = prod;
1055		IGC_WRITE_REG(&sc->hw, IGC_TDT(txr->me), prod);
1056	}
1057}
1058
1059int
1060igc_txeof(struct tx_ring *txr)
1061{
1062	struct igc_softc *sc = txr->sc;
1063	struct ifqueue *ifq = txr->ifq;
1064	union igc_adv_tx_desc *txdesc;
1065	struct igc_tx_buf *txbuf;
1066	bus_dmamap_t map;
1067	unsigned int cons, prod, last;
1068	unsigned int mask;
1069	int done = 0;
1070
1071	prod = txr->next_avail_desc;
1072	cons = txr->next_to_clean;
1073
1074	if (cons == prod)
1075		return (0);
1076
1077	bus_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map, 0,
1078	    txr->txdma.dma_map->dm_mapsize, BUS_DMASYNC_POSTREAD);
1079
1080	mask = sc->num_tx_desc - 1;
1081
1082	do {
1083		txbuf = &txr->tx_buffers[cons];
1084		last = txbuf->eop_index;
1085		txdesc = &txr->tx_base[last];
1086
1087		if (!(txdesc->wb.status & htole32(IGC_TXD_STAT_DD)))
1088			break;
1089
1090		map = txbuf->map;
1091
1092		bus_dmamap_sync(txr->txdma.dma_tag, map, 0, map->dm_mapsize,
1093		    BUS_DMASYNC_POSTWRITE);
1094		bus_dmamap_unload(txr->txdma.dma_tag, map);
1095		m_freem(txbuf->m_head);
1096
1097		txbuf->m_head = NULL;
1098		txbuf->eop_index = -1;
1099
1100		cons = last + 1;
1101		cons &= mask;
1102
1103		done = 1;
1104	} while (cons != prod);
1105
1106	bus_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map, 0,
1107	    txr->txdma.dma_map->dm_mapsize, BUS_DMASYNC_PREREAD);
1108
1109	txr->next_to_clean = cons;
1110
1111	if (ifq_is_oactive(ifq))
1112		ifq_restart(ifq);
1113
1114	return (done);
1115}
1116
1117/*********************************************************************
1118 *
1119 *  This routine disables all traffic on the adapter by issuing a
1120 *  global reset on the MAC.
1121 *
1122 **********************************************************************/
1123void
1124igc_stop(struct igc_softc *sc)
1125{
1126	struct ifnet *ifp = &sc->sc_ac.ac_if;
1127	int i;
1128
1129	/* Tell the stack that the interface is no longer active. */
1130        ifp->if_flags &= ~IFF_RUNNING;
1131
1132	igc_disable_intr(sc);
1133
1134	igc_reset_hw(&sc->hw);
1135	IGC_WRITE_REG(&sc->hw, IGC_WUC, 0);
1136
1137	intr_barrier(sc->tag);
1138        for (i = 0; i < sc->sc_nqueues; i++) {
1139                struct ifqueue *ifq = ifp->if_ifqs[i];
1140                ifq_barrier(ifq);
1141                ifq_clr_oactive(ifq);
1142
1143                if (sc->queues[i].tag != NULL)
1144                        intr_barrier(sc->queues[i].tag);
1145                timeout_del(&sc->rx_rings[i].rx_refill);
1146        }
1147
1148        igc_free_transmit_structures(sc);
1149        igc_free_receive_structures(sc);
1150
1151	igc_update_link_status(sc);
1152}
1153
1154/*********************************************************************
1155 *  Ioctl entry point
1156 *
1157 *  igc_ioctl is called when the user wants to configure the
1158 *  interface.
1159 *
1160 *  return 0 on success, positive on failure
1161 **********************************************************************/
1162int
1163igc_ioctl(struct ifnet * ifp, u_long cmd, caddr_t data)
1164{
1165	struct igc_softc *sc = ifp->if_softc;
1166	struct ifreq *ifr = (struct ifreq *)data;
1167	int s, error = 0;
1168
1169	s = splnet();
1170
1171	switch (cmd) {
1172	case SIOCSIFADDR:
1173		ifp->if_flags |= IFF_UP;
1174		if (!(ifp->if_flags & IFF_RUNNING))
1175			igc_init(sc);
1176		break;
1177	case SIOCSIFFLAGS:
1178		if (ifp->if_flags & IFF_UP) {
1179			if (ifp->if_flags & IFF_RUNNING)
1180				error = ENETRESET;
1181			else
1182				igc_init(sc);
1183		} else {
1184			if (ifp->if_flags & IFF_RUNNING)
1185				igc_stop(sc);
1186		}
1187		break;
1188	case SIOCSIFMEDIA:
1189	case SIOCGIFMEDIA:
1190		error = ifmedia_ioctl(ifp, ifr, &sc->media, cmd);
1191		break;
1192	case SIOCGIFRXR:
1193		error = igc_rxrinfo(sc, (struct if_rxrinfo *)ifr->ifr_data);
1194		break;
1195	default:
1196		error = ether_ioctl(ifp, &sc->sc_ac, cmd, data);
1197	}
1198
1199	if (error == ENETRESET) {
1200		if (ifp->if_flags & IFF_RUNNING) {
1201			igc_disable_intr(sc);
1202			igc_iff(sc);
1203			igc_enable_intr(sc);
1204		}
1205		error = 0;
1206	}
1207
1208	splx(s);
1209	return error;
1210}
1211
1212int
1213igc_rxrinfo(struct igc_softc *sc, struct if_rxrinfo *ifri)
1214{
1215	struct if_rxring_info *ifr;
1216	struct rx_ring *rxr;
1217	int error, i, n = 0;
1218
1219	ifr = mallocarray(sc->sc_nqueues, sizeof(*ifr), M_DEVBUF,
1220	    M_WAITOK | M_ZERO);
1221
1222	for (i = 0; i < sc->sc_nqueues; i++) {
1223		rxr = &sc->rx_rings[i];
1224		ifr[n].ifr_size = MCLBYTES;
1225		snprintf(ifr[n].ifr_name, sizeof(ifr[n].ifr_name), "%d", i);
1226		ifr[n].ifr_info = rxr->rx_ring;
1227		n++;
1228	}
1229
1230	error = if_rxr_info_ioctl(ifri, sc->sc_nqueues, ifr);
1231	free(ifr, M_DEVBUF, sc->sc_nqueues * sizeof(*ifr));
1232
1233	return error;
1234}
1235
1236int
1237igc_rxfill(struct rx_ring *rxr)
1238{
1239	struct igc_softc *sc = rxr->sc;
1240	int i, post = 0;
1241	u_int slots;
1242
1243	bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map, 0,
1244	    rxr->rxdma.dma_map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
1245
1246	i = rxr->last_desc_filled;
1247	for (slots = if_rxr_get(&rxr->rx_ring, sc->num_rx_desc); slots > 0;
1248	    slots--) {
1249		if (++i == sc->num_rx_desc)
1250			i = 0;
1251
1252		if (igc_get_buf(rxr, i) != 0)
1253			break;
1254
1255		rxr->last_desc_filled = i;
1256		post = 1;
1257	}
1258
1259	bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map, 0,
1260	    rxr->rxdma.dma_map->dm_mapsize, BUS_DMASYNC_PREWRITE);
1261
1262	if_rxr_put(&rxr->rx_ring, slots);
1263
1264	return post;
1265}
1266
1267void
1268igc_rxrefill(void *xrxr)
1269{
1270	struct rx_ring *rxr = xrxr;
1271	struct igc_softc *sc = rxr->sc;
1272
1273	if (igc_rxfill(rxr)) {
1274		IGC_WRITE_REG(&sc->hw, IGC_RDT(rxr->me),
1275		    (rxr->last_desc_filled + 1) % sc->num_rx_desc);
1276	}
1277	else if (if_rxr_inuse(&rxr->rx_ring) == 0)
1278		timeout_add(&rxr->rx_refill, 1);
1279}
1280
1281/*********************************************************************
1282 *
1283 *  This routine executes in interrupt context. It replenishes
1284 *  the mbufs in the descriptor and sends data which has been
1285 *  dma'ed into host memory to upper layer.
1286 *
1287 *********************************************************************/
1288int
1289igc_rxeof(struct rx_ring *rxr)
1290{
1291	struct igc_softc *sc = rxr->sc;
1292	struct ifnet *ifp = &sc->sc_ac.ac_if;
1293	struct mbuf_list ml = MBUF_LIST_INITIALIZER();
1294	struct mbuf *mp, *m;
1295	struct igc_rx_buf *rxbuf, *nxbuf;
1296	union igc_adv_rx_desc *rxdesc;
1297	uint32_t ptype, staterr = 0;
1298	uint16_t len, vtag;
1299	uint8_t eop = 0;
1300	int i, nextp;
1301
1302	if (!ISSET(ifp->if_flags, IFF_RUNNING))
1303		return 0;
1304
1305	i = rxr->next_to_check;
1306	while (if_rxr_inuse(&rxr->rx_ring) > 0) {
1307		uint32_t hash;
1308		uint16_t hashtype;
1309
1310		bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map,
1311		    i * sizeof(union igc_adv_rx_desc),
1312		    sizeof(union igc_adv_rx_desc), BUS_DMASYNC_POSTREAD);
1313
1314		rxdesc = &rxr->rx_base[i];
1315		staterr = letoh32(rxdesc->wb.upper.status_error);
1316		if (!ISSET(staterr, IGC_RXD_STAT_DD)) {
1317			bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map,
1318			    i * sizeof(union igc_adv_rx_desc),
1319			    sizeof(union igc_adv_rx_desc), BUS_DMASYNC_PREREAD);
1320			break;
1321		}
1322
1323		/* Zero out the receive descriptors status. */
1324		rxdesc->wb.upper.status_error = 0;
1325		rxbuf = &rxr->rx_buffers[i];
1326
1327		/* Pull the mbuf off the ring. */
1328		bus_dmamap_sync(rxr->rxdma.dma_tag, rxbuf->map, 0,
1329		    rxbuf->map->dm_mapsize, BUS_DMASYNC_POSTREAD);
1330		bus_dmamap_unload(rxr->rxdma.dma_tag, rxbuf->map);
1331
1332		mp = rxbuf->buf;
1333		len = letoh16(rxdesc->wb.upper.length);
1334		vtag = letoh16(rxdesc->wb.upper.vlan);
1335		eop = ((staterr & IGC_RXD_STAT_EOP) == IGC_RXD_STAT_EOP);
1336		ptype = letoh32(rxdesc->wb.lower.lo_dword.data) &
1337		    IGC_PKTTYPE_MASK;
1338		hash = letoh32(rxdesc->wb.lower.hi_dword.rss);
1339		hashtype = le16toh(rxdesc->wb.lower.lo_dword.hs_rss.pkt_info) &
1340		    IGC_RXDADV_RSSTYPE_MASK;
1341
1342		if (staterr & IGC_RXDEXT_STATERR_RXE) {
1343			if (rxbuf->fmp) {
1344				m_freem(rxbuf->fmp);
1345				rxbuf->fmp = NULL;
1346			}
1347
1348			m_freem(mp);
1349			rxbuf->buf = NULL;
1350			goto next_desc;
1351		}
1352
1353		if (mp == NULL) {
1354			panic("%s: igc_rxeof: NULL mbuf in slot %d "
1355			    "(nrx %d, filled %d)", DEVNAME(sc), i,
1356			    if_rxr_inuse(&rxr->rx_ring), rxr->last_desc_filled);
1357		}
1358
1359		if (!eop) {
1360			/*
1361			 * Figure out the next descriptor of this frame.
1362			 */
1363			nextp = i + 1;
1364			if (nextp == sc->num_rx_desc)
1365				nextp = 0;
1366			nxbuf = &rxr->rx_buffers[nextp];
1367			/* prefetch(nxbuf); */
1368		}
1369
1370		mp->m_len = len;
1371
1372		m = rxbuf->fmp;
1373		rxbuf->buf = rxbuf->fmp = NULL;
1374
1375		if (m != NULL)
1376			m->m_pkthdr.len += mp->m_len;
1377		else {
1378			m = mp;
1379			m->m_pkthdr.len = mp->m_len;
1380#if NVLAN > 0
1381			if (staterr & IGC_RXD_STAT_VP) {
1382				m->m_pkthdr.ether_vtag = vtag;
1383				m->m_flags |= M_VLANTAG;
1384			}
1385#endif
1386		}
1387
1388		/* Pass the head pointer on */
1389		if (eop == 0) {
1390			nxbuf->fmp = m;
1391			m = NULL;
1392			mp->m_next = nxbuf->buf;
1393		} else {
1394			igc_rx_checksum(staterr, m, ptype);
1395
1396			if (hashtype != IGC_RXDADV_RSSTYPE_NONE) {
1397				m->m_pkthdr.ph_flowid = hash;
1398				SET(m->m_pkthdr.csum_flags, M_FLOWID);
1399			}
1400
1401			ml_enqueue(&ml, m);
1402		}
1403next_desc:
1404		if_rxr_put(&rxr->rx_ring, 1);
1405		bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map,
1406		    i * sizeof(union igc_adv_rx_desc),
1407		    sizeof(union igc_adv_rx_desc), BUS_DMASYNC_PREREAD);
1408
1409		/* Advance our pointers to the next descriptor. */
1410		if (++i == sc->num_rx_desc)
1411			i = 0;
1412	}
1413	rxr->next_to_check = i;
1414
1415	if (ifiq_input(rxr->ifiq, &ml))
1416		if_rxr_livelocked(&rxr->rx_ring);
1417
1418	if (!(staterr & IGC_RXD_STAT_DD))
1419		return 0;
1420
1421	return 1;
1422}
1423
1424/*********************************************************************
1425 *
1426 *  Verify that the hardware indicated that the checksum is valid.
1427 *  Inform the stack about the status of checksum so that stack
1428 *  doesn't spend time verifying the checksum.
1429 *
1430 *********************************************************************/
1431void
1432igc_rx_checksum(uint32_t staterr, struct mbuf *m, uint32_t ptype)
1433{
1434	uint16_t status = (uint16_t)staterr;
1435	uint8_t errors = (uint8_t)(staterr >> 24);
1436
1437	if (status & IGC_RXD_STAT_IPCS) {
1438		if (!(errors & IGC_RXD_ERR_IPE)) {
1439			/* IP Checksum Good */
1440			m->m_pkthdr.csum_flags = M_IPV4_CSUM_IN_OK;
1441		} else
1442			m->m_pkthdr.csum_flags = 0;
1443	}
1444
1445	if (status & (IGC_RXD_STAT_TCPCS | IGC_RXD_STAT_UDPCS)) {
1446		if (!(errors & IGC_RXD_ERR_TCPE))
1447			m->m_pkthdr.csum_flags |=
1448			    M_TCP_CSUM_IN_OK | M_UDP_CSUM_IN_OK;
1449	}
1450}
1451
1452void
1453igc_watchdog(struct ifnet * ifp)
1454{
1455}
1456
1457/*********************************************************************
1458 *
1459 *  Media Ioctl callback
1460 *
1461 *  This routine is called whenever the user queries the status of
1462 *  the interface using ifconfig.
1463 *
1464 **********************************************************************/
1465void
1466igc_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
1467{
1468	struct igc_softc *sc = ifp->if_softc;
1469
1470	igc_update_link_status(sc);
1471
1472	ifmr->ifm_status = IFM_AVALID;
1473	ifmr->ifm_active = IFM_ETHER;
1474
1475	if (!sc->link_active) {
1476		ifmr->ifm_active |= IFM_NONE;
1477		return;
1478	}
1479
1480	ifmr->ifm_status |= IFM_ACTIVE;
1481
1482	switch (sc->link_speed) {
1483	case 10:
1484		ifmr->ifm_active |= IFM_10_T;
1485		break;
1486	case 100:
1487		ifmr->ifm_active |= IFM_100_TX;
1488                break;
1489	case 1000:
1490		ifmr->ifm_active |= IFM_1000_T;
1491		break;
1492	case 2500:
1493                ifmr->ifm_active |= IFM_2500_T;
1494                break;
1495	}
1496
1497	if (sc->link_duplex == FULL_DUPLEX)
1498		ifmr->ifm_active |= IFM_FDX;
1499	else
1500		ifmr->ifm_active |= IFM_HDX;
1501
1502	switch (sc->hw.fc.current_mode) {
1503	case igc_fc_tx_pause:
1504		ifmr->ifm_active |= IFM_FLOW | IFM_ETH_TXPAUSE;
1505		break;
1506	case igc_fc_rx_pause:
1507		ifmr->ifm_active |= IFM_FLOW | IFM_ETH_RXPAUSE;
1508		break;
1509	case igc_fc_full:
1510		ifmr->ifm_active |= IFM_FLOW | IFM_ETH_RXPAUSE |
1511		    IFM_ETH_TXPAUSE;
1512		break;
1513	default:
1514		ifmr->ifm_active &= ~(IFM_FLOW | IFM_ETH_RXPAUSE |
1515		    IFM_ETH_TXPAUSE);
1516		break;
1517	}
1518}
1519
1520/*********************************************************************
1521 *
1522 *  Media Ioctl callback
1523 *
1524 *  This routine is called when the user changes speed/duplex using
1525 *  media/mediopt option with ifconfig.
1526 *
1527 **********************************************************************/
1528int
1529igc_media_change(struct ifnet *ifp)
1530{
1531	struct igc_softc *sc = ifp->if_softc;
1532	struct ifmedia *ifm = &sc->media;
1533
1534	if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
1535		return (EINVAL);
1536
1537	sc->hw.mac.autoneg = DO_AUTO_NEG;
1538
1539	switch (IFM_SUBTYPE(ifm->ifm_media)) {
1540	case IFM_AUTO:
1541		sc->hw.phy.autoneg_advertised = AUTONEG_ADV_DEFAULT;
1542		break;
1543        case IFM_2500_T:
1544                sc->hw.phy.autoneg_advertised = ADVERTISE_2500_FULL;
1545                break;
1546	case IFM_1000_T:
1547		sc->hw.phy.autoneg_advertised = ADVERTISE_1000_FULL;
1548		break;
1549	case IFM_100_TX:
1550		if ((ifm->ifm_media & IFM_GMASK) == IFM_FDX)
1551			sc->hw.phy.autoneg_advertised = ADVERTISE_100_FULL;
1552		else
1553			sc->hw.phy.autoneg_advertised = ADVERTISE_100_HALF;
1554		break;
1555	case IFM_10_T:
1556		if ((ifm->ifm_media & IFM_GMASK) == IFM_FDX)
1557			sc->hw.phy.autoneg_advertised = ADVERTISE_10_FULL;
1558		else
1559			sc->hw.phy.autoneg_advertised = ADVERTISE_10_HALF;
1560		break;
1561	default:
1562		return EINVAL;
1563	}
1564
1565	igc_init(sc);
1566
1567	return 0;
1568}
1569
1570void
1571igc_iff(struct igc_softc *sc)
1572{
1573	struct ifnet *ifp = &sc->sc_ac.ac_if;
1574        struct arpcom *ac = &sc->sc_ac;
1575	struct ether_multi *enm;
1576	struct ether_multistep step;
1577	uint32_t reg_rctl = 0;
1578	uint8_t *mta;
1579	int mcnt = 0;
1580
1581	mta = sc->mta;
1582        bzero(mta, sizeof(uint8_t) * ETHER_ADDR_LEN *
1583	    MAX_NUM_MULTICAST_ADDRESSES);
1584
1585	reg_rctl = IGC_READ_REG(&sc->hw, IGC_RCTL);
1586	reg_rctl &= ~(IGC_RCTL_UPE | IGC_RCTL_MPE);
1587	ifp->if_flags &= ~IFF_ALLMULTI;
1588
1589	if (ifp->if_flags & IFF_PROMISC || ac->ac_multirangecnt > 0 ||
1590	    ac->ac_multicnt > MAX_NUM_MULTICAST_ADDRESSES) {
1591		ifp->if_flags |= IFF_ALLMULTI;
1592		reg_rctl |= IGC_RCTL_MPE;
1593		if (ifp->if_flags & IFF_PROMISC)
1594			reg_rctl |= IGC_RCTL_UPE;
1595	} else {
1596		ETHER_FIRST_MULTI(step, ac, enm);
1597		while (enm != NULL) {
1598			bcopy(enm->enm_addrlo,
1599			    &mta[mcnt * ETHER_ADDR_LEN], ETHER_ADDR_LEN);
1600			mcnt++;
1601
1602			ETHER_NEXT_MULTI(step, enm);
1603		}
1604
1605		igc_update_mc_addr_list(&sc->hw, mta, mcnt);
1606	}
1607
1608	IGC_WRITE_REG(&sc->hw, IGC_RCTL, reg_rctl);
1609}
1610
1611void
1612igc_update_link_status(struct igc_softc *sc)
1613{
1614	struct ifnet *ifp = &sc->sc_ac.ac_if;
1615	struct igc_hw *hw = &sc->hw;
1616	int link_state;
1617
1618	if (hw->mac.get_link_status == true)
1619		igc_check_for_link(hw);
1620
1621	if (IGC_READ_REG(&sc->hw, IGC_STATUS) & IGC_STATUS_LU) {
1622		if (sc->link_active == 0) {
1623			igc_get_speed_and_duplex(hw, &sc->link_speed,
1624			    &sc->link_duplex);
1625			sc->link_active = 1;
1626			ifp->if_baudrate = IF_Mbps(sc->link_speed);
1627		}
1628		link_state = (sc->link_duplex == FULL_DUPLEX) ?
1629		    LINK_STATE_FULL_DUPLEX : LINK_STATE_HALF_DUPLEX;
1630	} else {
1631		if (sc->link_active == 1) {
1632			ifp->if_baudrate = sc->link_speed = 0;
1633			sc->link_duplex = 0;
1634			sc->link_active = 0;
1635		}
1636		link_state = LINK_STATE_DOWN;
1637	}
1638	if (ifp->if_link_state != link_state) {
1639		ifp->if_link_state = link_state;
1640		if_link_state_change(ifp);
1641	}
1642}
1643
1644/*********************************************************************
1645 *
1646 *  Get a buffer from system mbuf buffer pool.
1647 *
1648 **********************************************************************/
1649int
1650igc_get_buf(struct rx_ring *rxr, int i)
1651{
1652	struct igc_softc *sc = rxr->sc;
1653	struct igc_rx_buf *rxbuf;
1654	struct mbuf *m;
1655	union igc_adv_rx_desc *rxdesc;
1656	int error;
1657
1658	rxbuf = &rxr->rx_buffers[i];
1659	rxdesc = &rxr->rx_base[i];
1660	if (rxbuf->buf) {
1661		printf("%s: slot %d already has an mbuf\n", DEVNAME(sc), i);
1662		return ENOBUFS;
1663	}
1664
1665	m = MCLGETL(NULL, M_DONTWAIT, sc->rx_mbuf_sz);
1666	if (!m)
1667		return ENOBUFS;
1668
1669	m->m_data += (m->m_ext.ext_size - sc->rx_mbuf_sz);
1670	m->m_len = m->m_pkthdr.len = sc->rx_mbuf_sz;
1671
1672	error = bus_dmamap_load_mbuf(rxr->rxdma.dma_tag, rxbuf->map, m,
1673	    BUS_DMA_NOWAIT);
1674	if (error) {
1675		m_freem(m);
1676		return error;
1677	}
1678
1679	bus_dmamap_sync(rxr->rxdma.dma_tag, rxbuf->map, 0,
1680	    rxbuf->map->dm_mapsize, BUS_DMASYNC_PREREAD);
1681	rxbuf->buf = m;
1682
1683	rxdesc->read.pkt_addr = htole64(rxbuf->map->dm_segs[0].ds_addr);
1684
1685	return 0;
1686}
1687
1688void
1689igc_configure_queues(struct igc_softc *sc)
1690{
1691	struct igc_hw *hw = &sc->hw;
1692	struct igc_queue *iq = sc->queues;
1693	uint32_t ivar, newitr = 0;
1694	int i;
1695
1696	/* First turn on RSS capability */
1697	IGC_WRITE_REG(hw, IGC_GPIE, IGC_GPIE_MSIX_MODE | IGC_GPIE_EIAME |
1698	    IGC_GPIE_PBA | IGC_GPIE_NSICR);
1699
1700	/* Set the starting interrupt rate */
1701	newitr = (4000000 / MAX_INTS_PER_SEC) & 0x7FFC;
1702
1703	newitr |= IGC_EITR_CNT_IGNR;
1704
1705	/* Turn on MSI-X */
1706	for (i = 0; i < sc->sc_nqueues; i++, iq++) {
1707		/* RX entries */
1708		igc_set_queues(sc, i, iq->msix, 0);
1709		/* TX entries */
1710		igc_set_queues(sc, i, iq->msix, 1);
1711		sc->msix_queuesmask |= iq->eims;
1712		IGC_WRITE_REG(hw, IGC_EITR(iq->msix), newitr);
1713	}
1714
1715	/* And for the link interrupt */
1716	ivar = (sc->linkvec | IGC_IVAR_VALID) << 8;
1717	sc->msix_linkmask = 1 << sc->linkvec;
1718	IGC_WRITE_REG(hw, IGC_IVAR_MISC, ivar);
1719}
1720
1721void
1722igc_set_queues(struct igc_softc *sc, uint32_t entry, uint32_t vector, int type)
1723{
1724	struct igc_hw *hw = &sc->hw;
1725	uint32_t ivar, index;
1726
1727	index = entry >> 1;
1728	ivar = IGC_READ_REG_ARRAY(hw, IGC_IVAR0, index);
1729	if (type) {
1730		if (entry & 1) {
1731			ivar &= 0x00FFFFFF;
1732			ivar |= (vector | IGC_IVAR_VALID) << 24;
1733		} else {
1734			ivar &= 0xFFFF00FF;
1735			ivar |= (vector | IGC_IVAR_VALID) << 8;
1736		}
1737	} else {
1738		if (entry & 1) {
1739			ivar &= 0xFF00FFFF;
1740			ivar |= (vector | IGC_IVAR_VALID) << 16;
1741		} else {
1742			ivar &= 0xFFFFFF00;
1743			ivar |= vector | IGC_IVAR_VALID;
1744		}
1745	}
1746	IGC_WRITE_REG_ARRAY(hw, IGC_IVAR0, index, ivar);
1747}
1748
1749void
1750igc_enable_queue(struct igc_softc *sc, uint32_t eims)
1751{
1752	IGC_WRITE_REG(&sc->hw, IGC_EIMS, eims);
1753}
1754
1755void
1756igc_enable_intr(struct igc_softc *sc)
1757{
1758	struct igc_hw *hw = &sc->hw;
1759	uint32_t mask;
1760
1761	mask = (sc->msix_queuesmask | sc->msix_linkmask);
1762	IGC_WRITE_REG(hw, IGC_EIAC, mask);
1763	IGC_WRITE_REG(hw, IGC_EIAM, mask);
1764	IGC_WRITE_REG(hw, IGC_EIMS, mask);
1765	IGC_WRITE_REG(hw, IGC_IMS, IGC_IMS_LSC);
1766	IGC_WRITE_FLUSH(hw);
1767}
1768
1769void
1770igc_disable_intr(struct igc_softc *sc)
1771{
1772	struct igc_hw *hw = &sc->hw;
1773
1774	IGC_WRITE_REG(hw, IGC_EIMC, 0xffffffff);
1775	IGC_WRITE_REG(hw, IGC_EIAC, 0);
1776	IGC_WRITE_REG(hw, IGC_IMC, 0xffffffff);
1777	IGC_WRITE_FLUSH(hw);
1778}
1779
1780int
1781igc_intr_link(void *arg)
1782{
1783	struct igc_softc *sc = (struct igc_softc *)arg;
1784	uint32_t reg_icr = IGC_READ_REG(&sc->hw, IGC_ICR);
1785
1786	if (reg_icr & IGC_ICR_LSC) {
1787		KERNEL_LOCK();
1788		sc->hw.mac.get_link_status = true;
1789		igc_update_link_status(sc);
1790		KERNEL_UNLOCK();
1791	}
1792
1793	IGC_WRITE_REG(&sc->hw, IGC_IMS, IGC_IMS_LSC);
1794	IGC_WRITE_REG(&sc->hw, IGC_EIMS, sc->msix_linkmask);
1795
1796	return 1;
1797}
1798
1799int
1800igc_intr_queue(void *arg)
1801{
1802	struct igc_queue *iq = arg;
1803	struct igc_softc *sc = iq->sc;
1804	struct ifnet *ifp = &sc->sc_ac.ac_if;
1805	struct rx_ring *rxr = iq->rxr;
1806	struct tx_ring *txr = iq->txr;
1807
1808	if (ifp->if_flags & IFF_RUNNING) {
1809		igc_txeof(txr);
1810		igc_rxeof(rxr);
1811		igc_rxrefill(rxr);
1812	}
1813
1814	igc_enable_queue(sc, iq->eims);
1815
1816	return 1;
1817}
1818
1819/*********************************************************************
1820 *
1821 *  Allocate memory for tx_buffer structures. The tx_buffer stores all
1822 *  the information needed to transmit a packet on the wire.
1823 *
1824 **********************************************************************/
1825int
1826igc_allocate_transmit_buffers(struct tx_ring *txr)
1827{
1828	struct igc_softc *sc = txr->sc;
1829	struct igc_tx_buf *txbuf;
1830	int error, i;
1831
1832	txr->tx_buffers = mallocarray(sc->num_tx_desc,
1833	    sizeof(struct igc_tx_buf), M_DEVBUF, M_NOWAIT | M_ZERO);
1834	if (txr->tx_buffers == NULL) {
1835		printf("%s: Unable to allocate tx_buffer memory\n",
1836		    DEVNAME(sc));
1837		error = ENOMEM;
1838		goto fail;
1839	}
1840	txr->txtag = txr->txdma.dma_tag;
1841
1842	/* Create the descriptor buffer dma maps. */
1843	for (i = 0; i < sc->num_tx_desc; i++) {
1844		txbuf = &txr->tx_buffers[i];
1845		error = bus_dmamap_create(txr->txdma.dma_tag, IGC_TSO_SIZE,
1846		    IGC_MAX_SCATTER, PAGE_SIZE, 0, BUS_DMA_NOWAIT, &txbuf->map);
1847		if (error != 0) {
1848			printf("%s: Unable to create TX DMA map\n",
1849			    DEVNAME(sc));
1850			goto fail;
1851		}
1852	}
1853
1854	return 0;
1855fail:
1856	return error;
1857}
1858
1859
1860/*********************************************************************
1861 *
1862 *  Allocate and initialize transmit structures.
1863 *
1864 **********************************************************************/
1865int
1866igc_setup_transmit_structures(struct igc_softc *sc)
1867{
1868	struct tx_ring *txr = sc->tx_rings;
1869	int i;
1870
1871	for (i = 0; i < sc->sc_nqueues; i++, txr++) {
1872		if (igc_setup_transmit_ring(txr))
1873			goto fail;
1874	}
1875
1876	return 0;
1877fail:
1878	igc_free_transmit_structures(sc);
1879	return ENOBUFS;
1880}
1881
1882/*********************************************************************
1883 *
1884 *  Initialize a transmit ring.
1885 *
1886 **********************************************************************/
1887int
1888igc_setup_transmit_ring(struct tx_ring *txr)
1889{
1890	struct igc_softc *sc = txr->sc;
1891
1892	/* Now allocate transmit buffers for the ring. */
1893	if (igc_allocate_transmit_buffers(txr))
1894		return ENOMEM;
1895
1896	/* Clear the old ring contents */
1897	bzero((void *)txr->tx_base,
1898	    (sizeof(union igc_adv_tx_desc)) * sc->num_tx_desc);
1899
1900	/* Reset indices. */
1901	txr->next_avail_desc = 0;
1902	txr->next_to_clean = 0;
1903
1904	bus_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map, 0,
1905	    txr->txdma.dma_map->dm_mapsize,
1906	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1907
1908	return 0;
1909}
1910
1911/*********************************************************************
1912 *
1913 *  Enable transmit unit.
1914 *
1915 **********************************************************************/
1916void
1917igc_initialize_transmit_unit(struct igc_softc *sc)
1918{
1919	struct ifnet *ifp = &sc->sc_ac.ac_if;
1920	struct tx_ring *txr;
1921	struct igc_hw *hw = &sc->hw;
1922	uint64_t bus_addr;
1923	uint32_t tctl, txdctl = 0;
1924        int i;
1925
1926	/* Setup the Base and Length of the TX descriptor ring. */
1927	for (i = 0; i < sc->sc_nqueues; i++) {
1928		txr = &sc->tx_rings[i];
1929
1930		bus_addr = txr->txdma.dma_map->dm_segs[0].ds_addr;
1931
1932		/* Base and len of TX ring */
1933		IGC_WRITE_REG(hw, IGC_TDLEN(i),
1934		    sc->num_tx_desc * sizeof(union igc_adv_tx_desc));
1935		IGC_WRITE_REG(hw, IGC_TDBAH(i), (uint32_t)(bus_addr >> 32));
1936		IGC_WRITE_REG(hw, IGC_TDBAL(i), (uint32_t)bus_addr);
1937
1938		/* Init the HEAD/TAIL indices */
1939		IGC_WRITE_REG(hw, IGC_TDT(i), 0);
1940		IGC_WRITE_REG(hw, IGC_TDH(i), 0);
1941
1942		txr->watchdog_timer = 0;
1943
1944		txdctl = 0;		/* Clear txdctl */
1945		txdctl |= 0x1f;		/* PTHRESH */
1946		txdctl |= 1 << 8;	/* HTHRESH */
1947		txdctl |= 1 << 16;	/* WTHRESH */
1948		txdctl |= 1 << 22;	/* Reserved bit 22 must always be 1 */
1949		txdctl |= IGC_TXDCTL_GRAN;
1950		txdctl |= 1 << 25;	/* LWTHRESH */
1951
1952		IGC_WRITE_REG(hw, IGC_TXDCTL(i), txdctl);
1953	}
1954	ifp->if_timer = 0;
1955
1956	/* Program the Transmit Control Register */
1957	tctl = IGC_READ_REG(&sc->hw, IGC_TCTL);
1958	tctl &= ~IGC_TCTL_CT;
1959	tctl |= (IGC_TCTL_PSP | IGC_TCTL_RTLC | IGC_TCTL_EN |
1960	    (IGC_COLLISION_THRESHOLD << IGC_CT_SHIFT));
1961
1962	/* This write will effectively turn on the transmit unit. */
1963	IGC_WRITE_REG(&sc->hw, IGC_TCTL, tctl);
1964}
1965
1966/*********************************************************************
1967 *
1968 *  Free all transmit rings.
1969 *
1970 **********************************************************************/
1971void
1972igc_free_transmit_structures(struct igc_softc *sc)
1973{
1974	struct tx_ring *txr = sc->tx_rings;
1975	int i;
1976
1977	for (i = 0; i < sc->sc_nqueues; i++, txr++)
1978		igc_free_transmit_buffers(txr);
1979}
1980
1981/*********************************************************************
1982 *
1983 *  Free transmit ring related data structures.
1984 *
1985 **********************************************************************/
1986void
1987igc_free_transmit_buffers(struct tx_ring *txr)
1988{
1989	struct igc_softc *sc = txr->sc;
1990	struct igc_tx_buf *txbuf;
1991	int i;
1992
1993	if (txr->tx_buffers == NULL)
1994		return;
1995
1996	txbuf = txr->tx_buffers;
1997	for (i = 0; i < sc->num_tx_desc; i++, txbuf++) {
1998		if (txbuf->map != NULL && txbuf->map->dm_nsegs > 0) {
1999			bus_dmamap_sync(txr->txdma.dma_tag, txbuf->map,
2000			    0, txbuf->map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
2001			bus_dmamap_unload(txr->txdma.dma_tag, txbuf->map);
2002		}
2003		if (txbuf->m_head != NULL) {
2004			m_freem(txbuf->m_head);
2005			txbuf->m_head = NULL;
2006		}
2007		if (txbuf->map != NULL) {
2008			bus_dmamap_destroy(txr->txdma.dma_tag, txbuf->map);
2009			txbuf->map = NULL;
2010		}
2011	}
2012
2013	if (txr->tx_buffers != NULL)
2014		free(txr->tx_buffers, M_DEVBUF,
2015		    sc->num_tx_desc * sizeof(struct igc_tx_buf));
2016	txr->tx_buffers = NULL;
2017	txr->txtag = NULL;
2018}
2019
2020
2021/*********************************************************************
2022 *
2023 *  Advanced Context Descriptor setup for VLAN, CSUM or TSO
2024 *
2025 **********************************************************************/
2026
2027int
2028igc_tx_ctx_setup(struct tx_ring *txr, struct mbuf *mp, int prod,
2029    uint32_t *cmd_type_len, uint32_t *olinfo_status)
2030{
2031	struct ether_extracted ext;
2032	struct igc_adv_tx_context_desc *txdesc;
2033	uint32_t mss_l4len_idx = 0;
2034	uint32_t type_tucmd_mlhl = 0;
2035	uint32_t vlan_macip_lens = 0;
2036	int off = 0;
2037
2038	/*
2039	 * In advanced descriptors the vlan tag must
2040	 * be placed into the context descriptor. Hence
2041	 * we need to make one even if not doing offloads.
2042	 */
2043#if NVLAN > 0
2044	if (ISSET(mp->m_flags, M_VLANTAG)) {
2045		uint32_t vtag = mp->m_pkthdr.ether_vtag;
2046		vlan_macip_lens |= (vtag << IGC_ADVTXD_VLAN_SHIFT);
2047		*cmd_type_len |= IGC_ADVTXD_DCMD_VLE;
2048		off = 1;
2049	}
2050#endif
2051
2052	ether_extract_headers(mp, &ext);
2053
2054	vlan_macip_lens |= (sizeof(*ext.eh) << IGC_ADVTXD_MACLEN_SHIFT);
2055
2056	if (ext.ip4) {
2057		type_tucmd_mlhl |= IGC_ADVTXD_TUCMD_IPV4;
2058		if (ISSET(mp->m_pkthdr.csum_flags, M_IPV4_CSUM_OUT)) {
2059			*olinfo_status |= IGC_TXD_POPTS_IXSM << 8;
2060			off = 1;
2061		}
2062#ifdef INET6
2063	} else if (ext.ip6) {
2064		type_tucmd_mlhl |= IGC_ADVTXD_TUCMD_IPV6;
2065#endif
2066	}
2067
2068	vlan_macip_lens |= ext.iphlen;
2069	type_tucmd_mlhl |= IGC_ADVTXD_DCMD_DEXT | IGC_ADVTXD_DTYP_CTXT;
2070
2071	if (ext.tcp) {
2072		type_tucmd_mlhl |= IGC_ADVTXD_TUCMD_L4T_TCP;
2073		if (ISSET(mp->m_pkthdr.csum_flags, M_TCP_CSUM_OUT)) {
2074			*olinfo_status |= IGC_TXD_POPTS_TXSM << 8;
2075			off = 1;
2076		}
2077	} else if (ext.udp) {
2078		type_tucmd_mlhl |= IGC_ADVTXD_TUCMD_L4T_UDP;
2079		if (ISSET(mp->m_pkthdr.csum_flags, M_UDP_CSUM_OUT)) {
2080			*olinfo_status |= IGC_TXD_POPTS_TXSM << 8;
2081			off = 1;
2082		}
2083	}
2084
2085	if (ISSET(mp->m_pkthdr.csum_flags, M_TCP_TSO)) {
2086		if (ext.tcp) {
2087			uint32_t hdrlen, thlen, paylen, outlen;
2088
2089			thlen = ext.tcphlen;
2090
2091			outlen = mp->m_pkthdr.ph_mss;
2092			mss_l4len_idx |= outlen << IGC_ADVTXD_MSS_SHIFT;
2093			mss_l4len_idx |= thlen << IGC_ADVTXD_L4LEN_SHIFT;
2094
2095			hdrlen = sizeof(*ext.eh) + ext.iphlen + thlen;
2096			paylen = mp->m_pkthdr.len - hdrlen;
2097			CLR(*olinfo_status, IGC_ADVTXD_PAYLEN_MASK);
2098			*olinfo_status |= paylen << IGC_ADVTXD_PAYLEN_SHIFT;
2099
2100			*cmd_type_len |= IGC_ADVTXD_DCMD_TSE;
2101			off = 1;
2102
2103			tcpstat_add(tcps_outpkttso,
2104			    (paylen + outlen - 1) / outlen);
2105		} else
2106			tcpstat_inc(tcps_outbadtso);
2107	}
2108
2109	if (off == 0)
2110		return 0;
2111
2112	/* Now ready a context descriptor */
2113	txdesc = (struct igc_adv_tx_context_desc *)&txr->tx_base[prod];
2114
2115	/* Now copy bits into descriptor */
2116	htolem32(&txdesc->vlan_macip_lens, vlan_macip_lens);
2117	htolem32(&txdesc->type_tucmd_mlhl, type_tucmd_mlhl);
2118	htolem32(&txdesc->seqnum_seed, 0);
2119	htolem32(&txdesc->mss_l4len_idx, mss_l4len_idx);
2120
2121	return 1;
2122}
2123
2124/*********************************************************************
2125 *
2126 *  Allocate memory for rx_buffer structures. Since we use one
2127 *  rx_buffer per received packet, the maximum number of rx_buffer's
2128 *  that we'll need is equal to the number of receive descriptors
2129 *  that we've allocated.
2130 *
2131 **********************************************************************/
2132int
2133igc_allocate_receive_buffers(struct rx_ring *rxr)
2134{
2135	struct igc_softc *sc = rxr->sc;
2136	struct igc_rx_buf *rxbuf;
2137	int i, error;
2138
2139	rxr->rx_buffers = mallocarray(sc->num_rx_desc,
2140	    sizeof(struct igc_rx_buf), M_DEVBUF, M_NOWAIT | M_ZERO);
2141	if (rxr->rx_buffers == NULL) {
2142		printf("%s: Unable to allocate rx_buffer memory\n",
2143		    DEVNAME(sc));
2144		error = ENOMEM;
2145		goto fail;
2146	}
2147
2148	rxbuf = rxr->rx_buffers;
2149	for (i = 0; i < sc->num_rx_desc; i++, rxbuf++) {
2150		error = bus_dmamap_create(rxr->rxdma.dma_tag,
2151		    MAX_JUMBO_FRAME_SIZE, 1, MAX_JUMBO_FRAME_SIZE, 0,
2152		    BUS_DMA_NOWAIT, &rxbuf->map);
2153		if (error) {
2154			printf("%s: Unable to create RX DMA map\n",
2155			    DEVNAME(sc));
2156			goto fail;
2157		}
2158	}
2159	bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map, 0,
2160	    rxr->rxdma.dma_map->dm_mapsize,
2161	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
2162
2163	return 0;
2164fail:
2165	return error;
2166}
2167
2168/*********************************************************************
2169 *
2170 *  Allocate and initialize receive structures.
2171 *
2172 **********************************************************************/
2173int
2174igc_setup_receive_structures(struct igc_softc *sc)
2175{
2176	struct rx_ring *rxr = sc->rx_rings;
2177	int i;
2178
2179	for (i = 0; i < sc->sc_nqueues; i++, rxr++) {
2180		if (igc_setup_receive_ring(rxr))
2181			goto fail;
2182	}
2183
2184	return 0;
2185fail:
2186	igc_free_receive_structures(sc);
2187	return ENOBUFS;
2188}
2189
2190/*********************************************************************
2191 *
2192 *  Initialize a receive ring and its buffers.
2193 *
2194 **********************************************************************/
2195int
2196igc_setup_receive_ring(struct rx_ring *rxr)
2197{
2198	struct igc_softc *sc = rxr->sc;
2199	struct ifnet *ifp = &sc->sc_ac.ac_if;
2200	int rsize;
2201
2202	rsize = roundup2(sc->num_rx_desc * sizeof(union igc_adv_rx_desc),
2203	    IGC_DBA_ALIGN);
2204
2205	/* Clear the ring contents. */
2206	bzero((void *)rxr->rx_base, rsize);
2207
2208	if (igc_allocate_receive_buffers(rxr))
2209		return ENOMEM;
2210
2211	/* Setup our descriptor indices. */
2212	rxr->next_to_check = 0;
2213	rxr->last_desc_filled = sc->num_rx_desc - 1;
2214
2215	if_rxr_init(&rxr->rx_ring, 2 * ((ifp->if_hardmtu / MCLBYTES) + 1),
2216	    sc->num_rx_desc - 1);
2217
2218	return 0;
2219}
2220
2221/*********************************************************************
2222 *
2223 *  Enable receive unit.
2224 *
2225 **********************************************************************/
2226#define BSIZEPKT_ROUNDUP	((1 << IGC_SRRCTL_BSIZEPKT_SHIFT) - 1)
2227
2228void
2229igc_initialize_receive_unit(struct igc_softc *sc)
2230{
2231        struct rx_ring *rxr = sc->rx_rings;
2232        struct igc_hw *hw = &sc->hw;
2233	uint32_t rctl, rxcsum, srrctl = 0;
2234	int i;
2235
2236	/*
2237	 * Make sure receives are disabled while setting
2238	 * up the descriptor ring.
2239	 */
2240	rctl = IGC_READ_REG(hw, IGC_RCTL);
2241	IGC_WRITE_REG(hw, IGC_RCTL, rctl & ~IGC_RCTL_EN);
2242
2243	/* Setup the Receive Control Register */
2244	rctl &= ~(3 << IGC_RCTL_MO_SHIFT);
2245	rctl |= IGC_RCTL_EN | IGC_RCTL_BAM | IGC_RCTL_LBM_NO |
2246	    IGC_RCTL_RDMTS_HALF | (hw->mac.mc_filter_type << IGC_RCTL_MO_SHIFT);
2247
2248	/* Do not store bad packets */
2249	rctl &= ~IGC_RCTL_SBP;
2250
2251	/* Enable Long Packet receive */
2252	if (sc->hw.mac.max_frame_size != ETHER_MAX_LEN)
2253		rctl |= IGC_RCTL_LPE;
2254
2255	/* Strip the CRC */
2256	rctl |= IGC_RCTL_SECRC;
2257
2258	/*
2259	 * Set the interrupt throttling rate. Value is calculated
2260	 * as DEFAULT_ITR = 1/(MAX_INTS_PER_SEC * 256ns)
2261	 */
2262	IGC_WRITE_REG(hw, IGC_ITR, DEFAULT_ITR);
2263
2264	rxcsum = IGC_READ_REG(hw, IGC_RXCSUM);
2265	rxcsum &= ~IGC_RXCSUM_PCSD;
2266
2267	if (sc->sc_nqueues > 1)
2268		rxcsum |= IGC_RXCSUM_PCSD;
2269
2270	IGC_WRITE_REG(hw, IGC_RXCSUM, rxcsum);
2271
2272	if (sc->sc_nqueues > 1)
2273		igc_initialize_rss_mapping(sc);
2274
2275	/* Set maximum packet buffer len */
2276	srrctl |= (sc->rx_mbuf_sz + BSIZEPKT_ROUNDUP) >>
2277	    IGC_SRRCTL_BSIZEPKT_SHIFT;
2278	/* srrctl above overrides this but set the register to a sane value */
2279	rctl |= IGC_RCTL_SZ_2048;
2280
2281	/*
2282	 * If TX flow control is disabled and there's > 1 queue defined,
2283	 * enable DROP.
2284	 *
2285	 * This drops frames rather than hanging the RX MAC for all queues.
2286	 */
2287	if ((sc->sc_nqueues > 1) && (sc->fc == igc_fc_none ||
2288	    sc->fc == igc_fc_rx_pause)) {
2289		srrctl |= IGC_SRRCTL_DROP_EN;
2290	}
2291
2292	/* Setup the Base and Length of the RX descriptor rings. */
2293	for (i = 0; i < sc->sc_nqueues; i++, rxr++) {
2294		IGC_WRITE_REG(hw, IGC_RXDCTL(i), 0);
2295		uint64_t bus_addr = rxr->rxdma.dma_map->dm_segs[0].ds_addr;
2296		uint32_t rxdctl;
2297
2298		srrctl |= IGC_SRRCTL_DESCTYPE_ADV_ONEBUF;
2299
2300		IGC_WRITE_REG(hw, IGC_RDLEN(i),
2301		    sc->num_rx_desc * sizeof(union igc_adv_rx_desc));
2302		IGC_WRITE_REG(hw, IGC_RDBAH(i), (uint32_t)(bus_addr >> 32));
2303		IGC_WRITE_REG(hw, IGC_RDBAL(i), (uint32_t)bus_addr);
2304		IGC_WRITE_REG(hw, IGC_SRRCTL(i), srrctl);
2305
2306		/* Setup the Head and Tail Descriptor Pointers */
2307		IGC_WRITE_REG(hw, IGC_RDH(i), 0);
2308		IGC_WRITE_REG(hw, IGC_RDT(i), 0);
2309
2310		/* Enable this Queue */
2311		rxdctl = IGC_READ_REG(hw, IGC_RXDCTL(i));
2312		rxdctl |= IGC_RXDCTL_QUEUE_ENABLE;
2313		rxdctl &= 0xFFF00000;
2314		rxdctl |= IGC_RX_PTHRESH;
2315		rxdctl |= IGC_RX_HTHRESH << 8;
2316		rxdctl |= IGC_RX_WTHRESH << 16;
2317		IGC_WRITE_REG(hw, IGC_RXDCTL(i), rxdctl);
2318	}
2319
2320	/* Make sure VLAN Filters are off */
2321	rctl &= ~IGC_RCTL_VFE;
2322
2323	/* Write out the settings */
2324	IGC_WRITE_REG(hw, IGC_RCTL, rctl);
2325}
2326
2327/*********************************************************************
2328 *
2329 *  Free all receive rings.
2330 *
2331 **********************************************************************/
2332void
2333igc_free_receive_structures(struct igc_softc *sc)
2334{
2335	struct rx_ring *rxr;
2336	int i;
2337
2338	for (i = 0, rxr = sc->rx_rings; i < sc->sc_nqueues; i++, rxr++)
2339		if_rxr_init(&rxr->rx_ring, 0, 0);
2340
2341	for (i = 0, rxr = sc->rx_rings; i < sc->sc_nqueues; i++, rxr++)
2342		igc_free_receive_buffers(rxr);
2343}
2344
2345/*********************************************************************
2346 *
2347 *  Free receive ring data structures
2348 *
2349 **********************************************************************/
2350void
2351igc_free_receive_buffers(struct rx_ring *rxr)
2352{
2353	struct igc_softc *sc = rxr->sc;
2354	struct igc_rx_buf *rxbuf;
2355	int i;
2356
2357	if (rxr->rx_buffers != NULL) {
2358		for (i = 0; i < sc->num_rx_desc; i++) {
2359			rxbuf = &rxr->rx_buffers[i];
2360			if (rxbuf->buf != NULL) {
2361				bus_dmamap_sync(rxr->rxdma.dma_tag, rxbuf->map,
2362				    0, rxbuf->map->dm_mapsize,
2363				    BUS_DMASYNC_POSTREAD);
2364				bus_dmamap_unload(rxr->rxdma.dma_tag,
2365				    rxbuf->map);
2366				m_freem(rxbuf->buf);
2367				rxbuf->buf = NULL;
2368			}
2369			bus_dmamap_destroy(rxr->rxdma.dma_tag, rxbuf->map);
2370			rxbuf->map = NULL;
2371		}
2372		free(rxr->rx_buffers, M_DEVBUF,
2373		    sc->num_rx_desc * sizeof(struct igc_rx_buf));
2374		rxr->rx_buffers = NULL;
2375	}
2376}
2377
2378/*
2379 * Initialise the RSS mapping for NICs that support multiple transmit/
2380 * receive rings.
2381 */
2382void
2383igc_initialize_rss_mapping(struct igc_softc *sc)
2384{
2385	struct igc_hw *hw = &sc->hw;
2386	uint32_t rss_key[10], mrqc, reta, shift = 0;
2387	int i, queue_id;
2388
2389	/*
2390	 * The redirection table controls which destination
2391	 * queue each bucket redirects traffic to.
2392	 * Each DWORD represents four queues, with the LSB
2393	 * being the first queue in the DWORD.
2394	 *
2395	 * This just allocates buckets to queues using round-robin
2396	 * allocation.
2397	 *
2398	 * NOTE: It Just Happens to line up with the default
2399	 * RSS allocation method.
2400	 */
2401
2402	/* Warning FM follows */
2403	reta = 0;
2404	for (i = 0; i < 128; i++) {
2405		queue_id = (i % sc->sc_nqueues);
2406		/* Adjust if required */
2407		queue_id = queue_id << shift;
2408
2409		/*
2410		 * The low 8 bits are for hash value (n+0);
2411		 * The next 8 bits are for hash value (n+1), etc.
2412		 */
2413		reta = reta >> 8;
2414		reta = reta | ( ((uint32_t) queue_id) << 24);
2415		if ((i & 3) == 3) {
2416			IGC_WRITE_REG(hw, IGC_RETA(i >> 2), reta);
2417			reta = 0;
2418		}
2419	}
2420
2421	/*
2422	 * MRQC: Multiple Receive Queues Command
2423	 * Set queuing to RSS control, number depends on the device.
2424	 */
2425	mrqc = IGC_MRQC_ENABLE_RSS_4Q;
2426
2427	/* Set up random bits */
2428        stoeplitz_to_key(&rss_key, sizeof(rss_key));
2429
2430	/* Now fill our hash function seeds */
2431	for (i = 0; i < 10; i++)
2432		IGC_WRITE_REG_ARRAY(hw, IGC_RSSRK(0), i, rss_key[i]);
2433
2434	/*
2435	 * Configure the RSS fields to hash upon.
2436	 */
2437	mrqc |= (IGC_MRQC_RSS_FIELD_IPV4 | IGC_MRQC_RSS_FIELD_IPV4_TCP);
2438	mrqc |= (IGC_MRQC_RSS_FIELD_IPV6 | IGC_MRQC_RSS_FIELD_IPV6_TCP);
2439	mrqc |= IGC_MRQC_RSS_FIELD_IPV6_TCP_EX;
2440
2441	IGC_WRITE_REG(hw, IGC_MRQC, mrqc);
2442}
2443
2444/*
2445 * igc_get_hw_control sets the {CTRL_EXT|FWSM}:DRV_LOAD bit.
2446 * For ASF and Pass Through versions of f/w this means
2447 * that the driver is loaded. For AMT version type f/w
2448 * this means that the network i/f is open.
2449 */
2450void
2451igc_get_hw_control(struct igc_softc *sc)
2452{
2453	uint32_t ctrl_ext;
2454
2455	ctrl_ext = IGC_READ_REG(&sc->hw, IGC_CTRL_EXT);
2456	IGC_WRITE_REG(&sc->hw, IGC_CTRL_EXT, ctrl_ext | IGC_CTRL_EXT_DRV_LOAD);
2457}
2458
2459/*
2460 * igc_release_hw_control resets {CTRL_EXT|FWSM}:DRV_LOAD bit.
2461 * For ASF and Pass Through versions of f/w this means that
2462 * the driver is no longer loaded. For AMT versions of the
2463 * f/w this means that the network i/f is closed.
2464 */
2465void
2466igc_release_hw_control(struct igc_softc *sc)
2467{
2468	uint32_t ctrl_ext;
2469
2470	ctrl_ext = IGC_READ_REG(&sc->hw, IGC_CTRL_EXT);
2471	IGC_WRITE_REG(&sc->hw, IGC_CTRL_EXT, ctrl_ext & ~IGC_CTRL_EXT_DRV_LOAD);
2472}
2473
2474int
2475igc_is_valid_ether_addr(uint8_t *addr)
2476{
2477	char zero_addr[6] = { 0, 0, 0, 0, 0, 0 };
2478
2479	if ((addr[0] & 1) || (!bcmp(addr, zero_addr, ETHER_ADDR_LEN))) {
2480		return 0;
2481	}
2482
2483	return 1;
2484}
2485