if_wm.c revision 1.475 1 /* $NetBSD: if_wm.c,v 1.475 2017/02/01 08:56:41 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 * - Disable D0 LPLU on 8257[12356], 82580 and I350.
77 * - TX Multi queue improvement (refine queue selection logic)
78 * - Split header buffer for newer descriptors
79 * - EEE (Energy Efficiency Ethernet)
80 * - Virtual Function
81 * - Set LED correctly (based on contents in EEPROM)
82 * - Rework how parameters are loaded from the EEPROM.
83 * - Image Unique ID
84 */
85
86 #include <sys/cdefs.h>
87 __KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.475 2017/02/01 08:56:41 msaitoh Exp $");
88
89 #ifdef _KERNEL_OPT
90 #include "opt_net_mpsafe.h"
91 #endif
92
93 #include <sys/param.h>
94 #include <sys/systm.h>
95 #include <sys/callout.h>
96 #include <sys/mbuf.h>
97 #include <sys/malloc.h>
98 #include <sys/kmem.h>
99 #include <sys/kernel.h>
100 #include <sys/socket.h>
101 #include <sys/ioctl.h>
102 #include <sys/errno.h>
103 #include <sys/device.h>
104 #include <sys/queue.h>
105 #include <sys/syslog.h>
106 #include <sys/interrupt.h>
107 #include <sys/cpu.h>
108 #include <sys/pcq.h>
109
110 #include <sys/rndsource.h>
111
112 #include <net/if.h>
113 #include <net/if_dl.h>
114 #include <net/if_media.h>
115 #include <net/if_ether.h>
116
117 #include <net/bpf.h>
118
119 #include <netinet/in.h> /* XXX for struct ip */
120 #include <netinet/in_systm.h> /* XXX for struct ip */
121 #include <netinet/ip.h> /* XXX for struct ip */
122 #include <netinet/ip6.h> /* XXX for struct ip6_hdr */
123 #include <netinet/tcp.h> /* XXX for struct tcphdr */
124
125 #include <sys/bus.h>
126 #include <sys/intr.h>
127 #include <machine/endian.h>
128
129 #include <dev/mii/mii.h>
130 #include <dev/mii/miivar.h>
131 #include <dev/mii/miidevs.h>
132 #include <dev/mii/mii_bitbang.h>
133 #include <dev/mii/ikphyreg.h>
134 #include <dev/mii/igphyreg.h>
135 #include <dev/mii/igphyvar.h>
136 #include <dev/mii/inbmphyreg.h>
137
138 #include <dev/pci/pcireg.h>
139 #include <dev/pci/pcivar.h>
140 #include <dev/pci/pcidevs.h>
141
142 #include <dev/pci/if_wmreg.h>
143 #include <dev/pci/if_wmvar.h>
144
145 #ifdef WM_DEBUG
146 #define WM_DEBUG_LINK __BIT(0)
147 #define WM_DEBUG_TX __BIT(1)
148 #define WM_DEBUG_RX __BIT(2)
149 #define WM_DEBUG_GMII __BIT(3)
150 #define WM_DEBUG_MANAGE __BIT(4)
151 #define WM_DEBUG_NVM __BIT(5)
152 #define WM_DEBUG_INIT __BIT(6)
153 #define WM_DEBUG_LOCK __BIT(7)
154 int wm_debug = WM_DEBUG_TX | WM_DEBUG_RX | WM_DEBUG_LINK | WM_DEBUG_GMII
155 | WM_DEBUG_MANAGE | WM_DEBUG_NVM | WM_DEBUG_INIT | WM_DEBUG_LOCK;
156
157 #define DPRINTF(x, y) if (wm_debug & (x)) printf y
158 #else
159 #define DPRINTF(x, y) /* nothing */
160 #endif /* WM_DEBUG */
161
162 #ifdef NET_MPSAFE
163 #define WM_MPSAFE 1
164 #endif
165
166 /*
167 * This device driver's max interrupt numbers.
168 */
169 #define WM_MAX_NQUEUEINTR 16
170 #define WM_MAX_NINTR (WM_MAX_NQUEUEINTR + 1)
171
172 /*
173 * Transmit descriptor list size. Due to errata, we can only have
174 * 256 hardware descriptors in the ring on < 82544, but we use 4096
175 * on >= 82544. We tell the upper layers that they can queue a lot
176 * of packets, and we go ahead and manage up to 64 (16 for the i82547)
177 * of them at a time.
178 *
179 * We allow up to 256 (!) DMA segments per packet. Pathological packet
180 * chains containing many small mbufs have been observed in zero-copy
181 * situations with jumbo frames.
182 */
183 #define WM_NTXSEGS 256
184 #define WM_IFQUEUELEN 256
185 #define WM_TXQUEUELEN_MAX 64
186 #define WM_TXQUEUELEN_MAX_82547 16
187 #define WM_TXQUEUELEN(txq) ((txq)->txq_num)
188 #define WM_TXQUEUELEN_MASK(txq) (WM_TXQUEUELEN(txq) - 1)
189 #define WM_TXQUEUE_GC(txq) (WM_TXQUEUELEN(txq) / 8)
190 #define WM_NTXDESC_82542 256
191 #define WM_NTXDESC_82544 4096
192 #define WM_NTXDESC(txq) ((txq)->txq_ndesc)
193 #define WM_NTXDESC_MASK(txq) (WM_NTXDESC(txq) - 1)
194 #define WM_TXDESCS_SIZE(txq) (WM_NTXDESC(txq) * (txq)->txq_descsize)
195 #define WM_NEXTTX(txq, x) (((x) + 1) & WM_NTXDESC_MASK(txq))
196 #define WM_NEXTTXS(txq, x) (((x) + 1) & WM_TXQUEUELEN_MASK(txq))
197
198 #define WM_MAXTXDMA (2 * round_page(IP_MAXPACKET)) /* for TSO */
199
200 #define WM_TXINTERQSIZE 256
201
202 /*
203 * Receive descriptor list size. We have one Rx buffer for normal
204 * sized packets. Jumbo packets consume 5 Rx buffers for a full-sized
205 * packet. We allocate 256 receive descriptors, each with a 2k
206 * buffer (MCLBYTES), which gives us room for 50 jumbo packets.
207 */
208 #define WM_NRXDESC 256
209 #define WM_NRXDESC_MASK (WM_NRXDESC - 1)
210 #define WM_NEXTRX(x) (((x) + 1) & WM_NRXDESC_MASK)
211 #define WM_PREVRX(x) (((x) - 1) & WM_NRXDESC_MASK)
212
213 typedef union txdescs {
214 wiseman_txdesc_t sctxu_txdescs[WM_NTXDESC_82544];
215 nq_txdesc_t sctxu_nq_txdescs[WM_NTXDESC_82544];
216 } txdescs_t;
217
218 typedef union rxdescs {
219 wiseman_rxdesc_t sctxu_rxdescs[WM_NRXDESC];
220 ext_rxdesc_t sctxu_ext_rxdescs[WM_NRXDESC]; /* 82574 only */
221 nq_rxdesc_t sctxu_nq_rxdescs[WM_NRXDESC]; /* 82575 and newer */
222 } rxdescs_t;
223
224 #define WM_CDTXOFF(txq, x) ((txq)->txq_descsize * (x))
225 #define WM_CDRXOFF(rxq, x) ((rxq)->rxq_descsize * (x))
226
227 /*
228 * Software state for transmit jobs.
229 */
230 struct wm_txsoft {
231 struct mbuf *txs_mbuf; /* head of our mbuf chain */
232 bus_dmamap_t txs_dmamap; /* our DMA map */
233 int txs_firstdesc; /* first descriptor in packet */
234 int txs_lastdesc; /* last descriptor in packet */
235 int txs_ndesc; /* # of descriptors used */
236 };
237
238 /*
239 * Software state for receive buffers. Each descriptor gets a
240 * 2k (MCLBYTES) buffer and a DMA map. For packets which fill
241 * more than one buffer, we chain them together.
242 */
243 struct wm_rxsoft {
244 struct mbuf *rxs_mbuf; /* head of our mbuf chain */
245 bus_dmamap_t rxs_dmamap; /* our DMA map */
246 };
247
248 #define WM_LINKUP_TIMEOUT 50
249
250 static uint16_t swfwphysem[] = {
251 SWFW_PHY0_SM,
252 SWFW_PHY1_SM,
253 SWFW_PHY2_SM,
254 SWFW_PHY3_SM
255 };
256
257 static const uint32_t wm_82580_rxpbs_table[] = {
258 36, 72, 144, 1, 2, 4, 8, 16, 35, 70, 140
259 };
260
261 struct wm_softc;
262
263 #ifdef WM_EVENT_COUNTERS
264 #define WM_Q_EVCNT_DEFINE(qname, evname) \
265 char qname##_##evname##_evcnt_name[sizeof("qname##XX##evname")]; \
266 struct evcnt qname##_ev_##evname;
267
268 #define WM_Q_EVCNT_ATTACH(qname, evname, q, qnum, xname, evtype) \
269 do{ \
270 snprintf((q)->qname##_##evname##_evcnt_name, \
271 sizeof((q)->qname##_##evname##_evcnt_name), \
272 "%s%02d%s", #qname, (qnum), #evname); \
273 evcnt_attach_dynamic(&(q)->qname##_ev_##evname, \
274 (evtype), NULL, (xname), \
275 (q)->qname##_##evname##_evcnt_name); \
276 }while(0)
277
278 #define WM_Q_MISC_EVCNT_ATTACH(qname, evname, q, qnum, xname) \
279 WM_Q_EVCNT_ATTACH(qname, evname, q, qnum, xname, EVCNT_TYPE_MISC)
280
281 #define WM_Q_INTR_EVCNT_ATTACH(qname, evname, q, qnum, xname) \
282 WM_Q_EVCNT_ATTACH(qname, evname, q, qnum, xname, EVCNT_TYPE_INTR)
283 #endif /* WM_EVENT_COUNTERS */
284
285 struct wm_txqueue {
286 kmutex_t *txq_lock; /* lock for tx operations */
287
288 struct wm_softc *txq_sc; /* shortcut (skip struct wm_queue) */
289
290 /* Software state for the transmit descriptors. */
291 int txq_num; /* must be a power of two */
292 struct wm_txsoft txq_soft[WM_TXQUEUELEN_MAX];
293
294 /* TX control data structures. */
295 int txq_ndesc; /* must be a power of two */
296 size_t txq_descsize; /* a tx descriptor size */
297 txdescs_t *txq_descs_u;
298 bus_dmamap_t txq_desc_dmamap; /* control data DMA map */
299 bus_dma_segment_t txq_desc_seg; /* control data segment */
300 int txq_desc_rseg; /* real number of control segment */
301 #define txq_desc_dma txq_desc_dmamap->dm_segs[0].ds_addr
302 #define txq_descs txq_descs_u->sctxu_txdescs
303 #define txq_nq_descs txq_descs_u->sctxu_nq_txdescs
304
305 bus_addr_t txq_tdt_reg; /* offset of TDT register */
306
307 int txq_free; /* number of free Tx descriptors */
308 int txq_next; /* next ready Tx descriptor */
309
310 int txq_sfree; /* number of free Tx jobs */
311 int txq_snext; /* next free Tx job */
312 int txq_sdirty; /* dirty Tx jobs */
313
314 /* These 4 variables are used only on the 82547. */
315 int txq_fifo_size; /* Tx FIFO size */
316 int txq_fifo_head; /* current head of FIFO */
317 uint32_t txq_fifo_addr; /* internal address of start of FIFO */
318 int txq_fifo_stall; /* Tx FIFO is stalled */
319
320 /*
321 * When ncpu > number of Tx queues, a Tx queue is shared by multiple
322 * CPUs. This queue intermediate them without block.
323 */
324 pcq_t *txq_interq;
325
326 /*
327 * NEWQUEUE devices must use not ifp->if_flags but txq->txq_flags
328 * to manage Tx H/W queue's busy flag.
329 */
330 int txq_flags; /* flags for H/W queue, see below */
331 #define WM_TXQ_NO_SPACE 0x1
332
333 bool txq_stopping;
334
335 #ifdef WM_EVENT_COUNTERS
336 WM_Q_EVCNT_DEFINE(txq, txsstall) /* Tx stalled due to no txs */
337 WM_Q_EVCNT_DEFINE(txq, txdstall) /* Tx stalled due to no txd */
338 WM_Q_EVCNT_DEFINE(txq, txfifo_stall) /* Tx FIFO stalls (82547) */
339 WM_Q_EVCNT_DEFINE(txq, txdw) /* Tx descriptor interrupts */
340 WM_Q_EVCNT_DEFINE(txq, txqe) /* Tx queue empty interrupts */
341 /* XXX not used? */
342
343 WM_Q_EVCNT_DEFINE(txq, txipsum) /* IP checksums comp. out-bound */
344 WM_Q_EVCNT_DEFINE(txq,txtusum) /* TCP/UDP cksums comp. out-bound */
345 WM_Q_EVCNT_DEFINE(txq, txtusum6) /* TCP/UDP v6 cksums comp. out-bound */
346 WM_Q_EVCNT_DEFINE(txq, txtso) /* TCP seg offload out-bound (IPv4) */
347 WM_Q_EVCNT_DEFINE(txq, txtso6) /* TCP seg offload out-bound (IPv6) */
348 WM_Q_EVCNT_DEFINE(txq, txtsopain) /* painful header manip. for TSO */
349
350 WM_Q_EVCNT_DEFINE(txq, txdrop) /* Tx packets dropped(too many segs) */
351
352 WM_Q_EVCNT_DEFINE(txq, tu) /* Tx underrun */
353
354 char txq_txseg_evcnt_names[WM_NTXSEGS][sizeof("txqXXtxsegXXX")];
355 struct evcnt txq_ev_txseg[WM_NTXSEGS]; /* Tx packets w/ N segments */
356 #endif /* WM_EVENT_COUNTERS */
357 };
358
359 struct wm_rxqueue {
360 kmutex_t *rxq_lock; /* lock for rx operations */
361
362 struct wm_softc *rxq_sc; /* shortcut (skip struct wm_queue) */
363
364 /* Software state for the receive descriptors. */
365 struct wm_rxsoft rxq_soft[WM_NRXDESC];
366
367 /* RX control data structures. */
368 int rxq_ndesc; /* must be a power of two */
369 size_t rxq_descsize; /* a rx descriptor size */
370 rxdescs_t *rxq_descs_u;
371 bus_dmamap_t rxq_desc_dmamap; /* control data DMA map */
372 bus_dma_segment_t rxq_desc_seg; /* control data segment */
373 int rxq_desc_rseg; /* real number of control segment */
374 #define rxq_desc_dma rxq_desc_dmamap->dm_segs[0].ds_addr
375 #define rxq_descs rxq_descs_u->sctxu_rxdescs
376 #define rxq_ext_descs rxq_descs_u->sctxu_ext_rxdescs
377 #define rxq_nq_descs rxq_descs_u->sctxu_nq_rxdescs
378
379 bus_addr_t rxq_rdt_reg; /* offset of RDT register */
380
381 int rxq_ptr; /* next ready Rx desc/queue ent */
382 int rxq_discard;
383 int rxq_len;
384 struct mbuf *rxq_head;
385 struct mbuf *rxq_tail;
386 struct mbuf **rxq_tailp;
387
388 bool rxq_stopping;
389
390 #ifdef WM_EVENT_COUNTERS
391 WM_Q_EVCNT_DEFINE(rxq, rxintr); /* Rx interrupts */
392
393 WM_Q_EVCNT_DEFINE(rxq, rxipsum); /* IP checksums checked in-bound */
394 WM_Q_EVCNT_DEFINE(rxq, rxtusum); /* TCP/UDP cksums checked in-bound */
395 #endif
396 };
397
398 struct wm_queue {
399 int wmq_id; /* index of transmit and receive queues */
400 int wmq_intr_idx; /* index of MSI-X tables */
401
402 struct wm_txqueue wmq_txq;
403 struct wm_rxqueue wmq_rxq;
404 };
405
406 struct wm_phyop {
407 int (*acquire)(struct wm_softc *);
408 void (*release)(struct wm_softc *);
409 int reset_delay_us;
410 };
411
412 /*
413 * Software state per device.
414 */
415 struct wm_softc {
416 device_t sc_dev; /* generic device information */
417 bus_space_tag_t sc_st; /* bus space tag */
418 bus_space_handle_t sc_sh; /* bus space handle */
419 bus_size_t sc_ss; /* bus space size */
420 bus_space_tag_t sc_iot; /* I/O space tag */
421 bus_space_handle_t sc_ioh; /* I/O space handle */
422 bus_size_t sc_ios; /* I/O space size */
423 bus_space_tag_t sc_flasht; /* flash registers space tag */
424 bus_space_handle_t sc_flashh; /* flash registers space handle */
425 bus_size_t sc_flashs; /* flash registers space size */
426 off_t sc_flashreg_offset; /*
427 * offset to flash registers from
428 * start of BAR
429 */
430 bus_dma_tag_t sc_dmat; /* bus DMA tag */
431
432 struct ethercom sc_ethercom; /* ethernet common data */
433 struct mii_data sc_mii; /* MII/media information */
434
435 pci_chipset_tag_t sc_pc;
436 pcitag_t sc_pcitag;
437 int sc_bus_speed; /* PCI/PCIX bus speed */
438 int sc_pcixe_capoff; /* PCI[Xe] capability reg offset */
439
440 uint16_t sc_pcidevid; /* PCI device ID */
441 wm_chip_type sc_type; /* MAC type */
442 int sc_rev; /* MAC revision */
443 wm_phy_type sc_phytype; /* PHY type */
444 uint32_t sc_mediatype; /* Media type (Copper, Fiber, SERDES)*/
445 #define WM_MEDIATYPE_UNKNOWN 0x00
446 #define WM_MEDIATYPE_FIBER 0x01
447 #define WM_MEDIATYPE_COPPER 0x02
448 #define WM_MEDIATYPE_SERDES 0x03 /* Internal SERDES */
449 int sc_funcid; /* unit number of the chip (0 to 3) */
450 int sc_flags; /* flags; see below */
451 int sc_if_flags; /* last if_flags */
452 int sc_flowflags; /* 802.3x flow control flags */
453 int sc_align_tweak;
454
455 void *sc_ihs[WM_MAX_NINTR]; /*
456 * interrupt cookie.
457 * legacy and msi use sc_ihs[0].
458 */
459 pci_intr_handle_t *sc_intrs; /* legacy and msi use sc_intrs[0] */
460 int sc_nintrs; /* number of interrupts */
461
462 int sc_link_intr_idx; /* index of MSI-X tables */
463
464 callout_t sc_tick_ch; /* tick callout */
465 bool sc_core_stopping;
466
467 int sc_nvm_ver_major;
468 int sc_nvm_ver_minor;
469 int sc_nvm_ver_build;
470 int sc_nvm_addrbits; /* NVM address bits */
471 unsigned int sc_nvm_wordsize; /* NVM word size */
472 int sc_ich8_flash_base;
473 int sc_ich8_flash_bank_size;
474 int sc_nvm_k1_enabled;
475
476 int sc_nqueues;
477 struct wm_queue *sc_queue;
478
479 int sc_affinity_offset;
480
481 #ifdef WM_EVENT_COUNTERS
482 /* Event counters. */
483 struct evcnt sc_ev_linkintr; /* Link interrupts */
484
485 /* WM_T_82542_2_1 only */
486 struct evcnt sc_ev_tx_xoff; /* Tx PAUSE(!0) frames */
487 struct evcnt sc_ev_tx_xon; /* Tx PAUSE(0) frames */
488 struct evcnt sc_ev_rx_xoff; /* Rx PAUSE(!0) frames */
489 struct evcnt sc_ev_rx_xon; /* Rx PAUSE(0) frames */
490 struct evcnt sc_ev_rx_macctl; /* Rx Unsupported */
491 #endif /* WM_EVENT_COUNTERS */
492
493 /* This variable are used only on the 82547. */
494 callout_t sc_txfifo_ch; /* Tx FIFO stall work-around timer */
495
496 uint32_t sc_ctrl; /* prototype CTRL register */
497 #if 0
498 uint32_t sc_ctrl_ext; /* prototype CTRL_EXT register */
499 #endif
500 uint32_t sc_icr; /* prototype interrupt bits */
501 uint32_t sc_itr; /* prototype intr throttling reg */
502 uint32_t sc_tctl; /* prototype TCTL register */
503 uint32_t sc_rctl; /* prototype RCTL register */
504 uint32_t sc_txcw; /* prototype TXCW register */
505 uint32_t sc_tipg; /* prototype TIPG register */
506 uint32_t sc_fcrtl; /* prototype FCRTL register */
507 uint32_t sc_pba; /* prototype PBA register */
508
509 int sc_tbi_linkup; /* TBI link status */
510 int sc_tbi_serdes_anegticks; /* autonegotiation ticks */
511 int sc_tbi_serdes_ticks; /* tbi ticks */
512
513 int sc_mchash_type; /* multicast filter offset */
514
515 krndsource_t rnd_source; /* random source */
516
517 struct if_percpuq *sc_ipq; /* softint-based input queues */
518
519 kmutex_t *sc_core_lock; /* lock for softc operations */
520 kmutex_t *sc_ich_phymtx; /*
521 * 82574/82583/ICH/PCH specific PHY
522 * mutex. For 82574/82583, the mutex
523 * is used for both PHY and NVM.
524 */
525 kmutex_t *sc_ich_nvmmtx; /* ICH/PCH specific NVM mutex */
526
527 struct wm_phyop phy;
528 };
529
530 #define WM_CORE_LOCK(_sc) if ((_sc)->sc_core_lock) mutex_enter((_sc)->sc_core_lock)
531 #define WM_CORE_UNLOCK(_sc) if ((_sc)->sc_core_lock) mutex_exit((_sc)->sc_core_lock)
532 #define WM_CORE_LOCKED(_sc) (!(_sc)->sc_core_lock || mutex_owned((_sc)->sc_core_lock))
533
534 #ifdef WM_MPSAFE
535 #define CALLOUT_FLAGS CALLOUT_MPSAFE
536 #else
537 #define CALLOUT_FLAGS 0
538 #endif
539
540 #define WM_RXCHAIN_RESET(rxq) \
541 do { \
542 (rxq)->rxq_tailp = &(rxq)->rxq_head; \
543 *(rxq)->rxq_tailp = NULL; \
544 (rxq)->rxq_len = 0; \
545 } while (/*CONSTCOND*/0)
546
547 #define WM_RXCHAIN_LINK(rxq, m) \
548 do { \
549 *(rxq)->rxq_tailp = (rxq)->rxq_tail = (m); \
550 (rxq)->rxq_tailp = &(m)->m_next; \
551 } while (/*CONSTCOND*/0)
552
553 #ifdef WM_EVENT_COUNTERS
554 #define WM_EVCNT_INCR(ev) (ev)->ev_count++
555 #define WM_EVCNT_ADD(ev, val) (ev)->ev_count += (val)
556
557 #define WM_Q_EVCNT_INCR(qname, evname) \
558 WM_EVCNT_INCR(&(qname)->qname##_ev_##evname)
559 #define WM_Q_EVCNT_ADD(qname, evname, val) \
560 WM_EVCNT_ADD(&(qname)->qname##_ev_##evname, (val))
561 #else /* !WM_EVENT_COUNTERS */
562 #define WM_EVCNT_INCR(ev) /* nothing */
563 #define WM_EVCNT_ADD(ev, val) /* nothing */
564
565 #define WM_Q_EVCNT_INCR(qname, evname) /* nothing */
566 #define WM_Q_EVCNT_ADD(qname, evname, val) /* nothing */
567 #endif /* !WM_EVENT_COUNTERS */
568
569 #define CSR_READ(sc, reg) \
570 bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg))
571 #define CSR_WRITE(sc, reg, val) \
572 bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val))
573 #define CSR_WRITE_FLUSH(sc) \
574 (void) CSR_READ((sc), WMREG_STATUS)
575
576 #define ICH8_FLASH_READ32(sc, reg) \
577 bus_space_read_4((sc)->sc_flasht, (sc)->sc_flashh, \
578 (reg) + sc->sc_flashreg_offset)
579 #define ICH8_FLASH_WRITE32(sc, reg, data) \
580 bus_space_write_4((sc)->sc_flasht, (sc)->sc_flashh, \
581 (reg) + sc->sc_flashreg_offset, (data))
582
583 #define ICH8_FLASH_READ16(sc, reg) \
584 bus_space_read_2((sc)->sc_flasht, (sc)->sc_flashh, \
585 (reg) + sc->sc_flashreg_offset)
586 #define ICH8_FLASH_WRITE16(sc, reg, data) \
587 bus_space_write_2((sc)->sc_flasht, (sc)->sc_flashh, \
588 (reg) + sc->sc_flashreg_offset, (data))
589
590 #define WM_CDTXADDR(txq, x) ((txq)->txq_desc_dma + WM_CDTXOFF((txq), (x)))
591 #define WM_CDRXADDR(rxq, x) ((rxq)->rxq_desc_dma + WM_CDRXOFF((rxq), (x)))
592
593 #define WM_CDTXADDR_LO(txq, x) (WM_CDTXADDR((txq), (x)) & 0xffffffffU)
594 #define WM_CDTXADDR_HI(txq, x) \
595 (sizeof(bus_addr_t) == 8 ? \
596 (uint64_t)WM_CDTXADDR((txq), (x)) >> 32 : 0)
597
598 #define WM_CDRXADDR_LO(rxq, x) (WM_CDRXADDR((rxq), (x)) & 0xffffffffU)
599 #define WM_CDRXADDR_HI(rxq, x) \
600 (sizeof(bus_addr_t) == 8 ? \
601 (uint64_t)WM_CDRXADDR((rxq), (x)) >> 32 : 0)
602
603 /*
604 * Register read/write functions.
605 * Other than CSR_{READ|WRITE}().
606 */
607 #if 0
608 static inline uint32_t wm_io_read(struct wm_softc *, int);
609 #endif
610 static inline void wm_io_write(struct wm_softc *, int, uint32_t);
611 static inline void wm_82575_write_8bit_ctlr_reg(struct wm_softc *, uint32_t,
612 uint32_t, uint32_t);
613 static inline void wm_set_dma_addr(volatile wiseman_addr_t *, bus_addr_t);
614
615 /*
616 * Descriptor sync/init functions.
617 */
618 static inline void wm_cdtxsync(struct wm_txqueue *, int, int, int);
619 static inline void wm_cdrxsync(struct wm_rxqueue *, int, int);
620 static inline void wm_init_rxdesc(struct wm_rxqueue *, int);
621
622 /*
623 * Device driver interface functions and commonly used functions.
624 * match, attach, detach, init, start, stop, ioctl, watchdog and so on.
625 */
626 static const struct wm_product *wm_lookup(const struct pci_attach_args *);
627 static int wm_match(device_t, cfdata_t, void *);
628 static void wm_attach(device_t, device_t, void *);
629 static int wm_detach(device_t, int);
630 static bool wm_suspend(device_t, const pmf_qual_t *);
631 static bool wm_resume(device_t, const pmf_qual_t *);
632 static void wm_watchdog(struct ifnet *);
633 static void wm_watchdog_txq(struct ifnet *, struct wm_txqueue *);
634 static void wm_tick(void *);
635 static int wm_ifflags_cb(struct ethercom *);
636 static int wm_ioctl(struct ifnet *, u_long, void *);
637 /* MAC address related */
638 static uint16_t wm_check_alt_mac_addr(struct wm_softc *);
639 static int wm_read_mac_addr(struct wm_softc *, uint8_t *);
640 static void wm_set_ral(struct wm_softc *, const uint8_t *, int);
641 static uint32_t wm_mchash(struct wm_softc *, const uint8_t *);
642 static void wm_set_filter(struct wm_softc *);
643 /* Reset and init related */
644 static void wm_set_vlan(struct wm_softc *);
645 static void wm_set_pcie_completion_timeout(struct wm_softc *);
646 static void wm_get_auto_rd_done(struct wm_softc *);
647 static void wm_lan_init_done(struct wm_softc *);
648 static void wm_get_cfg_done(struct wm_softc *);
649 static void wm_initialize_hardware_bits(struct wm_softc *);
650 static uint32_t wm_rxpbs_adjust_82580(uint32_t);
651 static void wm_reset_phy(struct wm_softc *);
652 static void wm_flush_desc_rings(struct wm_softc *);
653 static void wm_reset(struct wm_softc *);
654 static int wm_add_rxbuf(struct wm_rxqueue *, int);
655 static void wm_rxdrain(struct wm_rxqueue *);
656 static void wm_rss_getkey(uint8_t *);
657 static void wm_init_rss(struct wm_softc *);
658 static void wm_adjust_qnum(struct wm_softc *, int);
659 static int wm_setup_legacy(struct wm_softc *);
660 static int wm_setup_msix(struct wm_softc *);
661 static int wm_init(struct ifnet *);
662 static int wm_init_locked(struct ifnet *);
663 static void wm_turnon(struct wm_softc *);
664 static void wm_turnoff(struct wm_softc *);
665 static void wm_stop(struct ifnet *, int);
666 static void wm_stop_locked(struct ifnet *, int);
667 static void wm_dump_mbuf_chain(struct wm_softc *, struct mbuf *);
668 static void wm_82547_txfifo_stall(void *);
669 static int wm_82547_txfifo_bugchk(struct wm_softc *, struct mbuf *);
670 /* DMA related */
671 static int wm_alloc_tx_descs(struct wm_softc *, struct wm_txqueue *);
672 static void wm_free_tx_descs(struct wm_softc *, struct wm_txqueue *);
673 static void wm_init_tx_descs(struct wm_softc *, struct wm_txqueue *);
674 static void wm_init_tx_regs(struct wm_softc *, struct wm_queue *,
675 struct wm_txqueue *);
676 static int wm_alloc_rx_descs(struct wm_softc *, struct wm_rxqueue *);
677 static void wm_free_rx_descs(struct wm_softc *, struct wm_rxqueue *);
678 static void wm_init_rx_regs(struct wm_softc *, struct wm_queue *,
679 struct wm_rxqueue *);
680 static int wm_alloc_tx_buffer(struct wm_softc *, struct wm_txqueue *);
681 static void wm_free_tx_buffer(struct wm_softc *, struct wm_txqueue *);
682 static void wm_init_tx_buffer(struct wm_softc *, struct wm_txqueue *);
683 static int wm_alloc_rx_buffer(struct wm_softc *, struct wm_rxqueue *);
684 static void wm_free_rx_buffer(struct wm_softc *, struct wm_rxqueue *);
685 static int wm_init_rx_buffer(struct wm_softc *, struct wm_rxqueue *);
686 static void wm_init_tx_queue(struct wm_softc *, struct wm_queue *,
687 struct wm_txqueue *);
688 static int wm_init_rx_queue(struct wm_softc *, struct wm_queue *,
689 struct wm_rxqueue *);
690 static int wm_alloc_txrx_queues(struct wm_softc *);
691 static void wm_free_txrx_queues(struct wm_softc *);
692 static int wm_init_txrx_queues(struct wm_softc *);
693 /* Start */
694 static int wm_tx_offload(struct wm_softc *, struct wm_txsoft *,
695 uint32_t *, uint8_t *);
696 static inline int wm_select_txqueue(struct ifnet *, struct mbuf *);
697 static void wm_start(struct ifnet *);
698 static void wm_start_locked(struct ifnet *);
699 static int wm_transmit(struct ifnet *, struct mbuf *);
700 static void wm_transmit_locked(struct ifnet *, struct wm_txqueue *);
701 static void wm_send_common_locked(struct ifnet *, struct wm_txqueue *, bool);
702 static int wm_nq_tx_offload(struct wm_softc *, struct wm_txqueue *,
703 struct wm_txsoft *, uint32_t *, uint32_t *, bool *);
704 static void wm_nq_start(struct ifnet *);
705 static void wm_nq_start_locked(struct ifnet *);
706 static int wm_nq_transmit(struct ifnet *, struct mbuf *);
707 static void wm_nq_transmit_locked(struct ifnet *, struct wm_txqueue *);
708 static void wm_nq_send_common_locked(struct ifnet *, struct wm_txqueue *, bool);
709 static void wm_deferred_start(struct ifnet *);
710 /* Interrupt */
711 static int wm_txeof(struct wm_softc *, struct wm_txqueue *);
712 static void wm_rxeof(struct wm_rxqueue *);
713 static void wm_linkintr_gmii(struct wm_softc *, uint32_t);
714 static void wm_linkintr_tbi(struct wm_softc *, uint32_t);
715 static void wm_linkintr_serdes(struct wm_softc *, uint32_t);
716 static void wm_linkintr(struct wm_softc *, uint32_t);
717 static int wm_intr_legacy(void *);
718 static int wm_txrxintr_msix(void *);
719 static int wm_linkintr_msix(void *);
720
721 /*
722 * Media related.
723 * GMII, SGMII, TBI, SERDES and SFP.
724 */
725 /* Common */
726 static void wm_tbi_serdes_set_linkled(struct wm_softc *);
727 /* GMII related */
728 static void wm_gmii_reset(struct wm_softc *);
729 static void wm_gmii_setup_phytype(struct wm_softc *sc, uint32_t, uint16_t);
730 static int wm_get_phy_id_82575(struct wm_softc *);
731 static void wm_gmii_mediainit(struct wm_softc *, pci_product_id_t);
732 static int wm_gmii_mediachange(struct ifnet *);
733 static void wm_gmii_mediastatus(struct ifnet *, struct ifmediareq *);
734 static void wm_i82543_mii_sendbits(struct wm_softc *, uint32_t, int);
735 static uint32_t wm_i82543_mii_recvbits(struct wm_softc *);
736 static int wm_gmii_i82543_readreg(device_t, int, int);
737 static void wm_gmii_i82543_writereg(device_t, int, int, int);
738 static int wm_gmii_mdic_readreg(device_t, int, int);
739 static void wm_gmii_mdic_writereg(device_t, int, int, int);
740 static int wm_gmii_i82544_readreg(device_t, int, int);
741 static void wm_gmii_i82544_writereg(device_t, int, int, int);
742 static int wm_gmii_i80003_readreg(device_t, int, int);
743 static void wm_gmii_i80003_writereg(device_t, int, int, int);
744 static int wm_gmii_bm_readreg(device_t, int, int);
745 static void wm_gmii_bm_writereg(device_t, int, int, int);
746 static void wm_access_phy_wakeup_reg_bm(device_t, int, int16_t *, int);
747 static int wm_gmii_hv_readreg(device_t, int, int);
748 static int wm_gmii_hv_readreg_locked(device_t, int, int);
749 static void wm_gmii_hv_writereg(device_t, int, int, int);
750 static void wm_gmii_hv_writereg_locked(device_t, int, int, int);
751 static int wm_gmii_82580_readreg(device_t, int, int);
752 static void wm_gmii_82580_writereg(device_t, int, int, int);
753 static int wm_gmii_gs40g_readreg(device_t, int, int);
754 static void wm_gmii_gs40g_writereg(device_t, int, int, int);
755 static void wm_gmii_statchg(struct ifnet *);
756 /*
757 * kumeran related (80003, ICH* and PCH*).
758 * These functions are not for accessing MII registers but for accessing
759 * kumeran specific registers.
760 */
761 static int wm_kmrn_readreg(struct wm_softc *, int);
762 static int wm_kmrn_readreg_locked(struct wm_softc *, int);
763 static void wm_kmrn_writereg(struct wm_softc *, int, int);
764 static void wm_kmrn_writereg_locked(struct wm_softc *, int, int);
765 /* SGMII */
766 static bool wm_sgmii_uses_mdio(struct wm_softc *);
767 static int wm_sgmii_readreg(device_t, int, int);
768 static void wm_sgmii_writereg(device_t, int, int, int);
769 /* TBI related */
770 static void wm_tbi_mediainit(struct wm_softc *);
771 static int wm_tbi_mediachange(struct ifnet *);
772 static void wm_tbi_mediastatus(struct ifnet *, struct ifmediareq *);
773 static int wm_check_for_link(struct wm_softc *);
774 static void wm_tbi_tick(struct wm_softc *);
775 /* SERDES related */
776 static void wm_serdes_power_up_link_82575(struct wm_softc *);
777 static int wm_serdes_mediachange(struct ifnet *);
778 static void wm_serdes_mediastatus(struct ifnet *, struct ifmediareq *);
779 static void wm_serdes_tick(struct wm_softc *);
780 /* SFP related */
781 static int wm_sfp_read_data_byte(struct wm_softc *, uint16_t, uint8_t *);
782 static uint32_t wm_sfp_get_media_type(struct wm_softc *);
783
784 /*
785 * NVM related.
786 * Microwire, SPI (w/wo EERD) and Flash.
787 */
788 /* Misc functions */
789 static void wm_eeprom_sendbits(struct wm_softc *, uint32_t, int);
790 static void wm_eeprom_recvbits(struct wm_softc *, uint32_t *, int);
791 static int wm_nvm_set_addrbits_size_eecd(struct wm_softc *);
792 /* Microwire */
793 static int wm_nvm_read_uwire(struct wm_softc *, int, int, uint16_t *);
794 /* SPI */
795 static int wm_nvm_ready_spi(struct wm_softc *);
796 static int wm_nvm_read_spi(struct wm_softc *, int, int, uint16_t *);
797 /* Using with EERD */
798 static int wm_poll_eerd_eewr_done(struct wm_softc *, int);
799 static int wm_nvm_read_eerd(struct wm_softc *, int, int, uint16_t *);
800 /* Flash */
801 static int wm_nvm_valid_bank_detect_ich8lan(struct wm_softc *,
802 unsigned int *);
803 static int32_t wm_ich8_cycle_init(struct wm_softc *);
804 static int32_t wm_ich8_flash_cycle(struct wm_softc *, uint32_t);
805 static int32_t wm_read_ich8_data(struct wm_softc *, uint32_t, uint32_t,
806 uint32_t *);
807 static int32_t wm_read_ich8_byte(struct wm_softc *, uint32_t, uint8_t *);
808 static int32_t wm_read_ich8_word(struct wm_softc *, uint32_t, uint16_t *);
809 static int32_t wm_read_ich8_dword(struct wm_softc *, uint32_t, uint32_t *);
810 static int wm_nvm_read_ich8(struct wm_softc *, int, int, uint16_t *);
811 static int wm_nvm_read_spt(struct wm_softc *, int, int, uint16_t *);
812 /* iNVM */
813 static int wm_nvm_read_word_invm(struct wm_softc *, uint16_t, uint16_t *);
814 static int wm_nvm_read_invm(struct wm_softc *, int, int, uint16_t *);
815 /* Lock, detecting NVM type, validate checksum and read */
816 static int wm_nvm_acquire(struct wm_softc *);
817 static void wm_nvm_release(struct wm_softc *);
818 static int wm_nvm_is_onboard_eeprom(struct wm_softc *);
819 static int wm_nvm_get_flash_presence_i210(struct wm_softc *);
820 static int wm_nvm_validate_checksum(struct wm_softc *);
821 static void wm_nvm_version_invm(struct wm_softc *);
822 static void wm_nvm_version(struct wm_softc *);
823 static int wm_nvm_read(struct wm_softc *, int, int, uint16_t *);
824
825 /*
826 * Hardware semaphores.
827 * Very complexed...
828 */
829 static int wm_get_null(struct wm_softc *);
830 static void wm_put_null(struct wm_softc *);
831 static int wm_get_swsm_semaphore(struct wm_softc *); /* 8257[123] */
832 static void wm_put_swsm_semaphore(struct wm_softc *);
833 static int wm_get_swfw_semaphore(struct wm_softc *, uint16_t);
834 static void wm_put_swfw_semaphore(struct wm_softc *, uint16_t);
835 static int wm_get_phy_82575(struct wm_softc *);
836 static void wm_put_phy_82575(struct wm_softc *);
837 static int wm_get_swfwhw_semaphore(struct wm_softc *); /* For 574/583 */
838 static void wm_put_swfwhw_semaphore(struct wm_softc *);
839 static int wm_get_swflag_ich8lan(struct wm_softc *); /* For PHY */
840 static void wm_put_swflag_ich8lan(struct wm_softc *);
841 static int wm_get_nvm_ich8lan(struct wm_softc *); /* For NVM */
842 static void wm_put_nvm_ich8lan(struct wm_softc *);
843 static int wm_get_hw_semaphore_82573(struct wm_softc *);
844 static void wm_put_hw_semaphore_82573(struct wm_softc *);
845
846 /*
847 * Management mode and power management related subroutines.
848 * BMC, AMT, suspend/resume and EEE.
849 */
850 #if 0
851 static int wm_check_mng_mode(struct wm_softc *);
852 static int wm_check_mng_mode_ich8lan(struct wm_softc *);
853 static int wm_check_mng_mode_82574(struct wm_softc *);
854 static int wm_check_mng_mode_generic(struct wm_softc *);
855 #endif
856 static int wm_enable_mng_pass_thru(struct wm_softc *);
857 static bool wm_phy_resetisblocked(struct wm_softc *);
858 static void wm_get_hw_control(struct wm_softc *);
859 static void wm_release_hw_control(struct wm_softc *);
860 static void wm_gate_hw_phy_config_ich8lan(struct wm_softc *, bool);
861 static void wm_smbustopci(struct wm_softc *);
862 static void wm_init_manageability(struct wm_softc *);
863 static void wm_release_manageability(struct wm_softc *);
864 static void wm_get_wakeup(struct wm_softc *);
865 static void wm_ulp_disable(struct wm_softc *);
866 static void wm_enable_phy_wakeup(struct wm_softc *);
867 static void wm_igp3_phy_powerdown_workaround_ich8lan(struct wm_softc *);
868 static void wm_enable_wakeup(struct wm_softc *);
869 /* LPLU (Low Power Link Up) */
870 static void wm_lplu_d0_disable(struct wm_softc *);
871 static void wm_lplu_d0_disable_pch(struct wm_softc *);
872 /* EEE */
873 static void wm_set_eee_i350(struct wm_softc *);
874
875 /*
876 * Workarounds (mainly PHY related).
877 * Basically, PHY's workarounds are in the PHY drivers.
878 */
879 static void wm_kmrn_lock_loss_workaround_ich8lan(struct wm_softc *);
880 static void wm_gig_downshift_workaround_ich8lan(struct wm_softc *);
881 static void wm_hv_phy_workaround_ich8lan(struct wm_softc *);
882 static void wm_lv_phy_workaround_ich8lan(struct wm_softc *);
883 static int wm_k1_gig_workaround_hv(struct wm_softc *, int);
884 static void wm_set_mdio_slow_mode_hv(struct wm_softc *);
885 static void wm_configure_k1_ich8lan(struct wm_softc *, int);
886 static void wm_reset_init_script_82575(struct wm_softc *);
887 static void wm_reset_mdicnfg_82580(struct wm_softc *);
888 static bool wm_phy_is_accessible_pchlan(struct wm_softc *);
889 static void wm_toggle_lanphypc_pch_lpt(struct wm_softc *);
890 static int wm_platform_pm_pch_lpt(struct wm_softc *, bool);
891 static void wm_pll_workaround_i210(struct wm_softc *);
892
893 CFATTACH_DECL3_NEW(wm, sizeof(struct wm_softc),
894 wm_match, wm_attach, wm_detach, NULL, NULL, NULL, DVF_DETACH_SHUTDOWN);
895
896 /*
897 * Devices supported by this driver.
898 */
899 static const struct wm_product {
900 pci_vendor_id_t wmp_vendor;
901 pci_product_id_t wmp_product;
902 const char *wmp_name;
903 wm_chip_type wmp_type;
904 uint32_t wmp_flags;
905 #define WMP_F_UNKNOWN WM_MEDIATYPE_UNKNOWN
906 #define WMP_F_FIBER WM_MEDIATYPE_FIBER
907 #define WMP_F_COPPER WM_MEDIATYPE_COPPER
908 #define WMP_F_SERDES WM_MEDIATYPE_SERDES
909 #define WMP_MEDIATYPE(x) ((x) & 0x03)
910 } wm_products[] = {
911 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82542,
912 "Intel i82542 1000BASE-X Ethernet",
913 WM_T_82542_2_1, WMP_F_FIBER },
914
915 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82543GC_FIBER,
916 "Intel i82543GC 1000BASE-X Ethernet",
917 WM_T_82543, WMP_F_FIBER },
918
919 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82543GC_COPPER,
920 "Intel i82543GC 1000BASE-T Ethernet",
921 WM_T_82543, WMP_F_COPPER },
922
923 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544EI_COPPER,
924 "Intel i82544EI 1000BASE-T Ethernet",
925 WM_T_82544, WMP_F_COPPER },
926
927 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544EI_FIBER,
928 "Intel i82544EI 1000BASE-X Ethernet",
929 WM_T_82544, WMP_F_FIBER },
930
931 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544GC_COPPER,
932 "Intel i82544GC 1000BASE-T Ethernet",
933 WM_T_82544, WMP_F_COPPER },
934
935 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82544GC_LOM,
936 "Intel i82544GC (LOM) 1000BASE-T Ethernet",
937 WM_T_82544, WMP_F_COPPER },
938
939 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EM,
940 "Intel i82540EM 1000BASE-T Ethernet",
941 WM_T_82540, WMP_F_COPPER },
942
943 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EM_LOM,
944 "Intel i82540EM (LOM) 1000BASE-T Ethernet",
945 WM_T_82540, WMP_F_COPPER },
946
947 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP_LOM,
948 "Intel i82540EP 1000BASE-T Ethernet",
949 WM_T_82540, WMP_F_COPPER },
950
951 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP,
952 "Intel i82540EP 1000BASE-T Ethernet",
953 WM_T_82540, WMP_F_COPPER },
954
955 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82540EP_LP,
956 "Intel i82540EP 1000BASE-T Ethernet",
957 WM_T_82540, WMP_F_COPPER },
958
959 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545EM_COPPER,
960 "Intel i82545EM 1000BASE-T Ethernet",
961 WM_T_82545, WMP_F_COPPER },
962
963 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_COPPER,
964 "Intel i82545GM 1000BASE-T Ethernet",
965 WM_T_82545_3, WMP_F_COPPER },
966
967 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_FIBER,
968 "Intel i82545GM 1000BASE-X Ethernet",
969 WM_T_82545_3, WMP_F_FIBER },
970
971 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545GM_SERDES,
972 "Intel i82545GM Gigabit Ethernet (SERDES)",
973 WM_T_82545_3, WMP_F_SERDES },
974
975 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_COPPER,
976 "Intel i82546EB 1000BASE-T Ethernet",
977 WM_T_82546, WMP_F_COPPER },
978
979 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_QUAD,
980 "Intel i82546EB 1000BASE-T Ethernet",
981 WM_T_82546, WMP_F_COPPER },
982
983 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82545EM_FIBER,
984 "Intel i82545EM 1000BASE-X Ethernet",
985 WM_T_82545, WMP_F_FIBER },
986
987 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546EB_FIBER,
988 "Intel i82546EB 1000BASE-X Ethernet",
989 WM_T_82546, WMP_F_FIBER },
990
991 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_COPPER,
992 "Intel i82546GB 1000BASE-T Ethernet",
993 WM_T_82546_3, WMP_F_COPPER },
994
995 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_FIBER,
996 "Intel i82546GB 1000BASE-X Ethernet",
997 WM_T_82546_3, WMP_F_FIBER },
998
999 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_SERDES,
1000 "Intel i82546GB Gigabit Ethernet (SERDES)",
1001 WM_T_82546_3, WMP_F_SERDES },
1002
1003 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER,
1004 "i82546GB quad-port Gigabit Ethernet",
1005 WM_T_82546_3, WMP_F_COPPER },
1006
1007 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_QUAD_COPPER_KSP3,
1008 "i82546GB quad-port Gigabit Ethernet (KSP3)",
1009 WM_T_82546_3, WMP_F_COPPER },
1010
1011 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82546GB_PCIE,
1012 "Intel PRO/1000MT (82546GB)",
1013 WM_T_82546_3, WMP_F_COPPER },
1014
1015 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541EI,
1016 "Intel i82541EI 1000BASE-T Ethernet",
1017 WM_T_82541, WMP_F_COPPER },
1018
1019 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541ER_LOM,
1020 "Intel i82541ER (LOM) 1000BASE-T Ethernet",
1021 WM_T_82541, WMP_F_COPPER },
1022
1023 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541EI_MOBILE,
1024 "Intel i82541EI Mobile 1000BASE-T Ethernet",
1025 WM_T_82541, WMP_F_COPPER },
1026
1027 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541ER,
1028 "Intel i82541ER 1000BASE-T Ethernet",
1029 WM_T_82541_2, WMP_F_COPPER },
1030
1031 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541GI,
1032 "Intel i82541GI 1000BASE-T Ethernet",
1033 WM_T_82541_2, WMP_F_COPPER },
1034
1035 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541GI_MOBILE,
1036 "Intel i82541GI Mobile 1000BASE-T Ethernet",
1037 WM_T_82541_2, WMP_F_COPPER },
1038
1039 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82541PI,
1040 "Intel i82541PI 1000BASE-T Ethernet",
1041 WM_T_82541_2, WMP_F_COPPER },
1042
1043 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547EI,
1044 "Intel i82547EI 1000BASE-T Ethernet",
1045 WM_T_82547, WMP_F_COPPER },
1046
1047 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547EI_MOBILE,
1048 "Intel i82547EI Mobile 1000BASE-T Ethernet",
1049 WM_T_82547, WMP_F_COPPER },
1050
1051 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82547GI,
1052 "Intel i82547GI 1000BASE-T Ethernet",
1053 WM_T_82547_2, WMP_F_COPPER },
1054
1055 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_COPPER,
1056 "Intel PRO/1000 PT (82571EB)",
1057 WM_T_82571, WMP_F_COPPER },
1058
1059 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_FIBER,
1060 "Intel PRO/1000 PF (82571EB)",
1061 WM_T_82571, WMP_F_FIBER },
1062
1063 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_SERDES,
1064 "Intel PRO/1000 PB (82571EB)",
1065 WM_T_82571, WMP_F_SERDES },
1066
1067 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_COPPER,
1068 "Intel PRO/1000 QT (82571EB)",
1069 WM_T_82571, WMP_F_COPPER },
1070
1071 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571GB_QUAD_COPPER,
1072 "Intel PRO/1000 PT Quad Port Server Adapter",
1073 WM_T_82571, WMP_F_COPPER, },
1074
1075 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571PT_QUAD_COPPER,
1076 "Intel Gigabit PT Quad Port Server ExpressModule",
1077 WM_T_82571, WMP_F_COPPER, },
1078
1079 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_DUAL_SERDES,
1080 "Intel 82571EB Dual Gigabit Ethernet (SERDES)",
1081 WM_T_82571, WMP_F_SERDES, },
1082
1083 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_SERDES,
1084 "Intel 82571EB Quad Gigabit Ethernet (SERDES)",
1085 WM_T_82571, WMP_F_SERDES, },
1086
1087 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82571EB_QUAD_FIBER,
1088 "Intel 82571EB Quad 1000baseX Ethernet",
1089 WM_T_82571, WMP_F_FIBER, },
1090
1091 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_COPPER,
1092 "Intel i82572EI 1000baseT Ethernet",
1093 WM_T_82572, WMP_F_COPPER },
1094
1095 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_FIBER,
1096 "Intel i82572EI 1000baseX Ethernet",
1097 WM_T_82572, WMP_F_FIBER },
1098
1099 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI_SERDES,
1100 "Intel i82572EI Gigabit Ethernet (SERDES)",
1101 WM_T_82572, WMP_F_SERDES },
1102
1103 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82572EI,
1104 "Intel i82572EI 1000baseT Ethernet",
1105 WM_T_82572, WMP_F_COPPER },
1106
1107 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573E,
1108 "Intel i82573E",
1109 WM_T_82573, WMP_F_COPPER },
1110
1111 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573E_IAMT,
1112 "Intel i82573E IAMT",
1113 WM_T_82573, WMP_F_COPPER },
1114
1115 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82573L,
1116 "Intel i82573L Gigabit Ethernet",
1117 WM_T_82573, WMP_F_COPPER },
1118
1119 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82574L,
1120 "Intel i82574L",
1121 WM_T_82574, WMP_F_COPPER },
1122
1123 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82574LA,
1124 "Intel i82574L",
1125 WM_T_82574, WMP_F_COPPER },
1126
1127 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82583V,
1128 "Intel i82583V",
1129 WM_T_82583, WMP_F_COPPER },
1130
1131 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_CPR_DPT,
1132 "i80003 dual 1000baseT Ethernet",
1133 WM_T_80003, WMP_F_COPPER },
1134
1135 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_FIB_DPT,
1136 "i80003 dual 1000baseX Ethernet",
1137 WM_T_80003, WMP_F_COPPER },
1138
1139 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_SDS_DPT,
1140 "Intel i80003ES2 dual Gigabit Ethernet (SERDES)",
1141 WM_T_80003, WMP_F_SERDES },
1142
1143 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_CPR_SPT,
1144 "Intel i80003 1000baseT Ethernet",
1145 WM_T_80003, WMP_F_COPPER },
1146
1147 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_80K3LAN_SDS_SPT,
1148 "Intel i80003 Gigabit Ethernet (SERDES)",
1149 WM_T_80003, WMP_F_SERDES },
1150
1151 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_M_AMT,
1152 "Intel i82801H (M_AMT) LAN Controller",
1153 WM_T_ICH8, WMP_F_COPPER },
1154 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_AMT,
1155 "Intel i82801H (AMT) LAN Controller",
1156 WM_T_ICH8, WMP_F_COPPER },
1157 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_LAN,
1158 "Intel i82801H LAN Controller",
1159 WM_T_ICH8, WMP_F_COPPER },
1160 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_IFE_LAN,
1161 "Intel i82801H (IFE) 10/100 LAN Controller",
1162 WM_T_ICH8, WMP_F_COPPER },
1163 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_M_LAN,
1164 "Intel i82801H (M) LAN Controller",
1165 WM_T_ICH8, WMP_F_COPPER },
1166 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_IFE_GT,
1167 "Intel i82801H IFE (GT) 10/100 LAN Controller",
1168 WM_T_ICH8, WMP_F_COPPER },
1169 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_IFE_G,
1170 "Intel i82801H IFE (G) 10/100 LAN Controller",
1171 WM_T_ICH8, WMP_F_COPPER },
1172 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801H_82567V_3,
1173 "82567V-3 LAN Controller",
1174 WM_T_ICH8, WMP_F_COPPER },
1175 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_AMT,
1176 "82801I (AMT) LAN Controller",
1177 WM_T_ICH9, WMP_F_COPPER },
1178 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IFE,
1179 "82801I 10/100 LAN Controller",
1180 WM_T_ICH9, WMP_F_COPPER },
1181 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IFE_G,
1182 "82801I (G) 10/100 LAN Controller",
1183 WM_T_ICH9, WMP_F_COPPER },
1184 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IFE_GT,
1185 "82801I (GT) 10/100 LAN Controller",
1186 WM_T_ICH9, WMP_F_COPPER },
1187 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_C,
1188 "82801I (C) LAN Controller",
1189 WM_T_ICH9, WMP_F_COPPER },
1190 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_M,
1191 "82801I mobile LAN Controller",
1192 WM_T_ICH9, WMP_F_COPPER },
1193 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_M_V,
1194 "82801I mobile (V) LAN Controller",
1195 WM_T_ICH9, WMP_F_COPPER },
1196 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_IGP_M_AMT,
1197 "82801I mobile (AMT) LAN Controller",
1198 WM_T_ICH9, WMP_F_COPPER },
1199 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801I_BM,
1200 "82567LM-4 LAN Controller",
1201 WM_T_ICH9, WMP_F_COPPER },
1202 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_R_BM_LM,
1203 "82567LM-2 LAN Controller",
1204 WM_T_ICH10, WMP_F_COPPER },
1205 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_R_BM_LF,
1206 "82567LF-2 LAN Controller",
1207 WM_T_ICH10, WMP_F_COPPER },
1208 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_D_BM_LM,
1209 "82567LM-3 LAN Controller",
1210 WM_T_ICH10, WMP_F_COPPER },
1211 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_D_BM_LF,
1212 "82567LF-3 LAN Controller",
1213 WM_T_ICH10, WMP_F_COPPER },
1214 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_R_BM_V,
1215 "82567V-2 LAN Controller",
1216 WM_T_ICH10, WMP_F_COPPER },
1217 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82801J_D_BM_V,
1218 "82567V-3? LAN Controller",
1219 WM_T_ICH10, WMP_F_COPPER },
1220 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_HANKSVILLE,
1221 "HANKSVILLE LAN Controller",
1222 WM_T_ICH10, WMP_F_COPPER },
1223 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_M_LM,
1224 "PCH LAN (82577LM) Controller",
1225 WM_T_PCH, WMP_F_COPPER },
1226 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_M_LC,
1227 "PCH LAN (82577LC) Controller",
1228 WM_T_PCH, WMP_F_COPPER },
1229 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_D_DM,
1230 "PCH LAN (82578DM) Controller",
1231 WM_T_PCH, WMP_F_COPPER },
1232 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH_D_DC,
1233 "PCH LAN (82578DC) Controller",
1234 WM_T_PCH, WMP_F_COPPER },
1235 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH2_LV_LM,
1236 "PCH2 LAN (82579LM) Controller",
1237 WM_T_PCH2, WMP_F_COPPER },
1238 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PCH2_LV_V,
1239 "PCH2 LAN (82579V) Controller",
1240 WM_T_PCH2, WMP_F_COPPER },
1241 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575EB_COPPER,
1242 "82575EB dual-1000baseT Ethernet",
1243 WM_T_82575, WMP_F_COPPER },
1244 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575EB_FIBER_SERDES,
1245 "82575EB dual-1000baseX Ethernet (SERDES)",
1246 WM_T_82575, WMP_F_SERDES },
1247 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575GB_QUAD_COPPER,
1248 "82575GB quad-1000baseT Ethernet",
1249 WM_T_82575, WMP_F_COPPER },
1250 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82575GB_QUAD_COPPER_PM,
1251 "82575GB quad-1000baseT Ethernet (PM)",
1252 WM_T_82575, WMP_F_COPPER },
1253 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_COPPER,
1254 "82576 1000BaseT Ethernet",
1255 WM_T_82576, WMP_F_COPPER },
1256 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_FIBER,
1257 "82576 1000BaseX Ethernet",
1258 WM_T_82576, WMP_F_FIBER },
1259
1260 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_SERDES,
1261 "82576 gigabit Ethernet (SERDES)",
1262 WM_T_82576, WMP_F_SERDES },
1263
1264 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_QUAD_COPPER,
1265 "82576 quad-1000BaseT Ethernet",
1266 WM_T_82576, WMP_F_COPPER },
1267
1268 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_QUAD_COPPER_ET2,
1269 "82576 Gigabit ET2 Quad Port Server Adapter",
1270 WM_T_82576, WMP_F_COPPER },
1271
1272 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_NS,
1273 "82576 gigabit Ethernet",
1274 WM_T_82576, WMP_F_COPPER },
1275
1276 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_NS_SERDES,
1277 "82576 gigabit Ethernet (SERDES)",
1278 WM_T_82576, WMP_F_SERDES },
1279 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82576_SERDES_QUAD,
1280 "82576 quad-gigabit Ethernet (SERDES)",
1281 WM_T_82576, WMP_F_SERDES },
1282
1283 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_COPPER,
1284 "82580 1000BaseT Ethernet",
1285 WM_T_82580, WMP_F_COPPER },
1286 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_FIBER,
1287 "82580 1000BaseX Ethernet",
1288 WM_T_82580, WMP_F_FIBER },
1289
1290 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_SERDES,
1291 "82580 1000BaseT Ethernet (SERDES)",
1292 WM_T_82580, WMP_F_SERDES },
1293
1294 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_SGMII,
1295 "82580 gigabit Ethernet (SGMII)",
1296 WM_T_82580, WMP_F_COPPER },
1297 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_COPPER_DUAL,
1298 "82580 dual-1000BaseT Ethernet",
1299 WM_T_82580, WMP_F_COPPER },
1300
1301 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_82580_QUAD_FIBER,
1302 "82580 quad-1000BaseX Ethernet",
1303 WM_T_82580, WMP_F_FIBER },
1304
1305 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_SGMII,
1306 "DH89XXCC Gigabit Ethernet (SGMII)",
1307 WM_T_82580, WMP_F_COPPER },
1308
1309 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_SERDES,
1310 "DH89XXCC Gigabit Ethernet (SERDES)",
1311 WM_T_82580, WMP_F_SERDES },
1312
1313 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_BPLANE,
1314 "DH89XXCC 1000BASE-KX Ethernet",
1315 WM_T_82580, WMP_F_SERDES },
1316
1317 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_DH89XXCC_SFP,
1318 "DH89XXCC Gigabit Ethernet (SFP)",
1319 WM_T_82580, WMP_F_SERDES },
1320
1321 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_COPPER,
1322 "I350 Gigabit Network Connection",
1323 WM_T_I350, WMP_F_COPPER },
1324
1325 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_FIBER,
1326 "I350 Gigabit Fiber Network Connection",
1327 WM_T_I350, WMP_F_FIBER },
1328
1329 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_SERDES,
1330 "I350 Gigabit Backplane Connection",
1331 WM_T_I350, WMP_F_SERDES },
1332
1333 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_DA4,
1334 "I350 Quad Port Gigabit Ethernet",
1335 WM_T_I350, WMP_F_SERDES },
1336
1337 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I350_SGMII,
1338 "I350 Gigabit Connection",
1339 WM_T_I350, WMP_F_COPPER },
1340
1341 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_C2000_1000KX,
1342 "I354 Gigabit Ethernet (KX)",
1343 WM_T_I354, WMP_F_SERDES },
1344
1345 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_C2000_SGMII,
1346 "I354 Gigabit Ethernet (SGMII)",
1347 WM_T_I354, WMP_F_COPPER },
1348
1349 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_C2000_25GBE,
1350 "I354 Gigabit Ethernet (2.5G)",
1351 WM_T_I354, WMP_F_COPPER },
1352
1353 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_T1,
1354 "I210-T1 Ethernet Server Adapter",
1355 WM_T_I210, WMP_F_COPPER },
1356
1357 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_COPPER_OEM1,
1358 "I210 Ethernet (Copper OEM)",
1359 WM_T_I210, WMP_F_COPPER },
1360
1361 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_COPPER_IT,
1362 "I210 Ethernet (Copper IT)",
1363 WM_T_I210, WMP_F_COPPER },
1364
1365 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_COPPER_WOF,
1366 "I210 Ethernet (FLASH less)",
1367 WM_T_I210, WMP_F_COPPER },
1368
1369 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_FIBER,
1370 "I210 Gigabit Ethernet (Fiber)",
1371 WM_T_I210, WMP_F_FIBER },
1372
1373 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SERDES,
1374 "I210 Gigabit Ethernet (SERDES)",
1375 WM_T_I210, WMP_F_SERDES },
1376
1377 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SERDES_WOF,
1378 "I210 Gigabit Ethernet (FLASH less)",
1379 WM_T_I210, WMP_F_SERDES },
1380
1381 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I210_SGMII,
1382 "I210 Gigabit Ethernet (SGMII)",
1383 WM_T_I210, WMP_F_COPPER },
1384
1385 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I211_COPPER,
1386 "I211 Ethernet (COPPER)",
1387 WM_T_I211, WMP_F_COPPER },
1388 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I217_V,
1389 "I217 V Ethernet Connection",
1390 WM_T_PCH_LPT, WMP_F_COPPER },
1391 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I217_LM,
1392 "I217 LM Ethernet Connection",
1393 WM_T_PCH_LPT, WMP_F_COPPER },
1394 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_V,
1395 "I218 V Ethernet Connection",
1396 WM_T_PCH_LPT, WMP_F_COPPER },
1397 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_V2,
1398 "I218 V Ethernet Connection",
1399 WM_T_PCH_LPT, WMP_F_COPPER },
1400 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_V3,
1401 "I218 V Ethernet Connection",
1402 WM_T_PCH_LPT, WMP_F_COPPER },
1403 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_LM,
1404 "I218 LM Ethernet Connection",
1405 WM_T_PCH_LPT, WMP_F_COPPER },
1406 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_LM2,
1407 "I218 LM Ethernet Connection",
1408 WM_T_PCH_LPT, WMP_F_COPPER },
1409 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I218_LM3,
1410 "I218 LM Ethernet Connection",
1411 WM_T_PCH_LPT, WMP_F_COPPER },
1412 #if 0
1413 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V,
1414 "I219 V Ethernet Connection",
1415 WM_T_PCH_SPT, WMP_F_COPPER },
1416 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V2,
1417 "I219 V Ethernet Connection",
1418 WM_T_PCH_SPT, WMP_F_COPPER },
1419 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V4,
1420 "I219 V Ethernet Connection",
1421 WM_T_PCH_SPT, WMP_F_COPPER },
1422 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_V5,
1423 "I219 V Ethernet Connection",
1424 WM_T_PCH_SPT, WMP_F_COPPER },
1425 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM,
1426 "I219 LM Ethernet Connection",
1427 WM_T_PCH_SPT, WMP_F_COPPER },
1428 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM2,
1429 "I219 LM Ethernet Connection",
1430 WM_T_PCH_SPT, WMP_F_COPPER },
1431 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM3,
1432 "I219 LM Ethernet Connection",
1433 WM_T_PCH_SPT, WMP_F_COPPER },
1434 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM4,
1435 "I219 LM Ethernet Connection",
1436 WM_T_PCH_SPT, WMP_F_COPPER },
1437 { PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_I219_LM5,
1438 "I219 LM Ethernet Connection",
1439 WM_T_PCH_SPT, WMP_F_COPPER },
1440 #endif
1441 { 0, 0,
1442 NULL,
1443 0, 0 },
1444 };
1445
1446 /*
1447 * Register read/write functions.
1448 * Other than CSR_{READ|WRITE}().
1449 */
1450
1451 #if 0 /* Not currently used */
1452 static inline uint32_t
1453 wm_io_read(struct wm_softc *sc, int reg)
1454 {
1455
1456 bus_space_write_4(sc->sc_iot, sc->sc_ioh, 0, reg);
1457 return (bus_space_read_4(sc->sc_iot, sc->sc_ioh, 4));
1458 }
1459 #endif
1460
1461 static inline void
1462 wm_io_write(struct wm_softc *sc, int reg, uint32_t val)
1463 {
1464
1465 bus_space_write_4(sc->sc_iot, sc->sc_ioh, 0, reg);
1466 bus_space_write_4(sc->sc_iot, sc->sc_ioh, 4, val);
1467 }
1468
1469 static inline void
1470 wm_82575_write_8bit_ctlr_reg(struct wm_softc *sc, uint32_t reg, uint32_t off,
1471 uint32_t data)
1472 {
1473 uint32_t regval;
1474 int i;
1475
1476 regval = (data & SCTL_CTL_DATA_MASK) | (off << SCTL_CTL_ADDR_SHIFT);
1477
1478 CSR_WRITE(sc, reg, regval);
1479
1480 for (i = 0; i < SCTL_CTL_POLL_TIMEOUT; i++) {
1481 delay(5);
1482 if (CSR_READ(sc, reg) & SCTL_CTL_READY)
1483 break;
1484 }
1485 if (i == SCTL_CTL_POLL_TIMEOUT) {
1486 aprint_error("%s: WARNING:"
1487 " i82575 reg 0x%08x setup did not indicate ready\n",
1488 device_xname(sc->sc_dev), reg);
1489 }
1490 }
1491
1492 static inline void
1493 wm_set_dma_addr(volatile wiseman_addr_t *wa, bus_addr_t v)
1494 {
1495 wa->wa_low = htole32(v & 0xffffffffU);
1496 if (sizeof(bus_addr_t) == 8)
1497 wa->wa_high = htole32((uint64_t) v >> 32);
1498 else
1499 wa->wa_high = 0;
1500 }
1501
1502 /*
1503 * Descriptor sync/init functions.
1504 */
1505 static inline void
1506 wm_cdtxsync(struct wm_txqueue *txq, int start, int num, int ops)
1507 {
1508 struct wm_softc *sc = txq->txq_sc;
1509
1510 /* If it will wrap around, sync to the end of the ring. */
1511 if ((start + num) > WM_NTXDESC(txq)) {
1512 bus_dmamap_sync(sc->sc_dmat, txq->txq_desc_dmamap,
1513 WM_CDTXOFF(txq, start), txq->txq_descsize *
1514 (WM_NTXDESC(txq) - start), ops);
1515 num -= (WM_NTXDESC(txq) - start);
1516 start = 0;
1517 }
1518
1519 /* Now sync whatever is left. */
1520 bus_dmamap_sync(sc->sc_dmat, txq->txq_desc_dmamap,
1521 WM_CDTXOFF(txq, start), txq->txq_descsize * num, ops);
1522 }
1523
1524 static inline void
1525 wm_cdrxsync(struct wm_rxqueue *rxq, int start, int ops)
1526 {
1527 struct wm_softc *sc = rxq->rxq_sc;
1528
1529 bus_dmamap_sync(sc->sc_dmat, rxq->rxq_desc_dmamap,
1530 WM_CDRXOFF(rxq, start), rxq->rxq_descsize, ops);
1531 }
1532
1533 static inline void
1534 wm_init_rxdesc(struct wm_rxqueue *rxq, int start)
1535 {
1536 struct wm_softc *sc = rxq->rxq_sc;
1537 struct wm_rxsoft *rxs = &rxq->rxq_soft[start];
1538 struct mbuf *m = rxs->rxs_mbuf;
1539
1540 /*
1541 * Note: We scoot the packet forward 2 bytes in the buffer
1542 * so that the payload after the Ethernet header is aligned
1543 * to a 4-byte boundary.
1544
1545 * XXX BRAINDAMAGE ALERT!
1546 * The stupid chip uses the same size for every buffer, which
1547 * is set in the Receive Control register. We are using the 2K
1548 * size option, but what we REALLY want is (2K - 2)! For this
1549 * reason, we can't "scoot" packets longer than the standard
1550 * Ethernet MTU. On strict-alignment platforms, if the total
1551 * size exceeds (2K - 2) we set align_tweak to 0 and let
1552 * the upper layer copy the headers.
1553 */
1554 m->m_data = m->m_ext.ext_buf + sc->sc_align_tweak;
1555
1556 if (sc->sc_type == WM_T_82574) {
1557 ext_rxdesc_t *rxd = &rxq->rxq_ext_descs[start];
1558 rxd->erx_data.erxd_addr =
1559 htole64(rxs->rxs_dmamap->dm_segs[0].ds_addr + sc->sc_align_tweak);
1560 rxd->erx_data.erxd_dd = 0;
1561 } else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
1562 nq_rxdesc_t *rxd = &rxq->rxq_nq_descs[start];
1563
1564 rxd->nqrx_data.nrxd_paddr =
1565 htole64(rxs->rxs_dmamap->dm_segs[0].ds_addr + sc->sc_align_tweak);
1566 /* Currently, split header is not supported. */
1567 rxd->nqrx_data.nrxd_haddr = 0;
1568 } else {
1569 wiseman_rxdesc_t *rxd = &rxq->rxq_descs[start];
1570
1571 wm_set_dma_addr(&rxd->wrx_addr,
1572 rxs->rxs_dmamap->dm_segs[0].ds_addr + sc->sc_align_tweak);
1573 rxd->wrx_len = 0;
1574 rxd->wrx_cksum = 0;
1575 rxd->wrx_status = 0;
1576 rxd->wrx_errors = 0;
1577 rxd->wrx_special = 0;
1578 }
1579 wm_cdrxsync(rxq, start, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
1580
1581 CSR_WRITE(sc, rxq->rxq_rdt_reg, start);
1582 }
1583
1584 /*
1585 * Device driver interface functions and commonly used functions.
1586 * match, attach, detach, init, start, stop, ioctl, watchdog and so on.
1587 */
1588
1589 /* Lookup supported device table */
1590 static const struct wm_product *
1591 wm_lookup(const struct pci_attach_args *pa)
1592 {
1593 const struct wm_product *wmp;
1594
1595 for (wmp = wm_products; wmp->wmp_name != NULL; wmp++) {
1596 if (PCI_VENDOR(pa->pa_id) == wmp->wmp_vendor &&
1597 PCI_PRODUCT(pa->pa_id) == wmp->wmp_product)
1598 return wmp;
1599 }
1600 return NULL;
1601 }
1602
1603 /* The match function (ca_match) */
1604 static int
1605 wm_match(device_t parent, cfdata_t cf, void *aux)
1606 {
1607 struct pci_attach_args *pa = aux;
1608
1609 if (wm_lookup(pa) != NULL)
1610 return 1;
1611
1612 return 0;
1613 }
1614
1615 /* The attach function (ca_attach) */
1616 static void
1617 wm_attach(device_t parent, device_t self, void *aux)
1618 {
1619 struct wm_softc *sc = device_private(self);
1620 struct pci_attach_args *pa = aux;
1621 prop_dictionary_t dict;
1622 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
1623 pci_chipset_tag_t pc = pa->pa_pc;
1624 int counts[PCI_INTR_TYPE_SIZE];
1625 pci_intr_type_t max_type;
1626 const char *eetype, *xname;
1627 bus_space_tag_t memt;
1628 bus_space_handle_t memh;
1629 bus_size_t memsize;
1630 int memh_valid;
1631 int i, error;
1632 const struct wm_product *wmp;
1633 prop_data_t ea;
1634 prop_number_t pn;
1635 uint8_t enaddr[ETHER_ADDR_LEN];
1636 uint16_t cfg1, cfg2, swdpin, nvmword;
1637 pcireg_t preg, memtype;
1638 uint16_t eeprom_data, apme_mask;
1639 bool force_clear_smbi;
1640 uint32_t link_mode;
1641 uint32_t reg;
1642 void (*deferred_start_func)(struct ifnet *) = NULL;
1643
1644 sc->sc_dev = self;
1645 callout_init(&sc->sc_tick_ch, CALLOUT_FLAGS);
1646 sc->sc_core_stopping = false;
1647
1648 wmp = wm_lookup(pa);
1649 #ifdef DIAGNOSTIC
1650 if (wmp == NULL) {
1651 printf("\n");
1652 panic("wm_attach: impossible");
1653 }
1654 #endif
1655 sc->sc_mediatype = WMP_MEDIATYPE(wmp->wmp_flags);
1656
1657 sc->sc_pc = pa->pa_pc;
1658 sc->sc_pcitag = pa->pa_tag;
1659
1660 if (pci_dma64_available(pa))
1661 sc->sc_dmat = pa->pa_dmat64;
1662 else
1663 sc->sc_dmat = pa->pa_dmat;
1664
1665 sc->sc_pcidevid = PCI_PRODUCT(pa->pa_id);
1666 sc->sc_rev = PCI_REVISION(pci_conf_read(pc, pa->pa_tag,PCI_CLASS_REG));
1667 pci_aprint_devinfo_fancy(pa, "Ethernet controller", wmp->wmp_name, 1);
1668
1669 sc->sc_type = wmp->wmp_type;
1670
1671 /* Set default function pointers */
1672 sc->phy.acquire = wm_get_null;
1673 sc->phy.release = wm_put_null;
1674 sc->phy.reset_delay_us = (sc->sc_type >= WM_T_82571) ? 100 : 10000;
1675
1676 if (sc->sc_type < WM_T_82543) {
1677 if (sc->sc_rev < 2) {
1678 aprint_error_dev(sc->sc_dev,
1679 "i82542 must be at least rev. 2\n");
1680 return;
1681 }
1682 if (sc->sc_rev < 3)
1683 sc->sc_type = WM_T_82542_2_0;
1684 }
1685
1686 /*
1687 * Disable MSI for Errata:
1688 * "Message Signaled Interrupt Feature May Corrupt Write Transactions"
1689 *
1690 * 82544: Errata 25
1691 * 82540: Errata 6 (easy to reproduce device timeout)
1692 * 82545: Errata 4 (easy to reproduce device timeout)
1693 * 82546: Errata 26 (easy to reproduce device timeout)
1694 * 82541: Errata 7 (easy to reproduce device timeout)
1695 *
1696 * "Byte Enables 2 and 3 are not set on MSI writes"
1697 *
1698 * 82571 & 82572: Errata 63
1699 */
1700 if ((sc->sc_type <= WM_T_82541_2) || (sc->sc_type == WM_T_82571)
1701 || (sc->sc_type == WM_T_82572))
1702 pa->pa_flags &= ~PCI_FLAGS_MSI_OKAY;
1703
1704 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
1705 || (sc->sc_type == WM_T_82580)
1706 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)
1707 || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211))
1708 sc->sc_flags |= WM_F_NEWQUEUE;
1709
1710 /* Set device properties (mactype) */
1711 dict = device_properties(sc->sc_dev);
1712 prop_dictionary_set_uint32(dict, "mactype", sc->sc_type);
1713
1714 /*
1715 * Map the device. All devices support memory-mapped acccess,
1716 * and it is really required for normal operation.
1717 */
1718 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, WM_PCI_MMBA);
1719 switch (memtype) {
1720 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT:
1721 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT:
1722 memh_valid = (pci_mapreg_map(pa, WM_PCI_MMBA,
1723 memtype, 0, &memt, &memh, NULL, &memsize) == 0);
1724 break;
1725 default:
1726 memh_valid = 0;
1727 break;
1728 }
1729
1730 if (memh_valid) {
1731 sc->sc_st = memt;
1732 sc->sc_sh = memh;
1733 sc->sc_ss = memsize;
1734 } else {
1735 aprint_error_dev(sc->sc_dev,
1736 "unable to map device registers\n");
1737 return;
1738 }
1739
1740 /*
1741 * In addition, i82544 and later support I/O mapped indirect
1742 * register access. It is not desirable (nor supported in
1743 * this driver) to use it for normal operation, though it is
1744 * required to work around bugs in some chip versions.
1745 */
1746 if (sc->sc_type >= WM_T_82544) {
1747 /* First we have to find the I/O BAR. */
1748 for (i = PCI_MAPREG_START; i < PCI_MAPREG_END; i += 4) {
1749 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, i);
1750 if (memtype == PCI_MAPREG_TYPE_IO)
1751 break;
1752 if (PCI_MAPREG_MEM_TYPE(memtype) ==
1753 PCI_MAPREG_MEM_TYPE_64BIT)
1754 i += 4; /* skip high bits, too */
1755 }
1756 if (i < PCI_MAPREG_END) {
1757 /*
1758 * We found PCI_MAPREG_TYPE_IO. Note that 82580
1759 * (and newer?) chip has no PCI_MAPREG_TYPE_IO.
1760 * It's no problem because newer chips has no this
1761 * bug.
1762 *
1763 * The i8254x doesn't apparently respond when the
1764 * I/O BAR is 0, which looks somewhat like it's not
1765 * been configured.
1766 */
1767 preg = pci_conf_read(pc, pa->pa_tag, i);
1768 if (PCI_MAPREG_MEM_ADDR(preg) == 0) {
1769 aprint_error_dev(sc->sc_dev,
1770 "WARNING: I/O BAR at zero.\n");
1771 } else if (pci_mapreg_map(pa, i, PCI_MAPREG_TYPE_IO,
1772 0, &sc->sc_iot, &sc->sc_ioh,
1773 NULL, &sc->sc_ios) == 0) {
1774 sc->sc_flags |= WM_F_IOH_VALID;
1775 } else {
1776 aprint_error_dev(sc->sc_dev,
1777 "WARNING: unable to map I/O space\n");
1778 }
1779 }
1780
1781 }
1782
1783 /* Enable bus mastering. Disable MWI on the i82542 2.0. */
1784 preg = pci_conf_read(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG);
1785 preg |= PCI_COMMAND_MASTER_ENABLE;
1786 if (sc->sc_type < WM_T_82542_2_1)
1787 preg &= ~PCI_COMMAND_INVALIDATE_ENABLE;
1788 pci_conf_write(pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, preg);
1789
1790 /* power up chip */
1791 if ((error = pci_activate(pa->pa_pc, pa->pa_tag, self,
1792 NULL)) && error != EOPNOTSUPP) {
1793 aprint_error_dev(sc->sc_dev, "cannot activate %d\n", error);
1794 return;
1795 }
1796
1797 wm_adjust_qnum(sc, pci_msix_count(pa->pa_pc, pa->pa_tag));
1798
1799 /* Allocation settings */
1800 max_type = PCI_INTR_TYPE_MSIX;
1801 counts[PCI_INTR_TYPE_MSIX] = sc->sc_nqueues + 1;
1802 counts[PCI_INTR_TYPE_MSI] = 1;
1803 counts[PCI_INTR_TYPE_INTX] = 1;
1804
1805 alloc_retry:
1806 if (pci_intr_alloc(pa, &sc->sc_intrs, counts, max_type) != 0) {
1807 aprint_error_dev(sc->sc_dev, "failed to allocate interrupt\n");
1808 return;
1809 }
1810
1811 if (pci_intr_type(pc, sc->sc_intrs[0]) == PCI_INTR_TYPE_MSIX) {
1812 error = wm_setup_msix(sc);
1813 if (error) {
1814 pci_intr_release(pc, sc->sc_intrs,
1815 counts[PCI_INTR_TYPE_MSIX]);
1816
1817 /* Setup for MSI: Disable MSI-X */
1818 max_type = PCI_INTR_TYPE_MSI;
1819 counts[PCI_INTR_TYPE_MSI] = 1;
1820 counts[PCI_INTR_TYPE_INTX] = 1;
1821 goto alloc_retry;
1822 }
1823 } else if (pci_intr_type(pc, sc->sc_intrs[0]) == PCI_INTR_TYPE_MSI) {
1824 wm_adjust_qnum(sc, 0); /* must not use multiqueue */
1825 error = wm_setup_legacy(sc);
1826 if (error) {
1827 pci_intr_release(sc->sc_pc, sc->sc_intrs,
1828 counts[PCI_INTR_TYPE_MSI]);
1829
1830 /* The next try is for INTx: Disable MSI */
1831 max_type = PCI_INTR_TYPE_INTX;
1832 counts[PCI_INTR_TYPE_INTX] = 1;
1833 goto alloc_retry;
1834 }
1835 } else {
1836 wm_adjust_qnum(sc, 0); /* must not use multiqueue */
1837 error = wm_setup_legacy(sc);
1838 if (error) {
1839 pci_intr_release(sc->sc_pc, sc->sc_intrs,
1840 counts[PCI_INTR_TYPE_INTX]);
1841 return;
1842 }
1843 }
1844
1845 /*
1846 * Check the function ID (unit number of the chip).
1847 */
1848 if ((sc->sc_type == WM_T_82546) || (sc->sc_type == WM_T_82546_3)
1849 || (sc->sc_type == WM_T_82571) || (sc->sc_type == WM_T_80003)
1850 || (sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
1851 || (sc->sc_type == WM_T_82580)
1852 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354))
1853 sc->sc_funcid = (CSR_READ(sc, WMREG_STATUS)
1854 >> STATUS_FUNCID_SHIFT) & STATUS_FUNCID_MASK;
1855 else
1856 sc->sc_funcid = 0;
1857
1858 /*
1859 * Determine a few things about the bus we're connected to.
1860 */
1861 if (sc->sc_type < WM_T_82543) {
1862 /* We don't really know the bus characteristics here. */
1863 sc->sc_bus_speed = 33;
1864 } else if (sc->sc_type == WM_T_82547 || sc->sc_type == WM_T_82547_2) {
1865 /*
1866 * CSA (Communication Streaming Architecture) is about as fast
1867 * a 32-bit 66MHz PCI Bus.
1868 */
1869 sc->sc_flags |= WM_F_CSA;
1870 sc->sc_bus_speed = 66;
1871 aprint_verbose_dev(sc->sc_dev,
1872 "Communication Streaming Architecture\n");
1873 if (sc->sc_type == WM_T_82547) {
1874 callout_init(&sc->sc_txfifo_ch, CALLOUT_FLAGS);
1875 callout_setfunc(&sc->sc_txfifo_ch,
1876 wm_82547_txfifo_stall, sc);
1877 aprint_verbose_dev(sc->sc_dev,
1878 "using 82547 Tx FIFO stall work-around\n");
1879 }
1880 } else if (sc->sc_type >= WM_T_82571) {
1881 sc->sc_flags |= WM_F_PCIE;
1882 if ((sc->sc_type != WM_T_ICH8) && (sc->sc_type != WM_T_ICH9)
1883 && (sc->sc_type != WM_T_ICH10)
1884 && (sc->sc_type != WM_T_PCH)
1885 && (sc->sc_type != WM_T_PCH2)
1886 && (sc->sc_type != WM_T_PCH_LPT)
1887 && (sc->sc_type != WM_T_PCH_SPT)) {
1888 /* ICH* and PCH* have no PCIe capability registers */
1889 if (pci_get_capability(pa->pa_pc, pa->pa_tag,
1890 PCI_CAP_PCIEXPRESS, &sc->sc_pcixe_capoff,
1891 NULL) == 0)
1892 aprint_error_dev(sc->sc_dev,
1893 "unable to find PCIe capability\n");
1894 }
1895 aprint_verbose_dev(sc->sc_dev, "PCI-Express bus\n");
1896 } else {
1897 reg = CSR_READ(sc, WMREG_STATUS);
1898 if (reg & STATUS_BUS64)
1899 sc->sc_flags |= WM_F_BUS64;
1900 if ((reg & STATUS_PCIX_MODE) != 0) {
1901 pcireg_t pcix_cmd, pcix_sts, bytecnt, maxb;
1902
1903 sc->sc_flags |= WM_F_PCIX;
1904 if (pci_get_capability(pa->pa_pc, pa->pa_tag,
1905 PCI_CAP_PCIX, &sc->sc_pcixe_capoff, NULL) == 0)
1906 aprint_error_dev(sc->sc_dev,
1907 "unable to find PCIX capability\n");
1908 else if (sc->sc_type != WM_T_82545_3 &&
1909 sc->sc_type != WM_T_82546_3) {
1910 /*
1911 * Work around a problem caused by the BIOS
1912 * setting the max memory read byte count
1913 * incorrectly.
1914 */
1915 pcix_cmd = pci_conf_read(pa->pa_pc, pa->pa_tag,
1916 sc->sc_pcixe_capoff + PCIX_CMD);
1917 pcix_sts = pci_conf_read(pa->pa_pc, pa->pa_tag,
1918 sc->sc_pcixe_capoff + PCIX_STATUS);
1919
1920 bytecnt = (pcix_cmd & PCIX_CMD_BYTECNT_MASK) >>
1921 PCIX_CMD_BYTECNT_SHIFT;
1922 maxb = (pcix_sts & PCIX_STATUS_MAXB_MASK) >>
1923 PCIX_STATUS_MAXB_SHIFT;
1924 if (bytecnt > maxb) {
1925 aprint_verbose_dev(sc->sc_dev,
1926 "resetting PCI-X MMRBC: %d -> %d\n",
1927 512 << bytecnt, 512 << maxb);
1928 pcix_cmd = (pcix_cmd &
1929 ~PCIX_CMD_BYTECNT_MASK) |
1930 (maxb << PCIX_CMD_BYTECNT_SHIFT);
1931 pci_conf_write(pa->pa_pc, pa->pa_tag,
1932 sc->sc_pcixe_capoff + PCIX_CMD,
1933 pcix_cmd);
1934 }
1935 }
1936 }
1937 /*
1938 * The quad port adapter is special; it has a PCIX-PCIX
1939 * bridge on the board, and can run the secondary bus at
1940 * a higher speed.
1941 */
1942 if (wmp->wmp_product == PCI_PRODUCT_INTEL_82546EB_QUAD) {
1943 sc->sc_bus_speed = (sc->sc_flags & WM_F_PCIX) ? 120
1944 : 66;
1945 } else if (sc->sc_flags & WM_F_PCIX) {
1946 switch (reg & STATUS_PCIXSPD_MASK) {
1947 case STATUS_PCIXSPD_50_66:
1948 sc->sc_bus_speed = 66;
1949 break;
1950 case STATUS_PCIXSPD_66_100:
1951 sc->sc_bus_speed = 100;
1952 break;
1953 case STATUS_PCIXSPD_100_133:
1954 sc->sc_bus_speed = 133;
1955 break;
1956 default:
1957 aprint_error_dev(sc->sc_dev,
1958 "unknown PCIXSPD %d; assuming 66MHz\n",
1959 reg & STATUS_PCIXSPD_MASK);
1960 sc->sc_bus_speed = 66;
1961 break;
1962 }
1963 } else
1964 sc->sc_bus_speed = (reg & STATUS_PCI66) ? 66 : 33;
1965 aprint_verbose_dev(sc->sc_dev, "%d-bit %dMHz %s bus\n",
1966 (sc->sc_flags & WM_F_BUS64) ? 64 : 32, sc->sc_bus_speed,
1967 (sc->sc_flags & WM_F_PCIX) ? "PCIX" : "PCI");
1968 }
1969
1970 /* clear interesting stat counters */
1971 CSR_READ(sc, WMREG_COLC);
1972 CSR_READ(sc, WMREG_RXERRC);
1973
1974 if ((sc->sc_type == WM_T_82574) || (sc->sc_type == WM_T_82583)
1975 || (sc->sc_type >= WM_T_ICH8))
1976 sc->sc_ich_phymtx = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
1977 if (sc->sc_type >= WM_T_ICH8)
1978 sc->sc_ich_nvmmtx = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
1979
1980 /* Set PHY, NVM mutex related stuff */
1981 switch (sc->sc_type) {
1982 case WM_T_82542_2_0:
1983 case WM_T_82542_2_1:
1984 case WM_T_82543:
1985 case WM_T_82544:
1986 /* Microwire */
1987 sc->sc_nvm_wordsize = 64;
1988 sc->sc_nvm_addrbits = 6;
1989 break;
1990 case WM_T_82540:
1991 case WM_T_82545:
1992 case WM_T_82545_3:
1993 case WM_T_82546:
1994 case WM_T_82546_3:
1995 /* Microwire */
1996 reg = CSR_READ(sc, WMREG_EECD);
1997 if (reg & EECD_EE_SIZE) {
1998 sc->sc_nvm_wordsize = 256;
1999 sc->sc_nvm_addrbits = 8;
2000 } else {
2001 sc->sc_nvm_wordsize = 64;
2002 sc->sc_nvm_addrbits = 6;
2003 }
2004 sc->sc_flags |= WM_F_LOCK_EECD;
2005 break;
2006 case WM_T_82541:
2007 case WM_T_82541_2:
2008 case WM_T_82547:
2009 case WM_T_82547_2:
2010 sc->sc_flags |= WM_F_LOCK_EECD;
2011 reg = CSR_READ(sc, WMREG_EECD);
2012 if (reg & EECD_EE_TYPE) {
2013 /* SPI */
2014 sc->sc_flags |= WM_F_EEPROM_SPI;
2015 wm_nvm_set_addrbits_size_eecd(sc);
2016 } else {
2017 /* Microwire */
2018 if ((reg & EECD_EE_ABITS) != 0) {
2019 sc->sc_nvm_wordsize = 256;
2020 sc->sc_nvm_addrbits = 8;
2021 } else {
2022 sc->sc_nvm_wordsize = 64;
2023 sc->sc_nvm_addrbits = 6;
2024 }
2025 }
2026 break;
2027 case WM_T_82571:
2028 case WM_T_82572:
2029 /* SPI */
2030 sc->sc_flags |= WM_F_EEPROM_SPI;
2031 wm_nvm_set_addrbits_size_eecd(sc);
2032 sc->sc_flags |= WM_F_LOCK_EECD | WM_F_LOCK_SWSM;
2033 sc->phy.acquire = wm_get_swsm_semaphore;
2034 sc->phy.release = wm_put_swsm_semaphore;
2035 break;
2036 case WM_T_82573:
2037 case WM_T_82574:
2038 case WM_T_82583:
2039 if (sc->sc_type == WM_T_82573) {
2040 sc->sc_flags |= WM_F_LOCK_SWSM;
2041 sc->phy.acquire = wm_get_swsm_semaphore;
2042 sc->phy.release = wm_put_swsm_semaphore;
2043 } else {
2044 sc->sc_flags |= WM_F_LOCK_EXTCNF;
2045 /* Both PHY and NVM use the same semaphore. */
2046 sc->phy.acquire
2047 = wm_get_swfwhw_semaphore;
2048 sc->phy.release
2049 = wm_put_swfwhw_semaphore;
2050 }
2051 if (wm_nvm_is_onboard_eeprom(sc) == 0) {
2052 sc->sc_flags |= WM_F_EEPROM_FLASH;
2053 sc->sc_nvm_wordsize = 2048;
2054 } else {
2055 /* SPI */
2056 sc->sc_flags |= WM_F_EEPROM_SPI;
2057 wm_nvm_set_addrbits_size_eecd(sc);
2058 }
2059 sc->sc_flags |= WM_F_EEPROM_EERDEEWR;
2060 break;
2061 case WM_T_82575:
2062 case WM_T_82576:
2063 case WM_T_82580:
2064 case WM_T_I350:
2065 case WM_T_I354:
2066 case WM_T_80003:
2067 /* SPI */
2068 sc->sc_flags |= WM_F_EEPROM_SPI;
2069 wm_nvm_set_addrbits_size_eecd(sc);
2070 sc->sc_flags |= WM_F_EEPROM_EERDEEWR | WM_F_LOCK_SWFW
2071 | WM_F_LOCK_SWSM;
2072 sc->phy.acquire = wm_get_phy_82575;
2073 sc->phy.release = wm_put_phy_82575;
2074 break;
2075 case WM_T_ICH8:
2076 case WM_T_ICH9:
2077 case WM_T_ICH10:
2078 case WM_T_PCH:
2079 case WM_T_PCH2:
2080 case WM_T_PCH_LPT:
2081 /* FLASH */
2082 sc->sc_flags |= WM_F_EEPROM_FLASH | WM_F_LOCK_EXTCNF;
2083 sc->sc_nvm_wordsize = 2048;
2084 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag,WM_ICH8_FLASH);
2085 if (pci_mapreg_map(pa, WM_ICH8_FLASH, memtype, 0,
2086 &sc->sc_flasht, &sc->sc_flashh, NULL, &sc->sc_flashs)) {
2087 aprint_error_dev(sc->sc_dev,
2088 "can't map FLASH registers\n");
2089 goto out;
2090 }
2091 reg = ICH8_FLASH_READ32(sc, ICH_FLASH_GFPREG);
2092 sc->sc_ich8_flash_base = (reg & ICH_GFPREG_BASE_MASK) *
2093 ICH_FLASH_SECTOR_SIZE;
2094 sc->sc_ich8_flash_bank_size =
2095 ((reg >> 16) & ICH_GFPREG_BASE_MASK) + 1;
2096 sc->sc_ich8_flash_bank_size -= (reg & ICH_GFPREG_BASE_MASK);
2097 sc->sc_ich8_flash_bank_size *= ICH_FLASH_SECTOR_SIZE;
2098 sc->sc_ich8_flash_bank_size /= 2 * sizeof(uint16_t);
2099 sc->sc_flashreg_offset = 0;
2100 sc->phy.acquire = wm_get_swflag_ich8lan;
2101 sc->phy.release = wm_put_swflag_ich8lan;
2102 break;
2103 case WM_T_PCH_SPT:
2104 /* SPT has no GFPREG; flash registers mapped through BAR0 */
2105 sc->sc_flags |= WM_F_EEPROM_FLASH | WM_F_LOCK_EXTCNF;
2106 sc->sc_flasht = sc->sc_st;
2107 sc->sc_flashh = sc->sc_sh;
2108 sc->sc_ich8_flash_base = 0;
2109 sc->sc_nvm_wordsize =
2110 (((CSR_READ(sc, WMREG_STRAP) >> 1) & 0x1F) + 1)
2111 * NVM_SIZE_MULTIPLIER;
2112 /* It is size in bytes, we want words */
2113 sc->sc_nvm_wordsize /= 2;
2114 /* assume 2 banks */
2115 sc->sc_ich8_flash_bank_size = sc->sc_nvm_wordsize / 2;
2116 sc->sc_flashreg_offset = WM_PCH_SPT_FLASHOFFSET;
2117 sc->phy.acquire = wm_get_swflag_ich8lan;
2118 sc->phy.release = wm_put_swflag_ich8lan;
2119 break;
2120 case WM_T_I210:
2121 case WM_T_I211:
2122 if (wm_nvm_get_flash_presence_i210(sc)) {
2123 wm_nvm_set_addrbits_size_eecd(sc);
2124 sc->sc_flags |= WM_F_EEPROM_FLASH_HW;
2125 sc->sc_flags |= WM_F_EEPROM_EERDEEWR;
2126 } else {
2127 sc->sc_nvm_wordsize = INVM_SIZE;
2128 sc->sc_flags |= WM_F_EEPROM_INVM;
2129 }
2130 sc->sc_flags |= WM_F_LOCK_SWFW | WM_F_LOCK_SWSM;
2131 sc->phy.acquire = wm_get_phy_82575;
2132 sc->phy.release = wm_put_phy_82575;
2133 break;
2134 default:
2135 break;
2136 }
2137
2138 /* Reset the chip to a known state. */
2139 wm_reset(sc);
2140
2141 /* Ensure the SMBI bit is clear before first NVM or PHY access */
2142 switch (sc->sc_type) {
2143 case WM_T_82571:
2144 case WM_T_82572:
2145 reg = CSR_READ(sc, WMREG_SWSM2);
2146 if ((reg & SWSM2_LOCK) == 0) {
2147 CSR_WRITE(sc, WMREG_SWSM2, reg | SWSM2_LOCK);
2148 force_clear_smbi = true;
2149 } else
2150 force_clear_smbi = false;
2151 break;
2152 case WM_T_82573:
2153 case WM_T_82574:
2154 case WM_T_82583:
2155 force_clear_smbi = true;
2156 break;
2157 default:
2158 force_clear_smbi = false;
2159 break;
2160 }
2161 if (force_clear_smbi) {
2162 reg = CSR_READ(sc, WMREG_SWSM);
2163 if ((reg & SWSM_SMBI) != 0)
2164 aprint_error_dev(sc->sc_dev,
2165 "Please update the Bootagent\n");
2166 CSR_WRITE(sc, WMREG_SWSM, reg & ~SWSM_SMBI);
2167 }
2168
2169 /*
2170 * Defer printing the EEPROM type until after verifying the checksum
2171 * This allows the EEPROM type to be printed correctly in the case
2172 * that no EEPROM is attached.
2173 */
2174 /*
2175 * Validate the EEPROM checksum. If the checksum fails, flag
2176 * this for later, so we can fail future reads from the EEPROM.
2177 */
2178 if (wm_nvm_validate_checksum(sc)) {
2179 /*
2180 * Read twice again because some PCI-e parts fail the
2181 * first check due to the link being in sleep state.
2182 */
2183 if (wm_nvm_validate_checksum(sc))
2184 sc->sc_flags |= WM_F_EEPROM_INVALID;
2185 }
2186
2187 /* Set device properties (macflags) */
2188 prop_dictionary_set_uint32(dict, "macflags", sc->sc_flags);
2189
2190 if (sc->sc_flags & WM_F_EEPROM_INVALID)
2191 aprint_verbose_dev(sc->sc_dev, "No EEPROM");
2192 else {
2193 aprint_verbose_dev(sc->sc_dev, "%u words ",
2194 sc->sc_nvm_wordsize);
2195 if (sc->sc_flags & WM_F_EEPROM_INVM)
2196 aprint_verbose("iNVM");
2197 else if (sc->sc_flags & WM_F_EEPROM_FLASH_HW)
2198 aprint_verbose("FLASH(HW)");
2199 else if (sc->sc_flags & WM_F_EEPROM_FLASH)
2200 aprint_verbose("FLASH");
2201 else {
2202 if (sc->sc_flags & WM_F_EEPROM_SPI)
2203 eetype = "SPI";
2204 else
2205 eetype = "MicroWire";
2206 aprint_verbose("(%d address bits) %s EEPROM",
2207 sc->sc_nvm_addrbits, eetype);
2208 }
2209 }
2210 wm_nvm_version(sc);
2211 aprint_verbose("\n");
2212
2213 /* Check for I21[01] PLL workaround */
2214 if (sc->sc_type == WM_T_I210)
2215 sc->sc_flags |= WM_F_PLL_WA_I210;
2216 if ((sc->sc_type == WM_T_I210) && wm_nvm_get_flash_presence_i210(sc)) {
2217 /* NVM image release 3.25 has a workaround */
2218 if ((sc->sc_nvm_ver_major < 3)
2219 || ((sc->sc_nvm_ver_major == 3)
2220 && (sc->sc_nvm_ver_minor < 25))) {
2221 aprint_verbose_dev(sc->sc_dev,
2222 "ROM image version %d.%d is older than 3.25\n",
2223 sc->sc_nvm_ver_major, sc->sc_nvm_ver_minor);
2224 sc->sc_flags |= WM_F_PLL_WA_I210;
2225 }
2226 }
2227 if ((sc->sc_flags & WM_F_PLL_WA_I210) != 0)
2228 wm_pll_workaround_i210(sc);
2229
2230 wm_get_wakeup(sc);
2231
2232 /* Non-AMT based hardware can now take control from firmware */
2233 if ((sc->sc_flags & WM_F_HAS_AMT) == 0)
2234 wm_get_hw_control(sc);
2235
2236 /*
2237 * Read the Ethernet address from the EEPROM, if not first found
2238 * in device properties.
2239 */
2240 ea = prop_dictionary_get(dict, "mac-address");
2241 if (ea != NULL) {
2242 KASSERT(prop_object_type(ea) == PROP_TYPE_DATA);
2243 KASSERT(prop_data_size(ea) == ETHER_ADDR_LEN);
2244 memcpy(enaddr, prop_data_data_nocopy(ea), ETHER_ADDR_LEN);
2245 } else {
2246 if (wm_read_mac_addr(sc, enaddr) != 0) {
2247 aprint_error_dev(sc->sc_dev,
2248 "unable to read Ethernet address\n");
2249 goto out;
2250 }
2251 }
2252
2253 aprint_normal_dev(sc->sc_dev, "Ethernet address %s\n",
2254 ether_sprintf(enaddr));
2255
2256 /*
2257 * Read the config info from the EEPROM, and set up various
2258 * bits in the control registers based on their contents.
2259 */
2260 pn = prop_dictionary_get(dict, "i82543-cfg1");
2261 if (pn != NULL) {
2262 KASSERT(prop_object_type(pn) == PROP_TYPE_NUMBER);
2263 cfg1 = (uint16_t) prop_number_integer_value(pn);
2264 } else {
2265 if (wm_nvm_read(sc, NVM_OFF_CFG1, 1, &cfg1)) {
2266 aprint_error_dev(sc->sc_dev, "unable to read CFG1\n");
2267 goto out;
2268 }
2269 }
2270
2271 pn = prop_dictionary_get(dict, "i82543-cfg2");
2272 if (pn != NULL) {
2273 KASSERT(prop_object_type(pn) == PROP_TYPE_NUMBER);
2274 cfg2 = (uint16_t) prop_number_integer_value(pn);
2275 } else {
2276 if (wm_nvm_read(sc, NVM_OFF_CFG2, 1, &cfg2)) {
2277 aprint_error_dev(sc->sc_dev, "unable to read CFG2\n");
2278 goto out;
2279 }
2280 }
2281
2282 /* check for WM_F_WOL */
2283 switch (sc->sc_type) {
2284 case WM_T_82542_2_0:
2285 case WM_T_82542_2_1:
2286 case WM_T_82543:
2287 /* dummy? */
2288 eeprom_data = 0;
2289 apme_mask = NVM_CFG3_APME;
2290 break;
2291 case WM_T_82544:
2292 apme_mask = NVM_CFG2_82544_APM_EN;
2293 eeprom_data = cfg2;
2294 break;
2295 case WM_T_82546:
2296 case WM_T_82546_3:
2297 case WM_T_82571:
2298 case WM_T_82572:
2299 case WM_T_82573:
2300 case WM_T_82574:
2301 case WM_T_82583:
2302 case WM_T_80003:
2303 default:
2304 apme_mask = NVM_CFG3_APME;
2305 wm_nvm_read(sc, (sc->sc_funcid == 1) ? NVM_OFF_CFG3_PORTB
2306 : NVM_OFF_CFG3_PORTA, 1, &eeprom_data);
2307 break;
2308 case WM_T_82575:
2309 case WM_T_82576:
2310 case WM_T_82580:
2311 case WM_T_I350:
2312 case WM_T_I354: /* XXX ok? */
2313 case WM_T_ICH8:
2314 case WM_T_ICH9:
2315 case WM_T_ICH10:
2316 case WM_T_PCH:
2317 case WM_T_PCH2:
2318 case WM_T_PCH_LPT:
2319 case WM_T_PCH_SPT:
2320 /* XXX The funcid should be checked on some devices */
2321 apme_mask = WUC_APME;
2322 eeprom_data = CSR_READ(sc, WMREG_WUC);
2323 break;
2324 }
2325
2326 /* Check for WM_F_WOL flag after the setting of the EEPROM stuff */
2327 if ((eeprom_data & apme_mask) != 0)
2328 sc->sc_flags |= WM_F_WOL;
2329 #ifdef WM_DEBUG
2330 if ((sc->sc_flags & WM_F_WOL) != 0)
2331 printf("WOL\n");
2332 #endif
2333
2334 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)) {
2335 /* Check NVM for autonegotiation */
2336 if (wm_nvm_read(sc, NVM_OFF_COMPAT, 1, &nvmword) == 0) {
2337 if ((nvmword & NVM_COMPAT_SERDES_FORCE_MODE) != 0)
2338 sc->sc_flags |= WM_F_PCS_DIS_AUTONEGO;
2339 }
2340 }
2341
2342 /*
2343 * XXX need special handling for some multiple port cards
2344 * to disable a paticular port.
2345 */
2346
2347 if (sc->sc_type >= WM_T_82544) {
2348 pn = prop_dictionary_get(dict, "i82543-swdpin");
2349 if (pn != NULL) {
2350 KASSERT(prop_object_type(pn) == PROP_TYPE_NUMBER);
2351 swdpin = (uint16_t) prop_number_integer_value(pn);
2352 } else {
2353 if (wm_nvm_read(sc, NVM_OFF_SWDPIN, 1, &swdpin)) {
2354 aprint_error_dev(sc->sc_dev,
2355 "unable to read SWDPIN\n");
2356 goto out;
2357 }
2358 }
2359 }
2360
2361 if (cfg1 & NVM_CFG1_ILOS)
2362 sc->sc_ctrl |= CTRL_ILOS;
2363
2364 /*
2365 * XXX
2366 * This code isn't correct because pin 2 and 3 are located
2367 * in different position on newer chips. Check all datasheet.
2368 *
2369 * Until resolve this problem, check if a chip < 82580
2370 */
2371 if (sc->sc_type <= WM_T_82580) {
2372 if (sc->sc_type >= WM_T_82544) {
2373 sc->sc_ctrl |=
2374 ((swdpin >> NVM_SWDPIN_SWDPIO_SHIFT) & 0xf) <<
2375 CTRL_SWDPIO_SHIFT;
2376 sc->sc_ctrl |=
2377 ((swdpin >> NVM_SWDPIN_SWDPIN_SHIFT) & 0xf) <<
2378 CTRL_SWDPINS_SHIFT;
2379 } else {
2380 sc->sc_ctrl |=
2381 ((cfg1 >> NVM_CFG1_SWDPIO_SHIFT) & 0xf) <<
2382 CTRL_SWDPIO_SHIFT;
2383 }
2384 }
2385
2386 /* XXX For other than 82580? */
2387 if (sc->sc_type == WM_T_82580) {
2388 wm_nvm_read(sc, NVM_OFF_CFG3_PORTA, 1, &nvmword);
2389 if (nvmword & __BIT(13))
2390 sc->sc_ctrl |= CTRL_ILOS;
2391 }
2392
2393 #if 0
2394 if (sc->sc_type >= WM_T_82544) {
2395 if (cfg1 & NVM_CFG1_IPS0)
2396 sc->sc_ctrl_ext |= CTRL_EXT_IPS;
2397 if (cfg1 & NVM_CFG1_IPS1)
2398 sc->sc_ctrl_ext |= CTRL_EXT_IPS1;
2399 sc->sc_ctrl_ext |=
2400 ((swdpin >> (NVM_SWDPIN_SWDPIO_SHIFT + 4)) & 0xd) <<
2401 CTRL_EXT_SWDPIO_SHIFT;
2402 sc->sc_ctrl_ext |=
2403 ((swdpin >> (NVM_SWDPIN_SWDPIN_SHIFT + 4)) & 0xd) <<
2404 CTRL_EXT_SWDPINS_SHIFT;
2405 } else {
2406 sc->sc_ctrl_ext |=
2407 ((cfg2 >> NVM_CFG2_SWDPIO_SHIFT) & 0xf) <<
2408 CTRL_EXT_SWDPIO_SHIFT;
2409 }
2410 #endif
2411
2412 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
2413 #if 0
2414 CSR_WRITE(sc, WMREG_CTRL_EXT, sc->sc_ctrl_ext);
2415 #endif
2416
2417 if (sc->sc_type == WM_T_PCH) {
2418 uint16_t val;
2419
2420 /* Save the NVM K1 bit setting */
2421 wm_nvm_read(sc, NVM_OFF_K1_CONFIG, 1, &val);
2422
2423 if ((val & NVM_K1_CONFIG_ENABLE) != 0)
2424 sc->sc_nvm_k1_enabled = 1;
2425 else
2426 sc->sc_nvm_k1_enabled = 0;
2427 }
2428
2429 /*
2430 * Determine if we're TBI,GMII or SGMII mode, and initialize the
2431 * media structures accordingly.
2432 */
2433 if (sc->sc_type == WM_T_ICH8 || sc->sc_type == WM_T_ICH9
2434 || sc->sc_type == WM_T_ICH10 || sc->sc_type == WM_T_PCH
2435 || sc->sc_type == WM_T_PCH2 || sc->sc_type == WM_T_PCH_LPT
2436 || sc->sc_type == WM_T_PCH_SPT || sc->sc_type == WM_T_82573
2437 || sc->sc_type == WM_T_82574 || sc->sc_type == WM_T_82583) {
2438 /* STATUS_TBIMODE reserved/reused, can't rely on it */
2439 wm_gmii_mediainit(sc, wmp->wmp_product);
2440 } else if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
2441 || (sc->sc_type ==WM_T_82580) || (sc->sc_type ==WM_T_I350)
2442 || (sc->sc_type ==WM_T_I354) || (sc->sc_type ==WM_T_I210)
2443 || (sc->sc_type ==WM_T_I211)) {
2444 reg = CSR_READ(sc, WMREG_CTRL_EXT);
2445 link_mode = reg & CTRL_EXT_LINK_MODE_MASK;
2446 switch (link_mode) {
2447 case CTRL_EXT_LINK_MODE_1000KX:
2448 aprint_verbose_dev(sc->sc_dev, "1000KX\n");
2449 sc->sc_mediatype = WM_MEDIATYPE_SERDES;
2450 break;
2451 case CTRL_EXT_LINK_MODE_SGMII:
2452 if (wm_sgmii_uses_mdio(sc)) {
2453 aprint_verbose_dev(sc->sc_dev,
2454 "SGMII(MDIO)\n");
2455 sc->sc_flags |= WM_F_SGMII;
2456 sc->sc_mediatype = WM_MEDIATYPE_COPPER;
2457 break;
2458 }
2459 aprint_verbose_dev(sc->sc_dev, "SGMII(I2C)\n");
2460 /*FALLTHROUGH*/
2461 case CTRL_EXT_LINK_MODE_PCIE_SERDES:
2462 sc->sc_mediatype = wm_sfp_get_media_type(sc);
2463 if (sc->sc_mediatype == WM_MEDIATYPE_UNKNOWN) {
2464 if (link_mode
2465 == CTRL_EXT_LINK_MODE_SGMII) {
2466 sc->sc_mediatype = WM_MEDIATYPE_COPPER;
2467 sc->sc_flags |= WM_F_SGMII;
2468 } else {
2469 sc->sc_mediatype = WM_MEDIATYPE_SERDES;
2470 aprint_verbose_dev(sc->sc_dev,
2471 "SERDES\n");
2472 }
2473 break;
2474 }
2475 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES)
2476 aprint_verbose_dev(sc->sc_dev, "SERDES\n");
2477
2478 /* Change current link mode setting */
2479 reg &= ~CTRL_EXT_LINK_MODE_MASK;
2480 switch (sc->sc_mediatype) {
2481 case WM_MEDIATYPE_COPPER:
2482 reg |= CTRL_EXT_LINK_MODE_SGMII;
2483 break;
2484 case WM_MEDIATYPE_SERDES:
2485 reg |= CTRL_EXT_LINK_MODE_PCIE_SERDES;
2486 break;
2487 default:
2488 break;
2489 }
2490 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
2491 break;
2492 case CTRL_EXT_LINK_MODE_GMII:
2493 default:
2494 aprint_verbose_dev(sc->sc_dev, "Copper\n");
2495 sc->sc_mediatype = WM_MEDIATYPE_COPPER;
2496 break;
2497 }
2498
2499 reg &= ~CTRL_EXT_I2C_ENA;
2500 if ((sc->sc_flags & WM_F_SGMII) != 0)
2501 reg |= CTRL_EXT_I2C_ENA;
2502 else
2503 reg &= ~CTRL_EXT_I2C_ENA;
2504 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
2505
2506 if (sc->sc_mediatype == WM_MEDIATYPE_COPPER)
2507 wm_gmii_mediainit(sc, wmp->wmp_product);
2508 else
2509 wm_tbi_mediainit(sc);
2510 } else if (sc->sc_type < WM_T_82543 ||
2511 (CSR_READ(sc, WMREG_STATUS) & STATUS_TBIMODE) != 0) {
2512 if (sc->sc_mediatype == WM_MEDIATYPE_COPPER) {
2513 aprint_error_dev(sc->sc_dev,
2514 "WARNING: TBIMODE set on 1000BASE-T product!\n");
2515 sc->sc_mediatype = WM_MEDIATYPE_FIBER;
2516 }
2517 wm_tbi_mediainit(sc);
2518 } else {
2519 if (sc->sc_mediatype == WM_MEDIATYPE_FIBER) {
2520 aprint_error_dev(sc->sc_dev,
2521 "WARNING: TBIMODE clear on 1000BASE-X product!\n");
2522 sc->sc_mediatype = WM_MEDIATYPE_COPPER;
2523 }
2524 wm_gmii_mediainit(sc, wmp->wmp_product);
2525 }
2526
2527 ifp = &sc->sc_ethercom.ec_if;
2528 xname = device_xname(sc->sc_dev);
2529 strlcpy(ifp->if_xname, xname, IFNAMSIZ);
2530 ifp->if_softc = sc;
2531 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
2532 ifp->if_extflags = IFEF_START_MPSAFE;
2533 ifp->if_ioctl = wm_ioctl;
2534 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
2535 ifp->if_start = wm_nq_start;
2536 if (sc->sc_nqueues > 1) {
2537 ifp->if_transmit = wm_nq_transmit;
2538 deferred_start_func = wm_deferred_start;
2539 }
2540 } else {
2541 ifp->if_start = wm_start;
2542 if (sc->sc_nqueues > 1) {
2543 ifp->if_transmit = wm_transmit;
2544 deferred_start_func = wm_deferred_start;
2545 }
2546 }
2547 ifp->if_watchdog = wm_watchdog;
2548 ifp->if_init = wm_init;
2549 ifp->if_stop = wm_stop;
2550 IFQ_SET_MAXLEN(&ifp->if_snd, max(WM_IFQUEUELEN, IFQ_MAXLEN));
2551 IFQ_SET_READY(&ifp->if_snd);
2552
2553 /* Check for jumbo frame */
2554 switch (sc->sc_type) {
2555 case WM_T_82573:
2556 /* XXX limited to 9234 if ASPM is disabled */
2557 wm_nvm_read(sc, NVM_OFF_INIT_3GIO_3, 1, &nvmword);
2558 if ((nvmword & NVM_3GIO_3_ASPM_MASK) != 0)
2559 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU;
2560 break;
2561 case WM_T_82571:
2562 case WM_T_82572:
2563 case WM_T_82574:
2564 case WM_T_82575:
2565 case WM_T_82576:
2566 case WM_T_82580:
2567 case WM_T_I350:
2568 case WM_T_I354: /* XXXX ok? */
2569 case WM_T_I210:
2570 case WM_T_I211:
2571 case WM_T_80003:
2572 case WM_T_ICH9:
2573 case WM_T_ICH10:
2574 case WM_T_PCH2: /* PCH2 supports 9K frame size */
2575 case WM_T_PCH_LPT:
2576 case WM_T_PCH_SPT:
2577 /* XXX limited to 9234 */
2578 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU;
2579 break;
2580 case WM_T_PCH:
2581 /* XXX limited to 4096 */
2582 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU;
2583 break;
2584 case WM_T_82542_2_0:
2585 case WM_T_82542_2_1:
2586 case WM_T_82583:
2587 case WM_T_ICH8:
2588 /* No support for jumbo frame */
2589 break;
2590 default:
2591 /* ETHER_MAX_LEN_JUMBO */
2592 sc->sc_ethercom.ec_capabilities |= ETHERCAP_JUMBO_MTU;
2593 break;
2594 }
2595
2596 /* If we're a i82543 or greater, we can support VLANs. */
2597 if (sc->sc_type >= WM_T_82543)
2598 sc->sc_ethercom.ec_capabilities |=
2599 ETHERCAP_VLAN_MTU | ETHERCAP_VLAN_HWTAGGING;
2600
2601 /*
2602 * We can perform TCPv4 and UDPv4 checkums in-bound. Only
2603 * on i82543 and later.
2604 */
2605 if (sc->sc_type >= WM_T_82543) {
2606 ifp->if_capabilities |=
2607 IFCAP_CSUM_IPv4_Tx | IFCAP_CSUM_IPv4_Rx |
2608 IFCAP_CSUM_TCPv4_Tx | IFCAP_CSUM_TCPv4_Rx |
2609 IFCAP_CSUM_UDPv4_Tx | IFCAP_CSUM_UDPv4_Rx |
2610 IFCAP_CSUM_TCPv6_Tx |
2611 IFCAP_CSUM_UDPv6_Tx;
2612 }
2613
2614 /*
2615 * XXXyamt: i'm not sure which chips support RXCSUM_IPV6OFL.
2616 *
2617 * 82541GI (8086:1076) ... no
2618 * 82572EI (8086:10b9) ... yes
2619 */
2620 if (sc->sc_type >= WM_T_82571) {
2621 ifp->if_capabilities |=
2622 IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx;
2623 }
2624
2625 /*
2626 * If we're a i82544 or greater (except i82547), we can do
2627 * TCP segmentation offload.
2628 */
2629 if (sc->sc_type >= WM_T_82544 && sc->sc_type != WM_T_82547) {
2630 ifp->if_capabilities |= IFCAP_TSOv4;
2631 }
2632
2633 if (sc->sc_type >= WM_T_82571) {
2634 ifp->if_capabilities |= IFCAP_TSOv6;
2635 }
2636
2637 #ifdef WM_MPSAFE
2638 sc->sc_core_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
2639 #else
2640 sc->sc_core_lock = NULL;
2641 #endif
2642
2643 /* Attach the interface. */
2644 if_initialize(ifp);
2645 sc->sc_ipq = if_percpuq_create(&sc->sc_ethercom.ec_if);
2646 if_deferred_start_init(ifp, deferred_start_func);
2647 ether_ifattach(ifp, enaddr);
2648 if_register(ifp);
2649 ether_set_ifflags_cb(&sc->sc_ethercom, wm_ifflags_cb);
2650 rnd_attach_source(&sc->rnd_source, xname, RND_TYPE_NET,
2651 RND_FLAG_DEFAULT);
2652
2653 #ifdef WM_EVENT_COUNTERS
2654 /* Attach event counters. */
2655 evcnt_attach_dynamic(&sc->sc_ev_linkintr, EVCNT_TYPE_INTR,
2656 NULL, xname, "linkintr");
2657
2658 evcnt_attach_dynamic(&sc->sc_ev_tx_xoff, EVCNT_TYPE_MISC,
2659 NULL, xname, "tx_xoff");
2660 evcnt_attach_dynamic(&sc->sc_ev_tx_xon, EVCNT_TYPE_MISC,
2661 NULL, xname, "tx_xon");
2662 evcnt_attach_dynamic(&sc->sc_ev_rx_xoff, EVCNT_TYPE_MISC,
2663 NULL, xname, "rx_xoff");
2664 evcnt_attach_dynamic(&sc->sc_ev_rx_xon, EVCNT_TYPE_MISC,
2665 NULL, xname, "rx_xon");
2666 evcnt_attach_dynamic(&sc->sc_ev_rx_macctl, EVCNT_TYPE_MISC,
2667 NULL, xname, "rx_macctl");
2668 #endif /* WM_EVENT_COUNTERS */
2669
2670 if (pmf_device_register(self, wm_suspend, wm_resume))
2671 pmf_class_network_register(self, ifp);
2672 else
2673 aprint_error_dev(self, "couldn't establish power handler\n");
2674
2675 sc->sc_flags |= WM_F_ATTACHED;
2676 out:
2677 return;
2678 }
2679
2680 /* The detach function (ca_detach) */
2681 static int
2682 wm_detach(device_t self, int flags __unused)
2683 {
2684 struct wm_softc *sc = device_private(self);
2685 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
2686 int i;
2687
2688 if ((sc->sc_flags & WM_F_ATTACHED) == 0)
2689 return 0;
2690
2691 /* Stop the interface. Callouts are stopped in it. */
2692 wm_stop(ifp, 1);
2693
2694 pmf_device_deregister(self);
2695
2696 /* Tell the firmware about the release */
2697 WM_CORE_LOCK(sc);
2698 wm_release_manageability(sc);
2699 wm_release_hw_control(sc);
2700 wm_enable_wakeup(sc);
2701 WM_CORE_UNLOCK(sc);
2702
2703 mii_detach(&sc->sc_mii, MII_PHY_ANY, MII_OFFSET_ANY);
2704
2705 /* Delete all remaining media. */
2706 ifmedia_delete_instance(&sc->sc_mii.mii_media, IFM_INST_ANY);
2707
2708 ether_ifdetach(ifp);
2709 if_detach(ifp);
2710 if_percpuq_destroy(sc->sc_ipq);
2711
2712 /* Unload RX dmamaps and free mbufs */
2713 for (i = 0; i < sc->sc_nqueues; i++) {
2714 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
2715 mutex_enter(rxq->rxq_lock);
2716 wm_rxdrain(rxq);
2717 mutex_exit(rxq->rxq_lock);
2718 }
2719 /* Must unlock here */
2720
2721 /* Disestablish the interrupt handler */
2722 for (i = 0; i < sc->sc_nintrs; i++) {
2723 if (sc->sc_ihs[i] != NULL) {
2724 pci_intr_disestablish(sc->sc_pc, sc->sc_ihs[i]);
2725 sc->sc_ihs[i] = NULL;
2726 }
2727 }
2728 pci_intr_release(sc->sc_pc, sc->sc_intrs, sc->sc_nintrs);
2729
2730 wm_free_txrx_queues(sc);
2731
2732 /* Unmap the registers */
2733 if (sc->sc_ss) {
2734 bus_space_unmap(sc->sc_st, sc->sc_sh, sc->sc_ss);
2735 sc->sc_ss = 0;
2736 }
2737 if (sc->sc_ios) {
2738 bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios);
2739 sc->sc_ios = 0;
2740 }
2741 if (sc->sc_flashs) {
2742 bus_space_unmap(sc->sc_flasht, sc->sc_flashh, sc->sc_flashs);
2743 sc->sc_flashs = 0;
2744 }
2745
2746 if (sc->sc_core_lock)
2747 mutex_obj_free(sc->sc_core_lock);
2748 if (sc->sc_ich_phymtx)
2749 mutex_obj_free(sc->sc_ich_phymtx);
2750 if (sc->sc_ich_nvmmtx)
2751 mutex_obj_free(sc->sc_ich_nvmmtx);
2752
2753 return 0;
2754 }
2755
2756 static bool
2757 wm_suspend(device_t self, const pmf_qual_t *qual)
2758 {
2759 struct wm_softc *sc = device_private(self);
2760
2761 wm_release_manageability(sc);
2762 wm_release_hw_control(sc);
2763 wm_enable_wakeup(sc);
2764
2765 return true;
2766 }
2767
2768 static bool
2769 wm_resume(device_t self, const pmf_qual_t *qual)
2770 {
2771 struct wm_softc *sc = device_private(self);
2772
2773 wm_init_manageability(sc);
2774
2775 return true;
2776 }
2777
2778 /*
2779 * wm_watchdog: [ifnet interface function]
2780 *
2781 * Watchdog timer handler.
2782 */
2783 static void
2784 wm_watchdog(struct ifnet *ifp)
2785 {
2786 int qid;
2787 struct wm_softc *sc = ifp->if_softc;
2788
2789 for (qid = 0; qid < sc->sc_nqueues; qid++) {
2790 struct wm_txqueue *txq = &sc->sc_queue[qid].wmq_txq;
2791
2792 wm_watchdog_txq(ifp, txq);
2793 }
2794
2795 /* Reset the interface. */
2796 (void) wm_init(ifp);
2797
2798 /*
2799 * There are still some upper layer processing which call
2800 * ifp->if_start(). e.g. ALTQ
2801 */
2802 /* Try to get more packets going. */
2803 ifp->if_start(ifp);
2804 }
2805
2806 static void
2807 wm_watchdog_txq(struct ifnet *ifp, struct wm_txqueue *txq)
2808 {
2809 struct wm_softc *sc = ifp->if_softc;
2810
2811 /*
2812 * Since we're using delayed interrupts, sweep up
2813 * before we report an error.
2814 */
2815 mutex_enter(txq->txq_lock);
2816 wm_txeof(sc, txq);
2817 mutex_exit(txq->txq_lock);
2818
2819 if (txq->txq_free != WM_NTXDESC(txq)) {
2820 #ifdef WM_DEBUG
2821 int i, j;
2822 struct wm_txsoft *txs;
2823 #endif
2824 log(LOG_ERR,
2825 "%s: device timeout (txfree %d txsfree %d txnext %d)\n",
2826 device_xname(sc->sc_dev), txq->txq_free, txq->txq_sfree,
2827 txq->txq_next);
2828 ifp->if_oerrors++;
2829 #ifdef WM_DEBUG
2830 for (i = txq->txq_sdirty; i != txq->txq_snext ;
2831 i = WM_NEXTTXS(txq, i)) {
2832 txs = &txq->txq_soft[i];
2833 printf("txs %d tx %d -> %d\n",
2834 i, txs->txs_firstdesc, txs->txs_lastdesc);
2835 for (j = txs->txs_firstdesc; ;
2836 j = WM_NEXTTX(txq, j)) {
2837 printf("\tdesc %d: 0x%" PRIx64 "\n", j,
2838 txq->txq_nq_descs[j].nqtx_data.nqtxd_addr);
2839 printf("\t %#08x%08x\n",
2840 txq->txq_nq_descs[j].nqtx_data.nqtxd_fields,
2841 txq->txq_nq_descs[j].nqtx_data.nqtxd_cmdlen);
2842 if (j == txs->txs_lastdesc)
2843 break;
2844 }
2845 }
2846 #endif
2847 }
2848 }
2849
2850 /*
2851 * wm_tick:
2852 *
2853 * One second timer, used to check link status, sweep up
2854 * completed transmit jobs, etc.
2855 */
2856 static void
2857 wm_tick(void *arg)
2858 {
2859 struct wm_softc *sc = arg;
2860 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
2861 #ifndef WM_MPSAFE
2862 int s = splnet();
2863 #endif
2864
2865 WM_CORE_LOCK(sc);
2866
2867 if (sc->sc_core_stopping)
2868 goto out;
2869
2870 if (sc->sc_type >= WM_T_82542_2_1) {
2871 WM_EVCNT_ADD(&sc->sc_ev_rx_xon, CSR_READ(sc, WMREG_XONRXC));
2872 WM_EVCNT_ADD(&sc->sc_ev_tx_xon, CSR_READ(sc, WMREG_XONTXC));
2873 WM_EVCNT_ADD(&sc->sc_ev_rx_xoff, CSR_READ(sc, WMREG_XOFFRXC));
2874 WM_EVCNT_ADD(&sc->sc_ev_tx_xoff, CSR_READ(sc, WMREG_XOFFTXC));
2875 WM_EVCNT_ADD(&sc->sc_ev_rx_macctl, CSR_READ(sc, WMREG_FCRUC));
2876 }
2877
2878 ifp->if_collisions += CSR_READ(sc, WMREG_COLC);
2879 ifp->if_ierrors += 0ULL + /* ensure quad_t */
2880 + CSR_READ(sc, WMREG_CRCERRS)
2881 + CSR_READ(sc, WMREG_ALGNERRC)
2882 + CSR_READ(sc, WMREG_SYMERRC)
2883 + CSR_READ(sc, WMREG_RXERRC)
2884 + CSR_READ(sc, WMREG_SEC)
2885 + CSR_READ(sc, WMREG_CEXTERR)
2886 + CSR_READ(sc, WMREG_RLEC);
2887 /*
2888 * WMREG_RNBC is incremented when there is no available buffers in host
2889 * memory. It does not mean the number of dropped packet. Because
2890 * ethernet controller can receive packets in such case if there is
2891 * space in phy's FIFO.
2892 *
2893 * If you want to know the nubmer of WMREG_RMBC, you should use such as
2894 * own EVCNT instead of if_iqdrops.
2895 */
2896 ifp->if_iqdrops += CSR_READ(sc, WMREG_MPC);
2897
2898 if (sc->sc_flags & WM_F_HAS_MII)
2899 mii_tick(&sc->sc_mii);
2900 else if ((sc->sc_type >= WM_T_82575)
2901 && (sc->sc_mediatype == WM_MEDIATYPE_SERDES))
2902 wm_serdes_tick(sc);
2903 else
2904 wm_tbi_tick(sc);
2905
2906 callout_reset(&sc->sc_tick_ch, hz, wm_tick, sc);
2907 out:
2908 WM_CORE_UNLOCK(sc);
2909 #ifndef WM_MPSAFE
2910 splx(s);
2911 #endif
2912 }
2913
2914 static int
2915 wm_ifflags_cb(struct ethercom *ec)
2916 {
2917 struct ifnet *ifp = &ec->ec_if;
2918 struct wm_softc *sc = ifp->if_softc;
2919 int rc = 0;
2920
2921 WM_CORE_LOCK(sc);
2922
2923 int change = ifp->if_flags ^ sc->sc_if_flags;
2924 sc->sc_if_flags = ifp->if_flags;
2925
2926 if ((change & ~(IFF_CANTCHANGE | IFF_DEBUG)) != 0) {
2927 rc = ENETRESET;
2928 goto out;
2929 }
2930
2931 if ((change & (IFF_PROMISC | IFF_ALLMULTI)) != 0)
2932 wm_set_filter(sc);
2933
2934 wm_set_vlan(sc);
2935
2936 out:
2937 WM_CORE_UNLOCK(sc);
2938
2939 return rc;
2940 }
2941
2942 /*
2943 * wm_ioctl: [ifnet interface function]
2944 *
2945 * Handle control requests from the operator.
2946 */
2947 static int
2948 wm_ioctl(struct ifnet *ifp, u_long cmd, void *data)
2949 {
2950 struct wm_softc *sc = ifp->if_softc;
2951 struct ifreq *ifr = (struct ifreq *) data;
2952 struct ifaddr *ifa = (struct ifaddr *)data;
2953 struct sockaddr_dl *sdl;
2954 int s, error;
2955
2956 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
2957 device_xname(sc->sc_dev), __func__));
2958
2959 #ifndef WM_MPSAFE
2960 s = splnet();
2961 #endif
2962 switch (cmd) {
2963 case SIOCSIFMEDIA:
2964 case SIOCGIFMEDIA:
2965 WM_CORE_LOCK(sc);
2966 /* Flow control requires full-duplex mode. */
2967 if (IFM_SUBTYPE(ifr->ifr_media) == IFM_AUTO ||
2968 (ifr->ifr_media & IFM_FDX) == 0)
2969 ifr->ifr_media &= ~IFM_ETH_FMASK;
2970 if (IFM_SUBTYPE(ifr->ifr_media) != IFM_AUTO) {
2971 if ((ifr->ifr_media & IFM_ETH_FMASK) == IFM_FLOW) {
2972 /* We can do both TXPAUSE and RXPAUSE. */
2973 ifr->ifr_media |=
2974 IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE;
2975 }
2976 sc->sc_flowflags = ifr->ifr_media & IFM_ETH_FMASK;
2977 }
2978 WM_CORE_UNLOCK(sc);
2979 #ifdef WM_MPSAFE
2980 s = splnet();
2981 #endif
2982 error = ifmedia_ioctl(ifp, ifr, &sc->sc_mii.mii_media, cmd);
2983 #ifdef WM_MPSAFE
2984 splx(s);
2985 #endif
2986 break;
2987 case SIOCINITIFADDR:
2988 WM_CORE_LOCK(sc);
2989 if (ifa->ifa_addr->sa_family == AF_LINK) {
2990 sdl = satosdl(ifp->if_dl->ifa_addr);
2991 (void)sockaddr_dl_setaddr(sdl, sdl->sdl_len,
2992 LLADDR(satosdl(ifa->ifa_addr)), ifp->if_addrlen);
2993 /* unicast address is first multicast entry */
2994 wm_set_filter(sc);
2995 error = 0;
2996 WM_CORE_UNLOCK(sc);
2997 break;
2998 }
2999 WM_CORE_UNLOCK(sc);
3000 /*FALLTHROUGH*/
3001 default:
3002 #ifdef WM_MPSAFE
3003 s = splnet();
3004 #endif
3005 /* It may call wm_start, so unlock here */
3006 error = ether_ioctl(ifp, cmd, data);
3007 #ifdef WM_MPSAFE
3008 splx(s);
3009 #endif
3010 if (error != ENETRESET)
3011 break;
3012
3013 error = 0;
3014
3015 if (cmd == SIOCSIFCAP) {
3016 error = (*ifp->if_init)(ifp);
3017 } else if (cmd != SIOCADDMULTI && cmd != SIOCDELMULTI)
3018 ;
3019 else if (ifp->if_flags & IFF_RUNNING) {
3020 /*
3021 * Multicast list has changed; set the hardware filter
3022 * accordingly.
3023 */
3024 WM_CORE_LOCK(sc);
3025 wm_set_filter(sc);
3026 WM_CORE_UNLOCK(sc);
3027 }
3028 break;
3029 }
3030
3031 #ifndef WM_MPSAFE
3032 splx(s);
3033 #endif
3034 return error;
3035 }
3036
3037 /* MAC address related */
3038
3039 /*
3040 * Get the offset of MAC address and return it.
3041 * If error occured, use offset 0.
3042 */
3043 static uint16_t
3044 wm_check_alt_mac_addr(struct wm_softc *sc)
3045 {
3046 uint16_t myea[ETHER_ADDR_LEN / 2];
3047 uint16_t offset = NVM_OFF_MACADDR;
3048
3049 /* Try to read alternative MAC address pointer */
3050 if (wm_nvm_read(sc, NVM_OFF_ALT_MAC_ADDR_PTR, 1, &offset) != 0)
3051 return 0;
3052
3053 /* Check pointer if it's valid or not. */
3054 if ((offset == 0x0000) || (offset == 0xffff))
3055 return 0;
3056
3057 offset += NVM_OFF_MACADDR_82571(sc->sc_funcid);
3058 /*
3059 * Check whether alternative MAC address is valid or not.
3060 * Some cards have non 0xffff pointer but those don't use
3061 * alternative MAC address in reality.
3062 *
3063 * Check whether the broadcast bit is set or not.
3064 */
3065 if (wm_nvm_read(sc, offset, 1, myea) == 0)
3066 if (((myea[0] & 0xff) & 0x01) == 0)
3067 return offset; /* Found */
3068
3069 /* Not found */
3070 return 0;
3071 }
3072
3073 static int
3074 wm_read_mac_addr(struct wm_softc *sc, uint8_t *enaddr)
3075 {
3076 uint16_t myea[ETHER_ADDR_LEN / 2];
3077 uint16_t offset = NVM_OFF_MACADDR;
3078 int do_invert = 0;
3079
3080 switch (sc->sc_type) {
3081 case WM_T_82580:
3082 case WM_T_I350:
3083 case WM_T_I354:
3084 /* EEPROM Top Level Partitioning */
3085 offset = NVM_OFF_LAN_FUNC_82580(sc->sc_funcid) + 0;
3086 break;
3087 case WM_T_82571:
3088 case WM_T_82575:
3089 case WM_T_82576:
3090 case WM_T_80003:
3091 case WM_T_I210:
3092 case WM_T_I211:
3093 offset = wm_check_alt_mac_addr(sc);
3094 if (offset == 0)
3095 if ((sc->sc_funcid & 0x01) == 1)
3096 do_invert = 1;
3097 break;
3098 default:
3099 if ((sc->sc_funcid & 0x01) == 1)
3100 do_invert = 1;
3101 break;
3102 }
3103
3104 if (wm_nvm_read(sc, offset, sizeof(myea) / sizeof(myea[0]), myea) != 0)
3105 goto bad;
3106
3107 enaddr[0] = myea[0] & 0xff;
3108 enaddr[1] = myea[0] >> 8;
3109 enaddr[2] = myea[1] & 0xff;
3110 enaddr[3] = myea[1] >> 8;
3111 enaddr[4] = myea[2] & 0xff;
3112 enaddr[5] = myea[2] >> 8;
3113
3114 /*
3115 * Toggle the LSB of the MAC address on the second port
3116 * of some dual port cards.
3117 */
3118 if (do_invert != 0)
3119 enaddr[5] ^= 1;
3120
3121 return 0;
3122
3123 bad:
3124 return -1;
3125 }
3126
3127 /*
3128 * wm_set_ral:
3129 *
3130 * Set an entery in the receive address list.
3131 */
3132 static void
3133 wm_set_ral(struct wm_softc *sc, const uint8_t *enaddr, int idx)
3134 {
3135 uint32_t ral_lo, ral_hi;
3136
3137 if (enaddr != NULL) {
3138 ral_lo = enaddr[0] | (enaddr[1] << 8) | (enaddr[2] << 16) |
3139 (enaddr[3] << 24);
3140 ral_hi = enaddr[4] | (enaddr[5] << 8);
3141 ral_hi |= RAL_AV;
3142 } else {
3143 ral_lo = 0;
3144 ral_hi = 0;
3145 }
3146
3147 if (sc->sc_type >= WM_T_82544) {
3148 CSR_WRITE(sc, WMREG_RAL_LO(WMREG_CORDOVA_RAL_BASE, idx),
3149 ral_lo);
3150 CSR_WRITE(sc, WMREG_RAL_HI(WMREG_CORDOVA_RAL_BASE, idx),
3151 ral_hi);
3152 } else {
3153 CSR_WRITE(sc, WMREG_RAL_LO(WMREG_RAL_BASE, idx), ral_lo);
3154 CSR_WRITE(sc, WMREG_RAL_HI(WMREG_RAL_BASE, idx), ral_hi);
3155 }
3156 }
3157
3158 /*
3159 * wm_mchash:
3160 *
3161 * Compute the hash of the multicast address for the 4096-bit
3162 * multicast filter.
3163 */
3164 static uint32_t
3165 wm_mchash(struct wm_softc *sc, const uint8_t *enaddr)
3166 {
3167 static const int lo_shift[4] = { 4, 3, 2, 0 };
3168 static const int hi_shift[4] = { 4, 5, 6, 8 };
3169 static const int ich8_lo_shift[4] = { 6, 5, 4, 2 };
3170 static const int ich8_hi_shift[4] = { 2, 3, 4, 6 };
3171 uint32_t hash;
3172
3173 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
3174 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
3175 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)
3176 || (sc->sc_type == WM_T_PCH_SPT)) {
3177 hash = (enaddr[4] >> ich8_lo_shift[sc->sc_mchash_type]) |
3178 (((uint16_t) enaddr[5]) << ich8_hi_shift[sc->sc_mchash_type]);
3179 return (hash & 0x3ff);
3180 }
3181 hash = (enaddr[4] >> lo_shift[sc->sc_mchash_type]) |
3182 (((uint16_t) enaddr[5]) << hi_shift[sc->sc_mchash_type]);
3183
3184 return (hash & 0xfff);
3185 }
3186
3187 /*
3188 * wm_set_filter:
3189 *
3190 * Set up the receive filter.
3191 */
3192 static void
3193 wm_set_filter(struct wm_softc *sc)
3194 {
3195 struct ethercom *ec = &sc->sc_ethercom;
3196 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
3197 struct ether_multi *enm;
3198 struct ether_multistep step;
3199 bus_addr_t mta_reg;
3200 uint32_t hash, reg, bit;
3201 int i, size, ralmax;
3202
3203 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3204 device_xname(sc->sc_dev), __func__));
3205
3206 if (sc->sc_type >= WM_T_82544)
3207 mta_reg = WMREG_CORDOVA_MTA;
3208 else
3209 mta_reg = WMREG_MTA;
3210
3211 sc->sc_rctl &= ~(RCTL_BAM | RCTL_UPE | RCTL_MPE);
3212
3213 if (ifp->if_flags & IFF_BROADCAST)
3214 sc->sc_rctl |= RCTL_BAM;
3215 if (ifp->if_flags & IFF_PROMISC) {
3216 sc->sc_rctl |= RCTL_UPE;
3217 goto allmulti;
3218 }
3219
3220 /*
3221 * Set the station address in the first RAL slot, and
3222 * clear the remaining slots.
3223 */
3224 if (sc->sc_type == WM_T_ICH8)
3225 size = WM_RAL_TABSIZE_ICH8 -1;
3226 else if ((sc->sc_type == WM_T_ICH9) || (sc->sc_type == WM_T_ICH10)
3227 || (sc->sc_type == WM_T_PCH))
3228 size = WM_RAL_TABSIZE_ICH8;
3229 else if (sc->sc_type == WM_T_PCH2)
3230 size = WM_RAL_TABSIZE_PCH2;
3231 else if ((sc->sc_type == WM_T_PCH_LPT) ||(sc->sc_type == WM_T_PCH_SPT))
3232 size = WM_RAL_TABSIZE_PCH_LPT;
3233 else if (sc->sc_type == WM_T_82575)
3234 size = WM_RAL_TABSIZE_82575;
3235 else if ((sc->sc_type == WM_T_82576) || (sc->sc_type == WM_T_82580))
3236 size = WM_RAL_TABSIZE_82576;
3237 else if ((sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354))
3238 size = WM_RAL_TABSIZE_I350;
3239 else
3240 size = WM_RAL_TABSIZE;
3241 wm_set_ral(sc, CLLADDR(ifp->if_sadl), 0);
3242
3243 if ((sc->sc_type == WM_T_PCH_LPT) || (sc->sc_type == WM_T_PCH_SPT)) {
3244 i = __SHIFTOUT(CSR_READ(sc, WMREG_FWSM), FWSM_WLOCK_MAC);
3245 switch (i) {
3246 case 0:
3247 /* We can use all entries */
3248 ralmax = size;
3249 break;
3250 case 1:
3251 /* Only RAR[0] */
3252 ralmax = 1;
3253 break;
3254 default:
3255 /* available SHRA + RAR[0] */
3256 ralmax = i + 1;
3257 }
3258 } else
3259 ralmax = size;
3260 for (i = 1; i < size; i++) {
3261 if (i < ralmax)
3262 wm_set_ral(sc, NULL, i);
3263 }
3264
3265 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
3266 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
3267 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)
3268 || (sc->sc_type == WM_T_PCH_SPT))
3269 size = WM_ICH8_MC_TABSIZE;
3270 else
3271 size = WM_MC_TABSIZE;
3272 /* Clear out the multicast table. */
3273 for (i = 0; i < size; i++)
3274 CSR_WRITE(sc, mta_reg + (i << 2), 0);
3275
3276 ETHER_LOCK(ec);
3277 ETHER_FIRST_MULTI(step, ec, enm);
3278 while (enm != NULL) {
3279 if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
3280 ETHER_UNLOCK(ec);
3281 /*
3282 * We must listen to a range of multicast addresses.
3283 * For now, just accept all multicasts, rather than
3284 * trying to set only those filter bits needed to match
3285 * the range. (At this time, the only use of address
3286 * ranges is for IP multicast routing, for which the
3287 * range is big enough to require all bits set.)
3288 */
3289 goto allmulti;
3290 }
3291
3292 hash = wm_mchash(sc, enm->enm_addrlo);
3293
3294 reg = (hash >> 5);
3295 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
3296 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
3297 || (sc->sc_type == WM_T_PCH2)
3298 || (sc->sc_type == WM_T_PCH_LPT)
3299 || (sc->sc_type == WM_T_PCH_SPT))
3300 reg &= 0x1f;
3301 else
3302 reg &= 0x7f;
3303 bit = hash & 0x1f;
3304
3305 hash = CSR_READ(sc, mta_reg + (reg << 2));
3306 hash |= 1U << bit;
3307
3308 if (sc->sc_type == WM_T_82544 && (reg & 1) != 0) {
3309 /*
3310 * 82544 Errata 9: Certain register cannot be written
3311 * with particular alignments in PCI-X bus operation
3312 * (FCAH, MTA and VFTA).
3313 */
3314 bit = CSR_READ(sc, mta_reg + ((reg - 1) << 2));
3315 CSR_WRITE(sc, mta_reg + (reg << 2), hash);
3316 CSR_WRITE(sc, mta_reg + ((reg - 1) << 2), bit);
3317 } else
3318 CSR_WRITE(sc, mta_reg + (reg << 2), hash);
3319
3320 ETHER_NEXT_MULTI(step, enm);
3321 }
3322 ETHER_UNLOCK(ec);
3323
3324 ifp->if_flags &= ~IFF_ALLMULTI;
3325 goto setit;
3326
3327 allmulti:
3328 ifp->if_flags |= IFF_ALLMULTI;
3329 sc->sc_rctl |= RCTL_MPE;
3330
3331 setit:
3332 CSR_WRITE(sc, WMREG_RCTL, sc->sc_rctl);
3333 }
3334
3335 /* Reset and init related */
3336
3337 static void
3338 wm_set_vlan(struct wm_softc *sc)
3339 {
3340
3341 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3342 device_xname(sc->sc_dev), __func__));
3343
3344 /* Deal with VLAN enables. */
3345 if (VLAN_ATTACHED(&sc->sc_ethercom))
3346 sc->sc_ctrl |= CTRL_VME;
3347 else
3348 sc->sc_ctrl &= ~CTRL_VME;
3349
3350 /* Write the control registers. */
3351 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
3352 }
3353
3354 static void
3355 wm_set_pcie_completion_timeout(struct wm_softc *sc)
3356 {
3357 uint32_t gcr;
3358 pcireg_t ctrl2;
3359
3360 gcr = CSR_READ(sc, WMREG_GCR);
3361
3362 /* Only take action if timeout value is defaulted to 0 */
3363 if ((gcr & GCR_CMPL_TMOUT_MASK) != 0)
3364 goto out;
3365
3366 if ((gcr & GCR_CAP_VER2) == 0) {
3367 gcr |= GCR_CMPL_TMOUT_10MS;
3368 goto out;
3369 }
3370
3371 ctrl2 = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
3372 sc->sc_pcixe_capoff + PCIE_DCSR2);
3373 ctrl2 |= WM_PCIE_DCSR2_16MS;
3374 pci_conf_write(sc->sc_pc, sc->sc_pcitag,
3375 sc->sc_pcixe_capoff + PCIE_DCSR2, ctrl2);
3376
3377 out:
3378 /* Disable completion timeout resend */
3379 gcr &= ~GCR_CMPL_TMOUT_RESEND;
3380
3381 CSR_WRITE(sc, WMREG_GCR, gcr);
3382 }
3383
3384 void
3385 wm_get_auto_rd_done(struct wm_softc *sc)
3386 {
3387 int i;
3388
3389 /* wait for eeprom to reload */
3390 switch (sc->sc_type) {
3391 case WM_T_82571:
3392 case WM_T_82572:
3393 case WM_T_82573:
3394 case WM_T_82574:
3395 case WM_T_82583:
3396 case WM_T_82575:
3397 case WM_T_82576:
3398 case WM_T_82580:
3399 case WM_T_I350:
3400 case WM_T_I354:
3401 case WM_T_I210:
3402 case WM_T_I211:
3403 case WM_T_80003:
3404 case WM_T_ICH8:
3405 case WM_T_ICH9:
3406 for (i = 0; i < 10; i++) {
3407 if (CSR_READ(sc, WMREG_EECD) & EECD_EE_AUTORD)
3408 break;
3409 delay(1000);
3410 }
3411 if (i == 10) {
3412 log(LOG_ERR, "%s: auto read from eeprom failed to "
3413 "complete\n", device_xname(sc->sc_dev));
3414 }
3415 break;
3416 default:
3417 break;
3418 }
3419 }
3420
3421 void
3422 wm_lan_init_done(struct wm_softc *sc)
3423 {
3424 uint32_t reg = 0;
3425 int i;
3426
3427 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3428 device_xname(sc->sc_dev), __func__));
3429
3430 /* Wait for eeprom to reload */
3431 switch (sc->sc_type) {
3432 case WM_T_ICH10:
3433 case WM_T_PCH:
3434 case WM_T_PCH2:
3435 case WM_T_PCH_LPT:
3436 case WM_T_PCH_SPT:
3437 for (i = 0; i < WM_ICH8_LAN_INIT_TIMEOUT; i++) {
3438 reg = CSR_READ(sc, WMREG_STATUS);
3439 if ((reg & STATUS_LAN_INIT_DONE) != 0)
3440 break;
3441 delay(100);
3442 }
3443 if (i >= WM_ICH8_LAN_INIT_TIMEOUT) {
3444 log(LOG_ERR, "%s: %s: lan_init_done failed to "
3445 "complete\n", device_xname(sc->sc_dev), __func__);
3446 }
3447 break;
3448 default:
3449 panic("%s: %s: unknown type\n", device_xname(sc->sc_dev),
3450 __func__);
3451 break;
3452 }
3453
3454 reg &= ~STATUS_LAN_INIT_DONE;
3455 CSR_WRITE(sc, WMREG_STATUS, reg);
3456 }
3457
3458 void
3459 wm_get_cfg_done(struct wm_softc *sc)
3460 {
3461 int mask;
3462 uint32_t reg;
3463 int i;
3464
3465 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3466 device_xname(sc->sc_dev), __func__));
3467
3468 /* Wait for eeprom to reload */
3469 switch (sc->sc_type) {
3470 case WM_T_82542_2_0:
3471 case WM_T_82542_2_1:
3472 /* null */
3473 break;
3474 case WM_T_82543:
3475 case WM_T_82544:
3476 case WM_T_82540:
3477 case WM_T_82545:
3478 case WM_T_82545_3:
3479 case WM_T_82546:
3480 case WM_T_82546_3:
3481 case WM_T_82541:
3482 case WM_T_82541_2:
3483 case WM_T_82547:
3484 case WM_T_82547_2:
3485 case WM_T_82573:
3486 case WM_T_82574:
3487 case WM_T_82583:
3488 /* generic */
3489 delay(10*1000);
3490 break;
3491 case WM_T_80003:
3492 case WM_T_82571:
3493 case WM_T_82572:
3494 case WM_T_82575:
3495 case WM_T_82576:
3496 case WM_T_82580:
3497 case WM_T_I350:
3498 case WM_T_I354:
3499 case WM_T_I210:
3500 case WM_T_I211:
3501 if (sc->sc_type == WM_T_82571) {
3502 /* Only 82571 shares port 0 */
3503 mask = EEMNGCTL_CFGDONE_0;
3504 } else
3505 mask = EEMNGCTL_CFGDONE_0 << sc->sc_funcid;
3506 for (i = 0; i < WM_PHY_CFG_TIMEOUT; i++) {
3507 if (CSR_READ(sc, WMREG_EEMNGCTL) & mask)
3508 break;
3509 delay(1000);
3510 }
3511 if (i >= WM_PHY_CFG_TIMEOUT) {
3512 DPRINTF(WM_DEBUG_GMII, ("%s: %s failed\n",
3513 device_xname(sc->sc_dev), __func__));
3514 }
3515 break;
3516 case WM_T_ICH8:
3517 case WM_T_ICH9:
3518 case WM_T_ICH10:
3519 case WM_T_PCH:
3520 case WM_T_PCH2:
3521 case WM_T_PCH_LPT:
3522 case WM_T_PCH_SPT:
3523 delay(10*1000);
3524 if (sc->sc_type >= WM_T_ICH10)
3525 wm_lan_init_done(sc);
3526 else
3527 wm_get_auto_rd_done(sc);
3528
3529 reg = CSR_READ(sc, WMREG_STATUS);
3530 if ((reg & STATUS_PHYRA) != 0)
3531 CSR_WRITE(sc, WMREG_STATUS, reg & ~STATUS_PHYRA);
3532 break;
3533 default:
3534 panic("%s: %s: unknown type\n", device_xname(sc->sc_dev),
3535 __func__);
3536 break;
3537 }
3538 }
3539
3540 /* Init hardware bits */
3541 void
3542 wm_initialize_hardware_bits(struct wm_softc *sc)
3543 {
3544 uint32_t tarc0, tarc1, reg;
3545
3546 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3547 device_xname(sc->sc_dev), __func__));
3548
3549 /* For 82571 variant, 80003 and ICHs */
3550 if (((sc->sc_type >= WM_T_82571) && (sc->sc_type <= WM_T_82583))
3551 || (sc->sc_type >= WM_T_80003)) {
3552
3553 /* Transmit Descriptor Control 0 */
3554 reg = CSR_READ(sc, WMREG_TXDCTL(0));
3555 reg |= TXDCTL_COUNT_DESC;
3556 CSR_WRITE(sc, WMREG_TXDCTL(0), reg);
3557
3558 /* Transmit Descriptor Control 1 */
3559 reg = CSR_READ(sc, WMREG_TXDCTL(1));
3560 reg |= TXDCTL_COUNT_DESC;
3561 CSR_WRITE(sc, WMREG_TXDCTL(1), reg);
3562
3563 /* TARC0 */
3564 tarc0 = CSR_READ(sc, WMREG_TARC0);
3565 switch (sc->sc_type) {
3566 case WM_T_82571:
3567 case WM_T_82572:
3568 case WM_T_82573:
3569 case WM_T_82574:
3570 case WM_T_82583:
3571 case WM_T_80003:
3572 /* Clear bits 30..27 */
3573 tarc0 &= ~__BITS(30, 27);
3574 break;
3575 default:
3576 break;
3577 }
3578
3579 switch (sc->sc_type) {
3580 case WM_T_82571:
3581 case WM_T_82572:
3582 tarc0 |= __BITS(26, 23); /* TARC0 bits 23-26 */
3583
3584 tarc1 = CSR_READ(sc, WMREG_TARC1);
3585 tarc1 &= ~__BITS(30, 29); /* Clear bits 30 and 29 */
3586 tarc1 |= __BITS(26, 24); /* TARC1 bits 26-24 */
3587 /* 8257[12] Errata No.7 */
3588 tarc1 |= __BIT(22); /* TARC1 bits 22 */
3589
3590 /* TARC1 bit 28 */
3591 if ((CSR_READ(sc, WMREG_TCTL) & TCTL_MULR) != 0)
3592 tarc1 &= ~__BIT(28);
3593 else
3594 tarc1 |= __BIT(28);
3595 CSR_WRITE(sc, WMREG_TARC1, tarc1);
3596
3597 /*
3598 * 8257[12] Errata No.13
3599 * Disable Dyamic Clock Gating.
3600 */
3601 reg = CSR_READ(sc, WMREG_CTRL_EXT);
3602 reg &= ~CTRL_EXT_DMA_DYN_CLK;
3603 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
3604 break;
3605 case WM_T_82573:
3606 case WM_T_82574:
3607 case WM_T_82583:
3608 if ((sc->sc_type == WM_T_82574)
3609 || (sc->sc_type == WM_T_82583))
3610 tarc0 |= __BIT(26); /* TARC0 bit 26 */
3611
3612 /* Extended Device Control */
3613 reg = CSR_READ(sc, WMREG_CTRL_EXT);
3614 reg &= ~__BIT(23); /* Clear bit 23 */
3615 reg |= __BIT(22); /* Set bit 22 */
3616 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
3617
3618 /* Device Control */
3619 sc->sc_ctrl &= ~__BIT(29); /* Clear bit 29 */
3620 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
3621
3622 /* PCIe Control Register */
3623 /*
3624 * 82573 Errata (unknown).
3625 *
3626 * 82574 Errata 25 and 82583 Errata 12
3627 * "Dropped Rx Packets":
3628 * NVM Image Version 2.1.4 and newer has no this bug.
3629 */
3630 reg = CSR_READ(sc, WMREG_GCR);
3631 reg |= GCR_L1_ACT_WITHOUT_L0S_RX;
3632 CSR_WRITE(sc, WMREG_GCR, reg);
3633
3634 if ((sc->sc_type == WM_T_82574)
3635 || (sc->sc_type == WM_T_82583)) {
3636 /*
3637 * Document says this bit must be set for
3638 * proper operation.
3639 */
3640 reg = CSR_READ(sc, WMREG_GCR);
3641 reg |= __BIT(22);
3642 CSR_WRITE(sc, WMREG_GCR, reg);
3643
3644 /*
3645 * Apply workaround for hardware errata
3646 * documented in errata docs Fixes issue where
3647 * some error prone or unreliable PCIe
3648 * completions are occurring, particularly
3649 * with ASPM enabled. Without fix, issue can
3650 * cause Tx timeouts.
3651 */
3652 reg = CSR_READ(sc, WMREG_GCR2);
3653 reg |= __BIT(0);
3654 CSR_WRITE(sc, WMREG_GCR2, reg);
3655 }
3656 break;
3657 case WM_T_80003:
3658 /* TARC0 */
3659 if ((sc->sc_mediatype == WM_MEDIATYPE_FIBER)
3660 || (sc->sc_mediatype == WM_MEDIATYPE_SERDES))
3661 tarc0 &= ~__BIT(20); /* Clear bits 20 */
3662
3663 /* TARC1 bit 28 */
3664 tarc1 = CSR_READ(sc, WMREG_TARC1);
3665 if ((CSR_READ(sc, WMREG_TCTL) & TCTL_MULR) != 0)
3666 tarc1 &= ~__BIT(28);
3667 else
3668 tarc1 |= __BIT(28);
3669 CSR_WRITE(sc, WMREG_TARC1, tarc1);
3670 break;
3671 case WM_T_ICH8:
3672 case WM_T_ICH9:
3673 case WM_T_ICH10:
3674 case WM_T_PCH:
3675 case WM_T_PCH2:
3676 case WM_T_PCH_LPT:
3677 case WM_T_PCH_SPT:
3678 /* TARC0 */
3679 if ((sc->sc_type == WM_T_ICH8)
3680 || (sc->sc_type == WM_T_PCH_SPT)) {
3681 /* Set TARC0 bits 29 and 28 */
3682 tarc0 |= __BITS(29, 28);
3683 }
3684 /* Set TARC0 bits 23,24,26,27 */
3685 tarc0 |= __BITS(27, 26) | __BITS(24, 23);
3686
3687 /* CTRL_EXT */
3688 reg = CSR_READ(sc, WMREG_CTRL_EXT);
3689 reg |= __BIT(22); /* Set bit 22 */
3690 /*
3691 * Enable PHY low-power state when MAC is at D3
3692 * w/o WoL
3693 */
3694 if (sc->sc_type >= WM_T_PCH)
3695 reg |= CTRL_EXT_PHYPDEN;
3696 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
3697
3698 /* TARC1 */
3699 tarc1 = CSR_READ(sc, WMREG_TARC1);
3700 /* bit 28 */
3701 if ((CSR_READ(sc, WMREG_TCTL) & TCTL_MULR) != 0)
3702 tarc1 &= ~__BIT(28);
3703 else
3704 tarc1 |= __BIT(28);
3705 tarc1 |= __BIT(24) | __BIT(26) | __BIT(30);
3706 CSR_WRITE(sc, WMREG_TARC1, tarc1);
3707
3708 /* Device Status */
3709 if (sc->sc_type == WM_T_ICH8) {
3710 reg = CSR_READ(sc, WMREG_STATUS);
3711 reg &= ~__BIT(31);
3712 CSR_WRITE(sc, WMREG_STATUS, reg);
3713
3714 }
3715
3716 /* IOSFPC */
3717 if (sc->sc_type == WM_T_PCH_SPT) {
3718 reg = CSR_READ(sc, WMREG_IOSFPC);
3719 reg |= RCTL_RDMTS_HEX; /* XXX RTCL bit? */
3720 CSR_WRITE(sc, WMREG_IOSFPC, reg);
3721 }
3722 /*
3723 * Work-around descriptor data corruption issue during
3724 * NFS v2 UDP traffic, just disable the NFS filtering
3725 * capability.
3726 */
3727 reg = CSR_READ(sc, WMREG_RFCTL);
3728 reg |= WMREG_RFCTL_NFSWDIS | WMREG_RFCTL_NFSRDIS;
3729 CSR_WRITE(sc, WMREG_RFCTL, reg);
3730 break;
3731 default:
3732 break;
3733 }
3734 CSR_WRITE(sc, WMREG_TARC0, tarc0);
3735
3736 switch (sc->sc_type) {
3737 /*
3738 * 8257[12] Errata No.52, 82573 Errata No.43 and some others.
3739 * Avoid RSS Hash Value bug.
3740 */
3741 case WM_T_82571:
3742 case WM_T_82572:
3743 case WM_T_82573:
3744 case WM_T_80003:
3745 case WM_T_ICH8:
3746 reg = CSR_READ(sc, WMREG_RFCTL);
3747 reg |= WMREG_RFCTL_NEWIPV6EXDIS |WMREG_RFCTL_IPV6EXDIS;
3748 CSR_WRITE(sc, WMREG_RFCTL, reg);
3749 break;
3750 case WM_T_82574:
3751 /* use extened Rx descriptor. */
3752 reg = CSR_READ(sc, WMREG_RFCTL);
3753 reg |= WMREG_RFCTL_EXSTEN;
3754 CSR_WRITE(sc, WMREG_RFCTL, reg);
3755 break;
3756 default:
3757 break;
3758 }
3759 } else if ((sc->sc_type >= WM_T_82575) && (sc->sc_type <= WM_T_I211)) {
3760 /*
3761 * 82575 Errata XXX, 82576 Errata 46, 82580 Errata 24,
3762 * I350 Errata 37, I210 Errata No. 31 and I211 Errata No. 11:
3763 * "Certain Malformed IPv6 Extension Headers are Not Processed
3764 * Correctly by the Device"
3765 *
3766 * I354(C2000) Errata AVR53:
3767 * "Malformed IPv6 Extension Headers May Result in LAN Device
3768 * Hang"
3769 */
3770 reg = CSR_READ(sc, WMREG_RFCTL);
3771 reg |= WMREG_RFCTL_IPV6EXDIS;
3772 CSR_WRITE(sc, WMREG_RFCTL, reg);
3773 }
3774 }
3775
3776 static uint32_t
3777 wm_rxpbs_adjust_82580(uint32_t val)
3778 {
3779 uint32_t rv = 0;
3780
3781 if (val < __arraycount(wm_82580_rxpbs_table))
3782 rv = wm_82580_rxpbs_table[val];
3783
3784 return rv;
3785 }
3786
3787 /*
3788 * wm_reset_phy:
3789 *
3790 * generic PHY reset function.
3791 * Same as e1000_phy_hw_reset_generic()
3792 */
3793 static void
3794 wm_reset_phy(struct wm_softc *sc)
3795 {
3796 uint32_t reg;
3797
3798 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3799 device_xname(sc->sc_dev), __func__));
3800 if (wm_phy_resetisblocked(sc))
3801 return;
3802
3803 sc->phy.acquire(sc);
3804
3805 reg = CSR_READ(sc, WMREG_CTRL);
3806 CSR_WRITE(sc, WMREG_CTRL, reg | CTRL_PHY_RESET);
3807 CSR_WRITE_FLUSH(sc);
3808
3809 delay(sc->phy.reset_delay_us);
3810
3811 CSR_WRITE(sc, WMREG_CTRL, reg);
3812 CSR_WRITE_FLUSH(sc);
3813
3814 delay(150);
3815
3816 sc->phy.release(sc);
3817
3818 wm_get_cfg_done(sc);
3819 }
3820
3821 static void
3822 wm_flush_desc_rings(struct wm_softc *sc)
3823 {
3824 pcireg_t preg;
3825 uint32_t reg;
3826 int nexttx;
3827
3828 /* First, disable MULR fix in FEXTNVM11 */
3829 reg = CSR_READ(sc, WMREG_FEXTNVM11);
3830 reg |= FEXTNVM11_DIS_MULRFIX;
3831 CSR_WRITE(sc, WMREG_FEXTNVM11, reg);
3832
3833 preg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, WM_PCI_DESCRING_STATUS);
3834 reg = CSR_READ(sc, WMREG_TDLEN(0));
3835 if (((preg & DESCRING_STATUS_FLUSH_REQ) != 0) && (reg != 0)) {
3836 struct wm_txqueue *txq;
3837 wiseman_txdesc_t *txd;
3838
3839 /* TX */
3840 printf("%s: Need TX flush (reg = %08x, len = %u)\n",
3841 device_xname(sc->sc_dev), preg, reg);
3842 reg = CSR_READ(sc, WMREG_TCTL);
3843 CSR_WRITE(sc, WMREG_TCTL, reg | TCTL_EN);
3844
3845 txq = &sc->sc_queue[0].wmq_txq;
3846 nexttx = txq->txq_next;
3847 txd = &txq->txq_descs[nexttx];
3848 wm_set_dma_addr(&txd->wtx_addr, WM_CDTXADDR(txq, nexttx));
3849 txd->wtx_cmdlen = htole32(WTX_CMD_IFCS| 512);
3850 txd->wtx_fields.wtxu_status = 0;
3851 txd->wtx_fields.wtxu_options = 0;
3852 txd->wtx_fields.wtxu_vlan = 0;
3853
3854 bus_space_barrier(sc->sc_st, sc->sc_sh, 0, 0,
3855 BUS_SPACE_BARRIER_WRITE);
3856
3857 txq->txq_next = WM_NEXTTX(txq, txq->txq_next);
3858 CSR_WRITE(sc, WMREG_TDT(0), txq->txq_next);
3859 bus_space_barrier(sc->sc_st, sc->sc_sh, 0, 0,
3860 BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
3861 delay(250);
3862 }
3863 preg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, WM_PCI_DESCRING_STATUS);
3864 if (preg & DESCRING_STATUS_FLUSH_REQ) {
3865 uint32_t rctl;
3866
3867 /* RX */
3868 printf("%s: Need RX flush (reg = %08x)\n",
3869 device_xname(sc->sc_dev), preg);
3870 rctl = CSR_READ(sc, WMREG_RCTL);
3871 CSR_WRITE(sc, WMREG_RCTL, rctl & ~RCTL_EN);
3872 CSR_WRITE_FLUSH(sc);
3873 delay(150);
3874
3875 reg = CSR_READ(sc, WMREG_RXDCTL(0));
3876 /* zero the lower 14 bits (prefetch and host thresholds) */
3877 reg &= 0xffffc000;
3878 /*
3879 * update thresholds: prefetch threshold to 31, host threshold
3880 * to 1 and make sure the granularity is "descriptors" and not
3881 * "cache lines"
3882 */
3883 reg |= (0x1f | (1 << 8) | RXDCTL_GRAN);
3884 CSR_WRITE(sc, WMREG_RXDCTL(0), reg);
3885
3886 /*
3887 * momentarily enable the RX ring for the changes to take
3888 * effect
3889 */
3890 CSR_WRITE(sc, WMREG_RCTL, rctl | RCTL_EN);
3891 CSR_WRITE_FLUSH(sc);
3892 delay(150);
3893 CSR_WRITE(sc, WMREG_RCTL, rctl & ~RCTL_EN);
3894 }
3895 }
3896
3897 /*
3898 * wm_reset:
3899 *
3900 * Reset the i82542 chip.
3901 */
3902 static void
3903 wm_reset(struct wm_softc *sc)
3904 {
3905 int phy_reset = 0;
3906 int i, error = 0;
3907 uint32_t reg;
3908
3909 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
3910 device_xname(sc->sc_dev), __func__));
3911 KASSERT(sc->sc_type != 0);
3912
3913 /*
3914 * Allocate on-chip memory according to the MTU size.
3915 * The Packet Buffer Allocation register must be written
3916 * before the chip is reset.
3917 */
3918 switch (sc->sc_type) {
3919 case WM_T_82547:
3920 case WM_T_82547_2:
3921 sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 8192 ?
3922 PBA_22K : PBA_30K;
3923 for (i = 0; i < sc->sc_nqueues; i++) {
3924 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
3925 txq->txq_fifo_head = 0;
3926 txq->txq_fifo_addr = sc->sc_pba << PBA_ADDR_SHIFT;
3927 txq->txq_fifo_size =
3928 (PBA_40K - sc->sc_pba) << PBA_BYTE_SHIFT;
3929 txq->txq_fifo_stall = 0;
3930 }
3931 break;
3932 case WM_T_82571:
3933 case WM_T_82572:
3934 case WM_T_82575: /* XXX need special handing for jumbo frames */
3935 case WM_T_80003:
3936 sc->sc_pba = PBA_32K;
3937 break;
3938 case WM_T_82573:
3939 sc->sc_pba = PBA_12K;
3940 break;
3941 case WM_T_82574:
3942 case WM_T_82583:
3943 sc->sc_pba = PBA_20K;
3944 break;
3945 case WM_T_82576:
3946 sc->sc_pba = CSR_READ(sc, WMREG_RXPBS);
3947 sc->sc_pba &= RXPBS_SIZE_MASK_82576;
3948 break;
3949 case WM_T_82580:
3950 case WM_T_I350:
3951 case WM_T_I354:
3952 sc->sc_pba = wm_rxpbs_adjust_82580(CSR_READ(sc, WMREG_RXPBS));
3953 break;
3954 case WM_T_I210:
3955 case WM_T_I211:
3956 sc->sc_pba = PBA_34K;
3957 break;
3958 case WM_T_ICH8:
3959 /* Workaround for a bit corruption issue in FIFO memory */
3960 sc->sc_pba = PBA_8K;
3961 CSR_WRITE(sc, WMREG_PBS, PBA_16K);
3962 break;
3963 case WM_T_ICH9:
3964 case WM_T_ICH10:
3965 sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 4096 ?
3966 PBA_14K : PBA_10K;
3967 break;
3968 case WM_T_PCH:
3969 case WM_T_PCH2:
3970 case WM_T_PCH_LPT:
3971 case WM_T_PCH_SPT:
3972 sc->sc_pba = PBA_26K;
3973 break;
3974 default:
3975 sc->sc_pba = sc->sc_ethercom.ec_if.if_mtu > 8192 ?
3976 PBA_40K : PBA_48K;
3977 break;
3978 }
3979 /*
3980 * Only old or non-multiqueue devices have the PBA register
3981 * XXX Need special handling for 82575.
3982 */
3983 if (((sc->sc_flags & WM_F_NEWQUEUE) == 0)
3984 || (sc->sc_type == WM_T_82575))
3985 CSR_WRITE(sc, WMREG_PBA, sc->sc_pba);
3986
3987 /* Prevent the PCI-E bus from sticking */
3988 if (sc->sc_flags & WM_F_PCIE) {
3989 int timeout = 800;
3990
3991 sc->sc_ctrl |= CTRL_GIO_M_DIS;
3992 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
3993
3994 while (timeout--) {
3995 if ((CSR_READ(sc, WMREG_STATUS) & STATUS_GIO_M_ENA)
3996 == 0)
3997 break;
3998 delay(100);
3999 }
4000 }
4001
4002 /* Set the completion timeout for interface */
4003 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
4004 || (sc->sc_type == WM_T_82580)
4005 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)
4006 || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211))
4007 wm_set_pcie_completion_timeout(sc);
4008
4009 /* Clear interrupt */
4010 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU);
4011 if (sc->sc_nintrs > 1) {
4012 if (sc->sc_type != WM_T_82574) {
4013 CSR_WRITE(sc, WMREG_EIMC, 0xffffffffU);
4014 CSR_WRITE(sc, WMREG_EIAC, 0);
4015 } else {
4016 CSR_WRITE(sc, WMREG_EIAC_82574, 0);
4017 }
4018 }
4019
4020 /* Stop the transmit and receive processes. */
4021 CSR_WRITE(sc, WMREG_RCTL, 0);
4022 sc->sc_rctl &= ~RCTL_EN;
4023 CSR_WRITE(sc, WMREG_TCTL, TCTL_PSP);
4024 CSR_WRITE_FLUSH(sc);
4025
4026 /* XXX set_tbi_sbp_82543() */
4027
4028 delay(10*1000);
4029
4030 /* Must acquire the MDIO ownership before MAC reset */
4031 switch (sc->sc_type) {
4032 case WM_T_82573:
4033 case WM_T_82574:
4034 case WM_T_82583:
4035 error = wm_get_hw_semaphore_82573(sc);
4036 break;
4037 default:
4038 break;
4039 }
4040
4041 /*
4042 * 82541 Errata 29? & 82547 Errata 28?
4043 * See also the description about PHY_RST bit in CTRL register
4044 * in 8254x_GBe_SDM.pdf.
4045 */
4046 if ((sc->sc_type == WM_T_82541) || (sc->sc_type == WM_T_82547)) {
4047 CSR_WRITE(sc, WMREG_CTRL,
4048 CSR_READ(sc, WMREG_CTRL) | CTRL_PHY_RESET);
4049 CSR_WRITE_FLUSH(sc);
4050 delay(5000);
4051 }
4052
4053 switch (sc->sc_type) {
4054 case WM_T_82544: /* XXX check whether WM_F_IOH_VALID is set */
4055 case WM_T_82541:
4056 case WM_T_82541_2:
4057 case WM_T_82547:
4058 case WM_T_82547_2:
4059 /*
4060 * On some chipsets, a reset through a memory-mapped write
4061 * cycle can cause the chip to reset before completing the
4062 * write cycle. This causes major headache that can be
4063 * avoided by issuing the reset via indirect register writes
4064 * through I/O space.
4065 *
4066 * So, if we successfully mapped the I/O BAR at attach time,
4067 * use that. Otherwise, try our luck with a memory-mapped
4068 * reset.
4069 */
4070 if (sc->sc_flags & WM_F_IOH_VALID)
4071 wm_io_write(sc, WMREG_CTRL, CTRL_RST);
4072 else
4073 CSR_WRITE(sc, WMREG_CTRL, CTRL_RST);
4074 break;
4075 case WM_T_82545_3:
4076 case WM_T_82546_3:
4077 /* Use the shadow control register on these chips. */
4078 CSR_WRITE(sc, WMREG_CTRL_SHADOW, CTRL_RST);
4079 break;
4080 case WM_T_80003:
4081 reg = CSR_READ(sc, WMREG_CTRL) | CTRL_RST;
4082 sc->phy.acquire(sc);
4083 CSR_WRITE(sc, WMREG_CTRL, reg);
4084 sc->phy.release(sc);
4085 break;
4086 case WM_T_ICH8:
4087 case WM_T_ICH9:
4088 case WM_T_ICH10:
4089 case WM_T_PCH:
4090 case WM_T_PCH2:
4091 case WM_T_PCH_LPT:
4092 case WM_T_PCH_SPT:
4093 reg = CSR_READ(sc, WMREG_CTRL) | CTRL_RST;
4094 if (wm_phy_resetisblocked(sc) == false) {
4095 /*
4096 * Gate automatic PHY configuration by hardware on
4097 * non-managed 82579
4098 */
4099 if ((sc->sc_type == WM_T_PCH2)
4100 && ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID)
4101 == 0))
4102 wm_gate_hw_phy_config_ich8lan(sc, true);
4103
4104 reg |= CTRL_PHY_RESET;
4105 phy_reset = 1;
4106 } else
4107 printf("XXX reset is blocked!!!\n");
4108 sc->phy.acquire(sc);
4109 CSR_WRITE(sc, WMREG_CTRL, reg);
4110 /* Don't insert a completion barrier when reset */
4111 delay(20*1000);
4112 mutex_exit(sc->sc_ich_phymtx);
4113 break;
4114 case WM_T_82580:
4115 case WM_T_I350:
4116 case WM_T_I354:
4117 case WM_T_I210:
4118 case WM_T_I211:
4119 CSR_WRITE(sc, WMREG_CTRL, CSR_READ(sc, WMREG_CTRL) | CTRL_RST);
4120 if (sc->sc_pcidevid != PCI_PRODUCT_INTEL_DH89XXCC_SGMII)
4121 CSR_WRITE_FLUSH(sc);
4122 delay(5000);
4123 break;
4124 case WM_T_82542_2_0:
4125 case WM_T_82542_2_1:
4126 case WM_T_82543:
4127 case WM_T_82540:
4128 case WM_T_82545:
4129 case WM_T_82546:
4130 case WM_T_82571:
4131 case WM_T_82572:
4132 case WM_T_82573:
4133 case WM_T_82574:
4134 case WM_T_82575:
4135 case WM_T_82576:
4136 case WM_T_82583:
4137 default:
4138 /* Everything else can safely use the documented method. */
4139 CSR_WRITE(sc, WMREG_CTRL, CSR_READ(sc, WMREG_CTRL) | CTRL_RST);
4140 break;
4141 }
4142
4143 /* Must release the MDIO ownership after MAC reset */
4144 switch (sc->sc_type) {
4145 case WM_T_82573:
4146 case WM_T_82574:
4147 case WM_T_82583:
4148 if (error == 0)
4149 wm_put_hw_semaphore_82573(sc);
4150 break;
4151 default:
4152 break;
4153 }
4154
4155 if (phy_reset != 0)
4156 wm_get_cfg_done(sc);
4157
4158 /* reload EEPROM */
4159 switch (sc->sc_type) {
4160 case WM_T_82542_2_0:
4161 case WM_T_82542_2_1:
4162 case WM_T_82543:
4163 case WM_T_82544:
4164 delay(10);
4165 reg = CSR_READ(sc, WMREG_CTRL_EXT) | CTRL_EXT_EE_RST;
4166 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
4167 CSR_WRITE_FLUSH(sc);
4168 delay(2000);
4169 break;
4170 case WM_T_82540:
4171 case WM_T_82545:
4172 case WM_T_82545_3:
4173 case WM_T_82546:
4174 case WM_T_82546_3:
4175 delay(5*1000);
4176 /* XXX Disable HW ARPs on ASF enabled adapters */
4177 break;
4178 case WM_T_82541:
4179 case WM_T_82541_2:
4180 case WM_T_82547:
4181 case WM_T_82547_2:
4182 delay(20000);
4183 /* XXX Disable HW ARPs on ASF enabled adapters */
4184 break;
4185 case WM_T_82571:
4186 case WM_T_82572:
4187 case WM_T_82573:
4188 case WM_T_82574:
4189 case WM_T_82583:
4190 if (sc->sc_flags & WM_F_EEPROM_FLASH) {
4191 delay(10);
4192 reg = CSR_READ(sc, WMREG_CTRL_EXT) | CTRL_EXT_EE_RST;
4193 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
4194 CSR_WRITE_FLUSH(sc);
4195 }
4196 /* check EECD_EE_AUTORD */
4197 wm_get_auto_rd_done(sc);
4198 /*
4199 * Phy configuration from NVM just starts after EECD_AUTO_RD
4200 * is set.
4201 */
4202 if ((sc->sc_type == WM_T_82573) || (sc->sc_type == WM_T_82574)
4203 || (sc->sc_type == WM_T_82583))
4204 delay(25*1000);
4205 break;
4206 case WM_T_82575:
4207 case WM_T_82576:
4208 case WM_T_82580:
4209 case WM_T_I350:
4210 case WM_T_I354:
4211 case WM_T_I210:
4212 case WM_T_I211:
4213 case WM_T_80003:
4214 /* check EECD_EE_AUTORD */
4215 wm_get_auto_rd_done(sc);
4216 break;
4217 case WM_T_ICH8:
4218 case WM_T_ICH9:
4219 case WM_T_ICH10:
4220 case WM_T_PCH:
4221 case WM_T_PCH2:
4222 case WM_T_PCH_LPT:
4223 case WM_T_PCH_SPT:
4224 break;
4225 default:
4226 panic("%s: unknown type\n", __func__);
4227 }
4228
4229 /* Check whether EEPROM is present or not */
4230 switch (sc->sc_type) {
4231 case WM_T_82575:
4232 case WM_T_82576:
4233 case WM_T_82580:
4234 case WM_T_I350:
4235 case WM_T_I354:
4236 case WM_T_ICH8:
4237 case WM_T_ICH9:
4238 if ((CSR_READ(sc, WMREG_EECD) & EECD_EE_PRES) == 0) {
4239 /* Not found */
4240 sc->sc_flags |= WM_F_EEPROM_INVALID;
4241 if (sc->sc_type == WM_T_82575)
4242 wm_reset_init_script_82575(sc);
4243 }
4244 break;
4245 default:
4246 break;
4247 }
4248
4249 if ((sc->sc_type == WM_T_82580)
4250 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)) {
4251 /* clear global device reset status bit */
4252 CSR_WRITE(sc, WMREG_STATUS, STATUS_DEV_RST_SET);
4253 }
4254
4255 /* Clear any pending interrupt events. */
4256 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU);
4257 reg = CSR_READ(sc, WMREG_ICR);
4258 if (sc->sc_nintrs > 1) {
4259 if (sc->sc_type != WM_T_82574) {
4260 CSR_WRITE(sc, WMREG_EIMC, 0xffffffffU);
4261 CSR_WRITE(sc, WMREG_EIAC, 0);
4262 } else
4263 CSR_WRITE(sc, WMREG_EIAC_82574, 0);
4264 }
4265
4266 /* reload sc_ctrl */
4267 sc->sc_ctrl = CSR_READ(sc, WMREG_CTRL);
4268
4269 if ((sc->sc_type >= WM_T_I350) && (sc->sc_type <= WM_T_I211))
4270 wm_set_eee_i350(sc);
4271
4272 /* Clear the host wakeup bit after lcd reset */
4273 if (sc->sc_type >= WM_T_PCH) {
4274 reg = wm_gmii_hv_readreg(sc->sc_dev, 2,
4275 BM_PORT_GEN_CFG);
4276 reg &= ~BM_WUC_HOST_WU_BIT;
4277 wm_gmii_hv_writereg(sc->sc_dev, 2,
4278 BM_PORT_GEN_CFG, reg);
4279 }
4280
4281 /*
4282 * For PCH, this write will make sure that any noise will be detected
4283 * as a CRC error and be dropped rather than show up as a bad packet
4284 * to the DMA engine
4285 */
4286 if (sc->sc_type == WM_T_PCH)
4287 CSR_WRITE(sc, WMREG_CRC_OFFSET, 0x65656565);
4288
4289 if (sc->sc_type >= WM_T_82544)
4290 CSR_WRITE(sc, WMREG_WUC, 0);
4291
4292 wm_reset_mdicnfg_82580(sc);
4293
4294 if ((sc->sc_flags & WM_F_PLL_WA_I210) != 0)
4295 wm_pll_workaround_i210(sc);
4296 }
4297
4298 /*
4299 * wm_add_rxbuf:
4300 *
4301 * Add a receive buffer to the indiciated descriptor.
4302 */
4303 static int
4304 wm_add_rxbuf(struct wm_rxqueue *rxq, int idx)
4305 {
4306 struct wm_softc *sc = rxq->rxq_sc;
4307 struct wm_rxsoft *rxs = &rxq->rxq_soft[idx];
4308 struct mbuf *m;
4309 int error;
4310
4311 KASSERT(mutex_owned(rxq->rxq_lock));
4312
4313 MGETHDR(m, M_DONTWAIT, MT_DATA);
4314 if (m == NULL)
4315 return ENOBUFS;
4316
4317 MCLGET(m, M_DONTWAIT);
4318 if ((m->m_flags & M_EXT) == 0) {
4319 m_freem(m);
4320 return ENOBUFS;
4321 }
4322
4323 if (rxs->rxs_mbuf != NULL)
4324 bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap);
4325
4326 rxs->rxs_mbuf = m;
4327
4328 m->m_len = m->m_pkthdr.len = m->m_ext.ext_size;
4329 error = bus_dmamap_load_mbuf(sc->sc_dmat, rxs->rxs_dmamap, m,
4330 BUS_DMA_READ | BUS_DMA_NOWAIT);
4331 if (error) {
4332 /* XXX XXX XXX */
4333 aprint_error_dev(sc->sc_dev,
4334 "unable to load rx DMA map %d, error = %d\n",
4335 idx, error);
4336 panic("wm_add_rxbuf");
4337 }
4338
4339 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
4340 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);
4341
4342 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
4343 if ((sc->sc_rctl & RCTL_EN) != 0)
4344 wm_init_rxdesc(rxq, idx);
4345 } else
4346 wm_init_rxdesc(rxq, idx);
4347
4348 return 0;
4349 }
4350
4351 /*
4352 * wm_rxdrain:
4353 *
4354 * Drain the receive queue.
4355 */
4356 static void
4357 wm_rxdrain(struct wm_rxqueue *rxq)
4358 {
4359 struct wm_softc *sc = rxq->rxq_sc;
4360 struct wm_rxsoft *rxs;
4361 int i;
4362
4363 KASSERT(mutex_owned(rxq->rxq_lock));
4364
4365 for (i = 0; i < WM_NRXDESC; i++) {
4366 rxs = &rxq->rxq_soft[i];
4367 if (rxs->rxs_mbuf != NULL) {
4368 bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap);
4369 m_freem(rxs->rxs_mbuf);
4370 rxs->rxs_mbuf = NULL;
4371 }
4372 }
4373 }
4374
4375
4376 /*
4377 * XXX copy from FreeBSD's sys/net/rss_config.c
4378 */
4379 /*
4380 * RSS secret key, intended to prevent attacks on load-balancing. Its
4381 * effectiveness may be limited by algorithm choice and available entropy
4382 * during the boot.
4383 *
4384 * XXXRW: And that we don't randomize it yet!
4385 *
4386 * This is the default Microsoft RSS specification key which is also
4387 * the Chelsio T5 firmware default key.
4388 */
4389 #define RSS_KEYSIZE 40
4390 static uint8_t wm_rss_key[RSS_KEYSIZE] = {
4391 0x6d, 0x5a, 0x56, 0xda, 0x25, 0x5b, 0x0e, 0xc2,
4392 0x41, 0x67, 0x25, 0x3d, 0x43, 0xa3, 0x8f, 0xb0,
4393 0xd0, 0xca, 0x2b, 0xcb, 0xae, 0x7b, 0x30, 0xb4,
4394 0x77, 0xcb, 0x2d, 0xa3, 0x80, 0x30, 0xf2, 0x0c,
4395 0x6a, 0x42, 0xb7, 0x3b, 0xbe, 0xac, 0x01, 0xfa,
4396 };
4397
4398 /*
4399 * Caller must pass an array of size sizeof(rss_key).
4400 *
4401 * XXX
4402 * As if_ixgbe may use this function, this function should not be
4403 * if_wm specific function.
4404 */
4405 static void
4406 wm_rss_getkey(uint8_t *key)
4407 {
4408
4409 memcpy(key, wm_rss_key, sizeof(wm_rss_key));
4410 }
4411
4412 /*
4413 * Setup registers for RSS.
4414 *
4415 * XXX not yet VMDq support
4416 */
4417 static void
4418 wm_init_rss(struct wm_softc *sc)
4419 {
4420 uint32_t mrqc, reta_reg, rss_key[RSSRK_NUM_REGS];
4421 int i;
4422
4423 CTASSERT(sizeof(rss_key) == sizeof(wm_rss_key));
4424
4425 for (i = 0; i < RETA_NUM_ENTRIES; i++) {
4426 int qid, reta_ent;
4427
4428 qid = i % sc->sc_nqueues;
4429 switch(sc->sc_type) {
4430 case WM_T_82574:
4431 reta_ent = __SHIFTIN(qid,
4432 RETA_ENT_QINDEX_MASK_82574);
4433 break;
4434 case WM_T_82575:
4435 reta_ent = __SHIFTIN(qid,
4436 RETA_ENT_QINDEX1_MASK_82575);
4437 break;
4438 default:
4439 reta_ent = __SHIFTIN(qid, RETA_ENT_QINDEX_MASK);
4440 break;
4441 }
4442
4443 reta_reg = CSR_READ(sc, WMREG_RETA_Q(i));
4444 reta_reg &= ~RETA_ENTRY_MASK_Q(i);
4445 reta_reg |= __SHIFTIN(reta_ent, RETA_ENTRY_MASK_Q(i));
4446 CSR_WRITE(sc, WMREG_RETA_Q(i), reta_reg);
4447 }
4448
4449 wm_rss_getkey((uint8_t *)rss_key);
4450 for (i = 0; i < RSSRK_NUM_REGS; i++)
4451 CSR_WRITE(sc, WMREG_RSSRK(i), rss_key[i]);
4452
4453 if (sc->sc_type == WM_T_82574)
4454 mrqc = MRQC_ENABLE_RSS_MQ_82574;
4455 else
4456 mrqc = MRQC_ENABLE_RSS_MQ;
4457
4458 /*
4459 * MRQC_RSS_FIELD_IPV6_EX is not set because of an errata.
4460 * See IPV6EXDIS bit in wm_initialize_hardware_bits().
4461 */
4462 mrqc |= (MRQC_RSS_FIELD_IPV4 | MRQC_RSS_FIELD_IPV4_TCP);
4463 mrqc |= (MRQC_RSS_FIELD_IPV6 | MRQC_RSS_FIELD_IPV6_TCP);
4464 mrqc |= (MRQC_RSS_FIELD_IPV4_UDP | MRQC_RSS_FIELD_IPV6_UDP);
4465 mrqc |= (MRQC_RSS_FIELD_IPV6_UDP_EX | MRQC_RSS_FIELD_IPV6_TCP_EX);
4466
4467 CSR_WRITE(sc, WMREG_MRQC, mrqc);
4468 }
4469
4470 /*
4471 * Adjust TX and RX queue numbers which the system actulally uses.
4472 *
4473 * The numbers are affected by below parameters.
4474 * - The nubmer of hardware queues
4475 * - The number of MSI-X vectors (= "nvectors" argument)
4476 * - ncpu
4477 */
4478 static void
4479 wm_adjust_qnum(struct wm_softc *sc, int nvectors)
4480 {
4481 int hw_ntxqueues, hw_nrxqueues, hw_nqueues;
4482
4483 if (nvectors < 2) {
4484 sc->sc_nqueues = 1;
4485 return;
4486 }
4487
4488 switch(sc->sc_type) {
4489 case WM_T_82572:
4490 hw_ntxqueues = 2;
4491 hw_nrxqueues = 2;
4492 break;
4493 case WM_T_82574:
4494 hw_ntxqueues = 2;
4495 hw_nrxqueues = 2;
4496 break;
4497 case WM_T_82575:
4498 hw_ntxqueues = 4;
4499 hw_nrxqueues = 4;
4500 break;
4501 case WM_T_82576:
4502 hw_ntxqueues = 16;
4503 hw_nrxqueues = 16;
4504 break;
4505 case WM_T_82580:
4506 case WM_T_I350:
4507 case WM_T_I354:
4508 hw_ntxqueues = 8;
4509 hw_nrxqueues = 8;
4510 break;
4511 case WM_T_I210:
4512 hw_ntxqueues = 4;
4513 hw_nrxqueues = 4;
4514 break;
4515 case WM_T_I211:
4516 hw_ntxqueues = 2;
4517 hw_nrxqueues = 2;
4518 break;
4519 /*
4520 * As below ethernet controllers does not support MSI-X,
4521 * this driver let them not use multiqueue.
4522 * - WM_T_80003
4523 * - WM_T_ICH8
4524 * - WM_T_ICH9
4525 * - WM_T_ICH10
4526 * - WM_T_PCH
4527 * - WM_T_PCH2
4528 * - WM_T_PCH_LPT
4529 */
4530 default:
4531 hw_ntxqueues = 1;
4532 hw_nrxqueues = 1;
4533 break;
4534 }
4535
4536 hw_nqueues = min(hw_ntxqueues, hw_nrxqueues);
4537
4538 /*
4539 * As queues more than MSI-X vectors cannot improve scaling, we limit
4540 * the number of queues used actually.
4541 */
4542 if (nvectors < hw_nqueues + 1) {
4543 sc->sc_nqueues = nvectors - 1;
4544 } else {
4545 sc->sc_nqueues = hw_nqueues;
4546 }
4547
4548 /*
4549 * As queues more then cpus cannot improve scaling, we limit
4550 * the number of queues used actually.
4551 */
4552 if (ncpu < sc->sc_nqueues)
4553 sc->sc_nqueues = ncpu;
4554 }
4555
4556 /*
4557 * Both single interrupt MSI and INTx can use this function.
4558 */
4559 static int
4560 wm_setup_legacy(struct wm_softc *sc)
4561 {
4562 pci_chipset_tag_t pc = sc->sc_pc;
4563 const char *intrstr = NULL;
4564 char intrbuf[PCI_INTRSTR_LEN];
4565 int error;
4566
4567 error = wm_alloc_txrx_queues(sc);
4568 if (error) {
4569 aprint_error_dev(sc->sc_dev, "cannot allocate queues %d\n",
4570 error);
4571 return ENOMEM;
4572 }
4573 intrstr = pci_intr_string(pc, sc->sc_intrs[0], intrbuf,
4574 sizeof(intrbuf));
4575 #ifdef WM_MPSAFE
4576 pci_intr_setattr(pc, &sc->sc_intrs[0], PCI_INTR_MPSAFE, true);
4577 #endif
4578 sc->sc_ihs[0] = pci_intr_establish_xname(pc, sc->sc_intrs[0],
4579 IPL_NET, wm_intr_legacy, sc, device_xname(sc->sc_dev));
4580 if (sc->sc_ihs[0] == NULL) {
4581 aprint_error_dev(sc->sc_dev,"unable to establish %s\n",
4582 (pci_intr_type(pc, sc->sc_intrs[0])
4583 == PCI_INTR_TYPE_MSI) ? "MSI" : "INTx");
4584 return ENOMEM;
4585 }
4586
4587 aprint_normal_dev(sc->sc_dev, "interrupting at %s\n", intrstr);
4588 sc->sc_nintrs = 1;
4589 return 0;
4590 }
4591
4592 static int
4593 wm_setup_msix(struct wm_softc *sc)
4594 {
4595 void *vih;
4596 kcpuset_t *affinity;
4597 int qidx, error, intr_idx, txrx_established;
4598 pci_chipset_tag_t pc = sc->sc_pc;
4599 const char *intrstr = NULL;
4600 char intrbuf[PCI_INTRSTR_LEN];
4601 char intr_xname[INTRDEVNAMEBUF];
4602
4603 if (sc->sc_nqueues < ncpu) {
4604 /*
4605 * To avoid other devices' interrupts, the affinity of Tx/Rx
4606 * interrupts start from CPU#1.
4607 */
4608 sc->sc_affinity_offset = 1;
4609 } else {
4610 /*
4611 * In this case, this device use all CPUs. So, we unify
4612 * affinitied cpu_index to msix vector number for readability.
4613 */
4614 sc->sc_affinity_offset = 0;
4615 }
4616
4617 error = wm_alloc_txrx_queues(sc);
4618 if (error) {
4619 aprint_error_dev(sc->sc_dev, "cannot allocate queues %d\n",
4620 error);
4621 return ENOMEM;
4622 }
4623
4624 kcpuset_create(&affinity, false);
4625 intr_idx = 0;
4626
4627 /*
4628 * TX and RX
4629 */
4630 txrx_established = 0;
4631 for (qidx = 0; qidx < sc->sc_nqueues; qidx++) {
4632 struct wm_queue *wmq = &sc->sc_queue[qidx];
4633 int affinity_to = (sc->sc_affinity_offset + intr_idx) % ncpu;
4634
4635 intrstr = pci_intr_string(pc, sc->sc_intrs[intr_idx], intrbuf,
4636 sizeof(intrbuf));
4637 #ifdef WM_MPSAFE
4638 pci_intr_setattr(pc, &sc->sc_intrs[intr_idx],
4639 PCI_INTR_MPSAFE, true);
4640 #endif
4641 memset(intr_xname, 0, sizeof(intr_xname));
4642 snprintf(intr_xname, sizeof(intr_xname), "%sTXRX%d",
4643 device_xname(sc->sc_dev), qidx);
4644 vih = pci_intr_establish_xname(pc, sc->sc_intrs[intr_idx],
4645 IPL_NET, wm_txrxintr_msix, wmq, intr_xname);
4646 if (vih == NULL) {
4647 aprint_error_dev(sc->sc_dev,
4648 "unable to establish MSI-X(for TX and RX)%s%s\n",
4649 intrstr ? " at " : "",
4650 intrstr ? intrstr : "");
4651
4652 goto fail;
4653 }
4654 kcpuset_zero(affinity);
4655 /* Round-robin affinity */
4656 kcpuset_set(affinity, affinity_to);
4657 error = interrupt_distribute(vih, affinity, NULL);
4658 if (error == 0) {
4659 aprint_normal_dev(sc->sc_dev,
4660 "for TX and RX interrupting at %s affinity to %u\n",
4661 intrstr, affinity_to);
4662 } else {
4663 aprint_normal_dev(sc->sc_dev,
4664 "for TX and RX interrupting at %s\n", intrstr);
4665 }
4666 sc->sc_ihs[intr_idx] = vih;
4667 wmq->wmq_id= qidx;
4668 wmq->wmq_intr_idx = intr_idx;
4669
4670 txrx_established++;
4671 intr_idx++;
4672 }
4673
4674 /*
4675 * LINK
4676 */
4677 intrstr = pci_intr_string(pc, sc->sc_intrs[intr_idx], intrbuf,
4678 sizeof(intrbuf));
4679 #ifdef WM_MPSAFE
4680 pci_intr_setattr(pc, &sc->sc_intrs[intr_idx], PCI_INTR_MPSAFE, true);
4681 #endif
4682 memset(intr_xname, 0, sizeof(intr_xname));
4683 snprintf(intr_xname, sizeof(intr_xname), "%sLINK",
4684 device_xname(sc->sc_dev));
4685 vih = pci_intr_establish_xname(pc, sc->sc_intrs[intr_idx],
4686 IPL_NET, wm_linkintr_msix, sc, intr_xname);
4687 if (vih == NULL) {
4688 aprint_error_dev(sc->sc_dev,
4689 "unable to establish MSI-X(for LINK)%s%s\n",
4690 intrstr ? " at " : "",
4691 intrstr ? intrstr : "");
4692
4693 goto fail;
4694 }
4695 /* keep default affinity to LINK interrupt */
4696 aprint_normal_dev(sc->sc_dev,
4697 "for LINK interrupting at %s\n", intrstr);
4698 sc->sc_ihs[intr_idx] = vih;
4699 sc->sc_link_intr_idx = intr_idx;
4700
4701 sc->sc_nintrs = sc->sc_nqueues + 1;
4702 kcpuset_destroy(affinity);
4703 return 0;
4704
4705 fail:
4706 for (qidx = 0; qidx < txrx_established; qidx++) {
4707 struct wm_queue *wmq = &sc->sc_queue[qidx];
4708 pci_intr_disestablish(sc->sc_pc,sc->sc_ihs[wmq->wmq_intr_idx]);
4709 sc->sc_ihs[wmq->wmq_intr_idx] = NULL;
4710 }
4711
4712 kcpuset_destroy(affinity);
4713 return ENOMEM;
4714 }
4715
4716 static void
4717 wm_turnon(struct wm_softc *sc)
4718 {
4719 int i;
4720
4721 KASSERT(WM_CORE_LOCKED(sc));
4722
4723 for(i = 0; i < sc->sc_nqueues; i++) {
4724 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
4725 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
4726
4727 mutex_enter(txq->txq_lock);
4728 txq->txq_stopping = false;
4729 mutex_exit(txq->txq_lock);
4730
4731 mutex_enter(rxq->rxq_lock);
4732 rxq->rxq_stopping = false;
4733 mutex_exit(rxq->rxq_lock);
4734 }
4735
4736 sc->sc_core_stopping = false;
4737 }
4738
4739 static void
4740 wm_turnoff(struct wm_softc *sc)
4741 {
4742 int i;
4743
4744 KASSERT(WM_CORE_LOCKED(sc));
4745
4746 sc->sc_core_stopping = true;
4747
4748 for(i = 0; i < sc->sc_nqueues; i++) {
4749 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
4750 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
4751
4752 mutex_enter(rxq->rxq_lock);
4753 rxq->rxq_stopping = true;
4754 mutex_exit(rxq->rxq_lock);
4755
4756 mutex_enter(txq->txq_lock);
4757 txq->txq_stopping = true;
4758 mutex_exit(txq->txq_lock);
4759 }
4760 }
4761
4762 /*
4763 * wm_init: [ifnet interface function]
4764 *
4765 * Initialize the interface.
4766 */
4767 static int
4768 wm_init(struct ifnet *ifp)
4769 {
4770 struct wm_softc *sc = ifp->if_softc;
4771 int ret;
4772
4773 WM_CORE_LOCK(sc);
4774 ret = wm_init_locked(ifp);
4775 WM_CORE_UNLOCK(sc);
4776
4777 return ret;
4778 }
4779
4780 static int
4781 wm_init_locked(struct ifnet *ifp)
4782 {
4783 struct wm_softc *sc = ifp->if_softc;
4784 int i, j, trynum, error = 0;
4785 uint32_t reg;
4786
4787 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
4788 device_xname(sc->sc_dev), __func__));
4789 KASSERT(WM_CORE_LOCKED(sc));
4790
4791 /*
4792 * *_HDR_ALIGNED_P is constant 1 if __NO_STRICT_ALIGMENT is set.
4793 * There is a small but measurable benefit to avoiding the adjusment
4794 * of the descriptor so that the headers are aligned, for normal mtu,
4795 * on such platforms. One possibility is that the DMA itself is
4796 * slightly more efficient if the front of the entire packet (instead
4797 * of the front of the headers) is aligned.
4798 *
4799 * Note we must always set align_tweak to 0 if we are using
4800 * jumbo frames.
4801 */
4802 #ifdef __NO_STRICT_ALIGNMENT
4803 sc->sc_align_tweak = 0;
4804 #else
4805 if ((ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN) > (MCLBYTES - 2))
4806 sc->sc_align_tweak = 0;
4807 else
4808 sc->sc_align_tweak = 2;
4809 #endif /* __NO_STRICT_ALIGNMENT */
4810
4811 /* Cancel any pending I/O. */
4812 wm_stop_locked(ifp, 0);
4813
4814 /* update statistics before reset */
4815 ifp->if_collisions += CSR_READ(sc, WMREG_COLC);
4816 ifp->if_ierrors += CSR_READ(sc, WMREG_RXERRC);
4817
4818 /* PCH_SPT hardware workaround */
4819 if (sc->sc_type == WM_T_PCH_SPT)
4820 wm_flush_desc_rings(sc);
4821
4822 /* Reset the chip to a known state. */
4823 wm_reset(sc);
4824
4825 /* AMT based hardware can now take control from firmware */
4826 if ((sc->sc_flags & WM_F_HAS_AMT) != 0)
4827 wm_get_hw_control(sc);
4828
4829 /* Init hardware bits */
4830 wm_initialize_hardware_bits(sc);
4831
4832 /* Reset the PHY. */
4833 if (sc->sc_flags & WM_F_HAS_MII)
4834 wm_gmii_reset(sc);
4835
4836 /* Calculate (E)ITR value */
4837 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
4838 sc->sc_itr = 450; /* For EITR */
4839 } else if (sc->sc_type >= WM_T_82543) {
4840 /*
4841 * Set up the interrupt throttling register (units of 256ns)
4842 * Note that a footnote in Intel's documentation says this
4843 * ticker runs at 1/4 the rate when the chip is in 100Mbit
4844 * or 10Mbit mode. Empirically, it appears to be the case
4845 * that that is also true for the 1024ns units of the other
4846 * interrupt-related timer registers -- so, really, we ought
4847 * to divide this value by 4 when the link speed is low.
4848 *
4849 * XXX implement this division at link speed change!
4850 */
4851
4852 /*
4853 * For N interrupts/sec, set this value to:
4854 * 1000000000 / (N * 256). Note that we set the
4855 * absolute and packet timer values to this value
4856 * divided by 4 to get "simple timer" behavior.
4857 */
4858
4859 sc->sc_itr = 1500; /* 2604 ints/sec */
4860 }
4861
4862 error = wm_init_txrx_queues(sc);
4863 if (error)
4864 goto out;
4865
4866 /*
4867 * Clear out the VLAN table -- we don't use it (yet).
4868 */
4869 CSR_WRITE(sc, WMREG_VET, 0);
4870 if ((sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354))
4871 trynum = 10; /* Due to hw errata */
4872 else
4873 trynum = 1;
4874 for (i = 0; i < WM_VLAN_TABSIZE; i++)
4875 for (j = 0; j < trynum; j++)
4876 CSR_WRITE(sc, WMREG_VFTA + (i << 2), 0);
4877
4878 /*
4879 * Set up flow-control parameters.
4880 *
4881 * XXX Values could probably stand some tuning.
4882 */
4883 if ((sc->sc_type != WM_T_ICH8) && (sc->sc_type != WM_T_ICH9)
4884 && (sc->sc_type != WM_T_ICH10) && (sc->sc_type != WM_T_PCH)
4885 && (sc->sc_type != WM_T_PCH2) && (sc->sc_type != WM_T_PCH_LPT)
4886 && (sc->sc_type != WM_T_PCH_SPT)) {
4887 CSR_WRITE(sc, WMREG_FCAL, FCAL_CONST);
4888 CSR_WRITE(sc, WMREG_FCAH, FCAH_CONST);
4889 CSR_WRITE(sc, WMREG_FCT, ETHERTYPE_FLOWCONTROL);
4890 }
4891
4892 sc->sc_fcrtl = FCRTL_DFLT;
4893 if (sc->sc_type < WM_T_82543) {
4894 CSR_WRITE(sc, WMREG_OLD_FCRTH, FCRTH_DFLT);
4895 CSR_WRITE(sc, WMREG_OLD_FCRTL, sc->sc_fcrtl);
4896 } else {
4897 CSR_WRITE(sc, WMREG_FCRTH, FCRTH_DFLT);
4898 CSR_WRITE(sc, WMREG_FCRTL, sc->sc_fcrtl);
4899 }
4900
4901 if (sc->sc_type == WM_T_80003)
4902 CSR_WRITE(sc, WMREG_FCTTV, 0xffff);
4903 else
4904 CSR_WRITE(sc, WMREG_FCTTV, FCTTV_DFLT);
4905
4906 /* Writes the control register. */
4907 wm_set_vlan(sc);
4908
4909 if (sc->sc_flags & WM_F_HAS_MII) {
4910 int val;
4911
4912 switch (sc->sc_type) {
4913 case WM_T_80003:
4914 case WM_T_ICH8:
4915 case WM_T_ICH9:
4916 case WM_T_ICH10:
4917 case WM_T_PCH:
4918 case WM_T_PCH2:
4919 case WM_T_PCH_LPT:
4920 case WM_T_PCH_SPT:
4921 /*
4922 * Set the mac to wait the maximum time between each
4923 * iteration and increase the max iterations when
4924 * polling the phy; this fixes erroneous timeouts at
4925 * 10Mbps.
4926 */
4927 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_TIMEOUTS,
4928 0xFFFF);
4929 val = wm_kmrn_readreg(sc, KUMCTRLSTA_OFFSET_INB_PARAM);
4930 val |= 0x3F;
4931 wm_kmrn_writereg(sc,
4932 KUMCTRLSTA_OFFSET_INB_PARAM, val);
4933 break;
4934 default:
4935 break;
4936 }
4937
4938 if (sc->sc_type == WM_T_80003) {
4939 val = CSR_READ(sc, WMREG_CTRL_EXT);
4940 val &= ~CTRL_EXT_LINK_MODE_MASK;
4941 CSR_WRITE(sc, WMREG_CTRL_EXT, val);
4942
4943 /* Bypass RX and TX FIFO's */
4944 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_FIFO_CTRL,
4945 KUMCTRLSTA_FIFO_CTRL_RX_BYPASS
4946 | KUMCTRLSTA_FIFO_CTRL_TX_BYPASS);
4947 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_INB_CTRL,
4948 KUMCTRLSTA_INB_CTRL_DIS_PADDING |
4949 KUMCTRLSTA_INB_CTRL_LINK_TMOUT_DFLT);
4950 }
4951 }
4952 #if 0
4953 CSR_WRITE(sc, WMREG_CTRL_EXT, sc->sc_ctrl_ext);
4954 #endif
4955
4956 /* Set up checksum offload parameters. */
4957 reg = CSR_READ(sc, WMREG_RXCSUM);
4958 reg &= ~(RXCSUM_IPOFL | RXCSUM_IPV6OFL | RXCSUM_TUOFL);
4959 if (ifp->if_capenable & IFCAP_CSUM_IPv4_Rx)
4960 reg |= RXCSUM_IPOFL;
4961 if (ifp->if_capenable & (IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_UDPv4_Rx))
4962 reg |= RXCSUM_IPOFL | RXCSUM_TUOFL;
4963 if (ifp->if_capenable & (IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx))
4964 reg |= RXCSUM_IPV6OFL | RXCSUM_TUOFL;
4965 CSR_WRITE(sc, WMREG_RXCSUM, reg);
4966
4967 /* Set up MSI-X */
4968 if (sc->sc_nintrs > 1) {
4969 uint32_t ivar;
4970 struct wm_queue *wmq;
4971 int qid, qintr_idx;
4972
4973 if (sc->sc_type == WM_T_82575) {
4974 /* Interrupt control */
4975 reg = CSR_READ(sc, WMREG_CTRL_EXT);
4976 reg |= CTRL_EXT_PBA | CTRL_EXT_EIAME | CTRL_EXT_NSICR;
4977 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
4978
4979 /* TX and RX */
4980 for (i = 0; i < sc->sc_nqueues; i++) {
4981 wmq = &sc->sc_queue[i];
4982 CSR_WRITE(sc, WMREG_MSIXBM(wmq->wmq_intr_idx),
4983 EITR_TX_QUEUE(wmq->wmq_id)
4984 | EITR_RX_QUEUE(wmq->wmq_id));
4985 }
4986 /* Link status */
4987 CSR_WRITE(sc, WMREG_MSIXBM(sc->sc_link_intr_idx),
4988 EITR_OTHER);
4989 } else if (sc->sc_type == WM_T_82574) {
4990 /* Interrupt control */
4991 reg = CSR_READ(sc, WMREG_CTRL_EXT);
4992 reg |= CTRL_EXT_PBA | CTRL_EXT_EIAME;
4993 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
4994
4995 ivar = 0;
4996 /* TX and RX */
4997 for (i = 0; i < sc->sc_nqueues; i++) {
4998 wmq = &sc->sc_queue[i];
4999 qid = wmq->wmq_id;
5000 qintr_idx = wmq->wmq_intr_idx;
5001
5002 ivar |= __SHIFTIN((IVAR_VALID_82574|qintr_idx),
5003 IVAR_TX_MASK_Q_82574(qid));
5004 ivar |= __SHIFTIN((IVAR_VALID_82574|qintr_idx),
5005 IVAR_RX_MASK_Q_82574(qid));
5006 }
5007 /* Link status */
5008 ivar |= __SHIFTIN((IVAR_VALID_82574
5009 | sc->sc_link_intr_idx), IVAR_OTHER_MASK);
5010 CSR_WRITE(sc, WMREG_IVAR, ivar | IVAR_INT_ON_ALL_WB);
5011 } else {
5012 /* Interrupt control */
5013 CSR_WRITE(sc, WMREG_GPIE, GPIE_NSICR | GPIE_MULTI_MSIX
5014 | GPIE_EIAME | GPIE_PBA);
5015
5016 switch (sc->sc_type) {
5017 case WM_T_82580:
5018 case WM_T_I350:
5019 case WM_T_I354:
5020 case WM_T_I210:
5021 case WM_T_I211:
5022 /* TX and RX */
5023 for (i = 0; i < sc->sc_nqueues; i++) {
5024 wmq = &sc->sc_queue[i];
5025 qid = wmq->wmq_id;
5026 qintr_idx = wmq->wmq_intr_idx;
5027
5028 ivar = CSR_READ(sc, WMREG_IVAR_Q(qid));
5029 ivar &= ~IVAR_TX_MASK_Q(qid);
5030 ivar |= __SHIFTIN((qintr_idx
5031 | IVAR_VALID),
5032 IVAR_TX_MASK_Q(qid));
5033 ivar &= ~IVAR_RX_MASK_Q(qid);
5034 ivar |= __SHIFTIN((qintr_idx
5035 | IVAR_VALID),
5036 IVAR_RX_MASK_Q(qid));
5037 CSR_WRITE(sc, WMREG_IVAR_Q(qid), ivar);
5038 }
5039 break;
5040 case WM_T_82576:
5041 /* TX and RX */
5042 for (i = 0; i < sc->sc_nqueues; i++) {
5043 wmq = &sc->sc_queue[i];
5044 qid = wmq->wmq_id;
5045 qintr_idx = wmq->wmq_intr_idx;
5046
5047 ivar = CSR_READ(sc,
5048 WMREG_IVAR_Q_82576(qid));
5049 ivar &= ~IVAR_TX_MASK_Q_82576(qid);
5050 ivar |= __SHIFTIN((qintr_idx
5051 | IVAR_VALID),
5052 IVAR_TX_MASK_Q_82576(qid));
5053 ivar &= ~IVAR_RX_MASK_Q_82576(qid);
5054 ivar |= __SHIFTIN((qintr_idx
5055 | IVAR_VALID),
5056 IVAR_RX_MASK_Q_82576(qid));
5057 CSR_WRITE(sc, WMREG_IVAR_Q_82576(qid),
5058 ivar);
5059 }
5060 break;
5061 default:
5062 break;
5063 }
5064
5065 /* Link status */
5066 ivar = __SHIFTIN((sc->sc_link_intr_idx | IVAR_VALID),
5067 IVAR_MISC_OTHER);
5068 CSR_WRITE(sc, WMREG_IVAR_MISC, ivar);
5069 }
5070
5071 if (sc->sc_nqueues > 1) {
5072 wm_init_rss(sc);
5073
5074 /*
5075 ** NOTE: Receive Full-Packet Checksum Offload
5076 ** is mutually exclusive with Multiqueue. However
5077 ** this is not the same as TCP/IP checksums which
5078 ** still work.
5079 */
5080 reg = CSR_READ(sc, WMREG_RXCSUM);
5081 reg |= RXCSUM_PCSD;
5082 CSR_WRITE(sc, WMREG_RXCSUM, reg);
5083 }
5084 }
5085
5086 /* Set up the interrupt registers. */
5087 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU);
5088 sc->sc_icr = ICR_TXDW | ICR_LSC | ICR_RXSEQ | ICR_RXDMT0 |
5089 ICR_RXO | ICR_RXT0;
5090 if (sc->sc_nintrs > 1) {
5091 uint32_t mask;
5092 struct wm_queue *wmq;
5093
5094 switch (sc->sc_type) {
5095 case WM_T_82574:
5096 CSR_WRITE(sc, WMREG_EIAC_82574,
5097 WMREG_EIAC_82574_MSIX_MASK);
5098 sc->sc_icr |= WMREG_EIAC_82574_MSIX_MASK;
5099 CSR_WRITE(sc, WMREG_IMS, sc->sc_icr);
5100 break;
5101 default:
5102 if (sc->sc_type == WM_T_82575) {
5103 mask = 0;
5104 for (i = 0; i < sc->sc_nqueues; i++) {
5105 wmq = &sc->sc_queue[i];
5106 mask |= EITR_TX_QUEUE(wmq->wmq_id);
5107 mask |= EITR_RX_QUEUE(wmq->wmq_id);
5108 }
5109 mask |= EITR_OTHER;
5110 } else {
5111 mask = 0;
5112 for (i = 0; i < sc->sc_nqueues; i++) {
5113 wmq = &sc->sc_queue[i];
5114 mask |= 1 << wmq->wmq_intr_idx;
5115 }
5116 mask |= 1 << sc->sc_link_intr_idx;
5117 }
5118 CSR_WRITE(sc, WMREG_EIAC, mask);
5119 CSR_WRITE(sc, WMREG_EIAM, mask);
5120 CSR_WRITE(sc, WMREG_EIMS, mask);
5121 CSR_WRITE(sc, WMREG_IMS, ICR_LSC);
5122 break;
5123 }
5124 } else
5125 CSR_WRITE(sc, WMREG_IMS, sc->sc_icr);
5126
5127 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
5128 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
5129 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)
5130 || (sc->sc_type == WM_T_PCH_SPT)) {
5131 reg = CSR_READ(sc, WMREG_KABGTXD);
5132 reg |= KABGTXD_BGSQLBIAS;
5133 CSR_WRITE(sc, WMREG_KABGTXD, reg);
5134 }
5135
5136 /* Set up the inter-packet gap. */
5137 CSR_WRITE(sc, WMREG_TIPG, sc->sc_tipg);
5138
5139 if (sc->sc_type >= WM_T_82543) {
5140 /*
5141 * XXX 82574 has both ITR and EITR. SET EITR when we use
5142 * the multi queue function with MSI-X.
5143 */
5144 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
5145 int qidx;
5146 for (qidx = 0; qidx < sc->sc_nqueues; qidx++) {
5147 struct wm_queue *wmq = &sc->sc_queue[qidx];
5148 CSR_WRITE(sc, WMREG_EITR(wmq->wmq_intr_idx),
5149 sc->sc_itr);
5150 }
5151 /*
5152 * Link interrupts occur much less than TX
5153 * interrupts and RX interrupts. So, we don't
5154 * tune EINTR(WM_MSIX_LINKINTR_IDX) value like
5155 * FreeBSD's if_igb.
5156 */
5157 } else
5158 CSR_WRITE(sc, WMREG_ITR, sc->sc_itr);
5159 }
5160
5161 /* Set the VLAN ethernetype. */
5162 CSR_WRITE(sc, WMREG_VET, ETHERTYPE_VLAN);
5163
5164 /*
5165 * Set up the transmit control register; we start out with
5166 * a collision distance suitable for FDX, but update it whe
5167 * we resolve the media type.
5168 */
5169 sc->sc_tctl = TCTL_EN | TCTL_PSP | TCTL_RTLC
5170 | TCTL_CT(TX_COLLISION_THRESHOLD)
5171 | TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
5172 if (sc->sc_type >= WM_T_82571)
5173 sc->sc_tctl |= TCTL_MULR;
5174 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
5175
5176 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
5177 /* Write TDT after TCTL.EN is set. See the document. */
5178 CSR_WRITE(sc, WMREG_TDT(0), 0);
5179 }
5180
5181 if (sc->sc_type == WM_T_80003) {
5182 reg = CSR_READ(sc, WMREG_TCTL_EXT);
5183 reg &= ~TCTL_EXT_GCEX_MASK;
5184 reg |= DEFAULT_80003ES2LAN_TCTL_EXT_GCEX;
5185 CSR_WRITE(sc, WMREG_TCTL_EXT, reg);
5186 }
5187
5188 /* Set the media. */
5189 if ((error = mii_ifmedia_change(&sc->sc_mii)) != 0)
5190 goto out;
5191
5192 /* Configure for OS presence */
5193 wm_init_manageability(sc);
5194
5195 /*
5196 * Set up the receive control register; we actually program
5197 * the register when we set the receive filter. Use multicast
5198 * address offset type 0.
5199 *
5200 * Only the i82544 has the ability to strip the incoming
5201 * CRC, so we don't enable that feature.
5202 */
5203 sc->sc_mchash_type = 0;
5204 sc->sc_rctl = RCTL_EN | RCTL_LBM_NONE | RCTL_RDMTS_1_2 | RCTL_DPF
5205 | RCTL_MO(sc->sc_mchash_type);
5206
5207 /*
5208 * 82574 use one buffer extended Rx descriptor.
5209 */
5210 if (sc->sc_type == WM_T_82574)
5211 sc->sc_rctl |= RCTL_DTYP_ONEBUF;
5212
5213 /*
5214 * The I350 has a bug where it always strips the CRC whether
5215 * asked to or not. So ask for stripped CRC here and cope in rxeof
5216 */
5217 if ((sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)
5218 || (sc->sc_type == WM_T_I210))
5219 sc->sc_rctl |= RCTL_SECRC;
5220
5221 if (((sc->sc_ethercom.ec_capabilities & ETHERCAP_JUMBO_MTU) != 0)
5222 && (ifp->if_mtu > ETHERMTU)) {
5223 sc->sc_rctl |= RCTL_LPE;
5224 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
5225 CSR_WRITE(sc, WMREG_RLPML, ETHER_MAX_LEN_JUMBO);
5226 }
5227
5228 if (MCLBYTES == 2048) {
5229 sc->sc_rctl |= RCTL_2k;
5230 } else {
5231 if (sc->sc_type >= WM_T_82543) {
5232 switch (MCLBYTES) {
5233 case 4096:
5234 sc->sc_rctl |= RCTL_BSEX | RCTL_BSEX_4k;
5235 break;
5236 case 8192:
5237 sc->sc_rctl |= RCTL_BSEX | RCTL_BSEX_8k;
5238 break;
5239 case 16384:
5240 sc->sc_rctl |= RCTL_BSEX | RCTL_BSEX_16k;
5241 break;
5242 default:
5243 panic("wm_init: MCLBYTES %d unsupported",
5244 MCLBYTES);
5245 break;
5246 }
5247 } else panic("wm_init: i82542 requires MCLBYTES = 2048");
5248 }
5249
5250 /* Set the receive filter. */
5251 wm_set_filter(sc);
5252
5253 /* Enable ECC */
5254 switch (sc->sc_type) {
5255 case WM_T_82571:
5256 reg = CSR_READ(sc, WMREG_PBA_ECC);
5257 reg |= PBA_ECC_CORR_EN;
5258 CSR_WRITE(sc, WMREG_PBA_ECC, reg);
5259 break;
5260 case WM_T_PCH_LPT:
5261 case WM_T_PCH_SPT:
5262 reg = CSR_READ(sc, WMREG_PBECCSTS);
5263 reg |= PBECCSTS_UNCORR_ECC_ENABLE;
5264 CSR_WRITE(sc, WMREG_PBECCSTS, reg);
5265
5266 sc->sc_ctrl |= CTRL_MEHE;
5267 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
5268 break;
5269 default:
5270 break;
5271 }
5272
5273 /* On 575 and later set RDT only if RX enabled */
5274 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
5275 int qidx;
5276 for (qidx = 0; qidx < sc->sc_nqueues; qidx++) {
5277 struct wm_rxqueue *rxq = &sc->sc_queue[qidx].wmq_rxq;
5278 for (i = 0; i < WM_NRXDESC; i++) {
5279 mutex_enter(rxq->rxq_lock);
5280 wm_init_rxdesc(rxq, i);
5281 mutex_exit(rxq->rxq_lock);
5282
5283 }
5284 }
5285 }
5286
5287 wm_turnon(sc);
5288
5289 /* Start the one second link check clock. */
5290 callout_reset(&sc->sc_tick_ch, hz, wm_tick, sc);
5291
5292 /* ...all done! */
5293 ifp->if_flags |= IFF_RUNNING;
5294 ifp->if_flags &= ~IFF_OACTIVE;
5295
5296 out:
5297 sc->sc_if_flags = ifp->if_flags;
5298 if (error)
5299 log(LOG_ERR, "%s: interface not running\n",
5300 device_xname(sc->sc_dev));
5301 return error;
5302 }
5303
5304 /*
5305 * wm_stop: [ifnet interface function]
5306 *
5307 * Stop transmission on the interface.
5308 */
5309 static void
5310 wm_stop(struct ifnet *ifp, int disable)
5311 {
5312 struct wm_softc *sc = ifp->if_softc;
5313
5314 WM_CORE_LOCK(sc);
5315 wm_stop_locked(ifp, disable);
5316 WM_CORE_UNLOCK(sc);
5317 }
5318
5319 static void
5320 wm_stop_locked(struct ifnet *ifp, int disable)
5321 {
5322 struct wm_softc *sc = ifp->if_softc;
5323 struct wm_txsoft *txs;
5324 int i, qidx;
5325
5326 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
5327 device_xname(sc->sc_dev), __func__));
5328 KASSERT(WM_CORE_LOCKED(sc));
5329
5330 wm_turnoff(sc);
5331
5332 /* Stop the one second clock. */
5333 callout_stop(&sc->sc_tick_ch);
5334
5335 /* Stop the 82547 Tx FIFO stall check timer. */
5336 if (sc->sc_type == WM_T_82547)
5337 callout_stop(&sc->sc_txfifo_ch);
5338
5339 if (sc->sc_flags & WM_F_HAS_MII) {
5340 /* Down the MII. */
5341 mii_down(&sc->sc_mii);
5342 } else {
5343 #if 0
5344 /* Should we clear PHY's status properly? */
5345 wm_reset(sc);
5346 #endif
5347 }
5348
5349 /* Stop the transmit and receive processes. */
5350 CSR_WRITE(sc, WMREG_TCTL, 0);
5351 CSR_WRITE(sc, WMREG_RCTL, 0);
5352 sc->sc_rctl &= ~RCTL_EN;
5353
5354 /*
5355 * Clear the interrupt mask to ensure the device cannot assert its
5356 * interrupt line.
5357 * Clear sc->sc_icr to ensure wm_intr_legacy() makes no attempt to
5358 * service any currently pending or shared interrupt.
5359 */
5360 CSR_WRITE(sc, WMREG_IMC, 0xffffffffU);
5361 sc->sc_icr = 0;
5362 if (sc->sc_nintrs > 1) {
5363 if (sc->sc_type != WM_T_82574) {
5364 CSR_WRITE(sc, WMREG_EIMC, 0xffffffffU);
5365 CSR_WRITE(sc, WMREG_EIAC, 0);
5366 } else
5367 CSR_WRITE(sc, WMREG_EIAC_82574, 0);
5368 }
5369
5370 /* Release any queued transmit buffers. */
5371 for (qidx = 0; qidx < sc->sc_nqueues; qidx++) {
5372 struct wm_queue *wmq = &sc->sc_queue[qidx];
5373 struct wm_txqueue *txq = &wmq->wmq_txq;
5374 mutex_enter(txq->txq_lock);
5375 for (i = 0; i < WM_TXQUEUELEN(txq); i++) {
5376 txs = &txq->txq_soft[i];
5377 if (txs->txs_mbuf != NULL) {
5378 bus_dmamap_unload(sc->sc_dmat,txs->txs_dmamap);
5379 m_freem(txs->txs_mbuf);
5380 txs->txs_mbuf = NULL;
5381 }
5382 }
5383 mutex_exit(txq->txq_lock);
5384 }
5385
5386 /* Mark the interface as down and cancel the watchdog timer. */
5387 ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
5388 ifp->if_timer = 0;
5389
5390 if (disable) {
5391 for (i = 0; i < sc->sc_nqueues; i++) {
5392 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
5393 mutex_enter(rxq->rxq_lock);
5394 wm_rxdrain(rxq);
5395 mutex_exit(rxq->rxq_lock);
5396 }
5397 }
5398
5399 #if 0 /* notyet */
5400 if (sc->sc_type >= WM_T_82544)
5401 CSR_WRITE(sc, WMREG_WUC, 0);
5402 #endif
5403 }
5404
5405 static void
5406 wm_dump_mbuf_chain(struct wm_softc *sc, struct mbuf *m0)
5407 {
5408 struct mbuf *m;
5409 int i;
5410
5411 log(LOG_DEBUG, "%s: mbuf chain:\n", device_xname(sc->sc_dev));
5412 for (m = m0, i = 0; m != NULL; m = m->m_next, i++)
5413 log(LOG_DEBUG, "%s:\tm_data = %p, m_len = %d, "
5414 "m_flags = 0x%08x\n", device_xname(sc->sc_dev),
5415 m->m_data, m->m_len, m->m_flags);
5416 log(LOG_DEBUG, "%s:\t%d mbuf%s in chain\n", device_xname(sc->sc_dev),
5417 i, i == 1 ? "" : "s");
5418 }
5419
5420 /*
5421 * wm_82547_txfifo_stall:
5422 *
5423 * Callout used to wait for the 82547 Tx FIFO to drain,
5424 * reset the FIFO pointers, and restart packet transmission.
5425 */
5426 static void
5427 wm_82547_txfifo_stall(void *arg)
5428 {
5429 struct wm_softc *sc = arg;
5430 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
5431
5432 mutex_enter(txq->txq_lock);
5433
5434 if (txq->txq_stopping)
5435 goto out;
5436
5437 if (txq->txq_fifo_stall) {
5438 if (CSR_READ(sc, WMREG_TDT(0)) == CSR_READ(sc, WMREG_TDH(0)) &&
5439 CSR_READ(sc, WMREG_TDFT) == CSR_READ(sc, WMREG_TDFH) &&
5440 CSR_READ(sc, WMREG_TDFTS) == CSR_READ(sc, WMREG_TDFHS)) {
5441 /*
5442 * Packets have drained. Stop transmitter, reset
5443 * FIFO pointers, restart transmitter, and kick
5444 * the packet queue.
5445 */
5446 uint32_t tctl = CSR_READ(sc, WMREG_TCTL);
5447 CSR_WRITE(sc, WMREG_TCTL, tctl & ~TCTL_EN);
5448 CSR_WRITE(sc, WMREG_TDFT, txq->txq_fifo_addr);
5449 CSR_WRITE(sc, WMREG_TDFH, txq->txq_fifo_addr);
5450 CSR_WRITE(sc, WMREG_TDFTS, txq->txq_fifo_addr);
5451 CSR_WRITE(sc, WMREG_TDFHS, txq->txq_fifo_addr);
5452 CSR_WRITE(sc, WMREG_TCTL, tctl);
5453 CSR_WRITE_FLUSH(sc);
5454
5455 txq->txq_fifo_head = 0;
5456 txq->txq_fifo_stall = 0;
5457 wm_start_locked(&sc->sc_ethercom.ec_if);
5458 } else {
5459 /*
5460 * Still waiting for packets to drain; try again in
5461 * another tick.
5462 */
5463 callout_schedule(&sc->sc_txfifo_ch, 1);
5464 }
5465 }
5466
5467 out:
5468 mutex_exit(txq->txq_lock);
5469 }
5470
5471 /*
5472 * wm_82547_txfifo_bugchk:
5473 *
5474 * Check for bug condition in the 82547 Tx FIFO. We need to
5475 * prevent enqueueing a packet that would wrap around the end
5476 * if the Tx FIFO ring buffer, otherwise the chip will croak.
5477 *
5478 * We do this by checking the amount of space before the end
5479 * of the Tx FIFO buffer. If the packet will not fit, we "stall"
5480 * the Tx FIFO, wait for all remaining packets to drain, reset
5481 * the internal FIFO pointers to the beginning, and restart
5482 * transmission on the interface.
5483 */
5484 #define WM_FIFO_HDR 0x10
5485 #define WM_82547_PAD_LEN 0x3e0
5486 static int
5487 wm_82547_txfifo_bugchk(struct wm_softc *sc, struct mbuf *m0)
5488 {
5489 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
5490 int space = txq->txq_fifo_size - txq->txq_fifo_head;
5491 int len = roundup(m0->m_pkthdr.len + WM_FIFO_HDR, WM_FIFO_HDR);
5492
5493 /* Just return if already stalled. */
5494 if (txq->txq_fifo_stall)
5495 return 1;
5496
5497 if (sc->sc_mii.mii_media_active & IFM_FDX) {
5498 /* Stall only occurs in half-duplex mode. */
5499 goto send_packet;
5500 }
5501
5502 if (len >= WM_82547_PAD_LEN + space) {
5503 txq->txq_fifo_stall = 1;
5504 callout_schedule(&sc->sc_txfifo_ch, 1);
5505 return 1;
5506 }
5507
5508 send_packet:
5509 txq->txq_fifo_head += len;
5510 if (txq->txq_fifo_head >= txq->txq_fifo_size)
5511 txq->txq_fifo_head -= txq->txq_fifo_size;
5512
5513 return 0;
5514 }
5515
5516 static int
5517 wm_alloc_tx_descs(struct wm_softc *sc, struct wm_txqueue *txq)
5518 {
5519 int error;
5520
5521 /*
5522 * Allocate the control data structures, and create and load the
5523 * DMA map for it.
5524 *
5525 * NOTE: All Tx descriptors must be in the same 4G segment of
5526 * memory. So must Rx descriptors. We simplify by allocating
5527 * both sets within the same 4G segment.
5528 */
5529 if (sc->sc_type < WM_T_82544)
5530 WM_NTXDESC(txq) = WM_NTXDESC_82542;
5531 else
5532 WM_NTXDESC(txq) = WM_NTXDESC_82544;
5533 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
5534 txq->txq_descsize = sizeof(nq_txdesc_t);
5535 else
5536 txq->txq_descsize = sizeof(wiseman_txdesc_t);
5537
5538 if ((error = bus_dmamem_alloc(sc->sc_dmat, WM_TXDESCS_SIZE(txq),
5539 PAGE_SIZE, (bus_size_t) 0x100000000ULL, &txq->txq_desc_seg,
5540 1, &txq->txq_desc_rseg, 0)) != 0) {
5541 aprint_error_dev(sc->sc_dev,
5542 "unable to allocate TX control data, error = %d\n",
5543 error);
5544 goto fail_0;
5545 }
5546
5547 if ((error = bus_dmamem_map(sc->sc_dmat, &txq->txq_desc_seg,
5548 txq->txq_desc_rseg, WM_TXDESCS_SIZE(txq),
5549 (void **)&txq->txq_descs_u, BUS_DMA_COHERENT)) != 0) {
5550 aprint_error_dev(sc->sc_dev,
5551 "unable to map TX control data, error = %d\n", error);
5552 goto fail_1;
5553 }
5554
5555 if ((error = bus_dmamap_create(sc->sc_dmat, WM_TXDESCS_SIZE(txq), 1,
5556 WM_TXDESCS_SIZE(txq), 0, 0, &txq->txq_desc_dmamap)) != 0) {
5557 aprint_error_dev(sc->sc_dev,
5558 "unable to create TX control data DMA map, error = %d\n",
5559 error);
5560 goto fail_2;
5561 }
5562
5563 if ((error = bus_dmamap_load(sc->sc_dmat, txq->txq_desc_dmamap,
5564 txq->txq_descs_u, WM_TXDESCS_SIZE(txq), NULL, 0)) != 0) {
5565 aprint_error_dev(sc->sc_dev,
5566 "unable to load TX control data DMA map, error = %d\n",
5567 error);
5568 goto fail_3;
5569 }
5570
5571 return 0;
5572
5573 fail_3:
5574 bus_dmamap_destroy(sc->sc_dmat, txq->txq_desc_dmamap);
5575 fail_2:
5576 bus_dmamem_unmap(sc->sc_dmat, (void *)txq->txq_descs_u,
5577 WM_TXDESCS_SIZE(txq));
5578 fail_1:
5579 bus_dmamem_free(sc->sc_dmat, &txq->txq_desc_seg, txq->txq_desc_rseg);
5580 fail_0:
5581 return error;
5582 }
5583
5584 static void
5585 wm_free_tx_descs(struct wm_softc *sc, struct wm_txqueue *txq)
5586 {
5587
5588 bus_dmamap_unload(sc->sc_dmat, txq->txq_desc_dmamap);
5589 bus_dmamap_destroy(sc->sc_dmat, txq->txq_desc_dmamap);
5590 bus_dmamem_unmap(sc->sc_dmat, (void *)txq->txq_descs_u,
5591 WM_TXDESCS_SIZE(txq));
5592 bus_dmamem_free(sc->sc_dmat, &txq->txq_desc_seg, txq->txq_desc_rseg);
5593 }
5594
5595 static int
5596 wm_alloc_rx_descs(struct wm_softc *sc, struct wm_rxqueue *rxq)
5597 {
5598 int error;
5599 size_t rxq_descs_size;
5600
5601 /*
5602 * Allocate the control data structures, and create and load the
5603 * DMA map for it.
5604 *
5605 * NOTE: All Tx descriptors must be in the same 4G segment of
5606 * memory. So must Rx descriptors. We simplify by allocating
5607 * both sets within the same 4G segment.
5608 */
5609 rxq->rxq_ndesc = WM_NRXDESC;
5610 if (sc->sc_type == WM_T_82574)
5611 rxq->rxq_descsize = sizeof(ext_rxdesc_t);
5612 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
5613 rxq->rxq_descsize = sizeof(nq_rxdesc_t);
5614 else
5615 rxq->rxq_descsize = sizeof(wiseman_rxdesc_t);
5616 rxq_descs_size = rxq->rxq_descsize * rxq->rxq_ndesc;
5617
5618 if ((error = bus_dmamem_alloc(sc->sc_dmat, rxq_descs_size,
5619 PAGE_SIZE, (bus_size_t) 0x100000000ULL, &rxq->rxq_desc_seg,
5620 1, &rxq->rxq_desc_rseg, 0)) != 0) {
5621 aprint_error_dev(sc->sc_dev,
5622 "unable to allocate RX control data, error = %d\n",
5623 error);
5624 goto fail_0;
5625 }
5626
5627 if ((error = bus_dmamem_map(sc->sc_dmat, &rxq->rxq_desc_seg,
5628 rxq->rxq_desc_rseg, rxq_descs_size,
5629 (void **)&rxq->rxq_descs_u, BUS_DMA_COHERENT)) != 0) {
5630 aprint_error_dev(sc->sc_dev,
5631 "unable to map RX control data, error = %d\n", error);
5632 goto fail_1;
5633 }
5634
5635 if ((error = bus_dmamap_create(sc->sc_dmat, rxq_descs_size, 1,
5636 rxq_descs_size, 0, 0, &rxq->rxq_desc_dmamap)) != 0) {
5637 aprint_error_dev(sc->sc_dev,
5638 "unable to create RX control data DMA map, error = %d\n",
5639 error);
5640 goto fail_2;
5641 }
5642
5643 if ((error = bus_dmamap_load(sc->sc_dmat, rxq->rxq_desc_dmamap,
5644 rxq->rxq_descs_u, rxq_descs_size, NULL, 0)) != 0) {
5645 aprint_error_dev(sc->sc_dev,
5646 "unable to load RX control data DMA map, error = %d\n",
5647 error);
5648 goto fail_3;
5649 }
5650
5651 return 0;
5652
5653 fail_3:
5654 bus_dmamap_destroy(sc->sc_dmat, rxq->rxq_desc_dmamap);
5655 fail_2:
5656 bus_dmamem_unmap(sc->sc_dmat, (void *)rxq->rxq_descs_u,
5657 rxq_descs_size);
5658 fail_1:
5659 bus_dmamem_free(sc->sc_dmat, &rxq->rxq_desc_seg, rxq->rxq_desc_rseg);
5660 fail_0:
5661 return error;
5662 }
5663
5664 static void
5665 wm_free_rx_descs(struct wm_softc *sc, struct wm_rxqueue *rxq)
5666 {
5667
5668 bus_dmamap_unload(sc->sc_dmat, rxq->rxq_desc_dmamap);
5669 bus_dmamap_destroy(sc->sc_dmat, rxq->rxq_desc_dmamap);
5670 bus_dmamem_unmap(sc->sc_dmat, (void *)rxq->rxq_descs_u,
5671 rxq->rxq_descsize * rxq->rxq_ndesc);
5672 bus_dmamem_free(sc->sc_dmat, &rxq->rxq_desc_seg, rxq->rxq_desc_rseg);
5673 }
5674
5675
5676 static int
5677 wm_alloc_tx_buffer(struct wm_softc *sc, struct wm_txqueue *txq)
5678 {
5679 int i, error;
5680
5681 /* Create the transmit buffer DMA maps. */
5682 WM_TXQUEUELEN(txq) =
5683 (sc->sc_type == WM_T_82547 || sc->sc_type == WM_T_82547_2) ?
5684 WM_TXQUEUELEN_MAX_82547 : WM_TXQUEUELEN_MAX;
5685 for (i = 0; i < WM_TXQUEUELEN(txq); i++) {
5686 if ((error = bus_dmamap_create(sc->sc_dmat, WM_MAXTXDMA,
5687 WM_NTXSEGS, WTX_MAX_LEN, 0, 0,
5688 &txq->txq_soft[i].txs_dmamap)) != 0) {
5689 aprint_error_dev(sc->sc_dev,
5690 "unable to create Tx DMA map %d, error = %d\n",
5691 i, error);
5692 goto fail;
5693 }
5694 }
5695
5696 return 0;
5697
5698 fail:
5699 for (i = 0; i < WM_TXQUEUELEN(txq); i++) {
5700 if (txq->txq_soft[i].txs_dmamap != NULL)
5701 bus_dmamap_destroy(sc->sc_dmat,
5702 txq->txq_soft[i].txs_dmamap);
5703 }
5704 return error;
5705 }
5706
5707 static void
5708 wm_free_tx_buffer(struct wm_softc *sc, struct wm_txqueue *txq)
5709 {
5710 int i;
5711
5712 for (i = 0; i < WM_TXQUEUELEN(txq); i++) {
5713 if (txq->txq_soft[i].txs_dmamap != NULL)
5714 bus_dmamap_destroy(sc->sc_dmat,
5715 txq->txq_soft[i].txs_dmamap);
5716 }
5717 }
5718
5719 static int
5720 wm_alloc_rx_buffer(struct wm_softc *sc, struct wm_rxqueue *rxq)
5721 {
5722 int i, error;
5723
5724 /* Create the receive buffer DMA maps. */
5725 for (i = 0; i < rxq->rxq_ndesc; i++) {
5726 if ((error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1,
5727 MCLBYTES, 0, 0,
5728 &rxq->rxq_soft[i].rxs_dmamap)) != 0) {
5729 aprint_error_dev(sc->sc_dev,
5730 "unable to create Rx DMA map %d error = %d\n",
5731 i, error);
5732 goto fail;
5733 }
5734 rxq->rxq_soft[i].rxs_mbuf = NULL;
5735 }
5736
5737 return 0;
5738
5739 fail:
5740 for (i = 0; i < rxq->rxq_ndesc; i++) {
5741 if (rxq->rxq_soft[i].rxs_dmamap != NULL)
5742 bus_dmamap_destroy(sc->sc_dmat,
5743 rxq->rxq_soft[i].rxs_dmamap);
5744 }
5745 return error;
5746 }
5747
5748 static void
5749 wm_free_rx_buffer(struct wm_softc *sc, struct wm_rxqueue *rxq)
5750 {
5751 int i;
5752
5753 for (i = 0; i < rxq->rxq_ndesc; i++) {
5754 if (rxq->rxq_soft[i].rxs_dmamap != NULL)
5755 bus_dmamap_destroy(sc->sc_dmat,
5756 rxq->rxq_soft[i].rxs_dmamap);
5757 }
5758 }
5759
5760 /*
5761 * wm_alloc_quques:
5762 * Allocate {tx,rx}descs and {tx,rx} buffers
5763 */
5764 static int
5765 wm_alloc_txrx_queues(struct wm_softc *sc)
5766 {
5767 int i, error, tx_done, rx_done;
5768
5769 sc->sc_queue = kmem_zalloc(sizeof(struct wm_queue) * sc->sc_nqueues,
5770 KM_SLEEP);
5771 if (sc->sc_queue == NULL) {
5772 aprint_error_dev(sc->sc_dev,"unable to allocate wm_queue\n");
5773 error = ENOMEM;
5774 goto fail_0;
5775 }
5776
5777 /*
5778 * For transmission
5779 */
5780 error = 0;
5781 tx_done = 0;
5782 for (i = 0; i < sc->sc_nqueues; i++) {
5783 #ifdef WM_EVENT_COUNTERS
5784 int j;
5785 const char *xname;
5786 #endif
5787 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
5788 txq->txq_sc = sc;
5789 txq->txq_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
5790
5791 error = wm_alloc_tx_descs(sc, txq);
5792 if (error)
5793 break;
5794 error = wm_alloc_tx_buffer(sc, txq);
5795 if (error) {
5796 wm_free_tx_descs(sc, txq);
5797 break;
5798 }
5799 txq->txq_interq = pcq_create(WM_TXINTERQSIZE, KM_SLEEP);
5800 if (txq->txq_interq == NULL) {
5801 wm_free_tx_descs(sc, txq);
5802 wm_free_tx_buffer(sc, txq);
5803 error = ENOMEM;
5804 break;
5805 }
5806
5807 #ifdef WM_EVENT_COUNTERS
5808 xname = device_xname(sc->sc_dev);
5809
5810 WM_Q_MISC_EVCNT_ATTACH(txq, txsstall, txq, i, xname);
5811 WM_Q_MISC_EVCNT_ATTACH(txq, txdstall, txq, i, xname);
5812 WM_Q_MISC_EVCNT_ATTACH(txq, txfifo_stall, txq, i, xname);
5813 WM_Q_INTR_EVCNT_ATTACH(txq, txdw, txq, i, xname);
5814 WM_Q_INTR_EVCNT_ATTACH(txq, txqe, txq, i, xname);
5815
5816 WM_Q_MISC_EVCNT_ATTACH(txq, txipsum, txq, i, xname);
5817 WM_Q_MISC_EVCNT_ATTACH(txq, txtusum, txq, i, xname);
5818 WM_Q_MISC_EVCNT_ATTACH(txq, txtusum6, txq, i, xname);
5819 WM_Q_MISC_EVCNT_ATTACH(txq, txtso, txq, i, xname);
5820 WM_Q_MISC_EVCNT_ATTACH(txq, txtso6, txq, i, xname);
5821 WM_Q_MISC_EVCNT_ATTACH(txq, txtsopain, txq, i, xname);
5822
5823 for (j = 0; j < WM_NTXSEGS; j++) {
5824 snprintf(txq->txq_txseg_evcnt_names[j],
5825 sizeof(txq->txq_txseg_evcnt_names[j]), "txq%02dtxseg%d", i, j);
5826 evcnt_attach_dynamic(&txq->txq_ev_txseg[j], EVCNT_TYPE_MISC,
5827 NULL, xname, txq->txq_txseg_evcnt_names[j]);
5828 }
5829
5830 WM_Q_MISC_EVCNT_ATTACH(txq, txdrop, txq, i, xname);
5831
5832 WM_Q_MISC_EVCNT_ATTACH(txq, tu, txq, i, xname);
5833 #endif /* WM_EVENT_COUNTERS */
5834
5835 tx_done++;
5836 }
5837 if (error)
5838 goto fail_1;
5839
5840 /*
5841 * For recieve
5842 */
5843 error = 0;
5844 rx_done = 0;
5845 for (i = 0; i < sc->sc_nqueues; i++) {
5846 #ifdef WM_EVENT_COUNTERS
5847 const char *xname;
5848 #endif
5849 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
5850 rxq->rxq_sc = sc;
5851 rxq->rxq_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NET);
5852
5853 error = wm_alloc_rx_descs(sc, rxq);
5854 if (error)
5855 break;
5856
5857 error = wm_alloc_rx_buffer(sc, rxq);
5858 if (error) {
5859 wm_free_rx_descs(sc, rxq);
5860 break;
5861 }
5862
5863 #ifdef WM_EVENT_COUNTERS
5864 xname = device_xname(sc->sc_dev);
5865
5866 WM_Q_INTR_EVCNT_ATTACH(rxq, rxintr, rxq, i, xname);
5867
5868 WM_Q_INTR_EVCNT_ATTACH(rxq, rxipsum, rxq, i, xname);
5869 WM_Q_INTR_EVCNT_ATTACH(rxq, rxtusum, rxq, i, xname);
5870 #endif /* WM_EVENT_COUNTERS */
5871
5872 rx_done++;
5873 }
5874 if (error)
5875 goto fail_2;
5876
5877 return 0;
5878
5879 fail_2:
5880 for (i = 0; i < rx_done; i++) {
5881 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
5882 wm_free_rx_buffer(sc, rxq);
5883 wm_free_rx_descs(sc, rxq);
5884 if (rxq->rxq_lock)
5885 mutex_obj_free(rxq->rxq_lock);
5886 }
5887 fail_1:
5888 for (i = 0; i < tx_done; i++) {
5889 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
5890 pcq_destroy(txq->txq_interq);
5891 wm_free_tx_buffer(sc, txq);
5892 wm_free_tx_descs(sc, txq);
5893 if (txq->txq_lock)
5894 mutex_obj_free(txq->txq_lock);
5895 }
5896
5897 kmem_free(sc->sc_queue,
5898 sizeof(struct wm_queue) * sc->sc_nqueues);
5899 fail_0:
5900 return error;
5901 }
5902
5903 /*
5904 * wm_free_quques:
5905 * Free {tx,rx}descs and {tx,rx} buffers
5906 */
5907 static void
5908 wm_free_txrx_queues(struct wm_softc *sc)
5909 {
5910 int i;
5911
5912 for (i = 0; i < sc->sc_nqueues; i++) {
5913 struct wm_rxqueue *rxq = &sc->sc_queue[i].wmq_rxq;
5914 wm_free_rx_buffer(sc, rxq);
5915 wm_free_rx_descs(sc, rxq);
5916 if (rxq->rxq_lock)
5917 mutex_obj_free(rxq->rxq_lock);
5918 }
5919
5920 for (i = 0; i < sc->sc_nqueues; i++) {
5921 struct wm_txqueue *txq = &sc->sc_queue[i].wmq_txq;
5922 struct mbuf *m;
5923
5924 /* drain txq_interq */
5925 while ((m = pcq_get(txq->txq_interq)) != NULL)
5926 m_freem(m);
5927 pcq_destroy(txq->txq_interq);
5928
5929 wm_free_tx_buffer(sc, txq);
5930 wm_free_tx_descs(sc, txq);
5931 if (txq->txq_lock)
5932 mutex_obj_free(txq->txq_lock);
5933 }
5934
5935 kmem_free(sc->sc_queue, sizeof(struct wm_queue) * sc->sc_nqueues);
5936 }
5937
5938 static void
5939 wm_init_tx_descs(struct wm_softc *sc __unused, struct wm_txqueue *txq)
5940 {
5941
5942 KASSERT(mutex_owned(txq->txq_lock));
5943
5944 /* Initialize the transmit descriptor ring. */
5945 memset(txq->txq_descs, 0, WM_TXDESCS_SIZE(txq));
5946 wm_cdtxsync(txq, 0, WM_NTXDESC(txq),
5947 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
5948 txq->txq_free = WM_NTXDESC(txq);
5949 txq->txq_next = 0;
5950 }
5951
5952 static void
5953 wm_init_tx_regs(struct wm_softc *sc, struct wm_queue *wmq,
5954 struct wm_txqueue *txq)
5955 {
5956
5957 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
5958 device_xname(sc->sc_dev), __func__));
5959 KASSERT(mutex_owned(txq->txq_lock));
5960
5961 if (sc->sc_type < WM_T_82543) {
5962 CSR_WRITE(sc, WMREG_OLD_TDBAH, WM_CDTXADDR_HI(txq, 0));
5963 CSR_WRITE(sc, WMREG_OLD_TDBAL, WM_CDTXADDR_LO(txq, 0));
5964 CSR_WRITE(sc, WMREG_OLD_TDLEN, WM_TXDESCS_SIZE(txq));
5965 CSR_WRITE(sc, WMREG_OLD_TDH, 0);
5966 CSR_WRITE(sc, WMREG_OLD_TDT, 0);
5967 CSR_WRITE(sc, WMREG_OLD_TIDV, 128);
5968 } else {
5969 int qid = wmq->wmq_id;
5970
5971 CSR_WRITE(sc, WMREG_TDBAH(qid), WM_CDTXADDR_HI(txq, 0));
5972 CSR_WRITE(sc, WMREG_TDBAL(qid), WM_CDTXADDR_LO(txq, 0));
5973 CSR_WRITE(sc, WMREG_TDLEN(qid), WM_TXDESCS_SIZE(txq));
5974 CSR_WRITE(sc, WMREG_TDH(qid), 0);
5975
5976 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
5977 /*
5978 * Don't write TDT before TCTL.EN is set.
5979 * See the document.
5980 */
5981 CSR_WRITE(sc, WMREG_TXDCTL(qid), TXDCTL_QUEUE_ENABLE
5982 | TXDCTL_PTHRESH(0) | TXDCTL_HTHRESH(0)
5983 | TXDCTL_WTHRESH(0));
5984 else {
5985 /* ITR / 4 */
5986 CSR_WRITE(sc, WMREG_TIDV, sc->sc_itr / 4);
5987 if (sc->sc_type >= WM_T_82540) {
5988 /* should be same */
5989 CSR_WRITE(sc, WMREG_TADV, sc->sc_itr / 4);
5990 }
5991
5992 CSR_WRITE(sc, WMREG_TDT(qid), 0);
5993 CSR_WRITE(sc, WMREG_TXDCTL(qid), TXDCTL_PTHRESH(0) |
5994 TXDCTL_HTHRESH(0) | TXDCTL_WTHRESH(0));
5995 }
5996 }
5997 }
5998
5999 static void
6000 wm_init_tx_buffer(struct wm_softc *sc __unused, struct wm_txqueue *txq)
6001 {
6002 int i;
6003
6004 KASSERT(mutex_owned(txq->txq_lock));
6005
6006 /* Initialize the transmit job descriptors. */
6007 for (i = 0; i < WM_TXQUEUELEN(txq); i++)
6008 txq->txq_soft[i].txs_mbuf = NULL;
6009 txq->txq_sfree = WM_TXQUEUELEN(txq);
6010 txq->txq_snext = 0;
6011 txq->txq_sdirty = 0;
6012 }
6013
6014 static void
6015 wm_init_tx_queue(struct wm_softc *sc, struct wm_queue *wmq,
6016 struct wm_txqueue *txq)
6017 {
6018
6019 KASSERT(mutex_owned(txq->txq_lock));
6020
6021 /*
6022 * Set up some register offsets that are different between
6023 * the i82542 and the i82543 and later chips.
6024 */
6025 if (sc->sc_type < WM_T_82543)
6026 txq->txq_tdt_reg = WMREG_OLD_TDT;
6027 else
6028 txq->txq_tdt_reg = WMREG_TDT(wmq->wmq_id);
6029
6030 wm_init_tx_descs(sc, txq);
6031 wm_init_tx_regs(sc, wmq, txq);
6032 wm_init_tx_buffer(sc, txq);
6033 }
6034
6035 static void
6036 wm_init_rx_regs(struct wm_softc *sc, struct wm_queue *wmq,
6037 struct wm_rxqueue *rxq)
6038 {
6039
6040 KASSERT(mutex_owned(rxq->rxq_lock));
6041
6042 /*
6043 * Initialize the receive descriptor and receive job
6044 * descriptor rings.
6045 */
6046 if (sc->sc_type < WM_T_82543) {
6047 CSR_WRITE(sc, WMREG_OLD_RDBAH0, WM_CDRXADDR_HI(rxq, 0));
6048 CSR_WRITE(sc, WMREG_OLD_RDBAL0, WM_CDRXADDR_LO(rxq, 0));
6049 CSR_WRITE(sc, WMREG_OLD_RDLEN0,
6050 rxq->rxq_descsize * rxq->rxq_ndesc);
6051 CSR_WRITE(sc, WMREG_OLD_RDH0, 0);
6052 CSR_WRITE(sc, WMREG_OLD_RDT0, 0);
6053 CSR_WRITE(sc, WMREG_OLD_RDTR0, 28 | RDTR_FPD);
6054
6055 CSR_WRITE(sc, WMREG_OLD_RDBA1_HI, 0);
6056 CSR_WRITE(sc, WMREG_OLD_RDBA1_LO, 0);
6057 CSR_WRITE(sc, WMREG_OLD_RDLEN1, 0);
6058 CSR_WRITE(sc, WMREG_OLD_RDH1, 0);
6059 CSR_WRITE(sc, WMREG_OLD_RDT1, 0);
6060 CSR_WRITE(sc, WMREG_OLD_RDTR1, 0);
6061 } else {
6062 int qid = wmq->wmq_id;
6063
6064 CSR_WRITE(sc, WMREG_RDBAH(qid), WM_CDRXADDR_HI(rxq, 0));
6065 CSR_WRITE(sc, WMREG_RDBAL(qid), WM_CDRXADDR_LO(rxq, 0));
6066 CSR_WRITE(sc, WMREG_RDLEN(qid), rxq->rxq_descsize * rxq->rxq_ndesc);
6067
6068 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
6069 if (MCLBYTES & ((1 << SRRCTL_BSIZEPKT_SHIFT) - 1))
6070 panic("%s: MCLBYTES %d unsupported for i2575 or higher\n", __func__, MCLBYTES);
6071
6072 /* Currently, support SRRCTL_DESCTYPE_ADV_ONEBUF only. */
6073 CSR_WRITE(sc, WMREG_SRRCTL(qid), SRRCTL_DESCTYPE_ADV_ONEBUF
6074 | (MCLBYTES >> SRRCTL_BSIZEPKT_SHIFT));
6075 CSR_WRITE(sc, WMREG_RXDCTL(qid), RXDCTL_QUEUE_ENABLE
6076 | RXDCTL_PTHRESH(16) | RXDCTL_HTHRESH(8)
6077 | RXDCTL_WTHRESH(1));
6078 CSR_WRITE(sc, WMREG_RDH(qid), 0);
6079 CSR_WRITE(sc, WMREG_RDT(qid), 0);
6080 } else {
6081 CSR_WRITE(sc, WMREG_RDH(qid), 0);
6082 CSR_WRITE(sc, WMREG_RDT(qid), 0);
6083 /* ITR / 4 */
6084 CSR_WRITE(sc, WMREG_RDTR, (sc->sc_itr / 4) | RDTR_FPD);
6085 /* MUST be same */
6086 CSR_WRITE(sc, WMREG_RADV, sc->sc_itr / 4);
6087 CSR_WRITE(sc, WMREG_RXDCTL(qid), RXDCTL_PTHRESH(0) |
6088 RXDCTL_HTHRESH(0) | RXDCTL_WTHRESH(1));
6089 }
6090 }
6091 }
6092
6093 static int
6094 wm_init_rx_buffer(struct wm_softc *sc, struct wm_rxqueue *rxq)
6095 {
6096 struct wm_rxsoft *rxs;
6097 int error, i;
6098
6099 KASSERT(mutex_owned(rxq->rxq_lock));
6100
6101 for (i = 0; i < rxq->rxq_ndesc; i++) {
6102 rxs = &rxq->rxq_soft[i];
6103 if (rxs->rxs_mbuf == NULL) {
6104 if ((error = wm_add_rxbuf(rxq, i)) != 0) {
6105 log(LOG_ERR, "%s: unable to allocate or map "
6106 "rx buffer %d, error = %d\n",
6107 device_xname(sc->sc_dev), i, error);
6108 /*
6109 * XXX Should attempt to run with fewer receive
6110 * XXX buffers instead of just failing.
6111 */
6112 wm_rxdrain(rxq);
6113 return ENOMEM;
6114 }
6115 } else {
6116 if ((sc->sc_flags & WM_F_NEWQUEUE) == 0)
6117 wm_init_rxdesc(rxq, i);
6118 /*
6119 * For 82575 and newer device, the RX descriptors
6120 * must be initialized after the setting of RCTL.EN in
6121 * wm_set_filter()
6122 */
6123 }
6124 }
6125 rxq->rxq_ptr = 0;
6126 rxq->rxq_discard = 0;
6127 WM_RXCHAIN_RESET(rxq);
6128
6129 return 0;
6130 }
6131
6132 static int
6133 wm_init_rx_queue(struct wm_softc *sc, struct wm_queue *wmq,
6134 struct wm_rxqueue *rxq)
6135 {
6136
6137 KASSERT(mutex_owned(rxq->rxq_lock));
6138
6139 /*
6140 * Set up some register offsets that are different between
6141 * the i82542 and the i82543 and later chips.
6142 */
6143 if (sc->sc_type < WM_T_82543)
6144 rxq->rxq_rdt_reg = WMREG_OLD_RDT0;
6145 else
6146 rxq->rxq_rdt_reg = WMREG_RDT(wmq->wmq_id);
6147
6148 wm_init_rx_regs(sc, wmq, rxq);
6149 return wm_init_rx_buffer(sc, rxq);
6150 }
6151
6152 /*
6153 * wm_init_quques:
6154 * Initialize {tx,rx}descs and {tx,rx} buffers
6155 */
6156 static int
6157 wm_init_txrx_queues(struct wm_softc *sc)
6158 {
6159 int i, error = 0;
6160
6161 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
6162 device_xname(sc->sc_dev), __func__));
6163
6164 for (i = 0; i < sc->sc_nqueues; i++) {
6165 struct wm_queue *wmq = &sc->sc_queue[i];
6166 struct wm_txqueue *txq = &wmq->wmq_txq;
6167 struct wm_rxqueue *rxq = &wmq->wmq_rxq;
6168
6169 mutex_enter(txq->txq_lock);
6170 wm_init_tx_queue(sc, wmq, txq);
6171 mutex_exit(txq->txq_lock);
6172
6173 mutex_enter(rxq->rxq_lock);
6174 error = wm_init_rx_queue(sc, wmq, rxq);
6175 mutex_exit(rxq->rxq_lock);
6176 if (error)
6177 break;
6178 }
6179
6180 return error;
6181 }
6182
6183 /*
6184 * wm_tx_offload:
6185 *
6186 * Set up TCP/IP checksumming parameters for the
6187 * specified packet.
6188 */
6189 static int
6190 wm_tx_offload(struct wm_softc *sc, struct wm_txsoft *txs, uint32_t *cmdp,
6191 uint8_t *fieldsp)
6192 {
6193 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
6194 struct mbuf *m0 = txs->txs_mbuf;
6195 struct livengood_tcpip_ctxdesc *t;
6196 uint32_t ipcs, tucs, cmd, cmdlen, seg;
6197 uint32_t ipcse;
6198 struct ether_header *eh;
6199 int offset, iphl;
6200 uint8_t fields;
6201
6202 /*
6203 * XXX It would be nice if the mbuf pkthdr had offset
6204 * fields for the protocol headers.
6205 */
6206
6207 eh = mtod(m0, struct ether_header *);
6208 switch (htons(eh->ether_type)) {
6209 case ETHERTYPE_IP:
6210 case ETHERTYPE_IPV6:
6211 offset = ETHER_HDR_LEN;
6212 break;
6213
6214 case ETHERTYPE_VLAN:
6215 offset = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
6216 break;
6217
6218 default:
6219 /*
6220 * Don't support this protocol or encapsulation.
6221 */
6222 *fieldsp = 0;
6223 *cmdp = 0;
6224 return 0;
6225 }
6226
6227 if ((m0->m_pkthdr.csum_flags &
6228 (M_CSUM_TSOv4 | M_CSUM_UDPv4 | M_CSUM_TCPv4)) != 0) {
6229 iphl = M_CSUM_DATA_IPv4_IPHL(m0->m_pkthdr.csum_data);
6230 } else {
6231 iphl = M_CSUM_DATA_IPv6_HL(m0->m_pkthdr.csum_data);
6232 }
6233 ipcse = offset + iphl - 1;
6234
6235 cmd = WTX_CMD_DEXT | WTX_DTYP_D;
6236 cmdlen = WTX_CMD_DEXT | WTX_DTYP_C | WTX_CMD_IDE;
6237 seg = 0;
6238 fields = 0;
6239
6240 if ((m0->m_pkthdr.csum_flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0) {
6241 int hlen = offset + iphl;
6242 bool v4 = (m0->m_pkthdr.csum_flags & M_CSUM_TSOv4) != 0;
6243
6244 if (__predict_false(m0->m_len <
6245 (hlen + sizeof(struct tcphdr)))) {
6246 /*
6247 * TCP/IP headers are not in the first mbuf; we need
6248 * to do this the slow and painful way. Let's just
6249 * hope this doesn't happen very often.
6250 */
6251 struct tcphdr th;
6252
6253 WM_Q_EVCNT_INCR(txq, txtsopain);
6254
6255 m_copydata(m0, hlen, sizeof(th), &th);
6256 if (v4) {
6257 struct ip ip;
6258
6259 m_copydata(m0, offset, sizeof(ip), &ip);
6260 ip.ip_len = 0;
6261 m_copyback(m0,
6262 offset + offsetof(struct ip, ip_len),
6263 sizeof(ip.ip_len), &ip.ip_len);
6264 th.th_sum = in_cksum_phdr(ip.ip_src.s_addr,
6265 ip.ip_dst.s_addr, htons(IPPROTO_TCP));
6266 } else {
6267 struct ip6_hdr ip6;
6268
6269 m_copydata(m0, offset, sizeof(ip6), &ip6);
6270 ip6.ip6_plen = 0;
6271 m_copyback(m0,
6272 offset + offsetof(struct ip6_hdr, ip6_plen),
6273 sizeof(ip6.ip6_plen), &ip6.ip6_plen);
6274 th.th_sum = in6_cksum_phdr(&ip6.ip6_src,
6275 &ip6.ip6_dst, 0, htonl(IPPROTO_TCP));
6276 }
6277 m_copyback(m0, hlen + offsetof(struct tcphdr, th_sum),
6278 sizeof(th.th_sum), &th.th_sum);
6279
6280 hlen += th.th_off << 2;
6281 } else {
6282 /*
6283 * TCP/IP headers are in the first mbuf; we can do
6284 * this the easy way.
6285 */
6286 struct tcphdr *th;
6287
6288 if (v4) {
6289 struct ip *ip =
6290 (void *)(mtod(m0, char *) + offset);
6291 th = (void *)(mtod(m0, char *) + hlen);
6292
6293 ip->ip_len = 0;
6294 th->th_sum = in_cksum_phdr(ip->ip_src.s_addr,
6295 ip->ip_dst.s_addr, htons(IPPROTO_TCP));
6296 } else {
6297 struct ip6_hdr *ip6 =
6298 (void *)(mtod(m0, char *) + offset);
6299 th = (void *)(mtod(m0, char *) + hlen);
6300
6301 ip6->ip6_plen = 0;
6302 th->th_sum = in6_cksum_phdr(&ip6->ip6_src,
6303 &ip6->ip6_dst, 0, htonl(IPPROTO_TCP));
6304 }
6305 hlen += th->th_off << 2;
6306 }
6307
6308 if (v4) {
6309 WM_Q_EVCNT_INCR(txq, txtso);
6310 cmdlen |= WTX_TCPIP_CMD_IP;
6311 } else {
6312 WM_Q_EVCNT_INCR(txq, txtso6);
6313 ipcse = 0;
6314 }
6315 cmd |= WTX_TCPIP_CMD_TSE;
6316 cmdlen |= WTX_TCPIP_CMD_TSE |
6317 WTX_TCPIP_CMD_TCP | (m0->m_pkthdr.len - hlen);
6318 seg = WTX_TCPIP_SEG_HDRLEN(hlen) |
6319 WTX_TCPIP_SEG_MSS(m0->m_pkthdr.segsz);
6320 }
6321
6322 /*
6323 * NOTE: Even if we're not using the IP or TCP/UDP checksum
6324 * offload feature, if we load the context descriptor, we
6325 * MUST provide valid values for IPCSS and TUCSS fields.
6326 */
6327
6328 ipcs = WTX_TCPIP_IPCSS(offset) |
6329 WTX_TCPIP_IPCSO(offset + offsetof(struct ip, ip_sum)) |
6330 WTX_TCPIP_IPCSE(ipcse);
6331 if (m0->m_pkthdr.csum_flags & (M_CSUM_IPv4 | M_CSUM_TSOv4)) {
6332 WM_Q_EVCNT_INCR(txq, txipsum);
6333 fields |= WTX_IXSM;
6334 }
6335
6336 offset += iphl;
6337
6338 if (m0->m_pkthdr.csum_flags &
6339 (M_CSUM_TCPv4 | M_CSUM_UDPv4 | M_CSUM_TSOv4)) {
6340 WM_Q_EVCNT_INCR(txq, txtusum);
6341 fields |= WTX_TXSM;
6342 tucs = WTX_TCPIP_TUCSS(offset) |
6343 WTX_TCPIP_TUCSO(offset +
6344 M_CSUM_DATA_IPv4_OFFSET(m0->m_pkthdr.csum_data)) |
6345 WTX_TCPIP_TUCSE(0) /* rest of packet */;
6346 } else if ((m0->m_pkthdr.csum_flags &
6347 (M_CSUM_TCPv6 | M_CSUM_UDPv6 | M_CSUM_TSOv6)) != 0) {
6348 WM_Q_EVCNT_INCR(txq, txtusum6);
6349 fields |= WTX_TXSM;
6350 tucs = WTX_TCPIP_TUCSS(offset) |
6351 WTX_TCPIP_TUCSO(offset +
6352 M_CSUM_DATA_IPv6_OFFSET(m0->m_pkthdr.csum_data)) |
6353 WTX_TCPIP_TUCSE(0) /* rest of packet */;
6354 } else {
6355 /* Just initialize it to a valid TCP context. */
6356 tucs = WTX_TCPIP_TUCSS(offset) |
6357 WTX_TCPIP_TUCSO(offset + offsetof(struct tcphdr, th_sum)) |
6358 WTX_TCPIP_TUCSE(0) /* rest of packet */;
6359 }
6360
6361 /* Fill in the context descriptor. */
6362 t = (struct livengood_tcpip_ctxdesc *)
6363 &txq->txq_descs[txq->txq_next];
6364 t->tcpip_ipcs = htole32(ipcs);
6365 t->tcpip_tucs = htole32(tucs);
6366 t->tcpip_cmdlen = htole32(cmdlen);
6367 t->tcpip_seg = htole32(seg);
6368 wm_cdtxsync(txq, txq->txq_next, 1, BUS_DMASYNC_PREWRITE);
6369
6370 txq->txq_next = WM_NEXTTX(txq, txq->txq_next);
6371 txs->txs_ndesc++;
6372
6373 *cmdp = cmd;
6374 *fieldsp = fields;
6375
6376 return 0;
6377 }
6378
6379 static inline int
6380 wm_select_txqueue(struct ifnet *ifp, struct mbuf *m)
6381 {
6382 struct wm_softc *sc = ifp->if_softc;
6383 u_int cpuid = cpu_index(curcpu());
6384
6385 /*
6386 * Currently, simple distribute strategy.
6387 * TODO:
6388 * distribute by flowid(RSS has value).
6389 */
6390 return (cpuid + sc->sc_affinity_offset) % sc->sc_nqueues;
6391 }
6392
6393 /*
6394 * wm_start: [ifnet interface function]
6395 *
6396 * Start packet transmission on the interface.
6397 */
6398 static void
6399 wm_start(struct ifnet *ifp)
6400 {
6401 struct wm_softc *sc = ifp->if_softc;
6402 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
6403
6404 KASSERT(ifp->if_extflags & IFEF_START_MPSAFE);
6405
6406 /*
6407 * ifp->if_obytes and ifp->if_omcasts are added in if_transmit()@if.c.
6408 */
6409
6410 mutex_enter(txq->txq_lock);
6411 if (!txq->txq_stopping)
6412 wm_start_locked(ifp);
6413 mutex_exit(txq->txq_lock);
6414 }
6415
6416 static void
6417 wm_start_locked(struct ifnet *ifp)
6418 {
6419 struct wm_softc *sc = ifp->if_softc;
6420 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
6421
6422 wm_send_common_locked(ifp, txq, false);
6423 }
6424
6425 static int
6426 wm_transmit(struct ifnet *ifp, struct mbuf *m)
6427 {
6428 int qid;
6429 struct wm_softc *sc = ifp->if_softc;
6430 struct wm_txqueue *txq;
6431
6432 qid = wm_select_txqueue(ifp, m);
6433 txq = &sc->sc_queue[qid].wmq_txq;
6434
6435 if (__predict_false(!pcq_put(txq->txq_interq, m))) {
6436 m_freem(m);
6437 WM_Q_EVCNT_INCR(txq, txdrop);
6438 return ENOBUFS;
6439 }
6440
6441 /*
6442 * XXXX NOMPSAFE: ifp->if_data should be percpu.
6443 */
6444 ifp->if_obytes += m->m_pkthdr.len;
6445 if (m->m_flags & M_MCAST)
6446 ifp->if_omcasts++;
6447
6448 if (mutex_tryenter(txq->txq_lock)) {
6449 if (!txq->txq_stopping)
6450 wm_transmit_locked(ifp, txq);
6451 mutex_exit(txq->txq_lock);
6452 }
6453
6454 return 0;
6455 }
6456
6457 static void
6458 wm_transmit_locked(struct ifnet *ifp, struct wm_txqueue *txq)
6459 {
6460
6461 wm_send_common_locked(ifp, txq, true);
6462 }
6463
6464 static void
6465 wm_send_common_locked(struct ifnet *ifp, struct wm_txqueue *txq,
6466 bool is_transmit)
6467 {
6468 struct wm_softc *sc = ifp->if_softc;
6469 struct mbuf *m0;
6470 struct m_tag *mtag;
6471 struct wm_txsoft *txs;
6472 bus_dmamap_t dmamap;
6473 int error, nexttx, lasttx = -1, ofree, seg, segs_needed, use_tso;
6474 bus_addr_t curaddr;
6475 bus_size_t seglen, curlen;
6476 uint32_t cksumcmd;
6477 uint8_t cksumfields;
6478
6479 KASSERT(mutex_owned(txq->txq_lock));
6480
6481 if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
6482 return;
6483
6484 /* Remember the previous number of free descriptors. */
6485 ofree = txq->txq_free;
6486
6487 /*
6488 * Loop through the send queue, setting up transmit descriptors
6489 * until we drain the queue, or use up all available transmit
6490 * descriptors.
6491 */
6492 for (;;) {
6493 m0 = NULL;
6494
6495 /* Get a work queue entry. */
6496 if (txq->txq_sfree < WM_TXQUEUE_GC(txq)) {
6497 wm_txeof(sc, txq);
6498 if (txq->txq_sfree == 0) {
6499 DPRINTF(WM_DEBUG_TX,
6500 ("%s: TX: no free job descriptors\n",
6501 device_xname(sc->sc_dev)));
6502 WM_Q_EVCNT_INCR(txq, txsstall);
6503 break;
6504 }
6505 }
6506
6507 /* Grab a packet off the queue. */
6508 if (is_transmit)
6509 m0 = pcq_get(txq->txq_interq);
6510 else
6511 IFQ_DEQUEUE(&ifp->if_snd, m0);
6512 if (m0 == NULL)
6513 break;
6514
6515 DPRINTF(WM_DEBUG_TX,
6516 ("%s: TX: have packet to transmit: %p\n",
6517 device_xname(sc->sc_dev), m0));
6518
6519 txs = &txq->txq_soft[txq->txq_snext];
6520 dmamap = txs->txs_dmamap;
6521
6522 use_tso = (m0->m_pkthdr.csum_flags &
6523 (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0;
6524
6525 /*
6526 * So says the Linux driver:
6527 * The controller does a simple calculation to make sure
6528 * there is enough room in the FIFO before initiating the
6529 * DMA for each buffer. The calc is:
6530 * 4 = ceil(buffer len / MSS)
6531 * To make sure we don't overrun the FIFO, adjust the max
6532 * buffer len if the MSS drops.
6533 */
6534 dmamap->dm_maxsegsz =
6535 (use_tso && (m0->m_pkthdr.segsz << 2) < WTX_MAX_LEN)
6536 ? m0->m_pkthdr.segsz << 2
6537 : WTX_MAX_LEN;
6538
6539 /*
6540 * Load the DMA map. If this fails, the packet either
6541 * didn't fit in the allotted number of segments, or we
6542 * were short on resources. For the too-many-segments
6543 * case, we simply report an error and drop the packet,
6544 * since we can't sanely copy a jumbo packet to a single
6545 * buffer.
6546 */
6547 error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0,
6548 BUS_DMA_WRITE | BUS_DMA_NOWAIT);
6549 if (error) {
6550 if (error == EFBIG) {
6551 WM_Q_EVCNT_INCR(txq, txdrop);
6552 log(LOG_ERR, "%s: Tx packet consumes too many "
6553 "DMA segments, dropping...\n",
6554 device_xname(sc->sc_dev));
6555 wm_dump_mbuf_chain(sc, m0);
6556 m_freem(m0);
6557 continue;
6558 }
6559 /* Short on resources, just stop for now. */
6560 DPRINTF(WM_DEBUG_TX,
6561 ("%s: TX: dmamap load failed: %d\n",
6562 device_xname(sc->sc_dev), error));
6563 break;
6564 }
6565
6566 segs_needed = dmamap->dm_nsegs;
6567 if (use_tso) {
6568 /* For sentinel descriptor; see below. */
6569 segs_needed++;
6570 }
6571
6572 /*
6573 * Ensure we have enough descriptors free to describe
6574 * the packet. Note, we always reserve one descriptor
6575 * at the end of the ring due to the semantics of the
6576 * TDT register, plus one more in the event we need
6577 * to load offload context.
6578 */
6579 if (segs_needed > txq->txq_free - 2) {
6580 /*
6581 * Not enough free descriptors to transmit this
6582 * packet. We haven't committed anything yet,
6583 * so just unload the DMA map, put the packet
6584 * pack on the queue, and punt. Notify the upper
6585 * layer that there are no more slots left.
6586 */
6587 DPRINTF(WM_DEBUG_TX,
6588 ("%s: TX: need %d (%d) descriptors, have %d\n",
6589 device_xname(sc->sc_dev), dmamap->dm_nsegs,
6590 segs_needed, txq->txq_free - 1));
6591 ifp->if_flags |= IFF_OACTIVE;
6592 bus_dmamap_unload(sc->sc_dmat, dmamap);
6593 WM_Q_EVCNT_INCR(txq, txdstall);
6594 break;
6595 }
6596
6597 /*
6598 * Check for 82547 Tx FIFO bug. We need to do this
6599 * once we know we can transmit the packet, since we
6600 * do some internal FIFO space accounting here.
6601 */
6602 if (sc->sc_type == WM_T_82547 &&
6603 wm_82547_txfifo_bugchk(sc, m0)) {
6604 DPRINTF(WM_DEBUG_TX,
6605 ("%s: TX: 82547 Tx FIFO bug detected\n",
6606 device_xname(sc->sc_dev)));
6607 ifp->if_flags |= IFF_OACTIVE;
6608 bus_dmamap_unload(sc->sc_dmat, dmamap);
6609 WM_Q_EVCNT_INCR(txq, txfifo_stall);
6610 break;
6611 }
6612
6613 /* WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET. */
6614
6615 DPRINTF(WM_DEBUG_TX,
6616 ("%s: TX: packet has %d (%d) DMA segments\n",
6617 device_xname(sc->sc_dev), dmamap->dm_nsegs, segs_needed));
6618
6619 WM_EVCNT_INCR(&txq->txq_ev_txseg[dmamap->dm_nsegs - 1]);
6620
6621 /*
6622 * Store a pointer to the packet so that we can free it
6623 * later.
6624 *
6625 * Initially, we consider the number of descriptors the
6626 * packet uses the number of DMA segments. This may be
6627 * incremented by 1 if we do checksum offload (a descriptor
6628 * is used to set the checksum context).
6629 */
6630 txs->txs_mbuf = m0;
6631 txs->txs_firstdesc = txq->txq_next;
6632 txs->txs_ndesc = segs_needed;
6633
6634 /* Set up offload parameters for this packet. */
6635 if (m0->m_pkthdr.csum_flags &
6636 (M_CSUM_TSOv4 | M_CSUM_TSOv6 |
6637 M_CSUM_IPv4 | M_CSUM_TCPv4 | M_CSUM_UDPv4 |
6638 M_CSUM_TCPv6 | M_CSUM_UDPv6)) {
6639 if (wm_tx_offload(sc, txs, &cksumcmd,
6640 &cksumfields) != 0) {
6641 /* Error message already displayed. */
6642 bus_dmamap_unload(sc->sc_dmat, dmamap);
6643 continue;
6644 }
6645 } else {
6646 cksumcmd = 0;
6647 cksumfields = 0;
6648 }
6649
6650 cksumcmd |= WTX_CMD_IDE | WTX_CMD_IFCS;
6651
6652 /* Sync the DMA map. */
6653 bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize,
6654 BUS_DMASYNC_PREWRITE);
6655
6656 /* Initialize the transmit descriptor. */
6657 for (nexttx = txq->txq_next, seg = 0;
6658 seg < dmamap->dm_nsegs; seg++) {
6659 for (seglen = dmamap->dm_segs[seg].ds_len,
6660 curaddr = dmamap->dm_segs[seg].ds_addr;
6661 seglen != 0;
6662 curaddr += curlen, seglen -= curlen,
6663 nexttx = WM_NEXTTX(txq, nexttx)) {
6664 curlen = seglen;
6665
6666 /*
6667 * So says the Linux driver:
6668 * Work around for premature descriptor
6669 * write-backs in TSO mode. Append a
6670 * 4-byte sentinel descriptor.
6671 */
6672 if (use_tso && seg == dmamap->dm_nsegs - 1 &&
6673 curlen > 8)
6674 curlen -= 4;
6675
6676 wm_set_dma_addr(
6677 &txq->txq_descs[nexttx].wtx_addr, curaddr);
6678 txq->txq_descs[nexttx].wtx_cmdlen
6679 = htole32(cksumcmd | curlen);
6680 txq->txq_descs[nexttx].wtx_fields.wtxu_status
6681 = 0;
6682 txq->txq_descs[nexttx].wtx_fields.wtxu_options
6683 = cksumfields;
6684 txq->txq_descs[nexttx].wtx_fields.wtxu_vlan =0;
6685 lasttx = nexttx;
6686
6687 DPRINTF(WM_DEBUG_TX,
6688 ("%s: TX: desc %d: low %#" PRIx64 ", "
6689 "len %#04zx\n",
6690 device_xname(sc->sc_dev), nexttx,
6691 (uint64_t)curaddr, curlen));
6692 }
6693 }
6694
6695 KASSERT(lasttx != -1);
6696
6697 /*
6698 * Set up the command byte on the last descriptor of
6699 * the packet. If we're in the interrupt delay window,
6700 * delay the interrupt.
6701 */
6702 txq->txq_descs[lasttx].wtx_cmdlen |=
6703 htole32(WTX_CMD_EOP | WTX_CMD_RS);
6704
6705 /*
6706 * If VLANs are enabled and the packet has a VLAN tag, set
6707 * up the descriptor to encapsulate the packet for us.
6708 *
6709 * This is only valid on the last descriptor of the packet.
6710 */
6711 if ((mtag = VLAN_OUTPUT_TAG(&sc->sc_ethercom, m0)) != NULL) {
6712 txq->txq_descs[lasttx].wtx_cmdlen |=
6713 htole32(WTX_CMD_VLE);
6714 txq->txq_descs[lasttx].wtx_fields.wtxu_vlan
6715 = htole16(VLAN_TAG_VALUE(mtag) & 0xffff);
6716 }
6717
6718 txs->txs_lastdesc = lasttx;
6719
6720 DPRINTF(WM_DEBUG_TX,
6721 ("%s: TX: desc %d: cmdlen 0x%08x\n",
6722 device_xname(sc->sc_dev),
6723 lasttx, le32toh(txq->txq_descs[lasttx].wtx_cmdlen)));
6724
6725 /* Sync the descriptors we're using. */
6726 wm_cdtxsync(txq, txq->txq_next, txs->txs_ndesc,
6727 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
6728
6729 /* Give the packet to the chip. */
6730 CSR_WRITE(sc, txq->txq_tdt_reg, nexttx);
6731
6732 DPRINTF(WM_DEBUG_TX,
6733 ("%s: TX: TDT -> %d\n", device_xname(sc->sc_dev), nexttx));
6734
6735 DPRINTF(WM_DEBUG_TX,
6736 ("%s: TX: finished transmitting packet, job %d\n",
6737 device_xname(sc->sc_dev), txq->txq_snext));
6738
6739 /* Advance the tx pointer. */
6740 txq->txq_free -= txs->txs_ndesc;
6741 txq->txq_next = nexttx;
6742
6743 txq->txq_sfree--;
6744 txq->txq_snext = WM_NEXTTXS(txq, txq->txq_snext);
6745
6746 /* Pass the packet to any BPF listeners. */
6747 bpf_mtap(ifp, m0);
6748 }
6749
6750 if (m0 != NULL) {
6751 ifp->if_flags |= IFF_OACTIVE;
6752 WM_Q_EVCNT_INCR(txq, txdrop);
6753 DPRINTF(WM_DEBUG_TX, ("%s: TX: error after IFQ_DEQUEUE\n",
6754 __func__));
6755 m_freem(m0);
6756 }
6757
6758 if (txq->txq_sfree == 0 || txq->txq_free <= 2) {
6759 /* No more slots; notify upper layer. */
6760 ifp->if_flags |= IFF_OACTIVE;
6761 }
6762
6763 if (txq->txq_free != ofree) {
6764 /* Set a watchdog timer in case the chip flakes out. */
6765 ifp->if_timer = 5;
6766 }
6767 }
6768
6769 /*
6770 * wm_nq_tx_offload:
6771 *
6772 * Set up TCP/IP checksumming parameters for the
6773 * specified packet, for NEWQUEUE devices
6774 */
6775 static int
6776 wm_nq_tx_offload(struct wm_softc *sc, struct wm_txqueue *txq,
6777 struct wm_txsoft *txs, uint32_t *cmdlenp, uint32_t *fieldsp, bool *do_csum)
6778 {
6779 struct mbuf *m0 = txs->txs_mbuf;
6780 struct m_tag *mtag;
6781 uint32_t vl_len, mssidx, cmdc;
6782 struct ether_header *eh;
6783 int offset, iphl;
6784
6785 /*
6786 * XXX It would be nice if the mbuf pkthdr had offset
6787 * fields for the protocol headers.
6788 */
6789 *cmdlenp = 0;
6790 *fieldsp = 0;
6791
6792 eh = mtod(m0, struct ether_header *);
6793 switch (htons(eh->ether_type)) {
6794 case ETHERTYPE_IP:
6795 case ETHERTYPE_IPV6:
6796 offset = ETHER_HDR_LEN;
6797 break;
6798
6799 case ETHERTYPE_VLAN:
6800 offset = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN;
6801 break;
6802
6803 default:
6804 /* Don't support this protocol or encapsulation. */
6805 *do_csum = false;
6806 return 0;
6807 }
6808 *do_csum = true;
6809 *cmdlenp = NQTX_DTYP_D | NQTX_CMD_DEXT | NQTX_CMD_IFCS;
6810 cmdc = NQTX_DTYP_C | NQTX_CMD_DEXT;
6811
6812 vl_len = (offset << NQTXC_VLLEN_MACLEN_SHIFT);
6813 KASSERT((offset & ~NQTXC_VLLEN_MACLEN_MASK) == 0);
6814
6815 if ((m0->m_pkthdr.csum_flags &
6816 (M_CSUM_TSOv4 | M_CSUM_UDPv4 | M_CSUM_TCPv4 | M_CSUM_IPv4)) != 0) {
6817 iphl = M_CSUM_DATA_IPv4_IPHL(m0->m_pkthdr.csum_data);
6818 } else {
6819 iphl = M_CSUM_DATA_IPv6_HL(m0->m_pkthdr.csum_data);
6820 }
6821 vl_len |= (iphl << NQTXC_VLLEN_IPLEN_SHIFT);
6822 KASSERT((iphl & ~NQTXC_VLLEN_IPLEN_MASK) == 0);
6823
6824 if ((mtag = VLAN_OUTPUT_TAG(&sc->sc_ethercom, m0)) != NULL) {
6825 vl_len |= ((VLAN_TAG_VALUE(mtag) & NQTXC_VLLEN_VLAN_MASK)
6826 << NQTXC_VLLEN_VLAN_SHIFT);
6827 *cmdlenp |= NQTX_CMD_VLE;
6828 }
6829
6830 mssidx = 0;
6831
6832 if ((m0->m_pkthdr.csum_flags & (M_CSUM_TSOv4 | M_CSUM_TSOv6)) != 0) {
6833 int hlen = offset + iphl;
6834 int tcp_hlen;
6835 bool v4 = (m0->m_pkthdr.csum_flags & M_CSUM_TSOv4) != 0;
6836
6837 if (__predict_false(m0->m_len <
6838 (hlen + sizeof(struct tcphdr)))) {
6839 /*
6840 * TCP/IP headers are not in the first mbuf; we need
6841 * to do this the slow and painful way. Let's just
6842 * hope this doesn't happen very often.
6843 */
6844 struct tcphdr th;
6845
6846 WM_Q_EVCNT_INCR(txq, txtsopain);
6847
6848 m_copydata(m0, hlen, sizeof(th), &th);
6849 if (v4) {
6850 struct ip ip;
6851
6852 m_copydata(m0, offset, sizeof(ip), &ip);
6853 ip.ip_len = 0;
6854 m_copyback(m0,
6855 offset + offsetof(struct ip, ip_len),
6856 sizeof(ip.ip_len), &ip.ip_len);
6857 th.th_sum = in_cksum_phdr(ip.ip_src.s_addr,
6858 ip.ip_dst.s_addr, htons(IPPROTO_TCP));
6859 } else {
6860 struct ip6_hdr ip6;
6861
6862 m_copydata(m0, offset, sizeof(ip6), &ip6);
6863 ip6.ip6_plen = 0;
6864 m_copyback(m0,
6865 offset + offsetof(struct ip6_hdr, ip6_plen),
6866 sizeof(ip6.ip6_plen), &ip6.ip6_plen);
6867 th.th_sum = in6_cksum_phdr(&ip6.ip6_src,
6868 &ip6.ip6_dst, 0, htonl(IPPROTO_TCP));
6869 }
6870 m_copyback(m0, hlen + offsetof(struct tcphdr, th_sum),
6871 sizeof(th.th_sum), &th.th_sum);
6872
6873 tcp_hlen = th.th_off << 2;
6874 } else {
6875 /*
6876 * TCP/IP headers are in the first mbuf; we can do
6877 * this the easy way.
6878 */
6879 struct tcphdr *th;
6880
6881 if (v4) {
6882 struct ip *ip =
6883 (void *)(mtod(m0, char *) + offset);
6884 th = (void *)(mtod(m0, char *) + hlen);
6885
6886 ip->ip_len = 0;
6887 th->th_sum = in_cksum_phdr(ip->ip_src.s_addr,
6888 ip->ip_dst.s_addr, htons(IPPROTO_TCP));
6889 } else {
6890 struct ip6_hdr *ip6 =
6891 (void *)(mtod(m0, char *) + offset);
6892 th = (void *)(mtod(m0, char *) + hlen);
6893
6894 ip6->ip6_plen = 0;
6895 th->th_sum = in6_cksum_phdr(&ip6->ip6_src,
6896 &ip6->ip6_dst, 0, htonl(IPPROTO_TCP));
6897 }
6898 tcp_hlen = th->th_off << 2;
6899 }
6900 hlen += tcp_hlen;
6901 *cmdlenp |= NQTX_CMD_TSE;
6902
6903 if (v4) {
6904 WM_Q_EVCNT_INCR(txq, txtso);
6905 *fieldsp |= NQTXD_FIELDS_IXSM | NQTXD_FIELDS_TUXSM;
6906 } else {
6907 WM_Q_EVCNT_INCR(txq, txtso6);
6908 *fieldsp |= NQTXD_FIELDS_TUXSM;
6909 }
6910 *fieldsp |= ((m0->m_pkthdr.len - hlen) << NQTXD_FIELDS_PAYLEN_SHIFT);
6911 KASSERT(((m0->m_pkthdr.len - hlen) & ~NQTXD_FIELDS_PAYLEN_MASK) == 0);
6912 mssidx |= (m0->m_pkthdr.segsz << NQTXC_MSSIDX_MSS_SHIFT);
6913 KASSERT((m0->m_pkthdr.segsz & ~NQTXC_MSSIDX_MSS_MASK) == 0);
6914 mssidx |= (tcp_hlen << NQTXC_MSSIDX_L4LEN_SHIFT);
6915 KASSERT((tcp_hlen & ~NQTXC_MSSIDX_L4LEN_MASK) == 0);
6916 } else {
6917 *fieldsp |= (m0->m_pkthdr.len << NQTXD_FIELDS_PAYLEN_SHIFT);
6918 KASSERT((m0->m_pkthdr.len & ~NQTXD_FIELDS_PAYLEN_MASK) == 0);
6919 }
6920
6921 if (m0->m_pkthdr.csum_flags & M_CSUM_IPv4) {
6922 *fieldsp |= NQTXD_FIELDS_IXSM;
6923 cmdc |= NQTXC_CMD_IP4;
6924 }
6925
6926 if (m0->m_pkthdr.csum_flags &
6927 (M_CSUM_UDPv4 | M_CSUM_TCPv4 | M_CSUM_TSOv4)) {
6928 WM_Q_EVCNT_INCR(txq, txtusum);
6929 if (m0->m_pkthdr.csum_flags & (M_CSUM_TCPv4 | M_CSUM_TSOv4)) {
6930 cmdc |= NQTXC_CMD_TCP;
6931 } else {
6932 cmdc |= NQTXC_CMD_UDP;
6933 }
6934 cmdc |= NQTXC_CMD_IP4;
6935 *fieldsp |= NQTXD_FIELDS_TUXSM;
6936 }
6937 if (m0->m_pkthdr.csum_flags &
6938 (M_CSUM_UDPv6 | M_CSUM_TCPv6 | M_CSUM_TSOv6)) {
6939 WM_Q_EVCNT_INCR(txq, txtusum6);
6940 if (m0->m_pkthdr.csum_flags & (M_CSUM_TCPv6 | M_CSUM_TSOv6)) {
6941 cmdc |= NQTXC_CMD_TCP;
6942 } else {
6943 cmdc |= NQTXC_CMD_UDP;
6944 }
6945 cmdc |= NQTXC_CMD_IP6;
6946 *fieldsp |= NQTXD_FIELDS_TUXSM;
6947 }
6948
6949 /* Fill in the context descriptor. */
6950 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_vl_len =
6951 htole32(vl_len);
6952 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_sn = 0;
6953 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_cmd =
6954 htole32(cmdc);
6955 txq->txq_nq_descs[txq->txq_next].nqrx_ctx.nqtxc_mssidx =
6956 htole32(mssidx);
6957 wm_cdtxsync(txq, txq->txq_next, 1, BUS_DMASYNC_PREWRITE);
6958 DPRINTF(WM_DEBUG_TX,
6959 ("%s: TX: context desc %d 0x%08x%08x\n", device_xname(sc->sc_dev),
6960 txq->txq_next, 0, vl_len));
6961 DPRINTF(WM_DEBUG_TX, ("\t0x%08x%08x\n", mssidx, cmdc));
6962 txq->txq_next = WM_NEXTTX(txq, txq->txq_next);
6963 txs->txs_ndesc++;
6964 return 0;
6965 }
6966
6967 /*
6968 * wm_nq_start: [ifnet interface function]
6969 *
6970 * Start packet transmission on the interface for NEWQUEUE devices
6971 */
6972 static void
6973 wm_nq_start(struct ifnet *ifp)
6974 {
6975 struct wm_softc *sc = ifp->if_softc;
6976 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
6977
6978 KASSERT(ifp->if_extflags & IFEF_START_MPSAFE);
6979
6980 /*
6981 * ifp->if_obytes and ifp->if_omcasts are added in if_transmit()@if.c.
6982 */
6983
6984 mutex_enter(txq->txq_lock);
6985 if (!txq->txq_stopping)
6986 wm_nq_start_locked(ifp);
6987 mutex_exit(txq->txq_lock);
6988 }
6989
6990 static void
6991 wm_nq_start_locked(struct ifnet *ifp)
6992 {
6993 struct wm_softc *sc = ifp->if_softc;
6994 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
6995
6996 wm_nq_send_common_locked(ifp, txq, false);
6997 }
6998
6999 static int
7000 wm_nq_transmit(struct ifnet *ifp, struct mbuf *m)
7001 {
7002 int qid;
7003 struct wm_softc *sc = ifp->if_softc;
7004 struct wm_txqueue *txq;
7005
7006 qid = wm_select_txqueue(ifp, m);
7007 txq = &sc->sc_queue[qid].wmq_txq;
7008
7009 if (__predict_false(!pcq_put(txq->txq_interq, m))) {
7010 m_freem(m);
7011 WM_Q_EVCNT_INCR(txq, txdrop);
7012 return ENOBUFS;
7013 }
7014
7015 /*
7016 * XXXX NOMPSAFE: ifp->if_data should be percpu.
7017 */
7018 ifp->if_obytes += m->m_pkthdr.len;
7019 if (m->m_flags & M_MCAST)
7020 ifp->if_omcasts++;
7021
7022 /*
7023 * The situations which this mutex_tryenter() fails at running time
7024 * are below two patterns.
7025 * (1) contention with interrupt handler(wm_txrxintr_msix())
7026 * (2) contention with deferred if_start softint(wm_deferred_start())
7027 * In the case of (1), the last packet enqueued to txq->txq_interq is
7028 * dequeued by wm_deferred_start(). So, it does not get stuck.
7029 * In the case of (2), the last packet enqueued to txq->txq_interq is also
7030 * dequeued by wm_deferred_start(). So, it does not get stuck, either.
7031 */
7032 if (mutex_tryenter(txq->txq_lock)) {
7033 if (!txq->txq_stopping)
7034 wm_nq_transmit_locked(ifp, txq);
7035 mutex_exit(txq->txq_lock);
7036 }
7037
7038 return 0;
7039 }
7040
7041 static void
7042 wm_nq_transmit_locked(struct ifnet *ifp, struct wm_txqueue *txq)
7043 {
7044
7045 wm_nq_send_common_locked(ifp, txq, true);
7046 }
7047
7048 static void
7049 wm_nq_send_common_locked(struct ifnet *ifp, struct wm_txqueue *txq,
7050 bool is_transmit)
7051 {
7052 struct wm_softc *sc = ifp->if_softc;
7053 struct mbuf *m0;
7054 struct m_tag *mtag;
7055 struct wm_txsoft *txs;
7056 bus_dmamap_t dmamap;
7057 int error, nexttx, lasttx = -1, seg, segs_needed;
7058 bool do_csum, sent;
7059
7060 KASSERT(mutex_owned(txq->txq_lock));
7061
7062 if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
7063 return;
7064 if ((txq->txq_flags & WM_TXQ_NO_SPACE) != 0)
7065 return;
7066
7067 sent = false;
7068
7069 /*
7070 * Loop through the send queue, setting up transmit descriptors
7071 * until we drain the queue, or use up all available transmit
7072 * descriptors.
7073 */
7074 for (;;) {
7075 m0 = NULL;
7076
7077 /* Get a work queue entry. */
7078 if (txq->txq_sfree < WM_TXQUEUE_GC(txq)) {
7079 wm_txeof(sc, txq);
7080 if (txq->txq_sfree == 0) {
7081 DPRINTF(WM_DEBUG_TX,
7082 ("%s: TX: no free job descriptors\n",
7083 device_xname(sc->sc_dev)));
7084 WM_Q_EVCNT_INCR(txq, txsstall);
7085 break;
7086 }
7087 }
7088
7089 /* Grab a packet off the queue. */
7090 if (is_transmit)
7091 m0 = pcq_get(txq->txq_interq);
7092 else
7093 IFQ_DEQUEUE(&ifp->if_snd, m0);
7094 if (m0 == NULL)
7095 break;
7096
7097 DPRINTF(WM_DEBUG_TX,
7098 ("%s: TX: have packet to transmit: %p\n",
7099 device_xname(sc->sc_dev), m0));
7100
7101 txs = &txq->txq_soft[txq->txq_snext];
7102 dmamap = txs->txs_dmamap;
7103
7104 /*
7105 * Load the DMA map. If this fails, the packet either
7106 * didn't fit in the allotted number of segments, or we
7107 * were short on resources. For the too-many-segments
7108 * case, we simply report an error and drop the packet,
7109 * since we can't sanely copy a jumbo packet to a single
7110 * buffer.
7111 */
7112 error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0,
7113 BUS_DMA_WRITE | BUS_DMA_NOWAIT);
7114 if (error) {
7115 if (error == EFBIG) {
7116 WM_Q_EVCNT_INCR(txq, txdrop);
7117 log(LOG_ERR, "%s: Tx packet consumes too many "
7118 "DMA segments, dropping...\n",
7119 device_xname(sc->sc_dev));
7120 wm_dump_mbuf_chain(sc, m0);
7121 m_freem(m0);
7122 continue;
7123 }
7124 /* Short on resources, just stop for now. */
7125 DPRINTF(WM_DEBUG_TX,
7126 ("%s: TX: dmamap load failed: %d\n",
7127 device_xname(sc->sc_dev), error));
7128 break;
7129 }
7130
7131 segs_needed = dmamap->dm_nsegs;
7132
7133 /*
7134 * Ensure we have enough descriptors free to describe
7135 * the packet. Note, we always reserve one descriptor
7136 * at the end of the ring due to the semantics of the
7137 * TDT register, plus one more in the event we need
7138 * to load offload context.
7139 */
7140 if (segs_needed > txq->txq_free - 2) {
7141 /*
7142 * Not enough free descriptors to transmit this
7143 * packet. We haven't committed anything yet,
7144 * so just unload the DMA map, put the packet
7145 * pack on the queue, and punt. Notify the upper
7146 * layer that there are no more slots left.
7147 */
7148 DPRINTF(WM_DEBUG_TX,
7149 ("%s: TX: need %d (%d) descriptors, have %d\n",
7150 device_xname(sc->sc_dev), dmamap->dm_nsegs,
7151 segs_needed, txq->txq_free - 1));
7152 txq->txq_flags |= WM_TXQ_NO_SPACE;
7153 bus_dmamap_unload(sc->sc_dmat, dmamap);
7154 WM_Q_EVCNT_INCR(txq, txdstall);
7155 break;
7156 }
7157
7158 /* WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET. */
7159
7160 DPRINTF(WM_DEBUG_TX,
7161 ("%s: TX: packet has %d (%d) DMA segments\n",
7162 device_xname(sc->sc_dev), dmamap->dm_nsegs, segs_needed));
7163
7164 WM_EVCNT_INCR(&txq->txq_ev_txseg[dmamap->dm_nsegs - 1]);
7165
7166 /*
7167 * Store a pointer to the packet so that we can free it
7168 * later.
7169 *
7170 * Initially, we consider the number of descriptors the
7171 * packet uses the number of DMA segments. This may be
7172 * incremented by 1 if we do checksum offload (a descriptor
7173 * is used to set the checksum context).
7174 */
7175 txs->txs_mbuf = m0;
7176 txs->txs_firstdesc = txq->txq_next;
7177 txs->txs_ndesc = segs_needed;
7178
7179 /* Set up offload parameters for this packet. */
7180 uint32_t cmdlen, fields, dcmdlen;
7181 if (m0->m_pkthdr.csum_flags &
7182 (M_CSUM_TSOv4 | M_CSUM_TSOv6 |
7183 M_CSUM_IPv4 | M_CSUM_TCPv4 | M_CSUM_UDPv4 |
7184 M_CSUM_TCPv6 | M_CSUM_UDPv6)) {
7185 if (wm_nq_tx_offload(sc, txq, txs, &cmdlen, &fields,
7186 &do_csum) != 0) {
7187 /* Error message already displayed. */
7188 bus_dmamap_unload(sc->sc_dmat, dmamap);
7189 continue;
7190 }
7191 } else {
7192 do_csum = false;
7193 cmdlen = 0;
7194 fields = 0;
7195 }
7196
7197 /* Sync the DMA map. */
7198 bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize,
7199 BUS_DMASYNC_PREWRITE);
7200
7201 /* Initialize the first transmit descriptor. */
7202 nexttx = txq->txq_next;
7203 if (!do_csum) {
7204 /* setup a legacy descriptor */
7205 wm_set_dma_addr(&txq->txq_descs[nexttx].wtx_addr,
7206 dmamap->dm_segs[0].ds_addr);
7207 txq->txq_descs[nexttx].wtx_cmdlen =
7208 htole32(WTX_CMD_IFCS | dmamap->dm_segs[0].ds_len);
7209 txq->txq_descs[nexttx].wtx_fields.wtxu_status = 0;
7210 txq->txq_descs[nexttx].wtx_fields.wtxu_options = 0;
7211 if ((mtag = VLAN_OUTPUT_TAG(&sc->sc_ethercom, m0)) !=
7212 NULL) {
7213 txq->txq_descs[nexttx].wtx_cmdlen |=
7214 htole32(WTX_CMD_VLE);
7215 txq->txq_descs[nexttx].wtx_fields.wtxu_vlan =
7216 htole16(VLAN_TAG_VALUE(mtag) & 0xffff);
7217 } else {
7218 txq->txq_descs[nexttx].wtx_fields.wtxu_vlan =0;
7219 }
7220 dcmdlen = 0;
7221 } else {
7222 /* setup an advanced data descriptor */
7223 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_addr =
7224 htole64(dmamap->dm_segs[0].ds_addr);
7225 KASSERT((dmamap->dm_segs[0].ds_len & cmdlen) == 0);
7226 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_cmdlen =
7227 htole32(dmamap->dm_segs[0].ds_len | cmdlen );
7228 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_fields =
7229 htole32(fields);
7230 DPRINTF(WM_DEBUG_TX,
7231 ("%s: TX: adv data desc %d 0x%" PRIx64 "\n",
7232 device_xname(sc->sc_dev), nexttx,
7233 (uint64_t)dmamap->dm_segs[0].ds_addr));
7234 DPRINTF(WM_DEBUG_TX,
7235 ("\t 0x%08x%08x\n", fields,
7236 (uint32_t)dmamap->dm_segs[0].ds_len | cmdlen));
7237 dcmdlen = NQTX_DTYP_D | NQTX_CMD_DEXT;
7238 }
7239
7240 lasttx = nexttx;
7241 nexttx = WM_NEXTTX(txq, nexttx);
7242 /*
7243 * fill in the next descriptors. legacy or adcanced format
7244 * is the same here
7245 */
7246 for (seg = 1; seg < dmamap->dm_nsegs;
7247 seg++, nexttx = WM_NEXTTX(txq, nexttx)) {
7248 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_addr =
7249 htole64(dmamap->dm_segs[seg].ds_addr);
7250 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_cmdlen =
7251 htole32(dcmdlen | dmamap->dm_segs[seg].ds_len);
7252 KASSERT((dcmdlen & dmamap->dm_segs[seg].ds_len) == 0);
7253 txq->txq_nq_descs[nexttx].nqtx_data.nqtxd_fields = 0;
7254 lasttx = nexttx;
7255
7256 DPRINTF(WM_DEBUG_TX,
7257 ("%s: TX: desc %d: %#" PRIx64 ", "
7258 "len %#04zx\n",
7259 device_xname(sc->sc_dev), nexttx,
7260 (uint64_t)dmamap->dm_segs[seg].ds_addr,
7261 dmamap->dm_segs[seg].ds_len));
7262 }
7263
7264 KASSERT(lasttx != -1);
7265
7266 /*
7267 * Set up the command byte on the last descriptor of
7268 * the packet. If we're in the interrupt delay window,
7269 * delay the interrupt.
7270 */
7271 KASSERT((WTX_CMD_EOP | WTX_CMD_RS) ==
7272 (NQTX_CMD_EOP | NQTX_CMD_RS));
7273 txq->txq_descs[lasttx].wtx_cmdlen |=
7274 htole32(WTX_CMD_EOP | WTX_CMD_RS);
7275
7276 txs->txs_lastdesc = lasttx;
7277
7278 DPRINTF(WM_DEBUG_TX, ("%s: TX: desc %d: cmdlen 0x%08x\n",
7279 device_xname(sc->sc_dev),
7280 lasttx, le32toh(txq->txq_descs[lasttx].wtx_cmdlen)));
7281
7282 /* Sync the descriptors we're using. */
7283 wm_cdtxsync(txq, txq->txq_next, txs->txs_ndesc,
7284 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
7285
7286 /* Give the packet to the chip. */
7287 CSR_WRITE(sc, txq->txq_tdt_reg, nexttx);
7288 sent = true;
7289
7290 DPRINTF(WM_DEBUG_TX,
7291 ("%s: TX: TDT -> %d\n", device_xname(sc->sc_dev), nexttx));
7292
7293 DPRINTF(WM_DEBUG_TX,
7294 ("%s: TX: finished transmitting packet, job %d\n",
7295 device_xname(sc->sc_dev), txq->txq_snext));
7296
7297 /* Advance the tx pointer. */
7298 txq->txq_free -= txs->txs_ndesc;
7299 txq->txq_next = nexttx;
7300
7301 txq->txq_sfree--;
7302 txq->txq_snext = WM_NEXTTXS(txq, txq->txq_snext);
7303
7304 /* Pass the packet to any BPF listeners. */
7305 bpf_mtap(ifp, m0);
7306 }
7307
7308 if (m0 != NULL) {
7309 txq->txq_flags |= WM_TXQ_NO_SPACE;
7310 WM_Q_EVCNT_INCR(txq, txdrop);
7311 DPRINTF(WM_DEBUG_TX, ("%s: TX: error after IFQ_DEQUEUE\n",
7312 __func__));
7313 m_freem(m0);
7314 }
7315
7316 if (txq->txq_sfree == 0 || txq->txq_free <= 2) {
7317 /* No more slots; notify upper layer. */
7318 txq->txq_flags |= WM_TXQ_NO_SPACE;
7319 }
7320
7321 if (sent) {
7322 /* Set a watchdog timer in case the chip flakes out. */
7323 ifp->if_timer = 5;
7324 }
7325 }
7326
7327 static void
7328 wm_deferred_start(struct ifnet *ifp)
7329 {
7330 struct wm_softc *sc = ifp->if_softc;
7331 int qid = 0;
7332
7333 /*
7334 * Try to transmit on all Tx queues. Passing a txq somehow and
7335 * transmitting only on the txq may be better.
7336 */
7337 restart:
7338 WM_CORE_LOCK(sc);
7339 if (sc->sc_core_stopping)
7340 goto out;
7341
7342 for (; qid < sc->sc_nqueues; qid++) {
7343 struct wm_txqueue *txq = &sc->sc_queue[qid].wmq_txq;
7344
7345 if (!mutex_tryenter(txq->txq_lock))
7346 continue;
7347
7348 if (txq->txq_stopping) {
7349 mutex_exit(txq->txq_lock);
7350 continue;
7351 }
7352 WM_CORE_UNLOCK(sc);
7353
7354 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0) {
7355 /* XXX need for ALTQ */
7356 if (qid == 0)
7357 wm_nq_start_locked(ifp);
7358 wm_nq_transmit_locked(ifp, txq);
7359 } else {
7360 /* XXX need for ALTQ */
7361 if (qid == 0)
7362 wm_start_locked(ifp);
7363 wm_transmit_locked(ifp, txq);
7364 }
7365 mutex_exit(txq->txq_lock);
7366
7367 qid++;
7368 goto restart;
7369 }
7370 out:
7371 WM_CORE_UNLOCK(sc);
7372 }
7373
7374 /* Interrupt */
7375
7376 /*
7377 * wm_txeof:
7378 *
7379 * Helper; handle transmit interrupts.
7380 */
7381 static int
7382 wm_txeof(struct wm_softc *sc, struct wm_txqueue *txq)
7383 {
7384 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
7385 struct wm_txsoft *txs;
7386 bool processed = false;
7387 int count = 0;
7388 int i;
7389 uint8_t status;
7390
7391 KASSERT(mutex_owned(txq->txq_lock));
7392
7393 if (txq->txq_stopping)
7394 return 0;
7395
7396 if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
7397 txq->txq_flags &= ~WM_TXQ_NO_SPACE;
7398 else
7399 ifp->if_flags &= ~IFF_OACTIVE;
7400
7401 /*
7402 * Go through the Tx list and free mbufs for those
7403 * frames which have been transmitted.
7404 */
7405 for (i = txq->txq_sdirty; txq->txq_sfree != WM_TXQUEUELEN(txq);
7406 i = WM_NEXTTXS(txq, i), txq->txq_sfree++) {
7407 txs = &txq->txq_soft[i];
7408
7409 DPRINTF(WM_DEBUG_TX, ("%s: TX: checking job %d\n",
7410 device_xname(sc->sc_dev), i));
7411
7412 wm_cdtxsync(txq, txs->txs_firstdesc, txs->txs_ndesc,
7413 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
7414
7415 status =
7416 txq->txq_descs[txs->txs_lastdesc].wtx_fields.wtxu_status;
7417 if ((status & WTX_ST_DD) == 0) {
7418 wm_cdtxsync(txq, txs->txs_lastdesc, 1,
7419 BUS_DMASYNC_PREREAD);
7420 break;
7421 }
7422
7423 processed = true;
7424 count++;
7425 DPRINTF(WM_DEBUG_TX,
7426 ("%s: TX: job %d done: descs %d..%d\n",
7427 device_xname(sc->sc_dev), i, txs->txs_firstdesc,
7428 txs->txs_lastdesc));
7429
7430 /*
7431 * XXX We should probably be using the statistics
7432 * XXX registers, but I don't know if they exist
7433 * XXX on chips before the i82544.
7434 */
7435
7436 #ifdef WM_EVENT_COUNTERS
7437 if (status & WTX_ST_TU)
7438 WM_Q_EVCNT_INCR(txq, tu);
7439 #endif /* WM_EVENT_COUNTERS */
7440
7441 if (status & (WTX_ST_EC | WTX_ST_LC)) {
7442 ifp->if_oerrors++;
7443 if (status & WTX_ST_LC)
7444 log(LOG_WARNING, "%s: late collision\n",
7445 device_xname(sc->sc_dev));
7446 else if (status & WTX_ST_EC) {
7447 ifp->if_collisions += 16;
7448 log(LOG_WARNING, "%s: excessive collisions\n",
7449 device_xname(sc->sc_dev));
7450 }
7451 } else
7452 ifp->if_opackets++;
7453
7454 txq->txq_free += txs->txs_ndesc;
7455 bus_dmamap_sync(sc->sc_dmat, txs->txs_dmamap,
7456 0, txs->txs_dmamap->dm_mapsize, BUS_DMASYNC_POSTWRITE);
7457 bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap);
7458 m_freem(txs->txs_mbuf);
7459 txs->txs_mbuf = NULL;
7460 }
7461
7462 /* Update the dirty transmit buffer pointer. */
7463 txq->txq_sdirty = i;
7464 DPRINTF(WM_DEBUG_TX,
7465 ("%s: TX: txsdirty -> %d\n", device_xname(sc->sc_dev), i));
7466
7467 if (count != 0)
7468 rnd_add_uint32(&sc->rnd_source, count);
7469
7470 /*
7471 * If there are no more pending transmissions, cancel the watchdog
7472 * timer.
7473 */
7474 if (txq->txq_sfree == WM_TXQUEUELEN(txq))
7475 ifp->if_timer = 0;
7476
7477 return processed;
7478 }
7479
7480 static inline uint32_t
7481 wm_rxdesc_get_status(struct wm_rxqueue *rxq, int idx)
7482 {
7483 struct wm_softc *sc = rxq->rxq_sc;
7484
7485 if (sc->sc_type == WM_T_82574)
7486 return EXTRXC_STATUS(rxq->rxq_ext_descs[idx].erx_ctx.erxc_err_stat);
7487 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
7488 return NQRXC_STATUS(rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_err_stat);
7489 else
7490 return rxq->rxq_descs[idx].wrx_status;
7491 }
7492
7493 static inline uint32_t
7494 wm_rxdesc_get_errors(struct wm_rxqueue *rxq, int idx)
7495 {
7496 struct wm_softc *sc = rxq->rxq_sc;
7497
7498 if (sc->sc_type == WM_T_82574)
7499 return EXTRXC_ERROR(rxq->rxq_ext_descs[idx].erx_ctx.erxc_err_stat);
7500 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
7501 return NQRXC_ERROR(rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_err_stat);
7502 else
7503 return rxq->rxq_descs[idx].wrx_errors;
7504 }
7505
7506 static inline uint16_t
7507 wm_rxdesc_get_vlantag(struct wm_rxqueue *rxq, int idx)
7508 {
7509 struct wm_softc *sc = rxq->rxq_sc;
7510
7511 if (sc->sc_type == WM_T_82574)
7512 return rxq->rxq_ext_descs[idx].erx_ctx.erxc_vlan;
7513 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
7514 return rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_vlan;
7515 else
7516 return rxq->rxq_descs[idx].wrx_special;
7517 }
7518
7519 static inline int
7520 wm_rxdesc_get_pktlen(struct wm_rxqueue *rxq, int idx)
7521 {
7522 struct wm_softc *sc = rxq->rxq_sc;
7523
7524 if (sc->sc_type == WM_T_82574)
7525 return rxq->rxq_ext_descs[idx].erx_ctx.erxc_pktlen;
7526 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
7527 return rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_pktlen;
7528 else
7529 return rxq->rxq_descs[idx].wrx_len;
7530 }
7531
7532 #ifdef WM_DEBUG
7533 static inline uint32_t
7534 wm_rxdesc_get_rsshash(struct wm_rxqueue *rxq, int idx)
7535 {
7536 struct wm_softc *sc = rxq->rxq_sc;
7537
7538 if (sc->sc_type == WM_T_82574)
7539 return rxq->rxq_ext_descs[idx].erx_ctx.erxc_rsshash;
7540 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
7541 return rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_rsshash;
7542 else
7543 return 0;
7544 }
7545
7546 static inline uint8_t
7547 wm_rxdesc_get_rsstype(struct wm_rxqueue *rxq, int idx)
7548 {
7549 struct wm_softc *sc = rxq->rxq_sc;
7550
7551 if (sc->sc_type == WM_T_82574)
7552 return EXTRXC_RSS_TYPE(rxq->rxq_ext_descs[idx].erx_ctx.erxc_mrq);
7553 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
7554 return NQRXC_RSS_TYPE(rxq->rxq_nq_descs[idx].nqrx_ctx.nrxc_misc);
7555 else
7556 return 0;
7557 }
7558 #endif /* WM_DEBUG */
7559
7560 static inline bool
7561 wm_rxdesc_is_set_status(struct wm_softc *sc, uint32_t status,
7562 uint32_t legacy_bit, uint32_t ext_bit, uint32_t nq_bit)
7563 {
7564
7565 if (sc->sc_type == WM_T_82574)
7566 return (status & ext_bit) != 0;
7567 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
7568 return (status & nq_bit) != 0;
7569 else
7570 return (status & legacy_bit) != 0;
7571 }
7572
7573 static inline bool
7574 wm_rxdesc_is_set_error(struct wm_softc *sc, uint32_t error,
7575 uint32_t legacy_bit, uint32_t ext_bit, uint32_t nq_bit)
7576 {
7577
7578 if (sc->sc_type == WM_T_82574)
7579 return (error & ext_bit) != 0;
7580 else if ((sc->sc_flags & WM_F_NEWQUEUE) != 0)
7581 return (error & nq_bit) != 0;
7582 else
7583 return (error & legacy_bit) != 0;
7584 }
7585
7586 static inline bool
7587 wm_rxdesc_is_eop(struct wm_rxqueue *rxq, uint32_t status)
7588 {
7589
7590 if (wm_rxdesc_is_set_status(rxq->rxq_sc, status,
7591 WRX_ST_EOP, EXTRXC_STATUS_EOP, NQRXC_STATUS_EOP))
7592 return true;
7593 else
7594 return false;
7595 }
7596
7597 static inline bool
7598 wm_rxdesc_has_errors(struct wm_rxqueue *rxq, uint32_t errors)
7599 {
7600 struct wm_softc *sc = rxq->rxq_sc;
7601
7602 /* XXXX missing error bit for newqueue? */
7603 if (wm_rxdesc_is_set_error(sc, errors,
7604 WRX_ER_CE|WRX_ER_SE|WRX_ER_SEQ|WRX_ER_CXE|WRX_ER_RXE,
7605 EXTRXC_ERROR_CE|EXTRXC_ERROR_SE|EXTRXC_ERROR_SEQ|EXTRXC_ERROR_CXE|EXTRXC_ERROR_RXE,
7606 NQRXC_ERROR_RXE)) {
7607 if (wm_rxdesc_is_set_error(sc, errors, WRX_ER_SE, EXTRXC_ERROR_SE, 0))
7608 log(LOG_WARNING, "%s: symbol error\n",
7609 device_xname(sc->sc_dev));
7610 else if (wm_rxdesc_is_set_error(sc, errors, WRX_ER_SEQ, EXTRXC_ERROR_SEQ, 0))
7611 log(LOG_WARNING, "%s: receive sequence error\n",
7612 device_xname(sc->sc_dev));
7613 else if (wm_rxdesc_is_set_error(sc, errors, WRX_ER_CE, EXTRXC_ERROR_CE, 0))
7614 log(LOG_WARNING, "%s: CRC error\n",
7615 device_xname(sc->sc_dev));
7616 return true;
7617 }
7618
7619 return false;
7620 }
7621
7622 static inline bool
7623 wm_rxdesc_dd(struct wm_rxqueue *rxq, int idx, uint32_t status)
7624 {
7625 struct wm_softc *sc = rxq->rxq_sc;
7626
7627 if (!wm_rxdesc_is_set_status(sc, status, WRX_ST_DD, EXTRXC_STATUS_DD,
7628 NQRXC_STATUS_DD)) {
7629 /* We have processed all of the receive descriptors. */
7630 wm_cdrxsync(rxq, idx, BUS_DMASYNC_PREREAD);
7631 return false;
7632 }
7633
7634 return true;
7635 }
7636
7637 static inline bool
7638 wm_rxdesc_input_vlantag(struct wm_rxqueue *rxq, uint32_t status, uint16_t vlantag,
7639 struct mbuf *m)
7640 {
7641 struct ifnet *ifp = &rxq->rxq_sc->sc_ethercom.ec_if;
7642
7643 if (wm_rxdesc_is_set_status(rxq->rxq_sc, status,
7644 WRX_ST_VP, EXTRXC_STATUS_VP, NQRXC_STATUS_VP)) {
7645 VLAN_INPUT_TAG(ifp, m, le16toh(vlantag), return false);
7646 }
7647
7648 return true;
7649 }
7650
7651 static inline void
7652 wm_rxdesc_ensure_checksum(struct wm_rxqueue *rxq, uint32_t status,
7653 uint32_t errors, struct mbuf *m)
7654 {
7655 struct wm_softc *sc = rxq->rxq_sc;
7656
7657 if (!wm_rxdesc_is_set_status(sc, status, WRX_ST_IXSM, 0, 0)) {
7658 if (wm_rxdesc_is_set_status(sc, status,
7659 WRX_ST_IPCS, EXTRXC_STATUS_IPCS, NQRXC_STATUS_IPCS)) {
7660 WM_Q_EVCNT_INCR(rxq, rxipsum);
7661 m->m_pkthdr.csum_flags |= M_CSUM_IPv4;
7662 if (wm_rxdesc_is_set_error(sc, errors,
7663 WRX_ER_IPE, EXTRXC_ERROR_IPE, NQRXC_ERROR_IPE))
7664 m->m_pkthdr.csum_flags |=
7665 M_CSUM_IPv4_BAD;
7666 }
7667 if (wm_rxdesc_is_set_status(sc, status,
7668 WRX_ST_TCPCS, EXTRXC_STATUS_TCPCS, NQRXC_STATUS_L4I)) {
7669 /*
7670 * Note: we don't know if this was TCP or UDP,
7671 * so we just set both bits, and expect the
7672 * upper layers to deal.
7673 */
7674 WM_Q_EVCNT_INCR(rxq, rxtusum);
7675 m->m_pkthdr.csum_flags |=
7676 M_CSUM_TCPv4 | M_CSUM_UDPv4 |
7677 M_CSUM_TCPv6 | M_CSUM_UDPv6;
7678 if (wm_rxdesc_is_set_error(sc, errors,
7679 WRX_ER_TCPE, EXTRXC_ERROR_TCPE, NQRXC_ERROR_L4E))
7680 m->m_pkthdr.csum_flags |=
7681 M_CSUM_TCP_UDP_BAD;
7682 }
7683 }
7684 }
7685
7686 /*
7687 * wm_rxeof:
7688 *
7689 * Helper; handle receive interrupts.
7690 */
7691 static void
7692 wm_rxeof(struct wm_rxqueue *rxq)
7693 {
7694 struct wm_softc *sc = rxq->rxq_sc;
7695 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
7696 struct wm_rxsoft *rxs;
7697 struct mbuf *m;
7698 int i, len;
7699 int count = 0;
7700 uint32_t status, errors;
7701 uint16_t vlantag;
7702
7703 KASSERT(mutex_owned(rxq->rxq_lock));
7704
7705 for (i = rxq->rxq_ptr;; i = WM_NEXTRX(i)) {
7706 rxs = &rxq->rxq_soft[i];
7707
7708 DPRINTF(WM_DEBUG_RX,
7709 ("%s: RX: checking descriptor %d\n",
7710 device_xname(sc->sc_dev), i));
7711 wm_cdrxsync(rxq, i,BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
7712
7713 status = wm_rxdesc_get_status(rxq, i);
7714 errors = wm_rxdesc_get_errors(rxq, i);
7715 len = le16toh(wm_rxdesc_get_pktlen(rxq, i));
7716 vlantag = wm_rxdesc_get_vlantag(rxq, i);
7717 #ifdef WM_DEBUG
7718 uint32_t rsshash = le32toh(wm_rxdesc_get_rsshash(rxq, i));
7719 uint8_t rsstype = wm_rxdesc_get_rsstype(rxq, i);
7720 #endif
7721
7722 if (!wm_rxdesc_dd(rxq, i, status))
7723 break;
7724
7725 count++;
7726 if (__predict_false(rxq->rxq_discard)) {
7727 DPRINTF(WM_DEBUG_RX,
7728 ("%s: RX: discarding contents of descriptor %d\n",
7729 device_xname(sc->sc_dev), i));
7730 wm_init_rxdesc(rxq, i);
7731 if (wm_rxdesc_is_eop(rxq, status)) {
7732 /* Reset our state. */
7733 DPRINTF(WM_DEBUG_RX,
7734 ("%s: RX: resetting rxdiscard -> 0\n",
7735 device_xname(sc->sc_dev)));
7736 rxq->rxq_discard = 0;
7737 }
7738 continue;
7739 }
7740
7741 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
7742 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_POSTREAD);
7743
7744 m = rxs->rxs_mbuf;
7745
7746 /*
7747 * Add a new receive buffer to the ring, unless of
7748 * course the length is zero. Treat the latter as a
7749 * failed mapping.
7750 */
7751 if ((len == 0) || (wm_add_rxbuf(rxq, i) != 0)) {
7752 /*
7753 * Failed, throw away what we've done so
7754 * far, and discard the rest of the packet.
7755 */
7756 ifp->if_ierrors++;
7757 bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
7758 rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);
7759 wm_init_rxdesc(rxq, i);
7760 if (!wm_rxdesc_is_eop(rxq, status))
7761 rxq->rxq_discard = 1;
7762 if (rxq->rxq_head != NULL)
7763 m_freem(rxq->rxq_head);
7764 WM_RXCHAIN_RESET(rxq);
7765 DPRINTF(WM_DEBUG_RX,
7766 ("%s: RX: Rx buffer allocation failed, "
7767 "dropping packet%s\n", device_xname(sc->sc_dev),
7768 rxq->rxq_discard ? " (discard)" : ""));
7769 continue;
7770 }
7771
7772 m->m_len = len;
7773 rxq->rxq_len += len;
7774 DPRINTF(WM_DEBUG_RX,
7775 ("%s: RX: buffer at %p len %d\n",
7776 device_xname(sc->sc_dev), m->m_data, len));
7777
7778 /* If this is not the end of the packet, keep looking. */
7779 if (!wm_rxdesc_is_eop(rxq, status)) {
7780 WM_RXCHAIN_LINK(rxq, m);
7781 DPRINTF(WM_DEBUG_RX,
7782 ("%s: RX: not yet EOP, rxlen -> %d\n",
7783 device_xname(sc->sc_dev), rxq->rxq_len));
7784 continue;
7785 }
7786
7787 /*
7788 * Okay, we have the entire packet now. The chip is
7789 * configured to include the FCS except I350 and I21[01]
7790 * (not all chips can be configured to strip it),
7791 * so we need to trim it.
7792 * May need to adjust length of previous mbuf in the
7793 * chain if the current mbuf is too short.
7794 * For an eratta, the RCTL_SECRC bit in RCTL register
7795 * is always set in I350, so we don't trim it.
7796 */
7797 if ((sc->sc_type != WM_T_I350) && (sc->sc_type != WM_T_I354)
7798 && (sc->sc_type != WM_T_I210)
7799 && (sc->sc_type != WM_T_I211)) {
7800 if (m->m_len < ETHER_CRC_LEN) {
7801 rxq->rxq_tail->m_len
7802 -= (ETHER_CRC_LEN - m->m_len);
7803 m->m_len = 0;
7804 } else
7805 m->m_len -= ETHER_CRC_LEN;
7806 len = rxq->rxq_len - ETHER_CRC_LEN;
7807 } else
7808 len = rxq->rxq_len;
7809
7810 WM_RXCHAIN_LINK(rxq, m);
7811
7812 *rxq->rxq_tailp = NULL;
7813 m = rxq->rxq_head;
7814
7815 WM_RXCHAIN_RESET(rxq);
7816
7817 DPRINTF(WM_DEBUG_RX,
7818 ("%s: RX: have entire packet, len -> %d\n",
7819 device_xname(sc->sc_dev), len));
7820
7821 /* If an error occurred, update stats and drop the packet. */
7822 if (wm_rxdesc_has_errors(rxq, errors)) {
7823 m_freem(m);
7824 continue;
7825 }
7826
7827 /* No errors. Receive the packet. */
7828 m_set_rcvif(m, ifp);
7829 m->m_pkthdr.len = len;
7830 /*
7831 * TODO
7832 * should be save rsshash and rsstype to this mbuf.
7833 */
7834 DPRINTF(WM_DEBUG_RX,
7835 ("%s: RX: RSS type=%" PRIu8 ", RSS hash=%" PRIu32 "\n",
7836 device_xname(sc->sc_dev), rsstype, rsshash));
7837
7838 /*
7839 * If VLANs are enabled, VLAN packets have been unwrapped
7840 * for us. Associate the tag with the packet.
7841 */
7842 if (!wm_rxdesc_input_vlantag(rxq, status, vlantag, m))
7843 continue;
7844
7845 /* Set up checksum info for this packet. */
7846 wm_rxdesc_ensure_checksum(rxq, status, errors, m);
7847
7848 mutex_exit(rxq->rxq_lock);
7849
7850 /* Pass it on. */
7851 if_percpuq_enqueue(sc->sc_ipq, m);
7852
7853 mutex_enter(rxq->rxq_lock);
7854
7855 if (rxq->rxq_stopping)
7856 break;
7857 }
7858
7859 /* Update the receive pointer. */
7860 rxq->rxq_ptr = i;
7861 if (count != 0)
7862 rnd_add_uint32(&sc->rnd_source, count);
7863
7864 DPRINTF(WM_DEBUG_RX,
7865 ("%s: RX: rxptr -> %d\n", device_xname(sc->sc_dev), i));
7866 }
7867
7868 /*
7869 * wm_linkintr_gmii:
7870 *
7871 * Helper; handle link interrupts for GMII.
7872 */
7873 static void
7874 wm_linkintr_gmii(struct wm_softc *sc, uint32_t icr)
7875 {
7876
7877 KASSERT(WM_CORE_LOCKED(sc));
7878
7879 DPRINTF(WM_DEBUG_LINK, ("%s: %s:\n", device_xname(sc->sc_dev),
7880 __func__));
7881
7882 if (icr & ICR_LSC) {
7883 uint32_t reg;
7884 uint32_t status = CSR_READ(sc, WMREG_STATUS);
7885
7886 if ((sc->sc_type == WM_T_ICH8) && ((status & STATUS_LU) == 0))
7887 wm_gig_downshift_workaround_ich8lan(sc);
7888
7889 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> mii_pollstat\n",
7890 device_xname(sc->sc_dev)));
7891 mii_pollstat(&sc->sc_mii);
7892 if (sc->sc_type == WM_T_82543) {
7893 int miistatus, active;
7894
7895 /*
7896 * With 82543, we need to force speed and
7897 * duplex on the MAC equal to what the PHY
7898 * speed and duplex configuration is.
7899 */
7900 miistatus = sc->sc_mii.mii_media_status;
7901
7902 if (miistatus & IFM_ACTIVE) {
7903 active = sc->sc_mii.mii_media_active;
7904 sc->sc_ctrl &= ~(CTRL_SPEED_MASK | CTRL_FD);
7905 switch (IFM_SUBTYPE(active)) {
7906 case IFM_10_T:
7907 sc->sc_ctrl |= CTRL_SPEED_10;
7908 break;
7909 case IFM_100_TX:
7910 sc->sc_ctrl |= CTRL_SPEED_100;
7911 break;
7912 case IFM_1000_T:
7913 sc->sc_ctrl |= CTRL_SPEED_1000;
7914 break;
7915 default:
7916 /*
7917 * fiber?
7918 * Shoud not enter here.
7919 */
7920 printf("unknown media (%x)\n", active);
7921 break;
7922 }
7923 if (active & IFM_FDX)
7924 sc->sc_ctrl |= CTRL_FD;
7925 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
7926 }
7927 } else if ((sc->sc_type == WM_T_ICH8)
7928 && (sc->sc_phytype == WMPHY_IGP_3)) {
7929 wm_kmrn_lock_loss_workaround_ich8lan(sc);
7930 } else if (sc->sc_type == WM_T_PCH) {
7931 wm_k1_gig_workaround_hv(sc,
7932 ((sc->sc_mii.mii_media_status & IFM_ACTIVE) != 0));
7933 }
7934
7935 if ((sc->sc_phytype == WMPHY_82578)
7936 && (IFM_SUBTYPE(sc->sc_mii.mii_media_active)
7937 == IFM_1000_T)) {
7938
7939 if ((sc->sc_mii.mii_media_status & IFM_ACTIVE) != 0) {
7940 delay(200*1000); /* XXX too big */
7941
7942 /* Link stall fix for link up */
7943 wm_gmii_hv_writereg(sc->sc_dev, 1,
7944 HV_MUX_DATA_CTRL,
7945 HV_MUX_DATA_CTRL_GEN_TO_MAC
7946 | HV_MUX_DATA_CTRL_FORCE_SPEED);
7947 wm_gmii_hv_writereg(sc->sc_dev, 1,
7948 HV_MUX_DATA_CTRL,
7949 HV_MUX_DATA_CTRL_GEN_TO_MAC);
7950 }
7951 }
7952 /*
7953 * I217 Packet Loss issue:
7954 * ensure that FEXTNVM4 Beacon Duration is set correctly
7955 * on power up.
7956 * Set the Beacon Duration for I217 to 8 usec
7957 */
7958 if ((sc->sc_type == WM_T_PCH_LPT)
7959 || (sc->sc_type == WM_T_PCH_SPT)) {
7960 reg = CSR_READ(sc, WMREG_FEXTNVM4);
7961 reg &= ~FEXTNVM4_BEACON_DURATION;
7962 reg |= FEXTNVM4_BEACON_DURATION_8US;
7963 CSR_WRITE(sc, WMREG_FEXTNVM4, reg);
7964 }
7965
7966 /* XXX Work-around I218 hang issue */
7967 /* e1000_k1_workaround_lpt_lp() */
7968
7969 if ((sc->sc_type == WM_T_PCH_LPT)
7970 || (sc->sc_type == WM_T_PCH_SPT)) {
7971 /*
7972 * Set platform power management values for Latency
7973 * Tolerance Reporting (LTR)
7974 */
7975 wm_platform_pm_pch_lpt(sc,
7976 ((sc->sc_mii.mii_media_status & IFM_ACTIVE)
7977 != 0));
7978 }
7979
7980 /* FEXTNVM6 K1-off workaround */
7981 if (sc->sc_type == WM_T_PCH_SPT) {
7982 reg = CSR_READ(sc, WMREG_FEXTNVM6);
7983 if (CSR_READ(sc, WMREG_PCIEANACFG)
7984 & FEXTNVM6_K1_OFF_ENABLE)
7985 reg |= FEXTNVM6_K1_OFF_ENABLE;
7986 else
7987 reg &= ~FEXTNVM6_K1_OFF_ENABLE;
7988 CSR_WRITE(sc, WMREG_FEXTNVM6, reg);
7989 }
7990 } else if (icr & ICR_RXSEQ) {
7991 DPRINTF(WM_DEBUG_LINK, ("%s: LINK Receive sequence error\n",
7992 device_xname(sc->sc_dev)));
7993 }
7994 }
7995
7996 /*
7997 * wm_linkintr_tbi:
7998 *
7999 * Helper; handle link interrupts for TBI mode.
8000 */
8001 static void
8002 wm_linkintr_tbi(struct wm_softc *sc, uint32_t icr)
8003 {
8004 uint32_t status;
8005
8006 DPRINTF(WM_DEBUG_LINK, ("%s: %s:\n", device_xname(sc->sc_dev),
8007 __func__));
8008
8009 status = CSR_READ(sc, WMREG_STATUS);
8010 if (icr & ICR_LSC) {
8011 if (status & STATUS_LU) {
8012 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> up %s\n",
8013 device_xname(sc->sc_dev),
8014 (status & STATUS_FD) ? "FDX" : "HDX"));
8015 /*
8016 * NOTE: CTRL will update TFCE and RFCE automatically,
8017 * so we should update sc->sc_ctrl
8018 */
8019
8020 sc->sc_ctrl = CSR_READ(sc, WMREG_CTRL);
8021 sc->sc_tctl &= ~TCTL_COLD(0x3ff);
8022 sc->sc_fcrtl &= ~FCRTL_XONE;
8023 if (status & STATUS_FD)
8024 sc->sc_tctl |=
8025 TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
8026 else
8027 sc->sc_tctl |=
8028 TCTL_COLD(TX_COLLISION_DISTANCE_HDX);
8029 if (sc->sc_ctrl & CTRL_TFCE)
8030 sc->sc_fcrtl |= FCRTL_XONE;
8031 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
8032 CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ?
8033 WMREG_OLD_FCRTL : WMREG_FCRTL,
8034 sc->sc_fcrtl);
8035 sc->sc_tbi_linkup = 1;
8036 } else {
8037 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: LSC -> down\n",
8038 device_xname(sc->sc_dev)));
8039 sc->sc_tbi_linkup = 0;
8040 }
8041 /* Update LED */
8042 wm_tbi_serdes_set_linkled(sc);
8043 } else if (icr & ICR_RXSEQ) {
8044 DPRINTF(WM_DEBUG_LINK,
8045 ("%s: LINK: Receive sequence error\n",
8046 device_xname(sc->sc_dev)));
8047 }
8048 }
8049
8050 /*
8051 * wm_linkintr_serdes:
8052 *
8053 * Helper; handle link interrupts for TBI mode.
8054 */
8055 static void
8056 wm_linkintr_serdes(struct wm_softc *sc, uint32_t icr)
8057 {
8058 struct mii_data *mii = &sc->sc_mii;
8059 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
8060 uint32_t pcs_adv, pcs_lpab, reg;
8061
8062 DPRINTF(WM_DEBUG_LINK, ("%s: %s:\n", device_xname(sc->sc_dev),
8063 __func__));
8064
8065 if (icr & ICR_LSC) {
8066 /* Check PCS */
8067 reg = CSR_READ(sc, WMREG_PCS_LSTS);
8068 if ((reg & PCS_LSTS_LINKOK) != 0) {
8069 mii->mii_media_status |= IFM_ACTIVE;
8070 sc->sc_tbi_linkup = 1;
8071 } else {
8072 mii->mii_media_status |= IFM_NONE;
8073 sc->sc_tbi_linkup = 0;
8074 wm_tbi_serdes_set_linkled(sc);
8075 return;
8076 }
8077 mii->mii_media_active |= IFM_1000_SX;
8078 if ((reg & PCS_LSTS_FDX) != 0)
8079 mii->mii_media_active |= IFM_FDX;
8080 else
8081 mii->mii_media_active |= IFM_HDX;
8082 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) {
8083 /* Check flow */
8084 reg = CSR_READ(sc, WMREG_PCS_LSTS);
8085 if ((reg & PCS_LSTS_AN_COMP) == 0) {
8086 DPRINTF(WM_DEBUG_LINK,
8087 ("XXX LINKOK but not ACOMP\n"));
8088 return;
8089 }
8090 pcs_adv = CSR_READ(sc, WMREG_PCS_ANADV);
8091 pcs_lpab = CSR_READ(sc, WMREG_PCS_LPAB);
8092 DPRINTF(WM_DEBUG_LINK,
8093 ("XXX AN result %08x, %08x\n", pcs_adv, pcs_lpab));
8094 if ((pcs_adv & TXCW_SYM_PAUSE)
8095 && (pcs_lpab & TXCW_SYM_PAUSE)) {
8096 mii->mii_media_active |= IFM_FLOW
8097 | IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE;
8098 } else if (((pcs_adv & TXCW_SYM_PAUSE) == 0)
8099 && (pcs_adv & TXCW_ASYM_PAUSE)
8100 && (pcs_lpab & TXCW_SYM_PAUSE)
8101 && (pcs_lpab & TXCW_ASYM_PAUSE))
8102 mii->mii_media_active |= IFM_FLOW
8103 | IFM_ETH_TXPAUSE;
8104 else if ((pcs_adv & TXCW_SYM_PAUSE)
8105 && (pcs_adv & TXCW_ASYM_PAUSE)
8106 && ((pcs_lpab & TXCW_SYM_PAUSE) == 0)
8107 && (pcs_lpab & TXCW_ASYM_PAUSE))
8108 mii->mii_media_active |= IFM_FLOW
8109 | IFM_ETH_RXPAUSE;
8110 }
8111 /* Update LED */
8112 wm_tbi_serdes_set_linkled(sc);
8113 } else {
8114 DPRINTF(WM_DEBUG_LINK,
8115 ("%s: LINK: Receive sequence error\n",
8116 device_xname(sc->sc_dev)));
8117 }
8118 }
8119
8120 /*
8121 * wm_linkintr:
8122 *
8123 * Helper; handle link interrupts.
8124 */
8125 static void
8126 wm_linkintr(struct wm_softc *sc, uint32_t icr)
8127 {
8128
8129 KASSERT(WM_CORE_LOCKED(sc));
8130
8131 if (sc->sc_flags & WM_F_HAS_MII)
8132 wm_linkintr_gmii(sc, icr);
8133 else if ((sc->sc_mediatype == WM_MEDIATYPE_SERDES)
8134 && (sc->sc_type >= WM_T_82575))
8135 wm_linkintr_serdes(sc, icr);
8136 else
8137 wm_linkintr_tbi(sc, icr);
8138 }
8139
8140 /*
8141 * wm_intr_legacy:
8142 *
8143 * Interrupt service routine for INTx and MSI.
8144 */
8145 static int
8146 wm_intr_legacy(void *arg)
8147 {
8148 struct wm_softc *sc = arg;
8149 struct wm_txqueue *txq = &sc->sc_queue[0].wmq_txq;
8150 struct wm_rxqueue *rxq = &sc->sc_queue[0].wmq_rxq;
8151 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
8152 uint32_t icr, rndval = 0;
8153 int handled = 0;
8154
8155 DPRINTF(WM_DEBUG_TX,
8156 ("%s: INTx: got intr\n", device_xname(sc->sc_dev)));
8157 while (1 /* CONSTCOND */) {
8158 icr = CSR_READ(sc, WMREG_ICR);
8159 if ((icr & sc->sc_icr) == 0)
8160 break;
8161 if (rndval == 0)
8162 rndval = icr;
8163
8164 mutex_enter(rxq->rxq_lock);
8165
8166 if (rxq->rxq_stopping) {
8167 mutex_exit(rxq->rxq_lock);
8168 break;
8169 }
8170
8171 handled = 1;
8172
8173 #if defined(WM_DEBUG) || defined(WM_EVENT_COUNTERS)
8174 if (icr & (ICR_RXDMT0 | ICR_RXT0)) {
8175 DPRINTF(WM_DEBUG_RX,
8176 ("%s: RX: got Rx intr 0x%08x\n",
8177 device_xname(sc->sc_dev),
8178 icr & (ICR_RXDMT0 | ICR_RXT0)));
8179 WM_Q_EVCNT_INCR(rxq, rxintr);
8180 }
8181 #endif
8182 wm_rxeof(rxq);
8183
8184 mutex_exit(rxq->rxq_lock);
8185 mutex_enter(txq->txq_lock);
8186
8187 if (txq->txq_stopping) {
8188 mutex_exit(txq->txq_lock);
8189 break;
8190 }
8191
8192 #if defined(WM_DEBUG) || defined(WM_EVENT_COUNTERS)
8193 if (icr & ICR_TXDW) {
8194 DPRINTF(WM_DEBUG_TX,
8195 ("%s: TX: got TXDW interrupt\n",
8196 device_xname(sc->sc_dev)));
8197 WM_Q_EVCNT_INCR(txq, txdw);
8198 }
8199 #endif
8200 wm_txeof(sc, txq);
8201
8202 mutex_exit(txq->txq_lock);
8203 WM_CORE_LOCK(sc);
8204
8205 if (sc->sc_core_stopping) {
8206 WM_CORE_UNLOCK(sc);
8207 break;
8208 }
8209
8210 if (icr & (ICR_LSC | ICR_RXSEQ)) {
8211 WM_EVCNT_INCR(&sc->sc_ev_linkintr);
8212 wm_linkintr(sc, icr);
8213 }
8214
8215 WM_CORE_UNLOCK(sc);
8216
8217 if (icr & ICR_RXO) {
8218 #if defined(WM_DEBUG)
8219 log(LOG_WARNING, "%s: Receive overrun\n",
8220 device_xname(sc->sc_dev));
8221 #endif /* defined(WM_DEBUG) */
8222 }
8223 }
8224
8225 rnd_add_uint32(&sc->rnd_source, rndval);
8226
8227 if (handled) {
8228 /* Try to get more packets going. */
8229 if_schedule_deferred_start(ifp);
8230 }
8231
8232 return handled;
8233 }
8234
8235 static int
8236 wm_txrxintr_msix(void *arg)
8237 {
8238 struct wm_queue *wmq = arg;
8239 struct wm_txqueue *txq = &wmq->wmq_txq;
8240 struct wm_rxqueue *rxq = &wmq->wmq_rxq;
8241 struct wm_softc *sc = txq->txq_sc;
8242 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
8243
8244 KASSERT(wmq->wmq_intr_idx == wmq->wmq_id);
8245
8246 DPRINTF(WM_DEBUG_TX,
8247 ("%s: TX: got Tx intr\n", device_xname(sc->sc_dev)));
8248
8249 if (sc->sc_type == WM_T_82574)
8250 CSR_WRITE(sc, WMREG_IMC, ICR_TXQ(wmq->wmq_id) | ICR_RXQ(wmq->wmq_id));
8251 else if (sc->sc_type == WM_T_82575)
8252 CSR_WRITE(sc, WMREG_EIMC, EITR_TX_QUEUE(wmq->wmq_id) | EITR_RX_QUEUE(wmq->wmq_id));
8253 else
8254 CSR_WRITE(sc, WMREG_EIMC, 1 << wmq->wmq_intr_idx);
8255
8256 mutex_enter(txq->txq_lock);
8257
8258 if (txq->txq_stopping) {
8259 mutex_exit(txq->txq_lock);
8260 return 0;
8261 }
8262
8263 WM_Q_EVCNT_INCR(txq, txdw);
8264 wm_txeof(sc, txq);
8265
8266 /* Try to get more packets going. */
8267 if (pcq_peek(txq->txq_interq) != NULL)
8268 if_schedule_deferred_start(ifp);
8269 /*
8270 * There are still some upper layer processing which call
8271 * ifp->if_start(). e.g. ALTQ
8272 */
8273 if (wmq->wmq_id == 0)
8274 if_schedule_deferred_start(ifp);
8275
8276 mutex_exit(txq->txq_lock);
8277
8278 DPRINTF(WM_DEBUG_RX,
8279 ("%s: RX: got Rx intr\n", device_xname(sc->sc_dev)));
8280 mutex_enter(rxq->rxq_lock);
8281
8282 if (rxq->rxq_stopping) {
8283 mutex_exit(rxq->rxq_lock);
8284 return 0;
8285 }
8286
8287 WM_Q_EVCNT_INCR(rxq, rxintr);
8288 wm_rxeof(rxq);
8289 mutex_exit(rxq->rxq_lock);
8290
8291 if (sc->sc_type == WM_T_82574)
8292 CSR_WRITE(sc, WMREG_IMS, ICR_TXQ(wmq->wmq_id) | ICR_RXQ(wmq->wmq_id));
8293 else if (sc->sc_type == WM_T_82575)
8294 CSR_WRITE(sc, WMREG_EIMS, EITR_TX_QUEUE(wmq->wmq_id) | EITR_RX_QUEUE(wmq->wmq_id));
8295 else
8296 CSR_WRITE(sc, WMREG_EIMS, 1 << wmq->wmq_intr_idx);
8297
8298 return 1;
8299 }
8300
8301 /*
8302 * wm_linkintr_msix:
8303 *
8304 * Interrupt service routine for link status change for MSI-X.
8305 */
8306 static int
8307 wm_linkintr_msix(void *arg)
8308 {
8309 struct wm_softc *sc = arg;
8310 uint32_t reg;
8311
8312 DPRINTF(WM_DEBUG_LINK,
8313 ("%s: LINK: got link intr\n", device_xname(sc->sc_dev)));
8314
8315 reg = CSR_READ(sc, WMREG_ICR);
8316 WM_CORE_LOCK(sc);
8317 if ((sc->sc_core_stopping) || ((reg & ICR_LSC) == 0))
8318 goto out;
8319
8320 WM_EVCNT_INCR(&sc->sc_ev_linkintr);
8321 wm_linkintr(sc, ICR_LSC);
8322
8323 out:
8324 WM_CORE_UNLOCK(sc);
8325
8326 if (sc->sc_type == WM_T_82574)
8327 CSR_WRITE(sc, WMREG_IMS, ICR_OTHER | ICR_LSC);
8328 else if (sc->sc_type == WM_T_82575)
8329 CSR_WRITE(sc, WMREG_EIMS, EITR_OTHER);
8330 else
8331 CSR_WRITE(sc, WMREG_EIMS, 1 << sc->sc_link_intr_idx);
8332
8333 return 1;
8334 }
8335
8336 /*
8337 * Media related.
8338 * GMII, SGMII, TBI (and SERDES)
8339 */
8340
8341 /* Common */
8342
8343 /*
8344 * wm_tbi_serdes_set_linkled:
8345 *
8346 * Update the link LED on TBI and SERDES devices.
8347 */
8348 static void
8349 wm_tbi_serdes_set_linkled(struct wm_softc *sc)
8350 {
8351
8352 if (sc->sc_tbi_linkup)
8353 sc->sc_ctrl |= CTRL_SWDPIN(0);
8354 else
8355 sc->sc_ctrl &= ~CTRL_SWDPIN(0);
8356
8357 /* 82540 or newer devices are active low */
8358 sc->sc_ctrl ^= (sc->sc_type >= WM_T_82540) ? CTRL_SWDPIN(0) : 0;
8359
8360 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
8361 }
8362
8363 /* GMII related */
8364
8365 /*
8366 * wm_gmii_reset:
8367 *
8368 * Reset the PHY.
8369 */
8370 static void
8371 wm_gmii_reset(struct wm_softc *sc)
8372 {
8373 uint32_t reg;
8374 int rv;
8375
8376 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
8377 device_xname(sc->sc_dev), __func__));
8378
8379 rv = sc->phy.acquire(sc);
8380 if (rv != 0) {
8381 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
8382 __func__);
8383 return;
8384 }
8385
8386 switch (sc->sc_type) {
8387 case WM_T_82542_2_0:
8388 case WM_T_82542_2_1:
8389 /* null */
8390 break;
8391 case WM_T_82543:
8392 /*
8393 * With 82543, we need to force speed and duplex on the MAC
8394 * equal to what the PHY speed and duplex configuration is.
8395 * In addition, we need to perform a hardware reset on the PHY
8396 * to take it out of reset.
8397 */
8398 sc->sc_ctrl |= CTRL_FRCSPD | CTRL_FRCFDX;
8399 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
8400
8401 /* The PHY reset pin is active-low. */
8402 reg = CSR_READ(sc, WMREG_CTRL_EXT);
8403 reg &= ~((CTRL_EXT_SWDPIO_MASK << CTRL_EXT_SWDPIO_SHIFT) |
8404 CTRL_EXT_SWDPIN(4));
8405 reg |= CTRL_EXT_SWDPIO(4);
8406
8407 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
8408 CSR_WRITE_FLUSH(sc);
8409 delay(10*1000);
8410
8411 CSR_WRITE(sc, WMREG_CTRL_EXT, reg | CTRL_EXT_SWDPIN(4));
8412 CSR_WRITE_FLUSH(sc);
8413 delay(150);
8414 #if 0
8415 sc->sc_ctrl_ext = reg | CTRL_EXT_SWDPIN(4);
8416 #endif
8417 delay(20*1000); /* XXX extra delay to get PHY ID? */
8418 break;
8419 case WM_T_82544: /* reset 10000us */
8420 case WM_T_82540:
8421 case WM_T_82545:
8422 case WM_T_82545_3:
8423 case WM_T_82546:
8424 case WM_T_82546_3:
8425 case WM_T_82541:
8426 case WM_T_82541_2:
8427 case WM_T_82547:
8428 case WM_T_82547_2:
8429 case WM_T_82571: /* reset 100us */
8430 case WM_T_82572:
8431 case WM_T_82573:
8432 case WM_T_82574:
8433 case WM_T_82575:
8434 case WM_T_82576:
8435 case WM_T_82580:
8436 case WM_T_I350:
8437 case WM_T_I354:
8438 case WM_T_I210:
8439 case WM_T_I211:
8440 case WM_T_82583:
8441 case WM_T_80003:
8442 /* generic reset */
8443 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET);
8444 CSR_WRITE_FLUSH(sc);
8445 delay(20000);
8446 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
8447 CSR_WRITE_FLUSH(sc);
8448 delay(20000);
8449
8450 if ((sc->sc_type == WM_T_82541)
8451 || (sc->sc_type == WM_T_82541_2)
8452 || (sc->sc_type == WM_T_82547)
8453 || (sc->sc_type == WM_T_82547_2)) {
8454 /* workaround for igp are done in igp_reset() */
8455 /* XXX add code to set LED after phy reset */
8456 }
8457 break;
8458 case WM_T_ICH8:
8459 case WM_T_ICH9:
8460 case WM_T_ICH10:
8461 case WM_T_PCH:
8462 case WM_T_PCH2:
8463 case WM_T_PCH_LPT:
8464 case WM_T_PCH_SPT:
8465 /* generic reset */
8466 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET);
8467 CSR_WRITE_FLUSH(sc);
8468 delay(100);
8469 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
8470 CSR_WRITE_FLUSH(sc);
8471 delay(150);
8472 break;
8473 default:
8474 panic("%s: %s: unknown type\n", device_xname(sc->sc_dev),
8475 __func__);
8476 break;
8477 }
8478
8479 sc->phy.release(sc);
8480
8481 /* get_cfg_done */
8482 wm_get_cfg_done(sc);
8483
8484 /* extra setup */
8485 switch (sc->sc_type) {
8486 case WM_T_82542_2_0:
8487 case WM_T_82542_2_1:
8488 case WM_T_82543:
8489 case WM_T_82544:
8490 case WM_T_82540:
8491 case WM_T_82545:
8492 case WM_T_82545_3:
8493 case WM_T_82546:
8494 case WM_T_82546_3:
8495 case WM_T_82541_2:
8496 case WM_T_82547_2:
8497 case WM_T_82571:
8498 case WM_T_82572:
8499 case WM_T_82573:
8500 case WM_T_82575:
8501 case WM_T_82576:
8502 case WM_T_82580:
8503 case WM_T_I350:
8504 case WM_T_I354:
8505 case WM_T_I210:
8506 case WM_T_I211:
8507 case WM_T_80003:
8508 /* null */
8509 break;
8510 case WM_T_82574:
8511 case WM_T_82583:
8512 wm_lplu_d0_disable(sc);
8513 break;
8514 case WM_T_82541:
8515 case WM_T_82547:
8516 /* XXX Configure actively LED after PHY reset */
8517 break;
8518 case WM_T_ICH8:
8519 case WM_T_ICH9:
8520 case WM_T_ICH10:
8521 case WM_T_PCH:
8522 case WM_T_PCH2:
8523 case WM_T_PCH_LPT:
8524 case WM_T_PCH_SPT:
8525 /* Allow time for h/w to get to a quiescent state afer reset */
8526 delay(10*1000);
8527
8528 if (sc->sc_type == WM_T_PCH)
8529 wm_hv_phy_workaround_ich8lan(sc);
8530
8531 if (sc->sc_type == WM_T_PCH2)
8532 wm_lv_phy_workaround_ich8lan(sc);
8533
8534 /* Clear the host wakeup bit after lcd reset */
8535 if (sc->sc_type >= WM_T_PCH) {
8536 reg = wm_gmii_hv_readreg(sc->sc_dev, 2,
8537 BM_PORT_GEN_CFG);
8538 reg &= ~BM_WUC_HOST_WU_BIT;
8539 wm_gmii_hv_writereg(sc->sc_dev, 2,
8540 BM_PORT_GEN_CFG, reg);
8541 }
8542
8543 /*
8544 * XXX Configure the LCD with th extended configuration region
8545 * in NVM
8546 */
8547
8548 /* Disable D0 LPLU. */
8549 if (sc->sc_type >= WM_T_PCH) /* PCH* */
8550 wm_lplu_d0_disable_pch(sc);
8551 else
8552 wm_lplu_d0_disable(sc); /* ICH* */
8553 break;
8554 default:
8555 panic("%s: unknown type\n", __func__);
8556 break;
8557 }
8558 }
8559
8560 /*
8561 * Setup sc_phytype and mii_{read|write}reg.
8562 *
8563 * To identify PHY type, correct read/write function should be selected.
8564 * To select correct read/write function, PCI ID or MAC type are required
8565 * without accessing PHY registers.
8566 *
8567 * On the first call of this function, PHY ID is not known yet. Check
8568 * PCI ID or MAC type. The list of the PCI ID may not be perfect, so the
8569 * result might be incorrect.
8570 *
8571 * In the second call, PHY OUI and model is used to identify PHY type.
8572 * It might not be perfpect because of the lack of compared entry, but it
8573 * would be better than the first call.
8574 *
8575 * If the detected new result and previous assumption is different,
8576 * diagnous message will be printed.
8577 */
8578 static void
8579 wm_gmii_setup_phytype(struct wm_softc *sc, uint32_t phy_oui,
8580 uint16_t phy_model)
8581 {
8582 device_t dev = sc->sc_dev;
8583 struct mii_data *mii = &sc->sc_mii;
8584 uint16_t new_phytype = WMPHY_UNKNOWN;
8585 uint16_t doubt_phytype = WMPHY_UNKNOWN;
8586 mii_readreg_t new_readreg;
8587 mii_writereg_t new_writereg;
8588
8589 if (mii->mii_readreg == NULL) {
8590 /*
8591 * This is the first call of this function. For ICH and PCH
8592 * variants, it's difficult to determine the PHY access method
8593 * by sc_type, so use the PCI product ID for some devices.
8594 */
8595
8596 switch (sc->sc_pcidevid) {
8597 case PCI_PRODUCT_INTEL_PCH_M_LM:
8598 case PCI_PRODUCT_INTEL_PCH_M_LC:
8599 /* 82577 */
8600 new_phytype = WMPHY_82577;
8601 break;
8602 case PCI_PRODUCT_INTEL_PCH_D_DM:
8603 case PCI_PRODUCT_INTEL_PCH_D_DC:
8604 /* 82578 */
8605 new_phytype = WMPHY_82578;
8606 break;
8607 case PCI_PRODUCT_INTEL_PCH2_LV_LM:
8608 case PCI_PRODUCT_INTEL_PCH2_LV_V:
8609 /* 82579 */
8610 new_phytype = WMPHY_82579;
8611 break;
8612 case PCI_PRODUCT_INTEL_82801H_82567V_3:
8613 case PCI_PRODUCT_INTEL_82801I_BM:
8614 case PCI_PRODUCT_INTEL_82801I_IGP_M_AMT: /* Not IGP but BM */
8615 case PCI_PRODUCT_INTEL_82801J_R_BM_LM:
8616 case PCI_PRODUCT_INTEL_82801J_R_BM_LF:
8617 case PCI_PRODUCT_INTEL_82801J_D_BM_LM:
8618 case PCI_PRODUCT_INTEL_82801J_D_BM_LF:
8619 case PCI_PRODUCT_INTEL_82801J_R_BM_V:
8620 /* ICH8, 9, 10 with 82567 */
8621 new_phytype = WMPHY_BM;
8622 break;
8623 default:
8624 break;
8625 }
8626 } else {
8627 /* It's not the first call. Use PHY OUI and model */
8628 switch (phy_oui) {
8629 case MII_OUI_ATHEROS: /* XXX ??? */
8630 switch (phy_model) {
8631 case 0x0004: /* XXX */
8632 new_phytype = WMPHY_82578;
8633 break;
8634 default:
8635 break;
8636 }
8637 break;
8638 case MII_OUI_xxMARVELL:
8639 switch (phy_model) {
8640 case MII_MODEL_xxMARVELL_I210:
8641 new_phytype = WMPHY_I210;
8642 break;
8643 case MII_MODEL_xxMARVELL_E1011:
8644 case MII_MODEL_xxMARVELL_E1000_3:
8645 case MII_MODEL_xxMARVELL_E1000_5:
8646 case MII_MODEL_xxMARVELL_E1112:
8647 new_phytype = WMPHY_M88;
8648 break;
8649 case MII_MODEL_xxMARVELL_E1149:
8650 new_phytype = WMPHY_BM;
8651 break;
8652 case MII_MODEL_xxMARVELL_E1111:
8653 case MII_MODEL_xxMARVELL_I347:
8654 case MII_MODEL_xxMARVELL_E1512:
8655 case MII_MODEL_xxMARVELL_E1340M:
8656 case MII_MODEL_xxMARVELL_E1543:
8657 new_phytype = WMPHY_M88;
8658 break;
8659 case MII_MODEL_xxMARVELL_I82563:
8660 new_phytype = WMPHY_GG82563;
8661 break;
8662 default:
8663 break;
8664 }
8665 break;
8666 case MII_OUI_INTEL:
8667 switch (phy_model) {
8668 case MII_MODEL_INTEL_I82577:
8669 new_phytype = WMPHY_82577;
8670 break;
8671 case MII_MODEL_INTEL_I82579:
8672 new_phytype = WMPHY_82579;
8673 break;
8674 case MII_MODEL_INTEL_I217:
8675 new_phytype = WMPHY_I217;
8676 break;
8677 case MII_MODEL_INTEL_I82580:
8678 case MII_MODEL_INTEL_I350:
8679 new_phytype = WMPHY_82580;
8680 break;
8681 default:
8682 break;
8683 }
8684 break;
8685 case MII_OUI_yyINTEL:
8686 switch (phy_model) {
8687 case MII_MODEL_yyINTEL_I82562G:
8688 case MII_MODEL_yyINTEL_I82562EM:
8689 case MII_MODEL_yyINTEL_I82562ET:
8690 new_phytype = WMPHY_IFE;
8691 break;
8692 case MII_MODEL_yyINTEL_IGP01E1000:
8693 new_phytype = WMPHY_IGP;
8694 break;
8695 case MII_MODEL_yyINTEL_I82566:
8696 new_phytype = WMPHY_IGP_3;
8697 break;
8698 default:
8699 break;
8700 }
8701 break;
8702 default:
8703 break;
8704 }
8705 if (new_phytype == WMPHY_UNKNOWN)
8706 aprint_verbose_dev(dev, "%s: unknown PHY model\n",
8707 __func__);
8708
8709 if ((sc->sc_phytype != WMPHY_UNKNOWN)
8710 && (sc->sc_phytype != new_phytype )) {
8711 aprint_error_dev(dev, "Previously assumed PHY type(%u)"
8712 "was incorrect. PHY type from PHY ID = %u\n",
8713 sc->sc_phytype, new_phytype);
8714 }
8715 }
8716
8717 /* Next, use sc->sc_flags and sc->sc_type to set read/write funcs. */
8718 if (((sc->sc_flags & WM_F_SGMII) != 0) && !wm_sgmii_uses_mdio(sc)) {
8719 /* SGMII */
8720 new_readreg = wm_sgmii_readreg;
8721 new_writereg = wm_sgmii_writereg;
8722 } else if ((sc->sc_type == WM_T_82574) || (sc->sc_type == WM_T_82583)){
8723 /* BM2 (phyaddr == 1) */
8724 if ((sc->sc_phytype != WMPHY_UNKNOWN)
8725 && (new_phytype != WMPHY_BM)
8726 && (new_phytype != WMPHY_UNKNOWN))
8727 doubt_phytype = new_phytype;
8728 new_phytype = WMPHY_BM;
8729 new_readreg = wm_gmii_bm_readreg;
8730 new_writereg = wm_gmii_bm_writereg;
8731 } else if (sc->sc_type >= WM_T_PCH) {
8732 /* All PCH* use _hv_ */
8733 new_readreg = wm_gmii_hv_readreg;
8734 new_writereg = wm_gmii_hv_writereg;
8735 } else if (sc->sc_type >= WM_T_ICH8) {
8736 /* non-82567 ICH8, 9 and 10 */
8737 new_readreg = wm_gmii_i82544_readreg;
8738 new_writereg = wm_gmii_i82544_writereg;
8739 } else if (sc->sc_type >= WM_T_80003) {
8740 /* 80003 */
8741 if ((sc->sc_phytype != WMPHY_UNKNOWN)
8742 && (new_phytype != WMPHY_GG82563)
8743 && (new_phytype != WMPHY_UNKNOWN))
8744 doubt_phytype = new_phytype;
8745 new_phytype = WMPHY_GG82563;
8746 new_readreg = wm_gmii_i80003_readreg;
8747 new_writereg = wm_gmii_i80003_writereg;
8748 } else if (sc->sc_type >= WM_T_I210) {
8749 /* I210 and I211 */
8750 if ((sc->sc_phytype != WMPHY_UNKNOWN)
8751 && (new_phytype != WMPHY_I210)
8752 && (new_phytype != WMPHY_UNKNOWN))
8753 doubt_phytype = new_phytype;
8754 new_phytype = WMPHY_I210;
8755 new_readreg = wm_gmii_gs40g_readreg;
8756 new_writereg = wm_gmii_gs40g_writereg;
8757 } else if (sc->sc_type >= WM_T_82580) {
8758 /* 82580, I350 and I354 */
8759 new_readreg = wm_gmii_82580_readreg;
8760 new_writereg = wm_gmii_82580_writereg;
8761 } else if (sc->sc_type >= WM_T_82544) {
8762 /* 82544, 0, [56], [17], 8257[1234] and 82583 */
8763 new_readreg = wm_gmii_i82544_readreg;
8764 new_writereg = wm_gmii_i82544_writereg;
8765 } else {
8766 new_readreg = wm_gmii_i82543_readreg;
8767 new_writereg = wm_gmii_i82543_writereg;
8768 }
8769
8770 if (new_phytype == WMPHY_BM) {
8771 /* All BM use _bm_ */
8772 new_readreg = wm_gmii_bm_readreg;
8773 new_writereg = wm_gmii_bm_writereg;
8774 }
8775 if ((sc->sc_type >= WM_T_PCH) && (sc->sc_type <= WM_T_PCH_SPT)) {
8776 /* All PCH* use _hv_ */
8777 new_readreg = wm_gmii_hv_readreg;
8778 new_writereg = wm_gmii_hv_writereg;
8779 }
8780
8781 /* Diag output */
8782 if (doubt_phytype != WMPHY_UNKNOWN)
8783 aprint_error_dev(dev, "Assumed new PHY type was "
8784 "incorrect. old = %u, new = %u\n", sc->sc_phytype,
8785 new_phytype);
8786 else if ((sc->sc_phytype != WMPHY_UNKNOWN)
8787 && (sc->sc_phytype != new_phytype ))
8788 aprint_error_dev(dev, "Previously assumed PHY type(%u)"
8789 "was incorrect. New PHY type = %u\n",
8790 sc->sc_phytype, new_phytype);
8791
8792 if ((mii->mii_readreg != NULL) && (new_phytype == WMPHY_UNKNOWN))
8793 aprint_error_dev(dev, "PHY type is still unknown.\n");
8794
8795 if ((mii->mii_readreg != NULL) && (mii->mii_readreg != new_readreg))
8796 aprint_error_dev(dev, "Previously assumed PHY read/write "
8797 "function was incorrect.\n");
8798
8799 /* Update now */
8800 sc->sc_phytype = new_phytype;
8801 mii->mii_readreg = new_readreg;
8802 mii->mii_writereg = new_writereg;
8803 }
8804
8805 /*
8806 * wm_get_phy_id_82575:
8807 *
8808 * Return PHY ID. Return -1 if it failed.
8809 */
8810 static int
8811 wm_get_phy_id_82575(struct wm_softc *sc)
8812 {
8813 uint32_t reg;
8814 int phyid = -1;
8815
8816 /* XXX */
8817 if ((sc->sc_flags & WM_F_SGMII) == 0)
8818 return -1;
8819
8820 if (wm_sgmii_uses_mdio(sc)) {
8821 switch (sc->sc_type) {
8822 case WM_T_82575:
8823 case WM_T_82576:
8824 reg = CSR_READ(sc, WMREG_MDIC);
8825 phyid = (reg & MDIC_PHY_MASK) >> MDIC_PHY_SHIFT;
8826 break;
8827 case WM_T_82580:
8828 case WM_T_I350:
8829 case WM_T_I354:
8830 case WM_T_I210:
8831 case WM_T_I211:
8832 reg = CSR_READ(sc, WMREG_MDICNFG);
8833 phyid = (reg & MDICNFG_PHY_MASK) >> MDICNFG_PHY_SHIFT;
8834 break;
8835 default:
8836 return -1;
8837 }
8838 }
8839
8840 return phyid;
8841 }
8842
8843
8844 /*
8845 * wm_gmii_mediainit:
8846 *
8847 * Initialize media for use on 1000BASE-T devices.
8848 */
8849 static void
8850 wm_gmii_mediainit(struct wm_softc *sc, pci_product_id_t prodid)
8851 {
8852 device_t dev = sc->sc_dev;
8853 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
8854 struct mii_data *mii = &sc->sc_mii;
8855 uint32_t reg;
8856
8857 DPRINTF(WM_DEBUG_GMII, ("%s: %s called\n",
8858 device_xname(sc->sc_dev), __func__));
8859
8860 /* We have GMII. */
8861 sc->sc_flags |= WM_F_HAS_MII;
8862
8863 if (sc->sc_type == WM_T_80003)
8864 sc->sc_tipg = TIPG_1000T_80003_DFLT;
8865 else
8866 sc->sc_tipg = TIPG_1000T_DFLT;
8867
8868 /* XXX Not for I354? FreeBSD's e1000_82575.c doesn't include it */
8869 if ((sc->sc_type == WM_T_82580)
8870 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I210)
8871 || (sc->sc_type == WM_T_I211)) {
8872 reg = CSR_READ(sc, WMREG_PHPM);
8873 reg &= ~PHPM_GO_LINK_D;
8874 CSR_WRITE(sc, WMREG_PHPM, reg);
8875 }
8876
8877 /*
8878 * Let the chip set speed/duplex on its own based on
8879 * signals from the PHY.
8880 * XXXbouyer - I'm not sure this is right for the 80003,
8881 * the em driver only sets CTRL_SLU here - but it seems to work.
8882 */
8883 sc->sc_ctrl |= CTRL_SLU;
8884 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
8885
8886 /* Initialize our media structures and probe the GMII. */
8887 mii->mii_ifp = ifp;
8888
8889 /*
8890 * The first call of wm_mii_setup_phytype. The result might be
8891 * incorrect.
8892 */
8893 wm_gmii_setup_phytype(sc, 0, 0);
8894
8895 mii->mii_statchg = wm_gmii_statchg;
8896
8897 /* get PHY control from SMBus to PCIe */
8898 if ((sc->sc_type == WM_T_PCH) || (sc->sc_type == WM_T_PCH2)
8899 || (sc->sc_type == WM_T_PCH_LPT) || (sc->sc_type == WM_T_PCH_SPT))
8900 wm_smbustopci(sc);
8901
8902 wm_gmii_reset(sc);
8903
8904 sc->sc_ethercom.ec_mii = &sc->sc_mii;
8905 ifmedia_init(&mii->mii_media, IFM_IMASK, wm_gmii_mediachange,
8906 wm_gmii_mediastatus);
8907
8908 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576)
8909 || (sc->sc_type == WM_T_82580)
8910 || (sc->sc_type == WM_T_I350) || (sc->sc_type == WM_T_I354)
8911 || (sc->sc_type == WM_T_I210) || (sc->sc_type == WM_T_I211)) {
8912 if ((sc->sc_flags & WM_F_SGMII) == 0) {
8913 /* Attach only one port */
8914 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, 1,
8915 MII_OFFSET_ANY, MIIF_DOPAUSE);
8916 } else {
8917 int i, id;
8918 uint32_t ctrl_ext;
8919
8920 id = wm_get_phy_id_82575(sc);
8921 if (id != -1) {
8922 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff,
8923 id, MII_OFFSET_ANY, MIIF_DOPAUSE);
8924 }
8925 if ((id == -1)
8926 || (LIST_FIRST(&mii->mii_phys) == NULL)) {
8927 /* Power on sgmii phy if it is disabled */
8928 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT);
8929 CSR_WRITE(sc, WMREG_CTRL_EXT,
8930 ctrl_ext &~ CTRL_EXT_SWDPIN(3));
8931 CSR_WRITE_FLUSH(sc);
8932 delay(300*1000); /* XXX too long */
8933
8934 /* from 1 to 8 */
8935 for (i = 1; i < 8; i++)
8936 mii_attach(sc->sc_dev, &sc->sc_mii,
8937 0xffffffff, i, MII_OFFSET_ANY,
8938 MIIF_DOPAUSE);
8939
8940 /* restore previous sfp cage power state */
8941 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext);
8942 }
8943 }
8944 } else {
8945 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
8946 MII_OFFSET_ANY, MIIF_DOPAUSE);
8947 }
8948
8949 /*
8950 * If the MAC is PCH2 or PCH_LPT and failed to detect MII PHY, call
8951 * wm_set_mdio_slow_mode_hv() for a workaround and retry.
8952 */
8953 if (((sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)) &&
8954 (LIST_FIRST(&mii->mii_phys) == NULL)) {
8955 wm_set_mdio_slow_mode_hv(sc);
8956 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
8957 MII_OFFSET_ANY, MIIF_DOPAUSE);
8958 }
8959
8960 /*
8961 * (For ICH8 variants)
8962 * If PHY detection failed, use BM's r/w function and retry.
8963 */
8964 if (LIST_FIRST(&mii->mii_phys) == NULL) {
8965 /* if failed, retry with *_bm_* */
8966 aprint_verbose_dev(dev, "Assumed PHY access function "
8967 "(type = %d) might be incorrect. Use BM and retry.\n",
8968 sc->sc_phytype);
8969 sc->sc_phytype = WMPHY_BM;
8970 mii->mii_readreg = wm_gmii_bm_readreg;
8971 mii->mii_writereg = wm_gmii_bm_writereg;
8972
8973 mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY,
8974 MII_OFFSET_ANY, MIIF_DOPAUSE);
8975 }
8976
8977 if (LIST_FIRST(&mii->mii_phys) == NULL) {
8978 /* Any PHY wasn't find */
8979 ifmedia_add(&mii->mii_media, IFM_ETHER | IFM_NONE, 0, NULL);
8980 ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_NONE);
8981 sc->sc_phytype = WMPHY_NONE;
8982 } else {
8983 struct mii_softc *child = LIST_FIRST(&mii->mii_phys);
8984
8985 /*
8986 * PHY Found! Check PHY type again by the second call of
8987 * wm_mii_setup_phytype.
8988 */
8989 wm_gmii_setup_phytype(sc, child->mii_mpd_oui,
8990 child->mii_mpd_model);
8991
8992 ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO);
8993 }
8994 }
8995
8996 /*
8997 * wm_gmii_mediachange: [ifmedia interface function]
8998 *
8999 * Set hardware to newly-selected media on a 1000BASE-T device.
9000 */
9001 static int
9002 wm_gmii_mediachange(struct ifnet *ifp)
9003 {
9004 struct wm_softc *sc = ifp->if_softc;
9005 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
9006 int rc;
9007
9008 DPRINTF(WM_DEBUG_GMII, ("%s: %s called\n",
9009 device_xname(sc->sc_dev), __func__));
9010 if ((ifp->if_flags & IFF_UP) == 0)
9011 return 0;
9012
9013 sc->sc_ctrl &= ~(CTRL_SPEED_MASK | CTRL_FD);
9014 sc->sc_ctrl |= CTRL_SLU;
9015 if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)
9016 || (sc->sc_type > WM_T_82543)) {
9017 sc->sc_ctrl &= ~(CTRL_FRCSPD | CTRL_FRCFDX);
9018 } else {
9019 sc->sc_ctrl &= ~CTRL_ASDE;
9020 sc->sc_ctrl |= CTRL_FRCSPD | CTRL_FRCFDX;
9021 if (ife->ifm_media & IFM_FDX)
9022 sc->sc_ctrl |= CTRL_FD;
9023 switch (IFM_SUBTYPE(ife->ifm_media)) {
9024 case IFM_10_T:
9025 sc->sc_ctrl |= CTRL_SPEED_10;
9026 break;
9027 case IFM_100_TX:
9028 sc->sc_ctrl |= CTRL_SPEED_100;
9029 break;
9030 case IFM_1000_T:
9031 sc->sc_ctrl |= CTRL_SPEED_1000;
9032 break;
9033 default:
9034 panic("wm_gmii_mediachange: bad media 0x%x",
9035 ife->ifm_media);
9036 }
9037 }
9038 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
9039 if (sc->sc_type <= WM_T_82543)
9040 wm_gmii_reset(sc);
9041
9042 if ((rc = mii_mediachg(&sc->sc_mii)) == ENXIO)
9043 return 0;
9044 return rc;
9045 }
9046
9047 /*
9048 * wm_gmii_mediastatus: [ifmedia interface function]
9049 *
9050 * Get the current interface media status on a 1000BASE-T device.
9051 */
9052 static void
9053 wm_gmii_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
9054 {
9055 struct wm_softc *sc = ifp->if_softc;
9056
9057 ether_mediastatus(ifp, ifmr);
9058 ifmr->ifm_active = (ifmr->ifm_active & ~IFM_ETH_FMASK)
9059 | sc->sc_flowflags;
9060 }
9061
9062 #define MDI_IO CTRL_SWDPIN(2)
9063 #define MDI_DIR CTRL_SWDPIO(2) /* host -> PHY */
9064 #define MDI_CLK CTRL_SWDPIN(3)
9065
9066 static void
9067 wm_i82543_mii_sendbits(struct wm_softc *sc, uint32_t data, int nbits)
9068 {
9069 uint32_t i, v;
9070
9071 v = CSR_READ(sc, WMREG_CTRL);
9072 v &= ~(MDI_IO | MDI_CLK | (CTRL_SWDPIO_MASK << CTRL_SWDPIO_SHIFT));
9073 v |= MDI_DIR | CTRL_SWDPIO(3);
9074
9075 for (i = 1 << (nbits - 1); i != 0; i >>= 1) {
9076 if (data & i)
9077 v |= MDI_IO;
9078 else
9079 v &= ~MDI_IO;
9080 CSR_WRITE(sc, WMREG_CTRL, v);
9081 CSR_WRITE_FLUSH(sc);
9082 delay(10);
9083 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
9084 CSR_WRITE_FLUSH(sc);
9085 delay(10);
9086 CSR_WRITE(sc, WMREG_CTRL, v);
9087 CSR_WRITE_FLUSH(sc);
9088 delay(10);
9089 }
9090 }
9091
9092 static uint32_t
9093 wm_i82543_mii_recvbits(struct wm_softc *sc)
9094 {
9095 uint32_t v, i, data = 0;
9096
9097 v = CSR_READ(sc, WMREG_CTRL);
9098 v &= ~(MDI_IO | MDI_CLK | (CTRL_SWDPIO_MASK << CTRL_SWDPIO_SHIFT));
9099 v |= CTRL_SWDPIO(3);
9100
9101 CSR_WRITE(sc, WMREG_CTRL, v);
9102 CSR_WRITE_FLUSH(sc);
9103 delay(10);
9104 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
9105 CSR_WRITE_FLUSH(sc);
9106 delay(10);
9107 CSR_WRITE(sc, WMREG_CTRL, v);
9108 CSR_WRITE_FLUSH(sc);
9109 delay(10);
9110
9111 for (i = 0; i < 16; i++) {
9112 data <<= 1;
9113 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
9114 CSR_WRITE_FLUSH(sc);
9115 delay(10);
9116 if (CSR_READ(sc, WMREG_CTRL) & MDI_IO)
9117 data |= 1;
9118 CSR_WRITE(sc, WMREG_CTRL, v);
9119 CSR_WRITE_FLUSH(sc);
9120 delay(10);
9121 }
9122
9123 CSR_WRITE(sc, WMREG_CTRL, v | MDI_CLK);
9124 CSR_WRITE_FLUSH(sc);
9125 delay(10);
9126 CSR_WRITE(sc, WMREG_CTRL, v);
9127 CSR_WRITE_FLUSH(sc);
9128 delay(10);
9129
9130 return data;
9131 }
9132
9133 #undef MDI_IO
9134 #undef MDI_DIR
9135 #undef MDI_CLK
9136
9137 /*
9138 * wm_gmii_i82543_readreg: [mii interface function]
9139 *
9140 * Read a PHY register on the GMII (i82543 version).
9141 */
9142 static int
9143 wm_gmii_i82543_readreg(device_t self, int phy, int reg)
9144 {
9145 struct wm_softc *sc = device_private(self);
9146 int rv;
9147
9148 wm_i82543_mii_sendbits(sc, 0xffffffffU, 32);
9149 wm_i82543_mii_sendbits(sc, reg | (phy << 5) |
9150 (MII_COMMAND_READ << 10) | (MII_COMMAND_START << 12), 14);
9151 rv = wm_i82543_mii_recvbits(sc) & 0xffff;
9152
9153 DPRINTF(WM_DEBUG_GMII, ("%s: GMII: read phy %d reg %d -> 0x%04x\n",
9154 device_xname(sc->sc_dev), phy, reg, rv));
9155
9156 return rv;
9157 }
9158
9159 /*
9160 * wm_gmii_i82543_writereg: [mii interface function]
9161 *
9162 * Write a PHY register on the GMII (i82543 version).
9163 */
9164 static void
9165 wm_gmii_i82543_writereg(device_t self, int phy, int reg, int val)
9166 {
9167 struct wm_softc *sc = device_private(self);
9168
9169 wm_i82543_mii_sendbits(sc, 0xffffffffU, 32);
9170 wm_i82543_mii_sendbits(sc, val | (MII_COMMAND_ACK << 16) |
9171 (reg << 18) | (phy << 23) | (MII_COMMAND_WRITE << 28) |
9172 (MII_COMMAND_START << 30), 32);
9173 }
9174
9175 /*
9176 * wm_gmii_mdic_readreg: [mii interface function]
9177 *
9178 * Read a PHY register on the GMII.
9179 */
9180 static int
9181 wm_gmii_mdic_readreg(device_t self, int phy, int reg)
9182 {
9183 struct wm_softc *sc = device_private(self);
9184 uint32_t mdic = 0;
9185 int i, rv;
9186
9187 CSR_WRITE(sc, WMREG_MDIC, MDIC_OP_READ | MDIC_PHYADD(phy) |
9188 MDIC_REGADD(reg));
9189
9190 for (i = 0; i < WM_GEN_POLL_TIMEOUT * 3; i++) {
9191 mdic = CSR_READ(sc, WMREG_MDIC);
9192 if (mdic & MDIC_READY)
9193 break;
9194 delay(50);
9195 }
9196
9197 if ((mdic & MDIC_READY) == 0) {
9198 log(LOG_WARNING, "%s: MDIC read timed out: phy %d reg %d\n",
9199 device_xname(sc->sc_dev), phy, reg);
9200 rv = 0;
9201 } else if (mdic & MDIC_E) {
9202 #if 0 /* This is normal if no PHY is present. */
9203 log(LOG_WARNING, "%s: MDIC read error: phy %d reg %d\n",
9204 device_xname(sc->sc_dev), phy, reg);
9205 #endif
9206 rv = 0;
9207 } else {
9208 rv = MDIC_DATA(mdic);
9209 if (rv == 0xffff)
9210 rv = 0;
9211 }
9212
9213 return rv;
9214 }
9215
9216 /*
9217 * wm_gmii_mdic_writereg: [mii interface function]
9218 *
9219 * Write a PHY register on the GMII.
9220 */
9221 static void
9222 wm_gmii_mdic_writereg(device_t self, int phy, int reg, int val)
9223 {
9224 struct wm_softc *sc = device_private(self);
9225 uint32_t mdic = 0;
9226 int i;
9227
9228 CSR_WRITE(sc, WMREG_MDIC, MDIC_OP_WRITE | MDIC_PHYADD(phy) |
9229 MDIC_REGADD(reg) | MDIC_DATA(val));
9230
9231 for (i = 0; i < WM_GEN_POLL_TIMEOUT * 3; i++) {
9232 mdic = CSR_READ(sc, WMREG_MDIC);
9233 if (mdic & MDIC_READY)
9234 break;
9235 delay(50);
9236 }
9237
9238 if ((mdic & MDIC_READY) == 0)
9239 log(LOG_WARNING, "%s: MDIC write timed out: phy %d reg %d\n",
9240 device_xname(sc->sc_dev), phy, reg);
9241 else if (mdic & MDIC_E)
9242 log(LOG_WARNING, "%s: MDIC write error: phy %d reg %d\n",
9243 device_xname(sc->sc_dev), phy, reg);
9244 }
9245
9246 /*
9247 * wm_gmii_i82544_readreg: [mii interface function]
9248 *
9249 * Read a PHY register on the GMII.
9250 */
9251 static int
9252 wm_gmii_i82544_readreg(device_t self, int phy, int reg)
9253 {
9254 struct wm_softc *sc = device_private(self);
9255 int rv;
9256
9257 if (sc->phy.acquire(sc)) {
9258 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
9259 __func__);
9260 return 0;
9261 }
9262 rv = wm_gmii_mdic_readreg(self, phy, reg);
9263 sc->phy.release(sc);
9264
9265 return rv;
9266 }
9267
9268 /*
9269 * wm_gmii_i82544_writereg: [mii interface function]
9270 *
9271 * Write a PHY register on the GMII.
9272 */
9273 static void
9274 wm_gmii_i82544_writereg(device_t self, int phy, int reg, int val)
9275 {
9276 struct wm_softc *sc = device_private(self);
9277
9278 if (sc->phy.acquire(sc)) {
9279 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
9280 __func__);
9281 }
9282 wm_gmii_mdic_writereg(self, phy, reg, val);
9283 sc->phy.release(sc);
9284 }
9285
9286 /*
9287 * wm_gmii_i80003_readreg: [mii interface function]
9288 *
9289 * Read a PHY register on the kumeran
9290 * This could be handled by the PHY layer if we didn't have to lock the
9291 * ressource ...
9292 */
9293 static int
9294 wm_gmii_i80003_readreg(device_t self, int phy, int reg)
9295 {
9296 struct wm_softc *sc = device_private(self);
9297 int rv;
9298
9299 if (phy != 1) /* only one PHY on kumeran bus */
9300 return 0;
9301
9302 if (sc->phy.acquire(sc)) {
9303 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
9304 __func__);
9305 return 0;
9306 }
9307
9308 if ((reg & MII_ADDRMASK) < GG82563_MIN_ALT_REG) {
9309 wm_gmii_mdic_writereg(self, phy, GG82563_PHY_PAGE_SELECT,
9310 reg >> GG82563_PAGE_SHIFT);
9311 } else {
9312 wm_gmii_mdic_writereg(self, phy, GG82563_PHY_PAGE_SELECT_ALT,
9313 reg >> GG82563_PAGE_SHIFT);
9314 }
9315 /* Wait more 200us for a bug of the ready bit in the MDIC register */
9316 delay(200);
9317 rv = wm_gmii_mdic_readreg(self, phy, reg & MII_ADDRMASK);
9318 delay(200);
9319 sc->phy.release(sc);
9320
9321 return rv;
9322 }
9323
9324 /*
9325 * wm_gmii_i80003_writereg: [mii interface function]
9326 *
9327 * Write a PHY register on the kumeran.
9328 * This could be handled by the PHY layer if we didn't have to lock the
9329 * ressource ...
9330 */
9331 static void
9332 wm_gmii_i80003_writereg(device_t self, int phy, int reg, int val)
9333 {
9334 struct wm_softc *sc = device_private(self);
9335
9336 if (phy != 1) /* only one PHY on kumeran bus */
9337 return;
9338
9339 if (sc->phy.acquire(sc)) {
9340 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
9341 __func__);
9342 return;
9343 }
9344
9345 if ((reg & MII_ADDRMASK) < GG82563_MIN_ALT_REG) {
9346 wm_gmii_mdic_writereg(self, phy, GG82563_PHY_PAGE_SELECT,
9347 reg >> GG82563_PAGE_SHIFT);
9348 } else {
9349 wm_gmii_mdic_writereg(self, phy, GG82563_PHY_PAGE_SELECT_ALT,
9350 reg >> GG82563_PAGE_SHIFT);
9351 }
9352 /* Wait more 200us for a bug of the ready bit in the MDIC register */
9353 delay(200);
9354 wm_gmii_mdic_writereg(self, phy, reg & MII_ADDRMASK, val);
9355 delay(200);
9356
9357 sc->phy.release(sc);
9358 }
9359
9360 /*
9361 * wm_gmii_bm_readreg: [mii interface function]
9362 *
9363 * Read a PHY register on the kumeran
9364 * This could be handled by the PHY layer if we didn't have to lock the
9365 * ressource ...
9366 */
9367 static int
9368 wm_gmii_bm_readreg(device_t self, int phy, int reg)
9369 {
9370 struct wm_softc *sc = device_private(self);
9371 uint16_t page = reg >> BME1000_PAGE_SHIFT;
9372 uint16_t val;
9373 int rv;
9374
9375 if (sc->phy.acquire(sc)) {
9376 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
9377 __func__);
9378 return 0;
9379 }
9380
9381 if ((sc->sc_type != WM_T_82574) && (sc->sc_type != WM_T_82583))
9382 phy = ((page >= 768) || ((page == 0) && (reg == 25))
9383 || (reg == 31)) ? 1 : phy;
9384 /* Page 800 works differently than the rest so it has its own func */
9385 if (page == BM_WUC_PAGE) {
9386 wm_access_phy_wakeup_reg_bm(self, reg, &val, 1);
9387 rv = val;
9388 goto release;
9389 }
9390
9391 if (reg > BME1000_MAX_MULTI_PAGE_REG) {
9392 if ((phy == 1) && (sc->sc_type != WM_T_82574)
9393 && (sc->sc_type != WM_T_82583))
9394 wm_gmii_mdic_writereg(self, phy,
9395 MII_IGPHY_PAGE_SELECT, page << BME1000_PAGE_SHIFT);
9396 else
9397 wm_gmii_mdic_writereg(self, phy,
9398 BME1000_PHY_PAGE_SELECT, page);
9399 }
9400
9401 rv = wm_gmii_mdic_readreg(self, phy, reg & MII_ADDRMASK);
9402
9403 release:
9404 sc->phy.release(sc);
9405 return rv;
9406 }
9407
9408 /*
9409 * wm_gmii_bm_writereg: [mii interface function]
9410 *
9411 * Write a PHY register on the kumeran.
9412 * This could be handled by the PHY layer if we didn't have to lock the
9413 * ressource ...
9414 */
9415 static void
9416 wm_gmii_bm_writereg(device_t self, int phy, int reg, int val)
9417 {
9418 struct wm_softc *sc = device_private(self);
9419 uint16_t page = reg >> BME1000_PAGE_SHIFT;
9420
9421 if (sc->phy.acquire(sc)) {
9422 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
9423 __func__);
9424 return;
9425 }
9426
9427 if ((sc->sc_type != WM_T_82574) && (sc->sc_type != WM_T_82583))
9428 phy = ((page >= 768) || ((page == 0) && (reg == 25))
9429 || (reg == 31)) ? 1 : phy;
9430 /* Page 800 works differently than the rest so it has its own func */
9431 if (page == BM_WUC_PAGE) {
9432 uint16_t tmp;
9433
9434 tmp = val;
9435 wm_access_phy_wakeup_reg_bm(self, reg, &tmp, 0);
9436 goto release;
9437 }
9438
9439 if (reg > BME1000_MAX_MULTI_PAGE_REG) {
9440 if ((phy == 1) && (sc->sc_type != WM_T_82574)
9441 && (sc->sc_type != WM_T_82583))
9442 wm_gmii_mdic_writereg(self, phy,
9443 MII_IGPHY_PAGE_SELECT, page << BME1000_PAGE_SHIFT);
9444 else
9445 wm_gmii_mdic_writereg(self, phy,
9446 BME1000_PHY_PAGE_SELECT, page);
9447 }
9448
9449 wm_gmii_mdic_writereg(self, phy, reg & MII_ADDRMASK, val);
9450
9451 release:
9452 sc->phy.release(sc);
9453 }
9454
9455 static void
9456 wm_access_phy_wakeup_reg_bm(device_t self, int offset, int16_t *val, int rd)
9457 {
9458 struct wm_softc *sc = device_private(self);
9459 uint16_t regnum = BM_PHY_REG_NUM(offset);
9460 uint16_t wuce, reg;
9461
9462 DPRINTF(WM_DEBUG_GMII, ("%s: %s called\n",
9463 device_xname(sc->sc_dev), __func__));
9464 /* XXX Gig must be disabled for MDIO accesses to page 800 */
9465 if (sc->sc_type == WM_T_PCH) {
9466 /* XXX e1000 driver do nothing... why? */
9467 }
9468
9469 /*
9470 * 1) Enable PHY wakeup register first.
9471 * See e1000_enable_phy_wakeup_reg_access_bm().
9472 */
9473
9474 /* Set page 769 */
9475 wm_gmii_mdic_writereg(self, 1, MII_IGPHY_PAGE_SELECT,
9476 BM_WUC_ENABLE_PAGE << BME1000_PAGE_SHIFT);
9477
9478 /* Read WUCE and save it */
9479 wuce = wm_gmii_mdic_readreg(self, 1, BM_WUC_ENABLE_REG);
9480
9481 reg = wuce | BM_WUC_ENABLE_BIT;
9482 reg &= ~(BM_WUC_ME_WU_BIT | BM_WUC_HOST_WU_BIT);
9483 wm_gmii_mdic_writereg(self, 1, BM_WUC_ENABLE_REG, reg);
9484
9485 /* Select page 800 */
9486 wm_gmii_mdic_writereg(self, 1, MII_IGPHY_PAGE_SELECT,
9487 BM_WUC_PAGE << BME1000_PAGE_SHIFT);
9488
9489 /*
9490 * 2) Access PHY wakeup register.
9491 * See e1000_access_phy_wakeup_reg_bm.
9492 */
9493
9494 /* Write page 800 */
9495 wm_gmii_mdic_writereg(self, 1, BM_WUC_ADDRESS_OPCODE, regnum);
9496
9497 if (rd)
9498 *val = wm_gmii_mdic_readreg(self, 1, BM_WUC_DATA_OPCODE);
9499 else
9500 wm_gmii_mdic_writereg(self, 1, BM_WUC_DATA_OPCODE, *val);
9501
9502 /*
9503 * 3) Disable PHY wakeup register.
9504 * See e1000_disable_phy_wakeup_reg_access_bm().
9505 */
9506 /* Set page 769 */
9507 wm_gmii_mdic_writereg(self, 1, MII_IGPHY_PAGE_SELECT,
9508 BM_WUC_ENABLE_PAGE << BME1000_PAGE_SHIFT);
9509
9510 wm_gmii_mdic_writereg(self, 1, BM_WUC_ENABLE_REG, wuce);
9511 }
9512
9513 /*
9514 * wm_gmii_hv_readreg: [mii interface function]
9515 *
9516 * Read a PHY register on the kumeran
9517 * This could be handled by the PHY layer if we didn't have to lock the
9518 * ressource ...
9519 */
9520 static int
9521 wm_gmii_hv_readreg(device_t self, int phy, int reg)
9522 {
9523 struct wm_softc *sc = device_private(self);
9524 int rv;
9525
9526 DPRINTF(WM_DEBUG_GMII, ("%s: %s called\n",
9527 device_xname(sc->sc_dev), __func__));
9528 if (sc->phy.acquire(sc)) {
9529 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
9530 __func__);
9531 return 0;
9532 }
9533
9534 rv = wm_gmii_hv_readreg_locked(self, phy, reg);
9535 sc->phy.release(sc);
9536 return rv;
9537 }
9538
9539 static int
9540 wm_gmii_hv_readreg_locked(device_t self, int phy, int reg)
9541 {
9542 uint16_t page = BM_PHY_REG_PAGE(reg);
9543 uint16_t regnum = BM_PHY_REG_NUM(reg);
9544 uint16_t val;
9545 int rv;
9546
9547 phy = (page >= HV_INTC_FC_PAGE_START) ? 1 : phy;
9548
9549 /* Page 800 works differently than the rest so it has its own func */
9550 if (page == BM_WUC_PAGE) {
9551 wm_access_phy_wakeup_reg_bm(self, reg, &val, 1);
9552 return val;
9553 }
9554
9555 /*
9556 * Lower than page 768 works differently than the rest so it has its
9557 * own func
9558 */
9559 if ((page > 0) && (page < HV_INTC_FC_PAGE_START)) {
9560 printf("gmii_hv_readreg!!!\n");
9561 return 0;
9562 }
9563
9564 if (regnum > BME1000_MAX_MULTI_PAGE_REG) {
9565 wm_gmii_mdic_writereg(self, 1, MII_IGPHY_PAGE_SELECT,
9566 page << BME1000_PAGE_SHIFT);
9567 }
9568
9569 rv = wm_gmii_mdic_readreg(self, phy, regnum & MII_ADDRMASK);
9570 return rv;
9571 }
9572
9573 /*
9574 * wm_gmii_hv_writereg: [mii interface function]
9575 *
9576 * Write a PHY register on the kumeran.
9577 * This could be handled by the PHY layer if we didn't have to lock the
9578 * ressource ...
9579 */
9580 static void
9581 wm_gmii_hv_writereg(device_t self, int phy, int reg, int val)
9582 {
9583 struct wm_softc *sc = device_private(self);
9584
9585 DPRINTF(WM_DEBUG_GMII, ("%s: %s called\n",
9586 device_xname(sc->sc_dev), __func__));
9587
9588 if (sc->phy.acquire(sc)) {
9589 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
9590 __func__);
9591 return;
9592 }
9593
9594 wm_gmii_hv_writereg_locked(self, phy, reg, val);
9595 sc->phy.release(sc);
9596 }
9597
9598 static void
9599 wm_gmii_hv_writereg_locked(device_t self, int phy, int reg, int val)
9600 {
9601 struct wm_softc *sc = device_private(self);
9602 uint16_t page = BM_PHY_REG_PAGE(reg);
9603 uint16_t regnum = BM_PHY_REG_NUM(reg);
9604
9605 phy = (page >= HV_INTC_FC_PAGE_START) ? 1 : phy;
9606
9607 /* Page 800 works differently than the rest so it has its own func */
9608 if (page == BM_WUC_PAGE) {
9609 uint16_t tmp;
9610
9611 tmp = val;
9612 wm_access_phy_wakeup_reg_bm(self, reg, &tmp, 0);
9613 return;
9614 }
9615
9616 /*
9617 * Lower than page 768 works differently than the rest so it has its
9618 * own func
9619 */
9620 if ((page > 0) && (page < HV_INTC_FC_PAGE_START)) {
9621 printf("gmii_hv_writereg!!!\n");
9622 return;
9623 }
9624
9625 {
9626 /*
9627 * XXX Workaround MDIO accesses being disabled after entering
9628 * IEEE Power Down (whenever bit 11 of the PHY control
9629 * register is set)
9630 */
9631 if (sc->sc_phytype == WMPHY_82578) {
9632 struct mii_softc *child;
9633
9634 child = LIST_FIRST(&sc->sc_mii.mii_phys);
9635 if ((child != NULL) && (child->mii_mpd_rev >= 1)
9636 && (phy == 2) && ((regnum & MII_ADDRMASK) == 0)
9637 && ((val & (1 << 11)) != 0)) {
9638 printf("XXX need workaround\n");
9639 }
9640 }
9641
9642 if (regnum > BME1000_MAX_MULTI_PAGE_REG) {
9643 wm_gmii_mdic_writereg(self, 1, MII_IGPHY_PAGE_SELECT,
9644 page << BME1000_PAGE_SHIFT);
9645 }
9646 }
9647
9648 wm_gmii_mdic_writereg(self, phy, regnum & MII_ADDRMASK, val);
9649 }
9650
9651 /*
9652 * wm_gmii_82580_readreg: [mii interface function]
9653 *
9654 * Read a PHY register on the 82580 and I350.
9655 * This could be handled by the PHY layer if we didn't have to lock the
9656 * ressource ...
9657 */
9658 static int
9659 wm_gmii_82580_readreg(device_t self, int phy, int reg)
9660 {
9661 struct wm_softc *sc = device_private(self);
9662 int rv;
9663
9664 if (sc->phy.acquire(sc) != 0) {
9665 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
9666 __func__);
9667 return 0;
9668 }
9669
9670 rv = wm_gmii_mdic_readreg(self, phy, reg);
9671
9672 sc->phy.release(sc);
9673 return rv;
9674 }
9675
9676 /*
9677 * wm_gmii_82580_writereg: [mii interface function]
9678 *
9679 * Write a PHY register on the 82580 and I350.
9680 * This could be handled by the PHY layer if we didn't have to lock the
9681 * ressource ...
9682 */
9683 static void
9684 wm_gmii_82580_writereg(device_t self, int phy, int reg, int val)
9685 {
9686 struct wm_softc *sc = device_private(self);
9687
9688 if (sc->phy.acquire(sc) != 0) {
9689 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
9690 __func__);
9691 return;
9692 }
9693
9694 wm_gmii_mdic_writereg(self, phy, reg, val);
9695
9696 sc->phy.release(sc);
9697 }
9698
9699 /*
9700 * wm_gmii_gs40g_readreg: [mii interface function]
9701 *
9702 * Read a PHY register on the I2100 and I211.
9703 * This could be handled by the PHY layer if we didn't have to lock the
9704 * ressource ...
9705 */
9706 static int
9707 wm_gmii_gs40g_readreg(device_t self, int phy, int reg)
9708 {
9709 struct wm_softc *sc = device_private(self);
9710 int page, offset;
9711 int rv;
9712
9713 /* Acquire semaphore */
9714 if (sc->phy.acquire(sc)) {
9715 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
9716 __func__);
9717 return 0;
9718 }
9719
9720 /* Page select */
9721 page = reg >> GS40G_PAGE_SHIFT;
9722 wm_gmii_mdic_writereg(self, phy, GS40G_PAGE_SELECT, page);
9723
9724 /* Read reg */
9725 offset = reg & GS40G_OFFSET_MASK;
9726 rv = wm_gmii_mdic_readreg(self, phy, offset);
9727
9728 sc->phy.release(sc);
9729 return rv;
9730 }
9731
9732 /*
9733 * wm_gmii_gs40g_writereg: [mii interface function]
9734 *
9735 * Write a PHY register on the I210 and I211.
9736 * This could be handled by the PHY layer if we didn't have to lock the
9737 * ressource ...
9738 */
9739 static void
9740 wm_gmii_gs40g_writereg(device_t self, int phy, int reg, int val)
9741 {
9742 struct wm_softc *sc = device_private(self);
9743 int page, offset;
9744
9745 /* Acquire semaphore */
9746 if (sc->phy.acquire(sc)) {
9747 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
9748 __func__);
9749 return;
9750 }
9751
9752 /* Page select */
9753 page = reg >> GS40G_PAGE_SHIFT;
9754 wm_gmii_mdic_writereg(self, phy, GS40G_PAGE_SELECT, page);
9755
9756 /* Write reg */
9757 offset = reg & GS40G_OFFSET_MASK;
9758 wm_gmii_mdic_writereg(self, phy, offset, val);
9759
9760 /* Release semaphore */
9761 sc->phy.release(sc);
9762 }
9763
9764 /*
9765 * wm_gmii_statchg: [mii interface function]
9766 *
9767 * Callback from MII layer when media changes.
9768 */
9769 static void
9770 wm_gmii_statchg(struct ifnet *ifp)
9771 {
9772 struct wm_softc *sc = ifp->if_softc;
9773 struct mii_data *mii = &sc->sc_mii;
9774
9775 sc->sc_ctrl &= ~(CTRL_TFCE | CTRL_RFCE);
9776 sc->sc_tctl &= ~TCTL_COLD(0x3ff);
9777 sc->sc_fcrtl &= ~FCRTL_XONE;
9778
9779 /*
9780 * Get flow control negotiation result.
9781 */
9782 if (IFM_SUBTYPE(mii->mii_media.ifm_cur->ifm_media) == IFM_AUTO &&
9783 (mii->mii_media_active & IFM_ETH_FMASK) != sc->sc_flowflags) {
9784 sc->sc_flowflags = mii->mii_media_active & IFM_ETH_FMASK;
9785 mii->mii_media_active &= ~IFM_ETH_FMASK;
9786 }
9787
9788 if (sc->sc_flowflags & IFM_FLOW) {
9789 if (sc->sc_flowflags & IFM_ETH_TXPAUSE) {
9790 sc->sc_ctrl |= CTRL_TFCE;
9791 sc->sc_fcrtl |= FCRTL_XONE;
9792 }
9793 if (sc->sc_flowflags & IFM_ETH_RXPAUSE)
9794 sc->sc_ctrl |= CTRL_RFCE;
9795 }
9796
9797 if (sc->sc_mii.mii_media_active & IFM_FDX) {
9798 DPRINTF(WM_DEBUG_LINK,
9799 ("%s: LINK: statchg: FDX\n", ifp->if_xname));
9800 sc->sc_tctl |= TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
9801 } else {
9802 DPRINTF(WM_DEBUG_LINK,
9803 ("%s: LINK: statchg: HDX\n", ifp->if_xname));
9804 sc->sc_tctl |= TCTL_COLD(TX_COLLISION_DISTANCE_HDX);
9805 }
9806
9807 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
9808 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
9809 CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ? WMREG_OLD_FCRTL
9810 : WMREG_FCRTL, sc->sc_fcrtl);
9811 if (sc->sc_type == WM_T_80003) {
9812 switch (IFM_SUBTYPE(sc->sc_mii.mii_media_active)) {
9813 case IFM_1000_T:
9814 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_HD_CTRL,
9815 KUMCTRLSTA_HD_CTRL_1000_DEFAULT);
9816 sc->sc_tipg = TIPG_1000T_80003_DFLT;
9817 break;
9818 default:
9819 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_HD_CTRL,
9820 KUMCTRLSTA_HD_CTRL_10_100_DEFAULT);
9821 sc->sc_tipg = TIPG_10_100_80003_DFLT;
9822 break;
9823 }
9824 CSR_WRITE(sc, WMREG_TIPG, sc->sc_tipg);
9825 }
9826 }
9827
9828 /* kumeran related (80003, ICH* and PCH*) */
9829
9830 /*
9831 * wm_kmrn_readreg:
9832 *
9833 * Read a kumeran register
9834 */
9835 static int
9836 wm_kmrn_readreg(struct wm_softc *sc, int reg)
9837 {
9838 int rv;
9839
9840 if (sc->sc_type == WM_T_80003)
9841 rv = wm_get_swfw_semaphore(sc, SWFW_MAC_CSR_SM);
9842 else
9843 rv = sc->phy.acquire(sc);
9844 if (rv != 0) {
9845 aprint_error_dev(sc->sc_dev,
9846 "%s: failed to get semaphore\n", __func__);
9847 return 0;
9848 }
9849
9850 rv = wm_kmrn_readreg_locked(sc, reg);
9851
9852 if (sc->sc_type == WM_T_80003)
9853 wm_put_swfw_semaphore(sc, SWFW_MAC_CSR_SM);
9854 else
9855 sc->phy.release(sc);
9856
9857 return rv;
9858 }
9859
9860 static int
9861 wm_kmrn_readreg_locked(struct wm_softc *sc, int reg)
9862 {
9863 int rv;
9864
9865 CSR_WRITE(sc, WMREG_KUMCTRLSTA,
9866 ((reg << KUMCTRLSTA_OFFSET_SHIFT) & KUMCTRLSTA_OFFSET) |
9867 KUMCTRLSTA_REN);
9868 CSR_WRITE_FLUSH(sc);
9869 delay(2);
9870
9871 rv = CSR_READ(sc, WMREG_KUMCTRLSTA) & KUMCTRLSTA_MASK;
9872
9873 return rv;
9874 }
9875
9876 /*
9877 * wm_kmrn_writereg:
9878 *
9879 * Write a kumeran register
9880 */
9881 static void
9882 wm_kmrn_writereg(struct wm_softc *sc, int reg, int val)
9883 {
9884 int rv;
9885
9886 if (sc->sc_type == WM_T_80003)
9887 rv = wm_get_swfw_semaphore(sc, SWFW_MAC_CSR_SM);
9888 else
9889 rv = sc->phy.acquire(sc);
9890 if (rv != 0) {
9891 aprint_error_dev(sc->sc_dev,
9892 "%s: failed to get semaphore\n", __func__);
9893 return;
9894 }
9895
9896 wm_kmrn_writereg_locked(sc, reg, val);
9897
9898 if (sc->sc_type == WM_T_80003)
9899 wm_put_swfw_semaphore(sc, SWFW_MAC_CSR_SM);
9900 else
9901 sc->phy.release(sc);
9902 }
9903
9904 static void
9905 wm_kmrn_writereg_locked(struct wm_softc *sc, int reg, int val)
9906 {
9907
9908 CSR_WRITE(sc, WMREG_KUMCTRLSTA,
9909 ((reg << KUMCTRLSTA_OFFSET_SHIFT) & KUMCTRLSTA_OFFSET) |
9910 (val & KUMCTRLSTA_MASK));
9911 }
9912
9913 /* SGMII related */
9914
9915 /*
9916 * wm_sgmii_uses_mdio
9917 *
9918 * Check whether the transaction is to the internal PHY or the external
9919 * MDIO interface. Return true if it's MDIO.
9920 */
9921 static bool
9922 wm_sgmii_uses_mdio(struct wm_softc *sc)
9923 {
9924 uint32_t reg;
9925 bool ismdio = false;
9926
9927 switch (sc->sc_type) {
9928 case WM_T_82575:
9929 case WM_T_82576:
9930 reg = CSR_READ(sc, WMREG_MDIC);
9931 ismdio = ((reg & MDIC_DEST) != 0);
9932 break;
9933 case WM_T_82580:
9934 case WM_T_I350:
9935 case WM_T_I354:
9936 case WM_T_I210:
9937 case WM_T_I211:
9938 reg = CSR_READ(sc, WMREG_MDICNFG);
9939 ismdio = ((reg & MDICNFG_DEST) != 0);
9940 break;
9941 default:
9942 break;
9943 }
9944
9945 return ismdio;
9946 }
9947
9948 /*
9949 * wm_sgmii_readreg: [mii interface function]
9950 *
9951 * Read a PHY register on the SGMII
9952 * This could be handled by the PHY layer if we didn't have to lock the
9953 * ressource ...
9954 */
9955 static int
9956 wm_sgmii_readreg(device_t self, int phy, int reg)
9957 {
9958 struct wm_softc *sc = device_private(self);
9959 uint32_t i2ccmd;
9960 int i, rv;
9961
9962 if (sc->phy.acquire(sc)) {
9963 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
9964 __func__);
9965 return 0;
9966 }
9967
9968 i2ccmd = (reg << I2CCMD_REG_ADDR_SHIFT)
9969 | (phy << I2CCMD_PHY_ADDR_SHIFT)
9970 | I2CCMD_OPCODE_READ;
9971 CSR_WRITE(sc, WMREG_I2CCMD, i2ccmd);
9972
9973 /* Poll the ready bit */
9974 for (i = 0; i < I2CCMD_PHY_TIMEOUT; i++) {
9975 delay(50);
9976 i2ccmd = CSR_READ(sc, WMREG_I2CCMD);
9977 if (i2ccmd & I2CCMD_READY)
9978 break;
9979 }
9980 if ((i2ccmd & I2CCMD_READY) == 0)
9981 aprint_error_dev(sc->sc_dev, "I2CCMD Read did not complete\n");
9982 if ((i2ccmd & I2CCMD_ERROR) != 0)
9983 aprint_error_dev(sc->sc_dev, "I2CCMD Error bit set\n");
9984
9985 rv = ((i2ccmd >> 8) & 0x00ff) | ((i2ccmd << 8) & 0xff00);
9986
9987 sc->phy.release(sc);
9988 return rv;
9989 }
9990
9991 /*
9992 * wm_sgmii_writereg: [mii interface function]
9993 *
9994 * Write a PHY register on the SGMII.
9995 * This could be handled by the PHY layer if we didn't have to lock the
9996 * ressource ...
9997 */
9998 static void
9999 wm_sgmii_writereg(device_t self, int phy, int reg, int val)
10000 {
10001 struct wm_softc *sc = device_private(self);
10002 uint32_t i2ccmd;
10003 int i;
10004 int val_swapped;
10005
10006 if (sc->phy.acquire(sc) != 0) {
10007 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
10008 __func__);
10009 return;
10010 }
10011 /* Swap the data bytes for the I2C interface */
10012 val_swapped = ((val >> 8) & 0x00FF) | ((val << 8) & 0xFF00);
10013 i2ccmd = (reg << I2CCMD_REG_ADDR_SHIFT)
10014 | (phy << I2CCMD_PHY_ADDR_SHIFT)
10015 | I2CCMD_OPCODE_WRITE | val_swapped;
10016 CSR_WRITE(sc, WMREG_I2CCMD, i2ccmd);
10017
10018 /* Poll the ready bit */
10019 for (i = 0; i < I2CCMD_PHY_TIMEOUT; i++) {
10020 delay(50);
10021 i2ccmd = CSR_READ(sc, WMREG_I2CCMD);
10022 if (i2ccmd & I2CCMD_READY)
10023 break;
10024 }
10025 if ((i2ccmd & I2CCMD_READY) == 0)
10026 aprint_error_dev(sc->sc_dev, "I2CCMD Write did not complete\n");
10027 if ((i2ccmd & I2CCMD_ERROR) != 0)
10028 aprint_error_dev(sc->sc_dev, "I2CCMD Error bit set\n");
10029
10030 sc->phy.release(sc);
10031 }
10032
10033 /* TBI related */
10034
10035 /*
10036 * wm_tbi_mediainit:
10037 *
10038 * Initialize media for use on 1000BASE-X devices.
10039 */
10040 static void
10041 wm_tbi_mediainit(struct wm_softc *sc)
10042 {
10043 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
10044 const char *sep = "";
10045
10046 if (sc->sc_type < WM_T_82543)
10047 sc->sc_tipg = TIPG_WM_DFLT;
10048 else
10049 sc->sc_tipg = TIPG_LG_DFLT;
10050
10051 sc->sc_tbi_serdes_anegticks = 5;
10052
10053 /* Initialize our media structures */
10054 sc->sc_mii.mii_ifp = ifp;
10055 sc->sc_ethercom.ec_mii = &sc->sc_mii;
10056
10057 if ((sc->sc_type >= WM_T_82575)
10058 && (sc->sc_mediatype == WM_MEDIATYPE_SERDES))
10059 ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK,
10060 wm_serdes_mediachange, wm_serdes_mediastatus);
10061 else
10062 ifmedia_init(&sc->sc_mii.mii_media, IFM_IMASK,
10063 wm_tbi_mediachange, wm_tbi_mediastatus);
10064
10065 /*
10066 * SWD Pins:
10067 *
10068 * 0 = Link LED (output)
10069 * 1 = Loss Of Signal (input)
10070 */
10071 sc->sc_ctrl |= CTRL_SWDPIO(0);
10072
10073 /* XXX Perhaps this is only for TBI */
10074 if (sc->sc_mediatype != WM_MEDIATYPE_SERDES)
10075 sc->sc_ctrl &= ~CTRL_SWDPIO(1);
10076
10077 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES)
10078 sc->sc_ctrl &= ~CTRL_LRST;
10079
10080 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
10081
10082 #define ADD(ss, mm, dd) \
10083 do { \
10084 aprint_normal("%s%s", sep, ss); \
10085 ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER | (mm), (dd), NULL); \
10086 sep = ", "; \
10087 } while (/*CONSTCOND*/0)
10088
10089 aprint_normal_dev(sc->sc_dev, "");
10090
10091 if (sc->sc_type == WM_T_I354) {
10092 uint32_t status;
10093
10094 status = CSR_READ(sc, WMREG_STATUS);
10095 if (((status & STATUS_2P5_SKU) != 0)
10096 && ((status & STATUS_2P5_SKU_OVER) == 0)) {
10097 ADD("2500baseKX-FDX", IFM_2500_SX | IFM_FDX,ANAR_X_FD);
10098 } else
10099 ADD("1000baseSX-FDX", IFM_1000_SX | IFM_FDX,ANAR_X_FD);
10100 } else if (sc->sc_type == WM_T_82545) {
10101 /* Only 82545 is LX (XXX except SFP) */
10102 ADD("1000baseLX", IFM_1000_LX, ANAR_X_HD);
10103 ADD("1000baseLX-FDX", IFM_1000_LX | IFM_FDX, ANAR_X_FD);
10104 } else {
10105 ADD("1000baseSX", IFM_1000_SX, ANAR_X_HD);
10106 ADD("1000baseSX-FDX", IFM_1000_SX | IFM_FDX, ANAR_X_FD);
10107 }
10108 ADD("auto", IFM_AUTO, ANAR_X_FD | ANAR_X_HD);
10109 aprint_normal("\n");
10110
10111 #undef ADD
10112
10113 ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER | IFM_AUTO);
10114 }
10115
10116 /*
10117 * wm_tbi_mediachange: [ifmedia interface function]
10118 *
10119 * Set hardware to newly-selected media on a 1000BASE-X device.
10120 */
10121 static int
10122 wm_tbi_mediachange(struct ifnet *ifp)
10123 {
10124 struct wm_softc *sc = ifp->if_softc;
10125 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
10126 uint32_t status;
10127 int i;
10128
10129 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES) {
10130 /* XXX need some work for >= 82571 and < 82575 */
10131 if (sc->sc_type < WM_T_82575)
10132 return 0;
10133 }
10134
10135 if ((sc->sc_type == WM_T_82571) || (sc->sc_type == WM_T_82572)
10136 || (sc->sc_type >= WM_T_82575))
10137 CSR_WRITE(sc, WMREG_SCTL, SCTL_DISABLE_SERDES_LOOPBACK);
10138
10139 sc->sc_ctrl &= ~CTRL_LRST;
10140 sc->sc_txcw = TXCW_ANE;
10141 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)
10142 sc->sc_txcw |= TXCW_FD | TXCW_HD;
10143 else if (ife->ifm_media & IFM_FDX)
10144 sc->sc_txcw |= TXCW_FD;
10145 else
10146 sc->sc_txcw |= TXCW_HD;
10147
10148 if ((sc->sc_mii.mii_media.ifm_media & IFM_FLOW) != 0)
10149 sc->sc_txcw |= TXCW_SYM_PAUSE | TXCW_ASYM_PAUSE;
10150
10151 DPRINTF(WM_DEBUG_LINK,("%s: sc_txcw = 0x%x after autoneg check\n",
10152 device_xname(sc->sc_dev), sc->sc_txcw));
10153 CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw);
10154 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
10155 CSR_WRITE_FLUSH(sc);
10156 delay(1000);
10157
10158 i = CSR_READ(sc, WMREG_CTRL) & CTRL_SWDPIN(1);
10159 DPRINTF(WM_DEBUG_LINK,("%s: i = 0x%x\n", device_xname(sc->sc_dev),i));
10160
10161 /*
10162 * On 82544 chips and later, the CTRL_SWDPIN(1) bit will be set if the
10163 * optics detect a signal, 0 if they don't.
10164 */
10165 if (((i != 0) && (sc->sc_type > WM_T_82544)) || (i == 0)) {
10166 /* Have signal; wait for the link to come up. */
10167 for (i = 0; i < WM_LINKUP_TIMEOUT; i++) {
10168 delay(10000);
10169 if (CSR_READ(sc, WMREG_STATUS) & STATUS_LU)
10170 break;
10171 }
10172
10173 DPRINTF(WM_DEBUG_LINK,("%s: i = %d after waiting for link\n",
10174 device_xname(sc->sc_dev),i));
10175
10176 status = CSR_READ(sc, WMREG_STATUS);
10177 DPRINTF(WM_DEBUG_LINK,
10178 ("%s: status after final read = 0x%x, STATUS_LU = 0x%x\n",
10179 device_xname(sc->sc_dev),status, STATUS_LU));
10180 if (status & STATUS_LU) {
10181 /* Link is up. */
10182 DPRINTF(WM_DEBUG_LINK,
10183 ("%s: LINK: set media -> link up %s\n",
10184 device_xname(sc->sc_dev),
10185 (status & STATUS_FD) ? "FDX" : "HDX"));
10186
10187 /*
10188 * NOTE: CTRL will update TFCE and RFCE automatically,
10189 * so we should update sc->sc_ctrl
10190 */
10191 sc->sc_ctrl = CSR_READ(sc, WMREG_CTRL);
10192 sc->sc_tctl &= ~TCTL_COLD(0x3ff);
10193 sc->sc_fcrtl &= ~FCRTL_XONE;
10194 if (status & STATUS_FD)
10195 sc->sc_tctl |=
10196 TCTL_COLD(TX_COLLISION_DISTANCE_FDX);
10197 else
10198 sc->sc_tctl |=
10199 TCTL_COLD(TX_COLLISION_DISTANCE_HDX);
10200 if (CSR_READ(sc, WMREG_CTRL) & CTRL_TFCE)
10201 sc->sc_fcrtl |= FCRTL_XONE;
10202 CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
10203 CSR_WRITE(sc, (sc->sc_type < WM_T_82543) ?
10204 WMREG_OLD_FCRTL : WMREG_FCRTL,
10205 sc->sc_fcrtl);
10206 sc->sc_tbi_linkup = 1;
10207 } else {
10208 if (i == WM_LINKUP_TIMEOUT)
10209 wm_check_for_link(sc);
10210 /* Link is down. */
10211 DPRINTF(WM_DEBUG_LINK,
10212 ("%s: LINK: set media -> link down\n",
10213 device_xname(sc->sc_dev)));
10214 sc->sc_tbi_linkup = 0;
10215 }
10216 } else {
10217 DPRINTF(WM_DEBUG_LINK, ("%s: LINK: set media -> no signal\n",
10218 device_xname(sc->sc_dev)));
10219 sc->sc_tbi_linkup = 0;
10220 }
10221
10222 wm_tbi_serdes_set_linkled(sc);
10223
10224 return 0;
10225 }
10226
10227 /*
10228 * wm_tbi_mediastatus: [ifmedia interface function]
10229 *
10230 * Get the current interface media status on a 1000BASE-X device.
10231 */
10232 static void
10233 wm_tbi_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
10234 {
10235 struct wm_softc *sc = ifp->if_softc;
10236 uint32_t ctrl, status;
10237
10238 ifmr->ifm_status = IFM_AVALID;
10239 ifmr->ifm_active = IFM_ETHER;
10240
10241 status = CSR_READ(sc, WMREG_STATUS);
10242 if ((status & STATUS_LU) == 0) {
10243 ifmr->ifm_active |= IFM_NONE;
10244 return;
10245 }
10246
10247 ifmr->ifm_status |= IFM_ACTIVE;
10248 /* Only 82545 is LX */
10249 if (sc->sc_type == WM_T_82545)
10250 ifmr->ifm_active |= IFM_1000_LX;
10251 else
10252 ifmr->ifm_active |= IFM_1000_SX;
10253 if (CSR_READ(sc, WMREG_STATUS) & STATUS_FD)
10254 ifmr->ifm_active |= IFM_FDX;
10255 else
10256 ifmr->ifm_active |= IFM_HDX;
10257 ctrl = CSR_READ(sc, WMREG_CTRL);
10258 if (ctrl & CTRL_RFCE)
10259 ifmr->ifm_active |= IFM_FLOW | IFM_ETH_RXPAUSE;
10260 if (ctrl & CTRL_TFCE)
10261 ifmr->ifm_active |= IFM_FLOW | IFM_ETH_TXPAUSE;
10262 }
10263
10264 /* XXX TBI only */
10265 static int
10266 wm_check_for_link(struct wm_softc *sc)
10267 {
10268 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
10269 uint32_t rxcw;
10270 uint32_t ctrl;
10271 uint32_t status;
10272 uint32_t sig;
10273
10274 if (sc->sc_mediatype == WM_MEDIATYPE_SERDES) {
10275 /* XXX need some work for >= 82571 */
10276 if (sc->sc_type >= WM_T_82571) {
10277 sc->sc_tbi_linkup = 1;
10278 return 0;
10279 }
10280 }
10281
10282 rxcw = CSR_READ(sc, WMREG_RXCW);
10283 ctrl = CSR_READ(sc, WMREG_CTRL);
10284 status = CSR_READ(sc, WMREG_STATUS);
10285
10286 sig = (sc->sc_type > WM_T_82544) ? CTRL_SWDPIN(1) : 0;
10287
10288 DPRINTF(WM_DEBUG_LINK,
10289 ("%s: %s: sig = %d, status_lu = %d, rxcw_c = %d\n",
10290 device_xname(sc->sc_dev), __func__,
10291 ((ctrl & CTRL_SWDPIN(1)) == sig),
10292 ((status & STATUS_LU) != 0), ((rxcw & RXCW_C) != 0)));
10293
10294 /*
10295 * SWDPIN LU RXCW
10296 * 0 0 0
10297 * 0 0 1 (should not happen)
10298 * 0 1 0 (should not happen)
10299 * 0 1 1 (should not happen)
10300 * 1 0 0 Disable autonego and force linkup
10301 * 1 0 1 got /C/ but not linkup yet
10302 * 1 1 0 (linkup)
10303 * 1 1 1 If IFM_AUTO, back to autonego
10304 *
10305 */
10306 if (((ctrl & CTRL_SWDPIN(1)) == sig)
10307 && ((status & STATUS_LU) == 0)
10308 && ((rxcw & RXCW_C) == 0)) {
10309 DPRINTF(WM_DEBUG_LINK, ("%s: force linkup and fullduplex\n",
10310 __func__));
10311 sc->sc_tbi_linkup = 0;
10312 /* Disable auto-negotiation in the TXCW register */
10313 CSR_WRITE(sc, WMREG_TXCW, (sc->sc_txcw & ~TXCW_ANE));
10314
10315 /*
10316 * Force link-up and also force full-duplex.
10317 *
10318 * NOTE: CTRL was updated TFCE and RFCE automatically,
10319 * so we should update sc->sc_ctrl
10320 */
10321 sc->sc_ctrl = ctrl | CTRL_SLU | CTRL_FD;
10322 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
10323 } else if (((status & STATUS_LU) != 0)
10324 && ((rxcw & RXCW_C) != 0)
10325 && (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)) {
10326 sc->sc_tbi_linkup = 1;
10327 DPRINTF(WM_DEBUG_LINK, ("%s: go back to autonego\n",
10328 __func__));
10329 CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw);
10330 CSR_WRITE(sc, WMREG_CTRL, (ctrl & ~CTRL_SLU));
10331 } else if (((ctrl & CTRL_SWDPIN(1)) == sig)
10332 && ((rxcw & RXCW_C) != 0)) {
10333 DPRINTF(WM_DEBUG_LINK, ("/C/"));
10334 } else {
10335 DPRINTF(WM_DEBUG_LINK, ("%s: %x,%x,%x\n", __func__, rxcw, ctrl,
10336 status));
10337 }
10338
10339 return 0;
10340 }
10341
10342 /*
10343 * wm_tbi_tick:
10344 *
10345 * Check the link on TBI devices.
10346 * This function acts as mii_tick().
10347 */
10348 static void
10349 wm_tbi_tick(struct wm_softc *sc)
10350 {
10351 struct mii_data *mii = &sc->sc_mii;
10352 struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
10353 uint32_t status;
10354
10355 KASSERT(WM_CORE_LOCKED(sc));
10356
10357 status = CSR_READ(sc, WMREG_STATUS);
10358
10359 /* XXX is this needed? */
10360 (void)CSR_READ(sc, WMREG_RXCW);
10361 (void)CSR_READ(sc, WMREG_CTRL);
10362
10363 /* set link status */
10364 if ((status & STATUS_LU) == 0) {
10365 DPRINTF(WM_DEBUG_LINK,
10366 ("%s: LINK: checklink -> down\n",
10367 device_xname(sc->sc_dev)));
10368 sc->sc_tbi_linkup = 0;
10369 } else if (sc->sc_tbi_linkup == 0) {
10370 DPRINTF(WM_DEBUG_LINK,
10371 ("%s: LINK: checklink -> up %s\n",
10372 device_xname(sc->sc_dev),
10373 (status & STATUS_FD) ? "FDX" : "HDX"));
10374 sc->sc_tbi_linkup = 1;
10375 sc->sc_tbi_serdes_ticks = 0;
10376 }
10377
10378 if ((sc->sc_ethercom.ec_if.if_flags & IFF_UP) == 0)
10379 goto setled;
10380
10381 if ((status & STATUS_LU) == 0) {
10382 sc->sc_tbi_linkup = 0;
10383 /* If the timer expired, retry autonegotiation */
10384 if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)
10385 && (++sc->sc_tbi_serdes_ticks
10386 >= sc->sc_tbi_serdes_anegticks)) {
10387 DPRINTF(WM_DEBUG_LINK, ("EXPIRE\n"));
10388 sc->sc_tbi_serdes_ticks = 0;
10389 /*
10390 * Reset the link, and let autonegotiation do
10391 * its thing
10392 */
10393 sc->sc_ctrl |= CTRL_LRST;
10394 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
10395 CSR_WRITE_FLUSH(sc);
10396 delay(1000);
10397 sc->sc_ctrl &= ~CTRL_LRST;
10398 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
10399 CSR_WRITE_FLUSH(sc);
10400 delay(1000);
10401 CSR_WRITE(sc, WMREG_TXCW,
10402 sc->sc_txcw & ~TXCW_ANE);
10403 CSR_WRITE(sc, WMREG_TXCW, sc->sc_txcw);
10404 }
10405 }
10406
10407 setled:
10408 wm_tbi_serdes_set_linkled(sc);
10409 }
10410
10411 /* SERDES related */
10412 static void
10413 wm_serdes_power_up_link_82575(struct wm_softc *sc)
10414 {
10415 uint32_t reg;
10416
10417 if ((sc->sc_mediatype != WM_MEDIATYPE_SERDES)
10418 && ((sc->sc_flags & WM_F_SGMII) == 0))
10419 return;
10420
10421 reg = CSR_READ(sc, WMREG_PCS_CFG);
10422 reg |= PCS_CFG_PCS_EN;
10423 CSR_WRITE(sc, WMREG_PCS_CFG, reg);
10424
10425 reg = CSR_READ(sc, WMREG_CTRL_EXT);
10426 reg &= ~CTRL_EXT_SWDPIN(3);
10427 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
10428 CSR_WRITE_FLUSH(sc);
10429 }
10430
10431 static int
10432 wm_serdes_mediachange(struct ifnet *ifp)
10433 {
10434 struct wm_softc *sc = ifp->if_softc;
10435 bool pcs_autoneg = true; /* XXX */
10436 uint32_t ctrl_ext, pcs_lctl, reg;
10437
10438 /* XXX Currently, this function is not called on 8257[12] */
10439 if ((sc->sc_type == WM_T_82571) || (sc->sc_type == WM_T_82572)
10440 || (sc->sc_type >= WM_T_82575))
10441 CSR_WRITE(sc, WMREG_SCTL, SCTL_DISABLE_SERDES_LOOPBACK);
10442
10443 wm_serdes_power_up_link_82575(sc);
10444
10445 sc->sc_ctrl |= CTRL_SLU;
10446
10447 if ((sc->sc_type == WM_T_82575) || (sc->sc_type == WM_T_82576))
10448 sc->sc_ctrl |= CTRL_SWDPIN(0) | CTRL_SWDPIN(1);
10449
10450 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT);
10451 pcs_lctl = CSR_READ(sc, WMREG_PCS_LCTL);
10452 switch (ctrl_ext & CTRL_EXT_LINK_MODE_MASK) {
10453 case CTRL_EXT_LINK_MODE_SGMII:
10454 pcs_autoneg = true;
10455 pcs_lctl &= ~PCS_LCTL_AN_TIMEOUT;
10456 break;
10457 case CTRL_EXT_LINK_MODE_1000KX:
10458 pcs_autoneg = false;
10459 /* FALLTHROUGH */
10460 default:
10461 if ((sc->sc_type == WM_T_82575)
10462 || (sc->sc_type == WM_T_82576)) {
10463 if ((sc->sc_flags & WM_F_PCS_DIS_AUTONEGO) != 0)
10464 pcs_autoneg = false;
10465 }
10466 sc->sc_ctrl |= CTRL_SPEED_1000 | CTRL_FRCSPD | CTRL_FD
10467 | CTRL_FRCFDX;
10468 pcs_lctl |= PCS_LCTL_FSV_1000 | PCS_LCTL_FDV_FULL;
10469 }
10470 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
10471
10472 if (pcs_autoneg) {
10473 pcs_lctl |= PCS_LCTL_AN_ENABLE | PCS_LCTL_AN_RESTART;
10474 pcs_lctl &= ~PCS_LCTL_FORCE_FC;
10475
10476 reg = CSR_READ(sc, WMREG_PCS_ANADV);
10477 reg &= ~(TXCW_ASYM_PAUSE | TXCW_SYM_PAUSE);
10478 reg |= TXCW_ASYM_PAUSE | TXCW_SYM_PAUSE;
10479 CSR_WRITE(sc, WMREG_PCS_ANADV, reg);
10480 } else
10481 pcs_lctl |= PCS_LCTL_FSD | PCS_LCTL_FORCE_FC;
10482
10483 CSR_WRITE(sc, WMREG_PCS_LCTL, pcs_lctl);
10484
10485
10486 return 0;
10487 }
10488
10489 static void
10490 wm_serdes_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
10491 {
10492 struct wm_softc *sc = ifp->if_softc;
10493 struct mii_data *mii = &sc->sc_mii;
10494 struct ifmedia_entry *ife = sc->sc_mii.mii_media.ifm_cur;
10495 uint32_t pcs_adv, pcs_lpab, reg;
10496
10497 ifmr->ifm_status = IFM_AVALID;
10498 ifmr->ifm_active = IFM_ETHER;
10499
10500 /* Check PCS */
10501 reg = CSR_READ(sc, WMREG_PCS_LSTS);
10502 if ((reg & PCS_LSTS_LINKOK) == 0) {
10503 ifmr->ifm_active |= IFM_NONE;
10504 sc->sc_tbi_linkup = 0;
10505 goto setled;
10506 }
10507
10508 sc->sc_tbi_linkup = 1;
10509 ifmr->ifm_status |= IFM_ACTIVE;
10510 if (sc->sc_type == WM_T_I354) {
10511 uint32_t status;
10512
10513 status = CSR_READ(sc, WMREG_STATUS);
10514 if (((status & STATUS_2P5_SKU) != 0)
10515 && ((status & STATUS_2P5_SKU_OVER) == 0)) {
10516 ifmr->ifm_active |= IFM_2500_SX; /* XXX KX */
10517 } else
10518 ifmr->ifm_active |= IFM_1000_SX; /* XXX KX */
10519 } else {
10520 switch (__SHIFTOUT(reg, PCS_LSTS_SPEED)) {
10521 case PCS_LSTS_SPEED_10:
10522 ifmr->ifm_active |= IFM_10_T; /* XXX */
10523 break;
10524 case PCS_LSTS_SPEED_100:
10525 ifmr->ifm_active |= IFM_100_FX; /* XXX */
10526 break;
10527 case PCS_LSTS_SPEED_1000:
10528 ifmr->ifm_active |= IFM_1000_SX; /* XXX */
10529 break;
10530 default:
10531 device_printf(sc->sc_dev, "Unknown speed\n");
10532 ifmr->ifm_active |= IFM_1000_SX; /* XXX */
10533 break;
10534 }
10535 }
10536 if ((reg & PCS_LSTS_FDX) != 0)
10537 ifmr->ifm_active |= IFM_FDX;
10538 else
10539 ifmr->ifm_active |= IFM_HDX;
10540 mii->mii_media_active &= ~IFM_ETH_FMASK;
10541 if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) {
10542 /* Check flow */
10543 reg = CSR_READ(sc, WMREG_PCS_LSTS);
10544 if ((reg & PCS_LSTS_AN_COMP) == 0) {
10545 DPRINTF(WM_DEBUG_LINK, ("XXX LINKOK but not ACOMP\n"));
10546 goto setled;
10547 }
10548 pcs_adv = CSR_READ(sc, WMREG_PCS_ANADV);
10549 pcs_lpab = CSR_READ(sc, WMREG_PCS_LPAB);
10550 DPRINTF(WM_DEBUG_LINK,
10551 ("XXX AN result(2) %08x, %08x\n", pcs_adv, pcs_lpab));
10552 if ((pcs_adv & TXCW_SYM_PAUSE)
10553 && (pcs_lpab & TXCW_SYM_PAUSE)) {
10554 mii->mii_media_active |= IFM_FLOW
10555 | IFM_ETH_TXPAUSE | IFM_ETH_RXPAUSE;
10556 } else if (((pcs_adv & TXCW_SYM_PAUSE) == 0)
10557 && (pcs_adv & TXCW_ASYM_PAUSE)
10558 && (pcs_lpab & TXCW_SYM_PAUSE)
10559 && (pcs_lpab & TXCW_ASYM_PAUSE)) {
10560 mii->mii_media_active |= IFM_FLOW
10561 | IFM_ETH_TXPAUSE;
10562 } else if ((pcs_adv & TXCW_SYM_PAUSE)
10563 && (pcs_adv & TXCW_ASYM_PAUSE)
10564 && ((pcs_lpab & TXCW_SYM_PAUSE) == 0)
10565 && (pcs_lpab & TXCW_ASYM_PAUSE)) {
10566 mii->mii_media_active |= IFM_FLOW
10567 | IFM_ETH_RXPAUSE;
10568 }
10569 }
10570 ifmr->ifm_active = (ifmr->ifm_active & ~IFM_ETH_FMASK)
10571 | (mii->mii_media_active & IFM_ETH_FMASK);
10572 setled:
10573 wm_tbi_serdes_set_linkled(sc);
10574 }
10575
10576 /*
10577 * wm_serdes_tick:
10578 *
10579 * Check the link on serdes devices.
10580 */
10581 static void
10582 wm_serdes_tick(struct wm_softc *sc)
10583 {
10584 struct ifnet *ifp = &sc->sc_ethercom.ec_if;
10585 struct mii_data *mii = &sc->sc_mii;
10586 struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
10587 uint32_t reg;
10588
10589 KASSERT(WM_CORE_LOCKED(sc));
10590
10591 mii->mii_media_status = IFM_AVALID;
10592 mii->mii_media_active = IFM_ETHER;
10593
10594 /* Check PCS */
10595 reg = CSR_READ(sc, WMREG_PCS_LSTS);
10596 if ((reg & PCS_LSTS_LINKOK) != 0) {
10597 mii->mii_media_status |= IFM_ACTIVE;
10598 sc->sc_tbi_linkup = 1;
10599 sc->sc_tbi_serdes_ticks = 0;
10600 mii->mii_media_active |= IFM_1000_SX; /* XXX */
10601 if ((reg & PCS_LSTS_FDX) != 0)
10602 mii->mii_media_active |= IFM_FDX;
10603 else
10604 mii->mii_media_active |= IFM_HDX;
10605 } else {
10606 mii->mii_media_status |= IFM_NONE;
10607 sc->sc_tbi_linkup = 0;
10608 /* If the timer expired, retry autonegotiation */
10609 if ((IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO)
10610 && (++sc->sc_tbi_serdes_ticks
10611 >= sc->sc_tbi_serdes_anegticks)) {
10612 DPRINTF(WM_DEBUG_LINK, ("EXPIRE\n"));
10613 sc->sc_tbi_serdes_ticks = 0;
10614 /* XXX */
10615 wm_serdes_mediachange(ifp);
10616 }
10617 }
10618
10619 wm_tbi_serdes_set_linkled(sc);
10620 }
10621
10622 /* SFP related */
10623
10624 static int
10625 wm_sfp_read_data_byte(struct wm_softc *sc, uint16_t offset, uint8_t *data)
10626 {
10627 uint32_t i2ccmd;
10628 int i;
10629
10630 i2ccmd = (offset << I2CCMD_REG_ADDR_SHIFT) | I2CCMD_OPCODE_READ;
10631 CSR_WRITE(sc, WMREG_I2CCMD, i2ccmd);
10632
10633 /* Poll the ready bit */
10634 for (i = 0; i < I2CCMD_PHY_TIMEOUT; i++) {
10635 delay(50);
10636 i2ccmd = CSR_READ(sc, WMREG_I2CCMD);
10637 if (i2ccmd & I2CCMD_READY)
10638 break;
10639 }
10640 if ((i2ccmd & I2CCMD_READY) == 0)
10641 return -1;
10642 if ((i2ccmd & I2CCMD_ERROR) != 0)
10643 return -1;
10644
10645 *data = i2ccmd & 0x00ff;
10646
10647 return 0;
10648 }
10649
10650 static uint32_t
10651 wm_sfp_get_media_type(struct wm_softc *sc)
10652 {
10653 uint32_t ctrl_ext;
10654 uint8_t val = 0;
10655 int timeout = 3;
10656 uint32_t mediatype = WM_MEDIATYPE_UNKNOWN;
10657 int rv = -1;
10658
10659 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT);
10660 ctrl_ext &= ~CTRL_EXT_SWDPIN(3);
10661 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext | CTRL_EXT_I2C_ENA);
10662 CSR_WRITE_FLUSH(sc);
10663
10664 /* Read SFP module data */
10665 while (timeout) {
10666 rv = wm_sfp_read_data_byte(sc, SFF_SFP_ID_OFF, &val);
10667 if (rv == 0)
10668 break;
10669 delay(100*1000); /* XXX too big */
10670 timeout--;
10671 }
10672 if (rv != 0)
10673 goto out;
10674 switch (val) {
10675 case SFF_SFP_ID_SFF:
10676 aprint_normal_dev(sc->sc_dev,
10677 "Module/Connector soldered to board\n");
10678 break;
10679 case SFF_SFP_ID_SFP:
10680 aprint_normal_dev(sc->sc_dev, "SFP\n");
10681 break;
10682 case SFF_SFP_ID_UNKNOWN:
10683 goto out;
10684 default:
10685 break;
10686 }
10687
10688 rv = wm_sfp_read_data_byte(sc, SFF_SFP_ETH_FLAGS_OFF, &val);
10689 if (rv != 0) {
10690 goto out;
10691 }
10692
10693 if ((val & (SFF_SFP_ETH_FLAGS_1000SX | SFF_SFP_ETH_FLAGS_1000LX)) != 0)
10694 mediatype = WM_MEDIATYPE_SERDES;
10695 else if ((val & SFF_SFP_ETH_FLAGS_1000T) != 0){
10696 sc->sc_flags |= WM_F_SGMII;
10697 mediatype = WM_MEDIATYPE_COPPER;
10698 } else if ((val & SFF_SFP_ETH_FLAGS_100FX) != 0){
10699 sc->sc_flags |= WM_F_SGMII;
10700 mediatype = WM_MEDIATYPE_SERDES;
10701 }
10702
10703 out:
10704 /* Restore I2C interface setting */
10705 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext);
10706
10707 return mediatype;
10708 }
10709
10710 /*
10711 * NVM related.
10712 * Microwire, SPI (w/wo EERD) and Flash.
10713 */
10714
10715 /* Both spi and uwire */
10716
10717 /*
10718 * wm_eeprom_sendbits:
10719 *
10720 * Send a series of bits to the EEPROM.
10721 */
10722 static void
10723 wm_eeprom_sendbits(struct wm_softc *sc, uint32_t bits, int nbits)
10724 {
10725 uint32_t reg;
10726 int x;
10727
10728 reg = CSR_READ(sc, WMREG_EECD);
10729
10730 for (x = nbits; x > 0; x--) {
10731 if (bits & (1U << (x - 1)))
10732 reg |= EECD_DI;
10733 else
10734 reg &= ~EECD_DI;
10735 CSR_WRITE(sc, WMREG_EECD, reg);
10736 CSR_WRITE_FLUSH(sc);
10737 delay(2);
10738 CSR_WRITE(sc, WMREG_EECD, reg | EECD_SK);
10739 CSR_WRITE_FLUSH(sc);
10740 delay(2);
10741 CSR_WRITE(sc, WMREG_EECD, reg);
10742 CSR_WRITE_FLUSH(sc);
10743 delay(2);
10744 }
10745 }
10746
10747 /*
10748 * wm_eeprom_recvbits:
10749 *
10750 * Receive a series of bits from the EEPROM.
10751 */
10752 static void
10753 wm_eeprom_recvbits(struct wm_softc *sc, uint32_t *valp, int nbits)
10754 {
10755 uint32_t reg, val;
10756 int x;
10757
10758 reg = CSR_READ(sc, WMREG_EECD) & ~EECD_DI;
10759
10760 val = 0;
10761 for (x = nbits; x > 0; x--) {
10762 CSR_WRITE(sc, WMREG_EECD, reg | EECD_SK);
10763 CSR_WRITE_FLUSH(sc);
10764 delay(2);
10765 if (CSR_READ(sc, WMREG_EECD) & EECD_DO)
10766 val |= (1U << (x - 1));
10767 CSR_WRITE(sc, WMREG_EECD, reg);
10768 CSR_WRITE_FLUSH(sc);
10769 delay(2);
10770 }
10771 *valp = val;
10772 }
10773
10774 /* Microwire */
10775
10776 /*
10777 * wm_nvm_read_uwire:
10778 *
10779 * Read a word from the EEPROM using the MicroWire protocol.
10780 */
10781 static int
10782 wm_nvm_read_uwire(struct wm_softc *sc, int word, int wordcnt, uint16_t *data)
10783 {
10784 uint32_t reg, val;
10785 int i;
10786
10787 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
10788 device_xname(sc->sc_dev), __func__));
10789
10790 for (i = 0; i < wordcnt; i++) {
10791 /* Clear SK and DI. */
10792 reg = CSR_READ(sc, WMREG_EECD) & ~(EECD_SK | EECD_DI);
10793 CSR_WRITE(sc, WMREG_EECD, reg);
10794
10795 /*
10796 * XXX: workaround for a bug in qemu-0.12.x and prior
10797 * and Xen.
10798 *
10799 * We use this workaround only for 82540 because qemu's
10800 * e1000 act as 82540.
10801 */
10802 if (sc->sc_type == WM_T_82540) {
10803 reg |= EECD_SK;
10804 CSR_WRITE(sc, WMREG_EECD, reg);
10805 reg &= ~EECD_SK;
10806 CSR_WRITE(sc, WMREG_EECD, reg);
10807 CSR_WRITE_FLUSH(sc);
10808 delay(2);
10809 }
10810 /* XXX: end of workaround */
10811
10812 /* Set CHIP SELECT. */
10813 reg |= EECD_CS;
10814 CSR_WRITE(sc, WMREG_EECD, reg);
10815 CSR_WRITE_FLUSH(sc);
10816 delay(2);
10817
10818 /* Shift in the READ command. */
10819 wm_eeprom_sendbits(sc, UWIRE_OPC_READ, 3);
10820
10821 /* Shift in address. */
10822 wm_eeprom_sendbits(sc, word + i, sc->sc_nvm_addrbits);
10823
10824 /* Shift out the data. */
10825 wm_eeprom_recvbits(sc, &val, 16);
10826 data[i] = val & 0xffff;
10827
10828 /* Clear CHIP SELECT. */
10829 reg = CSR_READ(sc, WMREG_EECD) & ~EECD_CS;
10830 CSR_WRITE(sc, WMREG_EECD, reg);
10831 CSR_WRITE_FLUSH(sc);
10832 delay(2);
10833 }
10834
10835 return 0;
10836 }
10837
10838 /* SPI */
10839
10840 /*
10841 * Set SPI and FLASH related information from the EECD register.
10842 * For 82541 and 82547, the word size is taken from EEPROM.
10843 */
10844 static int
10845 wm_nvm_set_addrbits_size_eecd(struct wm_softc *sc)
10846 {
10847 int size;
10848 uint32_t reg;
10849 uint16_t data;
10850
10851 reg = CSR_READ(sc, WMREG_EECD);
10852 sc->sc_nvm_addrbits = (reg & EECD_EE_ABITS) ? 16 : 8;
10853
10854 /* Read the size of NVM from EECD by default */
10855 size = __SHIFTOUT(reg, EECD_EE_SIZE_EX_MASK);
10856 switch (sc->sc_type) {
10857 case WM_T_82541:
10858 case WM_T_82541_2:
10859 case WM_T_82547:
10860 case WM_T_82547_2:
10861 /* Set dummy value to access EEPROM */
10862 sc->sc_nvm_wordsize = 64;
10863 wm_nvm_read(sc, NVM_OFF_EEPROM_SIZE, 1, &data);
10864 reg = data;
10865 size = __SHIFTOUT(reg, EECD_EE_SIZE_EX_MASK);
10866 if (size == 0)
10867 size = 6; /* 64 word size */
10868 else
10869 size += NVM_WORD_SIZE_BASE_SHIFT + 1;
10870 break;
10871 case WM_T_80003:
10872 case WM_T_82571:
10873 case WM_T_82572:
10874 case WM_T_82573: /* SPI case */
10875 case WM_T_82574: /* SPI case */
10876 case WM_T_82583: /* SPI case */
10877 size += NVM_WORD_SIZE_BASE_SHIFT;
10878 if (size > 14)
10879 size = 14;
10880 break;
10881 case WM_T_82575:
10882 case WM_T_82576:
10883 case WM_T_82580:
10884 case WM_T_I350:
10885 case WM_T_I354:
10886 case WM_T_I210:
10887 case WM_T_I211:
10888 size += NVM_WORD_SIZE_BASE_SHIFT;
10889 if (size > 15)
10890 size = 15;
10891 break;
10892 default:
10893 aprint_error_dev(sc->sc_dev,
10894 "%s: unknown device(%d)?\n", __func__, sc->sc_type);
10895 return -1;
10896 break;
10897 }
10898
10899 sc->sc_nvm_wordsize = 1 << size;
10900
10901 return 0;
10902 }
10903
10904 /*
10905 * wm_nvm_ready_spi:
10906 *
10907 * Wait for a SPI EEPROM to be ready for commands.
10908 */
10909 static int
10910 wm_nvm_ready_spi(struct wm_softc *sc)
10911 {
10912 uint32_t val;
10913 int usec;
10914
10915 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
10916 device_xname(sc->sc_dev), __func__));
10917
10918 for (usec = 0; usec < SPI_MAX_RETRIES; delay(5), usec += 5) {
10919 wm_eeprom_sendbits(sc, SPI_OPC_RDSR, 8);
10920 wm_eeprom_recvbits(sc, &val, 8);
10921 if ((val & SPI_SR_RDY) == 0)
10922 break;
10923 }
10924 if (usec >= SPI_MAX_RETRIES) {
10925 aprint_error_dev(sc->sc_dev,"EEPROM failed to become ready\n");
10926 return 1;
10927 }
10928 return 0;
10929 }
10930
10931 /*
10932 * wm_nvm_read_spi:
10933 *
10934 * Read a work from the EEPROM using the SPI protocol.
10935 */
10936 static int
10937 wm_nvm_read_spi(struct wm_softc *sc, int word, int wordcnt, uint16_t *data)
10938 {
10939 uint32_t reg, val;
10940 int i;
10941 uint8_t opc;
10942
10943 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
10944 device_xname(sc->sc_dev), __func__));
10945
10946 /* Clear SK and CS. */
10947 reg = CSR_READ(sc, WMREG_EECD) & ~(EECD_SK | EECD_CS);
10948 CSR_WRITE(sc, WMREG_EECD, reg);
10949 CSR_WRITE_FLUSH(sc);
10950 delay(2);
10951
10952 if (wm_nvm_ready_spi(sc))
10953 return 1;
10954
10955 /* Toggle CS to flush commands. */
10956 CSR_WRITE(sc, WMREG_EECD, reg | EECD_CS);
10957 CSR_WRITE_FLUSH(sc);
10958 delay(2);
10959 CSR_WRITE(sc, WMREG_EECD, reg);
10960 CSR_WRITE_FLUSH(sc);
10961 delay(2);
10962
10963 opc = SPI_OPC_READ;
10964 if (sc->sc_nvm_addrbits == 8 && word >= 128)
10965 opc |= SPI_OPC_A8;
10966
10967 wm_eeprom_sendbits(sc, opc, 8);
10968 wm_eeprom_sendbits(sc, word << 1, sc->sc_nvm_addrbits);
10969
10970 for (i = 0; i < wordcnt; i++) {
10971 wm_eeprom_recvbits(sc, &val, 16);
10972 data[i] = ((val >> 8) & 0xff) | ((val & 0xff) << 8);
10973 }
10974
10975 /* Raise CS and clear SK. */
10976 reg = (CSR_READ(sc, WMREG_EECD) & ~EECD_SK) | EECD_CS;
10977 CSR_WRITE(sc, WMREG_EECD, reg);
10978 CSR_WRITE_FLUSH(sc);
10979 delay(2);
10980
10981 return 0;
10982 }
10983
10984 /* Using with EERD */
10985
10986 static int
10987 wm_poll_eerd_eewr_done(struct wm_softc *sc, int rw)
10988 {
10989 uint32_t attempts = 100000;
10990 uint32_t i, reg = 0;
10991 int32_t done = -1;
10992
10993 for (i = 0; i < attempts; i++) {
10994 reg = CSR_READ(sc, rw);
10995
10996 if (reg & EERD_DONE) {
10997 done = 0;
10998 break;
10999 }
11000 delay(5);
11001 }
11002
11003 return done;
11004 }
11005
11006 static int
11007 wm_nvm_read_eerd(struct wm_softc *sc, int offset, int wordcnt,
11008 uint16_t *data)
11009 {
11010 int i, eerd = 0;
11011 int error = 0;
11012
11013 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
11014 device_xname(sc->sc_dev), __func__));
11015
11016 for (i = 0; i < wordcnt; i++) {
11017 eerd = ((offset + i) << EERD_ADDR_SHIFT) | EERD_START;
11018
11019 CSR_WRITE(sc, WMREG_EERD, eerd);
11020 error = wm_poll_eerd_eewr_done(sc, WMREG_EERD);
11021 if (error != 0)
11022 break;
11023
11024 data[i] = (CSR_READ(sc, WMREG_EERD) >> EERD_DATA_SHIFT);
11025 }
11026
11027 return error;
11028 }
11029
11030 /* Flash */
11031
11032 static int
11033 wm_nvm_valid_bank_detect_ich8lan(struct wm_softc *sc, unsigned int *bank)
11034 {
11035 uint32_t eecd;
11036 uint32_t act_offset = ICH_NVM_SIG_WORD * 2 + 1;
11037 uint32_t bank1_offset = sc->sc_ich8_flash_bank_size * sizeof(uint16_t);
11038 uint8_t sig_byte = 0;
11039
11040 switch (sc->sc_type) {
11041 case WM_T_PCH_SPT:
11042 /*
11043 * In SPT, read from the CTRL_EXT reg instead of accessing the
11044 * sector valid bits from the NVM.
11045 */
11046 *bank = CSR_READ(sc, WMREG_CTRL_EXT) & CTRL_EXT_NVMVS;
11047 if ((*bank == 0) || (*bank == 1)) {
11048 aprint_error_dev(sc->sc_dev,
11049 "%s: no valid NVM bank present (%u)\n", __func__,
11050 *bank);
11051 return -1;
11052 } else {
11053 *bank = *bank - 2;
11054 return 0;
11055 }
11056 case WM_T_ICH8:
11057 case WM_T_ICH9:
11058 eecd = CSR_READ(sc, WMREG_EECD);
11059 if ((eecd & EECD_SEC1VAL_VALMASK) == EECD_SEC1VAL_VALMASK) {
11060 *bank = ((eecd & EECD_SEC1VAL) != 0) ? 1 : 0;
11061 return 0;
11062 }
11063 /* FALLTHROUGH */
11064 default:
11065 /* Default to 0 */
11066 *bank = 0;
11067
11068 /* Check bank 0 */
11069 wm_read_ich8_byte(sc, act_offset, &sig_byte);
11070 if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) {
11071 *bank = 0;
11072 return 0;
11073 }
11074
11075 /* Check bank 1 */
11076 wm_read_ich8_byte(sc, act_offset + bank1_offset,
11077 &sig_byte);
11078 if ((sig_byte & ICH_NVM_VALID_SIG_MASK) == ICH_NVM_SIG_VALUE) {
11079 *bank = 1;
11080 return 0;
11081 }
11082 }
11083
11084 DPRINTF(WM_DEBUG_NVM, ("%s: No valid NVM bank present\n",
11085 device_xname(sc->sc_dev)));
11086 return -1;
11087 }
11088
11089 /******************************************************************************
11090 * This function does initial flash setup so that a new read/write/erase cycle
11091 * can be started.
11092 *
11093 * sc - The pointer to the hw structure
11094 ****************************************************************************/
11095 static int32_t
11096 wm_ich8_cycle_init(struct wm_softc *sc)
11097 {
11098 uint16_t hsfsts;
11099 int32_t error = 1;
11100 int32_t i = 0;
11101
11102 hsfsts = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFSTS);
11103
11104 /* May be check the Flash Des Valid bit in Hw status */
11105 if ((hsfsts & HSFSTS_FLDVAL) == 0) {
11106 return error;
11107 }
11108
11109 /* Clear FCERR in Hw status by writing 1 */
11110 /* Clear DAEL in Hw status by writing a 1 */
11111 hsfsts |= HSFSTS_ERR | HSFSTS_DAEL;
11112
11113 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFSTS, hsfsts);
11114
11115 /*
11116 * Either we should have a hardware SPI cycle in progress bit to check
11117 * against, in order to start a new cycle or FDONE bit should be
11118 * changed in the hardware so that it is 1 after harware reset, which
11119 * can then be used as an indication whether a cycle is in progress or
11120 * has been completed .. we should also have some software semaphore
11121 * mechanism to guard FDONE or the cycle in progress bit so that two
11122 * threads access to those bits can be sequentiallized or a way so that
11123 * 2 threads dont start the cycle at the same time
11124 */
11125
11126 if ((hsfsts & HSFSTS_FLINPRO) == 0) {
11127 /*
11128 * There is no cycle running at present, so we can start a
11129 * cycle
11130 */
11131
11132 /* Begin by setting Flash Cycle Done. */
11133 hsfsts |= HSFSTS_DONE;
11134 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFSTS, hsfsts);
11135 error = 0;
11136 } else {
11137 /*
11138 * otherwise poll for sometime so the current cycle has a
11139 * chance to end before giving up.
11140 */
11141 for (i = 0; i < ICH_FLASH_COMMAND_TIMEOUT; i++) {
11142 hsfsts = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFSTS);
11143 if ((hsfsts & HSFSTS_FLINPRO) == 0) {
11144 error = 0;
11145 break;
11146 }
11147 delay(1);
11148 }
11149 if (error == 0) {
11150 /*
11151 * Successful in waiting for previous cycle to timeout,
11152 * now set the Flash Cycle Done.
11153 */
11154 hsfsts |= HSFSTS_DONE;
11155 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFSTS, hsfsts);
11156 }
11157 }
11158 return error;
11159 }
11160
11161 /******************************************************************************
11162 * This function starts a flash cycle and waits for its completion
11163 *
11164 * sc - The pointer to the hw structure
11165 ****************************************************************************/
11166 static int32_t
11167 wm_ich8_flash_cycle(struct wm_softc *sc, uint32_t timeout)
11168 {
11169 uint16_t hsflctl;
11170 uint16_t hsfsts;
11171 int32_t error = 1;
11172 uint32_t i = 0;
11173
11174 /* Start a cycle by writing 1 in Flash Cycle Go in Hw Flash Control */
11175 hsflctl = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFCTL);
11176 hsflctl |= HSFCTL_GO;
11177 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFCTL, hsflctl);
11178
11179 /* Wait till FDONE bit is set to 1 */
11180 do {
11181 hsfsts = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFSTS);
11182 if (hsfsts & HSFSTS_DONE)
11183 break;
11184 delay(1);
11185 i++;
11186 } while (i < timeout);
11187 if ((hsfsts & HSFSTS_DONE) == 1 && (hsfsts & HSFSTS_ERR) == 0)
11188 error = 0;
11189
11190 return error;
11191 }
11192
11193 /******************************************************************************
11194 * Reads a byte or (d)word from the NVM using the ICH8 flash access registers.
11195 *
11196 * sc - The pointer to the hw structure
11197 * index - The index of the byte or word to read.
11198 * size - Size of data to read, 1=byte 2=word, 4=dword
11199 * data - Pointer to the word to store the value read.
11200 *****************************************************************************/
11201 static int32_t
11202 wm_read_ich8_data(struct wm_softc *sc, uint32_t index,
11203 uint32_t size, uint32_t *data)
11204 {
11205 uint16_t hsfsts;
11206 uint16_t hsflctl;
11207 uint32_t flash_linear_address;
11208 uint32_t flash_data = 0;
11209 int32_t error = 1;
11210 int32_t count = 0;
11211
11212 if (size < 1 || size > 4 || data == 0x0 ||
11213 index > ICH_FLASH_LINEAR_ADDR_MASK)
11214 return error;
11215
11216 flash_linear_address = (ICH_FLASH_LINEAR_ADDR_MASK & index) +
11217 sc->sc_ich8_flash_base;
11218
11219 do {
11220 delay(1);
11221 /* Steps */
11222 error = wm_ich8_cycle_init(sc);
11223 if (error)
11224 break;
11225
11226 hsflctl = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFCTL);
11227 /* 0b/1b corresponds to 1 or 2 byte size, respectively. */
11228 hsflctl |= ((size - 1) << HSFCTL_BCOUNT_SHIFT)
11229 & HSFCTL_BCOUNT_MASK;
11230 hsflctl |= ICH_CYCLE_READ << HSFCTL_CYCLE_SHIFT;
11231 if (sc->sc_type == WM_T_PCH_SPT) {
11232 /*
11233 * In SPT, This register is in Lan memory space, not
11234 * flash. Therefore, only 32 bit access is supported.
11235 */
11236 ICH8_FLASH_WRITE32(sc, ICH_FLASH_HSFCTL,
11237 (uint32_t)hsflctl);
11238 } else
11239 ICH8_FLASH_WRITE16(sc, ICH_FLASH_HSFCTL, hsflctl);
11240
11241 /*
11242 * Write the last 24 bits of index into Flash Linear address
11243 * field in Flash Address
11244 */
11245 /* TODO: TBD maybe check the index against the size of flash */
11246
11247 ICH8_FLASH_WRITE32(sc, ICH_FLASH_FADDR, flash_linear_address);
11248
11249 error = wm_ich8_flash_cycle(sc, ICH_FLASH_COMMAND_TIMEOUT);
11250
11251 /*
11252 * Check if FCERR is set to 1, if set to 1, clear it and try
11253 * the whole sequence a few more times, else read in (shift in)
11254 * the Flash Data0, the order is least significant byte first
11255 * msb to lsb
11256 */
11257 if (error == 0) {
11258 flash_data = ICH8_FLASH_READ32(sc, ICH_FLASH_FDATA0);
11259 if (size == 1)
11260 *data = (uint8_t)(flash_data & 0x000000FF);
11261 else if (size == 2)
11262 *data = (uint16_t)(flash_data & 0x0000FFFF);
11263 else if (size == 4)
11264 *data = (uint32_t)flash_data;
11265 break;
11266 } else {
11267 /*
11268 * If we've gotten here, then things are probably
11269 * completely hosed, but if the error condition is
11270 * detected, it won't hurt to give it another try...
11271 * ICH_FLASH_CYCLE_REPEAT_COUNT times.
11272 */
11273 hsfsts = ICH8_FLASH_READ16(sc, ICH_FLASH_HSFSTS);
11274 if (hsfsts & HSFSTS_ERR) {
11275 /* Repeat for some time before giving up. */
11276 continue;
11277 } else if ((hsfsts & HSFSTS_DONE) == 0)
11278 break;
11279 }
11280 } while (count++ < ICH_FLASH_CYCLE_REPEAT_COUNT);
11281
11282 return error;
11283 }
11284
11285 /******************************************************************************
11286 * Reads a single byte from the NVM using the ICH8 flash access registers.
11287 *
11288 * sc - pointer to wm_hw structure
11289 * index - The index of the byte to read.
11290 * data - Pointer to a byte to store the value read.
11291 *****************************************************************************/
11292 static int32_t
11293 wm_read_ich8_byte(struct wm_softc *sc, uint32_t index, uint8_t* data)
11294 {
11295 int32_t status;
11296 uint32_t word = 0;
11297
11298 status = wm_read_ich8_data(sc, index, 1, &word);
11299 if (status == 0)
11300 *data = (uint8_t)word;
11301 else
11302 *data = 0;
11303
11304 return status;
11305 }
11306
11307 /******************************************************************************
11308 * Reads a word from the NVM using the ICH8 flash access registers.
11309 *
11310 * sc - pointer to wm_hw structure
11311 * index - The starting byte index of the word to read.
11312 * data - Pointer to a word to store the value read.
11313 *****************************************************************************/
11314 static int32_t
11315 wm_read_ich8_word(struct wm_softc *sc, uint32_t index, uint16_t *data)
11316 {
11317 int32_t status;
11318 uint32_t word = 0;
11319
11320 status = wm_read_ich8_data(sc, index, 2, &word);
11321 if (status == 0)
11322 *data = (uint16_t)word;
11323 else
11324 *data = 0;
11325
11326 return status;
11327 }
11328
11329 /******************************************************************************
11330 * Reads a dword from the NVM using the ICH8 flash access registers.
11331 *
11332 * sc - pointer to wm_hw structure
11333 * index - The starting byte index of the word to read.
11334 * data - Pointer to a word to store the value read.
11335 *****************************************************************************/
11336 static int32_t
11337 wm_read_ich8_dword(struct wm_softc *sc, uint32_t index, uint32_t *data)
11338 {
11339 int32_t status;
11340
11341 status = wm_read_ich8_data(sc, index, 4, data);
11342 return status;
11343 }
11344
11345 /******************************************************************************
11346 * Reads a 16 bit word or words from the EEPROM using the ICH8's flash access
11347 * register.
11348 *
11349 * sc - Struct containing variables accessed by shared code
11350 * offset - offset of word in the EEPROM to read
11351 * data - word read from the EEPROM
11352 * words - number of words to read
11353 *****************************************************************************/
11354 static int
11355 wm_nvm_read_ich8(struct wm_softc *sc, int offset, int words, uint16_t *data)
11356 {
11357 int32_t error = 0;
11358 uint32_t flash_bank = 0;
11359 uint32_t act_offset = 0;
11360 uint32_t bank_offset = 0;
11361 uint16_t word = 0;
11362 uint16_t i = 0;
11363
11364 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
11365 device_xname(sc->sc_dev), __func__));
11366
11367 /*
11368 * We need to know which is the valid flash bank. In the event
11369 * that we didn't allocate eeprom_shadow_ram, we may not be
11370 * managing flash_bank. So it cannot be trusted and needs
11371 * to be updated with each read.
11372 */
11373 error = wm_nvm_valid_bank_detect_ich8lan(sc, &flash_bank);
11374 if (error) {
11375 DPRINTF(WM_DEBUG_NVM, ("%s: failed to detect NVM bank\n",
11376 device_xname(sc->sc_dev)));
11377 flash_bank = 0;
11378 }
11379
11380 /*
11381 * Adjust offset appropriately if we're on bank 1 - adjust for word
11382 * size
11383 */
11384 bank_offset = flash_bank * (sc->sc_ich8_flash_bank_size * 2);
11385
11386 error = wm_get_swfwhw_semaphore(sc);
11387 if (error) {
11388 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
11389 __func__);
11390 return error;
11391 }
11392
11393 for (i = 0; i < words; i++) {
11394 /* The NVM part needs a byte offset, hence * 2 */
11395 act_offset = bank_offset + ((offset + i) * 2);
11396 error = wm_read_ich8_word(sc, act_offset, &word);
11397 if (error) {
11398 aprint_error_dev(sc->sc_dev,
11399 "%s: failed to read NVM\n", __func__);
11400 break;
11401 }
11402 data[i] = word;
11403 }
11404
11405 wm_put_swfwhw_semaphore(sc);
11406 return error;
11407 }
11408
11409 /******************************************************************************
11410 * Reads a 16 bit word or words from the EEPROM using the SPT's flash access
11411 * register.
11412 *
11413 * sc - Struct containing variables accessed by shared code
11414 * offset - offset of word in the EEPROM to read
11415 * data - word read from the EEPROM
11416 * words - number of words to read
11417 *****************************************************************************/
11418 static int
11419 wm_nvm_read_spt(struct wm_softc *sc, int offset, int words, uint16_t *data)
11420 {
11421 int32_t error = 0;
11422 uint32_t flash_bank = 0;
11423 uint32_t act_offset = 0;
11424 uint32_t bank_offset = 0;
11425 uint32_t dword = 0;
11426 uint16_t i = 0;
11427
11428 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
11429 device_xname(sc->sc_dev), __func__));
11430
11431 /*
11432 * We need to know which is the valid flash bank. In the event
11433 * that we didn't allocate eeprom_shadow_ram, we may not be
11434 * managing flash_bank. So it cannot be trusted and needs
11435 * to be updated with each read.
11436 */
11437 error = wm_nvm_valid_bank_detect_ich8lan(sc, &flash_bank);
11438 if (error) {
11439 DPRINTF(WM_DEBUG_NVM, ("%s: failed to detect NVM bank\n",
11440 device_xname(sc->sc_dev)));
11441 flash_bank = 0;
11442 }
11443
11444 /*
11445 * Adjust offset appropriately if we're on bank 1 - adjust for word
11446 * size
11447 */
11448 bank_offset = flash_bank * (sc->sc_ich8_flash_bank_size * 2);
11449
11450 error = wm_get_swfwhw_semaphore(sc);
11451 if (error) {
11452 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
11453 __func__);
11454 return error;
11455 }
11456
11457 for (i = 0; i < words; i++) {
11458 /* The NVM part needs a byte offset, hence * 2 */
11459 act_offset = bank_offset + ((offset + i) * 2);
11460 /* but we must read dword aligned, so mask ... */
11461 error = wm_read_ich8_dword(sc, act_offset & ~0x3, &dword);
11462 if (error) {
11463 aprint_error_dev(sc->sc_dev,
11464 "%s: failed to read NVM\n", __func__);
11465 break;
11466 }
11467 /* ... and pick out low or high word */
11468 if ((act_offset & 0x2) == 0)
11469 data[i] = (uint16_t)(dword & 0xFFFF);
11470 else
11471 data[i] = (uint16_t)((dword >> 16) & 0xFFFF);
11472 }
11473
11474 wm_put_swfwhw_semaphore(sc);
11475 return error;
11476 }
11477
11478 /* iNVM */
11479
11480 static int
11481 wm_nvm_read_word_invm(struct wm_softc *sc, uint16_t address, uint16_t *data)
11482 {
11483 int32_t rv = 0;
11484 uint32_t invm_dword;
11485 uint16_t i;
11486 uint8_t record_type, word_address;
11487
11488 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
11489 device_xname(sc->sc_dev), __func__));
11490
11491 for (i = 0; i < INVM_SIZE; i++) {
11492 invm_dword = CSR_READ(sc, WM_INVM_DATA_REG(i));
11493 /* Get record type */
11494 record_type = INVM_DWORD_TO_RECORD_TYPE(invm_dword);
11495 if (record_type == INVM_UNINITIALIZED_STRUCTURE)
11496 break;
11497 if (record_type == INVM_CSR_AUTOLOAD_STRUCTURE)
11498 i += INVM_CSR_AUTOLOAD_DATA_SIZE_IN_DWORDS;
11499 if (record_type == INVM_RSA_KEY_SHA256_STRUCTURE)
11500 i += INVM_RSA_KEY_SHA256_DATA_SIZE_IN_DWORDS;
11501 if (record_type == INVM_WORD_AUTOLOAD_STRUCTURE) {
11502 word_address = INVM_DWORD_TO_WORD_ADDRESS(invm_dword);
11503 if (word_address == address) {
11504 *data = INVM_DWORD_TO_WORD_DATA(invm_dword);
11505 rv = 0;
11506 break;
11507 }
11508 }
11509 }
11510
11511 return rv;
11512 }
11513
11514 static int
11515 wm_nvm_read_invm(struct wm_softc *sc, int offset, int words, uint16_t *data)
11516 {
11517 int rv = 0;
11518 int i;
11519
11520 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
11521 device_xname(sc->sc_dev), __func__));
11522
11523 for (i = 0; i < words; i++) {
11524 switch (offset + i) {
11525 case NVM_OFF_MACADDR:
11526 case NVM_OFF_MACADDR1:
11527 case NVM_OFF_MACADDR2:
11528 rv = wm_nvm_read_word_invm(sc, offset + i, &data[i]);
11529 if (rv != 0) {
11530 data[i] = 0xffff;
11531 rv = -1;
11532 }
11533 break;
11534 case NVM_OFF_CFG2:
11535 rv = wm_nvm_read_word_invm(sc, offset, data);
11536 if (rv != 0) {
11537 *data = NVM_INIT_CTRL_2_DEFAULT_I211;
11538 rv = 0;
11539 }
11540 break;
11541 case NVM_OFF_CFG4:
11542 rv = wm_nvm_read_word_invm(sc, offset, data);
11543 if (rv != 0) {
11544 *data = NVM_INIT_CTRL_4_DEFAULT_I211;
11545 rv = 0;
11546 }
11547 break;
11548 case NVM_OFF_LED_1_CFG:
11549 rv = wm_nvm_read_word_invm(sc, offset, data);
11550 if (rv != 0) {
11551 *data = NVM_LED_1_CFG_DEFAULT_I211;
11552 rv = 0;
11553 }
11554 break;
11555 case NVM_OFF_LED_0_2_CFG:
11556 rv = wm_nvm_read_word_invm(sc, offset, data);
11557 if (rv != 0) {
11558 *data = NVM_LED_0_2_CFG_DEFAULT_I211;
11559 rv = 0;
11560 }
11561 break;
11562 case NVM_OFF_ID_LED_SETTINGS:
11563 rv = wm_nvm_read_word_invm(sc, offset, data);
11564 if (rv != 0) {
11565 *data = ID_LED_RESERVED_FFFF;
11566 rv = 0;
11567 }
11568 break;
11569 default:
11570 DPRINTF(WM_DEBUG_NVM,
11571 ("NVM word 0x%02x is not mapped.\n", offset));
11572 *data = NVM_RESERVED_WORD;
11573 break;
11574 }
11575 }
11576
11577 return rv;
11578 }
11579
11580 /* Lock, detecting NVM type, validate checksum, version and read */
11581
11582 /*
11583 * wm_nvm_acquire:
11584 *
11585 * Perform the EEPROM handshake required on some chips.
11586 */
11587 static int
11588 wm_nvm_acquire(struct wm_softc *sc)
11589 {
11590 uint32_t reg;
11591 int x;
11592 int ret = 0;
11593
11594 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
11595 device_xname(sc->sc_dev), __func__));
11596
11597 if (sc->sc_type >= WM_T_ICH8) {
11598 ret = wm_get_nvm_ich8lan(sc);
11599 } else if (sc->sc_flags & WM_F_LOCK_EXTCNF) {
11600 ret = wm_get_swfwhw_semaphore(sc);
11601 } else if (sc->sc_flags & WM_F_LOCK_SWFW) {
11602 /* This will also do wm_get_swsm_semaphore() if needed */
11603 ret = wm_get_swfw_semaphore(sc, SWFW_EEP_SM);
11604 } else if (sc->sc_flags & WM_F_LOCK_SWSM) {
11605 ret = wm_get_swsm_semaphore(sc);
11606 }
11607
11608 if (ret) {
11609 aprint_error_dev(sc->sc_dev, "%s: failed to get semaphore\n",
11610 __func__);
11611 return 1;
11612 }
11613
11614 if (sc->sc_flags & WM_F_LOCK_EECD) {
11615 reg = CSR_READ(sc, WMREG_EECD);
11616
11617 /* Request EEPROM access. */
11618 reg |= EECD_EE_REQ;
11619 CSR_WRITE(sc, WMREG_EECD, reg);
11620
11621 /* ..and wait for it to be granted. */
11622 for (x = 0; x < 1000; x++) {
11623 reg = CSR_READ(sc, WMREG_EECD);
11624 if (reg & EECD_EE_GNT)
11625 break;
11626 delay(5);
11627 }
11628 if ((reg & EECD_EE_GNT) == 0) {
11629 aprint_error_dev(sc->sc_dev,
11630 "could not acquire EEPROM GNT\n");
11631 reg &= ~EECD_EE_REQ;
11632 CSR_WRITE(sc, WMREG_EECD, reg);
11633 if (sc->sc_flags & WM_F_LOCK_EXTCNF)
11634 wm_put_swfwhw_semaphore(sc);
11635 if (sc->sc_flags & WM_F_LOCK_SWFW)
11636 wm_put_swfw_semaphore(sc, SWFW_EEP_SM);
11637 else if (sc->sc_flags & WM_F_LOCK_SWSM)
11638 wm_put_swsm_semaphore(sc);
11639 return 1;
11640 }
11641 }
11642
11643 return 0;
11644 }
11645
11646 /*
11647 * wm_nvm_release:
11648 *
11649 * Release the EEPROM mutex.
11650 */
11651 static void
11652 wm_nvm_release(struct wm_softc *sc)
11653 {
11654 uint32_t reg;
11655
11656 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
11657 device_xname(sc->sc_dev), __func__));
11658
11659 if (sc->sc_flags & WM_F_LOCK_EECD) {
11660 reg = CSR_READ(sc, WMREG_EECD);
11661 reg &= ~EECD_EE_REQ;
11662 CSR_WRITE(sc, WMREG_EECD, reg);
11663 }
11664
11665 if (sc->sc_type >= WM_T_ICH8) {
11666 wm_put_nvm_ich8lan(sc);
11667 } else if (sc->sc_flags & WM_F_LOCK_EXTCNF)
11668 wm_put_swfwhw_semaphore(sc);
11669 if (sc->sc_flags & WM_F_LOCK_SWFW)
11670 wm_put_swfw_semaphore(sc, SWFW_EEP_SM);
11671 else if (sc->sc_flags & WM_F_LOCK_SWSM)
11672 wm_put_swsm_semaphore(sc);
11673 }
11674
11675 static int
11676 wm_nvm_is_onboard_eeprom(struct wm_softc *sc)
11677 {
11678 uint32_t eecd = 0;
11679
11680 if (sc->sc_type == WM_T_82573 || sc->sc_type == WM_T_82574
11681 || sc->sc_type == WM_T_82583) {
11682 eecd = CSR_READ(sc, WMREG_EECD);
11683
11684 /* Isolate bits 15 & 16 */
11685 eecd = ((eecd >> 15) & 0x03);
11686
11687 /* If both bits are set, device is Flash type */
11688 if (eecd == 0x03)
11689 return 0;
11690 }
11691 return 1;
11692 }
11693
11694 static int
11695 wm_nvm_get_flash_presence_i210(struct wm_softc *sc)
11696 {
11697 uint32_t eec;
11698
11699 eec = CSR_READ(sc, WMREG_EEC);
11700 if ((eec & EEC_FLASH_DETECTED) != 0)
11701 return 1;
11702
11703 return 0;
11704 }
11705
11706 /*
11707 * wm_nvm_validate_checksum
11708 *
11709 * The checksum is defined as the sum of the first 64 (16 bit) words.
11710 */
11711 static int
11712 wm_nvm_validate_checksum(struct wm_softc *sc)
11713 {
11714 uint16_t checksum;
11715 uint16_t eeprom_data;
11716 #ifdef WM_DEBUG
11717 uint16_t csum_wordaddr, valid_checksum;
11718 #endif
11719 int i;
11720
11721 checksum = 0;
11722
11723 /* Don't check for I211 */
11724 if (sc->sc_type == WM_T_I211)
11725 return 0;
11726
11727 #ifdef WM_DEBUG
11728 if (sc->sc_type == WM_T_PCH_LPT) {
11729 csum_wordaddr = NVM_OFF_COMPAT;
11730 valid_checksum = NVM_COMPAT_VALID_CHECKSUM;
11731 } else {
11732 csum_wordaddr = NVM_OFF_FUTURE_INIT_WORD1;
11733 valid_checksum = NVM_FUTURE_INIT_WORD1_VALID_CHECKSUM;
11734 }
11735
11736 /* Dump EEPROM image for debug */
11737 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
11738 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
11739 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT)) {
11740 /* XXX PCH_SPT? */
11741 wm_nvm_read(sc, csum_wordaddr, 1, &eeprom_data);
11742 if ((eeprom_data & valid_checksum) == 0) {
11743 DPRINTF(WM_DEBUG_NVM,
11744 ("%s: NVM need to be updated (%04x != %04x)\n",
11745 device_xname(sc->sc_dev), eeprom_data,
11746 valid_checksum));
11747 }
11748 }
11749
11750 if ((wm_debug & WM_DEBUG_NVM) != 0) {
11751 printf("%s: NVM dump:\n", device_xname(sc->sc_dev));
11752 for (i = 0; i < NVM_SIZE; i++) {
11753 if (wm_nvm_read(sc, i, 1, &eeprom_data))
11754 printf("XXXX ");
11755 else
11756 printf("%04hx ", eeprom_data);
11757 if (i % 8 == 7)
11758 printf("\n");
11759 }
11760 }
11761
11762 #endif /* WM_DEBUG */
11763
11764 for (i = 0; i < NVM_SIZE; i++) {
11765 if (wm_nvm_read(sc, i, 1, &eeprom_data))
11766 return 1;
11767 checksum += eeprom_data;
11768 }
11769
11770 if (checksum != (uint16_t) NVM_CHECKSUM) {
11771 #ifdef WM_DEBUG
11772 printf("%s: NVM checksum mismatch (%04x != %04x)\n",
11773 device_xname(sc->sc_dev), checksum, NVM_CHECKSUM);
11774 #endif
11775 }
11776
11777 return 0;
11778 }
11779
11780 static void
11781 wm_nvm_version_invm(struct wm_softc *sc)
11782 {
11783 uint32_t dword;
11784
11785 /*
11786 * Linux's code to decode version is very strange, so we don't
11787 * obey that algorithm and just use word 61 as the document.
11788 * Perhaps it's not perfect though...
11789 *
11790 * Example:
11791 *
11792 * Word61: 00800030 -> Version 0.6 (I211 spec update notes about 0.6)
11793 */
11794 dword = CSR_READ(sc, WM_INVM_DATA_REG(61));
11795 dword = __SHIFTOUT(dword, INVM_VER_1);
11796 sc->sc_nvm_ver_major = __SHIFTOUT(dword, INVM_MAJOR);
11797 sc->sc_nvm_ver_minor = __SHIFTOUT(dword, INVM_MINOR);
11798 }
11799
11800 static void
11801 wm_nvm_version(struct wm_softc *sc)
11802 {
11803 uint16_t major, minor, build, patch;
11804 uint16_t uid0, uid1;
11805 uint16_t nvm_data;
11806 uint16_t off;
11807 bool check_version = false;
11808 bool check_optionrom = false;
11809 bool have_build = false;
11810
11811 /*
11812 * Version format:
11813 *
11814 * XYYZ
11815 * X0YZ
11816 * X0YY
11817 *
11818 * Example:
11819 *
11820 * 82571 0x50a2 5.10.2? (the spec update notes about 5.6-5.10)
11821 * 82571 0x50a6 5.10.6?
11822 * 82572 0x506a 5.6.10?
11823 * 82572EI 0x5069 5.6.9?
11824 * 82574L 0x1080 1.8.0? (the spec update notes about 2.1.4)
11825 * 0x2013 2.1.3?
11826 * 82583 0x10a0 1.10.0? (document says it's default vaule)
11827 */
11828 wm_nvm_read(sc, NVM_OFF_IMAGE_UID1, 1, &uid1);
11829 switch (sc->sc_type) {
11830 case WM_T_82571:
11831 case WM_T_82572:
11832 case WM_T_82574:
11833 case WM_T_82583:
11834 check_version = true;
11835 check_optionrom = true;
11836 have_build = true;
11837 break;
11838 case WM_T_82575:
11839 case WM_T_82576:
11840 case WM_T_82580:
11841 if ((uid1 & NVM_MAJOR_MASK) != NVM_UID_VALID)
11842 check_version = true;
11843 break;
11844 case WM_T_I211:
11845 wm_nvm_version_invm(sc);
11846 goto printver;
11847 case WM_T_I210:
11848 if (!wm_nvm_get_flash_presence_i210(sc)) {
11849 wm_nvm_version_invm(sc);
11850 goto printver;
11851 }
11852 /* FALLTHROUGH */
11853 case WM_T_I350:
11854 case WM_T_I354:
11855 check_version = true;
11856 check_optionrom = true;
11857 break;
11858 default:
11859 return;
11860 }
11861 if (check_version) {
11862 wm_nvm_read(sc, NVM_OFF_VERSION, 1, &nvm_data);
11863 major = (nvm_data & NVM_MAJOR_MASK) >> NVM_MAJOR_SHIFT;
11864 if (have_build || ((nvm_data & 0x0f00) != 0x0000)) {
11865 minor = (nvm_data & NVM_MINOR_MASK) >> NVM_MINOR_SHIFT;
11866 build = nvm_data & NVM_BUILD_MASK;
11867 have_build = true;
11868 } else
11869 minor = nvm_data & 0x00ff;
11870
11871 /* Decimal */
11872 minor = (minor / 16) * 10 + (minor % 16);
11873 sc->sc_nvm_ver_major = major;
11874 sc->sc_nvm_ver_minor = minor;
11875
11876 printver:
11877 aprint_verbose(", version %d.%d", sc->sc_nvm_ver_major,
11878 sc->sc_nvm_ver_minor);
11879 if (have_build) {
11880 sc->sc_nvm_ver_build = build;
11881 aprint_verbose(".%d", build);
11882 }
11883 }
11884 if (check_optionrom) {
11885 wm_nvm_read(sc, NVM_OFF_COMB_VER_PTR, 1, &off);
11886 /* Option ROM Version */
11887 if ((off != 0x0000) && (off != 0xffff)) {
11888 off += NVM_COMBO_VER_OFF;
11889 wm_nvm_read(sc, off + 1, 1, &uid1);
11890 wm_nvm_read(sc, off, 1, &uid0);
11891 if ((uid0 != 0) && (uid0 != 0xffff)
11892 && (uid1 != 0) && (uid1 != 0xffff)) {
11893 /* 16bits */
11894 major = uid0 >> 8;
11895 build = (uid0 << 8) | (uid1 >> 8);
11896 patch = uid1 & 0x00ff;
11897 aprint_verbose(", option ROM Version %d.%d.%d",
11898 major, build, patch);
11899 }
11900 }
11901 }
11902
11903 wm_nvm_read(sc, NVM_OFF_IMAGE_UID0, 1, &uid0);
11904 aprint_verbose(", Image Unique ID %08x", (uid1 << 16) | uid0);
11905 }
11906
11907 /*
11908 * wm_nvm_read:
11909 *
11910 * Read data from the serial EEPROM.
11911 */
11912 static int
11913 wm_nvm_read(struct wm_softc *sc, int word, int wordcnt, uint16_t *data)
11914 {
11915 int rv;
11916
11917 DPRINTF(WM_DEBUG_NVM, ("%s: %s called\n",
11918 device_xname(sc->sc_dev), __func__));
11919
11920 if (sc->sc_flags & WM_F_EEPROM_INVALID)
11921 return 1;
11922
11923 if (wm_nvm_acquire(sc))
11924 return 1;
11925
11926 if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
11927 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
11928 || (sc->sc_type == WM_T_PCH2) || (sc->sc_type == WM_T_PCH_LPT))
11929 rv = wm_nvm_read_ich8(sc, word, wordcnt, data);
11930 else if (sc->sc_type == WM_T_PCH_SPT)
11931 rv = wm_nvm_read_spt(sc, word, wordcnt, data);
11932 else if (sc->sc_flags & WM_F_EEPROM_INVM)
11933 rv = wm_nvm_read_invm(sc, word, wordcnt, data);
11934 else if (sc->sc_flags & WM_F_EEPROM_EERDEEWR)
11935 rv = wm_nvm_read_eerd(sc, word, wordcnt, data);
11936 else if (sc->sc_flags & WM_F_EEPROM_SPI)
11937 rv = wm_nvm_read_spi(sc, word, wordcnt, data);
11938 else
11939 rv = wm_nvm_read_uwire(sc, word, wordcnt, data);
11940
11941 wm_nvm_release(sc);
11942 return rv;
11943 }
11944
11945 /*
11946 * Hardware semaphores.
11947 * Very complexed...
11948 */
11949
11950 static int
11951 wm_get_null(struct wm_softc *sc)
11952 {
11953
11954 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
11955 device_xname(sc->sc_dev), __func__));
11956 return 0;
11957 }
11958
11959 static void
11960 wm_put_null(struct wm_softc *sc)
11961 {
11962
11963 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
11964 device_xname(sc->sc_dev), __func__));
11965 return;
11966 }
11967
11968 /*
11969 * Get hardware semaphore.
11970 * Same as e1000_get_hw_semaphore_generic()
11971 */
11972 static int
11973 wm_get_swsm_semaphore(struct wm_softc *sc)
11974 {
11975 int32_t timeout;
11976 uint32_t swsm;
11977
11978 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
11979 device_xname(sc->sc_dev), __func__));
11980 KASSERT(sc->sc_nvm_wordsize > 0);
11981
11982 /* Get the SW semaphore. */
11983 timeout = sc->sc_nvm_wordsize + 1;
11984 while (timeout) {
11985 swsm = CSR_READ(sc, WMREG_SWSM);
11986
11987 if ((swsm & SWSM_SMBI) == 0)
11988 break;
11989
11990 delay(50);
11991 timeout--;
11992 }
11993
11994 if (timeout == 0) {
11995 aprint_error_dev(sc->sc_dev,
11996 "could not acquire SWSM SMBI\n");
11997 return 1;
11998 }
11999
12000 /* Get the FW semaphore. */
12001 timeout = sc->sc_nvm_wordsize + 1;
12002 while (timeout) {
12003 swsm = CSR_READ(sc, WMREG_SWSM);
12004 swsm |= SWSM_SWESMBI;
12005 CSR_WRITE(sc, WMREG_SWSM, swsm);
12006 /* If we managed to set the bit we got the semaphore. */
12007 swsm = CSR_READ(sc, WMREG_SWSM);
12008 if (swsm & SWSM_SWESMBI)
12009 break;
12010
12011 delay(50);
12012 timeout--;
12013 }
12014
12015 if (timeout == 0) {
12016 aprint_error_dev(sc->sc_dev,
12017 "could not acquire SWSM SWESMBI\n");
12018 /* Release semaphores */
12019 wm_put_swsm_semaphore(sc);
12020 return 1;
12021 }
12022 return 0;
12023 }
12024
12025 /*
12026 * Put hardware semaphore.
12027 * Same as e1000_put_hw_semaphore_generic()
12028 */
12029 static void
12030 wm_put_swsm_semaphore(struct wm_softc *sc)
12031 {
12032 uint32_t swsm;
12033
12034 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
12035 device_xname(sc->sc_dev), __func__));
12036
12037 swsm = CSR_READ(sc, WMREG_SWSM);
12038 swsm &= ~(SWSM_SMBI | SWSM_SWESMBI);
12039 CSR_WRITE(sc, WMREG_SWSM, swsm);
12040 }
12041
12042 /*
12043 * Get SW/FW semaphore.
12044 * Same as e1000_acquire_swfw_sync_82575().
12045 */
12046 static int
12047 wm_get_swfw_semaphore(struct wm_softc *sc, uint16_t mask)
12048 {
12049 uint32_t swfw_sync;
12050 uint32_t swmask = mask << SWFW_SOFT_SHIFT;
12051 uint32_t fwmask = mask << SWFW_FIRM_SHIFT;
12052 int timeout = 200;
12053
12054 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
12055 device_xname(sc->sc_dev), __func__));
12056 KASSERT((sc->sc_flags & WM_F_LOCK_SWSM) != 0);
12057
12058 for (timeout = 0; timeout < 200; timeout++) {
12059 if (sc->sc_flags & WM_F_LOCK_SWSM) {
12060 if (wm_get_swsm_semaphore(sc)) {
12061 aprint_error_dev(sc->sc_dev,
12062 "%s: failed to get semaphore\n",
12063 __func__);
12064 return 1;
12065 }
12066 }
12067 swfw_sync = CSR_READ(sc, WMREG_SW_FW_SYNC);
12068 if ((swfw_sync & (swmask | fwmask)) == 0) {
12069 swfw_sync |= swmask;
12070 CSR_WRITE(sc, WMREG_SW_FW_SYNC, swfw_sync);
12071 if (sc->sc_flags & WM_F_LOCK_SWSM)
12072 wm_put_swsm_semaphore(sc);
12073 return 0;
12074 }
12075 if (sc->sc_flags & WM_F_LOCK_SWSM)
12076 wm_put_swsm_semaphore(sc);
12077 delay(5000);
12078 }
12079 printf("%s: failed to get swfw semaphore mask 0x%x swfw 0x%x\n",
12080 device_xname(sc->sc_dev), mask, swfw_sync);
12081 return 1;
12082 }
12083
12084 static void
12085 wm_put_swfw_semaphore(struct wm_softc *sc, uint16_t mask)
12086 {
12087 uint32_t swfw_sync;
12088
12089 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
12090 device_xname(sc->sc_dev), __func__));
12091 KASSERT((sc->sc_flags & WM_F_LOCK_SWSM) != 0);
12092
12093 if (sc->sc_flags & WM_F_LOCK_SWSM) {
12094 while (wm_get_swsm_semaphore(sc) != 0)
12095 continue;
12096 }
12097 swfw_sync = CSR_READ(sc, WMREG_SW_FW_SYNC);
12098 swfw_sync &= ~(mask << SWFW_SOFT_SHIFT);
12099 CSR_WRITE(sc, WMREG_SW_FW_SYNC, swfw_sync);
12100 if (sc->sc_flags & WM_F_LOCK_SWSM)
12101 wm_put_swsm_semaphore(sc);
12102 }
12103
12104 static int
12105 wm_get_phy_82575(struct wm_softc *sc)
12106 {
12107
12108 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
12109 device_xname(sc->sc_dev), __func__));
12110 return wm_get_swfw_semaphore(sc, swfwphysem[sc->sc_funcid]);
12111 }
12112
12113 static void
12114 wm_put_phy_82575(struct wm_softc *sc)
12115 {
12116
12117 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
12118 device_xname(sc->sc_dev), __func__));
12119 return wm_put_swfw_semaphore(sc, swfwphysem[sc->sc_funcid]);
12120 }
12121
12122 static int
12123 wm_get_swfwhw_semaphore(struct wm_softc *sc)
12124 {
12125 uint32_t ext_ctrl;
12126 int timeout = 200;
12127
12128 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
12129 device_xname(sc->sc_dev), __func__));
12130
12131 mutex_enter(sc->sc_ich_phymtx); /* Use PHY mtx for both PHY and NVM */
12132 for (timeout = 0; timeout < 200; timeout++) {
12133 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
12134 ext_ctrl |= EXTCNFCTR_MDIO_SW_OWNERSHIP;
12135 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl);
12136
12137 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
12138 if (ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP)
12139 return 0;
12140 delay(5000);
12141 }
12142 printf("%s: failed to get swfwhw semaphore ext_ctrl 0x%x\n",
12143 device_xname(sc->sc_dev), ext_ctrl);
12144 mutex_exit(sc->sc_ich_phymtx); /* Use PHY mtx for both PHY and NVM */
12145 return 1;
12146 }
12147
12148 static void
12149 wm_put_swfwhw_semaphore(struct wm_softc *sc)
12150 {
12151 uint32_t ext_ctrl;
12152
12153 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
12154 device_xname(sc->sc_dev), __func__));
12155
12156 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
12157 ext_ctrl &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP;
12158 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl);
12159
12160 mutex_exit(sc->sc_ich_phymtx); /* Use PHY mtx for both PHY and NVM */
12161 }
12162
12163 static int
12164 wm_get_swflag_ich8lan(struct wm_softc *sc)
12165 {
12166 uint32_t ext_ctrl;
12167 int timeout;
12168
12169 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
12170 device_xname(sc->sc_dev), __func__));
12171 mutex_enter(sc->sc_ich_phymtx);
12172 for (timeout = 0; timeout < WM_PHY_CFG_TIMEOUT; timeout++) {
12173 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
12174 if ((ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP) == 0)
12175 break;
12176 delay(1000);
12177 }
12178 if (timeout >= WM_PHY_CFG_TIMEOUT) {
12179 printf("%s: SW has already locked the resource\n",
12180 device_xname(sc->sc_dev));
12181 goto out;
12182 }
12183
12184 ext_ctrl |= EXTCNFCTR_MDIO_SW_OWNERSHIP;
12185 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl);
12186 for (timeout = 0; timeout < 1000; timeout++) {
12187 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
12188 if (ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP)
12189 break;
12190 delay(1000);
12191 }
12192 if (timeout >= 1000) {
12193 printf("%s: failed to acquire semaphore\n",
12194 device_xname(sc->sc_dev));
12195 ext_ctrl &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP;
12196 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl);
12197 goto out;
12198 }
12199 return 0;
12200
12201 out:
12202 mutex_exit(sc->sc_ich_phymtx);
12203 return 1;
12204 }
12205
12206 static void
12207 wm_put_swflag_ich8lan(struct wm_softc *sc)
12208 {
12209 uint32_t ext_ctrl;
12210
12211 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
12212 device_xname(sc->sc_dev), __func__));
12213 ext_ctrl = CSR_READ(sc, WMREG_EXTCNFCTR);
12214 if (ext_ctrl & EXTCNFCTR_MDIO_SW_OWNERSHIP) {
12215 ext_ctrl &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP;
12216 CSR_WRITE(sc, WMREG_EXTCNFCTR, ext_ctrl);
12217 } else {
12218 printf("%s: Semaphore unexpectedly released\n",
12219 device_xname(sc->sc_dev));
12220 }
12221
12222 mutex_exit(sc->sc_ich_phymtx);
12223 }
12224
12225 static int
12226 wm_get_nvm_ich8lan(struct wm_softc *sc)
12227 {
12228
12229 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
12230 device_xname(sc->sc_dev), __func__));
12231 mutex_enter(sc->sc_ich_nvmmtx);
12232
12233 return 0;
12234 }
12235
12236 static void
12237 wm_put_nvm_ich8lan(struct wm_softc *sc)
12238 {
12239
12240 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
12241 device_xname(sc->sc_dev), __func__));
12242 mutex_exit(sc->sc_ich_nvmmtx);
12243 }
12244
12245 static int
12246 wm_get_hw_semaphore_82573(struct wm_softc *sc)
12247 {
12248 int i = 0;
12249 uint32_t reg;
12250
12251 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
12252 device_xname(sc->sc_dev), __func__));
12253
12254 reg = CSR_READ(sc, WMREG_EXTCNFCTR);
12255 do {
12256 CSR_WRITE(sc, WMREG_EXTCNFCTR,
12257 reg | EXTCNFCTR_MDIO_SW_OWNERSHIP);
12258 reg = CSR_READ(sc, WMREG_EXTCNFCTR);
12259 if ((reg & EXTCNFCTR_MDIO_SW_OWNERSHIP) != 0)
12260 break;
12261 delay(2*1000);
12262 i++;
12263 } while (i < WM_MDIO_OWNERSHIP_TIMEOUT);
12264
12265 if (i == WM_MDIO_OWNERSHIP_TIMEOUT) {
12266 wm_put_hw_semaphore_82573(sc);
12267 log(LOG_ERR, "%s: Driver can't access the PHY\n",
12268 device_xname(sc->sc_dev));
12269 return -1;
12270 }
12271
12272 return 0;
12273 }
12274
12275 static void
12276 wm_put_hw_semaphore_82573(struct wm_softc *sc)
12277 {
12278 uint32_t reg;
12279
12280 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
12281 device_xname(sc->sc_dev), __func__));
12282
12283 reg = CSR_READ(sc, WMREG_EXTCNFCTR);
12284 reg &= ~EXTCNFCTR_MDIO_SW_OWNERSHIP;
12285 CSR_WRITE(sc, WMREG_EXTCNFCTR, reg);
12286 }
12287
12288 /*
12289 * Management mode and power management related subroutines.
12290 * BMC, AMT, suspend/resume and EEE.
12291 */
12292
12293 #ifdef WM_WOL
12294 static int
12295 wm_check_mng_mode(struct wm_softc *sc)
12296 {
12297 int rv;
12298
12299 switch (sc->sc_type) {
12300 case WM_T_ICH8:
12301 case WM_T_ICH9:
12302 case WM_T_ICH10:
12303 case WM_T_PCH:
12304 case WM_T_PCH2:
12305 case WM_T_PCH_LPT:
12306 case WM_T_PCH_SPT:
12307 rv = wm_check_mng_mode_ich8lan(sc);
12308 break;
12309 case WM_T_82574:
12310 case WM_T_82583:
12311 rv = wm_check_mng_mode_82574(sc);
12312 break;
12313 case WM_T_82571:
12314 case WM_T_82572:
12315 case WM_T_82573:
12316 case WM_T_80003:
12317 rv = wm_check_mng_mode_generic(sc);
12318 break;
12319 default:
12320 /* noting to do */
12321 rv = 0;
12322 break;
12323 }
12324
12325 return rv;
12326 }
12327
12328 static int
12329 wm_check_mng_mode_ich8lan(struct wm_softc *sc)
12330 {
12331 uint32_t fwsm;
12332
12333 fwsm = CSR_READ(sc, WMREG_FWSM);
12334
12335 if (((fwsm & FWSM_FW_VALID) != 0)
12336 && (__SHIFTOUT(fwsm, FWSM_MODE) == MNG_ICH_IAMT_MODE))
12337 return 1;
12338
12339 return 0;
12340 }
12341
12342 static int
12343 wm_check_mng_mode_82574(struct wm_softc *sc)
12344 {
12345 uint16_t data;
12346
12347 wm_nvm_read(sc, NVM_OFF_CFG2, 1, &data);
12348
12349 if ((data & NVM_CFG2_MNGM_MASK) != 0)
12350 return 1;
12351
12352 return 0;
12353 }
12354
12355 static int
12356 wm_check_mng_mode_generic(struct wm_softc *sc)
12357 {
12358 uint32_t fwsm;
12359
12360 fwsm = CSR_READ(sc, WMREG_FWSM);
12361
12362 if (__SHIFTOUT(fwsm, FWSM_MODE) == MNG_IAMT_MODE)
12363 return 1;
12364
12365 return 0;
12366 }
12367 #endif /* WM_WOL */
12368
12369 static int
12370 wm_enable_mng_pass_thru(struct wm_softc *sc)
12371 {
12372 uint32_t manc, fwsm, factps;
12373
12374 if ((sc->sc_flags & WM_F_ASF_FIRMWARE_PRES) == 0)
12375 return 0;
12376
12377 manc = CSR_READ(sc, WMREG_MANC);
12378
12379 DPRINTF(WM_DEBUG_MANAGE, ("%s: MANC (%08x)\n",
12380 device_xname(sc->sc_dev), manc));
12381 if ((manc & MANC_RECV_TCO_EN) == 0)
12382 return 0;
12383
12384 if ((sc->sc_flags & WM_F_ARC_SUBSYS_VALID) != 0) {
12385 fwsm = CSR_READ(sc, WMREG_FWSM);
12386 factps = CSR_READ(sc, WMREG_FACTPS);
12387 if (((factps & FACTPS_MNGCG) == 0)
12388 && (__SHIFTOUT(fwsm, FWSM_MODE) == MNG_ICH_IAMT_MODE))
12389 return 1;
12390 } else if ((sc->sc_type == WM_T_82574) || (sc->sc_type == WM_T_82583)){
12391 uint16_t data;
12392
12393 factps = CSR_READ(sc, WMREG_FACTPS);
12394 wm_nvm_read(sc, NVM_OFF_CFG2, 1, &data);
12395 DPRINTF(WM_DEBUG_MANAGE, ("%s: FACTPS = %08x, CFG2=%04x\n",
12396 device_xname(sc->sc_dev), factps, data));
12397 if (((factps & FACTPS_MNGCG) == 0)
12398 && ((data & NVM_CFG2_MNGM_MASK)
12399 == (NVM_CFG2_MNGM_PT << NVM_CFG2_MNGM_SHIFT)))
12400 return 1;
12401 } else if (((manc & MANC_SMBUS_EN) != 0)
12402 && ((manc & MANC_ASF_EN) == 0))
12403 return 1;
12404
12405 return 0;
12406 }
12407
12408 static bool
12409 wm_phy_resetisblocked(struct wm_softc *sc)
12410 {
12411 bool blocked = false;
12412 uint32_t reg;
12413 int i = 0;
12414
12415 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
12416 device_xname(sc->sc_dev), __func__));
12417
12418 switch (sc->sc_type) {
12419 case WM_T_ICH8:
12420 case WM_T_ICH9:
12421 case WM_T_ICH10:
12422 case WM_T_PCH:
12423 case WM_T_PCH2:
12424 case WM_T_PCH_LPT:
12425 case WM_T_PCH_SPT:
12426 do {
12427 reg = CSR_READ(sc, WMREG_FWSM);
12428 if ((reg & FWSM_RSPCIPHY) == 0) {
12429 blocked = true;
12430 delay(10*1000);
12431 continue;
12432 }
12433 blocked = false;
12434 } while (blocked && (i++ < 30));
12435 return blocked;
12436 break;
12437 case WM_T_82571:
12438 case WM_T_82572:
12439 case WM_T_82573:
12440 case WM_T_82574:
12441 case WM_T_82583:
12442 case WM_T_80003:
12443 reg = CSR_READ(sc, WMREG_MANC);
12444 if ((reg & MANC_BLK_PHY_RST_ON_IDE) != 0)
12445 return true;
12446 else
12447 return false;
12448 break;
12449 default:
12450 /* no problem */
12451 break;
12452 }
12453
12454 return false;
12455 }
12456
12457 static void
12458 wm_get_hw_control(struct wm_softc *sc)
12459 {
12460 uint32_t reg;
12461
12462 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
12463 device_xname(sc->sc_dev), __func__));
12464
12465 if (sc->sc_type == WM_T_82573) {
12466 reg = CSR_READ(sc, WMREG_SWSM);
12467 CSR_WRITE(sc, WMREG_SWSM, reg | SWSM_DRV_LOAD);
12468 } else if (sc->sc_type >= WM_T_82571) {
12469 reg = CSR_READ(sc, WMREG_CTRL_EXT);
12470 CSR_WRITE(sc, WMREG_CTRL_EXT, reg | CTRL_EXT_DRV_LOAD);
12471 }
12472 }
12473
12474 static void
12475 wm_release_hw_control(struct wm_softc *sc)
12476 {
12477 uint32_t reg;
12478
12479 DPRINTF(WM_DEBUG_LOCK, ("%s: %s called\n",
12480 device_xname(sc->sc_dev), __func__));
12481
12482 if (sc->sc_type == WM_T_82573) {
12483 reg = CSR_READ(sc, WMREG_SWSM);
12484 CSR_WRITE(sc, WMREG_SWSM, reg & ~SWSM_DRV_LOAD);
12485 } else if (sc->sc_type >= WM_T_82571) {
12486 reg = CSR_READ(sc, WMREG_CTRL_EXT);
12487 CSR_WRITE(sc, WMREG_CTRL_EXT, reg & ~CTRL_EXT_DRV_LOAD);
12488 }
12489 }
12490
12491 static void
12492 wm_gate_hw_phy_config_ich8lan(struct wm_softc *sc, bool gate)
12493 {
12494 uint32_t reg;
12495
12496 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
12497 device_xname(sc->sc_dev), __func__));
12498
12499 if (sc->sc_type < WM_T_PCH2)
12500 return;
12501
12502 reg = CSR_READ(sc, WMREG_EXTCNFCTR);
12503
12504 if (gate)
12505 reg |= EXTCNFCTR_GATE_PHY_CFG;
12506 else
12507 reg &= ~EXTCNFCTR_GATE_PHY_CFG;
12508
12509 CSR_WRITE(sc, WMREG_EXTCNFCTR, reg);
12510 }
12511
12512 static void
12513 wm_smbustopci(struct wm_softc *sc)
12514 {
12515 uint32_t fwsm, reg;
12516 int rv = 0;
12517
12518 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
12519 device_xname(sc->sc_dev), __func__));
12520
12521 /* Gate automatic PHY configuration by hardware on non-managed 82579 */
12522 wm_gate_hw_phy_config_ich8lan(sc, true);
12523
12524 /* Disable ULP */
12525 wm_ulp_disable(sc);
12526
12527 /* Acquire PHY semaphore */
12528 sc->phy.acquire(sc);
12529
12530 fwsm = CSR_READ(sc, WMREG_FWSM);
12531 switch (sc->sc_type) {
12532 case WM_T_PCH_LPT:
12533 case WM_T_PCH_SPT:
12534 if (wm_phy_is_accessible_pchlan(sc))
12535 break;
12536
12537 reg = CSR_READ(sc, WMREG_CTRL_EXT);
12538 reg |= CTRL_EXT_FORCE_SMBUS;
12539 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
12540 #if 0
12541 /* XXX Isn't this required??? */
12542 CSR_WRITE_FLUSH(sc);
12543 #endif
12544 delay(50 * 1000);
12545 /* FALLTHROUGH */
12546 case WM_T_PCH2:
12547 if (wm_phy_is_accessible_pchlan(sc) == true)
12548 break;
12549 /* FALLTHROUGH */
12550 case WM_T_PCH:
12551 if (sc->sc_type == WM_T_PCH)
12552 if ((fwsm & FWSM_FW_VALID) != 0)
12553 break;
12554
12555 if (wm_phy_resetisblocked(sc) == true) {
12556 printf("XXX reset is blocked(3)\n");
12557 break;
12558 }
12559
12560 wm_toggle_lanphypc_pch_lpt(sc);
12561
12562 if (sc->sc_type >= WM_T_PCH_LPT) {
12563 if (wm_phy_is_accessible_pchlan(sc) == true)
12564 break;
12565
12566 reg = CSR_READ(sc, WMREG_CTRL_EXT);
12567 reg &= ~CTRL_EXT_FORCE_SMBUS;
12568 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
12569
12570 if (wm_phy_is_accessible_pchlan(sc) == true)
12571 break;
12572 rv = -1;
12573 }
12574 break;
12575 default:
12576 break;
12577 }
12578
12579 /* Release semaphore */
12580 sc->phy.release(sc);
12581
12582 if (rv == 0) {
12583 if (wm_phy_resetisblocked(sc)) {
12584 printf("XXX reset is blocked(4)\n");
12585 goto out;
12586 }
12587 wm_reset_phy(sc);
12588 if (wm_phy_resetisblocked(sc))
12589 printf("XXX reset is blocked(4)\n");
12590 }
12591
12592 out:
12593 /*
12594 * Ungate automatic PHY configuration by hardware on non-managed 82579
12595 */
12596 if ((sc->sc_type == WM_T_PCH2) && ((fwsm & FWSM_FW_VALID) == 0)) {
12597 delay(10*1000);
12598 wm_gate_hw_phy_config_ich8lan(sc, false);
12599 }
12600 }
12601
12602 static void
12603 wm_init_manageability(struct wm_softc *sc)
12604 {
12605
12606 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
12607 device_xname(sc->sc_dev), __func__));
12608 if (sc->sc_flags & WM_F_HAS_MANAGE) {
12609 uint32_t manc2h = CSR_READ(sc, WMREG_MANC2H);
12610 uint32_t manc = CSR_READ(sc, WMREG_MANC);
12611
12612 /* Disable hardware interception of ARP */
12613 manc &= ~MANC_ARP_EN;
12614
12615 /* Enable receiving management packets to the host */
12616 if (sc->sc_type >= WM_T_82571) {
12617 manc |= MANC_EN_MNG2HOST;
12618 manc2h |= MANC2H_PORT_623| MANC2H_PORT_624;
12619 CSR_WRITE(sc, WMREG_MANC2H, manc2h);
12620 }
12621
12622 CSR_WRITE(sc, WMREG_MANC, manc);
12623 }
12624 }
12625
12626 static void
12627 wm_release_manageability(struct wm_softc *sc)
12628 {
12629
12630 if (sc->sc_flags & WM_F_HAS_MANAGE) {
12631 uint32_t manc = CSR_READ(sc, WMREG_MANC);
12632
12633 manc |= MANC_ARP_EN;
12634 if (sc->sc_type >= WM_T_82571)
12635 manc &= ~MANC_EN_MNG2HOST;
12636
12637 CSR_WRITE(sc, WMREG_MANC, manc);
12638 }
12639 }
12640
12641 static void
12642 wm_get_wakeup(struct wm_softc *sc)
12643 {
12644
12645 /* 0: HAS_AMT, ARC_SUBSYS_VALID, ASF_FIRMWARE_PRES */
12646 switch (sc->sc_type) {
12647 case WM_T_82573:
12648 case WM_T_82583:
12649 sc->sc_flags |= WM_F_HAS_AMT;
12650 /* FALLTHROUGH */
12651 case WM_T_80003:
12652 case WM_T_82575:
12653 case WM_T_82576:
12654 case WM_T_82580:
12655 case WM_T_I350:
12656 case WM_T_I354:
12657 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_MODE) != 0)
12658 sc->sc_flags |= WM_F_ARC_SUBSYS_VALID;
12659 /* FALLTHROUGH */
12660 case WM_T_82541:
12661 case WM_T_82541_2:
12662 case WM_T_82547:
12663 case WM_T_82547_2:
12664 case WM_T_82571:
12665 case WM_T_82572:
12666 case WM_T_82574:
12667 sc->sc_flags |= WM_F_ASF_FIRMWARE_PRES;
12668 break;
12669 case WM_T_ICH8:
12670 case WM_T_ICH9:
12671 case WM_T_ICH10:
12672 case WM_T_PCH:
12673 case WM_T_PCH2:
12674 case WM_T_PCH_LPT:
12675 case WM_T_PCH_SPT:
12676 sc->sc_flags |= WM_F_HAS_AMT;
12677 sc->sc_flags |= WM_F_ASF_FIRMWARE_PRES;
12678 break;
12679 default:
12680 break;
12681 }
12682
12683 /* 1: HAS_MANAGE */
12684 if (wm_enable_mng_pass_thru(sc) != 0)
12685 sc->sc_flags |= WM_F_HAS_MANAGE;
12686
12687 #ifdef WM_DEBUG
12688 printf("\n");
12689 if ((sc->sc_flags & WM_F_HAS_AMT) != 0)
12690 printf("HAS_AMT,");
12691 if ((sc->sc_flags & WM_F_ARC_SUBSYS_VALID) != 0)
12692 printf("ARC_SUBSYS_VALID,");
12693 if ((sc->sc_flags & WM_F_ASF_FIRMWARE_PRES) != 0)
12694 printf("ASF_FIRMWARE_PRES,");
12695 if ((sc->sc_flags & WM_F_HAS_MANAGE) != 0)
12696 printf("HAS_MANAGE,");
12697 printf("\n");
12698 #endif
12699 /*
12700 * Note that the WOL flags is set after the resetting of the eeprom
12701 * stuff
12702 */
12703 }
12704
12705 /*
12706 * Unconfigure Ultra Low Power mode.
12707 * Only for I217 and newer (see below).
12708 */
12709 static void
12710 wm_ulp_disable(struct wm_softc *sc)
12711 {
12712 uint32_t reg;
12713 int i = 0;
12714
12715 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
12716 device_xname(sc->sc_dev), __func__));
12717 /* Exclude old devices */
12718 if ((sc->sc_type < WM_T_PCH_LPT)
12719 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I217_LM)
12720 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I217_V)
12721 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_LM2)
12722 || (sc->sc_pcidevid == PCI_PRODUCT_INTEL_I218_V2))
12723 return;
12724
12725 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID) != 0) {
12726 /* Request ME un-configure ULP mode in the PHY */
12727 reg = CSR_READ(sc, WMREG_H2ME);
12728 reg &= ~H2ME_ULP;
12729 reg |= H2ME_ENFORCE_SETTINGS;
12730 CSR_WRITE(sc, WMREG_H2ME, reg);
12731
12732 /* Poll up to 300msec for ME to clear ULP_CFG_DONE. */
12733 while ((CSR_READ(sc, WMREG_FWSM) & FWSM_ULP_CFG_DONE) != 0) {
12734 if (i++ == 30) {
12735 printf("%s timed out\n", __func__);
12736 return;
12737 }
12738 delay(10 * 1000);
12739 }
12740 reg = CSR_READ(sc, WMREG_H2ME);
12741 reg &= ~H2ME_ENFORCE_SETTINGS;
12742 CSR_WRITE(sc, WMREG_H2ME, reg);
12743
12744 return;
12745 }
12746
12747 /* Acquire semaphore */
12748 sc->phy.acquire(sc);
12749
12750 /* Toggle LANPHYPC */
12751 wm_toggle_lanphypc_pch_lpt(sc);
12752
12753 /* Unforce SMBus mode in PHY */
12754 reg = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, CV_SMB_CTRL);
12755 if (reg == 0x0000 || reg == 0xffff) {
12756 uint32_t reg2;
12757
12758 printf("%s: Force SMBus first.\n", __func__);
12759 reg2 = CSR_READ(sc, WMREG_CTRL_EXT);
12760 reg2 |= CTRL_EXT_FORCE_SMBUS;
12761 CSR_WRITE(sc, WMREG_CTRL_EXT, reg2);
12762 delay(50 * 1000);
12763
12764 reg = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, CV_SMB_CTRL);
12765 }
12766 reg &= ~CV_SMB_CTRL_FORCE_SMBUS;
12767 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, CV_SMB_CTRL, reg);
12768
12769 /* Unforce SMBus mode in MAC */
12770 reg = CSR_READ(sc, WMREG_CTRL_EXT);
12771 reg &= ~CTRL_EXT_FORCE_SMBUS;
12772 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
12773
12774 reg = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, HV_PM_CTRL);
12775 reg |= HV_PM_CTRL_K1_ENA;
12776 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, HV_PM_CTRL, reg);
12777
12778 reg = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, I218_ULP_CONFIG1);
12779 reg &= ~(I218_ULP_CONFIG1_IND
12780 | I218_ULP_CONFIG1_STICKY_ULP
12781 | I218_ULP_CONFIG1_RESET_TO_SMBUS
12782 | I218_ULP_CONFIG1_WOL_HOST
12783 | I218_ULP_CONFIG1_INBAND_EXIT
12784 | I218_ULP_CONFIG1_EN_ULP_LANPHYPC
12785 | I218_ULP_CONFIG1_DIS_CLR_STICKY_ON_PERST
12786 | I218_ULP_CONFIG1_DIS_SMB_PERST);
12787 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, I218_ULP_CONFIG1, reg);
12788 reg |= I218_ULP_CONFIG1_START;
12789 wm_gmii_hv_writereg_locked(sc->sc_dev, 2, I218_ULP_CONFIG1, reg);
12790
12791 reg = CSR_READ(sc, WMREG_FEXTNVM7);
12792 reg &= ~FEXTNVM7_DIS_SMB_PERST;
12793 CSR_WRITE(sc, WMREG_FEXTNVM7, reg);
12794
12795 /* Release semaphore */
12796 sc->phy.release(sc);
12797 wm_gmii_reset(sc);
12798 delay(50 * 1000);
12799 }
12800
12801 /* WOL in the newer chipset interfaces (pchlan) */
12802 static void
12803 wm_enable_phy_wakeup(struct wm_softc *sc)
12804 {
12805 #if 0
12806 uint16_t preg;
12807
12808 /* Copy MAC RARs to PHY RARs */
12809
12810 /* Copy MAC MTA to PHY MTA */
12811
12812 /* Configure PHY Rx Control register */
12813
12814 /* Enable PHY wakeup in MAC register */
12815
12816 /* Configure and enable PHY wakeup in PHY registers */
12817
12818 /* Activate PHY wakeup */
12819
12820 /* XXX */
12821 #endif
12822 }
12823
12824 /* Power down workaround on D3 */
12825 static void
12826 wm_igp3_phy_powerdown_workaround_ich8lan(struct wm_softc *sc)
12827 {
12828 uint32_t reg;
12829 int i;
12830
12831 for (i = 0; i < 2; i++) {
12832 /* Disable link */
12833 reg = CSR_READ(sc, WMREG_PHY_CTRL);
12834 reg |= PHY_CTRL_GBE_DIS | PHY_CTRL_NOND0A_GBE_DIS;
12835 CSR_WRITE(sc, WMREG_PHY_CTRL, reg);
12836
12837 /*
12838 * Call gig speed drop workaround on Gig disable before
12839 * accessing any PHY registers
12840 */
12841 if (sc->sc_type == WM_T_ICH8)
12842 wm_gig_downshift_workaround_ich8lan(sc);
12843
12844 /* Write VR power-down enable */
12845 reg = sc->sc_mii.mii_readreg(sc->sc_dev, 1, IGP3_VR_CTRL);
12846 reg &= ~IGP3_VR_CTRL_DEV_POWERDOWN_MODE_MASK;
12847 reg |= IGP3_VR_CTRL_MODE_SHUTDOWN;
12848 sc->sc_mii.mii_writereg(sc->sc_dev, 1, IGP3_VR_CTRL, reg);
12849
12850 /* Read it back and test */
12851 reg = sc->sc_mii.mii_readreg(sc->sc_dev, 1, IGP3_VR_CTRL);
12852 reg &= IGP3_VR_CTRL_DEV_POWERDOWN_MODE_MASK;
12853 if ((reg == IGP3_VR_CTRL_MODE_SHUTDOWN) || (i != 0))
12854 break;
12855
12856 /* Issue PHY reset and repeat at most one more time */
12857 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_PHY_RESET);
12858 }
12859 }
12860
12861 static void
12862 wm_enable_wakeup(struct wm_softc *sc)
12863 {
12864 uint32_t reg, pmreg;
12865 pcireg_t pmode;
12866
12867 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
12868 device_xname(sc->sc_dev), __func__));
12869
12870 if (pci_get_capability(sc->sc_pc, sc->sc_pcitag, PCI_CAP_PWRMGMT,
12871 &pmreg, NULL) == 0)
12872 return;
12873
12874 /* Advertise the wakeup capability */
12875 CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl | CTRL_SWDPIN(2)
12876 | CTRL_SWDPIN(3));
12877 CSR_WRITE(sc, WMREG_WUC, WUC_APME);
12878
12879 /* ICH workaround */
12880 switch (sc->sc_type) {
12881 case WM_T_ICH8:
12882 case WM_T_ICH9:
12883 case WM_T_ICH10:
12884 case WM_T_PCH:
12885 case WM_T_PCH2:
12886 case WM_T_PCH_LPT:
12887 case WM_T_PCH_SPT:
12888 /* Disable gig during WOL */
12889 reg = CSR_READ(sc, WMREG_PHY_CTRL);
12890 reg |= PHY_CTRL_D0A_LPLU | PHY_CTRL_GBE_DIS;
12891 CSR_WRITE(sc, WMREG_PHY_CTRL, reg);
12892 if (sc->sc_type == WM_T_PCH)
12893 wm_gmii_reset(sc);
12894
12895 /* Power down workaround */
12896 if (sc->sc_phytype == WMPHY_82577) {
12897 struct mii_softc *child;
12898
12899 /* Assume that the PHY is copper */
12900 child = LIST_FIRST(&sc->sc_mii.mii_phys);
12901 if (child->mii_mpd_rev <= 2)
12902 sc->sc_mii.mii_writereg(sc->sc_dev, 1,
12903 (768 << 5) | 25, 0x0444); /* magic num */
12904 }
12905 break;
12906 default:
12907 break;
12908 }
12909
12910 /* Keep the laser running on fiber adapters */
12911 if ((sc->sc_mediatype == WM_MEDIATYPE_FIBER)
12912 || (sc->sc_mediatype == WM_MEDIATYPE_SERDES)) {
12913 reg = CSR_READ(sc, WMREG_CTRL_EXT);
12914 reg |= CTRL_EXT_SWDPIN(3);
12915 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
12916 }
12917
12918 reg = CSR_READ(sc, WMREG_WUFC) | WUFC_MAG;
12919 #if 0 /* for the multicast packet */
12920 reg |= WUFC_MC;
12921 CSR_WRITE(sc, WMREG_RCTL, CSR_READ(sc, WMREG_RCTL) | RCTL_MPE);
12922 #endif
12923
12924 if (sc->sc_type >= WM_T_PCH)
12925 wm_enable_phy_wakeup(sc);
12926 else {
12927 CSR_WRITE(sc, WMREG_WUC, CSR_READ(sc, WMREG_WUC) | WUC_PME_EN);
12928 CSR_WRITE(sc, WMREG_WUFC, reg);
12929 }
12930
12931 if (((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
12932 || (sc->sc_type == WM_T_ICH10) || (sc->sc_type == WM_T_PCH)
12933 || (sc->sc_type == WM_T_PCH2))
12934 && (sc->sc_phytype == WMPHY_IGP_3))
12935 wm_igp3_phy_powerdown_workaround_ich8lan(sc);
12936
12937 /* Request PME */
12938 pmode = pci_conf_read(sc->sc_pc, sc->sc_pcitag, pmreg + PCI_PMCSR);
12939 #if 0
12940 /* Disable WOL */
12941 pmode &= ~(PCI_PMCSR_PME_STS | PCI_PMCSR_PME_EN);
12942 #else
12943 /* For WOL */
12944 pmode |= PCI_PMCSR_PME_STS | PCI_PMCSR_PME_EN;
12945 #endif
12946 pci_conf_write(sc->sc_pc, sc->sc_pcitag, pmreg + PCI_PMCSR, pmode);
12947 }
12948
12949 /* LPLU */
12950
12951 static void
12952 wm_lplu_d0_disable(struct wm_softc *sc)
12953 {
12954 uint32_t reg;
12955
12956 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
12957 device_xname(sc->sc_dev), __func__));
12958
12959 reg = CSR_READ(sc, WMREG_PHY_CTRL);
12960 reg &= ~(PHY_CTRL_GBE_DIS | PHY_CTRL_D0A_LPLU);
12961 CSR_WRITE(sc, WMREG_PHY_CTRL, reg);
12962 }
12963
12964 static void
12965 wm_lplu_d0_disable_pch(struct wm_softc *sc)
12966 {
12967 uint32_t reg;
12968
12969 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
12970 device_xname(sc->sc_dev), __func__));
12971
12972 reg = wm_gmii_hv_readreg(sc->sc_dev, 1, HV_OEM_BITS);
12973 reg &= ~(HV_OEM_BITS_A1KDIS | HV_OEM_BITS_LPLU);
12974 reg |= HV_OEM_BITS_ANEGNOW;
12975 wm_gmii_hv_writereg(sc->sc_dev, 1, HV_OEM_BITS, reg);
12976 }
12977
12978 /* EEE */
12979
12980 static void
12981 wm_set_eee_i350(struct wm_softc *sc)
12982 {
12983 uint32_t ipcnfg, eeer;
12984
12985 ipcnfg = CSR_READ(sc, WMREG_IPCNFG);
12986 eeer = CSR_READ(sc, WMREG_EEER);
12987
12988 if ((sc->sc_flags & WM_F_EEE) != 0) {
12989 ipcnfg |= (IPCNFG_EEE_1G_AN | IPCNFG_EEE_100M_AN);
12990 eeer |= (EEER_TX_LPI_EN | EEER_RX_LPI_EN
12991 | EEER_LPI_FC);
12992 } else {
12993 ipcnfg &= ~(IPCNFG_EEE_1G_AN | IPCNFG_EEE_100M_AN);
12994 ipcnfg &= ~IPCNFG_10BASE_TE;
12995 eeer &= ~(EEER_TX_LPI_EN | EEER_RX_LPI_EN
12996 | EEER_LPI_FC);
12997 }
12998
12999 CSR_WRITE(sc, WMREG_IPCNFG, ipcnfg);
13000 CSR_WRITE(sc, WMREG_EEER, eeer);
13001 CSR_READ(sc, WMREG_IPCNFG); /* XXX flush? */
13002 CSR_READ(sc, WMREG_EEER); /* XXX flush? */
13003 }
13004
13005 /*
13006 * Workarounds (mainly PHY related).
13007 * Basically, PHY's workarounds are in the PHY drivers.
13008 */
13009
13010 /* Work-around for 82566 Kumeran PCS lock loss */
13011 static void
13012 wm_kmrn_lock_loss_workaround_ich8lan(struct wm_softc *sc)
13013 {
13014 #if 0
13015 int miistatus, active, i;
13016 int reg;
13017
13018 miistatus = sc->sc_mii.mii_media_status;
13019
13020 /* If the link is not up, do nothing */
13021 if ((miistatus & IFM_ACTIVE) == 0)
13022 return;
13023
13024 active = sc->sc_mii.mii_media_active;
13025
13026 /* Nothing to do if the link is other than 1Gbps */
13027 if (IFM_SUBTYPE(active) != IFM_1000_T)
13028 return;
13029
13030 for (i = 0; i < 10; i++) {
13031 /* read twice */
13032 reg = wm_gmii_i80003_readreg(sc->sc_dev, 1, IGP3_KMRN_DIAG);
13033 reg = wm_gmii_i80003_readreg(sc->sc_dev, 1, IGP3_KMRN_DIAG);
13034 if ((reg & IGP3_KMRN_DIAG_PCS_LOCK_LOSS) == 0)
13035 goto out; /* GOOD! */
13036
13037 /* Reset the PHY */
13038 wm_gmii_reset(sc);
13039 delay(5*1000);
13040 }
13041
13042 /* Disable GigE link negotiation */
13043 reg = CSR_READ(sc, WMREG_PHY_CTRL);
13044 reg |= PHY_CTRL_GBE_DIS | PHY_CTRL_NOND0A_GBE_DIS;
13045 CSR_WRITE(sc, WMREG_PHY_CTRL, reg);
13046
13047 /*
13048 * Call gig speed drop workaround on Gig disable before accessing
13049 * any PHY registers.
13050 */
13051 wm_gig_downshift_workaround_ich8lan(sc);
13052
13053 out:
13054 return;
13055 #endif
13056 }
13057
13058 /* WOL from S5 stops working */
13059 static void
13060 wm_gig_downshift_workaround_ich8lan(struct wm_softc *sc)
13061 {
13062 uint16_t kmrn_reg;
13063
13064 /* Only for igp3 */
13065 if (sc->sc_phytype == WMPHY_IGP_3) {
13066 kmrn_reg = wm_kmrn_readreg(sc, KUMCTRLSTA_OFFSET_DIAG);
13067 kmrn_reg |= KUMCTRLSTA_DIAG_NELPBK;
13068 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_DIAG, kmrn_reg);
13069 kmrn_reg &= ~KUMCTRLSTA_DIAG_NELPBK;
13070 wm_kmrn_writereg(sc, KUMCTRLSTA_OFFSET_DIAG, kmrn_reg);
13071 }
13072 }
13073
13074 /*
13075 * Workaround for pch's PHYs
13076 * XXX should be moved to new PHY driver?
13077 */
13078 static void
13079 wm_hv_phy_workaround_ich8lan(struct wm_softc *sc)
13080 {
13081
13082 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
13083 device_xname(sc->sc_dev), __func__));
13084 KASSERT(sc->sc_type == WM_T_PCH);
13085
13086 if (sc->sc_phytype == WMPHY_82577)
13087 wm_set_mdio_slow_mode_hv(sc);
13088
13089 /* (PCH rev.2) && (82577 && (phy rev 2 or 3)) */
13090
13091 /* (82577 && (phy rev 1 or 2)) || (82578 & phy rev 1)*/
13092
13093 /* 82578 */
13094 if (sc->sc_phytype == WMPHY_82578) {
13095 struct mii_softc *child;
13096
13097 /*
13098 * Return registers to default by doing a soft reset then
13099 * writing 0x3140 to the control register
13100 * 0x3140 == BMCR_SPEED0 | BMCR_AUTOEN | BMCR_FDX | BMCR_SPEED1
13101 */
13102 child = LIST_FIRST(&sc->sc_mii.mii_phys);
13103 if ((child != NULL) && (child->mii_mpd_rev < 2)) {
13104 PHY_RESET(child);
13105 sc->sc_mii.mii_writereg(sc->sc_dev, 2, MII_BMCR,
13106 0x3140);
13107 }
13108 }
13109
13110 /* Select page 0 */
13111 sc->phy.acquire(sc);
13112 wm_gmii_mdic_writereg(sc->sc_dev, 1, MII_IGPHY_PAGE_SELECT, 0);
13113 sc->phy.release(sc);
13114
13115 /*
13116 * Configure the K1 Si workaround during phy reset assuming there is
13117 * link so that it disables K1 if link is in 1Gbps.
13118 */
13119 wm_k1_gig_workaround_hv(sc, 1);
13120 }
13121
13122 static void
13123 wm_lv_phy_workaround_ich8lan(struct wm_softc *sc)
13124 {
13125
13126 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
13127 device_xname(sc->sc_dev), __func__));
13128 KASSERT(sc->sc_type == WM_T_PCH2);
13129
13130 wm_set_mdio_slow_mode_hv(sc);
13131 }
13132
13133 static int
13134 wm_k1_gig_workaround_hv(struct wm_softc *sc, int link)
13135 {
13136 int k1_enable = sc->sc_nvm_k1_enabled;
13137
13138 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
13139 device_xname(sc->sc_dev), __func__));
13140
13141 if (sc->phy.acquire(sc) != 0)
13142 return -1;
13143
13144 if (link) {
13145 k1_enable = 0;
13146
13147 /* Link stall fix for link up */
13148 wm_gmii_hv_writereg_locked(sc->sc_dev, 1, IGP3_KMRN_DIAG, 0x0100);
13149 } else {
13150 /* Link stall fix for link down */
13151 wm_gmii_hv_writereg_locked(sc->sc_dev, 1, IGP3_KMRN_DIAG, 0x4100);
13152 }
13153
13154 wm_configure_k1_ich8lan(sc, k1_enable);
13155 sc->phy.release(sc);
13156
13157 return 0;
13158 }
13159
13160 static void
13161 wm_set_mdio_slow_mode_hv(struct wm_softc *sc)
13162 {
13163 uint32_t reg;
13164
13165 reg = wm_gmii_hv_readreg(sc->sc_dev, 1, HV_KMRN_MODE_CTRL);
13166 wm_gmii_hv_writereg(sc->sc_dev, 1, HV_KMRN_MODE_CTRL,
13167 reg | HV_KMRN_MDIO_SLOW);
13168 }
13169
13170 static void
13171 wm_configure_k1_ich8lan(struct wm_softc *sc, int k1_enable)
13172 {
13173 uint32_t ctrl, ctrl_ext, tmp;
13174 uint16_t kmrn_reg;
13175
13176 kmrn_reg = wm_kmrn_readreg_locked(sc, KUMCTRLSTA_OFFSET_K1_CONFIG);
13177
13178 if (k1_enable)
13179 kmrn_reg |= KUMCTRLSTA_K1_ENABLE;
13180 else
13181 kmrn_reg &= ~KUMCTRLSTA_K1_ENABLE;
13182
13183 wm_kmrn_writereg_locked(sc, KUMCTRLSTA_OFFSET_K1_CONFIG, kmrn_reg);
13184
13185 delay(20);
13186
13187 ctrl = CSR_READ(sc, WMREG_CTRL);
13188 ctrl_ext = CSR_READ(sc, WMREG_CTRL_EXT);
13189
13190 tmp = ctrl & ~(CTRL_SPEED_1000 | CTRL_SPEED_100);
13191 tmp |= CTRL_FRCSPD;
13192
13193 CSR_WRITE(sc, WMREG_CTRL, tmp);
13194 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext | CTRL_EXT_SPD_BYPS);
13195 CSR_WRITE_FLUSH(sc);
13196 delay(20);
13197
13198 CSR_WRITE(sc, WMREG_CTRL, ctrl);
13199 CSR_WRITE(sc, WMREG_CTRL_EXT, ctrl_ext);
13200 CSR_WRITE_FLUSH(sc);
13201 delay(20);
13202 }
13203
13204 /* special case - for 82575 - need to do manual init ... */
13205 static void
13206 wm_reset_init_script_82575(struct wm_softc *sc)
13207 {
13208 /*
13209 * remark: this is untested code - we have no board without EEPROM
13210 * same setup as mentioned int the FreeBSD driver for the i82575
13211 */
13212
13213 /* SerDes configuration via SERDESCTRL */
13214 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x00, 0x0c);
13215 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x01, 0x78);
13216 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x1b, 0x23);
13217 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCTL, 0x23, 0x15);
13218
13219 /* CCM configuration via CCMCTL register */
13220 wm_82575_write_8bit_ctlr_reg(sc, WMREG_CCMCTL, 0x14, 0x00);
13221 wm_82575_write_8bit_ctlr_reg(sc, WMREG_CCMCTL, 0x10, 0x00);
13222
13223 /* PCIe lanes configuration */
13224 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x00, 0xec);
13225 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x61, 0xdf);
13226 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x34, 0x05);
13227 wm_82575_write_8bit_ctlr_reg(sc, WMREG_GIOCTL, 0x2f, 0x81);
13228
13229 /* PCIe PLL Configuration */
13230 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x02, 0x47);
13231 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x14, 0x00);
13232 wm_82575_write_8bit_ctlr_reg(sc, WMREG_SCCTL, 0x10, 0x00);
13233 }
13234
13235 static void
13236 wm_reset_mdicnfg_82580(struct wm_softc *sc)
13237 {
13238 uint32_t reg;
13239 uint16_t nvmword;
13240 int rv;
13241
13242 if ((sc->sc_flags & WM_F_SGMII) == 0)
13243 return;
13244
13245 rv = wm_nvm_read(sc, NVM_OFF_LAN_FUNC_82580(sc->sc_funcid)
13246 + NVM_OFF_CFG3_PORTA, 1, &nvmword);
13247 if (rv != 0) {
13248 aprint_error_dev(sc->sc_dev, "%s: failed to read NVM\n",
13249 __func__);
13250 return;
13251 }
13252
13253 reg = CSR_READ(sc, WMREG_MDICNFG);
13254 if (nvmword & NVM_CFG3_PORTA_EXT_MDIO)
13255 reg |= MDICNFG_DEST;
13256 if (nvmword & NVM_CFG3_PORTA_COM_MDIO)
13257 reg |= MDICNFG_COM_MDIO;
13258 CSR_WRITE(sc, WMREG_MDICNFG, reg);
13259 }
13260
13261 #define MII_INVALIDID(x) (((x) == 0x0000) || ((x) == 0xffff))
13262
13263 static bool
13264 wm_phy_is_accessible_pchlan(struct wm_softc *sc)
13265 {
13266 int i;
13267 uint32_t reg;
13268 uint16_t id1, id2;
13269
13270 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
13271 device_xname(sc->sc_dev), __func__));
13272 id1 = id2 = 0xffff;
13273 for (i = 0; i < 2; i++) {
13274 id1 = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, MII_PHYIDR1);
13275 if (MII_INVALIDID(id1))
13276 continue;
13277 id2 = wm_gmii_hv_readreg_locked(sc->sc_dev, 2, MII_PHYIDR2);
13278 if (MII_INVALIDID(id2))
13279 continue;
13280 break;
13281 }
13282 if (!MII_INVALIDID(id1) && !MII_INVALIDID(id2)) {
13283 goto out;
13284 }
13285
13286 if (sc->sc_type < WM_T_PCH_LPT) {
13287 sc->phy.release(sc);
13288 wm_set_mdio_slow_mode_hv(sc);
13289 id1 = wm_gmii_hv_readreg(sc->sc_dev, 2, MII_PHYIDR1);
13290 id2 = wm_gmii_hv_readreg(sc->sc_dev, 2, MII_PHYIDR2);
13291 sc->phy.acquire(sc);
13292 }
13293 if (MII_INVALIDID(id1) || MII_INVALIDID(id2)) {
13294 printf("XXX return with false\n");
13295 return false;
13296 }
13297 out:
13298 if ((sc->sc_type == WM_T_PCH_LPT) || (sc->sc_type == WM_T_PCH_SPT)) {
13299 /* Only unforce SMBus if ME is not active */
13300 if ((CSR_READ(sc, WMREG_FWSM) & FWSM_FW_VALID) == 0) {
13301 /* Unforce SMBus mode in PHY */
13302 reg = wm_gmii_hv_readreg_locked(sc->sc_dev, 2,
13303 CV_SMB_CTRL);
13304 reg &= ~CV_SMB_CTRL_FORCE_SMBUS;
13305 wm_gmii_hv_writereg_locked(sc->sc_dev, 2,
13306 CV_SMB_CTRL, reg);
13307
13308 /* Unforce SMBus mode in MAC */
13309 reg = CSR_READ(sc, WMREG_CTRL_EXT);
13310 reg &= ~CTRL_EXT_FORCE_SMBUS;
13311 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
13312 }
13313 }
13314 return true;
13315 }
13316
13317 static void
13318 wm_toggle_lanphypc_pch_lpt(struct wm_softc *sc)
13319 {
13320 uint32_t reg;
13321 int i;
13322
13323 /* Set PHY Config Counter to 50msec */
13324 reg = CSR_READ(sc, WMREG_FEXTNVM3);
13325 reg &= ~FEXTNVM3_PHY_CFG_COUNTER_MASK;
13326 reg |= FEXTNVM3_PHY_CFG_COUNTER_50MS;
13327 CSR_WRITE(sc, WMREG_FEXTNVM3, reg);
13328
13329 /* Toggle LANPHYPC */
13330 reg = CSR_READ(sc, WMREG_CTRL);
13331 reg |= CTRL_LANPHYPC_OVERRIDE;
13332 reg &= ~CTRL_LANPHYPC_VALUE;
13333 CSR_WRITE(sc, WMREG_CTRL, reg);
13334 CSR_WRITE_FLUSH(sc);
13335 delay(1000);
13336 reg &= ~CTRL_LANPHYPC_OVERRIDE;
13337 CSR_WRITE(sc, WMREG_CTRL, reg);
13338 CSR_WRITE_FLUSH(sc);
13339
13340 if (sc->sc_type < WM_T_PCH_LPT)
13341 delay(50 * 1000);
13342 else {
13343 i = 20;
13344
13345 do {
13346 delay(5 * 1000);
13347 } while (((CSR_READ(sc, WMREG_CTRL_EXT) & CTRL_EXT_LPCD) == 0)
13348 && i--);
13349
13350 delay(30 * 1000);
13351 }
13352 }
13353
13354 static int
13355 wm_platform_pm_pch_lpt(struct wm_softc *sc, bool link)
13356 {
13357 uint32_t reg = __SHIFTIN(link, LTRV_NONSNOOP_REQ)
13358 | __SHIFTIN(link, LTRV_SNOOP_REQ) | LTRV_SEND;
13359 uint32_t rxa;
13360 uint16_t scale = 0, lat_enc = 0;
13361 int64_t lat_ns, value;
13362
13363 DPRINTF(WM_DEBUG_INIT, ("%s: %s called\n",
13364 device_xname(sc->sc_dev), __func__));
13365
13366 if (link) {
13367 pcireg_t preg;
13368 uint16_t max_snoop, max_nosnoop, max_ltr_enc;
13369
13370 rxa = CSR_READ(sc, WMREG_PBA) & PBA_RXA_MASK;
13371
13372 /*
13373 * Determine the maximum latency tolerated by the device.
13374 *
13375 * Per the PCIe spec, the tolerated latencies are encoded as
13376 * a 3-bit encoded scale (only 0-5 are valid) multiplied by
13377 * a 10-bit value (0-1023) to provide a range from 1 ns to
13378 * 2^25*(2^10-1) ns. The scale is encoded as 0=2^0ns,
13379 * 1=2^5ns, 2=2^10ns,...5=2^25ns.
13380 */
13381 lat_ns = ((int64_t)rxa * 1024 -
13382 (2 * (int64_t)sc->sc_ethercom.ec_if.if_mtu)) * 8 * 1000;
13383 if (lat_ns < 0)
13384 lat_ns = 0;
13385 else {
13386 uint32_t status;
13387 uint16_t speed;
13388
13389 status = CSR_READ(sc, WMREG_STATUS);
13390 switch (__SHIFTOUT(status, STATUS_SPEED)) {
13391 case STATUS_SPEED_10:
13392 speed = 10;
13393 break;
13394 case STATUS_SPEED_100:
13395 speed = 100;
13396 break;
13397 case STATUS_SPEED_1000:
13398 speed = 1000;
13399 break;
13400 default:
13401 printf("%s: Unknown speed (status = %08x)\n",
13402 device_xname(sc->sc_dev), status);
13403 return -1;
13404 }
13405 lat_ns /= speed;
13406 }
13407 value = lat_ns;
13408
13409 while (value > LTRV_VALUE) {
13410 scale ++;
13411 value = howmany(value, __BIT(5));
13412 }
13413 if (scale > LTRV_SCALE_MAX) {
13414 printf("%s: Invalid LTR latency scale %d\n",
13415 device_xname(sc->sc_dev), scale);
13416 return -1;
13417 }
13418 lat_enc = (uint16_t)(__SHIFTIN(scale, LTRV_SCALE) | value);
13419
13420 preg = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
13421 WM_PCI_LTR_CAP_LPT);
13422 max_snoop = preg & 0xffff;
13423 max_nosnoop = preg >> 16;
13424
13425 max_ltr_enc = MAX(max_snoop, max_nosnoop);
13426
13427 if (lat_enc > max_ltr_enc) {
13428 lat_enc = max_ltr_enc;
13429 }
13430 }
13431 /* Snoop and No-Snoop latencies the same */
13432 reg |= lat_enc | __SHIFTIN(lat_enc, LTRV_NONSNOOP);
13433 CSR_WRITE(sc, WMREG_LTRV, reg);
13434
13435 return 0;
13436 }
13437
13438 /*
13439 * I210 Errata 25 and I211 Errata 10
13440 * Slow System Clock.
13441 */
13442 static void
13443 wm_pll_workaround_i210(struct wm_softc *sc)
13444 {
13445 uint32_t mdicnfg, wuc;
13446 uint32_t reg;
13447 pcireg_t pcireg;
13448 uint32_t pmreg;
13449 uint16_t nvmword, tmp_nvmword;
13450 int phyval;
13451 bool wa_done = false;
13452 int i;
13453
13454 /* Save WUC and MDICNFG registers */
13455 wuc = CSR_READ(sc, WMREG_WUC);
13456 mdicnfg = CSR_READ(sc, WMREG_MDICNFG);
13457
13458 reg = mdicnfg & ~MDICNFG_DEST;
13459 CSR_WRITE(sc, WMREG_MDICNFG, reg);
13460
13461 if (wm_nvm_read(sc, INVM_AUTOLOAD, 1, &nvmword) != 0)
13462 nvmword = INVM_DEFAULT_AL;
13463 tmp_nvmword = nvmword | INVM_PLL_WO_VAL;
13464
13465 /* Get Power Management cap offset */
13466 if (pci_get_capability(sc->sc_pc, sc->sc_pcitag, PCI_CAP_PWRMGMT,
13467 &pmreg, NULL) == 0)
13468 return;
13469 for (i = 0; i < WM_MAX_PLL_TRIES; i++) {
13470 phyval = wm_gmii_gs40g_readreg(sc->sc_dev, 1,
13471 GS40G_PHY_PLL_FREQ_PAGE | GS40G_PHY_PLL_FREQ_REG);
13472
13473 if ((phyval & GS40G_PHY_PLL_UNCONF) != GS40G_PHY_PLL_UNCONF) {
13474 break; /* OK */
13475 }
13476
13477 wa_done = true;
13478 /* Directly reset the internal PHY */
13479 reg = CSR_READ(sc, WMREG_CTRL);
13480 CSR_WRITE(sc, WMREG_CTRL, reg | CTRL_PHY_RESET);
13481
13482 reg = CSR_READ(sc, WMREG_CTRL_EXT);
13483 reg |= CTRL_EXT_PHYPDEN | CTRL_EXT_SDLPE;
13484 CSR_WRITE(sc, WMREG_CTRL_EXT, reg);
13485
13486 CSR_WRITE(sc, WMREG_WUC, 0);
13487 reg = (INVM_AUTOLOAD << 4) | (tmp_nvmword << 16);
13488 CSR_WRITE(sc, WMREG_EEARBC_I210, reg);
13489
13490 pcireg = pci_conf_read(sc->sc_pc, sc->sc_pcitag,
13491 pmreg + PCI_PMCSR);
13492 pcireg |= PCI_PMCSR_STATE_D3;
13493 pci_conf_write(sc->sc_pc, sc->sc_pcitag,
13494 pmreg + PCI_PMCSR, pcireg);
13495 delay(1000);
13496 pcireg &= ~PCI_PMCSR_STATE_D3;
13497 pci_conf_write(sc->sc_pc, sc->sc_pcitag,
13498 pmreg + PCI_PMCSR, pcireg);
13499
13500 reg = (INVM_AUTOLOAD << 4) | (nvmword << 16);
13501 CSR_WRITE(sc, WMREG_EEARBC_I210, reg);
13502
13503 /* Restore WUC register */
13504 CSR_WRITE(sc, WMREG_WUC, wuc);
13505 }
13506
13507 /* Restore MDICNFG setting */
13508 CSR_WRITE(sc, WMREG_MDICNFG, mdicnfg);
13509 if (wa_done)
13510 aprint_verbose_dev(sc->sc_dev, "I210 workaround done\n");
13511 }
13512