Home | History | Annotate | Line # | Download | only in pci
if_wm.c revision 1.347
      1 /*	$NetBSD: if_wm.c,v 1.347 2015/09/07 15:19:05 msaitoh Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 2001, 2002, 2003, 2004 Wasabi Systems, Inc.
      5  * All rights reserved.
      6  *
      7  * Written by Jason R. Thorpe for Wasabi Systems, Inc.
      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  * 3. All advertising materials mentioning features or use of this software
     18  *    must display the following acknowledgement:
     19  *	This product includes software developed for the NetBSD Project by
     20  *	Wasabi Systems, Inc.
     21  * 4. The name of Wasabi Systems, Inc. may not be used to endorse
     22  *    or promote products derived from this software without specific prior
     23  *    written permission.
     24  *
     25  * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
     26  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     27  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     28  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
     29  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     30  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     31  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     32  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     33  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     34  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     35  * POSSIBILITY OF SUCH DAMAGE.
     36  */
     37 
     38 /*******************************************************************************
     39 
     40   Copyright (c) 2001-2005, Intel Corporation
     41   All rights reserved.
     42 
     43   Redistribution and use in source and binary forms, with or without
     44   modification, are permitted provided that the following conditions are met:
     45 
     46    1. Redistributions of source code must retain the above copyright notice,
     47       this list of conditions and the following disclaimer.
     48 
     49    2. Redistributions in binary form must reproduce the above copyright
     50       notice, this list of conditions and the following disclaimer in the
     51       documentation and/or other materials provided with the distribution.
     52 
     53    3. Neither the name of the Intel Corporation nor the names of its
     54       contributors may be used to endorse or promote products derived from
     55       this software without specific prior written permission.
     56 
     57   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     58   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     59   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     60   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
     61   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     62   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     63   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     64   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     65   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     66   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     67   POSSIBILITY OF SUCH DAMAGE.
     68 
     69 *******************************************************************************/
     70 /*
     71  * Device driver for the Intel i8254x family of Gigabit Ethernet chips.
     72  *
     73  * TODO (in order of importance):
     74  *
     75  *	- Check XXX'ed comments
     76  *	- EEE (Energy Efficiency Ethernet)
     77  *	- Multi queue
     78  *	- Image Unique ID
     79  *	- LPLU other than PCH*
     80  *	- Virtual Function
     81  *	- Set LED correctly (based on contents in EEPROM)
     82  *	- Rework how parameters are loaded from the EEPROM.
     83  */
     84 
     85 #include <sys/cdefs.h>
     86 __KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.347 2015/09/07 15:19:05 msaitoh Exp $");
     87 
     88 #ifdef _KERNEL_OPT
     89 #include "opt_net_mpsafe.h"
     90 #endif
     91 
     92 #include <sys/param.h>
     93 #include <sys/systm.h>
     94 #include <sys/callout.h>
     95 #include <sys/mbuf.h>
     96 #include <sys/malloc.h>
     97 #include <sys/kernel.h>
     98 #include <sys/socket.h>
     99 #include <sys/ioctl.h>
    100 #include <sys/errno.h>
    101 #include <sys/device.h>
    102 #include <sys/queue.h>
    103 #include <sys/syslog.h>
    104 #include <sys/interrupt.h>
    105 
    106 #include <sys/rndsource.h>
    107 
    108 #include <net/if.h>
    109 #include <net/if_dl.h>
    110 #include <net/if_media.h>
    111 #include <net/if_ether.h>
    112 
    113 #include <net/bpf.h>
    114 
    115 #include <netinet/in.h>			/* XXX for struct ip */
    116 #include <netinet/in_systm.h>		/* XXX for struct ip */
    117 #include <netinet/ip.h>			/* XXX for struct ip */
    118 #include <netinet/ip6.h>		/* XXX for struct ip6_hdr */
    119 #include <netinet/tcp.h>		/* XXX for struct tcphdr */
    120 
    121 #include <sys/bus.h>
    122 #include <sys/intr.h>
    123 #include <machine/endian.h>
    124 
    125 #include <dev/mii/mii.h>
    126 #include <dev/mii/miivar.h>
    127 #include <dev/mii/miidevs.h>
    128 #include <dev/mii/mii_bitbang.h>
    129 #include <dev/mii/ikphyreg.h>
    130 #include <dev/mii/igphyreg.h>
    131 #include <dev/mii/igphyvar.h>
    132 #include <dev/mii/inbmphyreg.h>
    133 
    134 #include <dev/pci/pcireg.h>
    135 #include <dev/pci/pcivar.h>
    136 #include <dev/pci/pcidevs.h>
    137 
    138 #include <dev/pci/if_wmreg.h>
    139 #include <dev/pci/if_wmvar.h>
    140 
    141 #ifdef WM_DEBUG
    142 #define	WM_DEBUG_LINK		0x01
    143 #define	WM_DEBUG_TX		0x02
    144 #define	WM_DEBUG_RX		0x04
    145 #define	WM_DEBUG_GMII		0x08
    146 #define	WM_DEBUG_MANAGE		0x10
    147 #define	WM_DEBUG_NVM		0x20
    148 int	wm_debug = WM_DEBUG_TX | WM_DEBUG_RX | WM_DEBUG_LINK | WM_DEBUG_GMII
    149     | WM_DEBUG_MANAGE | WM_DEBUG_NVM;
    150 
    151 #define	DPRINTF(x, y)	if (wm_debug & (x)) printf y
    152 #else
    153 #define	DPRINTF(x, y)	/* nothing */
    154 #endif /* WM_DEBUG */
    155 
    156 #ifdef NET_MPSAFE
    157 #define WM_MPSAFE	1
    158 #endif
    159 
    160 #ifdef __HAVE_PCI_MSI_MSIX
    161 #define WM_MSI_MSIX	1 /* Enable by default */
    162 #endif
    163 
    164 /*
    165  * This device driver divides interrupt to TX, RX and link state.
    166  * Each MSI-X vector indexes are below.
    167  */
    168 #define WM_MSIX_NINTR		3
    169 #define WM_MSIX_TXINTR_IDX	0
    170 #define WM_MSIX_RXINTR_IDX	1
    171 #define WM_MSIX_LINKINTR_IDX	2
    172 #define WM_MAX_NINTR		WM_MSIX_NINTR
    173 
    174 /*
    175  * This device driver set affinity to each interrupts like below (round-robin).
    176  * If the number CPUs is less than the number of interrupts, this driver usase
    177  * the same CPU for multiple interrupts.
    178  */
    179 #define WM_MSIX_TXINTR_CPUID	0
    180 #define WM_MSIX_RXINTR_CPUID	1
    181 #define WM_MSIX_LINKINTR_CPUID	2
    182 
    183 /*
    184  * Transmit descriptor list size.  Due to errata, we can only have
    185  * 256 hardware descriptors in the ring on < 82544, but we use 4096
    186  * on >= 82544.  We tell the upper layers that they can queue a lot
    187  * of packets, and we go ahead and manage up to 64 (16 for the i82547)
    188  * of them at a time.
    189  *
    190  * We allow up to 256 (!) DMA segments per packet.  Pathological packet
    191  * chains containing many small mbufs have been observed in zero-copy
    192  * situations with jumbo frames.
    193  */
    194 #define	WM_NTXSEGS		256
    195 #define	WM_IFQUEUELEN		256
    196 #define	WM_TXQUEUELEN_MAX	64
    197 #define	WM_TXQUEUELEN_MAX_82547	16
    198 #define	WM_TXQUEUELEN(sc)	((sc)->sc_txnum)
    199 #define	WM_TXQUEUELEN_MASK(sc)	(WM_TXQUEUELEN(sc) - 1)
    200 #define	WM_TXQUEUE_GC(sc)	(WM_TXQUEUELEN(sc) / 8)
    201 #define	WM_NTXDESC_82542	256
    202 #define	WM_NTXDESC_82544	4096
    203 #define	WM_NTXDESC(sc)		((sc)->sc_ntxdesc)
    204 #define	WM_NTXDESC_MASK(sc)	(WM_NTXDESC(sc) - 1)
    205 #define	WM_TXDESCSIZE(sc)	(WM_NTXDESC(sc) * sizeof(wiseman_txdesc_t))
    206 #define	WM_NEXTTX(sc, x)	(((x) + 1) & WM_NTXDESC_MASK(sc))
    207 #define	WM_NEXTTXS(sc, x)	(((x) + 1) & WM_TXQUEUELEN_MASK(sc))
    208 
    209 #define	WM_MAXTXDMA		 (2 * round_page(IP_MAXPACKET)) /* for TSO */
    210 
    211 /*
    212  * Receive descriptor list size.  We have one Rx buffer for normal
    213  * sized packets.  Jumbo packets consume 5 Rx buffers for a full-sized
    214  * packet.  We allocate 256 receive descriptors, each with a 2k
    215  * buffer (MCLBYTES), which gives us room for 50 jumbo packets.
    216  */
    217 #define	WM_NRXDESC		256
    218 #define	WM_NRXDESC_MASK		(WM_NRXDESC - 1)
    219 #define	WM_NEXTRX(x)		(((x) + 1) & WM_NRXDESC_MASK)
    220 #define	WM_PREVRX(x)		(((x) - 1) & WM_NRXDESC_MASK)
    221 
    222 /*
    223  * Control structures are DMA'd to the i82542 chip.  We allocate them in
    224  * a single clump that maps to a single DMA segment to make several things
    225  * easier.
    226  */
    227 struct wm_control_data_82544 {
    228 	/*
    229 	 * The receive descriptors.
    230 	 */
    231 	wiseman_rxdesc_t wcd_rxdescs[WM_NRXDESC];
    232 
    233 	/*
    234 	 * The transmit descriptors.  Put these at the end, because
    235 	 * we might use a smaller number of them.
    236 	 */
    237 	union {
    238 		wiseman_txdesc_t wcdu_txdescs[WM_NTXDESC_82544];
    239 		nq_txdesc_t      wcdu_nq_txdescs[WM_NTXDESC_82544];
    240 	} wdc_u;
    241 };
    242 
    243 struct wm_control_data_82542 {
    244 	wiseman_rxdesc_t wcd_rxdescs[WM_NRXDESC];
    245 	wiseman_txdesc_t wcd_txdescs[WM_NTXDESC_82542];
    246 };
    247 
    248 #define	WM_CDOFF(x)	offsetof(struct wm_control_data_82544, x)
    249 #define	WM_CDTXOFF(x)	WM_CDOFF(wdc_u.wcdu_txdescs[(x)])
    250 #define	WM_CDRXOFF(x)	WM_CDOFF(wcd_rxdescs[(x)])
    251 
    252 /*
    253  * Software state for transmit jobs.
    254  */
    255 struct wm_txsoft {
    256 	struct mbuf *txs_mbuf;		/* head of our mbuf chain */
    257 	bus_dmamap_t txs_dmamap;	/* our DMA map */
    258 	int txs_firstdesc;		/* first descriptor in packet */
    259 	int txs_lastdesc;		/* last descriptor in packet */
    260 	int txs_ndesc;			/* # of descriptors used */
    261 };
    262 
    263 /*
    264  * Software state for receive buffers.  Each descriptor gets a
    265  * 2k (MCLBYTES) buffer and a DMA map.  For packets which fill
    266  * more than one buffer, we chain them together.
    267  */
    268 struct wm_rxsoft {
    269 	struct mbuf *rxs_mbuf;		/* head of our mbuf chain */
    270 	bus_dmamap_t rxs_dmamap;	/* our DMA map */
    271 };
    272 
    273 #define WM_LINKUP_TIMEOUT	50
    274 
    275 static uint16_t swfwphysem[] = {
    276 	SWFW_PHY0_SM,
    277 	SWFW_PHY1_SM,
    278 	SWFW_PHY2_SM,
    279 	SWFW_PHY3_SM
    280 };
    281 
    282 static const uint32_t wm_82580_rxpbs_table[] = {
    283 	36, 72, 144, 1, 2, 4, 8, 16, 35, 70, 140
    284 };
    285 
    286 /*
    287  * Software state per device.
    288  */
    289 struct wm_softc {
    290 	device_t sc_dev;		/* generic device information */
    291 	bus_space_tag_t sc_st;		/* bus space tag */
    292 	bus_space_handle_t sc_sh;	/* bus space handle */
    293 	bus_size_t sc_ss;		/* bus space size */
    294 	bus_space_tag_t sc_iot;		/* I/O space tag */
    295 	bus_space_handle_t sc_ioh;	/* I/O space handle */
    296 	bus_size_t sc_ios;		/* I/O space size */
    297 	bus_space_tag_t sc_flasht;	/* flash registers space tag */
    298 	bus_space_handle_t sc_flashh;	/* flash registers space handle */
    299 	bus_size_t sc_flashs;		/* flash registers space size */
    300 	bus_dma_tag_t sc_dmat;		/* bus DMA tag */
    301 
    302 	struct ethercom sc_ethercom;	/* ethernet common data */
    303 	struct mii_data sc_mii;		/* MII/media information */
    304 
    305 	pci_chipset_tag_t sc_pc;
    306 	pcitag_t sc_pcitag;
    307 	int sc_bus_speed;		/* PCI/PCIX bus speed */
    308 	int sc_pcixe_capoff;		/* PCI[Xe] capability reg offset */
    309 
    310 	uint16_t sc_pcidevid;		/* PCI device ID */
    311 	wm_chip_type sc_type;		/* MAC type */
    312 	int sc_rev;			/* MAC revision */
    313 	wm_phy_type sc_phytype;		/* PHY type */
    314 	uint32_t sc_mediatype;		/* Media type (Copper, Fiber, SERDES)*/
    315 #define	WM_MEDIATYPE_UNKNOWN		0x00
    316 #define	WM_MEDIATYPE_FIBER		0x01
    317 #define	WM_MEDIATYPE_COPPER		0x02
    318 #define	WM_MEDIATYPE_SERDES		0x03 /* Internal SERDES */
    319 	int sc_funcid;			/* unit number of the chip (0 to 3) */
    320 	int sc_flags;			/* flags; see below */
    321 	int sc_if_flags;		/* last if_flags */
    322 	int sc_flowflags;		/* 802.3x flow control flags */
    323 	int sc_align_tweak;
    324 
    325 	void *sc_ihs[WM_MAX_NINTR];	/*
    326 					 * interrupt cookie.
    327 					 * legacy and msi use sc_ihs[0].
    328 					 */
    329 	pci_intr_handle_t *sc_intrs;	/* legacy and msi use sc_intrs[0] */
    330 	int sc_nintrs;			/* number of interrupts */
    331 
    332 	callout_t sc_tick_ch;		/* tick callout */
    333 	bool sc_stopping;
    334 
    335 	int sc_nvm_ver_major;
    336 	int sc_nvm_ver_minor;
    337 	int sc_nvm_addrbits;		/* NVM address bits */
    338 	unsigned int sc_nvm_wordsize;	/* NVM word size */
    339 	int sc_ich8_flash_base;
    340 	int sc_ich8_flash_bank_size;
    341 	int sc_nvm_k1_enabled;
    342 
    343 	/* Software state for the transmit and receive descriptors. */
    344 	int sc_txnum;			/* must be a power of two */
    345 	struct wm_txsoft sc_txsoft[WM_TXQUEUELEN_MAX];
    346 	struct wm_rxsoft sc_rxsoft[WM_NRXDESC];
    347 
    348 	/* Control data structures. */
    349 	int sc_ntxdesc;			/* must be a power of two */
    350 	struct wm_control_data_82544 *sc_control_data;
    351 	bus_dmamap_t sc_cddmamap;	/* control data DMA map */
    352 	bus_dma_segment_t sc_cd_seg;	/* control data segment */
    353 	int sc_cd_rseg;			/* real number of control segment */
    354 	size_t sc_cd_size;		/* control data size */
    355 #define	sc_cddma	sc_cddmamap->dm_segs[0].ds_addr
    356 #define	sc_txdescs	sc_control_data->wdc_u.wcdu_txdescs
    357 #define	sc_nq_txdescs	sc_control_data->wdc_u.wcdu_nq_txdescs
    358 #define	sc_rxdescs	sc_control_data->wcd_rxdescs
    359 
    360 #ifdef WM_EVENT_COUNTERS
    361 	/* Event counters. */
    362 	struct evcnt sc_ev_txsstall;	/* Tx stalled due to no txs */
    363 	struct evcnt sc_ev_txdstall;	/* Tx stalled due to no txd */
    364 	struct evcnt sc_ev_txfifo_stall;/* Tx FIFO stalls (82547) */
    365 	struct evcnt sc_ev_txdw;	/* Tx descriptor interrupts */
    366 	struct evcnt sc_ev_txqe;	/* Tx queue empty interrupts */
    367 	struct evcnt sc_ev_rxintr;	/* Rx interrupts */
    368 	struct evcnt sc_ev_linkintr;	/* Link interrupts */
    369 
    370 	struct evcnt sc_ev_rxipsum;	/* IP checksums checked in-bound */
    371 	struct evcnt sc_ev_rxtusum;	/* TCP/UDP cksums checked in-bound */
    372 	struct evcnt sc_ev_txipsum;	/* IP checksums comp. out-bound */
    373 	struct evcnt sc_ev_txtusum;	/* TCP/UDP cksums comp. out-bound */
    374 	struct evcnt sc_ev_txtusum6;	/* TCP/UDP v6 cksums comp. out-bound */
    375 	struct evcnt sc_ev_txtso;	/* TCP seg offload out-bound (IPv4) */
    376 	struct evcnt sc_ev_txtso6;	/* TCP seg offload out-bound (IPv6) */
    377 	struct evcnt sc_ev_txtsopain;	/* painful header manip. for TSO */
    378 
    379 	struct evcnt sc_ev_txseg[WM_NTXSEGS]; /* Tx packets w/ N segments */
    380 	struct evcnt sc_ev_txdrop;	/* Tx packets dropped (too many segs) */
    381 
    382 	struct evcnt sc_ev_tu;		/* Tx underrun */
    383 
    384 	struct evcnt sc_ev_tx_xoff;	/* Tx PAUSE(!0) frames */
    385 	struct evcnt sc_ev_tx_xon;	/* Tx PAUSE(0) frames */
    386 	struct evcnt sc_ev_rx_xoff;	/* Rx PAUSE(!0) frames */
    387 	struct evcnt sc_ev_rx_xon;	/* Rx PAUSE(0) frames */
    388 	struct evcnt sc_ev_rx_macctl;	/* Rx Unsupported */
    389 #endif /* WM_EVENT_COUNTERS */
    390 
    391 	bus_addr_t sc_tdt_reg;		/* offset of TDT register */
    392 
    393 	int	sc_txfree;		/* number of free Tx descriptors */
    394 	int	sc_txnext;		/* next ready Tx descriptor */
    395 
    396 	int	sc_txsfree;		/* number of free Tx jobs */
    397 	int	sc_txsnext;		/* next free Tx job */
    398 	int	sc_txsdirty;		/* dirty Tx jobs */
    399 
    400 	/* These 5 variables are used only on the 82547. */
    401 	int	sc_txfifo_size;		/* Tx FIFO size */
    402 	int	sc_txfifo_head;		/* current head of FIFO */
    403 	uint32_t sc_txfifo_addr;	/* internal address of start of FIFO */
    404 	int	sc_txfifo_stall;	/* Tx FIFO is stalled */
    405 	callout_t sc_txfifo_ch;		/* Tx FIFO stall work-around timer */
    406 
    407 	bus_addr_t sc_rdt_reg;		/* offset of RDT register */
    408 
    409 	int	sc_rxptr;		/* next ready Rx descriptor/queue ent */
    410 	int	sc_rxdiscard;
    411 	int	sc_rxlen;
    412 	struct mbuf *sc_rxhead;
    413 	struct mbuf *sc_rxtail;
    414 	struct mbuf **sc_rxtailp;
    415 
    416 	uint32_t sc_ctrl;		/* prototype CTRL register */
    417 #if 0
    418 	uint32_t sc_ctrl_ext;		/* prototype CTRL_EXT register */
    419 #endif
    420 	uint32_t sc_icr;		/* prototype interrupt bits */
    421 	uint32_t sc_itr;		/* prototype intr throttling reg */
    422 	uint32_t sc_tctl;		/* prototype TCTL register */
    423 	uint32_t sc_rctl;		/* prototype RCTL register */
    424 	uint32_t sc_txcw;		/* prototype TXCW register */
    425 	uint32_t sc_tipg;		/* prototype TIPG register */
    426 	uint32_t sc_fcrtl;		/* prototype FCRTL register */
    427 	uint32_t sc_pba;		/* prototype PBA register */
    428 
    429 	int sc_tbi_linkup;		/* TBI link status */
    430 	int sc_tbi_serdes_anegticks;	/* autonegotiation ticks */
    431 	int sc_tbi_serdes_ticks;	/* tbi ticks */
    432 
    433 	int sc_mchash_type;		/* multicast filter offset */
    434 
    435 	krndsource_t rnd_source;	/* random source */
    436 
    437 	kmutex_t *sc_tx_lock;		/* lock for tx operations */
    438 	kmutex_t *sc_rx_lock;		/* lock for rx operations */
    439 };
    440 
    441 #define WM_TX_LOCK(_sc)		if ((_sc)->sc_tx_lock) mutex_enter((_sc)->sc_tx_lock)
    442 #define WM_TX_UNLOCK(_sc)	if ((_sc)->sc_tx_lock) mutex_exit((_sc)->sc_tx_lock)
    443 #define WM_TX_LOCKED(_sc)	(!(_sc)->sc_tx_lock || mutex_owned((_sc)->sc_tx_lock))
    444 #define WM_RX_LOCK(_sc)		if ((_sc)->sc_rx_lock) mutex_enter((_sc)->sc_rx_lock)
    445 #define WM_RX_UNLOCK(_sc)	if ((_sc)->sc_rx_lock) mutex_exit((_sc)->sc_rx_lock)
    446 #define WM_RX_LOCKED(_sc)	(!(_sc)->sc_rx_lock || mutex_owned((_sc)->sc_rx_lock))
    447 #define WM_BOTH_LOCK(_sc)	do {WM_TX_LOCK(_sc); WM_RX_LOCK(_sc);} while (0)
    448 #define WM_BOTH_UNLOCK(_sc)	do {WM_RX_UNLOCK(_sc); WM_TX_UNLOCK(_sc);} while (0)
    449 #define WM_BOTH_LOCKED(_sc)	(WM_TX_LOCKED(_sc) && WM_RX_LOCKED(_sc))
    450 
    451 #ifdef WM_MPSAFE
    452 #define CALLOUT_FLAGS	CALLOUT_MPSAFE
    453 #else
    454 #define CALLOUT_FLAGS	0
    455 #endif
    456 
    457 #define	WM_RXCHAIN_RESET(sc)						\
    458 do {									\
    459 	(sc)->sc_rxtailp = &(sc)->sc_rxhead;				\
    460 	*(sc)->sc_rxtailp = NULL;					\
    461 	(sc)->sc_rxlen = 0;						\
    462 } while (/*CONSTCOND*/0)
    463 
    464 #define	WM_RXCHAIN_LINK(sc, m)						\
    465 do {									\
    466 	*(sc)->sc_rxtailp = (sc)->sc_rxtail = (m);			\
    467 	(sc)->sc_rxtailp = &(m)->m_next;				\
    468 } while (/*CONSTCOND*/0)
    469 
    470 #ifdef WM_EVENT_COUNTERS
    471 #define	WM_EVCNT_INCR(ev)	(ev)->ev_count++
    472 #define	WM_EVCNT_ADD(ev, val)	(ev)->ev_count += (val)
    473 #else
    474 #define	WM_EVCNT_INCR(ev)	/* nothing */
    475 #define	WM_EVCNT_ADD(ev, val)	/* nothing */
    476 #endif
    477 
    478 #define	CSR_READ(sc, reg)						\
    479 	bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg))
    480 #define	CSR_WRITE(sc, reg, val)						\
    481 	bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val))
    482 #define	CSR_WRITE_FLUSH(sc)						\
    483 	(void) CSR_READ((sc), WMREG_STATUS)
    484 
    485 #define ICH8_FLASH_READ32(sc, reg) \
    486 	bus_space_read_4((sc)->sc_flasht, (sc)->sc_flashh, (reg))
    487 #define ICH8_FLASH_WRITE32(sc, reg, data) \
    488 	bus_space_write_4((sc)->sc_flasht, (sc)->sc_flashh, (reg), (data))
    489 
    490 #define ICH8_FLASH_READ16(sc, reg) \
    491 	bus_space_read_2((sc)->sc_flasht, (sc)->sc_flashh, (reg))
    492 #define ICH8_FLASH_WRITE16(sc, reg, data) \
    493 	bus_space_write_2((sc)->sc_flasht, (sc)->sc_flashh, (reg), (data))
    494 
    495 #define	WM_CDTXADDR(sc, x)	((sc)->sc_cddma + WM_CDTXOFF((x)))
    496 #define	WM_CDRXADDR(sc, x)	((sc)->sc_cddma + WM_CDRXOFF((x)))
    497 
    498 #define	WM_CDTXADDR_LO(sc, x)	(WM_CDTXADDR((sc), (x)) & 0xffffffffU)
    499 #define	WM_CDTXADDR_HI(sc, x)						\
    500 	(sizeof(bus_addr_t) == 8 ?					\
    501 	 (uint64_t)WM_CDTXADDR((sc), (x)) >> 32 : 0)
    502 
    503 #define	WM_CDRXADDR_LO(sc, x)	(WM_CDRXADDR((sc), (x)) & 0xffffffffU)
    504 #define	WM_CDRXADDR_HI(sc, x)						\
    505 	(sizeof(bus_addr_t) == 8 ?					\
    506 	 (uint64_t)WM_CDRXADDR((sc), (x)) >> 32 : 0)
    507 
    508 #define	WM_CDTXSYNC(sc, x, n, ops)					\
    509 do {									\
    510 	int __x, __n;							\
    511 									\
    512 	__x = (x);							\
    513 	__n = (n);							\
    514 									\
    515 	/* If it will wrap around, sync to the end of the ring. */	\
    516 	if ((__x + __n) > WM_NTXDESC(sc)) {				\
    517 		bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_cddmamap,	\
    518 		    WM_CDTXOFF(__x), sizeof(wiseman_txdesc_t) *		\
    519 		    (WM_NTXDESC(sc) - __x), (ops));			\
    520 		__n -= (WM_NTXDESC(sc) - __x);				\
    521 		__x = 0;						\
    522 	}								\
    523 									\
    524 	/* Now sync whatever is left. */				\
    525 	bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_cddmamap,		\
    526 	    WM_CDTXOFF(__x), sizeof(wiseman_txdesc_t) * __n, (ops));	\
    527 } while (/*CONSTCOND*/0)
    528 
    529 #define	WM_CDRXSYNC(sc, x, ops)						\
    530 do {									\
    531 	bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_cddmamap,		\
    532 	   WM_CDRXOFF((x)), sizeof(wiseman_rxdesc_t), (ops));		\
    533 } while (/*CONSTCOND*/0)
    534 
    535 #define	WM_INIT_RXDESC(sc, x)						\
    536 do {									\
    537 	struct wm_rxsoft *__rxs = &(sc)->sc_rxsoft[(x)];		\
    538 	wiseman_rxdesc_t *__rxd = &(sc)->sc_rxdescs[(x)];		\
    539 	struct mbuf *__m = __rxs->rxs_mbuf;				\
    540 									\
    541 	/*								\
    542 	 * Note: We scoot the packet forward 2 bytes in the buffer	\
    543 	 * so that the payload after the Ethernet header is aligned	\
    544 	 * to a 4-byte boundary.					\
    545 	 *								\
    546 	 * XXX BRAINDAMAGE ALERT!					\
    547 	 * The stupid chip uses the same size for every buffer, which	\
    548 	 * is set in the Receive Control register.  We are using the 2K	\
    549 	 * size option, but what we REALLY want is (2K - 2)!  For this	\
    550 	 * reason, we can't "scoot" packets longer than the standard	\
    551 	 * Ethernet MTU.  On strict-alignment platforms, if the total	\
    552 	 * size exceeds (2K - 2) we set align_tweak to 0 and let	\
    553 	 * the upper layer copy the headers.				\
    554 	 */								\
    555 	__m->m_data = __m->m_ext.ext_buf + (sc)->sc_align_tweak;	\
    556 									\
    557 	wm_set_dma_addr(&__rxd->wrx_addr,				\
    558 	    __rxs->rxs_dmamap->dm_segs[0].ds_addr + (sc)->sc_align_tweak); \
    559 	__rxd->wrx_len = 0;						\
    560 	__rxd->wrx_cksum = 0;						\
    561 	__rxd->wrx_status = 0;						\
    562 	__rxd->wrx_errors = 0;						\
    563 	__rxd->wrx_special = 0;						\
    564 	WM_CDRXSYNC((sc), (x), BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); \
    565 									\
    566 	CSR_WRITE((sc), (sc)->sc_rdt_reg, (x));				\
    567 } while (/*CONSTCOND*/0)
    568 
    569 /*
    570  * Register read/write functions.
    571  * Other than CSR_{READ|WRITE}().
    572  */
    573 #if 0
    574 static inline uint32_t wm_io_read(struct wm_softc *, int);
    575 #endif
    576 static inline void wm_io_write(struct wm_softc *, int, uint32_t);
    577 static inline void wm_82575_write_8bit_ctlr_reg(struct wm_softc *, uint32_t,
    578 	uint32_t, uint32_t);
    579 static inline void wm_set_dma_addr(volatile wiseman_addr_t *, bus_addr_t);
    580 
    581 /*
    582  * Device driver interface functions and commonly used functions.
    583  * match, attach, detach, init, start, stop, ioctl, watchdog and so on.
    584  */
    585 static const struct wm_product *wm_lookup(const struct pci_attach_args *);
    586 static int	wm_match(device_t, cfdata_t, void *);
    587 static void	wm_attach(device_t, device_t, void *);
    588 static int	wm_detach(device_t, int);
    589 static bool	wm_suspend(device_t, const pmf_qual_t *);
    590 static bool	wm_resume(device_t, const pmf_qual_t *);
    591 static void	wm_watchdog(struct ifnet *);
    592 static void	wm_tick(void *);
    593 static int	wm_ifflags_cb(struct ethercom *);
    594 static int	wm_ioctl(struct ifnet *, u_long, void *);
    595 /* MAC address related */
    596 static uint16_t	wm_check_alt_mac_addr(struct wm_softc *);
    597 static int	wm_read_mac_addr(struct wm_softc *, uint8_t *);
    598 static void	wm_set_ral(struct wm_softc *, const uint8_t *, int);
    599 static uint32_t	wm_mchash(struct wm_softc *, const uint8_t *);
    600 static void	wm_set_filter(struct wm_softc *);
    601 /* Reset and init related */
    602 static void	wm_set_vlan(struct wm_softc *);
    603 static void	wm_set_pcie_completion_timeout(struct wm_softc *);
    604 static void	wm_get_auto_rd_done(struct wm_softc *);
    605 static void	wm_lan_init_done(struct wm_softc *);
    606 static void	wm_get_cfg_done(struct wm_softc *);
    607 static void	wm_initialize_hardware_bits(struct wm_softc *);
    608 static uint32_t	wm_rxpbs_adjust_82580(uint32_t);
    609 static void	wm_reset(struct wm_softc *);
    610 static int	wm_add_rxbuf(struct wm_softc *, int);
    611 static void	wm_rxdrain(struct wm_softc *);
    612 static int	wm_init(struct ifnet *);
    613 static int	wm_init_locked(struct ifnet *);
    614 static void	wm_stop(struct ifnet *, int);
    615 static void	wm_stop_locked(struct ifnet *, int);
    616 static int	wm_tx_offload(struct wm_softc *, struct wm_txsoft *,
    617     uint32_t *, uint8_t *);
    618 static void	wm_dump_mbuf_chain(struct wm_softc *, struct mbuf *);
    619 static void	wm_82547_txfifo_stall(void *);
    620 static int	wm_82547_txfifo_bugchk(struct wm_softc *, struct mbuf *);
    621 /* Start */
    622 static void	wm_start(struct ifnet *);
    623 static void	wm_start_locked(struct ifnet *);
    624 static int	wm_nq_tx_offload(struct wm_softc *, struct wm_txsoft *,
    625     uint32_t *, uint32_t *, bool *);
    626 static void	wm_nq_start(struct ifnet *);
    627 static void	wm_nq_start_locked(struct ifnet *);
    628 /* Interrupt */
    629 static int	wm_txeof(struct wm_softc *);
    630 static void	wm_rxeof(struct wm_softc *);
    631 static void	wm_linkintr_gmii(struct wm_softc *, uint32_t);
    632 static void	wm_linkintr_tbi(struct wm_softc *, uint32_t);
    633 static void	wm_linkintr_serdes(struct wm_softc *, uint32_t);
    634 static void	wm_linkintr(struct wm_softc *, uint32_t);
    635 static int	wm_intr_legacy(void *);
    636 #ifdef WM_MSI_MSIX
    637 static int	wm_txintr_msix(void *);
    638 static int	wm_rxintr_msix(void *);
    639 static int	wm_linkintr_msix(void *);
    640 #endif
    641 
    642 /*
    643  * Media related.
    644  * GMII, SGMII, TBI, SERDES and SFP.
    645  */
    646 /* Common */
    647 static void	wm_tbi_serdes_set_linkled(struct wm_softc *);
    648 /* GMII related */
    649 static void	wm_gmii_reset(struct wm_softc *);
    650 static int	wm_get_phy_id_82575(struct wm_softc *);
    651 static void	wm_gmii_mediainit(struct wm_softc *, pci_product_id_t);
    652 static int	wm_gmii_mediachange(struct ifnet *);
    653 static void	wm_gmii_mediastatus(struct ifnet *, struct ifmediareq *);
    654 static void	wm_i82543_mii_sendbits(struct wm_softc *, uint32_t, int);
    655 static uint32_t	wm_i82543_mii_recvbits(struct wm_softc *);
    656 static int	wm_gmii_i82543_readreg(device_t, int, int);
    657 static void	wm_gmii_i82543_writereg(device_t, int, int, int);
    658 static int	wm_gmii_i82544_readreg(device_t, int, int);
    659 static void	wm_gmii_i82544_writereg(device_t, int, int, int);
    660 static int	wm_gmii_i80003_readreg(device_t, int, int);
    661 static void	wm_gmii_i80003_writereg(device_t, int, int, int);
    662 static int	wm_gmii_bm_readreg(device_t, int, int);
    663 static void	wm_gmii_bm_writereg(device_t, int, int, int);
    664 static void	wm_access_phy_wakeup_reg_bm(device_t, int, int16_t *, int);
    665 static int	wm_gmii_hv_readreg(device_t, int, int);
    666 static void	wm_gmii_hv_writereg(device_t, int, int, int);
    667 static int	wm_gmii_82580_readreg(device_t, int, int);
    668 static void	wm_gmii_82580_writereg(device_t, int, int, int);
    669 static int	wm_gmii_gs40g_readreg(device_t, int, int);
    670 static void	wm_gmii_gs40g_writereg(device_t, int, int, int);
    671 static void	wm_gmii_statchg(struct ifnet *);
    672 static int	wm_kmrn_readreg(struct wm_softc *, int);
    673 static void	wm_kmrn_writereg(struct wm_softc *, int, int);
    674 /* SGMII */
    675 static bool	wm_sgmii_uses_mdio(struct wm_softc *);
    676 static int	wm_sgmii_readreg(device_t, int, int);
    677 static void	wm_sgmii_writereg(device_t, int, int, int);
    678 /* TBI related */
    679 static void	wm_tbi_mediainit(struct wm_softc *);
    680 static int	wm_tbi_mediachange(struct ifnet *);
    681 static void	wm_tbi_mediastatus(struct ifnet *, struct ifmediareq *);
    682 static int	wm_check_for_link(struct wm_softc *);
    683 static void	wm_tbi_tick(struct wm_softc *);
    684 /* SERDES related */
    685 static void	wm_serdes_power_up_link_82575(struct wm_softc *);
    686 static int	wm_serdes_mediachange(struct ifnet *);
    687 static void	wm_serdes_mediastatus(struct ifnet *, struct ifmediareq *);
    688 static void	wm_serdes_tick(struct wm_softc *);
    689 /* SFP related */
    690 static int	wm_sfp_read_data_byte(struct wm_softc *, uint16_t, uint8_t *);
    691 static uint32_t	wm_sfp_get_media_type(struct wm_softc *);
    692 
    693 /*
    694  * NVM related.
    695  * Microwire, SPI (w/wo EERD) and Flash.
    696  */
    697 /* Misc functions */
    698 static void	wm_eeprom_sendbits(struct wm_softc *, uint32_t, int);
    699 static void	wm_eeprom_recvbits(struct wm_softc *, uint32_t *, int);
    700 static int	wm_nvm_set_addrbits_size_eecd(struct wm_softc *);
    701 /* Microwire */
    702 static int	wm_nvm_read_uwire(struct wm_softc *, int, int, uint16_t *);
    703 /* SPI */
    704 static int	wm_nvm_ready_spi(struct wm_softc *);
    705 static int	wm_nvm_read_spi(struct wm_softc *, int, int, uint16_t *);
    706 /* Using with EERD */
    707 static int	wm_poll_eerd_eewr_done(struct wm_softc *, int);
    708 static int	wm_nvm_read_eerd(struct wm_softc *, int, int, uint16_t *);
    709 /* Flash */
    710 static int	wm_nvm_valid_bank_detect_ich8lan(struct wm_softc *,
    711     unsigned int *);
    712 static int32_t	wm_ich8_cycle_init(struct wm_softc *);
    713 static int32_t	wm_ich8_flash_cycle(struct wm_softc *, uint32_t);
    714 static int32_t	wm_read_ich8_data(struct wm_softc *, uint32_t, uint32_t,
    715 	uint16_t *);
    716 static int32_t	wm_read_ich8_byte(struct wm_softc *, uint32_t, uint8_t *);
    717 static int32_t	wm_read_ich8_word(struct wm_softc *, uint32_t, uint16_t *);
    718 static int	wm_nvm_read_ich8(struct wm_softc *, int, int, uint16_t *);
    719 /* iNVM */
    720 static int	wm_nvm_read_word_invm(struct wm_softc *, uint16_t, uint16_t *);
    721 static int	wm_nvm_read_invm(struct wm_softc *, int, int, uint16_t *);
    722 /* Lock, detecting NVM type, validate checksum and read */
    723 static int	wm_nvm_acquire(struct wm_softc *);
    724 static void	wm_nvm_release(struct wm_softc *);
    725 static int	wm_nvm_is_onboard_eeprom(struct wm_softc *);
    726 static int	wm_nvm_get_flash_presence_i210(struct wm_softc *);
    727 static int	wm_nvm_validate_checksum(struct wm_softc *);
    728 static void	wm_nvm_version_invm(struct wm_softc *);
    729 static void	wm_nvm_version(struct wm_softc *);
    730 static int	wm_nvm_read(struct wm_softc *, int, int, uint16_t *);
    731 
    732 /*
    733  * Hardware semaphores.
    734  * Very complexed...
    735  */
    736 static int	wm_get_swsm_semaphore(struct wm_softc *);
    737 static void	wm_put_swsm_semaphore(struct wm_softc *);
    738 static int	wm_get_swfw_semaphore(struct wm_softc *, uint16_t);
    739 static void	wm_put_swfw_semaphore(struct wm_softc *, uint16_t);
    740 static int	wm_get_swfwhw_semaphore(struct wm_softc *);
    741 static void	wm_put_swfwhw_semaphore(struct wm_softc *);
    742 static int	wm_get_hw_semaphore_82573(struct wm_softc *);
    743 static void	wm_put_hw_semaphore_82573(struct wm_softc *);
    744 
    745 /*
    746  * Management mode and power management related subroutines.
    747  * BMC, AMT, suspend/resume and EEE.
    748  */
    749 static int	wm_check_mng_mode(struct wm_softc *);
    750 static int	wm_check_mng_mode_ich8lan(struct wm_softc *);
    751 static int	wm_check_mng_mode_82574(struct wm_softc *);
    752 static int	wm_check_mng_mode_generic(struct wm_softc *);
    753 static int	wm_enable_mng_pass_thru(struct wm_softc *);
    754 static int	wm_check_reset_block(struct wm_softc *);
    755 static void	wm_get_hw_control(struct wm_softc *);
    756 static void	wm_release_hw_control(struct wm_softc *);
    757 static void	wm_gate_hw_phy_config_ich8lan(struct wm_softc *, int);
    758 static void	wm_smbustopci(struct wm_softc *);
    759 static void	wm_init_manageability(struct wm_softc *);
    760 static void	wm_release_manageability(struct wm_softc *);
    761 static void	wm_get_wakeup(struct wm_softc *);
    762 #ifdef WM_WOL
    763 static void	wm_enable_phy_wakeup(struct wm_softc *);
    764 static void	wm_igp3_phy_powerdown_workaround_ich8lan(struct wm_softc *);
    765 static void	wm_enable_wakeup(struct wm_softc *);
    766 #endif
    767 /* EEE */
    768 static void	wm_set_eee_i350(struct wm_softc *);
    769 
    770 /*
    771  * Workarounds (mainly PHY related).
    772  * Basically, PHY's workarounds are in the PHY drivers.
    773  */
    774 static void	wm_kmrn_lock_loss_workaround_ich8lan(struct wm_softc *);
    775 static void	wm_gig_downshift_workaround_ich8lan(struct wm_softc *);
    776 static void	wm_hv_phy_workaround_ich8lan(struct wm_softc *);
    777 static void	wm_lv_phy_workaround_ich8lan(struct wm_softc *);
    778 static void	wm_k1_gig_workaround_hv(struct wm_softc *, int);
    779 static void	wm_set_mdio_slow_mode_hv(struct wm_softc *);
    780 static void	wm_configure_k1_ich8lan(struct wm_softc *, int);
    781 static void	wm_reset_init_script_82575(struct wm_softc *);
    782 static void	wm_reset_mdicnfg_82580(struct wm_softc *);
    783 static void	wm_pll_workaround_i210(struct wm_softc *);
    784 
    785 #ifdef WM_MSI_MSIX
    786 struct _msix_matrix {
    787 	const char *intrname;
    788 	int(*func)(void *);
    789 	int intridx;
    790 	int cpuid;
    791 } msix_matrix[WM_MSIX_NINTR] = {
    792 	{ "TX", wm_txintr_msix, WM_MSIX_TXINTR_IDX, WM_MSIX_TXINTR_CPUID },
    793 	{ "RX", wm_rxintr_msix, WM_MSIX_RXINTR_IDX, WM_MSIX_RXINTR_CPUID },
    794 	{ "LINK", wm_linkintr_msix, WM_MSIX_LINKINTR_IDX,
    795 	  WM_MSIX_LINKINTR_CPUID },
    796 };
    797 #endif
    798 
    799 CFATTACH_DECL3_NEW(wm, sizeof(struct wm_softc),
    800     wm_match, wm_attach, wm_detach, NULL, NULL, NULL, DVF_DETACH_SHUTDOWN);
    801 
    802 /*
    803  * Devices supported by this driver.
    804  */
    805 static const struct wm_product {
    806 	pci_vendor_id_t		wmp_vendor;
    807 	pci_product_id_t	wmp_product;
    808 	const char		*wmp_name;
    809 	wm_chip_type		wmp_type;
    810 	uint32_t		wmp_flags;
    811 #define	WMP_F_UNKNOWN		WM_MEDIATYPE_UNKNOWN
    812 #define	WMP_F_FIBER		WM_MEDIATYPE_FIBER
    813 #define	WMP_F_COPPER		WM_MEDIATYPE_COPPER
    814 #define	WMP_F_SERDES		WM_MEDIATYPE_SERDES
    815 #define WMP_MEDIATYPE(x)	((x) & 0x03)
    816 } wm_products[] = {
    817 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82542,
    818 	  "Intel i82542 1000BASE-X Ethernet",
    819 	  WM_T_82542_2_1,	WMP_F_FIBER },
    820 
    821 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82543GC_FIBER,
    822 	  "Intel i82543GC 1000BASE-X Ethernet",
    823 	  WM_T_82543,		WMP_F_FIBER },
    824 
    825 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82543GC_COPPER,
    826 	  "Intel i82543GC 1000BASE-T Ethernet",
    827 	  WM_T_82543,		WMP_F_COPPER },
    828 
    829 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82544EI_COPPER,
    830 	  "Intel i82544EI 1000BASE-T Ethernet",
    831 	  WM_T_82544,		WMP_F_COPPER },
    832 
    833 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82544EI_FIBER,
    834 	  "Intel i82544EI 1000BASE-X Ethernet",
    835 	  WM_T_82544,		WMP_F_FIBER },
    836 
    837 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82544GC_COPPER,
    838 	  "Intel i82544GC 1000BASE-T Ethernet",
    839 	  WM_T_82544,		WMP_F_COPPER },
    840 
    841 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82544GC_LOM,
    842 	  "Intel i82544GC (LOM) 1000BASE-T Ethernet",
    843 	  WM_T_82544,		WMP_F_COPPER },
    844 
    845 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82540EM,
    846 	  "Intel i82540EM 1000BASE-T Ethernet",
    847 	  WM_T_82540,		WMP_F_COPPER },
    848 
    849 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82540EM_LOM,
    850 	  "Intel i82540EM (LOM) 1000BASE-T Ethernet",
    851 	  WM_T_82540,		WMP_F_COPPER },
    852 
    853 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82540EP_LOM,
    854 	  "Intel i82540EP 1000BASE-T Ethernet",
    855 	  WM_T_82540,		WMP_F_COPPER },
    856 
    857 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82540EP,
    858 	  "Intel i82540EP 1000BASE-T Ethernet",
    859 	  WM_T_82540,		WMP_F_COPPER },
    860 
    861 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82540EP_LP,
    862 	  "Intel i82540EP 1000BASE-T Ethernet",
    863 	  WM_T_82540,		WMP_F_COPPER },
    864 
    865 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82545EM_COPPER,
    866 	  "Intel i82545EM 1000BASE-T Ethernet",
    867 	  WM_T_82545,		WMP_F_COPPER },
    868 
    869 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82545GM_COPPER,
    870 	  "Intel i82545GM 1000BASE-T Ethernet",
    871 	  WM_T_82545_3,		WMP_F_COPPER },
    872 
    873 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82545GM_FIBER,
    874 	  "Intel i82545GM 1000BASE-X Ethernet",
    875 	  WM_T_82545_3,		WMP_F_FIBER },
    876 
    877 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82545GM_SERDES,
    878 	  "Intel i82545GM Gigabit Ethernet (SERDES)",
    879 	  WM_T_82545_3,		WMP_F_SERDES },
    880 
    881 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82546EB_COPPER,
    882 	  "Intel i82546EB 1000BASE-T Ethernet",
    883 	  WM_T_82546,		WMP_F_COPPER },
    884 
    885 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82546EB_QUAD,
    886 	  "Intel i82546EB 1000BASE-T Ethernet",
    887 	  WM_T_82546,		WMP_F_COPPER },
    888 
    889 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82545EM_FIBER,
    890 	  "Intel i82545EM 1000BASE-X Ethernet",
    891 	  WM_T_82545,		WMP_F_FIBER },
    892 
    893 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82546EB_FIBER,
    894 	  "Intel i82546EB 1000BASE-X Ethernet",
    895 	  WM_T_82546,		WMP_F_FIBER },
    896 
    897 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82546GB_COPPER,
    898 	  "Intel i82546GB 1000BASE-T Ethernet",
    899 	  WM_T_82546_3,		WMP_F_COPPER },
    900 
    901 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82546GB_FIBER,
    902 	  "Intel i82546GB 1000BASE-X Ethernet",
    903 	  WM_T_82546_3,		WMP_F_FIBER },
    904 
    905 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82546GB_SERDES,
    906 	  "Intel i82546GB Gigabit Ethernet (SERDES)",
    907 	  WM_T_82546_3,		WMP_F_SERDES },
    908 
    909 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER,
    910 	  "i82546GB quad-port Gigabit Ethernet",
    911 	  WM_T_82546_3,		WMP_F_COPPER },
    912 
    913 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER_KSP3,
    914 	  "i82546GB quad-port Gigabit Ethernet (KSP3)",
    915 	  WM_T_82546_3,		WMP_F_COPPER },
    916 
    917 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82546GB_PCIE,
    918 	  "Intel PRO/1000MT (82546GB)",
    919 	  WM_T_82546_3,		WMP_F_COPPER },
    920 
    921 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82541EI,
    922 	  "Intel i82541EI 1000BASE-T Ethernet",
    923 	  WM_T_82541,		WMP_F_COPPER },
    924 
    925 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82541ER_LOM,
    926 	  "Intel i82541ER (LOM) 1000BASE-T Ethernet",
    927 	  WM_T_82541,		WMP_F_COPPER },
    928 
    929 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82541EI_MOBILE,
    930 	  "Intel i82541EI Mobile 1000BASE-T Ethernet",
    931 	  WM_T_82541,		WMP_F_COPPER },
    932 
    933 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82541ER,
    934 	  "Intel i82541ER 1000BASE-T Ethernet",
    935 	  WM_T_82541_2,		WMP_F_COPPER },
    936 
    937 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82541GI,
    938 	  "Intel i82541GI 1000BASE-T Ethernet",
    939 	  WM_T_82541_2,		WMP_F_COPPER },
    940 
    941 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82541GI_MOBILE,
    942 	  "Intel i82541GI Mobile 1000BASE-T Ethernet",
    943 	  WM_T_82541_2,		WMP_F_COPPER },
    944 
    945 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82541PI,
    946 	  "Intel i82541PI 1000BASE-T Ethernet",
    947 	  WM_T_82541_2,		WMP_F_COPPER },
    948 
    949 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82547EI,
    950 	  "Intel i82547EI 1000BASE-T Ethernet",
    951 	  WM_T_82547,		WMP_F_COPPER },
    952 
    953 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82547EI_MOBILE,
    954 	  "Intel i82547EI Mobile 1000BASE-T Ethernet",
    955 	  WM_T_82547,		WMP_F_COPPER },
    956 
    957 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82547GI,
    958 	  "Intel i82547GI 1000BASE-T Ethernet",
    959 	  WM_T_82547_2,		WMP_F_COPPER },
    960 
    961 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82571EB_COPPER,
    962 	  "Intel PRO/1000 PT (82571EB)",
    963 	  WM_T_82571,		WMP_F_COPPER },
    964 
    965 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82571EB_FIBER,
    966 	  "Intel PRO/1000 PF (82571EB)",
    967 	  WM_T_82571,		WMP_F_FIBER },
    968 
    969 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82571EB_SERDES,
    970 	  "Intel PRO/1000 PB (82571EB)",
    971 	  WM_T_82571,		WMP_F_SERDES },
    972 
    973 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82571EB_QUAD_COPPER,
    974 	  "Intel PRO/1000 QT (82571EB)",
    975 	  WM_T_82571,		WMP_F_COPPER },
    976 
    977 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82571GB_QUAD_COPPER,
    978 	  "Intel PRO/1000 PT Quad Port Server Adapter",
    979 	  WM_T_82571,		WMP_F_COPPER, },
    980 
    981 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82571PT_QUAD_COPPER,
    982 	  "Intel Gigabit PT Quad Port Server ExpressModule",
    983 	  WM_T_82571,		WMP_F_COPPER, },
    984 
    985 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82571EB_DUAL_SERDES,
    986 	  "Intel 82571EB Dual Gigabit Ethernet (SERDES)",
    987 	  WM_T_82571,		WMP_F_SERDES, },
    988 
    989 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82571EB_QUAD_SERDES,
    990 	  "Intel 82571EB Quad Gigabit Ethernet (SERDES)",
    991 	  WM_T_82571,		WMP_F_SERDES, },
    992 
    993 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82571EB_QUAD_FIBER,
    994 	  "Intel 82571EB Quad 1000baseX Ethernet",
    995 	  WM_T_82571,		WMP_F_FIBER, },
    996 
    997 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82572EI_COPPER,
    998 	  "Intel i82572EI 1000baseT Ethernet",
    999 	  WM_T_82572,		WMP_F_COPPER },
   1000 
   1001 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82572EI_FIBER,
   1002 	  "Intel i82572EI 1000baseX Ethernet",
   1003 	  WM_T_82572,		WMP_F_FIBER },
   1004 
   1005 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82572EI_SERDES,
   1006 	  "Intel i82572EI Gigabit Ethernet (SERDES)",
   1007 	  WM_T_82572,		WMP_F_SERDES },
   1008 
   1009 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82572EI,
   1010 	  "Intel i82572EI 1000baseT Ethernet",
   1011 	  WM_T_82572,		WMP_F_COPPER },
   1012 
   1013 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82573E,
   1014 	  "Intel i82573E",
   1015 	  WM_T_82573,		WMP_F_COPPER },
   1016 
   1017 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82573E_IAMT,
   1018 	  "Intel i82573E IAMT",
   1019 	  WM_T_82573,		WMP_F_COPPER },
   1020 
   1021 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82573L,
   1022 	  "Intel i82573L Gigabit Ethernet",
   1023 	  WM_T_82573,		WMP_F_COPPER },
   1024 
   1025 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82574L,
   1026 	  "Intel i82574L",
   1027 	  WM_T_82574,		WMP_F_COPPER },
   1028 
   1029 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82574LA,
   1030 	  "Intel i82574L",
   1031 	  WM_T_82574,		WMP_F_COPPER },
   1032 
   1033 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82583V,
   1034 	  "Intel i82583V",
   1035 	  WM_T_82583,		WMP_F_COPPER },
   1036 
   1037 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_80K3LAN_CPR_DPT,
   1038 	  "i80003 dual 1000baseT Ethernet",
   1039 	  WM_T_80003,		WMP_F_COPPER },
   1040 
   1041 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_80K3LAN_FIB_DPT,
   1042 	  "i80003 dual 1000baseX Ethernet",
   1043 	  WM_T_80003,		WMP_F_COPPER },
   1044 
   1045 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_80K3LAN_SDS_DPT,
   1046 	  "Intel i80003ES2 dual Gigabit Ethernet (SERDES)",
   1047 	  WM_T_80003,		WMP_F_SERDES },
   1048 
   1049 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_80K3LAN_CPR_SPT,
   1050 	  "Intel i80003 1000baseT Ethernet",
   1051 	  WM_T_80003,		WMP_F_COPPER },
   1052 
   1053 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_80K3LAN_SDS_SPT,
   1054 	  "Intel i80003 Gigabit Ethernet (SERDES)",
   1055 	  WM_T_80003,		WMP_F_SERDES },
   1056 
   1057 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82801H_M_AMT,
   1058 	  "Intel i82801H (M_AMT) LAN Controller",
   1059 	  WM_T_ICH8,		WMP_F_COPPER },
   1060 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82801H_AMT,
   1061 	  "Intel i82801H (AMT) LAN Controller",
   1062 	  WM_T_ICH8,		WMP_F_COPPER },
   1063 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82801H_LAN,
   1064 	  "Intel i82801H LAN Controller",
   1065 	  WM_T_ICH8,		WMP_F_COPPER },
   1066 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82801H_IFE_LAN,
   1067 	  "Intel i82801H (IFE) LAN Controller",
   1068 	  WM_T_ICH8,		WMP_F_COPPER },
   1069 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82801H_M_LAN,
   1070 	  "Intel i82801H (M) LAN Controller",
   1071 	  WM_T_ICH8,		WMP_F_COPPER },
   1072 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82801H_IFE_GT,
   1073 	  "Intel i82801H IFE (GT) LAN Controller",
   1074 	  WM_T_ICH8,		WMP_F_COPPER },
   1075 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82801H_IFE_G,
   1076 	  "Intel i82801H IFE (G) LAN Controller",
   1077 	  WM_T_ICH8,		WMP_F_COPPER },
   1078 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82801I_IGP_AMT,
   1079 	  "82801I (AMT) LAN Controller",
   1080 	  WM_T_ICH9,		WMP_F_COPPER },
   1081 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82801I_IFE,
   1082 	  "82801I LAN Controller",
   1083 	  WM_T_ICH9,		WMP_F_COPPER },
   1084 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82801I_IFE_G,
   1085 	  "82801I (G) LAN Controller",
   1086 	  WM_T_ICH9,		WMP_F_COPPER },
   1087 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82801I_IFE_GT,
   1088 	  "82801I (GT) LAN Controller",
   1089 	  WM_T_ICH9,		WMP_F_COPPER },
   1090 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82801I_IGP_C,
   1091 	  "82801I (C) LAN Controller",
   1092 	  WM_T_ICH9,		WMP_F_COPPER },
   1093 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82801I_IGP_M,
   1094 	  "82801I mobile LAN Controller",
   1095 	  WM_T_ICH9,		WMP_F_COPPER },
   1096 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82801H_IGP_M_V,
   1097 	  "82801I mobile (V) LAN Controller",
   1098 	  WM_T_ICH9,		WMP_F_COPPER },
   1099 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82801I_IGP_M_AMT,
   1100 	  "82801I mobile (AMT) LAN Controller",
   1101 	  WM_T_ICH9,		WMP_F_COPPER },
   1102 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82801I_BM,
   1103 	  "82567LM-4 LAN Controller",
   1104 	  WM_T_ICH9,		WMP_F_COPPER },
   1105 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82801I_82567V_3,
   1106 	  "82567V-3 LAN Controller",
   1107 	  WM_T_ICH9,		WMP_F_COPPER },
   1108 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82801J_R_BM_LM,
   1109 	  "82567LM-2 LAN Controller",
   1110 	  WM_T_ICH10,		WMP_F_COPPER },
   1111 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82801J_R_BM_LF,
   1112 	  "82567LF-2 LAN Controller",
   1113 	  WM_T_ICH10,		WMP_F_COPPER },
   1114 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82801J_D_BM_LM,
   1115 	  "82567LM-3 LAN Controller",
   1116 	  WM_T_ICH10,		WMP_F_COPPER },
   1117 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82801J_D_BM_LF,
   1118 	  "82567LF-3 LAN Controller",
   1119 	  WM_T_ICH10,		WMP_F_COPPER },
   1120 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82801J_R_BM_V,
   1121 	  "82567V-2 LAN Controller",
   1122 	  WM_T_ICH10,		WMP_F_COPPER },
   1123 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82801J_D_BM_V,
   1124 	  "82567V-3? LAN Controller",
   1125 	  WM_T_ICH10,		WMP_F_COPPER },
   1126 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_HANKSVILLE,
   1127 	  "HANKSVILLE LAN Controller",
   1128 	  WM_T_ICH10,		WMP_F_COPPER },
   1129 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_PCH_M_LM,
   1130 	  "PCH LAN (82577LM) Controller",
   1131 	  WM_T_PCH,		WMP_F_COPPER },
   1132 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_PCH_M_LC,
   1133 	  "PCH LAN (82577LC) Controller",
   1134 	  WM_T_PCH,		WMP_F_COPPER },
   1135 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_PCH_D_DM,
   1136 	  "PCH LAN (82578DM) Controller",
   1137 	  WM_T_PCH,		WMP_F_COPPER },
   1138 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_PCH_D_DC,
   1139 	  "PCH LAN (82578DC) Controller",
   1140 	  WM_T_PCH,		WMP_F_COPPER },
   1141 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_PCH2_LV_LM,
   1142 	  "PCH2 LAN (82579LM) Controller",
   1143 	  WM_T_PCH2,		WMP_F_COPPER },
   1144 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_PCH2_LV_V,
   1145 	  "PCH2 LAN (82579V) Controller",
   1146 	  WM_T_PCH2,		WMP_F_COPPER },
   1147 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82575EB_COPPER,
   1148 	  "82575EB dual-1000baseT Ethernet",
   1149 	  WM_T_82575,		WMP_F_COPPER },
   1150 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82575EB_FIBER_SERDES,
   1151 	  "82575EB dual-1000baseX Ethernet (SERDES)",
   1152 	  WM_T_82575,		WMP_F_SERDES },
   1153 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82575GB_QUAD_COPPER,
   1154 	  "82575GB quad-1000baseT Ethernet",
   1155 	  WM_T_82575,		WMP_F_COPPER },
   1156 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82575GB_QUAD_COPPER_PM,
   1157 	  "82575GB quad-1000baseT Ethernet (PM)",
   1158 	  WM_T_82575,		WMP_F_COPPER },
   1159 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82576_COPPER,
   1160 	  "82576 1000BaseT Ethernet",
   1161 	  WM_T_82576,		WMP_F_COPPER },
   1162 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82576_FIBER,
   1163 	  "82576 1000BaseX Ethernet",
   1164 	  WM_T_82576,		WMP_F_FIBER },
   1165 
   1166 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82576_SERDES,
   1167 	  "82576 gigabit Ethernet (SERDES)",
   1168 	  WM_T_82576,		WMP_F_SERDES },
   1169 
   1170 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82576_QUAD_COPPER,
   1171 	  "82576 quad-1000BaseT Ethernet",
   1172 	  WM_T_82576,		WMP_F_COPPER },
   1173 
   1174 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82576_QUAD_COPPER_ET2,
   1175 	  "82576 Gigabit ET2 Quad Port Server Adapter",
   1176 	  WM_T_82576,		WMP_F_COPPER },
   1177 
   1178 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82576_NS,
   1179 	  "82576 gigabit Ethernet",
   1180 	  WM_T_82576,		WMP_F_COPPER },
   1181 
   1182 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82576_NS_SERDES,
   1183 	  "82576 gigabit Ethernet (SERDES)",
   1184 	  WM_T_82576,		WMP_F_SERDES },
   1185 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82576_SERDES_QUAD,
   1186 	  "82576 quad-gigabit Ethernet (SERDES)",
   1187 	  WM_T_82576,		WMP_F_SERDES },
   1188 
   1189 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82580_COPPER,
   1190 	  "82580 1000BaseT Ethernet",
   1191 	  WM_T_82580,		WMP_F_COPPER },
   1192 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82580_FIBER,
   1193 	  "82580 1000BaseX Ethernet",
   1194 	  WM_T_82580,		WMP_F_FIBER },
   1195 
   1196 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82580_SERDES,
   1197 	  "82580 1000BaseT Ethernet (SERDES)",
   1198 	  WM_T_82580,		WMP_F_SERDES },
   1199 
   1200 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82580_SGMII,
   1201 	  "82580 gigabit Ethernet (SGMII)",
   1202 	  WM_T_82580,		WMP_F_COPPER },
   1203 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82580_COPPER_DUAL,
   1204 	  "82580 dual-1000BaseT Ethernet",
   1205 	  WM_T_82580,		WMP_F_COPPER },
   1206 
   1207 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_82580_QUAD_FIBER,
   1208 	  "82580 quad-1000BaseX Ethernet",
   1209 	  WM_T_82580,		WMP_F_FIBER },
   1210 
   1211 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_DH89XXCC_SGMII,
   1212 	  "DH89XXCC Gigabit Ethernet (SGMII)",
   1213 	  WM_T_82580,		WMP_F_COPPER },
   1214 
   1215 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_DH89XXCC_SERDES,
   1216 	  "DH89XXCC Gigabit Ethernet (SERDES)",
   1217 	  WM_T_82580,		WMP_F_SERDES },
   1218 
   1219 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_DH89XXCC_BPLANE,
   1220 	  "DH89XXCC 1000BASE-KX Ethernet",
   1221 	  WM_T_82580,		WMP_F_SERDES },
   1222 
   1223 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_DH89XXCC_SFP,
   1224 	  "DH89XXCC Gigabit Ethernet (SFP)",
   1225 	  WM_T_82580,		WMP_F_SERDES },
   1226 
   1227 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_I350_COPPER,
   1228 	  "I350 Gigabit Network Connection",
   1229 	  WM_T_I350,		WMP_F_COPPER },
   1230 
   1231 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_I350_FIBER,
   1232 	  "I350 Gigabit Fiber Network Connection",
   1233 	  WM_T_I350,		WMP_F_FIBER },
   1234 
   1235 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_I350_SERDES,
   1236 	  "I350 Gigabit Backplane Connection",
   1237 	  WM_T_I350,		WMP_F_SERDES },
   1238 
   1239 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_I350_DA4,
   1240 	  "I350 Quad Port Gigabit Ethernet",
   1241 	  WM_T_I350,		WMP_F_SERDES },
   1242 
   1243 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_I350_SGMII,
   1244 	  "I350 Gigabit Connection",
   1245 	  WM_T_I350,		WMP_F_COPPER },
   1246 
   1247 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_C2000_1000KX,
   1248 	  "I354 Gigabit Ethernet (KX)",
   1249 	  WM_T_I354,		WMP_F_SERDES },
   1250 
   1251 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_C2000_SGMII,
   1252 	  "I354 Gigabit Ethernet (SGMII)",
   1253 	  WM_T_I354,		WMP_F_COPPER },
   1254 
   1255 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_C2000_25GBE,
   1256 	  "I354 Gigabit Ethernet (2.5G)",
   1257 	  WM_T_I354,		WMP_F_COPPER },
   1258 
   1259 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_I210_T1,
   1260 	  "I210-T1 Ethernet Server Adapter",
   1261 	  WM_T_I210,		WMP_F_COPPER },
   1262 
   1263 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_I210_COPPER_OEM1,
   1264 	  "I210 Ethernet (Copper OEM)",
   1265 	  WM_T_I210,		WMP_F_COPPER },
   1266 
   1267 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_I210_COPPER_IT,
   1268 	  "I210 Ethernet (Copper IT)",
   1269 	  WM_T_I210,		WMP_F_COPPER },
   1270 
   1271 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_I210_COPPER_WOF,
   1272 	  "I210 Ethernet (FLASH less)",
   1273 	  WM_T_I210,		WMP_F_COPPER },
   1274 
   1275 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_I210_FIBER,
   1276 	  "I210 Gigabit Ethernet (Fiber)",
   1277 	  WM_T_I210,		WMP_F_FIBER },
   1278 
   1279 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_I210_SERDES,
   1280 	  "I210 Gigabit Ethernet (SERDES)",
   1281 	  WM_T_I210,		WMP_F_SERDES },
   1282 
   1283 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_I210_SERDES_WOF,
   1284 	  "I210 Gigabit Ethernet (FLASH less)",
   1285 	  WM_T_I210,		WMP_F_SERDES },
   1286 
   1287 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_I210_SGMII,
   1288 	  "I210 Gigabit Ethernet (SGMII)",
   1289 	  WM_T_I210,		WMP_F_COPPER },
   1290 
   1291 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_I211_COPPER,
   1292 	  "I211 Ethernet (COPPER)",
   1293 	  WM_T_I211,		WMP_F_COPPER },
   1294 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_I217_V,
   1295 	  "I217 V Ethernet Connection",
   1296 	  WM_T_PCH_LPT,		WMP_F_COPPER },
   1297 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_I217_LM,
   1298 	  "I217 LM Ethernet Connection",
   1299 	  WM_T_PCH_LPT,		WMP_F_COPPER },
   1300 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_I218_V,
   1301 	  "I218 V Ethernet Connection",
   1302 	  WM_T_PCH_LPT,		WMP_F_COPPER },
   1303 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_I218_V2,
   1304 	  "I218 V Ethernet Connection",
   1305 	  WM_T_PCH_LPT,		WMP_F_COPPER },
   1306 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_I218_V3,
   1307 	  "I218 V Ethernet Connection",
   1308 	  WM_T_PCH_LPT,		WMP_F_COPPER },
   1309 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_I218_LM,
   1310 	  "I218 LM Ethernet Connection",
   1311 	  WM_T_PCH_LPT,		WMP_F_COPPER },
   1312 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_I218_LM2,
   1313 	  "I218 LM Ethernet Connection",
   1314 	  WM_T_PCH_LPT,		WMP_F_COPPER },
   1315 	{ PCI_VENDOR_INTEL,	PCI_PRODUCT_INTEL_I218_LM3,
   1316 	  "I218 LM Ethernet Connection",
   1317 	  WM_T_PCH_LPT,		WMP_F_COPPER },
   1318 	{ 0,			0,
   1319 	  NULL,
   1320 	  0,			0 },
   1321 };
   1322 
   1323 #ifdef WM_EVENT_COUNTERS
   1324 static char wm_txseg_evcnt_names[WM_NTXSEGS][sizeof("txsegXXX")];
   1325 #endif /* WM_EVENT_COUNTERS */
   1326 
   1327 
   1328 /*
   1329  * Register read/write functions.
   1330  * Other than CSR_{READ|WRITE}().
   1331  */
   1332 
   1333 #if 0 /* Not currently used */
   1334 static inline uint32_t
   1335 wm_io_read(struct wm_softc *sc, int reg)
   1336 {
   1337 
   1338 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, 0, reg);
   1339 	return (bus_space_read_4(sc->sc_iot, sc->sc_ioh, 4));
   1340 }
   1341 #endif
   1342 
   1343 static inline void
   1344 wm_io_write(struct wm_softc *sc, int reg, uint32_t val)
   1345 {
   1346 
   1347 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, 0, reg);
   1348 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, 4, val);
   1349 }
   1350 
   1351 static inline void
   1352 wm_82575_write_8bit_ctlr_reg(struct wm_softc *sc, uint32_t reg, uint32_t off,
   1353     uint32_t data)
   1354 {
   1355 	uint32_t regval;
   1356 	int i;
   1357 
   1358 	regval = (data & SCTL_CTL_DATA_MASK) | (off << SCTL_CTL_ADDR_SHIFT);
   1359 
   1360 	CSR_WRITE(sc, reg, regval);
   1361 
   1362 	for (i = 0; i < SCTL_CTL_POLL_TIMEOUT; i++) {
   1363 		delay(5);
   1364 		if (CSR_READ(sc, reg) & SCTL_CTL_READY)
   1365 			break;
   1366 	}
   1367 	if (i == SCTL_CTL_POLL_TIMEOUT) {
   1368 		aprint_error("%s: WARNING:"
   1369 		    " i82575 reg 0x%08x setup did not indicate ready\n",
   1370 		    device_xname(sc->sc_dev), reg);
   1371 	}
   1372 }
   1373 
   1374 static inline void
   1375 wm_set_dma_addr(volatile wiseman_addr_t *wa, bus_addr_t v)
   1376 {
   1377 	wa->wa_low = htole32(v & 0xffffffffU);
   1378 	if (sizeof(bus_addr_t) == 8)
   1379 		wa->wa_high = htole32((uint64_t) v >> 32);
   1380 	else
   1381 		wa->wa_high = 0;
   1382 }
   1383 
   1384 /*
   1385  * Device driver interface functions and commonly used functions.
   1386  * match, attach, detach, init, start, stop, ioctl, watchdog and so on.
   1387  */
   1388 
   1389 /* Lookup supported device table */
   1390 static const struct wm_product *
   1391 wm_lookup(const struct pci_attach_args *pa)
   1392 {
   1393 	const struct wm_product *wmp;
   1394 
   1395 	for (wmp = wm_products; wmp->wmp_name != NULL; wmp++) {
   1396 		if (PCI_VENDOR(pa->pa_id) == wmp->wmp_vendor &&
   1397 		    PCI_PRODUCT(pa->pa_id) == wmp->wmp_product)
   1398 			return wmp;
   1399 	}
   1400 	return NULL;
   1401 }
   1402 
   1403 /* The match function (ca_match) */
   1404 static int
   1405 wm_match(device_t parent, cfdata_t cf, void *aux)
   1406 {
   1407 	struct pci_attach_args *pa = aux;
   1408 
   1409 	if (wm_lookup(pa) != NULL)
   1410 		return 1;
   1411 
   1412 	return 0;
   1413 }
   1414 
   1415 /* The attach function (ca_attach) */
   1416 static void
   1417 wm_attach(device_t parent, device_t self, void *aux)
   1418 {
   1419 	struct wm_softc *sc = device_private(self);
   1420 	struct pci_attach_args *pa = aux;
   1421 	prop_dictionary_t dict;
   1422 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
   1423 	pci_chipset_tag_t pc = pa->pa_pc;
   1424 #ifndef WM_MSI_MSIX
   1425 	pci_intr_handle_t ih;
   1426 #else
   1427 	int counts[PCI_INTR_TYPE_SIZE];
   1428 	pci_intr_type_t max_type;
   1429 #endif
   1430 	const char *intrstr = NULL;
   1431 	const char *eetype, *xname;
   1432 	bus_space_tag_t memt;
   1433 	bus_space_handle_t memh;
   1434 	bus_size_t memsize;
   1435 	int memh_valid;
   1436 	int i, error;
   1437 	const struct wm_product *wmp;
   1438 	prop_data_t ea;
   1439 	prop_number_t pn;
   1440 	uint8_t enaddr[ETHER_ADDR_LEN];
   1441 	uint16_t cfg1, cfg2, swdpin, nvmword;
   1442 	pcireg_t preg, memtype;
   1443 	uint16_t eeprom_data, apme_mask;
   1444 	bool force_clear_smbi;
   1445 	uint32_t link_mode;
   1446 	uint32_t reg;
   1447 	char intrbuf[PCI_INTRSTR_LEN];
   1448 
   1449 	sc->sc_dev = self;
   1450 	callout_init(&sc->sc_tick_ch, CALLOUT_FLAGS);
   1451 	sc->sc_stopping = false;
   1452 
   1453 	wmp = wm_lookup(pa);
   1454 #ifdef DIAGNOSTIC
   1455 	if (wmp == NULL) {
   1456 		printf("\n");
   1457 		panic("wm_attach: impossible");
   1458 	}
   1459 #endif
   1460 	sc->sc_mediatype = WMP_MEDIATYPE(wmp->wmp_flags);
   1461 
   1462 	sc->sc_pc = pa->pa_pc;
   1463 	sc->sc_pcitag = pa->pa_tag;
   1464 
   1465 	if (pci_dma64_available(pa))
   1466 		sc->sc_dmat = pa->pa_dmat64;
   1467 	else
   1468 		sc->sc_dmat = pa->pa_dmat;
   1469 
   1470 	sc->sc_pcidevid = PCI_PRODUCT(pa->pa_id);
   1471 	sc->sc_rev = PCI_REVISION(pci_conf_read(pc, pa->pa_tag, PCI_CLASS_REG));
   1472 	pci_aprint_devinfo_fancy(pa, "Ethernet controller", wmp->wmp_name, 1);
   1473 
   1474 	sc->sc_type = wmp->wmp_type;
   1475 	if (sc->sc_type < WM_T_82543) {
   1476 		if (sc->sc_rev < 2) {
   1477 			aprint_error_dev(sc->sc_dev,
   1478 			    "i82542 must be at least rev. 2\n");
   1479 			return;
   1480 		}
   1481 		if (sc->sc_rev < 3)
   1482 			sc->sc_type = WM_T_82542_2_0;
   1483 	}
   1484 
   1485 	/*
   1486 	 * Disable MSI for Errata:
   1487 	 * "Message Signaled Interrupt Feature May Corrupt Write Transactions"
   1488 	 *
   1489 	 *  82544: Errata 25
   1490 	 *  82540: Errata  6 (easy to reproduce device timeout)
   1491 	 *  82545: Errata  4 (easy to reproduce device timeout)
   1492 	 *  82546: Errata 26 (easy to reproduce device timeout)
   1493 	 *  82541: Errata  7 (easy to reproduce device timeout)
   1494 	 *
   1495 	 * "Byte Enables 2 and 3 are not set on MSI writes"
   1496 	 *
   1497 	 *  82571 & 82572: Errata 63
   1498 	 */
   1499 	if ((sc->sc_type <= WM_T_82541_2) || (sc->sc_type == WM_T_82571)
   1500 	    || (sc->sc_type == WM_T_82572))
   1501 		pa->pa_flags &= ~PCI_FLAGS_MSI_OKAY;
   1502 
   1503 	if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
   1504 	    || (sc->sc_type == WM_T_82580)
   1505 	    || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)
   1506 	    || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211))
   1507 		sc->sc_flags |= WM_F_NEWQUEUE;
   1508 
   1509 	/* Set device properties (mactype) */
   1510 	dict = device_properties(sc->sc_dev);
   1511 	prop_dictionary_set_uint32(dict, "mactype", sc->sc_type);
   1512 
   1513 	/*
   1514 	 * Map the device.  All devices support memory-mapped acccess,
   1515 	 * and it is really required for normal operation.
   1516 	 */
   1517 	memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, WM_PCI_MMBA);
   1518 	switch (memtype) {
   1519 	case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT:
   1520 	case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT:
   1521 		memh_valid = (pci_mapreg_map(pa, WM_PCI_MMBA,
   1522 		    memtype, 0, &memt, &memh, NULL, &memsize) == 0);
   1523 		break;
   1524 	default:
   1525 		memh_valid = 0;
   1526 		break;
   1527 	}
   1528 
   1529 	if (memh_valid) {
   1530 		sc->sc_st = memt;
   1531 		sc->sc_sh = memh;
   1532 		sc->sc_ss = memsize;
   1533 	} else {
   1534 		aprint_error_dev(sc->sc_dev,
   1535 		    "unable to map device registers\n");
   1536 		return;
   1537 	}
   1538 
   1539 	/*
   1540 	 * In addition, i82544 and later support I/O mapped indirect
   1541 	 * register access.  It is not desirable (nor supported in
   1542 	 * this driver) to use it for normal operation, though it is
   1543 	 * required to work around bugs in some chip versions.
   1544 	 */
   1545 	if (sc->sc_type >= WM_T_82544) {
   1546 		/* First we have to find the I/O BAR. */
   1547 		for (i = PCI_MAPREG_START; i < PCI_MAPREG_END; i += 4) {
   1548 			memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, i);
   1549 			if (memtype == PCI_MAPREG_TYPE_IO)
   1550 				break;
   1551 			if (PCI_MAPREG_MEM_TYPE(memtype) ==
   1552 			    PCI_MAPREG_MEM_TYPE_64BIT)
   1553 				i += 4;	/* skip high bits, too */
   1554 		}
   1555 		if (i < PCI_MAPREG_END) {
   1556 			/*
   1557 			 * We found PCI_MAPREG_TYPE_IO. Note that 82580
   1558 			 * (and newer?) chip has no PCI_MAPREG_TYPE_IO.
   1559 			 * It's no problem because newer chips has no this
   1560 			 * bug.
   1561 			 *
   1562 			 * The i8254x doesn't apparently respond when the
   1563 			 * I/O BAR is 0, which looks somewhat like it's not
   1564 			 * been configured.
   1565 			 */
   1566 			preg = pci_conf_read(pc, pa->pa_tag, i);
   1567 			if (PCI_MAPREG_MEM_ADDR(preg) == 0) {
   1568 				aprint_error_dev(sc->sc_dev,
   1569 				    "WARNING: I/O BAR at zero.\n");
   1570 			} else if (pci_mapreg_map(pa, i, PCI_MAPREG_TYPE_IO,
   1571 					0, &sc->sc_iot, &sc->sc_ioh,
   1572 					NULL, &sc->sc_ios) == 0) {
   1573 				sc->sc_flags |= WM_F_IOH_VALID;
   1574 			} else {
   1575 				aprint_error_dev(sc->sc_dev,
   1576 				    "WARNING: unable to map I/O space\n");
   1577 			}
   1578 		}
   1579 
   1580 	}
   1581 
   1582 	/* Enable bus mastering.  Disable MWI on the i82542 2.0. */
   1583 	preg = pci_conf_read(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
   1584 	preg |= PCI_COMMAND_MASTER_ENABLE;
   1585 	if (sc->sc_type < WM_T_82542_2_1)
   1586 		preg &= ~PCI_COMMAND_INVALIDATE_ENABLE;
   1587 	pci_conf_write(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, preg);
   1588 
   1589 	/* power up chip */
   1590 	if ((error = pci_activate(pa->pa_pc, pa->pa_tag, self,
   1591 	    NULL)) && error != EOPNOTSUPP) {
   1592 		aprint_error_dev(sc->sc_dev, "cannot activate %d\n", error);
   1593 		return;
   1594 	}
   1595 
   1596 #ifndef WM_MSI_MSIX
   1597 	/*
   1598 	 * Map and establish our interrupt.
   1599 	 */
   1600 	if (pci_intr_map(pa, &ih)) {
   1601 		aprint_error_dev(sc->sc_dev, "unable to map interrupt\n");
   1602 		return;
   1603 	}
   1604 	intrstr = pci_intr_string(pc, ih, intrbuf, sizeof(intrbuf));
   1605 #ifdef WM_MPSAFE
   1606 	pci_intr_setattr(pc, &ih, PCI_INTR_MPSAFE, true);
   1607 #endif
   1608 	sc->sc_ihs[0] = pci_intr_establish_xname(pc, ih, IPL_NET,
   1609 	    wm_intr_legacy, sc, device_xname(sc->sc_dev));
   1610 	if (sc->sc_ihs[0] == NULL) {
   1611 		aprint_error_dev(sc->sc_dev, "unable to establish interrupt");
   1612 		if (intrstr != NULL)
   1613 			aprint_error(" at %s", intrstr);
   1614 		aprint_error("\n");
   1615 		return;
   1616 	}
   1617 	aprint_normal_dev(sc->sc_dev, "interrupting at %s\n", intrstr);
   1618 	sc->sc_nintrs = 1;
   1619 #else /* WM_MSI_MSIX */
   1620 	/* Allocation settings */
   1621 	max_type = PCI_INTR_TYPE_MSIX;
   1622 	counts[PCI_INTR_TYPE_MSIX] = WM_MAX_NINTR;
   1623 	counts[PCI_INTR_TYPE_MSI] = 1;
   1624 	counts[PCI_INTR_TYPE_INTX] = 1;
   1625 
   1626 alloc_retry:
   1627 	if (pci_intr_alloc(pa, &sc->sc_intrs, counts, max_type) != 0) {
   1628 		aprint_error_dev(sc->sc_dev, "failed to allocate interrupt\n");
   1629 		return;
   1630 	}
   1631 
   1632 	if (pci_intr_type(sc->sc_intrs[0]) == PCI_INTR_TYPE_MSIX) {
   1633 		void *vih;
   1634 		kcpuset_t *affinity;
   1635 		char intr_xname[INTRDEVNAMEBUF];
   1636 
   1637 		kcpuset_create(&affinity, false);
   1638 
   1639 		for (i = 0; i < WM_MSIX_NINTR; i++) {
   1640 			intrstr = pci_intr_string(pc,
   1641 			    sc->sc_intrs[msix_matrix[i].intridx], intrbuf,
   1642 			    sizeof(intrbuf));
   1643 #ifdef WM_MPSAFE
   1644 			pci_intr_setattr(pc,
   1645 			    &sc->sc_intrs[msix_matrix[i].intridx],
   1646 			    PCI_INTR_MPSAFE, true);
   1647 #endif
   1648 			memset(intr_xname, 0, sizeof(intr_xname));
   1649 			strlcat(intr_xname, device_xname(sc->sc_dev),
   1650 			    sizeof(intr_xname));
   1651 			strlcat(intr_xname, msix_matrix[i].intrname,
   1652 			    sizeof(intr_xname));
   1653 			vih = pci_intr_establish_xname(pc,
   1654 			    sc->sc_intrs[msix_matrix[i].intridx], IPL_NET,
   1655 			    msix_matrix[i].func, sc, intr_xname);
   1656 			if (vih == NULL) {
   1657 				aprint_error_dev(sc->sc_dev,
   1658 				    "unable to establish MSI-X(for %s)%s%s\n",
   1659 				    msix_matrix[i].intrname,
   1660 				    intrstr ? " at " : "",
   1661 				    intrstr ? intrstr : "");
   1662 				pci_intr_release(sc->sc_pc, sc->sc_intrs,
   1663 				    WM_MSIX_NINTR);
   1664 				kcpuset_destroy(affinity);
   1665 
   1666 				/* Setup for MSI: Disable MSI-X */
   1667 				max_type = PCI_INTR_TYPE_MSI;
   1668 				counts[PCI_INTR_TYPE_MSI] = 1;
   1669 				counts[PCI_INTR_TYPE_INTX] = 1;
   1670 				goto alloc_retry;
   1671 			}
   1672 			kcpuset_zero(affinity);
   1673 			/* Round-robin affinity */
   1674 			kcpuset_set(affinity, msix_matrix[i].cpuid % ncpu);
   1675 			error = interrupt_distribute(vih, affinity, NULL);
   1676 			if (error == 0) {
   1677 				aprint_normal_dev(sc->sc_dev,
   1678 				    "for %s interrupting at %s affinity to %u\n",
   1679 				    msix_matrix[i].intrname, intrstr,
   1680 				    msix_matrix[i].cpuid % ncpu);
   1681 			} else {
   1682 				aprint_normal_dev(sc->sc_dev,
   1683 				    "for %s interrupting at %s\n",
   1684 				    msix_matrix[i].intrname, intrstr);
   1685 			}
   1686 			sc->sc_ihs[msix_matrix[i].intridx] = vih;
   1687 		}
   1688 
   1689 		sc->sc_nintrs = WM_MSIX_NINTR;
   1690 		kcpuset_destroy(affinity);
   1691 	} else {
   1692 		/* MSI or INTx */
   1693 		intrstr = pci_intr_string(pc, sc->sc_intrs[0], intrbuf,
   1694 		    sizeof(intrbuf));
   1695 #ifdef WM_MPSAFE
   1696 		pci_intr_setattr(pc, &sc->sc_intrs[0], PCI_INTR_MPSAFE, true);
   1697 #endif
   1698 		sc->sc_ihs[0] = pci_intr_establish_xname(pc, sc->sc_intrs[0],
   1699 		    IPL_NET, wm_intr_legacy, sc, device_xname(sc->sc_dev));
   1700 		if (sc->sc_ihs[0] == NULL) {
   1701 			aprint_error_dev(sc->sc_dev,"unable to establish %s\n",
   1702 			    (pci_intr_type(sc->sc_intrs[0])
   1703 				== PCI_INTR_TYPE_MSI) ? "MSI" : "INTx");
   1704 			pci_intr_release(sc->sc_pc, sc->sc_intrs, 1);
   1705 			switch (pci_intr_type(sc->sc_intrs[0])) {
   1706 			case PCI_INTR_TYPE_MSI:
   1707 				/* The next try is for INTx: Disable MSI */
   1708 				max_type = PCI_INTR_TYPE_INTX;
   1709 				counts[PCI_INTR_TYPE_INTX] = 1;
   1710 				goto alloc_retry;
   1711 			case PCI_INTR_TYPE_INTX:
   1712 			default:
   1713 				return;
   1714 			}
   1715 		}
   1716 		aprint_normal_dev(sc->sc_dev, "%s at %s\n",
   1717 		    (pci_intr_type(sc->sc_intrs[0]) == PCI_INTR_TYPE_MSI)
   1718 			? "MSI" : "interrupting", intrstr);
   1719 
   1720 		sc->sc_nintrs = 1;
   1721 	}
   1722 #endif /* WM_MSI_MSIX */
   1723 
   1724 	/*
   1725 	 * Check the function ID (unit number of the chip).
   1726 	 */
   1727 	if ((sc->sc_type == WM_T_82546) || (sc->sc_type == WM_T_82546_3)
   1728 	    || (sc->sc_type ==  WM_T_82571) || (sc->sc_type == WM_T_80003)
   1729 	    || (sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
   1730 	    || (sc->sc_type == WM_T_82580)
   1731 	    || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354))
   1732 		sc->sc_funcid = (CSR_READ(sc, WMREG_STATUS)
   1733 		    >> STATUS_FUNCID_SHIFT) & STATUS_FUNCID_MASK;
   1734 	else
   1735 		sc->sc_funcid = 0;
   1736 
   1737 	/*
   1738 	 * Determine a few things about the bus we're connected to.
   1739 	 */
   1740 	if (sc->sc_type < WM_T_82543) {
   1741 		/* We don't really know the bus characteristics here. */
   1742 		sc->sc_bus_speed = 33;
   1743 	} else if (sc->sc_type == WM_T_82547 || sc->sc_type == WM_T_82547_2) {
   1744 		/*
   1745 		 * CSA (Communication Streaming Architecture) is about as fast
   1746 		 * a 32-bit 66MHz PCI Bus.
   1747 		 */
   1748 		sc->sc_flags |= WM_F_CSA;
   1749 		sc->sc_bus_speed = 66;
   1750 		aprint_verbose_dev(sc->sc_dev,
   1751 		    "Communication Streaming Architecture\n");
   1752 		if (sc->sc_type == WM_T_82547) {
   1753 			callout_init(&sc->sc_txfifo_ch, CALLOUT_FLAGS);
   1754 			callout_setfunc(&sc->sc_txfifo_ch,
   1755 					wm_82547_txfifo_stall, sc);
   1756 			aprint_verbose_dev(sc->sc_dev,
   1757 			    "using 82547 Tx FIFO stall work-around\n");
   1758 		}
   1759 	} else if (sc->sc_type >= WM_T_82571) {
   1760 		sc->sc_flags |= WM_F_PCIE;
   1761 		if ((sc->sc_type != WM_T_ICH8) && (sc->sc_type != WM_T_ICH9)
   1762 		    && (sc->sc_type != WM_T_ICH10)
   1763 		    && (sc->sc_type != WM_T_PCH)
   1764 		    && (sc->sc_type != WM_T_PCH2)
   1765 		    && (sc->sc_type != WM_T_PCH_LPT)) {
   1766 			/* ICH* and PCH* have no PCIe capability registers */
   1767 			if (pci_get_capability(pa->pa_pc, pa->pa_tag,
   1768 				PCI_CAP_PCIEXPRESS, &sc->sc_pcixe_capoff,
   1769 				NULL) == 0)
   1770 				aprint_error_dev(sc->sc_dev,
   1771 				    "unable to find PCIe capability\n");
   1772 		}
   1773 		aprint_verbose_dev(sc->sc_dev, "PCI-Express bus\n");
   1774 	} else {
   1775 		reg = CSR_READ(sc, WMREG_STATUS);
   1776 		if (reg & STATUS_BUS64)
   1777 			sc->sc_flags |= WM_F_BUS64;
   1778 		if ((reg & STATUS_PCIX_MODE) != 0) {
   1779 			pcireg_t pcix_cmd, pcix_sts, bytecnt, maxb;
   1780 
   1781 			sc->sc_flags |= WM_F_PCIX;
   1782 			if (pci_get_capability(pa->pa_pc, pa->pa_tag,
   1783 				PCI_CAP_PCIX, &sc->sc_pcixe_capoff, NULL) == 0)
   1784 				aprint_error_dev(sc->sc_dev,
   1785 				    "unable to find PCIX capability\n");
   1786 			else if (sc->sc_type != WM_T_82545_3 &&
   1787 				 sc->sc_type != WM_T_82546_3) {
   1788 				/*
   1789 				 * Work around a problem caused by the BIOS
   1790 				 * setting the max memory read byte count
   1791 				 * incorrectly.
   1792 				 */
   1793 				pcix_cmd = pci_conf_read(pa->pa_pc, pa->pa_tag,
   1794 				    sc->sc_pcixe_capoff + PCIX_CMD);
   1795 				pcix_sts = pci_conf_read(pa->pa_pc, pa->pa_tag,
   1796 				    sc->sc_pcixe_capoff + PCIX_STATUS);
   1797 
   1798 				bytecnt =
   1799 				    (pcix_cmd & PCIX_CMD_BYTECNT_MASK) >>
   1800 				    PCIX_CMD_BYTECNT_SHIFT;
   1801 				maxb =
   1802 				    (pcix_sts & PCIX_STATUS_MAXB_MASK) >>
   1803 				    PCIX_STATUS_MAXB_SHIFT;
   1804 				if (bytecnt > maxb) {
   1805 					aprint_verbose_dev(sc->sc_dev,
   1806 					    "resetting PCI-X MMRBC: %d -> %d\n",
   1807 					    512 << bytecnt, 512 << maxb);
   1808 					pcix_cmd = (pcix_cmd &
   1809 					    ~PCIX_CMD_BYTECNT_MASK) |
   1810 					   (maxb << PCIX_CMD_BYTECNT_SHIFT);
   1811 					pci_conf_write(pa->pa_pc, pa->pa_tag,
   1812 					    sc->sc_pcixe_capoff + PCIX_CMD,
   1813 					    pcix_cmd);
   1814 				}
   1815 			}
   1816 		}
   1817 		/*
   1818 		 * The quad port adapter is special; it has a PCIX-PCIX
   1819 		 * bridge on the board, and can run the secondary bus at
   1820 		 * a higher speed.
   1821 		 */
   1822 		if (wmp->wmp_product == PCI_PRODUCT_INTEL_82546EB_QUAD) {
   1823 			sc->sc_bus_speed = (sc->sc_flags & WM_F_PCIX) ? 120
   1824 								      : 66;
   1825 		} else if (sc->sc_flags & WM_F_PCIX) {
   1826 			switch (reg & STATUS_PCIXSPD_MASK) {
   1827 			case STATUS_PCIXSPD_50_66:
   1828 				sc->sc_bus_speed = 66;
   1829 				break;
   1830 			case STATUS_PCIXSPD_66_100:
   1831 				sc->sc_bus_speed = 100;
   1832 				break;
   1833 			case STATUS_PCIXSPD_100_133:
   1834 				sc->sc_bus_speed = 133;
   1835 				break;
   1836 			default:
   1837 				aprint_error_dev(sc->sc_dev,
   1838 				    "unknown PCIXSPD %d; assuming 66MHz\n",
   1839 				    reg & STATUS_PCIXSPD_MASK);
   1840 				sc->sc_bus_speed = 66;
   1841 				break;
   1842 			}
   1843 		} else
   1844 			sc->sc_bus_speed = (reg & STATUS_PCI66) ? 66 : 33;
   1845 		aprint_verbose_dev(sc->sc_dev, "%d-bit %dMHz %s bus\n",
   1846 		    (sc->sc_flags & WM_F_BUS64) ? 64 : 32, sc->sc_bus_speed,
   1847 		    (sc->sc_flags & WM_F_PCIX) ? "PCIX" : "PCI");
   1848 	}
   1849 
   1850 	/*
   1851 	 * Allocate the control data structures, and create and load the
   1852 	 * DMA map for it.
   1853 	 *
   1854 	 * NOTE: All Tx descriptors must be in the same 4G segment of
   1855 	 * memory.  So must Rx descriptors.  We simplify by allocating
   1856 	 * both sets within the same 4G segment.
   1857 	 */
   1858 	WM_NTXDESC(sc) = sc->sc_type < WM_T_82544 ?
   1859 	    WM_NTXDESC_82542 : WM_NTXDESC_82544;
   1860 	sc->sc_cd_size = sc->sc_type < WM_T_82544 ?
   1861 	    sizeof(struct wm_control_data_82542) :
   1862 	    sizeof(struct wm_control_data_82544);
   1863 	if ((error = bus_dmamem_alloc(sc->sc_dmat, sc->sc_cd_size, PAGE_SIZE,
   1864 		    (bus_size_t) 0x100000000ULL, &sc->sc_cd_seg, 1,
   1865 		    &sc->sc_cd_rseg, 0)) != 0) {
   1866 		aprint_error_dev(sc->sc_dev,
   1867 		    "unable to allocate control data, error = %d\n",
   1868 		    error);
   1869 		goto fail_0;
   1870 	}
   1871 
   1872 	if ((error = bus_dmamem_map(sc->sc_dmat, &sc->sc_cd_seg,
   1873 		    sc->sc_cd_rseg, sc->sc_cd_size,
   1874 		    (void **)&sc->sc_control_data, BUS_DMA_COHERENT)) != 0) {
   1875 		aprint_error_dev(sc->sc_dev,
   1876 		    "unable to map control data, error = %d\n", error);
   1877 		goto fail_1;
   1878 	}
   1879 
   1880 	if ((error = bus_dmamap_create(sc->sc_dmat, sc->sc_cd_size, 1,
   1881 		    sc->sc_cd_size, 0, 0, &sc->sc_cddmamap)) != 0) {
   1882 		aprint_error_dev(sc->sc_dev,
   1883 		    "unable to create control data DMA map, error = %d\n",
   1884 		    error);
   1885 		goto fail_2;
   1886 	}
   1887 
   1888 	if ((error = bus_dmamap_load(sc->sc_dmat, sc->sc_cddmamap,
   1889 		    sc->sc_control_data, sc->sc_cd_size, NULL, 0)) != 0) {
   1890 		aprint_error_dev(sc->sc_dev,
   1891 		    "unable to load control data DMA map, error = %d\n",
   1892 		    error);
   1893 		goto fail_3;
   1894 	}
   1895 
   1896 	/* Create the transmit buffer DMA maps. */
   1897 	WM_TXQUEUELEN(sc) =
   1898 	    (sc->sc_type == WM_T_82547 || sc->sc_type == WM_T_82547_2) ?
   1899 	    WM_TXQUEUELEN_MAX_82547 : WM_TXQUEUELEN_MAX;
   1900 	for (i = 0; i < WM_TXQUEUELEN(sc); i++) {
   1901 		if ((error = bus_dmamap_create(sc->sc_dmat, WM_MAXTXDMA,
   1902 			    WM_NTXSEGS, WTX_MAX_LEN, 0, 0,
   1903 			    &sc->sc_txsoft[i].txs_dmamap)) != 0) {
   1904 			aprint_error_dev(sc->sc_dev,
   1905 			    "unable to create Tx DMA map %d, error = %d\n",
   1906 			    i, error);
   1907 			goto fail_4;
   1908 		}
   1909 	}
   1910 
   1911 	/* Create the receive buffer DMA maps. */
   1912 	for (i = 0; i < WM_NRXDESC; i++) {
   1913 		if ((error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1,
   1914 			    MCLBYTES, 0, 0,
   1915 			    &sc->sc_rxsoft[i].rxs_dmamap)) != 0) {
   1916 			aprint_error_dev(sc->sc_dev,
   1917 			    "unable to create Rx DMA map %d error = %d\n",
   1918 			    i, error);
   1919 			goto fail_5;
   1920 		}
   1921 		sc->sc_rxsoft[i].rxs_mbuf = NULL;
   1922 	}
   1923 
   1924 	/* clear interesting stat counters */
   1925 	CSR_READ(sc, WMREG_COLC);
   1926 	CSR_READ(sc, WMREG_RXERRC);
   1927 
   1928 	/* get PHY control from SMBus to PCIe */
   1929 	if ((sc->sc_type == WM_T_PCH) || (sc->sc_type == WM_T_PCH2)
   1930 	    || (sc->sc_type == WM_T_PCH_LPT))
   1931 		wm_smbustopci(sc);
   1932 
   1933 	/* Reset the chip to a known state. */
   1934 	wm_reset(sc);
   1935 
   1936 	/* Get some information about the EEPROM. */
   1937 	switch (sc->sc_type) {
   1938 	case WM_T_82542_2_0:
   1939 	case WM_T_82542_2_1:
   1940 	case WM_T_82543:
   1941 	case WM_T_82544:
   1942 		/* Microwire */
   1943 		sc->sc_nvm_wordsize = 64;
   1944 		sc->sc_nvm_addrbits = 6;
   1945 		break;
   1946 	case WM_T_82540:
   1947 	case WM_T_82545:
   1948 	case WM_T_82545_3:
   1949 	case WM_T_82546:
   1950 	case WM_T_82546_3:
   1951 		/* Microwire */
   1952 		reg = CSR_READ(sc, WMREG_EECD);
   1953 		if (reg & EECD_EE_SIZE) {
   1954 			sc->sc_nvm_wordsize = 256;
   1955 			sc->sc_nvm_addrbits = 8;
   1956 		} else {
   1957 			sc->sc_nvm_wordsize = 64;
   1958 			sc->sc_nvm_addrbits = 6;
   1959 		}
   1960 		sc->sc_flags |= WM_F_LOCK_EECD;
   1961 		break;
   1962 	case WM_T_82541:
   1963 	case WM_T_82541_2:
   1964 	case WM_T_82547:
   1965 	case WM_T_82547_2:
   1966 		sc->sc_flags |= WM_F_LOCK_EECD;
   1967 		reg = CSR_READ(sc, WMREG_EECD);
   1968 		if (reg & EECD_EE_TYPE) {
   1969 			/* SPI */
   1970 			sc->sc_flags |= WM_F_EEPROM_SPI;
   1971 			wm_nvm_set_addrbits_size_eecd(sc);
   1972 		} else {
   1973 			/* Microwire */
   1974 			if ((reg & EECD_EE_ABITS) != 0) {
   1975 				sc->sc_nvm_wordsize = 256;
   1976 				sc->sc_nvm_addrbits = 8;
   1977 			} else {
   1978 				sc->sc_nvm_wordsize = 64;
   1979 				sc->sc_nvm_addrbits = 6;
   1980 			}
   1981 		}
   1982 		break;
   1983 	case WM_T_82571:
   1984 	case WM_T_82572:
   1985 		/* SPI */
   1986 		sc->sc_flags |= WM_F_EEPROM_SPI;
   1987 		wm_nvm_set_addrbits_size_eecd(sc);
   1988 		sc->sc_flags |= WM_F_LOCK_EECD | WM_F_LOCK_SWSM;
   1989 		break;
   1990 	case WM_T_82573:
   1991 		sc->sc_flags |= WM_F_LOCK_SWSM;
   1992 		/* FALLTHROUGH */
   1993 	case WM_T_82574:
   1994 	case WM_T_82583:
   1995 		if (wm_nvm_is_onboard_eeprom(sc) == 0) {
   1996 			sc->sc_flags |= WM_F_EEPROM_FLASH;
   1997 			sc->sc_nvm_wordsize = 2048;
   1998 		} else {
   1999 			/* SPI */
   2000 			sc->sc_flags |= WM_F_EEPROM_SPI;
   2001 			wm_nvm_set_addrbits_size_eecd(sc);
   2002 		}
   2003 		sc->sc_flags |= WM_F_EEPROM_EERDEEWR;
   2004 		break;
   2005 	case WM_T_82575:
   2006 	case WM_T_82576:
   2007 	case WM_T_82580:
   2008 	case WM_T_I350:
   2009 	case WM_T_I354:
   2010 	case WM_T_80003:
   2011 		/* SPI */
   2012 		sc->sc_flags |= WM_F_EEPROM_SPI;
   2013 		wm_nvm_set_addrbits_size_eecd(sc);
   2014 		sc->sc_flags |= WM_F_EEPROM_EERDEEWR | WM_F_LOCK_SWFW
   2015 		    | WM_F_LOCK_SWSM;
   2016 		break;
   2017 	case WM_T_ICH8:
   2018 	case WM_T_ICH9:
   2019 	case WM_T_ICH10:
   2020 	case WM_T_PCH:
   2021 	case WM_T_PCH2:
   2022 	case WM_T_PCH_LPT:
   2023 		/* FLASH */
   2024 		sc->sc_flags |= WM_F_EEPROM_FLASH | WM_F_LOCK_EXTCNF;
   2025 		sc->sc_nvm_wordsize = 2048;
   2026 		memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, WM_ICH8_FLASH);
   2027 		if (pci_mapreg_map(pa, WM_ICH8_FLASH, memtype, 0,
   2028 		    &sc->sc_flasht, &sc->sc_flashh, NULL, &sc->sc_flashs)) {
   2029 			aprint_error_dev(sc->sc_dev,
   2030 			    "can't map FLASH registers\n");
   2031 			goto fail_5;
   2032 		}
   2033 		reg = ICH8_FLASH_READ32(sc, ICH_FLASH_GFPREG);
   2034 		sc->sc_ich8_flash_base = (reg & ICH_GFPREG_BASE_MASK) *
   2035 						ICH_FLASH_SECTOR_SIZE;
   2036 		sc->sc_ich8_flash_bank_size =
   2037 		    ((reg >> 16) & ICH_GFPREG_BASE_MASK) + 1;
   2038 		sc->sc_ich8_flash_bank_size -=
   2039 		    (reg & ICH_GFPREG_BASE_MASK);
   2040 		sc->sc_ich8_flash_bank_size *= ICH_FLASH_SECTOR_SIZE;
   2041 		sc->sc_ich8_flash_bank_size /= 2 * sizeof(uint16_t);
   2042 		break;
   2043 	case WM_T_I210:
   2044 	case WM_T_I211:
   2045 		if (wm_nvm_get_flash_presence_i210(sc)) {
   2046 			wm_nvm_set_addrbits_size_eecd(sc);
   2047 			sc->sc_flags |= WM_F_EEPROM_FLASH_HW;
   2048 			sc->sc_flags |= WM_F_EEPROM_EERDEEWR | WM_F_LOCK_SWFW;
   2049 		} else {
   2050 			sc->sc_nvm_wordsize = INVM_SIZE;
   2051 			sc->sc_flags |= WM_F_EEPROM_INVM;
   2052 			sc->sc_flags |= WM_F_LOCK_SWFW;
   2053 		}
   2054 		break;
   2055 	default:
   2056 		break;
   2057 	}
   2058 
   2059 	/* Ensure the SMBI bit is clear before first NVM or PHY access */
   2060 	switch (sc->sc_type) {
   2061 	case WM_T_82571:
   2062 	case WM_T_82572:
   2063 		reg = CSR_READ(sc, WMREG_SWSM2);
   2064 		if ((reg & SWSM2_LOCK) == 0) {
   2065 			CSR_WRITE(sc, WMREG_SWSM2, reg | SWSM2_LOCK);
   2066 			force_clear_smbi = true;
   2067 		} else
   2068 			force_clear_smbi = false;
   2069 		break;
   2070 	case WM_T_82573:
   2071 	case WM_T_82574:
   2072 	case WM_T_82583:
   2073 		force_clear_smbi = true;
   2074 		break;
   2075 	default:
   2076 		force_clear_smbi = false;
   2077 		break;
   2078 	}
   2079 	if (force_clear_smbi) {
   2080 		reg = CSR_READ(sc, WMREG_SWSM);
   2081 		if ((reg & SWSM_SMBI) != 0)
   2082 			aprint_error_dev(sc->sc_dev,
   2083 			    "Please update the Bootagent\n");
   2084 		CSR_WRITE(sc, WMREG_SWSM, reg & ~SWSM_SMBI);
   2085 	}
   2086 
   2087 	/*
   2088 	 * Defer printing the EEPROM type until after verifying the checksum
   2089 	 * This allows the EEPROM type to be printed correctly in the case
   2090 	 * that no EEPROM is attached.
   2091 	 */
   2092 	/*
   2093 	 * Validate the EEPROM checksum. If the checksum fails, flag
   2094 	 * this for later, so we can fail future reads from the EEPROM.
   2095 	 */
   2096 	if (wm_nvm_validate_checksum(sc)) {
   2097 		/*
   2098 		 * Read twice again because some PCI-e parts fail the
   2099 		 * first check due to the link being in sleep state.
   2100 		 */
   2101 		if (wm_nvm_validate_checksum(sc))
   2102 			sc->sc_flags |= WM_F_EEPROM_INVALID;
   2103 	}
   2104 
   2105 	/* Set device properties (macflags) */
   2106 	prop_dictionary_set_uint32(dict, "macflags", sc->sc_flags);
   2107 
   2108 	if (sc->sc_flags & WM_F_EEPROM_INVALID)
   2109 		aprint_verbose_dev(sc->sc_dev, "No EEPROM");
   2110 	else {
   2111 		aprint_verbose_dev(sc->sc_dev, "%u words ",
   2112 		    sc->sc_nvm_wordsize);
   2113 		if (sc->sc_flags & WM_F_EEPROM_INVM)
   2114 			aprint_verbose("iNVM");
   2115 		else if (sc->sc_flags & WM_F_EEPROM_FLASH_HW)
   2116 			aprint_verbose("FLASH(HW)");
   2117 		else if (sc->sc_flags & WM_F_EEPROM_FLASH)
   2118 			aprint_verbose("FLASH");
   2119 		else {
   2120 			if (sc->sc_flags & WM_F_EEPROM_SPI)
   2121 				eetype = "SPI";
   2122 			else
   2123 				eetype = "MicroWire";
   2124 			aprint_verbose("(%d address bits) %s EEPROM",
   2125 			    sc->sc_nvm_addrbits, eetype);
   2126 		}
   2127 	}
   2128 	wm_nvm_version(sc);
   2129 	aprint_verbose("\n");
   2130 
   2131 	/* Check for I21[01] PLL workaround */
   2132 	if (sc->sc_type == WM_T_I210)
   2133 		sc->sc_flags |= WM_F_PLL_WA_I210;
   2134 	if ((sc->sc_type == WM_T_I210) && wm_nvm_get_flash_presence_i210(sc)) {
   2135 		/* NVM image release 3.25 has a workaround */
   2136 		if ((sc->sc_nvm_ver_major < 3)
   2137 		    || ((sc->sc_nvm_ver_major == 3)
   2138 			&& (sc->sc_nvm_ver_minor < 25))) {
   2139 			aprint_verbose_dev(sc->sc_dev,
   2140 			    "ROM image version %d.%d is older than 3.25\n",
   2141 			    sc->sc_nvm_ver_major, sc->sc_nvm_ver_minor);
   2142 			sc->sc_flags |= WM_F_PLL_WA_I210;
   2143 		}
   2144 	}
   2145 	if ((sc->sc_flags & WM_F_PLL_WA_I210) != 0)
   2146 		wm_pll_workaround_i210(sc);
   2147 
   2148 	switch (sc->sc_type) {
   2149 	case WM_T_82571:
   2150 	case WM_T_82572:
   2151 	case WM_T_82573:
   2152 	case WM_T_82574:
   2153 	case WM_T_82583:
   2154 	case WM_T_80003:
   2155 	case WM_T_ICH8:
   2156 	case WM_T_ICH9:
   2157 	case WM_T_ICH10:
   2158 	case WM_T_PCH:
   2159 	case WM_T_PCH2:
   2160 	case WM_T_PCH_LPT:
   2161 		if (wm_check_mng_mode(sc) != 0)
   2162 			wm_get_hw_control(sc);
   2163 		break;
   2164 	default:
   2165 		break;
   2166 	}
   2167 	wm_get_wakeup(sc);
   2168 	/*
   2169 	 * Read the Ethernet address from the EEPROM, if not first found
   2170 	 * in device properties.
   2171 	 */
   2172 	ea = prop_dictionary_get(dict, "mac-address");
   2173 	if (ea != NULL) {
   2174 		KASSERT(prop_object_type(ea) == PROP_TYPE_DATA);
   2175 		KASSERT(prop_data_size(ea) == ETHER_ADDR_LEN);
   2176 		memcpy(enaddr, prop_data_data_nocopy(ea), ETHER_ADDR_LEN);
   2177 	} else {
   2178 		if (wm_read_mac_addr(sc, enaddr) != 0) {
   2179 			aprint_error_dev(sc->sc_dev,
   2180 			    "unable to read Ethernet address\n");
   2181 			goto fail_5;
   2182 		}
   2183 	}
   2184 
   2185 	aprint_normal_dev(sc->sc_dev, "Ethernet address %s\n",
   2186 	    ether_sprintf(enaddr));
   2187 
   2188 	/*
   2189 	 * Read the config info from the EEPROM, and set up various
   2190 	 * bits in the control registers based on their contents.
   2191 	 */
   2192 	pn = prop_dictionary_get(dict, "i82543-cfg1");
   2193 	if (pn != NULL) {
   2194 		KASSERT(prop_object_type(pn) == PROP_TYPE_NUMBER);
   2195 		cfg1 = (uint16_t) prop_number_integer_value(pn);
   2196 	} else {
   2197 		if (wm_nvm_read(sc, NVM_OFF_CFG1, 1, &cfg1)) {
   2198 			aprint_error_dev(sc->sc_dev, "unable to read CFG1\n");
   2199 			goto fail_5;
   2200 		}
   2201 	}
   2202 
   2203 	pn = prop_dictionary_get(dict, "i82543-cfg2");
   2204 	if (pn != NULL) {
   2205 		KASSERT(prop_object_type(pn) == PROP_TYPE_NUMBER);
   2206 		cfg2 = (uint16_t) prop_number_integer_value(pn);
   2207 	} else {
   2208 		if (wm_nvm_read(sc, NVM_OFF_CFG2, 1, &cfg2)) {
   2209 			aprint_error_dev(sc->sc_dev, "unable to read CFG2\n");
   2210 			goto fail_5;
   2211 		}
   2212 	}
   2213 
   2214 	/* check for WM_F_WOL */
   2215 	switch (sc->sc_type) {
   2216 	case WM_T_82542_2_0:
   2217 	case WM_T_82542_2_1:
   2218 	case WM_T_82543:
   2219 		/* dummy? */
   2220 		eeprom_data = 0;
   2221 		apme_mask = NVM_CFG3_APME;
   2222 		break;
   2223 	case WM_T_82544:
   2224 		apme_mask = NVM_CFG2_82544_APM_EN;
   2225 		eeprom_data = cfg2;
   2226 		break;
   2227 	case WM_T_82546:
   2228 	case WM_T_82546_3:
   2229 	case WM_T_82571:
   2230 	case WM_T_82572:
   2231 	case WM_T_82573:
   2232 	case WM_T_82574:
   2233 	case WM_T_82583:
   2234 	case WM_T_80003:
   2235 	default:
   2236 		apme_mask = NVM_CFG3_APME;
   2237 		wm_nvm_read(sc, (sc->sc_funcid == 1) ? NVM_OFF_CFG3_PORTB
   2238 		    : NVM_OFF_CFG3_PORTA, 1, &eeprom_data);
   2239 		break;
   2240 	case WM_T_82575:
   2241 	case WM_T_82576:
   2242 	case WM_T_82580:
   2243 	case WM_T_I350:
   2244 	case WM_T_I354: /* XXX ok? */
   2245 	case WM_T_ICH8:
   2246 	case WM_T_ICH9:
   2247 	case WM_T_ICH10:
   2248 	case WM_T_PCH:
   2249 	case WM_T_PCH2:
   2250 	case WM_T_PCH_LPT:
   2251 		/* XXX The funcid should be checked on some devices */
   2252 		apme_mask = WUC_APME;
   2253 		eeprom_data = CSR_READ(sc, WMREG_WUC);
   2254 		break;
   2255 	}
   2256 
   2257 	/* Check for WM_F_WOL flag after the setting of the EEPROM stuff */
   2258 	if ((eeprom_data & apme_mask) != 0)
   2259 		sc->sc_flags |= WM_F_WOL;
   2260 #ifdef WM_DEBUG
   2261 	if ((sc->sc_flags & WM_F_WOL) != 0)
   2262 		printf("WOL\n");
   2263 #endif
   2264 
   2265 	if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)) {
   2266 		/* Check NVM for autonegotiation */
   2267 		if (wm_nvm_read(sc, NVM_OFF_COMPAT, 1, &nvmword) == 0) {
   2268 			if ((nvmword & NVM_COMPAT_SERDES_FORCE_MODE) != 0)
   2269 				sc->sc_flags |= WM_F_PCS_DIS_AUTONEGO;
   2270 		}
   2271 	}
   2272 
   2273 	/*
   2274 	 * XXX need special handling for some multiple port cards
   2275 	 * to disable a paticular port.
   2276 	 */
   2277 
   2278 	if (sc->sc_type >= WM_T_82544) {
   2279 		pn = prop_dictionary_get(dict, "i82543-swdpin");
   2280 		if (pn != NULL) {
   2281 			KASSERT(prop_object_type(pn) == PROP_TYPE_NUMBER);
   2282 			swdpin = (uint16_t) prop_number_integer_value(pn);
   2283 		} else {
   2284 			if (wm_nvm_read(sc, NVM_OFF_SWDPIN, 1, &swdpin)) {
   2285 				aprint_error_dev(sc->sc_dev,
   2286 				    "unable to read SWDPIN\n");
   2287 				goto fail_5;
   2288 			}
   2289 		}
   2290 	}
   2291 
   2292 	if (cfg1 & NVM_CFG1_ILOS)
   2293 		sc->sc_ctrl |= CTRL_ILOS;
   2294 
   2295 	/*
   2296 	 * XXX
   2297 	 * This code isn't correct because pin 2 and 3 are located
   2298 	 * in different position on newer chips. Check all datasheet.
   2299 	 *
   2300 	 * Until resolve this problem, check if a chip < 82580
   2301 	 */
   2302 	if (sc->sc_type <= WM_T_82580) {
   2303 		if (sc->sc_type >= WM_T_82544) {
   2304 			sc->sc_ctrl |=
   2305 			    ((swdpin >> NVM_SWDPIN_SWDPIO_SHIFT) & 0xf) <<
   2306 			    CTRL_SWDPIO_SHIFT;
   2307 			sc->sc_ctrl |=
   2308 			    ((swdpin >> NVM_SWDPIN_SWDPIN_SHIFT) & 0xf) <<
   2309 			    CTRL_SWDPINS_SHIFT;
   2310 		} else {
   2311 			sc->sc_ctrl |=
   2312 			    ((cfg1 >> NVM_CFG1_SWDPIO_SHIFT) & 0xf) <<
   2313 			    CTRL_SWDPIO_SHIFT;
   2314 		}
   2315 	}
   2316 
   2317 	/* XXX For other than 82580? */
   2318 	if (sc->sc_type == WM_T_82580) {
   2319 		wm_nvm_read(sc, NVM_OFF_CFG3_PORTA, 1, &nvmword);
   2320 		printf("CFG3 = %08x\n", (uint32_t)nvmword);
   2321 		if (nvmword & __BIT(13)) {
   2322 			printf("SET ILOS\n");
   2323 			sc->sc_ctrl |= CTRL_ILOS;
   2324 		}
   2325 	}
   2326 
   2327 #if 0
   2328 	if (sc->sc_type >= WM_T_82544) {
   2329 		if (cfg1 & NVM_CFG1_IPS0)
   2330 			sc->sc_ctrl_ext |= CTRL_EXT_IPS;
   2331 		if (cfg1 & NVM_CFG1_IPS1)
   2332 			sc->sc_ctrl_ext |= CTRL_EXT_IPS1;
   2333 		sc->sc_ctrl_ext |=
   2334 		    ((swdpin >> (NVM_SWDPIN_SWDPIO_SHIFT + 4)) & 0xd) <<
   2335 		    CTRL_EXT_SWDPIO_SHIFT;
   2336 		sc->sc_ctrl_ext |=
   2337 		    ((swdpin >> (NVM_SWDPIN_SWDPIN_SHIFT + 4)) & 0xd) <<
   2338 		    CTRL_EXT_SWDPINS_SHIFT;
   2339 	} else {
   2340 		sc->sc_ctrl_ext |=
   2341 		    ((cfg2 >> NVM_CFG2_SWDPIO_SHIFT) & 0xf) <<
   2342 		    CTRL_EXT_SWDPIO_SHIFT;
   2343 	}
   2344 #endif
   2345 
   2346 	CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
   2347 #if 0
   2348 	CSR_WRITE(sc, WMREG_CTRL_EXT, sc->sc_ctrl_ext);
   2349 #endif
   2350 
   2351 	/*
   2352 	 * Set up some register offsets that are different between
   2353 	 * the i82542 and the i82543 and later chips.
   2354 	 */
   2355 	if (sc->sc_type < WM_T_82543) {
   2356 		sc->sc_rdt_reg = WMREG_OLD_RDT0;
   2357 		sc->sc_tdt_reg = WMREG_OLD_TDT;
   2358 	} else {
   2359 		sc->sc_rdt_reg = WMREG_RDT;
   2360 		sc->sc_tdt_reg = WMREG_TDT;
   2361 	}
   2362 
   2363 	if (sc->sc_type == WM_T_PCH) {
   2364 		uint16_t val;
   2365 
   2366 		/* Save the NVM K1 bit setting */
   2367 		wm_nvm_read(sc, NVM_OFF_K1_CONFIG, 1, &val);
   2368 
   2369 		if ((val & NVM_K1_CONFIG_ENABLE) != 0)
   2370 			sc->sc_nvm_k1_enabled = 1;
   2371 		else
   2372 			sc->sc_nvm_k1_enabled = 0;
   2373 	}
   2374 
   2375 	/*
   2376 	 * Determine if we're TBI,GMII or SGMII mode, and initialize the
   2377 	 * media structures accordingly.
   2378 	 */
   2379 	if (sc->sc_type == WM_T_ICH8 || sc->sc_type == WM_T_ICH9
   2380 	    || sc->sc_type == WM_T_ICH10 || sc->sc_type == WM_T_PCH
   2381 	    || sc->sc_type == WM_T_PCH2 || sc->sc_type == WM_T_PCH_LPT
   2382 	    || sc->sc_type == WM_T_82573
   2383 	    || sc->sc_type == WM_T_82574 || sc->sc_type == WM_T_82583) {
   2384 		/* STATUS_TBIMODE reserved/reused, can't rely on it */
   2385 		wm_gmii_mediainit(sc, wmp->wmp_product);
   2386 	} else if (sc->sc_type < WM_T_82543 ||
   2387 	    (CSR_READ(sc, WMREG_STATUS) & STATUS_TBIMODE) != 0) {
   2388 		if (sc->sc_mediatype == WM_MEDIATYPE_COPPER) {
   2389 			aprint_error_dev(sc->sc_dev,
   2390 			    "WARNING: TBIMODE set on 1000BASE-T product!\n");
   2391 			sc->sc_mediatype = WM_MEDIATYPE_FIBER;
   2392 		}
   2393 		wm_tbi_mediainit(sc);
   2394 	} else {
   2395 		switch (sc->sc_type) {
   2396 		case WM_T_82575:
   2397 		case WM_T_82576:
   2398 		case WM_T_82580:
   2399 		case WM_T_I350:
   2400 		case WM_T_I354:
   2401 		case WM_T_I210:
   2402 		case WM_T_I211:
   2403 			reg = CSR_READ(sc, WMREG_CTRL_EXT);
   2404 			link_mode = reg & CTRL_EXT_LINK_MODE_MASK;
   2405 			switch (link_mode) {
   2406 			case CTRL_EXT_LINK_MODE_1000KX:
   2407 				aprint_verbose_dev(sc->sc_dev, "1000KX\n");
   2408 				sc->sc_mediatype = WM_MEDIATYPE_SERDES;
   2409 				break;
   2410 			case CTRL_EXT_LINK_MODE_SGMII:
   2411 				if (wm_sgmii_uses_mdio(sc)) {
   2412 					aprint_verbose_dev(sc->sc_dev,
   2413 					    "SGMII(MDIO)\n");
   2414 					sc->sc_flags |= WM_F_SGMII;
   2415 					sc->sc_mediatype = WM_MEDIATYPE_COPPER;
   2416 					break;
   2417 				}
   2418 				aprint_verbose_dev(sc->sc_dev, "SGMII(I2C)\n");
   2419 				/*FALLTHROUGH*/
   2420 			case CTRL_EXT_LINK_MODE_PCIE_SERDES:
   2421 				sc->sc_mediatype = wm_sfp_get_media_type(sc);
   2422 				if (sc->sc_mediatype == WM_MEDIATYPE_UNKNOWN) {
   2423 					if (link_mode
   2424 					    == CTRL_EXT_LINK_MODE_SGMII) {
   2425 						sc->sc_mediatype
   2426 						    = WM_MEDIATYPE_COPPER;
   2427 						sc->sc_flags |= WM_F_SGMII;
   2428 					} else {
   2429 						sc->sc_mediatype
   2430 						    = WM_MEDIATYPE_SERDES;
   2431 						aprint_verbose_dev(sc->sc_dev,
   2432 						    "SERDES\n");
   2433 					}
   2434 					break;
   2435 				}
   2436 				if (sc->sc_mediatype == WM_MEDIATYPE_SERDES)
   2437 					aprint_verbose_dev(sc->sc_dev,
   2438 					    "SERDES\n");
   2439 
   2440 				/* Change current link mode setting */
   2441 				reg &= ~CTRL_EXT_LINK_MODE_MASK;
   2442 				switch (sc->sc_mediatype) {
   2443 				case WM_MEDIATYPE_COPPER:
   2444 					reg |= CTRL_EXT_LINK_MODE_SGMII;
   2445 					break;
   2446 				case WM_MEDIATYPE_SERDES:
   2447 					reg |= CTRL_EXT_LINK_MODE_PCIE_SERDES;
   2448 					break;
   2449 				default:
   2450 					break;
   2451 				}
   2452 				CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
   2453 				break;
   2454 			case CTRL_EXT_LINK_MODE_GMII:
   2455 			default:
   2456 				aprint_verbose_dev(sc->sc_dev, "Copper\n");
   2457 				sc->sc_mediatype = WM_MEDIATYPE_COPPER;
   2458 				break;
   2459 			}
   2460 
   2461 			reg &= ~CTRL_EXT_I2C_ENA;
   2462 			if ((sc->sc_flags & WM_F_SGMII) != 0)
   2463 				reg |= CTRL_EXT_I2C_ENA;
   2464 			else
   2465 				reg &= ~CTRL_EXT_I2C_ENA;
   2466 			CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
   2467 
   2468 			if (sc->sc_mediatype == WM_MEDIATYPE_COPPER)
   2469 				wm_gmii_mediainit(sc, wmp->wmp_product);
   2470 			else
   2471 				wm_tbi_mediainit(sc);
   2472 			break;
   2473 		default:
   2474 			if (sc->sc_mediatype == WM_MEDIATYPE_FIBER)
   2475 				aprint_error_dev(sc->sc_dev,
   2476 				    "WARNING: TBIMODE clear on 1000BASE-X product!\n");
   2477 			sc->sc_mediatype = WM_MEDIATYPE_COPPER;
   2478 			wm_gmii_mediainit(sc, wmp->wmp_product);
   2479 		}
   2480 	}
   2481 
   2482 	ifp = &sc->sc_ethercom.ec_if;
   2483 	xname = device_xname(sc->sc_dev);
   2484 	strlcpy(ifp->if_xname, xname, IFNAMSIZ);
   2485 	ifp->if_softc = sc;
   2486 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
   2487 	ifp->if_ioctl = wm_ioctl;
   2488 	if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
   2489 		ifp->if_start = wm_nq_start;
   2490 	else
   2491 		ifp->if_start = wm_start;
   2492 	ifp->if_watchdog = wm_watchdog;
   2493 	ifp->if_init = wm_init;
   2494 	ifp->if_stop = wm_stop;
   2495 	IFQ_SET_MAXLEN(&ifp->if_snd, max(WM_IFQUEUELEN, IFQ_MAXLEN));
   2496 	IFQ_SET_READY(&ifp->if_snd);
   2497 
   2498 	/* Check for jumbo frame */
   2499 	switch (sc->sc_type) {
   2500 	case WM_T_82573:
   2501 		/* XXX limited to 9234 if ASPM is disabled */
   2502 		wm_nvm_read(sc, NVM_OFF_INIT_3GIO_3, 1, &nvmword);
   2503 		if ((nvmword & NVM_3GIO_3_ASPM_MASK) != 0)
   2504 			sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU;
   2505 		break;
   2506 	case WM_T_82571:
   2507 	case WM_T_82572:
   2508 	case WM_T_82574:
   2509 	case WM_T_82575:
   2510 	case WM_T_82576:
   2511 	case WM_T_82580:
   2512 	case WM_T_I350:
   2513 	case WM_T_I354: /* XXXX ok? */
   2514 	case WM_T_I210:
   2515 	case WM_T_I211:
   2516 	case WM_T_80003:
   2517 	case WM_T_ICH9:
   2518 	case WM_T_ICH10:
   2519 	case WM_T_PCH2:	/* PCH2 supports 9K frame size */
   2520 	case WM_T_PCH_LPT:
   2521 		/* XXX limited to 9234 */
   2522 		sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU;
   2523 		break;
   2524 	case WM_T_PCH:
   2525 		/* XXX limited to 4096 */
   2526 		sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU;
   2527 		break;
   2528 	case WM_T_82542_2_0:
   2529 	case WM_T_82542_2_1:
   2530 	case WM_T_82583:
   2531 	case WM_T_ICH8:
   2532 		/* No support for jumbo frame */
   2533 		break;
   2534 	default:
   2535 		/* ETHER_MAX_LEN_JUMBO */
   2536 		sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU;
   2537 		break;
   2538 	}
   2539 
   2540 	/* If we're a i82543 or greater, we can support VLANs. */
   2541 	if (sc->sc_type >= WM_T_82543)
   2542 		sc->sc_ethercom.ec_capabilities |=
   2543 		    ETHERCAP_VLAN_MTU | ETHERCAP_VLAN_HWTAGGING;
   2544 
   2545 	/*
   2546 	 * We can perform TCPv4 and UDPv4 checkums in-bound.  Only
   2547 	 * on i82543 and later.
   2548 	 */
   2549 	if (sc->sc_type >= WM_T_82543) {
   2550 		ifp->if_capabilities |=
   2551 		    IFCAP_CSUM_IPv4_Tx | IFCAP_CSUM_IPv4_Rx |
   2552 		    IFCAP_CSUM_TCPv4_Tx | IFCAP_CSUM_TCPv4_Rx |
   2553 		    IFCAP_CSUM_UDPv4_Tx | IFCAP_CSUM_UDPv4_Rx |
   2554 		    IFCAP_CSUM_TCPv6_Tx |
   2555 		    IFCAP_CSUM_UDPv6_Tx;
   2556 	}
   2557 
   2558 	/*
   2559 	 * XXXyamt: i'm not sure which chips support RXCSUM_IPV6OFL.
   2560 	 *
   2561 	 *	82541GI (8086:1076) ... no
   2562 	 *	82572EI (8086:10b9) ... yes
   2563 	 */
   2564 	if (sc->sc_type >= WM_T_82571) {
   2565 		ifp->if_capabilities |=
   2566 		    IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx;
   2567 	}
   2568 
   2569 	/*
   2570 	 * If we're a i82544 or greater (except i82547), we can do
   2571 	 * TCP segmentation offload.
   2572 	 */
   2573 	if (sc->sc_type >= WM_T_82544 && sc->sc_type != WM_T_82547) {
   2574 		ifp->if_capabilities |= IFCAP_TSOv4;
   2575 	}
   2576 
   2577 	if (sc->sc_type >= WM_T_82571) {
   2578 		ifp->if_capabilities |= IFCAP_TSOv6;
   2579 	}
   2580 
   2581 #ifdef WM_MPSAFE
   2582 	sc->sc_tx_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
   2583 	sc->sc_rx_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
   2584 #else
   2585 	sc->sc_tx_lock = NULL;
   2586 	sc->sc_rx_lock = NULL;
   2587 #endif
   2588 
   2589 	/* Attach the interface. */
   2590 	if_attach(ifp);
   2591 	ether_ifattach(ifp, enaddr);
   2592 	ether_set_ifflags_cb(&sc->sc_ethercom, wm_ifflags_cb);
   2593 	rnd_attach_source(&sc->rnd_source, xname, RND_TYPE_NET,
   2594 			  RND_FLAG_DEFAULT);
   2595 
   2596 #ifdef WM_EVENT_COUNTERS
   2597 	/* Attach event counters. */
   2598 	evcnt_attach_dynamic(&sc->sc_ev_txsstall, EVCNT_TYPE_MISC,
   2599 	    NULL, xname, "txsstall");
   2600 	evcnt_attach_dynamic(&sc->sc_ev_txdstall, EVCNT_TYPE_MISC,
   2601 	    NULL, xname, "txdstall");
   2602 	evcnt_attach_dynamic(&sc->sc_ev_txfifo_stall, EVCNT_TYPE_MISC,
   2603 	    NULL, xname, "txfifo_stall");
   2604 	evcnt_attach_dynamic(&sc->sc_ev_txdw, EVCNT_TYPE_INTR,
   2605 	    NULL, xname, "txdw");
   2606 	evcnt_attach_dynamic(&sc->sc_ev_txqe, EVCNT_TYPE_INTR,
   2607 	    NULL, xname, "txqe");
   2608 	evcnt_attach_dynamic(&sc->sc_ev_rxintr, EVCNT_TYPE_INTR,
   2609 	    NULL, xname, "rxintr");
   2610 	evcnt_attach_dynamic(&sc->sc_ev_linkintr, EVCNT_TYPE_INTR,
   2611 	    NULL, xname, "linkintr");
   2612 
   2613 	evcnt_attach_dynamic(&sc->sc_ev_rxipsum, EVCNT_TYPE_MISC,
   2614 	    NULL, xname, "rxipsum");
   2615 	evcnt_attach_dynamic(&sc->sc_ev_rxtusum, EVCNT_TYPE_MISC,
   2616 	    NULL, xname, "rxtusum");
   2617 	evcnt_attach_dynamic(&sc->sc_ev_txipsum, EVCNT_TYPE_MISC,
   2618 	    NULL, xname, "txipsum");
   2619 	evcnt_attach_dynamic(&sc->sc_ev_txtusum, EVCNT_TYPE_MISC,
   2620 	    NULL, xname, "txtusum");
   2621 	evcnt_attach_dynamic(&sc->sc_ev_txtusum6, EVCNT_TYPE_MISC,
   2622 	    NULL, xname, "txtusum6");
   2623 
   2624 	evcnt_attach_dynamic(&sc->sc_ev_txtso, EVCNT_TYPE_MISC,
   2625 	    NULL, xname, "txtso");
   2626 	evcnt_attach_dynamic(&sc->sc_ev_txtso6, EVCNT_TYPE_MISC,
   2627 	    NULL, xname, "txtso6");
   2628 	evcnt_attach_dynamic(&sc->sc_ev_txtsopain, EVCNT_TYPE_MISC,
   2629 	    NULL, xname, "txtsopain");
   2630 
   2631 	for (i = 0; i < WM_NTXSEGS; i++) {
   2632 		snprintf(wm_txseg_evcnt_names[i],
   2633 		    sizeof(wm_txseg_evcnt_names[i]), "txseg%d", i);
   2634 		evcnt_attach_dynamic(&sc->sc_ev_txseg[i], EVCNT_TYPE_MISC,
   2635 		    NULL, xname, wm_txseg_evcnt_names[i]);
   2636 	}
   2637 
   2638 	evcnt_attach_dynamic(&sc->sc_ev_txdrop, EVCNT_TYPE_MISC,
   2639 	    NULL, xname, "txdrop");
   2640 
   2641 	evcnt_attach_dynamic(&sc->sc_ev_tu, EVCNT_TYPE_MISC,
   2642 	    NULL, xname, "tu");
   2643 
   2644 	evcnt_attach_dynamic(&sc->sc_ev_tx_xoff, EVCNT_TYPE_MISC,
   2645 	    NULL, xname, "tx_xoff");
   2646 	evcnt_attach_dynamic(&sc->sc_ev_tx_xon, EVCNT_TYPE_MISC,
   2647 	    NULL, xname, "tx_xon");
   2648 	evcnt_attach_dynamic(&sc->sc_ev_rx_xoff, EVCNT_TYPE_MISC,
   2649 	    NULL, xname, "rx_xoff");
   2650 	evcnt_attach_dynamic(&sc->sc_ev_rx_xon, EVCNT_TYPE_MISC,
   2651 	    NULL, xname, "rx_xon");
   2652 	evcnt_attach_dynamic(&sc->sc_ev_rx_macctl, EVCNT_TYPE_MISC,
   2653 	    NULL, xname, "rx_macctl");
   2654 #endif /* WM_EVENT_COUNTERS */
   2655 
   2656 	if (pmf_device_register(self, wm_suspend, wm_resume))
   2657 		pmf_class_network_register(self, ifp);
   2658 	else
   2659 		aprint_error_dev(self, "couldn't establish power handler\n");
   2660 
   2661 	sc->sc_flags |= WM_F_ATTACHED;
   2662 	return;
   2663 
   2664 	/*
   2665 	 * Free any resources we've allocated during the failed attach
   2666 	 * attempt.  Do this in reverse order and fall through.
   2667 	 */
   2668  fail_5:
   2669 	for (i = 0; i < WM_NRXDESC; i++) {
   2670 		if (sc->sc_rxsoft[i].rxs_dmamap != NULL)
   2671 			bus_dmamap_destroy(sc->sc_dmat,
   2672 			    sc->sc_rxsoft[i].rxs_dmamap);
   2673 	}
   2674  fail_4:
   2675 	for (i = 0; i < WM_TXQUEUELEN(sc); i++) {
   2676 		if (sc->sc_txsoft[i].txs_dmamap != NULL)
   2677 			bus_dmamap_destroy(sc->sc_dmat,
   2678 			    sc->sc_txsoft[i].txs_dmamap);
   2679 	}
   2680 	bus_dmamap_unload(sc->sc_dmat, sc->sc_cddmamap);
   2681  fail_3:
   2682 	bus_dmamap_destroy(sc->sc_dmat, sc->sc_cddmamap);
   2683  fail_2:
   2684 	bus_dmamem_unmap(sc->sc_dmat, (void *)sc->sc_control_data,
   2685 	    sc->sc_cd_size);
   2686  fail_1:
   2687 	bus_dmamem_free(sc->sc_dmat, &sc->sc_cd_seg, sc->sc_cd_rseg);
   2688  fail_0:
   2689 	return;
   2690 }
   2691 
   2692 /* The detach function (ca_detach) */
   2693 static int
   2694 wm_detach(device_t self, int flags __unused)
   2695 {
   2696 	struct wm_softc *sc = device_private(self);
   2697 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
   2698 	int i;
   2699 #ifndef WM_MPSAFE
   2700 	int s;
   2701 #endif
   2702 
   2703 	if ((sc->sc_flags & WM_F_ATTACHED) == 0)
   2704 		return 0;
   2705 
   2706 #ifndef WM_MPSAFE
   2707 	s = splnet();
   2708 #endif
   2709 	/* Stop the interface. Callouts are stopped in it. */
   2710 	wm_stop(ifp, 1);
   2711 
   2712 #ifndef WM_MPSAFE
   2713 	splx(s);
   2714 #endif
   2715 
   2716 	pmf_device_deregister(self);
   2717 
   2718 	/* Tell the firmware about the release */
   2719 	WM_BOTH_LOCK(sc);
   2720 	wm_release_manageability(sc);
   2721 	wm_release_hw_control(sc);
   2722 	WM_BOTH_UNLOCK(sc);
   2723 
   2724 	mii_detach(&sc->sc_mii, MII_PHY_ANY, MII_OFFSET_ANY);
   2725 
   2726 	/* Delete all remaining media. */
   2727 	ifmedia_delete_instance(&sc->sc_mii.mii_media, IFM_INST_ANY);
   2728 
   2729 	ether_ifdetach(ifp);
   2730 	if_detach(ifp);
   2731 
   2732 
   2733 	/* Unload RX dmamaps and free mbufs */
   2734 	WM_RX_LOCK(sc);
   2735 	wm_rxdrain(sc);
   2736 	WM_RX_UNLOCK(sc);
   2737 	/* Must unlock here */
   2738 
   2739 	/* Free dmamap. It's the same as the end of the wm_attach() function */
   2740 	for (i = 0; i < WM_NRXDESC; i++) {
   2741 		if (sc->sc_rxsoft[i].rxs_dmamap != NULL)
   2742 			bus_dmamap_destroy(sc->sc_dmat,
   2743 			    sc->sc_rxsoft[i].rxs_dmamap);
   2744 	}
   2745 	for (i = 0; i < WM_TXQUEUELEN(sc); i++) {
   2746 		if (sc->sc_txsoft[i].txs_dmamap != NULL)
   2747 			bus_dmamap_destroy(sc->sc_dmat,
   2748 			    sc->sc_txsoft[i].txs_dmamap);
   2749 	}
   2750 	bus_dmamap_unload(sc->sc_dmat, sc->sc_cddmamap);
   2751 	bus_dmamap_destroy(sc->sc_dmat, sc->sc_cddmamap);
   2752 	bus_dmamem_unmap(sc->sc_dmat, (void *)sc->sc_control_data,
   2753 	    sc->sc_cd_size);
   2754 	bus_dmamem_free(sc->sc_dmat, &sc->sc_cd_seg, sc->sc_cd_rseg);
   2755 
   2756 	/* Disestablish the interrupt handler */
   2757 	for (i = 0; i < sc->sc_nintrs; i++) {
   2758 		if (sc->sc_ihs[i] != NULL) {
   2759 			pci_intr_disestablish(sc->sc_pc, sc->sc_ihs[i]);
   2760 			sc->sc_ihs[i] = NULL;
   2761 		}
   2762 	}
   2763 #ifdef WM_MSI_MSIX
   2764 	pci_intr_release(sc->sc_pc, sc->sc_intrs, sc->sc_nintrs);
   2765 #endif /* WM_MSI_MSIX */
   2766 
   2767 	/* Unmap the registers */
   2768 	if (sc->sc_ss) {
   2769 		bus_space_unmap(sc->sc_st, sc->sc_sh, sc->sc_ss);
   2770 		sc->sc_ss = 0;
   2771 	}
   2772 	if (sc->sc_ios) {
   2773 		bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios);
   2774 		sc->sc_ios = 0;
   2775 	}
   2776 	if (sc->sc_flashs) {
   2777 		bus_space_unmap(sc->sc_flasht, sc->sc_flashh, sc->sc_flashs);
   2778 		sc->sc_flashs = 0;
   2779 	}
   2780 
   2781 	if (sc->sc_tx_lock)
   2782 		mutex_obj_free(sc->sc_tx_lock);
   2783 	if (sc->sc_rx_lock)
   2784 		mutex_obj_free(sc->sc_rx_lock);
   2785 
   2786 	return 0;
   2787 }
   2788 
   2789 static bool
   2790 wm_suspend(device_t self, const pmf_qual_t *qual)
   2791 {
   2792 	struct wm_softc *sc = device_private(self);
   2793 
   2794 	wm_release_manageability(sc);
   2795 	wm_release_hw_control(sc);
   2796 #ifdef WM_WOL
   2797 	wm_enable_wakeup(sc);
   2798 #endif
   2799 
   2800 	return true;
   2801 }
   2802 
   2803 static bool
   2804 wm_resume(device_t self, const pmf_qual_t *qual)
   2805 {
   2806 	struct wm_softc *sc = device_private(self);
   2807 
   2808 	wm_init_manageability(sc);
   2809 
   2810 	return true;
   2811 }
   2812 
   2813 /*
   2814  * wm_watchdog:		[ifnet interface function]
   2815  *
   2816  *	Watchdog timer handler.
   2817  */
   2818 static void
   2819 wm_watchdog(struct ifnet *ifp)
   2820 {
   2821 	struct wm_softc *sc = ifp->if_softc;
   2822 
   2823 	/*
   2824 	 * Since we're using delayed interrupts, sweep up
   2825 	 * before we report an error.
   2826 	 */
   2827 	WM_TX_LOCK(sc);
   2828 	wm_txeof(sc);
   2829 	WM_TX_UNLOCK(sc);
   2830 
   2831 	if (sc->sc_txfree != WM_NTXDESC(sc)) {
   2832 #ifdef WM_DEBUG
   2833 		int i, j;
   2834 		struct wm_txsoft *txs;
   2835 #endif
   2836 		log(LOG_ERR,
   2837 		    "%s: device timeout (txfree %d txsfree %d txnext %d)\n",
   2838 		    device_xname(sc->sc_dev), sc->sc_txfree, sc->sc_txsfree,
   2839 		    sc->sc_txnext);
   2840 		ifp->if_oerrors++;
   2841 #ifdef WM_DEBUG
   2842 		for (i = sc->sc_txsdirty; i != sc->sc_txsnext ;
   2843 		    i = WM_NEXTTXS(sc, i)) {
   2844 		    txs = &sc->sc_txsoft[i];
   2845 		    printf("txs %d tx %d -> %d\n",
   2846 			i, txs->txs_firstdesc, txs->txs_lastdesc);
   2847 		    for (j = txs->txs_firstdesc; ;
   2848 			j = WM_NEXTTX(sc, j)) {
   2849 			printf("\tdesc %d: 0x%" PRIx64 "\n", j,
   2850 			    sc->sc_nq_txdescs[j].nqtx_data.nqtxd_addr);
   2851 			printf("\t %#08x%08x\n",
   2852 			    sc->sc_nq_txdescs[j].nqtx_data.nqtxd_fields,
   2853 			    sc->sc_nq_txdescs[j].nqtx_data.nqtxd_cmdlen);
   2854 			if (j == txs->txs_lastdesc)
   2855 				break;
   2856 			}
   2857 		}
   2858 #endif
   2859 		/* Reset the interface. */
   2860 		(void) wm_init(ifp);
   2861 	}
   2862 
   2863 	/* Try to get more packets going. */
   2864 	ifp->if_start(ifp);
   2865 }
   2866 
   2867 /*
   2868  * wm_tick:
   2869  *
   2870  *	One second timer, used to check link status, sweep up
   2871  *	completed transmit jobs, etc.
   2872  */
   2873 static void
   2874 wm_tick(void *arg)
   2875 {
   2876 	struct wm_softc *sc = arg;
   2877 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
   2878 #ifndef WM_MPSAFE
   2879 	int s;
   2880 
   2881 	s = splnet();
   2882 #endif
   2883 
   2884 	WM_TX_LOCK(sc);
   2885 
   2886 	if (sc->sc_stopping)
   2887 		goto out;
   2888 
   2889 	if (sc->sc_type >= WM_T_82542_2_1) {
   2890 		WM_EVCNT_ADD(&sc->sc_ev_rx_xon, CSR_READ(sc, WMREG_XONRXC));
   2891 		WM_EVCNT_ADD(&sc->sc_ev_tx_xon, CSR_READ(sc, WMREG_XONTXC));
   2892 		WM_EVCNT_ADD(&sc->sc_ev_rx_xoff, CSR_READ(sc, WMREG_XOFFRXC));
   2893 		WM_EVCNT_ADD(&sc->sc_ev_tx_xoff, CSR_READ(sc, WMREG_XOFFTXC));
   2894 		WM_EVCNT_ADD(&sc->sc_ev_rx_macctl, CSR_READ(sc, WMREG_FCRUC));
   2895 	}
   2896 
   2897 	ifp->if_collisions += CSR_READ(sc, WMREG_COLC);
   2898 	ifp->if_ierrors += 0ULL + /* ensure quad_t */
   2899 	    + CSR_READ(sc, WMREG_CRCERRS)
   2900 	    + CSR_READ(sc, WMREG_ALGNERRC)
   2901 	    + CSR_READ(sc, WMREG_SYMERRC)
   2902 	    + CSR_READ(sc, WMREG_RXERRC)
   2903 	    + CSR_READ(sc, WMREG_SEC)
   2904 	    + CSR_READ(sc, WMREG_CEXTERR)
   2905 	    + CSR_READ(sc, WMREG_RLEC);
   2906 	ifp->if_iqdrops += CSR_READ(sc, WMREG_MPC) + CSR_READ(sc, WMREG_RNBC);
   2907 
   2908 	if (sc->sc_flags & WM_F_HAS_MII)
   2909 		mii_tick(&sc->sc_mii);
   2910 	else if ((sc->sc_type >= WM_T_82575)
   2911 	    && (sc->sc_mediatype == WM_MEDIATYPE_SERDES))
   2912 		wm_serdes_tick(sc);
   2913 	else
   2914 		wm_tbi_tick(sc);
   2915 
   2916 out:
   2917 	WM_TX_UNLOCK(sc);
   2918 #ifndef WM_MPSAFE
   2919 	splx(s);
   2920 #endif
   2921 
   2922 	if (!sc->sc_stopping)
   2923 		callout_reset(&sc->sc_tick_ch, hz, wm_tick, sc);
   2924 }
   2925 
   2926 static int
   2927 wm_ifflags_cb(struct ethercom *ec)
   2928 {
   2929 	struct ifnet *ifp = &ec->ec_if;
   2930 	struct wm_softc *sc = ifp->if_softc;
   2931 	int change = ifp->if_flags ^ sc->sc_if_flags;
   2932 	int rc = 0;
   2933 
   2934 	WM_BOTH_LOCK(sc);
   2935 
   2936 	if (change != 0)
   2937 		sc->sc_if_flags = ifp->if_flags;
   2938 
   2939 	if ((change & ~(IFF_CANTCHANGE|IFF_DEBUG)) != 0) {
   2940 		rc = ENETRESET;
   2941 		goto out;
   2942 	}
   2943 
   2944 	if ((change & (IFF_PROMISC | IFF_ALLMULTI)) != 0)
   2945 		wm_set_filter(sc);
   2946 
   2947 	wm_set_vlan(sc);
   2948 
   2949 out:
   2950 	WM_BOTH_UNLOCK(sc);
   2951 
   2952 	return rc;
   2953 }
   2954 
   2955 /*
   2956  * wm_ioctl:		[ifnet interface function]
   2957  *
   2958  *	Handle control requests from the operator.
   2959  */
   2960 static int
   2961 wm_ioctl(struct ifnet *ifp, u_long cmd, void *data)
   2962 {
   2963 	struct wm_softc *sc = ifp->if_softc;
   2964 	struct ifreq *ifr = (struct ifreq *) data;
   2965 	struct ifaddr *ifa = (struct ifaddr *)data;
   2966 	struct sockaddr_dl *sdl;
   2967 	int s, error;
   2968 
   2969 #ifndef WM_MPSAFE
   2970 	s = splnet();
   2971 #endif
   2972 	switch (cmd) {
   2973 	case SIOCSIFMEDIA:
   2974 	case SIOCGIFMEDIA:
   2975 		WM_BOTH_LOCK(sc);
   2976 		/* Flow control requires full-duplex mode. */
   2977 		if (IFM_SUBTYPE(ifr->ifr_media) == IFM_AUTO ||
   2978 		    (ifr->ifr_media & IFM_FDX) == 0)
   2979 			ifr->ifr_media &= ~IFM_ETH_FMASK;
   2980 		if (IFM_SUBTYPE(ifr->ifr_media) != IFM_AUTO) {
   2981 			if ((ifr->ifr_media & IFM_ETH_FMASK) == IFM_FLOW) {
   2982 				/* We can do both TXPAUSE and RXPAUSE. */
   2983 				ifr->ifr_media |=
   2984 				    IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE;
   2985 			}
   2986 			sc->sc_flowflags = ifr->ifr_media & IFM_ETH_FMASK;
   2987 		}
   2988 		WM_BOTH_UNLOCK(sc);
   2989 #ifdef WM_MPSAFE
   2990 		s = splnet();
   2991 #endif
   2992 		error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii.mii_media, cmd);
   2993 #ifdef WM_MPSAFE
   2994 		splx(s);
   2995 #endif
   2996 		break;
   2997 	case SIOCINITIFADDR:
   2998 		WM_BOTH_LOCK(sc);
   2999 		if (ifa->ifa_addr->sa_family == AF_LINK) {
   3000 			sdl = satosdl(ifp->if_dl->ifa_addr);
   3001 			(void)sockaddr_dl_setaddr(sdl, sdl->sdl_len,
   3002 			    LLADDR(satosdl(ifa->ifa_addr)), ifp->if_addrlen);
   3003 			/* unicast address is first multicast entry */
   3004 			wm_set_filter(sc);
   3005 			error = 0;
   3006 			WM_BOTH_UNLOCK(sc);
   3007 			break;
   3008 		}
   3009 		WM_BOTH_UNLOCK(sc);
   3010 		/*FALLTHROUGH*/
   3011 	default:
   3012 #ifdef WM_MPSAFE
   3013 		s = splnet();
   3014 #endif
   3015 		/* It may call wm_start, so unlock here */
   3016 		error = ether_ioctl(ifp, cmd, data);
   3017 #ifdef WM_MPSAFE
   3018 		splx(s);
   3019 #endif
   3020 		if (error != ENETRESET)
   3021 			break;
   3022 
   3023 		error = 0;
   3024 
   3025 		if (cmd == SIOCSIFCAP) {
   3026 			error = (*ifp->if_init)(ifp);
   3027 		} else if (cmd != SIOCADDMULTI && cmd != SIOCDELMULTI)
   3028 			;
   3029 		else if (ifp->if_flags & IFF_RUNNING) {
   3030 			/*
   3031 			 * Multicast list has changed; set the hardware filter
   3032 			 * accordingly.
   3033 			 */
   3034 			WM_BOTH_LOCK(sc);
   3035 			wm_set_filter(sc);
   3036 			WM_BOTH_UNLOCK(sc);
   3037 		}
   3038 		break;
   3039 	}
   3040 
   3041 #ifndef WM_MPSAFE
   3042 	splx(s);
   3043 #endif
   3044 	return error;
   3045 }
   3046 
   3047 /* MAC address related */
   3048 
   3049 /*
   3050  * Get the offset of MAC address and return it.
   3051  * If error occured, use offset 0.
   3052  */
   3053 static uint16_t
   3054 wm_check_alt_mac_addr(struct wm_softc *sc)
   3055 {
   3056 	uint16_t myea[ETHER_ADDR_LEN / 2];
   3057 	uint16_t offset = NVM_OFF_MACADDR;
   3058 
   3059 	/* Try to read alternative MAC address pointer */
   3060 	if (wm_nvm_read(sc, NVM_OFF_ALT_MAC_ADDR_PTR, 1, &offset) != 0)
   3061 		return 0;
   3062 
   3063 	/* Check pointer if it's valid or not. */
   3064 	if ((offset == 0x0000) || (offset == 0xffff))
   3065 		return 0;
   3066 
   3067 	offset += NVM_OFF_MACADDR_82571(sc->sc_funcid);
   3068 	/*
   3069 	 * Check whether alternative MAC address is valid or not.
   3070 	 * Some cards have non 0xffff pointer but those don't use
   3071 	 * alternative MAC address in reality.
   3072 	 *
   3073 	 * Check whether the broadcast bit is set or not.
   3074 	 */
   3075 	if (wm_nvm_read(sc, offset, 1, myea) == 0)
   3076 		if (((myea[0] & 0xff) & 0x01) == 0)
   3077 			return offset; /* Found */
   3078 
   3079 	/* Not found */
   3080 	return 0;
   3081 }
   3082 
   3083 static int
   3084 wm_read_mac_addr(struct wm_softc *sc, uint8_t *enaddr)
   3085 {
   3086 	uint16_t myea[ETHER_ADDR_LEN / 2];
   3087 	uint16_t offset = NVM_OFF_MACADDR;
   3088 	int do_invert = 0;
   3089 
   3090 	switch (sc->sc_type) {
   3091 	case WM_T_82580:
   3092 	case WM_T_I350:
   3093 	case WM_T_I354:
   3094 		/* EEPROM Top Level Partitioning */
   3095 		offset = NVM_OFF_LAN_FUNC_82580(sc->sc_funcid) + 0;
   3096 		break;
   3097 	case WM_T_82571:
   3098 	case WM_T_82575:
   3099 	case WM_T_82576:
   3100 	case WM_T_80003:
   3101 	case WM_T_I210:
   3102 	case WM_T_I211:
   3103 		offset = wm_check_alt_mac_addr(sc);
   3104 		if (offset == 0)
   3105 			if ((sc->sc_funcid & 0x01) == 1)
   3106 				do_invert = 1;
   3107 		break;
   3108 	default:
   3109 		if ((sc->sc_funcid & 0x01) == 1)
   3110 			do_invert = 1;
   3111 		break;
   3112 	}
   3113 
   3114 	if (wm_nvm_read(sc, offset, sizeof(myea) / sizeof(myea[0]),
   3115 		myea) != 0)
   3116 		goto bad;
   3117 
   3118 	enaddr[0] = myea[0] & 0xff;
   3119 	enaddr[1] = myea[0] >> 8;
   3120 	enaddr[2] = myea[1] & 0xff;
   3121 	enaddr[3] = myea[1] >> 8;
   3122 	enaddr[4] = myea[2] & 0xff;
   3123 	enaddr[5] = myea[2] >> 8;
   3124 
   3125 	/*
   3126 	 * Toggle the LSB of the MAC address on the second port
   3127 	 * of some dual port cards.
   3128 	 */
   3129 	if (do_invert != 0)
   3130 		enaddr[5] ^= 1;
   3131 
   3132 	return 0;
   3133 
   3134  bad:
   3135 	return -1;
   3136 }
   3137 
   3138 /*
   3139  * wm_set_ral:
   3140  *
   3141  *	Set an entery in the receive address list.
   3142  */
   3143 static void
   3144 wm_set_ral(struct wm_softc *sc, const uint8_t *enaddr, int idx)
   3145 {
   3146 	uint32_t ral_lo, ral_hi;
   3147 
   3148 	if (enaddr != NULL) {
   3149 		ral_lo = enaddr[0] | (enaddr[1] << 8) | (enaddr[2] << 16) |
   3150 		    (enaddr[3] << 24);
   3151 		ral_hi = enaddr[4] | (enaddr[5] << 8);
   3152 		ral_hi |= RAL_AV;
   3153 	} else {
   3154 		ral_lo = 0;
   3155 		ral_hi = 0;
   3156 	}
   3157 
   3158 	if (sc->sc_type >= WM_T_82544) {
   3159 		CSR_WRITE(sc, WMREG_RAL_LO(WMREG_CORDOVA_RAL_BASE, idx),
   3160 		    ral_lo);
   3161 		CSR_WRITE(sc, WMREG_RAL_HI(WMREG_CORDOVA_RAL_BASE, idx),
   3162 		    ral_hi);
   3163 	} else {
   3164 		CSR_WRITE(sc, WMREG_RAL_LO(WMREG_RAL_BASE, idx), ral_lo);
   3165 		CSR_WRITE(sc, WMREG_RAL_HI(WMREG_RAL_BASE, idx), ral_hi);
   3166 	}
   3167 }
   3168 
   3169 /*
   3170  * wm_mchash:
   3171  *
   3172  *	Compute the hash of the multicast address for the 4096-bit
   3173  *	multicast filter.
   3174  */
   3175 static uint32_t
   3176 wm_mchash(struct wm_softc *sc, const uint8_t *enaddr)
   3177 {
   3178 	static const int lo_shift[4] = { 4, 3, 2, 0 };
   3179 	static const int hi_shift[4] = { 4, 5, 6, 8 };
   3180 	static const int ich8_lo_shift[4] = { 6, 5, 4, 2 };
   3181 	static const int ich8_hi_shift[4] = { 2, 3, 4, 6 };
   3182 	uint32_t hash;
   3183 
   3184 	if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
   3185 	    || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
   3186 	    || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)) {
   3187 		hash = (enaddr[4] >> ich8_lo_shift[sc->sc_mchash_type]) |
   3188 		    (((uint16_t) enaddr[5]) << ich8_hi_shift[sc->sc_mchash_type]);
   3189 		return (hash & 0x3ff);
   3190 	}
   3191 	hash = (enaddr[4] >> lo_shift[sc->sc_mchash_type]) |
   3192 	    (((uint16_t) enaddr[5]) << hi_shift[sc->sc_mchash_type]);
   3193 
   3194 	return (hash & 0xfff);
   3195 }
   3196 
   3197 /*
   3198  * wm_set_filter:
   3199  *
   3200  *	Set up the receive filter.
   3201  */
   3202 static void
   3203 wm_set_filter(struct wm_softc *sc)
   3204 {
   3205 	struct ethercom *ec = &sc->sc_ethercom;
   3206 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
   3207 	struct ether_multi *enm;
   3208 	struct ether_multistep step;
   3209 	bus_addr_t mta_reg;
   3210 	uint32_t hash, reg, bit;
   3211 	int i, size;
   3212 
   3213 	if (sc->sc_type >= WM_T_82544)
   3214 		mta_reg = WMREG_CORDOVA_MTA;
   3215 	else
   3216 		mta_reg = WMREG_MTA;
   3217 
   3218 	sc->sc_rctl &= ~(RCTL_BAM | RCTL_UPE | RCTL_MPE);
   3219 
   3220 	if (ifp->if_flags & IFF_BROADCAST)
   3221 		sc->sc_rctl |= RCTL_BAM;
   3222 	if (ifp->if_flags & IFF_PROMISC) {
   3223 		sc->sc_rctl |= RCTL_UPE;
   3224 		goto allmulti;
   3225 	}
   3226 
   3227 	/*
   3228 	 * Set the station address in the first RAL slot, and
   3229 	 * clear the remaining slots.
   3230 	 */
   3231 	if (sc->sc_type == WM_T_ICH8)
   3232 		size = WM_RAL_TABSIZE_ICH8 -1;
   3233 	else if ((sc->sc_type == WM_T_ICH9) || (sc->sc_type == WM_T_ICH10)
   3234 	    || (sc->sc_type == WM_T_PCH) || (sc->sc_type == WM_T_PCH2)
   3235 	    || (sc->sc_type == WM_T_PCH_LPT))
   3236 		size = WM_RAL_TABSIZE_ICH8;
   3237 	else if (sc->sc_type == WM_T_82575)
   3238 		size = WM_RAL_TABSIZE_82575;
   3239 	else if ((sc->sc_type == WM_T_82576) || (sc->sc_type == WM_T_82580))
   3240 		size = WM_RAL_TABSIZE_82576;
   3241 	else if ((sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354))
   3242 		size = WM_RAL_TABSIZE_I350;
   3243 	else
   3244 		size = WM_RAL_TABSIZE;
   3245 	wm_set_ral(sc, CLLADDR(ifp->if_sadl), 0);
   3246 	for (i = 1; i < size; i++)
   3247 		wm_set_ral(sc, NULL, i);
   3248 
   3249 	if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
   3250 	    || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
   3251 	    || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT))
   3252 		size = WM_ICH8_MC_TABSIZE;
   3253 	else
   3254 		size = WM_MC_TABSIZE;
   3255 	/* Clear out the multicast table. */
   3256 	for (i = 0; i < size; i++)
   3257 		CSR_WRITE(sc, mta_reg + (i << 2), 0);
   3258 
   3259 	ETHER_FIRST_MULTI(step, ec, enm);
   3260 	while (enm != NULL) {
   3261 		if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
   3262 			/*
   3263 			 * We must listen to a range of multicast addresses.
   3264 			 * For now, just accept all multicasts, rather than
   3265 			 * trying to set only those filter bits needed to match
   3266 			 * the range.  (At this time, the only use of address
   3267 			 * ranges is for IP multicast routing, for which the
   3268 			 * range is big enough to require all bits set.)
   3269 			 */
   3270 			goto allmulti;
   3271 		}
   3272 
   3273 		hash = wm_mchash(sc, enm->enm_addrlo);
   3274 
   3275 		reg = (hash >> 5);
   3276 		if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
   3277 		    || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
   3278 		    || (sc->sc_type == WM_T_PCH2)
   3279 		    || (sc->sc_type == WM_T_PCH_LPT))
   3280 			reg &= 0x1f;
   3281 		else
   3282 			reg &= 0x7f;
   3283 		bit = hash & 0x1f;
   3284 
   3285 		hash = CSR_READ(sc, mta_reg + (reg << 2));
   3286 		hash |= 1U << bit;
   3287 
   3288 		/* XXX Hardware bug?? */
   3289 		if (sc->sc_type == WM_T_82544 && (reg & 0xe) == 1) {
   3290 			bit = CSR_READ(sc, mta_reg + ((reg - 1) << 2));
   3291 			CSR_WRITE(sc, mta_reg + (reg << 2), hash);
   3292 			CSR_WRITE(sc, mta_reg + ((reg - 1) << 2), bit);
   3293 		} else
   3294 			CSR_WRITE(sc, mta_reg + (reg << 2), hash);
   3295 
   3296 		ETHER_NEXT_MULTI(step, enm);
   3297 	}
   3298 
   3299 	ifp->if_flags &= ~IFF_ALLMULTI;
   3300 	goto setit;
   3301 
   3302  allmulti:
   3303 	ifp->if_flags |= IFF_ALLMULTI;
   3304 	sc->sc_rctl |= RCTL_MPE;
   3305 
   3306  setit:
   3307 	CSR_WRITE(sc, WMREG_RCTL, sc->sc_rctl);
   3308 }
   3309 
   3310 /* Reset and init related */
   3311 
   3312 static void
   3313 wm_set_vlan(struct wm_softc *sc)
   3314 {
   3315 	/* Deal with VLAN enables. */
   3316 	if (VLAN_ATTACHED(&sc->sc_ethercom))
   3317 		sc->sc_ctrl |= CTRL_VME;
   3318 	else
   3319 		sc->sc_ctrl &= ~CTRL_VME;
   3320 
   3321 	/* Write the control registers. */
   3322 	CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
   3323 }
   3324 
   3325 static void
   3326 wm_set_pcie_completion_timeout(struct wm_softc *sc)
   3327 {
   3328 	uint32_t gcr;
   3329 	pcireg_t ctrl2;
   3330 
   3331 	gcr = CSR_READ(sc, WMREG_GCR);
   3332 
   3333 	/* Only take action if timeout value is defaulted to 0 */
   3334 	if ((gcr & GCR_CMPL_TMOUT_MASK) != 0)
   3335 		goto out;
   3336 
   3337 	if ((gcr & GCR_CAP_VER2) == 0) {
   3338 		gcr |= GCR_CMPL_TMOUT_10MS;
   3339 		goto out;
   3340 	}
   3341 
   3342 	ctrl2 = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
   3343 	    sc->sc_pcixe_capoff + PCIE_DCSR2);
   3344 	ctrl2 |= WM_PCIE_DCSR2_16MS;
   3345 	pci_conf_write(sc->sc_pc, sc->sc_pcitag,
   3346 	    sc->sc_pcixe_capoff + PCIE_DCSR2, ctrl2);
   3347 
   3348 out:
   3349 	/* Disable completion timeout resend */
   3350 	gcr &= ~GCR_CMPL_TMOUT_RESEND;
   3351 
   3352 	CSR_WRITE(sc, WMREG_GCR, gcr);
   3353 }
   3354 
   3355 void
   3356 wm_get_auto_rd_done(struct wm_softc *sc)
   3357 {
   3358 	int i;
   3359 
   3360 	/* wait for eeprom to reload */
   3361 	switch (sc->sc_type) {
   3362 	case WM_T_82571:
   3363 	case WM_T_82572:
   3364 	case WM_T_82573:
   3365 	case WM_T_82574:
   3366 	case WM_T_82583:
   3367 	case WM_T_82575:
   3368 	case WM_T_82576:
   3369 	case WM_T_82580:
   3370 	case WM_T_I350:
   3371 	case WM_T_I354:
   3372 	case WM_T_I210:
   3373 	case WM_T_I211:
   3374 	case WM_T_80003:
   3375 	case WM_T_ICH8:
   3376 	case WM_T_ICH9:
   3377 		for (i = 0; i < 10; i++) {
   3378 			if (CSR_READ(sc, WMREG_EECD) & EECD_EE_AUTORD)
   3379 				break;
   3380 			delay(1000);
   3381 		}
   3382 		if (i == 10) {
   3383 			log(LOG_ERR, "%s: auto read from eeprom failed to "
   3384 			    "complete\n", device_xname(sc->sc_dev));
   3385 		}
   3386 		break;
   3387 	default:
   3388 		break;
   3389 	}
   3390 }
   3391 
   3392 void
   3393 wm_lan_init_done(struct wm_softc *sc)
   3394 {
   3395 	uint32_t reg = 0;
   3396 	int i;
   3397 
   3398 	/* wait for eeprom to reload */
   3399 	switch (sc->sc_type) {
   3400 	case WM_T_ICH10:
   3401 	case WM_T_PCH:
   3402 	case WM_T_PCH2:
   3403 	case WM_T_PCH_LPT:
   3404 		for (i = 0; i < WM_ICH8_LAN_INIT_TIMEOUT; i++) {
   3405 			reg = CSR_READ(sc, WMREG_STATUS);
   3406 			if ((reg & STATUS_LAN_INIT_DONE) != 0)
   3407 				break;
   3408 			delay(100);
   3409 		}
   3410 		if (i >= WM_ICH8_LAN_INIT_TIMEOUT) {
   3411 			log(LOG_ERR, "%s: %s: lan_init_done failed to "
   3412 			    "complete\n", device_xname(sc->sc_dev), __func__);
   3413 		}
   3414 		break;
   3415 	default:
   3416 		panic("%s: %s: unknown type\n", device_xname(sc->sc_dev),
   3417 		    __func__);
   3418 		break;
   3419 	}
   3420 
   3421 	reg &= ~STATUS_LAN_INIT_DONE;
   3422 	CSR_WRITE(sc, WMREG_STATUS, reg);
   3423 }
   3424 
   3425 void
   3426 wm_get_cfg_done(struct wm_softc *sc)
   3427 {
   3428 	int mask;
   3429 	uint32_t reg;
   3430 	int i;
   3431 
   3432 	/* wait for eeprom to reload */
   3433 	switch (sc->sc_type) {
   3434 	case WM_T_82542_2_0:
   3435 	case WM_T_82542_2_1:
   3436 		/* null */
   3437 		break;
   3438 	case WM_T_82543:
   3439 	case WM_T_82544:
   3440 	case WM_T_82540:
   3441 	case WM_T_82545:
   3442 	case WM_T_82545_3:
   3443 	case WM_T_82546:
   3444 	case WM_T_82546_3:
   3445 	case WM_T_82541:
   3446 	case WM_T_82541_2:
   3447 	case WM_T_82547:
   3448 	case WM_T_82547_2:
   3449 	case WM_T_82573:
   3450 	case WM_T_82574:
   3451 	case WM_T_82583:
   3452 		/* generic */
   3453 		delay(10*1000);
   3454 		break;
   3455 	case WM_T_80003:
   3456 	case WM_T_82571:
   3457 	case WM_T_82572:
   3458 	case WM_T_82575:
   3459 	case WM_T_82576:
   3460 	case WM_T_82580:
   3461 	case WM_T_I350:
   3462 	case WM_T_I354:
   3463 	case WM_T_I210:
   3464 	case WM_T_I211:
   3465 		if (sc->sc_type == WM_T_82571) {
   3466 			/* Only 82571 shares port 0 */
   3467 			mask = EEMNGCTL_CFGDONE_0;
   3468 		} else
   3469 			mask = EEMNGCTL_CFGDONE_0 << sc->sc_funcid;
   3470 		for (i = 0; i < WM_PHY_CFG_TIMEOUT; i++) {
   3471 			if (CSR_READ(sc, WMREG_EEMNGCTL) & mask)
   3472 				break;
   3473 			delay(1000);
   3474 		}
   3475 		if (i >= WM_PHY_CFG_TIMEOUT) {
   3476 			DPRINTF(WM_DEBUG_GMII, ("%s: %s failed\n",
   3477 				device_xname(sc->sc_dev), __func__));
   3478 		}
   3479 		break;
   3480 	case WM_T_ICH8:
   3481 	case WM_T_ICH9:
   3482 	case WM_T_ICH10:
   3483 	case WM_T_PCH:
   3484 	case WM_T_PCH2:
   3485 	case WM_T_PCH_LPT:
   3486 		delay(10*1000);
   3487 		if (sc->sc_type >= WM_T_ICH10)
   3488 			wm_lan_init_done(sc);
   3489 		else
   3490 			wm_get_auto_rd_done(sc);
   3491 
   3492 		reg = CSR_READ(sc, WMREG_STATUS);
   3493 		if ((reg & STATUS_PHYRA) != 0)
   3494 			CSR_WRITE(sc, WMREG_STATUS, reg & ~STATUS_PHYRA);
   3495 		break;
   3496 	default:
   3497 		panic("%s: %s: unknown type\n", device_xname(sc->sc_dev),
   3498 		    __func__);
   3499 		break;
   3500 	}
   3501 }
   3502 
   3503 /* Init hardware bits */
   3504 void
   3505 wm_initialize_hardware_bits(struct wm_softc *sc)
   3506 {
   3507 	uint32_t tarc0, tarc1, reg;
   3508 
   3509 	/* For 82571 variant, 80003 and ICHs */
   3510 	if (((sc->sc_type >= WM_T_82571) && (sc->sc_type <= WM_T_82583))
   3511 	    || (sc->sc_type >= WM_T_80003)) {
   3512 
   3513 		/* Transmit Descriptor Control 0 */
   3514 		reg = CSR_READ(sc, WMREG_TXDCTL(0));
   3515 		reg |= TXDCTL_COUNT_DESC;
   3516 		CSR_WRITE(sc, WMREG_TXDCTL(0), reg);
   3517 
   3518 		/* Transmit Descriptor Control 1 */
   3519 		reg = CSR_READ(sc, WMREG_TXDCTL(1));
   3520 		reg |= TXDCTL_COUNT_DESC;
   3521 		CSR_WRITE(sc, WMREG_TXDCTL(1), reg);
   3522 
   3523 		/* TARC0 */
   3524 		tarc0 = CSR_READ(sc, WMREG_TARC0);
   3525 		switch (sc->sc_type) {
   3526 		case WM_T_82571:
   3527 		case WM_T_82572:
   3528 		case WM_T_82573:
   3529 		case WM_T_82574:
   3530 		case WM_T_82583:
   3531 		case WM_T_80003:
   3532 			/* Clear bits 30..27 */
   3533 			tarc0 &= ~__BITS(30, 27);
   3534 			break;
   3535 		default:
   3536 			break;
   3537 		}
   3538 
   3539 		switch (sc->sc_type) {
   3540 		case WM_T_82571:
   3541 		case WM_T_82572:
   3542 			tarc0 |= __BITS(26, 23); /* TARC0 bits 23-26 */
   3543 
   3544 			tarc1 = CSR_READ(sc, WMREG_TARC1);
   3545 			tarc1 &= ~__BITS(30, 29); /* Clear bits 30 and 29 */
   3546 			tarc1 |= __BITS(26, 24); /* TARC1 bits 26-24 */
   3547 			/* 8257[12] Errata No.7 */
   3548 			tarc1 |= __BIT(22); /* TARC1 bits 22 */
   3549 
   3550 			/* TARC1 bit 28 */
   3551 			if ((CSR_READ(sc, WMREG_TCTL) & TCTL_MULR) != 0)
   3552 				tarc1 &= ~__BIT(28);
   3553 			else
   3554 				tarc1 |= __BIT(28);
   3555 			CSR_WRITE(sc, WMREG_TARC1, tarc1);
   3556 
   3557 			/*
   3558 			 * 8257[12] Errata No.13
   3559 			 * Disable Dyamic Clock Gating.
   3560 			 */
   3561 			reg = CSR_READ(sc, WMREG_CTRL_EXT);
   3562 			reg &= ~CTRL_EXT_DMA_DYN_CLK;
   3563 			CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
   3564 			break;
   3565 		case WM_T_82573:
   3566 		case WM_T_82574:
   3567 		case WM_T_82583:
   3568 			if ((sc->sc_type == WM_T_82574)
   3569 			    || (sc->sc_type == WM_T_82583))
   3570 				tarc0 |= __BIT(26); /* TARC0 bit 26 */
   3571 
   3572 			/* Extended Device Control */
   3573 			reg = CSR_READ(sc, WMREG_CTRL_EXT);
   3574 			reg &= ~__BIT(23);	/* Clear bit 23 */
   3575 			reg |= __BIT(22);	/* Set bit 22 */
   3576 			CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
   3577 
   3578 			/* Device Control */
   3579 			sc->sc_ctrl &= ~__BIT(29);	/* Clear bit 29 */
   3580 			CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
   3581 
   3582 			/* PCIe Control Register */
   3583 			if ((sc->sc_type == WM_T_82574)
   3584 			    || (sc->sc_type == WM_T_82583)) {
   3585 				/*
   3586 				 * Document says this bit must be set for
   3587 				 * proper operation.
   3588 				 */
   3589 				reg = CSR_READ(sc, WMREG_GCR);
   3590 				reg |= __BIT(22);
   3591 				CSR_WRITE(sc, WMREG_GCR, reg);
   3592 
   3593 				/*
   3594 				 * Apply workaround for hardware errata
   3595 				 * documented in errata docs Fixes issue where
   3596 				 * some error prone or unreliable PCIe
   3597 				 * completions are occurring, particularly
   3598 				 * with ASPM enabled. Without fix, issue can
   3599 				 * cause Tx timeouts.
   3600 				 */
   3601 				reg = CSR_READ(sc, WMREG_GCR2);
   3602 				reg |= __BIT(0);
   3603 				CSR_WRITE(sc, WMREG_GCR2, reg);
   3604 			}
   3605 			break;
   3606 		case WM_T_80003:
   3607 			/* TARC0 */
   3608 			if ((sc->sc_mediatype == WM_MEDIATYPE_FIBER)
   3609 			    || (sc->sc_mediatype == WM_MEDIATYPE_SERDES))
   3610 				tarc0 &= ~__BIT(20); /* Clear bits 20 */
   3611 
   3612 			/* TARC1 bit 28 */
   3613 			tarc1 = CSR_READ(sc, WMREG_TARC1);
   3614 			if ((CSR_READ(sc, WMREG_TCTL) & TCTL_MULR) != 0)
   3615 				tarc1 &= ~__BIT(28);
   3616 			else
   3617 				tarc1 |= __BIT(28);
   3618 			CSR_WRITE(sc, WMREG_TARC1, tarc1);
   3619 			break;
   3620 		case WM_T_ICH8:
   3621 		case WM_T_ICH9:
   3622 		case WM_T_ICH10:
   3623 		case WM_T_PCH:
   3624 		case WM_T_PCH2:
   3625 		case WM_T_PCH_LPT:
   3626 			/* TARC 0 */
   3627 			if (sc->sc_type == WM_T_ICH8) {
   3628 				/* Set TARC0 bits 29 and 28 */
   3629 				tarc0 |= __BITS(29, 28);
   3630 			}
   3631 			/* Set TARC0 bits 23,24,26,27 */
   3632 			tarc0 |= __BITS(27, 26) | __BITS(24, 23);
   3633 
   3634 			/* CTRL_EXT */
   3635 			reg = CSR_READ(sc, WMREG_CTRL_EXT);
   3636 			reg |= __BIT(22);	/* Set bit 22 */
   3637 			/*
   3638 			 * Enable PHY low-power state when MAC is at D3
   3639 			 * w/o WoL
   3640 			 */
   3641 			if (sc->sc_type >= WM_T_PCH)
   3642 				reg |= CTRL_EXT_PHYPDEN;
   3643 			CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
   3644 
   3645 			/* TARC1 */
   3646 			tarc1 = CSR_READ(sc, WMREG_TARC1);
   3647 			/* bit 28 */
   3648 			if ((CSR_READ(sc, WMREG_TCTL) & TCTL_MULR) != 0)
   3649 				tarc1 &= ~__BIT(28);
   3650 			else
   3651 				tarc1 |= __BIT(28);
   3652 			tarc1 |= __BIT(24) | __BIT(26) | __BIT(30);
   3653 			CSR_WRITE(sc, WMREG_TARC1, tarc1);
   3654 
   3655 			/* Device Status */
   3656 			if (sc->sc_type == WM_T_ICH8) {
   3657 				reg = CSR_READ(sc, WMREG_STATUS);
   3658 				reg &= ~__BIT(31);
   3659 				CSR_WRITE(sc, WMREG_STATUS, reg);
   3660 
   3661 			}
   3662 
   3663 			/*
   3664 			 * Work-around descriptor data corruption issue during
   3665 			 * NFS v2 UDP traffic, just disable the NFS filtering
   3666 			 * capability.
   3667 			 */
   3668 			reg = CSR_READ(sc, WMREG_RFCTL);
   3669 			reg |= WMREG_RFCTL_NFSWDIS | WMREG_RFCTL_NFSRDIS;
   3670 			CSR_WRITE(sc, WMREG_RFCTL, reg);
   3671 			break;
   3672 		default:
   3673 			break;
   3674 		}
   3675 		CSR_WRITE(sc, WMREG_TARC0, tarc0);
   3676 
   3677 		/*
   3678 		 * 8257[12] Errata No.52 and some others.
   3679 		 * Avoid RSS Hash Value bug.
   3680 		 */
   3681 		switch (sc->sc_type) {
   3682 		case WM_T_82571:
   3683 		case WM_T_82572:
   3684 		case WM_T_82573:
   3685 		case WM_T_80003:
   3686 		case WM_T_ICH8:
   3687 			reg = CSR_READ(sc, WMREG_RFCTL);
   3688 			reg |= WMREG_RFCTL_NEWIPV6EXDIS |WMREG_RFCTL_IPV6EXDIS;
   3689 			CSR_WRITE(sc, WMREG_RFCTL, reg);
   3690 			break;
   3691 		default:
   3692 			break;
   3693 		}
   3694 	}
   3695 }
   3696 
   3697 static uint32_t
   3698 wm_rxpbs_adjust_82580(uint32_t val)
   3699 {
   3700 	uint32_t rv = 0;
   3701 
   3702 	if (val < __arraycount(wm_82580_rxpbs_table))
   3703 		rv = wm_82580_rxpbs_table[val];
   3704 
   3705 	return rv;
   3706 }
   3707 
   3708 /*
   3709  * wm_reset:
   3710  *
   3711  *	Reset the i82542 chip.
   3712  */
   3713 static void
   3714 wm_reset(struct wm_softc *sc)
   3715 {
   3716 	int phy_reset = 0;
   3717 	int error = 0;
   3718 	uint32_t reg, mask;
   3719 
   3720 	/*
   3721 	 * Allocate on-chip memory according to the MTU size.
   3722 	 * The Packet Buffer Allocation register must be written
   3723 	 * before the chip is reset.
   3724 	 */
   3725 	switch (sc->sc_type) {
   3726 	case WM_T_82547:
   3727 	case WM_T_82547_2:
   3728 		sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 8192 ?
   3729 		    PBA_22K : PBA_30K;
   3730 		sc->sc_txfifo_head = 0;
   3731 		sc->sc_txfifo_addr = sc->sc_pba << PBA_ADDR_SHIFT;
   3732 		sc->sc_txfifo_size =
   3733 		    (PBA_40K - sc->sc_pba) << PBA_BYTE_SHIFT;
   3734 		sc->sc_txfifo_stall = 0;
   3735 		break;
   3736 	case WM_T_82571:
   3737 	case WM_T_82572:
   3738 	case WM_T_82575:	/* XXX need special handing for jumbo frames */
   3739 	case WM_T_80003:
   3740 		sc->sc_pba = PBA_32K;
   3741 		break;
   3742 	case WM_T_82573:
   3743 		sc->sc_pba = PBA_12K;
   3744 		break;
   3745 	case WM_T_82574:
   3746 	case WM_T_82583:
   3747 		sc->sc_pba = PBA_20K;
   3748 		break;
   3749 	case WM_T_82576:
   3750 		sc->sc_pba = CSR_READ(sc, WMREG_RXPBS);
   3751 		sc->sc_pba &= RXPBS_SIZE_MASK_82576;
   3752 		break;
   3753 	case WM_T_82580:
   3754 	case WM_T_I350:
   3755 	case WM_T_I354:
   3756 		sc->sc_pba = wm_rxpbs_adjust_82580(CSR_READ(sc, WMREG_RXPBS));
   3757 		break;
   3758 	case WM_T_I210:
   3759 	case WM_T_I211:
   3760 		sc->sc_pba = PBA_34K;
   3761 		break;
   3762 	case WM_T_ICH8:
   3763 		/* Workaround for a bit corruption issue in FIFO memory */
   3764 		sc->sc_pba = PBA_8K;
   3765 		CSR_WRITE(sc, WMREG_PBS, PBA_16K);
   3766 		break;
   3767 	case WM_T_ICH9:
   3768 	case WM_T_ICH10:
   3769 		sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 4096 ?
   3770 		    PBA_14K : PBA_10K;
   3771 		break;
   3772 	case WM_T_PCH:
   3773 	case WM_T_PCH2:
   3774 	case WM_T_PCH_LPT:
   3775 		sc->sc_pba = PBA_26K;
   3776 		break;
   3777 	default:
   3778 		sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 8192 ?
   3779 		    PBA_40K : PBA_48K;
   3780 		break;
   3781 	}
   3782 	/*
   3783 	 * Only old or non-multiqueue devices have the PBA register
   3784 	 * XXX Need special handling for 82575.
   3785 	 */
   3786 	if (((sc->sc_flags & WM_F_NEWQUEUE) == 0)
   3787 	    || (sc->sc_type == WM_T_82575))
   3788 		CSR_WRITE(sc, WMREG_PBA, sc->sc_pba);
   3789 
   3790 	/* Prevent the PCI-E bus from sticking */
   3791 	if (sc->sc_flags & WM_F_PCIE) {
   3792 		int timeout = 800;
   3793 
   3794 		sc->sc_ctrl |= CTRL_GIO_M_DIS;
   3795 		CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
   3796 
   3797 		while (timeout--) {
   3798 			if ((CSR_READ(sc, WMREG_STATUS) & STATUS_GIO_M_ENA)
   3799 			    == 0)
   3800 				break;
   3801 			delay(100);
   3802 		}
   3803 	}
   3804 
   3805 	/* Set the completion timeout for interface */
   3806 	if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
   3807 	    || (sc->sc_type == WM_T_82580)
   3808 	    || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)
   3809 	    || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211))
   3810 		wm_set_pcie_completion_timeout(sc);
   3811 
   3812 	/* Clear interrupt */
   3813 	CSR_WRITE(sc, WMREG_IMC, 0xffffffffU);
   3814 	if (sc->sc_nintrs > 1) {
   3815 		if (sc->sc_type != WM_T_82574) {
   3816 			CSR_WRITE(sc, WMREG_EIMC, 0xffffffffU);
   3817 			CSR_WRITE(sc, WMREG_EIAC, 0);
   3818 		} else {
   3819 			CSR_WRITE(sc, WMREG_EIAC_82574, 0);
   3820 		}
   3821 	}
   3822 
   3823 	/* Stop the transmit and receive processes. */
   3824 	CSR_WRITE(sc, WMREG_RCTL, 0);
   3825 	sc->sc_rctl &= ~RCTL_EN;
   3826 	CSR_WRITE(sc, WMREG_TCTL, TCTL_PSP);
   3827 	CSR_WRITE_FLUSH(sc);
   3828 
   3829 	/* XXX set_tbi_sbp_82543() */
   3830 
   3831 	delay(10*1000);
   3832 
   3833 	/* Must acquire the MDIO ownership before MAC reset */
   3834 	switch (sc->sc_type) {
   3835 	case WM_T_82573:
   3836 	case WM_T_82574:
   3837 	case WM_T_82583:
   3838 		error = wm_get_hw_semaphore_82573(sc);
   3839 		break;
   3840 	default:
   3841 		break;
   3842 	}
   3843 
   3844 	/*
   3845 	 * 82541 Errata 29? & 82547 Errata 28?
   3846 	 * See also the description about PHY_RST bit in CTRL register
   3847 	 * in 8254x_GBe_SDM.pdf.
   3848 	 */
   3849 	if ((sc->sc_type == WM_T_82541) || (sc->sc_type == WM_T_82547)) {
   3850 		CSR_WRITE(sc, WMREG_CTRL,
   3851 		    CSR_READ(sc, WMREG_CTRL) | CTRL_PHY_RESET);
   3852 		CSR_WRITE_FLUSH(sc);
   3853 		delay(5000);
   3854 	}
   3855 
   3856 	switch (sc->sc_type) {
   3857 	case WM_T_82544: /* XXX check whether WM_F_IOH_VALID is set */
   3858 	case WM_T_82541:
   3859 	case WM_T_82541_2:
   3860 	case WM_T_82547:
   3861 	case WM_T_82547_2:
   3862 		/*
   3863 		 * On some chipsets, a reset through a memory-mapped write
   3864 		 * cycle can cause the chip to reset before completing the
   3865 		 * write cycle.  This causes major headache that can be
   3866 		 * avoided by issuing the reset via indirect register writes
   3867 		 * through I/O space.
   3868 		 *
   3869 		 * So, if we successfully mapped the I/O BAR at attach time,
   3870 		 * use that.  Otherwise, try our luck with a memory-mapped
   3871 		 * reset.
   3872 		 */
   3873 		if (sc->sc_flags & WM_F_IOH_VALID)
   3874 			wm_io_write(sc, WMREG_CTRL, CTRL_RST);
   3875 		else
   3876 			CSR_WRITE(sc, WMREG_CTRL, CTRL_RST);
   3877 		break;
   3878 	case WM_T_82545_3:
   3879 	case WM_T_82546_3:
   3880 		/* Use the shadow control register on these chips. */
   3881 		CSR_WRITE(sc, WMREG_CTRL_SHADOW, CTRL_RST);
   3882 		break;
   3883 	case WM_T_80003:
   3884 		mask = swfwphysem[sc->sc_funcid];
   3885 		reg = CSR_READ(sc, WMREG_CTRL) | CTRL_RST;
   3886 		wm_get_swfw_semaphore(sc, mask);
   3887 		CSR_WRITE(sc, WMREG_CTRL, reg);
   3888 		wm_put_swfw_semaphore(sc, mask);
   3889 		break;
   3890 	case WM_T_ICH8:
   3891 	case WM_T_ICH9:
   3892 	case WM_T_ICH10:
   3893 	case WM_T_PCH:
   3894 	case WM_T_PCH2:
   3895 	case WM_T_PCH_LPT:
   3896 		reg = CSR_READ(sc, WMREG_CTRL) | CTRL_RST;
   3897 		if (wm_check_reset_block(sc) == 0) {
   3898 			/*
   3899 			 * Gate automatic PHY configuration by hardware on
   3900 			 * non-managed 82579
   3901 			 */
   3902 			if ((sc->sc_type == WM_T_PCH2)
   3903 			    && ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID)
   3904 				!= 0))
   3905 				wm_gate_hw_phy_config_ich8lan(sc, 1);
   3906 
   3907 
   3908 			reg |= CTRL_PHY_RESET;
   3909 			phy_reset = 1;
   3910 		}
   3911 		wm_get_swfwhw_semaphore(sc);
   3912 		CSR_WRITE(sc, WMREG_CTRL, reg);
   3913 		/* Don't insert a completion barrier when reset */
   3914 		delay(20*1000);
   3915 		wm_put_swfwhw_semaphore(sc);
   3916 		break;
   3917 	case WM_T_82580:
   3918 	case WM_T_I350:
   3919 	case WM_T_I354:
   3920 	case WM_T_I210:
   3921 	case WM_T_I211:
   3922 		CSR_WRITE(sc, WMREG_CTRL, CSR_READ(sc, WMREG_CTRL) | CTRL_RST);
   3923 		if (sc->sc_pcidevid != PCI_PRODUCT_INTEL_DH89XXCC_SGMII)
   3924 			CSR_WRITE_FLUSH(sc);
   3925 		delay(5000);
   3926 		break;
   3927 	case WM_T_82542_2_0:
   3928 	case WM_T_82542_2_1:
   3929 	case WM_T_82543:
   3930 	case WM_T_82540:
   3931 	case WM_T_82545:
   3932 	case WM_T_82546:
   3933 	case WM_T_82571:
   3934 	case WM_T_82572:
   3935 	case WM_T_82573:
   3936 	case WM_T_82574:
   3937 	case WM_T_82575:
   3938 	case WM_T_82576:
   3939 	case WM_T_82583:
   3940 	default:
   3941 		/* Everything else can safely use the documented method. */
   3942 		CSR_WRITE(sc, WMREG_CTRL, CSR_READ(sc, WMREG_CTRL) | CTRL_RST);
   3943 		break;
   3944 	}
   3945 
   3946 	/* Must release the MDIO ownership after MAC reset */
   3947 	switch (sc->sc_type) {
   3948 	case WM_T_82573:
   3949 	case WM_T_82574:
   3950 	case WM_T_82583:
   3951 		if (error == 0)
   3952 			wm_put_hw_semaphore_82573(sc);
   3953 		break;
   3954 	default:
   3955 		break;
   3956 	}
   3957 
   3958 	if (phy_reset != 0)
   3959 		wm_get_cfg_done(sc);
   3960 
   3961 	/* reload EEPROM */
   3962 	switch (sc->sc_type) {
   3963 	case WM_T_82542_2_0:
   3964 	case WM_T_82542_2_1:
   3965 	case WM_T_82543:
   3966 	case WM_T_82544:
   3967 		delay(10);
   3968 		reg = CSR_READ(sc, WMREG_CTRL_EXT) | CTRL_EXT_EE_RST;
   3969 		CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
   3970 		CSR_WRITE_FLUSH(sc);
   3971 		delay(2000);
   3972 		break;
   3973 	case WM_T_82540:
   3974 	case WM_T_82545:
   3975 	case WM_T_82545_3:
   3976 	case WM_T_82546:
   3977 	case WM_T_82546_3:
   3978 		delay(5*1000);
   3979 		/* XXX Disable HW ARPs on ASF enabled adapters */
   3980 		break;
   3981 	case WM_T_82541:
   3982 	case WM_T_82541_2:
   3983 	case WM_T_82547:
   3984 	case WM_T_82547_2:
   3985 		delay(20000);
   3986 		/* XXX Disable HW ARPs on ASF enabled adapters */
   3987 		break;
   3988 	case WM_T_82571:
   3989 	case WM_T_82572:
   3990 	case WM_T_82573:
   3991 	case WM_T_82574:
   3992 	case WM_T_82583:
   3993 		if (sc->sc_flags & WM_F_EEPROM_FLASH) {
   3994 			delay(10);
   3995 			reg = CSR_READ(sc, WMREG_CTRL_EXT) | CTRL_EXT_EE_RST;
   3996 			CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
   3997 			CSR_WRITE_FLUSH(sc);
   3998 		}
   3999 		/* check EECD_EE_AUTORD */
   4000 		wm_get_auto_rd_done(sc);
   4001 		/*
   4002 		 * Phy configuration from NVM just starts after EECD_AUTO_RD
   4003 		 * is set.
   4004 		 */
   4005 		if ((sc->sc_type == WM_T_82573) || (sc->sc_type == WM_T_82574)
   4006 		    || (sc->sc_type == WM_T_82583))
   4007 			delay(25*1000);
   4008 		break;
   4009 	case WM_T_82575:
   4010 	case WM_T_82576:
   4011 	case WM_T_82580:
   4012 	case WM_T_I350:
   4013 	case WM_T_I354:
   4014 	case WM_T_I210:
   4015 	case WM_T_I211:
   4016 	case WM_T_80003:
   4017 		/* check EECD_EE_AUTORD */
   4018 		wm_get_auto_rd_done(sc);
   4019 		break;
   4020 	case WM_T_ICH8:
   4021 	case WM_T_ICH9:
   4022 	case WM_T_ICH10:
   4023 	case WM_T_PCH:
   4024 	case WM_T_PCH2:
   4025 	case WM_T_PCH_LPT:
   4026 		break;
   4027 	default:
   4028 		panic("%s: unknown type\n", __func__);
   4029 	}
   4030 
   4031 	/* Check whether EEPROM is present or not */
   4032 	switch (sc->sc_type) {
   4033 	case WM_T_82575:
   4034 	case WM_T_82576:
   4035 	case WM_T_82580:
   4036 	case WM_T_I350:
   4037 	case WM_T_I354:
   4038 	case WM_T_ICH8:
   4039 	case WM_T_ICH9:
   4040 		if ((CSR_READ(sc, WMREG_EECD) & EECD_EE_PRES) == 0) {
   4041 			/* Not found */
   4042 			sc->sc_flags |= WM_F_EEPROM_INVALID;
   4043 			if (sc->sc_type == WM_T_82575)
   4044 				wm_reset_init_script_82575(sc);
   4045 		}
   4046 		break;
   4047 	default:
   4048 		break;
   4049 	}
   4050 
   4051 	if ((sc->sc_type == WM_T_82580)
   4052 	    || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)) {
   4053 		/* clear global device reset status bit */
   4054 		CSR_WRITE(sc, WMREG_STATUS, STATUS_DEV_RST_SET);
   4055 	}
   4056 
   4057 	/* Clear any pending interrupt events. */
   4058 	CSR_WRITE(sc, WMREG_IMC, 0xffffffffU);
   4059 	reg = CSR_READ(sc, WMREG_ICR);
   4060 	if (sc->sc_nintrs > 1) {
   4061 		if (sc->sc_type != WM_T_82574) {
   4062 			CSR_WRITE(sc, WMREG_EIMC, 0xffffffffU);
   4063 			CSR_WRITE(sc, WMREG_EIAC, 0);
   4064 		} else
   4065 			CSR_WRITE(sc, WMREG_EIAC_82574, 0);
   4066 	}
   4067 
   4068 	/* reload sc_ctrl */
   4069 	sc->sc_ctrl = CSR_READ(sc, WMREG_CTRL);
   4070 
   4071 	if ((sc->sc_type >= WM_T_I350) && (sc->sc_type <= WM_T_I211))
   4072 		wm_set_eee_i350(sc);
   4073 
   4074 	/* dummy read from WUC */
   4075 	if (sc->sc_type == WM_T_PCH)
   4076 		reg = wm_gmii_hv_readreg(sc->sc_dev, 1, BM_WUC);
   4077 	/*
   4078 	 * For PCH, this write will make sure that any noise will be detected
   4079 	 * as a CRC error and be dropped rather than show up as a bad packet
   4080 	 * to the DMA engine
   4081 	 */
   4082 	if (sc->sc_type == WM_T_PCH)
   4083 		CSR_WRITE(sc, WMREG_CRC_OFFSET, 0x65656565);
   4084 
   4085 	if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
   4086 		CSR_WRITE(sc, WMREG_WUC, 0);
   4087 
   4088 	wm_reset_mdicnfg_82580(sc);
   4089 
   4090 	if ((sc->sc_flags & WM_F_PLL_WA_I210) != 0)
   4091 		wm_pll_workaround_i210(sc);
   4092 }
   4093 
   4094 /*
   4095  * wm_add_rxbuf:
   4096  *
   4097  *	Add a receive buffer to the indiciated descriptor.
   4098  */
   4099 static int
   4100 wm_add_rxbuf(struct wm_softc *sc, int idx)
   4101 {
   4102 	struct wm_rxsoft *rxs = &sc->sc_rxsoft[idx];
   4103 	struct mbuf *m;
   4104 	int error;
   4105 
   4106 	KASSERT(WM_RX_LOCKED(sc));
   4107 
   4108 	MGETHDR(m, M_DONTWAIT, MT_DATA);
   4109 	if (m == NULL)
   4110 		return ENOBUFS;
   4111 
   4112 	MCLGET(m, M_DONTWAIT);
   4113 	if ((m->m_flags & M_EXT) == 0) {
   4114 		m_freem(m);
   4115 		return ENOBUFS;
   4116 	}
   4117 
   4118 	if (rxs->rxs_mbuf != NULL)
   4119 		bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap);
   4120 
   4121 	rxs->rxs_mbuf = m;
   4122 
   4123 	m->m_len = m->m_pkthdr.len = m->m_ext.ext_size;
   4124 	error = bus_dmamap_load_mbuf(sc->sc_dmat, rxs->rxs_dmamap, m,
   4125 	    BUS_DMA_READ|BUS_DMA_NOWAIT);
   4126 	if (error) {
   4127 		/* XXX XXX XXX */
   4128 		aprint_error_dev(sc->sc_dev,
   4129 		    "unable to load rx DMA map %d, error = %d\n",
   4130 		    idx, error);
   4131 		panic("wm_add_rxbuf");
   4132 	}
   4133 
   4134 	bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
   4135 	    rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);
   4136 
   4137 	if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
   4138 		if ((sc->sc_rctl & RCTL_EN) != 0)
   4139 			WM_INIT_RXDESC(sc, idx);
   4140 	} else
   4141 		WM_INIT_RXDESC(sc, idx);
   4142 
   4143 	return 0;
   4144 }
   4145 
   4146 /*
   4147  * wm_rxdrain:
   4148  *
   4149  *	Drain the receive queue.
   4150  */
   4151 static void
   4152 wm_rxdrain(struct wm_softc *sc)
   4153 {
   4154 	struct wm_rxsoft *rxs;
   4155 	int i;
   4156 
   4157 	KASSERT(WM_RX_LOCKED(sc));
   4158 
   4159 	for (i = 0; i < WM_NRXDESC; i++) {
   4160 		rxs = &sc->sc_rxsoft[i];
   4161 		if (rxs->rxs_mbuf != NULL) {
   4162 			bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap);
   4163 			m_freem(rxs->rxs_mbuf);
   4164 			rxs->rxs_mbuf = NULL;
   4165 		}
   4166 	}
   4167 }
   4168 
   4169 /*
   4170  * wm_init:		[ifnet interface function]
   4171  *
   4172  *	Initialize the interface.
   4173  */
   4174 static int
   4175 wm_init(struct ifnet *ifp)
   4176 {
   4177 	struct wm_softc *sc = ifp->if_softc;
   4178 	int ret;
   4179 
   4180 	WM_BOTH_LOCK(sc);
   4181 	ret = wm_init_locked(ifp);
   4182 	WM_BOTH_UNLOCK(sc);
   4183 
   4184 	return ret;
   4185 }
   4186 
   4187 static int
   4188 wm_init_locked(struct ifnet *ifp)
   4189 {
   4190 	struct wm_softc *sc = ifp->if_softc;
   4191 	struct wm_rxsoft *rxs;
   4192 	int i, j, trynum, error = 0;
   4193 	uint32_t reg;
   4194 
   4195 	KASSERT(WM_BOTH_LOCKED(sc));
   4196 	/*
   4197 	 * *_HDR_ALIGNED_P is constant 1 if __NO_STRICT_ALIGMENT is set.
   4198 	 * There is a small but measurable benefit to avoiding the adjusment
   4199 	 * of the descriptor so that the headers are aligned, for normal mtu,
   4200 	 * on such platforms.  One possibility is that the DMA itself is
   4201 	 * slightly more efficient if the front of the entire packet (instead
   4202 	 * of the front of the headers) is aligned.
   4203 	 *
   4204 	 * Note we must always set align_tweak to 0 if we are using
   4205 	 * jumbo frames.
   4206 	 */
   4207 #ifdef __NO_STRICT_ALIGNMENT
   4208 	sc->sc_align_tweak = 0;
   4209 #else
   4210 	if ((ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN) > (MCLBYTES - 2))
   4211 		sc->sc_align_tweak = 0;
   4212 	else
   4213 		sc->sc_align_tweak = 2;
   4214 #endif /* __NO_STRICT_ALIGNMENT */
   4215 
   4216 	/* Cancel any pending I/O. */
   4217 	wm_stop_locked(ifp, 0);
   4218 
   4219 	/* update statistics before reset */
   4220 	ifp->if_collisions += CSR_READ(sc, WMREG_COLC);
   4221 	ifp->if_ierrors += CSR_READ(sc, WMREG_RXERRC);
   4222 
   4223 	/* Reset the chip to a known state. */
   4224 	wm_reset(sc);
   4225 
   4226 	switch (sc->sc_type) {
   4227 	case WM_T_82571:
   4228 	case WM_T_82572:
   4229 	case WM_T_82573:
   4230 	case WM_T_82574:
   4231 	case WM_T_82583:
   4232 	case WM_T_80003:
   4233 	case WM_T_ICH8:
   4234 	case WM_T_ICH9:
   4235 	case WM_T_ICH10:
   4236 	case WM_T_PCH:
   4237 	case WM_T_PCH2:
   4238 	case WM_T_PCH_LPT:
   4239 		if (wm_check_mng_mode(sc) != 0)
   4240 			wm_get_hw_control(sc);
   4241 		break;
   4242 	default:
   4243 		break;
   4244 	}
   4245 
   4246 	/* Init hardware bits */
   4247 	wm_initialize_hardware_bits(sc);
   4248 
   4249 	/* Reset the PHY. */
   4250 	if (sc->sc_flags & WM_F_HAS_MII)
   4251 		wm_gmii_reset(sc);
   4252 
   4253 	/* Calculate (E)ITR value */
   4254 	if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
   4255 		sc->sc_itr = 450;	/* For EITR */
   4256 	} else if (sc->sc_type >= WM_T_82543) {
   4257 		/*
   4258 		 * Set up the interrupt throttling register (units of 256ns)
   4259 		 * Note that a footnote in Intel's documentation says this
   4260 		 * ticker runs at 1/4 the rate when the chip is in 100Mbit
   4261 		 * or 10Mbit mode.  Empirically, it appears to be the case
   4262 		 * that that is also true for the 1024ns units of the other
   4263 		 * interrupt-related timer registers -- so, really, we ought
   4264 		 * to divide this value by 4 when the link speed is low.
   4265 		 *
   4266 		 * XXX implement this division at link speed change!
   4267 		 */
   4268 
   4269 		/*
   4270 		 * For N interrupts/sec, set this value to:
   4271 		 * 1000000000 / (N * 256).  Note that we set the
   4272 		 * absolute and packet timer values to this value
   4273 		 * divided by 4 to get "simple timer" behavior.
   4274 		 */
   4275 
   4276 		sc->sc_itr = 1500;		/* 2604 ints/sec */
   4277 	}
   4278 
   4279 	/* Initialize the transmit descriptor ring. */
   4280 	memset(sc->sc_txdescs, 0, WM_TXDESCSIZE(sc));
   4281 	WM_CDTXSYNC(sc, 0, WM_NTXDESC(sc),
   4282 	    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
   4283 	sc->sc_txfree = WM_NTXDESC(sc);
   4284 	sc->sc_txnext = 0;
   4285 
   4286 	if (sc->sc_type < WM_T_82543) {
   4287 		CSR_WRITE(sc, WMREG_OLD_TDBAH, WM_CDTXADDR_HI(sc, 0));
   4288 		CSR_WRITE(sc, WMREG_OLD_TDBAL, WM_CDTXADDR_LO(sc, 0));
   4289 		CSR_WRITE(sc, WMREG_OLD_TDLEN, WM_TXDESCSIZE(sc));
   4290 		CSR_WRITE(sc, WMREG_OLD_TDH, 0);
   4291 		CSR_WRITE(sc, WMREG_OLD_TDT, 0);
   4292 		CSR_WRITE(sc, WMREG_OLD_TIDV, 128);
   4293 	} else {
   4294 		CSR_WRITE(sc, WMREG_TDBAH, WM_CDTXADDR_HI(sc, 0));
   4295 		CSR_WRITE(sc, WMREG_TDBAL, WM_CDTXADDR_LO(sc, 0));
   4296 		CSR_WRITE(sc, WMREG_TDLEN, WM_TXDESCSIZE(sc));
   4297 		CSR_WRITE(sc, WMREG_TDH, 0);
   4298 
   4299 		if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
   4300 			/*
   4301 			 * Don't write TDT before TCTL.EN is set.
   4302 			 * See the document.
   4303 			 */
   4304 			CSR_WRITE(sc, WMREG_TXDCTL(0), TXDCTL_QUEUE_ENABLE
   4305 			    | TXDCTL_PTHRESH(0) | TXDCTL_HTHRESH(0)
   4306 			    | TXDCTL_WTHRESH(0));
   4307 		else {
   4308 			/* ITR / 4 */
   4309 			CSR_WRITE(sc, WMREG_TIDV, sc->sc_itr / 4);
   4310 			if (sc->sc_type >= WM_T_82540) {
   4311 				/* should be same */
   4312 				CSR_WRITE(sc, WMREG_TADV, sc->sc_itr / 4);
   4313 			}
   4314 
   4315 			CSR_WRITE(sc, WMREG_TDT, 0);
   4316 			CSR_WRITE(sc, WMREG_TXDCTL(0), TXDCTL_PTHRESH(0) |
   4317 			    TXDCTL_HTHRESH(0) | TXDCTL_WTHRESH(0));
   4318 			CSR_WRITE(sc, WMREG_RXDCTL, RXDCTL_PTHRESH(0) |
   4319 			    RXDCTL_HTHRESH(0) | RXDCTL_WTHRESH(1));
   4320 		}
   4321 	}
   4322 
   4323 	/* Initialize the transmit job descriptors. */
   4324 	for (i = 0; i < WM_TXQUEUELEN(sc); i++)
   4325 		sc->sc_txsoft[i].txs_mbuf = NULL;
   4326 	sc->sc_txsfree = WM_TXQUEUELEN(sc);
   4327 	sc->sc_txsnext = 0;
   4328 	sc->sc_txsdirty = 0;
   4329 
   4330 	/*
   4331 	 * Initialize the receive descriptor and receive job
   4332 	 * descriptor rings.
   4333 	 */
   4334 	if (sc->sc_type < WM_T_82543) {
   4335 		CSR_WRITE(sc, WMREG_OLD_RDBAH0, WM_CDRXADDR_HI(sc, 0));
   4336 		CSR_WRITE(sc, WMREG_OLD_RDBAL0, WM_CDRXADDR_LO(sc, 0));
   4337 		CSR_WRITE(sc, WMREG_OLD_RDLEN0, sizeof(sc->sc_rxdescs));
   4338 		CSR_WRITE(sc, WMREG_OLD_RDH0, 0);
   4339 		CSR_WRITE(sc, WMREG_OLD_RDT0, 0);
   4340 		CSR_WRITE(sc, WMREG_OLD_RDTR0, 28 | RDTR_FPD);
   4341 
   4342 		CSR_WRITE(sc, WMREG_OLD_RDBA1_HI, 0);
   4343 		CSR_WRITE(sc, WMREG_OLD_RDBA1_LO, 0);
   4344 		CSR_WRITE(sc, WMREG_OLD_RDLEN1, 0);
   4345 		CSR_WRITE(sc, WMREG_OLD_RDH1, 0);
   4346 		CSR_WRITE(sc, WMREG_OLD_RDT1, 0);
   4347 		CSR_WRITE(sc, WMREG_OLD_RDTR1, 0);
   4348 	} else {
   4349 		CSR_WRITE(sc, WMREG_RDBAH, WM_CDRXADDR_HI(sc, 0));
   4350 		CSR_WRITE(sc, WMREG_RDBAL, WM_CDRXADDR_LO(sc, 0));
   4351 		CSR_WRITE(sc, WMREG_RDLEN, sizeof(sc->sc_rxdescs));
   4352 
   4353 		if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
   4354 			if (MCLBYTES & ((1 << SRRCTL_BSIZEPKT_SHIFT) - 1))
   4355 				panic("%s: MCLBYTES %d unsupported for i2575 or higher\n", __func__, MCLBYTES);
   4356 			CSR_WRITE(sc, WMREG_SRRCTL, SRRCTL_DESCTYPE_LEGACY
   4357 			    | (MCLBYTES >> SRRCTL_BSIZEPKT_SHIFT));
   4358 			CSR_WRITE(sc, WMREG_RXDCTL, RXDCTL_QUEUE_ENABLE
   4359 			    | RXDCTL_PTHRESH(16) | RXDCTL_HTHRESH(8)
   4360 			    | RXDCTL_WTHRESH(1));
   4361 		} else {
   4362 			CSR_WRITE(sc, WMREG_RDH, 0);
   4363 			CSR_WRITE(sc, WMREG_RDT, 0);
   4364 			CSR_WRITE(sc, WMREG_RDTR, 375 | RDTR_FPD); /* ITR/4 */
   4365 			CSR_WRITE(sc, WMREG_RADV, 375);	/* MUST be same */
   4366 		}
   4367 	}
   4368 	for (i = 0; i < WM_NRXDESC; i++) {
   4369 		rxs = &sc->sc_rxsoft[i];
   4370 		if (rxs->rxs_mbuf == NULL) {
   4371 			if ((error = wm_add_rxbuf(sc, i)) != 0) {
   4372 				log(LOG_ERR, "%s: unable to allocate or map "
   4373 				    "rx buffer %d, error = %d\n",
   4374 				    device_xname(sc->sc_dev), i, error);
   4375 				/*
   4376 				 * XXX Should attempt to run with fewer receive
   4377 				 * XXX buffers instead of just failing.
   4378 				 */
   4379 				wm_rxdrain(sc);
   4380 				goto out;
   4381 			}
   4382 		} else {
   4383 			if ((sc->sc_flags & WM_F_NEWQUEUE) == 0)
   4384 				WM_INIT_RXDESC(sc, i);
   4385 			/*
   4386 			 * For 82575 and newer device, the RX descriptors
   4387 			 * must be initialized after the setting of RCTL.EN in
   4388 			 * wm_set_filter()
   4389 			 */
   4390 		}
   4391 	}
   4392 	sc->sc_rxptr = 0;
   4393 	sc->sc_rxdiscard = 0;
   4394 	WM_RXCHAIN_RESET(sc);
   4395 
   4396 	/*
   4397 	 * Clear out the VLAN table -- we don't use it (yet).
   4398 	 */
   4399 	CSR_WRITE(sc, WMREG_VET, 0);
   4400 	if ((sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354))
   4401 		trynum = 10; /* Due to hw errata */
   4402 	else
   4403 		trynum = 1;
   4404 	for (i = 0; i < WM_VLAN_TABSIZE; i++)
   4405 		for (j = 0; j < trynum; j++)
   4406 			CSR_WRITE(sc, WMREG_VFTA + (i << 2), 0);
   4407 
   4408 	/*
   4409 	 * Set up flow-control parameters.
   4410 	 *
   4411 	 * XXX Values could probably stand some tuning.
   4412 	 */
   4413 	if ((sc->sc_type != WM_T_ICH8) && (sc->sc_type != WM_T_ICH9)
   4414 	    && (sc->sc_type != WM_T_ICH10) && (sc->sc_type != WM_T_PCH)
   4415 	    && (sc->sc_type != WM_T_PCH2) && (sc->sc_type != WM_T_PCH_LPT)) {
   4416 		CSR_WRITE(sc, WMREG_FCAL, FCAL_CONST);
   4417 		CSR_WRITE(sc, WMREG_FCAH, FCAH_CONST);
   4418 		CSR_WRITE(sc, WMREG_FCT, ETHERTYPE_FLOWCONTROL);
   4419 	}
   4420 
   4421 	sc->sc_fcrtl = FCRTL_DFLT;
   4422 	if (sc->sc_type < WM_T_82543) {
   4423 		CSR_WRITE(sc, WMREG_OLD_FCRTH, FCRTH_DFLT);
   4424 		CSR_WRITE(sc, WMREG_OLD_FCRTL, sc->sc_fcrtl);
   4425 	} else {
   4426 		CSR_WRITE(sc, WMREG_FCRTH, FCRTH_DFLT);
   4427 		CSR_WRITE(sc, WMREG_FCRTL, sc->sc_fcrtl);
   4428 	}
   4429 
   4430 	if (sc->sc_type == WM_T_80003)
   4431 		CSR_WRITE(sc, WMREG_FCTTV, 0xffff);
   4432 	else
   4433 		CSR_WRITE(sc, WMREG_FCTTV, FCTTV_DFLT);
   4434 
   4435 	/* Writes the control register. */
   4436 	wm_set_vlan(sc);
   4437 
   4438 	if (sc->sc_flags & WM_F_HAS_MII) {
   4439 		int val;
   4440 
   4441 		switch (sc->sc_type) {
   4442 		case WM_T_80003:
   4443 		case WM_T_ICH8:
   4444 		case WM_T_ICH9:
   4445 		case WM_T_ICH10:
   4446 		case WM_T_PCH:
   4447 		case WM_T_PCH2:
   4448 		case WM_T_PCH_LPT:
   4449 			/*
   4450 			 * Set the mac to wait the maximum time between each
   4451 			 * iteration and increase the max iterations when
   4452 			 * polling the phy; this fixes erroneous timeouts at
   4453 			 * 10Mbps.
   4454 			 */
   4455 			wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_TIMEOUTS,
   4456 			    0xFFFF);
   4457 			val = wm_kmrn_readreg(sc,
   4458 			    KUMCTRLSTA_OFFSET_INB_PARAM);
   4459 			val |= 0x3F;
   4460 			wm_kmrn_writereg(sc,
   4461 			    KUMCTRLSTA_OFFSET_INB_PARAM, val);
   4462 			break;
   4463 		default:
   4464 			break;
   4465 		}
   4466 
   4467 		if (sc->sc_type == WM_T_80003) {
   4468 			val = CSR_READ(sc, WMREG_CTRL_EXT);
   4469 			val &= ~CTRL_EXT_LINK_MODE_MASK;
   4470 			CSR_WRITE(sc, WMREG_CTRL_EXT, val);
   4471 
   4472 			/* Bypass RX and TX FIFO's */
   4473 			wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_FIFO_CTRL,
   4474 			    KUMCTRLSTA_FIFO_CTRL_RX_BYPASS
   4475 			    | KUMCTRLSTA_FIFO_CTRL_TX_BYPASS);
   4476 			wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_INB_CTRL,
   4477 			    KUMCTRLSTA_INB_CTRL_DIS_PADDING |
   4478 			    KUMCTRLSTA_INB_CTRL_LINK_TMOUT_DFLT);
   4479 		}
   4480 	}
   4481 #if 0
   4482 	CSR_WRITE(sc, WMREG_CTRL_EXT, sc->sc_ctrl_ext);
   4483 #endif
   4484 
   4485 	/* Set up checksum offload parameters. */
   4486 	reg = CSR_READ(sc, WMREG_RXCSUM);
   4487 	reg &= ~(RXCSUM_IPOFL | RXCSUM_IPV6OFL | RXCSUM_TUOFL);
   4488 	if (ifp->if_capenable & IFCAP_CSUM_IPv4_Rx)
   4489 		reg |= RXCSUM_IPOFL;
   4490 	if (ifp->if_capenable & (IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_UDPv4_Rx))
   4491 		reg |= RXCSUM_IPOFL | RXCSUM_TUOFL;
   4492 	if (ifp->if_capenable & (IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx))
   4493 		reg |= RXCSUM_IPV6OFL | RXCSUM_TUOFL;
   4494 	CSR_WRITE(sc, WMREG_RXCSUM, reg);
   4495 
   4496 	/* Set up MSI-X */
   4497 	if (sc->sc_nintrs > 1) {
   4498 		uint32_t ivar;
   4499 
   4500 		if (sc->sc_type == WM_T_82575) {
   4501 			/* Interrupt control */
   4502 			reg = CSR_READ(sc, WMREG_CTRL_EXT);
   4503 			reg |= CTRL_EXT_PBA | CTRL_EXT_EIAME | CTRL_EXT_NSICR;
   4504 			CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
   4505 
   4506 			/* TX */
   4507 			CSR_WRITE(sc, WMREG_MSIXBM(WM_MSIX_TXINTR_IDX),
   4508 			    EITR_TX_QUEUE0);
   4509 			/* RX */
   4510 			CSR_WRITE(sc, WMREG_MSIXBM(WM_MSIX_RXINTR_IDX),
   4511 			    EITR_RX_QUEUE0);
   4512 			/* Link status */
   4513 			CSR_WRITE(sc, WMREG_MSIXBM(WM_MSIX_LINKINTR_IDX),
   4514 			    EITR_OTHER);
   4515 		} else if (sc->sc_type == WM_T_82574) {
   4516 			/* Interrupt control */
   4517 			reg = CSR_READ(sc, WMREG_CTRL_EXT);
   4518 			reg |= CTRL_EXT_PBA | CTRL_EXT_EIAME;
   4519 			CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
   4520 
   4521 			/* TX, RX and Link status */
   4522 			ivar = __SHIFTIN((IVAR_VALID_82574|WM_MSIX_TXINTR_IDX),
   4523 			    IVAR_TX_MASK_Q_82574(0));
   4524 			ivar |= __SHIFTIN((IVAR_VALID_82574
   4525 				| WM_MSIX_RXINTR_IDX),
   4526 			    IVAR_RX_MASK_Q_82574(0));
   4527 			ivar |=__SHIFTIN((IVAR_VALID_82574|WM_MSIX_LINKINTR_IDX),
   4528 			    IVAR_OTHER_MASK);
   4529 			CSR_WRITE(sc, WMREG_IVAR, ivar | IVAR_INT_ON_ALL_WB);
   4530 		} else {
   4531 			/* Interrupt control */
   4532 			CSR_WRITE(sc, WMREG_GPIE, GPIE_NSICR
   4533 			    | GPIE_MULTI_MSIX | GPIE_EIAME
   4534 			    | GPIE_PBA);
   4535 
   4536 			switch (sc->sc_type) {
   4537 			case WM_T_82580:
   4538 			case WM_T_I350:
   4539 			case WM_T_I354:
   4540 			case WM_T_I210:
   4541 			case WM_T_I211:
   4542 				/* TX */
   4543 				ivar = CSR_READ(sc, WMREG_IVAR_Q(0));
   4544 				ivar &= ~IVAR_TX_MASK_Q(0);
   4545 				ivar |= __SHIFTIN(
   4546 					(WM_MSIX_TXINTR_IDX | IVAR_VALID),
   4547 					IVAR_TX_MASK_Q(0));
   4548 				CSR_WRITE(sc, WMREG_IVAR_Q(0), ivar);
   4549 
   4550 				/* RX */
   4551 				ivar = CSR_READ(sc, WMREG_IVAR_Q(0));
   4552 				ivar &= ~IVAR_RX_MASK_Q(0);
   4553 				ivar |= __SHIFTIN(
   4554 					(WM_MSIX_RXINTR_IDX | IVAR_VALID),
   4555 					IVAR_RX_MASK_Q(0));
   4556 				CSR_WRITE(sc, WMREG_IVAR_Q(0), ivar);
   4557 				break;
   4558 			case WM_T_82576:
   4559 				/* TX */
   4560 				ivar = CSR_READ(sc, WMREG_IVAR_Q_82576(0));
   4561 				ivar &= ~IVAR_TX_MASK_Q_82576(0);
   4562 				ivar |= __SHIFTIN(
   4563 					(WM_MSIX_TXINTR_IDX | IVAR_VALID),
   4564 					IVAR_TX_MASK_Q_82576(0));
   4565 				CSR_WRITE(sc, WMREG_IVAR_Q_82576(0), ivar);
   4566 
   4567 				/* RX */
   4568 				ivar = CSR_READ(sc, WMREG_IVAR_Q_82576(0));
   4569 				ivar &= ~IVAR_RX_MASK_Q_82576(0);
   4570 				ivar |= __SHIFTIN(
   4571 					(WM_MSIX_RXINTR_IDX | IVAR_VALID),
   4572 					IVAR_RX_MASK_Q_82576(0));
   4573 				CSR_WRITE(sc, WMREG_IVAR_Q_82576(0), ivar);
   4574 				break;
   4575 			default:
   4576 				break;
   4577 			}
   4578 
   4579 			/* Link status */
   4580 			ivar = __SHIFTIN((WM_MSIX_LINKINTR_IDX | IVAR_VALID),
   4581 			    IVAR_MISC_OTHER);
   4582 			CSR_WRITE(sc, WMREG_IVAR_MISC, ivar);
   4583 		}
   4584 	}
   4585 
   4586 	/* Set up the interrupt registers. */
   4587 	CSR_WRITE(sc, WMREG_IMC, 0xffffffffU);
   4588 	sc->sc_icr = ICR_TXDW | ICR_LSC | ICR_RXSEQ | ICR_RXDMT0 |
   4589 	    ICR_RXO | ICR_RXT0;
   4590 	if (sc->sc_nintrs > 1) {
   4591 		uint32_t mask;
   4592 		switch (sc->sc_type) {
   4593 		case WM_T_82574:
   4594 			CSR_WRITE(sc, WMREG_EIAC_82574,
   4595 			    WMREG_EIAC_82574_MSIX_MASK);
   4596 			sc->sc_icr |= WMREG_EIAC_82574_MSIX_MASK;
   4597 			CSR_WRITE(sc, WMREG_IMS, sc->sc_icr);
   4598 			break;
   4599 		default:
   4600 			if (sc->sc_type == WM_T_82575)
   4601 				mask = EITR_RX_QUEUE0 |EITR_TX_QUEUE0
   4602 				    | EITR_OTHER;
   4603 			else
   4604 				mask = (1 << WM_MSIX_RXINTR_IDX)
   4605 				    | (1 << WM_MSIX_TXINTR_IDX)
   4606 				    | (1 << WM_MSIX_LINKINTR_IDX);
   4607 			CSR_WRITE(sc, WMREG_EIAC, mask);
   4608 			CSR_WRITE(sc, WMREG_EIAM, mask);
   4609 			CSR_WRITE(sc, WMREG_EIMS, mask);
   4610 			CSR_WRITE(sc, WMREG_IMS, ICR_LSC);
   4611 			break;
   4612 		}
   4613 	} else
   4614 		CSR_WRITE(sc, WMREG_IMS, sc->sc_icr);
   4615 
   4616 	if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
   4617 	    || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
   4618 	    || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)) {
   4619 		reg = CSR_READ(sc, WMREG_KABGTXD);
   4620 		reg |= KABGTXD_BGSQLBIAS;
   4621 		CSR_WRITE(sc, WMREG_KABGTXD, reg);
   4622 	}
   4623 
   4624 	/* Set up the inter-packet gap. */
   4625 	CSR_WRITE(sc, WMREG_TIPG, sc->sc_tipg);
   4626 
   4627 	if (sc->sc_type >= WM_T_82543) {
   4628 		/*
   4629 		 * XXX 82574 has both ITR and EITR. SET EITR when we use
   4630 		 * the multi queue function with MSI-X.
   4631 		 */
   4632 		if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
   4633 			CSR_WRITE(sc, WMREG_EITR(0), sc->sc_itr);
   4634 		else
   4635 			CSR_WRITE(sc, WMREG_ITR, sc->sc_itr);
   4636 	}
   4637 
   4638 	/* Set the VLAN ethernetype. */
   4639 	CSR_WRITE(sc, WMREG_VET, ETHERTYPE_VLAN);
   4640 
   4641 	/*
   4642 	 * Set up the transmit control register; we start out with
   4643 	 * a collision distance suitable for FDX, but update it whe
   4644 	 * we resolve the media type.
   4645 	 */
   4646 	sc->sc_tctl = TCTL_EN | TCTL_PSP | TCTL_RTLC
   4647 	    | TCTL_CT(TX_COLLISION_THRESHOLD)
   4648 	    | TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
   4649 	if (sc->sc_type >= WM_T_82571)
   4650 		sc->sc_tctl |= TCTL_MULR;
   4651 	CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
   4652 
   4653 	if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
   4654 		/* Write TDT after TCTL.EN is set. See the document. */
   4655 		CSR_WRITE(sc, WMREG_TDT, 0);
   4656 	}
   4657 
   4658 	if (sc->sc_type == WM_T_80003) {
   4659 		reg = CSR_READ(sc, WMREG_TCTL_EXT);
   4660 		reg &= ~TCTL_EXT_GCEX_MASK;
   4661 		reg |= DEFAULT_80003ES2LAN_TCTL_EXT_GCEX;
   4662 		CSR_WRITE(sc, WMREG_TCTL_EXT, reg);
   4663 	}
   4664 
   4665 	/* Set the media. */
   4666 	if ((error = mii_ifmedia_change(&sc->sc_mii)) != 0)
   4667 		goto out;
   4668 
   4669 	/* Configure for OS presence */
   4670 	wm_init_manageability(sc);
   4671 
   4672 	/*
   4673 	 * Set up the receive control register; we actually program
   4674 	 * the register when we set the receive filter.  Use multicast
   4675 	 * address offset type 0.
   4676 	 *
   4677 	 * Only the i82544 has the ability to strip the incoming
   4678 	 * CRC, so we don't enable that feature.
   4679 	 */
   4680 	sc->sc_mchash_type = 0;
   4681 	sc->sc_rctl = RCTL_EN | RCTL_LBM_NONE | RCTL_RDMTS_1_2 | RCTL_DPF
   4682 	    | RCTL_MO(sc->sc_mchash_type);
   4683 
   4684 	/*
   4685 	 * The I350 has a bug where it always strips the CRC whether
   4686 	 * asked to or not. So ask for stripped CRC here and cope in rxeof
   4687 	 */
   4688 	if ((sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)
   4689 	    || (sc->sc_type == WM_T_I210))
   4690 		sc->sc_rctl |= RCTL_SECRC;
   4691 
   4692 	if (((sc->sc_ethercom.ec_capabilities & ETHERCAP_JUMBO_MTU) != 0)
   4693 	    && (ifp->if_mtu > ETHERMTU)) {
   4694 		sc->sc_rctl |= RCTL_LPE;
   4695 		if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
   4696 			CSR_WRITE(sc, WMREG_RLPML, ETHER_MAX_LEN_JUMBO);
   4697 	}
   4698 
   4699 	if (MCLBYTES == 2048) {
   4700 		sc->sc_rctl |= RCTL_2k;
   4701 	} else {
   4702 		if (sc->sc_type >= WM_T_82543) {
   4703 			switch (MCLBYTES) {
   4704 			case 4096:
   4705 				sc->sc_rctl |= RCTL_BSEX | RCTL_BSEX_4k;
   4706 				break;
   4707 			case 8192:
   4708 				sc->sc_rctl |= RCTL_BSEX | RCTL_BSEX_8k;
   4709 				break;
   4710 			case 16384:
   4711 				sc->sc_rctl |= RCTL_BSEX | RCTL_BSEX_16k;
   4712 				break;
   4713 			default:
   4714 				panic("wm_init: MCLBYTES %d unsupported",
   4715 				    MCLBYTES);
   4716 				break;
   4717 			}
   4718 		} else panic("wm_init: i82542 requires MCLBYTES = 2048");
   4719 	}
   4720 
   4721 	/* Set the receive filter. */
   4722 	wm_set_filter(sc);
   4723 
   4724 	/* Enable ECC */
   4725 	switch (sc->sc_type) {
   4726 	case WM_T_82571:
   4727 		reg = CSR_READ(sc, WMREG_PBA_ECC);
   4728 		reg |= PBA_ECC_CORR_EN;
   4729 		CSR_WRITE(sc, WMREG_PBA_ECC, reg);
   4730 		break;
   4731 	case WM_T_PCH_LPT:
   4732 		reg = CSR_READ(sc, WMREG_PBECCSTS);
   4733 		reg |= PBECCSTS_UNCORR_ECC_ENABLE;
   4734 		CSR_WRITE(sc, WMREG_PBECCSTS, reg);
   4735 
   4736 		reg = CSR_READ(sc, WMREG_CTRL);
   4737 		reg |= CTRL_MEHE;
   4738 		CSR_WRITE(sc, WMREG_CTRL, reg);
   4739 		break;
   4740 	default:
   4741 		break;
   4742 	}
   4743 
   4744 	/* On 575 and later set RDT only if RX enabled */
   4745 	if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
   4746 		for (i = 0; i < WM_NRXDESC; i++)
   4747 			WM_INIT_RXDESC(sc, i);
   4748 
   4749 	sc->sc_stopping = false;
   4750 
   4751 	/* Start the one second link check clock. */
   4752 	callout_reset(&sc->sc_tick_ch, hz, wm_tick, sc);
   4753 
   4754 	/* ...all done! */
   4755 	ifp->if_flags |= IFF_RUNNING;
   4756 	ifp->if_flags &= ~IFF_OACTIVE;
   4757 
   4758  out:
   4759 	sc->sc_if_flags = ifp->if_flags;
   4760 	if (error)
   4761 		log(LOG_ERR, "%s: interface not running\n",
   4762 		    device_xname(sc->sc_dev));
   4763 	return error;
   4764 }
   4765 
   4766 /*
   4767  * wm_stop:		[ifnet interface function]
   4768  *
   4769  *	Stop transmission on the interface.
   4770  */
   4771 static void
   4772 wm_stop(struct ifnet *ifp, int disable)
   4773 {
   4774 	struct wm_softc *sc = ifp->if_softc;
   4775 
   4776 	WM_BOTH_LOCK(sc);
   4777 	wm_stop_locked(ifp, disable);
   4778 	WM_BOTH_UNLOCK(sc);
   4779 }
   4780 
   4781 static void
   4782 wm_stop_locked(struct ifnet *ifp, int disable)
   4783 {
   4784 	struct wm_softc *sc = ifp->if_softc;
   4785 	struct wm_txsoft *txs;
   4786 	int i;
   4787 
   4788 	KASSERT(WM_BOTH_LOCKED(sc));
   4789 
   4790 	sc->sc_stopping = true;
   4791 
   4792 	/* Stop the one second clock. */
   4793 	callout_stop(&sc->sc_tick_ch);
   4794 
   4795 	/* Stop the 82547 Tx FIFO stall check timer. */
   4796 	if (sc->sc_type == WM_T_82547)
   4797 		callout_stop(&sc->sc_txfifo_ch);
   4798 
   4799 	if (sc->sc_flags & WM_F_HAS_MII) {
   4800 		/* Down the MII. */
   4801 		mii_down(&sc->sc_mii);
   4802 	} else {
   4803 #if 0
   4804 		/* Should we clear PHY's status properly? */
   4805 		wm_reset(sc);
   4806 #endif
   4807 	}
   4808 
   4809 	/* Stop the transmit and receive processes. */
   4810 	CSR_WRITE(sc, WMREG_TCTL, 0);
   4811 	CSR_WRITE(sc, WMREG_RCTL, 0);
   4812 	sc->sc_rctl &= ~RCTL_EN;
   4813 
   4814 	/*
   4815 	 * Clear the interrupt mask to ensure the device cannot assert its
   4816 	 * interrupt line.
   4817 	 * Clear sc->sc_icr to ensure wm_intr_legacy() makes no attempt to
   4818 	 * service any currently pending or shared interrupt.
   4819 	 */
   4820 	CSR_WRITE(sc, WMREG_IMC, 0xffffffffU);
   4821 	sc->sc_icr = 0;
   4822 	if (sc->sc_nintrs > 1) {
   4823 		if (sc->sc_type != WM_T_82574) {
   4824 			CSR_WRITE(sc, WMREG_EIMC, 0xffffffffU);
   4825 			CSR_WRITE(sc, WMREG_EIAC, 0);
   4826 		} else
   4827 			CSR_WRITE(sc, WMREG_EIAC_82574, 0);
   4828 	}
   4829 
   4830 	/* Release any queued transmit buffers. */
   4831 	for (i = 0; i < WM_TXQUEUELEN(sc); i++) {
   4832 		txs = &sc->sc_txsoft[i];
   4833 		if (txs->txs_mbuf != NULL) {
   4834 			bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap);
   4835 			m_freem(txs->txs_mbuf);
   4836 			txs->txs_mbuf = NULL;
   4837 		}
   4838 	}
   4839 
   4840 	/* Mark the interface as down and cancel the watchdog timer. */
   4841 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
   4842 	ifp->if_timer = 0;
   4843 
   4844 	if (disable)
   4845 		wm_rxdrain(sc);
   4846 
   4847 #if 0 /* notyet */
   4848 	if (sc->sc_type >= WM_T_82544)
   4849 		CSR_WRITE(sc, WMREG_WUC, 0);
   4850 #endif
   4851 }
   4852 
   4853 /*
   4854  * wm_tx_offload:
   4855  *
   4856  *	Set up TCP/IP checksumming parameters for the
   4857  *	specified packet.
   4858  */
   4859 static int
   4860 wm_tx_offload(struct wm_softc *sc, struct wm_txsoft *txs, uint32_t *cmdp,
   4861     uint8_t *fieldsp)
   4862 {
   4863 	struct mbuf *m0 = txs->txs_mbuf;
   4864 	struct livengood_tcpip_ctxdesc *t;
   4865 	uint32_t ipcs, tucs, cmd, cmdlen, seg;
   4866 	uint32_t ipcse;
   4867 	struct ether_header *eh;
   4868 	int offset, iphl;
   4869 	uint8_t fields;
   4870 
   4871 	/*
   4872 	 * XXX It would be nice if the mbuf pkthdr had offset
   4873 	 * fields for the protocol headers.
   4874 	 */
   4875 
   4876 	eh = mtod(m0, struct ether_header *);
   4877 	switch (htons(eh->ether_type)) {
   4878 	case ETHERTYPE_IP:
   4879 	case ETHERTYPE_IPV6:
   4880 		offset = ETHER_HDR_LEN;
   4881 		break;
   4882 
   4883 	case ETHERTYPE_VLAN:
   4884 		offset = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
   4885 		break;
   4886 
   4887 	default:
   4888 		/*
   4889 		 * Don't support this protocol or encapsulation.
   4890 		 */
   4891 		*fieldsp = 0;
   4892 		*cmdp = 0;
   4893 		return 0;
   4894 	}
   4895 
   4896 	if ((m0->m_pkthdr.csum_flags &
   4897 	    (M_CSUM_TSOv4|M_CSUM_UDPv4|M_CSUM_TCPv4)) != 0) {
   4898 		iphl = M_CSUM_DATA_IPv4_IPHL(m0->m_pkthdr.csum_data);
   4899 	} else {
   4900 		iphl = M_CSUM_DATA_IPv6_HL(m0->m_pkthdr.csum_data);
   4901 	}
   4902 	ipcse = offset + iphl - 1;
   4903 
   4904 	cmd = WTX_CMD_DEXT | WTX_DTYP_D;
   4905 	cmdlen = WTX_CMD_DEXT | WTX_DTYP_C | WTX_CMD_IDE;
   4906 	seg = 0;
   4907 	fields = 0;
   4908 
   4909 	if ((m0->m_pkthdr.csum_flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0) {
   4910 		int hlen = offset + iphl;
   4911 		bool v4 = (m0->m_pkthdr.csum_flags & M_CSUM_TSOv4) != 0;
   4912 
   4913 		if (__predict_false(m0->m_len <
   4914 				    (hlen + sizeof(struct tcphdr)))) {
   4915 			/*
   4916 			 * TCP/IP headers are not in the first mbuf; we need
   4917 			 * to do this the slow and painful way.  Let's just
   4918 			 * hope this doesn't happen very often.
   4919 			 */
   4920 			struct tcphdr th;
   4921 
   4922 			WM_EVCNT_INCR(&sc->sc_ev_txtsopain);
   4923 
   4924 			m_copydata(m0, hlen, sizeof(th), &th);
   4925 			if (v4) {
   4926 				struct ip ip;
   4927 
   4928 				m_copydata(m0, offset, sizeof(ip), &ip);
   4929 				ip.ip_len = 0;
   4930 				m_copyback(m0,
   4931 				    offset + offsetof(struct ip, ip_len),
   4932 				    sizeof(ip.ip_len), &ip.ip_len);
   4933 				th.th_sum = in_cksum_phdr(ip.ip_src.s_addr,
   4934 				    ip.ip_dst.s_addr, htons(IPPROTO_TCP));
   4935 			} else {
   4936 				struct ip6_hdr ip6;
   4937 
   4938 				m_copydata(m0, offset, sizeof(ip6), &ip6);
   4939 				ip6.ip6_plen = 0;
   4940 				m_copyback(m0,
   4941 				    offset + offsetof(struct ip6_hdr, ip6_plen),
   4942 				    sizeof(ip6.ip6_plen), &ip6.ip6_plen);
   4943 				th.th_sum = in6_cksum_phdr(&ip6.ip6_src,
   4944 				    &ip6.ip6_dst, 0, htonl(IPPROTO_TCP));
   4945 			}
   4946 			m_copyback(m0, hlen + offsetof(struct tcphdr, th_sum),
   4947 			    sizeof(th.th_sum), &th.th_sum);
   4948 
   4949 			hlen += th.th_off << 2;
   4950 		} else {
   4951 			/*
   4952 			 * TCP/IP headers are in the first mbuf; we can do
   4953 			 * this the easy way.
   4954 			 */
   4955 			struct tcphdr *th;
   4956 
   4957 			if (v4) {
   4958 				struct ip *ip =
   4959 				    (void *)(mtod(m0, char *) + offset);
   4960 				th = (void *)(mtod(m0, char *) + hlen);
   4961 
   4962 				ip->ip_len = 0;
   4963 				th->th_sum = in_cksum_phdr(ip->ip_src.s_addr,
   4964 				    ip->ip_dst.s_addr, htons(IPPROTO_TCP));
   4965 			} else {
   4966 				struct ip6_hdr *ip6 =
   4967 				    (void *)(mtod(m0, char *) + offset);
   4968 				th = (void *)(mtod(m0, char *) + hlen);
   4969 
   4970 				ip6->ip6_plen = 0;
   4971 				th->th_sum = in6_cksum_phdr(&ip6->ip6_src,
   4972 				    &ip6->ip6_dst, 0, htonl(IPPROTO_TCP));
   4973 			}
   4974 			hlen += th->th_off << 2;
   4975 		}
   4976 
   4977 		if (v4) {
   4978 			WM_EVCNT_INCR(&sc->sc_ev_txtso);
   4979 			cmdlen |= WTX_TCPIP_CMD_IP;
   4980 		} else {
   4981 			WM_EVCNT_INCR(&sc->sc_ev_txtso6);
   4982 			ipcse = 0;
   4983 		}
   4984 		cmd |= WTX_TCPIP_CMD_TSE;
   4985 		cmdlen |= WTX_TCPIP_CMD_TSE |
   4986 		    WTX_TCPIP_CMD_TCP | (m0->m_pkthdr.len - hlen);
   4987 		seg = WTX_TCPIP_SEG_HDRLEN(hlen) |
   4988 		    WTX_TCPIP_SEG_MSS(m0->m_pkthdr.segsz);
   4989 	}
   4990 
   4991 	/*
   4992 	 * NOTE: Even if we're not using the IP or TCP/UDP checksum
   4993 	 * offload feature, if we load the context descriptor, we
   4994 	 * MUST provide valid values for IPCSS and TUCSS fields.
   4995 	 */
   4996 
   4997 	ipcs = WTX_TCPIP_IPCSS(offset) |
   4998 	    WTX_TCPIP_IPCSO(offset + offsetof(struct ip, ip_sum)) |
   4999 	    WTX_TCPIP_IPCSE(ipcse);
   5000 	if (m0->m_pkthdr.csum_flags & (M_CSUM_IPv4|M_CSUM_TSOv4)) {
   5001 		WM_EVCNT_INCR(&sc->sc_ev_txipsum);
   5002 		fields |= WTX_IXSM;
   5003 	}
   5004 
   5005 	offset += iphl;
   5006 
   5007 	if (m0->m_pkthdr.csum_flags &
   5008 	    (M_CSUM_TCPv4|M_CSUM_UDPv4|M_CSUM_TSOv4)) {
   5009 		WM_EVCNT_INCR(&sc->sc_ev_txtusum);
   5010 		fields |= WTX_TXSM;
   5011 		tucs = WTX_TCPIP_TUCSS(offset) |
   5012 		    WTX_TCPIP_TUCSO(offset +
   5013 		    M_CSUM_DATA_IPv4_OFFSET(m0->m_pkthdr.csum_data)) |
   5014 		    WTX_TCPIP_TUCSE(0) /* rest of packet */;
   5015 	} else if ((m0->m_pkthdr.csum_flags &
   5016 	    (M_CSUM_TCPv6|M_CSUM_UDPv6|M_CSUM_TSOv6)) != 0) {
   5017 		WM_EVCNT_INCR(&sc->sc_ev_txtusum6);
   5018 		fields |= WTX_TXSM;
   5019 		tucs = WTX_TCPIP_TUCSS(offset) |
   5020 		    WTX_TCPIP_TUCSO(offset +
   5021 		    M_CSUM_DATA_IPv6_OFFSET(m0->m_pkthdr.csum_data)) |
   5022 		    WTX_TCPIP_TUCSE(0) /* rest of packet */;
   5023 	} else {
   5024 		/* Just initialize it to a valid TCP context. */
   5025 		tucs = WTX_TCPIP_TUCSS(offset) |
   5026 		    WTX_TCPIP_TUCSO(offset + offsetof(struct tcphdr, th_sum)) |
   5027 		    WTX_TCPIP_TUCSE(0) /* rest of packet */;
   5028 	}
   5029 
   5030 	/* Fill in the context descriptor. */
   5031 	t = (struct livengood_tcpip_ctxdesc *)
   5032 	    &sc->sc_txdescs[sc->sc_txnext];
   5033 	t->tcpip_ipcs = htole32(ipcs);
   5034 	t->tcpip_tucs = htole32(tucs);
   5035 	t->tcpip_cmdlen = htole32(cmdlen);
   5036 	t->tcpip_seg = htole32(seg);
   5037 	WM_CDTXSYNC(sc, sc->sc_txnext, 1, BUS_DMASYNC_PREWRITE);
   5038 
   5039 	sc->sc_txnext = WM_NEXTTX(sc, sc->sc_txnext);
   5040 	txs->txs_ndesc++;
   5041 
   5042 	*cmdp = cmd;
   5043 	*fieldsp = fields;
   5044 
   5045 	return 0;
   5046 }
   5047 
   5048 static void
   5049 wm_dump_mbuf_chain(struct wm_softc *sc, struct mbuf *m0)
   5050 {
   5051 	struct mbuf *m;
   5052 	int i;
   5053 
   5054 	log(LOG_DEBUG, "%s: mbuf chain:\n", device_xname(sc->sc_dev));
   5055 	for (m = m0, i = 0; m != NULL; m = m->m_next, i++)
   5056 		log(LOG_DEBUG, "%s:\tm_data = %p, m_len = %d, "
   5057 		    "m_flags = 0x%08x\n", device_xname(sc->sc_dev),
   5058 		    m->m_data, m->m_len, m->m_flags);
   5059 	log(LOG_DEBUG, "%s:\t%d mbuf%s in chain\n", device_xname(sc->sc_dev),
   5060 	    i, i == 1 ? "" : "s");
   5061 }
   5062 
   5063 /*
   5064  * wm_82547_txfifo_stall:
   5065  *
   5066  *	Callout used to wait for the 82547 Tx FIFO to drain,
   5067  *	reset the FIFO pointers, and restart packet transmission.
   5068  */
   5069 static void
   5070 wm_82547_txfifo_stall(void *arg)
   5071 {
   5072 	struct wm_softc *sc = arg;
   5073 #ifndef WM_MPSAFE
   5074 	int s;
   5075 
   5076 	s = splnet();
   5077 #endif
   5078 	WM_TX_LOCK(sc);
   5079 
   5080 	if (sc->sc_stopping)
   5081 		goto out;
   5082 
   5083 	if (sc->sc_txfifo_stall) {
   5084 		if (CSR_READ(sc, WMREG_TDT) == CSR_READ(sc, WMREG_TDH) &&
   5085 		    CSR_READ(sc, WMREG_TDFT) == CSR_READ(sc, WMREG_TDFH) &&
   5086 		    CSR_READ(sc, WMREG_TDFTS) == CSR_READ(sc, WMREG_TDFHS)) {
   5087 			/*
   5088 			 * Packets have drained.  Stop transmitter, reset
   5089 			 * FIFO pointers, restart transmitter, and kick
   5090 			 * the packet queue.
   5091 			 */
   5092 			uint32_t tctl = CSR_READ(sc, WMREG_TCTL);
   5093 			CSR_WRITE(sc, WMREG_TCTL, tctl & ~TCTL_EN);
   5094 			CSR_WRITE(sc, WMREG_TDFT, sc->sc_txfifo_addr);
   5095 			CSR_WRITE(sc, WMREG_TDFH, sc->sc_txfifo_addr);
   5096 			CSR_WRITE(sc, WMREG_TDFTS, sc->sc_txfifo_addr);
   5097 			CSR_WRITE(sc, WMREG_TDFHS, sc->sc_txfifo_addr);
   5098 			CSR_WRITE(sc, WMREG_TCTL, tctl);
   5099 			CSR_WRITE_FLUSH(sc);
   5100 
   5101 			sc->sc_txfifo_head = 0;
   5102 			sc->sc_txfifo_stall = 0;
   5103 			wm_start_locked(&sc->sc_ethercom.ec_if);
   5104 		} else {
   5105 			/*
   5106 			 * Still waiting for packets to drain; try again in
   5107 			 * another tick.
   5108 			 */
   5109 			callout_schedule(&sc->sc_txfifo_ch, 1);
   5110 		}
   5111 	}
   5112 
   5113 out:
   5114 	WM_TX_UNLOCK(sc);
   5115 #ifndef WM_MPSAFE
   5116 	splx(s);
   5117 #endif
   5118 }
   5119 
   5120 /*
   5121  * wm_82547_txfifo_bugchk:
   5122  *
   5123  *	Check for bug condition in the 82547 Tx FIFO.  We need to
   5124  *	prevent enqueueing a packet that would wrap around the end
   5125  *	if the Tx FIFO ring buffer, otherwise the chip will croak.
   5126  *
   5127  *	We do this by checking the amount of space before the end
   5128  *	of the Tx FIFO buffer.  If the packet will not fit, we "stall"
   5129  *	the Tx FIFO, wait for all remaining packets to drain, reset
   5130  *	the internal FIFO pointers to the beginning, and restart
   5131  *	transmission on the interface.
   5132  */
   5133 #define	WM_FIFO_HDR		0x10
   5134 #define	WM_82547_PAD_LEN	0x3e0
   5135 static int
   5136 wm_82547_txfifo_bugchk(struct wm_softc *sc, struct mbuf *m0)
   5137 {
   5138 	int space = sc->sc_txfifo_size - sc->sc_txfifo_head;
   5139 	int len = roundup(m0->m_pkthdr.len + WM_FIFO_HDR, WM_FIFO_HDR);
   5140 
   5141 	/* Just return if already stalled. */
   5142 	if (sc->sc_txfifo_stall)
   5143 		return 1;
   5144 
   5145 	if (sc->sc_mii.mii_media_active & IFM_FDX) {
   5146 		/* Stall only occurs in half-duplex mode. */
   5147 		goto send_packet;
   5148 	}
   5149 
   5150 	if (len >= WM_82547_PAD_LEN + space) {
   5151 		sc->sc_txfifo_stall = 1;
   5152 		callout_schedule(&sc->sc_txfifo_ch, 1);
   5153 		return 1;
   5154 	}
   5155 
   5156  send_packet:
   5157 	sc->sc_txfifo_head += len;
   5158 	if (sc->sc_txfifo_head >= sc->sc_txfifo_size)
   5159 		sc->sc_txfifo_head -= sc->sc_txfifo_size;
   5160 
   5161 	return 0;
   5162 }
   5163 
   5164 /*
   5165  * wm_start:		[ifnet interface function]
   5166  *
   5167  *	Start packet transmission on the interface.
   5168  */
   5169 static void
   5170 wm_start(struct ifnet *ifp)
   5171 {
   5172 	struct wm_softc *sc = ifp->if_softc;
   5173 
   5174 	WM_TX_LOCK(sc);
   5175 	if (!sc->sc_stopping)
   5176 		wm_start_locked(ifp);
   5177 	WM_TX_UNLOCK(sc);
   5178 }
   5179 
   5180 static void
   5181 wm_start_locked(struct ifnet *ifp)
   5182 {
   5183 	struct wm_softc *sc = ifp->if_softc;
   5184 	struct mbuf *m0;
   5185 	struct m_tag *mtag;
   5186 	struct wm_txsoft *txs;
   5187 	bus_dmamap_t dmamap;
   5188 	int error, nexttx, lasttx = -1, ofree, seg, segs_needed, use_tso;
   5189 	bus_addr_t curaddr;
   5190 	bus_size_t seglen, curlen;
   5191 	uint32_t cksumcmd;
   5192 	uint8_t cksumfields;
   5193 
   5194 	KASSERT(WM_TX_LOCKED(sc));
   5195 
   5196 	if ((ifp->if_flags & (IFF_RUNNING|IFF_OACTIVE)) != IFF_RUNNING)
   5197 		return;
   5198 
   5199 	/* Remember the previous number of free descriptors. */
   5200 	ofree = sc->sc_txfree;
   5201 
   5202 	/*
   5203 	 * Loop through the send queue, setting up transmit descriptors
   5204 	 * until we drain the queue, or use up all available transmit
   5205 	 * descriptors.
   5206 	 */
   5207 	for (;;) {
   5208 		m0 = NULL;
   5209 
   5210 		/* Get a work queue entry. */
   5211 		if (sc->sc_txsfree < WM_TXQUEUE_GC(sc)) {
   5212 			wm_txeof(sc);
   5213 			if (sc->sc_txsfree == 0) {
   5214 				DPRINTF(WM_DEBUG_TX,
   5215 				    ("%s: TX: no free job descriptors\n",
   5216 					device_xname(sc->sc_dev)));
   5217 				WM_EVCNT_INCR(&sc->sc_ev_txsstall);
   5218 				break;
   5219 			}
   5220 		}
   5221 
   5222 		/* Grab a packet off the queue. */
   5223 		IFQ_DEQUEUE(&ifp->if_snd, m0);
   5224 		if (m0 == NULL)
   5225 			break;
   5226 
   5227 		DPRINTF(WM_DEBUG_TX,
   5228 		    ("%s: TX: have packet to transmit: %p\n",
   5229 		    device_xname(sc->sc_dev), m0));
   5230 
   5231 		txs = &sc->sc_txsoft[sc->sc_txsnext];
   5232 		dmamap = txs->txs_dmamap;
   5233 
   5234 		use_tso = (m0->m_pkthdr.csum_flags &
   5235 		    (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0;
   5236 
   5237 		/*
   5238 		 * So says the Linux driver:
   5239 		 * The controller does a simple calculation to make sure
   5240 		 * there is enough room in the FIFO before initiating the
   5241 		 * DMA for each buffer.  The calc is:
   5242 		 *	4 = ceil(buffer len / MSS)
   5243 		 * To make sure we don't overrun the FIFO, adjust the max
   5244 		 * buffer len if the MSS drops.
   5245 		 */
   5246 		dmamap->dm_maxsegsz =
   5247 		    (use_tso && (m0->m_pkthdr.segsz << 2) < WTX_MAX_LEN)
   5248 		    ? m0->m_pkthdr.segsz << 2
   5249 		    : WTX_MAX_LEN;
   5250 
   5251 		/*
   5252 		 * Load the DMA map.  If this fails, the packet either
   5253 		 * didn't fit in the allotted number of segments, or we
   5254 		 * were short on resources.  For the too-many-segments
   5255 		 * case, we simply report an error and drop the packet,
   5256 		 * since we can't sanely copy a jumbo packet to a single
   5257 		 * buffer.
   5258 		 */
   5259 		error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0,
   5260 		    BUS_DMA_WRITE|BUS_DMA_NOWAIT);
   5261 		if (error) {
   5262 			if (error == EFBIG) {
   5263 				WM_EVCNT_INCR(&sc->sc_ev_txdrop);
   5264 				log(LOG_ERR, "%s: Tx packet consumes too many "
   5265 				    "DMA segments, dropping...\n",
   5266 				    device_xname(sc->sc_dev));
   5267 				wm_dump_mbuf_chain(sc, m0);
   5268 				m_freem(m0);
   5269 				continue;
   5270 			}
   5271 			/*  Short on resources, just stop for now. */
   5272 			DPRINTF(WM_DEBUG_TX,
   5273 			    ("%s: TX: dmamap load failed: %d\n",
   5274 			    device_xname(sc->sc_dev), error));
   5275 			break;
   5276 		}
   5277 
   5278 		segs_needed = dmamap->dm_nsegs;
   5279 		if (use_tso) {
   5280 			/* For sentinel descriptor; see below. */
   5281 			segs_needed++;
   5282 		}
   5283 
   5284 		/*
   5285 		 * Ensure we have enough descriptors free to describe
   5286 		 * the packet.  Note, we always reserve one descriptor
   5287 		 * at the end of the ring due to the semantics of the
   5288 		 * TDT register, plus one more in the event we need
   5289 		 * to load offload context.
   5290 		 */
   5291 		if (segs_needed > sc->sc_txfree - 2) {
   5292 			/*
   5293 			 * Not enough free descriptors to transmit this
   5294 			 * packet.  We haven't committed anything yet,
   5295 			 * so just unload the DMA map, put the packet
   5296 			 * pack on the queue, and punt.  Notify the upper
   5297 			 * layer that there are no more slots left.
   5298 			 */
   5299 			DPRINTF(WM_DEBUG_TX,
   5300 			    ("%s: TX: need %d (%d) descriptors, have %d\n",
   5301 			    device_xname(sc->sc_dev), dmamap->dm_nsegs,
   5302 			    segs_needed, sc->sc_txfree - 1));
   5303 			ifp->if_flags |= IFF_OACTIVE;
   5304 			bus_dmamap_unload(sc->sc_dmat, dmamap);
   5305 			WM_EVCNT_INCR(&sc->sc_ev_txdstall);
   5306 			break;
   5307 		}
   5308 
   5309 		/*
   5310 		 * Check for 82547 Tx FIFO bug.  We need to do this
   5311 		 * once we know we can transmit the packet, since we
   5312 		 * do some internal FIFO space accounting here.
   5313 		 */
   5314 		if (sc->sc_type == WM_T_82547 &&
   5315 		    wm_82547_txfifo_bugchk(sc, m0)) {
   5316 			DPRINTF(WM_DEBUG_TX,
   5317 			    ("%s: TX: 82547 Tx FIFO bug detected\n",
   5318 			    device_xname(sc->sc_dev)));
   5319 			ifp->if_flags |= IFF_OACTIVE;
   5320 			bus_dmamap_unload(sc->sc_dmat, dmamap);
   5321 			WM_EVCNT_INCR(&sc->sc_ev_txfifo_stall);
   5322 			break;
   5323 		}
   5324 
   5325 		/* WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET. */
   5326 
   5327 		DPRINTF(WM_DEBUG_TX,
   5328 		    ("%s: TX: packet has %d (%d) DMA segments\n",
   5329 		    device_xname(sc->sc_dev), dmamap->dm_nsegs, segs_needed));
   5330 
   5331 		WM_EVCNT_INCR(&sc->sc_ev_txseg[dmamap->dm_nsegs - 1]);
   5332 
   5333 		/*
   5334 		 * Store a pointer to the packet so that we can free it
   5335 		 * later.
   5336 		 *
   5337 		 * Initially, we consider the number of descriptors the
   5338 		 * packet uses the number of DMA segments.  This may be
   5339 		 * incremented by 1 if we do checksum offload (a descriptor
   5340 		 * is used to set the checksum context).
   5341 		 */
   5342 		txs->txs_mbuf = m0;
   5343 		txs->txs_firstdesc = sc->sc_txnext;
   5344 		txs->txs_ndesc = segs_needed;
   5345 
   5346 		/* Set up offload parameters for this packet. */
   5347 		if (m0->m_pkthdr.csum_flags &
   5348 		    (M_CSUM_TSOv4|M_CSUM_TSOv6|
   5349 		    M_CSUM_IPv4|M_CSUM_TCPv4|M_CSUM_UDPv4|
   5350 		    M_CSUM_TCPv6|M_CSUM_UDPv6)) {
   5351 			if (wm_tx_offload(sc, txs, &cksumcmd,
   5352 					  &cksumfields) != 0) {
   5353 				/* Error message already displayed. */
   5354 				bus_dmamap_unload(sc->sc_dmat, dmamap);
   5355 				continue;
   5356 			}
   5357 		} else {
   5358 			cksumcmd = 0;
   5359 			cksumfields = 0;
   5360 		}
   5361 
   5362 		cksumcmd |= WTX_CMD_IDE | WTX_CMD_IFCS;
   5363 
   5364 		/* Sync the DMA map. */
   5365 		bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize,
   5366 		    BUS_DMASYNC_PREWRITE);
   5367 
   5368 		/* Initialize the transmit descriptor. */
   5369 		for (nexttx = sc->sc_txnext, seg = 0;
   5370 		     seg < dmamap->dm_nsegs; seg++) {
   5371 			for (seglen = dmamap->dm_segs[seg].ds_len,
   5372 			     curaddr = dmamap->dm_segs[seg].ds_addr;
   5373 			     seglen != 0;
   5374 			     curaddr += curlen, seglen -= curlen,
   5375 			     nexttx = WM_NEXTTX(sc, nexttx)) {
   5376 				curlen = seglen;
   5377 
   5378 				/*
   5379 				 * So says the Linux driver:
   5380 				 * Work around for premature descriptor
   5381 				 * write-backs in TSO mode.  Append a
   5382 				 * 4-byte sentinel descriptor.
   5383 				 */
   5384 				if (use_tso &&
   5385 				    seg == dmamap->dm_nsegs - 1 &&
   5386 				    curlen > 8)
   5387 					curlen -= 4;
   5388 
   5389 				wm_set_dma_addr(
   5390 				    &sc->sc_txdescs[nexttx].wtx_addr,
   5391 				    curaddr);
   5392 				sc->sc_txdescs[nexttx].wtx_cmdlen =
   5393 				    htole32(cksumcmd | curlen);
   5394 				sc->sc_txdescs[nexttx].wtx_fields.wtxu_status =
   5395 				    0;
   5396 				sc->sc_txdescs[nexttx].wtx_fields.wtxu_options =
   5397 				    cksumfields;
   5398 				sc->sc_txdescs[nexttx].wtx_fields.wtxu_vlan = 0;
   5399 				lasttx = nexttx;
   5400 
   5401 				DPRINTF(WM_DEBUG_TX,
   5402 				    ("%s: TX: desc %d: low %#" PRIx64 ", "
   5403 				     "len %#04zx\n",
   5404 				    device_xname(sc->sc_dev), nexttx,
   5405 				    (uint64_t)curaddr, curlen));
   5406 			}
   5407 		}
   5408 
   5409 		KASSERT(lasttx != -1);
   5410 
   5411 		/*
   5412 		 * Set up the command byte on the last descriptor of
   5413 		 * the packet.  If we're in the interrupt delay window,
   5414 		 * delay the interrupt.
   5415 		 */
   5416 		sc->sc_txdescs[lasttx].wtx_cmdlen |=
   5417 		    htole32(WTX_CMD_EOP | WTX_CMD_RS);
   5418 
   5419 		/*
   5420 		 * If VLANs are enabled and the packet has a VLAN tag, set
   5421 		 * up the descriptor to encapsulate the packet for us.
   5422 		 *
   5423 		 * This is only valid on the last descriptor of the packet.
   5424 		 */
   5425 		if ((mtag = VLAN_OUTPUT_TAG(&sc->sc_ethercom, m0)) != NULL) {
   5426 			sc->sc_txdescs[lasttx].wtx_cmdlen |=
   5427 			    htole32(WTX_CMD_VLE);
   5428 			sc->sc_txdescs[lasttx].wtx_fields.wtxu_vlan
   5429 			    = htole16(VLAN_TAG_VALUE(mtag) & 0xffff);
   5430 		}
   5431 
   5432 		txs->txs_lastdesc = lasttx;
   5433 
   5434 		DPRINTF(WM_DEBUG_TX,
   5435 		    ("%s: TX: desc %d: cmdlen 0x%08x\n",
   5436 		    device_xname(sc->sc_dev),
   5437 		    lasttx, le32toh(sc->sc_txdescs[lasttx].wtx_cmdlen)));
   5438 
   5439 		/* Sync the descriptors we're using. */
   5440 		WM_CDTXSYNC(sc, sc->sc_txnext, txs->txs_ndesc,
   5441 		    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
   5442 
   5443 		/* Give the packet to the chip. */
   5444 		CSR_WRITE(sc, sc->sc_tdt_reg, nexttx);
   5445 
   5446 		DPRINTF(WM_DEBUG_TX,
   5447 		    ("%s: TX: TDT -> %d\n", device_xname(sc->sc_dev), nexttx));
   5448 
   5449 		DPRINTF(WM_DEBUG_TX,
   5450 		    ("%s: TX: finished transmitting packet, job %d\n",
   5451 		    device_xname(sc->sc_dev), sc->sc_txsnext));
   5452 
   5453 		/* Advance the tx pointer. */
   5454 		sc->sc_txfree -= txs->txs_ndesc;
   5455 		sc->sc_txnext = nexttx;
   5456 
   5457 		sc->sc_txsfree--;
   5458 		sc->sc_txsnext = WM_NEXTTXS(sc, sc->sc_txsnext);
   5459 
   5460 		/* Pass the packet to any BPF listeners. */
   5461 		bpf_mtap(ifp, m0);
   5462 	}
   5463 
   5464 	if (m0 != NULL) {
   5465 		ifp->if_flags |= IFF_OACTIVE;
   5466 		WM_EVCNT_INCR(&sc->sc_ev_txdrop);
   5467 		DPRINTF(WM_DEBUG_TX, ("%s: TX: error after IFQ_DEQUEUE\n", __func__));
   5468 		m_freem(m0);
   5469 	}
   5470 
   5471 	if (sc->sc_txsfree == 0 || sc->sc_txfree <= 2) {
   5472 		/* No more slots; notify upper layer. */
   5473 		ifp->if_flags |= IFF_OACTIVE;
   5474 	}
   5475 
   5476 	if (sc->sc_txfree != ofree) {
   5477 		/* Set a watchdog timer in case the chip flakes out. */
   5478 		ifp->if_timer = 5;
   5479 	}
   5480 }
   5481 
   5482 /*
   5483  * wm_nq_tx_offload:
   5484  *
   5485  *	Set up TCP/IP checksumming parameters for the
   5486  *	specified packet, for NEWQUEUE devices
   5487  */
   5488 static int
   5489 wm_nq_tx_offload(struct wm_softc *sc, struct wm_txsoft *txs,
   5490     uint32_t *cmdlenp, uint32_t *fieldsp, bool *do_csum)
   5491 {
   5492 	struct mbuf *m0 = txs->txs_mbuf;
   5493 	struct m_tag *mtag;
   5494 	uint32_t vl_len, mssidx, cmdc;
   5495 	struct ether_header *eh;
   5496 	int offset, iphl;
   5497 
   5498 	/*
   5499 	 * XXX It would be nice if the mbuf pkthdr had offset
   5500 	 * fields for the protocol headers.
   5501 	 */
   5502 	*cmdlenp = 0;
   5503 	*fieldsp = 0;
   5504 
   5505 	eh = mtod(m0, struct ether_header *);
   5506 	switch (htons(eh->ether_type)) {
   5507 	case ETHERTYPE_IP:
   5508 	case ETHERTYPE_IPV6:
   5509 		offset = ETHER_HDR_LEN;
   5510 		break;
   5511 
   5512 	case ETHERTYPE_VLAN:
   5513 		offset = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
   5514 		break;
   5515 
   5516 	default:
   5517 		/* Don't support this protocol or encapsulation. */
   5518 		*do_csum = false;
   5519 		return 0;
   5520 	}
   5521 	*do_csum = true;
   5522 	*cmdlenp = NQTX_DTYP_D | NQTX_CMD_DEXT | NQTX_CMD_IFCS;
   5523 	cmdc = NQTX_DTYP_C | NQTX_CMD_DEXT;
   5524 
   5525 	vl_len = (offset << NQTXC_VLLEN_MACLEN_SHIFT);
   5526 	KASSERT((offset & ~NQTXC_VLLEN_MACLEN_MASK) == 0);
   5527 
   5528 	if ((m0->m_pkthdr.csum_flags &
   5529 	    (M_CSUM_TSOv4|M_CSUM_UDPv4|M_CSUM_TCPv4|M_CSUM_IPv4)) != 0) {
   5530 		iphl = M_CSUM_DATA_IPv4_IPHL(m0->m_pkthdr.csum_data);
   5531 	} else {
   5532 		iphl = M_CSUM_DATA_IPv6_HL(m0->m_pkthdr.csum_data);
   5533 	}
   5534 	vl_len |= (iphl << NQTXC_VLLEN_IPLEN_SHIFT);
   5535 	KASSERT((iphl & ~NQTXC_VLLEN_IPLEN_MASK) == 0);
   5536 
   5537 	if ((mtag = VLAN_OUTPUT_TAG(&sc->sc_ethercom, m0)) != NULL) {
   5538 		vl_len |= ((VLAN_TAG_VALUE(mtag) & NQTXC_VLLEN_VLAN_MASK)
   5539 		     << NQTXC_VLLEN_VLAN_SHIFT);
   5540 		*cmdlenp |= NQTX_CMD_VLE;
   5541 	}
   5542 
   5543 	mssidx = 0;
   5544 
   5545 	if ((m0->m_pkthdr.csum_flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0) {
   5546 		int hlen = offset + iphl;
   5547 		int tcp_hlen;
   5548 		bool v4 = (m0->m_pkthdr.csum_flags & M_CSUM_TSOv4) != 0;
   5549 
   5550 		if (__predict_false(m0->m_len <
   5551 				    (hlen + sizeof(struct tcphdr)))) {
   5552 			/*
   5553 			 * TCP/IP headers are not in the first mbuf; we need
   5554 			 * to do this the slow and painful way.  Let's just
   5555 			 * hope this doesn't happen very often.
   5556 			 */
   5557 			struct tcphdr th;
   5558 
   5559 			WM_EVCNT_INCR(&sc->sc_ev_txtsopain);
   5560 
   5561 			m_copydata(m0, hlen, sizeof(th), &th);
   5562 			if (v4) {
   5563 				struct ip ip;
   5564 
   5565 				m_copydata(m0, offset, sizeof(ip), &ip);
   5566 				ip.ip_len = 0;
   5567 				m_copyback(m0,
   5568 				    offset + offsetof(struct ip, ip_len),
   5569 				    sizeof(ip.ip_len), &ip.ip_len);
   5570 				th.th_sum = in_cksum_phdr(ip.ip_src.s_addr,
   5571 				    ip.ip_dst.s_addr, htons(IPPROTO_TCP));
   5572 			} else {
   5573 				struct ip6_hdr ip6;
   5574 
   5575 				m_copydata(m0, offset, sizeof(ip6), &ip6);
   5576 				ip6.ip6_plen = 0;
   5577 				m_copyback(m0,
   5578 				    offset + offsetof(struct ip6_hdr, ip6_plen),
   5579 				    sizeof(ip6.ip6_plen), &ip6.ip6_plen);
   5580 				th.th_sum = in6_cksum_phdr(&ip6.ip6_src,
   5581 				    &ip6.ip6_dst, 0, htonl(IPPROTO_TCP));
   5582 			}
   5583 			m_copyback(m0, hlen + offsetof(struct tcphdr, th_sum),
   5584 			    sizeof(th.th_sum), &th.th_sum);
   5585 
   5586 			tcp_hlen = th.th_off << 2;
   5587 		} else {
   5588 			/*
   5589 			 * TCP/IP headers are in the first mbuf; we can do
   5590 			 * this the easy way.
   5591 			 */
   5592 			struct tcphdr *th;
   5593 
   5594 			if (v4) {
   5595 				struct ip *ip =
   5596 				    (void *)(mtod(m0, char *) + offset);
   5597 				th = (void *)(mtod(m0, char *) + hlen);
   5598 
   5599 				ip->ip_len = 0;
   5600 				th->th_sum = in_cksum_phdr(ip->ip_src.s_addr,
   5601 				    ip->ip_dst.s_addr, htons(IPPROTO_TCP));
   5602 			} else {
   5603 				struct ip6_hdr *ip6 =
   5604 				    (void *)(mtod(m0, char *) + offset);
   5605 				th = (void *)(mtod(m0, char *) + hlen);
   5606 
   5607 				ip6->ip6_plen = 0;
   5608 				th->th_sum = in6_cksum_phdr(&ip6->ip6_src,
   5609 				    &ip6->ip6_dst, 0, htonl(IPPROTO_TCP));
   5610 			}
   5611 			tcp_hlen = th->th_off << 2;
   5612 		}
   5613 		hlen += tcp_hlen;
   5614 		*cmdlenp |= NQTX_CMD_TSE;
   5615 
   5616 		if (v4) {
   5617 			WM_EVCNT_INCR(&sc->sc_ev_txtso);
   5618 			*fieldsp |= NQTXD_FIELDS_IXSM | NQTXD_FIELDS_TUXSM;
   5619 		} else {
   5620 			WM_EVCNT_INCR(&sc->sc_ev_txtso6);
   5621 			*fieldsp |= NQTXD_FIELDS_TUXSM;
   5622 		}
   5623 		*fieldsp |= ((m0->m_pkthdr.len - hlen) << NQTXD_FIELDS_PAYLEN_SHIFT);
   5624 		KASSERT(((m0->m_pkthdr.len - hlen) & ~NQTXD_FIELDS_PAYLEN_MASK) == 0);
   5625 		mssidx |= (m0->m_pkthdr.segsz << NQTXC_MSSIDX_MSS_SHIFT);
   5626 		KASSERT((m0->m_pkthdr.segsz & ~NQTXC_MSSIDX_MSS_MASK) == 0);
   5627 		mssidx |= (tcp_hlen << NQTXC_MSSIDX_L4LEN_SHIFT);
   5628 		KASSERT((tcp_hlen & ~NQTXC_MSSIDX_L4LEN_MASK) == 0);
   5629 	} else {
   5630 		*fieldsp |= (m0->m_pkthdr.len << NQTXD_FIELDS_PAYLEN_SHIFT);
   5631 		KASSERT((m0->m_pkthdr.len & ~NQTXD_FIELDS_PAYLEN_MASK) == 0);
   5632 	}
   5633 
   5634 	if (m0->m_pkthdr.csum_flags & M_CSUM_IPv4) {
   5635 		*fieldsp |= NQTXD_FIELDS_IXSM;
   5636 		cmdc |= NQTXC_CMD_IP4;
   5637 	}
   5638 
   5639 	if (m0->m_pkthdr.csum_flags &
   5640 	    (M_CSUM_UDPv4 | M_CSUM_TCPv4 | M_CSUM_TSOv4)) {
   5641 		WM_EVCNT_INCR(&sc->sc_ev_txtusum);
   5642 		if (m0->m_pkthdr.csum_flags & (M_CSUM_TCPv4 | M_CSUM_TSOv4)) {
   5643 			cmdc |= NQTXC_CMD_TCP;
   5644 		} else {
   5645 			cmdc |= NQTXC_CMD_UDP;
   5646 		}
   5647 		cmdc |= NQTXC_CMD_IP4;
   5648 		*fieldsp |= NQTXD_FIELDS_TUXSM;
   5649 	}
   5650 	if (m0->m_pkthdr.csum_flags &
   5651 	    (M_CSUM_UDPv6 | M_CSUM_TCPv6 | M_CSUM_TSOv6)) {
   5652 		WM_EVCNT_INCR(&sc->sc_ev_txtusum6);
   5653 		if (m0->m_pkthdr.csum_flags & (M_CSUM_TCPv6 | M_CSUM_TSOv6)) {
   5654 			cmdc |= NQTXC_CMD_TCP;
   5655 		} else {
   5656 			cmdc |= NQTXC_CMD_UDP;
   5657 		}
   5658 		cmdc |= NQTXC_CMD_IP6;
   5659 		*fieldsp |= NQTXD_FIELDS_TUXSM;
   5660 	}
   5661 
   5662 	/* Fill in the context descriptor. */
   5663 	sc->sc_nq_txdescs[sc->sc_txnext].nqrx_ctx.nqtxc_vl_len =
   5664 	    htole32(vl_len);
   5665 	sc->sc_nq_txdescs[sc->sc_txnext].nqrx_ctx.nqtxc_sn = 0;
   5666 	sc->sc_nq_txdescs[sc->sc_txnext].nqrx_ctx.nqtxc_cmd =
   5667 	    htole32(cmdc);
   5668 	sc->sc_nq_txdescs[sc->sc_txnext].nqrx_ctx.nqtxc_mssidx =
   5669 	    htole32(mssidx);
   5670 	WM_CDTXSYNC(sc, sc->sc_txnext, 1, BUS_DMASYNC_PREWRITE);
   5671 	DPRINTF(WM_DEBUG_TX,
   5672 	    ("%s: TX: context desc %d 0x%08x%08x\n", device_xname(sc->sc_dev),
   5673 	    sc->sc_txnext, 0, vl_len));
   5674 	DPRINTF(WM_DEBUG_TX, ("\t0x%08x%08x\n", mssidx, cmdc));
   5675 	sc->sc_txnext = WM_NEXTTX(sc, sc->sc_txnext);
   5676 	txs->txs_ndesc++;
   5677 	return 0;
   5678 }
   5679 
   5680 /*
   5681  * wm_nq_start:		[ifnet interface function]
   5682  *
   5683  *	Start packet transmission on the interface for NEWQUEUE devices
   5684  */
   5685 static void
   5686 wm_nq_start(struct ifnet *ifp)
   5687 {
   5688 	struct wm_softc *sc = ifp->if_softc;
   5689 
   5690 	WM_TX_LOCK(sc);
   5691 	if (!sc->sc_stopping)
   5692 		wm_nq_start_locked(ifp);
   5693 	WM_TX_UNLOCK(sc);
   5694 }
   5695 
   5696 static void
   5697 wm_nq_start_locked(struct ifnet *ifp)
   5698 {
   5699 	struct wm_softc *sc = ifp->if_softc;
   5700 	struct mbuf *m0;
   5701 	struct m_tag *mtag;
   5702 	struct wm_txsoft *txs;
   5703 	bus_dmamap_t dmamap;
   5704 	int error, nexttx, lasttx = -1, seg, segs_needed;
   5705 	bool do_csum, sent;
   5706 
   5707 	KASSERT(WM_TX_LOCKED(sc));
   5708 
   5709 	if ((ifp->if_flags & (IFF_RUNNING|IFF_OACTIVE)) != IFF_RUNNING)
   5710 		return;
   5711 
   5712 	sent = false;
   5713 
   5714 	/*
   5715 	 * Loop through the send queue, setting up transmit descriptors
   5716 	 * until we drain the queue, or use up all available transmit
   5717 	 * descriptors.
   5718 	 */
   5719 	for (;;) {
   5720 		m0 = NULL;
   5721 
   5722 		/* Get a work queue entry. */
   5723 		if (sc->sc_txsfree < WM_TXQUEUE_GC(sc)) {
   5724 			wm_txeof(sc);
   5725 			if (sc->sc_txsfree == 0) {
   5726 				DPRINTF(WM_DEBUG_TX,
   5727 				    ("%s: TX: no free job descriptors\n",
   5728 					device_xname(sc->sc_dev)));
   5729 				WM_EVCNT_INCR(&sc->sc_ev_txsstall);
   5730 				break;
   5731 			}
   5732 		}
   5733 
   5734 		/* Grab a packet off the queue. */
   5735 		IFQ_DEQUEUE(&ifp->if_snd, m0);
   5736 		if (m0 == NULL)
   5737 			break;
   5738 
   5739 		DPRINTF(WM_DEBUG_TX,
   5740 		    ("%s: TX: have packet to transmit: %p\n",
   5741 		    device_xname(sc->sc_dev), m0));
   5742 
   5743 		txs = &sc->sc_txsoft[sc->sc_txsnext];
   5744 		dmamap = txs->txs_dmamap;
   5745 
   5746 		/*
   5747 		 * Load the DMA map.  If this fails, the packet either
   5748 		 * didn't fit in the allotted number of segments, or we
   5749 		 * were short on resources.  For the too-many-segments
   5750 		 * case, we simply report an error and drop the packet,
   5751 		 * since we can't sanely copy a jumbo packet to a single
   5752 		 * buffer.
   5753 		 */
   5754 		error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0,
   5755 		    BUS_DMA_WRITE|BUS_DMA_NOWAIT);
   5756 		if (error) {
   5757 			if (error == EFBIG) {
   5758 				WM_EVCNT_INCR(&sc->sc_ev_txdrop);
   5759 				log(LOG_ERR, "%s: Tx packet consumes too many "
   5760 				    "DMA segments, dropping...\n",
   5761 				    device_xname(sc->sc_dev));
   5762 				wm_dump_mbuf_chain(sc, m0);
   5763 				m_freem(m0);
   5764 				continue;
   5765 			}
   5766 			/* Short on resources, just stop for now. */
   5767 			DPRINTF(WM_DEBUG_TX,
   5768 			    ("%s: TX: dmamap load failed: %d\n",
   5769 			    device_xname(sc->sc_dev), error));
   5770 			break;
   5771 		}
   5772 
   5773 		segs_needed = dmamap->dm_nsegs;
   5774 
   5775 		/*
   5776 		 * Ensure we have enough descriptors free to describe
   5777 		 * the packet.  Note, we always reserve one descriptor
   5778 		 * at the end of the ring due to the semantics of the
   5779 		 * TDT register, plus one more in the event we need
   5780 		 * to load offload context.
   5781 		 */
   5782 		if (segs_needed > sc->sc_txfree - 2) {
   5783 			/*
   5784 			 * Not enough free descriptors to transmit this
   5785 			 * packet.  We haven't committed anything yet,
   5786 			 * so just unload the DMA map, put the packet
   5787 			 * pack on the queue, and punt.  Notify the upper
   5788 			 * layer that there are no more slots left.
   5789 			 */
   5790 			DPRINTF(WM_DEBUG_TX,
   5791 			    ("%s: TX: need %d (%d) descriptors, have %d\n",
   5792 			    device_xname(sc->sc_dev), dmamap->dm_nsegs,
   5793 			    segs_needed, sc->sc_txfree - 1));
   5794 			ifp->if_flags |= IFF_OACTIVE;
   5795 			bus_dmamap_unload(sc->sc_dmat, dmamap);
   5796 			WM_EVCNT_INCR(&sc->sc_ev_txdstall);
   5797 			break;
   5798 		}
   5799 
   5800 		/* WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET. */
   5801 
   5802 		DPRINTF(WM_DEBUG_TX,
   5803 		    ("%s: TX: packet has %d (%d) DMA segments\n",
   5804 		    device_xname(sc->sc_dev), dmamap->dm_nsegs, segs_needed));
   5805 
   5806 		WM_EVCNT_INCR(&sc->sc_ev_txseg[dmamap->dm_nsegs - 1]);
   5807 
   5808 		/*
   5809 		 * Store a pointer to the packet so that we can free it
   5810 		 * later.
   5811 		 *
   5812 		 * Initially, we consider the number of descriptors the
   5813 		 * packet uses the number of DMA segments.  This may be
   5814 		 * incremented by 1 if we do checksum offload (a descriptor
   5815 		 * is used to set the checksum context).
   5816 		 */
   5817 		txs->txs_mbuf = m0;
   5818 		txs->txs_firstdesc = sc->sc_txnext;
   5819 		txs->txs_ndesc = segs_needed;
   5820 
   5821 		/* Set up offload parameters for this packet. */
   5822 		uint32_t cmdlen, fields, dcmdlen;
   5823 		if (m0->m_pkthdr.csum_flags &
   5824 		    (M_CSUM_TSOv4|M_CSUM_TSOv6|
   5825 		    M_CSUM_IPv4|M_CSUM_TCPv4|M_CSUM_UDPv4|
   5826 		    M_CSUM_TCPv6|M_CSUM_UDPv6)) {
   5827 			if (wm_nq_tx_offload(sc, txs, &cmdlen, &fields,
   5828 			    &do_csum) != 0) {
   5829 				/* Error message already displayed. */
   5830 				bus_dmamap_unload(sc->sc_dmat, dmamap);
   5831 				continue;
   5832 			}
   5833 		} else {
   5834 			do_csum = false;
   5835 			cmdlen = 0;
   5836 			fields = 0;
   5837 		}
   5838 
   5839 		/* Sync the DMA map. */
   5840 		bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize,
   5841 		    BUS_DMASYNC_PREWRITE);
   5842 
   5843 		/* Initialize the first transmit descriptor. */
   5844 		nexttx = sc->sc_txnext;
   5845 		if (!do_csum) {
   5846 			/* setup a legacy descriptor */
   5847 			wm_set_dma_addr(
   5848 			    &sc->sc_txdescs[nexttx].wtx_addr,
   5849 			    dmamap->dm_segs[0].ds_addr);
   5850 			sc->sc_txdescs[nexttx].wtx_cmdlen =
   5851 			    htole32(WTX_CMD_IFCS | dmamap->dm_segs[0].ds_len);
   5852 			sc->sc_txdescs[nexttx].wtx_fields.wtxu_status = 0;
   5853 			sc->sc_txdescs[nexttx].wtx_fields.wtxu_options = 0;
   5854 			if ((mtag = VLAN_OUTPUT_TAG(&sc->sc_ethercom, m0)) !=
   5855 			    NULL) {
   5856 				sc->sc_txdescs[nexttx].wtx_cmdlen |=
   5857 				    htole32(WTX_CMD_VLE);
   5858 				sc->sc_txdescs[nexttx].wtx_fields.wtxu_vlan =
   5859 				    htole16(VLAN_TAG_VALUE(mtag) & 0xffff);
   5860 			} else {
   5861 				sc->sc_txdescs[nexttx].wtx_fields.wtxu_vlan =0;
   5862 			}
   5863 			dcmdlen = 0;
   5864 		} else {
   5865 			/* setup an advanced data descriptor */
   5866 			sc->sc_nq_txdescs[nexttx].nqtx_data.nqtxd_addr =
   5867 			    htole64(dmamap->dm_segs[0].ds_addr);
   5868 			KASSERT((dmamap->dm_segs[0].ds_len & cmdlen) == 0);
   5869 			sc->sc_nq_txdescs[nexttx].nqtx_data.nqtxd_cmdlen =
   5870 			    htole32(dmamap->dm_segs[0].ds_len | cmdlen );
   5871 			sc->sc_nq_txdescs[nexttx].nqtx_data.nqtxd_fields =
   5872 			    htole32(fields);
   5873 			DPRINTF(WM_DEBUG_TX,
   5874 			    ("%s: TX: adv data desc %d 0x%" PRIx64 "\n",
   5875 			    device_xname(sc->sc_dev), nexttx,
   5876 			    (uint64_t)dmamap->dm_segs[0].ds_addr));
   5877 			DPRINTF(WM_DEBUG_TX,
   5878 			    ("\t 0x%08x%08x\n", fields,
   5879 			    (uint32_t)dmamap->dm_segs[0].ds_len | cmdlen));
   5880 			dcmdlen = NQTX_DTYP_D | NQTX_CMD_DEXT;
   5881 		}
   5882 
   5883 		lasttx = nexttx;
   5884 		nexttx = WM_NEXTTX(sc, nexttx);
   5885 		/*
   5886 		 * fill in the next descriptors. legacy or adcanced format
   5887 		 * is the same here
   5888 		 */
   5889 		for (seg = 1; seg < dmamap->dm_nsegs;
   5890 		    seg++, nexttx = WM_NEXTTX(sc, nexttx)) {
   5891 			sc->sc_nq_txdescs[nexttx].nqtx_data.nqtxd_addr =
   5892 			    htole64(dmamap->dm_segs[seg].ds_addr);
   5893 			sc->sc_nq_txdescs[nexttx].nqtx_data.nqtxd_cmdlen =
   5894 			    htole32(dcmdlen | dmamap->dm_segs[seg].ds_len);
   5895 			KASSERT((dcmdlen & dmamap->dm_segs[seg].ds_len) == 0);
   5896 			sc->sc_nq_txdescs[nexttx].nqtx_data.nqtxd_fields = 0;
   5897 			lasttx = nexttx;
   5898 
   5899 			DPRINTF(WM_DEBUG_TX,
   5900 			    ("%s: TX: desc %d: %#" PRIx64 ", "
   5901 			     "len %#04zx\n",
   5902 			    device_xname(sc->sc_dev), nexttx,
   5903 			    (uint64_t)dmamap->dm_segs[seg].ds_addr,
   5904 			    dmamap->dm_segs[seg].ds_len));
   5905 		}
   5906 
   5907 		KASSERT(lasttx != -1);
   5908 
   5909 		/*
   5910 		 * Set up the command byte on the last descriptor of
   5911 		 * the packet.  If we're in the interrupt delay window,
   5912 		 * delay the interrupt.
   5913 		 */
   5914 		KASSERT((WTX_CMD_EOP | WTX_CMD_RS) ==
   5915 		    (NQTX_CMD_EOP | NQTX_CMD_RS));
   5916 		sc->sc_txdescs[lasttx].wtx_cmdlen |=
   5917 		    htole32(WTX_CMD_EOP | WTX_CMD_RS);
   5918 
   5919 		txs->txs_lastdesc = lasttx;
   5920 
   5921 		DPRINTF(WM_DEBUG_TX,
   5922 		    ("%s: TX: desc %d: cmdlen 0x%08x\n",
   5923 		    device_xname(sc->sc_dev),
   5924 		    lasttx, le32toh(sc->sc_txdescs[lasttx].wtx_cmdlen)));
   5925 
   5926 		/* Sync the descriptors we're using. */
   5927 		WM_CDTXSYNC(sc, sc->sc_txnext, txs->txs_ndesc,
   5928 		    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
   5929 
   5930 		/* Give the packet to the chip. */
   5931 		CSR_WRITE(sc, sc->sc_tdt_reg, nexttx);
   5932 		sent = true;
   5933 
   5934 		DPRINTF(WM_DEBUG_TX,
   5935 		    ("%s: TX: TDT -> %d\n", device_xname(sc->sc_dev), nexttx));
   5936 
   5937 		DPRINTF(WM_DEBUG_TX,
   5938 		    ("%s: TX: finished transmitting packet, job %d\n",
   5939 		    device_xname(sc->sc_dev), sc->sc_txsnext));
   5940 
   5941 		/* Advance the tx pointer. */
   5942 		sc->sc_txfree -= txs->txs_ndesc;
   5943 		sc->sc_txnext = nexttx;
   5944 
   5945 		sc->sc_txsfree--;
   5946 		sc->sc_txsnext = WM_NEXTTXS(sc, sc->sc_txsnext);
   5947 
   5948 		/* Pass the packet to any BPF listeners. */
   5949 		bpf_mtap(ifp, m0);
   5950 	}
   5951 
   5952 	if (m0 != NULL) {
   5953 		ifp->if_flags |= IFF_OACTIVE;
   5954 		WM_EVCNT_INCR(&sc->sc_ev_txdrop);
   5955 		DPRINTF(WM_DEBUG_TX, ("%s: TX: error after IFQ_DEQUEUE\n", __func__));
   5956 		m_freem(m0);
   5957 	}
   5958 
   5959 	if (sc->sc_txsfree == 0 || sc->sc_txfree <= 2) {
   5960 		/* No more slots; notify upper layer. */
   5961 		ifp->if_flags |= IFF_OACTIVE;
   5962 	}
   5963 
   5964 	if (sent) {
   5965 		/* Set a watchdog timer in case the chip flakes out. */
   5966 		ifp->if_timer = 5;
   5967 	}
   5968 }
   5969 
   5970 /* Interrupt */
   5971 
   5972 /*
   5973  * wm_txeof:
   5974  *
   5975  *	Helper; handle transmit interrupts.
   5976  */
   5977 static int
   5978 wm_txeof(struct wm_softc *sc)
   5979 {
   5980 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
   5981 	struct wm_txsoft *txs;
   5982 	bool processed = false;
   5983 	int count = 0;
   5984 	int i;
   5985 	uint8_t status;
   5986 
   5987 	if (sc->sc_stopping)
   5988 		return 0;
   5989 
   5990 	ifp->if_flags &= ~IFF_OACTIVE;
   5991 
   5992 	/*
   5993 	 * Go through the Tx list and free mbufs for those
   5994 	 * frames which have been transmitted.
   5995 	 */
   5996 	for (i = sc->sc_txsdirty; sc->sc_txsfree != WM_TXQUEUELEN(sc);
   5997 	     i = WM_NEXTTXS(sc, i), sc->sc_txsfree++) {
   5998 		txs = &sc->sc_txsoft[i];
   5999 
   6000 		DPRINTF(WM_DEBUG_TX,
   6001 		    ("%s: TX: checking job %d\n", device_xname(sc->sc_dev), i));
   6002 
   6003 		WM_CDTXSYNC(sc, txs->txs_firstdesc, txs->txs_ndesc,
   6004 		    BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
   6005 
   6006 		status =
   6007 		    sc->sc_txdescs[txs->txs_lastdesc].wtx_fields.wtxu_status;
   6008 		if ((status & WTX_ST_DD) == 0) {
   6009 			WM_CDTXSYNC(sc, txs->txs_lastdesc, 1,
   6010 			    BUS_DMASYNC_PREREAD);
   6011 			break;
   6012 		}
   6013 
   6014 		processed = true;
   6015 		count++;
   6016 		DPRINTF(WM_DEBUG_TX,
   6017 		    ("%s: TX: job %d done: descs %d..%d\n",
   6018 		    device_xname(sc->sc_dev), i, txs->txs_firstdesc,
   6019 		    txs->txs_lastdesc));
   6020 
   6021 		/*
   6022 		 * XXX We should probably be using the statistics
   6023 		 * XXX registers, but I don't know if they exist
   6024 		 * XXX on chips before the i82544.
   6025 		 */
   6026 
   6027 #ifdef WM_EVENT_COUNTERS
   6028 		if (status & WTX_ST_TU)
   6029 			WM_EVCNT_INCR(&sc->sc_ev_tu);
   6030 #endif /* WM_EVENT_COUNTERS */
   6031 
   6032 		if (status & (WTX_ST_EC|WTX_ST_LC)) {
   6033 			ifp->if_oerrors++;
   6034 			if (status & WTX_ST_LC)
   6035 				log(LOG_WARNING, "%s: late collision\n",
   6036 				    device_xname(sc->sc_dev));
   6037 			else if (status & WTX_ST_EC) {
   6038 				ifp->if_collisions += 16;
   6039 				log(LOG_WARNING, "%s: excessive collisions\n",
   6040 				    device_xname(sc->sc_dev));
   6041 			}
   6042 		} else
   6043 			ifp->if_opackets++;
   6044 
   6045 		sc->sc_txfree += txs->txs_ndesc;
   6046 		bus_dmamap_sync(sc->sc_dmat, txs->txs_dmamap,
   6047 		    0, txs->txs_dmamap->dm_mapsize, BUS_DMASYNC_POSTWRITE);
   6048 		bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap);
   6049 		m_freem(txs->txs_mbuf);
   6050 		txs->txs_mbuf = NULL;
   6051 	}
   6052 
   6053 	/* Update the dirty transmit buffer pointer. */
   6054 	sc->sc_txsdirty = i;
   6055 	DPRINTF(WM_DEBUG_TX,
   6056 	    ("%s: TX: txsdirty -> %d\n", device_xname(sc->sc_dev), i));
   6057 
   6058 	if (count != 0)
   6059 		rnd_add_uint32(&sc->rnd_source, count);
   6060 
   6061 	/*
   6062 	 * If there are no more pending transmissions, cancel the watchdog
   6063 	 * timer.
   6064 	 */
   6065 	if (sc->sc_txsfree == WM_TXQUEUELEN(sc))
   6066 		ifp->if_timer = 0;
   6067 
   6068 	return processed;
   6069 }
   6070 
   6071 /*
   6072  * wm_rxeof:
   6073  *
   6074  *	Helper; handle receive interrupts.
   6075  */
   6076 static void
   6077 wm_rxeof(struct wm_softc *sc)
   6078 {
   6079 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
   6080 	struct wm_rxsoft *rxs;
   6081 	struct mbuf *m;
   6082 	int i, len;
   6083 	int count = 0;
   6084 	uint8_t status, errors;
   6085 	uint16_t vlantag;
   6086 
   6087 	for (i = sc->sc_rxptr;; i = WM_NEXTRX(i)) {
   6088 		rxs = &sc->sc_rxsoft[i];
   6089 
   6090 		DPRINTF(WM_DEBUG_RX,
   6091 		    ("%s: RX: checking descriptor %d\n",
   6092 		    device_xname(sc->sc_dev), i));
   6093 
   6094 		WM_CDRXSYNC(sc, i, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
   6095 
   6096 		status = sc->sc_rxdescs[i].wrx_status;
   6097 		errors = sc->sc_rxdescs[i].wrx_errors;
   6098 		len = le16toh(sc->sc_rxdescs[i].wrx_len);
   6099 		vlantag = sc->sc_rxdescs[i].wrx_special;
   6100 
   6101 		if ((status & WRX_ST_DD) == 0) {
   6102 			/* We have processed all of the receive descriptors. */
   6103 			WM_CDRXSYNC(sc, i, BUS_DMASYNC_PREREAD);
   6104 			break;
   6105 		}
   6106 
   6107 		count++;
   6108 		if (__predict_false(sc->sc_rxdiscard)) {
   6109 			DPRINTF(WM_DEBUG_RX,
   6110 			    ("%s: RX: discarding contents of descriptor %d\n",
   6111 			    device_xname(sc->sc_dev), i));
   6112 			WM_INIT_RXDESC(sc, i);
   6113 			if (status & WRX_ST_EOP) {
   6114 				/* Reset our state. */
   6115 				DPRINTF(WM_DEBUG_RX,
   6116 				    ("%s: RX: resetting rxdiscard -> 0\n",
   6117 				    device_xname(sc->sc_dev)));
   6118 				sc->sc_rxdiscard = 0;
   6119 			}
   6120 			continue;
   6121 		}
   6122 
   6123 		bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
   6124 		    rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_POSTREAD);
   6125 
   6126 		m = rxs->rxs_mbuf;
   6127 
   6128 		/*
   6129 		 * Add a new receive buffer to the ring, unless of
   6130 		 * course the length is zero. Treat the latter as a
   6131 		 * failed mapping.
   6132 		 */
   6133 		if ((len == 0) || (wm_add_rxbuf(sc, i) != 0)) {
   6134 			/*
   6135 			 * Failed, throw away what we've done so
   6136 			 * far, and discard the rest of the packet.
   6137 			 */
   6138 			ifp->if_ierrors++;
   6139 			bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
   6140 			    rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);
   6141 			WM_INIT_RXDESC(sc, i);
   6142 			if ((status & WRX_ST_EOP) == 0)
   6143 				sc->sc_rxdiscard = 1;
   6144 			if (sc->sc_rxhead != NULL)
   6145 				m_freem(sc->sc_rxhead);
   6146 			WM_RXCHAIN_RESET(sc);
   6147 			DPRINTF(WM_DEBUG_RX,
   6148 			    ("%s: RX: Rx buffer allocation failed, "
   6149 			    "dropping packet%s\n", device_xname(sc->sc_dev),
   6150 			    sc->sc_rxdiscard ? " (discard)" : ""));
   6151 			continue;
   6152 		}
   6153 
   6154 		m->m_len = len;
   6155 		sc->sc_rxlen += len;
   6156 		DPRINTF(WM_DEBUG_RX,
   6157 		    ("%s: RX: buffer at %p len %d\n",
   6158 		    device_xname(sc->sc_dev), m->m_data, len));
   6159 
   6160 		/* If this is not the end of the packet, keep looking. */
   6161 		if ((status & WRX_ST_EOP) == 0) {
   6162 			WM_RXCHAIN_LINK(sc, m);
   6163 			DPRINTF(WM_DEBUG_RX,
   6164 			    ("%s: RX: not yet EOP, rxlen -> %d\n",
   6165 			    device_xname(sc->sc_dev), sc->sc_rxlen));
   6166 			continue;
   6167 		}
   6168 
   6169 		/*
   6170 		 * Okay, we have the entire packet now.  The chip is
   6171 		 * configured to include the FCS except I350 and I21[01]
   6172 		 * (not all chips can be configured to strip it),
   6173 		 * so we need to trim it.
   6174 		 * May need to adjust length of previous mbuf in the
   6175 		 * chain if the current mbuf is too short.
   6176 		 * For an eratta, the RCTL_SECRC bit in RCTL register
   6177 		 * is always set in I350, so we don't trim it.
   6178 		 */
   6179 		if ((sc->sc_type != WM_T_I350) && (sc->sc_type != WM_T_I354)
   6180 		    && (sc->sc_type != WM_T_I210)
   6181 		    && (sc->sc_type != WM_T_I211)) {
   6182 			if (m->m_len < ETHER_CRC_LEN) {
   6183 				sc->sc_rxtail->m_len
   6184 				    -= (ETHER_CRC_LEN - m->m_len);
   6185 				m->m_len = 0;
   6186 			} else
   6187 				m->m_len -= ETHER_CRC_LEN;
   6188 			len = sc->sc_rxlen - ETHER_CRC_LEN;
   6189 		} else
   6190 			len = sc->sc_rxlen;
   6191 
   6192 		WM_RXCHAIN_LINK(sc, m);
   6193 
   6194 		*sc->sc_rxtailp = NULL;
   6195 		m = sc->sc_rxhead;
   6196 
   6197 		WM_RXCHAIN_RESET(sc);
   6198 
   6199 		DPRINTF(WM_DEBUG_RX,
   6200 		    ("%s: RX: have entire packet, len -> %d\n",
   6201 		    device_xname(sc->sc_dev), len));
   6202 
   6203 		/* If an error occurred, update stats and drop the packet. */
   6204 		if (errors &
   6205 		     (WRX_ER_CE|WRX_ER_SE|WRX_ER_SEQ|WRX_ER_CXE|WRX_ER_RXE)) {
   6206 			if (errors & WRX_ER_SE)
   6207 				log(LOG_WARNING, "%s: symbol error\n",
   6208 				    device_xname(sc->sc_dev));
   6209 			else if (errors & WRX_ER_SEQ)
   6210 				log(LOG_WARNING, "%s: receive sequence error\n",
   6211 				    device_xname(sc->sc_dev));
   6212 			else if (errors & WRX_ER_CE)
   6213 				log(LOG_WARNING, "%s: CRC error\n",
   6214 				    device_xname(sc->sc_dev));
   6215 			m_freem(m);
   6216 			continue;
   6217 		}
   6218 
   6219 		/* No errors.  Receive the packet. */
   6220 		m->m_pkthdr.rcvif = ifp;
   6221 		m->m_pkthdr.len = len;
   6222 
   6223 		/*
   6224 		 * If VLANs are enabled, VLAN packets have been unwrapped
   6225 		 * for us.  Associate the tag with the packet.
   6226 		 */
   6227 		/* XXXX should check for i350 and i354 */
   6228 		if ((status & WRX_ST_VP) != 0) {
   6229 			VLAN_INPUT_TAG(ifp, m,
   6230 			    le16toh(vlantag),
   6231 			    continue);
   6232 		}
   6233 
   6234 		/* Set up checksum info for this packet. */
   6235 		if ((status & WRX_ST_IXSM) == 0) {
   6236 			if (status & WRX_ST_IPCS) {
   6237 				WM_EVCNT_INCR(&sc->sc_ev_rxipsum);
   6238 				m->m_pkthdr.csum_flags |= M_CSUM_IPv4;
   6239 				if (errors & WRX_ER_IPE)
   6240 					m->m_pkthdr.csum_flags |=
   6241 					    M_CSUM_IPv4_BAD;
   6242 			}
   6243 			if (status & WRX_ST_TCPCS) {
   6244 				/*
   6245 				 * Note: we don't know if this was TCP or UDP,
   6246 				 * so we just set both bits, and expect the
   6247 				 * upper layers to deal.
   6248 				 */
   6249 				WM_EVCNT_INCR(&sc->sc_ev_rxtusum);
   6250 				m->m_pkthdr.csum_flags |=
   6251 				    M_CSUM_TCPv4 | M_CSUM_UDPv4 |
   6252 				    M_CSUM_TCPv6 | M_CSUM_UDPv6;
   6253 				if (errors & WRX_ER_TCPE)
   6254 					m->m_pkthdr.csum_flags |=
   6255 					    M_CSUM_TCP_UDP_BAD;
   6256 			}
   6257 		}
   6258 
   6259 		ifp->if_ipackets++;
   6260 
   6261 		WM_RX_UNLOCK(sc);
   6262 
   6263 		/* Pass this up to any BPF listeners. */
   6264 		bpf_mtap(ifp, m);
   6265 
   6266 		/* Pass it on. */
   6267 		(*ifp->if_input)(ifp, m);
   6268 
   6269 		WM_RX_LOCK(sc);
   6270 
   6271 		if (sc->sc_stopping)
   6272 			break;
   6273 	}
   6274 
   6275 	/* Update the receive pointer. */
   6276 	sc->sc_rxptr = i;
   6277 	if (count != 0)
   6278 		rnd_add_uint32(&sc->rnd_source, count);
   6279 
   6280 	DPRINTF(WM_DEBUG_RX,
   6281 	    ("%s: RX: rxptr -> %d\n", device_xname(sc->sc_dev), i));
   6282 }
   6283 
   6284 /*
   6285  * wm_linkintr_gmii:
   6286  *
   6287  *	Helper; handle link interrupts for GMII.
   6288  */
   6289 static void
   6290 wm_linkintr_gmii(struct wm_softc *sc, uint32_t icr)
   6291 {
   6292 
   6293 	KASSERT(WM_TX_LOCKED(sc));
   6294 
   6295 	DPRINTF(WM_DEBUG_LINK, ("%s: %s:\n", device_xname(sc->sc_dev),
   6296 		__func__));
   6297 
   6298 	if (icr & ICR_LSC) {
   6299 		DPRINTF(WM_DEBUG_LINK,
   6300 		    ("%s: LINK: LSC -> mii_pollstat\n",
   6301 			device_xname(sc->sc_dev)));
   6302 		mii_pollstat(&sc->sc_mii);
   6303 		if (sc->sc_type == WM_T_82543) {
   6304 			int miistatus, active;
   6305 
   6306 			/*
   6307 			 * With 82543, we need to force speed and
   6308 			 * duplex on the MAC equal to what the PHY
   6309 			 * speed and duplex configuration is.
   6310 			 */
   6311 			miistatus = sc->sc_mii.mii_media_status;
   6312 
   6313 			if (miistatus & IFM_ACTIVE) {
   6314 				active = sc->sc_mii.mii_media_active;
   6315 				sc->sc_ctrl &= ~(CTRL_SPEED_MASK | CTRL_FD);
   6316 				switch (IFM_SUBTYPE(active)) {
   6317 				case IFM_10_T:
   6318 					sc->sc_ctrl |= CTRL_SPEED_10;
   6319 					break;
   6320 				case IFM_100_TX:
   6321 					sc->sc_ctrl |= CTRL_SPEED_100;
   6322 					break;
   6323 				case IFM_1000_T:
   6324 					sc->sc_ctrl |= CTRL_SPEED_1000;
   6325 					break;
   6326 				default:
   6327 					/*
   6328 					 * fiber?
   6329 					 * Shoud not enter here.
   6330 					 */
   6331 					printf("unknown media (%x)\n",
   6332 					    active);
   6333 					break;
   6334 				}
   6335 				if (active & IFM_FDX)
   6336 					sc->sc_ctrl |= CTRL_FD;
   6337 				CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
   6338 			}
   6339 		} else if ((sc->sc_type == WM_T_ICH8)
   6340 		    && (sc->sc_phytype == WMPHY_IGP_3)) {
   6341 			wm_kmrn_lock_loss_workaround_ich8lan(sc);
   6342 		} else if (sc->sc_type == WM_T_PCH) {
   6343 			wm_k1_gig_workaround_hv(sc,
   6344 			    ((sc->sc_mii.mii_media_status & IFM_ACTIVE) != 0));
   6345 		}
   6346 
   6347 		if ((sc->sc_phytype == WMPHY_82578)
   6348 		    && (IFM_SUBTYPE(sc->sc_mii.mii_media_active)
   6349 			== IFM_1000_T)) {
   6350 
   6351 			if ((sc->sc_mii.mii_media_status & IFM_ACTIVE) != 0) {
   6352 				delay(200*1000); /* XXX too big */
   6353 
   6354 				/* Link stall fix for link up */
   6355 				wm_gmii_hv_writereg(sc->sc_dev, 1,
   6356 				    HV_MUX_DATA_CTRL,
   6357 				    HV_MUX_DATA_CTRL_GEN_TO_MAC
   6358 				    | HV_MUX_DATA_CTRL_FORCE_SPEED);
   6359 				wm_gmii_hv_writereg(sc->sc_dev, 1,
   6360 				    HV_MUX_DATA_CTRL,
   6361 				    HV_MUX_DATA_CTRL_GEN_TO_MAC);
   6362 			}
   6363 		}
   6364 	} else if (icr & ICR_RXSEQ) {
   6365 		DPRINTF(WM_DEBUG_LINK,
   6366 		    ("%s: LINK Receive sequence error\n",
   6367 			device_xname(sc->sc_dev)));
   6368 	}
   6369 }
   6370 
   6371 /*
   6372  * wm_linkintr_tbi:
   6373  *
   6374  *	Helper; handle link interrupts for TBI mode.
   6375  */
   6376 static void
   6377 wm_linkintr_tbi(struct wm_softc *sc, uint32_t icr)
   6378 {
   6379 	uint32_t status;
   6380 
   6381 	DPRINTF(WM_DEBUG_LINK, ("%s: %s:\n", device_xname(sc->sc_dev),
   6382 		__func__));
   6383 
   6384 	status = CSR_READ(sc, WMREG_STATUS);
   6385 	if (icr & ICR_LSC) {
   6386 		if (status & STATUS_LU) {
   6387 			DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> up %s\n",
   6388 			    device_xname(sc->sc_dev),
   6389 			    (status & STATUS_FD) ? "FDX" : "HDX"));
   6390 			/*
   6391 			 * NOTE: CTRL will update TFCE and RFCE automatically,
   6392 			 * so we should update sc->sc_ctrl
   6393 			 */
   6394 
   6395 			sc->sc_ctrl = CSR_READ(sc, WMREG_CTRL);
   6396 			sc->sc_tctl &= ~TCTL_COLD(0x3ff);
   6397 			sc->sc_fcrtl &= ~FCRTL_XONE;
   6398 			if (status & STATUS_FD)
   6399 				sc->sc_tctl |=
   6400 				    TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
   6401 			else
   6402 				sc->sc_tctl |=
   6403 				    TCTL_COLD(TX_COLLISION_DISTANCE_HDX);
   6404 			if (sc->sc_ctrl & CTRL_TFCE)
   6405 				sc->sc_fcrtl |= FCRTL_XONE;
   6406 			CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
   6407 			CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ?
   6408 				      WMREG_OLD_FCRTL : WMREG_FCRTL,
   6409 				      sc->sc_fcrtl);
   6410 			sc->sc_tbi_linkup = 1;
   6411 		} else {
   6412 			DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> down\n",
   6413 			    device_xname(sc->sc_dev)));
   6414 			sc->sc_tbi_linkup = 0;
   6415 		}
   6416 		/* Update LED */
   6417 		wm_tbi_serdes_set_linkled(sc);
   6418 	} else if (icr & ICR_RXSEQ) {
   6419 		DPRINTF(WM_DEBUG_LINK,
   6420 		    ("%s: LINK: Receive sequence error\n",
   6421 		    device_xname(sc->sc_dev)));
   6422 	}
   6423 }
   6424 
   6425 /*
   6426  * wm_linkintr_serdes:
   6427  *
   6428  *	Helper; handle link interrupts for TBI mode.
   6429  */
   6430 static void
   6431 wm_linkintr_serdes(struct wm_softc *sc, uint32_t icr)
   6432 {
   6433 	struct mii_data *mii = &sc->sc_mii;
   6434 	struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
   6435 	uint32_t pcs_adv, pcs_lpab, reg;
   6436 
   6437 	DPRINTF(WM_DEBUG_LINK, ("%s: %s:\n", device_xname(sc->sc_dev),
   6438 		__func__));
   6439 
   6440 	if (icr & ICR_LSC) {
   6441 		/* Check PCS */
   6442 		reg = CSR_READ(sc, WMREG_PCS_LSTS);
   6443 		if ((reg & PCS_LSTS_LINKOK) != 0) {
   6444 			mii->mii_media_status |= IFM_ACTIVE;
   6445 			sc->sc_tbi_linkup = 1;
   6446 		} else {
   6447 			mii->mii_media_status |= IFM_NONE;
   6448 			sc->sc_tbi_linkup = 0;
   6449 			wm_tbi_serdes_set_linkled(sc);
   6450 			return;
   6451 		}
   6452 		mii->mii_media_active |= IFM_1000_SX;
   6453 		if ((reg & PCS_LSTS_FDX) != 0)
   6454 			mii->mii_media_active |= IFM_FDX;
   6455 		else
   6456 			mii->mii_media_active |= IFM_HDX;
   6457 		if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) {
   6458 			/* Check flow */
   6459 			reg = CSR_READ(sc, WMREG_PCS_LSTS);
   6460 			if ((reg & PCS_LSTS_AN_COMP) == 0) {
   6461 				DPRINTF(WM_DEBUG_LINK,
   6462 				    ("XXX LINKOK but not ACOMP\n"));
   6463 				return;
   6464 			}
   6465 			pcs_adv = CSR_READ(sc, WMREG_PCS_ANADV);
   6466 			pcs_lpab = CSR_READ(sc, WMREG_PCS_LPAB);
   6467 			DPRINTF(WM_DEBUG_LINK,
   6468 			    ("XXX AN result %08x, %08x\n", pcs_adv, pcs_lpab));
   6469 			if ((pcs_adv & TXCW_SYM_PAUSE)
   6470 			    && (pcs_lpab & TXCW_SYM_PAUSE)) {
   6471 				mii->mii_media_active |= IFM_FLOW
   6472 				    | IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE;
   6473 			} else if (((pcs_adv & TXCW_SYM_PAUSE) == 0)
   6474 			    && (pcs_adv & TXCW_ASYM_PAUSE)
   6475 			    && (pcs_lpab & TXCW_SYM_PAUSE)
   6476 			    && (pcs_lpab & TXCW_ASYM_PAUSE))
   6477 				mii->mii_media_active |= IFM_FLOW
   6478 				    | IFM_ETH_TXPAUSE;
   6479 			else if ((pcs_adv & TXCW_SYM_PAUSE)
   6480 			    && (pcs_adv & TXCW_ASYM_PAUSE)
   6481 			    && ((pcs_lpab & TXCW_SYM_PAUSE) == 0)
   6482 			    && (pcs_lpab & TXCW_ASYM_PAUSE))
   6483 				mii->mii_media_active |= IFM_FLOW
   6484 				    | IFM_ETH_RXPAUSE;
   6485 		}
   6486 		/* Update LED */
   6487 		wm_tbi_serdes_set_linkled(sc);
   6488 	} else {
   6489 		DPRINTF(WM_DEBUG_LINK,
   6490 		    ("%s: LINK: Receive sequence error\n",
   6491 		    device_xname(sc->sc_dev)));
   6492 	}
   6493 }
   6494 
   6495 /*
   6496  * wm_linkintr:
   6497  *
   6498  *	Helper; handle link interrupts.
   6499  */
   6500 static void
   6501 wm_linkintr(struct wm_softc *sc, uint32_t icr)
   6502 {
   6503 
   6504 	if (sc->sc_flags & WM_F_HAS_MII)
   6505 		wm_linkintr_gmii(sc, icr);
   6506 	else if ((sc->sc_mediatype == WM_MEDIATYPE_SERDES)
   6507 	    && (sc->sc_type >= WM_T_82575))
   6508 		wm_linkintr_serdes(sc, icr);
   6509 	else
   6510 		wm_linkintr_tbi(sc, icr);
   6511 }
   6512 
   6513 /*
   6514  * wm_intr_legacy:
   6515  *
   6516  *	Interrupt service routine for INTx and MSI.
   6517  */
   6518 static int
   6519 wm_intr_legacy(void *arg)
   6520 {
   6521 	struct wm_softc *sc = arg;
   6522 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
   6523 	uint32_t icr, rndval = 0;
   6524 	int handled = 0;
   6525 
   6526 	DPRINTF(WM_DEBUG_TX,
   6527 	    ("%s: INTx: got intr\n", device_xname(sc->sc_dev)));
   6528 	while (1 /* CONSTCOND */) {
   6529 		icr = CSR_READ(sc, WMREG_ICR);
   6530 		if ((icr & sc->sc_icr) == 0)
   6531 			break;
   6532 		if (rndval == 0)
   6533 			rndval = icr;
   6534 
   6535 		WM_RX_LOCK(sc);
   6536 
   6537 		if (sc->sc_stopping) {
   6538 			WM_RX_UNLOCK(sc);
   6539 			break;
   6540 		}
   6541 
   6542 		handled = 1;
   6543 
   6544 #if defined(WM_DEBUG) || defined(WM_EVENT_COUNTERS)
   6545 		if (icr & (ICR_RXDMT0|ICR_RXT0)) {
   6546 			DPRINTF(WM_DEBUG_RX,
   6547 			    ("%s: RX: got Rx intr 0x%08x\n",
   6548 			    device_xname(sc->sc_dev),
   6549 			    icr & (ICR_RXDMT0|ICR_RXT0)));
   6550 			WM_EVCNT_INCR(&sc->sc_ev_rxintr);
   6551 		}
   6552 #endif
   6553 		wm_rxeof(sc);
   6554 
   6555 		WM_RX_UNLOCK(sc);
   6556 		WM_TX_LOCK(sc);
   6557 
   6558 #if defined(WM_DEBUG) || defined(WM_EVENT_COUNTERS)
   6559 		if (icr & ICR_TXDW) {
   6560 			DPRINTF(WM_DEBUG_TX,
   6561 			    ("%s: TX: got TXDW interrupt\n",
   6562 			    device_xname(sc->sc_dev)));
   6563 			WM_EVCNT_INCR(&sc->sc_ev_txdw);
   6564 		}
   6565 #endif
   6566 		wm_txeof(sc);
   6567 
   6568 		if (icr & (ICR_LSC|ICR_RXSEQ)) {
   6569 			WM_EVCNT_INCR(&sc->sc_ev_linkintr);
   6570 			wm_linkintr(sc, icr);
   6571 		}
   6572 
   6573 		WM_TX_UNLOCK(sc);
   6574 
   6575 		if (icr & ICR_RXO) {
   6576 #if defined(WM_DEBUG)
   6577 			log(LOG_WARNING, "%s: Receive overrun\n",
   6578 			    device_xname(sc->sc_dev));
   6579 #endif /* defined(WM_DEBUG) */
   6580 		}
   6581 	}
   6582 
   6583 	rnd_add_uint32(&sc->rnd_source, rndval);
   6584 
   6585 	if (handled) {
   6586 		/* Try to get more packets going. */
   6587 		ifp->if_start(ifp);
   6588 	}
   6589 
   6590 	return handled;
   6591 }
   6592 
   6593 #ifdef WM_MSI_MSIX
   6594 /*
   6595  * wm_txintr_msix:
   6596  *
   6597  *	Interrupt service routine for TX complete interrupt for MSI-X.
   6598  */
   6599 static int
   6600 wm_txintr_msix(void *arg)
   6601 {
   6602 	struct wm_softc *sc = arg;
   6603 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
   6604 	int handled = 0;
   6605 
   6606 	DPRINTF(WM_DEBUG_TX,
   6607 	    ("%s: TX: got Tx intr\n", device_xname(sc->sc_dev)));
   6608 
   6609 	if (sc->sc_type == WM_T_82574)
   6610 		CSR_WRITE(sc, WMREG_IMC, ICR_TXQ0); /* 82574 only */
   6611 	else if (sc->sc_type == WM_T_82575)
   6612 		CSR_WRITE(sc, WMREG_EIMC, EITR_TX_QUEUE0);
   6613 	else
   6614 		CSR_WRITE(sc, WMREG_EIMC, 1 << WM_MSIX_TXINTR_IDX);
   6615 
   6616 	WM_TX_LOCK(sc);
   6617 
   6618 	if (sc->sc_stopping)
   6619 		goto out;
   6620 
   6621 	WM_EVCNT_INCR(&sc->sc_ev_txdw);
   6622 	handled = wm_txeof(sc);
   6623 
   6624 out:
   6625 	WM_TX_UNLOCK(sc);
   6626 
   6627 	if (sc->sc_type == WM_T_82574)
   6628 		CSR_WRITE(sc, WMREG_IMS, ICR_TXQ0); /* 82574 only */
   6629 	else if (sc->sc_type == WM_T_82575)
   6630 		CSR_WRITE(sc, WMREG_EIMS, EITR_TX_QUEUE0);
   6631 	else
   6632 		CSR_WRITE(sc, WMREG_EIMS, 1 << WM_MSIX_TXINTR_IDX);
   6633 
   6634 	if (handled) {
   6635 		/* Try to get more packets going. */
   6636 		ifp->if_start(ifp);
   6637 	}
   6638 
   6639 	return handled;
   6640 }
   6641 
   6642 /*
   6643  * wm_rxintr_msix:
   6644  *
   6645  *	Interrupt service routine for RX interrupt for MSI-X.
   6646  */
   6647 static int
   6648 wm_rxintr_msix(void *arg)
   6649 {
   6650 	struct wm_softc *sc = arg;
   6651 
   6652 	DPRINTF(WM_DEBUG_TX,
   6653 	    ("%s: RX: got Rx intr\n", device_xname(sc->sc_dev)));
   6654 
   6655 	if (sc->sc_type == WM_T_82574)
   6656 		CSR_WRITE(sc, WMREG_IMC, ICR_RXQ0); /* 82574 only */
   6657 	else if (sc->sc_type == WM_T_82575)
   6658 		CSR_WRITE(sc, WMREG_EIMC, EITR_RX_QUEUE0);
   6659 	else
   6660 		CSR_WRITE(sc, WMREG_EIMC, 1 << WM_MSIX_RXINTR_IDX);
   6661 
   6662 	WM_RX_LOCK(sc);
   6663 
   6664 	if (sc->sc_stopping)
   6665 		goto out;
   6666 
   6667 	WM_EVCNT_INCR(&sc->sc_ev_rxintr);
   6668 	wm_rxeof(sc);
   6669 
   6670 out:
   6671 	WM_RX_UNLOCK(sc);
   6672 
   6673 	if (sc->sc_type == WM_T_82574)
   6674 		CSR_WRITE(sc, WMREG_IMS, ICR_RXQ0);
   6675 	else if (sc->sc_type == WM_T_82575)
   6676 		CSR_WRITE(sc, WMREG_EIMS, EITR_RX_QUEUE0);
   6677 	else
   6678 		CSR_WRITE(sc, WMREG_EIMS, 1 << WM_MSIX_RXINTR_IDX);
   6679 
   6680 	return 1;
   6681 }
   6682 
   6683 /*
   6684  * wm_linkintr_msix:
   6685  *
   6686  *	Interrupt service routine for link status change for MSI-X.
   6687  */
   6688 static int
   6689 wm_linkintr_msix(void *arg)
   6690 {
   6691 	struct wm_softc *sc = arg;
   6692 
   6693 	DPRINTF(WM_DEBUG_TX,
   6694 	    ("%s: LINK: got link intr\n", device_xname(sc->sc_dev)));
   6695 
   6696 	if (sc->sc_type == WM_T_82574)
   6697 		CSR_WRITE(sc, WMREG_IMC, ICR_OTHER); /* 82574 only */
   6698 	else if (sc->sc_type == WM_T_82575)
   6699 		CSR_WRITE(sc, WMREG_EIMC, EITR_OTHER);
   6700 	else
   6701 		CSR_WRITE(sc, WMREG_EIMC, 1 << WM_MSIX_LINKINTR_IDX);
   6702 	WM_TX_LOCK(sc);
   6703 	if (sc->sc_stopping)
   6704 		goto out;
   6705 
   6706 	WM_EVCNT_INCR(&sc->sc_ev_linkintr);
   6707 	wm_linkintr(sc, ICR_LSC);
   6708 
   6709 out:
   6710 	WM_TX_UNLOCK(sc);
   6711 
   6712 	if (sc->sc_type == WM_T_82574)
   6713 		CSR_WRITE(sc, WMREG_IMS, ICR_OTHER | ICR_LSC); /* 82574 only */
   6714 	else if (sc->sc_type == WM_T_82575)
   6715 		CSR_WRITE(sc, WMREG_EIMS, EITR_OTHER);
   6716 	else
   6717 		CSR_WRITE(sc, WMREG_EIMS, 1 << WM_MSIX_LINKINTR_IDX);
   6718 
   6719 	return 1;
   6720 }
   6721 #endif /* WM_MSI_MSIX */
   6722 
   6723 /*
   6724  * Media related.
   6725  * GMII, SGMII, TBI (and SERDES)
   6726  */
   6727 
   6728 /* Common */
   6729 
   6730 /*
   6731  * wm_tbi_serdes_set_linkled:
   6732  *
   6733  *	Update the link LED on TBI and SERDES devices.
   6734  */
   6735 static void
   6736 wm_tbi_serdes_set_linkled(struct wm_softc *sc)
   6737 {
   6738 
   6739 	if (sc->sc_tbi_linkup)
   6740 		sc->sc_ctrl |= CTRL_SWDPIN(0);
   6741 	else
   6742 		sc->sc_ctrl &= ~CTRL_SWDPIN(0);
   6743 
   6744 	/* 82540 or newer devices are active low */
   6745 	sc->sc_ctrl ^= (sc->sc_type >= WM_T_82540) ? CTRL_SWDPIN(0) : 0;
   6746 
   6747 	CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
   6748 }
   6749 
   6750 /* GMII related */
   6751 
   6752 /*
   6753  * wm_gmii_reset:
   6754  *
   6755  *	Reset the PHY.
   6756  */
   6757 static void
   6758 wm_gmii_reset(struct wm_softc *sc)
   6759 {
   6760 	uint32_t reg;
   6761 	int rv;
   6762 
   6763 	/* get phy semaphore */
   6764 	switch (sc->sc_type) {
   6765 	case WM_T_82571:
   6766 	case WM_T_82572:
   6767 	case WM_T_82573:
   6768 	case WM_T_82574:
   6769 	case WM_T_82583:
   6770 		 /* XXX should get sw semaphore, too */
   6771 		rv = wm_get_swsm_semaphore(sc);
   6772 		break;
   6773 	case WM_T_82575:
   6774 	case WM_T_82576:
   6775 	case WM_T_82580:
   6776 	case WM_T_I350:
   6777 	case WM_T_I354:
   6778 	case WM_T_I210:
   6779 	case WM_T_I211:
   6780 	case WM_T_80003:
   6781 		rv = wm_get_swfw_semaphore(sc, swfwphysem[sc->sc_funcid]);
   6782 		break;
   6783 	case WM_T_ICH8:
   6784 	case WM_T_ICH9:
   6785 	case WM_T_ICH10:
   6786 	case WM_T_PCH:
   6787 	case WM_T_PCH2:
   6788 	case WM_T_PCH_LPT:
   6789 		rv = wm_get_swfwhw_semaphore(sc);
   6790 		break;
   6791 	default:
   6792 		/* nothing to do*/
   6793 		rv = 0;
   6794 		break;
   6795 	}
   6796 	if (rv != 0) {
   6797 		aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
   6798 		    __func__);
   6799 		return;
   6800 	}
   6801 
   6802 	switch (sc->sc_type) {
   6803 	case WM_T_82542_2_0:
   6804 	case WM_T_82542_2_1:
   6805 		/* null */
   6806 		break;
   6807 	case WM_T_82543:
   6808 		/*
   6809 		 * With 82543, we need to force speed and duplex on the MAC
   6810 		 * equal to what the PHY speed and duplex configuration is.
   6811 		 * In addition, we need to perform a hardware reset on the PHY
   6812 		 * to take it out of reset.
   6813 		 */
   6814 		sc->sc_ctrl |= CTRL_FRCSPD | CTRL_FRCFDX;
   6815 		CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
   6816 
   6817 		/* The PHY reset pin is active-low. */
   6818 		reg = CSR_READ(sc, WMREG_CTRL_EXT);
   6819 		reg &= ~((CTRL_EXT_SWDPIO_MASK << CTRL_EXT_SWDPIO_SHIFT) |
   6820 		    CTRL_EXT_SWDPIN(4));
   6821 		reg |= CTRL_EXT_SWDPIO(4);
   6822 
   6823 		CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
   6824 		CSR_WRITE_FLUSH(sc);
   6825 		delay(10*1000);
   6826 
   6827 		CSR_WRITE(sc, WMREG_CTRL_EXT, reg | CTRL_EXT_SWDPIN(4));
   6828 		CSR_WRITE_FLUSH(sc);
   6829 		delay(150);
   6830 #if 0
   6831 		sc->sc_ctrl_ext = reg | CTRL_EXT_SWDPIN(4);
   6832 #endif
   6833 		delay(20*1000);	/* XXX extra delay to get PHY ID? */
   6834 		break;
   6835 	case WM_T_82544:	/* reset 10000us */
   6836 	case WM_T_82540:
   6837 	case WM_T_82545:
   6838 	case WM_T_82545_3:
   6839 	case WM_T_82546:
   6840 	case WM_T_82546_3:
   6841 	case WM_T_82541:
   6842 	case WM_T_82541_2:
   6843 	case WM_T_82547:
   6844 	case WM_T_82547_2:
   6845 	case WM_T_82571:	/* reset 100us */
   6846 	case WM_T_82572:
   6847 	case WM_T_82573:
   6848 	case WM_T_82574:
   6849 	case WM_T_82575:
   6850 	case WM_T_82576:
   6851 	case WM_T_82580:
   6852 	case WM_T_I350:
   6853 	case WM_T_I354:
   6854 	case WM_T_I210:
   6855 	case WM_T_I211:
   6856 	case WM_T_82583:
   6857 	case WM_T_80003:
   6858 		/* generic reset */
   6859 		CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET);
   6860 		CSR_WRITE_FLUSH(sc);
   6861 		delay(20000);
   6862 		CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
   6863 		CSR_WRITE_FLUSH(sc);
   6864 		delay(20000);
   6865 
   6866 		if ((sc->sc_type == WM_T_82541)
   6867 		    || (sc->sc_type == WM_T_82541_2)
   6868 		    || (sc->sc_type == WM_T_82547)
   6869 		    || (sc->sc_type == WM_T_82547_2)) {
   6870 			/* workaround for igp are done in igp_reset() */
   6871 			/* XXX add code to set LED after phy reset */
   6872 		}
   6873 		break;
   6874 	case WM_T_ICH8:
   6875 	case WM_T_ICH9:
   6876 	case WM_T_ICH10:
   6877 	case WM_T_PCH:
   6878 	case WM_T_PCH2:
   6879 	case WM_T_PCH_LPT:
   6880 		/* generic reset */
   6881 		CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET);
   6882 		CSR_WRITE_FLUSH(sc);
   6883 		delay(100);
   6884 		CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
   6885 		CSR_WRITE_FLUSH(sc);
   6886 		delay(150);
   6887 		break;
   6888 	default:
   6889 		panic("%s: %s: unknown type\n", device_xname(sc->sc_dev),
   6890 		    __func__);
   6891 		break;
   6892 	}
   6893 
   6894 	/* release PHY semaphore */
   6895 	switch (sc->sc_type) {
   6896 	case WM_T_82571:
   6897 	case WM_T_82572:
   6898 	case WM_T_82573:
   6899 	case WM_T_82574:
   6900 	case WM_T_82583:
   6901 		 /* XXX should put sw semaphore, too */
   6902 		wm_put_swsm_semaphore(sc);
   6903 		break;
   6904 	case WM_T_82575:
   6905 	case WM_T_82576:
   6906 	case WM_T_82580:
   6907 	case WM_T_I350:
   6908 	case WM_T_I354:
   6909 	case WM_T_I210:
   6910 	case WM_T_I211:
   6911 	case WM_T_80003:
   6912 		wm_put_swfw_semaphore(sc, swfwphysem[sc->sc_funcid]);
   6913 		break;
   6914 	case WM_T_ICH8:
   6915 	case WM_T_ICH9:
   6916 	case WM_T_ICH10:
   6917 	case WM_T_PCH:
   6918 	case WM_T_PCH2:
   6919 	case WM_T_PCH_LPT:
   6920 		wm_put_swfwhw_semaphore(sc);
   6921 		break;
   6922 	default:
   6923 		/* nothing to do*/
   6924 		rv = 0;
   6925 		break;
   6926 	}
   6927 
   6928 	/* get_cfg_done */
   6929 	wm_get_cfg_done(sc);
   6930 
   6931 	/* extra setup */
   6932 	switch (sc->sc_type) {
   6933 	case WM_T_82542_2_0:
   6934 	case WM_T_82542_2_1:
   6935 	case WM_T_82543:
   6936 	case WM_T_82544:
   6937 	case WM_T_82540:
   6938 	case WM_T_82545:
   6939 	case WM_T_82545_3:
   6940 	case WM_T_82546:
   6941 	case WM_T_82546_3:
   6942 	case WM_T_82541_2:
   6943 	case WM_T_82547_2:
   6944 	case WM_T_82571:
   6945 	case WM_T_82572:
   6946 	case WM_T_82573:
   6947 	case WM_T_82574:
   6948 	case WM_T_82575:
   6949 	case WM_T_82576:
   6950 	case WM_T_82580:
   6951 	case WM_T_I350:
   6952 	case WM_T_I354:
   6953 	case WM_T_I210:
   6954 	case WM_T_I211:
   6955 	case WM_T_82583:
   6956 	case WM_T_80003:
   6957 		/* null */
   6958 		break;
   6959 	case WM_T_82541:
   6960 	case WM_T_82547:
   6961 		/* XXX Configure actively LED after PHY reset */
   6962 		break;
   6963 	case WM_T_ICH8:
   6964 	case WM_T_ICH9:
   6965 	case WM_T_ICH10:
   6966 	case WM_T_PCH:
   6967 	case WM_T_PCH2:
   6968 	case WM_T_PCH_LPT:
   6969 		/* Allow time for h/w to get to a quiescent state afer reset */
   6970 		delay(10*1000);
   6971 
   6972 		if (sc->sc_type == WM_T_PCH)
   6973 			wm_hv_phy_workaround_ich8lan(sc);
   6974 
   6975 		if (sc->sc_type == WM_T_PCH2)
   6976 			wm_lv_phy_workaround_ich8lan(sc);
   6977 
   6978 		if ((sc->sc_type == WM_T_PCH) || (sc->sc_type == WM_T_PCH2)) {
   6979 			/*
   6980 			 * dummy read to clear the phy wakeup bit after lcd
   6981 			 * reset
   6982 			 */
   6983 			reg = wm_gmii_hv_readreg(sc->sc_dev, 1, BM_WUC);
   6984 		}
   6985 
   6986 		/*
   6987 		 * XXX Configure the LCD with th extended configuration region
   6988 		 * in NVM
   6989 		 */
   6990 
   6991 		/* Configure the LCD with the OEM bits in NVM */
   6992 		if ((sc->sc_type == WM_T_PCH) || (sc->sc_type == WM_T_PCH2)
   6993 		    || (sc->sc_type == WM_T_PCH_LPT)) {
   6994 			/*
   6995 			 * Disable LPLU.
   6996 			 * XXX It seems that 82567 has LPLU, too.
   6997 			 */
   6998 			reg = wm_gmii_hv_readreg(sc->sc_dev, 1, HV_OEM_BITS);
   6999 			reg &= ~(HV_OEM_BITS_A1KDIS| HV_OEM_BITS_LPLU);
   7000 			reg |= HV_OEM_BITS_ANEGNOW;
   7001 			wm_gmii_hv_writereg(sc->sc_dev, 1, HV_OEM_BITS, reg);
   7002 		}
   7003 		break;
   7004 	default:
   7005 		panic("%s: unknown type\n", __func__);
   7006 		break;
   7007 	}
   7008 }
   7009 
   7010 /*
   7011  * wm_get_phy_id_82575:
   7012  *
   7013  * Return PHY ID. Return -1 if it failed.
   7014  */
   7015 static int
   7016 wm_get_phy_id_82575(struct wm_softc *sc)
   7017 {
   7018 	uint32_t reg;
   7019 	int phyid = -1;
   7020 
   7021 	/* XXX */
   7022 	if ((sc->sc_flags & WM_F_SGMII) == 0)
   7023 		return -1;
   7024 
   7025 	if (wm_sgmii_uses_mdio(sc)) {
   7026 		switch (sc->sc_type) {
   7027 		case WM_T_82575:
   7028 		case WM_T_82576:
   7029 			reg = CSR_READ(sc, WMREG_MDIC);
   7030 			phyid = (reg & MDIC_PHY_MASK) >> MDIC_PHY_SHIFT;
   7031 			break;
   7032 		case WM_T_82580:
   7033 		case WM_T_I350:
   7034 		case WM_T_I354:
   7035 		case WM_T_I210:
   7036 		case WM_T_I211:
   7037 			reg = CSR_READ(sc, WMREG_MDICNFG);
   7038 			phyid = (reg & MDICNFG_PHY_MASK) >> MDICNFG_PHY_SHIFT;
   7039 			break;
   7040 		default:
   7041 			return -1;
   7042 		}
   7043 	}
   7044 
   7045 	return phyid;
   7046 }
   7047 
   7048 
   7049 /*
   7050  * wm_gmii_mediainit:
   7051  *
   7052  *	Initialize media for use on 1000BASE-T devices.
   7053  */
   7054 static void
   7055 wm_gmii_mediainit(struct wm_softc *sc, pci_product_id_t prodid)
   7056 {
   7057 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
   7058 	struct mii_data *mii = &sc->sc_mii;
   7059 	uint32_t reg;
   7060 
   7061 	/* We have GMII. */
   7062 	sc->sc_flags |= WM_F_HAS_MII;
   7063 
   7064 	if (sc->sc_type == WM_T_80003)
   7065 		sc->sc_tipg =  TIPG_1000T_80003_DFLT;
   7066 	else
   7067 		sc->sc_tipg = TIPG_1000T_DFLT;
   7068 
   7069 	/* XXX Not for I354? FreeBSD's e1000_82575.c doesn't include it */
   7070 	if ((sc->sc_type == WM_T_82580)
   7071 	    || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I210)
   7072 	    || (sc->sc_type == WM_T_I211)) {
   7073 		reg = CSR_READ(sc, WMREG_PHPM);
   7074 		reg &= ~PHPM_GO_LINK_D;
   7075 		CSR_WRITE(sc, WMREG_PHPM, reg);
   7076 	}
   7077 
   7078 	/*
   7079 	 * Let the chip set speed/duplex on its own based on
   7080 	 * signals from the PHY.
   7081 	 * XXXbouyer - I'm not sure this is right for the 80003,
   7082 	 * the em driver only sets CTRL_SLU here - but it seems to work.
   7083 	 */
   7084 	sc->sc_ctrl |= CTRL_SLU;
   7085 	CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
   7086 
   7087 	/* Initialize our media structures and probe the GMII. */
   7088 	mii->mii_ifp = ifp;
   7089 
   7090 	/*
   7091 	 * Determine the PHY access method.
   7092 	 *
   7093 	 *  For SGMII, use SGMII specific method.
   7094 	 *
   7095 	 *  For some devices, we can determine the PHY access method
   7096 	 * from sc_type.
   7097 	 *
   7098 	 *  For ICH and PCH variants, it's difficult to determine the PHY
   7099 	 * access  method by sc_type, so use the PCI product ID for some
   7100 	 * devices.
   7101 	 * For other ICH8 variants, try to use igp's method. If the PHY
   7102 	 * can't detect, then use bm's method.
   7103 	 */
   7104 	switch (prodid) {
   7105 	case PCI_PRODUCT_INTEL_PCH_M_LM:
   7106 	case PCI_PRODUCT_INTEL_PCH_M_LC:
   7107 		/* 82577 */
   7108 		sc->sc_phytype = WMPHY_82577;
   7109 		break;
   7110 	case PCI_PRODUCT_INTEL_PCH_D_DM:
   7111 	case PCI_PRODUCT_INTEL_PCH_D_DC:
   7112 		/* 82578 */
   7113 		sc->sc_phytype = WMPHY_82578;
   7114 		break;
   7115 	case PCI_PRODUCT_INTEL_PCH2_LV_LM:
   7116 	case PCI_PRODUCT_INTEL_PCH2_LV_V:
   7117 		/* 82579 */
   7118 		sc->sc_phytype = WMPHY_82579;
   7119 		break;
   7120 	case PCI_PRODUCT_INTEL_82801I_BM:
   7121 	case PCI_PRODUCT_INTEL_82801J_R_BM_LM:
   7122 	case PCI_PRODUCT_INTEL_82801J_R_BM_LF:
   7123 	case PCI_PRODUCT_INTEL_82801J_D_BM_LM:
   7124 	case PCI_PRODUCT_INTEL_82801J_D_BM_LF:
   7125 	case PCI_PRODUCT_INTEL_82801J_R_BM_V:
   7126 		/* 82567 */
   7127 		sc->sc_phytype = WMPHY_BM;
   7128 		mii->mii_readreg = wm_gmii_bm_readreg;
   7129 		mii->mii_writereg = wm_gmii_bm_writereg;
   7130 		break;
   7131 	default:
   7132 		if (((sc->sc_flags & WM_F_SGMII) != 0)
   7133 		    && !wm_sgmii_uses_mdio(sc)){
   7134 			/* SGMII */
   7135 			mii->mii_readreg = wm_sgmii_readreg;
   7136 			mii->mii_writereg = wm_sgmii_writereg;
   7137 		} else if (sc->sc_type >= WM_T_80003) {
   7138 			/* 80003 */
   7139 			mii->mii_readreg = wm_gmii_i80003_readreg;
   7140 			mii->mii_writereg = wm_gmii_i80003_writereg;
   7141 		} else if (sc->sc_type >= WM_T_I210) {
   7142 			/* I210 and I211 */
   7143 			mii->mii_readreg = wm_gmii_gs40g_readreg;
   7144 			mii->mii_writereg = wm_gmii_gs40g_writereg;
   7145 		} else if (sc->sc_type >= WM_T_82580) {
   7146 			/* 82580, I350 and I354 */
   7147 			sc->sc_phytype = WMPHY_82580;
   7148 			mii->mii_readreg = wm_gmii_82580_readreg;
   7149 			mii->mii_writereg = wm_gmii_82580_writereg;
   7150 		} else if (sc->sc_type >= WM_T_82544) {
   7151 			/* 82544, 0, [56], [17], 8257[1234] and 82583 */
   7152 			mii->mii_readreg = wm_gmii_i82544_readreg;
   7153 			mii->mii_writereg = wm_gmii_i82544_writereg;
   7154 		} else {
   7155 			mii->mii_readreg = wm_gmii_i82543_readreg;
   7156 			mii->mii_writereg = wm_gmii_i82543_writereg;
   7157 		}
   7158 		break;
   7159 	}
   7160 	if ((sc->sc_type >= WM_T_PCH) && (sc->sc_type <= WM_T_PCH_LPT)) {
   7161 		/* All PCH* use _hv_ */
   7162 		mii->mii_readreg = wm_gmii_hv_readreg;
   7163 		mii->mii_writereg = wm_gmii_hv_writereg;
   7164 	}
   7165 	mii->mii_statchg = wm_gmii_statchg;
   7166 
   7167 	wm_gmii_reset(sc);
   7168 
   7169 	sc->sc_ethercom.ec_mii = &sc->sc_mii;
   7170 	ifmedia_init(&mii->mii_media, IFM_IMASK, wm_gmii_mediachange,
   7171 	    wm_gmii_mediastatus);
   7172 
   7173 	if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
   7174 	    || (sc->sc_type == WM_T_82580)
   7175 	    || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)
   7176 	    || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211)) {
   7177 		if ((sc->sc_flags & WM_F_SGMII) == 0) {
   7178 			/* Attach only one port */
   7179 			mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, 1,
   7180 			    MII_OFFSET_ANY, MIIF_DOPAUSE);
   7181 		} else {
   7182 			int i, id;
   7183 			uint32_t ctrl_ext;
   7184 
   7185 			id = wm_get_phy_id_82575(sc);
   7186 			if (id != -1) {
   7187 				mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff,
   7188 				    id, MII_OFFSET_ANY, MIIF_DOPAUSE);
   7189 			}
   7190 			if ((id == -1)
   7191 			    || (LIST_FIRST(&mii->mii_phys) == NULL)) {
   7192 				/* Power on sgmii phy if it is disabled */
   7193 				ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT);
   7194 				CSR_WRITE(sc, WMREG_CTRL_EXT,
   7195 				    ctrl_ext &~ CTRL_EXT_SWDPIN(3));
   7196 				CSR_WRITE_FLUSH(sc);
   7197 				delay(300*1000); /* XXX too long */
   7198 
   7199 				/* from 1 to 8 */
   7200 				for (i = 1; i < 8; i++)
   7201 					mii_attach(sc->sc_dev, &sc->sc_mii,
   7202 					    0xffffffff, i, MII_OFFSET_ANY,
   7203 					    MIIF_DOPAUSE);
   7204 
   7205 				/* restore previous sfp cage power state */
   7206 				CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext);
   7207 			}
   7208 		}
   7209 	} else {
   7210 		mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
   7211 		    MII_OFFSET_ANY, MIIF_DOPAUSE);
   7212 	}
   7213 
   7214 	/*
   7215 	 * If the MAC is PCH2 or PCH_LPT and failed to detect MII PHY, call
   7216 	 * wm_set_mdio_slow_mode_hv() for a workaround and retry.
   7217 	 */
   7218 	if (((sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)) &&
   7219 	    (LIST_FIRST(&mii->mii_phys) == NULL)) {
   7220 		wm_set_mdio_slow_mode_hv(sc);
   7221 		mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
   7222 		    MII_OFFSET_ANY, MIIF_DOPAUSE);
   7223 	}
   7224 
   7225 	/*
   7226 	 * (For ICH8 variants)
   7227 	 * If PHY detection failed, use BM's r/w function and retry.
   7228 	 */
   7229 	if (LIST_FIRST(&mii->mii_phys) == NULL) {
   7230 		/* if failed, retry with *_bm_* */
   7231 		mii->mii_readreg = wm_gmii_bm_readreg;
   7232 		mii->mii_writereg = wm_gmii_bm_writereg;
   7233 
   7234 		mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
   7235 		    MII_OFFSET_ANY, MIIF_DOPAUSE);
   7236 	}
   7237 
   7238 	if (LIST_FIRST(&mii->mii_phys) == NULL) {
   7239 		/* Any PHY wasn't find */
   7240 		ifmedia_add(&mii->mii_media, IFM_ETHER|IFM_NONE, 0, NULL);
   7241 		ifmedia_set(&mii->mii_media, IFM_ETHER|IFM_NONE);
   7242 		sc->sc_phytype = WMPHY_NONE;
   7243 	} else {
   7244 		/*
   7245 		 * PHY Found!
   7246 		 * Check PHY type.
   7247 		 */
   7248 		uint32_t model;
   7249 		struct mii_softc *child;
   7250 
   7251 		child = LIST_FIRST(&mii->mii_phys);
   7252 		if (device_is_a(child->mii_dev, "igphy")) {
   7253 			struct igphy_softc *isc = (struct igphy_softc *)child;
   7254 
   7255 			model = isc->sc_mii.mii_mpd_model;
   7256 			if (model == MII_MODEL_yyINTEL_I82566)
   7257 				sc->sc_phytype = WMPHY_IGP_3;
   7258 		}
   7259 
   7260 		ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO);
   7261 	}
   7262 }
   7263 
   7264 /*
   7265  * wm_gmii_mediachange:	[ifmedia interface function]
   7266  *
   7267  *	Set hardware to newly-selected media on a 1000BASE-T device.
   7268  */
   7269 static int
   7270 wm_gmii_mediachange(struct ifnet *ifp)
   7271 {
   7272 	struct wm_softc *sc = ifp->if_softc;
   7273 	struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
   7274 	int rc;
   7275 
   7276 	if ((ifp->if_flags & IFF_UP) == 0)
   7277 		return 0;
   7278 
   7279 	sc->sc_ctrl &= ~(CTRL_SPEED_MASK | CTRL_FD);
   7280 	sc->sc_ctrl |= CTRL_SLU;
   7281 	if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)
   7282 	    || (sc->sc_type > WM_T_82543)) {
   7283 		sc->sc_ctrl &= ~(CTRL_FRCSPD | CTRL_FRCFDX);
   7284 	} else {
   7285 		sc->sc_ctrl &= ~CTRL_ASDE;
   7286 		sc->sc_ctrl |= CTRL_FRCSPD | CTRL_FRCFDX;
   7287 		if (ife->ifm_media & IFM_FDX)
   7288 			sc->sc_ctrl |= CTRL_FD;
   7289 		switch (IFM_SUBTYPE(ife->ifm_media)) {
   7290 		case IFM_10_T:
   7291 			sc->sc_ctrl |= CTRL_SPEED_10;
   7292 			break;
   7293 		case IFM_100_TX:
   7294 			sc->sc_ctrl |= CTRL_SPEED_100;
   7295 			break;
   7296 		case IFM_1000_T:
   7297 			sc->sc_ctrl |= CTRL_SPEED_1000;
   7298 			break;
   7299 		default:
   7300 			panic("wm_gmii_mediachange: bad media 0x%x",
   7301 			    ife->ifm_media);
   7302 		}
   7303 	}
   7304 	CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
   7305 	if (sc->sc_type <= WM_T_82543)
   7306 		wm_gmii_reset(sc);
   7307 
   7308 	if ((rc = mii_mediachg(&sc->sc_mii)) == ENXIO)
   7309 		return 0;
   7310 	return rc;
   7311 }
   7312 
   7313 /*
   7314  * wm_gmii_mediastatus:	[ifmedia interface function]
   7315  *
   7316  *	Get the current interface media status on a 1000BASE-T device.
   7317  */
   7318 static void
   7319 wm_gmii_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
   7320 {
   7321 	struct wm_softc *sc = ifp->if_softc;
   7322 
   7323 	ether_mediastatus(ifp, ifmr);
   7324 	ifmr->ifm_active = (ifmr->ifm_active & ~IFM_ETH_FMASK)
   7325 	    | sc->sc_flowflags;
   7326 }
   7327 
   7328 #define	MDI_IO		CTRL_SWDPIN(2)
   7329 #define	MDI_DIR		CTRL_SWDPIO(2)	/* host -> PHY */
   7330 #define	MDI_CLK		CTRL_SWDPIN(3)
   7331 
   7332 static void
   7333 wm_i82543_mii_sendbits(struct wm_softc *sc, uint32_t data, int nbits)
   7334 {
   7335 	uint32_t i, v;
   7336 
   7337 	v = CSR_READ(sc, WMREG_CTRL);
   7338 	v &= ~(MDI_IO|MDI_CLK|(CTRL_SWDPIO_MASK << CTRL_SWDPIO_SHIFT));
   7339 	v |= MDI_DIR | CTRL_SWDPIO(3);
   7340 
   7341 	for (i = 1 << (nbits - 1); i != 0; i >>= 1) {
   7342 		if (data & i)
   7343 			v |= MDI_IO;
   7344 		else
   7345 			v &= ~MDI_IO;
   7346 		CSR_WRITE(sc, WMREG_CTRL, v);
   7347 		CSR_WRITE_FLUSH(sc);
   7348 		delay(10);
   7349 		CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
   7350 		CSR_WRITE_FLUSH(sc);
   7351 		delay(10);
   7352 		CSR_WRITE(sc, WMREG_CTRL, v);
   7353 		CSR_WRITE_FLUSH(sc);
   7354 		delay(10);
   7355 	}
   7356 }
   7357 
   7358 static uint32_t
   7359 wm_i82543_mii_recvbits(struct wm_softc *sc)
   7360 {
   7361 	uint32_t v, i, data = 0;
   7362 
   7363 	v = CSR_READ(sc, WMREG_CTRL);
   7364 	v &= ~(MDI_IO|MDI_CLK|(CTRL_SWDPIO_MASK << CTRL_SWDPIO_SHIFT));
   7365 	v |= CTRL_SWDPIO(3);
   7366 
   7367 	CSR_WRITE(sc, WMREG_CTRL, v);
   7368 	CSR_WRITE_FLUSH(sc);
   7369 	delay(10);
   7370 	CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
   7371 	CSR_WRITE_FLUSH(sc);
   7372 	delay(10);
   7373 	CSR_WRITE(sc, WMREG_CTRL, v);
   7374 	CSR_WRITE_FLUSH(sc);
   7375 	delay(10);
   7376 
   7377 	for (i = 0; i < 16; i++) {
   7378 		data <<= 1;
   7379 		CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
   7380 		CSR_WRITE_FLUSH(sc);
   7381 		delay(10);
   7382 		if (CSR_READ(sc, WMREG_CTRL) & MDI_IO)
   7383 			data |= 1;
   7384 		CSR_WRITE(sc, WMREG_CTRL, v);
   7385 		CSR_WRITE_FLUSH(sc);
   7386 		delay(10);
   7387 	}
   7388 
   7389 	CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
   7390 	CSR_WRITE_FLUSH(sc);
   7391 	delay(10);
   7392 	CSR_WRITE(sc, WMREG_CTRL, v);
   7393 	CSR_WRITE_FLUSH(sc);
   7394 	delay(10);
   7395 
   7396 	return data;
   7397 }
   7398 
   7399 #undef MDI_IO
   7400 #undef MDI_DIR
   7401 #undef MDI_CLK
   7402 
   7403 /*
   7404  * wm_gmii_i82543_readreg:	[mii interface function]
   7405  *
   7406  *	Read a PHY register on the GMII (i82543 version).
   7407  */
   7408 static int
   7409 wm_gmii_i82543_readreg(device_t self, int phy, int reg)
   7410 {
   7411 	struct wm_softc *sc = device_private(self);
   7412 	int rv;
   7413 
   7414 	wm_i82543_mii_sendbits(sc, 0xffffffffU, 32);
   7415 	wm_i82543_mii_sendbits(sc, reg | (phy << 5) |
   7416 	    (MII_COMMAND_READ << 10) | (MII_COMMAND_START << 12), 14);
   7417 	rv = wm_i82543_mii_recvbits(sc) & 0xffff;
   7418 
   7419 	DPRINTF(WM_DEBUG_GMII,
   7420 	    ("%s: GMII: read phy %d reg %d -> 0x%04x\n",
   7421 	    device_xname(sc->sc_dev), phy, reg, rv));
   7422 
   7423 	return rv;
   7424 }
   7425 
   7426 /*
   7427  * wm_gmii_i82543_writereg:	[mii interface function]
   7428  *
   7429  *	Write a PHY register on the GMII (i82543 version).
   7430  */
   7431 static void
   7432 wm_gmii_i82543_writereg(device_t self, int phy, int reg, int val)
   7433 {
   7434 	struct wm_softc *sc = device_private(self);
   7435 
   7436 	wm_i82543_mii_sendbits(sc, 0xffffffffU, 32);
   7437 	wm_i82543_mii_sendbits(sc, val | (MII_COMMAND_ACK << 16) |
   7438 	    (reg << 18) | (phy << 23) | (MII_COMMAND_WRITE << 28) |
   7439 	    (MII_COMMAND_START << 30), 32);
   7440 }
   7441 
   7442 /*
   7443  * wm_gmii_i82544_readreg:	[mii interface function]
   7444  *
   7445  *	Read a PHY register on the GMII.
   7446  */
   7447 static int
   7448 wm_gmii_i82544_readreg(device_t self, int phy, int reg)
   7449 {
   7450 	struct wm_softc *sc = device_private(self);
   7451 	uint32_t mdic = 0;
   7452 	int i, rv;
   7453 
   7454 	CSR_WRITE(sc, WMREG_MDIC, MDIC_OP_READ | MDIC_PHYADD(phy) |
   7455 	    MDIC_REGADD(reg));
   7456 
   7457 	for (i = 0; i < WM_GEN_POLL_TIMEOUT * 3; i++) {
   7458 		mdic = CSR_READ(sc, WMREG_MDIC);
   7459 		if (mdic & MDIC_READY)
   7460 			break;
   7461 		delay(50);
   7462 	}
   7463 
   7464 	if ((mdic & MDIC_READY) == 0) {
   7465 		log(LOG_WARNING, "%s: MDIC read timed out: phy %d reg %d\n",
   7466 		    device_xname(sc->sc_dev), phy, reg);
   7467 		rv = 0;
   7468 	} else if (mdic & MDIC_E) {
   7469 #if 0 /* This is normal if no PHY is present. */
   7470 		log(LOG_WARNING, "%s: MDIC read error: phy %d reg %d\n",
   7471 		    device_xname(sc->sc_dev), phy, reg);
   7472 #endif
   7473 		rv = 0;
   7474 	} else {
   7475 		rv = MDIC_DATA(mdic);
   7476 		if (rv == 0xffff)
   7477 			rv = 0;
   7478 	}
   7479 
   7480 	return rv;
   7481 }
   7482 
   7483 /*
   7484  * wm_gmii_i82544_writereg:	[mii interface function]
   7485  *
   7486  *	Write a PHY register on the GMII.
   7487  */
   7488 static void
   7489 wm_gmii_i82544_writereg(device_t self, int phy, int reg, int val)
   7490 {
   7491 	struct wm_softc *sc = device_private(self);
   7492 	uint32_t mdic = 0;
   7493 	int i;
   7494 
   7495 	CSR_WRITE(sc, WMREG_MDIC, MDIC_OP_WRITE | MDIC_PHYADD(phy) |
   7496 	    MDIC_REGADD(reg) | MDIC_DATA(val));
   7497 
   7498 	for (i = 0; i < WM_GEN_POLL_TIMEOUT * 3; i++) {
   7499 		mdic = CSR_READ(sc, WMREG_MDIC);
   7500 		if (mdic & MDIC_READY)
   7501 			break;
   7502 		delay(50);
   7503 	}
   7504 
   7505 	if ((mdic & MDIC_READY) == 0)
   7506 		log(LOG_WARNING, "%s: MDIC write timed out: phy %d reg %d\n",
   7507 		    device_xname(sc->sc_dev), phy, reg);
   7508 	else if (mdic & MDIC_E)
   7509 		log(LOG_WARNING, "%s: MDIC write error: phy %d reg %d\n",
   7510 		    device_xname(sc->sc_dev), phy, reg);
   7511 }
   7512 
   7513 /*
   7514  * wm_gmii_i80003_readreg:	[mii interface function]
   7515  *
   7516  *	Read a PHY register on the kumeran
   7517  * This could be handled by the PHY layer if we didn't have to lock the
   7518  * ressource ...
   7519  */
   7520 static int
   7521 wm_gmii_i80003_readreg(device_t self, int phy, int reg)
   7522 {
   7523 	struct wm_softc *sc = device_private(self);
   7524 	int sem;
   7525 	int rv;
   7526 
   7527 	if (phy != 1) /* only one PHY on kumeran bus */
   7528 		return 0;
   7529 
   7530 	sem = swfwphysem[sc->sc_funcid];
   7531 	if (wm_get_swfw_semaphore(sc, sem)) {
   7532 		aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
   7533 		    __func__);
   7534 		return 0;
   7535 	}
   7536 
   7537 	if ((reg & GG82563_MAX_REG_ADDRESS) < GG82563_MIN_ALT_REG) {
   7538 		wm_gmii_i82544_writereg(self, phy, GG82563_PHY_PAGE_SELECT,
   7539 		    reg >> GG82563_PAGE_SHIFT);
   7540 	} else {
   7541 		wm_gmii_i82544_writereg(self, phy, GG82563_PHY_PAGE_SELECT_ALT,
   7542 		    reg >> GG82563_PAGE_SHIFT);
   7543 	}
   7544 	/* Wait more 200us for a bug of the ready bit in the MDIC register */
   7545 	delay(200);
   7546 	rv = wm_gmii_i82544_readreg(self, phy, reg & GG82563_MAX_REG_ADDRESS);
   7547 	delay(200);
   7548 
   7549 	wm_put_swfw_semaphore(sc, sem);
   7550 	return rv;
   7551 }
   7552 
   7553 /*
   7554  * wm_gmii_i80003_writereg:	[mii interface function]
   7555  *
   7556  *	Write a PHY register on the kumeran.
   7557  * This could be handled by the PHY layer if we didn't have to lock the
   7558  * ressource ...
   7559  */
   7560 static void
   7561 wm_gmii_i80003_writereg(device_t self, int phy, int reg, int val)
   7562 {
   7563 	struct wm_softc *sc = device_private(self);
   7564 	int sem;
   7565 
   7566 	if (phy != 1) /* only one PHY on kumeran bus */
   7567 		return;
   7568 
   7569 	sem = swfwphysem[sc->sc_funcid];
   7570 	if (wm_get_swfw_semaphore(sc, sem)) {
   7571 		aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
   7572 		    __func__);
   7573 		return;
   7574 	}
   7575 
   7576 	if ((reg & GG82563_MAX_REG_ADDRESS) < GG82563_MIN_ALT_REG) {
   7577 		wm_gmii_i82544_writereg(self, phy, GG82563_PHY_PAGE_SELECT,
   7578 		    reg >> GG82563_PAGE_SHIFT);
   7579 	} else {
   7580 		wm_gmii_i82544_writereg(self, phy, GG82563_PHY_PAGE_SELECT_ALT,
   7581 		    reg >> GG82563_PAGE_SHIFT);
   7582 	}
   7583 	/* Wait more 200us for a bug of the ready bit in the MDIC register */
   7584 	delay(200);
   7585 	wm_gmii_i82544_writereg(self, phy, reg & GG82563_MAX_REG_ADDRESS, val);
   7586 	delay(200);
   7587 
   7588 	wm_put_swfw_semaphore(sc, sem);
   7589 }
   7590 
   7591 /*
   7592  * wm_gmii_bm_readreg:	[mii interface function]
   7593  *
   7594  *	Read a PHY register on the kumeran
   7595  * This could be handled by the PHY layer if we didn't have to lock the
   7596  * ressource ...
   7597  */
   7598 static int
   7599 wm_gmii_bm_readreg(device_t self, int phy, int reg)
   7600 {
   7601 	struct wm_softc *sc = device_private(self);
   7602 	int sem;
   7603 	int rv;
   7604 
   7605 	sem = swfwphysem[sc->sc_funcid];
   7606 	if (wm_get_swfw_semaphore(sc, sem)) {
   7607 		aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
   7608 		    __func__);
   7609 		return 0;
   7610 	}
   7611 
   7612 	if (reg > BME1000_MAX_MULTI_PAGE_REG) {
   7613 		if (phy == 1)
   7614 			wm_gmii_i82544_writereg(self, phy, MII_IGPHY_PAGE_SELECT,
   7615 			    reg);
   7616 		else
   7617 			wm_gmii_i82544_writereg(self, phy,
   7618 			    GG82563_PHY_PAGE_SELECT,
   7619 			    reg >> GG82563_PAGE_SHIFT);
   7620 	}
   7621 
   7622 	rv = wm_gmii_i82544_readreg(self, phy, reg & GG82563_MAX_REG_ADDRESS);
   7623 	wm_put_swfw_semaphore(sc, sem);
   7624 	return rv;
   7625 }
   7626 
   7627 /*
   7628  * wm_gmii_bm_writereg:	[mii interface function]
   7629  *
   7630  *	Write a PHY register on the kumeran.
   7631  * This could be handled by the PHY layer if we didn't have to lock the
   7632  * ressource ...
   7633  */
   7634 static void
   7635 wm_gmii_bm_writereg(device_t self, int phy, int reg, int val)
   7636 {
   7637 	struct wm_softc *sc = device_private(self);
   7638 	int sem;
   7639 
   7640 	sem = swfwphysem[sc->sc_funcid];
   7641 	if (wm_get_swfw_semaphore(sc, sem)) {
   7642 		aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
   7643 		    __func__);
   7644 		return;
   7645 	}
   7646 
   7647 	if (reg > BME1000_MAX_MULTI_PAGE_REG) {
   7648 		if (phy == 1)
   7649 			wm_gmii_i82544_writereg(self, phy, MII_IGPHY_PAGE_SELECT,
   7650 			    reg);
   7651 		else
   7652 			wm_gmii_i82544_writereg(self, phy,
   7653 			    GG82563_PHY_PAGE_SELECT,
   7654 			    reg >> GG82563_PAGE_SHIFT);
   7655 	}
   7656 
   7657 	wm_gmii_i82544_writereg(self, phy, reg & GG82563_MAX_REG_ADDRESS, val);
   7658 	wm_put_swfw_semaphore(sc, sem);
   7659 }
   7660 
   7661 static void
   7662 wm_access_phy_wakeup_reg_bm(device_t self, int offset, int16_t *val, int rd)
   7663 {
   7664 	struct wm_softc *sc = device_private(self);
   7665 	uint16_t regnum = BM_PHY_REG_NUM(offset);
   7666 	uint16_t wuce;
   7667 
   7668 	/* XXX Gig must be disabled for MDIO accesses to page 800 */
   7669 	if (sc->sc_type == WM_T_PCH) {
   7670 		/* XXX e1000 driver do nothing... why? */
   7671 	}
   7672 
   7673 	/* Set page 769 */
   7674 	wm_gmii_i82544_writereg(self, 1, MII_IGPHY_PAGE_SELECT,
   7675 	    BM_WUC_ENABLE_PAGE << BME1000_PAGE_SHIFT);
   7676 
   7677 	wuce = wm_gmii_i82544_readreg(self, 1, BM_WUC_ENABLE_REG);
   7678 
   7679 	wuce &= ~BM_WUC_HOST_WU_BIT;
   7680 	wm_gmii_i82544_writereg(self, 1, BM_WUC_ENABLE_REG,
   7681 	    wuce | BM_WUC_ENABLE_BIT);
   7682 
   7683 	/* Select page 800 */
   7684 	wm_gmii_i82544_writereg(self, 1, MII_IGPHY_PAGE_SELECT,
   7685 	    BM_WUC_PAGE << BME1000_PAGE_SHIFT);
   7686 
   7687 	/* Write page 800 */
   7688 	wm_gmii_i82544_writereg(self, 1, BM_WUC_ADDRESS_OPCODE, regnum);
   7689 
   7690 	if (rd)
   7691 		*val = wm_gmii_i82544_readreg(self, 1, BM_WUC_DATA_OPCODE);
   7692 	else
   7693 		wm_gmii_i82544_writereg(self, 1, BM_WUC_DATA_OPCODE, *val);
   7694 
   7695 	/* Set page 769 */
   7696 	wm_gmii_i82544_writereg(self, 1, MII_IGPHY_PAGE_SELECT,
   7697 	    BM_WUC_ENABLE_PAGE << BME1000_PAGE_SHIFT);
   7698 
   7699 	wm_gmii_i82544_writereg(self, 1, BM_WUC_ENABLE_REG, wuce);
   7700 }
   7701 
   7702 /*
   7703  * wm_gmii_hv_readreg:	[mii interface function]
   7704  *
   7705  *	Read a PHY register on the kumeran
   7706  * This could be handled by the PHY layer if we didn't have to lock the
   7707  * ressource ...
   7708  */
   7709 static int
   7710 wm_gmii_hv_readreg(device_t self, int phy, int reg)
   7711 {
   7712 	struct wm_softc *sc = device_private(self);
   7713 	uint16_t page = BM_PHY_REG_PAGE(reg);
   7714 	uint16_t regnum = BM_PHY_REG_NUM(reg);
   7715 	uint16_t val;
   7716 	int rv;
   7717 
   7718 	if (wm_get_swfwhw_semaphore(sc)) {
   7719 		aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
   7720 		    __func__);
   7721 		return 0;
   7722 	}
   7723 
   7724 	/* XXX Workaround failure in MDIO access while cable is disconnected */
   7725 	if (sc->sc_phytype == WMPHY_82577) {
   7726 		/* XXX must write */
   7727 	}
   7728 
   7729 	/* Page 800 works differently than the rest so it has its own func */
   7730 	if (page == BM_WUC_PAGE) {
   7731 		wm_access_phy_wakeup_reg_bm(self, reg, &val, 1);
   7732 		return val;
   7733 	}
   7734 
   7735 	/*
   7736 	 * Lower than page 768 works differently than the rest so it has its
   7737 	 * own func
   7738 	 */
   7739 	if ((page > 0) && (page < HV_INTC_FC_PAGE_START)) {
   7740 		printf("gmii_hv_readreg!!!\n");
   7741 		return 0;
   7742 	}
   7743 
   7744 	if (regnum > BME1000_MAX_MULTI_PAGE_REG) {
   7745 		wm_gmii_i82544_writereg(self, 1, MII_IGPHY_PAGE_SELECT,
   7746 		    page << BME1000_PAGE_SHIFT);
   7747 	}
   7748 
   7749 	rv = wm_gmii_i82544_readreg(self, phy, regnum & IGPHY_MAXREGADDR);
   7750 	wm_put_swfwhw_semaphore(sc);
   7751 	return rv;
   7752 }
   7753 
   7754 /*
   7755  * wm_gmii_hv_writereg:	[mii interface function]
   7756  *
   7757  *	Write a PHY register on the kumeran.
   7758  * This could be handled by the PHY layer if we didn't have to lock the
   7759  * ressource ...
   7760  */
   7761 static void
   7762 wm_gmii_hv_writereg(device_t self, int phy, int reg, int val)
   7763 {
   7764 	struct wm_softc *sc = device_private(self);
   7765 	uint16_t page = BM_PHY_REG_PAGE(reg);
   7766 	uint16_t regnum = BM_PHY_REG_NUM(reg);
   7767 
   7768 	if (wm_get_swfwhw_semaphore(sc)) {
   7769 		aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
   7770 		    __func__);
   7771 		return;
   7772 	}
   7773 
   7774 	/* XXX Workaround failure in MDIO access while cable is disconnected */
   7775 
   7776 	/* Page 800 works differently than the rest so it has its own func */
   7777 	if (page == BM_WUC_PAGE) {
   7778 		uint16_t tmp;
   7779 
   7780 		tmp = val;
   7781 		wm_access_phy_wakeup_reg_bm(self, reg, &tmp, 0);
   7782 		return;
   7783 	}
   7784 
   7785 	/*
   7786 	 * Lower than page 768 works differently than the rest so it has its
   7787 	 * own func
   7788 	 */
   7789 	if ((page > 0) && (page < HV_INTC_FC_PAGE_START)) {
   7790 		printf("gmii_hv_writereg!!!\n");
   7791 		return;
   7792 	}
   7793 
   7794 	/*
   7795 	 * XXX Workaround MDIO accesses being disabled after entering IEEE
   7796 	 * Power Down (whenever bit 11 of the PHY control register is set)
   7797 	 */
   7798 
   7799 	if (regnum > BME1000_MAX_MULTI_PAGE_REG) {
   7800 		wm_gmii_i82544_writereg(self, 1, MII_IGPHY_PAGE_SELECT,
   7801 		    page << BME1000_PAGE_SHIFT);
   7802 	}
   7803 
   7804 	wm_gmii_i82544_writereg(self, phy, regnum & IGPHY_MAXREGADDR, val);
   7805 	wm_put_swfwhw_semaphore(sc);
   7806 }
   7807 
   7808 /*
   7809  * wm_gmii_82580_readreg:	[mii interface function]
   7810  *
   7811  *	Read a PHY register on the 82580 and I350.
   7812  * This could be handled by the PHY layer if we didn't have to lock the
   7813  * ressource ...
   7814  */
   7815 static int
   7816 wm_gmii_82580_readreg(device_t self, int phy, int reg)
   7817 {
   7818 	struct wm_softc *sc = device_private(self);
   7819 	int sem;
   7820 	int rv;
   7821 
   7822 	sem = swfwphysem[sc->sc_funcid];
   7823 	if (wm_get_swfw_semaphore(sc, sem)) {
   7824 		aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
   7825 		    __func__);
   7826 		return 0;
   7827 	}
   7828 
   7829 	rv = wm_gmii_i82544_readreg(self, phy, reg);
   7830 
   7831 	wm_put_swfw_semaphore(sc, sem);
   7832 	return rv;
   7833 }
   7834 
   7835 /*
   7836  * wm_gmii_82580_writereg:	[mii interface function]
   7837  *
   7838  *	Write a PHY register on the 82580 and I350.
   7839  * This could be handled by the PHY layer if we didn't have to lock the
   7840  * ressource ...
   7841  */
   7842 static void
   7843 wm_gmii_82580_writereg(device_t self, int phy, int reg, int val)
   7844 {
   7845 	struct wm_softc *sc = device_private(self);
   7846 	int sem;
   7847 
   7848 	sem = swfwphysem[sc->sc_funcid];
   7849 	if (wm_get_swfw_semaphore(sc, sem)) {
   7850 		aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
   7851 		    __func__);
   7852 		return;
   7853 	}
   7854 
   7855 	wm_gmii_i82544_writereg(self, phy, reg, val);
   7856 
   7857 	wm_put_swfw_semaphore(sc, sem);
   7858 }
   7859 
   7860 /*
   7861  * wm_gmii_gs40g_readreg:	[mii interface function]
   7862  *
   7863  *	Read a PHY register on the I2100 and I211.
   7864  * This could be handled by the PHY layer if we didn't have to lock the
   7865  * ressource ...
   7866  */
   7867 static int
   7868 wm_gmii_gs40g_readreg(device_t self, int phy, int reg)
   7869 {
   7870 	struct wm_softc *sc = device_private(self);
   7871 	int sem;
   7872 	int page, offset;
   7873 	int rv;
   7874 
   7875 	/* Acquire semaphore */
   7876 	sem = swfwphysem[sc->sc_funcid];
   7877 	if (wm_get_swfw_semaphore(sc, sem)) {
   7878 		aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
   7879 		    __func__);
   7880 		return 0;
   7881 	}
   7882 
   7883 	/* Page select */
   7884 	page = reg >> GS40G_PAGE_SHIFT;
   7885 	wm_gmii_i82544_writereg(self, phy, GS40G_PAGE_SELECT, page);
   7886 
   7887 	/* Read reg */
   7888 	offset = reg & GS40G_OFFSET_MASK;
   7889 	rv = wm_gmii_i82544_readreg(self, phy, offset);
   7890 
   7891 	wm_put_swfw_semaphore(sc, sem);
   7892 	return rv;
   7893 }
   7894 
   7895 /*
   7896  * wm_gmii_gs40g_writereg:	[mii interface function]
   7897  *
   7898  *	Write a PHY register on the I210 and I211.
   7899  * This could be handled by the PHY layer if we didn't have to lock the
   7900  * ressource ...
   7901  */
   7902 static void
   7903 wm_gmii_gs40g_writereg(device_t self, int phy, int reg, int val)
   7904 {
   7905 	struct wm_softc *sc = device_private(self);
   7906 	int sem;
   7907 	int page, offset;
   7908 
   7909 	/* Acquire semaphore */
   7910 	sem = swfwphysem[sc->sc_funcid];
   7911 	if (wm_get_swfw_semaphore(sc, sem)) {
   7912 		aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
   7913 		    __func__);
   7914 		return;
   7915 	}
   7916 
   7917 	/* Page select */
   7918 	page = reg >> GS40G_PAGE_SHIFT;
   7919 	wm_gmii_i82544_writereg(self, phy, GS40G_PAGE_SELECT, page);
   7920 
   7921 	/* Write reg */
   7922 	offset = reg & GS40G_OFFSET_MASK;
   7923 	wm_gmii_i82544_writereg(self, phy, offset, val);
   7924 
   7925 	/* Release semaphore */
   7926 	wm_put_swfw_semaphore(sc, sem);
   7927 }
   7928 
   7929 /*
   7930  * wm_gmii_statchg:	[mii interface function]
   7931  *
   7932  *	Callback from MII layer when media changes.
   7933  */
   7934 static void
   7935 wm_gmii_statchg(struct ifnet *ifp)
   7936 {
   7937 	struct wm_softc *sc = ifp->if_softc;
   7938 	struct mii_data *mii = &sc->sc_mii;
   7939 
   7940 	sc->sc_ctrl &= ~(CTRL_TFCE | CTRL_RFCE);
   7941 	sc->sc_tctl &= ~TCTL_COLD(0x3ff);
   7942 	sc->sc_fcrtl &= ~FCRTL_XONE;
   7943 
   7944 	/*
   7945 	 * Get flow control negotiation result.
   7946 	 */
   7947 	if (IFM_SUBTYPE(mii->mii_media.ifm_cur->ifm_media) == IFM_AUTO &&
   7948 	    (mii->mii_media_active & IFM_ETH_FMASK) != sc->sc_flowflags) {
   7949 		sc->sc_flowflags = mii->mii_media_active & IFM_ETH_FMASK;
   7950 		mii->mii_media_active &= ~IFM_ETH_FMASK;
   7951 	}
   7952 
   7953 	if (sc->sc_flowflags & IFM_FLOW) {
   7954 		if (sc->sc_flowflags & IFM_ETH_TXPAUSE) {
   7955 			sc->sc_ctrl |= CTRL_TFCE;
   7956 			sc->sc_fcrtl |= FCRTL_XONE;
   7957 		}
   7958 		if (sc->sc_flowflags & IFM_ETH_RXPAUSE)
   7959 			sc->sc_ctrl |= CTRL_RFCE;
   7960 	}
   7961 
   7962 	if (sc->sc_mii.mii_media_active & IFM_FDX) {
   7963 		DPRINTF(WM_DEBUG_LINK,
   7964 		    ("%s: LINK: statchg: FDX\n", ifp->if_xname));
   7965 		sc->sc_tctl |= TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
   7966 	} else {
   7967 		DPRINTF(WM_DEBUG_LINK,
   7968 		    ("%s: LINK: statchg: HDX\n", ifp->if_xname));
   7969 		sc->sc_tctl |= TCTL_COLD(TX_COLLISION_DISTANCE_HDX);
   7970 	}
   7971 
   7972 	CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
   7973 	CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
   7974 	CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ? WMREG_OLD_FCRTL
   7975 						 : WMREG_FCRTL, sc->sc_fcrtl);
   7976 	if (sc->sc_type == WM_T_80003) {
   7977 		switch (IFM_SUBTYPE(sc->sc_mii.mii_media_active)) {
   7978 		case IFM_1000_T:
   7979 			wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_HD_CTRL,
   7980 			    KUMCTRLSTA_HD_CTRL_1000_DEFAULT);
   7981 			sc->sc_tipg =  TIPG_1000T_80003_DFLT;
   7982 			break;
   7983 		default:
   7984 			wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_HD_CTRL,
   7985 			    KUMCTRLSTA_HD_CTRL_10_100_DEFAULT);
   7986 			sc->sc_tipg =  TIPG_10_100_80003_DFLT;
   7987 			break;
   7988 		}
   7989 		CSR_WRITE(sc, WMREG_TIPG, sc->sc_tipg);
   7990 	}
   7991 }
   7992 
   7993 /*
   7994  * wm_kmrn_readreg:
   7995  *
   7996  *	Read a kumeran register
   7997  */
   7998 static int
   7999 wm_kmrn_readreg(struct wm_softc *sc, int reg)
   8000 {
   8001 	int rv;
   8002 
   8003 	if (sc->sc_flags & WM_F_LOCK_SWFW) {
   8004 		if (wm_get_swfw_semaphore(sc, SWFW_MAC_CSR_SM)) {
   8005 			aprint_error_dev(sc->sc_dev,
   8006 			    "%s: failed to get semaphore\n", __func__);
   8007 			return 0;
   8008 		}
   8009 	} else if (sc->sc_flags & WM_F_LOCK_EXTCNF) {
   8010 		if (wm_get_swfwhw_semaphore(sc)) {
   8011 			aprint_error_dev(sc->sc_dev,
   8012 			    "%s: failed to get semaphore\n", __func__);
   8013 			return 0;
   8014 		}
   8015 	}
   8016 
   8017 	CSR_WRITE(sc, WMREG_KUMCTRLSTA,
   8018 	    ((reg << KUMCTRLSTA_OFFSET_SHIFT) & KUMCTRLSTA_OFFSET) |
   8019 	    KUMCTRLSTA_REN);
   8020 	CSR_WRITE_FLUSH(sc);
   8021 	delay(2);
   8022 
   8023 	rv = CSR_READ(sc, WMREG_KUMCTRLSTA) & KUMCTRLSTA_MASK;
   8024 
   8025 	if (sc->sc_flags & WM_F_LOCK_SWFW)
   8026 		wm_put_swfw_semaphore(sc, SWFW_MAC_CSR_SM);
   8027 	else if (sc->sc_flags & WM_F_LOCK_EXTCNF)
   8028 		wm_put_swfwhw_semaphore(sc);
   8029 
   8030 	return rv;
   8031 }
   8032 
   8033 /*
   8034  * wm_kmrn_writereg:
   8035  *
   8036  *	Write a kumeran register
   8037  */
   8038 static void
   8039 wm_kmrn_writereg(struct wm_softc *sc, int reg, int val)
   8040 {
   8041 
   8042 	if (sc->sc_flags & WM_F_LOCK_SWFW) {
   8043 		if (wm_get_swfw_semaphore(sc, SWFW_MAC_CSR_SM)) {
   8044 			aprint_error_dev(sc->sc_dev,
   8045 			    "%s: failed to get semaphore\n", __func__);
   8046 			return;
   8047 		}
   8048 	} else if (sc->sc_flags & WM_F_LOCK_EXTCNF) {
   8049 		if (wm_get_swfwhw_semaphore(sc)) {
   8050 			aprint_error_dev(sc->sc_dev,
   8051 			    "%s: failed to get semaphore\n", __func__);
   8052 			return;
   8053 		}
   8054 	}
   8055 
   8056 	CSR_WRITE(sc, WMREG_KUMCTRLSTA,
   8057 	    ((reg << KUMCTRLSTA_OFFSET_SHIFT) & KUMCTRLSTA_OFFSET) |
   8058 	    (val & KUMCTRLSTA_MASK));
   8059 
   8060 	if (sc->sc_flags & WM_F_LOCK_SWFW)
   8061 		wm_put_swfw_semaphore(sc, SWFW_MAC_CSR_SM);
   8062 	else if (sc->sc_flags & WM_F_LOCK_EXTCNF)
   8063 		wm_put_swfwhw_semaphore(sc);
   8064 }
   8065 
   8066 /* SGMII related */
   8067 
   8068 /*
   8069  * wm_sgmii_uses_mdio
   8070  *
   8071  * Check whether the transaction is to the internal PHY or the external
   8072  * MDIO interface. Return true if it's MDIO.
   8073  */
   8074 static bool
   8075 wm_sgmii_uses_mdio(struct wm_softc *sc)
   8076 {
   8077 	uint32_t reg;
   8078 	bool ismdio = false;
   8079 
   8080 	switch (sc->sc_type) {
   8081 	case WM_T_82575:
   8082 	case WM_T_82576:
   8083 		reg = CSR_READ(sc, WMREG_MDIC);
   8084 		ismdio = ((reg & MDIC_DEST) != 0);
   8085 		break;
   8086 	case WM_T_82580:
   8087 	case WM_T_I350:
   8088 	case WM_T_I354:
   8089 	case WM_T_I210:
   8090 	case WM_T_I211:
   8091 		reg = CSR_READ(sc, WMREG_MDICNFG);
   8092 		ismdio = ((reg & MDICNFG_DEST) != 0);
   8093 		break;
   8094 	default:
   8095 		break;
   8096 	}
   8097 
   8098 	return ismdio;
   8099 }
   8100 
   8101 /*
   8102  * wm_sgmii_readreg:	[mii interface function]
   8103  *
   8104  *	Read a PHY register on the SGMII
   8105  * This could be handled by the PHY layer if we didn't have to lock the
   8106  * ressource ...
   8107  */
   8108 static int
   8109 wm_sgmii_readreg(device_t self, int phy, int reg)
   8110 {
   8111 	struct wm_softc *sc = device_private(self);
   8112 	uint32_t i2ccmd;
   8113 	int i, rv;
   8114 
   8115 	if (wm_get_swfw_semaphore(sc, swfwphysem[sc->sc_funcid])) {
   8116 		aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
   8117 		    __func__);
   8118 		return 0;
   8119 	}
   8120 
   8121 	i2ccmd = (reg << I2CCMD_REG_ADDR_SHIFT)
   8122 	    | (phy << I2CCMD_PHY_ADDR_SHIFT)
   8123 	    | I2CCMD_OPCODE_READ;
   8124 	CSR_WRITE(sc, WMREG_I2CCMD, i2ccmd);
   8125 
   8126 	/* Poll the ready bit */
   8127 	for (i = 0; i < I2CCMD_PHY_TIMEOUT; i++) {
   8128 		delay(50);
   8129 		i2ccmd = CSR_READ(sc, WMREG_I2CCMD);
   8130 		if (i2ccmd & I2CCMD_READY)
   8131 			break;
   8132 	}
   8133 	if ((i2ccmd & I2CCMD_READY) == 0)
   8134 		aprint_error_dev(sc->sc_dev, "I2CCMD Read did not complete\n");
   8135 	if ((i2ccmd & I2CCMD_ERROR) != 0)
   8136 		aprint_error_dev(sc->sc_dev, "I2CCMD Error bit set\n");
   8137 
   8138 	rv = ((i2ccmd >> 8) & 0x00ff) | ((i2ccmd << 8) & 0xff00);
   8139 
   8140 	wm_put_swfw_semaphore(sc, swfwphysem[sc->sc_funcid]);
   8141 	return rv;
   8142 }
   8143 
   8144 /*
   8145  * wm_sgmii_writereg:	[mii interface function]
   8146  *
   8147  *	Write a PHY register on the SGMII.
   8148  * This could be handled by the PHY layer if we didn't have to lock the
   8149  * ressource ...
   8150  */
   8151 static void
   8152 wm_sgmii_writereg(device_t self, int phy, int reg, int val)
   8153 {
   8154 	struct wm_softc *sc = device_private(self);
   8155 	uint32_t i2ccmd;
   8156 	int i;
   8157 	int val_swapped;
   8158 
   8159 	if (wm_get_swfw_semaphore(sc, swfwphysem[sc->sc_funcid])) {
   8160 		aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
   8161 		    __func__);
   8162 		return;
   8163 	}
   8164 	/* Swap the data bytes for the I2C interface */
   8165 	val_swapped = ((val >> 8) & 0x00FF) | ((val << 8) & 0xFF00);
   8166 	i2ccmd = (reg << I2CCMD_REG_ADDR_SHIFT)
   8167 	    | (phy << I2CCMD_PHY_ADDR_SHIFT)
   8168 	    | I2CCMD_OPCODE_WRITE | val_swapped;
   8169 	CSR_WRITE(sc, WMREG_I2CCMD, i2ccmd);
   8170 
   8171 	/* Poll the ready bit */
   8172 	for (i = 0; i < I2CCMD_PHY_TIMEOUT; i++) {
   8173 		delay(50);
   8174 		i2ccmd = CSR_READ(sc, WMREG_I2CCMD);
   8175 		if (i2ccmd & I2CCMD_READY)
   8176 			break;
   8177 	}
   8178 	if ((i2ccmd & I2CCMD_READY) == 0)
   8179 		aprint_error_dev(sc->sc_dev, "I2CCMD Write did not complete\n");
   8180 	if ((i2ccmd & I2CCMD_ERROR) != 0)
   8181 		aprint_error_dev(sc->sc_dev, "I2CCMD Error bit set\n");
   8182 
   8183 	wm_put_swfw_semaphore(sc, SWFW_PHY0_SM);
   8184 }
   8185 
   8186 /* TBI related */
   8187 
   8188 /*
   8189  * wm_tbi_mediainit:
   8190  *
   8191  *	Initialize media for use on 1000BASE-X devices.
   8192  */
   8193 static void
   8194 wm_tbi_mediainit(struct wm_softc *sc)
   8195 {
   8196 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
   8197 	const char *sep = "";
   8198 
   8199 	if (sc->sc_type < WM_T_82543)
   8200 		sc->sc_tipg = TIPG_WM_DFLT;
   8201 	else
   8202 		sc->sc_tipg = TIPG_LG_DFLT;
   8203 
   8204 	sc->sc_tbi_serdes_anegticks = 5;
   8205 
   8206 	/* Initialize our media structures */
   8207 	sc->sc_mii.mii_ifp = ifp;
   8208 	sc->sc_ethercom.ec_mii = &sc->sc_mii;
   8209 
   8210 	if ((sc->sc_type >= WM_T_82575)
   8211 	    && (sc->sc_mediatype == WM_MEDIATYPE_SERDES))
   8212 		ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK,
   8213 		    wm_serdes_mediachange, wm_serdes_mediastatus);
   8214 	else
   8215 		ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK,
   8216 		    wm_tbi_mediachange, wm_tbi_mediastatus);
   8217 
   8218 	/*
   8219 	 * SWD Pins:
   8220 	 *
   8221 	 *	0 = Link LED (output)
   8222 	 *	1 = Loss Of Signal (input)
   8223 	 */
   8224 	sc->sc_ctrl |= CTRL_SWDPIO(0);
   8225 
   8226 	/* XXX Perhaps this is only for TBI */
   8227 	if (sc->sc_mediatype != WM_MEDIATYPE_SERDES)
   8228 		sc->sc_ctrl &= ~CTRL_SWDPIO(1);
   8229 
   8230 	if (sc->sc_mediatype == WM_MEDIATYPE_SERDES)
   8231 		sc->sc_ctrl &= ~CTRL_LRST;
   8232 
   8233 	CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
   8234 
   8235 #define	ADD(ss, mm, dd)							\
   8236 do {									\
   8237 	aprint_normal("%s%s", sep, ss);					\
   8238 	ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER|(mm), (dd), NULL);	\
   8239 	sep = ", ";							\
   8240 } while (/*CONSTCOND*/0)
   8241 
   8242 	aprint_normal_dev(sc->sc_dev, "");
   8243 
   8244 	/* Only 82545 is LX */
   8245 	if (sc->sc_type == WM_T_82545) {
   8246 		ADD("1000baseLX", IFM_1000_LX, ANAR_X_HD);
   8247 		ADD("1000baseLX-FDX", IFM_1000_LX|IFM_FDX, ANAR_X_FD);
   8248 	} else {
   8249 		ADD("1000baseSX", IFM_1000_SX, ANAR_X_HD);
   8250 		ADD("1000baseSX-FDX", IFM_1000_SX|IFM_FDX, ANAR_X_FD);
   8251 	}
   8252 	ADD("auto", IFM_AUTO, ANAR_X_FD|ANAR_X_HD);
   8253 	aprint_normal("\n");
   8254 
   8255 #undef ADD
   8256 
   8257 	ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER | IFM_AUTO);
   8258 }
   8259 
   8260 /*
   8261  * wm_tbi_mediachange:	[ifmedia interface function]
   8262  *
   8263  *	Set hardware to newly-selected media on a 1000BASE-X device.
   8264  */
   8265 static int
   8266 wm_tbi_mediachange(struct ifnet *ifp)
   8267 {
   8268 	struct wm_softc *sc = ifp->if_softc;
   8269 	struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
   8270 	uint32_t status;
   8271 	int i;
   8272 
   8273 	if (sc->sc_mediatype == WM_MEDIATYPE_SERDES) {
   8274 		/* XXX need some work for >= 82571 and < 82575 */
   8275 		if (sc->sc_type < WM_T_82575)
   8276 			return 0;
   8277 	}
   8278 
   8279 	if ((sc->sc_type == WM_T_82571) || (sc->sc_type == WM_T_82572)
   8280 	    || (sc->sc_type >= WM_T_82575))
   8281 		CSR_WRITE(sc, WMREG_SCTL, SCTL_DISABLE_SERDES_LOOPBACK);
   8282 
   8283 	sc->sc_ctrl &= ~CTRL_LRST;
   8284 	sc->sc_txcw = TXCW_ANE;
   8285 	if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)
   8286 		sc->sc_txcw |= TXCW_FD | TXCW_HD;
   8287 	else if (ife->ifm_media & IFM_FDX)
   8288 		sc->sc_txcw |= TXCW_FD;
   8289 	else
   8290 		sc->sc_txcw |= TXCW_HD;
   8291 
   8292 	if ((sc->sc_mii.mii_media.ifm_media & IFM_FLOW) != 0)
   8293 		sc->sc_txcw |= TXCW_SYM_PAUSE | TXCW_ASYM_PAUSE;
   8294 
   8295 	DPRINTF(WM_DEBUG_LINK,("%s: sc_txcw = 0x%x after autoneg check\n",
   8296 		    device_xname(sc->sc_dev), sc->sc_txcw));
   8297 	CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw);
   8298 	CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
   8299 	CSR_WRITE_FLUSH(sc);
   8300 	delay(1000);
   8301 
   8302 	i = CSR_READ(sc, WMREG_CTRL) & CTRL_SWDPIN(1);
   8303 	DPRINTF(WM_DEBUG_LINK,("%s: i = 0x%x\n", device_xname(sc->sc_dev),i));
   8304 
   8305 	/*
   8306 	 * On 82544 chips and later, the CTRL_SWDPIN(1) bit will be set if the
   8307 	 * optics detect a signal, 0 if they don't.
   8308 	 */
   8309 	if (((i != 0) && (sc->sc_type > WM_T_82544)) || (i == 0)) {
   8310 		/* Have signal; wait for the link to come up. */
   8311 		for (i = 0; i < WM_LINKUP_TIMEOUT; i++) {
   8312 			delay(10000);
   8313 			if (CSR_READ(sc, WMREG_STATUS) & STATUS_LU)
   8314 				break;
   8315 		}
   8316 
   8317 		DPRINTF(WM_DEBUG_LINK,("%s: i = %d after waiting for link\n",
   8318 			    device_xname(sc->sc_dev),i));
   8319 
   8320 		status = CSR_READ(sc, WMREG_STATUS);
   8321 		DPRINTF(WM_DEBUG_LINK,
   8322 		    ("%s: status after final read = 0x%x, STATUS_LU = 0x%x\n",
   8323 			device_xname(sc->sc_dev),status, STATUS_LU));
   8324 		if (status & STATUS_LU) {
   8325 			/* Link is up. */
   8326 			DPRINTF(WM_DEBUG_LINK,
   8327 			    ("%s: LINK: set media -> link up %s\n",
   8328 			    device_xname(sc->sc_dev),
   8329 			    (status & STATUS_FD) ? "FDX" : "HDX"));
   8330 
   8331 			/*
   8332 			 * NOTE: CTRL will update TFCE and RFCE automatically,
   8333 			 * so we should update sc->sc_ctrl
   8334 			 */
   8335 			sc->sc_ctrl = CSR_READ(sc, WMREG_CTRL);
   8336 			sc->sc_tctl &= ~TCTL_COLD(0x3ff);
   8337 			sc->sc_fcrtl &= ~FCRTL_XONE;
   8338 			if (status & STATUS_FD)
   8339 				sc->sc_tctl |=
   8340 				    TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
   8341 			else
   8342 				sc->sc_tctl |=
   8343 				    TCTL_COLD(TX_COLLISION_DISTANCE_HDX);
   8344 			if (CSR_READ(sc, WMREG_CTRL) & CTRL_TFCE)
   8345 				sc->sc_fcrtl |= FCRTL_XONE;
   8346 			CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
   8347 			CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ?
   8348 				      WMREG_OLD_FCRTL : WMREG_FCRTL,
   8349 				      sc->sc_fcrtl);
   8350 			sc->sc_tbi_linkup = 1;
   8351 		} else {
   8352 			if (i == WM_LINKUP_TIMEOUT)
   8353 				wm_check_for_link(sc);
   8354 			/* Link is down. */
   8355 			DPRINTF(WM_DEBUG_LINK,
   8356 			    ("%s: LINK: set media -> link down\n",
   8357 			    device_xname(sc->sc_dev)));
   8358 			sc->sc_tbi_linkup = 0;
   8359 		}
   8360 	} else {
   8361 		DPRINTF(WM_DEBUG_LINK, ("%s: LINK: set media -> no signal\n",
   8362 		    device_xname(sc->sc_dev)));
   8363 		sc->sc_tbi_linkup = 0;
   8364 	}
   8365 
   8366 	wm_tbi_serdes_set_linkled(sc);
   8367 
   8368 	return 0;
   8369 }
   8370 
   8371 /*
   8372  * wm_tbi_mediastatus:	[ifmedia interface function]
   8373  *
   8374  *	Get the current interface media status on a 1000BASE-X device.
   8375  */
   8376 static void
   8377 wm_tbi_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
   8378 {
   8379 	struct wm_softc *sc = ifp->if_softc;
   8380 	uint32_t ctrl, status;
   8381 
   8382 	ifmr->ifm_status = IFM_AVALID;
   8383 	ifmr->ifm_active = IFM_ETHER;
   8384 
   8385 	status = CSR_READ(sc, WMREG_STATUS);
   8386 	if ((status & STATUS_LU) == 0) {
   8387 		ifmr->ifm_active |= IFM_NONE;
   8388 		return;
   8389 	}
   8390 
   8391 	ifmr->ifm_status |= IFM_ACTIVE;
   8392 	/* Only 82545 is LX */
   8393 	if (sc->sc_type == WM_T_82545)
   8394 		ifmr->ifm_active |= IFM_1000_LX;
   8395 	else
   8396 		ifmr->ifm_active |= IFM_1000_SX;
   8397 	if (CSR_READ(sc, WMREG_STATUS) & STATUS_FD)
   8398 		ifmr->ifm_active |= IFM_FDX;
   8399 	else
   8400 		ifmr->ifm_active |= IFM_HDX;
   8401 	ctrl = CSR_READ(sc, WMREG_CTRL);
   8402 	if (ctrl & CTRL_RFCE)
   8403 		ifmr->ifm_active |= IFM_FLOW | IFM_ETH_RXPAUSE;
   8404 	if (ctrl & CTRL_TFCE)
   8405 		ifmr->ifm_active |= IFM_FLOW | IFM_ETH_TXPAUSE;
   8406 }
   8407 
   8408 /* XXX TBI only */
   8409 static int
   8410 wm_check_for_link(struct wm_softc *sc)
   8411 {
   8412 	struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
   8413 	uint32_t rxcw;
   8414 	uint32_t ctrl;
   8415 	uint32_t status;
   8416 	uint32_t sig;
   8417 
   8418 	if (sc->sc_mediatype == WM_MEDIATYPE_SERDES) {
   8419 		/* XXX need some work for >= 82571 */
   8420 		if (sc->sc_type >= WM_T_82571) {
   8421 			sc->sc_tbi_linkup = 1;
   8422 			return 0;
   8423 		}
   8424 	}
   8425 
   8426 	rxcw = CSR_READ(sc, WMREG_RXCW);
   8427 	ctrl = CSR_READ(sc, WMREG_CTRL);
   8428 	status = CSR_READ(sc, WMREG_STATUS);
   8429 
   8430 	sig = (sc->sc_type > WM_T_82544) ? CTRL_SWDPIN(1) : 0;
   8431 
   8432 	DPRINTF(WM_DEBUG_LINK, ("%s: %s: sig = %d, status_lu = %d, rxcw_c = %d\n",
   8433 		device_xname(sc->sc_dev), __func__,
   8434 		((ctrl & CTRL_SWDPIN(1)) == sig),
   8435 		((status & STATUS_LU) != 0),
   8436 		((rxcw & RXCW_C) != 0)
   8437 		    ));
   8438 
   8439 	/*
   8440 	 * SWDPIN   LU RXCW
   8441 	 *      0    0    0
   8442 	 *      0    0    1	(should not happen)
   8443 	 *      0    1    0	(should not happen)
   8444 	 *      0    1    1	(should not happen)
   8445 	 *      1    0    0	Disable autonego and force linkup
   8446 	 *      1    0    1	got /C/ but not linkup yet
   8447 	 *      1    1    0	(linkup)
   8448 	 *      1    1    1	If IFM_AUTO, back to autonego
   8449 	 *
   8450 	 */
   8451 	if (((ctrl & CTRL_SWDPIN(1)) == sig)
   8452 	    && ((status & STATUS_LU) == 0)
   8453 	    && ((rxcw & RXCW_C) == 0)) {
   8454 		DPRINTF(WM_DEBUG_LINK, ("%s: force linkup and fullduplex\n",
   8455 			__func__));
   8456 		sc->sc_tbi_linkup = 0;
   8457 		/* Disable auto-negotiation in the TXCW register */
   8458 		CSR_WRITE(sc, WMREG_TXCW, (sc->sc_txcw & ~TXCW_ANE));
   8459 
   8460 		/*
   8461 		 * Force link-up and also force full-duplex.
   8462 		 *
   8463 		 * NOTE: CTRL was updated TFCE and RFCE automatically,
   8464 		 * so we should update sc->sc_ctrl
   8465 		 */
   8466 		sc->sc_ctrl = ctrl | CTRL_SLU | CTRL_FD;
   8467 		CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
   8468 	} else if (((status & STATUS_LU) != 0)
   8469 	    && ((rxcw & RXCW_C) != 0)
   8470 	    && (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)) {
   8471 		sc->sc_tbi_linkup = 1;
   8472 		DPRINTF(WM_DEBUG_LINK, ("%s: go back to autonego\n",
   8473 			__func__));
   8474 		CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw);
   8475 		CSR_WRITE(sc, WMREG_CTRL, (ctrl & ~CTRL_SLU));
   8476 	} else if (((ctrl & CTRL_SWDPIN(1)) == sig)
   8477 	    && ((rxcw & RXCW_C) != 0)) {
   8478 		DPRINTF(WM_DEBUG_LINK, ("/C/"));
   8479 	} else {
   8480 		DPRINTF(WM_DEBUG_LINK, ("%s: %x,%x,%x\n", __func__, rxcw, ctrl,
   8481 			status));
   8482 	}
   8483 
   8484 	return 0;
   8485 }
   8486 
   8487 /*
   8488  * wm_tbi_tick:
   8489  *
   8490  *	Check the link on TBI devices.
   8491  *	This function acts as mii_tick().
   8492  */
   8493 static void
   8494 wm_tbi_tick(struct wm_softc *sc)
   8495 {
   8496 	struct mii_data *mii = &sc->sc_mii;
   8497 	struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
   8498 	uint32_t status;
   8499 
   8500 	KASSERT(WM_TX_LOCKED(sc));
   8501 
   8502 	status = CSR_READ(sc, WMREG_STATUS);
   8503 
   8504 	/* XXX is this needed? */
   8505 	(void)CSR_READ(sc, WMREG_RXCW);
   8506 	(void)CSR_READ(sc, WMREG_CTRL);
   8507 
   8508 	/* set link status */
   8509 	if ((status & STATUS_LU) == 0) {
   8510 		DPRINTF(WM_DEBUG_LINK,
   8511 		    ("%s: LINK: checklink -> down\n",
   8512 			device_xname(sc->sc_dev)));
   8513 		sc->sc_tbi_linkup = 0;
   8514 	} else if (sc->sc_tbi_linkup == 0) {
   8515 		DPRINTF(WM_DEBUG_LINK,
   8516 		    ("%s: LINK: checklink -> up %s\n",
   8517 			device_xname(sc->sc_dev),
   8518 			(status & STATUS_FD) ? "FDX" : "HDX"));
   8519 		sc->sc_tbi_linkup = 1;
   8520 		sc->sc_tbi_serdes_ticks = 0;
   8521 	}
   8522 
   8523 	if ((sc->sc_ethercom.ec_if.if_flags & IFF_UP) == 0)
   8524 		goto setled;
   8525 
   8526 	if ((status & STATUS_LU) == 0) {
   8527 		sc->sc_tbi_linkup = 0;
   8528 		/* If the timer expired, retry autonegotiation */
   8529 		if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)
   8530 		    && (++sc->sc_tbi_serdes_ticks
   8531 			>= sc->sc_tbi_serdes_anegticks)) {
   8532 			DPRINTF(WM_DEBUG_LINK, ("EXPIRE\n"));
   8533 			sc->sc_tbi_serdes_ticks = 0;
   8534 			/*
   8535 			 * Reset the link, and let autonegotiation do
   8536 			 * its thing
   8537 			 */
   8538 			sc->sc_ctrl |= CTRL_LRST;
   8539 			CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
   8540 			CSR_WRITE_FLUSH(sc);
   8541 			delay(1000);
   8542 			sc->sc_ctrl &= ~CTRL_LRST;
   8543 			CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
   8544 			CSR_WRITE_FLUSH(sc);
   8545 			delay(1000);
   8546 			CSR_WRITE(sc, WMREG_TXCW,
   8547 			    sc->sc_txcw & ~TXCW_ANE);
   8548 			CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw);
   8549 		}
   8550 	}
   8551 
   8552 setled:
   8553 	wm_tbi_serdes_set_linkled(sc);
   8554 }
   8555 
   8556 /* SERDES related */
   8557 static void
   8558 wm_serdes_power_up_link_82575(struct wm_softc *sc)
   8559 {
   8560 	uint32_t reg;
   8561 
   8562 	if ((sc->sc_mediatype != WM_MEDIATYPE_SERDES)
   8563 	    && ((sc->sc_flags & WM_F_SGMII) == 0))
   8564 		return;
   8565 
   8566 	reg = CSR_READ(sc, WMREG_PCS_CFG);
   8567 	reg |= PCS_CFG_PCS_EN;
   8568 	CSR_WRITE(sc, WMREG_PCS_CFG, reg);
   8569 
   8570 	reg = CSR_READ(sc, WMREG_CTRL_EXT);
   8571 	reg &= ~CTRL_EXT_SWDPIN(3);
   8572 	CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
   8573 	CSR_WRITE_FLUSH(sc);
   8574 }
   8575 
   8576 static int
   8577 wm_serdes_mediachange(struct ifnet *ifp)
   8578 {
   8579 	struct wm_softc *sc = ifp->if_softc;
   8580 	bool pcs_autoneg = true; /* XXX */
   8581 	uint32_t ctrl_ext, pcs_lctl, reg;
   8582 
   8583 	/* XXX Currently, this function is not called on 8257[12] */
   8584 	if ((sc->sc_type == WM_T_82571) || (sc->sc_type == WM_T_82572)
   8585 	    || (sc->sc_type >= WM_T_82575))
   8586 		CSR_WRITE(sc, WMREG_SCTL, SCTL_DISABLE_SERDES_LOOPBACK);
   8587 
   8588 	wm_serdes_power_up_link_82575(sc);
   8589 
   8590 	sc->sc_ctrl |= CTRL_SLU;
   8591 
   8592 	if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576))
   8593 		sc->sc_ctrl |= CTRL_SWDPIN(0) | CTRL_SWDPIN(1);
   8594 
   8595 	ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT);
   8596 	pcs_lctl = CSR_READ(sc, WMREG_PCS_LCTL);
   8597 	switch (ctrl_ext & CTRL_EXT_LINK_MODE_MASK) {
   8598 	case CTRL_EXT_LINK_MODE_SGMII:
   8599 		pcs_autoneg = true;
   8600 		pcs_lctl &= ~PCS_LCTL_AN_TIMEOUT;
   8601 		break;
   8602 	case CTRL_EXT_LINK_MODE_1000KX:
   8603 		pcs_autoneg = false;
   8604 		/* FALLTHROUGH */
   8605 	default:
   8606 		if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)){
   8607 			if ((sc->sc_flags & WM_F_PCS_DIS_AUTONEGO) != 0)
   8608 				pcs_autoneg = false;
   8609 		}
   8610 		sc->sc_ctrl |= CTRL_SPEED_1000 | CTRL_FRCSPD | CTRL_FD
   8611 		    | CTRL_FRCFDX;
   8612 		pcs_lctl |= PCS_LCTL_FSV_1000 | PCS_LCTL_FDV_FULL;
   8613 	}
   8614 	CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
   8615 
   8616 	if (pcs_autoneg) {
   8617 		pcs_lctl |= PCS_LCTL_AN_ENABLE | PCS_LCTL_AN_RESTART;
   8618 		pcs_lctl &= ~PCS_LCTL_FORCE_FC;
   8619 
   8620 		reg = CSR_READ(sc, WMREG_PCS_ANADV);
   8621 		reg &= ~(TXCW_ASYM_PAUSE | TXCW_SYM_PAUSE);
   8622 		reg |= TXCW_ASYM_PAUSE | TXCW_SYM_PAUSE;
   8623 		CSR_WRITE(sc, WMREG_PCS_ANADV, reg);
   8624 	} else
   8625 		pcs_lctl |= PCS_LCTL_FSD | PCS_LCTL_FORCE_FC;
   8626 
   8627 	CSR_WRITE(sc, WMREG_PCS_LCTL, pcs_lctl);
   8628 
   8629 
   8630 	return 0;
   8631 }
   8632 
   8633 static void
   8634 wm_serdes_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
   8635 {
   8636 	struct wm_softc *sc = ifp->if_softc;
   8637 	struct mii_data *mii = &sc->sc_mii;
   8638 	struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
   8639 	uint32_t pcs_adv, pcs_lpab, reg;
   8640 
   8641 	ifmr->ifm_status = IFM_AVALID;
   8642 	ifmr->ifm_active = IFM_ETHER;
   8643 
   8644 	/* Check PCS */
   8645 	reg = CSR_READ(sc, WMREG_PCS_LSTS);
   8646 	if ((reg & PCS_LSTS_LINKOK) == 0) {
   8647 		ifmr->ifm_active |= IFM_NONE;
   8648 		sc->sc_tbi_linkup = 0;
   8649 		goto setled;
   8650 	}
   8651 
   8652 	sc->sc_tbi_linkup = 1;
   8653 	ifmr->ifm_status |= IFM_ACTIVE;
   8654 	ifmr->ifm_active |= IFM_1000_SX; /* XXX */
   8655 	if ((reg & PCS_LSTS_FDX) != 0)
   8656 		ifmr->ifm_active |= IFM_FDX;
   8657 	else
   8658 		ifmr->ifm_active |= IFM_HDX;
   8659 	mii->mii_media_active &= ~IFM_ETH_FMASK;
   8660 	if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) {
   8661 		/* Check flow */
   8662 		reg = CSR_READ(sc, WMREG_PCS_LSTS);
   8663 		if ((reg & PCS_LSTS_AN_COMP) == 0) {
   8664 			printf("XXX LINKOK but not ACOMP\n");
   8665 			goto setled;
   8666 		}
   8667 		pcs_adv = CSR_READ(sc, WMREG_PCS_ANADV);
   8668 		pcs_lpab = CSR_READ(sc, WMREG_PCS_LPAB);
   8669 			printf("XXX AN result(2) %08x, %08x\n", pcs_adv, pcs_lpab);
   8670 		if ((pcs_adv & TXCW_SYM_PAUSE)
   8671 		    && (pcs_lpab & TXCW_SYM_PAUSE)) {
   8672 			mii->mii_media_active |= IFM_FLOW
   8673 			    | IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE;
   8674 		} else if (((pcs_adv & TXCW_SYM_PAUSE) == 0)
   8675 		    && (pcs_adv & TXCW_ASYM_PAUSE)
   8676 		    && (pcs_lpab & TXCW_SYM_PAUSE)
   8677 		    && (pcs_lpab & TXCW_ASYM_PAUSE)) {
   8678 			mii->mii_media_active |= IFM_FLOW
   8679 			    | IFM_ETH_TXPAUSE;
   8680 		} else if ((pcs_adv & TXCW_SYM_PAUSE)
   8681 		    && (pcs_adv & TXCW_ASYM_PAUSE)
   8682 		    && ((pcs_lpab & TXCW_SYM_PAUSE) == 0)
   8683 		    && (pcs_lpab & TXCW_ASYM_PAUSE)) {
   8684 			mii->mii_media_active |= IFM_FLOW
   8685 			    | IFM_ETH_RXPAUSE;
   8686 		} else {
   8687 		}
   8688 	}
   8689 	ifmr->ifm_active = (ifmr->ifm_active & ~IFM_ETH_FMASK)
   8690 	    | (mii->mii_media_active & IFM_ETH_FMASK);
   8691 setled:
   8692 	wm_tbi_serdes_set_linkled(sc);
   8693 }
   8694 
   8695 /*
   8696  * wm_serdes_tick:
   8697  *
   8698  *	Check the link on serdes devices.
   8699  */
   8700 static void
   8701 wm_serdes_tick(struct wm_softc *sc)
   8702 {
   8703 	struct ifnet *ifp = &sc->sc_ethercom.ec_if;
   8704 	struct mii_data *mii = &sc->sc_mii;
   8705 	struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
   8706 	uint32_t reg;
   8707 
   8708 	KASSERT(WM_TX_LOCKED(sc));
   8709 
   8710 	mii->mii_media_status = IFM_AVALID;
   8711 	mii->mii_media_active = IFM_ETHER;
   8712 
   8713 	/* Check PCS */
   8714 	reg = CSR_READ(sc, WMREG_PCS_LSTS);
   8715 	if ((reg & PCS_LSTS_LINKOK) != 0) {
   8716 		mii->mii_media_status |= IFM_ACTIVE;
   8717 		sc->sc_tbi_linkup = 1;
   8718 		sc->sc_tbi_serdes_ticks = 0;
   8719 		mii->mii_media_active |= IFM_1000_SX; /* XXX */
   8720 		if ((reg & PCS_LSTS_FDX) != 0)
   8721 			mii->mii_media_active |= IFM_FDX;
   8722 		else
   8723 			mii->mii_media_active |= IFM_HDX;
   8724 	} else {
   8725 		mii->mii_media_status |= IFM_NONE;
   8726 		sc->sc_tbi_linkup = 0;
   8727 		    /* If the timer expired, retry autonegotiation */
   8728 		if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)
   8729 		    && (++sc->sc_tbi_serdes_ticks
   8730 			>= sc->sc_tbi_serdes_anegticks)) {
   8731 			DPRINTF(WM_DEBUG_LINK, ("EXPIRE\n"));
   8732 			sc->sc_tbi_serdes_ticks = 0;
   8733 			/* XXX */
   8734 			wm_serdes_mediachange(ifp);
   8735 		}
   8736 	}
   8737 
   8738 	wm_tbi_serdes_set_linkled(sc);
   8739 }
   8740 
   8741 /* SFP related */
   8742 
   8743 static int
   8744 wm_sfp_read_data_byte(struct wm_softc *sc, uint16_t offset, uint8_t *data)
   8745 {
   8746 	uint32_t i2ccmd;
   8747 	int i;
   8748 
   8749 	i2ccmd = (offset << I2CCMD_REG_ADDR_SHIFT) | I2CCMD_OPCODE_READ;
   8750 	CSR_WRITE(sc, WMREG_I2CCMD, i2ccmd);
   8751 
   8752 	/* Poll the ready bit */
   8753 	for (i = 0; i < I2CCMD_PHY_TIMEOUT; i++) {
   8754 		delay(50);
   8755 		i2ccmd = CSR_READ(sc, WMREG_I2CCMD);
   8756 		if (i2ccmd & I2CCMD_READY)
   8757 			break;
   8758 	}
   8759 	if ((i2ccmd & I2CCMD_READY) == 0)
   8760 		return -1;
   8761 	if ((i2ccmd & I2CCMD_ERROR) != 0)
   8762 		return -1;
   8763 
   8764 	*data = i2ccmd & 0x00ff;
   8765 
   8766 	return 0;
   8767 }
   8768 
   8769 static uint32_t
   8770 wm_sfp_get_media_type(struct wm_softc *sc)
   8771 {
   8772 	uint32_t ctrl_ext;
   8773 	uint8_t val = 0;
   8774 	int timeout = 3;
   8775 	uint32_t mediatype = WM_MEDIATYPE_UNKNOWN;
   8776 	int rv = -1;
   8777 
   8778 	ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT);
   8779 	ctrl_ext &= ~CTRL_EXT_SWDPIN(3);
   8780 	CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext | CTRL_EXT_I2C_ENA);
   8781 	CSR_WRITE_FLUSH(sc);
   8782 
   8783 	/* Read SFP module data */
   8784 	while (timeout) {
   8785 		rv = wm_sfp_read_data_byte(sc, SFF_SFP_ID_OFF, &val);
   8786 		if (rv == 0)
   8787 			break;
   8788 		delay(100*1000); /* XXX too big */
   8789 		timeout--;
   8790 	}
   8791 	if (rv != 0)
   8792 		goto out;
   8793 	switch (val) {
   8794 	case SFF_SFP_ID_SFF:
   8795 		aprint_normal_dev(sc->sc_dev,
   8796 		    "Module/Connector soldered to board\n");
   8797 		break;
   8798 	case SFF_SFP_ID_SFP:
   8799 		aprint_normal_dev(sc->sc_dev, "SFP\n");
   8800 		break;
   8801 	case SFF_SFP_ID_UNKNOWN:
   8802 		goto out;
   8803 	default:
   8804 		break;
   8805 	}
   8806 
   8807 	rv = wm_sfp_read_data_byte(sc, SFF_SFP_ETH_FLAGS_OFF, &val);
   8808 	if (rv != 0) {
   8809 		goto out;
   8810 	}
   8811 
   8812 	if ((val & (SFF_SFP_ETH_FLAGS_1000SX | SFF_SFP_ETH_FLAGS_1000LX)) != 0)
   8813 		mediatype = WM_MEDIATYPE_SERDES;
   8814 	else if ((val & SFF_SFP_ETH_FLAGS_1000T) != 0){
   8815 		sc->sc_flags |= WM_F_SGMII;
   8816 		mediatype = WM_MEDIATYPE_COPPER;
   8817 	} else if ((val & SFF_SFP_ETH_FLAGS_100FX) != 0){
   8818 		sc->sc_flags |= WM_F_SGMII;
   8819 		mediatype = WM_MEDIATYPE_SERDES;
   8820 	}
   8821 
   8822 out:
   8823 	/* Restore I2C interface setting */
   8824 	CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext);
   8825 
   8826 	return mediatype;
   8827 }
   8828 /*
   8829  * NVM related.
   8830  * Microwire, SPI (w/wo EERD) and Flash.
   8831  */
   8832 
   8833 /* Both spi and uwire */
   8834 
   8835 /*
   8836  * wm_eeprom_sendbits:
   8837  *
   8838  *	Send a series of bits to the EEPROM.
   8839  */
   8840 static void
   8841 wm_eeprom_sendbits(struct wm_softc *sc, uint32_t bits, int nbits)
   8842 {
   8843 	uint32_t reg;
   8844 	int x;
   8845 
   8846 	reg = CSR_READ(sc, WMREG_EECD);
   8847 
   8848 	for (x = nbits; x > 0; x--) {
   8849 		if (bits & (1U << (x - 1)))
   8850 			reg |= EECD_DI;
   8851 		else
   8852 			reg &= ~EECD_DI;
   8853 		CSR_WRITE(sc, WMREG_EECD, reg);
   8854 		CSR_WRITE_FLUSH(sc);
   8855 		delay(2);
   8856 		CSR_WRITE(sc, WMREG_EECD, reg | EECD_SK);
   8857 		CSR_WRITE_FLUSH(sc);
   8858 		delay(2);
   8859 		CSR_WRITE(sc, WMREG_EECD, reg);
   8860 		CSR_WRITE_FLUSH(sc);
   8861 		delay(2);
   8862 	}
   8863 }
   8864 
   8865 /*
   8866  * wm_eeprom_recvbits:
   8867  *
   8868  *	Receive a series of bits from the EEPROM.
   8869  */
   8870 static void
   8871 wm_eeprom_recvbits(struct wm_softc *sc, uint32_t *valp, int nbits)
   8872 {
   8873 	uint32_t reg, val;
   8874 	int x;
   8875 
   8876 	reg = CSR_READ(sc, WMREG_EECD) & ~EECD_DI;
   8877 
   8878 	val = 0;
   8879 	for (x = nbits; x > 0; x--) {
   8880 		CSR_WRITE(sc, WMREG_EECD, reg | EECD_SK);
   8881 		CSR_WRITE_FLUSH(sc);
   8882 		delay(2);
   8883 		if (CSR_READ(sc, WMREG_EECD) & EECD_DO)
   8884 			val |= (1U << (x - 1));
   8885 		CSR_WRITE(sc, WMREG_EECD, reg);
   8886 		CSR_WRITE_FLUSH(sc);
   8887 		delay(2);
   8888 	}
   8889 	*valp = val;
   8890 }
   8891 
   8892 /* Microwire */
   8893 
   8894 /*
   8895  * wm_nvm_read_uwire:
   8896  *
   8897  *	Read a word from the EEPROM using the MicroWire protocol.
   8898  */
   8899 static int
   8900 wm_nvm_read_uwire(struct wm_softc *sc, int word, int wordcnt, uint16_t *data)
   8901 {
   8902 	uint32_t reg, val;
   8903 	int i;
   8904 
   8905 	for (i = 0; i < wordcnt; i++) {
   8906 		/* Clear SK and DI. */
   8907 		reg = CSR_READ(sc, WMREG_EECD) & ~(EECD_SK | EECD_DI);
   8908 		CSR_WRITE(sc, WMREG_EECD, reg);
   8909 
   8910 		/*
   8911 		 * XXX: workaround for a bug in qemu-0.12.x and prior
   8912 		 * and Xen.
   8913 		 *
   8914 		 * We use this workaround only for 82540 because qemu's
   8915 		 * e1000 act as 82540.
   8916 		 */
   8917 		if (sc->sc_type == WM_T_82540) {
   8918 			reg |= EECD_SK;
   8919 			CSR_WRITE(sc, WMREG_EECD, reg);
   8920 			reg &= ~EECD_SK;
   8921 			CSR_WRITE(sc, WMREG_EECD, reg);
   8922 			CSR_WRITE_FLUSH(sc);
   8923 			delay(2);
   8924 		}
   8925 		/* XXX: end of workaround */
   8926 
   8927 		/* Set CHIP SELECT. */
   8928 		reg |= EECD_CS;
   8929 		CSR_WRITE(sc, WMREG_EECD, reg);
   8930 		CSR_WRITE_FLUSH(sc);
   8931 		delay(2);
   8932 
   8933 		/* Shift in the READ command. */
   8934 		wm_eeprom_sendbits(sc, UWIRE_OPC_READ, 3);
   8935 
   8936 		/* Shift in address. */
   8937 		wm_eeprom_sendbits(sc, word + i, sc->sc_nvm_addrbits);
   8938 
   8939 		/* Shift out the data. */
   8940 		wm_eeprom_recvbits(sc, &val, 16);
   8941 		data[i] = val & 0xffff;
   8942 
   8943 		/* Clear CHIP SELECT. */
   8944 		reg = CSR_READ(sc, WMREG_EECD) & ~EECD_CS;
   8945 		CSR_WRITE(sc, WMREG_EECD, reg);
   8946 		CSR_WRITE_FLUSH(sc);
   8947 		delay(2);
   8948 	}
   8949 
   8950 	return 0;
   8951 }
   8952 
   8953 /* SPI */
   8954 
   8955 /*
   8956  * Set SPI and FLASH related information from the EECD register.
   8957  * For 82541 and 82547, the word size is taken from EEPROM.
   8958  */
   8959 static int
   8960 wm_nvm_set_addrbits_size_eecd(struct wm_softc *sc)
   8961 {
   8962 	int size;
   8963 	uint32_t reg;
   8964 	uint16_t data;
   8965 
   8966 	reg = CSR_READ(sc, WMREG_EECD);
   8967 	sc->sc_nvm_addrbits = (reg & EECD_EE_ABITS) ? 16 : 8;
   8968 
   8969 	/* Read the size of NVM from EECD by default */
   8970 	size = __SHIFTOUT(reg, EECD_EE_SIZE_EX_MASK);
   8971 	switch (sc->sc_type) {
   8972 	case WM_T_82541:
   8973 	case WM_T_82541_2:
   8974 	case WM_T_82547:
   8975 	case WM_T_82547_2:
   8976 		/* Set dummy value to access EEPROM */
   8977 		sc->sc_nvm_wordsize = 64;
   8978 		wm_nvm_read(sc, NVM_OFF_EEPROM_SIZE, 1, &data);
   8979 		reg = data;
   8980 		size = __SHIFTOUT(reg, EECD_EE_SIZE_EX_MASK);
   8981 		if (size == 0)
   8982 			size = 6; /* 64 word size */
   8983 		else
   8984 			size += NVM_WORD_SIZE_BASE_SHIFT + 1;
   8985 		break;
   8986 	case WM_T_80003:
   8987 	case WM_T_82571:
   8988 	case WM_T_82572:
   8989 	case WM_T_82573: /* SPI case */
   8990 	case WM_T_82574: /* SPI case */
   8991 	case WM_T_82583: /* SPI case */
   8992 		size += NVM_WORD_SIZE_BASE_SHIFT;
   8993 		if (size > 14)
   8994 			size = 14;
   8995 		break;
   8996 	case WM_T_82575:
   8997 	case WM_T_82576:
   8998 	case WM_T_82580:
   8999 	case WM_T_I350:
   9000 	case WM_T_I354:
   9001 	case WM_T_I210:
   9002 	case WM_T_I211:
   9003 		size += NVM_WORD_SIZE_BASE_SHIFT;
   9004 		if (size > 15)
   9005 			size = 15;
   9006 		break;
   9007 	default:
   9008 		aprint_error_dev(sc->sc_dev,
   9009 		    "%s: unknown device(%d)?\n", __func__, sc->sc_type);
   9010 		return -1;
   9011 		break;
   9012 	}
   9013 
   9014 	sc->sc_nvm_wordsize = 1 << size;
   9015 
   9016 	return 0;
   9017 }
   9018 
   9019 /*
   9020  * wm_nvm_ready_spi:
   9021  *
   9022  *	Wait for a SPI EEPROM to be ready for commands.
   9023  */
   9024 static int
   9025 wm_nvm_ready_spi(struct wm_softc *sc)
   9026 {
   9027 	uint32_t val;
   9028 	int usec;
   9029 
   9030 	for (usec = 0; usec < SPI_MAX_RETRIES; delay(5), usec += 5) {
   9031 		wm_eeprom_sendbits(sc, SPI_OPC_RDSR, 8);
   9032 		wm_eeprom_recvbits(sc, &val, 8);
   9033 		if ((val & SPI_SR_RDY) == 0)
   9034 			break;
   9035 	}
   9036 	if (usec >= SPI_MAX_RETRIES) {
   9037 		aprint_error_dev(sc->sc_dev, "EEPROM failed to become ready\n");
   9038 		return 1;
   9039 	}
   9040 	return 0;
   9041 }
   9042 
   9043 /*
   9044  * wm_nvm_read_spi:
   9045  *
   9046  *	Read a work from the EEPROM using the SPI protocol.
   9047  */
   9048 static int
   9049 wm_nvm_read_spi(struct wm_softc *sc, int word, int wordcnt, uint16_t *data)
   9050 {
   9051 	uint32_t reg, val;
   9052 	int i;
   9053 	uint8_t opc;
   9054 
   9055 	/* Clear SK and CS. */
   9056 	reg = CSR_READ(sc, WMREG_EECD) & ~(EECD_SK | EECD_CS);
   9057 	CSR_WRITE(sc, WMREG_EECD, reg);
   9058 	CSR_WRITE_FLUSH(sc);
   9059 	delay(2);
   9060 
   9061 	if (wm_nvm_ready_spi(sc))
   9062 		return 1;
   9063 
   9064 	/* Toggle CS to flush commands. */
   9065 	CSR_WRITE(sc, WMREG_EECD, reg | EECD_CS);
   9066 	CSR_WRITE_FLUSH(sc);
   9067 	delay(2);
   9068 	CSR_WRITE(sc, WMREG_EECD, reg);
   9069 	CSR_WRITE_FLUSH(sc);
   9070 	delay(2);
   9071 
   9072 	opc = SPI_OPC_READ;
   9073 	if (sc->sc_nvm_addrbits == 8 && word >= 128)
   9074 		opc |= SPI_OPC_A8;
   9075 
   9076 	wm_eeprom_sendbits(sc, opc, 8);
   9077 	wm_eeprom_sendbits(sc, word << 1, sc->sc_nvm_addrbits);
   9078 
   9079 	for (i = 0; i < wordcnt; i++) {
   9080 		wm_eeprom_recvbits(sc, &val, 16);
   9081 		data[i] = ((val >> 8) & 0xff) | ((val & 0xff) << 8);
   9082 	}
   9083 
   9084 	/* Raise CS and clear SK. */
   9085 	reg = (CSR_READ(sc, WMREG_EECD) & ~EECD_SK) | EECD_CS;
   9086 	CSR_WRITE(sc, WMREG_EECD, reg);
   9087 	CSR_WRITE_FLUSH(sc);
   9088 	delay(2);
   9089 
   9090 	return 0;
   9091 }
   9092 
   9093 /* Using with EERD */
   9094 
   9095 static int
   9096 wm_poll_eerd_eewr_done(struct wm_softc *sc, int rw)
   9097 {
   9098 	uint32_t attempts = 100000;
   9099 	uint32_t i, reg = 0;
   9100 	int32_t done = -1;
   9101 
   9102 	for (i = 0; i < attempts; i++) {
   9103 		reg = CSR_READ(sc, rw);
   9104 
   9105 		if (reg & EERD_DONE) {
   9106 			done = 0;
   9107 			break;
   9108 		}
   9109 		delay(5);
   9110 	}
   9111 
   9112 	return done;
   9113 }
   9114 
   9115 static int
   9116 wm_nvm_read_eerd(struct wm_softc *sc, int offset, int wordcnt,
   9117     uint16_t *data)
   9118 {
   9119 	int i, eerd = 0;
   9120 	int error = 0;
   9121 
   9122 	for (i = 0; i < wordcnt; i++) {
   9123 		eerd = ((offset + i) << EERD_ADDR_SHIFT) | EERD_START;
   9124 
   9125 		CSR_WRITE(sc, WMREG_EERD, eerd);
   9126 		error = wm_poll_eerd_eewr_done(sc, WMREG_EERD);
   9127 		if (error != 0)
   9128 			break;
   9129 
   9130 		data[i] = (CSR_READ(sc, WMREG_EERD) >> EERD_DATA_SHIFT);
   9131 	}
   9132 
   9133 	return error;
   9134 }
   9135 
   9136 /* Flash */
   9137 
   9138 static int
   9139 wm_nvm_valid_bank_detect_ich8lan(struct wm_softc *sc, unsigned int *bank)
   9140 {
   9141 	uint32_t eecd;
   9142 	uint32_t act_offset = ICH_NVM_SIG_WORD * 2 + 1;
   9143 	uint32_t bank1_offset = sc->sc_ich8_flash_bank_size * sizeof(uint16_t);
   9144 	uint8_t sig_byte = 0;
   9145 
   9146 	switch (sc->sc_type) {
   9147 	case WM_T_ICH8:
   9148 	case WM_T_ICH9:
   9149 		eecd = CSR_READ(sc, WMREG_EECD);
   9150 		if ((eecd & EECD_SEC1VAL_VALMASK) == EECD_SEC1VAL_VALMASK) {
   9151 			*bank = ((eecd & EECD_SEC1VAL) != 0) ? 1 : 0;
   9152 			return 0;
   9153 		}
   9154 		/* FALLTHROUGH */
   9155 	default:
   9156 		/* Default to 0 */
   9157 		*bank = 0;
   9158 
   9159 		/* Check bank 0 */
   9160 		wm_read_ich8_byte(sc, act_offset, &sig_byte);
   9161 		if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) {
   9162 			*bank = 0;
   9163 			return 0;
   9164 		}
   9165 
   9166 		/* Check bank 1 */
   9167 		wm_read_ich8_byte(sc, act_offset + bank1_offset,
   9168 		    &sig_byte);
   9169 		if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) {
   9170 			*bank = 1;
   9171 			return 0;
   9172 		}
   9173 	}
   9174 
   9175 	DPRINTF(WM_DEBUG_NVM, ("%s: No valid NVM bank present\n",
   9176 		device_xname(sc->sc_dev)));
   9177 	return -1;
   9178 }
   9179 
   9180 /******************************************************************************
   9181  * This function does initial flash setup so that a new read/write/erase cycle
   9182  * can be started.
   9183  *
   9184  * sc - The pointer to the hw structure
   9185  ****************************************************************************/
   9186 static int32_t
   9187 wm_ich8_cycle_init(struct wm_softc *sc)
   9188 {
   9189 	uint16_t hsfsts;
   9190 	int32_t error = 1;
   9191 	int32_t i     = 0;
   9192 
   9193 	hsfsts = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFSTS);
   9194 
   9195 	/* May be check the Flash Des Valid bit in Hw status */
   9196 	if ((hsfsts & HSFSTS_FLDVAL) == 0) {
   9197 		return error;
   9198 	}
   9199 
   9200 	/* Clear FCERR in Hw status by writing 1 */
   9201 	/* Clear DAEL in Hw status by writing a 1 */
   9202 	hsfsts |= HSFSTS_ERR | HSFSTS_DAEL;
   9203 
   9204 	ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFSTS, hsfsts);
   9205 
   9206 	/*
   9207 	 * Either we should have a hardware SPI cycle in progress bit to check
   9208 	 * against, in order to start a new cycle or FDONE bit should be
   9209 	 * changed in the hardware so that it is 1 after harware reset, which
   9210 	 * can then be used as an indication whether a cycle is in progress or
   9211 	 * has been completed .. we should also have some software semaphore
   9212 	 * mechanism to guard FDONE or the cycle in progress bit so that two
   9213 	 * threads access to those bits can be sequentiallized or a way so that
   9214 	 * 2 threads dont start the cycle at the same time
   9215 	 */
   9216 
   9217 	if ((hsfsts & HSFSTS_FLINPRO) == 0) {
   9218 		/*
   9219 		 * There is no cycle running at present, so we can start a
   9220 		 * cycle
   9221 		 */
   9222 
   9223 		/* Begin by setting Flash Cycle Done. */
   9224 		hsfsts |= HSFSTS_DONE;
   9225 		ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFSTS, hsfsts);
   9226 		error = 0;
   9227 	} else {
   9228 		/*
   9229 		 * otherwise poll for sometime so the current cycle has a
   9230 		 * chance to end before giving up.
   9231 		 */
   9232 		for (i = 0; i < ICH_FLASH_COMMAND_TIMEOUT; i++) {
   9233 			hsfsts = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFSTS);
   9234 			if ((hsfsts & HSFSTS_FLINPRO) == 0) {
   9235 				error = 0;
   9236 				break;
   9237 			}
   9238 			delay(1);
   9239 		}
   9240 		if (error == 0) {
   9241 			/*
   9242 			 * Successful in waiting for previous cycle to timeout,
   9243 			 * now set the Flash Cycle Done.
   9244 			 */
   9245 			hsfsts |= HSFSTS_DONE;
   9246 			ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFSTS, hsfsts);
   9247 		}
   9248 	}
   9249 	return error;
   9250 }
   9251 
   9252 /******************************************************************************
   9253  * This function starts a flash cycle and waits for its completion
   9254  *
   9255  * sc - The pointer to the hw structure
   9256  ****************************************************************************/
   9257 static int32_t
   9258 wm_ich8_flash_cycle(struct wm_softc *sc, uint32_t timeout)
   9259 {
   9260 	uint16_t hsflctl;
   9261 	uint16_t hsfsts;
   9262 	int32_t error = 1;
   9263 	uint32_t i = 0;
   9264 
   9265 	/* Start a cycle by writing 1 in Flash Cycle Go in Hw Flash Control */
   9266 	hsflctl = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFCTL);
   9267 	hsflctl |= HSFCTL_GO;
   9268 	ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFCTL, hsflctl);
   9269 
   9270 	/* Wait till FDONE bit is set to 1 */
   9271 	do {
   9272 		hsfsts = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFSTS);
   9273 		if (hsfsts & HSFSTS_DONE)
   9274 			break;
   9275 		delay(1);
   9276 		i++;
   9277 	} while (i < timeout);
   9278 	if ((hsfsts & HSFSTS_DONE) == 1 && (hsfsts & HSFSTS_ERR) == 0)
   9279 		error = 0;
   9280 
   9281 	return error;
   9282 }
   9283 
   9284 /******************************************************************************
   9285  * Reads a byte or word from the NVM using the ICH8 flash access registers.
   9286  *
   9287  * sc - The pointer to the hw structure
   9288  * index - The index of the byte or word to read.
   9289  * size - Size of data to read, 1=byte 2=word
   9290  * data - Pointer to the word to store the value read.
   9291  *****************************************************************************/
   9292 static int32_t
   9293 wm_read_ich8_data(struct wm_softc *sc, uint32_t index,
   9294     uint32_t size, uint16_t *data)
   9295 {
   9296 	uint16_t hsfsts;
   9297 	uint16_t hsflctl;
   9298 	uint32_t flash_linear_address;
   9299 	uint32_t flash_data = 0;
   9300 	int32_t error = 1;
   9301 	int32_t count = 0;
   9302 
   9303 	if (size < 1  || size > 2 || data == 0x0 ||
   9304 	    index > ICH_FLASH_LINEAR_ADDR_MASK)
   9305 		return error;
   9306 
   9307 	flash_linear_address = (ICH_FLASH_LINEAR_ADDR_MASK & index) +
   9308 	    sc->sc_ich8_flash_base;
   9309 
   9310 	do {
   9311 		delay(1);
   9312 		/* Steps */
   9313 		error = wm_ich8_cycle_init(sc);
   9314 		if (error)
   9315 			break;
   9316 
   9317 		hsflctl = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFCTL);
   9318 		/* 0b/1b corresponds to 1 or 2 byte size, respectively. */
   9319 		hsflctl |=  ((size - 1) << HSFCTL_BCOUNT_SHIFT)
   9320 		    & HSFCTL_BCOUNT_MASK;
   9321 		hsflctl |= ICH_CYCLE_READ << HSFCTL_CYCLE_SHIFT;
   9322 		ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFCTL, hsflctl);
   9323 
   9324 		/*
   9325 		 * Write the last 24 bits of index into Flash Linear address
   9326 		 * field in Flash Address
   9327 		 */
   9328 		/* TODO: TBD maybe check the index against the size of flash */
   9329 
   9330 		ICH8_FLASH_WRITE32(sc, ICH_FLASH_FADDR, flash_linear_address);
   9331 
   9332 		error = wm_ich8_flash_cycle(sc, ICH_FLASH_COMMAND_TIMEOUT);
   9333 
   9334 		/*
   9335 		 * Check if FCERR is set to 1, if set to 1, clear it and try
   9336 		 * the whole sequence a few more times, else read in (shift in)
   9337 		 * the Flash Data0, the order is least significant byte first
   9338 		 * msb to lsb
   9339 		 */
   9340 		if (error == 0) {
   9341 			flash_data = ICH8_FLASH_READ32(sc, ICH_FLASH_FDATA0);
   9342 			if (size == 1)
   9343 				*data = (uint8_t)(flash_data & 0x000000FF);
   9344 			else if (size == 2)
   9345 				*data = (uint16_t)(flash_data & 0x0000FFFF);
   9346 			break;
   9347 		} else {
   9348 			/*
   9349 			 * If we've gotten here, then things are probably
   9350 			 * completely hosed, but if the error condition is
   9351 			 * detected, it won't hurt to give it another try...
   9352 			 * ICH_FLASH_CYCLE_REPEAT_COUNT times.
   9353 			 */
   9354 			hsfsts = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFSTS);
   9355 			if (hsfsts & HSFSTS_ERR) {
   9356 				/* Repeat for some time before giving up. */
   9357 				continue;
   9358 			} else if ((hsfsts & HSFSTS_DONE) == 0)
   9359 				break;
   9360 		}
   9361 	} while (count++ < ICH_FLASH_CYCLE_REPEAT_COUNT);
   9362 
   9363 	return error;
   9364 }
   9365 
   9366 /******************************************************************************
   9367  * Reads a single byte from the NVM using the ICH8 flash access registers.
   9368  *
   9369  * sc - pointer to wm_hw structure
   9370  * index - The index of the byte to read.
   9371  * data - Pointer to a byte to store the value read.
   9372  *****************************************************************************/
   9373 static int32_t
   9374 wm_read_ich8_byte(struct wm_softc *sc, uint32_t index, uint8_t* data)
   9375 {
   9376 	int32_t status;
   9377 	uint16_t word = 0;
   9378 
   9379 	status = wm_read_ich8_data(sc, index, 1, &word);
   9380 	if (status == 0)
   9381 		*data = (uint8_t)word;
   9382 	else
   9383 		*data = 0;
   9384 
   9385 	return status;
   9386 }
   9387 
   9388 /******************************************************************************
   9389  * Reads a word from the NVM using the ICH8 flash access registers.
   9390  *
   9391  * sc - pointer to wm_hw structure
   9392  * index - The starting byte index of the word to read.
   9393  * data - Pointer to a word to store the value read.
   9394  *****************************************************************************/
   9395 static int32_t
   9396 wm_read_ich8_word(struct wm_softc *sc, uint32_t index, uint16_t *data)
   9397 {
   9398 	int32_t status;
   9399 
   9400 	status = wm_read_ich8_data(sc, index, 2, data);
   9401 	return status;
   9402 }
   9403 
   9404 /******************************************************************************
   9405  * Reads a 16 bit word or words from the EEPROM using the ICH8's flash access
   9406  * register.
   9407  *
   9408  * sc - Struct containing variables accessed by shared code
   9409  * offset - offset of word in the EEPROM to read
   9410  * data - word read from the EEPROM
   9411  * words - number of words to read
   9412  *****************************************************************************/
   9413 static int
   9414 wm_nvm_read_ich8(struct wm_softc *sc, int offset, int words, uint16_t *data)
   9415 {
   9416 	int32_t  error = 0;
   9417 	uint32_t flash_bank = 0;
   9418 	uint32_t act_offset = 0;
   9419 	uint32_t bank_offset = 0;
   9420 	uint16_t word = 0;
   9421 	uint16_t i = 0;
   9422 
   9423 	/*
   9424 	 * We need to know which is the valid flash bank.  In the event
   9425 	 * that we didn't allocate eeprom_shadow_ram, we may not be
   9426 	 * managing flash_bank.  So it cannot be trusted and needs
   9427 	 * to be updated with each read.
   9428 	 */
   9429 	error = wm_nvm_valid_bank_detect_ich8lan(sc, &flash_bank);
   9430 	if (error) {
   9431 		DPRINTF(WM_DEBUG_NVM, ("%s: failed to detect NVM bank\n",
   9432 			device_xname(sc->sc_dev)));
   9433 		flash_bank = 0;
   9434 	}
   9435 
   9436 	/*
   9437 	 * Adjust offset appropriately if we're on bank 1 - adjust for word
   9438 	 * size
   9439 	 */
   9440 	bank_offset = flash_bank * (sc->sc_ich8_flash_bank_size * 2);
   9441 
   9442 	error = wm_get_swfwhw_semaphore(sc);
   9443 	if (error) {
   9444 		aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
   9445 		    __func__);
   9446 		return error;
   9447 	}
   9448 
   9449 	for (i = 0; i < words; i++) {
   9450 		/* The NVM part needs a byte offset, hence * 2 */
   9451 		act_offset = bank_offset + ((offset + i) * 2);
   9452 		error = wm_read_ich8_word(sc, act_offset, &word);
   9453 		if (error) {
   9454 			aprint_error_dev(sc->sc_dev,
   9455 			    "%s: failed to read NVM\n", __func__);
   9456 			break;
   9457 		}
   9458 		data[i] = word;
   9459 	}
   9460 
   9461 	wm_put_swfwhw_semaphore(sc);
   9462 	return error;
   9463 }
   9464 
   9465 /* iNVM */
   9466 
   9467 static int
   9468 wm_nvm_read_word_invm(struct wm_softc *sc, uint16_t address, uint16_t *data)
   9469 {
   9470 	int32_t  rv = 0;
   9471 	uint32_t invm_dword;
   9472 	uint16_t i;
   9473 	uint8_t record_type, word_address;
   9474 
   9475 	for (i = 0; i < INVM_SIZE; i++) {
   9476 		invm_dword = CSR_READ(sc, WM_INVM_DATA_REG(i));
   9477 		/* Get record type */
   9478 		record_type = INVM_DWORD_TO_RECORD_TYPE(invm_dword);
   9479 		if (record_type == INVM_UNINITIALIZED_STRUCTURE)
   9480 			break;
   9481 		if (record_type == INVM_CSR_AUTOLOAD_STRUCTURE)
   9482 			i += INVM_CSR_AUTOLOAD_DATA_SIZE_IN_DWORDS;
   9483 		if (record_type == INVM_RSA_KEY_SHA256_STRUCTURE)
   9484 			i += INVM_RSA_KEY_SHA256_DATA_SIZE_IN_DWORDS;
   9485 		if (record_type == INVM_WORD_AUTOLOAD_STRUCTURE) {
   9486 			word_address = INVM_DWORD_TO_WORD_ADDRESS(invm_dword);
   9487 			if (word_address == address) {
   9488 				*data = INVM_DWORD_TO_WORD_DATA(invm_dword);
   9489 				rv = 0;
   9490 				break;
   9491 			}
   9492 		}
   9493 	}
   9494 
   9495 	return rv;
   9496 }
   9497 
   9498 static int
   9499 wm_nvm_read_invm(struct wm_softc *sc, int offset, int words, uint16_t *data)
   9500 {
   9501 	int rv = 0;
   9502 	int i;
   9503 
   9504 	for (i = 0; i < words; i++) {
   9505 		switch (offset + i) {
   9506 		case NVM_OFF_MACADDR:
   9507 		case NVM_OFF_MACADDR1:
   9508 		case NVM_OFF_MACADDR2:
   9509 			rv = wm_nvm_read_word_invm(sc, offset + i, &data[i]);
   9510 			if (rv != 0) {
   9511 				data[i] = 0xffff;
   9512 				rv = -1;
   9513 			}
   9514 			break;
   9515 		case NVM_OFF_CFG2:
   9516 			rv = wm_nvm_read_word_invm(sc, offset, data);
   9517 			if (rv != 0) {
   9518 				*data = NVM_INIT_CTRL_2_DEFAULT_I211;
   9519 				rv = 0;
   9520 			}
   9521 			break;
   9522 		case NVM_OFF_CFG4:
   9523 			rv = wm_nvm_read_word_invm(sc, offset, data);
   9524 			if (rv != 0) {
   9525 				*data = NVM_INIT_CTRL_4_DEFAULT_I211;
   9526 				rv = 0;
   9527 			}
   9528 			break;
   9529 		case NVM_OFF_LED_1_CFG:
   9530 			rv = wm_nvm_read_word_invm(sc, offset, data);
   9531 			if (rv != 0) {
   9532 				*data = NVM_LED_1_CFG_DEFAULT_I211;
   9533 				rv = 0;
   9534 			}
   9535 			break;
   9536 		case NVM_OFF_LED_0_2_CFG:
   9537 			rv = wm_nvm_read_word_invm(sc, offset, data);
   9538 			if (rv != 0) {
   9539 				*data = NVM_LED_0_2_CFG_DEFAULT_I211;
   9540 				rv = 0;
   9541 			}
   9542 			break;
   9543 		case NVM_OFF_ID_LED_SETTINGS:
   9544 			rv = wm_nvm_read_word_invm(sc, offset, data);
   9545 			if (rv != 0) {
   9546 				*data = ID_LED_RESERVED_FFFF;
   9547 				rv = 0;
   9548 			}
   9549 			break;
   9550 		default:
   9551 			DPRINTF(WM_DEBUG_NVM,
   9552 			    ("NVM word 0x%02x is not mapped.\n", offset));
   9553 			*data = NVM_RESERVED_WORD;
   9554 			break;
   9555 		}
   9556 	}
   9557 
   9558 	return rv;
   9559 }
   9560 
   9561 /* Lock, detecting NVM type, validate checksum, version and read */
   9562 
   9563 /*
   9564  * wm_nvm_acquire:
   9565  *
   9566  *	Perform the EEPROM handshake required on some chips.
   9567  */
   9568 static int
   9569 wm_nvm_acquire(struct wm_softc *sc)
   9570 {
   9571 	uint32_t reg;
   9572 	int x;
   9573 	int ret = 0;
   9574 
   9575 	/* always success */
   9576 	if ((sc->sc_flags & WM_F_EEPROM_FLASH) != 0)
   9577 		return 0;
   9578 
   9579 	if (sc->sc_flags & WM_F_LOCK_EXTCNF) {
   9580 		ret = wm_get_swfwhw_semaphore(sc);
   9581 	} else if (sc->sc_flags & WM_F_LOCK_SWFW) {
   9582 		/* This will also do wm_get_swsm_semaphore() if needed */
   9583 		ret = wm_get_swfw_semaphore(sc, SWFW_EEP_SM);
   9584 	} else if (sc->sc_flags & WM_F_LOCK_SWSM) {
   9585 		ret = wm_get_swsm_semaphore(sc);
   9586 	}
   9587 
   9588 	if (ret) {
   9589 		aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
   9590 			__func__);
   9591 		return 1;
   9592 	}
   9593 
   9594 	if (sc->sc_flags & WM_F_LOCK_EECD) {
   9595 		reg = CSR_READ(sc, WMREG_EECD);
   9596 
   9597 		/* Request EEPROM access. */
   9598 		reg |= EECD_EE_REQ;
   9599 		CSR_WRITE(sc, WMREG_EECD, reg);
   9600 
   9601 		/* ..and wait for it to be granted. */
   9602 		for (x = 0; x < 1000; x++) {
   9603 			reg = CSR_READ(sc, WMREG_EECD);
   9604 			if (reg & EECD_EE_GNT)
   9605 				break;
   9606 			delay(5);
   9607 		}
   9608 		if ((reg & EECD_EE_GNT) == 0) {
   9609 			aprint_error_dev(sc->sc_dev,
   9610 			    "could not acquire EEPROM GNT\n");
   9611 			reg &= ~EECD_EE_REQ;
   9612 			CSR_WRITE(sc, WMREG_EECD, reg);
   9613 			if (sc->sc_flags & WM_F_LOCK_EXTCNF)
   9614 				wm_put_swfwhw_semaphore(sc);
   9615 			if (sc->sc_flags & WM_F_LOCK_SWFW)
   9616 				wm_put_swfw_semaphore(sc, SWFW_EEP_SM);
   9617 			else if (sc->sc_flags & WM_F_LOCK_SWSM)
   9618 				wm_put_swsm_semaphore(sc);
   9619 			return 1;
   9620 		}
   9621 	}
   9622 
   9623 	return 0;
   9624 }
   9625 
   9626 /*
   9627  * wm_nvm_release:
   9628  *
   9629  *	Release the EEPROM mutex.
   9630  */
   9631 static void
   9632 wm_nvm_release(struct wm_softc *sc)
   9633 {
   9634 	uint32_t reg;
   9635 
   9636 	/* always success */
   9637 	if ((sc->sc_flags & WM_F_EEPROM_FLASH) != 0)
   9638 		return;
   9639 
   9640 	if (sc->sc_flags & WM_F_LOCK_EECD) {
   9641 		reg = CSR_READ(sc, WMREG_EECD);
   9642 		reg &= ~EECD_EE_REQ;
   9643 		CSR_WRITE(sc, WMREG_EECD, reg);
   9644 	}
   9645 
   9646 	if (sc->sc_flags & WM_F_LOCK_EXTCNF)
   9647 		wm_put_swfwhw_semaphore(sc);
   9648 	if (sc->sc_flags & WM_F_LOCK_SWFW)
   9649 		wm_put_swfw_semaphore(sc, SWFW_EEP_SM);
   9650 	else if (sc->sc_flags & WM_F_LOCK_SWSM)
   9651 		wm_put_swsm_semaphore(sc);
   9652 }
   9653 
   9654 static int
   9655 wm_nvm_is_onboard_eeprom(struct wm_softc *sc)
   9656 {
   9657 	uint32_t eecd = 0;
   9658 
   9659 	if (sc->sc_type == WM_T_82573 || sc->sc_type == WM_T_82574
   9660 	    || sc->sc_type == WM_T_82583) {
   9661 		eecd = CSR_READ(sc, WMREG_EECD);
   9662 
   9663 		/* Isolate bits 15 & 16 */
   9664 		eecd = ((eecd >> 15) & 0x03);
   9665 
   9666 		/* If both bits are set, device is Flash type */
   9667 		if (eecd == 0x03)
   9668 			return 0;
   9669 	}
   9670 	return 1;
   9671 }
   9672 
   9673 static int
   9674 wm_nvm_get_flash_presence_i210(struct wm_softc *sc)
   9675 {
   9676 	uint32_t eec;
   9677 
   9678 	eec = CSR_READ(sc, WMREG_EEC);
   9679 	if ((eec & EEC_FLASH_DETECTED) != 0)
   9680 		return 1;
   9681 
   9682 	return 0;
   9683 }
   9684 
   9685 /*
   9686  * wm_nvm_validate_checksum
   9687  *
   9688  * The checksum is defined as the sum of the first 64 (16 bit) words.
   9689  */
   9690 static int
   9691 wm_nvm_validate_checksum(struct wm_softc *sc)
   9692 {
   9693 	uint16_t checksum;
   9694 	uint16_t eeprom_data;
   9695 #ifdef WM_DEBUG
   9696 	uint16_t csum_wordaddr, valid_checksum;
   9697 #endif
   9698 	int i;
   9699 
   9700 	checksum = 0;
   9701 
   9702 	/* Don't check for I211 */
   9703 	if (sc->sc_type == WM_T_I211)
   9704 		return 0;
   9705 
   9706 #ifdef WM_DEBUG
   9707 	if (sc->sc_type == WM_T_PCH_LPT) {
   9708 		csum_wordaddr = NVM_OFF_COMPAT;
   9709 		valid_checksum = NVM_COMPAT_VALID_CHECKSUM;
   9710 	} else {
   9711 		csum_wordaddr = NVM_OFF_FUTURE_INIT_WORD1;
   9712 		valid_checksum = NVM_FUTURE_INIT_WORD1_VALID_CHECKSUM;
   9713 	}
   9714 
   9715 	/* Dump EEPROM image for debug */
   9716 	if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
   9717 	    || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
   9718 	    || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)) {
   9719 		wm_nvm_read(sc, csum_wordaddr, 1, &eeprom_data);
   9720 		if ((eeprom_data & valid_checksum) == 0) {
   9721 			DPRINTF(WM_DEBUG_NVM,
   9722 			    ("%s: NVM need to be updated (%04x != %04x)\n",
   9723 				device_xname(sc->sc_dev), eeprom_data,
   9724 				    valid_checksum));
   9725 		}
   9726 	}
   9727 
   9728 	if ((wm_debug & WM_DEBUG_NVM) != 0) {
   9729 		printf("%s: NVM dump:\n", device_xname(sc->sc_dev));
   9730 		for (i = 0; i < NVM_SIZE; i++) {
   9731 			if (wm_nvm_read(sc, i, 1, &eeprom_data))
   9732 				printf("XXXX ");
   9733 			else
   9734 				printf("%04hx ", eeprom_data);
   9735 			if (i % 8 == 7)
   9736 				printf("\n");
   9737 		}
   9738 	}
   9739 
   9740 #endif /* WM_DEBUG */
   9741 
   9742 	for (i = 0; i < NVM_SIZE; i++) {
   9743 		if (wm_nvm_read(sc, i, 1, &eeprom_data))
   9744 			return 1;
   9745 		checksum += eeprom_data;
   9746 	}
   9747 
   9748 	if (checksum != (uint16_t) NVM_CHECKSUM) {
   9749 #ifdef WM_DEBUG
   9750 		printf("%s: NVM checksum mismatch (%04x != %04x)\n",
   9751 		    device_xname(sc->sc_dev), checksum, NVM_CHECKSUM);
   9752 #endif
   9753 	}
   9754 
   9755 	return 0;
   9756 }
   9757 
   9758 static void
   9759 wm_nvm_version_invm(struct wm_softc *sc)
   9760 {
   9761 	uint32_t dword;
   9762 
   9763 	/*
   9764 	 * Linux's code to decode version is very strange, so we don't
   9765 	 * obey that algorithm and just use word 61 as the document.
   9766 	 * Perhaps it's not perfect though...
   9767 	 *
   9768 	 * Example:
   9769 	 *
   9770 	 *   Word61: 00800030 -> Version 0.6 (I211 spec update notes about 0.6)
   9771 	 */
   9772 	dword = CSR_READ(sc, WM_INVM_DATA_REG(61));
   9773 	dword = __SHIFTOUT(dword, INVM_VER_1);
   9774 	sc->sc_nvm_ver_major = __SHIFTOUT(dword, INVM_MAJOR);
   9775 	sc->sc_nvm_ver_minor = __SHIFTOUT(dword, INVM_MINOR);
   9776 }
   9777 
   9778 static void
   9779 wm_nvm_version(struct wm_softc *sc)
   9780 {
   9781 	uint16_t major, minor, build, patch;
   9782 	uint16_t uid0, uid1;
   9783 	uint16_t nvm_data;
   9784 	uint16_t off;
   9785 	bool check_version = false;
   9786 	bool check_optionrom = false;
   9787 	bool have_build = false;
   9788 
   9789 	/*
   9790 	 * Version format:
   9791 	 *
   9792 	 * XYYZ
   9793 	 * X0YZ
   9794 	 * X0YY
   9795 	 *
   9796 	 * Example:
   9797 	 *
   9798 	 *	82571	0x50a2	5.10.2?	(the spec update notes about 5.6-5.10)
   9799 	 *	82571	0x50a6	5.10.6?
   9800 	 *	82572	0x506a	5.6.10?
   9801 	 *	82572EI	0x5069	5.6.9?
   9802 	 *	82574L	0x1080	1.8.0?	(the spec update notes about 2.1.4)
   9803 	 *		0x2013	2.1.3?
   9804 	 *	82583	0x10a0	1.10.0? (document says it's default vaule)
   9805 	 */
   9806 	wm_nvm_read(sc, NVM_OFF_IMAGE_UID1, 1, &uid1);
   9807 	switch (sc->sc_type) {
   9808 	case WM_T_82571:
   9809 	case WM_T_82572:
   9810 	case WM_T_82574:
   9811 		check_version = true;
   9812 		check_optionrom = true;
   9813 		have_build = true;
   9814 		break;
   9815 	case WM_T_82575:
   9816 	case WM_T_82576:
   9817 	case WM_T_82580:
   9818 		if ((uid1 & NVM_MAJOR_MASK) != NVM_UID_VALID)
   9819 			check_version = true;
   9820 		break;
   9821 	case WM_T_I211:
   9822 		wm_nvm_version_invm(sc);
   9823 		goto printver;
   9824 	case WM_T_I210:
   9825 		if (!wm_nvm_get_flash_presence_i210(sc)) {
   9826 			wm_nvm_version_invm(sc);
   9827 			goto printver;
   9828 		}
   9829 		/* FALLTHROUGH */
   9830 	case WM_T_I350:
   9831 	case WM_T_I354:
   9832 		check_version = true;
   9833 		check_optionrom = true;
   9834 		break;
   9835 	default:
   9836 		return;
   9837 	}
   9838 	if (check_version) {
   9839 		wm_nvm_read(sc, NVM_OFF_VERSION, 1, &nvm_data);
   9840 		major = (nvm_data & NVM_MAJOR_MASK) >> NVM_MAJOR_SHIFT;
   9841 		if (have_build || ((nvm_data & 0x0f00) != 0x0000)) {
   9842 			minor = (nvm_data & NVM_MINOR_MASK) >> NVM_MINOR_SHIFT;
   9843 			build = nvm_data & NVM_BUILD_MASK;
   9844 			have_build = true;
   9845 		} else
   9846 			minor = nvm_data & 0x00ff;
   9847 
   9848 		/* Decimal */
   9849 		minor = (minor / 16) * 10 + (minor % 16);
   9850 		sc->sc_nvm_ver_major = major;
   9851 		sc->sc_nvm_ver_minor = minor;
   9852 
   9853 printver:
   9854 		aprint_verbose(", version %d.%d", sc->sc_nvm_ver_major,
   9855 		    sc->sc_nvm_ver_minor);
   9856 		if (have_build)
   9857 			aprint_verbose(".%d", build);
   9858 	}
   9859 	if (check_optionrom) {
   9860 		wm_nvm_read(sc, NVM_OFF_COMB_VER_PTR, 1, &off);
   9861 		/* Option ROM Version */
   9862 		if ((off != 0x0000) && (off != 0xffff)) {
   9863 			off += NVM_COMBO_VER_OFF;
   9864 			wm_nvm_read(sc, off + 1, 1, &uid1);
   9865 			wm_nvm_read(sc, off, 1, &uid0);
   9866 			if ((uid0 != 0) && (uid0 != 0xffff)
   9867 			    && (uid1 != 0) && (uid1 != 0xffff)) {
   9868 				/* 16bits */
   9869 				major = uid0 >> 8;
   9870 				build = (uid0 << 8) | (uid1 >> 8);
   9871 				patch = uid1 & 0x00ff;
   9872 				aprint_verbose(", option ROM Version %d.%d.%d",
   9873 				    major, build, patch);
   9874 			}
   9875 		}
   9876 	}
   9877 
   9878 	wm_nvm_read(sc, NVM_OFF_IMAGE_UID0, 1, &uid0);
   9879 	aprint_verbose(", Image Unique ID %08x", (uid1 << 16) | uid0);
   9880 }
   9881 
   9882 /*
   9883  * wm_nvm_read:
   9884  *
   9885  *	Read data from the serial EEPROM.
   9886  */
   9887 static int
   9888 wm_nvm_read(struct wm_softc *sc, int word, int wordcnt, uint16_t *data)
   9889 {
   9890 	int rv;
   9891 
   9892 	if (sc->sc_flags & WM_F_EEPROM_INVALID)
   9893 		return 1;
   9894 
   9895 	if (wm_nvm_acquire(sc))
   9896 		return 1;
   9897 
   9898 	if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
   9899 	    || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
   9900 	    || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT))
   9901 		rv = wm_nvm_read_ich8(sc, word, wordcnt, data);
   9902 	else if (sc->sc_flags & WM_F_EEPROM_INVM)
   9903 		rv = wm_nvm_read_invm(sc, word, wordcnt, data);
   9904 	else if (sc->sc_flags & WM_F_EEPROM_EERDEEWR)
   9905 		rv = wm_nvm_read_eerd(sc, word, wordcnt, data);
   9906 	else if (sc->sc_flags & WM_F_EEPROM_SPI)
   9907 		rv = wm_nvm_read_spi(sc, word, wordcnt, data);
   9908 	else
   9909 		rv = wm_nvm_read_uwire(sc, word, wordcnt, data);
   9910 
   9911 	wm_nvm_release(sc);
   9912 	return rv;
   9913 }
   9914 
   9915 /*
   9916  * Hardware semaphores.
   9917  * Very complexed...
   9918  */
   9919 
   9920 static int
   9921 wm_get_swsm_semaphore(struct wm_softc *sc)
   9922 {
   9923 	int32_t timeout;
   9924 	uint32_t swsm;
   9925 
   9926 	if (sc->sc_flags & WM_F_LOCK_SWSM) {
   9927 		/* Get the SW semaphore. */
   9928 		timeout = sc->sc_nvm_wordsize + 1;
   9929 		while (timeout) {
   9930 			swsm = CSR_READ(sc, WMREG_SWSM);
   9931 
   9932 			if ((swsm & SWSM_SMBI) == 0)
   9933 				break;
   9934 
   9935 			delay(50);
   9936 			timeout--;
   9937 		}
   9938 
   9939 		if (timeout == 0) {
   9940 			aprint_error_dev(sc->sc_dev,
   9941 			    "could not acquire SWSM SMBI\n");
   9942 			return 1;
   9943 		}
   9944 	}
   9945 
   9946 	/* Get the FW semaphore. */
   9947 	timeout = sc->sc_nvm_wordsize + 1;
   9948 	while (timeout) {
   9949 		swsm = CSR_READ(sc, WMREG_SWSM);
   9950 		swsm |= SWSM_SWESMBI;
   9951 		CSR_WRITE(sc, WMREG_SWSM, swsm);
   9952 		/* If we managed to set the bit we got the semaphore. */
   9953 		swsm = CSR_READ(sc, WMREG_SWSM);
   9954 		if (swsm & SWSM_SWESMBI)
   9955 			break;
   9956 
   9957 		delay(50);
   9958 		timeout--;
   9959 	}
   9960 
   9961 	if (timeout == 0) {
   9962 		aprint_error_dev(sc->sc_dev, "could not acquire SWSM SWESMBI\n");
   9963 		/* Release semaphores */
   9964 		wm_put_swsm_semaphore(sc);
   9965 		return 1;
   9966 	}
   9967 	return 0;
   9968 }
   9969 
   9970 static void
   9971 wm_put_swsm_semaphore(struct wm_softc *sc)
   9972 {
   9973 	uint32_t swsm;
   9974 
   9975 	swsm = CSR_READ(sc, WMREG_SWSM);
   9976 	swsm &= ~(SWSM_SMBI | SWSM_SWESMBI);
   9977 	CSR_WRITE(sc, WMREG_SWSM, swsm);
   9978 }
   9979 
   9980 static int
   9981 wm_get_swfw_semaphore(struct wm_softc *sc, uint16_t mask)
   9982 {
   9983 	uint32_t swfw_sync;
   9984 	uint32_t swmask = mask << SWFW_SOFT_SHIFT;
   9985 	uint32_t fwmask = mask << SWFW_FIRM_SHIFT;
   9986 	int timeout = 200;
   9987 
   9988 	for (timeout = 0; timeout < 200; timeout++) {
   9989 		if (sc->sc_flags & WM_F_LOCK_SWSM) {
   9990 			if (wm_get_swsm_semaphore(sc)) {
   9991 				aprint_error_dev(sc->sc_dev,
   9992 				    "%s: failed to get semaphore\n",
   9993 				    __func__);
   9994 				return 1;
   9995 			}
   9996 		}
   9997 		swfw_sync = CSR_READ(sc, WMREG_SW_FW_SYNC);
   9998 		if ((swfw_sync & (swmask | fwmask)) == 0) {
   9999 			swfw_sync |= swmask;
   10000 			CSR_WRITE(sc, WMREG_SW_FW_SYNC, swfw_sync);
   10001 			if (sc->sc_flags & WM_F_LOCK_SWSM)
   10002 				wm_put_swsm_semaphore(sc);
   10003 			return 0;
   10004 		}
   10005 		if (sc->sc_flags & WM_F_LOCK_SWSM)
   10006 			wm_put_swsm_semaphore(sc);
   10007 		delay(5000);
   10008 	}
   10009 	printf("%s: failed to get swfw semaphore mask 0x%x swfw 0x%x\n",
   10010 	    device_xname(sc->sc_dev), mask, swfw_sync);
   10011 	return 1;
   10012 }
   10013 
   10014 static void
   10015 wm_put_swfw_semaphore(struct wm_softc *sc, uint16_t mask)
   10016 {
   10017 	uint32_t swfw_sync;
   10018 
   10019 	if (sc->sc_flags & WM_F_LOCK_SWSM) {
   10020 		while (wm_get_swsm_semaphore(sc) != 0)
   10021 			continue;
   10022 	}
   10023 	swfw_sync = CSR_READ(sc, WMREG_SW_FW_SYNC);
   10024 	swfw_sync &= ~(mask << SWFW_SOFT_SHIFT);
   10025 	CSR_WRITE(sc, WMREG_SW_FW_SYNC, swfw_sync);
   10026 	if (sc->sc_flags & WM_F_LOCK_SWSM)
   10027 		wm_put_swsm_semaphore(sc);
   10028 }
   10029 
   10030 static int
   10031 wm_get_swfwhw_semaphore(struct wm_softc *sc)
   10032 {
   10033 	uint32_t ext_ctrl;
   10034 	int timeout = 200;
   10035 
   10036 	for (timeout = 0; timeout < 200; timeout++) {
   10037 		ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
   10038 		ext_ctrl |= EXTCNFCTR_MDIO_SW_OWNERSHIP;
   10039 		CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl);
   10040 
   10041 		ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
   10042 		if (ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP)
   10043 			return 0;
   10044 		delay(5000);
   10045 	}
   10046 	printf("%s: failed to get swfwhw semaphore ext_ctrl 0x%x\n",
   10047 	    device_xname(sc->sc_dev), ext_ctrl);
   10048 	return 1;
   10049 }
   10050 
   10051 static void
   10052 wm_put_swfwhw_semaphore(struct wm_softc *sc)
   10053 {
   10054 	uint32_t ext_ctrl;
   10055 	ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
   10056 	ext_ctrl &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP;
   10057 	CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl);
   10058 }
   10059 
   10060 static int
   10061 wm_get_hw_semaphore_82573(struct wm_softc *sc)
   10062 {
   10063 	int i = 0;
   10064 	uint32_t reg;
   10065 
   10066 	reg = CSR_READ(sc, WMREG_EXTCNFCTR);
   10067 	do {
   10068 		CSR_WRITE(sc, WMREG_EXTCNFCTR,
   10069 		    reg | EXTCNFCTR_MDIO_SW_OWNERSHIP);
   10070 		reg = CSR_READ(sc, WMREG_EXTCNFCTR);
   10071 		if ((reg & EXTCNFCTR_MDIO_SW_OWNERSHIP) != 0)
   10072 			break;
   10073 		delay(2*1000);
   10074 		i++;
   10075 	} while (i < WM_MDIO_OWNERSHIP_TIMEOUT);
   10076 
   10077 	if (i == WM_MDIO_OWNERSHIP_TIMEOUT) {
   10078 		wm_put_hw_semaphore_82573(sc);
   10079 		log(LOG_ERR, "%s: Driver can't access the PHY\n",
   10080 		    device_xname(sc->sc_dev));
   10081 		return -1;
   10082 	}
   10083 
   10084 	return 0;
   10085 }
   10086 
   10087 static void
   10088 wm_put_hw_semaphore_82573(struct wm_softc *sc)
   10089 {
   10090 	uint32_t reg;
   10091 
   10092 	reg = CSR_READ(sc, WMREG_EXTCNFCTR);
   10093 	reg &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP;
   10094 	CSR_WRITE(sc, WMREG_EXTCNFCTR, reg);
   10095 }
   10096 
   10097 /*
   10098  * Management mode and power management related subroutines.
   10099  * BMC, AMT, suspend/resume and EEE.
   10100  */
   10101 
   10102 static int
   10103 wm_check_mng_mode(struct wm_softc *sc)
   10104 {
   10105 	int rv;
   10106 
   10107 	switch (sc->sc_type) {
   10108 	case WM_T_ICH8:
   10109 	case WM_T_ICH9:
   10110 	case WM_T_ICH10:
   10111 	case WM_T_PCH:
   10112 	case WM_T_PCH2:
   10113 	case WM_T_PCH_LPT:
   10114 		rv = wm_check_mng_mode_ich8lan(sc);
   10115 		break;
   10116 	case WM_T_82574:
   10117 	case WM_T_82583:
   10118 		rv = wm_check_mng_mode_82574(sc);
   10119 		break;
   10120 	case WM_T_82571:
   10121 	case WM_T_82572:
   10122 	case WM_T_82573:
   10123 	case WM_T_80003:
   10124 		rv = wm_check_mng_mode_generic(sc);
   10125 		break;
   10126 	default:
   10127 		/* noting to do */
   10128 		rv = 0;
   10129 		break;
   10130 	}
   10131 
   10132 	return rv;
   10133 }
   10134 
   10135 static int
   10136 wm_check_mng_mode_ich8lan(struct wm_softc *sc)
   10137 {
   10138 	uint32_t fwsm;
   10139 
   10140 	fwsm = CSR_READ(sc, WMREG_FWSM);
   10141 
   10142 	if ((fwsm & FWSM_MODE_MASK) == (MNG_ICH_IAMT_MODE << FWSM_MODE_SHIFT))
   10143 		return 1;
   10144 
   10145 	return 0;
   10146 }
   10147 
   10148 static int
   10149 wm_check_mng_mode_82574(struct wm_softc *sc)
   10150 {
   10151 	uint16_t data;
   10152 
   10153 	wm_nvm_read(sc, NVM_OFF_CFG2, 1, &data);
   10154 
   10155 	if ((data & NVM_CFG2_MNGM_MASK) != 0)
   10156 		return 1;
   10157 
   10158 	return 0;
   10159 }
   10160 
   10161 static int
   10162 wm_check_mng_mode_generic(struct wm_softc *sc)
   10163 {
   10164 	uint32_t fwsm;
   10165 
   10166 	fwsm = CSR_READ(sc, WMREG_FWSM);
   10167 
   10168 	if ((fwsm & FWSM_MODE_MASK) == (MNG_IAMT_MODE << FWSM_MODE_SHIFT))
   10169 		return 1;
   10170 
   10171 	return 0;
   10172 }
   10173 
   10174 static int
   10175 wm_enable_mng_pass_thru(struct wm_softc *sc)
   10176 {
   10177 	uint32_t manc, fwsm, factps;
   10178 
   10179 	if ((sc->sc_flags & WM_F_ASF_FIRMWARE_PRES) == 0)
   10180 		return 0;
   10181 
   10182 	manc = CSR_READ(sc, WMREG_MANC);
   10183 
   10184 	DPRINTF(WM_DEBUG_MANAGE, ("%s: MANC (%08x)\n",
   10185 		device_xname(sc->sc_dev), manc));
   10186 	if ((manc & MANC_RECV_TCO_EN) == 0)
   10187 		return 0;
   10188 
   10189 	if ((sc->sc_flags & WM_F_ARC_SUBSYS_VALID) != 0) {
   10190 		fwsm = CSR_READ(sc, WMREG_FWSM);
   10191 		factps = CSR_READ(sc, WMREG_FACTPS);
   10192 		if (((factps & FACTPS_MNGCG) == 0)
   10193 		    && ((fwsm & FWSM_MODE_MASK)
   10194 			== (MNG_ICH_IAMT_MODE << FWSM_MODE_SHIFT)))
   10195 			return 1;
   10196 	} else if ((sc->sc_type == WM_T_82574) || (sc->sc_type == WM_T_82583)){
   10197 		uint16_t data;
   10198 
   10199 		factps = CSR_READ(sc, WMREG_FACTPS);
   10200 		wm_nvm_read(sc, NVM_OFF_CFG2, 1, &data);
   10201 		DPRINTF(WM_DEBUG_MANAGE, ("%s: FACTPS = %08x, CFG2=%04x\n",
   10202 			device_xname(sc->sc_dev), factps, data));
   10203 		if (((factps & FACTPS_MNGCG) == 0)
   10204 		    && ((data & NVM_CFG2_MNGM_MASK)
   10205 			== (NVM_CFG2_MNGM_PT << NVM_CFG2_MNGM_SHIFT)))
   10206 			return 1;
   10207 	} else if (((manc & MANC_SMBUS_EN) != 0)
   10208 	    && ((manc & MANC_ASF_EN) == 0))
   10209 		return 1;
   10210 
   10211 	return 0;
   10212 }
   10213 
   10214 static int
   10215 wm_check_reset_block(struct wm_softc *sc)
   10216 {
   10217 	uint32_t reg;
   10218 
   10219 	switch (sc->sc_type) {
   10220 	case WM_T_ICH8:
   10221 	case WM_T_ICH9:
   10222 	case WM_T_ICH10:
   10223 	case WM_T_PCH:
   10224 	case WM_T_PCH2:
   10225 	case WM_T_PCH_LPT:
   10226 		reg = CSR_READ(sc, WMREG_FWSM);
   10227 		if ((reg & FWSM_RSPCIPHY) != 0)
   10228 			return 0;
   10229 		else
   10230 			return -1;
   10231 		break;
   10232 	case WM_T_82571:
   10233 	case WM_T_82572:
   10234 	case WM_T_82573:
   10235 	case WM_T_82574:
   10236 	case WM_T_82583:
   10237 	case WM_T_80003:
   10238 		reg = CSR_READ(sc, WMREG_MANC);
   10239 		if ((reg & MANC_BLK_PHY_RST_ON_IDE) != 0)
   10240 			return -1;
   10241 		else
   10242 			return 0;
   10243 		break;
   10244 	default:
   10245 		/* no problem */
   10246 		break;
   10247 	}
   10248 
   10249 	return 0;
   10250 }
   10251 
   10252 static void
   10253 wm_get_hw_control(struct wm_softc *sc)
   10254 {
   10255 	uint32_t reg;
   10256 
   10257 	switch (sc->sc_type) {
   10258 	case WM_T_82573:
   10259 		reg = CSR_READ(sc, WMREG_SWSM);
   10260 		CSR_WRITE(sc, WMREG_SWSM, reg | SWSM_DRV_LOAD);
   10261 		break;
   10262 	case WM_T_82571:
   10263 	case WM_T_82572:
   10264 	case WM_T_82574:
   10265 	case WM_T_82583:
   10266 	case WM_T_80003:
   10267 	case WM_T_ICH8:
   10268 	case WM_T_ICH9:
   10269 	case WM_T_ICH10:
   10270 	case WM_T_PCH:
   10271 	case WM_T_PCH2:
   10272 	case WM_T_PCH_LPT:
   10273 		reg = CSR_READ(sc, WMREG_CTRL_EXT);
   10274 		CSR_WRITE(sc, WMREG_CTRL_EXT, reg | CTRL_EXT_DRV_LOAD);
   10275 		break;
   10276 	default:
   10277 		break;
   10278 	}
   10279 }
   10280 
   10281 static void
   10282 wm_release_hw_control(struct wm_softc *sc)
   10283 {
   10284 	uint32_t reg;
   10285 
   10286 	if ((sc->sc_flags & WM_F_HAS_MANAGE) == 0)
   10287 		return;
   10288 
   10289 	if (sc->sc_type == WM_T_82573) {
   10290 		reg = CSR_READ(sc, WMREG_SWSM);
   10291 		reg &= ~SWSM_DRV_LOAD;
   10292 		CSR_WRITE(sc, WMREG_SWSM, reg & ~SWSM_DRV_LOAD);
   10293 	} else {
   10294 		reg = CSR_READ(sc, WMREG_CTRL_EXT);
   10295 		CSR_WRITE(sc, WMREG_CTRL_EXT, reg & ~CTRL_EXT_DRV_LOAD);
   10296 	}
   10297 }
   10298 
   10299 static void
   10300 wm_gate_hw_phy_config_ich8lan(struct wm_softc *sc, int on)
   10301 {
   10302 	uint32_t reg;
   10303 
   10304 	reg = CSR_READ(sc, WMREG_EXTCNFCTR);
   10305 
   10306 	if (on != 0)
   10307 		reg |= EXTCNFCTR_GATE_PHY_CFG;
   10308 	else
   10309 		reg &= ~EXTCNFCTR_GATE_PHY_CFG;
   10310 
   10311 	CSR_WRITE(sc, WMREG_EXTCNFCTR, reg);
   10312 }
   10313 
   10314 static void
   10315 wm_smbustopci(struct wm_softc *sc)
   10316 {
   10317 	uint32_t fwsm;
   10318 
   10319 	fwsm = CSR_READ(sc, WMREG_FWSM);
   10320 	if (((fwsm & FWSM_FW_VALID) == 0)
   10321 	    && ((wm_check_reset_block(sc) == 0))) {
   10322 		sc->sc_ctrl |= CTRL_LANPHYPC_OVERRIDE;
   10323 		sc->sc_ctrl &= ~CTRL_LANPHYPC_VALUE;
   10324 		CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
   10325 		CSR_WRITE_FLUSH(sc);
   10326 		delay(10);
   10327 		sc->sc_ctrl &= ~CTRL_LANPHYPC_OVERRIDE;
   10328 		CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
   10329 		CSR_WRITE_FLUSH(sc);
   10330 		delay(50*1000);
   10331 
   10332 		/*
   10333 		 * Gate automatic PHY configuration by hardware on non-managed
   10334 		 * 82579
   10335 		 */
   10336 		if (sc->sc_type == WM_T_PCH2)
   10337 			wm_gate_hw_phy_config_ich8lan(sc, 1);
   10338 	}
   10339 }
   10340 
   10341 static void
   10342 wm_init_manageability(struct wm_softc *sc)
   10343 {
   10344 
   10345 	if (sc->sc_flags & WM_F_HAS_MANAGE) {
   10346 		uint32_t manc2h = CSR_READ(sc, WMREG_MANC2H);
   10347 		uint32_t manc = CSR_READ(sc, WMREG_MANC);
   10348 
   10349 		/* Disable hardware interception of ARP */
   10350 		manc &= ~MANC_ARP_EN;
   10351 
   10352 		/* Enable receiving management packets to the host */
   10353 		if (sc->sc_type >= WM_T_82571) {
   10354 			manc |= MANC_EN_MNG2HOST;
   10355 			manc2h |= MANC2H_PORT_623| MANC2H_PORT_624;
   10356 			CSR_WRITE(sc, WMREG_MANC2H, manc2h);
   10357 		}
   10358 
   10359 		CSR_WRITE(sc, WMREG_MANC, manc);
   10360 	}
   10361 }
   10362 
   10363 static void
   10364 wm_release_manageability(struct wm_softc *sc)
   10365 {
   10366 
   10367 	if (sc->sc_flags & WM_F_HAS_MANAGE) {
   10368 		uint32_t manc = CSR_READ(sc, WMREG_MANC);
   10369 
   10370 		manc |= MANC_ARP_EN;
   10371 		if (sc->sc_type >= WM_T_82571)
   10372 			manc &= ~MANC_EN_MNG2HOST;
   10373 
   10374 		CSR_WRITE(sc, WMREG_MANC, manc);
   10375 	}
   10376 }
   10377 
   10378 static void
   10379 wm_get_wakeup(struct wm_softc *sc)
   10380 {
   10381 
   10382 	/* 0: HAS_AMT, ARC_SUBSYS_VALID, ASF_FIRMWARE_PRES */
   10383 	switch (sc->sc_type) {
   10384 	case WM_T_82573:
   10385 	case WM_T_82583:
   10386 		sc->sc_flags |= WM_F_HAS_AMT;
   10387 		/* FALLTHROUGH */
   10388 	case WM_T_80003:
   10389 	case WM_T_82541:
   10390 	case WM_T_82547:
   10391 	case WM_T_82571:
   10392 	case WM_T_82572:
   10393 	case WM_T_82574:
   10394 	case WM_T_82575:
   10395 	case WM_T_82576:
   10396 	case WM_T_82580:
   10397 	case WM_T_I350:
   10398 	case WM_T_I354:
   10399 		if ((CSR_READ(sc, WMREG_FWSM) & FWSM_MODE_MASK) != 0)
   10400 			sc->sc_flags |= WM_F_ARC_SUBSYS_VALID;
   10401 		sc->sc_flags |= WM_F_ASF_FIRMWARE_PRES;
   10402 		break;
   10403 	case WM_T_ICH8:
   10404 	case WM_T_ICH9:
   10405 	case WM_T_ICH10:
   10406 	case WM_T_PCH:
   10407 	case WM_T_PCH2:
   10408 	case WM_T_PCH_LPT:
   10409 		sc->sc_flags |= WM_F_HAS_AMT;
   10410 		sc->sc_flags |= WM_F_ASF_FIRMWARE_PRES;
   10411 		break;
   10412 	default:
   10413 		break;
   10414 	}
   10415 
   10416 	/* 1: HAS_MANAGE */
   10417 	if (wm_enable_mng_pass_thru(sc) != 0)
   10418 		sc->sc_flags |= WM_F_HAS_MANAGE;
   10419 
   10420 #ifdef WM_DEBUG
   10421 	printf("\n");
   10422 	if ((sc->sc_flags & WM_F_HAS_AMT) != 0)
   10423 		printf("HAS_AMT,");
   10424 	if ((sc->sc_flags & WM_F_ARC_SUBSYS_VALID) != 0)
   10425 		printf("ARC_SUBSYS_VALID,");
   10426 	if ((sc->sc_flags & WM_F_ASF_FIRMWARE_PRES) != 0)
   10427 		printf("ASF_FIRMWARE_PRES,");
   10428 	if ((sc->sc_flags & WM_F_HAS_MANAGE) != 0)
   10429 		printf("HAS_MANAGE,");
   10430 	printf("\n");
   10431 #endif
   10432 	/*
   10433 	 * Note that the WOL flags is set after the resetting of the eeprom
   10434 	 * stuff
   10435 	 */
   10436 }
   10437 
   10438 #ifdef WM_WOL
   10439 /* WOL in the newer chipset interfaces (pchlan) */
   10440 static void
   10441 wm_enable_phy_wakeup(struct wm_softc *sc)
   10442 {
   10443 #if 0
   10444 	uint16_t preg;
   10445 
   10446 	/* Copy MAC RARs to PHY RARs */
   10447 
   10448 	/* Copy MAC MTA to PHY MTA */
   10449 
   10450 	/* Configure PHY Rx Control register */
   10451 
   10452 	/* Enable PHY wakeup in MAC register */
   10453 
   10454 	/* Configure and enable PHY wakeup in PHY registers */
   10455 
   10456 	/* Activate PHY wakeup */
   10457 
   10458 	/* XXX */
   10459 #endif
   10460 }
   10461 
   10462 /* Power down workaround on D3 */
   10463 static void
   10464 wm_igp3_phy_powerdown_workaround_ich8lan(struct wm_softc *sc)
   10465 {
   10466 	uint32_t reg;
   10467 	int i;
   10468 
   10469 	for (i = 0; i < 2; i++) {
   10470 		/* Disable link */
   10471 		reg = CSR_READ(sc, WMREG_PHY_CTRL);
   10472 		reg |= PHY_CTRL_GBE_DIS | PHY_CTRL_NOND0A_GBE_DIS;
   10473 		CSR_WRITE(sc, WMREG_PHY_CTRL, reg);
   10474 
   10475 		/*
   10476 		 * Call gig speed drop workaround on Gig disable before
   10477 		 * accessing any PHY registers
   10478 		 */
   10479 		if (sc->sc_type == WM_T_ICH8)
   10480 			wm_gig_downshift_workaround_ich8lan(sc);
   10481 
   10482 		/* Write VR power-down enable */
   10483 		reg = sc->sc_mii.mii_readreg(sc->sc_dev, 1, IGP3_VR_CTRL);
   10484 		reg &= ~IGP3_VR_CTRL_DEV_POWERDOWN_MODE_MASK;
   10485 		reg |= IGP3_VR_CTRL_MODE_SHUTDOWN;
   10486 		sc->sc_mii.mii_writereg(sc->sc_dev, 1, IGP3_VR_CTRL, reg);
   10487 
   10488 		/* Read it back and test */
   10489 		reg = sc->sc_mii.mii_readreg(sc->sc_dev, 1, IGP3_VR_CTRL);
   10490 		reg &= IGP3_VR_CTRL_DEV_POWERDOWN_MODE_MASK;
   10491 		if ((reg == IGP3_VR_CTRL_MODE_SHUTDOWN) || (i != 0))
   10492 			break;
   10493 
   10494 		/* Issue PHY reset and repeat at most one more time */
   10495 		CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET);
   10496 	}
   10497 }
   10498 
   10499 static void
   10500 wm_enable_wakeup(struct wm_softc *sc)
   10501 {
   10502 	uint32_t reg, pmreg;
   10503 	pcireg_t pmode;
   10504 
   10505 	if (pci_get_capability(sc->sc_pc, sc->sc_pcitag, PCI_CAP_PWRMGMT,
   10506 		&pmreg, NULL) == 0)
   10507 		return;
   10508 
   10509 	/* Advertise the wakeup capability */
   10510 	CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_SWDPIN(2)
   10511 	    | CTRL_SWDPIN(3));
   10512 	CSR_WRITE(sc, WMREG_WUC, WUC_APME);
   10513 
   10514 	/* ICH workaround */
   10515 	switch (sc->sc_type) {
   10516 	case WM_T_ICH8:
   10517 	case WM_T_ICH9:
   10518 	case WM_T_ICH10:
   10519 	case WM_T_PCH:
   10520 	case WM_T_PCH2:
   10521 	case WM_T_PCH_LPT:
   10522 		/* Disable gig during WOL */
   10523 		reg = CSR_READ(sc, WMREG_PHY_CTRL);
   10524 		reg |= PHY_CTRL_D0A_LPLU | PHY_CTRL_GBE_DIS;
   10525 		CSR_WRITE(sc, WMREG_PHY_CTRL, reg);
   10526 		if (sc->sc_type == WM_T_PCH)
   10527 			wm_gmii_reset(sc);
   10528 
   10529 		/* Power down workaround */
   10530 		if (sc->sc_phytype == WMPHY_82577) {
   10531 			struct mii_softc *child;
   10532 
   10533 			/* Assume that the PHY is copper */
   10534 			child = LIST_FIRST(&sc->sc_mii.mii_phys);
   10535 			if (child->mii_mpd_rev <= 2)
   10536 				sc->sc_mii.mii_writereg(sc->sc_dev, 1,
   10537 				    (768 << 5) | 25, 0x0444); /* magic num */
   10538 		}
   10539 		break;
   10540 	default:
   10541 		break;
   10542 	}
   10543 
   10544 	/* Keep the laser running on fiber adapters */
   10545 	if ((sc->sc_mediatype == WM_MEDIATYPE_FIBER)
   10546 	    || (sc->sc_mediatype == WM_MEDIATYPE_SERDES)) {
   10547 		reg = CSR_READ(sc, WMREG_CTRL_EXT);
   10548 		reg |= CTRL_EXT_SWDPIN(3);
   10549 		CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
   10550 	}
   10551 
   10552 	reg = CSR_READ(sc, WMREG_WUFC) | WUFC_MAG;
   10553 #if 0	/* for the multicast packet */
   10554 	reg |= WUFC_MC;
   10555 	CSR_WRITE(sc, WMREG_RCTL, CSR_READ(sc, WMREG_RCTL) | RCTL_MPE);
   10556 #endif
   10557 
   10558 	if (sc->sc_type == WM_T_PCH) {
   10559 		wm_enable_phy_wakeup(sc);
   10560 	} else {
   10561 		CSR_WRITE(sc, WMREG_WUC, WUC_PME_EN);
   10562 		CSR_WRITE(sc, WMREG_WUFC, reg);
   10563 	}
   10564 
   10565 	if (((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
   10566 		|| (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
   10567 		|| (sc->sc_type == WM_T_PCH2))
   10568 		    && (sc->sc_phytype == WMPHY_IGP_3))
   10569 			wm_igp3_phy_powerdown_workaround_ich8lan(sc);
   10570 
   10571 	/* Request PME */
   10572 	pmode = pci_conf_read(sc->sc_pc, sc->sc_pcitag, pmreg + PCI_PMCSR);
   10573 #if 0
   10574 	/* Disable WOL */
   10575 	pmode &= ~(PCI_PMCSR_PME_STS | PCI_PMCSR_PME_EN);
   10576 #else
   10577 	/* For WOL */
   10578 	pmode |= PCI_PMCSR_PME_STS | PCI_PMCSR_PME_EN;
   10579 #endif
   10580 	pci_conf_write(sc->sc_pc, sc->sc_pcitag, pmreg + PCI_PMCSR, pmode);
   10581 }
   10582 #endif /* WM_WOL */
   10583 
   10584 /* EEE */
   10585 
   10586 static void
   10587 wm_set_eee_i350(struct wm_softc *sc)
   10588 {
   10589 	uint32_t ipcnfg, eeer;
   10590 
   10591 	ipcnfg = CSR_READ(sc, WMREG_IPCNFG);
   10592 	eeer = CSR_READ(sc, WMREG_EEER);
   10593 
   10594 	if ((sc->sc_flags & WM_F_EEE) != 0) {
   10595 		ipcnfg |= (IPCNFG_EEE_1G_AN | IPCNFG_EEE_100M_AN);
   10596 		eeer |= (EEER_TX_LPI_EN | EEER_RX_LPI_EN
   10597 		    | EEER_LPI_FC);
   10598 	} else {
   10599 		ipcnfg &= ~(IPCNFG_EEE_1G_AN | IPCNFG_EEE_100M_AN);
   10600 		ipcnfg &= ~IPCNFG_10BASE_TE;
   10601 		eeer &= ~(EEER_TX_LPI_EN | EEER_RX_LPI_EN
   10602 		    | EEER_LPI_FC);
   10603 	}
   10604 
   10605 	CSR_WRITE(sc, WMREG_IPCNFG, ipcnfg);
   10606 	CSR_WRITE(sc, WMREG_EEER, eeer);
   10607 	CSR_READ(sc, WMREG_IPCNFG); /* XXX flush? */
   10608 	CSR_READ(sc, WMREG_EEER); /* XXX flush? */
   10609 }
   10610 
   10611 /*
   10612  * Workarounds (mainly PHY related).
   10613  * Basically, PHY's workarounds are in the PHY drivers.
   10614  */
   10615 
   10616 /* Work-around for 82566 Kumeran PCS lock loss */
   10617 static void
   10618 wm_kmrn_lock_loss_workaround_ich8lan(struct wm_softc *sc)
   10619 {
   10620 	int miistatus, active, i;
   10621 	int reg;
   10622 
   10623 	miistatus = sc->sc_mii.mii_media_status;
   10624 
   10625 	/* If the link is not up, do nothing */
   10626 	if ((miistatus & IFM_ACTIVE) != 0)
   10627 		return;
   10628 
   10629 	active = sc->sc_mii.mii_media_active;
   10630 
   10631 	/* Nothing to do if the link is other than 1Gbps */
   10632 	if (IFM_SUBTYPE(active) != IFM_1000_T)
   10633 		return;
   10634 
   10635 	for (i = 0; i < 10; i++) {
   10636 		/* read twice */
   10637 		reg = wm_gmii_i80003_readreg(sc->sc_dev, 1, IGP3_KMRN_DIAG);
   10638 		reg = wm_gmii_i80003_readreg(sc->sc_dev, 1, IGP3_KMRN_DIAG);
   10639 		if ((reg & IGP3_KMRN_DIAG_PCS_LOCK_LOSS) != 0)
   10640 			goto out;	/* GOOD! */
   10641 
   10642 		/* Reset the PHY */
   10643 		wm_gmii_reset(sc);
   10644 		delay(5*1000);
   10645 	}
   10646 
   10647 	/* Disable GigE link negotiation */
   10648 	reg = CSR_READ(sc, WMREG_PHY_CTRL);
   10649 	reg |= PHY_CTRL_GBE_DIS | PHY_CTRL_NOND0A_GBE_DIS;
   10650 	CSR_WRITE(sc, WMREG_PHY_CTRL, reg);
   10651 
   10652 	/*
   10653 	 * Call gig speed drop workaround on Gig disable before accessing
   10654 	 * any PHY registers.
   10655 	 */
   10656 	wm_gig_downshift_workaround_ich8lan(sc);
   10657 
   10658 out:
   10659 	return;
   10660 }
   10661 
   10662 /* WOL from S5 stops working */
   10663 static void
   10664 wm_gig_downshift_workaround_ich8lan(struct wm_softc *sc)
   10665 {
   10666 	uint16_t kmrn_reg;
   10667 
   10668 	/* Only for igp3 */
   10669 	if (sc->sc_phytype == WMPHY_IGP_3) {
   10670 		kmrn_reg = wm_kmrn_readreg(sc, KUMCTRLSTA_OFFSET_DIAG);
   10671 		kmrn_reg |= KUMCTRLSTA_DIAG_NELPBK;
   10672 		wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_DIAG, kmrn_reg);
   10673 		kmrn_reg &= ~KUMCTRLSTA_DIAG_NELPBK;
   10674 		wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_DIAG, kmrn_reg);
   10675 	}
   10676 }
   10677 
   10678 /*
   10679  * Workaround for pch's PHYs
   10680  * XXX should be moved to new PHY driver?
   10681  */
   10682 static void
   10683 wm_hv_phy_workaround_ich8lan(struct wm_softc *sc)
   10684 {
   10685 	if (sc->sc_phytype == WMPHY_82577)
   10686 		wm_set_mdio_slow_mode_hv(sc);
   10687 
   10688 	/* (PCH rev.2) && (82577 && (phy rev 2 or 3)) */
   10689 
   10690 	/* (82577 && (phy rev 1 or 2)) || (82578 & phy rev 1)*/
   10691 
   10692 	/* 82578 */
   10693 	if (sc->sc_phytype == WMPHY_82578) {
   10694 		/* PCH rev. < 3 */
   10695 		if (sc->sc_rev < 3) {
   10696 			/* XXX 6 bit shift? Why? Is it page2? */
   10697 			wm_gmii_hv_writereg(sc->sc_dev, 1, ((1 << 6) | 0x29),
   10698 			    0x66c0);
   10699 			wm_gmii_hv_writereg(sc->sc_dev, 1, ((1 << 6) | 0x1e),
   10700 			    0xffff);
   10701 		}
   10702 
   10703 		/* XXX phy rev. < 2 */
   10704 	}
   10705 
   10706 	/* Select page 0 */
   10707 
   10708 	/* XXX acquire semaphore */
   10709 	wm_gmii_i82544_writereg(sc->sc_dev, 1, MII_IGPHY_PAGE_SELECT, 0);
   10710 	/* XXX release semaphore */
   10711 
   10712 	/*
   10713 	 * Configure the K1 Si workaround during phy reset assuming there is
   10714 	 * link so that it disables K1 if link is in 1Gbps.
   10715 	 */
   10716 	wm_k1_gig_workaround_hv(sc, 1);
   10717 }
   10718 
   10719 static void
   10720 wm_lv_phy_workaround_ich8lan(struct wm_softc *sc)
   10721 {
   10722 
   10723 	wm_set_mdio_slow_mode_hv(sc);
   10724 }
   10725 
   10726 static void
   10727 wm_k1_gig_workaround_hv(struct wm_softc *sc, int link)
   10728 {
   10729 	int k1_enable = sc->sc_nvm_k1_enabled;
   10730 
   10731 	/* XXX acquire semaphore */
   10732 
   10733 	if (link) {
   10734 		k1_enable = 0;
   10735 
   10736 		/* Link stall fix for link up */
   10737 		wm_gmii_hv_writereg(sc->sc_dev, 1, IGP3_KMRN_DIAG, 0x0100);
   10738 	} else {
   10739 		/* Link stall fix for link down */
   10740 		wm_gmii_hv_writereg(sc->sc_dev, 1, IGP3_KMRN_DIAG, 0x4100);
   10741 	}
   10742 
   10743 	wm_configure_k1_ich8lan(sc, k1_enable);
   10744 
   10745 	/* XXX release semaphore */
   10746 }
   10747 
   10748 static void
   10749 wm_set_mdio_slow_mode_hv(struct wm_softc *sc)
   10750 {
   10751 	uint32_t reg;
   10752 
   10753 	reg = wm_gmii_hv_readreg(sc->sc_dev, 1, HV_KMRN_MODE_CTRL);
   10754 	wm_gmii_hv_writereg(sc->sc_dev, 1, HV_KMRN_MODE_CTRL,
   10755 	    reg | HV_KMRN_MDIO_SLOW);
   10756 }
   10757 
   10758 static void
   10759 wm_configure_k1_ich8lan(struct wm_softc *sc, int k1_enable)
   10760 {
   10761 	uint32_t ctrl, ctrl_ext, tmp;
   10762 	uint16_t kmrn_reg;
   10763 
   10764 	kmrn_reg = wm_kmrn_readreg(sc, KUMCTRLSTA_OFFSET_K1_CONFIG);
   10765 
   10766 	if (k1_enable)
   10767 		kmrn_reg |= KUMCTRLSTA_K1_ENABLE;
   10768 	else
   10769 		kmrn_reg &= ~KUMCTRLSTA_K1_ENABLE;
   10770 
   10771 	wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_K1_CONFIG, kmrn_reg);
   10772 
   10773 	delay(20);
   10774 
   10775 	ctrl = CSR_READ(sc, WMREG_CTRL);
   10776 	ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT);
   10777 
   10778 	tmp = ctrl & ~(CTRL_SPEED_1000 | CTRL_SPEED_100);
   10779 	tmp |= CTRL_FRCSPD;
   10780 
   10781 	CSR_WRITE(sc, WMREG_CTRL, tmp);
   10782 	CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext | CTRL_EXT_SPD_BYPS);
   10783 	CSR_WRITE_FLUSH(sc);
   10784 	delay(20);
   10785 
   10786 	CSR_WRITE(sc, WMREG_CTRL, ctrl);
   10787 	CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext);
   10788 	CSR_WRITE_FLUSH(sc);
   10789 	delay(20);
   10790 }
   10791 
   10792 /* special case - for 82575 - need to do manual init ... */
   10793 static void
   10794 wm_reset_init_script_82575(struct wm_softc *sc)
   10795 {
   10796 	/*
   10797 	 * remark: this is untested code - we have no board without EEPROM
   10798 	 *  same setup as mentioned int the FreeBSD driver for the i82575
   10799 	 */
   10800 
   10801 	/* SerDes configuration via SERDESCTRL */
   10802 	wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x00, 0x0c);
   10803 	wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x01, 0x78);
   10804 	wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x1b, 0x23);
   10805 	wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x23, 0x15);
   10806 
   10807 	/* CCM configuration via CCMCTL register */
   10808 	wm_82575_write_8bit_ctlr_reg(sc, WMREG_CCMCTL, 0x14, 0x00);
   10809 	wm_82575_write_8bit_ctlr_reg(sc, WMREG_CCMCTL, 0x10, 0x00);
   10810 
   10811 	/* PCIe lanes configuration */
   10812 	wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x00, 0xec);
   10813 	wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x61, 0xdf);
   10814 	wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x34, 0x05);
   10815 	wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x2f, 0x81);
   10816 
   10817 	/* PCIe PLL Configuration */
   10818 	wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x02, 0x47);
   10819 	wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x14, 0x00);
   10820 	wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x10, 0x00);
   10821 }
   10822 
   10823 static void
   10824 wm_reset_mdicnfg_82580(struct wm_softc *sc)
   10825 {
   10826 	uint32_t reg;
   10827 	uint16_t nvmword;
   10828 	int rv;
   10829 
   10830 	if ((sc->sc_flags & WM_F_SGMII) == 0)
   10831 		return;
   10832 
   10833 	rv = wm_nvm_read(sc, NVM_OFF_LAN_FUNC_82580(sc->sc_funcid)
   10834 	    + NVM_OFF_CFG3_PORTA, 1, &nvmword);
   10835 	if (rv != 0) {
   10836 		aprint_error_dev(sc->sc_dev, "%s: failed to read NVM\n",
   10837 		    __func__);
   10838 		return;
   10839 	}
   10840 
   10841 	reg = CSR_READ(sc, WMREG_MDICNFG);
   10842 	if (nvmword & NVM_CFG3_PORTA_EXT_MDIO)
   10843 		reg |= MDICNFG_DEST;
   10844 	if (nvmword & NVM_CFG3_PORTA_COM_MDIO)
   10845 		reg |= MDICNFG_COM_MDIO;
   10846 	CSR_WRITE(sc, WMREG_MDICNFG, reg);
   10847 }
   10848 
   10849 /*
   10850  * I210 Errata 25 and I211 Errata 10
   10851  * Slow System Clock.
   10852  */
   10853 static void
   10854 wm_pll_workaround_i210(struct wm_softc *sc)
   10855 {
   10856 	uint32_t mdicnfg, wuc;
   10857 	uint32_t reg;
   10858 	pcireg_t pcireg;
   10859 	uint32_t pmreg;
   10860 	uint16_t nvmword, tmp_nvmword;
   10861 	int phyval;
   10862 	bool wa_done = false;
   10863 	int i;
   10864 
   10865 	/* Save WUC and MDICNFG registers */
   10866 	wuc = CSR_READ(sc, WMREG_WUC);
   10867 	mdicnfg = CSR_READ(sc, WMREG_MDICNFG);
   10868 
   10869 	reg = mdicnfg & ~MDICNFG_DEST;
   10870 	CSR_WRITE(sc, WMREG_MDICNFG, reg);
   10871 
   10872 	if (wm_nvm_read(sc, INVM_AUTOLOAD, 1, &nvmword) != 0)
   10873 		nvmword = INVM_DEFAULT_AL;
   10874 	tmp_nvmword = nvmword | INVM_PLL_WO_VAL;
   10875 
   10876 	/* Get Power Management cap offset */
   10877 	if (pci_get_capability(sc->sc_pc, sc->sc_pcitag, PCI_CAP_PWRMGMT,
   10878 		&pmreg, NULL) == 0)
   10879 		return;
   10880 	for (i = 0; i < WM_MAX_PLL_TRIES; i++) {
   10881 		phyval = wm_gmii_gs40g_readreg(sc->sc_dev, 1,
   10882 		    GS40G_PHY_PLL_FREQ_PAGE | GS40G_PHY_PLL_FREQ_REG);
   10883 
   10884 		if ((phyval & GS40G_PHY_PLL_UNCONF) != GS40G_PHY_PLL_UNCONF) {
   10885 			break; /* OK */
   10886 		}
   10887 
   10888 		wa_done = true;
   10889 		/* Directly reset the internal PHY */
   10890 		reg = CSR_READ(sc, WMREG_CTRL);
   10891 		CSR_WRITE(sc, WMREG_CTRL, reg | CTRL_PHY_RESET);
   10892 
   10893 		reg = CSR_READ(sc, WMREG_CTRL_EXT);
   10894 		reg |= CTRL_EXT_PHYPDEN | CTRL_EXT_SDLPE;
   10895 		CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
   10896 
   10897 		CSR_WRITE(sc, WMREG_WUC, 0);
   10898 		reg = (INVM_AUTOLOAD << 4) | (tmp_nvmword << 16);
   10899 		CSR_WRITE(sc, WMREG_EEARBC_I210, reg);
   10900 
   10901 		pcireg = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
   10902 		    pmreg + PCI_PMCSR);
   10903 		pcireg |= PCI_PMCSR_STATE_D3;
   10904 		pci_conf_write(sc->sc_pc, sc->sc_pcitag,
   10905 		    pmreg + PCI_PMCSR, pcireg);
   10906 		delay(1000);
   10907 		pcireg &= ~PCI_PMCSR_STATE_D3;
   10908 		pci_conf_write(sc->sc_pc, sc->sc_pcitag,
   10909 		    pmreg + PCI_PMCSR, pcireg);
   10910 
   10911 		reg = (INVM_AUTOLOAD << 4) | (nvmword << 16);
   10912 		CSR_WRITE(sc, WMREG_EEARBC_I210, reg);
   10913 
   10914 		/* Restore WUC register */
   10915 		CSR_WRITE(sc, WMREG_WUC, wuc);
   10916 	}
   10917 
   10918 	/* Restore MDICNFG setting */
   10919 	CSR_WRITE(sc, WMREG_MDICNFG, mdicnfg);
   10920 	if (wa_done)
   10921 		aprint_verbose_dev(sc->sc_dev, "I210 workaround done\n");
   10922 }
   10923